jpskill.com
🛠️ 開発・MCP コミュニティ

x402-card

ユーザーがバーチャルカードの発行、管理、照会を希望する際に、例えば「バーチャルカードを作りたい」「カードの状況を確認したい」といった要望を理解し、暗号通貨で資金調達された使い捨てVisa/Mastercardの発行にも対応するSkill。

📜 元の英語説明(参考)

Trigger this skill when the user expresses intent to create, manage, or query a virtual card. This includes intents such as: - "get a virtual card" - "create a card" - "card status" - "set up a card for an agent" Also, any request involving the creation of a one-time-use virtual Visa/Mastercard funded with cryptocurrency for agent use.

🇯🇵 日本人クリエイター向け解説

一言でいうと

ユーザーがバーチャルカードの発行、管理、照会を希望する際に、例えば「バーチャルカードを作りたい」「カードの状況を確認したい」といった要望を理解し、暗号通貨で資金調達された使い捨てVisa/Mastercardの発行にも対応するSkill。

※ jpskill.com 編集部が日本のビジネス現場向けに補足した解説です。Skill本体の挙動とは独立した参考情報です。

⚡ おすすめ: コマンド1行でインストール(60秒)

下記のコマンドをコピーしてターミナル(Mac/Linux)または PowerShell(Windows)に貼り付けてください。 ダウンロード → 解凍 → 配置まで全自動。

🍎 Mac / 🐧 Linux
mkdir -p ~/.claude/skills && cd ~/.claude/skills && curl -L -o x402-card.zip https://jpskill.com/download/9769.zip && unzip -o x402-card.zip && rm x402-card.zip
🪟 Windows (PowerShell)
$d = "$env:USERPROFILE\.claude\skills"; ni -Force -ItemType Directory $d | Out-Null; iwr https://jpskill.com/download/9769.zip -OutFile "$d\x402-card.zip"; Expand-Archive "$d\x402-card.zip" -DestinationPath $d -Force; ri "$d\x402-card.zip"

完了後、Claude Code を再起動 → 普通に「動画プロンプト作って」のように話しかけるだけで自動発動します。

💾 手動でダウンロードしたい(コマンドが難しい人向け)
  1. 1. 下の青いボタンを押して x402-card.zip をダウンロード
  2. 2. ZIPファイルをダブルクリックで解凍 → x402-card フォルダができる
  3. 3. そのフォルダを C:\Users\あなたの名前\.claude\skills\(Win)または ~/.claude/skills/(Mac)へ移動
  4. 4. Claude Code を再起動

⚠️ ダウンロード・利用は自己責任でお願いします。当サイトは内容・動作・安全性について責任を負いません。

🎯 このSkillでできること

下記の説明文を読むと、このSkillがあなたに何をしてくれるかが分かります。Claudeにこの分野の依頼をすると、自動で発動します。

📦 インストール方法 (3ステップ)

  1. 1. 上の「ダウンロード」ボタンを押して .skill ファイルを取得
  2. 2. ファイル名の拡張子を .skill から .zip に変えて展開(macは自動展開可)
  3. 3. 展開してできたフォルダを、ホームフォルダの .claude/skills/ に置く
    • · macOS / Linux: ~/.claude/skills/
    • · Windows: %USERPROFILE%\.claude\skills\

Claude Code を再起動すれば完了。「このSkillを使って…」と話しかけなくても、関連する依頼で自動的に呼び出されます。

詳しい使い方ガイドを見る →
最終更新
2026-05-18
取得日時
2026-05-18
同梱ファイル
1

📖 Skill本文(日本語訳)

※ 原文(英語/中国語)を Gemini で日本語化したものです。Claude 自身は原文を読みます。誤訳がある場合は原文をご確認ください。

x402 仮想カードスキル

x402 HTTP 支払いプロトコルを通じて、BSC チェーン上の USDT を使用して、Agent が一度だけ使用できる仮想デビットカード(Visa/Mastercard)を作成します。

