<?xml version="1.0" encoding="utf-8"?>
<rss version="2.0" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:content="http://purl.org/rss/1.0/modules/content/">
    <channel>
        <title>Building ChainAnalyzer</title>
        <link>https://paragraph.com/@chainanalyzer</link>
        <description>Engineering log from refinancier, inc. building ChainAnalyzer — a multi-chain blockchain AML platform with MCP, x402 micropayments, and ML anomaly detection.</description>
        <lastBuildDate>Sat, 07 Nov 2026 14:02:22 GMT</lastBuildDate>
        <docs>https://validator.w3.org/feed/docs/rss2.html</docs>
        <generator>https://github.com/jpmonette/feed</generator>
        <language>en</language>
        <image>
            <title>Building ChainAnalyzer</title>
            <url>https://img.paragraph.com/cdn-cgi/image/format=auto/https://storage.googleapis.com/papyrus_images/1023407c5e9619819ce28f33b738242bc8f5eb7cc8fc962c361631b30a73a2e9.jpg</url>
            <link>https://paragraph.com/@chainanalyzer</link>
        </image>
        <copyright>All rights reserved</copyright>
        <item>
            <title><![CDATA[Binance drain, the TRON leg: a 46-minute freeze, the deposit-receipt escape, and tracing that follows receipts as value]]></title>
            <link>https://paragraph.com/@chainanalyzer/binance-drain-the-tron-leg-a-46-minute-freeze-the-deposit</link>
            <guid>PEpfQONFHaWIkyACdS4v</guid>
            <pubDate>Sat, 31 Oct 2026 00:00:00 GMT</pubDate>
            <description><![CDATA[Oct 31, 2026 Binance drain, the TRON leg: a 46-minute freeze, the deposit-receipt escape, and tracing that follows receipts as value TL;DR — On the TRON leg of the Binance drain, Tether froze the receiving address 46 minutes 27 seconds after 612,729,468 USDT left the hot wallet. Five minutes after that freeze, the attacker made a test deposit into a lending protocol. A lending deposit receipt cannot be frozen by the issuer, so moving the receipt to a new wallet and redeeming there stays one s...]]></description>
            <content:encoded><![CDATA[<p>Oct 31, 2026</p><h1 level="1" textAlign="left" id="h-binance-drain-the-tron-leg-a-46-minute-freeze-the-deposit-receipt-escape-and-tracing-that-follows-receipts-as-value">Binance drain, the TRON leg: a 46-minute freeze, the deposit-receipt escape, and tracing that follows receipts as value</h1><p><strong>TL;DR</strong> — On the TRON leg of the Binance drain, Tether froze the receiving address <strong>46 minutes 27 seconds</strong> after 612,729,468 USDT left the hot wallet. Five minutes after that freeze, the attacker made a test deposit into a lending protocol. A lending deposit receipt cannot be frozen by the issuer, so moving the receipt to a new wallet and redeeming there stays one step ahead of the blacklist. ChainAnalyzer now traces stolen funds on <strong>TRON</strong>, treats <strong>deposit receipts as value</strong>, recognises <strong>TRON exchange hot wallets</strong>, and follows three hops instead of two. Twenty-one wallets created after the drain deposited 7.07M USDT into lending; for six of them (1,638,894 USDT) the TRX came straight from the attacker.</p><h2 level="2" textAlign="left" id="h-what-happened-on-tron-as-far-as-the-chain-shows">What happened on TRON, as far as the chain shows</h2><p>The previous post covered the EIP-7702 sweep on Ethereum. The same night, funds also left the TRON hot wallet &quot;Binance-Hot 7&quot;. Every timestamp below comes from the TRON ledger and Tether&apos;s freeze events.</p><table class="paragraph-table"><colgroup><col><col></colgroup><tbody><tr><th colspan="1" rowspan="1"><p>UTC (29 Oct)</p></th><th colspan="1" rowspan="1"><p>Event</p></th></tr><tr><td colspan="1" rowspan="1"><p>20:20:00</p></td><td colspan="1" rowspan="1"><p>Test transfer of 10,000 TRX from Binance-Hot 7 to the fresh address <code>TG5i…zsGi</code>, followed by 46,394,098 TRX</p></td></tr><tr><td colspan="1" rowspan="1"><p>20:22:45</p></td><td colspan="1" rowspan="1"><p>612,729,468 USDT to the same address</p></td></tr><tr><td colspan="1" rowspan="1"><p>from 20:45:51</p></td><td colspan="1" rowspan="1"><p>300,000,000 USDT moved to <code>TPBk…bKN4</code> in three tranches</p></td></tr><tr><td colspan="1" rowspan="1"><p>21:09:12</p></td><td colspan="1" rowspan="1"><p>Tether blacklists <code>TG5i…zsGi</code>, <strong>46 min 27 s after the drain</strong>. The remaining 312.7M USDT is frozen there</p></td></tr><tr><td colspan="1" rowspan="1"><p>21:14</p></td><td colspan="1" rowspan="1"><p><code>TPBk…bKN4</code> deposits 10,000 USDT into a lending protocol and receives 918,238.74 receipt tokens (jUSDT) in the same transaction</p></td></tr><tr><td colspan="1" rowspan="1"><p>21:16</p></td><td colspan="1" rowspan="1"><p>65,990,000 USDT from <code>TPBk…bKN4</code> to the fresh address <code>TCzB…7Y62</code></p></td></tr><tr><td colspan="1" rowspan="1"><p>21:21:12</p></td><td colspan="1" rowspan="1"><p>Tether blacklists <code>TCzB…7Y62</code>, about five minutes after it was funded. All of it frozen</p></td></tr><tr><td colspan="1" rowspan="1"><p>00:06 next day</p></td><td colspan="1" rowspan="1"><p>46,383,069 TRX to the TRX hub <code>TRBd…PRki</code>. TRX obtained by selling USDT on a DEX also arrives there as three transfers of 120,000,000 TRX; the hub then fans out in 800+ transfers of 15–32M TRX</p></td></tr></tbody></table><p>On TRON, 378.7M USDT ended up frozen in two addresses. Of the 300M USDT that moved before the freeze, 199M went to a swap contract, 33M to a DEX pool manager and 66M to the fresh address that was frozen five minutes later.</p><h2 level="2" textAlign="left" id="h-the-deposit-receipt-escape">The deposit-receipt escape</h2><p>Tether can freeze USDT per address. But when USDT is supplied to a lending protocol, the depositor receives a <strong>receipt token</strong> (jUSDT and the like). The receipt is issued by the protocol, not the issuer, so Tether cannot freeze it. Send the receipt to a new wallet, redeem there, and the redeeming wallet holds USDT at an address that is not on any blacklist.</p><p>Read against the timeline, the 10,000 USDT deposit at 21:14 looks like a test of exactly this route, five minutes after the first freeze at 21:09. The trick also defeats tracing: stolen-fund tracers follow native coins and major stablecoins, and if receipt-token transfers are dismissed as &quot;other tokens of unknown price&quot;, the chain breaks right there.</p><h2 level="2" textAlign="left" id="h-1-stolen-fund-tracing-on-tron">1. Stolen-fund tracing on TRON</h2><p>The tracer that follows outflows from the attacker addresses in the incident database (the &quot;stolen-fund exposure labels&quot; from the previous post) now runs on TRON as well as Ethereum. TRON addresses are base58 and case-sensitive, so the lowercase normalisation used for EVM would turn them into different addresses; the tracer handles that correctly and fetches transfers oldest-first from the contamination time. Attacker addresses attract heavy address-poisoning spam on the inbound side, so outbound and inbound transfers are fetched separately and the outbound page can never be pushed out by spam.</p><p>The <code>binance-2026</code> incident now lists the TRON victim wallet, the primary receiver, the consolidation hubs, the frozen receiver and the TRX feeders. The first pass recorded 169 addresses at hop one and over 800 at hop two.</p><h2 level="2" textAlign="left" id="h-2-deposit-receipts-as-value">2. Deposit receipts as value</h2><p>When a traced address <strong>sends a stablecoin out and receives exactly one other token in the same transaction</strong>, that token is learned as a value carrier for this incident. The rate is &quot;USD sent ÷ tokens received&quot;; nothing is hard-coded. From the test deposit above, 1 jUSDT ≈ 0.0109 USD was learned. From then on, transfers of that token are valued at the learned rate, the recipient is recorded one hop out, and above the threshold it is also registered in ScamDB.</p><ul><li><p>Only the attacker&apos;s own outbound transactions are used for learning. Inbound-only airdrops and spam tokens can never become carriers.</p></li><li><p>If two or more tokens are received in the same transaction, the case is ambiguous and nothing is learned.</p></li><li><p>A DEX swap has the same shape, so swap outputs are learned at the executed rate. For volatile tokens the valuation can drift; the ledger keeps the carrier-derived amount in its own column.</p></li></ul><h2 level="2" textAlign="left" id="h-3-tron-exchange-hot-wallets-and-tracing-depth">3. TRON exchange hot wallets and tracing depth</h2><p>When stolen funds reach a known exchange, the incident page shows the exchange name, never the address. Many TRON exchange hot wallets are missing from our registry, so the tracer now consults the public address tags of TRON&apos;s canonical explorer: addresses tagged as exchanges count as exchange touchpoints, and DEX and bridge contracts are excluded.</p><p>Tracing depth goes from two hops to three. The depositing wallets mostly appear at hop two, and stopping there hides both the receipt learning and what happens next. Hop-three addresses are recorded in the ledger only and are never registered in ScamDB; the line that keeps uninvolved third parties out is unchanged.</p><h2 level="2" textAlign="left" id="h-what-the-chain-shows-about-scale">What the chain shows about scale</h2><p>Supply events on the lending protocol&apos;s USDT market, from the drain at 20:00 UTC on 29 October to 13:30 UTC on 31 October:</p><table class="paragraph-table"><colgroup><col><col></colgroup><tbody><tr><td colspan="1" rowspan="1"><p>Supply events</p></td><td colspan="1" rowspan="1"><p>456 / 253 wallets / 38.66M USDT</p></td></tr><tr><td colspan="1" rowspan="1"><p>Wallets supplying 100,000 USDT or more</p></td><td colspan="1" rowspan="1"><p>42</p></td></tr><tr><td colspan="1" rowspan="1"><p>Of those, created after the drain</p></td><td colspan="1" rowspan="1"><p>21 (7.07M USDT in total)</p></td></tr><tr><td colspan="1" rowspan="1"><p>Of those, TRX funded by the attacker&apos;s hub or its direct recipients</p></td><td colspan="1" rowspan="1"><p>6 (1,638,894 USDT in total)</p></td></tr></tbody></table><p>The six wallets share one route: TRX peeled off the attacker&apos;s hub, swapped to USDT on a DEX, supplied to lending. TRX → DEX → USDT → receipt, four hops in about a day. The other fifteen cannot be tied to the drain on-chain yet, either because the funding is further away or because they are unrelated, so they are not counted.</p><h2 level="2" textAlign="left" id="h-time-to-freeze-from-this-incidents-primary-data">Time to freeze, from this incident&apos;s primary data</h2><table class="paragraph-table"><colgroup><col><col></colgroup><tbody><tr><th colspan="1" rowspan="1"><p>Chain / token</p></th><th colspan="1" rowspan="1"><p>Drain to first freeze</p></th></tr><tr><td colspan="1" rowspan="1"><p>Ethereum / USDT</p></td><td colspan="1" rowspan="1"><p>37 min</p></td></tr><tr><td colspan="1" rowspan="1"><p>Ethereum / USDC</p></td><td colspan="1" rowspan="1"><p>40 min</p></td></tr><tr><td colspan="1" rowspan="1"><p>Ethereum / XSGD</p></td><td colspan="1" rowspan="1"><p>484 min</p></td></tr><tr><td colspan="1" rowspan="1"><p>TRON / USDT</p></td><td colspan="1" rowspan="1"><p>46 min</p></td></tr></tbody></table><p>All values are computed mechanically from the block time of the freeze events and match the freeze-latency card on the incident page. Forty-six minutes on TRON is not slow, yet 300M USDT moved in that window and the receipt route was being tested five minutes after the freeze. A freeze stops the clock. It is not a recovery.</p><p>The incident details and attacker addresses are public at <a target="_blank" rel="noopener noreferrer nofollow ugc" class="dont-break-out" href="/hacks/binance-2026">/hacks/binance-2026</a>. TRON tracing, receipt learning and exchange touchpoints reach every plan through ScamDB matching in wallet scans, the REST API and MCP. The figures in this post are as of 31 October 2026, 13:30 UTC; supply events keep accumulating.</p><h2 level="2" textAlign="left" id="h-share-this-page">Share this page</h2><p><a target="_blank" rel="noopener noreferrer" class="dont-break-out btn btn-outline btn-sm gap-1.5" href="https://twitter.com/intent/tweet?text=Binance+drain%2C+the+TRON+leg%3A+a+46-minute+freeze%2C+the+deposit-receipt+escape%2C+and+tracing+that+follows+receipts+as+value&amp;url=https%3A%2F%2Fchain-analyzer.com%2Fen%2Fnews%2Fbinance-2026-tron-deposit-token"> X</a> <a target="_blank" rel="noopener noreferrer" class="dont-break-out btn btn-outline btn-sm gap-1.5" href="https://www.facebook.com/sharer/sharer.php?u=https%3A%2F%2Fchain-analyzer.com%2Fen%2Fnews%2Fbinance-2026-tron-deposit-token">Facebook</a> <a target="_blank" rel="noopener noreferrer" class="dont-break-out btn btn-outline btn-sm gap-1.5" href="https://www.linkedin.com/sharing/share-offsite/?url=https%3A%2F%2Fchain-analyzer.com%2Fen%2Fnews%2Fbinance-2026-tron-deposit-token">LinkedIn</a> Copy link</p><br>]]></content:encoded>
            <author>chainanalyzer@newsletter.paragraph.com (ChainAnalyzer)</author>
            <enclosure url="https://img.paragraph.com/cdn-cgi/image/format=auto/https://storage.googleapis.com/papyrus_images/f00bf5a712cc6a3f8b76ccc0bcd2c9be64fd0889ccd003337a3dbd0b3ba5b46a.png" length="0" type="image/png"/>
        </item>
        <item>
            <title><![CDATA[Binance hot wallet drain: EIP-7702 delegation detection, an auto-updating USDT/USDC freeze ledger, and stolen-fund exposure labels]]></title>
            <link>https://paragraph.com/@chainanalyzer/binance-hot-wallet-drain-eip-7702-delegation-detection-an</link>
            <guid>NEK5039W6tDlHBwbFKru</guid>
            <pubDate>Fri, 30 Oct 2026 00:00:00 GMT</pubDate>
            <description><![CDATA[Oct 30, 2026 Binance hot wallet drain: EIP-7702 delegation detection, an auto-updating USDT/USDC freeze ledger, and stolen-fund exposure labels TL;DR — At 20:24 UTC on 29 October 2026, 167,464 ETH and 64 tokens left Binance's hot wallet "Binance 14" in a single transaction. Three minutes earlier the wallet had been delegated to an attacker-deployed contract via EIP-7702, and the drain was a sweep executed through that delegated code. In response, ChainAnalyzer adds EIP-7702 delegation detecti...]]></description>
            <content:encoded><![CDATA[<p>Oct 30, 2026</p><h1 level="1" textAlign="left" id="h-binance-hot-wallet-drain-eip-7702-delegation-detection-an-auto-updating-usdtusdc-freeze-ledger-and-stolen-fund-exposure-labels">Binance hot wallet drain: EIP-7702 delegation detection, an auto-updating USDT/USDC freeze ledger, and stolen-fund exposure labels</h1><p><strong>TL;DR</strong> — At 20:24 UTC on 29 October 2026, 167,464 ETH and 64 tokens left Binance&apos;s hot wallet &quot;Binance 14&quot; in a single transaction. Three minutes earlier the wallet had been delegated to an attacker-deployed contract via EIP-7702, and the drain was a sweep executed through that delegated code. In response, ChainAnalyzer adds <strong>EIP-7702 delegation detection (E23)</strong>, <strong>automatic updates of the USDT/USDC freeze ledger</strong>, and <strong>stolen-fund exposure labels (hack exposure)</strong>, and publishes an incident page.</p><h2 level="2" textAlign="left" id="h-what-happened-as-far-as-the-chain-shows">What happened, as far as the chain shows</h2><p>Reported losses range from $2.5B to $5.5B. The incident page only carries what can be verified on the Ethereum ledger.</p><table class="paragraph-table"><colgroup><col><col></colgroup><tbody><tr><th colspan="1" rowspan="1"><p>UTC (29 Oct)</p></th><th colspan="1" rowspan="1"><p>Event</p></th></tr><tr><td colspan="1" rowspan="1"><p>20:20:59</p></td><td colspan="1" rowspan="1"><p>EIP-7702 SetCode transaction addressed to Binance 14: 50 authorizations, all pointing at a contract the attacker deployed that day, with consecutive nonces</p></td></tr><tr><td colspan="1" rowspan="1"><p>20:24:23</p></td><td colspan="1" rowspan="1"><p>Sweep through the delegated code: 167,464 ETH and 64 tokens move as internal transactions to <code>0x5227…2f8c</code></p></td></tr><tr><td colspan="1" rowspan="1"><p>20:24:47</p></td><td colspan="1" rowspan="1"><p>28,005.6 ETH leaves Binance 16 in a plain transfer to the same recipient</p></td></tr><tr><td colspan="1" rowspan="1"><p>20:38:47</p></td><td colspan="1" rowspan="1"><p>195,460 ETH consolidated to <code>0x8532…43d4</code></p></td></tr><tr><td colspan="1" rowspan="1"><p>21:01:35</p></td><td colspan="1" rowspan="1"><p>Tether blacklists the USDT recipient (37 minutes after the sweep), together with the two addresses that had received 700M USDT before the freeze</p></td></tr><tr><td colspan="1" rowspan="1"><p>21:04:59</p></td><td colspan="1" rowspan="1"><p>Circle blacklists the USDC recipient (40 minutes); no USDC had left before the freeze</p></td></tr><tr><td colspan="1" rowspan="1"><p>from 22:06</p></td><td colspan="1" rowspan="1"><p>Tether and Circle also blacklist Binance 14 itself, which reads as a measure against a second sweep while the delegation was live</p></td></tr></tbody></table><p>An EIP-7702 authorization can only be signed with the wallet&apos;s own private key. Fifty valid signatures strongly indicate that the signing key was in the attacker&apos;s hands. EIP-7702 was not the cause; it was the tool that let 65 assets leave in one call. The full walk-through is on the <a target="_blank" rel="noopener noreferrer nofollow ugc" class="dont-break-out" href="/hacks/binance-2026">incident page</a>.</p><h2 level="2" textAlign="left" id="h-what-this-changes-for-investigators">What this changes for investigators</h2><p>After a large exchange drain, stolen funds are swapped, split and consolidated within hours and show up at other exchanges&apos; deposit addresses the next day. The team screening those deposits needs two answers on the spot: has this address touched the 29 October funds, and has the issuer already frozen it. The three additions below exist to answer that.</p><h2 level="2" textAlign="left" id="h-1-eip-7702-delegation-detection-e23">1. EIP-7702 delegation detection (E23)</h2><p>On EVM wallet scans, ChainAnalyzer checks whether the address&apos;s code is the 23-byte EIP-7702 designator starting with <code>0xef0100</code>. If the wallet is delegated, the result shows the delegate contract and whether it is verified.</p><ul><li><p>An <strong>unverified</strong> delegate contract is <strong>HIGH</strong>. An exchange, issuer or custody wallet being delegated at all is abnormal.</p></li><li><p>Delegation plus the sweep signature seen here, <strong>a large internal ETH transfer and many ERC-20 transfers to one recipient within a short window</strong>, escalates to <strong>CRITICAL</strong> with the transactions attached as evidence.</p></li><li><p>A verified wallet implementation as delegate stays at <strong>LOW</strong>, informational only.</p></li></ul><p>Monitoring that only reads normal transactions misses transfers made through delegated code, because they are internal transactions. ChainAnalyzer includes internal transactions in the check.</p><h2 level="2" textAlign="left" id="h-2-automatic-updates-of-the-usdtusdc-freeze-ledger">2. Automatic updates of the USDT/USDC freeze ledger</h2><p>An issuer blacklisting an address is the most reliable first-hand signal that the issuer itself judged it illicit. ChainAnalyzer has collected freeze events mainly for yen stablecoins; from now on every covered token, including USDT and USDC on Ethereum, Polygon and Avalanche, is collected <strong>every six hours</strong> and frozen addresses flow into ScamDB. Un-blacklist events are tracked too, so a released address is not kept dangerous forever.</p><p>Scanning the recipient address frozen on 29 October now shows &quot;frozen by issuer&quot; with the freezing transaction.</p><h2 level="2" textAlign="left" id="h-3-stolen-fund-exposure-labels-hack-exposure">3. Stolen-fund exposure labels (hack exposure)</h2><p>Starting from the attacker addresses registered in the incident database, ChainAnalyzer follows outgoing funds up to <strong>two hops</strong> and registers receiving addresses in ScamDB as recipients of stolen funds. From then on, any wallet scan, REST API call or MCP query on those addresses reports which incident&apos;s funds they touched and at how many hops.</p><ul><li><p>DEX routers, bridges, known exchange hot wallets and token contracts are excluded.</p></li><li><p>When stolen funds reach a <strong>known exchange</strong>, the incident page shows the exchange name, not the address.</p></li><li><p>Hop 1 is <code>danger</code>, hop 2 is <code>warn</code>, and nothing beyond hop 2 is followed. The cap exists so unrelated third parties are not swept in.</p></li></ul><h2 level="2" textAlign="left" id="h-technical-note-reading-a-setcode-transaction">Technical note: reading a SetCode transaction</h2><p>Delegation happens in a <strong>type 0x4</strong> transaction whose <code>authorizationList</code> carries <code>(chainId, address, nonce, signature)</code> tuples. An authorization is only valid for the wallet&apos;s current nonce, and a hot wallet that sends several transactions per second moves its nonce constantly. This transaction bundled <strong>50 signatures with consecutive nonces</strong> so that one of them would match. The technique presupposes an exchange hot wallet as the target.</p><p>Once set, the wallet&apos;s code becomes the 23 bytes <code>0xef0100</code> plus the delegate address. The delegate&apos;s code runs in the wallet&apos;s own context, so the transfers are recorded as the wallet&apos;s transfers, but as <strong>internal transactions</strong>. The sweep call <code>0x8a179be4(address recipient, address[] tokens)</code> listed 65 addresses, the zero address at the front standing for ETH.</p><p>One more observation: minutes after the attacker&apos;s first test transfer, the test recipient started receiving zero-value transactions from addresses sharing its first four characters. That is address poisoning aimed at the attacker, and ChainAnalyzer&apos;s poisoning detector fires on it as it would on anyone else.</p><p>The incident details and attacker addresses are public at <a target="_blank" rel="noopener noreferrer nofollow ugc" class="dont-break-out" href="/hacks/binance-2026">/hacks/binance-2026</a>. EIP-7702 detection is on for EVM wallet scans on every plan; the freeze ledger and exposure labels reach every plan, the REST API and MCP through ScamDB matching.</p><h2 level="2" textAlign="left" id="h-share-this-page">Share this page</h2><p><a target="_blank" rel="noopener noreferrer" class="dont-break-out btn btn-outline btn-sm gap-1.5" href="https://twitter.com/intent/tweet?text=Binance+hot+wallet+drain%3A+EIP-7702+delegation+detection%2C+an+auto-updating+USDT%2FUSDC+freeze+ledger%2C+and+stolen-fund+exposure+labels&amp;url=https%3A%2F%2Fchain-analyzer.com%2Fen%2Fnews%2Fbinance-2026-eip7702-sweep"> X</a> <a target="_blank" rel="noopener noreferrer" class="dont-break-out btn btn-outline btn-sm gap-1.5" href="https://www.facebook.com/sharer/sharer.php?u=https%3A%2F%2Fchain-analyzer.com%2Fen%2Fnews%2Fbinance-2026-eip7702-sweep">Facebook</a> <a target="_blank" rel="noopener noreferrer" class="dont-break-out btn btn-outline btn-sm gap-1.5" href="https://www.linkedin.com/sharing/share-offsite/?url=https%3A%2F%2Fchain-analyzer.com%2Fen%2Fnews%2Fbinance-2026-eip7702-sweep">LinkedIn</a> Copy link</p><br>]]></content:encoded>
            <author>chainanalyzer@newsletter.paragraph.com (ChainAnalyzer)</author>
            <enclosure url="https://img.paragraph.com/cdn-cgi/image/format=auto/https://storage.googleapis.com/papyrus_images/f00bf5a712cc6a3f8b76ccc0bcd2c9be64fd0889ccd003337a3dbd0b3ba5b46a.png" length="0" type="image/png"/>
        </item>
        <item>
            <title><![CDATA[Agent Skill + Claude Code plugin: install ChainAnalyzer AML in one step, and API keys now on every plan]]></title>
            <link>https://paragraph.com/@chainanalyzer/agent-skill-claude-code-plugin-install-chainanalyzer-aml-in</link>
            <guid>MzdpJSGVLrO645BGW0IS</guid>
            <pubDate>Sun, 18 Oct 2026 00:00:00 GMT</pubDate>
            <description><![CDATA[Oct 18, 2026 Agent Skill + Claude Code plugin: install ChainAnalyzer AML in one step, and API keys now on every plan TL;DR — ChainAnalyzer's MCP server (chainanalyzer-mcp v1.5.0) now ships with an Agent Skill for AI agents. In Claude Code, two commands install the MCP server and the skill together. Cursor, Codex CLI, Gemini CLI and other agents that read SKILL.md can use the same skill. We have also made REST API keys available on every plan, including Free, so you can try all 7 tools at no c...]]></description>
            <content:encoded><![CDATA[<p>Oct 18, 2026</p><h1 level="1" textAlign="left" id="h-agent-skill-claude-code-plugin-install-chainanalyzer-aml-in-one-step-and-api-keys-now-on-every-plan">Agent Skill + Claude Code plugin: install ChainAnalyzer AML in one step, and API keys now on every plan</h1><p><strong>TL;DR</strong> — ChainAnalyzer&apos;s MCP server (chainanalyzer-mcp v1.5.0) now ships with an <strong>Agent Skill</strong> for AI agents. <strong>In Claude Code, two commands install the MCP server and the skill together.</strong> Cursor, Codex CLI, Gemini CLI and other agents that read SKILL.md can use the same skill. We have also made <strong>REST API keys available on every plan, including Free</strong>, so you can try all 7 tools at no cost.</p><h2 level="2" textAlign="left" id="h-what-changed">What changed</h2><p>You could already call ChainAnalyzer&apos;s tools from an AI agent by configuring the MCP server. But an MCP server only hands the agent a list of tools. Which chain to treat an address as, which tool to call first, and when to stop were left to the agent.</p><p>The new Agent Skill (a SKILL.md following the Agent Skills spec) gives the agent that procedure. It detects the chain from the address format, calls the cheapest tools first, checks with you before costs add up, and shows the evidence before the conclusion — the same way every time.</p><h2 level="2" textAlign="left" id="h-who-this-helps">Who this helps</h2><ul><li><p><strong>Compliance analysts</strong> can paste a counterparty address and ask &quot;is this sanctioned, and how risky is it?&quot; — and get sanctions and risk results backed by tx hashes and counterparty labels.</p></li><li><p><strong>Developers building agents</strong> can drop in the skill and the MCP server instead of writing their own call ordering and cost controls for AML screening.</p></li><li><p><strong>Anyone who wants to try it first</strong> can try five of the tools with a Free plan API key (10 scans/month, 10 requests/min): sanctions check, risk score, transaction trace, CoinJoin detection and wallet clustering. Batch screening needs Starter or above and bridge tracing needs Business or above.</p></li></ul><h2 level="2" textAlign="left" id="h-how-to-install">How to install</h2><h3 level="3" textAlign="left" id="h-claude-code-plugin">Claude Code (plugin)</h3><p>Run these two commands inside Claude Code to install the MCP server and the skill together:</p><pre class="paragraph-code-block"><code>/plugin marketplace add rascal-3/chainanalyzer-mcp
/plugin install chainanalyzer-aml@chainanalyzer</code></pre><p>Then set <code>CHAINANALYZER_API_KEY</code> in the environment of the shell that launches Claude Code. To pay per call in USDC without an account, set <code>X402_PRIVATE_KEY</code> instead.</p><h3 level="3" textAlign="left" id="h-any-other-agent">Any other agent</h3><p>Copy <code>skills/chainanalyzer-aml/</code> from the GitHub repository into your agent&apos;s skills directory (or run <code>npx skills add rascal-3/chainanalyzer-mcp</code>), and configure the MCP server like this:</p><pre class="paragraph-code-block"><code>{
  &quot;mcpServers&quot;: {
    &quot;chainanalyzer-aml&quot;: {
      &quot;command&quot;: &quot;npx&quot;,
      &quot;args&quot;: [&quot;-y&quot;, &quot;chainanalyzer-mcp&quot;],
      &quot;env&quot;: {
        &quot;CHAINANALYZER_API_KEY&quot;: &quot;tfk_...&quot;
      }
    }
  }
}</code></pre><h3 level="3" textAlign="left" id="h-example-prompts">Example prompts</h3><ul><li><p>&quot;Is this address sanctioned? 0x...&quot;</p></li><li><p>&quot;Check the AML risk of this TRON address and show me the evidence.&quot;</p></li><li><p>&quot;Trace the funds in this Bitcoin transaction and look for signs of mixing.&quot;</p></li><li><p>&quot;Screen these 20 addresses in one batch.&quot;</p></li><li><p>&quot;Follow the funds that left this address through a bridge.&quot;</p></li></ul><h2 level="2" textAlign="left" id="h-the-7-tools">The 7 tools</h2><ul><li><p><strong>sanctions_check</strong> ($0.50) — sanctions lists and ScamDB</p></li><li><p><strong>check_address_risk</strong> ($1.00) — AML risk score, detections and ML anomaly score (all 12 chains)</p></li><li><p><strong>trace_transaction</strong> ($3.00) — transaction fund-flow tracing</p></li><li><p><strong>detect_coinjoin</strong> ($1.00) — CoinJoin and mixing detection (Bitcoin only)</p></li><li><p><strong>cluster_wallet</strong> ($2.50) — addresses likely controlled by the same actor</p></li><li><p><strong>batch_screening</strong> ($5.00) — up to 50 addresses per call</p></li><li><p><strong>bridge_flow_trace</strong> ($3.00) — cross-bridge fund tracing (EVM chains, Solana, Kaia)</p></li></ul><p>Prices are per call in x402 (pay-per-request) mode. With an API key, each call uses one scan from your monthly quota. v1.5.0 also fixes bridge_flow_trace so it is correctly registered in the tool list.</p><h2 level="2" textAlign="left" id="h-api-keys-on-every-plan">API keys on every plan</h2><p>REST API keys (starting with tfk_) can now be issued on every plan, Free included. Request limits are 10/min on Free, 30 on Starter, 60 on Pro, 120 on Business and 300 on Enterprise. Scans made through the API draw from the same monthly quota as scans in the web app.</p><h2 level="2" textAlign="left" id="h-technical-note-what-the-skill-decides">Technical note: what the skill decides</h2><ul><li><p><strong>Chain detection</strong> — <code>bc1</code> / <code>1</code> / <code>3</code> is Bitcoin, <code>T</code> is TRON, <code>r</code> is XRP, 32-44 Base58 characters is Solana, <code>0x</code> plus 40 hex is EVM. The format alone does not identify the EVM chain, so without a hint the agent uses Ethereum and says so.</p></li><li><p><strong>Cheap first</strong> — sanctions check ($0.50), then risk score ($1.00). A sanctions hit is reported immediately; clustering and tracing run only when risk is medium or above, or when you ask to follow the money.</p></li><li><p><strong>Cost gating</strong> — in x402 mode, if a turn would cost more than about $5, the agent asks before running it.</p></li><li><p><strong>Evidence first</strong> — a one-line verdict, then the evidence behind each detection, with next steps offered as options for your own compliance policy. A &quot;safe&quot; result is never presented as a guarantee.</p></li></ul><p>Results are risk indicators based on public ledger data, not legal determinations. Full steps and limitations are in the <a target="_blank" rel="noopener noreferrer nofollow ugc" class="dont-break-out" href="/docs/ai-agents">AI agents documentation</a>.</p><h2 level="2" textAlign="left" id="h-where-it-is-listed">Where it is listed</h2><ul><li><p><a target="_blank" rel="noopener" class="dont-break-out" href="https://registry.modelcontextprotocol.io">Official MCP Registry</a> (<code>io.github.rascal-3/chainanalyzer-mcp</code>)</p></li><li><p><a target="_blank" rel="noopener" class="dont-break-out" href="https://www.npmjs.com/package/chainanalyzer-mcp">npm: chainanalyzer-mcp</a></p></li><li><p><a target="_blank" rel="noopener" class="dont-break-out" href="https://smithery.ai/skills/rascal-3/chainanalyzer-aml">Smithery: chainanalyzer-aml skill</a></p></li><li><p><a target="_blank" rel="noopener" class="dont-break-out" href="https://glama.ai/mcp/servers/rascal-3/chainanalyzer-mcp">Glama</a> (quality score A)</p></li><li><p><a target="_blank" rel="noopener" class="dont-break-out" href="https://github.com/rascal-3/chainanalyzer-mcp">GitHub: rascal-3/chainanalyzer-mcp</a></p></li></ul><p>Trying it is free. <a target="_blank" rel="noopener noreferrer nofollow ugc" class="dont-break-out" href="/login/sign_up?utm_source=news">Create a free account</a>, issue a key under Settings → API Keys, and your agent can start calling the tools. If you are evaluating it for your organization, <a target="_blank" rel="noopener noreferrer nofollow ugc" class="dont-break-out" href="/contact_us">contact us</a>.</p><h2 level="2" textAlign="left" id="h-share-this-page">Share this page</h2><p><a target="_blank" rel="noopener noreferrer" class="dont-break-out btn btn-outline btn-sm gap-1.5" href="https://twitter.com/intent/tweet?text=Agent+Skill+%2B+Claude+Code+plugin%3A+install+ChainAnalyzer+AML+in+one+step%2C+and+API+keys+now+on+every+plan&amp;url=https%3A%2F%2Fchain-analyzer.com%2Fen%2Fnews%2Fagent-skill-claude-code-plugin"> X</a> <a target="_blank" rel="noopener noreferrer" class="dont-break-out btn btn-outline btn-sm gap-1.5" href="https://www.facebook.com/sharer/sharer.php?u=https%3A%2F%2Fchain-analyzer.com%2Fen%2Fnews%2Fagent-skill-claude-code-plugin">Facebook</a> <a target="_blank" rel="noopener noreferrer" class="dont-break-out btn btn-outline btn-sm gap-1.5" href="https://www.linkedin.com/sharing/share-offsite/?url=https%3A%2F%2Fchain-analyzer.com%2Fen%2Fnews%2Fagent-skill-claude-code-plugin">LinkedIn</a> Copy link</p><br>]]></content:encoded>
            <author>chainanalyzer@newsletter.paragraph.com (ChainAnalyzer)</author>
            <enclosure url="https://img.paragraph.com/cdn-cgi/image/format=auto/https://storage.googleapis.com/papyrus_images/f00bf5a712cc6a3f8b76ccc0bcd2c9be64fd0889ccd003337a3dbd0b3ba5b46a.png" length="0" type="image/png"/>
        </item>
        <item>
            <title><![CDATA[zJPYC on-chain: about 1.21 million JPYC sits in a privacy pool — the link is severed, but entry and exit are public]]></title>
            <link>https://paragraph.com/@chainanalyzer/zjpyc-on-chain-about-121-million-jpyc-sits-in-a-privacy-pool-the-link-is-severed-but-entry-and-exit-are-public</link>
            <guid>sdEPbVgeFAYWuA0QZNJ5</guid>
            <pubDate>Fri, 25 Sep 2026 00:00:00 GMT</pubDate>
            <description><![CDATA[Sep 25, 2026 zJPYC on-chain: about 1.21 million JPYC sits in a privacy pool — the link is severed, but entry and exit are public TL;DR — zJPYC is the JPYC wrapper of zERC20, a privacy transfer protocol built on zero-knowledge proofs, live on Polygon and Kaia since June 2026. As of September 25, the zJPYC pool holds about 1.21 million JPYC on Polygon and about 48,000 JPYC on Kaia. The link between sender and recipient is not recorded on-chain, but deposits into the pool and exits through claim...]]></description>
            <content:encoded><![CDATA[<p>Sep 25, 2026</p><h1 level="1" textAlign="left" id="h-zjpyc-on-chain-about-121-million-jpyc-sits-in-a-privacy-pool-the-link-is-severed-but-entry-and-exit-are-public">zJPYC on-chain: about 1.21 million JPYC sits in a privacy pool — the link is severed, but entry and exit are public</h1><p><strong>TL;DR</strong> — zJPYC is the JPYC wrapper of zERC20, a privacy transfer protocol built on zero-knowledge proofs, live on Polygon and Kaia since June 2026. <strong>As of September 25, the zJPYC pool holds about 1.21 million JPYC on Polygon and about 48,000 JPYC on Kaia.</strong> The link between sender and recipient is not recorded on-chain, but deposits into the pool and exits through claims and redemptions are visible on the public ledgers. zERC20 itself states that JPYC Inc. is not involved in providing, co-developing, reviewing or endorsing zJPYC.</p><h2 level="2" textAlign="left" id="h-what-zjpyc-is">What zJPYC is</h2><p>zERC20 is a privacy transfer protocol based on zero-knowledge &quot;proof-of-burn&quot; (in the EIP-7503 family). It has been publicly stated that it was developed by core developers of INTMAX. In plain terms, it works like this:</p><ol><li><p>A user deposits an ERC-20 token into the pool and receives the same amount of a zAsset (zJPYC, in JPYC&apos;s case).</p></li><li><p>The zAsset is sent to a one-time address for which no private key exists. Nothing can ever move out of that address, so the transfer is effectively a burn.</p></li><li><p>The recipient proves, with a zero-knowledge proof, that such a transfer happened, and claims a freshly minted zAsset to their own address.</p></li></ol><p>The proof in step 3 is verified without revealing which transfer it corresponds to, so the link from sender to recipient is never written on-chain. Recipients can claim on a different chain from the one the transfer happened on, and the protocol also supports batch claims (several transfers at once) and partial claims.</p><p>zJPYC is the JPYC version. According to zERC20&apos;s announcement it launched on Polygon on June 11, 2026, and it is also live on Kaia. The contracts share the same addresses on both chains.</p><table class="paragraph-table"><colgroup><col><col></colgroup><tbody><tr><th colspan="1" rowspan="1"><p>Role</p></th><th colspan="1" rowspan="1"><p>Address (same on Polygon and Kaia)</p></th></tr><tr><td colspan="1" rowspan="1"><p>LiquidityManager (holds the JPYC)</p></td><td colspan="1" rowspan="1"><p><code>0x12609c3a7a1a212953417c90472cdcf034965a1c</code></p></td></tr><tr><td colspan="1" rowspan="1"><p>zJPYC token</p></td><td colspan="1" rowspan="1"><p><code>0xd33bed4ae7fe50107c532f63740b1bf2dabf2b30</code></p></td></tr><tr><td colspan="1" rowspan="1"><p>Claim verifier</p></td><td colspan="1" rowspan="1"><p><code>0x106807240d00916c0b1568f2a809f651b6701331</code></p></td></tr></tbody></table><p>zERC20&apos;s page states that JPYC Inc. is not involved in providing, co-developing, reviewing or endorsing zJPYC. zJPYC is not a JPYC Inc. product; it is an unofficial third-party wrapper.</p><h2 level="2" textAlign="left" id="h-what-is-visible-on-chain-and-what-is-not">What is visible on-chain, and what is not</h2><p>Using zJPYC breaks down into four steps on the public ledgers.</p><table class="paragraph-table"><colgroup><col><col></colgroup><tbody><tr><th colspan="1" rowspan="1"><p>Step</p></th><th colspan="1" rowspan="1"><p>What is visible on-chain</p></th></tr><tr><td colspan="1" rowspan="1"><p>1. Deposit (wrap)</p></td><td colspan="1" rowspan="1"><p>JPYC deposited into the LiquidityManager: sender address, amount, time</p></td></tr><tr><td colspan="1" rowspan="1"><p>2. Private send</p></td><td colspan="1" rowspan="1"><p>zJPYC sent to a one-time address: sender address, amount, time</p></td></tr><tr><td colspan="1" rowspan="1"><p>3. Claim</p></td><td colspan="1" rowspan="1"><p>Recipient address, amount, time</p></td></tr><tr><td colspan="1" rowspan="1"><p>4. Redemption</p></td><td colspan="1" rowspan="1"><p>JPYC paid out from the LiquidityManager to the redeemer</p></td></tr></tbody></table><p>The only thing that is not visible is <strong>which send in step 2 corresponds to which claim in step 3</strong>. The link is severed, but both the moment funds enter the pool and the moment they leave it are on record.</p><h2 level="2" textAlign="left" id="h-zjpyc-in-numbers-june-8-september-18-2026">zJPYC in numbers (June 8 – September 18, 2026)</h2><p>Transfer counts run through September 18; balances are as of September 25. *Kaia deposits and payouts are derived from zJPYC mint and burn events; their difference matches the held balance.</p><table class="paragraph-table"><colgroup><col><col><col></colgroup><tbody><tr><th colspan="1" rowspan="1"><p>Item</p></th><th colspan="1" rowspan="1"><p>Polygon</p></th><th colspan="1" rowspan="1"><p>Kaia</p></th></tr><tr><td colspan="1" rowspan="1"><p>JPYC held by the LiquidityManager (Sep 25)</p></td><td colspan="1" rowspan="1"><p>1,211,935 JPYC</p></td><td colspan="1" rowspan="1"><p>48,302 JPYC</p></td></tr><tr><td colspan="1" rowspan="1"><p>JPYC deposits into the LiquidityManager</p></td><td colspan="1" rowspan="1"><p>203 txs / 11,678,247 JPYC</p></td><td colspan="1" rowspan="1"><p>18 txs / 110,136 JPYC*</p></td></tr><tr><td colspan="1" rowspan="1"><p>JPYC paid out by the LiquidityManager</p></td><td colspan="1" rowspan="1"><p>163 txs / 10,466,312 JPYC</p></td><td colspan="1" rowspan="1"><p>28 txs / 61,835 JPYC*</p></td></tr><tr><td colspan="1" rowspan="1"><p>Private sends (to one-time addresses)</p></td><td colspan="1" rowspan="1"><p>7,296</p></td><td colspan="1" rowspan="1"><p>4,714</p></td></tr><tr><td colspan="1" rowspan="1"><p>Claim transactions</p></td><td colspan="1" rowspan="1"><p>5,494</p></td><td colspan="1" rowspan="1"><p>4,217</p></td></tr></tbody></table><p>On Polygon, deposits minus payouts equal the held balance of 1,211,935 JPYC exactly. Across both chains there were 12,010 private sends, from 261 sending addresses to 9,850 one-time addresses. Only 49 of those one-time addresses ever sent anything afterwards.</p><p>Counting any role — deposit, send, claim or redemption — 296 distinct addresses took part. By role, 112 addresses deposited, 94 redeemed and 245 received claims.</p><p>Private sends by month:</p><table class="paragraph-table"><colgroup><col><col><col></colgroup><tbody><tr><th colspan="1" rowspan="1"><p>Month</p></th><th colspan="1" rowspan="1"><p>Private sends</p></th><th colspan="1" rowspan="1"><p>Sending addresses</p></th></tr><tr><td colspan="1" rowspan="1"><p>June 2026</p></td><td colspan="1" rowspan="1"><p>1,709</p></td><td colspan="1" rowspan="1"><p>58</p></td></tr><tr><td colspan="1" rowspan="1"><p>July 2026</p></td><td colspan="1" rowspan="1"><p>5,647</p></td><td colspan="1" rowspan="1"><p>189</p></td></tr><tr><td colspan="1" rowspan="1"><p>August 2026</p></td><td colspan="1" rowspan="1"><p>3,403</p></td><td colspan="1" rowspan="1"><p>75</p></td></tr><tr><td colspan="1" rowspan="1"><p>September 2026 (to the 18th)</p></td><td colspan="1" rowspan="1"><p>1,251</p></td><td colspan="1" rowspan="1"><p>58</p></td></tr></tbody></table><p>The median private send is 3,000 JPYC. The most frequent amount is 10,000 JPYC (3,540 times), followed by 100,000 JPYC (1,372 times), and 56% of private sends are round amounts of 1,000 JPYC or more. The largest single send was 5,000,000 JPYC. A distribution in which the same round amounts recur this often looks more consistent with campaign- or airdrop-style distribution than with individual payments. That is an observation about the distribution only; the actual purposes were not confirmed.</p><p>There is also a cross-chain pattern. Kaia saw only 18 deposits (wraps), yet 4,217 claim transactions. Value mostly enters on Polygon and leaves on Kaia — the ability to claim on a different chain is being used in practice.</p><p>Note that total private-send volume runs to hundreds of millions of JPYC, far above the roughly 11.7 million JPYC ever deposited. The same zJPYC can be claimed and re-sent any number of times, so volume totals should be read as sums over events, not as the amount of value that actually entered the pool.</p><h2 level="2" textAlign="left" id="h-where-this-sits-for-aml">Where this sits for AML</h2><p>Privacy protocols are legal tools with legitimate uses — for example, businesses or individuals who do not want counterparties or salaries exposed on a public ledger. Using one is not in itself a sign of wrongdoing.</p><p>For AML (anti-money laundering) practice, though, the realistic stance is to treat the pool boundary the way you would treat a mixer boundary: rather than trying to rebuild the link, <strong>know when funds entered the pool and when they left it</strong>, and apply due diligence proportionate to the amount. Attribution across the pool cannot and should not be asserted.</p><p>JPYC&apos;s own controls live in the JPYC token contract and do not reach inside the wrapper. Inside the pool the value circulates as zJPYC; it becomes JPYC again only at redemption.</p><h2 level="2" textAlign="left" id="h-how-chainanalyzer-handles-it">How ChainAnalyzer handles it</h2><ul><li><p>ChainAnalyzer registers the zERC20 contracts (zJPYC and the zETH, zUSDC and zBNB pools) as privacy-protocol entities. If a screened address has deposited into or withdrawn from a pool, the scan shows a &quot;privacy protocol&quot; finding with the number of interactions and the total amount.</p></li><li><p>The JPYC issuer dashboard shows the JPYC balance held by the pool on each chain.</p></li><li><p>It does not re-link senders and recipients, and by design it cannot.</p></li></ul><h2 level="2" textAlign="left" id="h-method-and-limitations">Method and limitations</h2><ul><li><p>Data comes from the public ledgers of Polygon and Kaia.</p></li><li><p>Events are classified as deposits, sends, claims or redemptions by the type of interaction with the contracts listed above.</p></li><li><p>Counts and amounts are event totals; when the same value is sent and claimed repeatedly, each occurrence is counted.</p></li><li><p>The pool is in continuous use, so the figures change daily.</p></li><li><p>&quot;Addresses&quot; are not people, and this article makes no attribution of any address to any person or entity.</p></li></ul><p>Anyone who wants to check whether a counterparty&apos;s address has passed through a privacy protocol can try a free scan at <a target="_blank" rel="noopener noreferrer nofollow ugc" class="dont-break-out" href="/">chain-analyzer.com</a>. For business use or bulk screening, please get in touch via our <a target="_blank" rel="noopener noreferrer nofollow ugc" class="dont-break-out" href="/contact_us">contact page</a>.</p><p><em>This article is an analysis based on public information and is not a recommendation to use, buy or sell any crypto asset or service.</em></p><h2 level="2" textAlign="left" id="h-share-this-page">Share this page</h2><p><a target="_blank" rel="noopener noreferrer" class="dont-break-out btn btn-outline btn-sm gap-1.5" href="https://twitter.com/intent/tweet?text=zJPYC+on-chain%3A+about+1.21+million+JPYC+sits+in+a+privacy+pool+%E2%80%94+the+link+is+severed%2C+but+entry+and+exit+are+public&amp;url=https%3A%2F%2Fchain-analyzer.com%2Fen%2Fnews%2Fzjpyc-privacy-pool-onchain"> X</a> <a target="_blank" rel="noopener noreferrer" class="dont-break-out btn btn-outline btn-sm gap-1.5" href="https://www.facebook.com/sharer/sharer.php?u=https%3A%2F%2Fchain-analyzer.com%2Fen%2Fnews%2Fzjpyc-privacy-pool-onchain">Facebook</a> <a target="_blank" rel="noopener noreferrer" class="dont-break-out btn btn-outline btn-sm gap-1.5" href="https://www.linkedin.com/sharing/share-offsite/?url=https%3A%2F%2Fchain-analyzer.com%2Fen%2Fnews%2Fzjpyc-privacy-pool-onchain">LinkedIn</a> Copy link</p><br>]]></content:encoded>
            <author>chainanalyzer@newsletter.paragraph.com (ChainAnalyzer)</author>
            <enclosure url="https://img.paragraph.com/cdn-cgi/image/format=auto/https://storage.googleapis.com/papyrus_images/f00bf5a712cc6a3f8b76ccc0bcd2c9be64fd0889ccd003337a3dbd0b3ba5b46a.png" length="0" type="image/png"/>
        </item>
        <item>
            <title><![CDATA[JPYC's circulating supply rose 2.3× in 48 hours — about half of the increase sits with a small group of addresses that first appeared after the listing]]></title>
            <link>https://paragraph.com/@chainanalyzer/jpycs-circulating-supply-rose-23-in-48-hours-about-half-of-the-increase-sits-with-a-small-group-of-addresses-that-first-appeared-after-the-listing</link>
            <guid>tXO6akwtYTfPQdHcr1jH</guid>
            <pubDate>Sat, 19 Sep 2026 00:00:00 GMT</pubDate>
            <description><![CDATA[Sep 19, 2026 JPYC's circulating supply rose 2.3× in 48 hours — about half of the increase sits with a small group of addresses that first appeared after the listing TL;DR — In the roughly 48 hours after JPYC was listed on the Korean exchange Upbit on September 17, 2026, JPYC's circulating supply rose 2.3×, from ¥1.93B to ¥4.41B. Only Ethereum and Polygon grew; Kaia shrank. ChainAnalyzer tracked balances on four chains at hourly resolution, and almost all of the increase in circulating supply ...]]></description>
            <content:encoded><![CDATA[<p>Sep 19, 2026</p><h1 level="1" textAlign="left" id="h-jpycs-circulating-supply-rose-23-in-48-hours-about-half-of-the-increase-sits-with-a-small-group-of-addresses-that-first-appeared-after-the-listing">JPYC&apos;s circulating supply rose 2.3× in 48 hours — about half of the increase sits with a small group of addresses that first appeared after the listing</h1><p><strong>TL;DR</strong> — In the roughly 48 hours after JPYC was listed on the Korean exchange Upbit on September 17, 2026, JPYC&apos;s circulating supply rose 2.3×, from ¥1.93B to ¥4.41B. Only Ethereum and Polygon grew; Kaia shrank. ChainAnalyzer tracked balances on four chains at hourly resolution, and <strong>almost all of the increase in circulating supply landed in one place</strong>. A group of addresses that received JPYC for the first time 78 minutes after the listing notice held 51.1% of circulating supply 48 hours later (peak 54.9%). That holding reached 78.4% of circulating supply on Ethereum and 56.2% on Polygon. DEX pool inventory, meanwhile, grew by only ¥64M over the three days — 2.6% of the ¥2.48B increase. On September 19 the group began paying JPYC out to external addresses, and the issuer side turned to net redemption on all four chains.</p><h2 level="2" textAlign="left" id="h-what-the-first-report-left-open">What the first report left open</h2><p>The first report re-read the listing-day price dislocation through 55,293 executed trades on decentralized exchanges (DEXs). It showed that the reported highs only printed in trades below 1,000 JPYC, and that most of that day&apos;s new issuance never went through a DEX.</p><p>That leaves a simple question. <strong>If the new JPYC did not go through a DEX, where did it go?</strong> A price chart cannot answer it. Only on-chain balances laid out along a time axis can.</p><p>So balances for JPYC on four chains were collected at hourly resolution for 85 timestamps, from 00:00 on September 16 to 12:00 on September 19 (Japan time). Circulating supply here means <strong>total supply minus the balances held in the issuer&apos;s publicly known operational wallets</strong> — the same definition used on ChainAnalyzer&apos;s issuer pages. All amounts are stated at 1 JPYC = ¥1.</p><h2 level="2" textAlign="left" id="h-1-circulating-supply-went-from-193b-to-441b-and-only-two-chains-grew">1. Circulating supply went from ¥1.93B to ¥4.41B, and only two chains grew</h2><figure float="none" class="paragraph-figure paragraph-figure-none"></figure><br><p>閉じる / Close</p><p>Comparing the two ends of the observation window:</p><table class="paragraph-table"><colgroup><col><col><col></colgroup><tbody><tr><th colspan="1" rowspan="1"><br></th><th colspan="1" rowspan="1"><p>Sep 16, 00:00</p></th><th colspan="1" rowspan="1"><p>Sep 19, 12:00</p></th></tr><tr><td colspan="1" rowspan="1"><p>Total supply</p></td><td colspan="1" rowspan="1"><p>¥8.81B</p></td><td colspan="1" rowspan="1"><p><strong>¥21.29B</strong></p></td></tr><tr><td colspan="1" rowspan="1"><p>Circulating supply</p></td><td colspan="1" rowspan="1"><p>¥1.93B</p></td><td colspan="1" rowspan="1"><p><strong>¥4.41B</strong></p></td></tr></tbody></table><p>Total supply rose 2.4× on ¥12.48B of mints, but circulating supply grew by only ¥2.48B. <strong>As of 12:00 on September 19, ¥16.88B — 79.3% of the ¥21.29B total supply — still sat inside the issuer&apos;s operational wallets and had not reached the market.</strong></p><p>Broken out by chain, only two chains grew.</p><figure float="none" class="paragraph-figure paragraph-figure-none"></figure><br><p>閉じる / Close</p><table class="paragraph-table"><colgroup><col><col><col><col></colgroup><tbody><tr><th colspan="1" rowspan="1"><p>Chain</p></th><th colspan="1" rowspan="1"><p>Sep 16, 00:00</p></th><th colspan="1" rowspan="1"><p>Sep 19, 12:00</p></th><th colspan="1" rowspan="1"><p>Change</p></th></tr><tr><td colspan="1" rowspan="1"><p>Ethereum</p></td><td colspan="1" rowspan="1"><p>¥0.14B</p></td><td colspan="1" rowspan="1"><p>¥1.19B</p></td><td colspan="1" rowspan="1"><p><strong>+¥1.05B</strong></p></td></tr><tr><td colspan="1" rowspan="1"><p>Polygon</p></td><td colspan="1" rowspan="1"><p>¥0.76B</p></td><td colspan="1" rowspan="1"><p>¥2.24B</p></td><td colspan="1" rowspan="1"><p><strong>+¥1.48B</strong></p></td></tr><tr><td colspan="1" rowspan="1"><p>Kaia</p></td><td colspan="1" rowspan="1"><p>¥0.94B</p></td><td colspan="1" rowspan="1"><p>¥0.88B</p></td><td colspan="1" rowspan="1"><p><strong>−¥0.06B</strong></p></td></tr><tr><td colspan="1" rowspan="1"><p>Avalanche</p></td><td colspan="1" rowspan="1"><p>¥0.10B</p></td><td colspan="1" rowspan="1"><p>¥0.10B</p></td><td colspan="1" rowspan="1"><p>roughly flat</p></td></tr></tbody></table><p>Kaia was the largest chain before the listing; 48 hours later Polygon was 2.5× its size. <strong>Kaia is the only chain that shrank.</strong> On Avalanche, ¥2.80B was minted and yet the amount reaching the market barely moved. Kaia also has a separate large holder that predates the listing and is unrelated to it, and that balance has in fact kept declining over these three days.</p><p>Circulating supply itself peaked on the evening of September 18 at about ¥4.49B, and has edged down since.</p><h2 level="2" textAlign="left" id="h-2-where-the-increase-went">2. Where the increase went</h2><p>Counting the destination of the ¥2.48B increase from the holder side gives a clear answer. <strong>A group of addresses that held nothing at all on September 16 held ¥2.25B on September 19 at 12:00 — 51.1% of the ¥4.41B circulating supply.</strong></p><figure float="none" class="paragraph-figure paragraph-figure-none"></figure><br><p>閉じる / Close</p><p>The group first received JPYC at 11:06 on September 17 — 78 minutes after the listing notice (09:48) and seven hours before trading opened (18:00). The path from there:</p><table class="paragraph-table"><colgroup><col><col><col><col></colgroup><tbody><tr><th colspan="1" rowspan="1"><p>Time (JST)</p></th><th colspan="1" rowspan="1"><p>Circulating supply</p></th><th colspan="1" rowspan="1"><p>Held by this group</p></th><th colspan="1" rowspan="1"><p>Share of circulating supply</p></th></tr><tr><td colspan="1" rowspan="1"><p>Sep 16, 00:00</p></td><td colspan="1" rowspan="1"><p>¥1.93B</p></td><td colspan="1" rowspan="1"><p>¥0</p></td><td colspan="1" rowspan="1"><p>0.0%</p></td></tr><tr><td colspan="1" rowspan="1"><p>Sep 17, 18:00 (trading opens)</p></td><td colspan="1" rowspan="1"><p>¥2.04B</p></td><td colspan="1" rowspan="1"><p>¥0.14B</p></td><td colspan="1" rowspan="1"><p>6.7%</p></td></tr><tr><td colspan="1" rowspan="1"><p>Sep 17, 21:00</p></td><td colspan="1" rowspan="1"><p>¥2.40B</p></td><td colspan="1" rowspan="1"><p>¥0.54B</p></td><td colspan="1" rowspan="1"><p>22.4%</p></td></tr><tr><td colspan="1" rowspan="1"><p>Sep 18, 00:00</p></td><td colspan="1" rowspan="1"><p>¥2.62B</p></td><td colspan="1" rowspan="1"><p>¥0.91B</p></td><td colspan="1" rowspan="1"><p>34.6%</p></td></tr><tr><td colspan="1" rowspan="1"><p>Sep 18, 09:00</p></td><td colspan="1" rowspan="1"><p>¥4.26B</p></td><td colspan="1" rowspan="1"><p>¥2.26B</p></td><td colspan="1" rowspan="1"><p>53.1%</p></td></tr><tr><td colspan="1" rowspan="1"><p>Sep 19, 09:00</p></td><td colspan="1" rowspan="1"><p>¥4.44B</p></td><td colspan="1" rowspan="1"><p>¥2.43B</p></td><td colspan="1" rowspan="1"><p><strong>54.9% (peak)</strong></p></td></tr><tr><td colspan="1" rowspan="1"><p>Sep 19, 12:00</p></td><td colspan="1" rowspan="1"><p>¥4.41B</p></td><td colspan="1" rowspan="1"><p>¥2.25B</p></td><td colspan="1" rowspan="1"><p>51.1%</p></td></tr></tbody></table><p>The skew is larger still by chain. As of 12:00 on September 19 the group held <strong>78.4% of circulating supply on Ethereum and 56.2% on Polygon</strong>. On Kaia it held 7.4%, on Avalanche nothing. The chain the first report described as holding &quot;about 7% of all circulating JPYC&quot; multiplied its circulating supply 8.8× in 48 hours, and roughly 80% of that went to this group. <strong>By the time trading opened, 51.3% of Ethereum&apos;s circulating supply was already there.</strong></p><p>The first receipt on Polygon was at 19:31:45 on September 17, eight minutes after the same exchange opened Kaia and Polygon deposits at 19:23:09. The notice, however, was public information available to anyone, and the closeness of the two times is not enough to conclude a relationship between them. The times are simply placed side by side here.</p><h2 level="2" textAlign="left" id="h-3-how-that-group-of-addresses-behaves">3. How that group of addresses behaves</h2><p>The shape of the transfers says a good deal about how the group operates. What follows is measured from 11:06 on September 17 to 12:00 on September 19.</p><ul><li><p><strong>It received 3,341 transfers totaling ¥2.47B from 282 distinct addresses</strong> (181 on Ethereum, 174 on Polygon, 51 on Kaia). Of those, <strong>101 addresses deposited on both Ethereum and Polygon</strong>, and those 101 alone account for 89.7% of the deposit value across the two chains. The same senders are paying into the same receiving addresses across chains.</p></li><li><p><strong>The median deposit is about 300,000 JPYC</strong> (about 310,000 on Ethereum, about 300,000 on Polygon, about 29,000 on Kaia). 688 deposits exceeded 1,000,000 JPYC, and <strong>the ten largest depositors account for roughly half</strong> of the total.</p></li><li><p>The largest depositors are <strong>all ordinary addresses (EOAs); no DEX router or pool, no bridge and no known exchange wallet appears among them</strong>. There is no sign, at least at the top of the list, of JPYC bought in bulk on a DEX flowing in.</p></li><li><p>JPYC arriving at the receiving addresses is swept mechanically into a single destination <strong>at a median interval of about 12 minutes</strong>. The destination is one and the same address on all three chains, and it takes 89–98% of all outbound transfers from the receiving addresses.</p></li></ul><p>This shape — many senders paying into receiving addresses, then a periodic sweep into one place — together with the near-total <strong>absence of outbound payments to external addresses</strong> from September 17 until the morning of September 19 (three days of essentially one-way inflow), is consistent with an operation that pools deposits from many users. As noted below, however, not a single piece of public evidence identifies whose operation it is.</p><p><strong>At 09:08 on September 19, payments out to external addresses began.</strong> This is the first outbound flow of any size. In the three hours that followed, ¥158M left on Polygon and ¥30M on Ethereum. In the same window, transfers back from the sweep destination to the receiving addresses also began, totaling ¥177M. That movement is what took the share from its 54.9% peak down to 51.1%. <strong>Whether those payments are withdrawals to users or moves to somewhere else cannot be determined.</strong></p><h2 level="2" textAlign="left" id="h-4-on-the-issuer-side-day-three-turned-to-net-redemption">4. On the issuer side, day three turned to net redemption</h2><figure float="none" class="paragraph-figure paragraph-figure-none"></figure><br><p>閉じる / Close</p><p>Traffic between the issuer&apos;s operational wallets and the market, by day:</p><table class="paragraph-table"><colgroup><col><col><col><col></colgroup><tbody><tr><th colspan="1" rowspan="1"><p>Date</p></th><th colspan="1" rowspan="1"><p>Issuer&apos;s operational wallets → market</p></th><th colspan="1" rowspan="1"><p>Market → redemption wallet</p></th><th colspan="1" rowspan="1"><p>Net</p></th></tr><tr><td colspan="1" rowspan="1"><p>Sep 17</p></td><td colspan="1" rowspan="1"><p>¥0.77B</p></td><td colspan="1" rowspan="1"><p>¥0.06B</p></td><td colspan="1" rowspan="1"><p><strong>+¥0.71B</strong></p></td></tr><tr><td colspan="1" rowspan="1"><p>Sep 18</p></td><td colspan="1" rowspan="1"><p>¥2.18B</p></td><td colspan="1" rowspan="1"><p>¥0.32B</p></td><td colspan="1" rowspan="1"><p><strong>+¥1.86B</strong></p></td></tr><tr><td colspan="1" rowspan="1"><p>Sep 19 (to 12:00)</p></td><td colspan="1" rowspan="1"><p>¥0.02B</p></td><td colspan="1" rowspan="1"><p>¥0.09B</p></td><td colspan="1" rowspan="1"><p><strong>−¥0.07B</strong></p></td></tr><tr><td colspan="1" rowspan="1"><p><strong>Total</strong></p></td><td colspan="1" rowspan="1"><p><strong>¥2.96B</strong></p></td><td colspan="1" rowspan="1"><p><strong>¥0.47B</strong></p></td><td colspan="1" rowspan="1"><p><strong>+¥2.49B</strong></p></td></tr></tbody></table><p>Net ¥2.49B reached the market over the three days, matching the independently computed change in circulating supply (+¥2.48B) to within ¥20M.</p><p>Two things stand out.</p><p>First, <strong>distribution into the market was extremely dispersed.</strong> 1,405 addresses on Ethereum and 2,055 on Polygon received JPYC from the issuer&apos;s operational wallets, and <strong>even the largest single recipient took less than 0.6% of the total</strong> (the same holds for flows back to the redemption wallet, where the largest was 1.6%). Nearly all of the increase ended up in one place, yet the entrance to it was spread across thousands of addresses.</p><p>Second, <strong>September 19 was net redemption on all four chains.</strong> Issuance that day had all but stopped through 12:00 (¥0.02B across four chains) and flows back to the redemption wallet exceeded it. This is 12 hours of observation on day 2.5, though — not long enough to call a trend.</p><h2 level="2" textAlign="left" id="h-5-dex-inventory-barely-grew">5. DEX inventory barely grew</h2><p>The first report noted that &quot;the JPYC that passed through Ethereum&apos;s DEX pools on the event day was only about 19% of that day&apos;s issuance on Ethereum.&quot; That was a statement about flow; the same conclusion holds for stock.</p><table class="paragraph-table"><colgroup><col><col><col></colgroup><tbody><tr><th colspan="1" rowspan="1"><p>Chain</p></th><th colspan="1" rowspan="1"><p>Sep 16, 00:00</p></th><th colspan="1" rowspan="1"><p>Sep 19, 12:00</p></th></tr><tr><td colspan="1" rowspan="1"><p>Ethereum (1 venue)</p></td><td colspan="1" rowspan="1"><p>¥14.5M</p></td><td colspan="1" rowspan="1"><p>¥34.8M</p></td></tr><tr><td colspan="1" rowspan="1"><p>Polygon (2 venues)</p></td><td colspan="1" rowspan="1"><p>¥23.8M</p></td><td colspan="1" rowspan="1"><p>¥67.3M</p></td></tr><tr><td colspan="1" rowspan="1"><p>Avalanche (1 venue)</p></td><td colspan="1" rowspan="1"><p>¥1.6M</p></td><td colspan="1" rowspan="1"><p>¥1.7M</p></td></tr></tbody></table><p><strong>Inventory across DEX venues grew by a combined ¥64M over the three days — 2.6% of the ¥2.48B increase in circulating supply.</strong> The DEXs were where a price printed on listing day, but they were not where the volume went.</p><h2 level="2" textAlign="left" id="h-6-what-can-and-cannot-be-said">6. What can and cannot be said</h2><p>What is written above is an observation: 48 hours after the listing, about half of circulating JPYC sits with a small group of addresses that first appeared after the listing. Past that point there is a clear line.</p><ul><li><p><strong>Attribution is unconfirmed.</strong> Neither the major block explorers nor ChainAnalyzer&apos;s own registry carries a public name tag for these addresses. That the behavior is consistent with an operation that pools deposits is as far as this goes; no primary evidence identifies whose operation it is.</p></li><li><p><strong>51.1% is a lower bound.</strong> What was tracked here is limited to the addresses that the flow of funds indicates belong to a single entity. If further addresses belonging to the same entity are found, the share goes up.</p></li><li><p><strong>Closeness in time is not causation.</strong> Notices and deposit openings are public; anyone can react at the same moment. This article places times side by side and does not say that anything moved &quot;in response to&quot; anything else.</p></li><li><p><strong>Address counts are not people, and every figure carries a timestamp.</strong> The share moved 3.8 points in three hours on the morning of September 19 alone. Cut the window differently from 48 hours and the picture changes.</p></li></ul><p>Whether concentration is itself good or bad is not assessed here. What is observable is only the fact of which chain, how much, and where it gathered.</p><p>ChainAnalyzer&apos;s issuer pages (no login required) publish per-chain total supply and circulating supply for JPYC and other major stablecoins, along with issuance and redemption events. Anyone tracking supply by chain can use <a target="_blank" rel="noopener noreferrer nofollow ugc" class="dont-break-out" href="/issuers/jpyc">/issuers/jpyc</a>. For the breakdown of prices on listing day, see the first report, &quot;<a target="_blank" rel="noopener noreferrer nofollow ugc" class="dont-break-out" href="/en/news/jpyc-upbit-premium-onchain">Where did JPYC&apos;s &apos;¥4&apos; actually trade?</a>&quot;.</p><h2 level="2" textAlign="left" id="h-method-and-limitations">Method and limitations</h2><ul><li><p>Balances were read directly from each chain&apos;s archive nodes at 85 hourly timestamps from 00:00 on September 16 to 12:00 on September 19 (Japan time). For Avalanche alone, archive node responses did not arrive in time, so the series was reconstructed from transfer history and reconciled against measured values at six timestamps (maximum difference ¥100,000).</p></li><li><p>Circulating supply is defined as total supply minus the balances held in the issuer&apos;s publicly known operational wallets. It is ChainAnalyzer&apos;s own aggregation and differs in definition and timing from figures published elsewhere.</p></li><li><p>Each time series was built by two independent methods (direct balance queries and accumulation from transfer logs) and the two were compared. Across all 85 timestamps the maximum difference was within ¥5M.</p></li><li><p>&quot;Group of addresses&quot; and &quot;holders&quot; refer to sets of addresses, not to people.</p></li><li><p>DEX venue inventory is the JPYC-denominated balance of each chain&apos;s principal JPYC pools and is not exhaustive.</p></li><li><p>The data set ends at 12:00 on September 19, 2026 and does not include anything after that.</p></li></ul><p><em>This article is an analysis based on public information and is not a recommendation to buy or sell any crypto asset. It is not intended to inform investment decisions.</em></p><h2 level="2" textAlign="left" id="h-share-this-page">Share this page</h2><p><a target="_blank" rel="noopener noreferrer" class="dont-break-out btn btn-outline btn-sm gap-1.5" href="https://twitter.com/intent/tweet?text=JPYC%27s+circulating+supply+rose+2.3%C3%97+in+48+hours+%E2%80%94+about+half+of+the+increase+sits+with+a+small+group+of+addresses+that+first+appeared+after+the+listing&amp;url=https%3A%2F%2Fchain-analyzer.com%2Fen%2Fnews%2Fjpyc-circulation-after-listing"> X</a> <a target="_blank" rel="noopener noreferrer" class="dont-break-out btn btn-outline btn-sm gap-1.5" href="https://www.facebook.com/sharer/sharer.php?u=https%3A%2F%2Fchain-analyzer.com%2Fen%2Fnews%2Fjpyc-circulation-after-listing">Facebook</a> <a target="_blank" rel="noopener noreferrer" class="dont-break-out btn btn-outline btn-sm gap-1.5" href="https://www.linkedin.com/sharing/share-offsite/?url=https%3A%2F%2Fchain-analyzer.com%2Fen%2Fnews%2Fjpyc-circulation-after-listing">LinkedIn</a> Copy link</p><br>]]></content:encoded>
            <author>chainanalyzer@newsletter.paragraph.com (ChainAnalyzer)</author>
            <enclosure url="https://img.paragraph.com/cdn-cgi/image/format=auto/https://storage.googleapis.com/papyrus_images/854ff0de6c419efdf6078df1194b0171e8801e9a10ffb056ffa155c2fa6e70d7.png" length="0" type="image/png"/>
        </item>
        <item>
            <title><![CDATA[Where did JPYC's ¥4 actually trade? The Upbit listing dislocation, seen through executed DEX trades]]></title>
            <link>https://paragraph.com/@chainanalyzer/where-did-jpycs-4-actually-trade-the-upbit-listing-dislocation-seen-through-executed-dex-trades</link>
            <guid>9MlguHEpijiwWW5RpQLW</guid>
            <pubDate>Fri, 18 Sep 2026 00:00:00 GMT</pubDate>
            <description><![CDATA[Sep 18, 2026 Where did JPYC's ¥4 actually trade? The Upbit listing dislocation, seen through executed DEX trades TL;DR — On September 17, 2026, the Japanese-yen stablecoin JPYC was listed on Upbit, the largest exchange in Korea, and briefly traded at 37.60 KRW (about ¥4.1). Decentralized exchanges (DEXs) were reported at "¥3–6". ChainAnalyzer aggregated 55,293 executed DEX trades on Ethereum, Polygon and Avalanche. The reported highs only exist in trades below 1,000 JPYC. For trades of 100,00...]]></description>
            <content:encoded><![CDATA[<p>Sep 18, 2026</p><h1 level="1" textAlign="left" id="h-where-did-jpycs-4-actually-trade-the-upbit-listing-dislocation-seen-through-executed-dex-trades">Where did JPYC&apos;s ¥4 actually trade? The Upbit listing dislocation, seen through executed DEX trades</h1><p><strong>TL;DR</strong> — On September 17, 2026, the Japanese-yen stablecoin JPYC was listed on Upbit, the largest exchange in Korea, and briefly traded at 37.60 KRW (about ¥4.1). Decentralized exchanges (DEXs) were reported at &quot;¥3–6&quot;. ChainAnalyzer aggregated 55,293 executed DEX trades on Ethereum, Polygon and Avalanche. <strong>The reported highs only exist in trades below 1,000 JPYC. For trades of 100,000 JPYC or more the ceiling was ¥3.32 on Ethereum and ¥3.51 on Polygon; for 1,000,000 JPYC or more it was ¥1.31 and ¥2.98.</strong> On the issuance side, after 62 days without a single mint, the issuer minted 12.48 billion JPYC in seven transactions between 21:37 on the 17th and 03:23 on the 18th, and 9.9 billion of that came after the price had already returned to roughly ¥1. The start, peak and end of the dislocation fell at different times on each chain; Avalanche recovered five hours before the other two.</p><h2 level="2" textAlign="left" id="h-what-happened">What happened</h2><p>According to Upbit&apos;s notices and price data (both from the exchange&apos;s public API):</p><ul><li><p>At 09:48 on September 17, Upbit announced the listing of JPYC and PYUSD. Trading was scheduled for 12:00, then postponed twice, to 15:00 and then 18:00.</p></li><li><p>Trading opened at 18:00 with a first print of 12.00 KRW. The only trading limit was a floor (−10% from a reference of 8.81 KRW); there was no ceiling.</p></li><li><p>The high of 37.60 KRW (about ¥4.1) printed between 19:20 and 19:25.</p></li><li><p>At 18:44 Upbit announced it would add Kaia and Polygon deposits, and deposits opened at 19:23 (withdrawals later). The same notice added a caution that Korean users face restrictions in using JPYC&apos;s issuance and redemption window directly.</p></li></ul><p>According to press reports, JPYC Inc. paused issuance reservations on Ethereum at 20:34 and on Polygon at 22:19 on the 17th, posting them as incidents, and restored them at 23:43 and 00:22 respectively. The cause is described as under investigation, and the company has not commented on any relationship with the price dislocation. In a written comment to press, JPYC CEO Noritaka Okabe said that the company always receives ¥1 at issuance and can therefore redeem regardless of the secondary-market price (NADA NEWS, September 18).</p><p>What follows is that sequence re-read against executed on-chain trades and issuance data.</p><figure float="none" class="paragraph-figure paragraph-figure-none"><img class="paragraph-editor-image"></figure><br><h2 level="2" textAlign="left" id="h-executed-prices-the-highs-only-printed-in-small-trades">Executed prices: the highs only printed in small trades</h2><p>The data set is every swap between JPYC and a USD stablecoin in Uniswap&apos;s JPYC pools on Ethereum, Polygon and Avalanche from 09:00 JST on September 17 to 12:00 JST on September 18: 55,293 trades. Prices are computed from each trade&apos;s exchange ratio, not from order books or aggregator composites, with USD/JPY fixed at 155.58.</p><p>First, when the dislocation started, peaked and ended on each chain, measured on 15-minute volume-weighted average price (VWAP):</p><table class="paragraph-table"><colgroup><col><col><col><col></colgroup><tbody><tr><th colspan="1" rowspan="1"><p>Chain</p></th><th colspan="1" rowspan="1"><p>Start (first 15-min bar with VWAP above ¥1.20)</p></th><th colspan="1" rowspan="1"><p>Peak (15-min VWAP)</p></th><th colspan="1" rowspan="1"><p>First 15-min bar back below ¥1.05</p></th></tr><tr><td colspan="1" rowspan="1"><p>Ethereum</p></td><td colspan="1" rowspan="1"><p>17th 17:45</p></td><td colspan="1" rowspan="1"><p>17th 18:30 (¥3.14)</p></td><td colspan="1" rowspan="1"><p>18th 02:00</p></td></tr><tr><td colspan="1" rowspan="1"><p>Polygon</p></td><td colspan="1" rowspan="1"><p>17th 18:45</p></td><td colspan="1" rowspan="1"><p>17th 19:15 (¥2.92)</p></td><td colspan="1" rowspan="1"><p>18th 02:00</p></td></tr><tr><td colspan="1" rowspan="1"><p>Avalanche</p></td><td colspan="1" rowspan="1"><p>17th 19:00</p></td><td colspan="1" rowspan="1"><p>17th 19:45 (¥1.39)</p></td><td colspan="1" rowspan="1"><p>17th 21:00</p></td></tr></tbody></table><figure float="none" class="paragraph-figure paragraph-figure-none"><img class="paragraph-editor-image"></figure><br><p>Ethereum began moving at 17:45, before Upbit opened. Avalanche is sometimes reported as &quot;not affected&quot;; it in fact reached ¥1.39 in the 19:45 bar and was back by 21:00. An observation just after midnight would correctly show 1.00×; the difference is the timestamp.</p><p>The next table is the core of this piece: trades between 18:00 and 22:00 on September 17, bucketed by JPYC amount per trade, with the highest price in each bucket.</p><table class="paragraph-table"><colgroup><col><col><col><col><col></colgroup><tbody><tr><th colspan="1" rowspan="1"><p>Trade size (JPYC)</p></th><th colspan="1" rowspan="1"><p>Ethereum trades</p></th><th colspan="1" rowspan="1"><p>Ethereum high</p></th><th colspan="1" rowspan="1"><p>Polygon trades</p></th><th colspan="1" rowspan="1"><p>Polygon high</p></th></tr><tr><td colspan="1" rowspan="1"><p>under 1,000</p></td><td colspan="1" rowspan="1"><p>1,135</p></td><td colspan="1" rowspan="1"><p>¥17.59</p></td><td colspan="1" rowspan="1"><p>5,273</p></td><td colspan="1" rowspan="1"><p>¥12.04</p></td></tr><tr><td colspan="1" rowspan="1"><p>1,000–10,000</p></td><td colspan="1" rowspan="1"><p>1,443</p></td><td colspan="1" rowspan="1"><p>¥13.98</p></td><td colspan="1" rowspan="1"><p>4,810</p></td><td colspan="1" rowspan="1"><p>¥27.55</p></td></tr><tr><td colspan="1" rowspan="1"><p>10,000–100,000</p></td><td colspan="1" rowspan="1"><p>662</p></td><td colspan="1" rowspan="1"><p>¥6.88</p></td><td colspan="1" rowspan="1"><p>3,959</p></td><td colspan="1" rowspan="1"><p>¥9.96</p></td></tr><tr><td colspan="1" rowspan="1"><p>100,000–1,000,000</p></td><td colspan="1" rowspan="1"><p>105</p></td><td colspan="1" rowspan="1"><p><strong>¥3.32</strong></p></td><td colspan="1" rowspan="1"><p>1,049</p></td><td colspan="1" rowspan="1"><p><strong>¥3.51</strong></p></td></tr><tr><td colspan="1" rowspan="1"><p>1,000,000 and above</p></td><td colspan="1" rowspan="1"><p>2</p></td><td colspan="1" rowspan="1"><p><strong>¥1.31</strong></p></td><td colspan="1" rowspan="1"><p>19</p></td><td colspan="1" rowspan="1"><p><strong>¥2.98</strong></p></td></tr></tbody></table><figure float="none" class="paragraph-figure paragraph-figure-none"><img class="paragraph-editor-image"></figure><br><p>The reported levels, &quot;about ¥6.07 on Polygon&quot; and &quot;about ¥4&quot;, never printed in any trade of 100,000 JPYC or more. The larger the amount moved, the closer the realized price stayed to ¥1. &quot;Mint at ¥1 and sell at ¥4&quot; did not work at size. Aggregator highs and 15-minute closes carry no trade-size dimension, so this cannot be read off a price chart.</p><h2 level="2" textAlign="left" id="h-the-issuer-side-the-first-mint-in-62-days-and-99-billion-after-the-recovery">The issuer side: the first mint in 62 days, and 9.9 billion after the recovery</h2><p>Supply data published on ChainAnalyzer&apos;s issuer page (no login required) shows that JPYC&apos;s total supply did not change for 62 days after the mint of July 17. Over that period the circulating amount drifted down from 2.49 billion on September 1 to 1.90 billion on the 16th; demand appears to have been met from already-issued, not-yet-circulating inventory. There were no burns in the past 180 days.</p><figure float="none" class="paragraph-figure paragraph-figure-none"><img class="paragraph-editor-image"></figure><br><p>On the day of the event there were seven mints totaling 12.48 billion JPYC (times in JST):</p><table class="paragraph-table"><colgroup><col><col><col><col></colgroup><tbody><tr><th colspan="1" rowspan="1"><p>Time</p></th><th colspan="1" rowspan="1"><p>Chain</p></th><th colspan="1" rowspan="1"><p>Amount</p></th><th colspan="1" rowspan="1"><p>tx</p></th></tr><tr><td colspan="1" rowspan="1"><p>17th 21:37:59</p></td><td colspan="1" rowspan="1"><p>Ethereum</p></td><td colspan="1" rowspan="1"><p>0.59 B</p></td><td colspan="1" rowspan="1"><p><code>0x12478820…e6fa05</code></p></td></tr><tr><td colspan="1" rowspan="1"><p>17th 21:39:06</p></td><td colspan="1" rowspan="1"><p>Polygon</p></td><td colspan="1" rowspan="1"><p>1.39 B</p></td><td colspan="1" rowspan="1"><p><code>0x192db9bc…147b2b</code></p></td></tr><tr><td colspan="1" rowspan="1"><p>18th 01:19:59</p></td><td colspan="1" rowspan="1"><p>Ethereum</p></td><td colspan="1" rowspan="1"><p>0.60 B</p></td><td colspan="1" rowspan="1"><p><code>0xe71dcaf2…dabfdb</code></p></td></tr><tr><td colspan="1" rowspan="1"><p>18th 03:19:11</p></td><td colspan="1" rowspan="1"><p>Ethereum</p></td><td colspan="1" rowspan="1"><p>2.50 B</p></td><td colspan="1" rowspan="1"><p><code>0xf474ea8a…58d3bf</code></p></td></tr><tr><td colspan="1" rowspan="1"><p>18th 03:20:28</p></td><td colspan="1" rowspan="1"><p>Polygon</p></td><td colspan="1" rowspan="1"><p>2.40 B</p></td><td colspan="1" rowspan="1"><p><code>0x811f1d94…bbaef6</code></p></td></tr><tr><td colspan="1" rowspan="1"><p>18th 03:21:46</p></td><td colspan="1" rowspan="1"><p>Avalanche</p></td><td colspan="1" rowspan="1"><p>2.80 B</p></td><td colspan="1" rowspan="1"><p><code>0x2688ad75…8ddd8e</code></p></td></tr><tr><td colspan="1" rowspan="1"><p>18th 03:22:59</p></td><td colspan="1" rowspan="1"><p>Kaia</p></td><td colspan="1" rowspan="1"><p>2.20 B</p></td><td colspan="1" rowspan="1"><p><code>0xea30e35f…c35e9d</code></p></td></tr></tbody></table><p>Three things stand out when this is laid against the timeline.</p><ol><li><p>The first mint (21:37) came about an hour after the reported pause of Ethereum issuance reservations (20:34). &quot;Issuance reservation&quot; is a user-facing procedure; a mint is on-chain issuance. They are different layers, and the company has not explained the relationship, so here they are only placed side by side.</p></li><li><p>The final 9.9 billion (03:19–03:23, on four chains at once) came about an hour after the executed VWAP on Ethereum and Polygon fell below ¥1.05 at 02:00. It reads less like meeting immediate demand and more like restocking on a scale larger than the pre-event total supply (8.81 billion), but that is an interpretation.</p></li><li><p>Ethereum&apos;s circulating amount on the 18th, 1.203 billion, exceeds the pre-event Ethereum total supply of 1.113 billion. Without additional mints, demand on Ethereum could not have been met. That is consistent with the CEO&apos;s comment that &quot;issuance surged and we ran out of inventory in the middle of the night&quot;, although the company has not said what &quot;inventory&quot; refers to.</p></li></ol><figure float="none" class="paragraph-figure paragraph-figure-none"><img class="paragraph-editor-image"></figure><br><p>One more point about how the pools were used. On the event day about 0.69 billion JPYC passed through Uniswap pools on Ethereum, roughly 19% of the 3.69 billion minted on Ethereum that day (and that figure is gross, including round trips). Inflow of 0.692 billion against outflow of 0.685 billion means the pools held no inventory; they were a corridor. Most of the new issuance did not go through a DEX in this window.</p><h2 level="2" textAlign="left" id="h-why-the-corridor-was-narrow">Why the corridor was narrow</h2><p>If something mints at ¥1 and sells at ¥4, arbitrage should close the gap quickly. It did close, but it took eight hours on Ethereum and Polygon. Every factor cited in press coverage points to the same thing: the corridor between the primary market (issuance and redemption) and the secondary market (exchanges and DEXs) was narrow.</p><ul><li><p>At listing, Upbit supported deposits and withdrawals only on Ethereum, and Ethereum held about 7% of all circulating JPYC.</p></li><li><p>Issuance is capped at ¥1 million per request, and consecutive requests in a short period are not accepted (JPYC Inc. release, May 2026).</p></li><li><p>Using Upbit requires a Korean bank account; issuing or redeeming JPYC requires identity verification with a Japanese My Number card. Very few participants could complete &quot;mint at ¥1, sell on Upbit&quot; alone.</p></li><li><p>The DEX pools that linked Japan and Korea were thin; as the table above shows, trades of tens of thousands of JPYC moved the price several-fold.</p></li></ul><figure float="none" class="paragraph-figure paragraph-figure-none"><img class="paragraph-editor-image"></figure><br><p>A similar listing-day spike in a euro stablecoin was reported on a Korean exchange in August, so this is not specific to JPYC.</p><h2 level="2" textAlign="left" id="h-one-token-one-day-three-prices-and-three-clocks">One token, one day, three prices and three clocks</h2><p>The same token from the same issuer peaked at ¥3.14 on Ethereum, ¥2.92 on Polygon and ¥1.39 on Avalanche on the same day, and recovered at 02:00 on the 18th, 02:00 on the 18th and 21:00 on the 17th respectively. With no official bridge, cross-chain arbitrage runs through the primary market, and the peg is maintained separately on each chain. For anyone settling in a stablecoin, which chain you receive it on is itself a risk factor.</p><p>ChainAnalyzer&apos;s issuer pages publish per-chain total supply, circulating amounts and issuance/redemption events for JPYC and other major stablecoins. Anyone tracking supply by chain can use <a target="_blank" rel="noopener noreferrer nofollow ugc" class="dont-break-out" href="/issuers/jpyc">/issuers/jpyc</a> without logging in.</p><h2 level="2" textAlign="left" id="h-method-and-limitations">Method and limitations</h2><ul><li><p>Prices are computed per trade from swaps between JPYC and USD stablecoins (USDC / USDT / DAI) in Uniswap&apos;s JPYC pools. USD/JPY is fixed at 155.58, the rate at 19:37 JST on September 17. Highs and lows are limited to trades of 50,000 JPYC or more, except in the size-bucket table, which uses every trade.</p></li><li><p>Kaia DEXs are outside this data set; prices on Kaia were not observed.</p></li><li><p>The pause and restoration times for issuance reservations are the values on which several press reports agree. JPYC Inc.&apos;s website carries no notice, so they were not confirmed from a primary source.</p></li><li><p>&quot;Participants&quot; are addresses, not people.</p></li><li><p>Supply and circulating figures are ChainAnalyzer&apos;s own aggregation and differ in definition and timing from figures published elsewhere.</p></li></ul><p><em>This article is an analysis based on public information and is not a recommendation to buy or sell any crypto asset.</em></p><h2 level="2" textAlign="left" id="h-share-this-page">Share this page</h2><p><a target="_blank" rel="noopener noreferrer" class="dont-break-out btn btn-outline btn-sm gap-1.5" href="https://twitter.com/intent/tweet?text=Where+did+JPYC%27s+%C2%A54+actually+trade%3F+The+Upbit+listing+dislocation%2C+seen+through+executed+DEX+trades&amp;url=https%3A%2F%2Fchain-analyzer.com%2Fen%2Fnews%2Fjpyc-upbit-premium-onchain"> X</a> <a target="_blank" rel="noopener noreferrer" class="dont-break-out btn btn-outline btn-sm gap-1.5" href="https://www.facebook.com/sharer/sharer.php?u=https%3A%2F%2Fchain-analyzer.com%2Fen%2Fnews%2Fjpyc-upbit-premium-onchain">Facebook</a> <a target="_blank" rel="noopener noreferrer" class="dont-break-out btn btn-outline btn-sm gap-1.5" href="https://www.linkedin.com/sharing/share-offsite/?url=https%3A%2F%2Fchain-analyzer.com%2Fen%2Fnews%2Fjpyc-upbit-premium-onchain">LinkedIn</a> Copy link</p><br>]]></content:encoded>
            <author>chainanalyzer@newsletter.paragraph.com (ChainAnalyzer)</author>
            <enclosure url="https://img.paragraph.com/cdn-cgi/image/format=auto/https://storage.googleapis.com/papyrus_images/f00bf5a712cc6a3f8b76ccc0bcd2c9be64fd0889ccd003337a3dbd0b3ba5b46a.png" length="0" type="image/png"/>
        </item>
        <item>
            <title><![CDATA[Travel Rule exchange in development (Enterprise)]]></title>
            <link>https://paragraph.com/@chainanalyzer/travel-rule-exchange-in-development-enterprise</link>
            <guid>3igyg2Hu9Gp6MH6ryQCy</guid>
            <pubDate>Sun, 23 Aug 2026 00:00:00 GMT</pubDate>
            <description><![CDATA[Aug 23, 2026 Travel Rule exchange is coming to ChainAnalyzer — screening and transmission in one flow ChainAnalyzer is building a VASP-to-VASP information exchange (transmission) capability for the FATF Travel Rule, offered to Enterprise customers. It integrates the transmission itself with the on-chain risk assessment ChainAnalyzer already provides (recipient screening, sanctions matching, attribution), so that pre-transfer risk decisions and Travel Rule notification complete in a single flo...]]></description>
            <content:encoded><![CDATA[<p>Aug 23, 2026</p><h1 id="h-travel-rule-exchange-is-coming-to-chainanalyzer-screening-and-transmission-in-one-flow" class="text-4xl font-header !mt-8 !mb-4 first:!mt-0 first:!mb-0">Travel Rule exchange is coming to ChainAnalyzer — screening and transmission in one flow</h1><p>ChainAnalyzer is building a <strong>VASP-to-VASP information exchange (transmission) capability</strong> for the FATF Travel Rule, offered to Enterprise customers. It integrates the transmission itself with the on-chain risk assessment ChainAnalyzer already provides (recipient screening, sanctions matching, attribution), so that <strong>pre-transfer risk decisions and Travel Rule notification complete in a single flow</strong>. The core method is <strong>patent pending</strong>.</p><h2 id="h-a-two-stage-risk-gate-check-again-after-approval" class="text-3xl font-header !mt-8 !mb-4 first:!mt-0 first:!mb-0">A two-stage risk gate: check again after approval</h2><p>In the standard Travel Rule exchange (TRP: Travel Rule Protocol), the deposit address is disclosed only when the beneficiary VASP approves. Verifying that just-disclosed address has traditionally been left to manual operations.</p><ul><li><p><strong>Stage 1</strong> — before any exchange starts, the destination and counterparty VASP are screened. If risky, no inquiry is sent at all.</p></li><li><p><strong>Stage 2</strong> — the deposit address disclosed on approval is screened again before on-chain execution. If risk is found, the transfer is <strong>automatically voided even though it was approved</strong>, with the grounds recorded in the audit trail.</p></li></ul><p>Placing procedural &quot;approval&quot; and on-chain &quot;safety&quot; as two independent gates in series structurally removes the blind spot that appears when screening and transmission run as separate services.</p><h2 id="h-personal-data-on-a-separated-foundation" class="text-3xl font-header !mt-8 !mb-4 first:!mt-0 first:!mb-0">Personal data on a separated foundation</h2><p>Originator and beneficiary personal data handled in transmission is encrypted and managed on a <strong>physically separated foundation</strong> from the detection engine. Queries toward the detection engine are mechanically restricted to wallet addresses, chain identifiers, and legal entity names — keeping the screening engine verifiably out of contact with personal data.</p><h2 id="h-jurisdictional-differences-absorbed-by-policy" class="text-3xl font-header !mt-8 !mb-4 first:!mt-0 first:!mb-0">Jurisdictional differences absorbed by policy</h2><p>Notification duties, required data fields, and the treatment of self-hosted wallets differ sharply by jurisdiction (Japan exempts transfers to self-hosted wallets from notification; Peru prohibits the transfer itself when the information cannot be collected). A single engine handles such opposite requirements through per-jurisdiction policy configuration alone.</p><h2 id="h-availability" class="text-3xl font-header !mt-8 !mb-4 first:!mt-0 first:!mb-0">Availability</h2><p>In preparation as an Enterprise add-on, built on TRP (an open standard with interoperability bridges). If you are looking to combine Travel Rule compliance and on-chain AML in one place, please reach out via our contact form.</p><p>* This capability is under development; availability and specifications are subject to change.</p><h2 id="h-share-this-page" class="text-3xl font-header !mt-8 !mb-4 first:!mt-0 first:!mb-0">Share this page</h2><p><a target="_blank" rel="noopener noreferrer" class="dont-break-out btn btn-outline btn-sm gap-1.5" href="https://twitter.com/intent/tweet?text=Travel+Rule+exchange+is+coming+to+ChainAnalyzer+%E2%80%94+screening+and+transmission+in+one+flow&amp;url=https%3A%2F%2Fchain-analyzer.com%2Fen%2Fnews%2Ftravel-rule-development"> X</a> <a target="_blank" rel="noopener noreferrer" class="dont-break-out btn btn-outline btn-sm gap-1.5" href="https://www.facebook.com/sharer/sharer.php?u=https%3A%2F%2Fchain-analyzer.com%2Fen%2Fnews%2Ftravel-rule-development">Facebook</a> <a target="_blank" rel="noopener noreferrer" class="dont-break-out btn btn-outline btn-sm gap-1.5" href="https://www.linkedin.com/sharing/share-offsite/?url=https%3A%2F%2Fchain-analyzer.com%2Fen%2Fnews%2Ftravel-rule-development">LinkedIn</a> Copy link</p><br>]]></content:encoded>
            <author>chainanalyzer@newsletter.paragraph.com (ChainAnalyzer)</author>
            <enclosure url="https://img.paragraph.com/cdn-cgi/image/format=auto/https://storage.googleapis.com/papyrus_images/f00bf5a712cc6a3f8b76ccc0bcd2c9be64fd0889ccd003337a3dbd0b3ba5b46a.png" length="0" type="image/png"/>
        </item>
        <item>
            <title><![CDATA[XRP support: 12 chains for self-serve scanning]]></title>
            <link>https://paragraph.com/@chainanalyzer/xrp-support-12-chains-for-self-serve-scanning</link>
            <guid>fR5mcYi32aGsOh0ajnmt</guid>
            <pubDate>Sun, 09 Aug 2026 00:00:00 GMT</pubDate>
            <description><![CDATA[Aug 9, 2026 XRP goes live: 12 chains for self-serve scanning, full XRPL history included On 2026-08-09, XRP (XRP Ledger) became a fully supported chain on ChainAnalyzer. Beyond native XRP payments, we now scan IOU (issued-currency) tokens too, with the same feature set as every other chain: one-off scans, Watchlist monitoring, Follow Mode graph exploration, and Case Management. That brings self-serve live chains to 12: Bitcoin, Ethereum, Polygon, BNB Smart Chain, Base, Arbitrum, Optimism, Ava...]]></description>
            <content:encoded><![CDATA[<p>Aug 9, 2026</p><h1 id="h-xrp-goes-live-12-chains-for-self-serve-scanning-full-xrpl-history-included" class="text-4xl font-header !mt-8 !mb-4 first:!mt-0 first:!mb-0">XRP goes live: 12 chains for self-serve scanning, full XRPL history included</h1><p>On <strong>2026-08-09</strong>, XRP (XRP Ledger) became a <strong>fully supported chain</strong> on ChainAnalyzer. Beyond native XRP payments, we now scan IOU (issued-currency) tokens too, with the same feature set as every other chain: one-off scans, Watchlist monitoring, Follow Mode graph exploration, and Case Management. That brings self-serve live chains to <strong>12</strong>: Bitcoin, Ethereum, Polygon, BNB Smart Chain, Base, Arbitrum, Optimism, Avalanche, Solana, Kaia, TRON, and XRP.</p><h2 id="h-live-on-every-plan-including-free-from-day-one" class="text-3xl font-header !mt-8 !mb-4 first:!mt-0 first:!mb-0">Live on every plan, including Free, from day one</h2><p>XRP is available on <strong>every plan, including Free</strong>, starting today. Sign up and scan an XRP address immediately — Starter and above get batch scanning, Watchlist monitoring, REST API, and x402 support for XRP as well.</p><h2 id="h-full-history-no-api-key-required" class="text-3xl font-header !mt-8 !mb-4 first:!mt-0 first:!mb-0">Full history, no API key required</h2><p>The XRP Ledger runs on <strong>Ripple&apos;s official full-history clusters</strong> (<code>s2.ripple.com</code>, with <code>xrplcluster.com</code> as fallback) — public infrastructure that needs no credential at all. Unlike EVM chains that require an Etherscan-family API key, or TRON where we integrate a dedicated API provider, there&apos;s no BYOK setting for XRP: every user gets the same full-history access on day one.</p><h2 id="h-partial-payment-correction-the-amount-actually-received-not-the-amount-advertised" class="text-3xl font-header !mt-8 !mb-4 first:!mt-0 first:!mb-0">Partial Payment correction: the amount actually received, not the amount advertised</h2><p>XRPL supports <strong>Partial Payment</strong>, a transaction type where the sender can settle for less than the amount originally specified — meaning the headline transfer amount in raw transaction data can overstate what actually moved. ChainAnalyzer corrects every Partial-Payment-flagged transaction against the <code>delivered_amount</code> field, so fund-flow analysis and risk scoring are always based on the <strong>amount actually delivered</strong>, not the advertised send amount.</p><h2 id="h-same-detection-depth-as-every-other-chain-plus-a-destination-tag-disclosure" class="text-3xl font-header !mt-8 !mb-4 first:!mt-0 first:!mb-0">Same detection depth as every other chain, plus a Destination Tag disclosure</h2><p>OFAC sanctions screening, sanctioned-counterparty detection, dust attack detection, peel chain and fund-splitting detection, and KYT risk rating all run on XRP exactly as they do elsewhere. ScamDB matching, Follow Mode graph exploration, and case ingestion work unchanged.</p><p>One XRPL-specific nuance we surface directly in the scan result: exchanges commonly share a single deposit address across many users and tell customers apart with a <strong>Destination Tag</strong>. A scan verdict on such an address can therefore reflect the activity of the exchange as a whole rather than one individual user — tag-level analysis is not supported, and we disclose this explicitly wherever it applies.</p><p>XRP support is available on every plan, including Free. Existing Watchlist items and cases are untouched; just pick XRP from the chain selector when scanning. Ripple&apos;s official clusters are free and public, so there&apos;s no API key to configure.</p><h2 id="h-share-this-page" class="text-3xl font-header !mt-8 !mb-4 first:!mt-0 first:!mb-0">Share this page</h2><p><a target="_blank" rel="noopener noreferrer" class="dont-break-out btn btn-outline btn-sm gap-1.5" href="https://twitter.com/intent/tweet?text=XRP+goes+live%3A+12+chains+for+self-serve+scanning%2C+full+XRPL+history+included&amp;url=https%3A%2F%2Fchain-analyzer.com%2Fen%2Fnews%2Fxrp-support-launch"> X</a> <a target="_blank" rel="noopener noreferrer" class="dont-break-out btn btn-outline btn-sm gap-1.5" href="https://www.facebook.com/sharer/sharer.php?u=https%3A%2F%2Fchain-analyzer.com%2Fen%2Fnews%2Fxrp-support-launch">Facebook</a> <a target="_blank" rel="noopener noreferrer" class="dont-break-out btn btn-outline btn-sm gap-1.5" href="https://www.linkedin.com/sharing/share-offsite/?url=https%3A%2F%2Fchain-analyzer.com%2Fen%2Fnews%2Fxrp-support-launch">LinkedIn</a> Copy link</p><br>]]></content:encoded>
            <author>chainanalyzer@newsletter.paragraph.com (ChainAnalyzer)</author>
            <enclosure url="https://img.paragraph.com/cdn-cgi/image/format=auto/https://storage.googleapis.com/papyrus_images/f00bf5a712cc6a3f8b76ccc0bcd2c9be64fd0889ccd003337a3dbd0b3ba5b46a.png" length="0" type="image/png"/>
        </item>
        <item>
            <title><![CDATA[TRON support: 11 chains for self-serve scanning]]></title>
            <link>https://paragraph.com/@chainanalyzer/tron-support-11-chains-for-self-serve-scanning</link>
            <guid>3SaBW2uOCGagLi5CQcD9</guid>
            <pubDate>Sun, 09 Aug 2026 00:00:00 GMT</pubDate>
            <description><![CDATA[Aug 9, 2026 TRON goes live: 11 chains for self-serve scanning, TRC20/USDT included On 2026-08-09, TRON became a fully supported chain on ChainAnalyzer. Beyond native TRX transfers, we now scan TRC20 tokens — including USDT-TRC20, the highest-volume stablecoin transfer rail on any chain — with the same feature set as every other chain: one-off scans, Watchlist monitoring, Follow Mode graph exploration, and Case Management. That brings self-serve live chains to 11: Bitcoin, Ethereum, Polygon, B...]]></description>
            <content:encoded><![CDATA[<p>Aug 9, 2026</p><h1 id="h-tron-goes-live-11-chains-for-self-serve-scanning-trc20usdt-included" class="text-4xl font-header !mt-8 !mb-4 first:!mt-0 first:!mb-0">TRON goes live: 11 chains for self-serve scanning, TRC20/USDT included</h1><p>On <strong>2026-08-09</strong>, TRON became a <strong>fully supported chain</strong> on ChainAnalyzer. Beyond native TRX transfers, we now scan TRC20 tokens — including <strong>USDT-TRC20</strong>, the highest-volume stablecoin transfer rail on any chain — with the same feature set as every other chain: one-off scans, Watchlist monitoring, Follow Mode graph exploration, and Case Management. That brings self-serve live chains to <strong>11</strong>: Bitcoin, Ethereum, Polygon, BNB Smart Chain, Base, Arbitrum, Optimism, Avalanche, Solana, Kaia, and TRON.</p><h2 id="h-live-on-every-plan-including-free-from-day-one" class="text-3xl font-header !mt-8 !mb-4 first:!mt-0 first:!mb-0">Live on every plan, including Free, from day one</h2><p>TRON is available on <strong>every plan, including Free</strong>, starting today. Sign up and scan a TRON address immediately — Starter and above get batch scanning, Watchlist monitoring, REST API, and x402 support for TRON as well.</p><h2 id="h-same-detection-depth-as-every-other-chain" class="text-3xl font-header !mt-8 !mb-4 first:!mt-0 first:!mb-0">Same detection depth as every other chain</h2><p>OFAC sanctions screening (the TRX-denominated SDN list), dust attack detection, peel chain analysis, Chainalysis KYT risk rating, Alterya ML risk scoring, and social/web mention detection all run on TRON exactly as they do elsewhere. ScamDB matching, Follow Mode graph exploration, and case ingestion work unchanged.</p><h2 id="h-engineering-note-tron-is-not-evm" class="text-3xl font-header !mt-8 !mb-4 first:!mt-0 first:!mb-0">Engineering note: TRON is not EVM</h2><p>TRON runs on the TVM (TRON Virtual Machine) and does not share the Etherscan-compatible API surface that every Ethereum-family chain we support relies on. Addresses are <strong>Base58Check</strong>-encoded (34 characters starting with <code>T</code>), not <code>0x...</code> — and critically, <strong>case-significant</strong>, unlike EVM addresses. Rather than bolting TRON onto the EVM scanner, we built an <strong>independent scanner pipeline backed by the TronGrid API</strong> (the same design pattern as our Bitcoin pipeline). Everything it returns is normalized into the existing Etherscan <code>tokentx</code> shape, so the detector logic and Neo4j ingestion code paths work unchanged.</p><p>TRON support is available on every plan, including Free. Existing Watchlist items and cases are untouched; just pick TRON from the chain selector when scanning. Set up a TronGrid API key via BYOK for deeper analysis.</p><h2 id="h-share-this-page" class="text-3xl font-header !mt-8 !mb-4 first:!mt-0 first:!mb-0">Share this page</h2><p><a target="_blank" rel="noopener noreferrer" class="dont-break-out btn btn-outline btn-sm gap-1.5" href="https://twitter.com/intent/tweet?text=TRON+goes+live%3A+11+chains+for+self-serve+scanning%2C+TRC20%2FUSDT+included&amp;url=https%3A%2F%2Fchain-analyzer.com%2Fen%2Fnews%2Ftron-support-launch"> X</a> <a target="_blank" rel="noopener noreferrer" class="dont-break-out btn btn-outline btn-sm gap-1.5" href="https://www.facebook.com/sharer/sharer.php?u=https%3A%2F%2Fchain-analyzer.com%2Fen%2Fnews%2Ftron-support-launch">Facebook</a> <a target="_blank" rel="noopener noreferrer" class="dont-break-out btn btn-outline btn-sm gap-1.5" href="https://www.linkedin.com/sharing/share-offsite/?url=https%3A%2F%2Fchain-analyzer.com%2Fen%2Fnews%2Ftron-support-launch">LinkedIn</a> Copy link</p><br>]]></content:encoded>
            <author>chainanalyzer@newsletter.paragraph.com (ChainAnalyzer)</author>
            <enclosure url="https://img.paragraph.com/cdn-cgi/image/format=auto/https://storage.googleapis.com/papyrus_images/f00bf5a712cc6a3f8b76ccc0bcd2c9be64fd0889ccd003337a3dbd0b3ba5b46a.png" length="0" type="image/png"/>
        </item>
        <item>
            <title><![CDATA[IMOZURU: one input, an autonomous investigation, and a report]]></title>
            <link>https://paragraph.com/@chainanalyzer/imozuru-one-input-an-autonomous-investigation-and-a-report</link>
            <guid>zz4RFB3JrIoTgTalCXRD</guid>
            <pubDate>Wed, 05 Aug 2026 00:00:00 GMT</pubDate>
            <description><![CDATA[Aug 5, 2026 IMOZURU: one input runs the whole investigation loop — and writes the report ChainAnalyzer now ships IMOZURU. Give it one address (or transaction) and it follows the money on its own, all the way to an investigation report PDF and an investigation case. Available on the Business plan and above. What changed — giving analysts their time back Until now, an investigation meant a human running the same loop on top of a tool: scan an address, look at the graph, choose the next address ...]]></description>
            <content:encoded><![CDATA[<p>Aug 5, 2026</p><h1 id="h-imozuru-one-input-runs-the-whole-investigation-loop-and-writes-the-report" class="text-4xl font-header !mt-8 !mb-4 first:!mt-0 first:!mb-0">IMOZURU: one input runs the whole investigation loop — and writes the report</h1><p>ChainAnalyzer now ships <strong>IMOZURU</strong>. Give it one address (or transaction) and it follows the money on its own, all the way to an <strong>investigation report PDF</strong> and an <strong>investigation case</strong>. Available on the Business plan and above.</p><h2 id="h-what-changed-giving-analysts-their-time-back" class="text-3xl font-header !mt-8 !mb-4 first:!mt-0 first:!mb-0">What changed — giving analysts their time back</h2><p>Until now, an investigation meant a human running the same loop on top of a tool: scan an address, look at the graph, choose the next address to follow, back out of the dead ends, and finally write the trail up as a report. A single case can mean running that loop hundreds of times.</p><p>IMOZURU runs <strong>that loop</strong> for you. The point is not that there are more detection rules. What is new is the automation of the work that was still left to a person — deciding where to pivot next, deciding when a branch is not worth following, and turning the path taken into prose.</p><ul><li><p>Resolve the input → scan → ingest into the graph → search for endpoints</p></li><li><p>Pick the addresses to follow next, and decide whether to stop</p></li><li><p>Generate the investigation report PDF and create the case automatically</p></li></ul><p>Related addresses on other chains are correlated and explored even when no bridge left a trace to follow.</p><h2 id="h-a-measured-run" class="text-3xl font-header !mt-8 !mb-4 first:!mt-0 first:!mb-0">A measured run</h2><p>Recorded from a single seed address of the address-poisoning network of roughly 800 million JPY that we found and published ourselves.</p><ul><li><p><strong>71 addresses</strong> discovered autonomously in about <strong>12 minutes</strong></p></li><li><p>Of those, <strong>57 terminals</strong> (endpoints not followed further) and <strong>5 infrastructure nodes</strong></p></li><li><p><strong>4 confirmed</strong> common-operator attributions</p></li></ul><p>A branch <strong>stops automatically</strong> once it reaches an exchange, a DEX router, or a bridge. Expanding a hub of that size would flood the investigation with unrelated traffic. A terminal does not mean the funds disappeared there — read it as a marker for <strong>who to ask next, or where to resume the trace</strong>.</p><p>Note: counts and elapsed time depend on the shape of the network, upstream data availability, and the budget you allow. The same input will not always yield the same counts, and the figures above are not a guarantee of reproduction.</p><h2 id="h-reading-the-output" class="text-3xl font-header !mt-8 !mb-4 first:!mt-0 first:!mb-0">Reading the output</h2><p>IMOZURU never blends <strong>what the machine observed</strong> with <strong>what the model wrote</strong>.</p><ul><li><p><strong>Per-section labels</strong> — the report has 8 sections, and every heading carries either an AI-generated or a machine-extracted label. When the material is used in legal or regulatory filings, verify against the machine-extracted sections as the source.</p></li><li><p><strong>Confirmed vs estimated</strong> — common-operator attribution is reported in two bands: confirmed (directly observed) and estimated (a synthesis of circumstantial evidence, not an assertion). The confidence score is not a probability: a score of 80 does not mean an 80% chance of a common operator, it is an internal measure of how many signals lined up and how strongly.</p></li><li><p><strong>Fund sizes are lower bounds</strong> — all three measures in the report are computed only from transactions that were actually observed; paths that were never observed are excluded. We deliberately avoid the phrase &quot;total damages&quot; because it has no single definition.</p></li><li><p><strong>A case is created for you</strong> — on completion, the addresses that were found are collected into an investigation case. Each address keeps its genealogy — which address it came from, at which hop, why it was picked up, and the transaction hash behind it — so the discovery path stays auditable. On Enterprise, the case feeds the suspicious transaction report (STR) support package.</p></li></ul><h2 id="h-plan-and-limits" class="text-3xl font-header !mt-8 !mb-4 first:!mt-0 first:!mb-0">Plan and limits</h2><ul><li><p>Available on the Business plan and above</p></li><li><p>Each scan the investigation performs consumes one unit of your monthly scan quota (scans that error or time out are not charged)</p></li><li><p>Exploration is always bounded by three guards at once: time budget, hop count, and scan count</p></li></ul><h2 id="h-read-more" class="text-3xl font-header !mt-8 !mb-4 first:!mt-0 first:!mb-0">Read more</h2><ul><li><p><strong>IMOZURU documentation</strong> — how to use it, how to read the output, deep mode, the 10 supported chains, FAQ</p></li><li><p>The address poisoning network, two months later — the published investigation the run started from</p></li></ul><p>Note: we have filed four patent applications covering insider-trading detection via pre-disclosure window analysis, the ML decision gate, and cross-chain fund tracing / common-operator inference. All four were filed in July–August 2026 and are pending examination.</p><p>Note: IMOZURU output is reference information for an investigation. Legal determination and reporting obligations remain with the user.</p><h2 id="h-share-this-page" class="text-3xl font-header !mt-8 !mb-4 first:!mt-0 first:!mb-0">Share this page</h2><p><a target="_blank" rel="noopener noreferrer" class="dont-break-out btn btn-outline btn-sm gap-1.5" href="https://twitter.com/intent/tweet?text=IMOZURU%3A+one+input+runs+the+whole+investigation+loop+%E2%80%94+and+writes+the+report&amp;url=https%3A%2F%2Fchain-analyzer.com%2Fen%2Fnews%2Fimozuru-launch"> X</a> <a target="_blank" rel="noopener noreferrer" class="dont-break-out btn btn-outline btn-sm gap-1.5" href="https://www.facebook.com/sharer/sharer.php?u=https%3A%2F%2Fchain-analyzer.com%2Fen%2Fnews%2Fimozuru-launch">Facebook</a> <a target="_blank" rel="noopener noreferrer" class="dont-break-out btn btn-outline btn-sm gap-1.5" href="https://www.linkedin.com/sharing/share-offsite/?url=https%3A%2F%2Fchain-analyzer.com%2Fen%2Fnews%2Fimozuru-launch">LinkedIn</a> Copy link</p><br>]]></content:encoded>
            <author>chainanalyzer@newsletter.paragraph.com (ChainAnalyzer)</author>
            <enclosure url="https://img.paragraph.com/cdn-cgi/image/format=auto/https://storage.googleapis.com/papyrus_images/f00bf5a712cc6a3f8b76ccc0bcd2c9be64fd0889ccd003337a3dbd0b3ba5b46a.png" length="0" type="image/png"/>
        </item>
        <item>
            <title><![CDATA[Crypto insider trading detection — patent pending]]></title>
            <link>https://paragraph.com/@chainanalyzer/crypto-insider-trading-detection-patent-pending</link>
            <guid>dTAU8XwdFnCeqmJxPlh3</guid>
            <pubDate>Sat, 01 Aug 2026 15:30:30 GMT</pubDate>
            <description><![CDATA[Aug 1, 2026 Insider trading detection for crypto — pre-disclosure window analysis, patent pending ChainAnalyzer now ships insider trading detection for crypto assets. Register company affiliations and token interest scopes as tags, and scans cross-reference them. On top of that, pre-disclosure window detection automatically escalates trades that land inside the window before a registered announcement to CRITICAL. The detection method is patent pending. What it detects Relationship cross-refer...]]></description>
            <content:encoded><![CDATA[<p>Aug 1, 2026</p><h1 id="h-insider-trading-detection-for-crypto-pre-disclosure-window-analysis-patent-pending" class="text-4xl font-header !mt-8 !mb-4 first:!mt-0 first:!mb-0">Insider trading detection for crypto — pre-disclosure window analysis, patent pending</h1><p>ChainAnalyzer now ships <strong>insider trading detection for crypto assets</strong>. Register company affiliations and token interest scopes as tags, and scans cross-reference them. On top of that, <strong>pre-disclosure window detection</strong> automatically escalates trades that land inside the window before a registered announcement to CRITICAL. The detection method is <strong>patent pending</strong>.</p><h2 id="h-what-it-detects" class="text-3xl font-header !mt-8 !mb-4 first:!mt-0 first:!mb-0">What it detects</h2><ul><li><p><strong>Relationship cross-reference</strong> — &quot;which company is this wallet related to&quot; (affiliation tags) × &quot;which tokens are exposed to that company&apos;s insider information&quot; (insider-scope tags). Trades of in-scope tokens by related wallets are flagged.</p></li><li><p><strong>Pre-disclosure window</strong> — register disclosure events (earnings, partnerships, listings…) and any trade inside the look-back window (default 30 days) before the announcement is escalated to CRITICAL, with <strong>the window trades themselves attached as evidence transactions</strong>.</p></li></ul><h2 id="h-no-personally-identifiable-information" class="text-3xl font-header !mt-8 !mb-4 first:!mt-0 first:!mb-0">No personally identifiable information</h2><p>The feature collects no names, no account data — only user-supplied tags and public on-chain data are cross-referenced. This privacy-preserving monitoring approach is part of the patent-pending core technology.</p><h2 id="h-why-now" class="text-3xl font-header !mt-8 !mb-4 first:!mt-0 first:!mb-0">Why now</h2><p>Japan is moving toward bringing crypto assets under insider trading rules through FIEA amendments. Starting transaction monitoring before the rules take effect — rather than scrambling after — is the preparation exchanges, issuers, and investigation teams need.</p><h2 id="h-how-to-use-it" class="text-3xl font-header !mt-8 !mb-4 first:!mt-0 first:!mb-0">How to use it</h2><ul><li><p>Register disclosure events (title, announced-at, scope, window days) in the Insider Events screen</p></li><li><p>Add affiliation / insider-scope tags (tags are private to each user)</p></li><li><p>Then just scan — cross-referencing and window checks run automatically, with evidence attached to findings</p></li></ul><p>Note: findings are reference information indicating suspicious patterns. Legal determination of insider trading and reporting obligations remains with the user.</p>]]></content:encoded>
            <author>chainanalyzer@newsletter.paragraph.com (ChainAnalyzer)</author>
            <enclosure url="https://img.paragraph.com/cdn-cgi/image/format=auto/https://storage.googleapis.com/papyrus_images/f00bf5a712cc6a3f8b76ccc0bcd2c9be64fd0889ccd003337a3dbd0b3ba5b46a.png" length="0" type="image/png"/>
        </item>
        <item>
            <title><![CDATA[ML that earns its way into the verdict: supervised β-scores, honest anomaly meters, and a false-positive purge]]></title>
            <link>https://paragraph.com/@chainanalyzer/ml-that-earns-its-way-into-the-verdict-supervised-b-scores-honest-anomaly-meters-and-a-false-positive-purge</link>
            <guid>1zq1akC5TERskeOoFrcT</guid>
            <pubDate>Sat, 11 Jul 2026 14:30:55 GMT</pubDate>
            <description><![CDATA[Jul 11, 2026 ML that earns its way into the verdict: supervised β-scores, honest anomaly meters, and a false-positive purge Plenty of products put ML into risk verdicts. Few can answer the question: was that model validated on production data? Starting today, ChainAnalyzer shows you the validation process itself. Supervised ML as a β display — visible, but not in your score Every scan's detection list now includes the supervised ML model's fraud-probability estimate as a β reference (the purp...]]></description>
            <content:encoded><![CDATA[<p>Jul 11, 2026</p><h1 id="h-ml-that-earns-its-way-into-the-verdict-supervised-b-scores-honest-anomaly-meters-and-a-false-positive-purge" class="text-4xl font-header !mt-8 !mb-4 first:!mt-0 first:!mb-0">ML that earns its way into the verdict: supervised β-scores, honest anomaly meters, and a false-positive purge</h1><p>Plenty of products put ML into risk verdicts. Few can answer the question: <em>was that model validated on production data?</em> Starting today, ChainAnalyzer shows you the validation process itself.</p><h2 id="h-supervised-ml-as-a-b-display-visible-but-not-in-your-score" class="text-3xl font-header !mt-8 !mb-4 first:!mt-0 first:!mb-0">Supervised ML as a β display — visible, but not in your score</h2><p>Every scan&apos;s detection list now includes the supervised ML model&apos;s <strong>fraud-probability estimate as a β reference</strong> (the purple β CRITICAL badge). The important part: <strong>this value contributes zero points to the risk score</strong>.</p><p>The model is in shadow evaluation. It joins the verdict only after passing promotion gates measured on production traffic: real-world precision, zero false alarms on known-legitimate addresses, and threshold stability over time. We don&apos;t ship &quot;the offline metrics looked good&quot; — <strong>earning a place in the score requires proof on production data</strong>. Until then, the β display lets you watch what the model is thinking.</p><h2 id="h-an-honest-reframe-of-the-anomaly-meter" class="text-3xl font-header !mt-8 !mb-4 first:!mt-0 first:!mb-0">An honest reframe of the anomaly meter</h2><p>The unsupervised &quot;ML Anomaly&quot; meter has been <strong>redefined as a novelty indicator</strong> (&quot;this behaves unlike most addresses&quot;) and no longer contributes to the risk score. Our production measurements confirmed that anomaly and malice are different things — on every chain, the statistically most &quot;anomalous&quot; actors are <strong>legitimate high-throughput infrastructure</strong>: exchanges and issuers. Anomaly detection keeps its value as a novel-pattern discovery tool; the shortcut &quot;anomalous therefore dangerous&quot; is gone. The meter now carries a &quot;reference&quot; badge.</p><h2 id="h-a-false-positive-purge-for-legitimate-infrastructure" class="text-3xl font-header !mt-8 !mb-4 first:!mt-0 first:!mb-0">A false-positive purge for legitimate infrastructure</h2><p>Alongside, a precision sweep across the detection pipeline. The principle: <strong>distinguish &quot;high activity&quot; from &quot;malicious&quot;</strong>:</p><ul><li><p>Graph proximity now considers <strong>direction of funds</strong> — sending to a bad address (possible victim) is treated differently from receiving from one (possible downstream)</p></li><li><p>Contract monitoring of major legitimate tokens (e.g. USDT) no longer flags large transfers mechanically — contact detection against known-malicious addresses stays fully active</p></li><li><p>Fake-token transfers (Unicode spoofing) are excluded from graph evidence — closing the loophole where an attacker could make anyone look risky by airdropping them counterfeit tokens</p></li></ul><p>A newly discovered <strong>address-poisoning network cluster was added to ScamDB</strong> during this work and is queryable via the public API.</p><p>The β display appears on scans with the &quot;Include ML analysis&quot; toggle enabled. Internal detection logic (thresholds, features) is not disclosed.</p>]]></content:encoded>
            <author>chainanalyzer@newsletter.paragraph.com (ChainAnalyzer)</author>
            <enclosure url="https://img.paragraph.com/cdn-cgi/image/format=auto/https://storage.googleapis.com/papyrus_images/f00bf5a712cc6a3f8b76ccc0bcd2c9be64fd0889ccd003337a3dbd0b3ba5b46a.png" length="0" type="image/png"/>
        </item>
        <item>
            <title><![CDATA[The enterprise trust stack: Holder Graph forensics, tamper-evident audit trails, webhooks, and an Issuer Dashboard]]></title>
            <link>https://paragraph.com/@chainanalyzer/the-enterprise-trust-stack-holder-graph-forensics-tamper-evident-audit-trails-webhooks-and-an-issuer-dashboard</link>
            <guid>VvXflrI14Ey0xaL2arK1</guid>
            <pubDate>Sat, 11 Jul 2026 14:30:53 GMT</pubDate>
            <description><![CDATA[Jul 11, 2026 The enterprise trust stack: Holder Graph forensics, tamper-evident audit trails, webhooks, and an Issuer Dashboard This summer ChainAnalyzer shipped four features aimed squarely at compliance teams. The common theme: moving investigation results through your organization in an audit-proof form. 1. Holder Graph & Cluster Forensics (Business+) Token holder distributions rendered as force-directed graphs, with common-funder clustering via Neo4j BFS. Sybil structures — "the top 30 ho...]]></description>
            <content:encoded><![CDATA[<p>Jul 11, 2026</p><h1 id="h-the-enterprise-trust-stack-holder-graph-forensics-tamper-evident-audit-trails-webhooks-and-an-issuer-dashboard" class="text-4xl font-header !mt-8 !mb-4 first:!mt-0 first:!mb-0">The enterprise trust stack: Holder Graph forensics, tamper-evident audit trails, webhooks, and an Issuer Dashboard</h1><p>This summer ChainAnalyzer shipped four features aimed squarely at compliance teams. The common theme: <strong>moving investigation results through your organization in an audit-proof form</strong>.</p><h2 id="h-1-holder-graph-and-cluster-forensics-business" class="text-3xl font-header !mt-8 !mb-4 first:!mt-0 first:!mb-0">1. Holder Graph &amp; Cluster Forensics (Business+)</h2><p>Token holder distributions rendered as force-directed graphs, with <strong>common-funder clustering via Neo4j BFS</strong>. Sybil structures — &quot;the top 30 holders are actually one entity&apos;s distributed bags&quot; — become visible as graph shapes. AI-generated forensic narratives (why this cluster is suspicious) and PNG export are built in, ready to paste into an investigation report.</p><h2 id="h-2-financial-grade-audit-trails" class="text-3xl font-header !mt-8 !mb-4 first:!mt-0 first:!mb-0">2. Financial-grade audit trails</h2><p>Every activity log entry is now <strong>hash-chained and periodically anchored to WORM (Write Once Read Many) object storage</strong> — a two-layer design. Rewriting even a single historical row breaks the chain detectably. Nobody, including us as the operator, can silently alter history. Built for regulated environments where you may later need to prove who saw which scan result, and when.</p><h2 id="h-3-three-webhook-events-a-dedicated-delivery-worker" class="text-3xl font-header !mt-8 !mb-4 first:!mt-0 first:!mb-0">3. Three webhook events + a dedicated delivery worker</h2><p><strong>Risk level change / watchlist update / report ready</strong> — three webhook events, delivered by a dedicated worker with retries and duplicate-delivery prevention (atomic delivery claims). Wire them into your SIEM or team chat on Pro plans and above.</p><h2 id="h-4-issuer-dashboard-enterprise" class="text-3xl font-header !mt-8 !mb-4 first:!mt-0 first:!mb-0">4. Issuer Dashboard (Enterprise)</h2><p>For stablecoin issuers: a dashboard that tracks <strong>multi-chain circulating supply and issuance/redemption flows by querying operational wallets directly on-chain</strong> — first-party data rather than aggregator estimates, aiming for accuracy you can carry into financial reporting and audits.</p><p>Holder Graph ships on Business plans and above; audit trails and the Issuer Dashboard are Enterprise features. Contact us for a demo.</p>]]></content:encoded>
            <author>chainanalyzer@newsletter.paragraph.com (ChainAnalyzer)</author>
            <enclosure url="https://img.paragraph.com/cdn-cgi/image/format=auto/https://storage.googleapis.com/papyrus_images/f00bf5a712cc6a3f8b76ccc0bcd2c9be64fd0889ccd003337a3dbd0b3ba5b46a.png" length="0" type="image/png"/>
        </item>
        <item>
            <title><![CDATA[Kaia goes live: 9 chains for self-serve scanning, and Watchlist learns them all]]></title>
            <link>https://paragraph.com/@chainanalyzer/kaia-goes-live-9-chains-for-self-serve-scanning-and-watchlist-learns-them-all</link>
            <guid>XwOYn7SOshSXvsOvs6us</guid>
            <pubDate>Sat, 11 Jul 2026 14:30:50 GMT</pubDate>
            <description><![CDATA[Jul 11, 2026 Kaia goes live: 9 chains for self-serve scanning, and Watchlist learns them all On 2026-07-11, Kaia (formerly Klaytn, ChainID 8217) became a fully supported chain on ChainAnalyzer. Not just one-off scans — Watchlist periodic monitoring, Follow Mode graph exploration, token contract monitoring, and Neo4j graph analysis all work exactly like on every other chain. That brings self-serve live chains to nine: Bitcoin, Ethereum, Polygon, Base, Arbitrum, Optimism, Avalanche, Solana, and...]]></description>
            <content:encoded><![CDATA[<p>Jul 11, 2026</p><h1 id="h-kaia-goes-live-9-chains-for-self-serve-scanning-and-watchlist-learns-them-all" class="text-4xl font-header !mt-8 !mb-4 first:!mt-0 first:!mb-0">Kaia goes live: 9 chains for self-serve scanning, and Watchlist learns them all</h1><p>On <strong>2026-07-11</strong>, Kaia (formerly Klaytn, ChainID 8217) became a <strong>fully supported chain</strong> on ChainAnalyzer. Not just one-off scans — Watchlist periodic monitoring, Follow Mode graph exploration, token contract monitoring, and Neo4j graph analysis all work exactly like on every other chain. That brings self-serve live chains to <strong>nine</strong>: Bitcoin, Ethereum, Polygon, Base, Arbitrum, Optimism, Avalanche, Solana, and Kaia.</p><h2 id="h-watchlist-catches-up-to-every-chain" class="text-3xl font-header !mt-8 !mb-4 first:!mt-0 first:!mb-0">Watchlist catches up to every chain</h2><p>Until now the Watchlist chain picker offered Ethereum, Avalanche, Polygon, Solana and Bitcoin. We&apos;ve added <strong>Arbitrum, Optimism, Base and Kaia</strong>, so every chain you can scan is now a chain you can monitor. If you track tokens deployed at the same address across multiple chains (a common pattern for regulated stablecoins), cross-chain side-by-side monitoring is now the default workflow.</p><h2 id="h-engineering-note-the-kaiascan-api-wall-and-the-rpc-fallback" class="text-3xl font-header !mt-8 !mb-4 first:!mt-0 first:!mb-0">Engineering note: the Kaiascan API wall and the RPC fallback</h2><p>An honest implementation note. Kaiascan&apos;s Etherscan-compatible API handles wallet-scoped queries fine, but <strong>does not support contract-wide token transfer queries</strong> (&quot;give me all transfers of this token&quot;). Left alone, contract monitoring would spin with &quot;0 transfers&quot; — in our internal testing, a token with 27k lifetime transfers reported zero.</p><p>Our fix: the contract monitor falls back to fetching Transfer events directly via <code>eth_getLogs</code> on Kaia public RPC — a generalization of the pattern that already powers our Kaia holder derivation. Result: the same token went from <strong>0 transfers to 10,000 transfers analyzed</strong>. The meaning of &quot;0 findings&quot; changed from &quot;we didn&apos;t look&quot; to &quot;we looked and it&apos;s clean&quot; — which, for a monitoring tool, is the difference that matters.</p><p>Kaia is available on all paid plans. Existing Watchlist items are untouched; just pick Kaia from the chain selector when adding new ones.</p>]]></content:encoded>
            <author>chainanalyzer@newsletter.paragraph.com (ChainAnalyzer)</author>
            <enclosure url="https://img.paragraph.com/cdn-cgi/image/format=auto/https://storage.googleapis.com/papyrus_images/f00bf5a712cc6a3f8b76ccc0bcd2c9be64fd0889ccd003337a3dbd0b3ba5b46a.png" length="0" type="image/png"/>
        </item>
        <item>
            <title><![CDATA[W15 INSIDER_TRADE_SUSPECT — crypto insider-trading detection without storing any PII]]></title>
            <link>https://paragraph.com/@chainanalyzer/w15-insider_trade_suspect-—-crypto-insider-trading-detection-without-storing-any-pii</link>
            <guid>IXcE5Z1C9iMbBSnhd20t</guid>
            <pubDate>Wed, 27 May 2026 20:00:14 GMT</pubDate>
            <description><![CDATA[May 25, 2026W15 INSIDER_TRADE_SUSPECT — crypto insider-trading detection without storing any PIIOn 2026-05-25, ChainAnalyzer released W15 INSIDER_TRADE_SUSPECT — a new wallet-level detector designed for Japanese VASPs (cryptoasset exchange operators) and electronic payment instrument operators to flag insider-trading suspicion without storing any PII.🎯 In one lineYou never have to share employee names or IDs with ChainAnalyzer. Tag the wallet with company_affiliation and the in-scope token c...]]></description>
            <content:encoded><![CDATA[<p>May 25, 2026</p><h1 id="h-w15-insidertradesuspect-crypto-insider-trading-detection-without-storing-any-pii" class="text-4xl font-header !mt-8 !mb-4 first:!mt-0 first:!mb-0">W15 INSIDER_TRADE_SUSPECT — crypto insider-trading detection without storing any PII</h1><p>On <strong>2026-05-25</strong>, ChainAnalyzer released <strong>W15 INSIDER_TRADE_SUSPECT</strong> — a new wallet-level detector designed for Japanese VASPs (cryptoasset exchange operators) and electronic payment instrument operators to <strong>flag insider-trading suspicion without storing any PII</strong>.</p><h3 id="h-in-one-line" class="text-2xl font-header !mt-6 !mb-4 first:!mt-0 first:!mb-0">🎯 In one line</h3><p>You never have to share employee names or IDs with ChainAnalyzer. Tag the wallet with <code>company_affiliation</code> and the in-scope token contract with <code>insider_scope</code> using the <strong>same label</strong> — W15 fires HIGH (-15) on the next overlapping trade. Direct fit for Japan&apos;s amended FIEA Article 171-7–10.</p><h2 id="h-background-japans-amended-fiea-insider-trading-clause-for-cryptoassets" class="text-3xl font-header !mt-8 !mb-4 first:!mt-0 first:!mb-0">Background — Japan&apos;s amended FIEA insider-trading clause for cryptoassets</h2><p>Japan&apos;s amended Financial Instruments and Exchange Act (submitted to the Diet on 2026-04-10, expected to come into force within 1 year of promulgation) <strong>creates a new insider-trading regime specifically for cryptoassets</strong>. Officers, employees, and project insiders trading their own listed token on pre-disclosure information now fall in scope.</p><p>The practical implementation blocker has been that handing employee-identity data (&quot;who is an officer&quot;, &quot;who is an insider&quot;) to an external analytics vendor before achieving ISO 27001 or equivalent controls is operationally untenable. <strong>W15 sidesteps this entirely</strong>.</p><h2 id="h-design-label-matching-only-no-pii-flow" class="text-3xl font-header !mt-8 !mb-4 first:!mt-0 first:!mb-0">Design — label-matching only, no PII flow</h2><ul><li><p>ChainAnalyzer never receives or stores employee names, IDs, or any PII</p></li><li><p>Customer-side admins tag wallets with <code>company_affiliation</code> and token contracts with <code>insider_scope</code></p></li><li><p>Matching is <strong>case-insensitive exact match on the label string</strong> — nothing else</p></li><li><p>If a wallet labeled &quot;Acme&quot; trades a token labeled &quot;Acme&quot;, W15 fires. Otherwise it stays silent.</p></li></ul><p>The system only knows that a wallet and a token are &quot;linked in the customer&apos;s view&quot; — it has no idea who the wallet belongs to.</p><h2 id="h-workflow" class="text-3xl font-header !mt-8 !mb-4 first:!mt-0 first:!mb-0">Workflow</h2><ol><li><p><strong>Tag the wallet</strong> — at <code>/account/tags</code>, attach <code>company_affiliation</code> with label &quot;Acme&quot; and 🏢 icon to the wallet under monitoring</p></li><li><p><strong>Tag the in-scope token</strong> — same UI, attach <code>insider_scope</code> with the <strong>same label &quot;Acme&quot;</strong> and 🎯 icon to the token contract</p></li><li><p><strong>Scan or watchlist the wallet</strong> — standard <code>/account/scan</code> or add to Watchlist (Pro+)</p></li><li><p><strong>W15 fires HIGH on matching trades</strong> — Detection details include up to 10 transaction samples for SAR filing / audit review</p></li></ol><h2 id="h-false-positive-suppression-by-design" class="text-3xl font-header !mt-8 !mb-4 first:!mt-0 first:!mb-0">False-positive suppression by design</h2><table><colgroup><col><col><col></colgroup><tbody><tr><th colspan="1" rowspan="1"><p>Case</p></th><th colspan="1" rowspan="1"><p>Trade pattern</p></th><th colspan="1" rowspan="1"><p>W15</p></th></tr><tr><td colspan="1" rowspan="1"><p>A</p></td><td colspan="1" rowspan="1"><p>Employee deposits / withdraws BTC / ETH / USDC on a generic exchange</p></td><td colspan="1" rowspan="1"><p>✕ does not fire (not an insider_scope token)</p></td></tr><tr><td colspan="1" rowspan="1"><p>B</p></td><td colspan="1" rowspan="1"><p>Employee trades the <strong>company&apos;s own token</strong></p></td><td colspan="1" rowspan="1"><p>● fires (HIGH)</p></td></tr><tr><td colspan="1" rowspan="1"><p>C</p></td><td colspan="1" rowspan="1"><p>Employee deposits company token to company exchange (payroll cash-out etc.)</p></td><td colspan="1" rowspan="1"><p>● fires (HIGH) — manual review especially near announcements</p></td></tr><tr><td colspan="1" rowspan="1"><p>D</p></td><td colspan="1" rowspan="1"><p>(no tag) any trade</p></td><td colspan="1" rowspan="1"><p>✕ does not fire (untagged wallets exit early)</p></td></tr></tbody></table><h2 id="h-detection-output" class="text-3xl font-header !mt-8 !mb-4 first:!mt-0 first:!mb-0">Detection output</h2><pre data-type="codeBlock" text="{
  &quot;detector_id&quot;: &quot;W15&quot;,
  &quot;detector_name&quot;: &quot;INSIDER_TRADE_SUSPECT&quot;,
  &quot;severity&quot;: &quot;HIGH&quot;,
  &quot;description&quot;: &quot;インサイダー取引疑い: \&quot;Acme\&quot; 所属タグ付きウォレットがインサイダー対象トークン USDC（scope: \&quot;Acme\&quot;）を取引しました（5 件: 送信 3 / 受信 2）。コンプライアンスレビューを実施してください。&quot;,
  &quot;details&quot;: {
    &quot;company&quot;: &quot;Acme&quot;,
    &quot;wallet_address&quot;: &quot;0xUserWallet…&quot;,
    &quot;token_contract&quot;: &quot;0xA0b86…&quot;,
    &quot;token_symbol&quot;: &quot;USDC&quot;,
    &quot;tx_count&quot;: 5,
    &quot;send_count&quot;: 3,
    &quot;receive_count&quot;: 2,
    &quot;sample_tx&quot;: [ /* up to 10 tx hashes for SAR / audit */ ]
  }
}"><code>{
  <span class="hljs-string">"detector_id"</span>: <span class="hljs-string">"W15"</span>,
  <span class="hljs-string">"detector_name"</span>: <span class="hljs-string">"INSIDER_TRADE_SUSPECT"</span>,
  <span class="hljs-string">"severity"</span>: <span class="hljs-string">"HIGH"</span>,
  <span class="hljs-string">"description"</span>: <span class="hljs-string">"インサイダー取引疑い: <span class="hljs-subst">\"</span>Acme<span class="hljs-subst">\"</span> 所属タグ付きウォレットがインサイダー対象トークン USDC（scope: <span class="hljs-subst">\"</span>Acme<span class="hljs-subst">\"</span>）を取引しました（5 件: 送信 3 / 受信 2）。コンプライアンスレビューを実施してください。"</span>,
  <span class="hljs-string">"details"</span>: {
    <span class="hljs-string">"company"</span>: <span class="hljs-string">"Acme"</span>,
    <span class="hljs-string">"wallet_address"</span>: <span class="hljs-string">"0xUserWallet…"</span>,
    <span class="hljs-string">"token_contract"</span>: <span class="hljs-string">"0xA0b86…"</span>,
    <span class="hljs-string">"token_symbol"</span>: <span class="hljs-string">"USDC"</span>,
    <span class="hljs-string">"tx_count"</span>: <span class="hljs-number">5</span>,
    <span class="hljs-string">"send_count"</span>: <span class="hljs-number">3</span>,
    <span class="hljs-string">"receive_count"</span>: <span class="hljs-number">2</span>,
    <span class="hljs-string">"sample_tx"</span>: [ <span class="hljs-comment">/* up to 10 tx hashes for SAR / audit */</span> ]
  }
}</code></pre><p>Up to 10 sample transactions are included with hash, timestamp, send/receive direction, and amount — directly attachable to a JAFIC SAR filing or audit evidence pack.</p><h2 id="h-pricing" class="text-3xl font-header !mt-8 !mb-4 first:!mt-0 first:!mb-0">Pricing</h2><p>W15 INSIDER_TRADE_SUSPECT is available on <strong>Pro and above</strong> ($19.99/month). For organizational deployments (10K+ monitored wallets, large batches, SLA), see the Enterprise plan.</p><h2 id="h-roadmap" class="text-3xl font-header !mt-8 !mb-4 first:!mt-0 first:!mb-0">Roadmap</h2><ul><li><p><code>company_announcement</code><strong> table</strong> — narrow alerts to trades within ±N days of an official disclosure</p></li><li><p><strong>W15b counterparty detection</strong> — abnormal spike of deposits into the company exchange as a group-insider signal</p></li><li><p><strong>Auto-PDF compliance audit log</strong> — bundle the evidence pack for periodic audits</p></li></ul><h2 id="h-links" class="text-3xl font-header !mt-8 !mb-4 first:!mt-0 first:!mb-0">Links</h2><ul><li><p><strong>Set up tags now</strong></p></li><li><p>W15 setup guide (docs)</p></li><li><p>Pricing</p></li></ul>]]></content:encoded>
            <author>chainanalyzer@newsletter.paragraph.com (ChainAnalyzer)</author>
            <enclosure url="https://img.paragraph.com/cdn-cgi/image/format=auto/https://storage.googleapis.com/papyrus_images/f00bf5a712cc6a3f8b76ccc0bcd2c9be64fd0889ccd003337a3dbd0b3ba5b46a.png" length="0" type="image/png"/>
        </item>
        <item>
            <title><![CDATA[Bridge Flow Trace: tracing NEAR Intents (and 6 other privacy bridges) in one request]]></title>
            <link>https://paragraph.com/@chainanalyzer/bridge-flow-trace-tracing-near-intents-and-6-other-privacy-bridges-in-one-request</link>
            <guid>WbOO7YEAGxj2cJnvwxiC</guid>
            <pubDate>Sun, 24 May 2026 14:01:07 GMT</pubDate>
            <description><![CDATA[May 24, 2026Bridge Flow Trace: tracing NEAR Intents (and 6 other privacy bridges) in one request2026-05-24 — ChainAnalyzer is launching Bridge Flow Trace, a one-request multi-hop cross-chain forensic tracer. It auto-detects bridge solvers (NEAR Intents, Wormhole, Stargate, Across, Synapse, Hop, deBridge), follows relay chains, and emits forensic insights including same-intent correlation with sub-minute cross-chain settlement timing.🎯 The one-line pitchPrivacy bridges like NEAR Intents are n...]]></description>
            <content:encoded><![CDATA[<p>May 24, 2026</p><h1 id="h-bridge-flow-trace-tracing-near-intents-and-6-other-privacy-bridges-in-one-request" class="text-4xl font-header !mt-8 !mb-4 first:!mt-0 first:!mb-0">Bridge Flow Trace: tracing NEAR Intents (and 6 other privacy bridges) in one request</h1><p><strong>2026-05-24</strong> — ChainAnalyzer is launching <strong>Bridge Flow Trace</strong>, a one-request multi-hop cross-chain forensic tracer. It auto-detects bridge solvers (NEAR Intents, Wormhole, Stargate, Across, Synapse, Hop, deBridge), follows relay chains, and emits forensic insights including <strong>same-intent correlation with sub-minute cross-chain settlement timing</strong>.</p><h3 id="h-the-one-line-pitch" class="text-2xl font-header !mt-6 !mb-4 first:!mt-0 first:!mb-0">🎯 The one-line pitch</h3><p>Privacy bridges like NEAR Intents are <strong>not</strong> untraceable. Read the Solver + the intent_id memo and you can prove &quot;this is the same fund flow&quot; — on-chain, with cryptographic certainty. 1-2 hours of manual investigation collapses to <strong>7 seconds</strong>.</p><h2 id="h-5-key-insights" class="text-3xl font-header !mt-8 !mb-4 first:!mt-0 first:!mb-0">5 key insights</h2><h3 id="h-1-privacy-bridges-are-not-untraceable" class="text-2xl font-header !mt-6 !mb-4 first:!mt-0 first:!mb-0">1. Privacy bridges are not untraceable</h3><p>NEAR Intents is intent-based — the user never directly calls the bridge contract, so naive on-chain inspection only shows &quot;a solver delivered some SOL out of nowhere.&quot; But the <strong>intent_id stamped into the Solana Memo program</strong> matches the corresponding Ethereum-side leg byte-for-byte. With Wormholescan / deBridge / NEAR Explorer counterpart APIs, you reconstruct the cross-chain link deterministically.</p><h3 id="h-2-solver-wallets-are-heuristically-detectable" class="text-2xl font-header !mt-6 !mb-4 first:!mt-0 first:!mb-0">2. Solver wallets are heuristically detectable</h3><p>Even previously-unknown solvers are classified at 90%+ confidence with three indicators:</p><ul><li><p><strong>UUID memo ratio &gt; 50%</strong> (proportion of TXs stamped with an intent_id)</p></li><li><p><strong>Balance &gt; 1000 SOL / 100 ETH</strong> (liquidity provider scale)</p></li><li><p><strong>TX frequency &gt; 50/hour</strong> (intent processing throughput)</p></li></ul><p>Empirical example (a Solana NEAR Intents solver `HWjmoU...mz16`): 1000 TX / 7h = 138 TX/h, 71% UUID memo ratio, 12,241 SOL ≈ $1.5M balance → classified at confidence 0.92.</p><h3 id="h-3-sameintentcorrelation-is-the-forensic-smoking-gun" class="text-2xl font-header !mt-6 !mb-4 first:!mt-0 first:!mb-0">3. <code>same_intent_correlation</code> is the forensic smoking gun</h3><pre data-type="codeBlock" text="{
  &quot;type&quot;: &quot;same_intent_correlation&quot;,
  &quot;description&quot;: &quot;Intent PzUkLi9... settled in 74s: 0.03 ETH on send → 0.687618 SOL on receive&quot;,
  &quot;evidence&quot;: {
    &quot;intent_id&quot;: &quot;PzUkLi9trGapLFsSGCf37xFRwX8kyYZZ8iZvTtqwyeFRwrPEa&quot;,
    &quot;send_leg&quot;:    { &quot;tx&quot;: &quot;0x046ca1fa...&quot;, &quot;amount&quot;: 0.03,        &quot;token&quot;: &quot;ETH&quot;, &quot;timestamp&quot;: &quot;2026-02-22T07:27:23+00:00&quot; },
    &quot;receive_leg&quot;: { &quot;tx&quot;: &quot;4QZfXmpjA61A...&quot;, &quot;amount&quot;: 0.687618, &quot;token&quot;: &quot;SOL&quot;, &quot;timestamp&quot;: &quot;2026-02-22T07:28:37+00:00&quot; },
    &quot;delta_seconds&quot;: 74
  }
}"><code><span class="hljs-punctuation">{</span>
  <span class="hljs-attr">"type"</span><span class="hljs-punctuation">:</span> <span class="hljs-string">"same_intent_correlation"</span><span class="hljs-punctuation">,</span>
  <span class="hljs-attr">"description"</span><span class="hljs-punctuation">:</span> <span class="hljs-string">"Intent PzUkLi9... settled in 74s: 0.03 ETH on send → 0.687618 SOL on receive"</span><span class="hljs-punctuation">,</span>
  <span class="hljs-attr">"evidence"</span><span class="hljs-punctuation">:</span> <span class="hljs-punctuation">{</span>
    <span class="hljs-attr">"intent_id"</span><span class="hljs-punctuation">:</span> <span class="hljs-string">"PzUkLi9trGapLFsSGCf37xFRwX8kyYZZ8iZvTtqwyeFRwrPEa"</span><span class="hljs-punctuation">,</span>
    <span class="hljs-attr">"send_leg"</span><span class="hljs-punctuation">:</span>    <span class="hljs-punctuation">{</span> <span class="hljs-attr">"tx"</span><span class="hljs-punctuation">:</span> <span class="hljs-string">"0x046ca1fa..."</span><span class="hljs-punctuation">,</span> <span class="hljs-attr">"amount"</span><span class="hljs-punctuation">:</span> <span class="hljs-number">0.03</span><span class="hljs-punctuation">,</span>        <span class="hljs-attr">"token"</span><span class="hljs-punctuation">:</span> <span class="hljs-string">"ETH"</span><span class="hljs-punctuation">,</span> <span class="hljs-attr">"timestamp"</span><span class="hljs-punctuation">:</span> <span class="hljs-string">"2026-02-22T07:27:23+00:00"</span> <span class="hljs-punctuation">}</span><span class="hljs-punctuation">,</span>
    <span class="hljs-attr">"receive_leg"</span><span class="hljs-punctuation">:</span> <span class="hljs-punctuation">{</span> <span class="hljs-attr">"tx"</span><span class="hljs-punctuation">:</span> <span class="hljs-string">"4QZfXmpjA61A..."</span><span class="hljs-punctuation">,</span> <span class="hljs-attr">"amount"</span><span class="hljs-punctuation">:</span> <span class="hljs-number">0.687618</span><span class="hljs-punctuation">,</span> <span class="hljs-attr">"token"</span><span class="hljs-punctuation">:</span> <span class="hljs-string">"SOL"</span><span class="hljs-punctuation">,</span> <span class="hljs-attr">"timestamp"</span><span class="hljs-punctuation">:</span> <span class="hljs-string">"2026-02-22T07:28:37+00:00"</span> <span class="hljs-punctuation">}</span><span class="hljs-punctuation">,</span>
    <span class="hljs-attr">"delta_seconds"</span><span class="hljs-punctuation">:</span> <span class="hljs-number">74</span>
  <span class="hljs-punctuation">}</span>
<span class="hljs-punctuation">}</span></code></pre><p>One block of structured evidence proves the cross-chain identity claim on three axes: <strong>(a) matching on-chain intent_id memo</strong>, <strong>(b) 74-second temporal correlation</strong>, and <strong>(c) USD-equivalent value parity</strong> ($67-equivalent cross-chain swap). Drop it straight into a law-enforcement filing or VASP SAR submission.</p><h3 id="h-4-separating-user-from-solver" class="text-2xl font-header !mt-6 !mb-4 first:!mt-0 first:!mb-0">4. Separating user from solver</h3><p>Graph roles are 3-way: <code>user</code> (the real origin, your investigation target), <code>relay</code> (short-lived intermediary, just a passthrough), and <code>solver</code> (liquidity provider — infrastructure, not perpetrator). Stopping at solvers prevents the classic mistake of <strong>misclassifying infrastructure as suspect</strong>.</p><h3 id="h-5-7-seconds-vs-1-2-hours" class="text-2xl font-header !mt-6 !mb-4 first:!mt-0 first:!mb-0">5. 7 seconds vs 1-2 hours</h3><p>Manual: pull Solana RPC sigs → parse memos → search NEAR Explorer → reconcile via Wormholescan → trace ETH-side outbounds → identify solvers → stitch the graph. Total: 1-2 hours.<br>Automated: <strong>6.8 seconds and the full graph + insights drops on your desk</strong>. The real win isn&apos;t a single SANAE-style investigation; it&apos;s processing 100 wallets in batch.</p><h2 id="h-how-to-use" class="text-3xl font-header !mt-8 !mb-4 first:!mt-0 first:!mb-0">How to use</h2><h3 id="h-subscribed-business-enterprise" class="text-2xl font-header !mt-6 !mb-4 first:!mt-0 first:!mb-0">Subscribed (Business / Enterprise)</h3><p>Head to <strong>/account/bridge-flow</strong>, enter an address + chain + depth, get the graph + insights.</p><pre data-type="codeBlock" text="curl -X POST https://chain-analyzer.com/api/bridge-flow \
  -H &quot;Content-Type: application/json&quot; \
  --cookie &quot;session=...&quot; \
  -d &apos;{
    &quot;address&quot;: &quot;6ytB6pX3d6avtgzCkRjsyd1jkUJCutyCoc83ZeoVTC6c&quot;,
    &quot;chain&quot;: &quot;solana&quot;,
    &quot;max_depth&quot;: 2
  }&apos;"><code>curl -X POST https:<span class="hljs-comment">//chain-analyzer.com/api/bridge-flow \
  -H "Content-Type: application/json" \
  --cookie "session=..." \
  -d '{</span>
    <span class="hljs-string">"address"</span>: <span class="hljs-string">"6ytB6pX3d6avtgzCkRjsyd1jkUJCutyCoc83ZeoVTC6c"</span>,
    <span class="hljs-string">"chain"</span>: <span class="hljs-string">"solana"</span>,
    <span class="hljs-string">"max_depth"</span>: <span class="hljs-number">2</span>
  }'</code></pre><h3 id="h-subscription-free-x402-pay-per-trace" class="text-2xl font-header !mt-6 !mb-4 first:!mt-0 first:!mb-0">Subscription-free (x402 pay-per-trace)</h3><p>For one-off investigations or autonomous agents, the x402 endpoint settles at <strong>$3.00 USDC</strong> on Base / Solana — no account, no API key.</p><pre data-type="codeBlock" text="# Single-shot, no subscription — $3.00 USDC on Base/Solana
curl -X POST https://chain-analyzer.com/api/v1/x402/bridge-flow/trace \
  -H &quot;X-PAYMENT: &lt;signed-eip3009&gt;&quot; \
  -d &apos;{&quot;address&quot;: &quot;...&quot;, &quot;chain&quot;: &quot;solana&quot;, &quot;max_depth&quot;: 3}&apos;"><code># <span class="hljs-type">Single</span><span class="hljs-operator">-</span>shot, no subscription — <span class="hljs-variable">$3</span>.<span class="hljs-number">00</span> <span class="hljs-type">USDC</span> on <span class="hljs-type">Base</span><span class="hljs-operator">/</span><span class="hljs-type">Solana</span>
curl <span class="hljs-operator">-</span><span class="hljs-type">X</span> <span class="hljs-type">POST</span> https:<span class="hljs-comment">//chain-analyzer.com/api/v1/x402/bridge-flow/trace \</span>
  <span class="hljs-operator">-</span><span class="hljs-type">H</span> <span class="hljs-string">"X-PAYMENT: &#x3C;signed-eip3009>"</span> \
  <span class="hljs-operator">-</span>d '{<span class="hljs-string">"address"</span>: <span class="hljs-string">"..."</span>, <span class="hljs-string">"chain"</span>: <span class="hljs-string">"solana"</span>, <span class="hljs-string">"max_depth"</span>: <span class="hljs-number">3</span>}'</code></pre><h2 id="h-new-pricing" class="text-3xl font-header !mt-8 !mb-4 first:!mt-0 first:!mb-0">New pricing</h2><table><colgroup><col><col><col></colgroup><tbody><tr><th colspan="1" rowspan="1"><p>Plan</p></th><th colspan="1" rowspan="1"><p>Bridge Flow Trace</p></th><th colspan="1" rowspan="1"><p>Monthly</p></th></tr><tr><td colspan="1" rowspan="1"><p>Free / Starter</p></td><td colspan="1" rowspan="1"><p>—</p></td><td colspan="1" rowspan="1"><p>$0 / $4.99</p></td></tr><tr><td colspan="1" rowspan="1"><p>Pro</p></td><td colspan="1" rowspan="1"><p>—</p></td><td colspan="1" rowspan="1"><p>$19.99</p></td></tr><tr><td colspan="1" rowspan="1"><p><strong>Business</strong> (new)</p></td><td colspan="1" rowspan="1"><p>✅ Multi-hop (depth 1-3)</p></td><td colspan="1" rowspan="1"><p><strong>$99.99</strong></p></td></tr><tr><td colspan="1" rowspan="1"><p>Enterprise</p></td><td colspan="1" rowspan="1"><p>✅ unlimited + SLA + Insider monitoring</p></td><td colspan="1" rowspan="1"><p>contact</p></td></tr><tr><td colspan="1" rowspan="1"><p><strong>x402 pay-per-trace</strong></p></td><td colspan="1" rowspan="1"><p>✅ single-shot</p></td><td colspan="1" rowspan="1"><p><strong>$3.00 / call</strong></p></td></tr></tbody></table><h2 id="h-engineering-background" class="text-3xl font-header !mt-8 !mb-4 first:!mt-0 first:!mb-0">Engineering background</h2><p>The pipeline is 6 stages: <strong>Bridge Detector → Counterpart Resolution → Node Classification → BFS Expand → Same-chain Forward Trace → Insights Post-process</strong>. The Solver registry (static + heuristic) and the bridge-contract registry (7 protocols / 32 contracts / 7 EVM chains) cooperate so that previously-unknown solvers are still classified correctly.</p><p>Deep technical dive + the SANAE TOKEN case study (the work that motivated this build): see the Qiita article (Japanese):</p><ul><li><p><a target="_blank" rel="noopener" class="dont-break-out" href="https://qiita.com/Rascal/items/">NEAR Intents で cross-chain 資金洗浄を追跡する — ChainAnalyzer Bridge Flow Trace</a></p></li><li><p><strong>Bridge Flow Trace docs</strong> (technical reference)</p></li></ul><h2 id="h-acknowledgement" class="text-3xl font-header !mt-8 !mb-4 first:!mt-0 first:!mb-0">Acknowledgement</h2><p>The SANAE TOKEN investigation that motivated this build started with <a target="_blank" rel="noopener" class="dont-break-out" href="https://x.com/hiropi_fx">@hiropi_fx</a>&apos;s initial tracing.</p><h2 id="h-links" class="text-3xl font-header !mt-8 !mb-4 first:!mt-0 first:!mb-0">Links</h2><ul><li><p><strong>Try Bridge Flow Trace</strong> (Business / Enterprise)</p></li><li><p>Bridge Flow Trace documentation</p></li><li><p>Pricing</p></li><li><p>x402 Discovery (all endpoints)</p></li></ul>]]></content:encoded>
            <author>chainanalyzer@newsletter.paragraph.com (ChainAnalyzer)</author>
            <enclosure url="https://img.paragraph.com/cdn-cgi/image/format=auto/https://storage.googleapis.com/papyrus_images/f00bf5a712cc6a3f8b76ccc0bcd2c9be64fd0889ccd003337a3dbd0b3ba5b46a.png" length="0" type="image/png"/>
        </item>
        <item>
            <title><![CDATA[Building an MCP server that AI agents pay for autonomously (Claude → MCP → x402 USDC)]]></title>
            <link>https://paragraph.com/@chainanalyzer/building-an-mcp-server-that-ai-agents-pay-for-autonomously-claude-→-mcp-→-x402-usdc</link>
            <guid>3BlHAA8p24pxMJV5NSPb</guid>
            <pubDate>Tue, 28 Apr 2026 14:01:29 GMT</pubDate>
            <description><![CDATA[Apr 28, 2026Building an MCP server that AI agents pay for autonomously (Claude → MCP → x402 USDC)The default model for MCP servers is "expose your tools, trust the caller." That's fine for personal Claude Desktop tools that hit local SQLite, but it doesn't work for paid data — the moment your tool calls a real upstream API, somebody has to pay for the upstream. We took a third path: instead of static API keys baked into the MCP config, our MCP tools speak x402, and Claude (or any MCP-aware ag...]]></description>
            <content:encoded><![CDATA[<p>Apr 28, 2026</p><h1 id="h-building-an-mcp-server-that-ai-agents-pay-for-autonomously-claude-mcp-x402-usdc" class="text-4xl font-header !mt-8 !mb-4 first:!mt-0 first:!mb-0">Building an MCP server that AI agents pay for autonomously (Claude → MCP → x402 USDC)</h1><p>The default model for MCP servers is &quot;expose your tools, trust the caller.&quot; That&apos;s fine for personal Claude Desktop tools that hit local SQLite, but it doesn&apos;t work for paid data — the moment your tool calls a real upstream API, <em>somebody</em> has to pay for the upstream. We took a third path: instead of static API keys baked into the MCP config, our MCP tools speak <a target="_blank" rel="noopener" class="dont-break-out" href="https://x402.org">x402</a>, and Claude (or any MCP-aware agent) signs a <code>$0.008 USDC</code> payment per call. No accounts. No keys. The agent gets exactly what it asked for, the upstream gets paid, and the human is out of the loop.</p><h3 id="h-highlights" class="text-2xl font-header !mt-6 !mb-4 first:!mt-0 first:!mb-0">Highlights</h3><ul><li><p><strong>No static API keys</strong> — users provision a wallet (USDC float on Base) and that&apos;s it</p></li><li><p><strong>Per-call USDC settlement</strong> — agent signs autonomously, no human in the loop</p></li><li><p><strong>Payment plumbing is invisible to the LLM</strong> — it just calls <code>scan_address</code> and gets JSON back</p></li><li><p><strong>Natural budget boundary</strong> — when the wallet runs out, calls fail clean</p></li></ul><h2 id="h-why-most-mcp-servers-cant-be-paid-for" class="text-3xl font-header !mt-8 !mb-4 first:!mt-0 first:!mb-0">Why most MCP servers can&apos;t be paid for</h2><p>If you&apos;ve installed an MCP server in Claude Desktop, you know the drill: static API key in env vars, rate limits to track, billing surprises at month-end. The agent might call your tool 50 times in a session and neither the agent nor the user notice. This works for genuinely free tools (local Postgres, filesystem, GitHub). It works <strong>poorly</strong> for tools that wrap an upstream that charges per call.</p><p>We wanted something better: <strong>the agent should pay for what it calls, in real money, at the moment of the call</strong>.</p><h2 id="h-what-x402-is-in-4-lines" class="text-3xl font-header !mt-8 !mb-4 first:!mt-0 first:!mb-0">What x402 is, in 4 lines</h2><p><a target="_blank" rel="noopener" class="dont-break-out" href="https://x402.org">x402</a> is the HTTP 402 status code wired up to stablecoin payments. The exchange:</p><ol><li><p>Agent calls <code>GET /api/risk-score?address=0xabc</code></p></li><li><p>Server replies <code>HTTP 402</code> with a price ($0.008 USDC), an asset (USDC on Base), a recipient, and a payload to sign</p></li><li><p>Agent&apos;s wallet signs an EIP-3009 <code>transferWithAuthorization</code> for that exact amount, base64-encodes it, and replays the request with <code>X-PAYMENT: &lt;signed payload&gt;</code></p></li><li><p>Server verifies the signature, runs the handler, settles the USDC on-chain via the Coinbase CDP facilitator, and returns the response with <code>X-PAYMENT-RESPONSE: &lt;on-chain receipt&gt;</code></p></li></ol><p>Sub-second on the protocol level. A few seconds for the on-chain settle on Base. From the agent&apos;s perspective: a 402, a retry with payment, then a 200.</p><h2 id="h-why-mcp-x402-fit-naturally" class="text-3xl font-header !mt-8 !mb-4 first:!mt-0 first:!mb-0">Why MCP + x402 fit naturally</h2><p>MCP (Model Context Protocol) is the standard for exposing tools to LLMs. Tools get a schema, a name, and a callable; the model decides when to invoke them. The runtime path:</p><pre data-type="codeBlock" text="LLM
 ├─→ MCP client
 │    └─→ MCP server (chainanalyzer-mcp)
 │         ├─→ HTTP GET /api/risk-score    ← 402 + price
 │         ├─→ wallet.sign(EIP-3009)        ← per-call payment
 │         ├─→ HTTP GET /api/risk-score    ← retry with X-PAYMENT
 │         │    [verify → handler → settle]
 │         └─→ 200 OK + risk JSON
 └─← result returned to LLM"><code>LLM
 ├─→ MCP client
 │    └─→ MCP server (chainanalyzer<span class="hljs-operator">-</span>mcp)
 │         ├─→ HTTP GET <span class="hljs-operator">/</span>api<span class="hljs-operator">/</span>risk<span class="hljs-operator">-</span>score    ← <span class="hljs-number">402</span> <span class="hljs-operator">+</span> price
 │         ├─→ wallet.sign(EIP<span class="hljs-number">-3009</span>)        ← per<span class="hljs-operator">-</span>call payment
 │         ├─→ HTTP GET <span class="hljs-operator">/</span>api<span class="hljs-operator">/</span>risk<span class="hljs-operator">-</span>score    ← retry with X<span class="hljs-operator">-</span>PAYMENT
 │         │    [verify → handler → settle]
 │         └─→ <span class="hljs-number">200</span> OK <span class="hljs-operator">+</span> risk JSON
 └─← result returned to LLM</code></pre><p>x402 fits <em>inside</em> &quot;MCP server runs handler&quot;. The MCP tool implementation makes an HTTP call to the upstream. The upstream returns 402. The MCP server has access to a wallet keypair (configured once, owned by the user). It signs the payment, replays, gets the data, returns it to the LLM. <strong>The LLM never sees the payment plumbing</strong> — it just sees &quot;I called <code>chainanalyzer.scan_address</code> and got a JSON response.&quot;</p><p>The user setup is <em>less</em> than the API-key version, because there&apos;s no signup. Their wallet is their account.</p><h2 id="h-what-changed-in-the-mcp-server" class="text-3xl font-header !mt-8 !mb-4 first:!mt-0 first:!mb-0">What changed in the MCP server</h2><p>Our <code>@chainanalyzer/mcp-server</code> used to require an API key. The new version (paid mode) uses the user&apos;s wallet:</p><pre data-type="codeBlock" text="{
  &quot;mcpServers&quot;: {
    &quot;chainanalyzer&quot;: {
      &quot;command&quot;: &quot;npx&quot;,
      &quot;args&quot;: [&quot;-y&quot;, &quot;@chainanalyzer/mcp-server&quot;],
      &quot;env&quot;: {
        &quot;CHAINANALYZER_X402_PRIVATE_KEY&quot;: &quot;0x...&quot;,
        &quot;CHAINANALYZER_X402_NETWORK&quot;: &quot;base&quot;
      }
    }
  }
}"><code>{
  <span class="hljs-string">"mcpServers"</span>: {
    <span class="hljs-string">"chainanalyzer"</span>: {
      <span class="hljs-string">"command"</span>: <span class="hljs-string">"npx"</span>,
      <span class="hljs-string">"args"</span>: [<span class="hljs-string">"-y"</span>, <span class="hljs-string">"@chainanalyzer/mcp-server"</span>],
      <span class="hljs-string">"env"</span>: {
        <span class="hljs-string">"CHAINANALYZER_X402_PRIVATE_KEY"</span>: <span class="hljs-string">"0x..."</span>,
        <span class="hljs-string">"CHAINANALYZER_X402_NETWORK"</span>: <span class="hljs-string">"base"</span>
      }
    }
  }
}</code></pre><p>The private key is the user&apos;s payment wallet (must hold USDC on Base). The MCP server uses <code>x402-fetch</code> under the hood to handle the 402 dance:</p><pre data-type="codeBlock" text="import { wrapFetchWithPayment } from &quot;x402-fetch&quot;
import { createWalletClient, http, privateKeyToAccount } from &quot;viem&quot;
import { base } from &quot;viem/chains&quot;

const account = privateKeyToAccount(process.env.CHAINANALYZER_X402_PRIVATE_KEY)
const wallet = createWalletClient({ account, chain: base, transport: http() })
const fetch402 = wrapFetchWithPayment(fetch, wallet)

// Inside the MCP tool handler:
const res = await fetch402(
  `https://chain-analyzer.com/api/v1/x402/address/${addr}/risk-score?chain=${chain}`,
  { method: &quot;POST&quot; }
)
return await res.json()  // automatically retried with payment"><code><span class="hljs-keyword">import</span> { wrapFetchWithPayment } <span class="hljs-keyword">from</span> <span class="hljs-string">"x402-fetch"</span>
<span class="hljs-keyword">import</span> { createWalletClient, http, privateKeyToAccount } <span class="hljs-keyword">from</span> <span class="hljs-string">"viem"</span>
<span class="hljs-keyword">import</span> { base } <span class="hljs-keyword">from</span> <span class="hljs-string">"viem/chains"</span>

<span class="hljs-keyword">const</span> account = <span class="hljs-title function_">privateKeyToAccount</span>(process.<span class="hljs-property">env</span>.<span class="hljs-property">CHAINANALYZER_X402_PRIVATE_KEY</span>)
<span class="hljs-keyword">const</span> wallet = <span class="hljs-title function_">createWalletClient</span>({ account, <span class="hljs-attr">chain</span>: base, <span class="hljs-attr">transport</span>: <span class="hljs-title function_">http</span>() })
<span class="hljs-keyword">const</span> fetch402 = <span class="hljs-title function_">wrapFetchWithPayment</span>(fetch, wallet)

<span class="hljs-comment">// Inside the MCP tool handler:</span>
<span class="hljs-keyword">const</span> res = <span class="hljs-keyword">await</span> <span class="hljs-title function_">fetch402</span>(
  <span class="hljs-string">`https://chain-analyzer.com/api/v1/x402/address/<span class="hljs-subst">${addr}</span>/risk-score?chain=<span class="hljs-subst">${chain}</span>`</span>,
  { <span class="hljs-attr">method</span>: <span class="hljs-string">"POST"</span> }
)
<span class="hljs-keyword">return</span> <span class="hljs-keyword">await</span> res.<span class="hljs-title function_">json</span>()  <span class="hljs-comment">// automatically retried with payment</span></code></pre><p>From the model&apos;s perspective, the tool either returned data (paid) or returned a &quot;wallet has insufficient USDC&quot; error (out of money). The latter becomes a natural budget signal — Claude tells the user &quot;your scan budget is exhausted&quot; instead of silently doing nothing.</p><h2 id="h-gotchas-we-hit" class="text-3xl font-header !mt-8 !mb-4 first:!mt-0 first:!mb-0">Gotchas we hit</h2><h3 id="h-1-mcp-is-stdio-json-http-doesnt-fit-that-model" class="text-2xl font-header !mt-6 !mb-4 first:!mt-0 first:!mb-0">1. MCP is stdio JSON; HTTP doesn&apos;t fit that model</h3><p>Most MCP servers communicate over stdio. We had to make sure outbound HTTP calls didn&apos;t clobber the stdio framing — a separate HTTP client, explicit JSON serialization before yielding back to MCP. Never let raw HTTP bytes leak into the protocol stream.</p><h3 id="h-2-eip-3009-validafter-validbefore-need-real-clock-skew" class="text-2xl font-header !mt-6 !mb-4 first:!mt-0 first:!mb-0">2. EIP-3009 <code>validAfter</code> / <code>validBefore</code> need real clock skew</h3><p>The facilitator rejects payments whose timestamps drift too far from network time. If the user&apos;s machine clock is 2 minutes off (laptop just woken up, NTP not yet caught up), every signature gets rejected. We added 60s of <code>validAfter</code> tolerance and a 5-minute <code>validBefore</code> window so this rarely bites in practice.</p><h3 id="h-3-self-payment-guard" class="text-2xl font-header !mt-6 !mb-4 first:!mt-0 first:!mb-0">3. Self-payment guard</h3><p>If the user happened to set <code>payTo</code> to the same address as their signing key, every payment would be a self-loop and the facilitator would reject it. We catch this client-side now and throw immediately with a useful error.</p><h3 id="h-4-small-balance-ux" class="text-2xl font-header !mt-6 !mb-4 first:!mt-0 first:!mb-0">4. Small-balance UX</h3><p>A $5 USDC float buys 625 calls at $0.008 each — enough for a meaningful Claude session, but if the user is doing batch screening (looping over hundreds of addresses), the float drains and the next call fails. We added a <code>chainanalyzer.check_my_balance</code> tool the LLM can call before kicking off a batch, returning the wallet&apos;s USDC balance and the projected number of calls available.</p><h2 id="h-what-it-costs-the-user" class="text-3xl font-header !mt-8 !mb-4 first:!mt-0 first:!mb-0">What it costs the user</h2><ul><li><p><strong>Wallet setup</strong>: free (any Base-compatible wallet)</p></li><li><p><strong>Initial funding</strong>: $5 USDC on Base + ~$0.50 of ETH for occasional gas (gas is cheap on L2)</p></li><li><p><strong>Per call</strong>: $0.008 USDC + negligible Base gas (the facilitator pays gas, the user pays the USDC)</p></li><li><p><strong>No subscription, no monthly minimum</strong></p></li></ul><p>Compared to our cheapest Pro plan at $19.99/month: <strong>under ~2,500 scans/month, x402 is strictly cheaper</strong>. Above that, Pro wins (and gets unmetered AI Analysis). For agentic workloads specifically, x402 is the obvious answer — agents don&apos;t have credit cards, agents don&apos;t sign up for SaaS, but <strong>agents do have wallets</strong>.</p><h2 id="h-try-it" class="text-3xl font-header !mt-8 !mb-4 first:!mt-0 first:!mb-0">Try it</h2><pre data-type="codeBlock" text="npx -y @chainanalyzer/mcp-server"><code>npx <span class="hljs-operator">-</span>y @chainanalyzer<span class="hljs-operator">/</span>mcp<span class="hljs-operator">-</span>server</code></pre><p>…with the wallet env vars set as above. See the <a target="_blank" rel="noopener" class="dont-break-out" href="https://github.com/rascal-3/chainanalyzer-mcp">chainanalyzer-mcp GitHub repo</a> for the full README, including a 90-second setup video.</p><p>For the underlying x402 endpoint set, see our companion post: Shipping a $0.008-per-call AML API on Coinbase x402 Bazaar.</p><h2 id="h-why-this-matters-beyond-crypto" class="text-3xl font-header !mt-8 !mb-4 first:!mt-0 first:!mb-0">Why this matters beyond crypto</h2><p>The pattern — <strong>MCP tool wraps an x402-priced HTTP API, agent has a wallet, calls cost real money</strong> — works for anything an agent might want to buy. Image generation. Flight prices. Address risk data. Translation. The hard parts are 1) actually shipping a working x402 endpoint (see our other writeup for the five things that broke), and 2) wrapping it cleanly in an MCP server so the agent doesn&apos;t see the payment plumbing.</p><p>The autonomy story for AI agents is currently bottlenecked by economics: agents can browse, reason, plan — but they can&apos;t transact. MCP + x402 closes that loop in a way that doesn&apos;t require the agent to have a personal credit card or the user to hand it one. <strong>The agent has a wallet. The wallet has USDC. That&apos;s enough.</strong></p><h2 id="h-links" class="text-3xl font-header !mt-8 !mb-4 first:!mt-0 first:!mb-0">Links</h2><ul><li><p><a target="_blank" rel="noopener" class="dont-break-out" href="https://github.com/rascal-3/chainanalyzer-mcp">MCP server (npm + GitHub)</a></p></li><li><p><a target="_blank" rel="noopener" class="dont-break-out" href="https://glama.ai/mcp/servers/rascal-3/chainanalyzer-mcp">Glama listing (AAA quality / security / license)</a></p></li><li><p>Companion post: Shipping a $0.008/call AML API on Coinbase x402 Bazaar</p></li><li><p><a target="_blank" rel="noopener" class="dont-break-out" href="https://x402.org">x402 spec</a></p></li><li><p><a target="_blank" rel="noopener" class="dont-break-out" href="https://modelcontextprotocol.io">MCP spec</a></p></li></ul>]]></content:encoded>
            <author>chainanalyzer@newsletter.paragraph.com (ChainAnalyzer)</author>
            <enclosure url="https://img.paragraph.com/cdn-cgi/image/format=auto/https://storage.googleapis.com/papyrus_images/f00bf5a712cc6a3f8b76ccc0bcd2c9be64fd0889ccd003337a3dbd0b3ba5b46a.png" length="0" type="image/png"/>
        </item>
        <item>
            <title><![CDATA[9 blockchains, $0 in extra API costs — beating the competition on coverage]]></title>
            <link>https://paragraph.com/@chainanalyzer/9-blockchains-dollar0-in-extra-api-costs-—-beating-the-competition-on-coverage</link>
            <guid>WopFrWG2TI6VHekxdBhv</guid>
            <pubDate>Tue, 28 Apr 2026 14:01:12 GMT</pubDate>
            <description><![CDATA[Apr 28, 20269 blockchains, $0 in extra API costs — beating the competition on coverageOn 2026-04-28, ChainAnalyzer expanded from 5 chains to 9. The new additions are BNB Smart Chain, Base, Arbitrum, and Optimism — pulling us ahead of the closest competitor (ChainAware at 8 chains) without paying a cent more in API costs. The trick: Etherscan V2's unified chainid routing, plus a small refactor that put every chain's config behind a single registry.Highlights9-chain coverage: Bitcoin, Ethereum,...]]></description>
            <content:encoded><![CDATA[<p>Apr 28, 2026</p><h1 id="h-9-blockchains-dollar0-in-extra-api-costs-beating-the-competition-on-coverage" class="text-4xl font-header !mt-8 !mb-4 first:!mt-0 first:!mb-0">9 blockchains, $0 in extra API costs — beating the competition on coverage</h1><p>On <strong>2026-04-28</strong>, ChainAnalyzer expanded from <strong>5 chains to 9</strong>. The new additions are <strong>BNB Smart Chain, Base, Arbitrum, and Optimism</strong> — pulling us ahead of the closest competitor (ChainAware at 8 chains) <strong>without paying a cent more in API costs</strong>. The trick: Etherscan V2&apos;s unified <code>chainid</code> routing, plus a small refactor that put every chain&apos;s config behind a single registry.</p><h3 id="h-highlights" class="text-2xl font-header !mt-6 !mb-4 first:!mt-0 first:!mb-0">Highlights</h3><ul><li><p><strong>9-chain coverage</strong>: Bitcoin, Ethereum, Polygon, Avalanche, Solana plus BNB / Base / Arbitrum / Optimism</p></li><li><p><strong>$0 in additional API spend</strong> — one Etherscan key covers all 6 EVMs we serve via V2</p></li><li><p><strong>Adding chain #10 is now a one-line change</strong> — registry-first refactor paid off</p></li><li><p><strong>Vs. competition</strong>: ChainAnalyzer = 9 chains (with Bitcoin) vs. ChainAware = 8 chains (no Bitcoin)</p></li></ul><h2 id="h-why-chain-count-matters" class="text-3xl font-header !mt-8 !mb-4 first:!mt-0 first:!mb-0">Why chain count matters</h2><p>When an AI search engine answers &quot;which blockchain risk-scoring API should I use?&quot;, the very first filter is <strong>&quot;do they cover the chain I&apos;m holding?&quot;</strong>. An Optimism user doesn&apos;t even read your detection-rule list if Optimism isn&apos;t on the chain badge row. Gemini / Perplexity / ChatGPT infer the answer from your homepage, your docs, and your <code>llms.txt</code>. If the literal chain isn&apos;t shown, you don&apos;t make the shortlist.</p><p>We measured this. After Gemini politely recommended a competitor with 8 chains over us at 5, we set a hard goal: <strong>outdo the chain count without losing the Bitcoin support that&apos;s our actual differentiator</strong>. EVM expansion was the obvious move — but the cost question was real.</p><h2 id="h-what-naive-expansion-would-cost" class="text-3xl font-header !mt-8 !mb-4 first:!mt-0 first:!mb-0">What naive expansion would cost</h2><p>If we&apos;d added each chain by signing up for its dedicated explorer:</p><ul><li><p>BNB → BscScan (free 5 req/s, Pro $99/mo)</p></li><li><p>Base → BaseScan (free 5 req/s, Pro $99/mo)</p></li><li><p>Arbitrum → Arbiscan (free 5 req/s, Pro $99/mo)</p></li><li><p>Optimism → Optimistic Etherscan (free 5 req/s, Pro $99/mo)</p></li></ul><p>Four accounts, four key rotations, four rate-limit configurations, and up to $396/mo if any single chain blew past its quota. <strong>What we actually paid: $0.</strong> Same Etherscan API key, same pooled quota.</p><h2 id="h-the-trick-etherscan-v2s-unified-api" class="text-3xl font-header !mt-8 !mb-4 first:!mt-0 first:!mb-0">The trick: Etherscan V2&apos;s unified API</h2><p>Unlike most providers, Etherscan V2 doesn&apos;t shard chains by hostname. Everything lives at one endpoint:</p><pre data-type="codeBlock" text="https://api.etherscan.io/v2/api"><code>https://api.etherscan.io/v2/api</code></pre><p>Routing happens via <code>chainid</code>:</p><pre data-type="codeBlock" text="Ethereum    chainid 1
Polygon     chainid 137
BNB         chainid 56
Optimism    chainid 10
Arbitrum    chainid 42161
Base        chainid 8453"><code><span class="hljs-string">Ethereum</span>    <span class="hljs-string">chainid</span> <span class="hljs-number">1</span>
<span class="hljs-string">Polygon</span>     <span class="hljs-string">chainid</span> <span class="hljs-number">137</span>
<span class="hljs-string">BNB</span>         <span class="hljs-string">chainid</span> <span class="hljs-number">56</span>
<span class="hljs-string">Optimism</span>    <span class="hljs-string">chainid</span> <span class="hljs-number">10</span>
<span class="hljs-string">Arbitrum</span>    <span class="hljs-string">chainid</span> <span class="hljs-number">42161</span>
<span class="hljs-string">Base</span>        <span class="hljs-string">chainid</span> <span class="hljs-number">8453</span></code></pre><p>Same key. Same rate limits (5 req/s, 100K calls/day). Same response shape. The free tier&apos;s quota is <strong>pooled across all chains</strong>, so as long as your total burn is under 100K/day, you can split it however you want. Roughly 35,000 wallet scans for us — well above current load.</p><p>The one EVM Etherscan V2 does not cover is Avalanche. We use Routescan there (Etherscan-compatible, also free, same rate limits). Same response handling, just a different base URL.</p><h2 id="h-the-architectural-choice-chain-registry" class="text-3xl font-header !mt-8 !mb-4 first:!mt-0 first:!mb-0">The architectural choice: chain registry</h2><p>When we shipped Polygon / Avalanche in v0.7, chain config was sprinkled across the orchestrator, the Neo4j ingestor, plan-gating, the UI selector, native-token symbol maps, and the marketing pages. Adding chain #6 the naive way meant grepping for &quot;polygon&quot; across 50+ files.</p><p>So we paid down the debt first. Chain metadata now lives in a single <code>apps/api/app/services/chains.py</code>:</p><pre data-type="codeBlock" text="EVM_CHAINS = {
    &quot;ethereum&quot;:  {&quot;chainid&quot;: 1,     &quot;native&quot;: &quot;ETH&quot;, &quot;explorer&quot;: &quot;etherscan_v2&quot;},
    &quot;polygon&quot;:   {&quot;chainid&quot;: 137,   &quot;native&quot;: &quot;POL&quot;, &quot;explorer&quot;: &quot;etherscan_v2&quot;},
    &quot;bnb&quot;:       {&quot;chainid&quot;: 56,    &quot;native&quot;: &quot;BNB&quot;, &quot;explorer&quot;: &quot;etherscan_v2&quot;},
    &quot;base&quot;:      {&quot;chainid&quot;: 8453,  &quot;native&quot;: &quot;ETH&quot;, &quot;explorer&quot;: &quot;etherscan_v2&quot;},
    &quot;arbitrum&quot;:  {&quot;chainid&quot;: 42161, &quot;native&quot;: &quot;ETH&quot;, &quot;explorer&quot;: &quot;etherscan_v2&quot;},
    &quot;optimism&quot;:  {&quot;chainid&quot;: 10,    &quot;native&quot;: &quot;ETH&quot;, &quot;explorer&quot;: &quot;etherscan_v2&quot;},
    &quot;avalanche&quot;: {&quot;chainid&quot;: 43114, &quot;native&quot;: &quot;AVAX&quot;, &quot;explorer&quot;: &quot;routescan&quot;},
}

SUPPORTED_CHAINS = {**EVM_CHAINS, &quot;bitcoin&quot;: ..., &quot;solana&quot;: ...}
EVM_CHAINS_SET = frozenset(EVM_CHAINS)
SUPPORTED_CHAINS_SET = frozenset(SUPPORTED_CHAINS)

def is_evm(chain: str) -&gt; bool:
    return chain in EVM_CHAINS_SET"><code>EVM_CHAINS <span class="hljs-operator">=</span> {
    <span class="hljs-string">"ethereum"</span>:  {<span class="hljs-string">"chainid"</span>: <span class="hljs-number">1</span>,     <span class="hljs-string">"native"</span>: <span class="hljs-string">"ETH"</span>, <span class="hljs-string">"explorer"</span>: <span class="hljs-string">"etherscan_v2"</span>},
    <span class="hljs-string">"polygon"</span>:   {<span class="hljs-string">"chainid"</span>: <span class="hljs-number">137</span>,   <span class="hljs-string">"native"</span>: <span class="hljs-string">"POL"</span>, <span class="hljs-string">"explorer"</span>: <span class="hljs-string">"etherscan_v2"</span>},
    <span class="hljs-string">"bnb"</span>:       {<span class="hljs-string">"chainid"</span>: <span class="hljs-number">56</span>,    <span class="hljs-string">"native"</span>: <span class="hljs-string">"BNB"</span>, <span class="hljs-string">"explorer"</span>: <span class="hljs-string">"etherscan_v2"</span>},
    <span class="hljs-string">"base"</span>:      {<span class="hljs-string">"chainid"</span>: <span class="hljs-number">8453</span>,  <span class="hljs-string">"native"</span>: <span class="hljs-string">"ETH"</span>, <span class="hljs-string">"explorer"</span>: <span class="hljs-string">"etherscan_v2"</span>},
    <span class="hljs-string">"arbitrum"</span>:  {<span class="hljs-string">"chainid"</span>: <span class="hljs-number">42161</span>, <span class="hljs-string">"native"</span>: <span class="hljs-string">"ETH"</span>, <span class="hljs-string">"explorer"</span>: <span class="hljs-string">"etherscan_v2"</span>},
    <span class="hljs-string">"optimism"</span>:  {<span class="hljs-string">"chainid"</span>: <span class="hljs-number">10</span>,    <span class="hljs-string">"native"</span>: <span class="hljs-string">"ETH"</span>, <span class="hljs-string">"explorer"</span>: <span class="hljs-string">"etherscan_v2"</span>},
    <span class="hljs-string">"avalanche"</span>: {<span class="hljs-string">"chainid"</span>: <span class="hljs-number">43114</span>, <span class="hljs-string">"native"</span>: <span class="hljs-string">"AVAX"</span>, <span class="hljs-string">"explorer"</span>: <span class="hljs-string">"routescan"</span>},
}

SUPPORTED_CHAINS <span class="hljs-operator">=</span> {<span class="hljs-operator">*</span><span class="hljs-operator">*</span>EVM_CHAINS, <span class="hljs-string">"bitcoin"</span>: ..., <span class="hljs-string">"solana"</span>: ...}
EVM_CHAINS_SET <span class="hljs-operator">=</span> frozenset(EVM_CHAINS)
SUPPORTED_CHAINS_SET <span class="hljs-operator">=</span> frozenset(SUPPORTED_CHAINS)

def is_evm(chain: str) <span class="hljs-operator">-</span><span class="hljs-operator">></span> <span class="hljs-keyword">bool</span>:
    <span class="hljs-keyword">return</span> chain in EVM_CHAINS_SET</code></pre><p>Adding chain #10 is now genuinely a one-line change — the orchestrator, ingestor, native-symbol resolver, and <code>is_evm()</code> helper all pick it up automatically. The frontend <code>chainanalyzer.ts</code> got a symmetric <code>isEvmChain()</code> helper.</p><p><strong>That&apos;s the diff that mattered.</strong> Everything else was bookkeeping.</p><h2 id="h-the-bookkeeping-still-real-work" class="text-3xl font-header !mt-8 !mb-4 first:!mt-0 first:!mb-0">The bookkeeping (still real work)</h2><ul><li><p><strong>76+ detection rules</strong> — mostly chain-agnostic, but native-token transfer detection had to know &quot;chain 56 = BNB&quot; / &quot;chain 8453 = ETH&quot;</p></li><li><p><strong>Plan gating</strong> — Free stays Solana-only, Starter+ gets all 9. Already centralized, one-line update</p></li><li><p><strong>Chain selector UI</strong> — both marketing and scan-screen dropdowns grew four entries</p></li><li><p><strong>Marketing copy</strong> — every &quot;5 chains&quot; reference across marketing/, news/, docs/, llms.txt, CLAUDE.md, GitHub README, chainanalyzer-mcp. Caught with a single grep checklist (<code>docs/CHAIN_EXPANSION_5_TO_9_CHECKLIST.md</code>)</p></li><li><p><strong>Neo4j graph ingestor</strong> — native-symbol map updated:</p></li></ul><pre data-type="codeBlock" text="NATIVE_TOKEN_SYMBOL = {
    &quot;ethereum&quot;: &quot;ETH&quot;, &quot;polygon&quot;: &quot;POL&quot;, &quot;avalanche&quot;: &quot;AVAX&quot;,
    &quot;bnb&quot;: &quot;BNB&quot;,       # native = BNB
    &quot;base&quot;: &quot;ETH&quot;,      # native = ETH
    &quot;arbitrum&quot;: &quot;ETH&quot;,  # native = ETH
    &quot;optimism&quot;: &quot;ETH&quot;,  # native = ETH
}"><code>NATIVE_TOKEN_SYMBOL = {
    <span class="hljs-string">"ethereum"</span>: <span class="hljs-string">"ETH"</span>, <span class="hljs-string">"polygon"</span>: <span class="hljs-string">"POL"</span>, <span class="hljs-string">"avalanche"</span>: <span class="hljs-string">"AVAX"</span>,
    <span class="hljs-string">"bnb"</span>: <span class="hljs-string">"BNB"</span>,       <span class="hljs-comment"># native = BNB</span>
    <span class="hljs-string">"base"</span>: <span class="hljs-string">"ETH"</span>,      <span class="hljs-comment"># native = ETH</span>
    <span class="hljs-string">"arbitrum"</span>: <span class="hljs-string">"ETH"</span>,  <span class="hljs-comment"># native = ETH</span>
    <span class="hljs-string">"optimism"</span>: <span class="hljs-string">"ETH"</span>,  <span class="hljs-comment"># native = ETH</span>
}</code></pre><ul><li><p><strong>CoinGecko ID mapping</strong> — BNB → <code>binancecoin</code>, L2s → <code>ethereum</code></p></li></ul><p>The registry-first refactor turned what would have been a 50+ file change into a single PR. Nothing exotic.</p><h2 id="h-what-we-deliberately-skipped" class="text-3xl font-header !mt-8 !mb-4 first:!mt-0 first:!mb-0">What we deliberately skipped</h2><ul><li><p><strong>TRON</strong> — non-EVM (TVM, Base58Check), TronGrid is a separate API surface, the address detection / signing flow is different. Customer demand is real, so it&apos;s a Phase 2 target</p></li><li><p><strong>TON</strong> — non-EVM, Toncenter is a separate API. Phase 2</p></li><li><p><strong>HAQQ</strong> — usage too small to justify</p></li></ul><p>The registry is now ready for non-EVM chains too — they just need a non-EVM branch in the orchestrator.</p><h2 id="h-did-it-work" class="text-3xl font-header !mt-8 !mb-4 first:!mt-0 first:!mb-0">Did it work?</h2><p><strong>Coverage</strong>: yes. 9 chains with Bitcoin vs. ChainAware&apos;s 8 chains without Bitcoin — a clean surface-filter win for AI search engines that lead with chain count.<br><strong>Cost</strong>: yes. Monthly API spend before / after expansion: $0 / $0.<br><strong>Visibility</strong>: partial. Gemini hasn&apos;t yet re-indexed the updated chain count (current 7-query baseline is still 0/7 surfacing — we expect 1-4 weeks of crawl lag for the structured data + disambiguating description shipped alongside this expansion). Perplexity, Claude Web, and ChatGPT already pick up the 9-chain coverage from our docs and <code>llms.txt</code>.</p><p>If you&apos;re an Etherscan API user who hasn&apos;t migrated to V2 yet — do it. Same key, more chains, no extra cost.</p><h2 id="h-links" class="text-3xl font-header !mt-8 !mb-4 first:!mt-0 first:!mb-0">Links</h2><ul><li><p><a target="_blank" rel="noopener" class="dont-break-out" href="https://chain-analyzer.com">ChainAnalyzer (main product)</a></p></li><li><p><a target="_blank" rel="noopener" class="dont-break-out" href="https://docs.etherscan.io/etherscan-v2">Etherscan V2 docs</a></p></li><li><p><a target="_blank" rel="noopener" class="dont-break-out" href="https://routescan.io">Routescan (Avalanche)</a></p></li><li><p><a target="_blank" rel="noopener" class="dont-break-out" href="https://github.com/rascal-3/chainanalyzer-mcp">ChainAnalyzer MCP server</a></p></li></ul>]]></content:encoded>
            <author>chainanalyzer@newsletter.paragraph.com (ChainAnalyzer)</author>
            <enclosure url="https://img.paragraph.com/cdn-cgi/image/format=auto/https://storage.googleapis.com/papyrus_images/f00bf5a712cc6a3f8b76ccc0bcd2c9be64fd0889ccd003337a3dbd0b3ba5b46a.png" length="0" type="image/png"/>
        </item>
        <item>
            <title><![CDATA[Shipping a $0.008-per-call AML API on Coinbase x402 Bazaar]]></title>
            <link>https://paragraph.com/@chainanalyzer/shipping-a-dollar0008-per-call-aml-api-on-coinbase-x402-bazaar</link>
            <guid>dLGei2XuKEClEe0KeB3x</guid>
            <pubDate>Tue, 28 Apr 2026 14:00:53 GMT</pubDate>
            <description><![CDATA[Apr 28, 2026Shipping a $0.008-per-call AML API on Coinbase x402 BazaarOn 2026-04-28, ChainAnalyzer cleared its first production mainnet settlement on Coinbase x402 Bazaar. An AI agent autonomously paid $0.008 USDC on Base, and in under 30 seconds got back a CRITICAL risk verdict with 64 detections on a Tornado Cash address — 76+ rules, ML anomaly scoring, Neo4j graph traversal. No account, no API key, fully settled on-chain.HighlightsFull x402 v2 spec compliance — verify + settle both running...]]></description>
            <content:encoded><![CDATA[<p>Apr 28, 2026</p><h1 id="h-shipping-a-dollar0008-per-call-aml-api-on-coinbase-x402-bazaar" class="text-4xl font-header !mt-8 !mb-4 first:!mt-0 first:!mb-0">Shipping a $0.008-per-call AML API on Coinbase x402 Bazaar</h1><p>On <strong>2026-04-28</strong>, ChainAnalyzer cleared its first production mainnet settlement on <strong>Coinbase x402 Bazaar</strong>. An AI agent autonomously paid <code>$0.008 USDC</code> on Base, and in under 30 seconds got back a <strong>CRITICAL risk verdict with 64 detections</strong> on a Tornado Cash address — 76+ rules, ML anomaly scoring, Neo4j graph traversal. No account, no API key, fully settled on-chain.</p><h3 id="h-highlights" class="text-2xl font-header !mt-6 !mb-4 first:!mt-0 first:!mb-0">Highlights</h3><ul><li><p><strong>Full x402 v2 spec compliance</strong> — verify + settle both running on real mainnet via EIP-3009 <code>transferWithAuthorization</code> through the Coinbase CDP facilitator</p></li><li><p><strong>Coinbase Bazaar auto-indexing</strong> — no submission form, no fee. The first successful settlement is the cataloging trigger</p></li><li><p><strong>Tornado Cash demo returned CRITICAL</strong> — 64 detections (Address Poisoning, Peel Chain, Fake Token URL Phishing, Sybil Aggregation, Token Relay)</p></li><li><p><strong>Nine chains</strong> — Bitcoin, Ethereum, Polygon, Arbitrum, Optimism, Base, Avalanche, Solana. Bitcoin coverage is unusual in this space</p></li><li><p><strong>No subscription needed</strong> — any AI agent that holds USDC can call the AML API in a single <code>fetch()</code></p></li></ul><h2 id="h-why-x402-actually-matters-for-ai-agents" class="text-3xl font-header !mt-8 !mb-4 first:!mt-0 first:!mb-0">Why x402 actually matters for AI agents</h2><p>Most API products assume a three-step onboarding: create an account, generate a key, set up a subscription. For AI agents that&apos;s a fatal source of friction — the agent wants to act autonomously, but it has to wait for a human to register and provision credentials before it can do anything.</p><p><strong>x402</strong> turns HTTP 402 (Payment Required) from a curiosity into a real protocol. The server returns payment requirements in the 402 response; the client signs USDC authorization, replays the request with the signature in an <code>X-PAYMENT</code> header; the Coinbase CDP facilitator verifies and settles on-chain; the server returns the actual response after settlement clears.</p><p>Net effect: <strong>any AI agent that holds a wallet can call ChainAnalyzer&apos;s AML primitives one request at a time</strong>, without a subscription contract or an API key. <strong>Coinbase Bazaar / Agentic.Market</strong> is the marketplace that catalogs every endpoint built this way and lets agents discover, compare, and call them.</p><h2 id="h-five-things-that-broke-and-how-we-fixed-them" class="text-3xl font-header !mt-8 !mb-4 first:!mt-0 first:!mb-0">Five things that broke (and how we fixed them)</h2><p>The x402 v2 spec is new enough that rolling your own implementation has multiple failure modes. Sharing the ones we hit, in case they save someone a day.</p><h3 id="h-1-the-verify-wire-format-is-nothing-like-the-legacy-x402-examples" class="text-2xl font-header !mt-6 !mb-4 first:!mt-0 first:!mb-0">1. The verify wire format is nothing like the legacy x402 examples</h3><p>The first hand-written implementation POSTed <code>{&quot;payment&quot;: &quot;&lt;base64&gt;&quot;, &quot;requirements&quot;: {scheme, price}}</code> to the facilitator. That has nothing to do with v2. The correct shape is:</p><pre data-type="codeBlock" text="{
  &quot;x402Version&quot;: 2,
  &quot;paymentPayload&quot;: {
    &quot;x402Version&quot;: 2,
    &quot;payload&quot;: { &quot;signature&quot;: &quot;0x...&quot;, &quot;authorization&quot;: { ... } },
    &quot;accepted&quot;: {
      &quot;scheme&quot;: &quot;exact&quot;,
      &quot;network&quot;: &quot;eip155:8453&quot;,
      &quot;asset&quot;: &quot;0x833589fCD6eDb6E08f4c7C32D4f71b54bdA02913&quot;,
      &quot;amount&quot;: &quot;8000&quot;,
      &quot;payTo&quot;: &quot;0xe8e26183...708959&quot;,
      &quot;maxTimeoutSeconds&quot;: 60,
      &quot;extra&quot;: { &quot;name&quot;: &quot;USD Coin&quot;, &quot;version&quot;: &quot;2&quot; }
    },
    &quot;resource&quot;: { &quot;url&quot;: &quot;...&quot;, &quot;description&quot;: &quot;...&quot;, &quot;mimeType&quot;: &quot;application/json&quot; }
  },
  &quot;paymentRequirements&quot;: {
    &quot;scheme&quot;: &quot;exact&quot;,
    &quot;network&quot;: &quot;eip155:8453&quot;,
    &quot;asset&quot;: &quot;0x833589fCD6eDb6E08f4c7C32D4f71b54bdA02913&quot;,
    &quot;amount&quot;: &quot;8000&quot;,
    &quot;payTo&quot;: &quot;0xe8e26183...708959&quot;,
    &quot;maxTimeoutSeconds&quot;: 60
  }
}"><code>{
  <span class="hljs-string">"x402Version"</span>: <span class="hljs-number">2</span>,
  <span class="hljs-string">"paymentPayload"</span>: {
    <span class="hljs-string">"x402Version"</span>: <span class="hljs-number">2</span>,
    <span class="hljs-string">"payload"</span>: { <span class="hljs-string">"signature"</span>: <span class="hljs-string">"0x..."</span>, <span class="hljs-string">"authorization"</span>: { ... } },
    <span class="hljs-string">"accepted"</span>: {
      <span class="hljs-string">"scheme"</span>: <span class="hljs-string">"exact"</span>,
      <span class="hljs-string">"network"</span>: <span class="hljs-string">"eip155:8453"</span>,
      <span class="hljs-string">"asset"</span>: <span class="hljs-string">"0x833589fCD6eDb6E08f4c7C32D4f71b54bdA02913"</span>,
      <span class="hljs-string">"amount"</span>: <span class="hljs-string">"8000"</span>,
      <span class="hljs-string">"payTo"</span>: <span class="hljs-string">"0xe8e26183...708959"</span>,
      <span class="hljs-string">"maxTimeoutSeconds"</span>: <span class="hljs-number">60</span>,
      <span class="hljs-string">"extra"</span>: { <span class="hljs-string">"name"</span>: <span class="hljs-string">"USD Coin"</span>, <span class="hljs-string">"version"</span>: <span class="hljs-string">"2"</span> }
    },
    <span class="hljs-string">"resource"</span>: { <span class="hljs-string">"url"</span>: <span class="hljs-string">"..."</span>, <span class="hljs-string">"description"</span>: <span class="hljs-string">"..."</span>, <span class="hljs-string">"mimeType"</span>: <span class="hljs-string">"application/json"</span> }
  },
  <span class="hljs-string">"paymentRequirements"</span>: {
    <span class="hljs-string">"scheme"</span>: <span class="hljs-string">"exact"</span>,
    <span class="hljs-string">"network"</span>: <span class="hljs-string">"eip155:8453"</span>,
    <span class="hljs-string">"asset"</span>: <span class="hljs-string">"0x833589fCD6eDb6E08f4c7C32D4f71b54bdA02913"</span>,
    <span class="hljs-string">"amount"</span>: <span class="hljs-string">"8000"</span>,
    <span class="hljs-string">"payTo"</span>: <span class="hljs-string">"0xe8e26183...708959"</span>,
    <span class="hljs-string">"maxTimeoutSeconds"</span>: <span class="hljs-number">60</span>
  }
}</code></pre><p>The load-bearing field is <code>paymentPayload.accepted</code> — the client echoes back the exact requirement they signed for. Without it the facilitator can&apos;t bind the signature to a network / asset / payTo, which is the whole point of the protocol. Hand-rolling this is a trap; use the official <code>x402</code> Python or TypeScript SDK and let the lib own the schema.</p><h3 id="h-2-there-was-no-settle-call" class="text-2xl font-header !mt-6 !mb-4 first:!mt-0 first:!mb-0">2. There was no settle call</h3><p>Verify only checks &quot;is this signature valid for this requirement.&quot; Actually moving USDC requires a <em>second</em> POST to <code>/settle</code>. The original implementation called verify, treated success as final, and returned the API response — meanwhile <strong>no USDC had moved on-chain</strong>. We replaced the whole pipeline with the official <code>x402</code> Python lib&apos;s <code>HTTPFacilitatorClient</code>, then wrapped the middleware as verify → handler → settle.</p><h3 id="h-3-the-sveltekit-proxy-was-stripping-x-payment" class="text-2xl font-header !mt-6 !mb-4 first:!mt-0 first:!mb-0">3. The SvelteKit proxy was stripping X-PAYMENT</h3><p>Calls to <code>/api/v1/x402/...</code> looped on 402 forever because the catch-all proxy in front of FastAPI only forwarded <code>X-API-Key</code> and <code>Content-Type</code>. <code>X-PAYMENT</code> and <code>PAYMENT-SIGNATURE</code> have to be forwarded explicitly, and the matching <code>X-PAYMENT-RESPONSE</code> exposed on the response side.</p><h3 id="h-4-esmsh-transitive-dep-hell" class="text-2xl font-header !mt-6 !mb-4 first:!mt-0 first:!mb-0">4. esm.sh transitive dep hell</h3><p>Trying to wire up a browser demo via esm.sh, <code>x402-fetch@1.2.0</code> internally imports <code>@solana/rpc-parsed-types@5.5.1</code>, and that subpath isn&apos;t published on esm.sh — it returns text/plain 404, which Firefox surfaces as &quot;MIME type not allowed&quot; (a CSP-flavored error message that sends you down the wrong rabbit hole). The fix that worked: drop x402-fetch entirely and sign EIP-3009 directly with viem&apos;s <code>signTypedData_v4</code>. About 50 lines.</p><h3 id="h-5-self-transfer-from-payto-silently-fails-verification" class="text-2xl font-header !mt-6 !mb-4 first:!mt-0 first:!mb-0">5. Self-transfer (from == payTo) silently fails verification</h3><p>The first end-to-end test connected Phantom to the same address used as the treasury <code>payTo</code>. The signed message was <code>transferWithAuthorization(from=A, to=A, value=8000)</code> — technically valid, semantically a no-op. The facilitator rejects it without a useful <code>invalid_reason</code>. Add a client-side <code>from != payTo</code> assertion before signing; it saves an hour of staring at HTTP 402 responses.</p><h2 id="h-what-it-actually-returned-tornado-cash-64-detections" class="text-3xl font-header !mt-8 !mb-4 first:!mt-0 first:!mb-0">What it actually returned — Tornado Cash, 64 detections</h2><p>For the end-to-end smoke test we hit the Tornado Cash 0.1 ETH pool address (<code>0x0000db5c8b...e70000</code>) and got back:</p><ul><li><p><strong>risk_level</strong>: <code>CRITICAL</code></p></li><li><p><strong>detection_count</strong>: <code>64</code></p></li><li><p><strong>ml_anomaly_score</strong>: <code>0.4381</code> (3-model ensemble — Isolation Forest + AutoEncoder + GraphSAGE)</p></li><li><p><strong>Top detector classes</strong>: 30+ Peel Chain (E8), 13 Fake Token URL Phishing (E16), Address Poisoning Received (E6), Sybil Aggregation (E12), Token Relay Chain (E15)</p></li><li><p><strong>scan_duration_ms</strong>: ~30s (running all heuristics + ML + Neo4j across 9 chains)</p></li></ul><p>Settlement is on-chain: the receiving address <code>chainanalyzer.eth</code> (<code>0xe8e26183...708959</code>) shows the <code>+0.008 USDC</code> transfer on Basescan.</p><h2 id="h-try-it" class="text-3xl font-header !mt-8 !mb-4 first:!mt-0 first:!mb-0">Try it</h2><h3 id="h-see-the-402-no-payment-just-the-price-tag" class="text-2xl font-header !mt-6 !mb-4 first:!mt-0 first:!mb-0">See the 402 (no payment, just the price tag)</h3><pre data-type="codeBlock" text="curl -i https://chain-analyzer.com/api/v1/x402/address/0x0000db5c8b030ae20308ac975898e09741e70000/risk-score?chain=ethereum
# HTTP/2 402 Payment Required
# {
#   &quot;x402Version&quot;: 2,
#   &quot;accepts&quot;: [
#     {
#       &quot;scheme&quot;: &quot;exact&quot;,
#       &quot;network&quot;: &quot;eip155:8453&quot;,
#       &quot;price&quot;: &quot;$0.008&quot;,
#       &quot;payTo&quot;: &quot;0xe8e26183...708959&quot;,
#       &quot;asset&quot;: {
#         &quot;address&quot;: &quot;0x833589fCD6eDb6E08f4c7C32D4f71b54bdA02913&quot;,
#         &quot;decimals&quot;: 6,
#         &quot;eip712&quot;: { &quot;name&quot;: &quot;USD Coin&quot;, &quot;version&quot;: &quot;2&quot; }
#       }
#     },
#     { &quot;scheme&quot;: &quot;exact&quot;, &quot;network&quot;: &quot;solana:5eykt4Us...&quot;, ... }
#   ],
#   &quot;extensions&quot;: { &quot;bazaar&quot;: { &quot;discoverable&quot;: true, ... } }
# }"><code>curl -i https://chain-analyzer.com/api/v1/x402/address/0x0000db5c8b030ae20308ac975898e09741e70000/risk-score?chain=ethereum
<span class="hljs-meta prompt_"># </span><span class="bash">HTTP/2 402 Payment Required</span>
<span class="hljs-meta prompt_"># </span><span class="bash">{</span>
<span class="hljs-meta prompt_"># </span><span class="bash">  <span class="hljs-string">"x402Version"</span>: 2,</span>
<span class="hljs-meta prompt_"># </span><span class="bash">  <span class="hljs-string">"accepts"</span>: [</span>
<span class="hljs-meta prompt_"># </span><span class="bash">    {</span>
<span class="hljs-meta prompt_"># </span><span class="bash">      <span class="hljs-string">"scheme"</span>: <span class="hljs-string">"exact"</span>,</span>
<span class="hljs-meta prompt_"># </span><span class="bash">      <span class="hljs-string">"network"</span>: <span class="hljs-string">"eip155:8453"</span>,</span>
<span class="hljs-meta prompt_"># </span><span class="bash">      <span class="hljs-string">"price"</span>: <span class="hljs-string">"<span class="hljs-variable">$0</span>.008"</span>,</span>
<span class="hljs-meta prompt_"># </span><span class="bash">      <span class="hljs-string">"payTo"</span>: <span class="hljs-string">"0xe8e26183...708959"</span>,</span>
<span class="hljs-meta prompt_"># </span><span class="bash">      <span class="hljs-string">"asset"</span>: {</span>
<span class="hljs-meta prompt_"># </span><span class="bash">        <span class="hljs-string">"address"</span>: <span class="hljs-string">"0x833589fCD6eDb6E08f4c7C32D4f71b54bdA02913"</span>,</span>
<span class="hljs-meta prompt_"># </span><span class="bash">        <span class="hljs-string">"decimals"</span>: 6,</span>
<span class="hljs-meta prompt_"># </span><span class="bash">        <span class="hljs-string">"eip712"</span>: { <span class="hljs-string">"name"</span>: <span class="hljs-string">"USD Coin"</span>, <span class="hljs-string">"version"</span>: <span class="hljs-string">"2"</span> }</span>
<span class="hljs-meta prompt_"># </span><span class="bash">      }</span>
<span class="hljs-meta prompt_"># </span><span class="bash">    },</span>
<span class="hljs-meta prompt_"># </span><span class="bash">    { <span class="hljs-string">"scheme"</span>: <span class="hljs-string">"exact"</span>, <span class="hljs-string">"network"</span>: <span class="hljs-string">"solana:5eykt4Us..."</span>, ... }</span>
<span class="hljs-meta prompt_"># </span><span class="bash">  ],</span>
<span class="hljs-meta prompt_"># </span><span class="bash">  <span class="hljs-string">"extensions"</span>: { <span class="hljs-string">"bazaar"</span>: { <span class="hljs-string">"discoverable"</span>: <span class="hljs-literal">true</span>, ... } }</span>
<span class="hljs-meta prompt_"># </span><span class="bash">}</span></code></pre><h3 id="h-pay-with-phantom-in-the-browser-no-code" class="text-2xl font-header !mt-6 !mb-4 first:!mt-0 first:!mb-0">Pay with Phantom in the browser (no code)</h3><p>Open <strong>chain-analyzer.com/x402-demo.html</strong>, connect Phantom on Base, click <strong>&quot;Pay $0.008 USDC and scan&quot;</strong>. EIP-3009 prompt fires, ~30 seconds later the risk-score JSON drops in. Solana works the same way.</p><h3 id="h-call-from-an-ai-agent-typescript" class="text-2xl font-header !mt-6 !mb-4 first:!mt-0 first:!mb-0">Call from an AI agent (TypeScript)</h3><pre data-type="codeBlock" text="import { createWalletClient, custom } from &quot;viem&quot;
import { base } from &quot;viem/chains&quot;

// Browser: connect Phantom (or any EIP-1193 wallet) to Base mainnet
const wallet = createWalletClient({
  chain: base,
  transport: custom(window.phantom.ethereum),
})
const [account] = await wallet.requestAddresses()

// Sign EIP-3009 transferWithAuthorization for $0.008 USDC, replay
// the request with X-PAYMENT — middleware verifies + settles via the
// Coinbase CDP facilitator, then returns the risk-score JSON
const res = await fetch(
  &quot;https://chain-analyzer.com/api/v1/x402/address/&quot; +
    &quot;0x0000db5c8b030ae20308ac975898e09741e70000/risk-score?chain=ethereum&quot;,
  { headers: { &quot;X-PAYMENT&quot;: buildPayment(account, /* ... */) } },
)
const score = await res.json()
// score.risk_level === &quot;CRITICAL&quot;, score.detection_count === 64
// score.detections[i].detector_name === &quot;ADDRESS_POISONING_RECEIVED&quot; ..."><code><span class="hljs-keyword">import</span> { createWalletClient, custom } <span class="hljs-keyword">from</span> <span class="hljs-string">"viem"</span>
<span class="hljs-keyword">import</span> { base } <span class="hljs-keyword">from</span> <span class="hljs-string">"viem/chains"</span>

<span class="hljs-comment">// Browser: connect Phantom (or any EIP-1193 wallet) to Base mainnet</span>
<span class="hljs-keyword">const</span> wallet = <span class="hljs-title function_">createWalletClient</span>({
  <span class="hljs-attr">chain</span>: base,
  <span class="hljs-attr">transport</span>: <span class="hljs-title function_">custom</span>(<span class="hljs-variable language_">window</span>.<span class="hljs-property">phantom</span>.<span class="hljs-property">ethereum</span>),
})
<span class="hljs-keyword">const</span> [account] = <span class="hljs-keyword">await</span> wallet.<span class="hljs-title function_">requestAddresses</span>()

<span class="hljs-comment">// Sign EIP-3009 transferWithAuthorization for $0.008 USDC, replay</span>
<span class="hljs-comment">// the request with X-PAYMENT — middleware verifies + settles via the</span>
<span class="hljs-comment">// Coinbase CDP facilitator, then returns the risk-score JSON</span>
<span class="hljs-keyword">const</span> res = <span class="hljs-keyword">await</span> <span class="hljs-title function_">fetch</span>(
  <span class="hljs-string">"https://chain-analyzer.com/api/v1/x402/address/"</span> +
    <span class="hljs-string">"0x0000db5c8b030ae20308ac975898e09741e70000/risk-score?chain=ethereum"</span>,
  { <span class="hljs-attr">headers</span>: { <span class="hljs-string">"X-PAYMENT"</span>: <span class="hljs-title function_">buildPayment</span>(account, <span class="hljs-comment">/* ... */</span>) } },
)
<span class="hljs-keyword">const</span> score = <span class="hljs-keyword">await</span> res.<span class="hljs-title function_">json</span>()
<span class="hljs-comment">// score.risk_level === "CRITICAL", score.detection_count === 64</span>
<span class="hljs-comment">// score.detections[i].detector_name === "ADDRESS_POISONING_RECEIVED" ...</span></code></pre><h2 id="h-the-full-menu-six-x402-native-endpoints" class="text-3xl font-header !mt-8 !mb-4 first:!mt-0 first:!mb-0">The full menu (six x402-native endpoints)</h2><ul><li><p><strong>GET /api/v1/x402/address/{address}/risk-score</strong> — $0.008 USDC. AML risk score + detections + ML anomaly. 8 chains live + BSC coming soon.</p></li><li><p><strong>GET /api/v1/x402/address/{address}/sanctions</strong> — $0.003. OFAC / FATF / JFSA / ScamDB cross-reference.</p></li><li><p><strong>GET /api/v1/x402/tx/{tx_hash}/trace</strong> — $0.015. Fund-flow tracing with ML anomaly detection.</p></li><li><p><strong>GET /api/v1/x402/tx/{tx_hash}/coinjoin</strong> — $0.01. CoinJoin / mixing / tumbling detection on Bitcoin.</p></li><li><p><strong>GET /api/v1/x402/wallet/{address}/cluster</strong> — $0.02. Neo4j graph clustering / entity resolution.</p></li><li><p><strong>POST /api/v1/x402/batch/screening</strong> — $0.05. Batch AML screening across up to 50 addresses.</p></li></ul><h2 id="h-the-bigger-picture" class="text-3xl font-header !mt-8 !mb-4 first:!mt-0 first:!mb-0">The bigger picture</h2><p>With this in place, an AI agent can run an AML check on a counterparty wallet, evaluate the result, and decide on-chain whether to send funds — entirely without human intervention. Compliance and fraud detection move from &quot;a human looking at a dashboard&quot; to &quot;an agent verifying autonomously.&quot; That&apos;s a meaningful step.</p><p>As far as we can tell, <strong>ChainAnalyzer is the first production AML API to clear a real mainnet settlement under the x402 v2 spec</strong> on Coinbase Bazaar. Auto-indexing on agentic.market should land within 24-48 hours of the first settlement.</p><h2 id="h-links" class="text-3xl font-header !mt-8 !mb-4 first:!mt-0 first:!mb-0">Links</h2><ul><li><p><strong>x402 Live Demo</strong> — settle directly from the browser via Phantom</p></li><li><p>x402 Service Manifest (the JSON Bazaar reads)</p></li><li><p>x402 Discovery Endpoint (all priced routes)</p></li><li><p><a target="_blank" rel="noopener" class="dont-break-out" href="https://www.x402.org/">x402 Protocol</a></p></li><li><p><a target="_blank" rel="noopener" class="dont-break-out" href="https://docs.cdp.coinbase.com/x402/welcome">Coinbase CDP x402 Docs</a></p></li><li><p><a target="_blank" rel="noopener" class="dont-break-out" href="https://www.npmjs.com/package/chainanalyzer-mcp">ChainAnalyzer MCP server (npm)</a></p></li></ul>]]></content:encoded>
            <author>chainanalyzer@newsletter.paragraph.com (ChainAnalyzer)</author>
            <enclosure url="https://img.paragraph.com/cdn-cgi/image/format=auto/https://storage.googleapis.com/papyrus_images/f00bf5a712cc6a3f8b76ccc0bcd2c9be64fd0889ccd003337a3dbd0b3ba5b46a.png" length="0" type="image/png"/>
        </item>
        <item>
            <title><![CDATA[Shipping x402 USDC Payments to Base + Solana Mainnet for an MCP Server]]></title>
            <link>https://paragraph.com/@chainanalyzer/x402-usdc-mcp-server-mainnet</link>
            <guid>rLeq7ZTUPJ1fGtEGlAsA</guid>
            <pubDate>Sun, 26 Apr 2026 08:22:23 GMT</pubDate>
            <description><![CDATA[Three milestones in five days: awesome-mcp-servers merge, Glama AAA, and x402 USDC mainnet on Base + Solana. A field report on shipping for AI agents.]]></description>
            <content:encoded><![CDATA[<p>Last week, ChainAnalyzer (a multi-chain blockchain AML platform) crossed<br>three milestones in five days:</p><ul><li><p><span data-name="check_mark_button" class="emoji" data-type="emoji">✅</span> Merged into <a target="_blank" rel="noopener noreferrer nofollow ugc" class="dont-break-out" href="https://github.com/punkpeye/awesome-mcp-servers">awesome-mcp-servers</a></p></li><li><p><span data-name="check_mark_button" class="emoji" data-type="emoji">✅</span> Earned a <strong>AAA score</strong> on <a target="_blank" rel="noopener noreferrer nofollow ugc" class="dont-break-out" href="https://glama.ai/mcp/servers/rascal-3/chainanalyzer-mcp">Glama MCP Directory</a></p></li><li><p><span data-name="check_mark_button" class="emoji" data-type="emoji">✅</span> Switched x402 from testnet to <strong>Base + Solana mainnet</strong> via the<br>Coinbase CDP Facilitator</p></li></ul><p>This post is a brain-dump of how each piece fits together for anyone building an MCP server with native crypto micropayments.</p><hr><h2 id="h-what-is-x402" class="text-3xl font-header !mt-8 !mb-4 first:!mt-0 first:!mb-0">What is x402?</h2><p>x402 is an HTTP 402 micropayment protocol from Coinbase. The flow:</p><ol><li><p>Client calls a paid endpoint without payment headers</p></li><li><p>Server returns <code>HTTP 402 Payment Required</code> with a JSON body listing<br>accepted networks, prices, and recipient addresses</p></li><li><p>Client signs a USDC transfer matching one of the requirements</p></li><li><p>Client retries with <code>X-PAYMENT: &lt;signed payload&gt;</code> header</p></li><li><p>Server verifies via the <em>facilitator</em> and returns 200 with the result</p></li></ol><p>This makes per-request billing trivial for AI agents — no API key<br>provisioning, no subscription forms.</p><h2 id="h-what-is-mcp" class="text-3xl font-header !mt-8 !mb-4 first:!mt-0 first:!mb-0">What is MCP?</h2><p><a target="_blank" rel="noopener noreferrer nofollow ugc" class="dont-break-out" href="https://modelcontextprotocol.io">Model Context Protocol</a> is Anthropic's<br>standard for letting LLMs call tools. Any MCP-compatible client (Claude<br>Desktop, Claude Code, ChatGPT, Cursor, Cline, Windsurf) can use any MCP<br>server through a single config file.</p><h2 id="h-combining-the-two" class="text-3xl font-header !mt-8 !mb-4 first:!mt-0 first:!mb-0">Combining the two</h2><p>Our <code>chainanalyzer-mcp</code> package wraps six tools:</p><table><colgroup><col><col></colgroup><tbody><tr><th colspan="1" rowspan="1"><p>Tool</p></th><th colspan="1" rowspan="1"><p>Price (USDC)</p></th></tr><tr><td colspan="1" rowspan="1"><p><code>check_address_risk</code></p></td><td colspan="1" rowspan="1"><p>$0.008</p></td></tr><tr><td colspan="1" rowspan="1"><p><code>sanctions_check</code></p></td><td colspan="1" rowspan="1"><p>$0.003</p></td></tr><tr><td colspan="1" rowspan="1"><p><code>trace_transaction</code></p></td><td colspan="1" rowspan="1"><p>$0.015</p></td></tr><tr><td colspan="1" rowspan="1"><p><code>detect_coinjoin</code></p></td><td colspan="1" rowspan="1"><p>$0.01</p></td></tr><tr><td colspan="1" rowspan="1"><p><code>cluster_wallet</code></p></td><td colspan="1" rowspan="1"><p>$0.02</p></td></tr><tr><td colspan="1" rowspan="1"><p><code>batch_screening</code></p></td><td colspan="1" rowspan="1"><p>$0.05</p></td></tr></tbody></table><p>Install:</p><pre data-type="codeBlock" text="npx -y chainanalyzer-mcp
"><code>npx <span class="hljs-operator">-</span>y chainanalyzer<span class="hljs-operator">-</span>mcp
</code></pre><p>Or add to <code>claude_desktop_config.json</code>:</p><pre data-type="codeBlock" text="{
  &quot;mcpServers&quot;: {
    &quot;chainanalyzer&quot;: {
      &quot;command&quot;: &quot;npx&quot;,
      &quot;args&quot;: [&quot;-y&quot;, &quot;chainanalyzer-mcp&quot;],
      &quot;env&quot;: {
        &quot;X402_WALLET_PRIVATE_KEY&quot;: &quot;0x...&quot;
      }
    }
  }
}
"><code><span class="hljs-punctuation">{</span>
  <span class="hljs-attr">"mcpServers"</span><span class="hljs-punctuation">:</span> <span class="hljs-punctuation">{</span>
    <span class="hljs-attr">"chainanalyzer"</span><span class="hljs-punctuation">:</span> <span class="hljs-punctuation">{</span>
      <span class="hljs-attr">"command"</span><span class="hljs-punctuation">:</span> <span class="hljs-string">"npx"</span><span class="hljs-punctuation">,</span>
      <span class="hljs-attr">"args"</span><span class="hljs-punctuation">:</span> <span class="hljs-punctuation">[</span><span class="hljs-string">"-y"</span><span class="hljs-punctuation">,</span> <span class="hljs-string">"chainanalyzer-mcp"</span><span class="hljs-punctuation">]</span><span class="hljs-punctuation">,</span>
      <span class="hljs-attr">"env"</span><span class="hljs-punctuation">:</span> <span class="hljs-punctuation">{</span>
        <span class="hljs-attr">"X402_WALLET_PRIVATE_KEY"</span><span class="hljs-punctuation">:</span> <span class="hljs-string">"0x..."</span>
      <span class="hljs-punctuation">}</span>
    <span class="hljs-punctuation">}</span>
  <span class="hljs-punctuation">}</span>
<span class="hljs-punctuation">}</span>
</code></pre><p>The <code>X402_WALLET_PRIVATE_KEY</code> is your <em>spender</em> wallet — the agent uses<br>it to sign USDC transfers. If you'd rather pay by subscription, set <code>CHAINANALYZER_API_KEY=tfk_...</code> instead.</p><hr><h2 id="h-server-side-x402-on-fastapi" class="text-3xl font-header !mt-8 !mb-4 first:!mt-0 first:!mb-0">Server-side: x402 on FastAPI</h2><p>We use a custom middleware (intentionally — we wanted full control over<br>the Bazaar metadata + bilingual error responses). The core verification flow:</p><pre data-type="codeBlock" text="async def _verify_payment(payment: str, config: dict) -&gt; bool:
    auth_token = _generate_cdp_jwt(
        method=&quot;POST&quot;,
        host=&quot;api.cdp.coinbase.com&quot;,
        path=&quot;/platform/v2/x402/verify&quot;,
    )
    headers = {&quot;Content-Type&quot;: &quot;application/json&quot;}
    if auth_token:
        headers[&quot;Authorization&quot;] = f&quot;Bearer {auth_token}&quot;

    async with httpx.AsyncClient() as client:
        resp = await client.post(
            f&quot;{FACILITATOR_URL}/verify&quot;,
            headers=headers,
            json={&quot;payment&quot;: payment, &quot;requirements&quot;: {...}},
        )
        return resp.json().get(&quot;valid&quot;, False)
"><code>async def _verify_payment(payment: str, config: dict) <span class="hljs-operator">-</span><span class="hljs-operator">&gt;</span> <span class="hljs-keyword">bool</span>:
    auth_token <span class="hljs-operator">=</span> _generate_cdp_jwt(
        method<span class="hljs-operator">=</span><span class="hljs-string">"POST"</span>,
        host<span class="hljs-operator">=</span><span class="hljs-string">"api.cdp.coinbase.com"</span>,
        path<span class="hljs-operator">=</span><span class="hljs-string">"/platform/v2/x402/verify"</span>,
    )
    headers <span class="hljs-operator">=</span> {<span class="hljs-string">"Content-Type"</span>: <span class="hljs-string">"application/json"</span>}
    <span class="hljs-keyword">if</span> auth_token:
        headers[<span class="hljs-string">"Authorization"</span>] <span class="hljs-operator">=</span> f<span class="hljs-string">"Bearer {auth_token}"</span>

    async with httpx.AsyncClient() <span class="hljs-keyword">as</span> client:
        resp <span class="hljs-operator">=</span> await client.post(
            f<span class="hljs-string">"{FACILITATOR_URL}/verify"</span>,
            headers<span class="hljs-operator">=</span>headers,
            json<span class="hljs-operator">=</span>{<span class="hljs-string">"payment"</span>: payment, <span class="hljs-string">"requirements"</span>: {...}},
        )
        <span class="hljs-keyword">return</span> resp.json().get(<span class="hljs-string">"valid"</span>, False)
</code></pre><p>The CDP facilitator wants an Ed25519 JWT signed with the API key from<br>the <a target="_blank" rel="noopener noreferrer nofollow ugc" class="dont-break-out" href="https://portal.cdp.coinbase.com">CDP portal</a>. The portal hands you<br>a base64-encoded private key — sign with <code>cryptography</code> + <code>PyJWT</code>:</p><pre data-type="codeBlock" text="import base64, time, uuid, jwt
from cryptography.hazmat.primitives.asymmetric.ed25519 import Ed25519PrivateKey

def _generate_cdp_jwt(method, host, path):
    seed = base64.b64decode(CDP_API_KEY_SECRET)[:32]
    sk = Ed25519PrivateKey.from_private_bytes(seed)
    now = int(time.time())
    return jwt.encode(
        {
            &quot;iss&quot;: &quot;cdp&quot;,
            &quot;sub&quot;: CDP_API_KEY_ID,
            &quot;nbf&quot;: now,
            &quot;exp&quot;: now + 120,
            &quot;uri&quot;: f&quot;{method.upper()} {host}{path}&quot;,
        },
        sk,
        algorithm=&quot;EdDSA&quot;,
        headers={&quot;kid&quot;: CDP_API_KEY_ID, &quot;nonce&quot;: uuid.uuid4().hex},
    )
"><code><span class="hljs-keyword">import</span> <span class="hljs-title">base64</span>, <span class="hljs-title">time</span>, <span class="hljs-title">uuid</span>, <span class="hljs-title">jwt</span>
<span class="hljs-title"><span class="hljs-keyword">from</span></span> <span class="hljs-title">cryptography</span>.<span class="hljs-title">hazmat</span>.<span class="hljs-title">primitives</span>.<span class="hljs-title">asymmetric</span>.<span class="hljs-title">ed25519</span> <span class="hljs-title"><span class="hljs-keyword">import</span></span> <span class="hljs-title">Ed25519PrivateKey</span>

<span class="hljs-title">def</span> <span class="hljs-title">_generate_cdp_jwt</span>(<span class="hljs-title">method</span>, <span class="hljs-title">host</span>, <span class="hljs-title">path</span>):
    <span class="hljs-title">seed</span> <span class="hljs-operator">=</span> <span class="hljs-title">base64</span>.<span class="hljs-title">b64decode</span>(<span class="hljs-title">CDP_API_KEY_SECRET</span>)[:32]
    <span class="hljs-title">sk</span> <span class="hljs-operator">=</span> <span class="hljs-title">Ed25519PrivateKey</span>.<span class="hljs-title">from_private_bytes</span>(<span class="hljs-title">seed</span>)
    <span class="hljs-title"><span class="hljs-built_in">now</span></span> <span class="hljs-operator">=</span> <span class="hljs-title"><span class="hljs-keyword">int</span></span>(<span class="hljs-title">time</span>.<span class="hljs-title">time</span>())
    <span class="hljs-title"><span class="hljs-keyword">return</span></span> <span class="hljs-title">jwt</span>.<span class="hljs-title">encode</span>(
        {
            <span class="hljs-string">"iss"</span>: <span class="hljs-string">"cdp"</span>,
            <span class="hljs-string">"sub"</span>: <span class="hljs-title">CDP_API_KEY_ID</span>,
            <span class="hljs-string">"nbf"</span>: <span class="hljs-title"><span class="hljs-built_in">now</span></span>,
            <span class="hljs-string">"exp"</span>: <span class="hljs-title"><span class="hljs-built_in">now</span></span> <span class="hljs-operator">+</span> 120,
            <span class="hljs-string">"uri"</span>: <span class="hljs-title">f</span><span class="hljs-string">"{method.upper()} {host}{path}"</span>,
        },
        <span class="hljs-title">sk</span>,
        <span class="hljs-title">algorithm</span><span class="hljs-operator">=</span><span class="hljs-string">"EdDSA"</span>,
        <span class="hljs-title">headers</span><span class="hljs-operator">=</span>{<span class="hljs-string">"kid"</span>: <span class="hljs-title">CDP_API_KEY_ID</span>, <span class="hljs-string">"nonce"</span>: <span class="hljs-title">uuid</span>.<span class="hljs-title">uuid4</span>().<span class="hljs-title">hex</span>},
    )
</code></pre><p>That's all. Mainnet billing is now live.</p><hr><h2 id="h-bazaar-agenticmarket-auto-discovery" class="text-3xl font-header !mt-8 !mb-4 first:!mt-0 first:!mb-0">Bazaar / Agentic.Market auto-discovery</h2><p>Coinbase's Bazaar crawler picks up x402 services automatically if your 402 response and <code>/services.json</code> manifest carry the right metadata:</p><pre data-type="codeBlock" text="ROUTE_CONFIG = {
    &quot;GET /api/v1/x402/address/*/risk-score&quot;: {
        &quot;price&quot;: &quot;$0.008&quot;,
        &quot;description&quot;: &quot;AML risk score (5 chains, 76+ detectors)&quot;,
        &quot;bazaar&quot;: {
            &quot;discoverable&quot;: True,
            &quot;category&quot;: &quot;data&quot;,
            &quot;tags&quot;: [&quot;aml&quot;, &quot;compliance&quot;, &quot;risk-score&quot;, &quot;blockchain&quot;],
        },
    },
    # ... 5 more routes
}
"><code>ROUTE_CONFIG <span class="hljs-operator">=</span> {
    <span class="hljs-string">"GET /api/v1/x402/address/*/risk-score"</span>: {
        <span class="hljs-string">"price"</span>: <span class="hljs-string">"$0.008"</span>,
        <span class="hljs-string">"description"</span>: <span class="hljs-string">"AML risk score (5 chains, 76+ detectors)"</span>,
        <span class="hljs-string">"bazaar"</span>: {
            <span class="hljs-string">"discoverable"</span>: True,
            <span class="hljs-string">"category"</span>: <span class="hljs-string">"data"</span>,
            <span class="hljs-string">"tags"</span>: [<span class="hljs-string">"aml"</span>, <span class="hljs-string">"compliance"</span>, <span class="hljs-string">"risk-score"</span>, <span class="hljs-string">"blockchain"</span>],
        },
    },
    # ... <span class="hljs-number">5</span> more routes
}
</code></pre><p>Then expose <code>services.json</code>:</p><pre data-type="codeBlock" text="@router.get(&quot;/services.json&quot;)
async def x402_services_manifest():
    return {
        &quot;id&quot;: &quot;chainanalyzer&quot;,
        &quot;name&quot;: &quot;ChainAnalyzer AML API&quot;,
        &quot;category&quot;: &quot;data&quot;,
        &quot;x402Version&quot;: 2,
        &quot;networks&quot;: [&quot;base&quot;, &quot;solana&quot;],
        &quot;endpoints&quot;: [...],
    }
"><code>@router.<span class="hljs-keyword">get</span>(<span class="hljs-string">"/services.json"</span>)
<span class="hljs-function"><span class="hljs-keyword">async</span> def <span class="hljs-title">x402_services_manifest</span>():
    <span class="hljs-keyword">return</span></span> {
        <span class="hljs-string">"id"</span>: <span class="hljs-string">"chainanalyzer"</span>,
        <span class="hljs-string">"name"</span>: <span class="hljs-string">"ChainAnalyzer AML API"</span>,
        <span class="hljs-string">"category"</span>: <span class="hljs-string">"data"</span>,
        <span class="hljs-string">"x402Version"</span>: <span class="hljs-number">2</span>,
        <span class="hljs-string">"networks"</span>: [<span class="hljs-string">"base"</span>, <span class="hljs-string">"solana"</span>],
        <span class="hljs-string">"endpoints"</span>: [...],
    }
</code></pre><p>Bazaar requests this manifest with an empty body, validates the 402<br>response shape, and indexes the service. End users then find your API<br>on agentic.market without you submitting anything by hand.</p><hr><h2 id="h-discoverability-checklist" class="text-3xl font-header !mt-8 !mb-4 first:!mt-0 first:!mb-0">Discoverability checklist</h2><p>If you're building an MCP server that wants to be findable by agents<br><em>and</em> humans, here's what we did (most of it transferable to any service):</p><ol><li><p><code>/llms.txt</code> <strong>+</strong> <code>/llms-full.txt</code> — the <a target="_blank" rel="noopener noreferrer nofollow ugc" class="dont-break-out" href="https://llmstxt.org">llmstxt.org</a><br>convention. AI crawlers (Claude, GPT, Mistral, Perplexity) pick this<br>up to summarize your product.</p></li><li><p><code>/.well-known/ai-plugin.json</code> — older but ChatGPT custom GPTs<br>still read it.</p></li><li><p><code>robots.txt</code> — explicit <code>Allow:</code> for <code>GPTBot</code>, <code>ClaudeBot</code>,<br><code>PerplexityBot</code>, <code>Google-Extended</code>, <code>Applebot-Extended</code>. Don't rely<br>on <code>User-agent: *</code>.</p></li><li><p><strong>JSON-LD</strong> <code>Service</code> <strong>/</strong> <code>SoftwareApplication</code> schema on key pages —<br>AI Overview / Bing Copilot read these.</p></li><li><p><strong>IndexNow API</strong> — pings Bing/Yandex/Naver/Seznam in one HTTP call.<br>Google ignores it but the cascade picks up.</p></li><li><p><strong>awesome-* GitHub lists</strong> — submit a PR. Surprisingly high CTR.</p></li><li><p><strong>Glama MCP Directory</strong> — submit your MCP server, then add a<br><code>Dockerfile</code> to score AAA on security/license/quality.</p></li><li><p><strong>MCP Registry</strong> — official registry at registry.modelcontextprotocol.io.<br>Submit <code>mcp.json</code> via PR.</p></li></ol><hr><h2 id="h-whats-next" class="text-3xl font-header !mt-8 !mb-4 first:!mt-0 first:!mb-0">What's next</h2><p>We're investigating Stripe's <a target="_blank" rel="noopener noreferrer nofollow ugc" class="dont-break-out" href="https://docs.stripe.com/payments/machine/mpp">Machine Payments Protocol</a><br>as a parallel rail (cards via Shared Payment Token + Tempo crypto), so<br>customers without a crypto wallet can still pay per request.</p><p>If you're shipping an MCP server and want to compare notes — drop a<br>comment or hit me on <a target="_blank" rel="noopener noreferrer nofollow ugc" class="dont-break-out" href="https://www.linkedin.com/posts/kenzo-arai-d_mcp-server-launched-call-chainanalyzer-share-7451274705354907648-dmF7?utm_source=share&amp;utm_medium=member_desktop&amp;rcm=ACoAACH0GxIBTlmp61nI3EaRcOYEmeekwneTQ4g">LinkedIn</a>.</p><hr><p><em>Originally posted at</em> <a target="_blank" rel="noopener noreferrer nofollow ugc" class="dont-break-out" href="https://chain-analyzer.com/news/mcp-server-launched"><em>chain-analyzer.com</em></a><em>.</em></p>]]></content:encoded>
            <author>chainanalyzer@newsletter.paragraph.com (ChainAnalyzer)</author>
            <category>mcp</category>
            <category>web3</category>
            <category>ai-agents</category>
            <category>x402</category>
            <category>blockchain</category>
            <category>coinbase</category>
            <category>solana</category>
            <enclosure url="https://img.paragraph.com/cdn-cgi/image/format=auto/https://storage.googleapis.com/papyrus_images/fd643267e5d1a39e2154a402eeccd616ddd5a778b54f85d4673ef17747a84265.jpg" length="0" type="image/jpg"/>
        </item>
    </channel>
</rss>