{"protocolVersion":"0.3.0","type":"AgentCard","name":"PancakeSwap v3 Range Keeper","description":"Watches a PancakeSwap v3 liquidity position, decides whether its range still earns, and resets it when it does not. There is no atomic rebalance on v3: closing and reopening a position is decreaseLiquidity → collect → burn → mint, plus a swap when the token ratio has to move. This agent prices that whole sequence before proposing it, and executes it only inside an Altana session key scoped to the position manager and the swap router.","version":"0.1.0","url":"https://hallmark-agents.vercel.app/a2a/rebalancer","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":"Assess a v3 range","description":"Reads a PancakeSwap v3 position and its pool, decides whether the range still earns, and proposes a recentred range with the reasoning and the gas budget behind it. Read-only.","tags":["pancakeswap","v3","liquidity","rebalancing","bnb-chain","analysis","liquidity","read-only"],"examples":["Is position 2137641 still in range?","Propose a ±150 bps range for position 2137641 and tell me what moving it costs."],"inputModes":["application/json"],"outputModes":["application/json"],"inputSchema":{"type":"object","properties":{"tokenId":{"type":"string","description":"PancakeSwap v3 position NFT id, as reported by the position manager. (decimal integer string)","pattern":"^(0|[1-9][0-9]*)$"},"chainId":{"type":"integer","description":"BNB Chain id: 56 (mainnet) or 97 (testnet). Defaults to the service default.","minimum":56,"maximum":97},"widthBps":{"type":"integer","description":"Half-width of the proposed range in basis points. Omit to keep the position's current width.","minimum":1,"maximum":100000},"driftToleranceBps":{"type":"integer","description":"Rebalance proactively once the price comes within this many bps of a range edge. 0 means only act once out of range.","minimum":0,"maximum":10000},"wallet":{"type":"string","description":"Wallet whose approvals to check. Defaults to the position owner.","pattern":"^0x[0-9a-fA-F]{40}$"}},"required":["tokenId"],"additionalProperties":false}},{"id":"report","name":"Priced rebalance report","description":"Everything `analyse` returns, plus the parts that cost real work: a live QuoterV2 simulation of the exact ratio swap with its price impact, and the pool's trailing 24h APR turned into a payback period for the move. Sold over x402.","tags":["pancakeswap","v3","liquidity","rebalancing","bnb-chain","analysis","liquidity","paid","read-only"],"inputModes":["application/json"],"outputModes":["application/json"],"inputSchema":{"type":"object","properties":{"tokenId":{"type":"string","description":"PancakeSwap v3 position NFT id, as reported by the position manager. (decimal integer string)","pattern":"^(0|[1-9][0-9]*)$"},"chainId":{"type":"integer","description":"BNB Chain id: 56 (mainnet) or 97 (testnet). Defaults to the service default.","minimum":56,"maximum":97},"widthBps":{"type":"integer","description":"Half-width of the proposed range in basis points. Omit to keep the position's current width.","minimum":1,"maximum":100000},"driftToleranceBps":{"type":"integer","description":"Rebalance proactively once the price comes within this many bps of a range edge. 0 means only act once out of range.","minimum":0,"maximum":10000},"wallet":{"type":"string","description":"Wallet whose approvals to check. Defaults to the position owner.","pattern":"^0x[0-9a-fA-F]{40}$"}},"required":["tokenId"],"additionalProperties":false},"pricing":{"protocol":"x402","amountAtomic":"250000000000000000","asset":"0x55d398326f99059fF775485246999027B3197955","decimals":18,"symbol":"USDT","display":"0.25 USDT","endpoint":"https://hallmark-agents.vercel.app/x402/rebalancer/report"}},{"id":"act","name":"Reset the range","description":"Executes decreaseLiquidity → collect → burn → [swap] → mint under an Altana session key scoped to the PancakeSwap v3 position manager and swap router. Re-running with the same intentId never executes twice. A call outside the key's scope comes back as a structured refusal naming the rule that blocked it.","tags":["pancakeswap","v3","liquidity","rebalancing","bnb-chain","on-chain","liquidity","on-chain"],"inputModes":["application/json"],"outputModes":["application/json"],"inputSchema":{"type":"object","properties":{"tokenId":{"type":"string","description":"PancakeSwap v3 position NFT id, as reported by the position manager. (decimal integer string)","pattern":"^(0|[1-9][0-9]*)$"},"intentId":{"type":"string","description":"Idempotency key. The same id never executes twice; a repeat replays the recorded outcome.","minLength":4,"maxLength":128},"chainId":{"type":"integer","description":"BNB Chain id: 56 (mainnet) or 97 (testnet). Defaults to the service default.","minimum":56,"maximum":97},"widthBps":{"type":"integer","description":"Half-width of the proposed range in basis points. Omit to keep the position's current width.","minimum":1,"maximum":100000},"driftToleranceBps":{"type":"integer","description":"Rebalance proactively once the price comes within this many bps of a range edge. 0 means only act once out of range.","minimum":0,"maximum":10000},"slippageBps":{"type":"integer","description":"Slippage bound applied to every leg, in basis points.","minimum":1,"maximum":1000},"deadlineSeconds":{"type":"integer","description":"Seconds from now before the periphery calls expire.","minimum":30,"maximum":3600}},"required":["tokenId","intentId"],"additionalProperties":false}},{"id":"cycles","name":"Rebalance history","description":"Every rebalance cycle this agent has run for a position: what moved, when, the outcome, and the transaction. Repeated autonomous action is the point, so it is recorded.","tags":["pancakeswap","v3","liquidity","rebalancing","bnb-chain","history","read-only"],"inputModes":["application/json"],"outputModes":["application/json"],"inputSchema":{"type":"object","properties":{"tokenId":{"type":"string","description":"PancakeSwap v3 position NFT id, as reported by the position manager. (decimal integer string)","pattern":"^(0|[1-9][0-9]*)$"},"chainId":{"type":"integer","description":"BNB Chain id: 56 (mainnet) or 97 (testnet). Defaults to the service default.","minimum":56,"maximum":97}},"required":["tokenId"],"additionalProperties":false}}],"additionalInterfaces":[{"transport":"JSONRPC","url":"https://hallmark-agents.vercel.app/a2a/rebalancer"},{"transport":"MCP","url":"https://hallmark-agents.vercel.app/mcp/rebalancer"}],"securitySchemes":{},"security":[],"supportsAuthenticatedExtendedCard":false,"services":[{"name":"A2A","endpoint":"https://hallmark-agents.vercel.app/a2a/rebalancer","version":"0.3.0","skills":["analyse","report","act","cycles"]},{"name":"MCP","endpoint":"https://hallmark-agents.vercel.app/mcp/rebalancer","version":"2025-06-18"},{"name":"x402","endpoint":"https://hallmark-agents.vercel.app/x402/rebalancer/report","version":"1"},{"name":"web","endpoint":"https://hallmark-market.vercel.app"},{"name":"agent-card","endpoint":"https://hallmark-agents.vercel.app/rebalancer/.well-known/agent-card.json"}],"x402Support":true,"active":true,"supportedTrust":["reputation","crypto-economic"],"registrations":[],"x-hallmark":{"slug":"rebalancer","category":"rebalancing","categoryLabel":"Rebalancing — manages LP ranges, resets positions automatically","chainId":56,"chains":[56,97],"custody":"none","authorization":{"model":"altana-session-key","policyCategory":"pancake-rebalance","rationale":"Scoped to two contracts — the PancakeSwap v3 position manager and the swap router — with a per-day spend cap and an expiry. The v3 periphery routes almost everything through multicall(bytes[]), so a selector allowlist would block the ordinary path while blocking nothing an attacker would use; the contract allowlist is the bound that actually holds."},"skillInputs":{"analyse":["tokenId: uint — PancakeSwap v3 position NFT id, as reported by the position manager.","chainId: integer (optional) — BNB Chain id: 56 (mainnet) or 97 (testnet). Defaults to the service default.","widthBps: integer (optional) — Half-width of the proposed range in basis points. Omit to keep the position's current width.","driftToleranceBps: integer (optional) — Rebalance proactively once the price comes within this many bps of a range edge. 0 means only act once out of range. [default 0]","wallet: address (optional) — Wallet whose approvals to check. Defaults to the position owner."],"report":["tokenId: uint — PancakeSwap v3 position NFT id, as reported by the position manager.","chainId: integer (optional) — BNB Chain id: 56 (mainnet) or 97 (testnet). Defaults to the service default.","widthBps: integer (optional) — Half-width of the proposed range in basis points. Omit to keep the position's current width.","driftToleranceBps: integer (optional) — Rebalance proactively once the price comes within this many bps of a range edge. 0 means only act once out of range. [default 0]","wallet: address (optional) — Wallet whose approvals to check. Defaults to the position owner."],"act":["tokenId: uint — PancakeSwap v3 position NFT id, as reported by the position manager.","intentId: string — Idempotency key. The same id never executes twice; a repeat replays the recorded outcome.","chainId: integer (optional) — BNB Chain id: 56 (mainnet) or 97 (testnet). Defaults to the service default.","widthBps: integer (optional) — Half-width of the proposed range in basis points. Omit to keep the position's current width.","driftToleranceBps: integer (optional) — Rebalance proactively once the price comes within this many bps of a range edge. 0 means only act once out of range. [default 0]","slippageBps: integer (optional) — Slippage bound applied to every leg, in basis points. [default 50]","deadlineSeconds: integer (optional) — Seconds from now before the periphery calls expire. [default 600]"],"cycles":["tokenId: uint — PancakeSwap v3 position NFT id, as reported by the position manager.","chainId: integer (optional) — BNB Chain id: 56 (mainnet) or 97 (testnet). Defaults to the service default."]}}}