<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:dc="http://purl.org/dc/elements/1.1/">
  <channel>
    <title>DEV Community: Kenzo ARAI</title>
    <description>The latest articles on DEV Community by Kenzo ARAI (@rascal3).</description>
    <link>https://dev.to/rascal3</link>
    <image>
      <url>https://media2.dev.to/dynamic/image/width=90,height=90,fit=cover,gravity=auto,format=auto/https:%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Fuser%2Fprofile_image%2F3897516%2F75281ef9-4a56-4c44-bbfc-75235956a9a1.jpeg</url>
      <title>DEV Community: Kenzo ARAI</title>
      <link>https://dev.to/rascal3</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/rascal3"/>
    <language>en</language>
    <item>
      <title>Shipping a $0.008-per-call AML API on x402 (and the CDP Bazaar bug we hit on launch day)</title>
      <dc:creator>Kenzo ARAI</dc:creator>
      <pubDate>Wed, 29 Apr 2026 10:26:28 +0000</pubDate>
      <link>https://dev.to/rascal3/shipping-a-0008-per-call-aml-api-on-x402-and-the-cdp-bazaar-bug-we-hit-on-launch-day-44b8</link>
      <guid>https://dev.to/rascal3/shipping-a-0008-per-call-aml-api-on-x402-and-the-cdp-bazaar-bug-we-hit-on-launch-day-44b8</guid>
      <description>&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;TL;DR&lt;/strong&gt; — An AI agent paid us &lt;strong&gt;$0.008 USDC on Base mainnet&lt;/strong&gt; to scan a Tornado Cash address. The agent got back &lt;code&gt;risk_level: CRITICAL&lt;/code&gt;, &lt;code&gt;detection_count: 64&lt;/code&gt;, &lt;code&gt;ml_anomaly_score: 0.4381&lt;/code&gt; in about 30 seconds. No signup, no API key, no Stripe — the agent signed an EIP-3009 &lt;code&gt;transferWithAuthorization&lt;/code&gt;, our middleware verified + settled it via the Coinbase CDP Facilitator, and the bytes flowed. Three settlements have landed since 2026-04-28. The intended next step was Coinbase Bazaar auto-indexing on &lt;code&gt;agentic.market&lt;/code&gt;. That hasn't happened — we eventually narrowed it to a CDP-side pipeline bug (the documented &lt;code&gt;EXTENSION-RESPONSES&lt;/code&gt; header is missing entirely on every settle, matching three other teams' independent reproductions in &lt;a href="https://github.com/x402-foundation/x402/issues/2112" rel="noopener noreferrer"&gt;x402-foundation/x402#2112&lt;/a&gt;, &lt;a href="https://github.com/x402-foundation/x402/issues/2156" rel="noopener noreferrer"&gt;#2156&lt;/a&gt;, &lt;a href="https://github.com/x402-foundation/x402/issues/2132" rel="noopener noreferrer"&gt;#2132&lt;/a&gt;). We're now listed on &lt;strong&gt;&lt;a href="https://www.x402scan.com/" rel="noopener noreferrer"&gt;x402scan&lt;/a&gt;&lt;/strong&gt; as the alternative discovery path. Below: what x402 is, the five things we fixed on our side, the one thing CDP needs to fix on theirs, and how to call the API yourself.&lt;/p&gt;
&lt;/blockquote&gt;




&lt;h2&gt;
  
  
  Why x402 matters (in one paragraph)
&lt;/h2&gt;

&lt;p&gt;The dirty secret of "AI agents using APIs" is that the API still wants a human-issued bearer token. An agent that wants new data has to either reuse one of the developer's keys (a security disaster) or stop and ask. &lt;strong&gt;&lt;a href="https://x402.org" rel="noopener noreferrer"&gt;x402&lt;/a&gt;&lt;/strong&gt; flips this: the API replies &lt;code&gt;HTTP 402 Payment Required&lt;/code&gt; with a price, the agent signs a stablecoin transfer for that exact price, replays the request, and gets the response. No accounts. No keys. The economic unit is per-call, not per-month. For an AML / risk-scoring API like ours, this is exactly the right shape — agents pay only for the addresses they actually scan, and we don't have to gate access behind sign-ups.&lt;/p&gt;

&lt;p&gt;Coinbase's &lt;a href="https://docs.cdp.coinbase.com/x402/welcome" rel="noopener noreferrer"&gt;CDP x402 facilitator&lt;/a&gt; does the heavy lifting (verifying signatures, broadcasting USDC transfers on Base / Solana mainnet). The promise is real. The middle, where the implementation lives, is where everything broke — first on our side (fixable), then on CDP's side (still open).&lt;/p&gt;




&lt;h2&gt;
  
  
  Five things that broke on our side
&lt;/h2&gt;

&lt;h3&gt;
  
  
  1. Our &lt;code&gt;_verify_payment&lt;/code&gt; was sending the wrong wire format entirely
&lt;/h3&gt;

&lt;p&gt;We had a pre-existing implementation that sent the facilitator something like:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight json"&gt;&lt;code&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nl"&gt;"payment"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"&amp;lt;base64&amp;gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nl"&gt;"requirements"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nl"&gt;"scheme"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"exact"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nl"&gt;"price"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"$0.008"&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;That is &lt;strong&gt;nothing like&lt;/strong&gt; the x402 v2 spec. The CDP facilitator expects a fully-typed &lt;code&gt;paymentPayload&lt;/code&gt; (pydantic v2 schema with &lt;code&gt;accepted&lt;/code&gt; + &lt;code&gt;payload&lt;/code&gt; fields) and a &lt;code&gt;paymentRequirements&lt;/code&gt; block that names the network, asset, &lt;code&gt;payTo&lt;/code&gt;, atomic amount, and EIP-712 metadata. Verification was failing silently, and we'd been seeing &lt;code&gt;HTTP 402: payment may have failed verification&lt;/code&gt; for weeks without realizing the request shape itself was wrong.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Fix:&lt;/strong&gt; Stop hand-rolling. Add &lt;code&gt;x402[httpx]&amp;gt;=2.9.0&lt;/code&gt; to &lt;code&gt;requirements.txt&lt;/code&gt; and let the official library own the wire format:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight python"&gt;&lt;code&gt;&lt;span class="kn"&gt;from&lt;/span&gt; &lt;span class="n"&gt;x402.client.facilitator.https&lt;/span&gt; &lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="n"&gt;HTTPFacilitatorClient&lt;/span&gt;
&lt;span class="kn"&gt;from&lt;/span&gt; &lt;span class="n"&gt;x402.types&lt;/span&gt; &lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="n"&gt;PaymentPayload&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;PaymentRequirements&lt;/span&gt;

&lt;span class="n"&gt;facilitator&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nc"&gt;HTTPFacilitatorClient&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;base_url&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="n"&gt;FACILITATOR_URL&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;auth_provider&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="n"&gt;auth&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="n"&gt;verify_resp&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;await&lt;/span&gt; &lt;span class="n"&gt;facilitator&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;verify&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;payload&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;requirements&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The shape the facilitator actually wants:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight json"&gt;&lt;code&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"x402Version"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mi"&gt;2&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"paymentPayload"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;"x402Version"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mi"&gt;2&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;"payload"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nl"&gt;"signature"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"0x..."&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nl"&gt;"authorization"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nl"&gt;"..."&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"..."&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;},&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;"accepted"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
      &lt;/span&gt;&lt;span class="nl"&gt;"scheme"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"exact"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
      &lt;/span&gt;&lt;span class="nl"&gt;"network"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"eip155:8453"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
      &lt;/span&gt;&lt;span class="nl"&gt;"asset"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"0x833589fCD6eDb6E08f4c7C32D4f71b54bdA02913"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
      &lt;/span&gt;&lt;span class="nl"&gt;"amount"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"8000"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
      &lt;/span&gt;&lt;span class="nl"&gt;"payTo"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"0xe8e26183...708959"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
      &lt;/span&gt;&lt;span class="nl"&gt;"maxTimeoutSeconds"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mi"&gt;60&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
      &lt;/span&gt;&lt;span class="nl"&gt;"extra"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nl"&gt;"name"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"USD Coin"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nl"&gt;"version"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"2"&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="p"&gt;},&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;"resource"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nl"&gt;"url"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"..."&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nl"&gt;"description"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"..."&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nl"&gt;"mimeType"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"application/json"&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="p"&gt;},&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"paymentRequirements"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;"scheme"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"exact"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;"network"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"eip155:8453"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;"asset"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"0x833589fCD6eDb6E08f4c7C32D4f71b54bdA02913"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;"amount"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"8000"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;"payTo"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"0xe8e26183...708959"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;"maxTimeoutSeconds"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mi"&gt;60&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  2. There was no &lt;code&gt;_settle_payment&lt;/code&gt; call at all
&lt;/h3&gt;

&lt;p&gt;Even if &lt;code&gt;/verify&lt;/code&gt; had ever passed, no USDC would have moved. The middleware had no &lt;code&gt;/settle&lt;/code&gt; step. The contract for x402 is &lt;strong&gt;verify → handler → settle&lt;/strong&gt;, and we were stopping at verify.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Fix:&lt;/strong&gt; Wire the full middleware:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight python"&gt;&lt;code&gt;&lt;span class="k"&gt;async&lt;/span&gt; &lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;x402_middleware&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;request&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;call_next&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
    &lt;span class="n"&gt;payload&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nf"&gt;_decode_payment_payload&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;request&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;headers&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;X-PAYMENT&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;])&lt;/span&gt;
    &lt;span class="n"&gt;requirements&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nf"&gt;_requirements_for_payload&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;payload&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;accepts&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;

    &lt;span class="n"&gt;verify_resp&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;await&lt;/span&gt; &lt;span class="n"&gt;facilitator&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;verify&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;payload&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;requirements&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="ow"&gt;not&lt;/span&gt; &lt;span class="n"&gt;verify_resp&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;is_valid&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
        &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="nf"&gt;_402&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;reason&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="n"&gt;verify_resp&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;invalid_reason&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;

    &lt;span class="n"&gt;response&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;await&lt;/span&gt; &lt;span class="nf"&gt;call_next&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;request&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;

    &lt;span class="c1"&gt;# Only settle if the handler succeeded — failed scans don't get charged
&lt;/span&gt;    &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="mi"&gt;200&lt;/span&gt; &lt;span class="o"&gt;&amp;lt;=&lt;/span&gt; &lt;span class="n"&gt;response&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;status_code&lt;/span&gt; &lt;span class="o"&gt;&amp;lt;&lt;/span&gt; &lt;span class="mi"&gt;300&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
        &lt;span class="n"&gt;settle_resp&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;await&lt;/span&gt; &lt;span class="n"&gt;facilitator&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;settle&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;payload&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;requirements&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
        &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="n"&gt;settle_resp&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;success&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
            &lt;span class="n"&gt;response&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;headers&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;X-PAYMENT-RESPONSE&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nf"&gt;b64_encode&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;settle_resp&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;json&lt;/span&gt;&lt;span class="p"&gt;())&lt;/span&gt;

    &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="n"&gt;response&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The "only settle on 2xx" rule is important: if the AML scan crashes mid-flight, the agent shouldn't be charged. Conversely, once the data is over the wire, there is no rollback — settle is the commit.&lt;/p&gt;

&lt;h3&gt;
  
  
  3. CDP credentials were never injected into the container
&lt;/h3&gt;

&lt;p&gt;The Azure secrets &lt;code&gt;cdp-api-key-id&lt;/code&gt; and &lt;code&gt;cdp-api-key-secret&lt;/code&gt; had been provisioned weeks ago. They just weren't being passed as env vars to the running container. So &lt;code&gt;_generate_cdp_jwt()&lt;/code&gt; was returning &lt;code&gt;None&lt;/code&gt; silently, the facilitator client was sending unauthenticated requests, and CDP was rejecting them.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Fix:&lt;/strong&gt; Two-line patch to the deploy script:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="c"&gt;# scripts/azure-deploy.sh&lt;/span&gt;
az containerapp update ... &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="nt"&gt;--set-env-vars&lt;/span&gt; &lt;span class="se"&gt;\&lt;/span&gt;
    ... &lt;span class="se"&gt;\&lt;/span&gt;
    &lt;span class="nv"&gt;CDP_API_KEY_ID&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;secretref:cdp-api-key-id &lt;span class="se"&gt;\&lt;/span&gt;
    &lt;span class="nv"&gt;CDP_API_KEY_SECRET&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;secretref:cdp-api-key-secret
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Generic lesson: provisioning a secret in Key Vault and &lt;em&gt;referencing&lt;/em&gt; it from the container app are two different deploys. Check both.&lt;/p&gt;

&lt;h3&gt;
  
  
  4. The SvelteKit catch-all proxy was stripping &lt;code&gt;X-PAYMENT&lt;/code&gt;
&lt;/h3&gt;

