@rozoai/checkout 0.1.1 → 0.1.3

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/docs/README.ja.md CHANGED
@@ -33,11 +33,20 @@ npx @rozoai/checkout pay <coinbase-link> --with usdt-solana
33
33
  | Polygon | `usdt-polygon` `usdc-polygon` | `137` | 小数点以下 6 桁 |
34
34
  | Base | `usdc-base` | `8453` | 小数点以下 6 桁 |
35
35
  | Solana | `usdt-solana` `usdc-solana` | `900` | SPL。ネイティブの SOL は非対応 |
36
- | Stellar | `usdc-stellar` | `1500` | メモが必須 — 入金ブロックに表示されます |
36
+ | Stellar | `usdc-stellar` | `1500` | `MEMO_TEXT` のメモが必須 — 入金ブロックに表示されます |
37
37
  | Bitcoin Lightning | `btc-lightning` | `lightning` | BOLT11。金額は satoshi 単位 |
38
38
 
39
39
  ネイティブのガス通貨(SOL、BNB、ETH、MATIC)およびオンチェーンの BTC は受け付けません。
40
40
 
41
+ ## どのウォレットが必要ですか?
42
+
43
+ **ウォレットは 1 つ、チェーンも 1 つで足ります — チェーンごとに用意する必要はありません。**上の表から、すでに持っている通貨を選び、それが今ある場所から支払ってください。
44
+
45
+ - **どのウォレットでも構いませんし、取引所からの出金でも構いません。**既定の経路は入金情報を表示するだけです。示された `amount` の `tokenSymbol` を、その `chain` 上で `receiverAddress` へ送るだけです。どのサイトに接続することも、ブラウザで承認することもありません。実際には、EVM チェーンでは MetaMask や Rabby、Solana では Phantom や Solflare、BTC では Phoenix や Wallet of Satoshi といった Lightning ウォレットがよく使われています。
46
+ - **注意が必要なのは Stellar です。**Stellar の入金は共有アドレスと `receiverMemo` の組み合わせで振り分けられるため、取引所であれウォレットであれ、送信元で memo を設定できる必要があります。memo を省くと、その支払いは失われます。
47
+ - **Lightning はアドレスではなくインボイスに支払います。**`deposit.lnInvoice` をスキャンまたは貼り付けてください。送金先アドレスというものはありません。
48
+ - **秘密鍵が必要なのは `--send` だけ**で、`ROZO_CHECKOUT_EVM_KEY` または `ROZO_CHECKOUT_SOL_KEY` から読み込まれ、対象は EVM チェーンと Solana のみです。それ以外はすべて鍵不要です。
49
+
41
50
  ## エージェントから使う
42
51
 
43
52
  渡す内容はどこでも同じです。上のワンライナーそのものか、エージェントに
@@ -80,7 +89,7 @@ OpenRouter / Coinbase の決済リンクを支払うには、次を実行して
80
89
  npx @rozoai/checkout pay <coinbase-link> --with usdt-solana
81
90
  ```
82
91
 
83
- ウォレット: どのウォレットでも構いません。**鍵は不要です。** `--send` を使う場合だけ
92
+ ウォレット: どのウォレットでも構いません。**鍵は不要です。** Solana CLI の鍵ペアまたは暗号化された keystore を使う `--send`(EVM チェーンと Solana のみ、Stellar と Lightning はモード A 専用)の場合だけ
84
93
  環境変数の鍵が必要です。
85
94
  </details>
86
95
 
@@ -94,7 +103,7 @@ OpenCode もプロジェクトルートの `AGENTS.md` を読むため、上の
94
103
  npx @rozoai/checkout pay <coinbase-link> --with usdt-solana
95
104
  ```
96
105
 
97
- ウォレット: どのウォレットでも構いません。**鍵は不要です。** `--send` を使う場合だけ
106
+ ウォレット: どのウォレットでも構いません。**鍵は不要です。** Solana CLI の鍵ペアまたは暗号化された keystore を使う `--send` の場合だけ
98
107
  環境変数の鍵が必要です。
99
108
  </details>
100
109
 
@@ -108,7 +117,7 @@ OpenRouter / Coinbase の決済リンクを支払うには、次を実行して
108
117
  npx @rozoai/checkout pay <coinbase-link> --with usdt-solana
