@xona-labs/xpay 0.2.23 → 0.2.25

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.
Files changed (134) hide show
  1. package/CHANGELOG.md +133 -76
  2. package/README.md +95 -71
  3. package/SKILL.md +29 -22
  4. package/dist/agenc/api.d.ts +8 -8
  5. package/dist/agenc/api.js +11 -11
  6. package/dist/agenc/hire.d.ts +4 -4
  7. package/dist/agenc/hire.js +17 -17
  8. package/dist/agenc/price.d.ts +1 -1
  9. package/dist/agenc/price.js +1 -1
  10. package/dist/biometric/index.d.ts +3 -3
  11. package/dist/biometric/index.js +6 -6
  12. package/dist/cli/accounts.d.ts +1 -1
  13. package/dist/cli/accounts.js +1 -1
  14. package/dist/cli/agenc.d.ts +2 -2
  15. package/dist/cli/agenc.js +4 -4
  16. package/dist/cli/balance.d.ts +1 -1
  17. package/dist/cli/balance.d.ts.map +1 -1
  18. package/dist/cli/balance.js +11 -10
  19. package/dist/cli/balance.js.map +1 -1
  20. package/dist/cli/bento.d.ts +3 -3
  21. package/dist/cli/bento.js +8 -8
  22. package/dist/cli/bento.js.map +1 -1
  23. package/dist/cli/biometric.d.ts +1 -1
  24. package/dist/cli/biometric.js +8 -8
  25. package/dist/cli/common.js +6 -6
  26. package/dist/cli/common.js.map +1 -1
  27. package/dist/cli/discover.d.ts +2 -2
  28. package/dist/cli/discover.js +10 -4
  29. package/dist/cli/discover.js.map +1 -1
  30. package/dist/cli/guardrail.d.ts +1 -1
  31. package/dist/cli/guardrail.js +3 -3
  32. package/dist/cli/index.d.ts +2 -2
  33. package/dist/cli/index.js +12 -12
  34. package/dist/cli/init.d.ts +1 -1
  35. package/dist/cli/init.js +2 -2
  36. package/dist/cli/magicblock.d.ts +1 -1
  37. package/dist/cli/magicblock.js +4 -4
  38. package/dist/cli/mcp-server.d.ts +2 -2
  39. package/dist/cli/mcp-server.js +21 -21
  40. package/dist/cli/pay.d.ts +1 -1
  41. package/dist/cli/pay.js +1 -1
  42. package/dist/cli/report.d.ts +2 -2
  43. package/dist/cli/report.js +4 -4
  44. package/dist/cli/report.js.map +1 -1
  45. package/dist/cli/sana.d.ts +1 -1
  46. package/dist/cli/sana.js +3 -3
  47. package/dist/cli/shop.d.ts +1 -1
  48. package/dist/cli/shop.js +1 -1
  49. package/dist/cli/swap.d.ts +1 -1
  50. package/dist/cli/swap.js +3 -3
  51. package/dist/cli/token.d.ts +2 -2
  52. package/dist/cli/token.js +2 -2
  53. package/dist/cli/trade.d.ts +2 -2
  54. package/dist/cli/trade.js +8 -8
  55. package/dist/cli/trade.js.map +1 -1
  56. package/dist/cli/transfer.d.ts +1 -1
  57. package/dist/cli/transfer.js +1 -1
  58. package/dist/cli/x.d.ts +1 -1
  59. package/dist/cli/x.js +1 -1
  60. package/dist/cli/zauth.d.ts +1 -1
  61. package/dist/cli/zauth.js +5 -5
  62. package/dist/discover/cache.js +1 -1
  63. package/dist/discover/index.d.ts +2 -2
  64. package/dist/discover/index.d.ts.map +1 -1
  65. package/dist/discover/index.js +21 -7
  66. package/dist/discover/index.js.map +1 -1
  67. package/dist/discover/orbitx402.d.ts +2 -2
  68. package/dist/discover/orbitx402.js +1 -1
  69. package/dist/discover/payai.js +1 -1
  70. package/dist/do/index.d.ts +2 -2
  71. package/dist/do/index.js +1 -1
  72. package/dist/guardrail/index.d.ts +4 -4
  73. package/dist/guardrail/index.js +14 -14
  74. package/dist/guardrail/index.js.map +1 -1
  75. package/dist/index.d.ts +7 -7
  76. package/dist/index.js +2 -2
  77. package/dist/magicblock/client.d.ts +2 -2
  78. package/dist/magicblock/client.js +4 -4
  79. package/dist/profile/index.d.ts +3 -3
  80. package/dist/profile/index.d.ts.map +1 -1
  81. package/dist/profile/index.js +13 -4
  82. package/dist/profile/index.js.map +1 -1
  83. package/dist/profile/storage.d.ts +1 -1
  84. package/dist/profile/storage.js +4 -4
  85. package/dist/profile/types.d.ts +6 -6
  86. package/dist/profile/types.js +1 -1
  87. package/dist/report/index.d.ts +1 -1
  88. package/dist/report/index.js +2 -2
  89. package/dist/sana/tools.js +8 -8
  90. package/dist/signers/raw-evm.d.ts +1 -1
  91. package/dist/signers/raw-evm.d.ts.map +1 -1
  92. package/dist/signers/raw-evm.js +22 -7
  93. package/dist/signers/raw-evm.js.map +1 -1
  94. package/dist/signers/raw-solana.d.ts +1 -1
  95. package/dist/signers/raw-solana.js +4 -4
  96. package/dist/swap/index.d.ts +6 -6
  97. package/dist/swap/index.js +12 -12
  98. package/dist/token/index.d.ts +8 -8
  99. package/dist/token/index.js +14 -14
  100. package/dist/token/rwa.d.ts +3 -3
  101. package/dist/token/rwa.js +3 -3
  102. package/dist/tools/index.d.ts +1 -1
  103. package/dist/tools/index.d.ts.map +1 -1
  104. package/dist/tools/index.js +46 -41
  105. package/dist/tools/index.js.map +1 -1
  106. package/dist/trading/discovery.d.ts +6 -6
  107. package/dist/trading/discovery.js +7 -7
  108. package/dist/trading/index.d.ts +6 -6
  109. package/dist/trading/index.js +13 -13
  110. package/dist/transfer/index.d.ts +6 -5
  111. package/dist/transfer/index.d.ts.map +1 -1
  112. package/dist/transfer/index.js +41 -21
  113. package/dist/transfer/index.js.map +1 -1
  114. package/dist/types.d.ts +10 -6
  115. package/dist/types.d.ts.map +1 -1
  116. package/dist/types.js.map +1 -1
  117. package/dist/use/index.d.ts +5 -5
  118. package/dist/use/index.js +24 -20
  119. package/dist/use/index.js.map +1 -1
  120. package/dist/wallet/index.d.ts +2 -2
  121. package/dist/wallet/index.d.ts.map +1 -1
  122. package/dist/wallet/index.js +5 -3
  123. package/dist/wallet/index.js.map +1 -1
  124. package/dist/x402/evm-payment.d.ts +4 -4
  125. package/dist/x402/evm-payment.d.ts.map +1 -1
  126. package/dist/x402/evm-payment.js +7 -6
  127. package/dist/x402/evm-payment.js.map +1 -1
  128. package/dist/x402/extract.d.ts +1 -1
  129. package/dist/x402/extract.js +1 -1
  130. package/dist/x402/svm-payment.d.ts +2 -2
  131. package/dist/x402/svm-payment.js +2 -2
  132. package/dist/zauth/index.d.ts +4 -4
  133. package/dist/zauth/index.js +5 -5
  134. package/package.json +6 -3
