remove_liquidity
Remove liquidity from a trading pool on Paloma DEX by specifying chain, token addresses, and liquidity amount to withdraw funds.
Instructions
Remove liquidity from a trading pool using the Trader contract.
Args:
chain_id: Chain ID (1, 10, 56, 100, 137, 8453, 42161)
token0_address: Address of first token
token1_address: Address of second token
liquidity_amount: Amount of liquidity tokens to remove in wei
Returns:
JSON string with liquidity removal transaction details.
Input Schema
TableJSON Schema
| Name | Required | Description | Default |
|---|---|---|---|
| chain_id | Yes | ||
| token0_address | Yes | ||
| token1_address | Yes | ||
| liquidity_amount | Yes |
Implementation Reference
- padex.py:2028-2146 (handler)The core handler function implementing the remove_liquidity MCP tool. It validates inputs, connects to the chain's Web3, interacts with the Trader contract at the chain-specific address, builds the remove_liquidity transaction call with token0, token1, and amount parameters, estimates gas, signs with private key, sends the transaction, waits for confirmation, and returns detailed JSON results including tx hash, status, explorer link, etc.@mcp.tool() async def remove_liquidity(ctx: Context, chain_id: str, token0_address: str, token1_address: str, liquidity_amount: str) -> str: """Remove liquidity from a trading pool using the Trader contract. Args: chain_id: Chain ID (1, 10, 56, 100, 137, 8453, 42161) token0_address: Address of first token token1_address: Address of second token liquidity_amount: Amount of liquidity tokens to remove in wei Returns: JSON string with liquidity removal transaction details. """ try: paloma_ctx = ctx.request_context.lifespan_context if chain_id not in CHAIN_CONFIGS: return f"Error: Unsupported chain ID {chain_id}" config = CHAIN_CONFIGS[chain_id] if chain_id not in paloma_ctx.web3_clients: return f"Error: Web3 client not available for {config.name}" trader_address = TRADER_ADDRESSES.get(chain_id) if not trader_address: return f"Error: Trader contract not configured for {config.name}" # Validate addresses and amount if not Web3.is_address(token0_address): return f"Error: Invalid token0 address: {token0_address}" if not Web3.is_address(token1_address): return f"Error: Invalid token1 address: {token1_address}" try: amount_int = int(liquidity_amount) if amount_int <= 0: raise ValueError("Amount must be positive") except ValueError: return f"Error: Invalid liquidity amount: {liquidity_amount}" web3 = paloma_ctx.web3_clients[chain_id] trader_contract = web3.eth.contract(address=trader_address, abi=TRADER_ABI) # Get gas fee from contract try: gas_fee = trader_contract.functions.gas_fee().call() except Exception as e: logger.warning(f"Failed to get gas fee from contract: {e}, using 0") gas_fee = 0 # Build transaction remove_liquidity_tx_data = trader_contract.functions.remove_liquidity( token0_address, token1_address, amount_int ).build_transaction({ 'from': paloma_ctx.address, 'value': gas_fee, 'gasPrice': web3.to_wei(config.gas_price_gwei, 'gwei'), 'nonce': web3.eth.get_transaction_count(paloma_ctx.address) }) # Estimate gas with buffer try: estimated_gas = web3.eth.estimate_gas(remove_liquidity_tx_data) buffered_gas = estimated_gas + (estimated_gas // GAS_MULTIPLIER) remove_liquidity_tx_data['gas'] = buffered_gas except Exception as e: logger.warning(f"Gas estimation failed: {e}, using default") remove_liquidity_tx_data['gas'] = 400000 # Sign and send transaction signed_tx = paloma_ctx.account.sign_transaction(remove_liquidity_tx_data) tx_hash = web3.eth.send_raw_transaction(signed_tx.rawTransaction) # Wait for confirmation receipt = web3.eth.wait_for_transaction_receipt(tx_hash) # Get token symbols for display try: token0_contract = web3.eth.contract(address=token0_address, abi=ERC20_ABI) token1_contract = web3.eth.contract(address=token1_address, abi=ERC20_ABI) token0_symbol = token0_contract.functions.symbol().call() token1_symbol = token1_contract.functions.symbol().call() except: token0_symbol = "Unknown" token1_symbol = "Unknown" result = { "chain": config.name, "chain_id": config.chain_id, "trader_contract": trader_address, "token0": { "address": token0_address, "symbol": token0_symbol }, "token1": { "address": token1_address, "symbol": token1_symbol }, "liquidity_amount_wei": liquidity_amount, "transaction": { "hash": tx_hash.hex(), "status": "success" if receipt.status == 1 else "failed", "gas_used": receipt.gasUsed, "gas_fee_paid": str(gas_fee), "block_number": receipt.blockNumber }, "explorer_url": f"{config.explorer_url}/tx/{tx_hash.hex()}" } return json.dumps(result, indent=2) except Exception as e: logger.error(f"Error removing liquidity: {e}") return f"Error removing liquidity: {str(e)}"
- padex.py:268-277 (schema)The ABI schema definition for the remove_liquidity contract function within TRADER_ABI, which defines the exact input parameters (token0 address, token1 address, amount uint256) used by the tool handler to call the Trader contract."name": "remove_liquidity", "type": "function", "inputs": [ {"name": "token0", "type": "address"}, {"name": "token1", "type": "address"}, {"name": "amount", "type": "uint256"} ], "outputs": [], "stateMutability": "payable" },
- padex.py:288-296 (helper)Chain-specific addresses of the Trader contracts that expose the remove_liquidity function, referenced by the handler to target the correct contract on each supported EVM chain.TRADER_ADDRESSES = { ChainID.ETHEREUM_MAIN: "0x7230EC05eD8c38D5be6f58Ae41e30D1ED6cfDAf1", ChainID.ARBITRUM_MAIN: "0x36B8763b3b71685F21512511bB433f4A0f50213E", ChainID.BASE_MAIN: "0xd58Dfd5b39fCe87dD9C434e95428DdB289934179", ChainID.BSC_MAIN: "0x8ee509a97279029071AB66Cb0391e8Dc67a137f9", ChainID.GNOSIS_MAIN: "0xd58Dfd5b39fCe87dD9C434e95428DdB289934179", ChainID.OPTIMISM_MAIN: "0xB6d4AAFfBbceB5e363352179E294326C91d6c127", ChainID.POLYGON_MAIN: "0xB6d4AAFfBbceB5e363352179E294326C91d6c127" }
- padex.py:243-285 (helper)The full ABI for the Trader contract, including the remove_liquidity function signature, used to create the contract instance in the handler.TRADER_ABI = [ { "name": "purchase", "type": "function", "inputs": [ {"name": "from_token", "type": "address"}, {"name": "to_token", "type": "address"}, {"name": "amount", "type": "uint256"} ], "outputs": [], "stateMutability": "payable" }, { "name": "add_liquidity", "type": "function", "inputs": [ {"name": "token0", "type": "address"}, {"name": "token1", "type": "address"}, {"name": "amount0", "type": "uint256"}, {"name": "amount1", "type": "uint256"} ], "outputs": [], "stateMutability": "payable" }, { "name": "remove_liquidity", "type": "function", "inputs": [ {"name": "token0", "type": "address"}, {"name": "token1", "type": "address"}, {"name": "amount", "type": "uint256"} ], "outputs": [], "stateMutability": "payable" }, { "name": "gas_fee", "type": "function", "inputs": [], "outputs": [{"name": "", "type": "uint256"}], "stateMutability": "view" } ]