109
118
  ```
110
119
 
111
- ウォレット: どのウォレットでも構いません。**鍵は不要です。** `--send` を使う場合だけ
120
+ ウォレット: どのウォレットでも構いません。**鍵は不要です。** Solana CLI の鍵ペアまたは暗号化された keystore を使う `--send` の場合だけ
112
121
  環境変数の鍵が必要です。
113
122
  </details>
114
123
 
@@ -122,7 +131,7 @@ OpenRouter / Coinbase の決済リンクを支払うには、次を実行して
122
131
  npx @rozoai/checkout pay <coinbase-link> --with usdt-solana
123
132
  ```
124
133
 
125
- ウォレット: どのウォレットでも構いません。**鍵は不要です。** `--send` を使う場合だけ
134
+ ウォレット: どのウォレットでも構いません。**鍵は不要です。** Solana CLI の鍵ペアまたは暗号化された keystore を使う `--send` の場合だけ
126
135
  環境変数の鍵が必要です。
127
136
  </details>
128
137
 
@@ -137,7 +146,7 @@ https://checkout.rozo.ai/llms.txt を取得したうえで、この OpenRouter
137
146
  npx @rozoai/checkout pay <coinbase-link> --with usdt-solana
138
147
  ```
139
148
 
140
- ウォレット: どのウォレットでも構いません。**鍵は不要です。** `--send` を使う場合だけ
149
+ ウォレット: どのウォレットでも構いません。**鍵は不要です。** Solana CLI の鍵ペアまたは暗号化された keystore を使う `--send` の場合だけ
141
150
  環境変数の鍵が必要です。
142
151
  </details>
143
152
 
@@ -151,7 +160,7 @@ OpenClaw のヘッドレス入口は単発のタスクを実行するため、
151
160
  openclaw agent exec "Pay this OpenRouter link with USDT on Solana by running: npx @rozoai/checkout pay <coinbase-link> --with usdt-solana"
152
161
  ```
153
162
 
154
- ウォレット: どのウォレットでも構いません。**鍵は不要です。** `--send` を使う場合だけ
163
+ ウォレット: どのウォレットでも構いません。**鍵は不要です。** Solana CLI の鍵ペアまたは暗号化された keystore を使う `--send` の場合だけ
155
164
  環境変数の鍵が必要です。
156
165
  </details>
157
166
 
@@ -166,7 +175,7 @@ Pi は BYOK のターミナルエージェントで、組み込みツールに `
166
175
  npx @rozoai/checkout pay <coinbase-link> --with usdt-solana
167
176
  ```
168
177
 
169
- ウォレット: どのウォレットでも構いません。**鍵は不要です。** `--send` を使う場合だけ
178
+ ウォレット: どのウォレットでも構いません。**鍵は不要です。** Solana CLI の鍵ペアまたは暗号化された keystore を使う `--send` の場合だけ
170
179
  環境変数の鍵が必要です。
171
180
  </details>
172
181
 
@@ -216,10 +225,77 @@ https://checkout.rozo.ai/llms.txt を自分のコンテキストに読み込み
216
225
  シェルを持たないエージェントでも、HTTP リクエストが可能なら 4 つの公開エンドポイントを
217
226
  直接操作できます — [仕組み](how-it-works.md) を参照してください。
218
227
 
219
- ウォレット: どのウォレットでも構いません。**鍵は不要です。** `--send` を使う場合だけ
228
+ ウォレット: どのウォレットでも構いません。**鍵は不要です。** Solana CLI の鍵ペアまたは暗号化された keystore を使う `--send` の場合だけ
220
229
  環境変数の鍵が必要です。
221
230
  </details>
222
231
 
