Skip to main content
Glama

assetfare_v2_prepare

Prepares a verified first unsigned bundle and caller-wallet handoff for one-shot cross-chain routes, validating quote-bound context before the upstream request without signing or submitting.

Instructions

Return one deeply verified first unsigned bundle and caller-wallet handoff. Example: pass caller_approved=true, a one_shot approval_v3, and the quote-bound verification_context; multi-step routes reject one_shot. Economic guidance is advisory and adds no request field. Context is validated before the upstream request and never forwarded. AssetFare never signs or submits.

Input Schema

NameRequiredDescriptionDefault
walletsYesMap each chain needed by this route to the caller's public wallet address. Include public addresses only; never private keys or seed phrases.
to_chainYesDestination chain for the v2 route: Solana, Base, Arbitrum, or Robinhood Chain. Source-only chains are not destinations.
to_tokenYesOutput token symbol on to_chain. The chain-token pair must appear in current v2 capabilities.
amount_usdYesRequested input value in USD, minimum 1. USD 1 is reachability/schema smoke only. A USD 50 competitive bucket was observed only for dated 2026-09-23 Solana USDC to Base USDC evidence and must not be generalized to another corridor. USD 1,000 is the primary representative amount. SOL input includes a swap. Always quote the actual intended amount.
from_chainYesSource chain for the v2 route. Polygon, Optimism, Ethereum, HyperEVM, X Layer, Sei, Sonic, Monad, Avalanche, Cronos, Injective, Linea, Aptos, Unichain, and Ink are source-only and cannot be used as to_chain.
from_tokenYesInput token symbol on from_chain. The chain-token pair must appear in current v2 capabilities.
approval_v3YesStrict one-shot approval copied from the exact unexpired selected quote; its bounds may only be strengthened.
caller_approvedYesLegacy caller assertion that MUST be supplied explicitly. It is not human-proof and is never auto-inserted; approval_v3 adds server-enforced quote binding.
event_signer_publicNoSolana CCTP only: caller-generated ephemeral public key. Keep the matching private key client-side and use it to co-sign the returned unsigned event-account transaction; never send the private key.
verification_contextYesStrict caller-held one-shot context copied from the selected quote, approval and public wallets. It is verified before prepare and never forwarded upstream.

Output Schema

NameRequiredDescriptionDefault
bundleYesExact Core bundle whose payload_sha256 remains scoped only to this nested object.
action_verificationYesFail-closed semantic and approval-bound verification result; it never authorizes a signature by itself.
local_execution_gateYesRemote verification is not signing authority. Recompute locally and require verified_for_signing after fresh wallet simulation.
caller_wallet_handoffYesFresh self-verifying EIP-1193 or Solana Wallet Standard handoff. The caller still simulates, confirms, signs and submits.
semantic_verificationYesTrue only after full decoded action, intent, receipt, payload and caller-bound verification.

Schema Changelog

