← WebMCP Directory

Tool tree

suwappu.bot

Finance & CryptoTools verified
Website
A cross-chain trading desk that exposes itself to browser agents as WebMCP site tools, bounded by a mandate the human writes and the agent can read. It proposes trades and plans against your rules;…
Explore capabilities
    list_chainsAnswer

    List every blockchain Suwappu can route a swap across, with chain id and chain key. Call this before quoting if you are unsure which key to use.

    View tool JSON
    {
      "name": "list_chains",
      "kind": "answer",
      "impl": "imperative",
      "description": "List every blockchain Suwappu can route a swap across, with chain id and chain key. Call this before quoting if you are unsure which key to use.",
      "inputSchema": {
        "type": "object",
        "properties": {},
        "additionalProperties": false
      },
      "page": "/agent-terminal"
    }
    find_tokenAnswer

    Resolve a token symbol, name or contract address on one chain into its canonical address and decimals. Use this to disambiguate before quoting: many chains have several tokens with the same ticker.

    View tool JSON
    {
      "name": "find_token",
      "kind": "answer",
      "impl": "imperative",
      "description": "Resolve a token symbol, name or contract address on one chain into its canonical address and decimals. Use this to disambiguate before quoting: many chains have several tokens with the same ticker.",
      "inputSchema": {
        "type": "object",
        "properties": {
          "query": {
            "type": "string",
            "description": "Symbol, name, or 0x contract address."
          },
          "chain": {
            "type": "string",
            "description": "A chain key such as ethereum, base, arbitrum, optimism, polygon, bsc, avalanche, linea or solana. Call list_chains first if unsure."
          }
        },
        "required": [
          "query",
          "chain"
        ],
        "additionalProperties": false
      },
      "page": "/agent-terminal"
    }
    get_pricesAnswer

    Get current USD spot prices for a list of major token symbols (e.g. ETH, USDC, WBTC, SOL).

    View tool JSON
    {
      "name": "get_prices",
      "kind": "answer",
      "impl": "imperative",
      "description": "Get current USD spot prices for a list of major token symbols (e.g. ETH, USDC, WBTC, SOL).",
      "inputSchema": {
        "type": "object",
        "properties": {
          "symbols": {
            "type": "array",
            "items": {
              "type": "string"
            },
            "description": "Token symbols, e.g. [\"ETH\",\"USDC\"]."
          }
        },
        "required": [
          "symbols"
        ],
        "additionalProperties": false
      },
      "page": "/agent-terminal"
    }
    preview_swapAction

    Price a same-chain or cross-chain swap and show it on the page. Returns the amount out, minimum received, price impact, bridge fee, gas estimate, expected duration, the mandate verdict for this exact trade, and the route leg by leg: most cross-chain routes are more than one transaction (a swap, a bridge relay, another swap), and hops/hopCount report each leg with its tool, chains, tokens and amounts. Use this directly when the human asks what something is worth; it already tells you whether the trade fits their rules, so there is no need to read the mandate first. Indicative only: this never creates a transaction.

    View tool JSON
    {
      "name": "preview_swap",
      "kind": "act",
      "impl": "imperative",
      "description": "Price a same-chain or cross-chain swap and show it on the page. Returns the amount out, minimum received, price impact, bridge fee, gas estimate, expected duration, the mandate verdict for this exact trade, and the route leg by leg: most cross-chain routes are more than one transaction (a swap, a bridge relay, another swap), and hops/hopCount report each leg with its tool, chains, tokens and amounts. Use this directly when the human asks what something is worth; it already tells you whether the trade fits their rules, so there is no need to read the mandate first. Indicative only: this never creates a transaction.",
      "inputSchema": {
        "type": "object",
        "properties": {
          "fromChain": {
            "type": "string",
            "description": "A chain key such as ethereum, base, arbitrum, optimism, polygon, bsc, avalanche, linea or solana. Call list_chains first if unsure."
          },
          "toChain": {
            "type": "string",
            "description": "Destination chain key. Same as fromChain for a same-chain swap."
          },
          "fromToken": {
            "type": "string",
            "description": "Symbol or contract address of the token being sold."
          },
          "toToken": {
            "type": "string",
            "description": "Symbol or contract address of the token being bought."
          },
          "amount": {
            "type": "string",
            "description": "Human-readable amount of fromToken to sell, e.g. \"0.5\"."
          },
          "slippagePercent": {
            "type": "number",
            "description": "Max slippage in percent, e.g. 0.5 for 0.5%. Defaults to the desk setting."
          },
          "order": {
            "type": "string",
            "enum": [
              "RECOMMENDED",
              "FASTEST",
              "CHEAPEST",
              "SAFEST"
            ],
            "description": "Route preference. Defaults to RECOMMENDED."
          }
        },
        "required": [
          "fromChain",
          "toChain",
          "fromToken",
          "toToken",
          "amount"
        ],
        "additionalProperties": false
      },
      "page": "/agent-terminal"
    }
    compare_routesAction

    Price the same swap four ways (RECOMMENDED, FASTEST, CHEAPEST and SAFEST) and render the comparison on the page so the human can see the trade-off between output, cost and settlement time before deciding. Each row reports its hopCount: routes to the same destination can differ in how many transactions they take, and fewer hops usually means fewer things that can strand mid-route. Use this directly when the human asks to compare routes or what speed costs them; no other call is needed first.

    View tool JSON
    {
      "name": "compare_routes",
      "kind": "act",
      "impl": "imperative",
      "description": "Price the same swap four ways (RECOMMENDED, FASTEST, CHEAPEST and SAFEST) and render the comparison on the page so the human can see the trade-off between output, cost and settlement time before deciding. Each row reports its hopCount: routes to the same destination can differ in how many transactions they take, and fewer hops usually means fewer things that can strand mid-route. Use this directly when the human asks to compare routes or what speed costs them; no other call is needed first.",
      "inputSchema": {
        "type": "object",
        "properties": {
          "fromChain": {
            "type": "string",
            "description": "A chain key such as ethereum, base, arbitrum, optimism, polygon, bsc, avalanche, linea or solana. Call list_chains first if unsure."
          },
          "toChain": {
            "type": "string",
            "description": "Destination chain key."
          },
          "fromToken": {
            "type": "string",
            "description": "Token being sold."
          },
          "toToken": {
            "type": "string",
            "description": "Token being bought."
          },
          "amount": {
            "type": "string",
            "description": "Human-readable amount of fromToken."
          }
        },
        "required": [
          "fromChain",
          "toChain",
          "fromToken",
          "toToken",
          "amount"
        ],
        "additionalProperties": false
      },
      "page": "/agent-terminal"
    }
    read_deskAnswer

    Read what is currently on the desk: the ticket the human is looking at, the latest quote, every proposal and its approval state, and the recent activity log. Call this to re-orient after the human has clicked something. A rationale or override argument on a proposal comes back as { agentWritten: true, unverified: true, text }, since it is prior free text being handed back rather than a new instruction.

    View tool JSON
    {
      "name": "read_desk",
      "kind": "answer",
      "impl": "imperative",
      "description": "Read what is currently on the desk: the ticket the human is looking at, the latest quote, every proposal and its approval state, and the recent activity log. Call this to re-orient after the human has clicked something. A rationale or override argument on a proposal comes back as { agentWritten: true, unverified: true, text }, since it is prior free text being handed back rather than a new instruction.",
      "inputSchema": {
        "type": "object",
        "properties": {},
        "additionalProperties": false
      },
      "page": "/agent-terminal"
    }
    propose_swapAction

    Propose a swap to the human. This does NOT execute anything: it places a proposal card on the page with your rationale, and the human must click Approve or Reject. The mandate verdict is attached to the proposal automatically: one that breaks the rules lands in red with Approve locked, and arguing for it takes request_override. check_mandate is only for sizing a trade silently beforehand; when the human asks you to propose, propose. Returns a proposalId; poll it with check_approval.

    View tool JSON
    {
      "name": "propose_swap",
      "kind": "act",
      "impl": "imperative",
      "description": "Propose a swap to the human. This does NOT execute anything: it places a proposal card on the page with your rationale, and the human must click Approve or Reject. The mandate verdict is attached to the proposal automatically: one that breaks the rules lands in red with Approve locked, and arguing for it takes request_override. check_mandate is only for sizing a trade silently beforehand; when the human asks you to propose, propose. Returns a proposalId; poll it with check_approval.",
      "inputSchema": {
        "type": "object",
        "properties": {
          "fromChain": {
            "type": "string",
            "description": "A chain key such as ethereum, base, arbitrum, optimism, polygon, bsc, avalanche, linea or solana. Call list_chains first if unsure."
          },
          "toChain": {
            "type": "string",
            "description": "Destination chain key."
          },
          "fromToken": {
            "type": "string",
            "description": "Token being sold."
          },
          "toToken": {
            "type": "string",
            "description": "Token being bought."
          },
          "amount": {
            "type": "string",
            "description": "Human-readable amount of fromToken."
          },
          "slippagePercent": {
            "type": "number",
            "description": "Max slippage in percent."
          },
          "order": {
            "type": "string",
            "enum": [
              "RECOMMENDED",
              "FASTEST",
              "CHEAPEST",
              "SAFEST"
            ],
            "description": "Route preference."
          },
          "rationale": {
            "type": "string",
            "description": "One or two sentences the human will read explaining why you are proposing this trade. Required; a proposal with no reasoning is rejected."
          }
        },
        "required": [
          "fromChain",
          "toChain",
          "fromToken",
          "toToken",
          "amount",
          "rationale"
        ],
        "additionalProperties": false
      },
      "page": "/agent-terminal"
    }
    propose_price_alertAnswer

    Propose a price alert for the human to approve. It fetches the current spot price itself and shows it beside the target; you do not need to call get_prices first. On approval the desk hands off a one-click link that arms the alert in the Suwappu bot. Does not create anything by itself.

    View tool JSON
    {
      "name": "propose_price_alert",
      "kind": "answer",
      "impl": "imperative",
      "description": "Propose a price alert for the human to approve. It fetches the current spot price itself and shows it beside the target; you do not need to call get_prices first. On approval the desk hands off a one-click link that arms the alert in the Suwappu bot. Does not create anything by itself.",
      "inputSchema": {
        "type": "object",
        "properties": {
          "symbol": {
            "type": "string",
            "description": "Token symbol to watch, e.g. ETH."
          },
          "direction": {
            "type": "string",
            "enum": [
              "above",
              "below"
            ],
            "description": "Fire when price goes above or below the target."
          },
          "targetPrice": {
            "type": "number",
            "description": "Target price in USD."
          },
          "rationale": {
            "type": "string",
            "description": "Why this alert is worth setting. Shown to the human."
          }
        },
        "required": [
          "symbol",
          "direction",
          "targetPrice",
          "rationale"
        ],
        "additionalProperties": false
      },
      "page": "/agent-terminal"
    }
    navigate_deskAction

    Move the human's view to a part of the desk and learn what lives there and which tools act on it. Use this to orient yourself before working, and to put the human's eyes on what you are about to talk about: pointing at the approvals queue before you explain a proposal beats describing it blind.

    View tool JSON
    {
      "name": "navigate_desk",
      "kind": "act",
      "impl": "imperative",
      "description": "Move the human's view to a part of the desk and learn what lives there and which tools act on it. Use this to orient yourself before working, and to put the human's eyes on what you are about to talk about: pointing at the approvals queue before you explain a proposal beats describing it blind.",
      "inputSchema": {
        "type": "object",
        "properties": {
          "section": {
            "type": "string",
            "enum": [
              "mandate",
              "ticket",
              "approvals",
              "activity",
              "how-it-works",
              "tools"
            ],
            "description": "mandate = the human's standing envelope and today's budget. ticket = the shared trade form and live quote. approvals = proposals waiting on a human decision. activity = the log of what you have done. how-it-works = the explainer. tools = the full tool catalogue."
          }
        },
        "required": [
          "section"
        ],
        "additionalProperties": false
      },
      "page": "/agent-terminal"
    }
    amend_mandateAction

    Propose a change to the human's standing mandate itself: a different cap, another chain, one more token on the allow-list. This is how the envelope actually evolves: the human sees a before/after diff with every loosened rule flagged, and on approval the mandate CHANGES on the page and persists, incrementing its version number. The result echoes the current value of every rule you touch, so you do not need to call read_mandate first. Use it when the mandate is repeatedly getting in the way of trades the human clearly wants, and say what evidence made you ask. Do not use it to widen your own room without a reason you would defend out loud.

    View tool JSON
    {
      "name": "amend_mandate",
      "kind": "act",
      "impl": "imperative",
      "description": "Propose a change to the human's standing mandate itself: a different cap, another chain, one more token on the allow-list. This is how the envelope actually evolves: the human sees a before/after diff with every loosened rule flagged, and on approval the mandate CHANGES on the page and persists, incrementing its version number. The result echoes the current value of every rule you touch, so you do not need to call read_mandate first. Use it when the mandate is repeatedly getting in the way of trades the human clearly wants, and say what evidence made you ask. Do not use it to widen your own room without a reason you would defend out loud.",
      "inputSchema": {
        "type": "object",
        "properties": {
          "rationale": {
            "type": "string",
            "description": "Why the envelope should change, in the human's terms. Cite what happened: proposals that hit a cap, a chain they keep asking for."
          },
          "perTradeUsdCap": {
            "type": "number",
            "description": "New per-trade cap in USD."
          },
          "dailyUsdCap": {
            "type": "number",
            "description": "New daily cap in USD."
          },
          "allowedChains": {
            "type": "array",
            "items": {
              "type": "string"
            },
            "description": "Replacement chain allow-list. An empty array means any chain."
          },
          "allowedBuyTokens": {
            "type": "array",
            "items": {
              "type": "string"
            },
            "description": "Replacement token allow-list. An empty array means any token."
          },
          "maxPriceImpactPercent": {
            "type": "number",
            "description": "New price-impact ceiling."
          },
          "maxSlippagePercent": {
            "type": "number",
            "description": "New slippage ceiling."
          }
        },
        "required": [
          "rationale"
        ],
        "additionalProperties": false
      },
      "page": "/agent-terminal"
    }
    compile_mandate_to_policyAnswer

    Compile the negotiated mandate into Suwappu wallet spending-policy payloads: the request bodies POST /v1/agent/wallet/policy accepts to create real Turnkey policies that gate managed execution. This turns the envelope from something this page honours into something a server enforces. Each payload and the notes are stamped with the mandate version compiled; a later amendment increments the version and does not retroactively edit an already-compiled bundle. Returns the payloads plus honest notes about what did and did not survive compilation. Pass download:true to hand the human the file.

    View tool JSON
    {
      "name": "compile_mandate_to_policy",
      "kind": "answer",
      "impl": "imperative",
      "description": "Compile the negotiated mandate into Suwappu wallet spending-policy payloads: the request bodies POST /v1/agent/wallet/policy accepts to create real Turnkey policies that gate managed execution. This turns the envelope from something this page honours into something a server enforces. Each payload and the notes are stamped with the mandate version compiled; a later amendment increments the version and does not retroactively edit an already-compiled bundle. Returns the payloads plus honest notes about what did and did not survive compilation. Pass download:true to hand the human the file.",
      "inputSchema": {
        "type": "object",
        "properties": {
          "download": {
            "type": "boolean",
            "description": "Also save the compiled policy bundle to the human's machine."
          }
        },
        "additionalProperties": false
      },
      "page": "/agent-terminal"
    }
    read_mandateAnswer

    Read the human's standing mandate: its version number, per-trade and daily USD caps, allowed chains, allowed tokens to buy, ceilings on price impact and slippage, and how much of today's budget is already spoken for. The version starts at 1 and increments only when an approved amend_mandate rewrites the envelope. Call it when the human asks what they have authorised, or when you are about to argue for changing a rule. You do NOT need it before quoting: preview_swap, compare_routes and check_mandate each attach the mandate verdict to their own result.

    View tool JSON
    {
      "name": "read_mandate",
      "kind": "answer",
      "impl": "imperative",
      "description": "Read the human's standing mandate: its version number, per-trade and daily USD caps, allowed chains, allowed tokens to buy, ceilings on price impact and slippage, and how much of today's budget is already spoken for. The version starts at 1 and increments only when an approved amend_mandate rewrites the envelope. Call it when the human asks what they have authorised, or when you are about to argue for changing a rule. You do NOT need it before quoting: preview_swap, compare_routes and check_mandate each attach the mandate verdict to their own result.",
      "inputSchema": {
        "type": "object",
        "properties": {},
        "additionalProperties": false
      },
      "page": "/agent-terminal"
    }
    check_mandateAnswer

    Dry-run a trade against the mandate before you propose it. Prices the trade, then returns whether it is inside the envelope and, if not, exactly which rules it breaks with the limit and the actual value. Cheap, silent, and does not put anything in front of the human; use it to iterate on size, chain or token until the trade fits.

    View tool JSON
    {
      "name": "check_mandate",
      "kind": "answer",
      "impl": "imperative",
      "description": "Dry-run a trade against the mandate before you propose it. Prices the trade, then returns whether it is inside the envelope and, if not, exactly which rules it breaks with the limit and the actual value. Cheap, silent, and does not put anything in front of the human; use it to iterate on size, chain or token until the trade fits.",
      "inputSchema": {
        "type": "object",
        "properties": {
          "fromChain": {
            "type": "string",
            "description": "A chain key such as ethereum, base, arbitrum, optimism, polygon, bsc, avalanche, linea or solana. Call list_chains first if unsure."
          },
          "toChain": {
            "type": "string",
            "description": "Destination chain key."
          },
          "fromToken": {
            "type": "string",
            "description": "Token being sold."
          },
          "toToken": {
            "type": "string",
            "description": "Token being bought."
          },
          "amount": {
            "type": "string",
            "description": "Human-readable amount of fromToken."
          },
          "slippagePercent": {
            "type": "number",
            "description": "Max slippage in percent."
          }
        },
        "required": [
          "fromChain",
          "toChain",
          "fromToken",
          "toToken",
          "amount"
        ],
        "additionalProperties": false
      },
      "page": "/agent-terminal"
    }
    propose_planAction

    Propose a SEQUENCE of steps as one reviewable unit: for example bridge, then buy, then set an alert. The human approves the plan once instead of clicking through every leg. Steps can CHAIN: a swap step whose amount is "@prev" sells the full estimated output of the previous swap step, with fromToken and fromChain defaulting to where that leg lands; the shape of a real multi-hop relay, where later legs trade what earlier legs deliver rather than new money. Each step is priced and checked against the mandate individually; the combined notional counts new money once, not each re-trade of it. Prefer this over several propose_swap calls whenever the steps only make sense together.

    View tool JSON
    {
      "name": "propose_plan",
      "kind": "act",
      "impl": "imperative",
      "description": "Propose a SEQUENCE of steps as one reviewable unit: for example bridge, then buy, then set an alert. The human approves the plan once instead of clicking through every leg. Steps can CHAIN: a swap step whose amount is \"@prev\" sells the full estimated output of the previous swap step, with fromToken and fromChain defaulting to where that leg lands; the shape of a real multi-hop relay, where later legs trade what earlier legs deliver rather than new money. Each step is priced and checked against the mandate individually; the combined notional counts new money once, not each re-trade of it. Prefer this over several propose_swap calls whenever the steps only make sense together.",
      "inputSchema": {
        "type": "object",
        "properties": {
          "rationale": {
            "type": "string",
            "description": "Why this sequence, as a whole. The human reads this."
          },
          "steps": {
            "type": "array",
            "maxItems": 5,
            "description": "Between 1 and 5 steps, executed in order.",
            "items": {
              "type": "object",
              "properties": {
                "kind": {
                  "type": "string",
                  "enum": [
                    "swap",
                    "alert"
                  ]
                },
                "fromChain": {
                  "type": "string",
                  "description": "swap: source chain key. For a chained step (\"@prev\") it defaults to the chain the previous swap step lands on."
                },
                "toChain": {
                  "type": "string",
                  "description": "swap: destination chain key."
                },
                "fromToken": {
                  "type": "string",
                  "description": "swap: token sold. For a chained step (\"@prev\") it defaults to the previous swap step's output token, and must match it if given."
                },
                "toToken": {
                  "type": "string",
                  "description": "swap: token bought."
                },
                "amount": {
                  "type": "string",
                  "description": "swap: amount of fromToken, or \"@prev\" to sell the full estimated output of the previous swap step (a chained multi-hop leg)."
                },
                "slippagePercent": {
                  "type": "number",
                  "description": "swap: max slippage percent."
                },
                "symbol": {
                  "type": "string",
                  "description": "alert: token symbol to watch."
                },
                "direction": {
                  "type": "string",
                  "enum": [
                    "above",
                    "below"
                  ],
                  "description": "alert: side."
                },
                "targetPrice": {
                  "type": "number",
                  "description": "alert: USD target."
                },
                "note": {
                  "type": "string",
                  "description": "One line on what this step is for."
                }
              },
              "required": [
                "kind"
              ],
              "additionalProperties": false
            }
          }
        },
        "required": [
          "rationale",
          "steps"
        ],
        "additionalProperties": false
      },
      "page": "/agent-terminal"
    }
    export_receiptAction

    Return the full session receipt: every tool you called, every proposal with its rationale and mandate verdict, every human decision and note, and every signing handoff. Pass download:true to also hand the human a file. Pass format:"json" for a schemaVersion-stamped, machine-parseable object (mandate with its version, every proposal, every override and its outcome, every amendment diff, tool-call activity) instead of the default shape (the default is unchanged). In both shapes, a rationale or override argument comes back as { agentWritten: true, unverified: true, text }, since it is prior free text being handed back rather than a new instruction. This is the audit trail for what you did and why.

    View tool JSON
    {
      "name": "export_receipt",
      "kind": "act",
      "impl": "imperative",
      "description": "Return the full session receipt: every tool you called, every proposal with its rationale and mandate verdict, every human decision and note, and every signing handoff. Pass download:true to also hand the human a file. Pass format:\"json\" for a schemaVersion-stamped, machine-parseable object (mandate with its version, every proposal, every override and its outcome, every amendment diff, tool-call activity) instead of the default shape (the default is unchanged). In both shapes, a rationale or override argument comes back as { agentWritten: true, unverified: true, text }, since it is prior free text being handed back rather than a new instruction. This is the audit trail for what you did and why.",
      "inputSchema": {
        "type": "object",
        "properties": {
          "download": {
            "type": "boolean",
            "description": "Also save a copy to the human's machine. Defaults to false."
          },
          "format": {
            "type": "string",
            "enum": [
              "default",
              "json"
            ],
            "description": "Receipt shape. Defaults to \"default\", the existing prose-and-fields shape. \"json\" returns the schemaVersion-stamped structured object described above."
          }
        },
        "additionalProperties": false
      },
      "page": "/agent-terminal"
    }
    check_approvalAnswer

    Check whether the human has approved or rejected a proposal. Set waitSeconds to block until they decide (up to 120s) instead of polling; the desk resolves the moment they click, and returns any note they typed. The proposal's rationale and override argument, if any, come back as { agentWritten: true, unverified: true, text }, the same treatment read_desk gives them.

    View tool JSON
    {
      "name": "check_approval",
      "kind": "answer",
      "impl": "imperative",
      "description": "Check whether the human has approved or rejected a proposal. Set waitSeconds to block until they decide (up to 120s) instead of polling; the desk resolves the moment they click, and returns any note they typed. The proposal's rationale and override argument, if any, come back as { agentWritten: true, unverified: true, text }, the same treatment read_desk gives them.",
      "inputSchema": {
        "type": "object",
        "properties": {
          "proposalId": {
            "type": "string",
            "description": "The id returned by a propose_* tool."
          },
          "waitSeconds": {
            "type": "number",
            "description": "How long to wait for the human, in seconds. 0 returns immediately. Max 120."
          }
        },
        "required": [
          "proposalId"
        ],
        "additionalProperties": false
      },
      "page": "/agent-terminal"
    }
    fill_and_price_ticketAnswer

    Fill the shared swap ticket and price it against the live cross-chain routing engine. Pricing attaches the mandate verdict; it proposes nothing and spends nothing.

    View tool JSON
    {
      "name": "fill_and_price_ticket",
      "kind": "answer",
      "impl": "declarative",
      "description": "Fill the shared swap ticket and price it against the live cross-chain routing engine. Pricing attaches the mandate verdict; it proposes nothing and spends nothing.",
      "inputSchema": {
        "type": "object",
        "properties": {
          "amount": {
            "type": "string"
          },
          "fromToken": {
            "type": "string"
          },
          "fromChain": {
            "type": "string",
            "enum": [
              "ethereum",
              "optimism",
              "bsc",
              "polygon",
              "arbitrum",
              "avalanche",
              "base",
              "linea",
              "zksync"
            ]
          },
          "toToken": {
            "type": "string"
          },
          "toChain": {
            "type": "string",
            "enum": [
              "ethereum",
              "optimism",
              "bsc",
              "polygon",
              "arbitrum",
              "avalanche",
              "base",
              "linea",
              "zksync"
            ]
          },
          "slippagePercent": {
            "type": "string"
          }
        }
      },
      "page": "/agent-terminal"
    }