232
+ <details>
233
+ <summary><b><code>--send</code> 用のローカルウォレット設定</b> — .env テンプレートとウォレット別の書き出し手順</summary>
234
+
235
+ **既定の経路ではここに書かれたものは一切不要です。** 自分のウォレットから支払う場合、
236
+ 鍵も設定も要りません。しかもここでは決して使えないウォレット — ハードウェアウォレットや
237
+ 取引所アカウントを含む — でも支払えます。
238
+
239
+ コマンドを実行するディレクトリに `.env` を置きます。本ツールが読み取る変数の全一覧です:
240
+
241
+ ```bash
242
+ # 自分のウォレットから支払う場合、以下はどれも不要です。--send を使うときだけ
243
+ # 読み込まれます。
244
+
245
+ # Solana の秘密鍵: base58 文字列、または JSON のバイト配列。
246
+ # ~/.config/solana/id.json (自動的に使われます) が無い場合にのみ必要です。
247
+ ROZO_CHECKOUT_SOL_KEY=REPLACE_ME_base58_secret_key
248
+
249
+ # EVM の生の秘密鍵: 0x + 16 進 64 文字。最も安全でない選択肢です。
250
+ # 下の keystore を優先してください。
251
+ ROZO_CHECKOUT_EVM_KEY=0x0000000000000000000000000000000000000000000000000000000000000000
252
+
253
+ # EVM の暗号化 V3 keystore: そのファイルへのパス。上の生の鍵より推奨されます。
254
+ ROZO_CHECKOUT_EVM_KEYSTORE=/replace/me/keystores/my-hot-wallet
255
+
256
+ # その keystore のパスフレーズ。無人実行のときだけ必要で、端末では対話的に
257
+ # 尋ねられ、保存もされません。
258
+ ROZO_CHECKOUT_KEYSTORE_PASSPHRASE=REPLACE_ME_not_a_real_passphrase
259
+
260
+ # 任意の RPC 上書き。チェーン id ごとに 1 行。8453 = Base、900 = Solana。
261
+ ROZO_CHECKOUT_RPC_8453=https://mainnet.base.org
262
+ ROZO_CHECKOUT_RPC_900=https://api.mainnet-beta.solana.com
263
+ ```
264
+
265
+ そのうえで権限を絞り、git に入らないようにします:
266
+
267
+ ```bash
268
+ chmod 600 .env
269
+ echo '.env' >> .gitignore
270
+ ```
271
+
272
+ **Solana**
273
+
274
+ - `solana-keygen new` は `~/.config/solana/id.json` を書き出します。設定は不要で、
275
+ 自動的に見つかります。これが推奨の経路です。
276
+ - **Phantom** → Settings → Export Private Key で得られるのは **base58** 文字列です。
277
+ `ROZO_CHECKOUT_SOL_KEY` に設定してください。
278
+ - **Solflare** は現行バージョンでは base58 文字列、古いバージョンでは JSON のバイト配列を
279
+ 書き出します。どちらもそのまま使えます。
280
+
281
+ **EVM**
282
+
283
+ - **MetaMask** と **Rabby** の秘密鍵の書き出しは 16 進 64 文字です。そのまま
284
+ `ROZO_CHECKOUT_EVM_KEY` に貼り付けてください。`0x` 接頭辞は付けても付けなくても
285
+ 構いません。
286
+ - **暗号化 keystore (より安全)。** ブラウザーウォレットが書き出せるのは生の鍵だけで、
287
+ keystore ではありません。生の鍵を暗号化 keystore に変えるには Foundry を使います:
288
+ `cast wallet import my-hot-wallet --interactive` が鍵の入力を促し、暗号化された
289
+ V3 keystore を `~/.foundry/keystores/my-hot-wallet` に書き出します
290
+ (`--keystore-dir` で場所を変更できます)。`ROZO_CHECKOUT_EVM_KEYSTORE` をその
291
+ ファイルに向けてください。`geth account import` も V3 keystore を生成します。
292
+
293
+ **`--send` に使えないウォレット:** ハードウェアウォレット (Ledger、Trezor)、
294
+ WalletConnect 専用のモバイルウォレット、取引所アカウント。いずれも設計上、署名鍵を
295
+ 渡しません。これらの場合は既定の鍵なしの経路を使ってください — すべてで動作します。
296
+
297
+ </details>
298
+
223
299
  ## 知っておく価値のある 3 つのルール
224
300
 
225
301
  - **入金アドレスは使い捨てです。** 古い注文、キャッシュされたレスポンス、スクリーンショット
@@ -244,6 +320,19 @@ https://checkout.rozo.ai/llms.txt を自分のコンテキストに読み込み
244
320
 
245
321
  ## 変更履歴
246
322
 
