@dexterai/x402 6.0.2 → 6.0.4
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 +14 -0
- package/REFERENCE.md +25 -0
- package/dist/adapters/index.cjs +1 -1
- package/dist/adapters/index.d.cts +2 -2
- package/dist/adapters/index.d.ts +2 -2
- package/dist/adapters/index.js +1 -1
- package/dist/batch-settlement/index.d.cts +3 -3
- package/dist/batch-settlement/index.d.ts +3 -3
- package/dist/batch-settlement/seller/index.d.cts +4 -4
- package/dist/batch-settlement/seller/index.d.ts +4 -4
- package/dist/client/index.cjs +1 -1
- package/dist/client/index.d.cts +5 -5
- package/dist/client/index.d.ts +5 -5
- package/dist/client/index.js +1 -1
- package/dist/react/index.cjs +1 -1
- package/dist/react/index.d.cts +2 -2
- package/dist/react/index.d.ts +2 -2
- package/dist/react/index.js +1 -1
- package/dist/server/index.d.cts +3 -3
- package/dist/server/index.d.ts +3 -3
- package/dist/tab/index.cjs +4 -4
- package/dist/tab/index.d.cts +3 -3
- package/dist/tab/index.d.ts +3 -3
- package/dist/tab/index.js +4 -4
- package/dist/{types-BOEYu6ya.d.cts → types-B-fkCTII.d.cts} +1 -1
- package/dist/{types-DhCxPFgg.d.ts → types-B4y1Lava.d.ts} +1 -1
- package/dist/{types-Ds9IUnXG.d.ts → types-Bm6-yPwi.d.ts} +3 -0
- package/dist/{types-B4JCwkHH.d.cts → types-CEOJ9sFp.d.cts} +3 -0
- package/dist/{types-CTYEYNZO.d.cts → types-CYO2QLUN.d.cts} +1 -1
- package/dist/{types-G6MIMJjK.d.cts → types-CnNjeeZP.d.cts} +2 -2
- package/dist/{types-zImyINj3.d.ts → types-CuTmhygi.d.ts} +2 -2
- package/dist/{types-BdUPQzXu.d.ts → types-REjsl5JJ.d.ts} +1 -1
- package/dist/{x402-client-Cil4Tmqy.d.ts → x402-client-zC0XNdb_.d.cts} +9 -0
- package/dist/{x402-client-Cil4Tmqy.d.cts → x402-client-zC0XNdb_.d.ts} +9 -0
- package/package.json +1 -1
package/dist/tab/index.cjs
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
|
-
"use strict";var ur=Object.create;var It=Object.defineProperty;var lr=Object.getOwnPropertyDescriptor;var mr=Object.getOwnPropertyNames;var dr=Object.getPrototypeOf,pr=Object.prototype.hasOwnProperty;var fr=(e,t)=>{for(var n in t)It(e,n,{get:t[n],enumerable:!0})},bn=(e,t,n,r)=>{if(t&&typeof t=="object"||typeof t=="function")for(let o of mr(t))!pr.call(e,o)&&o!==n&&It(e,o,{get:()=>t[o],enumerable:!(r=lr(t,o))||r.enumerable});return e};var J=(e,t,n)=>(n=e!=null?ur(dr(e)):{},bn(t||!e||!e.__esModule?It(n,"default",{value:e,enumerable:!0}):n,e)),gr=e=>bn(It({},"__esModule",{value:!0}),e);var so={};fr(so,{DEFAULT_FACILITATOR_URL:()=>at,DEXTER_VAULT_PROGRAM_ID:()=>q.DEXTER_VAULT_PROGRAM_ID,FINAL_VOUCHER_V2_RESERVATION_BINDING_DOMAIN:()=>Ut,FINAL_VOUCHER_V2_RESERVATION_MEMO_PREFIX:()=>on,FINAL_VOUCHER_V2_SOLANA_MAINNET_CAIP2:()=>Bt,HOSTED_TAB_ACCEPTANCE_RULE:()=>qn,HOSTED_TAB_REGISTRATION_ENCODING:()=>Hn,HOSTED_TAB_TERMS_VERSION:()=>$n,HOSTED_TAB_VOUCHER_HEADER:()=>Wn,HistoricalV1MigrationRequiredError:()=>Y,INSTRUCTIONS_SYSVAR_ID:()=>q.INSTRUCTIONS_SYSVAR_ID,LiveSessionExistsError:()=>Vt,SECP256R1_PROGRAM_ID:()=>q.SECP256R1_PROGRAM_ID,SessionScopeExceededError:()=>he,TabClosedError:()=>oe,UnsupportedNetworkError:()=>ge,armTabOpen:()=>Vn,assertFinalVoucherV2ReservationReceipt:()=>ie,atomicToHuman:()=>ve,buildRegisterSessionKeyInstruction:()=>be.buildRegisterSessionKeyInstruction,buildRevokeSessionKeyInstruction:()=>be.buildRevokeSessionKeyInstruction,buildSecp256r1VerifyInstruction:()=>cn.buildSecp256r1VerifyInstruction,buildVoucherMessage:()=>R.buildVoucherMessage,canonicalFinalVoucherV2ReservationNetwork:()=>ot,deriveChannelId:()=>De,finalVoucherV2Digest:()=>st,finalVoucherV2ReservationBindingDigest:()=>an,finalVoucherV2ReservationBindingDigestFromIdentity:()=>sn,finalVoucherV2ReservationIdentity:()=>Me,finalVoucherV2ReservationMemo:()=>Dt,finalVoucherV2Sequence:()=>R.finalVoucherV2Sequence,generateSessionKeypair:()=>Sn,humanToAtomic:()=>ce,makeSessionKey:()=>Ct,openTab:()=>Mt,parseAtomic:()=>ye,payUrlWithTab:()=>ir,resolveTabOffer:()=>He,resolveTabTerms:()=>ar,resumeTab:()=>Cn,scopeCapAtomic:()=>wn,sessionRegisterMessage:()=>R.sessionRegisterMessage,sessionReplaceV1Message:()=>R.sessionReplaceV1Message,sessionRevokeMessage:()=>R.sessionRevokeMessage,sessionVoucherV2AuthorizationNonce:()=>R.sessionVoucherV2AuthorizationNonce,sessionVoucherV2Nonce:()=>R.sessionVoucherV2Nonce,signContextBoundFinalVoucherV2:()=>kt,signVoucher:()=>Nt,tabFromGrant:()=>Kn,voucherPayloadMessage:()=>R.voucherPayloadMessage,voucherToHeader:()=>ct,voucherV2SequenceOrdinal:()=>R.voucherV2SequenceOrdinal});module.exports=gr(so);var ge=class extends Error{constructor(n){super(`Network ${n} is not yet supported by @dexterai/x402/tab`);this.network=n;this.name="UnsupportedNetworkError"}network},Y=class extends Error{constructor(n){super(`native_tab_v1_migration_required: @dexterai/x402 v6 cannot safely arm or reconstruct a buyer-side V1 tab through ${n}; settle or revoke the historical session through the deployment that originally opened it, then create a context-bound V2 session`);this.surface=n;this.name="HistoricalV1MigrationRequiredError"}surface;code="native_tab_v1_migration_required"},he=class extends Error{constructor(n,r){super(`Session scope exceeded: ${n}${r?` (${r})`:""}`);this.reason=n;this.name="SessionScopeExceededError"}reason},oe=class extends Error{constructor(n){super(`Tab ${n} is already closed`);this.channelId=n;this.name="TabClosedError"}channelId},Vt=class extends Error{constructor(n){super(`a LIVE session already exists for counterparty ${n.allowedCounterparty} (session ${n.sessionPubkeyHex.slice(0,16)}\u2026, expires ${n.expiresAtUnix}; on-chain spent=${n.spentAtomic}, crystallized=${n.crystallizedCumulativeAtomic}, frontier=${n.frontierAtomic}). Replacing it voids any signed-but-unsettled vouchers beyond the frontier. Settle the old tab first (tab.close() or POST its last voucher to /tab/settle), or pass onLiveSession: 'replace' to atomically revoke-then-register over it.`);this.details=n;this.name="LiveSessionExistsError"}details};var ae=require("@solana/web3.js"),ue=require("@noble/hashes/utils");var rt=J(require("tweetnacl"),1),nt=require("@solana/web3.js"),se=require("@dexterai/vault/messages"),vn=require("@dexterai/vault/session");var R=require("@dexterai/vault/messages");var _n=require("@noble/hashes/sha256");function Sn(){let e=rt.default.sign.keyPair();return{publicKey:e.publicKey,privateKey:e.secretKey}}function Ct(e,t,n){return{publicKey:e.publicKey,privateKey:e.privateKey,scope:t,registration:n}}function Nt(e,t,n){if(n.length!==32)throw new Error(`channelIdBytes must be 32 bytes, got ${n.length}`);if(e.registration.length===188&&new DataView(e.registration.buffer,e.registration.byteOffset,e.registration.byteLength).getUint32(176,!0)>=2147483648)throw new Error("context-bound V2 sessions require signContextBoundFinalVoucherV2 and a durable reservation");let r=BigInt(t.cumulativeAmount),o=BigInt(e.scope.maxAmountAtomic);if(r>o)throw new Error(`voucher cumulative ${r} exceeds session cap ${o}`);let i=Math.floor(Date.now()/1e3);if(i>=e.scope.expiresAtUnix)throw new Error(`session expired at ${e.scope.expiresAtUnix}, now ${i}`);let s=(0,R.voucherPayloadMessage)({channelId:n,cumulativeAmount:r,sequenceNumber:t.sequenceNumber}),a=rt.default.sign.detached(s,e.privateKey);return{payload:t,sessionPublicKey:e.publicKey,sessionRegistration:e.registration,sessionSignature:a}}var hr=/^[0-9a-f]{64}$/,yr=(1n<<64n)-1n;function en(e){return Buffer.from(e).toString("hex")}function Ar(e){return Uint8Array.from(Buffer.from(e,"hex"))}function tn(e,t){if(e.length!==t.length)return!1;let n=0;for(let r=0;r<e.length;r+=1)n|=(e[r]??0)^(t[r]??0);return n===0}function kt(e){if(!hr.test(e.channelId)||e.sessionPublicKey.length!==32||e.sessionPrivateKey.length!==64||e.sessionRegistration.length!==188||!/^[1-9][0-9]*$/.test(e.cumulativeAmountAtomic))throw new Error("native_tab_v2_signing_input_invalid");let t=BigInt(e.cumulativeAmountAtomic);if(t>yr)throw new Error("native_tab_v2_cumulative_amount_invalid");let n=new nt.PublicKey(e.programId),r=new nt.PublicKey(e.vaultPda),o=new nt.PublicKey(e.sessionPda),i=new nt.PublicKey(e.seller),[s]=(0,vn.deriveSessionPda)(r,i,n);if(!o.equals(s))throw new Error("native_tab_v2_session_pda_mismatch");let a=e.sessionRegistration,c=new DataView(a.buffer,a.byteOffset,a.byteLength),u=c.getBigUint64(128,!0),m=c.getBigInt64(136,!0),p=c.getBigUint64(180,!0),f=e.nowUnixSeconds??Math.floor(Date.now()/1e3);if(!Number.isSafeInteger(f)||f<0)throw new Error("native_tab_v2_signing_time_invalid");if(!tn(a,(0,se.sessionRegisterMessage)({programId:n,vaultPda:r,sessionPubkey:e.sessionPublicKey,maxAmount:u,expiresAt:m,allowedCounterparty:i,nonce:e.sessionNonce,maxRevolvingCapacity:p})))throw new Error("native_tab_v2_registration_identity_mismatch");if(u===0n||p===0n||p>u||m<=BigInt(f)||m>0x7fffffffffffffffn-604800n||t>u)throw new Error("native_tab_v2_registration_semantics_invalid");(0,se.sessionVoucherV2AuthorizationNonce)(e.sessionNonce);let l=rt.default.sign.keyPair.fromSeed(e.sessionPrivateKey.subarray(0,32)),d=!1;try{d=tn(l.publicKey,e.sessionPublicKey)&&tn(e.sessionPrivateKey.subarray(32,64),e.sessionPublicKey)}finally{l.secretKey.fill(0)}if(!d)throw new Error("native_tab_v2_session_key_mismatch");let T=(0,se.finalVoucherV2Sequence)(e.sequenceOrdinal),x=(0,se.contextBoundVoucherV2Message)({programId:n,vaultPda:r,sessionPda:o,seller:i,sessionNonce:e.sessionNonce,channelId:Ar(e.channelId),cumulativeAmount:t,sequenceNumber:T}),g=rt.default.sign.detached(x,e.sessionPrivateKey);return{channelId:e.channelId,cumulativeAmount:e.cumulativeAmountAtomic,sequenceNumber:T,sessionPublicKey:en(e.sessionPublicKey),sessionSignature:en(g),sessionRegistration:en(a)}}function wn(e){return ye(e.maxAmountAtomic)}function ye(e){if(!/^\d+$/.test(e))throw new Error(`atomic amount must be a non-negative integer string, got "${e}"`);return BigInt(e)}function De(e){let t=new Uint8Array(8);new DataView(t.buffer).setBigUint64(0,e.nonce,!0);let n=new TextEncoder().encode(e.sellerUrl),r=_n.sha256.create();return r.update(e.vaultPda.toBytes()),r.update(n),r.update(t),r.digest()}var rn=require("@noble/hashes/sha256"),Ae=require("@noble/hashes/utils"),xn=/^[0-9a-f]{64}$/,Rn=/^[A-Za-z0-9][A-Za-z0-9._:-]{0,199}$/,br=/^[1-9A-HJ-NP-Za-km-z]{32,100}$/,Bt="solana:5eykt4UsFv8P8NJdTREpY1vzqKqZKvdp",Ut="dexter-native-tab-v2-reservation/v1",on=`${Ut}:`;function nn(e){if(e===null||typeof e=="string"||typeof e=="boolean")return e;if(typeof e=="number"){if(!Number.isFinite(e))throw new Error("canonical_non_finite_number");return e}if(typeof e=="bigint")return e.toString();if(Array.isArray(e))return e.map(nn);if(typeof e=="object")return Object.fromEntries(Object.entries(e).filter(([,t])=>t!==void 0).sort(([t],[n])=>t.localeCompare(n)).map(([t,n])=>[t,nn(n)]));throw new Error("canonical_value_unsupported")}function Tn(e){return JSON.stringify(nn(e))}function ot(e){if(e==="solana:mainnet"||e===Bt)return Bt;throw new Error("native_tab_v2_reservation_network_unsupported")}function st(e){return(0,Ae.bytesToHex)((0,rn.sha256)(new TextEncoder().encode(Tn({channelId:e.payload.channelId,cumulativeAmount:e.payload.cumulativeAmount,sequenceNumber:e.payload.sequenceNumber,sessionPublicKey:(0,Ae.bytesToHex)(e.sessionPublicKey),sessionSignature:(0,Ae.bytesToHex)(e.sessionSignature),sessionRegistration:(0,Ae.bytesToHex)(e.sessionRegistration)}))))}function Me(e){let t=st(e);return{voucherDigest:t,idempotencyKey:`native-tab-v2:${t}`}}function sn(e){return(0,Ae.bytesToHex)((0,rn.sha256)(new TextEncoder().encode(Tn({contract:Ut,network:ot(e.network),programId:e.programId,buyerSwigAddress:e.buyerSwigAddress,vaultPda:e.vaultPda,sessionPda:e.sessionPda,seller:e.seller,channelId:e.channelId,sessionNonce:e.sessionNonce,reservationAmountAtomic:e.reservationAmountAtomic,previousCumulativeAtomic:e.previousCumulativeAtomic,voucherDigest:e.voucherDigest,cumulativeAmountAtomic:e.cumulativeAmountAtomic,sequenceNumber:e.sequenceNumber}))))}function an(e){let t=st(e.voucher);return sn({network:e.network,programId:e.programId,buyerSwigAddress:e.buyerSwigAddress,vaultPda:e.vaultPda,sessionPda:e.sessionPda,seller:e.seller,channelId:e.channelId,sessionNonce:e.sessionNonce,reservationAmountAtomic:e.reservationAmountAtomic,previousCumulativeAtomic:e.previousCumulativeAtomic,voucherDigest:t,cumulativeAmountAtomic:e.voucher.payload.cumulativeAmount,sequenceNumber:e.voucher.payload.sequenceNumber})}function Dt(e){return`${on}${an(e)}`}function L(e){throw new Error(`native_tab_v2_reservation_receipt_invalid:${e}`)}function Ot(e,t){(!Number.isSafeInteger(e)||e<0)&&L(t)}function ie(e,t){(!t||typeof t!="object")&&L("missing");let n=st(e.voucher);(!xn.test(e.voucherDigest)||e.voucherDigest!==n)&&L("input_voucher_digest"),e.idempotencyKey!==`native-tab-v2:${n}`&&L("input_idempotency_identity");let r=BigInt(e.voucher.payload.cumulativeAmount),o=BigInt(e.previousCumulativeAtomic),i=BigInt(e.reservationAmountAtomic);(r<=o||r-o!==i||i<=0n)&&L("input_reservation_delta"),(e.voucher.payload.channelId!==e.channelId||(e.voucher.payload.sequenceNumber&2147483648)===0||(e.sessionNonce&2147483648)===0||e.voucher.sessionPublicKey.length!==32||e.voucher.sessionSignature.length!==64||e.voucher.sessionRegistration.length!==188)&&L("input_voucher_identity"),t.contract!=="dexter-native-tab-open-receipt/v1"&&t.contract!=="dexter-native-tab-open-receipt/v2"&&L("contract"),xn.test(t.operationId)||L("operation_id"),Rn.test(t.callerOperationId)||L("caller_operation_id"),br.test(t.transaction)||L("transaction"),t.commitment!=="confirmed"&&t.commitment!=="finalized"&&L("commitment"),Ot(t.confirmationSlot,"confirmation_slot"),Ot(t.postStateSlot,"post_state_slot"),(t.confirmationSlot===0||t.postStateSlot<t.confirmationSlot)&&L("post_state_slot");let s,a;try{s=ot(e.network),a=ot(t.network)}catch{return L("network")}(a!==s||t.buyerSwigAddress!==e.buyerSwigAddress||t.vaultPda!==e.vaultPda||t.sessionPda!==e.sessionPda||t.seller!==e.seller||t.channelId!==e.channelId||t.sessionPublicKey!==(0,Ae.bytesToHex)(e.voucher.sessionPublicKey)||t.voucherDigest!==n||t.cumulativeAmountAtomic!==e.voucher.payload.cumulativeAmount||t.sequenceNumber!==e.voucher.payload.sequenceNumber||!Rn.test(t.providerReceiptId)||t.reservationAmountAtomic!==e.reservationAmountAtomic||t.currentOutstandingBeforeAtomic!=="0"||t.currentOutstandingAfterAtomic!==e.reservationAmountAtomic)&&L("economic_identity"),Ot(t.pendingVoucherCountBefore,"pending_voucher_count_before"),Ot(t.pendingVoucherCountAfter,"pending_voucher_count_after"),t.contract==="dexter-native-tab-open-receipt/v1"?t.callerOperationId!==e.idempotencyKey&&L("idempotency_key"):(t.rootOperationId!==e.idempotencyKey||!Number.isSafeInteger(t.generation)||Number(t.generation)<2||!t.predecessorCallerOperationId||!t.predecessorLifecycleOperationId||!t.predecessorReleaseDigest||!t.stableReservationId||!t.economicEffectDigest)&&L("successor_identity")}var En=require("@dexterai/vault/session");var be=require("@dexterai/vault/instructions"),cn=require("@dexterai/vault/precompile"),q=require("@dexterai/vault/constants");var vr=3600,at="https://x402.dexter.cash",Pn=6;function ce(e,t=Pn){if(!/^\d+(\.\d+)?$/.test(e))throw new Error(`amount must be a non-negative decimal string, got "${e}"`);let[n,r=""]=e.split(".");if(r.length>t)throw new Error(`amount "${e}" has more than ${t} decimals`);let o=r.padEnd(t,"0"),i=`${n}${o}`.replace(/^0+(?=\d)/,"");return i===""?"0":i}function ve(e,t=Pn){if(!/^\d+$/.test(e))throw new Error(`atomic must be a non-negative integer string, got "${e}"`);let n=e.padStart(t+1,"0"),r=n.slice(0,-t).replace(/^0+(?=\d)/,"")||"0",o=n.slice(-t).replace(/0+$/,"");return o?`${r}.${o}`:r}var it=class{channelId;voucherVersion;network;counterparty;internals;initialCumulativeAtomic;cumulativeAtomic;sequenceNumber;isFinalV2;closed=!1;operationInFlight=null;lastSignedVoucher=null;lastSignedVoucherIncrementAtomic=null;previousSignedVoucher=null;previousSignedVoucherIncrementAtomic=null;constructor(t){if(this.internals=t,this.channelId=t.channelIdHex,this.network=t.network,this.counterparty=t.counterparty,this.initialCumulativeAtomic=t.initialCumulativeAtomic??0n,this.cumulativeAtomic=this.initialCumulativeAtomic,this.sequenceNumber=t.initialSequenceOrdinal??0,this.isFinalV2=In(t.session),this.voucherVersion=this.isFinalV2?2:1,this.isFinalV2!==!!t.beforeVoucherRelease)throw new Error(this.isFinalV2?"native_tab_v2_reservation_fence_required":"native_tab_v1_must_not_use_v2_reservation_fence")}get state(){let t=this.internals.totalCapAtomic-this.cumulativeAtomic,n=Math.floor(Date.now()/1e3);return{isOpen:!this.closed,spent:ve(this.cumulativeAtomic.toString()),remaining:ve(t.toString()),expiresInSec:Math.max(0,this.internals.expiresAtUnix-n)}}async signNextVoucher(t){this.beginOperation("voucher");try{return await this.signNextVoucherExclusive(t)}finally{this.endOperation("voucher")}}async signNextVoucherExclusive(t){if(this.closed)throw new oe(this.channelId);let n=BigInt(t);if(n<=0n)throw new Error(`voucher increment must be > 0, got ${t}`);if(n>this.internals.perUnitCapAtomic)throw new he("cap_exceeded",`single voucher increment ${n} exceeds perUnitCap ${this.internals.perUnitCapAtomic}`);let r=this.cumulativeAtomic+n;if(r>this.internals.totalCapAtomic)throw new he("cap_exceeded",`cumulative ${r} would exceed totalCap ${this.internals.totalCapAtomic}`);let o=this.sequenceNumber+1,i={channelId:this.channelId,cumulativeAmount:r.toString(),sequenceNumber:o},s=await this.internals.vault.signWithSession(this.internals.session,i);if(s.payload.channelId!==i.channelId||s.payload.cumulativeAmount!==i.cumulativeAmount||(this.isFinalV2?(s.payload.sequenceNumber&2147483647)!==o||(s.payload.sequenceNumber&2147483648)===0:s.payload.sequenceNumber!==o))throw new Error("tab_signer_returned_unexpected_voucher");let a;this.internals.beforeVoucherRelease&&(a=await this.internals.beforeVoucherRelease({voucher:s,incrementAtomic:n.toString(),previousCumulativeAtomic:this.cumulativeAtomic.toString()}));let c=a?{...s,reservationReceipt:a}:s;return this.previousSignedVoucher=this.lastSignedVoucher,this.previousSignedVoucherIncrementAtomic=this.lastSignedVoucherIncrementAtomic,this.lastSignedVoucher=c,this.lastSignedVoucherIncrementAtomic=n,this.sequenceNumber=o,this.cumulativeAtomic=r,c}beginOperation(t){if(this.operationInFlight!==null)throw new Error(`tab_operation_in_flight: ${this.operationInFlight}`);this.operationInFlight=t}endOperation(t){if(this.operationInFlight!==t)throw new Error("tab_operation_gate_corrupted");this.operationInFlight=null}rollbackVoucher(t){if(this.isFinalV2||this.operationInFlight!==null)return!1;this.beginOperation("rollback");try{return this.rollbackVoucherExclusive(t)}finally{this.endOperation("rollback")}}rollbackVoucherExclusive(t){let n=this.lastSignedVoucher;if(!n||n.payload.sequenceNumber!==t.payload.sequenceNumber||n.payload.cumulativeAmount!==t.payload.cumulativeAmount)return!1;let r=this.previousSignedVoucher;if(r){let o=this.previousSignedVoucherIncrementAtomic;if(o===null)return!1;this.sequenceNumber=r.payload.sequenceNumber,this.cumulativeAtomic=BigInt(r.payload.cumulativeAmount),this.lastSignedVoucher=r,this.lastSignedVoucherIncrementAtomic=o}else if(n.payload.sequenceNumber===1)this.sequenceNumber=0,this.cumulativeAtomic=this.initialCumulativeAtomic,this.lastSignedVoucher=null,this.lastSignedVoucherIncrementAtomic=null;else return!1;return this.previousSignedVoucher=null,this.previousSignedVoucherIncrementAtomic=null,!0}async stream(t,n){if(this.closed)throw new oe(this.channelId);let r=await this.signNextVoucher(this.internals.perUnitCapAtomic.toString()),o=new Headers(n?.headers);o.set("X-Tab-Voucher",ct(r)),o.set("Accept","text/event-stream");let i=await fetch(t,{...n,headers:o});if(!i.ok){let s=await i.text().catch(()=>"");throw new Error(`tab.stream HTTP ${i.status}: ${s.slice(0,500)}`)}if(!i.body)throw new Error("tab.stream response has no body");return xr(i.body)}async close(){this.beginOperation("close");try{if(this.closed)throw new oe(this.channelId);let t={settleTx:""};if(this.lastSignedVoucher&&this.cumulativeAtomic>0n){let r=this.isFinalV2?this.lastSignedVoucherIncrementAtomic:this.cumulativeAtomic-this.initialCumulativeAtomic;if(r===null||r<=0n)throw new Error("tab_settle_attempted_amount_missing");t=await wr(this.internals.facilitatorUrl,this.lastSignedVoucher,this.internals.network,r.toString())}let n=(this.internals.closeMode??"revoke")==="revoke";return n&&await this.internals.vault.signCloseTab(this.internals.session,this.channelId,this.cumulativeAtomic.toString()),this.closed=!0,this.internals.session.privateKey.fill(0),{settledAmount:ve(this.cumulativeAtomic.toString()),sessionRevoked:n,...t}}finally{this.endOperation("close")}}};function In(e){return e.registration.length!==188?!1:(new DataView(e.registration.buffer,e.registration.byteOffset,e.registration.byteLength).getUint32(176,!0)&2147483648)!==0}function ct(e,t){let n=t??e.reservationReceipt;if((e.payload.sequenceNumber&2147483648)!==0&&!n)throw new Error("native_tab_v2_reservation_receipt_required");return Buffer.from(JSON.stringify({payload:e.payload,sessionPublicKey:(0,ue.bytesToHex)(e.sessionPublicKey),sessionRegistration:(0,ue.bytesToHex)(e.sessionRegistration),sessionSignature:(0,ue.bytesToHex)(e.sessionSignature),...n?{reservationReceipt:n}:{}}),"utf8").toString("base64")}function Ke(e){return typeof e!="string"||!/^\d+$/.test(e)?null:BigInt(e)}function Sr(e){let t;try{t=JSON.parse(e)}catch{return!1}if(typeof t!="object"||t===null)return!1;let n="non_monotonic_cumulative";if(t.error!==n&&t.reason!==n)return!1;let r=Ke(t.attempted_cumulative),o=Ke(t.on_chain_spent),i=Ke(t.frontier);return r===null||o===null||i===null?!1:r>o&&r<=i}async function wr(e,t,n,r){let o=`${e.replace(/\/$/,"")}/tab/settle`,i={attemptedAmount:r,channelId:t.payload.channelId,cumulativeAmount:t.payload.cumulativeAmount,sequenceNumber:t.payload.sequenceNumber,sessionPublicKey:(0,ue.bytesToHex)(t.sessionPublicKey),sessionSignature:(0,ue.bytesToHex)(t.sessionSignature),sessionRegistration:(0,ue.bytesToHex)(t.sessionRegistration),network:n},s=await fetch(o,{method:"POST",headers:{"content-type":"application/json"},body:JSON.stringify(i)}),a=await s.text();if(!s.ok){if(s.status===409&&Sr(a))return{settleTx:""};throw new Error(`tab settle ${s.status}: ${a.slice(0,500)}`)}let c;try{c=JSON.parse(a)}catch{throw new Error(`tab settle returned non-JSON: ${a.slice(0,200)}`)}if(c.reason==="covered_by_frontier"){let m=Ke(c.attemptedCumulative),p=Ke(c.onChainSpent),f=Ke(c.frontier);if(m!==null&&p!==null&&f!==null&&m>p&&m<=f)return{settleTx:""}}if(!c.settleTx)throw new Error(`tab settle returned no settleTx: ${a.slice(0,200)}`);let u={settleTx:c.settleTx};return typeof c.grossAmount=="string"&&(u.grossAmount=c.grossAmount),typeof c.feeAmount=="string"&&(u.feeAmount=c.feeAmount),typeof c.netAmount=="string"&&(u.netAmount=c.netAmount),u}async function Vn(e,t,n,r,o){throw new Y("armTabOpen")}async function Mt(e){if(e.network!==e.vault.network)throw new ge(`options.network (${e.network}) doesn't match vault.network (${e.vault.network})`);if(e.network!=="solana:mainnet")throw new ge(e.network);if(e.vault.sessionVoucherVersion!==1&&e.vault.sessionVoucherVersion!==2)throw new Error("native_tab_adapter_voucher_version_required");if(e.vault.sessionVoucherVersion===1)throw new Y("openTab");if(e.vault.sessionVoucherVersion===2&&(!e.reserveFinalVoucherV2||!e.vault.verifyFinalVoucherV2Reservation))throw new Error("native_tab_v2_reservation_fence_required");let t=BigInt(Math.floor(Math.random()*4294967295)),n=new ae.PublicKey(e.vault.vaultPda),r=De({vaultPda:n,sellerUrl:e.seller,nonce:BigInt(t)}),o=(0,ue.bytesToHex)(r),i=BigInt(ce(e.perUnitCap)),s=BigInt(ce(e.totalCap));if(i<=0n)throw new Error("perUnitCap must be > 0");if(s<i)throw new Error("totalCap must be >= perUnitCap");if(e.revolvingCapacity!==void 0&&BigInt(ce(e.revolvingCapacity))<=0n)throw new Error("revolvingCapacity must be > 0");let a=e.sessionDuration??vr,c=Math.floor(Date.now()/1e3)+a,u=_r(e.seller),m={channelId:o,maxAmountAtomic:s.toString(),revolvingCapacityAtomic:e.revolvingCapacity?ce(e.revolvingCapacity):s.toString(),expiresAtUnix:c,allowedCounterparty:u},p=await e.vault.authorizeSession(m,{onLiveSession:e.onLiveSession}),f=In(p);if(e.vault.sessionVoucherVersion!==(f?2:1))throw new Error("native_tab_adapter_voucher_version_mismatch");let b;if(f){if(!e.reserveFinalVoucherV2)throw new Error("native_tab_v2_reservation_fence_required");let l=p.registration,d=new DataView(l.buffer,l.byteOffset,l.byteLength),T=new ae.PublicKey(l.subarray(32,64)),x=new ae.PublicKey(l.subarray(64,96)),g=new ae.PublicKey(l.subarray(144,176)),h=d.getUint32(176,!0),E=d.getBigUint64(180,!0),V=(0,R.sessionRegisterMessage)({programId:q.DEXTER_VAULT_PROGRAM_ID,vaultPda:n,sessionPubkey:p.publicKey,maxAmount:s,expiresAt:BigInt(c),allowedCounterparty:new ae.PublicKey(u),nonce:h,maxRevolvingCapacity:BigInt(m.revolvingCapacityAtomic)});if(!T.equals(q.DEXTER_VAULT_PROGRAM_ID)||!x.equals(n)||!g.equals(new ae.PublicKey(u))||E!==BigInt(m.revolvingCapacityAtomic)||!Buffer.from(l).equals(Buffer.from(V)))throw new Error("native_tab_v2_registration_identity_mismatch");let[j]=(0,En.deriveSessionPda)(x,g,T);b=async({voucher:$,incrementAtomic:P,previousCumulativeAtomic:k})=>{let y=Me($),v={network:e.network,programId:T.toBase58(),buyerSwigAddress:e.vault.swigAddress,vaultPda:x.toBase58(),sessionPda:j.toBase58(),seller:g.toBase58(),channelId:o,sessionNonce:h,reservationAmountAtomic:P,previousCumulativeAtomic:k,...y,voucher:$},S=await e.reserveFinalVoucherV2(v);return ie(v,S),await e.vault.verifyFinalVoucherV2Reservation(v,S),S}}return new it({vault:e.vault,network:e.network,seller:e.seller,counterparty:u,session:p,channelIdHex:o,channelIdBytes:r,perUnitCapAtomic:i,totalCapAtomic:s,expiresAtUnix:c,facilitatorUrl:e.facilitatorUrl??at,beforeVoucherRelease:b})}async function Cn(e){throw new Error("resumeTab is Phase 3 work. Session keys are memory-only by design; recovery requires reading active_session on chain and re-authorizing. Tracked in dexter-vault roadmap.")}function _r(e){if(/^[1-9A-HJ-NP-Za-km-z]{32,44}$/.test(e))try{return new ae.PublicKey(e),e}catch{}throw new Error(`seller must be a base58 Solana pubkey for Phase 2 (got "${e}"). URL-based counterparty resolution lands in Phase 3 (seller middleware).`)}async function*xr(e){let t=e.getReader(),n=new TextDecoder,r="";try{for(;;){let{done:o,value:i}=await t.read();if(o)break;r+=n.decode(i,{stream:!0});let s;for(;(s=r.indexOf(`
|
|
1
|
+
"use strict";var Sr=Object.create;var Nt=Object.defineProperty;var wr=Object.getOwnPropertyDescriptor;var _r=Object.getOwnPropertyNames;var xr=Object.getPrototypeOf,Rr=Object.prototype.hasOwnProperty;var Tr=(e,t)=>{for(var n in t)Nt(e,n,{get:t[n],enumerable:!0})},Rn=(e,t,n,r)=>{if(t&&typeof t=="object"||typeof t=="function")for(let o of _r(t))!Rr.call(e,o)&&o!==n&&Nt(e,o,{get:()=>t[o],enumerable:!(r=wr(t,o))||r.enumerable});return e};var Y=(e,t,n)=>(n=e!=null?Sr(xr(e)):{},Rn(t||!e||!e.__esModule?Nt(n,"default",{value:e,enumerable:!0}):n,e)),Er=e=>Rn(Nt({},"__esModule",{value:!0}),e);var _o={};Tr(_o,{DEFAULT_FACILITATOR_URL:()=>ut,DEXTER_VAULT_PROGRAM_ID:()=>H.DEXTER_VAULT_PROGRAM_ID,FINAL_VOUCHER_V2_RESERVATION_BINDING_DOMAIN:()=>Kt,FINAL_VOUCHER_V2_RESERVATION_MEMO_PREFIX:()=>un,FINAL_VOUCHER_V2_SOLANA_MAINNET_CAIP2:()=>Mt,HOSTED_TAB_ACCEPTANCE_RULE:()=>Xn,HOSTED_TAB_REGISTRATION_ENCODING:()=>Yn,HOSTED_TAB_TERMS_VERSION:()=>Gn,HOSTED_TAB_VOUCHER_HEADER:()=>Jn,HistoricalV1MigrationRequiredError:()=>Q,INSTRUCTIONS_SYSVAR_ID:()=>H.INSTRUCTIONS_SYSVAR_ID,LiveSessionExistsError:()=>kt,SECP256R1_PROGRAM_ID:()=>H.SECP256R1_PROGRAM_ID,SessionScopeExceededError:()=>ye,TabClosedError:()=>se,UnsupportedNetworkError:()=>he,armTabOpen:()=>Un,assertFinalVoucherV2ReservationReceipt:()=>ae,atomicToHuman:()=>Se,buildRegisterSessionKeyInstruction:()=>ve.buildRegisterSessionKeyInstruction,buildRevokeSessionKeyInstruction:()=>ve.buildRevokeSessionKeyInstruction,buildSecp256r1VerifyInstruction:()=>dn.buildSecp256r1VerifyInstruction,buildVoucherMessage:()=>P.buildVoucherMessage,canonicalFinalVoucherV2ReservationNetwork:()=>it,deriveChannelId:()=>Me,finalVoucherV2Digest:()=>at,finalVoucherV2ReservationBindingDigest:()=>mn,finalVoucherV2ReservationBindingDigestFromIdentity:()=>ln,finalVoucherV2ReservationIdentity:()=>Ke,finalVoucherV2ReservationMemo:()=>Ft,finalVoucherV2Sequence:()=>P.finalVoucherV2Sequence,generateSessionKeypair:()=>En,humanToAtomic:()=>ue,makeSessionKey:()=>Ot,openTab:()=>Lt,parseAtomic:()=>Ae,payUrlWithTab:()=>Ar,resolveTabOffer:()=>je,resolveTabTerms:()=>br,resumeTab:()=>Dn,scopeCapAtomic:()=>Pn,sessionRegisterMessage:()=>P.sessionRegisterMessage,sessionReplaceV1Message:()=>P.sessionReplaceV1Message,sessionRevokeMessage:()=>P.sessionRevokeMessage,sessionVoucherV2AuthorizationNonce:()=>P.sessionVoucherV2AuthorizationNonce,sessionVoucherV2Nonce:()=>P.sessionVoucherV2Nonce,signContextBoundFinalVoucherV2:()=>Ut,signVoucher:()=>Bt,tabFromGrant:()=>Wn,voucherPayloadMessage:()=>P.voucherPayloadMessage,voucherToHeader:()=>lt,voucherV2SequenceOrdinal:()=>P.voucherV2SequenceOrdinal});module.exports=Er(_o);var he=class extends Error{constructor(n){super(`Network ${n} is not yet supported by @dexterai/x402/tab`);this.network=n;this.name="UnsupportedNetworkError"}network},Q=class extends Error{constructor(n){super(`native_tab_v1_migration_required: @dexterai/x402 v6 cannot safely arm or reconstruct a buyer-side V1 tab through ${n}; settle or revoke the historical session through the deployment that originally opened it, then create a context-bound V2 session`);this.surface=n;this.name="HistoricalV1MigrationRequiredError"}surface;code="native_tab_v1_migration_required"},ye=class extends Error{constructor(n,r){super(`Session scope exceeded: ${n}${r?` (${r})`:""}`);this.reason=n;this.name="SessionScopeExceededError"}reason},se=class extends Error{constructor(n){super(`Tab ${n} is already closed`);this.channelId=n;this.name="TabClosedError"}channelId},kt=class extends Error{constructor(n){super(`a LIVE session already exists for counterparty ${n.allowedCounterparty} (session ${n.sessionPubkeyHex.slice(0,16)}\u2026, expires ${n.expiresAtUnix}; on-chain spent=${n.spentAtomic}, crystallized=${n.crystallizedCumulativeAtomic}, frontier=${n.frontierAtomic}). Replacing it voids any signed-but-unsettled vouchers beyond the frontier. Settle the old tab first (tab.close() or POST its last voucher to /tab/settle), or pass onLiveSession: 'replace' to atomically revoke-then-register over it.`);this.details=n;this.name="LiveSessionExistsError"}details};var ce=require("@solana/web3.js"),le=require("@noble/hashes/utils");var st=Y(require("tweetnacl"),1),ot=require("@solana/web3.js"),ie=require("@dexterai/vault/messages"),Tn=require("@dexterai/vault/session");var P=require("@dexterai/vault/messages");var In=require("@noble/hashes/sha256");function En(){let e=st.default.sign.keyPair();return{publicKey:e.publicKey,privateKey:e.secretKey}}function Ot(e,t,n){return{publicKey:e.publicKey,privateKey:e.privateKey,scope:t,registration:n}}function Bt(e,t,n){if(n.length!==32)throw new Error(`channelIdBytes must be 32 bytes, got ${n.length}`);if(e.registration.length===188&&new DataView(e.registration.buffer,e.registration.byteOffset,e.registration.byteLength).getUint32(176,!0)>=2147483648)throw new Error("context-bound V2 sessions require signContextBoundFinalVoucherV2 and a durable reservation");let r=BigInt(t.cumulativeAmount),o=BigInt(e.scope.maxAmountAtomic);if(r>o)throw new Error(`voucher cumulative ${r} exceeds session cap ${o}`);let a=Math.floor(Date.now()/1e3);if(a>=e.scope.expiresAtUnix)throw new Error(`session expired at ${e.scope.expiresAtUnix}, now ${a}`);let i=(0,P.voucherPayloadMessage)({channelId:n,cumulativeAmount:r,sequenceNumber:t.sequenceNumber}),s=st.default.sign.detached(i,e.privateKey);return{payload:t,sessionPublicKey:e.publicKey,sessionRegistration:e.registration,sessionSignature:s}}var Pr=/^[0-9a-f]{64}$/,Ir=(1n<<64n)-1n;function on(e){return Buffer.from(e).toString("hex")}function Vr(e){return Uint8Array.from(Buffer.from(e,"hex"))}function sn(e,t){if(e.length!==t.length)return!1;let n=0;for(let r=0;r<e.length;r+=1)n|=(e[r]??0)^(t[r]??0);return n===0}function Ut(e){if(!Pr.test(e.channelId)||e.sessionPublicKey.length!==32||e.sessionPrivateKey.length!==64||e.sessionRegistration.length!==188||!/^[1-9][0-9]*$/.test(e.cumulativeAmountAtomic))throw new Error("native_tab_v2_signing_input_invalid");let t=BigInt(e.cumulativeAmountAtomic);if(t>Ir)throw new Error("native_tab_v2_cumulative_amount_invalid");let n=new ot.PublicKey(e.programId),r=new ot.PublicKey(e.vaultPda),o=new ot.PublicKey(e.sessionPda),a=new ot.PublicKey(e.seller),[i]=(0,Tn.deriveSessionPda)(r,a,n);if(!o.equals(i))throw new Error("native_tab_v2_session_pda_mismatch");let s=e.sessionRegistration,c=new DataView(s.buffer,s.byteOffset,s.byteLength),u=c.getBigUint64(128,!0),d=c.getBigInt64(136,!0),g=c.getBigUint64(180,!0),f=e.nowUnixSeconds??Math.floor(Date.now()/1e3);if(!Number.isSafeInteger(f)||f<0)throw new Error("native_tab_v2_signing_time_invalid");if(!sn(s,(0,ie.sessionRegisterMessage)({programId:n,vaultPda:r,sessionPubkey:e.sessionPublicKey,maxAmount:u,expiresAt:d,allowedCounterparty:a,nonce:e.sessionNonce,maxRevolvingCapacity:g})))throw new Error("native_tab_v2_registration_identity_mismatch");if(u===0n||g===0n||g>u||d<=BigInt(f)||d>0x7fffffffffffffffn-604800n||t>u)throw new Error("native_tab_v2_registration_semantics_invalid");(0,ie.sessionVoucherV2AuthorizationNonce)(e.sessionNonce);let m=st.default.sign.keyPair.fromSeed(e.sessionPrivateKey.subarray(0,32)),l=!1;try{l=sn(m.publicKey,e.sessionPublicKey)&&sn(e.sessionPrivateKey.subarray(32,64),e.sessionPublicKey)}finally{m.secretKey.fill(0)}if(!l)throw new Error("native_tab_v2_session_key_mismatch");let v=(0,ie.finalVoucherV2Sequence)(e.sequenceOrdinal),x=(0,ie.contextBoundVoucherV2Message)({programId:n,vaultPda:r,sessionPda:o,seller:a,sessionNonce:e.sessionNonce,channelId:Vr(e.channelId),cumulativeAmount:t,sequenceNumber:v}),p=st.default.sign.detached(x,e.sessionPrivateKey);return{channelId:e.channelId,cumulativeAmount:e.cumulativeAmountAtomic,sequenceNumber:v,sessionPublicKey:on(e.sessionPublicKey),sessionSignature:on(p),sessionRegistration:on(s)}}function Pn(e){return Ae(e.maxAmountAtomic)}function Ae(e){if(!/^\d+$/.test(e))throw new Error(`atomic amount must be a non-negative integer string, got "${e}"`);return BigInt(e)}function Me(e){let t=new Uint8Array(8);new DataView(t.buffer).setBigUint64(0,e.nonce,!0);let n=new TextEncoder().encode(e.sellerUrl),r=In.sha256.create();return r.update(e.vaultPda.toBytes()),r.update(n),r.update(t),r.digest()}var cn=require("@noble/hashes/sha256"),be=require("@noble/hashes/utils"),Vn=/^[0-9a-f]{64}$/,Cn=/^[A-Za-z0-9][A-Za-z0-9._:-]{0,199}$/,Cr=/^[1-9A-HJ-NP-Za-km-z]{32,100}$/,Mt="solana:5eykt4UsFv8P8NJdTREpY1vzqKqZKvdp",Kt="dexter-native-tab-v2-reservation/v1",un=`${Kt}:`;function an(e){if(e===null||typeof e=="string"||typeof e=="boolean")return e;if(typeof e=="number"){if(!Number.isFinite(e))throw new Error("canonical_non_finite_number");return e}if(typeof e=="bigint")return e.toString();if(Array.isArray(e))return e.map(an);if(typeof e=="object")return Object.fromEntries(Object.entries(e).filter(([,t])=>t!==void 0).sort(([t],[n])=>t.localeCompare(n)).map(([t,n])=>[t,an(n)]));throw new Error("canonical_value_unsupported")}function Nn(e){return JSON.stringify(an(e))}function it(e){if(e==="solana:mainnet"||e===Mt)return Mt;throw new Error("native_tab_v2_reservation_network_unsupported")}function at(e){return(0,be.bytesToHex)((0,cn.sha256)(new TextEncoder().encode(Nn({channelId:e.payload.channelId,cumulativeAmount:e.payload.cumulativeAmount,sequenceNumber:e.payload.sequenceNumber,sessionPublicKey:(0,be.bytesToHex)(e.sessionPublicKey),sessionSignature:(0,be.bytesToHex)(e.sessionSignature),sessionRegistration:(0,be.bytesToHex)(e.sessionRegistration)}))))}function Ke(e){let t=at(e);return{voucherDigest:t,idempotencyKey:`native-tab-v2:${t}`}}function ln(e){return(0,be.bytesToHex)((0,cn.sha256)(new TextEncoder().encode(Nn({contract:Kt,network:it(e.network),programId:e.programId,buyerSwigAddress:e.buyerSwigAddress,vaultPda:e.vaultPda,sessionPda:e.sessionPda,seller:e.seller,channelId:e.channelId,sessionNonce:e.sessionNonce,reservationAmountAtomic:e.reservationAmountAtomic,previousCumulativeAtomic:e.previousCumulativeAtomic,voucherDigest:e.voucherDigest,cumulativeAmountAtomic:e.cumulativeAmountAtomic,sequenceNumber:e.sequenceNumber}))))}function mn(e){let t=at(e.voucher);return ln({network:e.network,programId:e.programId,buyerSwigAddress:e.buyerSwigAddress,vaultPda:e.vaultPda,sessionPda:e.sessionPda,seller:e.seller,channelId:e.channelId,sessionNonce:e.sessionNonce,reservationAmountAtomic:e.reservationAmountAtomic,previousCumulativeAtomic:e.previousCumulativeAtomic,voucherDigest:t,cumulativeAmountAtomic:e.voucher.payload.cumulativeAmount,sequenceNumber:e.voucher.payload.sequenceNumber})}function Ft(e){return`${un}${mn(e)}`}function $(e){throw new Error(`native_tab_v2_reservation_receipt_invalid:${e}`)}function Dt(e,t){(!Number.isSafeInteger(e)||e<0)&&$(t)}function ae(e,t){(!t||typeof t!="object")&&$("missing");let n=at(e.voucher);(!Vn.test(e.voucherDigest)||e.voucherDigest!==n)&&$("input_voucher_digest"),e.idempotencyKey!==`native-tab-v2:${n}`&&$("input_idempotency_identity");let r=BigInt(e.voucher.payload.cumulativeAmount),o=BigInt(e.previousCumulativeAtomic),a=BigInt(e.reservationAmountAtomic);(r<=o||r-o!==a||a<=0n)&&$("input_reservation_delta"),(e.voucher.payload.channelId!==e.channelId||(e.voucher.payload.sequenceNumber&2147483648)===0||(e.sessionNonce&2147483648)===0||e.voucher.sessionPublicKey.length!==32||e.voucher.sessionSignature.length!==64||e.voucher.sessionRegistration.length!==188)&&$("input_voucher_identity"),t.contract!=="dexter-native-tab-open-receipt/v1"&&t.contract!=="dexter-native-tab-open-receipt/v2"&&$("contract"),Vn.test(t.operationId)||$("operation_id"),Cn.test(t.callerOperationId)||$("caller_operation_id"),Cr.test(t.transaction)||$("transaction"),t.commitment!=="confirmed"&&t.commitment!=="finalized"&&$("commitment"),Dt(t.confirmationSlot,"confirmation_slot"),Dt(t.postStateSlot,"post_state_slot"),(t.confirmationSlot===0||t.postStateSlot<t.confirmationSlot)&&$("post_state_slot");let i,s;try{i=it(e.network),s=it(t.network)}catch{return $("network")}(s!==i||t.buyerSwigAddress!==e.buyerSwigAddress||t.vaultPda!==e.vaultPda||t.sessionPda!==e.sessionPda||t.seller!==e.seller||t.channelId!==e.channelId||t.sessionPublicKey!==(0,be.bytesToHex)(e.voucher.sessionPublicKey)||t.voucherDigest!==n||t.cumulativeAmountAtomic!==e.voucher.payload.cumulativeAmount||t.sequenceNumber!==e.voucher.payload.sequenceNumber||!Cn.test(t.providerReceiptId)||t.reservationAmountAtomic!==e.reservationAmountAtomic||t.currentOutstandingBeforeAtomic!=="0"||t.currentOutstandingAfterAtomic!==e.reservationAmountAtomic)&&$("economic_identity"),Dt(t.pendingVoucherCountBefore,"pending_voucher_count_before"),Dt(t.pendingVoucherCountAfter,"pending_voucher_count_after"),t.contract==="dexter-native-tab-open-receipt/v1"?t.callerOperationId!==e.idempotencyKey&&$("idempotency_key"):(t.rootOperationId!==e.idempotencyKey||!Number.isSafeInteger(t.generation)||Number(t.generation)<2||!t.predecessorCallerOperationId||!t.predecessorLifecycleOperationId||!t.predecessorReleaseDigest||!t.stableReservationId||!t.economicEffectDigest)&&$("successor_identity")}var kn=require("@dexterai/vault/session");var ve=require("@dexterai/vault/instructions"),dn=require("@dexterai/vault/precompile"),H=require("@dexterai/vault/constants");var Nr=3600,ut="https://x402.dexter.cash",On=6;function ue(e,t=On){if(!/^\d+(\.\d+)?$/.test(e))throw new Error(`amount must be a non-negative decimal string, got "${e}"`);let[n,r=""]=e.split(".");if(r.length>t)throw new Error(`amount "${e}" has more than ${t} decimals`);let o=r.padEnd(t,"0"),a=`${n}${o}`.replace(/^0+(?=\d)/,"");return a===""?"0":a}function Se(e,t=On){if(!/^\d+$/.test(e))throw new Error(`atomic must be a non-negative integer string, got "${e}"`);let n=e.padStart(t+1,"0"),r=n.slice(0,-t).replace(/^0+(?=\d)/,"")||"0",o=n.slice(-t).replace(/0+$/,"");return o?`${r}.${o}`:r}var ct=class{channelId;voucherVersion;network;counterparty;internals;initialCumulativeAtomic;cumulativeAtomic;sequenceNumber;isFinalV2;closed=!1;operationInFlight=null;lastSignedVoucher=null;lastSignedVoucherIncrementAtomic=null;previousSignedVoucher=null;previousSignedVoucherIncrementAtomic=null;constructor(t){if(this.internals=t,this.channelId=t.channelIdHex,this.network=t.network,this.counterparty=t.counterparty,this.initialCumulativeAtomic=t.initialCumulativeAtomic??0n,this.cumulativeAtomic=this.initialCumulativeAtomic,this.sequenceNumber=t.initialSequenceOrdinal??0,this.isFinalV2=Bn(t.session),this.voucherVersion=this.isFinalV2?2:1,this.isFinalV2!==!!t.beforeVoucherRelease)throw new Error(this.isFinalV2?"native_tab_v2_reservation_fence_required":"native_tab_v1_must_not_use_v2_reservation_fence")}get state(){let t=this.internals.totalCapAtomic-this.cumulativeAtomic,n=Math.floor(Date.now()/1e3);return{isOpen:!this.closed,spent:Se(this.cumulativeAtomic.toString()),remaining:Se(t.toString()),expiresInSec:Math.max(0,this.internals.expiresAtUnix-n)}}async signNextVoucher(t){this.beginOperation("voucher");try{return await this.signNextVoucherExclusive(t)}finally{this.endOperation("voucher")}}async signNextVoucherExclusive(t){if(this.closed)throw new se(this.channelId);let n=BigInt(t);if(n<=0n)throw new Error(`voucher increment must be > 0, got ${t}`);if(n>this.internals.perUnitCapAtomic)throw new ye("cap_exceeded",`single voucher increment ${n} exceeds perUnitCap ${this.internals.perUnitCapAtomic}`);let r=this.cumulativeAtomic+n;if(r>this.internals.totalCapAtomic)throw new ye("cap_exceeded",`cumulative ${r} would exceed totalCap ${this.internals.totalCapAtomic}`);let o=this.sequenceNumber+1,a={channelId:this.channelId,cumulativeAmount:r.toString(),sequenceNumber:o},i=await this.internals.vault.signWithSession(this.internals.session,a);if(i.payload.channelId!==a.channelId||i.payload.cumulativeAmount!==a.cumulativeAmount||(this.isFinalV2?(i.payload.sequenceNumber&2147483647)!==o||(i.payload.sequenceNumber&2147483648)===0:i.payload.sequenceNumber!==o))throw new Error("tab_signer_returned_unexpected_voucher");let s;this.internals.beforeVoucherRelease&&(s=await this.internals.beforeVoucherRelease({voucher:i,incrementAtomic:n.toString(),previousCumulativeAtomic:this.cumulativeAtomic.toString()}));let c=s?{...i,reservationReceipt:s}:i;return this.previousSignedVoucher=this.lastSignedVoucher,this.previousSignedVoucherIncrementAtomic=this.lastSignedVoucherIncrementAtomic,this.lastSignedVoucher=c,this.lastSignedVoucherIncrementAtomic=n,this.sequenceNumber=o,this.cumulativeAtomic=r,c}beginOperation(t){if(this.operationInFlight!==null)throw new Error(`tab_operation_in_flight: ${this.operationInFlight}`);this.operationInFlight=t}endOperation(t){if(this.operationInFlight!==t)throw new Error("tab_operation_gate_corrupted");this.operationInFlight=null}rollbackVoucher(t){if(this.isFinalV2||this.operationInFlight!==null)return!1;this.beginOperation("rollback");try{return this.rollbackVoucherExclusive(t)}finally{this.endOperation("rollback")}}rollbackVoucherExclusive(t){let n=this.lastSignedVoucher;if(!n||n.payload.sequenceNumber!==t.payload.sequenceNumber||n.payload.cumulativeAmount!==t.payload.cumulativeAmount)return!1;let r=this.previousSignedVoucher;if(r){let o=this.previousSignedVoucherIncrementAtomic;if(o===null)return!1;this.sequenceNumber=r.payload.sequenceNumber,this.cumulativeAtomic=BigInt(r.payload.cumulativeAmount),this.lastSignedVoucher=r,this.lastSignedVoucherIncrementAtomic=o}else if(n.payload.sequenceNumber===1)this.sequenceNumber=0,this.cumulativeAtomic=this.initialCumulativeAtomic,this.lastSignedVoucher=null,this.lastSignedVoucherIncrementAtomic=null;else return!1;return this.previousSignedVoucher=null,this.previousSignedVoucherIncrementAtomic=null,!0}async stream(t,n){if(this.closed)throw new se(this.channelId);let r=await this.signNextVoucher(this.internals.perUnitCapAtomic.toString()),o=new Headers(n?.headers);o.set("X-Tab-Voucher",lt(r)),o.set("Accept","text/event-stream");let a=await fetch(t,{...n,headers:o});if(!a.ok){let i=await a.text().catch(()=>"");throw new Error(`tab.stream HTTP ${a.status}: ${i.slice(0,500)}`)}if(!a.body)throw new Error("tab.stream response has no body");return Ur(a.body)}async close(){this.beginOperation("close");try{if(this.closed)throw new se(this.channelId);let t={settleTx:""};if(this.lastSignedVoucher&&this.cumulativeAtomic>0n){let r=this.isFinalV2?this.lastSignedVoucherIncrementAtomic:this.cumulativeAtomic-this.initialCumulativeAtomic;if(r===null||r<=0n)throw new Error("tab_settle_attempted_amount_missing");t=await Or(this.internals.facilitatorUrl,this.lastSignedVoucher,this.internals.network,r.toString())}let n=(this.internals.closeMode??"revoke")==="revoke";return n&&await this.internals.vault.signCloseTab(this.internals.session,this.channelId,this.cumulativeAtomic.toString()),this.closed=!0,this.internals.session.privateKey.fill(0),{settledAmount:Se(this.cumulativeAtomic.toString()),sessionRevoked:n,...t}}finally{this.endOperation("close")}}};function Bn(e){return e.registration.length!==188?!1:(new DataView(e.registration.buffer,e.registration.byteOffset,e.registration.byteLength).getUint32(176,!0)&2147483648)!==0}function lt(e,t){let n=t??e.reservationReceipt;if((e.payload.sequenceNumber&2147483648)!==0&&!n)throw new Error("native_tab_v2_reservation_receipt_required");return Buffer.from(JSON.stringify({payload:e.payload,sessionPublicKey:(0,le.bytesToHex)(e.sessionPublicKey),sessionRegistration:(0,le.bytesToHex)(e.sessionRegistration),sessionSignature:(0,le.bytesToHex)(e.sessionSignature),...n?{reservationReceipt:n}:{}}),"utf8").toString("base64")}function Fe(e){return typeof e!="string"||!/^\d+$/.test(e)?null:BigInt(e)}function kr(e){let t;try{t=JSON.parse(e)}catch{return!1}if(typeof t!="object"||t===null)return!1;let n="non_monotonic_cumulative";if(t.error!==n&&t.reason!==n)return!1;let r=Fe(t.attempted_cumulative),o=Fe(t.on_chain_spent),a=Fe(t.frontier);return r===null||o===null||a===null?!1:r>o&&r<=a}async function Or(e,t,n,r){let o=`${e.replace(/\/$/,"")}/tab/settle`,a={attemptedAmount:r,channelId:t.payload.channelId,cumulativeAmount:t.payload.cumulativeAmount,sequenceNumber:t.payload.sequenceNumber,sessionPublicKey:(0,le.bytesToHex)(t.sessionPublicKey),sessionSignature:(0,le.bytesToHex)(t.sessionSignature),sessionRegistration:(0,le.bytesToHex)(t.sessionRegistration),network:n},i=await fetch(o,{method:"POST",headers:{"content-type":"application/json"},body:JSON.stringify(a)}),s=await i.text();if(!i.ok){if(i.status===409&&kr(s))return{settleTx:""};throw new Error(`tab settle ${i.status}: ${s.slice(0,500)}`)}let c;try{c=JSON.parse(s)}catch{throw new Error(`tab settle returned non-JSON: ${s.slice(0,200)}`)}if(c.reason==="covered_by_frontier"){let d=Fe(c.attemptedCumulative),g=Fe(c.onChainSpent),f=Fe(c.frontier);if(d!==null&&g!==null&&f!==null&&d>g&&d<=f)return{settleTx:""}}if(!c.settleTx)throw new Error(`tab settle returned no settleTx: ${s.slice(0,200)}`);let u={settleTx:c.settleTx};return typeof c.grossAmount=="string"&&(u.grossAmount=c.grossAmount),typeof c.feeAmount=="string"&&(u.feeAmount=c.feeAmount),typeof c.netAmount=="string"&&(u.netAmount=c.netAmount),u}async function Un(e,t,n,r,o){throw new Q("armTabOpen")}async function Lt(e){if(e.network!==e.vault.network)throw new he(`options.network (${e.network}) doesn't match vault.network (${e.vault.network})`);if(e.network!=="solana:mainnet")throw new he(e.network);if(e.vault.sessionVoucherVersion!==1&&e.vault.sessionVoucherVersion!==2)throw new Error("native_tab_adapter_voucher_version_required");if(e.vault.sessionVoucherVersion===1)throw new Q("openTab");if(e.vault.sessionVoucherVersion===2&&(!e.reserveFinalVoucherV2||!e.vault.verifyFinalVoucherV2Reservation))throw new Error("native_tab_v2_reservation_fence_required");let t=BigInt(Math.floor(Math.random()*4294967295)),n=new ce.PublicKey(e.vault.vaultPda),r=Me({vaultPda:n,sellerUrl:e.seller,nonce:BigInt(t)}),o=(0,le.bytesToHex)(r),a=BigInt(ue(e.perUnitCap)),i=BigInt(ue(e.totalCap));if(a<=0n)throw new Error("perUnitCap must be > 0");if(i<a)throw new Error("totalCap must be >= perUnitCap");if(e.revolvingCapacity!==void 0&&BigInt(ue(e.revolvingCapacity))<=0n)throw new Error("revolvingCapacity must be > 0");let s=e.sessionDuration??Nr,c=Math.floor(Date.now()/1e3)+s,u=Br(e.seller),d={channelId:o,maxAmountAtomic:i.toString(),revolvingCapacityAtomic:e.revolvingCapacity?ue(e.revolvingCapacity):i.toString(),expiresAtUnix:c,allowedCounterparty:u},g=await e.vault.authorizeSession(d,{onLiveSession:e.onLiveSession}),f=Bn(g);if(e.vault.sessionVoucherVersion!==(f?2:1))throw new Error("native_tab_adapter_voucher_version_mismatch");let y;if(f){if(!e.reserveFinalVoucherV2)throw new Error("native_tab_v2_reservation_fence_required");let m=g.registration,l=new DataView(m.buffer,m.byteOffset,m.byteLength),v=new ce.PublicKey(m.subarray(32,64)),x=new ce.PublicKey(m.subarray(64,96)),p=new ce.PublicKey(m.subarray(144,176)),h=l.getUint32(176,!0),_=l.getBigUint64(180,!0),S=(0,P.sessionRegisterMessage)({programId:H.DEXTER_VAULT_PROGRAM_ID,vaultPda:n,sessionPubkey:g.publicKey,maxAmount:i,expiresAt:BigInt(c),allowedCounterparty:new ce.PublicKey(u),nonce:h,maxRevolvingCapacity:BigInt(d.revolvingCapacityAtomic)});if(!v.equals(H.DEXTER_VAULT_PROGRAM_ID)||!x.equals(n)||!p.equals(new ce.PublicKey(u))||_!==BigInt(d.revolvingCapacityAtomic)||!Buffer.from(m).equals(Buffer.from(S)))throw new Error("native_tab_v2_registration_identity_mismatch");let[z]=(0,kn.deriveSessionPda)(x,p,v);y=async({voucher:q,incrementAtomic:I,previousCumulativeAtomic:k})=>{let A=Ke(q),w={network:e.network,programId:v.toBase58(),buyerSwigAddress:e.vault.swigAddress,vaultPda:x.toBase58(),sessionPda:z.toBase58(),seller:p.toBase58(),channelId:o,sessionNonce:h,reservationAmountAtomic:I,previousCumulativeAtomic:k,...A,voucher:q},R=await e.reserveFinalVoucherV2(w);return ae(w,R),await e.vault.verifyFinalVoucherV2Reservation(w,R),R}}return new ct({vault:e.vault,network:e.network,seller:e.seller,counterparty:u,session:g,channelIdHex:o,channelIdBytes:r,perUnitCapAtomic:a,totalCapAtomic:i,expiresAtUnix:c,facilitatorUrl:e.facilitatorUrl??ut,beforeVoucherRelease:y})}async function Dn(e){throw new Error("resumeTab is Phase 3 work. Session keys are memory-only by design; recovery requires reading active_session on chain and re-authorizing. Tracked in dexter-vault roadmap.")}function Br(e){if(/^[1-9A-HJ-NP-Za-km-z]{32,44}$/.test(e))try{return new ce.PublicKey(e),e}catch{}throw new Error(`seller must be a base58 Solana pubkey for Phase 2 (got "${e}"). URL-based counterparty resolution lands in Phase 3 (seller middleware).`)}async function*Ur(e){let t=e.getReader(),n=new TextDecoder,r="";try{for(;;){let{done:o,value:a}=await t.read();if(o)break;r+=n.decode(a,{stream:!0});let i;for(;(i=r.indexOf(`
|
|
2
2
|
|
|
3
|
-
`))!==-1;){let
|
|
4
|
-
`:"\\");yield new TextEncoder().encode(u)}}}}finally{t.releaseLock()}}function
|
|
3
|
+
`))!==-1;){let s=r.slice(0,i);r=r.slice(i+2);let c=Dr(s);if(c.eventName==="end")return;if(c.data!==null){let u=c.data.replace(/\\(\\|n)/g,(d,g)=>g==="n"?`
|
|
4
|
+
`:"\\");yield new TextEncoder().encode(u)}}}}finally{t.releaseLock()}}function Dr(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}}var qe=J(require("tweetnacl"),1),le=require("@solana/web3.js"),Un=require("@noble/hashes/utils"),We=require("@dexterai/vault/session"),Dn=require("@dexterai/vault/messages"),Mn=require("@dexterai/vault/reader");var Z=require("@solana/web3.js"),Ft=require("@noble/hashes/utils"),Le=require("@dexterai/vault/credit"),Se=require("@dexterai/vault/constants"),Nn=require("@dexterai/vault/instructions"),kn=require("@dexterai/vault/reader"),$e=require("@dexterai/vault/session");var Tr=Uint8Array.from([56,67,4,209,238,143,0,129]),Er=74,Pr=188,Ir=new Z.PublicKey("MemoSq4gqABAXKb96qnH8TysNcWxMyWCqXgDLGmfcHr"),Vr=(()=>{let e=Buffer.alloc(32);return e.write("OTS_SESSION_REGISTER_V2","ascii"),e})(),un=class extends Error{constructor(n,r){super(`native_tab_v2_solana_reservation_invalid:${n}`+(r?`:${r}`:""));this.code=n;this.name="SolanaFinalVoucherV2ReservationError"}code};function A(e,t){throw new un(e,t)}function H(e,t){try{return new Z.PublicKey(e)}catch{return A(t)}}function Kt(e,t){return e.length===t.length&&e.every((n,r)=>n===t[r])}async function Cr(e){let n=(await e.connection.getSignatureStatuses([e.signature],{searchTransactionHistory:!0})).value[0]??null;if(!n)return null;n.confirmationStatus!=="confirmed"&&n.confirmationStatus!=="finalized"&&A("transaction_commitment"),n.err!==null&&A("transaction_failed");let r=await e.connection.getTransaction(e.signature,{commitment:e.commitment,maxSupportedTransactionVersion:0});if(!r)return null;r.meta||A("transaction_meta_missing"),r.slot!==n.slot&&A("transaction_status_slot");let o=r.transaction.message,i=o.version===0?o.getAccountKeys({accountKeysFromLookups:r.meta.loadedAddresses??null}):o.getAccountKeys(),s=(a,c)=>{let u=i.get(a);return u||A(c),u};return{slot:r.slot,confirmationStatus:n.confirmationStatus,err:r.meta.err,signatures:[...r.transaction.signatures],accountKeys:Array.from({length:i.length},(a,c)=>({address:s(c,"transaction_account_key").toBase58(),signer:o.isAccountSigner(c),writable:o.isAccountWritable(c)})),instructions:o.compiledInstructions.map(a=>({programId:s(a.programIdIndex,"transaction_program_id").toBase58(),accounts:a.accountKeyIndexes.map(c=>s(c,"transaction_instruction_account").toBase58()),data:Uint8Array.from(a.data)}))}}function Nr(e,t,n,r){r.length!==Er&&A("binding_length"),Kt(r.subarray(0,8),Tr)||A("binding_discriminator");let o=r.readUInt8(8),i=r.readUInt8(9);return(0,Se.isSwigVaultBindingIdentityVersion)(o)||A("binding_version"),i!==t&&A("binding_bump"),{address:e.toBase58(),owner:n.toBase58(),version:o,bump:i,swig:new Z.PublicKey(r.subarray(10,42)).toBase58(),vault:new Z.PublicKey(r.subarray(42,74)).toBase58()}}async function kr(e){let t=H(e.input.programId,"program_id"),n=H(e.input.buyerSwigAddress,"buyer_swig"),r=H(e.input.vaultPda,"vault_pda"),o=H(e.input.seller,"seller"),[i,s]=(0,Le.deriveSwigVaultBindingPda)(n,t),[a]=(0,$e.deriveSessionPda)(r,o,t),c=await e.connection.getMultipleAccountsInfoAndContext([i,r,a],{commitment:e.commitment,minContextSlot:e.minimumSlot}),[u,m,p]=c.value;u||A("binding_missing"),m||A("vault_missing"),p||A("session_missing");let f,b;try{f=(0,kn.decodeVaultFull)(Buffer.from(m.data)),b=(0,$e.decodeSessionAccount)(a,p.data)}catch(d){return A("post_state_decode",d instanceof Error?d.message:String(d))}let l=b.session;return{contextSlot:c.context.slot,binding:Nr(i,s,u.owner,Buffer.from(u.data)),vault:{owner:m.owner.toBase58(),exists:f.exists,version:f.version,swigAddress:f.swigAddress,dexterAuthority:f.dexterAuthority,pendingVoucherCount:f.pendingVoucherCount},session:{owner:p.owner.toBase58(),version:b.version,bump:b.bump,vault:b.vault,sessionPublicKey:(0,Ft.bytesToHex)(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 Or(e){let t=Buffer.from(e.voucher.sessionRegistration);return t.length!==Pr&&A("registration_length"),Kt(t.subarray(0,32),Vr)||A("registration_domain"),{programId:new Z.PublicKey(t.subarray(32,64)).toBase58(),vaultPda:new Z.PublicKey(t.subarray(64,96)).toBase58(),sessionPublicKey:(0,Ft.bytesToHex)(t.subarray(96,128)),maxAmount:t.readBigUInt64LE(128),expiresAt:t.readBigInt64LE(136),seller:new Z.PublicKey(t.subarray(144,176)).toBase58(),nonce:t.readUInt32LE(176),maxRevolvingCapacity:t.readBigUInt64LE(180)}}function Fe(e,t,n){let r=e.accountKeys.filter(o=>o.address===t);return r.length!==1&&A(`${n}_account_key`),r[0]}function Br(e,t,n){(!Number.isSafeInteger(n.slot)||n.slot<=0)&&A("transaction_slot"),n.slot!==t.confirmationSlot&&A("transaction_confirmation_slot"),n.err!==null&&A("transaction_failed"),n.signatures[0]!==t.transaction&&A("transaction_signature"),n.instructions.length!==2&&A("transaction_instruction_count");let r=H(e.programId,"program_id"),o=H(e.buyerSwigAddress,"buyer_swig"),i=H(e.vaultPda,"vault_pda"),s=H(e.seller,"seller"),a=H(e.sessionPda,"session_pda"),[c]=(0,$e.deriveSessionPda)(i,s,r),u=(0,Le.deriveSwigVaultBindingPda)(o,r)[0],m=(0,Nn.deriveSwigWalletAddress)(o),p=(0,Le.deriveGraphConfigPda)(r)[0];a.equals(c)||A("session_pda_derivation");let f=Buffer.from(Se.DISCRIMINATORS.settle_voucher),b=n.instructions.filter(P=>{if(P.programId!==e.programId)return!1;let k=P.data;return k.length>=f.length&&Kt(k.subarray(0,f.length),f)});b.length!==1&&A("settle_voucher_instruction_count");let l=b[0];n.instructions[0]!==l&&A("settle_voucher_instruction_order");let d=Buffer.from(l.data);d.length!==49&&A("settle_voucher_instruction_length"),d.readBigUInt64LE(8).toString()!==e.reservationAmountAtomic&&A("settle_voucher_amount"),d.readUInt8(16)!==1&&A("settle_voucher_increment"),new Z.PublicKey(d.subarray(17,49)).equals(s)||A("settle_voucher_seller"),l.accounts.length<8&&A("settle_voucher_accounts"),[i.toBase58(),null,a.toBase58(),null,o.toBase58(),m.toBase58(),u.toBase58(),p.toBase58()].forEach((P,k)=>{P!==null&&l.accounts[k]!==P&&A(`settle_voucher_account_${k}`)});let x=l.accounts[1];x||A("dexter_authority");let g=Fe(n,l.accounts[0],"vault"),h=Fe(n,x,"dexter_authority"),E=Fe(n,l.accounts[2],"session");(!g.writable||g.signer)&&A("vault_privileges"),h.signer||A("dexter_authority_signature"),(!E.writable||E.signer)&&A("session_privileges");for(let P=3;P<Math.min(l.accounts.length,8);P+=1)Fe(n,l.accounts[P],`account_${P}`).signer&&A(`settle_voucher_account_${P}_signer`);for(let P=8;P<l.accounts.length;P+=1){let k=Fe(n,l.accounts[P],`sibling_${P-8}`);(!k.writable||k.signer)&&A("settle_voucher_sibling_privileges")}let V=n.instructions[1];V.programId!==Ir.toBase58()&&A("reservation_memo_program"),(V.accounts.length!==1||V.accounts[0]!==x)&&A("reservation_memo_authority"),Fe(n,x,"reservation_memo_authority").signer||A("reservation_memo_authority_signature");let $=new TextEncoder().encode(Dt(e));return Kt(V.data,$)||A("reservation_memo_digest"),x}function Ur(e,t,n,r){let o=H(e.programId,"program_id"),i=H(e.buyerSwigAddress,"buyer_swig"),s=H(e.vaultPda,"vault_pda"),a=H(e.seller,"seller"),[c,u]=(0,Le.deriveSwigVaultBindingPda)(i,o),[m,p]=(0,$e.deriveSessionPda)(s,a,o);(!Number.isSafeInteger(r.contextSlot)||r.contextSlot<t)&&A("post_state_slot"),(r.binding.address!==c.toBase58()||r.binding.owner!==e.programId||r.binding.bump!==u||!(0,Se.isSwigVaultBindingIdentityVersion)(r.binding.version)||r.binding.swig!==e.buyerSwigAddress||r.binding.vault!==e.vaultPda)&&A("binding_identity"),(r.vault.owner!==e.programId||!r.vault.exists||r.vault.version!==7||r.vault.swigAddress!==e.buyerSwigAddress||r.vault.dexterAuthority!==n)&&A("vault_post_state"),(e.sessionPda!==m.toBase58()||r.session.owner!==e.programId||r.session.version!==1||r.session.bump!==p||r.session.vault!==e.vaultPda||r.session.sessionPublicKey!==(0,Ft.bytesToHex)(e.voucher.sessionPublicKey)||r.session.seller!==e.seller||r.session.nonce!==e.sessionNonce||r.session.currentOutstanding.toString()!==e.reservationAmountAtomic)&&A("session_post_state");let f=Or(e);(f.programId!==e.programId||f.vaultPda!==e.vaultPda||f.sessionPublicKey!==r.session.sessionPublicKey||f.seller!==e.seller||f.nonce!==e.sessionNonce||f.maxAmount!==r.session.maxAmount||f.expiresAt!==BigInt(r.session.expiresAt)||f.maxRevolvingCapacity!==r.session.maxRevolvingCapacity)&&A("registration_post_state");let b=r.session.spent>r.session.crystallizedCumulative?r.session.spent:r.session.crystallizedCumulative;return b.toString()!==e.previousCumulativeAtomic&&A("session_frontier"),{commitment:"confirmed",confirmationSlot:t,postStateSlot:r.contextSlot,sessionAccountVersion:r.session.version,wireVersion:2,frontierAtomic:b.toString(),spentAtomic:r.session.spent.toString(),currentOutstandingAtomic:r.session.currentOutstanding.toString(),crystallizedCumulativeAtomic:r.session.crystallizedCumulative.toString()}}async function Dr(e,t,n,r={}){try{ie(t,n)}catch(a){return A("provider_receipt",a instanceof Error?a.message:String(a))}t.network!=="solana:mainnet"&&A("network"),t.programId!==Se.DEXTER_VAULT_PROGRAM_ID.toBase58()&&A("program_id");let o=await(r.readTransaction??Cr)({connection:e,signature:n.transaction,commitment:"confirmed"});o||A("transaction_missing"),o.confirmationStatus!=="confirmed"&&o.confirmationStatus!=="finalized"&&A("transaction_commitment");let i=Br(t,n,o),s=await(r.readPostState??kr)({connection:e,input:t,minimumSlot:o.slot,commitment:"confirmed"});return{...Ur(t,o.slot,i,s),commitment:o.confirmationStatus}}async function On(e,t,n,r={}){await Dr(e,t,n,r)}var ln="solana:mainnet";async function Kn(e){let t=e.facilitatorUrl??at,n=e.programId??q.DEXTER_VAULT_PROGRAM_ID,r=new le.PublicKey(e.vaultPda),o=new le.PublicKey(e.params.counterparty),i=ye(e.perUnitCapAtomic);if(i<=0n)throw new Error(`perUnitCapAtomic must be > 0, got ${e.perUnitCapAtomic}`);let s=ye(e.params.maxAmountAtomic),a=ye(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=Mr(e.sessionSecretKey),m=new le.PublicKey(e.params.sessionPubkey).toBytes();if(!Bn(u.publicKey,m))throw new Error(`tab_session_key_mismatch: the supplied secret derives ${new le.PublicKey(u.publicKey).toBase58()} but params.sessionPubkey is ${e.params.sessionPubkey} \u2014 wrong key handed to this process`);let p=qe.default.randomBytes(32),f=qe.default.sign.detached(p,u.secretKey);if(!qe.default.sign.detached.verify(p,f,m))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 b=(0,R.sessionRegisterMessage)({programId:n,vaultPda:r,sessionPubkey:u.publicKey,maxAmount:s,expiresAt:BigInt(e.params.expiresAtUnix),allowedCounterparty:o,nonce:e.params.nonce,maxRevolvingCapacity:a}),l=typeof e.connection=="string"?new le.Connection(e.connection,"confirmed"):e.connection,d=await(0,We.fetchSessionAccount)(l,r,o,n);if(!d||d.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(!(0,We.isSessionLive)(d))throw new Error(d.version!==1?`tab_session_not_live: SessionAccount has unsupported version ${d.version} \u2014 not a live v1 session`:`tab_session_not_live: SessionAccount is present but expired (expiresAt=${d.session.expiresAt})`);if(!Bn(d.session.sessionPubkey,u.publicKey))throw new Error(`tab_session_pubkey_mismatch: the on-chain session carries ${new le.PublicKey(d.session.sessionPubkey).toBase58()} \u2014 the grant this key belongs to was replaced by a newer registration`);if(d.vault!==r.toBase58()||d.session.allowedCounterparty!==o.toBase58()||d.session.maxAmount!==s||d.session.expiresAt!==e.params.expiresAtUnix||d.session.nonce!==e.params.nonce||d.session.maxRevolvingCapacity!==a)throw new Error(`tab_grant_params_stale: params disagree with the on-chain session scope (chain: maxAmount=${d.session.maxAmount} expiresAt=${d.session.expiresAt} nonce=${d.session.nonce} revolving=${d.session.maxRevolvingCapacity}; params: ${e.params.maxAmountAtomic}/${e.params.expiresAtUnix}/${e.params.nonce}/${e.params.maxRevolvingCapacityAtomic}) \u2014 refresh the grant hand-off`);if(c&&d.session.currentOutstanding!==0n)throw new Error(`native_tab_v2_reservation_pending: the session already has an exact outstanding reservation of ${d.session.currentOutstanding}; recover that immutable attempt before issuing another FINAL voucher`);let T=d.session.spent>d.session.crystallizedCumulative?d.session.spent:d.session.crystallizedCumulative;if(T>=s)throw new Error(`tab_exhausted: on-chain frontier ${T} has consumed the session cap ${s} \u2014 no voucher can strictly exceed it; open a new grant`);let x=e.sellerUrl??e.params.counterparty,g=BigInt(Math.floor(Math.random()*4294967295)),h=De({vaultPda:r,sellerUrl:x,nonce:g}),E=(0,Un.bytesToHex)(h),V=e.swigAddress;if(!V){let y=await(0,Mn.readVaultFull)(l,r);if(!y.exists||!y.swigAddress)throw new Error(`tab_vault_unreadable: vault ${r.toBase58()} has no readable swig_address on chain \u2014 pass options.swigAddress explicitly`);V=y.swigAddress}let j={channelId:E,maxAmountAtomic:e.params.maxAmountAtomic,revolvingCapacityAtomic:e.params.maxRevolvingCapacityAtomic,expiresAtUnix:e.params.expiresAtUnix,allowedCounterparty:e.params.counterparty},$=Ct({publicKey:u.publicKey,privateKey:u.secretKey},j,b),[P]=(0,We.deriveSessionPda)(r,o,n),k={network:ln,swigAddress:V,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(y,v)=>{if(!c)return Nt(y,v,h);let S=kt({programId:n.toBase58(),vaultPda:r.toBase58(),sessionPda:P.toBase58(),seller:o.toBase58(),sessionNonce:e.params.nonce,channelId:v.channelId,cumulativeAmountAtomic:v.cumulativeAmount,sequenceOrdinal:v.sequenceNumber,sessionPrivateKey:y.privateKey,sessionPublicKey:y.publicKey,sessionRegistration:y.registration});return{payload:{channelId:S.channelId,cumulativeAmount:S.cumulativeAmount,sequenceNumber:S.sequenceNumber},sessionPublicKey:Uint8Array.from(Buffer.from(S.sessionPublicKey,"hex")),sessionSignature:Uint8Array.from(Buffer.from(S.sessionSignature,"hex")),sessionRegistration:Uint8Array.from(Buffer.from(S.sessionRegistration,"hex"))}},signOpenTab:async y=>y.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?(y,v)=>On(l,y,v):void 0};return new it({vault:k,network:ln,seller:x,counterparty:e.params.counterparty,session:$,channelIdHex:E,channelIdBytes:h,perUnitCapAtomic:i,totalCapAtomic:s,expiresAtUnix:e.params.expiresAtUnix,facilitatorUrl:t,initialCumulativeAtomic:T,initialSequenceOrdinal:c&&d.session.lastLockedSequence!==0?(0,Dn.voucherV2SequenceOrdinal)(d.session.lastLockedSequence):0,beforeVoucherRelease:c?async({voucher:y,incrementAtomic:v,previousCumulativeAtomic:S})=>{let _=Me(y),N={network:ln,programId:n.toBase58(),buyerSwigAddress:V,vaultPda:r.toBase58(),sessionPda:P.toBase58(),seller:o.toBase58(),channelId:E,sessionNonce:e.params.nonce,reservationAmountAtomic:v,previousCumulativeAtomic:S,..._,voucher:y},C=await e.reserveFinalVoucherV2(N);return ie(N,C),await k.verifyFinalVoucherV2Reservation(N,C),C}:void 0,closeMode:"settle-only"})}function Mr(e){if(e.length===64)return qe.default.sign.keyPair.fromSecretKey(e);if(e.length===32)return qe.default.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 Bn(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}var Ln=require("@solana/web3.js");var Fn=[{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"}],Kr=new Map(Fn.map(e=>[e.caip2.toLowerCase(),e])),Fr=new Map(Fn.map(e=>[e.bare.toLowerCase(),e]));function we(e){if(!e)return null;let t=e.toLowerCase(),n=Kr.get(t)||Fr.get(t);return n?{caip2:n.caip2,bare:n.bare,family:n.family}:null}function mn(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 Lr(e){let t=[];for(let n of e){if(!n||typeof n!="object")continue;let r=n,o=we(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 Lt(e){let t=e.headers.get("payment-required");if(!t)return null;let n;try{n=mn(t)}catch{return null}let r=Array.isArray(n.accepts)?n.accepts:[];return r.length===0?null:{x402Version:2,options:Lr(r),extensions:n.extensions&&typeof n.extensions=="object"&&!Array.isArray(n.extensions)?n.extensions:void 0,resourceUrl:n.resource&&typeof n.resource=="object"?String(n.resource.url??""):void 0}}async function He(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 i=await Lt(o);if(!i)return{kind:"error",detail:"the 402 carries no x402 v2 PAYMENT-REQUIRED challenge"};let s=i.options.find(a=>a.scheme==="tab"&&a.network.family==="svm");if(!s)return{kind:"no_tab",schemesOffered:i.options.map(a=>a.scheme)};try{new Ln.PublicKey(s.payTo)}catch{return{kind:"error",detail:`tab option payTo is not a valid Solana pubkey: "${s.payTo}"`}}return{kind:"offer",offer:{payTo:s.payTo,amountAtomic:s.amount,asset:s.asset,networkCaip2:s.network.caip2,...typeof s.extra?.voucherHeader=="string"?{voucherHeader:s.extra.voucherHeader}:{},...typeof s.extra?.registrationEncoding=="string"?{registrationEncoding:s.extra.registrationEncoding}:{},...typeof s.extra?.termsVersion=="string"?{termsVersion:s.extra.termsVersion}:{},...typeof s.extra?.acceptanceRule=="string"?{acceptanceRule:s.extra.acceptanceRule}:{},resourceUrl:i.resourceUrl}}}var $n="dexter-tab-hosted-pay-before-delivery/v1",qn="pay_before_delivery_seller_2xx",Wn="x-tab-voucher",Hn="base64(188-byte sessionRegisterMessage)";var ut="solana:5eykt4UsFv8P8NJdTREpY1vzqKqZKvdp",$t="solana:EtWTRABZaYq6iMfeYKouRu166VU2xqa1",qt="solana:4uhcVJyU9pJkvQyS88uRDiswHXSCkY3z",_e=ut,lt=$t,mt=qt,xe="eip155:8453",je="eip155:84532",ze="eip155:42161",Ge="eip155:137",Xe="eip155:10",Je="eip155:43114",Ye="eip155:56",Re="eip155:480",Te="eip155:143",Ee="eip155:4663",Pe="eip155:1187947933",Ie="eip155:324705682",Ze="eip155:1",Ve=xe,Wt=je,dt=ze,pt=Ge,ft=Xe,gt=Je,ht=Ye,yt=Re,At=Te,bt=Ee,vt=Pe,St=Ie,wt=Ze,_t="EPjFWdd5AufqSSqeM2qN1xzybapC8G4wEGGkZwyTDt1v",jn="4zMMC9srt5Ri5X14GAgXhaHii3GnPAEERYPJgZJDncDU",zn="0x833589fCD6eDb6E08f4c7C32D4f71b54bdA02913",dn="0x55d398326f99059fF775485246999027B3197955",Ht="0x8AC76a51cc950d9822D68b83fE1Ad97B32Cd580d",pn="0x5fc5360D0400a0Fd4f2af552ADD042D716F1d168",jt={[Ye]:Ht,[xe]:zn,[je]:"0x036CbD53842c5426634e7929541eC2318f3dCF7e",[ze]:"0xaf88d065e77c8cC2239327C5EDb3A432268e5831",[Ge]:"0x3c499c542cEF5E3811e1192ce70d8cC03d5c3359",[Xe]:"0x0b2C639c533813f4Aa9D7837CAf62653d097Ff85",[Je]:"0xB97EF9Ef8734C71904D8002F8b6Bc66Dd9c48a6E",[Re]:"0x79A02482A880bCE3F13e09Da970dC34db4CD24d1",[Te]:"0x754704Bc059F8C67012fEd69BC8A327a5aafb603",[Ee]:pn,[Pe]:"0x85889c8c714505E0c94b30fcfcF64fE3Ac8FCb20",[Ie]:"0x2e08028E3C4c2356572E096d8EF835cD5C6030bD",[Ze]:"0xA0b86991c6218b36c1d19D4a2e9Eb0cE3606eB48"},zt={[dn]:{symbol:"USDT",decimals:18},[Ht]:{symbol:"USDC",decimals:18}};var Gt={[Re]:{name:"USDC",version:"2"},[Te]:{name:"USDC",version:"2"},[Ee]:{name:"Global Dollar",version:"1"},[Pe]:{name:"Bridged USDC (SKALE Bridge)",version:"2"},[Ie]:{name:"Bridged USDC (SKALE Bridge)",version:"2"}},me="0x000000000022D473030F116dDEE9F6B43aC78BA3",xt="0x402085c248EeA27D92E8b30b2C58ed07f9E20001",Rt={[Ye]:56,[xe]:8453,[je]:84532,[ze]:42161,[Ge]:137,[Xe]:10,[Je]:43114,[Re]:480,[Te]:143,[Ee]:4663,[Pe]:1187947933,[Ie]:324705682,[Ze]:1},Ce={[ut]:"https://api.dexter.cash/api/solana/rpc",[$t]:"https://api.devnet.solana.com",[qt]:"https://api.testnet.solana.com"},F={[Ye]:"https://api.dexter.cash/api/evm/bsc/rpc",[xe]:"https://api.dexter.cash/api/base/rpc",[je]:"https://sepolia.base.org",[ze]:"https://api.dexter.cash/api/evm/arbitrum/rpc",[Ge]:"https://api.dexter.cash/api/evm/polygon/rpc",[Xe]:"https://api.dexter.cash/api/evm/optimism/rpc",[Je]:"https://api.dexter.cash/api/evm/avalanche/rpc",[Re]:"https://worldchain-mainnet.g.alchemy.com/public",[Te]:"https://rpc.monad.xyz",[Ee]:"https://rpc.mainnet.chain.robinhood.com",[Pe]:"https://skale-base.skalenodes.com/v1/base",[Ie]:"https://base-sepolia-testnet.skalenodes.com/v1/jubilant-horrible-ancha",[Ze]:"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)}};function Q(e,t){let n=e.scheme??"exact";if(n!=="exact"&&!(t==="evm"&&n==="exact-approval"))return`Unsupported payment scheme: ${n}`;let r=e.extra?.paymentFlow;if(r!==void 0&&r!=="authorization")return`Unsupported payment flow: ${String(r)}`;let o=e.extra?.assetTransferMethod;if(o!==void 0&&(typeof o!="string"||!(n==="exact-approval"?[]:t==="evm"?["eip3009","permit2"]:["default"]).includes(o)))return`Unsupported payment asset transfer method: ${String(o)}`}function Tt(e){let t=e?.["payment-identifier"];if(!t||typeof t!="object"||Array.isArray(t))return!1;let n=t.info;return!!n&&typeof n=="object"&&!Array.isArray(n)&&n.required===!0}var D=require("@solana/web3.js"),K=require("@solana/spl-token");var $r=12e3,qr=1;function Ne(e){if(!e||typeof e!="object")return!1;let t=e;return"publicKey"in t&&"signTransaction"in t&&typeof t.signTransaction=="function"}var Xt=class{name="Solana";networks=[_e,lt,mt];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]:Ce[t]?Ce[t]:t==="solana"?Ce[_e]:t==="solana-devnet"?Ce[lt]:t==="solana-testnet"?Ce[mt]:Ce[_e]}getAddress(t){return Ne(t)?t.publicKey?.toBase58()??null:null}isConnected(t){return Ne(t)?t.publicKey!==null:!1}async getBalance(t,n,r){if(!Ne(n)||!n.publicKey)return 0;let o=r||this.getDefaultRpcUrl(t.network),i=new D.Connection(o,"confirmed"),s=new D.PublicKey(n.publicKey.toBase58()),a=new D.PublicKey(t.asset);try{let u=(await i.getAccountInfo(a,"confirmed"))?.owner.toBase58()===K.TOKEN_2022_PROGRAM_ID.toBase58()?K.TOKEN_2022_PROGRAM_ID:K.TOKEN_PROGRAM_ID,m=await(0,K.getAssociatedTokenAddress)(a,s,!1,u),p=await(0,K.getAccount)(i,m,void 0,u),f=t.extra?.decimals??6;return Number(p.amount)/Math.pow(10,f)}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){let o=Q(t,"svm");if(o)throw new Error(o);if(!Ne(n))throw new Error("Invalid Solana wallet");if(!n.publicKey)throw new Error("Wallet not connected");let i=r||this.getDefaultRpcUrl(t.network),s=new D.Connection(i,"confirmed"),a=new D.PublicKey(n.publicKey.toBase58()),{payTo:c,asset:u,extra:m}=t,p=t.amount??t.maxAmountRequired;if(!p)throw new Error("Missing amount in payment requirements");if(!m?.feePayer)throw new Error("Missing feePayer in payment requirements");let f=new D.PublicKey(m.feePayer),b=new D.PublicKey(u),l=new D.PublicKey(c);this.log("Building transaction:",{from:a.toBase58(),to:c,amount:p,asset:u,feePayer:m.feePayer});let d=[];d.push(D.ComputeBudgetProgram.setComputeUnitLimit({units:$r})),d.push(D.ComputeBudgetProgram.setComputeUnitPrice({microLamports:qr}));let T=await s.getAccountInfo(b,"confirmed");if(!T)throw new Error(`Token mint ${u} not found`);let x=T.owner.toBase58()===K.TOKEN_2022_PROGRAM_ID.toBase58()?K.TOKEN_2022_PROGRAM_ID:K.TOKEN_PROGRAM_ID,g=await(0,K.getMint)(s,b,void 0,x);typeof m?.decimals=="number"&&g.decimals!==m.decimals&&this.log(`Decimals mismatch: requirements say ${m.decimals}, mint says ${g.decimals}`);let h=await(0,K.getAssociatedTokenAddress)(b,a,!1,x),E=await(0,K.getAssociatedTokenAddress)(b,l,!0,x);if(!await s.getAccountInfo(h,"confirmed"))throw new Error(`No token account found for ${u}. Please ensure you have USDC in your wallet.`);if(!await s.getAccountInfo(E,"confirmed"))throw new Error(`Seller token account not found. The seller (${c}) must have a USDC account.`);let $=BigInt(p);d.push((0,K.createTransferCheckedInstruction)(h,b,E,a,$,g.decimals,[],x));let{blockhash:P}=await s.getLatestBlockhash("confirmed"),k=new D.TransactionMessage({payerKey:f,recentBlockhash:P,instructions:d}).compileToV0Message(),y=new D.VersionedTransaction(k),v=await n.signTransaction(y);return this.log("Transaction signed successfully"),{serialized:Buffer.from(v.serialize()).toString("base64"),settlementProbe:{kind:"solana",sourceAta:h.toBase58(),destinationAta:E.toBase58(),asset:u,amount:p,blockhash:P}}}async confirmSettlement(t,n){if(t.kind!=="solana")throw new Error(`SolanaAdapter.confirmSettlement cannot handle probe kind "${t.kind}"`);let r=new D.Connection(n,"confirmed"),o=new D.PublicKey(t.destinationAta),i=await r.getSignaturesForAddress(o,{limit:25});if(i.length===0)return{settled:!1};let s=BigInt(t.amount);for(let a of i){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(),m=c.meta.preTokenBalances??[],p=c.meta.postTokenBalances??[];for(let f of p){if(f.mint!==t.asset)continue;let b=u[f.accountIndex];if(!b||!b.equals(o))continue;let l=m.find(x=>x.accountIndex===f.accountIndex),d=BigInt(l?.uiTokenAmount.amount??"0");if(BigInt(f.uiTokenAmount.amount??"0")-d===s)return{settled:!0,txSignature:a.signature}}}return{settled:!1}}};function de(e){return new Xt(e)}var Wr={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"}]},Gn=BigInt("0xffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff");function ke(e){if(!e||typeof e!="object")return!1;let t=e;return"address"in t&&typeof t.address=="string"&&t.address.startsWith("0x")}var Jt=class{name="EVM";networks=[ht,Ve,Wt,wt,dt,pt,ft,gt,yt,At,bt,vt,St];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]:F[t]?F[t]:t==="base"?F[Ve]:t==="bsc"?F[ht]:t==="ethereum"?F[wt]:t==="arbitrum"?F[dt]:t==="polygon"?F[pt]:t==="optimism"?F[ft]:t==="avalanche"?F[gt]:t==="world"?F[yt]:t==="monad"?F[At]:t==="robinhood"?F[bt]:t==="skale-base"?F[vt]:t==="skale-base-sepolia"?F[St]:F[Ve]}getAddress(t){return ke(t)?t.address:null}isConnected(t){return ke(t)?!!t.address:!1}getChainId(t){if(Rt[t])return Rt[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(!ke(n)||!n.address)return 0;let o=r||this.getDefaultRpcUrl(t.network);try{let i=this.encodeBalanceOf(n.address),s=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:i},"latest"]})});if(!s.ok)throw new Error(`RPC request failed: ${s.status}`);let a=await s.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(i){throw i}}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"),i=t.nonce.slice(2).toLowerCase().padStart(64,"0"),s=r+o+i,a=await this.ethCall(n,t.asset,s);return{settled:BigInt(a)!==0n}}if(t.kind==="permit2"){let r="0x4fe02b44",o=BigInt(t.nonce),i=o>>8n,s=o&0xffn,a=t.from.slice(2).toLowerCase().padStart(64,"0"),c=i.toString(16).padStart(64,"0"),u=r+a+c,m=await this.ethCall(n,me,u);return{settled:(BigInt(m)>>s&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 i=await o.json();if(i.error)throw new Error(`RPC error: ${JSON.stringify(i.error)}`);if(!i.result||i.result==="0x")throw new Error("RPC returned an empty result");return i.result}async buildTransaction(t,n,r){let o=Q(t,"evm");if(o)throw new Error(o);if(!ke(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:i,asset:s,extra:a}=t,c=t.amount??t.maxAmountRequired;if(!c)throw new Error("Missing amount in payment requirements");this.log("Building EVM transaction:",{from:n.address,to:i,amount:c,asset:s,network:t.network});let u=this.getChainId(t.network),m=Gt[`eip155:${u}`],p={name:a?.name??m?.name??"USD Coin",version:a?.version??m?.version??"2",chainId:BigInt(u),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"}]},b=new Uint8Array(32);(globalThis.crypto??(await import("crypto")).webcrypto).getRandomValues(b);let l="0x"+[...b].map(E=>E.toString(16).padStart(2,"0")).join(""),d=Math.floor(Date.now()/1e3),T={from:n.address,to:i,value:c,validAfter:String(d-600),validBefore:String(d+(t.maxTimeoutSeconds||60)),nonce:l},x={from:n.address,to:i,value:BigInt(c),validAfter:BigInt(d-600),validBefore:BigInt(d+(t.maxTimeoutSeconds||60)),nonce:l};if(!n.signTypedData)throw new Error("Wallet does not support signTypedData (EIP-712)");let g=await n.signTypedData({domain:p,types:f,primaryType:"TransferWithAuthorization",message:x});return this.log("EIP-712 signature obtained"),{serialized:JSON.stringify({authorization:T,signature:g}),signature:g,settlementProbe:{kind:"eip3009",from:n.address,nonce:l,asset:s,chainId:u}}}async buildApprovalTransaction(t,n,r){let{payTo:o,asset:i,extra:s}=t,a=t.amount??t.maxAmountRequired;if(!a)throw new Error("Missing amount in payment requirements");let c=s?.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:i,network:t.network,facilitatorContract:c});let u=r||this.getDefaultRpcUrl(t.network),m=s?.fee??"0",p=BigInt(a)+BigInt(m),f=await this.readAllowance(u,i,n.address,c);if(f<p){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 k=this.calculateApprovalAmount(a,m,s?.approvalStrategy);this.log(`Approving ${k} for ${c} (current allowance: ${f})`);let y=await n.sendTransaction({to:i,data:this.encodeApprove(c,k),value:0n});this.log(`Approval tx sent: ${y}`),await this.waitForReceipt(u,y),this.log("Approval confirmed")}else this.log("Sufficient allowance, skipping approval");let b=new Uint8Array(16);(globalThis.crypto??(await import("crypto")).webcrypto).getRandomValues(b);let l=[...b].reduce((k,y)=>k*256n+BigInt(y),0n).toString(),d=new Uint8Array(32);(globalThis.crypto??(await import("crypto")).webcrypto).getRandomValues(d);let T="0x"+[...d].map(k=>k.toString(16).padStart(2,"0")).join(""),g=Math.floor(Date.now()/1e3)+(t.maxTimeoutSeconds||300),h=s?.eip712Domain,E=h?{name:h.name,version:h.version,chainId:BigInt(h.chainId),verifyingContract:h.verifyingContract}:{name:"DexterBSCFacilitator",version:"1",chainId:BigInt(this.getChainId(t.network)),verifyingContract:c},V=s?.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"}]},j={from:n.address,to:o,token:i,amount:BigInt(a),fee:BigInt(m),nonce:BigInt(l),deadline:BigInt(g),paymentId:T},$=await n.signTypedData({domain:E,types:V,primaryType:"Payment",message:j});this.log("EIP-712 Payment signature obtained");let P={from:n.address,to:o,token:i,amount:a,fee:m,nonce:l,deadline:g,paymentId:T,signature:$};return{serialized:JSON.stringify(P),signature:$}}async buildPermit2Transaction(t,n,r){let{payTo:o,asset:i}=t,s=t.amount??t.maxAmountRequired;if(!s)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:s,asset:i,network:t.network});let a=r||this.getDefaultRpcUrl(t.network),c=await this.readAllowance(a,i,n.address,me),u;if(c<BigInt(s)){let E=this.encodeApprove(me,Gn);if(n.signTransaction){this.log(`Signing Permit2 approval for relay (current allowance: ${c})`);let V=this.getChainId(t.network),j=await this.readGasPrice(a),$=await this.readNonce(a,n.address),P=await n.signTransaction({to:i,data:E,chainId:V,gas:50000n,gasPrice:j,nonce:$});u={erc20ApprovalGasSponsoring:{info:{from:n.address,asset:i,spender:me,amount:Gn.toString(),signedTransaction:P,version:"1"}}},this.log("Permit2 approval signed for facilitator relay")}else if(n.sendTransaction){this.log(`Approving Permit2 directly (current allowance: ${c})`);let V=await n.sendTransaction({to:i,data:E,value:0n});this.log(`Permit2 approval tx sent: ${V}`),await this.waitForReceipt(a,V),this.log("Permit2 approval confirmed")}else throw new Error("Permit2 payments require a wallet that supports signTransaction or sendTransaction for the one-time Permit2 approval. Use createEvmKeypairWallet() or a browser wallet with transaction support.")}else this.log("Sufficient Permit2 allowance, skipping approval");let m=new Uint8Array(32);(globalThis.crypto??(await import("crypto")).webcrypto).getRandomValues(m);let p=[...m].reduce((E,V)=>E*256n+BigInt(V),0n),f=Math.floor(Date.now()/1e3),b=f-600,l=f+(t.maxTimeoutSeconds||300),d=this.getChainId(t.network),T={name:"Permit2",chainId:BigInt(d),verifyingContract:me},x={permitted:{token:i,amount:BigInt(s)},spender:xt,nonce:p,deadline:BigInt(l),witness:{to:o,validAfter:BigInt(b)}},g=await n.signTypedData({domain:T,types:Wr,primaryType:"PermitWitnessTransferFrom",message:x});this.log("Permit2 PermitWitnessTransferFrom signature obtained");let h={signature:g,permit2Authorization:{from:n.address,permitted:{token:i,amount:s},spender:xt,nonce:p.toString(),deadline:String(l),witness:{to:o,validAfter:String(b)}}};return{serialized:JSON.stringify(h),signature:g,extensions:u,settlementProbe:{kind:"permit2",from:n.address,nonce:p.toString(),chainId:d}}}async readAllowance(t,n,r,o){let i="0xdd62ed3e",s=r.slice(2).toLowerCase().padStart(64,"0"),a=o.slice(2).toLowerCase().padStart(64,"0"),c=i+s+a;try{let m=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 m.error||!m.result||m.result==="0x"?0n:BigInt(m.result)}catch{return 0n}}encodeApprove(t,n){let r="0x095ea7b3",o=t.slice(2).toLowerCase().padStart(64,"0"),i=n.toString(16).padStart(64,"0");return r+o+i}async waitForReceipt(t,n,r=3e4){let o=Date.now();for(;Date.now()-o<r;){try{let s=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(s.result){if(s.result.status==="0x0")throw new Error(`Approval transaction reverted: ${n}`);return}}catch(i){if(i instanceof Error&&i.message.includes("reverted"))throw i}await new Promise(i=>setTimeout(i,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 i=BigInt(r.defaultMultiple??10),s=o*i;if(r.maxCapUsd){let a=this.inferDecimals(t),c=BigInt(Math.floor(r.maxCapUsd*Math.pow(10,a)));if(s>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 s}inferDecimals(t){return t.length>12?18:6}};function Qe(e){return new Jt(e)}function fn(e){if(e===_t||e===jn)return!0;let t=e.toLowerCase();for(let n of Object.values(jt))if(n.toLowerCase()===t)return!0;for(let n of Object.keys(zt))if(n.toLowerCase()===t)return!0;return!1}function Hr(e){return{[ut]:"Solana",[$t]:"Solana Devnet",[qt]:"Solana Testnet",solana:"Solana","solana-devnet":"Solana Devnet","solana-testnet":"Solana Testnet",[xe]:"Base",[je]:"Base Sepolia",[Ze]:"Ethereum",[ze]:"Arbitrum",[Ge]:"Polygon",[Xe]:"Optimism",[Je]:"Avalanche",[Ye]:"BSC",[Re]:"World Chain",[Te]:"Monad",[Ee]:"Robinhood Chain",[Pe]:"SKALE Base",[Ie]:"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 Xn(e,t){let n=Hr(e);return n===e?t:n}async function jr(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((s,a)=>r.set(a,s));let o={method:t?.method??n.method,headers:r,signal:t?.signal??n.signal,redirect:t?.redirect??n.redirect,credentials:t?.credentials??n.credentials},i=(o.method??"GET").toUpperCase();return t&&"body"in t?o.body=t.body:i!=="GET"&&i!=="HEAD"&&n.body&&(o.body=await n.arrayBuffer()),[n.url,o]}var Jn=new WeakMap;function Yn(e){return Jn.get(e)}function zr(e,t){let n=e.headers.get("PAYMENT-RESPONSE"),r;if(n)try{let a=mn(n);a&&typeof a=="object"&&!Array.isArray(a)&&(r={...a})}catch{}r??={},r.settlementStatus="unconfirmed";let o=r.network===t.network,i=[r.errorReason,r.errorCode,r.errorMessage].every(a=>a===void 0||typeof a=="string"),s=[r.errorReason,r.errorCode].filter(a=>typeof a=="string"&&a.length>0);return s.some(a=>/pending|unknown|unconfirmed|timeout|temporar/i.test(a))?r.settlementStatus="pending":r.success===!0&&o&&i&&s.length===0&&typeof r.transaction=="string"&&r.transaction.trim().length>0?r.settlementStatus="settled":r.success===!1&&(o||r.network===void 0)&&s.length>0&&(r.settlementStatus="failed"),r.attemptedAmountAtomic=t.amountAtomic,r.settlementStatus==="settled"?r.amountAtomic=t.amountAtomic:delete r.amountAtomic,r.assetDecimals=t.assetDecimals,Jn.set(e,r),r}function Zn(e){let{adapters:t=[de({verbose:e.verbose}),Qe({verbose:e.verbose})],wallets:n,wallet:r,preferredNetwork:o,rpcUrls:i={},maxAmountAtomic:s,fetch:a=globalThis.fetch,verbose:c=!1,accessPass:u,onPaymentRequired:m,onPaymentDispatched:p,maxRetries:f=0,retryDelayMs:b=500}=e,l=c?console.log.bind(console,"[x402]"):()=>{};async function d(y,v){let S;for(let _=0;_<=f;_++)try{let N=await a(y,v);if(N.status>=502&&N.status<=504&&_<f){l(`Retry ${_+1}/${f}: server returned ${N.status}`),await new Promise(C=>setTimeout(C,b*Math.pow(2,_)));continue}return N}catch(N){S=N,_<f&&(l(`Retry ${_+1}/${f}: ${N instanceof Error?N.message:"network error"}`),await new Promise(C=>setTimeout(C,b*Math.pow(2,_))))}throw S}let T=new Map;function x(y){try{let v=new URL(y).host,S=T.get(v);if(S&&S.expiresAt>Date.now()/1e3+10)return S.jwt;S&&T.delete(v)}catch{}return null}function g(y,v){try{let S=new URL(y).host,_=v.split(".");if(_.length===3){let N=JSON.parse(atob(_[1].replace(/-/g,"+").replace(/_/g,"/"))),C=Math.floor(Date.now()/1e3),O=C+86400,z=Math.min(typeof N.exp=="number"?N.exp:C,O);T.set(S,{jwt:v,expiresAt:z}),l("Access pass cached for",S,"| expires:",new Date(z*1e3).toISOString())}}catch{l("Failed to cache access pass")}}let h=n||{};r&&!h.solana&&Ne(r)&&(h.solana=r),r&&!h.evm&&ke(r)&&(h.evm=r);function E(y){let v=[];for(let S of y){let _=t.find(O=>O.canHandle(S.network));if(!_)continue;let N=_.name==="Solana"?"svm":"evm";if(Q(S,N))continue;let C;_.name==="Solana"?C=h.solana:_.name==="EVM"&&(C=h.evm),C&&_.isConnected(C)&&v.push({accept:S,adapter:_,wallet:C})}if(v.length===0)return null;if(o){let S=v.find(_=>_.accept.network===o);if(S)return S}return v[0]}function V(y,v){return Xn(y,v)}function j(y,v){return i[y]||v.getDefaultRpcUrl(y)}async function $(y,v,S,_,N){let C="";if(u?.preferTier&&_.tiers){let w=_.tiers.find(X=>X.id===u.preferTier);if(w){if(u.maxSpend&&parseFloat(w.price)>parseFloat(u.maxSpend))throw new B("access_pass_exceeds_max_spend",`Access pass tier "${w.id}" costs $${w.price}, exceeds max spend $${u.maxSpend}`);C=`tier=${w.id}`}}else if(u?.preferDuration&&_.ratePerHour)C=`duration=${u.preferDuration}`;else if(_.tiers&&_.tiers.length>0){let w=_.tiers[0];if(u?.maxSpend&&parseFloat(w.price)>parseFloat(u.maxSpend))throw new B("access_pass_exceeds_max_spend",`Cheapest access pass costs $${w.price}, exceeds max spend $${u?.maxSpend}`);C=`tier=${w.id}`}let O=C?N.includes("?")?`${N}&${C}`:`${N}?${C}`:N;l("Purchasing access pass:",C||"default tier");let z=S.headers.get("PAYMENT-REQUIRED");if(!z)return null;let W;try{W=JSON.parse(atob(z))}catch{return null}let M=E(W.accepts);if(!M)return null;if(Tt(W.extensions))throw new B("unsupported_required_payment_identifier","Required payment identifiers are not supported by this client");let{accept:U,adapter:G,wallet:Oe}=M;if(G.name==="Solana"&&!U.extra?.feePayer)return null;let te=U.extra?.decimals??(fn(U.asset)?6:void 0);if(typeof te!="number")return null;let et=U.amount??U.maxAmountRequired;if(!et)return null;let ne=j(U.network,G);try{let w=await G.getBalance(U,Oe,ne),X=Number(et)/Math.pow(10,te);if(w<X){let cr=V(U.network,G.name);throw new B("insufficient_balance",`Insufficient balance for access pass on ${cr}. Have $${w.toFixed(4)}, need $${X.toFixed(4)}`)}}catch(w){if(w instanceof B)throw w}let re=await G.buildTransaction(U,Oe,ne),Be;G.name==="EVM"?Be=JSON.parse(re.serialized):Be={transaction:re.serialized};let pe=typeof y=="string"?y:y instanceof URL?y.href:y.url,Ue=W.resource;if(typeof W.resource=="string")try{let w=new URL(W.resource,pe);["http:","https:"].includes(w.protocol)&&(Ue=w.toString())}catch{}else if(W.resource&&typeof W.resource=="object"&&"url"in W.resource){let w=W.resource;try{let X=new URL(w.url,pe);["http:","https:"].includes(X.protocol)&&(Ue={...w,url:X.toString()})}catch{}}let Pt={x402Version:U.x402Version??2,resource:Ue,accepted:U,payload:Be};re.extensions&&(Pt.extensions=re.extensions);let tt=btoa(JSON.stringify(Pt)),fe=await a(O,{...v,method:"POST",headers:{...v?.headers||{},"Content-Type":"application/json","PAYMENT-SIGNATURE":tt}});if(!fe.ok)return l("Pass purchase failed:",fe.status),null;let I=fe.headers.get("ACCESS-PASS");return I&&(g(N,I),l("Access pass purchased and cached")),fe}async function P(y,v){let S=y;if(l("Making request:",S),u){let I=x(S);if(I){l("Using cached access pass");let w=await a(y,{...v,headers:{...v?.headers||{},Authorization:`Bearer ${I}`}});if(w.status!==401&&w.status!==402)return w;l("Cached pass rejected (status",w.status,"), purchasing new pass");try{T.delete(new URL(S).host)}catch{}}}let _=await d(y,v);if(_.status!==402)return _;l("Received 402 Payment Required");let N=_.headers.get("X-ACCESS-PASS-TIERS");if(u&&N){l("Server offers access passes, purchasing...");try{let I=JSON.parse(atob(N)),w=await $(y,v,_,I,S);if(w)return w}catch(I){l("Access pass purchase failed, falling back to per-request payment:",I)}}let C=_.headers.get("PAYMENT-REQUIRED");if(!C)throw new B("missing_payment_required_header","Server returned 402 but no PAYMENT-REQUIRED header");let O;try{let I=atob(C);O=JSON.parse(I)}catch{throw new B("invalid_payment_required","Failed to decode PAYMENT-REQUIRED header")}if(l("Payment requirements:",O),Tt(O.extensions))throw new B("unsupported_required_payment_identifier","Required payment identifiers are not supported by this client");let z=_.headers.get("X-Quote-Hash");z&&l("Quote hash received:",z);let W=E(O.accepts);if(!W){let I=O.accepts.map(w=>w.network).join(", ");throw new B("no_matching_payment_option",`No supported payment option with a connected wallet for: ${I}`)}let{accept:M,adapter:U,wallet:G}=W;if(l(`Using ${U.name} for ${M.network}`),U.name==="Solana"&&!M.extra?.feePayer)throw new B("missing_fee_payer","Solana payment option missing feePayer in extra");let Oe=M.extra?.decimals??(fn(M.asset)?6:void 0);if(typeof Oe!="number")throw new B("missing_decimals","Payment option missing decimals - provide in extra or use a known stablecoin");let te=M.amount??M.maxAmountRequired;if(!te)throw new B("missing_amount","Payment option missing amount");if(s&&BigInt(te)>BigInt(s))throw new B("amount_exceeds_max",`Payment amount ${te} exceeds maximum ${s}`);let et=j(M.network,U);l("Checking balance...");try{let I=await U.getBalance(M,G,et),w=Number(te)/Math.pow(10,Oe);if(I<w){let X=V(M.network,U.name);throw new B("insufficient_balance",`Insufficient balance on ${X}. Have $${I.toFixed(4)}, need $${w.toFixed(4)}`)}l(`Balance OK: $${I.toFixed(4)} >= $${w.toFixed(4)}`)}catch(I){if(I instanceof B)throw I;l("Balance check failed (RPC error), proceeding with transaction attempt")}if(m&&!await m(M))throw new B("payment_rejected","Payment rejected by onPaymentRequired callback");l("Building transaction...");let ne=await U.buildTransaction(M,G,et);l("Transaction signed");let re;U.name==="EVM"?re=JSON.parse(ne.serialized):re={transaction:ne.serialized};let Be=y,pe=O.resource;if(typeof O.resource=="string")try{let I=new URL(O.resource,Be).toString();I!==O.resource&&l("Resolved relative resource URL:",O.resource,"\u2192",I),pe=I}catch{pe=O.resource}else if(O.resource&&typeof O.resource=="object"&&"url"in O.resource){let I=O.resource;try{let w=new URL(I.url,Be).toString();w!==I.url&&(l("Resolved relative resource URL:",I.url,"\u2192",w),pe={...I,url:w})}catch{}}let Ue={x402Version:M.x402Version??2,resource:pe,accepted:M,payload:re};ne.extensions&&(Ue.extensions=ne.extensions);let Pt=btoa(JSON.stringify(Ue));if(p)try{p(M,ne.settlementProbe)}catch{}l("Retrying request with payment...");let tt=await d(y,{...v,headers:{...v?.headers||{},"PAYMENT-SIGNATURE":Pt,...z?{"X-Quote-Hash":z}:{}}});l("Retry response status:",tt.status);let fe=zr(tt,{network:M.network,amountAtomic:te,assetDecimals:Oe});return fe.extensions&&l("Settlement extensions:",Object.keys(fe.extensions).join(", ")),tt}async function k(y,v){let[S,_]=await jr(y,v);return P(S,_)}return{fetch:k}}function ee(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 Et(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 i=JSON.parse(t),s=[i.error,i.detail,i.message].filter(a=>typeof a=="string"&&a.length>0);s.length>0&&(o=s.join(" \u2014 "))}catch{}return o||(o=`HTTP ${e.status}`),{reason:r?"settlement_failed":"merchant_rejected",detail:`merchant HTTP ${e.status}: ${o}`}}var Yt="Payment authorization was sent, but the merchant did not respond within the timeout. ",Zt=" Do not retry without checking \u2014 inspect the funding wallet for a transfer to the merchant before attempting payment again.";async function Qt(e,t,n){if(!e)return{confirmed:!1,detail:Yt+"This payment scheme has no on-chain confirmation check, so the SDK cannot verify whether it settled."+Zt};try{if(e.kind==="solana"){let s=de(),a=n??s.getDefaultRpcUrl(t.caip2);if(!s.confirmSettlement)return er();let c=await s.confirmSettlement(e,a);return c.settled?{confirmed:!0,txSignature:c.txSignature}:Qn()}let r=Qe(),o=r.getDefaultRpcUrl(t.caip2);if(!r.confirmSettlement)return er();let i=await r.confirmSettlement(e,o);return i.settled?{confirmed:!0,txSignature:i.txSignature}:Qn()}catch(r){return{confirmed:!1,detail:Yt+`On-chain confirmation could not be completed (${ee(r)}).`+Zt}}}function Qn(){return{confirmed:!1,detail:Yt+"On-chain confirmation found no matching settlement yet \u2014 the payment may still be pending, or may not have settled."+Zt}}function er(){return{confirmed:!1,detail:Yt+"The chain adapter does not support on-chain confirmation."+Zt}}async function Gr(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 i=new Headers(t.headers??void 0);i.set("X-Tab-Voucher",ct(o));let s={method:t.method??"GET",headers:i};t.signal&&(s.signal=t.signal),typeof t.body=="string"&&(s.body=t.body);let a;try{a=await fetch(e,s)}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 Et(a)}}var tr={version:2,async parseChallenge(e){return Lt(e)},async pay(e,t,n,r,o){if(Tt(n.extensions))return{ok:!1,reason:"no_payment_options",detail:"unsupported_required_payment_identifier"};if(o.tab){let g=n.options.find(h=>h.scheme==="tab"&&h.network.family==="svm"&&h.payTo===o.tab.counterparty);if(g){let h=await Gr(e,t,g,o.tab);if(h)return h}}let i=n.options.filter(g=>!Q(g,g.network.family));if(i.length===0)return{ok:!1,reason:"no_payment_options",detail:`no supported payment capability offered: ${n.options.map(g=>Q(g,g.network.family)).join("; ")}`};let s=i.find(g=>g.network.family==="evm"?!!r.evm:g.network.family==="svm"?!!r.solana:!1);if(!s)return{ok:!1,reason:"unsupported_network"};let a=o.timeoutMs??15e3,c=o.responseTimeoutMs??12e4,u=new AbortController,m=setTimeout(()=>u.abort(),a),p=!1,f,b,l=(g,h)=>{p=!0,b=g,f=h,clearTimeout(m),m=setTimeout(()=>u.abort(),c)},d=Zn({wallets:r,preferredNetwork:s.network.caip2,maxAmountAtomic:o.maxAmountAtomic,fetch:globalThis.fetch,onPaymentDispatched:l}),T=t.signal?AbortSignal.any([t.signal,u.signal]):u.signal,x={method:t.method??"GET",headers:t.headers,signal:T};typeof t.body=="string"&&(x.body=t.body);try{let g=await d.fetch(e,x);if(clearTimeout(m),!p)return g.ok?{ok:!0,paid:!1,response:g}:{ok:!1,response:g,...await Et(g)};let h=Yn(g),E=typeof h?.transaction=="string"?h.transaction:void 0;if(h?.settlementStatus!=="settled"){let V=h?.settlementStatus==="failed";return{ok:!1,reason:V?"settlement_failed":"payment_unconfirmed",detail:`${V?"Merchant reports settlement failure":"Settlement is unconfirmed"}${h?.errorReason||h?.errorCode?` (${h.errorReason??h.errorCode})`:""}. Recover or reconcile this same payment; do not create a new authorization.`,response:g,txSignature:E,paymentReceipt:h}}return g.ok?{ok:!0,paid:!0,response:g,amountPaid:b?.amount??b?.maxAmountRequired??s.amount,network:we(b?.network??"")??s.network,txSignature:E,paymentReceipt:h}:{ok:!1,reason:"delivery_failed",detail:`Payment settled, but the merchant returned HTTP ${g.status}. Recover the result for this same payment; do not create a new authorization.`,response:g,txSignature:E,paymentReceipt:h}}catch(g){clearTimeout(m);let h=g;if(h?.name==="AbortError"){if(!p)return{ok:!1,reason:"timeout"};let E=await Qt(f,s.network,o.solanaRpcUrl);return E.confirmed?{ok:!0,paid:!0,response:void 0,amountPaid:s.amount,network:s.network,txSignature:E.txSignature}:{ok:!1,reason:"payment_unconfirmed",detail:E.detail}}return p?{ok:!1,reason:"payment_unconfirmed",detail:`${h?.message??String(g)}. Recover or reconcile this same payment; do not create a new authorization.`}:{ok:!1,reason:"error",detail:h?.message??String(g)}}}};var nr=require("viem");var Xr={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 Jr(){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 Yr(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),i=String(r+(t.maxTimeoutSeconds??60)),s={from:e.address,to:t.payTo,value:t.amount,validAfter:o,validBefore:i,nonce:await Jr()},a=Rt[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:(0,nr.getAddress)(t.asset)},types:Xr,primaryType:"TransferWithAuthorization",message:s});return{payment:{x402Version:1,scheme:t.scheme,network:n,payload:{signature:u,authorization:s}},settlementProbe:{kind:"eip3009",from:s.from,nonce:s.nonce,asset:t.asset,chainId:a}}}async function gn(e,t,n){try{let r;for(let o of e.options){let i=o.network.family==="evm"&&!!t.evm||o.network.family==="svm"&&!!t.solana;if(o.scheme!=="exact"){i&&(r=o.scheme);continue}if(o.network.family==="evm"&&t.evm){let s=await t.evm;return await Zr(o,s,n)}if(o.network.family==="svm"&&t.solana){let s=await t.solana;return await Qr(o,s,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:ee(r)}}}async function Zr(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,i=r.version;if(typeof o!="string"||o.length===0||typeof i!="string"||i.length===0)return{ok:!1,reason:"merchant_rejected",detail:"v1 challenge missing exact-scheme EIP-712 domain (extra.name / extra.version)"};let s=e.network.bare,{payment:a,settlementProbe:c}=await Yr(t,e,s);return{ok:!0,headerValue:Buffer.from(JSON.stringify(a),"utf8").toString("base64"),option:e,settlementProbe:c}}async function Qr(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,i={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 de().buildTransaction(i,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 eo(e){let t=[];for(let n of e){if(!n||typeof n!="object")continue;let r=n,o=we(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 rr={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=eo(n);return r.length===0?null:{x402Version:1,options:r}},async pay(e,t,n,r,o){let i,s=new AbortController,a=!1,c,u;try{let m=o.timeoutMs??15e3;i=setTimeout(()=>s.abort(),m);let p=await gn(n,r,o);if(!p.ok)return{ok:!1,reason:p.reason,detail:p.detail};let f=p.headerValue,b=p.option;u=b,c=p.settlementProbe;let l=new Headers(t.headers??void 0);l.set("X-PAYMENT",f);let d=t.signal!=null?AbortSignal.any([t.signal,s.signal]):s.signal,T={method:t.method,headers:l,signal:d};typeof t.body=="string"&&(T.body=t.body),a=!0,clearTimeout(i);let x=o.responseTimeoutMs??12e4;i=setTimeout(()=>s.abort(),x);let g=await fetch(e,T);return g.ok?{ok:!0,paid:!0,response:g,amountPaid:b.amount,network:b.network,txSignature:to(g)}:{ok:!1,...await Et(g)}}catch(m){if(m instanceof Error&&m.name==="AbortError"){if(!a)return{ok:!1,reason:"timeout"};let p=await Qt(c,u.network,o.solanaRpcUrl);return p.confirmed?{ok:!0,paid:!0,response:void 0,amountPaid:u.amount,network:u.network,txSignature:p.txSignature}:{ok:!1,reason:"payment_unconfirmed",detail:p.detail}}return{ok:!1,reason:"error",detail:ee(m)}}finally{i!==void 0&&clearTimeout(i)}}};function to(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}}var sr=J(require("tweetnacl"),1);var hn=require("@solana/web3.js"),or=Symbol.for("x402:keypair");function yn(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[or];if(r&&r.secretKey&&r.publicKey)return{publicKey:r.publicKey,signMessage:async o=>sr.sign.detached(o,r.secretKey)}}return null}var no=[tr,rr];async function ro(e){let t=yn(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. ${ee(n)}`),fetch}}async function An(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 ro(n))(e,{...t})}catch(i){return{ok:!1,reason:"error",detail:ee(i)}}if(o.status!==402)return{ok:!0,paid:!1,response:o};for(let i of no){let s=await i.parseChallenge(o.clone());if(s)return i.pay(e,t,s,n,r)}return{ok:!1,reason:"no_payment_options"}}async function ir(e,t={},n){let r=await He(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,i=BigInt(ce(n.perUnitCap));if(BigInt(o.amountAtomic)>i)return{result:{ok:!1,reason:"budget_exceeded",detail:`seller quotes ${o.amountAtomic} atomic; perUnitCap allows ${i}`},tab:null};let s=n.tabs?.get(o.payTo);return(!s||!s.state.isOpen)&&(s=await Mt({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,s)),{result:await An(e,t,{},{tab:s}),tab:s}}function oo(e){return{counterparty:e.payTo,perRequest:{atomic:e.amountAtomic,human:ve(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 ar(e,t={},n={}){let r=n.cache?.get(e);if(r)return{kind:"terms",terms:r};let o=await He(e,t,n.fetchImpl??fetch);if(o.kind!=="offer")return o;if(o.offer.asset!==_t)return{kind:"error",detail:`tab offer asset is not USDC ("${o.offer.asset}"); refusing to render a human price`};let i=oo(o.offer);return n.cache?.set(e,i),{kind:"terms",terms:i}}0&&(module.exports={DEFAULT_FACILITATOR_URL,DEXTER_VAULT_PROGRAM_ID,FINAL_VOUCHER_V2_RESERVATION_BINDING_DOMAIN,FINAL_VOUCHER_V2_RESERVATION_MEMO_PREFIX,FINAL_VOUCHER_V2_SOLANA_MAINNET_CAIP2,HOSTED_TAB_ACCEPTANCE_RULE,HOSTED_TAB_REGISTRATION_ENCODING,HOSTED_TAB_TERMS_VERSION,HOSTED_TAB_VOUCHER_HEADER,HistoricalV1MigrationRequiredError,INSTRUCTIONS_SYSVAR_ID,LiveSessionExistsError,SECP256R1_PROGRAM_ID,SessionScopeExceededError,TabClosedError,UnsupportedNetworkError,armTabOpen,assertFinalVoucherV2ReservationReceipt,atomicToHuman,buildRegisterSessionKeyInstruction,buildRevokeSessionKeyInstruction,buildSecp256r1VerifyInstruction,buildVoucherMessage,canonicalFinalVoucherV2ReservationNetwork,deriveChannelId,finalVoucherV2Digest,finalVoucherV2ReservationBindingDigest,finalVoucherV2ReservationBindingDigestFromIdentity,finalVoucherV2ReservationIdentity,finalVoucherV2ReservationMemo,finalVoucherV2Sequence,generateSessionKeypair,humanToAtomic,makeSessionKey,openTab,parseAtomic,payUrlWithTab,resolveTabOffer,resolveTabTerms,resumeTab,scopeCapAtomic,sessionRegisterMessage,sessionReplaceV1Message,sessionRevokeMessage,sessionVoucherV2AuthorizationNonce,sessionVoucherV2Nonce,signContextBoundFinalVoucherV2,signVoucher,tabFromGrant,voucherPayloadMessage,voucherToHeader,voucherV2SequenceOrdinal});
|
|
6
|
+
`):null}}var He=Y(require("tweetnacl"),1),me=require("@solana/web3.js"),$n=require("@noble/hashes/utils"),We=require("@dexterai/vault/session"),qn=require("@dexterai/vault/messages"),Hn=require("@dexterai/vault/reader");var Z=require("@solana/web3.js"),qt=require("@noble/hashes/utils"),$e=require("@dexterai/vault/credit"),we=require("@dexterai/vault/constants"),Mn=require("@dexterai/vault/instructions"),Kn=require("@dexterai/vault/reader"),qe=require("@dexterai/vault/session");var Mr=Uint8Array.from([56,67,4,209,238,143,0,129]),Kr=74,Fr=188,Lr=new Z.PublicKey("MemoSq4gqABAXKb96qnH8TysNcWxMyWCqXgDLGmfcHr"),$r=(()=>{let e=Buffer.alloc(32);return e.write("OTS_SESSION_REGISTER_V2","ascii"),e})(),pn=class extends Error{constructor(n,r){super(`native_tab_v2_solana_reservation_invalid:${n}`+(r?`:${r}`:""));this.code=n;this.name="SolanaFinalVoucherV2ReservationError"}code};function b(e,t){throw new pn(e,t)}function j(e,t){try{return new Z.PublicKey(e)}catch{return b(t)}}function $t(e,t){return e.length===t.length&&e.every((n,r)=>n===t[r])}async function qr(e){let n=(await e.connection.getSignatureStatuses([e.signature],{searchTransactionHistory:!0})).value[0]??null;if(!n)return null;n.confirmationStatus!=="confirmed"&&n.confirmationStatus!=="finalized"&&b("transaction_commitment"),n.err!==null&&b("transaction_failed");let r=await e.connection.getTransaction(e.signature,{commitment:e.commitment,maxSupportedTransactionVersion:0});if(!r)return null;r.meta||b("transaction_meta_missing"),r.slot!==n.slot&&b("transaction_status_slot");let o=r.transaction.message,a=o.version===0?o.getAccountKeys({accountKeysFromLookups:r.meta.loadedAddresses??null}):o.getAccountKeys(),i=(s,c)=>{let u=a.get(s);return u||b(c),u};return{slot:r.slot,confirmationStatus:n.confirmationStatus,err:r.meta.err,signatures:[...r.transaction.signatures],accountKeys:Array.from({length:a.length},(s,c)=>({address:i(c,"transaction_account_key").toBase58(),signer:o.isAccountSigner(c),writable:o.isAccountWritable(c)})),instructions:o.compiledInstructions.map(s=>({programId:i(s.programIdIndex,"transaction_program_id").toBase58(),accounts:s.accountKeyIndexes.map(c=>i(c,"transaction_instruction_account").toBase58()),data:Uint8Array.from(s.data)}))}}function Hr(e,t,n,r){r.length!==Kr&&b("binding_length"),$t(r.subarray(0,8),Mr)||b("binding_discriminator");let o=r.readUInt8(8),a=r.readUInt8(9);return(0,we.isSwigVaultBindingIdentityVersion)(o)||b("binding_version"),a!==t&&b("binding_bump"),{address:e.toBase58(),owner:n.toBase58(),version:o,bump:a,swig:new Z.PublicKey(r.subarray(10,42)).toBase58(),vault:new Z.PublicKey(r.subarray(42,74)).toBase58()}}async function Wr(e){let t=j(e.input.programId,"program_id"),n=j(e.input.buyerSwigAddress,"buyer_swig"),r=j(e.input.vaultPda,"vault_pda"),o=j(e.input.seller,"seller"),[a,i]=(0,$e.deriveSwigVaultBindingPda)(n,t),[s]=(0,qe.deriveSessionPda)(r,o,t),c=await e.connection.getMultipleAccountsInfoAndContext([a,r,s],{commitment:e.commitment,minContextSlot:e.minimumSlot}),[u,d,g]=c.value;u||b("binding_missing"),d||b("vault_missing"),g||b("session_missing");let f,y;try{f=(0,Kn.decodeVaultFull)(Buffer.from(d.data)),y=(0,qe.decodeSessionAccount)(s,g.data)}catch(l){return b("post_state_decode",l instanceof Error?l.message:String(l))}let m=y.session;return{contextSlot:c.context.slot,binding:Hr(a,i,u.owner,Buffer.from(u.data)),vault:{owner:d.owner.toBase58(),exists:f.exists,version:f.version,swigAddress:f.swigAddress,dexterAuthority:f.dexterAuthority,pendingVoucherCount:f.pendingVoucherCount},session:{owner:g.owner.toBase58(),version:y.version,bump:y.bump,vault:y.vault,sessionPublicKey:(0,qt.bytesToHex)(m.sessionPubkey),maxAmount:m.maxAmount,expiresAt:m.expiresAt,seller:m.allowedCounterparty,nonce:m.nonce,spent:m.spent,currentOutstanding:m.currentOutstanding,maxRevolvingCapacity:m.maxRevolvingCapacity,crystallizedCumulative:m.crystallizedCumulative}}}function jr(e){let t=Buffer.from(e.voucher.sessionRegistration);return t.length!==Fr&&b("registration_length"),$t(t.subarray(0,32),$r)||b("registration_domain"),{programId:new Z.PublicKey(t.subarray(32,64)).toBase58(),vaultPda:new Z.PublicKey(t.subarray(64,96)).toBase58(),sessionPublicKey:(0,qt.bytesToHex)(t.subarray(96,128)),maxAmount:t.readBigUInt64LE(128),expiresAt:t.readBigInt64LE(136),seller:new Z.PublicKey(t.subarray(144,176)).toBase58(),nonce:t.readUInt32LE(176),maxRevolvingCapacity:t.readBigUInt64LE(180)}}function Le(e,t,n){let r=e.accountKeys.filter(o=>o.address===t);return r.length!==1&&b(`${n}_account_key`),r[0]}function zr(e,t,n){(!Number.isSafeInteger(n.slot)||n.slot<=0)&&b("transaction_slot"),n.slot!==t.confirmationSlot&&b("transaction_confirmation_slot"),n.err!==null&&b("transaction_failed"),n.signatures[0]!==t.transaction&&b("transaction_signature"),n.instructions.length!==2&&b("transaction_instruction_count");let r=j(e.programId,"program_id"),o=j(e.buyerSwigAddress,"buyer_swig"),a=j(e.vaultPda,"vault_pda"),i=j(e.seller,"seller"),s=j(e.sessionPda,"session_pda"),[c]=(0,qe.deriveSessionPda)(a,i,r),u=(0,$e.deriveSwigVaultBindingPda)(o,r)[0],d=(0,Mn.deriveSwigWalletAddress)(o),g=(0,$e.deriveGraphConfigPda)(r)[0];s.equals(c)||b("session_pda_derivation");let f=Buffer.from(we.DISCRIMINATORS.settle_voucher),y=n.instructions.filter(I=>{if(I.programId!==e.programId)return!1;let k=I.data;return k.length>=f.length&&$t(k.subarray(0,f.length),f)});y.length!==1&&b("settle_voucher_instruction_count");let m=y[0];n.instructions[0]!==m&&b("settle_voucher_instruction_order");let l=Buffer.from(m.data);l.length!==49&&b("settle_voucher_instruction_length"),l.readBigUInt64LE(8).toString()!==e.reservationAmountAtomic&&b("settle_voucher_amount"),l.readUInt8(16)!==1&&b("settle_voucher_increment"),new Z.PublicKey(l.subarray(17,49)).equals(i)||b("settle_voucher_seller"),m.accounts.length<8&&b("settle_voucher_accounts"),[a.toBase58(),null,s.toBase58(),null,o.toBase58(),d.toBase58(),u.toBase58(),g.toBase58()].forEach((I,k)=>{I!==null&&m.accounts[k]!==I&&b(`settle_voucher_account_${k}`)});let x=m.accounts[1];x||b("dexter_authority");let p=Le(n,m.accounts[0],"vault"),h=Le(n,x,"dexter_authority"),_=Le(n,m.accounts[2],"session");(!p.writable||p.signer)&&b("vault_privileges"),h.signer||b("dexter_authority_signature"),(!_.writable||_.signer)&&b("session_privileges");for(let I=3;I<Math.min(m.accounts.length,8);I+=1)Le(n,m.accounts[I],`account_${I}`).signer&&b(`settle_voucher_account_${I}_signer`);for(let I=8;I<m.accounts.length;I+=1){let k=Le(n,m.accounts[I],`sibling_${I-8}`);(!k.writable||k.signer)&&b("settle_voucher_sibling_privileges")}let S=n.instructions[1];S.programId!==Lr.toBase58()&&b("reservation_memo_program"),(S.accounts.length!==1||S.accounts[0]!==x)&&b("reservation_memo_authority"),Le(n,x,"reservation_memo_authority").signer||b("reservation_memo_authority_signature");let q=new TextEncoder().encode(Ft(e));return $t(S.data,q)||b("reservation_memo_digest"),x}function Gr(e,t,n,r){let o=j(e.programId,"program_id"),a=j(e.buyerSwigAddress,"buyer_swig"),i=j(e.vaultPda,"vault_pda"),s=j(e.seller,"seller"),[c,u]=(0,$e.deriveSwigVaultBindingPda)(a,o),[d,g]=(0,qe.deriveSessionPda)(i,s,o);(!Number.isSafeInteger(r.contextSlot)||r.contextSlot<t)&&b("post_state_slot"),(r.binding.address!==c.toBase58()||r.binding.owner!==e.programId||r.binding.bump!==u||!(0,we.isSwigVaultBindingIdentityVersion)(r.binding.version)||r.binding.swig!==e.buyerSwigAddress||r.binding.vault!==e.vaultPda)&&b("binding_identity"),(r.vault.owner!==e.programId||!r.vault.exists||r.vault.version!==7||r.vault.swigAddress!==e.buyerSwigAddress||r.vault.dexterAuthority!==n)&&b("vault_post_state"),(e.sessionPda!==d.toBase58()||r.session.owner!==e.programId||r.session.version!==1||r.session.bump!==g||r.session.vault!==e.vaultPda||r.session.sessionPublicKey!==(0,qt.bytesToHex)(e.voucher.sessionPublicKey)||r.session.seller!==e.seller||r.session.nonce!==e.sessionNonce||r.session.currentOutstanding.toString()!==e.reservationAmountAtomic)&&b("session_post_state");let f=jr(e);(f.programId!==e.programId||f.vaultPda!==e.vaultPda||f.sessionPublicKey!==r.session.sessionPublicKey||f.seller!==e.seller||f.nonce!==e.sessionNonce||f.maxAmount!==r.session.maxAmount||f.expiresAt!==BigInt(r.session.expiresAt)||f.maxRevolvingCapacity!==r.session.maxRevolvingCapacity)&&b("registration_post_state");let y=r.session.spent>r.session.crystallizedCumulative?r.session.spent:r.session.crystallizedCumulative;return y.toString()!==e.previousCumulativeAtomic&&b("session_frontier"),{commitment:"confirmed",confirmationSlot:t,postStateSlot:r.contextSlot,sessionAccountVersion:r.session.version,wireVersion:2,frontierAtomic:y.toString(),spentAtomic:r.session.spent.toString(),currentOutstandingAtomic:r.session.currentOutstanding.toString(),crystallizedCumulativeAtomic:r.session.crystallizedCumulative.toString()}}async function Xr(e,t,n,r={}){try{ae(t,n)}catch(s){return b("provider_receipt",s instanceof Error?s.message:String(s))}t.network!=="solana:mainnet"&&b("network"),t.programId!==we.DEXTER_VAULT_PROGRAM_ID.toBase58()&&b("program_id");let o=await(r.readTransaction??qr)({connection:e,signature:n.transaction,commitment:"confirmed"});o||b("transaction_missing"),o.confirmationStatus!=="confirmed"&&o.confirmationStatus!=="finalized"&&b("transaction_commitment");let a=zr(t,n,o),i=await(r.readPostState??Wr)({connection:e,input:t,minimumSlot:o.slot,commitment:"confirmed"});return{...Gr(t,o.slot,a,i),commitment:o.confirmationStatus}}async function Fn(e,t,n,r={}){await Xr(e,t,n,r)}var fn="solana:mainnet";async function Wn(e){let t=e.facilitatorUrl??ut,n=e.programId??H.DEXTER_VAULT_PROGRAM_ID,r=new me.PublicKey(e.vaultPda),o=new me.PublicKey(e.params.counterparty),a=Ae(e.perUnitCapAtomic);if(a<=0n)throw new Error(`perUnitCapAtomic must be > 0, got ${e.perUnitCapAtomic}`);let i=Ae(e.params.maxAmountAtomic),s=Ae(e.params.maxRevolvingCapacityAtomic),c=(e.params.nonce&2147483648)!==0;if(!c)throw new Q("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=Jr(e.sessionSecretKey),d=new me.PublicKey(e.params.sessionPubkey).toBytes();if(!Ln(u.publicKey,d))throw new Error(`tab_session_key_mismatch: the supplied secret derives ${new me.PublicKey(u.publicKey).toBase58()} but params.sessionPubkey is ${e.params.sessionPubkey} \u2014 wrong key handed to this process`);let g=He.default.randomBytes(32),f=He.default.sign.detached(g,u.secretKey);if(!He.default.sign.detached.verify(g,f,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 y=(0,P.sessionRegisterMessage)({programId:n,vaultPda:r,sessionPubkey:u.publicKey,maxAmount:i,expiresAt:BigInt(e.params.expiresAtUnix),allowedCounterparty:o,nonce:e.params.nonce,maxRevolvingCapacity:s}),m=typeof e.connection=="string"?new me.Connection(e.connection,"confirmed"):e.connection,l=await(0,We.fetchSessionAccount)(m,r,o,n);if(!l||l.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(!(0,We.isSessionLive)(l))throw new Error(l.version!==1?`tab_session_not_live: SessionAccount has unsupported version ${l.version} \u2014 not a live v1 session`:`tab_session_not_live: SessionAccount is present but expired (expiresAt=${l.session.expiresAt})`);if(!Ln(l.session.sessionPubkey,u.publicKey))throw new Error(`tab_session_pubkey_mismatch: the on-chain session carries ${new me.PublicKey(l.session.sessionPubkey).toBase58()} \u2014 the grant this key belongs to was replaced by a newer registration`);if(l.vault!==r.toBase58()||l.session.allowedCounterparty!==o.toBase58()||l.session.maxAmount!==i||l.session.expiresAt!==e.params.expiresAtUnix||l.session.nonce!==e.params.nonce||l.session.maxRevolvingCapacity!==s)throw new Error(`tab_grant_params_stale: params disagree with the on-chain session scope (chain: maxAmount=${l.session.maxAmount} expiresAt=${l.session.expiresAt} nonce=${l.session.nonce} revolving=${l.session.maxRevolvingCapacity}; params: ${e.params.maxAmountAtomic}/${e.params.expiresAtUnix}/${e.params.nonce}/${e.params.maxRevolvingCapacityAtomic}) \u2014 refresh the grant hand-off`);if(c&&l.session.currentOutstanding!==0n)throw new Error(`native_tab_v2_reservation_pending: the session already has an exact outstanding reservation of ${l.session.currentOutstanding}; recover that immutable attempt before issuing another FINAL voucher`);let v=l.session.spent>l.session.crystallizedCumulative?l.session.spent:l.session.crystallizedCumulative;if(v>=i)throw new Error(`tab_exhausted: on-chain frontier ${v} has consumed the session cap ${i} \u2014 no voucher can strictly exceed it; open a new grant`);let x=e.sellerUrl??e.params.counterparty,p=BigInt(Math.floor(Math.random()*4294967295)),h=Me({vaultPda:r,sellerUrl:x,nonce:p}),_=(0,$n.bytesToHex)(h),S=e.swigAddress;if(!S){let A=await(0,Hn.readVaultFull)(m,r);if(!A.exists||!A.swigAddress)throw new Error(`tab_vault_unreadable: vault ${r.toBase58()} has no readable swig_address on chain \u2014 pass options.swigAddress explicitly`);S=A.swigAddress}let z={channelId:_,maxAmountAtomic:e.params.maxAmountAtomic,revolvingCapacityAtomic:e.params.maxRevolvingCapacityAtomic,expiresAtUnix:e.params.expiresAtUnix,allowedCounterparty:e.params.counterparty},q=Ot({publicKey:u.publicKey,privateKey:u.secretKey},z,y),[I]=(0,We.deriveSessionPda)(r,o,n),k={network:fn,swigAddress:S,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(A,w)=>{if(!c)return Bt(A,w,h);let R=Ut({programId:n.toBase58(),vaultPda:r.toBase58(),sessionPda:I.toBase58(),seller:o.toBase58(),sessionNonce:e.params.nonce,channelId:w.channelId,cumulativeAmountAtomic:w.cumulativeAmount,sequenceOrdinal:w.sequenceNumber,sessionPrivateKey:A.privateKey,sessionPublicKey:A.publicKey,sessionRegistration:A.registration});return{payload:{channelId:R.channelId,cumulativeAmount:R.cumulativeAmount,sequenceNumber:R.sequenceNumber},sessionPublicKey:Uint8Array.from(Buffer.from(R.sessionPublicKey,"hex")),sessionSignature:Uint8Array.from(Buffer.from(R.sessionSignature,"hex")),sessionRegistration:Uint8Array.from(Buffer.from(R.sessionRegistration,"hex"))}},signOpenTab:async A=>A.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?(A,w)=>Fn(m,A,w):void 0};return new ct({vault:k,network:fn,seller:x,counterparty:e.params.counterparty,session:q,channelIdHex:_,channelIdBytes:h,perUnitCapAtomic:a,totalCapAtomic:i,expiresAtUnix:e.params.expiresAtUnix,facilitatorUrl:t,initialCumulativeAtomic:v,initialSequenceOrdinal:c&&l.session.lastLockedSequence!==0?(0,qn.voucherV2SequenceOrdinal)(l.session.lastLockedSequence):0,beforeVoucherRelease:c?async({voucher:A,incrementAtomic:w,previousCumulativeAtomic:R})=>{let E=Ke(A),N={network:fn,programId:n.toBase58(),buyerSwigAddress:S,vaultPda:r.toBase58(),sessionPda:I.toBase58(),seller:o.toBase58(),channelId:_,sessionNonce:e.params.nonce,reservationAmountAtomic:w,previousCumulativeAtomic:R,...E,voucher:A},C=await e.reserveFinalVoucherV2(N);return ae(N,C),await k.verifyFinalVoucherV2Reservation(N,C),C}:void 0,closeMode:"settle-only"})}function Jr(e){if(e.length===64)return He.default.sign.keyPair.fromSecretKey(e);if(e.length===32)return He.default.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 Ln(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}var zn=require("@solana/web3.js");var jn=[{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"}],Yr=new Map(jn.map(e=>[e.caip2.toLowerCase(),e])),Qr=new Map(jn.map(e=>[e.bare.toLowerCase(),e]));function _e(e){if(!e)return null;let t=e.toLowerCase(),n=Yr.get(t)||Qr.get(t);return n?{caip2:n.caip2,bare:n.bare,family:n.family}:null}function gn(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 Zr(e){let t=[];for(let n of e){if(!n||typeof n!="object")continue;let r=n,o=_e(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 Ht(e){let t=e.headers.get("payment-required");if(!t)return null;let n;try{n=gn(t)}catch{return null}let r=Array.isArray(n.accepts)?n.accepts:[];return r.length===0?null:{x402Version:2,options:Zr(r),extensions:n.extensions&&typeof n.extensions=="object"&&!Array.isArray(n.extensions)?n.extensions:void 0,resourceUrl:n.resource&&typeof n.resource=="object"?String(n.resource.url??""):void 0}}async function je(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(s){return{kind:"error",detail:`probe failed: ${s?.message??String(s)}`}}if(o.status!==402)return o.ok?{kind:"free",response:o}:{kind:"error",detail:`probe returned HTTP ${o.status}`};let a=await Ht(o);if(!a)return{kind:"error",detail:"the 402 carries no x402 v2 PAYMENT-REQUIRED challenge"};let i=a.options.find(s=>s.scheme==="tab"&&s.network.family==="svm");if(!i)return{kind:"no_tab",schemesOffered:a.options.map(s=>s.scheme)};try{new zn.PublicKey(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:a.resourceUrl}}}var Gn="dexter-tab-hosted-pay-before-delivery/v1",Xn="pay_before_delivery_seller_2xx",Jn="x-tab-voucher",Yn="base64(188-byte sessionRegisterMessage)";var mt="solana:5eykt4UsFv8P8NJdTREpY1vzqKqZKvdp",Wt="solana:EtWTRABZaYq6iMfeYKouRu166VU2xqa1",jt="solana:4uhcVJyU9pJkvQyS88uRDiswHXSCkY3z",xe=mt,dt=Wt,pt=jt,Re="eip155:8453",ze="eip155:84532",Ge="eip155:42161",Xe="eip155:137",Je="eip155:10",Ye="eip155:43114",Qe="eip155:56",Te="eip155:480",Ee="eip155:143",Pe="eip155:4663",Ie="eip155:1187947933",Ve="eip155:324705682",Ze="eip155:1",Ce=Re,zt=ze,ft=Ge,gt=Xe,ht=Je,yt=Ye,At=Qe,bt=Te,vt=Ee,St=Pe,wt=Ie,_t=Ve,xt=Ze,Rt="EPjFWdd5AufqSSqeM2qN1xzybapC8G4wEGGkZwyTDt1v",Qn="4zMMC9srt5Ri5X14GAgXhaHii3GnPAEERYPJgZJDncDU",Zn="0x833589fCD6eDb6E08f4c7C32D4f71b54bdA02913",hn="0x55d398326f99059fF775485246999027B3197955",Gt="0x8AC76a51cc950d9822D68b83fE1Ad97B32Cd580d",yn="0x5fc5360D0400a0Fd4f2af552ADD042D716F1d168",et={[Qe]:Gt,[Re]:Zn,[ze]:"0x036CbD53842c5426634e7929541eC2318f3dCF7e",[Ge]:"0xaf88d065e77c8cC2239327C5EDb3A432268e5831",[Xe]:"0x3c499c542cEF5E3811e1192ce70d8cC03d5c3359",[Je]:"0x0b2C639c533813f4Aa9D7837CAf62653d097Ff85",[Ye]:"0xB97EF9Ef8734C71904D8002F8b6Bc66Dd9c48a6E",[Te]:"0x79A02482A880bCE3F13e09Da970dC34db4CD24d1",[Ee]:"0x754704Bc059F8C67012fEd69BC8A327a5aafb603",[Pe]:yn,[Ie]:"0x85889c8c714505E0c94b30fcfcF64fE3Ac8FCb20",[Ve]:"0x2e08028E3C4c2356572E096d8EF835cD5C6030bD",[Ze]:"0xA0b86991c6218b36c1d19D4a2e9Eb0cE3606eB48"},Xt={[hn]:{symbol:"USDT",decimals:18},[Gt]:{symbol:"USDC",decimals:18}};var Jt={[Te]:{name:"USDC",version:"2"},[Ee]:{name:"USDC",version:"2"},[Pe]:{name:"Global Dollar",version:"1"},[Ie]:{name:"Bridged USDC (SKALE Bridge)",version:"2"},[Ve]:{name:"Bridged USDC (SKALE Bridge)",version:"2"}},de="0x000000000022D473030F116dDEE9F6B43aC78BA3",Tt="0x402085c248EeA27D92E8b30b2C58ed07f9E20001",Et={[Qe]:56,[Re]:8453,[ze]:84532,[Ge]:42161,[Xe]:137,[Je]:10,[Ye]:43114,[Te]:480,[Ee]:143,[Pe]:4663,[Ie]:1187947933,[Ve]:324705682,[Ze]:1},Ne={[mt]:"https://api.dexter.cash/api/solana/rpc",[Wt]:"https://api.devnet.solana.com",[jt]:"https://api.testnet.solana.com"},D={[Qe]:"https://api.dexter.cash/api/evm/bsc/rpc",[Re]:"https://api.dexter.cash/api/base/rpc",[ze]:"https://sepolia.base.org",[Ge]:"https://api.dexter.cash/api/evm/arbitrum/rpc",[Xe]:"https://api.dexter.cash/api/evm/polygon/rpc",[Je]:"https://api.dexter.cash/api/evm/optimism/rpc",[Ye]:"https://api.dexter.cash/api/evm/avalanche/rpc",[Te]:"https://worldchain-mainnet.g.alchemy.com/public",[Ee]:"https://rpc.monad.xyz",[Pe]:"https://rpc.mainnet.chain.robinhood.com",[Ie]:"https://skale-base.skalenodes.com/v1/base",[Ve]:"https://base-sepolia-testnet.skalenodes.com/v1/jubilant-horrible-ancha",[Ze]:"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)}};function ee(e,t){let n=e.scheme??"exact";if(n!=="exact"&&!(t==="evm"&&n==="exact-approval"))return`Unsupported payment scheme: ${n}`;let r=e.extra?.paymentFlow;if(r!==void 0&&r!=="authorization")return`Unsupported payment flow: ${String(r)}`;let o=e.extra?.assetTransferMethod;if(o!==void 0&&(typeof o!="string"||!(n==="exact-approval"?[]:t==="evm"?["eip3009","permit2"]:["default"]).includes(o)))return`Unsupported payment asset transfer method: ${String(o)}`}function Pt(e){let t=e?.["payment-identifier"];if(!t||typeof t!="object"||Array.isArray(t))return!1;let n=t.info;return!!n&&typeof n=="object"&&!Array.isArray(n)&&n.required===!0}var M=require("@solana/web3.js"),L=require("@solana/spl-token");var eo=12e3,to=1;function ke(e){if(!e||typeof e!="object")return!1;let t=e;return"publicKey"in t&&"signTransaction"in t&&typeof t.signTransaction=="function"}var Yt=class{name="Solana";networks=[xe,dt,pt];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]:Ne[t]?Ne[t]:t==="solana"?Ne[xe]:t==="solana-devnet"?Ne[dt]:t==="solana-testnet"?Ne[pt]:Ne[xe]}getAddress(t){return ke(t)?t.publicKey?.toBase58()??null:null}isConnected(t){return ke(t)?t.publicKey!==null:!1}async getBalance(t,n,r){if(!ke(n)||!n.publicKey)return 0;let o=r||this.getDefaultRpcUrl(t.network),a=new M.Connection(o,"confirmed"),i=new M.PublicKey(n.publicKey.toBase58()),s=new M.PublicKey(t.asset);try{let u=(await a.getAccountInfo(s,"confirmed"))?.owner.toBase58()===L.TOKEN_2022_PROGRAM_ID.toBase58()?L.TOKEN_2022_PROGRAM_ID:L.TOKEN_PROGRAM_ID,d=await(0,L.getAssociatedTokenAddress)(s,i,!1,u),g=await(0,L.getAccount)(a,d,void 0,u),f=t.extra?.decimals??6;return Number(g.amount)/Math.pow(10,f)}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){let o=ee(t,"svm");if(o)throw new Error(o);if(!ke(n))throw new Error("Invalid Solana wallet");if(!n.publicKey)throw new Error("Wallet not connected");let a=r||this.getDefaultRpcUrl(t.network),i=new M.Connection(a,"confirmed"),s=new M.PublicKey(n.publicKey.toBase58()),{payTo:c,asset:u,extra:d}=t,g=t.amount??t.maxAmountRequired;if(!g)throw new Error("Missing amount in payment requirements");if(!d?.feePayer)throw new Error("Missing feePayer in payment requirements");let f=new M.PublicKey(d.feePayer),y=new M.PublicKey(u),m=new M.PublicKey(c);this.log("Building transaction:",{from:s.toBase58(),to:c,amount:g,asset:u,feePayer:d.feePayer});let l=[];l.push(M.ComputeBudgetProgram.setComputeUnitLimit({units:eo})),l.push(M.ComputeBudgetProgram.setComputeUnitPrice({microLamports:to}));let v=await i.getAccountInfo(y,"confirmed");if(!v)throw new Error(`Token mint ${u} not found`);let x=v.owner.toBase58()===L.TOKEN_2022_PROGRAM_ID.toBase58()?L.TOKEN_2022_PROGRAM_ID:L.TOKEN_PROGRAM_ID,p=await(0,L.getMint)(i,y,void 0,x);typeof d?.decimals=="number"&&p.decimals!==d.decimals&&this.log(`Decimals mismatch: requirements say ${d.decimals}, mint says ${p.decimals}`);let h=await(0,L.getAssociatedTokenAddress)(y,s,!1,x),_=await(0,L.getAssociatedTokenAddress)(y,m,!0,x);if(!await i.getAccountInfo(h,"confirmed"))throw new Error(`No token account found for ${u}. Please ensure you have USDC in your wallet.`);if(!await i.getAccountInfo(_,"confirmed"))throw new Error(`Seller token account not found. The seller (${c}) must have a USDC account.`);let q=BigInt(g);l.push((0,L.createTransferCheckedInstruction)(h,y,_,s,q,p.decimals,[],x));let{blockhash:I}=await i.getLatestBlockhash("confirmed"),k=new M.TransactionMessage({payerKey:f,recentBlockhash:I,instructions:l}).compileToV0Message(),A=new M.VersionedTransaction(k),w=await n.signTransaction(A);return this.log("Transaction signed successfully"),{serialized:Buffer.from(w.serialize()).toString("base64"),settlementProbe:{kind:"solana",sourceAta:h.toBase58(),destinationAta:_.toBase58(),asset:u,amount:g,blockhash:I}}}async confirmSettlement(t,n){if(t.kind!=="solana")throw new Error(`SolanaAdapter.confirmSettlement cannot handle probe kind "${t.kind}"`);let r=new M.Connection(n,"confirmed"),o=new M.PublicKey(t.destinationAta),a=await r.getSignaturesForAddress(o,{limit:25});if(a.length===0)return{settled:!1};let i=BigInt(t.amount);for(let s of a){if(s.err)continue;let c=await r.getTransaction(s.signature,{commitment:"confirmed",maxSupportedTransactionVersion:0});if(!c?.meta)continue;let u=c.transaction.message.getAccountKeys().keySegments().flat(),d=c.meta.preTokenBalances??[],g=c.meta.postTokenBalances??[];for(let f of g){if(f.mint!==t.asset)continue;let y=u[f.accountIndex];if(!y||!y.equals(o))continue;let m=d.find(x=>x.accountIndex===f.accountIndex),l=BigInt(m?.uiTokenAmount.amount??"0");if(BigInt(f.uiTokenAmount.amount??"0")-l===i)return{settled:!0,txSignature:s.signature}}}return{settled:!1}}};function pe(e){return new Yt(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"}]},er=BigInt("0xffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff");function Oe(e){if(!e||typeof e!="object")return!1;let t=e;return"address"in t&&typeof t.address=="string"&&t.address.startsWith("0x")}var Qt=class{name="EVM";networks=[At,Ce,zt,xt,ft,gt,ht,yt,bt,vt,St,wt,_t];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[Ce]:t==="bsc"?D[At]:t==="ethereum"?D[xt]:t==="arbitrum"?D[ft]:t==="polygon"?D[gt]:t==="optimism"?D[ht]:t==="avalanche"?D[yt]:t==="world"?D[bt]:t==="monad"?D[vt]:t==="robinhood"?D[St]:t==="skale-base"?D[wt]:t==="skale-base-sepolia"?D[_t]:D[Ce]}getAddress(t){return Oe(t)?t.address:null}isConnected(t){return Oe(t)?!!t.address:!1}getChainId(t){if(Et[t])return Et[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(!Oe(n)||!n.address)return 0;let o=r||this.getDefaultRpcUrl(t.network);try{let a=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:a},"latest"]})});if(!i.ok)throw new Error(`RPC request failed: ${i.status}`);let s=await i.json();if(s.error)throw new Error(`RPC error: ${JSON.stringify(s.error)}`);if(!s.result||s.result==="0x")return 0;let c=BigInt(s.result),u=t.extra?.decimals??6;return Number(c)/Math.pow(10,u)}catch(a){throw a}}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"),a=t.nonce.slice(2).toLowerCase().padStart(64,"0"),i=r+o+a,s=await this.ethCall(n,t.asset,i);return{settled:BigInt(s)!==0n}}if(t.kind==="permit2"){let r="0x4fe02b44",o=BigInt(t.nonce),a=o>>8n,i=o&0xffn,s=t.from.slice(2).toLowerCase().padStart(64,"0"),c=a.toString(16).padStart(64,"0"),u=r+s+c,d=await this.ethCall(n,de,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 a=await o.json();if(a.error)throw new Error(`RPC error: ${JSON.stringify(a.error)}`);if(!a.result||a.result==="0x")throw new Error("RPC returned an empty result");return a.result}async buildTransaction(t,n,r){let o=ee(t,"evm");if(o)throw new Error(o);if(!Oe(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:a,asset:i,extra:s}=t,c=t.amount??t.maxAmountRequired;if(!c)throw new Error("Missing amount in payment requirements");this.log("Building EVM transaction:",{from:n.address,to:a,amount:c,asset:i,network:t.network});let u=this.getChainId(t.network),d=Jt[`eip155:${u}`],g={name:s?.name??d?.name??"USD Coin",version:s?.version??d?.version??"2",chainId:BigInt(u),verifyingContract:i},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"}]},y=new Uint8Array(32);(globalThis.crypto??(await import("crypto")).webcrypto).getRandomValues(y);let m="0x"+[...y].map(_=>_.toString(16).padStart(2,"0")).join(""),l=Math.floor(Date.now()/1e3),v={from:n.address,to:a,value:c,validAfter:String(l-600),validBefore:String(l+(t.maxTimeoutSeconds||60)),nonce:m},x={from:n.address,to:a,value:BigInt(c),validAfter:BigInt(l-600),validBefore:BigInt(l+(t.maxTimeoutSeconds||60)),nonce:m};if(!n.signTypedData)throw new Error("Wallet does not support signTypedData (EIP-712)");let p=await n.signTypedData({domain:g,types:f,primaryType:"TransferWithAuthorization",message:x});return this.log("EIP-712 signature obtained"),{serialized:JSON.stringify({authorization:v,signature:p}),signature:p,settlementProbe:{kind:"eip3009",from:v.from,to:v.to,amount:v.value,nonce:m,asset:i,chainId:u}}}async buildApprovalTransaction(t,n,r){let{payTo:o,asset:a,extra:i}=t,s=t.amount??t.maxAmountRequired;if(!s)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:s,asset:a,network:t.network,facilitatorContract:c});let u=r||this.getDefaultRpcUrl(t.network),d=i?.fee??"0",g=BigInt(s)+BigInt(d),f=await this.readAllowance(u,a,n.address,c);if(f<g){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 k=this.calculateApprovalAmount(s,d,i?.approvalStrategy);this.log(`Approving ${k} for ${c} (current allowance: ${f})`);let A=await n.sendTransaction({to:a,data:this.encodeApprove(c,k),value:0n});this.log(`Approval tx sent: ${A}`),await this.waitForReceipt(u,A),this.log("Approval confirmed")}else this.log("Sufficient allowance, skipping approval");let y=new Uint8Array(16);(globalThis.crypto??(await import("crypto")).webcrypto).getRandomValues(y);let m=[...y].reduce((k,A)=>k*256n+BigInt(A),0n).toString(),l=new Uint8Array(32);(globalThis.crypto??(await import("crypto")).webcrypto).getRandomValues(l);let v="0x"+[...l].map(k=>k.toString(16).padStart(2,"0")).join(""),p=Math.floor(Date.now()/1e3)+(t.maxTimeoutSeconds||300),h=i?.eip712Domain,_=h?{name:h.name,version:h.version,chainId:BigInt(h.chainId),verifyingContract:h.verifyingContract}:{name:"DexterBSCFacilitator",version:"1",chainId:BigInt(this.getChainId(t.network)),verifyingContract:c},S=i?.eip712Types??{Payment:[{name:"from",type:"address"},{name:"to",type:"address"},{name:"token",type:"address"},{name:"amount",type:"uint256"},{name:"fee",type:"uint256"},{name:"nonce",type:"uint256"},{name:"deadline",type:"uint256"},{name:"paymentId",type:"bytes32"}]},z={from:n.address,to:o,token:a,amount:BigInt(s),fee:BigInt(d),nonce:BigInt(m),deadline:BigInt(p),paymentId:v},q=await n.signTypedData({domain:_,types:S,primaryType:"Payment",message:z});this.log("EIP-712 Payment signature obtained");let I={from:n.address,to:o,token:a,amount:s,fee:d,nonce:m,deadline:p,paymentId:v,signature:q};return{serialized:JSON.stringify(I),signature:q}}async buildPermit2Transaction(t,n,r){let{payTo:o,asset:a}=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:a,network:t.network});let s=r||this.getDefaultRpcUrl(t.network),c=await this.readAllowance(s,a,n.address,de),u;if(c<BigInt(i)){let _=this.encodeApprove(de,er);if(n.signTransaction){this.log(`Signing Permit2 approval for relay (current allowance: ${c})`);let S=this.getChainId(t.network),z=await this.readGasPrice(s),q=await this.readNonce(s,n.address),I=await n.signTransaction({to:a,data:_,chainId:S,gas:50000n,gasPrice:z,nonce:q});u={erc20ApprovalGasSponsoring:{info:{from:n.address,asset:a,spender:de,amount:er.toString(),signedTransaction:I,version:"1"}}},this.log("Permit2 approval signed for facilitator relay")}else if(n.sendTransaction){this.log(`Approving Permit2 directly (current allowance: ${c})`);let S=await n.sendTransaction({to:a,data:_,value:0n});this.log(`Permit2 approval tx sent: ${S}`),await this.waitForReceipt(s,S),this.log("Permit2 approval confirmed")}else throw new Error("Permit2 payments require a wallet that supports signTransaction or sendTransaction for the one-time Permit2 approval. Use createEvmKeypairWallet() or a browser wallet with transaction support.")}else this.log("Sufficient Permit2 allowance, skipping approval");let d=new Uint8Array(32);(globalThis.crypto??(await import("crypto")).webcrypto).getRandomValues(d);let g=[...d].reduce((_,S)=>_*256n+BigInt(S),0n),f=Math.floor(Date.now()/1e3),y=f-600,m=f+(t.maxTimeoutSeconds||300),l=this.getChainId(t.network),v={name:"Permit2",chainId:BigInt(l),verifyingContract:de},x={permitted:{token:a,amount:BigInt(i)},spender:Tt,nonce:g,deadline:BigInt(m),witness:{to:o,validAfter:BigInt(y)}},p=await n.signTypedData({domain:v,types:no,primaryType:"PermitWitnessTransferFrom",message:x});this.log("Permit2 PermitWitnessTransferFrom signature obtained");let h={signature:p,permit2Authorization:{from:n.address,permitted:{token:a,amount:i},spender:Tt,nonce:g.toString(),deadline:String(m),witness:{to:o,validAfter:String(y)}}};return{serialized:JSON.stringify(h),signature:p,extensions:u,settlementProbe:{kind:"permit2",from:n.address,nonce:g.toString(),chainId:l}}}async readAllowance(t,n,r,o){let a="0xdd62ed3e",i=r.slice(2).toLowerCase().padStart(64,"0"),s=o.slice(2).toLowerCase().padStart(64,"0"),c=a+i+s;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"),a=n.toString(16).padStart(64,"0");return r+o+a}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(a){if(a instanceof Error&&a.message.includes("reverted"))throw a}await new Promise(a=>setTimeout(a,2e3))}throw new Error(`Approval transaction receipt timeout after ${r}ms: ${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 a=BigInt(r.defaultMultiple??10),i=o*a;if(r.maxCapUsd){let s=this.inferDecimals(t),c=BigInt(Math.floor(r.maxCapUsd*Math.pow(10,s)));if(i>c)return c}if(r.exactAboveUsd){let s=this.inferDecimals(t),c=BigInt(Math.floor(r.exactAboveUsd*Math.pow(10,s)));if(BigInt(t)>c)return o}return i}inferDecimals(t){return t.length>12?18:6}};function tt(e){return new Qt(e)}function An(e){if(e===Rt||e===Qn)return!0;let t=e.toLowerCase();for(let n of Object.values(et))if(n.toLowerCase()===t)return!0;for(let n of Object.keys(Xt))if(n.toLowerCase()===t)return!0;return!1}function ro(e){return{[mt]:"Solana",[Wt]:"Solana Devnet",[jt]:"Solana Testnet",solana:"Solana","solana-devnet":"Solana Devnet","solana-testnet":"Solana Testnet",[Re]:"Base",[ze]:"Base Sepolia",[Ze]:"Ethereum",[Ge]:"Arbitrum",[Xe]:"Polygon",[Je]:"Optimism",[Ye]:"Avalanche",[Qe]:"BSC",[Te]:"World Chain",[Ee]:"Monad",[Pe]:"Robinhood Chain",[Ie]:"SKALE Base",[Ve]:"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 tr(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,s)=>r.set(s,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},a=(o.method??"GET").toUpperCase();return t&&"body"in t?o.body=t.body:a!=="GET"&&a!=="HEAD"&&n.body&&(o.body=await n.arrayBuffer()),[n.url,o]}var nr=new WeakMap;function rr(e){return nr.get(e)}function bn(e){if(!(e.length>16384))try{let t=e.trimStart().startsWith("{")?JSON.parse(e):gn(e);return t&&typeof t=="object"&&!Array.isArray(t)?t:void 0}catch{return}}function so(e,t){let n=e.headers.get("PAYMENT-RESPONSE")??e.headers.get("X-PAYMENT-RESPONSE"),r;if(n)try{let s=bn(n);s&&typeof s=="object"&&!Array.isArray(s)&&(r={...s})}catch{}r??={},delete r.chainConfirmation,r.settlementStatus="unconfirmed";let o=r.network===t.network,a=[r.errorReason,r.errorCode,r.errorMessage].every(s=>s===void 0||typeof s=="string"),i=[r.errorReason,r.errorCode].filter(s=>typeof s=="string"&&s.length>0);return i.some(s=>/pending|unknown|unconfirmed|timeout|temporar/i.test(s))?r.settlementStatus="pending":r.success===!0&&o&&a&&i.length===0&&typeof r.transaction=="string"&&r.transaction.trim().length>0?r.settlementStatus="settled":r.success===!1&&(o||r.network===void 0)&&i.length>0&&(r.settlementStatus="failed"),r.attemptedAmountAtomic=t.amountAtomic,r.settlementStatus==="settled"?r.amountAtomic=t.amountAtomic:delete r.amountAtomic,r.assetDecimals=t.assetDecimals,nr.set(e,r),r}function or(e){let{adapters:t=[pe({verbose:e.verbose}),tt({verbose:e.verbose})],wallets:n,wallet:r,preferredNetwork:o,rpcUrls:a={},maxAmountAtomic:i,fetch:s=globalThis.fetch,verbose:c=!1,accessPass:u,onPaymentRequired:d,onPaymentDispatched:g,maxRetries:f=0,retryDelayMs:y=500}=e,m=c?console.log.bind(console,"[x402]"):()=>{};async function l(A,w){let R;for(let E=0;E<=f;E++)try{let N=await s(A,w);if(N.status>=502&&N.status<=504&&E<f){m(`Retry ${E+1}/${f}: server returned ${N.status}`),await new Promise(C=>setTimeout(C,y*Math.pow(2,E)));continue}return N}catch(N){R=N,E<f&&(m(`Retry ${E+1}/${f}: ${N instanceof Error?N.message:"network error"}`),await new Promise(C=>setTimeout(C,y*Math.pow(2,E))))}throw R}let v=new Map;function x(A){try{let w=new URL(A).host,R=v.get(w);if(R&&R.expiresAt>Date.now()/1e3+10)return R.jwt;R&&v.delete(w)}catch{}return null}function p(A,w){try{let R=new URL(A).host,E=w.split(".");if(E.length===3){let N=JSON.parse(atob(E[1].replace(/-/g,"+").replace(/_/g,"/"))),C=Math.floor(Date.now()/1e3),O=C+86400,G=Math.min(typeof N.exp=="number"?N.exp:C,O);v.set(R,{jwt:w,expiresAt:G}),m("Access pass cached for",R,"| expires:",new Date(G*1e3).toISOString())}}catch{m("Failed to cache access pass")}}let h=n||{};r&&!h.solana&&ke(r)&&(h.solana=r),r&&!h.evm&&Oe(r)&&(h.evm=r);function _(A){let w=[];for(let R of A){let E=t.find(O=>O.canHandle(R.network));if(!E)continue;let N=E.name==="Solana"?"svm":"evm";if(ee(R,N))continue;let C;E.name==="Solana"?C=h.solana:E.name==="EVM"&&(C=h.evm),C&&E.isConnected(C)&&w.push({accept:R,adapter:E,wallet:C})}if(w.length===0)return null;if(o){let R=w.find(E=>E.accept.network===o);if(R)return R}return w[0]}function S(A,w){return tr(A,w)}function z(A,w){return a[A]||w.getDefaultRpcUrl(A)}async function q(A,w,R,E,N){let C="";if(u?.preferTier&&E.tiers){let T=E.tiers.find(J=>J.id===u.preferTier);if(T){if(u.maxSpend&&parseFloat(T.price)>parseFloat(u.maxSpend))throw new B("access_pass_exceeds_max_spend",`Access pass tier "${T.id}" costs $${T.price}, exceeds max spend $${u.maxSpend}`);C=`tier=${T.id}`}}else if(u?.preferDuration&&E.ratePerHour)C=`duration=${u.preferDuration}`;else if(E.tiers&&E.tiers.length>0){let T=E.tiers[0];if(u?.maxSpend&&parseFloat(T.price)>parseFloat(u.maxSpend))throw new B("access_pass_exceeds_max_spend",`Cheapest access pass costs $${T.price}, exceeds max spend $${u?.maxSpend}`);C=`tier=${T.id}`}let O=C?N.includes("?")?`${N}&${C}`:`${N}?${C}`:N;m("Purchasing access pass:",C||"default tier");let G=R.headers.get("PAYMENT-REQUIRED");if(!G)return null;let W;try{W=JSON.parse(atob(G))}catch{return null}let F=_(W.accepts);if(!F)return null;if(Pt(W.extensions))throw new B("unsupported_required_payment_identifier","Required payment identifiers are not supported by this client");let{accept:U,adapter:X,wallet:Be}=F;if(X.name==="Solana"&&!U.extra?.feePayer)return null;let ne=U.extra?.decimals??(An(U.asset)?6:void 0);if(typeof ne!="number")return null;let nt=U.amount??U.maxAmountRequired;if(!nt)return null;let re=z(U.network,X);try{let T=await X.getBalance(U,Be,re),J=Number(nt)/Math.pow(10,ne);if(T<J){let vr=S(U.network,X.name);throw new B("insufficient_balance",`Insufficient balance for access pass on ${vr}. Have $${T.toFixed(4)}, need $${J.toFixed(4)}`)}}catch(T){if(T instanceof B)throw T}let oe=await X.buildTransaction(U,Be,re),Ue;X.name==="EVM"?Ue=JSON.parse(oe.serialized):Ue={transaction:oe.serialized};let fe=typeof A=="string"?A:A instanceof URL?A.href:A.url,De=W.resource;if(typeof W.resource=="string")try{let T=new URL(W.resource,fe);["http:","https:"].includes(T.protocol)&&(De=T.toString())}catch{}else if(W.resource&&typeof W.resource=="object"&&"url"in W.resource){let T=W.resource;try{let J=new URL(T.url,fe);["http:","https:"].includes(J.protocol)&&(De={...T,url:J.toString()})}catch{}}let Ct={x402Version:U.x402Version??2,resource:De,accepted:U,payload:Ue};oe.extensions&&(Ct.extensions=oe.extensions);let rt=btoa(JSON.stringify(Ct)),ge=await s(O,{...w,method:"POST",headers:{...w?.headers||{},"Content-Type":"application/json","PAYMENT-SIGNATURE":rt}});if(!ge.ok)return m("Pass purchase failed:",ge.status),null;let V=ge.headers.get("ACCESS-PASS");return V&&(p(N,V),m("Access pass purchased and cached")),ge}async function I(A,w){let R=A;if(m("Making request:",R),u){let V=x(R);if(V){m("Using cached access pass");let T=await s(A,{...w,headers:{...w?.headers||{},Authorization:`Bearer ${V}`}});if(T.status!==401&&T.status!==402)return T;m("Cached pass rejected (status",T.status,"), purchasing new pass");try{v.delete(new URL(R).host)}catch{}}}let E=await l(A,w);if(E.status!==402)return E;m("Received 402 Payment Required");let N=E.headers.get("X-ACCESS-PASS-TIERS");if(u&&N){m("Server offers access passes, purchasing...");try{let V=JSON.parse(atob(N)),T=await q(A,w,E,V,R);if(T)return T}catch(V){m("Access pass purchase failed, falling back to per-request payment:",V)}}let C=E.headers.get("PAYMENT-REQUIRED");if(!C)throw new B("missing_payment_required_header","Server returned 402 but no PAYMENT-REQUIRED header");let O;try{let V=atob(C);O=JSON.parse(V)}catch{throw new B("invalid_payment_required","Failed to decode PAYMENT-REQUIRED header")}if(m("Payment requirements:",O),Pt(O.extensions))throw new B("unsupported_required_payment_identifier","Required payment identifiers are not supported by this client");let G=E.headers.get("X-Quote-Hash");G&&m("Quote hash received:",G);let W=_(O.accepts);if(!W){let V=O.accepts.map(T=>T.network).join(", ");throw new B("no_matching_payment_option",`No supported payment option with a connected wallet for: ${V}`)}let{accept:F,adapter:U,wallet:X}=W;if(m(`Using ${U.name} for ${F.network}`),U.name==="Solana"&&!F.extra?.feePayer)throw new B("missing_fee_payer","Solana payment option missing feePayer in extra");let Be=F.extra?.decimals??(An(F.asset)?6:void 0);if(typeof Be!="number")throw new B("missing_decimals","Payment option missing decimals - provide in extra or use a known stablecoin");let ne=F.amount??F.maxAmountRequired;if(!ne)throw new B("missing_amount","Payment option missing amount");if(i&&BigInt(ne)>BigInt(i))throw new B("amount_exceeds_max",`Payment amount ${ne} exceeds maximum ${i}`);let nt=z(F.network,U);m("Checking balance...");try{let V=await U.getBalance(F,X,nt),T=Number(ne)/Math.pow(10,Be);if(V<T){let J=S(F.network,U.name);throw new B("insufficient_balance",`Insufficient balance on ${J}. Have $${V.toFixed(4)}, need $${T.toFixed(4)}`)}m(`Balance OK: $${V.toFixed(4)} >= $${T.toFixed(4)}`)}catch(V){if(V instanceof B)throw V;m("Balance check failed (RPC error), proceeding with transaction attempt")}if(d&&!await d(F))throw new B("payment_rejected","Payment rejected by onPaymentRequired callback");m("Building transaction...");let re=await U.buildTransaction(F,X,nt);m("Transaction signed");let oe;U.name==="EVM"?oe=JSON.parse(re.serialized):oe={transaction:re.serialized};let Ue=A,fe=O.resource;if(typeof O.resource=="string")try{let V=new URL(O.resource,Ue).toString();V!==O.resource&&m("Resolved relative resource URL:",O.resource,"\u2192",V),fe=V}catch{fe=O.resource}else if(O.resource&&typeof O.resource=="object"&&"url"in O.resource){let V=O.resource;try{let T=new URL(V.url,Ue).toString();T!==V.url&&(m("Resolved relative resource URL:",V.url,"\u2192",T),fe={...V,url:T})}catch{}}let De={x402Version:F.x402Version??2,resource:fe,accepted:F,payload:oe};re.extensions&&(De.extensions=re.extensions);let Ct=btoa(JSON.stringify(De));if(g)try{g(F,re.settlementProbe)}catch{}m("Retrying request with payment...");let rt=await l(A,{...w,headers:{...w?.headers||{},"PAYMENT-SIGNATURE":Ct,...G?{"X-Quote-Hash":G}:{}}});m("Retry response status:",rt.status);let ge=so(rt,{network:F.network,amountAtomic:ne,assetDecimals:Be});return ge.extensions&&m("Settlement extensions:",Object.keys(ge.extensions).join(", ")),rt}async function k(A,w){let[R,E]=await oo(A,w);return I(R,E)}return{fetch:k}}function te(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 It(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 a=JSON.parse(t),i=[a.error,a.detail,a.message].filter(s=>typeof s=="string"&&s.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 Zt="Payment authorization was sent, but the merchant did not respond within the timeout. ",en=" Do not retry without checking \u2014 inspect the funding wallet for a transfer to the merchant before attempting payment again.";async function tn(e,t,n){if(!e)return{confirmed:!1,detail:Zt+"This payment scheme has no on-chain confirmation check, so the SDK cannot verify whether it settled."+en};try{if(e.kind==="solana"){let i=pe(),s=n??i.getDefaultRpcUrl(t.caip2);if(!i.confirmSettlement)return ir();let c=await i.confirmSettlement(e,s);return c.settled?{confirmed:!0,txSignature:c.txSignature}:sr()}let r=tt(),o=r.getDefaultRpcUrl(t.caip2);if(!r.confirmSettlement)return ir();let a=await r.confirmSettlement(e,o);return a.settled?{confirmed:!0,txSignature:a.txSignature}:sr()}catch(r){return{confirmed:!1,detail:Zt+`On-chain confirmation could not be completed (${te(r)}).`+en}}}function sr(){return{confirmed:!1,detail:Zt+"On-chain confirmation found no matching settlement yet \u2014 the payment may still be pending, or may not have settled."+en}}function ir(){return{confirmed:!1,detail:Zt+"The chain adapter does not support on-chain confirmation."+en}}var cr=require("@noble/hashes/sha3"),ur=require("@noble/hashes/utils");var rn=/^0x[0-9a-f]{64}$/i,ar=/^0x[0-9a-f]{40}$/i,io=/^0x(?:0|[1-9a-f][0-9a-f]*)$/i,lr=e=>`0x${(0,ur.bytesToHex)((0,cr.keccak_256)(new TextEncoder().encode(e)))}`,ao=lr("AuthorizationUsed(address,bytes32)"),co=lr("Transfer(address,address,uint256)"),vn=e=>`0x${e.slice(2).toLowerCase().padStart(64,"0")}`,K=(e,t)=>typeof e=="string"&&e.toLowerCase()===t.toLowerCase(),Vt=e=>!!e&&typeof e=="object"&&!Array.isArray(e),nn=e=>typeof e=="string"&&io.test(e);function uo(e,t,n,r){let o;for(let a of["PAYMENT-RESPONSE","X-PAYMENT-RESPONSE"]){let i=e.headers.get(a);if(i===null)continue;let s=bn(i);if(!s||typeof s.transaction!="string"||!rn.test(s.transaction)||s.success!==void 0&&s.success!==!0||s.network!==void 0&&s.network!==t||s.settlementStatus!==void 0&&s.settlementStatus!=="settled"||[s.errorReason,s.errorCode,s.errorMessage].some(c=>c!==void 0&&c!=="")||s.payer!==void 0&&!K(s.payer,n)||[s.amountAtomic,s.attemptedAmountAtomic].some(c=>c!==void 0&&c!==r)||s.assetDecimals!==void 0&&s.assetDecimals!==6||s.success===!0&&s.network===t||o&&!K(s.transaction,o))return;o=s.transaction}return o}async function lo(e,t){if(!e.ok||!e.body)throw new Error("RPC response unavailable");let n=e.body.getReader(),r=()=>{n.cancel().catch(()=>{})};t.addEventListener("abort",r,{once:!0});let o=[],a=0;try{for(;;){if(t.aborted)throw new Error("RPC confirmation aborted");let c=await n.read();if(c.done)break;if(a+=c.value.byteLength,a>1048576)throw new Error("RPC response too large");o.push(c.value)}let i=new Uint8Array(a),s=0;for(let c of o)i.set(c,s),s+=c.byteLength;return JSON.parse(new TextDecoder().decode(i))}finally{t.removeEventListener("abort",r),r()}}async function mr(e,t,n,r){if(t.settlementStatus!=="unconfirmed"||n?.kind!=="eip3009"||r.scheme!=="exact"||r.extra?.assetTransferMethod!==void 0&&r.extra.assetTransferMethod!=="eip3009")return;let o=`eip155:${n.chainId}`,a=et[o],i=D[o],s=r.amount??r.maxAmountRequired;if(!i||!a||r.network!==o||!K(n.asset,a)||!K(r.asset,n.asset)||!ar.test(n.from)||!n.to||!ar.test(n.to)||!K(r.payTo,n.to)||!s||!/^[0-9]+$/.test(s)||s!==n.amount||!rn.test(n.nonce))return;let c=uo(e,o,n.from,s);if(!c)return;let u=new AbortController,d,g=new Promise((m,l)=>{d=setTimeout(()=>{u.abort(),l(new Error("RPC confirmation timed out"))},5e3)}),f=0,y=async(m,l)=>{let v=++f,x=async()=>{let p=await fetch(i,{method:"POST",signal:u.signal,headers:{"Content-Type":"application/json"},body:JSON.stringify({jsonrpc:"2.0",id:v,method:m,params:l})}),h=await lo(p,u.signal);if(!Vt(h)||h.jsonrpc!=="2.0"||h.id!==v||h.error)throw new Error("Invalid RPC response");return h.result};return Promise.race([x(),g])};try{let[m,l,v]=await Promise.all([y("eth_chainId",[]),y("eth_getTransactionReceipt",[c]),y("eth_getTransactionByHash",[c])]);if(!nn(m)||BigInt(m)!==BigInt(n.chainId)||!Vt(l)||!Vt(v)||l.status!=="0x1"||!K(l.transactionHash,c)||!K(v.hash,c)||typeof l.blockHash!="string"||!rn.test(l.blockHash)||!K(v.blockHash,l.blockHash)||!nn(l.blockNumber)||v.blockNumber!==l.blockNumber||!nn(l.transactionIndex)||v.transactionIndex!==l.transactionIndex||v.chainId!==void 0&&(!nn(v.chainId)||BigInt(v.chainId)!==BigInt(n.chainId)))return;let x=Number(BigInt(l.transactionIndex));if(!Number.isSafeInteger(x))return;let p=await y("eth_getBlockByNumber",[l.blockNumber,!1]);if(!Vt(p)||!K(p.hash,l.blockHash)||p.number!==l.blockNumber||!Array.isArray(p.transactions)||!K(p.transactions[x],c)||!Array.isArray(l.logs))return;let h=!1,_=!1;for(let S of l.logs){if(!Vt(S)||S.removed!==void 0&&S.removed!==!1||!K(S.blockHash,l.blockHash)||S.blockNumber!==l.blockNumber||!K(S.transactionHash,c)||S.transactionIndex!==l.transactionIndex||!Array.isArray(S.topics))return;if(K(S.address,n.asset)&&(K(S.topics[0],ao)&&S.topics.length===3&&K(S.topics[1],vn(n.from))&&K(S.topics[2],n.nonce)&&S.data==="0x"&&(h=!0),K(S.topics[0],co)&&K(S.topics[1],vn(n.from)))){if(_||S.topics.length!==3||!K(S.topics[2],vn(n.to))||typeof S.data!="string"||!rn.test(S.data)||BigInt(S.data)!==BigInt(s))return;_=!0}}if(!h||!_)return;t.settlementStatus="settled",t.amountAtomic=s,t.chainConfirmation={source:"eip3009_transaction",finality:"included",network:o,blockHash:l.blockHash,blockNumber:l.blockNumber,authorizationNonce:n.nonce}}catch{}finally{clearTimeout(d),u.abort()}}async function mo(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 a=new Headers(t.headers??void 0);a.set("X-Tab-Voucher",lt(o));let i={...t.redirect!==void 0?{redirect:t.redirect}:{},method:t.method??"GET",headers:a};t.signal&&(i.signal=t.signal),typeof t.body=="string"&&(i.body=t.body);let s;try{s=await fetch(e,i)}catch(c){return{ok:!1,reason:"error",detail:c?.message??String(c)}}return s.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:s.ok?{ok:!0,paid:!0,response:s,amountPaid:n.amount,network:n.network}:{ok:!1,...await It(s)}}var dr={version:2,async parseChallenge(e){return Ht(e)},async pay(e,t,n,r,o){if(Pt(n.extensions))return{ok:!1,reason:"no_payment_options",detail:"unsupported_required_payment_identifier"};if(o.tab){let p=n.options.find(h=>h.scheme==="tab"&&h.network.family==="svm"&&h.payTo===o.tab.counterparty);if(p){let h=await mo(e,t,p,o.tab);if(h)return h}}let a=n.options.filter(p=>!ee(p,p.network.family));if(a.length===0)return{ok:!1,reason:"no_payment_options",detail:`no supported payment capability offered: ${n.options.map(p=>ee(p,p.network.family)).join("; ")}`};let i=a.find(p=>p.network.family==="evm"?!!r.evm:p.network.family==="svm"?!!r.solana:!1);if(!i)return{ok:!1,reason:"unsupported_network"};let s=o.timeoutMs??15e3,c=o.responseTimeoutMs??12e4,u=new AbortController,d=setTimeout(()=>u.abort(),s),g=!1,f,y,m=(p,h)=>{g=!0,y=p,f=h,clearTimeout(d),d=setTimeout(()=>u.abort(),c)},l=or({wallets:r,preferredNetwork:i.network.caip2,maxAmountAtomic:o.maxAmountAtomic,fetch:globalThis.fetch,onPaymentDispatched:m}),v=t.signal?AbortSignal.any([t.signal,u.signal]):u.signal,x={...t.redirect!==void 0?{redirect:t.redirect}:{},method:t.method??"GET",headers:t.headers,signal:v};typeof t.body=="string"&&(x.body=t.body);try{let p=await l.fetch(e,x);if(clearTimeout(d),!g)return p.ok?{ok:!0,paid:!1,response:p}:{ok:!1,response:p,...await It(p)};let h=rr(p);h?.settlementStatus==="unconfirmed"&&y&&await mr(p,h,f,y);let _=typeof h?.transaction=="string"?h.transaction:void 0;if(h?.settlementStatus!=="settled"){let S=h?.settlementStatus==="failed";return{ok:!1,reason:S?"settlement_failed":"payment_unconfirmed",detail:`${S?"Merchant reports settlement failure":"Settlement is unconfirmed"}${h?.errorReason||h?.errorCode?` (${h.errorReason??h.errorCode})`:""}. Recover or reconcile this same payment; do not create a new authorization.`,response:p,txSignature:_,paymentReceipt:h}}return p.ok?{ok:!0,paid:!0,response:p,amountPaid:y?.amount??y?.maxAmountRequired??i.amount,network:_e(y?.network??"")??i.network,txSignature:_,paymentReceipt:h}:{ok:!1,reason:"delivery_failed",detail:`Payment settled, but the merchant returned HTTP ${p.status}. Recover the result for this same payment; do not create a new authorization.`,response:p,txSignature:_,paymentReceipt:h}}catch(p){clearTimeout(d);let h=p;if(h?.name==="AbortError"){if(!g)return{ok:!1,reason:"timeout"};let _=await tn(f,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 g?{ok:!1,reason:"payment_unconfirmed",detail:`${h?.message??String(p)}. Recover or reconcile this same payment; do not create a new authorization.`}:{ok:!1,reason:"error",detail:h?.message??String(p)}}}};var pr=require("viem");var po={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 fo(){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 go(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),a=String(r+(t.maxTimeoutSeconds??60)),i={from:e.address,to:t.payTo,value:t.amount,validAfter:o,validBefore:a,nonce:await fo()},s=Et[t.network.caip2];if(s===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:s,verifyingContract:(0,pr.getAddress)(t.asset)},types:po,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:s}}}async function Sn(e,t,n){try{let r;for(let o of e.options){let a=o.network.family==="evm"&&!!t.evm||o.network.family==="svm"&&!!t.solana;if(o.scheme!=="exact"){a&&(r=o.scheme);continue}if(o.network.family==="evm"&&t.evm){let i=await t.evm;return await ho(o,i,n)}if(o.network.family==="svm"&&t.solana){let i=await t.solana;return await yo(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:te(r)}}}async function ho(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,a=r.version;if(typeof o!="string"||o.length===0||typeof a!="string"||a.length===0)return{ok:!1,reason:"merchant_rejected",detail:"v1 challenge missing exact-scheme EIP-712 domain (extra.name / extra.version)"};let i=e.network.bare,{payment:s,settlementProbe:c}=await go(t,e,i);return{ok:!0,headerValue:Buffer.from(JSON.stringify(s),"utf8").toString("base64"),option:e,settlementProbe:c}}async function yo(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,a={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},s=await pe().buildTransaction(a,t,n.solanaRpcUrl),c={x402Version:1,scheme:e.scheme,network:o,payload:{transaction:s.serialized}};return{ok:!0,headerValue:Buffer.from(JSON.stringify(c),"utf8").toString("base64"),option:e,settlementProbe:s.settlementProbe}}function Ao(e){let t=[];for(let n of e){if(!n||typeof n!="object")continue;let r=n,o=_e(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 fr={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=Ao(n);return r.length===0?null:{x402Version:1,options:r}},async pay(e,t,n,r,o){let a,i=new AbortController,s=!1,c,u;try{let d=o.timeoutMs??15e3;a=setTimeout(()=>i.abort(),d);let g=await Sn(n,r,o);if(!g.ok)return{ok:!1,reason:g.reason,detail:g.detail};let f=g.headerValue,y=g.option;u=y,c=g.settlementProbe;let m=new Headers(t.headers??void 0);m.set("X-PAYMENT",f);let l=t.signal!=null?AbortSignal.any([t.signal,i.signal]):i.signal,v={...t.redirect!==void 0?{redirect:t.redirect}:{},method:t.method,headers:m,signal:l};typeof t.body=="string"&&(v.body=t.body),s=!0,clearTimeout(a);let x=o.responseTimeoutMs??12e4;a=setTimeout(()=>i.abort(),x);let p=await fetch(e,v);return p.ok?{ok:!0,paid:!0,response:p,amountPaid:y.amount,network:y.network,txSignature:bo(p)}:{ok:!1,...await It(p)}}catch(d){if(d instanceof Error&&d.name==="AbortError"){if(!s)return{ok:!1,reason:"timeout"};let g=await tn(c,u.network,o.solanaRpcUrl);return g.confirmed?{ok:!0,paid:!0,response:void 0,amountPaid:u.amount,network:u.network,txSignature:g.txSignature}:{ok:!1,reason:"payment_unconfirmed",detail:g.detail}}return{ok:!1,reason:"error",detail:te(d)}}finally{a!==void 0&&clearTimeout(a)}}};function bo(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}}var hr=Y(require("tweetnacl"),1);var wn=require("@solana/web3.js"),gr=Symbol.for("x402:keypair");function _n(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[gr];if(r&&r.secretKey&&r.publicKey)return{publicKey:r.publicKey,signMessage:async o=>hr.sign.detached(o,r.secretKey)}}return null}var yr=require("@x402/core/http"),vo=[dr,fr];async function So(e){let t=async(o,a)=>({response:await fetch(o,a),paymentUrl:o,paymentInit:a}),n=_n(e);if(!n)return t;let r;try{r=await import("@x402/extensions/sign-in-with-x")}catch(o){return console.warn(`[x402] SIW-X unavailable \u2014 @x402/extensions failed to load; SIW-X merchants will not authenticate. ${te(o)}`),t}return async(o,a)=>{let i=new Request(o,a),s=i.clone(),c=await fetch(i),u={response:c,paymentUrl:o,paymentInit:a};if(c.status!==402)return u;let d=c.headers.get("PAYMENT-REQUIRED");if(!d)return u;let g=(0,yr.decodePaymentRequiredHeader)(d),f=g.extensions?.[r.SIGN_IN_WITH_X];if(!f?.supportedChains)return u;if(s.headers.has(r.SIGN_IN_WITH_X))throw new Error("SIWX authentication already attempted");let y=g.accepts?.[0]?.network,m=f.supportedChains.find(_=>_.chainId===y);if(!m)return u;let l=c.url||i.url;if(c.redirected&&!["GET","HEAD"].includes(i.method))throw new Error("SIWX cannot safely replay a redirected non-GET/HEAD request; use the final resource URL");let v={...f.info,chainId:m.chainId,type:m.type};if(r.assertSIWxChallengeBoundToOrigin(v,l),c.redirected||new URL(l).origin!==new URL(i.url).origin)for(let _ of["authorization","cookie","cookie2","proxy-authorization","host"])s.headers.delete(_);let x=new Headers(s.headers),p={response:c,paymentUrl:l,paymentInit:{...a,headers:Object.fromEntries(x),redirect:"error"}};try{let _=await r.createSIWxPayload(v,n,l);s.headers.set(r.SIGN_IN_WITH_X,r.encodeSIWxHeader(_))}catch{return p}let h=new Request(new Request(l,s),{redirect:"error"});return{...p,response:await fetch(h)}}}async function xn(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,a=e,i=t;try{let c=await(await So(n))(e,{...t});o=c.response,a=c.paymentUrl,i=c.paymentInit}catch(s){return{ok:!1,reason:"error",detail:te(s)}}if(o.status!==402)return{ok:!0,paid:!1,response:o};for(let s of vo){let c=await s.parseChallenge(o.clone());if(c)return s.pay(a,i,c,n,r)}return{ok:!1,reason:"no_payment_options"}}async function Ar(e,t={},n){let r=await je(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,a=BigInt(ue(n.perUnitCap));if(BigInt(o.amountAtomic)>a)return{result:{ok:!1,reason:"budget_exceeded",detail:`seller quotes ${o.amountAtomic} atomic; perUnitCap allows ${a}`},tab:null};let i=n.tabs?.get(o.payTo);return(!i||!i.state.isOpen)&&(i=await Lt({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 xn(e,t,{},{tab:i}),tab:i}}function wo(e){return{counterparty:e.payTo,perRequest:{atomic:e.amountAtomic,human:Se(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 br(e,t={},n={}){let r=n.cache?.get(e);if(r)return{kind:"terms",terms:r};let o=await je(e,t,n.fetchImpl??fetch);if(o.kind!=="offer")return o;if(o.offer.asset!==Rt)return{kind:"error",detail:`tab offer asset is not USDC ("${o.offer.asset}"); refusing to render a human price`};let a=wo(o.offer);return n.cache?.set(e,a),{kind:"terms",terms:a}}0&&(module.exports={DEFAULT_FACILITATOR_URL,DEXTER_VAULT_PROGRAM_ID,FINAL_VOUCHER_V2_RESERVATION_BINDING_DOMAIN,FINAL_VOUCHER_V2_RESERVATION_MEMO_PREFIX,FINAL_VOUCHER_V2_SOLANA_MAINNET_CAIP2,HOSTED_TAB_ACCEPTANCE_RULE,HOSTED_TAB_REGISTRATION_ENCODING,HOSTED_TAB_TERMS_VERSION,HOSTED_TAB_VOUCHER_HEADER,HistoricalV1MigrationRequiredError,INSTRUCTIONS_SYSVAR_ID,LiveSessionExistsError,SECP256R1_PROGRAM_ID,SessionScopeExceededError,TabClosedError,UnsupportedNetworkError,armTabOpen,assertFinalVoucherV2ReservationReceipt,atomicToHuman,buildRegisterSessionKeyInstruction,buildRevokeSessionKeyInstruction,buildSecp256r1VerifyInstruction,buildVoucherMessage,canonicalFinalVoucherV2ReservationNetwork,deriveChannelId,finalVoucherV2Digest,finalVoucherV2ReservationBindingDigest,finalVoucherV2ReservationBindingDigestFromIdentity,finalVoucherV2ReservationIdentity,finalVoucherV2ReservationMemo,finalVoucherV2Sequence,generateSessionKeypair,humanToAtomic,makeSessionKey,openTab,parseAtomic,payUrlWithTab,resolveTabOffer,resolveTabTerms,resumeTab,scopeCapAtomic,sessionRegisterMessage,sessionReplaceV1Message,sessionRevokeMessage,sessionVoucherV2AuthorizationNonce,sessionVoucherV2Nonce,signContextBoundFinalVoucherV2,signVoucher,tabFromGrant,voucherPayloadMessage,voucherToHeader,voucherV2SequenceOrdinal});
|
package/dist/tab/index.d.cts
CHANGED
|
@@ -5,15 +5,15 @@ export { AtomicAmount, HumanAmount, SessionKey, SessionScope, SignedVoucher, Tab
|
|
|
5
5
|
import { PublicKey, Connection } from '@solana/web3.js';
|
|
6
6
|
import { ApprovedSpendGrantParams } from '@dexterai/vault/grant';
|
|
7
7
|
export { ApprovedSpendGrantParams } from '@dexterai/vault/grant';
|
|
8
|
-
import { b as PayResult } from '../types-
|
|
8
|
+
import { b as PayResult } from '../types-CnNjeeZP.cjs';
|
|
9
9
|
export { SessionRegisterMessageArgs, SessionReplaceV1MessageArgs, SessionRevokeMessageArgs, VoucherPayloadBytes, buildVoucherMessage, finalVoucherV2Sequence, sessionRegisterMessage, sessionReplaceV1Message, sessionRevokeMessage, sessionVoucherV2AuthorizationNonce, sessionVoucherV2Nonce, voucherPayloadMessage, voucherV2SequenceOrdinal } from '@dexterai/vault/messages';
|
|
10
10
|
export { BuildRegisterSessionKeyArgs, BuildRevokeSessionKeyArgs, buildRegisterSessionKeyInstruction, buildRevokeSessionKeyInstruction } from '@dexterai/vault/instructions';
|
|
11
11
|
export { buildSecp256r1VerifyInstruction } from '@dexterai/vault/precompile';
|
|
12
12
|
export { DEXTER_VAULT_PROGRAM_ID, INSTRUCTIONS_SYSVAR_ID, SECP256R1_PROGRAM_ID } from '@dexterai/vault/constants';
|
|
13
13
|
export { S as SignContextBoundFinalVoucherV2Input, a as SignContextBoundFinalVoucherV2Result, d as deriveChannelId, g as generateSessionKeypair, m as makeSessionKey, p as parseAtomic, s as scopeCapAtomic, b as signContextBoundFinalVoucherV2, c as signVoucher } from '../sessions-rPdO1CgK.cjs';
|
|
14
|
-
import '../types-
|
|
14
|
+
import '../types-CEOJ9sFp.cjs';
|
|
15
15
|
import '../types-8Q38sHOi.cjs';
|
|
16
|
-
import '../x402-client-
|
|
16
|
+
import '../x402-client-zC0XNdb_.cjs';
|
|
17
17
|
|
|
18
18
|
/**
|
|
19
19
|
* The `Tab` runtime — the live object returned by `openTab()`.
|
package/dist/tab/index.d.ts
CHANGED
|
@@ -5,15 +5,15 @@ export { AtomicAmount, HumanAmount, SessionKey, SessionScope, SignedVoucher, Tab
|
|
|
5
5
|
import { PublicKey, Connection } from '@solana/web3.js';
|
|
6
6
|
import { ApprovedSpendGrantParams } from '@dexterai/vault/grant';
|
|
7
7
|
export { ApprovedSpendGrantParams } from '@dexterai/vault/grant';
|
|
8
|
-
import { b as PayResult } from '../types-
|
|
8
|
+
import { b as PayResult } from '../types-CuTmhygi.js';
|
|
9
9
|
export { SessionRegisterMessageArgs, SessionReplaceV1MessageArgs, SessionRevokeMessageArgs, VoucherPayloadBytes, buildVoucherMessage, finalVoucherV2Sequence, sessionRegisterMessage, sessionReplaceV1Message, sessionRevokeMessage, sessionVoucherV2AuthorizationNonce, sessionVoucherV2Nonce, voucherPayloadMessage, voucherV2SequenceOrdinal } from '@dexterai/vault/messages';
|
|
10
10
|
export { BuildRegisterSessionKeyArgs, BuildRevokeSessionKeyArgs, buildRegisterSessionKeyInstruction, buildRevokeSessionKeyInstruction } from '@dexterai/vault/instructions';
|
|
11
11
|
export { buildSecp256r1VerifyInstruction } from '@dexterai/vault/precompile';
|
|
12
12
|
export { DEXTER_VAULT_PROGRAM_ID, INSTRUCTIONS_SYSVAR_ID, SECP256R1_PROGRAM_ID } from '@dexterai/vault/constants';
|
|
13
13
|
export { S as SignContextBoundFinalVoucherV2Input, a as SignContextBoundFinalVoucherV2Result, d as deriveChannelId, g as generateSessionKeypair, m as makeSessionKey, p as parseAtomic, s as scopeCapAtomic, b as signContextBoundFinalVoucherV2, c as signVoucher } from '../sessions-rPdO1CgK.js';
|
|
14
|
-
import '../types-
|
|
14
|
+
import '../types-Bm6-yPwi.js';
|
|
15
15
|
import '../types-8Q38sHOi.js';
|
|
16
|
-
import '../x402-client-
|
|
16
|
+
import '../x402-client-zC0XNdb_.js';
|
|
17
17
|
|
|
18
18
|
/**
|
|
19
19
|
* The `Tab` runtime — the live object returned by `openTab()`.
|