Skip to content
Back to Stablecoin Scanner

Card snapshot

stablescan.achivx.com · 2026-10-15 20:34:02 UTC · db82142e043f2c3983b4a21e5000c901e93284eef229a0c7424e18d7cfb675ce

This is a frozen copy of the agent's agent-card.json as we observed it at the timestamp above. We capture a new snapshot every time the card's content hash changes. Useful for: forensic drift analysis, verifying downstream callers see the right version, reproducing routing decisions made historically.

{
  "authentication": {
    "schemes": [
      {
        "description": "Public read-only telemetry; no authentication required.",
        "scheme": "none"
      }
    ]
  },
  "capabilities": {
    "extensions": [
      {
        "description": "Every card skill is also callable as its own JSON-RPC method on the same endpoint (method = skill id, params = the skill's inputSchema object). Calling such a method implies activation; no A2A-Version header required on these.",
        "required": false,
        "uri": "https://stablescan.achivx.com/a2a-ext/skill-methods/v1"
      },
      {
        "description": "Machine-readable map of the ACHIVX ecosystem: the sibling surfaces, their manuals and agent cards, and the shared identity layer. Data-only \u2014 it adds card information and changes nothing in the request flow.",
        "params": {
          "identityBridge": "a wallet is an address: the same EIP-191 wallet that is an identity on the forum is a vettable address on the Stablecoin Scanner",
          "surfaces": [
            {
              "agentCard": "https://stablescan.achivx.com/.well-known/agent-card.json",
              "job": "vet an address, check a freeze, read settlement",
              "manual": "https://stablescan.achivx.com/agents.md",
              "name": "Stablecoin Scanner"
            },
            {
              "agentCard": "https://x402scan.achivx.com/.well-known/agent-card.json",
              "job": "find an x402 service to pay, vet it, verify a payment",
              "manual": "https://x402scan.achivx.com/agents.md",
              "name": "x402scan"
            },
            {
              "agentCard": "https://forum.achivx.com/.well-known/agent-card.json",
              "job": "ask, answer (register to write)",
              "manual": "https://forum.achivx.com/agents.md",
              "name": "ACHIVX Forum"
            },
            {
              "job": "the shared layer: one EIP-191 wallet across surfaces, forum trust levels TL0-TL5",
              "manual": "https://api.achivx.com/agents.md",
              "name": "Reputation & identity"
            }
          ]
        },
        "required": false,
        "uri": "https://stablescan.achivx.com/a2a-ext/ecosystem/v1"
      }
    ],
    "pushNotifications": false,
    "streaming": false
  },
  "defaultInputModes": [
    "application/json",
    "text/plain"
  ],
  "defaultOutputModes": [
    "application/json"
  ],
  "description": "Stablecoin Scanner \u2014 onchain dollar observability. Web UI for people, agent-ready API (MCP/A2A) for machines. Per-address compliance facts (issuer freeze/seize, OFAC), taint/exposure and unified risk verdicts, open-allowance risk, recent transfers, sanctions coverage, and indexer freshness. Read-only, free, no auth. Deterministic message-only agent: it never creates tasks and does not interpret free text \u2014 invoke a skill via a SendMessage data part {\"skill\": \"<id>\", \"params\": {...}} (a text message answers with the machine-readable how-to).",
  "documentationUrl": "https://stablescan.achivx.com/agents.md",
  "endpoint": "https://stablescan.achivx.com/a2a",
  "methods": [
    "get-address-approvals",
    "get-address-risk",
    "get-address-exposure",
    "get-address-compliance",
    "get-sync-status",
    "get-recent-transactions",
    "get-sanctions-status",
    "get-wallet-graph-walk"
  ],
  "name": "Stablecoin Scanner",
  "networks": [
    {
      "caip2": "solana:5eykt4UsFv8P8NJdTREpY1vzqKqZKvdp",
      "name": "solana",
      "slug": "solana"
    },
    {
      "caip2": "eip155:1",
      "name": "ethereum",
      "slug": "ethereum"
    },
    {
      "caip2": "eip155:10",
      "name": "optimism",
      "slug": "optimism"
    },
    {
      "caip2": "eip155:56",
      "name": "bnb chain",
      "slug": "bnb-chain"
    },
    {
      "caip2": "eip155:8453",
      "name": "base",
      "slug": "base"
    },
    {
      "caip2": "eip155:42161",
      "name": "arbitrum one",
      "slug": "arbitrum"
    },
    {
      "caip2": "eip155:728126428",
      "name": "tron",
      "slug": "tron"
    }
  ],
  "pages": [
    {
      "markdown": "https://stablescan.achivx.com/index.md",
      "name": "Stablecoin Scanner \u2014 market dashboard across every network",
      "url": "https://stablescan.achivx.com/"
    },
    {
      "markdown": "https://stablescan.achivx.com/stablecoin.md",
      "name": "Stablecoins on the scanner \u2014 every stablecoin, every network",
      "url": "https://stablescan.achivx.com/stablecoin"
    },
    {
      "asset": "DAI",
      "markdown": "https://stablescan.achivx.com/dai-explorer.md",
      "name": "DAI Explorer \u2014 the asset across every network this scanner indexes it on",
      "networks": [
        "ethereum",
        "optimism",
        "base",
        "arbitrum"
      ],
      "url": "https://stablescan.achivx.com/dai-explorer"
    },
    {
      "asset": "PYUSD",
      "markdown": "https://stablescan.achivx.com/pyusd-explorer.md",
      "name": "PYUSD Explorer \u2014 the asset across every network this scanner indexes it on",
      "networks": [
        "solana",
        "ethereum",
        "arbitrum"
      ],
      "url": "https://stablescan.achivx.com/pyusd-explorer"
    },
    {
      "asset": "USD1",
      "markdown": "https://stablescan.achivx.com/usd1-explorer.md",
      "name": "USD1 Explorer \u2014 the asset across every network this scanner indexes it on",
      "networks": [
        "ethereum",
        "bnb-chain",
        "tron"
      ],
      "url": "https://stablescan.achivx.com/usd1-explorer"
    },
    {
      "asset": "USDC",
      "markdown": "https://stablescan.achivx.com/usdc-explorer.md",
      "name": "USDC Explorer \u2014 the asset across every network this scanner indexes it on",
      "networks": [
        "solana",
        "ethereum",
        "optimism",
        "bnb-chain",
        "base",
        "arbitrum"
      ],
      "url": "https://stablescan.achivx.com/usdc-explorer"
    },
    {
      "asset": "USDe",
      "markdown": "https://stablescan.achivx.com/usde-explorer.md",
      "name": "USDe Explorer \u2014 the asset across every network this scanner indexes it on",
      "networks": [
        "solana",
        "ethereum",
        "optimism",
        "base",
        "arbitrum"
      ],
      "url": "https://stablescan.achivx.com/usde-explorer"
    },
    {
      "asset": "USDS",
      "markdown": "https://stablescan.achivx.com/usds-explorer.md",
      "name": "USDS Explorer \u2014 the asset across every network this scanner indexes it on",
      "networks": [
        "solana",
        "ethereum",
        "base",
        "arbitrum"
      ],
      "url": "https://stablescan.achivx.com/usds-explorer"
    },
    {
      "asset": "USDT",
      "markdown": "https://stablescan.achivx.com/usdt-explorer.md",
      "name": "USDT Explorer \u2014 the asset across every network this scanner indexes it on",
      "networks": [
        "solana",
        "ethereum",
        "optimism",
        "bnb-chain",
        "base",
        "tron"
      ],
      "url": "https://stablescan.achivx.com/usdt-explorer"
    }
  ],
  "protocol": "a2a",
  "protocolVersion": "1.0.0",
  "rateLimits": {
    "publicPerMinute": 1200,
    "window": "1m"
  },
  "skills": [
    {
      "description": "Open ERC-20/Permit2 allowances (Class-F) with a shadow approval-risk band: unlimited to a flagged/unknown spender is the #1 drain vector; a DEX router is normal; expired Permit2 is 'expired'.",
      "examples": [
        "Which spenders can still move stablecoins out of 0x\u2026?"
      ],
      "id": "get-address-approvals",
      "inputSchema": {
        "properties": {
          "address": {
            "description": "The address in its network's own spelling: 0x\u2026 for EVM chains, T\u2026 for Tron, base58 for Solana. The answer writes it in the spelling of chain_id (address) and echoes what you sent (requested_address); address_respelled true means your spelling belongs to another kind of chain than chain_id (a T\u2026 address asked about an EVM chain, a 0x\u2026 address asked about Tron) \u2014 answered about the same bytes there, not refused, and the same owner only for a plain key account.",
            "type": "string"
          },
          "chain": {
            "description": "Chain, in any of four spellings: the id (8453 Base, 1 Ethereum, 10 Optimism, 42161 Arbitrum, 56 BNB Chain, 728126428 Tron, -1 Solana), the same id as a string, the network slug (networks[].slug: base, ethereum, optimism, arbitrum, bnb-chain, tron, solana) or its CAIP-2 id (networks[].caip2: eip155:1, solana:5eykt4UsFv8P8NJdTREpY1vzqKqZKvdp). Surrounding whitespace, a leading + and leading zeros are ignored, a JSON number counts by its value (1.0 is 1), slugs and CAIP-2 ids match in any letter case, and an empty, blank or null chain is no chain at all. Anything else (hex, a decimal fraction, a zero-padded CAIP-2 reference) is refused with -32602, and so is a network this scanner knows but does not index (absent from networks[]) \u2014 by name, never with an empty clean verdict. Without chain, the address's spelling picks it: 0x\u2026 \u2192 8453 Base, T\u2026 \u2192 Tron, base58 \u2192 Solana. The answer states the chain it is about (chain_id) and how it was chosen (chain_source: explicit|default|address_form), and lists where else this address has data (chains_with_data) \u2014 read that map before concluding; there is no auto-switch, ask again with chain set.",
            "type": [
              "integer",
              "string",
              "null"
            ]
          }
        },
        "required": [
          "address"
        ],
        "type": "object"
      },
      "name": "Open allowances + approval-risk",
      "tags": [
        "allowances",
        "approvals",
        "erc20",
        "permit2",
        "risk"
      ]
    },
    {
      "description": "\u00a78 bounded backward BFS to the nearest OFAC/hack/drainer/mixer root: class + nearest-hop + a value-proportional haircut. 'unknown' never a false 'none'; incomplete_reasons names why: OFAC list unloaded, walk cut (time_budget, frontier_cap), Solana coverage pending or partial, short history, or no hack/drainer/mixer label loaded for this chain.",
      "examples": [
        "How close is 0x\u2026 to a sanctioned or hacked source?"
      ],
      "id": "get-address-exposure",
      "inputSchema": {
        "properties": {
          "address": {
            "description": "The address in its network's own spelling: 0x\u2026 for EVM chains, T\u2026 for Tron, base58 for Solana. The answer writes it in the spelling of chain_id (address) and echoes what you sent (requested_address); address_respelled true means your spelling belongs to another kind of chain than chain_id (a T\u2026 address asked about an EVM chain, a 0x\u2026 address asked about Tron) \u2014 answered about the same bytes there, not refused, and the same owner only for a plain key account.",
            "type": "string"
          },
          "chain": {
            "description": "Chain, in any of four spellings: the id (8453 Base, 1 Ethereum, 10 Optimism, 42161 Arbitrum, 56 BNB Chain, 728126428 Tron, -1 Solana), the same id as a string, the network slug (networks[].slug: base, ethereum, optimism, arbitrum, bnb-chain, tron, solana) or its CAIP-2 id (networks[].caip2: eip155:1, solana:5eykt4UsFv8P8NJdTREpY1vzqKqZKvdp). Surrounding whitespace, a leading + and leading zeros are ignored, a JSON number counts by its value (1.0 is 1), slugs and CAIP-2 ids match in any letter case, and an empty, blank or null chain is no chain at all. Anything else (hex, a decimal fraction, a zero-padded CAIP-2 reference) is refused with -32602, and so is a network this scanner knows but does not index (absent from networks[]) \u2014 by name, never with an empty clean verdict. Without chain, the address's spelling picks it: 0x\u2026 \u2192 8453 Base, T\u2026 \u2192 Tron, base58 \u2192 Solana. The answer states the chain it is about (chain_id) and how it was chosen (chain_source: explicit|default|address_form), and lists where else this address has data (chains_with_data) \u2014 read that map before concluding; there is no auto-switch, ask again with chain set.",
            "type": [
              "integer",
              "string",
              "null"
            ]
          }
        },
        "required": [
          "address"
        ],
        "type": "object"
      },
      "name": "Taint/exposure verdict",
      "tags": [
        "taint",
        "exposure",
        "sanctions",
        "aml",
        "risk"
      ]
    },
    {
      "description": "One tier (unknown|none|low|medium|high|severe) for one chain, aggregating facts (OFAC, this chain's issuer freeze/seize status, exposure) + attributed labels (capped at medium, \u22652 sources for a tier). 'unknown' = could not assess, not 'clean'; it names its cause in evidence and incomplete_reasons (e.g. time_budget: the exposure walk was cut). An 'unknown' freeze status or a pair whose freeze history is not backfilled turns a would-be 'none' into 'unknown', so a Solana tier is never 'none'. Not scored: frozen_elsewhere, issuer freeze proposals and frozen balances - read get-address-compliance.",
      "examples": [
        "Is 0x\u2026 risky to interact with?",
        "{\"skill\":\"get-address-risk\",\"params\":{\"chain\":1,\"address\":\"0x5754284f345afc66a98fbb0a0afe71e0f007b949\"}}"
      ],
      "id": "get-address-risk",
      "inputSchema": {
        "properties": {
          "address": {
            "description": "The address in its network's own spelling: 0x\u2026 for EVM chains, T\u2026 for Tron, base58 for Solana. The answer writes it in the spelling of chain_id (address) and echoes what you sent (requested_address); address_respelled true means your spelling belongs to another kind of chain than chain_id (a T\u2026 address asked about an EVM chain, a 0x\u2026 address asked about Tron) \u2014 answered about the same bytes there, not refused, and the same owner only for a plain key account.",
            "type": "string"
          },
          "chain": {
            "description": "Chain, in any of four spellings: the id (8453 Base, 1 Ethereum, 10 Optimism, 42161 Arbitrum, 56 BNB Chain, 728126428 Tron, -1 Solana), the same id as a string, the network slug (networks[].slug: base, ethereum, optimism, arbitrum, bnb-chain, tron, solana) or its CAIP-2 id (networks[].caip2: eip155:1, solana:5eykt4UsFv8P8NJdTREpY1vzqKqZKvdp). Surrounding whitespace, a leading + and leading zeros are ignored, a JSON number counts by its value (1.0 is 1), slugs and CAIP-2 ids match in any letter case, and an empty, blank or null chain is no chain at all. Anything else (hex, a decimal fraction, a zero-padded CAIP-2 reference) is refused with -32602, and so is a network this scanner knows but does not index (absent from networks[]) \u2014 by name, never with an empty clean verdict. Without chain, the address's spelling picks it: 0x\u2026 \u2192 8453 Base, T\u2026 \u2192 Tron, base58 \u2192 Solana. The answer states the chain it is about (chain_id) and how it was chosen (chain_source: explicit|default|address_form), and lists where else this address has data (chains_with_data) \u2014 read that map before concluding; there is no auto-switch, ask again with chain set.",
            "type": [
              "integer",
              "string",
              "null"
            ]
          }
        },
        "required": [
          "address"
        ],
        "type": "object"
      },
      "name": "Unified risk verdict",
      "tags": [
        "risk",
        "verdict",
        "screening",
        "compliance"
      ]
    },
    {
      "description": "Compliance facts for one address on one chain + the OFAC SDN flag. freeze[]: issuer freeze/seize status per enabled freeze-capable stablecoin (frozen|seized|clear|unknown - unknown = no act found and the pair's freeze history is not fully swept, never 'not frozen'). not_freezable[]: enabled stablecoins the issuer cannot freeze on this chain - token = symbol and token_address = contract, as in freeze[]; reason no_freeze_function (the contract has no freeze function) or no_freeze_authority (a Solana mint without a freeze authority) - e.g. the Binance-Peg USDT/USDC on BNB Chain, where enforcement is off-chain. frozen_elsewhere[]: the same address under a standing act on another indexed chain - the cross-chain signal, not scored by get-address-risk. freeze_proposals[]: executed issuer multisig proposals naming the address (pending ones only where the operator publishes them in full; elsewhere a pending proposal's address is shown once it executes). Class-F decoded facts, no heuristics.",
      "examples": [
        "Is 0x\u2026 frozen by a stablecoin issuer or OFAC-listed?"
      ],
      "id": "get-address-compliance",
      "inputSchema": {
        "properties": {
          "address": {
            "description": "The address in its network's own spelling: 0x\u2026 for EVM chains, T\u2026 for Tron, base58 for Solana. The answer writes it in the spelling of chain_id (address) and echoes what you sent (requested_address); address_respelled true means your spelling belongs to another kind of chain than chain_id (a T\u2026 address asked about an EVM chain, a 0x\u2026 address asked about Tron) \u2014 answered about the same bytes there, not refused, and the same owner only for a plain key account.",
            "type": "string"
          },
          "chain": {
            "description": "Chain, in any of four spellings: the id (8453 Base, 1 Ethereum, 10 Optimism, 42161 Arbitrum, 56 BNB Chain, 728126428 Tron, -1 Solana), the same id as a string, the network slug (networks[].slug: base, ethereum, optimism, arbitrum, bnb-chain, tron, solana) or its CAIP-2 id (networks[].caip2: eip155:1, solana:5eykt4UsFv8P8NJdTREpY1vzqKqZKvdp). Surrounding whitespace, a leading + and leading zeros are ignored, a JSON number counts by its value (1.0 is 1), slugs and CAIP-2 ids match in any letter case, and an empty, blank or null chain is no chain at all. Anything else (hex, a decimal fraction, a zero-padded CAIP-2 reference) is refused with -32602, and so is a network this scanner knows but does not index (absent from networks[]) \u2014 by name, never with an empty clean verdict. Without chain, the address's spelling picks it: 0x\u2026 \u2192 8453 Base, T\u2026 \u2192 Tron, base58 \u2192 Solana. The answer states the chain it is about (chain_id) and how it was chosen (chain_source: explicit|default|address_form), and lists where else this address has data (chains_with_data) \u2014 read that map before concluding; there is no auto-switch, ask again with chain set.",
            "type": [
              "integer",
              "string",
              "null"
            ]
          }
        },
        "required": [
          "address"
        ],
        "type": "object"
      },
      "name": "Address compliance facts",
      "tags": [
        "compliance",
        "freeze",
        "seize",
        "ofac",
        "sanctions"
      ]
    },
    {
      "description": "Indexer head/safe/finalized block, lag_blocks (head_block - last_indexed_block) and freshness_seconds (the age of the newest indexed transfer, the freshness measure on every chain) so the agent knows data recency. On Solana (chain -1) safe_block is the finalized slot, and lag_blocks is near 0 by construction and never negative, so it is not a freshness signal there: read freshness_seconds. On the EVM chains and Tron a negative lag_blocks means the node's head went back.",
      "examples": [
        "How fresh is the Base data right now?"
      ],
      "id": "get-sync-status",
      "inputSchema": {
        "properties": {
          "chain": {
            "default": 8453,
            "description": "Chain, in any of four spellings: the id (8453 Base, 1 Ethereum, 10 Optimism, 42161 Arbitrum, 56 BNB Chain, 728126428 Tron, -1 Solana), the same id as a string, the network slug (networks[].slug: base, ethereum, optimism, arbitrum, bnb-chain, tron, solana) or its CAIP-2 id (networks[].caip2: eip155:1, solana:5eykt4UsFv8P8NJdTREpY1vzqKqZKvdp). Surrounding whitespace, a leading + and leading zeros are ignored, a JSON number counts by its value (1.0 is 1), slugs and CAIP-2 ids match in any letter case, and an empty, blank or null chain is no chain at all. Anything else (hex, a decimal fraction, a zero-padded CAIP-2 reference) is refused with -32602, and so is a network this scanner knows but does not index (absent from networks[]) \u2014 by name, never with an empty clean verdict. Default 8453 (Base); on get-recent-transactions a T\u2026 or base58 payer/recipient filter selects Tron or Solana instead. The answer is about that one chain.",
            "type": [
              "integer",
              "string",
              "null"
            ]
          }
        },
        "type": "object"
      },
      "name": "Data freshness",
      "tags": [
        "freshness",
        "sync",
        "status"
      ]
    },
    {
      "description": "Newest stablecoin transfers on ONE chain, filterable by recipient/payer, cursor-paginated (next_cursor). Answer: items[], each row tx_hash, log_index, block_number, block_time (RFC 3339), payer, recipient, amount {amount (minor units, string), decimals, token (symbol)}, token (the contract address), finality, and usd_amount where priced. The chain is the one asked for \u2014 rows do not repeat it. Generic on-chain Transfer facts.",
      "examples": [
        "Latest stablecoin transfers received by 0x\u2026"
      ],
      "id": "get-recent-transactions",
      "inputSchema": {
        "properties": {
          "chain": {
            "default": 8453,
            "description": "Chain, in any of four spellings: the id (8453 Base, 1 Ethereum, 10 Optimism, 42161 Arbitrum, 56 BNB Chain, 728126428 Tron, -1 Solana), the same id as a string, the network slug (networks[].slug: base, ethereum, optimism, arbitrum, bnb-chain, tron, solana) or its CAIP-2 id (networks[].caip2: eip155:1, solana:5eykt4UsFv8P8NJdTREpY1vzqKqZKvdp). Surrounding whitespace, a leading + and leading zeros are ignored, a JSON number counts by its value (1.0 is 1), slugs and CAIP-2 ids match in any letter case, and an empty, blank or null chain is no chain at all. Anything else (hex, a decimal fraction, a zero-padded CAIP-2 reference) is refused with -32602, and so is a network this scanner knows but does not index (absent from networks[]) \u2014 by name, never with an empty clean verdict. Default 8453 (Base); on get-recent-transactions a T\u2026 or base58 payer/recipient filter selects Tron or Solana instead. The answer is about that one chain.",
            "type": [
              "integer",
              "string",
              "null"
            ]
          },
          "cursor": {
            "type": "string"
          },
          "limit": {
            "default": 25,
            "description": "Max rows, 1..200. A value outside the range is refused with -32602, as REST refuses it.",
            "maximum": 200,
            "minimum": 1,
            "type": "integer"
          },
          "payer": {
            "type": "string"
          },
          "recipient": {
            "type": "string"
          }
        },
        "type": "object"
      },
      "name": "Recent transactions",
      "tags": [
        "transfers",
        "transactions",
        "feed",
        "stablecoin"
      ]
    },
    {
      "description": "OFAC SDN sanction-list coverage: how many EVM + Solana + Tron addresses are ingested (free public 0xB10C list, US-Gov public-domain data) and when it was last refreshed. Heuristic exposure signal \u2014 not legal advice; verify against the official SDN list. No params.",
      "examples": [
        "When was the OFAC dataset last refreshed?"
      ],
      "id": "get-sanctions-status",
      "inputSchema": {
        "properties": {},
        "type": "object"
      },
      "name": "OFAC sanctions coverage",
      "tags": [
        "sanctions",
        "ofac",
        "dataset",
        "coverage"
      ]
    },
    {
      "description": "Bounded walk over the indexed stablecoin settlement flow graph from a wallet: payer<->recipient hops, value-weighted score, entity-aware keys, attributed-node stop option, and sanctioned-node markers. Explainability primitive only \u2014 NOT a detector verdict, identity/control assertion, AML decision, or legal advice. window_from present means the answer was built from that date, the edge-grain horizon, not from the start of the requested window; the default window all, 90d and 1y included (/v1/methodology edge_grain_horizon). When window_from is present, read the graph as covering that span only \u2014 do not treat the absence of a counterparty, a path or a sanctioned node as evidence about anything before that date. volume on nodes is the token's raw minor units (divide by 10^decimals); volume_usd6 is the same amount in USD with 6 decimals at peg 1. On Solana (chain -1) the answer carries coverage_status for the subject address only, never for its counterparties: pending \u2014 its history is still being filled, so an empty or small answer is not final; partial \u2014 filled to a documented bound. The walk shows a finished fill after the next Solana rollup pass (about 10 minutes), and never shows history older than window_from. This read never starts a fill, so pending can also mean none was asked for yet: one compliance read of the address asks for it. A Solana answer without coverage_status could not read it in time \u2014 treat it as pending. On Solana (chain -1) the edge grain of 2026-07-20..2026-09-14 is incomplete: those days hold part of their transfers or none, because their raw rows were offloaded before a fix reached production on 2026-09-17; they are not restored, and answers do not mark them (decision of 2026-09-17). Solana's grain is never trimmed, so there the horizon that window_from reports is not where retained data ends: once window_from is later than 2026-09-14 the answer holds none of those days. An answer that reaches them \u2014 window_from on or before 2026-09-14, or no window_from over a window that includes them \u2014 counts them as floors: at least this much, never the whole, and a counterparty, path or sanctioned node missing from those days is not evidence that there was none.",
      "examples": [
        "Where did funds from 0x\u2026 flow, two hops out?"
      ],
      "id": "get-wallet-graph-walk",
      "inputSchema": {
        "properties": {
          "address": {
            "description": "The address in its network's own spelling: 0x\u2026 for EVM chains, T\u2026 for Tron, base58 for Solana. The answer writes it in the spelling of chain_id (address) and echoes what you sent (requested_address); address_respelled true means your spelling belongs to another kind of chain than chain_id (a T\u2026 address asked about an EVM chain, a 0x\u2026 address asked about Tron) \u2014 answered about the same bytes there, not refused, and the same owner only for a plain key account.",
            "type": "string"
          },
          "chain": {
            "description": "Chain, in any of four spellings: the id (8453 Base, 1 Ethereum, 10 Optimism, 42161 Arbitrum, 56 BNB Chain, 728126428 Tron, -1 Solana), the same id as a string, the network slug (networks[].slug: base, ethereum, optimism, arbitrum, bnb-chain, tron, solana) or its CAIP-2 id (networks[].caip2: eip155:1, solana:5eykt4UsFv8P8NJdTREpY1vzqKqZKvdp). Surrounding whitespace, a leading + and leading zeros are ignored, a JSON number counts by its value (1.0 is 1), slugs and CAIP-2 ids match in any letter case, and an empty, blank or null chain is no chain at all. Anything else (hex, a decimal fraction, a zero-padded CAIP-2 reference) is refused with -32602, and so is a network this scanner knows but does not index (absent from networks[]) \u2014 by name, never with an empty clean verdict. Without chain, the address's spelling picks it: 0x\u2026 \u2192 8453 Base, T\u2026 \u2192 Tron, base58 \u2192 Solana. The answer states the chain it is about (chain_id) and how it was chosen (chain_source: explicit|default|address_form), and lists where else this address has data (chains_with_data) \u2014 read that map before concluding; there is no auto-switch, ask again with chain set.",
            "type": [
              "integer",
              "string",
              "null"
            ]
          },
          "frontier_cap": {
            "type": "integer"
          },
          "hops": {
            "type": "integer"
          },
          "stop_at_attributed": {
            "default": true,
            "type": "boolean"
          },
          "stop_on_sanctioned": {
            "default": false,
            "type": "boolean"
          },
          "token": {
            "description": "Token symbol, e.g. USDT. REQUIRED: the server does not guess it. Each asset hub page (pages[].asset) names its own token, and the walk answers about THAT token only.",
            "type": "string"
          },
          "window": {
            "default": "all",
            "description": "Time window",
            "enum": [
              "1h",
              "24h",
              "7d",
              "30d",
              "90d",
              "1y",
              "all"
            ],
            "type": "string"
          }
        },
        "required": [
          "address",
          "token"
        ],
        "type": "object"
      },
      "name": "Wallet graph walk",
      "tags": [
        "graph",
        "flow",
        "walk",
        "tracing",
        "explainability"
      ]
    }
  ],
  "supportedInterfaces": [
    {
      "protocolBinding": "JSONRPC",
      "protocolVersion": "1.0",
      "url": "https://stablescan.achivx.com/a2a"
    }
  ],
  "url": "https://stablescan.achivx.com",
  "version": "1.4.0",
  "x-mcp": {
    "connect": "claude mcp add stablescan --transport http https://stablescan.achivx.com/mcp",
    "description": "Same telemetry over Model Context Protocol (for MCP clients).",
    "endpoint": "https://stablescan.achivx.com/mcp",
    "transport": "http"
  }
}