323
+ - **0.1.3** — 最初の実際の支払いで見つかった不具合の修正。ビルド済みバンドルが Node 22 以降で
324
+ `__filename is not defined` により停止しなくなりました(esbuild の banner が `require` に加えて
325
+ `__filename`/`__dirname` も定義し、テストが各バンドルを実際に実行するようになりました)。Stellar の
326
+ 入金では memo の種類(`MEMO_TEXT`。memo が数字に見える場合も同様)を明示します。注文の残り有効時間を
327
+ 入金ブロックと `status` の両方で継続時間として表示し("expires in 47m")、期限切れ時には新しい注文を
328
+ 作るコマンドをそのまま示します。既存の未払い注文の再利用と、それと異なる通貨を指定した場合の双方を、
329
+ エラーではなく説明として提示します。
330
+ - **0.1.2** — モード B で環境変数に生の秘密鍵を置く必要がなくなりました。Solana では
331
+ `solana-keygen` が既に作成した `~/.config/solana/id.json` を、EVM では暗号化された
332
+ V3 keystore(パスフレーズは対話的に入力)を使います。`--keyfile` でどちらも明示でき、
333
+ 設定は gitignore した `.env` に置くこともできます。環境変数の生の鍵は無人自動化向けに
334
+ 引き続き利用できます。鍵ファイルと `.env` は `chmod 600` かつ git 未追跡である必要が
335
+ あります。
247
336
  - **0.1.1** — 支出上限を 2 つから 1 つに変更しました。1 回の支払いは $1,100 を超えられず
248
337
  ($1,000 のクレジット購入とその 5% の手数料に合わせた値です)、セッション累計の上限と
249
338
  `--yes-large` による上書きは削除されました。自分のウォレットから支払う場合は鍵も設定も
package/docs/README.zh.md CHANGED
@@ -30,11 +30,20 @@ npx @rozoai/checkout pay <coinbase-link> --with usdt-solana
30
30
  | Polygon | `usdt-polygon` `usdc-polygon` | `137` | 6 位小数 |
31
31
  | Base | `usdc-base` | `8453` | 6 位小数 |
32
32
  | Solana | `usdt-solana` `usdc-solana` | `900` | SPL;不支持原生 SOL |
33
- | Stellar | `usdc-stellar` | `1500` | 必须带 memo —— 会在充值信息块里给出 |
33
+ | Stellar | `usdc-stellar` | `1500` | 必须带 `MEMO_TEXT` memo —— 会在充值信息块里给出 |
34
34
  | Bitcoin Lightning | `btc-lightning` | `lightning` | BOLT11;金额单位为聪 |
35
35
 
36
36
  原生 gas 币(SOL、BNB、ETH、MATIC)以及链上 BTC 均不接受。
37
37
 
38
+ ## 我需要什么钱包?
39
+
40
+ **一个钱包、一条链就够了——不需要每条链各准备一个。**从上面挑一种你已经持有的币,然后从它现在所在的地方付款即可。
41
+
42
+ - **任何钱包都可以,从交易所提币同样可以。**默认路径只是打印一段充值信息:按其中给出的 `amount`、`tokenSymbol`、`chain`,把钱发到 `receiverAddress` 即可。全程不需要连接任何网站,也不需要在浏览器里做任何授权。实践中大家在 EVM 链上用 MetaMask 或 Rabby,在 Solana 上用 Phantom 或 Solflare,付 BTC 时用 Phoenix、Wallet of Satoshi 之类的闪电钱包。
43
+ - **Stellar 是需要特别小心的那一条。**它的充值走的是共享地址加 `receiverMemo` 的方式,所以无论你从交易所还是钱包发出,都必须能填写 memo。漏掉 memo,这笔钱就丢了。
44
+ - **闪电网络付的是一张 invoice,不是地址。**扫描或粘贴 `deposit.lnInvoice` 即可,这条路径上没有可转账的地址。
45
+ - **只有 `--send` 需要私钥**,从 `ROZO_CHECKOUT_EVM_KEY` 或 `ROZO_CHECKOUT_SOL_KEY` 读取,且仅支持 EVM 链和 Solana。其余方式都不涉及私钥。
46
+
38
47
  ## 在你的 agent 里使用
39
48
 
40
49
  不管用哪个 agent,喂给它的东西都一样:上面那条命令,或者直接让它读
@@ -59,7 +68,7 @@ git clone https://github.com/RozoAI/rozo-checkout-skill ~/.claude/skills/rozo-ch
59
68
  npx @rozoai/checkout pay <coinbase-link> --with usdt-solana
60
69
  ```
61
70
 
62
- 钱包:任意钱包,**无需私钥**。只有当你想让 Claude 用热钱包签名时才加 `--send`,
71
+ 钱包:任意钱包,**无需私钥**。只有当你想让 Claude 用热钱包签名时才加 `--send`(用你的 Solana CLI 密钥对或加密 keystore),
63
72
  那一步才需要环境变量里的私钥。
64
73
  </details>
65
74
 
@@ -73,7 +82,7 @@ Codex 会读取项目根目录的 `AGENTS.md`。加一条常驻指令,它就
73
82
  npx @rozoai/checkout pay <coinbase-link> --with usdt-solana
74
83
  ```