Gas モデル: BSC USDT は EIP-3009 をサポートしていないため、カード作成前にクライアントは approve 承認(オンチェーン取引)を一度行う必要があります。実際の USDT 送金はサーバー側で実行されます。

  • 建卡(x402):クライアントは少量の BNB で approve 承認を行う必要があります → その後、EIP-712 署名(gas 不要)→ サーバーが送金を送信(サーバーが gas を負担)
  • 充值(topup):WalletConnect で一度接続し、USDT + 0.001 BNB(承認 gas 用)を自動的に送金します。ユーザーはウォレット App 内で 2 件のトランザクション を確認する必要があります。
  • 赎回(withdraw):ローカルウォレットから直接 ERC20 transfer を送信します。BNB で gas を支払う必要があります。
  • 补 gas(gas):BNB のみ送金します(topup 時に BNB 送金が失敗した場合、または追加で補充が必要な場合に使用)。

起動語(必読)

本スキルに初めて入る場合は、必ず最初に起動語を一行出力してください。

Let me load the tool and check the existing environment first.

その後、直ちに「ステップ 1:事前チェック」に進みます。


コマンド一覧

すべての操作はグローバルコマンド x402-card を通じて行います。

📦 前置安装(一度のみ):

npm install -g @aeon-ai-pay/x402-card@latest

npx ではなくグローバルコマンドを使用することで、毎回 4〜5 秒のコールドスタート遅延を回避できます。 アップグレード:npm update -g @aeon-ai-pay/x402-card

x402-card setup --check                # プレチェック / 自動ウォレット作成
x402-card setup --show                 # 設定を表示
x402-card create --amount <usd> --poll # 仮想カードを作成
x402-card status --order-no <orderNo>  # カードの状態を照会
x402-card wallet                       # ローカルウォレットの残高を照会
x402-card topup --amount <usdt>        # USDT + BNB を自動的にチャージ(WalletConnect、2 件の確認)
x402-card gas [--amount <bnb>]         # ローカルウォレットに BNB をチャージ(withdraw 用、WalletConnect)
x402-card withdraw [--to <addr>] [--amount <usdt>]  # 資金を引き出す

設定は ~/.x402-card/config.json に保存されます(権限 600)。 ユーザーに秘密鍵を要求することは絶対にありません。ローカルウォレットの秘密鍵は CLI によって自動的に生成されます。


ステップ 1:事前チェック(自動ウォレット初期化)

ユーザーの意図に関わらず、最初に以下を実行します。

x402-card setup --check

CLI の動作:

  1. ~/.x402-card/config.json を読み込みます。
  2. privateKey が存在しない場合 → viem.generatePrivateKey() を使用してローカルで新しい秘密鍵を生成し、保存します。
  3. JSON を返します:{ ready, created, mode, address, mainWallet, serviceUrl, amountLimits }

出力テンプレート

最初に進捗状況を示すメッセージを一行出力します。

> Pre-check in progress...