&lt;p&gt;We have a generic &lt;code&gt;/api/v1/[...path]/+server.ts&lt;/code&gt; that proxies the SvelteKit edge to the Python backend. It was forwarding &lt;code&gt;X-API-Key&lt;/code&gt; and &lt;code&gt;Content-Type&lt;/code&gt; and nothing else. The browser-side x402 demo would sign correctly, attach &lt;code&gt;X-PAYMENT&lt;/code&gt;, and watch it disappear by the time the request hit Python.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Fix:&lt;/strong&gt; Forward x402 protocol headers explicitly, plus CORS preflight allow-list:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight typescript"&gt;&lt;code&gt;&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;FORWARD_HEADERS&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;x-api-key&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;x-payment&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;payment-signature&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;content-type&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;

&lt;span class="c1"&gt;// On the OPTIONS preflight:&lt;/span&gt;
&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;Access-Control-Allow-Headers&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;X-API-Key, X-Payment, Payment-Signature, Content-Type&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;We also moved the demo to the dedicated &lt;code&gt;/x402/api/...&lt;/code&gt; route which has x402-aware proxy logic, leaving the generic catch-all for plain REST traffic.&lt;/p&gt;

&lt;h3&gt;
  
  
  5. Our demo wallet self-transferred to the treasury
&lt;/h3&gt;

&lt;p&gt;The browser demo connected Phantom and signed a &lt;code&gt;transferWithAuthorization&lt;/code&gt; from the connected account to the treasury &lt;code&gt;payTo&lt;/code&gt; — except the connected account &lt;em&gt;was&lt;/em&gt; the treasury. EIP-3009 has no problem with that (you can sign a transfer from yourself to yourself), but the facilitator's verifier rejected it because the signed &lt;code&gt;from&lt;/code&gt; matched the platform's &lt;code&gt;payTo&lt;/code&gt;, which it correctly read as a self-payment loop, not a real customer payment.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Fix:&lt;/strong&gt; Cheap client-side guard:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight typescript"&gt;&lt;code&gt;&lt;span class="k"&gt;if &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;account&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;toLowerCase&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="o"&gt;===&lt;/span&gt; &lt;span class="nx"&gt;acceptEntry&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;payTo&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;toLowerCase&lt;/span&gt;&lt;span class="p"&gt;())&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="k"&gt;throw&lt;/span&gt; &lt;span class="k"&gt;new&lt;/span&gt; &lt;span class="nc"&gt;Error&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
    &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;Connected wallet is the treasury — switch to a different account to test.&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;
  &lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Once we connected from a fresh wallet (a separate Phantom account funded with $0.50 of USDC), the signature went through. The buyer's wallet, the treasury, and the facilitator are all different parties — they have to be.&lt;/p&gt;




&lt;h2&gt;
  
  
  What a successful settlement actually looks like
&lt;/h2&gt;

&lt;p&gt;After all of the above, the production curl is anticlimactic:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;curl &lt;span class="nt"&gt;-i&lt;/span&gt; &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="nt"&gt;-H&lt;/span&gt; &lt;span class="s2"&gt;"X-PAYMENT: &lt;/span&gt;&lt;span class="si"&gt;$(&lt;/span&gt;./build_payment.ts &lt;span class="nv"&gt;$WALLET&lt;/span&gt; 0.008 USDC base&lt;span class="si"&gt;)&lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt; &lt;span class="se"&gt;\&lt;/span&gt;
  https://chain-analyzer.com/x402/api/address/0x0000db5c8b030ae20308ac975898e09741e70000/risk-score?chain&lt;span class="o"&gt;=&lt;/span&gt;ethereum

&lt;span class="c"&gt;# HTTP/2 200&lt;/span&gt;
&lt;span class="c"&gt;# X-PAYMENT-RESPONSE: eyJzdWNjZXNzIjp0cnVlLCJ0eEhhc2giOiIweGFiYy4uLiJ9&lt;/span&gt;
&lt;span class="c"&gt;# Content-Type: application/json&lt;/span&gt;
&lt;span class="c"&gt;#&lt;/span&gt;
&lt;span class="c"&gt;# {&lt;/span&gt;
&lt;span class="c"&gt;#   "address": "0x0000db5c8b030ae20308ac975898e09741e70000",&lt;/span&gt;
&lt;span class="c"&gt;#   "chain": "ethereum",&lt;/span&gt;
&lt;span class="c"&gt;#   "risk_level": "CRITICAL",&lt;/span&gt;
&lt;span class="c"&gt;#   "risk_score": 95,&lt;/span&gt;
&lt;span class="c"&gt;#   "detection_count": 64,&lt;/span&gt;
&lt;span class="c"&gt;#   "ml_anomaly_score": 0.4381,&lt;/span&gt;
&lt;span class="c"&gt;#   "detections": [&lt;/span&gt;
&lt;span class="c"&gt;#     { "id": "OFAC_SANCTIONED", "severity": "CRITICAL", ... },&lt;/span&gt;
&lt;span class="c"&gt;#     { "id": "TORNADO_CASH_INTERACTION", "severity": "CRITICAL", ... },&lt;/span&gt;
&lt;span class="c"&gt;#     { "id": "ADDRESS_POISONING_RECEIVED", "severity": "HIGH", ... },&lt;/span&gt;
&lt;span class="c"&gt;#     ...&lt;/span&gt;
&lt;span class="c"&gt;#   ]&lt;/span&gt;
&lt;span class="c"&gt;# }&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;code&gt;X-PAYMENT-RESPONSE&lt;/code&gt; is the base64-encoded settle receipt — the agent can decode it to get the on-chain tx hash and confirm the USDC really moved on Base. That's the loop closed: agent paid, scan ran, agent got data, settlement is on-chain. Three of these have landed for us across 2026-04-28 / 2026-04-29.&lt;/p&gt;




&lt;h2&gt;
  
  
  What's still broken on CDP's side: Bazaar &lt;code&gt;agentic.market&lt;/code&gt; indexing
&lt;/h2&gt;

&lt;p&gt;The plan was simple: a successful settlement on a route that carries &lt;code&gt;extensions.bazaar.discoverable=true&lt;/code&gt; triggers Coinbase's Bazaar pipeline to crawl the manifest and add the resource to &lt;a href="https://agentic.market" rel="noopener noreferrer"&gt;&lt;code&gt;agentic.market&lt;/code&gt;&lt;/a&gt;. We shipped the metadata, settled the payments, and waited.&lt;/p&gt;

&lt;p&gt;It didn't happen. After three settlements over 36 hours, the resource is still not in the Bazaar discovery index, and &lt;code&gt;/discovery/merchant?payTo=...&lt;/code&gt; returns 404.&lt;/p&gt;

&lt;p&gt;The diagnostic signal in the &lt;a href="https://docs.cdp.coinbase.com/x402/bazaar" rel="noopener noreferrer"&gt;Bazaar Indexing Process docs&lt;/a&gt; is the &lt;code&gt;EXTENSION-RESPONSES&lt;/code&gt; header on the facilitator's &lt;code&gt;/verify&lt;/code&gt; and &lt;code&gt;/settle&lt;/code&gt; responses:&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Header value&lt;/th&gt;
&lt;th&gt;Meaning&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;processing&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Bazaar accepted the metadata, async indexing in flight&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;rejected&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Bazaar rejected (schema / mimeType / etc.)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;missing&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;Bazaar pipeline never received the metadata (CDP-side issue)&lt;/strong&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;To see which case applies to us we patched &lt;code&gt;httpx.AsyncClient.send&lt;/code&gt; inside the FastAPI process to log every facilitator response header before any middleware touched it. The header is &lt;strong&gt;absent in every casing&lt;/strong&gt; on every settlement we've made. Not &lt;code&gt;processing&lt;/code&gt;, not &lt;code&gt;rejected&lt;/code&gt;, just nothing.&lt;/p&gt;

&lt;p&gt;This puts us in the same spot as three other teams that filed reproductions:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;a href="https://github.com/x402-foundation/x402/issues/2112" rel="noopener noreferrer"&gt;x402-foundation/x402#2112&lt;/a&gt; — &lt;code&gt;siggy&lt;/code&gt; (rtkmotion.io) captured the same absence at the Cloudflare Worker level on Base mainnet, across nine settlements&lt;/li&gt;
&lt;li&gt;Same thread — &lt;code&gt;srotzin&lt;/code&gt; (HiveCompute) reproduced it on Solana / USDT&lt;/li&gt;
&lt;li&gt;
&lt;a href="https://github.com/x402-foundation/x402/issues/2156" rel="noopener noreferrer"&gt;#2156&lt;/a&gt; — third independent stack, agentic.market still empty after 8 settlements&lt;/li&gt;
&lt;li&gt;
&lt;a href="https://github.com/x402-foundation/x402/issues/2132" rel="noopener noreferrer"&gt;#2132&lt;/a&gt; — our own ecosystem-listing request, also pending&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Across the four reproductions, the only commonality is that every &lt;code&gt;payTo&lt;/code&gt; address is a non-CDP-registered EOA (we generated ours outside the CDP wallet system). The current strongest hypothesis — not yet confirmed by Coinbase — is that the Bazaar pipeline is gated on payee wallets being CDP-account-linked, and the missing header is a symptom of that gating happening silently. If true, this is a one-line documentation fix on CDP's side that would have saved every team filing into those issues a week of metadata iteration.&lt;/p&gt;

&lt;p&gt;There's nothing we can change on our end to make Bazaar pick us up today. The metadata is correct (it matches Sentinel AML's catalogued listing structure), the settlements are real, the manifest is live. We're waiting on CDP.&lt;/p&gt;




&lt;h2&gt;
  
  
  Listed on x402scan instead
&lt;/h2&gt;

&lt;p&gt;Bazaar isn't the only x402 discovery layer. &lt;strong&gt;&lt;a href="https://www.x402scan.com/" rel="noopener noreferrer"&gt;x402scan&lt;/a&gt;&lt;/strong&gt; (run by Merit-Systems) is an independent ecosystem explorer that crawls services via &lt;a href="https://chain-analyzer.com/.well-known/x402" rel="noopener noreferrer"&gt;&lt;code&gt;/.well-known/x402&lt;/code&gt;&lt;/a&gt;. Submitting our discovery doc registered five GET endpoints with full activity tracking inside ~10 seconds:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;a href="https://www.x402scan.com/server/78ee8ac2-bc8c-4d44-a565-45ead6dd5364" rel="noopener noreferrer"&gt;www.x402scan.com/server/78ee8ac2-bc8c-4d44-a565-45ead6dd5364&lt;/a&gt;&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Getting through their probe required two extra fixes that the CDP-only path didn't surface:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Emit a base64 &lt;code&gt;Payment-Required&lt;/code&gt; header alongside the JSON body.&lt;/strong&gt; The validator (&lt;code&gt;@agentcash/discovery&lt;/code&gt; v1.6.x) reads the v2 challenge from a header — base64-decoding &lt;code&gt;atob(headerValue)&lt;/code&gt; to get the payload — and falls back only to a v1 JSON body parser if absent. Our v2 JSON body wasn't enough on its own. We now emit both: the rich body for CDP / &lt;code&gt;x402-fetch&lt;/code&gt; and a flattened Coinbase-schema header for any v2 strict validator.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Add a &lt;code&gt;bazaar.schema.properties.input.properties.{body|queryParams}&lt;/code&gt; block.&lt;/strong&gt; agentcash's &lt;code&gt;extractSchemas2&lt;/code&gt; only recognises &lt;code&gt;body&lt;/code&gt; or &lt;code&gt;queryParams&lt;/code&gt; for input — it does not look at &lt;code&gt;pathParams&lt;/code&gt;, which is where our existing &lt;code&gt;bazaar.info&lt;/code&gt; block had the field definitions. We now synthesize a parallel &lt;code&gt;schema&lt;/code&gt; block at request time so the same field names show up under both keys.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;With those in place, x402scan picked up all five GET routes (the POST-only &lt;code&gt;batch/screening&lt;/code&gt; is still excluded — their probe is GET-only, so a 405 from a POST endpoint counts as failed registration). Our build notes from this debug session are in the &lt;a href="https://github.com/Merit-Systems/x402scan/issues" rel="noopener noreferrer"&gt;&lt;code&gt;@agentcash/discovery&lt;/code&gt; issue tracker&lt;/a&gt; for anyone hitting the same wall.&lt;/p&gt;




&lt;h2&gt;
  
  
  Try it yourself
&lt;/h2&gt;

&lt;p&gt;There are three reasonable on-ramps depending on what you're holding:&lt;/p&gt;

&lt;h3&gt;
  
  
  a) &lt;code&gt;curl&lt;/code&gt; from a TypeScript helper
&lt;/h3&gt;

&lt;p&gt;If you have a wallet on Base with a few cents of USDC:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight typescript"&gt;&lt;code&gt;&lt;span class="k"&gt;import&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="nx"&gt;createWalletClient&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;custom&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt; &lt;span class="k"&gt;from&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;viem&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;
&lt;span class="k"&gt;import&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="nx"&gt;base&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt; &lt;span class="k"&gt;from&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;viem/chains&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;