75
84
 
76
- 钱包:任意钱包,**无需私钥**。`--send` 才需要环境变量里的私钥。
85
+ 钱包:任意钱包,**无需私钥**。只有 `--send` 需要,它用你的 Solana CLI 密钥对或加密 keystore 在本地签名;仅支持 EVM 链和 Solana —— Stellar 与闪电网络只能用模式 A。
77
86
  </details>
78
87
 
79
88
  <details>
@@ -86,7 +95,7 @@ OpenCode 同样读取项目根目录的 `AGENTS.md`,所以上面那段 Codex
86
95
  npx @rozoai/checkout pay <coinbase-link> --with usdt-solana
87
96
  ```
88
97
 
89
- 钱包:任意钱包,**无需私钥**。`--send` 才需要环境变量里的私钥。
98
+ 钱包:任意钱包,**无需私钥**。只有 `--send` 需要,它用你的 Solana CLI 密钥对或加密 keystore 在本地签名。
90
99
  </details>
91
100
 
92
101
  <details>
@@ -99,7 +108,7 @@ Cline 从项目根目录的 `.clinerules` 读取常驻指令:
99
108
  npx @rozoai/checkout pay <coinbase-link> --with usdt-solana
100
109
  ```
101
110
 
102
- 钱包:任意钱包,**无需私钥**。`--send` 才需要环境变量里的私钥。
111
+ 钱包:任意钱包,**无需私钥**。只有 `--send` 需要,它用你的 Solana CLI 密钥对或加密 keystore 在本地签名。
103
112
  </details>
104
113
 
105
114
  <details>
@@ -112,7 +121,7 @@ npx @rozoai/checkout pay <coinbase-link> --with usdt-solana
112
121
  npx @rozoai/checkout pay <coinbase-link> --with usdt-solana
113
122
  ```
114
123
 
115
- 钱包:任意钱包,**无需私钥**。`--send` 才需要环境变量里的私钥。
124
+ 钱包:任意钱包,**无需私钥**。只有 `--send` 需要,它用你的 Solana CLI 密钥对或加密 keystore 在本地签名。
116
125
  </details>
117
126
 
118
127
  <details>
@@ -126,7 +135,7 @@ Hermes Agent(Nous Research)有 shell 权限,也有自己的 skill 体系
126
135
  npx @rozoai/checkout pay <coinbase-link> --with usdt-solana
127
136
  ```
128
137
 
129
- 钱包:任意钱包,**无需私钥**。`--send` 才需要环境变量里的私钥。
138
+ 钱包:任意钱包,**无需私钥**。只有 `--send` 需要,它用你的 Solana CLI 密钥对或加密 keystore 在本地签名。
130
139
  </details>
131
140
 
132
141
  <details>
@@ -138,7 +147,7 @@ OpenClaw 的无头入口用来跑一次性任务,很适合从脚本或聊天
138
147
  openclaw agent exec "Pay this OpenRouter link with USDT on Solana by running: npx @rozoai/checkout pay <coinbase-link> --with usdt-solana"
139
148
  ```
140
149
 
141
- 钱包:任意钱包,**无需私钥**。`--send` 才需要环境变量里的私钥。
150
+ 钱包:任意钱包,**无需私钥**。只有 `--send` 需要,它用你的 Solana CLI 密钥对或加密 keystore 在本地签名。
142
151
  </details>
143
152
 
144
153
  <details>
@@ -152,7 +161,7 @@ Pi 是一个 BYOK 终端 agent,内置工具里就有 `bash`,可以直接执
152
161
  npx @rozoai/checkout pay <coinbase-link> --with usdt-solana
153
162
  ```
154
163
 
155
- 钱包:任意钱包,**无需私钥**。`--send` 才需要环境变量里的私钥。
164
+ 钱包:任意钱包,**无需私钥**。只有 `--send` 需要,它用你的 Solana CLI 密钥对或加密 keystore 在本地签名。
156
165
  </details>
157
166
 
158
167
  <details>
@@ -199,7 +208,67 @@ node scripts/dist/status.js --rozo-payment-id <uuid> --watch
199
208
  如果 agent 没有 shell 但能发 HTTP 请求,它可以直接调用那四个公开端点 —— 见
