CoinOpSelect Research
Agent-to-Agent Micro-Economies › Security & Governance › Zero-Storage Verticals

Finding #059 - Pre-Payment Counterparty Screening Is a Live Market: the Sanctioned Address List Has 38 Entries, Not One, and the Money Is in Flows, Not Hits

Finding #059  |  2026-10-21  |  19 sources  |  revision ddcac87191c8
Source document: finding-059-prepayment-counterparty-screening-taint-route.html
ID: #059 Date: 2026-10-21 Type: finding Streams: 2, 3, 9 Tags: revenue-route, x402, screening, sanctions, ofac, taint, mixer, exploit, counterparty, verdict, pricing, demand, bazaar, measurement, high-value
The brief's uncovered headline is true, and we verified it on-chain ourselves. On 2026-10-20 a single address sent 25,710 ETH into one of OFAC's listed Tornado Cash addresses. We pulled the transfers ourselves from Ethereum mainnet: 866 plain ETH transfers worth 31,218.7 ETH into the 38 OFAC-listed addresses in the last ~30 hours, of which 31,074.2 ETH landed on 2026-10-20 alone, from 123 distinct senders in the mixer's fixed 100-ETH and 10-ETH chunks. The headline number ($61.56M) is exactly 25,710 ETH at the then-current price. The primary source is not a news article: it is the chain, and the counterparty list is a government document.
And the screen everyone would build is wrong by a factor of 38. OFAC's 2022-08-08 designation lists 38 addresses for Tornado Cash alone. The one address every blog post quotes - 0x8589427373D6D84E98730D7795D8f6f8731FDA16 - holds 0.0076 ETH and 0.9 USDC today. The address the Drift proceeds actually went into, 0xd90e2f92...24F31b, received 30,157 ETH in one day, and the pool contracts 0xA160cdAB...53f291 and 0x910Cbd52...39DbF now hold 251,900 ETH and 22,800 ETH. Measured across the whole list: 279,610.90 ETH and 30,750.65 USDC of sanctioned funds, of which only 10 of the 38 addresses hold anything at all. A screen that checks one contract returns "clear" for 279,610 ETH of sanctioned money.
The paid market is real but small, and its price law is the opposite of the usual undercut rule. Own pull of the public CDP x402 discovery registry (28,001 listings, 2,681 hosts, 819,692 calls, $88,231.31 list-price revenue per 30 days): the address/agent screening family is 947 listings, 353 hosts, 15,987 calls, $323.90, with 24 routes over the repeat-buyer bar. We hand-audited all 24 against their own live 402 challenges: 13 are genuine counterparty/agent-risk screens, 11 are false positives (LLM prompt-injection detection, software supply-chain scanning, a SAM.gov debarment list, ENS resolution, three Cosmos chain RPCs, an email validator, a Cloudflare bypass, a token screener). The genuine ten earn $5.40 in 30 days. What they show is the shape: revenue per distinct buyer rises monotonically with price - $0.025 at the $0.001-$0.005 tier, $0.05 at $0.01, $0.77 at $0.05, $3.70 at $0.10, $21.60 at $0.216. Nobody in this family prices to the cheapest competitor; they price to what one buyer is worth.

Summary

