@dexterai/x402 6.0.0-rc.1 → 6.0.0-rc.2

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/README.md CHANGED
@@ -66,7 +66,7 @@ const { result, tab } = await payUrlWithTab(
66
66
  await tab?.close(); // one on-chain settle pays the seller for everything
67
67
  ```
68
68
 
69
- That's the whole loop: one tap to open, unlimited calls under the cap, one settle to close. The seller's address comes off the wire from the URL's own `402` challenge — never from your code. The `vault` is built once from your passkey-rooted wallet; see [Setup](#setup). The reservation route belongs in your authenticated backend: it returns a voucher-bound receipt only after finality, and the SDK independently verifies the finalized Solana transaction, its Dexter-authority-signed voucher-binding Memo, and finalized Vault/SessionAccount state before releasing the FINAL voucher.
69
+ That's the whole loop: one tap to open, unlimited calls under the cap, one settle to close. The seller's address comes off the wire from the URL's own `402` challenge — never from your code. The `vault` is built once from your passkey-rooted wallet; see [Setup](#setup). The reservation route belongs in your authenticated backend: it returns a voucher-bound receipt once the exact Solana transaction is confirmed. Buyer and seller each independently verify that transaction, its Dexter-authority-signed voucher-binding Memo, and coherent Vault/SessionAccount state anchored at the transaction slot. Processed-only evidence is rejected; finalized evidence is accepted when already present, but paid requests do not wait for finalization. Session close/revoke remains the finalized terminal step.
70
70
 
71
71
  ---
72
72
 
package/REFERENCE.md CHANGED
@@ -134,7 +134,7 @@ const passkeySigner = passkeySignerFromP256Keypair(kp, {
134
134
 
135
135
  ### FINAL V2 reservation provider
136
136
 
137
- Before a FINAL V2 voucher is returned to merchant-facing code, the buyer must reserve its exact increment through `reserveFinalVoucherV2`. This is a money-side effect and normally belongs in the buyer's authenticated backend, not browser JavaScript. The callback must be idempotent for the same input, use `input.idempotencyKey` as its stable caller-operation identity, and return the complete `FinalVoucherV2ReservationReceipt` only after the exact transaction reaches Solana finalized commitment. Provider receipt and lifecycle IDs remain provider-owned; they are not aliases for the SDK idempotency key. The finalized transaction must contain exactly the canonical `settle_voucher(increment=true)` instruction followed by an SPL Memo v2 instruction whose sole account is the Dexter authority signer and whose UTF-8 data is `finalVoucherV2ReservationMemo(input)`. The Solana adapter independently verifies both instructions and coherent finalized Vault/SessionAccount post-state. A merely confirmed receipt, `{ armed: true }`, a broadcast-only response, a provider-only voucher assertion, or a receipt that does not match the voucher is rejected.
137
+ Before a FINAL V2 voucher is returned to merchant-facing code, the buyer must reserve its exact increment through `reserveFinalVoucherV2`. This is a money-side effect and normally belongs in the buyer's authenticated backend, not browser JavaScript. The callback must be idempotent for the same input, use `input.idempotencyKey` as its stable caller-operation identity, and return the complete `FinalVoucherV2ReservationReceipt` only after the exact transaction reaches at least Solana confirmed commitment. Provider receipt and lifecycle IDs remain provider-owned; they are not aliases for the SDK idempotency key. The transaction must contain exactly the canonical `settle_voucher(increment=true)` instruction followed by an SPL Memo v2 instruction whose sole account is the Dexter authority signer and whose UTF-8 data is `finalVoucherV2ReservationMemo(input)`. The Solana adapter independently requires signature status and transaction visibility at least confirmed, verifies both instructions, then reads coherent Vault/SessionAccount post-state at confirmed with `minContextSlot` set only from the independently fetched transaction slot. Processed-only evidence, `{ armed: true }`, a broadcast-only response, a provider-only voucher assertion, or a receipt that does not match the voucher is rejected. A finalized transaction is accepted as stronger evidence if already observed, but this interactive path never polls or waits for finalization.
138
138
 
139
139
  ```ts
140
140
  const { result, tab } = await payUrlWithTab(url, init, {
@@ -179,7 +179,7 @@ app.get('/paid/tick',
179
179
 
180
180
  For a tab-only endpoint, compose the two middlewares directly: `tabChallengeMiddleware` (answers voucher-less requests with the standard x402 challenge, so any agent can discover you) before `tabMiddleware` (verifies the per-charge vouchers). Both are exported from `@dexterai/x402/tab/seller`.
181
181
 
182
- For Native Tab V2, the buyer carries the complete reservation receipt inside the same `X-Tab-Voucher` envelope. Seller middleware treats it only as an untrusted transaction locator: before your handler can deliver, it re-reads the exact SessionAccount PDA at finalized commitment, verifies the active registration and wire version, requires `currentOutstanding` to equal the voucher's uncovered increment, fetches the finalized reservation transaction, recomputes the Memo for the presented voucher, verifies the Dexter authority signature, and reads coherent post-state at or after that transaction's independently observed slot. A cached registration, equal amount, provider assertion, or confirmed-only transaction is not delivery authorization.
182
+ For Native Tab V2, the buyer carries the complete reservation receipt inside the same `X-Tab-Voucher` envelope. Seller middleware treats it only as an untrusted transaction locator: before your handler can deliver, it independently requires the exact reservation signature and transaction at least confirmed, recomputes the Memo for the presented voucher, verifies the Dexter authority signature, and reads the binding, Vault, and exact SessionAccount together at confirmed with `minContextSlot` equal to the independently fetched transaction slot. That coherent read must prove the active registration, V2 wire, exact frontier, and `currentOutstanding` equal to the voucher's uncovered increment. A cached registration, equal amount, provider assertion, processed-only transaction, or missing proof is not delivery authorization. Finalized evidence is accepted when already present; delivery does not wait for it.
183
183
 
184
184
  How the protection works: as the agent spends, accrued charges crystallize on-chain into a reservation against the buyer's wallet — sized to exactly what's accrued, not the whole wallet — so the buyer can't withdraw out from under your charges. One on-chain settle at close pays your `sellerPubkey` for everything metered; you hold no key and sign nothing.
185
185
 
@@ -1,4 +1,4 @@
1
- import { P as PaymentStrategy, a as PayAndFetchOptions, b as PayResult, N as NetworkRef, C as ChallengeOption, c as PaymentChallenge } from '../types-DnhCOjDx.cjs';
1
+ import { P as PaymentStrategy, a as PayAndFetchOptions, b as PayResult, N as NetworkRef, C as ChallengeOption, c as PaymentChallenge } from '../types-CBQKKFxJ.cjs';
2
2
  import { W as WalletSet, g as SettlementProbe, c as SolanaWallet, a as EvmWallet, h as AccessPassClientConfig, P as PaymentAccept } from '../types-BvQpNtFw.cjs';
3
3
  export { j as AccessPassInfo, k as AccessPassTier, C as ChainAdapter, X as X402Error, d as createEvmAdapter, e as createSolanaAdapter } from '../types-BvQpNtFw.cjs';
4
4
  import { SIWxSigner } from '@x402/extensions/sign-in-with-x';
@@ -7,7 +7,7 @@ export { P as PaymentReceipt, f as fireImpressionBeacon, g as getPaymentReceipt,
7
7
  export { FormattedResource as CapabilityAPI, CapabilitySearchOptions, CapabilitySearchResult, NoMatchReason, capabilitySearch } from '@dexterai/x402-core';
8
8
  export { B as BASE_MAINNET, D as DEXTER_FACILITATOR_URL, l as SOLANA_MAINNET, n as USDC_MINT } from '../constants-BLvApMMl.cjs';
9
9
  export { SponsoredAccessSettlementInfo, SponsoredRecommendation } from '@dexterai/x402-ads-types';
10
- import '../types-OHNNM1J2.cjs';
10
+ import '../types-D0IFR4Ro.cjs';
11
11
  import '@dexterai/vault/types';
12
12
 
13
13
  /**
@@ -1,4 +1,4 @@
1
- import { P as PaymentStrategy, a as PayAndFetchOptions, b as PayResult, N as NetworkRef, C as ChallengeOption, c as PaymentChallenge } from '../types-CwLPKV8T.js';
1
+ import { P as PaymentStrategy, a as PayAndFetchOptions, b as PayResult, N as NetworkRef, C as ChallengeOption, c as PaymentChallenge } from '../types-CHQzNDR6.js';
2
2
  import { W as WalletSet, g as SettlementProbe, c as SolanaWallet, a as EvmWallet, h as AccessPassClientConfig, P as PaymentAccept } from '../types-BvQpNtFw.js';
3
3
  export { j as AccessPassInfo, k as AccessPassTier, C as ChainAdapter, X as X402Error, d as createEvmAdapter, e as createSolanaAdapter } from '../types-BvQpNtFw.js';
4
4
  import { SIWxSigner } from '@x402/extensions/sign-in-with-x';
@@ -7,7 +7,7 @@ export { P as PaymentReceipt, f as fireImpressionBeacon, g as getPaymentReceipt,
7
7
  export { FormattedResource as CapabilityAPI, CapabilitySearchOptions, CapabilitySearchResult, NoMatchReason, capabilitySearch } from '@dexterai/x402-core';
8
8
  export { B as BASE_MAINNET, D as DEXTER_FACILITATOR_URL, l as SOLANA_MAINNET, n as USDC_MINT } from '../constants-BLvApMMl.js';
9
9
  export { SponsoredAccessSettlementInfo, SponsoredRecommendation } from '@dexterai/x402-ads-types';
10
- import '../types-OHNNM1J2.js';
10
+ import '../types-D0IFR4Ro.js';
11
11
  import '@dexterai/vault/types';
12
12
 
13
13
  /**
@@ -1 +1 @@
1
- "use strict";var ut=Object.create;var ee=Object.defineProperty;var dt=Object.getOwnPropertyDescriptor;var mt=Object.getOwnPropertyNames;var gt=Object.getPrototypeOf,pt=Object.prototype.hasOwnProperty;var yt=(e,t)=>{for(var n in t)ee(e,n,{get:t[n],enumerable:!0})},Ce=(e,t,n,o)=>{if(t&&typeof t=="object"||typeof t=="function")for(let i of mt(t))!pt.call(e,i)&&i!==n&&ee(e,i,{get:()=>t[i],enumerable:!(o=dt(t,i))||o.enumerable});return e};var te=(e,t,n)=>(n=e!=null?ut(gt(e)):{},Ce(t||!e||!e.__esModule?ee(n,"default",{value:e,enumerable:!0}):n,e)),ht=e=>Ce(ee({},"__esModule",{value:!0}),e);var Xt={};yt(Xt,{LiveSessionExistsError:()=>D,SOLANA_FINAL_VOUCHER_V2_MEMO_PROGRAM_ID:()=>tt,SOLANA_FINAL_VOUCHER_V2_PROGRAM_ID:()=>et,SolanaFinalVoucherV2ReservationError:()=>Y,TX_SIZE_LIMIT_BYTES:()=>j,buildAdapterRegisterInstruction:()=>lt,collectAltAddresses:()=>be,compileComposeV0:()=>we,createSelfPayingComposeSend:()=>ae,createSolanaFinalVoucherV2ReservationVerifier:()=>Qe,createSolanaVaultAdapter:()=>Gt,deriveChannelId:()=>Ue,passkeySignerFromP256Keypair:()=>st,verifySolanaFinalVoucherV2Reservation:()=>Q});module.exports=ht(Xt);var k=require("@solana/web3.js"),at=te(require("bs58"),1);var D=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 N=require("@dexterai/vault/instructions"),ne=require("@dexterai/vault/precompile"),V=require("@dexterai/vault/constants");var x=require("@dexterai/vault/messages");var X=te(require("tweetnacl"),1),J=require("@solana/web3.js"),U=require("@dexterai/vault/messages"),ke=require("@dexterai/vault/session");var Be=require("@noble/hashes/sha256");function Ke(){let e=X.default.sign.keyPair();return{publicKey:e.publicKey,privateKey:e.secretKey}}function Te(e,t,n){return{publicKey:e.publicKey,privateKey:e.privateKey,scope:t,registration:n}}function Ee(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 o=BigInt(t.cumulativeAmount),i=BigInt(e.scope.maxAmountAtomic);if(o>i)throw new Error(`voucher cumulative ${o} exceeds session cap ${i}`);let r=Math.floor(Date.now()/1e3);if(r>=e.scope.expiresAtUnix)throw new Error(`session expired at ${e.scope.expiresAtUnix}, now ${r}`);let s=(0,x.voucherPayloadMessage)({channelId:n,cumulativeAmount:o,sequenceNumber:t.sequenceNumber}),a=X.default.sign.detached(s,e.privateKey);return{payload:t,sessionPublicKey:e.publicKey,sessionRegistration:e.registration,sessionSignature:a}}var ft=/^[0-9a-f]{64}$/,vt=(1n<<64n)-1n;function pe(e){return Buffer.from(e).toString("hex")}function At(e){return Uint8Array.from(Buffer.from(e,"hex"))}function ye(e,t){if(e.length!==t.length)return!1;let n=0;for(let o=0;o<e.length;o+=1)n|=(e[o]??0)^(t[o]??0);return n===0}function Oe(e){if(!ft.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>vt)throw new Error("native_tab_v2_cumulative_amount_invalid");let n=new J.PublicKey(e.programId),o=new J.PublicKey(e.vaultPda),i=new J.PublicKey(e.sessionPda),r=new J.PublicKey(e.seller),[s]=(0,ke.deriveSessionPda)(o,r,n);if(!i.equals(s))throw new Error("native_tab_v2_session_pda_mismatch");let a=e.sessionRegistration,u=new DataView(a.buffer,a.byteOffset,a.byteLength),d=u.getBigUint64(128,!0),m=u.getBigInt64(136,!0),v=u.getBigUint64(180,!0),g=e.nowUnixSeconds??Math.floor(Date.now()/1e3);if(!Number.isSafeInteger(g)||g<0)throw new Error("native_tab_v2_signing_time_invalid");if(!ye(a,(0,U.sessionRegisterMessage)({programId:n,vaultPda:o,sessionPubkey:e.sessionPublicKey,maxAmount:d,expiresAt:m,allowedCounterparty:r,nonce:e.sessionNonce,maxRevolvingCapacity:v})))throw new Error("native_tab_v2_registration_identity_mismatch");if(d===0n||v===0n||v>d||m<=BigInt(g)||m>0x7fffffffffffffffn-604800n||t>d)throw new Error("native_tab_v2_registration_semantics_invalid");(0,U.sessionVoucherV2AuthorizationNonce)(e.sessionNonce);let y=X.default.sign.keyPair.fromSeed(e.sessionPrivateKey.subarray(0,32)),h=!1;try{h=ye(y.publicKey,e.sessionPublicKey)&&ye(e.sessionPrivateKey.subarray(32,64),e.sessionPublicKey)}finally{y.secretKey.fill(0)}if(!h)throw new Error("native_tab_v2_session_key_mismatch");let f=(0,U.finalVoucherV2Sequence)(e.sequenceOrdinal),p=(0,U.contextBoundVoucherV2Message)({programId:n,vaultPda:o,sessionPda:i,seller:r,sessionNonce:e.sessionNonce,channelId:At(e.channelId),cumulativeAmount:t,sequenceNumber:f}),R=X.default.sign.detached(p,e.sessionPrivateKey);return{channelId:e.channelId,cumulativeAmount:e.cumulativeAmountAtomic,sequenceNumber:f,sessionPublicKey:pe(e.sessionPublicKey),sessionSignature:pe(R),sessionRegistration:pe(a)}}function $(e){if(!/^\d+$/.test(e))throw new Error(`atomic amount must be a non-negative integer string, got "${e}"`);return BigInt(e)}function Ue(e){let t=new Uint8Array(8);new DataView(t.buffer).setBigUint64(0,e.nonce,!0);let n=new TextEncoder().encode(e.sellerUrl),o=Be.sha256.create();return o.update(e.vaultPda.toBytes()),o.update(n),o.update(t),o.digest()}var w=require("@dexterai/vault/session"),ct=require("@dexterai/vault/reader"),ge=require("@dexterai/vault");var bt=te(require("tweetnacl"),1),wt=require("@noble/hashes/sha256"),St=require("@noble/curves/p256"),oe=require("@solana/web3.js");var fe=require("@dexterai/vault/session"),ve=require("@dexterai/vault/messages"),he="OTS_SESSION_REGISTER_V2";var z=class extends Error{constructor(n,o){super(`Invalid registration: ${n}${o?` (${o})`:""}`);this.reason=n;this.name="InvalidRegistrationError"}reason};function ie(e){if(e.length!==188)throw new z("wrong_length",`expected 188, got ${e.length}`);let t=new TextDecoder().decode(e.slice(0,he.length));if(t!==he)throw new z("wrong_domain",`got "${t}"`);for(let v=he.length;v<32;v++)if(e[v]!==0)throw new z("wrong_domain",`non-NUL padding at byte ${v}`);let n=new DataView(e.buffer,e.byteOffset,e.byteLength),o=new oe.PublicKey(e.slice(32,64)),i=new oe.PublicKey(e.slice(64,96)),r=e.slice(96,128),s=n.getBigUint64(128,!0),a=n.getBigInt64(136,!0),u=new oe.PublicKey(e.slice(144,176)),d=n.getUint32(176,!0),m=n.getBigUint64(180,!0);if(!o.equals(V.DEXTER_VAULT_PROGRAM_ID))throw new z("wrong_program",`${o.toBase58()} is not ${V.DEXTER_VAULT_PROGRAM_ID.toBase58()}`);if(s===0n)throw new z("cap_zero");return{programId:o,vaultPda:i,sessionPubkey:new Uint8Array(r),maxAmount:s,expiresAt:a,allowedCounterparty:u,nonce:d,maxRevolvingCapacity:m}}var Re=require("@noble/hashes/sha256"),me=require("@noble/hashes/utils");var K=require("@solana/web3.js"),j=1232,Pt=40,Ne=20,$e=4,xt=20,se=1e4,_t=1e6,re=4,M="[tab/solana/compose]";function be(e,t){let n=new Set,o=[],i=t.toBase58();for(let r of e)for(let s of r.keys){if(s.isSigner)continue;let a=s.pubkey.toBase58();a===i||n.has(a)||(n.add(a),o.push(s.pubkey))}return o}function we(e,t,n,o){let i=new K.TransactionMessage({payerKey:t,recentBlockhash:n,instructions:e}).compileToV0Message([o]);return new K.VersionedTransaction(i)}async function ze(e){try{let t=(await e.getRecentPrioritizationFees()).map(o=>o.prioritizationFee).filter(o=>o>0).sort((o,i)=>o-i);if(t.length===0)return se;let n=t[Math.floor(.75*(t.length-1))]??se;return Math.max(se,Math.min(n,_t))}catch{return se}}function Rt(e){let t=e,n=String(t?.message??e??""),o=Array.isArray(t?.logs)?t.logs.join(" "):"";return/already in use/i.test(n)||/already in use/i.test(o)}function Fe(e){let t=e;return(Array.isArray(t?.logs)?t.logs:[]).length===0&&/block height exceeded|has expired|blockhash not found/i.test(String(t?.message??e))}var Ae=e=>new Promise(t=>setTimeout(t,e));function ae(e,t,n={}){let o=n.commitment??"confirmed",i=n.altWarmupPollMs??400,r=n.altReadbackPollMs??400,s=n.altCollisionPollMs??500,a=null,u=null;async function d(h,f){let p=await ze(e),R=[K.ComputeBudgetProgram.setComputeUnitPrice({microLamports:p}),...h],S;for(let P=0;P<re;P+=1){let{blockhash:b,lastValidBlockHeight:O}=await e.getLatestBlockhash(o),I=new K.Transaction().add(...R);I.feePayer=t.publicKey,I.recentBlockhash=b,I.sign(t);try{let c=await e.sendRawTransaction(I.serialize(),{skipPreflight:!1,maxRetries:5}),A=await e.confirmTransaction({signature:c,blockhash:b,lastValidBlockHeight:O},o);if(A.value.err)throw new Error(`${f} tx failed on-chain: ${JSON.stringify(A.value.err)}`);return c}catch(c){if(Fe(c)&&P<re-1){console.warn(`${M} ${f} tx expired before landing (attempt ${P+1}) \u2014 rebroadcasting with a fresh blockhash`),S=c;continue}throw c}}throw S??new Error(`${f} tx did not land after rebroadcast attempts`)}async function m(h){for(let f=0;f<xt;f+=1){let p=await e.getSlot("finalized");if(p>h)return p;await Ae(s)}throw new Error(`ALT collision retry: finalized slot never advanced past ${h}`)}async function v(h){for(let f=0;f<Pt;f+=1){if(await e.getSlot(o)>h)return;await Ae(i)}throw new Error(`ALT warmup timed out: preflight (${o}) slot never passed lastExtendedSlot ${h}`)}async function g(h){if(a)return a;let f=be(h,t.publicKey),p=null,R=null,S=-1;for(let b=0;b<$e;b+=1){let O=S<0?await e.getSlot("finalized"):await m(S),[I,c]=K.AddressLookupTableProgram.createLookupTable({authority:t.publicKey,payer:t.publicKey,recentSlot:O}),A=K.AddressLookupTableProgram.extendLookupTable({payer:t.publicKey,authority:t.publicKey,lookupTable:c,addresses:f});try{R=await d([I,A],"ALT create/extend"),p=c;break}catch(L){if(Rt(L)&&b<$e-1){S=O,console.warn(`${M} ALT address collision at slot ${O} (attempt ${b+1}) \u2014 retrying create with a fresh finalized slot`);continue}throw L}}if(!p||!R)throw new Error("ALT create exhausted retries after repeated address collisions");let P=await e.getAddressLookupTable(p);for(let b=0;b<Ne&&!P.value;b+=1)await Ae(r),P=await e.getAddressLookupTable(p);if(!P.value)throw new Error(`ALT ${p.toBase58()} not visible after ${Ne} read polls (${R})`);return await v(P.value.state.lastExtendedSlot),a=P.value,u=p,console.info(`${M} ephemeral compose ALT ready: ${p.toBase58()} (${f.length} addresses, createTx ${R})`),a}async function _(h){let f=await ze(e),p=[K.ComputeBudgetProgram.setComputeUnitPrice({microLamports:f}),...h],R=await g(p),S;for(let P=0;P<re;P+=1){let{blockhash:b,lastValidBlockHeight:O}=await e.getLatestBlockhash(o),I;try{let c=we(p,t.publicKey,b,R);c.sign([t]),I=c.serialize()}catch(c){throw/overrun|too large/i.test(String(c?.message??c))?new Error(`composed revoke-then-register v0 tx exceeds the ${j}B wire cap \u2014 too many sibling PDAs outside the lookup table`):c}if(I.length>j)throw new Error(`composed revoke-then-register v0 tx ${I.length}B exceeds the ${j}B wire cap \u2014 too many sibling PDAs outside the lookup table`);try{let c=await e.sendRawTransaction(I,{skipPreflight:!1,maxRetries:5}),A=await e.confirmTransaction({signature:c,blockhash:b,lastValidBlockHeight:O},o);if(A.value.err)throw new Error(`composed tx failed on-chain: ${JSON.stringify(A.value.err)}`);return c}catch(c){if(Fe(c)&&P<re-1){console.warn(`${M} compose tx expired before landing (attempt ${P+1}, priorityFee ${f}) \u2014 rebroadcasting with a fresh blockhash`),S=c;continue}let A=Array.isArray(c?.logs)?c.logs:[];throw A.length?new Error(`${c?.message??c} | ${A.join(" | ")}`):c}}throw S instanceof Error?S:new Error("compose tx did not land after rebroadcast attempts")}async function y(){if(u)try{let h=K.AddressLookupTableProgram.deactivateLookupTable({lookupTable:u,authority:t.publicKey}),f=await d([h],"ALT deactivate");console.info(`${M} ephemeral compose ALT deactivated: ${u.toBase58()} (${f}) \u2014 rent reclaimable via close_lookup_table after the deactivation cooldown`)}catch(h){console.warn(`${M} ALT deactivate failed for ${u?.toBase58()} \u2014 rent parks until a later cleanup retries (the compose already landed): ${String(h?.message??h)}`)}}return{send:_,getAltAddress:()=>u,deactivateAlt:y}}var B=require("@solana/web3.js"),ue=require("@noble/hashes/utils"),H=require("@dexterai/vault/credit"),Z=require("@dexterai/vault/constants"),Xe=require("@dexterai/vault/instructions"),je=require("@dexterai/vault/reader"),G=require("@dexterai/vault/session");var xe=require("@noble/hashes/sha256"),F=require("@noble/hashes/utils"),Le=/^[0-9a-f]{64}$/,De=/^[A-Za-z0-9][A-Za-z0-9._:-]{0,199}$/,It=/^[1-9A-HJ-NP-Za-km-z]{32,100}$/,Me="solana:5eykt4UsFv8P8NJdTREpY1vzqKqZKvdp",qe="dexter-native-tab-v2-reservation/v1",Vt=`${qe}:`;function Se(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(Se);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,Se(n)]));throw new Error("canonical_value_unsupported")}function He(e){return JSON.stringify(Se(e))}function Pe(e){if(e==="solana:mainnet"||e===Me)return Me;throw new Error("native_tab_v2_reservation_network_unsupported")}function Ge(e){return(0,F.bytesToHex)((0,xe.sha256)(new TextEncoder().encode(He({channelId:e.payload.channelId,cumulativeAmount:e.payload.cumulativeAmount,sequenceNumber:e.payload.sequenceNumber,sessionPublicKey:(0,F.bytesToHex)(e.sessionPublicKey),sessionSignature:(0,F.bytesToHex)(e.sessionSignature),sessionRegistration:(0,F.bytesToHex)(e.sessionRegistration)}))))}function Ct(e){return(0,F.bytesToHex)((0,xe.sha256)(new TextEncoder().encode(He({contract:qe,network:Pe(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 kt(e){let t=Ge(e.voucher);return Ct({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 We(e){return`${Vt}${kt(e)}`}function C(e){throw new Error(`native_tab_v2_reservation_receipt_invalid:${e}`)}function ce(e,t){(!Number.isSafeInteger(e)||e<0)&&C(t)}function Je(e,t){(!t||typeof t!="object")&&C("missing");let n=Ge(e.voucher);(!Le.test(e.voucherDigest)||e.voucherDigest!==n)&&C("input_voucher_digest"),e.idempotencyKey!==`native-tab-v2:${n}`&&C("input_idempotency_identity");let o=BigInt(e.voucher.payload.cumulativeAmount),i=BigInt(e.previousCumulativeAtomic),r=BigInt(e.reservationAmountAtomic);(o<=i||o-i!==r||r<=0n)&&C("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)&&C("input_voucher_identity"),t.contract!=="dexter-native-tab-open-receipt/v1"&&t.contract!=="dexter-native-tab-open-receipt/v2"&&C("contract"),Le.test(t.operationId)||C("operation_id"),De.test(t.callerOperationId)||C("caller_operation_id"),It.test(t.transaction)||C("transaction"),t.commitment!=="finalized"&&C("commitment"),ce(t.confirmationSlot,"confirmation_slot"),ce(t.postStateSlot,"post_state_slot"),(t.confirmationSlot===0||t.postStateSlot<t.confirmationSlot)&&C("post_state_slot");let s,a;try{s=Pe(e.network),a=Pe(t.network)}catch{return C("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,F.bytesToHex)(e.voucher.sessionPublicKey)||t.voucherDigest!==n||t.cumulativeAmountAtomic!==e.voucher.payload.cumulativeAmount||t.sequenceNumber!==e.voucher.payload.sequenceNumber||!De.test(t.providerReceiptId)||t.reservationAmountAtomic!==e.reservationAmountAtomic||t.currentOutstandingBeforeAtomic!=="0"||t.currentOutstandingAfterAtomic!==e.reservationAmountAtomic)&&C("economic_identity"),ce(t.pendingVoucherCountBefore,"pending_voucher_count_before"),ce(t.pendingVoucherCountAfter,"pending_voucher_count_after"),t.contract==="dexter-native-tab-open-receipt/v1"?t.callerOperationId!==e.idempotencyKey&&C("idempotency_key"):(t.rootOperationId!==e.idempotencyKey||!Number.isSafeInteger(t.generation)||Number(t.generation)<2||!t.predecessorCallerOperationId||!t.predecessorLifecycleOperationId||!t.predecessorReleaseDigest||!t.stableReservationId||!t.economicEffectDigest)&&C("successor_identity")}var Kt=Uint8Array.from([56,67,4,209,238,143,0,129]),Tt=74,Ye=new Set([1,2]),Et=188,Ze=new B.PublicKey("MemoSq4gqABAXKb96qnH8TysNcWxMyWCqXgDLGmfcHr"),Ot=(()=>{let e=Buffer.alloc(32);return e.write("OTS_SESSION_REGISTER_V2","ascii"),e})(),Y=class extends Error{constructor(n,o){super(`native_tab_v2_solana_reservation_invalid:${n}`+(o?`:${o}`:""));this.code=n;this.name="SolanaFinalVoucherV2ReservationError"}code};function l(e,t){throw new Y(e,t)}function T(e,t){try{return new B.PublicKey(e)}catch{return l(t)}}function le(e,t){return e.length===t.length&&e.every((n,o)=>n===t[o])}async function Bt(e){let t=await e.connection.getTransaction(e.signature,{commitment:e.commitment,maxSupportedTransactionVersion:0});if(!t)return null;t.meta||l("transaction_meta_missing");let n=t.transaction.message,o=n.version===0?n.getAccountKeys({accountKeysFromLookups:t.meta.loadedAddresses??null}):n.getAccountKeys(),i=(r,s)=>{let a=o.get(r);return a||l(s),a};return{slot:t.slot,err:t.meta.err,signatures:[...t.transaction.signatures],accountKeys:Array.from({length:o.length},(r,s)=>({address:i(s,"transaction_account_key").toBase58(),signer:n.isAccountSigner(s),writable:n.isAccountWritable(s)})),instructions:n.compiledInstructions.map(r=>({programId:i(r.programIdIndex,"transaction_program_id").toBase58(),accounts:r.accountKeyIndexes.map(s=>i(s,"transaction_instruction_account").toBase58()),data:Uint8Array.from(r.data)}))}}function Ut(e,t,n,o){o.length!==Tt&&l("binding_length"),le(o.subarray(0,8),Kt)||l("binding_discriminator");let i=o.readUInt8(8),r=o.readUInt8(9);return Ye.has(i)||l("binding_version"),r!==t&&l("binding_bump"),{address:e.toBase58(),owner:n.toBase58(),version:i,bump:r,swig:new B.PublicKey(o.subarray(10,42)).toBase58(),vault:new B.PublicKey(o.subarray(42,74)).toBase58()}}async function Nt(e){let t=T(e.input.programId,"program_id"),n=T(e.input.buyerSwigAddress,"buyer_swig"),o=T(e.input.vaultPda,"vault_pda"),i=T(e.input.seller,"seller"),[r,s]=(0,H.deriveSwigVaultBindingPda)(n,t),[a]=(0,G.deriveSessionPda)(o,i,t),u=await e.connection.getMultipleAccountsInfoAndContext([r,o,a],{commitment:"finalized",minContextSlot:e.minimumSlot}),[d,m,v]=u.value;d||l("binding_missing"),m||l("vault_missing"),v||l("session_missing");let g,_;try{g=(0,je.decodeVaultFull)(Buffer.from(m.data)),_=(0,G.decodeSessionAccount)(a,v.data)}catch(h){return l("post_state_decode",h instanceof Error?h.message:String(h))}let y=_.session;return{contextSlot:u.context.slot,binding:Ut(r,s,d.owner,Buffer.from(d.data)),vault:{owner:m.owner.toBase58(),exists:g.exists,version:g.version,swigAddress:g.swigAddress,dexterAuthority:g.dexterAuthority,pendingVoucherCount:g.pendingVoucherCount},session:{owner:v.owner.toBase58(),version:_.version,bump:_.bump,vault:_.vault,sessionPublicKey:(0,ue.bytesToHex)(y.sessionPubkey),maxAmount:y.maxAmount,expiresAt:y.expiresAt,seller:y.allowedCounterparty,nonce:y.nonce,spent:y.spent,currentOutstanding:y.currentOutstanding,maxRevolvingCapacity:y.maxRevolvingCapacity,crystallizedCumulative:y.crystallizedCumulative}}}function $t(e){let t=Buffer.from(e.voucher.sessionRegistration);return t.length!==Et&&l("registration_length"),le(t.subarray(0,32),Ot)||l("registration_domain"),{programId:new B.PublicKey(t.subarray(32,64)).toBase58(),vaultPda:new B.PublicKey(t.subarray(64,96)).toBase58(),sessionPublicKey:(0,ue.bytesToHex)(t.subarray(96,128)),maxAmount:t.readBigUInt64LE(128),expiresAt:t.readBigInt64LE(136),seller:new B.PublicKey(t.subarray(144,176)).toBase58(),nonce:t.readUInt32LE(176),maxRevolvingCapacity:t.readBigUInt64LE(180)}}function q(e,t,n){let o=e.accountKeys.filter(i=>i.address===t);return o.length!==1&&l(`${n}_account_key`),o[0]}function zt(e,t,n){(!Number.isSafeInteger(n.slot)||n.slot<=0)&&l("transaction_slot"),n.slot!==t.confirmationSlot&&l("transaction_confirmation_slot"),n.err!==null&&l("transaction_failed"),n.signatures[0]!==t.transaction&&l("transaction_signature"),n.instructions.length!==2&&l("transaction_instruction_count");let o=T(e.programId,"program_id"),i=T(e.buyerSwigAddress,"buyer_swig"),r=T(e.vaultPda,"vault_pda"),s=T(e.seller,"seller"),a=T(e.sessionPda,"session_pda"),[u]=(0,G.deriveSessionPda)(r,s,o),d=(0,H.deriveSwigVaultBindingPda)(i,o)[0],m=(0,Xe.deriveSwigWalletAddress)(i),v=(0,H.deriveGraphConfigPda)(o)[0];a.equals(u)||l("session_pda_derivation");let g=Buffer.from(Z.DISCRIMINATORS.settle_voucher),_=n.instructions.filter(c=>{if(c.programId!==e.programId)return!1;let A=c.data;return A.length>=g.length&&le(A.subarray(0,g.length),g)});_.length!==1&&l("settle_voucher_instruction_count");let y=_[0];n.instructions[0]!==y&&l("settle_voucher_instruction_order");let h=Buffer.from(y.data);h.length!==49&&l("settle_voucher_instruction_length"),h.readBigUInt64LE(8).toString()!==e.reservationAmountAtomic&&l("settle_voucher_amount"),h.readUInt8(16)!==1&&l("settle_voucher_increment"),new B.PublicKey(h.subarray(17,49)).equals(s)||l("settle_voucher_seller"),y.accounts.length<8&&l("settle_voucher_accounts"),[r.toBase58(),null,a.toBase58(),null,i.toBase58(),m.toBase58(),d.toBase58(),v.toBase58()].forEach((c,A)=>{c!==null&&y.accounts[A]!==c&&l(`settle_voucher_account_${A}`)});let p=y.accounts[1];p||l("dexter_authority");let R=q(n,y.accounts[0],"vault"),S=q(n,p,"dexter_authority"),P=q(n,y.accounts[2],"session");(!R.writable||R.signer)&&l("vault_privileges"),S.signer||l("dexter_authority_signature"),(!P.writable||P.signer)&&l("session_privileges");for(let c=3;c<Math.min(y.accounts.length,8);c+=1)q(n,y.accounts[c],`account_${c}`).signer&&l(`settle_voucher_account_${c}_signer`);for(let c=8;c<y.accounts.length;c+=1){let A=q(n,y.accounts[c],`sibling_${c-8}`);(!A.writable||A.signer)&&l("settle_voucher_sibling_privileges")}let b=n.instructions[1];b.programId!==Ze.toBase58()&&l("reservation_memo_program"),(b.accounts.length!==1||b.accounts[0]!==p)&&l("reservation_memo_authority"),q(n,p,"reservation_memo_authority").signer||l("reservation_memo_authority_signature");let I=new TextEncoder().encode(We(e));return le(b.data,I)||l("reservation_memo_digest"),p}function Ft(e,t,n,o){let i=T(e.programId,"program_id"),r=T(e.buyerSwigAddress,"buyer_swig"),s=T(e.vaultPda,"vault_pda"),a=T(e.seller,"seller"),[u,d]=(0,H.deriveSwigVaultBindingPda)(r,i),[m,v]=(0,G.deriveSessionPda)(s,a,i);(!Number.isSafeInteger(o.contextSlot)||o.contextSlot<t)&&l("post_state_slot"),(o.binding.address!==u.toBase58()||o.binding.owner!==e.programId||o.binding.bump!==d||!Ye.has(o.binding.version)||o.binding.swig!==e.buyerSwigAddress||o.binding.vault!==e.vaultPda)&&l("binding_identity"),(o.vault.owner!==e.programId||!o.vault.exists||o.vault.version!==7||o.vault.swigAddress!==e.buyerSwigAddress||o.vault.dexterAuthority!==n)&&l("vault_post_state"),(e.sessionPda!==m.toBase58()||o.session.owner!==e.programId||o.session.version!==1||o.session.bump!==v||o.session.vault!==e.vaultPda||o.session.sessionPublicKey!==(0,ue.bytesToHex)(e.voucher.sessionPublicKey)||o.session.seller!==e.seller||o.session.nonce!==e.sessionNonce||o.session.currentOutstanding.toString()!==e.reservationAmountAtomic)&&l("session_post_state");let g=$t(e);(g.programId!==e.programId||g.vaultPda!==e.vaultPda||g.sessionPublicKey!==o.session.sessionPublicKey||g.seller!==e.seller||g.nonce!==e.sessionNonce||g.maxAmount!==o.session.maxAmount||g.expiresAt!==BigInt(o.session.expiresAt)||g.maxRevolvingCapacity!==o.session.maxRevolvingCapacity)&&l("registration_post_state"),(o.session.spent>o.session.crystallizedCumulative?o.session.spent:o.session.crystallizedCumulative).toString()!==e.previousCumulativeAtomic&&l("session_frontier")}async function Q(e,t,n,o={}){try{Je(t,n)}catch(a){return l("provider_receipt",a instanceof Error?a.message:String(a))}t.network!=="solana:mainnet"&&l("network"),t.programId!==Z.DEXTER_VAULT_PROGRAM_ID.toBase58()&&l("program_id");let i=await(o.readTransaction??Bt)({connection:e,signature:n.transaction,commitment:n.commitment});i||l("transaction_missing");let r=zt(t,n,i),s=await(o.readPostState??Nt)({connection:e,input:t,minimumSlot:i.slot});Ft(t,i.slot,r,s)}function Qe(e,t={}){return(n,o)=>Q(e,n,o,t)}var et=Z.DEXTER_VAULT_PROGRAM_ID,tt=Ze;var _e=require("@noble/curves/p256"),W=require("@noble/hashes/sha256"),de=require("@dexterai/vault"),ot=require("@dexterai/vault/messages"),it="dexter.cash";function Lt(e){return Buffer.from(e).toString("base64").replace(/\+/g,"-").replace(/\//g,"_").replace(/=+$/,"")}function Dt(e,t=`https://${it}`){let o={type:"webauthn.get",challenge:Lt(e),origin:t,crossOrigin:!1};return new TextEncoder().encode(JSON.stringify(o))}function Mt(e=1){let t=(0,W.sha256)(new TextEncoder().encode(it)),n=new Uint8Array(37);return n.set(t,0),n[32]=5,new DataView(n.buffer).setUint32(33,e,!1),n}function nt(e,t){let n=Dt(t),o=Mt(1),i=new Uint8Array(o.length+32);i.set(o,0),i.set((0,W.sha256)(n),o.length);let r=(0,W.sha256)(i);return{signature:_e.p256.sign(r,e.privateKey,{lowS:!0}).toCompactRawBytes(),clientDataJSON:n,authenticatorData:o}}function st(e,t={}){return{credentialId:new Uint8Array(0),publicKey:e.publicKey,signOperation:async n=>{let o=t.resolveAuthorizationContext?await t.resolveAuthorizationContext(n.slice()):qt(n);if(!o){if(t.allowLegacyOperationHash===!0)return nt(e,(0,W.sha256)(n));throw new Error("passkey_authorization_context_required")}let i=t.ceremonyNonce?t.ceremonyNonce():_e.p256.utils.randomPrivateKey();if(i.length!==32)throw new Error("ceremonyNonce must be exactly 32 bytes");let r=(0,de.buildPasskeyAuthorizationChallenge)({programId:o.programId,vault:o.vault,nonce:o.nonce,operationHash:(0,W.sha256)(n),ceremonyNonce:i});return nt(e,r)}}}function qt(e){let t=(0,de.classifyPasskeyAuthorizationOperation)(e);return t.kind==="session_register_v2"?{programId:t.fields.programId,vault:t.fields.vault,nonce:BigInt((0,ot.sessionVoucherV2AuthorizationNonce)(t.fields.registrationNonce))}:t.kind==="session_replace_v1"?{programId:t.fields.programId,vault:t.fields.vault,nonce:t.fields.authorizationNonce}:null}async function Ht({connection:e,vaultPda:t,allowedCounterparty:n,programId:o=V.DEXTER_VAULT_PROGRAM_ID,commitment:i="finalized"}){let[r]=(0,w.deriveSessionPda)(t,n,o),s=await e.getMultipleAccountsInfoAndContext([t,r],{commitment:i}),[a,u]=s.value;if(!a)throw new Error("close revocation: vault account not found");if(!a.owner.equals(o))throw new Error("close revocation: vault has the wrong owner");let d=(0,ct.decodeVaultFull)(Buffer.from(a.data));if(!d.exists||d.version!==7)throw new Error("close revocation: Vault V7 required");if(!u)return{kind:"invalidated",contextSlot:s.context.slot,sessionPda:r,reason:"absent"};if(!u.owner.equals(o))throw new Error("close revocation: session has the wrong owner");let m=(0,w.decodeSessionAccount)(r,u.data);if(m.version===0)return{kind:"invalidated",contextSlot:s.context.slot,sessionPda:r,reason:"cleared"};if(m.version!==1)throw new Error("close revocation: live SessionAccount required");if(m.vault!==t.toBase58())throw new Error("close revocation: session belongs to a different vault");if(m.session.allowedCounterparty!==n.toBase58())throw new Error("close revocation: session counterparty mismatch");return{kind:"live",snapshot:{contextSlot:s.context.slot,programId:new k.PublicKey(o),vaultPda:new k.PublicKey(t),sessionPda:r,sessionPubkey:Uint8Array.from(m.session.sessionPubkey),maxAmount:m.session.maxAmount,expiresAt:Buffer.from(u.data).readBigInt64LE(82),allowedCounterparty:new k.PublicKey(n),nonce:m.session.nonce,spent:m.session.spent,currentOutstanding:m.session.currentOutstanding,maxRevolvingCapacity:m.session.maxRevolvingCapacity,crystallizedCumulative:m.session.crystallizedCumulative,lastLockedSequence:m.session.lastLockedSequence,expectedPendingVoucherCount:d.pendingVoucherCount}}}function lt(e){return(0,N.buildRegisterSessionKeyInstruction)({vaultPda:e.vaultPda,sessionPubkey:e.sessionPubkey,maxAmount:e.maxAmount,maxRevolvingCapacity:e.maxRevolvingCapacity,expiresAt:e.expiresAt,allowedCounterparty:e.allowedCounterparty,nonce:e.nonce,swigAddress:e.swigAddress,vaultUsdcAta:e.vaultUsdcAta,clientDataJSON:e.clientDataJSON,authenticatorData:e.authenticatorData,payer:e.payer,siblingSessionPdas:e.siblingSessionPdas})}var Ie=class{network="solana:mainnet";sessionVoucherVersion=2;swigAddress;vaultPda;connection;vaultPdaKey;passkey;feePayer;confirmOptions;seams;pendingCloseRevocations=new Map;completedCloseRevocations=new Map;constructor(t){this.connection=t.connection,this.swigAddress=typeof t.swigAddress=="string"?t.swigAddress:t.swigAddress.toBase58(),this.vaultPdaKey=typeof t.vaultPda=="string"?new k.PublicKey(t.vaultPda):t.vaultPda,this.vaultPda=this.vaultPdaKey.toBase58(),this.passkey=t.passkeySigner,this.feePayer=t.feePayer,this.confirmOptions=t.confirmOptions??{commitment:"confirmed"},this.seams=t.seams??{}}closeRevocationKey(t){let n=ie(t.registration),[o]=(0,w.deriveSessionPda)(this.vaultPdaKey,n.allowedCounterparty,V.DEXTER_VAULT_PROGRAM_ID);return[o.toBase58(),(0,me.bytesToHex)(n.sessionPubkey),n.nonce.toString()].join(":")}async readCloseTargetState(t){let n={connection:this.connection,vaultPda:this.vaultPdaKey,allowedCounterparty:t,programId:V.DEXTER_VAULT_PROGRAM_ID,commitment:"finalized"};if(this.seams.readCloseRevocationTargetState)return this.seams.readCloseRevocationTargetState(n);if(this.seams.readCloseRevocationSnapshot)try{return{kind:"live",snapshot:await this.seams.readCloseRevocationSnapshot(n)}}catch{return null}return Ht(n)}targetInvalidated(t,n){if(t.kind==="invalidated")return!0;let o=t.snapshot,[i]=(0,w.deriveSessionPda)(this.vaultPdaKey,n.allowedCounterparty,V.DEXTER_VAULT_PROGRAM_ID);if(!o.programId.equals(V.DEXTER_VAULT_PROGRAM_ID)||!o.vaultPda.equals(this.vaultPdaKey)||!o.sessionPda.equals(i)||!o.allowedCounterparty.equals(n.allowedCounterparty))throw new Error("session revocation snapshot identity mismatch");if(!Buffer.from(o.sessionPubkey).equals(Buffer.from(n.sessionPubkey))||o.nonce!==n.nonce)return!0;if(o.maxAmount!==n.maxAmount||o.expiresAt!==n.expiresAt||o.maxRevolvingCapacity!==n.maxRevolvingCapacity)throw new Error("session revocation snapshot identity mismatch");return!1}rememberCompletedClose(t,n){let o=Uint8Array.from(n);return this.pendingCloseRevocations.delete(t),this.completedCloseRevocations.set(t,o),Uint8Array.from(o)}async reconcilePendingClose(t,n,o){let i=!1,r=null;try{let u=await this.connection.getSignatureStatuses([t.signature],{searchTransactionHistory:!0});if(i=!0,r=u.value[0]??null,r?.confirmationStatus==="finalized")return r.err===null?"complete":"fresh_allowed"}catch{}let s=!1;try{let u=await this.connection.getTransaction(t.signature,{commitment:"finalized",maxSupportedTransactionVersion:0});if(s=!0,u)return!u.meta||!Object.prototype.hasOwnProperty.call(u.meta,"err")?"unresolved":u.meta.err===null?"complete":"fresh_allowed"}catch{}let a=await this.readCloseTargetState(n.allowedCounterparty).catch(()=>null);if(a&&this.targetInvalidated(a,n))return"complete";if(o&&i&&r===null)try{if((await this.connection.isBlockhashValid(t.blockhash,{commitment:"confirmed"})).value)return await this.connection.sendRawTransaction(t.serializedTransaction,{skipPreflight:!1,preflightCommitment:this.confirmOptions.preflightCommitment??this.confirmOptions.commitment})!==t.signature?"unresolved":(await this.connection.confirmTransaction({signature:t.signature,blockhash:t.blockhash,lastValidBlockHeight:t.lastValidBlockHeight},"finalized")).value.err===null?"complete":"fresh_allowed"}catch{}if(i&&r!==null||!i||!s||t.finalizedHistoryFloorSlot===null)return"unresolved";try{let[u,d]=await Promise.all([this.connection.getBlockHeight("finalized"),this.connection.getMinimumLedgerSlot()]);if(u>t.lastValidBlockHeight&&d<=t.finalizedHistoryFloorSlot)return"fresh_allowed"}catch{}return"unresolved"}async authorizeSession(t,n){let o=new k.PublicKey(t.allowedCounterparty),i=$(t.revolvingCapacityAtomic??t.maxAmountAtomic),s=await(this.seams.fetchSession??w.fetchSessionAccount)(this.connection,this.vaultPdaKey,o),a=s!==null&&(0,w.isSessionLive)(s);if(a&&(n?.onLiveSession??"error")!=="replace"){let f=s.session.spent,p=s.session.crystallizedCumulative;throw new D({allowedCounterparty:t.allowedCounterparty,sessionPubkeyHex:(0,me.bytesToHex)(s.session.sessionPubkey),expiresAtUnix:s.session.expiresAt,spentAtomic:f.toString(),crystallizedCumulativeAtomic:p.toString(),currentOutstandingAtomic:s.session.currentOutstanding.toString(),frontierAtomic:(f>p?f:p).toString()})}let d=await(this.seams.fetchPasskeyAuthorization??ge.fetchPasskeyAuthorizationState)(this.connection,this.vaultPdaKey,V.DEXTER_VAULT_PROGRAM_ID);if(d===null||d.version!==1||!d.vault.equals(this.vaultPdaKey))throw new Error("passkey_authorization_guard_unavailable");let m=Ke(),v=(0,x.sessionVoucherV2Nonce)(d.nonce),g=(0,x.sessionRegisterMessage)({programId:V.DEXTER_VAULT_PROGRAM_ID,vaultPda:this.vaultPdaKey,sessionPubkey:m.publicKey,maxAmount:$(t.maxAmountAtomic),maxRevolvingCapacity:i,expiresAt:BigInt(t.expiresAtUnix),allowedCounterparty:o,nonce:v}),_=a?(0,x.sessionReplaceV1Message)({programId:V.DEXTER_VAULT_PROGRAM_ID,vaultPda:this.vaultPdaKey,sessionPda:new k.PublicKey(s.address),authorizationNonce:d.nonce,retired:{sessionPubkey:s.session.sessionPubkey,maxAmount:s.session.maxAmount,expiresAt:BigInt(s.session.expiresAt),allowedCounterparty:new k.PublicKey(s.session.allowedCounterparty),nonce:s.session.nonce,spent:s.session.spent,currentOutstanding:s.session.currentOutstanding,maxRevolvingCapacity:s.session.maxRevolvingCapacity,crystallizedCumulative:s.session.crystallizedCumulative,lastLockedSequence:s.session.lastLockedSequence},replacement:{sessionPubkey:m.publicKey,maxAmount:$(t.maxAmountAtomic),expiresAt:BigInt(t.expiresAtUnix),allowedCounterparty:o,nonce:v,maxRevolvingCapacity:i}}):g,y=await this.passkey.signOperation(_);if(a)await this.sendAtomicReplace(t,o,m.publicKey,v,i,y);else{if((0,ge.validatePasskeyAuthorizationClientData)({clientDataJSON:y.clientDataJSON,operationMessage:_,expectedVault:this.vaultPdaKey,expectedProgramId:V.DEXTER_VAULT_PROGRAM_ID}).nonce!==d.nonce)throw new Error("passkey_authorization_guard_changed");await this.sendBareRegister(t,o,m.publicKey,v,i,y)}return await(this.seams.waitForSession??w.waitForSession)(this.connection,this.vaultPdaKey,o,{expectedSessionPubkey:m.publicKey,timeoutMs:2e4}),Te(m,t,g)}async sendBareRegister(t,n,o,i,r,s){let{signature:a,clientDataJSON:u,authenticatorData:d}=s,m=rt(d,(0,Re.sha256)(u)),v=(0,ne.buildSecp256r1VerifyInstruction)(this.passkey.publicKey,a,m),g=this.seams.fetchSessions??w.fetchVaultSessionAccounts,_=(0,w.sessionPdasOf)(await g(this.connection,this.vaultPdaKey)),h=await(this.seams.resolveUsdcAta??w.resolveVaultUsdcAta)(this.connection,new k.PublicKey(this.swigAddress)),f=lt({vaultPda:this.vaultPdaKey,swigAddress:new k.PublicKey(this.swigAddress),sessionPubkey:o,maxAmount:$(t.maxAmountAtomic),maxRevolvingCapacity:r,expiresAt:BigInt(t.expiresAtUnix),allowedCounterparty:n,nonce:i,clientDataJSON:u,authenticatorData:d,payer:this.feePayer.publicKey,siblingSessionPdas:_,vaultUsdcAta:h}),p=new k.Transaction().add(v,f);p.feePayer=this.feePayer.publicKey;let{blockhash:R}=await this.connection.getLatestBlockhash(this.confirmOptions.commitment);p.recentBlockhash=R,p.sign(this.feePayer);let S=await this.connection.sendRawTransaction(p.serialize(),{skipPreflight:!1,preflightCommitment:this.confirmOptions.preflightCommitment??this.confirmOptions.commitment});await this.connection.confirmTransaction({signature:S,blockhash:R,lastValidBlockHeight:(await this.connection.getLatestBlockhash(this.confirmOptions.commitment)).lastValidBlockHeight},this.confirmOptions.commitment)}async sendAtomicReplace(t,n,o,i,r,s){let u=await(this.seams.resolveUsdcAta??w.resolveVaultUsdcAta)(this.connection,new k.PublicKey(this.swigAddress)),d=this.seams.composeSend?{send:this.seams.composeSend,deactivateAlt:async()=>{}}:ae(this.connection,this.feePayer,{commitment:this.confirmOptions.commitment});try{await(0,w.composeRevokeThenRegister)({connection:this.connection,vaultPda:this.vaultPdaKey,allowedCounterparty:n,registerArgs:{sessionPubkey:o,maxAmount:$(t.maxAmountAtomic),maxRevolvingCapacity:r,expiresAt:BigInt(t.expiresAtUnix),nonce:i,swigAddress:new k.PublicKey(this.swigAddress),vaultUsdcAta:u,payer:this.feePayer.publicKey},registerCeremony:{clientDataJSON:s.clientDataJSON,authenticatorData:s.authenticatorData,signature:s.signature},credentialPublicKey:this.passkey.publicKey,send:d.send,fetchSession:this.seams.fetchSession,fetchSessions:this.seams.fetchSessions,fetchPasskeyAuthorization:this.seams.fetchPasskeyAuthorization})}finally{d.deactivateAlt()}}async signWithSession(t,n){let o=await Wt(n.channelId),i=ie(t.registration);if((i.nonce&2147483648)!==0){let[r]=(0,w.deriveSessionPda)(i.vaultPda,i.allowedCounterparty,i.programId),s=Oe({programId:i.programId.toBase58(),vaultPda:i.vaultPda.toBase58(),sessionPda:r.toBase58(),seller:i.allowedCounterparty.toBase58(),sessionNonce:i.nonce,channelId:(0,me.bytesToHex)(o),cumulativeAmountAtomic:n.cumulativeAmount,sequenceOrdinal:n.sequenceNumber,sessionPrivateKey:t.privateKey,sessionPublicKey:t.publicKey,sessionRegistration:t.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"))}}return Ee(t,n,o)}async signOpenTab(t,n){return t.registration}async verifyFinalVoucherV2Reservation(t,n){await Q(this.connection,t,n)}async signCloseTab(t,n,o){let i=ie(t.registration);if(!i.vaultPda.equals(this.vaultPdaKey)||!Buffer.from(i.sessionPubkey).equals(Buffer.from(t.publicKey)))throw new Error("session registration identity mismatch");let r=this.closeRevocationKey(t),s=this.completedCloseRevocations.get(r);if(s)return Uint8Array.from(s);let a=this.pendingCloseRevocations.get(r);if(a){let E=await this.reconcilePendingClose(a,i,!0);if(E==="complete")return this.rememberCompletedClose(r,a.message);if(E==="unresolved")throw new Error(`session revoke finality unresolved for ${a.signature}; retry close`);this.pendingCloseRevocations.delete(r)}let u=await this.readCloseTargetState(i.allowedCounterparty);if(!u)throw new Error("close revocation target state unavailable");if(u.kind==="invalidated"||this.targetInvalidated(u,i))return this.rememberCompletedClose(r,t.registration);let d=u.snapshot,m=$(o);if((d.spent>d.crystallizedCumulative?d.spent:d.crystallizedCumulative)<m)throw new Error("session revocation snapshot is behind final settlement");let g=(0,x.sessionRevokeMessage)(d),{signature:_,clientDataJSON:y,authenticatorData:h}=await this.passkey.signOperation(g),f=rt(h,(0,Re.sha256)(y)),p=(0,ne.buildSecp256r1VerifyInstruction)(this.passkey.publicKey,_,f),R=(0,N.buildRevokeSessionKeyInstruction)({vaultPda:this.vaultPdaKey,allowedCounterparty:d.allowedCounterparty,expectedPendingVoucherCount:d.expectedPendingVoucherCount,clientDataJSON:y,authenticatorData:h}),S=new k.Transaction().add(p,R);S.feePayer=this.feePayer.publicKey;let P=null;try{let E=await this.connection.getSlot("finalized");P=Number.isSafeInteger(E)&&E>=0?E:null}catch{}let{blockhash:b,lastValidBlockHeight:O}=await this.connection.getLatestBlockhash(this.confirmOptions.commitment);if(S.recentBlockhash=b,S.sign(this.feePayer),!S.signature)throw new Error("session revoke transaction is unsigned");let I=Uint8Array.from(S.serialize()),c=at.default.encode(S.signature),A={key:r,message:Uint8Array.from(g),serializedTransaction:I,signature:c,blockhash:b,lastValidBlockHeight:O,finalizedHistoryFloorSlot:P};this.pendingCloseRevocations.set(r,A);let L;try{let E=await this.connection.sendRawTransaction(I,{skipPreflight:!1,preflightCommitment:this.confirmOptions.preflightCommitment??this.confirmOptions.commitment});if(E!==c)throw new Error(`session revoke signature mismatch expected=${c} returned=${E}`);L=await this.connection.confirmTransaction({signature:c,blockhash:b,lastValidBlockHeight:O},"finalized")}catch(E){let Ve=await this.reconcilePendingClose(A,i,!1);if(Ve==="complete")return this.rememberCompletedClose(r,g);throw Ve==="fresh_allowed"?(this.pendingCloseRevocations.delete(r),new Error("session revoke transaction finalized without effect; retry close",{cause:E})):new Error(`session revoke finality unresolved for ${c}; retry close`,{cause:E})}if(L.value.err)throw this.pendingCloseRevocations.delete(r),new Error(`session revoke transaction failed: ${JSON.stringify(L.value.err)}`);return this.rememberCompletedClose(r,g)}};function Gt(e){return new Ie(e)}function rt(e,t){let n=new Uint8Array(e.length+t.length);return n.set(e,0),n.set(t,e.length),n}async function Wt(e){if(/^[0-9a-f]{64}$/i.test(e))return Jt(e);let{sha256:t}=await import("@noble/hashes/sha256");return t(new TextEncoder().encode(e))}function Jt(e){let t=new Uint8Array(e.length/2);for(let n=0;n<t.length;n++)t[n]=parseInt(e.substr(n*2,2),16);return t}0&&(module.exports={LiveSessionExistsError,SOLANA_FINAL_VOUCHER_V2_MEMO_PROGRAM_ID,SOLANA_FINAL_VOUCHER_V2_PROGRAM_ID,SolanaFinalVoucherV2ReservationError,TX_SIZE_LIMIT_BYTES,buildAdapterRegisterInstruction,collectAltAddresses,compileComposeV0,createSelfPayingComposeSend,createSolanaFinalVoucherV2ReservationVerifier,createSolanaVaultAdapter,deriveChannelId,passkeySignerFromP256Keypair,verifySolanaFinalVoucherV2Reservation});
1
+ "use strict";var mt=Object.create;var Q=Object.defineProperty;var dt=Object.getOwnPropertyDescriptor;var gt=Object.getOwnPropertyNames;var pt=Object.getPrototypeOf,yt=Object.prototype.hasOwnProperty;var ft=(e,t)=>{for(var o in t)Q(e,o,{get:t[o],enumerable:!0})},ke=(e,t,o,n)=>{if(t&&typeof t=="object"||typeof t=="function")for(let i of gt(t))!yt.call(e,i)&&i!==o&&Q(e,i,{get:()=>t[i],enumerable:!(n=dt(t,i))||n.enumerable});return e};var ee=(e,t,o)=>(o=e!=null?mt(pt(e)):{},ke(t||!e||!e.__esModule?Q(o,"default",{value:e,enumerable:!0}):o,e)),ht=e=>ke(Q({},"__esModule",{value:!0}),e);var jt={};ft(jt,{LiveSessionExistsError:()=>D,SOLANA_FINAL_VOUCHER_V2_MEMO_PROGRAM_ID:()=>nt,SOLANA_FINAL_VOUCHER_V2_PROGRAM_ID:()=>tt,SolanaFinalVoucherV2ReservationError:()=>Y,TX_SIZE_LIMIT_BYTES:()=>j,buildAdapterRegisterInstruction:()=>ut,collectAltAddresses:()=>we,compileComposeV0:()=>Se,createSelfPayingComposeSend:()=>se,createSolanaFinalVoucherV2ReservationVerifier:()=>et,createSolanaVaultAdapter:()=>Wt,deriveChannelId:()=>Ne,inspectSolanaFinalVoucherV2Reservation:()=>ue,passkeySignerFromP256Keypair:()=>st,verifySolanaFinalVoucherV2Reservation:()=>me});module.exports=ht(jt);var k=require("@solana/web3.js"),ct=ee(require("bs58"),1);var D=class extends Error{constructor(o){super(`a LIVE session already exists for counterparty ${o.allowedCounterparty} (session ${o.sessionPubkeyHex.slice(0,16)}\u2026, expires ${o.expiresAtUnix}; on-chain spent=${o.spentAtomic}, crystallized=${o.crystallizedCumulativeAtomic}, frontier=${o.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=o;this.name="LiveSessionExistsError"}details};var N=require("@dexterai/vault/instructions"),te=require("@dexterai/vault/precompile"),I=require("@dexterai/vault/constants");var _=require("@dexterai/vault/messages");var X=ee(require("tweetnacl"),1),J=require("@solana/web3.js"),U=require("@dexterai/vault/messages"),Ke=require("@dexterai/vault/session");var Ue=require("@noble/hashes/sha256");function Te(){let e=X.default.sign.keyPair();return{publicKey:e.publicKey,privateKey:e.secretKey}}function Ee(e,t,o){return{publicKey:e.publicKey,privateKey:e.privateKey,scope:t,registration:o}}function Oe(e,t,o){if(o.length!==32)throw new Error(`channelIdBytes must be 32 bytes, got ${o.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 n=BigInt(t.cumulativeAmount),i=BigInt(e.scope.maxAmountAtomic);if(n>i)throw new Error(`voucher cumulative ${n} exceeds session cap ${i}`);let s=Math.floor(Date.now()/1e3);if(s>=e.scope.expiresAtUnix)throw new Error(`session expired at ${e.scope.expiresAtUnix}, now ${s}`);let r=(0,_.voucherPayloadMessage)({channelId:o,cumulativeAmount:n,sequenceNumber:t.sequenceNumber}),a=X.default.sign.detached(r,e.privateKey);return{payload:t,sessionPublicKey:e.publicKey,sessionRegistration:e.registration,sessionSignature:a}}var vt=/^[0-9a-f]{64}$/,At=(1n<<64n)-1n;function ye(e){return Buffer.from(e).toString("hex")}function bt(e){return Uint8Array.from(Buffer.from(e,"hex"))}function fe(e,t){if(e.length!==t.length)return!1;let o=0;for(let n=0;n<e.length;n+=1)o|=(e[n]??0)^(t[n]??0);return o===0}function Be(e){if(!vt.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>At)throw new Error("native_tab_v2_cumulative_amount_invalid");let o=new J.PublicKey(e.programId),n=new J.PublicKey(e.vaultPda),i=new J.PublicKey(e.sessionPda),s=new J.PublicKey(e.seller),[r]=(0,Ke.deriveSessionPda)(n,s,o);if(!i.equals(r))throw new Error("native_tab_v2_session_pda_mismatch");let a=e.sessionRegistration,c=new DataView(a.buffer,a.byteOffset,a.byteLength),m=c.getBigUint64(128,!0),d=c.getBigInt64(136,!0),v=c.getBigUint64(180,!0),g=e.nowUnixSeconds??Math.floor(Date.now()/1e3);if(!Number.isSafeInteger(g)||g<0)throw new Error("native_tab_v2_signing_time_invalid");if(!fe(a,(0,U.sessionRegisterMessage)({programId:o,vaultPda:n,sessionPubkey:e.sessionPublicKey,maxAmount:m,expiresAt:d,allowedCounterparty:s,nonce:e.sessionNonce,maxRevolvingCapacity:v})))throw new Error("native_tab_v2_registration_identity_mismatch");if(m===0n||v===0n||v>m||d<=BigInt(g)||d>0x7fffffffffffffffn-604800n||t>m)throw new Error("native_tab_v2_registration_semantics_invalid");(0,U.sessionVoucherV2AuthorizationNonce)(e.sessionNonce);let y=X.default.sign.keyPair.fromSeed(e.sessionPrivateKey.subarray(0,32)),f=!1;try{f=fe(y.publicKey,e.sessionPublicKey)&&fe(e.sessionPrivateKey.subarray(32,64),e.sessionPublicKey)}finally{y.secretKey.fill(0)}if(!f)throw new Error("native_tab_v2_session_key_mismatch");let h=(0,U.finalVoucherV2Sequence)(e.sequenceOrdinal),p=(0,U.contextBoundVoucherV2Message)({programId:o,vaultPda:n,sessionPda:i,seller:s,sessionNonce:e.sessionNonce,channelId:bt(e.channelId),cumulativeAmount:t,sequenceNumber:h}),R=X.default.sign.detached(p,e.sessionPrivateKey);return{channelId:e.channelId,cumulativeAmount:e.cumulativeAmountAtomic,sequenceNumber:h,sessionPublicKey:ye(e.sessionPublicKey),sessionSignature:ye(R),sessionRegistration:ye(a)}}function $(e){if(!/^\d+$/.test(e))throw new Error(`atomic amount must be a non-negative integer string, got "${e}"`);return BigInt(e)}function Ne(e){let t=new Uint8Array(8);new DataView(t.buffer).setBigUint64(0,e.nonce,!0);let o=new TextEncoder().encode(e.sellerUrl),n=Ue.sha256.create();return n.update(e.vaultPda.toBytes()),n.update(o),n.update(t),n.digest()}var w=require("@dexterai/vault/session"),lt=require("@dexterai/vault/reader"),pe=require("@dexterai/vault");var wt=ee(require("tweetnacl"),1),St=require("@noble/hashes/sha256"),Pt=require("@noble/curves/p256"),ne=require("@solana/web3.js");var ve=require("@dexterai/vault/session"),Ae=require("@dexterai/vault/messages"),he="OTS_SESSION_REGISTER_V2";var F=class extends Error{constructor(o,n){super(`Invalid registration: ${o}${n?` (${n})`:""}`);this.reason=o;this.name="InvalidRegistrationError"}reason};function oe(e){if(e.length!==188)throw new F("wrong_length",`expected 188, got ${e.length}`);let t=new TextDecoder().decode(e.slice(0,he.length));if(t!==he)throw new F("wrong_domain",`got "${t}"`);for(let v=he.length;v<32;v++)if(e[v]!==0)throw new F("wrong_domain",`non-NUL padding at byte ${v}`);let o=new DataView(e.buffer,e.byteOffset,e.byteLength),n=new ne.PublicKey(e.slice(32,64)),i=new ne.PublicKey(e.slice(64,96)),s=e.slice(96,128),r=o.getBigUint64(128,!0),a=o.getBigInt64(136,!0),c=new ne.PublicKey(e.slice(144,176)),m=o.getUint32(176,!0),d=o.getBigUint64(180,!0);if(!n.equals(I.DEXTER_VAULT_PROGRAM_ID))throw new F("wrong_program",`${n.toBase58()} is not ${I.DEXTER_VAULT_PROGRAM_ID.toBase58()}`);if(r===0n)throw new F("cap_zero");return{programId:n,vaultPda:i,sessionPubkey:new Uint8Array(s),maxAmount:r,expiresAt:a,allowedCounterparty:c,nonce:m,maxRevolvingCapacity:d}}var Ve=require("@noble/hashes/sha256"),ge=require("@noble/hashes/utils");var K=require("@solana/web3.js"),j=1232,xt=40,$e=20,Fe=4,_t=20,ie=1e4,Rt=1e6,re=4,M="[tab/solana/compose]";function we(e,t){let o=new Set,n=[],i=t.toBase58();for(let s of e)for(let r of s.keys){if(r.isSigner)continue;let a=r.pubkey.toBase58();a===i||o.has(a)||(o.add(a),n.push(r.pubkey))}return n}function Se(e,t,o,n){let i=new K.TransactionMessage({payerKey:t,recentBlockhash:o,instructions:e}).compileToV0Message([n]);return new K.VersionedTransaction(i)}async function ze(e){try{let t=(await e.getRecentPrioritizationFees()).map(n=>n.prioritizationFee).filter(n=>n>0).sort((n,i)=>n-i);if(t.length===0)return ie;let o=t[Math.floor(.75*(t.length-1))]??ie;return Math.max(ie,Math.min(o,Rt))}catch{return ie}}function Vt(e){let t=e,o=String(t?.message??e??""),n=Array.isArray(t?.logs)?t.logs.join(" "):"";return/already in use/i.test(o)||/already in use/i.test(n)}function Le(e){let t=e;return(Array.isArray(t?.logs)?t.logs:[]).length===0&&/block height exceeded|has expired|blockhash not found/i.test(String(t?.message??e))}var be=e=>new Promise(t=>setTimeout(t,e));function se(e,t,o={}){let n=o.commitment??"confirmed",i=o.altWarmupPollMs??400,s=o.altReadbackPollMs??400,r=o.altCollisionPollMs??500,a=null,c=null;async function m(f,h){let p=await ze(e),R=[K.ComputeBudgetProgram.setComputeUnitPrice({microLamports:p}),...f],P;for(let x=0;x<re;x+=1){let{blockhash:b,lastValidBlockHeight:O}=await e.getLatestBlockhash(n),V=new K.Transaction().add(...R);V.feePayer=t.publicKey,V.recentBlockhash=b,V.sign(t);try{let u=await e.sendRawTransaction(V.serialize(),{skipPreflight:!1,maxRetries:5}),A=await e.confirmTransaction({signature:u,blockhash:b,lastValidBlockHeight:O},n);if(A.value.err)throw new Error(`${h} tx failed on-chain: ${JSON.stringify(A.value.err)}`);return u}catch(u){if(Le(u)&&x<re-1){console.warn(`${M} ${h} tx expired before landing (attempt ${x+1}) \u2014 rebroadcasting with a fresh blockhash`),P=u;continue}throw u}}throw P??new Error(`${h} tx did not land after rebroadcast attempts`)}async function d(f){for(let h=0;h<_t;h+=1){let p=await e.getSlot("finalized");if(p>f)return p;await be(r)}throw new Error(`ALT collision retry: finalized slot never advanced past ${f}`)}async function v(f){for(let h=0;h<xt;h+=1){if(await e.getSlot(n)>f)return;await be(i)}throw new Error(`ALT warmup timed out: preflight (${n}) slot never passed lastExtendedSlot ${f}`)}async function g(f){if(a)return a;let h=we(f,t.publicKey),p=null,R=null,P=-1;for(let b=0;b<Fe;b+=1){let O=P<0?await e.getSlot("finalized"):await d(P),[V,u]=K.AddressLookupTableProgram.createLookupTable({authority:t.publicKey,payer:t.publicKey,recentSlot:O}),A=K.AddressLookupTableProgram.extendLookupTable({payer:t.publicKey,authority:t.publicKey,lookupTable:u,addresses:h});try{R=await m([V,A],"ALT create/extend"),p=u;break}catch(L){if(Vt(L)&&b<Fe-1){P=O,console.warn(`${M} ALT address collision at slot ${O} (attempt ${b+1}) \u2014 retrying create with a fresh finalized slot`);continue}throw L}}if(!p||!R)throw new Error("ALT create exhausted retries after repeated address collisions");let x=await e.getAddressLookupTable(p);for(let b=0;b<$e&&!x.value;b+=1)await be(s),x=await e.getAddressLookupTable(p);if(!x.value)throw new Error(`ALT ${p.toBase58()} not visible after ${$e} read polls (${R})`);return await v(x.value.state.lastExtendedSlot),a=x.value,c=p,console.info(`${M} ephemeral compose ALT ready: ${p.toBase58()} (${h.length} addresses, createTx ${R})`),a}async function S(f){let h=await ze(e),p=[K.ComputeBudgetProgram.setComputeUnitPrice({microLamports:h}),...f],R=await g(p),P;for(let x=0;x<re;x+=1){let{blockhash:b,lastValidBlockHeight:O}=await e.getLatestBlockhash(n),V;try{let u=Se(p,t.publicKey,b,R);u.sign([t]),V=u.serialize()}catch(u){throw/overrun|too large/i.test(String(u?.message??u))?new Error(`composed revoke-then-register v0 tx exceeds the ${j}B wire cap \u2014 too many sibling PDAs outside the lookup table`):u}if(V.length>j)throw new Error(`composed revoke-then-register v0 tx ${V.length}B exceeds the ${j}B wire cap \u2014 too many sibling PDAs outside the lookup table`);try{let u=await e.sendRawTransaction(V,{skipPreflight:!1,maxRetries:5}),A=await e.confirmTransaction({signature:u,blockhash:b,lastValidBlockHeight:O},n);if(A.value.err)throw new Error(`composed tx failed on-chain: ${JSON.stringify(A.value.err)}`);return u}catch(u){if(Le(u)&&x<re-1){console.warn(`${M} compose tx expired before landing (attempt ${x+1}, priorityFee ${h}) \u2014 rebroadcasting with a fresh blockhash`),P=u;continue}let A=Array.isArray(u?.logs)?u.logs:[];throw A.length?new Error(`${u?.message??u} | ${A.join(" | ")}`):u}}throw P instanceof Error?P:new Error("compose tx did not land after rebroadcast attempts")}async function y(){if(c)try{let f=K.AddressLookupTableProgram.deactivateLookupTable({lookupTable:c,authority:t.publicKey}),h=await m([f],"ALT deactivate");console.info(`${M} ephemeral compose ALT deactivated: ${c.toBase58()} (${h}) \u2014 rent reclaimable via close_lookup_table after the deactivation cooldown`)}catch(f){console.warn(`${M} ALT deactivate failed for ${c?.toBase58()} \u2014 rent parks until a later cleanup retries (the compose already landed): ${String(f?.message??f)}`)}}return{send:S,getAltAddress:()=>c,deactivateAlt:y}}var B=require("@solana/web3.js"),le=require("@noble/hashes/utils"),H=require("@dexterai/vault/credit"),Z=require("@dexterai/vault/constants"),je=require("@dexterai/vault/instructions"),Ye=require("@dexterai/vault/reader"),G=require("@dexterai/vault/session");var _e=require("@noble/hashes/sha256"),z=require("@noble/hashes/utils"),De=/^[0-9a-f]{64}$/,Me=/^[A-Za-z0-9][A-Za-z0-9._:-]{0,199}$/,It=/^[1-9A-HJ-NP-Za-km-z]{32,100}$/,qe="solana:5eykt4UsFv8P8NJdTREpY1vzqKqZKvdp",He="dexter-native-tab-v2-reservation/v1",Ct=`${He}:`;function Pe(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(Pe);if(typeof e=="object")return Object.fromEntries(Object.entries(e).filter(([,t])=>t!==void 0).sort(([t],[o])=>t.localeCompare(o)).map(([t,o])=>[t,Pe(o)]));throw new Error("canonical_value_unsupported")}function Ge(e){return JSON.stringify(Pe(e))}function xe(e){if(e==="solana:mainnet"||e===qe)return qe;throw new Error("native_tab_v2_reservation_network_unsupported")}function We(e){return(0,z.bytesToHex)((0,_e.sha256)(new TextEncoder().encode(Ge({channelId:e.payload.channelId,cumulativeAmount:e.payload.cumulativeAmount,sequenceNumber:e.payload.sequenceNumber,sessionPublicKey:(0,z.bytesToHex)(e.sessionPublicKey),sessionSignature:(0,z.bytesToHex)(e.sessionSignature),sessionRegistration:(0,z.bytesToHex)(e.sessionRegistration)}))))}function kt(e){return(0,z.bytesToHex)((0,_e.sha256)(new TextEncoder().encode(Ge({contract:He,network:xe(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 Kt(e){let t=We(e.voucher);return kt({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 Je(e){return`${Ct}${Kt(e)}`}function C(e){throw new Error(`native_tab_v2_reservation_receipt_invalid:${e}`)}function ae(e,t){(!Number.isSafeInteger(e)||e<0)&&C(t)}function Xe(e,t){(!t||typeof t!="object")&&C("missing");let o=We(e.voucher);(!De.test(e.voucherDigest)||e.voucherDigest!==o)&&C("input_voucher_digest"),e.idempotencyKey!==`native-tab-v2:${o}`&&C("input_idempotency_identity");let n=BigInt(e.voucher.payload.cumulativeAmount),i=BigInt(e.previousCumulativeAtomic),s=BigInt(e.reservationAmountAtomic);(n<=i||n-i!==s||s<=0n)&&C("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)&&C("input_voucher_identity"),t.contract!=="dexter-native-tab-open-receipt/v1"&&t.contract!=="dexter-native-tab-open-receipt/v2"&&C("contract"),De.test(t.operationId)||C("operation_id"),Me.test(t.callerOperationId)||C("caller_operation_id"),It.test(t.transaction)||C("transaction"),t.commitment!=="confirmed"&&t.commitment!=="finalized"&&C("commitment"),ae(t.confirmationSlot,"confirmation_slot"),ae(t.postStateSlot,"post_state_slot"),(t.confirmationSlot===0||t.postStateSlot<t.confirmationSlot)&&C("post_state_slot");let r,a;try{r=xe(e.network),a=xe(t.network)}catch{return C("network")}(a!==r||t.buyerSwigAddress!==e.buyerSwigAddress||t.vaultPda!==e.vaultPda||t.sessionPda!==e.sessionPda||t.seller!==e.seller||t.channelId!==e.channelId||t.sessionPublicKey!==(0,z.bytesToHex)(e.voucher.sessionPublicKey)||t.voucherDigest!==o||t.cumulativeAmountAtomic!==e.voucher.payload.cumulativeAmount||t.sequenceNumber!==e.voucher.payload.sequenceNumber||!Me.test(t.providerReceiptId)||t.reservationAmountAtomic!==e.reservationAmountAtomic||t.currentOutstandingBeforeAtomic!=="0"||t.currentOutstandingAfterAtomic!==e.reservationAmountAtomic)&&C("economic_identity"),ae(t.pendingVoucherCountBefore,"pending_voucher_count_before"),ae(t.pendingVoucherCountAfter,"pending_voucher_count_after"),t.contract==="dexter-native-tab-open-receipt/v1"?t.callerOperationId!==e.idempotencyKey&&C("idempotency_key"):(t.rootOperationId!==e.idempotencyKey||!Number.isSafeInteger(t.generation)||Number(t.generation)<2||!t.predecessorCallerOperationId||!t.predecessorLifecycleOperationId||!t.predecessorReleaseDigest||!t.stableReservationId||!t.economicEffectDigest)&&C("successor_identity")}var Tt=Uint8Array.from([56,67,4,209,238,143,0,129]),Et=74,Ze=new Set([1,2]),Ot=188,Qe=new B.PublicKey("MemoSq4gqABAXKb96qnH8TysNcWxMyWCqXgDLGmfcHr"),Bt=(()=>{let e=Buffer.alloc(32);return e.write("OTS_SESSION_REGISTER_V2","ascii"),e})(),Y=class extends Error{constructor(o,n){super(`native_tab_v2_solana_reservation_invalid:${o}`+(n?`:${n}`:""));this.code=o;this.name="SolanaFinalVoucherV2ReservationError"}code};function l(e,t){throw new Y(e,t)}function T(e,t){try{return new B.PublicKey(e)}catch{return l(t)}}function ce(e,t){return e.length===t.length&&e.every((o,n)=>o===t[n])}async function Ut(e){let o=(await e.connection.getSignatureStatuses([e.signature],{searchTransactionHistory:!0})).value[0]??null;if(!o)return null;o.confirmationStatus!=="confirmed"&&o.confirmationStatus!=="finalized"&&l("transaction_commitment"),o.err!==null&&l("transaction_failed");let n=await e.connection.getTransaction(e.signature,{commitment:e.commitment,maxSupportedTransactionVersion:0});if(!n)return null;n.meta||l("transaction_meta_missing"),n.slot!==o.slot&&l("transaction_status_slot");let i=n.transaction.message,s=i.version===0?i.getAccountKeys({accountKeysFromLookups:n.meta.loadedAddresses??null}):i.getAccountKeys(),r=(a,c)=>{let m=s.get(a);return m||l(c),m};return{slot:n.slot,confirmationStatus:o.confirmationStatus,err:n.meta.err,signatures:[...n.transaction.signatures],accountKeys:Array.from({length:s.length},(a,c)=>({address:r(c,"transaction_account_key").toBase58(),signer:i.isAccountSigner(c),writable:i.isAccountWritable(c)})),instructions:i.compiledInstructions.map(a=>({programId:r(a.programIdIndex,"transaction_program_id").toBase58(),accounts:a.accountKeyIndexes.map(c=>r(c,"transaction_instruction_account").toBase58()),data:Uint8Array.from(a.data)}))}}function Nt(e,t,o,n){n.length!==Et&&l("binding_length"),ce(n.subarray(0,8),Tt)||l("binding_discriminator");let i=n.readUInt8(8),s=n.readUInt8(9);return Ze.has(i)||l("binding_version"),s!==t&&l("binding_bump"),{address:e.toBase58(),owner:o.toBase58(),version:i,bump:s,swig:new B.PublicKey(n.subarray(10,42)).toBase58(),vault:new B.PublicKey(n.subarray(42,74)).toBase58()}}async function $t(e){let t=T(e.input.programId,"program_id"),o=T(e.input.buyerSwigAddress,"buyer_swig"),n=T(e.input.vaultPda,"vault_pda"),i=T(e.input.seller,"seller"),[s,r]=(0,H.deriveSwigVaultBindingPda)(o,t),[a]=(0,G.deriveSessionPda)(n,i,t),c=await e.connection.getMultipleAccountsInfoAndContext([s,n,a],{commitment:e.commitment,minContextSlot:e.minimumSlot}),[m,d,v]=c.value;m||l("binding_missing"),d||l("vault_missing"),v||l("session_missing");let g,S;try{g=(0,Ye.decodeVaultFull)(Buffer.from(d.data)),S=(0,G.decodeSessionAccount)(a,v.data)}catch(f){return l("post_state_decode",f instanceof Error?f.message:String(f))}let y=S.session;return{contextSlot:c.context.slot,binding:Nt(s,r,m.owner,Buffer.from(m.data)),vault:{owner:d.owner.toBase58(),exists:g.exists,version:g.version,swigAddress:g.swigAddress,dexterAuthority:g.dexterAuthority,pendingVoucherCount:g.pendingVoucherCount},session:{owner:v.owner.toBase58(),version:S.version,bump:S.bump,vault:S.vault,sessionPublicKey:(0,le.bytesToHex)(y.sessionPubkey),maxAmount:y.maxAmount,expiresAt:y.expiresAt,seller:y.allowedCounterparty,nonce:y.nonce,spent:y.spent,currentOutstanding:y.currentOutstanding,maxRevolvingCapacity:y.maxRevolvingCapacity,crystallizedCumulative:y.crystallizedCumulative}}}function Ft(e){let t=Buffer.from(e.voucher.sessionRegistration);return t.length!==Ot&&l("registration_length"),ce(t.subarray(0,32),Bt)||l("registration_domain"),{programId:new B.PublicKey(t.subarray(32,64)).toBase58(),vaultPda:new B.PublicKey(t.subarray(64,96)).toBase58(),sessionPublicKey:(0,le.bytesToHex)(t.subarray(96,128)),maxAmount:t.readBigUInt64LE(128),expiresAt:t.readBigInt64LE(136),seller:new B.PublicKey(t.subarray(144,176)).toBase58(),nonce:t.readUInt32LE(176),maxRevolvingCapacity:t.readBigUInt64LE(180)}}function q(e,t,o){let n=e.accountKeys.filter(i=>i.address===t);return n.length!==1&&l(`${o}_account_key`),n[0]}function zt(e,t,o){(!Number.isSafeInteger(o.slot)||o.slot<=0)&&l("transaction_slot"),o.slot!==t.confirmationSlot&&l("transaction_confirmation_slot"),o.err!==null&&l("transaction_failed"),o.signatures[0]!==t.transaction&&l("transaction_signature"),o.instructions.length!==2&&l("transaction_instruction_count");let n=T(e.programId,"program_id"),i=T(e.buyerSwigAddress,"buyer_swig"),s=T(e.vaultPda,"vault_pda"),r=T(e.seller,"seller"),a=T(e.sessionPda,"session_pda"),[c]=(0,G.deriveSessionPda)(s,r,n),m=(0,H.deriveSwigVaultBindingPda)(i,n)[0],d=(0,je.deriveSwigWalletAddress)(i),v=(0,H.deriveGraphConfigPda)(n)[0];a.equals(c)||l("session_pda_derivation");let g=Buffer.from(Z.DISCRIMINATORS.settle_voucher),S=o.instructions.filter(u=>{if(u.programId!==e.programId)return!1;let A=u.data;return A.length>=g.length&&ce(A.subarray(0,g.length),g)});S.length!==1&&l("settle_voucher_instruction_count");let y=S[0];o.instructions[0]!==y&&l("settle_voucher_instruction_order");let f=Buffer.from(y.data);f.length!==49&&l("settle_voucher_instruction_length"),f.readBigUInt64LE(8).toString()!==e.reservationAmountAtomic&&l("settle_voucher_amount"),f.readUInt8(16)!==1&&l("settle_voucher_increment"),new B.PublicKey(f.subarray(17,49)).equals(r)||l("settle_voucher_seller"),y.accounts.length<8&&l("settle_voucher_accounts"),[s.toBase58(),null,a.toBase58(),null,i.toBase58(),d.toBase58(),m.toBase58(),v.toBase58()].forEach((u,A)=>{u!==null&&y.accounts[A]!==u&&l(`settle_voucher_account_${A}`)});let p=y.accounts[1];p||l("dexter_authority");let R=q(o,y.accounts[0],"vault"),P=q(o,p,"dexter_authority"),x=q(o,y.accounts[2],"session");(!R.writable||R.signer)&&l("vault_privileges"),P.signer||l("dexter_authority_signature"),(!x.writable||x.signer)&&l("session_privileges");for(let u=3;u<Math.min(y.accounts.length,8);u+=1)q(o,y.accounts[u],`account_${u}`).signer&&l(`settle_voucher_account_${u}_signer`);for(let u=8;u<y.accounts.length;u+=1){let A=q(o,y.accounts[u],`sibling_${u-8}`);(!A.writable||A.signer)&&l("settle_voucher_sibling_privileges")}let b=o.instructions[1];b.programId!==Qe.toBase58()&&l("reservation_memo_program"),(b.accounts.length!==1||b.accounts[0]!==p)&&l("reservation_memo_authority"),q(o,p,"reservation_memo_authority").signer||l("reservation_memo_authority_signature");let V=new TextEncoder().encode(Je(e));return ce(b.data,V)||l("reservation_memo_digest"),p}function Lt(e,t,o,n){let i=T(e.programId,"program_id"),s=T(e.buyerSwigAddress,"buyer_swig"),r=T(e.vaultPda,"vault_pda"),a=T(e.seller,"seller"),[c,m]=(0,H.deriveSwigVaultBindingPda)(s,i),[d,v]=(0,G.deriveSessionPda)(r,a,i);(!Number.isSafeInteger(n.contextSlot)||n.contextSlot<t)&&l("post_state_slot"),(n.binding.address!==c.toBase58()||n.binding.owner!==e.programId||n.binding.bump!==m||!Ze.has(n.binding.version)||n.binding.swig!==e.buyerSwigAddress||n.binding.vault!==e.vaultPda)&&l("binding_identity"),(n.vault.owner!==e.programId||!n.vault.exists||n.vault.version!==7||n.vault.swigAddress!==e.buyerSwigAddress||n.vault.dexterAuthority!==o)&&l("vault_post_state"),(e.sessionPda!==d.toBase58()||n.session.owner!==e.programId||n.session.version!==1||n.session.bump!==v||n.session.vault!==e.vaultPda||n.session.sessionPublicKey!==(0,le.bytesToHex)(e.voucher.sessionPublicKey)||n.session.seller!==e.seller||n.session.nonce!==e.sessionNonce||n.session.currentOutstanding.toString()!==e.reservationAmountAtomic)&&l("session_post_state");let g=Ft(e);(g.programId!==e.programId||g.vaultPda!==e.vaultPda||g.sessionPublicKey!==n.session.sessionPublicKey||g.seller!==e.seller||g.nonce!==e.sessionNonce||g.maxAmount!==n.session.maxAmount||g.expiresAt!==BigInt(n.session.expiresAt)||g.maxRevolvingCapacity!==n.session.maxRevolvingCapacity)&&l("registration_post_state");let S=n.session.spent>n.session.crystallizedCumulative?n.session.spent:n.session.crystallizedCumulative;return S.toString()!==e.previousCumulativeAtomic&&l("session_frontier"),{commitment:"confirmed",confirmationSlot:t,postStateSlot:n.contextSlot,sessionAccountVersion:n.session.version,wireVersion:2,frontierAtomic:S.toString(),spentAtomic:n.session.spent.toString(),currentOutstandingAtomic:n.session.currentOutstanding.toString(),crystallizedCumulativeAtomic:n.session.crystallizedCumulative.toString()}}async function ue(e,t,o,n={}){try{Xe(t,o)}catch(a){return l("provider_receipt",a instanceof Error?a.message:String(a))}t.network!=="solana:mainnet"&&l("network"),t.programId!==Z.DEXTER_VAULT_PROGRAM_ID.toBase58()&&l("program_id");let i=await(n.readTransaction??Ut)({connection:e,signature:o.transaction,commitment:"confirmed"});i||l("transaction_missing"),i.confirmationStatus!=="confirmed"&&i.confirmationStatus!=="finalized"&&l("transaction_commitment");let s=zt(t,o,i),r=await(n.readPostState??$t)({connection:e,input:t,minimumSlot:i.slot,commitment:"confirmed"});return{...Lt(t,i.slot,s,r),commitment:i.confirmationStatus}}async function me(e,t,o,n={}){await ue(e,t,o,n)}function et(e,t={}){return async(o,n)=>{await ue(e,o,n,t)}}var tt=Z.DEXTER_VAULT_PROGRAM_ID,nt=Qe;var Re=require("@noble/curves/p256"),W=require("@noble/hashes/sha256"),de=require("@dexterai/vault"),it=require("@dexterai/vault/messages"),rt="dexter.cash";function Dt(e){return Buffer.from(e).toString("base64").replace(/\+/g,"-").replace(/\//g,"_").replace(/=+$/,"")}function Mt(e,t=`https://${rt}`){let n={type:"webauthn.get",challenge:Dt(e),origin:t,crossOrigin:!1};return new TextEncoder().encode(JSON.stringify(n))}function qt(e=1){let t=(0,W.sha256)(new TextEncoder().encode(rt)),o=new Uint8Array(37);return o.set(t,0),o[32]=5,new DataView(o.buffer).setUint32(33,e,!1),o}function ot(e,t){let o=Mt(t),n=qt(1),i=new Uint8Array(n.length+32);i.set(n,0),i.set((0,W.sha256)(o),n.length);let s=(0,W.sha256)(i);return{signature:Re.p256.sign(s,e.privateKey,{lowS:!0}).toCompactRawBytes(),clientDataJSON:o,authenticatorData:n}}function st(e,t={}){return{credentialId:new Uint8Array(0),publicKey:e.publicKey,signOperation:async o=>{let n=t.resolveAuthorizationContext?await t.resolveAuthorizationContext(o.slice()):Ht(o);if(!n){if(t.allowLegacyOperationHash===!0)return ot(e,(0,W.sha256)(o));throw new Error("passkey_authorization_context_required")}let i=t.ceremonyNonce?t.ceremonyNonce():Re.p256.utils.randomPrivateKey();if(i.length!==32)throw new Error("ceremonyNonce must be exactly 32 bytes");let s=(0,de.buildPasskeyAuthorizationChallenge)({programId:n.programId,vault:n.vault,nonce:n.nonce,operationHash:(0,W.sha256)(o),ceremonyNonce:i});return ot(e,s)}}}function Ht(e){let t=(0,de.classifyPasskeyAuthorizationOperation)(e);return t.kind==="session_register_v2"?{programId:t.fields.programId,vault:t.fields.vault,nonce:BigInt((0,it.sessionVoucherV2AuthorizationNonce)(t.fields.registrationNonce))}:t.kind==="session_replace_v1"?{programId:t.fields.programId,vault:t.fields.vault,nonce:t.fields.authorizationNonce}:null}async function Gt({connection:e,vaultPda:t,allowedCounterparty:o,programId:n=I.DEXTER_VAULT_PROGRAM_ID,commitment:i="finalized"}){let[s]=(0,w.deriveSessionPda)(t,o,n),r=await e.getMultipleAccountsInfoAndContext([t,s],{commitment:i}),[a,c]=r.value;if(!a)throw new Error("close revocation: vault account not found");if(!a.owner.equals(n))throw new Error("close revocation: vault has the wrong owner");let m=(0,lt.decodeVaultFull)(Buffer.from(a.data));if(!m.exists||m.version!==7)throw new Error("close revocation: Vault V7 required");if(!c)return{kind:"invalidated",contextSlot:r.context.slot,sessionPda:s,reason:"absent"};if(!c.owner.equals(n))throw new Error("close revocation: session has the wrong owner");let d=(0,w.decodeSessionAccount)(s,c.data);if(d.version===0)return{kind:"invalidated",contextSlot:r.context.slot,sessionPda:s,reason:"cleared"};if(d.version!==1)throw new Error("close revocation: live SessionAccount required");if(d.vault!==t.toBase58())throw new Error("close revocation: session belongs to a different vault");if(d.session.allowedCounterparty!==o.toBase58())throw new Error("close revocation: session counterparty mismatch");return{kind:"live",snapshot:{contextSlot:r.context.slot,programId:new k.PublicKey(n),vaultPda:new k.PublicKey(t),sessionPda:s,sessionPubkey:Uint8Array.from(d.session.sessionPubkey),maxAmount:d.session.maxAmount,expiresAt:Buffer.from(c.data).readBigInt64LE(82),allowedCounterparty:new k.PublicKey(o),nonce:d.session.nonce,spent:d.session.spent,currentOutstanding:d.session.currentOutstanding,maxRevolvingCapacity:d.session.maxRevolvingCapacity,crystallizedCumulative:d.session.crystallizedCumulative,lastLockedSequence:d.session.lastLockedSequence,expectedPendingVoucherCount:m.pendingVoucherCount}}}function ut(e){return(0,N.buildRegisterSessionKeyInstruction)({vaultPda:e.vaultPda,sessionPubkey:e.sessionPubkey,maxAmount:e.maxAmount,maxRevolvingCapacity:e.maxRevolvingCapacity,expiresAt:e.expiresAt,allowedCounterparty:e.allowedCounterparty,nonce:e.nonce,swigAddress:e.swigAddress,vaultUsdcAta:e.vaultUsdcAta,clientDataJSON:e.clientDataJSON,authenticatorData:e.authenticatorData,payer:e.payer,siblingSessionPdas:e.siblingSessionPdas})}var Ie=class{network="solana:mainnet";sessionVoucherVersion=2;swigAddress;vaultPda;connection;vaultPdaKey;passkey;feePayer;confirmOptions;seams;pendingCloseRevocations=new Map;completedCloseRevocations=new Map;constructor(t){this.connection=t.connection,this.swigAddress=typeof t.swigAddress=="string"?t.swigAddress:t.swigAddress.toBase58(),this.vaultPdaKey=typeof t.vaultPda=="string"?new k.PublicKey(t.vaultPda):t.vaultPda,this.vaultPda=this.vaultPdaKey.toBase58(),this.passkey=t.passkeySigner,this.feePayer=t.feePayer,this.confirmOptions=t.confirmOptions??{commitment:"confirmed"},this.seams=t.seams??{}}closeRevocationKey(t){let o=oe(t.registration),[n]=(0,w.deriveSessionPda)(this.vaultPdaKey,o.allowedCounterparty,I.DEXTER_VAULT_PROGRAM_ID);return[n.toBase58(),(0,ge.bytesToHex)(o.sessionPubkey),o.nonce.toString()].join(":")}async readCloseTargetState(t){let o={connection:this.connection,vaultPda:this.vaultPdaKey,allowedCounterparty:t,programId:I.DEXTER_VAULT_PROGRAM_ID,commitment:"finalized"};if(this.seams.readCloseRevocationTargetState)return this.seams.readCloseRevocationTargetState(o);if(this.seams.readCloseRevocationSnapshot)try{return{kind:"live",snapshot:await this.seams.readCloseRevocationSnapshot(o)}}catch{return null}return Gt(o)}targetInvalidated(t,o){if(t.kind==="invalidated")return!0;let n=t.snapshot,[i]=(0,w.deriveSessionPda)(this.vaultPdaKey,o.allowedCounterparty,I.DEXTER_VAULT_PROGRAM_ID);if(!n.programId.equals(I.DEXTER_VAULT_PROGRAM_ID)||!n.vaultPda.equals(this.vaultPdaKey)||!n.sessionPda.equals(i)||!n.allowedCounterparty.equals(o.allowedCounterparty))throw new Error("session revocation snapshot identity mismatch");if(!Buffer.from(n.sessionPubkey).equals(Buffer.from(o.sessionPubkey))||n.nonce!==o.nonce)return!0;if(n.maxAmount!==o.maxAmount||n.expiresAt!==o.expiresAt||n.maxRevolvingCapacity!==o.maxRevolvingCapacity)throw new Error("session revocation snapshot identity mismatch");return!1}rememberCompletedClose(t,o){let n=Uint8Array.from(o);return this.pendingCloseRevocations.delete(t),this.completedCloseRevocations.set(t,n),Uint8Array.from(n)}async reconcilePendingClose(t,o,n){let i=!1,s=null;try{let c=await this.connection.getSignatureStatuses([t.signature],{searchTransactionHistory:!0});if(i=!0,s=c.value[0]??null,s?.confirmationStatus==="finalized")return s.err===null?"complete":"fresh_allowed"}catch{}let r=!1;try{let c=await this.connection.getTransaction(t.signature,{commitment:"finalized",maxSupportedTransactionVersion:0});if(r=!0,c)return!c.meta||!Object.prototype.hasOwnProperty.call(c.meta,"err")?"unresolved":c.meta.err===null?"complete":"fresh_allowed"}catch{}let a=await this.readCloseTargetState(o.allowedCounterparty).catch(()=>null);if(a&&this.targetInvalidated(a,o))return"complete";if(n&&i&&s===null)try{if((await this.connection.isBlockhashValid(t.blockhash,{commitment:"confirmed"})).value)return await this.connection.sendRawTransaction(t.serializedTransaction,{skipPreflight:!1,preflightCommitment:this.confirmOptions.preflightCommitment??this.confirmOptions.commitment})!==t.signature?"unresolved":(await this.connection.confirmTransaction({signature:t.signature,blockhash:t.blockhash,lastValidBlockHeight:t.lastValidBlockHeight},"finalized")).value.err===null?"complete":"fresh_allowed"}catch{}if(i&&s!==null||!i||!r||t.finalizedHistoryFloorSlot===null)return"unresolved";try{let[c,m]=await Promise.all([this.connection.getBlockHeight("finalized"),this.connection.getMinimumLedgerSlot()]);if(c>t.lastValidBlockHeight&&m<=t.finalizedHistoryFloorSlot)return"fresh_allowed"}catch{}return"unresolved"}async authorizeSession(t,o){let n=new k.PublicKey(t.allowedCounterparty),i=$(t.revolvingCapacityAtomic??t.maxAmountAtomic),r=await(this.seams.fetchSession??w.fetchSessionAccount)(this.connection,this.vaultPdaKey,n),a=r!==null&&(0,w.isSessionLive)(r);if(a&&(o?.onLiveSession??"error")!=="replace"){let h=r.session.spent,p=r.session.crystallizedCumulative;throw new D({allowedCounterparty:t.allowedCounterparty,sessionPubkeyHex:(0,ge.bytesToHex)(r.session.sessionPubkey),expiresAtUnix:r.session.expiresAt,spentAtomic:h.toString(),crystallizedCumulativeAtomic:p.toString(),currentOutstandingAtomic:r.session.currentOutstanding.toString(),frontierAtomic:(h>p?h:p).toString()})}let m=await(this.seams.fetchPasskeyAuthorization??pe.fetchPasskeyAuthorizationState)(this.connection,this.vaultPdaKey,I.DEXTER_VAULT_PROGRAM_ID);if(m===null||m.version!==1||!m.vault.equals(this.vaultPdaKey))throw new Error("passkey_authorization_guard_unavailable");let d=Te(),v=(0,_.sessionVoucherV2Nonce)(m.nonce),g=(0,_.sessionRegisterMessage)({programId:I.DEXTER_VAULT_PROGRAM_ID,vaultPda:this.vaultPdaKey,sessionPubkey:d.publicKey,maxAmount:$(t.maxAmountAtomic),maxRevolvingCapacity:i,expiresAt:BigInt(t.expiresAtUnix),allowedCounterparty:n,nonce:v}),S=a?(0,_.sessionReplaceV1Message)({programId:I.DEXTER_VAULT_PROGRAM_ID,vaultPda:this.vaultPdaKey,sessionPda:new k.PublicKey(r.address),authorizationNonce:m.nonce,retired:{sessionPubkey:r.session.sessionPubkey,maxAmount:r.session.maxAmount,expiresAt:BigInt(r.session.expiresAt),allowedCounterparty:new k.PublicKey(r.session.allowedCounterparty),nonce:r.session.nonce,spent:r.session.spent,currentOutstanding:r.session.currentOutstanding,maxRevolvingCapacity:r.session.maxRevolvingCapacity,crystallizedCumulative:r.session.crystallizedCumulative,lastLockedSequence:r.session.lastLockedSequence},replacement:{sessionPubkey:d.publicKey,maxAmount:$(t.maxAmountAtomic),expiresAt:BigInt(t.expiresAtUnix),allowedCounterparty:n,nonce:v,maxRevolvingCapacity:i}}):g,y=await this.passkey.signOperation(S);if(a)await this.sendAtomicReplace(t,n,d.publicKey,v,i,y);else{if((0,pe.validatePasskeyAuthorizationClientData)({clientDataJSON:y.clientDataJSON,operationMessage:S,expectedVault:this.vaultPdaKey,expectedProgramId:I.DEXTER_VAULT_PROGRAM_ID}).nonce!==m.nonce)throw new Error("passkey_authorization_guard_changed");await this.sendBareRegister(t,n,d.publicKey,v,i,y)}return await(this.seams.waitForSession??w.waitForSession)(this.connection,this.vaultPdaKey,n,{expectedSessionPubkey:d.publicKey,timeoutMs:2e4}),Ee(d,t,g)}async sendBareRegister(t,o,n,i,s,r){let{signature:a,clientDataJSON:c,authenticatorData:m}=r,d=at(m,(0,Ve.sha256)(c)),v=(0,te.buildSecp256r1VerifyInstruction)(this.passkey.publicKey,a,d),g=this.seams.fetchSessions??w.fetchVaultSessionAccounts,S=(0,w.sessionPdasOf)(await g(this.connection,this.vaultPdaKey)),f=await(this.seams.resolveUsdcAta??w.resolveVaultUsdcAta)(this.connection,new k.PublicKey(this.swigAddress)),h=ut({vaultPda:this.vaultPdaKey,swigAddress:new k.PublicKey(this.swigAddress),sessionPubkey:n,maxAmount:$(t.maxAmountAtomic),maxRevolvingCapacity:s,expiresAt:BigInt(t.expiresAtUnix),allowedCounterparty:o,nonce:i,clientDataJSON:c,authenticatorData:m,payer:this.feePayer.publicKey,siblingSessionPdas:S,vaultUsdcAta:f}),p=new k.Transaction().add(v,h);p.feePayer=this.feePayer.publicKey;let{blockhash:R}=await this.connection.getLatestBlockhash(this.confirmOptions.commitment);p.recentBlockhash=R,p.sign(this.feePayer);let P=await this.connection.sendRawTransaction(p.serialize(),{skipPreflight:!1,preflightCommitment:this.confirmOptions.preflightCommitment??this.confirmOptions.commitment});await this.connection.confirmTransaction({signature:P,blockhash:R,lastValidBlockHeight:(await this.connection.getLatestBlockhash(this.confirmOptions.commitment)).lastValidBlockHeight},this.confirmOptions.commitment)}async sendAtomicReplace(t,o,n,i,s,r){let c=await(this.seams.resolveUsdcAta??w.resolveVaultUsdcAta)(this.connection,new k.PublicKey(this.swigAddress)),m=this.seams.composeSend?{send:this.seams.composeSend,deactivateAlt:async()=>{}}:se(this.connection,this.feePayer,{commitment:this.confirmOptions.commitment});try{await(0,w.composeRevokeThenRegister)({connection:this.connection,vaultPda:this.vaultPdaKey,allowedCounterparty:o,registerArgs:{sessionPubkey:n,maxAmount:$(t.maxAmountAtomic),maxRevolvingCapacity:s,expiresAt:BigInt(t.expiresAtUnix),nonce:i,swigAddress:new k.PublicKey(this.swigAddress),vaultUsdcAta:c,payer:this.feePayer.publicKey},registerCeremony:{clientDataJSON:r.clientDataJSON,authenticatorData:r.authenticatorData,signature:r.signature},credentialPublicKey:this.passkey.publicKey,send:m.send,fetchSession:this.seams.fetchSession,fetchSessions:this.seams.fetchSessions,fetchPasskeyAuthorization:this.seams.fetchPasskeyAuthorization})}finally{m.deactivateAlt()}}async signWithSession(t,o){let n=await Jt(o.channelId),i=oe(t.registration);if((i.nonce&2147483648)!==0){let[s]=(0,w.deriveSessionPda)(i.vaultPda,i.allowedCounterparty,i.programId),r=Be({programId:i.programId.toBase58(),vaultPda:i.vaultPda.toBase58(),sessionPda:s.toBase58(),seller:i.allowedCounterparty.toBase58(),sessionNonce:i.nonce,channelId:(0,ge.bytesToHex)(n),cumulativeAmountAtomic:o.cumulativeAmount,sequenceOrdinal:o.sequenceNumber,sessionPrivateKey:t.privateKey,sessionPublicKey:t.publicKey,sessionRegistration:t.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"))}}return Oe(t,o,n)}async signOpenTab(t,o){return t.registration}async verifyFinalVoucherV2Reservation(t,o){await me(this.connection,t,o)}async signCloseTab(t,o,n){let i=oe(t.registration);if(!i.vaultPda.equals(this.vaultPdaKey)||!Buffer.from(i.sessionPubkey).equals(Buffer.from(t.publicKey)))throw new Error("session registration identity mismatch");let s=this.closeRevocationKey(t),r=this.completedCloseRevocations.get(s);if(r)return Uint8Array.from(r);let a=this.pendingCloseRevocations.get(s);if(a){let E=await this.reconcilePendingClose(a,i,!0);if(E==="complete")return this.rememberCompletedClose(s,a.message);if(E==="unresolved")throw new Error(`session revoke finality unresolved for ${a.signature}; retry close`);this.pendingCloseRevocations.delete(s)}let c=await this.readCloseTargetState(i.allowedCounterparty);if(!c)throw new Error("close revocation target state unavailable");if(c.kind==="invalidated"||this.targetInvalidated(c,i))return this.rememberCompletedClose(s,t.registration);let m=c.snapshot,d=$(n);if((m.spent>m.crystallizedCumulative?m.spent:m.crystallizedCumulative)<d)throw new Error("session revocation snapshot is behind final settlement");let g=(0,_.sessionRevokeMessage)(m),{signature:S,clientDataJSON:y,authenticatorData:f}=await this.passkey.signOperation(g),h=at(f,(0,Ve.sha256)(y)),p=(0,te.buildSecp256r1VerifyInstruction)(this.passkey.publicKey,S,h),R=(0,N.buildRevokeSessionKeyInstruction)({vaultPda:this.vaultPdaKey,allowedCounterparty:m.allowedCounterparty,expectedPendingVoucherCount:m.expectedPendingVoucherCount,clientDataJSON:y,authenticatorData:f}),P=new k.Transaction().add(p,R);P.feePayer=this.feePayer.publicKey;let x=null;try{let E=await this.connection.getSlot("finalized");x=Number.isSafeInteger(E)&&E>=0?E:null}catch{}let{blockhash:b,lastValidBlockHeight:O}=await this.connection.getLatestBlockhash(this.confirmOptions.commitment);if(P.recentBlockhash=b,P.sign(this.feePayer),!P.signature)throw new Error("session revoke transaction is unsigned");let V=Uint8Array.from(P.serialize()),u=ct.default.encode(P.signature),A={key:s,message:Uint8Array.from(g),serializedTransaction:V,signature:u,blockhash:b,lastValidBlockHeight:O,finalizedHistoryFloorSlot:x};this.pendingCloseRevocations.set(s,A);let L;try{let E=await this.connection.sendRawTransaction(V,{skipPreflight:!1,preflightCommitment:this.confirmOptions.preflightCommitment??this.confirmOptions.commitment});if(E!==u)throw new Error(`session revoke signature mismatch expected=${u} returned=${E}`);L=await this.connection.confirmTransaction({signature:u,blockhash:b,lastValidBlockHeight:O},"finalized")}catch(E){let Ce=await this.reconcilePendingClose(A,i,!1);if(Ce==="complete")return this.rememberCompletedClose(s,g);throw Ce==="fresh_allowed"?(this.pendingCloseRevocations.delete(s),new Error("session revoke transaction finalized without effect; retry close",{cause:E})):new Error(`session revoke finality unresolved for ${u}; retry close`,{cause:E})}if(L.value.err)throw this.pendingCloseRevocations.delete(s),new Error(`session revoke transaction failed: ${JSON.stringify(L.value.err)}`);return this.rememberCompletedClose(s,g)}};function Wt(e){return new Ie(e)}function at(e,t){let o=new Uint8Array(e.length+t.length);return o.set(e,0),o.set(t,e.length),o}async function Jt(e){if(/^[0-9a-f]{64}$/i.test(e))return Xt(e);let{sha256:t}=await import("@noble/hashes/sha256");return t(new TextEncoder().encode(e))}function Xt(e){let t=new Uint8Array(e.length/2);for(let o=0;o<t.length;o++)t[o]=parseInt(e.substr(o*2,2),16);return t}0&&(module.exports={LiveSessionExistsError,SOLANA_FINAL_VOUCHER_V2_MEMO_PROGRAM_ID,SOLANA_FINAL_VOUCHER_V2_PROGRAM_ID,SolanaFinalVoucherV2ReservationError,TX_SIZE_LIMIT_BYTES,buildAdapterRegisterInstruction,collectAltAddresses,compileComposeV0,createSelfPayingComposeSend,createSolanaFinalVoucherV2ReservationVerifier,createSolanaVaultAdapter,deriveChannelId,inspectSolanaFinalVoucherV2Reservation,passkeySignerFromP256Keypair,verifySolanaFinalVoucherV2Reservation});
@@ -1,6 +1,6 @@
1
1
  import { PublicKey, Connection, TransactionInstruction, Commitment, AddressLookupTableAccount, VersionedTransaction, Signer, ConfirmOptions } from '@solana/web3.js';
2
- import { F as FinalVoucherV2ReservationInput, V as VerifyFinalVoucherV2Reservation, a as FinalVoucherV2ReservationReceipt, b as VaultAdapter } from '../../../types-OHNNM1J2.cjs';
3
- export { A as AuthorizeSessionOptions, L as LiveSessionDetails, c as LiveSessionExistsError } from '../../../types-OHNNM1J2.cjs';
2
+ import { F as FinalVoucherV2ReservationInput, V as VerifyFinalVoucherV2Reservation, a as FinalVoucherV2ReservationReceipt, b as VaultAdapter } from '../../../types-D0IFR4Ro.cjs';
3
+ export { A as AuthorizeSessionOptions, L as LiveSessionDetails, c as LiveSessionExistsError } from '../../../types-D0IFR4Ro.cjs';
4
4
  export { d as deriveChannelId } from '../../../sessions-rPdO1CgK.cjs';
5
5
  import { fetchSessionAccount, fetchVaultSessionAccounts, resolveVaultUsdcAta, waitForSession } from '@dexterai/vault/session';
6
6
  import { fetchPasskeyAuthorizationState } from '@dexterai/vault';
@@ -82,9 +82,9 @@ declare function passkeySignerFromP256Keypair(kp: P256Keypair, options?: NodePas
82
82
  * carrying the domain-separated digest of the complete FINAL voucher and its
83
83
  * reservation identity. The Vault's recorded Dexter authority must sign both
84
84
  * instruction accounts. Provider-local lifecycle identifiers are only checked
85
- * for receipt shape/consistency: economic authority comes from the finalized
86
- * transaction, exact Memo, and one coherent post-state read fenced by the
87
- * independently fetched transaction slot.
85
+ * for receipt shape/consistency: economic authority comes from the
86
+ * independently confirmed transaction, exact Memo, and one coherent post-state
87
+ * read fenced by the independently fetched transaction slot.
88
88
  */
89
89
 
90
90
  declare class SolanaFinalVoucherV2ReservationError extends Error {
@@ -103,6 +103,7 @@ interface TransactionInstructionEvidence {
103
103
  }
104
104
  interface SolanaReservationTransactionEvidence {
105
105
  slot: number;
106
+ confirmationStatus: 'confirmed' | 'finalized';
106
107
  err: unknown | null;
107
108
  signatures: string[];
108
109
  accountKeys: TransactionAccountEvidence[];
@@ -145,19 +146,33 @@ interface SolanaReservationPostStateEvidence {
145
146
  interface ReadTransactionArgs {
146
147
  connection: Connection;
147
148
  signature: string;
148
- commitment: 'finalized';
149
+ commitment: 'confirmed';
149
150
  }
150
151
  interface ReadPostStateArgs {
151
152
  connection: Connection;
152
153
  input: FinalVoucherV2ReservationInput;
153
- /** Independently observed finalized reservation-transaction slot. Never a
154
+ /** Independently observed confirmed reservation-transaction slot. Never a
154
155
  * provider/buyer supplied postStateSlot. */
155
156
  minimumSlot: number;
157
+ commitment: 'confirmed';
156
158
  }
157
159
  interface SolanaReservationVerifierSeams {
158
160
  readTransaction?: (args: ReadTransactionArgs) => Promise<SolanaReservationTransactionEvidence | null>;
159
161
  readPostState?: (args: ReadPostStateArgs) => Promise<SolanaReservationPostStateEvidence>;
160
162
  }
163
+ interface SolanaFinalVoucherV2ReservationVerification {
164
+ /** Independently observed chain commitment; never copied from the receipt. */
165
+ commitment: 'confirmed' | 'finalized';
166
+ confirmationSlot: number;
167
+ postStateSlot: number;
168
+ sessionAccountVersion: number;
169
+ wireVersion: 2;
170
+ frontierAtomic: string;
171
+ spentAtomic: string;
172
+ currentOutstandingAtomic: string;
173
+ crystallizedCumulativeAtomic: string;
174
+ }
175
+ declare function inspectSolanaFinalVoucherV2Reservation(connection: Connection, input: FinalVoucherV2ReservationInput, receipt: FinalVoucherV2ReservationReceipt, seams?: SolanaReservationVerifierSeams): Promise<SolanaFinalVoucherV2ReservationVerification>;
161
176
  declare function verifySolanaFinalVoucherV2Reservation(connection: Connection, input: FinalVoucherV2ReservationInput, receipt: FinalVoucherV2ReservationReceipt, seams?: SolanaReservationVerifierSeams): Promise<void>;
162
177
  declare function createSolanaFinalVoucherV2ReservationVerifier(connection: Connection, seams?: SolanaReservationVerifierSeams): VerifyFinalVoucherV2Reservation;
163
178
  /** Production program ID is exported here only as a caller-side convenience;
@@ -398,4 +413,4 @@ declare function buildAdapterRegisterInstruction(p: AdapterRegisterIxParams): Tr
398
413
  /** Factory entry point. */
399
414
  declare function createSolanaVaultAdapter(opts: CreateSolanaVaultAdapterOptions): VaultAdapter;
400
415
 
401
- export { type AdapterRegisterIxParams, type CreateSolanaVaultAdapterOptions, SOLANA_FINAL_VOUCHER_V2_MEMO_PROGRAM_ID, SOLANA_FINAL_VOUCHER_V2_PROGRAM_ID, type SelfPayingComposeSend, type SelfPayingComposeSendOptions, type SolanaAdapterSeams, SolanaFinalVoucherV2ReservationError, type SolanaReservationPostStateEvidence, type SolanaReservationTransactionEvidence, type SolanaReservationVerifierSeams, TX_SIZE_LIMIT_BYTES, buildAdapterRegisterInstruction, collectAltAddresses, compileComposeV0, createSelfPayingComposeSend, createSolanaFinalVoucherV2ReservationVerifier, createSolanaVaultAdapter, passkeySignerFromP256Keypair, verifySolanaFinalVoucherV2Reservation };
416
+ export { type AdapterRegisterIxParams, type CreateSolanaVaultAdapterOptions, SOLANA_FINAL_VOUCHER_V2_MEMO_PROGRAM_ID, SOLANA_FINAL_VOUCHER_V2_PROGRAM_ID, type SelfPayingComposeSend, type SelfPayingComposeSendOptions, type SolanaAdapterSeams, SolanaFinalVoucherV2ReservationError, type SolanaFinalVoucherV2ReservationVerification, type SolanaReservationPostStateEvidence, type SolanaReservationTransactionEvidence, type SolanaReservationVerifierSeams, TX_SIZE_LIMIT_BYTES, buildAdapterRegisterInstruction, collectAltAddresses, compileComposeV0, createSelfPayingComposeSend, createSolanaFinalVoucherV2ReservationVerifier, createSolanaVaultAdapter, inspectSolanaFinalVoucherV2Reservation, passkeySignerFromP256Keypair, verifySolanaFinalVoucherV2Reservation };
@@ -1,6 +1,6 @@
1
1
  import { PublicKey, Connection, TransactionInstruction, Commitment, AddressLookupTableAccount, VersionedTransaction, Signer, ConfirmOptions } from '@solana/web3.js';
2
- import { F as FinalVoucherV2ReservationInput, V as VerifyFinalVoucherV2Reservation, a as FinalVoucherV2ReservationReceipt, b as VaultAdapter } from '../../../types-OHNNM1J2.js';
3
- export { A as AuthorizeSessionOptions, L as LiveSessionDetails, c as LiveSessionExistsError } from '../../../types-OHNNM1J2.js';
2
+ import { F as FinalVoucherV2ReservationInput, V as VerifyFinalVoucherV2Reservation, a as FinalVoucherV2ReservationReceipt, b as VaultAdapter } from '../../../types-D0IFR4Ro.js';
3
+ export { A as AuthorizeSessionOptions, L as LiveSessionDetails, c as LiveSessionExistsError } from '../../../types-D0IFR4Ro.js';
4
4
  export { d as deriveChannelId } from '../../../sessions-rPdO1CgK.js';
5
5
  import { fetchSessionAccount, fetchVaultSessionAccounts, resolveVaultUsdcAta, waitForSession } from '@dexterai/vault/session';
6
6
  import { fetchPasskeyAuthorizationState } from '@dexterai/vault';
@@ -82,9 +82,9 @@ declare function passkeySignerFromP256Keypair(kp: P256Keypair, options?: NodePas
82
82
  * carrying the domain-separated digest of the complete FINAL voucher and its
83
83
  * reservation identity. The Vault's recorded Dexter authority must sign both
84
84
  * instruction accounts. Provider-local lifecycle identifiers are only checked
85
- * for receipt shape/consistency: economic authority comes from the finalized
86
- * transaction, exact Memo, and one coherent post-state read fenced by the
87
- * independently fetched transaction slot.
85
+ * for receipt shape/consistency: economic authority comes from the
86
+ * independently confirmed transaction, exact Memo, and one coherent post-state
87
+ * read fenced by the independently fetched transaction slot.
88
88
  */
89
89
 
90
90
  declare class SolanaFinalVoucherV2ReservationError extends Error {
@@ -103,6 +103,7 @@ interface TransactionInstructionEvidence {
103
103
  }
104
104
  interface SolanaReservationTransactionEvidence {
105
105
  slot: number;
106
+ confirmationStatus: 'confirmed' | 'finalized';
106
107
  err: unknown | null;
107
108
  signatures: string[];
108
109
  accountKeys: TransactionAccountEvidence[];
@@ -145,19 +146,33 @@ interface SolanaReservationPostStateEvidence {
145
146
  interface ReadTransactionArgs {
146
147
  connection: Connection;
147
148
  signature: string;
148
- commitment: 'finalized';
149
+ commitment: 'confirmed';
149
150
  }
150
151
  interface ReadPostStateArgs {
151
152
  connection: Connection;
152
153
  input: FinalVoucherV2ReservationInput;
153
- /** Independently observed finalized reservation-transaction slot. Never a
154
+ /** Independently observed confirmed reservation-transaction slot. Never a
154
155
  * provider/buyer supplied postStateSlot. */
155
156
  minimumSlot: number;
157
+ commitment: 'confirmed';
156
158
  }
157
159
  interface SolanaReservationVerifierSeams {
158
160
  readTransaction?: (args: ReadTransactionArgs) => Promise<SolanaReservationTransactionEvidence | null>;
159
161
  readPostState?: (args: ReadPostStateArgs) => Promise<SolanaReservationPostStateEvidence>;
160
162
  }
163
+ interface SolanaFinalVoucherV2ReservationVerification {
164
+ /** Independently observed chain commitment; never copied from the receipt. */
165
+ commitment: 'confirmed' | 'finalized';
166
+ confirmationSlot: number;
167
+ postStateSlot: number;
168
+ sessionAccountVersion: number;
169
+ wireVersion: 2;
170
+ frontierAtomic: string;
171
+ spentAtomic: string;
172
+ currentOutstandingAtomic: string;
173
+ crystallizedCumulativeAtomic: string;
174
+ }
175
+ declare function inspectSolanaFinalVoucherV2Reservation(connection: Connection, input: FinalVoucherV2ReservationInput, receipt: FinalVoucherV2ReservationReceipt, seams?: SolanaReservationVerifierSeams): Promise<SolanaFinalVoucherV2ReservationVerification>;
161
176
  declare function verifySolanaFinalVoucherV2Reservation(connection: Connection, input: FinalVoucherV2ReservationInput, receipt: FinalVoucherV2ReservationReceipt, seams?: SolanaReservationVerifierSeams): Promise<void>;
162
177
  declare function createSolanaFinalVoucherV2ReservationVerifier(connection: Connection, seams?: SolanaReservationVerifierSeams): VerifyFinalVoucherV2Reservation;
163
178
  /** Production program ID is exported here only as a caller-side convenience;
@@ -398,4 +413,4 @@ declare function buildAdapterRegisterInstruction(p: AdapterRegisterIxParams): Tr
398
413
  /** Factory entry point. */
399
414
  declare function createSolanaVaultAdapter(opts: CreateSolanaVaultAdapterOptions): VaultAdapter;
400
415
 
401
- export { type AdapterRegisterIxParams, type CreateSolanaVaultAdapterOptions, SOLANA_FINAL_VOUCHER_V2_MEMO_PROGRAM_ID, SOLANA_FINAL_VOUCHER_V2_PROGRAM_ID, type SelfPayingComposeSend, type SelfPayingComposeSendOptions, type SolanaAdapterSeams, SolanaFinalVoucherV2ReservationError, type SolanaReservationPostStateEvidence, type SolanaReservationTransactionEvidence, type SolanaReservationVerifierSeams, TX_SIZE_LIMIT_BYTES, buildAdapterRegisterInstruction, collectAltAddresses, compileComposeV0, createSelfPayingComposeSend, createSolanaFinalVoucherV2ReservationVerifier, createSolanaVaultAdapter, passkeySignerFromP256Keypair, verifySolanaFinalVoucherV2Reservation };
416
+ export { type AdapterRegisterIxParams, type CreateSolanaVaultAdapterOptions, SOLANA_FINAL_VOUCHER_V2_MEMO_PROGRAM_ID, SOLANA_FINAL_VOUCHER_V2_PROGRAM_ID, type SelfPayingComposeSend, type SelfPayingComposeSendOptions, type SolanaAdapterSeams, SolanaFinalVoucherV2ReservationError, type SolanaFinalVoucherV2ReservationVerification, type SolanaReservationPostStateEvidence, type SolanaReservationTransactionEvidence, type SolanaReservationVerifierSeams, TX_SIZE_LIMIT_BYTES, buildAdapterRegisterInstruction, collectAltAddresses, compileComposeV0, createSelfPayingComposeSend, createSolanaFinalVoucherV2ReservationVerifier, createSolanaVaultAdapter, inspectSolanaFinalVoucherV2Reservation, passkeySignerFromP256Keypair, verifySolanaFinalVoucherV2Reservation };