&lt;span class="c1"&gt;// Browser: connect Phantom (or any EIP-1193 wallet) to Base mainnet&lt;/span&gt;
&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;wallet&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nf"&gt;createWalletClient&lt;/span&gt;&lt;span class="p"&gt;({&lt;/span&gt;
  &lt;span class="na"&gt;chain&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;base&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
  &lt;span class="na"&gt;transport&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nf"&gt;custom&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nb"&gt;window&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;phantom&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;ethereum&lt;/span&gt;&lt;span class="p"&gt;),&lt;/span&gt;
&lt;span class="p"&gt;})&lt;/span&gt;
&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="nx"&gt;account&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;await&lt;/span&gt; &lt;span class="nx"&gt;wallet&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;requestAddresses&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;

&lt;span class="c1"&gt;// Sign EIP-3009 transferWithAuthorization for $0.008 USDC, replay&lt;/span&gt;
&lt;span class="c1"&gt;// the request with X-PAYMENT — middleware verifies + settles via the&lt;/span&gt;
&lt;span class="c1"&gt;// Coinbase CDP facilitator, then returns the risk-score JSON&lt;/span&gt;
&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;res&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;await&lt;/span&gt; &lt;span class="nf"&gt;fetch&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
  &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;https://chain-analyzer.com/x402/api/address/&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt; &lt;span class="o"&gt;+&lt;/span&gt;
    &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;0x0000db5c8b030ae20308ac975898e09741e70000/risk-score?chain=ethereum&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
  &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="na"&gt;headers&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;X-PAYMENT&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nf"&gt;buildPayment&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;account&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="cm"&gt;/* ... */&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt; &lt;span class="p"&gt;},&lt;/span&gt;
&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;score&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;await&lt;/span&gt; &lt;span class="nx"&gt;res&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;json&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
&lt;span class="c1"&gt;// score.risk_level === "CRITICAL", score.detection_count === 64&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  b) The browser demo
&lt;/h3&gt;

&lt;p&gt;&lt;a href="https://chain-analyzer.com/x402-demo.html" rel="noopener noreferrer"&gt;chain-analyzer.com/x402-demo.html&lt;/a&gt; connects Phantom on Base, lets you punch in any address, and runs the full pay → scan → settle flow with a visible tx hash at the end. Costs you $0.008 + Base gas (a few cents).&lt;/p&gt;

&lt;h3&gt;
  
  
  c) Through an MCP-aware AI agent
&lt;/h3&gt;

&lt;p&gt;If you're using Claude or any MCP client, our &lt;a href="https://www.npmjs.com/package/chainanalyzer-mcp" rel="noopener noreferrer"&gt;&lt;code&gt;chainanalyzer-mcp&lt;/code&gt;&lt;/a&gt; package exposes the same endpoints as MCP tools. The agent handles the x402 dance for you — you just say "scan this address" in natural language.&lt;/p&gt;




&lt;h2&gt;
  
  
  The endpoint menu
&lt;/h2&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Method&lt;/th&gt;
&lt;th&gt;Endpoint&lt;/th&gt;
&lt;th&gt;Use case&lt;/th&gt;
&lt;th&gt;Price&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;GET&lt;/td&gt;
&lt;td&gt;&lt;code&gt;/x402/api/address/{addr}/risk-score&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;0–100 risk score + detection list&lt;/td&gt;
&lt;td&gt;$0.008 USDC&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;GET&lt;/td&gt;
&lt;td&gt;&lt;code&gt;/x402/api/address/{addr}/sanctions&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;OFAC / FATF / JFSA sanction list match&lt;/td&gt;
&lt;td&gt;$0.003 USDC&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;GET&lt;/td&gt;
&lt;td&gt;&lt;code&gt;/x402/api/tx/{tx_hash}/trace&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Multi-hop fund flow trace&lt;/td&gt;
&lt;td&gt;$0.015 USDC&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;GET&lt;/td&gt;
&lt;td&gt;&lt;code&gt;/x402/api/tx/{tx_hash}/coinjoin&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;CoinJoin / mixer detection&lt;/td&gt;
&lt;td&gt;$0.01 USDC&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;GET&lt;/td&gt;
&lt;td&gt;&lt;code&gt;/x402/api/wallet/{addr}/cluster&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Common-spend wallet clustering&lt;/td&gt;
&lt;td&gt;$0.02 USDC&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;POST&lt;/td&gt;
&lt;td&gt;&lt;code&gt;/x402/api/batch/screening&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Batch address screening (≤50 per call)&lt;/td&gt;
&lt;td&gt;$0.05 USDC&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;&lt;strong&gt;Chain coverage:&lt;/strong&gt; 8 chains live for self-serve via the &lt;code&gt;?chain=&lt;/code&gt; query parameter — &lt;code&gt;bitcoin&lt;/code&gt;, &lt;code&gt;ethereum&lt;/code&gt;, &lt;code&gt;polygon&lt;/code&gt;, &lt;code&gt;base&lt;/code&gt;, &lt;code&gt;arbitrum&lt;/code&gt;, &lt;code&gt;optimism&lt;/code&gt;, &lt;code&gt;avalanche&lt;/code&gt;, &lt;code&gt;solana&lt;/code&gt;. &lt;strong&gt;BNB Smart Chain&lt;/strong&gt; is on Enterprise rollout (paid Etherscan tier required) and is reachable through the subscription API key path, not via x402.&lt;/p&gt;

&lt;p&gt;The full advertised manifest is at &lt;a href="https://chain-analyzer.com/.well-known/x402" rel="noopener noreferrer"&gt;chain-analyzer.com/.well-known/x402&lt;/a&gt; — that's the file the x402scan crawler reads, and the same one CDP's Bazaar crawler is supposed to read once the upstream pipeline is fixed.&lt;/p&gt;




&lt;h2&gt;
  
  
  The bigger picture
&lt;/h2&gt;

&lt;p&gt;We didn't build x402 support to chase a buzzword. We built it because &lt;strong&gt;AI agents are the natural buyers of AML data&lt;/strong&gt; — they don't have personal addresses, they don't sign up for SaaS plans, they need to know in 30 seconds whether the wallet on the other side of a transaction is a Tornado Cash router or a normie. Sign-up forms and quarterly contracts don't fit that workload. Pay-per-call USDC does.&lt;/p&gt;

&lt;p&gt;The settlement layer works. The Coinbase Bazaar discovery layer is, today, blocked on a CDP-side bug we can't reach into. The x402scan discovery layer works fine. If you're a team about to ship x402 with a non-CDP-registered payee EOA, you'll likely hit the same Bazaar wall — file into &lt;a href="https://github.com/x402-foundation/x402/issues/2112" rel="noopener noreferrer"&gt;#2112&lt;/a&gt; so the signal reaches Coinbase, and submit your service to x402scan in parallel so your endpoints are reachable in the meantime.&lt;/p&gt;

&lt;p&gt;The per-call cost of plugging an autonomous agent into multi-chain AML data is now half a US cent. That's where the agent economy is going, and we'd rather be on the supply side.&lt;/p&gt;




&lt;h2&gt;
  
  
  Links
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;ChainAnalyzer x402 demo (works in any EVM-capable browser wallet on Base): &lt;a href="https://chain-analyzer.com/x402-demo.html" rel="noopener noreferrer"&gt;chain-analyzer.com/x402-demo.html&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;Discovery doc: &lt;a href="https://chain-analyzer.com/.well-known/x402" rel="noopener noreferrer"&gt;chain-analyzer.com/.well-known/x402&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;x402scan listing: &lt;a href="https://www.x402scan.com/server/78ee8ac2-bc8c-4d44-a565-45ead6dd5364" rel="noopener noreferrer"&gt;www.x402scan.com/server/78ee8ac2-bc8c-4d44-a565-45ead6dd5364&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;MCP server (npm): &lt;a href="https://www.npmjs.com/package/chainanalyzer-mcp" rel="noopener noreferrer"&gt;&lt;code&gt;chainanalyzer-mcp&lt;/code&gt;&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;x402 spec: &lt;a href="https://x402.org" rel="noopener noreferrer"&gt;x402.org&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;CDP x402 facilitator docs: &lt;a href="https://docs.cdp.coinbase.com/x402/welcome" rel="noopener noreferrer"&gt;docs.cdp.coinbase.com/x402&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;Bazaar pipeline issue tracker: &lt;a href="https://github.com/x402-foundation/x402/issues/2112" rel="noopener noreferrer"&gt;x402-foundation/x402#2112&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;ChainAnalyzer (full product): &lt;a href="https://chain-analyzer.com" rel="noopener noreferrer"&gt;chain-analyzer.com&lt;/a&gt;
&lt;/li&gt;
&lt;/ul&gt;




&lt;p&gt;&lt;em&gt;This article was written by Kenzo ARAI (refinancier, inc.). Build notes published openly so other teams shipping x402 can skip the same five potholes — and route around the sixth.&lt;/em&gt;&lt;/p&gt;

</description>
      <category>x402</category>
      <category>coinbase</category>
      <category>ai</category>
      <category>blockchain</category>
    </item>
    <item>
      <title>$5.3M Address Poisoning Network — 2 Months Later: The Follow-Up</title>
      <dc:creator>Kenzo ARAI</dc:creator>
      <pubDate>Wed, 29 Apr 2026 10:17:57 +0000</pubDate>
      <link>https://dev.to/rascal3/53m-address-poisoning-network-2-months-later-the-follow-up-1ekh</link>
      <guid>https://dev.to/rascal3/53m-address-poisoning-network-2-months-later-the-follow-up-1ekh</guid>
      <description>&lt;p&gt;&lt;strong&gt;By refinancier, inc. / ChainAnalyzer — 2026-04-20&lt;/strong&gt;&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;TL;DR&lt;/strong&gt; — On 2026-02-17 we published &lt;a href="https://chain-analyzer.com/docs/origin-story" rel="noopener noreferrer"&gt;an investigation&lt;/a&gt; identifying a cross-chain address poisoning network moving $5.3M across Avalanche, Ethereum, and Polygon, with 264+ operator wallets funded by a single "Master Funder" (&lt;code&gt;0x54cdcbdb...&lt;/code&gt;). Two months later, we returned to the same wallets. The network is still active, the Master Funder has disbursed another $1.24M in AVAX to 854 new destination addresses, and the Ethereum collector received $16.8M USDT during the interval. We also re-classified two addresses we had previously labeled as "whale funders" — they are almost certainly exchange / OTC hot wallets, not co-conspirators. Full comparison below.&lt;/p&gt;
&lt;/blockquote&gt;




&lt;h2&gt;
  
  
  Recap — What We Found in February 2026
&lt;/h2&gt;

&lt;p&gt;In February we traced:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;264+ operator wallets&lt;/strong&gt; distributing 50+ Unicode-impersonation fake token contracts (Cyrillic &lt;code&gt;UЅDT&lt;/code&gt;, Lisu &lt;code&gt;ꓴꓢꓓt&lt;/code&gt;, zero-width invisibles)&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;6,892+ poisoned addresses&lt;/strong&gt; across three chains&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;$5.3M total capital moved&lt;/strong&gt; including 176M yen of JPYC&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;A single Master Funder&lt;/strong&gt; at &lt;code&gt;0x54cdcbdba40e294e8832230db706cee76e1f20f3&lt;/code&gt; — 16,226 AVAX balance, 1,585 recipients, of which 53% were confirmed poisoning operators&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Two collectors&lt;/strong&gt;: Ethereum (&lt;code&gt;0xbca34ed5...&lt;/code&gt; = $2.67M USDT) and Polygon (&lt;code&gt;0xa6380bfd...&lt;/code&gt; = $788K USDC)&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Proven relay pattern&lt;/strong&gt;: on Polygon, a victim sent 2,800 USDC to a relay wallet after seeing a look-alike address in their history; 34 minutes later that USDC was forwarded to the collector&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;For the full February findings: &lt;a href="https://chain-analyzer.com/docs/origin-story" rel="noopener noreferrer"&gt;original investigation writeup&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;The question we left open: &lt;em&gt;does this network dismantle itself after being exposed, or does it keep running?&lt;/em&gt;&lt;/p&gt;




&lt;h2&gt;
  
  
  Follow-Up Methodology
&lt;/h2&gt;

&lt;p&gt;On 2026-04-20 we pulled on-chain state for every address flagged in the February report, using:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Routescan&lt;/strong&gt; (Avalanche C-Chain, keyless)&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Etherscan V2&lt;/strong&gt; (Ethereum + Polygon, same API key)&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;ChainAnalyzer's own Neo4j graph&lt;/strong&gt; for cross-chain correlation&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;For each address we compared:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Native token balance (Feb 17 → Apr 20)&lt;/li&gt;
&lt;li&gt;Last transaction timestamp&lt;/li&gt;
&lt;li&gt;Stablecoin holdings (USDT, USDC, USDC.e, POL)&lt;/li&gt;
&lt;li&gt;New funding activity since 2026-02-17&lt;/li&gt;
&lt;li&gt;Contract deployment activity (for the fake-token deployer)&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Every number below is reproducible against public on-chain data as of 2026-04-20 06:45 UTC.&lt;/p&gt;




