2026年4月28日

AIエージェントが1コール$1.00 USDCで叩くAML APIをCoinbase x402 Bazaarに出した話

2026-04-28、ChainAnalyzerは Coinbase x402 Bazaar 上で初の本番mainnet settlementを成立させました。AIエージェントが $1.00 USDC をBase上で自律支払いし、Tornado Cashのアドレスに対して 76+ ルール × ML × Neo4jグラフを走らせた結果、CRITICALリスク・64件の検知を30秒以内に取得しました。アカウント不要、APIキー不要、すべてon-chainでsettle済み。

ハイライト

  • x402 v2 spec完全準拠 — verify + settleの両方が実mainnetで稼働。EIP-3009 transferWithAuthorization + Coinbase CDP facilitator経由
  • Coinbase Bazaar自動indexing — submission不要、最初のsuccessful settlementがcatalog作成のトリガー
  • Tornado CashデモでCRITICAL判定 — 64件の検知(Address Poisoning, Peel Chain, Fake Token URL Phishing, Sybil Aggregation, Token Relay)
  • 9チェーン横断 — Bitcoin, Ethereum, Polygon, Arbitrum, Optimism, Base, Avalanche, Solana。Bitcoin対応は本領域では珍しい
  • サブスク不要 — AIエージェントはUSDCを持っていれば fetch() 1行でAMLスキャンを呼べる

なぜx402がAIエージェント時代に効くのか

既存のAPIビジネスモデルは「アカウント作成 → APIキー発行 → サブスク決済」の3段階を前提にしています。AIエージェントにとってこれは致命的な摩擦です — エージェントは自律的に意思決定したいのに、人間がアカウントを作りキーを発行する間、行動できない。

x402 はHTTP 402 (Payment Required)を「実際に動く」状態にするプロトコルです。サーバーは支払い要件を402レスポンスで返し、クライアントはUSDC署名を X-PAYMENT ヘッダに付けて再リクエスト。CoinbaseのCDP facilitatorがverify + settleをon-chainで実行し、サーバーは支払い確定後にレスポンスを返します。

結果として、ウォレットを持つAIエージェントはChainAnalyzerのAML機能をその場で1リクエスト単位で利用可能です。サブスク契約もAPIキー管理も不要。Coinbase Bazaar / Agentic.Market はこの仕組みでカタログ化されたAPIをAIエージェントが発見・比較・呼び出しするマーケットプレイスです。

実装で躓いた5箇所

x402 v2 specは新しく、自前で書こうとすると複数の落とし穴があります。実際にハマって直した箇所を共有します。

1. Verifyのwire formatが完全に違う

最初の自前実装は {"payment": "<base64>", "requirements": {scheme, price}} をfacilitatorにPOSTしていました。これはv2 specとは何の関係もない形です。正しい形は次の通り:

{
  "x402Version": 2,
  "paymentPayload": {
    "x402Version": 2,
    "payload": { "signature": "0x...", "authorization": { ... } },
    "accepted": {
      "scheme": "exact",
      "network": "eip155:8453",
      "asset": "0x833589fCD6eDb6E08f4c7C32D4f71b54bdA02913",
      "amount": "8000",
      "payTo": "0xe8e26183...708959",
      "maxTimeoutSeconds": 60,
      "extra": { "name": "USD Coin", "version": "2" }
    },
    "resource": { "url": "...", "description": "...", "mimeType": "application/json" }
  },
  "paymentRequirements": {
    "scheme": "exact",
    "network": "eip155:8453",
    "asset": "0x833589fCD6eDb6E08f4c7C32D4f71b54bdA02913",
    "amount": "8000",
    "payTo": "0xe8e26183...708959",
    "maxTimeoutSeconds": 60
  }
}

キモは paymentPayload.accepted — クライアントが「自分はこの要件にコミットして署名した」というエコーバック。これがないとfacilitatorは署名をnetwork / asset / payToに紐付けて検証できません。

2. Settle関数が実装されていなかった

Verifyは「署名が正しいか」を確認するだけで、USDCを実際に動かすのは /settle エンドポイントへの2度目のPOSTです。最初の実装はverifyだけ呼んで「成功」とみなしていたため、USDCは一切移動していない状態でAPIレスポンスを返していました。Coinbase公式 x402 Pythonライブラリの HTTPFacilitatorClient に置き換え、verify → handler → settleの3段フローに修正。

3. SvelteKitプロキシがX-PAYMENTヘッダを落としていた

フロントから /api/v1/x402/... に投げるとHTTP 402が永久に返ってきました。原因はSvelteKit catch-all proxyが X-API-Key と Content-Type しかforwardしていなかったこと。X-PAYMENT と PAYMENT-SIGNATURE をforwardするよう明示追加が必要。

4. esm.shのtransitive dep地獄

