{"server_version":"0.53.2","catalog_revision":"2026-10-21.legacy-route-removal","catalog_digest":"3f890987fc82","protocol":"ekubo","mcp_endpoint":"https://mcp.ekubo.org/mcp/ekubo","tool_count":34,"tools":[{"name":"list_tokens","title":"List Ekubo tokens","description":"First step for symbol-based swaps, including tokenized stocks and stablecoins: list canonical Ekubo tokens by descending visibility_priority, so the preferred token wins an ambiguous symbol. Use search for a symbol prefix or suffix and min_visibility_priority to reach tokens the interface hides.","inputSchema":{"$schema":"https://json-schema.org/draft/2020-12/schema","type":"object","properties":{"chain_id":{"description":"Restrict the list to one EVM chain; omit to list tokens across every indexed chain","anyOf":[{"type":"integer","minimum":-9007199254740991,"maximum":9007199254740991},{"type":"string","pattern":"^(?:[1-9][0-9]*|0x[0-9a-fA-F]+)$"}]},"search":{"description":"Case-insensitive token symbol prefix or suffix match; omit to list the whole canonical set. Symbols only, not names or addresses","type":"string","minLength":1,"maxLength":32},"min_visibility_priority":{"description":"Lowest visibility_priority to include; defaults to 0, the interface threshold. Pass a negative value to reach tokens the interface hides","type":"integer","minimum":-100,"maximum":100},"page_size":{"description":"Maximum tokens to return; defaults to 20","type":"integer","minimum":1,"maximum":1000},"after_token":{"description":"Keep only tokens whose (chain_id, address) pair sorts after this <chain_id>:<address> identifier. Results are ordered by visibility_priority rather than by that pair, so this filters the candidate set instead of continuing a page boundary","type":"string","pattern":"^(?:[1-9][0-9]*|0x[0-9a-fA-F]+):0x[0-9a-fA-F]+$"}},"additionalProperties":false},"protocol":"ekubo","annotations":{"readOnlyHint":true,"destructiveHint":false,"idempotentHint":true,"openWorldHint":true},"outputSchema":{"$schema":"https://json-schema.org/draft/2020-12/schema","type":"object","properties":{"tokens":{"type":"array","items":{"type":"object","properties":{"chain_id":{"type":"string"}},"additionalProperties":{}}}},"required":["tokens"],"additionalProperties":{}}},{"name":"export_tokens","title":"Export Ekubo tokens for a wallet","description":"Return a token_list_reference envelope (chain ID, address, symbol, name, decimals) and its count, with no entries, so a wallet can import token names; pass it unchanged as the wallet tool's reference argument. complete=false means the export is a prefix of the chain's list. Use list_tokens to read entries yourself.","inputSchema":{"$schema":"https://json-schema.org/draft/2020-12/schema","type":"object","properties":{"chain_id":{"description":"Export only this chain; almost always pass it, since a wallet holds names for the chain it is on. Ethereum alone has about 5,600 tokens","anyOf":[{"type":"integer","minimum":-9007199254740991,"maximum":9007199254740991},{"type":"string","pattern":"^(?:[1-9][0-9]*|0x[0-9a-fA-F]+)$"}]},"max_tokens":{"description":"Defaults to 1,000, what a wallet accepts in one import; a larger export is refused whole, not truncated","type":"integer","minimum":1,"maximum":10000}},"additionalProperties":false},"protocol":"ekubo","annotations":{"readOnlyHint":true,"destructiveHint":false,"idempotentHint":true,"openWorldHint":true},"outputSchema":{"$schema":"https://json-schema.org/draft/2020-12/schema","type":"object","properties":{"token_list_reference":{"type":"object","properties":{"kind":{"type":"string","const":"artifact_reference"},"artifact_type":{"type":"string","enum":["execution_plan","read_calls","token_list","typed_data_signature_request"]},"url":{"type":"string"},"integrity":{"type":"object","properties":{"algorithm":{"type":"string","const":"keccak256"},"value":{"type":"string"}},"required":["algorithm","value"],"additionalProperties":{}},"bytes":{"type":"integer","minimum":-9007199254740991,"maximum":9007199254740991},"instruction":{"type":"string"}},"required":["kind","artifact_type","url","integrity","bytes","instruction"],"additionalProperties":{}},"count":{"type":"integer","minimum":-9007199254740991,"maximum":9007199254740991},"complete":{"type":"boolean"}},"required":["token_list_reference","count","complete"],"additionalProperties":{}}},{"name":"get_token","title":"Get an Ekubo token","description":"Fetch canonical token metadata for an exact chain and address.","inputSchema":{"$schema":"https://json-schema.org/draft/2020-12/schema","type":"object","properties":{"chain_id":{"anyOf":[{"type":"integer","minimum":-9007199254740991,"maximum":9007199254740991},{"type":"string","pattern":"^(?:[1-9][0-9]*|0x[0-9a-fA-F]+)$"}],"description":"EVM chain ID"},"address":{"type":"string","pattern":"^0x[0-9a-fA-F]+$","description":"EVM or Starknet token address"}},"required":["chain_id","address"],"additionalProperties":false},"protocol":"ekubo","annotations":{"readOnlyHint":true,"destructiveHint":false,"idempotentHint":true,"openWorldHint":true},"outputSchema":{"$schema":"https://json-schema.org/draft/2020-12/schema","type":"object","properties":{"token":{"type":"object","properties":{"chain_id":{"type":"string"}},"additionalProperties":{}}},"required":["token"],"additionalProperties":{}}},{"name":"get_tokens","title":"Get multiple Ekubo tokens","description":"Fetch canonical metadata for up to 1,000 token identifiers in one batch request, preserving input order; identifiers absent from the canonical list are omitted.","inputSchema":{"$schema":"https://json-schema.org/draft/2020-12/schema","type":"object","properties":{"tokens":{"minItems":1,"maxItems":1000,"type":"array","items":{"type":"object","properties":{"chain_id":{"anyOf":[{"type":"integer","minimum":-9007199254740991,"maximum":9007199254740991},{"type":"string","pattern":"^(?:[1-9][0-9]*|0x[0-9a-fA-F]+)$"}],"description":"EVM chain ID"},"address":{"type":"string","pattern":"^0x[0-9a-fA-F]+$","description":"EVM or Starknet token address"}},"required":["chain_id","address"],"additionalProperties":false},"description":"Entries may span chains"}},"required":["tokens"],"additionalProperties":false},"protocol":"ekubo","annotations":{"readOnlyHint":true,"destructiveHint":false,"idempotentHint":true,"openWorldHint":true},"outputSchema":{"$schema":"https://json-schema.org/draft/2020-12/schema","type":"object","properties":{"tokens":{"type":"array","items":{"type":"object","properties":{"chain_id":{"type":"string"}},"additionalProperties":{}}}},"required":["tokens"],"additionalProperties":{}}},{"name":"get_quotes_with_plans","title":"Get swap or bridge quotes with execution plans","description":"A quote, execution plan, simulation or wallet approval is not permission to trade. Robinhood Stock Tokens are tokenised debt securities subject to issuer restrictions and applicable law. Before requesting signatures or submitting approvals or trades, establish the user's relevant jurisdiction and eligibility, including location, residence or entity incorporation, US-person status under Regulation S, any person for whose account or benefit the transaction is made, and issuer Prohibited Investor restrictions. Never infer these facts from an agent or server IP. If required facts or asset-policy coverage are unknown, do not proceed. Only the user or an authorized representative of the actual investor may provide an explicit factual attestation; an agent must not attest on their behalf. A known prohibited fact cannot be overridden by attestation. An attestation is not a license, legal exemption or substitute for required screening. Keep the attestation client-side; do not send it to the quote API or MCP server. No blanket disposal exemption applies. The whole non-browser swap path for onchain swap, trade, exchange, or convert requests on supported EVM chains: one call returns every available quote (Ekubo and 0x same-chain; Across, LayerZero and LI.FI cross-chain), each carrying the execution_plan_reference that executes it. Pass the chosen option's execution.execution_plan_reference unchanged as the wallet's reference argument; there is no second preparation step. Do not call this tool again for an option it already prepared; call again only after a revert, an expiry, or a change to the request. Omit sender and slippage_bps for an indicative comparison; supply both for plans. Size slippage_bps by its own rule. Never retry reverted calldata unchanged. For an all, max, or entire-balance swap, quote the exact input-token balance from the wallet's balance tool. Simulate the chosen plan once, show the user that result, and send that same simulation. Compare options on amount_out together with native_fee, which LayerZero charges outside amount_out. Confirm LayerZero or LI.FI delivery with get_value_transfer_status. Failed providers are listed in unavailable_sources.","inputSchema":{"$schema":"https://json-schema.org/draft/2020-12/schema","type":"object","properties":{"chain_id":{"anyOf":[{"type":"integer","minimum":-9007199254740991,"maximum":9007199254740991},{"type":"string","pattern":"^(?:[1-9][0-9]*|0x[0-9a-fA-F]+)$"}],"description":"EVM chain ID"},"destination_chain_id":{"description":"Destination chain; defaults to chain_id for a same-chain swap","anyOf":[{"type":"integer","minimum":-9007199254740991,"maximum":9007199254740991},{"type":"string","pattern":"^(?:[1-9][0-9]*|0x[0-9a-fA-F]+)$"}]},"token_in":{"type":"string","pattern":"^(?:0x[0-9a-fA-F]{1,40}|eip155:[0-9]+:0x[0-9a-fA-F]{1,40})$","description":"Raw EVM address or CAIP-10 eip155:<chain_id>:<address>; all-zeroes denotes the native token"},"token_out":{"type":"string","pattern":"^(?:0x[0-9a-fA-F]{1,40}|eip155:[0-9]+:0x[0-9a-fA-F]{1,40})$","description":"Raw EVM address or CAIP-10 eip155:<chain_id>:<address>; all-zeroes denotes the native token"},"quote_type":{"type":"string","enum":["exact_input","exact_output"]},"amount":{"type":"string","pattern":"^[0-9]*[1-9][0-9]*$","description":"Base units"},"sender":{"description":"Transaction sender; pass with slippage_bps once the user has decided, so every option carries its plan","type":"string","pattern":"^0x[0-9a-fA-F]{40}$"},"recipient":{"description":"Defaults to sender","type":"string","pattern":"^0x[0-9a-fA-F]{40}$"},"slippage_bps":{"description":"Slippage bound written into the calldata, in basis points: 0.1% = 10, 0.3% = 30. Required with sender. Honor the user's preference. Otherwise keep the maximum slippage loss near one gas fee: slippage_bps ~= 10,000 * gas-cost value / swap-notional value, both in the same currency. Never use a generic 50 bps (0.5%) default, especially on Ethereum mainnet. After a slippage failure, re-quote rather than widen the bound.","type":"integer","minimum":0,"maximum":10000},"swap_deadline_minutes":{"description":"Ekubo router route deadline; default 30","type":"integer","minimum":1,"maximum":30},"include_raw_quotes":{"description":"Echo raw provider responses; only to diagnose a provider","type":"boolean"}},"required":["chain_id","token_in","token_out","quote_type","amount"],"additionalProperties":false},"protocol":"ekubo","annotations":{"readOnlyHint":true,"destructiveHint":false,"idempotentHint":false,"openWorldHint":true},"outputSchema":{"$schema":"https://json-schema.org/draft/2020-12/schema","type":"object","properties":{"jurisdiction":{"type":"object","properties":{"policy_version":{"type":"string"},"policy_digest":{"type":"string","pattern":"^[0-9a-f]{64}$"},"coverage":{"type":"string","enum":["complete","unknown"]},"execution_hold":{"type":"boolean"},"restricted_jurisdictions":{"anyOf":[{"type":"array","items":{"type":"string","pattern":"^[A-Z]{2}$"}},{"type":"null"}]},"jurisdiction_names":{"type":"object","propertyNames":{"type":"string"},"additionalProperties":{"type":"string"}},"assets":{"type":"array","items":{"type":"object","properties":{"chain_id":{"type":"string"},"token":{"type":"string"},"side":{"type":"string","enum":["sell","buy"]},"classification":{"type":"string","enum":["rhj_stock_token","non_class","unknown","out_of_scope"]},"provenance":{"type":"array","items":{"type":"object","properties":{"source":{"type":"string"},"ref":{"type":"string"},"observed_at":{"type":"string"}},"required":["source","ref","observed_at"],"additionalProperties":false}},"restricted_jurisdictions":{"anyOf":[{"type":"array","items":{"type":"string","pattern":"^[A-Z]{2}$"}},{"type":"null"}]},"offering_exclusions":{"anyOf":[{"type":"array","items":{"type":"string","pattern":"^[A-Z]{2}$"}},{"type":"null"}]},"issuer_prohibited_investor":{"anyOf":[{"type":"array","items":{"type":"string","pattern":"^[A-Z]{2}$"}},{"type":"null"}]},"execution_hold":{"type":"boolean"}},"required":["chain_id","token","side","classification","provenance","restricted_jurisdictions","offering_exclusions","issuer_prohibited_investor","execution_hold"],"additionalProperties":false}},"execution_notice":{"type":["string","null"]}},"required":["policy_version","policy_digest","coverage","execution_hold","restricted_jurisdictions","jurisdiction_names","assets","execution_notice"],"additionalProperties":false,"x-catalog-summary":"jurisdiction metadata (ekubo-token-jurisdictions-v2): coverage, execution_hold, restricted_jurisdictions, per-asset classification"},"quotes":{"type":"array","items":{"type":"object","properties":{"jurisdiction":{"type":"object","properties":{"policy_version":{"type":"string"},"policy_digest":{"type":"string","pattern":"^[0-9a-f]{64}$"},"coverage":{"type":"string","enum":["complete","unknown"]},"execution_hold":{"type":"boolean"},"restricted_jurisdictions":{"anyOf":[{"type":"array","items":{"type":"string","pattern":"^[A-Z]{2}$"}},{"type":"null"}]},"jurisdiction_names":{"type":"object","propertyNames":{"type":"string"},"additionalProperties":{"type":"string"}},"assets":{"type":"array","items":{"type":"object","properties":{"chain_id":{"type":"string"},"token":{"type":"string"},"side":{"type":"string","enum":["sell","buy"]},"classification":{"type":"string","enum":["rhj_stock_token","non_class","unknown","out_of_scope"]},"provenance":{"type":"array","items":{"type":"object","properties":{"source":{"type":"string"},"ref":{"type":"string"},"observed_at":{"type":"string"}},"required":["source","ref","observed_at"],"additionalProperties":false}},"restricted_jurisdictions":{"anyOf":[{"type":"array","items":{"type":"string","pattern":"^[A-Z]{2}$"}},{"type":"null"}]},"offering_exclusions":{"anyOf":[{"type":"array","items":{"type":"string","pattern":"^[A-Z]{2}$"}},{"type":"null"}]},"issuer_prohibited_investor":{"anyOf":[{"type":"array","items":{"type":"string","pattern":"^[A-Z]{2}$"}},{"type":"null"}]},"execution_hold":{"type":"boolean"}},"required":["chain_id","token","side","classification","provenance","restricted_jurisdictions","offering_exclusions","issuer_prohibited_investor","execution_hold"],"additionalProperties":false}},"execution_notice":{"type":["string","null"]}},"required":["policy_version","policy_digest","coverage","execution_hold","restricted_jurisdictions","jurisdiction_names","assets","execution_notice"],"additionalProperties":false,"x-catalog-summary":"jurisdiction metadata (ekubo-token-jurisdictions-v2): coverage, execution_hold, restricted_jurisdictions, per-asset classification"},"execution":{"anyOf":[{"type":"object","properties":{"jurisdiction":{"type":"object","properties":{"policy_version":{"type":"string"},"policy_digest":{"type":"string","pattern":"^[0-9a-f]{64}$"},"coverage":{"type":"string","enum":["complete","unknown"]},"execution_hold":{"type":"boolean"},"restricted_jurisdictions":{"anyOf":[{"type":"array","items":{"type":"string","pattern":"^[A-Z]{2}$"}},{"type":"null"}]},"jurisdiction_names":{"type":"object","propertyNames":{"type":"string"},"additionalProperties":{"type":"string"}},"assets":{"type":"array","items":{"type":"object","properties":{"chain_id":{"type":"string"},"token":{"type":"string"},"side":{"type":"string","enum":["sell","buy"]},"classification":{"type":"string","enum":["rhj_stock_token","non_class","unknown","out_of_scope"]},"provenance":{"type":"array","items":{"type":"object","properties":{"source":{"type":"string"},"ref":{"type":"string"},"observed_at":{"type":"string"}},"required":["source","ref","observed_at"],"additionalProperties":false}},"restricted_jurisdictions":{"anyOf":[{"type":"array","items":{"type":"string","pattern":"^[A-Z]{2}$"}},{"type":"null"}]},"offering_exclusions":{"anyOf":[{"type":"array","items":{"type":"string","pattern":"^[A-Z]{2}$"}},{"type":"null"}]},"issuer_prohibited_investor":{"anyOf":[{"type":"array","items":{"type":"string","pattern":"^[A-Z]{2}$"}},{"type":"null"}]},"execution_hold":{"type":"boolean"}},"required":["chain_id","token","side","classification","provenance","restricted_jurisdictions","offering_exclusions","issuer_prohibited_investor","execution_hold"],"additionalProperties":false}},"execution_notice":{"type":["string","null"]}},"required":["policy_version","policy_digest","coverage","execution_hold","restricted_jurisdictions","jurisdiction_names","assets","execution_notice"],"additionalProperties":false,"x-catalog-summary":"jurisdiction metadata (ekubo-token-jurisdictions-v2): coverage, execution_hold, restricted_jurisdictions, per-asset classification"},"execution_plan_reference":{"type":"object","properties":{"kind":{"type":"string","const":"artifact_reference"},"artifact_type":{"type":"string","enum":["execution_plan","read_calls","token_list","typed_data_signature_request"]},"url":{"type":"string"},"integrity":{"type":"object","properties":{"algorithm":{"type":"string","const":"keccak256"},"value":{"type":"string"}},"required":["algorithm","value"],"additionalProperties":{}},"bytes":{"type":"integer","minimum":-9007199254740991,"maximum":9007199254740991},"instruction":{"type":"string"}},"required":["kind","artifact_type","url","integrity","bytes","instruction"],"additionalProperties":{}}},"required":["jurisdiction"],"additionalProperties":{}},{"type":"null"}]}},"required":["jurisdiction"],"additionalProperties":{}}}},"required":["jurisdiction"],"additionalProperties":{}}},{"name":"get_value_transfer_status","title":"Track a LayerZero or LI.FI cross-chain transfer","description":"Report whether an executed LayerZero or LI.FI transfer has been delivered; its origin receipt alone does not mean the user has the funds. Poll every 15 to 30 seconds while settled is false (it draws on the quote budget). UNKNOWN or NOT_FOUND right after submission usually means not yet indexed. For LI.FI, read substatus: REFUNDED and PARTIAL report as status DONE. Across transfers are not tracked here.","inputSchema":{"$schema":"https://json-schema.org/draft/2020-12/schema","type":"object","properties":{"source":{"description":"The executed quote's source; defaults to layerzero","type":"string","enum":["layerzero","lifi"]},"quote_id":{"description":"The executed option's provider_quote_id; required for layerzero","type":"string","minLength":1,"maxLength":256},"transaction_hash":{"description":"Origin transaction hash; required for lifi, and pass it for layerzero once known (some routes need it)","type":"string","pattern":"^0x[0-9a-fA-F]{64}$"},"origin_chain_id":{"description":"Origin chain; lifi only, narrows the lookup","anyOf":[{"type":"integer","minimum":-9007199254740991,"maximum":9007199254740991},{"type":"string","pattern":"^(?:[1-9][0-9]*|0x[0-9a-fA-F]+)$"}]},"destination_chain_id":{"description":"Destination chain; lifi only","anyOf":[{"type":"integer","minimum":-9007199254740991,"maximum":9007199254740991},{"type":"string","pattern":"^(?:[1-9][0-9]*|0x[0-9a-fA-F]+)$"}]}},"additionalProperties":false},"protocol":"ekubo","annotations":{"readOnlyHint":true,"destructiveHint":false,"idempotentHint":true,"openWorldHint":true},"outputSchema":{"$schema":"https://json-schema.org/draft/2020-12/schema","type":"object","properties":{"source":{"type":"string","enum":["layerzero","lifi"]},"source_url":{"type":"string"},"quote_id":{"type":["string","null"]},"origin_transaction_hash":{"type":["string","null"]},"status":{"type":"string"},"substatus":{"type":["string","null"]},"substatus_message":{"type":["string","null"]},"settled":{"type":"boolean"},"explorer_url":{"type":["string","null"]},"execution_history":{"type":"array","items":{"type":"object","propertyNames":{"type":"string"},"additionalProperties":{}}},"polling":{"type":"object","properties":{"settled":{"type":"boolean"},"instruction":{"type":"string"}},"required":["settled","instruction"],"additionalProperties":{}}},"required":["source","source_url","quote_id","origin_transaction_hash","status","substatus","substatus_message","settled","explorer_url","execution_history","polling"],"additionalProperties":{}}},{"name":"prepare_ve33_vote","title":"Prepare one ve(3,3) NFT vote change","description":"Compile one actively voted ve-token into multiple allocations. Unconditionally claims its current pool first, then splits and changes votes in one atomic batch of decodable VeToken steps. Nothing is burned, withdrawn, or transferred: the source keeps a stake and every additional allocation is a newly minted NFT with the same lock end. Prefer the portfolio reallocation workflow for complete state validation.","inputSchema":{"$schema":"https://json-schema.org/draft/2020-12/schema","type":"object","properties":{"chain_id":{"anyOf":[{"type":"integer","minimum":-9007199254740991,"maximum":9007199254740991},{"type":"string","pattern":"^(?:[1-9][0-9]*|0x[0-9a-fA-F]+)$"}],"description":"With ve_token, from get_ve33_allocations (STONX: 4663), not the wallet's chain"},"ve_token":{"type":"string","pattern":"^0x[0-9a-fA-F]{40}$"},"sender":{"type":"string","pattern":"^0x[0-9a-fA-F]{40}$"},"source_ve_id":{"type":"string","pattern":"^(?:0|[1-9][0-9]*)$"},"source_amount":{"type":"string","pattern":"^[0-9]*[1-9][0-9]*$","description":"Base units"},"current_vote":{"type":"object","properties":{"pool_key_id":{"type":"string","minLength":1},"pool_key":{"type":"object","properties":{"token0":{"type":"string","pattern":"^0x[0-9a-fA-F]{1,40}$"},"token1":{"type":"string","pattern":"^0x[0-9a-fA-F]{1,40}$"},"config":{"type":"string","pattern":"^0x[0-9a-fA-F]{64}$"},"fee":{"type":"string","pattern":"^(?:(?:0|[1-9][0-9]*)|0x[0-9a-fA-F]+)$"},"tick_spacing":{"anyOf":[{"anyOf":[{"type":"integer","minimum":0,"maximum":9007199254740991},{"type":"string","pattern":"^(?:(?:0|[1-9][0-9]*)|0x[0-9a-fA-F]+)$"}]},{"type":"null"}]},"extension":{"type":"string","pattern":"^0x[0-9a-fA-F]{1,40}$"},"stableswap_params":{"anyOf":[{"type":"object","properties":{"center_tick":{"type":"integer","minimum":-9007199254740991,"maximum":9007199254740991},"amplification":{"type":"integer","minimum":0,"maximum":127}},"required":["center_tick","amplification"],"additionalProperties":false},{"type":"null"}]}},"required":["token0","token1"],"additionalProperties":false,"x-catalog-summary":"PoolKey {token0, token1, config} or {token0, token1, fee, tick_spacing, extension, stableswap_params?}, as read from the pool or vote"},"swap_fee":{"type":"string","pattern":"^(?:0|[1-9][0-9]*)$"}},"required":["pool_key_id","pool_key"],"additionalProperties":false,"description":"Required active indexed vote; its pool is claimed unconditionally before any split, clear, or replacement vote"},"allocations":{"minItems":1,"maxItems":100,"type":"array","items":{"type":"object","properties":{"pool_key_id":{"type":"string","minLength":1},"pool_key":{"type":"object","properties":{"token0":{"type":"string","pattern":"^0x[0-9a-fA-F]{1,40}$"},"token1":{"type":"string","pattern":"^0x[0-9a-fA-F]{1,40}$"},"config":{"type":"string","pattern":"^0x[0-9a-fA-F]{64}$"},"fee":{"type":"string","pattern":"^(?:(?:0|[1-9][0-9]*)|0x[0-9a-fA-F]+)$"},"tick_spacing":{"anyOf":[{"anyOf":[{"type":"integer","minimum":0,"maximum":9007199254740991},{"type":"string","pattern":"^(?:(?:0|[1-9][0-9]*)|0x[0-9a-fA-F]+)$"}]},{"type":"null"}]},"extension":{"type":"string","pattern":"^0x[0-9a-fA-F]{1,40}$"},"stableswap_params":{"anyOf":[{"type":"object","properties":{"center_tick":{"type":"integer","minimum":-9007199254740991,"maximum":9007199254740991},"amplification":{"type":"integer","minimum":0,"maximum":127}},"required":["center_tick","amplification"],"additionalProperties":false},{"type":"null"}]}},"required":["token0","token1"],"additionalProperties":false,"x-catalog-summary":"PoolKey {token0, token1, config} or {token0, token1, fee, tick_spacing, extension, stableswap_params?}, as read from the pool or vote"},"swap_fee":{"type":"string","pattern":"^(?:0|[1-9][0-9]*)$"},"permille":{"type":"integer","minimum":1,"maximum":1000}},"required":["pool_key_id","pool_key","swap_fee","permille"],"additionalProperties":false}},"unallocated_permille":{"type":"integer","minimum":0,"maximum":1000},"salt_nonce":{"type":"string","pattern":"^0x[0-9a-fA-F]{64}$","description":"User-selected nonce used to derive deterministic, replay-detectable split salts"}},"required":["chain_id","ve_token","sender","source_ve_id","source_amount","current_vote","allocations","unallocated_permille","salt_nonce"],"additionalProperties":false},"protocol":"ekubo","annotations":{"readOnlyHint":true,"destructiveHint":false,"idempotentHint":false,"openWorldHint":true},"outputSchema":{"$schema":"https://json-schema.org/draft/2020-12/schema","type":"object","properties":{"execution_plan_reference":{"type":"object","properties":{"kind":{"type":"string","const":"artifact_reference"},"artifact_type":{"type":"string","enum":["execution_plan","read_calls","token_list","typed_data_signature_request"]},"url":{"type":"string"},"integrity":{"type":"object","properties":{"algorithm":{"type":"string","const":"keccak256"},"value":{"type":"string"}},"required":["algorithm","value"],"additionalProperties":{}},"bytes":{"type":"integer","minimum":-9007199254740991,"maximum":9007199254740991},"instruction":{"type":"string"}},"required":["kind","artifact_type","url","integrity","bytes","instruction"],"additionalProperties":{}}},"additionalProperties":{}}},{"name":"prepare_ve33_extend","title":"Prepare a ve-token extension","description":"Prepare a direct extension for an unvoted VeToken or an atomic claim-and-extend call when current_pool_key identifies an active vote, so pending voter fees are preserved. Extending moves the stake to a later end time and clears its vote — that is why the claim is compounded into the same call. A stake's end time only ever moves later, here and everywhere else in Ve33. No NFT is burned and no stake leaves the wallet; re-vote afterwards with prepare_ve33_vote. max_duration=true must be the user's explicit choice.","inputSchema":{"$schema":"https://json-schema.org/draft/2020-12/schema","type":"object","properties":{"chain_id":{"anyOf":[{"type":"integer","minimum":-9007199254740991,"maximum":9007199254740991},{"type":"string","pattern":"^(?:[1-9][0-9]*|0x[0-9a-fA-F]+)$"}],"description":"With ve_token, from get_ve33_allocations (STONX: 4663), not the wallet's chain"},"ve_token":{"type":"string","pattern":"^0x[0-9a-fA-F]{40}$"},"sender":{"type":"string","pattern":"^0x[0-9a-fA-F]{40}$"},"ve_id":{"type":"string","pattern":"^(?:0|[1-9][0-9]*)$"},"duration_seconds":{"type":"integer","minimum":1,"maximum":4294967295},"max_duration":{"default":false,"type":"boolean"},"current_pool_key":{"description":"Active pool key when voted; the MCP claims fees atomically before extension. Omit only for an unvoted VeToken.","type":"object","properties":{"token0":{"type":"string","pattern":"^0x[0-9a-fA-F]{1,40}$"},"token1":{"type":"string","pattern":"^0x[0-9a-fA-F]{1,40}$"},"config":{"type":"string","pattern":"^0x[0-9a-fA-F]{64}$"},"fee":{"type":"string","pattern":"^(?:(?:0|[1-9][0-9]*)|0x[0-9a-fA-F]+)$"},"tick_spacing":{"anyOf":[{"anyOf":[{"type":"integer","minimum":0,"maximum":9007199254740991},{"type":"string","pattern":"^(?:(?:0|[1-9][0-9]*)|0x[0-9a-fA-F]+)$"}]},{"type":"null"}]},"extension":{"type":"string","pattern":"^0x[0-9a-fA-F]{1,40}$"},"stableswap_params":{"anyOf":[{"type":"object","properties":{"center_tick":{"type":"integer","minimum":-9007199254740991,"maximum":9007199254740991},"amplification":{"type":"integer","minimum":0,"maximum":127}},"required":["center_tick","amplification"],"additionalProperties":false},{"type":"null"}]}},"required":["token0","token1"],"additionalProperties":false,"x-catalog-summary":"PoolKey {token0, token1, config} or {token0, token1, fee, tick_spacing, extension, stableswap_params?}, as read from the pool or vote"}},"required":["chain_id","ve_token","sender","ve_id","max_duration"],"additionalProperties":false},"protocol":"ekubo","annotations":{"readOnlyHint":true,"destructiveHint":false,"idempotentHint":false,"openWorldHint":true},"outputSchema":{"$schema":"https://json-schema.org/draft/2020-12/schema","type":"object","properties":{"execution_plan_reference":{"type":"object","properties":{"kind":{"type":"string","const":"artifact_reference"},"artifact_type":{"type":"string","enum":["execution_plan","read_calls","token_list","typed_data_signature_request"]},"url":{"type":"string"},"integrity":{"type":"object","properties":{"algorithm":{"type":"string","const":"keccak256"},"value":{"type":"string"}},"required":["algorithm","value"],"additionalProperties":{}},"bytes":{"type":"integer","minimum":-9007199254740991,"maximum":9007199254740991},"instruction":{"type":"string"}},"required":["kind","artifact_type","url","integrity","bytes","instruction"],"additionalProperties":{}}},"additionalProperties":{}}},{"name":"prepare_ve33_stake","title":"Prepare a new ve-token stake","description":"Create a new VeToken stake with an exact stake-token approval. Max duration is the safe default for new stakes; an explicit shorter duration is optional and no existing NFT, vote, fee balance, or ownership is changed.","inputSchema":{"$schema":"https://json-schema.org/draft/2020-12/schema","type":"object","properties":{"chain_id":{"anyOf":[{"type":"integer","minimum":-9007199254740991,"maximum":9007199254740991},{"type":"string","pattern":"^(?:[1-9][0-9]*|0x[0-9a-fA-F]+)$"}],"description":"With ve_token, from get_ve33_allocations (STONX: 4663), not the wallet's chain"},"ve_token":{"type":"string","pattern":"^0x[0-9a-fA-F]{40}$"},"sender":{"type":"string","pattern":"^0x[0-9a-fA-F]{40}$"},"stake_token":{"type":"string","pattern":"^0x[0-9a-fA-F]{40}$"},"amount":{"type":"string","pattern":"^[0-9]*[1-9][0-9]*$","description":"Base units"},"salt":{"type":"string","pattern":"^0x[0-9a-fA-F]{64}$","description":"User-selected salt for a deterministic, replay-detectable VeToken ID"},"duration_seconds":{"type":"integer","minimum":1,"maximum":4294967295},"max_duration":{"description":"Defaults to true when duration_seconds is omitted; set false only with an explicit duration_seconds","type":"boolean"}},"required":["chain_id","ve_token","sender","stake_token","amount","salt"],"additionalProperties":false},"protocol":"ekubo","annotations":{"readOnlyHint":true,"destructiveHint":false,"idempotentHint":false,"openWorldHint":true},"outputSchema":{"$schema":"https://json-schema.org/draft/2020-12/schema","type":"object","properties":{"execution_plan_reference":{"type":"object","properties":{"kind":{"type":"string","const":"artifact_reference"},"artifact_type":{"type":"string","enum":["execution_plan","read_calls","token_list","typed_data_signature_request"]},"url":{"type":"string"},"integrity":{"type":"object","properties":{"algorithm":{"type":"string","const":"keccak256"},"value":{"type":"string"}},"required":["algorithm","value"],"additionalProperties":{}},"bytes":{"type":"integer","minimum":-9007199254740991,"maximum":9007199254740991},"instruction":{"type":"string"}},"required":["kind","artifact_type","url","integrity","bytes","instruction"],"additionalProperties":{}}},"additionalProperties":{}}},{"name":"prepare_ve33_split","title":"Prepare a ve-token split","description":"Split a source ve-token with an explicit salt and return the deterministic child token ID; the source vote is preserved with reduced weight and the child starts unvoted with the same lock end. Non-destructive: no stake leaves the wallet, no NFT is burned, no vote is cleared, and no fees are discarded.","inputSchema":{"$schema":"https://json-schema.org/draft/2020-12/schema","type":"object","properties":{"chain_id":{"anyOf":[{"type":"integer","minimum":-9007199254740991,"maximum":9007199254740991},{"type":"string","pattern":"^(?:[1-9][0-9]*|0x[0-9a-fA-F]+)$"}],"description":"With ve_token, from get_ve33_allocations (STONX: 4663), not the wallet's chain"},"ve_token":{"type":"string","pattern":"^0x[0-9a-fA-F]{40}$"},"sender":{"type":"string","pattern":"^0x[0-9a-fA-F]{40}$"},"ve_id":{"type":"string","pattern":"^(?:0|[1-9][0-9]*)$"},"amount":{"type":"string","pattern":"^[0-9]*[1-9][0-9]*$","description":"Base units"},"salt":{"type":"string","pattern":"^0x[0-9a-fA-F]{64}$"}},"required":["chain_id","ve_token","sender","ve_id","amount","salt"],"additionalProperties":false},"protocol":"ekubo","annotations":{"readOnlyHint":true,"destructiveHint":false,"idempotentHint":false,"openWorldHint":true},"outputSchema":{"$schema":"https://json-schema.org/draft/2020-12/schema","type":"object","properties":{"execution_plan_reference":{"type":"object","properties":{"kind":{"type":"string","const":"artifact_reference"},"artifact_type":{"type":"string","enum":["execution_plan","read_calls","token_list","typed_data_signature_request"]},"url":{"type":"string"},"integrity":{"type":"object","properties":{"algorithm":{"type":"string","const":"keccak256"},"value":{"type":"string"}},"required":["algorithm","value"],"additionalProperties":{}},"bytes":{"type":"integer","minimum":-9007199254740991,"maximum":9007199254740991},"instruction":{"type":"string"}},"required":["kind","artifact_type","url","integrity","bytes","instruction"],"additionalProperties":{}}},"additionalProperties":{}}},{"name":"prepare_ve33_claim_fees","title":"Prepare ve-token fee claims","description":"Generate one call, or an atomic batch of decodable VeToken steps, claiming voter fees from one or more ve-tokens. Fees only: votes, stake amounts, lock ends, and NFT ownership are all unchanged, so this is always safe to run before any other ve(3,3) action.","inputSchema":{"$schema":"https://json-schema.org/draft/2020-12/schema","type":"object","properties":{"chain_id":{"anyOf":[{"type":"integer","minimum":-9007199254740991,"maximum":9007199254740991},{"type":"string","pattern":"^(?:[1-9][0-9]*|0x[0-9a-fA-F]+)$"}],"description":"With ve_token, from get_ve33_allocations (STONX: 4663), not the wallet's chain"},"ve_token":{"type":"string","pattern":"^0x[0-9a-fA-F]{40}$"},"sender":{"type":"string","pattern":"^0x[0-9a-fA-F]{40}$"},"recipient":{"type":"string","pattern":"^0x[0-9a-fA-F]{40}$"},"claims":{"minItems":1,"maxItems":100,"type":"array","items":{"type":"object","properties":{"ve_id":{"type":"string","pattern":"^(?:0|[1-9][0-9]*)$"},"pool_key":{"type":"object","properties":{"token0":{"type":"string","pattern":"^0x[0-9a-fA-F]{1,40}$"},"token1":{"type":"string","pattern":"^0x[0-9a-fA-F]{1,40}$"},"config":{"type":"string","pattern":"^0x[0-9a-fA-F]{64}$"},"fee":{"type":"string","pattern":"^(?:(?:0|[1-9][0-9]*)|0x[0-9a-fA-F]+)$"},"tick_spacing":{"anyOf":[{"anyOf":[{"type":"integer","minimum":0,"maximum":9007199254740991},{"type":"string","pattern":"^(?:(?:0|[1-9][0-9]*)|0x[0-9a-fA-F]+)$"}]},{"type":"null"}]},"extension":{"type":"string","pattern":"^0x[0-9a-fA-F]{1,40}$"},"stableswap_params":{"anyOf":[{"type":"object","properties":{"center_tick":{"type":"integer","minimum":-9007199254740991,"maximum":9007199254740991},"amplification":{"type":"integer","minimum":0,"maximum":127}},"required":["center_tick","amplification"],"additionalProperties":false},{"type":"null"}]}},"required":["token0","token1"],"additionalProperties":false,"x-catalog-summary":"PoolKey {token0, token1, config} or {token0, token1, fee, tick_spacing, extension, stableswap_params?}, as read from the pool or vote"}},"required":["ve_id","pool_key"],"additionalProperties":false}}},"required":["chain_id","ve_token","sender","claims"],"additionalProperties":false},"protocol":"ekubo","annotations":{"readOnlyHint":true,"destructiveHint":false,"idempotentHint":false,"openWorldHint":true},"outputSchema":{"$schema":"https://json-schema.org/draft/2020-12/schema","type":"object","properties":{"execution_plan_reference":{"type":"object","properties":{"kind":{"type":"string","const":"artifact_reference"},"artifact_type":{"type":"string","enum":["execution_plan","read_calls","token_list","typed_data_signature_request"]},"url":{"type":"string"},"integrity":{"type":"object","properties":{"algorithm":{"type":"string","const":"keccak256"},"value":{"type":"string"}},"required":["algorithm","value"],"additionalProperties":{}},"bytes":{"type":"integer","minimum":-9007199254740991,"maximum":9007199254740991},"instruction":{"type":"string"}},"required":["kind","artifact_type","url","integrity","bytes","instruction"],"additionalProperties":{}}},"additionalProperties":{}}},{"name":"prepare_ve33_reinvest","title":"Prepare ve-token fee reinvestment","description":"Build the safe phased workflow for 'reinvest my fees': automatically claim all active voter fees, prepare one exact-input swap per claimed non-stake token, then increase one VeToken or every existing active allocation without changing ownership or replacing votes. phase=swap returns jurisdiction metadata inline on the result and on every child swap; it is not permission to trade. For a nonempty restricted_jurisdictions list, follow its execution_notice before requesting any signature. Phases run in order after each confirms: claim (omit claims to discover every active allocation; keep the pre-claim balance snapshots), swap with only the exact claimed deltas, never a pre-existing balance, then stake_all with the refreshed state_id and the measured STONX output.","inputSchema":{"$schema":"https://json-schema.org/draft/2020-12/schema","type":"object","properties":{"phase":{"type":"string","enum":["claim","swap","stake","stake_all"]},"chain_id":{"anyOf":[{"type":"integer","minimum":-9007199254740991,"maximum":9007199254740991},{"type":"string","pattern":"^(?:[1-9][0-9]*|0x[0-9a-fA-F]+)$"}],"description":"With ve_token, from get_ve33_allocations (STONX: 4663), not the wallet's chain"},"ve_token":{"type":"string","pattern":"^0x[0-9a-fA-F]{40}$"},"sender":{"type":"string","pattern":"^0x[0-9a-fA-F]{40}$"},"claims":{"minItems":1,"maxItems":100,"type":"array","items":{"type":"object","properties":{"ve_id":{"type":"string","pattern":"^(?:0|[1-9][0-9]*)$"},"pool_key":{"type":"object","properties":{"token0":{"type":"string","pattern":"^0x[0-9a-fA-F]{1,40}$"},"token1":{"type":"string","pattern":"^0x[0-9a-fA-F]{1,40}$"},"config":{"type":"string","pattern":"^0x[0-9a-fA-F]{64}$"},"fee":{"type":"string","pattern":"^(?:(?:0|[1-9][0-9]*)|0x[0-9a-fA-F]+)$"},"tick_spacing":{"anyOf":[{"anyOf":[{"type":"integer","minimum":0,"maximum":9007199254740991},{"type":"string","pattern":"^(?:(?:0|[1-9][0-9]*)|0x[0-9a-fA-F]+)$"}]},{"type":"null"}]},"extension":{"type":"string","pattern":"^0x[0-9a-fA-F]{1,40}$"},"stableswap_params":{"anyOf":[{"type":"object","properties":{"center_tick":{"type":"integer","minimum":-9007199254740991,"maximum":9007199254740991},"amplification":{"type":"integer","minimum":0,"maximum":127}},"required":["center_tick","amplification"],"additionalProperties":false},{"type":"null"}]}},"required":["token0","token1"],"additionalProperties":false,"x-catalog-summary":"PoolKey {token0, token1, config} or {token0, token1, fee, tick_spacing, extension, stableswap_params?}, as read from the pool or vote"}},"required":["ve_id","pool_key"],"additionalProperties":false}},"stake_token":{"type":"string","pattern":"^0x[0-9a-fA-F]{40}$"},"fee_balances":{"minItems":1,"maxItems":200,"type":"array","items":{"type":"object","properties":{"token":{"type":"string","pattern":"^0x[0-9a-fA-F]{40}$"},"amount":{"type":"string","pattern":"^(?:0|[1-9][0-9]*)$","description":"Base units"}},"required":["token","amount"],"additionalProperties":false}},"slippage_bps":{"default":50,"type":"integer","minimum":0,"maximum":10000},"swap_deadline_minutes":{"description":"Ekubo router route deadline; default 30","type":"integer","minimum":1,"maximum":30},"source":{"type":"string","enum":["ekubo","0x","across","layerzero","lifi"]},"ve_id":{"type":"string","pattern":"^(?:0|[1-9][0-9]*)$"},"amount":{"description":"Stake token base units","type":"string","pattern":"^(?:0|[1-9][0-9]*)$"},"current_state_id":{"type":"string","pattern":"^0x[0-9a-fA-F]{64}$"}},"required":["phase","chain_id","ve_token","sender","slippage_bps"],"additionalProperties":false},"protocol":"ekubo","annotations":{"readOnlyHint":true,"destructiveHint":false,"idempotentHint":false,"openWorldHint":true},"outputSchema":{"$schema":"https://json-schema.org/draft/2020-12/schema","type":"object","properties":{"phase":{"type":"string","enum":["claim","swap","stake_all","stake"]},"jurisdiction":{"type":"object","properties":{"policy_version":{"type":"string"},"policy_digest":{"type":"string","pattern":"^[0-9a-f]{64}$"},"coverage":{"type":"string","enum":["complete","unknown"]},"execution_hold":{"type":"boolean"},"restricted_jurisdictions":{"anyOf":[{"type":"array","items":{"type":"string","pattern":"^[A-Z]{2}$"}},{"type":"null"}]},"jurisdiction_names":{"type":"object","propertyNames":{"type":"string"},"additionalProperties":{"type":"string"}},"assets":{"type":"array","items":{"type":"object","properties":{"chain_id":{"type":"string"},"token":{"type":"string"},"side":{"type":"string","enum":["sell","buy"]},"classification":{"type":"string","enum":["rhj_stock_token","non_class","unknown","out_of_scope"]},"provenance":{"type":"array","items":{"type":"object","properties":{"source":{"type":"string"},"ref":{"type":"string"},"observed_at":{"type":"string"}},"required":["source","ref","observed_at"],"additionalProperties":false}},"restricted_jurisdictions":{"anyOf":[{"type":"array","items":{"type":"string","pattern":"^[A-Z]{2}$"}},{"type":"null"}]},"offering_exclusions":{"anyOf":[{"type":"array","items":{"type":"string","pattern":"^[A-Z]{2}$"}},{"type":"null"}]},"issuer_prohibited_investor":{"anyOf":[{"type":"array","items":{"type":"string","pattern":"^[A-Z]{2}$"}},{"type":"null"}]},"execution_hold":{"type":"boolean"}},"required":["chain_id","token","side","classification","provenance","restricted_jurisdictions","offering_exclusions","issuer_prohibited_investor","execution_hold"],"additionalProperties":false}},"execution_notice":{"type":["string","null"]}},"required":["policy_version","policy_digest","coverage","execution_hold","restricted_jurisdictions","jurisdiction_names","assets","execution_notice"],"additionalProperties":false,"x-catalog-summary":"jurisdiction metadata (ekubo-token-jurisdictions-v2): coverage, execution_hold, restricted_jurisdictions, per-asset classification"},"exact_input_full_balance_swaps":{"type":"array","items":{"type":"object","properties":{"jurisdiction":{"type":"object","properties":{"policy_version":{"type":"string"},"policy_digest":{"type":"string","pattern":"^[0-9a-f]{64}$"},"coverage":{"type":"string","enum":["complete","unknown"]},"execution_hold":{"type":"boolean"},"restricted_jurisdictions":{"anyOf":[{"type":"array","items":{"type":"string","pattern":"^[A-Z]{2}$"}},{"type":"null"}]},"jurisdiction_names":{"type":"object","propertyNames":{"type":"string"},"additionalProperties":{"type":"string"}},"assets":{"type":"array","items":{"type":"object","properties":{"chain_id":{"type":"string"},"token":{"type":"string"},"side":{"type":"string","enum":["sell","buy"]},"classification":{"type":"string","enum":["rhj_stock_token","non_class","unknown","out_of_scope"]},"provenance":{"type":"array","items":{"type":"object","properties":{"source":{"type":"string"},"ref":{"type":"string"},"observed_at":{"type":"string"}},"required":["source","ref","observed_at"],"additionalProperties":false}},"restricted_jurisdictions":{"anyOf":[{"type":"array","items":{"type":"string","pattern":"^[A-Z]{2}$"}},{"type":"null"}]},"offering_exclusions":{"anyOf":[{"type":"array","items":{"type":"string","pattern":"^[A-Z]{2}$"}},{"type":"null"}]},"issuer_prohibited_investor":{"anyOf":[{"type":"array","items":{"type":"string","pattern":"^[A-Z]{2}$"}},{"type":"null"}]},"execution_hold":{"type":"boolean"}},"required":["chain_id","token","side","classification","provenance","restricted_jurisdictions","offering_exclusions","issuer_prohibited_investor","execution_hold"],"additionalProperties":false}},"execution_notice":{"type":["string","null"]}},"required":["policy_version","policy_digest","coverage","execution_hold","restricted_jurisdictions","jurisdiction_names","assets","execution_notice"],"additionalProperties":false,"x-catalog-summary":"jurisdiction metadata (ekubo-token-jurisdictions-v2): coverage, execution_hold, restricted_jurisdictions, per-asset classification"},"execution_plan_reference":{"type":"object","properties":{"kind":{"type":"string","const":"artifact_reference"},"artifact_type":{"type":"string","enum":["execution_plan","read_calls","token_list","typed_data_signature_request"]},"url":{"type":"string"},"integrity":{"type":"object","properties":{"algorithm":{"type":"string","const":"keccak256"},"value":{"type":"string"}},"required":["algorithm","value"],"additionalProperties":{}},"bytes":{"type":"integer","minimum":-9007199254740991,"maximum":9007199254740991},"instruction":{"type":"string"}},"required":["kind","artifact_type","url","integrity","bytes","instruction"],"additionalProperties":{}}},"required":["jurisdiction"],"additionalProperties":{}}}},"additionalProperties":{}}},{"name":"prepare_ve33_claim_all_fees","title":"Prepare all ve-token fee claims","description":"Discover every active vote on VeTokens owned by the sender and generate one atomic batch of decodable VeToken steps claiming all indexed pool fees, with ownerOf and voteState validation calldata. Fees only: votes, stake amounts, lock ends, and NFT ownership are all unchanged.","inputSchema":{"$schema":"https://json-schema.org/draft/2020-12/schema","type":"object","properties":{"chain_id":{"anyOf":[{"type":"integer","minimum":-9007199254740991,"maximum":9007199254740991},{"type":"string","pattern":"^(?:[1-9][0-9]*|0x[0-9a-fA-F]+)$"}],"description":"With ve_token, from get_ve33_allocations (STONX: 4663), not the wallet's chain"},"ve_token":{"type":"string","pattern":"^0x[0-9a-fA-F]{40}$"},"sender":{"type":"string","pattern":"^0x[0-9a-fA-F]{40}$","description":"Owner whose indexed VeTokens and active votes should be discovered"},"recipient":{"description":"Fee recipient; defaults to sender for claimPoolFeesToSelf","type":"string","pattern":"^0x[0-9a-fA-F]{40}$"}},"required":["chain_id","ve_token","sender"],"additionalProperties":false},"protocol":"ekubo","annotations":{"readOnlyHint":true,"destructiveHint":false,"idempotentHint":false,"openWorldHint":true},"outputSchema":{"$schema":"https://json-schema.org/draft/2020-12/schema","type":"object","properties":{"execution_plan_reference":{"type":"object","properties":{"kind":{"type":"string","const":"artifact_reference"},"artifact_type":{"type":"string","enum":["execution_plan","read_calls","token_list","typed_data_signature_request"]},"url":{"type":"string"},"integrity":{"type":"object","properties":{"algorithm":{"type":"string","const":"keccak256"},"value":{"type":"string"}},"required":["algorithm","value"],"additionalProperties":{}},"bytes":{"type":"integer","minimum":-9007199254740991,"maximum":9007199254740991},"instruction":{"type":"string"}},"required":["kind","artifact_type","url","integrity","bytes","instruction"],"additionalProperties":{}}},"additionalProperties":{}}},{"name":"prepare_ve33_clear_vote","title":"Prepare ve-token vote clearing","description":"Remove the active vote from one or more ve-tokens, claiming each stake's current pool fees immediately before its clearVote in one atomic batch. Use this instead of raw clearVote calldata: Ve33 discards pending voter fees when a stake's weight goes to zero, and a current_pool_key that is not the stake's active pool reverts the whole batch. Stake amount, lock end and NFT ownership are untouched; the stake stops directing emissions and earning that pool's voter fees. Prefer prepare_ve33_reallocation when votes move to other pools. See ekubo://docs/ve33-workflow.","inputSchema":{"$schema":"https://json-schema.org/draft/2020-12/schema","type":"object","properties":{"chain_id":{"anyOf":[{"type":"integer","minimum":-9007199254740991,"maximum":9007199254740991},{"type":"string","pattern":"^(?:[1-9][0-9]*|0x[0-9a-fA-F]+)$"}],"description":"With ve_token, from get_ve33_allocations (STONX: 4663), not the wallet's chain"},"ve_token":{"type":"string","pattern":"^0x[0-9a-fA-F]{40}$"},"sender":{"type":"string","pattern":"^0x[0-9a-fA-F]{40}$"},"recipient":{"description":"Fee recipient; defaults to sender for claimPoolFeesToSelf","type":"string","pattern":"^0x[0-9a-fA-F]{40}$"},"votes":{"minItems":1,"maxItems":100,"type":"array","items":{"type":"object","properties":{"ve_id":{"type":"string","pattern":"^(?:0|[1-9][0-9]*)$"},"current_pool_key":{"type":"object","properties":{"token0":{"type":"string","pattern":"^0x[0-9a-fA-F]{1,40}$"},"token1":{"type":"string","pattern":"^0x[0-9a-fA-F]{1,40}$"},"config":{"type":"string","pattern":"^0x[0-9a-fA-F]{64}$"},"fee":{"type":"string","pattern":"^(?:(?:0|[1-9][0-9]*)|0x[0-9a-fA-F]+)$"},"tick_spacing":{"anyOf":[{"anyOf":[{"type":"integer","minimum":0,"maximum":9007199254740991},{"type":"string","pattern":"^(?:(?:0|[1-9][0-9]*)|0x[0-9a-fA-F]+)$"}]},{"type":"null"}]},"extension":{"type":"string","pattern":"^0x[0-9a-fA-F]{1,40}$"},"stableswap_params":{"anyOf":[{"type":"object","properties":{"center_tick":{"type":"integer","minimum":-9007199254740991,"maximum":9007199254740991},"amplification":{"type":"integer","minimum":0,"maximum":127}},"required":["center_tick","amplification"],"additionalProperties":false},{"type":"null"}]}},"required":["token0","token1"],"additionalProperties":false,"x-catalog-summary":"PoolKey {token0, token1, config} or {token0, token1, fee, tick_spacing, extension, stableswap_params?}, as read from the pool or vote","description":"The pool this stake currently votes for. Required: its fees are claimed immediately before the clear, and a key that is not the stake's active pool reverts the whole batch before anything is cleared."}},"required":["ve_id","current_pool_key"],"additionalProperties":false}}},"required":["chain_id","ve_token","sender","votes"],"additionalProperties":false},"protocol":"ekubo","annotations":{"readOnlyHint":true,"destructiveHint":false,"idempotentHint":false,"openWorldHint":true},"outputSchema":{"$schema":"https://json-schema.org/draft/2020-12/schema","type":"object","properties":{"execution_plan_reference":{"type":"object","properties":{"kind":{"type":"string","const":"artifact_reference"},"artifact_type":{"type":"string","enum":["execution_plan","read_calls","token_list","typed_data_signature_request"]},"url":{"type":"string"},"integrity":{"type":"object","properties":{"algorithm":{"type":"string","const":"keccak256"},"value":{"type":"string"}},"required":["algorithm","value"],"additionalProperties":{}},"bytes":{"type":"integer","minimum":-9007199254740991,"maximum":9007199254740991},"instruction":{"type":"string"}},"required":["kind","artifact_type","url","integrity","bytes","instruction"],"additionalProperties":{}}},"additionalProperties":{}}},{"name":"get_ve33_allocations","title":"Show Ekubo STONX / ve(3,3) allocations","description":"Use for requests such as 'show all my Ekubo STONX allocations'. The production Ekubo ve(3,3) deployment is the STONX voting system, so pass only owner to select its production chain and canonical VeToken automatically. Returns every pool, selected swap fee, NFT, applied vote weight, totals, state_id, and an onchain_validation request explicitly marked not_executed until the client runs its eth_call. Pass chain_id and ve_token together only for another deployment.","inputSchema":{"$schema":"https://json-schema.org/draft/2020-12/schema","type":"object","properties":{"chain_id":{"description":"Optional with ve_token; omit both for the production Ekubo STONX deployment","anyOf":[{"type":"integer","minimum":-9007199254740991,"maximum":9007199254740991},{"type":"string","pattern":"^(?:[1-9][0-9]*|0x[0-9a-fA-F]+)$"}]},"ve_token":{"description":"Optional with chain_id; omit both for the canonical STONX VeToken 0x9d7008E169D040B6c0140eb92E7cA82B12643497","type":"string","pattern":"^0x[0-9a-fA-F]{40}$"},"owner":{"type":"string","pattern":"^0x[0-9a-fA-F]{40}$","description":"Connected EVM wallet whose complete Ekubo STONX/VeToken allocation should be shown; the server cannot infer 'my', so ask the user when no wallet address is available"}},"required":["owner"],"additionalProperties":false},"protocol":"ekubo","annotations":{"readOnlyHint":true,"destructiveHint":false,"idempotentHint":true,"openWorldHint":true},"outputSchema":{"$schema":"https://json-schema.org/draft/2020-12/schema","type":"object","properties":{"onchain_validation":{"type":"object","properties":{"read_calls_reference":{"type":"object","properties":{"kind":{"type":"string","const":"artifact_reference"},"artifact_type":{"type":"string","enum":["execution_plan","read_calls","token_list","typed_data_signature_request"]},"url":{"type":"string"},"integrity":{"type":"object","properties":{"algorithm":{"type":"string","const":"keccak256"},"value":{"type":"string"}},"required":["algorithm","value"],"additionalProperties":{}},"bytes":{"type":"integer","minimum":-9007199254740991,"maximum":9007199254740991},"instruction":{"type":"string"}},"required":["kind","artifact_type","url","integrity","bytes","instruction"],"additionalProperties":{}}},"additionalProperties":{}}},"additionalProperties":{}}},{"name":"get_stonx_allocation_recommendation","title":"Get suggested STONX allocations","description":"Return a provider-neutral STONX allocation recommendation with an emissions_efficiency KPI per pool and an executable target list (exactly 10,000 bps, at most 25 Ve33 pools). The snapshot refreshes daily; read snapshot_age_seconds. voter with ve33_emission_state makes targets voter-optimal and keeps the neutral plan as provider_targets; without the emission state, execution_ready is false and local_read_requirement says what to read. The tool constructs no transaction. To apply it, require execution_ready=true, then pass its targets, the state_id from get_ve33_allocations for the connected wallet, and strategy=compact_max_lock to prepare_ve33_reallocation.","inputSchema":{"$schema":"https://json-schema.org/draft/2020-12/schema","type":"object","properties":{"voter":{"description":"With ve33_emission_state, makes targets voter-optimal","type":"object","properties":{"vote_weight":{"type":"string","pattern":"^(?:0|[1-9][0-9]{0,77})$","description":"Total applied vote weight from get_ve33_allocations"},"pools":{"maxItems":200,"type":"array","items":{"type":"object","properties":{"pool_key_id":{"type":"string","pattern":"^(?:0|[1-9][0-9]*)$","description":"Ve33 pool_key_id"},"lp_share":{"type":"number","minimum":0,"maximum":1,"description":"Voter's share of the pool's emission-earning liquidity"},"current_vote_weight":{"description":"Defaults to 0","type":"string","pattern":"^(?:0|[1-9][0-9]{0,77})$"}},"required":["pool_key_id","lp_share"],"additionalProperties":false}}},"required":["vote_weight","pools"],"additionalProperties":false},"ve33_emission_state":{"type":"object","properties":{"current_timestamp":{"type":"string","pattern":"^(?:0|[1-9][0-9]*)$"},"current_emission_rate":{"type":"string","pattern":"^(?:0|[1-9][0-9]*)$"},"total_remaining_emissions":{"type":"string","pattern":"^(?:0|[1-9][0-9]*)$"}},"required":["current_timestamp","current_emission_rate","total_remaining_emissions"],"additionalProperties":false,"x-catalog-summary":"{current_timestamp, current_emission_rate, total_remaining_emissions}: decimal strings decoded locally from getEmissionState (rate is Q32) via local_read_requirement; omit on the first call"},"prune_low_efficiency":{"default":false,"description":"Withhold prune candidates and redistribute their weight","type":"boolean"},"max_emission_share_per_fee_share":{"description":"Prune above this emission share / retained fee share; default 3","type":"number","minimum":1,"maximum":100}},"required":["prune_low_efficiency"],"additionalProperties":false},"protocol":"ekubo","annotations":{"readOnlyHint":true,"destructiveHint":false,"idempotentHint":true,"openWorldHint":true},"outputSchema":{"$schema":"https://json-schema.org/draft/2020-12/schema","type":"object","properties":{"schema_version":{"type":"string","const":"1"},"recommendation_id":{"type":"string"},"snapshot_at":{"type":"string"},"chain_id":{"type":"string"},"execution_ready":{"type":"boolean"},"recommendations":{"type":"array","items":{"type":"object","propertyNames":{"type":"string"},"additionalProperties":{}}},"targets":{"type":"array","items":{"type":"object","properties":{"pool_key_id":{"type":"string"},"swap_fee":{"type":"string","pattern":"^(0|[1-9][0-9]*)$"},"weight_bps":{"type":"integer","minimum":-9007199254740991,"maximum":9007199254740991}},"required":["pool_key_id","swap_fee","weight_bps"],"additionalProperties":{}}}},"required":["schema_version","recommendation_id","snapshot_at","chain_id","execution_ready","recommendations","targets"],"additionalProperties":{}}},{"name":"prepare_ve33_reallocation","title":"Prepare atomic ve(3,3) reallocation","description":"Compile a reviewed current allocation into at most 25 target pool-weight shares as one atomic batch of decodable VeToken steps. The default path only claims, splits, and votes: nothing is burned, no lock is extended, and nothing is withdrawn. The optional compact_max_lock strategy fee-safely consolidates active NFTs, extends the survivor to four years, then creates exactly one voting NFT per target; it burns every merged source NFT and lengthens the lock, and explicitly discloses both. Show the get_ve33_allocations result first and pass its exact state_id; hand the wallet the survivor, every burned source, the extension, and the decoded calls. See ekubo://docs/ve33-workflow.","inputSchema":{"$schema":"https://json-schema.org/draft/2020-12/schema","type":"object","properties":{"chain_id":{"anyOf":[{"type":"integer","minimum":-9007199254740991,"maximum":9007199254740991},{"type":"string","pattern":"^(?:[1-9][0-9]*|0x[0-9a-fA-F]+)$"}],"description":"With ve_token, from get_ve33_allocations (STONX: 4663), not the wallet's chain"},"ve_token":{"type":"string","pattern":"^0x[0-9a-fA-F]{40}$"},"sender":{"type":"string","pattern":"^0x[0-9a-fA-F]{40}$","description":"VeToken owner that will execute the atomic batch"},"current_state_id":{"type":"string","pattern":"^0x[0-9a-fA-F]{64}$","description":"Exact state_id returned by get_ve33_allocations; preparation fails if indexed state changed"},"targets":{"minItems":1,"maxItems":25,"type":"array","items":{"type":"object","properties":{"pool_key_id":{"type":"string","pattern":"^(?:0|[1-9][0-9]*)$","description":"Canonical Ekubo Ve33 pool key ID; the server resolves and verifies the full pool key"},"swap_fee":{"type":"string","pattern":"^(?:0|[1-9][0-9]*)$","description":"Selected uint64 swap fee vote"},"weight_bps":{"type":"integer","minimum":1,"maximum":10000,"description":"Target share of allocated voting power in basis points"}},"required":["pool_key_id","swap_fee","weight_bps"],"additionalProperties":false},"description":"At most 25 targets. compact_max_lock creates one final voting VeToken per target; preserve_existing_locks may require multiple NFTs per target to keep expiry-cohort decay proportional."},"salt_nonce":{"type":"string","pattern":"^0x[0-9a-fA-F]{64}$","description":"User-selected nonce for deterministic child VeToken IDs created by required splits"},"strategy":{"description":"Defaults to preserve_existing_locks. compact_max_lock explicitly claims fees, consolidates active stake into one surviving NFT, extends it to four years, then creates exactly one voting NFT per target; redundant source NFT IDs are burned.","type":"string","enum":["preserve_existing_locks","compact_max_lock"]}},"required":["chain_id","ve_token","sender","current_state_id","targets","salt_nonce"],"additionalProperties":false},"protocol":"ekubo","annotations":{"readOnlyHint":true,"destructiveHint":false,"idempotentHint":false,"openWorldHint":true},"outputSchema":{"$schema":"https://json-schema.org/draft/2020-12/schema","type":"object","properties":{"execution_plan_reference":{"type":"object","properties":{"kind":{"type":"string","const":"artifact_reference"},"artifact_type":{"type":"string","enum":["execution_plan","read_calls","token_list","typed_data_signature_request"]},"url":{"type":"string"},"integrity":{"type":"object","properties":{"algorithm":{"type":"string","const":"keccak256"},"value":{"type":"string"}},"required":["algorithm","value"],"additionalProperties":{}},"bytes":{"type":"integer","minimum":-9007199254740991,"maximum":9007199254740991},"instruction":{"type":"string"}},"required":["kind","artifact_type","url","integrity","bytes","instruction"],"additionalProperties":{}}},"additionalProperties":{}}},{"name":"get_positions_by_owner","title":"Get Ekubo positions by owner","description":"Enumerate an owner's indexed Ekubo position NFTs with pool keys, bounds, liquidity, indexed pool state and rewards. For fresh onchain state, pass each current_state_reads[].read_calls_reference to wallet_batch_eth_call as a value in the same code block; each position's current_state.state_call_id joins results[].id.","inputSchema":{"$schema":"https://json-schema.org/draft/2020-12/schema","type":"object","properties":{"owner":{"type":"string","pattern":"^0x[0-9a-fA-F]{40}$"},"chain_id":{"anyOf":[{"type":"integer","minimum":-9007199254740991,"maximum":9007199254740991},{"type":"string","pattern":"^(?:[1-9][0-9]*|0x[0-9a-fA-F]+)$"}],"description":"EVM chain ID"},"state":{"type":"string","enum":["opened","closed"]},"page_size":{"default":50,"type":"integer","minimum":1,"maximum":200},"page":{"default":1,"type":"integer","minimum":1,"maximum":9007199254740991}},"required":["owner","page_size","page"],"additionalProperties":false},"protocol":"ekubo","annotations":{"readOnlyHint":true,"destructiveHint":false,"idempotentHint":true,"openWorldHint":true},"outputSchema":{"$schema":"https://json-schema.org/draft/2020-12/schema","type":"object","properties":{"current_state_reads":{"type":"array","items":{"type":"object","properties":{"chain_id":{"type":"string"},"read_calls_reference":{"type":"object","properties":{"kind":{"type":"string","const":"artifact_reference"},"artifact_type":{"type":"string","enum":["execution_plan","read_calls","token_list","typed_data_signature_request"]},"url":{"type":"string"},"integrity":{"type":"object","properties":{"algorithm":{"type":"string","const":"keccak256"},"value":{"type":"string"}},"required":["algorithm","value"],"additionalProperties":{}},"bytes":{"type":"integer","minimum":-9007199254740991,"maximum":9007199254740991},"instruction":{"type":"string"}},"required":["kind","artifact_type","url","integrity","bytes","instruction"],"additionalProperties":{}}},"required":["chain_id","read_calls_reference"],"additionalProperties":{}}}},"additionalProperties":{}}},{"name":"get_pool","title":"Get an Ekubo pool","description":"Resolve a chain/core/pool ID to its verified PoolKey, decoded config and indexed pool state. For fresh sqrtRatio, tick and liquidity, pass current_state_query.read_calls_reference unchanged to wallet_batch_eth_call.","inputSchema":{"$schema":"https://json-schema.org/draft/2020-12/schema","type":"object","properties":{"chain_id":{"anyOf":[{"type":"integer","minimum":-9007199254740991,"maximum":9007199254740991},{"type":"string","pattern":"^(?:[1-9][0-9]*|0x[0-9a-fA-F]+)$"}],"description":"EVM chain ID"},"core_address":{"type":"string","pattern":"^0x[0-9a-fA-F]{1,40}$"},"pool_id":{"type":"string","pattern":"^(?:(?:0|[1-9][0-9]*)|0x[0-9a-fA-F]+)$","description":"Pool ID"}},"required":["chain_id","core_address","pool_id"],"additionalProperties":false},"protocol":"ekubo","annotations":{"readOnlyHint":true,"destructiveHint":false,"idempotentHint":true,"openWorldHint":true},"outputSchema":{"$schema":"https://json-schema.org/draft/2020-12/schema","type":"object","properties":{"current_state_query":{"type":"object","properties":{"read_calls_reference":{"type":"object","properties":{"kind":{"type":"string","const":"artifact_reference"},"artifact_type":{"type":"string","enum":["execution_plan","read_calls","token_list","typed_data_signature_request"]},"url":{"type":"string"},"integrity":{"type":"object","properties":{"algorithm":{"type":"string","const":"keccak256"},"value":{"type":"string"}},"required":["algorithm","value"],"additionalProperties":{}},"bytes":{"type":"integer","minimum":-9007199254740991,"maximum":9007199254740991},"instruction":{"type":"string"}},"required":["kind","artifact_type","url","integrity","bytes","instruction"],"additionalProperties":{}}},"additionalProperties":{}}},"additionalProperties":{}}},{"name":"get_pool_liquidity","title":"Get Ekubo pool liquidity depth","description":"Return tick-level net liquidity deltas for one exact chain/core/pool ID. Accumulate the deltas in ascending tick order to reconstruct active liquidity depth.","inputSchema":{"$schema":"https://json-schema.org/draft/2020-12/schema","type":"object","properties":{"chain_id":{"anyOf":[{"type":"integer","minimum":-9007199254740991,"maximum":9007199254740991},{"type":"string","pattern":"^(?:[1-9][0-9]*|0x[0-9a-fA-F]+)$"}],"description":"EVM chain ID"},"core_address":{"type":"string","pattern":"^0x[0-9a-fA-F]{1,40}$"},"pool_id":{"type":"string","pattern":"^(?:(?:0|[1-9][0-9]*)|0x[0-9a-fA-F]+)$","description":"Pool ID"}},"required":["chain_id","core_address","pool_id"],"additionalProperties":false},"protocol":"ekubo","annotations":{"readOnlyHint":true,"destructiveHint":false,"idempotentHint":true,"openWorldHint":true},"outputSchema":{"$schema":"https://json-schema.org/draft/2020-12/schema","type":"object","properties":{"chain_id":{"type":"string"},"core_address":{"type":"string"},"pool_id":{"type":"string"},"pool_id_decimal":{"type":"string","pattern":"^(0|[1-9][0-9]*)$"},"liquidity_deltas":{"type":"array","items":{}}},"required":["chain_id","core_address","pool_id","pool_id_decimal","liquidity_deltas"],"additionalProperties":{}}},{"name":"get_position","title":"Get complete Ekubo position details","description":"Hydrate one owner position: pool key, bounds, liquidity, pool state, NFT metadata, history, rewards, token prices, and a pending read of current principal, fees or Ve33 rewards and owner. Pass current_state_query.read_calls_reference as a value to wallet_batch_eth_call in the same code block; current_state_query.state_call_id joins results[].id.","inputSchema":{"$schema":"https://json-schema.org/draft/2020-12/schema","type":"object","properties":{"owner":{"type":"string","pattern":"^0x[0-9a-fA-F]{40}$","description":"Current owner"},"chain_id":{"anyOf":[{"type":"integer","minimum":-9007199254740991,"maximum":9007199254740991},{"type":"string","pattern":"^(?:[1-9][0-9]*|0x[0-9a-fA-F]+)$"}],"description":"EVM chain ID"},"positions_address":{"type":"string","pattern":"^0x[0-9a-fA-F]{40}$","description":"Ekubo Positions or Ve33Positions manager"},"token_id":{"type":"string","pattern":"^(?:(?:0|[1-9][0-9]*)|0x[0-9a-fA-F]+)$","description":"Position NFT ID"}},"required":["owner","chain_id","positions_address","token_id"],"additionalProperties":false},"protocol":"ekubo","annotations":{"readOnlyHint":true,"destructiveHint":false,"idempotentHint":true,"openWorldHint":true},"outputSchema":{"$schema":"https://json-schema.org/draft/2020-12/schema","type":"object","properties":{"current_state_query":{"type":"object","properties":{"read_calls_reference":{"type":"object","properties":{"kind":{"type":"string","const":"artifact_reference"},"artifact_type":{"type":"string","enum":["execution_plan","read_calls","token_list","typed_data_signature_request"]},"url":{"type":"string"},"integrity":{"type":"object","properties":{"algorithm":{"type":"string","const":"keccak256"},"value":{"type":"string"}},"required":["algorithm","value"],"additionalProperties":{}},"bytes":{"type":"integer","minimum":-9007199254740991,"maximum":9007199254740991},"instruction":{"type":"string"}},"required":["kind","artifact_type","url","integrity","bytes","instruction"],"additionalProperties":{}}},"additionalProperties":{}}},"additionalProperties":{}}},{"name":"get_position_pool_candidates","title":"Find pools for an LP position","description":"List indexed pools for a token pair with verified PoolKeys and pool IDs, Core generation, pool type, extension, 24-hour TVL/volume/fee stats and the right Positions or Ve33Positions manager.","inputSchema":{"$schema":"https://json-schema.org/draft/2020-12/schema","type":"object","properties":{"chain_id":{"anyOf":[{"type":"integer","minimum":-9007199254740991,"maximum":9007199254740991},{"type":"string","pattern":"^(?:[1-9][0-9]*|0x[0-9a-fA-F]+)$"}],"description":"EVM chain ID"},"token_a":{"type":"string","pattern":"^0x[0-9a-fA-F]{1,40}$","description":"Either order"},"token_b":{"type":"string","pattern":"^0x[0-9a-fA-F]{1,40}$"},"min_tvl_usd":{"default":0,"description":"TVL floor; default 0 keeps tiny pools visible","type":"number","minimum":0},"core_address":{"type":"string","pattern":"^0x[0-9a-fA-F]{1,40}$"},"extension":{"type":"string","pattern":"^0x[0-9a-fA-F]{1,40}$"},"pool_type":{"type":"string","enum":["concentrated","stableswap"]}},"required":["chain_id","token_a","token_b","min_tvl_usd"],"additionalProperties":false},"protocol":"ekubo","annotations":{"readOnlyHint":true,"destructiveHint":false,"idempotentHint":true,"openWorldHint":true},"outputSchema":{"$schema":"https://json-schema.org/draft/2020-12/schema","type":"object","properties":{"chain_id":{"type":"string"},"pair":{"type":"object","properties":{"token0":{"type":"string"},"token1":{"type":"string"}},"required":["token0","token1"],"additionalProperties":{}},"tokens":{"type":"array","items":{"type":"object","properties":{"chain_id":{"type":"string"}},"additionalProperties":{}}},"candidates":{"type":"array","items":{"type":"object","propertyNames":{"type":"string"},"additionalProperties":{}}},"candidate_count":{"type":"integer","minimum":-9007199254740991,"maximum":9007199254740991}},"required":["chain_id","pair","tokens","candidates","candidate_count"],"additionalProperties":{}}},{"name":"prepare_lp_position_deposit","title":"Prepare an LP position deposit","description":"Prepare a v3 position mint or add_liquidity, initializing a new pool at initial_tick when requested, with every approval, refund and cleanup step. Ekubo ticks use base 1.000001, so tick = ln(price in base units) x 10^6 and a Uniswap-style 1.0001 calculation is 100x too small. The token ratio follows the range and current price: do every swap first, re-read the tick with the pool's current_state_query, then mint once. If the wallet lacks one side, execute that swap separately and size the deposit from the measured balance after its receipt, never a quoted output. See ekubo://docs/lp-position-workflow.","inputSchema":{"$schema":"https://json-schema.org/draft/2020-12/schema","type":"object","properties":{"chain_id":{"anyOf":[{"type":"integer","minimum":-9007199254740991,"maximum":9007199254740991},{"type":"string","pattern":"^(?:[1-9][0-9]*|0x[0-9a-fA-F]+)$"}],"description":"EVM chain ID"},"sender":{"type":"string","pattern":"^0x[0-9a-fA-F]{40}$"},"core_address":{"type":"string","pattern":"^0x[0-9a-fA-F]{1,40}$","description":"v3 Core address"},"pool_id":{"description":"Omit when pool_key is supplied","type":"string","pattern":"^(?:(?:0|[1-9][0-9]*)|0x[0-9a-fA-F]+)$"},"pool_key":{"description":"Required for an uninitialized pool","type":"object","properties":{"token0":{"type":"string","pattern":"^0x[0-9a-fA-F]{40}$","description":"Token; zero address = native"},"token1":{"type":"string","pattern":"^0x[0-9a-fA-F]{40}$","description":"Token; zero address = native"},"config":{"type":"string","pattern":"^0x[0-9a-fA-F]{64}$"}},"required":["token0","token1","config"],"additionalProperties":false,"x-catalog-summary":"PoolKey {token0, token1, config}: token addresses (zero = native), bytes32 config"},"pool_initialized":{"description":"false only for a new pool to initialize here","type":"boolean"},"mode":{"default":"mint_new","type":"string","enum":["mint_new","add_liquidity"]},"token_id":{"description":"add_liquidity only","type":"string","pattern":"^(?:(?:0|[1-9][0-9]*)|0x[0-9a-fA-F]+)$"},"tick_lower":{"type":"integer","minimum":-88722835,"maximum":88722835},"tick_upper":{"type":"integer","minimum":-88722835,"maximum":88722835},"initial_tick":{"description":"Uninitialized pool only: initializes at this tick","type":"integer","minimum":-88722835,"maximum":88722835},"max_amount0":{"type":"string","pattern":"^(?:0|[1-9][0-9]*)$","description":"Max token0 base units; 0 for single-sided"},"max_amount1":{"type":"string","pattern":"^(?:0|[1-9][0-9]*)$","description":"Max token1 base units; 0 for single-sided"},"slippage_bps":{"type":"integer","minimum":1,"maximum":5000,"description":"User-selected liquidity slippage"}},"required":["chain_id","sender","core_address","mode","tick_lower","tick_upper","max_amount0","max_amount1","slippage_bps"],"additionalProperties":false},"protocol":"ekubo","annotations":{"readOnlyHint":true,"destructiveHint":false,"idempotentHint":false,"openWorldHint":true},"outputSchema":{"$schema":"https://json-schema.org/draft/2020-12/schema","type":"object","properties":{"execution_plan_reference":{"type":"object","properties":{"kind":{"type":"string","const":"artifact_reference"},"artifact_type":{"type":"string","enum":["execution_plan","read_calls","token_list","typed_data_signature_request"]},"url":{"type":"string"},"integrity":{"type":"object","properties":{"algorithm":{"type":"string","const":"keccak256"},"value":{"type":"string"}},"required":["algorithm","value"],"additionalProperties":{}},"bytes":{"type":"integer","minimum":-9007199254740991,"maximum":9007199254740991},"instruction":{"type":"string"}},"required":["kind","artifact_type","url","integrity","bytes","instruction"],"additionalProperties":{}}},"additionalProperties":{}}},{"name":"prepare_lp_position_earnings_claim","title":"Prepare an LP fee or reward claim","description":"Prepare collection of all accrued fees from an owned standard position or rewards from an owned Ve33 position, keeping its liquidity and NFT. Run its current_state_query first: require every inner call to succeed and the decoded owner to equal expected_owner, and pass the decoded fees or rewards to the wallet with the plan.","inputSchema":{"$schema":"https://json-schema.org/draft/2020-12/schema","type":"object","properties":{"chain_id":{"anyOf":[{"type":"integer","minimum":-9007199254740991,"maximum":9007199254740991},{"type":"string","pattern":"^(?:[1-9][0-9]*|0x[0-9a-fA-F]+)$"}],"description":"EVM chain ID"},"sender":{"type":"string","pattern":"^0x[0-9a-fA-F]{40}$","description":"Position owner"},"positions_address":{"type":"string","pattern":"^0x[0-9a-fA-F]{40}$","description":"Positions or Ve33Positions manager"},"token_id":{"type":"string","pattern":"^(?:(?:0|[1-9][0-9]*)|0x[0-9a-fA-F]+)$","description":"Position NFT ID"},"recipient":{"description":"Defaults to sender","type":"string","pattern":"^0x[0-9a-fA-F]{40}$"}},"required":["chain_id","sender","positions_address","token_id"],"additionalProperties":false},"protocol":"ekubo","annotations":{"readOnlyHint":true,"destructiveHint":false,"idempotentHint":false,"openWorldHint":true},"outputSchema":{"$schema":"https://json-schema.org/draft/2020-12/schema","type":"object","properties":{"execution_plan_reference":{"type":"object","properties":{"kind":{"type":"string","const":"artifact_reference"},"artifact_type":{"type":"string","enum":["execution_plan","read_calls","token_list","typed_data_signature_request"]},"url":{"type":"string"},"integrity":{"type":"object","properties":{"algorithm":{"type":"string","const":"keccak256"},"value":{"type":"string"}},"required":["algorithm","value"],"additionalProperties":{}},"bytes":{"type":"integer","minimum":-9007199254740991,"maximum":9007199254740991},"instruction":{"type":"string"}},"required":["kind","artifact_type","url","integrity","bytes","instruction"],"additionalProperties":{}}},"additionalProperties":{}}},{"name":"prepare_lp_position_withdraw","title":"Prepare one or more LP position withdrawals","description":"Prepare partial or full withdrawals from one or more owned positions in one plan, collecting fees or Ve33 rewards and keeping the NFTs. Read each position's current_state_query first and request no more liquidity than it decodes; require every inner call to succeed and owner to equal expected_owner. Hand the wallet every principal and earnings estimate and recipient.","inputSchema":{"$schema":"https://json-schema.org/draft/2020-12/schema","type":"object","properties":{"chain_id":{"anyOf":[{"type":"integer","minimum":-9007199254740991,"maximum":9007199254740991},{"type":"string","pattern":"^(?:[1-9][0-9]*|0x[0-9a-fA-F]+)$"}],"description":"EVM chain ID"},"sender":{"type":"string","pattern":"^0x[0-9a-fA-F]{40}$","description":"Owner of every position"},"withdrawals":{"minItems":1,"maxItems":100,"type":"array","items":{"type":"object","properties":{"positions_address":{"type":"string","pattern":"^0x[0-9a-fA-F]{40}$","description":"Positions or Ve33Positions manager"},"token_id":{"type":"string","pattern":"^(?:(?:0|[1-9][0-9]*)|0x[0-9a-fA-F]+)$","description":"Position NFT ID"},"liquidity":{"type":"string","pattern":"^[0-9]*[1-9][0-9]*$","description":"uint128 liquidity, at most the decoded current-state value"},"recipient":{"description":"Defaults to sender","type":"string","pattern":"^0x[0-9a-fA-F]{40}$"}},"required":["positions_address","token_id","liquidity"],"additionalProperties":false},"description":"One entry per position"}},"required":["chain_id","sender","withdrawals"],"additionalProperties":false},"protocol":"ekubo","annotations":{"readOnlyHint":true,"destructiveHint":false,"idempotentHint":false,"openWorldHint":true},"outputSchema":{"$schema":"https://json-schema.org/draft/2020-12/schema","type":"object","properties":{"execution_plan_reference":{"type":"object","properties":{"kind":{"type":"string","const":"artifact_reference"},"artifact_type":{"type":"string","enum":["execution_plan","read_calls","token_list","typed_data_signature_request"]},"url":{"type":"string"},"integrity":{"type":"object","properties":{"algorithm":{"type":"string","const":"keccak256"},"value":{"type":"string"}},"required":["algorithm","value"],"additionalProperties":{}},"bytes":{"type":"integer","minimum":-9007199254740991,"maximum":9007199254740991},"instruction":{"type":"string"}},"required":["kind","artifact_type","url","integrity","bytes","instruction"],"additionalProperties":{}}},"additionalProperties":{}}},{"name":"prepare_wrap_unwrap","title":"Prepare a direct wrapped-native wrap or unwrap","description":"Prepare a direct wrapped-native deposit or withdrawal on a chain with a verified wrapped native token. The response names the wrapped token, which is not WETH everywhere (BNB Chain wraps BNB, Polygon POL, Monad MON).","inputSchema":{"$schema":"https://json-schema.org/draft/2020-12/schema","type":"object","properties":{"chain_id":{"anyOf":[{"type":"integer","minimum":-9007199254740991,"maximum":9007199254740991},{"type":"string","pattern":"^(?:[1-9][0-9]*|0x[0-9a-fA-F]+)$"}],"description":"EVM chain ID"},"sender":{"type":"string","pattern":"^0x[0-9a-fA-F]{40}$"},"direction":{"type":"string","enum":["wrap","unwrap"]},"amount":{"type":"string","pattern":"^[0-9]*[1-9][0-9]*$","description":"Base units"}},"required":["chain_id","sender","direction","amount"],"additionalProperties":false},"protocol":"ekubo","annotations":{"readOnlyHint":true,"destructiveHint":false,"idempotentHint":false,"openWorldHint":true},"outputSchema":{"$schema":"https://json-schema.org/draft/2020-12/schema","type":"object","properties":{"execution_plan_reference":{"type":"object","properties":{"kind":{"type":"string","const":"artifact_reference"},"artifact_type":{"type":"string","enum":["execution_plan","read_calls","token_list","typed_data_signature_request"]},"url":{"type":"string"},"integrity":{"type":"object","properties":{"algorithm":{"type":"string","const":"keccak256"},"value":{"type":"string"}},"required":["algorithm","value"],"additionalProperties":{}},"bytes":{"type":"integer","minimum":-9007199254740991,"maximum":9007199254740991},"instruction":{"type":"string"}},"required":["kind","artifact_type","url","integrity","bytes","instruction"],"additionalProperties":{}}},"additionalProperties":{}}},{"name":"prepare_transfers","title":"Prepare a batch of token transfers","description":"Prepare one atomic-capable plan of 1 to 4,096 ordered native, ERC-20, ERC-721 and ERC-1155 transfers on one EVM chain, mixed freely. Returns a compact summary and the execution_plan_reference.","inputSchema":{"$schema":"https://json-schema.org/draft/2020-12/schema","type":"object","properties":{"chain_id":{"anyOf":[{"type":"integer","minimum":-9007199254740991,"maximum":9007199254740991},{"type":"string","pattern":"^(?:[1-9][0-9]*|0x[0-9a-fA-F]+)$"}],"description":"EVM chain ID"},"sender":{"type":"string","pattern":"^0x[0-9a-fA-F]{40}$","description":"Nonzero owner of every asset"},"transfers":{"minItems":1,"maxItems":4096,"type":"array","items":{"oneOf":[{"type":"object","properties":{"kind":{"type":"string","const":"native"},"recipient":{"type":"string","pattern":"^0x[0-9a-fA-F]{40}$","description":"Nonzero recipient address"},"amount":{"type":"string","pattern":"^[1-9][0-9]*$","description":"Wei"}},"required":["kind","recipient","amount"],"additionalProperties":false},{"type":"object","properties":{"kind":{"type":"string","const":"erc20"},"token":{"type":"string","pattern":"^0x[0-9a-fA-F]{40}$","description":"Nonzero token contract address"},"recipient":{"type":"string","pattern":"^0x[0-9a-fA-F]{40}$","description":"Nonzero recipient address"},"amount":{"type":"string","pattern":"^[1-9][0-9]*$","description":"Base units"}},"required":["kind","token","recipient","amount"],"additionalProperties":false},{"type":"object","properties":{"kind":{"type":"string","const":"erc721"},"token":{"type":"string","pattern":"^0x[0-9a-fA-F]{40}$","description":"Nonzero token contract address"},"recipient":{"type":"string","pattern":"^0x[0-9a-fA-F]{40}$","description":"Nonzero recipient address"},"token_id":{"type":"string","pattern":"^(?:0|[1-9][0-9]*)$","description":"Token ID; zero is valid"},"safe":{"description":"safeTransferFrom by default; false uses transferFrom","type":"boolean"},"data":{"description":"Receiver callback data for the four-argument safeTransferFrom; not with safe=false","type":"string","pattern":"^0x(?:[0-9a-fA-F]{2})*$"}},"required":["kind","token","recipient","token_id"],"additionalProperties":false},{"type":"object","properties":{"kind":{"type":"string","const":"erc1155"},"token":{"type":"string","pattern":"^0x[0-9a-fA-F]{40}$","description":"Nonzero token contract address"},"recipient":{"type":"string","pattern":"^0x[0-9a-fA-F]{40}$","description":"Nonzero recipient address"},"token_id":{"type":"string","pattern":"^(?:0|[1-9][0-9]*)$","description":"Token ID; zero is valid"},"amount":{"type":"string","pattern":"^[1-9][0-9]*$","description":"Base units"},"safe":{"description":"ERC-1155 has no unsafe transfer","type":"boolean","const":true},"data":{"description":"Receiver callback data; defaults to empty (0x)","type":"string","pattern":"^0x(?:[0-9a-fA-F]{2})*$"}},"required":["kind","token","recipient","token_id","amount"],"additionalProperties":false}]},"description":"One to 4096 ordered, optionally mixed native, ERC-20, ERC-721, or ERC-1155 transfers"}},"required":["chain_id","sender","transfers"],"additionalProperties":false},"protocol":"ekubo","annotations":{"readOnlyHint":true,"destructiveHint":false,"idempotentHint":false,"openWorldHint":true},"outputSchema":{"$schema":"https://json-schema.org/draft/2020-12/schema","type":"object","properties":{"execution_plan_reference":{"type":"object","properties":{"kind":{"type":"string","const":"artifact_reference"},"artifact_type":{"type":"string","enum":["execution_plan","read_calls","token_list","typed_data_signature_request"]},"url":{"type":"string"},"integrity":{"type":"object","properties":{"algorithm":{"type":"string","const":"keccak256"},"value":{"type":"string"}},"required":["algorithm","value"],"additionalProperties":{}},"bytes":{"type":"integer","minimum":-9007199254740991,"maximum":9007199254740991},"instruction":{"type":"string"}},"required":["kind","artifact_type","url","integrity","bytes","instruction"],"additionalProperties":{}}},"additionalProperties":{}}},{"name":"prepare_lp_position_transfer","title":"Prepare an LP position transfer","description":"Prepare the exact safeTransferFrom transaction for an owned LP position and include pending ownership validation. The position, liquidity, and unclaimed earnings move together.","inputSchema":{"$schema":"https://json-schema.org/draft/2020-12/schema","type":"object","properties":{"chain_id":{"anyOf":[{"type":"integer","minimum":-9007199254740991,"maximum":9007199254740991},{"type":"string","pattern":"^(?:[1-9][0-9]*|0x[0-9a-fA-F]+)$"}],"description":"EVM chain ID"},"sender":{"type":"string","pattern":"^0x[0-9a-fA-F]{40}$"},"positions_address":{"type":"string","pattern":"^0x[0-9a-fA-F]{40}$"},"token_id":{"type":"string","pattern":"^(?:(?:0|[1-9][0-9]*)|0x[0-9a-fA-F]+)$"},"recipient":{"type":"string","pattern":"^0x[0-9a-fA-F]{40}$"}},"required":["chain_id","sender","positions_address","token_id","recipient"],"additionalProperties":false},"protocol":"ekubo","annotations":{"readOnlyHint":true,"destructiveHint":false,"idempotentHint":false,"openWorldHint":true},"outputSchema":{"$schema":"https://json-schema.org/draft/2020-12/schema","type":"object","properties":{"execution_plan_reference":{"type":"object","properties":{"kind":{"type":"string","const":"artifact_reference"},"artifact_type":{"type":"string","enum":["execution_plan","read_calls","token_list","typed_data_signature_request"]},"url":{"type":"string"},"integrity":{"type":"object","properties":{"algorithm":{"type":"string","const":"keccak256"},"value":{"type":"string"}},"required":["algorithm","value"],"additionalProperties":{}},"bytes":{"type":"integer","minimum":-9007199254740991,"maximum":9007199254740991},"instruction":{"type":"string"}},"required":["kind","artifact_type","url","integrity","bytes","instruction"],"additionalProperties":{}}},"additionalProperties":{}}},{"name":"get_rewards_claims_by_owner","title":"Get incentive rewards claims by owner","description":"Fetch canonical reward-claim records and supply the exact per-chain isClaimed/isAvailable eth_call list used by the interface before preparing claim transactions.","inputSchema":{"$schema":"https://json-schema.org/draft/2020-12/schema","type":"object","properties":{"owner":{"type":"string","pattern":"^0x[0-9a-fA-F]{40}$"}},"required":["owner"],"additionalProperties":false},"protocol":"ekubo","annotations":{"readOnlyHint":true,"destructiveHint":false,"idempotentHint":true,"openWorldHint":true},"outputSchema":{"$schema":"https://json-schema.org/draft/2020-12/schema","type":"object","properties":{"onchain_validation":{"type":"object","properties":{"validation_reads":{"type":"array","items":{"type":"object","properties":{"chain_id":{"type":"string"},"read_calls_reference":{"type":"object","properties":{"kind":{"type":"string","const":"artifact_reference"},"artifact_type":{"type":"string","enum":["execution_plan","read_calls","token_list","typed_data_signature_request"]},"url":{"type":"string"},"integrity":{"type":"object","properties":{"algorithm":{"type":"string","const":"keccak256"},"value":{"type":"string"}},"required":["algorithm","value"],"additionalProperties":{}},"bytes":{"type":"integer","minimum":-9007199254740991,"maximum":9007199254740991},"instruction":{"type":"string"}},"required":["kind","artifact_type","url","integrity","bytes","instruction"],"additionalProperties":{}}},"required":["chain_id","read_calls_reference"],"additionalProperties":{}}}},"additionalProperties":{}}},"additionalProperties":{}}},{"name":"prepare_rewards_claim","title":"Prepare incentive reward claims","description":"Prepare one Incentives claim or the interface's allow-failure Multicall3 aggregate for multiple claims.","inputSchema":{"$schema":"https://json-schema.org/draft/2020-12/schema","type":"object","properties":{"chain_id":{"anyOf":[{"type":"integer","minimum":-9007199254740991,"maximum":9007199254740991},{"type":"string","pattern":"^(?:[1-9][0-9]*|0x[0-9a-fA-F]+)$"}],"description":"EVM chain ID"},"sender":{"type":"string","pattern":"^0x[0-9a-fA-F]{40}$"},"claims":{"minItems":1,"maxItems":200,"type":"array","items":{"type":"object","properties":{"drop_address":{"type":"string","pattern":"^0x[0-9a-fA-F]{40}$"},"key":{"type":"object","properties":{"owner":{"type":"string","pattern":"^0x[0-9a-fA-F]{40}$"},"token":{"type":"string","pattern":"^0x[0-9a-fA-F]{40}$"},"root":{"type":"string","pattern":"^0x[0-9a-fA-F]{64}$"}},"required":["owner","token","root"],"additionalProperties":false},"claim":{"type":"object","properties":{"index":{"type":"string","pattern":"^(?:0|[1-9][0-9]*)$"},"account":{"type":"string","pattern":"^0x[0-9a-fA-F]{40}$"},"amount":{"type":"string","pattern":"^[0-9]*[1-9][0-9]*$","description":"Base units"}},"required":["index","account","amount"],"additionalProperties":false},"proof":{"type":"array","items":{"type":"string","pattern":"^0x[0-9a-fA-F]{64}$"}}},"required":["drop_address","key","claim","proof"],"additionalProperties":false}}},"required":["chain_id","sender","claims"],"additionalProperties":false},"protocol":"ekubo","annotations":{"readOnlyHint":true,"destructiveHint":false,"idempotentHint":false,"openWorldHint":true},"outputSchema":{"$schema":"https://json-schema.org/draft/2020-12/schema","type":"object","properties":{"execution_plan_reference":{"type":"object","properties":{"kind":{"type":"string","const":"artifact_reference"},"artifact_type":{"type":"string","enum":["execution_plan","read_calls","token_list","typed_data_signature_request"]},"url":{"type":"string"},"integrity":{"type":"object","properties":{"algorithm":{"type":"string","const":"keccak256"},"value":{"type":"string"}},"required":["algorithm","value"],"additionalProperties":{}},"bytes":{"type":"integer","minimum":-9007199254740991,"maximum":9007199254740991},"instruction":{"type":"string"}},"required":["kind","artifact_type","url","integrity","bytes","instruction"],"additionalProperties":{}}},"additionalProperties":{}}},{"name":"prepare_ve33_increase_stake","title":"Prepare increasing a ve-token stake","description":"Prepare the exact approval/native value and increaseStakeAmount call while preserving the existing vote and fee accounting. Non-destructive: the vote is resized rather than cleared, no fees are discarded, and no NFT is burned. The added stake takes the NFT's existing lock end, so it cannot be withdrawn before that time.","inputSchema":{"$schema":"https://json-schema.org/draft/2020-12/schema","type":"object","properties":{"chain_id":{"anyOf":[{"type":"integer","minimum":-9007199254740991,"maximum":9007199254740991},{"type":"string","pattern":"^(?:[1-9][0-9]*|0x[0-9a-fA-F]+)$"}],"description":"With ve_token, from get_ve33_allocations (STONX: 4663), not the wallet's chain"},"ve_token":{"type":"string","pattern":"^0x[0-9a-fA-F]{40}$"},"sender":{"type":"string","pattern":"^0x[0-9a-fA-F]{40}$"},"stake_token":{"type":"string","pattern":"^0x[0-9a-fA-F]{40}$"},"ve_id":{"type":"string","pattern":"^(?:0|[1-9][0-9]*)$"},"amount":{"type":"string","pattern":"^[0-9]*[1-9][0-9]*$","description":"Base units"}},"required":["chain_id","ve_token","sender","stake_token","ve_id","amount"],"additionalProperties":false},"protocol":"ekubo","annotations":{"readOnlyHint":true,"destructiveHint":false,"idempotentHint":false,"openWorldHint":true},"outputSchema":{"$schema":"https://json-schema.org/draft/2020-12/schema","type":"object","properties":{"execution_plan_reference":{"type":"object","properties":{"kind":{"type":"string","const":"artifact_reference"},"artifact_type":{"type":"string","enum":["execution_plan","read_calls","token_list","typed_data_signature_request"]},"url":{"type":"string"},"integrity":{"type":"object","properties":{"algorithm":{"type":"string","const":"keccak256"},"value":{"type":"string"}},"required":["algorithm","value"],"additionalProperties":{}},"bytes":{"type":"integer","minimum":-9007199254740991,"maximum":9007199254740991},"instruction":{"type":"string"}},"required":["kind","artifact_type","url","integrity","bytes","instruction"],"additionalProperties":{}}},"additionalProperties":{}}},{"name":"prepare_ve33_merge","title":"Prepare merging ve-token stakes","description":"Prepare fee-safe merging of one or more source NFTs into a destination, including required claims and the selected resulting vote in one atomic batch of decodable steps. Destructive to the sources: each source's stake moves to the destination, its vote is cleared, and the source NFT is burned, so its fees are claimed first and its ID is reported in the plan. The destination keeps its own lock end, which is why no source may end later than it.","inputSchema":{"$schema":"https://json-schema.org/draft/2020-12/schema","type":"object","properties":{"chain_id":{"anyOf":[{"type":"integer","minimum":-9007199254740991,"maximum":9007199254740991},{"type":"string","pattern":"^(?:[1-9][0-9]*|0x[0-9a-fA-F]+)$"}],"description":"With ve_token, from get_ve33_allocations (STONX: 4663), not the wallet's chain"},"ve_token":{"type":"string","pattern":"^0x[0-9a-fA-F]{40}$"},"sender":{"type":"string","pattern":"^0x[0-9a-fA-F]{40}$"},"destination_ve_id":{"type":"string","pattern":"^(?:0|[1-9][0-9]*)$"},"destination_pool_key":{"type":"object","properties":{"token0":{"type":"string","pattern":"^0x[0-9a-fA-F]{1,40}$"},"token1":{"type":"string","pattern":"^0x[0-9a-fA-F]{1,40}$"},"config":{"type":"string","pattern":"^0x[0-9a-fA-F]{64}$"},"fee":{"type":"string","pattern":"^(?:(?:0|[1-9][0-9]*)|0x[0-9a-fA-F]+)$"},"tick_spacing":{"anyOf":[{"anyOf":[{"type":"integer","minimum":0,"maximum":9007199254740991},{"type":"string","pattern":"^(?:(?:0|[1-9][0-9]*)|0x[0-9a-fA-F]+)$"}]},{"type":"null"}]},"extension":{"type":"string","pattern":"^0x[0-9a-fA-F]{1,40}$"},"stableswap_params":{"anyOf":[{"type":"object","properties":{"center_tick":{"type":"integer","minimum":-9007199254740991,"maximum":9007199254740991},"amplification":{"type":"integer","minimum":0,"maximum":127}},"required":["center_tick","amplification"],"additionalProperties":false},{"type":"null"}]}},"required":["token0","token1"],"additionalProperties":false,"x-catalog-summary":"PoolKey {token0, token1, config} or {token0, token1, fee, tick_spacing, extension, stableswap_params?}, as read from the pool or vote"},"sources":{"minItems":1,"maxItems":99,"type":"array","items":{"type":"object","properties":{"ve_id":{"type":"string","pattern":"^(?:0|[1-9][0-9]*)$"},"current_pool_key":{"type":"object","properties":{"token0":{"type":"string","pattern":"^0x[0-9a-fA-F]{1,40}$"},"token1":{"type":"string","pattern":"^0x[0-9a-fA-F]{1,40}$"},"config":{"type":"string","pattern":"^0x[0-9a-fA-F]{64}$"},"fee":{"type":"string","pattern":"^(?:(?:0|[1-9][0-9]*)|0x[0-9a-fA-F]+)$"},"tick_spacing":{"anyOf":[{"anyOf":[{"type":"integer","minimum":0,"maximum":9007199254740991},{"type":"string","pattern":"^(?:(?:0|[1-9][0-9]*)|0x[0-9a-fA-F]+)$"}]},{"type":"null"}]},"extension":{"type":"string","pattern":"^0x[0-9a-fA-F]{1,40}$"},"stableswap_params":{"anyOf":[{"type":"object","properties":{"center_tick":{"type":"integer","minimum":-9007199254740991,"maximum":9007199254740991},"amplification":{"type":"integer","minimum":0,"maximum":127}},"required":["center_tick","amplification"],"additionalProperties":false},{"type":"null"}]}},"required":["token0","token1"],"additionalProperties":false,"x-catalog-summary":"PoolKey {token0, token1, config} or {token0, token1, fee, tick_spacing, extension, stableswap_params?}, as read from the pool or vote"}},"required":["ve_id"],"additionalProperties":false}},"resulting_vote":{"anyOf":[{"type":"object","properties":{"pool_key":{"type":"object","properties":{"token0":{"type":"string","pattern":"^0x[0-9a-fA-F]{1,40}$"},"token1":{"type":"string","pattern":"^0x[0-9a-fA-F]{1,40}$"},"config":{"type":"string","pattern":"^0x[0-9a-fA-F]{64}$"},"fee":{"type":"string","pattern":"^(?:(?:0|[1-9][0-9]*)|0x[0-9a-fA-F]+)$"},"tick_spacing":{"anyOf":[{"anyOf":[{"type":"integer","minimum":0,"maximum":9007199254740991},{"type":"string","pattern":"^(?:(?:0|[1-9][0-9]*)|0x[0-9a-fA-F]+)$"}]},{"type":"null"}]},"extension":{"type":"string","pattern":"^0x[0-9a-fA-F]{1,40}$"},"stableswap_params":{"anyOf":[{"type":"object","properties":{"center_tick":{"type":"integer","minimum":-9007199254740991,"maximum":9007199254740991},"amplification":{"type":"integer","minimum":0,"maximum":127}},"required":["center_tick","amplification"],"additionalProperties":false},{"type":"null"}]}},"required":["token0","token1"],"additionalProperties":false,"x-catalog-summary":"PoolKey {token0, token1, config} or {token0, token1, fee, tick_spacing, extension, stableswap_params?}, as read from the pool or vote"},"swap_fee":{"type":"string","pattern":"^(?:0|[1-9][0-9]*)$"}},"required":["pool_key","swap_fee"],"additionalProperties":false},{"type":"null"}]}},"required":["chain_id","ve_token","sender","destination_ve_id","sources"],"additionalProperties":false},"protocol":"ekubo","annotations":{"readOnlyHint":true,"destructiveHint":false,"idempotentHint":false,"openWorldHint":true},"outputSchema":{"$schema":"https://json-schema.org/draft/2020-12/schema","type":"object","properties":{"execution_plan_reference":{"type":"object","properties":{"kind":{"type":"string","const":"artifact_reference"},"artifact_type":{"type":"string","enum":["execution_plan","read_calls","token_list","typed_data_signature_request"]},"url":{"type":"string"},"integrity":{"type":"object","properties":{"algorithm":{"type":"string","const":"keccak256"},"value":{"type":"string"}},"required":["algorithm","value"],"additionalProperties":{}},"bytes":{"type":"integer","minimum":-9007199254740991,"maximum":9007199254740991},"instruction":{"type":"string"}},"required":["kind","artifact_type","url","integrity","bytes","instruction"],"additionalProperties":{}}},"additionalProperties":{}}},{"name":"prepare_ve33_withdraw","title":"Prepare expired ve-token withdrawal","description":"Prepare fee-safe withdrawal of an expired ve-token stake, claiming the active pool first when voted and returning pending owner/stake validation. Ends the position: the stake leaves Ve33 and returns to the owner and the vote is cleared. Only an expired stake can be withdrawn — Ve33 reverts with StakeNotExpired at any earlier time, and there is no early exit or penalty path.","inputSchema":{"$schema":"https://json-schema.org/draft/2020-12/schema","type":"object","properties":{"chain_id":{"anyOf":[{"type":"integer","minimum":-9007199254740991,"maximum":9007199254740991},{"type":"string","pattern":"^(?:[1-9][0-9]*|0x[0-9a-fA-F]+)$"}],"description":"With ve_token, from get_ve33_allocations (STONX: 4663), not the wallet's chain"},"ve_token":{"type":"string","pattern":"^0x[0-9a-fA-F]{40}$"},"sender":{"type":"string","pattern":"^0x[0-9a-fA-F]{40}$"},"ve_id":{"type":"string","pattern":"^(?:0|[1-9][0-9]*)$"},"current_pool_key":{"type":"object","properties":{"token0":{"type":"string","pattern":"^0x[0-9a-fA-F]{1,40}$"},"token1":{"type":"string","pattern":"^0x[0-9a-fA-F]{1,40}$"},"config":{"type":"string","pattern":"^0x[0-9a-fA-F]{64}$"},"fee":{"type":"string","pattern":"^(?:(?:0|[1-9][0-9]*)|0x[0-9a-fA-F]+)$"},"tick_spacing":{"anyOf":[{"anyOf":[{"type":"integer","minimum":0,"maximum":9007199254740991},{"type":"string","pattern":"^(?:(?:0|[1-9][0-9]*)|0x[0-9a-fA-F]+)$"}]},{"type":"null"}]},"extension":{"type":"string","pattern":"^0x[0-9a-fA-F]{1,40}$"},"stableswap_params":{"anyOf":[{"type":"object","properties":{"center_tick":{"type":"integer","minimum":-9007199254740991,"maximum":9007199254740991},"amplification":{"type":"integer","minimum":0,"maximum":127}},"required":["center_tick","amplification"],"additionalProperties":false},{"type":"null"}]}},"required":["token0","token1"],"additionalProperties":false,"x-catalog-summary":"PoolKey {token0, token1, config} or {token0, token1, fee, tick_spacing, extension, stableswap_params?}, as read from the pool or vote"}},"required":["chain_id","ve_token","sender","ve_id"],"additionalProperties":false},"protocol":"ekubo","annotations":{"readOnlyHint":true,"destructiveHint":false,"idempotentHint":false,"openWorldHint":true},"outputSchema":{"$schema":"https://json-schema.org/draft/2020-12/schema","type":"object","properties":{"execution_plan_reference":{"type":"object","properties":{"kind":{"type":"string","const":"artifact_reference"},"artifact_type":{"type":"string","enum":["execution_plan","read_calls","token_list","typed_data_signature_request"]},"url":{"type":"string"},"integrity":{"type":"object","properties":{"algorithm":{"type":"string","const":"keccak256"},"value":{"type":"string"}},"required":["algorithm","value"],"additionalProperties":{}},"bytes":{"type":"integer","minimum":-9007199254740991,"maximum":9007199254740991},"instruction":{"type":"string"}},"required":["kind","artifact_type","url","integrity","bytes","instruction"],"additionalProperties":{}}},"additionalProperties":{}}},{"name":"get_liquidity_opportunities","title":"Find Ekubo liquidity opportunities","description":"Return the interface's boosted-fee, incentive and projected ve(3,3)-emission opportunities ranked by APR, with actionable pools or pool-discovery handoffs, freshness and risk context. Call this before asking the user to choose a pair. APR is an annualized snapshot, not guaranteed yield: show its components, denominator, freshness, and range and impermanent-loss risk. If ranking_complete=false, run local_read_requirement through the wallet, decode it locally, and call again with ve33_emission_state.","inputSchema":{"$schema":"https://json-schema.org/draft/2020-12/schema","type":"object","properties":{"chain_id":{"description":"Omit for every chain","anyOf":[{"type":"integer","minimum":-9007199254740991,"maximum":9007199254740991},{"type":"string","pattern":"^(?:[1-9][0-9]*|0x[0-9a-fA-F]+)$"}]},"types":{"default":["boosted_fees","incentive","ve33_emissions"],"description":"Defaults to all","minItems":1,"maxItems":3,"type":"array","items":{"type":"string","enum":["boosted_fees","incentive","ve33_emissions"]}},"token":{"description":"Token in the pair (EVM or Starknet)","type":"string","pattern":"^0x[0-9a-fA-F]+$"},"min_apr":{"description":"APR ratio floor; 1.0 = 100%","type":"number","minimum":0},"limit":{"default":25,"type":"integer","minimum":1,"maximum":100},"ve33_emission_state":{"type":"object","properties":{"current_timestamp":{"type":"string","pattern":"^(?:0|[1-9][0-9]*)$"},"current_emission_rate":{"type":"string","pattern":"^(?:0|[1-9][0-9]*)$"},"total_remaining_emissions":{"type":"string","pattern":"^(?:0|[1-9][0-9]*)$"}},"required":["current_timestamp","current_emission_rate","total_remaining_emissions"],"additionalProperties":false,"x-catalog-summary":"{current_timestamp, current_emission_rate, total_remaining_emissions}: decimal strings decoded locally from getEmissionState (rate is Q32) via local_read_requirement; omit on the first call"}},"required":["types","limit"],"additionalProperties":false},"protocol":"ekubo","annotations":{"readOnlyHint":true,"destructiveHint":false,"idempotentHint":true,"openWorldHint":true},"outputSchema":{"$schema":"https://json-schema.org/draft/2020-12/schema","type":"object","properties":{"local_read_requirement":{"anyOf":[{"type":"object","properties":{"read_calls_reference":{"type":"object","properties":{"kind":{"type":"string","const":"artifact_reference"},"artifact_type":{"type":"string","enum":["execution_plan","read_calls","token_list","typed_data_signature_request"]},"url":{"type":"string"},"integrity":{"type":"object","properties":{"algorithm":{"type":"string","const":"keccak256"},"value":{"type":"string"}},"required":["algorithm","value"],"additionalProperties":{}},"bytes":{"type":"integer","minimum":-9007199254740991,"maximum":9007199254740991},"instruction":{"type":"string"}},"required":["kind","artifact_type","url","integrity","bytes","instruction"],"additionalProperties":{}}},"additionalProperties":{}},{"type":"null"}]}},"additionalProperties":{}}}]}