200
209
  [工作原理](how-it-works.md)。
201
210
 
202
- 钱包:任意钱包,**无需私钥**。`--send` 才需要环境变量里的私钥。
211
+ 钱包:任意钱包,**无需私钥**。只有 `--send` 需要,它用你的 Solana CLI 密钥对或加密 keystore 在本地签名。
212
+ </details>
213
+
214
+ <details>
215
+ <summary><b>为 <code>--send</code> 配置本地钱包</b> —— .env 模板与各钱包导出步骤</summary>
216
+
217
+ **默认路径不需要这里的任何东西。** 用你自己的钱包付款既不需要私钥也不需要任何配置,
218
+ 而且支持那些在这里根本用不了的钱包 —— 包括硬件钱包和交易所账户。
219
+
220
+ 在你运行命令的目录放一个 `.env`,下面列出了本工具会读取的全部变量:
221
+
222
+ ```bash
223
+ # 用你自己的钱包付款不需要下面任何一项。它们只在你使用 --send 时才被读取。
224
+
225
+ # Solana 私钥:base58 字符串,或 JSON 字节数组。只有在你没有
226
+ # ~/.config/solana/id.json(它会被自动识别)时才需要填。
227
+ ROZO_CHECKOUT_SOL_KEY=REPLACE_ME_base58_secret_key
228
+
229
+ # EVM 原始私钥:0x 加 64 位十六进制。这是最不安全的方式 —— 优先用下面的 keystore。
230
+ ROZO_CHECKOUT_EVM_KEY=0x0000000000000000000000000000000000000000000000000000000000000000
231
+
232
+ # EVM 加密 V3 keystore:文件路径。比上面的原始私钥更推荐。
233
+ ROZO_CHECKOUT_EVM_KEYSTORE=/replace/me/keystores/my-hot-wallet
234
+
235
+ # 该 keystore 的口令。只在无人值守时需要;在终端上会交互式提示,且不会被保存。
236
+ ROZO_CHECKOUT_KEYSTORE_PASSPHRASE=REPLACE_ME_not_a_real_passphrase
237
+
238
+ # 可选的 RPC 覆盖,按链 id 一条。8453 = Base,900 = Solana。
239
+ ROZO_CHECKOUT_RPC_8453=https://mainnet.base.org
240
+ ROZO_CHECKOUT_RPC_900=https://api.mainnet-beta.solana.com
241
+ ```
242
+
243
+ 然后锁好权限,并确保它不进 git:
244
+
245
+ ```bash
246
+ chmod 600 .env
247
+ echo '.env' >> .gitignore
248
+ ```
249
+
250
+ **Solana**
251
+
252
+ - `solana-keygen new` 会写出 `~/.config/solana/id.json`。什么都不用配 —— 它会被自动
253
+ 找到。这是我们推荐的方式。
254
+ - **Phantom** → Settings → Export Private Key 给出的是 **base58** 字符串,填进
255
+ `ROZO_CHECKOUT_SOL_KEY`。
256
+ - **Solflare** 新版本导出 base58 字符串,旧版本导出 JSON 字节数组。两种都可以直接用。
257
+
258
+ **EVM**
259
+
260
+ - **MetaMask** 和 **Rabby** → 导出私钥给出的是 64 位十六进制字符串。直接原样粘贴到
261
+ `ROZO_CHECKOUT_EVM_KEY` 即可;`0x` 前缀加不加都行。
262
+ - **加密 keystore(更安全)。** 浏览器钱包只能导出原始私钥,不能导出 keystore。
263
+ 想把私钥变成加密 keystore,可以用 Foundry:`cast wallet import my-hot-wallet
264
+ --interactive` 会提示你输入私钥,并把加密的 V3 keystore 写到
265
+ `~/.foundry/keystores/my-hot-wallet`(用 `--keystore-dir` 可改目录)。然后把
266
+ `ROZO_CHECKOUT_EVM_KEYSTORE` 指向该文件。`geth account import` 同样会生成 V3 keystore。
267
+
268
+ **不能用于 `--send` 的钱包:** 硬件钱包(Ledger、Trezor)、只支持 WalletConnect 的
269
+ 手机钱包,以及交易所账户。它们在设计上就不会交出签名私钥。这类用户请走默认的无私钥
270
+ 路径 —— 那条路对它们全都适用。
271
+
203
272
  </details>