&lt;h2&gt;
  
  
  Headline Deltas
&lt;/h2&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Address&lt;/th&gt;
&lt;th&gt;Role&lt;/th&gt;
&lt;th&gt;Feb 17, 2026&lt;/th&gt;
&lt;th&gt;Apr 20, 2026&lt;/th&gt;
&lt;th&gt;Delta&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;0x54cdcbdb&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;Master Funder&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;16,226 AVAX&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;12,254 AVAX&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;
&lt;strong&gt;−3,972 AVAX&lt;/strong&gt; (disbursed)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;0x54cdcbdb&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Master Funder&lt;/td&gt;
&lt;td&gt;1,585 recipients (cumulative)&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;2,439+ recipients&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;
&lt;strong&gt;+854 new destinations&lt;/strong&gt; in 2 months&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;0xbca34ed5&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;ETH Collector&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;$2.67M USDT&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;$5.97M USDT&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;+$3.30M (+124%)&lt;/strong&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;0xa6380bfd&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;POL Collector&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;249K POL + $788K USDC&lt;/td&gt;
&lt;td&gt;511K POL + $348K USDC&lt;/td&gt;
&lt;td&gt;+262K POL, −$440K USDC (laundered out)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;0xa081aa46&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;POL mass-poison funder&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Balance: $12.55&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;23,435 POL (~$24K)&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;+1,870×&lt;/strong&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;0x3bce63c6&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;"142K AVAX whale"&lt;/td&gt;
&lt;td&gt;141,904 AVAX&lt;/td&gt;
&lt;td&gt;168,901 AVAX&lt;/td&gt;
&lt;td&gt;+27K AVAX&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;0x9f8c163c&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;"Top source"&lt;/td&gt;
&lt;td&gt;(only 5,077 AVAX traced)&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;1,688,967 AVAX (~$42M)&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;(full profile now visible)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;0xb2de52d8&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Primary operator&lt;/td&gt;
&lt;td&gt;Active until 2026-02-15&lt;/td&gt;
&lt;td&gt;
&lt;strong&gt;Dead&lt;/strong&gt; — no activity since 2026-02-15&lt;/td&gt;
&lt;td&gt;✅ rotated out&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;0x03309000&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Active operator&lt;/td&gt;
&lt;td&gt;Active 2026-02-17&lt;/td&gt;
&lt;td&gt;
&lt;strong&gt;Depleted across 3 chains&lt;/strong&gt; — last AVAX activity 2026-04-15&lt;/td&gt;
&lt;td&gt;✅ rotated out&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;0x4226dd74&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Main deployer (39 fake contracts)&lt;/td&gt;
&lt;td&gt;1.46 AVAX, active&lt;/td&gt;
&lt;td&gt;
&lt;strong&gt;Still active&lt;/strong&gt; as of 2026-04-20 06:39 UTC&lt;/td&gt;
&lt;td&gt;Still used for poisoning — no NEW deployments&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;0x64424853&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Lisu deployer (cross-chain)&lt;/td&gt;
&lt;td&gt;Active&lt;/td&gt;
&lt;td&gt;
&lt;strong&gt;Dormant&lt;/strong&gt; since 2025-12-23&lt;/td&gt;
&lt;td&gt;Likely retired&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;&lt;strong&gt;Three things happened in parallel&lt;/strong&gt;: aggressive new operator recruitment, continued laundering of victim funds into collectors, and systematic retirement of old operator wallets exactly as wallet-rotation theory predicted.&lt;/p&gt;




&lt;h2&gt;
  
  
  1. The Master Funder Keeps Recruiting
&lt;/h2&gt;

&lt;p&gt;We fetched the most recent 10,000 transactions from the Master Funder (&lt;code&gt;0x54cdcbdb&lt;/code&gt;). After filtering to outflows since 2026-02-17, the numbers are:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;1,119 outbound AVAX transfers&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Total sent: 49,441 AVAX&lt;/strong&gt; (~$1.24M at $25/AVAX)&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;854 unique destination addresses&lt;/strong&gt; — none of which received funds before 2026-02-17&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;To put that in scale: the February investigation covered 1,585 lifetime recipients. In the two months since, the Master Funder added another 854 recipients — &lt;strong&gt;an expansion of 54% of the prior lifetime count, in 60 days&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;The top ten new destinations since Feb 17:&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Destination&lt;/th&gt;
&lt;th&gt;AVAX received&lt;/th&gt;
&lt;th&gt;First TX&lt;/th&gt;
&lt;th&gt;Last TX&lt;/th&gt;
&lt;th&gt;TX count&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;0x33a089cb&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;9,722&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;2026-03-02&lt;/td&gt;
&lt;td&gt;2026-03-02&lt;/td&gt;
&lt;td&gt;1&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;0xf57a1140&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;9,297&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;2026-03-13&lt;/td&gt;
&lt;td&gt;2026-03-13&lt;/td&gt;
&lt;td&gt;1&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;0x6f7e6fdf&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;7,622&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;2026-04-02&lt;/td&gt;
&lt;td&gt;2026-04-02&lt;/td&gt;
&lt;td&gt;1&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;0xd7b9b792&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;3,677&lt;/td&gt;
&lt;td&gt;2026-03-10&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;2026-04-19&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;38&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;0x0808469a&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;1,794&lt;/td&gt;
&lt;td&gt;2026-02-20&lt;/td&gt;
&lt;td&gt;2026-03-10&lt;/td&gt;
&lt;td&gt;13&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;0xeae12a48&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;1,389&lt;/td&gt;
&lt;td&gt;2026-04-10&lt;/td&gt;
&lt;td&gt;2026-04-10&lt;/td&gt;
&lt;td&gt;2&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;0xe36d6080&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;1,061&lt;/td&gt;
&lt;td&gt;2026-03-04&lt;/td&gt;
&lt;td&gt;2026-04-02&lt;/td&gt;
&lt;td&gt;3&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;0x6632f500&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;1,032&lt;/td&gt;
&lt;td&gt;2026-02-24&lt;/td&gt;
&lt;td&gt;2026-03-06&lt;/td&gt;
&lt;td&gt;3&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;0x89b8678f&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;856&lt;/td&gt;
&lt;td&gt;2026-04-03&lt;/td&gt;
&lt;td&gt;2026-04-18&lt;/td&gt;
&lt;td&gt;10&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;0x951aa58d&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;844&lt;/td&gt;
&lt;td&gt;2026-02-17&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;2026-04-17&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;7&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;Four patterns jump out:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;Single large bursts&lt;/strong&gt; to fresh wallets (9,722 / 9,297 / 7,622 AVAX in one transaction, then the destination goes quiet). Classic "seed a new operator and let it run autonomously" behavior.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Steady multi-TX relationships&lt;/strong&gt; with certain destinations (&lt;code&gt;0xd7b9b792&lt;/code&gt; received 38 separate transfers between Mar 10 and Apr 19). These look like infrastructure wallets rather than operators — possibly paying gas or topping up the deployer.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Continuity with the old network&lt;/strong&gt; — the address &lt;code&gt;0x0808469a&lt;/code&gt; that was the top operator in the February report received another 1,794 AVAX between Feb 20 and Mar 10, then went dormant again.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Activity continuing to today&lt;/strong&gt; — &lt;code&gt;0xd7b9b792&lt;/code&gt; last received AVAX on 2026-04-19, 24 hours before we ran this query.
&lt;/li&gt;
&lt;/ol&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;gantt
    title Master Funder outflow velocity
    dateFormat YYYY-MM-DD
    axisFormat %b-%d
    section Before investigation
    Lifetime recipients (1585)   :done, 2022-10-01, 2026-02-17
    section Since Feb 17 report
    New recipients (+854)        :active, 2026-02-17, 2026-04-20
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The investigation exposing this network did not slow it down. If anything, Master Funder activity accelerated.&lt;/p&gt;




&lt;h2&gt;
  
  
  2. The "Top Source" Was Not a Co-Conspirator
&lt;/h2&gt;

&lt;p&gt;In February we noted a funder at &lt;code&gt;0x9f8c163c...&lt;/code&gt; that had sent 5,077 AVAX to the Master Funder but which we had not fully traced. We tentatively labeled it "TOP SOURCE."&lt;/p&gt;

&lt;p&gt;Two months of additional data make clear: this address is &lt;strong&gt;almost certainly an exchange or OTC hot wallet&lt;/strong&gt;, not part of the criminal network.&lt;/p&gt;

&lt;p&gt;Evidence:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Current balance: &lt;strong&gt;1,688,967 AVAX&lt;/strong&gt; (~$42M at $25/AVAX)&lt;/li&gt;
&lt;li&gt;First traceable activity: 2021-09-06 (pre-dates the entire poisoning operation by 4+ years)&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;2.7M AVAX inflow + 2.4M AVAX outflow&lt;/strong&gt; in the last ~10,000 transactions alone&lt;/li&gt;
&lt;li&gt;Behavior pattern today (2026-04-20 06:32 UTC):

&lt;ul&gt;
&lt;li&gt;Hundreds of 0-value &lt;code&gt;transfer&lt;/code&gt; calls per day to the same destination (&lt;code&gt;0x26debd39...&lt;/code&gt;) — classic hot-wallet idle ping / smart-contract calldata pattern&lt;/li&gt;
&lt;li&gt;Occasional &lt;code&gt;execute&lt;/code&gt; calls on &lt;code&gt;0xee7ae85f...&lt;/code&gt; — looks like a router or batcher&lt;/li&gt;
&lt;li&gt;Small &lt;code&gt;transfer&lt;/code&gt; operations to fresh addresses with amounts that resemble customer withdrawals (0.19 AVAX, 1.36 AVAX, 25 AVAX)&lt;/li&gt;
&lt;/ul&gt;


&lt;/li&gt;

&lt;li&gt;Active on Ethereum (3 TXs) and Polygon (5 TXs) too — cross-chain hot wallet footprint&lt;/li&gt;

&lt;/ul&gt;

&lt;p&gt;The 5,077 AVAX it once sent to the Master Funder was, in all likelihood, a &lt;strong&gt;regular withdrawal from a centralized exchange&lt;/strong&gt;. The poisoning operator walked up to a CEX counter, withdrew AVAX, and walked away. That's not a conspiracy; that's a compliance gap at the exchange.&lt;/p&gt;

&lt;p&gt;Similarly, we revise our view of &lt;strong&gt;&lt;code&gt;0x3bce63c6&lt;/code&gt; ("142K AVAX whale")&lt;/strong&gt;. Current balance 168,901 AVAX, active today (last activity 2026-04-20 06:40 UTC), high-frequency 0-value calls to the same contract endpoints as &lt;code&gt;0x9f8c163c&lt;/code&gt;, occasional outbound payments of various sizes to fresh wallets. Same hot-wallet fingerprint. Its 40 AVAX contribution to the primary operator in February was likely another exchange withdrawal.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Conclusion&lt;/strong&gt;: there is no whale co-conspirator. The laundering-side money originates at one or two major exchanges that have poor outbound AML controls. This is actionable — and probably a SAR-worthy report to those exchanges if you're an agency.&lt;/p&gt;




&lt;h2&gt;
  
  
  3. Collectors: The Laundering Front-End Is Busier Than Ever
&lt;/h2&gt;

&lt;p&gt;The two collector addresses — &lt;code&gt;0xbca34ed5&lt;/code&gt; on Ethereum and &lt;code&gt;0xa6380bfd&lt;/code&gt; on Polygon — are the points where victim funds converge. Their 2-month activity is the best single indicator of whether victims are still being extracted.&lt;/p&gt;

&lt;h3&gt;
  
  
  Ethereum collector &lt;code&gt;0xbca34ed5&lt;/code&gt;
&lt;/h3&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Metric&lt;/th&gt;
&lt;th&gt;Feb 17&lt;/th&gt;
&lt;th&gt;Apr 20&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;USDT balance&lt;/td&gt;
&lt;td&gt;$2,665,507&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;$5,970,800 (+124%)&lt;/strong&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;USDT received since Feb 17&lt;/td&gt;
&lt;td&gt;—&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;$16,865,450 from 1,450 unique senders (2,574 TXs)&lt;/strong&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;USDT sent out since Feb 17&lt;/td&gt;
&lt;td&gt;—&lt;/td&gt;
&lt;td&gt;$15,134,814 (5,693 TXs)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Last activity&lt;/td&gt;
&lt;td&gt;—&lt;/td&gt;
&lt;td&gt;2026-04-20 06:38 UTC&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;In two months, this address handled &lt;strong&gt;$16.9M USDT inflow&lt;/strong&gt; from 1,450 senders and $15.1M outflow. Net +$1.73M. At this velocity, the collector processes more USDT in one week than its entire Feb 17 balance.&lt;/p&gt;

