@dexterai/x402 3.18.1 → 4.1.0

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 CHANGED
@@ -88,6 +88,8 @@ if (resolved.kind === 'terms') {
88
88
 
89
89
  ## Accept tabs on your API (seller)
90
90
 
91
+ You get paid for what you serve. As an agent spends against its tab, 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.
92
+
91
93
  `tabOrExactMiddleware` is the recommended default: one middleware that advertises a tab and a one-shot price in a single 402 challenge, so agents pay by tab and one-shot callers pay exact, at the same price.
92
94
 
93
95
  ```ts
@@ -100,9 +102,9 @@ app.get('/paid/tick',
100
102
  if ((req as X402Request).x402) { res.json({ data: '...', paidVia: 'exact' }); return; } // exact rail
101
103
  const tab = requireTab(req); // tab rail
102
104
  const meter = openSse(res, { tab, perUnit: '0.01' });
103
- await meter.charge(1);
105
+ await meter.charge(1); // demand a fresh voucher; throws if the cap is exceeded
104
106
  meter.send(JSON.stringify({ data: '...' }));
105
- await meter.end();
107
+ await meter.end(); // ALWAYS await — persists the final delivered amount
106
108
  });
107
109
  ```
108
110
 
@@ -308,9 +310,21 @@ State auto-persists and resumes with `resumeBatchChannel({ wallet, network, salt
308
310
 
309
311
  `bazaarExtension()` plus `declareDiscoveryExtension(config)` attach a spec-compliant `extensions.bazaar` block to a route's 402; extensions are opt-in and failure-isolated, so the payment path is never affected. `sponsoredAccess` injects `_x402_sponsored` into responses; read it with `getSponsoredRecommendations(response)`. Campaign creation is x402-gated at `x402ads.io`.
310
312
 
311
- ### Legacy
313
+ ### Removed in v4.0.0 (migration)
314
+
315
+ The v1-era helpers were removed in `4.0.0`. The payment engine is unchanged — the canonical entrypoints have done their jobs since 3.x:
316
+
317
+ | Removed | Use instead |
318
+ | --- | --- |
319
+ | `createX402Client(...).fetch(url)` | `payAndFetch(url, init, wallets)` (client) |
320
+ | `wrapFetch(fetch, opts)` | `payAndFetch` (client) — or pass your `WalletSet` directly |
321
+ | `x402AccessPass`, `x402BrowserSupport` | `x402Middleware` (server) |
322
+ | `createDynamicPricing`, `formatPricing` | compute the price per request in your handler, pass it to `x402Middleware` |
323
+ | `createTokenPricing`, `countTokens`, `MODEL_REGISTRY` + model getters | gone — these wrapped a hardcoded Jan-2026 OpenAI snapshot that goes stale; price requests with your model provider's live API and pass the amount to `x402Middleware` |
324
+ | `stripePayTo` | a `PayToProvider` map on `x402Middleware` |
325
+ | `useAccessPass` (react) | `useX402Payment` (react) |
312
326
 
313
- v1-era helpers (`wrapFetch`, `createX402Client`, `x402AccessPass`, `createDynamicPricing`, `stripePayTo`, `x402BrowserSupport`) ship `@deprecated` with JSDoc migration targets and keep working. None will be removed in 3.x. New code should use `payAndFetch` and `x402Middleware`.
327
+ `payAndFetch` speaks both x402 v1 and v2 and returns a discriminated `PayResult`, so it covers everything the old clients did. **EVM one-shot pay-per-call is unchanged** `payAndFetch` is the EVM path until Tabs reaches EVM. To pin the old surface, stay on `@dexterai/x402@^3`.
314
328
 
315
329
  ---
316
330
 
@@ -320,7 +334,7 @@ v1-era helpers (`wrapFetch`, `createX402Client`, `x402AccessPass`, `createDynami
320
334
  npm run build # ESM + CJS
321
335
  npm run dev # Watch mode
322
336
  npm run typecheck
323
- npm test # 273 vitest tests
337
+ npm test # 359 vitest tests
324
338
  ```
325
339
 
326
340
  ## License
@@ -1 +1 @@
1
- "use strict";var Ft=Object.create;var qe=Object.defineProperty;var qt=Object.getOwnPropertyDescriptor;var Ht=Object.getOwnPropertyNames;var jt=Object.getPrototypeOf,Jt=Object.prototype.hasOwnProperty;var yt=(n,e)=>()=>(n&&(e=n(n=0)),e);var ht=(n,e)=>{for(var t in e)qe(n,t,{get:e[t],enumerable:!0})},At=(n,e,t,r)=>{if(e&&typeof e=="object"||typeof e=="function")for(let o of Ht(e))!Jt.call(n,o)&&o!==t&&qe(n,o,{get:()=>e[o],enumerable:!(r=qt(e,o))||r.enumerable});return n};var Z=(n,e,t)=>(t=n!=null?Ft(jt(n)):{},At(e||!n||!n.__esModule?qe(t,"default",{value:n,enumerable:!0}):t,n)),Xt=n=>At(qe({},"__esModule",{value:!0}),n);function yn(n){if(n.length>=255)throw new TypeError("Alphabet too long");let e=new Uint8Array(256);for(let s=0;s<e.length;s++)e[s]=255;for(let s=0;s<n.length;s++){let p=n.charAt(s),f=p.charCodeAt(0);if(e[f]!==255)throw new TypeError(p+" is ambiguous");e[f]=s}let t=n.length,r=n.charAt(0),o=Math.log(t)/Math.log(256),a=Math.log(256)/Math.log(t);function i(s){if(s instanceof Uint8Array||(ArrayBuffer.isView(s)?s=new Uint8Array(s.buffer,s.byteOffset,s.byteLength):Array.isArray(s)&&(s=Uint8Array.from(s))),!(s instanceof Uint8Array))throw new TypeError("Expected Uint8Array");if(s.length===0)return"";let p=0,f=0,g=0,w=s.length;for(;g!==w&&s[g]===0;)g++,p++;let u=(w-g)*a+1>>>0,A=new Uint8Array(u);for(;g!==w;){let y=s[g],S=0;for(let P=u-1;(y!==0||S<f)&&P!==-1;P--,S++)y+=256*A[P]>>>0,A[P]=y%t>>>0,y=y/t>>>0;if(y!==0)throw new Error("Non-zero carry");f=S,g++}let m=u-f;for(;m!==u&&A[m]===0;)m++;let h=r.repeat(p);for(;m<u;++m)h+=n.charAt(A[m]);return h}function c(s){if(typeof s!="string")throw new TypeError("Expected String");if(s.length===0)return new Uint8Array;let p=0,f=0,g=0;for(;s[p]===r;)f++,p++;let w=(s.length-p)*o+1>>>0,u=new Uint8Array(w);for(;p<s.length;){let y=s.charCodeAt(p);if(y>255)return;let S=e[y];if(S===255)return;let P=0;for(let O=w-1;(S!==0||P<g)&&O!==-1;O--,P++)S+=t*u[O]>>>0,u[O]=S%256>>>0,S=S/256>>>0;if(S!==0)throw new Error("Non-zero carry");g=P,p++}let A=w-g;for(;A!==w&&u[A]===0;)A++;let m=new Uint8Array(f+(w-A)),h=f;for(;A!==w;)m[h++]=u[A++];return m}function l(s){let p=c(s);if(p)return p;throw new Error("Non-base"+t+" character")}return{encode:i,decodeUnsafe:c,decode:l}}var kt,Ot=yt(()=>{"use strict";kt=yn});var Ut={};ht(Ut,{default:()=>An});var hn,An,Bt=yt(()=>{"use strict";Ot();hn="123456789ABCDEFGHJKLMNPQRSTUVWXYZabcdefghijkmnopqrstuvwxyz",An=kt(hn)});var wn={};ht(wn,{BASE_MAINNET:()=>j,DEXTER_FACILITATOR_URL:()=>ut,KEYPAIR_SYMBOL:()=>ue,SOLANA_MAINNET:()=>H,USDC_MINT:()=>De,X402Error:()=>C,buildV1PaymentHeader:()=>Le,capabilitySearch:()=>gt.capabilitySearch,createBudgetAccount:()=>Vt,createEvmAdapter:()=>te,createEvmKeypairWallet:()=>at,createKeypairWallet:()=>ot,createSolanaAdapter:()=>L,createX402Client:()=>Ee,detectStrategy:()=>dt,fireImpressionBeacon:()=>Lt,getPaymentReceipt:()=>Ze,getSponsoredAccessInfo:()=>st,getSponsoredRecommendations:()=>Wt,isEvmKeypairWallet:()=>Kt,isKeypairWallet:()=>Dt,payAndFetch:()=>ft,toNetworkRef:()=>le,toSiwxSigner:()=>Ve,wrapFetch:()=>it});module.exports=Xt(wn);var Pe="solana:5eykt4UsFv8P8NJdTREpY1vzqKqZKvdp",He="solana:EtWTRABZaYq6iMfeYKouRu166VU2xqa1",je="solana:4uhcVJyU9pJkvQyS88uRDiswHXSCkY3z",H=Pe,Re=He,ve=je,ae="eip155:8453",fe="eip155:84532",ge="eip155:42161",ye="eip155:137",he="eip155:10",Ae="eip155:43114",Se="eip155:56",we="eip155:1187947933",be="eip155:324705682",xe="eip155:1",j=ae,Je=fe,Ce=ge,_e=ye,Ie=he,Ne=Ae,ke=Se,Oe=we,Ue=be,Be=xe,De="EPjFWdd5AufqSSqeM2qN1xzybapC8G4wEGGkZwyTDt1v",St="4zMMC9srt5Ri5X14GAgXhaHii3GnPAEERYPJgZJDncDU",wt="0x833589fCD6eDb6E08f4c7C32D4f71b54bdA02913",lt="0x55d398326f99059fF775485246999027B3197955",Xe="0x8AC76a51cc950d9822D68b83fE1Ad97B32Cd580d",ze={[Se]:Xe,[ae]:wt,[fe]:"0x036CbD53842c5426634e7929541eC2318f3dCF7e",[ge]:"0xaf88d065e77c8cC2239327C5EDb3A432268e5831",[ye]:"0x3c499c542cEF5E3811e1192ce70d8cC03d5c3359",[he]:"0x0b2C639c533813f4Aa9D7837CAf62653d097Ff85",[Ae]:"0xB97EF9Ef8734C71904D8002F8b6Bc66Dd9c48a6E",[we]:"0x85889c8c714505E0c94b30fcfcF64fE3Ac8FCb20",[be]:"0x2e08028E3C4c2356572E096d8EF835cD5C6030bD",[xe]:"0xA0b86991c6218b36c1d19D4a2e9Eb0cE3606eB48"},Ye={[lt]:{symbol:"USDT",decimals:18},[Xe]:{symbol:"USDC",decimals:18}};var ee="0x000000000022D473030F116dDEE9F6B43aC78BA3",Me="0x402085c248EeA27D92E8b30b2C58ed07f9E20001",$e={[Se]:56,[ae]:8453,[fe]:84532,[ge]:42161,[ye]:137,[he]:10,[Ae]:43114,[we]:1187947933,[be]:324705682,[xe]:1},se={[Pe]:"https://api.dexter.cash/api/solana/rpc",[He]:"https://api.devnet.solana.com",[je]:"https://api.testnet.solana.com"},D={[Se]:"https://api.dexter.cash/api/evm/bsc/rpc",[ae]:"https://api.dexter.cash/api/base/rpc",[fe]:"https://sepolia.base.org",[ge]:"https://api.dexter.cash/api/evm/arbitrum/rpc",[ye]:"https://api.dexter.cash/api/evm/polygon/rpc",[he]:"https://api.dexter.cash/api/evm/optimism/rpc",[Ae]:"https://api.dexter.cash/api/evm/avalanche/rpc",[we]:"https://skale-base.skalenodes.com/v1/base",[be]:"https://base-sepolia-testnet.skalenodes.com/v1/jubilant-horrible-ancha",[xe]:"https://eth.llamarpc.com"},ut="https://x402.dexter.cash";var C=class n extends Error{code;details;constructor(e,t,r){super(t),this.name="X402Error",this.code=e,this.details=r,Object.setPrototypeOf(this,n.prototype)}};var k=require("@solana/web3.js"),U=require("@solana/spl-token");var zt=12e3,Yt=1;function ie(n){if(!n||typeof n!="object")return!1;let e=n;return"publicKey"in e&&"signTransaction"in e&&typeof e.signTransaction=="function"}var Ge=class{name="Solana";networks=[H,Re,ve];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]:se[e]?se[e]:e==="solana"?se[H]:e==="solana-devnet"?se[Re]:e==="solana-testnet"?se[ve]:se[H]}getAddress(e){return ie(e)?e.publicKey?.toBase58()??null:null}isConnected(e){return ie(e)?e.publicKey!==null:!1}async getBalance(e,t,r){if(!ie(t)||!t.publicKey)return 0;let o=r||this.getDefaultRpcUrl(e.network),a=new k.Connection(o,"confirmed"),i=new k.PublicKey(t.publicKey.toBase58()),c=new k.PublicKey(e.asset);try{let s=(await a.getAccountInfo(c,"confirmed"))?.owner.toBase58()===U.TOKEN_2022_PROGRAM_ID.toBase58()?U.TOKEN_2022_PROGRAM_ID:U.TOKEN_PROGRAM_ID,p=await(0,U.getAssociatedTokenAddress)(c,i,!1,s),f=await(0,U.getAccount)(a,p,void 0,s),g=e.extra?.decimals??6;return Number(f.amount)/Math.pow(10,g)}catch(l){if(l&&typeof l=="object"&&"name"in l&&(l.name==="TokenAccountNotFoundError"||l.name==="TokenInvalidAccountOwnerError"))return 0;throw l}}async buildTransaction(e,t,r){if(!ie(t))throw new Error("Invalid Solana wallet");if(!t.publicKey)throw new Error("Wallet not connected");let o=r||this.getDefaultRpcUrl(e.network),a=new k.Connection(o,"confirmed"),i=new k.PublicKey(t.publicKey.toBase58()),{payTo:c,asset:l,extra:s}=e,p=e.amount??e.maxAmountRequired;if(!p)throw new Error("Missing amount in payment requirements");if(!s?.feePayer)throw new Error("Missing feePayer in payment requirements");let f=new k.PublicKey(s.feePayer),g=new k.PublicKey(l),w=new k.PublicKey(c);this.log("Building transaction:",{from:i.toBase58(),to:c,amount:p,asset:l,feePayer:s.feePayer});let u=[];u.push(k.ComputeBudgetProgram.setComputeUnitLimit({units:zt})),u.push(k.ComputeBudgetProgram.setComputeUnitPrice({microLamports:Yt}));let A=await a.getAccountInfo(g,"confirmed");if(!A)throw new Error(`Token mint ${l} not found`);let m=A.owner.toBase58()===U.TOKEN_2022_PROGRAM_ID.toBase58()?U.TOKEN_2022_PROGRAM_ID:U.TOKEN_PROGRAM_ID,h=await(0,U.getMint)(a,g,void 0,m);typeof s?.decimals=="number"&&h.decimals!==s.decimals&&this.log(`Decimals mismatch: requirements say ${s.decimals}, mint says ${h.decimals}`);let y=await(0,U.getAssociatedTokenAddress)(g,i,!1,m),S=await(0,U.getAssociatedTokenAddress)(g,w,!0,m);if(!await a.getAccountInfo(y,"confirmed"))throw new Error(`No token account found for ${l}. Please ensure you have USDC in your wallet.`);if(!await a.getAccountInfo(S,"confirmed"))throw new Error(`Seller token account not found. The seller (${c}) must have a USDC account.`);let X=BigInt(p);u.push((0,U.createTransferCheckedInstruction)(y,g,S,i,X,h.decimals,[],m));let{blockhash:F}=await a.getLatestBlockhash("confirmed"),ne=new k.TransactionMessage({payerKey:f,recentBlockhash:F,instructions:u}).compileToV0Message(),$=new k.VersionedTransaction(ne),b=await t.signTransaction($);return this.log("Transaction signed successfully"),{serialized:Buffer.from(b.serialize()).toString("base64"),settlementProbe:{kind:"solana",sourceAta:y.toBase58(),destinationAta:S.toBase58(),asset:l,amount:p,blockhash:F}}}async confirmSettlement(e,t){if(e.kind!=="solana")throw new Error(`SolanaAdapter.confirmSettlement cannot handle probe kind "${e.kind}"`);let r=new k.Connection(t,"confirmed"),o=new k.PublicKey(e.destinationAta),a=await r.getSignaturesForAddress(o,{limit:25});if(a.length===0)return{settled:!1};let i=BigInt(e.amount);for(let c of a){if(c.err)continue;let l=await r.getTransaction(c.signature,{commitment:"confirmed",maxSupportedTransactionVersion:0});if(!l?.meta)continue;let s=l.transaction.message.getAccountKeys().keySegments().flat(),p=l.meta.preTokenBalances??[],f=l.meta.postTokenBalances??[];for(let g of f){if(g.mint!==e.asset)continue;let w=s[g.accountIndex];if(!w||!w.equals(o))continue;let u=p.find(h=>h.accountIndex===g.accountIndex),A=BigInt(u?.uiTokenAmount.amount??"0");if(BigInt(g.uiTokenAmount.amount??"0")-A===i)return{settled:!0,txSignature:c.signature}}}return{settled:!1}}};function L(n){return new Ge(n)}var Gt={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"}]},bt=BigInt("0xffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff");function ce(n){if(!n||typeof n!="object")return!1;let e=n;return"address"in e&&typeof e.address=="string"&&e.address.startsWith("0x")}var Qe=class{name="EVM";networks=[ke,j,Je,Be,Ce,_e,Ie,Ne,Oe,Ue];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==="skale-base"||e==="skale-base-sepolia"||e.startsWith("eip155:"))}getDefaultRpcUrl(e){return this.config.rpcUrls?.[e]?this.config.rpcUrls[e]:D[e]?D[e]:e==="base"?D[j]:e==="bsc"?D[ke]:e==="ethereum"?D[Be]:e==="arbitrum"?D[Ce]:e==="polygon"?D[_e]:e==="optimism"?D[Ie]:e==="avalanche"?D[Ne]:e==="skale-base"?D[Oe]:e==="skale-base-sepolia"?D[Ue]:D[j]}getAddress(e){return ce(e)?e.address:null}isConnected(e){return ce(e)?!!e.address:!1}getChainId(e){if($e[e])return $e[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:8453}async getBalance(e,t,r){if(!ce(t)||!t.address)return 0;let o=r||this.getDefaultRpcUrl(e.network);try{let a=this.encodeBalanceOf(t.address),i=await fetch(o,{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({jsonrpc:"2.0",id:1,method:"eth_call",params:[{to:e.asset,data:a},"latest"]})});if(!i.ok)throw new Error(`RPC request failed: ${i.status}`);let c=await i.json();if(c.error)throw new Error(`RPC error: ${JSON.stringify(c.error)}`);if(!c.result||c.result==="0x")return 0;let l=BigInt(c.result),s=e.extra?.decimals??6;return Number(l)/Math.pow(10,s)}catch(a){throw a}}encodeBalanceOf(e){let t="0x70a08231",r=e.slice(2).toLowerCase().padStart(64,"0");return t+r}async confirmSettlement(e,t){if(e.kind==="eip3009"){let r="0xe94a0102",o=e.from.slice(2).toLowerCase().padStart(64,"0"),a=e.nonce.slice(2).toLowerCase().padStart(64,"0"),i=r+o+a,c=await this.ethCall(t,e.asset,i);return{settled:BigInt(c)!==0n}}if(e.kind==="permit2"){let r="0x4fe02b44",o=BigInt(e.nonce),a=o>>8n,i=o&0xffn,c=e.from.slice(2).toLowerCase().padStart(64,"0"),l=a.toString(16).padStart(64,"0"),s=r+c+l,p=await this.ethCall(t,ee,s);return{settled:(BigInt(p)>>i&1n)===1n}}throw new Error(`EvmAdapter.confirmSettlement cannot handle probe kind "${e.kind}"`)}async ethCall(e,t,r){let o=await fetch(e,{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({jsonrpc:"2.0",id:1,method:"eth_call",params:[{to:t,data:r},"latest"]})});if(!o.ok)throw new Error(`RPC request failed: ${o.status}`);let a=await o.json();if(a.error)throw new Error(`RPC error: ${JSON.stringify(a.error)}`);if(!a.result||a.result==="0x")throw new Error("RPC returned an empty result");return a.result}async buildTransaction(e,t,r){if(!ce(t))throw new Error("Invalid EVM wallet");if(!t.address)throw new Error("Wallet not connected");if(e.scheme==="exact-approval")return this.buildApprovalTransaction(e,t,r);if(e.extra?.assetTransferMethod==="permit2")return this.buildPermit2Transaction(e,t,r);let{payTo:o,asset:a,extra:i}=e,c=e.amount??e.maxAmountRequired;if(!c)throw new Error("Missing amount in payment requirements");this.log("Building EVM transaction:",{from:t.address,to:o,amount:c,asset:a,network:e.network});let l=this.getChainId(e.network),s={name:i?.name??"USD Coin",version:i?.version??"2",chainId:BigInt(l),verifyingContract:a},p={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"}]},f=new Uint8Array(32);(globalThis.crypto??(await import("crypto")).webcrypto).getRandomValues(f);let g="0x"+[...f].map(y=>y.toString(16).padStart(2,"0")).join(""),w=Math.floor(Date.now()/1e3),u={from:t.address,to:o,value:c,validAfter:String(w-600),validBefore:String(w+(e.maxTimeoutSeconds||60)),nonce:g},A={from:t.address,to:o,value:BigInt(c),validAfter:BigInt(w-600),validBefore:BigInt(w+(e.maxTimeoutSeconds||60)),nonce:g};if(!t.signTypedData)throw new Error("Wallet does not support signTypedData (EIP-712)");let m=await t.signTypedData({domain:s,types:p,primaryType:"TransferWithAuthorization",message:A});return this.log("EIP-712 signature obtained"),{serialized:JSON.stringify({authorization:u,signature:m}),signature:m,settlementProbe:{kind:"eip3009",from:t.address,nonce:g,asset:a,chainId:l}}}async buildApprovalTransaction(e,t,r){let{payTo:o,asset:a,extra:i}=e,c=e.amount??e.maxAmountRequired;if(!c)throw new Error("Missing amount in payment requirements");let l=i?.facilitatorContract;if(!l)throw new Error("exact-approval scheme requires extra.facilitatorContract from the facilitator. The /supported endpoint should provide this.");if(!t.signTypedData)throw new Error("Wallet does not support signTypedData (EIP-712)");this.log("Building approval-based transaction:",{from:t.address,to:o,amount:c,asset:a,network:e.network,facilitatorContract:l});let s=r||this.getDefaultRpcUrl(e.network),p=i?.fee??"0",f=BigInt(c)+BigInt(p),g=await this.readAllowance(s,a,t.address,l);if(g<f){if(!t.sendTransaction)throw new Error("BSC payments require a wallet that supports sendTransaction for the one-time token approval. Use createEvmKeypairWallet() or a browser wallet with transaction support.");let $=this.calculateApprovalAmount(c,p,i?.approvalStrategy);this.log(`Approving ${$} for ${l} (current allowance: ${g})`);let b=await t.sendTransaction({to:a,data:this.encodeApprove(l,$),value:0n});this.log(`Approval tx sent: ${b}`),await this.waitForReceipt(s,b),this.log("Approval confirmed")}else this.log("Sufficient allowance, skipping approval");let w=new Uint8Array(16);(globalThis.crypto??(await import("crypto")).webcrypto).getRandomValues(w);let u=[...w].reduce(($,b)=>$*256n+BigInt(b),0n).toString(),A=new Uint8Array(32);(globalThis.crypto??(await import("crypto")).webcrypto).getRandomValues(A);let m="0x"+[...A].map($=>$.toString(16).padStart(2,"0")).join(""),y=Math.floor(Date.now()/1e3)+(e.maxTimeoutSeconds||300),S=i?.eip712Domain,P=S?{name:S.name,version:S.version,chainId:BigInt(S.chainId),verifyingContract:S.verifyingContract}:{name:"DexterBSCFacilitator",version:"1",chainId:BigInt(this.getChainId(e.network)),verifyingContract:l},O=i?.eip712Types??{Payment:[{name:"from",type:"address"},{name:"to",type:"address"},{name:"token",type:"address"},{name:"amount",type:"uint256"},{name:"fee",type:"uint256"},{name:"nonce",type:"uint256"},{name:"deadline",type:"uint256"},{name:"paymentId",type:"bytes32"}]},X={from:t.address,to:o,token:a,amount:BigInt(c),fee:BigInt(p),nonce:BigInt(u),deadline:BigInt(y),paymentId:m},F=await t.signTypedData({domain:P,types:O,primaryType:"Payment",message:X});this.log("EIP-712 Payment signature obtained");let ne={from:t.address,to:o,token:a,amount:c,fee:p,nonce:u,deadline:y,paymentId:m,signature:F};return{serialized:JSON.stringify(ne),signature:F}}async buildPermit2Transaction(e,t,r){let{payTo:o,asset:a}=e,i=e.amount??e.maxAmountRequired;if(!i)throw new Error("Missing amount in payment requirements");if(!t.signTypedData)throw new Error("Wallet does not support signTypedData (EIP-712)");this.log("Building Permit2 transaction:",{from:t.address,to:o,amount:i,asset:a,network:e.network});let c=r||this.getDefaultRpcUrl(e.network),l=await this.readAllowance(c,a,t.address,ee),s;if(l<BigInt(i)){let P=this.encodeApprove(ee,bt);if(t.signTransaction){this.log(`Signing Permit2 approval for relay (current allowance: ${l})`);let O=this.getChainId(e.network),X=await this.readGasPrice(c),F=await this.readNonce(c,t.address),ne=await t.signTransaction({to:a,data:P,chainId:O,gas:50000n,gasPrice:X,nonce:F});s={erc20ApprovalGasSponsoring:{info:{from:t.address,asset:a,spender:ee,amount:bt.toString(),signedTransaction:ne,version:"1"}}},this.log("Permit2 approval signed for facilitator relay")}else if(t.sendTransaction){this.log(`Approving Permit2 directly (current allowance: ${l})`);let O=await t.sendTransaction({to:a,data:P,value:0n});this.log(`Permit2 approval tx sent: ${O}`),await this.waitForReceipt(c,O),this.log("Permit2 approval confirmed")}else throw new Error("Permit2 payments require a wallet that supports signTransaction or sendTransaction for the one-time Permit2 approval. Use createEvmKeypairWallet() or a browser wallet with transaction support.")}else this.log("Sufficient Permit2 allowance, skipping approval");let p=new Uint8Array(32);(globalThis.crypto??(await import("crypto")).webcrypto).getRandomValues(p);let f=[...p].reduce((P,O)=>P*256n+BigInt(O),0n),g=Math.floor(Date.now()/1e3),w=g-600,u=g+(e.maxTimeoutSeconds||300),A=this.getChainId(e.network),m={name:"Permit2",chainId:BigInt(A),verifyingContract:ee},h={permitted:{token:a,amount:BigInt(i)},spender:Me,nonce:f,deadline:BigInt(u),witness:{to:o,validAfter:BigInt(w)}},y=await t.signTypedData({domain:m,types:Gt,primaryType:"PermitWitnessTransferFrom",message:h});this.log("Permit2 PermitWitnessTransferFrom signature obtained");let S={signature:y,permit2Authorization:{from:t.address,permitted:{token:a,amount:i},spender:Me,nonce:f.toString(),deadline:String(u),witness:{to:o,validAfter:String(w)}}};return{serialized:JSON.stringify(S),signature:y,extensions:s,settlementProbe:{kind:"permit2",from:t.address,nonce:f.toString(),chainId:A}}}async readAllowance(e,t,r,o){let a="0xdd62ed3e",i=r.slice(2).toLowerCase().padStart(64,"0"),c=o.slice(2).toLowerCase().padStart(64,"0"),l=a+i+c;try{let p=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:l},"latest"]})})).json();return p.error||!p.result||p.result==="0x"?0n:BigInt(p.result)}catch{return 0n}}encodeApprove(e,t){let r="0x095ea7b3",o=e.slice(2).toLowerCase().padStart(64,"0"),a=t.toString(16).padStart(64,"0");return r+o+a}async waitForReceipt(e,t,r=3e4){let o=Date.now();for(;Date.now()-o<r;){try{let i=await(await fetch(e,{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({jsonrpc:"2.0",id:1,method:"eth_getTransactionReceipt",params:[t]})})).json();if(i.result){if(i.result.status==="0x0")throw new Error(`Approval transaction reverted: ${t}`);return}}catch(a){if(a instanceof Error&&a.message.includes("reverted"))throw a}await new Promise(a=>setTimeout(a,2e3))}throw new Error(`Approval transaction receipt timeout after ${r}ms: ${t}`)}async readGasPrice(e){try{let r=await(await fetch(e,{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({jsonrpc:"2.0",id:1,method:"eth_gasPrice",params:[]})})).json();return r.result?BigInt(r.result):50000000n}catch{return 50000000n}}async readNonce(e,t){try{let o=await(await fetch(e,{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({jsonrpc:"2.0",id:1,method:"eth_getTransactionCount",params:[t,"latest"]})})).json();return o.result?parseInt(o.result,16):0}catch{return 0}}calculateApprovalAmount(e,t,r){let o=BigInt(e)+BigInt(t);if(!r||r.mode==="exact")return o;let a=BigInt(r.defaultMultiple??10),i=o*a;if(r.maxCapUsd){let c=this.inferDecimals(e),l=BigInt(Math.floor(r.maxCapUsd*Math.pow(10,c)));if(i>l)return l}if(r.exactAboveUsd){let c=this.inferDecimals(e),l=BigInt(Math.floor(r.exactAboveUsd*Math.pow(10,c)));if(BigInt(e)>l)return o}return i}inferDecimals(e){return e.length>12?18:6}};function te(n){return new Qe(n)}function pt(n){if(n===De||n===St)return!0;let e=n.toLowerCase();for(let t of Object.values(ze))if(t.toLowerCase()===e)return!0;for(let t of Object.keys(Ye))if(t.toLowerCase()===e)return!0;return!1}function Qt(n){return{[Pe]:"Solana",[He]:"Solana Devnet",[je]:"Solana Testnet",solana:"Solana","solana-devnet":"Solana Devnet","solana-testnet":"Solana Testnet",[ae]:"Base",[fe]:"Base Sepolia",[xe]:"Ethereum",[ge]:"Arbitrum",[ye]:"Polygon",[he]:"Optimism",[Ae]:"Avalanche",[Se]:"BSC",[we]:"SKALE Base",[be]:"SKALE Base Sepolia",base:"Base","base-sepolia":"Base Sepolia",ethereum:"Ethereum",arbitrum:"Arbitrum",polygon:"Polygon",optimism:"Optimism",avalanche:"Avalanche",bsc:"BSC","skale-base":"SKALE Base","skale-base-sepolia":"SKALE Base Sepolia"}[n]||n}function xt(n,e){let t=Qt(n);return t===n?e:t}async function Zt(n,e){if(typeof n=="string")return[n,e];if(n instanceof URL)return[n.href,e];let t=n,r=new Headers(t.headers);e?.headers&&new Headers(e.headers).forEach((i,c)=>r.set(c,i));let o={method:e?.method??t.method,headers:r,signal:e?.signal??t.signal,redirect:e?.redirect??t.redirect,credentials:e?.credentials??t.credentials},a=(o.method??"GET").toUpperCase();return e&&"body"in e?o.body=e.body:a!=="GET"&&a!=="HEAD"&&t.body&&(o.body=await t.arrayBuffer()),[t.url,o]}var Et=new WeakMap;function Ze(n){return Et.get(n)}function Ee(n){let{adapters:e=[L({verbose:n.verbose}),te({verbose:n.verbose})],wallets:t,wallet:r,preferredNetwork:o,rpcUrls:a={},maxAmountAtomic:i,fetch:c=globalThis.fetch,verbose:l=!1,accessPass:s,onPaymentRequired:p,onPaymentDispatched:f,maxRetries:g=0,retryDelayMs:w=500}=n,u=l?console.log.bind(console,"[x402]"):()=>{};async function A(b,T){let R;for(let x=0;x<=g;x++)try{let v=await c(b,T);if(v.status>=502&&v.status<=504&&x<g){u(`Retry ${x+1}/${g}: server returned ${v.status}`),await new Promise(_=>setTimeout(_,w*Math.pow(2,x)));continue}return v}catch(v){R=v,x<g&&(u(`Retry ${x+1}/${g}: ${v instanceof Error?v.message:"network error"}`),await new Promise(_=>setTimeout(_,w*Math.pow(2,x))))}throw R}let m=new Map;function h(b){try{let T=new URL(b).host,R=m.get(T);if(R&&R.expiresAt>Date.now()/1e3+10)return R.jwt;R&&m.delete(T)}catch{}return null}function y(b,T){try{let R=new URL(b).host,x=T.split(".");if(x.length===3){let v=JSON.parse(atob(x[1].replace(/-/g,"+").replace(/_/g,"/"))),_=Math.floor(Date.now()/1e3),I=_+86400,K=Math.min(typeof v.exp=="number"?v.exp:_,I);m.set(R,{jwt:T,expiresAt:K}),u("Access pass cached for",R,"| expires:",new Date(K*1e3).toISOString())}}catch{u("Failed to cache access pass")}}let S=t||{};r&&!S.solana&&ie(r)&&(S.solana=r),r&&!S.evm&&ce(r)&&(S.evm=r);function P(b){let T=[];for(let R of b){let x=R.scheme??"exact";if(x!=="exact"&&x!=="exact-approval")continue;let v=e.find(I=>I.canHandle(R.network));if(!v)continue;let _;v.name==="Solana"?_=S.solana:v.name==="EVM"&&(_=S.evm),_&&v.isConnected(_)&&T.push({accept:R,adapter:v,wallet:_})}if(T.length===0)return null;if(o){let R=T.find(x=>x.accept.network===o);if(R)return R}return T[0]}function O(b,T){return xt(b,T)}function X(b,T){return a[b]||T.getDefaultRpcUrl(b)}async function F(b,T,R,x,v){let _="";if(s?.preferTier&&x.tiers){let d=x.tiers.find(E=>E.id===s.preferTier);if(d){if(s.maxSpend&&parseFloat(d.price)>parseFloat(s.maxSpend))throw new C("access_pass_exceeds_max_spend",`Access pass tier "${d.id}" costs $${d.price}, exceeds max spend $${s.maxSpend}`);_=`tier=${d.id}`}}else if(s?.preferDuration&&x.ratePerHour)_=`duration=${s.preferDuration}`;else if(x.tiers&&x.tiers.length>0){let d=x.tiers[0];if(s?.maxSpend&&parseFloat(d.price)>parseFloat(s.maxSpend))throw new C("access_pass_exceeds_max_spend",`Cheapest access pass costs $${d.price}, exceeds max spend $${s?.maxSpend}`);_=`tier=${d.id}`}let I=_?v.includes("?")?`${v}&${_}`:`${v}?${_}`:v;u("Purchasing access pass:",_||"default tier");let K=R.headers.get("PAYMENT-REQUIRED");if(!K)return null;let M;try{M=JSON.parse(atob(K))}catch{return null}let B=P(M.accepts);if(!B)return null;let{accept:N,adapter:q,wallet:pe}=B;if(q.name==="Solana"&&!N.extra?.feePayer)return null;let z=N.extra?.decimals??(pt(N.asset)?6:void 0);if(typeof z!="number")return null;let Te=N.amount??N.maxAmountRequired;if(!Te)return null;let Y=X(N.network,q);try{let d=await q.getBalance(N,pe,Y),E=Number(Te)/Math.pow(10,z);if(d<E){let ct=O(N.network,q.name);throw new C("insufficient_balance",`Insufficient balance for access pass on ${ct}. Have $${d.toFixed(4)}, need $${E.toFixed(4)}`)}}catch(d){if(d instanceof C)throw d}let G=await q.buildTransaction(N,pe,Y),me;q.name==="EVM"?me=JSON.parse(G.serialized):me={transaction:G.serialized};let re=typeof b=="string"?b:b instanceof URL?b.href:b.url,de=M.resource;if(typeof M.resource=="string")try{let d=new URL(M.resource,re);["http:","https:"].includes(d.protocol)&&(de=d.toString())}catch{}else if(M.resource&&typeof M.resource=="object"&&"url"in M.resource){let d=M.resource;try{let E=new URL(d.url,re);["http:","https:"].includes(E.protocol)&&(de={...d,url:E.toString()})}catch{}}let Fe={x402Version:N.x402Version??2,resource:de,accepted:N,payload:me};G.extensions&&(Fe.extensions=G.extensions);let Q=btoa(JSON.stringify(Fe)),oe=await c(I,{...T,method:"POST",headers:{...T?.headers||{},"Content-Type":"application/json","PAYMENT-SIGNATURE":Q}});if(!oe.ok)return u("Pass purchase failed:",oe.status),null;let W=oe.headers.get("ACCESS-PASS");return W&&(y(v,W),u("Access pass purchased and cached")),oe}async function ne(b,T){let R=b;if(u("Making request:",R),s){let d=h(R);if(d){u("Using cached access pass");let E=await c(b,{...T,headers:{...T?.headers||{},Authorization:`Bearer ${d}`}});if(E.status!==401&&E.status!==402)return E;u("Cached pass rejected (status",E.status,"), purchasing new pass");try{m.delete(new URL(R).host)}catch{}}}let x=await A(b,T);if(x.status!==402)return x;u("Received 402 Payment Required");let v=x.headers.get("X-ACCESS-PASS-TIERS");if(s&&v){u("Server offers access passes, purchasing...");try{let d=JSON.parse(atob(v)),E=await F(b,T,x,d,R);if(E)return E}catch(d){u("Access pass purchase failed, falling back to per-request payment:",d)}}let _=x.headers.get("PAYMENT-REQUIRED");if(!_)throw new C("missing_payment_required_header","Server returned 402 but no PAYMENT-REQUIRED header");let I;try{let d=atob(_);I=JSON.parse(d)}catch{throw new C("invalid_payment_required","Failed to decode PAYMENT-REQUIRED header")}u("Payment requirements:",I);let K=x.headers.get("X-Quote-Hash");K&&u("Quote hash received:",K);let M=P(I.accepts);if(!M){let d=I.accepts.map(E=>E.network).join(", ");throw new C("no_matching_payment_option",`No connected wallet for any available network: ${d}`)}let{accept:B,adapter:N,wallet:q}=M;if(u(`Using ${N.name} for ${B.network}`),N.name==="Solana"&&!B.extra?.feePayer)throw new C("missing_fee_payer","Solana payment option missing feePayer in extra");let pe=B.extra?.decimals??(pt(B.asset)?6:void 0);if(typeof pe!="number")throw new C("missing_decimals","Payment option missing decimals - provide in extra or use a known stablecoin");let z=B.amount??B.maxAmountRequired;if(!z)throw new C("missing_amount","Payment option missing amount");if(i&&BigInt(z)>BigInt(i))throw new C("amount_exceeds_max",`Payment amount ${z} exceeds maximum ${i}`);let Te=X(B.network,N);u("Checking balance...");try{let d=await N.getBalance(B,q,Te),E=Number(z)/Math.pow(10,pe);if(d<E){let ct=O(B.network,N.name);throw new C("insufficient_balance",`Insufficient balance on ${ct}. Have $${d.toFixed(4)}, need $${E.toFixed(4)}`)}u(`Balance OK: $${d.toFixed(4)} >= $${E.toFixed(4)}`)}catch(d){if(d instanceof C)throw d;u("Balance check failed (RPC error), proceeding with transaction attempt")}if(p&&!await p(B))throw new C("payment_rejected","Payment rejected by onPaymentRequired callback");u("Building transaction...");let Y=await N.buildTransaction(B,q,Te);u("Transaction signed");let G;N.name==="EVM"?G=JSON.parse(Y.serialized):G={transaction:Y.serialized};let me=b,re=I.resource;if(typeof I.resource=="string")try{let d=new URL(I.resource,me).toString();d!==I.resource&&u("Resolved relative resource URL:",I.resource,"\u2192",d),re=d}catch{re=I.resource}else if(I.resource&&typeof I.resource=="object"&&"url"in I.resource){let d=I.resource;try{let E=new URL(d.url,me).toString();E!==d.url&&(u("Resolved relative resource URL:",d.url,"\u2192",E),re={...d,url:E})}catch{}}let de={x402Version:B.x402Version??2,resource:re,accepted:B,payload:G};Y.extensions&&(de.extensions=Y.extensions);let Fe=btoa(JSON.stringify(de));if(f)try{f(B,Y.settlementProbe)}catch{}u("Retrying request with payment...");let Q=await A(b,{...T,headers:{...T?.headers||{},"PAYMENT-SIGNATURE":Fe,...K?{"X-Quote-Hash":K}:{}}});if(u("Retry response status:",Q.status),Q.status===402){let d="unknown";try{let E=await Q.clone().json();d=String(E.error||E.message||JSON.stringify(E)),u("Rejection reason:",d)}catch{}throw new C("payment_rejected",`Payment was rejected by the server: ${d}`)}let oe=Q.headers.get("PAYMENT-RESPONSE"),W;if(oe)try{W=JSON.parse(atob(oe))}catch{}return W??={},W.amountAtomic=z,W.assetDecimals=pe,Et.set(Q,W),W.extensions&&u("Settlement extensions:",Object.keys(W.extensions).join(", ")),Q}async function $(b,T){let[R,x]=await Zt(b,T);return ne(R,x)}return{fetch:$}}var nn=require("@solana/web3.js"),et=require("@noble/hashes/utils");var en=Z(require("tweetnacl"),1);var Ke=require("@dexterai/vault/messages");var tn=require("@noble/hashes/sha256");function Tt(n){return Buffer.from(JSON.stringify({payload:n.payload,sessionPublicKey:(0,et.bytesToHex)(n.sessionPublicKey),sessionRegistration:(0,et.bytesToHex)(n.sessionRegistration),sessionSignature:(0,et.bytesToHex)(n.sessionSignature)}),"utf8").toString("base64")}function J(n){if(n instanceof Error){if(n.message&&n.message.length>0)return n.message;if(n.name&&n.name.length>0)return n.name}let e=String(n);return e.length>0?e:"unknown error"}async function We(n){let e="";try{e=(await n.clone().text()).slice(0,600)}catch{}let t=e.toLowerCase(),r=t.includes("settle")||t.includes("facilitator"),o=e;try{let a=JSON.parse(e),i=[a.error,a.detail,a.message].filter(c=>typeof c=="string"&&c.length>0);i.length>0&&(o=i.join(" \u2014 "))}catch{}return o||(o=`HTTP ${n.status}`),{reason:r?"settlement_failed":"merchant_rejected",detail:`merchant HTTP ${n.status}: ${o}`}}var tt="Payment authorization was sent, but the merchant did not respond within the timeout. ",nt=" Do not retry without checking \u2014 inspect the funding wallet for a transfer to the merchant before attempting payment again.";async function rt(n,e,t){if(!n)return{confirmed:!1,detail:tt+"This payment scheme has no on-chain confirmation check, so the SDK cannot verify whether it settled."+nt};try{if(n.kind==="solana"){let i=L(),c=t??i.getDefaultRpcUrl(e.caip2);if(!i.confirmSettlement)return Rt();let l=await i.confirmSettlement(n,c);return l.settled?{confirmed:!0,txSignature:l.txSignature}:Pt()}let r=te(),o=r.getDefaultRpcUrl(e.caip2);if(!r.confirmSettlement)return Rt();let a=await r.confirmSettlement(n,o);return a.settled?{confirmed:!0,txSignature:a.txSignature}:Pt()}catch(r){return{confirmed:!1,detail:tt+`On-chain confirmation could not be completed (${J(r)}).`+nt}}}function Pt(){return{confirmed:!1,detail:tt+"On-chain confirmation found no matching settlement yet \u2014 the payment may still be pending, or may not have settled."+nt}}function Rt(){return{confirmed:!1,detail:tt+"The chain adapter does not support on-chain confirmation."+nt}}var vt=[{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:"solana:5eykt4UsFv8P8NJdTREpY1vzqKqZKvdp",bare:"solana",family:"svm"}],rn=new Map(vt.map(n=>[n.caip2.toLowerCase(),n])),on=new Map(vt.map(n=>[n.bare.toLowerCase(),n]));function le(n){if(!n)return null;let e=n.toLowerCase(),t=rn.get(e)||on.get(e);return t?{caip2:t.caip2,bare:t.bare,family:t.family}:null}function mt(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 an(n){let e=[];for(let t of n){if(!t||typeof t!="object")continue;let r=t,o=le(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 Ct(n){let e=n.headers.get("payment-required");if(!e)return null;let t;try{t=mt(e)}catch{return null}let r=Array.isArray(t.accepts)?t.accepts:[];return r.length===0?null:{x402Version:2,options:an(r),resourceUrl:t.resource&&typeof t.resource=="object"?String(t.resource.url??""):void 0}}var sn=new Set(["exact","exact-approval"]);async function cn(n,e,t,r){let o;try{o=await r.signNextVoucher(t.amount)}catch{return null}let a=new Headers(e.headers??void 0);a.set("X-Tab-Voucher",Tt(o));let i={method:e.method??"GET",headers:a};e.signal&&(i.signal=e.signal),typeof e.body=="string"&&(i.body=e.body);let c;try{c=await fetch(n,i)}catch(l){return{ok:!1,reason:"error",detail:l?.message??String(l)}}return c.status===402?(r.rollbackVoucher?.call(r,o),null):c.ok?{ok:!0,paid:!0,response:c,amountPaid:t.amount,network:t.network}:{ok:!1,...await We(c)}}var _t={version:2,async parseChallenge(n){return Ct(n)},async pay(n,e,t,r,o){if(o.tab){let h=t.options.find(y=>y.scheme==="tab"&&y.network.family==="svm"&&y.payTo===o.tab.counterparty);if(h){let y=await cn(n,e,h,o.tab);if(y)return y}}let a=t.options.filter(h=>sn.has(h.scheme));if(a.length===0)return{ok:!1,reason:"no_payment_options",detail:`no generically payable scheme offered (got: ${t.options.map(h=>h.scheme).join(", ")})`};let i=a.find(h=>h.network.family==="evm"?!!r.evm:h.network.family==="svm"?!!r.solana:!1);if(!i)return{ok:!1,reason:"unsupported_network"};let c=o.timeoutMs??15e3,l=o.responseTimeoutMs??12e4,s=new AbortController,p=setTimeout(()=>s.abort(),c),f=!1,g,w=(h,y)=>{f=!0,g=y,clearTimeout(p),p=setTimeout(()=>s.abort(),l)},u=Ee({wallets:r,preferredNetwork:i.network.caip2,maxAmountAtomic:o.maxAmountAtomic,fetch:globalThis.fetch,onPaymentDispatched:w}),A=e.signal?AbortSignal.any([e.signal,s.signal]):s.signal,m={method:e.method??"GET",headers:e.headers,signal:A};typeof e.body=="string"&&(m.body=e.body);try{let h=await u.fetch(n,m);if(clearTimeout(p),!h.ok)return{ok:!1,...await We(h)};let y,S=h.headers.get("PAYMENT-RESPONSE");if(S)try{let P=mt(S);P&&typeof P.transaction=="string"&&(y=P.transaction)}catch{}return{ok:!0,paid:!0,response:h,amountPaid:i.amount,network:i.network,txSignature:y}}catch(h){clearTimeout(p);let y=h;if(y?.name==="AbortError"){if(!f)return{ok:!1,reason:"timeout"};let S=await rt(g,i.network,o.solanaRpcUrl);return S.confirmed?{ok:!0,paid:!0,response:void 0,amountPaid:i.amount,network:i.network,txSignature:S.txSignature}:{ok:!1,reason:"payment_unconfirmed",detail:S.detail}}return{ok:!1,reason:"error",detail:y?.message??String(h)}}}};var It=require("viem");var ln={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 un(){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 pn(n,e,t){if(typeof n.signTypedData!="function")throw new Error("EVM wallet does not support signTypedData");let r=Math.floor(Date.now()/1e3),o=String(r-600),a=String(r+(e.maxTimeoutSeconds??60)),i={from:n.address,to:e.payTo,value:e.amount,validAfter:o,validBefore:a,nonce:await un()},c=$e[e.network.caip2];if(c===void 0)throw new Error(`unknown chain id for network ${e.network.caip2}`);let l=e.extra,s=await n.signTypedData({domain:{name:l.name,version:l.version,chainId:c,verifyingContract:(0,It.getAddress)(e.asset)},types:ln,primaryType:"TransferWithAuthorization",message:i});return{payment:{x402Version:1,scheme:e.scheme,network:t,payload:{signature:s,authorization:i}},settlementProbe:{kind:"eip3009",from:i.from,nonce:i.nonce,asset:e.asset,chainId:c}}}async function Le(n,e,t){try{let r;for(let o of n.options){let a=o.network.family==="evm"&&!!e.evm||o.network.family==="svm"&&!!e.solana;if(o.scheme!=="exact"){a&&(r=o.scheme);continue}if(o.network.family==="evm"&&e.evm){let i=await e.evm;return await mn(o,i,t)}if(o.network.family==="svm"&&e.solana){let i=await e.solana;return await dn(o,i,t)}}return r!==void 0?{ok:!1,reason:"merchant_rejected",detail:`v1 supports only the 'exact' scheme, got '${r}'`}:{ok:!1,reason:"unsupported_network"}}catch(r){return{ok:!1,reason:"error",detail:J(r)}}}async function mn(n,e,t){if(t.maxAmountAtomic!==void 0&&BigInt(n.amount)>BigInt(t.maxAmountAtomic))return{ok:!1,reason:"budget_exceeded"};let r=n.extra??{},o=r.name,a=r.version;if(typeof o!="string"||o.length===0||typeof a!="string"||a.length===0)return{ok:!1,reason:"merchant_rejected",detail:"v1 challenge missing exact-scheme EIP-712 domain (extra.name / extra.version)"};let i=n.network.bare,{payment:c,settlementProbe:l}=await pn(e,n,i);return{ok:!0,headerValue:Buffer.from(JSON.stringify(c),"utf8").toString("base64"),option:n,settlementProbe:l}}async function dn(n,e,t){if(t.maxAmountAtomic!==void 0&&BigInt(n.amount)>BigInt(t.maxAmountAtomic))return{ok:!1,reason:"budget_exceeded"};if(n.scheme!=="exact")return{ok:!1,reason:"merchant_rejected",detail:`v1 SVM supports only the 'exact' scheme, got '${n.scheme}'`};let r=n.extra??{};if(typeof r.feePayer!="string"||r.feePayer.length===0)return{ok:!1,reason:"merchant_rejected",detail:"v1 SVM challenge missing extra.feePayer (required as the transaction fee payer)"};let o=n.network.bare,a={x402Version:1,scheme:n.scheme,network:o,asset:n.asset,payTo:n.payTo,amount:n.amount,maxAmountRequired:n.amount,maxTimeoutSeconds:n.maxTimeoutSeconds??60,extra:r},c=await L().buildTransaction(a,e,t.solanaRpcUrl),l={x402Version:1,scheme:n.scheme,network:o,payload:{transaction:c.serialized}};return{ok:!0,headerValue:Buffer.from(JSON.stringify(l),"utf8").toString("base64"),option:n,settlementProbe:c.settlementProbe}}function fn(n){let e=[];for(let t of n){if(!t||typeof t!="object")continue;let r=t,o=le(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 Nt={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=fn(t);return r.length===0?null:{x402Version:1,options:r}},async pay(n,e,t,r,o){let a,i=new AbortController,c=!1,l,s;try{let p=o.timeoutMs??15e3;a=setTimeout(()=>i.abort(),p);let f=await Le(t,r,o);if(!f.ok)return{ok:!1,reason:f.reason,detail:f.detail};let g=f.headerValue,w=f.option;s=w,l=f.settlementProbe;let u=new Headers(e.headers??void 0);u.set("X-PAYMENT",g);let A=e.signal!=null?AbortSignal.any([e.signal,i.signal]):i.signal,m={method:e.method,headers:u,signal:A};typeof e.body=="string"&&(m.body=e.body),c=!0,clearTimeout(a);let h=o.responseTimeoutMs??12e4;a=setTimeout(()=>i.abort(),h);let y=await fetch(n,m);return y.ok?{ok:!0,paid:!0,response:y,amountPaid:w.amount,network:w.network,txSignature:gn(y)}:{ok:!1,...await We(y)}}catch(p){if(p instanceof Error&&p.name==="AbortError"){if(!c)return{ok:!1,reason:"timeout"};let f=await rt(l,s.network,o.solanaRpcUrl);return f.confirmed?{ok:!0,paid:!0,response:void 0,amountPaid:s.amount,network:s.network,txSignature:f.txSignature}:{ok:!1,reason:"payment_unconfirmed",detail:f.detail}}return{ok:!1,reason:"error",detail:J(p)}}finally{a!==void 0&&clearTimeout(a)}}};function gn(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 Mt=Z(require("tweetnacl"),1);var V=require("@solana/web3.js"),ue=Symbol.for("x402:keypair");async function ot(n){let e;if(typeof n=="string"){let t;try{let r=await Promise.resolve().then(()=>(Bt(),Ut)),o=r.decode??r.default?.decode;if(!o)throw new Error("decode not found");t=o}catch{throw new Error('The "bs58" package is required for base58 private keys. Install it with: npm install bs58')}try{let r=t(n);e=V.Keypair.fromSecretKey(r)}catch{try{let o=JSON.parse(n);if(Array.isArray(o))e=V.Keypair.fromSecretKey(Uint8Array.from(o));else throw new Error("Invalid private key format")}catch{throw new Error("Invalid private key. Expected base58 string or JSON array of bytes.")}}}else if(Array.isArray(n))e=V.Keypair.fromSecretKey(Uint8Array.from(n));else if(n instanceof Uint8Array)e=V.Keypair.fromSecretKey(n);else throw new Error("Invalid private key type. Expected string, number[], or Uint8Array.");return{publicKey:{toBase58:()=>e.publicKey.toBase58()},signTransaction:async t=>{if(t instanceof V.VersionedTransaction)return t.sign([e]),t;if(t instanceof V.Transaction)return t.sign(e),t;throw new Error("Unknown transaction type")},[ue]:e}}function Dt(n){if(!n||typeof n!="object")return!1;let e=n;return ue in e&&e[ue]instanceof V.Keypair&&"publicKey"in e&&"signTransaction"in e}function Ve(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[ue];if(r&&r.secretKey&&r.publicKey)return{publicKey:r.publicKey,signMessage:async o=>Mt.sign.detached(o,r.secretKey)}}return null}var $t=[_t,Nt];async function dt(n){for(let e of $t)if(await e.parseChallenge(n.clone()))return e;return null}async function Sn(n){let e=Ve(n);if(!e)return fetch;try{return(await import("@x402/extensions/sign-in-with-x")).wrapFetchWithSIWx(fetch,e)}catch(t){return console.warn(`[x402] SIW-X unavailable \u2014 @x402/extensions failed to load; SIW-X merchants will not authenticate. ${J(t)}`),fetch}}async function ft(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 Sn(t))(n,{...e})}catch(a){return{ok:!1,reason:"error",detail:J(a)}}if(o.status!==402)return{ok:!0,paid:!1,response:o};for(let a of $t){let i=await a.parseChallenge(o.clone());if(i)return a.pay(n,e,i,t,r)}return{ok:!1,reason:"no_payment_options"}}async function at(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 Kt(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 st(n){let e=Ze(n);if(e?.extensions?.["sponsored-access"])return e.extensions["sponsored-access"]}function Wt(n){let e=st(n);if(e?.recommendations?.length)return e.recommendations}async function Lt(n){let t=st(n)?.tracking?.impressionBeacon;if(!t)return!1;try{await fetch(t,{method:"GET"})}catch{}return!0}function it(n,e){let{walletPrivateKey:t,evmPrivateKey:r,preferredNetwork:o,rpcUrls:a,maxAmountAtomic:i,verbose:c,accessPass:l,onPaymentRequired:s}=e;if(!t&&!r)throw new Error("At least one wallet private key is required (walletPrivateKey or evmPrivateKey)");let p={},f=[];t&&f.push(ot(t).then(m=>{p.solana=m}).catch(m=>{console.warn(`[x402] Solana wallet init failed: ${m.message}`)})),r&&f.push(at(r).then(m=>{p.evm=m}).catch(m=>{console.warn(`[x402] EVM wallet init failed: ${m.message}`)}));let g=f.length>0?Promise.all(f):null,u=Ee({wallets:p,preferredNetwork:o,rpcUrls:a,maxAmountAtomic:i,fetch:n,verbose:c,accessPass:l,onPaymentRequired:s}),A=u.fetch.bind(u);return g?(async(m,h)=>(await g,A(m,h))):A}function Vt(n){let{budget:e,allowedDomains:t,onPaymentRequired:r,...o}=n,a=parseFloat(e.total),i=e.perRequest?parseFloat(e.perRequest):1/0,c=e.perHour?parseFloat(e.perHour):1/0;if(isNaN(a)||a<=0)throw new Error("budget.total must be a positive number");let l=[],s=0;function p(){return l.reduce((u,A)=>u+A.amount,0)}function f(){let u=Date.now()-36e5;return l.filter(A=>A.timestamp>=u).reduce((A,m)=>A+m.amount,0)}let g=it(fetch,{...o,onPaymentRequired:async u=>{let A=u.extra?.decimals??6,m=Number(u.amount)/Math.pow(10,A);if(m>i)throw new C("amount_exceeds_max",`$${m.toFixed(4)} exceeds per-request limit of $${i.toFixed(2)}`);let h=p();if(h+m>a)throw new C("amount_exceeds_max",`Budget exceeded. Spent $${h.toFixed(2)} of $${a.toFixed(2)}, payment: $${m.toFixed(4)}`);let y=f();if(y+m>c)throw new C("amount_exceeds_max",`Hourly limit ($${c.toFixed(2)}) exceeded. Spent $${y.toFixed(2)} this hour`);return s=m,r?r(u):!0}});return{fetch:(async(u,A)=>{let m=typeof u=="string"?u:u instanceof URL?u.href:u.url,h="unknown";try{h=new URL(m).hostname}catch{}if(t&&!t.some(S=>h===S||h.endsWith(`.${S}`)))throw new C("payment_rejected",`Domain "${h}" not in allowed domains`);s=0;let y=await g(u,A);if(s>0){let S="unknown",P=y.headers.get("PAYMENT-RESPONSE");if(P)try{S=JSON.parse(atob(P)).network||S}catch{}l.push({amount:s,domain:h,network:S,timestamp:Date.now()}),s=0}return y}),get spent(){return`$${p().toFixed(2)}`},get remaining(){return`$${(a-p()).toFixed(2)}`},get payments(){return l.length},get spentAmount(){return p()},get remainingAmount(){return a-p()},get ledger(){return l},get hourlySpend(){return f()},reset(){l=[]}}}var gt=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,createX402Client,detectStrategy,fireImpressionBeacon,getPaymentReceipt,getSponsoredAccessInfo,getSponsoredRecommendations,isEvmKeypairWallet,isKeypairWallet,payAndFetch,toNetworkRef,toSiwxSigner,wrapFetch});
1
+ "use strict";var Ft=Object.create;var Fe=Object.defineProperty;var qt=Object.getOwnPropertyDescriptor;var Ht=Object.getOwnPropertyNames;var jt=Object.getPrototypeOf,Jt=Object.prototype.hasOwnProperty;var gt=(n,e)=>()=>(n&&(e=n(n=0)),e);var yt=(n,e)=>{for(var t in e)Fe(n,t,{get:e[t],enumerable:!0})},ht=(n,e,t,r)=>{if(e&&typeof e=="object"||typeof e=="function")for(let o of Ht(e))!Jt.call(n,o)&&o!==t&&Fe(n,o,{get:()=>e[o],enumerable:!(r=qt(e,o))||r.enumerable});return n};var Z=(n,e,t)=>(t=n!=null?Ft(jt(n)):{},ht(e||!n||!n.__esModule?Fe(t,"default",{value:n,enumerable:!0}):t,n)),Xt=n=>ht(Fe({},"__esModule",{value:!0}),n);function yn(n){if(n.length>=255)throw new TypeError("Alphabet too long");let e=new Uint8Array(256);for(let s=0;s<e.length;s++)e[s]=255;for(let s=0;s<n.length;s++){let p=n.charAt(s),f=p.charCodeAt(0);if(e[f]!==255)throw new TypeError(p+" is ambiguous");e[f]=s}let t=n.length,r=n.charAt(0),o=Math.log(t)/Math.log(256),a=Math.log(256)/Math.log(t);function i(s){if(s instanceof Uint8Array||(ArrayBuffer.isView(s)?s=new Uint8Array(s.buffer,s.byteOffset,s.byteLength):Array.isArray(s)&&(s=Uint8Array.from(s))),!(s instanceof Uint8Array))throw new TypeError("Expected Uint8Array");if(s.length===0)return"";let p=0,f=0,g=0,w=s.length;for(;g!==w&&s[g]===0;)g++,p++;let u=(w-g)*a+1>>>0,A=new Uint8Array(u);for(;g!==w;){let y=s[g],S=0;for(let P=u-1;(y!==0||S<f)&&P!==-1;P--,S++)y+=256*A[P]>>>0,A[P]=y%t>>>0,y=y/t>>>0;if(y!==0)throw new Error("Non-zero carry");f=S,g++}let m=u-f;for(;m!==u&&A[m]===0;)m++;let h=r.repeat(p);for(;m<u;++m)h+=n.charAt(A[m]);return h}function c(s){if(typeof s!="string")throw new TypeError("Expected String");if(s.length===0)return new Uint8Array;let p=0,f=0,g=0;for(;s[p]===r;)f++,p++;let w=(s.length-p)*o+1>>>0,u=new Uint8Array(w);for(;p<s.length;){let y=s.charCodeAt(p);if(y>255)return;let S=e[y];if(S===255)return;let P=0;for(let O=w-1;(S!==0||P<g)&&O!==-1;O--,P++)S+=t*u[O]>>>0,u[O]=S%256>>>0,S=S/256>>>0;if(S!==0)throw new Error("Non-zero carry");g=P,p++}let A=w-g;for(;A!==w&&u[A]===0;)A++;let m=new Uint8Array(f+(w-A)),h=f;for(;A!==w;)m[h++]=u[A++];return m}function l(s){let p=c(s);if(p)return p;throw new Error("Non-base"+t+" character")}return{encode:i,decodeUnsafe:c,decode:l}}var Nt,kt=gt(()=>{"use strict";Nt=yn});var Ot={};yt(Ot,{default:()=>An});var hn,An,Ut=gt(()=>{"use strict";kt();hn="123456789ABCDEFGHJKLMNPQRSTUVWXYZabcdefghijkmnopqrstuvwxyz",An=Nt(hn)});var wn={};yt(wn,{BASE_MAINNET:()=>j,DEXTER_FACILITATOR_URL:()=>lt,KEYPAIR_SYMBOL:()=>ue,SOLANA_MAINNET:()=>H,USDC_MINT:()=>Be,X402Error:()=>C,buildV1PaymentHeader:()=>We,capabilitySearch:()=>ft.capabilitySearch,createBudgetAccount:()=>Vt,createEvmAdapter:()=>te,createEvmKeypairWallet:()=>at,createKeypairWallet:()=>ot,createSolanaAdapter:()=>L,detectStrategy:()=>mt,fireImpressionBeacon:()=>Wt,getPaymentReceipt:()=>Qe,getSponsoredAccessInfo:()=>st,getSponsoredRecommendations:()=>Kt,isEvmKeypairWallet:()=>$t,isKeypairWallet:()=>Bt,payAndFetch:()=>dt,toNetworkRef:()=>le,toSiwxSigner:()=>Le});module.exports=Xt(wn);var Te="solana:5eykt4UsFv8P8NJdTREpY1vzqKqZKvdp",qe="solana:EtWTRABZaYq6iMfeYKouRu166VU2xqa1",He="solana:4uhcVJyU9pJkvQyS88uRDiswHXSCkY3z",H=Te,Pe=qe,Re=He,ae="eip155:8453",fe="eip155:84532",ge="eip155:42161",ye="eip155:137",he="eip155:10",Ae="eip155:43114",Se="eip155:56",we="eip155:1187947933",be="eip155:324705682",xe="eip155:1",j=ae,je=fe,ve=ge,Ce=ye,_e=he,Ie=Ae,Ne=Se,ke=we,Oe=be,Ue=xe,Be="EPjFWdd5AufqSSqeM2qN1xzybapC8G4wEGGkZwyTDt1v",At="4zMMC9srt5Ri5X14GAgXhaHii3GnPAEERYPJgZJDncDU",St="0x833589fCD6eDb6E08f4c7C32D4f71b54bdA02913",ct="0x55d398326f99059fF775485246999027B3197955",Je="0x8AC76a51cc950d9822D68b83fE1Ad97B32Cd580d",Xe={[Se]:Je,[ae]:St,[fe]:"0x036CbD53842c5426634e7929541eC2318f3dCF7e",[ge]:"0xaf88d065e77c8cC2239327C5EDb3A432268e5831",[ye]:"0x3c499c542cEF5E3811e1192ce70d8cC03d5c3359",[he]:"0x0b2C639c533813f4Aa9D7837CAf62653d097Ff85",[Ae]:"0xB97EF9Ef8734C71904D8002F8b6Bc66Dd9c48a6E",[we]:"0x85889c8c714505E0c94b30fcfcF64fE3Ac8FCb20",[be]:"0x2e08028E3C4c2356572E096d8EF835cD5C6030bD",[xe]:"0xA0b86991c6218b36c1d19D4a2e9Eb0cE3606eB48"},ze={[ct]:{symbol:"USDT",decimals:18},[Je]:{symbol:"USDC",decimals:18}};var ee="0x000000000022D473030F116dDEE9F6B43aC78BA3",De="0x402085c248EeA27D92E8b30b2C58ed07f9E20001",Me={[Se]:56,[ae]:8453,[fe]:84532,[ge]:42161,[ye]:137,[he]:10,[Ae]:43114,[we]:1187947933,[be]:324705682,[xe]:1},se={[Te]:"https://api.dexter.cash/api/solana/rpc",[qe]:"https://api.devnet.solana.com",[He]:"https://api.testnet.solana.com"},D={[Se]:"https://api.dexter.cash/api/evm/bsc/rpc",[ae]:"https://api.dexter.cash/api/base/rpc",[fe]:"https://sepolia.base.org",[ge]:"https://api.dexter.cash/api/evm/arbitrum/rpc",[ye]:"https://api.dexter.cash/api/evm/polygon/rpc",[he]:"https://api.dexter.cash/api/evm/optimism/rpc",[Ae]:"https://api.dexter.cash/api/evm/avalanche/rpc",[we]:"https://skale-base.skalenodes.com/v1/base",[be]:"https://base-sepolia-testnet.skalenodes.com/v1/jubilant-horrible-ancha",[xe]:"https://eth.llamarpc.com"},lt="https://x402.dexter.cash";var C=class n extends Error{code;details;constructor(e,t,r){super(t),this.name="X402Error",this.code=e,this.details=r,Object.setPrototypeOf(this,n.prototype)}};var k=require("@solana/web3.js"),U=require("@solana/spl-token");var zt=12e3,Yt=1;function ie(n){if(!n||typeof n!="object")return!1;let e=n;return"publicKey"in e&&"signTransaction"in e&&typeof e.signTransaction=="function"}var Ye=class{name="Solana";networks=[H,Pe,Re];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]:se[e]?se[e]:e==="solana"?se[H]:e==="solana-devnet"?se[Pe]:e==="solana-testnet"?se[Re]:se[H]}getAddress(e){return ie(e)?e.publicKey?.toBase58()??null:null}isConnected(e){return ie(e)?e.publicKey!==null:!1}async getBalance(e,t,r){if(!ie(t)||!t.publicKey)return 0;let o=r||this.getDefaultRpcUrl(e.network),a=new k.Connection(o,"confirmed"),i=new k.PublicKey(t.publicKey.toBase58()),c=new k.PublicKey(e.asset);try{let s=(await a.getAccountInfo(c,"confirmed"))?.owner.toBase58()===U.TOKEN_2022_PROGRAM_ID.toBase58()?U.TOKEN_2022_PROGRAM_ID:U.TOKEN_PROGRAM_ID,p=await(0,U.getAssociatedTokenAddress)(c,i,!1,s),f=await(0,U.getAccount)(a,p,void 0,s),g=e.extra?.decimals??6;return Number(f.amount)/Math.pow(10,g)}catch(l){if(l&&typeof l=="object"&&"name"in l&&(l.name==="TokenAccountNotFoundError"||l.name==="TokenInvalidAccountOwnerError"))return 0;throw l}}async buildTransaction(e,t,r){if(!ie(t))throw new Error("Invalid Solana wallet");if(!t.publicKey)throw new Error("Wallet not connected");let o=r||this.getDefaultRpcUrl(e.network),a=new k.Connection(o,"confirmed"),i=new k.PublicKey(t.publicKey.toBase58()),{payTo:c,asset:l,extra:s}=e,p=e.amount??e.maxAmountRequired;if(!p)throw new Error("Missing amount in payment requirements");if(!s?.feePayer)throw new Error("Missing feePayer in payment requirements");let f=new k.PublicKey(s.feePayer),g=new k.PublicKey(l),w=new k.PublicKey(c);this.log("Building transaction:",{from:i.toBase58(),to:c,amount:p,asset:l,feePayer:s.feePayer});let u=[];u.push(k.ComputeBudgetProgram.setComputeUnitLimit({units:zt})),u.push(k.ComputeBudgetProgram.setComputeUnitPrice({microLamports:Yt}));let A=await a.getAccountInfo(g,"confirmed");if(!A)throw new Error(`Token mint ${l} not found`);let m=A.owner.toBase58()===U.TOKEN_2022_PROGRAM_ID.toBase58()?U.TOKEN_2022_PROGRAM_ID:U.TOKEN_PROGRAM_ID,h=await(0,U.getMint)(a,g,void 0,m);typeof s?.decimals=="number"&&h.decimals!==s.decimals&&this.log(`Decimals mismatch: requirements say ${s.decimals}, mint says ${h.decimals}`);let y=await(0,U.getAssociatedTokenAddress)(g,i,!1,m),S=await(0,U.getAssociatedTokenAddress)(g,w,!0,m);if(!await a.getAccountInfo(y,"confirmed"))throw new Error(`No token account found for ${l}. Please ensure you have USDC in your wallet.`);if(!await a.getAccountInfo(S,"confirmed"))throw new Error(`Seller token account not found. The seller (${c}) must have a USDC account.`);let X=BigInt(p);u.push((0,U.createTransferCheckedInstruction)(y,g,S,i,X,h.decimals,[],m));let{blockhash:F}=await a.getLatestBlockhash("confirmed"),ne=new k.TransactionMessage({payerKey:f,recentBlockhash:F,instructions:u}).compileToV0Message(),$=new k.VersionedTransaction(ne),b=await t.signTransaction($);return this.log("Transaction signed successfully"),{serialized:Buffer.from(b.serialize()).toString("base64"),settlementProbe:{kind:"solana",sourceAta:y.toBase58(),destinationAta:S.toBase58(),asset:l,amount:p,blockhash:F}}}async confirmSettlement(e,t){if(e.kind!=="solana")throw new Error(`SolanaAdapter.confirmSettlement cannot handle probe kind "${e.kind}"`);let r=new k.Connection(t,"confirmed"),o=new k.PublicKey(e.destinationAta),a=await r.getSignaturesForAddress(o,{limit:25});if(a.length===0)return{settled:!1};let i=BigInt(e.amount);for(let c of a){if(c.err)continue;let l=await r.getTransaction(c.signature,{commitment:"confirmed",maxSupportedTransactionVersion:0});if(!l?.meta)continue;let s=l.transaction.message.getAccountKeys().keySegments().flat(),p=l.meta.preTokenBalances??[],f=l.meta.postTokenBalances??[];for(let g of f){if(g.mint!==e.asset)continue;let w=s[g.accountIndex];if(!w||!w.equals(o))continue;let u=p.find(h=>h.accountIndex===g.accountIndex),A=BigInt(u?.uiTokenAmount.amount??"0");if(BigInt(g.uiTokenAmount.amount??"0")-A===i)return{settled:!0,txSignature:c.signature}}}return{settled:!1}}};function L(n){return new Ye(n)}var Gt={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"}]},wt=BigInt("0xffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff");function ce(n){if(!n||typeof n!="object")return!1;let e=n;return"address"in e&&typeof e.address=="string"&&e.address.startsWith("0x")}var Ge=class{name="EVM";networks=[Ne,j,je,Ue,ve,Ce,_e,Ie,ke,Oe];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==="skale-base"||e==="skale-base-sepolia"||e.startsWith("eip155:"))}getDefaultRpcUrl(e){return this.config.rpcUrls?.[e]?this.config.rpcUrls[e]:D[e]?D[e]:e==="base"?D[j]:e==="bsc"?D[Ne]:e==="ethereum"?D[Ue]:e==="arbitrum"?D[ve]:e==="polygon"?D[Ce]:e==="optimism"?D[_e]:e==="avalanche"?D[Ie]:e==="skale-base"?D[ke]:e==="skale-base-sepolia"?D[Oe]:D[j]}getAddress(e){return ce(e)?e.address:null}isConnected(e){return ce(e)?!!e.address:!1}getChainId(e){if(Me[e])return Me[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:8453}async getBalance(e,t,r){if(!ce(t)||!t.address)return 0;let o=r||this.getDefaultRpcUrl(e.network);try{let a=this.encodeBalanceOf(t.address),i=await fetch(o,{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({jsonrpc:"2.0",id:1,method:"eth_call",params:[{to:e.asset,data:a},"latest"]})});if(!i.ok)throw new Error(`RPC request failed: ${i.status}`);let c=await i.json();if(c.error)throw new Error(`RPC error: ${JSON.stringify(c.error)}`);if(!c.result||c.result==="0x")return 0;let l=BigInt(c.result),s=e.extra?.decimals??6;return Number(l)/Math.pow(10,s)}catch(a){throw a}}encodeBalanceOf(e){let t="0x70a08231",r=e.slice(2).toLowerCase().padStart(64,"0");return t+r}async confirmSettlement(e,t){if(e.kind==="eip3009"){let r="0xe94a0102",o=e.from.slice(2).toLowerCase().padStart(64,"0"),a=e.nonce.slice(2).toLowerCase().padStart(64,"0"),i=r+o+a,c=await this.ethCall(t,e.asset,i);return{settled:BigInt(c)!==0n}}if(e.kind==="permit2"){let r="0x4fe02b44",o=BigInt(e.nonce),a=o>>8n,i=o&0xffn,c=e.from.slice(2).toLowerCase().padStart(64,"0"),l=a.toString(16).padStart(64,"0"),s=r+c+l,p=await this.ethCall(t,ee,s);return{settled:(BigInt(p)>>i&1n)===1n}}throw new Error(`EvmAdapter.confirmSettlement cannot handle probe kind "${e.kind}"`)}async ethCall(e,t,r){let o=await fetch(e,{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({jsonrpc:"2.0",id:1,method:"eth_call",params:[{to:t,data:r},"latest"]})});if(!o.ok)throw new Error(`RPC request failed: ${o.status}`);let a=await o.json();if(a.error)throw new Error(`RPC error: ${JSON.stringify(a.error)}`);if(!a.result||a.result==="0x")throw new Error("RPC returned an empty result");return a.result}async buildTransaction(e,t,r){if(!ce(t))throw new Error("Invalid EVM wallet");if(!t.address)throw new Error("Wallet not connected");if(e.scheme==="exact-approval")return this.buildApprovalTransaction(e,t,r);if(e.extra?.assetTransferMethod==="permit2")return this.buildPermit2Transaction(e,t,r);let{payTo:o,asset:a,extra:i}=e,c=e.amount??e.maxAmountRequired;if(!c)throw new Error("Missing amount in payment requirements");this.log("Building EVM transaction:",{from:t.address,to:o,amount:c,asset:a,network:e.network});let l=this.getChainId(e.network),s={name:i?.name??"USD Coin",version:i?.version??"2",chainId:BigInt(l),verifyingContract:a},p={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"}]},f=new Uint8Array(32);(globalThis.crypto??(await import("crypto")).webcrypto).getRandomValues(f);let g="0x"+[...f].map(y=>y.toString(16).padStart(2,"0")).join(""),w=Math.floor(Date.now()/1e3),u={from:t.address,to:o,value:c,validAfter:String(w-600),validBefore:String(w+(e.maxTimeoutSeconds||60)),nonce:g},A={from:t.address,to:o,value:BigInt(c),validAfter:BigInt(w-600),validBefore:BigInt(w+(e.maxTimeoutSeconds||60)),nonce:g};if(!t.signTypedData)throw new Error("Wallet does not support signTypedData (EIP-712)");let m=await t.signTypedData({domain:s,types:p,primaryType:"TransferWithAuthorization",message:A});return this.log("EIP-712 signature obtained"),{serialized:JSON.stringify({authorization:u,signature:m}),signature:m,settlementProbe:{kind:"eip3009",from:t.address,nonce:g,asset:a,chainId:l}}}async buildApprovalTransaction(e,t,r){let{payTo:o,asset:a,extra:i}=e,c=e.amount??e.maxAmountRequired;if(!c)throw new Error("Missing amount in payment requirements");let l=i?.facilitatorContract;if(!l)throw new Error("exact-approval scheme requires extra.facilitatorContract from the facilitator. The /supported endpoint should provide this.");if(!t.signTypedData)throw new Error("Wallet does not support signTypedData (EIP-712)");this.log("Building approval-based transaction:",{from:t.address,to:o,amount:c,asset:a,network:e.network,facilitatorContract:l});let s=r||this.getDefaultRpcUrl(e.network),p=i?.fee??"0",f=BigInt(c)+BigInt(p),g=await this.readAllowance(s,a,t.address,l);if(g<f){if(!t.sendTransaction)throw new Error("BSC payments require a wallet that supports sendTransaction for the one-time token approval. Use createEvmKeypairWallet() or a browser wallet with transaction support.");let $=this.calculateApprovalAmount(c,p,i?.approvalStrategy);this.log(`Approving ${$} for ${l} (current allowance: ${g})`);let b=await t.sendTransaction({to:a,data:this.encodeApprove(l,$),value:0n});this.log(`Approval tx sent: ${b}`),await this.waitForReceipt(s,b),this.log("Approval confirmed")}else this.log("Sufficient allowance, skipping approval");let w=new Uint8Array(16);(globalThis.crypto??(await import("crypto")).webcrypto).getRandomValues(w);let u=[...w].reduce(($,b)=>$*256n+BigInt(b),0n).toString(),A=new Uint8Array(32);(globalThis.crypto??(await import("crypto")).webcrypto).getRandomValues(A);let m="0x"+[...A].map($=>$.toString(16).padStart(2,"0")).join(""),y=Math.floor(Date.now()/1e3)+(e.maxTimeoutSeconds||300),S=i?.eip712Domain,P=S?{name:S.name,version:S.version,chainId:BigInt(S.chainId),verifyingContract:S.verifyingContract}:{name:"DexterBSCFacilitator",version:"1",chainId:BigInt(this.getChainId(e.network)),verifyingContract:l},O=i?.eip712Types??{Payment:[{name:"from",type:"address"},{name:"to",type:"address"},{name:"token",type:"address"},{name:"amount",type:"uint256"},{name:"fee",type:"uint256"},{name:"nonce",type:"uint256"},{name:"deadline",type:"uint256"},{name:"paymentId",type:"bytes32"}]},X={from:t.address,to:o,token:a,amount:BigInt(c),fee:BigInt(p),nonce:BigInt(u),deadline:BigInt(y),paymentId:m},F=await t.signTypedData({domain:P,types:O,primaryType:"Payment",message:X});this.log("EIP-712 Payment signature obtained");let ne={from:t.address,to:o,token:a,amount:c,fee:p,nonce:u,deadline:y,paymentId:m,signature:F};return{serialized:JSON.stringify(ne),signature:F}}async buildPermit2Transaction(e,t,r){let{payTo:o,asset:a}=e,i=e.amount??e.maxAmountRequired;if(!i)throw new Error("Missing amount in payment requirements");if(!t.signTypedData)throw new Error("Wallet does not support signTypedData (EIP-712)");this.log("Building Permit2 transaction:",{from:t.address,to:o,amount:i,asset:a,network:e.network});let c=r||this.getDefaultRpcUrl(e.network),l=await this.readAllowance(c,a,t.address,ee),s;if(l<BigInt(i)){let P=this.encodeApprove(ee,wt);if(t.signTransaction){this.log(`Signing Permit2 approval for relay (current allowance: ${l})`);let O=this.getChainId(e.network),X=await this.readGasPrice(c),F=await this.readNonce(c,t.address),ne=await t.signTransaction({to:a,data:P,chainId:O,gas:50000n,gasPrice:X,nonce:F});s={erc20ApprovalGasSponsoring:{info:{from:t.address,asset:a,spender:ee,amount:wt.toString(),signedTransaction:ne,version:"1"}}},this.log("Permit2 approval signed for facilitator relay")}else if(t.sendTransaction){this.log(`Approving Permit2 directly (current allowance: ${l})`);let O=await t.sendTransaction({to:a,data:P,value:0n});this.log(`Permit2 approval tx sent: ${O}`),await this.waitForReceipt(c,O),this.log("Permit2 approval confirmed")}else throw new Error("Permit2 payments require a wallet that supports signTransaction or sendTransaction for the one-time Permit2 approval. Use createEvmKeypairWallet() or a browser wallet with transaction support.")}else this.log("Sufficient Permit2 allowance, skipping approval");let p=new Uint8Array(32);(globalThis.crypto??(await import("crypto")).webcrypto).getRandomValues(p);let f=[...p].reduce((P,O)=>P*256n+BigInt(O),0n),g=Math.floor(Date.now()/1e3),w=g-600,u=g+(e.maxTimeoutSeconds||300),A=this.getChainId(e.network),m={name:"Permit2",chainId:BigInt(A),verifyingContract:ee},h={permitted:{token:a,amount:BigInt(i)},spender:De,nonce:f,deadline:BigInt(u),witness:{to:o,validAfter:BigInt(w)}},y=await t.signTypedData({domain:m,types:Gt,primaryType:"PermitWitnessTransferFrom",message:h});this.log("Permit2 PermitWitnessTransferFrom signature obtained");let S={signature:y,permit2Authorization:{from:t.address,permitted:{token:a,amount:i},spender:De,nonce:f.toString(),deadline:String(u),witness:{to:o,validAfter:String(w)}}};return{serialized:JSON.stringify(S),signature:y,extensions:s,settlementProbe:{kind:"permit2",from:t.address,nonce:f.toString(),chainId:A}}}async readAllowance(e,t,r,o){let a="0xdd62ed3e",i=r.slice(2).toLowerCase().padStart(64,"0"),c=o.slice(2).toLowerCase().padStart(64,"0"),l=a+i+c;try{let p=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:l},"latest"]})})).json();return p.error||!p.result||p.result==="0x"?0n:BigInt(p.result)}catch{return 0n}}encodeApprove(e,t){let r="0x095ea7b3",o=e.slice(2).toLowerCase().padStart(64,"0"),a=t.toString(16).padStart(64,"0");return r+o+a}async waitForReceipt(e,t,r=3e4){let o=Date.now();for(;Date.now()-o<r;){try{let i=await(await fetch(e,{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({jsonrpc:"2.0",id:1,method:"eth_getTransactionReceipt",params:[t]})})).json();if(i.result){if(i.result.status==="0x0")throw new Error(`Approval transaction reverted: ${t}`);return}}catch(a){if(a instanceof Error&&a.message.includes("reverted"))throw a}await new Promise(a=>setTimeout(a,2e3))}throw new Error(`Approval transaction receipt timeout after ${r}ms: ${t}`)}async readGasPrice(e){try{let r=await(await fetch(e,{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({jsonrpc:"2.0",id:1,method:"eth_gasPrice",params:[]})})).json();return r.result?BigInt(r.result):50000000n}catch{return 50000000n}}async readNonce(e,t){try{let o=await(await fetch(e,{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({jsonrpc:"2.0",id:1,method:"eth_getTransactionCount",params:[t,"latest"]})})).json();return o.result?parseInt(o.result,16):0}catch{return 0}}calculateApprovalAmount(e,t,r){let o=BigInt(e)+BigInt(t);if(!r||r.mode==="exact")return o;let a=BigInt(r.defaultMultiple??10),i=o*a;if(r.maxCapUsd){let c=this.inferDecimals(e),l=BigInt(Math.floor(r.maxCapUsd*Math.pow(10,c)));if(i>l)return l}if(r.exactAboveUsd){let c=this.inferDecimals(e),l=BigInt(Math.floor(r.exactAboveUsd*Math.pow(10,c)));if(BigInt(e)>l)return o}return i}inferDecimals(e){return e.length>12?18:6}};function te(n){return new Ge(n)}function ut(n){if(n===Be||n===At)return!0;let e=n.toLowerCase();for(let t of Object.values(Xe))if(t.toLowerCase()===e)return!0;for(let t of Object.keys(ze))if(t.toLowerCase()===e)return!0;return!1}function Qt(n){return{[Te]:"Solana",[qe]:"Solana Devnet",[He]:"Solana Testnet",solana:"Solana","solana-devnet":"Solana Devnet","solana-testnet":"Solana Testnet",[ae]:"Base",[fe]:"Base Sepolia",[xe]:"Ethereum",[ge]:"Arbitrum",[ye]:"Polygon",[he]:"Optimism",[Ae]:"Avalanche",[Se]:"BSC",[we]:"SKALE Base",[be]:"SKALE Base Sepolia",base:"Base","base-sepolia":"Base Sepolia",ethereum:"Ethereum",arbitrum:"Arbitrum",polygon:"Polygon",optimism:"Optimism",avalanche:"Avalanche",bsc:"BSC","skale-base":"SKALE Base","skale-base-sepolia":"SKALE Base Sepolia"}[n]||n}function bt(n,e){let t=Qt(n);return t===n?e:t}async function Zt(n,e){if(typeof n=="string")return[n,e];if(n instanceof URL)return[n.href,e];let t=n,r=new Headers(t.headers);e?.headers&&new Headers(e.headers).forEach((i,c)=>r.set(c,i));let o={method:e?.method??t.method,headers:r,signal:e?.signal??t.signal,redirect:e?.redirect??t.redirect,credentials:e?.credentials??t.credentials},a=(o.method??"GET").toUpperCase();return e&&"body"in e?o.body=e.body:a!=="GET"&&a!=="HEAD"&&t.body&&(o.body=await t.arrayBuffer()),[t.url,o]}var xt=new WeakMap;function Qe(n){return xt.get(n)}function Ze(n){let{adapters:e=[L({verbose:n.verbose}),te({verbose:n.verbose})],wallets:t,wallet:r,preferredNetwork:o,rpcUrls:a={},maxAmountAtomic:i,fetch:c=globalThis.fetch,verbose:l=!1,accessPass:s,onPaymentRequired:p,onPaymentDispatched:f,maxRetries:g=0,retryDelayMs:w=500}=n,u=l?console.log.bind(console,"[x402]"):()=>{};async function A(b,T){let R;for(let x=0;x<=g;x++)try{let v=await c(b,T);if(v.status>=502&&v.status<=504&&x<g){u(`Retry ${x+1}/${g}: server returned ${v.status}`),await new Promise(_=>setTimeout(_,w*Math.pow(2,x)));continue}return v}catch(v){R=v,x<g&&(u(`Retry ${x+1}/${g}: ${v instanceof Error?v.message:"network error"}`),await new Promise(_=>setTimeout(_,w*Math.pow(2,x))))}throw R}let m=new Map;function h(b){try{let T=new URL(b).host,R=m.get(T);if(R&&R.expiresAt>Date.now()/1e3+10)return R.jwt;R&&m.delete(T)}catch{}return null}function y(b,T){try{let R=new URL(b).host,x=T.split(".");if(x.length===3){let v=JSON.parse(atob(x[1].replace(/-/g,"+").replace(/_/g,"/"))),_=Math.floor(Date.now()/1e3),I=_+86400,K=Math.min(typeof v.exp=="number"?v.exp:_,I);m.set(R,{jwt:T,expiresAt:K}),u("Access pass cached for",R,"| expires:",new Date(K*1e3).toISOString())}}catch{u("Failed to cache access pass")}}let S=t||{};r&&!S.solana&&ie(r)&&(S.solana=r),r&&!S.evm&&ce(r)&&(S.evm=r);function P(b){let T=[];for(let R of b){let x=R.scheme??"exact";if(x!=="exact"&&x!=="exact-approval")continue;let v=e.find(I=>I.canHandle(R.network));if(!v)continue;let _;v.name==="Solana"?_=S.solana:v.name==="EVM"&&(_=S.evm),_&&v.isConnected(_)&&T.push({accept:R,adapter:v,wallet:_})}if(T.length===0)return null;if(o){let R=T.find(x=>x.accept.network===o);if(R)return R}return T[0]}function O(b,T){return bt(b,T)}function X(b,T){return a[b]||T.getDefaultRpcUrl(b)}async function F(b,T,R,x,v){let _="";if(s?.preferTier&&x.tiers){let d=x.tiers.find(E=>E.id===s.preferTier);if(d){if(s.maxSpend&&parseFloat(d.price)>parseFloat(s.maxSpend))throw new C("access_pass_exceeds_max_spend",`Access pass tier "${d.id}" costs $${d.price}, exceeds max spend $${s.maxSpend}`);_=`tier=${d.id}`}}else if(s?.preferDuration&&x.ratePerHour)_=`duration=${s.preferDuration}`;else if(x.tiers&&x.tiers.length>0){let d=x.tiers[0];if(s?.maxSpend&&parseFloat(d.price)>parseFloat(s.maxSpend))throw new C("access_pass_exceeds_max_spend",`Cheapest access pass costs $${d.price}, exceeds max spend $${s?.maxSpend}`);_=`tier=${d.id}`}let I=_?v.includes("?")?`${v}&${_}`:`${v}?${_}`:v;u("Purchasing access pass:",_||"default tier");let K=R.headers.get("PAYMENT-REQUIRED");if(!K)return null;let M;try{M=JSON.parse(atob(K))}catch{return null}let B=P(M.accepts);if(!B)return null;let{accept:N,adapter:q,wallet:pe}=B;if(q.name==="Solana"&&!N.extra?.feePayer)return null;let z=N.extra?.decimals??(ut(N.asset)?6:void 0);if(typeof z!="number")return null;let Ee=N.amount??N.maxAmountRequired;if(!Ee)return null;let Y=X(N.network,q);try{let d=await q.getBalance(N,pe,Y),E=Number(Ee)/Math.pow(10,z);if(d<E){let it=O(N.network,q.name);throw new C("insufficient_balance",`Insufficient balance for access pass on ${it}. Have $${d.toFixed(4)}, need $${E.toFixed(4)}`)}}catch(d){if(d instanceof C)throw d}let G=await q.buildTransaction(N,pe,Y),me;q.name==="EVM"?me=JSON.parse(G.serialized):me={transaction:G.serialized};let re=typeof b=="string"?b:b instanceof URL?b.href:b.url,de=M.resource;if(typeof M.resource=="string")try{let d=new URL(M.resource,re);["http:","https:"].includes(d.protocol)&&(de=d.toString())}catch{}else if(M.resource&&typeof M.resource=="object"&&"url"in M.resource){let d=M.resource;try{let E=new URL(d.url,re);["http:","https:"].includes(E.protocol)&&(de={...d,url:E.toString()})}catch{}}let Ve={x402Version:N.x402Version??2,resource:de,accepted:N,payload:me};G.extensions&&(Ve.extensions=G.extensions);let Q=btoa(JSON.stringify(Ve)),oe=await c(I,{...T,method:"POST",headers:{...T?.headers||{},"Content-Type":"application/json","PAYMENT-SIGNATURE":Q}});if(!oe.ok)return u("Pass purchase failed:",oe.status),null;let W=oe.headers.get("ACCESS-PASS");return W&&(y(v,W),u("Access pass purchased and cached")),oe}async function ne(b,T){let R=b;if(u("Making request:",R),s){let d=h(R);if(d){u("Using cached access pass");let E=await c(b,{...T,headers:{...T?.headers||{},Authorization:`Bearer ${d}`}});if(E.status!==401&&E.status!==402)return E;u("Cached pass rejected (status",E.status,"), purchasing new pass");try{m.delete(new URL(R).host)}catch{}}}let x=await A(b,T);if(x.status!==402)return x;u("Received 402 Payment Required");let v=x.headers.get("X-ACCESS-PASS-TIERS");if(s&&v){u("Server offers access passes, purchasing...");try{let d=JSON.parse(atob(v)),E=await F(b,T,x,d,R);if(E)return E}catch(d){u("Access pass purchase failed, falling back to per-request payment:",d)}}let _=x.headers.get("PAYMENT-REQUIRED");if(!_)throw new C("missing_payment_required_header","Server returned 402 but no PAYMENT-REQUIRED header");let I;try{let d=atob(_);I=JSON.parse(d)}catch{throw new C("invalid_payment_required","Failed to decode PAYMENT-REQUIRED header")}u("Payment requirements:",I);let K=x.headers.get("X-Quote-Hash");K&&u("Quote hash received:",K);let M=P(I.accepts);if(!M){let d=I.accepts.map(E=>E.network).join(", ");throw new C("no_matching_payment_option",`No connected wallet for any available network: ${d}`)}let{accept:B,adapter:N,wallet:q}=M;if(u(`Using ${N.name} for ${B.network}`),N.name==="Solana"&&!B.extra?.feePayer)throw new C("missing_fee_payer","Solana payment option missing feePayer in extra");let pe=B.extra?.decimals??(ut(B.asset)?6:void 0);if(typeof pe!="number")throw new C("missing_decimals","Payment option missing decimals - provide in extra or use a known stablecoin");let z=B.amount??B.maxAmountRequired;if(!z)throw new C("missing_amount","Payment option missing amount");if(i&&BigInt(z)>BigInt(i))throw new C("amount_exceeds_max",`Payment amount ${z} exceeds maximum ${i}`);let Ee=X(B.network,N);u("Checking balance...");try{let d=await N.getBalance(B,q,Ee),E=Number(z)/Math.pow(10,pe);if(d<E){let it=O(B.network,N.name);throw new C("insufficient_balance",`Insufficient balance on ${it}. Have $${d.toFixed(4)}, need $${E.toFixed(4)}`)}u(`Balance OK: $${d.toFixed(4)} >= $${E.toFixed(4)}`)}catch(d){if(d instanceof C)throw d;u("Balance check failed (RPC error), proceeding with transaction attempt")}if(p&&!await p(B))throw new C("payment_rejected","Payment rejected by onPaymentRequired callback");u("Building transaction...");let Y=await N.buildTransaction(B,q,Ee);u("Transaction signed");let G;N.name==="EVM"?G=JSON.parse(Y.serialized):G={transaction:Y.serialized};let me=b,re=I.resource;if(typeof I.resource=="string")try{let d=new URL(I.resource,me).toString();d!==I.resource&&u("Resolved relative resource URL:",I.resource,"\u2192",d),re=d}catch{re=I.resource}else if(I.resource&&typeof I.resource=="object"&&"url"in I.resource){let d=I.resource;try{let E=new URL(d.url,me).toString();E!==d.url&&(u("Resolved relative resource URL:",d.url,"\u2192",E),re={...d,url:E})}catch{}}let de={x402Version:B.x402Version??2,resource:re,accepted:B,payload:G};Y.extensions&&(de.extensions=Y.extensions);let Ve=btoa(JSON.stringify(de));if(f)try{f(B,Y.settlementProbe)}catch{}u("Retrying request with payment...");let Q=await A(b,{...T,headers:{...T?.headers||{},"PAYMENT-SIGNATURE":Ve,...K?{"X-Quote-Hash":K}:{}}});if(u("Retry response status:",Q.status),Q.status===402){let d="unknown";try{let E=await Q.clone().json();d=String(E.error||E.message||JSON.stringify(E)),u("Rejection reason:",d)}catch{}throw new C("payment_rejected",`Payment was rejected by the server: ${d}`)}let oe=Q.headers.get("PAYMENT-RESPONSE"),W;if(oe)try{W=JSON.parse(atob(oe))}catch{}return W??={},W.amountAtomic=z,W.assetDecimals=pe,xt.set(Q,W),W.extensions&&u("Settlement extensions:",Object.keys(W.extensions).join(", ")),Q}async function $(b,T){let[R,x]=await Zt(b,T);return ne(R,x)}return{fetch:$}}var nn=require("@solana/web3.js"),et=require("@noble/hashes/utils");var en=Z(require("tweetnacl"),1);var $e=require("@dexterai/vault/messages");var tn=require("@noble/hashes/sha256");function Et(n){return Buffer.from(JSON.stringify({payload:n.payload,sessionPublicKey:(0,et.bytesToHex)(n.sessionPublicKey),sessionRegistration:(0,et.bytesToHex)(n.sessionRegistration),sessionSignature:(0,et.bytesToHex)(n.sessionSignature)}),"utf8").toString("base64")}function J(n){if(n instanceof Error){if(n.message&&n.message.length>0)return n.message;if(n.name&&n.name.length>0)return n.name}let e=String(n);return e.length>0?e:"unknown error"}async function Ke(n){let e="";try{e=(await n.clone().text()).slice(0,600)}catch{}let t=e.toLowerCase(),r=t.includes("settle")||t.includes("facilitator"),o=e;try{let a=JSON.parse(e),i=[a.error,a.detail,a.message].filter(c=>typeof c=="string"&&c.length>0);i.length>0&&(o=i.join(" \u2014 "))}catch{}return o||(o=`HTTP ${n.status}`),{reason:r?"settlement_failed":"merchant_rejected",detail:`merchant HTTP ${n.status}: ${o}`}}var tt="Payment authorization was sent, but the merchant did not respond within the timeout. ",nt=" Do not retry without checking \u2014 inspect the funding wallet for a transfer to the merchant before attempting payment again.";async function rt(n,e,t){if(!n)return{confirmed:!1,detail:tt+"This payment scheme has no on-chain confirmation check, so the SDK cannot verify whether it settled."+nt};try{if(n.kind==="solana"){let i=L(),c=t??i.getDefaultRpcUrl(e.caip2);if(!i.confirmSettlement)return Pt();let l=await i.confirmSettlement(n,c);return l.settled?{confirmed:!0,txSignature:l.txSignature}:Tt()}let r=te(),o=r.getDefaultRpcUrl(e.caip2);if(!r.confirmSettlement)return Pt();let a=await r.confirmSettlement(n,o);return a.settled?{confirmed:!0,txSignature:a.txSignature}:Tt()}catch(r){return{confirmed:!1,detail:tt+`On-chain confirmation could not be completed (${J(r)}).`+nt}}}function Tt(){return{confirmed:!1,detail:tt+"On-chain confirmation found no matching settlement yet \u2014 the payment may still be pending, or may not have settled."+nt}}function Pt(){return{confirmed:!1,detail:tt+"The chain adapter does not support on-chain confirmation."+nt}}var Rt=[{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:"solana:5eykt4UsFv8P8NJdTREpY1vzqKqZKvdp",bare:"solana",family:"svm"}],rn=new Map(Rt.map(n=>[n.caip2.toLowerCase(),n])),on=new Map(Rt.map(n=>[n.bare.toLowerCase(),n]));function le(n){if(!n)return null;let e=n.toLowerCase(),t=rn.get(e)||on.get(e);return t?{caip2:t.caip2,bare:t.bare,family:t.family}:null}function pt(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 an(n){let e=[];for(let t of n){if(!t||typeof t!="object")continue;let r=t,o=le(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 vt(n){let e=n.headers.get("payment-required");if(!e)return null;let t;try{t=pt(e)}catch{return null}let r=Array.isArray(t.accepts)?t.accepts:[];return r.length===0?null:{x402Version:2,options:an(r),resourceUrl:t.resource&&typeof t.resource=="object"?String(t.resource.url??""):void 0}}var sn=new Set(["exact","exact-approval"]);async function cn(n,e,t,r){let o;try{o=await r.signNextVoucher(t.amount)}catch{return null}let a=new Headers(e.headers??void 0);a.set("X-Tab-Voucher",Et(o));let i={method:e.method??"GET",headers:a};e.signal&&(i.signal=e.signal),typeof e.body=="string"&&(i.body=e.body);let c;try{c=await fetch(n,i)}catch(l){return{ok:!1,reason:"error",detail:l?.message??String(l)}}return c.status===402?(r.rollbackVoucher?.call(r,o),null):c.ok?{ok:!0,paid:!0,response:c,amountPaid:t.amount,network:t.network}:{ok:!1,...await Ke(c)}}var Ct={version:2,async parseChallenge(n){return vt(n)},async pay(n,e,t,r,o){if(o.tab){let h=t.options.find(y=>y.scheme==="tab"&&y.network.family==="svm"&&y.payTo===o.tab.counterparty);if(h){let y=await cn(n,e,h,o.tab);if(y)return y}}let a=t.options.filter(h=>sn.has(h.scheme));if(a.length===0)return{ok:!1,reason:"no_payment_options",detail:`no generically payable scheme offered (got: ${t.options.map(h=>h.scheme).join(", ")})`};let i=a.find(h=>h.network.family==="evm"?!!r.evm:h.network.family==="svm"?!!r.solana:!1);if(!i)return{ok:!1,reason:"unsupported_network"};let c=o.timeoutMs??15e3,l=o.responseTimeoutMs??12e4,s=new AbortController,p=setTimeout(()=>s.abort(),c),f=!1,g,w=(h,y)=>{f=!0,g=y,clearTimeout(p),p=setTimeout(()=>s.abort(),l)},u=Ze({wallets:r,preferredNetwork:i.network.caip2,maxAmountAtomic:o.maxAmountAtomic,fetch:globalThis.fetch,onPaymentDispatched:w}),A=e.signal?AbortSignal.any([e.signal,s.signal]):s.signal,m={method:e.method??"GET",headers:e.headers,signal:A};typeof e.body=="string"&&(m.body=e.body);try{let h=await u.fetch(n,m);if(clearTimeout(p),!h.ok)return{ok:!1,...await Ke(h)};let y,S=h.headers.get("PAYMENT-RESPONSE");if(S)try{let P=pt(S);P&&typeof P.transaction=="string"&&(y=P.transaction)}catch{}return{ok:!0,paid:!0,response:h,amountPaid:i.amount,network:i.network,txSignature:y}}catch(h){clearTimeout(p);let y=h;if(y?.name==="AbortError"){if(!f)return{ok:!1,reason:"timeout"};let S=await rt(g,i.network,o.solanaRpcUrl);return S.confirmed?{ok:!0,paid:!0,response:void 0,amountPaid:i.amount,network:i.network,txSignature:S.txSignature}:{ok:!1,reason:"payment_unconfirmed",detail:S.detail}}return{ok:!1,reason:"error",detail:y?.message??String(h)}}}};var _t=require("viem");var ln={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 un(){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 pn(n,e,t){if(typeof n.signTypedData!="function")throw new Error("EVM wallet does not support signTypedData");let r=Math.floor(Date.now()/1e3),o=String(r-600),a=String(r+(e.maxTimeoutSeconds??60)),i={from:n.address,to:e.payTo,value:e.amount,validAfter:o,validBefore:a,nonce:await un()},c=Me[e.network.caip2];if(c===void 0)throw new Error(`unknown chain id for network ${e.network.caip2}`);let l=e.extra,s=await n.signTypedData({domain:{name:l.name,version:l.version,chainId:c,verifyingContract:(0,_t.getAddress)(e.asset)},types:ln,primaryType:"TransferWithAuthorization",message:i});return{payment:{x402Version:1,scheme:e.scheme,network:t,payload:{signature:s,authorization:i}},settlementProbe:{kind:"eip3009",from:i.from,nonce:i.nonce,asset:e.asset,chainId:c}}}async function We(n,e,t){try{let r;for(let o of n.options){let a=o.network.family==="evm"&&!!e.evm||o.network.family==="svm"&&!!e.solana;if(o.scheme!=="exact"){a&&(r=o.scheme);continue}if(o.network.family==="evm"&&e.evm){let i=await e.evm;return await mn(o,i,t)}if(o.network.family==="svm"&&e.solana){let i=await e.solana;return await dn(o,i,t)}}return r!==void 0?{ok:!1,reason:"merchant_rejected",detail:`v1 supports only the 'exact' scheme, got '${r}'`}:{ok:!1,reason:"unsupported_network"}}catch(r){return{ok:!1,reason:"error",detail:J(r)}}}async function mn(n,e,t){if(t.maxAmountAtomic!==void 0&&BigInt(n.amount)>BigInt(t.maxAmountAtomic))return{ok:!1,reason:"budget_exceeded"};let r=n.extra??{},o=r.name,a=r.version;if(typeof o!="string"||o.length===0||typeof a!="string"||a.length===0)return{ok:!1,reason:"merchant_rejected",detail:"v1 challenge missing exact-scheme EIP-712 domain (extra.name / extra.version)"};let i=n.network.bare,{payment:c,settlementProbe:l}=await pn(e,n,i);return{ok:!0,headerValue:Buffer.from(JSON.stringify(c),"utf8").toString("base64"),option:n,settlementProbe:l}}async function dn(n,e,t){if(t.maxAmountAtomic!==void 0&&BigInt(n.amount)>BigInt(t.maxAmountAtomic))return{ok:!1,reason:"budget_exceeded"};if(n.scheme!=="exact")return{ok:!1,reason:"merchant_rejected",detail:`v1 SVM supports only the 'exact' scheme, got '${n.scheme}'`};let r=n.extra??{};if(typeof r.feePayer!="string"||r.feePayer.length===0)return{ok:!1,reason:"merchant_rejected",detail:"v1 SVM challenge missing extra.feePayer (required as the transaction fee payer)"};let o=n.network.bare,a={x402Version:1,scheme:n.scheme,network:o,asset:n.asset,payTo:n.payTo,amount:n.amount,maxAmountRequired:n.amount,maxTimeoutSeconds:n.maxTimeoutSeconds??60,extra:r},c=await L().buildTransaction(a,e,t.solanaRpcUrl),l={x402Version:1,scheme:n.scheme,network:o,payload:{transaction:c.serialized}};return{ok:!0,headerValue:Buffer.from(JSON.stringify(l),"utf8").toString("base64"),option:n,settlementProbe:c.settlementProbe}}function fn(n){let e=[];for(let t of n){if(!t||typeof t!="object")continue;let r=t,o=le(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 It={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=fn(t);return r.length===0?null:{x402Version:1,options:r}},async pay(n,e,t,r,o){let a,i=new AbortController,c=!1,l,s;try{let p=o.timeoutMs??15e3;a=setTimeout(()=>i.abort(),p);let f=await We(t,r,o);if(!f.ok)return{ok:!1,reason:f.reason,detail:f.detail};let g=f.headerValue,w=f.option;s=w,l=f.settlementProbe;let u=new Headers(e.headers??void 0);u.set("X-PAYMENT",g);let A=e.signal!=null?AbortSignal.any([e.signal,i.signal]):i.signal,m={method:e.method,headers:u,signal:A};typeof e.body=="string"&&(m.body=e.body),c=!0,clearTimeout(a);let h=o.responseTimeoutMs??12e4;a=setTimeout(()=>i.abort(),h);let y=await fetch(n,m);return y.ok?{ok:!0,paid:!0,response:y,amountPaid:w.amount,network:w.network,txSignature:gn(y)}:{ok:!1,...await Ke(y)}}catch(p){if(p instanceof Error&&p.name==="AbortError"){if(!c)return{ok:!1,reason:"timeout"};let f=await rt(l,s.network,o.solanaRpcUrl);return f.confirmed?{ok:!0,paid:!0,response:void 0,amountPaid:s.amount,network:s.network,txSignature:f.txSignature}:{ok:!1,reason:"payment_unconfirmed",detail:f.detail}}return{ok:!1,reason:"error",detail:J(p)}}finally{a!==void 0&&clearTimeout(a)}}};function gn(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 Dt=Z(require("tweetnacl"),1);var V=require("@solana/web3.js"),ue=Symbol.for("x402:keypair");async function ot(n){let e;if(typeof n=="string"){let t;try{let r=await Promise.resolve().then(()=>(Ut(),Ot)),o=r.decode??r.default?.decode;if(!o)throw new Error("decode not found");t=o}catch{throw new Error('The "bs58" package is required for base58 private keys. Install it with: npm install bs58')}try{let r=t(n);e=V.Keypair.fromSecretKey(r)}catch{try{let o=JSON.parse(n);if(Array.isArray(o))e=V.Keypair.fromSecretKey(Uint8Array.from(o));else throw new Error("Invalid private key format")}catch{throw new Error("Invalid private key. Expected base58 string or JSON array of bytes.")}}}else if(Array.isArray(n))e=V.Keypair.fromSecretKey(Uint8Array.from(n));else if(n instanceof Uint8Array)e=V.Keypair.fromSecretKey(n);else throw new Error("Invalid private key type. Expected string, number[], or Uint8Array.");return{publicKey:{toBase58:()=>e.publicKey.toBase58()},signTransaction:async t=>{if(t instanceof V.VersionedTransaction)return t.sign([e]),t;if(t instanceof V.Transaction)return t.sign(e),t;throw new Error("Unknown transaction type")},[ue]:e}}function Bt(n){if(!n||typeof n!="object")return!1;let e=n;return ue in e&&e[ue]instanceof V.Keypair&&"publicKey"in e&&"signTransaction"in e}function Le(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[ue];if(r&&r.secretKey&&r.publicKey)return{publicKey:r.publicKey,signMessage:async o=>Dt.sign.detached(o,r.secretKey)}}return null}var Mt=[Ct,It];async function mt(n){for(let e of Mt)if(await e.parseChallenge(n.clone()))return e;return null}async function Sn(n){let e=Le(n);if(!e)return fetch;try{return(await import("@x402/extensions/sign-in-with-x")).wrapFetchWithSIWx(fetch,e)}catch(t){return console.warn(`[x402] SIW-X unavailable \u2014 @x402/extensions failed to load; SIW-X merchants will not authenticate. ${J(t)}`),fetch}}async function dt(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 Sn(t))(n,{...e})}catch(a){return{ok:!1,reason:"error",detail:J(a)}}if(o.status!==402)return{ok:!0,paid:!1,response:o};for(let a of Mt){let i=await a.parseChallenge(o.clone());if(i)return a.pay(n,e,i,t,r)}return{ok:!1,reason:"no_payment_options"}}async function at(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 $t(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 st(n){let e=Qe(n);if(e?.extensions?.["sponsored-access"])return e.extensions["sponsored-access"]}function Kt(n){let e=st(n);if(e?.recommendations?.length)return e.recommendations}async function Wt(n){let t=st(n)?.tracking?.impressionBeacon;if(!t)return!1;try{await fetch(t,{method:"GET"})}catch{}return!0}function Lt(n,e){let{walletPrivateKey:t,evmPrivateKey:r,preferredNetwork:o,rpcUrls:a,maxAmountAtomic:i,verbose:c,accessPass:l,onPaymentRequired:s}=e;if(!t&&!r)throw new Error("At least one wallet private key is required (walletPrivateKey or evmPrivateKey)");let p={},f=[];t&&f.push(ot(t).then(m=>{p.solana=m}).catch(m=>{console.warn(`[x402] Solana wallet init failed: ${m.message}`)})),r&&f.push(at(r).then(m=>{p.evm=m}).catch(m=>{console.warn(`[x402] EVM wallet init failed: ${m.message}`)}));let g=f.length>0?Promise.all(f):null,u=Ze({wallets:p,preferredNetwork:o,rpcUrls:a,maxAmountAtomic:i,fetch:n,verbose:c,accessPass:l,onPaymentRequired:s}),A=u.fetch.bind(u);return g?(async(m,h)=>(await g,A(m,h))):A}function Vt(n){let{budget:e,allowedDomains:t,onPaymentRequired:r,...o}=n,a=parseFloat(e.total),i=e.perRequest?parseFloat(e.perRequest):1/0,c=e.perHour?parseFloat(e.perHour):1/0;if(isNaN(a)||a<=0)throw new Error("budget.total must be a positive number");let l=[],s=0;function p(){return l.reduce((u,A)=>u+A.amount,0)}function f(){let u=Date.now()-36e5;return l.filter(A=>A.timestamp>=u).reduce((A,m)=>A+m.amount,0)}let g=Lt(fetch,{...o,onPaymentRequired:async u=>{let A=u.extra?.decimals??6,m=Number(u.amount)/Math.pow(10,A);if(m>i)throw new C("amount_exceeds_max",`$${m.toFixed(4)} exceeds per-request limit of $${i.toFixed(2)}`);let h=p();if(h+m>a)throw new C("amount_exceeds_max",`Budget exceeded. Spent $${h.toFixed(2)} of $${a.toFixed(2)}, payment: $${m.toFixed(4)}`);let y=f();if(y+m>c)throw new C("amount_exceeds_max",`Hourly limit ($${c.toFixed(2)}) exceeded. Spent $${y.toFixed(2)} this hour`);return s=m,r?r(u):!0}});return{fetch:(async(u,A)=>{let m=typeof u=="string"?u:u instanceof URL?u.href:u.url,h="unknown";try{h=new URL(m).hostname}catch{}if(t&&!t.some(S=>h===S||h.endsWith(`.${S}`)))throw new C("payment_rejected",`Domain "${h}" not in allowed domains`);s=0;let y=await g(u,A);if(s>0){let S="unknown",P=y.headers.get("PAYMENT-RESPONSE");if(P)try{S=JSON.parse(atob(P)).network||S}catch{}l.push({amount:s,domain:h,network:S,timestamp:Date.now()}),s=0}return y}),get spent(){return`$${p().toFixed(2)}`},get remaining(){return`$${(a-p()).toFixed(2)}`},get payments(){return l.length},get spentAmount(){return p()},get remainingAmount(){return a-p()},get ledger(){return l},get hourlySpend(){return f()},reset(){l=[]}}}var ft=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});
@@ -3,7 +3,7 @@ import { W as WalletSet, S as SettlementProbe, a as SolanaWallet, E as EvmWallet
3
3
  export { e as AccessPassInfo, d as AccessPassTier, C as ChainAdapter, X as X402Error, b as createEvmAdapter, c as createSolanaAdapter } from '../types-xQu1U4xk.cjs';
4
4
  import { SIWxSigner } from '@x402/extensions/sign-in-with-x';
5
5
  import { Keypair } from '@solana/web3.js';
6
- export { P as PaymentReceipt, d as X402Client, X as X402ClientConfig, c as createX402Client, f as fireImpressionBeacon, b as getPaymentReceipt, a as getSponsoredAccessInfo, g as getSponsoredRecommendations } from '../x402-client-DmRbvqoc.cjs';
6
+ export { P as PaymentReceipt, f as fireImpressionBeacon, b as getPaymentReceipt, a as getSponsoredAccessInfo, g as getSponsoredRecommendations } from '../x402-client-BQKDeNxq.cjs';
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, S as SOLANA_MAINNET, U as USDC_MINT } from '../constants-D41hDAG6.cjs';
9
9
  export { SponsoredAccessSettlementInfo, SponsoredRecommendation } from '@dexterai/x402-ads-types';
@@ -104,19 +104,22 @@ declare function buildV1PaymentHeader(challenge: PaymentChallenge, wallets: Wall
104
104
  *
105
105
  * @example
106
106
  * ```typescript
107
- * import { createX402Client, createKeypairWallet } from '@dexterai/x402/client';
107
+ * import { payAndFetch, createKeypairWallet } from '@dexterai/x402/client';
108
108
  *
109
109
  * // From base58 private key
110
- * const wallet = createKeypairWallet('5abc...xyz');
110
+ * const solana = await createKeypairWallet('5abc...xyz');
111
111
  *
112
112
  * // Or from a JSON array (like in id.json files)
113
- * const wallet = createKeypairWallet([1,2,3,...64 bytes]);
114
- *
115
- * const client = createX402Client({
116
- * wallets: { solana: wallet },
117
- * });
118
- *
119
- * const response = await client.fetch('https://api.example.com/protected');
113
+ * const solana = await createKeypairWallet([1,2,3,...64 bytes]);
114
+ *
115
+ * const result = await payAndFetch(
116
+ * 'https://api.example.com/protected',
117
+ * undefined,
118
+ * { solana },
119
+ * );
120
+ * if (result.ok) {
121
+ * const data = await result.response.json();
122
+ * }
120
123
  * ```
121
124
  */
122
125
 
@@ -143,7 +146,7 @@ interface KeypairWallet extends SolanaWallet {
143
146
  * Create a wallet from a Solana private key
144
147
  *
145
148
  * @param privateKey - Base58 encoded private key string, or Uint8Array/number[] of 64 bytes
146
- * @returns Wallet interface compatible with createX402Client
149
+ * @returns Wallet interface for the `solana` slot of a `payAndFetch` WalletSet
147
150
  *
148
151
  * @example Base58 private key
149
152
  * ```typescript
@@ -177,16 +180,19 @@ declare function isKeypairWallet(wallet: unknown): wallet is KeypairWallet;
177
180
  *
178
181
  * @example
179
182
  * ```typescript
180
- * import { createX402Client, createEvmKeypairWallet } from '@dexterai/x402/client';
183
+ * import { payAndFetch, createEvmKeypairWallet } from '@dexterai/x402/client';
181
184
  *
182
185
  * // From hex private key (with or without 0x prefix)
183
- * const wallet = await createEvmKeypairWallet('0xabc123...');
184
- *
185
- * const client = createX402Client({
186
- * wallets: { evm: wallet },
187
- * });
188
- *
189
- * const response = await client.fetch('https://api.example.com/protected');
186
+ * const evm = await createEvmKeypairWallet('0xabc123...');
187
+ *
188
+ * const result = await payAndFetch(
189
+ * 'https://api.example.com/protected',
190
+ * undefined,
191
+ * { evm },
192
+ * );
193
+ * if (result.ok) {
194
+ * const data = await result.response.json();
195
+ * }
190
196
  * ```
191
197
  */
192
198
 
@@ -201,30 +207,20 @@ declare function isKeypairWallet(wallet: unknown): wallet is KeypairWallet;
201
207
  * to ensure compatibility with both ESM and CJS consumers.
202
208
  *
203
209
  * @param privateKey - Hex-encoded private key (with or without 0x prefix)
204
- * @returns Wallet interface compatible with createX402Client's `wallets.evm`
210
+ * @returns Wallet interface for the `evm` slot of a `payAndFetch` WalletSet
205
211
  * @throws If viem is not installed or the private key is invalid
206
212
  *
207
213
  * @example From environment variable
208
214
  * ```typescript
209
- * const wallet = await createEvmKeypairWallet(process.env.BASE_PRIVATE_KEY!);
215
+ * const evm = await createEvmKeypairWallet(process.env.BASE_PRIVATE_KEY!);
210
216
  * ```
211
217
  *
212
- * @example With createX402Client
218
+ * @example Both chains in one WalletSet
213
219
  * ```typescript
214
- * const client = createX402Client({
215
- * wallets: {
216
- * solana: createKeypairWallet(process.env.SOLANA_KEY!),
217
- * evm: await createEvmKeypairWallet(process.env.BASE_KEY!),
218
- * },
219
- * });
220
- * ```
221
- *
222
- * @example With wrapFetch (automatic -- you don't need this directly)
223
- * ```typescript
224
- * const x402Fetch = wrapFetch(fetch, {
225
- * evmPrivateKey: process.env.BASE_PRIVATE_KEY!,
220
+ * const result = await payAndFetch(url, undefined, {
221
+ * solana: await createKeypairWallet(process.env.SOLANA_KEY!),
222
+ * evm: await createEvmKeypairWallet(process.env.BASE_KEY!),
226
223
  * });
227
- * // wrapFetch calls createEvmKeypairWallet internally
228
224
  * ```
229
225
  */
230
226
  declare function createEvmKeypairWallet(privateKey: string): Promise<EvmWallet>;
@@ -296,40 +292,6 @@ interface WrapFetchOptions {
296
292
  */
297
293
  onPaymentRequired?: (requirements: PaymentAccept) => boolean | Promise<boolean>;
298
294
  }
299
- /**
300
- * Wrap fetch with automatic x402 payment handling
301
- *
302
- * @deprecated Slated for removal in `@dexterai/x402` 5.0. Use `payAndFetch`
303
- * instead — it's version-agnostic across x402 v1 and v2 and returns a
304
- * discriminated union that separates merchant rejection from settlement
305
- * failure. Migration: `wrapFetch(fetch, { walletPrivateKey })` →
306
- * `payAndFetch(url, init, { solana: createKeypairWallet(pk) })`.
307
- *
308
- * @param fetchImpl - The fetch function to wrap (usually `fetch` or `node-fetch`)
309
- * @param options - Configuration options
310
- * @returns A fetch function that handles x402 payments automatically
311
- *
312
- * @example Basic usage
313
- * ```typescript
314
- * import { wrapFetch } from '@dexterai/x402/client';
315
- *
316
- * const x402Fetch = wrapFetch(fetch, {
317
- * walletPrivateKey: process.env.SOLANA_PRIVATE_KEY!,
318
- * });
319
- *
320
- * const response = await x402Fetch('https://api.example.com/protected');
321
- * ```
322
- *
323
- * @example With options
324
- * ```typescript
325
- * const x402Fetch = wrapFetch(fetch, {
326
- * walletPrivateKey: process.env.SOLANA_PRIVATE_KEY!,
327
- * maxAmountAtomic: '1000000', // Max $1.00 per request
328
- * verbose: true,
329
- * });
330
- * ```
331
- */
332
- declare function wrapFetch(fetchImpl: typeof globalThis.fetch, options: WrapFetchOptions): typeof globalThis.fetch;
333
295
 
334
296
  /**
335
297
  * Budget Account — Autonomous Agent Spending Controls
@@ -416,4 +378,4 @@ interface BudgetAccount {
416
378
  */
417
379
  declare function createBudgetAccount(config: BudgetAccountConfig): BudgetAccount;
418
380
 
419
- export { AccessPassClientConfig, type BudgetAccount, type BudgetAccountConfig, type BudgetConfig, ChallengeOption, KEYPAIR_SYMBOL, type KeypairWallet, NetworkRef, PayAndFetchOptions, PayResult, PaymentChallenge, type PaymentRecord, PaymentStrategy, type V1HeaderResult, WalletSet, type WrapFetchOptions, buildV1PaymentHeader, createBudgetAccount, createEvmKeypairWallet, createKeypairWallet, detectStrategy, isEvmKeypairWallet, isKeypairWallet, payAndFetch, toNetworkRef, toSiwxSigner, wrapFetch };
381
+ export { AccessPassClientConfig, type BudgetAccount, type BudgetAccountConfig, type BudgetConfig, ChallengeOption, KEYPAIR_SYMBOL, type KeypairWallet, NetworkRef, PayAndFetchOptions, PayResult, PaymentChallenge, type PaymentRecord, PaymentStrategy, type V1HeaderResult, WalletSet, buildV1PaymentHeader, createBudgetAccount, createEvmKeypairWallet, createKeypairWallet, detectStrategy, isEvmKeypairWallet, isKeypairWallet, payAndFetch, toNetworkRef, toSiwxSigner };