{"audit":{"version":"1.5","generated_at":"2026-10-15T22:39:38.871632+00:00","generated_by":"Agenstry","report_url":"https://agenstry.com/agents/stablescan.achivx.com","methodology_url":"https://agenstry.com/methodology","verifier_jwks_url":"https://agenstry.com/.well-known/jwks.json","subject":{"domain":"stablescan.achivx.com","name":"Stablecoin Scanner","url":"https://stablescan.achivx.com/.well-known/agent-card.json"}},"identity":{"provider":{"organization":null,"url":null},"registry_verification":null,"signature":{"signed":false,"signature_valid":null}},"protocol":{"version":"1.0","supports_streaming":false,"supports_push_notifications":false},"operational":{"live_state":"live","live_responds":true,"last_status_code":200,"last_elapsed_ms":127,"last_error":null},"track_record":{"first_seen":"2026-10-15T20:34:02.524248+00:00","last_checked":"2026-10-15T20:34:02.524248+00:00","last_seen_ok":"2026-10-15T20:34:02.524248+00:00","checks_total":1,"checks_ok":1,"uptime_pct":100.0,"uptime_window_days":30,"uptime_probes":1,"archived":false,"archived_reason":null},"conformance":{"score":59,"grade":"D","summary":"D-grade: significant issues, auth-gated, partially broken, or stale.","criteria":[{"key":"valid_card","label":"Valid AgentCard","points":10,"max_points":10,"status":"pass","detail":"Parseable AgentCard returned by the well-known endpoint (Agenstry readiness signal; not an official TCK certification)."},{"key":"live_responds","label":"Live JSON-RPC","points":25,"max_points":25,"status":"pass","detail":"Endpoint responds to a negotiated A2A SendMessage probe (answers in ~241 ms)."},{"key":"protocol_version","label":"Protocol version","points":10,"max_points":10,"status":"pass","detail":"Declares A2A 1.0 with supportedInterfaces[] (current v1 card shape)."},{"key":"signature","label":"JWS signature","points":0,"max_points":10,"status":"info","detail":"Card is unsigned (most published agents are)."},{"key":"uptime","label":"Uptime track record","points":0,"max_points":15,"status":"info","detail":"Only 1 probe so far, need ≥5 for an uptime grade."},{"key":"skills","label":"Skill declaration","points":10,"max_points":10,"status":"pass","detail":"Declares 8 skills with structured metadata."},{"key":"verified_identity","label":"Verified Identity","points":0,"max_points":10,"status":"fail","detail":"No provider organisation declared. Anonymous agent."},{"key":"freshness","label":"Freshness + modern flags","points":4,"max_points":5,"status":"pass","detail":"seen in upstream source within 0d"},{"key":"security","label":"Security declaration","points":0,"max_points":5,"status":"info","detail":"Neither securitySchemes nor securityRequirements declared — how to authenticate is unstated."}]},"card_read":{"findings":[],"clean":true,"source_url":"https://stablescan.achivx.com/.well-known/agent-card.json"},"skills":[{"id":"get-address-approvals","name":"Open allowances + approval-risk","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'.","tags":["allowances","approvals","erc20","permit2","risk"],"examples":["Which spenders can still move stablecoins out of 0x…?"],"inputModes":[],"outputModes":[],"inputSchema":{"properties":{"address":{"description":"The address in its network's own spelling: 0x… for EVM chains, T… 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… address asked about an EVM chain, a 0x… address asked about Tron) — 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[]) — by name, never with an empty clean verdict. Without chain, the address's spelling picks it: 0x… → 8453 Base, T… → Tron, base58 → 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) — read that map before concluding; there is no auto-switch, ask again with chain set.","type":["integer","string","null"]}},"required":["address"],"type":"object"}},{"id":"get-address-exposure","name":"Taint/exposure verdict","description":"§8 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.","tags":["taint","exposure","sanctions","aml","risk"],"examples":["How close is 0x… to a sanctioned or hacked source?"],"inputModes":[],"outputModes":[],"inputSchema":{"properties":{"address":{"description":"The address in its network's own spelling: 0x… for EVM chains, T… 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… address asked about an EVM chain, a 0x… address asked about Tron) — 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[]) — by name, never with an empty clean verdict. Without chain, the address's spelling picks it: 0x… → 8453 Base, T… → Tron, base58 → 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) — read that map before concluding; there is no auto-switch, ask again with chain set.","type":["integer","string","null"]}},"required":["address"],"type":"object"}},{"id":"get-address-risk","name":"Unified risk verdict","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, ≥2 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.","tags":["risk","verdict","screening","compliance"],"examples":["Is 0x… risky to interact with?","{\"skill\":\"get-address-risk\",\"params\":{\"chain\":1,\"address\":\"0x5754284f345afc66a98fbb0a0afe71e0f007b949\"}}"],"inputModes":[],"outputModes":[],"inputSchema":{"properties":{"address":{"description":"The address in its network's own spelling: 0x… for EVM chains, T… 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… address asked about an EVM chain, a 0x… address asked about Tron) — 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[]) — by name, never with an empty clean verdict. Without chain, the address's spelling picks it: 0x… → 8453 Base, T… → Tron, base58 → 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) — read that map before concluding; there is no auto-switch, ask again with chain set.","type":["integer","string","null"]}},"required":["address"],"type":"object"}},{"id":"get-address-compliance","name":"Address compliance facts","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.","tags":["compliance","freeze","seize","ofac","sanctions"],"examples":["Is 0x… frozen by a stablecoin issuer or OFAC-listed?"],"inputModes":[],"outputModes":[],"inputSchema":{"properties":{"address":{"description":"The address in its network's own spelling: 0x… for EVM chains, T… 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… address asked about an EVM chain, a 0x… address asked about Tron) — 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[]) — by name, never with an empty clean verdict. Without chain, the address's spelling picks it: 0x… → 8453 Base, T… → Tron, base58 → 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) — read that map before concluding; there is no auto-switch, ask again with chain set.","type":["integer","string","null"]}},"required":["address"],"type":"object"}},{"id":"get-sync-status","name":"Data freshness","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.","tags":["freshness","sync","status"],"examples":["How fresh is the Base data right now?"],"inputModes":[],"outputModes":[],"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[]) — by name, never with an empty clean verdict. Default 8453 (Base); on get-recent-transactions a T… or base58 payer/recipient filter selects Tron or Solana instead. The answer is about that one chain.","type":["integer","string","null"]}},"type":"object"}},{"id":"get-recent-transactions","name":"Recent transactions","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 — rows do not repeat it. Generic on-chain Transfer facts.","tags":["transfers","transactions","feed","stablecoin"],"examples":["Latest stablecoin transfers received by 0x…"],"inputModes":[],"outputModes":[],"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[]) — by name, never with an empty clean verdict. Default 8453 (Base); on get-recent-transactions a T… 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"}},{"id":"get-sanctions-status","name":"OFAC sanctions coverage","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 — not legal advice; verify against the official SDN list. No params.","tags":["sanctions","ofac","dataset","coverage"],"examples":["When was the OFAC dataset last refreshed?"],"inputModes":[],"outputModes":[],"inputSchema":{"properties":{},"type":"object"}},{"id":"get-wallet-graph-walk","name":"Wallet graph walk","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 — 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 — 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 — its history is still being filled, so an empty or small answer is not final; partial — 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 — 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 — window_from on or before 2026-09-14, or no window_from over a window that includes them — 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.","tags":["graph","flow","walk","tracing","explainability"],"examples":["Where did funds from 0x… flow, two hops out?"],"inputModes":[],"outputModes":[],"inputSchema":{"properties":{"address":{"description":"The address in its network's own spelling: 0x… for EVM chains, T… 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… address asked about an EVM chain, a 0x… address asked about Tron) — 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[]) — by name, never with an empty clean verdict. Without chain, the address's spelling picks it: 0x… → 8453 Base, T… → Tron, base58 → 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) — 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"}}],"provenance":[{"source":"smithery","first_seen":"2026-10-15T20:34:02.524248+00:00"}],"recent_probes":[{"fetched_at":"2026-10-15T20:34:02.524248+00:00","ok":true,"status_code":200,"error":null,"elapsed_ms":127,"live_responds":true}],"catalog_attestation":null,"operator_revenue_evidence":{"evidence_class":"operator_submitted","authenticity":{"rung":"no_operator_evidence","rank":0,"why":"No verifiable operator evidence has been submitted for this agent.","thresholds":{"min_independent_payers":3,"min_verified_usd":25.0},"engine_table":"agent_authenticity","merge_rule":"max(existing_rank, rank)"},"metric_metadata":{"provenance":"operator_submitted_evidence","confidence":"attested","coverage":{"numerator":0},"as_of":"2026-10-15T22:39:38.887368+00:00","definition":"Revenue proofs submitted by the verified owner and re-checked by Agenstry against the settlement chain or the operator's own Stripe account. Only independently confirmed proofs are counted."},"counts":{"retained":0,"verified":0,"unverifiable":0},"verified":{"gross_usd":0.0,"transactions":0,"independent_payers":0},"detail_url":"https://agenstry.com/api/agents/stablescan.achivx.com/evidence","dispute_url":"https://agenstry.com/agents/stablescan.achivx.com/dispute"},"verification_history":[]}