@dexterai/x402 6.0.0-rc.4 → 6.0.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/CHANGELOG.md +54 -0
- package/README.md +5 -1
- package/REFERENCE.md +33 -3
- package/dist/adapters/index.d.cts +3 -2
- package/dist/adapters/index.d.ts +3 -2
- package/dist/batch-settlement/index.cjs +1 -1
- package/dist/batch-settlement/index.d.cts +4 -3
- package/dist/batch-settlement/index.d.ts +4 -3
- package/dist/batch-settlement/index.js +1 -1
- package/dist/batch-settlement/seller/index.cjs +1 -1
- package/dist/batch-settlement/seller/index.d.cts +5 -4
- package/dist/batch-settlement/seller/index.d.ts +5 -4
- package/dist/batch-settlement/seller/index.js +1 -1
- package/dist/client/index.d.cts +5 -3
- package/dist/client/index.d.ts +5 -3
- package/dist/mcp/index.cjs +1 -0
- package/dist/mcp/index.d.cts +183 -0
- package/dist/mcp/index.d.ts +183 -0
- package/dist/mcp/index.js +1 -0
- package/dist/react/index.d.cts +2 -2
- package/dist/react/index.d.ts +2 -2
- package/dist/server/index.cjs +1 -1
- package/dist/server/index.d.cts +5 -4
- package/dist/server/index.d.ts +5 -4
- package/dist/server/index.js +1 -1
- package/dist/tab/adapters/solana/index.cjs +1 -1
- package/dist/tab/adapters/solana/index.d.cts +3 -2
- package/dist/tab/adapters/solana/index.d.ts +3 -2
- package/dist/tab/adapters/solana/index.js +1 -1
- package/dist/tab/index.cjs +4 -4
- package/dist/tab/index.d.cts +3 -2
- package/dist/tab/index.d.ts +3 -2
- package/dist/tab/index.js +1 -1
- package/dist/tab/seller/index.cjs +7 -7
- package/dist/tab/seller/index.js +1 -1
- package/dist/{types-CHQzNDR6.d.ts → types-BvK5UjA9.d.ts} +1 -1
- package/dist/{types-BvQpNtFw.d.cts → types-C08JT9MG.d.ts} +2 -236
- package/dist/{types-CkcNYx1Q.d.ts → types-C6IbRTpi.d.ts} +1 -1
- package/dist/{types-BvQpNtFw.d.ts → types-CRs5sEcb.d.cts} +2 -236
- package/dist/{types-CBQKKFxJ.d.cts → types-Cyyl3Cw_.d.cts} +1 -1
- package/dist/{types-DwVhPqOZ.d.ts → types-DGVtb7cl.d.cts} +4 -2
- package/dist/{types-BbvuPNXl.d.cts → types-DjDjuUc6.d.ts} +4 -2
- package/dist/types-DolSK-3d.d.cts +237 -0
- package/dist/types-DolSK-3d.d.ts +237 -0
- package/dist/{types-JpkrtFbZ.d.cts → types-RauRuMb7.d.cts} +1 -1
- package/docs/mcp.md +98 -0
- package/examples/mcp-paid-tool.ts +39 -0
- package/package.json +16 -10
package/dist/tab/index.js
CHANGED
|
@@ -3,4 +3,4 @@ var _e=class extends Error{constructor(n){super(`Network ${n} is not yet support
|
|
|
3
3
|
`))!==-1;){let a=r.slice(0,i);r=r.slice(i+2);let c=pr(a);if(c.eventName==="end")return;if(c.data!==null){let u=c.data.replace(/\\(\\|n)/g,(d,f)=>f==="n"?`
|
|
4
4
|
`:"\\");yield new TextEncoder().encode(u)}}}}finally{t.releaseLock()}}function pr(e){let t=null,n=[];for(let r of e.split(`
|
|
5
5
|
`))r.startsWith("event:")?t=r.slice(6).trim():r.startsWith("data:")&&n.push(r.slice(5).trimStart());return{eventName:t,data:n.length?n.join(`
|
|
6
|
-
`):null}}import He from"tweetnacl";import{Connection as Nr,PublicKey as We}from"@solana/web3.js";import{bytesToHex as kr}from"@noble/hashes/utils";import{deriveSessionPda as Or,fetchSessionAccount as Br,isSessionLive as Ur}from"@dexterai/vault/session";import{voucherV2SequenceOrdinal as Dr}from"@dexterai/vault/messages";import{readVaultFull as Mr}from"@dexterai/vault/reader";import{PublicKey as Z}from"@solana/web3.js";import{bytesToHex as Xt}from"@noble/hashes/utils";import{deriveGraphConfigPda as fr,deriveSwigVaultBindingPda as Jt}from"@dexterai/vault/credit";import{DEXTER_VAULT_PROGRAM_ID as gr,DISCRIMINATORS as hr}from"@dexterai/vault/constants";import{deriveSwigWalletAddress as yr}from"@dexterai/vault/instructions";import{decodeVaultFull as Ar}from"@dexterai/vault/reader";import{decodeSessionAccount as br,deriveSessionPda as Yt}from"@dexterai/vault/session";var vr=Uint8Array.from([56,67,4,209,238,143,0,129]),Sr=74,An=new Set([1,2]),wr=188,_r=new Z("MemoSq4gqABAXKb96qnH8TysNcWxMyWCqXgDLGmfcHr"),xr=(()=>{let e=Buffer.alloc(32);return e.write("OTS_SESSION_REGISTER_V2","ascii"),e})(),zt=class extends Error{constructor(n,r){super(`native_tab_v2_solana_reservation_invalid:${n}`+(r?`:${r}`:""));this.code=n;this.name="SolanaFinalVoucherV2ReservationError"}code};function y(e,t){throw new zt(e,t)}function L(e,t){try{return new Z(e)}catch{return y(t)}}function vt(e,t){return e.length===t.length&&e.every((n,r)=>n===t[r])}async function Rr(e){let n=(await e.connection.getSignatureStatuses([e.signature],{searchTransactionHistory:!0})).value[0]??null;if(!n)return null;n.confirmationStatus!=="confirmed"&&n.confirmationStatus!=="finalized"&&y("transaction_commitment"),n.err!==null&&y("transaction_failed");let r=await e.connection.getTransaction(e.signature,{commitment:e.commitment,maxSupportedTransactionVersion:0});if(!r)return null;r.meta||y("transaction_meta_missing"),r.slot!==n.slot&&y("transaction_status_slot");let o=r.transaction.message,s=o.version===0?o.getAccountKeys({accountKeysFromLookups:r.meta.loadedAddresses??null}):o.getAccountKeys(),i=(a,c)=>{let u=s.get(a);return u||y(c),u};return{slot:r.slot,confirmationStatus:n.confirmationStatus,err:r.meta.err,signatures:[...r.transaction.signatures],accountKeys:Array.from({length:s.length},(a,c)=>({address:i(c,"transaction_account_key").toBase58(),signer:o.isAccountSigner(c),writable:o.isAccountWritable(c)})),instructions:o.compiledInstructions.map(a=>({programId:i(a.programIdIndex,"transaction_program_id").toBase58(),accounts:a.accountKeyIndexes.map(c=>i(c,"transaction_instruction_account").toBase58()),data:Uint8Array.from(a.data)}))}}function Tr(e,t,n,r){r.length!==Sr&&y("binding_length"),vt(r.subarray(0,8),vr)||y("binding_discriminator");let o=r.readUInt8(8),s=r.readUInt8(9);return An.has(o)||y("binding_version"),s!==t&&y("binding_bump"),{address:e.toBase58(),owner:n.toBase58(),version:o,bump:s,swig:new Z(r.subarray(10,42)).toBase58(),vault:new Z(r.subarray(42,74)).toBase58()}}async function Er(e){let t=L(e.input.programId,"program_id"),n=L(e.input.buyerSwigAddress,"buyer_swig"),r=L(e.input.vaultPda,"vault_pda"),o=L(e.input.seller,"seller"),[s,i]=Jt(n,t),[a]=Yt(r,o,t),c=await e.connection.getMultipleAccountsInfoAndContext([s,r,a],{commitment:e.commitment,minContextSlot:e.minimumSlot}),[u,d,f]=c.value;u||y("binding_missing"),d||y("vault_missing"),f||y("session_missing");let m,v;try{m=Ar(Buffer.from(d.data)),v=br(a,f.data)}catch(p){return y("post_state_decode",p instanceof Error?p.message:String(p))}let l=v.session;return{contextSlot:c.context.slot,binding:Tr(s,i,u.owner,Buffer.from(u.data)),vault:{owner:d.owner.toBase58(),exists:m.exists,version:m.version,swigAddress:m.swigAddress,dexterAuthority:m.dexterAuthority,pendingVoucherCount:m.pendingVoucherCount},session:{owner:f.owner.toBase58(),version:v.version,bump:v.bump,vault:v.vault,sessionPublicKey:Xt(l.sessionPubkey),maxAmount:l.maxAmount,expiresAt:l.expiresAt,seller:l.allowedCounterparty,nonce:l.nonce,spent:l.spent,currentOutstanding:l.currentOutstanding,maxRevolvingCapacity:l.maxRevolvingCapacity,crystallizedCumulative:l.crystallizedCumulative}}}function Pr(e){let t=Buffer.from(e.voucher.sessionRegistration);return t.length!==wr&&y("registration_length"),vt(t.subarray(0,32),xr)||y("registration_domain"),{programId:new Z(t.subarray(32,64)).toBase58(),vaultPda:new Z(t.subarray(64,96)).toBase58(),sessionPublicKey:Xt(t.subarray(96,128)),maxAmount:t.readBigUInt64LE(128),expiresAt:t.readBigInt64LE(136),seller:new Z(t.subarray(144,176)).toBase58(),nonce:t.readUInt32LE(176),maxRevolvingCapacity:t.readBigUInt64LE(180)}}function Ve(e,t,n){let r=e.accountKeys.filter(o=>o.address===t);return r.length!==1&&y(`${n}_account_key`),r[0]}function Ir(e,t,n){(!Number.isSafeInteger(n.slot)||n.slot<=0)&&y("transaction_slot"),n.slot!==t.confirmationSlot&&y("transaction_confirmation_slot"),n.err!==null&&y("transaction_failed"),n.signatures[0]!==t.transaction&&y("transaction_signature"),n.instructions.length!==2&&y("transaction_instruction_count");let r=L(e.programId,"program_id"),o=L(e.buyerSwigAddress,"buyer_swig"),s=L(e.vaultPda,"vault_pda"),i=L(e.seller,"seller"),a=L(e.sessionPda,"session_pda"),[c]=Yt(s,i,r),u=Jt(o,r)[0],d=yr(o),f=fr(r)[0];a.equals(c)||y("session_pda_derivation");let m=Buffer.from(hr.settle_voucher),v=n.instructions.filter(E=>{if(E.programId!==e.programId)return!1;let V=E.data;return V.length>=m.length&&vt(V.subarray(0,m.length),m)});v.length!==1&&y("settle_voucher_instruction_count");let l=v[0];n.instructions[0]!==l&&y("settle_voucher_instruction_order");let p=Buffer.from(l.data);p.length!==49&&y("settle_voucher_instruction_length"),p.readBigUInt64LE(8).toString()!==e.reservationAmountAtomic&&y("settle_voucher_amount"),p.readUInt8(16)!==1&&y("settle_voucher_increment"),new Z(p.subarray(17,49)).equals(i)||y("settle_voucher_seller"),l.accounts.length<8&&y("settle_voucher_accounts"),[s.toBase58(),null,a.toBase58(),null,o.toBase58(),d.toBase58(),u.toBase58(),f.toBase58()].forEach((E,V)=>{E!==null&&l.accounts[V]!==E&&y(`settle_voucher_account_${V}`)});let A=l.accounts[1];A||y("dexter_authority");let b=Ve(n,l.accounts[0],"vault"),_=Ve(n,A,"dexter_authority"),N=Ve(n,l.accounts[2],"session");(!b.writable||b.signer)&&y("vault_privileges"),_.signer||y("dexter_authority_signature"),(!N.writable||N.signer)&&y("session_privileges");for(let E=3;E<Math.min(l.accounts.length,8);E+=1)Ve(n,l.accounts[E],`account_${E}`).signer&&y(`settle_voucher_account_${E}_signer`);for(let E=8;E<l.accounts.length;E+=1){let V=Ve(n,l.accounts[E],`sibling_${E-8}`);(!V.writable||V.signer)&&y("settle_voucher_sibling_privileges")}let C=n.instructions[1];C.programId!==_r.toBase58()&&y("reservation_memo_program"),(C.accounts.length!==1||C.accounts[0]!==A)&&y("reservation_memo_authority"),Ve(n,A,"reservation_memo_authority").signer||y("reservation_memo_authority_signature");let M=new TextEncoder().encode(jt(e));return vt(C.data,M)||y("reservation_memo_digest"),A}function Vr(e,t,n,r){let o=L(e.programId,"program_id"),s=L(e.buyerSwigAddress,"buyer_swig"),i=L(e.vaultPda,"vault_pda"),a=L(e.seller,"seller"),[c,u]=Jt(s,o),[d,f]=Yt(i,a,o);(!Number.isSafeInteger(r.contextSlot)||r.contextSlot<t)&&y("post_state_slot"),(r.binding.address!==c.toBase58()||r.binding.owner!==e.programId||r.binding.bump!==u||!An.has(r.binding.version)||r.binding.swig!==e.buyerSwigAddress||r.binding.vault!==e.vaultPda)&&y("binding_identity"),(r.vault.owner!==e.programId||!r.vault.exists||r.vault.version!==7||r.vault.swigAddress!==e.buyerSwigAddress||r.vault.dexterAuthority!==n)&&y("vault_post_state"),(e.sessionPda!==d.toBase58()||r.session.owner!==e.programId||r.session.version!==1||r.session.bump!==f||r.session.vault!==e.vaultPda||r.session.sessionPublicKey!==Xt(e.voucher.sessionPublicKey)||r.session.seller!==e.seller||r.session.nonce!==e.sessionNonce||r.session.currentOutstanding.toString()!==e.reservationAmountAtomic)&&y("session_post_state");let m=Pr(e);(m.programId!==e.programId||m.vaultPda!==e.vaultPda||m.sessionPublicKey!==r.session.sessionPublicKey||m.seller!==e.seller||m.nonce!==e.sessionNonce||m.maxAmount!==r.session.maxAmount||m.expiresAt!==BigInt(r.session.expiresAt)||m.maxRevolvingCapacity!==r.session.maxRevolvingCapacity)&&y("registration_post_state");let v=r.session.spent>r.session.crystallizedCumulative?r.session.spent:r.session.crystallizedCumulative;return v.toString()!==e.previousCumulativeAtomic&&y("session_frontier"),{commitment:"confirmed",confirmationSlot:t,postStateSlot:r.contextSlot,sessionAccountVersion:r.session.version,wireVersion:2,frontierAtomic:v.toString(),spentAtomic:r.session.spent.toString(),currentOutstandingAtomic:r.session.currentOutstanding.toString(),crystallizedCumulativeAtomic:r.session.crystallizedCumulative.toString()}}async function Cr(e,t,n,r={}){try{oe(t,n)}catch(a){return y("provider_receipt",a instanceof Error?a.message:String(a))}t.network!=="solana:mainnet"&&y("network"),t.programId!==gr.toBase58()&&y("program_id");let o=await(r.readTransaction??Rr)({connection:e,signature:n.transaction,commitment:"confirmed"});o||y("transaction_missing"),o.confirmationStatus!=="confirmed"&&o.confirmationStatus!=="finalized"&&y("transaction_commitment");let s=Ir(t,n,o),i=await(r.readPostState??Er)({connection:e,input:t,minimumSlot:o.slot,commitment:"confirmed"});return{...Vr(t,o.slot,s,i),commitment:o.confirmationStatus}}async function bn(e,t,n,r={}){await Cr(e,t,n,r)}var Zt="solana:mainnet";async function Kr(e){let t=e.facilitatorUrl??At,n=e.programId??Ee,r=new We(e.vaultPda),o=new We(e.params.counterparty),s=Re(e.perUnitCapAtomic);if(s<=0n)throw new Error(`perUnitCapAtomic must be > 0, got ${e.perUnitCapAtomic}`);let i=Re(e.params.maxAmountAtomic),a=Re(e.params.maxRevolvingCapacityAtomic),c=(e.params.nonce&2147483648)!==0;if(!c)throw new Y("tabFromGrant");if(c&&!e.reserveFinalVoucherV2)throw new Error("native_tab_v2_reservation_fence_required: provide reserveFinalVoucherV2; a FINAL voucher may not be released before its exact durable reservation");let u=Fr(e.sessionSecretKey),d=new We(e.params.sessionPubkey).toBytes();if(!vn(u.publicKey,d))throw new Error(`tab_session_key_mismatch: the supplied secret derives ${new We(u.publicKey).toBase58()} but params.sessionPubkey is ${e.params.sessionPubkey} \u2014 wrong key handed to this process`);let f=He.randomBytes(32),m=He.sign.detached(f,u.secretKey);if(!He.sign.detached.verify(f,m,d))throw new Error("tab_session_key_mismatch: secret key failed the sign/verify self-check against params.sessionPubkey \u2014 the seed half does not sign for the granted pubkey");let v=Fe({programId:n,vaultPda:r,sessionPubkey:u.publicKey,maxAmount:i,expiresAt:BigInt(e.params.expiresAtUnix),allowedCounterparty:o,nonce:e.params.nonce,maxRevolvingCapacity:a}),l=typeof e.connection=="string"?new Nr(e.connection,"confirmed"):e.connection,p=await Br(l,r,o,n);if(!p||p.version===0)throw new Error("tab_session_not_live: no live SessionAccount PDA for this (vault, counterparty) \u2014 revoked, expiry-swept, or never registered");if(!Ur(p))throw new Error(p.version!==1?`tab_session_not_live: SessionAccount has unsupported version ${p.version} \u2014 not a live v1 session`:`tab_session_not_live: SessionAccount is present but expired (expiresAt=${p.session.expiresAt})`);if(!vn(p.session.sessionPubkey,u.publicKey))throw new Error(`tab_session_pubkey_mismatch: the on-chain session carries ${new We(p.session.sessionPubkey).toBase58()} \u2014 the grant this key belongs to was replaced by a newer registration`);if(p.vault!==r.toBase58()||p.session.allowedCounterparty!==o.toBase58()||p.session.maxAmount!==i||p.session.expiresAt!==e.params.expiresAtUnix||p.session.nonce!==e.params.nonce||p.session.maxRevolvingCapacity!==a)throw new Error(`tab_grant_params_stale: params disagree with the on-chain session scope (chain: maxAmount=${p.session.maxAmount} expiresAt=${p.session.expiresAt} nonce=${p.session.nonce} revolving=${p.session.maxRevolvingCapacity}; params: ${e.params.maxAmountAtomic}/${e.params.expiresAtUnix}/${e.params.nonce}/${e.params.maxRevolvingCapacityAtomic}) \u2014 refresh the grant hand-off`);if(c&&p.session.currentOutstanding!==0n)throw new Error(`native_tab_v2_reservation_pending: the session already has an exact outstanding reservation of ${p.session.currentOutstanding}; recover that immutable attempt before issuing another FINAL voucher`);let x=p.session.spent>p.session.crystallizedCumulative?p.session.spent:p.session.crystallizedCumulative;if(x>=i)throw new Error(`tab_exhausted: on-chain frontier ${x} has consumed the session cap ${i} \u2014 no voucher can strictly exceed it; open a new grant`);let A=e.sellerUrl??e.params.counterparty,b=BigInt(Math.floor(Math.random()*4294967295)),_=Le({vaultPda:r,sellerUrl:A,nonce:b}),N=kr(_),C=e.swigAddress;if(!C){let h=await Mr(l,r);if(!h.exists||!h.swigAddress)throw new Error(`tab_vault_unreadable: vault ${r.toBase58()} has no readable swig_address on chain \u2014 pass options.swigAddress explicitly`);C=h.swigAddress}let F={channelId:N,maxAmountAtomic:e.params.maxAmountAtomic,revolvingCapacityAtomic:e.params.maxRevolvingCapacityAtomic,expiresAtUnix:e.params.expiresAtUnix,allowedCounterparty:e.params.counterparty},M=Ft({publicKey:u.publicKey,privateKey:u.secretKey},F,v),[E]=Or(r,o,n),V={network:Zt,swigAddress:C,vaultPda:r.toBase58(),sessionVoucherVersion:c?2:1,authorizeSession:async()=>{throw new Error("grant_tab_no_passkey: a grant-held tab cannot authorize sessions \u2014 session birth requires the wallet owner's passkey ceremony")},signWithSession:async(h,S)=>{if(!c)return Lt(h,S,_);let w=$t({programId:n.toBase58(),vaultPda:r.toBase58(),sessionPda:E.toBase58(),seller:o.toBase58(),sessionNonce:e.params.nonce,channelId:S.channelId,cumulativeAmountAtomic:S.cumulativeAmount,sequenceOrdinal:S.sequenceNumber,sessionPrivateKey:h.privateKey,sessionPublicKey:h.publicKey,sessionRegistration:h.registration});return{payload:{channelId:w.channelId,cumulativeAmount:w.cumulativeAmount,sequenceNumber:w.sequenceNumber},sessionPublicKey:Uint8Array.from(Buffer.from(w.sessionPublicKey,"hex")),sessionSignature:Uint8Array.from(Buffer.from(w.sessionSignature,"hex")),sessionRegistration:Uint8Array.from(Buffer.from(w.sessionRegistration,"hex"))}},signOpenTab:async h=>h.registration,signCloseTab:async()=>{throw new Error("grant_tab_cannot_revoke: session revocation is passkey-signed and belongs to the wallet owner's surfaces \u2014 a grant-held tab closes settle-only")},verifyFinalVoucherV2Reservation:c?(h,S)=>bn(l,h,S):void 0};return new qe({vault:V,network:Zt,seller:A,counterparty:e.params.counterparty,session:M,channelIdHex:N,channelIdBytes:_,perUnitCapAtomic:s,totalCapAtomic:i,expiresAtUnix:e.params.expiresAtUnix,facilitatorUrl:t,initialCumulativeAtomic:x,initialSequenceOrdinal:c&&p.session.lastLockedSequence!==0?Dr(p.session.lastLockedSequence):0,beforeVoucherRelease:c?async({voucher:h,incrementAtomic:S,previousCumulativeAtomic:w})=>{let R=$e(h),T={network:Zt,programId:n.toBase58(),buyerSwigAddress:C,vaultPda:r.toBase58(),sessionPda:E.toBase58(),seller:o.toBase58(),channelId:N,sessionNonce:e.params.nonce,reservationAmountAtomic:S,previousCumulativeAtomic:w,...R,voucher:h},I=await e.reserveFinalVoucherV2(T);return oe(T,I),await V.verifyFinalVoucherV2Reservation(T,I),I}:void 0,closeMode:"settle-only"})}function Fr(e){if(e.length===64)return He.sign.keyPair.fromSecretKey(e);if(e.length===32)return He.sign.keyPair.fromSeed(e);throw new Error(`tab_session_key_invalid: expected a 64-byte nacl secretKey or a 32-byte ed25519 seed, got ${e.length} bytes`)}function vn(e,t){if(e.length!==t.length)return!1;let n=0;for(let r=0;r<e.length;r++)n|=e[r]^t[r];return n===0}import{PublicKey as Wr}from"@solana/web3.js";var Sn=[{caip2:"eip155:8453",bare:"base",family:"evm"},{caip2:"eip155:1",bare:"ethereum",family:"evm"},{caip2:"eip155:137",bare:"polygon",family:"evm"},{caip2:"eip155:42161",bare:"arbitrum",family:"evm"},{caip2:"eip155:10",bare:"optimism",family:"evm"},{caip2:"eip155:43114",bare:"avalanche",family:"evm"},{caip2:"eip155:56",bare:"bsc",family:"evm"},{caip2:"eip155:480",bare:"world",family:"evm"},{caip2:"eip155:143",bare:"monad",family:"evm"},{caip2:"eip155:4663",bare:"robinhood",family:"evm"},{caip2:"eip155:1187947933",bare:"skale-base",family:"evm"},{caip2:"eip155:324705682",bare:"skale-base-sepolia",family:"evm"},{caip2:"solana:5eykt4UsFv8P8NJdTREpY1vzqKqZKvdp",bare:"solana",family:"svm"}],Lr=new Map(Sn.map(e=>[e.caip2.toLowerCase(),e])),$r=new Map(Sn.map(e=>[e.bare.toLowerCase(),e]));function je(e){if(!e)return null;let t=e.toLowerCase(),n=Lr.get(t)||$r.get(t);return n?{caip2:n.caip2,bare:n.bare,family:n.family}:null}function Qt(e){let t=e.replace(/-/g,"+").replace(/_/g,"/"),n=t+"=".repeat((4-(t.length%4||4))%4);return JSON.parse(Buffer.from(n,"base64").toString("utf8"))}function qr(e){let t=[];for(let n of e){if(!n||typeof n!="object")continue;let r=n,o=je(String(r.network??""));o&&t.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 t}async function St(e){let t=e.headers.get("payment-required");if(!t)return null;let n;try{n=Qt(t)}catch{return null}let r=Array.isArray(n.accepts)?n.accepts:[];return r.length===0?null:{x402Version:2,options:qr(r),resourceUrl:n.resource&&typeof n.resource=="object"?String(n.resource.url??""):void 0}}async function Ge(e,t={},n=fetch){let r={method:t.method??"GET",headers:t.headers};typeof t.body=="string"&&(r.body=t.body);let o;try{o=await n(e,r)}catch(a){return{kind:"error",detail:`probe failed: ${a?.message??String(a)}`}}if(o.status!==402)return o.ok?{kind:"free",response:o}:{kind:"error",detail:`probe returned HTTP ${o.status}`};let s=await St(o);if(!s)return{kind:"error",detail:"the 402 carries no x402 v2 PAYMENT-REQUIRED challenge"};let i=s.options.find(a=>a.scheme==="tab"&&a.network.family==="svm");if(!i)return{kind:"no_tab",schemesOffered:s.options.map(a=>a.scheme)};try{new Wr(i.payTo)}catch{return{kind:"error",detail:`tab option payTo is not a valid Solana pubkey: "${i.payTo}"`}}return{kind:"offer",offer:{payTo:i.payTo,amountAtomic:i.amount,asset:i.asset,networkCaip2:i.network.caip2,...typeof i.extra?.voucherHeader=="string"?{voucherHeader:i.extra.voucherHeader}:{},...typeof i.extra?.registrationEncoding=="string"?{registrationEncoding:i.extra.registrationEncoding}:{},...typeof i.extra?.termsVersion=="string"?{termsVersion:i.extra.termsVersion}:{},...typeof i.extra?.acceptanceRule=="string"?{acceptanceRule:i.extra.acceptanceRule}:{},resourceUrl:s.resourceUrl}}}var Hr="dexter-tab-hosted-pay-before-delivery/v1",jr="pay_before_delivery_seller_2xx",Gr="x-tab-voucher",zr="base64(188-byte sessionRegisterMessage)";var ze="solana:5eykt4UsFv8P8NJdTREpY1vzqKqZKvdp",wt="solana:EtWTRABZaYq6iMfeYKouRu166VU2xqa1",_t="solana:4uhcVJyU9pJkvQyS88uRDiswHXSCkY3z",ce=ze,Xe=wt,Je=_t,ue="eip155:8453",Ce="eip155:84532",Ne="eip155:42161",ke="eip155:137",Oe="eip155:10",Be="eip155:43114",Ue="eip155:56",le="eip155:480",me="eip155:143",de="eip155:4663",pe="eip155:1187947933",fe="eip155:324705682",De="eip155:1",ge=ue,xt=Ce,Ye=Ne,Ze=ke,Qe=Oe,et=Be,tt=Ue,nt=le,rt=me,ot=de,st=pe,it=fe,at=De,ct="EPjFWdd5AufqSSqeM2qN1xzybapC8G4wEGGkZwyTDt1v",wn="4zMMC9srt5Ri5X14GAgXhaHii3GnPAEERYPJgZJDncDU",_n="0x833589fCD6eDb6E08f4c7C32D4f71b54bdA02913",en="0x55d398326f99059fF775485246999027B3197955",Rt="0x8AC76a51cc950d9822D68b83fE1Ad97B32Cd580d",tn="0x5fc5360D0400a0Fd4f2af552ADD042D716F1d168",Tt={[Ue]:Rt,[ue]:_n,[Ce]:"0x036CbD53842c5426634e7929541eC2318f3dCF7e",[Ne]:"0xaf88d065e77c8cC2239327C5EDb3A432268e5831",[ke]:"0x3c499c542cEF5E3811e1192ce70d8cC03d5c3359",[Oe]:"0x0b2C639c533813f4Aa9D7837CAf62653d097Ff85",[Be]:"0xB97EF9Ef8734C71904D8002F8b6Bc66Dd9c48a6E",[le]:"0x79A02482A880bCE3F13e09Da970dC34db4CD24d1",[me]:"0x754704Bc059F8C67012fEd69BC8A327a5aafb603",[de]:tn,[pe]:"0x85889c8c714505E0c94b30fcfcF64fE3Ac8FCb20",[fe]:"0x2e08028E3C4c2356572E096d8EF835cD5C6030bD",[De]:"0xA0b86991c6218b36c1d19D4a2e9Eb0cE3606eB48"},Et={[en]:{symbol:"USDT",decimals:18},[Rt]:{symbol:"USDC",decimals:18}};var Pt={[le]:{name:"USDC",version:"2"},[me]:{name:"USDC",version:"2"},[de]:{name:"Global Dollar",version:"1"},[pe]:{name:"Bridged USDC (SKALE Bridge)",version:"2"},[fe]:{name:"Bridged USDC (SKALE Bridge)",version:"2"}},Q="0x000000000022D473030F116dDEE9F6B43aC78BA3",ut="0x402085c248EeA27D92E8b30b2C58ed07f9E20001",lt={[Ue]:56,[ue]:8453,[Ce]:84532,[Ne]:42161,[ke]:137,[Oe]:10,[Be]:43114,[le]:480,[me]:143,[de]:4663,[pe]:1187947933,[fe]:324705682,[De]:1},he={[ze]:"https://api.dexter.cash/api/solana/rpc",[wt]:"https://api.devnet.solana.com",[_t]:"https://api.testnet.solana.com"},D={[Ue]:"https://api.dexter.cash/api/evm/bsc/rpc",[ue]:"https://api.dexter.cash/api/base/rpc",[Ce]:"https://sepolia.base.org",[Ne]:"https://api.dexter.cash/api/evm/arbitrum/rpc",[ke]:"https://api.dexter.cash/api/evm/polygon/rpc",[Oe]:"https://api.dexter.cash/api/evm/optimism/rpc",[Be]:"https://api.dexter.cash/api/evm/avalanche/rpc",[le]:"https://worldchain-mainnet.g.alchemy.com/public",[me]:"https://rpc.monad.xyz",[de]:"https://rpc.mainnet.chain.robinhood.com",[pe]:"https://skale-base.skalenodes.com/v1/base",[fe]:"https://base-sepolia-testnet.skalenodes.com/v1/jubilant-horrible-ancha",[De]:"https://eth.llamarpc.com"};var B=class e extends Error{code;details;constructor(t,n,r){super(n),this.name="X402Error",this.code=t,this.details=r,Object.setPrototypeOf(this,e.prototype)}};import{PublicKey as ye,Connection as nn,TransactionMessage as Xr,VersionedTransaction as Jr,ComputeBudgetProgram as xn}from"@solana/web3.js";import{getAssociatedTokenAddress as rn,getAccount as Yr,createTransferCheckedInstruction as Zr,getMint as Qr,TOKEN_PROGRAM_ID as Rn,TOKEN_2022_PROGRAM_ID as It}from"@solana/spl-token";var eo=12e3,to=1;function Ae(e){if(!e||typeof e!="object")return!1;let t=e;return"publicKey"in t&&"signTransaction"in t&&typeof t.signTransaction=="function"}var Vt=class{name="Solana";networks=[ce,Xe,Je];config;log;constructor(t={}){this.config=t,this.log=t.verbose?console.log.bind(console,"[x402:solana]"):()=>{}}canHandle(t){return!!(this.networks.includes(t)||t==="solana"||t==="solana-devnet"||t==="solana-testnet"||t.startsWith("solana:"))}getDefaultRpcUrl(t){return this.config.rpcUrls?.[t]?this.config.rpcUrls[t]:he[t]?he[t]:t==="solana"?he[ce]:t==="solana-devnet"?he[Xe]:t==="solana-testnet"?he[Je]:he[ce]}getAddress(t){return Ae(t)?t.publicKey?.toBase58()??null:null}isConnected(t){return Ae(t)?t.publicKey!==null:!1}async getBalance(t,n,r){if(!Ae(n)||!n.publicKey)return 0;let o=r||this.getDefaultRpcUrl(t.network),s=new nn(o,"confirmed"),i=new ye(n.publicKey.toBase58()),a=new ye(t.asset);try{let u=(await s.getAccountInfo(a,"confirmed"))?.owner.toBase58()===It.toBase58()?It:Rn,d=await rn(a,i,!1,u),f=await Yr(s,d,void 0,u),m=t.extra?.decimals??6;return Number(f.amount)/Math.pow(10,m)}catch(c){if(c&&typeof c=="object"&&"name"in c&&(c.name==="TokenAccountNotFoundError"||c.name==="TokenInvalidAccountOwnerError"))return 0;throw c}}async buildTransaction(t,n,r){if(!Ae(n))throw new Error("Invalid Solana wallet");if(!n.publicKey)throw new Error("Wallet not connected");let o=r||this.getDefaultRpcUrl(t.network),s=new nn(o,"confirmed"),i=new ye(n.publicKey.toBase58()),{payTo:a,asset:c,extra:u}=t,d=t.amount??t.maxAmountRequired;if(!d)throw new Error("Missing amount in payment requirements");if(!u?.feePayer)throw new Error("Missing feePayer in payment requirements");let f=new ye(u.feePayer),m=new ye(c),v=new ye(a);this.log("Building transaction:",{from:i.toBase58(),to:a,amount:d,asset:c,feePayer:u.feePayer});let l=[];l.push(xn.setComputeUnitLimit({units:eo})),l.push(xn.setComputeUnitPrice({microLamports:to}));let p=await s.getAccountInfo(m,"confirmed");if(!p)throw new Error(`Token mint ${c} not found`);let x=p.owner.toBase58()===It.toBase58()?It:Rn,A=await Qr(s,m,void 0,x);typeof u?.decimals=="number"&&A.decimals!==u.decimals&&this.log(`Decimals mismatch: requirements say ${u.decimals}, mint says ${A.decimals}`);let b=await rn(m,i,!1,x),_=await rn(m,v,!0,x);if(!await s.getAccountInfo(b,"confirmed"))throw new Error(`No token account found for ${c}. Please ensure you have USDC in your wallet.`);if(!await s.getAccountInfo(_,"confirmed"))throw new Error(`Seller token account not found. The seller (${a}) must have a USDC account.`);let F=BigInt(d);l.push(Zr(b,m,_,i,F,A.decimals,[],x));let{blockhash:M}=await s.getLatestBlockhash("confirmed"),E=new Xr({payerKey:f,recentBlockhash:M,instructions:l}).compileToV0Message(),V=new Jr(E),h=await n.signTransaction(V);return this.log("Transaction signed successfully"),{serialized:Buffer.from(h.serialize()).toString("base64"),settlementProbe:{kind:"solana",sourceAta:b.toBase58(),destinationAta:_.toBase58(),asset:c,amount:d,blockhash:M}}}async confirmSettlement(t,n){if(t.kind!=="solana")throw new Error(`SolanaAdapter.confirmSettlement cannot handle probe kind "${t.kind}"`);let r=new nn(n,"confirmed"),o=new ye(t.destinationAta),s=await r.getSignaturesForAddress(o,{limit:25});if(s.length===0)return{settled:!1};let i=BigInt(t.amount);for(let a of s){if(a.err)continue;let c=await r.getTransaction(a.signature,{commitment:"confirmed",maxSupportedTransactionVersion:0});if(!c?.meta)continue;let u=c.transaction.message.getAccountKeys().keySegments().flat(),d=c.meta.preTokenBalances??[],f=c.meta.postTokenBalances??[];for(let m of f){if(m.mint!==t.asset)continue;let v=u[m.accountIndex];if(!v||!v.equals(o))continue;let l=d.find(A=>A.accountIndex===m.accountIndex),p=BigInt(l?.uiTokenAmount.amount??"0");if(BigInt(m.uiTokenAmount.amount??"0")-p===i)return{settled:!0,txSignature:a.signature}}}return{settled:!1}}};function ee(e){return new Vt(e)}var no={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"}]},Tn=BigInt("0xffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff");function be(e){if(!e||typeof e!="object")return!1;let t=e;return"address"in t&&typeof t.address=="string"&&t.address.startsWith("0x")}var Ct=class{name="EVM";networks=[tt,ge,xt,at,Ye,Ze,Qe,et,nt,rt,ot,st,it];config;log;constructor(t={}){this.config=t,this.log=t.verbose?console.log.bind(console,"[x402:evm]"):()=>{}}canHandle(t){return!!(this.networks.includes(t)||t==="base"||t==="bsc"||t==="ethereum"||t==="arbitrum"||t==="polygon"||t==="optimism"||t==="avalanche"||t==="world"||t==="monad"||t==="robinhood"||t==="skale-base"||t==="skale-base-sepolia"||t.startsWith("eip155:"))}getDefaultRpcUrl(t){return this.config.rpcUrls?.[t]?this.config.rpcUrls[t]:D[t]?D[t]:t==="base"?D[ge]:t==="bsc"?D[tt]:t==="ethereum"?D[at]:t==="arbitrum"?D[Ye]:t==="polygon"?D[Ze]:t==="optimism"?D[Qe]:t==="avalanche"?D[et]:t==="world"?D[nt]:t==="monad"?D[rt]:t==="robinhood"?D[ot]:t==="skale-base"?D[st]:t==="skale-base-sepolia"?D[it]:D[ge]}getAddress(t){return be(t)?t.address:null}isConnected(t){return be(t)?!!t.address:!1}getChainId(t){if(lt[t])return lt[t];if(t.startsWith("eip155:")){let n=t.split(":")[1];return parseInt(n,10)}return t==="base"?8453:t==="bsc"?56:t==="ethereum"?1:t==="arbitrum"?42161:t==="polygon"?137:t==="optimism"?10:t==="avalanche"?43114:t==="world"?480:t==="monad"?143:t==="robinhood"?4663:t==="skale-base"?1187947933:t==="skale-base-sepolia"?324705682:8453}async getBalance(t,n,r){if(!be(n)||!n.address)return 0;let o=r||this.getDefaultRpcUrl(t.network);try{let s=this.encodeBalanceOf(n.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:t.asset,data:s},"latest"]})});if(!i.ok)throw new Error(`RPC request failed: ${i.status}`);let a=await i.json();if(a.error)throw new Error(`RPC error: ${JSON.stringify(a.error)}`);if(!a.result||a.result==="0x")return 0;let c=BigInt(a.result),u=t.extra?.decimals??6;return Number(c)/Math.pow(10,u)}catch(s){throw s}}encodeBalanceOf(t){let n="0x70a08231",r=t.slice(2).toLowerCase().padStart(64,"0");return n+r}async confirmSettlement(t,n){if(t.kind==="eip3009"){let r="0xe94a0102",o=t.from.slice(2).toLowerCase().padStart(64,"0"),s=t.nonce.slice(2).toLowerCase().padStart(64,"0"),i=r+o+s,a=await this.ethCall(n,t.asset,i);return{settled:BigInt(a)!==0n}}if(t.kind==="permit2"){let r="0x4fe02b44",o=BigInt(t.nonce),s=o>>8n,i=o&0xffn,a=t.from.slice(2).toLowerCase().padStart(64,"0"),c=s.toString(16).padStart(64,"0"),u=r+a+c,d=await this.ethCall(n,Q,u);return{settled:(BigInt(d)>>i&1n)===1n}}throw new Error(`EvmAdapter.confirmSettlement cannot handle probe kind "${t.kind}"`)}async ethCall(t,n,r){let o=await fetch(t,{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({jsonrpc:"2.0",id:1,method:"eth_call",params:[{to:n,data:r},"latest"]})});if(!o.ok)throw new Error(`RPC request failed: ${o.status}`);let s=await o.json();if(s.error)throw new Error(`RPC error: ${JSON.stringify(s.error)}`);if(!s.result||s.result==="0x")throw new Error("RPC returned an empty result");return s.result}async buildTransaction(t,n,r){if(!be(n))throw new Error("Invalid EVM wallet");if(!n.address)throw new Error("Wallet not connected");if(t.scheme==="exact-approval")return this.buildApprovalTransaction(t,n,r);if(t.extra?.assetTransferMethod==="permit2")return this.buildPermit2Transaction(t,n,r);let{payTo:o,asset:s,extra:i}=t,a=t.amount??t.maxAmountRequired;if(!a)throw new Error("Missing amount in payment requirements");this.log("Building EVM transaction:",{from:n.address,to:o,amount:a,asset:s,network:t.network});let c=this.getChainId(t.network),u=Pt[`eip155:${c}`],d={name:i?.name??u?.name??"USD Coin",version:i?.version??u?.version??"2",chainId:BigInt(c),verifyingContract:s},f={TransferWithAuthorization:[{name:"from",type:"address"},{name:"to",type:"address"},{name:"value",type:"uint256"},{name:"validAfter",type:"uint256"},{name:"validBefore",type:"uint256"},{name:"nonce",type:"bytes32"}]},m=new Uint8Array(32);(globalThis.crypto??(await import("crypto")).webcrypto).getRandomValues(m);let v="0x"+[...m].map(_=>_.toString(16).padStart(2,"0")).join(""),l=Math.floor(Date.now()/1e3),p={from:n.address,to:o,value:a,validAfter:String(l-600),validBefore:String(l+(t.maxTimeoutSeconds||60)),nonce:v},x={from:n.address,to:o,value:BigInt(a),validAfter:BigInt(l-600),validBefore:BigInt(l+(t.maxTimeoutSeconds||60)),nonce:v};if(!n.signTypedData)throw new Error("Wallet does not support signTypedData (EIP-712)");let A=await n.signTypedData({domain:d,types:f,primaryType:"TransferWithAuthorization",message:x});return this.log("EIP-712 signature obtained"),{serialized:JSON.stringify({authorization:p,signature:A}),signature:A,settlementProbe:{kind:"eip3009",from:n.address,nonce:v,asset:s,chainId:c}}}async buildApprovalTransaction(t,n,r){let{payTo:o,asset:s,extra:i}=t,a=t.amount??t.maxAmountRequired;if(!a)throw new Error("Missing amount in payment requirements");let c=i?.facilitatorContract;if(!c)throw new Error("exact-approval scheme requires extra.facilitatorContract from the facilitator. The /supported endpoint should provide this.");if(!n.signTypedData)throw new Error("Wallet does not support signTypedData (EIP-712)");this.log("Building approval-based transaction:",{from:n.address,to:o,amount:a,asset:s,network:t.network,facilitatorContract:c});let u=r||this.getDefaultRpcUrl(t.network),d=i?.fee??"0",f=BigInt(a)+BigInt(d),m=await this.readAllowance(u,s,n.address,c);if(m<f){if(!n.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 V=this.calculateApprovalAmount(a,d,i?.approvalStrategy);this.log(`Approving ${V} for ${c} (current allowance: ${m})`);let h=await n.sendTransaction({to:s,data:this.encodeApprove(c,V),value:0n});this.log(`Approval tx sent: ${h}`),await this.waitForReceipt(u,h),this.log("Approval confirmed")}else this.log("Sufficient allowance, skipping approval");let v=new Uint8Array(16);(globalThis.crypto??(await import("crypto")).webcrypto).getRandomValues(v);let l=[...v].reduce((V,h)=>V*256n+BigInt(h),0n).toString(),p=new Uint8Array(32);(globalThis.crypto??(await import("crypto")).webcrypto).getRandomValues(p);let x="0x"+[...p].map(V=>V.toString(16).padStart(2,"0")).join(""),b=Math.floor(Date.now()/1e3)+(t.maxTimeoutSeconds||300),_=i?.eip712Domain,N=_?{name:_.name,version:_.version,chainId:BigInt(_.chainId),verifyingContract:_.verifyingContract}:{name:"DexterBSCFacilitator",version:"1",chainId:BigInt(this.getChainId(t.network)),verifyingContract:c},C=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"}]},F={from:n.address,to:o,token:s,amount:BigInt(a),fee:BigInt(d),nonce:BigInt(l),deadline:BigInt(b),paymentId:x},M=await n.signTypedData({domain:N,types:C,primaryType:"Payment",message:F});this.log("EIP-712 Payment signature obtained");let E={from:n.address,to:o,token:s,amount:a,fee:d,nonce:l,deadline:b,paymentId:x,signature:M};return{serialized:JSON.stringify(E),signature:M}}async buildPermit2Transaction(t,n,r){let{payTo:o,asset:s}=t,i=t.amount??t.maxAmountRequired;if(!i)throw new Error("Missing amount in payment requirements");if(!n.signTypedData)throw new Error("Wallet does not support signTypedData (EIP-712)");this.log("Building Permit2 transaction:",{from:n.address,to:o,amount:i,asset:s,network:t.network});let a=r||this.getDefaultRpcUrl(t.network),c=await this.readAllowance(a,s,n.address,Q),u;if(c<BigInt(i)){let N=this.encodeApprove(Q,Tn);if(n.signTransaction){this.log(`Signing Permit2 approval for relay (current allowance: ${c})`);let C=this.getChainId(t.network),F=await this.readGasPrice(a),M=await this.readNonce(a,n.address),E=await n.signTransaction({to:s,data:N,chainId:C,gas:50000n,gasPrice:F,nonce:M});u={erc20ApprovalGasSponsoring:{info:{from:n.address,asset:s,spender:Q,amount:Tn.toString(),signedTransaction:E,version:"1"}}},this.log("Permit2 approval signed for facilitator relay")}else if(n.sendTransaction){this.log(`Approving Permit2 directly (current allowance: ${c})`);let C=await n.sendTransaction({to:s,data:N,value:0n});this.log(`Permit2 approval tx sent: ${C}`),await this.waitForReceipt(a,C),this.log("Permit2 approval confirmed")}else throw new Error("Permit2 payments require a wallet that supports signTransaction or sendTransaction for the one-time Permit2 approval. Use createEvmKeypairWallet() or a browser wallet with transaction support.")}else this.log("Sufficient Permit2 allowance, skipping approval");let d=new Uint8Array(32);(globalThis.crypto??(await import("crypto")).webcrypto).getRandomValues(d);let f=[...d].reduce((N,C)=>N*256n+BigInt(C),0n),m=Math.floor(Date.now()/1e3),v=m-600,l=m+(t.maxTimeoutSeconds||300),p=this.getChainId(t.network),x={name:"Permit2",chainId:BigInt(p),verifyingContract:Q},A={permitted:{token:s,amount:BigInt(i)},spender:ut,nonce:f,deadline:BigInt(l),witness:{to:o,validAfter:BigInt(v)}},b=await n.signTypedData({domain:x,types:no,primaryType:"PermitWitnessTransferFrom",message:A});this.log("Permit2 PermitWitnessTransferFrom signature obtained");let _={signature:b,permit2Authorization:{from:n.address,permitted:{token:s,amount:i},spender:ut,nonce:f.toString(),deadline:String(l),witness:{to:o,validAfter:String(v)}}};return{serialized:JSON.stringify(_),signature:b,extensions:u,settlementProbe:{kind:"permit2",from:n.address,nonce:f.toString(),chainId:p}}}async readAllowance(t,n,r,o){let s="0xdd62ed3e",i=r.slice(2).toLowerCase().padStart(64,"0"),a=o.slice(2).toLowerCase().padStart(64,"0"),c=s+i+a;try{let d=await(await fetch(t,{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({jsonrpc:"2.0",id:1,method:"eth_call",params:[{to:n,data:c},"latest"]})})).json();return d.error||!d.result||d.result==="0x"?0n:BigInt(d.result)}catch{return 0n}}encodeApprove(t,n){let r="0x095ea7b3",o=t.slice(2).toLowerCase().padStart(64,"0"),s=n.toString(16).padStart(64,"0");return r+o+s}async waitForReceipt(t,n,r=3e4){let o=Date.now();for(;Date.now()-o<r;){try{let i=await(await fetch(t,{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({jsonrpc:"2.0",id:1,method:"eth_getTransactionReceipt",params:[n]})})).json();if(i.result){if(i.result.status==="0x0")throw new Error(`Approval transaction reverted: ${n}`);return}}catch(s){if(s instanceof Error&&s.message.includes("reverted"))throw s}await new Promise(s=>setTimeout(s,2e3))}throw new Error(`Approval transaction receipt timeout after ${r}ms: ${n}`)}async readGasPrice(t){try{let r=await(await fetch(t,{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(t,n){try{let o=await(await fetch(t,{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({jsonrpc:"2.0",id:1,method:"eth_getTransactionCount",params:[n,"latest"]})})).json();return o.result?parseInt(o.result,16):0}catch{return 0}}calculateApprovalAmount(t,n,r){let o=BigInt(t)+BigInt(n);if(!r||r.mode==="exact")return o;let s=BigInt(r.defaultMultiple??10),i=o*s;if(r.maxCapUsd){let a=this.inferDecimals(t),c=BigInt(Math.floor(r.maxCapUsd*Math.pow(10,a)));if(i>c)return c}if(r.exactAboveUsd){let a=this.inferDecimals(t),c=BigInt(Math.floor(r.exactAboveUsd*Math.pow(10,a)));if(BigInt(t)>c)return o}return i}inferDecimals(t){return t.length>12?18:6}};function Me(e){return new Ct(e)}function on(e){if(e===ct||e===wn)return!0;let t=e.toLowerCase();for(let n of Object.values(Tt))if(n.toLowerCase()===t)return!0;for(let n of Object.keys(Et))if(n.toLowerCase()===t)return!0;return!1}function ro(e){return{[ze]:"Solana",[wt]:"Solana Devnet",[_t]:"Solana Testnet",solana:"Solana","solana-devnet":"Solana Devnet","solana-testnet":"Solana Testnet",[ue]:"Base",[Ce]:"Base Sepolia",[De]:"Ethereum",[Ne]:"Arbitrum",[ke]:"Polygon",[Oe]:"Optimism",[Be]:"Avalanche",[Ue]:"BSC",[le]:"World Chain",[me]:"Monad",[de]:"Robinhood Chain",[pe]:"SKALE Base",[fe]:"SKALE Base Sepolia",base:"Base","base-sepolia":"Base Sepolia",ethereum:"Ethereum",arbitrum:"Arbitrum",polygon:"Polygon",optimism:"Optimism",avalanche:"Avalanche",bsc:"BSC",world:"World Chain",monad:"Monad",robinhood:"Robinhood Chain","skale-base":"SKALE Base","skale-base-sepolia":"SKALE Base Sepolia"}[e]||e}function En(e,t){let n=ro(e);return n===e?t:n}async function oo(e,t){if(typeof e=="string")return[e,t];if(e instanceof URL)return[e.href,t];let n=e,r=new Headers(n.headers);t?.headers&&new Headers(t.headers).forEach((i,a)=>r.set(a,i));let o={method:t?.method??n.method,headers:r,signal:t?.signal??n.signal,redirect:t?.redirect??n.redirect,credentials:t?.credentials??n.credentials},s=(o.method??"GET").toUpperCase();return t&&"body"in t?o.body=t.body:s!=="GET"&&s!=="HEAD"&&n.body&&(o.body=await n.arrayBuffer()),[n.url,o]}var so=new WeakMap;function Pn(e){let{adapters:t=[ee({verbose:e.verbose}),Me({verbose:e.verbose})],wallets:n,wallet:r,preferredNetwork:o,rpcUrls:s={},maxAmountAtomic:i,fetch:a=globalThis.fetch,verbose:c=!1,accessPass:u,onPaymentRequired:d,onPaymentDispatched:f,maxRetries:m=0,retryDelayMs:v=500}=e,l=c?console.log.bind(console,"[x402]"):()=>{};async function p(h,S){let w;for(let R=0;R<=m;R++)try{let T=await a(h,S);if(T.status>=502&&T.status<=504&&R<m){l(`Retry ${R+1}/${m}: server returned ${T.status}`),await new Promise(I=>setTimeout(I,v*Math.pow(2,R)));continue}return T}catch(T){w=T,R<m&&(l(`Retry ${R+1}/${m}: ${T instanceof Error?T.message:"network error"}`),await new Promise(I=>setTimeout(I,v*Math.pow(2,R))))}throw w}let x=new Map;function A(h){try{let S=new URL(h).host,w=x.get(S);if(w&&w.expiresAt>Date.now()/1e3+10)return w.jwt;w&&x.delete(S)}catch{}return null}function b(h,S){try{let w=new URL(h).host,R=S.split(".");if(R.length===3){let T=JSON.parse(atob(R[1].replace(/-/g,"+").replace(/_/g,"/"))),I=Math.floor(Date.now()/1e3),k=I+86400,q=Math.min(typeof T.exp=="number"?T.exp:I,k);x.set(w,{jwt:S,expiresAt:q}),l("Access pass cached for",w,"| expires:",new Date(q*1e3).toISOString())}}catch{l("Failed to cache access pass")}}let _=n||{};r&&!_.solana&&Ae(r)&&(_.solana=r),r&&!_.evm&&be(r)&&(_.evm=r);function N(h){let S=[];for(let w of h){let R=w.scheme??"exact";if(R!=="exact"&&R!=="exact-approval")continue;let T=t.find(k=>k.canHandle(w.network));if(!T)continue;let I;T.name==="Solana"?I=_.solana:T.name==="EVM"&&(I=_.evm),I&&T.isConnected(I)&&S.push({accept:w,adapter:T,wallet:I})}if(S.length===0)return null;if(o){let w=S.find(R=>R.accept.network===o);if(w)return w}return S[0]}function C(h,S){return En(h,S)}function F(h,S){return s[h]||S.getDefaultRpcUrl(h)}async function M(h,S,w,R,T){let I="";if(u?.preferTier&&R.tiers){let g=R.tiers.find(P=>P.id===u.preferTier);if(g){if(u.maxSpend&&parseFloat(g.price)>parseFloat(u.maxSpend))throw new B("access_pass_exceeds_max_spend",`Access pass tier "${g.id}" costs $${g.price}, exceeds max spend $${u.maxSpend}`);I=`tier=${g.id}`}}else if(u?.preferDuration&&R.ratePerHour)I=`duration=${u.preferDuration}`;else if(R.tiers&&R.tiers.length>0){let g=R.tiers[0];if(u?.maxSpend&&parseFloat(g.price)>parseFloat(u.maxSpend))throw new B("access_pass_exceeds_max_spend",`Cheapest access pass costs $${g.price}, exceeds max spend $${u?.maxSpend}`);I=`tier=${g.id}`}let k=I?T.includes("?")?`${T}&${I}`:`${T}?${I}`:T;l("Purchasing access pass:",I||"default tier");let q=w.headers.get("PAYMENT-REQUIRED");if(!q)return null;let $;try{$=JSON.parse(atob(q))}catch{return null}let U=N($.accepts);if(!U)return null;let{accept:O,adapter:H,wallet:ve}=U;if(H.name==="Solana"&&!O.extra?.feePayer)return null;let G=O.extra?.decimals??(on(O.asset)?6:void 0);if(typeof G!="number")return null;let Ke=O.amount??O.maxAmountRequired;if(!Ke)return null;let z=F(O.network,H);try{let g=await H.getBalance(O,ve,z),P=Number(Ke)/Math.pow(10,G);if(g<P){let Bt=C(O.network,H.name);throw new B("insufficient_balance",`Insufficient balance for access pass on ${Bt}. Have $${g.toFixed(4)}, need $${P.toFixed(4)}`)}}catch(g){if(g instanceof B)throw g}let X=await H.buildTransaction(O,ve,z),Se;H.name==="EVM"?Se=JSON.parse(X.serialized):Se={transaction:X.serialized};let te=typeof h=="string"?h:h instanceof URL?h.href:h.url,we=$.resource;if(typeof $.resource=="string")try{let g=new URL($.resource,te);["http:","https:"].includes(g.protocol)&&(we=g.toString())}catch{}else if($.resource&&typeof $.resource=="object"&&"url"in $.resource){let g=$.resource;try{let P=new URL(g.url,te);["http:","https:"].includes(P.protocol)&&(we={...g,url:P.toString()})}catch{}}let dt={x402Version:O.x402Version??2,resource:we,accepted:O,payload:Se};X.extensions&&(dt.extensions=X.extensions);let J=btoa(JSON.stringify(dt)),ne=await a(k,{...S,method:"POST",headers:{...S?.headers||{},"Content-Type":"application/json","PAYMENT-SIGNATURE":J}});if(!ne.ok)return l("Pass purchase failed:",ne.status),null;let W=ne.headers.get("ACCESS-PASS");return W&&(b(T,W),l("Access pass purchased and cached")),ne}async function E(h,S){let w=h;if(l("Making request:",w),u){let g=A(w);if(g){l("Using cached access pass");let P=await a(h,{...S,headers:{...S?.headers||{},Authorization:`Bearer ${g}`}});if(P.status!==401&&P.status!==402)return P;l("Cached pass rejected (status",P.status,"), purchasing new pass");try{x.delete(new URL(w).host)}catch{}}}let R=await p(h,S);if(R.status!==402)return R;l("Received 402 Payment Required");let T=R.headers.get("X-ACCESS-PASS-TIERS");if(u&&T){l("Server offers access passes, purchasing...");try{let g=JSON.parse(atob(T)),P=await M(h,S,R,g,w);if(P)return P}catch(g){l("Access pass purchase failed, falling back to per-request payment:",g)}}let I=R.headers.get("PAYMENT-REQUIRED");if(!I)throw new B("missing_payment_required_header","Server returned 402 but no PAYMENT-REQUIRED header");let k;try{let g=atob(I);k=JSON.parse(g)}catch{throw new B("invalid_payment_required","Failed to decode PAYMENT-REQUIRED header")}l("Payment requirements:",k);let q=R.headers.get("X-Quote-Hash");q&&l("Quote hash received:",q);let $=N(k.accepts);if(!$){let g=k.accepts.map(P=>P.network).join(", ");throw new B("no_matching_payment_option",`No connected wallet for any available network: ${g}`)}let{accept:U,adapter:O,wallet:H}=$;if(l(`Using ${O.name} for ${U.network}`),O.name==="Solana"&&!U.extra?.feePayer)throw new B("missing_fee_payer","Solana payment option missing feePayer in extra");let ve=U.extra?.decimals??(on(U.asset)?6:void 0);if(typeof ve!="number")throw new B("missing_decimals","Payment option missing decimals - provide in extra or use a known stablecoin");let G=U.amount??U.maxAmountRequired;if(!G)throw new B("missing_amount","Payment option missing amount");if(i&&BigInt(G)>BigInt(i))throw new B("amount_exceeds_max",`Payment amount ${G} exceeds maximum ${i}`);let Ke=F(U.network,O);l("Checking balance...");try{let g=await O.getBalance(U,H,Ke),P=Number(G)/Math.pow(10,ve);if(g<P){let Bt=C(U.network,O.name);throw new B("insufficient_balance",`Insufficient balance on ${Bt}. Have $${g.toFixed(4)}, need $${P.toFixed(4)}`)}l(`Balance OK: $${g.toFixed(4)} >= $${P.toFixed(4)}`)}catch(g){if(g instanceof B)throw g;l("Balance check failed (RPC error), proceeding with transaction attempt")}if(d&&!await d(U))throw new B("payment_rejected","Payment rejected by onPaymentRequired callback");l("Building transaction...");let z=await O.buildTransaction(U,H,Ke);l("Transaction signed");let X;O.name==="EVM"?X=JSON.parse(z.serialized):X={transaction:z.serialized};let Se=h,te=k.resource;if(typeof k.resource=="string")try{let g=new URL(k.resource,Se).toString();g!==k.resource&&l("Resolved relative resource URL:",k.resource,"\u2192",g),te=g}catch{te=k.resource}else if(k.resource&&typeof k.resource=="object"&&"url"in k.resource){let g=k.resource;try{let P=new URL(g.url,Se).toString();P!==g.url&&(l("Resolved relative resource URL:",g.url,"\u2192",P),te={...g,url:P})}catch{}}let we={x402Version:U.x402Version??2,resource:te,accepted:U,payload:X};z.extensions&&(we.extensions=z.extensions);let dt=btoa(JSON.stringify(we));if(f)try{f(U,z.settlementProbe)}catch{}l("Retrying request with payment...");let J=await p(h,{...S,headers:{...S?.headers||{},"PAYMENT-SIGNATURE":dt,...q?{"X-Quote-Hash":q}:{}}});if(l("Retry response status:",J.status),J.status===402){let g="unknown";try{let P=await J.clone().json();g=String(P.error||P.message||JSON.stringify(P)),l("Rejection reason:",g)}catch{}throw new B("payment_rejected",`Payment was rejected by the server: ${g}`)}let ne=J.headers.get("PAYMENT-RESPONSE"),W;if(ne)try{W=JSON.parse(atob(ne))}catch{}return W??={},W.amountAtomic=G,W.assetDecimals=ve,so.set(J,W),W.extensions&&l("Settlement extensions:",Object.keys(W.extensions).join(", ")),J}async function V(h,S){let[w,R]=await oo(h,S);return E(w,R)}return{fetch:V}}function j(e){if(e instanceof Error){if(e.message&&e.message.length>0)return e.message;if(e.name&&e.name.length>0)return e.name}let t=String(e);return t.length>0?t:"unknown error"}async function mt(e){let t="";try{t=(await e.clone().text()).slice(0,600)}catch{}let n=t.toLowerCase(),r=n.includes("settle")||n.includes("facilitator"),o=t;try{let s=JSON.parse(t),i=[s.error,s.detail,s.message].filter(a=>typeof a=="string"&&a.length>0);i.length>0&&(o=i.join(" \u2014 "))}catch{}return o||(o=`HTTP ${e.status}`),{reason:r?"settlement_failed":"merchant_rejected",detail:`merchant HTTP ${e.status}: ${o}`}}var Nt="Payment authorization was sent, but the merchant did not respond within the timeout. ",kt=" Do not retry without checking \u2014 inspect the funding wallet for a transfer to the merchant before attempting payment again.";async function Ot(e,t,n){if(!e)return{confirmed:!1,detail:Nt+"This payment scheme has no on-chain confirmation check, so the SDK cannot verify whether it settled."+kt};try{if(e.kind==="solana"){let i=ee(),a=n??i.getDefaultRpcUrl(t.caip2);if(!i.confirmSettlement)return Vn();let c=await i.confirmSettlement(e,a);return c.settled?{confirmed:!0,txSignature:c.txSignature}:In()}let r=Me(),o=r.getDefaultRpcUrl(t.caip2);if(!r.confirmSettlement)return Vn();let s=await r.confirmSettlement(e,o);return s.settled?{confirmed:!0,txSignature:s.txSignature}:In()}catch(r){return{confirmed:!1,detail:Nt+`On-chain confirmation could not be completed (${j(r)}).`+kt}}}function In(){return{confirmed:!1,detail:Nt+"On-chain confirmation found no matching settlement yet \u2014 the payment may still be pending, or may not have settled."+kt}}function Vn(){return{confirmed:!1,detail:Nt+"The chain adapter does not support on-chain confirmation."+kt}}var io=new Set(["exact","exact-approval"]);async function ao(e,t,n,r){let o;try{o=await r.signNextVoucher(n.amount)}catch(c){return r.voucherVersion!==1?{ok:!1,reason:"error",detail:`context-bound FINAL tab voucher was not safely released; retry or reconcile this tab before another payment rail is attempted (${c instanceof Error?c.message:String(c)})`}:null}let s=new Headers(t.headers??void 0);s.set("X-Tab-Voucher",bt(o));let i={method:t.method??"GET",headers:s};t.signal&&(i.signal=t.signal),typeof t.body=="string"&&(i.body=t.body);let a;try{a=await fetch(e,i)}catch(c){return{ok:!1,reason:"error",detail:c?.message??String(c)}}return a.status===402?r.voucherVersion!==1?{ok:!1,reason:"error",detail:"seller refused an irrevocable FINAL tab voucher; its exact reservation must be reconciled before another payment rail is attempted"}:r.rollbackVoucher?.call(r,o)!==!0?{ok:!1,reason:"error",detail:"seller refused a V1 tab voucher but local rollback was unavailable or failed; another payment rail was not attempted to avoid double payment"}:null:a.ok?{ok:!0,paid:!0,response:a,amountPaid:n.amount,network:n.network}:{ok:!1,...await mt(a)}}var Cn={version:2,async parseChallenge(e){return St(e)},async pay(e,t,n,r,o){if(o.tab){let A=n.options.find(b=>b.scheme==="tab"&&b.network.family==="svm"&&b.payTo===o.tab.counterparty);if(A){let b=await ao(e,t,A,o.tab);if(b)return b}}let s=n.options.filter(A=>io.has(A.scheme));if(s.length===0)return{ok:!1,reason:"no_payment_options",detail:`no generically payable scheme offered (got: ${n.options.map(A=>A.scheme).join(", ")})`};let i=s.find(A=>A.network.family==="evm"?!!r.evm:A.network.family==="svm"?!!r.solana:!1);if(!i)return{ok:!1,reason:"unsupported_network"};let a=o.timeoutMs??15e3,c=o.responseTimeoutMs??12e4,u=new AbortController,d=setTimeout(()=>u.abort(),a),f=!1,m,v=(A,b)=>{f=!0,m=b,clearTimeout(d),d=setTimeout(()=>u.abort(),c)},l=Pn({wallets:r,preferredNetwork:i.network.caip2,maxAmountAtomic:o.maxAmountAtomic,fetch:globalThis.fetch,onPaymentDispatched:v}),p=t.signal?AbortSignal.any([t.signal,u.signal]):u.signal,x={method:t.method??"GET",headers:t.headers,signal:p};typeof t.body=="string"&&(x.body=t.body);try{let A=await l.fetch(e,x);if(clearTimeout(d),!A.ok)return{ok:!1,...await mt(A)};let b,_=A.headers.get("PAYMENT-RESPONSE");if(_)try{let N=Qt(_);N&&typeof N.transaction=="string"&&(b=N.transaction)}catch{}return{ok:!0,paid:!0,response:A,amountPaid:i.amount,network:i.network,txSignature:b}}catch(A){clearTimeout(d);let b=A;if(b?.name==="AbortError"){if(!f)return{ok:!1,reason:"timeout"};let _=await Ot(m,i.network,o.solanaRpcUrl);return _.confirmed?{ok:!0,paid:!0,response:void 0,amountPaid:i.amount,network:i.network,txSignature:_.txSignature}:{ok:!1,reason:"payment_unconfirmed",detail:_.detail}}return{ok:!1,reason:"error",detail:b?.message??String(A)}}}};import{getAddress as co}from"viem";var uo={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 lo(){let e=globalThis.crypto??(await import("crypto")).webcrypto,t=new Uint8Array(32);return e.getRandomValues(t),"0x"+Array.from(t,n=>n.toString(16).padStart(2,"0")).join("")}async function mo(e,t,n){if(typeof e.signTypedData!="function")throw new Error("EVM wallet does not support signTypedData");let r=Math.floor(Date.now()/1e3),o=String(r-600),s=String(r+(t.maxTimeoutSeconds??60)),i={from:e.address,to:t.payTo,value:t.amount,validAfter:o,validBefore:s,nonce:await lo()},a=lt[t.network.caip2];if(a===void 0)throw new Error(`unknown chain id for network ${t.network.caip2}`);let c=t.extra,u=await e.signTypedData({domain:{name:c.name,version:c.version,chainId:a,verifyingContract:co(t.asset)},types:uo,primaryType:"TransferWithAuthorization",message:i});return{payment:{x402Version:1,scheme:t.scheme,network:n,payload:{signature:u,authorization:i}},settlementProbe:{kind:"eip3009",from:i.from,nonce:i.nonce,asset:t.asset,chainId:a}}}async function sn(e,t,n){try{let r;for(let o of e.options){let s=o.network.family==="evm"&&!!t.evm||o.network.family==="svm"&&!!t.solana;if(o.scheme!=="exact"){s&&(r=o.scheme);continue}if(o.network.family==="evm"&&t.evm){let i=await t.evm;return await po(o,i,n)}if(o.network.family==="svm"&&t.solana){let i=await t.solana;return await fo(o,i,n)}}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 po(e,t,n){if(n.maxAmountAtomic!==void 0&&BigInt(e.amount)>BigInt(n.maxAmountAtomic))return{ok:!1,reason:"budget_exceeded"};let r=e.extra??{},o=r.name,s=r.version;if(typeof o!="string"||o.length===0||typeof s!="string"||s.length===0)return{ok:!1,reason:"merchant_rejected",detail:"v1 challenge missing exact-scheme EIP-712 domain (extra.name / extra.version)"};let i=e.network.bare,{payment:a,settlementProbe:c}=await mo(t,e,i);return{ok:!0,headerValue:Buffer.from(JSON.stringify(a),"utf8").toString("base64"),option:e,settlementProbe:c}}async function fo(e,t,n){if(n.maxAmountAtomic!==void 0&&BigInt(e.amount)>BigInt(n.maxAmountAtomic))return{ok:!1,reason:"budget_exceeded"};if(e.scheme!=="exact")return{ok:!1,reason:"merchant_rejected",detail:`v1 SVM supports only the 'exact' scheme, got '${e.scheme}'`};let r=e.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=e.network.bare,s={x402Version:1,scheme:e.scheme,network:o,asset:e.asset,payTo:e.payTo,amount:e.amount,maxAmountRequired:e.amount,maxTimeoutSeconds:e.maxTimeoutSeconds??60,extra:r},a=await ee().buildTransaction(s,t,n.solanaRpcUrl),c={x402Version:1,scheme:e.scheme,network:o,payload:{transaction:a.serialized}};return{ok:!0,headerValue:Buffer.from(JSON.stringify(c),"utf8").toString("base64"),option:e,settlementProbe:a.settlementProbe}}function go(e){let t=[];for(let n of e){if(!n||typeof n!="object")continue;let r=n,o=je(String(r.network??""));o&&t.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 t}var Nn={version:1,async parseChallenge(e){if(e.headers.get("payment-required"))return null;let t;try{t=await e.clone().json()}catch{return null}let n=Array.isArray(t.accepts)?t.accepts:[];if(n.length===0)return null;let r=go(n);return r.length===0?null:{x402Version:1,options:r}},async pay(e,t,n,r,o){let s,i=new AbortController,a=!1,c,u;try{let d=o.timeoutMs??15e3;s=setTimeout(()=>i.abort(),d);let f=await sn(n,r,o);if(!f.ok)return{ok:!1,reason:f.reason,detail:f.detail};let m=f.headerValue,v=f.option;u=v,c=f.settlementProbe;let l=new Headers(t.headers??void 0);l.set("X-PAYMENT",m);let p=t.signal!=null?AbortSignal.any([t.signal,i.signal]):i.signal,x={method:t.method,headers:l,signal:p};typeof t.body=="string"&&(x.body=t.body),a=!0,clearTimeout(s);let A=o.responseTimeoutMs??12e4;s=setTimeout(()=>i.abort(),A);let b=await fetch(e,x);return b.ok?{ok:!0,paid:!0,response:b,amountPaid:v.amount,network:v.network,txSignature:ho(b)}:{ok:!1,...await mt(b)}}catch(d){if(d instanceof Error&&d.name==="AbortError"){if(!a)return{ok:!1,reason:"timeout"};let f=await Ot(c,u.network,o.solanaRpcUrl);return f.confirmed?{ok:!0,paid:!0,response:void 0,amountPaid:u.amount,network:u.network,txSignature:f.txSignature}:{ok:!1,reason:"payment_unconfirmed",detail:f.detail}}return{ok:!1,reason:"error",detail:j(d)}}finally{s!==void 0&&clearTimeout(s)}}};function ho(e){let t=e.headers.get("x-payment-response")??e.headers.get("X-PAYMENT-RESPONSE");if(t)try{let n=JSON.parse(Buffer.from(t,"base64").toString("utf8")),r=n.transaction??n.txHash??n.transactionHash;return typeof r=="string"?r:void 0}catch{return}}import*as On from"tweetnacl";import{Keypair as Ai,VersionedTransaction as bi,Transaction as vi}from"@solana/web3.js";var kn=Symbol.for("x402:keypair");function an(e){let t=e.evm;if(t&&typeof t.signMessage=="function"&&typeof t.address=="string")return{address:t.address,signMessage:t.signMessage};let n=e.solana;if(n){let r=n[kn];if(r&&r.secretKey&&r.publicKey)return{publicKey:r.publicKey,signMessage:async o=>On.sign.detached(o,r.secretKey)}}return null}var yo=[Cn,Nn];async function Ao(e){let t=an(e);if(!t)return fetch;try{return(await import("@x402/extensions/sign-in-with-x")).wrapFetchWithSIWx(fetch,t)}catch(n){return console.warn(`[x402] SIW-X unavailable \u2014 @x402/extensions failed to load; SIW-X merchants will not authenticate. ${j(n)}`),fetch}}async function cn(e,t,n,r){if(t.body!==void 0&&t.body!==null&&typeof t.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 Ao(n))(e,{...t})}catch(s){return{ok:!1,reason:"error",detail:j(s)}}if(o.status!==402)return{ok:!0,paid:!1,response:o};for(let s of yo){let i=await s.parseChallenge(o.clone());if(i)return s.pay(e,t,i,n,r)}return{ok:!1,reason:"no_payment_options"}}async function bo(e,t={},n){let r=await Ge(e,t);if(r.kind==="free")return{result:{ok:!0,paid:!1,response:r.response},tab:null};if(r.kind==="no_tab")return{result:{ok:!1,reason:"no_payment_options",detail:`no tab option offered (schemes: ${r.schemesOffered.join(", ")})`},tab:null};if(r.kind==="error")return{result:{ok:!1,reason:"error",detail:r.detail},tab:null};let{offer:o}=r,s=BigInt(ie(n.perUnitCap));if(BigInt(o.amountAtomic)>s)return{result:{ok:!1,reason:"budget_exceeded",detail:`seller quotes ${o.amountAtomic} atomic; perUnitCap allows ${s}`},tab:null};let i=n.tabs?.get(o.payTo);return(!i||!i.state.isOpen)&&(i=await Gt({vault:n.vault,network:"solana:mainnet",seller:o.payTo,perUnitCap:n.perUnitCap,totalCap:n.totalCap,sessionDuration:n.sessionDuration,facilitatorUrl:n.facilitatorUrl,onLiveSession:n.onLiveSession,reserveFinalVoucherV2:n.reserveFinalVoucherV2}),n.tabs?.set(o.payTo,i)),{result:await cn(e,t,{},{tab:i}),tab:i}}function vo(e){return{counterparty:e.payTo,perRequest:{atomic:e.amountAtomic,human:Pe(e.amountAtomic)},asset:e.asset,network:{caip2:e.networkCaip2},scheme:"tab",settlement:{custody:"non-custodial",protection:"lock",settleOn:"close"},credit:null,...e.resourceUrl!==void 0?{resourceUrl:e.resourceUrl}:{}}}async function So(e,t={},n={}){let r=n.cache?.get(e);if(r)return{kind:"terms",terms:r};let o=await Ge(e,t,n.fetchImpl??fetch);if(o.kind!=="offer")return o;if(o.offer.asset!==ct)return{kind:"error",detail:`tab offer asset is not USDC ("${o.offer.asset}"); refusing to render a human price`};let s=vo(o.offer);return n.cache?.set(e,s),{kind:"terms",terms:s}}export{At as DEFAULT_FACILITATOR_URL,Ee as DEXTER_VAULT_PROGRAM_ID,Ht as FINAL_VOUCHER_V2_RESERVATION_BINDING_DOMAIN,dn as FINAL_VOUCHER_V2_RESERVATION_MEMO_PREFIX,qt as FINAL_VOUCHER_V2_SOLANA_MAINNET_CAIP2,jr as HOSTED_TAB_ACCEPTANCE_RULE,zr as HOSTED_TAB_REGISTRATION_ENCODING,Hr as HOSTED_TAB_TERMS_VERSION,Gr as HOSTED_TAB_VOUCHER_HEADER,Y as HistoricalV1MigrationRequiredError,or as INSTRUCTIONS_SYSVAR_ID,Ut as LiveSessionExistsError,rr as SECP256R1_PROGRAM_ID,xe as SessionScopeExceededError,re as TabClosedError,_e as UnsupportedNetworkError,ur as armTabOpen,oe as assertFinalVoucherV2ReservationReceipt,Pe as atomicToHuman,er as buildRegisterSessionKeyInstruction,tr as buildRevokeSessionKeyInstruction,nr as buildSecp256r1VerifyInstruction,Ln as buildVoucherMessage,ht as canonicalFinalVoucherV2ReservationNetwork,Le as deriveChannelId,yt as finalVoucherV2Digest,gn as finalVoucherV2ReservationBindingDigest,fn as finalVoucherV2ReservationBindingDigestFromIdentity,$e as finalVoucherV2ReservationIdentity,jt as finalVoucherV2ReservationMemo,Kn as finalVoucherV2Sequence,Gn as generateSessionKeypair,ie as humanToAtomic,Ft as makeSessionKey,Gt as openTab,Re as parseAtomic,bo as payUrlWithTab,Ge as resolveTabOffer,So as resolveTabTerms,lr as resumeTab,Yn as scopeCapAtomic,Fe as sessionRegisterMessage,Bn as sessionReplaceV1Message,Un as sessionRevokeMessage,Mn as sessionVoucherV2AuthorizationNonce,Dn as sessionVoucherV2Nonce,$t as signContextBoundFinalVoucherV2,Lt as signVoucher,Kr as tabFromGrant,Dt as voucherPayloadMessage,bt as voucherToHeader,Fn as voucherV2SequenceOrdinal};
|
|
6
|
+
`):null}}import He from"tweetnacl";import{Connection as Nr,PublicKey as We}from"@solana/web3.js";import{bytesToHex as kr}from"@noble/hashes/utils";import{deriveSessionPda as Or,fetchSessionAccount as Br,isSessionLive as Ur}from"@dexterai/vault/session";import{voucherV2SequenceOrdinal as Dr}from"@dexterai/vault/messages";import{readVaultFull as Mr}from"@dexterai/vault/reader";import{PublicKey as Z}from"@solana/web3.js";import{bytesToHex as Xt}from"@noble/hashes/utils";import{deriveGraphConfigPda as fr,deriveSwigVaultBindingPda as Jt}from"@dexterai/vault/credit";import{DEXTER_VAULT_PROGRAM_ID as gr,DISCRIMINATORS as hr,isSwigVaultBindingIdentityVersion as An}from"@dexterai/vault/constants";import{deriveSwigWalletAddress as yr}from"@dexterai/vault/instructions";import{decodeVaultFull as Ar}from"@dexterai/vault/reader";import{decodeSessionAccount as br,deriveSessionPda as Yt}from"@dexterai/vault/session";var vr=Uint8Array.from([56,67,4,209,238,143,0,129]),Sr=74,wr=188,_r=new Z("MemoSq4gqABAXKb96qnH8TysNcWxMyWCqXgDLGmfcHr"),xr=(()=>{let e=Buffer.alloc(32);return e.write("OTS_SESSION_REGISTER_V2","ascii"),e})(),zt=class extends Error{constructor(n,r){super(`native_tab_v2_solana_reservation_invalid:${n}`+(r?`:${r}`:""));this.code=n;this.name="SolanaFinalVoucherV2ReservationError"}code};function y(e,t){throw new zt(e,t)}function L(e,t){try{return new Z(e)}catch{return y(t)}}function vt(e,t){return e.length===t.length&&e.every((n,r)=>n===t[r])}async function Rr(e){let n=(await e.connection.getSignatureStatuses([e.signature],{searchTransactionHistory:!0})).value[0]??null;if(!n)return null;n.confirmationStatus!=="confirmed"&&n.confirmationStatus!=="finalized"&&y("transaction_commitment"),n.err!==null&&y("transaction_failed");let r=await e.connection.getTransaction(e.signature,{commitment:e.commitment,maxSupportedTransactionVersion:0});if(!r)return null;r.meta||y("transaction_meta_missing"),r.slot!==n.slot&&y("transaction_status_slot");let o=r.transaction.message,s=o.version===0?o.getAccountKeys({accountKeysFromLookups:r.meta.loadedAddresses??null}):o.getAccountKeys(),i=(a,c)=>{let u=s.get(a);return u||y(c),u};return{slot:r.slot,confirmationStatus:n.confirmationStatus,err:r.meta.err,signatures:[...r.transaction.signatures],accountKeys:Array.from({length:s.length},(a,c)=>({address:i(c,"transaction_account_key").toBase58(),signer:o.isAccountSigner(c),writable:o.isAccountWritable(c)})),instructions:o.compiledInstructions.map(a=>({programId:i(a.programIdIndex,"transaction_program_id").toBase58(),accounts:a.accountKeyIndexes.map(c=>i(c,"transaction_instruction_account").toBase58()),data:Uint8Array.from(a.data)}))}}function Tr(e,t,n,r){r.length!==Sr&&y("binding_length"),vt(r.subarray(0,8),vr)||y("binding_discriminator");let o=r.readUInt8(8),s=r.readUInt8(9);return An(o)||y("binding_version"),s!==t&&y("binding_bump"),{address:e.toBase58(),owner:n.toBase58(),version:o,bump:s,swig:new Z(r.subarray(10,42)).toBase58(),vault:new Z(r.subarray(42,74)).toBase58()}}async function Er(e){let t=L(e.input.programId,"program_id"),n=L(e.input.buyerSwigAddress,"buyer_swig"),r=L(e.input.vaultPda,"vault_pda"),o=L(e.input.seller,"seller"),[s,i]=Jt(n,t),[a]=Yt(r,o,t),c=await e.connection.getMultipleAccountsInfoAndContext([s,r,a],{commitment:e.commitment,minContextSlot:e.minimumSlot}),[u,d,f]=c.value;u||y("binding_missing"),d||y("vault_missing"),f||y("session_missing");let m,v;try{m=Ar(Buffer.from(d.data)),v=br(a,f.data)}catch(p){return y("post_state_decode",p instanceof Error?p.message:String(p))}let l=v.session;return{contextSlot:c.context.slot,binding:Tr(s,i,u.owner,Buffer.from(u.data)),vault:{owner:d.owner.toBase58(),exists:m.exists,version:m.version,swigAddress:m.swigAddress,dexterAuthority:m.dexterAuthority,pendingVoucherCount:m.pendingVoucherCount},session:{owner:f.owner.toBase58(),version:v.version,bump:v.bump,vault:v.vault,sessionPublicKey:Xt(l.sessionPubkey),maxAmount:l.maxAmount,expiresAt:l.expiresAt,seller:l.allowedCounterparty,nonce:l.nonce,spent:l.spent,currentOutstanding:l.currentOutstanding,maxRevolvingCapacity:l.maxRevolvingCapacity,crystallizedCumulative:l.crystallizedCumulative}}}function Pr(e){let t=Buffer.from(e.voucher.sessionRegistration);return t.length!==wr&&y("registration_length"),vt(t.subarray(0,32),xr)||y("registration_domain"),{programId:new Z(t.subarray(32,64)).toBase58(),vaultPda:new Z(t.subarray(64,96)).toBase58(),sessionPublicKey:Xt(t.subarray(96,128)),maxAmount:t.readBigUInt64LE(128),expiresAt:t.readBigInt64LE(136),seller:new Z(t.subarray(144,176)).toBase58(),nonce:t.readUInt32LE(176),maxRevolvingCapacity:t.readBigUInt64LE(180)}}function Ve(e,t,n){let r=e.accountKeys.filter(o=>o.address===t);return r.length!==1&&y(`${n}_account_key`),r[0]}function Ir(e,t,n){(!Number.isSafeInteger(n.slot)||n.slot<=0)&&y("transaction_slot"),n.slot!==t.confirmationSlot&&y("transaction_confirmation_slot"),n.err!==null&&y("transaction_failed"),n.signatures[0]!==t.transaction&&y("transaction_signature"),n.instructions.length!==2&&y("transaction_instruction_count");let r=L(e.programId,"program_id"),o=L(e.buyerSwigAddress,"buyer_swig"),s=L(e.vaultPda,"vault_pda"),i=L(e.seller,"seller"),a=L(e.sessionPda,"session_pda"),[c]=Yt(s,i,r),u=Jt(o,r)[0],d=yr(o),f=fr(r)[0];a.equals(c)||y("session_pda_derivation");let m=Buffer.from(hr.settle_voucher),v=n.instructions.filter(E=>{if(E.programId!==e.programId)return!1;let V=E.data;return V.length>=m.length&&vt(V.subarray(0,m.length),m)});v.length!==1&&y("settle_voucher_instruction_count");let l=v[0];n.instructions[0]!==l&&y("settle_voucher_instruction_order");let p=Buffer.from(l.data);p.length!==49&&y("settle_voucher_instruction_length"),p.readBigUInt64LE(8).toString()!==e.reservationAmountAtomic&&y("settle_voucher_amount"),p.readUInt8(16)!==1&&y("settle_voucher_increment"),new Z(p.subarray(17,49)).equals(i)||y("settle_voucher_seller"),l.accounts.length<8&&y("settle_voucher_accounts"),[s.toBase58(),null,a.toBase58(),null,o.toBase58(),d.toBase58(),u.toBase58(),f.toBase58()].forEach((E,V)=>{E!==null&&l.accounts[V]!==E&&y(`settle_voucher_account_${V}`)});let A=l.accounts[1];A||y("dexter_authority");let b=Ve(n,l.accounts[0],"vault"),_=Ve(n,A,"dexter_authority"),N=Ve(n,l.accounts[2],"session");(!b.writable||b.signer)&&y("vault_privileges"),_.signer||y("dexter_authority_signature"),(!N.writable||N.signer)&&y("session_privileges");for(let E=3;E<Math.min(l.accounts.length,8);E+=1)Ve(n,l.accounts[E],`account_${E}`).signer&&y(`settle_voucher_account_${E}_signer`);for(let E=8;E<l.accounts.length;E+=1){let V=Ve(n,l.accounts[E],`sibling_${E-8}`);(!V.writable||V.signer)&&y("settle_voucher_sibling_privileges")}let C=n.instructions[1];C.programId!==_r.toBase58()&&y("reservation_memo_program"),(C.accounts.length!==1||C.accounts[0]!==A)&&y("reservation_memo_authority"),Ve(n,A,"reservation_memo_authority").signer||y("reservation_memo_authority_signature");let M=new TextEncoder().encode(jt(e));return vt(C.data,M)||y("reservation_memo_digest"),A}function Vr(e,t,n,r){let o=L(e.programId,"program_id"),s=L(e.buyerSwigAddress,"buyer_swig"),i=L(e.vaultPda,"vault_pda"),a=L(e.seller,"seller"),[c,u]=Jt(s,o),[d,f]=Yt(i,a,o);(!Number.isSafeInteger(r.contextSlot)||r.contextSlot<t)&&y("post_state_slot"),(r.binding.address!==c.toBase58()||r.binding.owner!==e.programId||r.binding.bump!==u||!An(r.binding.version)||r.binding.swig!==e.buyerSwigAddress||r.binding.vault!==e.vaultPda)&&y("binding_identity"),(r.vault.owner!==e.programId||!r.vault.exists||r.vault.version!==7||r.vault.swigAddress!==e.buyerSwigAddress||r.vault.dexterAuthority!==n)&&y("vault_post_state"),(e.sessionPda!==d.toBase58()||r.session.owner!==e.programId||r.session.version!==1||r.session.bump!==f||r.session.vault!==e.vaultPda||r.session.sessionPublicKey!==Xt(e.voucher.sessionPublicKey)||r.session.seller!==e.seller||r.session.nonce!==e.sessionNonce||r.session.currentOutstanding.toString()!==e.reservationAmountAtomic)&&y("session_post_state");let m=Pr(e);(m.programId!==e.programId||m.vaultPda!==e.vaultPda||m.sessionPublicKey!==r.session.sessionPublicKey||m.seller!==e.seller||m.nonce!==e.sessionNonce||m.maxAmount!==r.session.maxAmount||m.expiresAt!==BigInt(r.session.expiresAt)||m.maxRevolvingCapacity!==r.session.maxRevolvingCapacity)&&y("registration_post_state");let v=r.session.spent>r.session.crystallizedCumulative?r.session.spent:r.session.crystallizedCumulative;return v.toString()!==e.previousCumulativeAtomic&&y("session_frontier"),{commitment:"confirmed",confirmationSlot:t,postStateSlot:r.contextSlot,sessionAccountVersion:r.session.version,wireVersion:2,frontierAtomic:v.toString(),spentAtomic:r.session.spent.toString(),currentOutstandingAtomic:r.session.currentOutstanding.toString(),crystallizedCumulativeAtomic:r.session.crystallizedCumulative.toString()}}async function Cr(e,t,n,r={}){try{oe(t,n)}catch(a){return y("provider_receipt",a instanceof Error?a.message:String(a))}t.network!=="solana:mainnet"&&y("network"),t.programId!==gr.toBase58()&&y("program_id");let o=await(r.readTransaction??Rr)({connection:e,signature:n.transaction,commitment:"confirmed"});o||y("transaction_missing"),o.confirmationStatus!=="confirmed"&&o.confirmationStatus!=="finalized"&&y("transaction_commitment");let s=Ir(t,n,o),i=await(r.readPostState??Er)({connection:e,input:t,minimumSlot:o.slot,commitment:"confirmed"});return{...Vr(t,o.slot,s,i),commitment:o.confirmationStatus}}async function bn(e,t,n,r={}){await Cr(e,t,n,r)}var Zt="solana:mainnet";async function Kr(e){let t=e.facilitatorUrl??At,n=e.programId??Ee,r=new We(e.vaultPda),o=new We(e.params.counterparty),s=Re(e.perUnitCapAtomic);if(s<=0n)throw new Error(`perUnitCapAtomic must be > 0, got ${e.perUnitCapAtomic}`);let i=Re(e.params.maxAmountAtomic),a=Re(e.params.maxRevolvingCapacityAtomic),c=(e.params.nonce&2147483648)!==0;if(!c)throw new Y("tabFromGrant");if(c&&!e.reserveFinalVoucherV2)throw new Error("native_tab_v2_reservation_fence_required: provide reserveFinalVoucherV2; a FINAL voucher may not be released before its exact durable reservation");let u=Fr(e.sessionSecretKey),d=new We(e.params.sessionPubkey).toBytes();if(!vn(u.publicKey,d))throw new Error(`tab_session_key_mismatch: the supplied secret derives ${new We(u.publicKey).toBase58()} but params.sessionPubkey is ${e.params.sessionPubkey} \u2014 wrong key handed to this process`);let f=He.randomBytes(32),m=He.sign.detached(f,u.secretKey);if(!He.sign.detached.verify(f,m,d))throw new Error("tab_session_key_mismatch: secret key failed the sign/verify self-check against params.sessionPubkey \u2014 the seed half does not sign for the granted pubkey");let v=Fe({programId:n,vaultPda:r,sessionPubkey:u.publicKey,maxAmount:i,expiresAt:BigInt(e.params.expiresAtUnix),allowedCounterparty:o,nonce:e.params.nonce,maxRevolvingCapacity:a}),l=typeof e.connection=="string"?new Nr(e.connection,"confirmed"):e.connection,p=await Br(l,r,o,n);if(!p||p.version===0)throw new Error("tab_session_not_live: no live SessionAccount PDA for this (vault, counterparty) \u2014 revoked, expiry-swept, or never registered");if(!Ur(p))throw new Error(p.version!==1?`tab_session_not_live: SessionAccount has unsupported version ${p.version} \u2014 not a live v1 session`:`tab_session_not_live: SessionAccount is present but expired (expiresAt=${p.session.expiresAt})`);if(!vn(p.session.sessionPubkey,u.publicKey))throw new Error(`tab_session_pubkey_mismatch: the on-chain session carries ${new We(p.session.sessionPubkey).toBase58()} \u2014 the grant this key belongs to was replaced by a newer registration`);if(p.vault!==r.toBase58()||p.session.allowedCounterparty!==o.toBase58()||p.session.maxAmount!==i||p.session.expiresAt!==e.params.expiresAtUnix||p.session.nonce!==e.params.nonce||p.session.maxRevolvingCapacity!==a)throw new Error(`tab_grant_params_stale: params disagree with the on-chain session scope (chain: maxAmount=${p.session.maxAmount} expiresAt=${p.session.expiresAt} nonce=${p.session.nonce} revolving=${p.session.maxRevolvingCapacity}; params: ${e.params.maxAmountAtomic}/${e.params.expiresAtUnix}/${e.params.nonce}/${e.params.maxRevolvingCapacityAtomic}) \u2014 refresh the grant hand-off`);if(c&&p.session.currentOutstanding!==0n)throw new Error(`native_tab_v2_reservation_pending: the session already has an exact outstanding reservation of ${p.session.currentOutstanding}; recover that immutable attempt before issuing another FINAL voucher`);let x=p.session.spent>p.session.crystallizedCumulative?p.session.spent:p.session.crystallizedCumulative;if(x>=i)throw new Error(`tab_exhausted: on-chain frontier ${x} has consumed the session cap ${i} \u2014 no voucher can strictly exceed it; open a new grant`);let A=e.sellerUrl??e.params.counterparty,b=BigInt(Math.floor(Math.random()*4294967295)),_=Le({vaultPda:r,sellerUrl:A,nonce:b}),N=kr(_),C=e.swigAddress;if(!C){let h=await Mr(l,r);if(!h.exists||!h.swigAddress)throw new Error(`tab_vault_unreadable: vault ${r.toBase58()} has no readable swig_address on chain \u2014 pass options.swigAddress explicitly`);C=h.swigAddress}let F={channelId:N,maxAmountAtomic:e.params.maxAmountAtomic,revolvingCapacityAtomic:e.params.maxRevolvingCapacityAtomic,expiresAtUnix:e.params.expiresAtUnix,allowedCounterparty:e.params.counterparty},M=Ft({publicKey:u.publicKey,privateKey:u.secretKey},F,v),[E]=Or(r,o,n),V={network:Zt,swigAddress:C,vaultPda:r.toBase58(),sessionVoucherVersion:c?2:1,authorizeSession:async()=>{throw new Error("grant_tab_no_passkey: a grant-held tab cannot authorize sessions \u2014 session birth requires the wallet owner's passkey ceremony")},signWithSession:async(h,S)=>{if(!c)return Lt(h,S,_);let w=$t({programId:n.toBase58(),vaultPda:r.toBase58(),sessionPda:E.toBase58(),seller:o.toBase58(),sessionNonce:e.params.nonce,channelId:S.channelId,cumulativeAmountAtomic:S.cumulativeAmount,sequenceOrdinal:S.sequenceNumber,sessionPrivateKey:h.privateKey,sessionPublicKey:h.publicKey,sessionRegistration:h.registration});return{payload:{channelId:w.channelId,cumulativeAmount:w.cumulativeAmount,sequenceNumber:w.sequenceNumber},sessionPublicKey:Uint8Array.from(Buffer.from(w.sessionPublicKey,"hex")),sessionSignature:Uint8Array.from(Buffer.from(w.sessionSignature,"hex")),sessionRegistration:Uint8Array.from(Buffer.from(w.sessionRegistration,"hex"))}},signOpenTab:async h=>h.registration,signCloseTab:async()=>{throw new Error("grant_tab_cannot_revoke: session revocation is passkey-signed and belongs to the wallet owner's surfaces \u2014 a grant-held tab closes settle-only")},verifyFinalVoucherV2Reservation:c?(h,S)=>bn(l,h,S):void 0};return new qe({vault:V,network:Zt,seller:A,counterparty:e.params.counterparty,session:M,channelIdHex:N,channelIdBytes:_,perUnitCapAtomic:s,totalCapAtomic:i,expiresAtUnix:e.params.expiresAtUnix,facilitatorUrl:t,initialCumulativeAtomic:x,initialSequenceOrdinal:c&&p.session.lastLockedSequence!==0?Dr(p.session.lastLockedSequence):0,beforeVoucherRelease:c?async({voucher:h,incrementAtomic:S,previousCumulativeAtomic:w})=>{let R=$e(h),T={network:Zt,programId:n.toBase58(),buyerSwigAddress:C,vaultPda:r.toBase58(),sessionPda:E.toBase58(),seller:o.toBase58(),channelId:N,sessionNonce:e.params.nonce,reservationAmountAtomic:S,previousCumulativeAtomic:w,...R,voucher:h},I=await e.reserveFinalVoucherV2(T);return oe(T,I),await V.verifyFinalVoucherV2Reservation(T,I),I}:void 0,closeMode:"settle-only"})}function Fr(e){if(e.length===64)return He.sign.keyPair.fromSecretKey(e);if(e.length===32)return He.sign.keyPair.fromSeed(e);throw new Error(`tab_session_key_invalid: expected a 64-byte nacl secretKey or a 32-byte ed25519 seed, got ${e.length} bytes`)}function vn(e,t){if(e.length!==t.length)return!1;let n=0;for(let r=0;r<e.length;r++)n|=e[r]^t[r];return n===0}import{PublicKey as Wr}from"@solana/web3.js";var Sn=[{caip2:"eip155:8453",bare:"base",family:"evm"},{caip2:"eip155:1",bare:"ethereum",family:"evm"},{caip2:"eip155:137",bare:"polygon",family:"evm"},{caip2:"eip155:42161",bare:"arbitrum",family:"evm"},{caip2:"eip155:10",bare:"optimism",family:"evm"},{caip2:"eip155:43114",bare:"avalanche",family:"evm"},{caip2:"eip155:56",bare:"bsc",family:"evm"},{caip2:"eip155:480",bare:"world",family:"evm"},{caip2:"eip155:143",bare:"monad",family:"evm"},{caip2:"eip155:4663",bare:"robinhood",family:"evm"},{caip2:"eip155:1187947933",bare:"skale-base",family:"evm"},{caip2:"eip155:324705682",bare:"skale-base-sepolia",family:"evm"},{caip2:"solana:5eykt4UsFv8P8NJdTREpY1vzqKqZKvdp",bare:"solana",family:"svm"}],Lr=new Map(Sn.map(e=>[e.caip2.toLowerCase(),e])),$r=new Map(Sn.map(e=>[e.bare.toLowerCase(),e]));function je(e){if(!e)return null;let t=e.toLowerCase(),n=Lr.get(t)||$r.get(t);return n?{caip2:n.caip2,bare:n.bare,family:n.family}:null}function Qt(e){let t=e.replace(/-/g,"+").replace(/_/g,"/"),n=t+"=".repeat((4-(t.length%4||4))%4);return JSON.parse(Buffer.from(n,"base64").toString("utf8"))}function qr(e){let t=[];for(let n of e){if(!n||typeof n!="object")continue;let r=n,o=je(String(r.network??""));o&&t.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 t}async function St(e){let t=e.headers.get("payment-required");if(!t)return null;let n;try{n=Qt(t)}catch{return null}let r=Array.isArray(n.accepts)?n.accepts:[];return r.length===0?null:{x402Version:2,options:qr(r),resourceUrl:n.resource&&typeof n.resource=="object"?String(n.resource.url??""):void 0}}async function Ge(e,t={},n=fetch){let r={method:t.method??"GET",headers:t.headers};typeof t.body=="string"&&(r.body=t.body);let o;try{o=await n(e,r)}catch(a){return{kind:"error",detail:`probe failed: ${a?.message??String(a)}`}}if(o.status!==402)return o.ok?{kind:"free",response:o}:{kind:"error",detail:`probe returned HTTP ${o.status}`};let s=await St(o);if(!s)return{kind:"error",detail:"the 402 carries no x402 v2 PAYMENT-REQUIRED challenge"};let i=s.options.find(a=>a.scheme==="tab"&&a.network.family==="svm");if(!i)return{kind:"no_tab",schemesOffered:s.options.map(a=>a.scheme)};try{new Wr(i.payTo)}catch{return{kind:"error",detail:`tab option payTo is not a valid Solana pubkey: "${i.payTo}"`}}return{kind:"offer",offer:{payTo:i.payTo,amountAtomic:i.amount,asset:i.asset,networkCaip2:i.network.caip2,...typeof i.extra?.voucherHeader=="string"?{voucherHeader:i.extra.voucherHeader}:{},...typeof i.extra?.registrationEncoding=="string"?{registrationEncoding:i.extra.registrationEncoding}:{},...typeof i.extra?.termsVersion=="string"?{termsVersion:i.extra.termsVersion}:{},...typeof i.extra?.acceptanceRule=="string"?{acceptanceRule:i.extra.acceptanceRule}:{},resourceUrl:s.resourceUrl}}}var Hr="dexter-tab-hosted-pay-before-delivery/v1",jr="pay_before_delivery_seller_2xx",Gr="x-tab-voucher",zr="base64(188-byte sessionRegisterMessage)";var ze="solana:5eykt4UsFv8P8NJdTREpY1vzqKqZKvdp",wt="solana:EtWTRABZaYq6iMfeYKouRu166VU2xqa1",_t="solana:4uhcVJyU9pJkvQyS88uRDiswHXSCkY3z",ce=ze,Xe=wt,Je=_t,ue="eip155:8453",Ce="eip155:84532",Ne="eip155:42161",ke="eip155:137",Oe="eip155:10",Be="eip155:43114",Ue="eip155:56",le="eip155:480",me="eip155:143",de="eip155:4663",pe="eip155:1187947933",fe="eip155:324705682",De="eip155:1",ge=ue,xt=Ce,Ye=Ne,Ze=ke,Qe=Oe,et=Be,tt=Ue,nt=le,rt=me,ot=de,st=pe,it=fe,at=De,ct="EPjFWdd5AufqSSqeM2qN1xzybapC8G4wEGGkZwyTDt1v",wn="4zMMC9srt5Ri5X14GAgXhaHii3GnPAEERYPJgZJDncDU",_n="0x833589fCD6eDb6E08f4c7C32D4f71b54bdA02913",en="0x55d398326f99059fF775485246999027B3197955",Rt="0x8AC76a51cc950d9822D68b83fE1Ad97B32Cd580d",tn="0x5fc5360D0400a0Fd4f2af552ADD042D716F1d168",Tt={[Ue]:Rt,[ue]:_n,[Ce]:"0x036CbD53842c5426634e7929541eC2318f3dCF7e",[Ne]:"0xaf88d065e77c8cC2239327C5EDb3A432268e5831",[ke]:"0x3c499c542cEF5E3811e1192ce70d8cC03d5c3359",[Oe]:"0x0b2C639c533813f4Aa9D7837CAf62653d097Ff85",[Be]:"0xB97EF9Ef8734C71904D8002F8b6Bc66Dd9c48a6E",[le]:"0x79A02482A880bCE3F13e09Da970dC34db4CD24d1",[me]:"0x754704Bc059F8C67012fEd69BC8A327a5aafb603",[de]:tn,[pe]:"0x85889c8c714505E0c94b30fcfcF64fE3Ac8FCb20",[fe]:"0x2e08028E3C4c2356572E096d8EF835cD5C6030bD",[De]:"0xA0b86991c6218b36c1d19D4a2e9Eb0cE3606eB48"},Et={[en]:{symbol:"USDT",decimals:18},[Rt]:{symbol:"USDC",decimals:18}};var Pt={[le]:{name:"USDC",version:"2"},[me]:{name:"USDC",version:"2"},[de]:{name:"Global Dollar",version:"1"},[pe]:{name:"Bridged USDC (SKALE Bridge)",version:"2"},[fe]:{name:"Bridged USDC (SKALE Bridge)",version:"2"}},Q="0x000000000022D473030F116dDEE9F6B43aC78BA3",ut="0x402085c248EeA27D92E8b30b2C58ed07f9E20001",lt={[Ue]:56,[ue]:8453,[Ce]:84532,[Ne]:42161,[ke]:137,[Oe]:10,[Be]:43114,[le]:480,[me]:143,[de]:4663,[pe]:1187947933,[fe]:324705682,[De]:1},he={[ze]:"https://api.dexter.cash/api/solana/rpc",[wt]:"https://api.devnet.solana.com",[_t]:"https://api.testnet.solana.com"},D={[Ue]:"https://api.dexter.cash/api/evm/bsc/rpc",[ue]:"https://api.dexter.cash/api/base/rpc",[Ce]:"https://sepolia.base.org",[Ne]:"https://api.dexter.cash/api/evm/arbitrum/rpc",[ke]:"https://api.dexter.cash/api/evm/polygon/rpc",[Oe]:"https://api.dexter.cash/api/evm/optimism/rpc",[Be]:"https://api.dexter.cash/api/evm/avalanche/rpc",[le]:"https://worldchain-mainnet.g.alchemy.com/public",[me]:"https://rpc.monad.xyz",[de]:"https://rpc.mainnet.chain.robinhood.com",[pe]:"https://skale-base.skalenodes.com/v1/base",[fe]:"https://base-sepolia-testnet.skalenodes.com/v1/jubilant-horrible-ancha",[De]:"https://eth.llamarpc.com"};var B=class e extends Error{code;details;constructor(t,n,r){super(n),this.name="X402Error",this.code=t,this.details=r,Object.setPrototypeOf(this,e.prototype)}};import{PublicKey as ye,Connection as nn,TransactionMessage as Xr,VersionedTransaction as Jr,ComputeBudgetProgram as xn}from"@solana/web3.js";import{getAssociatedTokenAddress as rn,getAccount as Yr,createTransferCheckedInstruction as Zr,getMint as Qr,TOKEN_PROGRAM_ID as Rn,TOKEN_2022_PROGRAM_ID as It}from"@solana/spl-token";var eo=12e3,to=1;function Ae(e){if(!e||typeof e!="object")return!1;let t=e;return"publicKey"in t&&"signTransaction"in t&&typeof t.signTransaction=="function"}var Vt=class{name="Solana";networks=[ce,Xe,Je];config;log;constructor(t={}){this.config=t,this.log=t.verbose?console.log.bind(console,"[x402:solana]"):()=>{}}canHandle(t){return!!(this.networks.includes(t)||t==="solana"||t==="solana-devnet"||t==="solana-testnet"||t.startsWith("solana:"))}getDefaultRpcUrl(t){return this.config.rpcUrls?.[t]?this.config.rpcUrls[t]:he[t]?he[t]:t==="solana"?he[ce]:t==="solana-devnet"?he[Xe]:t==="solana-testnet"?he[Je]:he[ce]}getAddress(t){return Ae(t)?t.publicKey?.toBase58()??null:null}isConnected(t){return Ae(t)?t.publicKey!==null:!1}async getBalance(t,n,r){if(!Ae(n)||!n.publicKey)return 0;let o=r||this.getDefaultRpcUrl(t.network),s=new nn(o,"confirmed"),i=new ye(n.publicKey.toBase58()),a=new ye(t.asset);try{let u=(await s.getAccountInfo(a,"confirmed"))?.owner.toBase58()===It.toBase58()?It:Rn,d=await rn(a,i,!1,u),f=await Yr(s,d,void 0,u),m=t.extra?.decimals??6;return Number(f.amount)/Math.pow(10,m)}catch(c){if(c&&typeof c=="object"&&"name"in c&&(c.name==="TokenAccountNotFoundError"||c.name==="TokenInvalidAccountOwnerError"))return 0;throw c}}async buildTransaction(t,n,r){if(!Ae(n))throw new Error("Invalid Solana wallet");if(!n.publicKey)throw new Error("Wallet not connected");let o=r||this.getDefaultRpcUrl(t.network),s=new nn(o,"confirmed"),i=new ye(n.publicKey.toBase58()),{payTo:a,asset:c,extra:u}=t,d=t.amount??t.maxAmountRequired;if(!d)throw new Error("Missing amount in payment requirements");if(!u?.feePayer)throw new Error("Missing feePayer in payment requirements");let f=new ye(u.feePayer),m=new ye(c),v=new ye(a);this.log("Building transaction:",{from:i.toBase58(),to:a,amount:d,asset:c,feePayer:u.feePayer});let l=[];l.push(xn.setComputeUnitLimit({units:eo})),l.push(xn.setComputeUnitPrice({microLamports:to}));let p=await s.getAccountInfo(m,"confirmed");if(!p)throw new Error(`Token mint ${c} not found`);let x=p.owner.toBase58()===It.toBase58()?It:Rn,A=await Qr(s,m,void 0,x);typeof u?.decimals=="number"&&A.decimals!==u.decimals&&this.log(`Decimals mismatch: requirements say ${u.decimals}, mint says ${A.decimals}`);let b=await rn(m,i,!1,x),_=await rn(m,v,!0,x);if(!await s.getAccountInfo(b,"confirmed"))throw new Error(`No token account found for ${c}. Please ensure you have USDC in your wallet.`);if(!await s.getAccountInfo(_,"confirmed"))throw new Error(`Seller token account not found. The seller (${a}) must have a USDC account.`);let F=BigInt(d);l.push(Zr(b,m,_,i,F,A.decimals,[],x));let{blockhash:M}=await s.getLatestBlockhash("confirmed"),E=new Xr({payerKey:f,recentBlockhash:M,instructions:l}).compileToV0Message(),V=new Jr(E),h=await n.signTransaction(V);return this.log("Transaction signed successfully"),{serialized:Buffer.from(h.serialize()).toString("base64"),settlementProbe:{kind:"solana",sourceAta:b.toBase58(),destinationAta:_.toBase58(),asset:c,amount:d,blockhash:M}}}async confirmSettlement(t,n){if(t.kind!=="solana")throw new Error(`SolanaAdapter.confirmSettlement cannot handle probe kind "${t.kind}"`);let r=new nn(n,"confirmed"),o=new ye(t.destinationAta),s=await r.getSignaturesForAddress(o,{limit:25});if(s.length===0)return{settled:!1};let i=BigInt(t.amount);for(let a of s){if(a.err)continue;let c=await r.getTransaction(a.signature,{commitment:"confirmed",maxSupportedTransactionVersion:0});if(!c?.meta)continue;let u=c.transaction.message.getAccountKeys().keySegments().flat(),d=c.meta.preTokenBalances??[],f=c.meta.postTokenBalances??[];for(let m of f){if(m.mint!==t.asset)continue;let v=u[m.accountIndex];if(!v||!v.equals(o))continue;let l=d.find(A=>A.accountIndex===m.accountIndex),p=BigInt(l?.uiTokenAmount.amount??"0");if(BigInt(m.uiTokenAmount.amount??"0")-p===i)return{settled:!0,txSignature:a.signature}}}return{settled:!1}}};function ee(e){return new Vt(e)}var no={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"}]},Tn=BigInt("0xffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff");function be(e){if(!e||typeof e!="object")return!1;let t=e;return"address"in t&&typeof t.address=="string"&&t.address.startsWith("0x")}var Ct=class{name="EVM";networks=[tt,ge,xt,at,Ye,Ze,Qe,et,nt,rt,ot,st,it];config;log;constructor(t={}){this.config=t,this.log=t.verbose?console.log.bind(console,"[x402:evm]"):()=>{}}canHandle(t){return!!(this.networks.includes(t)||t==="base"||t==="bsc"||t==="ethereum"||t==="arbitrum"||t==="polygon"||t==="optimism"||t==="avalanche"||t==="world"||t==="monad"||t==="robinhood"||t==="skale-base"||t==="skale-base-sepolia"||t.startsWith("eip155:"))}getDefaultRpcUrl(t){return this.config.rpcUrls?.[t]?this.config.rpcUrls[t]:D[t]?D[t]:t==="base"?D[ge]:t==="bsc"?D[tt]:t==="ethereum"?D[at]:t==="arbitrum"?D[Ye]:t==="polygon"?D[Ze]:t==="optimism"?D[Qe]:t==="avalanche"?D[et]:t==="world"?D[nt]:t==="monad"?D[rt]:t==="robinhood"?D[ot]:t==="skale-base"?D[st]:t==="skale-base-sepolia"?D[it]:D[ge]}getAddress(t){return be(t)?t.address:null}isConnected(t){return be(t)?!!t.address:!1}getChainId(t){if(lt[t])return lt[t];if(t.startsWith("eip155:")){let n=t.split(":")[1];return parseInt(n,10)}return t==="base"?8453:t==="bsc"?56:t==="ethereum"?1:t==="arbitrum"?42161:t==="polygon"?137:t==="optimism"?10:t==="avalanche"?43114:t==="world"?480:t==="monad"?143:t==="robinhood"?4663:t==="skale-base"?1187947933:t==="skale-base-sepolia"?324705682:8453}async getBalance(t,n,r){if(!be(n)||!n.address)return 0;let o=r||this.getDefaultRpcUrl(t.network);try{let s=this.encodeBalanceOf(n.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:t.asset,data:s},"latest"]})});if(!i.ok)throw new Error(`RPC request failed: ${i.status}`);let a=await i.json();if(a.error)throw new Error(`RPC error: ${JSON.stringify(a.error)}`);if(!a.result||a.result==="0x")return 0;let c=BigInt(a.result),u=t.extra?.decimals??6;return Number(c)/Math.pow(10,u)}catch(s){throw s}}encodeBalanceOf(t){let n="0x70a08231",r=t.slice(2).toLowerCase().padStart(64,"0");return n+r}async confirmSettlement(t,n){if(t.kind==="eip3009"){let r="0xe94a0102",o=t.from.slice(2).toLowerCase().padStart(64,"0"),s=t.nonce.slice(2).toLowerCase().padStart(64,"0"),i=r+o+s,a=await this.ethCall(n,t.asset,i);return{settled:BigInt(a)!==0n}}if(t.kind==="permit2"){let r="0x4fe02b44",o=BigInt(t.nonce),s=o>>8n,i=o&0xffn,a=t.from.slice(2).toLowerCase().padStart(64,"0"),c=s.toString(16).padStart(64,"0"),u=r+a+c,d=await this.ethCall(n,Q,u);return{settled:(BigInt(d)>>i&1n)===1n}}throw new Error(`EvmAdapter.confirmSettlement cannot handle probe kind "${t.kind}"`)}async ethCall(t,n,r){let o=await fetch(t,{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({jsonrpc:"2.0",id:1,method:"eth_call",params:[{to:n,data:r},"latest"]})});if(!o.ok)throw new Error(`RPC request failed: ${o.status}`);let s=await o.json();if(s.error)throw new Error(`RPC error: ${JSON.stringify(s.error)}`);if(!s.result||s.result==="0x")throw new Error("RPC returned an empty result");return s.result}async buildTransaction(t,n,r){if(!be(n))throw new Error("Invalid EVM wallet");if(!n.address)throw new Error("Wallet not connected");if(t.scheme==="exact-approval")return this.buildApprovalTransaction(t,n,r);if(t.extra?.assetTransferMethod==="permit2")return this.buildPermit2Transaction(t,n,r);let{payTo:o,asset:s,extra:i}=t,a=t.amount??t.maxAmountRequired;if(!a)throw new Error("Missing amount in payment requirements");this.log("Building EVM transaction:",{from:n.address,to:o,amount:a,asset:s,network:t.network});let c=this.getChainId(t.network),u=Pt[`eip155:${c}`],d={name:i?.name??u?.name??"USD Coin",version:i?.version??u?.version??"2",chainId:BigInt(c),verifyingContract:s},f={TransferWithAuthorization:[{name:"from",type:"address"},{name:"to",type:"address"},{name:"value",type:"uint256"},{name:"validAfter",type:"uint256"},{name:"validBefore",type:"uint256"},{name:"nonce",type:"bytes32"}]},m=new Uint8Array(32);(globalThis.crypto??(await import("crypto")).webcrypto).getRandomValues(m);let v="0x"+[...m].map(_=>_.toString(16).padStart(2,"0")).join(""),l=Math.floor(Date.now()/1e3),p={from:n.address,to:o,value:a,validAfter:String(l-600),validBefore:String(l+(t.maxTimeoutSeconds||60)),nonce:v},x={from:n.address,to:o,value:BigInt(a),validAfter:BigInt(l-600),validBefore:BigInt(l+(t.maxTimeoutSeconds||60)),nonce:v};if(!n.signTypedData)throw new Error("Wallet does not support signTypedData (EIP-712)");let A=await n.signTypedData({domain:d,types:f,primaryType:"TransferWithAuthorization",message:x});return this.log("EIP-712 signature obtained"),{serialized:JSON.stringify({authorization:p,signature:A}),signature:A,settlementProbe:{kind:"eip3009",from:n.address,nonce:v,asset:s,chainId:c}}}async buildApprovalTransaction(t,n,r){let{payTo:o,asset:s,extra:i}=t,a=t.amount??t.maxAmountRequired;if(!a)throw new Error("Missing amount in payment requirements");let c=i?.facilitatorContract;if(!c)throw new Error("exact-approval scheme requires extra.facilitatorContract from the facilitator. The /supported endpoint should provide this.");if(!n.signTypedData)throw new Error("Wallet does not support signTypedData (EIP-712)");this.log("Building approval-based transaction:",{from:n.address,to:o,amount:a,asset:s,network:t.network,facilitatorContract:c});let u=r||this.getDefaultRpcUrl(t.network),d=i?.fee??"0",f=BigInt(a)+BigInt(d),m=await this.readAllowance(u,s,n.address,c);if(m<f){if(!n.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 V=this.calculateApprovalAmount(a,d,i?.approvalStrategy);this.log(`Approving ${V} for ${c} (current allowance: ${m})`);let h=await n.sendTransaction({to:s,data:this.encodeApprove(c,V),value:0n});this.log(`Approval tx sent: ${h}`),await this.waitForReceipt(u,h),this.log("Approval confirmed")}else this.log("Sufficient allowance, skipping approval");let v=new Uint8Array(16);(globalThis.crypto??(await import("crypto")).webcrypto).getRandomValues(v);let l=[...v].reduce((V,h)=>V*256n+BigInt(h),0n).toString(),p=new Uint8Array(32);(globalThis.crypto??(await import("crypto")).webcrypto).getRandomValues(p);let x="0x"+[...p].map(V=>V.toString(16).padStart(2,"0")).join(""),b=Math.floor(Date.now()/1e3)+(t.maxTimeoutSeconds||300),_=i?.eip712Domain,N=_?{name:_.name,version:_.version,chainId:BigInt(_.chainId),verifyingContract:_.verifyingContract}:{name:"DexterBSCFacilitator",version:"1",chainId:BigInt(this.getChainId(t.network)),verifyingContract:c},C=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"}]},F={from:n.address,to:o,token:s,amount:BigInt(a),fee:BigInt(d),nonce:BigInt(l),deadline:BigInt(b),paymentId:x},M=await n.signTypedData({domain:N,types:C,primaryType:"Payment",message:F});this.log("EIP-712 Payment signature obtained");let E={from:n.address,to:o,token:s,amount:a,fee:d,nonce:l,deadline:b,paymentId:x,signature:M};return{serialized:JSON.stringify(E),signature:M}}async buildPermit2Transaction(t,n,r){let{payTo:o,asset:s}=t,i=t.amount??t.maxAmountRequired;if(!i)throw new Error("Missing amount in payment requirements");if(!n.signTypedData)throw new Error("Wallet does not support signTypedData (EIP-712)");this.log("Building Permit2 transaction:",{from:n.address,to:o,amount:i,asset:s,network:t.network});let a=r||this.getDefaultRpcUrl(t.network),c=await this.readAllowance(a,s,n.address,Q),u;if(c<BigInt(i)){let N=this.encodeApprove(Q,Tn);if(n.signTransaction){this.log(`Signing Permit2 approval for relay (current allowance: ${c})`);let C=this.getChainId(t.network),F=await this.readGasPrice(a),M=await this.readNonce(a,n.address),E=await n.signTransaction({to:s,data:N,chainId:C,gas:50000n,gasPrice:F,nonce:M});u={erc20ApprovalGasSponsoring:{info:{from:n.address,asset:s,spender:Q,amount:Tn.toString(),signedTransaction:E,version:"1"}}},this.log("Permit2 approval signed for facilitator relay")}else if(n.sendTransaction){this.log(`Approving Permit2 directly (current allowance: ${c})`);let C=await n.sendTransaction({to:s,data:N,value:0n});this.log(`Permit2 approval tx sent: ${C}`),await this.waitForReceipt(a,C),this.log("Permit2 approval confirmed")}else throw new Error("Permit2 payments require a wallet that supports signTransaction or sendTransaction for the one-time Permit2 approval. Use createEvmKeypairWallet() or a browser wallet with transaction support.")}else this.log("Sufficient Permit2 allowance, skipping approval");let d=new Uint8Array(32);(globalThis.crypto??(await import("crypto")).webcrypto).getRandomValues(d);let f=[...d].reduce((N,C)=>N*256n+BigInt(C),0n),m=Math.floor(Date.now()/1e3),v=m-600,l=m+(t.maxTimeoutSeconds||300),p=this.getChainId(t.network),x={name:"Permit2",chainId:BigInt(p),verifyingContract:Q},A={permitted:{token:s,amount:BigInt(i)},spender:ut,nonce:f,deadline:BigInt(l),witness:{to:o,validAfter:BigInt(v)}},b=await n.signTypedData({domain:x,types:no,primaryType:"PermitWitnessTransferFrom",message:A});this.log("Permit2 PermitWitnessTransferFrom signature obtained");let _={signature:b,permit2Authorization:{from:n.address,permitted:{token:s,amount:i},spender:ut,nonce:f.toString(),deadline:String(l),witness:{to:o,validAfter:String(v)}}};return{serialized:JSON.stringify(_),signature:b,extensions:u,settlementProbe:{kind:"permit2",from:n.address,nonce:f.toString(),chainId:p}}}async readAllowance(t,n,r,o){let s="0xdd62ed3e",i=r.slice(2).toLowerCase().padStart(64,"0"),a=o.slice(2).toLowerCase().padStart(64,"0"),c=s+i+a;try{let d=await(await fetch(t,{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({jsonrpc:"2.0",id:1,method:"eth_call",params:[{to:n,data:c},"latest"]})})).json();return d.error||!d.result||d.result==="0x"?0n:BigInt(d.result)}catch{return 0n}}encodeApprove(t,n){let r="0x095ea7b3",o=t.slice(2).toLowerCase().padStart(64,"0"),s=n.toString(16).padStart(64,"0");return r+o+s}async waitForReceipt(t,n,r=3e4){let o=Date.now();for(;Date.now()-o<r;){try{let i=await(await fetch(t,{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({jsonrpc:"2.0",id:1,method:"eth_getTransactionReceipt",params:[n]})})).json();if(i.result){if(i.result.status==="0x0")throw new Error(`Approval transaction reverted: ${n}`);return}}catch(s){if(s instanceof Error&&s.message.includes("reverted"))throw s}await new Promise(s=>setTimeout(s,2e3))}throw new Error(`Approval transaction receipt timeout after ${r}ms: ${n}`)}async readGasPrice(t){try{let r=await(await fetch(t,{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(t,n){try{let o=await(await fetch(t,{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({jsonrpc:"2.0",id:1,method:"eth_getTransactionCount",params:[n,"latest"]})})).json();return o.result?parseInt(o.result,16):0}catch{return 0}}calculateApprovalAmount(t,n,r){let o=BigInt(t)+BigInt(n);if(!r||r.mode==="exact")return o;let s=BigInt(r.defaultMultiple??10),i=o*s;if(r.maxCapUsd){let a=this.inferDecimals(t),c=BigInt(Math.floor(r.maxCapUsd*Math.pow(10,a)));if(i>c)return c}if(r.exactAboveUsd){let a=this.inferDecimals(t),c=BigInt(Math.floor(r.exactAboveUsd*Math.pow(10,a)));if(BigInt(t)>c)return o}return i}inferDecimals(t){return t.length>12?18:6}};function Me(e){return new Ct(e)}function on(e){if(e===ct||e===wn)return!0;let t=e.toLowerCase();for(let n of Object.values(Tt))if(n.toLowerCase()===t)return!0;for(let n of Object.keys(Et))if(n.toLowerCase()===t)return!0;return!1}function ro(e){return{[ze]:"Solana",[wt]:"Solana Devnet",[_t]:"Solana Testnet",solana:"Solana","solana-devnet":"Solana Devnet","solana-testnet":"Solana Testnet",[ue]:"Base",[Ce]:"Base Sepolia",[De]:"Ethereum",[Ne]:"Arbitrum",[ke]:"Polygon",[Oe]:"Optimism",[Be]:"Avalanche",[Ue]:"BSC",[le]:"World Chain",[me]:"Monad",[de]:"Robinhood Chain",[pe]:"SKALE Base",[fe]:"SKALE Base Sepolia",base:"Base","base-sepolia":"Base Sepolia",ethereum:"Ethereum",arbitrum:"Arbitrum",polygon:"Polygon",optimism:"Optimism",avalanche:"Avalanche",bsc:"BSC",world:"World Chain",monad:"Monad",robinhood:"Robinhood Chain","skale-base":"SKALE Base","skale-base-sepolia":"SKALE Base Sepolia"}[e]||e}function En(e,t){let n=ro(e);return n===e?t:n}async function oo(e,t){if(typeof e=="string")return[e,t];if(e instanceof URL)return[e.href,t];let n=e,r=new Headers(n.headers);t?.headers&&new Headers(t.headers).forEach((i,a)=>r.set(a,i));let o={method:t?.method??n.method,headers:r,signal:t?.signal??n.signal,redirect:t?.redirect??n.redirect,credentials:t?.credentials??n.credentials},s=(o.method??"GET").toUpperCase();return t&&"body"in t?o.body=t.body:s!=="GET"&&s!=="HEAD"&&n.body&&(o.body=await n.arrayBuffer()),[n.url,o]}var so=new WeakMap;function Pn(e){let{adapters:t=[ee({verbose:e.verbose}),Me({verbose:e.verbose})],wallets:n,wallet:r,preferredNetwork:o,rpcUrls:s={},maxAmountAtomic:i,fetch:a=globalThis.fetch,verbose:c=!1,accessPass:u,onPaymentRequired:d,onPaymentDispatched:f,maxRetries:m=0,retryDelayMs:v=500}=e,l=c?console.log.bind(console,"[x402]"):()=>{};async function p(h,S){let w;for(let R=0;R<=m;R++)try{let T=await a(h,S);if(T.status>=502&&T.status<=504&&R<m){l(`Retry ${R+1}/${m}: server returned ${T.status}`),await new Promise(I=>setTimeout(I,v*Math.pow(2,R)));continue}return T}catch(T){w=T,R<m&&(l(`Retry ${R+1}/${m}: ${T instanceof Error?T.message:"network error"}`),await new Promise(I=>setTimeout(I,v*Math.pow(2,R))))}throw w}let x=new Map;function A(h){try{let S=new URL(h).host,w=x.get(S);if(w&&w.expiresAt>Date.now()/1e3+10)return w.jwt;w&&x.delete(S)}catch{}return null}function b(h,S){try{let w=new URL(h).host,R=S.split(".");if(R.length===3){let T=JSON.parse(atob(R[1].replace(/-/g,"+").replace(/_/g,"/"))),I=Math.floor(Date.now()/1e3),k=I+86400,q=Math.min(typeof T.exp=="number"?T.exp:I,k);x.set(w,{jwt:S,expiresAt:q}),l("Access pass cached for",w,"| expires:",new Date(q*1e3).toISOString())}}catch{l("Failed to cache access pass")}}let _=n||{};r&&!_.solana&&Ae(r)&&(_.solana=r),r&&!_.evm&&be(r)&&(_.evm=r);function N(h){let S=[];for(let w of h){let R=w.scheme??"exact";if(R!=="exact"&&R!=="exact-approval")continue;let T=t.find(k=>k.canHandle(w.network));if(!T)continue;let I;T.name==="Solana"?I=_.solana:T.name==="EVM"&&(I=_.evm),I&&T.isConnected(I)&&S.push({accept:w,adapter:T,wallet:I})}if(S.length===0)return null;if(o){let w=S.find(R=>R.accept.network===o);if(w)return w}return S[0]}function C(h,S){return En(h,S)}function F(h,S){return s[h]||S.getDefaultRpcUrl(h)}async function M(h,S,w,R,T){let I="";if(u?.preferTier&&R.tiers){let g=R.tiers.find(P=>P.id===u.preferTier);if(g){if(u.maxSpend&&parseFloat(g.price)>parseFloat(u.maxSpend))throw new B("access_pass_exceeds_max_spend",`Access pass tier "${g.id}" costs $${g.price}, exceeds max spend $${u.maxSpend}`);I=`tier=${g.id}`}}else if(u?.preferDuration&&R.ratePerHour)I=`duration=${u.preferDuration}`;else if(R.tiers&&R.tiers.length>0){let g=R.tiers[0];if(u?.maxSpend&&parseFloat(g.price)>parseFloat(u.maxSpend))throw new B("access_pass_exceeds_max_spend",`Cheapest access pass costs $${g.price}, exceeds max spend $${u?.maxSpend}`);I=`tier=${g.id}`}let k=I?T.includes("?")?`${T}&${I}`:`${T}?${I}`:T;l("Purchasing access pass:",I||"default tier");let q=w.headers.get("PAYMENT-REQUIRED");if(!q)return null;let $;try{$=JSON.parse(atob(q))}catch{return null}let U=N($.accepts);if(!U)return null;let{accept:O,adapter:H,wallet:ve}=U;if(H.name==="Solana"&&!O.extra?.feePayer)return null;let G=O.extra?.decimals??(on(O.asset)?6:void 0);if(typeof G!="number")return null;let Ke=O.amount??O.maxAmountRequired;if(!Ke)return null;let z=F(O.network,H);try{let g=await H.getBalance(O,ve,z),P=Number(Ke)/Math.pow(10,G);if(g<P){let Bt=C(O.network,H.name);throw new B("insufficient_balance",`Insufficient balance for access pass on ${Bt}. Have $${g.toFixed(4)}, need $${P.toFixed(4)}`)}}catch(g){if(g instanceof B)throw g}let X=await H.buildTransaction(O,ve,z),Se;H.name==="EVM"?Se=JSON.parse(X.serialized):Se={transaction:X.serialized};let te=typeof h=="string"?h:h instanceof URL?h.href:h.url,we=$.resource;if(typeof $.resource=="string")try{let g=new URL($.resource,te);["http:","https:"].includes(g.protocol)&&(we=g.toString())}catch{}else if($.resource&&typeof $.resource=="object"&&"url"in $.resource){let g=$.resource;try{let P=new URL(g.url,te);["http:","https:"].includes(P.protocol)&&(we={...g,url:P.toString()})}catch{}}let dt={x402Version:O.x402Version??2,resource:we,accepted:O,payload:Se};X.extensions&&(dt.extensions=X.extensions);let J=btoa(JSON.stringify(dt)),ne=await a(k,{...S,method:"POST",headers:{...S?.headers||{},"Content-Type":"application/json","PAYMENT-SIGNATURE":J}});if(!ne.ok)return l("Pass purchase failed:",ne.status),null;let W=ne.headers.get("ACCESS-PASS");return W&&(b(T,W),l("Access pass purchased and cached")),ne}async function E(h,S){let w=h;if(l("Making request:",w),u){let g=A(w);if(g){l("Using cached access pass");let P=await a(h,{...S,headers:{...S?.headers||{},Authorization:`Bearer ${g}`}});if(P.status!==401&&P.status!==402)return P;l("Cached pass rejected (status",P.status,"), purchasing new pass");try{x.delete(new URL(w).host)}catch{}}}let R=await p(h,S);if(R.status!==402)return R;l("Received 402 Payment Required");let T=R.headers.get("X-ACCESS-PASS-TIERS");if(u&&T){l("Server offers access passes, purchasing...");try{let g=JSON.parse(atob(T)),P=await M(h,S,R,g,w);if(P)return P}catch(g){l("Access pass purchase failed, falling back to per-request payment:",g)}}let I=R.headers.get("PAYMENT-REQUIRED");if(!I)throw new B("missing_payment_required_header","Server returned 402 but no PAYMENT-REQUIRED header");let k;try{let g=atob(I);k=JSON.parse(g)}catch{throw new B("invalid_payment_required","Failed to decode PAYMENT-REQUIRED header")}l("Payment requirements:",k);let q=R.headers.get("X-Quote-Hash");q&&l("Quote hash received:",q);let $=N(k.accepts);if(!$){let g=k.accepts.map(P=>P.network).join(", ");throw new B("no_matching_payment_option",`No connected wallet for any available network: ${g}`)}let{accept:U,adapter:O,wallet:H}=$;if(l(`Using ${O.name} for ${U.network}`),O.name==="Solana"&&!U.extra?.feePayer)throw new B("missing_fee_payer","Solana payment option missing feePayer in extra");let ve=U.extra?.decimals??(on(U.asset)?6:void 0);if(typeof ve!="number")throw new B("missing_decimals","Payment option missing decimals - provide in extra or use a known stablecoin");let G=U.amount??U.maxAmountRequired;if(!G)throw new B("missing_amount","Payment option missing amount");if(i&&BigInt(G)>BigInt(i))throw new B("amount_exceeds_max",`Payment amount ${G} exceeds maximum ${i}`);let Ke=F(U.network,O);l("Checking balance...");try{let g=await O.getBalance(U,H,Ke),P=Number(G)/Math.pow(10,ve);if(g<P){let Bt=C(U.network,O.name);throw new B("insufficient_balance",`Insufficient balance on ${Bt}. Have $${g.toFixed(4)}, need $${P.toFixed(4)}`)}l(`Balance OK: $${g.toFixed(4)} >= $${P.toFixed(4)}`)}catch(g){if(g instanceof B)throw g;l("Balance check failed (RPC error), proceeding with transaction attempt")}if(d&&!await d(U))throw new B("payment_rejected","Payment rejected by onPaymentRequired callback");l("Building transaction...");let z=await O.buildTransaction(U,H,Ke);l("Transaction signed");let X;O.name==="EVM"?X=JSON.parse(z.serialized):X={transaction:z.serialized};let Se=h,te=k.resource;if(typeof k.resource=="string")try{let g=new URL(k.resource,Se).toString();g!==k.resource&&l("Resolved relative resource URL:",k.resource,"\u2192",g),te=g}catch{te=k.resource}else if(k.resource&&typeof k.resource=="object"&&"url"in k.resource){let g=k.resource;try{let P=new URL(g.url,Se).toString();P!==g.url&&(l("Resolved relative resource URL:",g.url,"\u2192",P),te={...g,url:P})}catch{}}let we={x402Version:U.x402Version??2,resource:te,accepted:U,payload:X};z.extensions&&(we.extensions=z.extensions);let dt=btoa(JSON.stringify(we));if(f)try{f(U,z.settlementProbe)}catch{}l("Retrying request with payment...");let J=await p(h,{...S,headers:{...S?.headers||{},"PAYMENT-SIGNATURE":dt,...q?{"X-Quote-Hash":q}:{}}});if(l("Retry response status:",J.status),J.status===402){let g="unknown";try{let P=await J.clone().json();g=String(P.error||P.message||JSON.stringify(P)),l("Rejection reason:",g)}catch{}throw new B("payment_rejected",`Payment was rejected by the server: ${g}`)}let ne=J.headers.get("PAYMENT-RESPONSE"),W;if(ne)try{W=JSON.parse(atob(ne))}catch{}return W??={},W.amountAtomic=G,W.assetDecimals=ve,so.set(J,W),W.extensions&&l("Settlement extensions:",Object.keys(W.extensions).join(", ")),J}async function V(h,S){let[w,R]=await oo(h,S);return E(w,R)}return{fetch:V}}function j(e){if(e instanceof Error){if(e.message&&e.message.length>0)return e.message;if(e.name&&e.name.length>0)return e.name}let t=String(e);return t.length>0?t:"unknown error"}async function mt(e){let t="";try{t=(await e.clone().text()).slice(0,600)}catch{}let n=t.toLowerCase(),r=n.includes("settle")||n.includes("facilitator"),o=t;try{let s=JSON.parse(t),i=[s.error,s.detail,s.message].filter(a=>typeof a=="string"&&a.length>0);i.length>0&&(o=i.join(" \u2014 "))}catch{}return o||(o=`HTTP ${e.status}`),{reason:r?"settlement_failed":"merchant_rejected",detail:`merchant HTTP ${e.status}: ${o}`}}var Nt="Payment authorization was sent, but the merchant did not respond within the timeout. ",kt=" Do not retry without checking \u2014 inspect the funding wallet for a transfer to the merchant before attempting payment again.";async function Ot(e,t,n){if(!e)return{confirmed:!1,detail:Nt+"This payment scheme has no on-chain confirmation check, so the SDK cannot verify whether it settled."+kt};try{if(e.kind==="solana"){let i=ee(),a=n??i.getDefaultRpcUrl(t.caip2);if(!i.confirmSettlement)return Vn();let c=await i.confirmSettlement(e,a);return c.settled?{confirmed:!0,txSignature:c.txSignature}:In()}let r=Me(),o=r.getDefaultRpcUrl(t.caip2);if(!r.confirmSettlement)return Vn();let s=await r.confirmSettlement(e,o);return s.settled?{confirmed:!0,txSignature:s.txSignature}:In()}catch(r){return{confirmed:!1,detail:Nt+`On-chain confirmation could not be completed (${j(r)}).`+kt}}}function In(){return{confirmed:!1,detail:Nt+"On-chain confirmation found no matching settlement yet \u2014 the payment may still be pending, or may not have settled."+kt}}function Vn(){return{confirmed:!1,detail:Nt+"The chain adapter does not support on-chain confirmation."+kt}}var io=new Set(["exact","exact-approval"]);async function ao(e,t,n,r){let o;try{o=await r.signNextVoucher(n.amount)}catch(c){return r.voucherVersion!==1?{ok:!1,reason:"error",detail:`context-bound FINAL tab voucher was not safely released; retry or reconcile this tab before another payment rail is attempted (${c instanceof Error?c.message:String(c)})`}:null}let s=new Headers(t.headers??void 0);s.set("X-Tab-Voucher",bt(o));let i={method:t.method??"GET",headers:s};t.signal&&(i.signal=t.signal),typeof t.body=="string"&&(i.body=t.body);let a;try{a=await fetch(e,i)}catch(c){return{ok:!1,reason:"error",detail:c?.message??String(c)}}return a.status===402?r.voucherVersion!==1?{ok:!1,reason:"error",detail:"seller refused an irrevocable FINAL tab voucher; its exact reservation must be reconciled before another payment rail is attempted"}:r.rollbackVoucher?.call(r,o)!==!0?{ok:!1,reason:"error",detail:"seller refused a V1 tab voucher but local rollback was unavailable or failed; another payment rail was not attempted to avoid double payment"}:null:a.ok?{ok:!0,paid:!0,response:a,amountPaid:n.amount,network:n.network}:{ok:!1,...await mt(a)}}var Cn={version:2,async parseChallenge(e){return St(e)},async pay(e,t,n,r,o){if(o.tab){let A=n.options.find(b=>b.scheme==="tab"&&b.network.family==="svm"&&b.payTo===o.tab.counterparty);if(A){let b=await ao(e,t,A,o.tab);if(b)return b}}let s=n.options.filter(A=>io.has(A.scheme));if(s.length===0)return{ok:!1,reason:"no_payment_options",detail:`no generically payable scheme offered (got: ${n.options.map(A=>A.scheme).join(", ")})`};let i=s.find(A=>A.network.family==="evm"?!!r.evm:A.network.family==="svm"?!!r.solana:!1);if(!i)return{ok:!1,reason:"unsupported_network"};let a=o.timeoutMs??15e3,c=o.responseTimeoutMs??12e4,u=new AbortController,d=setTimeout(()=>u.abort(),a),f=!1,m,v=(A,b)=>{f=!0,m=b,clearTimeout(d),d=setTimeout(()=>u.abort(),c)},l=Pn({wallets:r,preferredNetwork:i.network.caip2,maxAmountAtomic:o.maxAmountAtomic,fetch:globalThis.fetch,onPaymentDispatched:v}),p=t.signal?AbortSignal.any([t.signal,u.signal]):u.signal,x={method:t.method??"GET",headers:t.headers,signal:p};typeof t.body=="string"&&(x.body=t.body);try{let A=await l.fetch(e,x);if(clearTimeout(d),!A.ok)return{ok:!1,...await mt(A)};let b,_=A.headers.get("PAYMENT-RESPONSE");if(_)try{let N=Qt(_);N&&typeof N.transaction=="string"&&(b=N.transaction)}catch{}return{ok:!0,paid:!0,response:A,amountPaid:i.amount,network:i.network,txSignature:b}}catch(A){clearTimeout(d);let b=A;if(b?.name==="AbortError"){if(!f)return{ok:!1,reason:"timeout"};let _=await Ot(m,i.network,o.solanaRpcUrl);return _.confirmed?{ok:!0,paid:!0,response:void 0,amountPaid:i.amount,network:i.network,txSignature:_.txSignature}:{ok:!1,reason:"payment_unconfirmed",detail:_.detail}}return{ok:!1,reason:"error",detail:b?.message??String(A)}}}};import{getAddress as co}from"viem";var uo={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 lo(){let e=globalThis.crypto??(await import("crypto")).webcrypto,t=new Uint8Array(32);return e.getRandomValues(t),"0x"+Array.from(t,n=>n.toString(16).padStart(2,"0")).join("")}async function mo(e,t,n){if(typeof e.signTypedData!="function")throw new Error("EVM wallet does not support signTypedData");let r=Math.floor(Date.now()/1e3),o=String(r-600),s=String(r+(t.maxTimeoutSeconds??60)),i={from:e.address,to:t.payTo,value:t.amount,validAfter:o,validBefore:s,nonce:await lo()},a=lt[t.network.caip2];if(a===void 0)throw new Error(`unknown chain id for network ${t.network.caip2}`);let c=t.extra,u=await e.signTypedData({domain:{name:c.name,version:c.version,chainId:a,verifyingContract:co(t.asset)},types:uo,primaryType:"TransferWithAuthorization",message:i});return{payment:{x402Version:1,scheme:t.scheme,network:n,payload:{signature:u,authorization:i}},settlementProbe:{kind:"eip3009",from:i.from,nonce:i.nonce,asset:t.asset,chainId:a}}}async function sn(e,t,n){try{let r;for(let o of e.options){let s=o.network.family==="evm"&&!!t.evm||o.network.family==="svm"&&!!t.solana;if(o.scheme!=="exact"){s&&(r=o.scheme);continue}if(o.network.family==="evm"&&t.evm){let i=await t.evm;return await po(o,i,n)}if(o.network.family==="svm"&&t.solana){let i=await t.solana;return await fo(o,i,n)}}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 po(e,t,n){if(n.maxAmountAtomic!==void 0&&BigInt(e.amount)>BigInt(n.maxAmountAtomic))return{ok:!1,reason:"budget_exceeded"};let r=e.extra??{},o=r.name,s=r.version;if(typeof o!="string"||o.length===0||typeof s!="string"||s.length===0)return{ok:!1,reason:"merchant_rejected",detail:"v1 challenge missing exact-scheme EIP-712 domain (extra.name / extra.version)"};let i=e.network.bare,{payment:a,settlementProbe:c}=await mo(t,e,i);return{ok:!0,headerValue:Buffer.from(JSON.stringify(a),"utf8").toString("base64"),option:e,settlementProbe:c}}async function fo(e,t,n){if(n.maxAmountAtomic!==void 0&&BigInt(e.amount)>BigInt(n.maxAmountAtomic))return{ok:!1,reason:"budget_exceeded"};if(e.scheme!=="exact")return{ok:!1,reason:"merchant_rejected",detail:`v1 SVM supports only the 'exact' scheme, got '${e.scheme}'`};let r=e.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=e.network.bare,s={x402Version:1,scheme:e.scheme,network:o,asset:e.asset,payTo:e.payTo,amount:e.amount,maxAmountRequired:e.amount,maxTimeoutSeconds:e.maxTimeoutSeconds??60,extra:r},a=await ee().buildTransaction(s,t,n.solanaRpcUrl),c={x402Version:1,scheme:e.scheme,network:o,payload:{transaction:a.serialized}};return{ok:!0,headerValue:Buffer.from(JSON.stringify(c),"utf8").toString("base64"),option:e,settlementProbe:a.settlementProbe}}function go(e){let t=[];for(let n of e){if(!n||typeof n!="object")continue;let r=n,o=je(String(r.network??""));o&&t.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 t}var Nn={version:1,async parseChallenge(e){if(e.headers.get("payment-required"))return null;let t;try{t=await e.clone().json()}catch{return null}let n=Array.isArray(t.accepts)?t.accepts:[];if(n.length===0)return null;let r=go(n);return r.length===0?null:{x402Version:1,options:r}},async pay(e,t,n,r,o){let s,i=new AbortController,a=!1,c,u;try{let d=o.timeoutMs??15e3;s=setTimeout(()=>i.abort(),d);let f=await sn(n,r,o);if(!f.ok)return{ok:!1,reason:f.reason,detail:f.detail};let m=f.headerValue,v=f.option;u=v,c=f.settlementProbe;let l=new Headers(t.headers??void 0);l.set("X-PAYMENT",m);let p=t.signal!=null?AbortSignal.any([t.signal,i.signal]):i.signal,x={method:t.method,headers:l,signal:p};typeof t.body=="string"&&(x.body=t.body),a=!0,clearTimeout(s);let A=o.responseTimeoutMs??12e4;s=setTimeout(()=>i.abort(),A);let b=await fetch(e,x);return b.ok?{ok:!0,paid:!0,response:b,amountPaid:v.amount,network:v.network,txSignature:ho(b)}:{ok:!1,...await mt(b)}}catch(d){if(d instanceof Error&&d.name==="AbortError"){if(!a)return{ok:!1,reason:"timeout"};let f=await Ot(c,u.network,o.solanaRpcUrl);return f.confirmed?{ok:!0,paid:!0,response:void 0,amountPaid:u.amount,network:u.network,txSignature:f.txSignature}:{ok:!1,reason:"payment_unconfirmed",detail:f.detail}}return{ok:!1,reason:"error",detail:j(d)}}finally{s!==void 0&&clearTimeout(s)}}};function ho(e){let t=e.headers.get("x-payment-response")??e.headers.get("X-PAYMENT-RESPONSE");if(t)try{let n=JSON.parse(Buffer.from(t,"base64").toString("utf8")),r=n.transaction??n.txHash??n.transactionHash;return typeof r=="string"?r:void 0}catch{return}}import*as On from"tweetnacl";import{Keypair as Ai,VersionedTransaction as bi,Transaction as vi}from"@solana/web3.js";var kn=Symbol.for("x402:keypair");function an(e){let t=e.evm;if(t&&typeof t.signMessage=="function"&&typeof t.address=="string")return{address:t.address,signMessage:t.signMessage};let n=e.solana;if(n){let r=n[kn];if(r&&r.secretKey&&r.publicKey)return{publicKey:r.publicKey,signMessage:async o=>On.sign.detached(o,r.secretKey)}}return null}var yo=[Cn,Nn];async function Ao(e){let t=an(e);if(!t)return fetch;try{return(await import("@x402/extensions/sign-in-with-x")).wrapFetchWithSIWx(fetch,t)}catch(n){return console.warn(`[x402] SIW-X unavailable \u2014 @x402/extensions failed to load; SIW-X merchants will not authenticate. ${j(n)}`),fetch}}async function cn(e,t,n,r){if(t.body!==void 0&&t.body!==null&&typeof t.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 Ao(n))(e,{...t})}catch(s){return{ok:!1,reason:"error",detail:j(s)}}if(o.status!==402)return{ok:!0,paid:!1,response:o};for(let s of yo){let i=await s.parseChallenge(o.clone());if(i)return s.pay(e,t,i,n,r)}return{ok:!1,reason:"no_payment_options"}}async function bo(e,t={},n){let r=await Ge(e,t);if(r.kind==="free")return{result:{ok:!0,paid:!1,response:r.response},tab:null};if(r.kind==="no_tab")return{result:{ok:!1,reason:"no_payment_options",detail:`no tab option offered (schemes: ${r.schemesOffered.join(", ")})`},tab:null};if(r.kind==="error")return{result:{ok:!1,reason:"error",detail:r.detail},tab:null};let{offer:o}=r,s=BigInt(ie(n.perUnitCap));if(BigInt(o.amountAtomic)>s)return{result:{ok:!1,reason:"budget_exceeded",detail:`seller quotes ${o.amountAtomic} atomic; perUnitCap allows ${s}`},tab:null};let i=n.tabs?.get(o.payTo);return(!i||!i.state.isOpen)&&(i=await Gt({vault:n.vault,network:"solana:mainnet",seller:o.payTo,perUnitCap:n.perUnitCap,totalCap:n.totalCap,sessionDuration:n.sessionDuration,facilitatorUrl:n.facilitatorUrl,onLiveSession:n.onLiveSession,reserveFinalVoucherV2:n.reserveFinalVoucherV2}),n.tabs?.set(o.payTo,i)),{result:await cn(e,t,{},{tab:i}),tab:i}}function vo(e){return{counterparty:e.payTo,perRequest:{atomic:e.amountAtomic,human:Pe(e.amountAtomic)},asset:e.asset,network:{caip2:e.networkCaip2},scheme:"tab",settlement:{custody:"non-custodial",protection:"lock",settleOn:"close"},credit:null,...e.resourceUrl!==void 0?{resourceUrl:e.resourceUrl}:{}}}async function So(e,t={},n={}){let r=n.cache?.get(e);if(r)return{kind:"terms",terms:r};let o=await Ge(e,t,n.fetchImpl??fetch);if(o.kind!=="offer")return o;if(o.offer.asset!==ct)return{kind:"error",detail:`tab offer asset is not USDC ("${o.offer.asset}"); refusing to render a human price`};let s=vo(o.offer);return n.cache?.set(e,s),{kind:"terms",terms:s}}export{At as DEFAULT_FACILITATOR_URL,Ee as DEXTER_VAULT_PROGRAM_ID,Ht as FINAL_VOUCHER_V2_RESERVATION_BINDING_DOMAIN,dn as FINAL_VOUCHER_V2_RESERVATION_MEMO_PREFIX,qt as FINAL_VOUCHER_V2_SOLANA_MAINNET_CAIP2,jr as HOSTED_TAB_ACCEPTANCE_RULE,zr as HOSTED_TAB_REGISTRATION_ENCODING,Hr as HOSTED_TAB_TERMS_VERSION,Gr as HOSTED_TAB_VOUCHER_HEADER,Y as HistoricalV1MigrationRequiredError,or as INSTRUCTIONS_SYSVAR_ID,Ut as LiveSessionExistsError,rr as SECP256R1_PROGRAM_ID,xe as SessionScopeExceededError,re as TabClosedError,_e as UnsupportedNetworkError,ur as armTabOpen,oe as assertFinalVoucherV2ReservationReceipt,Pe as atomicToHuman,er as buildRegisterSessionKeyInstruction,tr as buildRevokeSessionKeyInstruction,nr as buildSecp256r1VerifyInstruction,Ln as buildVoucherMessage,ht as canonicalFinalVoucherV2ReservationNetwork,Le as deriveChannelId,yt as finalVoucherV2Digest,gn as finalVoucherV2ReservationBindingDigest,fn as finalVoucherV2ReservationBindingDigestFromIdentity,$e as finalVoucherV2ReservationIdentity,jt as finalVoucherV2ReservationMemo,Kn as finalVoucherV2Sequence,Gn as generateSessionKeypair,ie as humanToAtomic,Ft as makeSessionKey,Gt as openTab,Re as parseAtomic,bo as payUrlWithTab,Ge as resolveTabOffer,So as resolveTabTerms,lr as resumeTab,Yn as scopeCapAtomic,Fe as sessionRegisterMessage,Bn as sessionReplaceV1Message,Un as sessionRevokeMessage,Mn as sessionVoucherV2AuthorizationNonce,Dn as sessionVoucherV2Nonce,$t as signContextBoundFinalVoucherV2,Lt as signVoucher,Kr as tabFromGrant,Dt as voucherPayloadMessage,bt as voucherToHeader,Fn as voucherV2SequenceOrdinal};
|