addrbookFor publishers
← The evidence ledger

Evidence row 578036

Observed , by probe.mcp/1.

Kind
mcp.tools
About
endpoint ba8b2efd-7b10-4c89-8773-9a5d7c594ff2
Recorded
Previous row
None: the first of its kind about this subject
Body SHA-256
73dcadf96f4e3c01dcdbce58d25bc4d5facc15c93085287033eca6f9dded79a8
Leaf
0x728f39c94f3f0f28fd91a7c2fb34c911733af09940fa13ead438125201fc59f0

What was observed

{
  "count": 22,
  "tools": [
    {
      "description": "Ask the user to approve cancelling one of their open orders (hash from list_orders). Returns an approval link; the cancellation is signed by the user's wallet in the Epsilon app. Orders already filled cannot be cancelled.",
      "inputSchema": {
        "additionalProperties": false,
        "properties": {
          "note": {
            "description": "optional reason shown to the user (≤ 140 chars)",
            "type": "string"
          },
          "orderHash": {
            "description": "EIP-712 order hash to cancel (0x-hex, 32 bytes) — from list_orders",
            "type": "string"
          }
        },
        "required": [
          "orderHash"
        ],
        "type": "object"
      },
      "name": "cancel_order"
    },
    {
      "description": "Check whether a resting order (limit, stop, DCA, trailing) for this pair and size would be executable: oracle support, liquidity, minimum size. Run this before signing any resting order; it does not price the trade — get_route does. Amounts are RAW token units.",
      "inputSchema": {
        "additionalProperties": false,
        "properties": {
          "amountIn": {
            "description": "amount of tokenIn in RAW token units (decimal string, already scaled by the token's decimals)",
            "type": "string"
          },
          "tokenIn": {
            "description": "ERC-20 address of the token being sold (0x-hex)",
            "type": "string"
          },
          "tokenOut": {
            "description": "ERC-20 address of the token being bought (0x-hex)",
            "type": "string"
          }
        },
        "required": [
          "tokenIn",
          "tokenOut",
          "amountIn"
        ],
        "type": "object"
      },
      "name": "check_order"
    },
    {
      "description": "Status of an approval you created: pending (user hasn't decided), submitted (with orderHash or txHash — then use get_order to follow fills), rejected, failed, or expired (links live 30 minutes). Poll no more than every few seconds.",
      "inputSchema": {
        "additionalProperties": false,
        "properties": {
          "id": {
            "description": "approval id returned by a place_*/cancel_order call (apr_…)",
            "type": "string"
          }
        },
        "required": [
          "id"
        ],
        "type": "object"
      },
      "name": "get_approval"
    },
    {
      "description": "Machine-readable catalog of every error code the Epsilon API returns, with meanings and retry guidance. Consult it when any other tool returns an error code you need to interpret or decide whether to retry.",
      "inputSchema": {
        "additionalProperties": false,
        "type": "object"
      },
      "name": "get_error_catalog"
    },
    {
      "description": "Full source code of one Epsilon integration example, by id from list_examples. No API key required.",
      "inputSchema": {
        "additionalProperties": false,
        "properties": {
          "id": {
            "description": "example id from list_examples, e.g. python-dca-cron",
            "type": "string"
          }
        },
        "required": [
          "id"
        ],
        "type": "object"
      },
      "name": "get_example"
    },
    {
      "description": "The signed-in account's agent grant for this channel, if any: the embedded wallet it signs with, per-order and daily caps, what remains today, allowed order kinds, and whether the Epsilon signer is actually granted on the wallet. Call it before placing to know whether an order will be placed immediately or need an approval link. Grants are created and revoked by the user in the Epsilon app, never by a tool.",
      "inputSchema": {
        "additionalProperties": false,
        "type": "object"
      },
      "name": "get_grant"
    },
    {
      "description": "Market-level numbers for Epsilon (Robinhood Chain DEX). scope=overview (default) is the best first call: top tokens by 30-day volume, 24h volume, and engine-wide order/fill stats in one response. scope=engine returns only order counts by status, fill counts and volume aggregates; scope=volume returns per-token and total swap volume over window. For one token use search_tokens; for executed trades use list_fills.",
      "inputSchema": {
        "additionalProperties": false,
        "properties": {
          "scope": {
            "description": "what to return: overview (default — top tokens by 30d volume + 24h volume + engine stats, the best first call), engine (order counts by status, fill counts, volume aggregates), or volume (per-token and total swap volume over window)",
            "type": "string"
          },
          "window": {
            "description": "for scope=volume: 1h, 24h (default), 7d, 30d, or all",
            "type": "string"
          }
        },
        "type": "object"
      },
      "name": "get_market_stats"
    },
    {
      "description": "The signed-in Epsilon account behind this session: account id, handle, linked wallets (embedded first), the scopes this client was granted, and which client is connected. Call it first after sign-in to learn the wallet address other tools need. Requires an OAuth session (connect to /mcp/account); on the keyless /mcp endpoint it explains how to sign in instead.",
      "inputSchema": {
        "additionalProperties": false,
        "type": "object"
      },
      "name": "get_me"
    },
    {
      "description": "One Epsilon order by hash: status (pending/active/filled/cancelled/expired), parameters, and its fills. Use list_orders to find orders by wallet first; use get_orderbook for the market's resting orders on a pair.",
      "inputSchema": {
        "additionalProperties": false,
        "properties": {
          "orderHash": {
            "description": "EIP-712 order hash (0x-hex, 32 bytes)",
            "type": "string"
          }
        },
        "required": [
          "orderHash"
        ],
        "type": "object"
      },
      "name": "get_order"
    },
    {
      "description": "The market's open (pending/active) limit orders on both sides of a token pair, largest first — liquidity you can rest against. For one wallet's own orders use list_orders instead.",
      "inputSchema": {
        "additionalProperties": false,
        "properties": {
          "tokenA": {
            "description": "first token address of the pair (0x-hex)",
            "type": "string"
          },
          "tokenB": {
            "description": "second token address of the pair (0x-hex)",
            "type": "string"
          }
        },
        "required": [
          "tokenA",
          "tokenB"
        ],
        "type": "object"
      },
      "name": "get_orderbook"
    },
    {
      "description": "Best executable quote for swapping tokenIn → tokenOut on Epsilon (Robinhood Chain, id 4663): expected output and price. Use this for a quick price check; use get_route when you need the venue split, fee legs or minimum output for an order you will sign. Amounts are RAW token units — scale by the token's decimals first. Never executes.",
      "inputSchema": {
        "additionalProperties": false,
        "properties": {
          "amountIn": {
            "description": "amount of tokenIn in RAW token units (decimal string, already scaled by the token's decimals)",
            "type": "string"
          },
          "tokenIn": {
            "description": "ERC-20 address of the token being sold (0x-hex)",
            "type": "string"
          },
          "tokenOut": {
            "description": "ERC-20 address of the token being bought (0x-hex)",
            "type": "string"
          }
        },
        "required": [
          "tokenIn",
          "tokenOut",
          "amountIn"
        ],
        "type": "object"
      },
      "name": "get_quote"
    },
    {
      "description": "Full routing breakdown for a swap: best venue split, expected and minimum output, price impact (ppm), and the feeLegs a signed order must embed (pass orderType for a resting order so the right fee cell is served). Use get_quote for a plain price; use check_order to learn whether a resting order would be executable at all. Read-only. Amounts are RAW token units.",
      "inputSchema": {
        "additionalProperties": false,
        "properties": {
          "amountIn": {
            "description": "amount of tokenIn in RAW token units (decimal string, already scaled by the token's decimals)",
            "type": "string"
          },
          "orderType": {
            "description": "order kind being priced (limit | stop_loss | take_profit | dca | trailing) — selects the fee cell served in feeLegs; omit for a direct swap",
            "type": "string"
          },
          "slippageBps": {
            "description": "slippage tolerance in basis points (default 100 = 1%)",
            "type": "integer"
          },
          "tokenIn": {
            "description": "ERC-20 address of the token being sold (0x-hex)",
            "type": "string"
          },
          "tokenOut": {
            "description": "ERC-20 address of the token being bought (0x-hex)",
            "type": "string"
          },
          "triggered": {
            "description": "with orderType=dca: the schedule gates on a trigger (triggered DCA fee cell)",
            "type": "boolean"
          },
          "wallet": {
            "description": "optional maker wallet address — include it to get the exact feeLegs an order for this wallet must embed",
            "type": "string"
          }
        },
        "required": [
          "tokenIn",
          "tokenOut",
          "amountIn"
        ],
        "type": "object"
      },
      "name": "get_route"
    },
    {
      "description": "List runnable Epsilon integration examples (Python cron DCA, LangChain tools, Vercel AI SDK tools, Telegram bot). Fetch full source with get_example. No API key required.",
      "inputSchema": {
        "additionalProperties": false,
        "type": "object"
      },
      "name": "list_examples"
    },
    {
      "description": "Executed trades (swaps and order fills) on Epsilon, newest first, optionally for one wallet — the trade history. For resting/open orders use list_orders. Amounts are RAW token units.",
      "inputSchema": {
        "additionalProperties": false,
        "properties": {
          "limit": {
            "description": "max rows (default 100, cap 500)",
            "type": "integer"
          },
          "wallet": {
            "description": "optional wallet address to filter by",
            "type": "string"
          }
        },
        "type": "object"
      },
      "name": "list_fills"
    },
    {
      "description": "A wallet's Epsilon orders filtered by status and/or type — the portfolio view, newest first. Use get_order for one order's fills; use list_fills for executed trades.",
      "inputSchema": {
        "additionalProperties": false,
        "properties": {
          "limit": {
            "description": "max rows (default 100, cap 500)",
            "type": "integer"
          },
          "status": {
            "description": "order status filter, e.g. active, filled, cancelled",
            "type": "string"
          },
          "type": {
            "description": "order type filter, e.g. limit, dca, trailing",
            "type": "string"
          },
          "wallet": {
            "description": "maker wallet address to filter by (0x-hex)",
            "type": "string"
          }
        },
        "type": "object"
      },
      "name": "list_orders"
    },
    {
      "description": "Ask the user to approve a DCA program: sell amount of tokenIn for tokenOut in `executions` equal slices, one every `every` (15m, 1h, 1d…). Optionally gated by triggerPrice (only sells at or below it). Keeper-executed after signing; always returns an approval link — DCA is never executed under an agent grant. HUMAN units; amount is the TOTAL.",
      "inputSchema": {
        "additionalProperties": false,
        "properties": {
          "amount": {
            "description": "TOTAL amount of tokenIn across the whole program, HUMAN units, decimal string",
            "type": "string"
          },
          "every": {
            "description": "interval between sells like 15m, 1h, 1d (minimum 1m)",
            "type": "string"
          },
          "executions": {
            "description": "number of sells, 2–500; each sells amount/executions",
            "type": "integer"
          },
          "note": {
            "description": "optional one-line reason shown to the user (≤ 140 chars)",
            "type": "string"
          },
          "pauseOnRecovery": {
            "description": "with triggerPrice: pause the program while price is back above the trigger",
            "type": "boolean"
          },
          "slippageBps": {
            "description": "slippage tolerance per execution in basis points (default 100)",
            "type": "integer"
          },
          "tokenIn": {
            "description": "ERC-20 address being sold in slices (0x-hex)",
            "type": "string"
          },
          "tokenOut": {
            "description": "ERC-20 address being accumulated (0x-hex)",
            "type": "string"
          },
          "triggerPrice": {
            "description": "optional: only sell while price is at or below this (tokenOut per tokenIn); omit to sell every interval regardless",
            "type": "string"
          }
        },
        "required": [
          "tokenIn",
          "tokenOut",
          "amount",
          "every",
          "executions"
        ],
        "type": "object"
      },
      "name": "place_dca_order"
    },
    {
      "description": "Place a resting limit order: sell amount tokenIn for tokenOut once the market reaches limitPrice (tokenOut per tokenIn) or better. Keeper-executed — it keeps working with the chat closed. If the user granted this client an agent grant and the order fits its caps, it is queued with a stable requestId (status reserved or submitted); otherwise you get an approval link the user signs in the Epsilon app (status needs_approval). Run check_order first. For a protective sell below the market use place_stop_order; for an immediate swap use place_market_order. HUMAN units.",
      "inputSchema": {
        "additionalProperties": false,
        "properties": {
          "amount": {
            "description": "amount of tokenIn in HUMAN units, decimal string",
            "type": "string"
          },
          "expiresIn": {
            "description": "optional lifetime like 7d, 24h, 30m; default: never",
            "type": "string"
          },
          "limitPrice": {
            "description": "price in tokenOut per 1 tokenIn, decimal string (e.g. selling WETH for USDG at \"4200\")",
            "type": "string"
          },
          "note": {
            "description": "optional one-line reason shown to the user (≤ 140 chars)",
            "type": "string"
          },
          "requestId": {
            "description": "stable 32 lowercase hex characters for this trade; required for autonomous execution, reuse unchanged when retrying",
            "type": "string"
          },
          "slippageBps": {
            "description": "slippage tolerance for the fill in basis points (default 100)",
            "type": "integer"
          },
          "tokenIn": {
            "description": "ERC-20 address being sold (0x-hex)",
            "type": "string"
          },
          "tokenOut": {
            "description": "ERC-20 address being bought (0x-hex)",
            "type": "string"
          }
        },
        "required": [
          "tokenIn",
          "tokenOut",
          "amount",
          "limitPrice"
        ],
        "type": "object"
      },
      "name": "place_limit_order"
    },
    {
      "description": "Ask the user to approve a market swap of amount tokenIn → tokenOut at the best current route. Returns an approval link, not a fill: the user signs in the Epsilon app. Use get_quote first to tell the user what to expect. For a price-conditional order use place_limit_order or place_stop_order. Amounts are HUMAN units.",
      "inputSchema": {
        "additionalProperties": false,
        "properties": {
          "amount": {
            "description": "amount of tokenIn in HUMAN units, decimal string (e.g. \"50\" USDG, \"0.25\" WETH) — not raw units",
            "type": "string"
          },
          "note": {
            "description": "optional one-line reason shown to the user on the approval page (≤ 140 chars)",
            "type": "string"
          },
          "slippageBps": {
            "description": "slippage tolerance in basis points (default 100 = 1%, max 5000)",
            "type": "integer"
          },
          "tokenIn": {
            "description": "ERC-20 address being sold (0x-hex); resolve symbols with search_tokens first",
            "type": "string"
          },
          "tokenOut": {
            "description": "ERC-20 address being bought (0x-hex)",
            "type": "string"
          }
        },
        "required": [
          "tokenIn",
          "tokenOut",
          "amount"
        ],
        "type": "object"
      },
      "name": "place_market_order"
    },
    {
      "description": "Place a stop-loss: sell amount tokenIn for tokenOut if the price falls to triggerPrice (tokenOut per tokenIn). Keeper-executed. Queued under an active agent grant that covers it, otherwise returns an approval link (status needs_approval). Use place_limit_order to sell ABOVE the market (take profit); this tool is for protection BELOW it. Autonomous stops enforce a signed minimum and may remain unfilled after a price gap. HUMAN units.",
      "inputSchema": {
        "additionalProperties": false,
        "properties": {
          "amount": {
            "description": "amount of tokenIn to sell, HUMAN units, decimal string",
            "type": "string"
          },
          "note": {
            "description": "optional one-line reason shown to the user (≤ 140 chars)",
            "type": "string"
          },
          "requestId": {
            "description": "stable 32 lowercase hex characters for this trade; required for autonomous execution, reuse unchanged when retrying",
            "type": "string"
          },
          "slippageBps": {
            "description": "slippage tolerance for the fill in basis points (default 100)",
            "type": "integer"
          },
          "tokenIn": {
            "description": "ERC-20 address being sold when the stop triggers (0x-hex)",
            "type": "string"
          },
          "tokenOut": {
            "description": "ERC-20 address received (0x-hex), usually USDG",
            "type": "string"
          },
          "triggerPrice": {
            "description": "stop trigger in tokenOut per 1 tokenIn, decimal string — strict floor stop order; may remain unfilled if the price gaps below its minimum",
            "type": "string"
          }
        },
        "required": [
          "tokenIn",
          "tokenOut",
          "amount",
          "triggerPrice"
        ],
        "type": "object"
      },
      "name": "place_stop_order"
    },
    {
      "description": "Ask the user to approve a trailing stop: sell amount tokenIn for tokenOut when price drops trailPercent below its running high since placement. Keeper-executed after signing; always returns an approval link — trailing stops are never executed under an agent grant. For a fixed level use place_stop_order. HUMAN units.",
      "inputSchema": {
        "additionalProperties": false,
        "properties": {
          "amount": {
            "description": "amount of tokenIn to sell, HUMAN units, decimal string",
            "type": "string"
          },
          "expiresIn": {
            "description": "optional lifetime like 7d, 30d; default 7d",
            "type": "string"
          },
          "note": {
            "description": "optional one-line reason shown to the user (≤ 140 chars)",
            "type": "string"
          },
          "slippageBps": {
            "description": "slippage tolerance for the fill in basis points (default 100)",
            "type": "integer"
          },
          "tokenIn": {
            "description": "ERC-20 address being protected / sold when the trail triggers (0x-hex)",
            "type": "string"
          },
          "tokenOut": {
            "description": "ERC-20 address received (0x-hex), usually USDG",
            "type": "string"
          },
          "trailPercent": {
            "description": "distance below the running high that triggers the sell, in percent (e.g. 5 = 5%); 0.1–99",
            "type": "number"
          }
        },
        "required": [
          "tokenIn",
          "tokenOut",
          "amount",
          "trailPercent"
        ],
        "type": "object"
      },
      "name": "place_trailing_order"
    },
    {
      "description": "Search the Epsilon developer documentation (API, auth, order signing, webhooks, rev-share, SDKs, MCP). Returns the most relevant doc sections. No API key required.",
      "inputSchema": {
        "additionalProperties": false,
        "properties": {
          "limit": {
            "description": "max sections to return (default 5, cap 10)",
            "type": "integer"
          },
          "query": {
            "description": "what to look for in the Epsilon developer docs, e.g. 'sign an order', 'rate limits', 'webhooks signature'",
            "type": "string"
          }
        },
        "required": [
          "query"
        ],
        "type": "object"
      },
      "name": "search_docs"
    },
    {
      "description": "Resolve a token symbol or name to its address and decimals — call this FIRST when the user names a token; every other tool takes addresses. volume30dUsd disambiguates same-symbol tokens: the real one has volume.",
      "inputSchema": {
        "additionalProperties": false,
        "properties": {
          "limit": {
            "description": "max rows (default 20, cap 100)",
            "type": "integer"
          },
          "search": {
            "description": "symbol or name fragment (e.g. USDG), or an exact 0x address; empty returns the top tokens by 30-day volume",
            "type": "string"
          }
        },
        "type": "object"
      },
      "name": "search_tokens"
    }
  ]
}

