x402
Metaplex x402の支払いモード
Last updated September 8, 2026
Metaplex x402は3つの支払いモード — 標準Solanaウォレット、Coreアセットまたはエージェントによる直接支払い、リクエストごとの署名なしで支払う委任エージェント — をサポートします。どのモードでも生成されるものは同じで、すでに使っているHTTPクライアントに渡せる支払い対応のfetchです。
概要
支払いモードを選ぶということは、どのアカウントのUSDCでリクエストを支払い、その所有者がどの頻度で署名するかを決めることです。最初の2つのモードは登録する支払いスキームが違うだけですが、委任されたエージェントではさらに認証トークンストアと、クライアント拡張またはfetchラッパーのいずれかが必要です。fetchWithPaymentさえ用意できれば、その後のリクエストコードは3つのモードすべてで同一です。
- 標準ウォレット —
ExactSvmSchemeを使う素のx402。所有者が支払いごとに署名し、SOLは不要です - Coreアセットまたはエージェント(直接) —
coreExecuteターゲットを指定したMetaplexSvmExactScheme。資金はアセットのシグナーPDAから出ますが、所有者は引き続き支払いごとに署名します - 委任エージェント(即時) — 1回限りのオンチェーン許可により、Mechがエージェントのウォレットから支払いを承認できるようになります。クライアントはメッセージ署名で認証します
- いつでも取り消し可能 — 委任はオンチェーンの許可なので、取り消しはポリシーではなくオンチェーンで支払いを停止します
このガイドで構築するもの
このガイドを終えると、各リクエストの支払いを透過的に処理するfetchWithPayment関数が、支出させたいアカウントに紐づけられた状態で手に入ります。このページのすべてのレシピが、同じこの関数を生成します。
前提条件
Metaplex x402には、資金を入れたSolanaアカウントと、支払いトランザクションを構築できる署名者が必要です。
- Node.js 20.18+ とESMプロジェクト
- Solanaの署名者 — Solana Kitのキーペア署名者またはUmiの署名者
- 支払い元アカウントのクラシックなSPL Token関連トークンアカウントにあるUSDC
- Coreアセットおよびエージェントのモードでは、その署名者が所有するCoreアセットと、そのシグナーPDA内のSOL
- 委任エージェントのモードでは、登録済みのエージェントアイデンティティ — 新しいエージェントをミントするか、既存のCoreアセットを登録します
ブラウザのコードに秘密鍵を埋め込まないでください
以下の例は開発用キーペアを環境変数から読み込みます。ブラウザではウォレットアダプターの署名者を使ってください — クライアントに配信された秘密鍵は、公開された秘密鍵と同じです。
クイックスタート
クライアントをインストールし、支払い元アカウントに入金してから、選択したモードのスキームを登録します。
pnpm add @metaplex-foundation/x402 \
@metaplex-foundation/umi \
@solana/kit \
@x402/core \
@x402/fetch \
@x402/svm
続いて、使用するクライアントを追加します。
| クライアント | インストール |
|---|---|
| OpenAI SDK | pnpm add openai |
| Vercel AI SDK | pnpm add ai @ai-sdk/openai-compatible |
| Solana web3.js | pnpm add @solana/web3.js |
各モードへ移動: 標準ウォレット · Coreアセットまたはエージェント · 委任エージェント。
支払いモード別の資金要件
各モードは異なるアカウントからUSDCを引き出し、SOLが必要なのはCore executeを使うモードだけです。
| 支払いモード | USDCの出所 | SOLの要否 |
|---|---|---|
| 標準ウォレット | そのウォレットのUSDCトークンアカウント | 不要 — ネットワーク手数料はサービス側のフィーペイヤーが負担 |
| Coreアセットまたはエージェント(直接・委任) | アセットシグナーPDAのUSDCトークンアカウント | Core execute手数料のためシグナーPDAに必要 |
支払い元は常にクラシックなSPL Tokenの関連トークンアカウントです。Token-2022の支払いミントは現在サポートされていません。
標準Solanaウォレットで支払う
自分が直接管理するウォレットから支払うには、@x402/svmのExactSvmSchemeを登録します。これは素のx402であり、Metaplexのクライアントが加えているのはエンドポイント定数とディスカバリーヘルパーだけです。
import { createKeyPairSignerFromBytes, getBase58Encoder } from '@solana/kit';
import { x402Client } from '@x402/core/client';
import { wrapFetchWithPayment } from '@x402/fetch';
import { ExactSvmScheme } from '@x402/svm/exact/client';
const svmSigner = await createKeyPairSignerFromBytes(
getBase58Encoder().encode(process.env.SVM_PRIVATE_KEY!),
);
const paymentClient = new x402Client();
paymentClient.register('solana:*', new ExactSvmScheme(svmSigner));
const fetchWithPayment = wrapFetchWithPayment(fetch, paymentClient);
Coreアセットまたはエージェントで直接支払う
所有者が引き続き支払いごとに署名しつつ、Coreアセット自身のウォレットから資金を出すには、coreExecuteターゲットを指定したMetaplexSvmExactSchemeを登録します。すべてのCoreアセットは組み込みのウォレット — Asset Signer PDA — を持っているため、そのウォレットに入金すればメインウォレットと支出を分離でき、所有権が移転すれば予算もアセットとともに移動します。
import { MetaplexSvmExactScheme } from '@metaplex-foundation/x402';
import { x402Client } from '@x402/core/client';
import { wrapFetchWithPayment } from '@x402/fetch';
const paymentClient = new x402Client();
paymentClient.register(
'solana:*',
new MetaplexSvmExactScheme(svmSigner, {
rpcUrl: svmRpcUrl,
coreExecute: {
asset: coreAssetAddress,
},
}),
);
const fetchWithPayment = wrapFetchWithPayment(fetch, paymentClient);
svmSignerはアセットを管理する署名者、svmRpcUrlは支払いトランザクションの構築に使うSolana RPCエンドポイント、coreAssetAddressはCoreアセットまたはエージェントのアドレスです。
コレクションに属するアセットにはコレクションアドレスが必要です
アセットがCoreコレクションに属している場合はcoreExecute.collectionを渡してください。すべてのオプションはスキームオプションの表にあります。
委任エージェントで即時に支払う
エージェントをMechに1回委任しておけば、サーバーはリクエストごとの所有者署名なしにエージェントのウォレットから支払いを承認できます。自律エージェントや高頻度のワークロードに適したモードです。
エージェントは、承認する署名者が所有する登録済みのエージェントアイデンティティである必要があります。委任後、クライアントはSign-In-With-Xのメッセージ署名で認証して24時間有効なベアラートークンを受け取り、サーバーがエージェントのウォレットから支払いを構築します。この委任はいつでも取り消せるオンチェーンの許可です。
委任を1回だけ承認する
繰り返し実行してもトランザクションを再送しないよう、承認前に現在のステータスを確認します。
import {
approveMetaplexCoreExecuteDelegate,
fetchMetaplexCoreExecuteDelegateStatus,
} from '@metaplex-foundation/x402';
const status = await fetchMetaplexCoreExecuteDelegateStatus(coreAssetAddress);
if (!status.isDelegated) {
await approveMetaplexCoreExecuteDelegate(svmSigner, coreAssetAddress, {
rpcUrl: svmRpcUrl,
});
}
リアクティブとプロアクティブの統合スタイルを選ぶ
リアクティブとプロアクティブの統合は代替関係にあります — どちらか一方だけを使い、併用しないでください。
| スタイル | 認証の方法 | 選ぶ基準 |
|---|---|---|
| リアクティブ | クライアント拡張。最初の402レスポンスが認証を駆動し、サーバーの動的な支払い要件を保持します | すでに他の有料サービスと並行してx402Clientを運用している場合、または直接支払いへのフォールバックを任意で使いたい場合 |
| プロアクティブ | リソースリクエストの前に認証するfetchラッパー。402の往復は表に出ません | Metaplexのエンドポイントのみを対象に、最もシンプルに配線したい場合 |
以下のどちらのスニペットでも、solanaSignerは認証に使うメッセージ署名可能なSolana署名者です。Solana Kitのキーペア署名者が使えます。
import {
createMetaplexCoreExecuteDelegateClientExtension,
InMemoryMetaplexCoreExecuteDelegateAuthTokenStore,
MetaplexSvmExactScheme,
} from '@metaplex-foundation/x402';
import { x402Client } from '@x402/core/client';
import { wrapFetchWithPayment } from '@x402/fetch';
const authTokenStore = new InMemoryMetaplexCoreExecuteDelegateAuthTokenStore();
const paymentClient = new x402Client();
paymentClient.register(
'solana:*',
new MetaplexSvmExactScheme(svmSigner, { rpcUrl: svmRpcUrl }),
);
paymentClient.registerExtension(
createMetaplexCoreExecuteDelegateClientExtension({
signer: solanaSigner,
asset: coreAssetAddress,
authTokenStore,
}),
);
const fetchWithPayment = wrapFetchWithPayment(fetch, paymentClient);
import {
InMemoryMetaplexCoreExecuteDelegateAuthTokenStore,
wrapFetchWithMetaplexCoreExecuteDelegate,
} from '@metaplex-foundation/x402';
const authTokenStore = new InMemoryMetaplexCoreExecuteDelegateAuthTokenStore();
const fetchWithPayment = wrapFetchWithMetaplexCoreExecuteDelegate(fetch, {
signer: solanaSigner,
asset: coreAssetAddress,
authTokenStore,
});
プロアクティブなスタイルでも委任の承認は必要で、他のオリジンへのリクエストはそのまま素通りします。
認証トークンの保存と失効の扱い
認可JWTは24時間で失効し、クライアントはオンチェーンの再承認ではなくメッセージ署名によって自動的に置き換えます。
- Node.jsでは
InMemoryMetaplexCoreExecuteDelegateAuthTokenStoreを、ブラウザ専用のコードではLocalStorageMetaplexCoreExecuteDelegateAuthTokenStoreを使ってください - それ以外のストレージバックエンドを使う場合は
MetaplexCoreExecuteDelegateAuthTokenStoreインターフェースを実装します - リアクティブな直接支払いフォールバックは既定で無効です。登録済みの支払いスキームに委任失敗を処理させたい場合にのみ
fallback: trueを設定してください - 認証、キャッシュ、フォールバックの挙動を観察するには
onEventを渡します
認可トークンはベアラー資格情報です
LocalStorageMetaplexCoreExecuteDelegateAuthTokenStoreはJWTをブラウザから読み取れるストレージに保持するため、オリジンでXSSが発生すると、トークンが失効するか委任が取り消されるまで、攻撃者がそれを読み取って委任を使って支払える状態になります。トークンがページの再読み込みをまたいで残る必要が本当にない限りInMemoryMetaplexCoreExecuteDelegateAuthTokenStoreを使い、エージェントのウォレットには必要な分だけを入れ、委任が不要になったらすぐにrevokeMetaplexCoreExecuteDelegateを呼び出してください。
委任を取り消す
承認時と同じ署名者、アセット、RPCオプションでrevokeMetaplexCoreExecuteDelegateを呼び出します。
import { revokeMetaplexCoreExecuteDelegate } from '@metaplex-foundation/x402';
await revokeMetaplexCoreExecuteDelegate(svmSigner, coreAssetAddress, {
rpcUrl: svmRpcUrl,
});
この許可はオンチェーンに存在するため、取り消すとサーバーはエージェントのウォレットから支払いを構築できなくなります — サービス側が善意で従うポリシーではありません。
よくあるエラー
支払いの構築に失敗する原因は、ほぼ必ず資金、ネットワークの不一致、委任の状態のいずれかに行き着きます。
| 症状 | 原因 | 対処 |
|---|---|---|
| 支払いの構築に失敗する | 支払い元アカウントに支払いミントのUSDCがない | ウォレット、Coreアセット、またはエージェントのシグナーPDAにUSDCを入金する |
Core executeの支払いが失敗する | アセットシグナーPDAにトランザクション手数料用のSOLがない | アセットシグナーPDAにSOLを送る |
| 支払いがネットワーク違いとして拒否される | SVM_RPC_URLが402レスポンスの宣言するネットワークと異なる | 402レスポンスが宣言するネットワークにRPC URLを合わせる |
| Coreアセットの署名が拒否される | そのアセットは渡した署名者が管理していない | Coreアセットを所有する署名者を渡す |
| 委任支払いがフォールバックまたは失敗する | アセットが登録済みエージェントアイデンティティでない、または委任が未承認 | fetchMetaplexCoreExecuteDelegateStatus()がisDelegated: trueを返すことを確認する |
| 認証がループする、二重払いが起きる | リアクティブ拡張とプロアクティブラッパーを併用している | 統合スタイルはどちらか一方のみを使う |
検証済みの構成
| パッケージ | バージョン |
|---|---|
@metaplex-foundation/x402 | 0.1.0 |
| Node.js | 20.18+(ESM) |
| 支払いミント | USDC(クラシックSPL Token) |
注意事項
MetaplexSvmExactSchemeはUmiの署名者とSolana Kitのパーシャルトランザクション署名者を受け付けますが、sign-and-send署名者は受け付けません。Kitの署名者は内部で変換されます。- サービス・クライアント・支払いモードのすべての組み合わせについて、実行可能なサンプルがx402リポジトリにあり、
pnpm example:<name>で実行できます。 - 委任エージェントのサンプルは、初回実行時に承認トランザクションを送信する場合があります。
- 委任は、リクエストの支払いのためにエージェントのウォレットからUSDCを動かす権限をMechに与えます。シグナーPDAには運用に必要な残高だけを置き、エージェントを使わないときは取り消してください。
クイックリファレンス
| 項目 | 値 |
|---|---|
| 標準ウォレットのスキーム | ExactSvmScheme(@x402/svm) |
| Coreアセット・エージェントのスキーム | MetaplexSvmExactScheme |
| 委任ヘルパー | fetchMetaplexCoreExecuteDelegateStatus、approveMetaplexCoreExecuteDelegate、revokeMetaplexCoreExecuteDelegate |
| 委任トランスポート | createMetaplexCoreExecuteDelegateClientExtension、wrapFetchWithMetaplexCoreExecuteDelegate |
| 認証トークンの有効期間 | 24時間 |
| 委任エンドポイント | /x402/core-execute-delegate/{status,approve,revoke,auth} |
FAQ
Metaplex x402の支払いモードに関するよくある質問。
Metaplex x402ではどの支払いモードを使うべきですか?
アプリが自分自身として支払う場合は標準ウォレット、所有者の監督下でアセットに独自の予算を持たせたい場合はCoreアセットまたはエージェントの直接支払い、自律エージェントが人間の署名なしにリクエストごとに支払う必要がある場合は委任エージェントを使います。
Metaplex x402のリクエストを支払うのにSOLは必要ですか?
必要なのはCoreアセットおよびエージェントの支払いモードだけで、その場合はCore executeのトランザクション手数料をまかなうためにアセットシグナーPDAにSOLが必要です。標準ウォレットの支払いにSOLは不要で、支払いトランザクションのネットワーク手数料はサービス側のフィーペイヤーが負担します。
委任エージェントの認証トークンの有効期間はどれくらいですか?
認可JWTは24時間で失効します。失効したトークンは破棄され自動的に置き換えられます。置き換えに必要なのはメッセージ署名だけで、オンチェーンの委任承認を再度行う必要はありません。
リアクティブ拡張とプロアクティブなfetchラッパーは併用できますか?
いいえ。両者は代替関係にあり、組み合わせるとフローが壊れます。すでにx402Clientを運用している場合や直接支払いへのフォールバックを任意で使いたい場合はリアクティブなクライアント拡張を、Metaplexのエンドポイントのみを対象に最もシンプルに配線したい場合はプロアクティブなfetchラッパーを使ってください。
委任エージェントによる支払いを止めるにはどうすればいいですか?
承認時と同じ署名者、アセット、RPCオプションでrevokeMetaplexCoreExecuteDelegateを呼び出します。委任はオンチェーンの許可なので、取り消しはオンチェーンで有効になり、サーバーはエージェントのウォレットから支払いを構築できなくなります。
Token-2022のUSDCや他のステーブルコインで支払えますか?
いいえ。支払い元は常にクラシックなSPL Tokenの関連トークンアカウントであり、Token-2022の支払いミントは現在サポートされていません。
Metaplex Foundationが管理。最終確認日: 2026-09-08。クライアントバージョン: @metaplex-foundation/x402 0.1.0。GitHubでソースを見る。
