@rozoai/checkout 0.1.0 → 0.1.2
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/README.md +292 -214
- package/docs/QUICKSTART.es.md +338 -0
- package/docs/QUICKSTART.ja.md +315 -0
- package/docs/QUICKSTART.md +328 -0
- package/docs/QUICKSTART.zh.md +289 -0
- package/docs/README.es.md +348 -0
- package/docs/README.ja.md +337 -0
- package/docs/README.zh.md +307 -0
- package/docs/how-it-works.md +43 -0
- package/docs/safety.md +78 -0
- package/llms.txt +53 -7
- package/package.json +3 -8
- package/scripts/dist/cli.js +1526 -720
- package/scripts/dist/send-evm.js +6715 -6286
- package/scripts/dist/send-sol.js +1738 -674
- package/QUICKSTART.es.md +0 -192
- package/QUICKSTART.ja.md +0 -187
- package/QUICKSTART.md +0 -188
- package/QUICKSTART.zh.md +0 -178
- package/README.es.md +0 -287
- package/README.ja.md +0 -265
- package/README.zh.md +0 -187
package/README.md
CHANGED
|
@@ -1,269 +1,347 @@
|
|
|
1
1
|
# rozo-checkout
|
|
2
2
|
|
|
3
|
-
**English** | [简体中文](README.zh.md) | [日本語](README.ja.md) | [Español](README.es.md)
|
|
3
|
+
**English** | [简体中文](docs/README.zh.md) | [日本語](docs/README.ja.md) | [Español](docs/README.es.md)
|
|
4
4
|
|
|
5
|
-
|
|
5
|
+
Pay an **OpenRouter Coinbase Payment Link** with a coin that link cannot take
|
|
6
|
+
directly — BTC over Lightning, or USDT/USDC on Solana, BNB Chain, Ethereum,
|
|
7
|
+
Polygon, Base or Stellar. A Coinbase Payment Link only accepts USDC on Base;
|
|
8
|
+
this routes the coin you actually hold through a bridge, and a funder wallet
|
|
9
|
+
settles the invoice for you. No account, no API key, no browser.
|
|
10
|
+
|
|
11
|
+
```bash
|
|
12
|
+
npx @rozoai/checkout pay <coinbase-link>
|
|
13
|
+
```
|
|
14
|
+
|
|
15
|
+
It asks which coin you want to pay with — paste your wallet address at the
|
|
16
|
+
prompt and it will mark which coins you can actually afford — then prints a
|
|
17
|
+
deposit address for you to pay from any wallet — **no private key, no environment variable, no
|
|
18
|
+
configuration** — and waits until the invoice is settled.
|
|
19
|
+
|
|
20
|
+
Know your coin already? Skip the question:
|
|
6
21
|
|
|
7
22
|
```bash
|
|
8
23
|
npx @rozoai/checkout pay <coinbase-link> --with usdt-solana
|
|
9
24
|
```
|
|
10
25
|
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
|
|
26
|
+
## Coins you can pay with
|
|
27
|
+
|
|
28
|
+
| Chain | `--with` | Chain id | Notes |
|
|
29
|
+
|---|---|---|---|
|
|
30
|
+
| Ethereum | `usdt-ethereum` `usdc-ethereum` | `1` | 6 decimals |
|
|
31
|
+
| BNB Chain | `usdt-bnb` `usdc-bnb` | `56` | 18 decimals |
|
|
32
|
+
| Polygon | `usdt-polygon` `usdc-polygon` | `137` | 6 decimals |
|
|
33
|
+
| Base | `usdc-base` | `8453` | 6 decimals |
|
|
34
|
+
| Solana | `usdt-solana` `usdc-solana` | `900` | SPL; native SOL not supported |
|
|
35
|
+
| Stellar | `usdc-stellar` | `1500` | memo required — shown in the deposit block |
|
|
36
|
+
| Bitcoin Lightning | `btc-lightning` | `lightning` | BOLT11; amounts in satoshis |
|
|
37
|
+
|
|
38
|
+
Native gas coins (SOL, BNB, ETH, MATIC) and on-chain BTC are not accepted.
|
|
39
|
+
|
|
40
|
+
## Which wallet do I need?
|
|
41
|
+
|
|
42
|
+
**One wallet, on one chain — not one per chain.** Pick whichever coin above you
|
|
43
|
+
already hold and pay from wherever it already lives.
|
|
44
|
+
|
|
45
|
+
- **Any wallet works, and so does an exchange withdrawal.** The default path
|
|
46
|
+
just prints a deposit block: send exactly that `amount` of that
|
|
47
|
+
`tokenSymbol`, on that `chain`, to that `receiverAddress`. Nothing connects to
|
|
48
|
+
a site and nothing is approved in a browser. In practice people use MetaMask
|
|
49
|
+
or Rabby on the EVM chains, Phantom or Solflare on Solana, and a Lightning
|
|
50
|
+
wallet such as Phoenix or Wallet of Satoshi for BTC.
|
|
51
|
+
- **Stellar is the one to be careful with.** Its deposits route through a shared
|
|
52
|
+
address plus `receiverMemo`, so whatever you send from — exchange or wallet —
|
|
53
|
+
must let you set a memo. Omit it and the payment is lost.
|
|
54
|
+
- **Lightning pays an invoice, not an address.** Scan or paste
|
|
55
|
+
`deposit.lnInvoice`; there is no address to send to.
|
|
56
|
+
- **Only `--send` needs a private key**, read from `ROZO_CHECKOUT_EVM_KEY` or
|
|
57
|
+
`ROZO_CHECKOUT_SOL_KEY`, and it covers EVM chains and Solana only. Everything
|
|
58
|
+
else is keyless.
|
|
59
|
+
|
|
60
|
+
## Use it from your agent
|
|
61
|
+
|
|
62
|
+
The payload is the same everywhere: the one-liner above, or point the agent at
|
|
63
|
+
[llms.txt](llms.txt). Agents and scripts should always pass `--with` — the
|
|
64
|
+
picker only appears on a terminal, and there is deliberately no default coin. **Paying from your own wallet never needs a key.** Only
|
|
65
|
+
the optional `--send` flag signs locally: on Solana it uses the
|
|
66
|
+
`~/.config/solana/id.json` that `solana-keygen` already created, and on EVM an
|
|
67
|
+
encrypted JSON keystore whose passphrase is prompted. A raw key in the
|
|
68
|
+
environment (or a gitignored `.env`) still works for unattended automation.
|
|
69
|
+
|
|
70
|
+
<details>
|
|
71
|
+
<summary><b>Set up a local wallet for <code>--send</code></b> — .env template and per-wallet export steps</summary>
|
|
72
|
+
|
|
73
|
+
**None of this is needed for the default path.** Paying from your own wallet
|
|
74
|
+
needs no key and no configuration, and works with wallets that can never be
|
|
75
|
+
used here — including hardware wallets and exchange accounts.
|
|
76
|
+
|
|
77
|
+
A `.env` in the directory you run from, with every variable this tool reads:
|
|
78
|
+
|
|
79
|
+
```bash
|
|
80
|
+
# None of this is needed to pay from your own wallet. These are read only
|
|
81
|
+
# when you use --send.
|
|
82
|
+
|
|
83
|
+
# Solana secret key: a base58 string, or a JSON byte array. Only needed if you
|
|
84
|
+
# do NOT have ~/.config/solana/id.json, which is picked up automatically.
|
|
85
|
+
ROZO_CHECKOUT_SOL_KEY=REPLACE_ME_base58_secret_key
|
|
86
|
+
|
|
87
|
+
# EVM raw private key: 64 hex characters, 0x prefix optional. The least safe
|
|
88
|
+
# option — prefer the keystore below.
|
|
89
|
+
ROZO_CHECKOUT_EVM_KEY=0x0000000000000000000000000000000000000000000000000000000000000000
|
|
90
|
+
|
|
91
|
+
# EVM encrypted V3 keystore: path to the file. Preferred over the raw key.
|
|
92
|
+
ROZO_CHECKOUT_EVM_KEYSTORE=/replace/me/keystores/my-hot-wallet
|
|
93
|
+
|
|
94
|
+
# Passphrase for that keystore. Only for unattended runs; on a terminal you
|
|
95
|
+
# are prompted instead, and nothing is stored.
|
|
96
|
+
ROZO_CHECKOUT_KEYSTORE_PASSPHRASE=REPLACE_ME_not_a_real_passphrase
|
|
97
|
+
|
|
98
|
+
# Optional RPC overrides, one per chain id. 8453 = Base, 900 = Solana.
|
|
99
|
+
ROZO_CHECKOUT_RPC_8453=https://mainnet.base.org
|
|
100
|
+
ROZO_CHECKOUT_RPC_900=https://api.mainnet-beta.solana.com
|
|
48
101
|
```
|
|
49
102
|
|
|
50
|
-
|
|
103
|
+
Then lock it down and keep it out of git:
|
|
51
104
|
|
|
105
|
+
```bash
|
|
106
|
+
chmod 600 .env
|
|
107
|
+
echo '.env' >> .gitignore
|
|
52
108
|
```
|
|
53
|
-
|
|
54
|
-
|
|
55
|
-
|
|
56
|
-
|
|
57
|
-
|
|
58
|
-
|
|
59
|
-
|
|
60
|
-
|
|
61
|
-
|
|
62
|
-
|
|
63
|
-
|
|
64
|
-
|
|
65
|
-
|
|
66
|
-
|
|
67
|
-
|
|
68
|
-
|
|
109
|
+
|
|
110
|
+
**Solana**
|
|
111
|
+
|
|
112
|
+
- `solana-keygen new` writes `~/.config/solana/id.json`. Nothing to configure —
|
|
113
|
+
it is found automatically. This is the path we recommend.
|
|
114
|
+
- **Phantom** → Settings → Export Private Key gives a **base58** string. Put it
|
|
115
|
+
in `ROZO_CHECKOUT_SOL_KEY`.
|
|
116
|
+
- **Solflare** exports a base58 string in current versions and a JSON byte
|
|
117
|
+
array in older ones. Both are accepted as-is.
|
|
118
|
+
|
|
119
|
+
**EVM**
|
|
120
|
+
|
|
121
|
+
- **MetaMask** and **Rabby** → Export private key gives 64 hex characters.
|
|
122
|
+
Paste it into `ROZO_CHECKOUT_EVM_KEY` as-is; the `0x` prefix is optional.
|
|
123
|
+
- **Encrypted keystore (safer).** Browser wallets export raw keys, not
|
|
124
|
+
keystores. To turn one into an encrypted keystore, use Foundry:
|
|
125
|
+
`cast wallet import my-hot-wallet --interactive` prompts for the key and
|
|
126
|
+
writes an encrypted V3 keystore to `~/.foundry/keystores/my-hot-wallet`
|
|
127
|
+
(`--keystore-dir` changes where). Point `ROZO_CHECKOUT_EVM_KEYSTORE` at that
|
|
128
|
+
file. `geth account import` also produces a V3 keystore.
|
|
129
|
+
|
|
130
|
+
**Wallets that cannot be used with `--send`:** hardware wallets (Ledger,
|
|
131
|
+
Trezor), WalletConnect-only mobile wallets, and exchange accounts. None of them
|
|
132
|
+
hand over a signing key, by design. Use the default keyless path instead — it
|
|
133
|
+
works with all of them.
|
|
134
|
+
|
|
135
|
+
</details>
|
|
136
|
+
|
|
137
|
+
|
|
138
|
+
<details>
|
|
139
|
+
<summary><b>Claude Code</b> — install the skill, or paste the one-liner</summary>
|
|
140
|
+
|
|
141
|
+
This repo is a Claude Code skill: it ships `SKILL.md` plus the executables in
|
|
142
|
+
`scripts/dist/`. Clone it into your skills directory and Claude Code picks it
|
|
143
|
+
up automatically.
|
|
144
|
+
|
|
145
|
+
```bash
|
|
146
|
+
git clone https://github.com/RozoAI/rozo-checkout-skill ~/.claude/skills/rozo-checkout
|
|
69
147
|
```
|
|
70
148
|
|
|
71
|
-
|
|
149
|
+
Or skip the install and just ask it to run:
|
|
72
150
|
|
|
73
|
-
|
|
74
|
-
|
|
75
|
-
|
|
76
|
-
|
|
77
|
-
| `paymentLink` | a hosted pay page URL for the bridge order (human fallback) |
|
|
151
|
+
```
|
|
152
|
+
Pay this OpenRouter link with USDT on Solana:
|
|
153
|
+
npx @rozoai/checkout pay <coinbase-link> --with usdt-solana
|
|
154
|
+
```
|
|
78
155
|
|
|
79
|
-
|
|
156
|
+
Wallet: any wallet, no key. Add `--send` only if you want Claude to sign from a
|
|
157
|
+
hot wallet, which needs the env key.
|
|
158
|
+
</details>
|
|
80
159
|
|
|
81
|
-
|
|
82
|
-
|
|
83
|
-
| Ethereum | `1` | USDC, USDT | 6 decimals |
|
|
84
|
-
| BNB Chain | `56` | USDC, USDT | **18 decimals** — the usual source of off-by-10^12 bugs |
|
|
85
|
-
| Polygon | `137` | USDC, USDT | 6 decimals |
|
|
86
|
-
| Base | `8453` | USDC | 6 decimals |
|
|
87
|
-
| Solana | `900` | USDC, USDT | 6 decimals; SPL, may require a memo. Native SOL is **not** supported |
|
|
88
|
-
| Stellar | `1500` | USDC | 7 decimals; requires the memo |
|
|
89
|
-
| Bitcoin Lightning | `lightning` | BTC | amounts are integer **satoshis**, paid via a BOLT11 invoice |
|
|
160
|
+
<details>
|
|
161
|
+
<summary><b>Codex CLI</b> — AGENTS.md, or run it directly</summary>
|
|
90
162
|
|
|
91
|
-
|
|
163
|
+
Codex reads `AGENTS.md` from the project root. Add a standing instruction so it
|
|
164
|
+
knows how to pay without being told each time:
|
|
165
|
+
|
|
166
|
+
```
|
|
167
|
+
To pay an OpenRouter / Coinbase payment link, run:
|
|
168
|
+
npx @rozoai/checkout pay <coinbase-link> --with usdt-solana
|
|
169
|
+
```
|
|
92
170
|
|
|
93
|
-
|
|
171
|
+
Wallet: any wallet, no key. `--send` signs locally using your Solana CLI
|
|
172
|
+
keypair or an encrypted keystore.
|
|
173
|
+
</details>
|
|
94
174
|
|
|
95
|
-
|
|
175
|
+
<details>
|
|
176
|
+
<summary><b>OpenCode</b> — AGENTS.md, or run it directly</summary>
|
|
96
177
|
|
|
97
|
-
|
|
98
|
-
|
|
178
|
+
OpenCode also reads `AGENTS.md` from the project root, so the Codex snippet
|
|
179
|
+
above works unchanged. The shortest path is still the command itself:
|
|
99
180
|
|
|
100
181
|
```bash
|
|
101
|
-
|
|
102
|
-
|
|
103
|
-
|
|
182
|
+
npx @rozoai/checkout pay <coinbase-link> --with usdt-solana
|
|
183
|
+
```
|
|
184
|
+
|
|
185
|
+
Wallet: any wallet, no key. `--send` signs locally using your Solana CLI
|
|
186
|
+
keypair or an encrypted keystore.
|
|
187
|
+
</details>
|
|
188
|
+
|
|
189
|
+
<details>
|
|
190
|
+
<summary><b>Cline</b> — .clinerules, or run it directly</summary>
|
|
191
|
+
|
|
192
|
+
Cline reads standing instructions from `.clinerules` in the project root:
|
|
193
|
+
|
|
194
|
+
```
|
|
195
|
+
To pay an OpenRouter / Coinbase payment link, run:
|
|
196
|
+
npx @rozoai/checkout pay <coinbase-link> --with usdt-solana
|
|
197
|
+
```
|
|
104
198
|
|
|
105
|
-
|
|
106
|
-
|
|
107
|
-
|
|
108
|
-
-d "{\"url\":\"$LINK\"}"
|
|
199
|
+
Wallet: any wallet, no key. `--send` signs locally using your Solana CLI
|
|
200
|
+
keypair or an encrypted keystore.
|
|
201
|
+
</details>
|
|
109
202
|
|
|
110
|
-
|
|
111
|
-
|
|
112
|
-
curl -s -X POST "$MPP/create-invoice" \
|
|
113
|
-
-H 'content-type: application/json' \
|
|
114
|
-
-d "{\"url\":\"$LINK\",\"source\":{\"chainId\":\"900\",\"tokenSymbol\":\"USDT\"}}"
|
|
203
|
+
<details>
|
|
204
|
+
<summary><b>Cursor</b> — .cursor/rules, or run it directly</summary>
|
|
115
205
|
|
|
116
|
-
|
|
117
|
-
curl -s "$INTENTS/payments/<rozoPaymentId>"
|
|
206
|
+
Add a project rule at `.cursor/rules/rozo-checkout.mdc`:
|
|
118
207
|
|
|
119
|
-
|
|
120
|
-
|
|
208
|
+
```
|
|
209
|
+
To pay an OpenRouter / Coinbase payment link, run:
|
|
210
|
+
npx @rozoai/checkout pay <coinbase-link> --with usdt-solana
|
|
121
211
|
```
|
|
122
212
|
|
|
123
|
-
|
|
124
|
-
|
|
213
|
+
Wallet: any wallet, no key. `--send` signs locally using your Solana CLI
|
|
214
|
+
keypair or an encrypted keystore.
|
|
215
|
+
</details>
|
|
125
216
|
|
|
126
|
-
|
|
217
|
+
<details>
|
|
218
|
+
<summary><b>Hermes Agent</b> — run the one-liner in a session</summary>
|
|
219
|
+
|
|
220
|
+
Hermes Agent (Nous Research) has shell access and its own skill system. Start it
|
|
221
|
+
with `hermes` and ask:
|
|
222
|
+
|
|
223
|
+
```
|
|
224
|
+
Fetch https://checkout.rozo.ai/llms.txt, then pay this OpenRouter link:
|
|
225
|
+
npx @rozoai/checkout pay <coinbase-link> --with usdt-solana
|
|
226
|
+
```
|
|
127
227
|
|
|
128
|
-
|
|
228
|
+
Wallet: any wallet, no key. `--send` signs locally using your Solana CLI
|
|
229
|
+
keypair or an encrypted keystore.
|
|
230
|
+
</details>
|
|
231
|
+
|
|
232
|
+
<details>
|
|
233
|
+
<summary><b>OpenClaw</b> — openclaw agent exec</summary>
|
|
234
|
+
|
|
235
|
+
OpenClaw's headless entry point runs a one-off task, which suits a payment you
|
|
236
|
+
trigger from a script or a chat channel:
|
|
129
237
|
|
|
130
238
|
```bash
|
|
131
|
-
npx @rozoai/checkout
|
|
132
|
-
npx @rozoai/checkout pay <coinbase-link> --with usdt-solana
|
|
133
|
-
npx @rozoai/checkout status <rozoPaymentId>
|
|
239
|
+
openclaw agent exec "Pay this OpenRouter link with USDT on Solana by running: npx @rozoai/checkout pay <coinbase-link> --with usdt-solana"
|
|
134
240
|
```
|
|
135
241
|
|
|
136
|
-
|
|
137
|
-
|
|
138
|
-
|
|
139
|
-
output, and `--help` for everything else.
|
|
242
|
+
Wallet: any wallet, no key. `--send` signs locally using your Solana CLI
|
|
243
|
+
keypair or an encrypted keystore.
|
|
244
|
+
</details>
|
|
140
245
|
|
|
141
|
-
|
|
246
|
+
<details>
|
|
247
|
+
<summary><b>Pi</b> — run the one-liner in a session</summary>
|
|
142
248
|
|
|
143
|
-
|
|
144
|
-
the
|
|
249
|
+
Pi is a BYOK terminal agent whose built-in tools include `bash`, so it can run
|
|
250
|
+
the command directly. Start it with `pi` and ask:
|
|
145
251
|
|
|
146
|
-
|
|
147
|
-
|
|
252
|
+
```
|
|
253
|
+
Pay this OpenRouter link with USDT on Solana by running:
|
|
254
|
+
npx @rozoai/checkout pay <coinbase-link> --with usdt-solana
|
|
255
|
+
```
|
|
256
|
+
|
|
257
|
+
Wallet: any wallet, no key. `--send` signs locally using your Solana CLI
|
|
258
|
+
keypair or an encrypted keystore.
|
|
259
|
+
</details>
|
|
260
|
+
|
|
261
|
+
<details>
|
|
262
|
+
<summary><b>Terminal — no agent at all</b> — run the scripts step by step</summary>
|
|
263
|
+
|
|
264
|
+
Drive each step yourself. The bundles are self-contained; nothing to install
|
|
265
|
+
beyond Node 18+.
|
|
148
266
|
|
|
149
267
|
```bash
|
|
150
|
-
|
|
268
|
+
git clone https://github.com/RozoAI/rozo-checkout-skill && cd rozo-checkout-skill
|
|
269
|
+
LINK="https://payments.coinbase.com/payment-links/pl_01YOURLINKID"
|
|
270
|
+
|
|
271
|
+
# Read-only quote, costs nothing
|
|
151
272
|
node scripts/dist/quote.js --url "$LINK"
|
|
152
273
|
|
|
153
|
-
#
|
|
154
|
-
#
|
|
155
|
-
# masked summary to review, and `depositWithheld: true`.
|
|
274
|
+
# Create the order. The full deposit address is WITHHELD here; you get a
|
|
275
|
+
# masked summary to review first.
|
|
156
276
|
node scripts/dist/create-order.js --url "$LINK" --chain 900 --token USDT
|
|
157
277
|
|
|
158
|
-
#
|
|
159
|
-
# expiry. Only when you have decided to pay, re-run the same command
|
|
160
|
-
# with --confirm. This releases the full deposit block and records the
|
|
161
|
-
# confirmation the send scripts require.
|
|
278
|
+
# Once you have decided to pay, re-run with --confirm to release it
|
|
162
279
|
node scripts/dist/create-order.js --url "$LINK" --chain 900 --token USDT --confirm
|
|
163
280
|
|
|
164
|
-
#
|
|
165
|
-
|
|
166
|
-
node scripts/dist/status.js --rozo-payment-id <uuid> --watch --timeout 600
|
|
167
|
-
|
|
168
|
-
# Step 4b — Mode B: let the script pay from a hot wallet. --dry-run signs
|
|
169
|
-
# nothing; a real send additionally requires --send.
|
|
170
|
-
ROZO_CHECKOUT_SOL_KEY=<base58 secret key> \
|
|
171
|
-
node scripts/dist/send-sol.js --rozo-payment-id <uuid> --dry-run
|
|
281
|
+
# Pay the deposit block from any wallet, then watch it settle
|
|
282
|
+
node scripts/dist/status.js --rozo-payment-id <uuid> --watch
|
|
172
283
|
```
|
|
173
284
|
|
|
174
|
-
|
|
175
|
-
|
|
176
|
-
|
|
177
|
-
applies identically whichever entry point you use.
|
|
285
|
+
Each script prints exactly one JSON object on stdout. Exit `0` success, `1`
|
|
286
|
+
refused/failed (read `error.code`), `2` usage, `3` submitted but unconfirmed.
|
|
287
|
+
Full walkthrough: [QUICKSTART](docs/QUICKSTART.md).
|
|
178
288
|
|
|
179
|
-
|
|
289
|
+
Wallet: any wallet, no key. For hot-wallet sending see `send-evm.js` /
|
|
290
|
+
`send-sol.js`, which use your Solana CLI keypair or an encrypted keystore.
|
|
291
|
+
</details>
|
|
180
292
|
|
|
181
|
-
|
|
182
|
-
|
|
183
|
-
|
|
184
|
-
|
|
185
|
-
|
|
293
|
+
<details>
|
|
294
|
+
<summary><b>Any other agent</b> — point it at llms.txt</summary>
|
|
295
|
+
|
|
296
|
+
Any agent that can fetch a URL and run a command can do this:
|
|
297
|
+
|
|
298
|
+
```
|
|
299
|
+
Fetch https://checkout.rozo.ai/llms.txt into your context, then use it
|
|
300
|
+
to pay this OpenRouter link: <coinbase-link>
|
|
186
301
|
```
|
|
187
302
|
|
|
188
|
-
|
|
189
|
-
|
|
190
|
-
|
|
191
|
-
|
|
192
|
-
|
|
193
|
-
|
|
194
|
-
|
|
195
|
-
|
|
196
|
-
|
|
197
|
-
|
|
198
|
-
|
|
199
|
-
|
|
200
|
-
|
|
201
|
-
|
|
202
|
-
|
|
203
|
-
|
|
204
|
-
|
|
205
|
-
|
|
206
|
-
|
|
207
|
-
|
|
208
|
-
|
|
209
|
-
|
|
210
|
-
-
|
|
211
|
-
|
|
212
|
-
|
|
213
|
-
|
|
214
|
-
-
|
|
215
|
-
|
|
216
|
-
|
|
217
|
-
|
|
218
|
-
|
|
219
|
-
|
|
220
|
-
|
|
221
|
-
|
|
222
|
-
|
|
223
|
-
|
|
224
|
-
|
|
225
|
-
- **
|
|
226
|
-
|
|
227
|
-
|
|
228
|
-
|
|
229
|
-
- **
|
|
230
|
-
and the Coinbase expiry is more than a per-chain margin away (10 min EVM and
|
|
231
|
-
Stellar, 5 min Solana). Lightning additionally requires at least 10 minutes
|
|
232
|
-
of BOLT11 validity. A missing or unparsable deadline aborts.
|
|
233
|
-
- **Payability revalidation.** A quote receipt makes order creation skip the
|
|
234
|
-
live Coinbase check, and the link can be consumed by someone else at any
|
|
235
|
-
moment — so payability is re-checked immediately before the deposit address
|
|
236
|
-
is shown, and again as the very last step before broadcast, after all the RPC
|
|
237
|
-
preparation. Incomplete Coinbase state is treated as "cannot prove payable",
|
|
238
|
-
not as payable.
|
|
239
|
-
- **Compromised-address list, fail closed.** `scripts/src/lib/blacklist.json`
|
|
240
|
-
carries a vendored list with a provenance header and a sha256 over the
|
|
241
|
-
addresses. The digest proves only that this vendored copy has not been edited
|
|
242
|
-
since its sync date; it is not a signature by the upstream source. Both the
|
|
243
|
-
deposit address and the sending wallet are checked. If the file is missing,
|
|
244
|
-
malformed, empty, or its digest does not match, every send is refused rather
|
|
245
|
-
than proceeding unchecked.
|
|
246
|
-
- **Send-once, across processes.** Order state lives in
|
|
247
|
-
`$HOME/.rozo-checkout/state/<uuid>.json`, written atomically (temp file,
|
|
248
|
-
fsync, rename). Every read-modify-write of a state file — the claim, the
|
|
249
|
-
spend caps, the order record and the confirmation — runs inside one exclusive
|
|
250
|
-
lockfile, so two concurrent invocations can neither both decide they are
|
|
251
|
-
first, nor overwrite each other's send record. A send is claimed *before* broadcasting, so an ambiguous RPC error can
|
|
252
|
-
never become a second transfer. Transactions are signed before broadcast so
|
|
253
|
-
the hash is known in advance; on an ambiguous result the scripts look that
|
|
254
|
-
exact transaction up instead of rebroadcasting.
|
|
255
|
-
- **Hot-wallet controls.** Keys come from the environment only
|
|
256
|
-
(`ROZO_CHECKOUT_EVM_KEY`, `ROZO_CHECKOUT_SOL_KEY`), are never printed and
|
|
257
|
-
never accepted on the command line; library and RPC errors are redacted
|
|
258
|
-
before display, including credential-bearing provider URLs, bearer tokens and
|
|
259
|
-
key-shaped strings. The scripts refuse to run when any `.env`/`.env.*` in the
|
|
260
|
-
working directory is git-tracked, and refuse just as hard when git cannot
|
|
261
|
-
prove it is untracked. The RPC's chain id (or Solana genesis hash) and the token's
|
|
262
|
-
on-chain decimals are verified before signing. Caps: $100 per transaction,
|
|
263
|
-
$200 cumulative per session.
|
|
264
|
-
- **Address masking.** Prose shows `first6...last4`. The full deposit address,
|
|
265
|
-
memo and BOLT11 string appear only inside the machine-readable `deposit`
|
|
266
|
-
object, so they stay copy-pastable without being scattered through logs.
|
|
303
|
+
If the agent has no shell but can make HTTP requests, it can drive the four
|
|
304
|
+
public endpoints directly — see [how it works](docs/how-it-works.md).
|
|
305
|
+
|
|
306
|
+
Wallet: any wallet, no key. `--send` signs locally using your Solana CLI
|
|
307
|
+
keypair or an encrypted keystore.
|
|
308
|
+
</details>
|
|
309
|
+
|
|
310
|
+
## Three rules worth knowing
|
|
311
|
+
|
|
312
|
+
- **The deposit address is one-time.** Never reuse one from an older order, a
|
|
313
|
+
cached response or a screenshot.
|
|
314
|
+
- **Send the exact amount shown.** It is normally larger than the invoice — it
|
|
315
|
+
includes the bridge and network fees.
|
|
316
|
+
- **Never pay a funded order twice.** If a payment has already been detected,
|
|
317
|
+
stop and get a human to reconcile it; a second payment to a one-time address
|
|
318
|
+
is not guaranteed to be credited.
|
|
319
|
+
|
|
320
|
+
The full list of what this refuses to do, and why, is in
|
|
321
|
+
[docs/safety.md](docs/safety.md).
|
|
322
|
+
|
|
323
|
+
## Links
|
|
324
|
+
|
|
325
|
+
- [Quick start](docs/QUICKSTART.md) — the five commands, with expected output
|
|
326
|
+
- [How it works](docs/how-it-works.md) — the flow, the endpoints, the identifiers
|
|
327
|
+
- [Safety design](docs/safety.md) — every rail, in detail
|
|
328
|
+
- [SKILL.md](SKILL.md) — agent-facing instructions · [llms.txt](llms.txt) — one-file summary
|
|
329
|
+
- [checkout.rozo.ai/agent](https://checkout.rozo.ai/agent.html) — the same thing on the web
|
|
330
|
+
- [Issues](https://github.com/RozoAI/rozo-checkout-skill/issues) — bugs and requests
|
|
331
|
+
|
|
332
|
+
## Changelog
|
|
333
|
+
|
|
334
|
+
- **0.1.2** — Mode B no longer needs a raw private key in an environment
|
|
335
|
+
variable. On Solana it uses the `~/.config/solana/id.json` that
|
|
336
|
+
`solana-keygen` already wrote; on EVM an encrypted V3 keystore whose
|
|
337
|
+
passphrase is prompted. `--keyfile` names either explicitly, and settings can
|
|
338
|
+
come from a gitignored `.env`. Raw env keys still work for unattended
|
|
339
|
+
automation. Key files and `.env` must be `chmod 600` and untracked by git.
|
|
340
|
+
- **0.1.1** — one spend limit instead of two: a single payment may not exceed
|
|
341
|
+
$1,100 (sized for a $1,000 credit purchase plus its 5% fee), the cumulative
|
|
342
|
+
session cap and the `--yes-large` override are removed. Docs make it explicit
|
|
343
|
+
that paying from your own wallet needs no key or configuration.
|
|
344
|
+
- **0.1.0** — first release: `npx @rozoai/checkout`.
|
|
267
345
|
|
|
268
346
|
## License
|
|
269
347
|
|