mppx 0.9.0 → 0.9.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.
Files changed (42) hide show
  1. package/CHANGELOG.md +8 -0
  2. package/dist/Errors.d.ts +10 -0
  3. package/dist/Errors.js +12 -0
  4. package/dist/Mcp.d.ts +9 -1
  5. package/dist/Mcp.js +18 -0
  6. package/dist/Method.d.ts +7 -0
  7. package/dist/cli/cli.js +134 -134
  8. package/dist/cli/plugins/index.js +12 -12
  9. package/dist/client/internal/protocols/Mcp.js +2 -1
  10. package/dist/mcp/client/McpClient.js +22 -10
  11. package/dist/mcp/server/Transport.d.ts +2 -2
  12. package/dist/mcp/server/Transport.js +11 -4
  13. package/dist/server/Mppx.d.ts +6 -0
  14. package/dist/server/Mppx.js +75 -6
  15. package/dist/server/Transport.js +8 -15
  16. package/dist/stripe/Methods.d.ts +6 -0
  17. package/dist/stripe/Methods.js +3 -1
  18. package/dist/stripe/client/Charge.d.ts +6 -0
  19. package/dist/stripe/client/Methods.d.ts +6 -0
  20. package/dist/stripe/internal/payment-intent.d.ts +7 -0
  21. package/dist/stripe/internal/payment-intent.js +6 -0
  22. package/dist/stripe/server/Charge.d.ts +6 -0
  23. package/dist/stripe/server/Charge.js +8 -3
  24. package/dist/stripe/server/Methods.js +62 -7
  25. package/dist/stripe/server/internal/html.gen.d.ts +1 -1
  26. package/dist/stripe/server/internal/html.gen.js +1 -1
  27. package/dist/tempo/Tokens.d.ts +13 -0
  28. package/dist/tempo/Tokens.js +13 -0
  29. package/dist/tempo/client/Charge.d.ts +1 -1
  30. package/dist/tempo/client/Charge.js +17 -0
  31. package/dist/tempo/index.d.ts +1 -0
  32. package/dist/tempo/index.js +1 -0
  33. package/dist/tempo/internal/fee-payer.d.ts +1 -1
  34. package/dist/tempo/internal/fee-payer.js +2 -12
  35. package/dist/tempo/internal/fee-token.d.ts +2 -0
  36. package/dist/tempo/internal/fee-token.js +7 -0
  37. package/dist/tempo/server/internal/html.gen.d.ts +1 -1
  38. package/dist/tempo/server/internal/html.gen.js +1 -1
  39. package/dist/tempo/session/client/SessionManager.js +1 -2
  40. package/dist/tempo/session/server/Session.js +5 -2
  41. package/dist/x402/mcp.js +4 -3
  42. 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 P,Account as te,Actions as F,Addresses as ne,Transaction as re,withFeePayer as ie}from"viem/tempo";import{parseAccount as ae,privateKeyToAccount as oe}from"viem/accounts";import{createParser as se}from"eventsource-parser";import{Channel as ce,KeyAuthorization as I,SignatureEnvelope as L,TempoAddress as le,TxEnvelopeTempo as ue}from"ox/tempo";var de=Object.defineProperty,fe=Object.getOwnPropertyDescriptor,pe=Object.getOwnPropertyNames,me=Object.prototype.hasOwnProperty,he=(e,t)=>{let n={};for(var r in e)de(n,r,{get:e[r],enumerable:!0});return t||de(n,Symbol.toStringTag,{value:`Module`}),n},ge=(e,t,n,r)=>{if(t&&typeof t==`object`||typeof t==`function`)for(var i=pe(t),a=0,o=i.length,s;a<o;a++)s=i[a],!me.call(e,s)&&s!==n&&de(e,s,{get:(e=>t[e]).bind(null,s),enumerable:!(r=fe(t,s))||r.enumerable});return e},_e=(e,t,n)=>(ge(e,t,`default`),n&&ge(n,t,`default`));const ve=Symbol(`mppx.x402.asset`);function ye(e){return{[ve]:!0,address:e.address,decimals:e.decimals,network:e.network,transfer:e.transfer}}function be(e,t){let n=e(t.chainId);return ye({address:n.address,decimals:n.decimals,network:Ae(t.chainId),transfer:Me(t.transfer,n)})}const xe={USDC:ye({address:`0x833589fCD6eDb6E08f4c7C32D4f71b54bdA02913`,decimals:6,network:`eip155:8453`,transfer:{name:`USD Coin`,type:`eip3009`,version:`2`}})},Se={USDC:ye({address:`0x036CbD53842c5426634e7929541eC2318f3dCF7e`,decimals:6,network:`eip155:84532`,transfer:{name:`USDC`,type:`eip3009`,version:`2`}})},Ce={USDC:ye({address:`0xcebA9300f2b948710d2653dD7B07f33A8B32118C`,decimals:6,network:`eip155:42220`,transfer:{name:`USDC`,type:`eip3009`,version:`2`}}),USDT:ye({address:`0x48065fbBE25f71C9282ddf5e1cD6D6A887483D5e`,decimals:6,network:`eip155:42220`,transfer:{name:`Tether USD`,type:`eip3009`,version:`1`}})},we={USDC:ye({address:`0x01C5C0122039549AD1493B8220cABEdD739BC44E`,decimals:6,network:`eip155:11142220`,transfer:{name:`USDC`,type:`eip3009`,version:`2`}})};function Te(e){return typeof e!=`object`||!e?!1:e[ve]===!0}function Ee(e){return typeof e==`function`&&typeof e.addresses==`object`&&typeof e.decimals==`number`}function De(e){return typeof e==`string`}function Oe(e,t){if(Te(e))return e.network===t?{address:e.address,decimals:e.decimals,transfer:e.transfer}:void 0;if(Ee(e)){let n=e.addresses[je(t)];return n?{address:n,decimals:e.decimals,name:e.name}:void 0}return{address:e}}function ke(e,t,n){let r=Oe(e,n);return r?o(r.address)===o(t):!1}function Ae(e){return`eip155:${e}`}function je(e){return Number(e.slice(7))}function Me(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 Ne=he({base:()=>xe,baseSepolia:()=>Se,celo:()=>Ce,celoSepolia:()=>we,define:()=>ye,fromToken:()=>be,isAsset:()=>Te,isRawAddress:()=>De,isToken:()=>Ee,matches:()=>ke,resolve:()=>Oe,toChainId:()=>je,toNetwork:()=>Ae}),Pe=he({base:()=>Fe,baseSepolia:()=>Ie,celo:()=>Le,celoSepolia:()=>Re});const Fe=8453,Ie=84532,Le=42220,Re=11142220,R={acceptPayment:`Accept-Payment`,authorization:`Authorization`,paymentAuthorization:`Payment-Authorization`,paymentReceipt:`Payment-Receipt`,paymentSession:`Payment-Session`,paymentSessionSnapshot:`Payment-Session-Snapshot`,wwwAuthenticate:`WWW-Authenticate`},ze={payment:`Payment`},Be={evm:`evm`,stripe:`stripe`,tempo:`tempo`},Ve={charge:`charge`,session:`session`,subscription:`subscription`},He={sessionProtocol:`sessionProtocol`,sessionSnapshot:`sessionSnapshot`},Ue={v1:`v1`,v2:`v2`};function We(e,t){if(!(!e||typeof e!=`object`))return e[t]}function Ge(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=he({address:()=>H,amount:()=>V,datetime:()=>qe,datetimeInput:()=>Je,hash:()=>U,period:()=>Ze,signature:()=>W,toDate:()=>Ye,toDatetimeString:()=>Xe,unwrapOptional:()=>Qe});import*as Ke from"zod/mini";_e(B,Ke);function V(){return D.string().check(D.regex(/^\d+(\.\d+)?$/,`Invalid amount`))}function qe(){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 Je(e=`Invalid ISO 8601 datetime`){return D.pipe(D.union([qe(),D.custom(e=>e instanceof Date)]),D.transform(Ye)).check(D.refine(e=>Number.isFinite(e.getTime()),e))}function Ye(e){return e instanceof Date?e:new Date(e)}function Xe(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 Ze(){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 Qe(e){return e._zod.def.type===`optional`?e._zod.def.innerType:e}const $e=B.object({description:B.optional(B.string()),digest:B.optional(B.string().check(B.regex(/^sha-256=/,`Invalid digest format`))),expires:B.optional(qe()),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 et(e,t){let{description:n,digest:r,meta:i,method:a,header:o,intent:s,realm:c,request:l,secretKey:u}=e,d=mt(o)?void 0:o,f=e.expires?Xe(e.expires):void 0,p=e.opaque??(i===void 0?void 0:z(i)),m=u?ht({...e,expires:f,...i!==void 0&&{meta:i},opaque:p},{secretKey:u}):e.id;return $e.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 tt(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&&!mt(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)),`${ze.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 nt(e,t){let n=rt(e);if(!n)throw Error(`Missing Payment scheme.`);let{request:r,opaque:i,...a}=it(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 et({...a,request:Ge(r),...i&&{opaque:i}},t)}function rt(e){let t=ze.payment,[n]=ct(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 it(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]=at(e,n);if(n=o,i in t)throw Error(`Duplicate parameter: ${i}`);t[i]=a}return t}function at(e,t){if(e[t]===`"`)return ot(e,t+1);let n=t;for(;n<e.length&&e[n]!==`,`;)n++;return[e.slice(t,n).trim(),n]}function ot(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 st(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 ct(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(!st(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 lt(e,t){if(e.status!==402)throw Error(`Response status is not 402.`);return ut(e.headers,t)}function ut(e,t){let n=e.get(R.wwwAuthenticate);if(!n)throw Error(`Missing ${R.wwwAuthenticate} header.`);return dt(n,t)}function dt(e,t){let n=ct(e,ze.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 nt(e.slice(r,a).replace(/,\s*$/,``),t)})}function ft(e){let t=[e.realm,e.method,e.intent,z(e.request),e.expires??``,e.digest??``],n=e.header;return n!==void 0&&!mt(n)&&t.push(n),t.push(e.opaque??(e.meta?z(e.meta):``)),t.join(`|`)}function pt(e){return e.header??R.authorization}function mt(e){return e?.toLowerCase()===R.authorization.toLowerCase()}function ht(e,t){let n=ft(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 gt=class extends Error{name=`MissingPaymentSchemeError`;constructor(){super(`Missing Payment scheme.`)}},_t=class extends Error{name=`InvalidCredentialEncodingError`;constructor(){super(`Invalid base64url or JSON.`)}};function vt(e){let t=e.match(RegExp(`^${ze.payment}\\s+(.+)$`,`i`));if(!t?.[1])throw new gt;try{let e=x.toString(t[1]),n=JSON.parse(e),{opaque:r,request:i,meta:a,...o}=n.challenge,{meta:s,opaque:c}=yt(r);return{challenge:$e.parse({...o,...s!==void 0&&{meta:s},...c!==void 0&&{opaque:c},request:Ge(i)}),payload:n.payload,...n.source&&{source:n.source}}}catch{throw new _t}}function yt(e){if(e===void 0)return{};if(typeof e==`string`)return{opaque:e};if(!bt(e))throw Error(`Invalid opaque.`);return{meta:e,opaque:z(e)}}function bt(e){return typeof e!=`object`||!e||Array.isArray(e)?!1:Object.values(e).every(e=>typeof e==`string`)}function xt(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`${ze.payment} ${c}`}var St=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}}}},Ct=class extends St{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 St{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})}},wt=class extends St{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 Tt(e,t){if(!e)throw new Ct({...t&&{id:t},reason:`missing required expires field`});if(Number.isNaN(new Date(e).getTime()))throw new Ct({...t&&{id:t},reason:`malformed expires timestamp`});if(new Date(e)<new Date)throw new wt({expires:e})}function Et(e){return e}function Dt(e,t){let{canHandleChallenge:n,context:r,createCredential:i}=t;return{...e,canHandleChallenge:n,context:r,createCredential:i}}function Ot(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 kt}}}}var kt=class extends Error{name=`InvalidJsonHeaderError`;constructor(){super(`Invalid base64 JSON header.`)}};const At=[`exact`],jt=`PAYMENT-REQUIRED`,Mt=`PAYMENT-SIGNATURE`,Nt=B.string().check(B.minLength(1)),Pt=B.number().check(B.refine(e=>e>0,`Must be positive`)),J=B.string().check(B.regex(/^\d+$/,`Invalid atomic amount`)),Ft=H(),It=B.string().check(B.regex(RegExp(`^eip155:\\d+$`),`Invalid EVM CAIP-2 network`)),Lt=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:Nt});B.discriminatedUnion(`type`,[B.object({name:Nt,type:B.literal(`eip3009`),version:Nt}),B.object({name:B.optional(B.string()),type:B.literal(`permit2`),version:B.optional(B.string())})]);const Rt=B.object({amount:J,asset:Nt,extra:B.optional(B.record(B.string(),B.unknown())),maxTimeoutSeconds:Pt,network:It,payTo:Nt,scheme:B.enum(At)}),zt=B.object({info:B.record(B.string(),B.unknown()),schema:B.record(B.string(),B.unknown())}),Bt=B.record(B.string(),zt),Vt=B.object({accepts:B.array(Rt).check(B.minLength(1)),error:B.optional(B.string()),extensions:B.optional(Bt),resource:Lt,x402Version:B.literal(2)}),Ht=B.object({authorization:B.object({from:Ft,nonce:U(),to:Ft,validAfter:J,validBefore:J,value:J}),signature:W()}),Ut=B.object({permit2Authorization:B.object({deadline:J,from:Ft,nonce:J,permitted:B.object({amount:J,token:Ft}),spender:Ft,witness:B.object({to:Ft,validAfter:J})}),signature:W()}),Wt=B.union([Ht,Ut]),Gt=B.object({accepted:Rt,extensions:B.optional(Bt),payload:Wt,resource:B.optional(Lt),x402Version:B.literal(2)});B.object({extensions:B.optional(Bt),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 Kt=B.object({amount:B.optional(J),errorMessage:B.optional(B.string()),errorReason:B.optional(B.string()),extensions:B.optional(Bt),extra:B.optional(B.record(B.string(),B.unknown())),network:Nt,payer:B.optional(B.string()),success:B.boolean(),transaction:B.string()});function qt(e){let{extensions:t,resource:n,...r}=e;return Rt.parse(r)}const Jt=Ot(Vt),Yt=Ot(Gt),Xt=Ot(Kt);Jt.encode,Jt.decode;function Zt(e){try{let t=JSON.parse(x.toString(e));return $t(t)}catch{throw new kt}}const Qt=Yt.encode;Yt.decode,Xt.encode,Xt.decode;const $t=e=>{if(!e||typeof e!=`object`||Array.isArray(e))throw new kt;let t=e;if(t.x402Version!==2||!Array.isArray(t.accepts))throw new kt;let n=Lt.parse(t.resource),r=t.extensions===void 0?void 0:Bt.safeParse(t.extensions).data;return{accepts:t.accepts,...r?{extensions:r}:{},resource:n,x402Version:2}};function en(e){let t=[z(e.accepted),z(e.resource),z(e.extensions)].join(`|`);return C.sha256(S.fromString(t),{as:`Hex`})}async function tn(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=qt(n);if(on(e.config,r),!n.resource)throw Error(`x402 exact EIP-3009 requires resource information.`);let i=n.extensions?.mppx?cn(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?en({accepted:r,extensions:i,resource:n.resource}):un(),to:o(r.payTo),validAfter:(l-600).toString(),validBefore:(l+r.maxTimeoutSeconds).toString(),value:r.amount},d=await t.signTypedData({domain:{chainId:an(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:rn});return Qt({accepted:r,...i?{extensions:i}:{},payload:{authorization:u,signature:d},...n.resource?{resource:n.resource}:{},x402Version:2})}function nn(e){let t=e.challenge.request,n;try{n=qt(t),on(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 rn={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 an(e){return Number(e.slice(7))}function on(e,t){let n=an(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=>De(e))&&!e.networks?.length)throw Error(`x402 exact raw currency allowlists require networks.`);if(r){let e=o(t.asset);if(!r.some(n=>ke(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=sn(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 sn(e,t){let n=e.currencies??e.assets,r=o(t.asset),i=n?.find(e=>ke(e,r,t.network)),a=i?Oe(i,t.network):void 0;return a?.decimals===void 0?e.decimals:a.decimals}function cn(e){let t=e.mppx;return t?{...e,mppx:{...t,info:{...t.info,nonce:ln()}}}:e}function ln(){return dn().slice(2)}function un(){return dn()}function dn(){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 fn=Symbol.for(`mppx.x402.challenge`);function pn(e){return Object.defineProperty(e,fn,{value:!0}),e}function mn(e){return!!e?.[fn]}const hn=[`authorization`],gn=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 _n=B.object({chainId:B.number(),credentialTypes:B.optional(B.array(B.enum(hn)).check(B.minLength(1))),decimals:B.optional(B.number()),permit2Address:B.optional(H()),splits:B.optional(B.array(B.object({amount:gn,recipient:H()})))});B.object({amount:gn,currency:H(),description:B.optional(B.string()),externalId:B.optional(B.string()),methodDetails:_n,recipient:H()});const vn=B.object({amount:V(),chainId:B.number(),currency:H(),credentialTypes:B.optional(B.array(B.enum(hn)).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:gn,recipient:H()})))}),yn=B.object({from:H(),nonce:U(),signature:W(),to:H(),type:B.literal(`authorization`),validAfter:gn,validBefore:gn,value:gn}),bn={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 xn(e){return{chainId:e.chainId,name:e.authorization.name,verifyingContract:e.currency,version:e.authorization.version}}function Sn(e){return C.keccak256(S.fromString(`${e.id}${e.realm}`),{as:`Hex`})}function Cn(e){return`eip155:${e}`}function wn(e){return`did:pkh:eip155:${e.chainId}:${e.address}`}const Tn=Et({name:`evm`,intent:`charge`,schema:{credential:{payload:yn},request:B.pipe(vn,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 En(e){return Dt(Tn,{canHandleChallenge({challenge:t}){return!Dn(t)||nn({challenge:t,config:e})},context:B.object({account:B.optional(B.custom())}),async createCredential({challenge:t,context:n}){if(Dn(t))return tn({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(On(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=kn(e,i),s=t.expires?Math.floor(new Date(t.expires).getTime()/1e3).toString():(Math.floor(Date.now()/1e3)+300).toString();return K(xt({challenge:t,payload:{from:o(r.address),nonce:Sn(t),signature:await r.signTypedData({domain:xn({authorization:a,chainId:i.methodDetails.chainId,currency:i.currency}),message:{from:o(r.address),nonce:Sn(t),to:o(i.recipient),validAfter:0n,validBefore:BigInt(s),value:BigInt(i.amount)},primaryType:`TransferWithAuthorization`,types:bn}),to:o(i.recipient),type:`authorization`,validAfter:`0`,validBefore:s,value:i.amount},source:wn({address:o(r.address),chainId:i.methodDetails.chainId})}))}})}function Dn(e){return mn(e)&&e.request.scheme===`exact`&&typeof e.request.network==`string`}function On(e,t){let n=t.methodDetails.chainId,r=Cn(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=>De(e))&&!e.networks?.length)throw Error(`EVM raw currency allowlists require networks.`);if(i){let e=o(t.currency);if(!i.some(t=>ke(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=An(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 kn(e,t){let n=e.currencies??e.assets,r=o(t.currency),i=Cn(t.methodDetails.chainId),a=n?.find(e=>ke(e,r,i)),s=a?Oe(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 An(e,t){let n=e.currencies??e.assets,r=o(t.currency),i=Cn(t.methodDetails.chainId),a=n?.find(e=>ke(e,r,i)),s=a?Oe(a,i):void 0;return s?.decimals===void 0?e.decimals:s.decimals}function jn(e){return[jn.charge(e)]}(function(e){e.charge=En,e.assets=Ne,e.chains=Pe})(jn||={});var Mn=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 Nn(this,e)}},Y=class extends Mn{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 Nn(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},Pn={usdc:`0x20C000000000000000000000b9537d11c60E8b50`,pathUsd:`0x20c0000000000000000000000000000000000000`};X.mainnet,Pn.usdc,X.testnet,Pn.pathUsd;const Fn={[X.mainnet]:`0x33b901018174DDabE4841042ab76ba85D4e24f25`,[X.testnet]:`0xe1c4d3dce17bc111181ddf716f75bae49e61a336`},In={[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 Ln(e,t){return Z.link(e,t)}function Rn(e){return e.startsWith(`tempo:`)}function zn(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 Bn={mainnet:In[X.mainnet],testnet:In[X.testnet]};function Vn(e,t={}){return e??(t.network?Bn[t.network]:void 0)??(process.env.MPPX_RPC_URL?.trim()||process.env.RPC_URL?.trim()||void 0)}async function Hn(t={}){let n=Vn(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 Un(e){return typeof e==`bigint`?e:e.amount}function Wn(e){return e.id!==N.id}async function Gn(e,t,n){let{Actions:r}=await import(`viem/tempo`),[i,a]=await Promise.all([r.token.getBalance(e,{account:n,token:t}).then(Un).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 Kn(){let e=Number.parseInt(process.env.MPPX_KEYCHAIN_COMMAND_TIMEOUT_MS??``,10);return Number.isFinite(e)&&e>0?e:1e4}function qn(e,t){return`code`in e&&e.code===`ENOENT`&&e.message.includes(t)}function Jn(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 Yn(e){if(e&&qn(e,`secret-tool`))throw Jn(e)}function Xn(e,t){return new Promise(n=>{O.execFile(e,t,{timeout:Kn()},(e,t,r)=>{n({stdout:t.trim(),stderr:r.trim(),error:e})})})}function Zn(){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 Qn(e){return e||(process.env.MPPX_ACCOUNT?.trim()?process.env.MPPX_ACCOUNT:Zn().get())}function $n(e=`main`){let t=`mppx`;return{async list(){let e=A.platform();if(e===`darwin`){let{stdout:e,error:n}=await Xn(`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 Xn(`secret-tool`,[`search`,`--all`,`--unlock`,`service`,t]);if(Yn(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 Xn(`security`,[`find-generic-password`,`-s`,t,`-a`,e,`-w`]);return r?void 0:n}if(n===`linux`){let{stdout:n,error:r}=await Xn(`secret-tool`,[`lookup`,`service`,t,`account`,e]);return Yn(r),r?void 0:n||void 0}throw Error(`Unsupported platform: ${n}`)},async set(n){let r=A.platform();if(r===`darwin`){await Xn(`security`,[`delete-generic-password`,`-s`,t,`-a`,e]);let{error:r}=await Xn(`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(),Kn());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(qn(e,`secret-tool`)?Jn(e):e)})})}throw Error(`Unsupported platform: ${r}`)},async delete(){let n=A.platform();if(n===`darwin`){await Xn(`security`,[`delete-generic-password`,`-s`,t,`-a`,e]);return}if(n===`linux`){let{error:n}=await Xn(`secret-tool`,[`clear`,`service`,t,`account`,e]);Yn(n);return}throw Error(`Unsupported platform: ${n}`)}}}async function er(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=Qn(e),i=await $n(r).get();if(i)return{account:t(i),accountName:r,source:`keychain`};throw Error(`Account "${r}" not found.`)}async function tr(e){return(await er(e)).account}function nr(e){return e}function rr(){return nr({method:`evm`,async setup({challenge:t}){let n=t.request,r=n.methodDetails,a=r?.chainId,o=a?ir(a):void 0,s=n.currency,l=await tr(),u=[...Object.values(xe),...Object.values(Se),...Object.values(Ce),...Object.values(we)],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:[...jn({account:l,currencies:u})]}}})}function ir(e){return Object.values(v).find(t=>t.id===e)}const ar=Et({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(),paymentMethodTypes:B.array(B.string()).check(B.minLength(1)),recipient:B.optional(B.string())}),B.transform(({amount:e,decimals:t,metadata:n,networkId:r,paymentMethodTypes:i,...a})=>({...a,amount:d(e,t).toString(),methodDetails:{networkId:r,paymentMethodTypes:i,...n!==void 0&&{metadata:n}}})))}});function or(e){let{client:t,createToken:n,externalId:r,paymentMethod:i}=e;return Dt(ar,{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 sr(e){return[or(e)]}(function(e){e.charge=or})(sr||={});function cr(){return nr({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=ur(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:[sr.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=lr(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&&lr(e)?`/test`:``}/payments/${t}`;return Z.link(n,t,!0)}}})}function lr(e){return e.startsWith(`sk_test_`)||e.startsWith(`rk_test_`)}function ur(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 dr(e){let t={};for(let n of e){let e=t[n.name]??={};e[n.intent]=gr(n)}return t}function fr(e,t){let n=dr(e),r=Cr(e,n,t),i=e.map((e,t)=>({intent:e.intent,method:e.name,q:r[gr(e)]??1,index:t}));return{definition:r,entries:i,header:mr(i),keys:n}}function pr(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)=>xr(e,t))}function mr(e){return e.map(({method:e,intent:t,q:n})=>{let r=`${e}/${t}`;return n===1?r:`${r};q=${Dr(n)}`}).join(`, `)}function hr(e,t,n){let r=new Map;for(let e of t){let t=gr(e),n=r.get(t);n?n.push(e):r.set(t,[e])}return e.flatMap((e,t)=>{let i=r.get(gr(e));if(!i)return[];let a=_r(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)=>br(e.challenge)-br(t.challenge)||t.match.q-e.match.q||e.index-t.index).map(e=>{let{match:t,...n}=e;return n})}function gr(e){let t=e.method??e.name;if(!t)throw Error(`Missing payment method name.`);return`${t}/${e.intent}`}function _r(e,t){let n;for(let r of t){if(!vr(e,r))continue;let t={...r,specificity:yr(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 vr(e,t){return(t.method===`*`||t.method===e.method)&&(t.intent===`*`||t.intent===e.intent)}function yr(e){return Number(e.method!==`*`)+Number(e.intent!==`*`)}function br(e){return+!!mn(e)}function xr(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}`);Or(r,`method`),Or(i,`intent`);let a=1;for(let t of Sr(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=Tr(i,`Accept-Payment entry "${e}"`))}return{intent:i,method:r,q:a,index:t}}function Sr(e){return e?e.split(/\s*;\s*/).filter(Boolean):[]}function Cr(e,t,n){if(!n)return{};let r=typeof n==`function`?n(t):n,i=new Set(e.map(e=>gr(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]=wr(t,`payment preference "${e}"`)}return a}function wr(e,t){if(typeof e!=`number`||Number.isNaN(e)||!Number.isFinite(e))throw Error(`Invalid q-value for ${t}. Expected a finite number.`);return Er(e,t)}function Tr(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 Er(Number(e),t)}function Er(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 Dr(e){return e.toFixed(3).replace(/\.0+$/,``).replace(/(\.\d*?)0+$/,`$1`)}function Or(e,t){if(e!==`*`&&!/^[a-z0-9-]+$/.test(e))throw Error(`Invalid Accept-Payment ${t}: ${e}`)}const kr=[R.authorization,jt,`PAYMENT-RESPONSE`,Mt];function Ar(e,t,n){let r=new Headers(e.headers);for(let e of kr)e===R.authorization&&!r.get(e)?.startsWith(`Payment `)||r.delete(e);return r.set(t,n),{...e,headers:r}}function jr(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 Mr=new WeakMap;function Nr(e){let t=jr(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 Pr(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 Fr(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=$e.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 Ir(e){if(e)return`error`in e?e.error?.code===-32042?Fr(e.error.data):void 0:Fr(e.result?._meta?.[`org.paymentauth/payment-required`])}function Lr(e,t){return!e||e.id!==t?[]:Ir(e)?.challenges??[]}async function Rr(e){let t=e.clone().body?.getReader();if(!t)return;let n=new TextDecoder,r=!1,i,a=se({onEvent(e){if(!(r||!e.data)&&(r=!0,!(e.event&&e.event!==`message`)))try{i=Pr(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 zr(e){let t=Mr.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(Pr).catch(()=>void 0);if(t.includes(`text/event-stream`))return Rr(e)})();return Mr.set(e,n),n}function Br(){return{getChallenges(e,t){let n=Nr(t);return e.status===402||n===void 0?[]:zr(e).then(e=>Lr(e,n))},setCredential(e,t){let n=JSON.parse(e.body),r=vt(t);return{...e,body:JSON.stringify({...n,params:{...n.params,_meta:{...n.params?._meta,"org.paymentauth/credential":r}}})}}}}function Vr(){return{getChallenges(e){return e.status!==402||!e.headers.has(R.wwwAuthenticate)?[]:lt(e)},setCredential(e,t,n){return Ar(e,n?.challenge?pt(n.challenge):R.authorization,t)}}}function Hr(){return{getChallenges(e){if(e.status!==402)return[];let t=e.headers.get(jt);if(!t)return[];let n=Zt(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=Rt.safeParse(e);if(!r.success)return[];let i=r.data;return pn(et({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 Ar(e,Mt,t)}}}function Ur(e){return e}function Wr(){let e=[Vr(),Hr(),Br()],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 Ur({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 Gr=new WeakMap;function Kr(e,t){return Gr.set(e,t),e}function qr(e){return Gr.has(e)}function Jr(e,t){return Promise.resolve(Gr.get(e)?.(t))}const Yr=new WeakMap,Xr=new WeakMap;function Zr(e,t){return Yr.set(e,t),e}function Qr(e){Yr.delete(e)}function $r(e,t,n){Yr.has(e)&&Xr.set(t,n)}function ei(e){return Xr.get(e)}function ti(e,t){return Promise.resolve(Yr.get(e)?.(t)??t.response)}const ni=Symbol.for(`mppx.fetch.wrapper`),ri=new WeakMap;async function ii(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 ai(e){let{acceptPayment:t,acceptPaymentPolicy:n=`always`,fetch:r=globalThis.fetch,maxPaymentRetries:i=3,methods:a,onChallenge:o,orderChallenges:s,transport:c=Wr()}=e,l=e.eventDispatcher??oi(),u=t??fr(a),d=Di(r),f=async(e,t,r)=>{let p=Ei(e,t?.headers),m=p.has(R.acceptPayment),h=Mi(p,u),g=wi(e,t,p),_=Ci(e,t,p,h.header,m,n),v=await d(Oi(_.input),_.init),y=Ti(_.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 Ni(hr(T,a,h.entries),S??s))[0];if(!i){if(await ii(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&&Tt(w.expires,w.id);let p=Ri(v,_.input,_.input),m=D,g=tt(u),x=m?.method===i.method&&m?.key===g,O=!1;if(m){let e=await ii(m,{challenges:T,response:v,status:x?`pending`:`rejected`});O=x&&!e}D=O?m:void 0;let k=di(async e=>{if(e===void 0&&O&&m)return m.promise;O&&m&&(await ii(m,{status:`rejected`}),D=void 0);let t=e??b;if(!qr(i.method))return ji(u,i.method,t);let n={prepare:()=>Jr(i.method,{challenge:u,context:t,fetch:d,input:p})},r=n.prepare().then(()=>ji(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`,fi({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 ii(j,{status:`rejected`}),D=void 0),Ai(A),await l.emit(`credential.created`,pi({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 ii(j,{response:v,status:v.ok?`accepted`:`rejected`}),D=void 0),v.ok&&si(l,`payment.response`)&&await l.emit(`payment.response`,mi({challenge:u,credential:A,init:t,input:e,method:i.method,response:v})),!M)return v.ok?ti(i.method,{challenge:u,credential:A,fetch:d,headers:_.headers,input:p,...r?{refetch:()=>f(Oi(_.input),t,!1)}:{},response:v,signal:ki(e,t)}):v}T=void 0;try{T=await c.getChallenges(v,y)}catch{}return await ii(D,{challenges:T,response:v,status:`rejected`}),v}catch(n){throw await ii(D,{challenges:T,response:v,status:`rejected`}),await l.emit(`payment.failed`,hi({challenge:w,challenges:T,error:n,init:t,input:e,method:E,response:v})),n}},p=(e,t)=>f(e,t,!0);return p[ni]=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 oi(){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 ci(t,n);if(typeof e==`string`&&e.length>0){r=e;break}}return await ui(e[`*`],t,n),r}case`credential.created`:await li(e[`credential.created`],n),await ui(e[`*`],t,n);return;case`payment.failed`:await li(e[`payment.failed`],n),await ui(e[`*`],t,n);return;case`payment.response`:await li(e[`payment.response`],n),await ui(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 ri.set(t,t=>e[t].size>0||e[`*`].size>0),t}function si(e,t){return ri.get(e)?.(t)??!0}async function ci(e,t){try{return await e(t)}catch{return}}async function li(e,t){for(let n of e)try{await n(t)}catch{}}async function ui(e,t,n){await li(e,Object.freeze({name:t,payload:n}))}function di(e){let t;return n=>(t??=e(n),t)}function fi(e){return Object.freeze({challenge:bi(e.challenge),challenges:e.challenges.map(e=>bi(e)),createCredential:e.createCredential,init:gi(e.init),input:_i(e.input),method:vi(e.method),response:yi(e.response)})}function pi(e){return Object.freeze({challenge:bi(e.challenge),credential:e.credential,init:gi(e.init),input:_i(e.input),method:vi(e.method),...e.response===void 0?{}:{response:yi(e.response)}})}function mi(e){return Object.freeze({challenge:bi(e.challenge),credential:e.credential,init:gi(e.init),input:_i(e.input),method:vi(e.method),response:yi(e.response)})}function hi(e){return Object.freeze({...e.challenge?{challenge:bi(e.challenge)}:{},...e.challenges?{challenges:e.challenges.map(e=>bi(e))}:{},error:e.error,init:gi(e.init),input:_i(e.input),...e.method?{method:vi(e.method)}:{},...e.response===void 0?{}:{response:yi(e.response)}})}function gi(e){if(e)return Si({...e,...e.headers?{headers:new Headers(e.headers)}:{}})}function _i(e){if(e instanceof Request)try{return e.clone()}catch{return e}return e instanceof URL?new URL(e):e}function vi(e){return Si(Object.assign({},e))}function yi(e){return e instanceof Response?e.clone():bi(e)}function bi(e){try{return xi(structuredClone(e))}catch{return Si(e)}}function xi(e){if(!e||typeof e!=`object`||Object.isFrozen(e))return e;Object.freeze(e);for(let t of Object.values(e))xi(t);return e}function Si(e){return!e||typeof e!=`object`||Object.isFrozen(e)||Object.freeze(e),e}function Ci(e,t,n,r,i,a){let o=!!r&&!i&&Pi(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 wi(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 Ti(e,t){return t===void 0?e:{...e,body:t}}function Ei(e,t){return t?new Headers(t):new Headers(e instanceof Request?e.headers:void 0)}function Di(e){let t=e;for(;t[ni];)t=t[ni];return t}function Oi(e){if(!(e instanceof Request)||!e.body||e.bodyUsed)return e;try{return e.clone()}catch{return e}}function ki(e,t){return t?.signal??(e instanceof Request?e.signal:void 0)}function Ai(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 ji(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&&$r(t,a,r),t.createCredential(a)}function Mi(e,t){let n=e.get(R.acceptPayment);if(!n)return t;try{return{...t,entries:pr(n),header:n}}catch{return t}}async function Ni(e,t){return t?t(e):e}function Pi(e,t){if(t===`always`)return!0;if(t===`never`)return!1;let n=Li(e);return t===`same-origin`?!Ii()||n.origin===globalThis.location.origin:t.origins.some(e=>Fi(n,e))}function Fi(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 Ii(){return globalThis.location!==void 0}function Li(e){return e instanceof URL?e:e instanceof Request?new URL(e.url):new URL(e,Ii()?globalThis.location.href:void 0)}function Ri(e,t,n){if(!e.url)return t;let r=new URL(e.url),i=Li(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 zi(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 ae(r)}}function Bi(e){return Object.fromEntries(Object.entries(e.headers??{}).filter(([e])=>e.toLowerCase()!==`content-type`))}const Vi={[N.id]:N,[ee.id]:ee};function Hi(e,t={}){return c(e.url,{fetchOptions:{headers:Bi(e)},...t})}function Ui(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=ie(n({request:t=>e(t)},{retryCount:0}),Hi(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?ie(c(r),Hi(o)):c(r);return e({chain:Vi[n]??{...i,id:n},transport:a})}}const Wi=w.slice(C.keccak256(S.fromString(`mpp`),{as:`Hex`}),0,4);function Gi(e){let t=C.keccak256(S.fromString(e),{as:`Hex`});return w.toBytes(w.slice(t,0,10))}function Ki(e){let{serverId:t,clientId:n,challengeId:r}=e,i=new Uint8Array(32);return i.set(w.toBytes(Wi),0),i[4]=1,i.set(Gi(t),5),n&&i.set(Gi(n),15),i.set(qi(r),25),w.fromBytes(i)}function qi(e){let t=C.keccak256(S.fromString(e),{as:`Hex`});return w.toBytes(w.slice(t,0,7))}function Ji(e,t){return le.resolve(e).toLowerCase()===le.resolve(t).toLowerCase()}const Yi=[Pn.pathUsd,Pn.usdc];async function Xi(e,t){let{account:n,amountOut:r,tokenOut:i,tokenIn:a,slippage:o}=t,s=a.filter(e=>!Ji(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 Qi({currency:i})}}function Zi(e,t){return e?e===!0?{tokenIn:t,slippage:1}:{tokenIn:e.tokenIn?[...e.tokenIn,...t.filter(t=>!e.tokenIn.some(e=>Ji(e,t)))]:t,slippage:e.slippage??1}:!1}var Qi=class extends Error{name=`InsufficientFundsError`;constructor({currency:e}){super(`Insufficient funds: no balance in ${e} and no viable swap route from fallback currencies.`)}};function $i(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}))]}const ea={Proof:[{name:`account`,type:`address`},{name:`challengeId`,type:`string`},{name:`realm`,type:`string`}]};function ta(e){return{name:`MPP`,version:`3`,chainId:e}}function na(e){let{account:t,challengeId:n,realm:r}=e;return{account:t,challengeId:n,realm:r}}function ra(e){let{account:t,chainId:n,challengeId:r,realm:i}=e;return{domain:ta(n),types:ea,primaryType:`Proof`,message:na({account:t,challengeId:r,realm:i})}}function ia(e){return`did:pkh:eip155:${e.chainId}:${e.address}`}const aa=[`push`,`pull`],oa=B.object({amount:V(),memo:B.optional(U()),recipient:B.pipe(B.string(),B.transform(e=>e))}),sa=(1n<<64n)-1n,ca={dev_second:1n,day:86400n,week:604800n},la=B.pipe(H(),B.transform(e=>e.toLowerCase())),ua=B.object({accessKeyAddress:la,keyType:B.enum([`p256`,`secp256k1`,`webAuthn`])}),da=B.object({accessKey:B.optional(ua),chainId:B.optional(B.number())}),fa=Je(`subscriptionExpires must be a valid date`).check(B.refine(e=>e.getTime()%1e3==0,`subscriptionExpires must be representable as whole seconds`)),pa=B.enum([`dev_second`,`day`,`week`]),ma=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)<=sa}catch{return!1}},`periodCount exceeds uint64`));function ha(e){return B.refine(e=>{let{amount:t,decimals:n}=e;return d(t,n)>0n},e)}function ga(e){let{periodCount:t,periodUnit:n}=e;try{let e=ca[n];return e!==void 0&&BigInt(t)*e<=sa}catch{return!1}}const _a=Et({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(oa).check(B.minLength(1),B.maxLength(10))),supportedModes:B.optional(B.array(B.enum(aa)).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}}}:{}})))}}),va=Et({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([Ue.v2,Ue.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&&{[He.sessionProtocol]:l},...u!==void 0&&{[He.sessionSnapshot]:u}}})))}}),ya=Et({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(ua),chainId:B.optional(B.number()),currency:la,decimals:B.number(),description:B.optional(B.string()),externalId:B.optional(B.string()),methodDetails:B.optional(da),periodCount:ma,periodUnit:pa,recipient:la,subscriptionExpires:fa}).check(ha(`Subscription amount must be greater than 0`),B.refine(ga,`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}:{}}}))}}),ba=B.object({account:B.optional(B.custom()),autoSwap:B.optional(B.custom()),mode:B.optional(B.enum(aa))});function xa(e={}){let{clientId:t}=e,n=Ui({chain:N,getClient:e.getClient,rpcUrl:In}),r=zi({account:e.account});return Dt(_a,{context:ba,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:u}=i,{amount:d,methodDetails:p}=u,v=p?.supportedModes??[`pull`,`push`],y=r(c,a);if(BigInt(d)===0n)return K({challenge:i,payload:{signature:await _(c,{account:y,...ra({account:y.address,chainId:l,challengeId:i.id,realm:i.realm})}),type:`proof`},source:ia({address:y.address,chainId:l})});let b=u.currency;if(e.expectedRecipients){let t=new Set(e.expectedRecipients.map(e=>e.toLowerCase())),n=p?.splits;if(n){for(let e of n)if(!t.has(e.recipient.toLowerCase()))throw Error(`Unexpected split recipient: ${e.recipient}`)}}let x=p?.memo?p.memo:Ki({challengeId:i.id,clientId:t,serverId:i.realm}),S=$i({amount:d,methodDetails:{...p,memo:x},recipient:u.recipient}).map(e=>F.token.transfer.call(c,{amount:BigInt(e.amount),...e.memo&&{memo:e.memo},to:e.recipient,token:b})),C=Zi(a?.autoSwap??e.autoSwap,Yi),w=await e.resolveAccount?.({account:y,chainId:l,operation:{kind:`executeCalls`,...C?{}:{calls:S}}})??y,T=(()=>{let t=a?.mode??e.mode;if(t){if(!v.includes(t))throw Error(`Challenge does not support ${t} mode.`);return t}let n=w.type===`json-rpc`?`push`:`pull`;return v.includes(n)?n:v[0]})(),E=[...(C?await Xi(c,{account:w.address,amountOut:BigInt(d),tokenOut:b,tokenIn:C.tokenIn,slippage:C.slippage}):void 0)??[],...S],D=(()=>{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(T===`push`){let{receipts:e}=w.type===`local`?{receipts:[await h(c,{account:w,calls:E,nonceKey:`expiring`,validBefore:D})]}:await m(c,{account:w,calls:E,experimental_fallback:E.length===1,forceAtomic:E.length>1}),t=e?.[0]?.transactionHash;if(!t)throw Error(`No transaction receipt returned.`);return K({challenge:i,payload:{hash:t,type:`hash`},source:ia({address:w.address,chainId:l})})}let O=await f(c,{account:w,calls:E,nonceKey:`expiring`,validBefore:D});if(O.gas=(O.gas??0n)+5000n,p?.feePayer){let e=O;delete e.feePayerSignature,delete e.feeToken,e.feePayer=!0}return K({challenge:i,payload:{signature:await g(c,O),type:`transaction`},source:ia({address:w.address,chainId:l})})}})}function Sa(e){return`accessKeyAddress`in e}function Ca(e){return Sa(e)?e.accessKeyAddress:e.address}function wa(e,t){return{name:`Tempo Stream Channel`,version:`1`,chainId:t,verifyingContract:e}}const Ta={Voucher:[{name:`channelId`,type:`bytes32`},{name:`cumulativeAmount`,type:`uint128`}]};function Ea(e){return{channelId:e.channelId,cumulativeAmount:e.cumulativeAmount}}function Da(e,t,n){return s({domain:wa(e,t),types:Ta,primaryType:`Voucher`,message:Ea(n)})}async function Oa(e,t,n,r,i){return _(e,{account:t,domain:wa(r,i),types:Ta,primaryType:`Voucher`,message:Ea(n)})}function ka(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 Aa(e){return e.type!==`keychain`&&e.type===`secp256k1`}function ja(e){if(!Aa(e))throw Error(`Session vouchers only support secp256k1 signatures until TIP-1020 voucher verification is enabled.`)}async function Ma(e,t,n,r,i,a){let o=a??t,s=Ca(o),c=Da(r,i,n),l=ka(Sa(o)?await o.sign({hash:c,raw:!0}):await Oa(e,o,n,r,i)),u=L.from(l);if(ja(u),!L.verify(u,{address:s,payload:c}))throw Error(`voucher signature does not match voucher signer`);return l}function Na(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 Pa=[{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 Fa(e,t,n){return p(e,{address:t,abi:Pa,functionName:`getChannel`,args:[n]})}a({abi:Pa,name:`open`}),a({abi:Pa,name:`topUp`});function Ia(e,t){return t??e}function La(e,t,n,r=!1){let i=e.request.methodDetails?.escrowContract,a=n??Fn[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 Ra(e,t,n,r){return K({challenge:e,payload:t,source:`did:pkh:eip155:${n}:${r.address}`})}async function za(e,t,n,r,i,a,o){let s=Ia(t,o),c=await Ma(e,t,{channelId:n,cumulativeAmount:r},i,a,s);return{action:`voucher`,channelId:n,cumulativeAmount:r.toString(),signature:c}}async function Ba(e,t,n){let{escrowContract:i,payee:a,currency:o,deposit:s,initialAmount:c,chainId:l,feePayer:u}=n,d=Ia(t,n.voucherSigner),p=Ca(d),m=w.random(32),h=Na({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:Pa,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 Ma(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 Va(e,t,n,r){try{let i=await Fa(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 Ha=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 Ua(e={}){let{allowCustomEscrow:t=!1,decimals:n=6}=e,r=Ui({chain:N,getClient:e.getClient,rpcUrl:In}),i=zi({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 La(n,r,e)}return La(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 Va(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()!==Ca(w).toLowerCase()&&(E=void 0);let D;if(E?.opened)E.cumulativeAmount+=b,D=await za(g,i,E.channelId,E.cumulativeAmount,_,h,w),l(E);else{let e=await Ba(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 Ra(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 Ma(p,i,{channelId:v,cumulativeAmount:y},x,u,_);S={action:`open`,type:`transaction`,channelId:v,transaction:g,authorizedSigner:Ca(_),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 za(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 Ma(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 Ra(t,S,u,i)}return Dt(va,{canHandleChallenge({challenge:e}){let t=We(e.request.methodDetails,He.sessionProtocol);return t===void 0||t===Ue.v1},context:Ha,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 Wa=(1n<<96n)-1n;function Ga(e){return e>=0n&&e<=Wa}function Ka(e){if(!/^\d{1,29}$/.test(e))return;let t=BigInt(e);return Ga(t)?t:void 0}function qa(e){return Ja(e),e}function Ja(e){if(!Ga(e))throw Error(`Value ${e} is outside uint96 bounds.`)}const Ya=new Set([`open`,`topUp`,`voucher`,`close`]);function Xa(e){return typeof e==`object`&&!!e}function Za(e){return typeof e==`string`&&Ya.has(e)}function Qa(e){if(typeof e!=`object`||!e)return!1;let t=e;return!(typeof t.channelId!=`string`||t.action!==void 0&&!Za(t.action))}function $a(e,t=`No session credential context available.`){if(!Qa(e))throw Error(t);return e}function eo(e){let t=e.request.amount;if(typeof t!=`string`)throw Error(`Session challenge is missing amount.`);return BigInt(t)}function to(e){return Xa(e)?typeof e.channelId==`string`&&typeof e.requiredCumulative==`string`&&typeof e.acceptedCumulative==`string`&&typeof e.deposit==`string`:!1}function no(e){return Xa(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 ro(e){let t=x.toString(e),n=JSON.parse(t);if(!no(n))throw Error(`Invalid session receipt.`);return n}function io(e){return e.headers.get(`content-type`)?.toLowerCase().startsWith(`text/event-stream`)??!1}function ao(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`,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)}const cr=B.object({metadata:B.record(B.string(),B.string())}),lr=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(cr),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:d(e,t).toString(),methodDetails:{networkId:r,paymentMethodTypes:a,...n!==void 0&&{metadata:n}}})))}});function ur(e){let{client:t,createToken:n,externalId:r,paymentMethod:i}=e;return kt(lr,{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 dr(e){return[ur(e)]}(function(e){e.charge=ur})(dr||={});function fr(){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=mr(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:[dr.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=pr(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&&pr(e)?`/test`:``}/payments/${t}`;return Z.link(n,t,!0)}}})}function pr(e){return e.startsWith(`sk_test_`)||e.startsWith(`rk_test_`)}function mr(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 hr(e){let t={};for(let n of e){let e=t[n.name]??={};e[n.intent]=br(n)}return t}function gr(e,t){let n=hr(e),r=Dr(e,n,t),i=e.map((e,t)=>({intent:e.intent,method:e.name,q:r[br(e)]??1,index:t}));return{definition:r,entries:i,header:vr(i),keys:n}}function _r(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)=>Tr(e,t))}function vr(e){return e.map(({method:e,intent:t,q:n})=>{let r=`${e}/${t}`;return n===1?r:`${r};q=${jr(n)}`}).join(`, `)}function yr(e,t,n){let r=new Map;for(let e of t){let t=br(e),n=r.get(t);n?n.push(e):r.set(t,[e])}return e.flatMap((e,t)=>{let i=r.get(br(e));if(!i)return[];let a=xr(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)=>wr(e.challenge)-wr(t.challenge)||t.match.q-e.match.q||e.index-t.index).map(e=>{let{match:t,...n}=e;return n})}function br(e){let t=e.method??e.name;if(!t)throw Error(`Missing payment method name.`);return`${t}/${e.intent}`}function xr(e,t){let n;for(let r of t){if(!Sr(e,r))continue;let t={...r,specificity:Cr(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 Sr(e,t){return(t.method===`*`||t.method===e.method)&&(t.intent===`*`||t.intent===e.intent)}function Cr(e){return Number(e.method!==`*`)+Number(e.intent!==`*`)}function wr(e){return+!!gn(e)}function Tr(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}`);Mr(r,`method`),Mr(i,`intent`);let a=1;for(let t of Er(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=kr(i,`Accept-Payment entry "${e}"`))}return{intent:i,method:r,q:a,index:t}}function Er(e){return e?e.split(/\s*;\s*/).filter(Boolean):[]}function Dr(e,t,n){if(!n)return{};let r=typeof n==`function`?n(t):n,i=new Set(e.map(e=>br(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]=Or(t,`payment preference "${e}"`)}return a}function Or(e,t){if(typeof e!=`number`||Number.isNaN(e)||!Number.isFinite(e))throw Error(`Invalid q-value for ${t}. Expected a finite number.`);return Ar(e,t)}function kr(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 Ar(Number(e),t)}function Ar(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 jr(e){return e.toFixed(3).replace(/\.0+$/,``).replace(/(\.\d*?)0+$/,`$1`)}function Mr(e,t){if(e!==`*`&&!/^[a-z0-9-]+$/.test(e))throw Error(`Invalid Accept-Payment ${t}: ${e}`)}const Nr=[R.authorization,Nt,`PAYMENT-RESPONSE`,Pt];function Pr(e,t,n){let r=new Headers(e.headers);for(let e of Nr)e===R.authorization&&!r.get(e)?.startsWith(`Payment `)||r.delete(e);return r.set(t,n),{...e,headers:r}}function Fr(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 Ir=new WeakMap;function Lr(e){let t=Fr(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 Rr(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 zr(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 Br(e){if(e)return`error`in e?e.error?.code!==-32042&&e.error?.code!==-32043?void 0:zr(e.error.data):zr(e.result?._meta?.[`org.paymentauth/payment-required`])}function Vr(e,t){return!e||e.id!==t?[]:Br(e)?.challenges??[]}async function Hr(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=Rr(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 Ur(e){let t=Ir.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(Rr).catch(()=>void 0);if(t.includes(`text/event-stream`))return Hr(e)})();return Ir.set(e,n),n}function Wr(){return{getChallenges(e,t){let n=Lr(t);return e.status===402||n===void 0?[]:Ur(e).then(e=>Vr(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 Gr(){return{getChallenges(e){return e.status!==402||!e.headers.has(R.wwwAuthenticate)?[]:dt(e)},setCredential(e,t,n){return Pr(e,n?.challenge?ht(n.challenge):R.authorization,t)}}}function Kr(){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 Pr(e,Pt,t)}}}function qr(e){return e}function Jr(){let e=[Gr(),Kr(),Wr()],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 qr({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 Yr=new WeakMap;function Xr(e,t){return Yr.set(e,t),e}function Zr(e){return Yr.has(e)}function Qr(e,t){return Promise.resolve(Yr.get(e)?.(t))}const $r=new WeakMap,ei=new WeakMap;function ti(e,t){return $r.set(e,t),e}function ni(e){$r.delete(e)}function ri(e,t,n){$r.has(e)&&ei.set(t,n)}function ii(e){return ei.get(e)}function ai(e,t){return Promise.resolve($r.get(e)?.(t)??t.response)}const oi=Symbol.for(`mppx.fetch.wrapper`),si=new WeakMap;async function ci(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 li(e){let{acceptPayment:t,acceptPaymentPolicy:n=`always`,fetch:r=globalThis.fetch,maxPaymentRetries:i=3,methods:a,onChallenge:o,orderChallenges:s,transport:c=Jr()}=e,l=e.eventDispatcher??ui(),u=t??gr(a),d=ji(r),f=async(e,t,r)=>{let p=Ai(e,t?.headers),m=p.has(R.acceptPayment),h=Ii(p,u),g=Oi(e,t,p),_=Di(e,t,p,h.header,m,n),v=await d(Mi(_.input),_.init),y=ki(_.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 Li(yr(T,a,h.entries),S??s))[0];if(!i){if(await ci(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=Hi(v,_.input,_.input),m=D,g=rt(u),x=m?.method===i.method&&m?.key===g,O=!1;if(m){let e=await ci(m,{challenges:T,response:v,status:x?`pending`:`rejected`});O=x&&!e}D=O?m:void 0;let k=hi(async e=>{if(e===void 0&&O&&m)return m.promise;O&&m&&(await ci(m,{status:`rejected`}),D=void 0);let t=e??b;if(!Zr(i.method))return Fi(u,i.method,t);let n={prepare:()=>Qr(i.method,{challenge:u,context:t,fetch:d,input:p})},r=n.prepare().then(()=>Fi(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`,gi({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 ci(j,{status:`rejected`}),D=void 0),Pi(A),await l.emit(`credential.created`,_i({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 ci(j,{response:v,status:v.ok?`accepted`:`rejected`}),D=void 0),v.ok&&di(l,`payment.response`)&&await l.emit(`payment.response`,vi({challenge:u,credential:A,init:t,input:e,method:i.method,response:v})),!M)return v.ok?ai(i.method,{challenge:u,credential:A,fetch:d,headers:_.headers,input:p,...r?{refetch:()=>f(Mi(_.input),t,!1)}:{},response:v,signal:Ni(e,t)}):v}T=void 0;try{T=await c.getChallenges(v,y)}catch{}return await ci(D,{challenges:T,response:v,status:`rejected`}),v}catch(n){throw await ci(D,{challenges:T,response:v,status:`rejected`}),await l.emit(`payment.failed`,yi({challenge:w,challenges:T,error:n,init:t,input:e,method:E,response:v})),n}},p=(e,t)=>f(e,t,!0);return p[oi]=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 ui(){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 fi(t,n);if(typeof e==`string`&&e.length>0){r=e;break}}return await mi(e[`*`],t,n),r}case`credential.created`:await pi(e[`credential.created`],n),await mi(e[`*`],t,n);return;case`payment.failed`:await pi(e[`payment.failed`],n),await mi(e[`*`],t,n);return;case`payment.response`:await pi(e[`payment.response`],n),await mi(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 si.set(t,t=>e[t].size>0||e[`*`].size>0),t}function di(e,t){return si.get(e)?.(t)??!0}async function fi(e,t){try{return await e(t)}catch{return}}async function pi(e,t){for(let n of e)try{await n(t)}catch{}}async function mi(e,t,n){await pi(e,Object.freeze({name:t,payload:n}))}function hi(e){let t;return n=>(t??=e(n),t)}function gi(e){return Object.freeze({challenge:wi(e.challenge),challenges:e.challenges.map(e=>wi(e)),createCredential:e.createCredential,init:bi(e.init),input:xi(e.input),method:Si(e.method),response:Ci(e.response)})}function _i(e){return Object.freeze({challenge:wi(e.challenge),credential:e.credential,init:bi(e.init),input:xi(e.input),method:Si(e.method),...e.response===void 0?{}:{response:Ci(e.response)}})}function vi(e){return Object.freeze({challenge:wi(e.challenge),credential:e.credential,init:bi(e.init),input:xi(e.input),method:Si(e.method),response:Ci(e.response)})}function yi(e){return Object.freeze({...e.challenge?{challenge:wi(e.challenge)}:{},...e.challenges?{challenges:e.challenges.map(e=>wi(e))}:{},error:e.error,init:bi(e.init),input:xi(e.input),...e.method?{method:Si(e.method)}:{},...e.response===void 0?{}:{response:Ci(e.response)}})}function bi(e){if(e)return Ei({...e,...e.headers?{headers:new Headers(e.headers)}:{}})}function xi(e){if(e instanceof Request)try{return e.clone()}catch{return e}return e instanceof URL?new URL(e):e}function Si(e){return Ei(Object.assign({},e))}function Ci(e){return e instanceof Response?e.clone():wi(e)}function wi(e){try{return Ti(structuredClone(e))}catch{return Ei(e)}}function Ti(e){if(!e||typeof e!=`object`||Object.isFrozen(e))return e;Object.freeze(e);for(let t of Object.values(e))Ti(t);return e}function Ei(e){return!e||typeof e!=`object`||Object.isFrozen(e)||Object.freeze(e),e}function Di(e,t,n,r,i,a){let o=!!r&&!i&&Ri(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 Oi(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 ki(e,t){return t===void 0?e:{...e,body:t}}function Ai(e,t){return t?new Headers(t):new Headers(e instanceof Request?e.headers:void 0)}function ji(e){let t=e;for(;t[oi];)t=t[oi];return t}function Mi(e){if(!(e instanceof Request)||!e.body||e.bodyUsed)return e;try{return e.clone()}catch{return e}}function Ni(e,t){return t?.signal??(e instanceof Request?e.signal:void 0)}function Pi(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 Fi(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&&ri(t,a,r),t.createCredential(a)}function Ii(e,t){let n=e.get(R.acceptPayment);if(!n)return t;try{return{...t,entries:_r(n),header:n}}catch{return t}}async function Li(e,t){return t?t(e):e}function Ri(e,t){if(t===`always`)return!0;if(t===`never`)return!1;let n=Vi(e);return t===`same-origin`?!Bi()||n.origin===globalThis.location.origin:t.origins.some(e=>zi(n,e))}function zi(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 Bi(){return globalThis.location!==void 0}function Vi(e){return e instanceof URL?e:e instanceof Request?new URL(e.url):new URL(e,Bi()?globalThis.location.href:void 0)}function Hi(e,t,n){if(!e.url)return t;let r=new URL(e.url),i=Vi(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 Ui(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 Wi(e){return Object.fromEntries(Object.entries(e.headers??{}).filter(([e])=>e.toLowerCase()!==`content-type`))}const Gi={[N.id]:N,[ee.id]:ee};function Ki(e,t={}){return c(e.url,{fetchOptions:{headers:Wi(e)},...t})}function qi(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}),Ki(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?ae(c(r),Ki(o)):c(r);return e({chain:Gi[n]??{...i,id:n},transport:a})}}const Ji=w.slice(C.keccak256(S.fromString(`mpp`),{as:`Hex`}),0,4);function Yi(e){let t=C.keccak256(S.fromString(e),{as:`Hex`});return w.toBytes(w.slice(t,0,10))}function Xi(e){let{serverId:t,clientId:n,challengeId:r}=e,i=new Uint8Array(32);return i.set(w.toBytes(Ji),0),i[4]=1,i.set(Yi(t),5),n&&i.set(Yi(n),15),i.set(Zi(r),25),w.fromBytes(i)}function Zi(e){let t=C.keccak256(S.fromString(e),{as:`Hex`});return w.toBytes(w.slice(t,0,7))}function Qi(e,t){return ue.resolve(e).toLowerCase()===ue.resolve(t).toLowerCase()}const $i=[In.pathUsd,In.usdc];async function ea(e,t){let{account:n,amountOut:r,tokenOut:i,tokenIn:a,slippage:o}=t,s=a.filter(e=>!Qi(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 na({currency:i})}}function ta(e,t){return e?e===!0?{tokenIn:t,slippage:1}:{tokenIn:e.tokenIn?[...e.tokenIn,...t.filter(t=>!e.tokenIn.some(e=>Qi(e,t)))]:t,slippage:e.slippage??1}:!1}var na=class extends Error{name=`InsufficientFundsError`;constructor({currency:e}){super(`Insufficient funds: no balance in ${e} and no viable swap route from fallback currencies.`)}};function ra(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 ia(e,t,n){t&&(n&&!n.some(e=>Qi(e,t))||e.some(e=>Qi(e,t))||e.push(t))}async function aa(e,t,n){try{return(await F.token.getBalance(e,{account:t,token:n})).amount>0n}catch{return!1}}function oa(e){let t=e.chain?.feeToken;if(t)return re.toAddress(t);let n=e.chain?.id;return n?Ln[n]:void 0}function sa(e){let t=[];return ia(t,In.pathUsd),ia(t,Ln[e]),t}async function ca(e){let{account:t,allowedTokens:n,candidateTokens:r,client:i,prioritizeCandidates:a}=e,o=[];if(a)for(let e of r??[])ia(o,e,n);if(ia(o,await F.fee.getUserToken(i,{account:t}).then(e=>e?.address).catch(()=>void 0),n),ia(o,oa(i),n),!a)for(let e of r??[])ia(o,e,n);for(let e of o)if(await aa(i,t,e))return e;return o[0]}const la={Proof:[{name:`account`,type:`address`},{name:`challengeId`,type:`string`},{name:`realm`,type:`string`}]};function ua(e){return{name:`MPP`,version:`3`,chainId:e}}function da(e){let{account:t,challengeId:n,realm:r}=e;return{account:t,challengeId:n,realm:r}}function fa(e){let{account:t,chainId:n,challengeId:r,realm:i}=e;return{domain:ua(n),types:la,primaryType:`Proof`,message:da({account:t,challengeId:r,realm:i})}}function pa(e){return`did:pkh:eip155:${e.chainId}:${e.address}`}const ma=[`push`,`pull`],ha=B.object({amount:V(),memo:B.optional(U()),recipient:B.pipe(B.string(),B.transform(e=>e))}),ga=(1n<<64n)-1n,_a={dev_second:1n,day:86400n,week:604800n},va=B.pipe(H(),B.transform(e=>e.toLowerCase())),ya=B.object({accessKeyAddress:va,keyType:B.enum([`p256`,`secp256k1`,`webAuthn`])}),ba=B.object({accessKey:B.optional(ya),chainId:B.optional(B.number())}),xa=Xe(`subscriptionExpires must be a valid date`).check(B.refine(e=>e.getTime()%1e3==0,`subscriptionExpires must be representable as whole seconds`)),Sa=B.enum([`dev_second`,`day`,`week`]),Ca=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)<=ga}catch{return!1}},`periodCount exceeds uint64`));function wa(e){return B.refine(e=>{let{amount:t,decimals:n}=e;return d(t,n)>0n},e)}function Ta(e){let{periodCount:t,periodUnit:n}=e;try{let e=_a[n];return e!==void 0&&BigInt(t)*e<=ga}catch{return!1}}const Ea=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(ha).check(B.minLength(1),B.maxLength(10))),supportedModes:B.optional(B.array(B.enum(ma)).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}}}:{}})))}}),Da=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}}})))}}),Oa=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(ya),chainId:B.optional(B.number()),currency:va,decimals:B.number(),description:B.optional(B.string()),externalId:B.optional(B.string()),methodDetails:B.optional(ba),periodCount:Ca,periodUnit:Sa,recipient:va,subscriptionExpires:xa}).check(wa(`Subscription amount must be greater than 0`),B.refine(Ta,`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}:{}}}))}}),ka=fe({addresses:{4217:`0x20c000000000000000000000f37de3740ADec032`,42431:`0x20c000000000000000000000f37de3740ADec032`},currency:`USD`,decimals:6,name:`MACH`,symbol:`MACH`}),Aa=B.object({account:B.optional(B.custom()),autoSwap:B.optional(B.custom()),mode:B.optional(B.enum(ma))});function ja(e={}){let{clientId:t}=e,n=qi({chain:N,getClient:e.getClient,rpcUrl:zn}),r=Ui({account:e.account});return kt(Ea,{context:Aa,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 K({challenge:i,payload:{signature:await _(c,{account:b,...fa({account:b.address,chainId:l,challengeId:i.id,realm:i.realm})}),type:`proof`},source:pa({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:Xi({challengeId:i.id,clientId:t,serverId:i.realm}),C=ra({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=ta(a?.autoSwap??e.autoSwap,$i),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 ea(c,{account:T.address,amountOut:BigInt(p),tokenOut:x,tokenIn:w.tokenIn,slippage:w.slippage}):void 0)??[],...C],O=ka.addresses[l],k=sa(l),A=O&&u(x,O)?await ca({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:pa({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:pa({address:T.address,chainId:l})})}})}function Ma(e){return`accessKeyAddress`in e}function Na(e){return Ma(e)?e.accessKeyAddress:e.address}function Pa(e,t){return{name:`Tempo Stream Channel`,version:`1`,chainId:t,verifyingContract:e}}const Fa={Voucher:[{name:`channelId`,type:`bytes32`},{name:`cumulativeAmount`,type:`uint128`}]};function Ia(e){return{channelId:e.channelId,cumulativeAmount:e.cumulativeAmount}}function La(e,t,n){return s({domain:Pa(e,t),types:Fa,primaryType:`Voucher`,message:Ia(n)})}async function Ra(e,t,n,r,i){return _(e,{account:t,domain:Pa(r,i),types:Fa,primaryType:`Voucher`,message:Ia(n)})}function za(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 Ba(e){return e.type!==`keychain`&&e.type===`secp256k1`}function Va(e){if(!Ba(e))throw Error(`Session vouchers only support secp256k1 signatures until TIP-1020 voucher verification is enabled.`)}async function Ha(e,t,n,r,i,a){let o=a??t,s=Na(o),c=La(r,i,n),l=za(Ma(o)?await o.sign({hash:c,raw:!0}):await Ra(e,o,n,r,i)),u=L.from(l);if(Va(u),!L.verify(u,{address:s,payload:c}))throw Error(`voucher signature does not match voucher signer`);return l}function Ua(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 Wa=[{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 Ga(e,t,n){return p(e,{address:t,abi:Wa,functionName:`getChannel`,args:[n]})}a({abi:Wa,name:`open`}),a({abi:Wa,name:`topUp`});function Ka(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 Ja(e,t,n,r){return K({challenge:e,payload:t,source:`did:pkh:eip155:${n}:${r.address}`})}async function Ya(e,t,n,r,i,a,o){let s=Ka(t,o),c=await Ha(e,t,{channelId:n,cumulativeAmount:r},i,a,s);return{action:`voucher`,channelId:n,cumulativeAmount:r.toString(),signature:c}}async function Xa(e,t,n){let{escrowContract:i,payee:a,currency:o,deposit:s,initialAmount:c,chainId:l,feePayer:u}=n,d=Ka(t,n.voucherSigner),p=Na(d),m=w.random(32),h=Ua({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:Wa,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 Ha(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 Za(e,t,n,r){try{let i=await Ga(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 Qa=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 $a(e={}){let{allowCustomEscrow:t=!1,decimals:n=6}=e,r=qi({chain:N,getClient:e.getClient,rpcUrl:zn}),i=Ui({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 Za(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()!==Na(w).toLowerCase()&&(E=void 0);let D;if(E?.opened)E.cumulativeAmount+=b,D=await Ya(g,i,E.channelId,E.cumulativeAmount,_,h,w),l(E);else{let e=await Xa(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 Ja(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 Ha(p,i,{channelId:v,cumulativeAmount:y},x,u,_);S={action:`open`,type:`transaction`,channelId:v,transaction:g,authorizedSigner:Na(_),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 Ya(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 Ha(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 Ja(t,S,u,i)}return kt(Da,{canHandleChallenge({challenge:e}){let t=Ke(e.request.methodDetails,We.sessionProtocol);return t===void 0||t===Ge.v1},context:Qa,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 eo=(1n<<96n)-1n;function to(e){return e>=0n&&e<=eo}function no(e){if(!/^\d{1,29}$/.test(e))return;let t=BigInt(e);return to(t)?t:void 0}function ro(e){return io(e),e}function io(e){if(!to(e))throw Error(`Value ${e} is outside uint96 bounds.`)}const ao=new Set([`open`,`topUp`,`voucher`,`close`]);function oo(e){return typeof e==`object`&&!!e}function so(e){return typeof e==`string`&&ao.has(e)}function co(e){if(typeof e!=`object`||!e)return!1;let t=e;return!(typeof t.channelId!=`string`||t.action!==void 0&&!so(t.action))}function lo(e,t=`No session credential context available.`){if(!co(e))throw Error(t);return e}function uo(e){let t=e.request.amount;if(typeof t!=`string`)throw Error(`Session challenge is missing amount.`);return BigInt(t)}function fo(e){return oo(e)?typeof e.channelId==`string`&&typeof e.requiredCumulative==`string`&&typeof e.acceptedCumulative==`string`&&typeof e.deposit==`string`:!1}function po(e){return oo(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 mo(e){let t=x.toString(e),n=JSON.parse(t);if(!po(n))throw Error(`Invalid session receipt.`);return n}function ho(e){return e.headers.get(`content-type`)?.toLowerCase().startsWith(`text/event-stream`)??!1}function go(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=oo(r);return to(e)?{type:`payment-need-voucher`,data:e}:null}case`payment-receipt`:{let e=oo(r);return no(e)?{type:`payment-receipt`,data:e}:null}default:return{type:`message`,data:r}}}function oo(e){try{return JSON.parse(e)}catch{return null}}function so(e){return JSON.stringify({mpp:`authorization`,authorization:e})}function co(){return JSON.stringify({mpp:`payment-close-request`})}function lo(e){let t=uo(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`&&no(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`&&to(t.data)?{mpp:`payment-need-voucher`,data:t.data}:t.mpp===`payment-receipt`&&no(t.data)?{mpp:`payment-receipt`,data:t.data}:null:null}function uo(e){try{let t=JSON.parse(e);return typeof t!=`object`||!t?null:t}catch{return null}}const fo=`0x4d50500000000000000000000000000000000000`,po={CONNECTING:0,OPEN:1,CLOSING:2,CLOSED:3};function mo(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=Ua({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=ai({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?ro(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=po.CLOSED,r=null}if(e===`open`&&(i=po.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(`
4
+ `);switch(t){case`message`:return{type:`message`,data:r};case`payment-need-voucher`:{let e=_o(r);return fo(e)?{type:`payment-need-voucher`,data:e}:null}case`payment-receipt`:{let e=_o(r);return po(e)?{type:`payment-receipt`,data:e}:null}default:return{type:`message`,data:r}}}function _o(e){try{return JSON.parse(e)}catch{return null}}function vo(e){return JSON.stringify({mpp:`authorization`,authorization:e})}function yo(){return JSON.stringify({mpp:`payment-close-request`})}function bo(e){let t=xo(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`&&po(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`&&fo(t.data)?{mpp:`payment-need-voucher`,data:t.data}:t.mpp===`payment-receipt`&&po(t.data)?{mpp:`payment-receipt`,data:t.data}:null:null}function xo(e){try{let t=JSON.parse(e);return typeof t!=`object`||!t?null:t}catch{return null}}const So=`0x4d50500000000000000000000000000000000000`,Co={CONNECTING:0,OPEN:1,CLOSING:2,CLOSED:3};function wo(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=$a({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=li({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?mo(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=Co.CLOSED,r=null}if(e===`open`&&(i=Co.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=ao(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 ho(hr(lt(x),[b],fr([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=vt(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===po.CONNECTING||M.readyState===po.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=lo(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(so(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(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===po.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:{[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?ro(c):void 0}}}async function ho(e,t){let n=t;return n?n(e):e}function go(e){return BigInt(e.authorizedSigner)===0n?e.payer:e.authorizedSigner}function _o(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 vo(e){return ue.encodeForSigning(e)}function yo(e){let{feePayer:t,transaction:n}=e;return t?{...n,feePayerSignature:null}:n}function bo(e,t){return C.keccak256(w.concat(vo(e),t.sender))}const xo=[{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`}],So=[{name:`settled`,type:`uint96`},{name:`deposit`,type:`uint96`},{name:`closeRequestedAt`,type:`uint32`}],Co={name:`descriptor`,type:`tuple`,components:xo},wo=[{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:[Co,{name:`cumulativeAmount`,type:`uint96`},{name:`signature`,type:`bytes`}],outputs:[]},{type:`function`,name:`topUp`,stateMutability:`nonpayable`,inputs:[Co,{name:`additionalDeposit`,type:`uint96`}],outputs:[]},{type:`function`,name:`close`,stateMutability:`nonpayable`,inputs:[Co,{name:`cumulativeAmount`,type:`uint96`},{name:`captureAmount`,type:`uint96`},{name:`signature`,type:`bytes`}],outputs:[]},{type:`function`,name:`requestClose`,stateMutability:`nonpayable`,inputs:[Co],outputs:[]},{type:`function`,name:`withdraw`,stateMutability:`nonpayable`,inputs:[Co],outputs:[]},{type:`function`,name:`getChannel`,stateMutability:`view`,inputs:[Co],outputs:[{type:`tuple`,components:[{name:`descriptor`,type:`tuple`,components:xo},{name:`state`,type:`tuple`,components:So}]}]},{type:`function`,name:`getChannelState`,stateMutability:`view`,inputs:[{name:`channelId`,type:`bytes32`}],outputs:[{type:`tuple`,components:So}]},{type:`function`,name:`getChannelStatesBatch`,stateMutability:`view`,inputs:[{name:`channelIds`,type:`bytes32[]`}],outputs:[{type:`tuple[]`,components:So}]},{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 To(e,t){return{name:`TIP20 Channel Reserve`,version:`1`,chainId:t,verifyingContract:e}}const Eo={Voucher:[{name:`channelId`,type:`bytes32`},{name:`cumulativeAmount`,type:`uint96`}]};function Do(e,t){return ce.getVoucherSignPayload({chainId:e,channelId:t.channelId,cumulativeAmount:t.cumulativeAmount})}function Oo(e,t,n){return e.toLowerCase()===ce.address.toLowerCase()?Do(t,n):s({domain:To(e,t),types:Eo,primaryType:`Voucher`,message:{channelId:n.channelId,cumulativeAmount:n.cumulativeAmount}})}function ko(e){return e===`secp256k1`||e===`p256`||e===`webAuthn`}function Ao(e,t){return te.signVoucher(e,{chainId:t.chainId,channel:t.channelId,cumulativeAmount:t.cumulativeAmount})}async function jo(e,t,n,r,i){let a=await(async()=>{if(r.toLowerCase()===ce.address.toLowerCase())try{return await Ao(t,{chainId:i,channelId:n.channelId,cumulativeAmount:n.cumulativeAmount})}catch{}return _(e,{account:t,domain:To(r,i),types:Eo,primaryType:`Voucher`,message:n})})(),o=L.from(a);if(!ko(o.type))throw Error(`TIP-1034 vouchers require a TIP-1020 primitive signature; received "${o.type}".`);return L.serialize(o)}function Mo(e,t,n,r){try{let i=L.from(n.signature);if(!ko(i.type)||L.serialize(i).toLowerCase()!==n.signature.toLowerCase())return!1;let a=Oo(e,t,n),o=L.extractAddress({payload:a,signature:i});return L.verify(i,{address:o,payload:a})&&Ji(o,r)}catch{return!1}}function No(e){return typeof e==`object`&&!!e}function Po(e){return typeof e==`string`&&l(e,{strict:!1})?e:void 0}function Fo(e){return Po(e.accessKeyAddress)}function Io(){let e=BigInt(Math.floor(Date.now()/1e3))-60n;return e<=0n?0:Number(BigInt(w.random(8))%e)}function Lo(e){return Fo(e)??e.address}async function Ro(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 zo(e,t){return await g(e,t)}function Bo(e,t,n=!1){let r=e.request.methodDetails,i=No(r)?Po(r.escrowContract)??Po(r.escrow):void 0,a=t??`0x4d50500000000000000000000000000000000000`;if(i&&!Ho(i,a)&&(!n||t!==void 0))throw Error(`Tempo session escrow ${i} does not match client escrow ${a}.`);return i&&!Ho(i,a)?i:a}function Vo(e,t,n,r){return K({challenge:e,payload:t,source:`did:pkh:eip155:${n}:${r.address}`})}function Ho(e,t){return e.toLowerCase()===t.toLowerCase()}async function Uo(e,t,n,r,i,a=fo){let o=_o({...n,chainId:i,escrow:a}),s=qa(r),c=await jo(e,t,{channelId:o,cumulativeAmount:s},a,i);return{action:`voucher`,channelId:o,descriptor:n,cumulativeAmount:s.toString(),signature:c}}async function Wo(e,t,n,r,i,a=fo){let o=await Uo(e,t,n,r,i,a);return{action:`close`,channelId:o.channelId,descriptor:n,cumulativeAmount:o.cumulativeAmount,signature:o.signature}}async function Go(e,t,n){let i=Lo(t),a=n.escrow??`0x4d50500000000000000000000000000000000000`,o=n.operator??`0x0000000000000000000000000000000000000000`,s=w.random(32),c=qa(n.deposit),l=qa(n.initialAmount),u=r({abi:wo,functionName:`open`,args:[n.payee,o,n.token,c,s,i]}),d=await zo(e,await Ro(e,{account:t,calls:[...n.prefixCalls??[],{to:a,data:u}],feePayer:n.feePayer,feeToken:n.feeToken??n.token})),f=re.deserialize(d),p={authorizedSigner:i,expiringNonceHash:bo(yo({...n.feePayer?{feePayer:!0}:{},transaction:f}),{sender:t.address}),operator:o,payee:n.payee,payer:t.address,salt:s,token:n.token},m=_o({...p,chainId:n.chainId,escrow:a});return{action:`open`,type:`transaction`,channelId:m,transaction:d,signature:await jo(e,t,{channelId:m,cumulativeAmount:l},a,n.chainId),descriptor:p,cumulativeAmount:l.toString(),authorizedSigner:p.authorizedSigner}}async function Ko(e,t,n,i,a,o,s=fo,c=[],l=n.token){let u=_o({...n,chainId:a,escrow:s}),d=qa(i);return{action:`topUp`,type:`transaction`,channelId:u,transaction:await zo(e,await Ro(e,{account:t,calls:[...c,{to:s,data:r({abi:wo,functionName:`topUp`,args:[n,d]})}],feePayer:o,feeToken:l,validAfter:Io()})),descriptor:n,additionalDeposit:d.toString()}}function qo(e){let{payee:t,token:n,escrow:r,chainId:i}=e;return`${t.toLowerCase()}:${n.toLowerCase()}:${r.toLowerCase()}:${i}`}function Jo(e){return qo({payee:e.descriptor.payee,token:e.descriptor.token,escrow:e.escrow,chainId:e.chainId})}function Yo(){let e=new Map;return{get:t=>e.get(t),set(t){e.set(Jo(t),t)},delete(t){e.delete(t)}}}const Xo=2n**96n-1n;function Zo(e){if(e<0n||e>Xo)throw new q({reason:`amount exceeds uint96 range`})}async function Qo(e,t,n=fo,r){return $o(await p(e,{address:n,abi:wo,functionName:`getChannelState`,args:[t],...r===void 0?{}:{blockNumber:r}}))}function $o(e){return Zo(e.settled),Zo(e.deposit),{settled:e.settled,deposit:e.deposit,closeRequestedAt:e.closeRequestedAt}}const es=B.custom(e=>typeof e==`string`&&l(e,{strict:!1})),ts=B.custom(e=>typeof e==`string`&&/^0x[0-9a-fA-F]{64}$/.test(e)),ns=B.custom(e=>typeof e==`string`&&/^0x[0-9a-fA-F]+$/.test(e)),rs=B.object({authorizedSigner:es,expiringNonceHash:ts,operator:es,payee:es,payer:es,salt:ts,token:es}),is=Ot(B.object({acceptedCumulative:B.string(),chainId:B.number(),channelId:ts,closeRequestedAt:B.optional(B.string()),deposit:B.string(),descriptor:rs,escrow:es,highestVoucher:B.optional(B.object({channelId:ts,cumulativeAmount:B.string(),signature:ns})),requiredCumulative:B.string(),settled:B.string(),spent:B.string(),units:B.optional(B.number())}));function as(e){return is.encode(e)}function os(e){return is.decode(e)}const ss={status:`idle`};function cs(e){return{status:`active`,...e}}function ls(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:fs(e.challengeId,t.snapshot),effects:[]}:$(e,t);case`activated`:return e.status===`closing`||e.status===`closed`?$(e,t):{state:Ts({challengeId:t.challengeId,entry:t.entry,spent:t.spent,units:t.units??0}),effects:[]};case`opened`:return e.status===`opening`?{state:ps(e.challengeId,t.receipt,t.descriptor,t.deposit),effects:[]}:$(e,t);case`receiptAccepted`:return e.status===`closing`||e.status===`closed`?$(e,t):{state:Os(t.receipt,t.entry),effects:[]};case`needVoucher`:return e.status===`active`?ds({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:ps(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:ps(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 us(e,t){let n=ls(e.state,t);return e.state=n.state,n}function ds(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 fs(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 ps(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 ms(e){let{cumulativeAmount:t,maxVoucherCumulative:n}=e;if(n!==null&&!(t<=n))throw Error(`requested voucher amount ${t} exceeds local maxDeposit ${n}`)}function hs(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`);ms({cumulativeAmount:i,maxVoucherCumulative:n}),ms({cumulativeAmount:a,maxVoucherCumulative:n})}function gs(e){let{channel:t,maxVoucherCumulative:n,receipt:r,spent:i}=e;if(!r||r.channelId!==t?.channelId)return i;hs({channel:t,maxVoucherCumulative:n,receipt:r});let a=BigInt(r.spent);return i>a?i:a}function _s(e,t){return typeof e==`bigint`?e:d(e,t)}function vs(e){let{contextDepositRaw:t,maxDeposit:n,requestAmount:r,suggestedDepositRaw:i}=e;if(bs(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 ys(e){let{deposit:t,maxDeposit:n,requiredCumulative:r,suggestedDeposit:i,topUpAmount:a}=e;if(r<=t)return 0n;ms({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 bs(e,t){ms({cumulativeAmount:e,maxVoucherCumulative:t??null})}function xs(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 Ss(e){let{cumulativeAmount:t,spent:n}=e;return t>n?t:n}function Cs(e){let{cumulativeAmount:t,readySpent:n,spent:r}=e;if(!Ga(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>Ss({cumulativeAmount:t,spent:r}))throw Error(`close-ready spent exceeds local voucher state`)}function ws(e){let{challengeId:t,channelId:n,expectedCloseAmount:r,minimumSpent:i=0n,receipt:a}=e,o=Ka(r),s=Ka(a.spent);return o===void 0||s===void 0||!Ga(i)?!1:!!a.txHash&&a.challengeId===t&&a.channelId===n&&a.acceptedCumulative===r&&s>=i&&s<=o}function Ts(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 Es(){return{channel:null,lastChallenge:null,lastUrl:null,spent:0n,socketSession:null,state:ss}}function Ds(e){let{maxVoucherCumulative:t,receipt:n,runtime:r}=e;r.spent=gs({channel:r.channel,maxVoucherCumulative:t,receipt:n,spent:r.spent}),n&&r.channel?.channelId===n.channelId&&us(r,{type:`receiptAccepted`,receipt:n,entry:r.channel})}function Os(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 ks(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=Ka(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 As(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 ls(o,{type:`activated`,challengeId:r,entry:t,spent:a.toString(),units:o.status===`active`?o.units:0}).state}function js(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 Ms(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 Ns(e){let{activeSocket:t,currentSocket:n,target:r}=e,i=n.closeReadyReceipt??await(async()=>(t.send(co()),e.waitForCloseReady()))(),a=BigInt(i.spent);Cs({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=>ws({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 Ps(e){return`cumulativeAmount`in e}function Fs(e){if(Ps(e))return BigInt(e.cumulativeAmount)}async function Is(e,t){t.opened?await e.store.set(t):await e.store.delete(Jo(t)),e.notifyUpdate(t)}async function Ls(e,t,n){let r=Fs(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 Is(e,i))}const Rs=B.custom(e=>typeof e==`string`&&/^0x[0-9a-fA-F]*$/.test(e)),zs=B.custom(e=>typeof e==`string`&&/^0x[0-9a-fA-F]{64}$/.test(e)),Bs=B.object({account:B.optional(B.custom()),autoSwap:B.optional(B.custom()),action:B.optional(B.enum([`open`,`topUp`,`voucher`,`close`])),channelId:B.optional(zs),cumulativeAmount:B.optional(V()),cumulativeAmountRaw:B.optional(B.string()),transaction:B.optional(Rs),descriptor:B.optional(B.custom()),additionalDeposit:B.optional(V()),additionalDepositRaw:B.optional(B.string()),depositRaw:B.optional(B.string())});function Vs(e){return e?.action!==void 0}function Hs(e){return Vs(e)&&e.descriptor!==void 0}function Us(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 Ws(e,t,n,r){let i=Us(e,t,n);if(i===void 0)throw Error(`${n} required for ${r} action`);return i}function Gs(e){return typeof e==`object`&&!!e}function Ks(e){return typeof e==`string`&&l(e,{strict:!1})?e:void 0}function qs(e){let t=e.request.methodDetails;return Gs(t)?{chainId:typeof t.chainId==`number`?t.chainId:void 0,escrowContract:Ks(t.escrowContract),escrow:Ks(t.escrow),feePayer:typeof t.feePayer==`boolean`?t.feePayer:void 0,feeToken:Ks(t.feeToken),operator:Ks(t.operator),sessionSnapshot:We(t,He.sessionSnapshot)}:{}}function Js(e,t){if(typeof e==`string`&&l(e,{strict:!1}))return e;throw Error(`tempo session challenge missing ${t}`)}function Ys(e){if(typeof e==`string`)return BigInt(e);throw Error(`tempo session challenge missing amount`)}function Xs(e){return typeof e==`string`?e:void 0}async function Zs(e){let{allowCustomEscrow:t,challenge:n,escrowOverride:r,getClient:i}=e,a=qs(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=Bo(n,r,t),l=Js(n.request.recipient,`recipient`),u=Js(n.request.currency,`currency`);return{amount:Ys(n.request.amount),challenge:n,chainId:s,client:o,escrow:c,feePayer:a.feePayer,feeToken:a.feeToken,key:qo({payee:l,token:u,escrow:c,chainId:s}),operator:a.operator,payee:l,snapshot:a.sessionSnapshot,suggestedDepositRaw:Xs(n.request.suggestedDeposit),token:u}}async function Qs(e){let{channelId:t,client:n,descriptor:r,expected:i,readChannelState:a=Qo}=e,o=_o({...r,chainId:i.chainId,escrow:i.escrow});$s({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 $s(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(!Ho(r.payee,a))throw Error(`context descriptor payee does not match challenge`);if(!Ho(r.token,s))throw Error(`context descriptor token does not match challenge`);if(!Ho(r.payer,o))throw Error(`context descriptor payer does not match account`);if(!Ho(go(r),t))throw Error(`context descriptor authorizedSigner does not match account`)}function ec(e){let{context:t,snapshot:n}=e,r=t?.descriptor??n?.descriptor;if(r)return{...t,channelId:t?.channelId??n?.channelId,descriptor:r}}function tc(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=Us(t,n,`cumulativeAmount`);return o===void 0?a+r:o+r}async function nc(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(!Mo(i.escrow,i.chainId,{channelId:a.channelId,cumulativeAmount:s,signature:a.signature},go(i.descriptor)))throw Error(`session snapshot highest voucher signature is invalid`);let f=await Qs({channelId:i.channelId,client:n,descriptor:i.descriptor,expected:{chainId:i.chainId,escrow:i.escrow,payee:i.descriptor.payee,payer:t.address,authorizedSigner:Lo(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 rc(e,t){return Ho(e.address,t.payer)?Ho(Lo(e),go(t)):!1}function ic(e){let{account:t,entry:n,context:r,decimals:i,maxDeposit:a,resolved:o}=e;if(Vs(r)){if(!Hs(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=ec({context:r,snapshot:o.snapshot});return!n&&s&&rc(t,s.descriptor)?{type:`recover`,account:t,context:s,decimals:i,maxDeposit:a,resolved:o}:n?.opened&&rc(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 ac(e,t,n=!1){switch(e.type){case`open`:return sc(e,t,n);case`recover`:return cc(e,t);case`voucher`:return lc(e,t);case`manual`:return uc(e,t,n)}}async function oc(e,t){if(e)return await Xi(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=vs({contextDepositRaw:e.context?.depositRaw,maxDeposit:e.maxDeposit,requestAmount:i.amount,suggestedDepositRaw:i.suggestedDepositRaw}),o=await Go(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 oc(n,{account:r.address,amountOut:a,client:i.client,tokenOut:i.token}),token:i.token});return await Is(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 Qs({channelId:r.channelId,client:o.client,descriptor:s,expected:{chainId:o.chainId,escrow:o.escrow,payee:o.payee,payer:n.address,authorizedSigner:Lo(n),token:o.token}}),l=tc({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`);bs(l,a);let u=await Uo(o.client,n,s,l,o.chainId,o.escrow);return await Is(t,{channelId:c.channelId,cumulativeAmount:l,deposit:c.state.deposit,descriptor:s,escrow:o.escrow,chainId:o.chainId,opened:!0}),u}async function lc(e,t){let{account:n,entry:r,resolved:i}=e,a=r.cumulativeAmount+i.amount;bs(a,e.maxDeposit);let o=await Uo(i.client,n,r.descriptor,a,i.chainId,i.escrow);return r.cumulativeAmount=a,await Is(t,r),o}async function uc(e,t,n){let{account:r,context:i,decimals:a,resolved:o}=e,{descriptor:s}=i,c=_o({...s,chainId:o.chainId,escrow:o.escrow});$s({channelId:i.channelId,descriptor:s,expectedChannelId:c,payee:o.payee,payer:r.address,authorizedSigner:Lo(r),token:o.token});let l=await dc({account:r,channelId:c,context:i,decimals:a,descriptor:s,resolved:o},n);return await Ls(t,o.key,l),l}async function dc(e,t){switch(e.context.action){case`open`:return fc(e);case`topUp`:return pc(e,t);case`voucher`:return mc(e);case`close`:return hc(e)}}async function fc(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=Ws(r,i,`cumulativeAmount`,`open`),c=await Uo(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 pc(e,t){let{account:n,channelId:r,context:i,decimals:a,descriptor:o,resolved:s}=e,c=Ws(i,a,`additionalDeposit`,`topUp`);return i.transaction?{action:`topUp`,type:`transaction`,channelId:r,transaction:i.transaction,descriptor:o,additionalDeposit:c.toString()}:Ko(s.client,n,o,c,s.chainId,s.feePayer,s.escrow,await oc(t,{account:n.address,amountOut:c,client:s.client,tokenOut:s.token}),s.feeToken)}function mc(e){let{account:t,context:n,decimals:r,descriptor:i,resolved:a}=e;return Uo(a.client,t,i,Ws(n,r,`cumulativeAmount`,`voucher`),a.chainId,a.escrow)}function hc(e){let{account:t,context:n,decimals:r,descriptor:i,resolved:a}=e;return Wo(a.client,t,i,Ws(n,r,`cumulativeAmount`,`close`),a.chainId,a.escrow)}const gc={CONNECTING:0,OPEN:1,CLOSING:2,CLOSED:3};function _c(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=gc.CLOSED,r=null}if(a.type===`open`&&(i=gc.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 vc(e){return{acceptedCumulative:BigInt(e.acceptedCumulative),deposit:BigInt(e.deposit),requiredCumulative:BigInt(e.requiredCumulative)}}function yc(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=_s(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 bc(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:Os(s,u)}:i?{channel:u,state:Ts({challengeId:i,entry:u,spent:c.toString(),units:a.status===`active`?a.units:0})}:{channel:u}}async function xc(e){if(e.event.channelId!==e.expectedChannelId)return{status:`ignored`,reason:`channel-mismatch`};let t=vc(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:qa(t.requiredCumulative);return{status:`ready`,context:{action:`voucher`,channelId:e.expectedChannelId,descriptor:n.descriptor,cumulativeAmountRaw:r.toString()}}}function Sc(e){return e.method===Be.tempo&&e.intent===Ve.session}function Cc(e){return Sc(e)&&We(e.request.methodDetails,He.sessionProtocol)===Ue.v2}function wc(e){return We(e.request.methodDetails,He.sessionSnapshot)}function Tc(e,t,n){let r=e instanceof Request?e.headers:void 0;return{...t,headers:{...Q(r),...Q(t?.headers),[R.authorization]:n}}}function Ec(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 Dc(e){let t=new URL(e.toString());return t.protocol===`ws:`&&(t.protocol=`http:`),t.protocol===`wss:`&&(t.protocol=`https:`),t}async function Oc(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 kc(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 Ac({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?ro(i):void 0}async function Ac(e){let t=async t=>e.fetch(Ec(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=lt(n).find(Cc);return r?t(r):n}async function jc(e){let t=Mc({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,Tc(e.input,e.init,t))}catch(e){throw await l(),e}return!u.ok&&!u.headers.get(R.paymentReceipt)&&await l(),u}function Mc(e){let t=lt(e.response).find(Cc);if(!t)return;let n=wc(t);if(!n)return;let{channel:r}=e;if(!(!r?.descriptor||r.channelId!==n.channelId))return{channel:r,challenge:t,snapshot:n}}async function Nc(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=lt(i).find(Cc);t&&(e.setChallenge?.(t),i=await r(t,!0))}if(!i.ok){let e=await Oc(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=ro(a);if(!o.txHash||!w.validate(o.txHash,{strict:!0})||w.size(o.txHash)!==32||!ws({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 Pc(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!io(s)&&n.getChannel()?.opened&&(s=await n.doFetch(e,o)),Fc(e,s,{onReceipt:r,signal:i},n)}function Fc(e,t,n,r){if(!io(t))throw Error(`SSE response is not an event stream.`);if(!t.body)throw Error(`Response has no body.`);let i=r.getChallenge();return Ic({onNeedVoucher:t=>Vc({challenge:i,driver:r,input:e},t),onReceipt(e){r.acceptReceipt(e),n?.onReceipt?.(e)},response:t,signal:n?.signal})}async function*Ic(e){for await(let t of Lc(e))t.data!==void 0&&(yield t.data)}async function*Lc(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=Rc(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=ao(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 Rc(e,t){for(let n=0;n<e.length;n++){let r=zc(e,n,t);if(!r)continue;let i=zc(e,n+r,t);if(i)return{index:n,length:r+i};n+=r-1}}function zc(e,t,n){return e[t]===`
6
+ `);t=s.pop();for(let t of s){if(!t.trim())continue;let i=go(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 To(yr(dt(x),[b],gr([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===Co.CONNECTING||M.readyState===Co.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=bo(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(vo(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(vo(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===Co.OPEN){let n=m??await(async()=>(p.send(yo()),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(vo(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?mo(c):void 0}}}async function To(e,t){let n=t;return n?n(e):e}function Eo(e){return BigInt(e.authorizedSigner)===0n?e.payer:e.authorizedSigner}function Do(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 Oo(e){return de.encodeForSigning(e)}function ko(e){let{feePayer:t,transaction:n}=e;return t?{...n,feePayerSignature:null}:n}function Ao(e,t){return C.keccak256(w.concat(Oo(e),t.sender))}const jo=[{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`}],Mo=[{name:`settled`,type:`uint96`},{name:`deposit`,type:`uint96`},{name:`closeRequestedAt`,type:`uint32`}],No={name:`descriptor`,type:`tuple`,components:jo},Po=[{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:[No,{name:`cumulativeAmount`,type:`uint96`},{name:`signature`,type:`bytes`}],outputs:[]},{type:`function`,name:`topUp`,stateMutability:`nonpayable`,inputs:[No,{name:`additionalDeposit`,type:`uint96`}],outputs:[]},{type:`function`,name:`close`,stateMutability:`nonpayable`,inputs:[No,{name:`cumulativeAmount`,type:`uint96`},{name:`captureAmount`,type:`uint96`},{name:`signature`,type:`bytes`}],outputs:[]},{type:`function`,name:`requestClose`,stateMutability:`nonpayable`,inputs:[No],outputs:[]},{type:`function`,name:`withdraw`,stateMutability:`nonpayable`,inputs:[No],outputs:[]},{type:`function`,name:`getChannel`,stateMutability:`view`,inputs:[No],outputs:[{type:`tuple`,components:[{name:`descriptor`,type:`tuple`,components:jo},{name:`state`,type:`tuple`,components:Mo}]}]},{type:`function`,name:`getChannelState`,stateMutability:`view`,inputs:[{name:`channelId`,type:`bytes32`}],outputs:[{type:`tuple`,components:Mo}]},{type:`function`,name:`getChannelStatesBatch`,stateMutability:`view`,inputs:[{name:`channelIds`,type:`bytes32[]`}],outputs:[{type:`tuple[]`,components:Mo}]},{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 Fo(e,t){return{name:`TIP20 Channel Reserve`,version:`1`,chainId:t,verifyingContract:e}}const Io={Voucher:[{name:`channelId`,type:`bytes32`},{name:`cumulativeAmount`,type:`uint96`}]};function Lo(e,t){return le.getVoucherSignPayload({chainId:e,channelId:t.channelId,cumulativeAmount:t.cumulativeAmount})}function Ro(e,t,n){return e.toLowerCase()===le.address.toLowerCase()?Lo(t,n):s({domain:Fo(e,t),types:Io,primaryType:`Voucher`,message:{channelId:n.channelId,cumulativeAmount:n.cumulativeAmount}})}function zo(e){return e===`secp256k1`||e===`p256`||e===`webAuthn`}function Bo(e,t){return te.signVoucher(e,{chainId:t.chainId,channel:t.channelId,cumulativeAmount:t.cumulativeAmount})}async function Vo(e,t,n,r,i){let a=await(async()=>{if(r.toLowerCase()===le.address.toLowerCase())try{return await Bo(t,{chainId:i,channelId:n.channelId,cumulativeAmount:n.cumulativeAmount})}catch{}return _(e,{account:t,domain:Fo(r,i),types:Io,primaryType:`Voucher`,message:n})})(),o=L.from(a);if(!zo(o.type))throw Error(`TIP-1034 vouchers require a TIP-1020 primitive signature; received "${o.type}".`);return L.serialize(o)}function Ho(e,t,n,r){try{let i=L.from(n.signature);if(!zo(i.type)||L.serialize(i).toLowerCase()!==n.signature.toLowerCase())return!1;let a=Ro(e,t,n),o=L.extractAddress({payload:a,signature:i});return L.verify(i,{address:o,payload:a})&&Qi(o,r)}catch{return!1}}function Uo(e){return typeof e==`object`&&!!e}function Wo(e){return typeof e==`string`&&l(e,{strict:!1})?e:void 0}function Go(e){return Wo(e.accessKeyAddress)}function Ko(){let e=BigInt(Math.floor(Date.now()/1e3))-60n;return e<=0n?0:Number(BigInt(w.random(8))%e)}function qo(e){return Go(e)??e.address}async function Jo(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 Yo(e,t){return await g(e,t)}function Xo(e,t,n=!1){let r=e.request.methodDetails,i=Uo(r)?Wo(r.escrowContract)??Wo(r.escrow):void 0,a=t??`0x4d50500000000000000000000000000000000000`;if(i&&!Qo(i,a)&&(!n||t!==void 0))throw Error(`Tempo session escrow ${i} does not match client escrow ${a}.`);return i&&!Qo(i,a)?i:a}function Zo(e,t,n,r){return K({challenge:e,payload:t,source:`did:pkh:eip155:${n}:${r.address}`})}function Qo(e,t){return e.toLowerCase()===t.toLowerCase()}async function $o(e,t,n,r,i,a=So){let o=Do({...n,chainId:i,escrow:a}),s=ro(r),c=await Vo(e,t,{channelId:o,cumulativeAmount:s},a,i);return{action:`voucher`,channelId:o,descriptor:n,cumulativeAmount:s.toString(),signature:c}}async function es(e,t,n,r,i,a=So){let o=await $o(e,t,n,r,i,a);return{action:`close`,channelId:o.channelId,descriptor:n,cumulativeAmount:o.cumulativeAmount,signature:o.signature}}async function ts(e,t,n){let i=qo(t),a=n.escrow??`0x4d50500000000000000000000000000000000000`,o=n.operator??`0x0000000000000000000000000000000000000000`,s=w.random(32),c=ro(n.deposit),l=ro(n.initialAmount),u=r({abi:Po,functionName:`open`,args:[n.payee,o,n.token,c,s,i]}),d=await Yo(e,await Jo(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:Ao(ko({...n.feePayer?{feePayer:!0}:{},transaction:f}),{sender:t.address}),operator:o,payee:n.payee,payer:t.address,salt:s,token:n.token},m=Do({...p,chainId:n.chainId,escrow:a});return{action:`open`,type:`transaction`,channelId:m,transaction:d,signature:await Vo(e,t,{channelId:m,cumulativeAmount:l},a,n.chainId),descriptor:p,cumulativeAmount:l.toString(),authorizedSigner:p.authorizedSigner}}async function ns(e,t,n,i,a,o,s=So,c=[],l=n.token){let u=Do({...n,chainId:a,escrow:s}),d=ro(i);return{action:`topUp`,type:`transaction`,channelId:u,transaction:await Yo(e,await Jo(e,{account:t,calls:[...c,{to:s,data:r({abi:Po,functionName:`topUp`,args:[n,d]})}],feePayer:o,feeToken:l,validAfter:Ko()})),descriptor:n,additionalDeposit:d.toString()}}function rs(e){let{payee:t,token:n,escrow:r,chainId:i}=e;return`${t.toLowerCase()}:${n.toLowerCase()}:${r.toLowerCase()}:${i}`}function is(e){return rs({payee:e.descriptor.payee,token:e.descriptor.token,escrow:e.escrow,chainId:e.chainId})}function as(){let e=new Map;return{get:t=>e.get(t),set(t){e.set(is(t),t)},delete(t){e.delete(t)}}}const os=2n**96n-1n;function ss(e){if(e<0n||e>os)throw new q({reason:`amount exceeds uint96 range`})}async function cs(e,t,n=So,r){return ls(await p(e,{address:n,abi:Po,functionName:`getChannelState`,args:[t],...r===void 0?{}:{blockNumber:r}}))}function ls(e){return ss(e.settled),ss(e.deposit),{settled:e.settled,deposit:e.deposit,closeRequestedAt:e.closeRequestedAt}}const us=B.custom(e=>typeof e==`string`&&l(e,{strict:!1})),ds=B.custom(e=>typeof e==`string`&&/^0x[0-9a-fA-F]{64}$/.test(e)),fs=B.custom(e=>typeof e==`string`&&/^0x[0-9a-fA-F]+$/.test(e)),ps=B.object({authorizedSigner:us,expiringNonceHash:ds,operator:us,payee:us,payer:us,salt:ds,token:us}),ms=At(B.object({acceptedCumulative:B.string(),chainId:B.number(),channelId:ds,closeRequestedAt:B.optional(B.string()),deposit:B.string(),descriptor:ps,escrow:us,highestVoucher:B.optional(B.object({channelId:ds,cumulativeAmount:B.string(),signature:fs})),requiredCumulative:B.string(),settled:B.string(),spent:B.string(),units:B.optional(B.number())}));function hs(e){return ms.encode(e)}function gs(e){return ms.decode(e)}const _s={status:`idle`};function vs(e){return{status:`active`,...e}}function ys(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:Ss(e.challengeId,t.snapshot),effects:[]}:$(e,t);case`activated`:return e.status===`closing`||e.status===`closed`?$(e,t):{state:Fs({challengeId:t.challengeId,entry:t.entry,spent:t.spent,units:t.units??0}),effects:[]};case`opened`:return e.status===`opening`?{state:Cs(e.challengeId,t.receipt,t.descriptor,t.deposit),effects:[]}:$(e,t);case`receiptAccepted`:return e.status===`closing`||e.status===`closed`?$(e,t):{state:Rs(t.receipt,t.entry),effects:[]};case`needVoucher`:return e.status===`active`?xs({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:Cs(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:Cs(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 bs(e,t){let n=ys(e.state,t);return e.state=n.state,n}function xs(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 Ss(e,t){return vs({challengeId:e,channelId:t.channelId,descriptor:t.descriptor,acceptedCumulative:t.acceptedCumulative,deposit:t.deposit,spent:t.spent,units:t.units??0})}function Cs(e,t,n,r){return vs({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 ws(e){let{cumulativeAmount:t,maxVoucherCumulative:n}=e;if(n!==null&&!(t<=n))throw Error(`requested voucher amount ${t} exceeds local maxDeposit ${n}`)}function Ts(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`);ws({cumulativeAmount:i,maxVoucherCumulative:n}),ws({cumulativeAmount:a,maxVoucherCumulative:n})}function Es(e){let{channel:t,maxVoucherCumulative:n,receipt:r,spent:i}=e;if(!r||r.channelId!==t?.channelId)return i;Ts({channel:t,maxVoucherCumulative:n,receipt:r});let a=BigInt(r.spent);return i>a?i:a}function Ds(e,t){return typeof e==`bigint`?e:d(e,t)}function Os(e){let{contextDepositRaw:t,maxDeposit:n,requestAmount:r,suggestedDepositRaw:i}=e;if(As(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 ks(e){let{deposit:t,maxDeposit:n,requiredCumulative:r,suggestedDeposit:i,topUpAmount:a}=e;if(r<=t)return 0n;ws({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 As(e,t){ws({cumulativeAmount:e,maxVoucherCumulative:t??null})}function js(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 Ms(e){let{cumulativeAmount:t,spent:n}=e;return t>n?t:n}function Ns(e){let{cumulativeAmount:t,readySpent:n,spent:r}=e;if(!to(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>Ms({cumulativeAmount:t,spent:r}))throw Error(`close-ready spent exceeds local voucher state`)}function Ps(e){let{challengeId:t,channelId:n,expectedCloseAmount:r,minimumSpent:i=0n,receipt:a}=e,o=no(r),s=no(a.spent);return o===void 0||s===void 0||!to(i)?!1:!!a.txHash&&a.challengeId===t&&a.channelId===n&&a.acceptedCumulative===r&&s>=i&&s<=o}function Fs(e){return vs({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 Is(){return{channel:null,lastChallenge:null,lastUrl:null,spent:0n,socketSession:null,state:_s}}function Ls(e){let{maxVoucherCumulative:t,receipt:n,runtime:r}=e;r.spent=Es({channel:r.channel,maxVoucherCumulative:t,receipt:n,spent:r.spent}),n&&r.channel?.channelId===n.channelId&&bs(r,{type:`receiptAccepted`,receipt:n,entry:r.channel})}function Rs(e,t){return vs({challengeId:e.challengeId,channelId:e.channelId,descriptor:t.descriptor,acceptedCumulative:e.acceptedCumulative,deposit:t.deposit.toString(),spent:e.spent,units:e.units??0})}function zs(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=no(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 Bs(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 ys(o,{type:`activated`,challengeId:r,entry:t,spent:a.toString(),units:o.status===`active`?o.units:0}).state}function Vs(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 Hs(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 Us(e){let{activeSocket:t,currentSocket:n,target:r}=e,i=n.closeReadyReceipt??await(async()=>(t.send(yo()),e.waitForCloseReady()))(),a=BigInt(i.spent);Ns({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=>Ps({challengeId:r.challenge.id,channelId:r.channelId,expectedCloseAmount:s,minimumSpent:a,receipt:e}));t.send(vo(o));let c=await i;return t.close(),n.closeReadyReceipt=null,c}finally{n.expectedCloseAmount=null}}function Ws(e){return`cumulativeAmount`in e}function Gs(e){if(Ws(e))return BigInt(e.cumulativeAmount)}async function Ks(e,t){t.opened?await e.store.set(t):await e.store.delete(is(t)),e.notifyUpdate(t)}async function qs(e,t,n){let r=Gs(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 Ks(e,i))}const Js=B.custom(e=>typeof e==`string`&&/^0x[0-9a-fA-F]*$/.test(e)),Ys=B.custom(e=>typeof e==`string`&&/^0x[0-9a-fA-F]{64}$/.test(e)),Xs=B.object({account:B.optional(B.custom()),autoSwap:B.optional(B.custom()),action:B.optional(B.enum([`open`,`topUp`,`voucher`,`close`])),channelId:B.optional(Ys),cumulativeAmount:B.optional(V()),cumulativeAmountRaw:B.optional(B.string()),transaction:B.optional(Js),descriptor:B.optional(B.custom()),additionalDeposit:B.optional(V()),additionalDepositRaw:B.optional(B.string()),depositRaw:B.optional(B.string())});function Zs(e){return e?.action!==void 0}function Qs(e){return Zs(e)&&e.descriptor!==void 0}function $s(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 ec(e,t,n,r){let i=$s(e,t,n);if(i===void 0)throw Error(`${n} required for ${r} action`);return i}function tc(e){return typeof e==`object`&&!!e}function nc(e){return typeof e==`string`&&l(e,{strict:!1})?e:void 0}function rc(e){let t=e.request.methodDetails;return tc(t)?{chainId:typeof t.chainId==`number`?t.chainId:void 0,escrowContract:nc(t.escrowContract),escrow:nc(t.escrow),feePayer:typeof t.feePayer==`boolean`?t.feePayer:void 0,feeToken:nc(t.feeToken),operator:nc(t.operator),sessionSnapshot:Ke(t,We.sessionSnapshot)}:{}}function ic(e,t){if(typeof e==`string`&&l(e,{strict:!1}))return e;throw Error(`tempo session challenge missing ${t}`)}function ac(e){if(typeof e==`string`)return BigInt(e);throw Error(`tempo session challenge missing amount`)}function oc(e){return typeof e==`string`?e:void 0}async function sc(e){let{allowCustomEscrow:t,challenge:n,escrowOverride:r,getClient:i}=e,a=rc(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=Xo(n,r,t),l=ic(n.request.recipient,`recipient`),u=ic(n.request.currency,`currency`);return{amount:ac(n.request.amount),challenge:n,chainId:s,client:o,escrow:c,feePayer:a.feePayer,feeToken:a.feeToken,key:rs({payee:l,token:u,escrow:c,chainId:s}),operator:a.operator,payee:l,snapshot:a.sessionSnapshot,suggestedDepositRaw:oc(n.request.suggestedDeposit),token:u}}async function cc(e){let{channelId:t,client:n,descriptor:r,expected:i,readChannelState:a=cs}=e,o=Do({...r,chainId:i.chainId,escrow:i.escrow});lc({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 lc(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(!Qo(r.payee,a))throw Error(`context descriptor payee does not match challenge`);if(!Qo(r.token,s))throw Error(`context descriptor token does not match challenge`);if(!Qo(r.payer,o))throw Error(`context descriptor payer does not match account`);if(!Qo(Eo(r),t))throw Error(`context descriptor authorizedSigner does not match account`)}function uc(e){let{context:t,snapshot:n}=e,r=t?.descriptor??n?.descriptor;if(r)return{...t,channelId:t?.channelId??n?.channelId,descriptor:r}}function dc(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=$s(t,n,`cumulativeAmount`);return o===void 0?a+r:o+r}async function fc(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(!Ho(i.escrow,i.chainId,{channelId:a.channelId,cumulativeAmount:s,signature:a.signature},Eo(i.descriptor)))throw Error(`session snapshot highest voucher signature is invalid`);let f=await cc({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 pc(e,t){return Qo(e.address,t.payer)?Qo(qo(e),Eo(t)):!1}function mc(e){let{account:t,entry:n,context:r,decimals:i,maxDeposit:a,resolved:o}=e;if(Zs(r)){if(!Qs(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=uc({context:r,snapshot:o.snapshot});return!n&&s&&pc(t,s.descriptor)?{type:`recover`,account:t,context:s,decimals:i,maxDeposit:a,resolved:o}:n?.opened&&pc(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 hc(e,t,n=!1){switch(e.type){case`open`:return _c(e,t,n);case`recover`:return vc(e,t);case`voucher`:return yc(e,t);case`manual`:return bc(e,t,n)}}async function gc(e,t){if(e)return await ea(t.client,{account:t.account,amountOut:t.amountOut,tokenOut:t.tokenOut,tokenIn:e.tokenIn,slippage:e.slippage})}async function _c(e,t,n){let{account:r,resolved:i}=e,a=Os({contextDepositRaw:e.context?.depositRaw,maxDeposit:e.maxDeposit,requestAmount:i.amount,suggestedDepositRaw:i.suggestedDepositRaw}),o=await ts(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 gc(n,{account:r.address,amountOut:a,client:i.client,tokenOut:i.token}),token:i.token});return await Ks(t,{channelId:o.channelId,cumulativeAmount:i.amount,deposit:a,descriptor:o.descriptor,escrow:i.escrow,chainId:i.chainId,opened:!0}),o}async function vc(e,t){let{account:n,context:r,decimals:i,maxDeposit:a,resolved:o}=e,{descriptor:s}=r,c=await cc({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=dc({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`);As(l,a);let u=await $o(o.client,n,s,l,o.chainId,o.escrow);return await Ks(t,{channelId:c.channelId,cumulativeAmount:l,deposit:c.state.deposit,descriptor:s,escrow:o.escrow,chainId:o.chainId,opened:!0}),u}async function yc(e,t){let{account:n,entry:r,resolved:i}=e,a=r.cumulativeAmount+i.amount;As(a,e.maxDeposit);let o=await $o(i.client,n,r.descriptor,a,i.chainId,i.escrow);return r.cumulativeAmount=a,await Ks(t,r),o}async function bc(e,t,n){let{account:r,context:i,decimals:a,resolved:o}=e,{descriptor:s}=i,c=Do({...s,chainId:o.chainId,escrow:o.escrow});lc({channelId:i.channelId,descriptor:s,expectedChannelId:c,payee:o.payee,payer:r.address,authorizedSigner:qo(r),token:o.token});let l=await xc({account:r,channelId:c,context:i,decimals:a,descriptor:s,resolved:o},n);return await qs(t,o.key,l),l}async function xc(e,t){switch(e.context.action){case`open`:return Sc(e);case`topUp`:return Cc(e,t);case`voucher`:return wc(e);case`close`:return Tc(e)}}async function Sc(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=ec(r,i,`cumulativeAmount`,`open`),c=await $o(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 Cc(e,t){let{account:n,channelId:r,context:i,decimals:a,descriptor:o,resolved:s}=e,c=ec(i,a,`additionalDeposit`,`topUp`);return i.transaction?{action:`topUp`,type:`transaction`,channelId:r,transaction:i.transaction,descriptor:o,additionalDeposit:c.toString()}:ns(s.client,n,o,c,s.chainId,s.feePayer,s.escrow,await gc(t,{account:n.address,amountOut:c,client:s.client,tokenOut:s.token}),s.feeToken)}function wc(e){let{account:t,context:n,decimals:r,descriptor:i,resolved:a}=e;return $o(a.client,t,i,ec(n,r,`cumulativeAmount`,`voucher`),a.chainId,a.escrow)}function Tc(e){let{account:t,context:n,decimals:r,descriptor:i,resolved:a}=e;return es(a.client,t,i,ec(n,r,`cumulativeAmount`,`close`),a.chainId,a.escrow)}const Ec={CONNECTING:0,OPEN:1,CLOSING:2,CLOSED:3};function Dc(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=Ec.CLOSED,r=null}if(a.type===`open`&&(i=Ec.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 Oc(e){return{acceptedCumulative:BigInt(e.acceptedCumulative),deposit:BigInt(e.deposit),requiredCumulative:BigInt(e.requiredCumulative)}}function kc(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=Ds(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 Ac(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:Rs(s,u)}:i?{channel:u,state:Fs({challengeId:i,entry:u,spent:c.toString(),units:a.status===`active`?a.units:0})}:{channel:u}}async function jc(e){if(e.event.channelId!==e.expectedChannelId)return{status:`ignored`,reason:`channel-mismatch`};let t=Oc(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:ro(t.requiredCumulative);return{status:`ready`,context:{action:`voucher`,channelId:e.expectedChannelId,descriptor:n.descriptor,cumulativeAmountRaw:r.toString()}}}function Mc(e){return e.method===He.tempo&&e.intent===Ue.session}function Nc(e){return Mc(e)&&Ke(e.request.methodDetails,We.sessionProtocol)===Ge.v2}function Pc(e){return Ke(e.request.methodDetails,We.sessionSnapshot)}function Fc(e,t,n){let r=e instanceof Request?e.headers:void 0;return{...t,headers:{...Q(r),...Q(t?.headers),[R.authorization]:n}}}function Ic(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 Lc(e){let t=new URL(e.toString());return t.protocol===`ws:`&&(t.protocol=`http:`),t.protocol===`wss:`&&(t.protocol=`https:`),t}async function Rc(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 zc(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 Bc({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?mo(i):void 0}async function Bc(e){let t=async t=>e.fetch(Ic(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(Nc);return r?t(r):n}async function Vc(e){let t=Hc({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,Fc(e.input,e.init,t))}catch(e){throw await l(),e}return!u.ok&&!u.headers.get(R.paymentReceipt)&&await l(),u}function Hc(e){let t=dt(e.response).find(Nc);if(!t)return;let n=Pc(t);if(!n)return;let{channel:r}=e;if(!(!r?.descriptor||r.channelId!==n.channelId))return{channel:r,challenge:t,snapshot:n}}async function Uc(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(Nc);t&&(e.setChallenge?.(t),i=await r(t,!0))}if(!i.ok){let e=await Rc(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=mo(a);if(!o.txHash||!w.validate(o.txHash,{strict:!0})||w.size(o.txHash)!==32||!Ps({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 Wc(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!ho(s)&&n.getChannel()?.opened&&(s=await n.doFetch(e,o)),Gc(e,s,{onReceipt:r,signal:i},n)}function Gc(e,t,n,r){if(!ho(t))throw Error(`SSE response is not an event stream.`);if(!t.body)throw Error(`Response has no body.`);let i=r.getChallenge();return Kc({onNeedVoucher:t=>Zc({challenge:i,driver:r,input:e},t),onReceipt(e){r.acceptReceipt(e),n?.onReceipt?.(e)},response:t,signal:n?.signal})}async function*Kc(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=Jc(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=go(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 Jc(e,t){for(let n=0;n<e.length;n++){let r=Yc(e,n,t);if(!r)continue;let i=Yc(e,n+r,t);if(i)return{index:n,length:r+i};n+=r-1}}function Yc(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 Bc(e){let t=new AbortController,n=()=>t.abort(e.signal?.reason);e.signal?.addEventListener(`abort`,n,{once:!0}),e.signal?.aborted&&n();let r=Lc({...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 Vc(e,t){let n=e.driver.getChannel();if(!n||!e.challenge)return;let r=await xc({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 Ac({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 Hc(e){let t=new URL(e.input.toString()),n=Dc(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=lt(r).find(Cc);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 Uc(e){let t=await Hc(e);return{...t,credential:await e.createSessionCredential(t.challenge,{})}}function Wc(e){let{challenge:t,credential:n,socket:r}=e;return{challenge:t,channelId:vt(n).payload.channelId,closeReadyReceipt:null,deliveredChunks:0n,expectedCloseAmount:null,socket:r,tickCost:eo(t)}}function Gc(e){let{challengeId:t,channelId:n,receipt:r}=e;return r.challengeId===t&&r.channelId===n}function Kc(e){if(!Gc(e))return`received mismatched payment-close-ready frame`;let t=Ka(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 qc(e){let{challengeId:t,channelId:n,expectedCloseAmount:r,receipt:i}=e;if(!Gc(e))return`received mismatched payment-receipt frame`;if(r!==null&&i.txHash&&!ws({challengeId:t,channelId:n,expectedCloseAmount:r,minimumSpent:BigInt(r),receipt:i}))return`received mismatched payment-close receipt frame`}async function Jc(e){let{challenge:t,credential:n,options:r,WebSocket:i,wsUrl:a}=e,o=new i(a,r?.protocols),s=Wc({challenge:t,credential:n,socket:o});e.setSocketSession(s);let c=_c(o),l=t=>{e.rejectReceipt(Error(t)),e.rejectCloseReady(Error(t)),(o.readyState===gc.CONNECTING||o.readyState===gc.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 Xc({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 Yc(o,c.emit,a),o.send(so(n)),await e.waitForReceipt(),c.socket}function Yc(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 Xc(e){let t=lo(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`:Zc(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 Qc(e,t.data);return;case`payment-receipt`:$c(e,t.data);return}}function Zc(e,t){let n=e.driver.getChannel()?.cumulativeAmount??0n,r=Kc({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 Qc(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 xc({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 $c(e,t){let n=qc({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 el=new WeakMap;async function tl(e,t){let n=el.get(e)??new Map;el.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 nl(e,t){try{return t?.channelId.toLowerCase()===e.channelId.toLowerCase()&&BigInt(t.acceptedCumulative)===e.cumulativeAmount}catch{return!1}}function rl(e,t,n){try{let r=e.response?.headers.get(R.paymentReceipt);if(r){let e=ro(r);if(e.challengeId===t.id&&nl(n,e))return!0}}catch{}return e.challenges?.some(e=>Cc(e)?nl(n,wc(e)):!1)??!1}function il(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=Ui({chain:y,getClient:s,rpcUrl:In}),m=zi({account:t}),h=c===void 0?void 0:d(c,a),g=l===void 0?void 0:d(l,a),_=i??Yo(),v={store:_,notifyUpdate:e=>u?.(e)},b=async(e,t,n)=>{let r=m(e.client,t),i=t?.action?t.descriptor:n?.descriptor??ec({context:t,snapshot:e.snapshot})?.descriptor;return await f?.({account:r,chainId:e.chainId,operation:{kind:`authorizePaymentChannel`,...i?{authority:go(i)}:{}}})??r},x=async(e,t,n)=>ic({account:await b(e,t,n),entry:n,context:t,decimals:a,maxDeposit:h,resolved:e}),S=Dt(va,{canHandleChallenge:({challenge:e})=>Cc(e),context:Bs,async createCredential(e){let{challenge:t,context:i}=e,a=await Zs({allowCustomEscrow:n,challenge:t,escrowOverride:o,getClient:p}),s=ei(e),c=()=>{};try{let e=!Vs(i)&&i?.descriptor===void 0;e&&(c=await tl(_,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 tl(_,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 Vo(t,await ac(o,u,Zi(i?.autoSwap??r,Yi)),a.chainId,o.account);if(s&&l){let e=l;s.settle=async n=>{let r=n.status===`accepted`||rl(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=ys({deposit:o,maxDeposit:h,requiredCumulative:a,suggestedDeposit:e.request.suggestedDeposit===void 0?void 0:BigInt(e.request.suggestedDeposit),topUpAmount:g});s>0n&&await kc({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(Jo(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 Kr(S,async({challenge:e,context:t,fetch:r,input:i})=>{if(!Cc(e))return;let a=t===void 0?void 0:Bs.parse(t);if(Vs(a))return;let s=await Zs({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+eo(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||!rc(await b(s,a,c),c.descriptor)||await C({challenge:e,channel:c,deposit:h,fetch:r,input:i,requiredCumulative:f})}),Zr(S,async({challenge:e,credential:t,fetch:r,headers:i,input:a,refetch:s,response:c,signal:l})=>{if(!Cc(e))return c;if(!io(c))return $a(vt(t).payload).action===`open`&&i.get(`accept`)?.toLowerCase().includes(`text/event-stream`)?await s?.()??c:c;let u=(await Zs({allowCustomEscrow:n,challenge:e,escrowOverride:o,getClient:p})).key,d=await _.get(u),f={assertVoucherWithinLocalLimit:e=>bs(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 Bc({onNeedVoucher:t=>Vc({challenge:e,driver:f,input:a},t),onReceipt(){},response:c,signal:l})})}const al=new WeakMap;function ol(e,t){al.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 ll(e){return e.method===Be.tempo&&e.intent===Ve.charge}function ul(e){if(!ll(e)||typeof e.request.amount!=`string`)return!1;try{return BigInt(e.request.amount)===0n}catch{return!1}}function dl(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 fl(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 pl(e){let t=e.allowCustomEscrow??!1,n=fl(e),r=Ui({chain:y,getClient:e.client?()=>e.client:e.getClient,rpcUrl:In}),i=zi({account:e.account}),a=Es(),o=cl({getSocketSession:()=>a.socketSession}),s=e.channelStore??Yo(),c=new Set,l;async function u(e){let t=await s.get(e);if(t?.opened&&!c.has(t.channelId))return t}let d={async get(e){let t=await u(e);return t&&l&&(l.seenExisting.add(e),!l.committed&&!l.created.has(e)&&(l.resumed??=t)),t},async set(e){let t=Jo(e);e.opened&&c.delete(e.channelId),l?.trackCreates&&!l.seenExisting.has(t)&&l.created.set(t,e),await s.set(e)},delete:e=>s.delete(e)};async function f(e){let t=Jo(e);c.add(e.channelId),l?.seenExisting.delete(t),l?.resumed===e&&(l.resumed=void 0),await Promise.resolve(s.delete(t)).catch(()=>void 0)}async function p(){let e=l;if(e?.created.size){for(let[t,n]of e.created)c.add(n.channelId),await Promise.resolve(s.delete(t)).catch(()=>void 0);e.created.clear(),await P(e.committed??e.previous)}}function m(e){let t=We(e.request.methodDetails,He.sessionSnapshot);if(typeof t?.channelId!=`string`)return!1;let n=l;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=js({channel:a.channel,spent:a.spent,state:a.state}),!0;return!1}function h(e){return us(a,e)}function g(){let e=a.state.status===`active`?a.state:l?.committed?.state??l?.previous.state;return e?.status===`active`?e.units:0}function _(e){let t=l,n=t?.committed?.channel?.entry??t?.resumed;!t||n?.channelId.toLowerCase()!==e.channelId.toLowerCase()||e.deposit<=n.deposit||(t.resumed=void 0,t.committed=js({channel:a.channel,spent:a.spent,state:a.state}))}let v=il({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:d,onChannelUpdate(e){e.channelId!==a.channel?.channelId&&(a.spent=0n),a.channel=e,a.lastChallenge&&h({type:`activated`,challengeId:a.lastChallenge.id,entry:e,spent:a.spent.toString(),units:g()}),_(e)}});Qr(v);let b=xa({account:e.account,getClient:e.client?()=>e.client:e.getClient}),x=ai({fetch:n.fetch,methods:[v],onChallenge:async(e,t)=>{if(!Sc(e))return;let n=l,r=n&&n.challengesReceived>0&&e.id===a.lastChallenge?.id,i=r&&tt(e)===tt(a.lastChallenge);n&&n.challengesReceived++,!i&&(m(e)||(n?.created.size?await p():r&&await P(n.committed??n.previous)),a.lastChallenge=e,h({type:`challengeReceived`,challengeId:e.id}))}});function S(e,t){return v.createCredential({challenge:e,context:t})}function C(e){Ds({maxVoucherCumulative:n.maxVoucherCumulative,receipt:e,runtime:a})}function w(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`&&h({type:`activated`,challengeId:a.lastChallenge.id,entry:a.channel,spent:a.spent.toString(),units:e})}async function T(t){let n=t.headers.get(R.paymentSessionSnapshot);if(!n)return;let o=os(n),s=await r({chainId:o.chainId}),c=i(s),{entry:l,spent:u}=await nc({account:await e.resolveAccount?.({account:c,chainId:o.chainId,operation:{authority:go(o.descriptor),kind:`authorizePaymentChannel`}})??c,client:s,snapshot:o});return j(l.cumulativeAmount),await Promise.resolve(d.set(l)).catch(()=>void 0),a.channel=l,a.spent=u,l}async function E(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:{...Q(i),...Q(r?.headers),[R.acceptPayment]:`${Be.tempo}/${Ve.charge}`}};try{let e=await n.fetch(l,u);if(e.status!==402)return await T(e);let t=lt(e).find(ll);if(!t||!ul(t))return;let r=await b.createCredential({challenge:t,context:{}}),i=await n.fetch(l,{...u,headers:{...Q(u.headers),[R.authorization]:r}});return i.ok?await T(i):void 0}catch{return}}function D(e,t){let n=a.socketSession;return ks({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 O(e,t){let n=wc(t);if(!n)return;if(_o({...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 k(e,t){let n=O(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 A(e,t=e.challenge,n=!1){let r=(n?k(e,t):O(e.channel,t))?.acceptedCumulative??D(t,e.channelId);if(r>e.channel.cumulativeAmount)throw Error(`fallback close amount exceeds local voucher state`);return j(r),r.toString()}function j(e){ms({cumulativeAmount:e,maxVoucherCumulative:n.maxVoucherCumulative})}async function M(e){let{knownDeposit:t,...r}=e,i=await kc({...r,channel:a.channel,createSessionCredential:S,fetch:n.fetch});C(i);let o=bc({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 d.set(o.channel),h({type:`activated`,challengeId:a.lastChallenge.id,entry:o.channel,spent:a.spent.toString(),units:g()}),_(o.channel)),i}async function N(e){let t=a.channel?.channelId===e.channelId?a.channel.deposit:0n,r=t>e.deposit?t:e.deposit,i=ys({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 M({challenge:e.challenge,input:e.input,channelId:e.channelId,additionalDeposit:i,knownDeposit:r})}async function ee(e,t){let n=As({channel:a.channel,channelId:e,challengeId:a.lastChallenge?.id,cumulativeAmount:t,spent:a.spent,state:a.state});n&&a.channel&&(h({type:`activated`,challengeId:n.challengeId,entry:a.channel,spent:n.spent,units:n.units}),await s.set(a.channel))}async function P(e){let t=Ms(e,a.channel);a.channel=t.channel,a.spent=t.spent,a.state=t.state,a.channel?.opened&&await s.set(a.channel)}function te(e){let t=e.headers.get(R.paymentReceipt),n=t?ro(t):null;return C(n),Object.assign(e,{receipt:n,challenge:a.lastChallenge,channelId:a.channel?.channelId??null,cumulative:a.channel?.cumulativeAmount??0n})}async function F(e,t){if(l)throw Error(`SessionManager: a request is already in flight; concurrent requests on one manager are not supported`);a.lastUrl=e;let r=js({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};l=i;let o=a.channel?.opened?a.channel.channelId:void 0;try{await E(e,t),i.trackCreates=!0;let s=dl(e,t,o),c=!r.channel?.opened;async function l(){let n=i.resumed;return!c||!n?!1:(c=!1,await f(n),s=dl(e,t,void 0),!0)}for(;;){let t;try{t=await x(e,s)}catch(e){if(i.created.size?await p():await P(i.committed??r),await l())continue;throw e}let o=te(t),c=!1;if(o.status===402){let t=await jc({input:e,init:s,response:o,createSessionCredential:S,fetch:n.fetch,getChannel:()=>a.channel,restoreCumulative:ee,setChallenge(e){a.lastChallenge=e},topUpIfNeeded:N});t&&(c=!0,o=te(t))}if(!c&&!o.ok&&!o.receipt){if(i.created.size?await p():await P(i.committed??r),await l())continue;return o}return o}}finally{l=void 0}}async function ne(e){let t=await Nc({createSessionCredential:S,fetch:n.fetch,getMinimumSpent:()=>a.spent,lastUrl:a.lastUrl,resolveSignedCloseAmount:t=>A(e,t,!0),signedCloseAmount:A(e),setChallenge(e){a.lastChallenge=e},target:e});return t&&(w(),h({type:`closeStarted`}),h({type:`closed`,receipt:t})),t}let re={createSessionCredential:S,doFetch:F,fetch:n.fetch,getChannel:()=>a.channel,getChallenge:()=>a.lastChallenge,assertVoucherWithinLocalLimit:j,acceptReceipt(e){C(e)},topUpIfNeeded:N},ie={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:F,async topUp(e){let t=yc({amount:e,assertVoucherWithinLocalLimit:j,channel:a.channel,decimals:n.decimals,lastChallenge:a.lastChallenge,lastUrl:a.lastUrl});return M({additionalDeposit:t.additionalDeposit,challenge:t.challenge,channelId:t.channelId,input:t.input})},async sse(e,t){return Pc(e,t,re)},async ws(e,t){if(!n.WebSocket)throw Error("No WebSocket implementation available. Pass `webSocket` to sessionManager() in this runtime.");let r=Dc(e),i=t?.signal?{signal:t.signal}:void 0;await E(r,i);let s=a.channel?.opened?a.channel.channelId:void 0,{challenge:c,credential:l,httpUrl:u,wsUrl:d}=await Uc({async createSessionCredential(e,t){return a.lastChallenge=e,await Jr(v,{challenge:e,context:t,fetch:n.fetch,input:r}),S(e,t)},fetch:n.fetch,input:e,onProbeUrl(e){a.lastUrl=e.toString()},probeInit:dl(r,i,s),signal:t?.signal});return a.lastChallenge=c,Jc({challenge:c,credential:l,httpUrl:u,WebSocket:n.WebSocket,wsUrl:d,options:t,createSessionCredential:S,getChannel:()=>a.channel,setSocketSession(e){a.socketSession=e},async refreshChallenge(){let e=await Hc({fetch:n.fetch,input:u,probeInit:dl(u,i,a.channel?.opened?a.channel.channelId:void 0),signal:t?.signal});return a.lastChallenge=e.challenge,e.challenge},assertVoucherWithinLocalLimit:j,acceptReceipt:C,rejectCloseReady:o.rejectCloseReady,rejectReceipt:o.rejectReceipt,settleCloseReady:o.settleCloseReady,settleReceipt:o.settleReceipt,topUpIfNeeded:N,waitForReceipt:o.waitForReceipt})},async close(){let e=a.socketSession,t=xs({channel:a.channel,currentSocket:e,lastChallenge:a.lastChallenge});if(!t)return;let n=e?.socket;if(e&&n?.readyState===gc.OPEN){let r=await Ns({activeSocket:n,createSessionCredential:S,currentSocket:e,spent:a.spent,target:t,waitForCloseReady:o.waitForCloseReady,waitForReceipt:o.waitForReceipt});return w(),h({type:`closeStarted`}),h({type:`closed`,receipt:r}),r}return ne(t)}};return ol(ie,{consumeSseResponse(e,t,n){return Fc(e,t,n,re)},rehydrate({channel:e,challenge:t,input:n,spent:r}){if(!e.opened)throw Error(`Cannot restore a closed session channel.`);if(!Sc(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.`);j(e.cumulativeAmount);let i=O(e,t),o=i&&i.spent>r?i.spent:r;a.lastUrl=n,a.lastChallenge=t,a.channel=e,a.spent=o,h({type:`challengeReceived`,challengeId:t.id}),h({type:`activated`,challengeId:t.id,entry:e,spent:o.toString(),units:0})}}),ie}(function(e){e.serializeSnapshot=as,e.deserializeSnapshot=os})(pl||={});const ml=(1n<<64n)-1n,hl={dev_second:1n,day:86400n,week:604800n};function gl(e){return e instanceof Date?e:new Date(e)}function _l(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 vl(e){if(!/^[1-9]\d*$/.test(e.periodCount))throw new q({reason:`periodCount is invalid`});let t=hl[e.periodUnit];if(t===void 0)throw new q({reason:`periodUnit is invalid`});let n=BigInt(e.periodCount)*t;if(n>ml)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 yl(e){let{challengeExpires:t,request:n}=e;vl(n);let r=_l(gl(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 bl(e){return[{address:Ml(e.currency,`currency`),selector:`0x95777d59`,recipients:[Ml(e.recipient,`recipient`)]}]}async function xl(e){let{accessKey:t,account:n,chainId:r,request:i}=e;if(typeof n.sign!=`function`)return;let a=Cl({accessKey:t,chainId:r,request:i}),o=await n.sign({hash:I.getSignPayload(a)}),s=L.from(o);if(s.type===`keychain`||s.type===`multisig`)throw new q({reason:`keyAuthorization must use a primitive signature`});return I.from(a,{signature:o})}function Sl(e){let{accessKey:t,chainId:n,payload:r,request:i}=e;if(r.type!==`keyAuthorization`)throw new q({reason:`invalid keyAuthorization payload`});let a=wl(r.signature),o=Tl(a);return El({accessKey:t,authorization:a,chainId:n}),Dl(a,i),kl(Ol(a),i),Al(a.scopes,i),{authorization:a,source:{address:jl(a,o),chainId:n}}}function Cl(e){let{accessKey:t,chainId:n,request:r}=e;return I.from({address:Ml(t.accessKeyAddress,`accessKeyAddress`),chainId:BigInt(n),expiry:_l(gl(r.subscriptionExpires)),limits:[{token:Ml(r.currency,`currency`),limit:BigInt(r.amount),period:vl(r)}],scopes:bl(r),type:t.keyType})}function wl(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 Tl(e){let t=e.signature;if(!t)throw new q({reason:`keyAuthorization must use a primitive signature`});return t}function El(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,Ml(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 Dl(e,t){if(yl({request:t}),e.expiry!==_l(gl(t.subscriptionExpires)))throw new q({reason:`keyAuthorization expiry mismatch`})}function Ol(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,Ml(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!==vl(t))throw new q({reason:`keyAuthorization period mismatch`})}function Al(e,t){if(!e||e.length!==1)throw new q({reason:`keyAuthorization must contain a recipient-scoped transferWithMemo call`});let n=Ml(t.currency,`currency`),r=Ml(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=Nl(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 Ml(e,t){if(!l(e))throw new q({reason:`${t} must be an address`});return e.toLowerCase()}function Nl(e){return typeof e==`string`?e.toLowerCase():``}const Pl=B.object({accessKey:B.optional(B.custom()),account:B.optional(B.custom())});function Fl(e={}){let t=Ui({chain:N,getClient:e.getClient,rpcUrl:In}),n=zi({account:e.account});return Dt(ya,{context:Pl,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.");Ll(r.request),await e.validateRequest?.(r.request);let l=await Il(o,{accessKey:c,account:s,chainId:a,request:r.request}),d=Sl({accessKey:c,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 Il(e,t){let{accessKey:n,account:r,chainId:i,request:a}=t,o=await xl({accessKey:n,account:r,chainId:i,request:a});if(o)return o;let s=await e.request({method:`wallet_authorizeAccessKey`,params:[{address:n.accessKeyAddress,expiry:_l(gl(a.subscriptionExpires)),keyType:n.keyType,limits:[{token:a.currency,limit:w.fromNumber(BigInt(a.amount)),period:vl(a)}],scopes:bl(a)}]});return I.fromRpc(s.keyAuthorization)}function Ll(e){vl(e),_l(gl(e.subscriptionExpires))}const Rl=Object.assign(il,{manager:pl}),zl=Object.assign(mo,{method:Ua});function Bl(e={}){return[xa(e),Rl(e)]}(function(e){e.charge=xa,e.common=Bl,e.session=Rl,e.sessionLegacy=zl,e.subscription=Fl})(Bl||={});const Vl=M.union([M.boolean(),M.literal(`true`).transform(()=>!0),M.literal(`false`).transform(()=>!1)]);async function Hl(e){process.stdout.write(Buffer.from(await e.arrayBuffer()))}const Ul=M.object({allowCustomEscrow:M.optional(Vl),autoSwap:M.optional(Vl),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())}),Wl=[`allowCustomEscrow`,`autoSwap`,`channel`,`deposit`,`payWith`,`slippage`,`tokenIn`];function Gl(){let t;return nr({method:`tempo`,supports(e){return e.method===`tempo`&&[`charge`,`session`].includes(e.intent)},async setup({challenge:n,options:r,methodOpts:i}){let a=Qn(r.account),o=n.request,s=o.currency,l=Zl(i),u=tu({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()||(Rn(a)?void 0:await $n(a).get());if(!_&&Rn(a)&&uu()){g=!0;let t=cu(a);if(t){let i=Vn(r.rpcUrl,{network:r.network});h=e({chain:await Hn({network:r.network,rpcUrl:i}),transport:c(i)}),$l({challenge:n,clientChainId:h.chain?.id}),p=h.chain?.blockExplorers?.default?.url;let a=s?await Gn(h,s,t.wallet_address).catch(()=>void 0):void 0;d=a?.symbol??s??``,f=a?.decimals??o.decimals??6}}else if(_)m=oe(_);else{let e=fu();if(e){let t=await $n(e).get();t&&(m=oe(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=Vn(r.rpcUrl,{network:r.network});h=e({chain:await Hn({network:r.network,rpcUrl:t}),transport:c(t)}),$l({challenge:n,clientChainId:h.chain?.id}),p=h.chain?.blockExplorers?.default?.url;let i=s?await Gn(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 du(t)}};if(!m||!h)throw new Y({code:`ACCOUNT_NOT_FOUND`,message:`Tempo requires a configured account.`,exitCode:69});let v=Bl({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??(Wn(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=ru(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 jo(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=vt(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?``:`
9
+ `?2:t+1===e.length&&!n?0:1:0}function Xc(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 Zc(e,t){let n=e.driver.getChannel();if(!n||!e.challenge)return;let r=await jc({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 Bc({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 Qc(e){let t=new URL(e.input.toString()),n=Lc(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(Nc);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 $c(e){let t=await Qc(e);return{...t,credential:await e.createSessionCredential(t.challenge,{})}}function el(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:uo(t)}}function tl(e){let{challengeId:t,channelId:n,receipt:r}=e;return r.challengeId===t&&r.channelId===n}function nl(e){if(!tl(e))return`received mismatched payment-close-ready frame`;let t=no(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 rl(e){let{challengeId:t,channelId:n,expectedCloseAmount:r,receipt:i}=e;if(!tl(e))return`received mismatched payment-receipt frame`;if(r!==null&&i.txHash&&!Ps({challengeId:t,channelId:n,expectedCloseAmount:r,minimumSpent:BigInt(r),receipt:i}))return`received mismatched payment-close receipt frame`}async function il(e){let{challenge:t,credential:n,options:r,WebSocket:i,wsUrl:a}=e,o=new i(a,r?.protocols),s=el({challenge:t,credential:n,socket:o});e.setSocketSession(s);let c=Dc(o),l=t=>{e.rejectReceipt(Error(t)),e.rejectCloseReady(Error(t)),(o.readyState===Ec.CONNECTING||o.readyState===Ec.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 ol({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 al(o,c.emit,a),o.send(vo(n)),await e.waitForReceipt(),c.socket}function al(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 ol(e){let t=bo(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`:sl(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 cl(e,t.data);return;case`payment-receipt`:ll(e,t.data);return}}function sl(e,t){let n=e.driver.getChannel()?.cumulativeAmount??0n,r=nl({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 cl(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 jc({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(vo(i))}catch(t){e.failSocketFlow(t instanceof Error?t.message:`failed to create websocket voucher`)}}function ll(e,t){let n=rl({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 ul=new WeakMap;async function dl(e,t){let n=ul.get(e)??new Map;ul.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 fl(e,t){try{return t?.channelId.toLowerCase()===e.channelId.toLowerCase()&&BigInt(t.acceptedCumulative)===e.cumulativeAmount}catch{return!1}}function pl(e,t,n){try{let r=e.response?.headers.get(R.paymentReceipt);if(r){let e=mo(r);if(e.challengeId===t.id&&fl(n,e))return!0}}catch{}return e.challenges?.some(e=>Nc(e)?fl(n,Pc(e)):!1)??!1}function ml(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=qi({chain:y,getClient:s,rpcUrl:zn}),m=Ui({account:t}),h=c===void 0?void 0:d(c,a),g=l===void 0?void 0:d(l,a),_=i??as(),v={store:_,notifyUpdate:e=>u?.(e)},b=async(e,t,n)=>{let r=m(e.client,t),i=t?.action?t.descriptor:n?.descriptor??uc({context:t,snapshot:e.snapshot})?.descriptor;return await f?.({account:r,chainId:e.chainId,operation:{kind:`authorizePaymentChannel`,...i?{authority:Eo(i)}:{}}})??r},x=async(e,t,n)=>mc({account:await b(e,t,n),entry:n,context:t,decimals:a,maxDeposit:h,resolved:e}),S=kt(Da,{canHandleChallenge:({challenge:e})=>Nc(e),context:Xs,async createCredential(e){let{challenge:t,context:i}=e,a=await sc({allowCustomEscrow:n,challenge:t,escrowOverride:o,getClient:p}),s=ii(e),c=()=>{};try{let e=!Zs(i)&&i?.descriptor===void 0;e&&(c=await dl(_,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 dl(_,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 Zo(t,await hc(o,u,ta(i?.autoSwap??r,$i)),a.chainId,o.account);if(s&&l){let e=l;s.settle=async n=>{let r=n.status===`accepted`||pl(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=ks({deposit:o,maxDeposit:h,requiredCumulative:a,suggestedDeposit:e.request.suggestedDeposit===void 0?void 0:BigInt(e.request.suggestedDeposit),topUpAmount:g});s>0n&&await zc({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(is(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 Xr(S,async({challenge:e,context:t,fetch:r,input:i})=>{if(!Nc(e))return;let a=t===void 0?void 0:Xs.parse(t);if(Zs(a))return;let s=await sc({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+uo(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||!pc(await b(s,a,c),c.descriptor)||await C({challenge:e,channel:c,deposit:h,fetch:r,input:i,requiredCumulative:f})}),ti(S,async({challenge:e,credential:t,fetch:r,headers:i,input:a,refetch:s,response:c,signal:l})=>{if(!Nc(e))return c;if(!ho(c))return lo(bt(t).payload).action===`open`&&i.get(`accept`)?.toLowerCase().includes(`text/event-stream`)?await s?.()??c:c;let u=(await sc({allowCustomEscrow:n,challenge:e,escrowOverride:o,getClient:p})).key,d=await _.get(u),f={assertVoucherWithinLocalLimit:e=>As(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 Xc({onNeedVoucher:t=>Zc({challenge:e,driver:f,input:a},t),onReceipt(){},response:c,signal:l})})}const hl=new WeakMap;function gl(e,t){hl.set(e,t)}function _l(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 vl(e){let t=_l(`close-ready`),n=_l(`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 yl(e){return e.method===He.tempo&&e.intent===Ue.charge}function bl(e){if(!yl(e)||typeof e.request.amount!=`string`)return!1;try{return BigInt(e.request.amount)===0n}catch{return!1}}function xl(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 Sl(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 Cl(e){let t=e.allowCustomEscrow??!1,n=Sl(e),r=qi({chain:y,getClient:e.client?()=>e.client:e.getClient,rpcUrl:zn}),i=Ui({account:e.account}),a=Is(),o=vl({getSocketSession:()=>a.socketSession}),s=e.channelStore??as(),c=new Set,l;async function u(e){let t=await s.get(e);if(t?.opened&&!c.has(t.channelId))return t}let d={async get(e){let t=await u(e);return t&&l&&(l.seenExisting.add(e),!l.committed&&!l.created.has(e)&&(l.resumed??=t)),t},async set(e){let t=is(e);e.opened&&c.delete(e.channelId),l?.trackCreates&&!l.seenExisting.has(t)&&l.created.set(t,e),await s.set(e)},delete:e=>s.delete(e)};async function f(e){let t=is(e);c.add(e.channelId),l?.seenExisting.delete(t),l?.resumed===e&&(l.resumed=void 0),await Promise.resolve(s.delete(t)).catch(()=>void 0)}async function p(){let e=l;if(e?.created.size){for(let[t,n]of e.created)c.add(n.channelId),await Promise.resolve(s.delete(t)).catch(()=>void 0);e.created.clear(),await P(e.committed??e.previous)}}function m(e){let t=Ke(e.request.methodDetails,We.sessionSnapshot);if(typeof t?.channelId!=`string`)return!1;let n=l;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=Vs({channel:a.channel,spent:a.spent,state:a.state}),!0;return!1}function h(e){return bs(a,e)}function g(){let e=a.state.status===`active`?a.state:l?.committed?.state??l?.previous.state;return e?.status===`active`?e.units:0}function _(e){let t=l,n=t?.committed?.channel?.entry??t?.resumed;!t||n?.channelId.toLowerCase()!==e.channelId.toLowerCase()||e.deposit<=n.deposit||(t.resumed=void 0,t.committed=Vs({channel:a.channel,spent:a.spent,state:a.state}))}let v=ml({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:d,onChannelUpdate(e){e.channelId!==a.channel?.channelId&&(a.spent=0n),a.channel=e,a.lastChallenge&&h({type:`activated`,challengeId:a.lastChallenge.id,entry:e,spent:a.spent.toString(),units:g()}),_(e)}});ni(v);let b=ja({account:e.account,getClient:e.client?()=>e.client:e.getClient}),x=li({fetch:n.fetch,methods:[v],onChallenge:async(e,t)=>{if(!Mc(e))return;let n=l,r=n&&n.challengesReceived>0&&e.id===a.lastChallenge?.id,i=r&&rt(e)===rt(a.lastChallenge);n&&n.challengesReceived++,!i&&(m(e)||(n?.created.size?await p():r&&await P(n.committed??n.previous)),a.lastChallenge=e,h({type:`challengeReceived`,challengeId:e.id}))}});function S(e,t){return v.createCredential({challenge:e,context:t})}function C(e){Ls({maxVoucherCumulative:n.maxVoucherCumulative,receipt:e,runtime:a})}function w(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`&&h({type:`activated`,challengeId:a.lastChallenge.id,entry:a.channel,spent:a.spent.toString(),units:e})}async function T(t){let n=t.headers.get(R.paymentSessionSnapshot);if(!n)return;let o=gs(n),s=await r({chainId:o.chainId}),c=i(s),{entry:l,spent:u}=await fc({account:await e.resolveAccount?.({account:c,chainId:o.chainId,operation:{authority:Eo(o.descriptor),kind:`authorizePaymentChannel`}})??c,client:s,snapshot:o});return j(l.cumulativeAmount),await Promise.resolve(d.set(l)).catch(()=>void 0),a.channel=l,a.spent=u,l}async function E(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:{...Q(i),...Q(r?.headers),[R.acceptPayment]:`${He.tempo}/${Ue.charge}`}};try{let e=await n.fetch(l,u);if(e.status!==402)return await T(e);let t=dt(e).find(yl);if(!t||!bl(t))return;let r=await b.createCredential({challenge:t,context:{}}),i=await n.fetch(l,{...u,headers:{...Q(u.headers),[R.authorization]:r}});return i.ok?await T(i):void 0}catch{return}}function D(e,t){let n=a.socketSession;return zs({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 O(e,t){let n=Pc(t);if(!n)return;if(Do({...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 k(e,t){let n=O(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 A(e,t=e.challenge,n=!1){let r=(n?k(e,t):O(e.channel,t))?.acceptedCumulative??D(t,e.channelId);if(r>e.channel.cumulativeAmount)throw Error(`fallback close amount exceeds local voucher state`);return j(r),r.toString()}function j(e){ws({cumulativeAmount:e,maxVoucherCumulative:n.maxVoucherCumulative})}async function M(e){let{knownDeposit:t,...r}=e,i=await zc({...r,channel:a.channel,createSessionCredential:S,fetch:n.fetch});C(i);let o=Ac({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 d.set(o.channel),h({type:`activated`,challengeId:a.lastChallenge.id,entry:o.channel,spent:a.spent.toString(),units:g()}),_(o.channel)),i}async function N(e){let t=a.channel?.channelId===e.channelId?a.channel.deposit:0n,r=t>e.deposit?t:e.deposit,i=ks({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 M({challenge:e.challenge,input:e.input,channelId:e.channelId,additionalDeposit:i,knownDeposit:r})}async function ee(e,t){let n=Bs({channel:a.channel,channelId:e,challengeId:a.lastChallenge?.id,cumulativeAmount:t,spent:a.spent,state:a.state});n&&a.channel&&(h({type:`activated`,challengeId:n.challengeId,entry:a.channel,spent:n.spent,units:n.units}),await s.set(a.channel))}async function P(e){let t=Hs(e,a.channel);a.channel=t.channel,a.spent=t.spent,a.state=t.state,a.channel?.opened&&await s.set(a.channel)}function te(e){let t=e.headers.get(R.paymentReceipt),n=t?mo(t):null;return C(n),Object.assign(e,{receipt:n,challenge:a.lastChallenge,channelId:a.channel?.channelId??null,cumulative:a.channel?.cumulativeAmount??0n})}async function F(e,t){if(l)throw Error(`SessionManager: a request is already in flight; concurrent requests on one manager are not supported`);a.lastUrl=e;let r=Vs({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};l=i;try{await E(e,t),i.trackCreates=!0;let o=xl(e,t,a.channel?.opened?a.channel.channelId:void 0),s=!r.channel?.opened;async function c(){let n=i.resumed;return!s||!n?!1:(s=!1,await f(n),o=xl(e,t,void 0),!0)}for(;;){let t;try{t=await x(e,o)}catch(e){if(i.created.size?await p():await P(i.committed??r),await c())continue;throw e}let s=te(t),l=!1;if(s.status===402){let t=await Vc({input:e,init:o,response:s,createSessionCredential:S,fetch:n.fetch,getChannel:()=>a.channel,restoreCumulative:ee,setChallenge(e){a.lastChallenge=e},topUpIfNeeded:N});t&&(l=!0,s=te(t))}if(!l&&!s.ok&&!s.receipt){if(i.created.size?await p():await P(i.committed??r),await c())continue;return s}return s}}finally{l=void 0}}async function ne(e){let t=await Uc({createSessionCredential:S,fetch:n.fetch,getMinimumSpent:()=>a.spent,lastUrl:a.lastUrl,resolveSignedCloseAmount:t=>A(e,t,!0),signedCloseAmount:A(e),setChallenge(e){a.lastChallenge=e},target:e});return t&&(w(),h({type:`closeStarted`}),h({type:`closed`,receipt:t})),t}let re={createSessionCredential:S,doFetch:F,fetch:n.fetch,getChannel:()=>a.channel,getChallenge:()=>a.lastChallenge,assertVoucherWithinLocalLimit:j,acceptReceipt(e){C(e)},topUpIfNeeded:N},ie={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:F,async topUp(e){let t=kc({amount:e,assertVoucherWithinLocalLimit:j,channel:a.channel,decimals:n.decimals,lastChallenge:a.lastChallenge,lastUrl:a.lastUrl});return M({additionalDeposit:t.additionalDeposit,challenge:t.challenge,channelId:t.channelId,input:t.input})},async sse(e,t){return Wc(e,t,re)},async ws(e,t){if(!n.WebSocket)throw Error("No WebSocket implementation available. Pass `webSocket` to sessionManager() in this runtime.");let r=Lc(e),i=t?.signal?{signal:t.signal}:void 0;await E(r,i);let s=a.channel?.opened?a.channel.channelId:void 0,{challenge:c,credential:l,httpUrl:u,wsUrl:d}=await $c({async createSessionCredential(e,t){return a.lastChallenge=e,await Qr(v,{challenge:e,context:t,fetch:n.fetch,input:r}),S(e,t)},fetch:n.fetch,input:e,onProbeUrl(e){a.lastUrl=e.toString()},probeInit:xl(r,i,s),signal:t?.signal});return a.lastChallenge=c,il({challenge:c,credential:l,httpUrl:u,WebSocket:n.WebSocket,wsUrl:d,options:t,createSessionCredential:S,getChannel:()=>a.channel,setSocketSession(e){a.socketSession=e},async refreshChallenge(){let e=await Qc({fetch:n.fetch,input:u,probeInit:xl(u,i,a.channel?.opened?a.channel.channelId:void 0),signal:t?.signal});return a.lastChallenge=e.challenge,e.challenge},assertVoucherWithinLocalLimit:j,acceptReceipt:C,rejectCloseReady:o.rejectCloseReady,rejectReceipt:o.rejectReceipt,settleCloseReady:o.settleCloseReady,settleReceipt:o.settleReceipt,topUpIfNeeded:N,waitForReceipt:o.waitForReceipt})},async close(){let e=a.socketSession,t=js({channel:a.channel,currentSocket:e,lastChallenge:a.lastChallenge});if(!t)return;let n=e?.socket;if(e&&n?.readyState===Ec.OPEN){let r=await Us({activeSocket:n,createSessionCredential:S,currentSocket:e,spent:a.spent,target:t,waitForCloseReady:o.waitForCloseReady,waitForReceipt:o.waitForReceipt});return w(),h({type:`closeStarted`}),h({type:`closed`,receipt:r}),r}return ne(t)}};return gl(ie,{consumeSseResponse(e,t,n){return Gc(e,t,n,re)},rehydrate({channel:e,challenge:t,input:n,spent:r}){if(!e.opened)throw Error(`Cannot restore a closed session channel.`);if(!Mc(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.`);j(e.cumulativeAmount);let i=O(e,t),o=i&&i.spent>r?i.spent:r;a.lastUrl=n,a.lastChallenge=t,a.channel=e,a.spent=o,h({type:`challengeReceived`,challengeId:t.id}),h({type:`activated`,challengeId:t.id,entry:e,spent:o.toString(),units:0})}}),ie}(function(e){e.serializeSnapshot=hs,e.deserializeSnapshot=gs})(Cl||={});const wl=(1n<<64n)-1n,Tl={dev_second:1n,day:86400n,week:604800n};function El(e){return e instanceof Date?e:new Date(e)}function Dl(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 Ol(e){if(!/^[1-9]\d*$/.test(e.periodCount))throw new q({reason:`periodCount is invalid`});let t=Tl[e.periodUnit];if(t===void 0)throw new q({reason:`periodUnit is invalid`});let n=BigInt(e.periodCount)*t;if(n>wl)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 kl(e){let{challengeExpires:t,request:n}=e;Ol(n);let r=Dl(El(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 Al(e){return[{address:Hl(e.currency,`currency`),selector:`0x95777d59`,recipients:[Hl(e.recipient,`recipient`)]}]}async function jl(e){let{accessKey:t,account:n,chainId:r,request:i}=e;if(typeof n.sign!=`function`)return;let a=Nl({accessKey:t,chainId:r,request:i}),o=await n.sign({hash:I.getSignPayload(a)}),s=L.from(o);if(s.type===`keychain`||s.type===`multisig`)throw new q({reason:`keyAuthorization must use a primitive signature`});return I.from(a,{signature:o})}function Ml(e){let{accessKey:t,chainId:n,payload:r,request:i}=e;if(r.type!==`keyAuthorization`)throw new q({reason:`invalid keyAuthorization payload`});let a=Pl(r.signature),o=Fl(a);return Il({accessKey:t,authorization:a,chainId:n}),Ll(a,i),zl(Rl(a),i),Bl(a.scopes,i),{authorization:a,source:{address:Vl(a,o),chainId:n}}}function Nl(e){let{accessKey:t,chainId:n,request:r}=e;return I.from({address:Hl(t.accessKeyAddress,`accessKeyAddress`),chainId:BigInt(n),expiry:Dl(El(r.subscriptionExpires)),limits:[{token:Hl(r.currency,`currency`),limit:BigInt(r.amount),period:Ol(r)}],scopes:Al(r),type:t.keyType})}function Pl(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 Fl(e){let t=e.signature;if(!t)throw new q({reason:`keyAuthorization must use a primitive signature`});return t}function Il(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,Hl(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 Ll(e,t){if(kl({request:t}),e.expiry!==Dl(El(t.subscriptionExpires)))throw new q({reason:`keyAuthorization expiry mismatch`})}function Rl(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 zl(e,t){if(!u(e.token,Hl(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!==Ol(t))throw new q({reason:`keyAuthorization period mismatch`})}function Bl(e,t){if(!e||e.length!==1)throw new q({reason:`keyAuthorization must contain a recipient-scoped transferWithMemo call`});let n=Hl(t.currency,`currency`),r=Hl(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=Ul(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 Vl(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 Hl(e,t){if(!l(e))throw new q({reason:`${t} must be an address`});return e.toLowerCase()}function Ul(e){return typeof e==`string`?e.toLowerCase():``}const Wl=B.object({accessKey:B.optional(B.custom()),account:B.optional(B.custom())});function Gl(e={}){let t=qi({chain:N,getClient:e.getClient,rpcUrl:zn}),n=Ui({account:e.account});return kt(Oa,{context:Wl,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.");ql(r.request),await e.validateRequest?.(r.request);let l=await Kl(o,{accessKey:c,account:s,chainId:a,request:r.request}),d=Ml({accessKey:c,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 Kl(e,t){let{accessKey:n,account:r,chainId:i,request:a}=t,o=await jl({accessKey:n,account:r,chainId:i,request:a});if(o)return o;let s=await e.request({method:`wallet_authorizeAccessKey`,params:[{address:n.accessKeyAddress,expiry:Dl(El(a.subscriptionExpires)),keyType:n.keyType,limits:[{token:a.currency,limit:w.fromNumber(BigInt(a.amount)),period:Ol(a)}],scopes:Al(a)}]});return I.fromRpc(s.keyAuthorization)}function ql(e){Ol(e),Dl(El(e.subscriptionExpires))}const Jl=Object.assign(ml,{manager:Cl}),Yl=Object.assign(wo,{method:$a});function Xl(e={}){return[ja(e),Jl(e)]}(function(e){e.charge=ja,e.common=Xl,e.session=Jl,e.sessionLegacy=Yl,e.subscription=Gl})(Xl||={});const Zl=M.union([M.boolean(),M.literal(`true`).transform(()=>!0),M.literal(`false`).transform(()=>!1)]);async function Ql(e){process.stdout.write(Buffer.from(await e.arrayBuffer()))}const $l=M.object({allowCustomEscrow:M.optional(Zl),autoSwap:M.optional(Zl),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())}),eu=[`allowCustomEscrow`,`autoSwap`,`channel`,`deposit`,`payWith`,`slippage`,`tokenIn`];function tu(){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=su(i),u=du({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)&&bu()){g=!0;let t=vu(a);if(t){let i=Wn(r.rpcUrl,{network:r.network});h=e({chain:await Gn({network:r.network,rpcUrl:i}),transport:c(i)}),lu({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=Su();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)}),lu({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 xu(t)}};if(!m||!h)throw new Y({code:`ACCOUNT_NOT_FOUND`,message:`Tempo requires a configured account.`,exitCode:69});let v=Xl({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=pu(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 Vo(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
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));ql(e,C),typeof e.acceptedCumulative==`string`&&e.acceptedCumulative&&iu(v,C),s>=1&&Kl(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 Jl(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 Hl(w),v&&y&&b&&(l&&m(`
13
- `),l&&!await e.confirm(`Close channel?`,!0)?s>=1&&m(`${Z.dim(`Kept channel open.`)}\n`):await Yl({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 Kl(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(`(${zn(BigInt(o),t.tokenSymbol,t.tokenDecimals)})`)}`]):(a===`reference`||a===`txHash`)&&typeof o==`string`&&t.explorerUrl?n.push([a,Ln(`${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 ql(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 Jl(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 Xl():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{Kl(JSON.parse(e),{info:t.info,shownKeys:t.shownKeys,tokenSymbol:t.tokenSymbol,tokenDecimals:t.tokenDecimals,explorerUrl:t.explorerUrl,handler:t.handler,prefix:`
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));ru(e,C),typeof e.acceptedCumulative==`string`&&e.acceptedCumulative&&mu(v,C),s>=1&&nu(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 iu(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 Ql(w),v&&y&&b&&(l&&m(`
13
+ `),l&&!await e.confirm(`Close channel?`,!0)?s>=1&&m(`${Z.dim(`Kept channel open.`)}\n`):await au({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 nu(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 ru(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 iu(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 ou():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{nu(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 Yl({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 Yl(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(au(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(Ln(`${e.explorerUrl}/tx/${r}`,r))}`:``;e.info(`${Z.dim(`Channel closed.`)} ${Z.dim(`Spent ${zn(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 Xl(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 Zl(e){return Ql(Ul,e,Wl)}function Ql(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 $l(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 eu(e){if(e)return e.split(`,`).map(e=>e.trim()).filter(Boolean)}function tu(e){let t=eu(e.tokenIn)??eu(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 nu(){return j.join(process.env.XDG_CONFIG_HOME||j.join(A.homedir(),`.config`),`mppx`,`channels`)}function ru(e){try{let t=k.readFileSync(j.join(nu(),e),`utf-8`).trim();return t?BigInt(t):void 0}catch{return}}function iu(e,t){let n=nu();k.mkdirSync(n,{recursive:!0}),k.writeFileSync(j.join(n,e),t.toString(),`utf-8`)}function au(e){try{k.unlinkSync(j.join(nu(),e))}catch{}}function ou(){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 su(){try{let e=k.readFileSync(ou(),`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 cu(e){let t=su();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 lu;function uu(){if(lu!==void 0)return lu;try{O.execFileSync(`which`,[`tempo`],{stdio:`ignore`}),lu=!0}catch{lu=!1}return lu}async function du(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 fu(){let e=Zn();if(Rn(e.get())&&!uu()&&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{}}export{nr as createPlugin,rr as evm,cr as stripe,Gl as tempo};
18
+ `);a=n.pop(),await d(n)}a.trim()&&await d([a]),t.channelId&&t.escrowContract&&t.chainId&&await au({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 au(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(hu(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 ou(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 su(e){return cu($l,e,eu)}function cu(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 lu(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 uu(e){if(e)return e.split(`,`).map(e=>e.trim()).filter(Boolean)}function du(e){let t=uu(e.tokenIn)??uu(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 fu(){return j.join(process.env.XDG_CONFIG_HOME||j.join(A.homedir(),`.config`),`mppx`,`channels`)}function pu(e){try{let t=k.readFileSync(j.join(fu(),e),`utf-8`).trim();return t?BigInt(t):void 0}catch{return}}function mu(e,t){let n=fu();k.mkdirSync(n,{recursive:!0}),k.writeFileSync(j.join(n,e),t.toString(),`utf-8`)}function hu(e){try{k.unlinkSync(j.join(fu(),e))}catch{}}function gu(){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 _u(){try{let e=k.readFileSync(gu(),`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 vu(e){let t=_u();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 yu;function bu(){if(yu!==void 0)return yu;try{O.execFileSync(`which`,[`tempo`],{stdio:`ignore`}),yu=!0}catch{yu=!1}return yu}async function xu(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 Su(){let e=er();if(Vn(e.get())&&!bu()&&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{}}export{ar as createPlugin,or as evm,fr as stripe,tu as tempo};