Changes observed during successful MCP inspections.

  1. Changed8 schema fields changedv1.21.6
    • changedInput schema / properties / from_chain / description
      Previous value: -"Source chain for the v2 route. Polygon, Optimism, Ethereum, HyperEVM, X Layer, Sei, Sonic, Monad, Avalanche, Cronos, Injective, Linea, and Aptos are source-only and cannot be used as to_chain."New value: +"Source chain for the v2 route. Polygon, Optimism, Ethereum, HyperEVM, X Layer, Sei, Sonic, Monad, Avalanche, Cronos, Injective, Linea, Aptos, Unichain, and Ink are source-only and cannot be used as to_chain."
    • changedInput schema / properties / from_chain / enum
      Previous value: -[
      -  "solana",
      -  "base",
      -  "arbitrum",
      -  "robinhood",
      -  "polygon",
      -  "optimism",
      -  "ethereum",
      -  "hyperevm",
      -  "xlayer",
      -  "sei",
      -  "sonic",
      -  "monad",
      -  "avalanche",
      -  "cronos",
      -  "injective",
      -  "linea",
      -  "aptos"
      -]New value: +[
      +  "solana",
      +  "base",
      +  "arbitrum",
      +  "robinhood",
      +  "polygon",
      +  "optimism",
      +  "ethereum",
      +  "hyperevm",
      +  "xlayer",
      +  "sei",
      +  "sonic",
      +  "monad",
      +  "avalanche",
      +  "cronos",
      +  "injective",
      +  "linea",
      +  "aptos",
      +  "unichain",
      +  "ink"
      +]
    • changedInput schema / properties / verification_context / properties / direct_route_summary / properties / from / enum
      Previous value: -[
      -  "solana:SOL",
      -  "solana:USDC",
      -  "solana:USDG",
      -  "base:ETH",
      -  "base:USDC",
      -  "arbitrum:ETH",
      -  "arbitrum:USDC",
      -  "robinhood:ETH",
      -  "robinhood:USDG",
      -  "polygon:USDC",
      -  "optimism:USDC",
      -  "ethereum:USDC",
      -  "hyperevm:USDC",
      -  "xlayer:USDC",
      -  "sei:USDC",
      -  "sonic:USDC",
      -  "monad:USDC",
      -  "avalanche:USDC",
      -  "cronos:USDC",
      -  "injective:USDC",
      -  "linea:USDC",
      -  "aptos:USDC"
      -]New value: +[
      +  "solana:SOL",
      +  "solana:USDC",
      +  "solana:USDG",
      +  "base:ETH",
      +  "base:USDC",
      +  "arbitrum:ETH",
      +  "arbitrum:USDC",
      +  "robinhood:ETH",
      +  "robinhood:USDG",
      +  "polygon:USDC",
      +  "optimism:USDC",
      +  "ethereum:USDC",
      +  "hyperevm:USDC",
      +  "xlayer:USDC",
      +  "sei:USDC",
      +  "sonic:USDC",
      +  "monad:USDC",
      +  "avalanche:USDC",
      +  "cronos:USDC",
      +  "injective:USDC",
      +  "linea:USDC",
      +  "aptos:USDC",
      +  "unichain:USDC",
      +  "ink:USDC"
      +]
    • changedInput schema / properties / verification_context / properties / direct_route_summary / properties / route / enum
      Previous value: -[
      -  "solana:SOL->solana:USDC",
      -  "solana:SOL->solana:USDG",
      -  "solana:SOL->base:ETH",
      -  "solana:SOL->base:USDC",
      -  "solana:SOL->arbitrum:ETH",
      -  "solana:SOL->arbitrum:USDC",
      -  "solana:SOL->robinhood:ETH",
      -  "solana:SOL->robinhood:USDG",
      -  "solana:USDC->solana:SOL",
      -  "solana:USDC->solana:USDG",
      -  "solana:USDC->base:ETH",
      -  "solana:USDC->base:USDC",
      -  "solana:USDC->arbitrum:ETH",
      -  "solana:USDC->arbitrum:USDC",
      -  "solana:USDC->robinhood:ETH",
      -  "solana:USDC->robinhood:USDG",
      -  "solana:USDG->solana:SOL",
      -  "solana:USDG->solana:USDC",
      -  "solana:USDG->base:ETH",
      -  "solana:USDG->base:USDC",
      -  "solana:USDG->arbitrum:ETH",
      -  "solana:USDG->arbitrum:USDC",
      -  "solana:USDG->robinhood:ETH",
      -  "solana:USDG->robinhood:USDG",
      -  "base:ETH->solana:SOL",
      -  "base:ETH->solana:USDC",
      -  "base:ETH->solana:USDG",
      -  "base:ETH->base:USDC",
      -  "base:ETH->arbitrum:ETH",
      -  "base:ETH->arbitrum:USDC",
      -  "base:ETH->robinhood:ETH",
      -  "base:ETH->robinhood:USDG",
      -  "base:USDC->solana:SOL",
      -  "base:USDC->solana:USDC",
      -  "base:USDC->solana:USDG",
      -  "base:USDC->base:ETH",
      -  "base:USDC->arbitrum:ETH",
      -  "base:USDC->arbitrum:USDC",
      -  "base:USDC->robinhood:ETH",
      -  "base:USDC->robinhood:USDG",
      -  "arbitrum:ETH->solana:SOL",
      -  "arbitrum:ETH->solana:USDC",
      -  "arbitrum:ETH->solana:USDG",
      -  "arbitrum:ETH->base:ETH",
      -  "arbitrum:ETH->base:USDC",
      -  "arbitrum:ETH->arbitrum:USDC",
      -  "arbitrum:ETH->robinhood:ETH",
      -  "arbitrum:ETH->robinhood:USDG",
      -  "arbitrum:USDC->solana:SOL",
      -  "arbitrum:USDC->solana:USDC",
      -  "arbitrum:USDC->solana:USDG",
      -  "arbitrum:USDC->base:ETH",
      -  "arbitrum:USDC->base:USDC",
      -  "arbitrum:USDC->arbitrum:ETH",
      -  "arbitrum:USDC->robinhood:ETH",
      -  "arbitrum:USDC->robinhood:USDG",
      -  "robinhood:ETH->solana:SOL",
      -  "robinhood:ETH->solana:USDC",
      -  "robinhood:ETH->solana:USDG",
      -  "robinhood:ETH->base:ETH",
      -  "robinhood:ETH->base:USDC",
      -  "robinhood:ETH->arbitrum:ETH",
      -  "robinhood:ETH->arbitrum:USDC",
      -  "robinhood:ETH->robinhood:USDG",
      -  "robinhood:USDG->solana:SOL",
      -  "robinhood:USDG->solana:USDC",
      -  "robinhood:USDG->solana:USDG",
      -  "robinhood:USDG->base:ETH",
      -  "robinhood:USDG->base:USDC",
      -  "robinhood:USDG->arbitrum:ETH",
      -  "robinhood:USDG->arbitrum:USDC",
      -  "robinhood:USDG->robinhood:ETH",
      -  "polygon:USDC->base:USDC",
      -  "polygon:USDC->arbitrum:USDC",
      -  "optimism:USDC->base:USDC",
      -  "optimism:USDC->arbitrum:USDC",
      -  "ethereum:USDC->solana:USDC",
      -  "ethereum:USDC->base:USDC",
      -  "hyperevm:USDC->solana:USDC",
      -  "hyperevm:USDC->base:USDC",
      -  "xlayer:USDC->solana:USDC",
      -  "xlayer:USDC->base:USDC",
      -  "sei:USDC->solana:USDC",
      -  "sei:USDC->base:USDC",
      -  "sonic:USDC->solana:USDC",
      -  "sonic:USDC->base:USDC",
      -  "monad:USDC->solana:USDC",
      -  "monad:USDC->base:USDC",
      -  "avalanche:USDC->solana:USDC",
      -  "avalanche:USDC->base:USDC",
      -  "cronos:USDC->solana:USDC",
      -  "cronos:USDC->base:USDC",
      -  "injective:USDC->solana:USDC",
      -  "injective:USDC->base:USDC",
      -  "linea:USDC->solana:USDC",
      -  "linea:USDC->base:USDC",
      -  "aptos:USDC->solana:USDC",
      -  "aptos:USDC->base:USDC"
      -]New value: +[
      +  "solana:SOL->solana:USDC",
      +  "solana:SOL->solana:USDG",
      +  "solana:SOL->base:ETH",
      +  "solana:SOL->base:USDC",
      +  "solana:SOL->arbitrum:ETH",
      +  "solana:SOL->arbitrum:USDC",
      +  "solana:SOL->robinhood:ETH",
      +  "solana:SOL->robinhood:USDG",
      +  "solana:USDC->solana:SOL",
      +  "solana:USDC->solana:USDG",
      +  "solana:USDC->base:ETH",
      +  "solana:USDC->base:USDC",
      +  "solana:USDC->arbitrum:ETH",
      +  "solana:USDC->arbitrum:USDC",
      +  "solana:USDC->robinhood:ETH",
      +  "solana:USDC->robinhood:USDG",
      +  "solana:USDG->solana:SOL",
      +  "solana:USDG->solana:USDC",
      +  "solana:USDG->base:ETH",
      +  "solana:USDG->base:USDC",
      +  "solana:USDG->arbitrum:ETH",
      +  "solana:USDG->arbitrum:USDC",
      +  "solana:USDG->robinhood:ETH",
      +  "solana:USDG->robinhood:USDG",
      +  "base:ETH->solana:SOL",
      +  "base:ETH->solana:USDC",
      +  "base:ETH->solana:USDG",
      +  "base:ETH->base:USDC",
      +  "base:ETH->arbitrum:ETH",
      +  "base:ETH->arbitrum:USDC",
      +  "base:ETH->robinhood:ETH",
      +  "base:ETH->robinhood:USDG",
      +  "base:USDC->solana:SOL",
      +  "base:USDC->solana:USDC",
      +  "base:USDC->solana:USDG",
      +  "base:USDC->base:ETH",
      +  "base:USDC->arbitrum:ETH",
      +  "base:USDC->arbitrum:USDC",
      +  "base:USDC->robinhood:ETH",
      +  "base:USDC->robinhood:USDG",
      +  "arbitrum:ETH->solana:SOL",
      +  "arbitrum:ETH->solana:USDC",
      +  "arbitrum:ETH->solana:USDG",
      +  "arbitrum:ETH->base:ETH",
      +  "arbitrum:ETH->base:USDC",
      +  "arbitrum:ETH->arbitrum:USDC",
      +  "arbitrum:ETH->robinhood:ETH",
      +  "arbitrum:ETH->robinhood:USDG",
      +  "arbitrum:USDC->solana:SOL",
      +  "arbitrum:USDC->solana:USDC",
      +  "arbitrum:USDC->solana:USDG",
      +  "arbitrum:USDC->base:ETH",
      +  "arbitrum:USDC->base:USDC",
      +  "arbitrum:USDC->arbitrum:ETH",
      +  "arbitrum:USDC->robinhood:ETH",
      +  "arbitrum:USDC->robinhood:USDG",
      +  "robinhood:ETH->solana:SOL",
      +  "robinhood:ETH->solana:USDC",
      +  "robinhood:ETH->solana:USDG",
      +  "robinhood:ETH->base:ETH",
      +  "robinhood:ETH->base:USDC",
      +  "robinhood:ETH->arbitrum:ETH",
      +  "robinhood:ETH->arbitrum:USDC",
      +  "robinhood:ETH->robinhood:USDG",
      +  "robinhood:USDG->solana:SOL",
      +  "robinhood:USDG->solana:USDC",
      +  "robinhood:USDG->solana:USDG",
      +  "robinhood:USDG->base:ETH",
      +  "robinhood:USDG->base:USDC",
      +  "robinhood:USDG->arbitrum:ETH",
      +  "robinhood:USDG->arbitrum:USDC",
      +  "robinhood:USDG->robinhood:ETH",
      +  "polygon:USDC->base:USDC",
      +  "polygon:USDC->arbitrum:USDC",
      +  "optimism:USDC->base:USDC",
      +  "optimism:USDC->arbitrum:USDC",
      +  "ethereum:USDC->solana:USDC",
      +  "ethereum:USDC->base:USDC",
      +  "hyperevm:USDC->solana:USDC",
      +  "hyperevm:USDC->base:USDC",
      +  "xlayer:USDC->solana:USDC",
      +  "xlayer:USDC->base:USDC",
      +  "sei:USDC->solana:USDC",
      +  "sei:USDC->base:USDC",
      +  "sonic:USDC->solana:USDC",
      +  "sonic:USDC->base:USDC",
      +  "monad:USDC->solana:USDC",
      +  "monad:USDC->base:USDC",
      +  "avalanche:USDC->solana:USDC",
      +  "avalanche:USDC->base:USDC",
      +  "cronos:USDC->solana:USDC",
      +  "cronos:USDC->base:USDC",
      +  "injective:USDC->solana:USDC",
      +  "injective:USDC->base:USDC",
      +  "linea:USDC->solana:USDC",
      +  "linea:USDC->base:USDC",
      +  "aptos:USDC->solana:USDC",
      +  "aptos:USDC->base:USDC",
      +  "unichain:USDC->solana:USDC",
      +  "ink:USDC->solana:USDC"
      +]
    • changedInput schema / properties / verification_context / properties / direct_route_summary / properties / steps / items / properties / from / enum
      Previous value: -[
      -  "solana:SOL",
      -  "solana:USDC",
      -  "solana:USDG",
      -  "base:ETH",
      -  "base:USDC",
      -  "arbitrum:ETH",
      -  "arbitrum:USDC",
      -  "robinhood:ETH",
      -  "robinhood:USDG",
      -  "polygon:USDC",
      -  "optimism:USDC",
      -  "ethereum:USDC",
      -  "hyperevm:USDC",
      -  "xlayer:USDC",
      -  "sei:USDC",
      -  "sonic:USDC",
      -  "monad:USDC",
      -  "avalanche:USDC",
      -  "cronos:USDC",
      -  "injective:USDC",
      -  "linea:USDC",
      -  "aptos:USDC"
      -]New value: +[
      +  "solana:SOL",
      +  "solana:USDC",
      +  "solana:USDG",
      +  "base:ETH",
      +  "base:USDC",
      +  "arbitrum:ETH",
      +  "arbitrum:USDC",
      +  "robinhood:ETH",
      +  "robinhood:USDG",
      +  "polygon:USDC",
      +  "optimism:USDC",
      +  "ethereum:USDC",
      +  "hyperevm:USDC",
      +  "xlayer:USDC",
      +  "sei:USDC",
      +  "sonic:USDC",
      +  "monad:USDC",
      +  "avalanche:USDC",
      +  "cronos:USDC",
      +  "injective:USDC",
      +  "linea:USDC",
      +  "aptos:USDC",
      +  "unichain:USDC",
      +  "ink:USDC"
      +]
    • changedInput schema / properties / wallets / propertyNames / enum
      Previous value: -[
      -  "solana",
      -  "base",
      -  "arbitrum",
      -  "robinhood",
      -  "polygon",
      -  "optimism",
      -  "ethereum",
      -  "hyperevm",
      -  "xlayer",
      -  "sei",
      -  "sonic",
      -  "monad",
      -  "avalanche",
      -  "cronos",
      -  "injective",
      -  "linea",
      -  "aptos"
      -]New value: +[
      +  "solana",
      +  "base",
      +  "arbitrum",
      +  "robinhood",
      +  "polygon",
      +  "optimism",
      +  "ethereum",
      +  "hyperevm",
      +  "xlayer",
      +  "sei",
      +  "sonic",
      +  "monad",
      +  "avalanche",
      +  "cronos",
      +  "injective",
      +  "linea",
      +  "aptos",
      +  "unichain",
      +  "ink"
      +]
    • addedOutput schema / properties / local_execution_gate
      Added value: +{
      +  "additionalProperties": {},
      +  "description": "Remote verification is not signing authority. Recompute locally and require verified_for_signing after fresh wallet simulation.",
      +  "type": "object"
      +}
    • changedOutput schema / required
      Previous value: -[
      -  "bundle",
      -  "semantic_verification",
      -  "action_verification",
      -  "caller_wallet_handoff"
      -]New value: +[
      +  "bundle",
      +  "semantic_verification",
      +  "action_verification",
      +  "caller_wallet_handoff",
      +  "local_execution_gate"
      +]
  2. Changed1 schema field changedv1.15.2
    • changedInput schema / properties / from_chain / description
      Previous value: -"Source chain for the v2 route. Polygon, Optimism, Ethereum, HyperEVM, X Layer, Sei and Sonic are source-only and cannot be used as to_chain."New value: +"Source chain for the v2 route. Polygon, Optimism, Ethereum, HyperEVM, X Layer, Sei, Sonic, Monad, Avalanche, Cronos, Injective, Linea, and Aptos are source-only and cannot be used as to_chain."
  3. Changed10 schema fields changedv1.14.5
    • changedInput schema / properties / from_chain / description
      Previous value: -"Source chain for the v2 route. Polygon and Optimism are source-only and cannot be used as to_chain."New value: +"Source chain for the v2 route. Polygon, Optimism, Ethereum, HyperEVM, X Layer, Sei and Sonic are source-only and cannot be used as to_chain."
    • changedInput schema / properties / from_chain / enum
      Previous value: -[
      -  "solana",
      -  "base",
      -  "arbitrum",
      -  "robinhood",
      -  "polygon",
      -  "optimism"
      -]New value: +[
      +  "solana",
      +  "base",
      +  "arbitrum",
      +  "robinhood",
      +  "polygon",
      +  "optimism",
      +  "ethereum",
      +  "hyperevm",
      +  "xlayer",
      +  "sei",
      +  "sonic",
      +  "monad",
      +  "avalanche",
      +  "cronos",
      +  "injective",
      +  "linea",
      +  "aptos"
      +]
    • changedInput schema / properties / to_chain / description
      Previous value: -"Destination chain for the v2 route: Solana, Base, Arbitrum, or Robinhood Chain. Polygon and Optimism are not destinations."New value: +"Destination chain for the v2 route: Solana, Base, Arbitrum, or Robinhood Chain. Source-only chains are not destinations."
    • changedInput schema / properties / verification_context / properties / direct_route_summary / properties / from / enum
      Previous value: -[
      -  "solana:SOL",
      -  "solana:USDC",
      -  "solana:USDG",
      -  "base:ETH",
      -  "base:USDC",
      -  "arbitrum:ETH",
      -  "arbitrum:USDC",
      -  "robinhood:ETH",
      -  "robinhood:USDG",
      -  "polygon:USDC",
      -  "optimism:USDC"
      -]New value: +[
      +  "solana:SOL",
      +  "solana:USDC",
      +  "solana:USDG",
      +  "base:ETH",
      +  "base:USDC",
      +  "arbitrum:ETH",
      +  "arbitrum:USDC",
      +  "robinhood:ETH",
      +  "robinhood:USDG",
      +  "polygon:USDC",
      +  "optimism:USDC",
      +  "ethereum:USDC",
      +  "hyperevm:USDC",
      +  "xlayer:USDC",
      +  "sei:USDC",
      +  "sonic:USDC",
      +  "monad:USDC",
      +  "avalanche:USDC",
      +  "cronos:USDC",
      +  "injective:USDC",
      +  "linea:USDC",
      +  "aptos:USDC"
      +]
    • changedInput schema / properties / verification_context / properties / direct_route_summary / properties / mode / enum
      Previous value: -[
      -  "cctp_direct_composition",
      -  "optimism_source_cctp",
      -  "polygon_source_cctp",
      -  "robinhood_across_ingress_composition",
      -  "robinhood_paxos_egress_composition",
      -  "robinhood_paxos_ingress_composition",
      -  "same_chain_direct",
      -  "same_chain_direct_composition"
      -]New value: +[
      +  "aptos_move_cctp_direct",
      +  "cctp_direct_composition",
      +  "optimism_source_cctp",
      +  "polygon_source_cctp",
      +  "robinhood_across_ingress_composition",
      +  "robinhood_paxos_egress_composition",
      +  "robinhood_paxos_ingress_composition",
      +  "same_chain_direct",
      +  "same_chain_direct_composition"
      +]
    • changedInput schema / properties / verification_context / properties / direct_route_summary / properties / route / enum
      Previous value: -[
      -  "solana:SOL->solana:USDC",
      -  "solana:SOL->solana:USDG",
      -  "solana:SOL->base:ETH",
      -  "solana:SOL->base:USDC",
      -  "solana:SOL->arbitrum:ETH",
      -  "solana:SOL->arbitrum:USDC",
      -  "solana:SOL->robinhood:ETH",
      -  "solana:SOL->robinhood:USDG",
      -  "solana:USDC->solana:SOL",
      -  "solana:USDC->solana:USDG",
      -  "solana:USDC->base:ETH",
      -  "solana:USDC->base:USDC",
      -  "solana:USDC->arbitrum:ETH",
      -  "solana:USDC->arbitrum:USDC",
      -  "solana:USDC->robinhood:ETH",
      -  "solana:USDC->robinhood:USDG",
      -  "solana:USDG->solana:SOL",
      -  "solana:USDG->solana:USDC",
      -  "solana:USDG->base:ETH",
      -  "solana:USDG->base:USDC",
      -  "solana:USDG->arbitrum:ETH",
      -  "solana:USDG->arbitrum:USDC",
      -  "solana:USDG->robinhood:ETH",
      -  "solana:USDG->robinhood:USDG",
      -  "base:ETH->solana:SOL",
      -  "base:ETH->solana:USDC",
      -  "base:ETH->solana:USDG",
      -  "base:ETH->base:USDC",
      -  "base:ETH->arbitrum:ETH",
      -  "base:ETH->arbitrum:USDC",
      -  "base:ETH->robinhood:ETH",
      -  "base:ETH->robinhood:USDG",
      -  "base:USDC->solana:SOL",
      -  "base:USDC->solana:USDC",
      -  "base:USDC->solana:USDG",
      -  "base:USDC->base:ETH",
      -  "base:USDC->arbitrum:ETH",
      -  "base:USDC->arbitrum:USDC",
      -  "base:USDC->robinhood:ETH",
      -  "base:USDC->robinhood:USDG",
      -  "arbitrum:ETH->solana:SOL",
      -  "arbitrum:ETH->solana:USDC",
      -  "arbitrum:ETH->solana:USDG",
      -  "arbitrum:ETH->base:ETH",
      -  "arbitrum:ETH->base:USDC",
      -  "arbitrum:ETH->arbitrum:USDC",
      -  "arbitrum:ETH->robinhood:ETH",
      -  "arbitrum:ETH->robinhood:USDG",
      -  "arbitrum:USDC->solana:SOL",
      -  "arbitrum:USDC->solana:USDC",
      -  "arbitrum:USDC->solana:USDG",
      -  "arbitrum:USDC->base:ETH",
      -  "arbitrum:USDC->base:USDC",
      -  "arbitrum:USDC->arbitrum:ETH",
      -  "arbitrum:USDC->robinhood:ETH",
      -  "arbitrum:USDC->robinhood:USDG",
      -  "robinhood:ETH->solana:SOL",
      -  "robinhood:ETH->solana:USDC",
      -  "robinhood:ETH->solana:USDG",
      -  "robinhood:ETH->base:ETH",
      -  "robinhood:ETH->base:USDC",
      -  "robinhood:ETH->arbitrum:ETH",
      -  "robinhood:ETH->arbitrum:USDC",
      -  "robinhood:ETH->robinhood:USDG",
      -  "robinhood:USDG->solana:SOL",
      -  "robinhood:USDG->solana:USDC",
      -  "robinhood:USDG->solana:USDG",
      -  "robinhood:USDG->base:ETH",
      -  "robinhood:USDG->base:USDC",
      -  "robinhood:USDG->arbitrum:ETH",
      -  "robinhood:USDG->arbitrum:USDC",
      -  "robinhood:USDG->robinhood:ETH",
      -  "polygon:USDC->base:USDC",
      -  "polygon:USDC->arbitrum:USDC",
      -  "optimism:USDC->base:USDC",
      -  "optimism:USDC->arbitrum:USDC"
      -]New value: +[
      +  "solana:SOL->solana:USDC",
      +  "solana:SOL->solana:USDG",
      +  "solana:SOL->base:ETH",
      +  "solana:SOL->base:USDC",
      +  "solana:SOL->arbitrum:ETH",
      +  "solana:SOL->arbitrum:USDC",
      +  "solana:SOL->robinhood:ETH",
      +  "solana:SOL->robinhood:USDG",
      +  "solana:USDC->solana:SOL",
      +  "solana:USDC->solana:USDG",
      +  "solana:USDC->base:ETH",
      +  "solana:USDC->base:USDC",
      +  "solana:USDC->arbitrum:ETH",
      +  "solana:USDC->arbitrum:USDC",
      +  "solana:USDC->robinhood:ETH",
      +  "solana:USDC->robinhood:USDG",
      +  "solana:USDG->solana:SOL",
      +  "solana:USDG->solana:USDC",
      +  "solana:USDG->base:ETH",
      +  "solana:USDG->base:USDC",
      +  "solana:USDG->arbitrum:ETH",
      +  "solana:USDG->arbitrum:USDC",
      +  "solana:USDG->robinhood:ETH",
      +  "solana:USDG->robinhood:USDG",
      +  "base:ETH->solana:SOL",
      +  "base:ETH->solana:USDC",
      +  "base:ETH->solana:USDG",
      +  "base:ETH->base:USDC",
      +  "base:ETH->arbitrum:ETH",
      +  "base:ETH->arbitrum:USDC",
      +  "base:ETH->robinhood:ETH",
      +  "base:ETH->robinhood:USDG",
      +  "base:USDC->solana:SOL",
      +  "base:USDC->solana:USDC",
      +  "base:USDC->solana:USDG",
      +  "base:USDC->base:ETH",
      +  "base:USDC->arbitrum:ETH",
      +  "base:USDC->arbitrum:USDC",
      +  "base:USDC->robinhood:ETH",
      +  "base:USDC->robinhood:USDG",
      +  "arbitrum:ETH->solana:SOL",
      +  "arbitrum:ETH->solana:USDC",
      +  "arbitrum:ETH->solana:USDG",
      +  "arbitrum:ETH->base:ETH",
      +  "arbitrum:ETH->base:USDC",
      +  "arbitrum:ETH->arbitrum:USDC",
      +  "arbitrum:ETH->robinhood:ETH",
      +  "arbitrum:ETH->robinhood:USDG",
      +  "arbitrum:USDC->solana:SOL",
      +  "arbitrum:USDC->solana:USDC",
      +  "arbitrum:USDC->solana:USDG",
      +  "arbitrum:USDC->base:ETH",
      +  "arbitrum:USDC->base:USDC",
      +  "arbitrum:USDC->arbitrum:ETH",
      +  "arbitrum:USDC->robinhood:ETH",
      +  "arbitrum:USDC->robinhood:USDG",
      +  "robinhood:ETH->solana:SOL",
      +  "robinhood:ETH->solana:USDC",
      +  "robinhood:ETH->solana:USDG",
      +  "robinhood:ETH->base:ETH",
      +  "robinhood:ETH->base:USDC",
      +  "robinhood:ETH->arbitrum:ETH",
      +  "robinhood:ETH->arbitrum:USDC",
      +  "robinhood:ETH->robinhood:USDG",
      +  "robinhood:USDG->solana:SOL",
      +  "robinhood:USDG->solana:USDC",
      +  "robinhood:USDG->solana:USDG",
      +  "robinhood:USDG->base:ETH",
      +  "robinhood:USDG->base:USDC",
      +  "robinhood:USDG->arbitrum:ETH",
      +  "robinhood:USDG->arbitrum:USDC",
      +  "robinhood:USDG->robinhood:ETH",
      +  "polygon:USDC->base:USDC",
      +  "polygon:USDC->arbitrum:USDC",
      +  "optimism:USDC->base:USDC",
      +  "optimism:USDC->arbitrum:USDC",
      +  "ethereum:USDC->solana:USDC",
      +  "ethereum:USDC->base:USDC",
      +  "hyperevm:USDC->solana:USDC",
      +  "hyperevm:USDC->base:USDC",
      +  "xlayer:USDC->solana:USDC",
      +  "xlayer:USDC->base:USDC",
      +  "sei:USDC->solana:USDC",
      +  "sei:USDC->base:USDC",
      +  "sonic:USDC->solana:USDC",
      +  "sonic:USDC->base:USDC",
      +  "monad:USDC->solana:USDC",
      +  "monad:USDC->base:USDC",
      +  "avalanche:USDC->solana:USDC",
      +  "avalanche:USDC->base:USDC",
      +  "cronos:USDC->solana:USDC",
      +  "cronos:USDC->base:USDC",
      +  "injective:USDC->solana:USDC",
      +  "injective:USDC->base:USDC",
      +  "linea:USDC->solana:USDC",
      +  "linea:USDC->base:USDC",
      +  "aptos:USDC->solana:USDC",
      +  "aptos:USDC->base:USDC"
      +]
    • changedInput schema / properties / verification_context / properties / direct_route_summary / properties / steps / items / properties / from / enum
      Previous value: -[
      -  "solana:SOL",
      -  "solana:USDC",
      -  "solana:USDG",
      -  "base:ETH",
      -  "base:USDC",
      -  "arbitrum:ETH",
      -  "arbitrum:USDC",
      -  "robinhood:ETH",
      -  "robinhood:USDG",
      -  "polygon:USDC",
      -  "optimism:USDC"
      -]New value: +[
      +  "solana:SOL",
      +  "solana:USDC",
      +  "solana:USDG",
      +  "base:ETH",
      +  "base:USDC",
      +  "arbitrum:ETH",
      +  "arbitrum:USDC",
      +  "robinhood:ETH",
      +  "robinhood:USDG",
      +  "polygon:USDC",
      +  "optimism:USDC",
      +  "ethereum:USDC",
      +  "hyperevm:USDC",
      +  "xlayer:USDC",
      +  "sei:USDC",
      +  "sonic:USDC",
      +  "monad:USDC",
      +  "avalanche:USDC",
      +  "cronos:USDC",
      +  "injective:USDC",
      +  "linea:USDC",
      +  "aptos:USDC"
      +]
    • changedInput schema / properties / wallets / additionalProperties / description
      Previous value: -"Caller-owned public wallet address: 0x plus 40 hex characters for EVM, or 32-44 base58 characters for Solana. Never provide secret key material."New value: +"Caller-owned public wallet address: 0x plus 40 hex characters for EVM, 0x plus 64 hex characters for Aptos, or 32-44 base58 characters for Solana. Never provide secret key material."
    • changedInput schema / properties / wallets / description
      Previous value: -"Map each chain needed by this route to the caller's public wallet address. Include public addresses only; one to six entries, never private keys or seed phrases."New value: +"Map each chain needed by this route to the caller's public wallet address. Include public addresses only; never private keys or seed phrases."
    • changedInput schema / properties / wallets / propertyNames / enum
      Previous value: -[
      -  "solana",
      -  "base",
      -  "arbitrum",
      -  "robinhood",
      -  "polygon",
      -  "optimism"
      -]New value: +[
      +  "solana",
      +  "base",
      +  "arbitrum",
      +  "robinhood",
      +  "polygon",
      +  "optimism",
      +  "ethereum",
      +  "hyperevm",
      +  "xlayer",
      +  "sei",
      +  "sonic",
      +  "monad",
      +  "avalanche",
      +  "cronos",
      +  "injective",
      +  "linea",
      +  "aptos"
      +]
  4. Changed22 schema fields changedv1.10.0
    • changedInput schema / properties / amount_usd / description
      Previous value: -"Requested input value in USD, minimum 1. USD 1 is reachability/schema smoke only; USD 50 is the native-USDC economic-comparison start based on dated 2026-09-23 evidence, not a cheapest guarantee; USD 1,000 is the primary representative amount. SOL input includes a swap. Always quote the actual intended amount."New value: +"Requested input value in USD, minimum 1. USD 1 is reachability/schema smoke only. A USD 50 competitive bucket was observed only for dated 2026-09-23 Solana USDC to Base USDC evidence and must not be generalized to another corridor. USD 1,000 is the primary representative amount. SOL input includes a swap. Always quote the actual intended amount."
    • changedInput schema / properties / approval_v3 / description
      Previous value: -"Optional strict Core 2.4.1 one_shot quote-bound selection. Omit only for the explicitly legacy_advisory path."New value: +"Strict one-shot approval copied from the exact unexpired selected quote; its bounds may only be strengthened."
    • addedInput schema / properties / verification_context
      Added value: +{
      +  "additionalProperties": false,
      +  "description": "Strict caller-held one-shot context copied from the selected quote, approval and public wallets. It is verified before prepare and never forwarded upstream.",
      +  "properties": {
      +    "approval_v3": {
      +      "additionalProperties": false,
      +      "properties": {
      +        "direct_route_summary_sha256": {
      +          "$ref": "#/properties/approval_v3/properties/quote_fingerprint"
      +        },
      +        "idempotency_key": {
      +          "$ref": "#/properties/approval_v3/properties/idempotency_key"
      +        },
      +        "maximum_input_base": {
      +          "$ref": "#/properties/approval_v3/properties/maximum_input_base"
      +        },
      +        "minimum_output_base": {
      +          "$ref": "#/properties/approval_v3/properties/maximum_input_base"
      +        },
      +        "quote_fingerprint": {
      +          "$ref": "#/properties/approval_v3/properties/quote_fingerprint"
      +        },
      +        "quote_id": {
      +          "$ref": "#/properties/approval_v3/properties/quote_id"
      +        },
      +        "selected_mode": {
      +          "$ref": "#/properties/approval_v3/properties/selected_mode"
      +        },
      +        "selection_status": {
      +          "$ref": "#/properties/approval_v3/properties/selection_status"
      +        },
      +        "version": {
      +          "$ref": "#/properties/approval_v3/properties/version"
      +        }
      +      },
      +      "required": [
      +        "version",
      +        "quote_id",
      +        "quote_fingerprint",
      +        "selection_status",
      +        "selected_mode",
      +        "maximum_input_base",
      +        "minimum_output_base",
      +        "direct_route_summary_sha256",
      +        "idempotency_key"
      +      ],
      +      "type": "object"
      +    },
      +    "direct_route_summary": {
      +      "additionalProperties": false,
      +      "properties": {
      +        "assetfare_fee_bps": {
      +          "const": 1,
      +          "type": "number"
      +        },
      +        "classification": {
      +          "enum": [
      +            "direct_protocol_only",
      +            "external_intent"
      +          ],
      +          "type": "string"
      +        },
      +        "economic_eligibility": {
      +          "enum": [
      +            "not_asserted_by_capability",
      +            "coverage_only_not_primary"
      +          ],
      +          "type": "string"
      +        },
      +        "external_intent_protocol_used": {
      +          "type": "boolean"
      +        },
      +        "fee_collection_step_index": {
      +          "maximum": 7,
      +          "minimum": 0,
      +          "type": "integer"
      +        },
      +        "from": {
      +          "enum": [
      +            "solana:SOL",
      +            "solana:USDC",
      +            "solana:USDG",
      +            "base:ETH",
      +            "base:USDC",
      +            "arbitrum:ETH",
      +            "arbitrum:USDC",
      +            "robinhood:ETH",
      +            "robinhood:USDG",
      +            "polygon:USDC",
      +            "optimism:USDC"
      +          ],
      +          "type": "string"
      +        },
      +        "mode": {
      +          "enum": [
      +            "cctp_direct_composition",
      +            "optimism_source_cctp",
      +            "polygon_source_cctp",
      +            "robinhood_across_ingress_composition",
      +            "robinhood_paxos_egress_composition",
      +            "robinhood_paxos_ingress_composition",
      +            "same_chain_direct",
      +            "same_chain_direct_composition"
      +          ],
      +          "type": "string"
      +        },
      +        "primary_selection_eligible": {
      +          "type": "boolean"
      +        },
      +        "product_classification": {
      +          "enum": [
      +            "primary_direct",
      +            "external_coverage_only"
      +          ],
      +          "type": "string"
      +        },
      +        "provider_internal_dex_aggregation_possible": {
      +          "type": "boolean"
      +        },
      +        "public_execution_eligible": {
      +          "type": "boolean"
      +        },
      +        "route": {
      +          "enum": [
      +            "solana:SOL->solana:USDC",
      +            "solana:SOL->solana:USDG",
      +            "solana:SOL->base:ETH",
      +            "solana:SOL->base:USDC",
      +            "solana:SOL->arbitrum:ETH",
      +            "solana:SOL->arbitrum:USDC",
      +            "solana:SOL->robinhood:ETH",
      +            "solana:SOL->robinhood:USDG",
      +            "solana:USDC->solana:SOL",
      +            "solana:USDC->solana:USDG",
      +            "solana:USDC->base:ETH",
      +            "solana:USDC->base:USDC",
      +            "solana:USDC->arbitrum:ETH",
      +            "solana:USDC->arbitrum:USDC",
      +            "solana:USDC->robinhood:ETH",
      +            "solana:USDC->robinhood:USDG",
      +            "solana:USDG->solana:SOL",
      +            "solana:USDG->solana:USDC",
      +            "solana:USDG->base:ETH",
      +            "solana:USDG->base:USDC",
      +            "solana:USDG->arbitrum:ETH",
      +            "solana:USDG->arbitrum:USDC",
      +            "solana:USDG->robinhood:ETH",
      +            "solana:USDG->robinhood:USDG",
      +            "base:ETH->solana:SOL",
      +            "base:ETH->solana:USDC",
      +            "base:ETH->solana:USDG",
      +            "base:ETH->base:USDC",
      +            "base:ETH->arbitrum:ETH",
      +            "base:ETH->arbitrum:USDC",
      +            "base:ETH->robinhood:ETH",
      +            "base:ETH->robinhood:USDG",
      +            "base:USDC->solana:SOL",
      +            "base:USDC->solana:USDC",
      +            "base:USDC->solana:USDG",
      +            "base:USDC->base:ETH",
      +            "base:USDC->arbitrum:ETH",
      +            "base:USDC->arbitrum:USDC",
      +            "base:USDC->robinhood:ETH",
      +            "base:USDC->robinhood:USDG",
      +            "arbitrum:ETH->solana:SOL",
      +            "arbitrum:ETH->solana:USDC",
      +            "arbitrum:ETH->solana:USDG",
      +            "arbitrum:ETH->base:ETH",
      +            "arbitrum:ETH->base:USDC",
      +            "arbitrum:ETH->arbitrum:USDC",
      +            "arbitrum:ETH->robinhood:ETH",
      +            "arbitrum:ETH->robinhood:USDG",
      +            "arbitrum:USDC->solana:SOL",
      +            "arbitrum:USDC->solana:USDC",
      +            "arbitrum:USDC->solana:USDG",
      +            "arbitrum:USDC->base:ETH",
      +            "arbitrum:USDC->base:USDC",
      +            "arbitrum:USDC->arbitrum:ETH",
      +            "arbitrum:USDC->robinhood:ETH",
      +            "arbitrum:USDC->robinhood:USDG",
      +            "robinhood:ETH->solana:SOL",
      +            "robinhood:ETH->solana:USDC",
      +            "robinhood:ETH->solana:USDG",
      +            "robinhood:ETH->base:ETH",
      +            "robinhood:ETH->base:USDC",
      +            "robinhood:ETH->arbitrum:ETH",
      +            "robinhood:ETH->arbitrum:USDC",
      +            "robinhood:ETH->robinhood:USDG",
      +            "robinhood:USDG->solana:SOL",
      +            "robinhood:USDG->solana:USDC",
      +            "robinhood:USDG->solana:USDG",
      +            "robinhood:USDG->base:ETH",
      +            "robinhood:USDG->base:USDC",
      +            "robinhood:USDG->arbitrum:ETH",
      +            "robinhood:USDG->arbitrum:USDC",
      +            "robinhood:USDG->robinhood:ETH",
      +            "polygon:USDC->base:USDC",
      +            "polygon:USDC->arbitrum:USDC",
      +            "optimism:USDC->base:USDC",
      +            "optimism:USDC->arbitrum:USDC"
      +          ],
      +          "type": "string"
      +        },
      +        "route_aggregator_used": {
      +          "const": false,
      +          "type": "boolean"
      +        },
      +        "route_minimum_guard_bps": {
      +          "anyOf": [
      +            {
      +              "maximum": 500,
      +              "minimum": 1,
      +              "type": "integer"
      +            },
      +            {
      +              "type": "null"
      +            }
      +          ]
      +        },
      +        "server_signing": {
      +          "const": false,
      +          "type": "boolean"
      +        },
      +        "server_submission": {
      +          "const": false,
      +          "type": "boolean"
      +        },
      +        "step_count": {
      +          "maximum": 8,
      +          "minimum": 1,
      +          "type": "integer"
      +        },
      +        "steps": {
      +          "items": {
      +            "additionalProperties": false,
      +            "properties": {
      +              "action": {
      +                "enum": [
      +                  "swap",
      +                  "bridge",
      +                  "receive"
      +                ],
      +                "type": "string"
      +              },
      +              "aggregator_api_used": {
      +                "const": false,
      +                "type": "boolean"
      +              },
      +              "assetfare_fee_bps": {
      +                "enum": [
      +                  0,
      +                  1
      +                ],
      +                "type": "number"
      +              },
      +              "direct_protocol": {
      +                "type": "boolean"
      +              },
      +              "expected_input_base": {
      +                "pattern": "^[1-9][0-9]*$",
      +                "type": "string"
      +              },
      +              "expected_output_base": {
      +                "pattern": "^[1-9][0-9]*$",
      +                "type": "string"
      +              },
      +              "external_intent_protocol": {
      +                "type": "boolean"
      +              },
      +              "from": {
      +                "enum": [
      +                  "solana:SOL",
      +                  "solana:USDC",
      +                  "solana:USDG",
      +                  "base:ETH",
      +                  "base:USDC",
      +                  "arbitrum:ETH",
      +                  "arbitrum:USDC",
      +                  "robinhood:ETH",
      +                  "robinhood:USDG",
      +                  "polygon:USDC",
      +                  "optimism:USDC"
      +                ],
      +                "type": "string"
      +              },
      +              "index": {
      +                "maximum": 7,
      +                "minimum": 0,
      +                "type": "integer"
      +              },
      +              "minimum_guard_bps": {
      +                "maximum": 500,
      +                "minimum": 1,
      +                "type": "integer"
      +              },
      +              "minimum_input_base": {
      +                "pattern": "^[1-9][0-9]*$",
      +                "type": "string"
      +              },
      +              "minimum_output_base": {
      +                "pattern": "^[1-9][0-9]*$",
      +                "type": "string"
      +              },
      +              "provider": {
      +                "enum": [
      +                  "raydium_clmm",
      +                  "orca_whirlpool",
      +                  "uniswap_v3",
      +                  "circle_cctp",
      +                  "circle_cctp_receive",
      +                  "paxos_usdg_layerzero_oft",
      +                  "across_intent_bridge"
      +                ],
      +                "type": "string"
      +              },
      +              "to": {
      +                "enum": [
      +                  "solana:SOL",
      +                  "solana:USDC",
      +                  "solana:USDG",
      +                  "base:ETH",
      +                  "base:USDC",
      +                  "arbitrum:ETH",
      +                  "arbitrum:USDC",
      +                  "robinhood:ETH",
      +                  "robinhood:USDG"
      +                ],
      +                "type": "string"
      +              }
      +            },
      +            "required": [
      +              "index",
      +              "action",
      +              "provider",
      +              "from",
      +              "to",
      +              "expected_input_base",
      +              "minimum_input_base",
      +              "expected_output_base",
      +              "minimum_output_base",
      +              "assetfare_fee_bps",
      +              "direct_protocol",
      +              "external_intent_protocol",
      +              "aggregator_api_used"
      +            ],
      +            "type": "object"
      +          },
      +          "maxItems": 8,
      +          "minItems": 1,
      +          "type": "array"
      +        },
      +        "to": {
      +          "enum": [
      +            "solana:SOL",
      +            "solana:USDC",
      +            "solana:USDG",
      +            "base:ETH",
      +            "base:USDC",
      +            "arbitrum:ETH",
      +            "arbitrum:USDC",
      +            "robinhood:ETH",
      +            "robinhood:USDG"
      +          ],
      +          "type": "string"
      +        },
      +        "version": {
      +          "const": "assetfare-direct-route-summary-v1",
      +          "type": "string"
      +        }
      +      },
      +      "required": [
      +        "version",
      +        "route",
      +        "from",
      +        "to",
      +        "classification",
      +        "mode",
      +        "route_aggregator_used",
      +        "external_intent_protocol_used",
      +        "provider_internal_dex_aggregation_possible",
      +        "assetfare_fee_bps",
      +        "fee_collection_step_index",
      +        "server_signing",
      +        "server_submission",
      +        "step_count",
      +        "steps"
      +      ],
      +      "type": "object"
      +    },
      +    "event_signer_public": {
      +      "anyOf": [
      +        {
      +          "$ref": "#/properties/event_signer_public"
      +        },
      +        {
      +          "type": "null"
      +        }
      +      ],
      +      "description": "Solana CCTP only: caller-generated ephemeral public key. Keep the matching private key client-side and use it to co-sign the returned unsigned event-account transaction; never send the private key."
      +    },
      +    "intent": {
      +      "additionalProperties": false,
      +      "properties": {
      +        "amount_usd": {
      +          "$ref": "#/properties/amount_usd"
      +        },
      +        "from_chain": {
      +          "$ref": "#/properties/from_chain"
      +        },
      +        "from_token": {
      +          "$ref": "#/properties/from_token"
      +        },
      +        "to_chain": {
      +          "$ref": "#/properties/to_chain"
      +        },
      +        "to_token": {
      +          "$ref": "#/properties/to_token"
      +        }
      +      },
      +      "required": [
      +        "from_chain",
      +        "from_token",
      +        "to_chain",
      +        "to_token",
      +        "amount_usd"
      +      ],
      +      "type": "object"
      +    },
      +    "verification_context_sha256": {
      +      "pattern": "^[0-9a-f]{64}$",
      +      "type": "string"
      +    },
      +    "version": {
      +      "const": "assetfare-one-shot-verification-context-v1",
      +      "type": "string"
      +    },
      +    "wallets": {
      +      "$ref": "#/properties/wallets"
      +    }
      +  },
      +  "required": [
      +    "version",
      +    "intent",
      +    "wallets",
      +    "event_signer_public",
      +    "approval_v3",
      +    "direct_route_summary",
      +    "verification_context_sha256"
      +  ],
      +  "type": "object"
      +}
    • changedInput schema / required
      Previous value: -[
      -  "caller_approved",
      -  "from_chain",
      -  "from_token",
      -  "to_chain",
      -  "to_token",
      -  "amount_usd",
      -  "wallets"
      -]New value: +[
      +  "caller_approved",
      +  "from_chain",
      +  "from_token",
      +  "to_chain",
      +  "to_token",
      +  "amount_usd",
      +  "wallets",
      +  "approval_v3",
      +  "verification_context"
      +]
    • changedOutput schema / additionalProperties
      Previous value: -trueNew value: +false
    • removedOutput schema / properties / action_id
      Removed value: -{
      -  "format": "uuid",
      -  "type": "string"
      -}
    • addedOutput schema / properties / action_verification
      Added value: +{
      +  "additionalProperties": {},
      +  "description": "Fail-closed semantic and approval-bound verification result; it never authorizes a signature by itself.",
      +  "type": "object"
      +}
    • addedOutput schema / properties / bundle
      Added value: +{
      +  "additionalProperties": true,
      +  "description": "Exact Core bundle whose payload_sha256 remains scoped only to this nested object.",
      +  "properties": {
      +    "action_id": {
      +      "format": "uuid",
      +      "type": "string"
      +    },
      +    "expires_at": {
      +      "minLength": 1,
      +      "type": "string"
      +    },
      +    "payload_sha256": {
      +      "description": "sha256(UTF-8 JSON with sorted keys and compact separators, excluding payload_sha256 itself)",
      +      "pattern": "^[0-9a-f]{64}$",
      +      "type": "string"
      +    },
      +    "payload_sha256_spec": {
      +      "const": "sha256(UTF-8 JSON with sorted keys and compact separators, excluding payload_sha256 itself)",
      +      "type": "string"
      +    },
      +    "server_signing": {
      +      "const": false,
      +      "type": "boolean"
      +    },
      +    "server_submission": {
      +      "const": false,
      +      "type": "boolean"
      +    },
      +    "signed": {
      +      "const": false,
      +      "type": "boolean"
      +    },
      +    "step_index": {
      +      "minimum": 0,
      +      "type": "integer"
      +    },
      +    "submitted": {
      +      "const": false,
      +      "type": "boolean"
      +    },
      +    "unsigned_action": {
      +      "additionalProperties": {},
      +      "type": "object"
      +    },
      +    "version": {
      +      "const": "assetfare-direct-multichain-action-v2",
      +      "type": "string"
      +    },
      +    "workflow_id": {
      +      "format": "uuid",
      +      "type": "string"
      +    }
      +  },
      +  "required": [
      +    "version",
      +    "workflow_id",
      +    "action_id",
      +    "step_index",
      +    "expires_at",
      +    "unsigned_action",
      +    "payload_sha256",
      +    "payload_sha256_spec",
      +    "server_signing",
      +    "server_submission",
      +    "signed",
      +    "submitted"
      +  ],
      +  "type": "object"
      +}
    • addedOutput schema / properties / caller_wallet_handoff
      Added value: +{
      +  "additionalProperties": {},
      +  "description": "Fresh self-verifying EIP-1193 or Solana Wallet Standard handoff. The caller still simulates, confirms, signs and submits.",
      +  "type": "object"
      +}
    • removedOutput schema / properties / expires_at
      Removed value: -{
      -  "minLength": 1,
      -  "type": "string"
      -}
    • removedOutput schema / properties / payload_sha256
      Removed value: -{
      -  "description": "sha256(UTF-8 JSON with sorted keys and compact separators, excluding payload_sha256 itself)",
      -  "pattern": "^[0-9a-f]{64}$",
      -  "type": "string"
      -}
    • removedOutput schema / properties / payload_sha256_spec
      Removed value: -{
      -  "const": "sha256(UTF-8 JSON with sorted keys and compact separators, excluding payload_sha256 itself)",
      -  "type": "string"
      -}
    • addedOutput schema / properties / semantic_verification
      Added value: +{
      +  "const": true,
      +  "description": "True only after full decoded action, intent, receipt, payload and caller-bound verification.",
      +  "type": "boolean"
      +}
    • removedOutput schema / properties / server_signing
      Removed value: -{
      -  "const": false,
      -  "type": "boolean"
      -}
    • removedOutput schema / properties / server_submission
      Removed value: -{
      -  "const": false,
      -  "type": "boolean"
      -}
    • removedOutput schema / properties / signed
      Removed value: -{
      -  "const": false,
      -  "type": "boolean"
      -}
    • removedOutput schema / properties / step_index
      Removed value: -{
      -  "minimum": 0,
      -  "type": "integer"
      -}
    • removedOutput schema / properties / submitted
      Removed value: -{
      -  "const": false,
      -  "type": "boolean"
      -}
    • removedOutput schema / properties / unsigned_action
      Removed value: -{
      -  "additionalProperties": {},
      -  "type": "object"
      -}
    • removedOutput schema / properties / version
      Removed value: -{
      -  "const": "assetfare-direct-multichain-action-v2",
      -  "type": "string"
      -}
    • removedOutput schema / properties / workflow_id
      Removed value: -{
      -  "format": "uuid",
      -  "type": "string"
      -}
    • changedOutput schema / required
      Previous value: -[
      -  "version",
      -  "workflow_id",
      -  "action_id",
      -  "step_index",
      -  "expires_at",
      -  "unsigned_action",
      -  "payload_sha256",
      -  "payload_sha256_spec",
      -  "server_signing",
      -  "server_submission",
      -  "signed",
      -  "submitted"
      -]New value: +[
      +  "bundle",
      +  "semantic_verification",
      +  "action_verification",
      +  "caller_wallet_handoff"
      +]
  5. Changed2 schema fields changedv1.2.0
    • addedInput schema / properties / approval_v3
      Added value: +{
      +  "additionalProperties": false,
      +  "description": "Optional strict Core 2.4.1 one_shot quote-bound selection. Omit only for the explicitly legacy_advisory path.",
      +  "properties": {
      +    "direct_route_summary_sha256": {
      +      "$ref": "#/properties/approval_v3/properties/quote_fingerprint"
      +    },
      +    "idempotency_key": {
      +      "pattern": "^[A-Za-z0-9._:-]{8,128}$",
      +      "type": "string"
      +    },
      +    "maximum_input_base": {
      +      "pattern": "^[1-9][0-9]*$",
      +      "type": "string"
      +    },
      +    "minimum_output_base": {
      +      "$ref": "#/properties/approval_v3/properties/maximum_input_base"
      +    },
      +    "quote_fingerprint": {
      +      "pattern": "^[0-9a-f]{64}$",
      +      "type": "string"
      +    },
      +    "quote_id": {
      +      "format": "uuid",
      +      "type": "string"
      +    },
      +    "selected_mode": {
      +      "const": "one_shot",
      +      "type": "string"
      +    },
      +    "selection_status": {
      +      "const": "selected",
      +      "type": "string"
      +    },
      +    "version": {
      +      "const": "assetfare-quote-bound-approval-v3",
      +      "type": "string"
      +    }
      +  },
      +  "required": [
      +    "version",
      +    "quote_id",
      +    "quote_fingerprint",
      +    "selection_status",
      +    "selected_mode",
      +    "maximum_input_base",
      +    "minimum_output_base",
      +    "direct_route_summary_sha256",
      +    "idempotency_key"
      +  ],
      +  "type": "object"
      +}
    • changedInput schema / properties / caller_approved / description
      Previous value: -"Explicit confirmation that the caller approved this state-changing preparation or session creation. A quote alone is not approval."New value: +"Legacy caller assertion that MUST be supplied explicitly. It is not human-proof and is never auto-inserted; approval_v3 adds server-enforced quote binding."
  6. First observedv0.1.0