What the leaf hashes

{"body":"73dcadf96f4e3c01dcdbce58d25bc4d5facc15c93085287033eca6f9dded79a8","id":578036,"kind":"mcp.tools","method":"probe.mcp/1","observed_us":1793142837555754,"prev":null,"subject":"ba8b2efd-7b10-4c89-8773-9a5d7c594ff2","subject_kind":"endpoint"}

Proof

Fold these into the leaf in order, hashing each sorted pair with keccak256, to reach the root of (273461 rows).

  1. 0x728f29afa9097a70fc6984d1155a5d913e185b9d9242544b1d419f8bfa93ae1f
  2. 0x7164d04e2928578d80d1e2cfe8310d5e320968ccbdd70d21dd3d94d6408c8089
  3. 0x5208d791b4e551a54ca0312e57f9a91315459cb305dfccbfefebfcd2f1b6c9ab
  4. 0x5eef6b792fe2a71f759a91af8db6653d278769404e87489a987132f46d7d9297
  5. 0x66f14acfd7dfeec758d895fb47ebbb15e3ad336205f8ed00b3c9e9ccebfd9926
  6. 0x2ffc84ee2f958edbc2d13dc3f36f7d8773c43226e43ffe324225985df937a94d
  7. 0xee4027b1c929b827353035f5f576c41d5bfc27ebd29a25811273f59d236c9bed
  8. 0xbacc75a1937a7067520f14555eb42df5aa27f22a6499abbe4b8ba9f834df0a61
  9. 0x1834926a41726b82ca399b1246e6ca611c1b2916772420cc0f0a584bd58d1d1c
  10. 0x41177ecd574fbfd5db971f26345d463c2727ea480039aa14f77f20bd18ac0eca
  11. 0x23a51a936f60011ce90a404c26ca8b5c81a512eb324bd00dcb5ce643c0b38c8e
  12. 0x8a2168d13e43e2c8b0f508ca779f90beef60501499eeab439eb7d23816a97bc4
  13. 0x2926e99aefa0ff2e14a67a3ae10a7f6e753ce4b799c6fe531f8cbf8d33b31a66
  14. 0xb2ae53d841a55a805fb4078b1a7d44e08a81aba4be3690bac3a5b4c366bf39da
  15. 0x275720ecabb68df33eee92ae4fd70572a8d952d6c61c061c2869cfc3217aa5c5
  16. 0x23cf9bb4337ee8be7fcae368fd69d24c62c11fb45882127b4cd919bb96a19996
  17. 0x0e01aa9525097570a6edaf32bfc959de57bf5c24317cf10c0716affea85ca60d
  18. 0xa20d48798a34aba12eb9c7297722982d910f06c148f5e27ac59307422964a585
  19. 0x9fc354c0ea3efc3f1b6548bb77ea902a50f2c9647647ea61592efce2bd795699
Day root
0xdd77e5e99da32c3f154180d63e3c3e6fe11e896a2c6896412ef6b5c4bcf7e795
Chained
0x23bb4dfd09f55c15ac3962f53578e02c6114d5bfd9bb451cf8794fb6e2817ef4
Published
On Arc Testnet, block 69414147: 0xb2ebd83aafeb765a0ce66e76aefb133ed06606c98038fd56191e2bcd1dcb77b4

How to check it · This row as JSON