@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.
- package/CHANGELOG.md +133 -76
- package/README.md +95 -71
- package/SKILL.md +29 -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.d.ts.map +1 -1
- package/dist/cli/balance.js +11 -10
- package/dist/cli/balance.js.map +1 -1
- 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 +10 -4
- package/dist/cli/discover.js.map +1 -1
- 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.d.ts.map +1 -1
- package/dist/discover/index.js +21 -7
- package/dist/discover/index.js.map +1 -1
- 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.d.ts.map +1 -1
- package/dist/profile/index.js +13 -4
- package/dist/profile/index.js.map +1 -1
- 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.d.ts.map +1 -1
- package/dist/signers/raw-evm.js +22 -7
- package/dist/signers/raw-evm.js.map +1 -1
- 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.d.ts.map +1 -1
- package/dist/tools/index.js +46 -41
- package/dist/tools/index.js.map +1 -1
- 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 +6 -5
- package/dist/transfer/index.d.ts.map +1 -1
- package/dist/transfer/index.js +41 -21
- package/dist/transfer/index.js.map +1 -1
- package/dist/types.d.ts +10 -6
- package/dist/types.d.ts.map +1 -1
- package/dist/types.js.map +1 -1
- package/dist/use/index.d.ts +5 -5
- package/dist/use/index.js +24 -20
- package/dist/use/index.js.map +1 -1
- package/dist/wallet/index.d.ts +2 -2
- package/dist/wallet/index.d.ts.map +1 -1
- package/dist/wallet/index.js +5 -3
- package/dist/wallet/index.js.map +1 -1
- package/dist/x402/evm-payment.d.ts +4 -4
- package/dist/x402/evm-payment.d.ts.map +1 -1
- package/dist/x402/evm-payment.js +7 -6
- package/dist/x402/evm-payment.js.map +1 -1
- 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 +6 -3
package/README.md
CHANGED
|
@@ -1,4 +1,6 @@
|
|
|
1
|
-
#
|
|
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
|
[](https://www.npmjs.com/package/@xona-labs/xpay)
|
|
4
6
|
[](https://www.npmjs.com/package/@xona-labs/xpay)
|
|
@@ -6,7 +8,7 @@
|
|
|
6
8
|
[](https://registry.modelcontextprotocol.io/v0.1/servers?search=io.github.xona-labs/xpay)
|
|
7
9
|

|
|
8
10
|
|
|
9
|
-
> **Agentic-commerce wallet.** Multi-network USDC wallet, x402 payments, AgenC marketplace hires, and discovery across 20,000+ services
|
|
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
|
|
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
|
-
|
|
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
|
|
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` |
|
|
69
|
-
| `xpay discover [query]` | Search 21k+ x402 services across chains
|
|
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
|
|
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)
|
|
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
|
|
79
|
-
| `xpay zauth reposcan <repoUrl>` | Repository security scan via partner [zauth](#zauth-repo-security-scans)
|
|
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
|
|
84
|
-
| `xpay report` | Comprehensive USDC activity report
|
|
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
|
|
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
|
|
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
|
-
|
|
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
|
-
|
|
161
|
-
as **`io.github.xona-labs/xpay`**
|
|
162
|
-
install it by that name. For everything else, drop
|
|
163
|
-
config
|
|
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**
|
|
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**
|
|
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
|
|
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
|
|
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
|
|
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
|
|
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
|
|
249
|
-
- **`allowedHosts
|
|
250
|
-
- **`maxPerTx` / `maxPerDay
|
|
251
|
-
- **`allowedHosts
|
|
252
|
-
- **`requireApprovalAbove
|
|
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
|
|
258
|
+
`onApprovalRequired` hook to whatever you like - push notification, biometric, webhook.
|
|
257
259
|
|
|
258
|
-
## Security
|
|
260
|
+
## Security - Bento intent firewall (optional)
|
|
259
261
|
|
|
260
|
-
Spend caps stop an agent spending *too much*
|
|
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
|
|
271
|
+
xpay bento disable # turn off - falls back to local caps only
|
|
270
272
|
```
|
|
271
273
|
|
|
272
|
-
There's **no API key**
|
|
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
|
|
280
|
-
- **`BLOCKED
|
|
281
|
-
- **`ESCALATED
|
|
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
|
-
|
|
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
|
|
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
|
|
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
|
|
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
|
|
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
|
|
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
|
|
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
|
|
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**
|
|
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
|
|
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
|
|
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
|
|
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**
|
|
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
|
|
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**
|
|
432
|
-
- **Verification.** A token confirmed as a NOXA Fun launch is marked verified; anything else is flagged `unverified` (memecoin tickers aren't unique
|
|
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
|
|
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
|
|
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`
|
|
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)
|
|
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)
|
|
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
|
|
505
|
-
- **Discovery
|
|
506
|
-
- **Pay
|
|
507
|
-
- **Report
|
|
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`)
|
|
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
|
|
526
|
-
- `link / unlink
|
|
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`
|
|
552
|
+
- `xpay agenc accept|rate` - review AgenC hire results without leaving the CLI
|
|
529
553
|
|
|
530
554
|
## License
|
|
531
555
|
|
|
532
|
-
MIT
|
|
556
|
+
MIT - see [LICENSE](./LICENSE).
|
package/SKILL.md
CHANGED
|
@@ -8,9 +8,9 @@ description: >-
|
|
|
8
8
|
or SDK.
|
|
9
9
|
---
|
|
10
10
|
|
|
11
|
-
#
|
|
11
|
+
# Xona Wallet: a wallet and payment rail for agents
|
|
12
12
|
|
|
13
|
-
|
|
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
|
|
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
|
|
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
|
|
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
|
|
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
|
|
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
|
|
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),
|
|
68
|
-
**routes automatically to a funded network**
|
|
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
|
|
75
|
-
`xpay_balance`
|
|
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
|
|
84
|
+
## AgenC marketplace listings - a different execution rail
|
|
78
85
|
|
|
79
86
|
`xpay_discover` results may include **AgenC marketplace** listings
|
|
80
|
-
(`metadata.source === "agenc"`)
|
|
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
|
|
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>)
|
|
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
|
|
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
|
|
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`
|
|
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" }`
|
|
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
|
|
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)**
|