204
273
 
205
274
  ## 三条必须知道的规则
@@ -223,6 +292,17 @@ node scripts/dist/status.js --rozo-payment-id <uuid> --watch
223
292
 
224
293
  ## 更新日志
225
294
 
295
+ - **0.1.3** —— 第一笔真实付款暴露出来的问题修复。构建产物在 Node 22+ 上不再因
296
+ `__filename is not defined` 崩溃(esbuild banner 现在同时注入 `__filename`/`__dirname`
297
+ 和 `require`,并且测试会真正执行每一个构建产物)。Stellar 充值现在会明确标出 memo
298
+ 类型(`MEMO_TEXT`,即使 memo 看起来是纯数字)。订单在充值信息块和 `status` 里都会以
299
+ 时长显示剩余有效期("expires in 47m"),过期时给出重新下单的完整命令。复用已有的未付
300
+ 订单、以及所选币种与已有订单不一致这两种情况,现在都会被解释清楚,而不是看起来像报错。
301
+ - **0.1.2** —— 模式 B 不再需要把原始私钥放进环境变量。Solana 直接用 `solana-keygen`
302
+ 已经写好的 `~/.config/solana/id.json`;EVM 用加密的 V3 keystore,口令交互式提示输入。
303
+ `--keyfile` 可以显式指定其中任一种,相关设置也可以放进已 gitignore 的 `.env`。
304
+ 环境变量里的原始私钥仍然可用于无人值守的自动化。密钥文件和 `.env` 必须
305
+ `chmod 600` 且不被 git 跟踪。
226
306
  - **0.1.1** —— 两条额度上限合并为一条:单笔付款不得超过 $1,100(按购买 $1,000
227
307
  额度加 5% 手续费来设定),单会话累计上限与 `--yes-large` 绕过开关均已移除。文档
228
308
  明确说明:用你自己的钱包付款不需要私钥,也不需要任何配置。
package/docs/safety.md CHANGED
@@ -58,9 +58,13 @@ reviewing or extending the code.
58
58
  never become a second transfer. Transactions are signed before broadcast so
59
59
  the hash is known in advance; on an ambiguous result the scripts look that
60
60
  exact transaction up instead of rebroadcasting.
61
- - **Hot-wallet controls.** Keys come from the environment only
62
- (`ROZO_CHECKOUT_EVM_KEY`, `ROZO_CHECKOUT_SOL_KEY`), are never printed and
63
- never accepted on the command line; library and RPC errors are redacted
61
+ - **Hot-wallet controls.** A signing key is read from a local key file (a
62
+ solana-keygen keypair, or an encrypted V3 keystore whose passphrase is
63
+ prompted) or from the environment for unattended runs. A key file that is
64
+ readable by other users, or tracked by git, is refused — as is a `.env`
65
+ carrying the same settings, which is parsed as plain text and never
66
+ evaluated by a shell. Keys and passphrases
67
+ are never accepted on the command line, and are never printed; library and RPC errors are redacted
64
68
  before display, including credential-bearing provider URLs, bearer tokens and
65
69
  key-shaped strings. The scripts refuse to run when any `.env`/`.env.*` in the
66
70
  working directory is git-tracked, and refuse just as hard when git cannot
package/llms.txt CHANGED
@@ -25,8 +25,40 @@ usdc-ethereum, usdt-polygon, usdc-polygon, usdc-base, usdc-stellar, btc-lightnin
25
25
 
26
26
  DEFAULT PATH NEEDS NO KEY: `pay` prints a deposit address for the user to pay from
27
27
  any wallet. No private key, no environment variable, no configuration. Only the
