@dexterai/x402 5.4.2 → 6.0.0-rc.1

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 (51) hide show
  1. package/README.md +19 -4
  2. package/REFERENCE.md +81 -8
  3. package/dist/adapters/index.d.cts +3 -3
  4. package/dist/adapters/index.d.ts +3 -3
  5. package/dist/batch-settlement/index.d.cts +3 -3
  6. package/dist/batch-settlement/index.d.ts +3 -3
  7. package/dist/batch-settlement/seller/index.d.cts +4 -4
  8. package/dist/batch-settlement/seller/index.d.ts +4 -4
  9. package/dist/client/index.cjs +1 -1
  10. package/dist/client/index.d.cts +6 -6
  11. package/dist/client/index.d.ts +6 -6
  12. package/dist/client/index.js +1 -1
  13. package/dist/{constants-Icc4CXNG.d.cts → constants-BLvApMMl.d.cts} +1 -1
  14. package/dist/{constants-Icc4CXNG.d.ts → constants-BLvApMMl.d.ts} +1 -1
  15. package/dist/react/index.cjs +1 -1
  16. package/dist/react/index.d.cts +4 -4
  17. package/dist/react/index.d.ts +4 -4
  18. package/dist/react/index.js +1 -1
  19. package/dist/server/index.cjs +1 -1
  20. package/dist/server/index.d.cts +5 -5
  21. package/dist/server/index.d.ts +5 -5
  22. package/dist/server/index.js +1 -1
  23. package/dist/{sessions-BG2OYLBi.d.cts → sessions-rPdO1CgK.d.cts} +35 -3
  24. package/dist/{sessions-BG2OYLBi.d.ts → sessions-rPdO1CgK.d.ts} +35 -3
  25. package/dist/tab/adapters/solana/index.cjs +1 -1
  26. package/dist/tab/adapters/solana/index.d.cts +181 -26
  27. package/dist/tab/adapters/solana/index.d.ts +181 -26
  28. package/dist/tab/adapters/solana/index.js +1 -1
  29. package/dist/tab/index.cjs +5 -5
  30. package/dist/tab/index.d.cts +126 -21
  31. package/dist/tab/index.d.ts +126 -21
  32. package/dist/tab/index.js +4 -4
  33. package/dist/tab/seller/index.cjs +4 -4
  34. package/dist/tab/seller/index.d.cts +34 -26
  35. package/dist/tab/seller/index.d.ts +34 -26
  36. package/dist/tab/seller/index.js +4 -4
  37. package/dist/{types-BdS_uvNs.d.cts → types-BbvuPNXl.d.cts} +2 -2
  38. package/dist/{types-xQu1U4xk.d.cts → types-BvQpNtFw.d.cts} +9 -1
  39. package/dist/{types-xQu1U4xk.d.ts → types-BvQpNtFw.d.ts} +9 -1
  40. package/dist/{types-DY8xKheW.d.ts → types-CkcNYx1Q.d.ts} +2 -2
  41. package/dist/{types-Co5YYhVB.d.ts → types-CwLPKV8T.d.ts} +3 -3
  42. package/dist/{types-CZHPdVkg.d.cts → types-DnhCOjDx.d.cts} +3 -3
  43. package/dist/{types-_wdHzVG-.d.ts → types-DwVhPqOZ.d.ts} +2 -2
  44. package/dist/{types-WMqs5xII.d.cts → types-JpkrtFbZ.d.cts} +2 -2
  45. package/dist/{types-CSuISjXA.d.cts → types-OHNNM1J2.d.cts} +122 -7
  46. package/dist/{types-CSuISjXA.d.ts → types-OHNNM1J2.d.ts} +122 -7
  47. package/dist/utils/index.d.cts +1 -1
  48. package/dist/utils/index.d.ts +1 -1
  49. package/dist/{x402-client-BQKDeNxq.d.cts → x402-client-B8zdDeat.d.cts} +2 -2
  50. package/dist/{x402-client-BQKDeNxq.d.ts → x402-client-B8zdDeat.d.ts} +2 -2
  51. package/package.json +7 -6
package/README.md CHANGED
@@ -39,19 +39,34 @@ A **tab** keeps both halves. You open one against your own wallet with a single
39
39
  The cap is enforced at consensus by an on-chain program — not by this library, and not by Dexter. The closest familiar shape is an auth-and-capture card hold, except the hold lives on-chain instead of inside a processor, and no one ever takes your money.
40
40
 
41
41
  ```ts
42
- import { payUrlWithTab } from '@dexterai/x402/tab';
42
+ import { payUrlWithTab, type ReserveFinalVoucherV2 } from '@dexterai/x402/tab';
43
43
 
44
+ const reserveFinalVoucherV2: ReserveFinalVoucherV2 = async (input) => {
45
+ const response = await fetch('/api/native-tab/reserve', {
46
+ method: 'POST',
47
+ headers: { 'content-type': 'application/json' },
48
+ body: JSON.stringify(input),
49
+ });
50
+ if (!response.ok) throw new Error(`reservation failed: ${response.status}`);
51
+ return response.json();
52
+ };
44
53
  const tabs = new Map(); // one open tab per seller, reused across calls
45
54
  const { result, tab } = await payUrlWithTab(
46
55
  'https://api.example.com/paid/infer',
47
56
  { method: 'GET' },
48
- { vault, perUnitCap: '0.01', totalCap: '1.00', tabs },
57
+ {
58
+ vault,
59
+ perUnitCap: '0.01',
60
+ totalCap: '1.00',
61
+ tabs,
62
+ reserveFinalVoucherV2,
63
+ },
49
64
  );
50
65
  // ...the agent keeps calling; every call reuses the same tab, with no new prompt...
51
66
  await tab?.close(); // one on-chain settle pays the seller for everything
52
67
  ```
53
68
 
54
- That's the whole loop: one tap to open, unlimited calls under the cap, one settle to close. The seller's address comes off the wire from the URL's own `402` challenge — never from your code. The `vault` is built once from your passkey-rooted wallet; see [Setup](#setup).
69
+ That's the whole loop: one tap to open, unlimited calls under the cap, one settle to close. The seller's address comes off the wire from the URL's own `402` challenge — never from your code. The `vault` is built once from your passkey-rooted wallet; see [Setup](#setup). The reservation route belongs in your authenticated backend: it returns a voucher-bound receipt only after finality, and the SDK independently verifies the finalized Solana transaction, its Dexter-authority-signed voucher-binding Memo, and finalized Vault/SessionAccount state before releasing the FINAL voucher.
55
70
 
56
71
  ---
57
72
 
@@ -160,7 +175,7 @@ Tabs are Solana. One-shot and batch settlement span Solana and the major EVM cha
160
175
  ## More
161
176
 
162
177
  - **[REFERENCE.md](./REFERENCE.md)** — every export, option table, and example: tabs, one-shot, batch settlement, discovery.
