Skip to main content
Glama
edkdev

DeFi Trading Agent MCP Server

by edkdev

submit_gasless_swap

Execute cryptocurrency swaps without paying gas fees by signing approval and trade messages. This tool processes gasless transactions using pre-approved quote data.

Instructions

Submit a gasless swap by signing approval and trade messages (no gas fees required)

Input Schema

TableJSON Schema
NameRequiredDescriptionDefault
quoteDataYesQuote data from get_gasless_quote
chainIdNoBlockchain ID (optional if included in quoteData)

Implementation Reference

  • Main handler for submit_gasless_swap tool: validates input, signs approval/trade EIP-712 messages using user private key, calls agService.submitGaslessSwap to submit to relayer API.
    async submitGaslessSwap(params) {
      const { quoteData } = params;
    
      if (!quoteData) {
        throw new Error("Quote data from gasless quote is required");
      }
    
      if (!this.userPrivateKey) {
        throw new Error(
          "User private key is required for gasless swap execution"
        );
      }
    
      try {
        console.log("πŸš€ Processing gasless swap...");
    
        // Prepare the submission data - extract chainId from trade domain
        const chainId =
          quoteData.trade?.eip712?.domain?.chainId || params.chainId;
        if (!chainId) {
          throw new Error("Chain ID not found in quote data or parameters");
        }
    
        const submissionData = {
          chainId: chainId,
        };
    
        // Sign approval if present
        if (quoteData.approval) {
          console.log("πŸ” Signing gasless approval...");
          const signedApproval = await this.blockchain.signGaslessApproval(
            quoteData.approval
          );
          submissionData.approval = signedApproval;
          console.log("βœ… Approval signed");
        }
    
        // Sign trade (always required)
        if (!quoteData.trade) {
          throw new Error("Trade data is required in gasless quote");
        }
    
        console.log("πŸ” Signing gasless trade...");
        const signedTrade = await this.blockchain.signGaslessTrade(
          quoteData.trade
        );
        submissionData.trade = signedTrade;
        console.log("βœ… Trade signed");
    
        // Submit to Aggregator gasless API
        console.log("πŸ“€ Submitting gasless swap to Agg...");
        const result = await this.agg.submitGaslessSwap(submissionData);
    
        return {
          message: "Gasless swap submitted successfully",
          data: result,
          nextSteps: [
            "1. Gasless swap has been submitted to relayer",
            "2. Monitor status using get_gasless_status tool",
            "3. No gas fees required - relayer handles execution",
            `4. Trade hash: ${result.tradeHash}`,
          ],
          gaslessInfo: {
            tradeHash: result.tradeHash,
            approvalSigned: !!submissionData.approval,
            tradeSigned: !!submissionData.trade,
            relayerHandled: true,
          },
        };
      } catch (error) {
        throw new Error(`Gasless swap submission failed: ${error.message}`);
      }
    }
  • Input schema definition for the submit_gasless_swap tool, specifying required quoteData object and optional chainId.
    {
      name: TOOL_NAMES.SUBMIT_GASLESS_SWAP,
      description:
        "Submit a gasless swap by signing approval and trade messages (no gas fees required)",
      inputSchema: {
        type: "object",
        properties: {
          quoteData: {
            type: "object",
            description: "Quote data from get_gasless_quote",
          },
          chainId: {
            type: "integer",
            description: "Blockchain ID (optional if included in quoteData)",
          },
        },
        required: ["quoteData"],
      },
    },
  • src/index.js:1146-1147 (registration)
    Tool dispatch/registration in MCP server request handler: maps tool name to toolService.submitGaslessSwap execution.
    case TOOL_NAMES.SUBMIT_GASLESS_SWAP:
      result = await toolService.submitGaslessSwap(args);
  • agService helper method: HTTP POST to aggregator API /api/swap/gasless/submit with signed swap data, handles response and errors.
    async submitGaslessSwap(swapData) {
      try {
        const response = await fetch(`${this.baseUrl}/api/swap/gasless/submit`, {
          method: 'POST',
          headers: {
            'Content-Type': 'application/json'
          },
          body: JSON.stringify(swapData)
        });
        
        if (!response.ok) {
          throw new Error(`HTTP ${response.status}: ${response.statusText}`);
        }
        
        const data = await response.json();
        
        if (!data.success) {
          throw new Error(data.error || 'Gasless swap submission failed');
        }
        
        return data.data;
      } catch (error) {
        throw new Error(`Failed to submit gasless swap: ${error.message}`);
      }
    }
  • src/constants.js:13-13 (registration)
    TOOL_NAMES constant mapping tool key to string name 'submit_gasless_swap' used in registration.
    SUBMIT_GASLESS_SWAP: "submit_gasless_swap",

Latest Blog Posts

MCP directory API

We provide all the information about MCP servers via our MCP API.

curl -X GET 'https://glama.ai/api/mcp/v1/servers/edkdev/defi-trading-mcp'

If you have feedback or need assistance with the MCP directory API, please join our Discord server