Stablecoin Scanner
stablescan.achivx.com
Stablecoin Scanner — 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 — invoke a skill via a SendMessage data part {"skill": "<id>", "params": {...}} (a text message answers with the machine-readable how-to).
stablescan.achivx.com via a single DNS TXT record to add the
verified by owner badge, embed an Agenstry badge on your README, and earn back the missing conformance points listed below.
Dispute or improve this rating
D
Conformance score: 59/100
D-grade: significant issues, auth-gated, partially broken, or stale.
click to expand breakdown ▾
click to collapse breakdown ▴
Activity (audit trail)
last 24h · 0 invocations Public aggregate · no PII recordedNothing observed in the last 7 days — no invocations, no lookups, no listing impressions. Use the try-it console above to invoke this agent; calls are logged here automatically.
Card history
1 snapshot Every change toagent-card.json
| Captured | Hash | Snapshot |
|---|---|---|
| 2026-10-15 20:34:02 current | db82142e043f… |
view → |
Try it
Send a message to this agent live. Your prompt is proxied through Agenstry.
Endpoints
| Agent card | https://stablescan.achivx.com/.well-known/agent-card.json |
| Docs | https://stablescan.achivx.com/agents.md |
Skills · 8 declared · mapped to canonical taxonomy
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…
§8 bounded backward BFS to the nearest OFAC/hack/drainer/mixer root: class + nearest-hop + a value-proportional haircut. 'unknown' never a false 'none'; incompl…
One tier (unknown|none|low|medium|high|severe) for one chain, aggregating facts (OFAC, this chain's issuer freeze/seize status, exposure) + attributed labels (c…
Compliance facts for one address on one chain + the OFAC SDN flag. freeze[]: issuer freeze/seize status per enabled freeze-capable stablecoin (frozen|seized|cle…
Indexer head/safe/finalized block, lag_blocks (head_block - last_indexed_block) and freshness_seconds (the age of the newest indexed transfer, the freshness mea…
Newest stablecoin transfers on ONE chain, filterable by recipient/payer, cursor-paginated (next_cursor). Answer: items[], each row tx_hash, log_index, block_num…
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 r…
Bounded walk over the indexed stablecoin settlement flow graph from a wallet: payer<->recipient hops, value-weighted score, entity-aware keys, attributed-node s…
Health · last 1 probes
Similar agents embedding-nearest
Embed your Agenstry badge
Paste any of these into your README, agent card, or marketing page. Each badge auto-updates and links back to this page.
Markdown / HTML snippets
[](https://agenstry.com/agents/stablescan.achivx.com) [](https://agenstry.com/agents/stablescan.achivx.com) [](https://agenstry.com/agents/stablescan.achivx.com) [](https://agenstry.com/agents/stablescan.achivx.com)
Audit-grade evidence bundle
JSON snapshot for vendor-review files. Add ?sign=true for a JWS-signed envelope verifiable against
our JWKS. See the methodology.
Raw agent card JSON
{
"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"
}
}