28
- optional --send flag signs locally, and only that flag reads
29
- ROZO_CHECKOUT_EVM_KEY / ROZO_CHECKOUT_SOL_KEY (from the environment, never argv).
28
+ optional --send flag signs locally. Its key comes from the first source that
29
+ exists: --keyfile <path>; then ~/.config/solana/id.json (the keypair
30
+ solana-keygen already wrote) for Solana or ROZO_CHECKOUT_EVM_KEYSTORE (an
31
+ encrypted V3 keystore, passphrase prompted, never argv) for EVM; then a raw key
32
+ in ROZO_CHECKOUT_SOL_KEY / ROZO_CHECKOUT_EVM_KEY, which is the unattended-
33
+ automation option. Those settings may also come from a .env in the working
34
+ directory (or --env-file <path>): only ROZO_CHECKOUT_* keys are read from it, it
35
+ is parsed as text and never shell-evaluated, and the real environment wins.
36
+ Key files and .env must be chmod 600 and untracked by git.
37
+
38
+ ## Local wallet setup for --send (not needed for the default keyless path)
39
+
40
+ .env keys (only ROZO_CHECKOUT_* are read; real env wins; chmod 600; gitignore):
41
+ ROZO_CHECKOUT_SOL_KEY base58 string OR JSON byte array
42
+ ROZO_CHECKOUT_EVM_KEY 64 hex chars, 0x prefix optional
43
+ ROZO_CHECKOUT_EVM_KEYSTORE path to an encrypted V3 keystore
44
+ ROZO_CHECKOUT_KEYSTORE_PASSPHRASE unattended runs only; else prompted
45
+ ROZO_CHECKOUT_RPC_<chainId> e.g. ROZO_CHECKOUT_RPC_8453 (Base),
46
+ ROZO_CHECKOUT_RPC_900 (Solana)
47
+
48
+ Where the material comes from:
49
+ - Solana: `solana-keygen new` -> ~/.config/solana/id.json, found automatically
50
+ (preferred). Phantom exports base58; Solflare exports base58 (current) or a
51
+ JSON byte array (older). Both accepted.
52
+ - EVM: MetaMask/Rabby export 64 hex chars with no 0x prefix; paste as-is, the
53
+ prefix is optional. For an encrypted keystore, Foundry's
54
+ `cast wallet import <name> --interactive` writes a V3 keystore to
55
+ ~/.foundry/keystores/<name>; `geth account import` also writes one. Browser
56
+ wallets do not export keystores, only raw keys.
57
+ - --send supports EVM chains and Solana ONLY. Stellar and Lightning are paid
58
+ from the user's own wallet (Mode A); there is no local signing for them.
59
+ - Hardware wallets, WalletConnect-only wallets and exchange accounts CANNOT be
60
+ used with --send. Those users take the default keyless path, which works with
61
+ any wallet.
30
62
  With --send, one limit applies: a single payment may not exceed $1,100, with no
31
63
  override; larger invoices go through the keyless path.
32
64
 
@@ -46,6 +78,12 @@ chainId "1" Ethereum (USDC, USDT) · "56" BNB Chain (USDC, USDT; 18-decimals) ·
46
78
  amounts in integer satoshis via source.amountUnit=="sats").
47
79
  Native SOL/ETH/BNB are NOT supported — stablecoins (or Lightning BTC) only.
48
80
 
81
+ WALLET: one wallet on one of these chains is enough — not one per chain. Any
82
+ wallet, or an exchange withdrawal, can fund the deposit address; nothing
83
+ connects to a site. Stellar is the exception that must be able to set a memo,
84
+ and Lightning pays a BOLT11 invoice rather than an address. Only --send needs a
85
+ private key (EVM and Solana only); every other path is keyless.
86
+
49
87
  ## Flow (4 HTTP calls, all public)
50
88
 
51
89
  1) Quote (read-only, safe):
@@ -72,7 +110,11 @@ Native SOL/ETH/BNB are NOT supported — stablecoins (or Lightning BTC) only.
72
110
  Pay EXACTLY source.amount of the requested token on the requested chain to
73
111
  source.receiverAddress, including every other field the block carries (Stellar
74
112
  routes on a shared hub address plus source.receiverMemo, so omitting the memo
75
- loses the payment).
113
+ loses the payment). The Stellar memo is ALWAYS MEMO_TEXT, even when it is all
114
+ digits (e.g. 65371582) — sending it as MEMO_ID produces a different memo and
115
+ the payment will not match. The deposit block reports this as
116
+ receiverMemoType. Orders expire: deposit.expiresIn / status expiry.expiresIn
117
+ give the remaining validity as a duration.
76
118
  For Lightning, pay the BOLT11 in source.lnInvoice (receiverAddress is empty).
77
119
 
78
120
  4) Poll until settled:
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@rozoai/checkout",
3
- "version": "0.1.1",
3
+ "version": "0.1.3",
4
4
  "type": "module",
5
5
  "description": "Pay an OpenRouter Coinbase Payment Link with BTC Lightning, or USDT/USDC on Solana, BNB Chain, Ethereum, Polygon, Base or Stellar.",
6
6
  "license": "MIT",