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