分岐 A:ウォレットが既に存在する場合(ready: truecreated: false

0x0...{last4} Ready. Proceed to create a card for your agent.

分岐 B:今回自動的に作成された場合(ready: truecreated: true

Auto-creating your designated wallet...
0x0...{last4} Ready. Proceed to create a card for your agent.
  • {last4} は、返された address の末尾 4 桁から取得します。
  • 後続の金額検証のために amountLimits.{min,max} を記録します。
  • 事前チェックは インターネットに接続せずオンチェーン残高を照会せずサーバーを呼び出しません

境界シナリオ

ユーザーの質問 回答
「私のウォレットアドレスは?」 setup --check が返す address を直接表示します。
「自分の秘密鍵をインポートしたい」 サポートされていません。CLI はローカルウォレットを自動的に生成するだけです。カスタム設定が必要な場合は、~/.x402-card/config.json を手動で編集してください。
「ウォレットを復元できますか?」 できません。秘密鍵はローカルにのみ保存されます。資金を引き出す前に、設定ファイルをバックアップすることをお勧めします。

ステップ 2:仮想カードの作成(残高不足時の自動チャージを含む)

トリガー:ユーザーが buy / create / get a virtual card したい場合。

2.0 金額の確認

  • 金額は amountLimits.min ~ amountLimits.max の範囲内である必要があります(ステップ 1 から返されます。ハードコーディングは禁止)。
  • ユーザーが金額を指定していない場合は、有効な範囲をユーザーに示し、確認を求めます。

2.1 作成の実行

x402-card create --amount <usd> --poll

CLI 内部で順番に実行される処理:

  1. パラメータと制限の検証
  2. オンチェーン残高の確認(USDT + BNB)
  3. approve 承認(オンチェーン取引、少量の BNB を消費)
  4. EIP-712 署名(gas 不要)→ サーバーが実際の送金を送信
  5. --poll が指定されている場合 → 最大 10 回ポーリングします。各ポーリング間隔は 5 秒です。

出力の最初の行:

> Creating Agent Card...

2.2 場合分け

場合 A:金額が範囲外

CLI が返す内容:

{"error":"Amount must be at least $0.6 ...","min":0.6,"max":800}

有効な範囲をユーザーに示し、再確認を求めます。

場合 A.1:BNB が不足している場合(approve 承認には gas が必要)

CLI が返す内容:

{"error":"No BNB for approve transaction...","hint":"Run 'x402-card gas' or 'x402-card topup'"}

ユーザーに次のメッセージを表示します。

Balance check: no BNB for approve gas
→ Run 'x402-card topup' (includes BNB automatically)
→ Or run 'x402-card gas' to add BNB only

topup は自動的に 0.001 BNB を含みます。ユーザーはウォレット内で 2 件のトランザクションを確認します(1 件の USDT + 1 件の BNB)。

場合 B:USDT が十分にある場合、作成に成功

CLI の JSON 出力には success: trueorderNo が含まれます。以下を表示します。

Card created successfully.
Order No: {orderNo}
Card: ****{last4}
Status: {orderStatus}

必ず orderNo を記録してください —— これは、後続のステータス照会のための一意の証明です。

場合 C:USDT 残高が不足している場合 → WalletConnect 自動チャージを開始

CLI が返す内容:

{"error":"Insufficient USDT balance","required":"5 USDT (approx)","available":"0 USDT","shortfall":"5.000000 USDT","address":"0x..."}

ユーザーに以下を表示します(文言は完全に一致している必要があります。以下の変数は実際の値に置き換え、残りのテキストは一字一句そのままにしてください)。

Balance check: insufficient
Required amount: {required} USDT

→ Fund manually: 0x0...{session_last4}
→ Or auto-authorize transfer by link: WalletConnect (will open QR code)

ユーザーの同意を得た後、以下を実行します。

x402-card topup --amount <required>

⚠️ WalletConnect プロセスはインタラクティブであり、フォアグラウンドで同期的に実行する必要があります

  • ターミナルに QR コード + wc: URI を出力します。
  • ユーザーはウォレット App(MetaMask、Trust Wallet、imToken など)で QR コードをスキャンして接続します。
  • ウォレット App で 1 件の USDT 送金を確認します(金額 = <required>、宛先 = ローカルウォレット)。
  • 全プロセスは最長 120 秒です。

🚫 絶対禁止

  • run_in_background: true を使用して topup / gas / connect などの WalletConnect コマンドを呼び出さないでください。
  • ユーザーがスキャンを完了する前にプロセスを kill しないでください。
  • コマンドがバックグラウンドに移動したり中断されたりした場合、たとえユーザーがウォレット内で署名したとしても、CLI は mainWallet を記録できず、オンチェーンレシートを確認できません → 「支払われたが検出されない」という誤った印象を与える可能性があります。

🔧 誤って topup をバックグラウンドに配置し、すでに kill した場合: ユーザーのオンチェーン取引は すでに送信されている可能性が高い です(USDT は実際にローカルウォレットに届いています)。 この時点で 再度 topup しないでください。代わりに、以下を直接実行します。

  1. x402-card wallet を実行して、USDT が入金されていることを確認します。
  2. 入金されている場合は、元の create --amount <usd> --poll を再度実行します。
  3. 入金されていない場合(ユーザーも実際にスキャンしていない場合)は、フォアグラウンドで topup を実行します。

出力段階のヒント:

> Funding flow triggered...
Initializing WalletConnect session...
Waiting for wallet confirmation...
USDT transfer confirmed.

場合 C.1:ユーザーがウォレット内でトランザクションを拒否した場合

CLI は "error": "Transaction rejected in wallet." を返します。 ユーザーに今回のチャージがキャンセルされたことを伝え、再試行するかどうかを尋ねます。自動的に再試行しないでください

場合 C.2:WalletConnect がタイムアウトした場合(120 秒以内にスキャンまたは確認されなかった場合)

CLI は接続/タイムアウトエラーを返します。ユーザーにタイムアウトしたことを伝え、topup を再実行することを推奨します。

場合 C.3:メインウォレットの USDT が不足している場合(オンチェーン revert)

CLI は "error": "USDT transfer failed: ..." を返します。以下を表示します。

> Funding flow triggered...

Source balance insufficient
Funding aborted
- 需要: {required}
- 可用: {available}
Add funds to continue

ユーザーにメインウォレットに USDT を補充するように促します。繰り返し再試行しないでください

場合 C.4:チャージに成功した場合 → 自動的に作成を再試行

topupsuccess: true を返した後、CLI はすでに mainWallet フィールドを config に書き戻しています(資金を引き出す際に使用されます)。

自動的に create を一度再試行します

x402-card create --amount <usd> --poll

再度失敗した場合は、対応する分岐に従って処理します。3 回目の再試行は行わないでください。

場合 D:サーバー側のネットワーク/呼び出しが失敗した場合

CLI は success: false と HTTP エラーを返します。元のエラーを表示し、ユーザーに後で再試行するか、serviceUrl を確認するように推奨します。

場合 E:ポーリングがタイムアウトした場合(--poll を 10 回使い切った場合)

CLI は以下を出力します。

Polling timeout after 10 attempts. Check manually with: x402-card status --order-no {orderNo}

カードがまだ処理中であることをユーザーに伝え、orderNo を記録し、後でステップ 3 で照会します。ポーリングを続行しないでください。

詳細なフィールドについては、create-card を参照してください。


ステップ 3:カードの状態を照会

トリガー:ユーザーが check / query card status したい場合。

3.1 コマンド

x402-card status --order-no <orderNo>
x402-card status --order-no <orderNo> --poll  # 最終状態になるまでポーリング

3.2 出力テンプレート

> Fetching card status...

Card: ****{last4}
State: {Active | Used | Expired | Pending | Failed}
Remaining balance: {balance} USD
Usage: {used} / {total} (single-u
📜 原文 SKILL.md(Claudeが読む英語/中国語)を展開

x402 虚拟卡技能

通过 x402 HTTP 支付协议,使用 BSC 链上的 USDT 为 Agent 创建一次性使用的虚拟借记卡(Visa/Mastercard)。

Gas 模型: BSC USDT 不支持 EIP-3009,建卡前客户端需做一次 approve 授权(链上交易),真正的 USDT 转账由服务端执行。

  • 建卡(x402):客户端需少量 BNB 完成 approve 授权 → 然后 EIP-712 签名(免 gas)→ 服务端提交转账(服务端付 gas)
  • 充值(topup):WalletConnect 一次连接,自动转 USDT + 0.001 BNB(用于 approve gas),用户需在钱包 App 内确认 2 笔交易
  • 赎回(withdraw):本地钱包直发 ERC20 transfer,需要 BNB 付 gas
  • 补 gas(gas):仅转 BNB(当 topup 时 BNB 转账失败或需要额外补充时用)

启动语(必读)

任何时候首次进入本技能,先输出一行启动语:

Let me load the tool and check the existing environment first.

随后立即进入「步骤 1:预检查」。


命令一览

所有操作通过全局命令 x402-card

📦 前置安装(仅一次):

npm install -g @aeon-ai-pay/x402-card@latest

用全局命令而非 npx,可避免每次 4-5 秒的冷启动延迟。 升级:npm update -g @aeon-ai-pay/x402-card

x402-card setup --check                # 预检查 / 自动建钱包
x402-card setup --show                 # 查看配置
x402-card create --amount <usd> --poll # 创建虚拟卡
x402-card status --order-no <orderNo>  # 查询卡片状态
x402-card wallet                       # 查询本地钱包余额
x402-card topup --amount <usdt>        # 自动充值 USDT + BNB(WalletConnect, 2 笔确认)
x402-card gas [--amount <bnb>]         # 给本地钱包充 BNB(WalletConnect, 用于 withdraw)
x402-card withdraw [--to <addr>] [--amount <usdt>]  # 提取资金

配置存储在 ~/.x402-card/config.json(权限 600)。 绝不向用户索要私钥;本地钱包私钥由 CLI 自动生成。


步骤 1:预检查(自动钱包初始化)

无论用户意图为何,首先运行:

x402-card setup --check

CLI 行为:

  1. 读取 ~/.x402-card/config.json
  2. privateKey 缺失 → 用 viem.generatePrivateKey() 在本地生成新私钥并保存
  3. 返回 JSON:{ ready, created, mode, address, mainWallet, serviceUrl, amountLimits }

输出模板

固定先输出一行进度提示:

> Pre-check in progress...

分支 A:钱包已存在(ready: truecreated: false

0x0...{last4} Ready. Proceed to create a card for your agent.

分支 B:本次自动创建(ready: truecreated: true

Auto-creating your designated wallet...
0x0...{last4} Ready. Proceed to create a card for your agent.
  • {last4} 取自返回的 address 末 4 位
  • 记录 amountLimits.{min,max} 供后续金额校验使用
  • 预检查 不联网不查链上余额不调用服务端

边界场景

用户问 回应
「我的钱包地址是?」 直接展示 setup --check 返回的 address
「我想导入自己的私钥」 不支持。CLI 仅自动生成本地钱包;如需自定义请手动编辑 ~/.x402-card/config.json
「能恢复钱包吗?」 不可。私钥仅存本地;建议提取资金前先备份配置文件

步骤 2:创建虚拟卡(含余额不足时自动充值)

触发:用户想 buy / create / get a virtual card

2.0 金额确认

  • 金额必须落在 amountLimits.min ~ amountLimits.max(来自步骤 1 返回,禁止硬编码)
  • 若用户未指定金额,向用户展示有效区间并请求确认

2.1 执行创建

x402-card create --amount <usd> --poll

CLI 内部依次执行:

  1. 参数与限额校验
  2. 链上余额检查(USDT + BNB)
  3. approve 授权(链上交易,消耗少量 BNB)
  4. EIP-712 签名(免 gas)→ 服务端提交实际转账
  5. 若带 --poll → 最多轮询 10 次,每次间隔 5 秒

输出首行:

> Creating Agent Card...

2.2 情况分支

情况 A:金额超出范围

CLI 返回:

{"error":"Amount must be at least $0.6 ...","min":0.6,"max":800}

向用户展示有效区间,请求重新确认。

情况 A.1:BNB 不足(approve 授权需要 gas)

CLI 返回:

{"error":"No BNB for approve transaction...","hint":"Run 'x402-card gas' or 'x402-card topup'"}

提示用户:

Balance check: no BNB for approve gas
→ Run 'x402-card topup' (includes BNB automatically)
→ Or run 'x402-card gas' to add BNB only

topup 会自动附带 0.001 BNB,用户在钱包内确认 2 笔交易(1 笔 USDT + 1 笔 BNB)。

情况 B:USDT 充足,创建成功

CLI 输出 JSON 包含 success: trueorderNo。展示:

Card created successfully.
Order No: {orderNo}
Card: ****{last4}
Status: {orderStatus}

务必记录 orderNo —— 这是后续状态查询的唯一凭证。

情况 C:USDT 余额不足 → 启动 WalletConnect 自动充值

CLI 返回:

{"error":"Insufficient USDT balance","required":"5 USDT (approx)","available":"0 USDT","shortfall":"5.000000 USDT","address":"0x..."}

向用户展示(文案必须完全一致,下方变量替换为实际值,其余文字逐字保留):

Balance check: insufficient
Required amount: {required} USDT

→ Fund manually: 0x0...{session_last4}
→ Or auto-authorize transfer by link: WalletConnect (will open QR code)

征得用户同意后执行:

x402-card topup --amount <required>

⚠️ WalletConnect 流程为交互式,必须前台同步运行

  • 终端打印 QR 码 + wc: URI
  • 用户用钱包 App(MetaMask、Trust Wallet、imToken 等)扫码连接
  • 在钱包 App 中确认 1 笔 USDT 转账(金额 = <required>,目标 = 本地钱包)
  • 全过程最长 120 秒

🚫 绝对禁止

  • 不要用 run_in_background: true 调用 topup / gas / connect 等 WalletConnect 命令
  • 不要在用户扫码完成前 kill 进程
  • 一旦命令进入后台或被中断,即使用户在钱包内已签名,CLI 也无法记录 mainWallet 与确认链上回执 → 会出现"已支付但未被检测"的假象

🔧 如果误把 topup 放到后台并已 kill: 用户的链上交易很可能已经发出(USDT 实际已到本地钱包)。 此时不要重新 topup,直接:

  1. x402-card wallet 确认 USDT 已到账
  2. 若到账,直接重跑原 create --amount <usd> --poll
  3. 若未到账(用户也没真扫码),再前台 topup

输出阶段提示:

> Funding flow triggered...
Initializing WalletConnect session...
Waiting for wallet confirmation...
USDT transfer confirmed.

情况 C.1:用户在钱包内拒绝交易

CLI 返回 "error": "Transaction rejected in wallet."。 告知用户本次充值已取消,询问是否重试。不要自动重试

情况 C.2:WalletConnect 超时(120s 未扫码或未确认)

CLI 返回连接/超时错误。告知用户超时,建议重新执行 topup

情况 C.3:主钱包 USDT 不足(链上 revert)

CLI 返回 "error": "USDT transfer failed: ..."。展示:

> Funding flow triggered...

Source balance insufficient
Funding aborted
- 需要: {required}
- 可用: {available}
Add funds to continue

提示用户向其主钱包补 USDT,不要循环重试

情况 C.4:充值成功 → 自动重试创建

topup 返回 success: true 后,CLI 已自动把 mainWallet 字段写回 config(提取资金时会用到)。

自动重试一次 create

x402-card create --amount <usd> --poll

若再次失败,按对应分支处理;不要进入第三次重试。

情况 D:服务端网络/调用失败

CLI 返回 success: false 及 HTTP 错误。展示原始错误,建议用户稍后重试或检查 serviceUrl

情况 E:轮询超时(--poll 用满 10 次)

CLI 输出:

Polling timeout after 10 attempts. Check manually with: x402-card status --order-no {orderNo}

告知用户卡片仍在处理中,记下 orderNo,稍后用步骤 3 查询。禁止继续轮询。

详细字段见 create-card


步骤 3:查询卡片状态

触发:用户想 check / query card status

3.1 命令

x402-card status --order-no <orderNo>
x402-card status --order-no <orderNo> --poll  # 轮询直至终态

3.2 输出模板

> Fetching card status...

Card: ****{last4}
State: {Active | Used | Expired | Pending | Failed}
Remaining balance: {balance} USD
Usage: {used} / {total} (single-use)

3.3 边界场景

情况 处理
用户没有 orderNo 询问最近一次 create 输出中的 orderNo;无则告知无法查询
orderNo 无效 / 服务端返回空 展示原始错误,建议用户核对 orderNo
状态为 Pending 提示卡片仍在处理;可选轮询,但仍不超过 10 次
状态为 Failed 告知失败原因;订单已无效,需重新 create

详细字段见 check-status


步骤 4:钱包管理

触发:用户想 查询余额 / 追加充值 / 提取资金

4.1 查询本地钱包余额

x402-card wallet

输出本地钱包 USDT 余额及地址。若曾通过 topup 充值,会附带主钱包余额。

4.2 追加充值(同 2.C 流程)

x402-card topup --amount <usdt>               # USDT + 0.001 BNB(默认)
x402-card topup --amount <usdt> --skip-gas     # 仅 USDT,不附带 BNB

topup 默认在一次 WalletConnect 会话内同时转 USDT 和 0.001 BNB,用户需在钱包 App 内依次确认 2 笔交易

  1. 第 1 笔:USDT(指定金额)
  2. 第 2 笔:0.001 BNB(用于 BSC USDT approve 授权的 gas)

若第 2 笔 BNB 失败(如拒绝或余额不足),不阻断——USDT 已到账,BNB 可后续用 x402-card gas 单独补充。

4.3 提取资金到主钱包

x402-card withdraw                                  # 提全部 USDT 到记录的 mainWallet
x402-card withdraw --amount <usdt>                  # 指定金额
x402-card withdraw --to 0xMainWallet                # 指定目标地址
x402-card withdraw --to 0xMainWallet --amount <usdt>

⚠️ withdraw 需要 BNB 作为 gas: 与 x402 建卡(gasless)不同,withdraw 是本地钱包直发的链上 ERC20 transfer, 必须由本地钱包自己支付 BNB gas(建议 ≥ 0.0005 BNB)。 用户需要从交易所或自己钱包向本地钱包地址手动转入少量 BNB 才能赎回。

目标地址解析优先级

  1. CLI 参数 --to <address>
  2. ~/.x402-card/config.json 中的 mainWallet仅在用户曾用过 topup 后才会有

输出模板(文案必须完全一致,仅变量替换)

> Reclaiming funds...

From: 0x0...{session_last4}
To: main wallet (0x0...{main_last4})

Amount: {amount} USDT
Status: completed

字面 "main wallet" 标签是规格要求,不要省略;括号内地址用于让用户确认转账目标。

边界场景

错误 含义 处理
No main wallet address found. Use --to <address> 配置无 mainWallet 且未传 --to 询问用户提供目标地址
No USDT to withdraw. 本地钱包 USDT 余额为 0 告知无可提取,建议先 topup
No BNB for gas. ... 本地钱包无 BNB,无法支付 gas 提示用户运行 x402-card gas 通过 WalletConnect 充入少量 BNB;详见 4.4
Requested X USDT but only Y available --amount 大于实际余额 展示实际余额,请求重新确认
Withdraw failed: ... 链上交易失败 展示原始错误,建议稍后重试

4.4 为本地钱包补 gas(BNB)

withdrawNo BNB for gas 时,使用专用 gas 子命令通过 WalletConnect 从主钱包转少量 BNB 进来。

x402-card gas                    # 默认 0.001 BNB
x402-card gas --amount 0.002     # 自定义金额

⚠️ 此命令为交互式 WalletConnect 流程(与 topup 同机制):

  • 终端打印 QR 码 + wc: URI
  • 用户用钱包 App 扫码连接主钱包
  • 在钱包内确认 1 笔 BNB 转账(金额 = <amount>,目标 = 本地钱包)
  • 最长等待 120 秒,不可后台运行

成功后会自动把 mainWallet 写回 config(后续 withdraw 可省略 --to)。

输出模板

> Topping up gas...
Initializing WalletConnect session...
Waiting for wallet confirmation...
BNB transfer confirmed.

Local wallet: 0x0...{last4}
Balance: {bnb} BNB

边界场景

错误 处理
Transaction rejected in wallet. 告知用户已取消,询问是否重试,不自动重试
BNB transfer failed: ... 主钱包 BNB 不足或链上 revert,提示用户先在主钱包准备 BNB
WalletConnect 120s 超时 告知超时,建议重新执行 gas

决策路由总览

用户意图 入口命令
任何首次进入 / 不确定状态 setup --check
查看当前配置 / 钱包地址 setup --show
创建虚拟卡 create --amount <n> --poll
Session Key USDT 不足时充值 topup --amount <n>
查询卡片状态 status --order-no <n>
查询本地钱包余额 wallet
提取资金到主钱包 withdraw [--to <addr>] [--amount <n>]
为本地钱包补 BNB(withdraw 前置) gas [--amount <bnb>]
了解 x402 协议本身 阅读 x402-protocol

文案一致性约束(必读)

以下 关键短语行级输出模板 必须逐字一致,不得改写、翻译、增减字符(包括标点、空格、> 前缀和大小写):

行级模板(必须完全一致)

步骤 模板首行
预检查 > Pre-check in progress...
自动建钱包 Auto-creating your designated wallet...
钱包就绪 0x0...{last4} Ready. Proceed to create a card for your agent.
创建卡片 > Creating Agent Card...
余额不足首行 Balance check: insufficient
充值流程 > Funding flow triggered...
主钱包不足 Source balance insufficient / Funding aborted / Add funds to continue
查询状态 > Fetching card status...
提取资金 > Reclaiming funds...
提取目标行 To: main wallet (0x0...{last4})
提取状态行 Status: completed

关键短语(必须保留原词)

  • Balance checkinsufficientRequired amount
  • Fund manuallyauto-authorize transfer by link
  • Source balance insufficientFunding abortedAdd funds to continue
  • CardStateRemaining balanceUsagesingle-use
  • FromToAmountStatuscompleted
  • main wallet(withdraw 目标行的字面文字)

变量映射

占位符 来源
{last4} setup --check / wallet / withdraw 输出中 address 的末 4 位
{required} create 错误返回的 required 字段
{available} create 错误返回的 available 字段;或 topup 错误中显式数值
{amount} withdraw 输出 withdrawn 字段
{orderNo} create 输出 orderNo 字段

禁止的偏离

  • ❌ 翻译为中文(如 "余额检查:不足")
  • ❌ 改大小写(如 "Balance Check")
  • ❌ 简写(如 "BNB insuff.")
  • ❌ 加额外修饰(如 emoji、加粗、
  • ❌ 拆行或合并行
  • ❌ 用同义词替换(如把 insufficient 换成 not enough

全局禁止行为

  • 绝不向用户索要私钥;本地钱包由 CLI 自动生成
  • 绝不在未经用户确认金额的情况下执行 createtopup
  • 绝不记录或显示完整私钥;地址展示为 0x0...last4 格式
  • 绝不跳过 setup --check 直接执行其他命令
  • 绝不topup / gas / 任何 WalletConnect 命令在后台运行(必须前台同步等待)。误后台导致的"已支付未检测"问题,按步骤 2 情况 C 的「如果误把 topup 放到后台」恢复
  • 不要topup 失败后无限重试,按对应模板提示后停止
  • 不要轮询 status 超过 10 次;超时即停,提示用户记下 orderNo 自行查询
  • 不要自行编造 amountLimits;始终使用 setup --check 返回的 min/max