&lt;p&gt;We flagged in February that the Ethereum collector is primarily a trading hub with poisoning as a side channel, and that characterization still fits — but the side channel is much larger than it appeared.&lt;/p&gt;

&lt;h3&gt;
  
  
  Polygon collector &lt;code&gt;0xa6380bfd&lt;/code&gt;
&lt;/h3&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Metric&lt;/th&gt;
&lt;th&gt;Feb 17&lt;/th&gt;
&lt;th&gt;Apr 20&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;USDC balance&lt;/td&gt;
&lt;td&gt;$788,521&lt;/td&gt;
&lt;td&gt;$348,256 (−56%)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;POL balance&lt;/td&gt;
&lt;td&gt;249,588&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;511,722 (+106%)&lt;/strong&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;USDC received since Feb 17&lt;/td&gt;
&lt;td&gt;—&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;$1,201,642 from 1,100 unique senders (2,111 TXs)&lt;/strong&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;USDC sent out since Feb 17&lt;/td&gt;
&lt;td&gt;—&lt;/td&gt;
&lt;td&gt;$1,633,777 (3,399 TXs)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Last activity&lt;/td&gt;
&lt;td&gt;—&lt;/td&gt;
&lt;td&gt;2026-04-20 06:40 UTC&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;The USDC balance dropped because &lt;strong&gt;they are laundering it downstream&lt;/strong&gt;, not because victim flow stopped. In fact, the opposite: 1,100 unique senders in two months is up from the 715 total sender count we observed in February. The relay pattern we documented in February (victim → relay → collector within ~34 minutes) is still producing the majority of those inflows.&lt;/p&gt;

&lt;p&gt;The POL balance more than doubled, suggesting profit-taking or gas/ops reserves building up.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;flowchart LR
    subgraph "Feb 17, 2026 — Snapshot"
    A1[1,585 MF recipients]
    B1[ETH col: $2.67M USDT]
    C1[POL col: 249K POL + $788K USDC]
    end

    subgraph "Apr 20, 2026 — Follow-up"
    A2[2,439+ MF recipients&amp;lt;br/&amp;gt;+854 in 60 days]
    B2[ETH col: $5.97M USDT&amp;lt;br/&amp;gt;+$3.3M net, $16.8M gross flow]
    C2[POL col: 511K POL + $348K USDC&amp;lt;br/&amp;gt;$1.2M gross inflow from 1,100 senders]
    end

    A1 --&amp;gt;|60 days| A2
    B1 --&amp;gt;|60 days| B2
    C1 --&amp;gt;|60 days| C2
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;






&lt;h2&gt;
  
  
  4. Wallet Rotation Was Real
&lt;/h2&gt;

&lt;p&gt;One thing we theorized in February was that operator wallets are disposable — used for a few weeks, then retired as new ones spin up. The data now confirms it:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Primary operator &lt;code&gt;0xb2de52d8&lt;/code&gt;&lt;/strong&gt; — last activity 2026-02-14, 3 days before we published. Dead ever since. Balance: 0 AVAX.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Active operator &lt;code&gt;0x03309000&lt;/code&gt;&lt;/strong&gt; — was active on all three chains in February. Today:

&lt;ul&gt;
&lt;li&gt;AVAX: depleted, last TX 2026-04-15 (5 days before we pulled this data)&lt;/li&gt;
&lt;li&gt;ETH: depleted, last TX 2026-03-04&lt;/li&gt;
&lt;li&gt;POL: 0.001 POL, last TX 2026-02-25&lt;/li&gt;
&lt;/ul&gt;


&lt;/li&gt;

&lt;li&gt;

&lt;strong&gt;Top operator &lt;code&gt;0x0808469a&lt;/code&gt;&lt;/strong&gt; — received another 1,794 AVAX in late Feb to early March, then quiet again. 80 AVAX remains.&lt;/li&gt;

&lt;li&gt;

&lt;strong&gt;Lisu deployer &lt;code&gt;0x64424853&lt;/code&gt;&lt;/strong&gt; — dormant since 2025-12-23. No new Lisu-script contracts since.&lt;/li&gt;

&lt;/ul&gt;

&lt;p&gt;The 854 fresh destinations the Master Funder has been seeding since Feb 17 are exactly the replacements. The operator population turns over on a roughly 2-3 month cycle.&lt;/p&gt;

&lt;p&gt;This has an interesting implication for AML teams: &lt;strong&gt;address blacklists decay&lt;/strong&gt;. A list of operator addresses from February is 30-50% stale by April. Detection has to operate at the fund-flow and behavioral level, not at the static-address level — which is exactly the design of ChainAnalyzer's Follow Mode and graph-clustering detectors.&lt;/p&gt;




&lt;h2&gt;
  
  
  5. The Mass-Poisoning Funder Paid Off
&lt;/h2&gt;

&lt;p&gt;Perhaps the single most striking data point:&lt;/p&gt;

&lt;p&gt;The Polygon mass-poisoning funder at &lt;code&gt;0xa081aa46&lt;/code&gt; spent just &lt;strong&gt;$12.55&lt;/strong&gt; to poison 6,874 addresses in January. We flagged this as one of the highest-ROI crimes we'd ever seen and suggested that even a single successful victim would 100x the investment.&lt;/p&gt;

&lt;p&gt;Today, that address holds &lt;strong&gt;23,435 POL&lt;/strong&gt; (~$24K at $1/POL). It is still active — last transaction 2026-04-20 00:14 UTC, six hours before we queried it.&lt;/p&gt;

&lt;p&gt;From $12.55 to $24,000+. &lt;strong&gt;A 1,870× return on capital in roughly 3 months&lt;/strong&gt; — before even counting any funds it has already moved downstream.&lt;/p&gt;

&lt;p&gt;That's the entire economic argument for why this attack class is not going away without active defense.&lt;/p&gt;




&lt;h2&gt;
  
  
  6. The Deployer Hasn't Shipped New Contracts — It Doesn't Need To
&lt;/h2&gt;

&lt;p&gt;&lt;code&gt;0x4226dd7419b1431f512d82a2c9e5fa1597fb1077&lt;/code&gt; was the main fake-token deployer responsible for 39 Unicode-impersonation contracts. We checked whether it has deployed new contracts since Feb 17.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Zero new deployments. 200 other transactions.&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;The existing 39 contracts are still being used to mint and transfer fake tokens to victims. The deployer address itself is active (last TX 2026-04-20 06:39 UTC), but it's doing operational transactions, not creation transactions. The fake-token inventory from late 2025 is sufficient to run the whole operation — no need to paint new decoys.&lt;/p&gt;

&lt;p&gt;This matters because typical "contract creation detection" signals would miss this operator entirely during the period they're most active.&lt;/p&gt;




&lt;h2&gt;
  
  
  Updated Network Topology
&lt;/h2&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;flowchart TD
    subgraph "Exchange / OTC layer (not co-conspirators)"
      TS[0x9f8c163c&amp;lt;br/&amp;gt;CEX hot wallet&amp;lt;br/&amp;gt;1.69M AVAX today]
      WHALE[0x3bce63c6&amp;lt;br/&amp;gt;OTC/hot wallet&amp;lt;br/&amp;gt;168.9K AVAX today]
    end

    MF[MASTER FUNDER&amp;lt;br/&amp;gt;0x54cdcbdb&amp;lt;br/&amp;gt;12,254 AVAX&amp;lt;br/&amp;gt;2,439+ lifetime recipients&amp;lt;br/&amp;gt;ACTIVE 2026-04-20]

    subgraph "Operator layer — rotating"
      OLD[Feb-era operators&amp;lt;br/&amp;gt;most retired]
      NEW[854 new recipients&amp;lt;br/&amp;gt;Feb 17 – Apr 20]
    end

    DEP1[Main deployer 0x4226dd74&amp;lt;br/&amp;gt;39 contracts, no new deploys]
    DEP2[Lisu deployer 0x64424853&amp;lt;br/&amp;gt;DORMANT]

    POISON[6,892+ poisoned addresses&amp;lt;br/&amp;gt;3 chains]

    ETHCOL[ETH collector 0xbca34ed5&amp;lt;br/&amp;gt;$5.97M USDT&amp;lt;br/&amp;gt;+$16.8M gross in 60 days]
    POLCOL[POL collector 0xa6380bfd&amp;lt;br/&amp;gt;$348K USDC + 511K POL&amp;lt;br/&amp;gt;$1.2M gross in 60 days]

    TS --&amp;gt;|CEX withdrawal| MF
    WHALE --&amp;gt;|CEX withdrawal| MF
    MF --&amp;gt;|AVAX seed| OLD
    MF --&amp;gt;|AVAX seed| NEW
    OLD --&amp;gt;|already retired| POISON
    NEW --&amp;gt;|currently active| POISON
    DEP1 --&amp;gt;|fake contracts| POISON
    DEP2 --&amp;gt;|contracts abandoned| POISON
    POISON --&amp;gt;|relay chains| ETHCOL
    POISON --&amp;gt;|relay chains| POLCOL
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;






&lt;h2&gt;
  
  
  What This Changes
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;For victims and potential victims&lt;/strong&gt;:&lt;/p&gt;

&lt;p&gt;The network exposing itself to public investigation did not cause it to shut down. If anything, it accelerated recruitment. That means every protective behavior we recommended in February still applies, with more urgency:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Never copy an address from your transaction history. Use your address book, or re-verify from the source.&lt;/li&gt;
&lt;li&gt;Compare addresses character-by-character, not by first-4 / last-4.&lt;/li&gt;
&lt;li&gt;Suspicious tokens arriving in your wallet are not a gift — they are a marker that you are already being targeted for the next step.&lt;/li&gt;
&lt;li&gt;Before sending funds, screen the destination address. ChainAnalyzer does this for free at &lt;a href="https://chain-analyzer.com" rel="noopener noreferrer"&gt;chain-analyzer.com&lt;/a&gt;. The &lt;a href="https://www.npmjs.com/package/chainanalyzer-mcp" rel="noopener noreferrer"&gt;MCP server&lt;/a&gt; lets AI agents do it automatically before signing.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;For exchanges&lt;/strong&gt;:&lt;/p&gt;

&lt;p&gt;Two addresses — &lt;code&gt;0x9f8c163c&lt;/code&gt; and &lt;code&gt;0x3bce63c6&lt;/code&gt; — have together sent funds to wallets that seeded thousands of poisoning operators. Our review strongly suggests these are exchange or OTC hot wallets. If they are yours, your withdrawal-side AML controls have a blind spot specific to address-poisoning actors. We would welcome a conversation.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;For AML teams and regulators&lt;/strong&gt;:&lt;/p&gt;

&lt;p&gt;Address-based blacklists decay within 2-3 months for this attack class because of deliberate wallet rotation. Effective detection has to operate at the fund-flow and graph level, not at the static address level. ChainAnalyzer's detector suite is explicitly designed around this:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;P2 ADDRESS_POISONING&lt;/strong&gt; detector for Unicode impersonation signatures on token transfers&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;W9 BRIDGE_FUNDED&lt;/strong&gt; / &lt;strong&gt;W10 PRIVACY_BRIDGE_FUNDED&lt;/strong&gt; detectors for cross-chain laundering&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Follow Mode&lt;/strong&gt; for automatic BFS graph exploration of related addresses&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Exchange DB&lt;/strong&gt; with 60+ known CEX hot wallets (and growing) to correctly attribute funding sources&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;For Japan-market crypto operators&lt;/strong&gt;:&lt;/p&gt;

&lt;p&gt;The 176M yen of JPYC observed in this network in February — and the continued operator expansion since — continues to indicate that Japanese retail users are specifically in the crosshairs. &lt;a href="https://chain-analyzer.com/en/news/jpyc-aml-support" rel="noopener noreferrer"&gt;ChainAnalyzer's JPYC AML coverage&lt;/a&gt; was built for exactly this. If your product uses JPYC for B2B settlement, creator payouts, or EC payment acceptance, pre-transfer screening is no longer optional.&lt;/p&gt;




&lt;h2&gt;
  
  
  Methodology Notes
&lt;/h2&gt;