最初はブラウザ デモで x402-fetch をesm.shからCDNロードしようとしましたが、x402-fetch@1.2.0 は内部で @solana/rpc-parsed-types@5.5.1 をimportしていて、そのサブパスがesm.shに存在せずtext/plain 404を返してきます。Firefoxは「MIME type not allowed」と表示。解決策はviemの signTypedData_v4 だけでEIP-3009を自前署名すること — 50行で済みました。

5. Self-transfer (from == payTo)でfacilitatorが黙ってreject

最初のテストでPhantomがtreasuryと同じウォレットに繋がっていて、transferWithAuthorization(from=A, to=A, value=8000) を署名していました。Facilitatorは「technically正しい署名だが意味のないtransfer」としてreject、invalid_reason も詳細を返してくれません。クライアント側でfrom != payToをassertするガードを入れるとdebugが一気に楽になります。

動いている結果 — Tornado Cashで64検知

動作確認用にTornado Cashの0.1 ETHプール(0x0000db5c8b...e70000)を叩いた結果:

  • risk_level: CRITICAL
  • detection_count: 64
  • ml_anomaly_score: 0.4381 (MLアンサンブル, IF + AutoEncoder + GraphSAGE)
  • 主な検知: Address Poisoning Received (E6), Peel Chain (E8)を30+ 件、Fake Token URL Phishing (E16) 13件, Sybil Aggregation (E12), Token Relay Chain (E15)
  • scan_duration_ms: ~30秒(9チェーンのheuristic + ML + Neo4jを全部走らせて)

支払いはon-chainに確定 — 受取アドレス chainanalyzer.eth (0xe8e26183...708959)に +0.008 USDC のtransferがBasescanで確認できます。

使ってみる

402を試す(支払い無しで価格表だけ取る)

curl -i https://chain-analyzer.com/api/v1/x402/address/0x0000db5c8b030ae20308ac975898e09741e70000/risk-score?chain=ethereum
# HTTP/2 402 Payment Required
# {
#   "x402Version": 2,
#   "accepts": [
#     {
#       "scheme": "exact",
#       "network": "eip155:8453",
#       "price": "$1.00",
#       "payTo": "0xe8e26183...708959",
#       "asset": {
#         "address": "0x833589fCD6eDb6E08f4c7C32D4f71b54bdA02913",
#         "decimals": 6,
#         "eip712": { "name": "USD Coin", "version": "2" }
#       }
#     },
#     { "scheme": "exact", "network": "solana:5eykt4Us...", ... }
#   ],
#   "extensions": { "bazaar": { "discoverable": true, ... } }
# }

Phantomで実際に支払う(ブラウザ、コード不要)

chain-analyzer.com/x402-demo.html を開いてPhantom (Base有効化済み)を接続、「Pay $1.00 USDC and scan」をクリック。EIP-3009のsignプロンプトが出て、~30秒でrisk-score JSONが返ります。Solanaも同様にサポート。

AIエージェントから呼ぶ(TypeScript)

import { createWalletClient, custom } from "viem"
import { base } from "viem/chains"

// 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 $1.00 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(
  "https://chain-analyzer.com/api/v1/x402/address/" +
    "0x0000db5c8b030ae20308ac975898e09741e70000/risk-score?chain=ethereum",
  { headers: { "X-PAYMENT": buildPayment(account, /* ... */) } },
)
const score = await res.json()
// score.risk_level === "CRITICAL", score.detection_count === 64
// score.detections[i].detector_name === "ADDRESS_POISONING_RECEIVED" ...

提供エンドポイント(全6種、すべてx402ネイティブ)

  • GET /api/v1/x402/address/{address}/risk-score — $1.00 USDC、AMLリスク スコア + 検知 + ML異常スコア(8 chain live + BSC coming soon)
  • GET /api/v1/x402/address/{address}/sanctions — $0.50、OFAC / FATF / JFSA / ScamDB横断
  • GET /api/v1/x402/tx/{tx_hash}/trace — $3.00、資金フロー追跡 + ML異常検知
  • GET /api/v1/x402/tx/{tx_hash}/coinjoin — $1.00、BitcoinのCoinJoin / mixing検出
  • GET /api/v1/x402/wallet/{address}/cluster — $2.50、Neo4jグラフ クラスタリング
  • POST /api/v1/x402/batch/screening — $5.00、最大50アドレスの一括AMLスクリーニング

大局: AIエージェントが自律的にAMLできる時代へ

これで「AIエージェントが取引相手のウォレットを自分でAMLスクリーニングし、その結果に基づいてオンチェーンで意思決定する」という工程が、人間の介在なしに完結します。コンプライアンスやfraud detectionが「人間がダッシュボードを見る」工程から「エージェントが自律検証する」工程に移行する分水嶺です。

ChainAnalyzerはx402 v2 specに準拠した本番AML APIとして、おそらく業界初の実mainnet settlementを成立させた事例になります。Coinbase Bazaarの自動indexingは今後24-48時間以内に反映予定。

リンク

このページをシェア

X Facebook LinkedIn

© 2026 ChainAnalyzer. All rights reserved.