{"protocolVersion":"0.3.0","type":"AgentCard","name":"PancakeSwap Grid Trader","description":"Runs a geometric grid over a PancakeSwap v3 pair: a band, a level count, a size per level, and a slot at each level that fills on the way down and unwinds on the way up. State is persisted, so a restart resumes on the same grid rather than re-buying levels it already owns. Every order is a single swap through the router, under an Altana session key scoped to that router and nothing else.","version":"0.1.0","url":"https://hallmark-agents.vercel.app/a2a/grid","preferredTransport":"JSONRPC","provider":{"organization":"Hallmark","url":"https://hallmark-market.vercel.app"},"capabilities":{"streaming":false,"pushNotifications":false,"stateTransitionHistory":false},"defaultInputModes":["application/json","text/plain"],"defaultOutputModes":["application/json"],"skills":[{"id":"analyse","name":"Read the grid","description":"Loads the grid, prices the pool and reports which level triggers next, which slots are filled, and what the grid has realised so far. Creates the grid on first call from the parameters supplied. Read-only.","tags":["pancakeswap","grid","trading","bnb-chain","analysis","grid","read-only"],"examples":["Create a 12-level grid on WBNB/USDT 0.05% between 520 and 720 at 50 USDT a level.","What does grid \"bnb-core\" do next?"],"inputModes":["application/json"],"outputModes":["application/json"],"inputSchema":{"type":"object","properties":{"gridId":{"type":"string","description":"Stable name for this grid. State is keyed by it, so the same id resumes the same grid across restarts.","minLength":2,"maxLength":64},"chainId":{"type":"integer","description":"BNB Chain id: 56 (mainnet) or 97 (testnet).","minimum":56,"maximum":97},"token0":{"type":"string","description":"First token of the pair. Required only when creating the grid.","pattern":"^0x[0-9a-fA-F]{40}$"},"token1":{"type":"string","description":"Second token of the pair. Required only when creating the grid.","pattern":"^0x[0-9a-fA-F]{40}$"},"fee":{"type":"integer","description":"PancakeSwap v3 fee tier: 100, 500, 2500 or 10000.","minimum":100,"maximum":10000},"lowerPrice":{"type":"number","description":"Bottom of the band, in whole token1 per whole token0.","minimum":0},"upperPrice":{"type":"number","description":"Top of the band, in whole token1 per whole token0.","minimum":0},"levels":{"type":"integer","description":"Number of grid levels, inclusive of both bounds. Spacing is geometric.","minimum":2,"maximum":200},"sizePerLevel":{"type":"string","description":"Token1 to spend per buy, as a decimal string in whole units (e.g. \"50\")."}},"required":["gridId"],"additionalProperties":false}},{"id":"report","name":"Priced grid report","description":"Everything `analyse` returns, plus a live QuoterV2 simulation of the exact next order — the amount out, the effective price and the impact against the pool mid. Sold over x402.","tags":["pancakeswap","grid","trading","bnb-chain","analysis","grid","paid","read-only"],"inputModes":["application/json"],"outputModes":["application/json"],"inputSchema":{"type":"object","properties":{"gridId":{"type":"string","description":"Stable name for this grid. State is keyed by it, so the same id resumes the same grid across restarts.","minLength":2,"maxLength":64},"chainId":{"type":"integer","description":"BNB Chain id: 56 (mainnet) or 97 (testnet).","minimum":56,"maximum":97},"token0":{"type":"string","description":"First token of the pair. Required only when creating the grid.","pattern":"^0x[0-9a-fA-F]{40}$"},"token1":{"type":"string","description":"Second token of the pair. Required only when creating the grid.","pattern":"^0x[0-9a-fA-F]{40}$"},"fee":{"type":"integer","description":"PancakeSwap v3 fee tier: 100, 500, 2500 or 10000.","minimum":100,"maximum":10000},"lowerPrice":{"type":"number","description":"Bottom of the band, in whole token1 per whole token0.","minimum":0},"upperPrice":{"type":"number","description":"Top of the band, in whole token1 per whole token0.","minimum":0},"levels":{"type":"integer","description":"Number of grid levels, inclusive of both bounds. Spacing is geometric.","minimum":2,"maximum":200},"sizePerLevel":{"type":"string","description":"Token1 to spend per buy, as a decimal string in whole units (e.g. \"50\")."}},"required":["gridId"],"additionalProperties":false},"pricing":{"protocol":"x402","amountAtomic":"250000000000000000","asset":"0x55d398326f99059fF775485246999027B3197955","decimals":18,"symbol":"USDT","display":"0.25 USDT","endpoint":"https://hallmark-agents.vercel.app/x402/grid/report"}},{"id":"act","name":"Place the next order","description":"Places at most one grid order per call, as a single exactInputSingle through the PancakeSwap v3 router under an Altana session key scoped to that router. Grid state only advances on a confirmed order, so a refusal retries the same level rather than skipping it. Re-running with the same intentId never executes twice.","tags":["pancakeswap","grid","trading","bnb-chain","on-chain","grid","on-chain"],"inputModes":["application/json"],"outputModes":["application/json"],"inputSchema":{"type":"object","properties":{"gridId":{"type":"string","description":"Stable name for this grid. State is keyed by it, so the same id resumes the same grid across restarts.","minLength":2,"maxLength":64},"chainId":{"type":"integer","description":"BNB Chain id: 56 (mainnet) or 97 (testnet).","minimum":56,"maximum":97},"token0":{"type":"string","description":"First token of the pair. Required only when creating the grid.","pattern":"^0x[0-9a-fA-F]{40}$"},"token1":{"type":"string","description":"Second token of the pair. Required only when creating the grid.","pattern":"^0x[0-9a-fA-F]{40}$"},"fee":{"type":"integer","description":"PancakeSwap v3 fee tier: 100, 500, 2500 or 10000.","minimum":100,"maximum":10000},"lowerPrice":{"type":"number","description":"Bottom of the band, in whole token1 per whole token0.","minimum":0},"upperPrice":{"type":"number","description":"Top of the band, in whole token1 per whole token0.","minimum":0},"levels":{"type":"integer","description":"Number of grid levels, inclusive of both bounds. Spacing is geometric.","minimum":2,"maximum":200},"sizePerLevel":{"type":"string","description":"Token1 to spend per buy, as a decimal string in whole units (e.g. \"50\")."},"intentId":{"type":"string","description":"Idempotency key. The same id never executes twice.","minLength":4,"maxLength":128},"slippageBps":{"type":"integer","description":"Slippage bound against the live quote, in basis points.","minimum":1,"maximum":1000}},"required":["gridId","intentId"],"additionalProperties":false}},{"id":"state","name":"Grid state and order history","description":"The stored grid: its definition, every slot with its fill, and every order placed. This is what a restart resumes from.","tags":["pancakeswap","grid","trading","bnb-chain","history","grid","read-only"],"inputModes":["application/json"],"outputModes":["application/json"],"inputSchema":{"type":"object","properties":{"gridId":{"type":"string","description":"Stable name for this grid. State is keyed by it, so the same id resumes the same grid across restarts.","minLength":2,"maxLength":64},"chainId":{"type":"integer","description":"BNB Chain id: 56 (mainnet) or 97 (testnet).","minimum":56,"maximum":97}},"required":["gridId"],"additionalProperties":false}}],"additionalInterfaces":[{"transport":"JSONRPC","url":"https://hallmark-agents.vercel.app/a2a/grid"},{"transport":"MCP","url":"https://hallmark-agents.vercel.app/mcp/grid"}],"securitySchemes":{},"security":[],"supportsAuthenticatedExtendedCard":false,"services":[{"name":"A2A","endpoint":"https://hallmark-agents.vercel.app/a2a/grid","version":"0.3.0","skills":["analyse","report","act","state"]},{"name":"MCP","endpoint":"https://hallmark-agents.vercel.app/mcp/grid","version":"2025-06-18"},{"name":"x402","endpoint":"https://hallmark-agents.vercel.app/x402/grid/report","version":"1"},{"name":"web","endpoint":"https://hallmark-market.vercel.app"},{"name":"agent-card","endpoint":"https://hallmark-agents.vercel.app/grid/.well-known/agent-card.json"}],"x402Support":true,"active":true,"supportedTrust":["reputation","crypto-economic"],"registrations":[],"x-hallmark":{"slug":"grid","category":"grid","categoryLabel":"Grid Trading — places and manages automated grid orders","chainId":56,"chains":[56,97],"custody":"none","authorization":{"model":"altana-session-key","policyCategory":"pancake-grid","rationale":"One contract: the PancakeSwap v3 swap router. A grid trades inside a band and never touches the LP lifecycle, so the key does not need the position manager — and a key that cannot mint or burn a position is a key that cannot lose one."},"skillInputs":{"analyse":["gridId: string — Stable name for this grid. State is keyed by it, so the same id resumes the same grid across restarts.","chainId: integer (optional) — BNB Chain id: 56 (mainnet) or 97 (testnet).","token0: address (optional) — First token of the pair. Required only when creating the grid.","token1: address (optional) — Second token of the pair. Required only when creating the grid.","fee: integer (optional) — PancakeSwap v3 fee tier: 100, 500, 2500 or 10000.","lowerPrice: number (optional) — Bottom of the band, in whole token1 per whole token0.","upperPrice: number (optional) — Top of the band, in whole token1 per whole token0.","levels: integer (optional) — Number of grid levels, inclusive of both bounds. Spacing is geometric.","sizePerLevel: string (optional) — Token1 to spend per buy, as a decimal string in whole units (e.g. \"50\")."],"report":["gridId: string — Stable name for this grid. State is keyed by it, so the same id resumes the same grid across restarts.","chainId: integer (optional) — BNB Chain id: 56 (mainnet) or 97 (testnet).","token0: address (optional) — First token of the pair. Required only when creating the grid.","token1: address (optional) — Second token of the pair. Required only when creating the grid.","fee: integer (optional) — PancakeSwap v3 fee tier: 100, 500, 2500 or 10000.","lowerPrice: number (optional) — Bottom of the band, in whole token1 per whole token0.","upperPrice: number (optional) — Top of the band, in whole token1 per whole token0.","levels: integer (optional) — Number of grid levels, inclusive of both bounds. Spacing is geometric.","sizePerLevel: string (optional) — Token1 to spend per buy, as a decimal string in whole units (e.g. \"50\")."],"act":["gridId: string — Stable name for this grid. State is keyed by it, so the same id resumes the same grid across restarts.","chainId: integer (optional) — BNB Chain id: 56 (mainnet) or 97 (testnet).","token0: address (optional) — First token of the pair. Required only when creating the grid.","token1: address (optional) — Second token of the pair. Required only when creating the grid.","fee: integer (optional) — PancakeSwap v3 fee tier: 100, 500, 2500 or 10000.","lowerPrice: number (optional) — Bottom of the band, in whole token1 per whole token0.","upperPrice: number (optional) — Top of the band, in whole token1 per whole token0.","levels: integer (optional) — Number of grid levels, inclusive of both bounds. Spacing is geometric.","sizePerLevel: string (optional) — Token1 to spend per buy, as a decimal string in whole units (e.g. \"50\").","intentId: string — Idempotency key. The same id never executes twice.","slippageBps: integer (optional) — Slippage bound against the live quote, in basis points. [default 50]"],"state":["gridId: string — Stable name for this grid. State is keyed by it, so the same id resumes the same grid across restarts.","chainId: integer (optional) — BNB Chain id: 56 (mainnet) or 97 (testnet)."]}}}