&lt;p&gt;All data in this article was pulled on 2026-04-20 between 06:20 and 06:45 UTC using:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Routescan&lt;/strong&gt; ( &lt;code&gt;https://api.routescan.io/v2/network/mainnet/evm/43114/etherscan/api&lt;/code&gt; ) — Avalanche C-Chain, free, keyless&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Etherscan V2&lt;/strong&gt; ( &lt;code&gt;https://api.etherscan.io/v2/api?chainid=1&lt;/code&gt; for Ethereum and &lt;code&gt;chainid=137&lt;/code&gt; for Polygon ) — free API key&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Query patterns:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Native balance: &lt;code&gt;module=account&amp;amp;action=balance&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;ERC-20 balance: &lt;code&gt;module=account&amp;amp;action=tokenbalance&amp;amp;contractaddress=&amp;lt;token&amp;gt;&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;Transaction list: &lt;code&gt;module=account&amp;amp;action=txlist&lt;/code&gt; (10K TX limit per call per address, sort=desc)&lt;/li&gt;
&lt;li&gt;Token transfer list: &lt;code&gt;module=account&amp;amp;action=tokentx&lt;/code&gt; (10K TX limit per call)&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Cutoff for "since Feb 17, 2026": Unix timestamp 1771200000 (2026-02-16 00:00 UTC).&lt;/p&gt;

&lt;p&gt;Every balance and transaction count above is reproducible against public on-chain data.&lt;/p&gt;




&lt;h2&gt;
  
  
  Takeaways
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;The $5.3M network is now materially larger than it was when we published the February report. The investigation publicity did not deter it; it accelerated.&lt;/li&gt;
&lt;li&gt;854 new operator wallets have been funded by the single Master Funder in 60 days. The operator population rotates on a 2-3 month cycle.&lt;/li&gt;
&lt;li&gt;The Ethereum collector processed $16.8M USDT from 1,450 senders during the interval; the Polygon collector processed $1.2M USDC from 1,100 senders. Real victims, real money, active every day.&lt;/li&gt;
&lt;li&gt;Two addresses we previously labeled as "whale co-conspirators" are almost certainly exchange / OTC hot wallets. The laundering stack starts at a compliance gap inside those exchanges.&lt;/li&gt;
&lt;li&gt;The fake-token deployer has not shipped new contracts in two months — the existing 39 contracts are sufficient inventory for the whole operation. Contract-creation-based detection misses this.&lt;/li&gt;
&lt;li&gt;For retail Web3 users, the defense is pre-transfer address screening. For AI agents, the defense is automatic screening via the &lt;a href="https://chain-analyzer.com/en/news/mcp-server-launched" rel="noopener noreferrer"&gt;ChainAnalyzer MCP server&lt;/a&gt; at $0.008 per check.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;We will follow up again in 2-3 months. In the meantime, every new operator the Master Funder seeds between now and then will be tagged and propagated to ScamDB and the ChainAnalyzer detector suite automatically via Follow Mode.&lt;/p&gt;




&lt;h2&gt;
  
  
  Appendix A — All Key Addresses
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;Avalanche&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Master Funder: &lt;a href="https://snowtrace.io/address/0x54cdcbdba40e294e8832230db706cee76e1f20f3" rel="noopener noreferrer"&gt;&lt;code&gt;0x54cdcbdba40e294e8832230db706cee76e1f20f3&lt;/code&gt;&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;Main deployer: &lt;a href="https://snowtrace.io/address/0x4226dd7419b1431f512d82a2c9e5fa1597fb1077" rel="noopener noreferrer"&gt;&lt;code&gt;0x4226dd7419b1431f512d82a2c9e5fa1597fb1077&lt;/code&gt;&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;Primary operator (retired): &lt;a href="https://snowtrace.io/address/0xb2de52d8838aa450d9e97cba8624d77f3b82d298" rel="noopener noreferrer"&gt;&lt;code&gt;0xb2de52d8838aa450d9e97cba8624d77f3b82d298&lt;/code&gt;&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;Previously active operator: &lt;a href="https://snowtrace.io/address/0x03309000ee1481fef75e6be3bb91ff38c6f7f5ca" rel="noopener noreferrer"&gt;&lt;code&gt;0x03309000ee1481fef75e6be3bb91ff38c6f7f5ca&lt;/code&gt;&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;Likely CEX hot wallet #1: &lt;a href="https://snowtrace.io/address/0x9f8c163cba728e99993abe7495f06c0a3c8ac8b9" rel="noopener noreferrer"&gt;&lt;code&gt;0x9f8c163cba728e99993abe7495f06c0a3c8ac8b9&lt;/code&gt;&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;Likely CEX hot wallet #2: &lt;a href="https://snowtrace.io/address/0x3bce63c6c9abf7a47f52c9a3a7950867700b0158" rel="noopener noreferrer"&gt;&lt;code&gt;0x3bce63c6c9abf7a47f52c9a3a7950867700b0158&lt;/code&gt;&lt;/a&gt;
&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Ethereum&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;ETH collector: &lt;a href="https://etherscan.io/address/0xbca34ed5875079cc561840f3409a790769821dbc" rel="noopener noreferrer"&gt;&lt;code&gt;0xbca34ed5875079cc561840f3409a790769821dbc&lt;/code&gt;&lt;/a&gt;
&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Polygon&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;POL collector: &lt;a href="https://polygonscan.com/address/0xa6380bfda5986782a15e3e285a1743aee8523f97" rel="noopener noreferrer"&gt;&lt;code&gt;0xa6380bfda5986782a15e3e285a1743aee8523f97&lt;/code&gt;&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;Mass-poisoning funder: &lt;a href="https://polygonscan.com/address/0xa081aa46c83c1f7afc1550e68260b28caeba896f" rel="noopener noreferrer"&gt;&lt;code&gt;0xa081aa46c83c1f7afc1550e68260b28caeba896f&lt;/code&gt;&lt;/a&gt;
&lt;/li&gt;
&lt;/ul&gt;




&lt;h2&gt;
  
  
  Appendix B — Try It Yourself
&lt;/h2&gt;

&lt;p&gt;Any of the above addresses can be scanned free at &lt;a href="https://chain-analyzer.com" rel="noopener noreferrer"&gt;chain-analyzer.com&lt;/a&gt;. Or programmatically via:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="c"&gt;# REST API (subscription)&lt;/span&gt;
curl &lt;span class="nt"&gt;-H&lt;/span&gt; &lt;span class="s2"&gt;"X-API-Key: tfk_..."&lt;/span&gt; &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="s2"&gt;"https://chain-analyzer.com/api/v1/public/scan?address=0x54cdcbdba40e294e8832230db706cee76e1f20f3&amp;amp;chain=avalanche"&lt;/span&gt;

&lt;span class="c"&gt;# x402 USDC micropayment (no account needed, $0.008 / call)&lt;/span&gt;
curl &lt;span class="s2"&gt;"https://chain-analyzer.com/x402/api/address/0x54cdcbdba40e294e8832230db706cee76e1f20f3/risk-score"&lt;/span&gt;

&lt;span class="c"&gt;# MCP (from Claude Desktop, Claude Code, ChatGPT, Gemini, Cursor…)&lt;/span&gt;
&lt;span class="c"&gt;# After configuring chainanalyzer-mcp, just ask your AI: "scan 0x54cdcbdb..."&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;If you find new operator wallets the Master Funder has seeded, please &lt;a href="https://chain-analyzer.com/scamdb" rel="noopener noreferrer"&gt;report them to ScamDB&lt;/a&gt;.&lt;/p&gt;




&lt;p&gt;&lt;em&gt;Investigation by refinancier, inc. All data from public on-chain sources. ChainAnalyzer is a multi-chain AML and security intelligence platform. &lt;a href="https://chain-analyzer.com/en/contact_us" rel="noopener noreferrer"&gt;Contact us&lt;/a&gt; for enterprise or law-enforcement engagement.&lt;/em&gt;&lt;/p&gt;

</description>
      <category>blockchain</category>
      <category>addresspoisoning</category>
      <category>investigation</category>
      <category>onchain</category>
    </item>
    <item>
      <title>Drained for $7.95 — How a Solana Phishing Attack Became a Multi-Chain AML Platform</title>
      <dc:creator>Kenzo ARAI</dc:creator>
      <pubDate>Wed, 29 Apr 2026 10:14:05 +0000</pubDate>
      <link>https://dev.to/rascal3/drained-for-795-how-a-solana-phishing-attack-became-a-multi-chain-aml-platform-316l</link>
      <guid>https://dev.to/rascal3/drained-for-795-how-a-solana-phishing-attack-became-a-multi-chain-aml-platform-316l</guid>
      <description>&lt;p&gt;Every product has an origin story. Ours starts with the founder getting drained for $7.95 on a Sunday afternoon in a Discord server he thought he could trust.&lt;/p&gt;

&lt;p&gt;Two months later, that $7.95 lesson turned into the first entry of a crypto scam database. Four months later, it turned into a multi-chain AML platform. Today it powers &lt;a href="https://chain-analyzer.com" rel="noopener noreferrer"&gt;ChainAnalyzer&lt;/a&gt;, covers 9 blockchains (8 live for self-serve, BNB Smart Chain on Enterprise rollout) with 76+ detection rules, an MCP server on the official registry, an x402 pay-per-call API listed on x402scan, and is being used in enterprise-grade transaction monitoring for Japanese stablecoin operators.&lt;/p&gt;

&lt;p&gt;This is the full story of how that happened — and why it matters.&lt;/p&gt;




&lt;h2&gt;
  
  
  The Drain — 2026-02-09, 14:28 UTC
&lt;/h2&gt;

&lt;p&gt;I was in the &lt;a href="https://orynth.com" rel="noopener noreferrer"&gt;Orynth&lt;/a&gt; Discord. Regular member, followed the project for months.&lt;/p&gt;

&lt;p&gt;A post appeared in the &lt;code&gt;#FCFS&lt;/code&gt; channel from an account with &lt;strong&gt;ORY admin badge&lt;/strong&gt;. First-come-first-served airdrop. Link to &lt;code&gt;solland.cc&lt;/code&gt;. That redirected to &lt;code&gt;hibit.app&lt;/code&gt;. Big "Claim" button. Connect wallet → sign → done.&lt;/p&gt;

&lt;p&gt;Except "done" meant "your SOL just went to the drainer."&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Detail&lt;/th&gt;
&lt;th&gt;Value&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Loss&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;0.093668917 SOL (~$7.95)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Attack method&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;System Program Transfer disguised as a Claim&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Drainer address&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;&lt;code&gt;7kMpieh2THdaC5eUvxFJDL3TdsQWVQCwdhsEjLj1eL26&lt;/code&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Domains&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;
&lt;code&gt;solland.cc&lt;/code&gt;, &lt;code&gt;hibit.app&lt;/code&gt;
&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Entry point&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Compromised ORY admin account on Discord&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Transaction&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;&lt;a href="https://solscan.io/tx/3jnHUZ5TucK5uVFNKJJzaPSf1LfEJhPG9sWomw6he3dj9s46F7ZAj1EAFwRpe4YFSp1yrwujoZA8MdRb4tcDQaJE" rel="noopener noreferrer"&gt;Solscan&lt;/a&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;The punchline isn't the loss — it's that &lt;strong&gt;I fell for it because the account had the admin badge&lt;/strong&gt;. Authority-based trust, weaponized. If I could fall for it after years in crypto, anyone could.&lt;/p&gt;




&lt;h2&gt;
  
  
  What I Did the Next 48 Hours
&lt;/h2&gt;

&lt;p&gt;Instead of posting a warning on Twitter and moving on, I dug in.&lt;/p&gt;

&lt;p&gt;I traced the drainer wallet. It had been funded via &lt;a href="https://fixedfloat.com" rel="noopener noreferrer"&gt;FixedFloat&lt;/a&gt; (KYC-free exchange) and was laundering via Jupiter swap (SOL → USDT) before moving everything back out through FixedFloat. Within hours of my drain, the same wallet hit multiple other victims with Flip.gg and "FREE Spins" lures. It had stolen &lt;strong&gt;$3,700+ total across at least 3,640 USDT and 0.67 SOL&lt;/strong&gt; across dozens of victims over the prior two weeks.&lt;/p&gt;

&lt;p&gt;This wasn't an opportunist. It was a pipeline:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;flowchart LR
    FF[FixedFloat&amp;lt;br/&amp;gt;KYC-free exchange] --&amp;gt;|SOL funding| D[Drainer Wallet&amp;lt;br/&amp;gt;7kMpieh2TH...j1eL26]
    C[Compromised Orynth&amp;lt;br/&amp;gt;admin account] --&amp;gt;|posts solland.cc| V[Victim — me]
    V --&amp;gt;|signs tx| D
    D --&amp;gt;|Jupiter swap| U[USDT]
    U --&amp;gt;|withdrawal| FF
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Same pattern, industrialized. That's when I realized: the problem wasn't "I made a mistake." The problem was that &lt;strong&gt;no tool existed that would have caught this before I signed&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;Existing scanners could tell you if a token was a rug. None of them could tell you "hey, this address you're about to send SOL to has already drained 40 people this week."&lt;/p&gt;




&lt;h2&gt;
  
  
  ScamDB Entry #1
&lt;/h2&gt;

&lt;p&gt;Before I wrote a single line of UI code, I started a JSON file called &lt;code&gt;scamdb.json&lt;/code&gt;. The first entry:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight json"&gt;&lt;code&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"id"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"SCAM-001"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"drainer_address"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"7kMpieh2THdaC5eUvxFJDL3TdsQWVQCwdhsEjLj1eL26"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"domains"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="s2"&gt;"solland.cc"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"hibit.app"&lt;/span&gt;&lt;span class="p"&gt;],&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"method"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"FCFS airdrop phishing → System Program Transfer"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"source"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"Orynth Discord (compromised admin account)"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"reported_at"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"2026-02-09T14:28:33Z"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"reported_by"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"ChainAnalyzer founder (firsthand victim)"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"drainer_profile"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;"total_stolen"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"$3,700+"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;"assets"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"3,640 USDT + 0.67 SOL"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;"laundering"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"Jupiter (SOL→USDT) + FixedFloat withdrawal"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;"funded_by"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"FixedFloat Exchange (KYC-free)"&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;That entry still lives in the production ScamDB today. And it's still the index-1 row in our database. Every scan that ChainAnalyzer does checks against this and ~100+ other curated entries, plus OFAC SDN, Chainabuse, CryptoScamDB, GoPlus, and community reports.&lt;/p&gt;

&lt;p&gt;The &lt;code&gt;$7.95&lt;/code&gt; is the most valuable $7.95 I've ever spent.&lt;/p&gt;




&lt;h2&gt;
  
  
  From TokenForge to ChainAnalyzer
&lt;/h2&gt;

&lt;p&gt;The consumer product we shipped in February 2026 was called &lt;strong&gt;TokenForge&lt;/strong&gt;. Solana-only, 14 detection rules, one-click scan of any mint address or wallet. No login required. Free.&lt;/p&gt;

&lt;p&gt;Two weeks in, something unexpected happened: a friend was investigating an Avalanche address and asked if I could scan it. I didn't have EVM support yet. He showed me what he was seeing — fake Cyrillic &lt;code&gt;UЅDT&lt;/code&gt; tokens being spammed at legitimate wallets, looking pixel-identical to real USDT in every wallet UI.&lt;/p&gt;

&lt;p&gt;I added Avalanche support. Then Ethereum. Then Polygon. Bitcoin later.&lt;/p&gt;

&lt;p&gt;Then I pointed the scanner at that Avalanche address. It flagged CRITICAL with 20 detections. I turned on &lt;strong&gt;Follow Mode&lt;/strong&gt; — a graph exploration feature I'd just shipped — and let it crawl the transaction graph.&lt;/p&gt;

&lt;p&gt;Fourteen wallets became fifty. Fifty became two hundred and sixty-four. &lt;strong&gt;Together they moved $5.3M across three chains.&lt;/strong&gt; Every one of them funded by a single upstream wallet I nicknamed "Master Funder." (&lt;a href="https://chain-analyzer.com/en/news/address-poisoning-network-followup" rel="noopener noreferrer"&gt;Full investigation writeup →&lt;/a&gt;)&lt;/p&gt;

&lt;p&gt;That's when I realized what I was actually building. Not "a consumer scam scanner." An &lt;strong&gt;AML-grade investigation platform for the retail Web3 era&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;In March 2026, we rebranded to &lt;strong&gt;ChainAnalyzer&lt;/strong&gt; and pivoted toward enterprise AML:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Multi-chain support (9 chains supported, 8 live for self-serve, BNB Smart Chain on Enterprise rollout, 76+ detectors)&lt;/li&gt;
&lt;li&gt;Bitcoin coverage that most Chainalysis-style competitors deprioritize&lt;/li&gt;
&lt;li&gt;ML anomaly scoring (Isolation Forest + Autoencoder + GraphSAGE ensemble)&lt;/li&gt;
&lt;li&gt;Neo4j graph analysis for fund flow reconstruction&lt;/li&gt;
&lt;li&gt;PDF compliance reports for Japanese regulatory hand-off&lt;/li&gt;
&lt;li&gt;REST API + MCP server + x402 micropayments (listed on x402scan)&lt;/li&gt;
&lt;/ul&gt;




&lt;h2&gt;
  
  
  What Changed Between TokenForge and ChainAnalyzer
&lt;/h2&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;&lt;/th&gt;
&lt;th&gt;TokenForge (2026-02)&lt;/th&gt;
&lt;th&gt;ChainAnalyzer (2026-04)&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Chains&lt;/td&gt;
&lt;td&gt;Solana only&lt;/td&gt;
&lt;td&gt;9 supported (BTC, ETH, POL, BASE, ARB, OP, AVAX, SOL live + BSC Enterprise rollout)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Detection rules&lt;/td&gt;
&lt;td&gt;14&lt;/td&gt;
&lt;td&gt;76+&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;OSINT&lt;/td&gt;
&lt;td&gt;Our ScamDB&lt;/td&gt;
&lt;td&gt;ScamDB + OFAC + Chainabuse + GoPlus + Reddit&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;ML&lt;/td&gt;
&lt;td&gt;None&lt;/td&gt;
&lt;td&gt;3-model ensemble&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Audience&lt;/td&gt;
&lt;td&gt;Retail Solana traders&lt;/td&gt;
&lt;td&gt;Exchanges, compliance teams, law enforcement&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Differentiator&lt;/td&gt;
&lt;td&gt;Fill Solana OSINT gap&lt;/td&gt;
&lt;td&gt;$5.3M network discovery, JPYC stablecoin AML coverage, native Japanese-language compliance UX&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Interfaces&lt;/td&gt;
&lt;td&gt;Web UI only&lt;/td&gt;
&lt;td&gt;Web UI + REST API + MCP + x402 + PDF reports&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;What stayed the same: &lt;strong&gt;every feature is still exercised against the kind of attack that cost me $7.95&lt;/strong&gt;.&lt;/p&gt;




&lt;h2&gt;
  
  
  Lessons I Wish Someone Had Told Me
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;1. Admin badges mean nothing.&lt;/strong&gt; Discord/Telegram admins get their accounts taken over constantly. Treat a post in your favorite project's server the same way you'd treat a cold DM from a stranger.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;2. "Connect wallet" is not a safe operation.&lt;/strong&gt; The moment you approve a transaction, you've taken an action with financial consequences. Read what you're signing. If you can't read what you're signing, don't sign.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;3. Address-first verification.&lt;/strong&gt; Before sending anything, scan the destination address in a tool like ChainAnalyzer. If it's been reported, you'll know. If it shows graph proximity to known drainers, you'll know. Takes three seconds.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;4. FCFS airdrops are always scams.&lt;/strong&gt; Real projects don't panic people into signing instantly. The urgency is the tell.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;5. Post-mortem immediately.&lt;/strong&gt; When you lose money, trace what happened on-chain before you spiral emotionally. Understand the attack. That understanding is more valuable than the money you lost.&lt;/p&gt;




&lt;h2&gt;
  
  
  Where We Are Today
&lt;/h2&gt;

&lt;p&gt;ChainAnalyzer now:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Processes scans across 9 chains (8 live for self-serve, BNB Smart Chain on Enterprise rollout)&lt;/li&gt;
&lt;li&gt;Runs on Azure Japan East, FISC-aligned hosting&lt;/li&gt;
&lt;li&gt;Has an MCP server &lt;a href="https://www.npmjs.com/package/chainanalyzer-mcp" rel="noopener noreferrer"&gt;on npm&lt;/a&gt; and the &lt;a href="https://registry.modelcontextprotocol.io/v0.1/servers?search=io.github.rascal-3/chainanalyzer-mcp" rel="noopener noreferrer"&gt;official MCP registry&lt;/a&gt;, callable from Claude Desktop / Claude Code / ChatGPT / Gemini / Cursor&lt;/li&gt;
&lt;li&gt;Supports pay-per-request via x402 USDC on Base or Solana — $0.003 to $0.05 per call, no API key, no subscription, &lt;a href="https://www.x402scan.com/server/78ee8ac2-bc8c-4d44-a565-45ead6dd5364" rel="noopener noreferrer"&gt;listed on x402scan&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;Ships a JPYC-specific compliance suite for Japanese stablecoin issuers and handlers&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;All from a $7.95 drain two months ago.&lt;/p&gt;




&lt;h2&gt;
  
  
  What's Next
&lt;/h2&gt;

&lt;p&gt;Two things pulling me forward:&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;1. The $5.3M network is still growing.&lt;/strong&gt; Since our February report, the Master Funder has disbursed another 49,441 AVAX (~$1.24M) to 854 new destination addresses. The ETH collector has received $16.8M USDT from 1,450 senders in two months. These aren't numbers — they're 1,450 real people whose TX history got polluted hoping they'd copy the wrong address. Read the &lt;a href="https://chain-analyzer.com/en/news/address-poisoning-network-followup" rel="noopener noreferrer"&gt;follow-up investigation&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;2. AI agents are about to do this at scale.&lt;/strong&gt; With MCP + x402, any autonomous agent can now screen addresses before signing. The attack vector I fell for — copy-paste from history — becomes impossible if the agent runs &lt;code&gt;check_address_risk&lt;/code&gt; first. This is the biggest single leverage point for retail Web3 safety in years, and ChainAnalyzer is one of the first AML tools wired up to it.&lt;/p&gt;




&lt;h2&gt;
  
  
  Try It
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;Scan an address for free: &lt;a href="https://chain-analyzer.com" rel="noopener noreferrer"&gt;https://chain-analyzer.com&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;Look up the ScamDB (public, no API key): &lt;a href="https://chain-analyzer.com/scamdb" rel="noopener noreferrer"&gt;https://chain-analyzer.com/scamdb&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;MCP server: &lt;code&gt;npx chainanalyzer-mcp&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;REST API: &lt;a href="https://chain-analyzer.com/en/docs/api" rel="noopener noreferrer"&gt;https://chain-analyzer.com/en/docs/api&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;x402 endpoints: &lt;a href="https://chain-analyzer.com/en/docs/x402" rel="noopener noreferrer"&gt;https://chain-analyzer.com/en/docs/x402&lt;/a&gt;
&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;If you've been drained, reach out. Send me the TX. I'll add the drainer to ScamDB. The next person who tries to send to that address will get a CRITICAL flag. That's the whole point.&lt;/p&gt;

&lt;p&gt;One person's $7.95 lesson becomes another person's saved $50,000.&lt;/p&gt;




&lt;p&gt;&lt;em&gt;refinancier, inc. is a Tokyo-based fintech company. We operate ChainAnalyzer, a multi-chain AML &amp;amp; security intelligence platform. Contact: &lt;a href="https://chain-analyzer.com/en/contact_us" rel="noopener noreferrer"&gt;https://chain-analyzer.com/en/contact_us&lt;/a&gt;&lt;/em&gt;&lt;/p&gt;

</description>
      <category>blockchain</category>
      <category>security</category>
      <category>solana</category>
      <category>phishing</category>
    </item>
    <item>
      <title>Shipping x402 USDC Payments to Base + Solana Mainnet for an MCP Server</title>
      <dc:creator>Kenzo ARAI</dc:creator>
      <pubDate>Sat, 25 Apr 2026 13:22:00 +0000</pubDate>
      <link>https://dev.to/rascal3/shipping-x402-usdc-payments-to-base-solana-mainnet-for-an-mcp-server-3a6o</link>
      <guid>https://dev.to/rascal3/shipping-x402-usdc-payments-to-base-solana-mainnet-for-an-mcp-server-3a6o</guid>
      <description>&lt;p&gt;Last week, ChainAnalyzer (a multi-chain blockchain AML platform) crossed&lt;br&gt;&lt;br&gt;
three milestones in five days:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;✅ Merged into &lt;a href="https://github.com/punkpeye/awesome-mcp-servers" rel="noopener noreferrer"&gt;awesome-mcp-servers&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;✅ Earned a &lt;strong&gt;AAA score&lt;/strong&gt; on &lt;a href="https://glama.ai/mcp/servers/rascal-3/chainanalyzer-mcp" rel="noopener noreferrer"&gt;Glama MCP Directory&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;✅ Switched x402 from testnet to &lt;strong&gt;Base + Solana mainnet&lt;/strong&gt; via the
Coinbase CDP Facilitator&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;This post is a brain-dump of how each piece fits together for anyone&lt;br&gt;
building an MCP server with native crypto micropayments.&lt;/p&gt;


&lt;h2&gt;
  
  
  What is x402?
&lt;/h2&gt;

&lt;p&gt;x402 is an HTTP 402 micropayment protocol from Coinbase. The flow:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Client calls a paid endpoint without payment headers&lt;/li&gt;
&lt;li&gt;Server returns &lt;code&gt;HTTP 402 Payment Required&lt;/code&gt; with a JSON body listing
accepted networks, prices, and recipient addresses&lt;/li&gt;
&lt;li&gt;Client signs a USDC transfer matching one of the requirements&lt;/li&gt;
&lt;li&gt;Client retries with &lt;code&gt;X-PAYMENT: &amp;lt;signed payload&amp;gt;&lt;/code&gt; header&lt;/li&gt;
&lt;li&gt;Server verifies via the &lt;em&gt;facilitator&lt;/em&gt; and returns 200 with the result&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;This makes per-request billing trivial for AI agents — no API key&lt;br&gt;&lt;br&gt;
provisioning, no subscription forms.&lt;/p&gt;
&lt;h2&gt;
  
  
  What is MCP?
&lt;/h2&gt;

&lt;p&gt;&lt;a href="https://modelcontextprotocol.io" rel="noopener noreferrer"&gt;Model Context Protocol&lt;/a&gt; is Anthropic's&lt;br&gt;&lt;br&gt;
standard for letting LLMs call tools. Any MCP-compatible client (Claude&lt;br&gt;&lt;br&gt;
Desktop, Claude Code, ChatGPT, Cursor, Cline, Windsurf) can use any MCP&lt;br&gt;&lt;br&gt;
server through a single config file.&lt;/p&gt;
&lt;h2&gt;
  
  
  Combining the two
&lt;/h2&gt;

&lt;p&gt;Our &lt;code&gt;chainanalyzer-mcp&lt;/code&gt; package wraps six tools:&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Tool&lt;/th&gt;
&lt;th&gt;Price (USDC)&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;check_address_risk&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;$0.008&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;sanctions_check&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;$0.003&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;trace_transaction&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;$0.015&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;detect_coinjoin&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;$0.01&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;cluster_wallet&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;$0.02&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;batch_screening&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;$0.05&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;Install:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;npx &lt;span class="nt"&gt;-y&lt;/span&gt; chainanalyzer-mcp
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Or add to &lt;code&gt;claude_desktop_config.json&lt;/code&gt;:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight json"&gt;&lt;code&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"mcpServers"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;"chainanalyzer"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
      &lt;/span&gt;&lt;span class="nl"&gt;"command"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"npx"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
      &lt;/span&gt;&lt;span class="nl"&gt;"args"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="s2"&gt;"-y"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"chainanalyzer-mcp"&lt;/span&gt;&lt;span class="p"&gt;],&lt;/span&gt;&lt;span class="w"&gt;
      &lt;/span&gt;&lt;span class="nl"&gt;"env"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
        &lt;/span&gt;&lt;span class="nl"&gt;"X402_WALLET_PRIVATE_KEY"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"0x..."&lt;/span&gt;&lt;span class="w"&gt;
      &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The &lt;code&gt;X402_WALLET_PRIVATE_KEY&lt;/code&gt; is your &lt;em&gt;spender&lt;/em&gt; wallet — the agent uses&lt;br&gt;&lt;br&gt;
