mppx 0.9.3 → 0.10.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/CHANGELOG.md +20 -0
- package/dist/cli/cli.js +137 -137
- package/dist/cli/internal.d.ts +4 -1
- package/dist/cli/internal.js +38 -5
- package/dist/cli/plugins/index.js +13 -13
- package/dist/cli/validate/discovery.d.ts +3 -1
- package/dist/cli/validate/discovery.js +28 -1
- package/dist/cli/validate/helpers.d.ts +3 -2
- package/dist/cli/validate/helpers.js +3 -0
- package/dist/cli/validate/index.js +3 -1
- package/dist/cli/validate/payment.js +106 -53
- package/dist/client/Mppx.d.ts +45 -0
- package/dist/client/Mppx.js +191 -6
- package/dist/client/internal/Fetch.d.ts +6 -0
- package/dist/client/internal/Fetch.js +4 -2
- package/dist/internal/version.d.ts +2 -2
- package/dist/internal/version.js +1 -1
- package/dist/tempo/client/Charge.d.ts +8 -2
- package/dist/tempo/client/Charge.js +19 -11
- package/dist/tempo/server/internal/html.gen.d.ts +1 -1
- package/dist/tempo/server/internal/html.gen.js +1 -1
- package/dist/tempo/session/client/CredentialState.d.ts +2 -0
- package/dist/tempo/session/client/CredentialState.js +9 -3
- package/dist/tempo/session/client/Session.d.ts +6 -0
- package/dist/tempo/session/client/Session.js +4 -1
- package/dist/tempo/session/client/SessionManager.d.ts +6 -0
- package/dist/tempo/session/client/SessionManager.js +7 -0
- package/dist/validation/core.d.ts +1 -0
- package/dist/validation/core.js +7 -2
- package/dist/viem/Client.d.ts +4 -0
- package/dist/viem/Client.js +13 -0
- package/package.json +1 -1
|
@@ -1,19 +1,19 @@
|
|
|
1
|
-
import{createClient as e,createTransport as t,custom as n,encodeFunctionData as r,erc20Abi as i,getAbiItem as a,getAddress as o,hashTypedData as s,http as c,isAddress as l,isAddressEqual as u,parseUnits as d}from"viem";import{prepareTransactionRequest as f,readContract as p,sendCallsSync as m,sendTransactionSync as h,signTransaction as g,signTypedData as _}from"viem/actions";import*as v from"viem/chains";import{tempo as y}from"viem/chains";import{AbiParameters as b,Base64 as x,Bytes as S,Hash as C,Hex as w,Json as T,Signature as E}from"ox";import{z as D}from"zod/mini";import*as O from"node:child_process";import*as k from"node:fs";import*as A from"node:os";import*as j from"node:path";import{z as M}from"zod";import"node:readline";import{tempo as N,tempoModerato as ee}from"viem/tempo/chains";import{Abis as te,Account as ne,Actions as P,Addresses as re,TokenId as ie,Transaction as ae,withFeePayer as oe}from"viem/tempo";import{parseAccount as se,privateKeyToAccount as ce}from"viem/accounts";import{createParser as le}from"eventsource-parser";import{Channel as ue,KeyAuthorization as F,SignatureEnvelope as I,TempoAddress as de,TxEnvelopeTempo as fe}from"ox/tempo";import{defineToken as pe}from"viem/tokens";var me=Object.defineProperty,he=Object.getOwnPropertyDescriptor,ge=Object.getOwnPropertyNames,_e=Object.prototype.hasOwnProperty,ve=(e,t)=>{let n={};for(var r in e)me(n,r,{get:e[r],enumerable:!0});return t||me(n,Symbol.toStringTag,{value:`Module`}),n},ye=(e,t,n,r)=>{if(t&&typeof t==`object`||typeof t==`function`)for(var i=ge(t),a=0,o=i.length,s;a<o;a++)s=i[a],!_e.call(e,s)&&s!==n&&me(e,s,{get:(e=>t[e]).bind(null,s),enumerable:!(r=he(t,s))||r.enumerable});return e},be=(e,t,n)=>(ye(e,t,`default`),n&&ye(n,t,`default`));const xe=Symbol(`mppx.x402.asset`);function Se(e){return{[xe]:!0,address:e.address,decimals:e.decimals,network:e.network,transfer:e.transfer}}function Ce(e,t){let n=e(t.chainId);return Se({address:n.address,decimals:n.decimals,network:Ne(t.chainId),transfer:Fe(t.transfer,n)})}const we={USDC:Se({address:`0x833589fCD6eDb6E08f4c7C32D4f71b54bdA02913`,decimals:6,network:`eip155:8453`,transfer:{name:`USD Coin`,type:`eip3009`,version:`2`}})},Te={USDC:Se({address:`0x036CbD53842c5426634e7929541eC2318f3dCF7e`,decimals:6,network:`eip155:84532`,transfer:{name:`USDC`,type:`eip3009`,version:`2`}})},Ee={USDC:Se({address:`0xcebA9300f2b948710d2653dD7B07f33A8B32118C`,decimals:6,network:`eip155:42220`,transfer:{name:`USDC`,type:`eip3009`,version:`2`}}),USDT:Se({address:`0x48065fbBE25f71C9282ddf5e1cD6D6A887483D5e`,decimals:6,network:`eip155:42220`,transfer:{name:`Tether USD`,type:`eip3009`,version:`1`}})},De={USDC:Se({address:`0x01C5C0122039549AD1493B8220cABEdD739BC44E`,decimals:6,network:`eip155:11142220`,transfer:{name:`USDC`,type:`eip3009`,version:`2`}})};function Oe(e){return typeof e!=`object`||!e?!1:e[xe]===!0}function ke(e){return typeof e==`function`&&typeof e.addresses==`object`&&typeof e.decimals==`number`}function Ae(e){return typeof e==`string`}function je(e,t){if(Oe(e))return e.network===t?{address:e.address,decimals:e.decimals,transfer:e.transfer}:void 0;if(ke(e)){let n=e.addresses[Pe(t)];return n?{address:n,decimals:e.decimals,name:e.name}:void 0}return{address:e}}function Me(e,t,n){let r=je(e,n);return r?o(r.address)===o(t):!1}function Ne(e){return`eip155:${e}`}function Pe(e){return Number(e.slice(7))}function Fe(e,t){if(e.type!==`eip3009`)return e;if(e.name)return{...e,name:e.name};if(!t.name)throw Error(`EIP-3009 token assets require a token name.`);return{...e,name:t.name}}var Ie=ve({base:()=>we,baseSepolia:()=>Te,celo:()=>Ee,celoSepolia:()=>De,define:()=>Se,fromToken:()=>Ce,isAsset:()=>Oe,isRawAddress:()=>Ae,isToken:()=>ke,matches:()=>Me,resolve:()=>je,toChainId:()=>Pe,toNetwork:()=>Ne}),Le=ve({base:()=>Re,baseSepolia:()=>ze,celo:()=>Be,celoSepolia:()=>Ve});const Re=8453,ze=84532,Be=42220,Ve=11142220,L={acceptPayment:`Accept-Payment`,authorization:`Authorization`,paymentAuthorization:`Payment-Authorization`,paymentReceipt:`Payment-Receipt`,paymentSession:`Payment-Session`,paymentSessionSnapshot:`Payment-Session-Snapshot`,wwwAuthenticate:`WWW-Authenticate`},He={payment:`Payment`},Ue={evm:`evm`,stripe:`stripe`,tempo:`tempo`},We={charge:`charge`,session:`session`,subscription:`subscription`},Ge={sessionProtocol:`sessionProtocol`,sessionSnapshot:`sessionSnapshot`},Ke={v1:`v1`,v2:`v2`};function qe(e,t){if(!(!e||typeof e!=`object`))return e[t]}function Je(e){let t=x.toString(e);return JSON.parse(t)}function R(e){let t=T.canonicalize(e);return x.fromString(t,{pad:!1,url:!0})}var z=ve({address:()=>V,amount:()=>B,datetime:()=>Xe,datetimeInput:()=>Ze,hash:()=>H,period:()=>et,signature:()=>U,toDate:()=>Qe,toDatetimeString:()=>$e,unwrapOptional:()=>tt});import*as Ye from"zod/mini";be(z,Ye);function B(){return D.string().check(D.regex(/^\d+(\.\d+)?$/,`Invalid amount`))}function Xe(){return D.string().check(D.regex(/^\d{4}-\d{2}-\d{2}T\d{2}:\d{2}:\d{2}(?:\.\d+)?(?:Z|[+-]\d{2}:\d{2})$/,`Invalid ISO 8601 datetime`))}function Ze(e=`Invalid ISO 8601 datetime`){return D.pipe(D.union([Xe(),D.custom(e=>e instanceof Date)]),D.transform(Qe)).check(D.refine(e=>Number.isFinite(e.getTime()),e))}function Qe(e){return e instanceof Date?e:new Date(e)}function $e(e){return e instanceof Date?Number.isFinite(e.getTime())?e.toISOString():`Invalid Date`:e}function V(){return D.string().check(D.regex(/^0x[0-9a-fA-F]{40}$/,`Invalid address`))}function H(){return D.string().check(D.regex(/^0x[0-9a-fA-F]{64}$/,`Invalid hash`))}function et(){return D.string().check(D.regex(/^(day|week|month|year|\d+)$/,`Invalid period`))}function U(){return D.string().check(D.regex(/^0x[0-9a-fA-F]+$/,`Invalid signature`))}function tt(e){return e._zod.def.type===`optional`?e._zod.def.innerType:e}const nt=z.object({description:z.optional(z.string()),digest:z.optional(z.string().check(z.regex(/^sha-256=/,`Invalid digest format`))),expires:z.optional(Xe()),header:z.optional(z.string().check(z.regex(/^[!#$%&'*+.^_`|~0-9A-Za-z-]+$/,`Invalid HTTP header name`))),id:z.string().check(z.minLength(1)),intent:z.string(),method:z.string(),meta:z.optional(z.record(z.string(),z.string())),opaque:z.optional(z.string()),realm:z.string(),request:z.record(z.string(),z.unknown())});function rt(e,t){let{description:n,digest:r,meta:i,method:a,header:o,intent:s,realm:c,request:l,secretKey:u}=e,d=_t(o)?void 0:o,f=e.expires?$e(e.expires):void 0,p=e.opaque??(i===void 0?void 0:R(i)),m=u?vt({...e,expires:f,...i!==void 0&&{meta:i},opaque:p},{secretKey:u}):e.id;return nt.parse({id:m,realm:c,method:a,intent:s,request:l,...n&&{description:n},...r&&{digest:r},...f&&{expires:f},...d!==void 0&&{header:d},...i!==void 0&&{meta:i},...p!==void 0&&{opaque:p}})}function it(e){let t=[W(`id`,e.id),W(`realm`,e.realm),W(`method`,e.method),W(`intent`,e.intent),W(`request`,R(e.request))];e.description!==void 0&&t.push(W(`description`,e.description)),e.digest!==void 0&&t.push(W(`digest`,e.digest)),e.expires!==void 0&&t.push(W(`expires`,e.expires));let n=e.header;return n!==void 0&&!_t(n)&&t.push(W(`header`,n)),e.opaque===void 0?e.meta!==void 0&&t.push(W(`opaque`,R(e.meta))):t.push(W(`opaque`,e.opaque)),`${He.payment} ${t.join(`, `)}`}function W(e,t){if(/[\r\n]/.test(t))throw Error(`Invalid quoted-string value.`);return`${e}="${t.replace(/\\/g,`\\\\`).replace(/"/g,`\\"`).replace(/[\u0100-\uffff]/g,e=>`\\u${e.charCodeAt(0).toString(16).padStart(4,`0`)}`)}"`}function at(e,t){let n=ot(e);if(!n)throw Error(`Missing Payment scheme.`);let{request:r,opaque:i,...a}=st(n);if(!r)throw Error(`Missing request parameter.`);if(r.length>16384)throw Error(`Request parameter too large.`);if(a.method&&!/^[a-z][a-z0-9:_-]*$/.test(a.method))throw Error(`Invalid method: "${a.method}". Must be lowercase per spec.`);return rt({...a,request:Je(r),...i&&{opaque:i}},t)}function ot(e){let t=He.payment,[n]=dt(e,t);if(n===void 0)return null;let r=n+t.length;for(;r<e.length&&/\s/.test(e[r]??``);)r++;return e.slice(r)}function st(e){let t=Object.create(null),n=0;for(;n<e.length;){for(;n<e.length&&/[\s,]/.test(e[n]??``);)n++;if(n>=e.length)break;let r=n;for(;n<e.length&&/[A-Za-z0-9_-]/.test(e[n]??``);)n++;let i=e.slice(r,n).toLowerCase();if(!i)throw Error(`Malformed auth-param.`);for(;n<e.length&&/\s/.test(e[n]??``);)n++;if(e[n]!==`=`)break;for(n++;n<e.length&&/\s/.test(e[n]??``);)n++;let[a,o]=ct(e,n);if(n=o,i in t)throw Error(`Duplicate parameter: ${i}`);t[i]=a}return t}function ct(e,t){if(e[t]===`"`)return lt(e,t+1);let n=t;for(;n<e.length&&e[n]!==`,`;)n++;return[e.slice(t,n).trim(),n]}function lt(e,t){let n=t,r=!1,i=t,a;for(;n<e.length;){let o=e[n];if(n++,r){a??=[];let t=o===`u`?e.slice(n,n+4):void 0;t&&/^[0-9A-Fa-f]{4}$/.test(t)?(a.push(String.fromCharCode(Number.parseInt(t,16))),n+=4):a.push(o),i=n,r=!1;continue}if(o===`\\`){a??=[],a.push(e.slice(i,n-1)),i=n,r=!0;continue}if(o===`"`)return[a?[...a,e.slice(i,n-1)].join(``):e.slice(t,n-1),n]}throw Error(`Unterminated quoted-string.`)}function ut(e,t,n){if(e.slice(t,t+n.length).toLowerCase()!==n.toLowerCase())return!1;let r=e[t+n.length];return!!(r&&/\s/.test(r))}function dt(e,t){let n=[],r=!1,i=!1;for(let a=0;a<e.length;a++){let o=e[a];if(r){i?i=!1:o===`\\`?i=!0:o===`"`&&(r=!1);continue}if(o===`"`){r=!0;continue}if(!ut(e,a,t))continue;let s=a-1;for(;s>=0&&/\s/.test(e[s]??``);)s--;s>=0&&e[s]!==`,`||n.push(a)}return n}function ft(e,t){if(e.status!==402)throw Error(`Response status is not 402.`);return pt(e.headers,t)}function pt(e,t){let n=e.get(L.wwwAuthenticate);if(!n)throw Error(`Missing ${L.wwwAuthenticate} header.`);return mt(n,t)}function mt(e,t){let n=dt(e,He.payment);if(n.length===0)throw Error(`No Payment schemes found.`);return n.map((r,i)=>{let a=i+1<n.length?n[i+1]:e.length;return at(e.slice(r,a).replace(/,\s*$/,``),t)})}function ht(e){let t=[e.realm,e.method,e.intent,R(e.request),e.expires??``,e.digest??``],n=e.header;return n!==void 0&&!_t(n)&&t.push(n),t.push(e.opaque??(e.meta?R(e.meta):``)),t.join(`|`)}function gt(e){return e.header??L.authorization}function _t(e){return e?.toLowerCase()===L.authorization.toLowerCase()}function vt(e,t){let n=ht(e),r=S.fromString(t.secretKey),i=S.fromString(n),a=C.hmac256(r,i,{as:`Bytes`});return x.fromBytes(a,{url:!0,pad:!1})}var yt=class extends Error{name=`MissingPaymentSchemeError`;constructor(){super(`Missing Payment scheme.`)}},bt=class extends Error{name=`InvalidCredentialEncodingError`;constructor(){super(`Invalid base64url or JSON.`)}};function xt(e){let t=e.match(RegExp(`^${He.payment}\\s+(.+)$`,`i`));if(!t?.[1])throw new yt;try{let e=x.toString(t[1]),n=JSON.parse(e),{opaque:r,request:i,meta:a,...o}=n.challenge,{meta:s,opaque:c}=St(r);return{challenge:nt.parse({...o,...s!==void 0&&{meta:s},...c!==void 0&&{opaque:c},request:Je(i)}),payload:n.payload,...n.source&&{source:n.source}}}catch{throw new bt}}function St(e){if(e===void 0)return{};if(typeof e==`string`)return{opaque:e};if(!Ct(e))throw Error(`Invalid opaque.`);return{meta:e,opaque:R(e)}}function Ct(e){return typeof e!=`object`||!e||Array.isArray(e)?!1:Object.values(e).every(e=>typeof e==`string`)}function wt(e){let{challenge:t,payload:n,source:r}=e;return{challenge:t,payload:n,...r&&{source:r}}}function G(e){let{meta:t,opaque:n,request:r,...i}=e.challenge,a=n??(t===void 0?void 0:R(t)),o={challenge:{...i,...a!==void 0&&{opaque:a},request:R(r)},payload:e.payload,...e.source&&{source:e.source}},s=JSON.stringify(o),c=x.fromString(s,{pad:!1,url:!0});return`${He.payment} ${c}`}var Tt=class extends Error{details;status=402;hint;constructor(e,t={}){super(e),this.details=t.details}toProblemDetails(e){return{type:this.type,title:this.title,status:this.status,detail:this.message,...this.details&&Object.keys(this.details).length>0&&{details:this.details},...this.hint&&{hint:this.hint},...e&&{challengeId:e}}}},Et=class extends Tt{name=`InvalidChallengeError`;title=`Invalid Challenge`;status=402;type=`https://paymentauth.org/problems/invalid-challenge`;constructor(e={}){let{id:t,reason:n}=e,r=t?` "${t}"`:``,i=n?`: ${n}`:``;super(`Challenge${r} is invalid${i}.`)}},K=class extends Tt{name=`VerificationFailedError`;title=`Verification Failed`;type=`https://paymentauth.org/problems/verification-failed`;constructor(e={}){let{details:t,reason:n}=e;super(n?`Payment verification failed: ${n}.`:`Payment verification failed.`,{details:t})}},Dt=class extends Tt{name=`PaymentExpiredError`;title=`Payment Expired`;type=`https://paymentauth.org/problems/payment-expired`;constructor(e={}){let{expires:t}=e;super(t?`Payment expired at ${t}.`:`Payment has expired.`)}};function Ot(e,t){if(!e)throw new Et({...t&&{id:t},reason:`missing required expires field`});if(Number.isNaN(new Date(e).getTime()))throw new Et({...t&&{id:t},reason:`malformed expires timestamp`});if(new Date(e)<new Date)throw new Dt({expires:e})}function kt(e){return e}function At(e,t){let{canHandleChallenge:n,context:r,createCredential:i}=t;return{...e,canHandleChallenge:n,context:r,createCredential:i}}function jt(e){return{encode(t){return x.fromString(JSON.stringify(e.parse(t)))},decode(t){try{return e.parse(JSON.parse(x.toString(t)))}catch{throw new Mt}}}}var Mt=class extends Error{name=`InvalidJsonHeaderError`;constructor(){super(`Invalid base64 JSON header.`)}};const Nt=[`exact`],Pt=`PAYMENT-REQUIRED`,Ft=`PAYMENT-SIGNATURE`,It=z.string().check(z.minLength(1)),Lt=z.number().check(z.refine(e=>e>0,`Must be positive`)),q=z.string().check(z.regex(/^\d+$/,`Invalid atomic amount`)),Rt=V(),zt=z.string().check(z.regex(RegExp(`^eip155:\\d+$`),`Invalid EVM CAIP-2 network`)),Bt=z.object({description:z.optional(z.string()),iconUrl:z.optional(z.string()),mimeType:z.optional(z.string()),serviceName:z.optional(z.string()),tags:z.optional(z.array(z.string())),url:It});z.discriminatedUnion(`type`,[z.object({name:It,type:z.literal(`eip3009`),version:It}),z.object({name:z.optional(z.string()),type:z.literal(`permit2`),version:z.optional(z.string())})]);const Vt=z.object({amount:q,asset:It,extra:z.optional(z.record(z.string(),z.unknown())),maxTimeoutSeconds:Lt,network:zt,payTo:It,scheme:z.enum(Nt)}),Ht=z.object({info:z.record(z.string(),z.unknown()),schema:z.record(z.string(),z.unknown())}),Ut=z.record(z.string(),Ht),Wt=z.object({accepts:z.array(Vt).check(z.minLength(1)),error:z.optional(z.string()),extensions:z.optional(Ut),resource:Bt,x402Version:z.literal(2)}),Gt=z.object({authorization:z.object({from:Rt,nonce:H(),to:Rt,validAfter:q,validBefore:q,value:q}),signature:U()}),Kt=z.object({permit2Authorization:z.object({deadline:q,from:Rt,nonce:q,permitted:z.object({amount:q,token:Rt}),spender:Rt,witness:z.object({to:Rt,validAfter:q})}),signature:U()}),qt=z.union([Gt,Kt]),Jt=z.object({accepted:Vt,extensions:z.optional(Ut),payload:qt,resource:z.optional(Bt),x402Version:z.literal(2)});z.object({extensions:z.optional(Ut),extra:z.optional(z.record(z.string(),z.unknown())),invalidMessage:z.optional(z.string()),invalidReason:z.optional(z.string()),isValid:z.boolean(),payer:z.optional(z.string())});const Yt=z.object({amount:z.optional(q),errorMessage:z.optional(z.string()),errorReason:z.optional(z.string()),extensions:z.optional(Ut),extra:z.optional(z.record(z.string(),z.unknown())),network:It,payer:z.optional(z.string()),success:z.boolean(),transaction:z.string()});function Xt(e){let{extensions:t,resource:n,...r}=e;return Vt.parse(r)}const Zt=jt(Wt),Qt=jt(Jt),$t=jt(Yt);Zt.encode,Zt.decode;function en(e){try{let t=JSON.parse(x.toString(e));return nn(t)}catch{throw new Mt}}const tn=Qt.encode;Qt.decode,$t.encode,$t.decode;const nn=e=>{if(!e||typeof e!=`object`||Array.isArray(e))throw new Mt;let t=e;if(t.x402Version!==2||!Array.isArray(t.accepts))throw new Mt;let n=Bt.parse(t.resource),r=t.extensions===void 0?void 0:Ut.safeParse(t.extensions).data;return{accepts:t.accepts,...r?{extensions:r}:{},resource:n,x402Version:2}};function rn(e){let t=[R(e.accepted),R(e.resource),R(e.extensions)].join(`|`);return C.sha256(S.fromString(t),{as:`Hex`})}async function an(e){let t=e.context?.account??e.config.account;if(!t?.signTypedData)throw Error(`x402 exact requires a typed-data signer.`);let n=e.challenge.request,r=Xt(n);if(ln(e.config,r),!n.resource)throw Error(`x402 exact EIP-3009 requires resource information.`);let i=n.extensions?.mppx?dn(n.extensions):n.extensions,a=r.extra?.assetTransferMethod??`eip3009`;if(a!==`eip3009`)throw Error(`x402 exact ${String(a)} signing is not implemented yet.`);let s=r.extra?.name,c=r.extra?.version;if(typeof s!=`string`||typeof c!=`string`)throw Error(`x402 exact EIP-3009 requires token name and version.`);let l=Math.floor(Date.now()/1e3),u={from:o(t.address),nonce:i?.mppx?rn({accepted:r,extensions:i,resource:n.resource}):pn(),to:o(r.payTo),validAfter:(l-600).toString(),validBefore:(l+r.maxTimeoutSeconds).toString(),value:r.amount},d=await t.signTypedData({domain:{chainId:cn(r.network),name:s,verifyingContract:o(r.asset),version:c},message:{...u,value:BigInt(u.value),validAfter:BigInt(u.validAfter),validBefore:BigInt(u.validBefore)},primaryType:`TransferWithAuthorization`,types:sn});return tn({accepted:r,...i?{extensions:i}:{},payload:{authorization:u,signature:d},...n.resource?{resource:n.resource}:{},x402Version:2})}function on(e){let t=e.challenge.request,n;try{n=Xt(t),ln(e.config,n)}catch{return!1}if(!t.resource||(n.extra?.assetTransferMethod??`eip3009`)!==`eip3009`)return!1;let r=n.extra?.name,i=n.extra?.version;return typeof r==`string`&&typeof i==`string`}const sn={TransferWithAuthorization:[{name:`from`,type:`address`},{name:`to`,type:`address`},{name:`value`,type:`uint256`},{name:`validAfter`,type:`uint256`},{name:`validBefore`,type:`uint256`},{name:`nonce`,type:`bytes32`}]};function cn(e){return Number(e.slice(7))}function ln(e,t){let n=cn(t.network);if(e.networks&&!e.networks.includes(n))throw Error(`x402 exact chain ID is not allowed: ${n}.`);let r=e.currencies??e.assets;if(r?.some(e=>Ae(e))&&!e.networks?.length)throw Error(`x402 exact raw currency allowlists require networks.`);if(r){let e=o(t.asset);if(!r.some(n=>Me(n,e,t.network)))throw Error(`x402 exact currency is not allowed: ${e}.`)}if(e.maxAtomicAmount!==void 0&&BigInt(t.amount)>BigInt(e.maxAtomicAmount))throw Error(`x402 exact amount exceeds maxAtomicAmount.`);if(e.maxAmount!==void 0){let n=un(e,t);if(n===void 0)throw Error(`x402 exact maxAmount requires currency decimals.`);if(BigInt(t.amount)>d(e.maxAmount,n))throw Error(`x402 exact amount exceeds maxAmount.`)}}function un(e,t){let n=e.currencies??e.assets,r=o(t.asset),i=n?.find(e=>Me(e,r,t.network)),a=i?je(i,t.network):void 0;return a?.decimals===void 0?e.decimals:a.decimals}function dn(e){let t=e.mppx;return t?{...e,mppx:{...t,info:{...t.info,nonce:fn()}}}:e}function fn(){return mn().slice(2)}function pn(){return mn()}function mn(){let e=globalThis.crypto;if(!e?.getRandomValues)throw Error(`x402 exact requires crypto randomness.`);let t=e.getRandomValues(new Uint8Array(32));return`0x${Array.from(t,e=>e.toString(16).padStart(2,`0`)).join(``)}`}const hn=Symbol.for(`mppx.x402.challenge`);function gn(e){return Object.defineProperty(e,hn,{value:!0}),e}function _n(e){return!!e?.[hn]}const vn=[`authorization`],yn=z.string().check(z.regex(/^\d+$/,`Invalid atomic amount`));z.object({name:z.string().check(z.minLength(1)),version:z.string().check(z.minLength(1))});const bn=z.object({chainId:z.number(),credentialTypes:z.optional(z.array(z.enum(vn)).check(z.minLength(1))),decimals:z.optional(z.number()),permit2Address:z.optional(V()),splits:z.optional(z.array(z.object({amount:yn,recipient:V()})))});z.object({amount:yn,currency:V(),description:z.optional(z.string()),externalId:z.optional(z.string()),methodDetails:bn,recipient:V()});const xn=z.object({amount:B(),chainId:z.number(),currency:V(),credentialTypes:z.optional(z.array(z.enum(vn)).check(z.minLength(1))),decimals:z.number(),description:z.optional(z.string()),externalId:z.optional(z.string()),permit2Address:z.optional(V()),recipient:V(),splits:z.optional(z.array(z.object({amount:yn,recipient:V()})))}),Sn=z.object({from:V(),nonce:H(),signature:U(),to:V(),type:z.literal(`authorization`),validAfter:yn,validBefore:yn,value:yn}),Cn={TransferWithAuthorization:[{name:`from`,type:`address`},{name:`to`,type:`address`},{name:`value`,type:`uint256`},{name:`validAfter`,type:`uint256`},{name:`validBefore`,type:`uint256`},{name:`nonce`,type:`bytes32`}]};function wn(e){return{chainId:e.chainId,name:e.authorization.name,verifyingContract:e.currency,version:e.authorization.version}}function Tn(e){return C.keccak256(S.fromString(`${e.id}${e.realm}`),{as:`Hex`})}function En(e){return`eip155:${e}`}function Dn(e){return`did:pkh:eip155:${e.chainId}:${e.address}`}const On=kt({name:`evm`,intent:`charge`,schema:{credential:{payload:Sn},request:z.pipe(xn,z.transform(({amount:e,chainId:t,credentialTypes:n=[`authorization`],currency:r,decimals:i,permit2Address:a,recipient:s,splits:c,...l})=>({...l,amount:d(e,i).toString(),currency:o(r),methodDetails:{chainId:t,credentialTypes:n,decimals:i,...a?{permit2Address:o(a)}:{},...c?{splits:c}:{}},recipient:o(s)})))}});function kn(e){return At(On,{canHandleChallenge({challenge:t}){return!An(t)||on({challenge:t,config:e})},context:z.object({account:z.optional(z.custom())}),async createCredential({challenge:t,context:n}){if(An(t))return an({challenge:t,config:e,context:n});let r=n?.account??e.account;if(!r?.signTypedData)throw Error(`EVM authorization requires a typed-data signer.`);let i=t.request;if(jn(e,i),!i.methodDetails.credentialTypes?.includes(`authorization`))throw Error(`EVM authorization is not accepted by this challenge.`);if(i.methodDetails.splits?.length)throw Error(`EVM authorization does not support payment splits.`);let a=Mn(e,i),s=t.expires?Math.floor(new Date(t.expires).getTime()/1e3).toString():(Math.floor(Date.now()/1e3)+300).toString();return G(wt({challenge:t,payload:{from:o(r.address),nonce:Tn(t),signature:await r.signTypedData({domain:wn({authorization:a,chainId:i.methodDetails.chainId,currency:i.currency}),message:{from:o(r.address),nonce:Tn(t),to:o(i.recipient),validAfter:0n,validBefore:BigInt(s),value:BigInt(i.amount)},primaryType:`TransferWithAuthorization`,types:Cn}),to:o(i.recipient),type:`authorization`,validAfter:`0`,validBefore:s,value:i.amount},source:Dn({address:o(r.address),chainId:i.methodDetails.chainId})}))}})}function An(e){return _n(e)&&e.request.scheme===`exact`&&typeof e.request.network==`string`}function jn(e,t){let n=t.methodDetails.chainId,r=En(n);if(e.networks&&!e.networks.includes(n))throw Error(`EVM chain ID is not allowed: ${n}.`);let i=e.currencies??e.assets;if(i?.some(e=>Ae(e))&&!e.networks?.length)throw Error(`EVM raw currency allowlists require networks.`);if(i){let e=o(t.currency);if(!i.some(t=>Me(t,e,r)))throw Error(`EVM currency is not allowed: ${e}.`)}if(e.maxAtomicAmount!==void 0&&BigInt(t.amount)>BigInt(e.maxAtomicAmount))throw Error(`EVM charge amount exceeds maxAtomicAmount.`);if(e.maxAmount!==void 0){let n=Nn(e,t);if(n===void 0)throw Error(`EVM charge maxAmount requires currency decimals.`);if(BigInt(t.amount)>d(e.maxAmount,n))throw Error(`EVM charge amount exceeds maxAmount.`)}}function Mn(e,t){let n=e.currencies??e.assets,r=o(t.currency),i=En(t.methodDetails.chainId),a=n?.find(e=>Me(e,r,i)),s=a?je(a,i):void 0;if(s?.transfer?.type===`eip3009`)return{name:s.transfer.name,version:s.transfer.version};if(e.authorization)return e.authorization;throw Error(`EVM authorization requires token name and version.`)}function Nn(e,t){let n=e.currencies??e.assets,r=o(t.currency),i=En(t.methodDetails.chainId),a=n?.find(e=>Me(e,r,i)),s=a?je(a,i):void 0;return s?.decimals===void 0?e.decimals:s.decimals}function Pn(e){return[Pn.charge(e)]}(function(e){e.charge=kn,e.assets=Ie,e.chains=Le})(Pn||={});var Fn=class extends Error{name=`Incur.BaseError`;shortMessage;details;constructor(e,t={}){let n=t.cause instanceof Error?t.cause.message:void 0,r=n?`${e}\n\nDetails: ${n}`:e;super(r,t.cause?{cause:t.cause}:void 0),this.shortMessage=e,this.details=n}walk(e){return In(this,e)}},J=class extends Fn{name=`Incur.IncurError`;code;hint;retryable;exitCode;constructor(e){super(e.message,e.cause?{cause:e.cause}:void 0),this.code=e.code,this.hint=e.hint,this.retryable=e.retryable??!1,this.exitCode=e.exitCode}};function In(e,t){if(t){let n=e?.cause;for(;n;){if(t(n))return n;n=n?.cause}return}let n=e;for(;n?.cause;)n=n.cause;return n}const Y={mainnet:4217,testnet:42431},Ln={usdc:`0x20C000000000000000000000b9537d11c60E8b50`,pathUsd:`0x20c0000000000000000000000000000000000000`},Rn={[Y.mainnet]:Ln.usdc,[Y.testnet]:Ln.pathUsd},zn={[Y.mainnet]:`0x33b901018174DDabE4841042ab76ba85D4e24f25`,[Y.testnet]:`0xe1c4d3dce17bc111181ddf716f75bae49e61a336`},Bn={[Y.mainnet]:`https://rpc.tempo.xyz`,[Y.testnet]:`https://rpc.moderato.tempo.xyz`},X=(()=>{let e=process||{},t=e.argv||[],n=e.env||{},r=!(n.NO_COLOR||t.includes(`--no-color`))&&(!!n.FORCE_COLOR||t.includes(`--color`)||(e.stdout||{}).isTTY&&n.TERM!==`dumb`||!!n.CI),i=(e,t,n,r)=>{let i=``,a=0,o=r;do i+=e.substring(a,o)+n,a=o+t.length,o=e.indexOf(t,a);while(~o);return i+e.substring(a)},a=r?(e,t,n=e)=>r=>{let a=`${r}`,o=a.indexOf(t,e.length);return~o?e+i(a,t,n,o)+t:e+a+t}:()=>String;return{isColorSupported:r,reset:a(`\x1B[0m`,`\x1B[0m`),bold:a(`\x1B[1m`,`\x1B[22m`,`\x1B[22m\x1B[1m`),dim:a(`\x1B[2m`,`\x1B[22m`,`\x1B[22m\x1B[2m`),italic:a(`\x1B[3m`,`\x1B[23m`),underline:a(`\x1B[4m`,`\x1B[24m`),inverse:a(`\x1B[7m`,`\x1B[27m`),hidden:a(`\x1B[8m`,`\x1B[28m`),strikethrough:a(`\x1B[9m`,`\x1B[29m`),black:a(`\x1B[30m`,`\x1B[39m`),red:a(`\x1B[31m`,`\x1B[39m`),green:a(`\x1B[32m`,`\x1B[39m`),yellow:a(`\x1B[33m`,`\x1B[39m`),blue:a(`\x1B[34m`,`\x1B[39m`),magenta:a(`\x1B[35m`,`\x1B[39m`),cyan:a(`\x1B[36m`,`\x1B[39m`),white:a(`\x1B[37m`,`\x1B[39m`),gray:a(`\x1B[90m`,`\x1B[39m`),bgBlack:a(`\x1B[40m`,`\x1B[49m`),bgRed:a(`\x1B[41m`,`\x1B[49m`),bgGreen:a(`\x1B[42m`,`\x1B[49m`),bgYellow:a(`\x1B[43m`,`\x1B[49m`),bgBlue:a(`\x1B[44m`,`\x1B[49m`),bgMagenta:a(`\x1B[45m`,`\x1B[49m`),bgCyan:a(`\x1B[46m`,`\x1B[49m`),bgWhite:a(`\x1B[47m`,`\x1B[49m`),blackBright:a(`\x1B[90m`,`\x1B[39m`),redBright:a(`\x1B[91m`,`\x1B[39m`),greenBright:a(`\x1B[92m`,`\x1B[39m`),yellowBright:a(`\x1B[93m`,`\x1B[39m`),blueBright:a(`\x1B[94m`,`\x1B[39m`),magentaBright:a(`\x1B[95m`,`\x1B[39m`),cyanBright:a(`\x1B[96m`,`\x1B[39m`),whiteBright:a(`\x1B[97m`,`\x1B[39m`),bgBlackBright:a(`\x1B[100m`,`\x1B[49m`),bgRedBright:a(`\x1B[101m`,`\x1B[49m`),bgGreenBright:a(`\x1B[102m`,`\x1B[49m`),bgYellowBright:a(`\x1B[103m`,`\x1B[49m`),bgBlueBright:a(`\x1B[104m`,`\x1B[49m`),bgMagentaBright:a(`\x1B[105m`,`\x1B[49m`),bgCyanBright:a(`\x1B[106m`,`\x1B[49m`),bgWhiteBright:a(`\x1B[107m`,`\x1B[49m`),link(e,t,n){return r?`\x1b]8;;${e}\x07${n?t:X.underline(t)}\x1b]8;;\x07`:t}}})();function Vn(e,t){return X.link(e,t)}function Hn(e){return e.startsWith(`tempo:`)}function Un(e,t,n=6,r){let[i,a]=(Number(e)/10**n).toString().split(`.`),o=i.replace(/\B(?=(\d{3})+(?!\d))/g,`_`),s=r?.explorerUrl&&r.token?X.dim(X.link(`${r.explorerUrl}/token/${r.token}`,t,!0)):X.dim(t);return`${a?`${o}.${a}`:o} ${s}`}const Wn={mainnet:Bn[Y.mainnet],testnet:Bn[Y.testnet]};function Gn(e,t={}){return e??(t.network?Wn[t.network]:void 0)??(process.env.MPPX_RPC_URL?.trim()||process.env.RPC_URL?.trim()||void 0)}async function Kn(t={}){let n=Gn(t.rpcUrl,{network:t.network});if(!n)return N;let{getChainId:r}=await import(`viem/actions`),i=await r(e({transport:c(n)})),a=Object.values(await import(`viem/tempo/chains`)).filter(e=>typeof e==`object`&&!!e&&`id`in e&&e.id===i),o=a.find(e=>`serializers`in e&&e.serializers)??a[0];if(!o)throw Error(`Unknown chain ID ${i} from RPC ${n}`);return o}function qn(e){return typeof e==`bigint`?e:e.amount}function Jn(e){return e.id!==N.id}async function Yn(e,t,n){let{Actions:r}=await import(`viem/tempo`),[i,a]=await Promise.all([r.token.getBalance(e,{account:n,token:t}).then(qn).catch(()=>0n),r.token.getMetadata(e,{token:t}).catch(()=>({symbol:t}))]);return{balance:i,symbol:{"0x20c0000000000000000000000000000000000000":`PathUSD`,"0x20C000000000000000000000b9537d11c60E8b50":`USDC`}[t]??a.symbol,decimals:`decimals`in a&&typeof a.decimals==`number`?a.decimals:6,token:t}}function Xn(){let e=Number.parseInt(process.env.MPPX_KEYCHAIN_COMMAND_TIMEOUT_MS??``,10);return Number.isFinite(e)&&e>0?e:1e4}function Zn(e,t){return`code`in e&&e.code===`ENOENT`&&e.message.includes(t)}function Qn(e){return new J({code:`KEYCHAIN_UNAVAILABLE`,message:`Linux keyring requires secret-tool. Install libsecret-tools.`,hint:`On Debian/Ubuntu, run: sudo apt install libsecret-tools gnome-keyring dbus-x11`,exitCode:69,cause:e})}function $n(e){if(e&&Zn(e,`secret-tool`))throw Qn(e)}function er(e,t){return new Promise(n=>{O.execFile(e,t,{timeout:Xn()},(e,t,r)=>{n({stdout:t.trim(),stderr:r.trim(),error:e})})})}function tr(){let e=j.join(process.env.XDG_CONFIG_HOME||j.join(A.homedir(),`.config`),`mppx`,`default`);return{get(){try{return k.readFileSync(e,`utf-8`).trim()||`main`}catch{return`main`}},set(t){k.mkdirSync(j.dirname(e),{recursive:!0}),k.writeFileSync(e,t,`utf-8`)},clear(){try{k.unlinkSync(e)}catch{}}}}function nr(e){return e||(process.env.MPPX_ACCOUNT?.trim()?process.env.MPPX_ACCOUNT:tr().get())}function rr(e=`main`){let t=`mppx`;return{async list(){let e=A.platform();if(e===`darwin`){let{stdout:e,error:n}=await er(`security`,[`dump-keychain`]);if(n)return[];let r=[],i=e.split(`keychain:`);for(let e of i){let n=e.match(/"svce"<blob>="([^"]*)"/),i=e.match(/"acct"<blob>="([^"]*)"/);n?.[1]===t&&i?.[1]&&r.push(i[1])}return r}if(e===`linux`){let{stdout:e,stderr:n,error:r}=await er(`secret-tool`,[`search`,`--all`,`--unlock`,`service`,t]);if($n(r),r)return[];let i=`${e}\n${n}`,a=[],o=i.matchAll(/\baccount = (.+)/g);for(let e of o)e[1]&&a.push(e[1]);return a}throw Error(`Unsupported platform: ${e}`)},async get(){let n=A.platform();if(n===`darwin`){let{stdout:n,error:r}=await er(`security`,[`find-generic-password`,`-s`,t,`-a`,e,`-w`]);return r?void 0:n}if(n===`linux`){let{stdout:n,error:r}=await er(`secret-tool`,[`lookup`,`service`,t,`account`,e]);return $n(r),r?void 0:n||void 0}throw Error(`Unsupported platform: ${n}`)},async set(n){let r=A.platform();if(r===`darwin`){await er(`security`,[`delete-generic-password`,`-s`,t,`-a`,e]);let{error:r}=await er(`security`,[`add-generic-password`,`-s`,t,`-a`,e,`-w`,n]);if(r)throw r;return}if(r===`linux`){let r=O.execFile(`secret-tool`,[`store`,`--label`,`${t} ${e}`,`service`,t,`account`,e]),i=setTimeout(()=>r.kill(),Xn());return r.stdin?.write(n),r.stdin?.end(),new Promise((e,t)=>{r.on(`close`,n=>{clearTimeout(i),n===0?e():t(Error(`secret-tool exited with code ${n}`))}),r.on(`error`,e=>{clearTimeout(i),t(Zn(e,`secret-tool`)?Qn(e):e)})})}throw Error(`Unsupported platform: ${r}`)},async delete(){let n=A.platform();if(n===`darwin`){await er(`security`,[`delete-generic-password`,`-s`,t,`-a`,e]);return}if(n===`linux`){let{error:n}=await er(`secret-tool`,[`clear`,`service`,t,`account`,e]);$n(n);return}throw Error(`Unsupported platform: ${n}`)}}}async function ir(e){let{privateKeyToAccount:t}=await import(`viem/accounts`),n=process.env.MPPX_PRIVATE_KEY?.trim();if(n)return{account:t(n),source:`environment`};let r=nr(e),i=await rr(r).get();if(i)return{account:t(i),accountName:r,source:`keychain`};throw Error(`Account "${r}" not found.`)}async function ar(e){return(await ir(e)).account}function or(e){return e}function sr(){return or({method:`evm`,supports:e=>e.method===`evm`&&!_n(e),async setup({challenge:t}){let n=t.request,r=n.methodDetails,a=r?.chainId,o=a?cr(a):void 0,s=n.currency,l=await ar(),u=[...Object.values(we),...Object.values(Te),...Object.values(Ee),...Object.values(De)],d=s??``;if(o&&s)try{let t=e({chain:o,transport:c()}),n=await p(t,{address:s,abi:i,functionName:`symbol`});n&&(d=n)}catch{}return{tokenSymbol:d,tokenDecimals:r?.decimals??6,explorerUrl:o?.blockExplorers?.default?.url,methods:[...Pn({account:l,currencies:u})]}}})}function cr(e){return Object.values(v).find(t=>t.id===e)}function lr(e,t){if(!Number.isInteger(t)||t<0)throw RangeError(`Decimals must be a non-negative integer.`);if(!/^-?(?:\d+(?:\.\d*)?|\.\d+)$/.test(e))throw TypeError(`Value \`${e}\` is not a valid decimal number.`);let n=e.startsWith(`-`),[r=`0`,i=``]=(n?e.slice(1):e).split(`.`),a=i.slice(0,t).padEnd(t,`0`),o=BigInt(`${r||`0`}${a}`);return i.length>t&&i[t]>=`5`&&(o+=1n),n?-o:o}const ur=z.object({customer:z.optional(z.string().check(z.minLength(1))),hooks:z.optional(z.object({inputs:z.object({tax:z.object({calculation:z.string().check(z.minLength(1))})})})),metadata:z.optional(z.record(z.string(),z.string())),receipt_email:z.optional(z.string().check(z.minLength(1)))}),dr=z.custom(e=>typeof e==`function`),fr=z.union([ur,dr]),pr=kt({name:`stripe`,intent:`charge`,schema:{credential:{payload:z.object({externalId:z.optional(z.string()),spt:z.string()})},request:z.pipe(z.object({amount:B(),currency:z.string(),decimals:z.number(),description:z.optional(z.string()),externalId:z.optional(z.string()),metadata:z.optional(z.record(z.string(),z.string())),networkId:z.string(),paymentIntentOptions:z.optional(fr),paymentMethodTypes:z.array(z.string()).check(z.minLength(1)),recipient:z.optional(z.string())}),z.transform(({amount:e,decimals:t,metadata:n,networkId:r,paymentIntentOptions:i,paymentMethodTypes:a,...o})=>({...o,amount:lr(e,t).toString(),methodDetails:{networkId:r,paymentMethodTypes:a,...n!==void 0&&{metadata:n}}})))}});function mr(e){let{client:t,createToken:n,externalId:r,paymentMethod:i}=e;return At(pr,{context:z.object({paymentMethod:z.optional(z.string())}),async createCredential({challenge:e,context:a}){let o=a?.paymentMethod??i;if(!o)throw Error(`paymentMethod is required (pass via context or parameters)`);let s=e.request.amount,c=e.request.currency,l=typeof e.request.externalId==`string`?e.request.externalId:void 0,u=e.request.methodDetails?.networkId;if(!u)throw Error(`networkId is required in challenge.methodDetails`);let d=e.request.methodDetails?.metadata;if(d?.externalId)throw Error(`methodDetails.metadata.externalId is reserved; use credential externalId instead`);let f=e.expires?Math.floor(new Date(e.expires).getTime()/1e3):Math.floor(Date.now()/1e3)+3600,p=await n({amount:s,challenge:e,client:t,currency:c,expiresAt:f,metadata:d,networkId:u,paymentMethod:o}),m=l??r;return G({challenge:e,payload:{spt:p,...m===void 0?{}:{externalId:m}}})}})}function hr(e){return[mr(e)]}(function(e){e.charge=mr})(hr||={});function gr(){return or({method:`stripe`,supports(e){return e.method===`stripe`&&e.intent===`charge`},async setup({challenge:e,methodOpts:t}){let n=e.request,r=n.currency,i=vr(M.object({paymentMethod:M.string(),secretKey:M.string().optional()}),t,[`paymentMethod`,`secretKey`]),a=i.secretKey??process.env.MPPX_STRIPE_SECRET_KEY;if(!a)throw new J({code:`MISSING_ENV`,message:`MPPX_STRIPE_SECRET_KEY environment variable is required for Stripe payments.`,exitCode:2});return{tokenSymbol:r?.toUpperCase()??``,tokenDecimals:n.decimals??2,methods:[hr.charge({paymentMethod:i.paymentMethod,createToken:async({paymentMethod:e,amount:t,currency:n,networkId:r,expiresAt:i,metadata:o})=>{let s=new URLSearchParams({payment_method:e,"usage_limits[currency]":n,"usage_limits[max_amount]":t,"usage_limits[expires_at]":i.toString()}),c=_r(a),l=process.env.MPPX_STRIPE_SPT_URL?process.env.MPPX_STRIPE_SPT_URL:c?`https://api.stripe.com/v1/test_helpers/shared_payment/granted_tokens`:`https://api.stripe.com/v1/shared_payment/issued_tokens`;if(r){let e=c?`seller_details[network_id]`:`seller_details[network_business_profile]`;s.set(e,r)}if(o)for(let[e,t]of Object.entries(o))s.set(`metadata[${e}]`,t);let u={Authorization:`Basic ${btoa(`${a}:`)}`,"Content-Type":`application/x-www-form-urlencoded`,"Stripe-Version":`2026-07-29.preview`},d=await globalThis.fetch(l,{method:`POST`,headers:u,body:s});if(!d.ok){let a=await d.json();if(c&&(o||r)&&a.error.message.includes(`Received unknown parameter`)){let r=new URLSearchParams({payment_method:e,"usage_limits[currency]":n,"usage_limits[max_amount]":t,"usage_limits[expires_at]":i.toString()});if(d=await globalThis.fetch(l,{method:`POST`,headers:u,body:r}),!d.ok)throw new J({code:`STRIPE_ERROR`,message:`Failed to create SPT: ${(await d.json()).error.message}`,exitCode:77})}else throw new J({code:`STRIPE_ERROR`,message:`Failed to create SPT: ${a.error.message}`,exitCode:77})}let{id:f}=await d.json();return f}})]}},formatReceiptField(e,t){if(e===`reference`&&typeof t==`string`&&t.startsWith(`pi_`)){let e=process.env.MPPX_STRIPE_SECRET_KEY,n=`https://dashboard.stripe.com${e!==void 0&&_r(e)?`/test`:``}/payments/${t}`;return X.link(n,t,!0)}}})}function _r(e){return e.startsWith(`sk_test_`)||e.startsWith(`rk_test_`)}function vr(e,t,n){if(t&&typeof t==`object`&&!Array.isArray(t)){let e=Object.keys(t).filter(e=>!n.includes(e));if(e.length)throw Error(`Unsupported CLI method option(s): ${e.join(`, `)}`)}let r=e.safeParse(t??{});if(r.success)return r.data;let i=r.error.issues.map(e=>`${e.path.length?e.path.join(`.`):`options`}: ${e.message}`).join(`, `);throw Error(`Invalid CLI options (${i})`)}function yr(e){let t={};for(let n of e){let e=t[n.name]??={};e[n.intent]=wr(n)}return t}function br(e,t){let n=yr(e),r=jr(e,n,t),i=e.map((e,t)=>({intent:e.intent,method:e.name,q:r[wr(e)]??1,index:t}));return{definition:r,entries:i,header:Sr(i),keys:n}}function xr(e){let t=e.split(/\s*,\s*/).map(e=>e.trim()).filter(Boolean);if(t.length===0)throw Error(`Accept-Payment header is empty.`);return t.map((e,t)=>kr(e,t))}function Sr(e){return e.map(({method:e,intent:t,q:n})=>{let r=`${e}/${t}`;return n===1?r:`${r};q=${Fr(n)}`}).join(`, `)}function Cr(e,t,n){let r=new Map;for(let e of t){let t=wr(e),n=r.get(t);n?n.push(e):r.set(t,[e])}return e.flatMap((e,t)=>{let i=r.get(wr(e));if(!i)return[];let a=Tr(e,n);return!a||a.q<=0?[]:i.filter(t=>t.canHandleChallenge?.({challenge:e})??!0).map(n=>({challenge:e,index:t,match:a,method:n}))}).sort((e,t)=>Or(e.challenge)-Or(t.challenge)||t.match.q-e.match.q||e.index-t.index).map(e=>{let{match:t,...n}=e;return n})}function wr(e){let t=e.method??e.name;if(!t)throw Error(`Missing payment method name.`);return`${t}/${e.intent}`}function Tr(e,t){let n;for(let r of t){if(!Er(e,r))continue;let t={...r,specificity:Dr(r)};(!n||t.specificity>n.specificity||t.specificity===n.specificity&&t.q>n.q||t.specificity===n.specificity&&t.q===n.q&&t.index<n.index)&&(n=t)}return n}function Er(e,t){return(t.method===`*`||t.method===e.method)&&(t.intent===`*`||t.intent===e.intent)}function Dr(e){return Number(e.method!==`*`)+Number(e.intent!==`*`)}function Or(e){return+!!_n(e)}function kr(e,t){let n=/^(?<method>[^/;\s]+|\*)\s*\/\s*(?<intent>[^/;\s]+|\*)(?<params>(?:\s*;\s*.+)?)$/u.exec(e),r=n?.groups?.method,i=n?.groups?.intent;if(!r||!i)throw Error(`Invalid Accept-Payment entry: ${e}`);Ir(r,`method`),Ir(i,`intent`);let a=1;for(let t of Ar(n.groups?.params)){if(!t)continue;let n=/^(?<name>[A-Za-z0-9_-]+)\s*=\s*(?<value>\S+)$/u.exec(t),r=n?.groups?.name,i=n?.groups?.value;if(!r||!i)throw Error(`Invalid Accept-Payment parameter: ${t}`);r===`q`&&(a=Nr(i,`Accept-Payment entry "${e}"`))}return{intent:i,method:r,q:a,index:t}}function Ar(e){return e?e.split(/\s*;\s*/).filter(Boolean):[]}function jr(e,t,n){if(!n)return{};let r=typeof n==`function`?n(t):n,i=new Set(e.map(e=>wr(e))),a={};for(let[e,t]of Object.entries(r??{})){if(!i.has(e))throw Error(`Unknown payment preference "${e}". Available: ${[...i].join(`, `)}`);a[e]=Mr(t,`payment preference "${e}"`)}return a}function Mr(e,t){if(typeof e!=`number`||Number.isNaN(e)||!Number.isFinite(e))throw Error(`Invalid q-value for ${t}. Expected a finite number.`);return Pr(e,t)}function Nr(e,t){if(!/^0(?:\.\d{0,3})?$|^1(?:\.0{0,3})?$/.test(e))throw Error(`Invalid q-value for ${t}. Expected an HTTP qvalue.`);return Pr(Number(e),t)}function Pr(e,t){if(e<0||e>1)throw Error(`Invalid q-value for ${t}. Expected a value between 0 and 1.`);let n=Math.round(e*1e3);if(Math.abs(e*1e3-n)>1e-9)throw Error(`Invalid q-value for ${t}. Expected at most 3 decimal places.`);return n/1e3}function Fr(e){return e.toFixed(3).replace(/\.0+$/,``).replace(/(\.\d*?)0+$/,`$1`)}function Ir(e,t){if(e!==`*`&&!/^[a-z0-9-]+$/.test(e))throw Error(`Invalid Accept-Payment ${t}: ${e}`)}const Lr=[L.authorization,Pt,`PAYMENT-RESPONSE`,Ft];function Rr(e,t,n){let r=new Headers(e.headers);for(let e of Lr)e===L.authorization&&!r.get(e)?.startsWith(`Payment `)||r.delete(e);return r.set(t,n),{...e,headers:r}}function zr(e){if(typeof e==`string`)try{let t=JSON.parse(e),n=t?.id;return t?.jsonrpc!==`2.0`||typeof t?.method!=`string`?void 0:typeof n==`string`||typeof n==`number`?n:void 0}catch{return}}const Br=new WeakMap;function Vr(e){let t=zr(e?.body);if(t===void 0)return;let n=new Headers(e?.headers);if(n.has(`mcp-method`))return t;let r=n.get(`accept`)?.toLowerCase()??``;return r.includes(`application/json`)&&r.includes(`text/event-stream`)?t:void 0}function Hr(e){if(!e||typeof e!=`object`)return;let t=e,n=t.id;if(t.jsonrpc!==`2.0`||n!==void 0&&typeof n!=`string`&&typeof n!=`number`)return;let r=`error`in t;if(r!==`result`in t)return r?Number.isInteger(t.error?.code)&&typeof t.error?.message==`string`?e:void 0:n!==void 0&&typeof t.result==`object`?e:void 0}function Ur(e){if(!e||typeof e!=`object`)return;let t=e?.challenges;if(!Array.isArray(t)||t.length===0)return;let n=[];for(let e of t){let t=nt.safeParse(e);if(!t.success)return;n.push(t.data)}let{httpStatus:r,problem:i}=e;return{challenges:n,...typeof r==`number`?{httpStatus:r}:{},...i===void 0?{}:{problem:i}}}function Wr(e){if(e)return`error`in e?e.error?.code!==-32042&&e.error?.code!==-32043?void 0:Ur(e.error.data):Ur(e.result?._meta?.[`org.paymentauth/payment-required`])}function Gr(e,t){return!e||e.id!==t?[]:Wr(e)?.challenges??[]}async function Kr(e){let t=e.clone().body?.getReader();if(!t)return;let n=new TextDecoder,r=!1,i,a=le({onEvent(e){if(!(r||!e.data)&&(r=!0,!(e.event&&e.event!==`message`)))try{i=Hr(JSON.parse(e.data))}catch{}}});try{for(;;){if(r)return i;let{done:e,value:o}=await t.read();if(e)return a.feed(n.decode()),a.reset({consume:!0}),i;a.feed(n.decode(o,{stream:!0}))}}finally{t.cancel().catch(()=>{})}}function qr(e){let t=Br.get(e);if(t)return t;let n=(async()=>{let t=e.headers.get(`content-type`)?.toLowerCase()??``;if(t.includes(`application/json`))return e.clone().json().then(Hr).catch(()=>void 0);if(t.includes(`text/event-stream`))return Kr(e)})();return Br.set(e,n),n}function Jr(){return{getChallenges(e,t){let n=Vr(t);return e.status===402||n===void 0?[]:qr(e).then(e=>Gr(e,n))},setCredential(e,t){let n=JSON.parse(e.body),r=xt(t);return{...e,body:JSON.stringify({...n,params:{...n.params,_meta:{...n.params?._meta,"org.paymentauth/credential":r}}})}}}}function Yr(){return{getChallenges(e){return e.status!==402||!e.headers.has(L.wwwAuthenticate)?[]:ft(e)},setCredential(e,t,n){return Rr(e,n?.challenge?gt(n.challenge):L.authorization,t)}}}function Xr(){return{getChallenges(e){if(e.status!==402)return[];let t=e.headers.get(Pt);if(!t)return[];let n=en(t);if(e.url&&n.resource.url!==e.url)throw Error(`x402 payment-required resource does not match response URL.`);return n.accepts.flatMap((e,t)=>{let r=Vt.safeParse(e);if(!r.success)return[];let i=r.data;return gn(rt({id:`x402:${t}`,intent:`charge`,method:`evm`,realm:new URL(n.resource.url).host,request:{...i,...n.extensions?{extensions:n.extensions}:{},resource:n.resource}}))})},setCredential(e,t){return Rr(e,Ft,t)}}}function Zr(e){return e}function Qr(){let e=[Yr(),Xr(),Jr()],t=new WeakMap,n=(e,n)=>{for(let r of n)t.set(r,e);return n},r=(t,r)=>{let i=(a,o)=>{for(let s=a;s<e.length;s++){let a=e[s],c=a.getChallenges(t,r);if(c instanceof Promise)return c.then(e=>i(s+1,[...o,...n(a,e)]));o.push(...n(a,c))}return o};return i(0,[])};return Zr({name:`http`,isPaymentRequired(e,t){if(e.status===402)return!0;let n=r(e,t);return n instanceof Promise?n.then(e=>e.length>0):n.length>0},getChallenges(e,t){return r(e,t)},setCredential(n,r,i){let a=i?.challenge?t.get(i.challenge):void 0,o=e[0];if(!a&&!o)throw Error(`No protocol to attach the credential.`);return(a??o).setCredential(n,r,i)}})}const $r=new WeakMap;function ei(e,t){return $r.set(e,t),e}function ti(e){return $r.has(e)}function ni(e,t){return Promise.resolve($r.get(e)?.(t))}const ri=new WeakMap,ii=new WeakMap;function ai(e,t){return ri.set(e,t),e}function oi(e){ri.delete(e)}function si(e,t,n){ri.has(e)&&ii.set(t,n)}function ci(e){return ii.get(e)}function li(e,t){return Promise.resolve(ri.get(e)?.(t)??t.response)}const ui=Symbol.for(`mppx.fetch.wrapper`),di=new WeakMap;async function fi(e,t){let n=e?.attempt.settle;if(!n)return t.status!==`pending`;e.attempt.settle=void 0;let r=await n(t);return r||(e.attempt.settle=n),r}function pi(e){let{acceptPayment:t,acceptPaymentPolicy:n=`always`,fetch:r=globalThis.fetch,maxPaymentRetries:i=3,methods:a,onChallenge:o,orderChallenges:s,transport:c=Qr()}=e,l=e.eventDispatcher??mi(),u=t??br(a),d=Fi(r),f=async(e,t,r)=>{let p=Pi(e,t?.headers),m=p.has(L.acceptPayment),h=Bi(p,u),g=Mi(e,t,p),_=ji(e,t,p,h.header,m,n),v=await d(Ii(_.input),_.init),y=Ni(_.init,await g);if(!await c.isPaymentRequired(v,y))return v;let b=t?.context,{context:x,orderChallenges:S,...C}=y??{},w,T,E,D;try{for(let n=0;n<i;n++){T=await c.getChallenges(v,y);let i=(await Vi(Cr(T,a,h.entries),S??s))[0];if(!i){if(await fi(D,{challenges:T,response:v,status:`rejected`}),n>0)return v;throw Error(`No method found for challenges: ${T.map(e=>`${e.method}.${e.intent}`).join(`, `)}. Available: ${a.map(e=>`${e.name}.${e.intent}`).join(`, `)}`)}let u=i.challenge;w=u,E=i.method,w.expires&&Ot(w.expires,w.id);let p=Ki(v,_.input,_.input),m=D,g=it(u),x=m?.method===i.method&&m?.key===g,O=!1;if(m){let e=await fi(m,{challenges:T,response:v,status:x?`pending`:`rejected`});O=x&&!e}D=O?m:void 0;let k=yi(async e=>{if(e===void 0&&O&&m)return m.promise;O&&m&&(await fi(m,{status:`rejected`}),D=void 0);let t=e??b;if(!ti(i.method))return zi(u,i.method,t);let n={prepare:()=>ni(i.method,{challenge:u,context:t,fetch:d,input:p})},r=n.prepare().then(()=>zi(u,i.method,t,n));return D={attempt:n,key:e===void 0?g:void 0,method:i.method,promise:r},r}),A=await l.emit(`challenge.received`,bi({challenge:u,challenges:T,createCredential:k,init:t,input:e,method:i.method,response:v}))??(o?await o(w,{createCredential:k}):void 0)??await k(),j=D;j&&await j.promise.catch(()=>void 0)!==A&&(await fi(j,{status:`rejected`}),D=void 0),Ri(A),await l.emit(`credential.created`,xi({challenge:u,credential:A,init:t,input:e,method:i.method,response:v})),v=await d(p,c.setCredential({...C,headers:_.headers},A,{challenge:u}));let M=await c.isPaymentRequired(v,y);if(M||(await fi(j,{response:v,status:v.ok?`accepted`:`rejected`}),D=void 0),v.ok&&hi(l,`payment.response`)&&await l.emit(`payment.response`,Si({challenge:u,credential:A,init:t,input:e,method:i.method,response:v})),!M)return v.ok?li(i.method,{challenge:u,credential:A,fetch:d,headers:_.headers,input:p,...r?{refetch:()=>f(Ii(_.input),t,!1)}:{},response:v,signal:Li(e,t)}):v}T=void 0;try{T=await c.getChallenges(v,y)}catch{}return await fi(D,{challenges:T,response:v,status:`rejected`}),v}catch(n){throw await fi(D,{challenges:T,response:v,status:`rejected`}),await l.emit(`payment.failed`,Ci({challenge:w,challenges:T,error:n,init:t,input:e,method:E,response:v})),n}},p=(e,t)=>f(e,t,!0);return p[ui]=d,p}function Z(e){if(!e)return{};if(e instanceof Headers){let t={};return e.forEach((e,n)=>{t[n]=e}),t}return Array.isArray(e)?Object.fromEntries(e):e}function mi(){let e={"*":new Set,"challenge.received":new Set,"credential.created":new Set,"payment.failed":new Set,"payment.response":new Set},t={async emit(t,n){switch(t){case`challenge.received`:{let r;for(let t of e[`challenge.received`]){let e=await gi(t,n);if(typeof e==`string`&&e.length>0){r=e;break}}return await vi(e[`*`],t,n),r}case`credential.created`:await _i(e[`credential.created`],n),await vi(e[`*`],t,n);return;case`payment.failed`:await _i(e[`payment.failed`],n),await vi(e[`*`],t,n);return;case`payment.response`:await _i(e[`payment.response`],n),await vi(e[`*`],t,n);return}},on:(t,n)=>{switch(t){case`*`:case`challenge.received`:case`credential.created`:case`payment.failed`:case`payment.response`:return e[t].add(n),()=>e[t].delete(n);default:throw Error(`Unknown client event "${String(t)}".`)}}};return di.set(t,t=>e[t].size>0||e[`*`].size>0),t}function hi(e,t){return di.get(e)?.(t)??!0}async function gi(e,t){try{return await e(t)}catch{return}}async function _i(e,t){for(let n of e)try{await n(t)}catch{}}async function vi(e,t,n){await _i(e,Object.freeze({name:t,payload:n}))}function yi(e){let t;return n=>(t??=e(n),t)}function bi(e){return Object.freeze({challenge:Oi(e.challenge),challenges:e.challenges.map(e=>Oi(e)),createCredential:e.createCredential,init:wi(e.init),input:Ti(e.input),method:Ei(e.method),response:Di(e.response)})}function xi(e){return Object.freeze({challenge:Oi(e.challenge),credential:e.credential,init:wi(e.init),input:Ti(e.input),method:Ei(e.method),...e.response===void 0?{}:{response:Di(e.response)}})}function Si(e){return Object.freeze({challenge:Oi(e.challenge),credential:e.credential,init:wi(e.init),input:Ti(e.input),method:Ei(e.method),response:Di(e.response)})}function Ci(e){return Object.freeze({...e.challenge?{challenge:Oi(e.challenge)}:{},...e.challenges?{challenges:e.challenges.map(e=>Oi(e))}:{},error:e.error,init:wi(e.init),input:Ti(e.input),...e.method?{method:Ei(e.method)}:{},...e.response===void 0?{}:{response:Di(e.response)}})}function wi(e){if(e)return Ai({...e,...e.headers?{headers:new Headers(e.headers)}:{}})}function Ti(e){if(e instanceof Request)try{return e.clone()}catch{return e}return e instanceof URL?new URL(e):e}function Ei(e){return Ai(Object.assign({},e))}function Di(e){return e instanceof Response?e.clone():Oi(e)}function Oi(e){try{return ki(structuredClone(e))}catch{return Ai(e)}}function ki(e){if(!e||typeof e!=`object`||Object.isFrozen(e))return e;Object.freeze(e);for(let t of Object.values(e))ki(t);return e}function Ai(e){return!e||typeof e!=`object`||Object.isFrozen(e)||Object.freeze(e),e}function ji(e,t,n,r,i,a){let o=!!r&&!i&&Hi(e,a);if(!o)return{headers:n,init:t,input:e};let s=new Headers(e instanceof Request?e.headers:void 0);return n.forEach((e,t)=>{s.set(t,e)}),s.set(L.acceptPayment,r),t?(t.headers=s,{headers:s,init:t,input:e}):{headers:s,init:o?{headers:s}:void 0,input:e}}function Mi(e,t,n){if(!(!(e instanceof Request)||t?.body!==void 0||!e.body||e.bodyUsed)){if(!n.has(`mcp-method`)){let e=n.get(`accept`)?.toLowerCase()??``;if(!e.includes(`application/json`)||!e.includes(`text/event-stream`))return}try{return e.clone().text().catch(()=>void 0)}catch{return}}}function Ni(e,t){return t===void 0?e:{...e,body:t}}function Pi(e,t){return t?new Headers(t):new Headers(e instanceof Request?e.headers:void 0)}function Fi(e){let t=e;for(;t[ui];)t=t[ui];return t}function Ii(e){if(!(e instanceof Request)||!e.body||e.bodyUsed)return e;try{return e.clone()}catch{return e}}function Li(e,t){return t?.signal??(e instanceof Request?e.signal:void 0)}function Ri(e){if(!e.trim())throw Error(`Credential header value must be non-empty`);if(e.includes(`\r`)||e.includes(`
|
|
2
|
-
`))throw Error(`Credential header value contains illegal newline characters`)}async function zi(e,t,n,r){let i=t.context&&n!==void 0?t.context.parse(n):void 0,a=i===void 0?{challenge:e}:{challenge:e,context:i};return r&&si(t,a,r),t.createCredential(a)}function Bi(e,t){let n=e.get(L.acceptPayment);if(!n)return t;try{return{...t,entries:xr(n),header:n}}catch{return t}}async function Vi(e,t){return t?t(e):e}function Hi(e,t){if(t===`always`)return!0;if(t===`never`)return!1;let n=Gi(e);return t===`same-origin`?!Wi()||n.origin===globalThis.location.origin:t.origins.some(e=>Ui(n,e))}function Ui(e,t){if(t.startsWith(`*.`)){let n=t.slice(1);return e.hostname.endsWith(n)||e.hostname===t.slice(2)}return e.origin===new URL(t).origin}function Wi(){return globalThis.location!==void 0}function Gi(e){return e instanceof URL?e:e instanceof Request?new URL(e.url):new URL(e,Wi()?globalThis.location.href:void 0)}function Ki(e,t,n){if(!e.url)return t;let r=new URL(e.url),i=Gi(n);if(r.origin!==i.origin)throw Error(`Refusing to send payment credential across redirect from ${i.origin} to ${r.origin}`);return e.url}function qi(e={}){let{account:t}=e;return(e,{account:n}={})=>{let r=n??t;if(!r){if(!e.account)throw Error("No `account` provided. Pass `account` to parameters or context.");return e.account}return se(r)}}function Ji(e){return Object.fromEntries(Object.entries(e.headers??{}).filter(([e])=>e.toLowerCase()!==`content-type`))}const Yi={[N.id]:N,[ee.id]:ee};function Xi(e,t={}){return c(e.url,{fetchFn:e.fetch,fetchOptions:{headers:Ji(e)},...t})}function Zi(r){let{chain:i,getClient:a,remoteFeePayer:o,rpcUrl:s}=r;return a?!i?.serializers&&!o?a:async e=>{let r=await a(e),s=r;if(o&&r.transport.key!==`feePayer`){let e=r.request.bind(r),i=oe(n({request:t=>e(t)},{retryCount:0}),Xi(o,{retryCount:r.transport.retryCount}))({account:r.account,chain:r.chain,pollingInterval:r.pollingInterval,retryCount:0}),a=t({...i.config,retryCount:0},i.value);s=Object.assign({},r,{request:a.request,transport:{...a.config,...a.value}})}return!i?.serializers||s.chain?.serializers?.transaction?s:Object.assign({},s,{chain:{...i,...s.chain,formatters:s.chain?.formatters??i.formatters,prepareTransactionRequest:s.chain?.prepareTransactionRequest??i.prepareTransactionRequest,serializers:s.chain?.serializers?.transaction?s.chain.serializers:i.serializers}})}:({chainId:t})=>{if(!s)throw Error("No `rpcUrl` provided.");let n=t||Number(Object.keys(s)[0]),r=s[n];if(!r)throw Error(`No \`rpcUrl\` configured for \`chainId\` (${n}).`);let a=o?oe(c(r),Xi(o)):c(r);return e({chain:Yi[n]??{...i,id:n},transport:a})}}const Qi=w.slice(C.keccak256(S.fromString(`mpp`),{as:`Hex`}),0,4);function $i(e){let t=C.keccak256(S.fromString(e),{as:`Hex`});return w.toBytes(w.slice(t,0,10))}function ea(e){let{serverId:t,clientId:n,challengeId:r}=e,i=new Uint8Array(32);return i.set(w.toBytes(Qi),0),i[4]=1,i.set($i(t),5),n&&i.set($i(n),15),i.set(ta(r),25),w.fromBytes(i)}function ta(e){let t=C.keccak256(S.fromString(e),{as:`Hex`});return w.toBytes(w.slice(t,0,7))}function na(e,t){return de.resolve(e).toLowerCase()===de.resolve(t).toLowerCase()}const ra=[Ln.pathUsd,Ln.usdc];async function ia(e,t){let{account:n,amountOut:r,tokenOut:i,tokenIn:a,slippage:o}=t,s=a.filter(e=>!na(e,i)),c=await Promise.allSettled([p(e,P.token.getBalance.call(e,{account:n,token:i})),...s.map(t=>p(e,P.token.getBalance.call(e,{account:n,token:t})))]),l=c[0];if(!(l.status===`fulfilled`&&l.value>=r)){for(let t=0;t<s.length;t++){let n=c[t+1];if(n.status!==`fulfilled`)continue;let a=n.value;if(a<=0n)continue;let l=s[t];try{let t=await P.dex.getBuyQuote(e,{tokenIn:l,tokenOut:i,amountOut:r});if(a>=t){let n=t+t*BigInt(Math.round(o*100))/10000n;return[P.token.approve.call(e,{amount:n,spender:re.stablecoinDex,token:l}),P.dex.buy.call({tokenIn:l,tokenOut:i,amountOut:r,maxAmountIn:n})]}}catch{}}throw new oa({currency:i})}}function aa(e,t){return e?e===!0?{tokenIn:t,slippage:1}:{tokenIn:e.tokenIn?[...e.tokenIn,...t.filter(t=>!e.tokenIn.some(e=>na(e,t)))]:t,slippage:e.slippage??1}:!1}var oa=class extends Error{name=`InsufficientFundsError`;constructor({currency:e}){super(`Insufficient funds: no balance in ${e} and no viable swap route from fallback currencies.`)}};function sa(e){let t=BigInt(e.amount),n=e.methodDetails?.splits??[],r=n.reduce((e,t)=>e+BigInt(t.amount),0n);if(r>=t)throw Error(`Invalid charge request: split total must be less than total amount.`);let i=t-r;if(i<=0n)throw Error(`Invalid charge request: primary transfer amount must be positive.`);return[{amount:i.toString(),memo:e.methodDetails?.memo,recipient:e.recipient},...n.map(e=>({amount:e.amount,memo:e.memo,recipient:e.recipient}))]}function ca(e,t,n){t&&(n&&!n.some(e=>na(e,t))||e.some(e=>na(e,t))||e.push(t))}async function la(e,t,n){try{return(await P.token.getBalance(e,{account:t,token:n})).amount>0n}catch{return!1}}function ua(e){let t=e.chain?.feeToken;if(t)return ie.toAddress(t);let n=e.chain?.id;return n?Rn[n]:void 0}function da(e){let t=[];return ca(t,Ln.pathUsd),ca(t,Rn[e]),t}async function fa(e){let{account:t,allowedTokens:n,candidateTokens:r,client:i,prioritizeCandidates:a}=e,o=[];if(a)for(let e of r??[])ca(o,e,n);if(ca(o,await P.fee.getUserToken(i,{account:t}).then(e=>e?.address).catch(()=>void 0),n),ca(o,ua(i),n),!a)for(let e of r??[])ca(o,e,n);for(let e of o)if(await la(i,t,e))return e;return o[0]}const pa={Proof:[{name:`account`,type:`address`},{name:`challengeId`,type:`string`},{name:`realm`,type:`string`}]};function ma(e){return{name:`MPP`,version:`3`,chainId:e}}function ha(e){let{account:t,challengeId:n,realm:r}=e;return{account:t,challengeId:n,realm:r}}function ga(e){let{account:t,chainId:n,challengeId:r,realm:i}=e;return{domain:ma(n),types:pa,primaryType:`Proof`,message:ha({account:t,challengeId:r,realm:i})}}function _a(e){return`did:pkh:eip155:${e.chainId}:${e.address}`}const va=[`push`,`pull`],ya=z.object({amount:B(),memo:z.optional(H()),recipient:z.pipe(z.string(),z.transform(e=>e))}),ba=(1n<<64n)-1n,xa={dev_second:1n,day:86400n,week:604800n},Sa=z.pipe(V(),z.transform(e=>e.toLowerCase())),Ca=z.object({accessKeyAddress:Sa,keyType:z.enum([`p256`,`secp256k1`,`webAuthn`])}),wa=z.object({accessKey:z.optional(Ca),chainId:z.optional(z.number())}),Ta=Ze(`subscriptionExpires must be a valid date`).check(z.refine(e=>e.getTime()%1e3==0,`subscriptionExpires must be representable as whole seconds`)),Ea=z.enum([`dev_second`,`day`,`week`]),Da=z.pipe(z.union([z.string(),z.bigint(),z.custom(e=>typeof e==`number`&&Number.isSafeInteger(e))]),z.transform(e=>e.toString())).check(z.regex(/^[1-9]\d*$/,`Invalid periodCount`),z.refine(e=>{try{return BigInt(e)<=ba}catch{return!1}},`periodCount exceeds uint64`));function Oa(e){return z.refine(e=>{let{amount:t,decimals:n}=e;return d(t,n)>0n},e)}function ka(e){let{periodCount:t,periodUnit:n}=e;try{let e=xa[n];return e!==void 0&&BigInt(t)*e<=ba}catch{return!1}}const Aa=kt({name:`tempo`,intent:`charge`,schema:{credential:{payload:z.discriminatedUnion(`type`,[z.object({hash:H(),type:z.literal(`hash`)}),z.object({signature:U(),type:z.literal(`transaction`)}),z.object({signature:U(),type:z.literal(`proof`)})])},request:z.pipe(z.object({amount:B(),chainId:z.optional(z.number()),currency:z.string(),decimals:z.number(),description:z.optional(z.string()),externalId:z.optional(z.string()),feePayer:z.optional(z.pipe(z.union([z.boolean(),z.custom()]),z.transform(e=>typeof e==`object`||e))),memo:z.optional(H()),recipient:z.optional(z.string()),splits:z.optional(z.array(ya).check(z.minLength(1),z.maxLength(10))),supportedModes:z.optional(z.array(z.enum(va)).check(z.minLength(1)))}).check(z.refine(({amount:e,decimals:t,splits:n})=>{if(!n)return!0;let r=d(e,t),i=n.reduce((e,n)=>e+d(n.amount,t),0n);return n.every(e=>d(e.amount,t)>0n)&&i<r},`Invalid splits`)),z.transform(({amount:e,chainId:t,decimals:n,feePayer:r,memo:i,splits:a,supportedModes:o,...s})=>({...s,amount:d(e,n).toString(),...t!==void 0||r!==void 0||i!==void 0||a!==void 0||o!==void 0?{methodDetails:{...t!==void 0&&{chainId:t},...r!==void 0&&{feePayer:r},...i!==void 0&&{memo:i},...a!==void 0&&{splits:a.map(e=>({...e,amount:d(e.amount,n).toString()}))},...o!==void 0&&{supportedModes:o}}}:{}})))}}),ja=kt({name:`tempo`,intent:`session`,schema:{credential:{payload:z.discriminatedUnion(`action`,[z.object({action:z.literal(`open`),authorizedSigner:z.optional(z.string()),channelId:H(),cumulativeAmount:B(),descriptor:z.optional(z.custom()),signature:U(),transaction:U(),type:z.literal(`transaction`)}),z.object({action:z.literal(`topUp`),additionalDeposit:B(),channelId:H(),descriptor:z.optional(z.custom()),transaction:U(),type:z.literal(`transaction`)}),z.object({action:z.literal(`voucher`),channelId:H(),cumulativeAmount:B(),descriptor:z.optional(z.custom()),signature:U()}),z.object({action:z.literal(`close`),channelId:H(),cumulativeAmount:B(),descriptor:z.optional(z.custom()),signature:U()})])},request:z.pipe(z.object({amount:B(),chainId:z.optional(z.number()),channelId:z.optional(H()),currency:z.string(),decimals:z.number(),escrowContract:z.optional(z.string()),feePayer:z.optional(z.pipe(z.union([z.boolean(),z.custom()]),z.transform(e=>typeof e==`object`||e))),feeToken:z.optional(V()),minVoucherDelta:z.optional(B()),operator:z.optional(V()),recipient:z.optional(z.string()),sessionProtocol:z.optional(z.enum([Ke.v2,Ke.v1])),sessionSnapshot:z.optional(z.custom()),suggestedDeposit:z.optional(B()),unitType:z.string()}).check(z.refine(({amount:e,decimals:t})=>d(e,t)>0n,`Session amount must be greater than 0`)),z.transform(({amount:e,chainId:t,channelId:n,decimals:r,escrowContract:i,feePayer:a,feeToken:o,minVoucherDelta:s,operator:c,sessionProtocol:l,sessionSnapshot:u,suggestedDeposit:f,...p})=>({...p,amount:d(e,r).toString(),...f?{suggestedDeposit:d(f,r).toString()}:{},methodDetails:{escrowContract:i,...n!==void 0&&{channelId:n},...s!==void 0&&{minVoucherDelta:d(s,r).toString()},...t!==void 0&&{chainId:t},...a!==void 0&&{feePayer:a},...o!==void 0&&{feeToken:o},...c!==void 0&&{operator:c},...l!==void 0&&{[Ge.sessionProtocol]:l},...u!==void 0&&{[Ge.sessionSnapshot]:u}}})))}}),Ma=kt({name:`tempo`,intent:`subscription`,schema:{credential:{payload:z.object({signature:U(),type:z.literal(`keyAuthorization`)})},request:z.pipe(z.object({amount:B(),accessKey:z.optional(Ca),chainId:z.optional(z.number()),currency:Sa,decimals:z.number(),description:z.optional(z.string()),externalId:z.optional(z.string()),methodDetails:z.optional(wa),periodCount:Da,periodUnit:Ea,recipient:Sa,subscriptionExpires:Ta}).check(Oa(`Subscription amount must be greater than 0`),z.refine(ka,`Subscription period exceeds uint64`)),z.transform(({accessKey:e,amount:t,chainId:n,decimals:r,methodDetails:i,subscriptionExpires:a,...o})=>{let s={...i,...e!==void 0&&{accessKey:e},...n!==void 0&&{chainId:n}};return{...o,amount:d(t,r).toString(),subscriptionExpires:a.toISOString(),...Object.keys(s).length>0?{methodDetails:s}:{}}}))}}),Na=pe({addresses:{4217:`0x20c000000000000000000000f37de3740ADec032`,42431:`0x20c000000000000000000000f37de3740ADec032`},currency:`USD`,decimals:6,name:`MACH`,symbol:`MACH`}),Pa=z.object({account:z.optional(z.custom()),autoSwap:z.optional(z.custom()),mode:z.optional(z.enum(va))});function Fa(e={}){let{clientId:t}=e,n=Zi({chain:N,getClient:e.getClient,rpcUrl:Bn}),r=qi({account:e.account});return At(Aa,{context:Pa,async createCredential({challenge:i,context:a}){let o=i.request.methodDetails?.chainId;if(e.expectedChainId!==void 0&&o!==void 0&&o!==e.expectedChainId)throw Error(`Chain ID mismatch: expected ${e.expectedChainId}, got ${o}.`);let s=o??e.expectedChainId,c=await n({chainId:s}),l=s??c.chain?.id;if(l===void 0)throw Error("No `chainId` provided. Pass a chain ID in the challenge or client.");let{request:d}=i,{amount:p,methodDetails:v}=d,y=v?.supportedModes??[`pull`,`push`],b=r(c,a);if(BigInt(p)===0n)return G({challenge:i,payload:{signature:await _(c,{account:b,...ga({account:b.address,chainId:l,challengeId:i.id,realm:i.realm})}),type:`proof`},source:_a({address:b.address,chainId:l})});let x=d.currency;if(e.expectedRecipients){let t=new Set(e.expectedRecipients.map(e=>e.toLowerCase())),n=v?.splits;if(n){for(let e of n)if(!t.has(e.recipient.toLowerCase()))throw Error(`Unexpected split recipient: ${e.recipient}`)}}let S=v?.memo?v.memo:ea({challengeId:i.id,clientId:t,serverId:i.realm}),C=sa({amount:p,methodDetails:{...v,memo:S},recipient:d.recipient}).map(e=>P.token.transfer.call(c,{amount:BigInt(e.amount),...e.memo&&{memo:e.memo},to:e.recipient,token:x})),w=aa(a?.autoSwap??e.autoSwap,ra),T=await e.resolveAccount?.({account:b,chainId:l,operation:{kind:`executeCalls`,...w?{}:{calls:C}}})??b,E=(()=>{let t=a?.mode??e.mode;if(t){if(!y.includes(t))throw Error(`Challenge does not support ${t} mode.`);return t}let n=T.type===`json-rpc`?`push`:`pull`;return y.includes(n)?n:y[0]})(),D=[...(w?await ia(c,{account:T.address,amountOut:BigInt(p),tokenOut:x,tokenIn:w.tokenIn,slippage:w.slippage}):void 0)??[],...C],O=Na.addresses[l],k=da(l),A=O&&u(x,O)?await fa({account:T.address,allowedTokens:k,candidateTokens:k,client:c,prioritizeCandidates:!0}):void 0,j=(()=>{let e=Math.floor(Date.now()/1e3)+25;if(!i.expires)return e;let t=Math.floor(new Date(i.expires).getTime()/1e3);return Math.min(e,t)})();if(E===`push`){let{receipts:e}=T.type===`local`?{receipts:[await h(c,{account:T,calls:D,...A?{feeToken:A}:{},nonceKey:`expiring`,validBefore:j})]}:await m(c,{account:T,...A?{capabilities:{feeToken:A}}:{},calls:D,experimental_fallback:D.length===1,forceAtomic:D.length>1}),t=e?.[0]?.transactionHash;if(!t)throw Error(`No transaction receipt returned.`);return G({challenge:i,payload:{hash:t,type:`hash`},source:_a({address:T.address,chainId:l})})}let M=await f(c,{account:T,calls:D,...A?{feeToken:A}:{},nonceKey:`expiring`,validBefore:j});if(M.gas=(M.gas??0n)+5000n,v?.feePayer){let e=M;delete e.feePayerSignature,delete e.feeToken,e.feePayer=!0}return G({challenge:i,payload:{signature:await g(c,M),type:`transaction`},source:_a({address:T.address,chainId:l})})}})}function Ia(e){return`accessKeyAddress`in e}function La(e){return Ia(e)?e.accessKeyAddress:e.address}function Ra(e,t){return{name:`Tempo Stream Channel`,version:`1`,chainId:t,verifyingContract:e}}const za={Voucher:[{name:`channelId`,type:`bytes32`},{name:`cumulativeAmount`,type:`uint128`}]};function Ba(e){return{channelId:e.channelId,cumulativeAmount:e.cumulativeAmount}}function Va(e,t,n){return s({domain:Ra(e,t),types:za,primaryType:`Voucher`,message:Ba(n)})}async function Ha(e,t,n,r,i){return _(e,{account:t,domain:Ra(r,i),types:za,primaryType:`Voucher`,message:Ba(n)})}function Ua(e){let t=I.from(e);if(t.type===`keychain`){if(t.inner.type!==`secp256k1`)throw Error(`Session vouchers only unwrap secp256k1 keychain signatures; pass a direct voucherSigner for other key types.`);return E.toHex(t.inner.signature)}return I.serialize(t)}function Wa(e){return e.type!==`keychain`&&e.type===`secp256k1`}function Ga(e){if(!Wa(e))throw Error(`Session vouchers only support secp256k1 signatures until TIP-1020 voucher verification is enabled.`)}async function Ka(e,t,n,r,i,a){let o=a??t,s=La(o),c=Va(r,i,n),l=Ua(Ia(o)?await o.sign({hash:c,raw:!0}):await Ha(e,o,n,r,i)),u=I.from(l);if(Ga(u),!I.verify(u,{address:s,payload:c}))throw Error(`voucher signature does not match voucher signer`);return l}function qa(e){let t=b.encode(b.from([`address payer`,`address payee`,`address token`,`bytes32 salt`,`address authorizedSigner`,`address escrowContract`,`uint256 chainId`]),[e.payer,e.payee,e.token,e.salt,e.authorizedSigner,e.escrowContract,BigInt(e.chainId)]);return C.keccak256(t)}const Ja=[{type:`function`,name:`CLOSE_GRACE_PERIOD`,inputs:[],outputs:[{name:``,type:`uint64`,internalType:`uint64`}],stateMutability:`view`},{type:`function`,name:`VOUCHER_TYPEHASH`,inputs:[],outputs:[{name:``,type:`bytes32`,internalType:`bytes32`}],stateMutability:`view`},{type:`function`,name:`channels`,inputs:[{name:``,type:`bytes32`,internalType:`bytes32`}],outputs:[{name:`finalized`,type:`bool`,internalType:`bool`},{name:`closeRequestedAt`,type:`uint64`,internalType:`uint64`},{name:`payer`,type:`address`,internalType:`address`},{name:`payee`,type:`address`,internalType:`address`},{name:`token`,type:`address`,internalType:`address`},{name:`authorizedSigner`,type:`address`,internalType:`address`},{name:`deposit`,type:`uint128`,internalType:`uint128`},{name:`settled`,type:`uint128`,internalType:`uint128`}],stateMutability:`view`},{type:`function`,name:`close`,inputs:[{name:`channelId`,type:`bytes32`,internalType:`bytes32`},{name:`cumulativeAmount`,type:`uint128`,internalType:`uint128`},{name:`signature`,type:`bytes`,internalType:`bytes`}],outputs:[],stateMutability:`nonpayable`},{type:`function`,name:`computeChannelId`,inputs:[{name:`payer`,type:`address`,internalType:`address`},{name:`payee`,type:`address`,internalType:`address`},{name:`token`,type:`address`,internalType:`address`},{name:`salt`,type:`bytes32`,internalType:`bytes32`},{name:`authorizedSigner`,type:`address`,internalType:`address`}],outputs:[{name:``,type:`bytes32`,internalType:`bytes32`}],stateMutability:`view`},{type:`function`,name:`domainSeparator`,inputs:[],outputs:[{name:``,type:`bytes32`,internalType:`bytes32`}],stateMutability:`view`},{type:`function`,name:`eip712Domain`,inputs:[],outputs:[{name:`fields`,type:`bytes1`,internalType:`bytes1`},{name:`name`,type:`string`,internalType:`string`},{name:`version`,type:`string`,internalType:`string`},{name:`chainId`,type:`uint256`,internalType:`uint256`},{name:`verifyingContract`,type:`address`,internalType:`address`},{name:`salt`,type:`bytes32`,internalType:`bytes32`},{name:`extensions`,type:`uint256[]`,internalType:`uint256[]`}],stateMutability:`view`},{type:`function`,name:`getChannel`,inputs:[{name:`channelId`,type:`bytes32`,internalType:`bytes32`}],outputs:[{name:``,type:`tuple`,internalType:`struct TempoStreamChannel.Channel`,components:[{name:`finalized`,type:`bool`,internalType:`bool`},{name:`closeRequestedAt`,type:`uint64`,internalType:`uint64`},{name:`payer`,type:`address`,internalType:`address`},{name:`payee`,type:`address`,internalType:`address`},{name:`token`,type:`address`,internalType:`address`},{name:`authorizedSigner`,type:`address`,internalType:`address`},{name:`deposit`,type:`uint128`,internalType:`uint128`},{name:`settled`,type:`uint128`,internalType:`uint128`}]}],stateMutability:`view`},{type:`function`,name:`getChannelsBatch`,inputs:[{name:`channelIds`,type:`bytes32[]`,internalType:`bytes32[]`}],outputs:[{name:`channelStates`,type:`tuple[]`,internalType:`struct TempoStreamChannel.Channel[]`,components:[{name:`finalized`,type:`bool`,internalType:`bool`},{name:`closeRequestedAt`,type:`uint64`,internalType:`uint64`},{name:`payer`,type:`address`,internalType:`address`},{name:`payee`,type:`address`,internalType:`address`},{name:`token`,type:`address`,internalType:`address`},{name:`authorizedSigner`,type:`address`,internalType:`address`},{name:`deposit`,type:`uint128`,internalType:`uint128`},{name:`settled`,type:`uint128`,internalType:`uint128`}]}],stateMutability:`view`},{type:`function`,name:`getVoucherDigest`,inputs:[{name:`channelId`,type:`bytes32`,internalType:`bytes32`},{name:`cumulativeAmount`,type:`uint128`,internalType:`uint128`}],outputs:[{name:``,type:`bytes32`,internalType:`bytes32`}],stateMutability:`view`},{type:`function`,name:`open`,inputs:[{name:`payee`,type:`address`,internalType:`address`},{name:`token`,type:`address`,internalType:`address`},{name:`deposit`,type:`uint128`,internalType:`uint128`},{name:`salt`,type:`bytes32`,internalType:`bytes32`},{name:`authorizedSigner`,type:`address`,internalType:`address`}],outputs:[{name:`channelId`,type:`bytes32`,internalType:`bytes32`}],stateMutability:`nonpayable`},{type:`function`,name:`requestClose`,inputs:[{name:`channelId`,type:`bytes32`,internalType:`bytes32`}],outputs:[],stateMutability:`nonpayable`},{type:`function`,name:`settle`,inputs:[{name:`channelId`,type:`bytes32`,internalType:`bytes32`},{name:`cumulativeAmount`,type:`uint128`,internalType:`uint128`},{name:`signature`,type:`bytes`,internalType:`bytes`}],outputs:[],stateMutability:`nonpayable`},{type:`function`,name:`topUp`,inputs:[{name:`channelId`,type:`bytes32`,internalType:`bytes32`},{name:`additionalDeposit`,type:`uint256`,internalType:`uint256`}],outputs:[],stateMutability:`nonpayable`},{type:`function`,name:`withdraw`,inputs:[{name:`channelId`,type:`bytes32`,internalType:`bytes32`}],outputs:[],stateMutability:`nonpayable`},{type:`event`,name:`ChannelClosed`,inputs:[{name:`channelId`,type:`bytes32`,indexed:!0,internalType:`bytes32`},{name:`payer`,type:`address`,indexed:!0,internalType:`address`},{name:`payee`,type:`address`,indexed:!0,internalType:`address`},{name:`settledToPayee`,type:`uint256`,indexed:!1,internalType:`uint256`},{name:`refundedToPayer`,type:`uint256`,indexed:!1,internalType:`uint256`}],anonymous:!1},{type:`event`,name:`ChannelExpired`,inputs:[{name:`channelId`,type:`bytes32`,indexed:!0,internalType:`bytes32`},{name:`payer`,type:`address`,indexed:!0,internalType:`address`},{name:`payee`,type:`address`,indexed:!0,internalType:`address`}],anonymous:!1},{type:`event`,name:`ChannelOpened`,inputs:[{name:`channelId`,type:`bytes32`,indexed:!0,internalType:`bytes32`},{name:`payer`,type:`address`,indexed:!0,internalType:`address`},{name:`payee`,type:`address`,indexed:!0,internalType:`address`},{name:`token`,type:`address`,indexed:!1,internalType:`address`},{name:`authorizedSigner`,type:`address`,indexed:!1,internalType:`address`},{name:`salt`,type:`bytes32`,indexed:!1,internalType:`bytes32`},{name:`deposit`,type:`uint256`,indexed:!1,internalType:`uint256`}],anonymous:!1},{type:`event`,name:`CloseRequestCancelled`,inputs:[{name:`channelId`,type:`bytes32`,indexed:!0,internalType:`bytes32`},{name:`payer`,type:`address`,indexed:!0,internalType:`address`},{name:`payee`,type:`address`,indexed:!0,internalType:`address`}],anonymous:!1},{type:`event`,name:`CloseRequested`,inputs:[{name:`channelId`,type:`bytes32`,indexed:!0,internalType:`bytes32`},{name:`payer`,type:`address`,indexed:!0,internalType:`address`},{name:`payee`,type:`address`,indexed:!0,internalType:`address`},{name:`closeGraceEnd`,type:`uint256`,indexed:!1,internalType:`uint256`}],anonymous:!1},{type:`event`,name:`Settled`,inputs:[{name:`channelId`,type:`bytes32`,indexed:!0,internalType:`bytes32`},{name:`payer`,type:`address`,indexed:!0,internalType:`address`},{name:`payee`,type:`address`,indexed:!0,internalType:`address`},{name:`cumulativeAmount`,type:`uint256`,indexed:!1,internalType:`uint256`},{name:`deltaPaid`,type:`uint256`,indexed:!1,internalType:`uint256`},{name:`newSettled`,type:`uint256`,indexed:!1,internalType:`uint256`}],anonymous:!1},{type:`event`,name:`TopUp`,inputs:[{name:`channelId`,type:`bytes32`,indexed:!0,internalType:`bytes32`},{name:`payer`,type:`address`,indexed:!0,internalType:`address`},{name:`payee`,type:`address`,indexed:!0,internalType:`address`},{name:`additionalDeposit`,type:`uint256`,indexed:!1,internalType:`uint256`},{name:`newDeposit`,type:`uint256`,indexed:!1,internalType:`uint256`}],anonymous:!1},{type:`error`,name:`AmountExceedsDeposit`,inputs:[]},{type:`error`,name:`AmountNotIncreasing`,inputs:[]},{type:`error`,name:`ChannelAlreadyExists`,inputs:[]},{type:`error`,name:`ChannelFinalized`,inputs:[]},{type:`error`,name:`ChannelNotFound`,inputs:[]},{type:`error`,name:`CloseNotReady`,inputs:[]},{type:`error`,name:`DepositOverflow`,inputs:[]},{type:`error`,name:`InvalidPayee`,inputs:[]},{type:`error`,name:`InvalidSignature`,inputs:[]},{type:`error`,name:`NotPayee`,inputs:[]},{type:`error`,name:`NotPayer`,inputs:[]},{type:`error`,name:`TransferFailed`,inputs:[]}];async function Ya(e,t,n){return p(e,{address:t,abi:Ja,functionName:`getChannel`,args:[n]})}a({abi:Ja,name:`open`}),a({abi:Ja,name:`topUp`});function Xa(e,t){return t??e}function Za(e,t,n,r=!1){let i=e.request.methodDetails?.escrowContract,a=n??zn[t];if(!a&&!(r&&i))throw Error("No trusted `escrowContract` available. Provide it in client parameters or use a supported chain.");if(i&&a&&i.toLowerCase()!==a.toLowerCase()&&(!r||n!==void 0))throw Error(`Tempo session escrow ${i} does not match client escrow ${a}.`);return i&&(!a||i.toLowerCase()!==a.toLowerCase())?i:a}function Qa(e,t,n,r){return G({challenge:e,payload:t,source:`did:pkh:eip155:${n}:${r.address}`})}async function $a(e,t,n,r,i,a,o){let s=Xa(t,o),c=await Ka(e,t,{channelId:n,cumulativeAmount:r},i,a,s);return{action:`voucher`,channelId:n,cumulativeAmount:r.toString(),signature:c}}async function eo(e,t,n){let{escrowContract:i,payee:a,currency:o,deposit:s,initialAmount:c,chainId:l,feePayer:u}=n,d=Xa(t,n.voucherSigner),p=La(d),m=w.random(32),h=qa({authorizedSigner:p,chainId:l,escrowContract:i,payee:a,payer:t.address,salt:m,token:o}),_=r({abi:te.tip20,functionName:`approve`,args:[i,s]}),v=r({abi:Ja,functionName:`open`,args:[a,o,s,m,p]}),y=Math.floor(Date.now()/1e3)+25,b=await f(e,{account:t,calls:[{to:o,data:_},{to:i,data:v}],feeToken:o,nonceKey:`expiring`,validBefore:y});b.gas=(b.gas??0n)+5000n,u&&(b.feePayer=!0);let x=await g(e,b),S=await Ka(e,t,{channelId:h,cumulativeAmount:c},i,l,d);return{entry:{authorizedSigner:p,channelId:h,salt:m,cumulativeAmount:c,escrowContract:i,chainId:l,opened:!0},payload:{action:`open`,type:`transaction`,channelId:h,transaction:x,authorizedSigner:p,cumulativeAmount:c.toString(),signature:S}}}async function to(e,t,n,r){try{let i=await Ya(e,t,n);if(i.deposit>0n&&!i.finalized)return{authorizedSigner:BigInt(i.authorizedSigner)===0n?i.payer:i.authorizedSigner,channelId:n,salt:`0x`,cumulativeAmount:i.settled,escrowContract:t,chainId:r,opened:!0}}catch{}}const no=z.object({account:z.optional(z.custom()),action:z.optional(z.enum([`open`,`topUp`,`voucher`,`close`])),channelId:z.optional(z.string()),cumulativeAmount:z.optional(B()),cumulativeAmountRaw:z.optional(z.string()),transaction:z.optional(z.string()),additionalDeposit:z.optional(B()),additionalDepositRaw:z.optional(z.string()),depositRaw:z.optional(z.string())});function ro(e={}){let{allowCustomEscrow:t=!1,decimals:n=6}=e,r=Zi({chain:N,getClient:e.getClient,rpcUrl:Bn}),i=qi({account:e.account}),a=e.maxDeposit===void 0?void 0:d(e.maxDeposit,n),o=new Map,s=new Map,c=new Map;function l(t){e.onChannelUpdate?.(t)}function u(e,t,n){return`${e.toLowerCase()}:${t.toLowerCase()}:${n.toLowerCase()}`}function f(n,r,i){if(i){let e=o.get(i);if(e)return Za(n,r,e)}return Za(n,r,e.escrowContract,t)}async function p(t,i,p){let m=t.request.methodDetails,h=m?.chainId??0,g=await r({chainId:h}),_=f(t,h),v=t.request.recipient,y=t.request.currency,b=BigInt(t.request.amount),x=t.request.suggestedDeposit,S=x?BigInt(x):void 0,C=(()=>{if(p?.depositRaw)return BigInt(p.depositRaw);if(e.deposit!==void 0)return d(e.deposit,n);if(S!==void 0&&a!==void 0)return S<a?S:a;if(a!==void 0)return a;if(S!==void 0)return S;throw Error("No deposit amount available. Set `deposit`, `maxDeposit`, or ensure the server challenge includes `suggestedDeposit`.")})(),w=e.voucherSigner??i,T=u(v,y,_),E=s.get(T);if(!E){let e=p?.channelId??m?.channelId;if(e){let t=await to(g,_,e,h);if(t){let e=p?.cumulativeAmountRaw?BigInt(p.cumulativeAmountRaw):p?.cumulativeAmount?d(p.cumulativeAmount,n):void 0;e!==void 0&&(t.cumulativeAmount=e),s.set(T,t),c.set(t.channelId,T),o.set(t.channelId,_),E=t,l(E)}else if(p?.channelId)throw Error(`Channel ${p.channelId} cannot be reused (closed or not found on-chain).`)}}E?.opened&&E.authorizedSigner.toLowerCase()!==La(w).toLowerCase()&&(E=void 0);let D;if(E?.opened)E.cumulativeAmount+=b,D=await $a(g,i,E.channelId,E.cumulativeAmount,_,h,w),l(E);else{let e=await eo(g,i,{voucherSigner:w,escrowContract:_,payee:v,currency:y,deposit:C,initialAmount:b,chainId:h,feePayer:m?.feePayer});s.set(T,e.entry),c.set(e.entry.channelId,T),o.set(e.entry.channelId,_),D=e.payload,l(e.entry)}return Qa(t,D,h,i)}async function m(t,i,a){let u=t.request.methodDetails?.chainId??0,p=await r({chainId:u}),m=a.action,{channelId:h,transaction:g}=a,_=e.voucherSigner??i,v=h,y=a.cumulativeAmountRaw?BigInt(a.cumulativeAmountRaw):a.cumulativeAmount?d(a.cumulativeAmount,n):void 0,b=a.additionalDepositRaw?BigInt(a.additionalDepositRaw):a.additionalDeposit?d(a.additionalDeposit,n):void 0,x=f(t,u,v);o.set(v,x);let S;switch(m){case`open`:{if(!g)throw Error(`transaction required for open action`);if(y===void 0)throw Error(`cumulativeAmount required for open action`);let e=await Ka(p,i,{channelId:v,cumulativeAmount:y},x,u,_);S={action:`open`,type:`transaction`,channelId:v,transaction:g,authorizedSigner:La(_),cumulativeAmount:y.toString(),signature:e};break}case`topUp`:if(!g)throw Error(`transaction required for topUp action`);if(b===void 0)throw Error(`additionalDeposit required for topUp action`);S={action:`topUp`,type:`transaction`,channelId:v,transaction:g,additionalDeposit:b.toString()};break;case`voucher`:{if(y===void 0)throw Error(`cumulativeAmount required for voucher action`);S=await $a(p,i,v,y,x,u,_);let e=c.get(v);if(e){let t=s.get(e);t&&(t.cumulativeAmount=t.cumulativeAmount>y?t.cumulativeAmount:y,l(t))}break}case`close`:{if(y===void 0)throw Error(`cumulativeAmount required for close action`);let e=await Ka(p,i,{channelId:v,cumulativeAmount:y},x,u,_);S={action:`close`,channelId:v,cumulativeAmount:y.toString(),signature:e};let t=c.get(v);if(t){let e=s.get(t);e&&(e.opened=!1,e.cumulativeAmount=e.cumulativeAmount>y?e.cumulativeAmount:y,l(e))}break}}return Qa(t,S,u,i)}return At(ja,{canHandleChallenge({challenge:e}){let t=qe(e.request.methodDetails,Ge.sessionProtocol);return t===void 0||t===Ke.v1},context:no,async createCredential({challenge:t,context:n}){let o=t.request.methodDetails?.chainId??0,s=await r({chainId:o}),c=i(s,n);if(!n?.action&&(e.deposit!==void 0||a!==void 0))return p(t,c,n);if(n?.action)return m(t,c,n);throw Error("No `action` in context and no `deposit` or `maxDeposit` configured. Either provide context with action/channelId/cumulativeAmount, or configure `deposit`/`maxDeposit` for auto-management.")}})}const io=(1n<<96n)-1n;function ao(e){return e>=0n&&e<=io}function oo(e){if(!/^\d{1,29}$/.test(e))return;let t=BigInt(e);return ao(t)?t:void 0}function so(e){return co(e),e}function co(e){if(!ao(e))throw Error(`Value ${e} is outside uint96 bounds.`)}const lo=new Set([`open`,`topUp`,`voucher`,`close`]);function uo(e){return typeof e==`object`&&!!e}function fo(e){return typeof e==`string`&&lo.has(e)}function po(e){if(typeof e!=`object`||!e)return!1;let t=e;return!(typeof t.channelId!=`string`||t.action!==void 0&&!fo(t.action))}function mo(e,t=`No session credential context available.`){if(!po(e))throw Error(t);return e}function ho(e){let t=e.request.amount;if(typeof t!=`string`)throw Error(`Session challenge is missing amount.`);return BigInt(t)}function go(e){return uo(e)?typeof e.channelId==`string`&&typeof e.requiredCumulative==`string`&&typeof e.acceptedCumulative==`string`&&typeof e.deposit==`string`:!1}function _o(e){return uo(e)?e.method===`tempo`&&e.intent===`session`&&e.status===`success`&&typeof e.timestamp==`string`&&typeof e.reference==`string`&&typeof e.challengeId==`string`&&typeof e.channelId==`string`&&typeof e.acceptedCumulative==`string`&&typeof e.spent==`string`&&(e.units===void 0||typeof e.units==`number`)&&(e.txHash===void 0||typeof e.txHash==`string`):!1}function vo(e){let t=x.toString(e),n=JSON.parse(t);if(!_o(n))throw Error(`Invalid session receipt.`);return n}function yo(e){return e.headers.get(`content-type`)?.toLowerCase().startsWith(`text/event-stream`)??!1}function bo(e){let t=`message`,n=[];for(let r of e.split(`
|
|
1
|
+
import{createClient as e,createTransport as t,custom as n,encodeFunctionData as r,erc20Abi as i,getAbiItem as a,getAddress as o,hashTypedData as s,http as c,isAddress as l,isAddressEqual as u,parseUnits as d}from"viem";import{prepareTransactionRequest as f,readContract as p,sendCallsSync as m,sendTransactionSync as h,signTransaction as g,signTypedData as _}from"viem/actions";import*as v from"viem/chains";import{tempo as y}from"viem/chains";import{AbiParameters as b,Base64 as x,Bytes as S,Hash as C,Hex as w,Json as T,Signature as E}from"ox";import{z as D}from"zod/mini";import*as O from"node:child_process";import*as k from"node:fs";import*as A from"node:os";import*as j from"node:path";import{z as M}from"zod";import"node:readline";import{tempo as N,tempoModerato as ee}from"viem/tempo/chains";import{Abis as P,Account as te,Actions as F,Addresses as ne,TokenId as re,Transaction as ie,withFeePayer as ae}from"viem/tempo";import{parseAccount as oe,privateKeyToAccount as se}from"viem/accounts";import{createParser as ce}from"eventsource-parser";import{Channel as le,KeyAuthorization as I,SignatureEnvelope as L,TempoAddress as ue,TxEnvelopeTempo as de}from"ox/tempo";import{defineToken as fe}from"viem/tokens";var pe=Object.defineProperty,me=Object.getOwnPropertyDescriptor,he=Object.getOwnPropertyNames,ge=Object.prototype.hasOwnProperty,_e=(e,t)=>{let n={};for(var r in e)pe(n,r,{get:e[r],enumerable:!0});return t||pe(n,Symbol.toStringTag,{value:`Module`}),n},ve=(e,t,n,r)=>{if(t&&typeof t==`object`||typeof t==`function`)for(var i=he(t),a=0,o=i.length,s;a<o;a++)s=i[a],!ge.call(e,s)&&s!==n&&pe(e,s,{get:(e=>t[e]).bind(null,s),enumerable:!(r=me(t,s))||r.enumerable});return e},ye=(e,t,n)=>(ve(e,t,`default`),n&&ve(n,t,`default`));const be=Symbol(`mppx.x402.asset`);function xe(e){return{[be]:!0,address:e.address,decimals:e.decimals,network:e.network,transfer:e.transfer}}function Se(e,t){let n=e(t.chainId);return xe({address:n.address,decimals:n.decimals,network:Me(t.chainId),transfer:Pe(t.transfer,n)})}const Ce={USDC:xe({address:`0x833589fCD6eDb6E08f4c7C32D4f71b54bdA02913`,decimals:6,network:`eip155:8453`,transfer:{name:`USD Coin`,type:`eip3009`,version:`2`}})},we={USDC:xe({address:`0x036CbD53842c5426634e7929541eC2318f3dCF7e`,decimals:6,network:`eip155:84532`,transfer:{name:`USDC`,type:`eip3009`,version:`2`}})},Te={USDC:xe({address:`0xcebA9300f2b948710d2653dD7B07f33A8B32118C`,decimals:6,network:`eip155:42220`,transfer:{name:`USDC`,type:`eip3009`,version:`2`}}),USDT:xe({address:`0x48065fbBE25f71C9282ddf5e1cD6D6A887483D5e`,decimals:6,network:`eip155:42220`,transfer:{name:`Tether USD`,type:`eip3009`,version:`1`}})},Ee={USDC:xe({address:`0x01C5C0122039549AD1493B8220cABEdD739BC44E`,decimals:6,network:`eip155:11142220`,transfer:{name:`USDC`,type:`eip3009`,version:`2`}})};function De(e){return typeof e!=`object`||!e?!1:e[be]===!0}function Oe(e){return typeof e==`function`&&typeof e.addresses==`object`&&typeof e.decimals==`number`}function ke(e){return typeof e==`string`}function Ae(e,t){if(De(e))return e.network===t?{address:e.address,decimals:e.decimals,transfer:e.transfer}:void 0;if(Oe(e)){let n=e.addresses[Ne(t)];return n?{address:n,decimals:e.decimals,name:e.name}:void 0}return{address:e}}function je(e,t,n){let r=Ae(e,n);return r?o(r.address)===o(t):!1}function Me(e){return`eip155:${e}`}function Ne(e){return Number(e.slice(7))}function Pe(e,t){if(e.type!==`eip3009`)return e;if(e.name)return{...e,name:e.name};if(!t.name)throw Error(`EIP-3009 token assets require a token name.`);return{...e,name:t.name}}var Fe=_e({base:()=>Ce,baseSepolia:()=>we,celo:()=>Te,celoSepolia:()=>Ee,define:()=>xe,fromToken:()=>Se,isAsset:()=>De,isRawAddress:()=>ke,isToken:()=>Oe,matches:()=>je,resolve:()=>Ae,toChainId:()=>Ne,toNetwork:()=>Me}),Ie=_e({base:()=>Le,baseSepolia:()=>Re,celo:()=>ze,celoSepolia:()=>Be});const Le=8453,Re=84532,ze=42220,Be=11142220,R={acceptPayment:`Accept-Payment`,authorization:`Authorization`,paymentAuthorization:`Payment-Authorization`,paymentReceipt:`Payment-Receipt`,paymentSession:`Payment-Session`,paymentSessionSnapshot:`Payment-Session-Snapshot`,wwwAuthenticate:`WWW-Authenticate`},Ve={payment:`Payment`},He={evm:`evm`,stripe:`stripe`,tempo:`tempo`},Ue={charge:`charge`,session:`session`,subscription:`subscription`},We={sessionProtocol:`sessionProtocol`,sessionSnapshot:`sessionSnapshot`},Ge={v1:`v1`,v2:`v2`};function Ke(e,t){if(!(!e||typeof e!=`object`))return e[t]}function qe(e){let t=x.toString(e);return JSON.parse(t)}function z(e){let t=T.canonicalize(e);return x.fromString(t,{pad:!1,url:!0})}var B=_e({address:()=>H,amount:()=>V,datetime:()=>Ye,datetimeInput:()=>Xe,hash:()=>U,period:()=>$e,signature:()=>W,toDate:()=>Ze,toDatetimeString:()=>Qe,unwrapOptional:()=>et});import*as Je from"zod/mini";ye(B,Je);function V(){return D.string().check(D.regex(/^\d+(\.\d+)?$/,`Invalid amount`))}function Ye(){return D.string().check(D.regex(/^\d{4}-\d{2}-\d{2}T\d{2}:\d{2}:\d{2}(?:\.\d+)?(?:Z|[+-]\d{2}:\d{2})$/,`Invalid ISO 8601 datetime`))}function Xe(e=`Invalid ISO 8601 datetime`){return D.pipe(D.union([Ye(),D.custom(e=>e instanceof Date)]),D.transform(Ze)).check(D.refine(e=>Number.isFinite(e.getTime()),e))}function Ze(e){return e instanceof Date?e:new Date(e)}function Qe(e){return e instanceof Date?Number.isFinite(e.getTime())?e.toISOString():`Invalid Date`:e}function H(){return D.string().check(D.regex(/^0x[0-9a-fA-F]{40}$/,`Invalid address`))}function U(){return D.string().check(D.regex(/^0x[0-9a-fA-F]{64}$/,`Invalid hash`))}function $e(){return D.string().check(D.regex(/^(day|week|month|year|\d+)$/,`Invalid period`))}function W(){return D.string().check(D.regex(/^0x[0-9a-fA-F]+$/,`Invalid signature`))}function et(e){return e._zod.def.type===`optional`?e._zod.def.innerType:e}const tt=B.object({description:B.optional(B.string()),digest:B.optional(B.string().check(B.regex(/^sha-256=/,`Invalid digest format`))),expires:B.optional(Ye()),header:B.optional(B.string().check(B.regex(/^[!#$%&'*+.^_`|~0-9A-Za-z-]+$/,`Invalid HTTP header name`))),id:B.string().check(B.minLength(1)),intent:B.string(),method:B.string(),meta:B.optional(B.record(B.string(),B.string())),opaque:B.optional(B.string()),realm:B.string(),request:B.record(B.string(),B.unknown())});function nt(e,t){let{description:n,digest:r,meta:i,method:a,header:o,intent:s,realm:c,request:l,secretKey:u}=e,d=gt(o)?void 0:o,f=e.expires?Qe(e.expires):void 0,p=e.opaque??(i===void 0?void 0:z(i)),m=u?_t({...e,expires:f,...i!==void 0&&{meta:i},opaque:p},{secretKey:u}):e.id;return tt.parse({id:m,realm:c,method:a,intent:s,request:l,...n&&{description:n},...r&&{digest:r},...f&&{expires:f},...d!==void 0&&{header:d},...i!==void 0&&{meta:i},...p!==void 0&&{opaque:p}})}function rt(e){let t=[G(`id`,e.id),G(`realm`,e.realm),G(`method`,e.method),G(`intent`,e.intent),G(`request`,z(e.request))];e.description!==void 0&&t.push(G(`description`,e.description)),e.digest!==void 0&&t.push(G(`digest`,e.digest)),e.expires!==void 0&&t.push(G(`expires`,e.expires));let n=e.header;return n!==void 0&&!gt(n)&&t.push(G(`header`,n)),e.opaque===void 0?e.meta!==void 0&&t.push(G(`opaque`,z(e.meta))):t.push(G(`opaque`,e.opaque)),`${Ve.payment} ${t.join(`, `)}`}function G(e,t){if(/[\r\n]/.test(t))throw Error(`Invalid quoted-string value.`);return`${e}="${t.replace(/\\/g,`\\\\`).replace(/"/g,`\\"`).replace(/[\u0100-\uffff]/g,e=>`\\u${e.charCodeAt(0).toString(16).padStart(4,`0`)}`)}"`}function it(e,t){let n=at(e);if(!n)throw Error(`Missing Payment scheme.`);let{request:r,opaque:i,...a}=ot(n);if(!r)throw Error(`Missing request parameter.`);if(r.length>16384)throw Error(`Request parameter too large.`);if(a.method&&!/^[a-z][a-z0-9:_-]*$/.test(a.method))throw Error(`Invalid method: "${a.method}". Must be lowercase per spec.`);return nt({...a,request:qe(r),...i&&{opaque:i}},t)}function at(e){let t=Ve.payment,[n]=ut(e,t);if(n===void 0)return null;let r=n+t.length;for(;r<e.length&&/\s/.test(e[r]??``);)r++;return e.slice(r)}function ot(e){let t=Object.create(null),n=0;for(;n<e.length;){for(;n<e.length&&/[\s,]/.test(e[n]??``);)n++;if(n>=e.length)break;let r=n;for(;n<e.length&&/[A-Za-z0-9_-]/.test(e[n]??``);)n++;let i=e.slice(r,n).toLowerCase();if(!i)throw Error(`Malformed auth-param.`);for(;n<e.length&&/\s/.test(e[n]??``);)n++;if(e[n]!==`=`)break;for(n++;n<e.length&&/\s/.test(e[n]??``);)n++;let[a,o]=st(e,n);if(n=o,i in t)throw Error(`Duplicate parameter: ${i}`);t[i]=a}return t}function st(e,t){if(e[t]===`"`)return ct(e,t+1);let n=t;for(;n<e.length&&e[n]!==`,`;)n++;return[e.slice(t,n).trim(),n]}function ct(e,t){let n=t,r=!1,i=t,a;for(;n<e.length;){let o=e[n];if(n++,r){a??=[];let t=o===`u`?e.slice(n,n+4):void 0;t&&/^[0-9A-Fa-f]{4}$/.test(t)?(a.push(String.fromCharCode(Number.parseInt(t,16))),n+=4):a.push(o),i=n,r=!1;continue}if(o===`\\`){a??=[],a.push(e.slice(i,n-1)),i=n,r=!0;continue}if(o===`"`)return[a?[...a,e.slice(i,n-1)].join(``):e.slice(t,n-1),n]}throw Error(`Unterminated quoted-string.`)}function lt(e,t,n){if(e.slice(t,t+n.length).toLowerCase()!==n.toLowerCase())return!1;let r=e[t+n.length];return!!(r&&/\s/.test(r))}function ut(e,t){let n=[],r=!1,i=!1;for(let a=0;a<e.length;a++){let o=e[a];if(r){i?i=!1:o===`\\`?i=!0:o===`"`&&(r=!1);continue}if(o===`"`){r=!0;continue}if(!lt(e,a,t))continue;let s=a-1;for(;s>=0&&/\s/.test(e[s]??``);)s--;s>=0&&e[s]!==`,`||n.push(a)}return n}function dt(e,t){if(e.status!==402)throw Error(`Response status is not 402.`);return ft(e.headers,t)}function ft(e,t){let n=e.get(R.wwwAuthenticate);if(!n)throw Error(`Missing ${R.wwwAuthenticate} header.`);return pt(n,t)}function pt(e,t){let n=ut(e,Ve.payment);if(n.length===0)throw Error(`No Payment schemes found.`);return n.map((r,i)=>{let a=i+1<n.length?n[i+1]:e.length;return it(e.slice(r,a).replace(/,\s*$/,``),t)})}function mt(e){let t=[e.realm,e.method,e.intent,z(e.request),e.expires??``,e.digest??``],n=e.header;return n!==void 0&&!gt(n)&&t.push(n),t.push(e.opaque??(e.meta?z(e.meta):``)),t.join(`|`)}function ht(e){return e.header??R.authorization}function gt(e){return e?.toLowerCase()===R.authorization.toLowerCase()}function _t(e,t){let n=mt(e),r=S.fromString(t.secretKey),i=S.fromString(n),a=C.hmac256(r,i,{as:`Bytes`});return x.fromBytes(a,{url:!0,pad:!1})}var vt=class extends Error{name=`MissingPaymentSchemeError`;constructor(){super(`Missing Payment scheme.`)}},yt=class extends Error{name=`InvalidCredentialEncodingError`;constructor(){super(`Invalid base64url or JSON.`)}};function bt(e){let t=e.match(RegExp(`^${Ve.payment}\\s+(.+)$`,`i`));if(!t?.[1])throw new vt;try{let e=x.toString(t[1]),n=JSON.parse(e),{opaque:r,request:i,meta:a,...o}=n.challenge,{meta:s,opaque:c}=xt(r);return{challenge:tt.parse({...o,...s!==void 0&&{meta:s},...c!==void 0&&{opaque:c},request:qe(i)}),payload:n.payload,...n.source&&{source:n.source}}}catch{throw new yt}}function xt(e){if(e===void 0)return{};if(typeof e==`string`)return{opaque:e};if(!St(e))throw Error(`Invalid opaque.`);return{meta:e,opaque:z(e)}}function St(e){return typeof e!=`object`||!e||Array.isArray(e)?!1:Object.values(e).every(e=>typeof e==`string`)}function Ct(e){let{challenge:t,payload:n,source:r}=e;return{challenge:t,payload:n,...r&&{source:r}}}function K(e){let{meta:t,opaque:n,request:r,...i}=e.challenge,a=n??(t===void 0?void 0:z(t)),o={challenge:{...i,...a!==void 0&&{opaque:a},request:z(r)},payload:e.payload,...e.source&&{source:e.source}},s=JSON.stringify(o),c=x.fromString(s,{pad:!1,url:!0});return`${Ve.payment} ${c}`}var wt=class extends Error{details;status=402;hint;constructor(e,t={}){super(e),this.details=t.details}toProblemDetails(e){return{type:this.type,title:this.title,status:this.status,detail:this.message,...this.details&&Object.keys(this.details).length>0&&{details:this.details},...this.hint&&{hint:this.hint},...e&&{challengeId:e}}}},Tt=class extends wt{name=`InvalidChallengeError`;title=`Invalid Challenge`;status=402;type=`https://paymentauth.org/problems/invalid-challenge`;constructor(e={}){let{id:t,reason:n}=e,r=t?` "${t}"`:``,i=n?`: ${n}`:``;super(`Challenge${r} is invalid${i}.`)}},q=class extends wt{name=`VerificationFailedError`;title=`Verification Failed`;type=`https://paymentauth.org/problems/verification-failed`;constructor(e={}){let{details:t,reason:n}=e;super(n?`Payment verification failed: ${n}.`:`Payment verification failed.`,{details:t})}},Et=class extends wt{name=`PaymentExpiredError`;title=`Payment Expired`;type=`https://paymentauth.org/problems/payment-expired`;constructor(e={}){let{expires:t}=e;super(t?`Payment expired at ${t}.`:`Payment has expired.`)}};function Dt(e,t){if(!e)throw new Tt({...t&&{id:t},reason:`missing required expires field`});if(Number.isNaN(new Date(e).getTime()))throw new Tt({...t&&{id:t},reason:`malformed expires timestamp`});if(new Date(e)<new Date)throw new Et({expires:e})}function Ot(e){return e}function kt(e,t){let{canHandleChallenge:n,context:r,createCredential:i}=t;return{...e,canHandleChallenge:n,context:r,createCredential:i}}function At(e){return{encode(t){return x.fromString(JSON.stringify(e.parse(t)))},decode(t){try{return e.parse(JSON.parse(x.toString(t)))}catch{throw new jt}}}}var jt=class extends Error{name=`InvalidJsonHeaderError`;constructor(){super(`Invalid base64 JSON header.`)}};const Mt=[`exact`],Nt=`PAYMENT-REQUIRED`,Pt=`PAYMENT-SIGNATURE`,Ft=B.string().check(B.minLength(1)),It=B.number().check(B.refine(e=>e>0,`Must be positive`)),J=B.string().check(B.regex(/^\d+$/,`Invalid atomic amount`)),Lt=H(),Rt=B.string().check(B.regex(RegExp(`^eip155:\\d+$`),`Invalid EVM CAIP-2 network`)),zt=B.object({description:B.optional(B.string()),iconUrl:B.optional(B.string()),mimeType:B.optional(B.string()),serviceName:B.optional(B.string()),tags:B.optional(B.array(B.string())),url:Ft});B.discriminatedUnion(`type`,[B.object({name:Ft,type:B.literal(`eip3009`),version:Ft}),B.object({name:B.optional(B.string()),type:B.literal(`permit2`),version:B.optional(B.string())})]);const Bt=B.object({amount:J,asset:Ft,extra:B.optional(B.record(B.string(),B.unknown())),maxTimeoutSeconds:It,network:Rt,payTo:Ft,scheme:B.enum(Mt)}),Vt=B.object({info:B.record(B.string(),B.unknown()),schema:B.record(B.string(),B.unknown())}),Ht=B.record(B.string(),Vt),Ut=B.object({accepts:B.array(Bt).check(B.minLength(1)),error:B.optional(B.string()),extensions:B.optional(Ht),resource:zt,x402Version:B.literal(2)}),Wt=B.object({authorization:B.object({from:Lt,nonce:U(),to:Lt,validAfter:J,validBefore:J,value:J}),signature:W()}),Gt=B.object({permit2Authorization:B.object({deadline:J,from:Lt,nonce:J,permitted:B.object({amount:J,token:Lt}),spender:Lt,witness:B.object({to:Lt,validAfter:J})}),signature:W()}),Kt=B.union([Wt,Gt]),qt=B.object({accepted:Bt,extensions:B.optional(Ht),payload:Kt,resource:B.optional(zt),x402Version:B.literal(2)});B.object({extensions:B.optional(Ht),extra:B.optional(B.record(B.string(),B.unknown())),invalidMessage:B.optional(B.string()),invalidReason:B.optional(B.string()),isValid:B.boolean(),payer:B.optional(B.string())});const Jt=B.object({amount:B.optional(J),errorMessage:B.optional(B.string()),errorReason:B.optional(B.string()),extensions:B.optional(Ht),extra:B.optional(B.record(B.string(),B.unknown())),network:Ft,payer:B.optional(B.string()),success:B.boolean(),transaction:B.string()});function Yt(e){let{extensions:t,resource:n,...r}=e;return Bt.parse(r)}const Xt=At(Ut),Zt=At(qt),Qt=At(Jt);Xt.encode,Xt.decode;function $t(e){try{let t=JSON.parse(x.toString(e));return tn(t)}catch{throw new jt}}const en=Zt.encode;Zt.decode,Qt.encode,Qt.decode;const tn=e=>{if(!e||typeof e!=`object`||Array.isArray(e))throw new jt;let t=e;if(t.x402Version!==2||!Array.isArray(t.accepts))throw new jt;let n=zt.parse(t.resource),r=t.extensions===void 0?void 0:Ht.safeParse(t.extensions).data;return{accepts:t.accepts,...r?{extensions:r}:{},resource:n,x402Version:2}};function nn(e){let t=[z(e.accepted),z(e.resource),z(e.extensions)].join(`|`);return C.sha256(S.fromString(t),{as:`Hex`})}async function rn(e){let t=e.context?.account??e.config.account;if(!t?.signTypedData)throw Error(`x402 exact requires a typed-data signer.`);let n=e.challenge.request,r=Yt(n);if(cn(e.config,r),!n.resource)throw Error(`x402 exact EIP-3009 requires resource information.`);let i=n.extensions?.mppx?un(n.extensions):n.extensions,a=r.extra?.assetTransferMethod??`eip3009`;if(a!==`eip3009`)throw Error(`x402 exact ${String(a)} signing is not implemented yet.`);let s=r.extra?.name,c=r.extra?.version;if(typeof s!=`string`||typeof c!=`string`)throw Error(`x402 exact EIP-3009 requires token name and version.`);let l=Math.floor(Date.now()/1e3),u={from:o(t.address),nonce:i?.mppx?nn({accepted:r,extensions:i,resource:n.resource}):fn(),to:o(r.payTo),validAfter:(l-600).toString(),validBefore:(l+r.maxTimeoutSeconds).toString(),value:r.amount},d=await t.signTypedData({domain:{chainId:sn(r.network),name:s,verifyingContract:o(r.asset),version:c},message:{...u,value:BigInt(u.value),validAfter:BigInt(u.validAfter),validBefore:BigInt(u.validBefore)},primaryType:`TransferWithAuthorization`,types:on});return en({accepted:r,...i?{extensions:i}:{},payload:{authorization:u,signature:d},...n.resource?{resource:n.resource}:{},x402Version:2})}function an(e){let t=e.challenge.request,n;try{n=Yt(t),cn(e.config,n)}catch{return!1}if(!t.resource||(n.extra?.assetTransferMethod??`eip3009`)!==`eip3009`)return!1;let r=n.extra?.name,i=n.extra?.version;return typeof r==`string`&&typeof i==`string`}const on={TransferWithAuthorization:[{name:`from`,type:`address`},{name:`to`,type:`address`},{name:`value`,type:`uint256`},{name:`validAfter`,type:`uint256`},{name:`validBefore`,type:`uint256`},{name:`nonce`,type:`bytes32`}]};function sn(e){return Number(e.slice(7))}function cn(e,t){let n=sn(t.network);if(e.networks&&!e.networks.includes(n))throw Error(`x402 exact chain ID is not allowed: ${n}.`);let r=e.currencies??e.assets;if(r?.some(e=>ke(e))&&!e.networks?.length)throw Error(`x402 exact raw currency allowlists require networks.`);if(r){let e=o(t.asset);if(!r.some(n=>je(n,e,t.network)))throw Error(`x402 exact currency is not allowed: ${e}.`)}if(e.maxAtomicAmount!==void 0&&BigInt(t.amount)>BigInt(e.maxAtomicAmount))throw Error(`x402 exact amount exceeds maxAtomicAmount.`);if(e.maxAmount!==void 0){let n=ln(e,t);if(n===void 0)throw Error(`x402 exact maxAmount requires currency decimals.`);if(BigInt(t.amount)>d(e.maxAmount,n))throw Error(`x402 exact amount exceeds maxAmount.`)}}function ln(e,t){let n=e.currencies??e.assets,r=o(t.asset),i=n?.find(e=>je(e,r,t.network)),a=i?Ae(i,t.network):void 0;return a?.decimals===void 0?e.decimals:a.decimals}function un(e){let t=e.mppx;return t?{...e,mppx:{...t,info:{...t.info,nonce:dn()}}}:e}function dn(){return pn().slice(2)}function fn(){return pn()}function pn(){let e=globalThis.crypto;if(!e?.getRandomValues)throw Error(`x402 exact requires crypto randomness.`);let t=e.getRandomValues(new Uint8Array(32));return`0x${Array.from(t,e=>e.toString(16).padStart(2,`0`)).join(``)}`}const mn=Symbol.for(`mppx.x402.challenge`);function hn(e){return Object.defineProperty(e,mn,{value:!0}),e}function gn(e){return!!e?.[mn]}const _n=[`authorization`],vn=B.string().check(B.regex(/^\d+$/,`Invalid atomic amount`));B.object({name:B.string().check(B.minLength(1)),version:B.string().check(B.minLength(1))});const yn=B.object({chainId:B.number(),credentialTypes:B.optional(B.array(B.enum(_n)).check(B.minLength(1))),decimals:B.optional(B.number()),permit2Address:B.optional(H()),splits:B.optional(B.array(B.object({amount:vn,recipient:H()})))});B.object({amount:vn,currency:H(),description:B.optional(B.string()),externalId:B.optional(B.string()),methodDetails:yn,recipient:H()});const bn=B.object({amount:V(),chainId:B.number(),currency:H(),credentialTypes:B.optional(B.array(B.enum(_n)).check(B.minLength(1))),decimals:B.number(),description:B.optional(B.string()),externalId:B.optional(B.string()),permit2Address:B.optional(H()),recipient:H(),splits:B.optional(B.array(B.object({amount:vn,recipient:H()})))}),xn=B.object({from:H(),nonce:U(),signature:W(),to:H(),type:B.literal(`authorization`),validAfter:vn,validBefore:vn,value:vn}),Sn={TransferWithAuthorization:[{name:`from`,type:`address`},{name:`to`,type:`address`},{name:`value`,type:`uint256`},{name:`validAfter`,type:`uint256`},{name:`validBefore`,type:`uint256`},{name:`nonce`,type:`bytes32`}]};function Cn(e){return{chainId:e.chainId,name:e.authorization.name,verifyingContract:e.currency,version:e.authorization.version}}function wn(e){return C.keccak256(S.fromString(`${e.id}${e.realm}`),{as:`Hex`})}function Tn(e){return`eip155:${e}`}function En(e){return`did:pkh:eip155:${e.chainId}:${e.address}`}const Dn=Ot({name:`evm`,intent:`charge`,schema:{credential:{payload:xn},request:B.pipe(bn,B.transform(({amount:e,chainId:t,credentialTypes:n=[`authorization`],currency:r,decimals:i,permit2Address:a,recipient:s,splits:c,...l})=>({...l,amount:d(e,i).toString(),currency:o(r),methodDetails:{chainId:t,credentialTypes:n,decimals:i,...a?{permit2Address:o(a)}:{},...c?{splits:c}:{}},recipient:o(s)})))}});function On(e){return kt(Dn,{canHandleChallenge({challenge:t}){return!kn(t)||an({challenge:t,config:e})},context:B.object({account:B.optional(B.custom())}),async createCredential({challenge:t,context:n}){if(kn(t))return rn({challenge:t,config:e,context:n});let r=n?.account??e.account;if(!r?.signTypedData)throw Error(`EVM authorization requires a typed-data signer.`);let i=t.request;if(An(e,i),!i.methodDetails.credentialTypes?.includes(`authorization`))throw Error(`EVM authorization is not accepted by this challenge.`);if(i.methodDetails.splits?.length)throw Error(`EVM authorization does not support payment splits.`);let a=jn(e,i),s=t.expires?Math.floor(new Date(t.expires).getTime()/1e3).toString():(Math.floor(Date.now()/1e3)+300).toString();return K(Ct({challenge:t,payload:{from:o(r.address),nonce:wn(t),signature:await r.signTypedData({domain:Cn({authorization:a,chainId:i.methodDetails.chainId,currency:i.currency}),message:{from:o(r.address),nonce:wn(t),to:o(i.recipient),validAfter:0n,validBefore:BigInt(s),value:BigInt(i.amount)},primaryType:`TransferWithAuthorization`,types:Sn}),to:o(i.recipient),type:`authorization`,validAfter:`0`,validBefore:s,value:i.amount},source:En({address:o(r.address),chainId:i.methodDetails.chainId})}))}})}function kn(e){return gn(e)&&e.request.scheme===`exact`&&typeof e.request.network==`string`}function An(e,t){let n=t.methodDetails.chainId,r=Tn(n);if(e.networks&&!e.networks.includes(n))throw Error(`EVM chain ID is not allowed: ${n}.`);let i=e.currencies??e.assets;if(i?.some(e=>ke(e))&&!e.networks?.length)throw Error(`EVM raw currency allowlists require networks.`);if(i){let e=o(t.currency);if(!i.some(t=>je(t,e,r)))throw Error(`EVM currency is not allowed: ${e}.`)}if(e.maxAtomicAmount!==void 0&&BigInt(t.amount)>BigInt(e.maxAtomicAmount))throw Error(`EVM charge amount exceeds maxAtomicAmount.`);if(e.maxAmount!==void 0){let n=Mn(e,t);if(n===void 0)throw Error(`EVM charge maxAmount requires currency decimals.`);if(BigInt(t.amount)>d(e.maxAmount,n))throw Error(`EVM charge amount exceeds maxAmount.`)}}function jn(e,t){let n=e.currencies??e.assets,r=o(t.currency),i=Tn(t.methodDetails.chainId),a=n?.find(e=>je(e,r,i)),s=a?Ae(a,i):void 0;if(s?.transfer?.type===`eip3009`)return{name:s.transfer.name,version:s.transfer.version};if(e.authorization)return e.authorization;throw Error(`EVM authorization requires token name and version.`)}function Mn(e,t){let n=e.currencies??e.assets,r=o(t.currency),i=Tn(t.methodDetails.chainId),a=n?.find(e=>je(e,r,i)),s=a?Ae(a,i):void 0;return s?.decimals===void 0?e.decimals:s.decimals}function Nn(e){return[Nn.charge(e)]}(function(e){e.charge=On,e.assets=Fe,e.chains=Ie})(Nn||={});var Pn=class extends Error{name=`Incur.BaseError`;shortMessage;details;constructor(e,t={}){let n=t.cause instanceof Error?t.cause.message:void 0,r=n?`${e}\n\nDetails: ${n}`:e;super(r,t.cause?{cause:t.cause}:void 0),this.shortMessage=e,this.details=n}walk(e){return Fn(this,e)}},Y=class extends Pn{name=`Incur.IncurError`;code;hint;retryable;exitCode;constructor(e){super(e.message,e.cause?{cause:e.cause}:void 0),this.code=e.code,this.hint=e.hint,this.retryable=e.retryable??!1,this.exitCode=e.exitCode}};function Fn(e,t){if(t){let n=e?.cause;for(;n;){if(t(n))return n;n=n?.cause}return}let n=e;for(;n?.cause;)n=n.cause;return n}const X={mainnet:4217,testnet:42431},In={usdc:`0x20C000000000000000000000b9537d11c60E8b50`,pathUsd:`0x20c0000000000000000000000000000000000000`},Ln={[X.mainnet]:In.usdc,[X.testnet]:In.pathUsd},Rn={[X.mainnet]:`0x33b901018174DDabE4841042ab76ba85D4e24f25`,[X.testnet]:`0xe1c4d3dce17bc111181ddf716f75bae49e61a336`},zn={[X.mainnet]:`https://rpc.tempo.xyz`,[X.testnet]:`https://rpc.moderato.tempo.xyz`},Z=(()=>{let e=process||{},t=e.argv||[],n=e.env||{},r=!(n.NO_COLOR||t.includes(`--no-color`))&&(!!n.FORCE_COLOR||t.includes(`--color`)||(e.stdout||{}).isTTY&&n.TERM!==`dumb`||!!n.CI),i=(e,t,n,r)=>{let i=``,a=0,o=r;do i+=e.substring(a,o)+n,a=o+t.length,o=e.indexOf(t,a);while(~o);return i+e.substring(a)},a=r?(e,t,n=e)=>r=>{let a=`${r}`,o=a.indexOf(t,e.length);return~o?e+i(a,t,n,o)+t:e+a+t}:()=>String;return{isColorSupported:r,reset:a(`\x1B[0m`,`\x1B[0m`),bold:a(`\x1B[1m`,`\x1B[22m`,`\x1B[22m\x1B[1m`),dim:a(`\x1B[2m`,`\x1B[22m`,`\x1B[22m\x1B[2m`),italic:a(`\x1B[3m`,`\x1B[23m`),underline:a(`\x1B[4m`,`\x1B[24m`),inverse:a(`\x1B[7m`,`\x1B[27m`),hidden:a(`\x1B[8m`,`\x1B[28m`),strikethrough:a(`\x1B[9m`,`\x1B[29m`),black:a(`\x1B[30m`,`\x1B[39m`),red:a(`\x1B[31m`,`\x1B[39m`),green:a(`\x1B[32m`,`\x1B[39m`),yellow:a(`\x1B[33m`,`\x1B[39m`),blue:a(`\x1B[34m`,`\x1B[39m`),magenta:a(`\x1B[35m`,`\x1B[39m`),cyan:a(`\x1B[36m`,`\x1B[39m`),white:a(`\x1B[37m`,`\x1B[39m`),gray:a(`\x1B[90m`,`\x1B[39m`),bgBlack:a(`\x1B[40m`,`\x1B[49m`),bgRed:a(`\x1B[41m`,`\x1B[49m`),bgGreen:a(`\x1B[42m`,`\x1B[49m`),bgYellow:a(`\x1B[43m`,`\x1B[49m`),bgBlue:a(`\x1B[44m`,`\x1B[49m`),bgMagenta:a(`\x1B[45m`,`\x1B[49m`),bgCyan:a(`\x1B[46m`,`\x1B[49m`),bgWhite:a(`\x1B[47m`,`\x1B[49m`),blackBright:a(`\x1B[90m`,`\x1B[39m`),redBright:a(`\x1B[91m`,`\x1B[39m`),greenBright:a(`\x1B[92m`,`\x1B[39m`),yellowBright:a(`\x1B[93m`,`\x1B[39m`),blueBright:a(`\x1B[94m`,`\x1B[39m`),magentaBright:a(`\x1B[95m`,`\x1B[39m`),cyanBright:a(`\x1B[96m`,`\x1B[39m`),whiteBright:a(`\x1B[97m`,`\x1B[39m`),bgBlackBright:a(`\x1B[100m`,`\x1B[49m`),bgRedBright:a(`\x1B[101m`,`\x1B[49m`),bgGreenBright:a(`\x1B[102m`,`\x1B[49m`),bgYellowBright:a(`\x1B[103m`,`\x1B[49m`),bgBlueBright:a(`\x1B[104m`,`\x1B[49m`),bgMagentaBright:a(`\x1B[105m`,`\x1B[49m`),bgCyanBright:a(`\x1B[106m`,`\x1B[49m`),bgWhiteBright:a(`\x1B[107m`,`\x1B[49m`),link(e,t,n){return r?`\x1b]8;;${e}\x07${n?t:Z.underline(t)}\x1b]8;;\x07`:t}}})();function Bn(e,t){return Z.link(e,t)}function Vn(e){return e.startsWith(`tempo:`)}function Hn(e,t,n=6,r){let[i,a]=(Number(e)/10**n).toString().split(`.`),o=i.replace(/\B(?=(\d{3})+(?!\d))/g,`_`),s=r?.explorerUrl&&r.token?Z.dim(Z.link(`${r.explorerUrl}/token/${r.token}`,t,!0)):Z.dim(t);return`${a?`${o}.${a}`:o} ${s}`}const Un={mainnet:zn[X.mainnet],testnet:zn[X.testnet]};function Wn(e,t={}){return e??(t.network?Un[t.network]:void 0)??(process.env.MPPX_RPC_URL?.trim()||process.env.RPC_URL?.trim()||void 0)}async function Gn(t={}){let n=Wn(t.rpcUrl,{network:t.network});if(!n)return N;let{getChainId:r}=await import(`viem/actions`),i=await r(e({transport:c(n)})),a=Object.values(await import(`viem/tempo/chains`)).filter(e=>typeof e==`object`&&!!e&&`id`in e&&e.id===i),o=a.find(e=>`serializers`in e&&e.serializers)??a[0];if(!o)throw Error(`Unknown chain ID ${i} from RPC ${n}`);return o}function Kn(e){return typeof e==`bigint`?e:e.amount}function qn(e){return e.id!==N.id}async function Jn(e,t,n){let{Actions:r}=await import(`viem/tempo`),[i,a]=await Promise.all([r.token.getBalance(e,{account:n,token:t}).then(Kn).catch(()=>0n),r.token.getMetadata(e,{token:t}).catch(()=>({symbol:t}))]);return{balance:i,symbol:{"0x20c0000000000000000000000000000000000000":`PathUSD`,"0x20C000000000000000000000b9537d11c60E8b50":`USDC`}[t]??a.symbol,decimals:`decimals`in a&&typeof a.decimals==`number`?a.decimals:6,token:t}}function Yn(){let e=Number.parseInt(process.env.MPPX_KEYCHAIN_COMMAND_TIMEOUT_MS??``,10);return Number.isFinite(e)&&e>0?e:1e4}function Xn(e,t){return`code`in e&&e.code===`ENOENT`&&e.message.includes(t)}function Zn(e){return new Y({code:`KEYCHAIN_UNAVAILABLE`,message:`Linux keyring requires secret-tool. Install libsecret-tools.`,hint:`On Debian/Ubuntu, run: sudo apt install libsecret-tools gnome-keyring dbus-x11`,exitCode:69,cause:e})}function Qn(e){if(e&&Xn(e,`secret-tool`))throw Zn(e)}function $n(e,t){return new Promise(n=>{O.execFile(e,t,{timeout:Yn()},(e,t,r)=>{n({stdout:t.trim(),stderr:r.trim(),error:e})})})}function er(){let e=j.join(process.env.XDG_CONFIG_HOME||j.join(A.homedir(),`.config`),`mppx`,`default`);return{get(){try{return k.readFileSync(e,`utf-8`).trim()||`main`}catch{return`main`}},set(t){k.mkdirSync(j.dirname(e),{recursive:!0}),k.writeFileSync(e,t,`utf-8`)},clear(){try{k.unlinkSync(e)}catch{}}}}function tr(e){return e||(process.env.MPPX_ACCOUNT?.trim()?process.env.MPPX_ACCOUNT:er().get())}function nr(e=`main`){let t=`mppx`;return{async list(){let e=A.platform();if(e===`darwin`){let{stdout:e,error:n}=await $n(`security`,[`dump-keychain`]);if(n)return[];let r=[],i=e.split(`keychain:`);for(let e of i){let n=e.match(/"svce"<blob>="([^"]*)"/),i=e.match(/"acct"<blob>="([^"]*)"/);n?.[1]===t&&i?.[1]&&r.push(i[1])}return r}if(e===`linux`){let{stdout:e,stderr:n,error:r}=await $n(`secret-tool`,[`search`,`--all`,`--unlock`,`service`,t]);if(Qn(r),r)return[];let i=`${e}\n${n}`,a=[],o=i.matchAll(/\baccount = (.+)/g);for(let e of o)e[1]&&a.push(e[1]);return a}throw Error(`Unsupported platform: ${e}`)},async get(){let n=A.platform();if(n===`darwin`){let{stdout:n,error:r}=await $n(`security`,[`find-generic-password`,`-s`,t,`-a`,e,`-w`]);return r?void 0:n}if(n===`linux`){let{stdout:n,error:r}=await $n(`secret-tool`,[`lookup`,`service`,t,`account`,e]);return Qn(r),r?void 0:n||void 0}throw Error(`Unsupported platform: ${n}`)},async set(n){let r=A.platform();if(r===`darwin`){await $n(`security`,[`delete-generic-password`,`-s`,t,`-a`,e]);let{error:r}=await $n(`security`,[`add-generic-password`,`-s`,t,`-a`,e,`-w`,n]);if(r)throw r;return}if(r===`linux`){let r=O.execFile(`secret-tool`,[`store`,`--label`,`${t} ${e}`,`service`,t,`account`,e]),i=setTimeout(()=>r.kill(),Yn());return r.stdin?.write(n),r.stdin?.end(),new Promise((e,t)=>{r.on(`close`,n=>{clearTimeout(i),n===0?e():t(Error(`secret-tool exited with code ${n}`))}),r.on(`error`,e=>{clearTimeout(i),t(Xn(e,`secret-tool`)?Zn(e):e)})})}throw Error(`Unsupported platform: ${r}`)},async delete(){let n=A.platform();if(n===`darwin`){await $n(`security`,[`delete-generic-password`,`-s`,t,`-a`,e]);return}if(n===`linux`){let{error:n}=await $n(`secret-tool`,[`clear`,`service`,t,`account`,e]);Qn(n);return}throw Error(`Unsupported platform: ${n}`)}}}async function rr(e){let{privateKeyToAccount:t}=await import(`viem/accounts`),n=process.env.MPPX_PRIVATE_KEY?.trim();if(n)return{account:t(n),source:`environment`};let r=tr(e),i=await nr(r).get();if(i)return{account:t(i),accountName:r,source:`keychain`};throw Error(`Account "${r}" not found.`)}async function ir(e){return(await rr(e)).account}function ar(e){return e}function or(){return ar({method:`evm`,supports:e=>e.method===`evm`&&!gn(e),async setup({challenge:t}){let n=t.request,r=n.methodDetails,a=r?.chainId,o=a?sr(a):void 0,s=n.currency,l=await ir(),u=[...Object.values(Ce),...Object.values(we),...Object.values(Te),...Object.values(Ee)],d=s??``;if(o&&s)try{let t=e({chain:o,transport:c()}),n=await p(t,{address:s,abi:i,functionName:`symbol`});n&&(d=n)}catch{}return{tokenSymbol:d,tokenDecimals:r?.decimals??6,explorerUrl:o?.blockExplorers?.default?.url,methods:[...Nn({account:l,currencies:u})]}}})}function sr(e){return Object.values(v).find(t=>t.id===e)}function cr(e,t){if(!Number.isInteger(t)||t<0)throw RangeError(`Decimals must be a non-negative integer.`);if(!/^-?(?:\d+(?:\.\d*)?|\.\d+)$/.test(e))throw TypeError(`Value \`${e}\` is not a valid decimal number.`);let n=e.startsWith(`-`),[r=`0`,i=``]=(n?e.slice(1):e).split(`.`),a=i.slice(0,t).padEnd(t,`0`),o=BigInt(`${r||`0`}${a}`);return i.length>t&&i[t]>=`5`&&(o+=1n),n?-o:o}const lr=B.object({customer:B.optional(B.string().check(B.minLength(1))),hooks:B.optional(B.object({inputs:B.object({tax:B.object({calculation:B.string().check(B.minLength(1))})})})),metadata:B.optional(B.record(B.string(),B.string())),receipt_email:B.optional(B.string().check(B.minLength(1)))}),ur=B.custom(e=>typeof e==`function`),dr=B.union([lr,ur]),fr=Ot({name:`stripe`,intent:`charge`,schema:{credential:{payload:B.object({externalId:B.optional(B.string()),spt:B.string()})},request:B.pipe(B.object({amount:V(),currency:B.string(),decimals:B.number(),description:B.optional(B.string()),externalId:B.optional(B.string()),metadata:B.optional(B.record(B.string(),B.string())),networkId:B.string(),paymentIntentOptions:B.optional(dr),paymentMethodTypes:B.array(B.string()).check(B.minLength(1)),recipient:B.optional(B.string())}),B.transform(({amount:e,decimals:t,metadata:n,networkId:r,paymentIntentOptions:i,paymentMethodTypes:a,...o})=>({...o,amount:cr(e,t).toString(),methodDetails:{networkId:r,paymentMethodTypes:a,...n!==void 0&&{metadata:n}}})))}});function pr(e){let{client:t,createToken:n,externalId:r,paymentMethod:i}=e;return kt(fr,{context:B.object({paymentMethod:B.optional(B.string())}),async createCredential({challenge:e,context:a}){let o=a?.paymentMethod??i;if(!o)throw Error(`paymentMethod is required (pass via context or parameters)`);let s=e.request.amount,c=e.request.currency,l=typeof e.request.externalId==`string`?e.request.externalId:void 0,u=e.request.methodDetails?.networkId;if(!u)throw Error(`networkId is required in challenge.methodDetails`);let d=e.request.methodDetails?.metadata;if(d?.externalId)throw Error(`methodDetails.metadata.externalId is reserved; use credential externalId instead`);let f=e.expires?Math.floor(new Date(e.expires).getTime()/1e3):Math.floor(Date.now()/1e3)+3600,p=await n({amount:s,challenge:e,client:t,currency:c,expiresAt:f,metadata:d,networkId:u,paymentMethod:o}),m=l??r;return K({challenge:e,payload:{spt:p,...m===void 0?{}:{externalId:m}}})}})}function mr(e){return[pr(e)]}(function(e){e.charge=pr})(mr||={});function hr(){return ar({method:`stripe`,supports(e){return e.method===`stripe`&&e.intent===`charge`},async setup({challenge:e,methodOpts:t}){let n=e.request,r=n.currency,i=_r(M.object({paymentMethod:M.string(),secretKey:M.string().optional()}),t,[`paymentMethod`,`secretKey`]),a=i.secretKey??process.env.MPPX_STRIPE_SECRET_KEY;if(!a)throw new Y({code:`MISSING_ENV`,message:`MPPX_STRIPE_SECRET_KEY environment variable is required for Stripe payments.`,exitCode:2});return{tokenSymbol:r?.toUpperCase()??``,tokenDecimals:n.decimals??2,methods:[mr.charge({paymentMethod:i.paymentMethod,createToken:async({paymentMethod:e,amount:t,currency:n,networkId:r,expiresAt:i,metadata:o})=>{let s=new URLSearchParams({payment_method:e,"usage_limits[currency]":n,"usage_limits[max_amount]":t,"usage_limits[expires_at]":i.toString()}),c=gr(a),l=process.env.MPPX_STRIPE_SPT_URL?process.env.MPPX_STRIPE_SPT_URL:c?`https://api.stripe.com/v1/test_helpers/shared_payment/granted_tokens`:`https://api.stripe.com/v1/shared_payment/issued_tokens`;if(r){let e=c?`seller_details[network_id]`:`seller_details[network_business_profile]`;s.set(e,r)}if(o)for(let[e,t]of Object.entries(o))s.set(`metadata[${e}]`,t);let u={Authorization:`Basic ${btoa(`${a}:`)}`,"Content-Type":`application/x-www-form-urlencoded`,"Stripe-Version":`2026-07-29.preview`},d=await globalThis.fetch(l,{method:`POST`,headers:u,body:s});if(!d.ok){let a=await d.json();if(c&&(o||r)&&a.error.message.includes(`Received unknown parameter`)){let r=new URLSearchParams({payment_method:e,"usage_limits[currency]":n,"usage_limits[max_amount]":t,"usage_limits[expires_at]":i.toString()});if(d=await globalThis.fetch(l,{method:`POST`,headers:u,body:r}),!d.ok)throw new Y({code:`STRIPE_ERROR`,message:`Failed to create SPT: ${(await d.json()).error.message}`,exitCode:77})}else throw new Y({code:`STRIPE_ERROR`,message:`Failed to create SPT: ${a.error.message}`,exitCode:77})}let{id:f}=await d.json();return f}})]}},formatReceiptField(e,t){if(e===`reference`&&typeof t==`string`&&t.startsWith(`pi_`)){let e=process.env.MPPX_STRIPE_SECRET_KEY,n=`https://dashboard.stripe.com${e!==void 0&&gr(e)?`/test`:``}/payments/${t}`;return Z.link(n,t,!0)}}})}function gr(e){return e.startsWith(`sk_test_`)||e.startsWith(`rk_test_`)}function _r(e,t,n){if(t&&typeof t==`object`&&!Array.isArray(t)){let e=Object.keys(t).filter(e=>!n.includes(e));if(e.length)throw Error(`Unsupported CLI method option(s): ${e.join(`, `)}`)}let r=e.safeParse(t??{});if(r.success)return r.data;let i=r.error.issues.map(e=>`${e.path.length?e.path.join(`.`):`options`}: ${e.message}`).join(`, `);throw Error(`Invalid CLI options (${i})`)}function vr(e){let t={};for(let n of e){let e=t[n.name]??={};e[n.intent]=Cr(n)}return t}function yr(e,t){let n=vr(e),r=Ar(e,n,t),i=e.map((e,t)=>({intent:e.intent,method:e.name,q:r[Cr(e)]??1,index:t}));return{definition:r,entries:i,header:xr(i),keys:n}}function br(e){let t=e.split(/\s*,\s*/).map(e=>e.trim()).filter(Boolean);if(t.length===0)throw Error(`Accept-Payment header is empty.`);return t.map((e,t)=>Or(e,t))}function xr(e){return e.map(({method:e,intent:t,q:n})=>{let r=`${e}/${t}`;return n===1?r:`${r};q=${Pr(n)}`}).join(`, `)}function Sr(e,t,n){let r=new Map;for(let e of t){let t=Cr(e),n=r.get(t);n?n.push(e):r.set(t,[e])}return e.flatMap((e,t)=>{let i=r.get(Cr(e));if(!i)return[];let a=wr(e,n);return!a||a.q<=0?[]:i.filter(t=>t.canHandleChallenge?.({challenge:e})??!0).map(n=>({challenge:e,index:t,match:a,method:n}))}).sort((e,t)=>Dr(e.challenge)-Dr(t.challenge)||t.match.q-e.match.q||e.index-t.index).map(e=>{let{match:t,...n}=e;return n})}function Cr(e){let t=e.method??e.name;if(!t)throw Error(`Missing payment method name.`);return`${t}/${e.intent}`}function wr(e,t){let n;for(let r of t){if(!Tr(e,r))continue;let t={...r,specificity:Er(r)};(!n||t.specificity>n.specificity||t.specificity===n.specificity&&t.q>n.q||t.specificity===n.specificity&&t.q===n.q&&t.index<n.index)&&(n=t)}return n}function Tr(e,t){return(t.method===`*`||t.method===e.method)&&(t.intent===`*`||t.intent===e.intent)}function Er(e){return Number(e.method!==`*`)+Number(e.intent!==`*`)}function Dr(e){return+!!gn(e)}function Or(e,t){let n=/^(?<method>[^/;\s]+|\*)\s*\/\s*(?<intent>[^/;\s]+|\*)(?<params>(?:\s*;\s*.+)?)$/u.exec(e),r=n?.groups?.method,i=n?.groups?.intent;if(!r||!i)throw Error(`Invalid Accept-Payment entry: ${e}`);Fr(r,`method`),Fr(i,`intent`);let a=1;for(let t of kr(n.groups?.params)){if(!t)continue;let n=/^(?<name>[A-Za-z0-9_-]+)\s*=\s*(?<value>\S+)$/u.exec(t),r=n?.groups?.name,i=n?.groups?.value;if(!r||!i)throw Error(`Invalid Accept-Payment parameter: ${t}`);r===`q`&&(a=Mr(i,`Accept-Payment entry "${e}"`))}return{intent:i,method:r,q:a,index:t}}function kr(e){return e?e.split(/\s*;\s*/).filter(Boolean):[]}function Ar(e,t,n){if(!n)return{};let r=typeof n==`function`?n(t):n,i=new Set(e.map(e=>Cr(e))),a={};for(let[e,t]of Object.entries(r??{})){if(!i.has(e))throw Error(`Unknown payment preference "${e}". Available: ${[...i].join(`, `)}`);a[e]=jr(t,`payment preference "${e}"`)}return a}function jr(e,t){if(typeof e!=`number`||Number.isNaN(e)||!Number.isFinite(e))throw Error(`Invalid q-value for ${t}. Expected a finite number.`);return Nr(e,t)}function Mr(e,t){if(!/^0(?:\.\d{0,3})?$|^1(?:\.0{0,3})?$/.test(e))throw Error(`Invalid q-value for ${t}. Expected an HTTP qvalue.`);return Nr(Number(e),t)}function Nr(e,t){if(e<0||e>1)throw Error(`Invalid q-value for ${t}. Expected a value between 0 and 1.`);let n=Math.round(e*1e3);if(Math.abs(e*1e3-n)>1e-9)throw Error(`Invalid q-value for ${t}. Expected at most 3 decimal places.`);return n/1e3}function Pr(e){return e.toFixed(3).replace(/\.0+$/,``).replace(/(\.\d*?)0+$/,`$1`)}function Fr(e,t){if(e!==`*`&&!/^[a-z0-9-]+$/.test(e))throw Error(`Invalid Accept-Payment ${t}: ${e}`)}const Ir=[R.authorization,Nt,`PAYMENT-RESPONSE`,Pt];function Lr(e,t,n){let r=new Headers(e.headers);for(let e of Ir)e===R.authorization&&!r.get(e)?.startsWith(`Payment `)||r.delete(e);return r.set(t,n),{...e,headers:r}}function Rr(e){if(typeof e==`string`)try{let t=JSON.parse(e),n=t?.id;return t?.jsonrpc!==`2.0`||typeof t?.method!=`string`?void 0:typeof n==`string`||typeof n==`number`?n:void 0}catch{return}}const zr=new WeakMap;function Br(e){let t=Rr(e?.body);if(t===void 0)return;let n=new Headers(e?.headers);if(n.has(`mcp-method`))return t;let r=n.get(`accept`)?.toLowerCase()??``;return r.includes(`application/json`)&&r.includes(`text/event-stream`)?t:void 0}function Vr(e){if(!e||typeof e!=`object`)return;let t=e,n=t.id;if(t.jsonrpc!==`2.0`||n!==void 0&&typeof n!=`string`&&typeof n!=`number`)return;let r=`error`in t;if(r!==`result`in t)return r?Number.isInteger(t.error?.code)&&typeof t.error?.message==`string`?e:void 0:n!==void 0&&typeof t.result==`object`?e:void 0}function Hr(e){if(!e||typeof e!=`object`)return;let t=e?.challenges;if(!Array.isArray(t)||t.length===0)return;let n=[];for(let e of t){let t=tt.safeParse(e);if(!t.success)return;n.push(t.data)}let{httpStatus:r,problem:i}=e;return{challenges:n,...typeof r==`number`?{httpStatus:r}:{},...i===void 0?{}:{problem:i}}}function Ur(e){if(e)return`error`in e?e.error?.code!==-32042&&e.error?.code!==-32043?void 0:Hr(e.error.data):Hr(e.result?._meta?.[`org.paymentauth/payment-required`])}function Wr(e,t){return!e||e.id!==t?[]:Ur(e)?.challenges??[]}async function Gr(e){let t=e.clone().body?.getReader();if(!t)return;let n=new TextDecoder,r=!1,i,a=ce({onEvent(e){if(!(r||!e.data)&&(r=!0,!(e.event&&e.event!==`message`)))try{i=Vr(JSON.parse(e.data))}catch{}}});try{for(;;){if(r)return i;let{done:e,value:o}=await t.read();if(e)return a.feed(n.decode()),a.reset({consume:!0}),i;a.feed(n.decode(o,{stream:!0}))}}finally{t.cancel().catch(()=>{})}}function Kr(e){let t=zr.get(e);if(t)return t;let n=(async()=>{let t=e.headers.get(`content-type`)?.toLowerCase()??``;if(t.includes(`application/json`))return e.clone().json().then(Vr).catch(()=>void 0);if(t.includes(`text/event-stream`))return Gr(e)})();return zr.set(e,n),n}function qr(){return{getChallenges(e,t){let n=Br(t);return e.status===402||n===void 0?[]:Kr(e).then(e=>Wr(e,n))},setCredential(e,t){let n=JSON.parse(e.body),r=bt(t);return{...e,body:JSON.stringify({...n,params:{...n.params,_meta:{...n.params?._meta,"org.paymentauth/credential":r}}})}}}}function Jr(){return{getChallenges(e){return e.status!==402||!e.headers.has(R.wwwAuthenticate)?[]:dt(e)},setCredential(e,t,n){return Lr(e,n?.challenge?ht(n.challenge):R.authorization,t)}}}function Yr(){return{getChallenges(e){if(e.status!==402)return[];let t=e.headers.get(Nt);if(!t)return[];let n=$t(t);if(e.url&&n.resource.url!==e.url)throw Error(`x402 payment-required resource does not match response URL.`);return n.accepts.flatMap((e,t)=>{let r=Bt.safeParse(e);if(!r.success)return[];let i=r.data;return hn(nt({id:`x402:${t}`,intent:`charge`,method:`evm`,realm:new URL(n.resource.url).host,request:{...i,...n.extensions?{extensions:n.extensions}:{},resource:n.resource}}))})},setCredential(e,t){return Lr(e,Pt,t)}}}function Xr(e){return e}function Zr(){let e=[Jr(),Yr(),qr()],t=new WeakMap,n=(e,n)=>{for(let r of n)t.set(r,e);return n},r=(t,r)=>{let i=(a,o)=>{for(let s=a;s<e.length;s++){let a=e[s],c=a.getChallenges(t,r);if(c instanceof Promise)return c.then(e=>i(s+1,[...o,...n(a,e)]));o.push(...n(a,c))}return o};return i(0,[])};return Xr({name:`http`,isPaymentRequired(e,t){if(e.status===402)return!0;let n=r(e,t);return n instanceof Promise?n.then(e=>e.length>0):n.length>0},getChallenges(e,t){return r(e,t)},setCredential(n,r,i){let a=i?.challenge?t.get(i.challenge):void 0,o=e[0];if(!a&&!o)throw Error(`No protocol to attach the credential.`);return(a??o).setCredential(n,r,i)}})}const Qr=new WeakMap;function $r(e,t){return Qr.set(e,t),e}function ei(e){return Qr.has(e)}function ti(e,t){return Promise.resolve(Qr.get(e)?.(t))}const ni=new WeakMap,ri=new WeakMap;function ii(e,t){return ni.set(e,t),e}function ai(e){ni.delete(e)}function oi(e,t,n){ni.has(e)&&ri.set(t,n)}function si(e){return ri.get(e)}function ci(e,t){return Promise.resolve(ni.get(e)?.(t)??t.response)}const li=Symbol.for(`mppx.fetch.wrapper`),ui=new WeakMap;async function di(e,t){let n=e?.attempt.settle;if(!n)return t.status!==`pending`;e.attempt.settle=void 0;let r=await n(t);return r||(e.attempt.settle=n),r}function fi(e){let{acceptPayment:t,acceptPaymentPolicy:n=`always`,fetch:r=globalThis.fetch,maxPaymentRetries:i=3,methods:a,onChallenge:o,orderChallenges:s,transport:c=Zr()}=e,l=e.eventDispatcher??pi(),u=t??yr(a),d=Pi(r),f=async(e,t,r)=>{let p=Ni(e,t?.headers),m=p.has(R.acceptPayment),h=zi(p,u),g=ji(e,t,p),_=Ai(e,t,p,h.header,m,n),v=await d(Fi(_.input),_.init),y=Mi(_.init,await g);if(!await c.isPaymentRequired(v,y))return v;let b=t?.context,{context:x,orderChallenges:S,...C}=y??{},w,T,E,D;try{for(let n=0;n<i;n++){T=await c.getChallenges(v,y);let i=(await Bi(Sr(T,a,h.entries),S??s))[0];if(!i){if(await di(D,{challenges:T,response:v,status:`rejected`}),n>0)return v;throw Error(`No method found for challenges: ${T.map(e=>`${e.method}.${e.intent}`).join(`, `)}. Available: ${a.map(e=>`${e.name}.${e.intent}`).join(`, `)}`)}let u=i.challenge;w=u,E=i.method,w.expires&&Dt(w.expires,w.id);let p=Gi(v,_.input,_.input),m=D,g=rt(u),x=m?.method===i.method&&m?.key===g,O=!1;if(m){let e=await di(m,{challenges:T,response:v,status:x?`pending`:`rejected`});O=x&&!e}D=O?m:void 0;let k=vi(async e=>{if(e===void 0&&O&&m)return m.promise;O&&m&&(await di(m,{status:`rejected`}),D=void 0);let t=e??b;if(!ei(i.method))return Ri(u,i.method,t);let n={prepare:()=>ti(i.method,{challenge:u,context:t,fetch:d,input:p})},r=n.prepare().then(()=>Ri(u,i.method,t,n));return D={attempt:n,key:e===void 0?g:void 0,method:i.method,promise:r},r}),A=await l.emit(`challenge.received`,yi({challenge:u,challenges:T,createCredential:k,init:t,input:e,method:i.method,response:v}))??(o?await o(w,{createCredential:k}):void 0)??await k(),j=D;j&&await j.promise.catch(()=>void 0)!==A&&(await di(j,{status:`rejected`}),D=void 0),Li(A),await l.emit(`credential.created`,bi({challenge:u,credential:A,init:t,input:e,method:i.method,response:v})),v=await d(p,c.setCredential({...C,headers:_.headers},A,{challenge:u}));let M=await c.isPaymentRequired(v,y);if(M||(await di(j,{response:v,status:v.ok?`accepted`:`rejected`}),D=void 0),v.ok&&mi(l,`payment.response`)&&await l.emit(`payment.response`,xi({challenge:u,credential:A,init:t,input:e,method:i.method,response:v})),!M)return v.ok?ci(i.method,{challenge:u,credential:A,fetch:d,headers:_.headers,input:p,...r?{refetch:()=>f(Fi(_.input),t,!1)}:{},response:v,signal:Ii(e,t)}):v}T=void 0;try{T=await c.getChallenges(v,y)}catch{}return await di(D,{challenges:T,response:v,status:`rejected`}),v}catch(n){throw await di(D,{challenges:T,response:v,status:`rejected`}),await l.emit(`payment.failed`,Si({challenge:w,challenges:T,error:n,init:t,input:e,method:E,response:v})),n}},p=(e,t)=>f(e,t,!0);return p[li]=d,p}function Q(e){if(!e)return{};if(e instanceof Headers){let t={};return e.forEach((e,n)=>{t[n]=e}),t}return Array.isArray(e)?Object.fromEntries(e):e}function pi(){let e={"*":new Set,"challenge.received":new Set,"credential.created":new Set,"payment.failed":new Set,"payment.response":new Set},t={async emit(t,n){switch(t){case`challenge.received`:{let r;for(let t of e[`challenge.received`]){let e=await hi(t,n);if(typeof e==`string`&&e.length>0){r=e;break}}return await _i(e[`*`],t,n),r}case`credential.created`:await gi(e[`credential.created`],n),await _i(e[`*`],t,n);return;case`payment.failed`:await gi(e[`payment.failed`],n),await _i(e[`*`],t,n);return;case`payment.response`:await gi(e[`payment.response`],n),await _i(e[`*`],t,n);return}},on:(t,n)=>{switch(t){case`*`:case`challenge.received`:case`credential.created`:case`payment.failed`:case`payment.response`:return e[t].add(n),()=>e[t].delete(n);default:throw Error(`Unknown client event "${String(t)}".`)}}};return ui.set(t,t=>e[t].size>0||e[`*`].size>0),t}function mi(e,t){return ui.get(e)?.(t)??!0}async function hi(e,t){try{return await e(t)}catch{return}}async function gi(e,t){for(let n of e)try{await n(t)}catch{}}async function _i(e,t,n){await gi(e,Object.freeze({name:t,payload:n}))}function vi(e){let t;return n=>(t??=e(n),t)}function yi(e){return Object.freeze({challenge:Di(e.challenge),challenges:e.challenges.map(e=>Di(e)),createCredential:e.createCredential,init:Ci(e.init),input:wi(e.input),method:Ti(e.method),response:Ei(e.response)})}function bi(e){return Object.freeze({challenge:Di(e.challenge),credential:e.credential,init:Ci(e.init),input:wi(e.input),method:Ti(e.method),...e.response===void 0?{}:{response:Ei(e.response)}})}function xi(e){return Object.freeze({challenge:Di(e.challenge),credential:e.credential,init:Ci(e.init),input:wi(e.input),method:Ti(e.method),response:Ei(e.response)})}function Si(e){return Object.freeze({...e.challenge?{challenge:Di(e.challenge)}:{},...e.challenges?{challenges:e.challenges.map(e=>Di(e))}:{},error:e.error,init:Ci(e.init),input:wi(e.input),...e.method?{method:Ti(e.method)}:{},...e.response===void 0?{}:{response:Ei(e.response)}})}function Ci(e){if(e)return ki({...e,...e.headers?{headers:new Headers(e.headers)}:{}})}function wi(e){if(e instanceof Request)try{return e.clone()}catch{return e}return e instanceof URL?new URL(e):e}function Ti(e){return ki(Object.assign({},e))}function Ei(e){return e instanceof Response?e.clone():Di(e)}function Di(e){try{return Oi(structuredClone(e))}catch{return ki(e)}}function Oi(e){if(!e||typeof e!=`object`||Object.isFrozen(e))return e;Object.freeze(e);for(let t of Object.values(e))Oi(t);return e}function ki(e){return!e||typeof e!=`object`||Object.isFrozen(e)||Object.freeze(e),e}function Ai(e,t,n,r,i,a){let o=!!r&&!i&&Vi(e,a);if(!o)return{headers:n,init:t,input:e};let s=new Headers(e instanceof Request?e.headers:void 0);return n.forEach((e,t)=>{s.set(t,e)}),s.set(R.acceptPayment,r),t?(t.headers=s,{headers:s,init:t,input:e}):{headers:s,init:o?{headers:s}:void 0,input:e}}function ji(e,t,n){if(!(!(e instanceof Request)||t?.body!==void 0||!e.body||e.bodyUsed)){if(!n.has(`mcp-method`)){let e=n.get(`accept`)?.toLowerCase()??``;if(!e.includes(`application/json`)||!e.includes(`text/event-stream`))return}try{return e.clone().text().catch(()=>void 0)}catch{return}}}function Mi(e,t){return t===void 0?e:{...e,body:t}}function Ni(e,t){return t?new Headers(t):new Headers(e instanceof Request?e.headers:void 0)}function Pi(e){let t=e;for(;t[li];)t=t[li];return t}function Fi(e){if(!(e instanceof Request)||!e.body||e.bodyUsed)return e;try{return e.clone()}catch{return e}}function Ii(e,t){return t?.signal??(e instanceof Request?e.signal:void 0)}function Li(e){if(!e.trim())throw Error(`Credential header value must be non-empty`);if(e.includes(`\r`)||e.includes(`
|
|
2
|
+
`))throw Error(`Credential header value contains illegal newline characters`)}async function Ri(e,t,n,r){let i=t.context&&n!==void 0?t.context.parse(n):void 0,a=i===void 0?{challenge:e}:{challenge:e,context:i};return r&&oi(t,a,r),t.createCredential(a)}function zi(e,t){let n=e.get(R.acceptPayment);if(!n)return t;try{return{...t,entries:br(n),header:n}}catch{return t}}async function Bi(e,t){return t?t(e):e}function Vi(e,t){if(t===`always`)return!0;if(t===`never`)return!1;let n=Wi(e);return t===`same-origin`?!Ui()||n.origin===globalThis.location.origin:t.origins.some(e=>Hi(n,e))}function Hi(e,t){if(t.startsWith(`*.`)){let n=t.slice(1);return e.hostname.endsWith(n)||e.hostname===t.slice(2)}return e.origin===new URL(t).origin}function Ui(){return globalThis.location!==void 0}function Wi(e){return e instanceof URL?e:e instanceof Request?new URL(e.url):new URL(e,Ui()?globalThis.location.href:void 0)}function Gi(e,t,n){if(!e.url)return t;let r=new URL(e.url),i=Wi(n);if(r.origin!==i.origin)throw Error(`Refusing to send payment credential across redirect from ${i.origin} to ${r.origin}`);return e.url}function Ki(e={}){let{account:t}=e;return(e,{account:n}={})=>{let r=n??t;if(!r){if(!e.account)throw Error("No `account` provided. Pass `account` to parameters or context.");return e.account}return oe(r)}}function qi(e){return Object.fromEntries(Object.entries(e.headers??{}).filter(([e])=>e.toLowerCase()!==`content-type`))}const Ji={[N.id]:N,[ee.id]:ee};function Yi(e,t={}){return c(e.url,{fetchFn:e.fetch,fetchOptions:{headers:qi(e)},...t})}function Xi(r){let{chain:i,getClient:a,remoteFeePayer:o,rpcUrl:s}=r;return a?!i?.serializers&&!o?a:async e=>{let r=await a(e),s=r;if(o&&r.transport.key!==`feePayer`){let e=r.request.bind(r),i=ae(n({request:t=>e(t)},{retryCount:0}),Yi(o,{retryCount:r.transport.retryCount}))({account:r.account,chain:r.chain,pollingInterval:r.pollingInterval,retryCount:0}),a=t({...i.config,retryCount:0},i.value);s=Object.assign({},r,{request:a.request,transport:{...a.config,...a.value}})}return!i?.serializers||s.chain?.serializers?.transaction?s:Object.assign({},s,{chain:{...i,...e.chainId===void 0?{}:{id:e.chainId},...s.chain,formatters:s.chain?.formatters??i.formatters,prepareTransactionRequest:s.chain?.prepareTransactionRequest??i.prepareTransactionRequest,serializers:s.chain?.serializers?.transaction?s.chain.serializers:i.serializers}})}:({chainId:t})=>{if(!s)throw Error("No `rpcUrl` provided.");let n=t||Number(Object.keys(s)[0]),r=s[n];if(!r)throw Error(`No \`rpcUrl\` configured for \`chainId\` (${n}).`);let a=o?ae(c(r),Yi(o)):c(r);return e({chain:Ji[n]??{...i,id:n},transport:a})}}function Zi(e,t){if(t!==void 0&&e.chain?.id!==void 0&&e.chain.id!==t)throw Error(`Chain ID mismatch: expected ${t}, got ${e.chain.id}.`)}function Qi(e,t){if(e!==void 0&&(t===void 0||!e.includes(t)))throw Error(`Chain ID not allowed: ${t??`unknown`}.`)}const $i=w.slice(C.keccak256(S.fromString(`mpp`),{as:`Hex`}),0,4);function ea(e){let t=C.keccak256(S.fromString(e),{as:`Hex`});return w.toBytes(w.slice(t,0,10))}function ta(e){let{serverId:t,clientId:n,challengeId:r}=e,i=new Uint8Array(32);return i.set(w.toBytes($i),0),i[4]=1,i.set(ea(t),5),n&&i.set(ea(n),15),i.set(na(r),25),w.fromBytes(i)}function na(e){let t=C.keccak256(S.fromString(e),{as:`Hex`});return w.toBytes(w.slice(t,0,7))}function ra(e,t){return ue.resolve(e).toLowerCase()===ue.resolve(t).toLowerCase()}const ia=[In.pathUsd,In.usdc];async function aa(e,t){let{account:n,amountOut:r,tokenOut:i,tokenIn:a,slippage:o}=t,s=a.filter(e=>!ra(e,i)),c=await Promise.allSettled([p(e,F.token.getBalance.call(e,{account:n,token:i})),...s.map(t=>p(e,F.token.getBalance.call(e,{account:n,token:t})))]),l=c[0];if(!(l.status===`fulfilled`&&l.value>=r)){for(let t=0;t<s.length;t++){let n=c[t+1];if(n.status!==`fulfilled`)continue;let a=n.value;if(a<=0n)continue;let l=s[t];try{let t=await F.dex.getBuyQuote(e,{tokenIn:l,tokenOut:i,amountOut:r});if(a>=t){let n=t+t*BigInt(Math.round(o*100))/10000n;return[F.token.approve.call(e,{amount:n,spender:ne.stablecoinDex,token:l}),F.dex.buy.call({tokenIn:l,tokenOut:i,amountOut:r,maxAmountIn:n})]}}catch{}}throw new sa({currency:i})}}function oa(e,t){return e?e===!0?{tokenIn:t,slippage:1}:{tokenIn:e.tokenIn?[...e.tokenIn,...t.filter(t=>!e.tokenIn.some(e=>ra(e,t)))]:t,slippage:e.slippage??1}:!1}var sa=class extends Error{name=`InsufficientFundsError`;constructor({currency:e}){super(`Insufficient funds: no balance in ${e} and no viable swap route from fallback currencies.`)}};function ca(e){let t=BigInt(e.amount),n=e.methodDetails?.splits??[],r=n.reduce((e,t)=>e+BigInt(t.amount),0n);if(r>=t)throw Error(`Invalid charge request: split total must be less than total amount.`);let i=t-r;if(i<=0n)throw Error(`Invalid charge request: primary transfer amount must be positive.`);return[{amount:i.toString(),memo:e.methodDetails?.memo,recipient:e.recipient},...n.map(e=>({amount:e.amount,memo:e.memo,recipient:e.recipient}))]}function la(e,t,n){t&&(n&&!n.some(e=>ra(e,t))||e.some(e=>ra(e,t))||e.push(t))}async function ua(e,t,n){try{return(await F.token.getBalance(e,{account:t,token:n})).amount>0n}catch{return!1}}function da(e){let t=e.chain?.feeToken;if(t)return re.toAddress(t);let n=e.chain?.id;return n?Ln[n]:void 0}function fa(e){let t=[];return la(t,In.pathUsd),la(t,Ln[e]),t}async function pa(e){let{account:t,allowedTokens:n,candidateTokens:r,client:i,prioritizeCandidates:a}=e,o=[];if(a)for(let e of r??[])la(o,e,n);if(la(o,await F.fee.getUserToken(i,{account:t}).then(e=>e?.address).catch(()=>void 0),n),la(o,da(i),n),!a)for(let e of r??[])la(o,e,n);for(let e of o)if(await ua(i,t,e))return e;return o[0]}const ma={Proof:[{name:`account`,type:`address`},{name:`challengeId`,type:`string`},{name:`realm`,type:`string`}]};function ha(e){return{name:`MPP`,version:`3`,chainId:e}}function ga(e){let{account:t,challengeId:n,realm:r}=e;return{account:t,challengeId:n,realm:r}}function _a(e){let{account:t,chainId:n,challengeId:r,realm:i}=e;return{domain:ha(n),types:ma,primaryType:`Proof`,message:ga({account:t,challengeId:r,realm:i})}}function va(e){return`did:pkh:eip155:${e.chainId}:${e.address}`}const ya=[`push`,`pull`],ba=B.object({amount:V(),memo:B.optional(U()),recipient:B.pipe(B.string(),B.transform(e=>e))}),xa=(1n<<64n)-1n,Sa={dev_second:1n,day:86400n,week:604800n},Ca=B.pipe(H(),B.transform(e=>e.toLowerCase())),wa=B.object({accessKeyAddress:Ca,keyType:B.enum([`p256`,`secp256k1`,`webAuthn`])}),Ta=B.object({accessKey:B.optional(wa),chainId:B.optional(B.number())}),Ea=Xe(`subscriptionExpires must be a valid date`).check(B.refine(e=>e.getTime()%1e3==0,`subscriptionExpires must be representable as whole seconds`)),Da=B.enum([`dev_second`,`day`,`week`]),Oa=B.pipe(B.union([B.string(),B.bigint(),B.custom(e=>typeof e==`number`&&Number.isSafeInteger(e))]),B.transform(e=>e.toString())).check(B.regex(/^[1-9]\d*$/,`Invalid periodCount`),B.refine(e=>{try{return BigInt(e)<=xa}catch{return!1}},`periodCount exceeds uint64`));function ka(e){return B.refine(e=>{let{amount:t,decimals:n}=e;return d(t,n)>0n},e)}function Aa(e){let{periodCount:t,periodUnit:n}=e;try{let e=Sa[n];return e!==void 0&&BigInt(t)*e<=xa}catch{return!1}}const ja=Ot({name:`tempo`,intent:`charge`,schema:{credential:{payload:B.discriminatedUnion(`type`,[B.object({hash:U(),type:B.literal(`hash`)}),B.object({signature:W(),type:B.literal(`transaction`)}),B.object({signature:W(),type:B.literal(`proof`)})])},request:B.pipe(B.object({amount:V(),chainId:B.optional(B.number()),currency:B.string(),decimals:B.number(),description:B.optional(B.string()),externalId:B.optional(B.string()),feePayer:B.optional(B.pipe(B.union([B.boolean(),B.custom()]),B.transform(e=>typeof e==`object`||e))),memo:B.optional(U()),recipient:B.optional(B.string()),splits:B.optional(B.array(ba).check(B.minLength(1),B.maxLength(10))),supportedModes:B.optional(B.array(B.enum(ya)).check(B.minLength(1)))}).check(B.refine(({amount:e,decimals:t,splits:n})=>{if(!n)return!0;let r=d(e,t),i=n.reduce((e,n)=>e+d(n.amount,t),0n);return n.every(e=>d(e.amount,t)>0n)&&i<r},`Invalid splits`)),B.transform(({amount:e,chainId:t,decimals:n,feePayer:r,memo:i,splits:a,supportedModes:o,...s})=>({...s,amount:d(e,n).toString(),...t!==void 0||r!==void 0||i!==void 0||a!==void 0||o!==void 0?{methodDetails:{...t!==void 0&&{chainId:t},...r!==void 0&&{feePayer:r},...i!==void 0&&{memo:i},...a!==void 0&&{splits:a.map(e=>({...e,amount:d(e.amount,n).toString()}))},...o!==void 0&&{supportedModes:o}}}:{}})))}}),Ma=Ot({name:`tempo`,intent:`session`,schema:{credential:{payload:B.discriminatedUnion(`action`,[B.object({action:B.literal(`open`),authorizedSigner:B.optional(B.string()),channelId:U(),cumulativeAmount:V(),descriptor:B.optional(B.custom()),signature:W(),transaction:W(),type:B.literal(`transaction`)}),B.object({action:B.literal(`topUp`),additionalDeposit:V(),channelId:U(),descriptor:B.optional(B.custom()),transaction:W(),type:B.literal(`transaction`)}),B.object({action:B.literal(`voucher`),channelId:U(),cumulativeAmount:V(),descriptor:B.optional(B.custom()),signature:W()}),B.object({action:B.literal(`close`),channelId:U(),cumulativeAmount:V(),descriptor:B.optional(B.custom()),signature:W()})])},request:B.pipe(B.object({amount:V(),chainId:B.optional(B.number()),channelId:B.optional(U()),currency:B.string(),decimals:B.number(),escrowContract:B.optional(B.string()),feePayer:B.optional(B.pipe(B.union([B.boolean(),B.custom()]),B.transform(e=>typeof e==`object`||e))),feeToken:B.optional(H()),minVoucherDelta:B.optional(V()),operator:B.optional(H()),recipient:B.optional(B.string()),sessionProtocol:B.optional(B.enum([Ge.v2,Ge.v1])),sessionSnapshot:B.optional(B.custom()),suggestedDeposit:B.optional(V()),unitType:B.string()}).check(B.refine(({amount:e,decimals:t})=>d(e,t)>0n,`Session amount must be greater than 0`)),B.transform(({amount:e,chainId:t,channelId:n,decimals:r,escrowContract:i,feePayer:a,feeToken:o,minVoucherDelta:s,operator:c,sessionProtocol:l,sessionSnapshot:u,suggestedDeposit:f,...p})=>({...p,amount:d(e,r).toString(),...f?{suggestedDeposit:d(f,r).toString()}:{},methodDetails:{escrowContract:i,...n!==void 0&&{channelId:n},...s!==void 0&&{minVoucherDelta:d(s,r).toString()},...t!==void 0&&{chainId:t},...a!==void 0&&{feePayer:a},...o!==void 0&&{feeToken:o},...c!==void 0&&{operator:c},...l!==void 0&&{[We.sessionProtocol]:l},...u!==void 0&&{[We.sessionSnapshot]:u}}})))}}),Na=Ot({name:`tempo`,intent:`subscription`,schema:{credential:{payload:B.object({signature:W(),type:B.literal(`keyAuthorization`)})},request:B.pipe(B.object({amount:V(),accessKey:B.optional(wa),chainId:B.optional(B.number()),currency:Ca,decimals:B.number(),description:B.optional(B.string()),externalId:B.optional(B.string()),methodDetails:B.optional(Ta),periodCount:Oa,periodUnit:Da,recipient:Ca,subscriptionExpires:Ea}).check(ka(`Subscription amount must be greater than 0`),B.refine(Aa,`Subscription period exceeds uint64`)),B.transform(({accessKey:e,amount:t,chainId:n,decimals:r,methodDetails:i,subscriptionExpires:a,...o})=>{let s={...i,...e!==void 0&&{accessKey:e},...n!==void 0&&{chainId:n}};return{...o,amount:d(t,r).toString(),subscriptionExpires:a.toISOString(),...Object.keys(s).length>0?{methodDetails:s}:{}}}))}}),Pa=fe({addresses:{4217:`0x20c000000000000000000000f37de3740ADec032`,42431:`0x20c000000000000000000000f37de3740ADec032`},currency:`USD`,decimals:6,name:`MACH`,symbol:`MACH`}),Fa=B.object({account:B.optional(B.custom()),autoSwap:B.optional(B.custom()),mode:B.optional(B.enum(ya))});function Ia(e={}){let{clientId:t}=e,n=Xi({chain:N,getClient:e.getClient,rpcUrl:zn}),r=Ki({account:e.account});return kt(ja,{context:Fa,async createCredential({challenge:i,context:a}){let o=i.request.methodDetails?.chainId;if(e.expectedChainId!==void 0&&o!==void 0&&o!==e.expectedChainId)throw Error(`Chain ID mismatch: expected ${e.expectedChainId}, got ${o}.`);(o!==void 0||e.allowedChainIds?.length===0)&&Qi(e.allowedChainIds,o);let s=o??e.expectedChainId??(e.allowedChainIds?.length===1?e.allowedChainIds[0]:void 0),c=await n({chainId:s});Zi(c,s);let l=s??c.chain?.id;if(Qi(e.allowedChainIds,l),l===void 0)throw Error("No `chainId` provided. Pass a chain ID in the challenge or client.");let{request:d}=i,{amount:p,methodDetails:v}=d,y=v?.supportedModes??[`pull`,`push`],b=r(c,a);if(e.expectedRecipients){let t=new Set(e.expectedRecipients.map(e=>e.toLowerCase()));if(!d.recipient||!t.has(d.recipient.toLowerCase()))throw Error(`Unexpected primary recipient: ${d.recipient}`);let n=v?.splits;if(n){for(let e of n)if(!t.has(e.recipient.toLowerCase()))throw Error(`Unexpected split recipient: ${e.recipient}`)}}if(BigInt(p)===0n)return K({challenge:i,payload:{signature:await _(c,{account:b,..._a({account:b.address,chainId:l,challengeId:i.id,realm:i.realm})}),type:`proof`},source:va({address:b.address,chainId:l})});let x=d.currency,S=v?.memo?v.memo:ta({challengeId:i.id,clientId:t,serverId:i.realm}),C=ca({amount:p,methodDetails:{...v,memo:S},recipient:d.recipient}).map(e=>F.token.transfer.call(c,{amount:BigInt(e.amount),...e.memo&&{memo:e.memo},to:e.recipient,token:x})),w=oa(a?.autoSwap??e.autoSwap,ia),T=await e.resolveAccount?.({account:b,chainId:l,operation:{kind:`executeCalls`,...w?{}:{calls:C}}})??b,E=(()=>{let t=a?.mode??e.mode;if(t){if(!y.includes(t))throw Error(`Challenge does not support ${t} mode.`);return t}let n=T.type===`json-rpc`?`push`:`pull`;return y.includes(n)?n:y[0]})(),D=[...(w?await aa(c,{account:T.address,amountOut:BigInt(p),tokenOut:x,tokenIn:w.tokenIn,slippage:w.slippage}):void 0)??[],...C],O=Pa.addresses[l],k=fa(l),A=O&&u(x,O)?await pa({account:T.address,allowedTokens:k,candidateTokens:k,client:c,prioritizeCandidates:!0}):void 0,j=(()=>{let e=Math.floor(Date.now()/1e3)+25;if(!i.expires)return e;let t=Math.floor(new Date(i.expires).getTime()/1e3);return Math.min(e,t)})();if(E===`push`){let{receipts:e}=T.type===`local`?{receipts:[await h(c,{account:T,calls:D,...A?{feeToken:A}:{},nonceKey:`expiring`,validBefore:j})]}:await m(c,{account:T,...A?{capabilities:{feeToken:A}}:{},calls:D,experimental_fallback:D.length===1,forceAtomic:D.length>1}),t=e?.[0]?.transactionHash;if(!t)throw Error(`No transaction receipt returned.`);return K({challenge:i,payload:{hash:t,type:`hash`},source:va({address:T.address,chainId:l})})}let M=await f(c,{account:T,calls:D,...A?{feeToken:A}:{},nonceKey:`expiring`,validBefore:j});if(M.gas=(M.gas??0n)+5000n,v?.feePayer){let e=M;delete e.feePayerSignature,delete e.feeToken,e.feePayer=!0}return K({challenge:i,payload:{signature:await g(c,M),type:`transaction`},source:va({address:T.address,chainId:l})})}})}function La(e){return`accessKeyAddress`in e}function Ra(e){return La(e)?e.accessKeyAddress:e.address}function za(e,t){return{name:`Tempo Stream Channel`,version:`1`,chainId:t,verifyingContract:e}}const Ba={Voucher:[{name:`channelId`,type:`bytes32`},{name:`cumulativeAmount`,type:`uint128`}]};function Va(e){return{channelId:e.channelId,cumulativeAmount:e.cumulativeAmount}}function Ha(e,t,n){return s({domain:za(e,t),types:Ba,primaryType:`Voucher`,message:Va(n)})}async function Ua(e,t,n,r,i){return _(e,{account:t,domain:za(r,i),types:Ba,primaryType:`Voucher`,message:Va(n)})}function Wa(e){let t=L.from(e);if(t.type===`keychain`){if(t.inner.type!==`secp256k1`)throw Error(`Session vouchers only unwrap secp256k1 keychain signatures; pass a direct voucherSigner for other key types.`);return E.toHex(t.inner.signature)}return L.serialize(t)}function Ga(e){return e.type!==`keychain`&&e.type===`secp256k1`}function Ka(e){if(!Ga(e))throw Error(`Session vouchers only support secp256k1 signatures until TIP-1020 voucher verification is enabled.`)}async function qa(e,t,n,r,i,a){let o=a??t,s=Ra(o),c=Ha(r,i,n),l=Wa(La(o)?await o.sign({hash:c,raw:!0}):await Ua(e,o,n,r,i)),u=L.from(l);if(Ka(u),!L.verify(u,{address:s,payload:c}))throw Error(`voucher signature does not match voucher signer`);return l}function Ja(e){let t=b.encode(b.from([`address payer`,`address payee`,`address token`,`bytes32 salt`,`address authorizedSigner`,`address escrowContract`,`uint256 chainId`]),[e.payer,e.payee,e.token,e.salt,e.authorizedSigner,e.escrowContract,BigInt(e.chainId)]);return C.keccak256(t)}const Ya=[{type:`function`,name:`CLOSE_GRACE_PERIOD`,inputs:[],outputs:[{name:``,type:`uint64`,internalType:`uint64`}],stateMutability:`view`},{type:`function`,name:`VOUCHER_TYPEHASH`,inputs:[],outputs:[{name:``,type:`bytes32`,internalType:`bytes32`}],stateMutability:`view`},{type:`function`,name:`channels`,inputs:[{name:``,type:`bytes32`,internalType:`bytes32`}],outputs:[{name:`finalized`,type:`bool`,internalType:`bool`},{name:`closeRequestedAt`,type:`uint64`,internalType:`uint64`},{name:`payer`,type:`address`,internalType:`address`},{name:`payee`,type:`address`,internalType:`address`},{name:`token`,type:`address`,internalType:`address`},{name:`authorizedSigner`,type:`address`,internalType:`address`},{name:`deposit`,type:`uint128`,internalType:`uint128`},{name:`settled`,type:`uint128`,internalType:`uint128`}],stateMutability:`view`},{type:`function`,name:`close`,inputs:[{name:`channelId`,type:`bytes32`,internalType:`bytes32`},{name:`cumulativeAmount`,type:`uint128`,internalType:`uint128`},{name:`signature`,type:`bytes`,internalType:`bytes`}],outputs:[],stateMutability:`nonpayable`},{type:`function`,name:`computeChannelId`,inputs:[{name:`payer`,type:`address`,internalType:`address`},{name:`payee`,type:`address`,internalType:`address`},{name:`token`,type:`address`,internalType:`address`},{name:`salt`,type:`bytes32`,internalType:`bytes32`},{name:`authorizedSigner`,type:`address`,internalType:`address`}],outputs:[{name:``,type:`bytes32`,internalType:`bytes32`}],stateMutability:`view`},{type:`function`,name:`domainSeparator`,inputs:[],outputs:[{name:``,type:`bytes32`,internalType:`bytes32`}],stateMutability:`view`},{type:`function`,name:`eip712Domain`,inputs:[],outputs:[{name:`fields`,type:`bytes1`,internalType:`bytes1`},{name:`name`,type:`string`,internalType:`string`},{name:`version`,type:`string`,internalType:`string`},{name:`chainId`,type:`uint256`,internalType:`uint256`},{name:`verifyingContract`,type:`address`,internalType:`address`},{name:`salt`,type:`bytes32`,internalType:`bytes32`},{name:`extensions`,type:`uint256[]`,internalType:`uint256[]`}],stateMutability:`view`},{type:`function`,name:`getChannel`,inputs:[{name:`channelId`,type:`bytes32`,internalType:`bytes32`}],outputs:[{name:``,type:`tuple`,internalType:`struct TempoStreamChannel.Channel`,components:[{name:`finalized`,type:`bool`,internalType:`bool`},{name:`closeRequestedAt`,type:`uint64`,internalType:`uint64`},{name:`payer`,type:`address`,internalType:`address`},{name:`payee`,type:`address`,internalType:`address`},{name:`token`,type:`address`,internalType:`address`},{name:`authorizedSigner`,type:`address`,internalType:`address`},{name:`deposit`,type:`uint128`,internalType:`uint128`},{name:`settled`,type:`uint128`,internalType:`uint128`}]}],stateMutability:`view`},{type:`function`,name:`getChannelsBatch`,inputs:[{name:`channelIds`,type:`bytes32[]`,internalType:`bytes32[]`}],outputs:[{name:`channelStates`,type:`tuple[]`,internalType:`struct TempoStreamChannel.Channel[]`,components:[{name:`finalized`,type:`bool`,internalType:`bool`},{name:`closeRequestedAt`,type:`uint64`,internalType:`uint64`},{name:`payer`,type:`address`,internalType:`address`},{name:`payee`,type:`address`,internalType:`address`},{name:`token`,type:`address`,internalType:`address`},{name:`authorizedSigner`,type:`address`,internalType:`address`},{name:`deposit`,type:`uint128`,internalType:`uint128`},{name:`settled`,type:`uint128`,internalType:`uint128`}]}],stateMutability:`view`},{type:`function`,name:`getVoucherDigest`,inputs:[{name:`channelId`,type:`bytes32`,internalType:`bytes32`},{name:`cumulativeAmount`,type:`uint128`,internalType:`uint128`}],outputs:[{name:``,type:`bytes32`,internalType:`bytes32`}],stateMutability:`view`},{type:`function`,name:`open`,inputs:[{name:`payee`,type:`address`,internalType:`address`},{name:`token`,type:`address`,internalType:`address`},{name:`deposit`,type:`uint128`,internalType:`uint128`},{name:`salt`,type:`bytes32`,internalType:`bytes32`},{name:`authorizedSigner`,type:`address`,internalType:`address`}],outputs:[{name:`channelId`,type:`bytes32`,internalType:`bytes32`}],stateMutability:`nonpayable`},{type:`function`,name:`requestClose`,inputs:[{name:`channelId`,type:`bytes32`,internalType:`bytes32`}],outputs:[],stateMutability:`nonpayable`},{type:`function`,name:`settle`,inputs:[{name:`channelId`,type:`bytes32`,internalType:`bytes32`},{name:`cumulativeAmount`,type:`uint128`,internalType:`uint128`},{name:`signature`,type:`bytes`,internalType:`bytes`}],outputs:[],stateMutability:`nonpayable`},{type:`function`,name:`topUp`,inputs:[{name:`channelId`,type:`bytes32`,internalType:`bytes32`},{name:`additionalDeposit`,type:`uint256`,internalType:`uint256`}],outputs:[],stateMutability:`nonpayable`},{type:`function`,name:`withdraw`,inputs:[{name:`channelId`,type:`bytes32`,internalType:`bytes32`}],outputs:[],stateMutability:`nonpayable`},{type:`event`,name:`ChannelClosed`,inputs:[{name:`channelId`,type:`bytes32`,indexed:!0,internalType:`bytes32`},{name:`payer`,type:`address`,indexed:!0,internalType:`address`},{name:`payee`,type:`address`,indexed:!0,internalType:`address`},{name:`settledToPayee`,type:`uint256`,indexed:!1,internalType:`uint256`},{name:`refundedToPayer`,type:`uint256`,indexed:!1,internalType:`uint256`}],anonymous:!1},{type:`event`,name:`ChannelExpired`,inputs:[{name:`channelId`,type:`bytes32`,indexed:!0,internalType:`bytes32`},{name:`payer`,type:`address`,indexed:!0,internalType:`address`},{name:`payee`,type:`address`,indexed:!0,internalType:`address`}],anonymous:!1},{type:`event`,name:`ChannelOpened`,inputs:[{name:`channelId`,type:`bytes32`,indexed:!0,internalType:`bytes32`},{name:`payer`,type:`address`,indexed:!0,internalType:`address`},{name:`payee`,type:`address`,indexed:!0,internalType:`address`},{name:`token`,type:`address`,indexed:!1,internalType:`address`},{name:`authorizedSigner`,type:`address`,indexed:!1,internalType:`address`},{name:`salt`,type:`bytes32`,indexed:!1,internalType:`bytes32`},{name:`deposit`,type:`uint256`,indexed:!1,internalType:`uint256`}],anonymous:!1},{type:`event`,name:`CloseRequestCancelled`,inputs:[{name:`channelId`,type:`bytes32`,indexed:!0,internalType:`bytes32`},{name:`payer`,type:`address`,indexed:!0,internalType:`address`},{name:`payee`,type:`address`,indexed:!0,internalType:`address`}],anonymous:!1},{type:`event`,name:`CloseRequested`,inputs:[{name:`channelId`,type:`bytes32`,indexed:!0,internalType:`bytes32`},{name:`payer`,type:`address`,indexed:!0,internalType:`address`},{name:`payee`,type:`address`,indexed:!0,internalType:`address`},{name:`closeGraceEnd`,type:`uint256`,indexed:!1,internalType:`uint256`}],anonymous:!1},{type:`event`,name:`Settled`,inputs:[{name:`channelId`,type:`bytes32`,indexed:!0,internalType:`bytes32`},{name:`payer`,type:`address`,indexed:!0,internalType:`address`},{name:`payee`,type:`address`,indexed:!0,internalType:`address`},{name:`cumulativeAmount`,type:`uint256`,indexed:!1,internalType:`uint256`},{name:`deltaPaid`,type:`uint256`,indexed:!1,internalType:`uint256`},{name:`newSettled`,type:`uint256`,indexed:!1,internalType:`uint256`}],anonymous:!1},{type:`event`,name:`TopUp`,inputs:[{name:`channelId`,type:`bytes32`,indexed:!0,internalType:`bytes32`},{name:`payer`,type:`address`,indexed:!0,internalType:`address`},{name:`payee`,type:`address`,indexed:!0,internalType:`address`},{name:`additionalDeposit`,type:`uint256`,indexed:!1,internalType:`uint256`},{name:`newDeposit`,type:`uint256`,indexed:!1,internalType:`uint256`}],anonymous:!1},{type:`error`,name:`AmountExceedsDeposit`,inputs:[]},{type:`error`,name:`AmountNotIncreasing`,inputs:[]},{type:`error`,name:`ChannelAlreadyExists`,inputs:[]},{type:`error`,name:`ChannelFinalized`,inputs:[]},{type:`error`,name:`ChannelNotFound`,inputs:[]},{type:`error`,name:`CloseNotReady`,inputs:[]},{type:`error`,name:`DepositOverflow`,inputs:[]},{type:`error`,name:`InvalidPayee`,inputs:[]},{type:`error`,name:`InvalidSignature`,inputs:[]},{type:`error`,name:`NotPayee`,inputs:[]},{type:`error`,name:`NotPayer`,inputs:[]},{type:`error`,name:`TransferFailed`,inputs:[]}];async function Xa(e,t,n){return p(e,{address:t,abi:Ya,functionName:`getChannel`,args:[n]})}a({abi:Ya,name:`open`}),a({abi:Ya,name:`topUp`});function Za(e,t){return t??e}function Qa(e,t,n,r=!1){let i=e.request.methodDetails?.escrowContract,a=n??Rn[t];if(!a&&!(r&&i))throw Error("No trusted `escrowContract` available. Provide it in client parameters or use a supported chain.");if(i&&a&&i.toLowerCase()!==a.toLowerCase()&&(!r||n!==void 0))throw Error(`Tempo session escrow ${i} does not match client escrow ${a}.`);return i&&(!a||i.toLowerCase()!==a.toLowerCase())?i:a}function $a(e,t,n,r){return K({challenge:e,payload:t,source:`did:pkh:eip155:${n}:${r.address}`})}async function eo(e,t,n,r,i,a,o){let s=Za(t,o),c=await qa(e,t,{channelId:n,cumulativeAmount:r},i,a,s);return{action:`voucher`,channelId:n,cumulativeAmount:r.toString(),signature:c}}async function to(e,t,n){let{escrowContract:i,payee:a,currency:o,deposit:s,initialAmount:c,chainId:l,feePayer:u}=n,d=Za(t,n.voucherSigner),p=Ra(d),m=w.random(32),h=Ja({authorizedSigner:p,chainId:l,escrowContract:i,payee:a,payer:t.address,salt:m,token:o}),_=r({abi:P.tip20,functionName:`approve`,args:[i,s]}),v=r({abi:Ya,functionName:`open`,args:[a,o,s,m,p]}),y=Math.floor(Date.now()/1e3)+25,b=await f(e,{account:t,calls:[{to:o,data:_},{to:i,data:v}],feeToken:o,nonceKey:`expiring`,validBefore:y});b.gas=(b.gas??0n)+5000n,u&&(b.feePayer=!0);let x=await g(e,b),S=await qa(e,t,{channelId:h,cumulativeAmount:c},i,l,d);return{entry:{authorizedSigner:p,channelId:h,salt:m,cumulativeAmount:c,escrowContract:i,chainId:l,opened:!0},payload:{action:`open`,type:`transaction`,channelId:h,transaction:x,authorizedSigner:p,cumulativeAmount:c.toString(),signature:S}}}async function no(e,t,n,r){try{let i=await Xa(e,t,n);if(i.deposit>0n&&!i.finalized)return{authorizedSigner:BigInt(i.authorizedSigner)===0n?i.payer:i.authorizedSigner,channelId:n,salt:`0x`,cumulativeAmount:i.settled,escrowContract:t,chainId:r,opened:!0}}catch{}}const ro=B.object({account:B.optional(B.custom()),action:B.optional(B.enum([`open`,`topUp`,`voucher`,`close`])),channelId:B.optional(B.string()),cumulativeAmount:B.optional(V()),cumulativeAmountRaw:B.optional(B.string()),transaction:B.optional(B.string()),additionalDeposit:B.optional(V()),additionalDepositRaw:B.optional(B.string()),depositRaw:B.optional(B.string())});function io(e={}){let{allowCustomEscrow:t=!1,decimals:n=6}=e,r=Xi({chain:N,getClient:e.getClient,rpcUrl:zn}),i=Ki({account:e.account}),a=e.maxDeposit===void 0?void 0:d(e.maxDeposit,n),o=new Map,s=new Map,c=new Map;function l(t){e.onChannelUpdate?.(t)}function u(e,t,n){return`${e.toLowerCase()}:${t.toLowerCase()}:${n.toLowerCase()}`}function f(n,r,i){if(i){let e=o.get(i);if(e)return Qa(n,r,e)}return Qa(n,r,e.escrowContract,t)}async function p(t,i,p){let m=t.request.methodDetails,h=m?.chainId??0,g=await r({chainId:h}),_=f(t,h),v=t.request.recipient,y=t.request.currency,b=BigInt(t.request.amount),x=t.request.suggestedDeposit,S=x?BigInt(x):void 0,C=(()=>{if(p?.depositRaw)return BigInt(p.depositRaw);if(e.deposit!==void 0)return d(e.deposit,n);if(S!==void 0&&a!==void 0)return S<a?S:a;if(a!==void 0)return a;if(S!==void 0)return S;throw Error("No deposit amount available. Set `deposit`, `maxDeposit`, or ensure the server challenge includes `suggestedDeposit`.")})(),w=e.voucherSigner??i,T=u(v,y,_),E=s.get(T);if(!E){let e=p?.channelId??m?.channelId;if(e){let t=await no(g,_,e,h);if(t){let e=p?.cumulativeAmountRaw?BigInt(p.cumulativeAmountRaw):p?.cumulativeAmount?d(p.cumulativeAmount,n):void 0;e!==void 0&&(t.cumulativeAmount=e),s.set(T,t),c.set(t.channelId,T),o.set(t.channelId,_),E=t,l(E)}else if(p?.channelId)throw Error(`Channel ${p.channelId} cannot be reused (closed or not found on-chain).`)}}E?.opened&&E.authorizedSigner.toLowerCase()!==Ra(w).toLowerCase()&&(E=void 0);let D;if(E?.opened)E.cumulativeAmount+=b,D=await eo(g,i,E.channelId,E.cumulativeAmount,_,h,w),l(E);else{let e=await to(g,i,{voucherSigner:w,escrowContract:_,payee:v,currency:y,deposit:C,initialAmount:b,chainId:h,feePayer:m?.feePayer});s.set(T,e.entry),c.set(e.entry.channelId,T),o.set(e.entry.channelId,_),D=e.payload,l(e.entry)}return $a(t,D,h,i)}async function m(t,i,a){let u=t.request.methodDetails?.chainId??0,p=await r({chainId:u}),m=a.action,{channelId:h,transaction:g}=a,_=e.voucherSigner??i,v=h,y=a.cumulativeAmountRaw?BigInt(a.cumulativeAmountRaw):a.cumulativeAmount?d(a.cumulativeAmount,n):void 0,b=a.additionalDepositRaw?BigInt(a.additionalDepositRaw):a.additionalDeposit?d(a.additionalDeposit,n):void 0,x=f(t,u,v);o.set(v,x);let S;switch(m){case`open`:{if(!g)throw Error(`transaction required for open action`);if(y===void 0)throw Error(`cumulativeAmount required for open action`);let e=await qa(p,i,{channelId:v,cumulativeAmount:y},x,u,_);S={action:`open`,type:`transaction`,channelId:v,transaction:g,authorizedSigner:Ra(_),cumulativeAmount:y.toString(),signature:e};break}case`topUp`:if(!g)throw Error(`transaction required for topUp action`);if(b===void 0)throw Error(`additionalDeposit required for topUp action`);S={action:`topUp`,type:`transaction`,channelId:v,transaction:g,additionalDeposit:b.toString()};break;case`voucher`:{if(y===void 0)throw Error(`cumulativeAmount required for voucher action`);S=await eo(p,i,v,y,x,u,_);let e=c.get(v);if(e){let t=s.get(e);t&&(t.cumulativeAmount=t.cumulativeAmount>y?t.cumulativeAmount:y,l(t))}break}case`close`:{if(y===void 0)throw Error(`cumulativeAmount required for close action`);let e=await qa(p,i,{channelId:v,cumulativeAmount:y},x,u,_);S={action:`close`,channelId:v,cumulativeAmount:y.toString(),signature:e};let t=c.get(v);if(t){let e=s.get(t);e&&(e.opened=!1,e.cumulativeAmount=e.cumulativeAmount>y?e.cumulativeAmount:y,l(e))}break}}return $a(t,S,u,i)}return kt(Ma,{canHandleChallenge({challenge:e}){let t=Ke(e.request.methodDetails,We.sessionProtocol);return t===void 0||t===Ge.v1},context:ro,async createCredential({challenge:t,context:n}){let o=t.request.methodDetails?.chainId??0,s=await r({chainId:o}),c=i(s,n);if(!n?.action&&(e.deposit!==void 0||a!==void 0))return p(t,c,n);if(n?.action)return m(t,c,n);throw Error("No `action` in context and no `deposit` or `maxDeposit` configured. Either provide context with action/channelId/cumulativeAmount, or configure `deposit`/`maxDeposit` for auto-management.")}})}const ao=(1n<<96n)-1n;function oo(e){return e>=0n&&e<=ao}function so(e){if(!/^\d{1,29}$/.test(e))return;let t=BigInt(e);return oo(t)?t:void 0}function co(e){return lo(e),e}function lo(e){if(!oo(e))throw Error(`Value ${e} is outside uint96 bounds.`)}const uo=new Set([`open`,`topUp`,`voucher`,`close`]);function fo(e){return typeof e==`object`&&!!e}function po(e){return typeof e==`string`&&uo.has(e)}function mo(e){if(typeof e!=`object`||!e)return!1;let t=e;return!(typeof t.channelId!=`string`||t.action!==void 0&&!po(t.action))}function ho(e,t=`No session credential context available.`){if(!mo(e))throw Error(t);return e}function go(e){let t=e.request.amount;if(typeof t!=`string`)throw Error(`Session challenge is missing amount.`);return BigInt(t)}function _o(e){return fo(e)?typeof e.channelId==`string`&&typeof e.requiredCumulative==`string`&&typeof e.acceptedCumulative==`string`&&typeof e.deposit==`string`:!1}function vo(e){return fo(e)?e.method===`tempo`&&e.intent===`session`&&e.status===`success`&&typeof e.timestamp==`string`&&typeof e.reference==`string`&&typeof e.challengeId==`string`&&typeof e.channelId==`string`&&typeof e.acceptedCumulative==`string`&&typeof e.spent==`string`&&(e.units===void 0||typeof e.units==`number`)&&(e.txHash===void 0||typeof e.txHash==`string`):!1}function yo(e){let t=x.toString(e),n=JSON.parse(t);if(!vo(n))throw Error(`Invalid session receipt.`);return n}function bo(e){return e.headers.get(`content-type`)?.toLowerCase().startsWith(`text/event-stream`)??!1}function xo(e){let t=`message`,n=[];for(let r of e.split(`
|
|
3
3
|
`))r.startsWith(`event: `)?t=r.slice(7).trim():r.startsWith(`data: `)?n.push(r.slice(6)):r===`data:`&&n.push(``);if(n.length===0)return null;let r=n.join(`
|
|
4
|
-
`);switch(t){case`message`:return{type:`message`,data:r};case`payment-need-voucher`:{let e=
|
|
4
|
+
`);switch(t){case`message`:return{type:`message`,data:r};case`payment-need-voucher`:{let e=So(r);return _o(e)?{type:`payment-need-voucher`,data:e}:null}case`payment-receipt`:{let e=So(r);return vo(e)?{type:`payment-receipt`,data:e}:null}default:return{type:`message`,data:r}}}function So(e){try{return JSON.parse(e)}catch{return null}}function Co(e){return JSON.stringify({mpp:`authorization`,authorization:e})}function wo(){return JSON.stringify({mpp:`payment-close-request`})}function To(e){let t=Eo(e);return t?t.mpp===`authorization`&&typeof t.authorization==`string`?{mpp:`authorization`,authorization:t.authorization}:t.mpp===`message`&&typeof t.data==`string`?{mpp:`message`,data:t.data}:t.mpp===`payment-close-request`?{mpp:`payment-close-request`}:t.mpp===`payment-close-ready`&&vo(t.data)?{mpp:`payment-close-ready`,data:t.data}:t.mpp===`payment-error`&&typeof t.status==`number`&&typeof t.message==`string`?{mpp:`payment-error`,status:t.status,message:t.message}:t.mpp===`payment-need-voucher`&&_o(t.data)?{mpp:`payment-need-voucher`,data:t.data}:t.mpp===`payment-receipt`&&vo(t.data)?{mpp:`payment-receipt`,data:t.data}:null:null}function Eo(e){try{let t=JSON.parse(e);return typeof t!=`object`||!t?null:t}catch{return null}}const Do=`0x4d50500000000000000000000000000000000000`,Oo={CONNECTING:0,OPEN:1,CLOSING:2,CLOSED:3};function ko(e){let t=e.allowCustomEscrow??!1,n=e.fetch??globalThis.fetch,r=e.webSocket??globalThis.WebSocket,i=e.maxDeposit===void 0?null:d(e.maxDeposit,e.decimals??6),a=null,o=null,s=null,c=0n,l=0n,u=null,f=null,p=null,m=null,h=null,g=null,_=null,v=0n,y=0n,b=io({account:e.account,allowCustomEscrow:t,voucherSigner:e.voucherSigner,getClient:e.client?()=>e.client:e.getClient,escrowContract:e.escrowContract,decimals:e.decimals,maxDeposit:e.maxDeposit,onChannelUpdate(e){e.channelId!==a?.channelId&&(c=0n,l=0n),a=e}}),x=fi({fetch:n,methods:[b],onChallenge:async(e,t)=>{o=e},orderChallenges:e.orderChallenges});function S(e){if(!e||e.channelId!==a?.channelId)return;C(e);let t=BigInt(e.acceptedCumulative),n=BigInt(e.spent);c=c>t?c:t,l=l>n?l:n}function C(e){if(!a||e.channelId!==a.channelId)return;let t=BigInt(e.acceptedCumulative),n=BigInt(e.spent);if(n>t)throw Error(`receipt spent exceeds accepted cumulative voucher amount`);if(t>a.cumulativeAmount)throw Error(`receipt accepted cumulative exceeds local voucher state`);if(n>a.cumulativeAmount)throw Error(`receipt spent exceeds local voucher state`);j(t),j(n)}function w(e=()=>!0){if(_)throw Error(`receipt wait already in progress`);return new Promise((t,n)=>{_={predicate:e,resolve:t,reject:n}})}function T(){if(m)return Promise.resolve(m);if(h)throw Error(`close-ready wait already in progress`);return new Promise((e,t)=>{h={resolve:e,reject:t}})}function E(e){if(!_||!_.predicate(e))return;let t=_;_=null,t.resolve(e)}function D(e){if(m=e,!h)return;let t=h;h=null,t.resolve(e)}function O(e){if(!_)return;let t=_;_=null,t.reject(e)}function k(e){if(!h)return;let t=h;h=null,t.reject(e)}function A(e,t){if(m&&m.challengeId===e.id&&m.channelId===t)return m.spent;let n=a?.channelId===t?a.cumulativeAmount:0n;if(y>0n){let e=v*y,t=l>e?l:e;return(t>n?n:t).toString()}return(l>c?l:c).toString()}function j(e){if(i!==null&&!(e<=i))throw Error(`requested voucher amount ${e} exceeds local maxDeposit ${i}`)}function M(e){let t=e.headers.get(R.paymentReceipt),n=t?yo(t):null;return S(n),Object.assign(e,{receipt:n,challenge:o,channelId:a?.channelId??null,cumulative:a?.cumulativeAmount??0n})}async function N(e,t){return s=e,M(await x(e,t))}function ee(e){let t=new Map,n=!1,r=[],i=e.readyState,a=(e,n,i)=>{let a=t.get(e);if(a||(a=new Set,t.set(e,a)),a.add({once:typeof i==`object`&&i.once===!0,value:n}),e===`message`&&r){let e=r;r=null;for(let t of e)s(`message`,t)}},o=(e,n)=>{let r=t.get(e);if(r)for(let e of r)e.value===n&&r.delete(e)},s=(e,a)=>{if(e===`close`){if(n)return;n=!0,i=Oo.CLOSED,r=null}if(e===`open`&&(i=Oo.OPEN),e===`message`&&r){r.push(a);return}let o=`on${e}`,s=c[o];typeof s==`function`&&s(a);let l=t.get(e);if(l)for(let e of Array.from(l))typeof e.value==`function`?e.value(a):e.value.handleEvent(a),e.once&&l.delete(e)},c={addEventListener:a,close(t,n){e.close(t,n)},get bufferedAmount(){return e.bufferedAmount},get extensions(){return e.extensions},on(e,t){a(e,t)},onclose:null,onerror:null,_onmessage:null,get onmessage(){return c._onmessage},set onmessage(e){if(c._onmessage=e,e&&r){let e=r;r=null;for(let t of e)s(`message`,t)}},onopen:null,off(e,t){o(e,t)},get protocol(){return e.protocol},get readyState(){return i},removeEventListener:o,send(t){e.send(t)},get url(){return e.url}};return{emit:s,socket:c}}return{get channelId(){return a?.channelId},get cumulative(){return a?.cumulativeAmount??0n},get opened(){return a?.opened??!1},async open(e){if(a?.opened)return;if(!o)throw Error(`No challenge available. Make a request first to receive a 402 challenge, or pass a challenge via .fetch()/.sse().`);let t=e?.deposit,r=await b.createCredential({challenge:o,context:{...t!==void 0&&{depositRaw:t.toString()}}});if(!s)throw Error(`No URL available — call fetch() or sse() before open().`);let i=await n(s,{method:`POST`,headers:{[R.authorization]:r}});if(!i.ok){let e=await i.text().catch(()=>``),t=i.headers.get(R.wwwAuthenticate)??``;throw Error(`Open request failed with status ${i.status}${e?`: ${e}`:``}${t?` [${R.wwwAuthenticate}: ${t}]`:``}`)}},fetch:N,async sse(e,t){let{onReceipt:r,signal:i,...s}=t??{},c=await N(e,{...s,headers:{...Q(s.headers),Accept:`text/event-stream`},...i?{signal:i}:{}}),l=o;if(!c.body)throw Error(`Response has no body.`);let u=c.body.getReader(),d=new TextDecoder;async function*f(){let t=``;try{for(;!i?.aborted;){let{done:i,value:o}=await u.read();if(i)break;t+=d.decode(o,{stream:!0});let s=t.split(`
|
|
5
5
|
|
|
6
|
-
`);t=s.pop();for(let t of s){if(!t.trim())continue;let i=bo(t);if(i)switch(i.type){case`message`:yield i.data;break;case`payment-need-voucher`:{if(!a||!l)break;let t=BigInt(i.data.requiredCumulative);j(t),a.cumulativeAmount=a.cumulativeAmount>t?a.cumulativeAmount:t;let r=await b.createCredential({challenge:l,context:{action:`voucher`,channelId:a.channelId,cumulativeAmountRaw:a.cumulativeAmount.toString()}}),o=await n(e,{method:`POST`,headers:{Accept:`text/event-stream`,[L.authorization]:r}});if(!o.ok)throw Error(`Voucher POST failed with status ${o.status}`);break}case`payment-receipt`:S(i.data),r?.(i.data)}}}}finally{u.releaseLock()}}return f()},async ws(t,i){if(!r)throw Error("No WebSocket implementation available. Pass `webSocket` to sessionManager() in this runtime.");let{onReceipt:c,protocols:l,signal:d}=i??{},h=new URL(t.toString()),_=new URL(h.toString());_.protocol===`ws:`&&(_.protocol=`http:`),_.protocol===`wss:`&&(_.protocol=`https:`),s=_.toString();let x=await n(_,d?{signal:d}:void 0);if(x.status!==402)throw Error(`Expected a 402 payment challenge from ${_}, received ${x.status} instead.`);let C=(await ko(Cr(ft(x),[b],br([b]).entries),i?.orderChallenges??e.orderChallenges))[0]?.challenge;if(!C)throw Error(`No payment challenge received from HTTP endpoint for this WebSocket URL. The server may not require payment or did not advertise a challenge.`);o=C;let T=await b.createCredential({challenge:C,context:{}});m=null,u=C,v=0n,y=BigInt(C.request.amount);let A=xt(T);f=A.payload.channelId;let M=new r(h,l);p=M;let N=ee(M),te=e=>{O(Error(e)),k(Error(e)),(M.readyState===Do.CONNECTING||M.readyState===Do.OPEN)&&M.close(3008,e)},ne=e=>e.challengeId===C.id&&e.channelId===f,P=new Promise((e,t)=>{let n=()=>{M.removeEventListener(`error`,r),N.emit(`open`,{type:`open`}),e()},r=()=>{M.removeEventListener(`open`,n),t(Error(`WebSocket connection to ${h} failed to open.`))};M.addEventListener(`open`,n,{once:!0}),M.addEventListener(`error`,r,{once:!0})});return M.addEventListener(`close`,e=>{p===M&&(p=null),u===C&&(u=null),f===A.payload.channelId&&(f=null),g=null,O(Error(`WebSocket closed before the payment flow completed.`)),k(Error(`WebSocket closed before the payment flow completed.`)),N.emit(`close`,{code:e.code??1e3,reason:e.reason??``,type:`close`,wasClean:!0})}),M.addEventListener(`error`,()=>{N.emit(`error`,{type:`error`})}),M.addEventListener(`message`,async e=>{let t=typeof e.data==`string`?e.data:void 0;if(!t)return;let n=wo(t);if(!n){N.emit(`message`,{data:t,type:`message`});return}switch(n.mpp){case`authorization`:break;case`message`:v+=1n,N.emit(`message`,{data:n.data,type:`message`});break;case`payment-close-ready`:if(!ne(n.data)){te(`received mismatched payment-close-ready frame`);break}if(BigInt(n.data.spent)>(a?.cumulativeAmount??0n)){te(`received payment-close-ready beyond local voucher state`);break}S(n.data),c?.(n.data),D(n.data),N.emit(`close`,{code:1e3,reason:`stream complete`,type:`close`});break;case`payment-error`:O(Error(n.message)),k(Error(n.message));break;case`payment-need-voucher`:{if(n.data.channelId!==f){te(`received mismatched payment-need-voucher frame`);break}let e=BigInt(n.data.requiredCumulative);try{j(e)}catch(e){te(e instanceof Error?e.message:`requested voucher amount exceeds local maxDeposit`);break}let t=(a?.cumulativeAmount??0n)>e?a?.cumulativeAmount??0n:e;a?.channelId===f&&(a.cumulativeAmount=t);let r=await b.createCredential({challenge:C,context:{action:`voucher`,channelId:f,cumulativeAmountRaw:t.toString()}});M.send(So(r));break}case`payment-receipt`:if(!ne(n.data)){te(`received mismatched payment-receipt frame`);break}if(g!==null&&n.data.txHash&&(n.data.acceptedCumulative!==g||n.data.spent!==g)){te(`received mismatched payment-close receipt frame`);break}S(n.data),c?.(n.data),E(n.data)}}),d&&d.addEventListener(`abort`,()=>{O(Error(`WebSocket payment flow aborted.`)),k(Error(`WebSocket payment flow aborted.`)),M.close()},{once:!0}),await P,M.send(So(T)),await w(),N.socket},async close(){let e=u??o,t=f??a?.channelId;if(!a?.opened)return;if(!e)throw Error(`Cannot close session: no challenge available. This usually means close() was called on a SessionManager instance that was recreated after the session was opened. Use the same SessionManager instance that opened the session, or make a request first to receive a fresh 402 challenge.`);if(!t)throw Error(`Cannot close session: no channel ID available. The session may not have been fully opened.`);if(p?.readyState===Do.OPEN){let n=m??await(async()=>(p.send(Co()),T()))(),r=BigInt(n.spent);if(r>(a.cumulativeAmount>l?a.cumulativeAmount:l))throw Error(`close-ready spent exceeds local voucher state`);let i=await b.createCredential({challenge:e,context:{action:`close`,channelId:t,cumulativeAmountRaw:r.toString()}}),o=r.toString();g=o;try{let n=w(n=>!!n.txHash&&n.challengeId===e.id&&n.channelId===t&&n.acceptedCumulative===o&&n.spent===o);p.send(So(i));let r=await n;return p.close(),m=null,r}finally{g=null}}let r=await b.createCredential({challenge:e,context:{action:`close`,channelId:t,cumulativeAmountRaw:(()=>{let n=BigInt(A(e,t));if(n>a.cumulativeAmount)throw Error(`fallback close amount exceeds local voucher state`);return j(n),n.toString()})()}});if(!s)throw Error(`Cannot close session: no URL available. This usually means close() was called on a SessionManager instance that was recreated after the session was opened. Use the same SessionManager instance that opened the session, or call fetch()/sse() before close().`);let i=await n(s,{method:`POST`,headers:{[L.authorization]:r}});if(!i.ok){let e=await i.text().catch(()=>``),t=(()=>{if(!e)return``;if(!i.headers.get(`Content-Type`)?.includes(`application/problem+json`))return e;try{return JSON.parse(e).detail??e}catch{return e}})(),n=i.headers.get(L.wwwAuthenticate)??``;throw Error(`Close request failed with status ${i.status}${t?`: ${t}`:``}${n?` [${L.wwwAuthenticate}: ${n}]`:``}`)}let c=i.headers.get(L.paymentReceipt);return c?vo(c):void 0}}}async function ko(e,t){let n=t;return n?n(e):e}function Ao(e){return BigInt(e.authorizedSigner)===0n?e.payer:e.authorizedSigner}function jo(e){let t=b.encode(b.from([`address payer`,`address payee`,`address operator`,`address token`,`bytes32 salt`,`address authorizedSigner`,`bytes32 expiringNonceHash`,`address escrow`,`uint256 chainId`]),[e.payer,e.payee,e.operator,e.token,e.salt,e.authorizedSigner,e.expiringNonceHash,e.escrow??`0x4d50500000000000000000000000000000000000`,BigInt(e.chainId)]);return C.keccak256(t)}function Mo(e){return fe.encodeForSigning(e)}function No(e){let{feePayer:t,transaction:n}=e;return t?{...n,feePayerSignature:null}:n}function Po(e,t){return C.keccak256(w.concat(Mo(e),t.sender))}const Fo=[{name:`payer`,type:`address`},{name:`payee`,type:`address`},{name:`operator`,type:`address`},{name:`token`,type:`address`},{name:`salt`,type:`bytes32`},{name:`authorizedSigner`,type:`address`},{name:`expiringNonceHash`,type:`bytes32`}],Io=[{name:`settled`,type:`uint96`},{name:`deposit`,type:`uint96`},{name:`closeRequestedAt`,type:`uint32`}],Lo={name:`descriptor`,type:`tuple`,components:Fo},Ro=[{type:`function`,name:`CLOSE_GRACE_PERIOD`,stateMutability:`view`,inputs:[],outputs:[{type:`uint64`}]},{type:`function`,name:`VOUCHER_TYPEHASH`,stateMutability:`view`,inputs:[],outputs:[{type:`bytes32`}]},{type:`function`,name:`open`,stateMutability:`nonpayable`,inputs:[{name:`payee`,type:`address`},{name:`operator`,type:`address`},{name:`token`,type:`address`},{name:`deposit`,type:`uint96`},{name:`salt`,type:`bytes32`},{name:`authorizedSigner`,type:`address`}],outputs:[{name:`channelId`,type:`bytes32`}]},{type:`function`,name:`settle`,stateMutability:`nonpayable`,inputs:[Lo,{name:`cumulativeAmount`,type:`uint96`},{name:`signature`,type:`bytes`}],outputs:[]},{type:`function`,name:`topUp`,stateMutability:`nonpayable`,inputs:[Lo,{name:`additionalDeposit`,type:`uint96`}],outputs:[]},{type:`function`,name:`close`,stateMutability:`nonpayable`,inputs:[Lo,{name:`cumulativeAmount`,type:`uint96`},{name:`captureAmount`,type:`uint96`},{name:`signature`,type:`bytes`}],outputs:[]},{type:`function`,name:`requestClose`,stateMutability:`nonpayable`,inputs:[Lo],outputs:[]},{type:`function`,name:`withdraw`,stateMutability:`nonpayable`,inputs:[Lo],outputs:[]},{type:`function`,name:`getChannel`,stateMutability:`view`,inputs:[Lo],outputs:[{type:`tuple`,components:[{name:`descriptor`,type:`tuple`,components:Fo},{name:`state`,type:`tuple`,components:Io}]}]},{type:`function`,name:`getChannelState`,stateMutability:`view`,inputs:[{name:`channelId`,type:`bytes32`}],outputs:[{type:`tuple`,components:Io}]},{type:`function`,name:`getChannelStatesBatch`,stateMutability:`view`,inputs:[{name:`channelIds`,type:`bytes32[]`}],outputs:[{type:`tuple[]`,components:Io}]},{type:`function`,name:`computeChannelId`,stateMutability:`view`,inputs:[{name:`payer`,type:`address`},{name:`payee`,type:`address`},{name:`operator`,type:`address`},{name:`token`,type:`address`},{name:`salt`,type:`bytes32`},{name:`authorizedSigner`,type:`address`},{name:`expiringNonceHash`,type:`bytes32`}],outputs:[{type:`bytes32`}]},{type:`function`,name:`getVoucherDigest`,stateMutability:`view`,inputs:[{name:`channelId`,type:`bytes32`},{name:`cumulativeAmount`,type:`uint96`}],outputs:[{type:`bytes32`}]},{type:`function`,name:`domainSeparator`,stateMutability:`view`,inputs:[],outputs:[{type:`bytes32`}]},{type:`event`,name:`ChannelOpened`,inputs:[{name:`channelId`,type:`bytes32`,indexed:!0},{name:`payer`,type:`address`,indexed:!0},{name:`payee`,type:`address`,indexed:!0},{name:`operator`,type:`address`},{name:`token`,type:`address`},{name:`authorizedSigner`,type:`address`},{name:`salt`,type:`bytes32`},{name:`expiringNonceHash`,type:`bytes32`},{name:`deposit`,type:`uint96`}]},{type:`event`,name:`Settled`,inputs:[{name:`channelId`,type:`bytes32`,indexed:!0},{name:`payer`,type:`address`,indexed:!0},{name:`payee`,type:`address`,indexed:!0},{name:`cumulativeAmount`,type:`uint96`},{name:`deltaPaid`,type:`uint96`},{name:`newSettled`,type:`uint96`}]},{type:`event`,name:`TopUp`,inputs:[{name:`channelId`,type:`bytes32`,indexed:!0},{name:`payer`,type:`address`,indexed:!0},{name:`payee`,type:`address`,indexed:!0},{name:`additionalDeposit`,type:`uint96`},{name:`newDeposit`,type:`uint96`}]},{type:`event`,name:`CloseRequested`,inputs:[{name:`channelId`,type:`bytes32`,indexed:!0},{name:`payer`,type:`address`,indexed:!0},{name:`payee`,type:`address`,indexed:!0},{name:`closeGraceEnd`,type:`uint256`}]},{type:`event`,name:`ChannelClosed`,inputs:[{name:`channelId`,type:`bytes32`,indexed:!0},{name:`payer`,type:`address`,indexed:!0},{name:`payee`,type:`address`,indexed:!0},{name:`settledToPayee`,type:`uint96`},{name:`refundedToPayer`,type:`uint96`}]},{type:`event`,name:`CloseRequestCancelled`,inputs:[{name:`channelId`,type:`bytes32`,indexed:!0},{name:`payer`,type:`address`,indexed:!0},{name:`payee`,type:`address`,indexed:!0}]}];function zo(e,t){return{name:`TIP20 Channel Reserve`,version:`1`,chainId:t,verifyingContract:e}}const Bo={Voucher:[{name:`channelId`,type:`bytes32`},{name:`cumulativeAmount`,type:`uint96`}]};function Vo(e,t){return ue.getVoucherSignPayload({chainId:e,channelId:t.channelId,cumulativeAmount:t.cumulativeAmount})}function Ho(e,t,n){return e.toLowerCase()===ue.address.toLowerCase()?Vo(t,n):s({domain:zo(e,t),types:Bo,primaryType:`Voucher`,message:{channelId:n.channelId,cumulativeAmount:n.cumulativeAmount}})}function Uo(e){return e===`secp256k1`||e===`p256`||e===`webAuthn`}function Wo(e,t){return ne.signVoucher(e,{chainId:t.chainId,channel:t.channelId,cumulativeAmount:t.cumulativeAmount})}async function Go(e,t,n,r,i){let a=await(async()=>{if(r.toLowerCase()===ue.address.toLowerCase())try{return await Wo(t,{chainId:i,channelId:n.channelId,cumulativeAmount:n.cumulativeAmount})}catch{}return _(e,{account:t,domain:zo(r,i),types:Bo,primaryType:`Voucher`,message:n})})(),o=I.from(a);if(!Uo(o.type))throw Error(`TIP-1034 vouchers require a TIP-1020 primitive signature; received "${o.type}".`);return I.serialize(o)}function Ko(e,t,n,r){try{let i=I.from(n.signature);if(!Uo(i.type)||I.serialize(i).toLowerCase()!==n.signature.toLowerCase())return!1;let a=Ho(e,t,n),o=I.extractAddress({payload:a,signature:i});return I.verify(i,{address:o,payload:a})&&na(o,r)}catch{return!1}}function qo(e){return typeof e==`object`&&!!e}function Jo(e){return typeof e==`string`&&l(e,{strict:!1})?e:void 0}function Yo(e){return Jo(e.accessKeyAddress)}function Xo(){let e=BigInt(Math.floor(Date.now()/1e3))-60n;return e<=0n?0:Number(BigInt(w.random(8))%e)}function Zo(e){return Yo(e)??e.address}async function Qo(e,t){let{account:n,calls:r,feePayer:i,feeToken:a,validAfter:o}=t;return f(e,{account:n,calls:r,nonceKey:`expiring`,...i?{feePayer:!0}:{},feeToken:a,...o===void 0?{}:{validAfter:o}})}async function $o(e,t){return await g(e,t)}function es(e,t,n=!1){let r=e.request.methodDetails,i=qo(r)?Jo(r.escrowContract)??Jo(r.escrow):void 0,a=t??`0x4d50500000000000000000000000000000000000`;if(i&&!ns(i,a)&&(!n||t!==void 0))throw Error(`Tempo session escrow ${i} does not match client escrow ${a}.`);return i&&!ns(i,a)?i:a}function ts(e,t,n,r){return G({challenge:e,payload:t,source:`did:pkh:eip155:${n}:${r.address}`})}function ns(e,t){return e.toLowerCase()===t.toLowerCase()}async function rs(e,t,n,r,i,a=Eo){let o=jo({...n,chainId:i,escrow:a}),s=so(r),c=await Go(e,t,{channelId:o,cumulativeAmount:s},a,i);return{action:`voucher`,channelId:o,descriptor:n,cumulativeAmount:s.toString(),signature:c}}async function is(e,t,n,r,i,a=Eo){let o=await rs(e,t,n,r,i,a);return{action:`close`,channelId:o.channelId,descriptor:n,cumulativeAmount:o.cumulativeAmount,signature:o.signature}}async function as(e,t,n){let i=Zo(t),a=n.escrow??`0x4d50500000000000000000000000000000000000`,o=n.operator??`0x0000000000000000000000000000000000000000`,s=w.random(32),c=so(n.deposit),l=so(n.initialAmount),u=r({abi:Ro,functionName:`open`,args:[n.payee,o,n.token,c,s,i]}),d=await $o(e,await Qo(e,{account:t,calls:[...n.prefixCalls??[],{to:a,data:u}],feePayer:n.feePayer,feeToken:n.feeToken??n.token})),f=ae.deserialize(d),p={authorizedSigner:i,expiringNonceHash:Po(No({...n.feePayer?{feePayer:!0}:{},transaction:f}),{sender:t.address}),operator:o,payee:n.payee,payer:t.address,salt:s,token:n.token},m=jo({...p,chainId:n.chainId,escrow:a});return{action:`open`,type:`transaction`,channelId:m,transaction:d,signature:await Go(e,t,{channelId:m,cumulativeAmount:l},a,n.chainId),descriptor:p,cumulativeAmount:l.toString(),authorizedSigner:p.authorizedSigner}}async function os(e,t,n,i,a,o,s=Eo,c=[],l=n.token){let u=jo({...n,chainId:a,escrow:s}),d=so(i);return{action:`topUp`,type:`transaction`,channelId:u,transaction:await $o(e,await Qo(e,{account:t,calls:[...c,{to:s,data:r({abi:Ro,functionName:`topUp`,args:[n,d]})}],feePayer:o,feeToken:l,validAfter:Xo()})),descriptor:n,additionalDeposit:d.toString()}}function ss(e){let{payee:t,token:n,escrow:r,chainId:i}=e;return`${t.toLowerCase()}:${n.toLowerCase()}:${r.toLowerCase()}:${i}`}function cs(e){return ss({payee:e.descriptor.payee,token:e.descriptor.token,escrow:e.escrow,chainId:e.chainId})}function ls(){let e=new Map;return{get:t=>e.get(t),set(t){e.set(cs(t),t)},delete(t){e.delete(t)}}}const us=2n**96n-1n;function ds(e){if(e<0n||e>us)throw new K({reason:`amount exceeds uint96 range`})}async function fs(e,t,n=Eo,r){return ps(await p(e,{address:n,abi:Ro,functionName:`getChannelState`,args:[t],...r===void 0?{}:{blockNumber:r}}))}function ps(e){return ds(e.settled),ds(e.deposit),{settled:e.settled,deposit:e.deposit,closeRequestedAt:e.closeRequestedAt}}const ms=z.custom(e=>typeof e==`string`&&l(e,{strict:!1})),hs=z.custom(e=>typeof e==`string`&&/^0x[0-9a-fA-F]{64}$/.test(e)),gs=z.custom(e=>typeof e==`string`&&/^0x[0-9a-fA-F]+$/.test(e)),_s=z.object({authorizedSigner:ms,expiringNonceHash:hs,operator:ms,payee:ms,payer:ms,salt:hs,token:ms}),vs=jt(z.object({acceptedCumulative:z.string(),chainId:z.number(),channelId:hs,closeRequestedAt:z.optional(z.string()),deposit:z.string(),descriptor:_s,escrow:ms,highestVoucher:z.optional(z.object({channelId:hs,cumulativeAmount:z.string(),signature:gs})),requiredCumulative:z.string(),settled:z.string(),spent:z.string(),units:z.optional(z.number())}));function ys(e){return vs.encode(e)}function bs(e){return vs.decode(e)}const xs={status:`idle`};function Ss(e){return{status:`active`,...e}}function Cs(e,t){switch(t.type){case`challengeReceived`:return e.status===`closing`||e.status===`closed`?Q(e,t):{state:{status:`challenged`,challengeId:t.challengeId},effects:[]};case`challenge`:return e.status!==`idle`&&e.status!==`active`?Q(e,t):t.snapshot?{state:{status:`hydrating`,challengeId:t.challengeId,snapshot:t.snapshot},effects:[{type:`hydrate`,snapshot:t.snapshot}]}:{state:{status:`opening`,challengeId:t.challengeId},effects:[{type:`open`}]};case`hydrated`:return e.status===`hydrating`?{state:Es(e.challengeId,t.snapshot),effects:[]}:Q(e,t);case`activated`:return e.status===`closing`||e.status===`closed`?Q(e,t):{state:zs({challengeId:t.challengeId,entry:t.entry,spent:t.spent,units:t.units??0}),effects:[]};case`opened`:return e.status===`opening`?{state:Ds(e.challengeId,t.receipt,t.descriptor,t.deposit),effects:[]}:Q(e,t);case`receiptAccepted`:return e.status===`closing`||e.status===`closed`?Q(e,t):{state:Hs(t.receipt,t.entry),effects:[]};case`needVoucher`:return e.status===`active`?Ts({challengeId:e.challengeId,descriptor:t.descriptor,event:t.event}):Q(e,t);case`topUpStarted`:return e.status===`voucherNeeded`?{state:{status:`toppingUp`,challengeId:e.challengeId,channelId:e.channelId,descriptor:e.descriptor,deposit:e.deposit},effects:[]}:Q(e,t);case`voucherAccepted`:return e.status!==`voucherNeeded`&&e.status!==`toppingUp`?Q(e,t):{state:Ds(e.challengeId,t.receipt,e.descriptor,t.deposit??e.deposit),effects:[]};case`settleStarted`:return e.status===`active`?{state:{status:`settling`,channelId:e.channelId,descriptor:e.descriptor,deposit:e.deposit},effects:[{type:`settle`,channelId:e.channelId}]}:Q(e,t);case`settled`:return e.status===`settling`?{state:Ds(t.receipt.challengeId,t.receipt,e.descriptor,t.deposit??e.deposit),effects:[]}:Q(e,t);case`closeRequested`:return e.status===`active`?{state:{status:`closeRequested`,channelId:e.channelId,descriptor:e.descriptor},effects:[{type:`requestClose`,channelId:e.channelId}]}:Q(e,t);case`withdrawable`:return e.status===`closeRequested`?{state:{status:`withdrawable`,channelId:e.channelId,descriptor:e.descriptor},effects:[{type:`withdraw`,channelId:e.channelId}]}:Q(e,t);case`closeStarted`:return e.status!==`active`&&e.status!==`withdrawable`&&e.status!==`closeRequested`?Q(e,t):{state:{status:`closing`,channelId:e.channelId,descriptor:e.descriptor},effects:[{type:`close`,channelId:e.channelId}]};case`closed`:return e.status!==`closing`&&e.status!==`withdrawable`?Q(e,t):{state:{status:`closed`,channelId:e.channelId,descriptor:e.descriptor},effects:[]}}}function ws(e,t){let n=Cs(e.state,t);return e.state=n.state,n}function Ts(e){let{challengeId:t,descriptor:n,event:r}=e,i=BigInt(r.requiredCumulative),a=BigInt(r.deposit);return i>a?{state:{status:`toppingUp`,challengeId:t,channelId:r.channelId,descriptor:n,deposit:r.deposit},effects:[{type:`topUp`,channelId:r.channelId,amount:(i-a).toString()}]}:{state:{status:`voucherNeeded`,challengeId:t,channelId:r.channelId,descriptor:n,requiredCumulative:r.requiredCumulative,deposit:r.deposit},effects:[{type:`voucher`}]}}function Es(e,t){return Ss({challengeId:e,channelId:t.channelId,descriptor:t.descriptor,acceptedCumulative:t.acceptedCumulative,deposit:t.deposit,spent:t.spent,units:t.units??0})}function Ds(e,t,n,r){return Ss({challengeId:e,channelId:t.channelId,descriptor:n,acceptedCumulative:t.acceptedCumulative,deposit:r,spent:t.spent,units:t.units??0})}function Q(e,t){throw Error(`Invalid session transition: ${e.status} + ${t.type}`)}function Os(e){let{cumulativeAmount:t,maxVoucherCumulative:n}=e;if(n!==null&&!(t<=n))throw Error(`requested voucher amount ${t} exceeds local maxDeposit ${n}`)}function ks(e){let{channel:t,maxVoucherCumulative:n,receipt:r}=e;if(!t||r.channelId!==t.channelId)return;let i=BigInt(r.acceptedCumulative),a=BigInt(r.spent);if(a>i)throw Error(`receipt spent exceeds accepted cumulative voucher amount`);if(i>t.cumulativeAmount)throw Error(`receipt accepted cumulative exceeds local voucher state`);if(a>t.cumulativeAmount)throw Error(`receipt spent exceeds local voucher state`);Os({cumulativeAmount:i,maxVoucherCumulative:n}),Os({cumulativeAmount:a,maxVoucherCumulative:n})}function As(e){let{channel:t,maxVoucherCumulative:n,receipt:r,spent:i}=e;if(!r||r.channelId!==t?.channelId)return i;ks({channel:t,maxVoucherCumulative:n,receipt:r});let a=BigInt(r.spent);return i>a?i:a}function js(e,t){return typeof e==`bigint`?e:d(e,t)}function Ms(e){let{contextDepositRaw:t,maxDeposit:n,requestAmount:r,suggestedDepositRaw:i}=e;if(Ps(r,n),t!==void 0){let e=BigInt(t);if(e<r)throw Error(`opening deposit ${e} below request amount ${r}`);return e}let a=i===void 0?void 0:BigInt(i),o=a!==void 0&&a>r?a:r;return n===void 0||o<n?o:n}function Ns(e){let{deposit:t,maxDeposit:n,requiredCumulative:r,suggestedDeposit:i,topUpAmount:a}=e;if(r<=t)return 0n;Os({cumulativeAmount:r,maxVoucherCumulative:n??null});let o=r-t,s=a??i??o,c=s>o?s:o;if(n==null)return c;let l=n-t;return c<l?c:l}function Ps(e,t){Os({cumulativeAmount:e,maxVoucherCumulative:t??null})}function Fs(e){let{channel:t,currentSocket:n,lastChallenge:r}=e;if(!t?.opened)return;let i=n?.challenge??r,a=n?.channelId??t.channelId;if(!i)throw Error(`Cannot close session: no challenge available. This usually means close() was called on a SessionManager instance that was recreated after the session was opened. Use the same SessionManager instance that opened the session, or make a request first to receive a fresh 402 challenge.`);if(!a)throw Error(`Cannot close session: no channel ID available. The session may not have been fully opened.`);return{challenge:i,channel:t,channelId:a}}function Is(e){let{cumulativeAmount:t,spent:n}=e;return t>n?t:n}function Ls(e){let{cumulativeAmount:t,readySpent:n,spent:r}=e;if(!ao(n))throw Error(`close-ready spent is not a uint96 amount`);if(n<r)throw Error(`close-ready spent is below locally confirmed spend`);if(n>Is({cumulativeAmount:t,spent:r}))throw Error(`close-ready spent exceeds local voucher state`)}function Rs(e){let{challengeId:t,channelId:n,expectedCloseAmount:r,minimumSpent:i=0n,receipt:a}=e,o=oo(r),s=oo(a.spent);return o===void 0||s===void 0||!ao(i)?!1:!!a.txHash&&a.challengeId===t&&a.channelId===n&&a.acceptedCumulative===r&&s>=i&&s<=o}function zs(e){return Ss({challengeId:e.challengeId,channelId:e.entry.channelId,descriptor:e.entry.descriptor,acceptedCumulative:e.entry.cumulativeAmount.toString(),deposit:e.entry.deposit.toString(),spent:e.spent,units:e.units})}function Bs(){return{channel:null,lastChallenge:null,lastUrl:null,spent:0n,socketSession:null,state:xs}}function Vs(e){let{maxVoucherCumulative:t,receipt:n,runtime:r}=e;r.spent=As({channel:r.channel,maxVoucherCumulative:t,receipt:n,spent:r.spent}),n&&r.channel?.channelId===n.channelId&&ws(r,{type:`receiptAccepted`,receipt:n,entry:r.channel})}function Hs(e,t){return Ss({challengeId:e.challengeId,channelId:e.channelId,descriptor:t.descriptor,acceptedCumulative:e.acceptedCumulative,deposit:t.deposit.toString(),spent:e.spent,units:e.units??0})}function Us(e){let{challengeId:t,channelId:n,closeReadyReceipt:r,cumulativeAmount:i,deliveredChunks:a=0n,socketChallengeId:o,socketChannelId:s,spent:c,tickCost:l=0n}=e;if(c>i)throw Error(`locally confirmed spend exceeds local voucher state`);if(r&&r.challengeId===t&&r.channelId===n){let e=oo(r.spent);if(e===void 0)throw Error(`close-ready spent is not a uint96 amount`);return e>c?e:c}if(o===t&&s===n&&l>0n){let e=a*l,t=c>e?c:e;return t>i?i:t}return i}function Ws(e){let{channel:t,channelId:n,challengeId:r,cumulativeAmount:i,spent:a,state:o}=e;if(!(!t||t.channelId!==n)&&(t.cumulativeAmount=i,r))return Cs(o,{type:`activated`,challengeId:r,entry:t,spent:a.toString(),units:o.status===`active`?o.units:0}).state}function Gs(e){return{channel:e.channel===null?null:{entry:e.channel,cumulativeAmount:e.channel.cumulativeAmount,deposit:e.channel.deposit,opened:e.channel.opened},spent:e.spent,state:e.state}}function Ks(e,t){return e.channel?(e.channel.entry.cumulativeAmount=e.channel.cumulativeAmount,e.channel.entry.deposit=e.channel.deposit,e.channel.entry.opened=e.channel.opened,{channel:e.channel.entry,spent:e.spent,state:e.state}):(t&&(t.opened=!1),{channel:null,spent:e.spent,state:e.state})}async function qs(e){let{activeSocket:t,currentSocket:n,target:r}=e,i=n.closeReadyReceipt??await(async()=>(t.send(Co()),e.waitForCloseReady()))(),a=BigInt(i.spent);Ls({cumulativeAmount:r.channel.cumulativeAmount,readySpent:a,spent:e.spent});let o=await e.createSessionCredential(r.challenge,{action:`close`,channelId:r.channelId,descriptor:r.channel.descriptor,cumulativeAmountRaw:a.toString()}),s=a.toString();n.expectedCloseAmount=s;try{let i=e.waitForReceipt(e=>Rs({challengeId:r.challenge.id,channelId:r.channelId,expectedCloseAmount:s,minimumSpent:a,receipt:e}));t.send(So(o));let c=await i;return t.close(),n.closeReadyReceipt=null,c}finally{n.expectedCloseAmount=null}}function Js(e){return`cumulativeAmount`in e}function Ys(e){if(Js(e))return BigInt(e.cumulativeAmount)}async function Xs(e,t){t.opened?await e.store.set(t):await e.store.delete(cs(t)),e.notifyUpdate(t)}async function Zs(e,t,n){let r=Ys(n);if(r===void 0)return;let i=await e.store.get(t);i&&i.channelId.toLowerCase()===n.channelId.toLowerCase()&&(i.cumulativeAmount=i.cumulativeAmount>r?i.cumulativeAmount:r,n.action===`close`&&(i.opened=!1),await Xs(e,i))}const Qs=z.custom(e=>typeof e==`string`&&/^0x[0-9a-fA-F]*$/.test(e)),$s=z.custom(e=>typeof e==`string`&&/^0x[0-9a-fA-F]{64}$/.test(e)),ec=z.object({account:z.optional(z.custom()),autoSwap:z.optional(z.custom()),action:z.optional(z.enum([`open`,`topUp`,`voucher`,`close`])),channelId:z.optional($s),cumulativeAmount:z.optional(B()),cumulativeAmountRaw:z.optional(z.string()),transaction:z.optional(Qs),descriptor:z.optional(z.custom()),additionalDeposit:z.optional(B()),additionalDepositRaw:z.optional(z.string()),depositRaw:z.optional(z.string())});function tc(e){return e?.action!==void 0}function nc(e){return tc(e)&&e.descriptor!==void 0}function rc(e,t,n){let r=n===`additionalDeposit`?e.additionalDepositRaw:e.cumulativeAmountRaw,i=n===`additionalDeposit`?e.additionalDeposit:e.cumulativeAmount;if(r)return BigInt(r);if(i)return d(i,t)}function ic(e,t,n,r){let i=rc(e,t,n);if(i===void 0)throw Error(`${n} required for ${r} action`);return i}function ac(e){return typeof e==`object`&&!!e}function oc(e){return typeof e==`string`&&l(e,{strict:!1})?e:void 0}function sc(e){let t=e.request.methodDetails;return ac(t)?{chainId:typeof t.chainId==`number`?t.chainId:void 0,escrowContract:oc(t.escrowContract),escrow:oc(t.escrow),feePayer:typeof t.feePayer==`boolean`?t.feePayer:void 0,feeToken:oc(t.feeToken),operator:oc(t.operator),sessionSnapshot:qe(t,Ge.sessionSnapshot)}:{}}function cc(e,t){if(typeof e==`string`&&l(e,{strict:!1}))return e;throw Error(`tempo session challenge missing ${t}`)}function lc(e){if(typeof e==`string`)return BigInt(e);throw Error(`tempo session challenge missing amount`)}function uc(e){return typeof e==`string`?e:void 0}async function dc(e){let{allowCustomEscrow:t,challenge:n,escrowOverride:r,getClient:i}=e,a=sc(n),o=await i({chainId:a.chainId}),s=a.chainId??o.chain?.id;if(!s)throw Error(`No chainId configured for TIP-1034 session challenge.`);let c=es(n,r,t),l=cc(n.request.recipient,`recipient`),u=cc(n.request.currency,`currency`);return{amount:lc(n.request.amount),challenge:n,chainId:s,client:o,escrow:c,feePayer:a.feePayer,feeToken:a.feeToken,key:ss({payee:l,token:u,escrow:c,chainId:s}),operator:a.operator,payee:l,snapshot:a.sessionSnapshot,suggestedDepositRaw:uc(n.request.suggestedDeposit),token:u}}async function fc(e){let{channelId:t,client:n,descriptor:r,expected:i,readChannelState:a=fs}=e,o=jo({...r,chainId:i.chainId,escrow:i.escrow});pc({channelId:t,descriptor:r,expectedChannelId:o,payee:i.payee,payer:i.payer,authorizedSigner:i.authorizedSigner,token:i.token});let s=await a(n,o,i.escrow);if(s.deposit===0n)throw Error(`Channel ${o} cannot be reused (closed or not found on-chain).`);if(s.closeRequestedAt!==0)throw Error(`Channel ${o} cannot be reused (pending close request).`);return{channelId:o,state:s}}function pc(e){let{authorizedSigner:t,channelId:n,descriptor:r,expectedChannelId:i,payee:a,payer:o,token:s}=e;if(n&&n.toLowerCase()!==i.toLowerCase())throw Error(`context channelId does not match descriptor`);if(!ns(r.payee,a))throw Error(`context descriptor payee does not match challenge`);if(!ns(r.token,s))throw Error(`context descriptor token does not match challenge`);if(!ns(r.payer,o))throw Error(`context descriptor payer does not match account`);if(!ns(Ao(r),t))throw Error(`context descriptor authorizedSigner does not match account`)}function mc(e){let{context:t,snapshot:n}=e,r=t?.descriptor??n?.descriptor;if(r)return{...t,channelId:t?.channelId??n?.channelId,descriptor:r}}function hc(e){let{context:t,decimals:n,requestAmount:r,snapshot:i,settled:a}=e;if(i)return[BigInt(i.acceptedCumulative),BigInt(i.requiredCumulative),BigInt(i.spent)+r,a].reduce((e,t)=>t>e?t:e,0n);let o=rc(t,n,`cumulativeAmount`);return o===void 0?a+r:o+r}async function gc(e){let{account:t,client:n,readChannelState:r,snapshot:i}=e,a=i.highestVoucher;if(!a)throw Error(`session snapshot is missing its highest signed voucher`);if(a.channelId.toLowerCase()!==i.channelId.toLowerCase())throw Error(`session snapshot voucher channelId does not match snapshot channelId`);let o=BigInt(i.acceptedCumulative),s=BigInt(a.cumulativeAmount),c=BigInt(i.requiredCumulative),l=BigInt(i.deposit),u=BigInt(i.settled),d=BigInt(i.spent);if(s!==o)throw Error(`session snapshot voucher amount does not match acceptedCumulative`);if(d>o)throw Error(`session snapshot spent exceeds acceptedCumulative`);if(u>l)throw Error(`session snapshot settled amount exceeds deposit`);if(!Ko(i.escrow,i.chainId,{channelId:a.channelId,cumulativeAmount:s,signature:a.signature},Ao(i.descriptor)))throw Error(`session snapshot highest voucher signature is invalid`);let f=await fc({channelId:i.channelId,client:n,descriptor:i.descriptor,expected:{chainId:i.chainId,escrow:i.escrow,payee:i.descriptor.payee,payer:t.address,authorizedSigner:Zo(t),token:i.descriptor.token},readChannelState:r}),p=[o,c,f.state.settled].reduce((e,t)=>t>e?t:e,0n);if(p>f.state.deposit)throw Error(`recovered session cumulative amount exceeds on-chain channel deposit`);return{entry:{channelId:f.channelId,cumulativeAmount:p,deposit:f.state.deposit,descriptor:i.descriptor,escrow:i.escrow,chainId:i.chainId,opened:!0},spent:d}}function _c(e,t){return ns(e.address,t.payer)?ns(Zo(e),Ao(t)):!1}function vc(e){let{account:t,entry:n,context:r,decimals:i,maxDeposit:a,resolved:o}=e;if(tc(r)){if(!nc(r))throw Error(`descriptor required for TIP-1034 session action`);return{type:`manual`,account:t,context:r,decimals:i,resolved:o}}if(!n&&r?.channelId&&!r.descriptor)throw Error(`descriptor required to reuse TIP-1034 channel`);let s=mc({context:r,snapshot:o.snapshot});return!n&&s&&_c(t,s.descriptor)?{type:`recover`,account:t,context:s,decimals:i,maxDeposit:a,resolved:o}:n?.opened&&_c(t,n.descriptor)?{type:`voucher`,account:t,entry:n,maxDeposit:a,resolved:o}:{type:`open`,account:t,context:r,maxDeposit:a,resolved:o}}async function yc(e,t,n=!1){switch(e.type){case`open`:return xc(e,t,n);case`recover`:return Sc(e,t);case`voucher`:return Cc(e,t);case`manual`:return wc(e,t,n)}}async function bc(e,t){if(e)return await ia(t.client,{account:t.account,amountOut:t.amountOut,tokenOut:t.tokenOut,tokenIn:e.tokenIn,slippage:e.slippage})}async function xc(e,t,n){let{account:r,resolved:i}=e,a=Ms({contextDepositRaw:e.context?.depositRaw,maxDeposit:e.maxDeposit,requestAmount:i.amount,suggestedDepositRaw:i.suggestedDepositRaw}),o=await as(i.client,r,{chainId:i.chainId,deposit:a,escrow:i.escrow,feePayer:i.feePayer,feeToken:i.feeToken,initialAmount:i.amount,operator:i.operator,payee:i.payee,prefixCalls:await bc(n,{account:r.address,amountOut:a,client:i.client,tokenOut:i.token}),token:i.token});return await Xs(t,{channelId:o.channelId,cumulativeAmount:i.amount,deposit:a,descriptor:o.descriptor,escrow:i.escrow,chainId:i.chainId,opened:!0}),o}async function Sc(e,t){let{account:n,context:r,decimals:i,maxDeposit:a,resolved:o}=e,{descriptor:s}=r,c=await fc({channelId:r.channelId,client:o.client,descriptor:s,expected:{chainId:o.chainId,escrow:o.escrow,payee:o.payee,payer:n.address,authorizedSigner:Zo(n),token:o.token}}),l=hc({context:r,decimals:i,requestAmount:o.amount,settled:c.state.settled,snapshot:o.snapshot});if(l>c.state.deposit)throw Error(`recovered voucher amount exceeds on-chain channel deposit`);Ps(l,a);let u=await rs(o.client,n,s,l,o.chainId,o.escrow);return await Xs(t,{channelId:c.channelId,cumulativeAmount:l,deposit:c.state.deposit,descriptor:s,escrow:o.escrow,chainId:o.chainId,opened:!0}),u}async function Cc(e,t){let{account:n,entry:r,resolved:i}=e,a=r.cumulativeAmount+i.amount;Ps(a,e.maxDeposit);let o=await rs(i.client,n,r.descriptor,a,i.chainId,i.escrow);return r.cumulativeAmount=a,await Xs(t,r),o}async function wc(e,t,n){let{account:r,context:i,decimals:a,resolved:o}=e,{descriptor:s}=i,c=jo({...s,chainId:o.chainId,escrow:o.escrow});pc({channelId:i.channelId,descriptor:s,expectedChannelId:c,payee:o.payee,payer:r.address,authorizedSigner:Zo(r),token:o.token});let l=await Tc({account:r,channelId:c,context:i,decimals:a,descriptor:s,resolved:o},n);return await Zs(t,o.key,l),l}async function Tc(e,t){switch(e.context.action){case`open`:return Ec(e);case`topUp`:return Dc(e,t);case`voucher`:return Oc(e);case`close`:return kc(e)}}async function Ec(e){let{account:t,channelId:n,context:r,decimals:i,descriptor:a,resolved:o}=e;if(!r.transaction)throw Error(`transaction required for open action`);let s=ic(r,i,`cumulativeAmount`,`open`),c=await rs(o.client,t,a,s,o.chainId,o.escrow);return{action:`open`,type:`transaction`,channelId:n,transaction:r.transaction,signature:c.signature,descriptor:a,cumulativeAmount:s.toString(),authorizedSigner:a.authorizedSigner}}async function Dc(e,t){let{account:n,channelId:r,context:i,decimals:a,descriptor:o,resolved:s}=e,c=ic(i,a,`additionalDeposit`,`topUp`);return i.transaction?{action:`topUp`,type:`transaction`,channelId:r,transaction:i.transaction,descriptor:o,additionalDeposit:c.toString()}:os(s.client,n,o,c,s.chainId,s.feePayer,s.escrow,await bc(t,{account:n.address,amountOut:c,client:s.client,tokenOut:s.token}),s.feeToken)}function Oc(e){let{account:t,context:n,decimals:r,descriptor:i,resolved:a}=e;return rs(a.client,t,i,ic(n,r,`cumulativeAmount`,`voucher`),a.chainId,a.escrow)}function kc(e){let{account:t,context:n,decimals:r,descriptor:i,resolved:a}=e;return is(a.client,t,i,ic(n,r,`cumulativeAmount`,`close`),a.chainId,a.escrow)}const Ac={CONNECTING:0,OPEN:1,CLOSING:2,CLOSED:3};function jc(e){let t=new Map,n=!1,r=[],i=e.readyState,a=(e,n,i)=>{let a=t.get(e);if(a||(a=new Set,t.set(e,a)),a.add({once:typeof i==`object`&&i.once===!0,value:n}),e===`message`&&r){let e=r;r=null;for(let t of e)s(`message`,t)}},o=(e,n)=>{let r=t.get(e);if(r)for(let e of r)e.value===n&&r.delete(e)};function s(e,a){if(a.type===`close`){if(n)return;n=!0,i=Ac.CLOSED,r=null}if(a.type===`open`&&(i=Ac.OPEN),a.type===`message`&&r){r.push(a);return}switch(a.type){case`close`:l.onclose?.(a);break;case`error`:l.onerror?.(a);break;case`message`:l.onmessage?.(a);break;case`open`:l.onopen?.(a)}let o=t.get(e);if(o)for(let e of Array.from(o))typeof e.value==`function`?e.value(a):e.value.handleEvent(a),e.once&&o.delete(e)}let c=null,l={addEventListener:a,close(t,n){e.close(t,n)},get bufferedAmount(){return e.bufferedAmount},get extensions(){return e.extensions},on(e,t){a(e,t)},onclose:null,onerror:null,get onmessage(){return c},set onmessage(e){if(c=e,e&&r){let e=r;r=null;for(let t of e)s(`message`,t)}},onopen:null,off(e,t){o(e,t)},get protocol(){return e.protocol},get readyState(){return i},removeEventListener:o,send(t){e.send(t)},get url(){return e.url}};return{emit:s,socket:l}}function Mc(e){return{acceptedCumulative:BigInt(e.acceptedCumulative),deposit:BigInt(e.deposit),requiredCumulative:BigInt(e.requiredCumulative)}}function Nc(e){let{amount:t,assertVoucherWithinLocalLimit:n,channel:r,decimals:i,lastChallenge:a,lastUrl:o}=e;if(!r?.opened)throw Error(`Cannot top up session: no open channel.`);if(!a)throw Error(`Cannot top up session: no challenge available. Make a request first.`);if(!o)throw Error(`Cannot top up session: no URL available. Call fetch(), sse(), or ws() first.`);let s=js(t,i);if(s<=0n)throw Error(`Top-up amount must be greater than zero.`);return n(r.cumulativeAmount+s),{additionalDeposit:s,challenge:a,channelId:r.channelId,input:o}}function Pc(e){let{additionalDeposit:t,channel:n,channelId:r,challengeId:i,currentState:a,knownDeposit:o,receipt:s,spent:c}=e;if(n?.channelId!==r)return;let l=o!==void 0&&o>n.deposit?o:n.deposit,u={...n,deposit:l+t};return s?{channel:u,state:Hs(s,u)}:i?{channel:u,state:zs({challengeId:i,entry:u,spent:c.toString(),units:a.status===`active`?a.units:0})}:{channel:u}}async function Fc(e){if(e.event.channelId!==e.expectedChannelId)return{status:`ignored`,reason:`channel-mismatch`};let t=Mc(e.event);e.assertVoucherWithinLocalLimit(t.requiredCumulative),await e.topUpIfNeeded({challenge:e.challenge,input:e.input,channelId:e.expectedChannelId,deposit:t.deposit,requiredCumulative:t.requiredCumulative});let n=e.getChannel();if(!n||n.channelId!==e.expectedChannelId)return{status:`ignored`,reason:`missing-channel`};let r=n.cumulativeAmount>t.requiredCumulative?n.cumulativeAmount:so(t.requiredCumulative);return{status:`ready`,context:{action:`voucher`,channelId:e.expectedChannelId,descriptor:n.descriptor,cumulativeAmountRaw:r.toString()}}}function Ic(e){return e.method===Ue.tempo&&e.intent===We.session}function Lc(e){return Ic(e)&&qe(e.request.methodDetails,Ge.sessionProtocol)===Ke.v2}function Rc(e){return qe(e.request.methodDetails,Ge.sessionSnapshot)}function zc(e,t,n){let r=e instanceof Request?e.headers:void 0;return{...t,headers:{...Z(r),...Z(t?.headers),[L.authorization]:n}}}function Bc(e){try{let t=typeof location>`u`?void 0:location.href,n=e instanceof Request?new URL(e.url):e instanceof URL?new URL(e):new URL(String(e),t);return n.hash=``,n}catch{return e}}function Vc(e){let t=new URL(e.toString());return t.protocol===`ws:`&&(t.protocol=`http:`),t.protocol===`wss:`&&(t.protocol=`https:`),t}async function Hc(e){let t=await e.text().catch(()=>``);if(!t)return``;if(!e.headers.get(`Content-Type`)?.includes(`application/problem+json`))return t;try{return JSON.parse(t).detail??t}catch{return t}}async function Uc(e){let{channel:t,channelId:n}=e;if(!t?.descriptor||t.channelId!==n)throw Error(`Cannot top up session: no local channel descriptor available.`);let r=await Wc({challenge:e.challenge,context:{action:`topUp`,channelId:n,descriptor:t.descriptor,additionalDepositRaw:e.additionalDeposit.toString()},createSessionCredential:e.createSessionCredential,fetch:e.fetch,input:e.input});if(!r.ok)throw Error(`Top-up POST failed with status ${r.status}`);let i=r.headers.get(L.paymentReceipt);return i?vo(i):void 0}async function Wc(e){let t=async t=>e.fetch(Bc(e.input),{method:`POST`,headers:{[L.authorization]:await e.createSessionCredential(t,e.context)}}),n=await t(e.challenge);if(n.status!==402)return n;let r=ft(n).find(Lc);return r?t(r):n}async function Gc(e){let t=Kc({channel:e.getChannel(),response:e.response});if(!t)return;let{channel:n,challenge:r,snapshot:i}=t;e.setChallenge(r);let a=BigInt(i.requiredCumulative),o=n.cumulativeAmount;await e.topUpIfNeeded({challenge:r,input:e.input,channelId:i.channelId,deposit:BigInt(i.deposit),requiredCumulative:a});let s=e.getChannel();if(!s?.descriptor||s.channelId!==i.channelId)return;let c=s.cumulativeAmount>a?s.cumulativeAmount:a,l=()=>e.restoreCumulative(i.channelId,o),u;try{let t=await e.createSessionCredential(r,{action:`voucher`,channelId:i.channelId,descriptor:s.descriptor,cumulativeAmountRaw:c.toString()});u=await e.fetch(e.input,zc(e.input,e.init,t))}catch(e){throw await l(),e}return!u.ok&&!u.headers.get(L.paymentReceipt)&&await l(),u}function Kc(e){let t=ft(e.response).find(Lc);if(!t)return;let n=Rc(t);if(!n)return;let{channel:r}=e;if(!(!r?.descriptor||r.channelId!==n.channelId))return{channel:r,challenge:t,snapshot:n}}async function qc(e){if(!e.lastUrl)throw Error(`Cannot close session: no URL available. This usually means close() was called on a SessionManager instance that was recreated after the session was opened. Use the same SessionManager instance that opened the session, or call fetch()/sse() before close().`);let t=e.target.challenge,n=e.signedCloseAmount,r=async(r,i=!1)=>{t=r,n=(i?e.resolveSignedCloseAmount?.(r):void 0)??e.signedCloseAmount;let a=await e.createSessionCredential(r,{action:`close`,channelId:e.target.channelId,descriptor:e.target.channel.descriptor,cumulativeAmountRaw:n});return e.fetch(e.lastUrl,{method:`POST`,headers:{[L.authorization]:a}})},i=await r(e.target.challenge);if(i.status===402){let t=ft(i).find(Lc);t&&(e.setChallenge?.(t),i=await r(t,!0))}if(!i.ok){let e=await Hc(i),t=i.headers.get(L.wwwAuthenticate)??``;throw Error(`Close request failed with status ${i.status}${e?`: ${e}`:``}${t?` [${L.wwwAuthenticate}: ${t}]`:``}`)}let a=i.headers.get(L.paymentReceipt);if(!a)return;let o=vo(a);if(!o.txHash||!w.validate(o.txHash,{strict:!0})||w.size(o.txHash)!==32||!Rs({challengeId:t.id,channelId:e.target.channelId,expectedCloseAmount:n,minimumSpent:e.getMinimumSpent?.()??0n,receipt:o}))throw Error(`Session close response included a mismatched payment receipt.`);return o}async function Jc(e,t,n){let{onReceipt:r,signal:i,...a}=t??{},o={...a,headers:{...Z(a.headers),Accept:`text/event-stream`},...i?{signal:i}:{}},s=await n.doFetch(e,o);return!yo(s)&&n.getChannel()?.opened&&(s=await n.doFetch(e,o)),Yc(e,s,{onReceipt:r,signal:i},n)}function Yc(e,t,n,r){if(!yo(t))throw Error(`SSE response is not an event stream.`);if(!t.body)throw Error(`Response has no body.`);let i=r.getChallenge();return Xc({onNeedVoucher:t=>tl({challenge:i,driver:r,input:e},t),onReceipt(e){r.acceptReceipt(e),n?.onReceipt?.(e)},response:t,signal:n?.signal})}async function*Xc(e){for await(let t of Zc(e))t.data!==void 0&&(yield t.data)}async function*Zc(e){if(!e.response.body)throw Error(`Response has no body.`);let t=e.response.body.getReader(),n=new TextDecoder,r=``,i=!1,a=()=>{t.cancel(e.signal?.reason).catch(()=>void 0)};e.signal?.addEventListener(`abort`,a,{once:!0}),e.signal?.aborted&&a();try{for(;!e.signal?.aborted;){let{done:a,value:o}=await t.read();for(a?(i=!0,r+=n.decode()):r+=n.decode(o,{stream:!0});;){let t=Qc(r,a);if(!t)break;let n=t.index+t.length,i=r.slice(0,t.index),o=r.slice(0,n);if(r=r.slice(n),!i.trim())continue;let s=bo(i.replace(/\r\n|\r/g,`
|
|
7
|
-
`));if(!s){yield{raw:o};continue}switch(s.type){case`message`:yield{data:s.data,raw:o};break;case`payment-need-voucher`:await e.onNeedVoucher(s.data);break;case`payment-receipt`:e.onReceipt(s.data)}}if(a)break}}finally{e.signal?.removeEventListener(`abort`,a),i||await t.cancel().catch(()=>void 0),t.releaseLock()}}function
|
|
6
|
+
`);t=s.pop();for(let t of s){if(!t.trim())continue;let i=xo(t);if(i)switch(i.type){case`message`:yield i.data;break;case`payment-need-voucher`:{if(!a||!l)break;let t=BigInt(i.data.requiredCumulative);j(t),a.cumulativeAmount=a.cumulativeAmount>t?a.cumulativeAmount:t;let r=await b.createCredential({challenge:l,context:{action:`voucher`,channelId:a.channelId,cumulativeAmountRaw:a.cumulativeAmount.toString()}}),o=await n(e,{method:`POST`,headers:{Accept:`text/event-stream`,[R.authorization]:r}});if(!o.ok)throw Error(`Voucher POST failed with status ${o.status}`);break}case`payment-receipt`:S(i.data),r?.(i.data)}}}}finally{u.releaseLock()}}return f()},async ws(t,i){if(!r)throw Error("No WebSocket implementation available. Pass `webSocket` to sessionManager() in this runtime.");let{onReceipt:c,protocols:l,signal:d}=i??{},h=new URL(t.toString()),_=new URL(h.toString());_.protocol===`ws:`&&(_.protocol=`http:`),_.protocol===`wss:`&&(_.protocol=`https:`),s=_.toString();let x=await n(_,d?{signal:d}:void 0);if(x.status!==402)throw Error(`Expected a 402 payment challenge from ${_}, received ${x.status} instead.`);let C=(await Ao(Sr(dt(x),[b],yr([b]).entries),i?.orderChallenges??e.orderChallenges))[0]?.challenge;if(!C)throw Error(`No payment challenge received from HTTP endpoint for this WebSocket URL. The server may not require payment or did not advertise a challenge.`);o=C;let T=await b.createCredential({challenge:C,context:{}});m=null,u=C,v=0n,y=BigInt(C.request.amount);let A=bt(T);f=A.payload.channelId;let M=new r(h,l);p=M;let N=ee(M),P=e=>{O(Error(e)),k(Error(e)),(M.readyState===Oo.CONNECTING||M.readyState===Oo.OPEN)&&M.close(3008,e)},te=e=>e.challengeId===C.id&&e.channelId===f,F=new Promise((e,t)=>{let n=()=>{M.removeEventListener(`error`,r),N.emit(`open`,{type:`open`}),e()},r=()=>{M.removeEventListener(`open`,n),t(Error(`WebSocket connection to ${h} failed to open.`))};M.addEventListener(`open`,n,{once:!0}),M.addEventListener(`error`,r,{once:!0})});return M.addEventListener(`close`,e=>{p===M&&(p=null),u===C&&(u=null),f===A.payload.channelId&&(f=null),g=null,O(Error(`WebSocket closed before the payment flow completed.`)),k(Error(`WebSocket closed before the payment flow completed.`)),N.emit(`close`,{code:e.code??1e3,reason:e.reason??``,type:`close`,wasClean:!0})}),M.addEventListener(`error`,()=>{N.emit(`error`,{type:`error`})}),M.addEventListener(`message`,async e=>{let t=typeof e.data==`string`?e.data:void 0;if(!t)return;let n=To(t);if(!n){N.emit(`message`,{data:t,type:`message`});return}switch(n.mpp){case`authorization`:break;case`message`:v+=1n,N.emit(`message`,{data:n.data,type:`message`});break;case`payment-close-ready`:if(!te(n.data)){P(`received mismatched payment-close-ready frame`);break}if(BigInt(n.data.spent)>(a?.cumulativeAmount??0n)){P(`received payment-close-ready beyond local voucher state`);break}S(n.data),c?.(n.data),D(n.data),N.emit(`close`,{code:1e3,reason:`stream complete`,type:`close`});break;case`payment-error`:O(Error(n.message)),k(Error(n.message));break;case`payment-need-voucher`:{if(n.data.channelId!==f){P(`received mismatched payment-need-voucher frame`);break}let e=BigInt(n.data.requiredCumulative);try{j(e)}catch(e){P(e instanceof Error?e.message:`requested voucher amount exceeds local maxDeposit`);break}let t=(a?.cumulativeAmount??0n)>e?a?.cumulativeAmount??0n:e;a?.channelId===f&&(a.cumulativeAmount=t);let r=await b.createCredential({challenge:C,context:{action:`voucher`,channelId:f,cumulativeAmountRaw:t.toString()}});M.send(Co(r));break}case`payment-receipt`:if(!te(n.data)){P(`received mismatched payment-receipt frame`);break}if(g!==null&&n.data.txHash&&(n.data.acceptedCumulative!==g||n.data.spent!==g)){P(`received mismatched payment-close receipt frame`);break}S(n.data),c?.(n.data),E(n.data)}}),d&&d.addEventListener(`abort`,()=>{O(Error(`WebSocket payment flow aborted.`)),k(Error(`WebSocket payment flow aborted.`)),M.close()},{once:!0}),await F,M.send(Co(T)),await w(),N.socket},async close(){let e=u??o,t=f??a?.channelId;if(!a?.opened)return;if(!e)throw Error(`Cannot close session: no challenge available. This usually means close() was called on a SessionManager instance that was recreated after the session was opened. Use the same SessionManager instance that opened the session, or make a request first to receive a fresh 402 challenge.`);if(!t)throw Error(`Cannot close session: no channel ID available. The session may not have been fully opened.`);if(p?.readyState===Oo.OPEN){let n=m??await(async()=>(p.send(wo()),T()))(),r=BigInt(n.spent);if(r>(a.cumulativeAmount>l?a.cumulativeAmount:l))throw Error(`close-ready spent exceeds local voucher state`);let i=await b.createCredential({challenge:e,context:{action:`close`,channelId:t,cumulativeAmountRaw:r.toString()}}),o=r.toString();g=o;try{let n=w(n=>!!n.txHash&&n.challengeId===e.id&&n.channelId===t&&n.acceptedCumulative===o&&n.spent===o);p.send(Co(i));let r=await n;return p.close(),m=null,r}finally{g=null}}let r=await b.createCredential({challenge:e,context:{action:`close`,channelId:t,cumulativeAmountRaw:(()=>{let n=BigInt(A(e,t));if(n>a.cumulativeAmount)throw Error(`fallback close amount exceeds local voucher state`);return j(n),n.toString()})()}});if(!s)throw Error(`Cannot close session: no URL available. This usually means close() was called on a SessionManager instance that was recreated after the session was opened. Use the same SessionManager instance that opened the session, or call fetch()/sse() before close().`);let i=await n(s,{method:`POST`,headers:{[R.authorization]:r}});if(!i.ok){let e=await i.text().catch(()=>``),t=(()=>{if(!e)return``;if(!i.headers.get(`Content-Type`)?.includes(`application/problem+json`))return e;try{return JSON.parse(e).detail??e}catch{return e}})(),n=i.headers.get(R.wwwAuthenticate)??``;throw Error(`Close request failed with status ${i.status}${t?`: ${t}`:``}${n?` [${R.wwwAuthenticate}: ${n}]`:``}`)}let c=i.headers.get(R.paymentReceipt);return c?yo(c):void 0}}}async function Ao(e,t){let n=t;return n?n(e):e}function jo(e){return BigInt(e.authorizedSigner)===0n?e.payer:e.authorizedSigner}function Mo(e){let t=b.encode(b.from([`address payer`,`address payee`,`address operator`,`address token`,`bytes32 salt`,`address authorizedSigner`,`bytes32 expiringNonceHash`,`address escrow`,`uint256 chainId`]),[e.payer,e.payee,e.operator,e.token,e.salt,e.authorizedSigner,e.expiringNonceHash,e.escrow??`0x4d50500000000000000000000000000000000000`,BigInt(e.chainId)]);return C.keccak256(t)}function No(e){return de.encodeForSigning(e)}function Po(e){let{feePayer:t,transaction:n}=e;return t?{...n,feePayerSignature:null}:n}function Fo(e,t){return C.keccak256(w.concat(No(e),t.sender))}const Io=[{name:`payer`,type:`address`},{name:`payee`,type:`address`},{name:`operator`,type:`address`},{name:`token`,type:`address`},{name:`salt`,type:`bytes32`},{name:`authorizedSigner`,type:`address`},{name:`expiringNonceHash`,type:`bytes32`}],Lo=[{name:`settled`,type:`uint96`},{name:`deposit`,type:`uint96`},{name:`closeRequestedAt`,type:`uint32`}],Ro={name:`descriptor`,type:`tuple`,components:Io},zo=[{type:`function`,name:`CLOSE_GRACE_PERIOD`,stateMutability:`view`,inputs:[],outputs:[{type:`uint64`}]},{type:`function`,name:`VOUCHER_TYPEHASH`,stateMutability:`view`,inputs:[],outputs:[{type:`bytes32`}]},{type:`function`,name:`open`,stateMutability:`nonpayable`,inputs:[{name:`payee`,type:`address`},{name:`operator`,type:`address`},{name:`token`,type:`address`},{name:`deposit`,type:`uint96`},{name:`salt`,type:`bytes32`},{name:`authorizedSigner`,type:`address`}],outputs:[{name:`channelId`,type:`bytes32`}]},{type:`function`,name:`settle`,stateMutability:`nonpayable`,inputs:[Ro,{name:`cumulativeAmount`,type:`uint96`},{name:`signature`,type:`bytes`}],outputs:[]},{type:`function`,name:`topUp`,stateMutability:`nonpayable`,inputs:[Ro,{name:`additionalDeposit`,type:`uint96`}],outputs:[]},{type:`function`,name:`close`,stateMutability:`nonpayable`,inputs:[Ro,{name:`cumulativeAmount`,type:`uint96`},{name:`captureAmount`,type:`uint96`},{name:`signature`,type:`bytes`}],outputs:[]},{type:`function`,name:`requestClose`,stateMutability:`nonpayable`,inputs:[Ro],outputs:[]},{type:`function`,name:`withdraw`,stateMutability:`nonpayable`,inputs:[Ro],outputs:[]},{type:`function`,name:`getChannel`,stateMutability:`view`,inputs:[Ro],outputs:[{type:`tuple`,components:[{name:`descriptor`,type:`tuple`,components:Io},{name:`state`,type:`tuple`,components:Lo}]}]},{type:`function`,name:`getChannelState`,stateMutability:`view`,inputs:[{name:`channelId`,type:`bytes32`}],outputs:[{type:`tuple`,components:Lo}]},{type:`function`,name:`getChannelStatesBatch`,stateMutability:`view`,inputs:[{name:`channelIds`,type:`bytes32[]`}],outputs:[{type:`tuple[]`,components:Lo}]},{type:`function`,name:`computeChannelId`,stateMutability:`view`,inputs:[{name:`payer`,type:`address`},{name:`payee`,type:`address`},{name:`operator`,type:`address`},{name:`token`,type:`address`},{name:`salt`,type:`bytes32`},{name:`authorizedSigner`,type:`address`},{name:`expiringNonceHash`,type:`bytes32`}],outputs:[{type:`bytes32`}]},{type:`function`,name:`getVoucherDigest`,stateMutability:`view`,inputs:[{name:`channelId`,type:`bytes32`},{name:`cumulativeAmount`,type:`uint96`}],outputs:[{type:`bytes32`}]},{type:`function`,name:`domainSeparator`,stateMutability:`view`,inputs:[],outputs:[{type:`bytes32`}]},{type:`event`,name:`ChannelOpened`,inputs:[{name:`channelId`,type:`bytes32`,indexed:!0},{name:`payer`,type:`address`,indexed:!0},{name:`payee`,type:`address`,indexed:!0},{name:`operator`,type:`address`},{name:`token`,type:`address`},{name:`authorizedSigner`,type:`address`},{name:`salt`,type:`bytes32`},{name:`expiringNonceHash`,type:`bytes32`},{name:`deposit`,type:`uint96`}]},{type:`event`,name:`Settled`,inputs:[{name:`channelId`,type:`bytes32`,indexed:!0},{name:`payer`,type:`address`,indexed:!0},{name:`payee`,type:`address`,indexed:!0},{name:`cumulativeAmount`,type:`uint96`},{name:`deltaPaid`,type:`uint96`},{name:`newSettled`,type:`uint96`}]},{type:`event`,name:`TopUp`,inputs:[{name:`channelId`,type:`bytes32`,indexed:!0},{name:`payer`,type:`address`,indexed:!0},{name:`payee`,type:`address`,indexed:!0},{name:`additionalDeposit`,type:`uint96`},{name:`newDeposit`,type:`uint96`}]},{type:`event`,name:`CloseRequested`,inputs:[{name:`channelId`,type:`bytes32`,indexed:!0},{name:`payer`,type:`address`,indexed:!0},{name:`payee`,type:`address`,indexed:!0},{name:`closeGraceEnd`,type:`uint256`}]},{type:`event`,name:`ChannelClosed`,inputs:[{name:`channelId`,type:`bytes32`,indexed:!0},{name:`payer`,type:`address`,indexed:!0},{name:`payee`,type:`address`,indexed:!0},{name:`settledToPayee`,type:`uint96`},{name:`refundedToPayer`,type:`uint96`}]},{type:`event`,name:`CloseRequestCancelled`,inputs:[{name:`channelId`,type:`bytes32`,indexed:!0},{name:`payer`,type:`address`,indexed:!0},{name:`payee`,type:`address`,indexed:!0}]}];function Bo(e,t){return{name:`TIP20 Channel Reserve`,version:`1`,chainId:t,verifyingContract:e}}const Vo={Voucher:[{name:`channelId`,type:`bytes32`},{name:`cumulativeAmount`,type:`uint96`}]};function Ho(e,t){return le.getVoucherSignPayload({chainId:e,channelId:t.channelId,cumulativeAmount:t.cumulativeAmount})}function Uo(e,t,n){return e.toLowerCase()===le.address.toLowerCase()?Ho(t,n):s({domain:Bo(e,t),types:Vo,primaryType:`Voucher`,message:{channelId:n.channelId,cumulativeAmount:n.cumulativeAmount}})}function Wo(e){return e===`secp256k1`||e===`p256`||e===`webAuthn`}function Go(e,t){return te.signVoucher(e,{chainId:t.chainId,channel:t.channelId,cumulativeAmount:t.cumulativeAmount})}async function Ko(e,t,n,r,i){let a=await(async()=>{if(r.toLowerCase()===le.address.toLowerCase())try{return await Go(t,{chainId:i,channelId:n.channelId,cumulativeAmount:n.cumulativeAmount})}catch{}return _(e,{account:t,domain:Bo(r,i),types:Vo,primaryType:`Voucher`,message:n})})(),o=L.from(a);if(!Wo(o.type))throw Error(`TIP-1034 vouchers require a TIP-1020 primitive signature; received "${o.type}".`);return L.serialize(o)}function qo(e,t,n,r){try{let i=L.from(n.signature);if(!Wo(i.type)||L.serialize(i).toLowerCase()!==n.signature.toLowerCase())return!1;let a=Uo(e,t,n),o=L.extractAddress({payload:a,signature:i});return L.verify(i,{address:o,payload:a})&&ra(o,r)}catch{return!1}}function Jo(e){return typeof e==`object`&&!!e}function Yo(e){return typeof e==`string`&&l(e,{strict:!1})?e:void 0}function Xo(e){return Yo(e.accessKeyAddress)}function Zo(){let e=BigInt(Math.floor(Date.now()/1e3))-60n;return e<=0n?0:Number(BigInt(w.random(8))%e)}function Qo(e){return Xo(e)??e.address}async function $o(e,t){let{account:n,calls:r,feePayer:i,feeToken:a,validAfter:o}=t;return f(e,{account:n,calls:r,nonceKey:`expiring`,...i?{feePayer:!0}:{},feeToken:a,...o===void 0?{}:{validAfter:o}})}async function es(e,t){return await g(e,t)}function ts(e,t,n=!1){let r=e.request.methodDetails,i=Jo(r)?Yo(r.escrowContract)??Yo(r.escrow):void 0,a=t??`0x4d50500000000000000000000000000000000000`;if(i&&!rs(i,a)&&(!n||t!==void 0))throw Error(`Tempo session escrow ${i} does not match client escrow ${a}.`);return i&&!rs(i,a)?i:a}function ns(e,t,n,r){return K({challenge:e,payload:t,source:`did:pkh:eip155:${n}:${r.address}`})}function rs(e,t){return e.toLowerCase()===t.toLowerCase()}async function is(e,t,n,r,i,a=Do){let o=Mo({...n,chainId:i,escrow:a}),s=co(r),c=await Ko(e,t,{channelId:o,cumulativeAmount:s},a,i);return{action:`voucher`,channelId:o,descriptor:n,cumulativeAmount:s.toString(),signature:c}}async function as(e,t,n,r,i,a=Do){let o=await is(e,t,n,r,i,a);return{action:`close`,channelId:o.channelId,descriptor:n,cumulativeAmount:o.cumulativeAmount,signature:o.signature}}async function os(e,t,n){let i=Qo(t),a=n.escrow??`0x4d50500000000000000000000000000000000000`,o=n.operator??`0x0000000000000000000000000000000000000000`,s=w.random(32),c=co(n.deposit),l=co(n.initialAmount),u=r({abi:zo,functionName:`open`,args:[n.payee,o,n.token,c,s,i]}),d=await es(e,await $o(e,{account:t,calls:[...n.prefixCalls??[],{to:a,data:u}],feePayer:n.feePayer,feeToken:n.feeToken??n.token})),f=ie.deserialize(d),p={authorizedSigner:i,expiringNonceHash:Fo(Po({...n.feePayer?{feePayer:!0}:{},transaction:f}),{sender:t.address}),operator:o,payee:n.payee,payer:t.address,salt:s,token:n.token},m=Mo({...p,chainId:n.chainId,escrow:a});return{action:`open`,type:`transaction`,channelId:m,transaction:d,signature:await Ko(e,t,{channelId:m,cumulativeAmount:l},a,n.chainId),descriptor:p,cumulativeAmount:l.toString(),authorizedSigner:p.authorizedSigner}}async function ss(e,t,n,i,a,o,s=Do,c=[],l=n.token){let u=Mo({...n,chainId:a,escrow:s}),d=co(i);return{action:`topUp`,type:`transaction`,channelId:u,transaction:await es(e,await $o(e,{account:t,calls:[...c,{to:s,data:r({abi:zo,functionName:`topUp`,args:[n,d]})}],feePayer:o,feeToken:l,validAfter:Zo()})),descriptor:n,additionalDeposit:d.toString()}}function cs(e){let{payee:t,token:n,escrow:r,chainId:i}=e;return`${t.toLowerCase()}:${n.toLowerCase()}:${r.toLowerCase()}:${i}`}function ls(e){return cs({payee:e.descriptor.payee,token:e.descriptor.token,escrow:e.escrow,chainId:e.chainId})}function us(){let e=new Map;return{get:t=>e.get(t),set(t){e.set(ls(t),t)},delete(t){e.delete(t)}}}const ds=2n**96n-1n;function fs(e){if(e<0n||e>ds)throw new q({reason:`amount exceeds uint96 range`})}async function ps(e,t,n=Do,r){return ms(await p(e,{address:n,abi:zo,functionName:`getChannelState`,args:[t],...r===void 0?{}:{blockNumber:r}}))}function ms(e){return fs(e.settled),fs(e.deposit),{settled:e.settled,deposit:e.deposit,closeRequestedAt:e.closeRequestedAt}}const hs=B.custom(e=>typeof e==`string`&&l(e,{strict:!1})),gs=B.custom(e=>typeof e==`string`&&/^0x[0-9a-fA-F]{64}$/.test(e)),_s=B.custom(e=>typeof e==`string`&&/^0x[0-9a-fA-F]+$/.test(e)),vs=B.object({authorizedSigner:hs,expiringNonceHash:gs,operator:hs,payee:hs,payer:hs,salt:gs,token:hs}),ys=At(B.object({acceptedCumulative:B.string(),chainId:B.number(),channelId:gs,closeRequestedAt:B.optional(B.string()),deposit:B.string(),descriptor:vs,escrow:hs,highestVoucher:B.optional(B.object({channelId:gs,cumulativeAmount:B.string(),signature:_s})),requiredCumulative:B.string(),settled:B.string(),spent:B.string(),units:B.optional(B.number())}));function bs(e){return ys.encode(e)}function xs(e){return ys.decode(e)}const Ss={status:`idle`};function Cs(e){return{status:`active`,...e}}function ws(e,t){switch(t.type){case`challengeReceived`:return e.status===`closing`||e.status===`closed`?$(e,t):{state:{status:`challenged`,challengeId:t.challengeId},effects:[]};case`challenge`:return e.status!==`idle`&&e.status!==`active`?$(e,t):t.snapshot?{state:{status:`hydrating`,challengeId:t.challengeId,snapshot:t.snapshot},effects:[{type:`hydrate`,snapshot:t.snapshot}]}:{state:{status:`opening`,challengeId:t.challengeId},effects:[{type:`open`}]};case`hydrated`:return e.status===`hydrating`?{state:Ds(e.challengeId,t.snapshot),effects:[]}:$(e,t);case`activated`:return e.status===`closing`||e.status===`closed`?$(e,t):{state:Bs({challengeId:t.challengeId,entry:t.entry,spent:t.spent,units:t.units??0}),effects:[]};case`opened`:return e.status===`opening`?{state:Os(e.challengeId,t.receipt,t.descriptor,t.deposit),effects:[]}:$(e,t);case`receiptAccepted`:return e.status===`closing`||e.status===`closed`?$(e,t):{state:Us(t.receipt,t.entry),effects:[]};case`needVoucher`:return e.status===`active`?Es({challengeId:e.challengeId,descriptor:t.descriptor,event:t.event}):$(e,t);case`topUpStarted`:return e.status===`voucherNeeded`?{state:{status:`toppingUp`,challengeId:e.challengeId,channelId:e.channelId,descriptor:e.descriptor,deposit:e.deposit},effects:[]}:$(e,t);case`voucherAccepted`:return e.status!==`voucherNeeded`&&e.status!==`toppingUp`?$(e,t):{state:Os(e.challengeId,t.receipt,e.descriptor,t.deposit??e.deposit),effects:[]};case`settleStarted`:return e.status===`active`?{state:{status:`settling`,channelId:e.channelId,descriptor:e.descriptor,deposit:e.deposit},effects:[{type:`settle`,channelId:e.channelId}]}:$(e,t);case`settled`:return e.status===`settling`?{state:Os(t.receipt.challengeId,t.receipt,e.descriptor,t.deposit??e.deposit),effects:[]}:$(e,t);case`closeRequested`:return e.status===`active`?{state:{status:`closeRequested`,channelId:e.channelId,descriptor:e.descriptor},effects:[{type:`requestClose`,channelId:e.channelId}]}:$(e,t);case`withdrawable`:return e.status===`closeRequested`?{state:{status:`withdrawable`,channelId:e.channelId,descriptor:e.descriptor},effects:[{type:`withdraw`,channelId:e.channelId}]}:$(e,t);case`closeStarted`:return e.status!==`active`&&e.status!==`withdrawable`&&e.status!==`closeRequested`?$(e,t):{state:{status:`closing`,channelId:e.channelId,descriptor:e.descriptor},effects:[{type:`close`,channelId:e.channelId}]};case`closed`:return e.status!==`closing`&&e.status!==`withdrawable`?$(e,t):{state:{status:`closed`,channelId:e.channelId,descriptor:e.descriptor},effects:[]}}}function Ts(e,t){let n=ws(e.state,t);return e.state=n.state,n}function Es(e){let{challengeId:t,descriptor:n,event:r}=e,i=BigInt(r.requiredCumulative),a=BigInt(r.deposit);return i>a?{state:{status:`toppingUp`,challengeId:t,channelId:r.channelId,descriptor:n,deposit:r.deposit},effects:[{type:`topUp`,channelId:r.channelId,amount:(i-a).toString()}]}:{state:{status:`voucherNeeded`,challengeId:t,channelId:r.channelId,descriptor:n,requiredCumulative:r.requiredCumulative,deposit:r.deposit},effects:[{type:`voucher`}]}}function Ds(e,t){return Cs({challengeId:e,channelId:t.channelId,descriptor:t.descriptor,acceptedCumulative:t.acceptedCumulative,deposit:t.deposit,spent:t.spent,units:t.units??0})}function Os(e,t,n,r){return Cs({challengeId:e,channelId:t.channelId,descriptor:n,acceptedCumulative:t.acceptedCumulative,deposit:r,spent:t.spent,units:t.units??0})}function $(e,t){throw Error(`Invalid session transition: ${e.status} + ${t.type}`)}function ks(e){let{cumulativeAmount:t,maxVoucherCumulative:n}=e;if(n!==null&&!(t<=n))throw Error(`requested voucher amount ${t} exceeds local maxDeposit ${n}`)}function As(e){let{channel:t,maxVoucherCumulative:n,receipt:r}=e;if(!t||r.channelId!==t.channelId)return;let i=BigInt(r.acceptedCumulative),a=BigInt(r.spent);if(a>i)throw Error(`receipt spent exceeds accepted cumulative voucher amount`);if(i>t.cumulativeAmount)throw Error(`receipt accepted cumulative exceeds local voucher state`);if(a>t.cumulativeAmount)throw Error(`receipt spent exceeds local voucher state`);ks({cumulativeAmount:i,maxVoucherCumulative:n}),ks({cumulativeAmount:a,maxVoucherCumulative:n})}function js(e){let{channel:t,maxVoucherCumulative:n,receipt:r,spent:i}=e;if(!r||r.channelId!==t?.channelId)return i;As({channel:t,maxVoucherCumulative:n,receipt:r});let a=BigInt(r.spent);return i>a?i:a}function Ms(e,t){return typeof e==`bigint`?e:d(e,t)}function Ns(e){let{contextDepositRaw:t,maxDeposit:n,requestAmount:r,suggestedDepositRaw:i}=e;if(Fs(r,n),t!==void 0){let e=BigInt(t);if(e<r)throw Error(`opening deposit ${e} below request amount ${r}`);return e}let a=i===void 0?void 0:BigInt(i),o=a!==void 0&&a>r?a:r;return n===void 0||o<n?o:n}function Ps(e){let{deposit:t,maxDeposit:n,requiredCumulative:r,suggestedDeposit:i,topUpAmount:a}=e;if(r<=t)return 0n;ks({cumulativeAmount:r,maxVoucherCumulative:n??null});let o=r-t,s=a??i??o,c=s>o?s:o;if(n==null)return c;let l=n-t;return c<l?c:l}function Fs(e,t){ks({cumulativeAmount:e,maxVoucherCumulative:t??null})}function Is(e){let{channel:t,currentSocket:n,lastChallenge:r}=e;if(!t?.opened)return;let i=n?.challenge??r,a=n?.channelId??t.channelId;if(!i)throw Error(`Cannot close session: no challenge available. This usually means close() was called on a SessionManager instance that was recreated after the session was opened. Use the same SessionManager instance that opened the session, or make a request first to receive a fresh 402 challenge.`);if(!a)throw Error(`Cannot close session: no channel ID available. The session may not have been fully opened.`);return{challenge:i,channel:t,channelId:a}}function Ls(e){let{cumulativeAmount:t,spent:n}=e;return t>n?t:n}function Rs(e){let{cumulativeAmount:t,readySpent:n,spent:r}=e;if(!oo(n))throw Error(`close-ready spent is not a uint96 amount`);if(n<r)throw Error(`close-ready spent is below locally confirmed spend`);if(n>Ls({cumulativeAmount:t,spent:r}))throw Error(`close-ready spent exceeds local voucher state`)}function zs(e){let{challengeId:t,channelId:n,expectedCloseAmount:r,minimumSpent:i=0n,receipt:a}=e,o=so(r),s=so(a.spent);return o===void 0||s===void 0||!oo(i)?!1:!!a.txHash&&a.challengeId===t&&a.channelId===n&&a.acceptedCumulative===r&&s>=i&&s<=o}function Bs(e){return Cs({challengeId:e.challengeId,channelId:e.entry.channelId,descriptor:e.entry.descriptor,acceptedCumulative:e.entry.cumulativeAmount.toString(),deposit:e.entry.deposit.toString(),spent:e.spent,units:e.units})}function Vs(){return{channel:null,lastChallenge:null,lastUrl:null,spent:0n,socketSession:null,state:Ss}}function Hs(e){let{maxVoucherCumulative:t,receipt:n,runtime:r}=e;r.spent=js({channel:r.channel,maxVoucherCumulative:t,receipt:n,spent:r.spent}),n&&r.channel?.channelId===n.channelId&&Ts(r,{type:`receiptAccepted`,receipt:n,entry:r.channel})}function Us(e,t){return Cs({challengeId:e.challengeId,channelId:e.channelId,descriptor:t.descriptor,acceptedCumulative:e.acceptedCumulative,deposit:t.deposit.toString(),spent:e.spent,units:e.units??0})}function Ws(e){let{challengeId:t,channelId:n,closeReadyReceipt:r,cumulativeAmount:i,deliveredChunks:a=0n,socketChallengeId:o,socketChannelId:s,spent:c,tickCost:l=0n}=e;if(c>i)throw Error(`locally confirmed spend exceeds local voucher state`);if(r&&r.challengeId===t&&r.channelId===n){let e=so(r.spent);if(e===void 0)throw Error(`close-ready spent is not a uint96 amount`);return e>c?e:c}if(o===t&&s===n&&l>0n){let e=a*l,t=c>e?c:e;return t>i?i:t}return i}function Gs(e){let{channel:t,channelId:n,challengeId:r,cumulativeAmount:i,spent:a,state:o}=e;if(!(!t||t.channelId!==n)&&(t.cumulativeAmount=i,r))return ws(o,{type:`activated`,challengeId:r,entry:t,spent:a.toString(),units:o.status===`active`?o.units:0}).state}function Ks(e){return{channel:e.channel===null?null:{entry:e.channel,cumulativeAmount:e.channel.cumulativeAmount,deposit:e.channel.deposit,opened:e.channel.opened},spent:e.spent,state:e.state}}function qs(e,t){return e.channel?(e.channel.entry.cumulativeAmount=e.channel.cumulativeAmount,e.channel.entry.deposit=e.channel.deposit,e.channel.entry.opened=e.channel.opened,{channel:e.channel.entry,spent:e.spent,state:e.state}):(t&&(t.opened=!1),{channel:null,spent:e.spent,state:e.state})}async function Js(e){let{activeSocket:t,currentSocket:n,target:r}=e,i=n.closeReadyReceipt??await(async()=>(t.send(wo()),e.waitForCloseReady()))(),a=BigInt(i.spent);Rs({cumulativeAmount:r.channel.cumulativeAmount,readySpent:a,spent:e.spent});let o=await e.createSessionCredential(r.challenge,{action:`close`,channelId:r.channelId,descriptor:r.channel.descriptor,cumulativeAmountRaw:a.toString()}),s=a.toString();n.expectedCloseAmount=s;try{let i=e.waitForReceipt(e=>zs({challengeId:r.challenge.id,channelId:r.channelId,expectedCloseAmount:s,minimumSpent:a,receipt:e}));t.send(Co(o));let c=await i;return t.close(),n.closeReadyReceipt=null,c}finally{n.expectedCloseAmount=null}}function Ys(e){return`cumulativeAmount`in e}function Xs(e){if(Ys(e))return BigInt(e.cumulativeAmount)}async function Zs(e,t){t.opened?await e.store.set(t):await e.store.delete(ls(t)),e.notifyUpdate(t)}async function Qs(e,t,n){let r=Xs(n);if(r===void 0)return;let i=await e.store.get(t);i&&i.channelId.toLowerCase()===n.channelId.toLowerCase()&&(i.cumulativeAmount=i.cumulativeAmount>r?i.cumulativeAmount:r,n.action===`close`&&(i.opened=!1),await Zs(e,i))}const $s=B.custom(e=>typeof e==`string`&&/^0x[0-9a-fA-F]*$/.test(e)),ec=B.custom(e=>typeof e==`string`&&/^0x[0-9a-fA-F]{64}$/.test(e)),tc=B.object({account:B.optional(B.custom()),autoSwap:B.optional(B.custom()),action:B.optional(B.enum([`open`,`topUp`,`voucher`,`close`])),channelId:B.optional(ec),cumulativeAmount:B.optional(V()),cumulativeAmountRaw:B.optional(B.string()),transaction:B.optional($s),descriptor:B.optional(B.custom()),additionalDeposit:B.optional(V()),additionalDepositRaw:B.optional(B.string()),depositRaw:B.optional(B.string())});function nc(e){return e?.action!==void 0}function rc(e){return nc(e)&&e.descriptor!==void 0}function ic(e,t,n){let r=n===`additionalDeposit`?e.additionalDepositRaw:e.cumulativeAmountRaw,i=n===`additionalDeposit`?e.additionalDeposit:e.cumulativeAmount;if(r)return BigInt(r);if(i)return d(i,t)}function ac(e,t,n,r){let i=ic(e,t,n);if(i===void 0)throw Error(`${n} required for ${r} action`);return i}function oc(e){return typeof e==`object`&&!!e}function sc(e){return typeof e==`string`&&l(e,{strict:!1})?e:void 0}function cc(e){let t=e.request.methodDetails;return oc(t)?{chainId:typeof t.chainId==`number`?t.chainId:void 0,escrowContract:sc(t.escrowContract),escrow:sc(t.escrow),feePayer:typeof t.feePayer==`boolean`?t.feePayer:void 0,feeToken:sc(t.feeToken),operator:sc(t.operator),sessionSnapshot:Ke(t,We.sessionSnapshot)}:{}}function lc(e,t){if(typeof e==`string`&&l(e,{strict:!1}))return e;throw Error(`tempo session challenge missing ${t}`)}function uc(e){if(typeof e==`string`)return BigInt(e);throw Error(`tempo session challenge missing amount`)}function dc(e){return typeof e==`string`?e:void 0}async function fc(e){let{allowCustomEscrow:t,challenge:n,escrowOverride:r,allowedChainIds:i,getClient:a}=e,o=cc(n);(o.chainId!==void 0||i?.length===0)&&Qi(i,o.chainId);let s=o.chainId??(i?.length===1?i[0]:void 0),c=await a({chainId:s});Zi(c,s);let l=s??c.chain?.id;if(Qi(i,l),!l)throw Error(`No chainId configured for TIP-1034 session challenge.`);let u=ts(n,r,t),d=lc(n.request.recipient,`recipient`),f=lc(n.request.currency,`currency`);return{amount:uc(n.request.amount),challenge:n,chainId:l,client:c,escrow:u,feePayer:o.feePayer,feeToken:o.feeToken,key:cs({payee:d,token:f,escrow:u,chainId:l}),operator:o.operator,payee:d,snapshot:o.sessionSnapshot,suggestedDepositRaw:dc(n.request.suggestedDeposit),token:f}}async function pc(e){let{channelId:t,client:n,descriptor:r,expected:i,readChannelState:a=ps}=e,o=Mo({...r,chainId:i.chainId,escrow:i.escrow});mc({channelId:t,descriptor:r,expectedChannelId:o,payee:i.payee,payer:i.payer,authorizedSigner:i.authorizedSigner,token:i.token});let s=await a(n,o,i.escrow);if(s.deposit===0n)throw Error(`Channel ${o} cannot be reused (closed or not found on-chain).`);if(s.closeRequestedAt!==0)throw Error(`Channel ${o} cannot be reused (pending close request).`);return{channelId:o,state:s}}function mc(e){let{authorizedSigner:t,channelId:n,descriptor:r,expectedChannelId:i,payee:a,payer:o,token:s}=e;if(n&&n.toLowerCase()!==i.toLowerCase())throw Error(`context channelId does not match descriptor`);if(!rs(r.payee,a))throw Error(`context descriptor payee does not match challenge`);if(!rs(r.token,s))throw Error(`context descriptor token does not match challenge`);if(!rs(r.payer,o))throw Error(`context descriptor payer does not match account`);if(!rs(jo(r),t))throw Error(`context descriptor authorizedSigner does not match account`)}function hc(e){let{context:t,snapshot:n}=e,r=t?.descriptor??n?.descriptor;if(r)return{...t,channelId:t?.channelId??n?.channelId,descriptor:r}}function gc(e){let{context:t,decimals:n,requestAmount:r,snapshot:i,settled:a}=e;if(i)return[BigInt(i.acceptedCumulative),BigInt(i.requiredCumulative),BigInt(i.spent)+r,a].reduce((e,t)=>t>e?t:e,0n);let o=ic(t,n,`cumulativeAmount`);return o===void 0?a+r:o+r}async function _c(e){let{account:t,client:n,readChannelState:r,snapshot:i}=e,a=i.highestVoucher;if(!a)throw Error(`session snapshot is missing its highest signed voucher`);if(a.channelId.toLowerCase()!==i.channelId.toLowerCase())throw Error(`session snapshot voucher channelId does not match snapshot channelId`);let o=BigInt(i.acceptedCumulative),s=BigInt(a.cumulativeAmount),c=BigInt(i.requiredCumulative),l=BigInt(i.deposit),u=BigInt(i.settled),d=BigInt(i.spent);if(s!==o)throw Error(`session snapshot voucher amount does not match acceptedCumulative`);if(d>o)throw Error(`session snapshot spent exceeds acceptedCumulative`);if(u>l)throw Error(`session snapshot settled amount exceeds deposit`);if(!qo(i.escrow,i.chainId,{channelId:a.channelId,cumulativeAmount:s,signature:a.signature},jo(i.descriptor)))throw Error(`session snapshot highest voucher signature is invalid`);let f=await pc({channelId:i.channelId,client:n,descriptor:i.descriptor,expected:{chainId:i.chainId,escrow:i.escrow,payee:i.descriptor.payee,payer:t.address,authorizedSigner:Qo(t),token:i.descriptor.token},readChannelState:r}),p=[o,c,f.state.settled].reduce((e,t)=>t>e?t:e,0n);if(p>f.state.deposit)throw Error(`recovered session cumulative amount exceeds on-chain channel deposit`);return{entry:{channelId:f.channelId,cumulativeAmount:p,deposit:f.state.deposit,descriptor:i.descriptor,escrow:i.escrow,chainId:i.chainId,opened:!0},spent:d}}function vc(e,t){return rs(e.address,t.payer)?rs(Qo(e),jo(t)):!1}function yc(e){let{account:t,entry:n,context:r,decimals:i,maxDeposit:a,resolved:o}=e;if(nc(r)){if(!rc(r))throw Error(`descriptor required for TIP-1034 session action`);return{type:`manual`,account:t,context:r,decimals:i,resolved:o}}if(!n&&r?.channelId&&!r.descriptor)throw Error(`descriptor required to reuse TIP-1034 channel`);let s=hc({context:r,snapshot:o.snapshot});return!n&&s&&vc(t,s.descriptor)?{type:`recover`,account:t,context:s,decimals:i,maxDeposit:a,resolved:o}:n?.opened&&vc(t,n.descriptor)?{type:`voucher`,account:t,entry:n,maxDeposit:a,resolved:o}:{type:`open`,account:t,context:r,maxDeposit:a,resolved:o}}async function bc(e,t,n=!1){switch(e.type){case`open`:return Sc(e,t,n);case`recover`:return Cc(e,t);case`voucher`:return wc(e,t);case`manual`:return Tc(e,t,n)}}async function xc(e,t){if(e)return await aa(t.client,{account:t.account,amountOut:t.amountOut,tokenOut:t.tokenOut,tokenIn:e.tokenIn,slippage:e.slippage})}async function Sc(e,t,n){let{account:r,resolved:i}=e,a=Ns({contextDepositRaw:e.context?.depositRaw,maxDeposit:e.maxDeposit,requestAmount:i.amount,suggestedDepositRaw:i.suggestedDepositRaw}),o=await os(i.client,r,{chainId:i.chainId,deposit:a,escrow:i.escrow,feePayer:i.feePayer,feeToken:i.feeToken,initialAmount:i.amount,operator:i.operator,payee:i.payee,prefixCalls:await xc(n,{account:r.address,amountOut:a,client:i.client,tokenOut:i.token}),token:i.token});return await Zs(t,{channelId:o.channelId,cumulativeAmount:i.amount,deposit:a,descriptor:o.descriptor,escrow:i.escrow,chainId:i.chainId,opened:!0}),o}async function Cc(e,t){let{account:n,context:r,decimals:i,maxDeposit:a,resolved:o}=e,{descriptor:s}=r,c=await pc({channelId:r.channelId,client:o.client,descriptor:s,expected:{chainId:o.chainId,escrow:o.escrow,payee:o.payee,payer:n.address,authorizedSigner:Qo(n),token:o.token}}),l=gc({context:r,decimals:i,requestAmount:o.amount,settled:c.state.settled,snapshot:o.snapshot});if(l>c.state.deposit)throw Error(`recovered voucher amount exceeds on-chain channel deposit`);Fs(l,a);let u=await is(o.client,n,s,l,o.chainId,o.escrow);return await Zs(t,{channelId:c.channelId,cumulativeAmount:l,deposit:c.state.deposit,descriptor:s,escrow:o.escrow,chainId:o.chainId,opened:!0}),u}async function wc(e,t){let{account:n,entry:r,resolved:i}=e,a=r.cumulativeAmount+i.amount;Fs(a,e.maxDeposit);let o=await is(i.client,n,r.descriptor,a,i.chainId,i.escrow);return r.cumulativeAmount=a,await Zs(t,r),o}async function Tc(e,t,n){let{account:r,context:i,decimals:a,resolved:o}=e,{descriptor:s}=i,c=Mo({...s,chainId:o.chainId,escrow:o.escrow});mc({channelId:i.channelId,descriptor:s,expectedChannelId:c,payee:o.payee,payer:r.address,authorizedSigner:Qo(r),token:o.token});let l=await Ec({account:r,channelId:c,context:i,decimals:a,descriptor:s,resolved:o},n);return await Qs(t,o.key,l),l}async function Ec(e,t){switch(e.context.action){case`open`:return Dc(e);case`topUp`:return Oc(e,t);case`voucher`:return kc(e);case`close`:return Ac(e)}}async function Dc(e){let{account:t,channelId:n,context:r,decimals:i,descriptor:a,resolved:o}=e;if(!r.transaction)throw Error(`transaction required for open action`);let s=ac(r,i,`cumulativeAmount`,`open`),c=await is(o.client,t,a,s,o.chainId,o.escrow);return{action:`open`,type:`transaction`,channelId:n,transaction:r.transaction,signature:c.signature,descriptor:a,cumulativeAmount:s.toString(),authorizedSigner:a.authorizedSigner}}async function Oc(e,t){let{account:n,channelId:r,context:i,decimals:a,descriptor:o,resolved:s}=e,c=ac(i,a,`additionalDeposit`,`topUp`);return i.transaction?{action:`topUp`,type:`transaction`,channelId:r,transaction:i.transaction,descriptor:o,additionalDeposit:c.toString()}:ss(s.client,n,o,c,s.chainId,s.feePayer,s.escrow,await xc(t,{account:n.address,amountOut:c,client:s.client,tokenOut:s.token}),s.feeToken)}function kc(e){let{account:t,context:n,decimals:r,descriptor:i,resolved:a}=e;return is(a.client,t,i,ac(n,r,`cumulativeAmount`,`voucher`),a.chainId,a.escrow)}function Ac(e){let{account:t,context:n,decimals:r,descriptor:i,resolved:a}=e;return as(a.client,t,i,ac(n,r,`cumulativeAmount`,`close`),a.chainId,a.escrow)}const jc={CONNECTING:0,OPEN:1,CLOSING:2,CLOSED:3};function Mc(e){let t=new Map,n=!1,r=[],i=e.readyState,a=(e,n,i)=>{let a=t.get(e);if(a||(a=new Set,t.set(e,a)),a.add({once:typeof i==`object`&&i.once===!0,value:n}),e===`message`&&r){let e=r;r=null;for(let t of e)s(`message`,t)}},o=(e,n)=>{let r=t.get(e);if(r)for(let e of r)e.value===n&&r.delete(e)};function s(e,a){if(a.type===`close`){if(n)return;n=!0,i=jc.CLOSED,r=null}if(a.type===`open`&&(i=jc.OPEN),a.type===`message`&&r){r.push(a);return}switch(a.type){case`close`:l.onclose?.(a);break;case`error`:l.onerror?.(a);break;case`message`:l.onmessage?.(a);break;case`open`:l.onopen?.(a)}let o=t.get(e);if(o)for(let e of Array.from(o))typeof e.value==`function`?e.value(a):e.value.handleEvent(a),e.once&&o.delete(e)}let c=null,l={addEventListener:a,close(t,n){e.close(t,n)},get bufferedAmount(){return e.bufferedAmount},get extensions(){return e.extensions},on(e,t){a(e,t)},onclose:null,onerror:null,get onmessage(){return c},set onmessage(e){if(c=e,e&&r){let e=r;r=null;for(let t of e)s(`message`,t)}},onopen:null,off(e,t){o(e,t)},get protocol(){return e.protocol},get readyState(){return i},removeEventListener:o,send(t){e.send(t)},get url(){return e.url}};return{emit:s,socket:l}}function Nc(e){return{acceptedCumulative:BigInt(e.acceptedCumulative),deposit:BigInt(e.deposit),requiredCumulative:BigInt(e.requiredCumulative)}}function Pc(e){let{amount:t,assertVoucherWithinLocalLimit:n,channel:r,decimals:i,lastChallenge:a,lastUrl:o}=e;if(!r?.opened)throw Error(`Cannot top up session: no open channel.`);if(!a)throw Error(`Cannot top up session: no challenge available. Make a request first.`);if(!o)throw Error(`Cannot top up session: no URL available. Call fetch(), sse(), or ws() first.`);let s=Ms(t,i);if(s<=0n)throw Error(`Top-up amount must be greater than zero.`);return n(r.cumulativeAmount+s),{additionalDeposit:s,challenge:a,channelId:r.channelId,input:o}}function Fc(e){let{additionalDeposit:t,channel:n,channelId:r,challengeId:i,currentState:a,knownDeposit:o,receipt:s,spent:c}=e;if(n?.channelId!==r)return;let l=o!==void 0&&o>n.deposit?o:n.deposit,u={...n,deposit:l+t};return s?{channel:u,state:Us(s,u)}:i?{channel:u,state:Bs({challengeId:i,entry:u,spent:c.toString(),units:a.status===`active`?a.units:0})}:{channel:u}}async function Ic(e){if(e.event.channelId!==e.expectedChannelId)return{status:`ignored`,reason:`channel-mismatch`};let t=Nc(e.event);e.assertVoucherWithinLocalLimit(t.requiredCumulative),await e.topUpIfNeeded({challenge:e.challenge,input:e.input,channelId:e.expectedChannelId,deposit:t.deposit,requiredCumulative:t.requiredCumulative});let n=e.getChannel();if(!n||n.channelId!==e.expectedChannelId)return{status:`ignored`,reason:`missing-channel`};let r=n.cumulativeAmount>t.requiredCumulative?n.cumulativeAmount:co(t.requiredCumulative);return{status:`ready`,context:{action:`voucher`,channelId:e.expectedChannelId,descriptor:n.descriptor,cumulativeAmountRaw:r.toString()}}}function Lc(e){return e.method===He.tempo&&e.intent===Ue.session}function Rc(e){return Lc(e)&&Ke(e.request.methodDetails,We.sessionProtocol)===Ge.v2}function zc(e){return Ke(e.request.methodDetails,We.sessionSnapshot)}function Bc(e,t,n){let r=e instanceof Request?e.headers:void 0;return{...t,headers:{...Q(r),...Q(t?.headers),[R.authorization]:n}}}function Vc(e){try{let t=typeof location>`u`?void 0:location.href,n=e instanceof Request?new URL(e.url):e instanceof URL?new URL(e):new URL(String(e),t);return n.hash=``,n}catch{return e}}function Hc(e){let t=new URL(e.toString());return t.protocol===`ws:`&&(t.protocol=`http:`),t.protocol===`wss:`&&(t.protocol=`https:`),t}async function Uc(e){let t=await e.text().catch(()=>``);if(!t)return``;if(!e.headers.get(`Content-Type`)?.includes(`application/problem+json`))return t;try{return JSON.parse(t).detail??t}catch{return t}}async function Wc(e){let{channel:t,channelId:n}=e;if(!t?.descriptor||t.channelId!==n)throw Error(`Cannot top up session: no local channel descriptor available.`);let r=await Gc({challenge:e.challenge,context:{action:`topUp`,channelId:n,descriptor:t.descriptor,additionalDepositRaw:e.additionalDeposit.toString()},createSessionCredential:e.createSessionCredential,fetch:e.fetch,input:e.input});if(!r.ok)throw Error(`Top-up POST failed with status ${r.status}`);let i=r.headers.get(R.paymentReceipt);return i?yo(i):void 0}async function Gc(e){let t=async t=>e.fetch(Vc(e.input),{method:`POST`,headers:{[R.authorization]:await e.createSessionCredential(t,e.context)}}),n=await t(e.challenge);if(n.status!==402)return n;let r=dt(n).find(Rc);return r?t(r):n}async function Kc(e){let t=qc({channel:e.getChannel(),response:e.response});if(!t)return;let{channel:n,challenge:r,snapshot:i}=t;e.setChallenge(r);let a=BigInt(i.requiredCumulative),o=n.cumulativeAmount;await e.topUpIfNeeded({challenge:r,input:e.input,channelId:i.channelId,deposit:BigInt(i.deposit),requiredCumulative:a});let s=e.getChannel();if(!s?.descriptor||s.channelId!==i.channelId)return;let c=s.cumulativeAmount>a?s.cumulativeAmount:a,l=()=>e.restoreCumulative(i.channelId,o),u;try{let t=await e.createSessionCredential(r,{action:`voucher`,channelId:i.channelId,descriptor:s.descriptor,cumulativeAmountRaw:c.toString()});u=await e.fetch(e.input,Bc(e.input,e.init,t))}catch(e){throw await l(),e}return!u.ok&&!u.headers.get(R.paymentReceipt)&&await l(),u}function qc(e){let t=dt(e.response).find(Rc);if(!t)return;let n=zc(t);if(!n)return;let{channel:r}=e;if(!(!r?.descriptor||r.channelId!==n.channelId))return{channel:r,challenge:t,snapshot:n}}async function Jc(e){if(!e.lastUrl)throw Error(`Cannot close session: no URL available. This usually means close() was called on a SessionManager instance that was recreated after the session was opened. Use the same SessionManager instance that opened the session, or call fetch()/sse() before close().`);let t=e.target.challenge,n=e.signedCloseAmount,r=async(r,i=!1)=>{t=r,n=(i?e.resolveSignedCloseAmount?.(r):void 0)??e.signedCloseAmount;let a=await e.createSessionCredential(r,{action:`close`,channelId:e.target.channelId,descriptor:e.target.channel.descriptor,cumulativeAmountRaw:n});return e.fetch(e.lastUrl,{method:`POST`,headers:{[R.authorization]:a}})},i=await r(e.target.challenge);if(i.status===402){let t=dt(i).find(Rc);t&&(e.setChallenge?.(t),i=await r(t,!0))}if(!i.ok){let e=await Uc(i),t=i.headers.get(R.wwwAuthenticate)??``;throw Error(`Close request failed with status ${i.status}${e?`: ${e}`:``}${t?` [${R.wwwAuthenticate}: ${t}]`:``}`)}let a=i.headers.get(R.paymentReceipt);if(!a)return;let o=yo(a);if(!o.txHash||!w.validate(o.txHash,{strict:!0})||w.size(o.txHash)!==32||!zs({challengeId:t.id,channelId:e.target.channelId,expectedCloseAmount:n,minimumSpent:e.getMinimumSpent?.()??0n,receipt:o}))throw Error(`Session close response included a mismatched payment receipt.`);return o}async function Yc(e,t,n){let{onReceipt:r,signal:i,...a}=t??{},o={...a,headers:{...Q(a.headers),Accept:`text/event-stream`},...i?{signal:i}:{}},s=await n.doFetch(e,o);return!bo(s)&&n.getChannel()?.opened&&(s=await n.doFetch(e,o)),Xc(e,s,{onReceipt:r,signal:i},n)}function Xc(e,t,n,r){if(!bo(t))throw Error(`SSE response is not an event stream.`);if(!t.body)throw Error(`Response has no body.`);let i=r.getChallenge();return Zc({onNeedVoucher:t=>nl({challenge:i,driver:r,input:e},t),onReceipt(e){r.acceptReceipt(e),n?.onReceipt?.(e)},response:t,signal:n?.signal})}async function*Zc(e){for await(let t of Qc(e))t.data!==void 0&&(yield t.data)}async function*Qc(e){if(!e.response.body)throw Error(`Response has no body.`);let t=e.response.body.getReader(),n=new TextDecoder,r=``,i=!1,a=()=>{t.cancel(e.signal?.reason).catch(()=>void 0)};e.signal?.addEventListener(`abort`,a,{once:!0}),e.signal?.aborted&&a();try{for(;!e.signal?.aborted;){let{done:a,value:o}=await t.read();for(a?(i=!0,r+=n.decode()):r+=n.decode(o,{stream:!0});;){let t=$c(r,a);if(!t)break;let n=t.index+t.length,i=r.slice(0,t.index),o=r.slice(0,n);if(r=r.slice(n),!i.trim())continue;let s=xo(i.replace(/\r\n|\r/g,`
|
|
7
|
+
`));if(!s){yield{raw:o};continue}switch(s.type){case`message`:yield{data:s.data,raw:o};break;case`payment-need-voucher`:await e.onNeedVoucher(s.data);break;case`payment-receipt`:e.onReceipt(s.data)}}if(a)break}}finally{e.signal?.removeEventListener(`abort`,a),i||await t.cancel().catch(()=>void 0),t.releaseLock()}}function $c(e,t){for(let n=0;n<e.length;n++){let r=el(e,n,t);if(!r)continue;let i=el(e,n+r,t);if(i)return{index:n,length:r+i};n+=r-1}}function el(e,t,n){return e[t]===`
|
|
8
8
|
`?1:e[t]===`\r`?e[t+1]===`
|
|
9
|
-
`?2:t+1===e.length&&!n?0:1:0}function el(e){let t=new AbortController,n=()=>t.abort(e.signal?.reason);e.signal?.addEventListener(`abort`,n,{once:!0}),e.signal?.aborted&&n();let r=Zc({...e,signal:t.signal}),i=new TextEncoder,a=new Headers(e.response.headers);a.delete(`content-length`);let o=()=>e.signal?.removeEventListener(`abort`,n),s=new Response(new ReadableStream({async pull(e){try{let t=await r.next();if(t.done)return o(),e.close();e.enqueue(i.encode(t.value.raw))}catch(e){throw o(),e}},async cancel(){o(),t.abort(),await r.return(void 0)}}),{headers:a,status:e.response.status,statusText:e.response.statusText});for(let t of[`redirected`,`type`,`url`])Object.defineProperty(s,t,{configurable:!0,get:()=>e.response[t]});return s}async function tl(e,t){let n=e.driver.getChannel();if(!n||!e.challenge)return;let r=await Fc({assertVoucherWithinLocalLimit:e.driver.assertVoucherWithinLocalLimit,challenge:e.challenge,event:t,expectedChannelId:n.channelId,getChannel:e.driver.getChannel,input:e.input,topUpIfNeeded:e.driver.topUpIfNeeded});if(r.status!==`ready`)return;let i=await Wc({challenge:e.challenge,context:r.context,createSessionCredential:e.driver.createSessionCredential,fetch:e.driver.fetch,input:e.input});if(!i.ok)throw Error(`Voucher POST failed with status ${i.status}`)}async function nl(e){let t=new URL(e.input.toString()),n=Vc(t);e.onProbeUrl?.(n);let r=await e.fetch(n,{...e.probeInit,...e.signal?{signal:e.signal}:{}});if(r.status!==402)throw Error(`Expected a 402 payment challenge from ${n}, received ${r.status} instead.`);let i=ft(r).find(Lc);if(!i)throw Error(`No payment challenge received from HTTP endpoint for this WebSocket URL. The server may not require payment or did not advertise a challenge.`);return{challenge:i,httpUrl:n,wsUrl:t}}async function rl(e){let t=await nl(e);return{...t,credential:await e.createSessionCredential(t.challenge,{})}}function il(e){let{challenge:t,credential:n,socket:r}=e;return{challenge:t,channelId:xt(n).payload.channelId,closeReadyReceipt:null,deliveredChunks:0n,expectedCloseAmount:null,socket:r,tickCost:ho(t)}}function al(e){let{challengeId:t,channelId:n,receipt:r}=e;return r.challengeId===t&&r.channelId===n}function ol(e){if(!al(e))return`received mismatched payment-close-ready frame`;let t=oo(e.receipt.spent);if(t===void 0)return`received invalid payment-close-ready spend`;if(t>e.cumulativeAmount)return`received payment-close-ready beyond local voucher state`}function sl(e){let{challengeId:t,channelId:n,expectedCloseAmount:r,receipt:i}=e;if(!al(e))return`received mismatched payment-receipt frame`;if(r!==null&&i.txHash&&!Rs({challengeId:t,channelId:n,expectedCloseAmount:r,minimumSpent:BigInt(r),receipt:i}))return`received mismatched payment-close receipt frame`}async function cl(e){let{challenge:t,credential:n,options:r,WebSocket:i,wsUrl:a}=e,o=new i(a,r?.protocols),s=il({challenge:t,credential:n,socket:o});e.setSocketSession(s);let c=jc(o),l=t=>{e.rejectReceipt(Error(t)),e.rejectCloseReady(Error(t)),(o.readyState===Ac.CONNECTING||o.readyState===Ac.OPEN)&&o.close(3008,t)};return o.addEventListener(`close`,t=>{s.socket=null,s.expectedCloseAmount=null,e.rejectReceipt(Error(`WebSocket closed before the payment flow completed.`)),e.rejectCloseReady(Error(`WebSocket closed before the payment flow completed.`)),c.emit(`close`,{code:t.code??1e3,reason:t.reason??``,type:`close`,wasClean:!0})}),o.addEventListener(`error`,()=>{c.emit(`error`,{type:`error`})}),o.addEventListener(`message`,async t=>{let n=typeof t.data==`string`?t.data:void 0;n&&await ul({driver:e,failSocketFlow:l,managedEmit:c.emit,message:n,rawSocket:o,socketState:s})}),r?.signal?.addEventListener(`abort`,()=>{e.rejectReceipt(Error(`WebSocket payment flow aborted.`)),e.rejectCloseReady(Error(`WebSocket payment flow aborted.`)),o.close()},{once:!0}),await ll(o,c.emit,a),o.send(So(n)),await e.waitForReceipt(),c.socket}function ll(e,t,n){return new Promise((r,i)=>{let a=()=>{e.removeEventListener(`error`,o),t(`open`,{type:`open`}),r()},o=()=>{e.removeEventListener(`open`,a),i(Error(`WebSocket connection to ${n} failed to open.`))};e.addEventListener(`open`,a,{once:!0}),e.addEventListener(`error`,o,{once:!0})})}async function ul(e){let t=wo(e.message);if(!t){e.managedEmit(`message`,{data:e.message,type:`message`});return}switch(t.mpp){case`authorization`:return;case`message`:e.socketState.deliveredChunks+=1n,e.managedEmit(`message`,{data:t.data,type:`message`});return;case`payment-close-ready`:dl(e,t.data);return;case`payment-error`:e.driver.rejectReceipt(Error(t.message)),e.driver.rejectCloseReady(Error(t.message));return;case`payment-need-voucher`:await fl(e,t.data);return;case`payment-receipt`:pl(e,t.data);return}}function dl(e,t){let n=e.driver.getChannel()?.cumulativeAmount??0n,r=ol({challengeId:e.driver.challenge.id,channelId:e.socketState.channelId,cumulativeAmount:n,receipt:t});if(r){e.failSocketFlow(r);return}e.driver.acceptReceipt(t),e.driver.options?.onReceipt?.(t),e.driver.settleCloseReady(t),e.managedEmit(`close`,{code:1e3,reason:`stream complete`,type:`close`,wasClean:!0})}async function fl(e,t){try{let n=e.driver.challenge;n.expires&&new Date(n.expires).getTime()<=Date.now()+5e3&&(n=await e.driver.refreshChallenge(),e.driver.challenge=n,e.socketState.challenge=n);let r=await Fc({assertVoucherWithinLocalLimit:e.driver.assertVoucherWithinLocalLimit,challenge:n,event:t,expectedChannelId:e.socketState.channelId,getChannel:e.driver.getChannel,input:e.driver.httpUrl,topUpIfNeeded:e.driver.topUpIfNeeded});if(r.status===`ignored`){e.failSocketFlow(r.reason===`channel-mismatch`?`received mismatched payment-need-voucher frame`:`cannot create voucher: no active channel`);return}let i=await e.driver.createSessionCredential(n,r.context);e.rawSocket.send(So(i))}catch(t){e.failSocketFlow(t instanceof Error?t.message:`failed to create websocket voucher`)}}function pl(e,t){let n=sl({challengeId:e.driver.challenge.id,channelId:e.socketState.channelId,expectedCloseAmount:e.socketState.expectedCloseAmount,receipt:t});if(n){e.failSocketFlow(n);return}e.driver.acceptReceipt(t),e.driver.options?.onReceipt?.(t),e.driver.settleReceipt(t)}const ml=new WeakMap;async function hl(e,t){let n=ml.get(e)??new Map;ml.set(e,n);let r=n.get(t),i,a=new Promise(e=>{i=e});return n.set(t,a),await r,()=>{i(),n.get(t)===a&&n.delete(t)}}function gl(e,t){try{return t?.channelId.toLowerCase()===e.channelId.toLowerCase()&&BigInt(t.acceptedCumulative)===e.cumulativeAmount}catch{return!1}}function _l(e,t,n){try{let r=e.response?.headers.get(L.paymentReceipt);if(r){let e=vo(r);if(e.challengeId===t.id&&gl(n,e))return!0}}catch{}return e.challenges?.some(e=>Lc(e)?gl(n,Rc(e)):!1)??!1}function vl(e={}){let{account:t,allowCustomEscrow:n=!1,autoSwap:r,channelStore:i,decimals:a=6,escrow:o,getClient:s,maxDeposit:c,topUpAmount:l,onChannelUpdate:u,resolveAccount:f}=e,p=Zi({chain:y,getClient:s,rpcUrl:Bn}),m=qi({account:t}),h=c===void 0?void 0:d(c,a),g=l===void 0?void 0:d(l,a),_=i??ls(),v={store:_,notifyUpdate:e=>u?.(e)},b=async(e,t,n)=>{let r=m(e.client,t),i=t?.action?t.descriptor:n?.descriptor??mc({context:t,snapshot:e.snapshot})?.descriptor;return await f?.({account:r,chainId:e.chainId,operation:{kind:`authorizePaymentChannel`,...i?{authority:Ao(i)}:{}}})??r},x=async(e,t,n)=>vc({account:await b(e,t,n),entry:n,context:t,decimals:a,maxDeposit:h,resolved:e}),S=At(ja,{canHandleChallenge:({challenge:e})=>Lc(e),context:ec,async createCredential(e){let{challenge:t,context:i}=e,a=await dc({allowCustomEscrow:n,challenge:t,escrowOverride:o,getClient:p}),s=ci(e),c=()=>{};try{let e=!tc(i)&&i?.descriptor===void 0;e&&(c=await hl(_,a.key),s&&(await _.get(a.key))?.opened&&await s.prepare());let n=await _.get(a.key),o=await x(a,i,n);if(!e&&s&&o.type===`open`){c=await hl(_,a.key);let e=await _.get(a.key);e?.channelId!==n?.channelId&&(n=e,n?.opened&&(await s.prepare(),n=await _.get(a.key)),o=await x(a,i,n))}let l,u=s&&o.type===`open`?{store:{get:e=>_.get(e),async set(e){l=e},delete:e=>_.delete(e)},notifyUpdate(){}}:v,d=await ts(t,await yc(o,u,aa(i?.autoSwap??r,ra)),a.chainId,o.account);if(s&&l){let e=l;s.settle=async n=>{let r=n.status===`accepted`||_l(n,t,e);if(!r&&n.status===`pending`)return!1;try{if(r){let t=await _.get(a.key);(!t?.opened||t.channelId.toLowerCase()!==e.channelId.toLowerCase())&&(await _.set(e),v.notifyUpdate(e))}return!0}finally{c()}}}else c();return d}catch(e){throw c(),e}}}),C=async({challenge:e,channel:t,deposit:n,fetch:r,input:i,requiredCumulative:a})=>{let o=t.deposit>n?t.deposit:n,s=Ns({deposit:o,maxDeposit:h,requiredCumulative:a,suggestedDeposit:e.request.suggestedDeposit===void 0?void 0:BigInt(e.request.suggestedDeposit),topUpAmount:g});s>0n&&await Uc({additionalDeposit:s,challenge:e,channel:t,channelId:t.channelId,createSessionCredential:(e,t)=>S.createCredential({challenge:e,context:t}),fetch:r,input:i});let c=o+s;if(c===t.deposit)return;let l=await _.get(cs(t)),u=l?.channelId.toLowerCase()===t.channelId.toLowerCase()?l:t,d={...u,deposit:u.deposit>c?u.deposit:c};await _.set(d),v.notifyUpdate(d)};return ei(S,async({challenge:e,context:t,fetch:r,input:i})=>{if(!Lc(e))return;let a=t===void 0?void 0:ec.parse(t);if(tc(a))return;let s=await dc({allowCustomEscrow:n,challenge:e,escrowOverride:o,getClient:p}),c=await _.get(s.key);if(!c?.opened)return;let l=s.snapshot?.channelId.toLowerCase()===c.channelId.toLowerCase()?s.snapshot:void 0,u=c.cumulativeAmount+ho(e),d=l?BigInt(l.requiredCumulative):u,f=d>u?d:u,m=l?BigInt(l.deposit):c.deposit,h=m>c.deposit?m:c.deposit;f<=h&&h===c.deposit||!_c(await b(s,a,c),c.descriptor)||await C({challenge:e,channel:c,deposit:h,fetch:r,input:i,requiredCumulative:f})}),ai(S,async({challenge:e,credential:t,fetch:r,headers:i,input:a,refetch:s,response:c,signal:l})=>{if(!Lc(e))return c;if(!yo(c))return mo(xt(t).payload).action===`open`&&i.get(`accept`)?.toLowerCase().includes(`text/event-stream`)?await s?.()??c:c;let u=(await dc({allowCustomEscrow:n,challenge:e,escrowOverride:o,getClient:p})).key,d=await _.get(u),f={assertVoucherWithinLocalLimit:e=>Ps(e,h),createSessionCredential:(e,t)=>S.createCredential({challenge:e,context:t}),fetch:r,getChannel:()=>d??null,async topUpIfNeeded({deposit:t,requiredCumulative:n}){d&&await C({challenge:e,channel:d,deposit:d.deposit>t?d.deposit:t,fetch:r,input:a,requiredCumulative:n})}};return el({onNeedVoucher:t=>tl({challenge:e,driver:f,input:a},t),onReceipt(){},response:c,signal:l})})}const yl=new WeakMap;function bl(e,t){yl.set(e,t)}function xl(e){let t=null;return{wait(n=()=>!0){if(t)throw Error(`${e} wait already in progress`);return new Promise((e,r)=>{t={predicate:n,resolve:e,reject:r}})},settle(e){if(!t||!t.predicate(e))return;let n=t;t=null,n.resolve(e)},reject(e){if(!t)return;let n=t;t=null,n.reject(e)}}}function Sl(e){let t=xl(`close-ready`),n=xl(`receipt`);return{waitForReceipt(e){return n.wait(e)},waitForCloseReady(){let n=e.getSocketSession()?.closeReadyReceipt;return n?Promise.resolve(n):t.wait()},settleReceipt(e){n.settle(e)},settleCloseReady(n){let r=e.getSocketSession();r&&r.challenge.id===n.challengeId&&r.channelId===n.channelId&&(r.closeReadyReceipt=n),t.settle(n)},rejectReceipt(e){n.reject(e)},rejectCloseReady(e){t.reject(e)}}}function Cl(e){return e.method===Ue.tempo&&e.intent===We.charge}function wl(e){if(!Cl(e)||typeof e.request.amount!=`string`)return!1;try{return BigInt(e.request.amount)===0n}catch{return!1}}function Tl(e,t,n){if(!n)return t;let r={...Z(e instanceof Request?e.headers:void 0),...Z(t?.headers)};return Object.keys(r).some(e=>e.toLowerCase()===L.paymentSession.toLowerCase())?t:{...t,headers:{...r,[L.paymentSession]:n}}}function El(e,t){return e===void 0?t:{...ec.parse(e),...t}}function Dl(e){let t=e.decimals??6,n=e.webSocket??globalThis.WebSocket;return{decimals:t,fetch:e.fetch??globalThis.fetch.bind(globalThis),maxVoucherCumulative:e.maxDeposit===void 0?null:d(e.maxDeposit,t),topUpAmount:e.topUpAmount===void 0?null:d(e.topUpAmount,t),WebSocket:n}}function Ol(e){let t=e.allowCustomEscrow??!1,n=Dl(e),r=Zi({chain:y,getClient:e.client?()=>e.client:e.getClient,rpcUrl:Bn}),i=qi({account:e.account}),a=Bs(),o=e.credentialContext===void 0?void 0:El(e.credentialContext,{}),s=Sl({getSocketSession:()=>a.socketSession}),c=e.channelStore??ls(),l=new Set,u;async function d(e){let t=await c.get(e);if(t?.opened&&!l.has(t.channelId))return t}let f={async get(e){let t=await d(e);return t&&u&&(u.seenExisting.add(e),!u.committed&&!u.created.has(e)&&(u.resumed??=t)),t},async set(e){let t=cs(e);e.opened&&l.delete(e.channelId),u?.trackCreates&&!u.seenExisting.has(t)&&u.created.set(t,e),await c.set(e)},delete:e=>c.delete(e)};async function p(e){let t=cs(e);l.add(e.channelId),u?.seenExisting.delete(t),u?.resumed===e&&(u.resumed=void 0),await Promise.resolve(c.delete(t)).catch(()=>void 0)}async function m(){let e=u;if(e?.created.size){for(let[t,n]of e.created)l.add(n.channelId),await Promise.resolve(c.delete(t)).catch(()=>void 0);e.created.clear(),await ne(e.committed??e.previous)}}function h(e){let t=qe(e.request.methodDetails,Ge.sessionSnapshot);if(typeof t?.channelId!=`string`)return!1;let n=u;if(!n?.created.size||!a.channel)return!1;for(let[e,r]of n.created)if(r.channelId.toLowerCase()===t.channelId.toLowerCase()&&a.channel.channelId.toLowerCase()===t.channelId.toLowerCase())return n.created.delete(e),n.committed=Gs({channel:a.channel,spent:a.spent,state:a.state}),!0;return!1}function g(e){return ws(a,e)}function _(){let e=a.state.status===`active`?a.state:u?.committed?.state??u?.previous.state;return e?.status===`active`?e.units:0}function v(e){let t=u,n=t?.committed?.channel?.entry??t?.resumed;!t||n?.channelId.toLowerCase()!==e.channelId.toLowerCase()||e.deposit<=n.deposit||(t.resumed=void 0,t.committed=Gs({channel:a.channel,spent:a.spent,state:a.state}))}let b=vl({account:e.account,allowCustomEscrow:t,autoSwap:e.autoSwap,getClient:e.client?()=>e.client:e.getClient,resolveAccount:e.resolveAccount,escrow:e.escrow,decimals:n.decimals,maxDeposit:e.maxDeposit,topUpAmount:e.topUpAmount,channelStore:f,onChannelUpdate(e){e.channelId!==a.channel?.channelId&&(a.spent=0n),a.channel=e,a.lastChallenge&&g({type:`activated`,challengeId:a.lastChallenge.id,entry:e,spent:a.spent.toString(),units:_()}),v(e)}});oi(b);let x=Fa({account:e.account,getClient:e.client?()=>e.client:e.getClient}),S=pi({fetch:n.fetch,methods:[b],onChallenge:async(e,t)=>{if(!Ic(e))return;let n=u,r=n&&n.challengesReceived>0&&e.id===a.lastChallenge?.id,i=r&&it(e)===it(a.lastChallenge);n&&n.challengesReceived++,!i&&(h(e)||(n?.created.size?await m():r&&await ne(n.committed??n.previous)),a.lastChallenge=e,g({type:`challengeReceived`,challengeId:e.id}))}});function C(e,t){return b.createCredential({challenge:e,context:El(o,t)})}function w(e){Vs({maxVoucherCumulative:n.maxVoucherCumulative,receipt:e,runtime:a})}function T(e=a.state.status===`active`?a.state.units:0){!a.channel||!a.lastChallenge||a.state.status!==`active`&&a.state.status!==`withdrawable`&&a.state.status!==`closeRequested`&&g({type:`activated`,challengeId:a.lastChallenge.id,entry:a.channel,spent:a.spent.toString(),units:e})}async function E(t){let n=t.headers.get(L.paymentSessionSnapshot);if(!n)return;let o=bs(n),s=await r({chainId:o.chainId}),c=i(s),{entry:l,spent:u}=await gc({account:await e.resolveAccount?.({account:c,chainId:o.chainId,operation:{authority:Ao(o.descriptor),kind:`authorizePaymentChannel`}})??c,client:s,snapshot:o});return M(l.cumulativeAmount),await Promise.resolve(f.set(l)).catch(()=>void 0),a.channel=l,a.spent=u,l}async function D(t,r){if(!e.bootstrap||a.channel?.opened)return;let i=t instanceof Request?t.headers:void 0,{body:o,method:s,...c}=r??{},l=t instanceof Request?t.url:t,u={...c,method:`HEAD`,headers:{...Z(i),...Z(r?.headers),[L.acceptPayment]:`${Ue.tempo}/${We.charge}`}};try{let e=await n.fetch(l,u);if(e.status!==402)return await E(e);let t=ft(e).find(Cl);if(!t||!wl(t))return;let r=await x.createCredential({challenge:t,context:{}}),i=await n.fetch(l,{...u,headers:{...Z(u.headers),[L.authorization]:r}});return i.ok?await E(i):void 0}catch{return}}function O(e,t){let n=a.socketSession;return Us({challengeId:e.id,channelId:t,closeReadyReceipt:n?.closeReadyReceipt,cumulativeAmount:a.channel?.channelId===t?a.channel.cumulativeAmount:0n,deliveredChunks:n?.deliveredChunks,socketChallengeId:n?.challenge.id,socketChannelId:n?.channelId,spent:a.spent,tickCost:n?.tickCost})}function k(e,t){let n=Rc(t);if(!n)return;if(jo({...n.descriptor,chainId:n.chainId,escrow:n.escrow}).toLowerCase()!==n.channelId.toLowerCase())throw Error(`close snapshot descriptor does not match its channel ID`);if(n.channelId.toLowerCase()!==e.channelId.toLowerCase())throw Error(`close snapshot channel ID does not match local session`);if(n.chainId!==e.chainId||n.escrow.toLowerCase()!==e.escrow.toLowerCase())throw Error(`close snapshot payment scope does not match local session`);let r=BigInt(n.acceptedCumulative),i=BigInt(n.spent);if(r<0n||i<0n)throw Error(`close snapshot amounts must not be negative`);if(i>r)throw Error(`close snapshot spent exceeds accepted cumulative amount`);if(r>e.cumulativeAmount)throw Error(`close snapshot accepted cumulative exceeds local voucher state`);return{acceptedCumulative:r,spent:i}}function A(e,t){let n=k(e.channel,t);if(!n)return;let{acceptedCumulative:r,spent:i}=n;if(a.spent>r)throw Error(`close snapshot accepted cumulative is below locally confirmed spend`);return i>a.spent&&(a.spent=i),n}function j(e,t=e.challenge,n=!1){let r=(n?A(e,t):k(e.channel,t))?.acceptedCumulative??O(t,e.channelId);if(r>e.channel.cumulativeAmount)throw Error(`fallback close amount exceeds local voucher state`);return M(r),r.toString()}function M(e){Os({cumulativeAmount:e,maxVoucherCumulative:n.maxVoucherCumulative})}async function N(e){let{knownDeposit:t,...r}=e,i=await Uc({...r,channel:a.channel,createSessionCredential:C,fetch:n.fetch});w(i);let o=Pc({additionalDeposit:e.additionalDeposit,channel:a.channel,channelId:e.channelId,challengeId:a.lastChallenge?.id,currentState:a.state,knownDeposit:t,receipt:i,spent:a.spent});return o?.channel&&a.lastChallenge&&(await f.set(o.channel),g({type:`activated`,challengeId:a.lastChallenge.id,entry:o.channel,spent:a.spent.toString(),units:_()}),v(o.channel)),i}async function ee(e){let t=a.channel?.channelId===e.channelId?a.channel.deposit:0n,r=t>e.deposit?t:e.deposit,i=Ns({deposit:r,maxDeposit:n.maxVoucherCumulative,requiredCumulative:e.requiredCumulative,suggestedDeposit:e.challenge.request.suggestedDeposit===void 0?void 0:BigInt(e.challenge.request.suggestedDeposit),topUpAmount:n.topUpAmount});i!==0n&&await N({challenge:e.challenge,input:e.input,channelId:e.channelId,additionalDeposit:i,knownDeposit:r})}async function te(e,t){let n=Ws({channel:a.channel,channelId:e,challengeId:a.lastChallenge?.id,cumulativeAmount:t,spent:a.spent,state:a.state});n&&a.channel&&(g({type:`activated`,challengeId:n.challengeId,entry:a.channel,spent:n.spent,units:n.units}),await c.set(a.channel))}async function ne(e){let t=Ks(e,a.channel);a.channel=t.channel,a.spent=t.spent,a.state=t.state,a.channel?.opened&&await c.set(a.channel)}function P(e){let t=e.headers.get(L.paymentReceipt),n=t?vo(t):null;return w(n),Object.assign(e,{receipt:n,challenge:a.lastChallenge,channelId:a.channel?.channelId??null,cumulative:a.channel?.cumulativeAmount??0n})}async function re(e,t){if(u)throw Error(`SessionManager: a request is already in flight; concurrent requests on one manager are not supported`);a.lastUrl=e;let r=Gs({channel:a.channel,spent:a.spent,state:a.state}),i={challengesReceived:0,committed:void 0,created:new Map,previous:r,seenExisting:new Set,resumed:void 0,trackCreates:!1};u=i;try{await D(e,t),i.trackCreates=!0;let s=Tl(e,t,a.channel?.opened?a.channel.channelId:void 0);o&&(s={...s,context:o});let c=!r.channel?.opened;async function l(){let n=i.resumed;return!c||!n?!1:(c=!1,await p(n),s=Tl(e,t,void 0),!0)}for(;;){let t;try{t=await S(e,s)}catch(e){if(i.created.size?await m():await ne(i.committed??r),await l())continue;throw e}let o=P(t),c=!1;if(o.status===402){let t=await Gc({input:e,init:s,response:o,createSessionCredential:C,fetch:n.fetch,getChannel:()=>a.channel,restoreCumulative:te,setChallenge(e){a.lastChallenge=e},topUpIfNeeded:ee});t&&(c=!0,o=P(t))}if(!c&&!o.ok&&!o.receipt){if(i.created.size?await m():await ne(i.committed??r),await l())continue;return o}return o}}finally{u=void 0}}async function ie(e){let t=await qc({createSessionCredential:C,fetch:n.fetch,getMinimumSpent:()=>a.spent,lastUrl:a.lastUrl,resolveSignedCloseAmount:t=>j(e,t,!0),signedCloseAmount:j(e),setChallenge(e){a.lastChallenge=e},target:e});return t&&(T(),g({type:`closeStarted`}),g({type:`closed`,receipt:t})),t}let ae={createSessionCredential:C,doFetch:re,fetch:n.fetch,getChannel:()=>a.channel,getChallenge:()=>a.lastChallenge,assertVoucherWithinLocalLimit:M,acceptReceipt(e){w(e)},topUpIfNeeded:ee},oe={get channelId(){return a.channel?.channelId},get cumulative(){return a.channel?.cumulativeAmount??0n},get opened(){return a.channel?.opened??!1},get state(){return a.state},fetch:re,async topUp(e){let t=Nc({amount:e,assertVoucherWithinLocalLimit:M,channel:a.channel,decimals:n.decimals,lastChallenge:a.lastChallenge,lastUrl:a.lastUrl});return N({additionalDeposit:t.additionalDeposit,challenge:t.challenge,channelId:t.channelId,input:t.input})},async sse(e,t){return Jc(e,t,ae)},async ws(e,t){if(!n.WebSocket)throw Error("No WebSocket implementation available. Pass `webSocket` to sessionManager() in this runtime.");let r=Vc(e),i=t?.signal?{signal:t.signal}:void 0;await D(r,i);let o=a.channel?.opened?a.channel.channelId:void 0,{challenge:c,credential:l,httpUrl:u,wsUrl:d}=await rl({async createSessionCredential(e,t){return a.lastChallenge=e,await ni(b,{challenge:e,context:t,fetch:n.fetch,input:r}),C(e,t)},fetch:n.fetch,input:e,onProbeUrl(e){a.lastUrl=e.toString()},probeInit:Tl(r,i,o),signal:t?.signal});return a.lastChallenge=c,cl({challenge:c,credential:l,httpUrl:u,WebSocket:n.WebSocket,wsUrl:d,options:t,createSessionCredential:C,getChannel:()=>a.channel,setSocketSession(e){a.socketSession=e},async refreshChallenge(){let e=await nl({fetch:n.fetch,input:u,probeInit:Tl(u,i,a.channel?.opened?a.channel.channelId:void 0),signal:t?.signal});return a.lastChallenge=e.challenge,e.challenge},assertVoucherWithinLocalLimit:M,acceptReceipt:w,rejectCloseReady:s.rejectCloseReady,rejectReceipt:s.rejectReceipt,settleCloseReady:s.settleCloseReady,settleReceipt:s.settleReceipt,topUpIfNeeded:ee,waitForReceipt:s.waitForReceipt})},async close(){let e=a.socketSession,t=Fs({channel:a.channel,currentSocket:e,lastChallenge:a.lastChallenge});if(!t)return;let n=e?.socket;if(e&&n?.readyState===Ac.OPEN){let r=await qs({activeSocket:n,createSessionCredential:C,currentSocket:e,spent:a.spent,target:t,waitForCloseReady:s.waitForCloseReady,waitForReceipt:s.waitForReceipt});return T(),g({type:`closeStarted`}),g({type:`closed`,receipt:r}),r}return ie(t)}};return bl(oe,{consumeSseResponse(e,t,n){return Yc(e,t,n,ae)},rehydrate({channel:e,challenge:t,input:n,spent:r}){if(!e.opened)throw Error(`Cannot restore a closed session channel.`);if(!Ic(t))throw Error(`Cannot restore session: challenge is not tempo/session.`);if(r<0n)throw Error(`Cannot restore session: spent must not be negative.`);if(r>e.cumulativeAmount)throw Error(`Cannot restore session: spent exceeds local voucher state.`);M(e.cumulativeAmount);let i=k(e,t),o=i&&i.spent>r?i.spent:r;a.lastUrl=n,a.lastChallenge=t,a.channel=e,a.spent=o,g({type:`challengeReceived`,challengeId:t.id}),g({type:`activated`,challengeId:t.id,entry:e,spent:o.toString(),units:0})}}),oe}(function(e){e.serializeSnapshot=ys,e.deserializeSnapshot=bs})(Ol||={});const kl=(1n<<64n)-1n,Al={dev_second:1n,day:86400n,week:604800n};function jl(e){return e instanceof Date?e:new Date(e)}function Ml(e){let t=e.getTime();if(!Number.isFinite(t))throw new K({reason:`subscriptionExpires is invalid`});if(t%1e3!=0)throw new K({reason:`subscriptionExpires must be representable as whole seconds`});let n=t/1e3;if(n<=0||!Number.isSafeInteger(n))throw new K({reason:`subscriptionExpires cannot be represented in a Tempo key authorization`});return n}function Nl(e){if(!/^[1-9]\d*$/.test(e.periodCount))throw new K({reason:`periodCount is invalid`});let t=Al[e.periodUnit];if(t===void 0)throw new K({reason:`periodUnit is invalid`});let n=BigInt(e.periodCount)*t;if(n>kl)throw new K({reason:`subscription period cannot be represented as an unsigned 64-bit integer`});if(n>BigInt(2**53-1))throw new K({reason:`subscription period cannot be represented exactly by this Tempo client`});return Number(n)}function Pl(e){let{challengeExpires:t,request:n}=e;Nl(n);let r=Ml(jl(n.subscriptionExpires));if(t){let e=Math.floor(new Date(t).getTime()/1e3);if(!Number.isFinite(e)||r<=e)throw new K({reason:`subscriptionExpires must be strictly later than challenge expires`})}}function Fl(e){return[{address:$(e.currency,`currency`),selector:`0x95777d59`,recipients:[$(e.recipient,`recipient`)]}]}function Il(e){try{let t=w.fromBytes(x.toBytes(e));if(w.size(t)!==32)throw Error(`invalid challenge id size`);return t}catch{throw new K({reason:`challenge id must encode 32 bytes`})}}async function Ll(e){let{accessKey:t,account:n,challengeId:r,chainId:i,request:a}=e;if(typeof n.sign!=`function`)return;let o=zl({accessKey:t,challengeId:r,chainId:i,request:a}),s=await n.sign({hash:F.getSignPayload(o)}),c=I.from(s);if(c.type===`keychain`||c.type===`multisig`)throw new K({reason:`keyAuthorization must use a primitive signature`});return F.from(o,{signature:s})}function Rl(e){let{accessKey:t,challengeId:n,chainId:r,payload:i,request:a}=e;if(i.type!==`keyAuthorization`)throw new K({reason:`invalid keyAuthorization payload`});let o=Bl(i.signature),s=Vl(o);if(Hl({accessKey:t,authorization:o,chainId:r}),o.witness?.toLowerCase()!==Il(n))throw new K({reason:`keyAuthorization challenge mismatch`});return Ul(o,a),Gl(Wl(o),a),Kl(o.scopes,a),{authorization:o,source:{address:ql(o,s),chainId:r}}}function zl(e){let{accessKey:t,challengeId:n,chainId:r,request:i}=e;return F.from({address:$(t.accessKeyAddress,`accessKeyAddress`),chainId:BigInt(r),expiry:Ml(jl(i.subscriptionExpires)),limits:[{token:$(i.currency,`currency`),limit:BigInt(i.amount),period:Nl(i)}],scopes:Fl(i),type:t.keyType,witness:Il(n)})}function Bl(e){try{return F.deserialize(e)}catch(e){throw e instanceof F.InvalidSignatureTypeError?new K({reason:`keyAuthorization must use a primitive signature`}):new K({reason:`invalid keyAuthorization payload`})}}function Vl(e){let t=e.signature;if(!t)throw new K({reason:`keyAuthorization must use a primitive signature`});return t}function Hl(e){let{accessKey:t,authorization:n,chainId:r}=e;if(n.chainId!==BigInt(r))throw new K({reason:`keyAuthorization chainId mismatch`});if(t){if(!u(n.address,$(t.accessKeyAddress,`accessKeyAddress`)))throw new K({reason:`keyAuthorization access key mismatch`});if(n.type!==t.keyType)throw new K({reason:`keyAuthorization key type mismatch`})}}function Ul(e,t){if(Pl({request:t}),e.expiry!==Ml(jl(t.subscriptionExpires)))throw new K({reason:`keyAuthorization expiry mismatch`})}function Wl(e){let[t]=e.limits??[];if(!t||e.limits?.length!==1)throw new K({reason:`keyAuthorization must contain exactly one token limit`});return t}function Gl(e,t){if(!u(e.token,$(t.currency,`currency`)))throw new K({reason:`keyAuthorization currency mismatch`});if(e.limit!==BigInt(t.amount))throw new K({reason:`keyAuthorization amount mismatch`});if(e.period!==Nl(t))throw new K({reason:`keyAuthorization period mismatch`})}function Kl(e,t){if(!e||e.length!==1)throw new K({reason:`keyAuthorization must contain a recipient-scoped transferWithMemo call`});let n=$(t.currency,`currency`),r=$(t.recipient,`recipient`),i=new Set;for(let t of e){if(!u(t.address,n))throw new K({reason:`keyAuthorization call target mismatch`});let e=Jl(t.selector);if(e!==`0xa9059cbb`&&e!==`0x95777d59`)throw new K({reason:`keyAuthorization selector not allowed`});if(i.has(e))throw new K({reason:`keyAuthorization duplicate selector`});if(i.add(e),t.recipients?.length!==1||!u(t.recipients[0],r))throw new K({reason:`keyAuthorization recipient mismatch`})}if(!i.has(`0x95777d59`))throw new K({reason:`keyAuthorization must allow transferWithMemo`})}function ql(e,t){let n=F.getSignPayload(e);try{let e=I.extractAddress({payload:n,signature:t});if(!I.verify(t,{address:e,payload:n}))throw new K({reason:`keyAuthorization signature is invalid`});return e}catch(e){throw e instanceof K?e:new K({reason:`keyAuthorization signature is invalid`})}}function $(e,t){if(!l(e))throw new K({reason:`${t} must be an address`});return e.toLowerCase()}function Jl(e){return typeof e==`string`?e.toLowerCase():``}const Yl=z.object({accessKey:z.optional(z.custom()),account:z.optional(z.custom())});function Xl(e={}){let t=Zi({chain:N,getClient:e.getClient,rpcUrl:Bn}),n=qi({account:e.account});return At(Ma,{context:Yl,async createCredential({challenge:r,context:i}){let a=r.request.methodDetails?.chainId??Y.testnet,o=await t({chainId:a}),s=n(o,i),c=i?.accessKey??e.accessKey??r.request.methodDetails?.accessKey;if(!c)throw Error("No `accessKey` provided. The subscription challenge must include `accessKey`, or the client must pass one to parameters/context.");Ql(r.request),await e.validateRequest?.(r.request);let l=await Zl(o,{accessKey:c,account:s,challengeId:r.id,chainId:a,request:r.request}),d=Rl({accessKey:c,challengeId:r.id,chainId:a,payload:{signature:F.serialize(l),type:`keyAuthorization`},request:r.request});if(!u(d.source.address,s.address))throw Error(`keyAuthorization signer does not match the selected account`);return G({challenge:r,payload:{signature:F.serialize(l),type:`keyAuthorization`},source:`did:pkh:eip155:${a}:${s.address.toLowerCase()}`})}})}async function Zl(e,t){let{accessKey:n,account:r,challengeId:i,chainId:a,request:o}=t,s=await Ll({accessKey:n,account:r,challengeId:i,chainId:a,request:o});if(s)return s;let c=await e.request({method:`wallet_authorizeAccessKey`,params:[{address:n.accessKeyAddress,expiry:Ml(jl(o.subscriptionExpires)),keyType:n.keyType,limits:[{token:o.currency,limit:w.fromNumber(BigInt(o.amount)),period:Nl(o)}],scopes:Fl(o),witness:Il(i)}]});return F.fromRpc(c.keyAuthorization)}function Ql(e){Nl(e),Ml(jl(e.subscriptionExpires))}const $l=Object.assign(vl,{manager:Ol}),eu=Object.assign(Oo,{method:ro});function tu(e={}){return[Fa(e),$l(e)]}(function(e){e.charge=Fa,e.common=tu,e.session=$l,e.sessionLegacy=eu,e.subscription=Xl})(tu||={});const nu=M.union([M.boolean(),M.literal(`true`).transform(()=>!0),M.literal(`false`).transform(()=>!1)]);async function ru(e){process.stdout.write(Buffer.from(await e.arrayBuffer()))}const iu=M.object({allowCustomEscrow:M.optional(nu),autoSwap:M.optional(nu),channel:M.optional(M.coerce.string()),deposit:M.optional(M.union([M.string(),M.number()])),payWith:M.optional(M.string()),slippage:M.optional(M.coerce.number()),tokenIn:M.optional(M.string())}),au=[`allowCustomEscrow`,`autoSwap`,`channel`,`deposit`,`payWith`,`slippage`,`tokenIn`];function ou(){let t;return or({method:`tempo`,supports(e){return e.method===`tempo`&&[`charge`,`session`].includes(e.intent)},async setup({challenge:n,options:r,methodOpts:i}){let a=nr(r.account),o=n.request,s=o.currency,l=fu(i),u=gu({autoSwap:l.autoSwap??r.autoSwap,payWith:l.payWith??r.payWith,slippage:l.slippage??r.slippage,tokenIn:l.tokenIn}),d=s??``,f=o.decimals??6,p,m,h,g=!1,_=process.env.MPPX_PRIVATE_KEY?.trim()||(Hn(a)?void 0:await rr(a).get());if(!_&&Hn(a)&&Tu()){g=!0;let t=Cu(a);if(t){let i=Gn(r.rpcUrl,{network:r.network});h=e({chain:await Kn({network:r.network,rpcUrl:i}),transport:c(i)}),mu({challenge:n,clientChainId:h.chain?.id}),p=h.chain?.blockExplorers?.default?.url;let a=s?await Yn(h,s,t.wallet_address).catch(()=>void 0):void 0;d=a?.symbol??s??``,f=a?.decimals??o.decimals??6}}else if(_)m=ce(_);else{let e=Du();if(e){let t=await rr(e).get();t&&(m=ce(t))}if(!m)throw r.account?new J({code:`ACCOUNT_NOT_FOUND`,message:`Account "${a}" not found.`,exitCode:69}):new J({code:`ACCOUNT_NOT_FOUND`,message:`No account found.`,exitCode:69})}if(!g&&m){let t=Gn(r.rpcUrl,{network:r.network});h=e({chain:await Kn({network:r.network,rpcUrl:t}),transport:c(t)}),mu({challenge:n,clientChainId:h.chain?.id}),p=h.chain?.blockExplorers?.default?.url;let i=s?await Yn(h,s,m.address).catch(()=>void 0):void 0;d=i?.symbol??s??``,f=i?.decimals??o.decimals??6}if(g)return{tokenSymbol:d,tokenDecimals:f,explorerUrl:p,methods:[],async createCredential(e){let t=e.headers.get(`www-authenticate`);if(!t)throw Error(`No WWW-Authenticate header in 402 response.`);return Eu(t)}};if(!m||!h)throw new J({code:`ACCOUNT_NOT_FOUND`,message:`Tempo requires a configured account.`,exitCode:69});let v=tu({account:m,...l.allowCustomEscrow===void 0?{}:{allowCustomEscrow:l.allowCustomEscrow},getClient:()=>h,...u===void 0?{}:{autoSwap:u},maxDeposit:(()=>{if(n.intent!==`session`)return;let e=n.request.suggestedDeposit,t=(l.deposit===void 0?void 0:String(l.deposit))??e??(Jn(h.chain)?`10`:void 0);if(!t)throw new J({code:`MISSING_DEPOSIT`,message:`Session payment requires a deposit. Use -M deposit=<amount> or connect to testnet.`,exitCode:2});return t})()}),y=(()=>{if(!l.channel)return;let e=l.channel,t=vu(e);return{channelId:e,...t!==void 0&&{cumulativeAmountRaw:t.toString()}}})();return t={descriptor:void 0,async signVoucher({channelId:e,cumulativeAmount:r,escrowContract:i,chainId:a,action:o=`voucher`}){let s=t?.descriptor;if(!s)throw Error(`session descriptor not available`);return G({challenge:n,payload:{action:o,channelId:e,descriptor:s,cumulativeAmount:r.toString(),signature:await Go(h,m,{channelId:e,cumulativeAmount:r},i,a)},source:`did:pkh:eip155:${a}:${m.address}`})},source:`did:pkh:eip155:${h.chain.id}:${m.address}`},{tokenSymbol:d,tokenDecimals:f,explorerUrl:p,methods:[...v],credentialContext:y}},prepareCredentialRequest({challenge:e,headers:t}){e.intent===`session`&&(t.Accept=`text/event-stream`)},async handleResponse(e){if(e.challenge.intent!==`session`||!t)return!1;let{challenge:n,credential:r,response:i,fetchUrl:a,fetchInit:o,verbose:s}=e,{silent:c,confirmEnabled:l,tokenSymbol:u,tokenDecimals:d,explorerUrl:f,shownKeys:p}=e,m=c?e=>{}:e=>process.stderr.write(e),h=xt(r),g=n.request,_=g.methodDetails,v=h.payload.channelId,y=_?.escrowContract??_?.escrow??`0x4d50500000000000000000000000000000000000`,b=_?.chainId??0,S=BigInt(g.amount),C=`cumulativeAmount`in h.payload&&h.payload.cumulativeAmount?BigInt(h.payload.cumulativeAmount):0n;if(`descriptor`in h.payload&&(t.descriptor=h.payload.descriptor),s>=1){if(h.payload.action===`open`){let e=g.suggestedDeposit,t=e?` ${X.dim(`(deposit ${e} ${u})`)}`:``;m(`${l?``:`
|
|
10
|
-
`}${
|
|
11
|
-
`}${
|
|
12
|
-
`})}catch{}return(w.headers.get(`Content-Type`)??``).includes(`text/event-stream`)?await
|
|
13
|
-
`),l&&!await e.confirm(`Close channel?`,!0)?s>=1&&m(`${
|
|
14
|
-
`)}function
|
|
9
|
+
`?2:t+1===e.length&&!n?0:1:0}function tl(e){let t=new AbortController,n=()=>t.abort(e.signal?.reason);e.signal?.addEventListener(`abort`,n,{once:!0}),e.signal?.aborted&&n();let r=Qc({...e,signal:t.signal}),i=new TextEncoder,a=new Headers(e.response.headers);a.delete(`content-length`);let o=()=>e.signal?.removeEventListener(`abort`,n),s=new Response(new ReadableStream({async pull(e){try{let t=await r.next();if(t.done)return o(),e.close();e.enqueue(i.encode(t.value.raw))}catch(e){throw o(),e}},async cancel(){o(),t.abort(),await r.return(void 0)}}),{headers:a,status:e.response.status,statusText:e.response.statusText});for(let t of[`redirected`,`type`,`url`])Object.defineProperty(s,t,{configurable:!0,get:()=>e.response[t]});return s}async function nl(e,t){let n=e.driver.getChannel();if(!n||!e.challenge)return;let r=await Ic({assertVoucherWithinLocalLimit:e.driver.assertVoucherWithinLocalLimit,challenge:e.challenge,event:t,expectedChannelId:n.channelId,getChannel:e.driver.getChannel,input:e.input,topUpIfNeeded:e.driver.topUpIfNeeded});if(r.status!==`ready`)return;let i=await Gc({challenge:e.challenge,context:r.context,createSessionCredential:e.driver.createSessionCredential,fetch:e.driver.fetch,input:e.input});if(!i.ok)throw Error(`Voucher POST failed with status ${i.status}`)}async function rl(e){let t=new URL(e.input.toString()),n=Hc(t);e.onProbeUrl?.(n);let r=await e.fetch(n,{...e.probeInit,...e.signal?{signal:e.signal}:{}});if(r.status!==402)throw Error(`Expected a 402 payment challenge from ${n}, received ${r.status} instead.`);let i=dt(r).find(Rc);if(!i)throw Error(`No payment challenge received from HTTP endpoint for this WebSocket URL. The server may not require payment or did not advertise a challenge.`);return{challenge:i,httpUrl:n,wsUrl:t}}async function il(e){let t=await rl(e);return{...t,credential:await e.createSessionCredential(t.challenge,{})}}function al(e){let{challenge:t,credential:n,socket:r}=e;return{challenge:t,channelId:bt(n).payload.channelId,closeReadyReceipt:null,deliveredChunks:0n,expectedCloseAmount:null,socket:r,tickCost:go(t)}}function ol(e){let{challengeId:t,channelId:n,receipt:r}=e;return r.challengeId===t&&r.channelId===n}function sl(e){if(!ol(e))return`received mismatched payment-close-ready frame`;let t=so(e.receipt.spent);if(t===void 0)return`received invalid payment-close-ready spend`;if(t>e.cumulativeAmount)return`received payment-close-ready beyond local voucher state`}function cl(e){let{challengeId:t,channelId:n,expectedCloseAmount:r,receipt:i}=e;if(!ol(e))return`received mismatched payment-receipt frame`;if(r!==null&&i.txHash&&!zs({challengeId:t,channelId:n,expectedCloseAmount:r,minimumSpent:BigInt(r),receipt:i}))return`received mismatched payment-close receipt frame`}async function ll(e){let{challenge:t,credential:n,options:r,WebSocket:i,wsUrl:a}=e,o=new i(a,r?.protocols),s=al({challenge:t,credential:n,socket:o});e.setSocketSession(s);let c=Mc(o),l=t=>{e.rejectReceipt(Error(t)),e.rejectCloseReady(Error(t)),(o.readyState===jc.CONNECTING||o.readyState===jc.OPEN)&&o.close(3008,t)};return o.addEventListener(`close`,t=>{s.socket=null,s.expectedCloseAmount=null,e.rejectReceipt(Error(`WebSocket closed before the payment flow completed.`)),e.rejectCloseReady(Error(`WebSocket closed before the payment flow completed.`)),c.emit(`close`,{code:t.code??1e3,reason:t.reason??``,type:`close`,wasClean:!0})}),o.addEventListener(`error`,()=>{c.emit(`error`,{type:`error`})}),o.addEventListener(`message`,async t=>{let n=typeof t.data==`string`?t.data:void 0;n&&await dl({driver:e,failSocketFlow:l,managedEmit:c.emit,message:n,rawSocket:o,socketState:s})}),r?.signal?.addEventListener(`abort`,()=>{e.rejectReceipt(Error(`WebSocket payment flow aborted.`)),e.rejectCloseReady(Error(`WebSocket payment flow aborted.`)),o.close()},{once:!0}),await ul(o,c.emit,a),o.send(Co(n)),await e.waitForReceipt(),c.socket}function ul(e,t,n){return new Promise((r,i)=>{let a=()=>{e.removeEventListener(`error`,o),t(`open`,{type:`open`}),r()},o=()=>{e.removeEventListener(`open`,a),i(Error(`WebSocket connection to ${n} failed to open.`))};e.addEventListener(`open`,a,{once:!0}),e.addEventListener(`error`,o,{once:!0})})}async function dl(e){let t=To(e.message);if(!t){e.managedEmit(`message`,{data:e.message,type:`message`});return}switch(t.mpp){case`authorization`:return;case`message`:e.socketState.deliveredChunks+=1n,e.managedEmit(`message`,{data:t.data,type:`message`});return;case`payment-close-ready`:fl(e,t.data);return;case`payment-error`:e.driver.rejectReceipt(Error(t.message)),e.driver.rejectCloseReady(Error(t.message));return;case`payment-need-voucher`:await pl(e,t.data);return;case`payment-receipt`:ml(e,t.data);return}}function fl(e,t){let n=e.driver.getChannel()?.cumulativeAmount??0n,r=sl({challengeId:e.driver.challenge.id,channelId:e.socketState.channelId,cumulativeAmount:n,receipt:t});if(r){e.failSocketFlow(r);return}e.driver.acceptReceipt(t),e.driver.options?.onReceipt?.(t),e.driver.settleCloseReady(t),e.managedEmit(`close`,{code:1e3,reason:`stream complete`,type:`close`,wasClean:!0})}async function pl(e,t){try{let n=e.driver.challenge;n.expires&&new Date(n.expires).getTime()<=Date.now()+5e3&&(n=await e.driver.refreshChallenge(),e.driver.challenge=n,e.socketState.challenge=n);let r=await Ic({assertVoucherWithinLocalLimit:e.driver.assertVoucherWithinLocalLimit,challenge:n,event:t,expectedChannelId:e.socketState.channelId,getChannel:e.driver.getChannel,input:e.driver.httpUrl,topUpIfNeeded:e.driver.topUpIfNeeded});if(r.status===`ignored`){e.failSocketFlow(r.reason===`channel-mismatch`?`received mismatched payment-need-voucher frame`:`cannot create voucher: no active channel`);return}let i=await e.driver.createSessionCredential(n,r.context);e.rawSocket.send(Co(i))}catch(t){e.failSocketFlow(t instanceof Error?t.message:`failed to create websocket voucher`)}}function ml(e,t){let n=cl({challengeId:e.driver.challenge.id,channelId:e.socketState.channelId,expectedCloseAmount:e.socketState.expectedCloseAmount,receipt:t});if(n){e.failSocketFlow(n);return}e.driver.acceptReceipt(t),e.driver.options?.onReceipt?.(t),e.driver.settleReceipt(t)}const hl=new WeakMap;async function gl(e,t){let n=hl.get(e)??new Map;hl.set(e,n);let r=n.get(t),i,a=new Promise(e=>{i=e});return n.set(t,a),await r,()=>{i(),n.get(t)===a&&n.delete(t)}}function _l(e,t){try{return t?.channelId.toLowerCase()===e.channelId.toLowerCase()&&BigInt(t.acceptedCumulative)===e.cumulativeAmount}catch{return!1}}function vl(e,t,n){try{let r=e.response?.headers.get(R.paymentReceipt);if(r){let e=yo(r);if(e.challengeId===t.id&&_l(n,e))return!0}}catch{}return e.challenges?.some(e=>Rc(e)?_l(n,zc(e)):!1)??!1}function yl(e={}){let{account:t,allowCustomEscrow:n=!1,autoSwap:r,channelStore:i,decimals:a=6,escrow:o,allowedChainIds:s,getClient:c,maxDeposit:l,topUpAmount:u,onChannelUpdate:f,resolveAccount:p}=e,m=Xi({chain:y,getClient:c,rpcUrl:zn}),h=Ki({account:t}),g=l===void 0?void 0:d(l,a),_=u===void 0?void 0:d(u,a),v=i??us(),b={store:v,notifyUpdate:e=>f?.(e)},x=async(e,t,n)=>{let r=h(e.client,t),i=t?.action?t.descriptor:n?.descriptor??hc({context:t,snapshot:e.snapshot})?.descriptor;return await p?.({account:r,chainId:e.chainId,operation:{kind:`authorizePaymentChannel`,...i?{authority:jo(i)}:{}}})??r},S=async(e,t,n)=>yc({account:await x(e,t,n),entry:n,context:t,decimals:a,maxDeposit:g,resolved:e}),C=kt(Ma,{canHandleChallenge:({challenge:e})=>Rc(e),context:tc,async createCredential(e){let{challenge:t,context:i}=e,a=await fc({allowCustomEscrow:n,challenge:t,escrowOverride:o,allowedChainIds:s,getClient:m}),c=si(e),l=()=>{};try{let e=!nc(i)&&i?.descriptor===void 0;e&&(l=await gl(v,a.key),c&&(await v.get(a.key))?.opened&&await c.prepare());let n=await v.get(a.key),o=await S(a,i,n);if(!e&&c&&o.type===`open`){l=await gl(v,a.key);let e=await v.get(a.key);e?.channelId!==n?.channelId&&(n=e,n?.opened&&(await c.prepare(),n=await v.get(a.key)),o=await S(a,i,n))}let s,u=c&&o.type===`open`?{store:{get:e=>v.get(e),async set(e){s=e},delete:e=>v.delete(e)},notifyUpdate(){}}:b,d=await ns(t,await bc(o,u,oa(i?.autoSwap??r,ia)),a.chainId,o.account);if(c&&s){let e=s;c.settle=async n=>{let r=n.status===`accepted`||vl(n,t,e);if(!r&&n.status===`pending`)return!1;try{if(r){let t=await v.get(a.key);(!t?.opened||t.channelId.toLowerCase()!==e.channelId.toLowerCase())&&(await v.set(e),b.notifyUpdate(e))}return!0}finally{l()}}}else l();return d}catch(e){throw l(),e}}}),w=async({challenge:e,channel:t,deposit:n,fetch:r,input:i,requiredCumulative:a})=>{let o=t.deposit>n?t.deposit:n,s=Ps({deposit:o,maxDeposit:g,requiredCumulative:a,suggestedDeposit:e.request.suggestedDeposit===void 0?void 0:BigInt(e.request.suggestedDeposit),topUpAmount:_});s>0n&&await Wc({additionalDeposit:s,challenge:e,channel:t,channelId:t.channelId,createSessionCredential:(e,t)=>C.createCredential({challenge:e,context:t}),fetch:r,input:i});let c=o+s;if(c===t.deposit)return;let l=await v.get(ls(t)),u=l?.channelId.toLowerCase()===t.channelId.toLowerCase()?l:t,d={...u,deposit:u.deposit>c?u.deposit:c};await v.set(d),b.notifyUpdate(d)};return $r(C,async({challenge:e,context:t,fetch:r,input:i})=>{if(!Rc(e))return;let a=t===void 0?void 0:tc.parse(t);if(nc(a))return;let c=await fc({allowCustomEscrow:n,challenge:e,escrowOverride:o,allowedChainIds:s,getClient:m}),l=await v.get(c.key);if(!l?.opened)return;let u=c.snapshot?.channelId.toLowerCase()===l.channelId.toLowerCase()?c.snapshot:void 0,d=l.cumulativeAmount+go(e),f=u?BigInt(u.requiredCumulative):d,p=f>d?f:d,h=u?BigInt(u.deposit):l.deposit,g=h>l.deposit?h:l.deposit;p<=g&&g===l.deposit||!vc(await x(c,a,l),l.descriptor)||await w({challenge:e,channel:l,deposit:g,fetch:r,input:i,requiredCumulative:p})}),ii(C,async({challenge:e,credential:t,fetch:r,headers:i,input:a,refetch:c,response:l,signal:u})=>{if(!Rc(e))return l;if(!bo(l))return ho(bt(t).payload).action===`open`&&i.get(`accept`)?.toLowerCase().includes(`text/event-stream`)?await c?.()??l:l;let d=(await fc({allowCustomEscrow:n,challenge:e,escrowOverride:o,allowedChainIds:s,getClient:m})).key,f=await v.get(d),p={assertVoucherWithinLocalLimit:e=>Fs(e,g),createSessionCredential:(e,t)=>C.createCredential({challenge:e,context:t}),fetch:r,getChannel:()=>f??null,async topUpIfNeeded({deposit:t,requiredCumulative:n}){f&&await w({challenge:e,channel:f,deposit:f.deposit>t?f.deposit:t,fetch:r,input:a,requiredCumulative:n})}};return tl({onNeedVoucher:t=>nl({challenge:e,driver:p,input:a},t),onReceipt(){},response:l,signal:u})})}const bl=new WeakMap;function xl(e,t){bl.set(e,t)}function Sl(e){let t=null;return{wait(n=()=>!0){if(t)throw Error(`${e} wait already in progress`);return new Promise((e,r)=>{t={predicate:n,resolve:e,reject:r}})},settle(e){if(!t||!t.predicate(e))return;let n=t;t=null,n.resolve(e)},reject(e){if(!t)return;let n=t;t=null,n.reject(e)}}}function Cl(e){let t=Sl(`close-ready`),n=Sl(`receipt`);return{waitForReceipt(e){return n.wait(e)},waitForCloseReady(){let n=e.getSocketSession()?.closeReadyReceipt;return n?Promise.resolve(n):t.wait()},settleReceipt(e){n.settle(e)},settleCloseReady(n){let r=e.getSocketSession();r&&r.challenge.id===n.challengeId&&r.channelId===n.channelId&&(r.closeReadyReceipt=n),t.settle(n)},rejectReceipt(e){n.reject(e)},rejectCloseReady(e){t.reject(e)}}}function wl(e){return e.method===He.tempo&&e.intent===Ue.charge}function Tl(e){if(!wl(e)||typeof e.request.amount!=`string`)return!1;try{return BigInt(e.request.amount)===0n}catch{return!1}}function El(e,t,n){if(!n)return t;let r={...Q(e instanceof Request?e.headers:void 0),...Q(t?.headers)};return Object.keys(r).some(e=>e.toLowerCase()===R.paymentSession.toLowerCase())?t:{...t,headers:{...r,[R.paymentSession]:n}}}function Dl(e,t){return e===void 0?t:{...tc.parse(e),...t}}function Ol(e){let t=e.decimals??6,n=e.webSocket??globalThis.WebSocket;return{decimals:t,fetch:e.fetch??globalThis.fetch.bind(globalThis),maxVoucherCumulative:e.maxDeposit===void 0?null:d(e.maxDeposit,t),topUpAmount:e.topUpAmount===void 0?null:d(e.topUpAmount,t),WebSocket:n}}function kl(e){let t=e.client?.chain?.id;(t!==void 0||e.allowedChainIds?.length===0)&&Qi(e.allowedChainIds,t);let n=e.allowCustomEscrow??!1,r=Ol(e),i=Xi({chain:y,getClient:e.client?()=>e.client:e.getClient,rpcUrl:zn}),a=Ki({account:e.account}),o=Vs(),s=e.credentialContext===void 0?void 0:Dl(e.credentialContext,{}),c=Cl({getSocketSession:()=>o.socketSession}),l=e.channelStore??us(),u=new Set,d;async function f(e){let t=await l.get(e);if(t?.opened&&!u.has(t.channelId))return t}let p={async get(e){let t=await f(e);return t&&d&&(d.seenExisting.add(e),!d.committed&&!d.created.has(e)&&(d.resumed??=t)),t},async set(e){let t=ls(e);e.opened&&u.delete(e.channelId),d?.trackCreates&&!d.seenExisting.has(t)&&d.created.set(t,e),await l.set(e)},delete:e=>l.delete(e)};async function m(e){let t=ls(e);u.add(e.channelId),d?.seenExisting.delete(t),d?.resumed===e&&(d.resumed=void 0),await Promise.resolve(l.delete(t)).catch(()=>void 0)}async function h(){let e=d;if(e?.created.size){for(let[t,n]of e.created)u.add(n.channelId),await Promise.resolve(l.delete(t)).catch(()=>void 0);e.created.clear(),await F(e.committed??e.previous)}}function g(e){let t=Ke(e.request.methodDetails,We.sessionSnapshot);if(typeof t?.channelId!=`string`)return!1;let n=d;if(!n?.created.size||!o.channel)return!1;for(let[e,r]of n.created)if(r.channelId.toLowerCase()===t.channelId.toLowerCase()&&o.channel.channelId.toLowerCase()===t.channelId.toLowerCase())return n.created.delete(e),n.committed=Ks({channel:o.channel,spent:o.spent,state:o.state}),!0;return!1}function _(e){return Ts(o,e)}function v(){let e=o.state.status===`active`?o.state:d?.committed?.state??d?.previous.state;return e?.status===`active`?e.units:0}function b(e){let t=d,n=t?.committed?.channel?.entry??t?.resumed;!t||n?.channelId.toLowerCase()!==e.channelId.toLowerCase()||e.deposit<=n.deposit||(t.resumed=void 0,t.committed=Ks({channel:o.channel,spent:o.spent,state:o.state}))}let x=yl({account:e.account,allowCustomEscrow:n,autoSwap:e.autoSwap,getClient:e.client?()=>e.client:e.getClient,resolveAccount:e.resolveAccount,escrow:e.escrow,allowedChainIds:e.allowedChainIds,decimals:r.decimals,maxDeposit:e.maxDeposit,topUpAmount:e.topUpAmount,channelStore:p,onChannelUpdate(e){e.channelId!==o.channel?.channelId&&(o.spent=0n),o.channel=e,o.lastChallenge&&_({type:`activated`,challengeId:o.lastChallenge.id,entry:e,spent:o.spent.toString(),units:v()}),b(e)}});ai(x);let S=Ia({allowedChainIds:e.allowedChainIds,account:e.account,getClient:e.client?()=>e.client:e.getClient}),C=fi({fetch:r.fetch,methods:[x],onChallenge:async(e,t)=>{if(!Lc(e))return;let n=d,r=n&&n.challengesReceived>0&&e.id===o.lastChallenge?.id,i=r&&rt(e)===rt(o.lastChallenge);n&&n.challengesReceived++,!i&&(g(e)||(n?.created.size?await h():r&&await F(n.committed??n.previous)),o.lastChallenge=e,_({type:`challengeReceived`,challengeId:e.id}))}});function w(e,t){return x.createCredential({challenge:e,context:Dl(s,t)})}function T(e){Hs({maxVoucherCumulative:r.maxVoucherCumulative,receipt:e,runtime:o})}function E(e=o.state.status===`active`?o.state.units:0){!o.channel||!o.lastChallenge||o.state.status!==`active`&&o.state.status!==`withdrawable`&&o.state.status!==`closeRequested`&&_({type:`activated`,challengeId:o.lastChallenge.id,entry:o.channel,spent:o.spent.toString(),units:e})}async function D(t){let n=t.headers.get(R.paymentSessionSnapshot);if(!n)return;let r=xs(n);Qi(e.allowedChainIds,r.chainId);let s=await i({chainId:r.chainId});Zi(s,r.chainId);let c=a(s),{entry:l,spent:u}=await _c({account:await e.resolveAccount?.({account:c,chainId:r.chainId,operation:{authority:jo(r.descriptor),kind:`authorizePaymentChannel`}})??c,client:s,snapshot:r});return N(l.cumulativeAmount),await Promise.resolve(p.set(l)).catch(()=>void 0),o.channel=l,o.spent=u,l}async function O(t,n){if(!e.bootstrap||o.channel?.opened)return;let i=t instanceof Request?t.headers:void 0,{body:a,method:s,...c}=n??{},l=t instanceof Request?t.url:t,u={...c,method:`HEAD`,headers:{...Q(i),...Q(n?.headers),[R.acceptPayment]:`${He.tempo}/${Ue.charge}`}};try{let e=await r.fetch(l,u);if(e.status!==402)return await D(e);let t=dt(e).find(wl);if(!t||!Tl(t))return;let n=await S.createCredential({challenge:t,context:{}}),i=await r.fetch(l,{...u,headers:{...Q(u.headers),[R.authorization]:n}});return i.ok?await D(i):void 0}catch{return}}function k(e,t){let n=o.socketSession;return Ws({challengeId:e.id,channelId:t,closeReadyReceipt:n?.closeReadyReceipt,cumulativeAmount:o.channel?.channelId===t?o.channel.cumulativeAmount:0n,deliveredChunks:n?.deliveredChunks,socketChallengeId:n?.challenge.id,socketChannelId:n?.channelId,spent:o.spent,tickCost:n?.tickCost})}function A(e,t){let n=zc(t);if(!n)return;if(Mo({...n.descriptor,chainId:n.chainId,escrow:n.escrow}).toLowerCase()!==n.channelId.toLowerCase())throw Error(`close snapshot descriptor does not match its channel ID`);if(n.channelId.toLowerCase()!==e.channelId.toLowerCase())throw Error(`close snapshot channel ID does not match local session`);if(n.chainId!==e.chainId||n.escrow.toLowerCase()!==e.escrow.toLowerCase())throw Error(`close snapshot payment scope does not match local session`);let r=BigInt(n.acceptedCumulative),i=BigInt(n.spent);if(r<0n||i<0n)throw Error(`close snapshot amounts must not be negative`);if(i>r)throw Error(`close snapshot spent exceeds accepted cumulative amount`);if(r>e.cumulativeAmount)throw Error(`close snapshot accepted cumulative exceeds local voucher state`);return{acceptedCumulative:r,spent:i}}function j(e,t){let n=A(e.channel,t);if(!n)return;let{acceptedCumulative:r,spent:i}=n;if(o.spent>r)throw Error(`close snapshot accepted cumulative is below locally confirmed spend`);return i>o.spent&&(o.spent=i),n}function M(e,t=e.challenge,n=!1){let r=(n?j(e,t):A(e.channel,t))?.acceptedCumulative??k(t,e.channelId);if(r>e.channel.cumulativeAmount)throw Error(`fallback close amount exceeds local voucher state`);return N(r),r.toString()}function N(e){ks({cumulativeAmount:e,maxVoucherCumulative:r.maxVoucherCumulative})}async function ee(e){let{knownDeposit:t,...n}=e,i=await Wc({...n,channel:o.channel,createSessionCredential:w,fetch:r.fetch});T(i);let a=Fc({additionalDeposit:e.additionalDeposit,channel:o.channel,channelId:e.channelId,challengeId:o.lastChallenge?.id,currentState:o.state,knownDeposit:t,receipt:i,spent:o.spent});return a?.channel&&o.lastChallenge&&(await p.set(a.channel),_({type:`activated`,challengeId:o.lastChallenge.id,entry:a.channel,spent:o.spent.toString(),units:v()}),b(a.channel)),i}async function P(e){let t=o.channel?.channelId===e.channelId?o.channel.deposit:0n,n=t>e.deposit?t:e.deposit,i=Ps({deposit:n,maxDeposit:r.maxVoucherCumulative,requiredCumulative:e.requiredCumulative,suggestedDeposit:e.challenge.request.suggestedDeposit===void 0?void 0:BigInt(e.challenge.request.suggestedDeposit),topUpAmount:r.topUpAmount});i!==0n&&await ee({challenge:e.challenge,input:e.input,channelId:e.channelId,additionalDeposit:i,knownDeposit:n})}async function te(e,t){let n=Gs({channel:o.channel,channelId:e,challengeId:o.lastChallenge?.id,cumulativeAmount:t,spent:o.spent,state:o.state});n&&o.channel&&(_({type:`activated`,challengeId:n.challengeId,entry:o.channel,spent:n.spent,units:n.units}),await l.set(o.channel))}async function F(e){let t=qs(e,o.channel);o.channel=t.channel,o.spent=t.spent,o.state=t.state,o.channel?.opened&&await l.set(o.channel)}function ne(e){let t=e.headers.get(R.paymentReceipt),n=t?yo(t):null;return T(n),Object.assign(e,{receipt:n,challenge:o.lastChallenge,channelId:o.channel?.channelId??null,cumulative:o.channel?.cumulativeAmount??0n})}async function re(e,t){if(d)throw Error(`SessionManager: a request is already in flight; concurrent requests on one manager are not supported`);o.lastUrl=e;let n=Ks({channel:o.channel,spent:o.spent,state:o.state}),i={challengesReceived:0,committed:void 0,created:new Map,previous:n,seenExisting:new Set,resumed:void 0,trackCreates:!1};d=i;try{await O(e,t),i.trackCreates=!0;let a=El(e,t,o.channel?.opened?o.channel.channelId:void 0);s&&(a={...a,context:s});let c=!n.channel?.opened;async function l(){let n=i.resumed;return!c||!n?!1:(c=!1,await m(n),a=El(e,t,void 0),!0)}for(;;){let t;try{t=await C(e,a)}catch(e){if(i.created.size?await h():await F(i.committed??n),await l())continue;throw e}let s=ne(t),c=!1;if(s.status===402){let t=await Kc({input:e,init:a,response:s,createSessionCredential:w,fetch:r.fetch,getChannel:()=>o.channel,restoreCumulative:te,setChallenge(e){o.lastChallenge=e},topUpIfNeeded:P});t&&(c=!0,s=ne(t))}if(!c&&!s.ok&&!s.receipt){if(i.created.size?await h():await F(i.committed??n),await l())continue;return s}return s}}finally{d=void 0}}async function ie(e){let t=await Jc({createSessionCredential:w,fetch:r.fetch,getMinimumSpent:()=>o.spent,lastUrl:o.lastUrl,resolveSignedCloseAmount:t=>M(e,t,!0),signedCloseAmount:M(e),setChallenge(e){o.lastChallenge=e},target:e});return t&&(E(),_({type:`closeStarted`}),_({type:`closed`,receipt:t})),t}let ae={createSessionCredential:w,doFetch:re,fetch:r.fetch,getChannel:()=>o.channel,getChallenge:()=>o.lastChallenge,assertVoucherWithinLocalLimit:N,acceptReceipt(e){T(e)},topUpIfNeeded:P},oe={get channelId(){return o.channel?.channelId},get cumulative(){return o.channel?.cumulativeAmount??0n},get opened(){return o.channel?.opened??!1},get state(){return o.state},fetch:re,async topUp(e){let t=Pc({amount:e,assertVoucherWithinLocalLimit:N,channel:o.channel,decimals:r.decimals,lastChallenge:o.lastChallenge,lastUrl:o.lastUrl});return ee({additionalDeposit:t.additionalDeposit,challenge:t.challenge,channelId:t.channelId,input:t.input})},async sse(e,t){return Yc(e,t,ae)},async ws(e,t){if(!r.WebSocket)throw Error("No WebSocket implementation available. Pass `webSocket` to sessionManager() in this runtime.");let n=Hc(e),i=t?.signal?{signal:t.signal}:void 0;await O(n,i);let a=o.channel?.opened?o.channel.channelId:void 0,{challenge:s,credential:l,httpUrl:u,wsUrl:d}=await il({async createSessionCredential(e,t){return o.lastChallenge=e,await ti(x,{challenge:e,context:t,fetch:r.fetch,input:n}),w(e,t)},fetch:r.fetch,input:e,onProbeUrl(e){o.lastUrl=e.toString()},probeInit:El(n,i,a),signal:t?.signal});return o.lastChallenge=s,ll({challenge:s,credential:l,httpUrl:u,WebSocket:r.WebSocket,wsUrl:d,options:t,createSessionCredential:w,getChannel:()=>o.channel,setSocketSession(e){o.socketSession=e},async refreshChallenge(){let e=await rl({fetch:r.fetch,input:u,probeInit:El(u,i,o.channel?.opened?o.channel.channelId:void 0),signal:t?.signal});return o.lastChallenge=e.challenge,e.challenge},assertVoucherWithinLocalLimit:N,acceptReceipt:T,rejectCloseReady:c.rejectCloseReady,rejectReceipt:c.rejectReceipt,settleCloseReady:c.settleCloseReady,settleReceipt:c.settleReceipt,topUpIfNeeded:P,waitForReceipt:c.waitForReceipt})},async close(){let e=o.socketSession,t=Is({channel:o.channel,currentSocket:e,lastChallenge:o.lastChallenge});if(!t)return;let n=e?.socket;if(e&&n?.readyState===jc.OPEN){let r=await Js({activeSocket:n,createSessionCredential:w,currentSocket:e,spent:o.spent,target:t,waitForCloseReady:c.waitForCloseReady,waitForReceipt:c.waitForReceipt});return E(),_({type:`closeStarted`}),_({type:`closed`,receipt:r}),r}return ie(t)}};return xl(oe,{consumeSseResponse(e,t,n){return Xc(e,t,n,ae)},rehydrate({channel:e,challenge:t,input:n,spent:r}){if(!e.opened)throw Error(`Cannot restore a closed session channel.`);if(!Lc(t))throw Error(`Cannot restore session: challenge is not tempo/session.`);if(r<0n)throw Error(`Cannot restore session: spent must not be negative.`);if(r>e.cumulativeAmount)throw Error(`Cannot restore session: spent exceeds local voucher state.`);N(e.cumulativeAmount);let i=A(e,t),a=i&&i.spent>r?i.spent:r;o.lastUrl=n,o.lastChallenge=t,o.channel=e,o.spent=a,_({type:`challengeReceived`,challengeId:t.id}),_({type:`activated`,challengeId:t.id,entry:e,spent:a.toString(),units:0})}}),oe}(function(e){e.serializeSnapshot=bs,e.deserializeSnapshot=xs})(kl||={});const Al=(1n<<64n)-1n,jl={dev_second:1n,day:86400n,week:604800n};function Ml(e){return e instanceof Date?e:new Date(e)}function Nl(e){let t=e.getTime();if(!Number.isFinite(t))throw new q({reason:`subscriptionExpires is invalid`});if(t%1e3!=0)throw new q({reason:`subscriptionExpires must be representable as whole seconds`});let n=t/1e3;if(n<=0||!Number.isSafeInteger(n))throw new q({reason:`subscriptionExpires cannot be represented in a Tempo key authorization`});return n}function Pl(e){if(!/^[1-9]\d*$/.test(e.periodCount))throw new q({reason:`periodCount is invalid`});let t=jl[e.periodUnit];if(t===void 0)throw new q({reason:`periodUnit is invalid`});let n=BigInt(e.periodCount)*t;if(n>Al)throw new q({reason:`subscription period cannot be represented as an unsigned 64-bit integer`});if(n>BigInt(2**53-1))throw new q({reason:`subscription period cannot be represented exactly by this Tempo client`});return Number(n)}function Fl(e){let{challengeExpires:t,request:n}=e;Pl(n);let r=Nl(Ml(n.subscriptionExpires));if(t){let e=Math.floor(new Date(t).getTime()/1e3);if(!Number.isFinite(e)||r<=e)throw new q({reason:`subscriptionExpires must be strictly later than challenge expires`})}}function Il(e){return[{address:Yl(e.currency,`currency`),selector:`0x95777d59`,recipients:[Yl(e.recipient,`recipient`)]}]}function Ll(e){try{let t=w.fromBytes(x.toBytes(e));if(w.size(t)!==32)throw Error(`invalid challenge id size`);return t}catch{throw new q({reason:`challenge id must encode 32 bytes`})}}async function Rl(e){let{accessKey:t,account:n,challengeId:r,chainId:i,request:a}=e;if(typeof n.sign!=`function`)return;let o=Bl({accessKey:t,challengeId:r,chainId:i,request:a}),s=await n.sign({hash:I.getSignPayload(o)}),c=L.from(s);if(c.type===`keychain`||c.type===`multisig`)throw new q({reason:`keyAuthorization must use a primitive signature`});return I.from(o,{signature:s})}function zl(e){let{accessKey:t,challengeId:n,chainId:r,payload:i,request:a}=e;if(i.type!==`keyAuthorization`)throw new q({reason:`invalid keyAuthorization payload`});let o=Vl(i.signature),s=Hl(o);if(Ul({accessKey:t,authorization:o,chainId:r}),o.witness?.toLowerCase()!==Ll(n))throw new q({reason:`keyAuthorization challenge mismatch`});return Wl(o,a),Kl(Gl(o),a),ql(o.scopes,a),{authorization:o,source:{address:Jl(o,s),chainId:r}}}function Bl(e){let{accessKey:t,challengeId:n,chainId:r,request:i}=e;return I.from({address:Yl(t.accessKeyAddress,`accessKeyAddress`),chainId:BigInt(r),expiry:Nl(Ml(i.subscriptionExpires)),limits:[{token:Yl(i.currency,`currency`),limit:BigInt(i.amount),period:Pl(i)}],scopes:Il(i),type:t.keyType,witness:Ll(n)})}function Vl(e){try{return I.deserialize(e)}catch(e){throw e instanceof I.InvalidSignatureTypeError?new q({reason:`keyAuthorization must use a primitive signature`}):new q({reason:`invalid keyAuthorization payload`})}}function Hl(e){let t=e.signature;if(!t)throw new q({reason:`keyAuthorization must use a primitive signature`});return t}function Ul(e){let{accessKey:t,authorization:n,chainId:r}=e;if(n.chainId!==BigInt(r))throw new q({reason:`keyAuthorization chainId mismatch`});if(t){if(!u(n.address,Yl(t.accessKeyAddress,`accessKeyAddress`)))throw new q({reason:`keyAuthorization access key mismatch`});if(n.type!==t.keyType)throw new q({reason:`keyAuthorization key type mismatch`})}}function Wl(e,t){if(Fl({request:t}),e.expiry!==Nl(Ml(t.subscriptionExpires)))throw new q({reason:`keyAuthorization expiry mismatch`})}function Gl(e){let[t]=e.limits??[];if(!t||e.limits?.length!==1)throw new q({reason:`keyAuthorization must contain exactly one token limit`});return t}function Kl(e,t){if(!u(e.token,Yl(t.currency,`currency`)))throw new q({reason:`keyAuthorization currency mismatch`});if(e.limit!==BigInt(t.amount))throw new q({reason:`keyAuthorization amount mismatch`});if(e.period!==Pl(t))throw new q({reason:`keyAuthorization period mismatch`})}function ql(e,t){if(!e||e.length!==1)throw new q({reason:`keyAuthorization must contain a recipient-scoped transferWithMemo call`});let n=Yl(t.currency,`currency`),r=Yl(t.recipient,`recipient`),i=new Set;for(let t of e){if(!u(t.address,n))throw new q({reason:`keyAuthorization call target mismatch`});let e=Xl(t.selector);if(e!==`0xa9059cbb`&&e!==`0x95777d59`)throw new q({reason:`keyAuthorization selector not allowed`});if(i.has(e))throw new q({reason:`keyAuthorization duplicate selector`});if(i.add(e),t.recipients?.length!==1||!u(t.recipients[0],r))throw new q({reason:`keyAuthorization recipient mismatch`})}if(!i.has(`0x95777d59`))throw new q({reason:`keyAuthorization must allow transferWithMemo`})}function Jl(e,t){let n=I.getSignPayload(e);try{let e=L.extractAddress({payload:n,signature:t});if(!L.verify(t,{address:e,payload:n}))throw new q({reason:`keyAuthorization signature is invalid`});return e}catch(e){throw e instanceof q?e:new q({reason:`keyAuthorization signature is invalid`})}}function Yl(e,t){if(!l(e))throw new q({reason:`${t} must be an address`});return e.toLowerCase()}function Xl(e){return typeof e==`string`?e.toLowerCase():``}const Zl=B.object({accessKey:B.optional(B.custom()),account:B.optional(B.custom())});function Ql(e={}){let t=Xi({chain:N,getClient:e.getClient,rpcUrl:zn}),n=Ki({account:e.account});return kt(Na,{context:Zl,async createCredential({challenge:r,context:i}){let a=r.request.methodDetails?.chainId??X.testnet,o=await t({chainId:a}),s=n(o,i),c=i?.accessKey??e.accessKey??r.request.methodDetails?.accessKey;if(!c)throw Error("No `accessKey` provided. The subscription challenge must include `accessKey`, or the client must pass one to parameters/context.");eu(r.request),await e.validateRequest?.(r.request);let l=await $l(o,{accessKey:c,account:s,challengeId:r.id,chainId:a,request:r.request}),d=zl({accessKey:c,challengeId:r.id,chainId:a,payload:{signature:I.serialize(l),type:`keyAuthorization`},request:r.request});if(!u(d.source.address,s.address))throw Error(`keyAuthorization signer does not match the selected account`);return K({challenge:r,payload:{signature:I.serialize(l),type:`keyAuthorization`},source:`did:pkh:eip155:${a}:${s.address.toLowerCase()}`})}})}async function $l(e,t){let{accessKey:n,account:r,challengeId:i,chainId:a,request:o}=t,s=await Rl({accessKey:n,account:r,challengeId:i,chainId:a,request:o});if(s)return s;let c=await e.request({method:`wallet_authorizeAccessKey`,params:[{address:n.accessKeyAddress,expiry:Nl(Ml(o.subscriptionExpires)),keyType:n.keyType,limits:[{token:o.currency,limit:w.fromNumber(BigInt(o.amount)),period:Pl(o)}],scopes:Il(o),witness:Ll(i)}]});return I.fromRpc(c.keyAuthorization)}function eu(e){Pl(e),Nl(Ml(e.subscriptionExpires))}const tu=Object.assign(yl,{manager:kl}),nu=Object.assign(ko,{method:io});function ru(e={}){return[Ia(e),tu(e)]}(function(e){e.charge=Ia,e.common=ru,e.session=tu,e.sessionLegacy=nu,e.subscription=Ql})(ru||={});const iu=M.union([M.boolean(),M.literal(`true`).transform(()=>!0),M.literal(`false`).transform(()=>!1)]);async function au(e){process.stdout.write(Buffer.from(await e.arrayBuffer()))}const ou=M.object({allowCustomEscrow:M.optional(iu),autoSwap:M.optional(iu),channel:M.optional(M.coerce.string()),deposit:M.optional(M.union([M.string(),M.number()])),payWith:M.optional(M.string()),slippage:M.optional(M.coerce.number()),tokenIn:M.optional(M.string())}),su=[`allowCustomEscrow`,`autoSwap`,`channel`,`deposit`,`payWith`,`slippage`,`tokenIn`];function cu(){let t;return ar({method:`tempo`,supports(e){return e.method===`tempo`&&[`charge`,`session`].includes(e.intent)},async setup({challenge:n,options:r,methodOpts:i}){let a=tr(r.account),o=n.request,s=o.currency,l=mu(i),u=vu({autoSwap:l.autoSwap??r.autoSwap,payWith:l.payWith??r.payWith,slippage:l.slippage??r.slippage,tokenIn:l.tokenIn}),d=s??``,f=o.decimals??6,p,m,h,g=!1,_=process.env.MPPX_PRIVATE_KEY?.trim()||(Vn(a)?void 0:await nr(a).get());if(!_&&Vn(a)&&Du()){g=!0;let t=Tu(a);if(t){let i=Wn(r.rpcUrl,{network:r.network});h=e({chain:await Gn({network:r.network,rpcUrl:i}),transport:c(i)}),gu({challenge:n,clientChainId:h.chain?.id}),p=h.chain?.blockExplorers?.default?.url;let a=s?await Jn(h,s,t.wallet_address).catch(()=>void 0):void 0;d=a?.symbol??s??``,f=a?.decimals??o.decimals??6}}else if(_)m=se(_);else{let e=ku();if(e){let t=await nr(e).get();t&&(m=se(t))}if(!m)throw r.account?new Y({code:`ACCOUNT_NOT_FOUND`,message:`Account "${a}" not found.`,exitCode:69}):new Y({code:`ACCOUNT_NOT_FOUND`,message:`No account found.`,exitCode:69})}if(!g&&m){let t=Wn(r.rpcUrl,{network:r.network});h=e({chain:await Gn({network:r.network,rpcUrl:t}),transport:c(t)}),gu({challenge:n,clientChainId:h.chain?.id}),p=h.chain?.blockExplorers?.default?.url;let i=s?await Jn(h,s,m.address).catch(()=>void 0):void 0;d=i?.symbol??s??``,f=i?.decimals??o.decimals??6}if(g)return{tokenSymbol:d,tokenDecimals:f,explorerUrl:p,methods:[],async createCredential(e){let t=e.headers.get(`www-authenticate`);if(!t)throw Error(`No WWW-Authenticate header in 402 response.`);return Ou(t)}};if(!m||!h)throw new Y({code:`ACCOUNT_NOT_FOUND`,message:`Tempo requires a configured account.`,exitCode:69});let v=ru({account:m,...l.allowCustomEscrow===void 0?{}:{allowCustomEscrow:l.allowCustomEscrow},getClient:()=>h,...u===void 0?{}:{autoSwap:u},maxDeposit:(()=>{if(n.intent!==`session`)return;let e=n.request.suggestedDeposit,t=(l.deposit===void 0?void 0:String(l.deposit))??e??(qn(h.chain)?`10`:void 0);if(!t)throw new Y({code:`MISSING_DEPOSIT`,message:`Session payment requires a deposit. Use -M deposit=<amount> or connect to testnet.`,exitCode:2});return t})()}),y=(()=>{if(!l.channel)return;let e=l.channel,t=bu(e);return{channelId:e,...t!==void 0&&{cumulativeAmountRaw:t.toString()}}})();return t={descriptor:void 0,async signVoucher({channelId:e,cumulativeAmount:r,escrowContract:i,chainId:a,action:o=`voucher`}){let s=t?.descriptor;if(!s)throw Error(`session descriptor not available`);return K({challenge:n,payload:{action:o,channelId:e,descriptor:s,cumulativeAmount:r.toString(),signature:await Ko(h,m,{channelId:e,cumulativeAmount:r},i,a)},source:`did:pkh:eip155:${a}:${m.address}`})},source:`did:pkh:eip155:${h.chain.id}:${m.address}`},{tokenSymbol:d,tokenDecimals:f,explorerUrl:p,methods:[...v],credentialContext:y}},prepareCredentialRequest({challenge:e,headers:t}){e.intent===`session`&&(t.Accept=`text/event-stream`)},async handleResponse(e){if(e.challenge.intent!==`session`||!t)return!1;let{challenge:n,credential:r,response:i,fetchUrl:a,fetchInit:o,verbose:s}=e,{silent:c,confirmEnabled:l,tokenSymbol:u,tokenDecimals:d,explorerUrl:f,shownKeys:p}=e,m=c?e=>{}:e=>process.stderr.write(e),h=bt(r),g=n.request,_=g.methodDetails,v=h.payload.channelId,y=_?.escrowContract??_?.escrow??`0x4d50500000000000000000000000000000000000`,b=_?.chainId??0,S=BigInt(g.amount),C=`cumulativeAmount`in h.payload&&h.payload.cumulativeAmount?BigInt(h.payload.cumulativeAmount):0n;if(`descriptor`in h.payload&&(t.descriptor=h.payload.descriptor),s>=1){if(h.payload.action===`open`){let e=g.suggestedDeposit,t=e?` ${Z.dim(`(deposit ${e} ${u})`)}`:``;m(`${l?``:`
|
|
10
|
+
`}${Z.dim(`Channel opened ${h.payload.channelId}`)}${t}\n`)}else m(`${l?``:`
|
|
11
|
+
`}${Z.dim(`Channel reused ${h.payload.channelId}`)}\n`)}let w=i;w.ok&&!w.headers.get(`Content-Type`)?.includes(`text/event-stream`)&&h.payload.action===`open`&&`cumulativeAmount`in h.payload&&(C=BigInt(h.payload.cumulativeAmount));let T=w.headers.get(R.paymentReceipt);if(T)try{let e=JSON.parse(x.toString(T));uu(e,C),typeof e.acceptedCumulative==`string`&&e.acceptedCumulative&&xu(v,C),s>=1&&lu(e,{info:m,shownKeys:p,tokenSymbol:u,tokenDecimals:d,explorerUrl:f,handler:this,prefix:`
|
|
12
|
+
`})}catch{}return(w.headers.get(`Content-Type`)??``).includes(`text/event-stream`)?await du(w,{challenge:n,channelId:v,escrowContract:y,chainId:b,cumulativeAmount:C,tickCost:S,fetchUrl:a,fetchInit:o,session:t,info:m,verbose:s,shownKeys:p,tokenSymbol:u,tokenDecimals:d,explorerUrl:f,handler:this}):(await au(w),v&&y&&b&&(l&&m(`
|
|
13
|
+
`),l&&!await e.confirm(`Close channel?`,!0)?s>=1&&m(`${Z.dim(`Kept channel open.`)}\n`):await fu({channelId:v,cumulativeAmount:C,escrowContract:y,chainId:b,fetchUrl:a,fetchInit:o,session:t,info:m,verbose:s,tokenSymbol:u,tokenDecimals:d,explorerUrl:f,confirmEnabled:l}))),!0},formatReceiptField(e,t){(e===`reference`||e===`txHash`)&&typeof t==`string`&&t.startsWith(`0x`)}})}function lu(e,t){t.info(`${t.prefix??``}${Z.bold(Z.green(`Payment Receipt`))}\n`);let n=[],r=e.channelId&&e.reference&&e.channelId===e.reference,i=new Set([`acceptedCumulative`,`spent`]);for(let[a,o]of Object.entries(e)){if(o===void 0||t.shownKeys.has(a)||a===`reference`&&r)continue;let e=t.handler.formatReceiptField?.(a,o);e===void 0?i.has(a)&&typeof o==`string`?n.push([a,`${o} ${Z.dim(`(${Hn(BigInt(o),t.tokenSymbol,t.tokenDecimals)})`)}`]):(a===`reference`||a===`txHash`)&&typeof o==`string`&&t.explorerUrl?n.push([a,Bn(`${t.explorerUrl}/tx/${o}`,o)]):n.push([a,String(o)]):n.push([a,e])}n.sort(([e],[t])=>e.localeCompare(t));let a=Math.max(...n.map(([e])=>e.length));for(let[e,r]of n)t.info(` ${Z.dim(e.padEnd(a))} ${r}\n`);t.prefix&&t.info(`
|
|
14
|
+
`)}function uu(e,t){if(typeof e.acceptedCumulative!=`string`)return;let n=BigInt(e.acceptedCumulative),r=typeof e.spent==`string`?BigInt(e.spent):0n;if(r>n)throw Error(`receipt spent exceeds accepted cumulative voucher amount`);if(n>t)throw Error(`receipt accepted cumulative exceeds locally signed voucher amount`);if(r>t)throw Error(`receipt spent exceeds locally signed voucher amount`)}async function du(e,t){let n=t.cumulativeAmount,r=e.body?.getReader();if(!r)throw Error(`No response body`);let i=new TextDecoder,a=``,o=``,s=t.verbose?await pu():void 0,c=(()=>{if(!s||!Z.isColorSupported)return;let e=e=>Math.max(0,Math.min(255,Math.round(e))),t=.299*s.r+.587*s.g+.114*s.b<128?1:-1,n=n=>r=>`\x1b[48;2;${e(s.r+n*t)};${e(s.g+n*t)};${e(s.b+n*t)}m${r}\x1b[49m`;return[n(12),n(24)]})(),l=0,u=e=>{if(c){let t=c[l%c.length];process.stdout.write(e.replace(/[^\n]+/g,e=>t(e))),l++}else process.stdout.write(e)},d=async e=>{for(let r of e){if(r.startsWith(`event: `)){o=r.slice(7).trim();continue}if(!r.startsWith(`data: `)){r===``&&(o=``);continue}let e=r.slice(6);if(e.trim()!==`[DONE]`){if(o===`payment-need-voucher`&&t.channelId&&t.escrowContract&&t.chainId){try{let r=JSON.parse(e);if(r.channelId!==t.channelId)throw Error(`payment-need-voucher channelId does not match current session`);let i=BigInt(r.requiredCumulative);if(i>n+t.tickCost)throw Error(`payment-need-voucher exceeds next locally billable amount`);n=n>i?n:i;let a=await t.session.signVoucher({channelId:t.channelId,cumulativeAmount:n,escrowContract:t.escrowContract,chainId:t.chainId});await globalThis.fetch(t.fetchUrl,{method:`POST`,headers:{[R.authorization]:a}})}catch(e){t.info(Z.dim(Z.yellow(` [voucher failed: ${e instanceof Error?e.message:e}]`)))}o=``;continue}if(o===`payment-receipt`){if(t.verbose>=1)try{lu(JSON.parse(e),{info:t.info,shownKeys:t.shownKeys,tokenSymbol:t.tokenSymbol,tokenDecimals:t.tokenDecimals,explorerUrl:t.explorerUrl,handler:t.handler,prefix:`
|
|
15
15
|
|
|
16
16
|
`})}catch{}o=``;continue}if(e.length===0)u(`
|
|
17
17
|
`);else try{let t=JSON.parse(e);u(t.token??t.choices?.[0]?.delta?.content??e)}catch{u(e)}o=``}}};for(;;){let{done:e,value:t}=await r.read();if(e)break;a+=i.decode(t,{stream:!0});let n=a.split(`
|
|
18
|
-
`);a=n.pop(),await d(n)}a.trim()&&await d([a]),t.channelId&&t.escrowContract&&t.chainId&&await
|
|
19
|
-
`)){let e=r.trim();if(e===`[[keys]]`){n?.wallet_address&&t.push(n),n={wallet_type:`local`,wallet_address:``,chain_id:0};continue}if(!n)continue;let i=e.match(/^(\w+)\s*=\s*"?([^"]*)"?$/);if(!i)continue;let[,a,o]=i;a===`wallet_type`?n.wallet_type=o:a===`wallet_address`?n.wallet_address=o:a===`chain_id`&&(n.chain_id=Number.parseInt(o,10))}return n?.wallet_address&&t.push(n),t}catch{return[]}}function
|
|
18
|
+
`);a=n.pop(),await d(n)}a.trim()&&await d([a]),t.channelId&&t.escrowContract&&t.chainId&&await fu({channelId:t.channelId,cumulativeAmount:n,escrowContract:t.escrowContract,chainId:t.chainId,fetchUrl:t.fetchUrl,fetchInit:t.fetchInit,session:t.session,info:t.info,verbose:t.verbose,tokenSymbol:t.tokenSymbol,tokenDecimals:t.tokenDecimals,explorerUrl:t.explorerUrl,confirmEnabled:!1})}async function fu(e){let t=await e.session.signVoucher({channelId:e.channelId,cumulativeAmount:e.cumulativeAmount,escrowContract:e.escrowContract,chainId:e.chainId,action:`close`}),n=await globalThis.fetch(e.fetchUrl,{...e.fetchInit,headers:{...Q(e.fetchInit.headers),Authorization:t}});if(n.ok){if(Su(e.channelId),e.verbose>=1){let t=n.headers.get(R.paymentReceipt),r;if(t)try{let e=JSON.parse(x.toString(t));typeof e.txHash==`string`&&(r=e.txHash)}catch{}let i=r&&e.explorerUrl?` ${Z.dim(Bn(`${e.explorerUrl}/tx/${r}`,r))}`:``;e.info(`${Z.dim(`Channel closed.`)} ${Z.dim(`Spent ${Hn(e.cumulativeAmount,e.tokenSymbol,e.tokenDecimals)}.`)}${i}\n`)}}else{let t=await n.text().catch(()=>``);e.info(`\n${Z.dim(Z.yellow(`Channel close failed`))} ${Z.dim(`(${n.status})`)}\n`),e.info(`${Z.dim(` channelId: ${e.channelId}`)}\n${Z.dim(` cumulativeAmount: ${e.cumulativeAmount}`)}\n${Z.dim(` escrowContract: ${e.escrowContract}`)}\n${Z.dim(` chainId: ${e.chainId}`)}\n${Z.dim(` response: ${t||`(empty)`}`)}\n`)}}function pu(e=100){return!process.stdin.isTTY||!process.stdout.isTTY?Promise.resolve(void 0):new Promise(t=>{let n=process.stdin.isRaw,r=``,i=()=>{clearTimeout(a),process.stdin.removeListener(`data`,o),process.stdin.isTTY&&process.stdin.setRawMode(n??!1),process.stdin.pause()},a=setTimeout(()=>{i(),t(void 0)},e),o=e=>{r+=e.toString();let n=r.match(/\x1b\]11;rgb:([0-9a-f]+)\/([0-9a-f]+)\/([0-9a-f]+)/i);if(!n)return;i();let a=e=>Number.parseInt(e.slice(0,2),16);t({r:a(n[1]),g:a(n[2]),b:a(n[3])})};process.stdin.setRawMode(!0),process.stdin.resume(),process.stdin.on(`data`,o),process.stdout.write(`\x1B]11;?\x07`)})}function mu(e){return hu(ou,e,su)}function hu(e,t,n){if(t&&typeof t==`object`&&!Array.isArray(t)){let e=Object.keys(t).filter(e=>!n.includes(e));if(e.length)throw Error(`Unsupported CLI method option(s): ${e.join(`, `)}`)}let r=e.safeParse(t??{});if(r.success)return r.data;let i=r.error.issues.map(e=>`${e.path.length?e.path.join(`.`):`options`}: ${e.message}`).join(`, `);throw Error(`Invalid CLI options (${i})`)}function gu(e){let t=e.challenge.request.methodDetails?.chainId;if(!t||!e.clientChainId||t===e.clientChainId)return;let n=t===4217?` Use --network mainnet or --rpc-url https://rpc.tempo.xyz.`:t===42431?` Use --network testnet or --rpc-url https://rpc.moderato.tempo.xyz.`:``;throw new Y({code:`CHAIN_MISMATCH`,message:`Challenge requires chainId ${t}, but RPC is chainId ${e.clientChainId}.${n}`,exitCode:2})}function _u(e){if(e)return e.split(`,`).map(e=>e.trim()).filter(Boolean)}function vu(e){let t=_u(e.tokenIn)??_u(e.payWith);if(!(!e.autoSwap&&!t&&e.slippage===void 0)){if(e.autoSwap===!1&&!t&&e.slippage===void 0)return!1;if(e.slippage!==void 0&&(!Number.isFinite(e.slippage)||e.slippage<0))throw Error(`Invalid CLI options (slippage: expected a non-negative number)`);return{...t?{tokenIn:t}:{},...e.slippage===void 0?{}:{slippage:e.slippage}}}}function yu(){return j.join(process.env.XDG_CONFIG_HOME||j.join(A.homedir(),`.config`),`mppx`,`channels`)}function bu(e){try{let t=k.readFileSync(j.join(yu(),e),`utf-8`).trim();return t?BigInt(t):void 0}catch{return}}function xu(e,t){let n=yu();k.mkdirSync(n,{recursive:!0}),k.writeFileSync(j.join(n,e),t.toString(),`utf-8`)}function Su(e){try{k.unlinkSync(j.join(yu(),e))}catch{}}function Cu(){return A.platform()===`darwin`?j.join(A.homedir(),`Library`,`Application Support`,`tempo`,`wallet`,`keys.toml`):j.join(process.env.XDG_DATA_HOME||j.join(A.homedir(),`.local`,`share`),`tempo`,`wallet`,`keys.toml`)}function wu(){try{let e=k.readFileSync(Cu(),`utf-8`),t=[],n;for(let r of e.split(`
|
|
19
|
+
`)){let e=r.trim();if(e===`[[keys]]`){n?.wallet_address&&t.push(n),n={wallet_type:`local`,wallet_address:``,chain_id:0};continue}if(!n)continue;let i=e.match(/^(\w+)\s*=\s*"?([^"]*)"?$/);if(!i)continue;let[,a,o]=i;a===`wallet_type`?n.wallet_type=o:a===`wallet_address`?n.wallet_address=o:a===`chain_id`&&(n.chain_id=Number.parseInt(o,10))}return n?.wallet_address&&t.push(n),t}catch{return[]}}function Tu(e){let t=wu();if(t.length===0)return;let n=e.slice(6);if(n==="default"||n===``)return t[0];let r=Number.parseInt(n,10);if(!Number.isNaN(r)&&r>=0&&r<t.length)return t[r]}let Eu;function Du(){if(Eu!==void 0)return Eu;try{O.execFileSync(`which`,[`tempo`],{stdio:`ignore`}),Eu=!0}catch{Eu=!1}return Eu}async function Ou(e){return new Promise((t,n)=>{O.execFile(`tempo`,[`mpp`,`sign`,`--challenge`,e],(e,r,i)=>{if(e){let t=i?.trim()||e.message;n(Error(`tempo mpp sign failed: ${t}`));return}let a=r.trim();if(!a){n(Error(`tempo mpp sign returned empty output`));return}t(a)})})}function ku(){let e=er();if(Vn(e.get())&&!Du()&&A.platform()===`darwin`)try{let t=O.execFileSync(`security`,[`dump-keychain`],{encoding:`utf-8`}),n=[];for(let e of t.split(`keychain:`)){let t=e.match(/"svce"<blob>="([^"]*)"/),r=e.match(/"acct"<blob>="([^"]*)"/);t?.[1]===`mppx`&&r?.[1]&&n.push(r[1])}if(n.length>0)return e.set(n[0]),n[0]}catch{}}const Au=[...Object.entries(Ce),...Object.entries(we),...Object.entries(Te),...Object.entries(Ee)];function ju(){return ar({method:`evm`,supports:Mu,async setup({challenge:e,options:t}){let n=e.request,r=n.network?Nu(Ne(n.network)):void 0,i=n.network&&n.asset?Au.find(([,e])=>je(e,n.asset,n.network)):void 0,a=n.extra?.name,o=n.extra?.version,s=n.asset&&n.network&&typeof a==`string`&&typeof o==`string`?xe({address:n.asset,decimals:i?.[1].decimals??6,network:n.network,transfer:{name:a,type:`eip3009`,version:o}}):void 0,c=await ir(t.account);return{explorerUrl:r?.blockExplorers?.default?.url,methods:[...Nn({account:c,...s&&{currencies:[s]}})],tokenDecimals:i?.[1].decimals??6,tokenSymbol:i?.[0]??``}}})}function Mu(e){if(!gn(e))return!1;let t=e.request,n=t.extra,r=n?.assetTransferMethod;return t.scheme===`exact`&&typeof t.asset==`string`&&typeof t.network==`string`&&typeof n?.name==`string`&&typeof n?.version==`string`&&(r===void 0||r===`eip3009`)}function Nu(e){return Object.values(v).find(t=>t.id===e)}export{ar as createPlugin,or as evm,hr as stripe,cu as tempo,ju as x402};
|