@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/README.md CHANGED
@@ -1,4 +1,6 @@
1
- # @xona-labs/xpay
1
+ # Xona Wallet
2
+
3
+ > Ships as the npm package `@xona-labs/xpay`, the `xpay` CLI, and the `xpay_*` MCP tools. The package and command names are unchanged.
2
4
 
3
5
  [![npm](https://img.shields.io/npm/v/@xona-labs/xpay)](https://www.npmjs.com/package/@xona-labs/xpay)
4
6
  [![downloads](https://img.shields.io/npm/dm/@xona-labs/xpay)](https://www.npmjs.com/package/@xona-labs/xpay)
@@ -6,7 +8,7 @@
6
8
  [![MCP Registry](https://img.shields.io/badge/MCP_Registry-io.github.xona--labs%2Fxpay-6e56cf)](https://registry.modelcontextprotocol.io/v0.1/servers?search=io.github.xona-labs/xpay)
7
9
  ![node](https://img.shields.io/badge/node-%3E%3D18-brightgreen)
8
10
 
9
- > **Agentic-commerce wallet.** Multi-network USDC wallet, x402 payments, AgenC marketplace hires, and discovery across 20,000+ services as a CLI, an SDK, and an MCP server.
11
+ > **Agentic-commerce wallet.** Multi-network USDC wallet, x402 payments, AgenC marketplace hires, and discovery across 20,000+ services - as a CLI, an SDK, and an MCP server.
10
12
 
11
13
  ```bash
12
14
  npm install -g @xona-labs/xpay
@@ -22,13 +24,13 @@ xpay report # daily / weekly / monthly report via
22
24
  ```
23
25
 
24
26
  ```ts
25
- // SDK same primitives, programmatic
27
+ // SDK - same primitives, programmatic
26
28
  import { loadProfile, createXPay } from "@xona-labs/xpay";
27
29
  const xpay = createXPay({ profile: await loadProfile({ passphrase }) });
28
30
  const result = await xpay.do("translate this PDF to Japanese", { body: { file } });
29
31
  ```
30
32
 
31
- xPay is the **wallet** and **rail** layer for agentic commerce. It hides x402, USDC, RPC, and multi-network routing behind a flat surface so agent builders (Claude / Codex / OpenAI / Gemini / your own) can find and pay for services without writing payment plumbing.
33
+ Xona Wallet is the **wallet** and **rail** layer for agentic commerce. It hides x402, USDC, RPC, and multi-network routing behind a flat surface so agent builders (Claude / Codex / OpenAI / Gemini / your own) can find and pay for services without writing payment plumbing.
32
34
 
33
35
  ---
34
36
 
@@ -46,7 +48,7 @@ xpay init
46
48
  # ✔ Profile "default" created at /Users/you/.xpay/default
47
49
  # Solana 7RB7frdxPc9vZtuyq6YfNoWTJcDZsE2AcXXV6qkpf5ph
48
50
  # EVM 0xA5D93CDB2bD16b2d1d3d19D45dad3FaBb1023dfa
49
- # ⚠ RECOVERY PHRASE write this down NOW. We cannot recover it for you.
51
+ # ⚠ RECOVERY PHRASE - write this down NOW. We cannot recover it for you.
50
52
  # 1. depend 2. guess 3. mercy 4. online
51
53
  # ... (24 words)
52
54
  ```
@@ -65,23 +67,23 @@ xpay pay https://orbisapi.com/proxy/image-alt-text-generator-api-1c9472
65
67
  |---|---|
66
68
  | `xpay init [name]` | Create a profile (Solana + EVM keys from one BIP-39 seed). `--import` to restore from a phrase, `--no-encrypt` for dev wallets, `--workspace` to store locally. |
67
69
  | `xpay accounts list \| show \| use` | List profiles, inspect one, or set the active profile. |
68
- | `xpay balance` | USDC balance per network for the active profile. |
69
- | `xpay discover [query]` | Search 21k+ x402 services across chains Solana, Base, **BNB Chain**, and other EVM networks plus **AgenC marketplace** agent listings (cached on disk). `--network`, `--limit`, `--json`. |
70
+ | `xpay balance` | Token balances per network for the active profile, plus a stablecoin total. Covers Solana, Base and other EVM chains, Robinhood Chain, and [Stable](#stable-chain). `--network`. |
71
+ | `xpay discover [query]` | Search 21k+ x402 services across chains (Solana, Base, **BNB Chain**, and other EVM networks), plus **AgenC marketplace** agent listings (cached on disk). `--network`, `--limit`, `--json`. |
70
72
  | `xpay pay <url>` | Pay an x402 endpoint. Works on catalog URLs and any URL that returns 402. `--max-usd`, `--body`, `-y`. |
71
- | `xpay agenc hire <listingPda>` | Hire an [AgenC marketplace](#agenc-marketplace-hire-on-chain-agents) listing escrows its SOL price on-chain; the provider works asynchronously. `--max-usd`, `--review-window`, `-y`. |
73
+ | `xpay agenc hire <listingPda>` | Hire an [AgenC marketplace](#agenc-marketplace-hire-on-chain-agents) listing - escrows its SOL price on-chain; the provider works asynchronously. `--max-usd`, `--review-window`, `-y`. |
72
74
  | `xpay agenc status <taskPda>` | Check a hire's progress (read-only, no wallet). `--json`. |
73
- | `xpay token find <query>` | Find a Solana token by ticker, name, or mint address (Jupiter) price, mcap, liquidity, verification. Read-only. `--limit`, `--json`. |
75
+ | `xpay token find <query>` | Find a Solana token by ticker, name, or mint address (Jupiter) - price, mcap, liquidity, verification. Read-only. `--limit`, `--json`. |
74
76
  | `xpay token rwa [query]` | List tradable [RWA tokens](#rwa-discovery-solana) on Solana: tokenized stocks/ETFs (xStocks, Ondo, Remora) + USDY. Read-only. `--category`, `--limit`, `--json`. |
75
77
  | `xpay swap <amount> <from> <to>` | Swap tokens in your wallet via Jupiter (Solana only), subject to the guardrail. `--slippage-bps`, `-y`. |
76
78
  | `xpay trade <amount> <from> <to>` | Trade tokens on [Robinhood Chain](#robinhood-chain-trading) via Uniswap V3 / NOXA Fun (ETH↔token), subject to the guardrail. `--slippage-bps`, `--quote-only`, `-y`. |
77
79
  | `xpay trending` | List tokens trending on Robinhood Chain (read-only, no wallet). `--new`, `--limit`. |
78
- | `xpay x user \| posts <handle>` | Realtime X (Twitter) account data profile (~$0.01) or recent posts (~$0.06), paid via x402 at cost. No X account needed. |
79
- | `xpay zauth reposcan <repoUrl>` | Repository security scan via partner [zauth](#zauth-repo-security-scans) zauth score + provenance/vulnerability report (~$0.05 USDC via x402). `--json`, `-y`. |
80
+ | `xpay x user \| posts <handle>` | Realtime X (Twitter) account data - profile (~$0.01) or recent posts (~$0.06), paid via x402 at cost. No X account needed. |
81
+ | `xpay zauth reposcan <repoUrl>` | Repository security scan via partner [zauth](#zauth-repo-security-scans) - zauth score + provenance/vulnerability report (~$0.05 USDC via x402). `--json`, `-y`. |
80
82
  | `xpay zauth status <sessionToken>` | Check a running zauth scan (free, read-only, no wallet). `--json`. |
81
83
  | `xpay shop search "<query>"` | [Product discovery](#xona-shop-product-discovery) across Google Shopping, Amazon, and eBay from one query (~$0.02 USDC via x402, less for fewer marketplaces). `--marketplaces`, `--price-min/max`, `--condition`, `--sort`, `--json`, `-y`. |
82
84
  | `xpay shop quote "<query>"` | Free preflight: exact search price + how the query parses (no wallet). `--json`. |
83
- | `xpay transfer <amount> USDC <to>` | Direct USDC transfer, subject to the guardrail. `--network`, `-y`. |
84
- | `xpay report` | Comprehensive USDC activity report totals, net flow, timeline, top counterparties, biggest txs. `--period daily\|weekly\|monthly`, `--network`, `--json`. |
85
+ | `xpay transfer <amount> USDC <to>` | Direct stablecoin transfer (USDC, or USDT0 on [Stable](#stable-chain)), subject to the guardrail. `--network`, `-y`. |
86
+ | `xpay report` | Comprehensive USDC activity report - totals, net flow, timeline, top counterparties, biggest txs. `--period daily\|weekly\|monthly`, `--network`, `--json`. |
85
87
  | `xpay guardrail show \| set \| clear` | Inspect or edit spending caps and allowed hosts. |
86
88
  | `xpay biometric status \| enable \| disable` | Touch ID unlock for the wallet passphrase (macOS). |
87
89
  | `xpay sana link \| unlink \| status` | Link a Sana API key to activate the agent card (optional). |
@@ -91,7 +93,7 @@ All commands run from a single profile. Switch with `xpay accounts use <name>`.
91
93
 
92
94
  ## SDK
93
95
 
94
- The CLI is a thin shell over the SDK every command has a direct programmatic equivalent.
96
+ The CLI is a thin shell over the SDK - every command has a direct programmatic equivalent.
95
97
 
96
98
  ```ts
97
99
  import {
@@ -124,13 +126,13 @@ await xpay.discover({ query: "weather" });
124
126
  await xpay.useByUrl("https://...");
125
127
  await xpay.do("translate this PDF to Japanese");
126
128
  await xpay.transfer({ amount: 1, to: "7G73PL...", token: "USDC" });
127
- await xpay.report({ period: "weekly" }); // via OrbitX402 no RPC calls from your code
129
+ await xpay.report({ period: "weekly" }); // via OrbitX402 - no RPC calls from your code
128
130
  await xpay.wallet.balance("solana");
129
131
  ```
130
132
 
131
133
  ### Agent runtimes
132
134
 
133
- xPay ships tool definitions for the three major LLM SDKs. Same handlers, different schema shapes.
135
+ Xona Wallet ships tool definitions for the three major LLM SDKs. Same handlers, different schema shapes.
134
136
 
135
137
  ```ts
136
138
  import Anthropic from "@anthropic-ai/sdk";
@@ -157,10 +159,10 @@ for (const block of response.content) {
157
159
 
158
160
  ## MCP server (Claude Desktop / Cursor / Codex)
159
161
 
160
- xPay is listed in the [official MCP Registry](https://registry.modelcontextprotocol.io/v0.1/servers?search=io.github.xona-labs/xpay)
161
- as **`io.github.xona-labs/xpay`** registry-aware hosts can discover and
162
- install it by that name. For everything else, drop xPay into the host's
163
- config **no code, no keys, no `xpay init`.** On first boot the agent is
162
+ Xona Wallet is listed in the [official MCP Registry](https://registry.modelcontextprotocol.io/v0.1/servers?search=io.github.xona-labs/xpay)
163
+ as **`io.github.xona-labs/xpay`** - registry-aware hosts can discover and
164
+ install it by that name. For everything else, drop Xona Wallet into the host's
165
+ config - **no code, no keys, no `xpay init`.** On first boot the agent is
164
166
  given its own wallet automatically:
165
167
 
166
168
  ```jsonc
@@ -176,12 +178,12 @@ given its own wallet automatically:
176
178
  ```
177
179
 
178
180
  That's the whole setup. The generated wallet's **Solana address is printed to
179
- stderr on first run** fund it with USDC and the agent can pay. It persists
181
+ stderr on first run** - fund it with USDC and the agent can pay. It persists
180
182
  under `~/.xpay` and is reused on every later boot, so the address is stable.
181
183
 
182
184
  The host sees the core tools: `xpay_discover`, `xpay_use`, `xpay_do`, `xpay_transfer`, `xpay_balance`, `xpay_report`, `xpay_guardrail`, `xpay_token_find`, `xpay_swap`, `xpay_trending_tokens`, `xpay_trade_quote`, `xpay_trade`, `xpay_x_user`, `xpay_x_posts`, `xpay_zauth_reposcan`, `xpay_zauth_scan_status`, `xpay_shop_search`, `xpay_shop_quote`, `xpay_shop_lens`, `xpay_shop_lens_quote`, `xpay_rwa_find`, `xpay_agenc_status`, plus `xpay_bento_status` / `xpay_bento_enable` / `xpay_bento_disable` to manage the [intent firewall](#security--bento-intent-firewall-optional). If you've linked a Sana key (see below), eight additional `sana_*` tools are also registered automatically.
183
185
 
184
- **Bring your own wallet instead** the wallet source order is *existing profile → key env → auto-generate*, so any of these overrides the generated wallet:
186
+ **Bring your own wallet instead** - the wallet source order is *existing profile → key env → auto-generate*, so any of these overrides the generated wallet:
185
187
 
186
188
  ```jsonc
187
189
  "env": {
@@ -211,7 +213,7 @@ Override with `XPAY_HOME=/some/path` or `xpay init --workspace` for project-loca
211
213
 
212
214
  ## Biometric unlock (macOS)
213
215
 
214
- Skip typing the passphrase on every command unlock with Touch ID instead:
216
+ Skip typing the passphrase on every command - unlock with Touch ID instead:
215
217
 
216
218
  ```bash
217
219
  xpay biometric enable # verifies your passphrase, then stores it Touch ID-gated
@@ -223,14 +225,14 @@ xpay biometric disable # removes the keychain entry
223
225
  How it works: the wallet's scrypt + AES-256-GCM encryption is unchanged. `enable` places the
224
226
  passphrase in your **login keychain**, and a small native helper (compiled on first use to
225
227
  `~/.xpay/bin/`, requires the Xcode Command Line Tools) releases it only after a
226
- LocalAuthentication check. Biometrics never replace the passphrase they gate access to it.
228
+ LocalAuthentication check. Biometrics never replace the passphrase - they gate access to it.
227
229
 
228
230
  The unlock order for every command is: `--passphrase` flag → `$XPAY_PASSPHRASE` → Touch ID →
229
231
  interactive prompt. Your passphrase keeps working everywhere and remains the only recovery
230
- path if Touch ID is unavailable (or the stored copy goes stale after a re-encrypt), the CLI
232
+ path - if Touch ID is unavailable (or the stored copy goes stale after a re-encrypt), the CLI
231
233
  falls back to asking for it.
232
234
 
233
- > macOS asks once to allow keychain access for the helper choose **"Always Allow"**. It will
235
+ > macOS asks once to allow keychain access for the helper - choose **"Always Allow"**. It will
234
236
  > ask again after package upgrades, since the helper is recompiled.
235
237
 
236
238
  ## Guardrail
@@ -245,19 +247,19 @@ xpay guardrail set \
245
247
  --allowed-hosts 'api.payai.network,*.xona-agent.com'
246
248
  ```
247
249
 
248
- - **`maxPerTx` / `maxPerDay`** apply to every paid call *and* direct transfers.
249
- - **`allowedHosts`** apply only to x402 calls (transfers go to addresses, not hosts).
250
- - **`maxPerTx` / `maxPerDay`** apply to every paid call *and* direct transfers.
251
- - **`allowedHosts`** apply only to x402 calls (transfers go to addresses, not hosts).
252
- - **`requireApprovalAbove`** calls ≥ threshold need explicit approval. In the CLI this is a
250
+ - **`maxPerTx` / `maxPerDay`**: apply to every paid call *and* direct transfers.
251
+ - **`allowedHosts`**: apply only to x402 calls (transfers go to addresses, not hosts).
252
+ - **`maxPerTx` / `maxPerDay`**: apply to every paid call *and* direct transfers.
253
+ - **`allowedHosts`**: apply only to x402 calls (transfers go to addresses, not hosts).
254
+ - **`requireApprovalAbove`**: calls ≥ threshold need explicit approval. In the CLI this is a
253
255
  Touch ID prompt when [biometric unlock](#biometric-unlock-macos) is enabled, otherwise a y/n
254
256
  confirm; in the MCP server it is Touch ID only (no terminal), so an agent's large payment
255
257
  surfaces as a system dialog you physically approve. In the SDK, wire the
256
- `onApprovalRequired` hook to whatever you like push notification, biometric, webhook.
258
+ `onApprovalRequired` hook to whatever you like - push notification, biometric, webhook.
257
259
 
258
- ## Security Bento intent firewall (optional)
260
+ ## Security - Bento intent firewall (optional)
259
261
 
260
- Spend caps stop an agent spending *too much* they can't tell a legitimate payment from a
262
+ Spend caps stop an agent spending *too much* - they can't tell a legitimate payment from a
261
263
  prompt-injected one. The optional [Bento](https://app.bentoguard.xyz/) layer adds an **AI intent
262
264
  firewall**: every paid call and transfer is screened for malicious intent (prompt-injection,
263
265
  wallet-drain, intent-vs-execution mismatch) *before signing*. It runs inside the guardrail, right
@@ -266,46 +268,46 @@ after the local caps pass.
266
268
  ```bash
267
269
  xpay bento enable # prints the agent wallet address to register
268
270
  xpay bento status # whether screening is active
269
- xpay bento disable # turn off falls back to local caps only
271
+ xpay bento disable # turn off - falls back to local caps only
270
272
  ```
271
273
 
272
- There's **no API key** Bento authenticates with the wallet's own key. The one manual step is a
274
+ There's **no API key** - Bento authenticates with the wallet's own key. The one manual step is a
273
275
  **one-time, on-chain registration** of the agent wallet at
274
276
  [app.bentoguard.xyz](https://app.bentoguard.xyz/) (log in with your owner wallet; until the agent
275
277
  wallet is registered, payments are rejected with `Agent not found`).
276
278
 
277
279
  Each screened call returns a verdict:
278
280
 
279
- - **`ALLOW`** cleared; xPay signs as normal.
280
- - **`BLOCKED`** flagged as a critical threat; xPay throws before signing, no funds move.
281
- - **`ESCALATED`** ambiguous; xPay defers to your `onApprovalRequired` hook, or fails closed.
281
+ - **`ALLOW`**: cleared; Xona Wallet signs as normal.
282
+ - **`BLOCKED`**: flagged as a critical threat; Xona Wallet throws before signing, no funds move.
283
+ - **`ESCALATED`**: ambiguous; Xona Wallet defers to your `onApprovalRequired` hook, or fails closed.
282
284
 
283
285
  Agents can manage it over MCP too: `xpay_bento_status`, `xpay_bento_enable`, `xpay_bento_disable`
284
286
  (disable is the escape hatch when the wallet isn't registered yet).
285
287
 
286
288
  ## Sana agent wallet card (optional)
287
289
 
288
- xPay supports an optional integration with [Sana](https://sana.bot) an agent-native card that lets your AI spend at the point of sale, anywhere Visa is accepted.
290
+ Xona Wallet supports an optional integration with [Sana](https://sana.bot) - an agent-native card that lets your AI spend at the point of sale, anywhere Visa is accepted.
289
291
 
290
- Activating it adds a second wallet surface to xPay: your on-chain USDC (xpay) for agentic x402 payments, and a Sana card (fiat) for everything else. The two compose naturally an agent can top up the card from the xPay wallet when the balance runs low.
292
+ Activating it adds a second wallet surface to Xona Wallet: your on-chain USDC (xpay) for agentic x402 payments, and a Sana card (fiat) for everything else. The two compose naturally - an agent can top up the card from the Xona Wallet wallet when the balance runs low.
291
293
 
292
294
  ### Activate
293
295
 
294
296
  1. Sign up at [sana.bot](https://sana.bot) and generate an API key at `sana.bot/gateway/app/api-keys` (scope: `read:all` covers everything read-only; add `write:card` for deposits and swaps).
295
- 2. Link it to your xPay profile:
297
+ 2. Link it to your Xona Wallet profile:
296
298
 
297
299
  ```bash
298
300
  xpay sana link sana_live_...
299
301
  xpay sana status # confirm it's stored
300
302
  ```
301
303
 
302
- 3. Restart your MCP client eight `sana_*` tools appear automatically alongside the standard `xpay_*` tools.
304
+ 3. Restart your MCP client - eight `sana_*` tools appear automatically alongside the standard `xpay_*` tools.
303
305
 
304
306
  ### Tools registered
305
307
 
306
308
  | Tool | What it does |
307
309
  |---|---|
308
- | `sana_card` | Card metadata type, status, last 4, expiry |
310
+ | `sana_card` | Card metadata - type, status, last 4, expiry |
309
311
  | `sana_card_balance` | Available spending power on the card |
310
312
  | `sana_card_deposit` | Top up the card with USDC from the Sana wallet |
311
313
  | `sana_card_transactions` | Card spending history (paginated) |
@@ -328,7 +330,7 @@ const { tools, handlers } = forClaude(xpay, {
328
330
  // tools now includes both xpay_* and sana_* entries
329
331
  ```
330
332
 
331
- Or set `SANABOT_API_KEY` in the environment the MCP server picks it up without any code change.
333
+ Or set `SANABOT_API_KEY` in the environment - the MCP server picks it up without any code change.
332
334
 
333
335
  ### Unlink
334
336
 
@@ -338,15 +340,15 @@ xpay sana unlink # removes the key from the profile
338
340
 
339
341
  The `sana_*` tools disappear from the MCP server on next restart.
340
342
 
341
- ## AgenC marketplace hire on-chain agents
343
+ ## AgenC marketplace - hire on-chain agents
342
344
 
343
- [AgenC](https://agenc.ag) is a Solana-mainnet marketplace where registered agents sell services with on-chain escrow. Its hireable listings appear in `xpay discover` alongside x402 services but they **execute differently**, and xpay routes them automatically:
345
+ [AgenC](https://agenc.ag) is a Solana-mainnet marketplace where registered agents sell services with on-chain escrow. Its hireable listings appear in `xpay discover` alongside x402 services - but they **execute differently**, and xpay routes them automatically:
344
346
 
345
347
  | | x402 service | AgenC listing |
346
348
  |---|---|---|
347
349
  | Priced in | USDC | native **SOL** |
348
350
  | Payment | HTTP `X-Payment` header | on-chain **escrow** (program `HJsZ…w1xK`) |
349
- | Result | immediate HTTP response | **hire receipt** the provider works asynchronously |
351
+ | Result | immediate HTTP response | **hire receipt** - the provider works asynchronously |
350
352
  | Settlement | instant | after your review window (default 24h) |
351
353
 
352
354
  ```bash
@@ -355,10 +357,10 @@ xpay agenc hire <listingPda> # confirm → escrow SOL → get a ta
355
357
  xpay agenc status <taskPda> # poll: open → claimed → review → settled
356
358
  ```
357
359
 
358
- The same smart routing works in the SDK and MCP `xpay.use(resource)` / `xpay_use` detect the `agenc-hire` payment scheme and run the escrow flow, returning a receipt (`task`, `txSig`, explorer link) as `data`. Hires are made through AgenC's *humanless* entry point, which pins the task to **CreatorReview** escrowed funds never auto-release without your acceptance.
360
+ The same smart routing works in the SDK and MCP - `xpay.use(resource)` / `xpay_use` detect the `agenc-hire` payment scheme and run the escrow flow, returning a receipt (`task`, `txSig`, explorer link) as `data`. Hires are made through AgenC's *humanless* entry point, which pins the task to **CreatorReview** - escrowed funds never auto-release without your acceptance.
359
361
 
360
362
  Notes:
361
- - Discovery reads AgenC's **hosted indexer** via their official SDK client the integration path AgenC documents and hires locate the on-chain moderation attestation across seed-scheme generations, so xpay keeps working across AgenC's frequent program upgrades. Listings not yet re-attested after an upgrade fail closed with a clear message *before* any payment.
363
+ - Discovery reads AgenC's **hosted indexer** via their official SDK client, the integration path AgenC documents, and hires locate the on-chain moderation attestation across seed-scheme generations, so xpay keeps working across AgenC's frequent program upgrades. Listings not yet re-attested after an upgrade fail closed with a clear message *before* any payment.
362
364
  - The guardrail applies to hires too: SOL prices are converted to USD at spot (multi-feed, cached) and checked against `maxPerTx`/`maxPerDay` **before signing**. If no price feed is reachable and caps are set, the hire fails closed.
363
365
  - The wallet needs **SOL** (escrow + fees), not just USDC.
364
366
  - Reviewing/accepting results happens on [agenc.ag](https://agenc.ag) for now; `xpay agenc accept` is planned.
@@ -366,7 +368,7 @@ Notes:
366
368
 
367
369
  ## Token discovery & swap (Solana)
368
370
 
369
- Find any Solana token by ticker or mint address and swap into it from your own wallet keyless, via Jupiter's meta-aggregator:
371
+ Find any Solana token by ticker or mint address and swap into it from your own wallet - keyless, via Jupiter's meta-aggregator:
370
372
 
371
373
  ```bash
372
374
  xpay token find BONK # price, mcap, liquidity, mint, ✓ verified / ⚠ unverified
@@ -382,7 +384,7 @@ const result = await xpay.swap({ amount: 0.5, from: "SOL", to: tokens[0].mint })
382
384
 
383
385
  Notes:
384
386
  - **Verification matters.** Anyone can mint a token reusing a real ticker. Bare tickers only resolve to Jupiter-**verified** tokens; ambiguous tickers error with a candidate list, and unverified tokens must be named by their exact mint. `xpay token find` shows the flag.
385
- - **The guardrail applies.** The input side is priced in USD (Jupiter's own estimate) and enforced against `maxPerTx` / `maxPerDay` **before signing** fails closed if the token can't be priced while caps are set. Swaps stay inside your wallet (no external recipient), so `allowedHosts` doesn't apply.
387
+ - **The guardrail applies.** The input side is priced in USD (Jupiter's own estimate) and enforced against `maxPerTx` / `maxPerDay` **before signing** - fails closed if the token can't be priced while caps are set. Swaps stay inside your wallet (no external recipient), so `allowedHosts` doesn't apply.
386
388
  - **Slippage** defaults to Jupiter's dynamic slippage; override per call (`--slippage-bps`) or per profile (`swap.slippageBps`).
387
389
  - Keyless by default (~20 req/s shared bucket). Set `JUPITER_API_KEY` (or profile `swap.apiKey`) for higher limits; `XPAY_JUPITER_ENDPOINT` overrides the API base.
388
390
  - This is the **native** swap in your own xpay wallet. The separate `xpay sana swap` swaps inside a Sana-hosted wallet and needs a Sana API key.
@@ -410,7 +412,7 @@ Notes:
410
412
 
411
413
  ## Robinhood Chain trading
412
414
 
413
- Trade the [NOXA Fun](https://fun.noxa.fi/robinhood) memecoin scene on **Robinhood Chain** (Robinhood's Arbitrum L2, chain `4663`) straight from your own wallet no API key. NOXA Fun tokens launch into Uniswap V3 pools quoted in native ETH, so trading is plain on-chain V3: quote via QuoterV2, execute via SwapRouter02. Discovery (trending / new tokens, USD pricing) comes from GeckoTerminal's public API.
415
+ Trade the [NOXA Fun](https://fun.noxa.fi/robinhood) memecoin scene on **Robinhood Chain** (Robinhood's Arbitrum L2, chain `4663`) straight from your own wallet - no API key. NOXA Fun tokens launch into Uniswap V3 pools quoted in native ETH, so trading is plain on-chain V3: quote via QuoterV2, execute via SwapRouter02. Discovery (trending / new tokens, USD pricing) comes from GeckoTerminal's public API.
414
416
 
415
417
  ```bash
416
418
  xpay trending # what's hot on Robinhood Chain (free, no wallet)
@@ -428,34 +430,34 @@ const result = await xpay.trade({ amount: 0.01, from: "ETH", to: hot[0].address
428
430
 
429
431
  Notes:
430
432
  - **Scope:** ETH ⇄ token only (buy with native ETH, sell back to ETH). Buys auto-wrap ETH; sells unwrap WETH → ETH in one transaction.
431
- - **The guardrail applies.** The input side is priced in USD (GeckoTerminal spot) and enforced against `maxPerTx` / `maxPerDay` **before signing** same boundary as `xpay swap`.
432
- - **Verification.** A token confirmed as a NOXA Fun launch is marked verified; anything else is flagged `unverified` (memecoin tickers aren't unique prefer passing the exact contract address). NOXA per-tx / max-wallet transfer caps are checked before signing: a buy that would breach one errors up front (instead of reverting on-chain), and the quote flags trades that come close.
433
+ - **The guardrail applies.** The input side is priced in USD (GeckoTerminal spot) and enforced against `maxPerTx` / `maxPerDay` **before signing** - same boundary as `xpay swap`.
434
+ - **Verification.** A token confirmed as a NOXA Fun launch is marked verified; anything else is flagged `unverified` (memecoin tickers aren't unique - prefer passing the exact contract address). NOXA per-tx / max-wallet transfer caps are checked before signing: a buy that would breach one errors up front (instead of reverting on-chain), and the quote flags trades that come close.
433
435
  - **Gas:** unlike x402 payments, trades are broadcast from your wallet, so it needs a little ETH on Robinhood Chain for gas. Bridge via [Across](https://across.to) or the Uniswap bridge. RPC override: profile `rpcs.robinhood`.
434
436
  - **Slippage** defaults to 100 bps (1%); override per call (`--slippage-bps`) or per profile (`trading.slippageBps`).
435
437
  - **Balances:** `xpay balance` lists your Robinhood Chain ETH plus every ERC-20 you hold (via the chain's Blockscout explorer), so tokens bought here show up automatically. Override the explorer with `XPAY_ROBINHOOD_EXPLORER`.
436
- - This is distinct from `xpay swap` (Solana / Jupiter). GMGN was evaluated and skipped it doesn't support Robinhood Chain.
438
+ - This is distinct from `xpay swap` (Solana / Jupiter). GMGN was evaluated and skipped - it doesn't support Robinhood Chain.
437
439
 
438
440
  ## Realtime X (Twitter) data
439
441
 
440
- Agents can pull live X account data with zero setup no X developer account, no API key. xpay pays xona's x402-gated proxy per call, which passes X's pay-per-use billing through **at cost** (no markup):
442
+ Agents can pull live X account data with zero setup - no X developer account, no API key. xpay pays xona's x402-gated proxy per call, which passes X's pay-per-use billing through **at cost** (no markup):
441
443
 
442
444
  ```bash
443
445
  xpay x user jup_ag # profile: followers, bio, verification (~$0.01)
444
446
  xpay x posts jup_ag # 10 recent posts + engagement metrics (~$0.06)
445
447
  ```
446
448
 
447
- MCP: `xpay_x_user` / `xpay_x_posts` the classic flow is token due diligence: `xpay_token_find` → check the project's X account → swap only if it holds up. Payments go through the normal x402 flow, so the guardrail caps apply. Endpoint override: `XPAY_XDATA_ENDPOINT`.
449
+ MCP: `xpay_x_user` / `xpay_x_posts` - the classic flow is token due diligence: `xpay_token_find` → check the project's X account → swap only if it holds up. Payments go through the normal x402 flow, so the guardrail caps apply. Endpoint override: `XPAY_XDATA_ENDPOINT`.
448
450
 
449
451
  ## zauth repo security scans
450
452
 
451
- Scan any git repository for code provenance and vulnerabilities via [zauth](https://zauth.inc)'s x402-paywalled scanner (partner integration) returns a zauth score (0–100) plus a markdown analysis. Only the scan kickoff is paid (~$0.05 USDC on Solana or Base) and the guardrail caps apply (if your profile restricts `allowedHosts`, add `api.zauth.inc`). Status checks are free and need no wallet:
453
+ Scan any git repository for code provenance and vulnerabilities via [zauth](https://zauth.inc)'s x402-paywalled scanner (partner integration) - returns a zauth score (0–100) plus a markdown analysis. Only the scan kickoff is paid (~$0.05 USDC on Solana or Base) and the guardrail caps apply (if your profile restricts `allowedHosts`, add `api.zauth.inc`). Status checks are free and need no wallet:
452
454
 
453
455
  ```bash
454
456
  xpay zauth reposcan https://github.com/owner/repo # paid: starts the scan (or returns a cached report)
455
457
  xpay zauth status <sessionToken> # free: poll a still-running scan
456
458
  ```
457
459
 
458
- A scan either returns a cached report immediately or `{ status: "scanning", scanId, sessionToken }`; xpay polls the free status endpoint automatically and hands you the sessionToken if the scan outlives the wait window. Follow up with the **sessionToken** (the JWT, valid ~1 hour) not the scanId.
460
+ A scan either returns a cached report immediately or `{ status: "scanning", scanId, sessionToken }`; xpay polls the free status endpoint automatically and hands you the sessionToken if the scan outlives the wait window. Follow up with the **sessionToken** (the JWT, valid ~1 hour) - not the scanId.
459
461
 
460
462
  MCP: `xpay_zauth_reposcan` (paid, polls up to ~90s) / `xpay_zauth_scan_status` (free follow-up). Endpoint override: `XPAY_ZAUTH_ENDPOINT`.
461
463
 
@@ -488,23 +490,45 @@ MCP: `xpay_shop_lens` (paid) / `xpay_shop_lens_quote` (free preflight: validates
488
490
  ```json
489
491
  {
490
492
  "version": 1,
491
- "networks": ["solana", "base", "arbitrum"],
493
+ "networks": ["solana", "base", "arbitrum", "stable"],
492
494
  "defaultNetwork": "solana",
493
495
  "rpcs": {
494
496
  "solana": "https://your-helius-endpoint",
495
- "base": "https://your-alchemy-endpoint"
497
+ "base": "https://your-alchemy-endpoint",
498
+ "stable": "https://rpc.stable.xyz"
496
499
  }
497
500
  }
498
501
  ```
499
502
 
500
503
  Public RPCs work for development but rate-limit hard. Production deployments should configure dedicated RPC endpoints.
501
504
 
505
+ ### Stable chain
506
+
507
+ **Stable** (chain `988`, Tether/Bitfinex's payments L1) is supported as a first-class wallet network. It settles **USDT0** (the LayerZero OFT at `0x779Ded0c9e1022225f8E0630b35a9b54bE713736`, 6 decimals as an ERC-20), not USDC.
508
+
509
+ The same derived EVM key covers it, so a Stable signer is registered on **every** profile whether or not `stable` is in `networks`. You get it without re-running `xpay init`:
510
+
511
+ ```bash
512
+ xpay balance # includes a stable row: USDT0 + native USDT gas
513
+ xpay balance --network stable
514
+ xpay discover "image generation" --network stable
515
+ xpay transfer 1.5 0xRecipient --network stable # sends USDT0
516
+ ```
517
+
518
+ Notes:
519
+
520
+ - **Payments are gasless.** x402 calls on Stable sign an EIP-3009 `transferWithAuthorization` and the facilitator broadcasts, so the wallet needs USDT0 only - no native gas. Direct `xpay transfer` *is* broadcast from your wallet, so that path needs a little native USDT for gas.
521
+ - **The EIP-712 domain is `USDT0` / `1`, not the USDC default.** xpay never hardcodes it: the domain is read from `extra` on the live 402 challenge, which is the only reliable source (`version()` and `eip712Domain()` both revert on this contract).
522
+ - **Two tokens share a name.** The native gas coin is USDT at 18 decimals; the ERC-20 that x402 settles is USDT0 at 6. `xpay balance` lists them separately.
523
+ - **Routing is automatic.** A 402 quoting `eip155:988` resolves to the Stable signer, and `use()` compares USDT0 balance against the price when several chains are offered.
524
+ - RPC override: profile `rpcs.stable` (default `https://rpc.stable.xyz`). Explorer: [stablescan.xyz](https://stablescan.xyz).
525
+
502
526
  ## How it works
503
527
 
504
- - **Keys** One BIP-39 mnemonic per profile derives Solana (`m/44'/501'/0'/0'`, Phantom-compatible) and EVM (`m/44'/60'/0'/0/0`, MetaMask-compatible) keypairs. Encrypted at rest with scrypt + AES-256-GCM.
505
- - **Discovery** the catalog spans 21k+ x402 endpoints across multiple chains **Solana, Base, BNB Chain, and other EVM networks** plus AgenC marketplace listings, merged from independent sources (`Promise.allSettled`, so one source failing never kills discovery). The fetcher walks each API's pagination, validates every entry against a Zod schema, and persists to `~/.xpay/cache/` so repeat lookups skip the cold-fetch tax. (Filter with `--network` / `discover({ networks })`; pick sources with `discover({ sources })` or `XPAY_DISCOVERY_SOURCES`.)
506
- - **Pay** `use()` and `useByUrl()` both go: guardrail check → signer.pay(USDC) on the right network → `X-Payment` header → retry. The signer abstraction means the same code path works for Solana SPL transfers and EVM ERC-20 transfers. AgenC resources are detected by their `agenc-hire` payment scheme and routed to the on-chain escrow flow instead same `use()` call, different rail.
507
- - **Report** Comprehensive USDC activity (daily / weekly / monthly) fetched from the OrbitX402 API. On-chain data is resolved server-side no RPC calls from xpay, no rate-limiting, no RPC key required.
528
+ - **Keys**: One BIP-39 mnemonic per profile derives Solana (`m/44'/501'/0'/0'`, Phantom-compatible) and EVM (`m/44'/60'/0'/0/0`, MetaMask-compatible) keypairs. Encrypted at rest with scrypt + AES-256-GCM.
529
+ - **Discovery**: the catalog spans 21k+ x402 endpoints across multiple chains (**Solana, Base, BNB Chain, and other EVM networks**) plus AgenC marketplace listings, merged from independent sources (`Promise.allSettled`, so one source failing never kills discovery). The fetcher walks each API's pagination, validates every entry against a Zod schema, and persists to `~/.xpay/cache/` so repeat lookups skip the cold-fetch tax. (Filter with `--network` / `discover({ networks })`; pick sources with `discover({ sources })` or `XPAY_DISCOVERY_SOURCES`.)
530
+ - **Pay**: `use()` and `useByUrl()` both go: guardrail check → signer.pay(USDC) on the right network → `X-Payment` header → retry. The signer abstraction means the same code path works for Solana SPL transfers and EVM ERC-20 transfers. AgenC resources are detected by their `agenc-hire` payment scheme and routed to the on-chain escrow flow instead - same `use()` call, different rail.
531
+ - **Report**: Comprehensive USDC activity (daily / weekly / monthly) fetched from the OrbitX402 API. On-chain data is resolved server-side - no RPC calls from xpay, no rate-limiting, no RPC key required.
508
532
 
509
533
  ## Project status
510
534
 
@@ -518,15 +542,15 @@ Public RPCs work for development but rate-limit hard. Production deployments sho
518
542
  - ✅ xona shop product discovery via x402 (`xpay shop search`), free quote preflight
519
543
  - ✅ RWA discovery on Solana (`xpay token rwa`): tokenized stocks/ETFs + USDY, swappable via `xpay swap`
520
544
  - ✅ Solana + Base mainnet with disk caching
521
- - ✅ Optional Sana agent card integration (`xpay sana link`) 8 additional `sana_*` tools
545
+ - ✅ Optional Sana agent card integration (`xpay sana link`) - 8 additional `sana_*` tools
522
546
  - ✅ AgenC marketplace as a discovery source + smart-routed SOL escrow hires (`xpay agenc hire|status`)
523
547
 
524
548
  **Planned:**
525
- - `bridge` USDC EVM ↔ SVM via CCTP (Circle's native burn/mint)
526
- - `link / unlink` opt-in cloud sync (audit log, dashboard)
549
+ - `bridge`, USDC EVM ↔ SVM via CCTP (Circle's native burn/mint)
550
+ - `link / unlink`, opt-in cloud sync (audit log, dashboard)
527
551
  - Pay catalog + xona-labs catalog as additional discovery sources
528
- - `xpay agenc accept|rate` review AgenC hire results without leaving the CLI
552
+ - `xpay agenc accept|rate` - review AgenC hire results without leaving the CLI
529
553
 
530
554
  ## License
531
555
 
532
- MIT see [LICENSE](./LICENSE).
556
+ MIT - see [LICENSE](./LICENSE).
package/SKILL.md CHANGED
@@ -8,9 +8,9 @@ description: >-
8
8
  or SDK.
9
9
  ---
10
10
 
11
- # xPay a wallet and payment rail for agents
11
+ # Xona Wallet: a wallet and payment rail for agents
12
12
 
13
- xPay lets an agent **find a service, pay for it, and get the result** without
13
+ Xona Wallet lets an agent **find a service, pay for it, and get the result** without
14
14
  writing any payment plumbing. It hides x402, USDC, RPC, and multi-network
15
15
  routing behind a flat set of tools.
16
16
 
@@ -20,14 +20,14 @@ an intent and call it in one step).
20
20
 
21
21
  ## Setup (zero-config)
22
22
 
23
- Add xPay as an MCP server no keys, no init:
23
+ Add Xona Wallet as an MCP server - no keys, no init:
24
24
 
25
25
  ```jsonc
26
26
  { "mcpServers": { "xpay": { "command": "npx", "args": ["-y", "@xona-labs/xpay", "mcp"] } } }
27
27
  ```
28
28
 
29
29
  On first run the agent is given its **own wallet**. Its Solana address is
30
- printed to the server's stderr **fund that address with USDC** and the agent
30
+ printed to the server's stderr - **fund that address with USDC** and the agent
31
31
  can pay. The wallet persists and is reused across restarts.
32
32
 
33
33
  To use a wallet you already hold instead, set `XPAY_SOLANA_SECRET` (base58) in
@@ -41,11 +41,11 @@ the MCP `env`. To require an explicit wallet (no auto-generation), set
41
41
  | `xpay_discover` | Find paid services by natural-language query. Returns ranked candidates with price, network, and payee. |
42
42
  | `xpay_use` | Pay for and call a specific service. Pass the full `resource` object from `xpay_discover` (preferred), or a `resourceUrl`. Handles the x402 402-challenge → pay → retry flow. |
43
43
  | `xpay_do` | One step: discover the best service for an intent **and** call it. Use when you don't need to compare options. |
44
- | `xpay_transfer` | Send USDC (or any Solana SPL token) directly to an address. Executes immediately, gated by the user's guardrail confirm amount + destination with the user before calling. |
44
+ | `xpay_transfer` | Send USDC (or any Solana SPL token, or USDT0 on Stable) directly to an address. Executes immediately, gated by the user's guardrail - confirm amount + destination with the user before calling. |
45
45
  | `xpay_token_find` | Find Solana tokens by ticker, name, or mint (price, mcap, liquidity, `verified` flag). Read-only. |
46
46
  | `xpay_rwa_find` | List tradable RWA tokens on Solana: tokenized stocks/ETFs (xStocks, Ondo, Remora) + treasury-backed USDY. Free, read-only; results swappable via `xpay_swap`. |
47
47
  | `xpay_swap` | Swap tokens inside the wallet via Jupiter (Solana only). Irreversible; guardrail-gated. Confirm with the user first. |
48
- | `xpay_x_user` | Realtime X (Twitter) profile followers, bio, verification. Paid (~$0.01 at cost via x402). |
48
+ | `xpay_x_user` | Realtime X (Twitter) profile - followers, bio, verification. Paid (~$0.01 at cost via x402). |
49
49
  | `xpay_x_posts` | Recent posts from an X account with engagement metrics. Paid (~$0.06 at cost via x402). |
50
50
  | `xpay_shop_quote` | Free preflight for product search: exact price, marketplaces it would hit, and whether the query parses as a product search. Quote first when a query is ambiguous. |
51
51
  | `xpay_shop_search` | Product discovery across Google Shopping, Amazon, and eBay from one free-text query: normalized, deduped, ranked. Paid (~$0.02 via x402, less for fewer marketplaces). |
@@ -55,66 +55,73 @@ the MCP `env`. To require an explicit wallet (no auto-generation), set
55
55
  | `xpay_agenc_status` | Check the progress of an AgenC marketplace hire (see below). Read-only. |
56
56
  | `xpay_bento_status` | Check whether the Bento intent firewall is on (read-only). |
57
57
  | `xpay_bento_enable` | Turn the Bento intent firewall on. Returns the agent wallet address to register at app.bentoguard.xyz. |
58
- | `xpay_bento_disable` | Turn the Bento firewall off use if the wallet isn't registered and payments are rejected. |
58
+ | `xpay_bento_disable` | Turn the Bento firewall off - use if the wallet isn't registered and payments are rejected. |
59
59
 
60
60
  ## How payment works
61
61
 
62
62
  Services price calls in **USDC** over the **x402** protocol (typically fractions
63
63
  of a cent to a few cents per call). `xpay_use` / `xpay_do` settle the payment
64
- and call the service in one round-trip the agent just receives the result. A
64
+ and call the service in one round-trip - the agent just receives the result. A
65
65
  small platform fee ($0.01 USDC) applies per paid call.
66
66
 
67
- When a service accepts more than one network (e.g. Base **and** Solana), xPay
68
- **routes automatically to a funded network** it pays from the first one whose
67
+ When a service accepts more than one network (e.g. Base **and** Solana), Xona Wallet
68
+ **routes automatically to a funded network** - it pays from the first one whose
69
69
  balance covers the cost, so a $0 Base wallet falls through to a funded Solana
70
70
  one. If no network has the funds, the call fails fast with a clear
71
71
  "insufficient balance" message naming each network's balance.
72
72
 
73
+ Networks the wallet can pay from: Solana, Base and the other EVM chains,
74
+ Robinhood Chain, and **Stable** (chain 988, Tether's payments L1). Stable
75
+ settles in **USDT0**, not USDC - one derived EVM key covers it, so it is
76
+ always available and needs no setup. Fund it with USDT0; payments there are
77
+ gasless, so no native gas token is needed to pay.
78
+
73
79
  The agent pays from its own wallet, so **it must be funded first**. If a call
74
- fails for lack of funds, ask the user to send USDC to the address from
75
- `xpay_balance` (Solana mainnet or Base).
80
+ fails for lack of funds, ask the user to send the right stablecoin to the
81
+ matching address from `xpay_balance` - USDC on Solana mainnet or Base, USDT0
82
+ on Stable.
76
83
 
77
- ## AgenC marketplace listings a different execution rail
84
+ ## AgenC marketplace listings - a different execution rail
78
85
 
79
86
  `xpay_discover` results may include **AgenC marketplace** listings
80
- (`metadata.source === "agenc"`) on-chain agent services priced in **SOL**,
87
+ (`metadata.source === "agenc"`) - on-chain agent services priced in **SOL**,
81
88
  not USDC. Calling `xpay_use` on one is detected automatically and runs a
82
89
  Solana **escrow hire** instead of an HTTP payment:
83
90
 
84
91
  - The listing's SOL price is escrowed on-chain; the wallet needs **SOL**, not
85
92
  USDC, for these.
86
93
  - The result is a **hire receipt** (`data.kind === "agenc-hire-receipt"` with
87
- `task`, `txSig`, `explorer`), **not** the service's output the provider
94
+ `task`, `txSig`, `explorer`), **not** the service's output - the provider
88
95
  works asynchronously.
89
96
  - Poll `xpay_agenc_status { taskPda }` to track progress:
90
97
  `open/claimed → review → settled`. A just-created task can 404 for ~a minute
91
98
  (the API snapshot lags); retry, don't treat it as failure.
92
99
  - Tell the user the work is in progress and how to review it
93
- (https://agenc.ag/tasks/<taskPda>) escrow only settles after their review
100
+ (https://agenc.ag/tasks/<taskPda>) - escrow only settles after their review
94
101
  window.
95
102
 
96
103
  The guardrail still applies (SOL converted to USD at spot, checked before
97
104
  signing), and hires never auto-release funds without the buyer's acceptance.
98
105
 
99
- ## Safety built in, respect it
106
+ ## Safety - built in, respect it
100
107
 
101
108
  - **Spending guardrail.** Per-tx and per-day USD caps and an allowed-host list
102
109
  are enforced *before* signing. A blocked call throws; don't try to route
103
- around it surface the limit to the user.
110
+ around it - surface the limit to the user.
104
111
  - **Transfers and swaps move real funds immediately.** Show the user the
105
112
  amount + destination (or the swap pair, USD value, and output-token mint)
106
113
  and get their explicit approval *before* calling `xpay_transfer` or
107
114
  `xpay_swap`. Never move funds unprompted. The guardrail enforces the user's
108
115
  caps before signing either way.
109
116
  - **Check token verification.** Before any swap, confirm the output token's
110
- `verified` flag from `xpay_token_find` unverified tokens can be scams
117
+ `verified` flag from `xpay_token_find` - unverified tokens can be scams
111
118
  reusing a real ticker. Never swap into an unverified token unless the user
112
119
  explicitly confirms the exact mint address.
113
120
  - **Bento intent firewall (optional security layer).** When enabled, every
114
121
  payment is screened for malicious intent (prompt-injection, wallet-drain)
115
122
  before signing. A `BLOCKED` result means stop. Toggle with
116
123
  `xpay_bento_enable` / `xpay_bento_disable`; it needs a one-time wallet
117
- registration at app.bentoguard.xyz, and until then payments are rejected
124
+ registration at app.bentoguard.xyz, and until then payments are rejected -
118
125
  disable it to fall back to local caps if you don't want to register.
119
126
 
120
127
  ## Recipes
@@ -137,11 +144,11 @@ signing), and hires never auto-release funds without the buyer's acceptance.
137
144
 
138
145
  **Send funds (with approval)**
139
146
  1. Confirm the amount + destination with the user
140
- 2. `xpay_transfer { amount: 5, to: "<address>", token: "USDC" }` executes directly, guardrail-gated
147
+ 2. `xpay_transfer { amount: 5, to: "<address>", token: "USDC" }` - executes directly, guardrail-gated
141
148
 
142
149
  **Find and swap into a token (with approval)**
143
150
  1. `xpay_token_find { query: "BONK" }` → pick the intended token, check `verified`
144
- 2. Show the user: amount, USD value, output token name + mint + verification get approval
151
+ 2. Show the user: amount, USD value, output token name + mint + verification - get approval
145
152
  3. `xpay_swap { amount: 0.5, from: "SOL", to: "<mint from step 1>" }`
146
153
 
147
154
  **Token due diligence with X (Twitter)**