it to sign USDC transfers. If you'd rather pay by subscription, set&lt;br&gt;
&lt;code&gt;CHAINANALYZER_API_KEY=tfk_...&lt;/code&gt; instead.&lt;/p&gt;


&lt;h2&gt;
  
  
  Server-side: x402 on FastAPI
&lt;/h2&gt;

&lt;p&gt;We use a custom middleware (intentionally — we wanted full control over&lt;br&gt;&lt;br&gt;
the Bazaar metadata + bilingual error responses). The core verification&lt;br&gt;
flow:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight python"&gt;&lt;code&gt;&lt;span class="k"&gt;async&lt;/span&gt; &lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;_verify_payment&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;payment&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nb"&gt;str&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;config&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nb"&gt;dict&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;-&amp;gt;&lt;/span&gt; &lt;span class="nb"&gt;bool&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
    &lt;span class="n"&gt;auth_token&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nf"&gt;_generate_cdp_jwt&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
        &lt;span class="n"&gt;method&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;POST&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
        &lt;span class="n"&gt;host&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;api.cdp.coinbase.com&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
        &lt;span class="n"&gt;path&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;/platform/v2/x402/verify&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="n"&gt;headers&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;Content-Type&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;application/json&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;
    &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="n"&gt;auth_token&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
        &lt;span class="n"&gt;headers&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;Authorization&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="sa"&gt;f&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;Bearer &lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="n"&gt;auth_token&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;

    &lt;span class="k"&gt;async&lt;/span&gt; &lt;span class="k"&gt;with&lt;/span&gt; &lt;span class="n"&gt;httpx&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nc"&gt;AsyncClient&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="k"&gt;as&lt;/span&gt; &lt;span class="n"&gt;client&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
        &lt;span class="n"&gt;resp&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;await&lt;/span&gt; &lt;span class="n"&gt;client&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;post&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
            &lt;span class="sa"&gt;f&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="n"&gt;FACILITATOR_URL&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="s"&gt;/verify&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
            &lt;span class="n"&gt;headers&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="n"&gt;headers&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
            &lt;span class="n"&gt;json&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;payment&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;payment&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;requirements&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;{...}},&lt;/span&gt;
        &lt;span class="p"&gt;)&lt;/span&gt;
        &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="n"&gt;resp&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;json&lt;/span&gt;&lt;span class="p"&gt;().&lt;/span&gt;&lt;span class="nf"&gt;get&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;valid&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="bp"&gt;False&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The CDP facilitator wants an Ed25519 JWT signed with the API key from&lt;br&gt;&lt;br&gt;