package/CHANGELOG.md CHANGED
@@ -6,6 +6,63 @@ versioning follows [Semantic Versioning](https://semver.org/).
6
6
 
7
7
  ## [Unreleased]
8
8
 
9
+ ## [0.2.25] – 2026-08-07
10
+
11
+ ### Changed
12
+ - **Rebranded to Xona Wallet.** The product name in the README, SKILL.md, and
13
+ on the site is now "Xona Wallet". The SDK surface is deliberately unchanged:
14
+ the npm package is still `@xona-labs/xpay`, the CLI is still `xpay`, the MCP
15
+ tools are still `xpay_*`, and the registry entry is still
16
+ `io.github.xona-labs/xpay`. Nothing to migrate.
17
+ - Site moved from `xpay.xona-agent.com` to `wallet.xona-agent.com`. The npm
18
+ `homepage` and the registry `websiteUrl` point at the new domain. The hosted
19
+ MCP endpoint is now `https://wallet.xona-agent.com/mcp`.
20
+ - Registry and npm metadata now carry the brand: `server.json` description is
21
+ "Xona Wallet: agent wallet for AI agents..." (82 chars, under the registry's
22
+ 100-char cap) and `xona-wallet` was added to the npm keywords. The former
23
+ name stays indexed on the site, since every existing link says xpay.
24
+ - Copy no longer uses em-dashes anywhere: docs, site, code comments, and
25
+ user-facing strings such as CLI output and error messages.
26
+
27
+ ### Note
28
+ - 0.2.24 shipped to npm but was never tagged `v0.2.24`, so the MCP Registry
29
+ never picked it up and stayed on 0.2.23. Tagging `v0.2.25` carries both the
30
+ Stable chain release and this one to the registry in a single publish.
31
+
32
+ ## [0.2.24] – 2026-08-07
33
+
34
+ ### Added
35
+ - **Stable chain (eip155:988) as a first-class wallet network.** xpay is now
36
+ an agent wallet on Tether/Bitfinex's payments L1, matching xona's
37
+ `/stable/*` x402 route family. It settles **USDT0**
38
+ (`0x779Ded0c9e1022225f8E0630b35a9b54bE713736`, 6 decimals as an ERC-20)
39
+ rather than USDC.
40
+ - A Stable signer is registered on every profile from the existing derived
41
+ EVM key, same treatment as Robinhood Chain, so `stable` works without
42
+ re-running `xpay init` or editing `networks`.
43
+ - `xpay balance` / `xpay_balance` show a `stable` row: USDT0 plus the native
44
+ USDT gas coin (18 decimals, listed separately since the two share a name).
45
+ USDT0 counts toward the stablecoin total.
46
+ - Payment routing: a 402 quoting `eip155:988` resolves to the Stable signer,
47
+ and the balance-aware picker compares USDT0 against the quoted price.
48
+ Payment stays gasless - the EIP-3009 typed-data path reads USDT0's EIP-712
49
+ domain (`USDT0` / `1`) from the live challenge's `extra`, which is the only
50
+ reliable source since `version()` and `eip712Domain()` revert on that
51
+ contract.
52
+ - `xpay transfer --network stable` sends USDT0. Accepts `USDT0`, `USDT`, or
53
+ `USDC` as the token name on that chain.
54
+ - RPC override via profile `rpcs.stable` (default `https://rpc.stable.xyz`).
55
+
56
+ ### Fixed
57
+ - `discover({ networks })` / `--network` now resolve named EVM slugs to the
58
+ CAIP-2 ids catalogs actually publish. `--network base` previously matched
59
+ nothing, since every EVM listing carries `eip155:8453`.
60
+ - EVM network auto-detection in `transfer` now considers only networks the
61
+ profile opted into, instead of a hardcoded list. Always-registered signers
62
+ (Robinhood, Stable) no longer make every EVM transfer ambiguous, and a
63
+ profile configured for an EVM chain outside the old literal is no longer
64
+ reported as having no EVM signer.
65
+
9
66
  ## [0.2.23] – 2026-08-02
10
67
 
11
68
  ### Added
@@ -75,7 +132,7 @@ versioning follows [Semantic Versioning](https://semver.org/).
75
132
  boots in a **locked mode** instead: the connection succeeds, all tools are
76
133
  listed, and every call returns an actionable error telling the user exactly
77
134
  how to unlock (add `XPAY_PASSPHRASE` to the server's `env` in the host
78
- config, or `xpay biometric enable` on macOS) which the agent can relay
135
+ config, or `xpay biometric enable` on macOS) - which the agent can relay
79
136
  in-chat. Any other boot failure also falls back to locked mode with the
80
137
  underlying error, instead of killing the connection.
81
138
 
@@ -93,8 +150,8 @@ versioning follows [Semantic Versioning](https://semver.org/).
93
150
  ### Fixed
94
151
  - **EVM x402 payments demanded native ETH gas despite the scheme being
95
152
  gasless.** Paying an `eip155:*` endpoint (e.g. xona's Base video routes)
96
- went through the legacy v1 path a literal `erc20.transfer()` broadcast
97
- from the wallet so gasless agent wallets died with "insufficient funds
153
+ went through the legacy v1 path, a literal `erc20.transfer()` broadcast
154
+ from the wallet, so gasless agent wallets died with "insufficient funds
98
155
  for intrinsic transaction cost". EVM now gets the same canonical v2
99
156
  treatment Solana has had since 0.1.4: the client signs an off-chain
100
157
  EIP-3009 `transferWithAuthorization` (EIP-712), sends it in `X-Payment`,
@@ -102,14 +159,14 @@ versioning follows [Semantic Versioning](https://semver.org/).
102
159
 
103
160
  ### Added
104
161
  - `Signer.signEvmTypedData` (optional capability, implemented by
105
- `rawEvmSigner`) EIP-712 typed-data signing; custom KMS/MPC signers can
162
+ `rawEvmSigner`) - EIP-712 typed-data signing; custom KMS/MPC signers can
106
163
  implement it to opt into gasless EVM payments.
107
164
  - `buildEvmPaymentHeader` / `isEvmNetwork` / `hasEvmDomainParams` in
108
165
  `src/x402/evm-payment.ts`, mirroring the SVM v2 header builder.
109
166
 
110
167
  ### Changed
111
168
  - Catalog-mode `use()` now falls back to the live 402 challenge for EVM
112
- requirements missing EIP-712 domain params (`extra.name`/`version`)
169
+ requirements missing EIP-712 domain params (`extra.name`/`version`) -
113
170
  catalog snapshots strip `extra`, and without the domain the gasless
114
171
  signature can't be built (previously this silently took the gas-burning
115
172
  legacy path). Same pattern as the existing SVM `feePayer` fallback.
@@ -121,7 +178,7 @@ versioning follows [Semantic Versioning](https://semver.org/).
121
178
  parameter (`['agenc']` / `['orbitx402']`) and the CLI gains
122
179
  `xpay discover --sources agenc`. Mixed results reserve only ~1/3 of the
123
180
  result slots for AgenC (2 of the default 5), which made "show me AgenC
124
- listings" look like the marketplace had two items a single-source browse
181
+ listings" look like the marketplace had two items - a single-source browse
125
182
  now returns everything (default limit 50), and the tool description tells
126
183
  agents to use it when the user asks about AgenC specifically.
127
184
 
@@ -136,7 +193,7 @@ versioning follows [Semantic Versioning](https://semver.org/).
136
193
 
137
194
  ### Changed
138
195
  - **AgenC reads now use the SDK's hosted-indexer client** (`createIndexerClient`
139
- → `listActiveListings` / `getListing`) AgenC's documented "intended scale
196
+ → `listActiveListings` / `getListing`) - AgenC's documented "intended scale
140
197
  read path". Discovery is back to the full active catalog; the freshness
141
198
  check is a single typed lookup. SDK bumped `^0.8.0` → `^0.10.0`.
142
199
  - **Hires are now resilient to AgenC program upgrades.** The moderation
@@ -152,7 +209,7 @@ versioning follows [Semantic Versioning](https://semver.org/).
152
209
 
153
210
  ### Fixed
154
211
  - **zauth reposcan polling broke after the first check.** zauth's poll
155
- responses echo only `{ status, scanId, progress }` no `sessionToken`
212
+ responses echo only `{ status, scanId, progress }`, no `sessionToken`,
156
213
  so the scanning check never matched: the poll loop exited immediately and
157
214
  the MCP result dropped the sessionToken, leaving agents with just the
158
215
  scanId. Agents then passed the scanId to `xpay_zauth_scan_status` and got
@@ -166,14 +223,14 @@ versioning follows [Semantic Versioning](https://semver.org/).
166
223
  per scan (Solana or Base); session tokens are JWTs valid ~1 hour.
167
224
  - Completed zauth reports are compacted for MCP/CLI display: the bulky
168
225
  `matches` array (full file contents, tens of KB) is replaced by a
169
- `matchCount` `analysisMarkdown` + `zauthScore` carry the summary.
226
+ `matchCount` - `analysisMarkdown` + `zauthScore` carry the summary.
170
227
  `xpay zauth reposcan --json` still emits the full raw report.
171
228
 
172
229
  ## [0.2.11] – 2026-07-06
173
230
 
174
231
  ### Added
175
232
  - **zauth repo security scans (partner integration).** `xpay zauth reposcan
176
- <repoUrl>` CLI and `xpay_zauth_reposcan` MCP tool scans a git repository
233
+ <repoUrl>` CLI and `xpay_zauth_reposcan` MCP tool - scans a git repository
177
234
  via zauth's x402-paywalled endpoint through the normal payment flow
178
235
  (guardrail caps apply; price set by zauth's 402 challenge). Only the scan
179
236
  kickoff is paid: results are polled from a free status endpoint, with
@@ -185,8 +242,8 @@ versioning follows [Semantic Versioning](https://semver.org/).
185
242
 
186
243
  ### Fixed
187
244
  - **Token-2022 balances were invisible.** `tokenBalances()` only scanned the
188
- classic SPL token program, so tokens on the Token-2022 program including
189
- most pump.fun mints never appeared in `xpay balance` / `xpay_balance`,
245
+ classic SPL token program, so tokens on the Token-2022 program, including
246
+ most pump.fun mints, never appeared in `xpay balance` / `xpay_balance`,
190
247
  even right after swapping into them. Both token programs are scanned now,
191
248
  and the 0.2.9 Jupiter enrichment labels and prices them.
192
249
 
@@ -198,18 +255,18 @@ versioning follows [Semantic Versioning](https://semver.org/).
198
255
  built-in registry displayed as a truncated mint with no price. Balances are
199
256
  now enriched via one batched Jupiter lookup: real symbol/name for unknown
200
257
  mints, per-token `usdValue`, a portfolio total, and an `⚠ unverified` flag
201
- on suspicious tokens. Fails soft if Jupiter is unreachable, balances
258
+ on suspicious tokens. Fails soft - if Jupiter is unreachable, balances
202
259
  render exactly as before. New SDK export: `enrichTokenBalances()`.
203
260
 
204
261
  ## [0.2.8] – 2026-07-04
205
262
 
206
263
  ### Added
207
264
  - **Realtime X (Twitter) data, zero setup.** `xpay x user <handle>` /
208
- `xpay x posts <handle>` CLI and `xpay_x_user` / `xpay_x_posts` MCP tools
265
+ `xpay x posts <handle>` CLI and `xpay_x_user` / `xpay_x_posts` MCP tools -
209
266
  live profile (followers, bio, verification) and recent posts with
210
267
  engagement metrics. Calls xona's x402-paywalled proxy of the X API v2 and
211
268
  pays per call from the wallet at **cost price** (~$0.01 profile, ~$0.06 for
212
- 10 posts passthrough of X's pay-per-use billing, no markup). No X
269
+ 10 posts - passthrough of X's pay-per-use billing, no markup). No X
213
270
  developer account or API key needed; guardrail caps apply like any paid
214
271
  call. Endpoint override: `XPAY_XDATA_ENDPOINT`.
215
272
 
@@ -220,7 +277,7 @@ versioning follows [Semantic Versioning](https://semver.org/).
220
277
  a code-execution tool sometimes hand-rolled swap scripts (bypassing the
221
278
  guardrail and token-verification safety) instead of calling the tool. The
222
279
  descriptions now explicitly forbid custom swap code and state that
223
- `xpay_swap` is the single quote+sign+execute step while also making clear
280
+ `xpay_swap` is the single quote+sign+execute step - while also making clear
224
281
  that `xpay_token_find` alone answers informational questions and a swap
225
282
  must never follow automatically unless the user asked to trade.
226
283
 
@@ -228,11 +285,11 @@ versioning follows [Semantic Versioning](https://semver.org/).
228
285
 
229
286
  ### Added
230
287
  - **Solana token discovery.** `xpay token find <query>` / `xpay.findTokens()` /
231
- MCP `xpay_token_find` search any Solana token by ticker, name, or mint via
288
+ MCP `xpay_token_find` - search any Solana token by ticker, name, or mint via
232
289
  Jupiter Token API v2 (keyless). Returns price, market cap, liquidity, and
233
290
  Jupiter's verification flag, ranked verified-first.
234
291
  - **Native token swap.** `xpay swap <amount> <from> <to>` / `xpay.swap()` /
235
- MCP `xpay_swap` swap tokens inside the user's own wallet via Jupiter Swap
292
+ MCP `xpay_swap` - swap tokens inside the user's own wallet via Jupiter Swap
236
293
  API v2 (order → partial-sign → managed execute; keyless). Accepts symbols or
237
294
  mint addresses; bare tickers resolve only to verified tokens (ambiguous
238
295
  tickers error with a candidate list; unverified tokens require the exact
@@ -248,7 +305,7 @@ versioning follows [Semantic Versioning](https://semver.org/).
248
305
 
249
306
  ### Fixed
250
307
  - SKILL.md still documented the removed `xpay_transfer_confirm` staging flow
251
- (dropped in 0.2.2) rewritten for direct execution with guardrail gating.
308
+ (dropped in 0.2.2) - rewritten for direct execution with guardrail gating.
252
309
 
253
310
  ## [0.2.5] – 2026-07-04
254
311
 
@@ -258,7 +315,7 @@ versioning follows [Semantic Versioning](https://semver.org/).
258
315
  `moderator` argument in the hire instruction (P1.2 moderation gate) that
259
316
  SDK 0.7.1 predates. Bumped `@tetsuo-ai/marketplace-sdk` to `^0.8.0` and
260
317
  made the hire path resolve the listing's on-chain moderation record
261
- (`["listing_moderation", listing, specHash]` PDA derivable without
318
+ (`["listing_moderation", listing, specHash]` PDA - derivable without
262
319
  knowing the moderator; the record itself names the moderator), passing
263
320
  `moderator` + the explicit `listingModeration` account. Verified against
264
321
  mainnet by transaction simulation (executes cleanly end-to-end) and against
@@ -277,17 +334,17 @@ Re-release of 0.2.3 with no code changes (registry hygiene).
277
334
  - **AgenC marketplace (agenc.ag) as a discovery source with smart-routed
278
335
  execution.** Hireable AgenC listings now appear in `xpay discover` /
279
336
  `xpay_discover` alongside x402 services (marked `metadata.source: "agenc"`,
280
- priced in SOL). Discovery merges sources with failure isolation one
281
- catalog going down no longer breaks discovery and reserves result slots so
337
+ priced in SOL). Discovery merges sources with failure isolation, one
338
+ catalog going down no longer breaks discovery, and reserves result slots so
282
339
  marketplace listings aren't drowned out by the 21k-item x402 catalog. Opt
283
340
  out with `XPAY_DISCOVERY_SOURCES=orbitx402` or `discover({ sources })`.
284
341
  - **Smart execution routing in `use()`.** AgenC resources are detected by
285
342
  their `agenc-hire` payment scheme and executed as on-chain SOL escrow hires
286
- via `@tetsuo-ai/marketplace-sdk` (humanless entry point tasks pin to
343
+ via `@tetsuo-ai/marketplace-sdk` (humanless entry point - tasks pin to
287
344
  CreatorReview, so escrow never auto-releases without the buyer's
288
345
  acceptance). x402 resources keep the existing payment path; same
289
346
  `use()`/`do()` API for both. The result of a hire is a receipt
290
- (`task`, `hireRecord`, `txSig`, explorer link) the provider works
347
+ (`task`, `hireRecord`, `txSig`, explorer link) - the provider works
291
348
  asynchronously.
292
349
  - **CLI `xpay agenc hire <listingPda>` / `xpay agenc status <taskPda>`** and
293
350
  MCP tool `xpay_agenc_status` for tracking hire progress.
@@ -297,7 +354,7 @@ Re-release of 0.2.3 with no code changes (registry hygiene).
297
354
  while caps are configured.
298
355
  - Examples: `examples/agenc-hire.ts` (live discover → hire → poll) and
299
356
  `examples/agenc-local-sandbox.ts` (full hire lifecycle against the real
300
- compiled program in-process via litesvm no RPC, no SOL spent).
357
+ compiled program in-process via litesvm - no RPC, no SOL spent).
301
358
 
302
359
  ### Changed
303
360
  - `@solana/kit` bumped `^5.5.1` → `^6.9.0` (required by the AgenC SDK;
@@ -311,7 +368,7 @@ Re-release of 0.2.3 with no code changes (registry hygiene).
311
368
  and return a 6-digit code, requiring a second `xpay_transfer_confirm` call to
312
369
  actually move funds. Agents routinely skipped the follow-up call, read the
313
370
  `"Transfer staged…"` response as a receipt, and reported success with a
314
- **hallucinated transaction hash** a hash that never hit the chain (not on
371
+ **hallucinated transaction hash** - a hash that never hit the chain (not on
315
372
  Solscan, no funds moved). This affected private (MagicBlock PER) transfers in
316
373
  particular. The terminal path was never affected because it executes directly.
317
374
  `xpay_transfer` now runs the same direct path as the CLI, and
@@ -321,7 +378,7 @@ Re-release of 0.2.3 with no code changes (registry hygiene).
321
378
  - **The transfer spending gate no longer depends on the agent making a second
322
379
  tool call.** Safety comes from the guardrail (per-tx / per-day caps +
323
380
  `requireApprovalAbove`), which on MCP surfaces as a Touch ID prompt when
324
- biometric unlock is enabled a gate the model cannot fake or skip. Set
381
+ biometric unlock is enabled - a gate the model cannot fake or skip. Set
325
382
  `xpay guardrail --require-approval-above 0` with biometric enabled to require
326
383
  approval on every transfer.
327
384
 
@@ -333,7 +390,7 @@ Re-release of 0.2.3 with no code changes (registry hygiene).
333
390
  on-chain wallet registration, and the ALLOW / BLOCKED / ESCALATED verdicts),
334
391
  the MCP tool list re-includes `xpay_bento_status` / `xpay_bento_enable` /
335
392
  `xpay_bento_disable`, and SKILL.md re-adds the tools plus a safety note. No
336
- code change the firewall shipped in 0.1.28; this release publishes the docs
393
+ code change - the firewall shipped in 0.1.28; this release publishes the docs
337
394
  to npm.
338
395
 
339
396
  ## [0.2.0] – 2026-06-23
@@ -342,10 +399,10 @@ Milestone release consolidating the 0.1.24–0.1.31 line into four themes.
342
399
 
343
400
  ### Easiest onboarding
344
401
  - **Zero-config wallet provisioning.** Drop the MCP server into any agent host
345
- with no env the agent is given its own persistent wallet on first boot
402
+ with no env - the agent is given its own persistent wallet on first boot
346
403
  (address printed to stderr to fund). Bring-your-own-key and existing profiles
347
404
  still take precedence.
348
- - **`SKILL.md`** a framework-agnostic guide so any agent (Claude, Codex,
405
+ - **`SKILL.md`**: a framework-agnostic guide so any agent (Claude, Codex,
349
406
  OpenAI, Gemini, custom) can drive xPay's tools, kept current with this release.
350
407
 
351
408
  ### Smart pay routing
@@ -364,14 +421,14 @@ Milestone release consolidating the 0.1.24–0.1.31 line into four themes.
364
421
 
365
422
  ### Reporting
366
423
  - Comprehensive on-chain USDC usage report (daily / weekly / monthly) via
367
- OrbitX402 summary, timeline, top counterparties, and biggest transactions.
424
+ OrbitX402 - summary, timeline, top counterparties, and biggest transactions.
368
425
 
369
426
  ## [0.1.31] – 2026-06-23
370
427
 
371
428
  ### Fixed
372
429
  - **Payments now work against x402 servers that expect a `Payment-Signature`
373
430
  header.** The retry attaches the payment payload under both `X-PAYMENT` (the
374
- common name) and `Payment-Signature` some providers (e.g. Nansen) only read
431
+ common name) and `Payment-Signature` - some providers (e.g. Nansen) only read
375
432
  the latter and were silently returning `402 Payment Required` even though the
376
433
  payload was valid. Confirmed against the live Nansen endpoint: the same
377
434
  payload that was ignored under `X-PAYMENT` is accepted under
@@ -384,11 +441,11 @@ Milestone release consolidating the 0.1.24–0.1.31 line into four themes.
384
441
  ### Fixed
385
442
  - **`use` no longer attempts a payment on an unfunded network.** 0.1.29's
386
443
  balance-aware picker fell back to the "best-funded" option when none could
387
- cover the cost which, with everything at $0, still tried to pay and surfaced
444
+ cover the cost - which, with everything at $0, still tried to pay and surfaced
388
445
  a raw `402 Payment Required` from the provider. Now, when multiple networks
389
446
  are payable but none has the funds, `use` raises a clear error listing each
390
447
  network's USDC balance (e.g. *"insufficient USDC balance to pay on any funded
391
- network base $0.00, solana $0.00"*) instead. The settlement flow itself is
448
+ network - base $0.00, solana $0.00"*) instead. The settlement flow itself is
392
449
  unchanged. A single-network resource is still attempted as before (funding is
393
450
  left to the payment flow).
394
451
 
@@ -398,31 +455,31 @@ Milestone release consolidating the 0.1.24–0.1.31 line into four themes.
398
455
  - **`use` now picks the payment network by balance, not by list order.** When a
399
456
  resource accepts multiple networks (e.g. Base *and* Solana), xPay reads the
400
457
  wallet balance on each and pays from the first option that can cover the cost
401
- so a $0 Base wallet automatically falls through to a funded Solana one.
458
+ - so a $0 Base wallet automatically falls through to a funded Solana one.
402
459
  Previously it always took the first listed option (usually Base) and failed
403
460
  if that wallet was empty. Both the catalog and live-402 paths use the new
404
461
  picker. Single-network resources are unaffected (no extra balance lookups).
405
462
  Falls back to the best-funded option when none can cover the cost outright.
406
463
 
407
464
  ### Added
408
- - **`Wallet.pickRequirementByBalance()`** the async, balance-aware selector
465
+ - **`Wallet.pickRequirementByBalance()`**: the async, balance-aware selector
409
466
  behind the above. `pickRequirement()` (first-match, sync) is retained.
410
467
 
411
468
  ### Added
412
469
  - **Bento firewall controls exposed as MCP tools.** Agents can now manage the
413
470
  intent firewall directly, not just via the CLI:
414
- - `xpay_bento_status` read whether screening is on (and the agent wallet to register).
415
- - `xpay_bento_enable` turn it on; returns the agent wallet address to register at app.bentoguard.xyz.
416
- - `xpay_bento_disable` turn it off; the escape hatch when the wallet isn't registered and payments are being rejected.
471
+ - `xpay_bento_status` - read whether screening is on (and the agent wallet to register).
472
+ - `xpay_bento_enable` - turn it on; returns the agent wallet address to register at app.bentoguard.xyz.
473
+ - `xpay_bento_disable` - turn it off; the escape hatch when the wallet isn't registered and payments are being rejected.
417
474
  Enable/disable take effect live on the running guardrail (no restart) and
418
- persist to the profile. Only available on profile-backed wallets raw-key
475
+ persist to the profile. Only available on profile-backed wallets - raw-key
419
476
  (`XPAY_SOLANA_SECRET`) mode reports `profileBacked: false`.
420
477
  - **`Guardrail.bentoEnabled()` / `setBentoEnabled()`** for runtime toggling.
421
478
 
422
479
  ## [0.1.27] – 2026-06-23
423
480
 
424
481
  ### Added
425
- - **`SKILL.md` framework-agnostic onboarding guide.** A single page that
482
+ - **`SKILL.md` - framework-agnostic onboarding guide.** A single page that
426
483
  teaches any agent (Claude, Codex, OpenAI, Gemini, custom) how to drive xPay:
427
484
  zero-config setup, the tool surface, the pay-per-call model, the safety rules
428
485
  (guardrail, transfer confirmation, Bento), and copy-paste recipes. Shipped in
@@ -438,7 +495,7 @@ Milestone release consolidating the 0.1.24–0.1.31 line into four themes.
438
495
 
439
496
  ### Added
440
497
  - **Zero-config wallet onboarding for the MCP server.** Drop xPay into any
441
- agent host with no env at all on first boot the agent is given its own
498
+ agent host with no env at all - on first boot the agent is given its own
442
499
  persistent wallet (generated, saved under `~/.xpay`/`XPAY_HOME`, address
443
500
  printed to stderr to fund). Reused on every later boot, so the agent keeps a
444
501
  stable address. The wallet source order is: existing profile → raw key env
@@ -451,7 +508,7 @@ Milestone release consolidating the 0.1.24–0.1.31 line into four themes.
451
508
  ### Changed
452
509
  - **`mcp-server.ts` header now documents the zero-config form as primary.** The
453
510
  previous example showed `XPAY_PASSPHRASE` alone, which only works once a
454
- profile already exists a setup trap for fresh hosts.
511
+ profile already exists - a setup trap for fresh hosts.
455
512
 
456
513
  ## [0.1.25] – 2026-06-23
457
514
 
@@ -474,8 +531,8 @@ Milestone release consolidating the 0.1.24–0.1.31 line into four themes.
474
531
  ### Added
475
532
  - **Bento Guard intent firewall (optional).** A second enforcement gate on top
476
533
  of the local guardrail caps. When enabled, every `use` / `transfer` is
477
- screened by Bento's `protect()` for malicious *intent* prompt-injection,
478
- wallet-drain, intent-vs-execution mismatch before signing. The local
534
+ screened by Bento's `protect()` for malicious *intent*, prompt-injection,
535
+ wallet-drain, intent-vs-execution mismatch, before signing. The local
479
536
  guardrail still owns spend caps; Bento adds the AI intent layer xPay can't
480
537
  compute itself.
481
538
  - Enable per-profile with `xpay bento enable` (also `disable` / `status`).
@@ -485,7 +542,7 @@ Milestone release consolidating the 0.1.24–0.1.31 line into four themes.
485
542
  [app.bentoguard.xyz](https://app.bentoguard.xyz/); `enable` prints it.
486
543
  - `BLOCKED` verdicts throw a `GuardrailError`; `ESCALATED` verdicts defer to
487
544
  the existing `onApprovalRequired` hook, or fail closed if none is set.
488
- - `@bentoguard/sdk` is an **optional** dependency loaded lazily installs
545
+ - `@bentoguard/sdk` is an **optional** dependency loaded lazily - installs
489
546
  that can't build its native bindings won't break `npm i @xona-labs/xpay`,
490
547
  and the SDK is only required once a profile turns the firewall on.
491
548
 
@@ -504,32 +561,32 @@ Milestone release consolidating the 0.1.24–0.1.31 line into four themes.
504
561
  ### Changed
505
562
  - **Discovery searches server-side.** `discover({ query })` now passes the
506
563
  query to the OrbitX402 API (`?query=`), which searches and ranks the
507
- catalog and returns only the matches one small request instead of
564
+ catalog and returns only the matches - one small request instead of
508
565
  downloading the entire 33k-item catalog (~2 minutes of sequential page
509
566
  fetches) to filter locally. Cold `xpay discover <query>` drops from
510
567
  minutes to ~2s. Local filtering remains as a fallback for endpoints that
511
568
  ignore the query param; no-query browsing still fetches the full catalog.
512
569
 
513
570
  ### Fixed
514
- - **MCP server no longer unlocks the wallet just to read the Sana API key**
571
+ - **MCP server no longer unlocks the wallet just to read the Sana API key** -
515
572
  `config.json` is plaintext, so `sana_*` tools now register correctly when
516
573
  the server starts without `XPAY_PASSPHRASE` (e.g. biometric-unlock setups).
517
574
 
518
575
  ## [0.1.18] – 2026-06-12
519
576
 
520
577
  ### Fixed
521
- - **`xpay balance` now unlocks via Touch ID** it had its own inline
578
+ - **`xpay balance` now unlocks via Touch ID**: it had its own inline
522
579
  passphrase prompt instead of the shared unlock path, so it never offered
523
580
  biometric unlock. It now uses `unlockActive` like every other command.
524
581
 
525
582
  ## [0.1.17] – 2026-06-12
526
583
 
527
584
  ### Added
528
- - **Biometric unlock (macOS Touch ID)** `xpay biometric enable|disable|status`.
585
+ - **Biometric unlock (macOS Touch ID)**: `xpay biometric enable|disable|status`.
529
586
  When enabled, the wallet passphrase is stored in the login keychain and
530
587
  released by a native LocalAuthentication helper (compiled on first use to
531
588
  `~/.xpay/bin/`, requires Xcode Command Line Tools) after a Touch ID check.
532
- The scrypt/AES wallet encryption is unchanged the passphrase remains the
589
+ The scrypt/AES wallet encryption is unchanged - the passphrase remains the
533
590
  fallback and recovery path. Unlock order is now: `--passphrase` flag →
534
591
  `$XPAY_PASSPHRASE` → Touch ID → interactive prompt.
535
592
  - **Guardrail approval hook is now wired in the CLI and MCP server.**
@@ -537,32 +594,32 @@ Milestone release consolidating the 0.1.24–0.1.31 line into four themes.
537
594
  configured"); `xpay pay` / `xpay transfer` now resolve it via Touch ID (when
538
595
  biometric unlock is enabled) or a y/n confirm on a TTY. The MCP server uses
539
596
  Touch ID only (no TTY) and denies above-threshold calls otherwise.
540
- - **MCP server can start without `XPAY_PASSPHRASE`** when the profile has
597
+ - **MCP server can start without `XPAY_PASSPHRASE`**: when the profile has
541
598
  biometric unlock enabled, the server prompts Touch ID once at startup
542
599
  instead of requiring the passphrase in plaintext host config.
543
600
 
544
601
  ## [0.1.5] – 2026-05-26
545
602
 
546
603
  ### Added
547
- - **`UseResult.txSig` is now populated on SVM v2 calls** extracted from
604
+ - **`UseResult.txSig` is now populated on SVM v2 calls**: extracted from
548
605
  the facilitator's `PAYMENT-RESPONSE` (or `X-PAYMENT-RESPONSE`) header,
549
606
  which carries the canonical `SettleResponse` envelope (base64 JSON).
550
607
  Previously `useByUrl()` returned `txSig: undefined` for v2 because the
551
608
  facilitator (not the client) broadcasts the transaction.
552
- - **`UseResult.settlement?: SettleEnvelope`** full settle envelope from
609
+ - **`UseResult.settlement?: SettleEnvelope`**: full settle envelope from
553
610
  the facilitator when present: `{ transaction, payer?, network, amount?,
554
611
  success?, extensions?, extra? }`. Useful for reconciliation
555
612
  (payer address, actual settled amount in `upto`-style schemes, etc.).
556
613
 
557
614
  ### Verified
558
- - Live against `api.xona-agent.com/audio/x-text-to-speech` 200 OK,
615
+ - Live against `api.xona-agent.com/audio/x-text-to-speech` - 200 OK,
559
616
  $0.01 USDC settled, real on-chain signature
560
617
  (`3puHTvEY…EpEHi`) returned in both `txSig` and `settlement.transaction`.
561
618
 
562
619
  ## [0.1.4] – 2026-05-26
563
620
 
564
621
  ### Fixed
565
- - **`useByUrl()` against canonical x402 SVM v2 servers** the SDK now signs
622
+ - **`useByUrl()` against canonical x402 SVM v2 servers**: the SDK now signs
566
623
  but does **not** broadcast the USDC transfer, and sends the canonical
567
624
  `PaymentPayloadV2` envelope (`{ x402Version, accepted, payload: { transaction } }`)
568
625
  base64-encoded in the `X-Payment` header. The facilitator verifies + settles.
@@ -573,19 +630,19 @@ Milestone release consolidating the 0.1.24–0.1.31 line into four themes.
573
630
  reject with `"Unsupported x402 payload"`.
574
631
 
575
632
  ### Added
576
- - New `Signer.getKitSigner?()` (optional, additive) returns a `@solana/kit`
633
+ - New `Signer.getKitSigner?()` (optional, additive) - returns a `@solana/kit`
577
634
  `TransactionSigner`. `rawSolanaSigner` implements it out of the box.
578
635
  Custom signers (KMS/MPC) implementing it gain canonical x402 v2 support
579
636
  for SVM endpoints; existing custom signers without it keep working via
580
637
  the legacy broadcast-then-`txSig` path for non-SVM networks.
581
- - New module `src/x402/svm-payment.ts` wraps `@x402/svm`'s
638
+ - New module `src/x402/svm-payment.ts` - wraps `@x402/svm`'s
582
639
  `ExactSvmScheme.createPaymentPayload` and assembles the canonical
583
640
  `PaymentPayloadV2` envelope. Used by `useByUrl()` for any network matching
584
641
  `solana` / `solana:*` / `solana-*`.
585
642
 
586
643
  ### Dependencies
587
- - `@x402/core`, `@x402/svm` canonical x402 encoding (no spec drift).
588
- - `@solana/kit` pulled in transitively by `@x402/svm`; used to construct
644
+ - `@x402/core`, `@x402/svm` - canonical x402 encoding (no spec drift).
645
+ - `@solana/kit` - pulled in transitively by `@x402/svm`; used to construct
589
646
  `TransactionSigner` instances from existing `@solana/web3.js` Keypairs via
590
647
  `createKeyPairSignerFromBytes`.
591
648
 
@@ -594,29 +651,29 @@ Milestone release consolidating the 0.1.24–0.1.31 line into four themes.
594
651
  facilitator broadcasts; we never see the resulting signature client-side).
595
652
  Downstream reconciliation can still use the upstream response + your own
596
653
  correlationId in your DB.
597
- - Direct `transfer()` is unchanged still uses `signer.pay()` (broadcasts
654
+ - Direct `transfer()` is unchanged - still uses `signer.pay()` (broadcasts
598
655
  client-side, returns the real `txSig`), since there's no facilitator in
599
656
  the direct-transfer path.
600
657
 
601
658
  ## [0.1.3] – 2026-05-26
602
659
 
603
660
  ### Fixed
604
- - **`useByUrl()` against x402-spec endpoints** now resolves the CAIP form
661
+ - **`useByUrl()` against x402-spec endpoints**: now resolves the CAIP form
605
662
  of Solana (`solana:5eykt4UsFv8P8NJdTREpY1vzqKqZKvdp` and `solana:*` /
606
663
  `solana-*` variants) to the configured `solana` signer. Previously failed
607
664
  with "no matching signer" against any endpoint reporting network in CAIP.
608
- - **`xpay pay` defaulted to GET** most x402 service endpoints are POST, so
665
+ - **`xpay pay` defaulted to GET**: most x402 service endpoints are POST, so
609
666
  the CLI returned 404 from the upstream. Added a `--method <m>` flag and
610
667
  documented it in the help text.
611
- - **Blank error output on signing failures** `xpay pay` and `xpay transfer`
668
+ - **Blank error output on signing failures**: `xpay pay` and `xpay transfer`
612
669
  printed a bare `✗` when the underlying Solana / SPL error had an empty
613
670
  `.message`. Now falls back to `toString()` and surfaces optional `logs`.
614
- - **402 challenges in response headers** were not parsed only the body was
671
+ - **402 challenges in response headers** were not parsed - only the body was
615
672
  checked. Now reads the requirements from either the body OR a header
616
673
  (`Payment-Required`, `X-Payment`, `X-Accept-Payment`, `WWW-Authenticate`,
617
674
  `X-402`, …), decoded as raw JSON, base64-JSON, URL-encoded JSON, or
618
675
  `<scheme> <payload>`.
619
- - **x402-spec field names not recognized** the parser now aliases
676
+ - **x402-spec field names not recognized**: the parser now aliases
620
677
  `maxAmountRequired → amount`, `recipient → payTo`, `token` / `mint` →
621
678
  `asset`, etc. Also accepts a bare requirement object, an `{accepts:[]}` /
622
679
  `{items:[]}` envelope, or a v1 bare array.
@@ -632,7 +689,7 @@ Milestone release consolidating the 0.1.24–0.1.31 line into four themes.
632
689
  shipped `dist/` so internal pipelines (e.g. curation) can deep-import.
633
690
 
634
691
  ### Internal
635
- - New shared `src/x402/extract.ts` module single source of truth for
692
+ - New shared `src/x402/extract.ts` module - single source of truth for
636
693
  parsing x402 challenges, consumed by both `useByUrl()` and the internal
637
694
  curation pipeline. Replaces the duplicated parser that used to live in
638
695
  `use/` and `probe/`.
@@ -647,22 +704,22 @@ GitHub releases page for the diff against 0.1.0.
647
704
  Initial public release.
648
705
 
649
706
  ### Added
650
- - Multi-network wallet Solana + Base from one BIP-39 mnemonic, encrypted
707
+ - Multi-network wallet - Solana + Base from one BIP-39 mnemonic, encrypted
651
708
  on disk with scrypt + AES-256-GCM.
652
- - `discover()` search across the live x402 catalog (PayAI facilitator).
653
- - `useByUrl()` / `use()` pay any x402 endpoint, handles the 402
709
+ - `discover()` - search across the live x402 catalog (PayAI facilitator).
710
+ - `useByUrl()` / `use()` - pay any x402 endpoint, handles the 402
654
711
  challenge → sign → retry-with-`X-Payment` flow.
655
- - `transfer()` direct USDC send to an address, gated by the same guardrail.
656
- - `balance()` unified USDC balance across configured networks.
657
- - `history()` recent on-chain USDC activity (Solana via RPC, EVM via
712
+ - `transfer()` - direct USDC send to an address, gated by the same guardrail.
713
+ - `balance()` - unified USDC balance across configured networks.
714
+ - `history()` - recent on-chain USDC activity (Solana via RPC, EVM via
658
715
  chunked `eth_getLogs`).
659
- - `Guardrail` per-tx and per-day caps + allowed-host whitelist, enforced
716
+ - `Guardrail` - per-tx and per-day caps + allowed-host whitelist, enforced
660
717
  before any signature.
661
- - Profile management `initProfile()`, `loadProfile()`, multi-profile via
718
+ - Profile management - `initProfile()`, `loadProfile()`, multi-profile via
662
719
  `~/.xpay/<name>/`.
663
720
  - CLI: `xpay init / accounts / discover / pay / transfer / balance / history /
664
721
  guardrail / mcp`.
665
- - MCP server (`xpay-mcp`) on stdio exposes the SDK as tools for Claude
722
+ - MCP server (`xpay-mcp`) on stdio - exposes the SDK as tools for Claude
666
723
  Desktop, Cursor, Codex.
667
724
  - LLM tool exporters: `forClaude(xpay)`, `forOpenAI(xpay)`, `forGemini(xpay)`.
668
725