TDQS

A3.6/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

With annotations already declaring readOnlyHint=false, openWorldHint=true and idempotentHint=false, the description still adds real behavioral value: no signing or submission occurs, verification_context is validated before the upstream request and never forwarded, and economic guidance is advisory only. It does not describe idempotency/retry behavior or error semantics, which keeps it short of a 5.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Five short sentences with the deliverable front-loaded and no repetition of schema detail. The 'Example:' sentence is slightly awkwardly framed and 'Economic guidance is advisory and adds no request field' is opaque, but overall the text is dense and earns its length.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness3/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

The tool has an output schema and 100% schema coverage, so return values need no prose. What is missing is flow context: which sibling tools must be called first to obtain the quote-bound approval_v3 and verification_context, and what the caller does with the handoff afterwards. For a prepare step in a ten-tool pipeline, that sequencing gap is the main shortfall.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 100%, so the nested approval_v3 and verification_context structures are already documented field by field. The description only adds that approval_v3 must be one_shot and that the context is quote-bound, which is useful framing but marginal beyond the schema. Baseline 3 is correct.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose4/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description states a concrete deliverable: a verified unsigned transaction bundle plus caller-wallet handoff, and notes AssetFare never signs or submits. That is specific enough for an agent to know this is a prepare/return-artifact step, not a quote or a session tool. It never names a sibling (quote, route_selection, session_create) explicitly, so differentiation is inferred from the 'one_shot' vs 'multi-step routes' contrast rather than stated.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines3/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description gives a conditional usage rule ('multi-step routes reject one_shot') and sketches the required payload, which implies this tool is only for single-step routes. It never states the prerequisites — which sibling produces approval_v3 and verification_context, or when to prefer a session tool instead — so the agent must infer the call ordering.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.