mppx 0.8.17 → 0.8.19
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/CHANGELOG.md +61 -0
- package/README.md +15 -0
- package/dist/Challenge.js +21 -4
- package/dist/bin.js +3 -3
- package/dist/cli/THIRD-PARTY-LICENSES.txt +328 -0
- package/dist/cli/cli.js +253 -1505
- package/dist/cli/plugins/index.js +19 -5
- package/dist/cli/plugins/tempo.js +7 -3
- package/dist/cli/sessions/Manager.js +7 -4
- package/dist/cli/sessions/request.d.ts +2 -0
- package/dist/cli/sessions/request.js +18 -0
- package/dist/cli/sessions/store.js +28 -14
- package/dist/discovery/Discovery.js +2 -1
- package/dist/evm/client/Charge.js +8 -0
- package/dist/server/core.d.ts +9 -0
- package/dist/server/core.js +9 -0
- package/dist/stripe/server/Charge.js +2 -4
- package/dist/stripe/server/Methods.d.ts +2 -2
- package/dist/stripe/server/Methods.js +17 -11
- package/dist/stripe/server/internal/html.gen.d.ts +1 -1
- package/dist/stripe/server/internal/html.gen.js +1 -1
- package/dist/stripe/server/spt.d.ts +8 -0
- package/dist/stripe/server/spt.js +8 -0
- package/dist/tempo/Methods.d.ts +13 -0
- package/dist/tempo/Methods.js +14 -3
- package/dist/tempo/client/Charge.d.ts +3 -0
- package/dist/tempo/client/Charge.js +31 -9
- package/dist/tempo/client/Methods.d.ts +13 -0
- package/dist/tempo/internal/defaults.d.ts +11 -0
- package/dist/tempo/internal/defaults.js +11 -0
- package/dist/tempo/internal/machine-token-charge.d.ts +51 -0
- package/dist/tempo/internal/machine-token-charge.js +113 -0
- package/dist/tempo/internal/machine-token-session.d.ts +88 -0
- package/dist/tempo/internal/machine-token-session.js +173 -0
- package/dist/tempo/internal/signature-envelope.d.ts +14 -0
- package/dist/tempo/internal/signature-envelope.js +28 -0
- package/dist/tempo/legacy/client/ChannelOps.d.ts +2 -2
- package/dist/tempo/legacy/client/ChannelOps.js +11 -5
- package/dist/tempo/legacy/client/Session.d.ts +13 -1
- package/dist/tempo/legacy/client/Session.js +3 -3
- package/dist/tempo/legacy/client/SessionManager.d.ts +3 -1
- package/dist/tempo/legacy/client/SessionManager.js +2 -0
- package/dist/tempo/server/Charge.d.ts +3 -0
- package/dist/tempo/server/Charge.js +58 -17
- package/dist/tempo/server/Methods.d.ts +21 -4
- package/dist/tempo/server/Methods.js +8 -4
- package/dist/tempo/server/internal/html.gen.d.ts +1 -1
- package/dist/tempo/server/internal/html.gen.js +1 -1
- package/dist/tempo/session/client/ChannelOps.d.ts +18 -3
- package/dist/tempo/session/client/ChannelOps.js +35 -6
- package/dist/tempo/session/client/ChannelStore.d.ts +0 -5
- package/dist/tempo/session/client/ChannelStore.js +2 -2
- package/dist/tempo/session/client/CredentialState.d.ts +17 -2
- package/dist/tempo/session/client/CredentialState.js +77 -76
- package/dist/tempo/session/client/Runtime.d.ts +4 -2
- package/dist/tempo/session/client/Runtime.js +21 -5
- package/dist/tempo/session/client/Session.d.ts +15 -3
- package/dist/tempo/session/client/Session.js +186 -63
- package/dist/tempo/session/client/SessionManager.d.ts +3 -1
- package/dist/tempo/session/client/SessionManager.js +35 -11
- package/dist/tempo/session/client/Transports.d.ts +2 -0
- package/dist/tempo/session/client/Transports.js +12 -2
- package/dist/tempo/session/precompile/Chain.d.ts +10 -2
- package/dist/tempo/session/precompile/Chain.js +51 -10
- package/dist/tempo/session/precompile/Protocol.d.ts +15 -0
- package/dist/tempo/session/precompile/Protocol.js +7 -0
- package/dist/tempo/session/precompile/Voucher.d.ts +3 -1
- package/dist/tempo/session/precompile/Voucher.js +6 -12
- package/dist/tempo/session/server/ChannelStore.d.ts +6 -0
- package/dist/tempo/session/server/ChannelStore.js +11 -4
- package/dist/tempo/session/server/CredentialVerification.d.ts +11 -9
- package/dist/tempo/session/server/CredentialVerification.js +185 -109
- package/dist/tempo/session/server/MeteredStream.d.ts +1 -1
- package/dist/tempo/session/server/MeteredStream.js +5 -4
- package/dist/tempo/session/server/RequestState.d.ts +19 -0
- package/dist/tempo/session/server/RequestState.js +61 -15
- package/dist/tempo/session/server/Session.d.ts +14 -2
- package/dist/tempo/session/server/Session.js +37 -6
- package/dist/tempo/session/server/Settlement.d.ts +11 -4
- package/dist/tempo/session/server/Settlement.js +53 -21
- package/dist/x402/client/Exact.d.ts +8 -0
- package/dist/x402/client/Exact.js +40 -10
- package/dist/x402/server/EvmCharge.d.ts +22 -0
- package/dist/x402/server/EvmCharge.js +23 -1
- package/package.json +15 -37
- package/dist/BodyDigest.d.ts.map +0 -1
- package/dist/BodyDigest.js.map +0 -1
- package/dist/Challenge.d.ts.map +0 -1
- package/dist/Challenge.js.map +0 -1
- package/dist/Constants.d.ts.map +0 -1
- package/dist/Constants.js.map +0 -1
- package/dist/Credential.d.ts.map +0 -1
- package/dist/Credential.js.map +0 -1
- package/dist/Errors.d.ts.map +0 -1
- package/dist/Errors.js.map +0 -1
- package/dist/Expires.d.ts.map +0 -1
- package/dist/Expires.js.map +0 -1
- package/dist/Html.d.ts.map +0 -1
- package/dist/Html.js.map +0 -1
- package/dist/Mcp.d.ts.map +0 -1
- package/dist/Mcp.js.map +0 -1
- package/dist/Method.d.ts.map +0 -1
- package/dist/Method.js.map +0 -1
- package/dist/PaymentRequest.d.ts.map +0 -1
- package/dist/PaymentRequest.js.map +0 -1
- package/dist/Receipt.d.ts.map +0 -1
- package/dist/Receipt.js.map +0 -1
- package/dist/Store.d.ts.map +0 -1
- package/dist/Store.js.map +0 -1
- package/dist/attestation/Client.d.ts.map +0 -1
- package/dist/attestation/Client.js.map +0 -1
- package/dist/attestation/Constants.d.ts.map +0 -1
- package/dist/attestation/Constants.js.map +0 -1
- package/dist/attestation/Server.d.ts.map +0 -1
- package/dist/attestation/Server.js.map +0 -1
- package/dist/attestation/Types.d.ts.map +0 -1
- package/dist/attestation/Types.js.map +0 -1
- package/dist/attestation/index.d.ts.map +0 -1
- package/dist/attestation/index.js.map +0 -1
- package/dist/attestation/internal/HttpMessageSignature.d.ts.map +0 -1
- package/dist/attestation/internal/HttpMessageSignature.js.map +0 -1
- package/dist/attestation/internal/SigningContext.d.ts.map +0 -1
- package/dist/attestation/internal/SigningContext.js.map +0 -1
- package/dist/bin.d.ts.map +0 -1
- package/dist/bin.js.map +0 -1
- package/dist/cli/account.d.ts.map +0 -1
- package/dist/cli/account.js.map +0 -1
- package/dist/cli/cli.d.ts.map +0 -1
- package/dist/cli/cli.js.map +0 -1
- package/dist/cli/config.d.ts.map +0 -1
- package/dist/cli/config.js.map +0 -1
- package/dist/cli/internal.d.ts.map +0 -1
- package/dist/cli/internal.js.map +0 -1
- package/dist/cli/plugins/evm.d.ts.map +0 -1
- package/dist/cli/plugins/evm.js.map +0 -1
- package/dist/cli/plugins/index.d.ts.map +0 -1
- package/dist/cli/plugins/index.js.map +0 -1
- package/dist/cli/plugins/plugin.d.ts.map +0 -1
- package/dist/cli/plugins/plugin.js.map +0 -1
- package/dist/cli/plugins/stripe.d.ts.map +0 -1
- package/dist/cli/plugins/stripe.js.map +0 -1
- package/dist/cli/plugins/tempo.d.ts.map +0 -1
- package/dist/cli/plugins/tempo.js.map +0 -1
- package/dist/cli/sessions/Manager.d.ts.map +0 -1
- package/dist/cli/sessions/Manager.js.map +0 -1
- package/dist/cli/sessions/commands.d.ts.map +0 -1
- package/dist/cli/sessions/commands.js.map +0 -1
- package/dist/cli/sessions/request.d.ts.map +0 -1
- package/dist/cli/sessions/request.js.map +0 -1
- package/dist/cli/sessions/store.d.ts.map +0 -1
- package/dist/cli/sessions/store.js.map +0 -1
- package/dist/cli/utils.d.ts.map +0 -1
- package/dist/cli/utils.js.map +0 -1
- package/dist/cli/validate/challenge.d.ts.map +0 -1
- package/dist/cli/validate/challenge.js.map +0 -1
- package/dist/cli/validate/discovery.d.ts.map +0 -1
- package/dist/cli/validate/discovery.js.map +0 -1
- package/dist/cli/validate/helpers.d.ts.map +0 -1
- package/dist/cli/validate/helpers.js.map +0 -1
- package/dist/cli/validate/index.d.ts.map +0 -1
- package/dist/cli/validate/index.js.map +0 -1
- package/dist/cli/validate/messages.d.ts.map +0 -1
- package/dist/cli/validate/messages.js.map +0 -1
- package/dist/cli/validate/payment.d.ts.map +0 -1
- package/dist/cli/validate/payment.js.map +0 -1
- package/dist/client/Methods.d.ts.map +0 -1
- package/dist/client/Methods.js.map +0 -1
- package/dist/client/Mppx.d.ts.map +0 -1
- package/dist/client/Mppx.js.map +0 -1
- package/dist/client/Transport.d.ts.map +0 -1
- package/dist/client/Transport.js.map +0 -1
- package/dist/client/index.d.ts.map +0 -1
- package/dist/client/index.js.map +0 -1
- package/dist/client/internal/Fetch.d.ts.map +0 -1
- package/dist/client/internal/Fetch.js.map +0 -1
- package/dist/client/internal/MethodChallenge.d.ts.map +0 -1
- package/dist/client/internal/MethodChallenge.js.map +0 -1
- package/dist/client/internal/MethodResponse.d.ts.map +0 -1
- package/dist/client/internal/MethodResponse.js.map +0 -1
- package/dist/client/internal/protocols/Mcp.d.ts.map +0 -1
- package/dist/client/internal/protocols/Mcp.js.map +0 -1
- package/dist/client/internal/protocols/Mpp.d.ts.map +0 -1
- package/dist/client/internal/protocols/Mpp.js.map +0 -1
- package/dist/client/internal/protocols/Protocol.d.ts.map +0 -1
- package/dist/client/internal/protocols/Protocol.js.map +0 -1
- package/dist/client/internal/protocols/Shared.d.ts.map +0 -1
- package/dist/client/internal/protocols/Shared.js.map +0 -1
- package/dist/client/internal/protocols/X402.d.ts.map +0 -1
- package/dist/client/internal/protocols/X402.js.map +0 -1
- package/dist/client/node.d.ts.map +0 -1
- package/dist/client/node.js.map +0 -1
- package/dist/discovery/Discovery.d.ts.map +0 -1
- package/dist/discovery/Discovery.js.map +0 -1
- package/dist/discovery/OpenApi.d.ts.map +0 -1
- package/dist/discovery/OpenApi.js.map +0 -1
- package/dist/discovery/Validate.d.ts.map +0 -1
- package/dist/discovery/Validate.js.map +0 -1
- package/dist/discovery/index.d.ts.map +0 -1
- package/dist/discovery/index.js.map +0 -1
- package/dist/discovery/internal/Metadata.d.ts.map +0 -1
- package/dist/discovery/internal/Metadata.js.map +0 -1
- package/dist/evm/Assets.d.ts.map +0 -1
- package/dist/evm/Assets.js.map +0 -1
- package/dist/evm/Chains.d.ts.map +0 -1
- package/dist/evm/Chains.js.map +0 -1
- package/dist/evm/Methods.d.ts.map +0 -1
- package/dist/evm/Methods.js.map +0 -1
- package/dist/evm/Types.d.ts.map +0 -1
- package/dist/evm/Types.js.map +0 -1
- package/dist/evm/client/Charge.d.ts.map +0 -1
- package/dist/evm/client/Charge.js.map +0 -1
- package/dist/evm/client/Methods.d.ts.map +0 -1
- package/dist/evm/client/Methods.js.map +0 -1
- package/dist/evm/client/index.d.ts.map +0 -1
- package/dist/evm/client/index.js.map +0 -1
- package/dist/evm/index.d.ts.map +0 -1
- package/dist/evm/index.js.map +0 -1
- package/dist/evm/server/Charge.d.ts.map +0 -1
- package/dist/evm/server/Charge.js.map +0 -1
- package/dist/evm/server/Methods.d.ts.map +0 -1
- package/dist/evm/server/Methods.js.map +0 -1
- package/dist/evm/server/index.d.ts.map +0 -1
- package/dist/evm/server/index.js.map +0 -1
- package/dist/index.d.ts.map +0 -1
- package/dist/index.js.map +0 -1
- package/dist/internal/AcceptPayment.d.ts.map +0 -1
- package/dist/internal/AcceptPayment.js.map +0 -1
- package/dist/internal/HeaderCodec.d.ts.map +0 -1
- package/dist/internal/HeaderCodec.js.map +0 -1
- package/dist/internal/constantTimeEqual.d.ts.map +0 -1
- package/dist/internal/constantTimeEqual.js.map +0 -1
- package/dist/internal/env.d.ts.map +0 -1
- package/dist/internal/env.js.map +0 -1
- package/dist/internal/types.d.ts.map +0 -1
- package/dist/internal/types.js.map +0 -1
- package/dist/mcp/client/McpClient.d.ts.map +0 -1
- package/dist/mcp/client/McpClient.js.map +0 -1
- package/dist/mcp/client/index.d.ts.map +0 -1
- package/dist/mcp/client/index.js.map +0 -1
- package/dist/mcp/server/Transport.d.ts.map +0 -1
- package/dist/mcp/server/Transport.js.map +0 -1
- package/dist/mcp/server/index.d.ts.map +0 -1
- package/dist/mcp/server/index.js.map +0 -1
- package/dist/middlewares/elysia.d.ts.map +0 -1
- package/dist/middlewares/elysia.js.map +0 -1
- package/dist/middlewares/express.d.ts.map +0 -1
- package/dist/middlewares/express.js.map +0 -1
- package/dist/middlewares/hono.d.ts.map +0 -1
- package/dist/middlewares/hono.js.map +0 -1
- package/dist/middlewares/internal/mppx.d.ts.map +0 -1
- package/dist/middlewares/internal/mppx.js.map +0 -1
- package/dist/middlewares/nextjs.d.ts.map +0 -1
- package/dist/middlewares/nextjs.js.map +0 -1
- package/dist/proxy/Proxy.d.ts.map +0 -1
- package/dist/proxy/Proxy.js.map +0 -1
- package/dist/proxy/Service.d.ts.map +0 -1
- package/dist/proxy/Service.js.map +0 -1
- package/dist/proxy/index.d.ts.map +0 -1
- package/dist/proxy/index.js.map +0 -1
- package/dist/proxy/internal/Headers.d.ts.map +0 -1
- package/dist/proxy/internal/Headers.js.map +0 -1
- package/dist/proxy/internal/Route.d.ts.map +0 -1
- package/dist/proxy/internal/Route.js.map +0 -1
- package/dist/proxy/services/anthropic.d.ts.map +0 -1
- package/dist/proxy/services/anthropic.js.map +0 -1
- package/dist/proxy/services/openai.d.ts.map +0 -1
- package/dist/proxy/services/openai.js.map +0 -1
- package/dist/proxy/services/stripe.d.ts.map +0 -1
- package/dist/proxy/services/stripe.js.map +0 -1
- package/dist/server/Methods.d.ts.map +0 -1
- package/dist/server/Methods.js.map +0 -1
- package/dist/server/Mppx.d.ts.map +0 -1
- package/dist/server/Mppx.js.map +0 -1
- package/dist/server/NodeListener.d.ts.map +0 -1
- package/dist/server/NodeListener.js.map +0 -1
- package/dist/server/Request.d.ts.map +0 -1
- package/dist/server/Request.js.map +0 -1
- package/dist/server/Response.d.ts.map +0 -1
- package/dist/server/Response.js.map +0 -1
- package/dist/server/Transport.d.ts.map +0 -1
- package/dist/server/Transport.js.map +0 -1
- package/dist/server/index.d.ts.map +0 -1
- package/dist/server/index.js.map +0 -1
- package/dist/server/internal/html/compose.main.gen.d.ts.map +0 -1
- package/dist/server/internal/html/compose.main.gen.js.map +0 -1
- package/dist/server/internal/html/config.d.ts.map +0 -1
- package/dist/server/internal/html/config.js.map +0 -1
- package/dist/server/internal/html/constants.d.ts.map +0 -1
- package/dist/server/internal/html/constants.js.map +0 -1
- package/dist/server/internal/html/serviceWorker.client.d.ts.map +0 -1
- package/dist/server/internal/html/serviceWorker.client.js.map +0 -1
- package/dist/server/internal/html/serviceWorker.gen.d.ts.map +0 -1
- package/dist/server/internal/html/serviceWorker.gen.js.map +0 -1
- package/dist/server/internal/scope.d.ts.map +0 -1
- package/dist/server/internal/scope.js.map +0 -1
- package/dist/stripe/Methods.d.ts.map +0 -1
- package/dist/stripe/Methods.js.map +0 -1
- package/dist/stripe/client/Charge.d.ts.map +0 -1
- package/dist/stripe/client/Charge.js.map +0 -1
- package/dist/stripe/client/Methods.d.ts.map +0 -1
- package/dist/stripe/client/Methods.js.map +0 -1
- package/dist/stripe/client/index.d.ts.map +0 -1
- package/dist/stripe/client/index.js.map +0 -1
- package/dist/stripe/index.d.ts.map +0 -1
- package/dist/stripe/index.js.map +0 -1
- package/dist/stripe/internal/constants.d.ts.map +0 -1
- package/dist/stripe/internal/constants.js.map +0 -1
- package/dist/stripe/internal/types.d.ts.map +0 -1
- package/dist/stripe/internal/types.js.map +0 -1
- package/dist/stripe/server/Charge.d.ts.map +0 -1
- package/dist/stripe/server/Charge.js.map +0 -1
- package/dist/stripe/server/Methods.d.ts.map +0 -1
- package/dist/stripe/server/Methods.js.map +0 -1
- package/dist/stripe/server/index.d.ts.map +0 -1
- package/dist/stripe/server/index.js.map +0 -1
- package/dist/stripe/server/internal/deposit-address.d.ts.map +0 -1
- package/dist/stripe/server/internal/deposit-address.js.map +0 -1
- package/dist/stripe/server/internal/html/types.d.ts.map +0 -1
- package/dist/stripe/server/internal/html/types.js.map +0 -1
- package/dist/stripe/server/internal/html.gen.d.ts.map +0 -1
- package/dist/stripe/server/internal/html.gen.js.map +0 -1
- package/dist/stripe/server/internal/record-payment.d.ts.map +0 -1
- package/dist/stripe/server/internal/record-payment.js.map +0 -1
- package/dist/stripe/server/internal/request.d.ts.map +0 -1
- package/dist/stripe/server/internal/request.js.map +0 -1
- package/dist/tap/Constants.d.ts.map +0 -1
- package/dist/tap/Constants.js.map +0 -1
- package/dist/tap/Types.d.ts.map +0 -1
- package/dist/tap/Types.js.map +0 -1
- package/dist/tap/client/index.d.ts.map +0 -1
- package/dist/tap/client/index.js.map +0 -1
- package/dist/tap/index.d.ts.map +0 -1
- package/dist/tap/index.js.map +0 -1
- package/dist/tap/server/index.d.ts.map +0 -1
- package/dist/tap/server/index.js.map +0 -1
- package/dist/tempo/Attribution.d.ts.map +0 -1
- package/dist/tempo/Attribution.js.map +0 -1
- package/dist/tempo/Methods.d.ts.map +0 -1
- package/dist/tempo/Methods.js.map +0 -1
- package/dist/tempo/Proof.d.ts.map +0 -1
- package/dist/tempo/Proof.js.map +0 -1
- package/dist/tempo/client/Charge.d.ts.map +0 -1
- package/dist/tempo/client/Charge.js.map +0 -1
- package/dist/tempo/client/Methods.d.ts.map +0 -1
- package/dist/tempo/client/Methods.js.map +0 -1
- package/dist/tempo/client/ResolveAccount.d.ts.map +0 -1
- package/dist/tempo/client/ResolveAccount.js.map +0 -1
- package/dist/tempo/client/Subscription.d.ts.map +0 -1
- package/dist/tempo/client/Subscription.js.map +0 -1
- package/dist/tempo/client/index.d.ts.map +0 -1
- package/dist/tempo/client/index.js.map +0 -1
- package/dist/tempo/index.d.ts.map +0 -1
- package/dist/tempo/index.js.map +0 -1
- package/dist/tempo/internal/account.d.ts.map +0 -1
- package/dist/tempo/internal/account.js.map +0 -1
- package/dist/tempo/internal/address.d.ts.map +0 -1
- package/dist/tempo/internal/address.js.map +0 -1
- package/dist/tempo/internal/auto-swap.d.ts.map +0 -1
- package/dist/tempo/internal/auto-swap.js.map +0 -1
- package/dist/tempo/internal/charge.d.ts.map +0 -1
- package/dist/tempo/internal/charge.js.map +0 -1
- package/dist/tempo/internal/defaults.d.ts.map +0 -1
- package/dist/tempo/internal/defaults.js.map +0 -1
- package/dist/tempo/internal/fee-payer.d.ts.map +0 -1
- package/dist/tempo/internal/fee-payer.js.map +0 -1
- package/dist/tempo/internal/fee-token.d.ts.map +0 -1
- package/dist/tempo/internal/fee-token.js.map +0 -1
- package/dist/tempo/internal/proof.d.ts.map +0 -1
- package/dist/tempo/internal/proof.js.map +0 -1
- package/dist/tempo/internal/selectors.d.ts.map +0 -1
- package/dist/tempo/internal/selectors.js.map +0 -1
- package/dist/tempo/internal/types.d.ts.map +0 -1
- package/dist/tempo/internal/types.js.map +0 -1
- package/dist/tempo/legacy/client/ChannelOps.d.ts.map +0 -1
- package/dist/tempo/legacy/client/ChannelOps.js.map +0 -1
- package/dist/tempo/legacy/client/Session.d.ts.map +0 -1
- package/dist/tempo/legacy/client/Session.js.map +0 -1
- package/dist/tempo/legacy/client/SessionManager.d.ts.map +0 -1
- package/dist/tempo/legacy/client/SessionManager.js.map +0 -1
- package/dist/tempo/legacy/client/index.d.ts.map +0 -1
- package/dist/tempo/legacy/client/index.js.map +0 -1
- package/dist/tempo/legacy/index.d.ts.map +0 -1
- package/dist/tempo/legacy/index.js.map +0 -1
- package/dist/tempo/legacy/session/Chain.d.ts.map +0 -1
- package/dist/tempo/legacy/session/Chain.js.map +0 -1
- package/dist/tempo/legacy/session/Channel.d.ts.map +0 -1
- package/dist/tempo/legacy/session/Channel.js.map +0 -1
- package/dist/tempo/legacy/session/Types.d.ts.map +0 -1
- package/dist/tempo/legacy/session/Types.js.map +0 -1
- package/dist/tempo/legacy/session/Voucher.d.ts.map +0 -1
- package/dist/tempo/legacy/session/Voucher.js.map +0 -1
- package/dist/tempo/legacy/session/escrow.abi.d.ts.map +0 -1
- package/dist/tempo/legacy/session/escrow.abi.js.map +0 -1
- package/dist/tempo/legacy/session/index.d.ts.map +0 -1
- package/dist/tempo/legacy/session/index.js.map +0 -1
- package/dist/tempo/server/Charge.d.ts.map +0 -1
- package/dist/tempo/server/Charge.js.map +0 -1
- package/dist/tempo/server/Methods.d.ts.map +0 -1
- package/dist/tempo/server/Methods.js.map +0 -1
- package/dist/tempo/server/Relay.d.ts.map +0 -1
- package/dist/tempo/server/Relay.js.map +0 -1
- package/dist/tempo/server/SponsorBudget.d.ts.map +0 -1
- package/dist/tempo/server/SponsorBudget.js.map +0 -1
- package/dist/tempo/server/Subscription.d.ts.map +0 -1
- package/dist/tempo/server/Subscription.js.map +0 -1
- package/dist/tempo/server/index.d.ts.map +0 -1
- package/dist/tempo/server/index.js.map +0 -1
- package/dist/tempo/server/internal/html.gen.d.ts.map +0 -1
- package/dist/tempo/server/internal/html.gen.js.map +0 -1
- package/dist/tempo/server/internal/request-body.d.ts.map +0 -1
- package/dist/tempo/server/internal/request-body.js.map +0 -1
- package/dist/tempo/server/internal/transport.d.ts.map +0 -1
- package/dist/tempo/server/internal/transport.js.map +0 -1
- package/dist/tempo/session/Snapshot.d.ts.map +0 -1
- package/dist/tempo/session/Snapshot.js.map +0 -1
- package/dist/tempo/session/client/ChannelOps.d.ts.map +0 -1
- package/dist/tempo/session/client/ChannelOps.js.map +0 -1
- package/dist/tempo/session/client/ChannelStore.d.ts.map +0 -1
- package/dist/tempo/session/client/ChannelStore.js.map +0 -1
- package/dist/tempo/session/client/CredentialState.d.ts.map +0 -1
- package/dist/tempo/session/client/CredentialState.js.map +0 -1
- package/dist/tempo/session/client/ReceiptCoordinator.d.ts.map +0 -1
- package/dist/tempo/session/client/ReceiptCoordinator.js.map +0 -1
- package/dist/tempo/session/client/Runtime.d.ts.map +0 -1
- package/dist/tempo/session/client/Runtime.js.map +0 -1
- package/dist/tempo/session/client/Session.d.ts.map +0 -1
- package/dist/tempo/session/client/Session.js.map +0 -1
- package/dist/tempo/session/client/SessionManager.d.ts.map +0 -1
- package/dist/tempo/session/client/SessionManager.js.map +0 -1
- package/dist/tempo/session/client/Transports.d.ts.map +0 -1
- package/dist/tempo/session/client/Transports.js.map +0 -1
- package/dist/tempo/session/client/index.d.ts.map +0 -1
- package/dist/tempo/session/client/index.js.map +0 -1
- package/dist/tempo/session/client/internal/SessionManager.d.ts.map +0 -1
- package/dist/tempo/session/client/internal/SessionManager.js.map +0 -1
- package/dist/tempo/session/index.d.ts.map +0 -1
- package/dist/tempo/session/index.js.map +0 -1
- package/dist/tempo/session/precompile/Chain.d.ts.map +0 -1
- package/dist/tempo/session/precompile/Chain.js.map +0 -1
- package/dist/tempo/session/precompile/Channel.d.ts.map +0 -1
- package/dist/tempo/session/precompile/Channel.js.map +0 -1
- package/dist/tempo/session/precompile/Protocol.d.ts.map +0 -1
- package/dist/tempo/session/precompile/Protocol.js.map +0 -1
- package/dist/tempo/session/precompile/Voucher.d.ts.map +0 -1
- package/dist/tempo/session/precompile/Voucher.js.map +0 -1
- package/dist/tempo/session/precompile/escrow.abi.d.ts.map +0 -1
- package/dist/tempo/session/precompile/escrow.abi.js.map +0 -1
- package/dist/tempo/session/precompile/index.d.ts.map +0 -1
- package/dist/tempo/session/precompile/index.js.map +0 -1
- package/dist/tempo/session/server/ChannelOps.d.ts.map +0 -1
- package/dist/tempo/session/server/ChannelOps.js.map +0 -1
- package/dist/tempo/session/server/ChannelStore.d.ts.map +0 -1
- package/dist/tempo/session/server/ChannelStore.js.map +0 -1
- package/dist/tempo/session/server/CredentialVerification.d.ts.map +0 -1
- package/dist/tempo/session/server/CredentialVerification.js.map +0 -1
- package/dist/tempo/session/server/MeteredStream.d.ts.map +0 -1
- package/dist/tempo/session/server/MeteredStream.js.map +0 -1
- package/dist/tempo/session/server/RequestState.d.ts.map +0 -1
- package/dist/tempo/session/server/RequestState.js.map +0 -1
- package/dist/tempo/session/server/Session.d.ts.map +0 -1
- package/dist/tempo/session/server/Session.js.map +0 -1
- package/dist/tempo/session/server/Settlement.d.ts.map +0 -1
- package/dist/tempo/session/server/Settlement.js.map +0 -1
- package/dist/tempo/session/server/Sse.d.ts.map +0 -1
- package/dist/tempo/session/server/Sse.js.map +0 -1
- package/dist/tempo/session/server/Transports.d.ts.map +0 -1
- package/dist/tempo/session/server/Transports.js.map +0 -1
- package/dist/tempo/session/server/Ws.d.ts.map +0 -1
- package/dist/tempo/session/server/Ws.js.map +0 -1
- package/dist/tempo/session/server/index.d.ts.map +0 -1
- package/dist/tempo/session/server/index.js.map +0 -1
- package/dist/tempo/subscription/KeyAuthorization.d.ts.map +0 -1
- package/dist/tempo/subscription/KeyAuthorization.js.map +0 -1
- package/dist/tempo/subscription/Receipt.d.ts.map +0 -1
- package/dist/tempo/subscription/Receipt.js.map +0 -1
- package/dist/tempo/subscription/Store.d.ts.map +0 -1
- package/dist/tempo/subscription/Store.js.map +0 -1
- package/dist/tempo/subscription/Types.d.ts.map +0 -1
- package/dist/tempo/subscription/Types.js.map +0 -1
- package/dist/tempo/subscription/index.d.ts.map +0 -1
- package/dist/tempo/subscription/index.js.map +0 -1
- package/dist/validation/core.d.ts.map +0 -1
- package/dist/validation/core.js.map +0 -1
- package/dist/validation/index.d.ts.map +0 -1
- package/dist/validation/index.js.map +0 -1
- package/dist/viem/Account.d.ts.map +0 -1
- package/dist/viem/Account.js.map +0 -1
- package/dist/viem/Client.d.ts.map +0 -1
- package/dist/viem/Client.js.map +0 -1
- package/dist/web-bot-auth/Constants.d.ts.map +0 -1
- package/dist/web-bot-auth/Constants.js.map +0 -1
- package/dist/web-bot-auth/Types.d.ts.map +0 -1
- package/dist/web-bot-auth/Types.js.map +0 -1
- package/dist/web-bot-auth/client/index.d.ts.map +0 -1
- package/dist/web-bot-auth/client/index.js.map +0 -1
- package/dist/web-bot-auth/index.d.ts.map +0 -1
- package/dist/web-bot-auth/index.js.map +0 -1
- package/dist/web-bot-auth/internal/JwkThumbprint.d.ts.map +0 -1
- package/dist/web-bot-auth/internal/JwkThumbprint.js.map +0 -1
- package/dist/web-bot-auth/internal/SignatureAgent.d.ts.map +0 -1
- package/dist/web-bot-auth/internal/SignatureAgent.js.map +0 -1
- package/dist/web-bot-auth/server/index.d.ts.map +0 -1
- package/dist/web-bot-auth/server/index.js.map +0 -1
- package/dist/x402/Assets.d.ts.map +0 -1
- package/dist/x402/Assets.js.map +0 -1
- package/dist/x402/Header.d.ts.map +0 -1
- package/dist/x402/Header.js.map +0 -1
- package/dist/x402/Types.d.ts.map +0 -1
- package/dist/x402/Types.js.map +0 -1
- package/dist/x402/client/Exact.d.ts.map +0 -1
- package/dist/x402/client/Exact.js.map +0 -1
- package/dist/x402/index.d.ts.map +0 -1
- package/dist/x402/index.js.map +0 -1
- package/dist/x402/internal/ChallengeBrand.d.ts.map +0 -1
- package/dist/x402/internal/ChallengeBrand.js.map +0 -1
- package/dist/x402/internal/RouteBinding.d.ts.map +0 -1
- package/dist/x402/internal/RouteBinding.js.map +0 -1
- package/dist/x402/server/EvmCharge.d.ts.map +0 -1
- package/dist/x402/server/EvmCharge.js.map +0 -1
- package/dist/x402/server/Facilitator.d.ts.map +0 -1
- package/dist/x402/server/Facilitator.js.map +0 -1
- package/dist/zod.d.ts.map +0 -1
- package/dist/zod.js.map +0 -1
- package/src/BodyDigest.test.ts +0 -43
- package/src/BodyDigest.ts +0 -55
- package/src/Challenge.fuzz.test.ts +0 -154
- package/src/Challenge.test-d.ts +0 -82
- package/src/Challenge.test.ts +0 -1060
- package/src/Challenge.ts +0 -687
- package/src/Constants.ts +0 -58
- package/src/Credential.fuzz.test.ts +0 -62
- package/src/Credential.test.ts +0 -378
- package/src/Credential.ts +0 -217
- package/src/Errors.test.ts +0 -520
- package/src/Errors.ts +0 -448
- package/src/Expires.test.ts +0 -112
- package/src/Expires.ts +0 -59
- package/src/Html.ts +0 -67
- package/src/Mcp.ts +0 -85
- package/src/Method.test.ts +0 -177
- package/src/Method.ts +0 -631
- package/src/PaymentRequest.test.ts +0 -147
- package/src/PaymentRequest.ts +0 -108
- package/src/Receipt.test.ts +0 -151
- package/src/Receipt.ts +0 -146
- package/src/Store.test-d.ts +0 -211
- package/src/Store.test.ts +0 -407
- package/src/Store.ts +0 -397
- package/src/attestation/Attestation.integration.test.ts +0 -208
- package/src/attestation/Client.test.ts +0 -83
- package/src/attestation/Client.ts +0 -34
- package/src/attestation/Constants.ts +0 -15
- package/src/attestation/Server.test.ts +0 -60
- package/src/attestation/Server.ts +0 -12
- package/src/attestation/Types.test-d.ts +0 -54
- package/src/attestation/Types.ts +0 -77
- package/src/attestation/index.ts +0 -5
- package/src/attestation/internal/HttpMessageSignature.test.ts +0 -101
- package/src/attestation/internal/HttpMessageSignature.ts +0 -429
- package/src/attestation/internal/SigningContext.ts +0 -13
- package/src/bin.js +0 -2
- package/src/bin.ts +0 -4
- package/src/cli/account.ts +0 -269
- package/src/cli/cli.test.ts +0 -2221
- package/src/cli/cli.ts +0 -1650
- package/src/cli/config.test.ts +0 -89
- package/src/cli/config.ts +0 -50
- package/src/cli/internal.ts +0 -114
- package/src/cli/mcp.test.ts +0 -262
- package/src/cli/plugins/evm.ts +0 -55
- package/src/cli/plugins/index.ts +0 -4
- package/src/cli/plugins/plugin.ts +0 -84
- package/src/cli/plugins/stripe.ts +0 -174
- package/src/cli/plugins/tempo.ts +0 -1102
- package/src/cli/sessions/Manager.test.ts +0 -249
- package/src/cli/sessions/Manager.ts +0 -93
- package/src/cli/sessions/commands.ts +0 -444
- package/src/cli/sessions/request.test.ts +0 -51
- package/src/cli/sessions/request.ts +0 -353
- package/src/cli/sessions/store.test.ts +0 -581
- package/src/cli/sessions/store.ts +0 -940
- package/src/cli/utils.test.ts +0 -156
- package/src/cli/utils.ts +0 -394
- package/src/cli/validate/challenge.ts +0 -565
- package/src/cli/validate/discovery.test.ts +0 -435
- package/src/cli/validate/discovery.ts +0 -221
- package/src/cli/validate/helpers.ts +0 -166
- package/src/cli/validate/index.ts +0 -229
- package/src/cli/validate/messages.ts +0 -7
- package/src/cli/validate/payment.ts +0 -774
- package/src/cli/validate.test.ts +0 -843
- package/src/client/Methods.ts +0 -8
- package/src/client/Mppx.test-d.ts +0 -287
- package/src/client/Mppx.test.ts +0 -1065
- package/src/client/Mppx.ts +0 -487
- package/src/client/Transport.test.ts +0 -586
- package/src/client/Transport.ts +0 -170
- package/src/client/index.ts +0 -29
- package/src/client/internal/Fetch.browser.test.ts +0 -197
- package/src/client/internal/Fetch.test-d.ts +0 -109
- package/src/client/internal/Fetch.test.ts +0 -2336
- package/src/client/internal/Fetch.ts +0 -1075
- package/src/client/internal/MethodChallenge.ts +0 -35
- package/src/client/internal/MethodResponse.ts +0 -67
- package/src/client/internal/protocols/Mcp.test.ts +0 -220
- package/src/client/internal/protocols/Mcp.ts +0 -186
- package/src/client/internal/protocols/Mpp.ts +0 -21
- package/src/client/internal/protocols/Protocol.ts +0 -10
- package/src/client/internal/protocols/Shared.ts +0 -25
- package/src/client/internal/protocols/X402.ts +0 -46
- package/src/client/node.test.ts +0 -115
- package/src/client/node.ts +0 -247
- package/src/discovery/Discovery.test.ts +0 -214
- package/src/discovery/Discovery.ts +0 -105
- package/src/discovery/OpenApi.test.ts +0 -623
- package/src/discovery/OpenApi.ts +0 -192
- package/src/discovery/Validate.test.ts +0 -305
- package/src/discovery/Validate.ts +0 -77
- package/src/discovery/index.ts +0 -3
- package/src/discovery/internal/Metadata.ts +0 -51
- package/src/env.d.ts +0 -12
- package/src/evm/Assets.ts +0 -1
- package/src/evm/Chains.ts +0 -11
- package/src/evm/Methods.ts +0 -44
- package/src/evm/PublicInterface.test-d.ts +0 -134
- package/src/evm/Types.ts +0 -140
- package/src/evm/client/Charge.test.ts +0 -347
- package/src/evm/client/Charge.ts +0 -187
- package/src/evm/client/Methods.ts +0 -19
- package/src/evm/client/index.ts +0 -6
- package/src/evm/index.ts +0 -16
- package/src/evm/server/Charge.test.ts +0 -339
- package/src/evm/server/Charge.ts +0 -295
- package/src/evm/server/Methods.ts +0 -22
- package/src/evm/server/index.ts +0 -6
- package/src/index.ts +0 -14
- package/src/internal/AcceptPayment.test.ts +0 -347
- package/src/internal/AcceptPayment.ts +0 -366
- package/src/internal/HeaderCodec.ts +0 -36
- package/src/internal/changeset.test.ts +0 -106
- package/src/internal/constantTimeEqual.test.ts +0 -47
- package/src/internal/constantTimeEqual.ts +0 -10
- package/src/internal/env.test.ts +0 -42
- package/src/internal/env.ts +0 -49
- package/src/internal/types.test-d.ts +0 -21
- package/src/internal/types.ts +0 -479
- package/src/mcp/client/McpClient.integration.test.ts +0 -639
- package/src/mcp/client/McpClient.test-d.ts +0 -144
- package/src/mcp/client/McpClient.test.ts +0 -463
- package/src/mcp/client/McpClient.ts +0 -307
- package/src/mcp/client/McpClient.unit.test.ts +0 -135
- package/src/mcp/client/index.ts +0 -2
- package/src/mcp/server/Transport.test.ts +0 -191
- package/src/mcp/server/Transport.ts +0 -111
- package/src/mcp/server/index.ts +0 -1
- package/src/middlewares/elysia.test.ts +0 -285
- package/src/middlewares/elysia.ts +0 -116
- package/src/middlewares/express.test.ts +0 -361
- package/src/middlewares/express.ts +0 -140
- package/src/middlewares/hono.test.ts +0 -473
- package/src/middlewares/hono.ts +0 -153
- package/src/middlewares/internal/mppx.test.ts +0 -177
- package/src/middlewares/internal/mppx.ts +0 -67
- package/src/middlewares/nextjs.test.ts +0 -359
- package/src/middlewares/nextjs.ts +0 -107
- package/src/proxy/Proxy.test.ts +0 -1038
- package/src/proxy/Proxy.ts +0 -483
- package/src/proxy/Proxy.upstreamError.test.ts +0 -364
- package/src/proxy/Service.test.ts +0 -252
- package/src/proxy/Service.ts +0 -280
- package/src/proxy/index.ts +0 -6
- package/src/proxy/internal/Headers.test.ts +0 -139
- package/src/proxy/internal/Headers.ts +0 -66
- package/src/proxy/internal/Route.test.ts +0 -217
- package/src/proxy/internal/Route.ts +0 -64
- package/src/proxy/services/anthropic.test.ts +0 -132
- package/src/proxy/services/anthropic.ts +0 -53
- package/src/proxy/services/hooks.test-d.ts +0 -14
- package/src/proxy/services/hooks.test.ts +0 -44
- package/src/proxy/services/openai.test.ts +0 -157
- package/src/proxy/services/openai.ts +0 -60
- package/src/proxy/services/stripe.test.ts +0 -175
- package/src/proxy/services/stripe.ts +0 -59
- package/src/server/Methods.test-d.ts +0 -88
- package/src/server/Methods.test.ts +0 -69
- package/src/server/Methods.ts +0 -3
- package/src/server/Mppx.authorize.test.ts +0 -210
- package/src/server/Mppx.test-d.ts +0 -494
- package/src/server/Mppx.test.ts +0 -6711
- package/src/server/Mppx.ts +0 -2919
- package/src/server/NodeListener.test.ts +0 -293
- package/src/server/NodeListener.ts +0 -45
- package/src/server/Request.test.ts +0 -255
- package/src/server/Request.ts +0 -155
- package/src/server/Response.test.ts +0 -32
- package/src/server/Response.ts +0 -45
- package/src/server/Transport.test.ts +0 -598
- package/src/server/Transport.ts +0 -320
- package/src/server/index.ts +0 -9
- package/src/server/internal/html/compose.main.gen.ts +0 -2
- package/src/server/internal/html/compose.main.ts +0 -88
- package/src/server/internal/html/config.ts +0 -672
- package/src/server/internal/html/constants.ts +0 -28
- package/src/server/internal/html/serviceWorker.client.ts +0 -28
- package/src/server/internal/html/serviceWorker.gen.ts +0 -2
- package/src/server/internal/html/serviceWorker.ts +0 -27
- package/src/server/internal/html/tsconfig.compose.json +0 -8
- package/src/server/internal/html/tsconfig.worker.client.json +0 -8
- package/src/server/internal/html/tsconfig.worker.json +0 -8
- package/src/server/internal/scope.ts +0 -43
- package/src/stripe/Charge.integration.test.ts +0 -329
- package/src/stripe/Methods.test.ts +0 -62
- package/src/stripe/Methods.ts +0 -44
- package/src/stripe/client/Charge.test.ts +0 -205
- package/src/stripe/client/Charge.ts +0 -132
- package/src/stripe/client/Methods.ts +0 -37
- package/src/stripe/client/index.ts +0 -2
- package/src/stripe/index.ts +0 -1
- package/src/stripe/internal/constants.ts +0 -7
- package/src/stripe/internal/types.ts +0 -47
- package/src/stripe/server/Charge.test-d.ts +0 -81
- package/src/stripe/server/Charge.test.ts +0 -700
- package/src/stripe/server/Charge.ts +0 -487
- package/src/stripe/server/Methods.test-d.ts +0 -157
- package/src/stripe/server/Methods.test.ts +0 -403
- package/src/stripe/server/Methods.ts +0 -441
- package/src/stripe/server/index.ts +0 -2
- package/src/stripe/server/internal/deposit-address.ts +0 -57
- package/src/stripe/server/internal/html/main.ts +0 -165
- package/src/stripe/server/internal/html/node_modules/.bin/mppx +0 -22
- package/src/stripe/server/internal/html/node_modules/.bin/mppx.src +0 -22
- package/src/stripe/server/internal/html/package.json +0 -9
- package/src/stripe/server/internal/html/stripe-js-pure.d.ts +0 -7
- package/src/stripe/server/internal/html/tsconfig.json +0 -8
- package/src/stripe/server/internal/html/types.ts +0 -5
- package/src/stripe/server/internal/html.gen.ts +0 -2
- package/src/stripe/server/internal/record-payment.ts +0 -66
- package/src/stripe/server/internal/request.ts +0 -49
- package/src/tap/Constants.ts +0 -32
- package/src/tap/Tap.test.ts +0 -125
- package/src/tap/Types.ts +0 -11
- package/src/tap/client/index.ts +0 -54
- package/src/tap/index.ts +0 -4
- package/src/tap/server/index.ts +0 -48
- package/src/tempo/AccessKeyAuthorization.test.ts +0 -141
- package/src/tempo/Attribution.test.ts +0 -294
- package/src/tempo/Attribution.ts +0 -185
- package/src/tempo/Methods.test.ts +0 -425
- package/src/tempo/Methods.ts +0 -367
- package/src/tempo/Proof.conformance.test.ts +0 -146
- package/src/tempo/Proof.test-d.ts +0 -32
- package/src/tempo/Proof.test.ts +0 -40
- package/src/tempo/Proof.ts +0 -69
- package/src/tempo/PublicExports.test-d.ts +0 -130
- package/src/tempo/Subscription.integration.test.ts +0 -591
- package/src/tempo/client/Charge.test.ts +0 -501
- package/src/tempo/client/Charge.ts +0 -271
- package/src/tempo/client/Methods.ts +0 -45
- package/src/tempo/client/ResolveAccount.ts +0 -46
- package/src/tempo/client/Subscription.test.ts +0 -180
- package/src/tempo/client/Subscription.ts +0 -156
- package/src/tempo/client/index.ts +0 -17
- package/src/tempo/index.ts +0 -5
- package/src/tempo/internal/account.ts +0 -56
- package/src/tempo/internal/address.test.ts +0 -42
- package/src/tempo/internal/address.ts +0 -6
- package/src/tempo/internal/auto-swap.test.ts +0 -198
- package/src/tempo/internal/auto-swap.ts +0 -145
- package/src/tempo/internal/charge.test.ts +0 -66
- package/src/tempo/internal/charge.ts +0 -43
- package/src/tempo/internal/defaults.test.ts +0 -95
- package/src/tempo/internal/defaults.ts +0 -53
- package/src/tempo/internal/fee-payer.test.ts +0 -1177
- package/src/tempo/internal/fee-payer.ts +0 -808
- package/src/tempo/internal/fee-token.test.ts +0 -165
- package/src/tempo/internal/fee-token.ts +0 -72
- package/src/tempo/internal/proof.test.ts +0 -97
- package/src/tempo/internal/proof.ts +0 -87
- package/src/tempo/internal/selectors.ts +0 -10
- package/src/tempo/internal/types.ts +0 -19
- package/src/tempo/legacy/AccessKeyAuthorization.test.ts +0 -162
- package/src/tempo/legacy/README.md +0 -9
- package/src/tempo/legacy/client/ChannelOps.test.ts +0 -379
- package/src/tempo/legacy/client/ChannelOps.ts +0 -271
- package/src/tempo/legacy/client/Session.test.ts +0 -800
- package/src/tempo/legacy/client/Session.ts +0 -397
- package/src/tempo/legacy/client/SessionManager.test.ts +0 -468
- package/src/tempo/legacy/client/SessionManager.ts +0 -909
- package/src/tempo/legacy/client/index.ts +0 -6
- package/src/tempo/legacy/index.ts +0 -4
- package/src/tempo/legacy/session/Chain.test.ts +0 -1349
- package/src/tempo/legacy/session/Chain.ts +0 -830
- package/src/tempo/legacy/session/Channel.test.ts +0 -109
- package/src/tempo/legacy/session/Channel.ts +0 -51
- package/src/tempo/legacy/session/Types.ts +0 -91
- package/src/tempo/legacy/session/Voucher.test.ts +0 -410
- package/src/tempo/legacy/session/Voucher.ts +0 -183
- package/src/tempo/legacy/session/escrow.abi.ts +0 -760
- package/src/tempo/legacy/session/index.ts +0 -8
- package/src/tempo/server/AtomicStore.test-d.ts +0 -63
- package/src/tempo/server/Charge.test.ts +0 -6056
- package/src/tempo/server/Charge.ts +0 -1379
- package/src/tempo/server/Methods.ts +0 -86
- package/src/tempo/server/Relay.test.ts +0 -677
- package/src/tempo/server/Relay.ts +0 -297
- package/src/tempo/server/SponsorBudget.test.ts +0 -154
- package/src/tempo/server/SponsorBudget.ts +0 -219
- package/src/tempo/server/Sse.test.ts +0 -321
- package/src/tempo/server/Subscription.test.ts +0 -1944
- package/src/tempo/server/Subscription.ts +0 -1336
- package/src/tempo/server/index.ts +0 -12
- package/src/tempo/server/internal/html/main.ts +0 -115
- package/src/tempo/server/internal/html/node_modules/.bin/mppx +0 -22
- package/src/tempo/server/internal/html/node_modules/.bin/mppx.src +0 -22
- package/src/tempo/server/internal/html/package.json +0 -10
- package/src/tempo/server/internal/html/tsconfig.json +0 -8
- package/src/tempo/server/internal/html.gen.ts +0 -2
- package/src/tempo/server/internal/request-body.test.ts +0 -210
- package/src/tempo/server/internal/request-body.ts +0 -61
- package/src/tempo/server/internal/transport.test.ts +0 -922
- package/src/tempo/server/internal/transport.ts +0 -322
- package/src/tempo/session/README.md +0 -320
- package/src/tempo/session/Snapshot.test.ts +0 -41
- package/src/tempo/session/Snapshot.ts +0 -95
- package/src/tempo/session/client/ChannelOps.test.ts +0 -218
- package/src/tempo/session/client/ChannelOps.ts +0 -348
- package/src/tempo/session/client/ChannelStore.ts +0 -111
- package/src/tempo/session/client/CredentialState.test.ts +0 -789
- package/src/tempo/session/client/CredentialState.ts +0 -942
- package/src/tempo/session/client/ReceiptCoordinator.ts +0 -95
- package/src/tempo/session/client/Runtime.test.ts +0 -1104
- package/src/tempo/session/client/Runtime.ts +0 -1008
- package/src/tempo/session/client/Session.test.ts +0 -1355
- package/src/tempo/session/client/Session.ts +0 -420
- package/src/tempo/session/client/SessionManager.test.ts +0 -1899
- package/src/tempo/session/client/SessionManager.ts +0 -996
- package/src/tempo/session/client/Transports.test.ts +0 -1141
- package/src/tempo/session/client/Transports.ts +0 -1534
- package/src/tempo/session/client/index.ts +0 -40
- package/src/tempo/session/client/internal/SessionManager.ts +0 -36
- package/src/tempo/session/index.ts +0 -7
- package/src/tempo/session/precompile/Chain.integration.test.ts +0 -339
- package/src/tempo/session/precompile/Chain.test.ts +0 -1641
- package/src/tempo/session/precompile/Chain.ts +0 -1269
- package/src/tempo/session/precompile/Channel.test.ts +0 -147
- package/src/tempo/session/precompile/Channel.ts +0 -108
- package/src/tempo/session/precompile/Protocol.test.ts +0 -358
- package/src/tempo/session/precompile/Protocol.ts +0 -520
- package/src/tempo/session/precompile/Voucher.test.ts +0 -354
- package/src/tempo/session/precompile/Voucher.ts +0 -162
- package/src/tempo/session/precompile/escrow.abi.ts +0 -226
- package/src/tempo/session/precompile/index.ts +0 -33
- package/src/tempo/session/server/ChannelOps.test.ts +0 -129
- package/src/tempo/session/server/ChannelOps.ts +0 -157
- package/src/tempo/session/server/ChannelStore.test.ts +0 -1093
- package/src/tempo/session/server/ChannelStore.ts +0 -856
- package/src/tempo/session/server/CredentialVerification.test.ts +0 -299
- package/src/tempo/session/server/CredentialVerification.ts +0 -1087
- package/src/tempo/session/server/MeteredStream.ts +0 -99
- package/src/tempo/session/server/RequestState.test.ts +0 -574
- package/src/tempo/session/server/RequestState.ts +0 -507
- package/src/tempo/session/server/Session.integration.test.ts +0 -449
- package/src/tempo/session/server/Session.test.ts +0 -4247
- package/src/tempo/session/server/Session.ts +0 -669
- package/src/tempo/session/server/Settlement.test.ts +0 -345
- package/src/tempo/session/server/Settlement.ts +0 -527
- package/src/tempo/session/server/Sse.fuzz.test.ts +0 -138
- package/src/tempo/session/server/Sse.test.ts +0 -634
- package/src/tempo/session/server/Sse.ts +0 -261
- package/src/tempo/session/server/Transports.test.ts +0 -346
- package/src/tempo/session/server/Transports.ts +0 -256
- package/src/tempo/session/server/Ws.test.ts +0 -765
- package/src/tempo/session/server/Ws.ts +0 -391
- package/src/tempo/session/server/index.ts +0 -12
- package/src/tempo/subscription/KeyAuthorization.test.ts +0 -282
- package/src/tempo/subscription/KeyAuthorization.ts +0 -396
- package/src/tempo/subscription/Receipt.ts +0 -28
- package/src/tempo/subscription/Store.test.ts +0 -609
- package/src/tempo/subscription/Store.ts +0 -449
- package/src/tempo/subscription/Types.ts +0 -68
- package/src/tempo/subscription/index.ts +0 -23
- package/src/tsconfig.json +0 -10
- package/src/validation/core.ts +0 -386
- package/src/validation/index.ts +0 -11
- package/src/viem/Account.test.ts +0 -72
- package/src/viem/Account.ts +0 -30
- package/src/viem/Client.test.ts +0 -366
- package/src/viem/Client.ts +0 -93
- package/src/web-bot-auth/Constants.ts +0 -24
- package/src/web-bot-auth/Types.ts +0 -9
- package/src/web-bot-auth/WebBotAuth.test.ts +0 -182
- package/src/web-bot-auth/client/index.ts +0 -84
- package/src/web-bot-auth/index.ts +0 -6
- package/src/web-bot-auth/internal/JwkThumbprint.ts +0 -21
- package/src/web-bot-auth/internal/SignatureAgent.ts +0 -18
- package/src/web-bot-auth/server/index.ts +0 -113
- package/src/x402/Assets.test.ts +0 -253
- package/src/x402/Assets.ts +0 -221
- package/src/x402/Exact.e2e.test.ts +0 -488
- package/src/x402/Exact.localnet.test.ts +0 -475
- package/src/x402/Header.test.ts +0 -73
- package/src/x402/Header.ts +0 -79
- package/src/x402/PublicInterface.test-d.ts +0 -39
- package/src/x402/Types.ts +0 -248
- package/src/x402/client/Exact.test.ts +0 -309
- package/src/x402/client/Exact.ts +0 -186
- package/src/x402/index.ts +0 -6
- package/src/x402/internal/ChallengeBrand.ts +0 -14
- package/src/x402/internal/RouteBinding.ts +0 -18
- package/src/x402/server/EvmCharge.ts +0 -410
- package/src/x402/server/Facilitator.test.ts +0 -111
- package/src/x402/server/Facilitator.ts +0 -56
- package/src/zod.test.ts +0 -169
- package/src/zod.ts +0 -71
|
@@ -1,5 +1,19 @@
|
|
|
1
|
-
export { evm } from './evm.js';
|
|
2
|
-
export { createPlugin } from './plugin.js';
|
|
3
|
-
|
|
4
|
-
|
|
5
|
-
|
|
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,parseAbi as d,parseUnits as f,zeroAddress as p}from"viem";import{call as m,prepareTransactionRequest as h,readContract as g,sendCallsSync as _,sendTransactionSync as v,signTransaction as y,signTypedData as b}from"viem/actions";import*as x from"viem/chains";import{tempo as S}from"viem/chains";import{AbiParameters as C,Base64 as w,Bytes as T,Hash as E,Hex as D,Json as O,Signature as k}from"ox";import{z as A}from"zod/mini";import*as j from"node:child_process";import*as M from"node:fs";import*as N from"node:os";import*as P from"node:path";import{z as F}from"zod";import"node:readline";import{tempo as I,tempoModerato as ee}from"viem/tempo/chains";import{Abis as te,Account as ne,Actions as L,Addresses 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 R,SignatureEnvelope as z,TempoAddress as ue,TxEnvelopeTempo as de}from"ox/tempo";var fe=Object.defineProperty,pe=Object.getOwnPropertyDescriptor,me=Object.getOwnPropertyNames,he=Object.prototype.hasOwnProperty,ge=(e,t)=>{let n={};for(var r in e)fe(n,r,{get:e[r],enumerable:!0});return t||fe(n,Symbol.toStringTag,{value:`Module`}),n},_e=(e,t,n,r)=>{if(t&&typeof t==`object`||typeof t==`function`)for(var i=me(t),a=0,o=i.length,s;a<o;a++)s=i[a],!he.call(e,s)&&s!==n&&fe(e,s,{get:(e=>t[e]).bind(null,s),enumerable:!(r=pe(t,s))||r.enumerable});return e},ve=(e,t,n)=>(_e(e,t,`default`),n&&_e(n,t,`default`));const ye=Symbol(`mppx.x402.asset`);function be(e){return{[ye]:!0,address:e.address,decimals:e.decimals,network:e.network,transfer:e.transfer}}function xe(e,t){let n=e(t.chainId);return be({address:n.address,decimals:n.decimals,network:je(t.chainId),transfer:Ne(t.transfer,n)})}const Se={USDC:be({address:`0x833589fCD6eDb6E08f4c7C32D4f71b54bdA02913`,decimals:6,network:`eip155:8453`,transfer:{name:`USD Coin`,type:`eip3009`,version:`2`}})},Ce={USDC:be({address:`0x036CbD53842c5426634e7929541eC2318f3dCF7e`,decimals:6,network:`eip155:84532`,transfer:{name:`USDC`,type:`eip3009`,version:`2`}})},we={USDC:be({address:`0xcebA9300f2b948710d2653dD7B07f33A8B32118C`,decimals:6,network:`eip155:42220`,transfer:{name:`USDC`,type:`eip3009`,version:`2`}}),USDT:be({address:`0x48065fbBE25f71C9282ddf5e1cD6D6A887483D5e`,decimals:6,network:`eip155:42220`,transfer:{name:`Tether USD`,type:`eip3009`,version:`1`}})},Te={USDC:be({address:`0x01C5C0122039549AD1493B8220cABEdD739BC44E`,decimals:6,network:`eip155:11142220`,transfer:{name:`USDC`,type:`eip3009`,version:`2`}})};function Ee(e){return typeof e!=`object`||!e?!1:e[ye]===!0}function De(e){return typeof e==`function`&&typeof e.addresses==`object`&&typeof e.decimals==`number`}function Oe(e){return typeof e==`string`}function ke(e,t){if(Ee(e))return e.network===t?{address:e.address,decimals:e.decimals,transfer:e.transfer}:void 0;if(De(e)){let n=e.addresses[Me(t)];return n?{address:n,decimals:e.decimals,name:e.name}:void 0}return{address:e}}function Ae(e,t,n){let r=ke(e,n);return r?o(r.address)===o(t):!1}function je(e){return`eip155:${e}`}function Me(e){return Number(e.slice(7))}function Ne(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 Pe=ge({base:()=>Se,baseSepolia:()=>Ce,celo:()=>we,celoSepolia:()=>Te,define:()=>be,fromToken:()=>xe,isAsset:()=>Ee,isRawAddress:()=>Oe,isToken:()=>De,matches:()=>Ae,resolve:()=>ke,toChainId:()=>Me,toNetwork:()=>je}),Fe=ge({base:()=>Ie,baseSepolia:()=>Le,celo:()=>Re,celoSepolia:()=>ze});const Ie=8453,Le=84532,Re=42220,ze=11142220,B={acceptPayment:`Accept-Payment`,authorization:`Authorization`,paymentReceipt:`Payment-Receipt`,paymentSession:`Payment-Session`,paymentSessionSnapshot:`Payment-Session-Snapshot`,wwwAuthenticate:`WWW-Authenticate`},Be={payment:`Payment`},Ve={evm:`evm`,stripe:`stripe`,tempo:`tempo`},He={charge:`charge`,session:`session`,subscription:`subscription`},Ue={sessionProtocol:`sessionProtocol`,sessionSnapshot:`sessionSnapshot`},We={v1:`v1`,v2:`v2`};function Ge(e,t){if(!(!e||typeof e!=`object`))return e[t]}function Ke(e){let t=w.toString(e);return JSON.parse(t)}function V(e){let t=O.canonicalize(e);return w.fromString(t,{pad:!1,url:!0})}var H=ge({address:()=>W,amount:()=>U,datetime:()=>Je,datetimeInput:()=>Ye,hash:()=>G,period:()=>Qe,signature:()=>K,toDate:()=>Xe,toDatetimeString:()=>Ze,unwrapOptional:()=>$e});import*as qe from"zod/mini";ve(H,qe);function U(){return A.string().check(A.regex(/^\d+(\.\d+)?$/,`Invalid amount`))}function Je(){return A.string().check(A.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 Ye(e=`Invalid ISO 8601 datetime`){return A.pipe(A.union([Je(),A.custom(e=>e instanceof Date)]),A.transform(Xe)).check(A.refine(e=>Number.isFinite(e.getTime()),e))}function Xe(e){return e instanceof Date?e:new Date(e)}function Ze(e){return e instanceof Date?Number.isFinite(e.getTime())?e.toISOString():`Invalid Date`:e}function W(){return A.string().check(A.regex(/^0x[0-9a-fA-F]{40}$/,`Invalid address`))}function G(){return A.string().check(A.regex(/^0x[0-9a-fA-F]{64}$/,`Invalid hash`))}function Qe(){return A.string().check(A.regex(/^(day|week|month|year|\d+)$/,`Invalid period`))}function K(){return A.string().check(A.regex(/^0x[0-9a-fA-F]+$/,`Invalid signature`))}function $e(e){return e._zod.def.type===`optional`?e._zod.def.innerType:e}const et=H.object({description:H.optional(H.string()),digest:H.optional(H.string().check(H.regex(/^sha-256=/,`Invalid digest format`))),expires:H.optional(Je()),id:H.string().check(H.minLength(1)),intent:H.string(),method:H.string(),meta:H.optional(H.record(H.string(),H.string())),opaque:H.optional(H.string()),realm:H.string(),request:H.record(H.string(),H.unknown())});function tt(e,t){let{description:n,digest:r,meta:i,method:a,intent:o,realm:s,request:c,secretKey:l}=e,u=e.expires?Ze(e.expires):void 0,d=e.opaque??(i===void 0?void 0:V(i)),f=l?mt({...e,expires:u,...i!==void 0&&{meta:i},opaque:d},{secretKey:l}):e.id;return et.parse({id:f,realm:s,method:a,intent:o,request:c,...n&&{description:n},...r&&{digest:r},...u&&{expires:u},...i!==void 0&&{meta:i},...d!==void 0&&{opaque:d}})}function nt(e){let t=[q(`id`,e.id),q(`realm`,e.realm),q(`method`,e.method),q(`intent`,e.intent),q(`request`,V(e.request))];return e.description!==void 0&&t.push(q(`description`,e.description)),e.digest!==void 0&&t.push(q(`digest`,e.digest)),e.expires!==void 0&&t.push(q(`expires`,e.expires)),e.opaque===void 0?e.meta!==void 0&&t.push(q(`opaque`,V(e.meta))):t.push(q(`opaque`,e.opaque)),`${Be.payment} ${t.join(`, `)}`}function q(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 rt(e,t){let n=it(e);if(!n)throw Error(`Missing Payment scheme.`);let{request:r,opaque:i,...a}=at(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 tt({...a,request:Ke(r),...i&&{opaque:i}},t)}function it(e){let t=Be.payment,[n]=lt(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 at(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]=ot(e,n);if(n=o,i in t)throw Error(`Duplicate parameter: ${i}`);t[i]=a}return t}function ot(e,t){if(e[t]===`"`)return st(e,t+1);let n=t;for(;n<e.length&&e[n]!==`,`;)n++;return[e.slice(t,n).trim(),n]}function st(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 ct(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 lt(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(!ct(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 ut(e,t){if(e.status!==402)throw Error(`Response status is not 402.`);return dt(e.headers,t)}function dt(e,t){let n=e.get(B.wwwAuthenticate);if(!n)throw Error(`Missing ${B.wwwAuthenticate} header.`);return ft(n,t)}function ft(e,t){let n=lt(e,Be.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 rt(e.slice(r,a).replace(/,\s*$/,``),t)})}function pt(e){return[e.realm,e.method,e.intent,V(e.request),e.expires??``,e.digest??``,e.opaque??(e.meta?V(e.meta):``)].join(`|`)}function mt(e,t){let n=pt(e),r=T.fromString(t.secretKey),i=T.fromString(n),a=E.hmac256(r,i,{as:`Bytes`});return w.fromBytes(a,{url:!0,pad:!1})}var ht=class extends Error{name=`MissingPaymentSchemeError`;constructor(){super(`Missing Payment scheme.`)}},gt=class extends Error{name=`InvalidCredentialEncodingError`;constructor(){super(`Invalid base64url or JSON.`)}};function _t(e){let t=e.match(RegExp(`^${Be.payment}\\s+(.+)$`,`i`));if(!t?.[1])throw new ht;try{let e=w.toString(t[1]),n=JSON.parse(e),{opaque:r,request:i,meta:a,...o}=n.challenge,{meta:s,opaque:c}=vt(r);return{challenge:et.parse({...o,...s!==void 0&&{meta:s},...c!==void 0&&{opaque:c},request:Ke(i)}),payload:n.payload,...n.source&&{source:n.source}}}catch{throw new gt}}function vt(e){if(e===void 0)return{};if(typeof e==`string`)return{opaque:e};if(!yt(e))throw Error(`Invalid opaque.`);return{meta:e,opaque:V(e)}}function yt(e){return typeof e!=`object`||!e||Array.isArray(e)?!1:Object.values(e).every(e=>typeof e==`string`)}function bt(e){let{challenge:t,payload:n,source:r}=e;return{challenge:t,payload:n,...r&&{source:r}}}function xt(e){let{meta:t,opaque:n,request:r,...i}=e.challenge,a=n??(t===void 0?void 0:V(t)),o={challenge:{...i,...a!==void 0&&{opaque:a},request:V(r)},payload:e.payload,...e.source&&{source:e.source}},s=JSON.stringify(o),c=w.fromString(s,{pad:!1,url:!0});return`${Be.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}.`)}},J=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 w.fromString(JSON.stringify(e.parse(t)))},decode(t){try{return e.parse(JSON.parse(w.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=H.string().check(H.minLength(1)),Pt=H.number().check(H.refine(e=>e>0,`Must be positive`)),Ft=H.string().check(H.regex(/^\d+$/,`Invalid atomic amount`)),It=W(),Lt=H.string().check(H.regex(RegExp(`^eip155:\\d+$`),`Invalid EVM CAIP-2 network`)),Rt=H.object({description:H.optional(H.string()),iconUrl:H.optional(H.string()),mimeType:H.optional(H.string()),serviceName:H.optional(H.string()),tags:H.optional(H.array(H.string())),url:Nt});H.discriminatedUnion(`type`,[H.object({name:Nt,type:H.literal(`eip3009`),version:Nt}),H.object({name:H.optional(H.string()),type:H.literal(`permit2`),version:H.optional(H.string())})]);const zt=H.object({amount:Ft,asset:Nt,extra:H.optional(H.record(H.string(),H.unknown())),maxTimeoutSeconds:Pt,network:Lt,payTo:Nt,scheme:H.enum(At)}),Bt=H.object({info:H.record(H.string(),H.unknown()),schema:H.record(H.string(),H.unknown())}),Vt=H.record(H.string(),Bt),Ht=H.object({accepts:H.array(zt).check(H.minLength(1)),error:H.optional(H.string()),extensions:H.optional(Vt),resource:Rt,x402Version:H.literal(2)}),Ut=H.object({authorization:H.object({from:It,nonce:G(),to:It,validAfter:Ft,validBefore:Ft,value:Ft}),signature:K()}),Wt=H.object({permit2Authorization:H.object({deadline:Ft,from:It,nonce:Ft,permitted:H.object({amount:Ft,token:It}),spender:It,witness:H.object({to:It,validAfter:Ft})}),signature:K()}),Gt=H.union([Ut,Wt]),Kt=H.object({accepted:zt,extensions:H.optional(Vt),payload:Gt,resource:H.optional(Rt),x402Version:H.literal(2)});H.object({extensions:H.optional(Vt),extra:H.optional(H.record(H.string(),H.unknown())),invalidMessage:H.optional(H.string()),invalidReason:H.optional(H.string()),isValid:H.boolean(),payer:H.optional(H.string())});const qt=H.object({amount:H.optional(Ft),errorMessage:H.optional(H.string()),errorReason:H.optional(H.string()),extensions:H.optional(Vt),extra:H.optional(H.record(H.string(),H.unknown())),network:Nt,payer:H.optional(H.string()),success:H.boolean(),transaction:H.string()});function Jt(e){let{extensions:t,resource:n,...r}=e;return zt.parse(r)}const Yt=Ot(Ht),Xt=Ot(Kt),Zt=Ot(qt);Yt.encode,Yt.decode;function Qt(e){try{let t=JSON.parse(w.toString(e));return en(t)}catch{throw new kt}}const $t=Xt.encode;Xt.decode,Zt.encode,Zt.decode;const en=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=Rt.parse(t.resource),r=t.extensions===void 0?void 0:Vt.safeParse(t.extensions).data;return{accepts:t.accepts,...r?{extensions:r}:{},resource:n,x402Version:2}};function tn(e){let t=[V(e.accepted),V(e.resource),V(e.extensions)].join(`|`);return E.sha256(T.fromString(t),{as:`Hex`})}async function nn(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=Jt(n);if(sn(e.config,r),!n.resource)throw Error(`x402 exact EIP-3009 requires resource information.`);let i=n.extensions?.mppx?ln(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?tn({accepted:r,extensions:i,resource:n.resource}):dn(),to:o(r.payTo),validAfter:(l-600).toString(),validBefore:(l+r.maxTimeoutSeconds).toString(),value:r.amount},d=await t.signTypedData({domain:{chainId:on(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:an});return $t({accepted:r,...i?{extensions:i}:{},payload:{authorization:u,signature:d},...n.resource?{resource:n.resource}:{},x402Version:2})}function rn(e){let t=e.challenge.request,n;try{n=Jt(t),sn(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 an={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 on(e){return Number(e.slice(7))}function sn(e,t){let n=on(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=>Oe(e))&&!e.networks?.length)throw Error(`x402 exact raw currency allowlists require networks.`);if(r){let e=o(t.asset);if(!r.some(n=>Ae(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=cn(e,t);if(n===void 0)throw Error(`x402 exact maxAmount requires currency decimals.`);if(BigInt(t.amount)>f(e.maxAmount,n))throw Error(`x402 exact amount exceeds maxAmount.`)}}function cn(e,t){let n=e.currencies??e.assets,r=o(t.asset),i=n?.find(e=>Ae(e,r,t.network)),a=i?ke(i,t.network):void 0;return a?.decimals===void 0?e.decimals:a.decimals}function ln(e){let t=e.mppx;return t?{...e,mppx:{...t,info:{...t.info,nonce:un()}}}:e}function un(){return fn().slice(2)}function dn(){return fn()}function fn(){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 pn=Symbol.for(`mppx.x402.challenge`);function mn(e){return Object.defineProperty(e,pn,{value:!0}),e}function hn(e){return!!e?.[pn]}const gn=[`authorization`],_n=H.string().check(H.regex(/^\d+$/,`Invalid atomic amount`));H.object({name:H.string().check(H.minLength(1)),version:H.string().check(H.minLength(1))});const vn=H.object({chainId:H.number(),credentialTypes:H.optional(H.array(H.enum(gn)).check(H.minLength(1))),decimals:H.optional(H.number()),permit2Address:H.optional(W()),splits:H.optional(H.array(H.object({amount:_n,recipient:W()})))});H.object({amount:_n,currency:W(),description:H.optional(H.string()),externalId:H.optional(H.string()),methodDetails:vn,recipient:W()});const yn=H.object({amount:U(),chainId:H.number(),currency:W(),credentialTypes:H.optional(H.array(H.enum(gn)).check(H.minLength(1))),decimals:H.number(),description:H.optional(H.string()),externalId:H.optional(H.string()),permit2Address:H.optional(W()),recipient:W(),splits:H.optional(H.array(H.object({amount:_n,recipient:W()})))}),bn=H.object({from:W(),nonce:G(),signature:K(),to:W(),type:H.literal(`authorization`),validAfter:_n,validBefore:_n,value:_n}),xn={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{chainId:e.chainId,name:e.authorization.name,verifyingContract:e.currency,version:e.authorization.version}}function Cn(e){return E.keccak256(T.fromString(`${e.id}${e.realm}`),{as:`Hex`})}function wn(e){return`eip155:${e}`}function Tn(e){return`did:pkh:eip155:${e.chainId}:${e.address}`}const En=Et({name:`evm`,intent:`charge`,schema:{credential:{payload:bn},request:H.pipe(yn,H.transform(({amount:e,chainId:t,credentialTypes:n=[`authorization`],currency:r,decimals:i,permit2Address:a,recipient:s,splits:c,...l})=>({...l,amount:f(e,i).toString(),currency:o(r),methodDetails:{chainId:t,credentialTypes:n,decimals:i,...a?{permit2Address:o(a)}:{},...c?{splits:c}:{}},recipient:o(s)})))}});function Dn(e){return Dt(En,{canHandleChallenge({challenge:t}){return!On(t)||rn({challenge:t,config:e})},context:H.object({account:H.optional(H.custom())}),async createCredential({challenge:t,context:n}){if(On(t))return nn({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(kn(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=An(e,i),s=t.expires?Math.floor(new Date(t.expires).getTime()/1e3).toString():(Math.floor(Date.now()/1e3)+300).toString();return xt(bt({challenge:t,payload:{from:o(r.address),nonce:Cn(t),signature:await r.signTypedData({domain:Sn({authorization:a,chainId:i.methodDetails.chainId,currency:i.currency}),message:{from:o(r.address),nonce:Cn(t),to:o(i.recipient),validAfter:0n,validBefore:BigInt(s),value:BigInt(i.amount)},primaryType:`TransferWithAuthorization`,types:xn}),to:o(i.recipient),type:`authorization`,validAfter:`0`,validBefore:s,value:i.amount},source:Tn({address:o(r.address),chainId:i.methodDetails.chainId})}))}})}function On(e){return hn(e)&&e.request.scheme===`exact`&&typeof e.request.network==`string`}function kn(e,t){let n=t.methodDetails.chainId,r=wn(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=>Oe(e))&&!e.networks?.length)throw Error(`EVM raw currency allowlists require networks.`);if(i){let e=o(t.currency);if(!i.some(t=>Ae(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=jn(e,t);if(n===void 0)throw Error(`EVM charge maxAmount requires currency decimals.`);if(BigInt(t.amount)>f(e.maxAmount,n))throw Error(`EVM charge amount exceeds maxAmount.`)}}function An(e,t){let n=e.currencies??e.assets,r=o(t.currency),i=wn(t.methodDetails.chainId),a=n?.find(e=>Ae(e,r,i)),s=a?ke(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 jn(e,t){let n=e.currencies??e.assets,r=o(t.currency),i=wn(t.methodDetails.chainId),a=n?.find(e=>Ae(e,r,i)),s=a?ke(a,i):void 0;return s?.decimals===void 0?e.decimals:s.decimals}function Mn(e){return[Mn.charge(e)]}(function(e){e.charge=Dn,e.assets=Pe,e.chains=Fe})(Mn||={});var Nn=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)}},Pn=class extends Nn{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 Y={mainnet:4217,testnet:42431},In={usdc:`0x20C000000000000000000000b9537d11c60E8b50`,pathUsd:`0x20c0000000000000000000000000000000000000`};Y.mainnet,In.usdc,Y.testnet,In.pathUsd;const Ln={[Y.mainnet]:{swap:`0xd588ED9Ae08643A450157Adaf61c3C0C1BBd0dbb`,token:`0x20c0000000000000000000006637932dE5413804`},[Y.testnet]:{swap:`0xd588ED9Ae08643A450157Adaf61c3C0C1BBd0dbb`,token:`0x20c0000000000000000000006637932dE5413804`}},Rn={[Y.mainnet]:`0x33b901018174DDabE4841042ab76ba85D4e24f25`,[Y.testnet]:`0xe1c4d3dce17bc111181ddf716f75bae49e61a336`},zn={[Y.mainnet]:`https://rpc.tempo.xyz`,[Y.testnet]:`https://rpc.moderato.tempo.xyz`},X=(()=>{let e=process||{},t=e.argv||[],n=e.env||{},r=!(n.NO_COLOR||t.includes(`--no-color`))&&(!!n.FORCE_COLOR||t.includes(`--color`)||(e.stdout||{}).isTTY&&n.TERM!==`dumb`||!!n.CI),i=(e,t,n,r)=>{let i=``,a=0,o=r;do i+=e.substring(a,o)+n,a=o+t.length,o=e.indexOf(t,a);while(~o);return i+e.substring(a)},a=r?(e,t,n=e)=>r=>{let a=`${r}`,o=a.indexOf(t,e.length);return~o?e+i(a,t,n,o)+t:e+a+t}:()=>String;return{isColorSupported:r,reset:a(`\x1B[0m`,`\x1B[0m`),bold:a(`\x1B[1m`,`\x1B[22m`,`\x1B[22m\x1B[1m`),dim:a(`\x1B[2m`,`\x1B[22m`,`\x1B[22m\x1B[2m`),italic:a(`\x1B[3m`,`\x1B[23m`),underline:a(`\x1B[4m`,`\x1B[24m`),inverse:a(`\x1B[7m`,`\x1B[27m`),hidden:a(`\x1B[8m`,`\x1B[28m`),strikethrough:a(`\x1B[9m`,`\x1B[29m`),black:a(`\x1B[30m`,`\x1B[39m`),red:a(`\x1B[31m`,`\x1B[39m`),green:a(`\x1B[32m`,`\x1B[39m`),yellow:a(`\x1B[33m`,`\x1B[39m`),blue:a(`\x1B[34m`,`\x1B[39m`),magenta:a(`\x1B[35m`,`\x1B[39m`),cyan:a(`\x1B[36m`,`\x1B[39m`),white:a(`\x1B[37m`,`\x1B[39m`),gray:a(`\x1B[90m`,`\x1B[39m`),bgBlack:a(`\x1B[40m`,`\x1B[49m`),bgRed:a(`\x1B[41m`,`\x1B[49m`),bgGreen:a(`\x1B[42m`,`\x1B[49m`),bgYellow:a(`\x1B[43m`,`\x1B[49m`),bgBlue:a(`\x1B[44m`,`\x1B[49m`),bgMagenta:a(`\x1B[45m`,`\x1B[49m`),bgCyan:a(`\x1B[46m`,`\x1B[49m`),bgWhite:a(`\x1B[47m`,`\x1B[49m`),blackBright:a(`\x1B[90m`,`\x1B[39m`),redBright:a(`\x1B[91m`,`\x1B[39m`),greenBright:a(`\x1B[92m`,`\x1B[39m`),yellowBright:a(`\x1B[93m`,`\x1B[39m`),blueBright:a(`\x1B[94m`,`\x1B[39m`),magentaBright:a(`\x1B[95m`,`\x1B[39m`),cyanBright:a(`\x1B[96m`,`\x1B[39m`),whiteBright:a(`\x1B[97m`,`\x1B[39m`),bgBlackBright:a(`\x1B[100m`,`\x1B[49m`),bgRedBright:a(`\x1B[101m`,`\x1B[49m`),bgGreenBright:a(`\x1B[102m`,`\x1B[49m`),bgYellowBright:a(`\x1B[103m`,`\x1B[49m`),bgBlueBright:a(`\x1B[104m`,`\x1B[49m`),bgMagentaBright:a(`\x1B[105m`,`\x1B[49m`),bgCyanBright:a(`\x1B[106m`,`\x1B[49m`),bgWhiteBright:a(`\x1B[107m`,`\x1B[49m`),link(e,t,n){return r?`\x1b]8;;${e}\x07${n?t:X.underline(t)}\x1b]8;;\x07`:t}}})();function Bn(e,t){return X.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?X.dim(X.link(`${r.explorerUrl}/token/${r.token}`,t,!0)):X.dim(t);return`${a?`${o}.${a}`:o} ${s}`}const Un={mainnet:zn[Y.mainnet],testnet:zn[Y.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 I;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!==I.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 Pn({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=>{j.execFile(e,t,{timeout:Yn()},(e,t,r)=>{n({stdout:t.trim(),stderr:r.trim(),error:e})})})}function er(){let e=P.join(process.env.XDG_CONFIG_HOME||P.join(N.homedir(),`.config`),`mppx`,`default`);return{get(){try{return M.readFileSync(e,`utf-8`).trim()||`main`}catch{return`main`}},set(t){M.mkdirSync(P.dirname(e),{recursive:!0}),M.writeFileSync(e,t,`utf-8`)},clear(){try{M.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=N.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=N.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=N.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=j.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=N.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(Se),...Object.values(Ce),...Object.values(we),...Object.values(Te)],d=s??``;if(o&&s)try{let t=e({chain:o,transport:c()}),n=await g(t,{address:s,abi:i,functionName:`symbol`});n&&(d=n)}catch{}return{tokenSymbol:d,tokenDecimals:r?.decimals??6,explorerUrl:o?.blockExplorers?.default?.url,methods:[...Mn({account:l,currencies:u})]}}})}function sr(e){return Object.values(x).find(t=>t.id===e)}const cr=Et({name:`stripe`,intent:`charge`,schema:{credential:{payload:H.object({externalId:H.optional(H.string()),spt:H.string()})},request:H.pipe(H.object({amount:U(),currency:H.string(),decimals:H.number(),description:H.optional(H.string()),externalId:H.optional(H.string()),metadata:H.optional(H.record(H.string(),H.string())),networkId:H.string(),paymentMethodTypes:H.array(H.string()).check(H.minLength(1)),recipient:H.optional(H.string())}),H.transform(({amount:e,decimals:t,metadata:n,networkId:r,paymentMethodTypes:i,...a})=>({...a,amount:f(e,t).toString(),methodDetails:{networkId:r,paymentMethodTypes:i,...n!==void 0&&{metadata:n}}})))}});function lr(e){let{client:t,createToken:n,externalId:r,paymentMethod:i}=e;return Dt(cr,{context:H.object({paymentMethod:H.optional(H.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 xt({challenge:e,payload:{spt:p,...m===void 0?{}:{externalId:m}}})}})}function ur(e){return[lr(e)]}(function(e){e.charge=lr})(ur||={});function dr(){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=pr(F.object({paymentMethod:F.string(),secretKey:F.string().optional()}),t,[`paymentMethod`,`secretKey`]),a=i.secretKey??process.env.MPPX_STRIPE_SECRET_KEY;if(!a)throw new Pn({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:[ur.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=fr(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 Pn({code:`STRIPE_ERROR`,message:`Failed to create SPT: ${(await d.json()).error.message}`,exitCode:77})}else throw new Pn({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&&fr(e)?`/test`:``}/payments/${t}`;return X.link(n,t,!0)}}})}function fr(e){return e.startsWith(`sk_test_`)||e.startsWith(`rk_test_`)}function pr(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 mr(e){let t={};for(let n of e){let e=t[n.name]??={};e[n.intent]=yr(n)}return t}function hr(e,t){let n=mr(e),r=Er(e,n,t),i=e.map((e,t)=>({intent:e.intent,method:e.name,q:r[yr(e)]??1,index:t}));return{definition:r,entries:i,header:_r(i),keys:n}}function gr(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)=>wr(e,t))}function _r(e){return e.map(({method:e,intent:t,q:n})=>{let r=`${e}/${t}`;return n===1?r:`${r};q=${Ar(n)}`}).join(`, `)}function vr(e,t,n){let r=new Map;for(let e of t){let t=yr(e),n=r.get(t);n?n.push(e):r.set(t,[e])}return e.flatMap((e,t)=>{let i=r.get(yr(e));if(!i)return[];let a=br(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)=>Cr(e.challenge)-Cr(t.challenge)||t.match.q-e.match.q||e.index-t.index).map(e=>{let{match:t,...n}=e;return n})}function yr(e){let t=e.method??e.name;if(!t)throw Error(`Missing payment method name.`);return`${t}/${e.intent}`}function br(e,t){let n;for(let r of t){if(!xr(e,r))continue;let t={...r,specificity:Sr(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 xr(e,t){return(t.method===`*`||t.method===e.method)&&(t.intent===`*`||t.intent===e.intent)}function Sr(e){return Number(e.method!==`*`)+Number(e.intent!==`*`)}function Cr(e){return+!!hn(e)}function wr(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}`);jr(r,`method`),jr(i,`intent`);let a=1;for(let t of Tr(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=Or(i,`Accept-Payment entry "${e}"`))}return{intent:i,method:r,q:a,index:t}}function Tr(e){return e?e.split(/\s*;\s*/).filter(Boolean):[]}function Er(e,t,n){if(!n)return{};let r=typeof n==`function`?n(t):n,i=new Set(e.map(e=>yr(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]=Dr(t,`payment preference "${e}"`)}return a}function Dr(e,t){if(typeof e!=`number`||Number.isNaN(e)||!Number.isFinite(e))throw Error(`Invalid q-value for ${t}. Expected a finite number.`);return kr(e,t)}function Or(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 kr(Number(e),t)}function kr(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 Ar(e){return e.toFixed(3).replace(/\.0+$/,``).replace(/(\.\d*?)0+$/,`$1`)}function jr(e,t){if(e!==`*`&&!/^[a-z0-9-]+$/.test(e))throw Error(`Invalid Accept-Payment ${t}: ${e}`)}const Mr=[B.authorization,jt,`PAYMENT-RESPONSE`,Mt];function Nr(e,t,n){let r=new Headers(e.headers);for(let e of Mr)r.delete(e);return r.set(t,n),{...e,headers:r}}function Pr(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 Fr=new WeakMap;function Ir(e){let t=Pr(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 Lr(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 Rr(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=et.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 zr(e){if(e)return`error`in e?e.error?.code===-32042?Rr(e.error.data):void 0:Rr(e.result?._meta?.[`org.paymentauth/payment-required`])}function Br(e,t){return!e||e.id!==t?[]:zr(e)?.challenges??[]}async function Vr(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=Lr(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 Hr(e){let t=Fr.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(Lr).catch(()=>void 0);if(t.includes(`text/event-stream`))return Vr(e)})();return Fr.set(e,n),n}function Ur(){return{getChallenges(e,t){let n=Ir(t);return e.status===402||n===void 0?[]:Hr(e).then(e=>Br(e,n))},setCredential(e,t){let n=JSON.parse(e.body),r=_t(t);return{...e,body:JSON.stringify({...n,params:{...n.params,_meta:{...n.params?._meta,"org.paymentauth/credential":r}}})}}}}function Wr(){return{getChallenges(e){return e.status!==402||!e.headers.has(B.wwwAuthenticate)?[]:ut(e)},setCredential(e,t){return Nr(e,B.authorization,t)}}}function Gr(){return{getChallenges(e){if(e.status!==402)return[];let t=e.headers.get(jt);if(!t)return[];let n=Qt(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=zt.safeParse(e);if(!r.success)return[];let i=r.data;return mn(tt({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 Nr(e,Mt,t)}}}function Kr(e){return e}function qr(){let e=[Wr(),Gr(),Ur()],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 Kr({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)}})}const Jr=new WeakMap;function Yr(e,t){return Jr.set(e,t),e}function Xr(e){return Jr.has(e)}function Zr(e,t){return Promise.resolve(Jr.get(e)?.(t))}const Qr=new WeakMap,$r=new WeakMap;function ei(e,t){return Qr.set(e,t),e}function ti(e){Qr.delete(e)}function ni(e,t,n){Qr.has(e)&&$r.set(t,n)}function ri(e){return $r.get(e)}function ii(e,t){return Promise.resolve(Qr.get(e)?.(t)??t.response)}const ai=Symbol.for(`mppx.fetch.wrapper`),oi=new WeakMap;async function si(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 ci(e){let{acceptPayment:t,acceptPaymentPolicy:n=`always`,fetch:r=globalThis.fetch,maxPaymentRetries:i=3,methods:a,onChallenge:o,orderChallenges:s,transport:c=qr()}=e,l=e.eventDispatcher??li(),u=t??hr(a),d=Ai(r),f=async(e,t,r)=>{let p=ki(e,t?.headers),m=p.has(B.acceptPayment),h=Fi(p,u),g=Di(e,t,p),_=Ei(e,t,p,h.header,m,n),v=await d(ji(_.input),_.init),y=Oi(_.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 Ii(vr(T,a,h.entries),S??s))[0];if(!i){if(await si(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=Vi(v,_.input,_.input),m=D,g=nt(u),x=m?.method===i.method&&m?.key===g,O=!1;if(m){let e=await si(m,{challenges:T,response:v,status:x?`pending`:`rejected`});O=x&&!e}D=O?m:void 0;let k=mi(async e=>{if(e===void 0&&O&&m)return m.promise;O&&m&&(await si(m,{status:`rejected`}),D=void 0);let t=e??b;if(!Xr(i.method))return Pi(u,i.method,t);let n={prepare:()=>Zr(i.method,{challenge:u,context:t,fetch:d,input:p})},r=n.prepare().then(()=>Pi(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`,hi({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 si(j,{status:`rejected`}),D=void 0),Ni(A),await l.emit(`credential.created`,gi({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 si(j,{response:v,status:v.ok?`accepted`:`rejected`}),D=void 0),v.ok&&ui(l,`payment.response`)&&await l.emit(`payment.response`,_i({challenge:u,credential:A,init:t,input:e,method:i.method,response:v})),!M)return v.ok?ii(i.method,{challenge:u,credential:A,fetch:d,headers:_.headers,input:p,...r?{refetch:()=>f(ji(_.input),t,!1)}:{},response:v,signal:Mi(e,t)}):v}T=void 0;try{T=await c.getChallenges(v,y)}catch{}return await si(D,{challenges:T,response:v,status:`rejected`}),v}catch(n){throw await si(D,{challenges:T,response:v,status:`rejected`}),await l.emit(`payment.failed`,vi({challenge:w,challenges:T,error:n,init:t,input:e,method:E,response:v})),n}},p=(e,t)=>f(e,t,!0);return p[ai]=d,p}function Z(e){if(!e)return{};if(e instanceof Headers){let t={};return e.forEach((e,n)=>{t[n]=e}),t}return Array.isArray(e)?Object.fromEntries(e):e}function li(){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 di(t,n);if(typeof e==`string`&&e.length>0){r=e;break}}return await pi(e[`*`],t,n),r}case`credential.created`:await fi(e[`credential.created`],n),await pi(e[`*`],t,n);return;case`payment.failed`:await fi(e[`payment.failed`],n),await pi(e[`*`],t,n);return;case`payment.response`:await fi(e[`payment.response`],n),await pi(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 oi.set(t,t=>e[t].size>0||e[`*`].size>0),t}function ui(e,t){return oi.get(e)?.(t)??!0}async function di(e,t){try{return await e(t)}catch{return}}async function fi(e,t){for(let n of e)try{await n(t)}catch{}}async function pi(e,t,n){await fi(e,Object.freeze({name:t,payload:n}))}function mi(e){let t;return n=>(t??=e(n),t)}function hi(e){return Object.freeze({challenge:Ci(e.challenge),challenges:e.challenges.map(e=>Ci(e)),createCredential:e.createCredential,init:yi(e.init),input:bi(e.input),method:xi(e.method),response:Si(e.response)})}function gi(e){return Object.freeze({challenge:Ci(e.challenge),credential:e.credential,init:yi(e.init),input:bi(e.input),method:xi(e.method),...e.response===void 0?{}:{response:Si(e.response)}})}function _i(e){return Object.freeze({challenge:Ci(e.challenge),credential:e.credential,init:yi(e.init),input:bi(e.input),method:xi(e.method),response:Si(e.response)})}function vi(e){return Object.freeze({...e.challenge?{challenge:Ci(e.challenge)}:{},...e.challenges?{challenges:e.challenges.map(e=>Ci(e))}:{},error:e.error,init:yi(e.init),input:bi(e.input),...e.method?{method:xi(e.method)}:{},...e.response===void 0?{}:{response:Si(e.response)}})}function yi(e){if(e)return Ti({...e,...e.headers?{headers:new Headers(e.headers)}:{}})}function bi(e){if(e instanceof Request)try{return e.clone()}catch{return e}return e instanceof URL?new URL(e):e}function xi(e){return Ti(Object.assign({},e))}function Si(e){return e instanceof Response?e.clone():Ci(e)}function Ci(e){try{return wi(structuredClone(e))}catch{return Ti(e)}}function wi(e){if(!e||typeof e!=`object`||Object.isFrozen(e))return e;Object.freeze(e);for(let t of Object.values(e))wi(t);return e}function Ti(e){return!e||typeof e!=`object`||Object.isFrozen(e)||Object.freeze(e),e}function Ei(e,t,n,r,i,a){let o=!!r&&!i&&Li(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(B.acceptPayment,r),t?(t.headers=s,{headers:s,init:t,input:e}):{headers:s,init:o?{headers:s}:void 0,input:e}}function Di(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 Oi(e,t){return t===void 0?e:{...e,body:t}}function ki(e,t){return t?new Headers(t):new Headers(e instanceof Request?e.headers:void 0)}function Ai(e){let t=e;for(;t[ai];)t=t[ai];return t}function ji(e){if(!(e instanceof Request)||!e.body||e.bodyUsed)return e;try{return e.clone()}catch{return e}}function Mi(e,t){return t?.signal??(e instanceof Request?e.signal:void 0)}function Ni(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 Pi(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&&ni(t,a,r),t.createCredential(a)}function Fi(e,t){let n=e.get(B.acceptPayment);if(!n)return t;try{return{...t,entries:gr(n),header:n}}catch{return t}}async function Ii(e,t){return t?t(e):e}function Li(e,t){if(t===`always`)return!0;if(t===`never`)return!1;let n=Bi(e);return t===`same-origin`?!zi()||n.origin===globalThis.location.origin:t.origins.some(e=>Ri(n,e))}function Ri(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 zi(){return globalThis.location!==void 0}function Bi(e){return e instanceof URL?e:e instanceof Request?new URL(e.url):new URL(e,zi()?globalThis.location.href:void 0)}function Vi(e,t,n){if(!e.url)return t;let r=new URL(e.url),i=Bi(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 Hi(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)}}const Ui={[I.id]:I,[ee.id]:ee};function Wi(r){let{chain:i,feePayerUrl:a,getClient:o,rpcUrl:s}=r;return o?!i?.serializers&&!a?o:async e=>{let r=await o(e),s=r;if(a&&r.transport.key!==`feePayer`){let e=r.request.bind(r),i=ae(n({request:t=>e(t)},{retryCount:0}),c(a,{retryCount:r.transport.retryCount}))({account:r.account,chain:r.chain,pollingInterval:r.pollingInterval,retryCount:0}),o=t({...i.config,retryCount:0},i.value);s=Object.assign({},r,{request:o.request,transport:{...o.config,...o.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 o=a?ae(c(r),c(a)):c(r);return e({chain:Ui[n]??{...i,id:n},transport:o})}}const Gi=D.slice(E.keccak256(T.fromString(`mpp`),{as:`Hex`}),0,4);function Ki(e){let t=E.keccak256(T.fromString(e),{as:`Hex`});return D.toBytes(D.slice(t,0,10))}function qi(e){let{serverId:t,clientId:n,challengeId:r}=e,i=new Uint8Array(32);return i.set(D.toBytes(Gi),0),i[4]=1,i.set(Ki(t),5),n&&i.set(Ki(n),15),i.set(Ji(r),25),D.fromBytes(i)}function Ji(e){let t=E.keccak256(T.fromString(e),{as:`Hex`});return D.toBytes(D.slice(t,0,7))}function Yi(e,t){return ue.resolve(e).toLowerCase()===ue.resolve(t).toLowerCase()}const Xi=[In.pathUsd,In.usdc];async function Zi(e,t){let{account:n,amountOut:r,tokenOut:i,tokenIn:a,slippage:o}=t,s=a.filter(e=>!Yi(e,i)),c=await Promise.allSettled([g(e,L.token.getBalance.call(e,{account:n,token:i})),...s.map(t=>g(e,L.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 L.dex.getBuyQuote(e,{tokenIn:l,tokenOut:i,amountOut:r});if(a>=t){let n=t+t*BigInt(Math.round(o*100))/10000n;return[L.token.approve.call(e,{amount:n,spender:re.stablecoinDex,token:l}),L.dex.buy.call({tokenIn:l,tokenOut:i,amountOut:r,maxAmountIn:n})]}}catch{}}throw new $i({currency:i})}}function Qi(e,t){return e?e===!0?{tokenIn:t,slippage:1}:{tokenIn:e.tokenIn?[...e.tokenIn,...t.filter(t=>!e.tokenIn.some(e=>Yi(e,t)))]:t,slippage:e.slippage??1}:!1}var $i=class extends Error{name=`InsufficientFundsError`;constructor({currency:e}){super(`Insufficient funds: no balance in ${e} and no viable swap route from fallback currencies.`)}};function ea(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 ta=[{inputs:[{name:`inputToken`,type:`address`},{name:`amount`,type:`uint256`},{name:`targetToken`,type:`address`},{name:`recipient`,type:`address`},{name:`memo`,type:`bytes32`}],name:`swapTo`,outputs:[],stateMutability:`nonpayable`,type:`function`}];function na(e){if(e!==void 0)return Ln[e]}function ra(e){let t=na(e.chainId),n=e.transfers.length===1?e.transfers[0]:void 0;if(!t||!n?.memo)return;let i=BigInt(n.amount),a=n.memo;return{calls:[{data:r({abi:te.tip20,functionName:`approve`,args:[t.swap,i]}),to:t.token},{data:r({abi:ta,functionName:`swapTo`,args:[t.token,i,e.currency,n.recipient,a]}),to:t.swap}],settlementSender:t.swap,transfers:[{amount:i,memo:a,recipient:n.recipient}]}}async function ia(e,t){let n=ra(t);if(n)try{return await g(e,L.token.getBalance.call(e,{account:t.account,token:n.calls[0].to}))<n.transfers[0].amount?void 0:(await m(e,{account:t.account,calls:n.calls}),n)}catch{return}}const aa={Proof:[{name:`account`,type:`address`},{name:`challengeId`,type:`string`},{name:`realm`,type:`string`}]};function oa(e){return{name:`MPP`,version:`3`,chainId:e}}function sa(e){let{account:t,challengeId:n,realm:r}=e;return{account:t,challengeId:n,realm:r}}function ca(e){let{account:t,chainId:n,challengeId:r,realm:i}=e;return{domain:oa(n),types:aa,primaryType:`Proof`,message:sa({account:t,challengeId:r,realm:i})}}function la(e){return`did:pkh:eip155:${e.chainId}:${e.address}`}const ua=[`push`,`pull`],da=H.object({amount:U(),memo:H.optional(G()),recipient:H.pipe(H.string(),H.transform(e=>e))}),fa=(1n<<64n)-1n,pa={dev_second:1n,day:86400n,week:604800n},ma=H.pipe(W(),H.transform(e=>e.toLowerCase())),ha=H.object({accessKeyAddress:ma,keyType:H.enum([`p256`,`secp256k1`,`webAuthn`])}),ga=H.object({accessKey:H.optional(ha),chainId:H.optional(H.number())}),_a=Ye(`subscriptionExpires must be a valid date`).check(H.refine(e=>e.getTime()%1e3==0,`subscriptionExpires must be representable as whole seconds`)),va=H.enum([`dev_second`,`day`,`week`]),ya=H.pipe(H.union([H.string(),H.bigint(),H.custom(e=>typeof e==`number`&&Number.isSafeInteger(e))]),H.transform(e=>e.toString())).check(H.regex(/^[1-9]\d*$/,`Invalid periodCount`),H.refine(e=>{try{return BigInt(e)<=fa}catch{return!1}},`periodCount exceeds uint64`));function ba(e){return H.refine(e=>{let{amount:t,decimals:n}=e;return f(t,n)>0n},e)}function xa(e){let{periodCount:t,periodUnit:n}=e;try{let e=pa[n];return e!==void 0&&BigInt(t)*e<=fa}catch{return!1}}const Sa=Et({name:`tempo`,intent:`charge`,schema:{credential:{payload:H.discriminatedUnion(`type`,[H.object({hash:G(),type:H.literal(`hash`)}),H.object({signature:K(),type:H.literal(`transaction`)}),H.object({signature:K(),type:H.literal(`proof`)})])},request:H.pipe(H.object({machineTokenEnabled:H.optional(H.boolean()),amount:U(),chainId:H.optional(H.number()),currency:H.string(),decimals:H.number(),description:H.optional(H.string()),externalId:H.optional(H.string()),feePayer:H.optional(H.pipe(H.union([H.boolean(),H.custom()]),H.transform(e=>typeof e==`object`||e))),memo:H.optional(G()),recipient:H.optional(H.string()),splits:H.optional(H.array(da).check(H.minLength(1),H.maxLength(10))),supportedModes:H.optional(H.array(H.enum(ua)).check(H.minLength(1)))}).check(H.refine(({amount:e,decimals:t,splits:n})=>{if(!n)return!0;let r=f(e,t),i=n.reduce((e,n)=>e+f(n.amount,t),0n);return n.every(e=>f(e.amount,t)>0n)&&i<r},`Invalid splits`)),H.transform(({machineTokenEnabled:e,amount:t,chainId:n,decimals:r,feePayer:i,memo:a,splits:o,supportedModes:s,...c})=>({...c,amount:f(t,r).toString(),...e!==void 0||n!==void 0||i!==void 0||a!==void 0||o!==void 0||s!==void 0?{methodDetails:{...e!==void 0&&{machineTokenEnabled:e},...n!==void 0&&{chainId:n},...i!==void 0&&{feePayer:i},...a!==void 0&&{memo:a},...o!==void 0&&{splits:o.map(e=>({...e,amount:f(e.amount,r).toString()}))},...s!==void 0&&{supportedModes:s}}}:{}})))}}),Ca=Et({name:`tempo`,intent:`session`,schema:{credential:{payload:H.discriminatedUnion(`action`,[H.object({action:H.literal(`open`),authorizationSignature:H.optional(K()),authorizedSigner:H.optional(H.string()),channelId:G(),cumulativeAmount:U(),descriptor:H.optional(H.custom()),signature:K(),transaction:K(),type:H.literal(`transaction`)}),H.object({action:H.literal(`topUp`),additionalDeposit:U(),channelId:G(),descriptor:H.optional(H.custom()),transaction:K(),type:H.literal(`transaction`)}),H.object({action:H.literal(`voucher`),authorizationSignature:H.optional(K()),channelId:G(),cumulativeAmount:U(),descriptor:H.optional(H.custom()),signature:K()}),H.object({action:H.literal(`close`),authorizationSignature:H.optional(K()),channelId:G(),cumulativeAmount:U(),descriptor:H.optional(H.custom()),refundSignature:H.optional(K()),signature:K()})])},request:H.pipe(H.object({amount:U(),chainId:H.optional(H.number()),channelId:H.optional(G()),currency:H.string(),decimals:H.number(),escrowContract:H.optional(H.string()),feePayer:H.optional(H.pipe(H.union([H.boolean(),H.custom()]),H.transform(e=>typeof e==`object`||e))),feeToken:H.optional(W()),machineTokenEnabled:H.optional(H.boolean()),minVoucherDelta:H.optional(U()),operator:H.optional(W()),recipient:H.optional(H.string()),sessionProtocol:H.optional(H.enum([We.v2,We.v1])),sessionSnapshot:H.optional(H.custom()),suggestedDeposit:H.optional(U()),unitType:H.string()}).check(H.refine(({amount:e,decimals:t})=>f(e,t)>0n,`Session amount must be greater than 0`)),H.transform(({amount:e,chainId:t,channelId:n,decimals:r,escrowContract:i,feePayer:a,feeToken:o,machineTokenEnabled:s,minVoucherDelta:c,operator:l,sessionProtocol:u,sessionSnapshot:d,suggestedDeposit:p,...m})=>({...m,amount:f(e,r).toString(),...p?{suggestedDeposit:f(p,r).toString()}:{},methodDetails:{escrowContract:i,...n!==void 0&&{channelId:n},...c!==void 0&&{minVoucherDelta:f(c,r).toString()},...t!==void 0&&{chainId:t},...a!==void 0&&{feePayer:a},...o!==void 0&&{feeToken:o},...s!==void 0&&{machineTokenEnabled:s},...l!==void 0&&{operator:l},...u!==void 0&&{[Ue.sessionProtocol]:u},...d!==void 0&&{[Ue.sessionSnapshot]:d}}})))}}),wa=Et({name:`tempo`,intent:`subscription`,schema:{credential:{payload:H.object({signature:K(),type:H.literal(`keyAuthorization`)})},request:H.pipe(H.object({amount:U(),accessKey:H.optional(ha),chainId:H.optional(H.number()),currency:ma,decimals:H.number(),description:H.optional(H.string()),externalId:H.optional(H.string()),methodDetails:H.optional(ga),periodCount:ya,periodUnit:va,recipient:ma,subscriptionExpires:_a}).check(ba(`Subscription amount must be greater than 0`),H.refine(xa,`Subscription period exceeds uint64`)),H.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:f(t,r).toString(),subscriptionExpires:a.toISOString(),...Object.keys(s).length>0?{methodDetails:s}:{}}}))}}),Ta=H.object({account:H.optional(H.custom()),autoSwap:H.optional(H.custom()),mode:H.optional(H.enum(ua))});function Ea(e={}){let{clientId:t}=e,n=Wi({chain:I,getClient:e.getClient,rpcUrl:zn}),r=Hi({account:e.account});return Dt(Sa,{context:Ta,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:f}=u,p=f?.supportedModes??[`pull`,`push`],m=r(c,a);if(BigInt(d)===0n)return xt({challenge:i,payload:{signature:await b(c,{account:m,...ca({account:m.address,chainId:l,challengeId:i.id,realm:i.realm})}),type:`proof`},source:la({address:m.address,chainId:l})});let g=u.currency;if(e.expectedRecipients){let t=new Set(e.expectedRecipients.map(e=>e.toLowerCase())),n=f?.splits;if(n){for(let e of n)if(!t.has(e.recipient.toLowerCase()))throw Error(`Unexpected split recipient: ${e.recipient}`)}}let x=f?.memo?f.memo:qi({challengeId:i.id,clientId:t,serverId:i.realm}),S=ea({amount:d,methodDetails:{...f,memo:x},recipient:u.recipient}),C=S.map(e=>L.token.transfer.call(c,{amount:BigInt(e.amount),...e.memo&&{memo:e.memo},to:e.recipient,token:g})),w=Qi(a?.autoSwap??e.autoSwap,Xi),T=f?.machineTokenEnabled===!0,E=await e.resolveAccount?.({account:m,chainId:l,operation:{kind:`executeCalls`,...w||T?{}:{calls:C}}})??m,D=(()=>{let t=a?.mode??e.mode;if(t){if(!p.includes(t))throw Error(`Challenge does not support ${t} mode.`);return t}let n=E.type===`json-rpc`?`push`:`pull`;return p.includes(n)?n:p[0]})(),O=T?await ia(c,{account:E.address,chainId:l,currency:g,transfers:S}):void 0,k=!O&&w?await Zi(c,{account:E.address,amountOut:BigInt(d),tokenOut:g,tokenIn:w.tokenIn,slippage:w.slippage}):void 0,A=O?.calls??[...k??[],...C],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(D===`push`){let{receipts:e}=E.type===`local`?{receipts:[await v(c,{account:E,calls:A,nonceKey:`expiring`,validBefore:j})]}:await _(c,{account:E,calls:A,experimental_fallback:A.length===1,forceAtomic:A.length>1}),t=e?.[0]?.transactionHash;if(!t)throw Error(`No transaction receipt returned.`);return xt({challenge:i,payload:{hash:t,type:`hash`},source:la({address:E.address,chainId:l})})}let M=await h(c,{account:E,calls:A,nonceKey:`expiring`,validBefore:j});if(M.gas=(M.gas??0n)+5000n,f?.feePayer){let e=M;delete e.feePayerSignature,delete e.feeToken,e.feePayer=!0}return xt({challenge:i,payload:{signature:await y(c,M),type:`transaction`},source:la({address:E.address,chainId:l})})}})}function Da(e){return`accessKeyAddress`in e}function Oa(e){return Da(e)?e.accessKeyAddress:e.address}function ka(e,t){return{name:`Tempo Stream Channel`,version:`1`,chainId:t,verifyingContract:e}}const Aa={Voucher:[{name:`channelId`,type:`bytes32`},{name:`cumulativeAmount`,type:`uint128`}]};function ja(e){return{channelId:e.channelId,cumulativeAmount:e.cumulativeAmount}}function Ma(e,t,n){return s({domain:ka(e,t),types:Aa,primaryType:`Voucher`,message:ja(n)})}async function Na(e,t,n,r,i){return b(e,{account:t,domain:ka(r,i),types:Aa,primaryType:`Voucher`,message:ja(n)})}function Pa(e){let t=z.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 k.toHex(t.inner.signature)}return z.serialize(t)}function Fa(e){return e.type!==`keychain`&&e.type===`secp256k1`}function Ia(e){if(!Fa(e))throw Error(`Session vouchers only support secp256k1 signatures until TIP-1020 voucher verification is enabled.`)}async function La(e,t,n,r,i,a){let o=a??t,s=Oa(o),c=Ma(r,i,n),l=Pa(Da(o)?await o.sign({hash:c,raw:!0}):await Na(e,o,n,r,i)),u=z.from(l);if(Ia(u),!z.verify(u,{address:s,payload:c}))throw Error(`voucher signature does not match voucher signer`);return l}function Ra(e){let t=C.encode(C.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 E.keccak256(t)}const za=[{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 Ba(e,t,n){return g(e,{address:t,abi:za,functionName:`getChannel`,args:[n]})}a({abi:za,name:`open`}),a({abi:za,name:`topUp`});function Va(e,t){return t??e}function Ha(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 Ua(e,t,n,r){return xt({challenge:e,payload:t,source:`did:pkh:eip155:${n}:${r.address}`})}async function Wa(e,t,n,r,i,a,o){let s=Va(t,o),c=await La(e,t,{channelId:n,cumulativeAmount:r},i,a,s);return{action:`voucher`,channelId:n,cumulativeAmount:r.toString(),signature:c}}async function Ga(e,t,n){let{escrowContract:i,payee:a,currency:o,deposit:s,initialAmount:c,chainId:l,feePayer:u}=n,d=Va(t,n.voucherSigner),f=Oa(d),p=D.random(32),m=Ra({authorizedSigner:f,chainId:l,escrowContract:i,payee:a,payer:t.address,salt:p,token:o}),g=r({abi:te.tip20,functionName:`approve`,args:[i,s]}),_=r({abi:za,functionName:`open`,args:[a,o,s,p,f]}),v=Math.floor(Date.now()/1e3)+25,b=await h(e,{account:t,calls:[{to:o,data:g},{to:i,data:_}],feeToken:o,nonceKey:`expiring`,validBefore:v});b.gas=(b.gas??0n)+5000n,u&&(b.feePayer=!0);let x=await y(e,b),S=await La(e,t,{channelId:m,cumulativeAmount:c},i,l,d);return{entry:{authorizedSigner:f,channelId:m,salt:p,cumulativeAmount:c,escrowContract:i,chainId:l,opened:!0},payload:{action:`open`,type:`transaction`,channelId:m,transaction:x,authorizedSigner:f,cumulativeAmount:c.toString(),signature:S}}}async function Ka(e,t,n,r){try{let i=await Ba(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=H.object({account:H.optional(H.custom()),action:H.optional(H.enum([`open`,`topUp`,`voucher`,`close`])),channelId:H.optional(H.string()),cumulativeAmount:H.optional(U()),cumulativeAmountRaw:H.optional(H.string()),transaction:H.optional(H.string()),additionalDeposit:H.optional(U()),additionalDepositRaw:H.optional(H.string()),depositRaw:H.optional(H.string())});function Ja(e={}){let{allowCustomEscrow:t=!1,decimals:n=6}=e,r=Wi({chain:I,getClient:e.getClient,rpcUrl:zn}),i=Hi({account:e.account}),a=e.maxDeposit===void 0?void 0:f(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 d(n,r,i){if(i){let e=o.get(i);if(e)return Ha(n,r,e)}return Ha(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}),_=d(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 f(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 Ka(g,_,e,h);if(t){let e=p?.cumulativeAmountRaw?BigInt(p.cumulativeAmountRaw):p?.cumulativeAmount?f(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()!==Oa(w).toLowerCase()&&(E=void 0);let D;if(E?.opened)E.cumulativeAmount+=b,D=await Wa(g,i,E.channelId,E.cumulativeAmount,_,h,w),l(E);else{let e=await Ga(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 Ua(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?f(a.cumulativeAmount,n):void 0,b=a.additionalDepositRaw?BigInt(a.additionalDepositRaw):a.additionalDeposit?f(a.additionalDeposit,n):void 0,x=d(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 La(p,i,{channelId:v,cumulativeAmount:y},x,u,_);S={action:`open`,type:`transaction`,channelId:v,transaction:g,authorizedSigner:Oa(_),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 Wa(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 La(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 Ua(t,S,u,i)}return Dt(Ca,{canHandleChallenge({challenge:e}){let t=Ge(e.request.methodDetails,Ue.sessionProtocol);return t===void 0||t===We.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 Ya=(1n<<96n)-1n;function Xa(e){return e>=0n&&e<=Ya}function Za(e){if(!/^\d{1,29}$/.test(e))return;let t=BigInt(e);return Xa(t)?t:void 0}function Qa(e){return $a(e),e}function $a(e){if(!Xa(e))throw Error(`Value ${e} is outside uint96 bounds.`)}const eo=new Set([`open`,`topUp`,`voucher`,`close`]);function to(e){return typeof e==`object`&&!!e}function no(e){return typeof e==`string`&&eo.has(e)}function ro(e){if(typeof e!=`object`||!e)return!1;let t=e;return!(typeof t.channelId!=`string`||t.action!==void 0&&!no(t.action))}function io(e,t=`No session credential context available.`){if(!ro(e))throw Error(t);return e}function ao(e){let t=e.request.amount;if(typeof t!=`string`)throw Error(`Session challenge is missing amount.`);return BigInt(t)}function oo(e){return to(e)?typeof e.channelId==`string`&&typeof e.requiredCumulative==`string`&&typeof e.acceptedCumulative==`string`&&typeof e.deposit==`string`:!1}function so(e){return to(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 co(e){let t=w.toString(e),n=JSON.parse(t);if(!so(n))throw Error(`Invalid session receipt.`);return n}function lo(e){return e.headers.get(`content-type`)?.toLowerCase().startsWith(`text/event-stream`)??!1}function uo(e){let t=`message`,n=[];for(let r of e.split(`
|
|
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=fo(r);return oo(e)?{type:`payment-need-voucher`,data:e}:null}case`payment-receipt`:{let e=fo(r);return so(e)?{type:`payment-receipt`,data:e}:null}default:return{type:`message`,data:r}}}function fo(e){try{return JSON.parse(e)}catch{return null}}function po(e){return JSON.stringify({mpp:`authorization`,authorization:e})}function mo(){return JSON.stringify({mpp:`payment-close-request`})}function ho(e){let t=go(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`&&so(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`&&oo(t.data)?{mpp:`payment-need-voucher`,data:t.data}:t.mpp===`payment-receipt`&&so(t.data)?{mpp:`payment-receipt`,data:t.data}:null:null}function go(e){try{let t=JSON.parse(e);return typeof t!=`object`||!t?null:t}catch{return null}}const _o=`0x4d50500000000000000000000000000000000000`,vo={CONNECTING:0,OPEN:1,CLOSING:2,CLOSED:3};function yo(e){let t=e.allowCustomEscrow??!1,n=e.fetch??globalThis.fetch,r=e.webSocket??globalThis.WebSocket,i=e.maxDeposit===void 0?null:f(e.maxDeposit,e.decimals??6),a=null,o=null,s=null,c=0n,l=0n,u=null,d=null,p=null,m=null,h=null,g=null,_=null,v=0n,y=0n,b=Ja({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=ci({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(B.paymentReceipt),n=t?co(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 P(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=vo.CLOSED,r=null}if(e===`open`&&(i=vo.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:{[B.authorization]:r}});if(!i.ok){let e=await i.text().catch(()=>``),t=i.headers.get(B.wwwAuthenticate)??``;throw Error(`Open request failed with status ${i.status}${e?`: ${e}`:``}${t?` [${B.wwwAuthenticate}: ${t}]`:``}`)}},fetch:N,async sse(e,t){let{onReceipt:r,signal:i,...s}=t??{},c=await N(e,{...s,headers:{...Z(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
|
+
|
|
6
|
+
`);t=s.pop();for(let t of s){if(!t.trim())continue;let i=uo(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`,[B.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:f}=i??{},h=new URL(t.toString()),_=new URL(h.toString());_.protocol===`ws:`&&(_.protocol=`http:`),_.protocol===`wss:`&&(_.protocol=`https:`),s=_.toString();let x=await n(_,f?{signal:f}:void 0);if(x.status!==402)throw Error(`Expected a 402 payment challenge from ${_}, received ${x.status} instead.`);let C=(await bo(vr(ut(x),[b],hr([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=_t(T);d=A.payload.channelId;let M=new r(h,l);p=M;let N=P(M),F=e=>{O(Error(e)),k(Error(e)),(M.readyState===vo.CONNECTING||M.readyState===vo.OPEN)&&M.close(3008,e)},I=e=>e.challengeId===C.id&&e.channelId===d,ee=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),d===A.payload.channelId&&(d=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=ho(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(!I(n.data)){F(`received mismatched payment-close-ready frame`);break}if(BigInt(n.data.spent)>(a?.cumulativeAmount??0n)){F(`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!==d){F(`received mismatched payment-need-voucher frame`);break}let e=BigInt(n.data.requiredCumulative);try{j(e)}catch(e){F(e instanceof Error?e.message:`requested voucher amount exceeds local maxDeposit`);break}let t=(a?.cumulativeAmount??0n)>e?a?.cumulativeAmount??0n:e;a?.channelId===d&&(a.cumulativeAmount=t);let r=await b.createCredential({challenge:C,context:{action:`voucher`,channelId:d,cumulativeAmountRaw:t.toString()}});M.send(po(r));break}case`payment-receipt`:if(!I(n.data)){F(`received mismatched payment-receipt frame`);break}if(g!==null&&n.data.txHash&&(n.data.acceptedCumulative!==g||n.data.spent!==g)){F(`received mismatched payment-close receipt frame`);break}S(n.data),c?.(n.data),E(n.data)}}),f&&f.addEventListener(`abort`,()=>{O(Error(`WebSocket payment flow aborted.`)),k(Error(`WebSocket payment flow aborted.`)),M.close()},{once:!0}),await ee,M.send(po(T)),await w(),N.socket},async close(){let e=u??o,t=d??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===vo.OPEN){let n=m??await(async()=>(p.send(mo()),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(po(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:{[B.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(B.wwwAuthenticate)??``;throw Error(`Close request failed with status ${i.status}${t?`: ${t}`:``}${n?` [${B.wwwAuthenticate}: ${n}]`:``}`)}let c=i.headers.get(B.paymentReceipt);return c?co(c):void 0}}}async function bo(e,t){let n=t;return n?n(e):e}function xo(e){return e===`secp256k1`||e===`p256`||e===`webAuthn`}function So(e,t){let n=z.from(e);if(!xo(n.type))throw Error(`${t} require a TIP-1020 primitive signature; received "${n.type}".`);return z.serialize(n)}function Co(e){let t=z.from(e);if(xo(t.type)&&z.serialize(t).toLowerCase()===e.toLowerCase())return t}const wo=d([`function sessionRouteFor(address merchant,address targetToken) view returns (address routeAddress)`,`function sessionRoutes(address routeAddress) view returns (address merchant,address targetToken)`]),To={SessionAuthorization:[{name:`channelId`,type:`bytes32`},{name:`cumulativeAmount`,type:`uint96`}]};function Eo(e){if(e!==void 0)return Ln[e]}function Do(e){let t=Eo(e.chainId);return t&&u(e.descriptor.operator,t.swap)&&u(e.descriptor.token,t.token)?t:void 0}function Oo(e){return e.request.methodDetails?.machineTokenEnabled===!0}function ko(e){if(e.override)return e.override;let t=Eo(e.chainId);return t&&u(e.paymentToken,t.token)?In.pathUsd:e.paymentToken}async function Ao(e,t){try{return await g(e,L.token.getBalance.call(e,{account:t.account,token:t.token}))>=t.amount}catch{return!1}}function jo(e,t){return{name:`MachineUSD Session Router`,version:`1`,chainId:t,verifyingContract:e}}function Mo(e){return s({domain:jo(e.router,e.chainId),types:To,primaryType:`SessionAuthorization`,message:e.authorization})}async function No(e,t,n){return So(Da(t)?await t.sign({hash:Mo(n),raw:!0}):await b(e,{account:t,domain:jo(n.router,n.chainId),types:To,primaryType:`SessionAuthorization`,message:n.authorization}),`Machine-token session authorizations`)}async function Po(e,t,n){let r=n.payee??await g(e,{address:t.swap,abi:wo,functionName:`sessionRouteFor`,args:[n.merchant,n.targetToken]});if(u(r,p))return;let[i,a]=await Promise.all([g(e,{address:t.swap,abi:wo,functionName:`sessionRoutes`,args:[r]}),n.active&&n.payee?g(e,{address:t.swap,abi:wo,functionName:`sessionRouteFor`,args:[n.merchant,n.targetToken]}):r]);if(!(u(i[0],p)||u(i[1],p)||!u(i[0],n.merchant)||!u(i[1],n.targetToken)||!u(a,r)))return{operator:t.swap,payee:r,token:t.token}}async function Fo(e,t){let n=Eo(t.chainId);if(n)return Po(e,n,{...t,active:!0})}async function Io(e,t){let n=Do(t);if(n)return Po(e,n,{...t,active:t.active!==!1,payee:t.descriptor.payee})}function Lo(e){return BigInt(e.authorizedSigner)===0n?e.payer:e.authorizedSigner}function Ro(e){let t=C.encode(C.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 E.keccak256(t)}function zo(e){return de.encodeForSigning(e)}function Bo(e){let{feePayer:t,transaction:n}=e;return t?{...n,feePayerSignature:null}:n}function Vo(e,t){return E.keccak256(D.concat(zo(e),t.sender))}const Ho=[{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`}],Uo=[{name:`settled`,type:`uint96`},{name:`deposit`,type:`uint96`},{name:`closeRequestedAt`,type:`uint32`}],Wo={name:`descriptor`,type:`tuple`,components:Ho},Go=[{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:[Wo,{name:`cumulativeAmount`,type:`uint96`},{name:`signature`,type:`bytes`}],outputs:[]},{type:`function`,name:`topUp`,stateMutability:`nonpayable`,inputs:[Wo,{name:`additionalDeposit`,type:`uint96`}],outputs:[]},{type:`function`,name:`close`,stateMutability:`nonpayable`,inputs:[Wo,{name:`cumulativeAmount`,type:`uint96`},{name:`captureAmount`,type:`uint96`},{name:`signature`,type:`bytes`}],outputs:[]},{type:`function`,name:`requestClose`,stateMutability:`nonpayable`,inputs:[Wo],outputs:[]},{type:`function`,name:`withdraw`,stateMutability:`nonpayable`,inputs:[Wo],outputs:[]},{type:`function`,name:`getChannel`,stateMutability:`view`,inputs:[Wo],outputs:[{type:`tuple`,components:[{name:`descriptor`,type:`tuple`,components:Ho},{name:`state`,type:`tuple`,components:Uo}]}]},{type:`function`,name:`getChannelState`,stateMutability:`view`,inputs:[{name:`channelId`,type:`bytes32`}],outputs:[{type:`tuple`,components:Uo}]},{type:`function`,name:`getChannelStatesBatch`,stateMutability:`view`,inputs:[{name:`channelIds`,type:`bytes32[]`}],outputs:[{type:`tuple[]`,components:Uo}]},{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}]}];d([`function settleSession((address payer,address payee,address operator,address token,bytes32 salt,address authorizedSigner,bytes32 expiringNonceHash) descriptor,uint96 cumulativeAmount,bytes signature,bytes authorizationSignature)`,`function closeSession((address payer,address payee,address operator,address token,bytes32 salt,address authorizedSigner,bytes32 expiringNonceHash) descriptor,uint96 cumulativeAmount,bytes signature,bytes authorizationSignature,bytes refundSignature)`]);const Ko=2n**96n-1n;function qo(e){if(e<0n||e>Ko)throw new J({reason:`amount exceeds uint96 range`})}async function Jo(e,t,n=_o,r){return Yo(await g(e,{address:n,abi:Go,functionName:`getChannelState`,args:[t],...r===void 0?{}:{blockNumber:r}}))}function Yo(e){return qo(e.settled),qo(e.deposit),{settled:e.settled,deposit:e.deposit,closeRequestedAt:e.closeRequestedAt}}function Xo(e,t){return{name:`TIP20 Channel Reserve`,version:`1`,chainId:t,verifyingContract:e}}const Zo={Voucher:[{name:`channelId`,type:`bytes32`},{name:`cumulativeAmount`,type:`uint96`}]};function Qo(e,t){return le.getVoucherSignPayload({chainId:e,channelId:t.channelId,cumulativeAmount:t.cumulativeAmount})}function $o(e,t,n){return e.toLowerCase()===le.address.toLowerCase()?Qo(t,n):s({domain:Xo(e,t),types:Zo,primaryType:`Voucher`,message:{channelId:n.channelId,cumulativeAmount:n.cumulativeAmount}})}function es(e,t){return ne.signVoucher(e,{chainId:t.chainId,channel:t.channelId,cumulativeAmount:t.cumulativeAmount})}async function ts(e,t,n,r,i){return So(await(async()=>{if(r.toLowerCase()===le.address.toLowerCase())try{return await es(t,{chainId:i,channelId:n.channelId,cumulativeAmount:n.cumulativeAmount})}catch{}return b(e,{account:t,domain:Xo(r,i),types:Zo,primaryType:`Voucher`,message:n})})(),`TIP-1034 vouchers`)}function ns(e,t,n,r){try{let i=Co(n.signature);if(!i)return!1;let a=$o(e,t,n),o=z.extractAddress({payload:a,signature:i});return z.verify(i,{address:o,payload:a})&&Yi(o,r)}catch{return!1}}function rs(e){return typeof e==`object`&&!!e}function is(e){return typeof e==`string`&&l(e,{strict:!1})?e:void 0}function as(e){return is(e.accessKeyAddress)}function os(){let e=BigInt(Math.floor(Date.now()/1e3))-60n;return e<=0n?0:Number(BigInt(D.random(8))%e)}function ss(e){return as(e)??e.address}async function cs(e,t){let{account:n,calls:r,feePayer:i,feeToken:a,validAfter:o}=t;return h(e,{account:n,calls:r,nonceKey:`expiring`,...i?{feePayer:!0}:{},feeToken:a,...o===void 0?{}:{validAfter:o}})}async function ls(e,t){return await y(e,t)}function us(e,t,n=!1){let r=e.request.methodDetails,i=rs(r)?is(r.escrowContract)??is(r.escrow):void 0,a=t??`0x4d50500000000000000000000000000000000000`;if(i&&!Q(i,a)&&(!n||t!==void 0))throw Error(`Tempo session escrow ${i} does not match client escrow ${a}.`);return i&&!Q(i,a)?i:a}function ds(e,t,n,r){return xt({challenge:e,payload:t,source:`did:pkh:eip155:${n}:${r.address}`})}function Q(e,t){return e.toLowerCase()===t.toLowerCase()}function fs(e){return Q(e.escrow,`0x4d50500000000000000000000000000000000000`)&&Do({chainId:e.chainId,descriptor:e.descriptor})!==void 0}function ps(e){let t=e.paymentScope;return t?!Q(t.payee,e.descriptor.payee)||!Q(t.token,e.descriptor.token):!1}async function ms(e,t,n,r,i,a=_o){let o=Ro({...n,chainId:i,escrow:a}),s=Qa(r),c=await ts(e,t,{channelId:o,cumulativeAmount:s},a,i);return{action:`voucher`,channelId:o,descriptor:n,cumulativeAmount:s.toString(),signature:c}}async function hs(e,t,n,r,i,a=_o){let o=await ms(e,t,n,r,i,a);return{action:`close`,channelId:o.channelId,descriptor:n,cumulativeAmount:o.cumulativeAmount,signature:o.signature}}async function gs(e,t,n){let i=ss(t),a=n.escrow??`0x4d50500000000000000000000000000000000000`,o=n.operator??`0x0000000000000000000000000000000000000000`,s=D.random(32),c=Qa(n.deposit),l=Qa(n.initialAmount),u=r({abi:Go,functionName:`open`,args:[n.payee,o,n.token,c,s,i]}),d=await ls(e,await cs(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:Vo(Bo({...n.feePayer?{feePayer:!0}:{},transaction:f}),{sender:t.address}),operator:o,payee:n.payee,payer:t.address,salt:s,token:n.token},m=Ro({...p,chainId:n.chainId,escrow:a});return{action:`open`,type:`transaction`,channelId:m,transaction:d,signature:await ts(e,t,{channelId:m,cumulativeAmount:l},a,n.chainId),descriptor:p,cumulativeAmount:l.toString(),authorizedSigner:p.authorizedSigner}}async function _s(e,t,n,i,a,o,s=_o,c=[],l=n.token){let u=Ro({...n,chainId:a,escrow:s}),d=Qa(i);return{action:`topUp`,type:`transaction`,channelId:u,transaction:await ls(e,await cs(e,{account:t,calls:[...c,{to:s,data:r({abi:Go,functionName:`topUp`,args:[n,d]})}],feePayer:o,feeToken:l,validAfter:os()})),descriptor:n,additionalDeposit:d.toString()}}function vs(e){let{payee:t,token:n,escrow:r,chainId:i}=e;return`${t.toLowerCase()}:${n.toLowerCase()}:${r.toLowerCase()}:${i}`}function ys(e){return vs({payee:e.paymentScope?.payee??e.descriptor.payee,token:e.paymentScope?.token??e.descriptor.token,escrow:e.escrow,chainId:e.chainId})}function bs(){let e=new Map;return{get:t=>e.get(t),set(t){e.set(ys(t),t)},delete(t){e.delete(t)}}}const xs=H.custom(e=>typeof e==`string`&&l(e,{strict:!1})),Ss=H.custom(e=>typeof e==`string`&&/^0x[0-9a-fA-F]{64}$/.test(e)),Cs=H.custom(e=>typeof e==`string`&&/^0x[0-9a-fA-F]+$/.test(e)),ws=H.object({authorizedSigner:xs,expiringNonceHash:Ss,operator:xs,payee:xs,payer:xs,salt:Ss,token:xs}),Ts=Ot(H.object({acceptedCumulative:H.string(),chainId:H.number(),channelId:Ss,closeRequestedAt:H.optional(H.string()),deposit:H.string(),descriptor:ws,escrow:xs,highestVoucher:H.optional(H.object({channelId:Ss,cumulativeAmount:H.string(),signature:Cs})),requiredCumulative:H.string(),settled:H.string(),spent:H.string(),units:H.optional(H.number())}));function Es(e){return Ts.encode(e)}function Ds(e){return Ts.decode(e)}const Os={status:`idle`};function ks(e){return{status:`active`,...e}}function As(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:Ns(e.challengeId,t.snapshot),effects:[]}:$(e,t);case`activated`:return e.status===`closing`||e.status===`closed`?$(e,t):{state:Ks({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:Ys(t.receipt,t.entry),effects:[]};case`needVoucher`:return e.status===`active`?Ms({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 js(e,t){let n=As(e.state,t);return e.state=n.state,n}function Ms(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 Ns(e,t){return ks({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 ks({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 Fs(e){let{cumulativeAmount:t,maxVoucherCumulative:n}=e;if(n!==null&&!(t<=n))throw Error(`requested voucher amount ${t} exceeds local maxDeposit ${n}`)}function Is(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`);Fs({cumulativeAmount:i,maxVoucherCumulative:n}),Fs({cumulativeAmount:a,maxVoucherCumulative:n})}function Ls(e){let{channel:t,maxVoucherCumulative:n,receipt:r,spent:i}=e;if(!r||r.channelId!==t?.channelId)return i;Is({channel:t,maxVoucherCumulative:n,receipt:r});let a=BigInt(r.spent);return i>a?i:a}function Rs(e,t){return typeof e==`bigint`?e:f(e,t)}function zs(e){let{contextDepositRaw:t,maxDeposit:n,requestAmount:r,suggestedDepositRaw:i}=e;if(Vs(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 Bs(e){let{deposit:t,maxDeposit:n,requiredCumulative:r,suggestedDeposit:i,topUpAmount:a}=e;if(r<=t)return 0n;Fs({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 Vs(e,t){Fs({cumulativeAmount:e,maxVoucherCumulative:t??null})}function Hs(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 Us(e){let{cumulativeAmount:t,spent:n}=e;return t>n?t:n}function Ws(e){let{cumulativeAmount:t,readySpent:n,spent:r}=e;if(!Xa(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>Us({cumulativeAmount:t,spent:r}))throw Error(`close-ready spent exceeds local voucher state`)}function Gs(e){let{challengeId:t,channelId:n,expectedCloseAmount:r,minimumSpent:i=0n,receipt:a}=e,o=Za(r),s=Za(a.spent);return o===void 0||s===void 0||!Xa(i)?!1:!!a.txHash&&a.challengeId===t&&a.channelId===n&&a.acceptedCumulative===r&&s>=i&&s<=o}function Ks(e){return ks({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 qs(){return{channel:null,lastChallenge:null,lastUrl:null,spent:0n,socketSession:null,state:Os}}function Js(e){let{maxVoucherCumulative:t,receipt:n,runtime:r}=e;r.spent=Ls({channel:r.channel,maxVoucherCumulative:t,receipt:n,spent:r.spent}),n&&r.channel?.channelId===n.channelId&&js(r,{type:`receiptAccepted`,receipt:n,entry:r.channel})}function Ys(e,t){return ks({challengeId:e.challengeId,channelId:e.channelId,descriptor:t.descriptor,acceptedCumulative:e.acceptedCumulative,deposit:t.deposit.toString(),spent:e.spent,units:e.units??0})}function Xs(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=Za(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 Zs(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 As(o,{type:`activated`,challengeId:r,entry:t,spent:a.toString(),units:o.status===`active`?o.units:0}).state}function Qs(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 $s(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 ec(e){let{activeSocket:t,currentSocket:n,target:r}=e,i=n.closeReadyReceipt??await(async()=>(t.send(mo()),e.waitForCloseReady()))(),a=BigInt(i.spent);Ws({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=>Gs({challengeId:r.challenge.id,channelId:r.channelId,expectedCloseAmount:s,minimumSpent:a,receipt:e}));t.send(po(o));let c=await i;return t.close(),n.closeReadyReceipt=null,c}finally{n.expectedCloseAmount=null}}function tc(e){return`cumulativeAmount`in e}function nc(e){if(tc(e))return BigInt(e.cumulativeAmount)}function rc(e,t){let n=nc(t);if(!(n===void 0||!e||e.channelId.toLowerCase()!==t.channelId.toLowerCase()))return{...e,cumulativeAmount:e.cumulativeAmount>n?e.cumulativeAmount:n,opened:t.action!==`close`&&e.opened}}const ic=H.custom(e=>typeof e==`string`&&/^0x[0-9a-fA-F]*$/.test(e)),ac=H.custom(e=>typeof e==`string`&&/^0x[0-9a-fA-F]{64}$/.test(e)),oc=H.object({account:H.optional(H.custom()),autoSwap:H.optional(H.custom()),action:H.optional(H.enum([`open`,`topUp`,`voucher`,`close`])),channelId:H.optional(ac),cumulativeAmount:H.optional(U()),cumulativeAmountRaw:H.optional(H.string()),transaction:H.optional(ic),descriptor:H.optional(H.custom()),additionalDeposit:H.optional(U()),additionalDepositRaw:H.optional(H.string()),depositRaw:H.optional(H.string())});function sc(e){return e?.action!==void 0}function cc(e){return sc(e)&&e.descriptor!==void 0}function lc(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 f(i,t)}function uc(e,t,n,r){let i=lc(e,t,n);if(i===void 0)throw Error(`${n} required for ${r} action`);return i}function dc(e){return typeof e==`object`&&!!e}function fc(e){return typeof e==`string`&&l(e,{strict:!1})?e:void 0}function pc(e){let t=e.request.methodDetails;return dc(t)?{chainId:typeof t.chainId==`number`?t.chainId:void 0,escrowContract:fc(t.escrowContract),escrow:fc(t.escrow),feePayer:typeof t.feePayer==`boolean`?t.feePayer:void 0,feeToken:fc(t.feeToken),operator:fc(t.operator),sessionSnapshot:Ge(t,Ue.sessionSnapshot)}:{}}function mc(e,t){if(typeof e==`string`&&l(e,{strict:!1}))return e;throw Error(`tempo session challenge missing ${t}`)}function hc(e){if(typeof e==`string`)return BigInt(e);throw Error(`tempo session challenge missing amount`)}function gc(e){return typeof e==`string`?e:void 0}async function _c(e){let{allowCustomEscrow:t,challenge:n,escrowOverride:r,getClient:i}=e,a=pc(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=us(n,r,t),l=mc(n.request.recipient,`recipient`),u=mc(n.request.currency,`currency`);return{amount:hc(n.request.amount),challenge:n,chainId:s,client:o,escrow:c,feePayer:a.feePayer,feeToken:a.feeToken,key:vs({payee:l,token:u,escrow:c,chainId:s}),operator:a.operator,payee:l,snapshot:a.sessionSnapshot,suggestedDepositRaw:gc(n.request.suggestedDeposit),token:u}}async function vc(e){let{channelId:t,client:n,descriptor:r,expected:i,readChannelState:a=Jo}=e,o=Ro({...r,chainId:i.chainId,escrow:i.escrow});yc({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 yc(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(!Q(r.payee,a))throw Error(`context descriptor payee does not match challenge`);if(!Q(r.token,s))throw Error(`context descriptor token does not match challenge`);if(!Q(r.payer,o))throw Error(`context descriptor payer does not match account`);if(!Q(Lo(r),t))throw Error(`context descriptor authorizedSigner does not match account`)}function bc(e){let{context:t,snapshot:n}=e,r=t?.descriptor??n?.descriptor;if(r)return{...t,channelId:t?.channelId??n?.channelId,descriptor:r}}function xc(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=lc(t,n,`cumulativeAmount`);return o===void 0?a+r:o+r}async function Sc(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(!ns(i.escrow,i.chainId,{channelId:a.channelId,cumulativeAmount:s,signature:a.signature},Lo(i.descriptor)))throw Error(`session snapshot highest voucher signature is invalid`);let f=await vc({channelId:i.channelId,client:n,descriptor:i.descriptor,expected:{chainId:i.chainId,escrow:i.escrow,payee:i.descriptor.payee,payer:t.address,authorizedSigner:ss(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 Cc(e,t){return Q(e.address,t.payer)?Q(ss(e),Lo(t)):!1}function wc(e){let{account:t,entry:n,context:r,decimals:i,maxDeposit:a,resolved:o}=e;if(sc(r)){if(!cc(r))throw Error(`descriptor required for TIP-1034 session action`);return{type:`manual`,account:t,context:r,decimals:i,entry:n,resolved:o}}if(!n&&r?.channelId&&!r.descriptor)throw Error(`descriptor required to reuse TIP-1034 channel`);let s=bc({context:r,snapshot:o.snapshot});return!n&&s&&Cc(t,s.descriptor)&&(r?.descriptor!==void 0||Q(s.descriptor.payee,o.payee)&&Q(s.descriptor.token,o.token))?{type:`recover`,account:t,context:s,decimals:i,maxDeposit:a,resolved:o}:n?.opened&&Cc(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 Tc(e,t=!1,n){switch(e.type){case`open`:return Dc(e,t,n);case`recover`:return Oc(e);case`voucher`:return kc(e);case`manual`:return Ac(e,t,n)}}async function Ec(e,t){if(e)return await Zi(t.client,{account:t.account,amountOut:t.amountOut,tokenOut:t.tokenOut,tokenIn:e.tokenIn,slippage:e.slippage})}async function Dc(e,t,n){let{account:r,resolved:i}=e,a=zs({contextDepositRaw:e.context?.depositRaw,maxDeposit:e.maxDeposit,requestAmount:i.amount,suggestedDepositRaw:i.suggestedDepositRaw}),o=await gs(i.client,r,{chainId:i.chainId,deposit:a,escrow:i.escrow,feePayer:i.feePayer,feeToken:n,initialAmount:i.amount,operator:i.operator,payee:i.payee,prefixCalls:await Ec(t,{account:r.address,amountOut:a,client:i.client,tokenOut:i.token}),token:i.token});return{payload:o,entry:{channelId:o.channelId,cumulativeAmount:i.amount,deposit:a,descriptor:o.descriptor,escrow:i.escrow,chainId:i.chainId,opened:!0,...i.paymentScope&&{paymentScope:i.paymentScope}}}}async function Oc(e){let{account:t,context:n,decimals:r,maxDeposit:i,resolved:a}=e,{descriptor:o}=n,s=await vc({channelId:n.channelId,client:a.client,descriptor:o,expected:{chainId:a.chainId,escrow:a.escrow,payee:a.payee,payer:t.address,authorizedSigner:ss(t),token:a.token}}),c=xc({context:n,decimals:r,requestAmount:a.amount,settled:s.state.settled,snapshot:a.snapshot});if(c>s.state.deposit)throw Error(`recovered voucher amount exceeds on-chain channel deposit`);return Vs(c,i),{payload:await ms(a.client,t,o,c,a.chainId,a.escrow),entry:{channelId:s.channelId,cumulativeAmount:c,deposit:s.state.deposit,descriptor:o,escrow:a.escrow,chainId:a.chainId,opened:!0,...a.paymentScope&&{paymentScope:a.paymentScope}}}}async function kc(e){let{account:t,entry:n,resolved:r}=e,i=n.cumulativeAmount+r.amount;return Vs(i,e.maxDeposit),{payload:await ms(r.client,t,n.descriptor,i,r.chainId,r.escrow),entry:{...n,cumulativeAmount:i}}}async function Ac(e,t,n){let{account:r,context:i,decimals:a,resolved:o}=e,{descriptor:s}=i,c=Ro({...s,chainId:o.chainId,escrow:o.escrow});yc({channelId:i.channelId,descriptor:s,expectedChannelId:c,payee:o.payee,payer:r.address,authorizedSigner:ss(r),token:o.token});let l=await jc({account:r,channelId:c,context:i,decimals:a,descriptor:s,resolved:o},t,n);return{payload:l,entry:rc(e.entry,l)}}async function jc(e,t,n){switch(e.context.action){case`open`:return Mc(e);case`topUp`:return Nc(e,t,n);case`voucher`:return Pc(e);case`close`:return Fc(e)}}async function Mc(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=uc(r,i,`cumulativeAmount`,`open`),c=await ms(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 Nc(e,t,n){let{account:r,channelId:i,context:a,decimals:o,descriptor:s,resolved:c}=e,l=uc(a,o,`additionalDeposit`,`topUp`);return a.transaction?{action:`topUp`,type:`transaction`,channelId:i,transaction:a.transaction,descriptor:s,additionalDeposit:l.toString()}:_s(c.client,r,s,l,c.chainId,c.feePayer,c.escrow,await Ec(t,{account:r.address,amountOut:l,client:c.client,tokenOut:c.token}),n)}function Pc(e){let{account:t,context:n,decimals:r,descriptor:i,resolved:a}=e;return ms(a.client,t,i,uc(n,r,`cumulativeAmount`,`voucher`),a.chainId,a.escrow)}function Fc(e){let{account:t,context:n,decimals:r,descriptor:i,resolved:a}=e;return hs(a.client,t,i,uc(n,r,`cumulativeAmount`,`close`),a.chainId,a.escrow)}const Ic={CONNECTING:0,OPEN:1,CLOSING:2,CLOSED:3};function Lc(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=Ic.CLOSED,r=null}if(a.type===`open`&&(i=Ic.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 Rc(e){return{acceptedCumulative:BigInt(e.acceptedCumulative),deposit:BigInt(e.deposit),requiredCumulative:BigInt(e.requiredCumulative)}}function zc(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=Rs(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:Ys(s,u)}:i?{channel:u,state:Ks({challengeId:i,entry:u,spent:c.toString(),units:a.status===`active`?a.units:0})}:{channel:u}}async function Vc(e){if(e.event.channelId!==e.expectedChannelId)return{status:`ignored`,reason:`channel-mismatch`};let t=Rc(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 Hc(e){return e.method===Ve.tempo&&e.intent===He.session}function Uc(e){return Hc(e)&&Ge(e.request.methodDetails,Ue.sessionProtocol)===We.v2}function Wc(e){return Ge(e.request.methodDetails,Ue.sessionSnapshot)}function Gc(e,t,n){let r=e instanceof Request?e.headers:void 0;return{...t,headers:{...Z(r),...Z(t?.headers),[B.authorization]:n}}}function Kc(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 qc(e){let t=new URL(e.toString());return t.protocol===`ws:`&&(t.protocol=`http:`),t.protocol===`wss:`&&(t.protocol=`https:`),t}async function Jc(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 Yc(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 Xc({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(B.paymentReceipt);return i?co(i):void 0}async function Xc(e){let t=async t=>e.fetch(Kc(e.input),{method:`POST`,headers:{[B.authorization]:await e.createSessionCredential(t,e.context)}}),n=await t(e.challenge);if(n.status!==402)return n;let r=ut(n).find(Uc);return r?t(r):n}async function Zc(e){let t=Qc({channel:e.getChannel(),response:e.response});if(!t)return;let{channel:n,challenge:r,snapshot:i}=t;e.setChallenge(r);let a=BigInt(i.requiredCumulative),o=n.cumulativeAmount;await e.topUpIfNeeded({challenge:r,input:e.input,channelId:i.channelId,deposit:BigInt(i.deposit),requiredCumulative:a});let s=e.getChannel();if(!s?.descriptor||s.channelId!==i.channelId)return;let c=s.cumulativeAmount>a?s.cumulativeAmount:a,l=()=>e.restoreCumulative(i.channelId,o),u;try{let t=await e.createSessionCredential(r,{action:`voucher`,channelId:i.channelId,descriptor:s.descriptor,cumulativeAmountRaw:c.toString()});u=await e.fetch(e.input,Gc(e.input,e.init,t))}catch(e){throw await l(),e}return!u.ok&&!u.headers.get(B.paymentReceipt)&&await l(),u}function Qc(e){let t=ut(e.response).find(Uc);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 $c(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:{[B.authorization]:a}})},i=await r(e.target.challenge);if(i.status===402){let t=ut(i).find(Uc);t&&(e.setChallenge?.(t),i=await r(t,!0))}if(!i.ok){let e=await Jc(i),t=i.headers.get(B.wwwAuthenticate)??``;throw Error(`Close request failed with status ${i.status}${e?`: ${e}`:``}${t?` [${B.wwwAuthenticate}: ${t}]`:``}`)}let a=i.headers.get(B.paymentReceipt);if(!a)return;let o=co(a);if(!o.txHash||!D.validate(o.txHash,{strict:!0})||D.size(o.txHash)!==32||!Gs({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 el(e,t,n){let{onReceipt:r,signal:i,...a}=t??{},o={...a,headers:{...Z(a.headers),Accept:`text/event-stream`},...i?{signal:i}:{}},s=await n.doFetch(e,o);return!lo(s)&&n.getChannel()?.opened&&(s=await n.doFetch(e,o)),tl(e,s,{onReceipt:r,signal:i},n)}function tl(e,t,n,r){if(!lo(t))throw Error(`SSE response is not an event stream.`);if(!t.body)throw Error(`Response has no body.`);let i=r.getChallenge();return nl({onNeedVoucher:t=>sl({challenge:i,driver:r,input:e},t),onReceipt(e){r.acceptReceipt(e),n?.onReceipt?.(e)},response:t,signal:n?.signal})}async function*nl(e){for await(let t of rl(e))t.data!==void 0&&(yield t.data)}async function*rl(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=il(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=uo(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 il(e,t){for(let n=0;n<e.length;n++){let r=al(e,n,t);if(!r)continue;let i=al(e,n+r,t);if(i)return{index:n,length:r+i};n+=r-1}}function al(e,t,n){return e[t]===`
|
|
8
|
+
`?1:e[t]===`\r`?e[t+1]===`
|
|
9
|
+
`?2:t+1===e.length&&!n?0:1:0}function ol(e){let t=new AbortController,n=()=>t.abort(e.signal?.reason);e.signal?.addEventListener(`abort`,n,{once:!0}),e.signal?.aborted&&n();let r=rl({...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 sl(e,t){let n=e.driver.getChannel();if(!n||!e.challenge)return;let r=await Vc({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 Xc({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 cl(e){let t=new URL(e.input.toString()),n=qc(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=ut(r).find(Uc);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 ll(e){let t=await cl(e);return{...t,credential:await e.createSessionCredential(t.challenge,{})}}function ul(e){let{challenge:t,credential:n,socket:r}=e;return{challenge:t,channelId:_t(n).payload.channelId,closeReadyReceipt:null,deliveredChunks:0n,expectedCloseAmount:null,socket:r,tickCost:ao(t)}}function dl(e){let{challengeId:t,channelId:n,receipt:r}=e;return r.challengeId===t&&r.channelId===n}function fl(e){if(!dl(e))return`received mismatched payment-close-ready frame`;let t=Za(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 pl(e){let{challengeId:t,channelId:n,expectedCloseAmount:r,receipt:i}=e;if(!dl(e))return`received mismatched payment-receipt frame`;if(r!==null&&i.txHash&&!Gs({challengeId:t,channelId:n,expectedCloseAmount:r,minimumSpent:BigInt(r),receipt:i}))return`received mismatched payment-close receipt frame`}async function ml(e){let{challenge:t,credential:n,options:r,WebSocket:i,wsUrl:a}=e,o=new i(a,r?.protocols),s=ul({challenge:t,credential:n,socket:o});e.setSocketSession(s);let c=Lc(o),l=t=>{e.rejectReceipt(Error(t)),e.rejectCloseReady(Error(t)),(o.readyState===Ic.CONNECTING||o.readyState===Ic.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 gl({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 hl(o,c.emit,a),o.send(po(n)),await e.waitForReceipt(),c.socket}function hl(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 gl(e){let t=ho(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`:_l(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 vl(e,t.data);return;case`payment-receipt`:yl(e,t.data);return}}function _l(e,t){let n=e.driver.getChannel()?.cumulativeAmount??0n,r=fl({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 vl(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 Vc({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(po(i))}catch(t){e.failSocketFlow(t instanceof Error?t.message:`failed to create websocket voucher`)}}function yl(e,t){let n=pl({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 bl=new WeakMap;async function xl(e,t){let n=bl.get(e)??new Map;bl.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 Sl(e,t){try{return t?.channelId.toLowerCase()===e.channelId.toLowerCase()&&BigInt(t.acceptedCumulative)===e.cumulativeAmount}catch{return!1}}function Cl(e,t,n){try{let r=e.response?.headers.get(B.paymentReceipt);if(r){let e=co(r);if(e.challengeId===t.id&&Sl(n,e))return!0}}catch{}return e.challenges?.some(e=>Uc(e)?Sl(n,Wc(e)):!1)??!1}function wl(e,t){let n=e.snapshot?.descriptor,r=n&&u(n.payee,t.payee)&&u(n.operator,t.operator)&&u(n.token,t.token);return{...e,operator:t.operator,payee:t.payee,paymentScope:{payee:e.payee,token:e.token},snapshot:r?e.snapshot:void 0,token:t.token}}async function Tl(e,t){let n=t?.descriptor??e.snapshot?.descriptor;if(!n||!Do({chainId:e.chainId,descriptor:n}))return;let r=t?.action===`close`;if(!r&&!Oo(e.challenge)||!u(e.escrow,`0x4d50500000000000000000000000000000000000`))return;let i=await Io(e.client,{active:!r,chainId:e.chainId,descriptor:n,merchant:e.payee,targetToken:e.token});if(!i)throw Error(`Machine-token channel is not bound to this merchant session challenge.`);return wl(e,i)}function El(e={}){let{account:t,allowCustomEscrow:n=!1,autoSwap:r,channelStore:i,decimals:a=6,escrow:o,getClient:s,maxDeposit:c,topUpAmount:l,onChannelUpdate:d,resolveAccount:p}=e,m=Wi({chain:S,getClient:s,rpcUrl:zn}),h=Hi({account:t}),g=c===void 0?void 0:f(c,a),_=l===void 0?void 0:f(l,a),v=i??bs(),y=async e=>{e&&(e.opened?await v.set(e):await v.delete(ys(e)),d?.(e))},b=async(e,t,n)=>{let r=h(e.client,t),i=t?.action?t.descriptor:n?.descriptor??bc({context:t,snapshot:e.snapshot})?.descriptor;return await p?.({account:r,chainId:e.chainId,operation:{kind:`authorizePaymentChannel`,...i?{authority:Lo(i)}:{}}})??r},x=e=>_c({allowCustomEscrow:n,challenge:e,escrowOverride:o,getClient:m}),C=async(e,t)=>{let n,r=t?.descriptor??e.snapshot?.descriptor;if(r||sc(t)){let i=r?await Tl(e,t):void 0,a=i??e;return{account:n,entry:await v.get(a.key),machine:i!==void 0,resolved:a}}let i=await v.get(e.key);if(i?.opened){if(!Do({chainId:e.chainId,descriptor:i.descriptor}))return{account:n,entry:i,machine:!1,resolved:e};let t=await Tl(e,{descriptor:i.descriptor});if(!t)throw Error(`Machine-token channel is not bound to this merchant session challenge.`);return{account:n,entry:i,machine:!0,resolved:t}}if(!Oo(e.challenge)||!u(e.escrow,`0x4d50500000000000000000000000000000000000`))return{account:n,entry:void 0,machine:!1,resolved:e};let a=await Fo(e.client,{chainId:e.chainId,merchant:e.payee,targetToken:e.token}).catch(()=>void 0);if(!a)return{account:n,entry:void 0,machine:!1,resolved:e};let o=wl(e,a);n=await b(o,t,void 0);let s=zs({contextDepositRaw:t?.depositRaw,maxDeposit:g,requestAmount:e.amount,suggestedDepositRaw:e.suggestedDepositRaw});return await Ao(o.client,{account:n.address,amount:s,token:o.token})?{account:n,entry:void 0,machine:!0,resolved:o}:{account:n,entry:void 0,machine:!1,resolved:e}},w=Dt(Ca,{canHandleChallenge:({challenge:e})=>Uc(e),context:oc,async createCredential(e){let{challenge:t,context:n}=e,i=ri(e),o=()=>{};try{let e=await x(t);!sc(n)&&n?.descriptor===void 0&&(o=await xl(v,e.key),i&&(await v.get(e.key))?.opened&&await i.prepare());let{account:s,entry:c,machine:l,resolved:u}=await C(e,n),d=wc({account:s??await b(u,n,c),entry:c,context:n,decimals:a,maxDeposit:g,resolved:u});if(l&&d.type===`manual`&&d.context.action===`topUp`){let e=uc(d.context,d.decimals,`additionalDeposit`,`topUp`);if(!await Ao(d.resolved.client,{account:d.account.address,amount:e,token:d.resolved.token}))throw Error(`Insufficient machine-token balance for session top-up.`)}let f=ko({chainId:u.chainId,override:u.feeToken,paymentToken:u.token}),p=await Tc(d,Qi(n?.autoSwap??r,Xi),f),{payload:m}=p;if(l&&m.action!==`topUp`){if(m.action===`close`){let e=await Jo(d.resolved.client,m.channelId,d.resolved.escrow);if(e.deposit===0n)throw Error(`Cannot authorize a machine-token refund for an empty channel.`);let t=BigInt(m.cumulativeAmount)===e.deposit?m.signature:(await ms(d.resolved.client,d.account,m.descriptor,e.deposit,d.resolved.chainId,d.resolved.escrow)).signature;m={...m,refundSignature:t}}let e=await No(d.resolved.client,d.account,{authorization:{channelId:m.channelId,cumulativeAmount:BigInt(m.cumulativeAmount)},chainId:d.resolved.chainId,router:d.resolved.operator});m={...m,authorizationSignature:e}}i&&d.type===`open`||await y(p.entry);let h=await ds(t,m,u.chainId,d.account);if(i&&d.type===`open`&&p.entry){let e=p.entry;i.settle=async n=>{let r=n.status===`accepted`||Cl(n,t,e);if(!r&&n.status===`pending`)return!1;try{if(r){let t=await v.get(u.key);(!t?.opened||t.channelId.toLowerCase()!==e.channelId.toLowerCase())&&await y(e)}return!0}finally{o()}}}else o();return h}catch(e){throw o(),e}}}),T=async({challenge:e,channel:t,deposit:n,fetch:r,input:i,requiredCumulative:a})=>{let o=t.deposit>n?t.deposit:n,s=Bs({deposit:o,maxDeposit:g,requiredCumulative:a,suggestedDeposit:e.request.suggestedDeposit===void 0?void 0:BigInt(e.request.suggestedDeposit),topUpAmount:_});s>0n&&await Yc({additionalDeposit:s,challenge:e,channel:t,channelId:t.channelId,createSessionCredential:(e,t)=>w.createCredential({challenge:e,context:t}),fetch:r,input:i});let c=o+s;if(c===t.deposit)return;let l=await v.get(ys(t)),u=l?.channelId.toLowerCase()===t.channelId.toLowerCase()?l:t,f={...u,deposit:u.deposit>c?u.deposit:c};await v.set(f),d?.(f)};return Yr(w,async({challenge:e,context:t,fetch:n,input:r})=>{if(!Uc(e))return;let i=t===void 0?void 0:oc.parse(t);if(sc(i))return;let a=await x(e),{entry:o,resolved:s}=await C(a,i).catch(()=>({entry:void 0,resolved:a}));if(!o?.opened)return;let c=s.snapshot?.channelId.toLowerCase()===o.channelId.toLowerCase()?s.snapshot:void 0,l=o.cumulativeAmount+ao(e),u=c?BigInt(c.requiredCumulative):l,d=u>l?u:l,f=c?BigInt(c.deposit):o.deposit,p=f>o.deposit?f:o.deposit;d<=p&&p===o.deposit||!Cc(await b(s,i,o),o.descriptor)||await T({challenge:e,channel:o,deposit:p,fetch:n,input:r,requiredCumulative:d})}),ei(w,async({challenge:e,credential:t,fetch:n,headers:r,input:i,refetch:a,response:o,signal:s})=>{if(!Uc(e))return o;let c=io(_t(t).payload);if(!lo(o))return c.action===`open`&&r.get(`accept`)?.toLowerCase().includes(`text/event-stream`)?await a?.()??o:o;let l=await x(e).then(async e=>await Tl(e,c)??e).catch(()=>void 0),u=l?await v.get(l.key):void 0,d={assertVoucherWithinLocalLimit:e=>Vs(e,g),createSessionCredential:(e,t)=>w.createCredential({challenge:e,context:t}),fetch:n,getChannel:()=>u??null,async topUpIfNeeded({deposit:t,requiredCumulative:r}){u&&await T({challenge:e,channel:u,deposit:u.deposit>t?u.deposit:t,fetch:n,input:i,requiredCumulative:r})}};return ol({onNeedVoucher:t=>sl({challenge:e,driver:d,input:i},t),onReceipt(){},response:o,signal:s})})}const Dl=new WeakMap;function Ol(e,t){Dl.set(e,t)}function kl(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 Al(e){let t=kl(`close-ready`),n=kl(`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 jl(e){return e.method===Ve.tempo&&e.intent===He.charge}function Ml(e){if(!jl(e)||typeof e.request.amount!=`string`)return!1;try{return BigInt(e.request.amount)===0n}catch{return!1}}function Nl(e,t,n){if(!n)return t;let r={...Z(e instanceof Request?e.headers:void 0),...Z(t?.headers)};return Object.keys(r).some(e=>e.toLowerCase()===B.paymentSession.toLowerCase())?t:{...t,headers:{...r,[B.paymentSession]:n}}}function Pl(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:f(e.maxDeposit,t),topUpAmount:e.topUpAmount===void 0?null:f(e.topUpAmount,t),WebSocket:n}}function Fl(e){let t=e.allowCustomEscrow??!1,n=Pl(e),r=Wi({chain:S,getClient:e.client?()=>e.client:e.getClient,rpcUrl:zn}),i=Hi({account:e.account}),a=qs(),o=Al({getSocketSession:()=>a.socketSession}),s=e.channelStore??bs(),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=ys(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=ys(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 F(e.committed??e.previous)}}function m(e){let t=Ge(e.request.methodDetails,Ue.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=Qs({channel:a.channel,spent:a.spent,state:a.state}),!0;return!1}function h(e){return js(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=Qs({channel:a.channel,spent:a.spent,state:a.state}))}let v=El({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)}});ti(v);let y=Ea({account:e.account,getClient:e.client?()=>e.client:e.getClient}),b=ci({fetch:n.fetch,methods:[v],onChallenge:async(e,t)=>{if(!Hc(e))return;let n=l,r=n&&n.challengesReceived>0&&e.id===a.lastChallenge?.id,i=r&&nt(e)===nt(a.lastChallenge);n&&n.challengesReceived++,!i&&(m(e)||(n?.created.size?await p():r&&await F(n.committed??n.previous)),a.lastChallenge=e,h({type:`challengeReceived`,challengeId:e.id}))}});function x(e,t){return v.createCredential({challenge:e,context:t})}function C(e){Js({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,n){let o=t.headers.get(B.paymentSessionSnapshot);if(!o)return;let s=Ds(o),c=await r({chainId:s.chainId}),l=i(c),u=await Sc({account:await e.resolveAccount?.({account:l,chainId:s.chainId,operation:{authority:Lo(s.descriptor),kind:`authorizePaymentChannel`}})??l,client:c,snapshot:s}),f=n&&ps({descriptor:u.entry.descriptor,paymentScope:n})?{...u.entry,paymentScope:n}:u.entry;return j(f.cumulativeAmount),await Promise.resolve(d.set(f)).catch(()=>void 0),a.channel=f,a.spent=u.spent,f}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:{...Z(i),...Z(r?.headers),[B.acceptPayment]:`${Ve.tempo}/${He.charge}`}};try{let e=await n.fetch(l,u);if(e.status!==402)return await T(e);let t=ut(e).find(jl);if(!t||!Ml(t))return;let r=await y.createCredential({challenge:t,context:{}}),i=await n.fetch(l,{...u,headers:{...Z(u.headers),[B.authorization]:r}});return i.ok?await T(i,{payee:t.request.recipient,token:t.request.currency}):void 0}catch{return}}function D(e,t){let n=a.socketSession;return Xs({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(Ro({...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.settled),a=BigInt(n.spent);if(r<0n||i<0n||a<0n)throw Error(`close snapshot amounts must not be negative`);if(a>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,settled:i,spent:a}}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),i=fs(e.channel),a=r?i?r.spent>r.settled?r.spent:r.settled:r.acceptedCumulative:D(t,e.channelId);if(a>e.channel.cumulativeAmount)throw Error(`fallback close amount exceeds local voucher state`);return j(a),a.toString()}function j(e){Fs({cumulativeAmount:e,maxVoucherCumulative:n.maxVoucherCumulative})}async function M(e){let{knownDeposit:t,...r}=e,i=await Yc({...r,channel:a.channel,createSessionCredential:x,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=Bs({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 P(e,t){let n=Zs({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 F(e){let t=$s(e,a.channel);a.channel=t.channel,a.spent=t.spent,a.state=t.state,a.channel?.opened&&await s.set(a.channel)}function I(e){let t=e.headers.get(B.paymentReceipt),n=t?co(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 ee(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=Qs({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=Nl(e,t,a.channel?.opened?a.channel.channelId:void 0),s=!r.channel?.opened;async function c(){let n=i.resumed;return!s||!n||n.opened&&(fs(n)||ps(n))?!1:(s=!1,await f(n),o=Nl(e,t,void 0),!0)}for(;;){let t;try{t=await b(e,o)}catch(e){if(i.created.size?await p():await F(i.committed??r),await c())continue;throw e}let s=I(t),l=!1;if(s.status===402){let t=await Zc({input:e,init:o,response:s,createSessionCredential:x,fetch:n.fetch,getChannel:()=>a.channel,restoreCumulative:P,setChallenge(e){a.lastChallenge=e},topUpIfNeeded:N});t&&(l=!0,s=I(t))}if(!l&&!s.ok&&!s.receipt){if(i.created.size?await p():await F(i.committed??r),await c())continue;return s}return s}}finally{l=void 0}}async function te(e){let t=await $c({createSessionCredential:x,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 ne={createSessionCredential:x,doFetch:ee,fetch:n.fetch,getChannel:()=>a.channel,getChallenge:()=>a.lastChallenge,assertVoucherWithinLocalLimit:j,acceptReceipt(e){C(e)},topUpIfNeeded:N},L={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:ee,async topUp(e){let t=zc({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 el(e,t,ne)},async ws(e,t){if(!n.WebSocket)throw Error("No WebSocket implementation available. Pass `webSocket` to sessionManager() in this runtime.");let r=qc(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 ll({async createSessionCredential(e,t){return a.lastChallenge=e,await Zr(v,{challenge:e,context:t,fetch:n.fetch,input:r}),x(e,t)},fetch:n.fetch,input:e,onProbeUrl(e){a.lastUrl=e.toString()},probeInit:Nl(r,i,s),signal:t?.signal});return a.lastChallenge=c,ml({challenge:c,credential:l,httpUrl:u,WebSocket:n.WebSocket,wsUrl:d,options:t,createSessionCredential:x,getChannel:()=>a.channel,setSocketSession(e){a.socketSession=e},async refreshChallenge(){let e=await cl({fetch:n.fetch,input:u,probeInit:Nl(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=Hs({channel:a.channel,currentSocket:e,lastChallenge:a.lastChallenge});if(!t)return;let n=e?.socket;if(e&&n?.readyState===Ic.OPEN){let r=await ec({activeSocket:n,createSessionCredential:x,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 te(t)}};return Ol(L,{consumeSseResponse(e,t,n){return tl(e,t,n,ne)},rehydrate({channel:e,challenge:t,input:n,spent:r}){if(!e.opened)throw Error(`Cannot restore a closed session channel.`);if(!Hc(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})}}),L}(function(e){e.serializeSnapshot=Es,e.deserializeSnapshot=Ds})(Fl||={});const Il=(1n<<64n)-1n,Ll={dev_second:1n,day:86400n,week:604800n};function Rl(e){return e instanceof Date?e:new Date(e)}function zl(e){let t=e.getTime();if(!Number.isFinite(t))throw new J({reason:`subscriptionExpires is invalid`});if(t%1e3!=0)throw new J({reason:`subscriptionExpires must be representable as whole seconds`});let n=t/1e3;if(n<=0||!Number.isSafeInteger(n))throw new J({reason:`subscriptionExpires cannot be represented in a Tempo key authorization`});return n}function Bl(e){if(!/^[1-9]\d*$/.test(e.periodCount))throw new J({reason:`periodCount is invalid`});let t=Ll[e.periodUnit];if(t===void 0)throw new J({reason:`periodUnit is invalid`});let n=BigInt(e.periodCount)*t;if(n>Il)throw new J({reason:`subscription period cannot be represented as an unsigned 64-bit integer`});if(n>BigInt(2**53-1))throw new J({reason:`subscription period cannot be represented exactly by this Tempo client`});return Number(n)}function Vl(e){let{challengeExpires:t,request:n}=e;Bl(n);let r=zl(Rl(n.subscriptionExpires));if(t){let e=Math.floor(new Date(t).getTime()/1e3);if(!Number.isFinite(e)||r<=e)throw new J({reason:`subscriptionExpires must be strictly later than challenge expires`})}}function Hl(e){return[{address:eu(e.currency,`currency`),selector:`0x95777d59`,recipients:[eu(e.recipient,`recipient`)]}]}async function Ul(e){let{accessKey:t,account:n,chainId:r,request:i}=e;if(typeof n.sign!=`function`)return;let a=Gl({accessKey:t,chainId:r,request:i}),o=await n.sign({hash:R.getSignPayload(a)}),s=z.from(o);if(s.type===`keychain`||s.type===`multisig`)throw new J({reason:`keyAuthorization must use a primitive signature`});return R.from(a,{signature:o})}function Wl(e){let{accessKey:t,chainId:n,payload:r,request:i}=e;if(r.type!==`keyAuthorization`)throw new J({reason:`invalid keyAuthorization payload`});let a=Kl(r.signature),o=ql(a);return Jl({accessKey:t,authorization:a,chainId:n}),Yl(a,i),Zl(Xl(a),i),Ql(a.scopes,i),{authorization:a,source:{address:$l(a,o),chainId:n}}}function Gl(e){let{accessKey:t,chainId:n,request:r}=e;return R.from({address:eu(t.accessKeyAddress,`accessKeyAddress`),chainId:BigInt(n),expiry:zl(Rl(r.subscriptionExpires)),limits:[{token:eu(r.currency,`currency`),limit:BigInt(r.amount),period:Bl(r)}],scopes:Hl(r),type:t.keyType})}function Kl(e){try{return R.deserialize(e)}catch(e){throw e instanceof R.InvalidSignatureTypeError?new J({reason:`keyAuthorization must use a primitive signature`}):new J({reason:`invalid keyAuthorization payload`})}}function ql(e){let t=e.signature;if(!t)throw new J({reason:`keyAuthorization must use a primitive signature`});return t}function Jl(e){let{accessKey:t,authorization:n,chainId:r}=e;if(n.chainId!==BigInt(r))throw new J({reason:`keyAuthorization chainId mismatch`});if(t){if(!u(n.address,eu(t.accessKeyAddress,`accessKeyAddress`)))throw new J({reason:`keyAuthorization access key mismatch`});if(n.type!==t.keyType)throw new J({reason:`keyAuthorization key type mismatch`})}}function Yl(e,t){if(Vl({request:t}),e.expiry!==zl(Rl(t.subscriptionExpires)))throw new J({reason:`keyAuthorization expiry mismatch`})}function Xl(e){let[t]=e.limits??[];if(!t||e.limits?.length!==1)throw new J({reason:`keyAuthorization must contain exactly one token limit`});return t}function Zl(e,t){if(!u(e.token,eu(t.currency,`currency`)))throw new J({reason:`keyAuthorization currency mismatch`});if(e.limit!==BigInt(t.amount))throw new J({reason:`keyAuthorization amount mismatch`});if(e.period!==Bl(t))throw new J({reason:`keyAuthorization period mismatch`})}function Ql(e,t){if(!e||e.length!==1)throw new J({reason:`keyAuthorization must contain a recipient-scoped transferWithMemo call`});let n=eu(t.currency,`currency`),r=eu(t.recipient,`recipient`),i=new Set;for(let t of e){if(!u(t.address,n))throw new J({reason:`keyAuthorization call target mismatch`});let e=tu(t.selector);if(e!==`0xa9059cbb`&&e!==`0x95777d59`)throw new J({reason:`keyAuthorization selector not allowed`});if(i.has(e))throw new J({reason:`keyAuthorization duplicate selector`});if(i.add(e),t.recipients?.length!==1||!u(t.recipients[0],r))throw new J({reason:`keyAuthorization recipient mismatch`})}if(!i.has(`0x95777d59`))throw new J({reason:`keyAuthorization must allow transferWithMemo`})}function $l(e,t){let n=R.getSignPayload(e);try{let e=z.extractAddress({payload:n,signature:t});if(!z.verify(t,{address:e,payload:n}))throw new J({reason:`keyAuthorization signature is invalid`});return e}catch(e){throw e instanceof J?e:new J({reason:`keyAuthorization signature is invalid`})}}function eu(e,t){if(!l(e))throw new J({reason:`${t} must be an address`});return e.toLowerCase()}function tu(e){return typeof e==`string`?e.toLowerCase():``}const nu=H.object({accessKey:H.optional(H.custom()),account:H.optional(H.custom())});function ru(e={}){let t=Wi({chain:I,getClient:e.getClient,rpcUrl:zn}),n=Hi({account:e.account});return Dt(wa,{context:nu,async createCredential({challenge:r,context:i}){let a=r.request.methodDetails?.chainId??Y.testnet,o=await t({chainId:a}),s=n(o,i),c=i?.accessKey??e.accessKey??r.request.methodDetails?.accessKey;if(!c)throw Error("No `accessKey` provided. The subscription challenge must include `accessKey`, or the client must pass one to parameters/context.");au(r.request),await e.validateRequest?.(r.request);let l=await iu(o,{accessKey:c,account:s,chainId:a,request:r.request}),d=Wl({accessKey:c,chainId:a,payload:{signature:R.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 xt({challenge:r,payload:{signature:R.serialize(l),type:`keyAuthorization`},source:`did:pkh:eip155:${a}:${s.address.toLowerCase()}`})}})}async function iu(e,t){let{accessKey:n,account:r,chainId:i,request:a}=t,o=await Ul({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:zl(Rl(a.subscriptionExpires)),keyType:n.keyType,limits:[{token:a.currency,limit:D.fromNumber(BigInt(a.amount)),period:Bl(a)}],scopes:Hl(a)}]});return R.fromRpc(s.keyAuthorization)}function au(e){Bl(e),zl(Rl(e.subscriptionExpires))}const ou=Object.assign(El,{manager:Fl}),su=Object.assign(yo,{method:Ja});function cu(e={}){return[Ea(e),ou(e)]}(function(e){e.charge=Ea,e.common=cu,e.session=ou,e.sessionLegacy=su,e.subscription=ru})(cu||={});const lu=F.union([F.boolean(),F.literal(`true`).transform(()=>!0),F.literal(`false`).transform(()=>!1)]);async function uu(e){process.stdout.write(Buffer.from(await e.arrayBuffer()))}const du=F.object({allowCustomEscrow:F.optional(lu),autoSwap:F.optional(lu),channel:F.optional(F.coerce.string()),deposit:F.optional(F.union([F.string(),F.number()])),payWith:F.optional(F.string()),slippage:F.optional(F.coerce.number()),tokenIn:F.optional(F.string())}),fu=[`allowCustomEscrow`,`autoSwap`,`channel`,`deposit`,`payWith`,`slippage`,`tokenIn`];function pu(){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=yu(i),u=Cu({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)&&Mu()){g=!0;let t=Au(a);if(t){let i=Wn(r.rpcUrl,{network:r.network});h=e({chain:await Gn({network:r.network,rpcUrl:i}),transport:c(i)}),xu({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=Pu();if(e){let t=await nr(e).get();t&&(m=se(t))}if(!m)throw r.account?new Pn({code:`ACCOUNT_NOT_FOUND`,message:`Account "${a}" not found.`,exitCode:69}):new Pn({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)}),xu({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 Nu(t)}};if(!m||!h)throw new Pn({code:`ACCOUNT_NOT_FOUND`,message:`Tempo requires a configured account.`,exitCode:69});let v=cu({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 Pn({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=Tu(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 xt({challenge:n,payload:{action:o,channelId:e,descriptor:s,cumulativeAmount:r.toString(),signature:await ts(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=_t(r),g=n.request,_=g.methodDetails,v=h.payload.channelId,y=_?.escrowContract??_?.escrow??`0x4d50500000000000000000000000000000000000`,b=_?.chainId??0,x=BigInt(g.amount),S=`cumulativeAmount`in h.payload&&h.payload.cumulativeAmount?BigInt(h.payload.cumulativeAmount):0n;if(`descriptor`in h.payload&&(t.descriptor=h.payload.descriptor),s>=1){if(h.payload.action===`open`){let e=g.suggestedDeposit,t=e?` ${X.dim(`(deposit ${e} ${u})`)}`:``;m(`${l?``:`
|
|
10
|
+
`}${X.dim(`Channel opened ${h.payload.channelId}`)}${t}\n`)}else m(`${l?``:`
|
|
11
|
+
`}${X.dim(`Channel reused ${h.payload.channelId}`)}\n`)}let C=i;C.ok&&!C.headers.get(`Content-Type`)?.includes(`text/event-stream`)&&h.payload.action===`open`&&`cumulativeAmount`in h.payload&&(S=BigInt(h.payload.cumulativeAmount));let T=C.headers.get(B.paymentReceipt);if(T)try{let e=JSON.parse(w.toString(T));hu(e,S),typeof e.acceptedCumulative==`string`&&e.acceptedCumulative&&Eu(v,S),s>=1&&mu(e,{info:m,shownKeys:p,tokenSymbol:u,tokenDecimals:d,explorerUrl:f,handler:this,prefix:`
|
|
12
|
+
`})}catch{}return(C.headers.get(`Content-Type`)??``).includes(`text/event-stream`)?await gu(C,{challenge:n,channelId:v,escrowContract:y,chainId:b,cumulativeAmount:S,tickCost:x,fetchUrl:a,fetchInit:o,session:t,info:m,verbose:s,shownKeys:p,tokenSymbol:u,tokenDecimals:d,explorerUrl:f,handler:this}):(await uu(C),v&&y&&b&&(l&&m(`
|
|
13
|
+
`),l&&!await e.confirm(`Close channel?`,!0)?s>=1&&m(`${X.dim(`Kept channel open.`)}\n`):await _u({channelId:v,cumulativeAmount:S,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 mu(e,t){t.info(`${t.prefix??``}${X.bold(X.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} ${X.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(` ${X.dim(e.padEnd(a))} ${r}\n`);t.prefix&&t.info(`
|
|
14
|
+
`)}function hu(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 gu(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 vu():void 0,c=(()=>{if(!s||!X.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:{[B.authorization]:a}})}catch(e){t.info(X.dim(X.yellow(` [voucher failed: ${e instanceof Error?e.message:e}]`)))}o=``;continue}if(o===`payment-receipt`){if(t.verbose>=1)try{mu(JSON.parse(e),{info:t.info,shownKeys:t.shownKeys,tokenSymbol:t.tokenSymbol,tokenDecimals:t.tokenDecimals,explorerUrl:t.explorerUrl,handler:t.handler,prefix:`
|
|
15
|
+
|
|
16
|
+
`})}catch{}o=``;continue}if(e.length===0)u(`
|
|
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 _u({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 _u(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:{...Z(e.fetchInit.headers),Authorization:t}});if(n.ok){if(Du(e.channelId),e.verbose>=1){let t=n.headers.get(B.paymentReceipt),r;if(t)try{let e=JSON.parse(w.toString(t));typeof e.txHash==`string`&&(r=e.txHash)}catch{}let i=r&&e.explorerUrl?` ${X.dim(Bn(`${e.explorerUrl}/tx/${r}`,r))}`:``;e.info(`${X.dim(`Channel closed.`)} ${X.dim(`Spent ${Hn(e.cumulativeAmount,e.tokenSymbol,e.tokenDecimals)}.`)}${i}\n`)}}else{let t=await n.text().catch(()=>``);e.info(`\n${X.dim(X.yellow(`Channel close failed`))} ${X.dim(`(${n.status})`)}\n`),e.info(`${X.dim(` channelId: ${e.channelId}`)}\n${X.dim(` cumulativeAmount: ${e.cumulativeAmount}`)}\n${X.dim(` escrowContract: ${e.escrowContract}`)}\n${X.dim(` chainId: ${e.chainId}`)}\n${X.dim(` response: ${t||`(empty)`}`)}\n`)}}function vu(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 yu(e){return bu(du,e,fu)}function bu(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 xu(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 Pn({code:`CHAIN_MISMATCH`,message:`Challenge requires chainId ${t}, but RPC is chainId ${e.clientChainId}.${n}`,exitCode:2})}function Su(e){if(e)return e.split(`,`).map(e=>e.trim()).filter(Boolean)}function Cu(e){let t=Su(e.tokenIn)??Su(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 wu(){return P.join(process.env.XDG_CONFIG_HOME||P.join(N.homedir(),`.config`),`mppx`,`channels`)}function Tu(e){try{let t=M.readFileSync(P.join(wu(),e),`utf-8`).trim();return t?BigInt(t):void 0}catch{return}}function Eu(e,t){let n=wu();M.mkdirSync(n,{recursive:!0}),M.writeFileSync(P.join(n,e),t.toString(),`utf-8`)}function Du(e){try{M.unlinkSync(P.join(wu(),e))}catch{}}function Ou(){return N.platform()===`darwin`?P.join(N.homedir(),`Library`,`Application Support`,`tempo`,`wallet`,`keys.toml`):P.join(process.env.XDG_DATA_HOME||P.join(N.homedir(),`.local`,`share`),`tempo`,`wallet`,`keys.toml`)}function ku(){try{let e=M.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 Au(e){let t=ku();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 ju;function Mu(){if(ju!==void 0)return ju;try{j.execFileSync(`which`,[`tempo`],{stdio:`ignore`}),ju=!0}catch{ju=!1}return ju}async function Nu(e){return new Promise((t,n)=>{j.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 Pu(){let e=er();if(Vn(e.get())&&!Mu()&&N.platform()===`darwin`)try{let t=j.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,dr as stripe,pu as tempo};
|
|
@@ -1,6 +1,5 @@
|
|
|
1
1
|
import * as child from 'node:child_process';
|
|
2
2
|
import * as fs from 'node:fs';
|
|
3
|
-
import { createRequire } from 'node:module';
|
|
4
3
|
import * as os from 'node:os';
|
|
5
4
|
import * as path from 'node:path';
|
|
6
5
|
import { Errors, z } from 'incur';
|
|
@@ -17,7 +16,7 @@ import { signVoucher } from '../../tempo/session/precompile/Voucher.js';
|
|
|
17
16
|
import { createDefaultStore, createKeychain, resolveAccountName } from '../account.js';
|
|
18
17
|
import { fetchTokenInfo, fmtBalance, isTempoAccount, isTestnet, link, pc, resolveChain, resolveRpcUrl, } from '../utils.js';
|
|
19
18
|
import { createPlugin } from './plugin.js';
|
|
20
|
-
const
|
|
19
|
+
const packageName = 'mppx';
|
|
21
20
|
const booleanOption = z.union([
|
|
22
21
|
z.boolean(),
|
|
23
22
|
z.literal('true').transform(() => true),
|
|
@@ -27,6 +26,7 @@ async function writeResponseBody(response) {
|
|
|
27
26
|
process.stdout.write(Buffer.from(await response.arrayBuffer()));
|
|
28
27
|
}
|
|
29
28
|
const tempoOptionSchema = z.object({
|
|
29
|
+
allowCustomEscrow: z.optional(booleanOption),
|
|
30
30
|
autoSwap: z.optional(booleanOption),
|
|
31
31
|
channel: z.optional(z.coerce.string()),
|
|
32
32
|
deposit: z.optional(z.union([z.string(), z.number()])),
|
|
@@ -35,6 +35,7 @@ const tempoOptionSchema = z.object({
|
|
|
35
35
|
tokenIn: z.optional(z.string()),
|
|
36
36
|
});
|
|
37
37
|
const tempoOptionKeys = [
|
|
38
|
+
'allowCustomEscrow',
|
|
38
39
|
'autoSwap',
|
|
39
40
|
'channel',
|
|
40
41
|
'deposit',
|
|
@@ -186,6 +187,9 @@ export function tempo() {
|
|
|
186
187
|
});
|
|
187
188
|
const methods = tempoMethods({
|
|
188
189
|
account,
|
|
190
|
+
...(tempoOpts.allowCustomEscrow !== undefined
|
|
191
|
+
? { allowCustomEscrow: tempoOpts.allowCustomEscrow }
|
|
192
|
+
: {}),
|
|
189
193
|
getClient: () => client,
|
|
190
194
|
...(autoSwap !== undefined ? { autoSwap } : {}),
|
|
191
195
|
maxDeposit: (() => {
|
|
@@ -889,7 +893,7 @@ function fallbackFromTempo() {
|
|
|
889
893
|
for (const block of stdout.split('keychain:')) {
|
|
890
894
|
const serviceMatch = block.match(/"svce"<blob>="([^"]*)"/);
|
|
891
895
|
const accountMatch = block.match(/"acct"<blob>="([^"]*)"/);
|
|
892
|
-
if (serviceMatch?.[1] ===
|
|
896
|
+
if (serviceMatch?.[1] === packageName && accountMatch?.[1])
|
|
893
897
|
mppxAccounts.push(accountMatch[1]);
|
|
894
898
|
}
|
|
895
899
|
if (mppxAccounts.length > 0) {
|
|
@@ -10,14 +10,16 @@ function assertCloseChallengeScope(challenge, channel) {
|
|
|
10
10
|
const chainId = challenge.request.methodDetails?.chainId;
|
|
11
11
|
if (chainId !== undefined && chainId !== channel.chainId)
|
|
12
12
|
throw new Error('Close challenge changed the session chain.');
|
|
13
|
+
if (resolveEscrow(challenge, channel.escrow).toLowerCase() !== channel.escrow.toLowerCase())
|
|
14
|
+
throw new Error('Close challenge changed the session escrow.');
|
|
15
|
+
const payee = channel.paymentScope?.payee ?? channel.descriptor.payee;
|
|
16
|
+
const token = channel.paymentScope?.token ?? channel.descriptor.token;
|
|
13
17
|
if (typeof challenge.request.recipient !== 'string' ||
|
|
14
|
-
challenge.request.recipient.toLowerCase() !==
|
|
18
|
+
challenge.request.recipient.toLowerCase() !== payee.toLowerCase())
|
|
15
19
|
throw new Error('Close challenge changed the session payee.');
|
|
16
20
|
if (typeof challenge.request.currency !== 'string' ||
|
|
17
|
-
challenge.request.currency.toLowerCase() !==
|
|
21
|
+
challenge.request.currency.toLowerCase() !== token.toLowerCase())
|
|
18
22
|
throw new Error('Close challenge changed the session token.');
|
|
19
|
-
if (resolveEscrow(challenge).toLowerCase() !== channel.escrow.toLowerCase())
|
|
20
|
-
throw new Error('Close challenge changed the session escrow.');
|
|
21
23
|
const snapshot = getSessionSnapshot(challenge);
|
|
22
24
|
if (snapshot && snapshot.channelId.toLowerCase() !== channel.channelId.toLowerCase())
|
|
23
25
|
throw new Error('Close challenge changed the session channel.');
|
|
@@ -45,6 +47,7 @@ export async function closeWithSessionManager(parameters) {
|
|
|
45
47
|
const manager = sessionManager({
|
|
46
48
|
...parameters.manager,
|
|
47
49
|
bootstrap: false,
|
|
50
|
+
escrow: parameters.channel.escrow,
|
|
48
51
|
fetch: validatedFetch,
|
|
49
52
|
});
|
|
50
53
|
getSessionManagerInternals(manager).rehydrate(parameters);
|
|
@@ -28,6 +28,8 @@ export type PersistentSessionRequestParameters = {
|
|
|
28
28
|
};
|
|
29
29
|
/** Resolves `--session` and the `-M channel=` compatibility alias. */
|
|
30
30
|
export declare function resolveSessionSelection(session: string, channelAlias: string | undefined): SessionSelection;
|
|
31
|
+
/** @internal Resolves whether the CLI accepts a server-advertised custom escrow. */
|
|
32
|
+
export declare function resolveAllowCustomEscrow(methodOptions: Record<string, string>): boolean | undefined;
|
|
31
33
|
/** @internal Resolves the manager deposit cap in human-readable token units. */
|
|
32
34
|
export declare function resolveSessionMaxDeposit(challenge: Challenge.Challenge, methodOptions: Record<string, string>, testnet: boolean): string | undefined;
|
|
33
35
|
/** Runs one manager-backed request while holding the payer and payment-scope lock. */
|
|
@@ -29,6 +29,21 @@ export function resolveSessionSelection(session, channelAlias) {
|
|
|
29
29
|
function sessionDecimals(challenge) {
|
|
30
30
|
return typeof challenge.request.decimals === 'number' ? challenge.request.decimals : 6;
|
|
31
31
|
}
|
|
32
|
+
/** @internal Resolves whether the CLI accepts a server-advertised custom escrow. */
|
|
33
|
+
export function resolveAllowCustomEscrow(methodOptions) {
|
|
34
|
+
const value = methodOptions.allowCustomEscrow;
|
|
35
|
+
if (value === undefined)
|
|
36
|
+
return undefined;
|
|
37
|
+
if (value === 'true')
|
|
38
|
+
return true;
|
|
39
|
+
if (value === 'false')
|
|
40
|
+
return false;
|
|
41
|
+
throw new Errors.IncurError({
|
|
42
|
+
code: 'INVALID_ALLOW_CUSTOM_ESCROW',
|
|
43
|
+
message: 'allowCustomEscrow must be true or false.',
|
|
44
|
+
exitCode: 2,
|
|
45
|
+
});
|
|
46
|
+
}
|
|
32
47
|
/** @internal Resolves the manager deposit cap in human-readable token units. */
|
|
33
48
|
export function resolveSessionMaxDeposit(challenge, methodOptions, testnet) {
|
|
34
49
|
if (methodOptions.deposit !== undefined)
|
|
@@ -78,7 +93,9 @@ export async function runPersistentSessionRequest(parameters) {
|
|
|
78
93
|
const rpcUrl = resolveRpcUrl(options.rpcUrl, { network: options.network });
|
|
79
94
|
const chain = await resolveChain({ network: options.network, rpcUrl });
|
|
80
95
|
const client = createClient({ chain, transport: http(rpcUrl) });
|
|
96
|
+
const allowCustomEscrow = resolveAllowCustomEscrow(parameters.methodOptions);
|
|
81
97
|
const challengeContext = await resolveChallengeContext({
|
|
98
|
+
allowCustomEscrow,
|
|
82
99
|
challenge: parameters.challenge,
|
|
83
100
|
getClient: async () => client,
|
|
84
101
|
});
|
|
@@ -177,6 +194,7 @@ export async function runPersistentSessionRequest(parameters) {
|
|
|
177
194
|
let replayPending = true;
|
|
178
195
|
const manager = sessionManager({
|
|
179
196
|
account: resolvedAccount.account,
|
|
197
|
+
allowCustomEscrow,
|
|
180
198
|
bootstrap: false,
|
|
181
199
|
client,
|
|
182
200
|
channelStore,
|