163
- - **Upgrading?** `5.0.0` makes `@dexterai/vault` a peer dependency (`>=0.19`) and unifies the passkey signer on `signOperation`. Migration from v4/v3: [REFERENCE.md](./REFERENCE.md#migration).
178
+ - **Upgrading?** v6 pins the tested Vault `0.43.2` pair, requires voucher-bound V2 reservation receipts, and uses exact-state V3 revocation. Migration from v5/v4/v3: [REFERENCE.md](./REFERENCE.md#migration).
164
179
  - **License** — MIT, see [LICENSE](./LICENSE).
165
180
 
166
181
  ---
package/REFERENCE.md CHANGED
@@ -42,7 +42,7 @@ import { createSolanaAdapter, createEvmAdapter } from '@dexterai/x402/adapters';
42
42
  import { toAtomicUnits, fromAtomicUnits } from '@dexterai/x402/utils';
43
43
  ```
44
44
 
45
- > `@dexterai/vault` is a **peer dependency** (`>=0.19`): install it alongside `@dexterai/x402` so the tab adapter and your app share ONE vault instance. The passkey signer the adapter consumes is vault's canonical `signOperation(operationMessage)` — the same type your app builds, with no bridge shim.
45
+ > `@dexterai/vault` is an exact **peer dependency** at `0.43.2`: install it alongside the matching v6 x402 package so the adapter, revocation wire, and your app use one tested Vault contract.
46
46
 
47
47
  ---
48
48
 
@@ -50,16 +50,31 @@ import { toAtomicUnits, fromAtomicUnits } from '@dexterai/x402/utils';
50
50
 
51
51
  ### `payUrlWithTab(url, init, opts) → Promise<{ result, tab }>`
52
52
 
53
- Opens (or reuses) a lock-protected tab to the seller discovered from the URL's `402` challenge, and pays. `opts`: `{ vault, perUnitCap, totalCap, tabs }`. Reuse one `tabs` map across calls to keep a single open tab per seller; `tab.close()` settles everything spent in one transaction.
53
+ Opens (or reuses) a lock-protected tab to the seller discovered from the URL's `402` challenge, and pays. `opts`: `{ vault, perUnitCap, totalCap, tabs, reserveFinalVoucherV2 }`. Reuse one `tabs` map across calls to keep a single open tab per seller; `tab.close()` settles everything spent in one transaction. V2 requires `reserveFinalVoucherV2`; see [FINAL V2 reservation provider](#final-v2-reservation-provider).
54
54
 
55
55
  ```ts
56
- import { payUrlWithTab } from '@dexterai/x402/tab';
56
+ import { payUrlWithTab, type ReserveFinalVoucherV2 } from '@dexterai/x402/tab';
57
57
 
58
+ const reserveFinalVoucherV2: ReserveFinalVoucherV2 = async (input) => {
59
+ const response = await fetch('/api/native-tab/reserve', {
60
+ method: 'POST',
61
+ headers: { 'content-type': 'application/json' },
62
+ body: JSON.stringify(input),
63
+ });
64
+ if (!response.ok) throw new Error(`reservation failed: ${response.status}`);
65
+ return response.json();
66
+ };
58
67
  const tabs = new Map();
59
68
  const { result, tab } = await payUrlWithTab(
60
69
  'https://api.example.com/paid/infer',
61
70
  { method: 'GET' },
62
- { vault, perUnitCap: '0.01', totalCap: '1.00', tabs },
71
+ {
72
+ vault,
73
+ perUnitCap: '0.01',
74
+ totalCap: '1.00',
75
+ tabs,
76
+ reserveFinalVoucherV2,
77
+ },
63
78
  );
64
79
  await tab?.close();
65
80
  ```
@@ -90,10 +105,55 @@ Builds the `vault` adapter the buyer calls drive through.
90
105
  | `passkeySigner` | `PasskeySignerWithPublicKey` | A `signOperation(operationMessage)` signer (see below) |
91
106
  | `feePayer` | `Signer` | Lamport fee payer |
92
107
 
93
- The `passkeySigner` is vault 0.19's canonical shape: `{ credentialId, publicKey, signOperation(operationMessage) }`. The signer hashes the operation message internally (`challenge = sha256(op)`, the on-chain `webauthn.rs` law) and the adapter owns only the precompile assembly.
108
+ The `passkeySigner` uses Vault 0.43.2's canonical shape: `{ credentialId, publicKey, signOperation(operationMessage) }`. The adapter passes the raw operation bytes. The signer obtains the canonical V7 200-byte challenge binding the fixed program, exact vault, current monotonic authorization nonce, operation hash, and fresh ceremony entropy; the adapter owns only the precompile assembly. Do not substitute a bare `sha256(operationMessage)` challenge for V7 operations.
94
109
 
95
110
  - **Browser:** vault's `DexterApiBrowserPasskeySigner` — drops in with no shim.
96
- - **CLI / server agent:** `passkeySignerFromP256Keypair(kp)` from `@dexterai/x402/tab/adapters/solana`, wrapping a locally-held P-256 keypair.
111
+ - **CLI / server agent:** `passkeySignerFromP256Keypair(kp, { resolveAuthorizationContext })` from `@dexterai/x402/tab/adapters/solana`, wrapping a locally-held P-256 keypair. The resolver must read the current `PasskeyAuthorization` state immediately before a revoke ceremony; the helper never guesses that nonce.
112
+
113
+ ```ts
114
+ import { fetchPasskeyAuthorizationState } from '@dexterai/vault';
115
+ import { DEXTER_VAULT_PROGRAM_ID } from '@dexterai/vault/constants';
116
+ import { passkeySignerFromP256Keypair } from '@dexterai/x402/tab/adapters/solana';
117
+ import { PublicKey } from '@solana/web3.js';
118
+
119
+ const passkeySigner = passkeySignerFromP256Keypair(kp, {
120
+ resolveAuthorizationContext: async () => {
121
+ const authorization = await fetchPasskeyAuthorizationState(
122
+ connection,
123
+ new PublicKey(vaultPda),
124
+ );
125
+ if (!authorization) throw new Error('passkey authorization unavailable');
126
+ return {
127
+ programId: DEXTER_VAULT_PROGRAM_ID,
128
+ vault: authorization.vault,
129
+ nonce: authorization.nonce,
130
+ };
131
+ },
132
+ });
133
+ ```
134
+
135
+ ### FINAL V2 reservation provider
136
+
137
+ Before a FINAL V2 voucher is returned to merchant-facing code, the buyer must reserve its exact increment through `reserveFinalVoucherV2`. This is a money-side effect and normally belongs in the buyer's authenticated backend, not browser JavaScript. The callback must be idempotent for the same input, use `input.idempotencyKey` as its stable caller-operation identity, and return the complete `FinalVoucherV2ReservationReceipt` only after the exact transaction reaches Solana finalized commitment. Provider receipt and lifecycle IDs remain provider-owned; they are not aliases for the SDK idempotency key. The finalized transaction must contain exactly the canonical `settle_voucher(increment=true)` instruction followed by an SPL Memo v2 instruction whose sole account is the Dexter authority signer and whose UTF-8 data is `finalVoucherV2ReservationMemo(input)`. The Solana adapter independently verifies both instructions and coherent finalized Vault/SessionAccount post-state. A merely confirmed receipt, `{ armed: true }`, a broadcast-only response, a provider-only voucher assertion, or a receipt that does not match the voucher is rejected.
138
+
139
+ ```ts
140
+ const { result, tab } = await payUrlWithTab(url, init, {
141
+ vault,
142
+ perUnitCap: '0.01',
143
+ totalCap: '1.00',
144
+ reserveFinalVoucherV2: async (input) => {
145
+ const response = await fetch('https://your-backend.example/native-tab/reserve', {
146
+ method: 'POST',
147
+ headers: { 'content-type': 'application/json' },
148
+ body: JSON.stringify(input),
149
+ });
150
+ if (!response.ok) throw new Error(`reservation failed: ${response.status}`);
151
+ return response.json();
152
+ },
153
+ });
154
+ ```
155
+
156
+ The Vault instruction proves the exact session and amount. The immediately following authority-signed Memo carries `dexter-native-tab-v2-reservation/v1:<sha256>` and binds that reservation to the complete FINAL voucher and pre-reservation frontier. Provider receipt, lifecycle, and retry identifiers are deliberately outside that shared economic digest and remain separately validated receipt metadata. The provider receipt is durable lifecycle evidence, but it is not the sole voucher binding and cannot replace either transaction instruction.
97
157
 
98
158
  ---
99
159
 
@@ -119,6 +179,8 @@ app.get('/paid/tick',
119
179
 
120
180
  For a tab-only endpoint, compose the two middlewares directly: `tabChallengeMiddleware` (answers voucher-less requests with the standard x402 challenge, so any agent can discover you) before `tabMiddleware` (verifies the per-charge vouchers). Both are exported from `@dexterai/x402/tab/seller`.
121
181
 
182
+ For Native Tab V2, the buyer carries the complete reservation receipt inside the same `X-Tab-Voucher` envelope. Seller middleware treats it only as an untrusted transaction locator: before your handler can deliver, it re-reads the exact SessionAccount PDA at finalized commitment, verifies the active registration and wire version, requires `currentOutstanding` to equal the voucher's uncovered increment, fetches the finalized reservation transaction, recomputes the Memo for the presented voucher, verifies the Dexter authority signature, and reads coherent post-state at or after that transaction's independently observed slot. A cached registration, equal amount, provider assertion, or confirmed-only transaction is not delivery authorization.
183
+
122
184
  How the protection works: as the agent spends, accrued charges crystallize on-chain into a reservation against the buyer's wallet — sized to exactly what's accrued, not the whole wallet — so the buyer can't withdraw out from under your charges. One on-chain settle at close pays your `sellerPubkey` for everything metered; you hold no key and sign nothing.
123
185
 
124
186
  ---
@@ -236,12 +298,23 @@ Endpoints paid through the facilitator are auto-discovered, named, and quality-t
236
298
 
237
299
  ## Migration
238
300
 
301
+ ### Migrating to 6.0.0
302
+
303
+ 1. Install the current tested pair: `npm install @dexterai/x402 @dexterai/vault`.
304
+ 2. Add `sessionVoucherVersion` to every custom `VaultAdapter`. Buyer-side V1 open and reconstruction are not supported in v6 and throw `HistoricalV1MigrationRequiredError`; settle or revoke a historical V1 session through the deployment that originally opened it, then create a context-bound V2 session. Seller-side verification remains available only for already-issued V1 vouchers.
305
+ 3. For V2, implement `verifyFinalVoucherV2Reservation` and replace boolean reservation callbacks with the complete versioned receipt.
306
+ 4. Treat `Tab.voucherVersion` as required. Missing or invalid runtime values fail closed.
307
+ 5. Node P-256 signers must resolve the current authorization state for revoke; unknown operations no longer silently use the legacy hash.
308
+ 6. Serialize access to a Tab at the application boundary as well. The runtime now rejects concurrent sign/close calls rather than allowing duplicate sequence issuance.
309
+
310
+ `5.4.2` may be used only with its historical, compatible Vault range. Do not pair it with Vault `0.43.x`; its close wire predates exact-state V3 revocation.
311
+
239
312
  ### Migrating to 5.0.0 (breaking)
240
313
 
241
314
  Two changes, both about packaging and the passkey signer — the payment path itself is unchanged.
242
315
 
243
- 1. **`@dexterai/vault` is now a peer dependency** (`>=0.19`), not bundled. The tab adapter and your app share ONE vault instance, so there are no duplicate copies and no `instanceof`/type mismatches across packages. Install it alongside: `npm install @dexterai/x402 @dexterai/vault`.
244
- 2. **The passkey signer contract is `signOperation(operationMessage)`**, replacing the old `sign(challenge)`. The adapter now hands the signer the RAW operation message and the signer hashes it internally (`challenge = sha256(op)`, the on-chain `webauthn.rs` law). If you wrote a custom signer against `sign(challenge)`, rename the method to `signOperation` and delete your pre-hash pass the message straight through. Vault's `DexterApiBrowserPasskeySigner` (browser) and this package's `passkeySignerFromP256Keypair` (node/agent) already conform.
316
+ 1. **`@dexterai/vault` became a peer dependency** in v5, rather than a bundled dependency. Current v6 consumers must use the exact tested `0.43.2` pair described above.
317
+ 2. **The passkey signer contract is `signOperation(operationMessage)`**, replacing the old `sign(challenge)`. The adapter hands the signer the RAW operation message. A V7 signer must resolve the authoritative vault authorization nonce and build the canonical 200-byte challenge; bare `sha256(op)` is legacy-only and fails closed on V7. If you wrote a custom signer against `sign(challenge)`, pass the raw operation into Dexter's canonical challenge policy instead of accepting a caller-supplied challenge. Vault's browser signer and this package's `passkeySignerFromP256Keypair` node/agent signer already conform for the supported session operations.
245
318
 
246
319
  To pin the old surface, stay on `@dexterai/x402@^4`.
247
320
 
@@ -1,6 +1,6 @@
1
- import { l as SolanaAdapter, m as EvmAdapter, C as ChainAdapter } from '../types-xQu1U4xk.cjs';
2
- export { n as AdapterConfig, B as BalanceInfo, E as EvmWallet, G as GenericWallet, o as SignedTransaction, a as SolanaWallet, W as WalletSet, b as createEvmAdapter, c as createSolanaAdapter, q as isEvmWallet, p as isSolanaWallet } from '../types-xQu1U4xk.cjs';
3
- export { A as ARBITRUM_ONE, l as AVALANCHE, B as BASE_MAINNET, j as BASE_SEPOLIA, f as BSC_MAINNET, i as BSC_STABLECOIN_ADDRESSES, h as BSC_USDC, g as BSC_USDT, q as EIP712_DOMAINS, E as ETHEREUM_MAINNET, M as MONAD_MAINNET, O as OPTIMISM, P as PERMIT2_ADDRESS, k as POLYGON, R as ROBINHOOD_MAINNET, m as ROBINHOOD_USDG, n as SKALE_BASE, o as SKALE_BASE_SEPOLIA, d as SOLANA_DEVNET, S as SOLANA_MAINNET, e as SOLANA_TESTNET, p as USDC_ADDRESSES, W as WORLD_MAINNET, X as X402_EXACT_PERMIT2_PROXY } from '../constants-Icc4CXNG.cjs';
1
+ import { S as SolanaAdapter, E as EvmAdapter, C as ChainAdapter } from '../types-BvQpNtFw.cjs';
2
+ export { A as AdapterConfig, B as BalanceInfo, a as EvmWallet, G as GenericWallet, b as SignedTransaction, c as SolanaWallet, W as WalletSet, d as createEvmAdapter, e as createSolanaAdapter, i as isEvmWallet, f as isSolanaWallet } from '../types-BvQpNtFw.cjs';
3
+ export { A as ARBITRUM_ONE, a as AVALANCHE, B as BASE_MAINNET, b as BASE_SEPOLIA, c as BSC_MAINNET, d as BSC_STABLECOIN_ADDRESSES, e as BSC_USDC, f as BSC_USDT, E as EIP712_DOMAINS, g as ETHEREUM_MAINNET, M as MONAD_MAINNET, O as OPTIMISM, P as PERMIT2_ADDRESS, h as POLYGON, R as ROBINHOOD_MAINNET, i as ROBINHOOD_USDG, S as SKALE_BASE, j as SKALE_BASE_SEPOLIA, k as SOLANA_DEVNET, l as SOLANA_MAINNET, m as SOLANA_TESTNET, U as USDC_ADDRESSES, W as WORLD_MAINNET, X as X402_EXACT_PERMIT2_PROXY } from '../constants-BLvApMMl.cjs';
4
4
 
5
5
  /**
6
6
  * Check if an asset address is a known USDC contract (any chain).
@@ -1,6 +1,6 @@
1
- import { l as SolanaAdapter, m as EvmAdapter, C as ChainAdapter } from '../types-xQu1U4xk.js';
2
- export { n as AdapterConfig, B as BalanceInfo, E as EvmWallet, G as GenericWallet, o as SignedTransaction, a as SolanaWallet, W as WalletSet, b as createEvmAdapter, c as createSolanaAdapter, q as isEvmWallet, p as isSolanaWallet } from '../types-xQu1U4xk.js';
3
- export { A as ARBITRUM_ONE, l as AVALANCHE, B as BASE_MAINNET, j as BASE_SEPOLIA, f as BSC_MAINNET, i as BSC_STABLECOIN_ADDRESSES, h as BSC_USDC, g as BSC_USDT, q as EIP712_DOMAINS, E as ETHEREUM_MAINNET, M as MONAD_MAINNET, O as OPTIMISM, P as PERMIT2_ADDRESS, k as POLYGON, R as ROBINHOOD_MAINNET, m as ROBINHOOD_USDG, n as SKALE_BASE, o as SKALE_BASE_SEPOLIA, d as SOLANA_DEVNET, S as SOLANA_MAINNET, e as SOLANA_TESTNET, p as USDC_ADDRESSES, W as WORLD_MAINNET, X as X402_EXACT_PERMIT2_PROXY } from '../constants-Icc4CXNG.js';
1
+ import { S as SolanaAdapter, E as EvmAdapter, C as ChainAdapter } from '../types-BvQpNtFw.js';
2
+ export { A as AdapterConfig, B as BalanceInfo, a as EvmWallet, G as GenericWallet, b as SignedTransaction, c as SolanaWallet, W as WalletSet, d as createEvmAdapter, e as createSolanaAdapter, i as isEvmWallet, f as isSolanaWallet } from '../types-BvQpNtFw.js';
3
+ export { A as ARBITRUM_ONE, a as AVALANCHE, B as BASE_MAINNET, b as BASE_SEPOLIA, c as BSC_MAINNET, d as BSC_STABLECOIN_ADDRESSES, e as BSC_USDC, f as BSC_USDT, E as EIP712_DOMAINS, g as ETHEREUM_MAINNET, M as MONAD_MAINNET, O as OPTIMISM, P as PERMIT2_ADDRESS, h as POLYGON, R as ROBINHOOD_MAINNET, i as ROBINHOOD_USDG, S as SKALE_BASE, j as SKALE_BASE_SEPOLIA, k as SOLANA_DEVNET, l as SOLANA_MAINNET, m as SOLANA_TESTNET, U as USDC_ADDRESSES, W as WORLD_MAINNET, X as X402_EXACT_PERMIT2_PROXY } from '../constants-BLvApMMl.js';
4
4
 
5
5
  /**
6
6
  * Check if an asset address is a known USDC contract (any chain).
@@ -1,7 +1,7 @@
1
- import { O as OpenBatchChannelOptions, B as BatchSettlementChannel, R as ResumeBatchChannelOptions, C as ChannelStore } from '../types-BdS_uvNs.cjs';
2
- export { a as ChannelState, b as CloseReceipt, c as CloseResult, d as FinalizeWithdrawResult, F as ForceWithdrawResult, I as InsufficientBalanceError, U as UnsupportedNetworkError, W as WithdrawNotReadyError } from '../types-BdS_uvNs.cjs';
1
+ import { O as OpenBatchChannelOptions, B as BatchSettlementChannel, R as ResumeBatchChannelOptions, C as ChannelStore } from '../types-BbvuPNXl.cjs';
2
+ export { a as ChannelState, b as CloseReceipt, c as CloseResult, F as FinalizeWithdrawResult, d as ForceWithdrawResult, I as InsufficientBalanceError, U as UnsupportedNetworkError, W as WithdrawNotReadyError } from '../types-BbvuPNXl.cjs';
3
3
  import '@x402/evm/batch-settlement/client';
4
- import '../types-xQu1U4xk.cjs';
4
+ import '../types-BvQpNtFw.cjs';
5
5
 
6
6
  declare function openBatchChannel(options: OpenBatchChannelOptions): Promise<BatchSettlementChannel>;
7
7
  /**
@@ -1,7 +1,7 @@
1
- import { O as OpenBatchChannelOptions, B as BatchSettlementChannel, R as ResumeBatchChannelOptions, C as ChannelStore } from '../types-_wdHzVG-.js';
2
- export { a as ChannelState, b as CloseReceipt, c as CloseResult, d as FinalizeWithdrawResult, F as ForceWithdrawResult, I as InsufficientBalanceError, U as UnsupportedNetworkError, W as WithdrawNotReadyError } from '../types-_wdHzVG-.js';
1
+ import { O as OpenBatchChannelOptions, B as BatchSettlementChannel, R as ResumeBatchChannelOptions, C as ChannelStore } from '../types-DwVhPqOZ.js';
2
+ export { a as ChannelState, b as CloseReceipt, c as CloseResult, F as FinalizeWithdrawResult, d as ForceWithdrawResult, I as InsufficientBalanceError, U as UnsupportedNetworkError, W as WithdrawNotReadyError } from '../types-DwVhPqOZ.js';
3
3
  import '@x402/evm/batch-settlement/client';
4
- import '../types-xQu1U4xk.js';
4
+ import '../types-BvQpNtFw.js';
5
5
 
6
6
  declare function openBatchChannel(options: OpenBatchChannelOptions): Promise<BatchSettlementChannel>;
7
7
  /**
@@ -1,10 +1,10 @@
1
- import { a as BatchSettlementSellerConfig, B as BatchSettlementSeller } from '../../types-WMqs5xII.cjs';
2
- export { S as SellerCloseResult } from '../../types-WMqs5xII.cjs';
1
+ import { B as BatchSettlementSellerConfig, a as BatchSettlementSeller } from '../../types-JpkrtFbZ.cjs';
2
+ export { S as SellerCloseResult } from '../../types-JpkrtFbZ.cjs';
3
3
  import 'express';
4
4
  import '@x402/evm/batch-settlement/server';
5
- import '../../types-BdS_uvNs.cjs';
5
+ import '../../types-BbvuPNXl.cjs';
6
6
  import '@x402/evm/batch-settlement/client';
7
- import '../../types-xQu1U4xk.cjs';
7
+ import '../../types-BvQpNtFw.cjs';
8
8
 
9
9
  /**
10
10
  * Creates a batch-settlement seller runtime. The returned object is callable
@@ -1,10 +1,10 @@
1
- import { a as BatchSettlementSellerConfig, B as BatchSettlementSeller } from '../../types-DY8xKheW.js';
2
- export { S as SellerCloseResult } from '../../types-DY8xKheW.js';
1
+ import { B as BatchSettlementSellerConfig, a as BatchSettlementSeller } from '../../types-CkcNYx1Q.js';
2
+ export { S as SellerCloseResult } from '../../types-CkcNYx1Q.js';
3
3
  import 'express';
4
4
  import '@x402/evm/batch-settlement/server';
5
- import '../../types-_wdHzVG-.js';
5
+ import '../../types-DwVhPqOZ.js';
6
6
  import '@x402/evm/batch-settlement/client';
7
- import '../../types-xQu1U4xk.js';
7
+ import '../../types-BvQpNtFw.js';
8
8
 
9
9
  /**
10
10
  * Creates a batch-settlement seller runtime. The returned object is callable
@@ -1 +1 @@
1
- "use strict";var Gt=Object.create;var Xe=Object.defineProperty;var Qt=Object.getOwnPropertyDescriptor;var Zt=Object.getOwnPropertyNames;var en=Object.getPrototypeOf,tn=Object.prototype.hasOwnProperty;var Et=(n,e)=>()=>(n&&(e=n(n=0)),e);var Tt=(n,e)=>{for(var t in e)Xe(n,t,{get:e[t],enumerable:!0})},Pt=(n,e,t,r)=>{if(e&&typeof e=="object"||typeof e=="function")for(let o of Zt(e))!tn.call(n,o)&&o!==t&&Xe(n,o,{get:()=>e[o],enumerable:!(r=Qt(e,o))||r.enumerable});return n};var Z=(n,e,t)=>(t=n!=null?Gt(en(n)):{},Pt(e||!n||!n.__esModule?Xe(t,"default",{value:n,enumerable:!0}):t,n)),nn=n=>Pt(Xe({},"__esModule",{value:!0}),n);function Tn(n){if(n.length>=255)throw new TypeError("Alphabet too long");let e=new Uint8Array(256);for(let s=0;s<e.length;s++)e[s]=255;for(let s=0;s<n.length;s++){let m=n.charAt(s),f=m.charCodeAt(0);if(e[f]!==255)throw new TypeError(m+" is ambiguous");e[f]=s}let t=n.length,r=n.charAt(0),o=Math.log(t)/Math.log(256),a=Math.log(256)/Math.log(t);function i(s){if(s instanceof Uint8Array||(ArrayBuffer.isView(s)?s=new Uint8Array(s.buffer,s.byteOffset,s.byteLength):Array.isArray(s)&&(s=Uint8Array.from(s))),!(s instanceof Uint8Array))throw new TypeError("Expected Uint8Array");if(s.length===0)return"";let m=0,f=0,g=0,w=s.length;for(;g!==w&&s[g]===0;)g++,m++;let l=(w-g)*a+1>>>0,S=new Uint8Array(l);for(;g!==w;){let h=s[g],A=0;for(let P=l-1;(h!==0||A<f)&&P!==-1;P--,A++)h+=256*S[P]>>>0,S[P]=h%t>>>0,h=h/t>>>0;if(h!==0)throw new Error("Non-zero carry");f=A,g++}let p=l-f;for(;p!==l&&S[p]===0;)p++;let y=r.repeat(m);for(;p<l;++p)y+=n.charAt(S[p]);return y}function c(s){if(typeof s!="string")throw new TypeError("Expected String");if(s.length===0)return new Uint8Array;let m=0,f=0,g=0;for(;s[m]===r;)f++,m++;let w=(s.length-m)*o+1>>>0,l=new Uint8Array(w);for(;m<s.length;){let h=s.charCodeAt(m);if(h>255)return;let A=e[h];if(A===255)return;let P=0;for(let O=w-1;(A!==0||P<g)&&O!==-1;O--,P++)A+=t*l[O]>>>0,l[O]=A%256>>>0,A=A/256>>>0;if(A!==0)throw new Error("Non-zero carry");g=P,m++}let S=w-g;for(;S!==w&&l[S]===0;)S++;let p=new Uint8Array(f+(w-S)),y=f;for(;S!==w;)p[y++]=l[S++];return p}function u(s){let m=c(s);if(m)return m;throw new Error("Non-base"+t+" character")}return{encode:i,decodeUnsafe:c,decode:u}}var Lt,Wt=Et(()=>{"use strict";Lt=Tn});var Kt={};Tt(Kt,{default:()=>Rn});var Pn,Rn,Vt=Et(()=>{"use strict";Wt();Pn="123456789ABCDEFGHJKLMNPQRSTUVWXYZabcdefghijkmnopqrstuvwxyz",Rn=Lt(Pn)});var Cn={};Tt(Cn,{BASE_MAINNET:()=>j,DEXTER_FACILITATOR_URL:()=>ht,KEYPAIR_SYMBOL:()=>ge,SOLANA_MAINNET:()=>H,USDC_MINT:()=>Ke,X402Error:()=>C,buildV1PaymentHeader:()=>je,capabilitySearch:()=>xt.capabilitySearch,createBudgetAccount:()=>Yt,createEvmAdapter:()=>te,createEvmKeypairWallet:()=>pt,createKeypairWallet:()=>mt,createSolanaAdapter:()=>K,detectStrategy:()=>wt,fireImpressionBeacon:()=>zt,getPaymentReceipt:()=>at,getSponsoredAccessInfo:()=>dt,getSponsoredRecommendations:()=>Jt,isEvmKeypairWallet:()=>jt,isKeypairWallet:()=>Ft,payAndFetch:()=>bt,toNetworkRef:()=>fe,toSiwxSigner:()=>Je});module.exports=nn(Cn);var ve="solana:5eykt4UsFv8P8NJdTREpY1vzqKqZKvdp",Ye="solana:EtWTRABZaYq6iMfeYKouRu166VU2xqa1",Ge="solana:4uhcVJyU9pJkvQyS88uRDiswHXSCkY3z",H=ve,Ce=Ye,_e=Ge,ae="eip155:8453",Se="eip155:84532",we="eip155:42161",be="eip155:137",xe="eip155:10",Ee="eip155:43114",Te="eip155:56",se="eip155:480",ie="eip155:143",ce="eip155:4663",le="eip155:1187947933",ue="eip155:324705682",Pe="eip155:1",j=ae,Qe=Se,Ne=we,Ie=be,ke=xe,Oe=Ee,De=Te,Be=se,Ue=ie,Me=ce,$e=le,Le=ue,We=Pe,Ke="EPjFWdd5AufqSSqeM2qN1xzybapC8G4wEGGkZwyTDt1v",Rt="4zMMC9srt5Ri5X14GAgXhaHii3GnPAEERYPJgZJDncDU",vt="0x833589fCD6eDb6E08f4c7C32D4f71b54bdA02913",gt="0x55d398326f99059fF775485246999027B3197955",Ze="0x8AC76a51cc950d9822D68b83fE1Ad97B32Cd580d",yt="0x5fc5360D0400a0Fd4f2af552ADD042D716F1d168",et={[Te]:Ze,[ae]:vt,[Se]:"0x036CbD53842c5426634e7929541eC2318f3dCF7e",[we]:"0xaf88d065e77c8cC2239327C5EDb3A432268e5831",[be]:"0x3c499c542cEF5E3811e1192ce70d8cC03d5c3359",[xe]:"0x0b2C639c533813f4Aa9D7837CAf62653d097Ff85",[Ee]:"0xB97EF9Ef8734C71904D8002F8b6Bc66Dd9c48a6E",[se]:"0x79A02482A880bCE3F13e09Da970dC34db4CD24d1",[ie]:"0x754704Bc059F8C67012fEd69BC8A327a5aafb603",[ce]:yt,[le]:"0x85889c8c714505E0c94b30fcfcF64fE3Ac8FCb20",[ue]:"0x2e08028E3C4c2356572E096d8EF835cD5C6030bD",[Pe]:"0xA0b86991c6218b36c1d19D4a2e9Eb0cE3606eB48"},tt={[gt]:{symbol:"USDT",decimals:18},[Ze]:{symbol:"USDC",decimals:18}};var nt={[se]:{name:"USDC",version:"2"},[ie]:{name:"USDC",version:"2"},[ce]:{name:"Global Dollar",version:"1"},[le]:{name:"Bridged USDC (SKALE Bridge)",version:"2"},[ue]:{name:"Bridged USDC (SKALE Bridge)",version:"2"}},ee="0x000000000022D473030F116dDEE9F6B43aC78BA3",Ve="0x402085c248EeA27D92E8b30b2C58ed07f9E20001",Fe={[Te]:56,[ae]:8453,[Se]:84532,[we]:42161,[be]:137,[xe]:10,[Ee]:43114,[se]:480,[ie]:143,[ce]:4663,[le]:1187947933,[ue]:324705682,[Pe]:1},me={[ve]:"https://api.dexter.cash/api/solana/rpc",[Ye]:"https://api.devnet.solana.com",[Ge]:"https://api.testnet.solana.com"},U={[Te]:"https://api.dexter.cash/api/evm/bsc/rpc",[ae]:"https://api.dexter.cash/api/base/rpc",[Se]:"https://sepolia.base.org",[we]:"https://api.dexter.cash/api/evm/arbitrum/rpc",[be]:"https://api.dexter.cash/api/evm/polygon/rpc",[xe]:"https://api.dexter.cash/api/evm/optimism/rpc",[Ee]:"https://api.dexter.cash/api/evm/avalanche/rpc",[se]:"https://worldchain-mainnet.g.alchemy.com/public",[ie]:"https://rpc.monad.xyz",[ce]:"https://rpc.mainnet.chain.robinhood.com",[le]:"https://skale-base.skalenodes.com/v1/base",[ue]:"https://base-sepolia-testnet.skalenodes.com/v1/jubilant-horrible-ancha",[Pe]:"https://eth.llamarpc.com"},ht="https://x402.dexter.cash";var C=class n extends Error{code;details;constructor(e,t,r){super(t),this.name="X402Error",this.code=e,this.details=r,Object.setPrototypeOf(this,n.prototype)}};var k=require("@solana/web3.js"),D=require("@solana/spl-token");var rn=12e3,on=1;function pe(n){if(!n||typeof n!="object")return!1;let e=n;return"publicKey"in e&&"signTransaction"in e&&typeof e.signTransaction=="function"}var rt=class{name="Solana";networks=[H,Ce,_e];config;log;constructor(e={}){this.config=e,this.log=e.verbose?console.log.bind(console,"[x402:solana]"):()=>{}}canHandle(e){return!!(this.networks.includes(e)||e==="solana"||e==="solana-devnet"||e==="solana-testnet"||e.startsWith("solana:"))}getDefaultRpcUrl(e){return this.config.rpcUrls?.[e]?this.config.rpcUrls[e]:me[e]?me[e]:e==="solana"?me[H]:e==="solana-devnet"?me[Ce]:e==="solana-testnet"?me[_e]:me[H]}getAddress(e){return pe(e)?e.publicKey?.toBase58()??null:null}isConnected(e){return pe(e)?e.publicKey!==null:!1}async getBalance(e,t,r){if(!pe(t)||!t.publicKey)return 0;let o=r||this.getDefaultRpcUrl(e.network),a=new k.Connection(o,"confirmed"),i=new k.PublicKey(t.publicKey.toBase58()),c=new k.PublicKey(e.asset);try{let s=(await a.getAccountInfo(c,"confirmed"))?.owner.toBase58()===D.TOKEN_2022_PROGRAM_ID.toBase58()?D.TOKEN_2022_PROGRAM_ID:D.TOKEN_PROGRAM_ID,m=await(0,D.getAssociatedTokenAddress)(c,i,!1,s),f=await(0,D.getAccount)(a,m,void 0,s),g=e.extra?.decimals??6;return Number(f.amount)/Math.pow(10,g)}catch(u){if(u&&typeof u=="object"&&"name"in u&&(u.name==="TokenAccountNotFoundError"||u.name==="TokenInvalidAccountOwnerError"))return 0;throw u}}async buildTransaction(e,t,r){if(!pe(t))throw new Error("Invalid Solana wallet");if(!t.publicKey)throw new Error("Wallet not connected");let o=r||this.getDefaultRpcUrl(e.network),a=new k.Connection(o,"confirmed"),i=new k.PublicKey(t.publicKey.toBase58()),{payTo:c,asset:u,extra:s}=e,m=e.amount??e.maxAmountRequired;if(!m)throw new Error("Missing amount in payment requirements");if(!s?.feePayer)throw new Error("Missing feePayer in payment requirements");let f=new k.PublicKey(s.feePayer),g=new k.PublicKey(u),w=new k.PublicKey(c);this.log("Building transaction:",{from:i.toBase58(),to:c,amount:m,asset:u,feePayer:s.feePayer});let l=[];l.push(k.ComputeBudgetProgram.setComputeUnitLimit({units:rn})),l.push(k.ComputeBudgetProgram.setComputeUnitPrice({microLamports:on}));let S=await a.getAccountInfo(g,"confirmed");if(!S)throw new Error(`Token mint ${u} not found`);let p=S.owner.toBase58()===D.TOKEN_2022_PROGRAM_ID.toBase58()?D.TOKEN_2022_PROGRAM_ID:D.TOKEN_PROGRAM_ID,y=await(0,D.getMint)(a,g,void 0,p);typeof s?.decimals=="number"&&y.decimals!==s.decimals&&this.log(`Decimals mismatch: requirements say ${s.decimals}, mint says ${y.decimals}`);let h=await(0,D.getAssociatedTokenAddress)(g,i,!1,p),A=await(0,D.getAssociatedTokenAddress)(g,w,!0,p);if(!await a.getAccountInfo(h,"confirmed"))throw new Error(`No token account found for ${u}. Please ensure you have USDC in your wallet.`);if(!await a.getAccountInfo(A,"confirmed"))throw new Error(`Seller token account not found. The seller (${c}) must have a USDC account.`);let z=BigInt(m);l.push((0,D.createTransferCheckedInstruction)(h,g,A,i,z,y.decimals,[],p));let{blockhash:F}=await a.getLatestBlockhash("confirmed"),ne=new k.TransactionMessage({payerKey:f,recentBlockhash:F,instructions:l}).compileToV0Message(),$=new k.VersionedTransaction(ne),b=await t.signTransaction($);return this.log("Transaction signed successfully"),{serialized:Buffer.from(b.serialize()).toString("base64"),settlementProbe:{kind:"solana",sourceAta:h.toBase58(),destinationAta:A.toBase58(),asset:u,amount:m,blockhash:F}}}async confirmSettlement(e,t){if(e.kind!=="solana")throw new Error(`SolanaAdapter.confirmSettlement cannot handle probe kind "${e.kind}"`);let r=new k.Connection(t,"confirmed"),o=new k.PublicKey(e.destinationAta),a=await r.getSignaturesForAddress(o,{limit:25});if(a.length===0)return{settled:!1};let i=BigInt(e.amount);for(let c of a){if(c.err)continue;let u=await r.getTransaction(c.signature,{commitment:"confirmed",maxSupportedTransactionVersion:0});if(!u?.meta)continue;let s=u.transaction.message.getAccountKeys().keySegments().flat(),m=u.meta.preTokenBalances??[],f=u.meta.postTokenBalances??[];for(let g of f){if(g.mint!==e.asset)continue;let w=s[g.accountIndex];if(!w||!w.equals(o))continue;let l=m.find(y=>y.accountIndex===g.accountIndex),S=BigInt(l?.uiTokenAmount.amount??"0");if(BigInt(g.uiTokenAmount.amount??"0")-S===i)return{settled:!0,txSignature:c.signature}}}return{settled:!1}}};function K(n){return new rt(n)}var an={PermitWitnessTransferFrom:[{name:"permitted",type:"TokenPermissions"},{name:"spender",type:"address"},{name:"nonce",type:"uint256"},{name:"deadline",type:"uint256"},{name:"witness",type:"Witness"}],TokenPermissions:[{name:"token",type:"address"},{name:"amount",type:"uint256"}],Witness:[{name:"to",type:"address"},{name:"validAfter",type:"uint256"}]},Ct=BigInt("0xffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff");function de(n){if(!n||typeof n!="object")return!1;let e=n;return"address"in e&&typeof e.address=="string"&&e.address.startsWith("0x")}var ot=class{name="EVM";networks=[De,j,Qe,We,Ne,Ie,ke,Oe,Be,Ue,Me,$e,Le];config;log;constructor(e={}){this.config=e,this.log=e.verbose?console.log.bind(console,"[x402:evm]"):()=>{}}canHandle(e){return!!(this.networks.includes(e)||e==="base"||e==="bsc"||e==="ethereum"||e==="arbitrum"||e==="polygon"||e==="optimism"||e==="avalanche"||e==="world"||e==="monad"||e==="robinhood"||e==="skale-base"||e==="skale-base-sepolia"||e.startsWith("eip155:"))}getDefaultRpcUrl(e){return this.config.rpcUrls?.[e]?this.config.rpcUrls[e]:U[e]?U[e]:e==="base"?U[j]:e==="bsc"?U[De]:e==="ethereum"?U[We]:e==="arbitrum"?U[Ne]:e==="polygon"?U[Ie]:e==="optimism"?U[ke]:e==="avalanche"?U[Oe]:e==="world"?U[Be]:e==="monad"?U[Ue]:e==="robinhood"?U[Me]:e==="skale-base"?U[$e]:e==="skale-base-sepolia"?U[Le]:U[j]}getAddress(e){return de(e)?e.address:null}isConnected(e){return de(e)?!!e.address:!1}getChainId(e){if(Fe[e])return Fe[e];if(e.startsWith("eip155:")){let t=e.split(":")[1];return parseInt(t,10)}return e==="base"?8453:e==="bsc"?56:e==="ethereum"?1:e==="arbitrum"?42161:e==="polygon"?137:e==="optimism"?10:e==="avalanche"?43114:e==="world"?480:e==="monad"?143:e==="robinhood"?4663:e==="skale-base"?1187947933:e==="skale-base-sepolia"?324705682:8453}async getBalance(e,t,r){if(!de(t)||!t.address)return 0;let o=r||this.getDefaultRpcUrl(e.network);try{let a=this.encodeBalanceOf(t.address),i=await fetch(o,{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({jsonrpc:"2.0",id:1,method:"eth_call",params:[{to:e.asset,data:a},"latest"]})});if(!i.ok)throw new Error(`RPC request failed: ${i.status}`);let c=await i.json();if(c.error)throw new Error(`RPC error: ${JSON.stringify(c.error)}`);if(!c.result||c.result==="0x")return 0;let u=BigInt(c.result),s=e.extra?.decimals??6;return Number(u)/Math.pow(10,s)}catch(a){throw a}}encodeBalanceOf(e){let t="0x70a08231",r=e.slice(2).toLowerCase().padStart(64,"0");return t+r}async confirmSettlement(e,t){if(e.kind==="eip3009"){let r="0xe94a0102",o=e.from.slice(2).toLowerCase().padStart(64,"0"),a=e.nonce.slice(2).toLowerCase().padStart(64,"0"),i=r+o+a,c=await this.ethCall(t,e.asset,i);return{settled:BigInt(c)!==0n}}if(e.kind==="permit2"){let r="0x4fe02b44",o=BigInt(e.nonce),a=o>>8n,i=o&0xffn,c=e.from.slice(2).toLowerCase().padStart(64,"0"),u=a.toString(16).padStart(64,"0"),s=r+c+u,m=await this.ethCall(t,ee,s);return{settled:(BigInt(m)>>i&1n)===1n}}throw new Error(`EvmAdapter.confirmSettlement cannot handle probe kind "${e.kind}"`)}async ethCall(e,t,r){let o=await fetch(e,{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({jsonrpc:"2.0",id:1,method:"eth_call",params:[{to:t,data:r},"latest"]})});if(!o.ok)throw new Error(`RPC request failed: ${o.status}`);let a=await o.json();if(a.error)throw new Error(`RPC error: ${JSON.stringify(a.error)}`);if(!a.result||a.result==="0x")throw new Error("RPC returned an empty result");return a.result}async buildTransaction(e,t,r){if(!de(t))throw new Error("Invalid EVM wallet");if(!t.address)throw new Error("Wallet not connected");if(e.scheme==="exact-approval")return this.buildApprovalTransaction(e,t,r);if(e.extra?.assetTransferMethod==="permit2")return this.buildPermit2Transaction(e,t,r);let{payTo:o,asset:a,extra:i}=e,c=e.amount??e.maxAmountRequired;if(!c)throw new Error("Missing amount in payment requirements");this.log("Building EVM transaction:",{from:t.address,to:o,amount:c,asset:a,network:e.network});let u=this.getChainId(e.network),s=nt[`eip155:${u}`],m={name:i?.name??s?.name??"USD Coin",version:i?.version??s?.version??"2",chainId:BigInt(u),verifyingContract:a},f={TransferWithAuthorization:[{name:"from",type:"address"},{name:"to",type:"address"},{name:"value",type:"uint256"},{name:"validAfter",type:"uint256"},{name:"validBefore",type:"uint256"},{name:"nonce",type:"bytes32"}]},g=new Uint8Array(32);(globalThis.crypto??(await import("crypto")).webcrypto).getRandomValues(g);let w="0x"+[...g].map(A=>A.toString(16).padStart(2,"0")).join(""),l=Math.floor(Date.now()/1e3),S={from:t.address,to:o,value:c,validAfter:String(l-600),validBefore:String(l+(e.maxTimeoutSeconds||60)),nonce:w},p={from:t.address,to:o,value:BigInt(c),validAfter:BigInt(l-600),validBefore:BigInt(l+(e.maxTimeoutSeconds||60)),nonce:w};if(!t.signTypedData)throw new Error("Wallet does not support signTypedData (EIP-712)");let y=await t.signTypedData({domain:m,types:f,primaryType:"TransferWithAuthorization",message:p});return this.log("EIP-712 signature obtained"),{serialized:JSON.stringify({authorization:S,signature:y}),signature:y,settlementProbe:{kind:"eip3009",from:t.address,nonce:w,asset:a,chainId:u}}}async buildApprovalTransaction(e,t,r){let{payTo:o,asset:a,extra:i}=e,c=e.amount??e.maxAmountRequired;if(!c)throw new Error("Missing amount in payment requirements");let u=i?.facilitatorContract;if(!u)throw new Error("exact-approval scheme requires extra.facilitatorContract from the facilitator. The /supported endpoint should provide this.");if(!t.signTypedData)throw new Error("Wallet does not support signTypedData (EIP-712)");this.log("Building approval-based transaction:",{from:t.address,to:o,amount:c,asset:a,network:e.network,facilitatorContract:u});let s=r||this.getDefaultRpcUrl(e.network),m=i?.fee??"0",f=BigInt(c)+BigInt(m),g=await this.readAllowance(s,a,t.address,u);if(g<f){if(!t.sendTransaction)throw new Error("BSC payments require a wallet that supports sendTransaction for the one-time token approval. Use createEvmKeypairWallet() or a browser wallet with transaction support.");let $=this.calculateApprovalAmount(c,m,i?.approvalStrategy);this.log(`Approving ${$} for ${u} (current allowance: ${g})`);let b=await t.sendTransaction({to:a,data:this.encodeApprove(u,$),value:0n});this.log(`Approval tx sent: ${b}`),await this.waitForReceipt(s,b),this.log("Approval confirmed")}else this.log("Sufficient allowance, skipping approval");let w=new Uint8Array(16);(globalThis.crypto??(await import("crypto")).webcrypto).getRandomValues(w);let l=[...w].reduce(($,b)=>$*256n+BigInt(b),0n).toString(),S=new Uint8Array(32);(globalThis.crypto??(await import("crypto")).webcrypto).getRandomValues(S);let p="0x"+[...S].map($=>$.toString(16).padStart(2,"0")).join(""),h=Math.floor(Date.now()/1e3)+(e.maxTimeoutSeconds||300),A=i?.eip712Domain,P=A?{name:A.name,version:A.version,chainId:BigInt(A.chainId),verifyingContract:A.verifyingContract}:{name:"DexterBSCFacilitator",version:"1",chainId:BigInt(this.getChainId(e.network)),verifyingContract:u},O=i?.eip712Types??{Payment:[{name:"from",type:"address"},{name:"to",type:"address"},{name:"token",type:"address"},{name:"amount",type:"uint256"},{name:"fee",type:"uint256"},{name:"nonce",type:"uint256"},{name:"deadline",type:"uint256"},{name:"paymentId",type:"bytes32"}]},z={from:t.address,to:o,token:a,amount:BigInt(c),fee:BigInt(m),nonce:BigInt(l),deadline:BigInt(h),paymentId:p},F=await t.signTypedData({domain:P,types:O,primaryType:"Payment",message:z});this.log("EIP-712 Payment signature obtained");let ne={from:t.address,to:o,token:a,amount:c,fee:m,nonce:l,deadline:h,paymentId:p,signature:F};return{serialized:JSON.stringify(ne),signature:F}}async buildPermit2Transaction(e,t,r){let{payTo:o,asset:a}=e,i=e.amount??e.maxAmountRequired;if(!i)throw new Error("Missing amount in payment requirements");if(!t.signTypedData)throw new Error("Wallet does not support signTypedData (EIP-712)");this.log("Building Permit2 transaction:",{from:t.address,to:o,amount:i,asset:a,network:e.network});let c=r||this.getDefaultRpcUrl(e.network),u=await this.readAllowance(c,a,t.address,ee),s;if(u<BigInt(i)){let P=this.encodeApprove(ee,Ct);if(t.signTransaction){this.log(`Signing Permit2 approval for relay (current allowance: ${u})`);let O=this.getChainId(e.network),z=await this.readGasPrice(c),F=await this.readNonce(c,t.address),ne=await t.signTransaction({to:a,data:P,chainId:O,gas:50000n,gasPrice:z,nonce:F});s={erc20ApprovalGasSponsoring:{info:{from:t.address,asset:a,spender:ee,amount:Ct.toString(),signedTransaction:ne,version:"1"}}},this.log("Permit2 approval signed for facilitator relay")}else if(t.sendTransaction){this.log(`Approving Permit2 directly (current allowance: ${u})`);let O=await t.sendTransaction({to:a,data:P,value:0n});this.log(`Permit2 approval tx sent: ${O}`),await this.waitForReceipt(c,O),this.log("Permit2 approval confirmed")}else throw new Error("Permit2 payments require a wallet that supports signTransaction or sendTransaction for the one-time Permit2 approval. Use createEvmKeypairWallet() or a browser wallet with transaction support.")}else this.log("Sufficient Permit2 allowance, skipping approval");let m=new Uint8Array(32);(globalThis.crypto??(await import("crypto")).webcrypto).getRandomValues(m);let f=[...m].reduce((P,O)=>P*256n+BigInt(O),0n),g=Math.floor(Date.now()/1e3),w=g-600,l=g+(e.maxTimeoutSeconds||300),S=this.getChainId(e.network),p={name:"Permit2",chainId:BigInt(S),verifyingContract:ee},y={permitted:{token:a,amount:BigInt(i)},spender:Ve,nonce:f,deadline:BigInt(l),witness:{to:o,validAfter:BigInt(w)}},h=await t.signTypedData({domain:p,types:an,primaryType:"PermitWitnessTransferFrom",message:y});this.log("Permit2 PermitWitnessTransferFrom signature obtained");let A={signature:h,permit2Authorization:{from:t.address,permitted:{token:a,amount:i},spender:Ve,nonce:f.toString(),deadline:String(l),witness:{to:o,validAfter:String(w)}}};return{serialized:JSON.stringify(A),signature:h,extensions:s,settlementProbe:{kind:"permit2",from:t.address,nonce:f.toString(),chainId:S}}}async readAllowance(e,t,r,o){let a="0xdd62ed3e",i=r.slice(2).toLowerCase().padStart(64,"0"),c=o.slice(2).toLowerCase().padStart(64,"0"),u=a+i+c;try{let m=await(await fetch(e,{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({jsonrpc:"2.0",id:1,method:"eth_call",params:[{to:t,data:u},"latest"]})})).json();return m.error||!m.result||m.result==="0x"?0n:BigInt(m.result)}catch{return 0n}}encodeApprove(e,t){let r="0x095ea7b3",o=e.slice(2).toLowerCase().padStart(64,"0"),a=t.toString(16).padStart(64,"0");return r+o+a}async waitForReceipt(e,t,r=3e4){let o=Date.now();for(;Date.now()-o<r;){try{let i=await(await fetch(e,{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({jsonrpc:"2.0",id:1,method:"eth_getTransactionReceipt",params:[t]})})).json();if(i.result){if(i.result.status==="0x0")throw new Error(`Approval transaction reverted: ${t}`);return}}catch(a){if(a instanceof Error&&a.message.includes("reverted"))throw a}await new Promise(a=>setTimeout(a,2e3))}throw new Error(`Approval transaction receipt timeout after ${r}ms: ${t}`)}async readGasPrice(e){try{let r=await(await fetch(e,{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({jsonrpc:"2.0",id:1,method:"eth_gasPrice",params:[]})})).json();return r.result?BigInt(r.result):50000000n}catch{return 50000000n}}async readNonce(e,t){try{let o=await(await fetch(e,{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({jsonrpc:"2.0",id:1,method:"eth_getTransactionCount",params:[t,"latest"]})})).json();return o.result?parseInt(o.result,16):0}catch{return 0}}calculateApprovalAmount(e,t,r){let o=BigInt(e)+BigInt(t);if(!r||r.mode==="exact")return o;let a=BigInt(r.defaultMultiple??10),i=o*a;if(r.maxCapUsd){let c=this.inferDecimals(e),u=BigInt(Math.floor(r.maxCapUsd*Math.pow(10,c)));if(i>u)return u}if(r.exactAboveUsd){let c=this.inferDecimals(e),u=BigInt(Math.floor(r.exactAboveUsd*Math.pow(10,c)));if(BigInt(e)>u)return o}return i}inferDecimals(e){return e.length>12?18:6}};function te(n){return new ot(n)}function At(n){if(n===Ke||n===Rt)return!0;let e=n.toLowerCase();for(let t of Object.values(et))if(t.toLowerCase()===e)return!0;for(let t of Object.keys(tt))if(t.toLowerCase()===e)return!0;return!1}function sn(n){return{[ve]:"Solana",[Ye]:"Solana Devnet",[Ge]:"Solana Testnet",solana:"Solana","solana-devnet":"Solana Devnet","solana-testnet":"Solana Testnet",[ae]:"Base",[Se]:"Base Sepolia",[Pe]:"Ethereum",[we]:"Arbitrum",[be]:"Polygon",[xe]:"Optimism",[Ee]:"Avalanche",[Te]:"BSC",[se]:"World Chain",[ie]:"Monad",[ce]:"Robinhood Chain",[le]:"SKALE Base",[ue]:"SKALE Base Sepolia",base:"Base","base-sepolia":"Base Sepolia",ethereum:"Ethereum",arbitrum:"Arbitrum",polygon:"Polygon",optimism:"Optimism",avalanche:"Avalanche",bsc:"BSC",world:"World Chain",monad:"Monad",robinhood:"Robinhood Chain","skale-base":"SKALE Base","skale-base-sepolia":"SKALE Base Sepolia"}[n]||n}function _t(n,e){let t=sn(n);return t===n?e:t}async function cn(n,e){if(typeof n=="string")return[n,e];if(n instanceof URL)return[n.href,e];let t=n,r=new Headers(t.headers);e?.headers&&new Headers(e.headers).forEach((i,c)=>r.set(c,i));let o={method:e?.method??t.method,headers:r,signal:e?.signal??t.signal,redirect:e?.redirect??t.redirect,credentials:e?.credentials??t.credentials},a=(o.method??"GET").toUpperCase();return e&&"body"in e?o.body=e.body:a!=="GET"&&a!=="HEAD"&&t.body&&(o.body=await t.arrayBuffer()),[t.url,o]}var Nt=new WeakMap;function at(n){return Nt.get(n)}function st(n){let{adapters:e=[K({verbose:n.verbose}),te({verbose:n.verbose})],wallets:t,wallet:r,preferredNetwork:o,rpcUrls:a={},maxAmountAtomic:i,fetch:c=globalThis.fetch,verbose:u=!1,accessPass:s,onPaymentRequired:m,onPaymentDispatched:f,maxRetries:g=0,retryDelayMs:w=500}=n,l=u?console.log.bind(console,"[x402]"):()=>{};async function S(b,T){let R;for(let x=0;x<=g;x++)try{let v=await c(b,T);if(v.status>=502&&v.status<=504&&x<g){l(`Retry ${x+1}/${g}: server returned ${v.status}`),await new Promise(_=>setTimeout(_,w*Math.pow(2,x)));continue}return v}catch(v){R=v,x<g&&(l(`Retry ${x+1}/${g}: ${v instanceof Error?v.message:"network error"}`),await new Promise(_=>setTimeout(_,w*Math.pow(2,x))))}throw R}let p=new Map;function y(b){try{let T=new URL(b).host,R=p.get(T);if(R&&R.expiresAt>Date.now()/1e3+10)return R.jwt;R&&p.delete(T)}catch{}return null}function h(b,T){try{let R=new URL(b).host,x=T.split(".");if(x.length===3){let v=JSON.parse(atob(x[1].replace(/-/g,"+").replace(/_/g,"/"))),_=Math.floor(Date.now()/1e3),N=_+86400,L=Math.min(typeof v.exp=="number"?v.exp:_,N);p.set(R,{jwt:T,expiresAt:L}),l("Access pass cached for",R,"| expires:",new Date(L*1e3).toISOString())}}catch{l("Failed to cache access pass")}}let A=t||{};r&&!A.solana&&pe(r)&&(A.solana=r),r&&!A.evm&&de(r)&&(A.evm=r);function P(b){let T=[];for(let R of b){let x=R.scheme??"exact";if(x!=="exact"&&x!=="exact-approval")continue;let v=e.find(N=>N.canHandle(R.network));if(!v)continue;let _;v.name==="Solana"?_=A.solana:v.name==="EVM"&&(_=A.evm),_&&v.isConnected(_)&&T.push({accept:R,adapter:v,wallet:_})}if(T.length===0)return null;if(o){let R=T.find(x=>x.accept.network===o);if(R)return R}return T[0]}function O(b,T){return _t(b,T)}function z(b,T){return a[b]||T.getDefaultRpcUrl(b)}async function F(b,T,R,x,v){let _="";if(s?.preferTier&&x.tiers){let d=x.tiers.find(E=>E.id===s.preferTier);if(d){if(s.maxSpend&&parseFloat(d.price)>parseFloat(s.maxSpend))throw new C("access_pass_exceeds_max_spend",`Access pass tier "${d.id}" costs $${d.price}, exceeds max spend $${s.maxSpend}`);_=`tier=${d.id}`}}else if(s?.preferDuration&&x.ratePerHour)_=`duration=${s.preferDuration}`;else if(x.tiers&&x.tiers.length>0){let d=x.tiers[0];if(s?.maxSpend&&parseFloat(d.price)>parseFloat(s.maxSpend))throw new C("access_pass_exceeds_max_spend",`Cheapest access pass costs $${d.price}, exceeds max spend $${s?.maxSpend}`);_=`tier=${d.id}`}let N=_?v.includes("?")?`${v}&${_}`:`${v}?${_}`:v;l("Purchasing access pass:",_||"default tier");let L=R.headers.get("PAYMENT-REQUIRED");if(!L)return null;let M;try{M=JSON.parse(atob(L))}catch{return null}let B=P(M.accepts);if(!B)return null;let{accept:I,adapter:q,wallet:ye}=B;if(q.name==="Solana"&&!I.extra?.feePayer)return null;let X=I.extra?.decimals??(At(I.asset)?6:void 0);if(typeof X!="number")return null;let Re=I.amount??I.maxAmountRequired;if(!Re)return null;let Y=z(I.network,q);try{let d=await q.getBalance(I,ye,Y),E=Number(Re)/Math.pow(10,X);if(d<E){let ft=O(I.network,q.name);throw new C("insufficient_balance",`Insufficient balance for access pass on ${ft}. Have $${d.toFixed(4)}, need $${E.toFixed(4)}`)}}catch(d){if(d instanceof C)throw d}let G=await q.buildTransaction(I,ye,Y),he;q.name==="EVM"?he=JSON.parse(G.serialized):he={transaction:G.serialized};let re=typeof b=="string"?b:b instanceof URL?b.href:b.url,Ae=M.resource;if(typeof M.resource=="string")try{let d=new URL(M.resource,re);["http:","https:"].includes(d.protocol)&&(Ae=d.toString())}catch{}else if(M.resource&&typeof M.resource=="object"&&"url"in M.resource){let d=M.resource;try{let E=new URL(d.url,re);["http:","https:"].includes(E.protocol)&&(Ae={...d,url:E.toString()})}catch{}}let ze={x402Version:I.x402Version??2,resource:Ae,accepted:I,payload:he};G.extensions&&(ze.extensions=G.extensions);let Q=btoa(JSON.stringify(ze)),oe=await c(N,{...T,method:"POST",headers:{...T?.headers||{},"Content-Type":"application/json","PAYMENT-SIGNATURE":Q}});if(!oe.ok)return l("Pass purchase failed:",oe.status),null;let W=oe.headers.get("ACCESS-PASS");return W&&(h(v,W),l("Access pass purchased and cached")),oe}async function ne(b,T){let R=b;if(l("Making request:",R),s){let d=y(R);if(d){l("Using cached access pass");let E=await c(b,{...T,headers:{...T?.headers||{},Authorization:`Bearer ${d}`}});if(E.status!==401&&E.status!==402)return E;l("Cached pass rejected (status",E.status,"), purchasing new pass");try{p.delete(new URL(R).host)}catch{}}}let x=await S(b,T);if(x.status!==402)return x;l("Received 402 Payment Required");let v=x.headers.get("X-ACCESS-PASS-TIERS");if(s&&v){l("Server offers access passes, purchasing...");try{let d=JSON.parse(atob(v)),E=await F(b,T,x,d,R);if(E)return E}catch(d){l("Access pass purchase failed, falling back to per-request payment:",d)}}let _=x.headers.get("PAYMENT-REQUIRED");if(!_)throw new C("missing_payment_required_header","Server returned 402 but no PAYMENT-REQUIRED header");let N;try{let d=atob(_);N=JSON.parse(d)}catch{throw new C("invalid_payment_required","Failed to decode PAYMENT-REQUIRED header")}l("Payment requirements:",N);let L=x.headers.get("X-Quote-Hash");L&&l("Quote hash received:",L);let M=P(N.accepts);if(!M){let d=N.accepts.map(E=>E.network).join(", ");throw new C("no_matching_payment_option",`No connected wallet for any available network: ${d}`)}let{accept:B,adapter:I,wallet:q}=M;if(l(`Using ${I.name} for ${B.network}`),I.name==="Solana"&&!B.extra?.feePayer)throw new C("missing_fee_payer","Solana payment option missing feePayer in extra");let ye=B.extra?.decimals??(At(B.asset)?6:void 0);if(typeof ye!="number")throw new C("missing_decimals","Payment option missing decimals - provide in extra or use a known stablecoin");let X=B.amount??B.maxAmountRequired;if(!X)throw new C("missing_amount","Payment option missing amount");if(i&&BigInt(X)>BigInt(i))throw new C("amount_exceeds_max",`Payment amount ${X} exceeds maximum ${i}`);let Re=z(B.network,I);l("Checking balance...");try{let d=await I.getBalance(B,q,Re),E=Number(X)/Math.pow(10,ye);if(d<E){let ft=O(B.network,I.name);throw new C("insufficient_balance",`Insufficient balance on ${ft}. Have $${d.toFixed(4)}, need $${E.toFixed(4)}`)}l(`Balance OK: $${d.toFixed(4)} >= $${E.toFixed(4)}`)}catch(d){if(d instanceof C)throw d;l("Balance check failed (RPC error), proceeding with transaction attempt")}if(m&&!await m(B))throw new C("payment_rejected","Payment rejected by onPaymentRequired callback");l("Building transaction...");let Y=await I.buildTransaction(B,q,Re);l("Transaction signed");let G;I.name==="EVM"?G=JSON.parse(Y.serialized):G={transaction:Y.serialized};let he=b,re=N.resource;if(typeof N.resource=="string")try{let d=new URL(N.resource,he).toString();d!==N.resource&&l("Resolved relative resource URL:",N.resource,"\u2192",d),re=d}catch{re=N.resource}else if(N.resource&&typeof N.resource=="object"&&"url"in N.resource){let d=N.resource;try{let E=new URL(d.url,he).toString();E!==d.url&&(l("Resolved relative resource URL:",d.url,"\u2192",E),re={...d,url:E})}catch{}}let Ae={x402Version:B.x402Version??2,resource:re,accepted:B,payload:G};Y.extensions&&(Ae.extensions=Y.extensions);let ze=btoa(JSON.stringify(Ae));if(f)try{f(B,Y.settlementProbe)}catch{}l("Retrying request with payment...");let Q=await S(b,{...T,headers:{...T?.headers||{},"PAYMENT-SIGNATURE":ze,...L?{"X-Quote-Hash":L}:{}}});if(l("Retry response status:",Q.status),Q.status===402){let d="unknown";try{let E=await Q.clone().json();d=String(E.error||E.message||JSON.stringify(E)),l("Rejection reason:",d)}catch{}throw new C("payment_rejected",`Payment was rejected by the server: ${d}`)}let oe=Q.headers.get("PAYMENT-RESPONSE"),W;if(oe)try{W=JSON.parse(atob(oe))}catch{}return W??={},W.amountAtomic=X,W.assetDecimals=ye,Nt.set(Q,W),W.extensions&&l("Settlement extensions:",Object.keys(W.extensions).join(", ")),Q}async function $(b,T){let[R,x]=await cn(b,T);return ne(R,x)}return{fetch:$}}var mn=require("@solana/web3.js"),it=require("@noble/hashes/utils");var ln=Z(require("tweetnacl"),1);var qe=require("@dexterai/vault/messages");var un=require("@noble/hashes/sha256");function It(n){return Buffer.from(JSON.stringify({payload:n.payload,sessionPublicKey:(0,it.bytesToHex)(n.sessionPublicKey),sessionRegistration:(0,it.bytesToHex)(n.sessionRegistration),sessionSignature:(0,it.bytesToHex)(n.sessionSignature)}),"utf8").toString("base64")}function J(n){if(n instanceof Error){if(n.message&&n.message.length>0)return n.message;if(n.name&&n.name.length>0)return n.name}let e=String(n);return e.length>0?e:"unknown error"}async function He(n){let e="";try{e=(await n.clone().text()).slice(0,600)}catch{}let t=e.toLowerCase(),r=t.includes("settle")||t.includes("facilitator"),o=e;try{let a=JSON.parse(e),i=[a.error,a.detail,a.message].filter(c=>typeof c=="string"&&c.length>0);i.length>0&&(o=i.join(" \u2014 "))}catch{}return o||(o=`HTTP ${n.status}`),{reason:r?"settlement_failed":"merchant_rejected",detail:`merchant HTTP ${n.status}: ${o}`}}var ct="Payment authorization was sent, but the merchant did not respond within the timeout. ",lt=" Do not retry without checking \u2014 inspect the funding wallet for a transfer to the merchant before attempting payment again.";async function ut(n,e,t){if(!n)return{confirmed:!1,detail:ct+"This payment scheme has no on-chain confirmation check, so the SDK cannot verify whether it settled."+lt};try{if(n.kind==="solana"){let i=K(),c=t??i.getDefaultRpcUrl(e.caip2);if(!i.confirmSettlement)return Ot();let u=await i.confirmSettlement(n,c);return u.settled?{confirmed:!0,txSignature:u.txSignature}:kt()}let r=te(),o=r.getDefaultRpcUrl(e.caip2);if(!r.confirmSettlement)return Ot();let a=await r.confirmSettlement(n,o);return a.settled?{confirmed:!0,txSignature:a.txSignature}:kt()}catch(r){return{confirmed:!1,detail:ct+`On-chain confirmation could not be completed (${J(r)}).`+lt}}}function kt(){return{confirmed:!1,detail:ct+"On-chain confirmation found no matching settlement yet \u2014 the payment may still be pending, or may not have settled."+lt}}function Ot(){return{confirmed:!1,detail:ct+"The chain adapter does not support on-chain confirmation."+lt}}var Dt=[{caip2:"eip155:8453",bare:"base",family:"evm"},{caip2:"eip155:1",bare:"ethereum",family:"evm"},{caip2:"eip155:137",bare:"polygon",family:"evm"},{caip2:"eip155:42161",bare:"arbitrum",family:"evm"},{caip2:"eip155:10",bare:"optimism",family:"evm"},{caip2:"eip155:43114",bare:"avalanche",family:"evm"},{caip2:"eip155:56",bare:"bsc",family:"evm"},{caip2:"eip155:480",bare:"world",family:"evm"},{caip2:"eip155:143",bare:"monad",family:"evm"},{caip2:"eip155:4663",bare:"robinhood",family:"evm"},{caip2:"eip155:1187947933",bare:"skale-base",family:"evm"},{caip2:"eip155:324705682",bare:"skale-base-sepolia",family:"evm"},{caip2:"solana:5eykt4UsFv8P8NJdTREpY1vzqKqZKvdp",bare:"solana",family:"svm"}],pn=new Map(Dt.map(n=>[n.caip2.toLowerCase(),n])),dn=new Map(Dt.map(n=>[n.bare.toLowerCase(),n]));function fe(n){if(!n)return null;let e=n.toLowerCase(),t=pn.get(e)||dn.get(e);return t?{caip2:t.caip2,bare:t.bare,family:t.family}:null}function St(n){let e=n.replace(/-/g,"+").replace(/_/g,"/"),t=e+"=".repeat((4-(e.length%4||4))%4);return JSON.parse(Buffer.from(t,"base64").toString("utf8"))}function fn(n){let e=[];for(let t of n){if(!t||typeof t!="object")continue;let r=t,o=fe(String(r.network??""));o&&e.push({scheme:String(r.scheme??"exact"),network:o,amount:String(r.amount??r.maxAmountRequired??"0"),asset:String(r.asset??""),payTo:String(r.payTo??""),maxTimeoutSeconds:typeof r.maxTimeoutSeconds=="number"?r.maxTimeoutSeconds:void 0,extra:r.extra&&typeof r.extra=="object"?r.extra:void 0})}return e}async function Bt(n){let e=n.headers.get("payment-required");if(!e)return null;let t;try{t=St(e)}catch{return null}let r=Array.isArray(t.accepts)?t.accepts:[];return r.length===0?null:{x402Version:2,options:fn(r),resourceUrl:t.resource&&typeof t.resource=="object"?String(t.resource.url??""):void 0}}var gn=new Set(["exact","exact-approval"]);async function yn(n,e,t,r){let o;try{o=await r.signNextVoucher(t.amount)}catch{return null}let a=new Headers(e.headers??void 0);a.set("X-Tab-Voucher",It(o));let i={method:e.method??"GET",headers:a};e.signal&&(i.signal=e.signal),typeof e.body=="string"&&(i.body=e.body);let c;try{c=await fetch(n,i)}catch(u){return{ok:!1,reason:"error",detail:u?.message??String(u)}}return c.status===402?(r.rollbackVoucher?.call(r,o),null):c.ok?{ok:!0,paid:!0,response:c,amountPaid:t.amount,network:t.network}:{ok:!1,...await He(c)}}var Ut={version:2,async parseChallenge(n){return Bt(n)},async pay(n,e,t,r,o){if(o.tab){let y=t.options.find(h=>h.scheme==="tab"&&h.network.family==="svm"&&h.payTo===o.tab.counterparty);if(y){let h=await yn(n,e,y,o.tab);if(h)return h}}let a=t.options.filter(y=>gn.has(y.scheme));if(a.length===0)return{ok:!1,reason:"no_payment_options",detail:`no generically payable scheme offered (got: ${t.options.map(y=>y.scheme).join(", ")})`};let i=a.find(y=>y.network.family==="evm"?!!r.evm:y.network.family==="svm"?!!r.solana:!1);if(!i)return{ok:!1,reason:"unsupported_network"};let c=o.timeoutMs??15e3,u=o.responseTimeoutMs??12e4,s=new AbortController,m=setTimeout(()=>s.abort(),c),f=!1,g,w=(y,h)=>{f=!0,g=h,clearTimeout(m),m=setTimeout(()=>s.abort(),u)},l=st({wallets:r,preferredNetwork:i.network.caip2,maxAmountAtomic:o.maxAmountAtomic,fetch:globalThis.fetch,onPaymentDispatched:w}),S=e.signal?AbortSignal.any([e.signal,s.signal]):s.signal,p={method:e.method??"GET",headers:e.headers,signal:S};typeof e.body=="string"&&(p.body=e.body);try{let y=await l.fetch(n,p);if(clearTimeout(m),!y.ok)return{ok:!1,...await He(y)};let h,A=y.headers.get("PAYMENT-RESPONSE");if(A)try{let P=St(A);P&&typeof P.transaction=="string"&&(h=P.transaction)}catch{}return{ok:!0,paid:!0,response:y,amountPaid:i.amount,network:i.network,txSignature:h}}catch(y){clearTimeout(m);let h=y;if(h?.name==="AbortError"){if(!f)return{ok:!1,reason:"timeout"};let A=await ut(g,i.network,o.solanaRpcUrl);return A.confirmed?{ok:!0,paid:!0,response:void 0,amountPaid:i.amount,network:i.network,txSignature:A.txSignature}:{ok:!1,reason:"payment_unconfirmed",detail:A.detail}}return{ok:!1,reason:"error",detail:h?.message??String(y)}}}};var Mt=require("viem");var hn={TransferWithAuthorization:[{name:"from",type:"address"},{name:"to",type:"address"},{name:"value",type:"uint256"},{name:"validAfter",type:"uint256"},{name:"validBefore",type:"uint256"},{name:"nonce",type:"bytes32"}]};async function An(){let n=globalThis.crypto??(await import("crypto")).webcrypto,e=new Uint8Array(32);return n.getRandomValues(e),"0x"+Array.from(e,t=>t.toString(16).padStart(2,"0")).join("")}async function Sn(n,e,t){if(typeof n.signTypedData!="function")throw new Error("EVM wallet does not support signTypedData");let r=Math.floor(Date.now()/1e3),o=String(r-600),a=String(r+(e.maxTimeoutSeconds??60)),i={from:n.address,to:e.payTo,value:e.amount,validAfter:o,validBefore:a,nonce:await An()},c=Fe[e.network.caip2];if(c===void 0)throw new Error(`unknown chain id for network ${e.network.caip2}`);let u=e.extra,s=await n.signTypedData({domain:{name:u.name,version:u.version,chainId:c,verifyingContract:(0,Mt.getAddress)(e.asset)},types:hn,primaryType:"TransferWithAuthorization",message:i});return{payment:{x402Version:1,scheme:e.scheme,network:t,payload:{signature:s,authorization:i}},settlementProbe:{kind:"eip3009",from:i.from,nonce:i.nonce,asset:e.asset,chainId:c}}}async function je(n,e,t){try{let r;for(let o of n.options){let a=o.network.family==="evm"&&!!e.evm||o.network.family==="svm"&&!!e.solana;if(o.scheme!=="exact"){a&&(r=o.scheme);continue}if(o.network.family==="evm"&&e.evm){let i=await e.evm;return await wn(o,i,t)}if(o.network.family==="svm"&&e.solana){let i=await e.solana;return await bn(o,i,t)}}return r!==void 0?{ok:!1,reason:"merchant_rejected",detail:`v1 supports only the 'exact' scheme, got '${r}'`}:{ok:!1,reason:"unsupported_network"}}catch(r){return{ok:!1,reason:"error",detail:J(r)}}}async function wn(n,e,t){if(t.maxAmountAtomic!==void 0&&BigInt(n.amount)>BigInt(t.maxAmountAtomic))return{ok:!1,reason:"budget_exceeded"};let r=n.extra??{},o=r.name,a=r.version;if(typeof o!="string"||o.length===0||typeof a!="string"||a.length===0)return{ok:!1,reason:"merchant_rejected",detail:"v1 challenge missing exact-scheme EIP-712 domain (extra.name / extra.version)"};let i=n.network.bare,{payment:c,settlementProbe:u}=await Sn(e,n,i);return{ok:!0,headerValue:Buffer.from(JSON.stringify(c),"utf8").toString("base64"),option:n,settlementProbe:u}}async function bn(n,e,t){if(t.maxAmountAtomic!==void 0&&BigInt(n.amount)>BigInt(t.maxAmountAtomic))return{ok:!1,reason:"budget_exceeded"};if(n.scheme!=="exact")return{ok:!1,reason:"merchant_rejected",detail:`v1 SVM supports only the 'exact' scheme, got '${n.scheme}'`};let r=n.extra??{};if(typeof r.feePayer!="string"||r.feePayer.length===0)return{ok:!1,reason:"merchant_rejected",detail:"v1 SVM challenge missing extra.feePayer (required as the transaction fee payer)"};let o=n.network.bare,a={x402Version:1,scheme:n.scheme,network:o,asset:n.asset,payTo:n.payTo,amount:n.amount,maxAmountRequired:n.amount,maxTimeoutSeconds:n.maxTimeoutSeconds??60,extra:r},c=await K().buildTransaction(a,e,t.solanaRpcUrl),u={x402Version:1,scheme:n.scheme,network:o,payload:{transaction:c.serialized}};return{ok:!0,headerValue:Buffer.from(JSON.stringify(u),"utf8").toString("base64"),option:n,settlementProbe:c.settlementProbe}}function xn(n){let e=[];for(let t of n){if(!t||typeof t!="object")continue;let r=t,o=fe(String(r.network??""));o&&e.push({scheme:String(r.scheme??"exact"),network:o,amount:String(r.maxAmountRequired??r.amount??"0"),asset:String(r.asset??""),payTo:String(r.payTo??""),maxTimeoutSeconds:typeof r.maxTimeoutSeconds=="number"?r.maxTimeoutSeconds:void 0,extra:r.extra&&typeof r.extra=="object"?r.extra:void 0})}return e}var $t={version:1,async parseChallenge(n){if(n.headers.get("payment-required"))return null;let e;try{e=await n.clone().json()}catch{return null}let t=Array.isArray(e.accepts)?e.accepts:[];if(t.length===0)return null;let r=xn(t);return r.length===0?null:{x402Version:1,options:r}},async pay(n,e,t,r,o){let a,i=new AbortController,c=!1,u,s;try{let m=o.timeoutMs??15e3;a=setTimeout(()=>i.abort(),m);let f=await je(t,r,o);if(!f.ok)return{ok:!1,reason:f.reason,detail:f.detail};let g=f.headerValue,w=f.option;s=w,u=f.settlementProbe;let l=new Headers(e.headers??void 0);l.set("X-PAYMENT",g);let S=e.signal!=null?AbortSignal.any([e.signal,i.signal]):i.signal,p={method:e.method,headers:l,signal:S};typeof e.body=="string"&&(p.body=e.body),c=!0,clearTimeout(a);let y=o.responseTimeoutMs??12e4;a=setTimeout(()=>i.abort(),y);let h=await fetch(n,p);return h.ok?{ok:!0,paid:!0,response:h,amountPaid:w.amount,network:w.network,txSignature:En(h)}:{ok:!1,...await He(h)}}catch(m){if(m instanceof Error&&m.name==="AbortError"){if(!c)return{ok:!1,reason:"timeout"};let f=await ut(u,s.network,o.solanaRpcUrl);return f.confirmed?{ok:!0,paid:!0,response:void 0,amountPaid:s.amount,network:s.network,txSignature:f.txSignature}:{ok:!1,reason:"payment_unconfirmed",detail:f.detail}}return{ok:!1,reason:"error",detail:J(m)}}finally{a!==void 0&&clearTimeout(a)}}};function En(n){let e=n.headers.get("x-payment-response")??n.headers.get("X-PAYMENT-RESPONSE");if(e)try{let t=JSON.parse(Buffer.from(e,"base64").toString("utf8")),r=t.transaction??t.txHash??t.transactionHash;return typeof r=="string"?r:void 0}catch{return}}var qt=Z(require("tweetnacl"),1);var V=require("@solana/web3.js"),ge=Symbol.for("x402:keypair");async function mt(n){let e;if(typeof n=="string"){let t;try{let r=await Promise.resolve().then(()=>(Vt(),Kt)),o=r.decode??r.default?.decode;if(!o)throw new Error("decode not found");t=o}catch{throw new Error('The "bs58" package is required for base58 private keys. Install it with: npm install bs58')}try{let r=t(n);e=V.Keypair.fromSecretKey(r)}catch{try{let o=JSON.parse(n);if(Array.isArray(o))e=V.Keypair.fromSecretKey(Uint8Array.from(o));else throw new Error("Invalid private key format")}catch{throw new Error("Invalid private key. Expected base58 string or JSON array of bytes.")}}}else if(Array.isArray(n))e=V.Keypair.fromSecretKey(Uint8Array.from(n));else if(n instanceof Uint8Array)e=V.Keypair.fromSecretKey(n);else throw new Error("Invalid private key type. Expected string, number[], or Uint8Array.");return{publicKey:{toBase58:()=>e.publicKey.toBase58()},signTransaction:async t=>{if(t instanceof V.VersionedTransaction)return t.sign([e]),t;if(t instanceof V.Transaction)return t.sign(e),t;throw new Error("Unknown transaction type")},[ge]:e}}function Ft(n){if(!n||typeof n!="object")return!1;let e=n;return ge in e&&e[ge]instanceof V.Keypair&&"publicKey"in e&&"signTransaction"in e}function Je(n){let e=n.evm;if(e&&typeof e.signMessage=="function"&&typeof e.address=="string")return{address:e.address,signMessage:e.signMessage};let t=n.solana;if(t){let r=t[ge];if(r&&r.secretKey&&r.publicKey)return{publicKey:r.publicKey,signMessage:async o=>qt.sign.detached(o,r.secretKey)}}return null}var Ht=[Ut,$t];async function wt(n){for(let e of Ht)if(await e.parseChallenge(n.clone()))return e;return null}async function vn(n){let e=Je(n);if(!e)return fetch;try{return(await import("@x402/extensions/sign-in-with-x")).wrapFetchWithSIWx(fetch,e)}catch(t){return console.warn(`[x402] SIW-X unavailable \u2014 @x402/extensions failed to load; SIW-X merchants will not authenticate. ${J(t)}`),fetch}}async function bt(n,e,t,r){if(e.body!==void 0&&e.body!==null&&typeof e.body!="string")return{ok:!1,reason:"error",detail:"payAndFetch requires a string body; non-string bodies (Buffer, FormData, URLSearchParams, ReadableStream) cannot be safely re-sent on the paid retry"};let o;try{o=await(await vn(t))(n,{...e})}catch(a){return{ok:!1,reason:"error",detail:J(a)}}if(o.status!==402)return{ok:!0,paid:!1,response:o};for(let a of Ht){let i=await a.parseChallenge(o.clone());if(i)return a.pay(n,e,i,t,r)}return{ok:!1,reason:"no_payment_options"}}async function pt(n){let e;try{e=(await import("viem/accounts")).privateKeyToAccount}catch{throw new Error("EVM wallet support requires viem as a peer dependency. Install with: npm install viem")}let t=n.startsWith("0x")?n:`0x${n}`,r=e(t);return{address:r.address,signTypedData:o=>r.signTypedData(o),signTransaction:o=>r.signTransaction({to:o.to,data:o.data,chainId:o.chainId,gas:o.gas,gasPrice:o.gasPrice,nonce:o.nonce,type:"legacy"}),signMessage:o=>r.signMessage({message:o.message})}}function jt(n){if(!n||typeof n!="object")return!1;let e=n;return"address"in e&&typeof e.address=="string"&&e.address.startsWith("0x")&&"signTypedData"in e&&typeof e.signTypedData=="function"}function dt(n){let e=at(n);if(e?.extensions?.["sponsored-access"])return e.extensions["sponsored-access"]}function Jt(n){let e=dt(n);if(e?.recommendations?.length)return e.recommendations}async function zt(n){let t=dt(n)?.tracking?.impressionBeacon;if(!t)return!1;try{await fetch(t,{method:"GET"})}catch{}return!0}function Xt(n,e){let{walletPrivateKey:t,evmPrivateKey:r,preferredNetwork:o,rpcUrls:a,maxAmountAtomic:i,verbose:c,accessPass:u,onPaymentRequired:s}=e;if(!t&&!r)throw new Error("At least one wallet private key is required (walletPrivateKey or evmPrivateKey)");let m={},f=[];t&&f.push(mt(t).then(p=>{m.solana=p}).catch(p=>{console.warn(`[x402] Solana wallet init failed: ${p.message}`)})),r&&f.push(pt(r).then(p=>{m.evm=p}).catch(p=>{console.warn(`[x402] EVM wallet init failed: ${p.message}`)}));let g=f.length>0?Promise.all(f):null,l=st({wallets:m,preferredNetwork:o,rpcUrls:a,maxAmountAtomic:i,fetch:n,verbose:c,accessPass:u,onPaymentRequired:s}),S=l.fetch.bind(l);return g?(async(p,y)=>(await g,S(p,y))):S}function Yt(n){let{budget:e,allowedDomains:t,onPaymentRequired:r,...o}=n,a=parseFloat(e.total),i=e.perRequest?parseFloat(e.perRequest):1/0,c=e.perHour?parseFloat(e.perHour):1/0;if(isNaN(a)||a<=0)throw new Error("budget.total must be a positive number");let u=[],s=0;function m(){return u.reduce((l,S)=>l+S.amount,0)}function f(){let l=Date.now()-36e5;return u.filter(S=>S.timestamp>=l).reduce((S,p)=>S+p.amount,0)}let g=Xt(fetch,{...o,onPaymentRequired:async l=>{let S=l.extra?.decimals??6,p=Number(l.amount)/Math.pow(10,S);if(p>i)throw new C("amount_exceeds_max",`$${p.toFixed(4)} exceeds per-request limit of $${i.toFixed(2)}`);let y=m();if(y+p>a)throw new C("amount_exceeds_max",`Budget exceeded. Spent $${y.toFixed(2)} of $${a.toFixed(2)}, payment: $${p.toFixed(4)}`);let h=f();if(h+p>c)throw new C("amount_exceeds_max",`Hourly limit ($${c.toFixed(2)}) exceeded. Spent $${h.toFixed(2)} this hour`);return s=p,r?r(l):!0}});return{fetch:(async(l,S)=>{let p=typeof l=="string"?l:l instanceof URL?l.href:l.url,y="unknown";try{y=new URL(p).hostname}catch{}if(t&&!t.some(A=>y===A||y.endsWith(`.${A}`)))throw new C("payment_rejected",`Domain "${y}" not in allowed domains`);s=0;let h=await g(l,S);if(s>0){let A="unknown",P=h.headers.get("PAYMENT-RESPONSE");if(P)try{A=JSON.parse(atob(P)).network||A}catch{}u.push({amount:s,domain:y,network:A,timestamp:Date.now()}),s=0}return h}),get spent(){return`$${m().toFixed(2)}`},get remaining(){return`$${(a-m()).toFixed(2)}`},get payments(){return u.length},get spentAmount(){return m()},get remainingAmount(){return a-m()},get ledger(){return u},get hourlySpend(){return f()},reset(){u=[]}}}var xt=require("@dexterai/x402-core");0&&(module.exports={BASE_MAINNET,DEXTER_FACILITATOR_URL,KEYPAIR_SYMBOL,SOLANA_MAINNET,USDC_MINT,X402Error,buildV1PaymentHeader,capabilitySearch,createBudgetAccount,createEvmAdapter,createEvmKeypairWallet,createKeypairWallet,createSolanaAdapter,detectStrategy,fireImpressionBeacon,getPaymentReceipt,getSponsoredAccessInfo,getSponsoredRecommendations,isEvmKeypairWallet,isKeypairWallet,payAndFetch,toNetworkRef,toSiwxSigner});
1
+ "use strict";var Xt=Object.create;var ze=Object.defineProperty;var zt=Object.getOwnPropertyDescriptor;var Yt=Object.getOwnPropertyNames;var Gt=Object.getPrototypeOf,Zt=Object.prototype.hasOwnProperty;var Qt=(n,e)=>{for(var t in e)ze(n,t,{get:e[t],enumerable:!0})},_t=(n,e,t,r)=>{if(e&&typeof e=="object"||typeof e=="function")for(let o of Yt(e))!Zt.call(n,o)&&o!==t&&ze(n,o,{get:()=>e[o],enumerable:!(r=zt(e,o))||r.enumerable});return n};var j=(n,e,t)=>(t=n!=null?Xt(Gt(n)):{},_t(e||!n||!n.__esModule?ze(t,"default",{value:n,enumerable:!0}):t,n)),en=n=>_t(ze({},"__esModule",{value:!0}),n);var Nn={};Qt(Nn,{BASE_MAINNET:()=>X,DEXTER_FACILITATOR_URL:()=>bt,KEYPAIR_SYMBOL:()=>he,SOLANA_MAINNET:()=>J,USDC_MINT:()=>Le,X402Error:()=>_,buildV1PaymentHeader:()=>je,capabilitySearch:()=>Et.capabilitySearch,createBudgetAccount:()=>Jt,createEvmAdapter:()=>ne,createEvmKeypairWallet:()=>ft,createKeypairWallet:()=>pt,createSolanaAdapter:()=>L,detectStrategy:()=>xt,fireImpressionBeacon:()=>Ht,getPaymentReceipt:()=>st,getSponsoredAccessInfo:()=>gt,getSponsoredRecommendations:()=>qt,isEvmKeypairWallet:()=>Wt,isKeypairWallet:()=>$t,payAndFetch:()=>Rt,toNetworkRef:()=>ge,toSiwxSigner:()=>Je});module.exports=en(Nn);var Te="solana:5eykt4UsFv8P8NJdTREpY1vzqKqZKvdp",Ye="solana:EtWTRABZaYq6iMfeYKouRu166VU2xqa1",Ge="solana:4uhcVJyU9pJkvQyS88uRDiswHXSCkY3z",J=Te,Ie=Ye,Ne=Ge,ae="eip155:8453",Se="eip155:84532",ve="eip155:42161",we="eip155:137",xe="eip155:10",Re="eip155:43114",Ee="eip155:56",ie="eip155:480",ce="eip155:143",le="eip155:4663",ue="eip155:1187947933",me="eip155:324705682",_e="eip155:1",X=ae,Ze=Se,Ce=ve,ke=we,Oe=xe,Ve=Re,Be=Ee,De=ie,Ue=ce,Me=le,Ke=ue,$e=me,Fe=_e,Le="EPjFWdd5AufqSSqeM2qN1xzybapC8G4wEGGkZwyTDt1v",Pt="4zMMC9srt5Ri5X14GAgXhaHii3GnPAEERYPJgZJDncDU",Tt="0x833589fCD6eDb6E08f4c7C32D4f71b54bdA02913",yt="0x55d398326f99059fF775485246999027B3197955",Qe="0x8AC76a51cc950d9822D68b83fE1Ad97B32Cd580d",At="0x5fc5360D0400a0Fd4f2af552ADD042D716F1d168",et={[Ee]:Qe,[ae]:Tt,[Se]:"0x036CbD53842c5426634e7929541eC2318f3dCF7e",[ve]:"0xaf88d065e77c8cC2239327C5EDb3A432268e5831",[we]:"0x3c499c542cEF5E3811e1192ce70d8cC03d5c3359",[xe]:"0x0b2C639c533813f4Aa9D7837CAf62653d097Ff85",[Re]:"0xB97EF9Ef8734C71904D8002F8b6Bc66Dd9c48a6E",[ie]:"0x79A02482A880bCE3F13e09Da970dC34db4CD24d1",[ce]:"0x754704Bc059F8C67012fEd69BC8A327a5aafb603",[le]:At,[ue]:"0x85889c8c714505E0c94b30fcfcF64fE3Ac8FCb20",[me]:"0x2e08028E3C4c2356572E096d8EF835cD5C6030bD",[_e]:"0xA0b86991c6218b36c1d19D4a2e9Eb0cE3606eB48"},tt={[yt]:{symbol:"USDT",decimals:18},[Qe]:{symbol:"USDC",decimals:18}};var nt={[ie]:{name:"USDC",version:"2"},[ce]:{name:"USDC",version:"2"},[le]:{name:"Global Dollar",version:"1"},[ue]:{name:"Bridged USDC (SKALE Bridge)",version:"2"},[me]:{name:"Bridged USDC (SKALE Bridge)",version:"2"}},te="0x000000000022D473030F116dDEE9F6B43aC78BA3",We="0x402085c248EeA27D92E8b30b2C58ed07f9E20001",qe={[Ee]:56,[ae]:8453,[Se]:84532,[ve]:42161,[we]:137,[xe]:10,[Re]:43114,[ie]:480,[ce]:143,[le]:4663,[ue]:1187947933,[me]:324705682,[_e]:1},de={[Te]:"https://api.dexter.cash/api/solana/rpc",[Ye]:"https://api.devnet.solana.com",[Ge]:"https://api.testnet.solana.com"},B={[Ee]:"https://api.dexter.cash/api/evm/bsc/rpc",[ae]:"https://api.dexter.cash/api/base/rpc",[Se]:"https://sepolia.base.org",[ve]:"https://api.dexter.cash/api/evm/arbitrum/rpc",[we]:"https://api.dexter.cash/api/evm/polygon/rpc",[xe]:"https://api.dexter.cash/api/evm/optimism/rpc",[Re]:"https://api.dexter.cash/api/evm/avalanche/rpc",[ie]:"https://worldchain-mainnet.g.alchemy.com/public",[ce]:"https://rpc.monad.xyz",[le]:"https://rpc.mainnet.chain.robinhood.com",[ue]:"https://skale-base.skalenodes.com/v1/base",[me]:"https://base-sepolia-testnet.skalenodes.com/v1/jubilant-horrible-ancha",[_e]:"https://eth.llamarpc.com"},bt="https://x402.dexter.cash";var _=class n extends Error{code;details;constructor(e,t,r){super(t),this.name="X402Error",this.code=e,this.details=r,Object.setPrototypeOf(this,n.prototype)}};var C=require("@solana/web3.js"),k=require("@solana/spl-token");var tn=12e3,nn=1;function pe(n){if(!n||typeof n!="object")return!1;let e=n;return"publicKey"in e&&"signTransaction"in e&&typeof e.signTransaction=="function"}var rt=class{name="Solana";networks=[J,Ie,Ne];config;log;constructor(e={}){this.config=e,this.log=e.verbose?console.log.bind(console,"[x402:solana]"):()=>{}}canHandle(e){return!!(this.networks.includes(e)||e==="solana"||e==="solana-devnet"||e==="solana-testnet"||e.startsWith("solana:"))}getDefaultRpcUrl(e){return this.config.rpcUrls?.[e]?this.config.rpcUrls[e]:de[e]?de[e]:e==="solana"?de[J]:e==="solana-devnet"?de[Ie]:e==="solana-testnet"?de[Ne]:de[J]}getAddress(e){return pe(e)?e.publicKey?.toBase58()??null:null}isConnected(e){return pe(e)?e.publicKey!==null:!1}async getBalance(e,t,r){if(!pe(t)||!t.publicKey)return 0;let o=r||this.getDefaultRpcUrl(e.network),s=new C.Connection(o,"confirmed"),a=new C.PublicKey(t.publicKey.toBase58()),i=new C.PublicKey(e.asset);try{let u=(await s.getAccountInfo(i,"confirmed"))?.owner.toBase58()===k.TOKEN_2022_PROGRAM_ID.toBase58()?k.TOKEN_2022_PROGRAM_ID:k.TOKEN_PROGRAM_ID,d=await(0,k.getAssociatedTokenAddress)(i,a,!1,u),g=await(0,k.getAccount)(s,d,void 0,u),h=e.extra?.decimals??6;return Number(g.amount)/Math.pow(10,h)}catch(c){if(c&&typeof c=="object"&&"name"in c&&(c.name==="TokenAccountNotFoundError"||c.name==="TokenInvalidAccountOwnerError"))return 0;throw c}}async buildTransaction(e,t,r){if(!pe(t))throw new Error("Invalid Solana wallet");if(!t.publicKey)throw new Error("Wallet not connected");let o=r||this.getDefaultRpcUrl(e.network),s=new C.Connection(o,"confirmed"),a=new C.PublicKey(t.publicKey.toBase58()),{payTo:i,asset:c,extra:u}=e,d=e.amount??e.maxAmountRequired;if(!d)throw new Error("Missing amount in payment requirements");if(!u?.feePayer)throw new Error("Missing feePayer in payment requirements");let g=new C.PublicKey(u.feePayer),h=new C.PublicKey(c),P=new C.PublicKey(i);this.log("Building transaction:",{from:a.toBase58(),to:i,amount:d,asset:c,feePayer:u.feePayer});let l=[];l.push(C.ComputeBudgetProgram.setComputeUnitLimit({units:tn})),l.push(C.ComputeBudgetProgram.setComputeUnitPrice({microLamports:nn}));let S=await s.getAccountInfo(h,"confirmed");if(!S)throw new Error(`Token mint ${c} not found`);let f=S.owner.toBase58()===k.TOKEN_2022_PROGRAM_ID.toBase58()?k.TOKEN_2022_PROGRAM_ID:k.TOKEN_PROGRAM_ID,p=await(0,k.getMint)(s,h,void 0,f);typeof u?.decimals=="number"&&p.decimals!==u.decimals&&this.log(`Decimals mismatch: requirements say ${u.decimals}, mint says ${p.decimals}`);let y=await(0,k.getAssociatedTokenAddress)(h,a,!1,f),A=await(0,k.getAssociatedTokenAddress)(h,P,!0,f);if(!await s.getAccountInfo(y,"confirmed"))throw new Error(`No token account found for ${c}. Please ensure you have USDC in your wallet.`);if(!await s.getAccountInfo(A,"confirmed"))throw new Error(`Seller token account not found. The seller (${i}) must have a USDC account.`);let Y=BigInt(d);l.push((0,k.createTransferCheckedInstruction)(y,h,A,a,Y,p.decimals,[],f));let{blockhash:q}=await s.getLatestBlockhash("confirmed"),re=new C.TransactionMessage({payerKey:g,recentBlockhash:q,instructions:l}).compileToV0Message(),K=new C.VersionedTransaction(re),b=await t.signTransaction(K);return this.log("Transaction signed successfully"),{serialized:Buffer.from(b.serialize()).toString("base64"),settlementProbe:{kind:"solana",sourceAta:y.toBase58(),destinationAta:A.toBase58(),asset:c,amount:d,blockhash:q}}}async confirmSettlement(e,t){if(e.kind!=="solana")throw new Error(`SolanaAdapter.confirmSettlement cannot handle probe kind "${e.kind}"`);let r=new C.Connection(t,"confirmed"),o=new C.PublicKey(e.destinationAta),s=await r.getSignaturesForAddress(o,{limit:25});if(s.length===0)return{settled:!1};let a=BigInt(e.amount);for(let i of s){if(i.err)continue;let c=await r.getTransaction(i.signature,{commitment:"confirmed",maxSupportedTransactionVersion:0});if(!c?.meta)continue;let u=c.transaction.message.getAccountKeys().keySegments().flat(),d=c.meta.preTokenBalances??[],g=c.meta.postTokenBalances??[];for(let h of g){if(h.mint!==e.asset)continue;let P=u[h.accountIndex];if(!P||!P.equals(o))continue;let l=d.find(p=>p.accountIndex===h.accountIndex),S=BigInt(l?.uiTokenAmount.amount??"0");if(BigInt(h.uiTokenAmount.amount??"0")-S===a)return{settled:!0,txSignature:i.signature}}}return{settled:!1}}};function L(n){return new rt(n)}var rn={PermitWitnessTransferFrom:[{name:"permitted",type:"TokenPermissions"},{name:"spender",type:"address"},{name:"nonce",type:"uint256"},{name:"deadline",type:"uint256"},{name:"witness",type:"Witness"}],TokenPermissions:[{name:"token",type:"address"},{name:"amount",type:"uint256"}],Witness:[{name:"to",type:"address"},{name:"validAfter",type:"uint256"}]},It=BigInt("0xffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff");function fe(n){if(!n||typeof n!="object")return!1;let e=n;return"address"in e&&typeof e.address=="string"&&e.address.startsWith("0x")}var ot=class{name="EVM";networks=[Be,X,Ze,Fe,Ce,ke,Oe,Ve,De,Ue,Me,Ke,$e];config;log;constructor(e={}){this.config=e,this.log=e.verbose?console.log.bind(console,"[x402:evm]"):()=>{}}canHandle(e){return!!(this.networks.includes(e)||e==="base"||e==="bsc"||e==="ethereum"||e==="arbitrum"||e==="polygon"||e==="optimism"||e==="avalanche"||e==="world"||e==="monad"||e==="robinhood"||e==="skale-base"||e==="skale-base-sepolia"||e.startsWith("eip155:"))}getDefaultRpcUrl(e){return this.config.rpcUrls?.[e]?this.config.rpcUrls[e]:B[e]?B[e]:e==="base"?B[X]:e==="bsc"?B[Be]:e==="ethereum"?B[Fe]:e==="arbitrum"?B[Ce]:e==="polygon"?B[ke]:e==="optimism"?B[Oe]:e==="avalanche"?B[Ve]:e==="world"?B[De]:e==="monad"?B[Ue]:e==="robinhood"?B[Me]:e==="skale-base"?B[Ke]:e==="skale-base-sepolia"?B[$e]:B[X]}getAddress(e){return fe(e)?e.address:null}isConnected(e){return fe(e)?!!e.address:!1}getChainId(e){if(qe[e])return qe[e];if(e.startsWith("eip155:")){let t=e.split(":")[1];return parseInt(t,10)}return e==="base"?8453:e==="bsc"?56:e==="ethereum"?1:e==="arbitrum"?42161:e==="polygon"?137:e==="optimism"?10:e==="avalanche"?43114:e==="world"?480:e==="monad"?143:e==="robinhood"?4663:e==="skale-base"?1187947933:e==="skale-base-sepolia"?324705682:8453}async getBalance(e,t,r){if(!fe(t)||!t.address)return 0;let o=r||this.getDefaultRpcUrl(e.network);try{let s=this.encodeBalanceOf(t.address),a=await fetch(o,{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({jsonrpc:"2.0",id:1,method:"eth_call",params:[{to:e.asset,data:s},"latest"]})});if(!a.ok)throw new Error(`RPC request failed: ${a.status}`);let i=await a.json();if(i.error)throw new Error(`RPC error: ${JSON.stringify(i.error)}`);if(!i.result||i.result==="0x")return 0;let c=BigInt(i.result),u=e.extra?.decimals??6;return Number(c)/Math.pow(10,u)}catch(s){throw s}}encodeBalanceOf(e){let t="0x70a08231",r=e.slice(2).toLowerCase().padStart(64,"0");return t+r}async confirmSettlement(e,t){if(e.kind==="eip3009"){let r="0xe94a0102",o=e.from.slice(2).toLowerCase().padStart(64,"0"),s=e.nonce.slice(2).toLowerCase().padStart(64,"0"),a=r+o+s,i=await this.ethCall(t,e.asset,a);return{settled:BigInt(i)!==0n}}if(e.kind==="permit2"){let r="0x4fe02b44",o=BigInt(e.nonce),s=o>>8n,a=o&0xffn,i=e.from.slice(2).toLowerCase().padStart(64,"0"),c=s.toString(16).padStart(64,"0"),u=r+i+c,d=await this.ethCall(t,te,u);return{settled:(BigInt(d)>>a&1n)===1n}}throw new Error(`EvmAdapter.confirmSettlement cannot handle probe kind "${e.kind}"`)}async ethCall(e,t,r){let o=await fetch(e,{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({jsonrpc:"2.0",id:1,method:"eth_call",params:[{to:t,data:r},"latest"]})});if(!o.ok)throw new Error(`RPC request failed: ${o.status}`);let s=await o.json();if(s.error)throw new Error(`RPC error: ${JSON.stringify(s.error)}`);if(!s.result||s.result==="0x")throw new Error("RPC returned an empty result");return s.result}async buildTransaction(e,t,r){if(!fe(t))throw new Error("Invalid EVM wallet");if(!t.address)throw new Error("Wallet not connected");if(e.scheme==="exact-approval")return this.buildApprovalTransaction(e,t,r);if(e.extra?.assetTransferMethod==="permit2")return this.buildPermit2Transaction(e,t,r);let{payTo:o,asset:s,extra:a}=e,i=e.amount??e.maxAmountRequired;if(!i)throw new Error("Missing amount in payment requirements");this.log("Building EVM transaction:",{from:t.address,to:o,amount:i,asset:s,network:e.network});let c=this.getChainId(e.network),u=nt[`eip155:${c}`],d={name:a?.name??u?.name??"USD Coin",version:a?.version??u?.version??"2",chainId:BigInt(c),verifyingContract:s},g={TransferWithAuthorization:[{name:"from",type:"address"},{name:"to",type:"address"},{name:"value",type:"uint256"},{name:"validAfter",type:"uint256"},{name:"validBefore",type:"uint256"},{name:"nonce",type:"bytes32"}]},h=new Uint8Array(32);(globalThis.crypto??(await import("crypto")).webcrypto).getRandomValues(h);let P="0x"+[...h].map(A=>A.toString(16).padStart(2,"0")).join(""),l=Math.floor(Date.now()/1e3),S={from:t.address,to:o,value:i,validAfter:String(l-600),validBefore:String(l+(e.maxTimeoutSeconds||60)),nonce:P},f={from:t.address,to:o,value:BigInt(i),validAfter:BigInt(l-600),validBefore:BigInt(l+(e.maxTimeoutSeconds||60)),nonce:P};if(!t.signTypedData)throw new Error("Wallet does not support signTypedData (EIP-712)");let p=await t.signTypedData({domain:d,types:g,primaryType:"TransferWithAuthorization",message:f});return this.log("EIP-712 signature obtained"),{serialized:JSON.stringify({authorization:S,signature:p}),signature:p,settlementProbe:{kind:"eip3009",from:t.address,nonce:P,asset:s,chainId:c}}}async buildApprovalTransaction(e,t,r){let{payTo:o,asset:s,extra:a}=e,i=e.amount??e.maxAmountRequired;if(!i)throw new Error("Missing amount in payment requirements");let c=a?.facilitatorContract;if(!c)throw new Error("exact-approval scheme requires extra.facilitatorContract from the facilitator. The /supported endpoint should provide this.");if(!t.signTypedData)throw new Error("Wallet does not support signTypedData (EIP-712)");this.log("Building approval-based transaction:",{from:t.address,to:o,amount:i,asset:s,network:e.network,facilitatorContract:c});let u=r||this.getDefaultRpcUrl(e.network),d=a?.fee??"0",g=BigInt(i)+BigInt(d),h=await this.readAllowance(u,s,t.address,c);if(h<g){if(!t.sendTransaction)throw new Error("BSC payments require a wallet that supports sendTransaction for the one-time token approval. Use createEvmKeypairWallet() or a browser wallet with transaction support.");let K=this.calculateApprovalAmount(i,d,a?.approvalStrategy);this.log(`Approving ${K} for ${c} (current allowance: ${h})`);let b=await t.sendTransaction({to:s,data:this.encodeApprove(c,K),value:0n});this.log(`Approval tx sent: ${b}`),await this.waitForReceipt(u,b),this.log("Approval confirmed")}else this.log("Sufficient allowance, skipping approval");let P=new Uint8Array(16);(globalThis.crypto??(await import("crypto")).webcrypto).getRandomValues(P);let l=[...P].reduce((K,b)=>K*256n+BigInt(b),0n).toString(),S=new Uint8Array(32);(globalThis.crypto??(await import("crypto")).webcrypto).getRandomValues(S);let f="0x"+[...S].map(K=>K.toString(16).padStart(2,"0")).join(""),y=Math.floor(Date.now()/1e3)+(e.maxTimeoutSeconds||300),A=a?.eip712Domain,O=A?{name:A.name,version:A.version,chainId:BigInt(A.chainId),verifyingContract:A.verifyingContract}:{name:"DexterBSCFacilitator",version:"1",chainId:BigInt(this.getChainId(e.network)),verifyingContract:c},D=a?.eip712Types??{Payment:[{name:"from",type:"address"},{name:"to",type:"address"},{name:"token",type:"address"},{name:"amount",type:"uint256"},{name:"fee",type:"uint256"},{name:"nonce",type:"uint256"},{name:"deadline",type:"uint256"},{name:"paymentId",type:"bytes32"}]},Y={from:t.address,to:o,token:s,amount:BigInt(i),fee:BigInt(d),nonce:BigInt(l),deadline:BigInt(y),paymentId:f},q=await t.signTypedData({domain:O,types:D,primaryType:"Payment",message:Y});this.log("EIP-712 Payment signature obtained");let re={from:t.address,to:o,token:s,amount:i,fee:d,nonce:l,deadline:y,paymentId:f,signature:q};return{serialized:JSON.stringify(re),signature:q}}async buildPermit2Transaction(e,t,r){let{payTo:o,asset:s}=e,a=e.amount??e.maxAmountRequired;if(!a)throw new Error("Missing amount in payment requirements");if(!t.signTypedData)throw new Error("Wallet does not support signTypedData (EIP-712)");this.log("Building Permit2 transaction:",{from:t.address,to:o,amount:a,asset:s,network:e.network});let i=r||this.getDefaultRpcUrl(e.network),c=await this.readAllowance(i,s,t.address,te),u;if(c<BigInt(a)){let O=this.encodeApprove(te,It);if(t.signTransaction){this.log(`Signing Permit2 approval for relay (current allowance: ${c})`);let D=this.getChainId(e.network),Y=await this.readGasPrice(i),q=await this.readNonce(i,t.address),re=await t.signTransaction({to:s,data:O,chainId:D,gas:50000n,gasPrice:Y,nonce:q});u={erc20ApprovalGasSponsoring:{info:{from:t.address,asset:s,spender:te,amount:It.toString(),signedTransaction:re,version:"1"}}},this.log("Permit2 approval signed for facilitator relay")}else if(t.sendTransaction){this.log(`Approving Permit2 directly (current allowance: ${c})`);let D=await t.sendTransaction({to:s,data:O,value:0n});this.log(`Permit2 approval tx sent: ${D}`),await this.waitForReceipt(i,D),this.log("Permit2 approval confirmed")}else throw new Error("Permit2 payments require a wallet that supports signTransaction or sendTransaction for the one-time Permit2 approval. Use createEvmKeypairWallet() or a browser wallet with transaction support.")}else this.log("Sufficient Permit2 allowance, skipping approval");let d=new Uint8Array(32);(globalThis.crypto??(await import("crypto")).webcrypto).getRandomValues(d);let g=[...d].reduce((O,D)=>O*256n+BigInt(D),0n),h=Math.floor(Date.now()/1e3),P=h-600,l=h+(e.maxTimeoutSeconds||300),S=this.getChainId(e.network),f={name:"Permit2",chainId:BigInt(S),verifyingContract:te},p={permitted:{token:s,amount:BigInt(a)},spender:We,nonce:g,deadline:BigInt(l),witness:{to:o,validAfter:BigInt(P)}},y=await t.signTypedData({domain:f,types:rn,primaryType:"PermitWitnessTransferFrom",message:p});this.log("Permit2 PermitWitnessTransferFrom signature obtained");let A={signature:y,permit2Authorization:{from:t.address,permitted:{token:s,amount:a},spender:We,nonce:g.toString(),deadline:String(l),witness:{to:o,validAfter:String(P)}}};return{serialized:JSON.stringify(A),signature:y,extensions:u,settlementProbe:{kind:"permit2",from:t.address,nonce:g.toString(),chainId:S}}}async readAllowance(e,t,r,o){let s="0xdd62ed3e",a=r.slice(2).toLowerCase().padStart(64,"0"),i=o.slice(2).toLowerCase().padStart(64,"0"),c=s+a+i;try{let d=await(await fetch(e,{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({jsonrpc:"2.0",id:1,method:"eth_call",params:[{to:t,data:c},"latest"]})})).json();return d.error||!d.result||d.result==="0x"?0n:BigInt(d.result)}catch{return 0n}}encodeApprove(e,t){let r="0x095ea7b3",o=e.slice(2).toLowerCase().padStart(64,"0"),s=t.toString(16).padStart(64,"0");return r+o+s}async waitForReceipt(e,t,r=3e4){let o=Date.now();for(;Date.now()-o<r;){try{let a=await(await fetch(e,{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({jsonrpc:"2.0",id:1,method:"eth_getTransactionReceipt",params:[t]})})).json();if(a.result){if(a.result.status==="0x0")throw new Error(`Approval transaction reverted: ${t}`);return}}catch(s){if(s instanceof Error&&s.message.includes("reverted"))throw s}await new Promise(s=>setTimeout(s,2e3))}throw new Error(`Approval transaction receipt timeout after ${r}ms: ${t}`)}async readGasPrice(e){try{let r=await(await fetch(e,{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({jsonrpc:"2.0",id:1,method:"eth_gasPrice",params:[]})})).json();return r.result?BigInt(r.result):50000000n}catch{return 50000000n}}async readNonce(e,t){try{let o=await(await fetch(e,{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({jsonrpc:"2.0",id:1,method:"eth_getTransactionCount",params:[t,"latest"]})})).json();return o.result?parseInt(o.result,16):0}catch{return 0}}calculateApprovalAmount(e,t,r){let o=BigInt(e)+BigInt(t);if(!r||r.mode==="exact")return o;let s=BigInt(r.defaultMultiple??10),a=o*s;if(r.maxCapUsd){let i=this.inferDecimals(e),c=BigInt(Math.floor(r.maxCapUsd*Math.pow(10,i)));if(a>c)return c}if(r.exactAboveUsd){let i=this.inferDecimals(e),c=BigInt(Math.floor(r.exactAboveUsd*Math.pow(10,i)));if(BigInt(e)>c)return o}return a}inferDecimals(e){return e.length>12?18:6}};function ne(n){return new ot(n)}function St(n){if(n===Le||n===Pt)return!0;let e=n.toLowerCase();for(let t of Object.values(et))if(t.toLowerCase()===e)return!0;for(let t of Object.keys(tt))if(t.toLowerCase()===e)return!0;return!1}function on(n){return{[Te]:"Solana",[Ye]:"Solana Devnet",[Ge]:"Solana Testnet",solana:"Solana","solana-devnet":"Solana Devnet","solana-testnet":"Solana Testnet",[ae]:"Base",[Se]:"Base Sepolia",[_e]:"Ethereum",[ve]:"Arbitrum",[we]:"Polygon",[xe]:"Optimism",[Re]:"Avalanche",[Ee]:"BSC",[ie]:"World Chain",[ce]:"Monad",[le]:"Robinhood Chain",[ue]:"SKALE Base",[me]:"SKALE Base Sepolia",base:"Base","base-sepolia":"Base Sepolia",ethereum:"Ethereum",arbitrum:"Arbitrum",polygon:"Polygon",optimism:"Optimism",avalanche:"Avalanche",bsc:"BSC",world:"World Chain",monad:"Monad",robinhood:"Robinhood Chain","skale-base":"SKALE Base","skale-base-sepolia":"SKALE Base Sepolia"}[n]||n}function Nt(n,e){let t=on(n);return t===n?e:t}async function sn(n,e){if(typeof n=="string")return[n,e];if(n instanceof URL)return[n.href,e];let t=n,r=new Headers(t.headers);e?.headers&&new Headers(e.headers).forEach((a,i)=>r.set(i,a));let o={method:e?.method??t.method,headers:r,signal:e?.signal??t.signal,redirect:e?.redirect??t.redirect,credentials:e?.credentials??t.credentials},s=(o.method??"GET").toUpperCase();return e&&"body"in e?o.body=e.body:s!=="GET"&&s!=="HEAD"&&t.body&&(o.body=await t.arrayBuffer()),[t.url,o]}var Ct=new WeakMap;function st(n){return Ct.get(n)}function at(n){let{adapters:e=[L({verbose:n.verbose}),ne({verbose:n.verbose})],wallets:t,wallet:r,preferredNetwork:o,rpcUrls:s={},maxAmountAtomic:a,fetch:i=globalThis.fetch,verbose:c=!1,accessPass:u,onPaymentRequired:d,onPaymentDispatched:g,maxRetries:h=0,retryDelayMs:P=500}=n,l=c?console.log.bind(console,"[x402]"):()=>{};async function S(b,x){let R;for(let v=0;v<=h;v++)try{let E=await i(b,x);if(E.status>=502&&E.status<=504&&v<h){l(`Retry ${v+1}/${h}: server returned ${E.status}`),await new Promise(T=>setTimeout(T,P*Math.pow(2,v)));continue}return E}catch(E){R=E,v<h&&(l(`Retry ${v+1}/${h}: ${E instanceof Error?E.message:"network error"}`),await new Promise(T=>setTimeout(T,P*Math.pow(2,v))))}throw R}let f=new Map;function p(b){try{let x=new URL(b).host,R=f.get(x);if(R&&R.expiresAt>Date.now()/1e3+10)return R.jwt;R&&f.delete(x)}catch{}return null}function y(b,x){try{let R=new URL(b).host,v=x.split(".");if(v.length===3){let E=JSON.parse(atob(v[1].replace(/-/g,"+").replace(/_/g,"/"))),T=Math.floor(Date.now()/1e3),I=T+86400,$=Math.min(typeof E.exp=="number"?E.exp:T,I);f.set(R,{jwt:x,expiresAt:$}),l("Access pass cached for",R,"| expires:",new Date($*1e3).toISOString())}}catch{l("Failed to cache access pass")}}let A=t||{};r&&!A.solana&&pe(r)&&(A.solana=r),r&&!A.evm&&fe(r)&&(A.evm=r);function O(b){let x=[];for(let R of b){let v=R.scheme??"exact";if(v!=="exact"&&v!=="exact-approval")continue;let E=e.find(I=>I.canHandle(R.network));if(!E)continue;let T;E.name==="Solana"?T=A.solana:E.name==="EVM"&&(T=A.evm),T&&E.isConnected(T)&&x.push({accept:R,adapter:E,wallet:T})}if(x.length===0)return null;if(o){let R=x.find(v=>v.accept.network===o);if(R)return R}return x[0]}function D(b,x){return Nt(b,x)}function Y(b,x){return s[b]||x.getDefaultRpcUrl(b)}async function q(b,x,R,v,E){let T="";if(u?.preferTier&&v.tiers){let m=v.tiers.find(w=>w.id===u.preferTier);if(m){if(u.maxSpend&&parseFloat(m.price)>parseFloat(u.maxSpend))throw new _("access_pass_exceeds_max_spend",`Access pass tier "${m.id}" costs $${m.price}, exceeds max spend $${u.maxSpend}`);T=`tier=${m.id}`}}else if(u?.preferDuration&&v.ratePerHour)T=`duration=${u.preferDuration}`;else if(v.tiers&&v.tiers.length>0){let m=v.tiers[0];if(u?.maxSpend&&parseFloat(m.price)>parseFloat(u.maxSpend))throw new _("access_pass_exceeds_max_spend",`Cheapest access pass costs $${m.price}, exceeds max spend $${u?.maxSpend}`);T=`tier=${m.id}`}let I=T?E.includes("?")?`${E}&${T}`:`${E}?${T}`:E;l("Purchasing access pass:",T||"default tier");let $=R.headers.get("PAYMENT-REQUIRED");if(!$)return null;let U;try{U=JSON.parse(atob($))}catch{return null}let V=O(U.accepts);if(!V)return null;let{accept:N,adapter:H,wallet:ye}=V;if(H.name==="Solana"&&!N.extra?.feePayer)return null;let G=N.extra?.decimals??(St(N.asset)?6:void 0);if(typeof G!="number")return null;let Pe=N.amount??N.maxAmountRequired;if(!Pe)return null;let Z=Y(N.network,H);try{let m=await H.getBalance(N,ye,Z),w=Number(Pe)/Math.pow(10,G);if(m<w){let ht=D(N.network,H.name);throw new _("insufficient_balance",`Insufficient balance for access pass on ${ht}. Have $${m.toFixed(4)}, need $${w.toFixed(4)}`)}}catch(m){if(m instanceof _)throw m}let Q=await H.buildTransaction(N,ye,Z),Ae;H.name==="EVM"?Ae=JSON.parse(Q.serialized):Ae={transaction:Q.serialized};let oe=typeof b=="string"?b:b instanceof URL?b.href:b.url,be=U.resource;if(typeof U.resource=="string")try{let m=new URL(U.resource,oe);["http:","https:"].includes(m.protocol)&&(be=m.toString())}catch{}else if(U.resource&&typeof U.resource=="object"&&"url"in U.resource){let m=U.resource;try{let w=new URL(m.url,oe);["http:","https:"].includes(w.protocol)&&(be={...m,url:w.toString()})}catch{}}let Xe={x402Version:N.x402Version??2,resource:be,accepted:N,payload:Ae};Q.extensions&&(Xe.extensions=Q.extensions);let ee=btoa(JSON.stringify(Xe)),se=await i(I,{...x,method:"POST",headers:{...x?.headers||{},"Content-Type":"application/json","PAYMENT-SIGNATURE":ee}});if(!se.ok)return l("Pass purchase failed:",se.status),null;let F=se.headers.get("ACCESS-PASS");return F&&(y(E,F),l("Access pass purchased and cached")),se}async function re(b,x){let R=b;if(l("Making request:",R),u){let m=p(R);if(m){l("Using cached access pass");let w=await i(b,{...x,headers:{...x?.headers||{},Authorization:`Bearer ${m}`}});if(w.status!==401&&w.status!==402)return w;l("Cached pass rejected (status",w.status,"), purchasing new pass");try{f.delete(new URL(R).host)}catch{}}}let v=await S(b,x);if(v.status!==402)return v;l("Received 402 Payment Required");let E=v.headers.get("X-ACCESS-PASS-TIERS");if(u&&E){l("Server offers access passes, purchasing...");try{let m=JSON.parse(atob(E)),w=await q(b,x,v,m,R);if(w)return w}catch(m){l("Access pass purchase failed, falling back to per-request payment:",m)}}let T=v.headers.get("PAYMENT-REQUIRED");if(!T)throw new _("missing_payment_required_header","Server returned 402 but no PAYMENT-REQUIRED header");let I;try{let m=atob(T);I=JSON.parse(m)}catch{throw new _("invalid_payment_required","Failed to decode PAYMENT-REQUIRED header")}l("Payment requirements:",I);let $=v.headers.get("X-Quote-Hash");$&&l("Quote hash received:",$);let U=O(I.accepts);if(!U){let m=I.accepts.map(w=>w.network).join(", ");throw new _("no_matching_payment_option",`No connected wallet for any available network: ${m}`)}let{accept:V,adapter:N,wallet:H}=U;if(l(`Using ${N.name} for ${V.network}`),N.name==="Solana"&&!V.extra?.feePayer)throw new _("missing_fee_payer","Solana payment option missing feePayer in extra");let ye=V.extra?.decimals??(St(V.asset)?6:void 0);if(typeof ye!="number")throw new _("missing_decimals","Payment option missing decimals - provide in extra or use a known stablecoin");let G=V.amount??V.maxAmountRequired;if(!G)throw new _("missing_amount","Payment option missing amount");if(a&&BigInt(G)>BigInt(a))throw new _("amount_exceeds_max",`Payment amount ${G} exceeds maximum ${a}`);let Pe=Y(V.network,N);l("Checking balance...");try{let m=await N.getBalance(V,H,Pe),w=Number(G)/Math.pow(10,ye);if(m<w){let ht=D(V.network,N.name);throw new _("insufficient_balance",`Insufficient balance on ${ht}. Have $${m.toFixed(4)}, need $${w.toFixed(4)}`)}l(`Balance OK: $${m.toFixed(4)} >= $${w.toFixed(4)}`)}catch(m){if(m instanceof _)throw m;l("Balance check failed (RPC error), proceeding with transaction attempt")}if(d&&!await d(V))throw new _("payment_rejected","Payment rejected by onPaymentRequired callback");l("Building transaction...");let Z=await N.buildTransaction(V,H,Pe);l("Transaction signed");let Q;N.name==="EVM"?Q=JSON.parse(Z.serialized):Q={transaction:Z.serialized};let Ae=b,oe=I.resource;if(typeof I.resource=="string")try{let m=new URL(I.resource,Ae).toString();m!==I.resource&&l("Resolved relative resource URL:",I.resource,"\u2192",m),oe=m}catch{oe=I.resource}else if(I.resource&&typeof I.resource=="object"&&"url"in I.resource){let m=I.resource;try{let w=new URL(m.url,Ae).toString();w!==m.url&&(l("Resolved relative resource URL:",m.url,"\u2192",w),oe={...m,url:w})}catch{}}let be={x402Version:V.x402Version??2,resource:oe,accepted:V,payload:Q};Z.extensions&&(be.extensions=Z.extensions);let Xe=btoa(JSON.stringify(be));if(g)try{g(V,Z.settlementProbe)}catch{}l("Retrying request with payment...");let ee=await S(b,{...x,headers:{...x?.headers||{},"PAYMENT-SIGNATURE":Xe,...$?{"X-Quote-Hash":$}:{}}});if(l("Retry response status:",ee.status),ee.status===402){let m="unknown";try{let w=await ee.clone().json();m=String(w.error||w.message||JSON.stringify(w)),l("Rejection reason:",m)}catch{}throw new _("payment_rejected",`Payment was rejected by the server: ${m}`)}let se=ee.headers.get("PAYMENT-RESPONSE"),F;if(se)try{F=JSON.parse(atob(se))}catch{}return F??={},F.amountAtomic=G,F.assetDecimals=ye,Ct.set(ee,F),F.extensions&&l("Settlement extensions:",Object.keys(F.extensions).join(", ")),ee}async function K(b,x){let[R,v]=await sn(b,x);return re(R,v)}return{fetch:K}}var gn=require("@solana/web3.js"),lt=require("@noble/hashes/utils");var an=j(require("tweetnacl"),1),cn=require("@solana/web3.js"),it=require("@dexterai/vault/messages"),ln=require("@dexterai/vault/session");var M=require("@dexterai/vault/messages");var un=require("@noble/hashes/sha256");var rr=(1n<<64n)-1n;var mn=require("@noble/hashes/sha256"),dn=require("@noble/hashes/utils");var pn="dexter-native-tab-v2-reservation/v1",sr=`${pn}:`;var hn=require("@dexterai/vault/session");var vt=require("@dexterai/vault/instructions"),fn=require("@dexterai/vault/precompile"),ct=require("@dexterai/vault/constants");function kt(n,e){let t=e??n.reservationReceipt;if((n.payload.sequenceNumber&2147483648)!==0&&!t)throw new Error("native_tab_v2_reservation_receipt_required");return Buffer.from(JSON.stringify({payload:n.payload,sessionPublicKey:(0,lt.bytesToHex)(n.sessionPublicKey),sessionRegistration:(0,lt.bytesToHex)(n.sessionRegistration),sessionSignature:(0,lt.bytesToHex)(n.sessionSignature),...t?{reservationReceipt:t}:{}}),"utf8").toString("base64")}function z(n){if(n instanceof Error){if(n.message&&n.message.length>0)return n.message;if(n.name&&n.name.length>0)return n.name}let e=String(n);return e.length>0?e:"unknown error"}async function He(n){let e="";try{e=(await n.clone().text()).slice(0,600)}catch{}let t=e.toLowerCase(),r=t.includes("settle")||t.includes("facilitator"),o=e;try{let s=JSON.parse(e),a=[s.error,s.detail,s.message].filter(i=>typeof i=="string"&&i.length>0);a.length>0&&(o=a.join(" \u2014 "))}catch{}return o||(o=`HTTP ${n.status}`),{reason:r?"settlement_failed":"merchant_rejected",detail:`merchant HTTP ${n.status}: ${o}`}}var ut="Payment authorization was sent, but the merchant did not respond within the timeout. ",mt=" Do not retry without checking \u2014 inspect the funding wallet for a transfer to the merchant before attempting payment again.";async function dt(n,e,t){if(!n)return{confirmed:!1,detail:ut+"This payment scheme has no on-chain confirmation check, so the SDK cannot verify whether it settled."+mt};try{if(n.kind==="solana"){let a=L(),i=t??a.getDefaultRpcUrl(e.caip2);if(!a.confirmSettlement)return Vt();let c=await a.confirmSettlement(n,i);return c.settled?{confirmed:!0,txSignature:c.txSignature}:Ot()}let r=ne(),o=r.getDefaultRpcUrl(e.caip2);if(!r.confirmSettlement)return Vt();let s=await r.confirmSettlement(n,o);return s.settled?{confirmed:!0,txSignature:s.txSignature}:Ot()}catch(r){return{confirmed:!1,detail:ut+`On-chain confirmation could not be completed (${z(r)}).`+mt}}}function Ot(){return{confirmed:!1,detail:ut+"On-chain confirmation found no matching settlement yet \u2014 the payment may still be pending, or may not have settled."+mt}}function Vt(){return{confirmed:!1,detail:ut+"The chain adapter does not support on-chain confirmation."+mt}}var Bt=[{caip2:"eip155:8453",bare:"base",family:"evm"},{caip2:"eip155:1",bare:"ethereum",family:"evm"},{caip2:"eip155:137",bare:"polygon",family:"evm"},{caip2:"eip155:42161",bare:"arbitrum",family:"evm"},{caip2:"eip155:10",bare:"optimism",family:"evm"},{caip2:"eip155:43114",bare:"avalanche",family:"evm"},{caip2:"eip155:56",bare:"bsc",family:"evm"},{caip2:"eip155:480",bare:"world",family:"evm"},{caip2:"eip155:143",bare:"monad",family:"evm"},{caip2:"eip155:4663",bare:"robinhood",family:"evm"},{caip2:"eip155:1187947933",bare:"skale-base",family:"evm"},{caip2:"eip155:324705682",bare:"skale-base-sepolia",family:"evm"},{caip2:"solana:5eykt4UsFv8P8NJdTREpY1vzqKqZKvdp",bare:"solana",family:"svm"}],yn=new Map(Bt.map(n=>[n.caip2.toLowerCase(),n])),An=new Map(Bt.map(n=>[n.bare.toLowerCase(),n]));function ge(n){if(!n)return null;let e=n.toLowerCase(),t=yn.get(e)||An.get(e);return t?{caip2:t.caip2,bare:t.bare,family:t.family}:null}function wt(n){let e=n.replace(/-/g,"+").replace(/_/g,"/"),t=e+"=".repeat((4-(e.length%4||4))%4);return JSON.parse(Buffer.from(t,"base64").toString("utf8"))}function bn(n){let e=[];for(let t of n){if(!t||typeof t!="object")continue;let r=t,o=ge(String(r.network??""));o&&e.push({scheme:String(r.scheme??"exact"),network:o,amount:String(r.amount??r.maxAmountRequired??"0"),asset:String(r.asset??""),payTo:String(r.payTo??""),maxTimeoutSeconds:typeof r.maxTimeoutSeconds=="number"?r.maxTimeoutSeconds:void 0,extra:r.extra&&typeof r.extra=="object"?r.extra:void 0})}return e}async function Dt(n){let e=n.headers.get("payment-required");if(!e)return null;let t;try{t=wt(e)}catch{return null}let r=Array.isArray(t.accepts)?t.accepts:[];return r.length===0?null:{x402Version:2,options:bn(r),resourceUrl:t.resource&&typeof t.resource=="object"?String(t.resource.url??""):void 0}}var Sn=new Set(["exact","exact-approval"]);async function vn(n,e,t,r){let o;try{o=await r.signNextVoucher(t.amount)}catch(c){return r.voucherVersion!==1?{ok:!1,reason:"error",detail:`context-bound FINAL tab voucher was not safely released; retry or reconcile this tab before another payment rail is attempted (${c instanceof Error?c.message:String(c)})`}:null}let s=new Headers(e.headers??void 0);s.set("X-Tab-Voucher",kt(o));let a={method:e.method??"GET",headers:s};e.signal&&(a.signal=e.signal),typeof e.body=="string"&&(a.body=e.body);let i;try{i=await fetch(n,a)}catch(c){return{ok:!1,reason:"error",detail:c?.message??String(c)}}return i.status===402?r.voucherVersion!==1?{ok:!1,reason:"error",detail:"seller refused an irrevocable FINAL tab voucher; its exact reservation must be reconciled before another payment rail is attempted"}:r.rollbackVoucher?.call(r,o)!==!0?{ok:!1,reason:"error",detail:"seller refused a V1 tab voucher but local rollback was unavailable or failed; another payment rail was not attempted to avoid double payment"}:null:i.ok?{ok:!0,paid:!0,response:i,amountPaid:t.amount,network:t.network}:{ok:!1,...await He(i)}}var Ut={version:2,async parseChallenge(n){return Dt(n)},async pay(n,e,t,r,o){if(o.tab){let p=t.options.find(y=>y.scheme==="tab"&&y.network.family==="svm"&&y.payTo===o.tab.counterparty);if(p){let y=await vn(n,e,p,o.tab);if(y)return y}}let s=t.options.filter(p=>Sn.has(p.scheme));if(s.length===0)return{ok:!1,reason:"no_payment_options",detail:`no generically payable scheme offered (got: ${t.options.map(p=>p.scheme).join(", ")})`};let a=s.find(p=>p.network.family==="evm"?!!r.evm:p.network.family==="svm"?!!r.solana:!1);if(!a)return{ok:!1,reason:"unsupported_network"};let i=o.timeoutMs??15e3,c=o.responseTimeoutMs??12e4,u=new AbortController,d=setTimeout(()=>u.abort(),i),g=!1,h,P=(p,y)=>{g=!0,h=y,clearTimeout(d),d=setTimeout(()=>u.abort(),c)},l=at({wallets:r,preferredNetwork:a.network.caip2,maxAmountAtomic:o.maxAmountAtomic,fetch:globalThis.fetch,onPaymentDispatched:P}),S=e.signal?AbortSignal.any([e.signal,u.signal]):u.signal,f={method:e.method??"GET",headers:e.headers,signal:S};typeof e.body=="string"&&(f.body=e.body);try{let p=await l.fetch(n,f);if(clearTimeout(d),!p.ok)return{ok:!1,...await He(p)};let y,A=p.headers.get("PAYMENT-RESPONSE");if(A)try{let O=wt(A);O&&typeof O.transaction=="string"&&(y=O.transaction)}catch{}return{ok:!0,paid:!0,response:p,amountPaid:a.amount,network:a.network,txSignature:y}}catch(p){clearTimeout(d);let y=p;if(y?.name==="AbortError"){if(!g)return{ok:!1,reason:"timeout"};let A=await dt(h,a.network,o.solanaRpcUrl);return A.confirmed?{ok:!0,paid:!0,response:void 0,amountPaid:a.amount,network:a.network,txSignature:A.txSignature}:{ok:!1,reason:"payment_unconfirmed",detail:A.detail}}return{ok:!1,reason:"error",detail:y?.message??String(p)}}}};var Mt=require("viem");var wn={TransferWithAuthorization:[{name:"from",type:"address"},{name:"to",type:"address"},{name:"value",type:"uint256"},{name:"validAfter",type:"uint256"},{name:"validBefore",type:"uint256"},{name:"nonce",type:"bytes32"}]};async function xn(){let n=globalThis.crypto??(await import("crypto")).webcrypto,e=new Uint8Array(32);return n.getRandomValues(e),"0x"+Array.from(e,t=>t.toString(16).padStart(2,"0")).join("")}async function Rn(n,e,t){if(typeof n.signTypedData!="function")throw new Error("EVM wallet does not support signTypedData");let r=Math.floor(Date.now()/1e3),o=String(r-600),s=String(r+(e.maxTimeoutSeconds??60)),a={from:n.address,to:e.payTo,value:e.amount,validAfter:o,validBefore:s,nonce:await xn()},i=qe[e.network.caip2];if(i===void 0)throw new Error(`unknown chain id for network ${e.network.caip2}`);let c=e.extra,u=await n.signTypedData({domain:{name:c.name,version:c.version,chainId:i,verifyingContract:(0,Mt.getAddress)(e.asset)},types:wn,primaryType:"TransferWithAuthorization",message:a});return{payment:{x402Version:1,scheme:e.scheme,network:t,payload:{signature:u,authorization:a}},settlementProbe:{kind:"eip3009",from:a.from,nonce:a.nonce,asset:e.asset,chainId:i}}}async function je(n,e,t){try{let r;for(let o of n.options){let s=o.network.family==="evm"&&!!e.evm||o.network.family==="svm"&&!!e.solana;if(o.scheme!=="exact"){s&&(r=o.scheme);continue}if(o.network.family==="evm"&&e.evm){let a=await e.evm;return await En(o,a,t)}if(o.network.family==="svm"&&e.solana){let a=await e.solana;return await _n(o,a,t)}}return r!==void 0?{ok:!1,reason:"merchant_rejected",detail:`v1 supports only the 'exact' scheme, got '${r}'`}:{ok:!1,reason:"unsupported_network"}}catch(r){return{ok:!1,reason:"error",detail:z(r)}}}async function En(n,e,t){if(t.maxAmountAtomic!==void 0&&BigInt(n.amount)>BigInt(t.maxAmountAtomic))return{ok:!1,reason:"budget_exceeded"};let r=n.extra??{},o=r.name,s=r.version;if(typeof o!="string"||o.length===0||typeof s!="string"||s.length===0)return{ok:!1,reason:"merchant_rejected",detail:"v1 challenge missing exact-scheme EIP-712 domain (extra.name / extra.version)"};let a=n.network.bare,{payment:i,settlementProbe:c}=await Rn(e,n,a);return{ok:!0,headerValue:Buffer.from(JSON.stringify(i),"utf8").toString("base64"),option:n,settlementProbe:c}}async function _n(n,e,t){if(t.maxAmountAtomic!==void 0&&BigInt(n.amount)>BigInt(t.maxAmountAtomic))return{ok:!1,reason:"budget_exceeded"};if(n.scheme!=="exact")return{ok:!1,reason:"merchant_rejected",detail:`v1 SVM supports only the 'exact' scheme, got '${n.scheme}'`};let r=n.extra??{};if(typeof r.feePayer!="string"||r.feePayer.length===0)return{ok:!1,reason:"merchant_rejected",detail:"v1 SVM challenge missing extra.feePayer (required as the transaction fee payer)"};let o=n.network.bare,s={x402Version:1,scheme:n.scheme,network:o,asset:n.asset,payTo:n.payTo,amount:n.amount,maxAmountRequired:n.amount,maxTimeoutSeconds:n.maxTimeoutSeconds??60,extra:r},i=await L().buildTransaction(s,e,t.solanaRpcUrl),c={x402Version:1,scheme:n.scheme,network:o,payload:{transaction:i.serialized}};return{ok:!0,headerValue:Buffer.from(JSON.stringify(c),"utf8").toString("base64"),option:n,settlementProbe:i.settlementProbe}}function Pn(n){let e=[];for(let t of n){if(!t||typeof t!="object")continue;let r=t,o=ge(String(r.network??""));o&&e.push({scheme:String(r.scheme??"exact"),network:o,amount:String(r.maxAmountRequired??r.amount??"0"),asset:String(r.asset??""),payTo:String(r.payTo??""),maxTimeoutSeconds:typeof r.maxTimeoutSeconds=="number"?r.maxTimeoutSeconds:void 0,extra:r.extra&&typeof r.extra=="object"?r.extra:void 0})}return e}var Kt={version:1,async parseChallenge(n){if(n.headers.get("payment-required"))return null;let e;try{e=await n.clone().json()}catch{return null}let t=Array.isArray(e.accepts)?e.accepts:[];if(t.length===0)return null;let r=Pn(t);return r.length===0?null:{x402Version:1,options:r}},async pay(n,e,t,r,o){let s,a=new AbortController,i=!1,c,u;try{let d=o.timeoutMs??15e3;s=setTimeout(()=>a.abort(),d);let g=await je(t,r,o);if(!g.ok)return{ok:!1,reason:g.reason,detail:g.detail};let h=g.headerValue,P=g.option;u=P,c=g.settlementProbe;let l=new Headers(e.headers??void 0);l.set("X-PAYMENT",h);let S=e.signal!=null?AbortSignal.any([e.signal,a.signal]):a.signal,f={method:e.method,headers:l,signal:S};typeof e.body=="string"&&(f.body=e.body),i=!0,clearTimeout(s);let p=o.responseTimeoutMs??12e4;s=setTimeout(()=>a.abort(),p);let y=await fetch(n,f);return y.ok?{ok:!0,paid:!0,response:y,amountPaid:P.amount,network:P.network,txSignature:Tn(y)}:{ok:!1,...await He(y)}}catch(d){if(d instanceof Error&&d.name==="AbortError"){if(!i)return{ok:!1,reason:"timeout"};let g=await dt(c,u.network,o.solanaRpcUrl);return g.confirmed?{ok:!0,paid:!0,response:void 0,amountPaid:u.amount,network:u.network,txSignature:g.txSignature}:{ok:!1,reason:"payment_unconfirmed",detail:g.detail}}return{ok:!1,reason:"error",detail:z(d)}}finally{s!==void 0&&clearTimeout(s)}}};function Tn(n){let e=n.headers.get("x-payment-response")??n.headers.get("X-PAYMENT-RESPONSE");if(e)try{let t=JSON.parse(Buffer.from(e,"base64").toString("utf8")),r=t.transaction??t.txHash??t.transactionHash;return typeof r=="string"?r:void 0}catch{return}}var Ft=j(require("tweetnacl"),1);var W=require("@solana/web3.js"),he=Symbol.for("x402:keypair");async function pt(n){let e;if(typeof n=="string"){let t;try{let r=await import("bs58"),o=r.decode??r.default?.decode;if(!o)throw new Error("decode not found");t=o}catch{throw new Error('The "bs58" package is required for base58 private keys. Install it with: npm install bs58')}try{let r=t(n);e=W.Keypair.fromSecretKey(r)}catch{try{let o=JSON.parse(n);if(Array.isArray(o))e=W.Keypair.fromSecretKey(Uint8Array.from(o));else throw new Error("Invalid private key format")}catch{throw new Error("Invalid private key. Expected base58 string or JSON array of bytes.")}}}else if(Array.isArray(n))e=W.Keypair.fromSecretKey(Uint8Array.from(n));else if(n instanceof Uint8Array)e=W.Keypair.fromSecretKey(n);else throw new Error("Invalid private key type. Expected string, number[], or Uint8Array.");return{publicKey:{toBase58:()=>e.publicKey.toBase58()},signTransaction:async t=>{if(t instanceof W.VersionedTransaction)return t.sign([e]),t;if(t instanceof W.Transaction)return t.sign(e),t;throw new Error("Unknown transaction type")},[he]:e}}function $t(n){if(!n||typeof n!="object")return!1;let e=n;return he in e&&e[he]instanceof W.Keypair&&"publicKey"in e&&"signTransaction"in e}function Je(n){let e=n.evm;if(e&&typeof e.signMessage=="function"&&typeof e.address=="string")return{address:e.address,signMessage:e.signMessage};let t=n.solana;if(t){let r=t[he];if(r&&r.secretKey&&r.publicKey)return{publicKey:r.publicKey,signMessage:async o=>Ft.sign.detached(o,r.secretKey)}}return null}var Lt=[Ut,Kt];async function xt(n){for(let e of Lt)if(await e.parseChallenge(n.clone()))return e;return null}async function In(n){let e=Je(n);if(!e)return fetch;try{return(await import("@x402/extensions/sign-in-with-x")).wrapFetchWithSIWx(fetch,e)}catch(t){return console.warn(`[x402] SIW-X unavailable \u2014 @x402/extensions failed to load; SIW-X merchants will not authenticate. ${z(t)}`),fetch}}async function Rt(n,e,t,r){if(e.body!==void 0&&e.body!==null&&typeof e.body!="string")return{ok:!1,reason:"error",detail:"payAndFetch requires a string body; non-string bodies (Buffer, FormData, URLSearchParams, ReadableStream) cannot be safely re-sent on the paid retry"};let o;try{o=await(await In(t))(n,{...e})}catch(s){return{ok:!1,reason:"error",detail:z(s)}}if(o.status!==402)return{ok:!0,paid:!1,response:o};for(let s of Lt){let a=await s.parseChallenge(o.clone());if(a)return s.pay(n,e,a,t,r)}return{ok:!1,reason:"no_payment_options"}}async function ft(n){let e;try{e=(await import("viem/accounts")).privateKeyToAccount}catch{throw new Error("EVM wallet support requires viem as a peer dependency. Install with: npm install viem")}let t=n.startsWith("0x")?n:`0x${n}`,r=e(t);return{address:r.address,signTypedData:o=>r.signTypedData(o),signTransaction:o=>r.signTransaction({to:o.to,data:o.data,chainId:o.chainId,gas:o.gas,gasPrice:o.gasPrice,nonce:o.nonce,type:"legacy"}),signMessage:o=>r.signMessage({message:o.message})}}function Wt(n){if(!n||typeof n!="object")return!1;let e=n;return"address"in e&&typeof e.address=="string"&&e.address.startsWith("0x")&&"signTypedData"in e&&typeof e.signTypedData=="function"}function gt(n){let e=st(n);if(e?.extensions?.["sponsored-access"])return e.extensions["sponsored-access"]}function qt(n){let e=gt(n);if(e?.recommendations?.length)return e.recommendations}async function Ht(n){let t=gt(n)?.tracking?.impressionBeacon;if(!t)return!1;try{await fetch(t,{method:"GET"})}catch{}return!0}function jt(n,e){let{walletPrivateKey:t,evmPrivateKey:r,preferredNetwork:o,rpcUrls:s,maxAmountAtomic:a,verbose:i,accessPass:c,onPaymentRequired:u}=e;if(!t&&!r)throw new Error("At least one wallet private key is required (walletPrivateKey or evmPrivateKey)");let d={},g=[];t&&g.push(pt(t).then(f=>{d.solana=f}).catch(f=>{console.warn(`[x402] Solana wallet init failed: ${f.message}`)})),r&&g.push(ft(r).then(f=>{d.evm=f}).catch(f=>{console.warn(`[x402] EVM wallet init failed: ${f.message}`)}));let h=g.length>0?Promise.all(g):null,l=at({wallets:d,preferredNetwork:o,rpcUrls:s,maxAmountAtomic:a,fetch:n,verbose:i,accessPass:c,onPaymentRequired:u}),S=l.fetch.bind(l);return h?(async(f,p)=>(await h,S(f,p))):S}function Jt(n){let{budget:e,allowedDomains:t,onPaymentRequired:r,...o}=n,s=parseFloat(e.total),a=e.perRequest?parseFloat(e.perRequest):1/0,i=e.perHour?parseFloat(e.perHour):1/0;if(isNaN(s)||s<=0)throw new Error("budget.total must be a positive number");let c=[],u=0;function d(){return c.reduce((l,S)=>l+S.amount,0)}function g(){let l=Date.now()-36e5;return c.filter(S=>S.timestamp>=l).reduce((S,f)=>S+f.amount,0)}let h=jt(fetch,{...o,onPaymentRequired:async l=>{let S=l.extra?.decimals??6,f=Number(l.amount)/Math.pow(10,S);if(f>a)throw new _("amount_exceeds_max",`$${f.toFixed(4)} exceeds per-request limit of $${a.toFixed(2)}`);let p=d();if(p+f>s)throw new _("amount_exceeds_max",`Budget exceeded. Spent $${p.toFixed(2)} of $${s.toFixed(2)}, payment: $${f.toFixed(4)}`);let y=g();if(y+f>i)throw new _("amount_exceeds_max",`Hourly limit ($${i.toFixed(2)}) exceeded. Spent $${y.toFixed(2)} this hour`);return u=f,r?r(l):!0}});return{fetch:(async(l,S)=>{let f=typeof l=="string"?l:l instanceof URL?l.href:l.url,p="unknown";try{p=new URL(f).hostname}catch{}if(t&&!t.some(A=>p===A||p.endsWith(`.${A}`)))throw new _("payment_rejected",`Domain "${p}" not in allowed domains`);u=0;let y=await h(l,S);if(u>0){let A="unknown",O=y.headers.get("PAYMENT-RESPONSE");if(O)try{A=JSON.parse(atob(O)).network||A}catch{}c.push({amount:u,domain:p,network:A,timestamp:Date.now()}),u=0}return y}),get spent(){return`$${d().toFixed(2)}`},get remaining(){return`$${(s-d()).toFixed(2)}`},get payments(){return c.length},get spentAmount(){return d()},get remainingAmount(){return s-d()},get ledger(){return c},get hourlySpend(){return g()},reset(){c=[]}}}var Et=require("@dexterai/x402-core");0&&(module.exports={BASE_MAINNET,DEXTER_FACILITATOR_URL,KEYPAIR_SYMBOL,SOLANA_MAINNET,USDC_MINT,X402Error,buildV1PaymentHeader,capabilitySearch,createBudgetAccount,createEvmAdapter,createEvmKeypairWallet,createKeypairWallet,createSolanaAdapter,detectStrategy,fireImpressionBeacon,getPaymentReceipt,getSponsoredAccessInfo,getSponsoredRecommendations,isEvmKeypairWallet,isKeypairWallet,payAndFetch,toNetworkRef,toSiwxSigner});
@@ -1,13 +1,13 @@
1
- import { P as PayAndFetchOptions, a as PayResult, b as PaymentStrategy, N as NetworkRef, c as PaymentChallenge, C as ChallengeOption } from '../types-CZHPdVkg.cjs';
2
- import { W as WalletSet, S as SettlementProbe, a as SolanaWallet, E as EvmWallet, A as AccessPassClientConfig, P as PaymentAccept } from '../types-xQu1U4xk.cjs';
3
- export { e as AccessPassInfo, d as AccessPassTier, C as ChainAdapter, X as X402Error, b as createEvmAdapter, c as createSolanaAdapter } from '../types-xQu1U4xk.cjs';
1
+ import { P as PaymentStrategy, a as PayAndFetchOptions, b as PayResult, N as NetworkRef, C as ChallengeOption, c as PaymentChallenge } from '../types-DnhCOjDx.cjs';
2
+ import { W as WalletSet, g as SettlementProbe, c as SolanaWallet, a as EvmWallet, h as AccessPassClientConfig, P as PaymentAccept } from '../types-BvQpNtFw.cjs';
3
+ export { j as AccessPassInfo, k as AccessPassTier, C as ChainAdapter, X as X402Error, d as createEvmAdapter, e as createSolanaAdapter } from '../types-BvQpNtFw.cjs';
4
4
  import { SIWxSigner } from '@x402/extensions/sign-in-with-x';
5
5
  import { Keypair } from '@solana/web3.js';
6
- export { P as PaymentReceipt, f as fireImpressionBeacon, b as getPaymentReceipt, a as getSponsoredAccessInfo, g as getSponsoredRecommendations } from '../x402-client-BQKDeNxq.cjs';
6
+ export { P as PaymentReceipt, f as fireImpressionBeacon, g as getPaymentReceipt, a as getSponsoredAccessInfo, b as getSponsoredRecommendations } from '../x402-client-B8zdDeat.cjs';
7
7
  export { FormattedResource as CapabilityAPI, CapabilitySearchOptions, CapabilitySearchResult, NoMatchReason, capabilitySearch } from '@dexterai/x402-core';
8
- export { B as BASE_MAINNET, D as DEXTER_FACILITATOR_URL, S as SOLANA_MAINNET, U as USDC_MINT } from '../constants-Icc4CXNG.cjs';
8
+ export { B as BASE_MAINNET, D as DEXTER_FACILITATOR_URL, l as SOLANA_MAINNET, n as USDC_MINT } from '../constants-BLvApMMl.cjs';
9
9
  export { SponsoredAccessSettlementInfo, SponsoredRecommendation } from '@dexterai/x402-ads-types';
10
- import '../types-CSuISjXA.cjs';
10
+ import '../types-OHNNM1J2.cjs';
11
11
  import '@dexterai/vault/types';
12
12
 
13
13
  /**
@@ -1,13 +1,13 @@
1
- import { P as PayAndFetchOptions, a as PayResult, b as PaymentStrategy, N as NetworkRef, c as PaymentChallenge, C as ChallengeOption } from '../types-Co5YYhVB.js';
2
- import { W as WalletSet, S as SettlementProbe, a as SolanaWallet, E as EvmWallet, A as AccessPassClientConfig, P as PaymentAccept } from '../types-xQu1U4xk.js';
3
- export { e as AccessPassInfo, d as AccessPassTier, C as ChainAdapter, X as X402Error, b as createEvmAdapter, c as createSolanaAdapter } from '../types-xQu1U4xk.js';
1
+ import { P as PaymentStrategy, a as PayAndFetchOptions, b as PayResult, N as NetworkRef, C as ChallengeOption, c as PaymentChallenge } from '../types-CwLPKV8T.js';
2
+ import { W as WalletSet, g as SettlementProbe, c as SolanaWallet, a as EvmWallet, h as AccessPassClientConfig, P as PaymentAccept } from '../types-BvQpNtFw.js';
3
+ export { j as AccessPassInfo, k as AccessPassTier, C as ChainAdapter, X as X402Error, d as createEvmAdapter, e as createSolanaAdapter } from '../types-BvQpNtFw.js';
4
4
  import { SIWxSigner } from '@x402/extensions/sign-in-with-x';
5
5
  import { Keypair } from '@solana/web3.js';
6
- export { P as PaymentReceipt, f as fireImpressionBeacon, b as getPaymentReceipt, a as getSponsoredAccessInfo, g as getSponsoredRecommendations } from '../x402-client-BQKDeNxq.js';
6
+ export { P as PaymentReceipt, f as fireImpressionBeacon, g as getPaymentReceipt, a as getSponsoredAccessInfo, b as getSponsoredRecommendations } from '../x402-client-B8zdDeat.js';
7
7
  export { FormattedResource as CapabilityAPI, CapabilitySearchOptions, CapabilitySearchResult, NoMatchReason, capabilitySearch } from '@dexterai/x402-core';
8
- export { B as BASE_MAINNET, D as DEXTER_FACILITATOR_URL, S as SOLANA_MAINNET, U as USDC_MINT } from '../constants-Icc4CXNG.js';
8
+ export { B as BASE_MAINNET, D as DEXTER_FACILITATOR_URL, l as SOLANA_MAINNET, n as USDC_MINT } from '../constants-BLvApMMl.js';
9
9
  export { SponsoredAccessSettlementInfo, SponsoredRecommendation } from '@dexterai/x402-ads-types';
10
- import '../types-CSuISjXA.js';
10
+ import '../types-OHNNM1J2.js';
11
11
  import '@dexterai/vault/types';
12
12
 
13
13
  /**