@dexterai/x402 6.0.0-rc.0 → 6.0.0-rc.2
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +2 -2
- package/REFERENCE.md +6 -4
- package/dist/client/index.cjs +1 -1
- package/dist/client/index.d.cts +2 -2
- package/dist/client/index.d.ts +2 -2
- package/dist/client/index.js +1 -1
- package/dist/server/index.cjs +1 -1
- package/dist/server/index.js +1 -1
- package/dist/tab/adapters/solana/index.cjs +1 -1
- package/dist/tab/adapters/solana/index.d.cts +27 -9
- package/dist/tab/adapters/solana/index.d.ts +27 -9
- package/dist/tab/adapters/solana/index.js +1 -1
- package/dist/tab/index.cjs +4 -4
- package/dist/tab/index.d.cts +18 -13
- package/dist/tab/index.d.ts +18 -13
- package/dist/tab/index.js +5 -5
- package/dist/tab/seller/index.cjs +4 -4
- package/dist/tab/seller/index.d.cts +41 -28
- package/dist/tab/seller/index.d.ts +41 -28
- package/dist/tab/seller/index.js +4 -4
- package/dist/{types-C6z04Mxr.d.cts → types-CBQKKFxJ.d.cts} +1 -1
- package/dist/{types-BhXu7cgi.d.ts → types-CHQzNDR6.d.ts} +1 -1
- package/dist/{types-45M9fb5M.d.cts → types-D0IFR4Ro.d.cts} +22 -8
- package/dist/{types-45M9fb5M.d.ts → types-D0IFR4Ro.d.ts} +22 -8
- package/package.json +3 -3
package/README.md
CHANGED
|
@@ -66,7 +66,7 @@ const { result, tab } = await payUrlWithTab(
|
|
|
66
66
|
await tab?.close(); // one on-chain settle pays the seller for everything
|
|
67
67
|
```
|
|
68
68
|
|
|
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
|
|
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 once the exact Solana transaction is confirmed. Buyer and seller each independently verify that transaction, its Dexter-authority-signed voucher-binding Memo, and coherent Vault/SessionAccount state anchored at the transaction slot. Processed-only evidence is rejected; finalized evidence is accepted when already present, but paid requests do not wait for finalization. Session close/revoke remains the finalized terminal step.
|
|
70
70
|
|
|
71
71
|
---
|
|
72
72
|
|
|
@@ -175,7 +175,7 @@ Tabs are Solana. One-shot and batch settlement span Solana and the major EVM cha
|
|
|
175
175
|
## More
|
|
176
176
|
|
|
177
177
|
- **[REFERENCE.md](./REFERENCE.md)** — every export, option table, and example: tabs, one-shot, batch settlement, discovery.
|
|
178
|
-
- **Upgrading?** v6 pins the tested Vault `0.43.
|
|
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).
|
|
179
179
|
- **License** — MIT, see [LICENSE](./LICENSE).
|
|
180
180
|
|
|
181
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 an exact **peer dependency** at `0.43.
|
|
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
|
|
|
@@ -105,7 +105,7 @@ Builds the `vault` adapter the buyer calls drive through.
|
|
|
105
105
|
| `passkeySigner` | `PasskeySignerWithPublicKey` | A `signOperation(operationMessage)` signer (see below) |
|
|
106
106
|
| `feePayer` | `Signer` | Lamport fee payer |
|
|
107
107
|
|
|
108
|
-
The `passkeySigner` uses Vault 0.43.
|
|
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.
|
|
109
109
|
|
|
110
110
|
- **Browser:** vault's `DexterApiBrowserPasskeySigner` — drops in with no shim.
|
|
111
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.
|
|
@@ -134,7 +134,7 @@ const passkeySigner = passkeySignerFromP256Keypair(kp, {
|
|
|
134
134
|
|
|
135
135
|
### FINAL V2 reservation provider
|
|
136
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
|
|
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 at least Solana confirmed commitment. Provider receipt and lifecycle IDs remain provider-owned; they are not aliases for the SDK idempotency key. The 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 requires signature status and transaction visibility at least confirmed, verifies both instructions, then reads coherent Vault/SessionAccount post-state at confirmed with `minContextSlot` set only from the independently fetched transaction slot. Processed-only evidence, `{ armed: true }`, a broadcast-only response, a provider-only voucher assertion, or a receipt that does not match the voucher is rejected. A finalized transaction is accepted as stronger evidence if already observed, but this interactive path never polls or waits for finalization.
|
|
138
138
|
|
|
139
139
|
```ts
|
|
140
140
|
const { result, tab } = await payUrlWithTab(url, init, {
|
|
@@ -179,6 +179,8 @@ app.get('/paid/tick',
|
|
|
179
179
|
|
|
180
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`.
|
|
181
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 independently requires the exact reservation signature and transaction at least confirmed, recomputes the Memo for the presented voucher, verifies the Dexter authority signature, and reads the binding, Vault, and exact SessionAccount together at confirmed with `minContextSlot` equal to the independently fetched transaction slot. That coherent read must prove the active registration, V2 wire, exact frontier, and `currentOutstanding` equal to the voucher's uncovered increment. A cached registration, equal amount, provider assertion, processed-only transaction, or missing proof is not delivery authorization. Finalized evidence is accepted when already present; delivery does not wait for it.
|
|
183
|
+
|
|
182
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.
|
|
183
185
|
|
|
184
186
|
---
|
|
@@ -311,7 +313,7 @@ Endpoints paid through the facilitator are auto-discovered, named, and quality-t
|
|
|
311
313
|
|
|
312
314
|
Two changes, both about packaging and the passkey signer — the payment path itself is unchanged.
|
|
313
315
|
|
|
314
|
-
1. **`@dexterai/vault` became a peer dependency** in v5, rather than a bundled dependency. Current v6 consumers must use the exact tested `0.43.
|
|
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.
|
|
315
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.
|
|
316
318
|
|
|
317
319
|
To pin the old surface, stay on `@dexterai/x402@^4`.
|
package/dist/client/index.cjs
CHANGED
|
@@ -1 +1 @@
|
|
|
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:()=>Fe,X402Error:()=>_,buildV1PaymentHeader:()=>je,capabilitySearch:()=>Rt.capabilitySearch,createBudgetAccount:()=>Jt,createEvmAdapter:()=>ne,createEvmKeypairWallet:()=>ft,createKeypairWallet:()=>pt,createSolanaAdapter:()=>F,detectStrategy:()=>xt,fireImpressionBeacon:()=>Ht,getPaymentReceipt:()=>st,getSponsoredAccessInfo:()=>gt,getSponsoredRecommendations:()=>qt,isEvmKeypairWallet:()=>Wt,isKeypairWallet:()=>$t,payAndFetch:()=>Et,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",we="eip155:42161",ve="eip155:137",xe="eip155:10",Ee="eip155:43114",Re="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=we,ke=ve,Oe=xe,Ve=Ee,Be=Re,De=ie,Ue=ce,Me=le,Ke=ue,$e=me,Le=_e,Fe="EPjFWdd5AufqSSqeM2qN1xzybapC8G4wEGGkZwyTDt1v",Pt="4zMMC9srt5Ri5X14GAgXhaHii3GnPAEERYPJgZJDncDU",Tt="0x833589fCD6eDb6E08f4c7C32D4f71b54bdA02913",yt="0x55d398326f99059fF775485246999027B3197955",Qe="0x8AC76a51cc950d9822D68b83fE1Ad97B32Cd580d",At="0x5fc5360D0400a0Fd4f2af552ADD042D716F1d168",et={[Re]:Qe,[ae]:Tt,[Se]:"0x036CbD53842c5426634e7929541eC2318f3dCF7e",[we]:"0xaf88d065e77c8cC2239327C5EDb3A432268e5831",[ve]:"0x3c499c542cEF5E3811e1192ce70d8cC03d5c3359",[xe]:"0x0b2C639c533813f4Aa9D7837CAf62653d097Ff85",[Ee]:"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={[Re]:56,[ae]:8453,[Se]:84532,[we]:42161,[ve]:137,[xe]:10,[Ee]: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={[Re]:"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",[ve]:"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",[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 F(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,Le,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[Le]: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===Fe||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",[we]:"Arbitrum",[ve]:"Polygon",[xe]:"Optimism",[Ee]:"Avalanche",[Re]:"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=[F({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 E;for(let w=0;w<=h;w++)try{let R=await i(b,x);if(R.status>=502&&R.status<=504&&w<h){l(`Retry ${w+1}/${h}: server returned ${R.status}`),await new Promise(T=>setTimeout(T,P*Math.pow(2,w)));continue}return R}catch(R){E=R,w<h&&(l(`Retry ${w+1}/${h}: ${R instanceof Error?R.message:"network error"}`),await new Promise(T=>setTimeout(T,P*Math.pow(2,w))))}throw E}let f=new Map;function p(b){try{let x=new URL(b).host,E=f.get(x);if(E&&E.expiresAt>Date.now()/1e3+10)return E.jwt;E&&f.delete(x)}catch{}return null}function y(b,x){try{let E=new URL(b).host,w=x.split(".");if(w.length===3){let R=JSON.parse(atob(w[1].replace(/-/g,"+").replace(/_/g,"/"))),T=Math.floor(Date.now()/1e3),I=T+86400,$=Math.min(typeof R.exp=="number"?R.exp:T,I);f.set(E,{jwt:x,expiresAt:$}),l("Access pass cached for",E,"| 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 E of b){let w=E.scheme??"exact";if(w!=="exact"&&w!=="exact-approval")continue;let R=e.find(I=>I.canHandle(E.network));if(!R)continue;let T;R.name==="Solana"?T=A.solana:R.name==="EVM"&&(T=A.evm),T&&R.isConnected(T)&&x.push({accept:E,adapter:R,wallet:T})}if(x.length===0)return null;if(o){let E=x.find(w=>w.accept.network===o);if(E)return E}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,E,w,R){let T="";if(u?.preferTier&&w.tiers){let m=w.tiers.find(v=>v.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&&w.ratePerHour)T=`duration=${u.preferDuration}`;else if(w.tiers&&w.tiers.length>0){let m=w.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?R.includes("?")?`${R}&${T}`:`${R}?${T}`:R;l("Purchasing access pass:",T||"default tier");let $=E.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),v=Number(Pe)/Math.pow(10,G);if(m<v){let ht=D(N.network,H.name);throw new _("insufficient_balance",`Insufficient balance for access pass on ${ht}. Have $${m.toFixed(4)}, need $${v.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 v=new URL(m.url,oe);["http:","https:"].includes(v.protocol)&&(be={...m,url:v.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 L=se.headers.get("ACCESS-PASS");return L&&(y(R,L),l("Access pass purchased and cached")),se}async function re(b,x){let E=b;if(l("Making request:",E),u){let m=p(E);if(m){l("Using cached access pass");let v=await i(b,{...x,headers:{...x?.headers||{},Authorization:`Bearer ${m}`}});if(v.status!==401&&v.status!==402)return v;l("Cached pass rejected (status",v.status,"), purchasing new pass");try{f.delete(new URL(E).host)}catch{}}}let w=await S(b,x);if(w.status!==402)return w;l("Received 402 Payment Required");let R=w.headers.get("X-ACCESS-PASS-TIERS");if(u&&R){l("Server offers access passes, purchasing...");try{let m=JSON.parse(atob(R)),v=await q(b,x,w,m,E);if(v)return v}catch(m){l("Access pass purchase failed, falling back to per-request payment:",m)}}let T=w.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 $=w.headers.get("X-Quote-Hash");$&&l("Quote hash received:",$);let U=O(I.accepts);if(!U){let m=I.accepts.map(v=>v.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),v=Number(G)/Math.pow(10,ye);if(m<v){let ht=D(V.network,N.name);throw new _("insufficient_balance",`Insufficient balance on ${ht}. Have $${m.toFixed(4)}, need $${v.toFixed(4)}`)}l(`Balance OK: $${m.toFixed(4)} >= $${v.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 v=new URL(m.url,Ae).toString();v!==m.url&&(l("Resolved relative resource URL:",m.url,"\u2192",v),oe={...m,url:v})}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 v=await ee.clone().json();m=String(v.error||v.message||JSON.stringify(v)),l("Rejection reason:",m)}catch{}throw new _("payment_rejected",`Payment was rejected by the server: ${m}`)}let se=ee.headers.get("PAYMENT-RESPONSE"),L;if(se)try{L=JSON.parse(atob(se))}catch{}return L??={},L.amountAtomic=G,L.assetDecimals=ye,Ct.set(ee,L),L.extensions&&l("Settlement extensions:",Object.keys(L.extensions).join(", ")),ee}async function K(b,x){let[E,w]=await sn(b,x);return re(E,w)}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 wt=require("@dexterai/vault/instructions"),fn=require("@dexterai/vault/precompile"),ct=require("@dexterai/vault/constants");function kt(n){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)}),"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=F(),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 vt(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=vt(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 wn(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 wn(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=vt(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 vn={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 En(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:vn,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 Rn(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 Rn(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 En(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 F().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 Lt=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=>Lt.sign.detached(o,r.secretKey)}}return null}var Ft=[Ut,Kt];async function xt(n){for(let e of Ft)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 Et(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 Ft){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 Rt=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});
|
package/dist/client/index.d.cts
CHANGED
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import { P as PaymentStrategy, a as PayAndFetchOptions, b as PayResult, N as NetworkRef, C as ChallengeOption, c as PaymentChallenge } from '../types-
|
|
1
|
+
import { P as PaymentStrategy, a as PayAndFetchOptions, b as PayResult, N as NetworkRef, C as ChallengeOption, c as PaymentChallenge } from '../types-CBQKKFxJ.cjs';
|
|
2
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
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';
|
|
@@ -7,7 +7,7 @@ export { P as PaymentReceipt, f as fireImpressionBeacon, g as getPaymentReceipt,
|
|
|
7
7
|
export { FormattedResource as CapabilityAPI, CapabilitySearchOptions, CapabilitySearchResult, NoMatchReason, capabilitySearch } from '@dexterai/x402-core';
|
|
8
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-
|
|
10
|
+
import '../types-D0IFR4Ro.cjs';
|
|
11
11
|
import '@dexterai/vault/types';
|
|
12
12
|
|
|
13
13
|
/**
|
package/dist/client/index.d.ts
CHANGED
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import { P as PaymentStrategy, a as PayAndFetchOptions, b as PayResult, N as NetworkRef, C as ChallengeOption, c as PaymentChallenge } from '../types-
|
|
1
|
+
import { P as PaymentStrategy, a as PayAndFetchOptions, b as PayResult, N as NetworkRef, C as ChallengeOption, c as PaymentChallenge } from '../types-CHQzNDR6.js';
|
|
2
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
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';
|
|
@@ -7,7 +7,7 @@ export { P as PaymentReceipt, f as fireImpressionBeacon, g as getPaymentReceipt,
|
|
|
7
7
|
export { FormattedResource as CapabilityAPI, CapabilitySearchOptions, CapabilitySearchResult, NoMatchReason, capabilitySearch } from '@dexterai/x402-core';
|
|
8
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-
|
|
10
|
+
import '../types-D0IFR4Ro.js';
|
|
11
11
|
import '@dexterai/vault/types';
|
|
12
12
|
|
|
13
13
|
/**
|