the &lt;a href="https://portal.cdp.coinbase.com" rel="noopener noreferrer"&gt;CDP portal&lt;/a&gt;. The portal hands you&lt;br&gt;&lt;br&gt;
a base64-encoded private key — sign with &lt;code&gt;cryptography&lt;/code&gt; + &lt;code&gt;PyJWT&lt;/code&gt;:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight python"&gt;&lt;code&gt;&lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="n"&gt;base64&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;time&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;uuid&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;jwt&lt;/span&gt;
&lt;span class="kn"&gt;from&lt;/span&gt; &lt;span class="n"&gt;cryptography.hazmat.primitives.asymmetric.ed25519&lt;/span&gt; &lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="n"&gt;Ed25519PrivateKey&lt;/span&gt;

&lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;_generate_cdp_jwt&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;method&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;host&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;path&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
    &lt;span class="n"&gt;seed&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;base64&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;b64decode&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;CDP_API_KEY_SECRET&lt;/span&gt;&lt;span class="p"&gt;)[:&lt;/span&gt;&lt;span class="mi"&gt;32&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;
    &lt;span class="n"&gt;sk&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;Ed25519PrivateKey&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;from_private_bytes&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;seed&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="n"&gt;now&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nf"&gt;int&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;time&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;time&lt;/span&gt;&lt;span class="p"&gt;())&lt;/span&gt;
    &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="n"&gt;jwt&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;encode&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
        &lt;span class="p"&gt;{&lt;/span&gt;
            &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;iss&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;cdp&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
            &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;sub&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;CDP_API_KEY_ID&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
            &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;nbf&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;now&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
            &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;exp&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;now&lt;/span&gt; &lt;span class="o"&gt;+&lt;/span&gt; &lt;span class="mi"&gt;120&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
            &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;uri&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="sa"&gt;f&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="n"&gt;method&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;upper&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="s"&gt; &lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="n"&gt;host&lt;/span&gt;&lt;span class="si"&gt;}{&lt;/span&gt;&lt;span class="n"&gt;path&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
        &lt;span class="p"&gt;},&lt;/span&gt;
        &lt;span class="n"&gt;sk&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
        &lt;span class="n"&gt;algorithm&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;EdDSA&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
        &lt;span class="n"&gt;headers&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;kid&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;CDP_API_KEY_ID&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;nonce&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;uuid&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;uuid4&lt;/span&gt;&lt;span class="p"&gt;().&lt;/span&gt;&lt;span class="nb"&gt;hex&lt;/span&gt;&lt;span class="p"&gt;},&lt;/span&gt;
    &lt;span class="p"&gt;)&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;That's all. Mainnet billing is now live.&lt;/p&gt;




&lt;h2&gt;
  
  
  Bazaar / Agentic.Market auto-discovery
&lt;/h2&gt;

&lt;p&gt;Coinbase's Bazaar crawler picks up x402 services automatically if your&lt;br&gt;
402 response and &lt;code&gt;/services.json&lt;/code&gt; manifest carry the right metadata:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight python"&gt;&lt;code&gt;&lt;span class="n"&gt;ROUTE_CONFIG&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;GET /api/v1/x402/address/*/risk-score&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;price&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;$0.008&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
        &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;description&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;AML risk score (5 chains, 76+ detectors)&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
        &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;bazaar&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
            &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;discoverable&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="bp"&gt;True&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
            &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;category&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;data&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
            &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;tags&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;aml&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;compliance&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;risk-score&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;blockchain&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;],&lt;/span&gt;
        &lt;span class="p"&gt;},&lt;/span&gt;
    &lt;span class="p"&gt;},&lt;/span&gt;
    &lt;span class="c1"&gt;# ... 5 more routes
&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Then expose &lt;code&gt;services.json&lt;/code&gt;:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight python"&gt;&lt;code&gt;&lt;span class="nd"&gt;@router.get&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;/services.json&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="k"&gt;async&lt;/span&gt; &lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;x402_services_manifest&lt;/span&gt;&lt;span class="p"&gt;():&lt;/span&gt;
    &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;id&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;chainanalyzer&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
        &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;name&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;ChainAnalyzer AML API&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
        &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;category&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;data&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
        &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;x402Version&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="mi"&gt;2&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
        &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;networks&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;base&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;solana&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;],&lt;/span&gt;
        &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;endpoints&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;[...],&lt;/span&gt;
    &lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Bazaar requests this manifest with an empty body, validates the 402&lt;br&gt;&lt;br&gt;
response shape, and indexes the service. End users then find your API&lt;br&gt;&lt;br&gt;
on agentic.market without you submitting anything by hand.&lt;/p&gt;




&lt;h2&gt;
  
  
  Discoverability checklist
&lt;/h2&gt;

&lt;p&gt;If you're building an MCP server that wants to be findable by agents&lt;br&gt;&lt;br&gt;
&lt;em&gt;and&lt;/em&gt; humans, here's what we did (most of it transferable to any service):&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;&lt;code&gt;/llms.txt&lt;/code&gt; + &lt;code&gt;/llms-full.txt&lt;/code&gt;&lt;/strong&gt; — the &lt;a href="https://llmstxt.org" rel="noopener noreferrer"&gt;llmstxt.org&lt;/a&gt;
convention. AI crawlers (Claude, GPT, Mistral, Perplexity) pick this
up to summarize your product.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;&lt;code&gt;/.well-known/ai-plugin.json&lt;/code&gt;&lt;/strong&gt; — older but ChatGPT custom GPTs
still read it.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;&lt;code&gt;robots.txt&lt;/code&gt;&lt;/strong&gt; — explicit &lt;code&gt;Allow:&lt;/code&gt; for &lt;code&gt;GPTBot&lt;/code&gt;, &lt;code&gt;ClaudeBot&lt;/code&gt;,
&lt;code&gt;PerplexityBot&lt;/code&gt;, &lt;code&gt;Google-Extended&lt;/code&gt;, &lt;code&gt;Applebot-Extended&lt;/code&gt;. Don't rely
on &lt;code&gt;User-agent: *&lt;/code&gt;.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;JSON-LD &lt;code&gt;Service&lt;/code&gt; / &lt;code&gt;SoftwareApplication&lt;/code&gt;&lt;/strong&gt; schema on key pages —
AI Overview / Bing Copilot read these.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;IndexNow API&lt;/strong&gt; — pings Bing/Yandex/Naver/Seznam in one HTTP call.
Google ignores it but the cascade picks up.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;awesome-* GitHub lists&lt;/strong&gt; — submit a PR. Surprisingly high CTR.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Glama MCP Directory&lt;/strong&gt; — submit your MCP server, then add a
&lt;code&gt;Dockerfile&lt;/code&gt; to score AAA on security/license/quality.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;MCP Registry&lt;/strong&gt; — official registry at registry.modelcontextprotocol.io.
Submit &lt;code&gt;mcp.json&lt;/code&gt; via PR.&lt;/li&gt;
&lt;/ol&gt;




&lt;h2&gt;
  
  
  What's next
&lt;/h2&gt;

&lt;p&gt;We're investigating Stripe's &lt;a href="https://docs.stripe.com/payments/machine/mpp" rel="noopener noreferrer"&gt;Machine Payments Protocol&lt;/a&gt;&lt;br&gt;&lt;br&gt;
as a parallel rail (cards via Shared Payment Token + Tempo crypto), so&lt;br&gt;&lt;br&gt;
customers without a crypto wallet can still pay per request.&lt;/p&gt;

&lt;p&gt;If you're shipping an MCP server and want to compare notes — drop a&lt;br&gt;&lt;br&gt;
comment or hit me on &lt;a href="https://www.linkedin.com/posts/kenzo-arai-d_mcp-server-launched-call-chainanalyzer-share-7451274705354907648-dmF7?utm_source=share&amp;amp;utm_medium=member_desktop&amp;amp;rcm=ACoAACH0GxIBTlmp61nI3EaRcOYEmeekwneTQ4g" rel="noopener noreferrer"&gt;LinkedIn&lt;/a&gt;.&lt;/p&gt;




&lt;p&gt;&lt;em&gt;Originally posted at &lt;a href="https://chain-analyzer.com/news/mcp-server-launched" rel="noopener noreferrer"&gt;chain-analyzer.com&lt;/a&gt;.&lt;/em&gt;&lt;/p&gt;

</description>
      <category>mcp</category>
      <category>ai</category>
      <category>blockchain</category>
      <category>x402</category>
    </item>
  </channel>
</rss>