The 2026-10-21 brief's only uncovered money-making item was the "wallet linked to Drift exploit sends $61M to Tornado Cash" headline (tagged risk, Stream 3/9) alongside the Qubic weak-seed hack (tagged risk, Stream 3/9). Every other brief item was already published: Coinbase's stablecoin report (article), Utah/Kalshi (#057), Injective/BDACS (#054), Project Eleven/Relm insurance (#055), CFTC Frontier Forum (#058), OpenAI/Orchestra Bio (a low-signal acquisition story with no reachable paid route). The backlog was closed - every open item is a revisit due 2026-10-27 or later - so this cycle also ran the mandatory revenue-route pass, and the risk headlines turned out to be the best available seed for it.

Why? Because a hack that ends with $61.5M of stolen funds going into an OFAC-sanctioned mixer is not a news event, it is a product requirement. It is the clearest possible statement of what an agent about to pay an address needs to know, and it names the buyer: the agent, the wallet, the compliance officer behind it. The Qubic incident says the same thing from the other side: a claim can be forged with a valid signature when the key material was weak, so proof of ownership cannot rest on a signature.

Three results came out. First, the on-chain facts, verified directly rather than read from a headline. Second, the market measurement, which is thin in dollars but sharp in shape and which contains a genuine negative result: not one route priced at $0.10 or above clears the five-distinct-buyer bar, even though that band holds $138.54 of the family's revenue - it is one-to-three buyers making 70-100 calls each, which is a contract business, not a route business. Third, a completeness defect that a naive implementation of our existing wallet-risk todo would have shipped: the sanctioned address list is 38 entries, and the one everybody quotes is empty.

Part 1 - The Primary Sources

1.1 The sanction itself (US Treasury, primary)

OFAC's "Cyber-related Designation", release date 08/08/2022 - "U.S. Treasury Sanctions Notorious Virtual Currency Mixer Tornado Cash" - added TORNADO CASH (a.k.a. TORNADO CASH CLASSIC; a.k.a. TORNADO CASH NOVA) to the SDN List with 38 digital currency addresses: 37 for ETH and the same set for USDC. The canonical contract 0x8589427373D6D84E98730D7795D8f6f8731FDA16 is listed for both ETH and USDC, so a USDC balance at that address is sanctioned too. No other designation, license or relief covers these addresses, and the list has not been amended since.

1.2 The flows (Ethereum mainnet, measured today)

We read the chain directly through a public RPC (https://ethereum-rpc.publicnode.com), by chunking the 38 OFAC addresses through eth_getLogs (the RPC caps a filter at 10 addresses) and then re-reading every touched block with full transactions.

Measurement (2026-10-21, block 26,238,329)Value
Plain ETH transfers into the 38 OFAC addresses, last 9,000 blocks (~30 h)866 transfers / 31,218.7 ETH
Of which on 2026-10-2031,074.2 ETH
Largest single sender (2026-10-20)0xaa843ed65c1f061f111b5289169731351c5e57c1 - 25,710 ETH
Destination of that flow0xd90e2f925DA726b50C4Ed8D0Fb90Ad053324F31b - 30,157.1 ETH received
Distinct senders in the window123 (chunks of 100 ETH and 10 ETH, the mixer's fixed pools)
Aggregate balance, all 38 addresses279,610.90 ETH + 30,750.65 USDC
Addresses with deployed code / holding anything37 of 38 / only 10
Canonical contract 0x8589...FDA160.007644358181597224 ETH, 0.9 USDC
Largest pool 0xA160cdAB...53f291 / 0x910Cbd52...39DbF251,900 ETH / 22,800 ETH
The product consequence is precise. A sanctions screen is only as good as its address list, and the list is 38 entries long, 37 of which carry code, 10 of which hold funds, and none of which is the one everybody has memorised. Worse, the address that receives the deposit is not the address that holds the funds: Tornado Cash forwards deposits onward to pool contracts within a block or two, so a balance-only screen on the receiving address reads "empty" and a balance-only screen on the pool reads "not a depositor". The screen has to carry the whole list plus the forwarding relationship, and it has to say which of them it checked.

1.3 The Qubic claim platform (primary, and a design lesson)

Qubic's own recovery site (https://weak-seed-reclaim.qubic.org/, linked from the project's statement and the fixed wallet release v4.26.4) documents the post-exploit payout process, and one sentence in it is worth more than the rest of the incident:

"Why a signed message is not enough - and what proves ownership. The incident happened because these seeds are weak. That means the attacker can produce the same valid signature you can. So a signature alone cannot prove the funds are yours - it only links your claim to your new destination. Ownership is decided by evidence the attacker cannot have, reviewed by core devs." - Qubic weak-seed reclaim platform, read 2026-10-21

The rest of the process is a usable pattern: a claim window open to 2027-05-01; two lanes (fast for strongly evidenced uncontested claims, extended for contested ones); a 7-day public dispute window in which approved claims are published as address and amount only before payout; and two different payout sources with different speeds and different dependencies - funds still on the chain come from a recovery escrow, funds that reached an exchange come back only through the exchange and law enforcement. A transferable primitive for our own escrow and attestation work: a signed artefact proves the payload, never the ownership, and a claim needs out-of-band evidence plus a dispute window plus an adjudicator.

Part 2 - Demand Measurement (Our Own Pull, 2026-10-21T~03:40Z)

Registry: 28,001 listings, 2,681 hosts, 819,692 calls, $88,231.31 list-price revenue over 30 days (57 pages at limit=500, 94.5 MB). Sanity check against the previous cycle: finding #058 measured 27,983 listings and $87,929.05 for the same endpoint about an hour earlier - consistent, and the only difference is growth.

Classification is deliberately strict: a listing enters the screening family only if its own description names a screening subject (wallet / address / payee / counterparty / account / holder) and a screening context (sanctions / screen / block / taint / mixer / exploit / risk / trust). Keyword families were then split into SCREEN-SANCTION (899 listings, 15,801 calls, $319.93) and SCREEN-TAINT (48 listings, 186 calls, $3.97) - mixer, stolen-fund and exploit-provenance terms. Combined: 947 listings, 353 hosts, 15,987 calls, $323.90, which is 0.37% of measured registry revenue.

Price bandListingsCallsRevenueRoutes over the 5-buyer barBest single buyer
≤ $0.0052779,780$46.011522 payers
$0.005 - $0.024174,451$59.24812 payers
$0.02 - $0.051321,046$43.9618 payers
$0.05 - $0.1047368$34.16019 payers
$0.10 - $0.5058314$69.2103 payers
> $0.501628$71.3302 payers
Two laws, and they point in opposite directions. (1) Buyer depth lives at the bottom: the $0.001-$0.02 bands hold 694 of the 947 listings, 14,231 of the 15,987 calls and 23 of the 24 qualified routes. (2) Money per buyer lives at the top: the $0.10+ bands hold $140.54 (43% of family revenue) across not a single route over the five-distinct-buyer bar, because those routes have one to three payers making 70-100 calls each. Neither of those is a marketplace price. It is a price to one buyer.

2.1 The hand audit (why the family numbers must be read carefully)

We fetched the live 402 challenge of every one of the 24 qualified routes and read the seller's own description. 13 are genuine counterparty or agent-risk screens; 11 are false positives that a keyword rule swept in: agent.pocket.network/v1/prompt-injection-detect (LLM text classification), /v1/taint-check (software supply-chain scanning - "taint" here means a malicious npm package, not tainted crypto), /v1/debarment-exclusion (SAM.gov exclusions), /v1/name-resolution (ENS), /v1/kava, /v1/pocket, /v1/juno (Cosmos chain RPC), api.oblique.markets/.../solana-priority-fee (network state), agdata.shveik.dev/x402/unblock (Cloudflare bypass), netintel.dev/email/verify (email validation), api.solenrich.com/.../stonk-screener (token screener). Two earlier passes produced the same class of error - a taint route that screens packages, a "commodity-price" route classified as counterparty provenance because its description contains the word "provenance". The numbers below use only audited routes.

2.2 The ten genuine routes, and what they earn per buyer

Route (live 402 verified)PricePayersCallsCalls/buyer30-day revenueRevenue per buyer
intel.twzrd.xyz/v1/intel/quick/:solana_address - seller wash risk + wallet reputation$0.0016488.0$0.05$0.008
x402check.xyz/v1/risk-check - OFAC + phishing/drainer feeds, signed verdict$0.00355255.0$0.09$0.018
sanctions.cyberwarex.com/screen - OFAC + taint set (mixer/hack/scam), BLOCK/REVIEW/ALLOW$0.0055428.4$0.21$0.042
sanctions.nsgoods.org/screen - signed multi-chain OFAC SDN (Base or Solana USDC)$0.0056183.0$0.09$0.015
x402-endpoints.onrender.com/compliance/wallet-screen - AML/KYT with mixer (Tornado Cash) exposure$0.0055163.2$0.08$0.016
api.aurelianflo.com/api/ofac-wallet-screen/:address - exact match vs Treasury's SDN advanced XML$0.0155410.8$0.54$0.108
agents.dyoeway.org/verify - scam/phishing/rug screening of site, business or wallet$0.015183.6$0.18$0.036
sanctions.nsgoods.org/screen-multi - OFAC/UN/EU/UK, each with its own list date, signed verdict$0.015163.2$0.16$0.032
api.craigmbrown.com/v1/services/agent.trust-badge - agent settlement-history badge$0.015153.0$0.15$0.030
api.losbeto.xyz/whale-alert - large on-chain USDC/SOL movement watchlist with the wallets involved$0.0557715.4$3.85$0.77

These ten are $5.40 of the $323.90 family (1.7%). The market is small. What it is not is shapeless: $3.85 of the $5.40 (71%) comes from one $0.05 route that is not a sanctions check at all - it is a flow watchlist that reports the wallets involved in large movements. The Drift story is precisely such a flow: 25,710 ETH moving out of an exploit-linked address into a mixer, in a two-hour window, in 100-ETH chunks. A buyer who wants to know "did sanctioned or stolen money just move near me" is buying the flow, not the hit.

Above $0.10 the family becomes a contract business, and the numbers say so clearly: api.losbeto.xyz/wallet-scan $0.10 (2 payers, 74 calls, $3.70 per buyer), api.losbeto.xyz/launch-risk $0.10 (3 payers, 75 calls, $2.50 per buyer), api.losbeto.xyz/job/wallet-audit $0.15 (1 payer, 71 calls, $10.65 per buyer), api.strale.io/x402/sanctions-check $0.216 (1 payer, 100 calls, $21.60 per buyer). One buyer, seventy to one hundred calls, no marketplace competition - that is a report or an alert feed, and it should be priced to the buyer, not to the cheapest competitor.

Part 3 - What the Market Publishes as the Product Spec

The live 402 bodies carry the output schema, and the schemas converge on one shape. This is sanctions.nsgoods.org/screen's own advertised output, verbatim from its discovery metadata:

{ address, chain, sanctioned: true, matched_label: "ETH", verdict: "deny", sdn_snapshot_at: "2026-07-24T20:02:09Z", sources: { ofac_sdn: "ok" }, coverage: { malicious_heuristic: "not_checked", total_sdn_addresses: 960 }, signed_by: "0x57fF...", signature: "0x..." }

Four elements of that shape are not optional, and each of them is a decision we would otherwise get wrong:

The verdict vocabulary is also converging, and it is worth copying because it is a gate and not a score: allow / review / decline (OceanAlt), BLOCK / REVIEW / ALLOW (cyberwarex), safe / caution / avoid (dyoeway, Verdix). And OceanAlt publishes the standard it claims (RAP - Responsible Agentic Payments) plus a free, offline-verifiable evidence bundle:

OceanAlt's free tier is the competitive fact that matters most. GET /api/decide is free, keyless, CORS-enabled, and returns the same decision as the paid endpoint, without settlement. /api/risk (one address), /api/risk/recent, /api/endpoint (is this payment URL a phishing host), /api/payment-request (an email or invoice asks my agent to pay - screen the sender, links, payee and wording) and /api/evidence/bundle - a signed, self-contained bundle verifiable offline with the key at /.well-known/oceanalt-keys.json - are all free. The paid x402 endpoints are Base USDC: batch (25 addresses) $0.10, trace $0.20, decision $0.30.

Therefore: a paid single-address hit/no-hit screen has no market. It is free at OceanAlt, free-to-compare at nsgoods and cyberwarex, and worth $0.001-$0.01 per call when paid at all. The paid product has to be what the free tier cannot do: settlement, bulk, tracing, and a signed artefact a third party can check.

One more primary source belongs here, because it prices the risk of getting this wrong. The USENIX Security '26 paper "When HTTP 402 Meets the Blockchain: Risks on Emerging x402 Payments" (EPFL; 119 million Base and Solana transactions measured) documents Attack IV: an attacker who can shape catalogue metadata - Sybil listings, price and latency cues - can steer an agent toward a bad paid endpoint before the agent reasons about it at all. In this family that is a live hazard: a buyer asking "is this address safe?" is asking a paid, self-interested endpoint, and the answer may be a lie. A verdict a buyer can verify offline is not a nicety here; it is the defence.

Part 4 - Where We Stand, and the Defect in Our Own Code

Our shipped route /api/v1/query/wallet-risk is deriveWalletRisk in streams/stream-9-zerostorage/stateless-queries.js:106. It returns, per network, ETH and USDC balances and totals, plus two flags (empty_wallet, high_value). It contains no sanctions data, no labels, no taint, no age, no activity. It is priced like a screening route and shaped like a balance read - exactly what finding #041 wrote down, now with the market's response shape and price ladder measured.

Separately, a hard defect in our own measurement code: streams/shared/bazaar-demand-reader.js now fails against the live registry. The CDP endpoint at limit=1000 returns more than 1 MB, and requestJson caps responses at 1,048,576 bytes, so readDemand() throws HttpError: Response too large. Measured: 57 pages at limit=500, 94.5 MB in total, largest single page 3.34 MB. Every demand figure in this repository, and the route-liveness-004 monitor that is supposed to watch our own listings, are currently unreadable.

Recommendations

  1. counterparty-screen-001 - build the pre-payment screen, and make the list complete. [HIGH] A new paid route (or the rebuilt /api/v1/query/wallet-risk) that answers "may my agent pay this address?" with the market's own shape: { verdict: allow|review|decline, sanctioned, matched_label, taint[], coverage: { sdn_addresses_checked, sdn_snapshot_at, sources, not_checked[] }, sources[], as_of }. The data source must be the complete OFAC address list - 38 entries for Tornado Cash alone, of which 10 hold funds today, worth 279,610 ETH - not the one contract everyone quotes, and it must record the forwarding relationship to the pool contracts so a "depositor" is not scored as "empty". Never answer "safe": answer clear or no_known_risk. Never charge for a failed check. Sign the response (Ed25519, JWKS, free verification endpoint - finding #055) and add the point-in-time re-screen (&on=YYYY-MM-DD). Price the single-address call at $0.005 (cyberwarex, nsgoods, x402-endpoints) - the tier where the buyer depth is.
  2. counterparty-batch-001 - ship the batch, because that is where the paid money is. [MEDIUM] POST /api/v1/query/wallet-risk/batch for up to 25 addresses in one settlement at $0.10 (OceanAlt's measured batch price; finding #035's comparables were $0.08). Update s2-todo-012, which currently carries $0.05-$0.08.
  3. screen-price-ladder-001 - price the decision tier by what one buyer is worth, not by the cheapest competitor. [HIGH] This inverts the rule finding #041 encoded into s2-todo-013 ("price ≤ the passing seller's price"). Measured in this family, revenue per distinct buyer rises monotonically with price: $0.008 at $0.001, $0.042 at $0.005, $0.108 at $0.01, $0.77 at $0.05, $3.70 at $0.10, $21.60 at $0.216. A single-address screen is a $0.005-$0.01 commodity; a flow alert or a wallet report is a $0.05-$0.30 product bought by one buyer who then calls it 70-100 times. Build the price map with three tiers - read $0.005, batch $0.10, report/alert $0.05-$0.30 - and sell the top tier as a report or an alert feed, not as a per-call marketplace route.
  4. flow-alert-001 - the money in this family is a flow, not a hit. [MEDIUM] 71% of the audited screen revenue comes from one $0.05 route that reports large on-chain movements and the wallets involved, and the Drift story is exactly that shape: 25,710 ETH out of an exploit-linked address into a sanctioned address inside two hours, in 100-ETH chunks. A route that answers "which addresses received large flows from a sanctioned or exploit-linked address in the last N hours, and how much" is the product this incident creates demand for. We have the on-chain readers to build it and we have already written the list we would watch. Do not build it as a standalone taint graph (see the negative result below) - fold the trace into the batch product.
  5. Do not build a standalone taint or mixer-exposure graph. [CLOSED on evidence] The explicit taint family - mixer, stolen-fund and exploit-provenance routes - is 48 listings, 186 calls, $3.97 and 2 routes over the bar across the whole registry, and the two qualified ones are the mix of package-supply-chain and compliance routes already counted. A taint-graph product has no measured buyers. Fold one hop of taint into the screen response and stop.
  6. demand-reader-pagination-001 - fix our own broken reader. [HIGH] streams/shared/bazaar-demand-reader.js throws Response too large against the live registry because the limit=1000 page exceeds the 1 MB cap in streams/shared/http-client.js. Page at 500 (57 pages, 94.5 MB) or raise the cap for this endpoint. Until that is fixed, every demand number in this repository and the route-liveness-004 monitor are unreadable. Fold into price-normalizer-001, which is already the "fix the demand reader before measuring again" todo.
  7. evidence-dispute-window-001 - a signed artefact proves the payload, never the ownership. [MEDIUM] Qubic's own recovery platform states it plainly: with weak seeds "the attacker can produce the same valid signature you can", so ownership is decided by evidence the attacker cannot have, reviewed by a human, with a 7-day public dispute window before payout and different payout speeds for different recovery sources. Our attestation/* and escrow routes should model the same separation - signed payload, out-of-band ownership evidence, dispute window, adjudicated release - or they will be sold a guarantee they cannot honour. Relevant to evidence-verifiable-001 (#055) and s9-todo-007.

Impact on Streams and Todos

Method and Caveats

Sources

Unblocks

Todo ids mentioned in this document:

s2-todo-011 s2-todo-012 s2-todo-013 s9-todo-007
← Finding #058 - CFTC Frontier Forum Names Agentic Trading: the Paid Perp Demand Is a Verdict, Not a Data Feed Finding #060 - The Settlement Cost Floor: a Base settlement costs $0.00209 on our live facilitator, so the $0.002 price band is a loss and the price map needs a hard floor →