2026年4月28日

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

2026-04-28、ChainAnalyzer は Coinbase x402 Bazaar 上で初の本番 mainnet settlement を成立させました。AI エージェントが $0.008 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-KeyContent-Type しか forward していなかったこと。X-PAYMENTPAYMENT-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": "$0.008",
#       "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 $0.008 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 $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(
  "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 — $0.008 USDC、AML リスク スコア + 検知 + ML 異常スコア (8 chain live + BSC coming soon)
  • GET /api/v1/x402/address/{address}/sanctions — $0.003、OFAC / FATF / JFSA / ScamDB 横断
  • GET /api/v1/x402/tx/{tx_hash}/trace — $0.015、資金フロー追跡 + ML 異常検知
  • GET /api/v1/x402/tx/{tx_hash}/coinjoin — $0.01、Bitcoin の CoinJoin / mixing 検出
  • GET /api/v1/x402/wallet/{address}/cluster — $0.02、Neo4j グラフ クラスタリング
  • POST /api/v1/x402/batch/screening — $0.05、最大 50 アドレスの一括 AML スクリーニング

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

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

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

リンク

© 2026 ChainAnalyzer. All rights reserved.