x402 で、料金を払って最初のリクエストを送る

Solana のリクエストを 1 つ例に、x402 で料金を確かめ、払い、RPC の結果と決済結果を受け取るまでを順に追います。他の 15 のチェーンも、それぞれのパスで同じ手順です。
用意するのは、Solana 上の USDC、または Base 上の USDC か EURC が入ったウォレットと、x402 のクライアントです。x402 のクライアントは、402 のレスポンスを読み、ウォレットで支払いに署名して、リクエストを送り直すソフトウェアです。クライアントについては、x402.org のドキュメントをご覧ください。

1. リクエストを送る

まず、支払いペイロードを付けずに RPC のリクエストを送ります。
bash
curl -i https://x402.erpc.global/v1/solana-mainnet \
  --header 'Content-Type: application/json' \
  --data '{"jsonrpc":"2.0","id":1,"method":"getSlot"}'
402 Payment Required が返ります。ヘッダーには、メソッドと料金が入っています。
http
HTTP/2 402
x-payment-required: eyJ4NDAyVmVyc2lvbiI6Mi…
x-rpc-methods: getSlot
x-rpc-weight: 1000
x-rpc-price-usd: 0.001
レスポンスボディの accepts には、支払いに使えるステーブルコインごとに支払い方法が並びます。amount はステーブルコインの最小単位で数えた額で、1000 は 0.001 USDC(EURC なら 0.001 EURC)です。
json
{
  "error": { "code": "payment_required", "message": "Payment required", "request_id": "…" },
  "x402Version": 2,
  "accepts": [
    { "scheme": "exact", "network": "solana:5eykt4UsFv8P8NJdTREpY1vzqKqZKvdp", "amount": "1000", "asset": "EPjFWdd5AufqSSqeM2qN1xzybapC8G4wEGGkZwyTDt1v", … },
    { "scheme": "exact", "network": "eip155:8453", "amount": "1000", "asset": "0x833589fCD6eDb6E08f4c7C32D4f71b54bdA02913", … },
    { "scheme": "exact", "network": "eip155:8453", "amount": "1000", "asset": "0x60a3E35Cc302bFA44Cb288Bc5a4F316Fdb1adb42", … }
  ],
  "pricing": { "methods": ["getSlot"], …, "weight": 1000, "rawWeight": 42, …, "price": "$0.001", … },
  …
}

2. x402 のクライアントで払う

402 のレスポンスを x402 のクライアントに渡します。クライアントは、ウォレットで払える支払い方法を選んで、その金額の支払いに署名し、X-Payment ヘッダーに入れる値にエンコードします。ネットワーク手数料のための SOL や ETH は要りません。

3. 支払いペイロードを付けて、もう一度送る

同じリクエストボディを、X-Payment ヘッダーに支払いペイロードを入れて、もう一度送ります。
bash
curl -i https://x402.erpc.global/v1/solana-mainnet \
  --header 'Content-Type: application/json' \
  --header 'X-Payment: <PAYMENT_PAYLOAD>' \
  --data '{"jsonrpc":"2.0","id":1,"method":"getSlot"}'
リクエストボディは変えずに送ってください。料金はリクエストボディで決まるので、変えたことで料金が変わると、支払いの金額と合わずに price_mismatch が返ります。
支払いの検証と決済が済むと、RPC の結果が返ります。決済結果は X-Payment-Response ヘッダーに入ります。
http
HTTP/2 200
x-payment-response: <RECEIPT>
json
{ "jsonrpc": "2.0", "id": 1, "result": … }
1 つの支払いペイロードで払えるのは、1 つのリクエストだけです。同じ支払いペイロードをもう一度送ると、402 payment_invalid か 409 duplicate_payment が返り、リクエストがもう一度チェーンへ送られることはありません。

レスポンス

支払いを求める前にエラーを返したリクエストには、料金はかかりません。
ステータスerror.code何が起きたか
402payment_required支払いペイロードが付いていません。レスポンスボディに料金と支払い方法が入っています。
402payment_invalid支払いペイロードが検証を通りませんでした。新しい支払いに署名して、もう一度送ってください。
402price_mismatch支払いペイロードが、このリクエストの 402 が示した支払い方法(料金など)と合いません。
402payment_amount_too_low金額が、x402.erpc.global が決済する最小の金額を下回っています。
402settlement_failed決済が失敗したと報告されました。レスポンスには、支払い方法が改めて入っています。
409duplicate_paymentこの支払いペイロードは、すでに使われています。
400method_not_supported、invalid_requestそのパスでは提供していないメソッドか、受け付けないリクエストボディです。料金はかかりません。
413batch_too_largeバッチが 100 件を超えています。料金はかかりません。
500configuration_errorそのパスが、いまリクエストを受けられません。料金はかかりません。
503payment_unavailableいまは支払い方法を示せません。料金はかかっていません。Retry-After の秒数の後に送り直してください。
503service_busy同時のリクエストが多すぎます。料金はかかっていません。Retry-After の秒数の後に送り直してください。
502settlement_failed決済の結果が分かりません。支払いが通っている場合があり、決済結果は付いていません。新しい支払いに署名する前に、署名した支払いが Solana か Base で通ったかを確かめてください。
502、504upstream_error、upstream_timeout決済は済みましたが、チェーンからの応答が無いか、時間内に返りませんでした。決済結果は付いています。もう一度送るには、新しい支払いが要ります。
Solana では、読み取る範囲が広すぎる呼び出し(大きなプログラムに絞り込みなしで送る getProgramAccounts など)には、支払いを求める前に HTTP 200 と JSON-RPC のエラーを返します。料金はかかりません。

次のステップ