mppx 0.8.17 → 0.8.18
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 +55 -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 +50 -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,1087 +0,0 @@
|
|
|
1
|
-
import {
|
|
2
|
-
isAddress,
|
|
3
|
-
isAddressEqual,
|
|
4
|
-
zeroAddress,
|
|
5
|
-
type Account as viem_Account,
|
|
6
|
-
type Address,
|
|
7
|
-
type Hex,
|
|
8
|
-
} from 'viem'
|
|
9
|
-
|
|
10
|
-
import type * as Challenge from '../../../Challenge.js'
|
|
11
|
-
import {
|
|
12
|
-
AmountExceedsDepositError,
|
|
13
|
-
ChannelClosedError,
|
|
14
|
-
ChannelNotFoundError,
|
|
15
|
-
InsufficientBalanceError,
|
|
16
|
-
InvalidSignatureError,
|
|
17
|
-
VerificationFailedError,
|
|
18
|
-
} from '../../../Errors.js'
|
|
19
|
-
import type * as FeePayer from '../../internal/fee-payer.js'
|
|
20
|
-
import * as Chain from '../precompile/Chain.js'
|
|
21
|
-
import { readChannelClosedReceiptFields } from '../precompile/Chain.js'
|
|
22
|
-
import * as Channel from '../precompile/Channel.js'
|
|
23
|
-
import {
|
|
24
|
-
createSessionReceipt,
|
|
25
|
-
uint96,
|
|
26
|
-
type ChannelDescriptor,
|
|
27
|
-
type SessionCredentialPayload,
|
|
28
|
-
type SessionReceipt,
|
|
29
|
-
} from '../precompile/Protocol.js'
|
|
30
|
-
import * as Voucher from '../precompile/Voucher.js'
|
|
31
|
-
import * as ChannelStore from './ChannelStore.js'
|
|
32
|
-
import { getChallengePaymentFields } from './RequestState.js'
|
|
33
|
-
import { assertSettlementSender, getClientAccount, type OnSessionSettlement } from './Settlement.js'
|
|
34
|
-
|
|
35
|
-
/** Returns the effective voucher signer for a TIP-1034 descriptor. */
|
|
36
|
-
export function authorizedSigner(descriptor: Channel.ChannelDescriptor): Address {
|
|
37
|
-
return isAddressEqual(descriptor.authorizedSigner, zeroAddress)
|
|
38
|
-
? descriptor.payer
|
|
39
|
-
: descriptor.authorizedSigner
|
|
40
|
-
}
|
|
41
|
-
|
|
42
|
-
/** Asserts that a credential payload includes a TIP-1034 descriptor. */
|
|
43
|
-
export function assertDescriptor(payload: {
|
|
44
|
-
descriptor?: Channel.ChannelDescriptor | undefined
|
|
45
|
-
}): asserts payload is { descriptor: Channel.ChannelDescriptor } {
|
|
46
|
-
if (!payload.descriptor)
|
|
47
|
-
throw new VerificationFailedError({
|
|
48
|
-
reason: 'descriptor required for TIP-1034 session action',
|
|
49
|
-
})
|
|
50
|
-
}
|
|
51
|
-
|
|
52
|
-
/** Asserts that two TIP-1034 descriptors identify the same channel. */
|
|
53
|
-
export function assertSameDescriptor(a: Channel.ChannelDescriptor, b: Channel.ChannelDescriptor) {
|
|
54
|
-
if (
|
|
55
|
-
!isAddressEqual(a.payer, b.payer) ||
|
|
56
|
-
!isAddressEqual(a.payee, b.payee) ||
|
|
57
|
-
!isAddressEqual(a.operator, b.operator) ||
|
|
58
|
-
!isAddressEqual(a.token, b.token) ||
|
|
59
|
-
!isAddressEqual(a.authorizedSigner, b.authorizedSigner) ||
|
|
60
|
-
a.salt.toLowerCase() !== b.salt.toLowerCase() ||
|
|
61
|
-
a.expiringNonceHash.toLowerCase() !== b.expiringNonceHash.toLowerCase()
|
|
62
|
-
)
|
|
63
|
-
throw new VerificationFailedError({
|
|
64
|
-
reason: 'credential descriptor does not match stored channel',
|
|
65
|
-
})
|
|
66
|
-
}
|
|
67
|
-
|
|
68
|
-
/**
|
|
69
|
-
* Validates a TIP-1034 descriptor against channel ID, server destination, and token.
|
|
70
|
-
*/
|
|
71
|
-
export function validateChannelDescriptor(
|
|
72
|
-
descriptor: Channel.ChannelDescriptor,
|
|
73
|
-
channelId: Address | `0x${string}`,
|
|
74
|
-
chainId: number,
|
|
75
|
-
escrow: Address,
|
|
76
|
-
recipient: Address,
|
|
77
|
-
currency: Address,
|
|
78
|
-
expectedOperator?: Address | undefined,
|
|
79
|
-
): void {
|
|
80
|
-
const computed = Channel.computeId({ ...descriptor, chainId, escrow })
|
|
81
|
-
if (computed.toLowerCase() !== channelId.toLowerCase()) {
|
|
82
|
-
throw new VerificationFailedError({ reason: 'channel descriptor does not match channelId' })
|
|
83
|
-
}
|
|
84
|
-
if (!isAddressEqual(descriptor.payee, recipient)) {
|
|
85
|
-
throw new VerificationFailedError({
|
|
86
|
-
reason: 'channel descriptor payee does not match server destination',
|
|
87
|
-
})
|
|
88
|
-
}
|
|
89
|
-
if (!isAddressEqual(descriptor.token, currency)) {
|
|
90
|
-
throw new VerificationFailedError({
|
|
91
|
-
reason: 'channel descriptor token does not match server token',
|
|
92
|
-
})
|
|
93
|
-
}
|
|
94
|
-
if (expectedOperator !== undefined && !isAddressEqual(descriptor.operator, expectedOperator)) {
|
|
95
|
-
throw new VerificationFailedError({
|
|
96
|
-
reason: 'channel descriptor operator does not match server operator',
|
|
97
|
-
})
|
|
98
|
-
}
|
|
99
|
-
}
|
|
100
|
-
|
|
101
|
-
/** Validates on-chain channel state before accepting or charging a credential. */
|
|
102
|
-
export function validateChannelState(state: Chain.ChannelState, amount?: bigint): void {
|
|
103
|
-
if (state.deposit === 0n) {
|
|
104
|
-
throw new ChannelNotFoundError({ reason: 'channel not funded on-chain' })
|
|
105
|
-
}
|
|
106
|
-
if (state.closeRequestedAt !== 0) {
|
|
107
|
-
throw new ChannelClosedError({ reason: 'channel has a pending close request' })
|
|
108
|
-
}
|
|
109
|
-
if (amount !== undefined && state.deposit - state.settled < amount) {
|
|
110
|
-
throw new InsufficientBalanceError({
|
|
111
|
-
reason: 'channel available balance insufficient for requested amount',
|
|
112
|
-
})
|
|
113
|
-
}
|
|
114
|
-
}
|
|
115
|
-
|
|
116
|
-
/** Asserts that an opening channel covers the route's requested payment. */
|
|
117
|
-
export function assertOpenCredentialCoversRequest(parameters: {
|
|
118
|
-
cumulativeAmount: bigint
|
|
119
|
-
openDeposit: bigint
|
|
120
|
-
requestAmount: bigint
|
|
121
|
-
}): void {
|
|
122
|
-
const { cumulativeAmount, openDeposit, requestAmount } = parameters
|
|
123
|
-
if (openDeposit < requestAmount)
|
|
124
|
-
throw new VerificationFailedError({ reason: 'open deposit is less than request amount' })
|
|
125
|
-
if (cumulativeAmount < requestAmount)
|
|
126
|
-
throw new VerificationFailedError({ reason: 'voucher amount is less than request amount' })
|
|
127
|
-
}
|
|
128
|
-
|
|
129
|
-
/** Verifies that the credential source is authorized to spend from the channel. */
|
|
130
|
-
export function assertCredentialSourceCanSpend(parameters: {
|
|
131
|
-
chainId: number
|
|
132
|
-
channel: Pick<ChannelStore.State, 'authorizedSigner' | 'payer'>
|
|
133
|
-
source?: string | undefined
|
|
134
|
-
}): void {
|
|
135
|
-
const sourceAddress = readCredentialSourceAddress(parameters.source, parameters.chainId)
|
|
136
|
-
if (
|
|
137
|
-
isAddressEqual(sourceAddress, parameters.channel.payer) ||
|
|
138
|
-
isAddressEqual(sourceAddress, parameters.channel.authorizedSigner)
|
|
139
|
-
)
|
|
140
|
-
return
|
|
141
|
-
throw new VerificationFailedError({
|
|
142
|
-
reason: 'credential source does not match channel payer or authorized signer',
|
|
143
|
-
})
|
|
144
|
-
}
|
|
145
|
-
|
|
146
|
-
function readCredentialSourceAddress(source: string | undefined, chainId: number): Address {
|
|
147
|
-
const prefix = `did:pkh:eip155:${chainId}:`
|
|
148
|
-
if (!source?.startsWith(prefix))
|
|
149
|
-
throw new VerificationFailedError({ reason: 'credential source does not match channel' })
|
|
150
|
-
const address = source.slice(prefix.length)
|
|
151
|
-
if (isAddress(address, { strict: false })) return address
|
|
152
|
-
throw new VerificationFailedError({ reason: 'invalid credential source' })
|
|
153
|
-
}
|
|
154
|
-
|
|
155
|
-
const sessionCredentialActions = [
|
|
156
|
-
'open',
|
|
157
|
-
'topUp',
|
|
158
|
-
'voucher',
|
|
159
|
-
'close',
|
|
160
|
-
] as const satisfies readonly SessionCredentialPayload['action'][]
|
|
161
|
-
const sessionCredentialActionSet = new Set<string>(sessionCredentialActions)
|
|
162
|
-
|
|
163
|
-
/** Shared action and channel fields required on every session credential payload. */
|
|
164
|
-
export type SessionCredentialPayloadHeader = {
|
|
165
|
-
/** Credential action discriminator. */
|
|
166
|
-
action: SessionCredentialPayload['action']
|
|
167
|
-
/** Channel ID the credential acts on. */
|
|
168
|
-
channelId: Hex
|
|
169
|
-
}
|
|
170
|
-
|
|
171
|
-
type SessionCredentialPayloadData = {
|
|
172
|
-
candidate: Record<string, unknown>
|
|
173
|
-
header: SessionCredentialPayloadHeader
|
|
174
|
-
}
|
|
175
|
-
|
|
176
|
-
function isObject(value: unknown): value is Record<string, unknown> {
|
|
177
|
-
return value !== null && typeof value === 'object'
|
|
178
|
-
}
|
|
179
|
-
|
|
180
|
-
function isSessionCredentialAction(value: unknown): value is SessionCredentialPayload['action'] {
|
|
181
|
-
return typeof value === 'string' && sessionCredentialActionSet.has(value)
|
|
182
|
-
}
|
|
183
|
-
|
|
184
|
-
function isHex(value: unknown): value is Hex {
|
|
185
|
-
return typeof value === 'string' && /^0x[0-9a-fA-F]*$/.test(value)
|
|
186
|
-
}
|
|
187
|
-
|
|
188
|
-
function isHash(value: unknown): value is Hex {
|
|
189
|
-
return typeof value === 'string' && /^0x[0-9a-fA-F]{64}$/.test(value)
|
|
190
|
-
}
|
|
191
|
-
|
|
192
|
-
function readAddress(value: unknown, field: string): Address {
|
|
193
|
-
if (typeof value === 'string' && isAddress(value, { strict: false })) return value
|
|
194
|
-
throw new VerificationFailedError({ reason: `invalid session credential ${field}` })
|
|
195
|
-
}
|
|
196
|
-
|
|
197
|
-
function readHash(value: unknown, field: string): Hex {
|
|
198
|
-
if (isHash(value)) return value
|
|
199
|
-
throw new VerificationFailedError({ reason: `invalid session credential ${field}` })
|
|
200
|
-
}
|
|
201
|
-
|
|
202
|
-
function readHex(value: unknown, field: string): Hex {
|
|
203
|
-
if (isHex(value)) return value
|
|
204
|
-
throw new VerificationFailedError({ reason: `invalid session credential ${field}` })
|
|
205
|
-
}
|
|
206
|
-
|
|
207
|
-
function readRawAmount(value: unknown, field: string): string {
|
|
208
|
-
if (typeof value === 'string' && /^[0-9]+$/.test(value)) return value
|
|
209
|
-
throw new VerificationFailedError({ reason: `invalid session credential ${field}` })
|
|
210
|
-
}
|
|
211
|
-
|
|
212
|
-
function readPayloadObject(payload: unknown): Record<string, unknown> {
|
|
213
|
-
if (!isObject(payload))
|
|
214
|
-
throw new VerificationFailedError({ reason: 'invalid session credential payload' })
|
|
215
|
-
return payload
|
|
216
|
-
}
|
|
217
|
-
|
|
218
|
-
function readDescriptor(value: unknown): ChannelDescriptor {
|
|
219
|
-
if (value === undefined)
|
|
220
|
-
throw new VerificationFailedError({
|
|
221
|
-
reason: 'descriptor required for TIP-1034 session action',
|
|
222
|
-
})
|
|
223
|
-
const candidate = readPayloadObject(value)
|
|
224
|
-
return {
|
|
225
|
-
payer: readAddress(candidate.payer, 'descriptor.payer'),
|
|
226
|
-
payee: readAddress(candidate.payee, 'descriptor.payee'),
|
|
227
|
-
operator: readAddress(candidate.operator, 'descriptor.operator'),
|
|
228
|
-
token: readAddress(candidate.token, 'descriptor.token'),
|
|
229
|
-
salt: readHash(candidate.salt, 'descriptor.salt'),
|
|
230
|
-
authorizedSigner: readAddress(candidate.authorizedSigner, 'descriptor.authorizedSigner'),
|
|
231
|
-
expiringNonceHash: readHash(candidate.expiringNonceHash, 'descriptor.expiringNonceHash'),
|
|
232
|
-
}
|
|
233
|
-
}
|
|
234
|
-
|
|
235
|
-
function readPayloadHeader(payload: unknown): SessionCredentialPayloadData {
|
|
236
|
-
const candidate = readPayloadObject(payload)
|
|
237
|
-
if (!isSessionCredentialAction(candidate.action)) {
|
|
238
|
-
throw new VerificationFailedError({ reason: 'invalid session credential action' })
|
|
239
|
-
}
|
|
240
|
-
return {
|
|
241
|
-
candidate,
|
|
242
|
-
header: {
|
|
243
|
-
action: candidate.action,
|
|
244
|
-
channelId: ChannelStore.normalizeChannelId(readHash(candidate.channelId, 'channelId')),
|
|
245
|
-
},
|
|
246
|
-
}
|
|
247
|
-
}
|
|
248
|
-
|
|
249
|
-
/** Validates the action discriminator for a TIP-1034 session credential payload. */
|
|
250
|
-
export function requireSessionCredentialAction(
|
|
251
|
-
payload: unknown,
|
|
252
|
-
): SessionCredentialPayload['action'] {
|
|
253
|
-
const candidate = readPayloadObject(payload)
|
|
254
|
-
if (!isSessionCredentialAction(candidate.action)) {
|
|
255
|
-
throw new VerificationFailedError({ reason: 'invalid session credential action' })
|
|
256
|
-
}
|
|
257
|
-
return candidate.action
|
|
258
|
-
}
|
|
259
|
-
|
|
260
|
-
/** Validates the shared action and channel fields for a TIP-1034 session credential payload. */
|
|
261
|
-
export function requireSessionCredentialPayloadHeader(
|
|
262
|
-
payload: unknown,
|
|
263
|
-
): SessionCredentialPayloadHeader {
|
|
264
|
-
return readPayloadHeader(payload).header
|
|
265
|
-
}
|
|
266
|
-
|
|
267
|
-
/** Validates action-specific fields for a TIP-1034 session credential payload. */
|
|
268
|
-
export function requireSessionCredentialPayload(payload: unknown): SessionCredentialPayload {
|
|
269
|
-
const { candidate, header } = readPayloadHeader(payload)
|
|
270
|
-
switch (header.action) {
|
|
271
|
-
case 'open':
|
|
272
|
-
return {
|
|
273
|
-
action: 'open',
|
|
274
|
-
type: readTransactionType(candidate.type),
|
|
275
|
-
channelId: header.channelId,
|
|
276
|
-
transaction: readHex(candidate.transaction, 'transaction'),
|
|
277
|
-
signature: readHex(candidate.signature, 'signature'),
|
|
278
|
-
descriptor: readDescriptor(candidate.descriptor),
|
|
279
|
-
cumulativeAmount: readRawAmount(candidate.cumulativeAmount, 'cumulativeAmount'),
|
|
280
|
-
...(candidate.authorizedSigner === undefined
|
|
281
|
-
? {}
|
|
282
|
-
: {
|
|
283
|
-
authorizedSigner: readAddress(candidate.authorizedSigner, 'authorizedSigner'),
|
|
284
|
-
}),
|
|
285
|
-
}
|
|
286
|
-
case 'topUp':
|
|
287
|
-
return {
|
|
288
|
-
action: 'topUp',
|
|
289
|
-
type: readTransactionType(candidate.type),
|
|
290
|
-
channelId: header.channelId,
|
|
291
|
-
transaction: readHex(candidate.transaction, 'transaction'),
|
|
292
|
-
descriptor: readDescriptor(candidate.descriptor),
|
|
293
|
-
additionalDeposit: readRawAmount(candidate.additionalDeposit, 'additionalDeposit'),
|
|
294
|
-
}
|
|
295
|
-
case 'voucher':
|
|
296
|
-
return {
|
|
297
|
-
action: 'voucher',
|
|
298
|
-
channelId: header.channelId,
|
|
299
|
-
descriptor: readDescriptor(candidate.descriptor),
|
|
300
|
-
cumulativeAmount: readRawAmount(candidate.cumulativeAmount, 'cumulativeAmount'),
|
|
301
|
-
signature: readHex(candidate.signature, 'signature'),
|
|
302
|
-
}
|
|
303
|
-
case 'close':
|
|
304
|
-
return {
|
|
305
|
-
action: 'close',
|
|
306
|
-
channelId: header.channelId,
|
|
307
|
-
descriptor: readDescriptor(candidate.descriptor),
|
|
308
|
-
cumulativeAmount: readRawAmount(candidate.cumulativeAmount, 'cumulativeAmount'),
|
|
309
|
-
signature: readHex(candidate.signature, 'signature'),
|
|
310
|
-
}
|
|
311
|
-
}
|
|
312
|
-
}
|
|
313
|
-
|
|
314
|
-
function readTransactionType(value: unknown): 'transaction' {
|
|
315
|
-
if (value === 'transaction') return value
|
|
316
|
-
throw new VerificationFailedError({ reason: 'invalid session credential transaction type' })
|
|
317
|
-
}
|
|
318
|
-
|
|
319
|
-
/** Shared inputs required to broadcast a verified precompile session credential payload. */
|
|
320
|
-
export type BroadcastCredentialPayloadParameters = {
|
|
321
|
-
/** Optional account override used for payee-side close settlement. */
|
|
322
|
-
account?: viem_Account | undefined
|
|
323
|
-
/** Challenge echoed by the credential. */
|
|
324
|
-
challenge: Challenge.Challenge
|
|
325
|
-
/** Milliseconds before voucher verification refreshes on-chain channel state. */
|
|
326
|
-
channelStateTtl: number
|
|
327
|
-
/** Chain ID used for channel ID derivation and voucher domain separation. */
|
|
328
|
-
chainId: number
|
|
329
|
-
/** viem client used for precompile reads and transaction broadcasts. */
|
|
330
|
-
client: Chain.TransactionClient
|
|
331
|
-
/** Optional payer identifier from the HTTP credential source field. */
|
|
332
|
-
credentialSource?: string | undefined
|
|
333
|
-
/** TIP20EscrowChannel precompile address for this session method. */
|
|
334
|
-
escrow: Address
|
|
335
|
-
/** Operator address advertised in the HMAC-bound challenge details. */
|
|
336
|
-
expectedOperator?: Address | undefined
|
|
337
|
-
/** Fee-payer account, or `true` when the client transport delegates co-signing to a hosted relay. */
|
|
338
|
-
feePayer?: viem_Account | true | undefined
|
|
339
|
-
/** Optional policy for fee-sponsored close/open/top-up transactions. */
|
|
340
|
-
feePayerPolicy?: Partial<FeePayer.Policy> | undefined
|
|
341
|
-
/** Optional fee token override for close transactions. */
|
|
342
|
-
feeToken?: Address | undefined
|
|
343
|
-
/** Last successful on-chain refresh timestamp per channel ID. */
|
|
344
|
-
lastOnChainVerified: Map<Hex, number>
|
|
345
|
-
/** Minimum allowed voucher delta in raw units. */
|
|
346
|
-
minVoucherDelta: bigint
|
|
347
|
-
/** Callback invoked after an on-chain settlement or close transaction is confirmed. */
|
|
348
|
-
onSessionSettlement?: OnSessionSettlement | undefined
|
|
349
|
-
/** Discriminated session credential payload to verify. */
|
|
350
|
-
payload: SessionCredentialPayload
|
|
351
|
-
/** Server-side channel store. */
|
|
352
|
-
store: ChannelStore.ChannelStore
|
|
353
|
-
}
|
|
354
|
-
|
|
355
|
-
/** @deprecated Use {@link BroadcastCredentialPayloadParameters}. */
|
|
356
|
-
export type VerifyCredentialPayloadParameters = BroadcastCredentialPayloadParameters
|
|
357
|
-
|
|
358
|
-
/** Narrows shared credential broadcast inputs to one payload action. */
|
|
359
|
-
export type BroadcastCredentialActionParameters<action extends SessionCredentialPayload['action']> =
|
|
360
|
-
Omit<BroadcastCredentialPayloadParameters, 'payload'> & {
|
|
361
|
-
/** Credential payload for the selected action. */
|
|
362
|
-
payload: Extract<SessionCredentialPayload, { action: action }>
|
|
363
|
-
}
|
|
364
|
-
|
|
365
|
-
/** @deprecated Use {@link BroadcastCredentialActionParameters}. */
|
|
366
|
-
export type VerifyCredentialActionParameters<action extends SessionCredentialPayload['action']> =
|
|
367
|
-
BroadcastCredentialActionParameters<action>
|
|
368
|
-
|
|
369
|
-
/** Inputs for broadcasting an open transaction credential and initial voucher. */
|
|
370
|
-
export type OpenCredentialActionParameters = BroadcastCredentialActionParameters<'open'>
|
|
371
|
-
|
|
372
|
-
/** Inputs for broadcasting a top-up transaction credential. */
|
|
373
|
-
export type TopUpCredentialActionParameters = BroadcastCredentialActionParameters<'topUp'>
|
|
374
|
-
|
|
375
|
-
/** Inputs for broadcasting and accepting an incremental voucher credential. */
|
|
376
|
-
export type VoucherCredentialActionParameters = BroadcastCredentialActionParameters<'voucher'>
|
|
377
|
-
|
|
378
|
-
/** Inputs for broadcasting and settling a cooperative close credential. */
|
|
379
|
-
export type CloseCredentialActionParameters = BroadcastCredentialActionParameters<'close'>
|
|
380
|
-
|
|
381
|
-
const refreshOnChainVerificationCache = {
|
|
382
|
-
close: false,
|
|
383
|
-
open: true,
|
|
384
|
-
topUp: true,
|
|
385
|
-
voucher: false,
|
|
386
|
-
} satisfies Record<SessionCredentialPayload['action'], boolean>
|
|
387
|
-
|
|
388
|
-
/** Inputs for validating a session credential without applying its state transition. */
|
|
389
|
-
export type ValidateCredentialPayloadParameters = Pick<
|
|
390
|
-
BroadcastCredentialPayloadParameters,
|
|
391
|
-
| 'account'
|
|
392
|
-
| 'channelStateTtl'
|
|
393
|
-
| 'chainId'
|
|
394
|
-
| 'client'
|
|
395
|
-
| 'credentialSource'
|
|
396
|
-
| 'escrow'
|
|
397
|
-
| 'expectedOperator'
|
|
398
|
-
| 'feePayer'
|
|
399
|
-
| 'feePayerPolicy'
|
|
400
|
-
| 'lastOnChainVerified'
|
|
401
|
-
| 'minVoucherDelta'
|
|
402
|
-
| 'payload'
|
|
403
|
-
| 'store'
|
|
404
|
-
| 'challenge'
|
|
405
|
-
>
|
|
406
|
-
|
|
407
|
-
/** Non-mutating result produced by session credential validation. */
|
|
408
|
-
export type CredentialPayloadValidation = {
|
|
409
|
-
/** Session action validated from the credential. */
|
|
410
|
-
action: SessionCredentialPayload['action']
|
|
411
|
-
/** Normalized channel ID targeted by the credential. */
|
|
412
|
-
channelId: Hex
|
|
413
|
-
}
|
|
414
|
-
|
|
415
|
-
/** Validates all action-specific session credential invariants without changing payment state. */
|
|
416
|
-
export async function validateCredentialPayload(
|
|
417
|
-
parameters: ValidateCredentialPayloadParameters,
|
|
418
|
-
): Promise<CredentialPayloadValidation> {
|
|
419
|
-
const { payload } = parameters
|
|
420
|
-
switch (payload.action) {
|
|
421
|
-
case 'open':
|
|
422
|
-
await validateOpenCredential(parameters, payload)
|
|
423
|
-
break
|
|
424
|
-
case 'topUp':
|
|
425
|
-
await validateTopUpCredential(parameters, payload)
|
|
426
|
-
break
|
|
427
|
-
case 'voucher':
|
|
428
|
-
await validateVoucherCredential(parameters, payload)
|
|
429
|
-
break
|
|
430
|
-
case 'close':
|
|
431
|
-
await validateCloseCredential(parameters, payload)
|
|
432
|
-
break
|
|
433
|
-
}
|
|
434
|
-
return { action: payload.action, channelId: ChannelStore.normalizeChannelId(payload.channelId) }
|
|
435
|
-
}
|
|
436
|
-
|
|
437
|
-
async function validateOpenCredential(
|
|
438
|
-
parameters: ValidateCredentialPayloadParameters,
|
|
439
|
-
payload: Extract<SessionCredentialPayload, { action: 'open' }>,
|
|
440
|
-
) {
|
|
441
|
-
const { challenge, chainId, client, escrow } = parameters
|
|
442
|
-
const request = getChallengePaymentFields(challenge)
|
|
443
|
-
const expectedOperator = parameters.expectedOperator ?? zeroAddress
|
|
444
|
-
const cumulativeAmount = uint96(BigInt(payload.cumulativeAmount))
|
|
445
|
-
assertDescriptor(payload)
|
|
446
|
-
if (
|
|
447
|
-
payload.authorizedSigner !== undefined &&
|
|
448
|
-
!isAddressEqual(payload.authorizedSigner, payload.descriptor.authorizedSigner)
|
|
449
|
-
)
|
|
450
|
-
throw new VerificationFailedError({
|
|
451
|
-
reason: 'credential authorizedSigner does not match descriptor',
|
|
452
|
-
})
|
|
453
|
-
const channelId = ChannelStore.normalizeChannelId(payload.channelId)
|
|
454
|
-
validateChannelDescriptor(
|
|
455
|
-
payload.descriptor,
|
|
456
|
-
channelId,
|
|
457
|
-
chainId,
|
|
458
|
-
escrow,
|
|
459
|
-
request.recipient,
|
|
460
|
-
request.currency,
|
|
461
|
-
expectedOperator,
|
|
462
|
-
)
|
|
463
|
-
const transaction = Chain.validateOpenCredentialTransaction({
|
|
464
|
-
challengeExpires: challenge.expires,
|
|
465
|
-
chainId,
|
|
466
|
-
escrowContract: escrow,
|
|
467
|
-
expectedAuthorizedSigner: payload.descriptor.authorizedSigner,
|
|
468
|
-
expectedChannelId: channelId,
|
|
469
|
-
expectedCurrency: request.currency,
|
|
470
|
-
expectedOperator,
|
|
471
|
-
expectedPayee: request.recipient,
|
|
472
|
-
expectedExpiringNonceHash: payload.descriptor.expiringNonceHash,
|
|
473
|
-
expectedPayer: payload.descriptor.payer,
|
|
474
|
-
feePayer: parameters.feePayer,
|
|
475
|
-
feePayerPolicy: parameters.feePayerPolicy,
|
|
476
|
-
serializedTransaction: payload.transaction,
|
|
477
|
-
})
|
|
478
|
-
assertOpenCredentialCoversRequest({
|
|
479
|
-
cumulativeAmount,
|
|
480
|
-
openDeposit: transaction.openDeposit,
|
|
481
|
-
requestAmount: request.amount,
|
|
482
|
-
})
|
|
483
|
-
assertSameDescriptor(transaction.descriptor, payload.descriptor)
|
|
484
|
-
if (cumulativeAmount > transaction.openDeposit)
|
|
485
|
-
throw new AmountExceedsDepositError({ reason: 'voucher amount exceeds open deposit' })
|
|
486
|
-
const valid = await Voucher.verifyVoucher(
|
|
487
|
-
escrow,
|
|
488
|
-
chainId,
|
|
489
|
-
{ channelId, cumulativeAmount, signature: payload.signature },
|
|
490
|
-
authorizedSigner(transaction.descriptor),
|
|
491
|
-
)
|
|
492
|
-
if (!valid) throw new InvalidSignatureError({ reason: 'invalid voucher signature' })
|
|
493
|
-
await Chain.simulateCredentialTransaction({
|
|
494
|
-
client,
|
|
495
|
-
feePayer: parameters.feePayer,
|
|
496
|
-
transaction: transaction.transaction,
|
|
497
|
-
})
|
|
498
|
-
}
|
|
499
|
-
|
|
500
|
-
async function validateTopUpCredential(
|
|
501
|
-
parameters: ValidateCredentialPayloadParameters,
|
|
502
|
-
payload: Extract<SessionCredentialPayload, { action: 'topUp' }>,
|
|
503
|
-
) {
|
|
504
|
-
const { challenge, chainId, client, escrow, store } = parameters
|
|
505
|
-
const request = getChallengePaymentFields(challenge)
|
|
506
|
-
const expectedOperator = parameters.expectedOperator ?? zeroAddress
|
|
507
|
-
const additionalDeposit = uint96(BigInt(payload.additionalDeposit))
|
|
508
|
-
assertDescriptor(payload)
|
|
509
|
-
const channelId = ChannelStore.normalizeChannelId(payload.channelId)
|
|
510
|
-
validateChannelDescriptor(
|
|
511
|
-
payload.descriptor,
|
|
512
|
-
channelId,
|
|
513
|
-
chainId,
|
|
514
|
-
escrow,
|
|
515
|
-
request.recipient,
|
|
516
|
-
request.currency,
|
|
517
|
-
expectedOperator,
|
|
518
|
-
)
|
|
519
|
-
const channel = await ChannelStore.loadPrecompileChannel({
|
|
520
|
-
descriptor: payload.descriptor,
|
|
521
|
-
channelId,
|
|
522
|
-
chainId,
|
|
523
|
-
escrow,
|
|
524
|
-
store,
|
|
525
|
-
validateDescriptor: true,
|
|
526
|
-
})
|
|
527
|
-
const transaction = Chain.validateTopUpCredentialTransaction({
|
|
528
|
-
additionalDeposit,
|
|
529
|
-
challengeExpires: challenge.expires,
|
|
530
|
-
chainId,
|
|
531
|
-
descriptor: channel.descriptor,
|
|
532
|
-
escrowContract: escrow,
|
|
533
|
-
expectedChannelId: channelId,
|
|
534
|
-
expectedCurrency: request.currency,
|
|
535
|
-
feePayer: parameters.feePayer,
|
|
536
|
-
feePayerPolicy: parameters.feePayerPolicy,
|
|
537
|
-
serializedTransaction: payload.transaction,
|
|
538
|
-
})
|
|
539
|
-
validateChannelState(await Chain.getChannelState(client, channelId, escrow))
|
|
540
|
-
await Chain.simulateCredentialTransaction({
|
|
541
|
-
client,
|
|
542
|
-
feePayer: parameters.feePayer,
|
|
543
|
-
transaction: transaction.transaction,
|
|
544
|
-
})
|
|
545
|
-
}
|
|
546
|
-
|
|
547
|
-
async function validateVoucherCredential(
|
|
548
|
-
parameters: ValidateCredentialPayloadParameters,
|
|
549
|
-
payload: Extract<SessionCredentialPayload, { action: 'voucher' }>,
|
|
550
|
-
) {
|
|
551
|
-
const {
|
|
552
|
-
challenge,
|
|
553
|
-
chainId,
|
|
554
|
-
client,
|
|
555
|
-
credentialSource,
|
|
556
|
-
escrow,
|
|
557
|
-
minVoucherDelta,
|
|
558
|
-
store,
|
|
559
|
-
channelStateTtl,
|
|
560
|
-
lastOnChainVerified,
|
|
561
|
-
} = parameters
|
|
562
|
-
const request = getChallengePaymentFields(challenge)
|
|
563
|
-
const expectedOperator = parameters.expectedOperator ?? zeroAddress
|
|
564
|
-
const channelId = ChannelStore.normalizeChannelId(payload.channelId)
|
|
565
|
-
const voucher = Voucher.parseVoucherFromPayload(
|
|
566
|
-
channelId,
|
|
567
|
-
payload.cumulativeAmount,
|
|
568
|
-
payload.signature,
|
|
569
|
-
)
|
|
570
|
-
assertDescriptor(payload)
|
|
571
|
-
validateChannelDescriptor(
|
|
572
|
-
payload.descriptor,
|
|
573
|
-
channelId,
|
|
574
|
-
chainId,
|
|
575
|
-
escrow,
|
|
576
|
-
request.recipient,
|
|
577
|
-
request.currency,
|
|
578
|
-
expectedOperator,
|
|
579
|
-
)
|
|
580
|
-
const channel = await ChannelStore.loadPrecompileChannel({
|
|
581
|
-
descriptor: payload.descriptor,
|
|
582
|
-
channelId,
|
|
583
|
-
chainId,
|
|
584
|
-
escrow,
|
|
585
|
-
store,
|
|
586
|
-
validateDescriptor: true,
|
|
587
|
-
})
|
|
588
|
-
assertCredentialSourceCanSpend({ chainId, channel, source: credentialSource })
|
|
589
|
-
if (channel.finalized) throw new ChannelClosedError({ reason: 'channel is finalized' })
|
|
590
|
-
const channelState = await resolveVoucherChannelState({
|
|
591
|
-
channel,
|
|
592
|
-
channelId,
|
|
593
|
-
channelStateTtl,
|
|
594
|
-
client,
|
|
595
|
-
escrow,
|
|
596
|
-
lastOnChainVerified,
|
|
597
|
-
})
|
|
598
|
-
await ChannelStore.validateVoucher({
|
|
599
|
-
channel,
|
|
600
|
-
channelState,
|
|
601
|
-
methodDetails: { chainId, escrowContract: escrow },
|
|
602
|
-
minVoucherDelta,
|
|
603
|
-
voucher,
|
|
604
|
-
})
|
|
605
|
-
}
|
|
606
|
-
|
|
607
|
-
async function resolveVoucherChannelState(parameters: {
|
|
608
|
-
channel: ChannelStore.State
|
|
609
|
-
channelId: Hex
|
|
610
|
-
channelStateTtl: number
|
|
611
|
-
client: Chain.TransactionClient
|
|
612
|
-
escrow: Address
|
|
613
|
-
lastOnChainVerified: Map<Hex, number>
|
|
614
|
-
}): Promise<Chain.ChannelState> {
|
|
615
|
-
const { channel, channelId, channelStateTtl, client, escrow, lastOnChainVerified } = parameters
|
|
616
|
-
const isStale = Date.now() - (lastOnChainVerified.get(channelId) ?? 0) > channelStateTtl
|
|
617
|
-
const state = isStale ? await Chain.getChannelState(client, channelId, escrow) : undefined
|
|
618
|
-
if (state) lastOnChainVerified.set(channelId, Date.now())
|
|
619
|
-
return {
|
|
620
|
-
deposit: state?.deposit ?? uint96(channel.deposit),
|
|
621
|
-
settled: state?.settled ?? uint96(channel.settledOnChain),
|
|
622
|
-
closeRequestedAt: state?.closeRequestedAt ?? Number(channel.closeRequestedAt),
|
|
623
|
-
}
|
|
624
|
-
}
|
|
625
|
-
|
|
626
|
-
async function validateCloseCredential(
|
|
627
|
-
parameters: ValidateCredentialPayloadParameters,
|
|
628
|
-
payload: Extract<SessionCredentialPayload, { action: 'close' }>,
|
|
629
|
-
) {
|
|
630
|
-
const { challenge, chainId, client, escrow, store } = parameters
|
|
631
|
-
const request = getChallengePaymentFields(challenge)
|
|
632
|
-
const expectedOperator = parameters.expectedOperator ?? zeroAddress
|
|
633
|
-
const cumulativeAmount = uint96(BigInt(payload.cumulativeAmount))
|
|
634
|
-
const channelId = ChannelStore.normalizeChannelId(payload.channelId)
|
|
635
|
-
assertDescriptor(payload)
|
|
636
|
-
validateChannelDescriptor(
|
|
637
|
-
payload.descriptor,
|
|
638
|
-
channelId,
|
|
639
|
-
chainId,
|
|
640
|
-
escrow,
|
|
641
|
-
request.recipient,
|
|
642
|
-
request.currency,
|
|
643
|
-
expectedOperator,
|
|
644
|
-
)
|
|
645
|
-
const channel = await ChannelStore.loadPrecompileChannel({
|
|
646
|
-
descriptor: payload.descriptor,
|
|
647
|
-
channelId,
|
|
648
|
-
chainId,
|
|
649
|
-
escrow,
|
|
650
|
-
store,
|
|
651
|
-
})
|
|
652
|
-
if (channel.finalized) throw new ChannelClosedError({ reason: 'channel is already finalized' })
|
|
653
|
-
const state = await Chain.getChannelState(client, channelId, escrow)
|
|
654
|
-
if (state.closeRequestedAt !== 0)
|
|
655
|
-
throw new ChannelClosedError({ reason: 'channel has a pending close request' })
|
|
656
|
-
if (state.deposit === 0n && (cumulativeAmount !== 0n || channel.spent !== 0n))
|
|
657
|
-
throw new ChannelClosedError({ reason: 'channel deposit is zero (settled)' })
|
|
658
|
-
if (cumulativeAmount < channel.spent)
|
|
659
|
-
throw new VerificationFailedError({
|
|
660
|
-
reason: `close voucher amount must be >= ${channel.spent} (spent)`,
|
|
661
|
-
})
|
|
662
|
-
if (cumulativeAmount < state.settled)
|
|
663
|
-
throw new VerificationFailedError({
|
|
664
|
-
reason: `close voucher amount must be >= ${state.settled} (on-chain settled)`,
|
|
665
|
-
})
|
|
666
|
-
const valid = await Voucher.verifyVoucher(
|
|
667
|
-
escrow,
|
|
668
|
-
chainId,
|
|
669
|
-
{ channelId, cumulativeAmount, signature: payload.signature },
|
|
670
|
-
channel.authorizedSigner,
|
|
671
|
-
)
|
|
672
|
-
if (!valid) throw new InvalidSignatureError({ reason: 'invalid voucher signature' })
|
|
673
|
-
const captureAmount = uint96(channel.spent > state.settled ? channel.spent : state.settled)
|
|
674
|
-
if (captureAmount > state.deposit)
|
|
675
|
-
throw new AmountExceedsDepositError({ reason: 'close capture amount exceeds on-chain deposit' })
|
|
676
|
-
const account = parameters.account ?? getClientAccount(client)
|
|
677
|
-
assertSettlementSender({
|
|
678
|
-
operation: 'close',
|
|
679
|
-
channelId,
|
|
680
|
-
operator: channel.operator,
|
|
681
|
-
payee: channel.payee,
|
|
682
|
-
sender: account?.address,
|
|
683
|
-
})
|
|
684
|
-
}
|
|
685
|
-
|
|
686
|
-
/** Broadcasts a validated session credential payload and applies its state transition. */
|
|
687
|
-
export async function broadcastCredentialPayload(
|
|
688
|
-
context: BroadcastCredentialPayloadParameters,
|
|
689
|
-
): Promise<SessionReceipt> {
|
|
690
|
-
const receipt = await broadcastCredentialAction(context)
|
|
691
|
-
if (refreshOnChainVerificationCache[context.payload.action])
|
|
692
|
-
context.lastOnChainVerified.set(receipt.channelId, Date.now())
|
|
693
|
-
return receipt
|
|
694
|
-
}
|
|
695
|
-
|
|
696
|
-
/** @deprecated Use {@link broadcastCredentialPayload}. */
|
|
697
|
-
export async function verifyCredentialPayload(
|
|
698
|
-
context: VerifyCredentialPayloadParameters,
|
|
699
|
-
): Promise<SessionReceipt> {
|
|
700
|
-
return broadcastCredentialPayload(context)
|
|
701
|
-
}
|
|
702
|
-
|
|
703
|
-
function broadcastCredentialAction(
|
|
704
|
-
context: BroadcastCredentialPayloadParameters,
|
|
705
|
-
): Promise<SessionReceipt> {
|
|
706
|
-
const { payload } = context
|
|
707
|
-
switch (payload.action) {
|
|
708
|
-
case 'open':
|
|
709
|
-
return handleOpenCredential(actionContext(context, payload))
|
|
710
|
-
case 'topUp':
|
|
711
|
-
return handleTopUpCredential(actionContext(context, payload))
|
|
712
|
-
case 'voucher':
|
|
713
|
-
return handleVoucherCredential(actionContext(context, payload))
|
|
714
|
-
case 'close':
|
|
715
|
-
return handleCloseCredential(actionContext(context, payload))
|
|
716
|
-
}
|
|
717
|
-
}
|
|
718
|
-
|
|
719
|
-
function actionContext<action extends SessionCredentialPayload['action']>(
|
|
720
|
-
context: BroadcastCredentialPayloadParameters,
|
|
721
|
-
payload: Extract<SessionCredentialPayload, { action: action }>,
|
|
722
|
-
): BroadcastCredentialActionParameters<action> {
|
|
723
|
-
return { ...context, payload }
|
|
724
|
-
}
|
|
725
|
-
|
|
726
|
-
async function handleOpenCredential(
|
|
727
|
-
parameters: OpenCredentialActionParameters,
|
|
728
|
-
): Promise<SessionReceipt> {
|
|
729
|
-
const { store, client, challenge, payload, chainId, escrow } = parameters
|
|
730
|
-
const request = getChallengePaymentFields(challenge)
|
|
731
|
-
const expectedOperator = parameters.expectedOperator ?? zeroAddress
|
|
732
|
-
const cumulativeAmount = uint96(BigInt(payload.cumulativeAmount))
|
|
733
|
-
assertDescriptor(payload)
|
|
734
|
-
if (
|
|
735
|
-
payload.authorizedSigner !== undefined &&
|
|
736
|
-
!isAddressEqual(payload.authorizedSigner, payload.descriptor.authorizedSigner)
|
|
737
|
-
)
|
|
738
|
-
throw new VerificationFailedError({
|
|
739
|
-
reason: 'credential authorizedSigner does not match descriptor',
|
|
740
|
-
})
|
|
741
|
-
const channelId = ChannelStore.normalizeChannelId(payload.channelId)
|
|
742
|
-
validateChannelDescriptor(
|
|
743
|
-
payload.descriptor,
|
|
744
|
-
channelId,
|
|
745
|
-
chainId,
|
|
746
|
-
escrow,
|
|
747
|
-
request.recipient,
|
|
748
|
-
request.currency,
|
|
749
|
-
expectedOperator,
|
|
750
|
-
)
|
|
751
|
-
|
|
752
|
-
const result = await Chain.broadcastOpenTransaction({
|
|
753
|
-
challengeExpires: challenge.expires,
|
|
754
|
-
chainId,
|
|
755
|
-
client,
|
|
756
|
-
escrowContract: escrow,
|
|
757
|
-
expectedAuthorizedSigner: payload.descriptor.authorizedSigner,
|
|
758
|
-
expectedChannelId: channelId,
|
|
759
|
-
expectedCurrency: request.currency,
|
|
760
|
-
expectedOperator,
|
|
761
|
-
expectedPayee: request.recipient,
|
|
762
|
-
expectedExpiringNonceHash: payload.descriptor.expiringNonceHash,
|
|
763
|
-
expectedPayer: payload.descriptor.payer,
|
|
764
|
-
feePayer: parameters.feePayer,
|
|
765
|
-
feePayerPolicy: parameters.feePayerPolicy,
|
|
766
|
-
serializedTransaction: payload.transaction,
|
|
767
|
-
async beforeBroadcast(prepared) {
|
|
768
|
-
assertOpenCredentialCoversRequest({
|
|
769
|
-
cumulativeAmount,
|
|
770
|
-
openDeposit: prepared.openDeposit,
|
|
771
|
-
requestAmount: request.amount,
|
|
772
|
-
})
|
|
773
|
-
assertSameDescriptor(prepared.descriptor, payload.descriptor)
|
|
774
|
-
if (cumulativeAmount > prepared.openDeposit)
|
|
775
|
-
throw new AmountExceedsDepositError({ reason: 'voucher amount exceeds open deposit' })
|
|
776
|
-
const valid = await Voucher.verifyVoucher(
|
|
777
|
-
escrow,
|
|
778
|
-
chainId,
|
|
779
|
-
{ channelId, cumulativeAmount: cumulativeAmount, signature: payload.signature },
|
|
780
|
-
authorizedSigner(prepared.descriptor),
|
|
781
|
-
)
|
|
782
|
-
if (!valid) throw new InvalidSignatureError({ reason: 'invalid voucher signature' })
|
|
783
|
-
},
|
|
784
|
-
})
|
|
785
|
-
const { descriptor, state } = result
|
|
786
|
-
assertSameDescriptor(descriptor, payload.descriptor)
|
|
787
|
-
validateChannelState(state, request.amount)
|
|
788
|
-
|
|
789
|
-
const updated = await store.updateChannel(channelId, (current) =>
|
|
790
|
-
ChannelStore.openChannelState({
|
|
791
|
-
authorizedSigner: authorizedSigner(descriptor),
|
|
792
|
-
chainId,
|
|
793
|
-
channelId,
|
|
794
|
-
current,
|
|
795
|
-
descriptor,
|
|
796
|
-
escrow,
|
|
797
|
-
expiringNonceHash: result.expiringNonceHash,
|
|
798
|
-
cumulativeAmount,
|
|
799
|
-
signature: payload.signature,
|
|
800
|
-
state,
|
|
801
|
-
}),
|
|
802
|
-
)
|
|
803
|
-
if (!updated) throw new VerificationFailedError({ reason: 'failed to create channel' })
|
|
804
|
-
return createSessionReceipt({
|
|
805
|
-
challengeId: challenge.id,
|
|
806
|
-
channelId,
|
|
807
|
-
acceptedCumulative: updated.highestVoucherAmount,
|
|
808
|
-
spent: updated.spent,
|
|
809
|
-
units: updated.units,
|
|
810
|
-
txHash: result.txHash,
|
|
811
|
-
})
|
|
812
|
-
}
|
|
813
|
-
|
|
814
|
-
async function handleTopUpCredential(
|
|
815
|
-
parameters: TopUpCredentialActionParameters,
|
|
816
|
-
): Promise<SessionReceipt> {
|
|
817
|
-
const { store, client, challenge, payload, chainId, escrow } = parameters
|
|
818
|
-
const request = getChallengePaymentFields(challenge)
|
|
819
|
-
const expectedOperator = parameters.expectedOperator ?? zeroAddress
|
|
820
|
-
const additionalDeposit = uint96(BigInt(payload.additionalDeposit))
|
|
821
|
-
assertDescriptor(payload)
|
|
822
|
-
const channelId = ChannelStore.normalizeChannelId(payload.channelId)
|
|
823
|
-
validateChannelDescriptor(
|
|
824
|
-
payload.descriptor,
|
|
825
|
-
channelId,
|
|
826
|
-
chainId,
|
|
827
|
-
escrow,
|
|
828
|
-
request.recipient,
|
|
829
|
-
request.currency,
|
|
830
|
-
expectedOperator,
|
|
831
|
-
)
|
|
832
|
-
const channel = await ChannelStore.loadPrecompileChannel({
|
|
833
|
-
descriptor: payload.descriptor,
|
|
834
|
-
channelId,
|
|
835
|
-
chainId,
|
|
836
|
-
escrow,
|
|
837
|
-
store,
|
|
838
|
-
validateDescriptor: true,
|
|
839
|
-
})
|
|
840
|
-
const result = await Chain.broadcastTopUpTransaction({
|
|
841
|
-
additionalDeposit,
|
|
842
|
-
challengeExpires: challenge.expires,
|
|
843
|
-
chainId,
|
|
844
|
-
client,
|
|
845
|
-
descriptor: channel.descriptor,
|
|
846
|
-
escrowContract: escrow,
|
|
847
|
-
expectedChannelId: channelId,
|
|
848
|
-
expectedCurrency: request.currency,
|
|
849
|
-
feePayer: parameters.feePayer,
|
|
850
|
-
feePayerPolicy: parameters.feePayerPolicy,
|
|
851
|
-
serializedTransaction: payload.transaction,
|
|
852
|
-
})
|
|
853
|
-
const { state } = result
|
|
854
|
-
validateChannelState(state)
|
|
855
|
-
|
|
856
|
-
const updated = await store.updateChannel(channelId, (current) =>
|
|
857
|
-
ChannelStore.topUpChannelState({ current, state }),
|
|
858
|
-
)
|
|
859
|
-
return createSessionReceipt({
|
|
860
|
-
challengeId: challenge.id,
|
|
861
|
-
channelId,
|
|
862
|
-
acceptedCumulative: updated?.highestVoucherAmount ?? channel.highestVoucherAmount,
|
|
863
|
-
spent: updated?.spent ?? channel.spent,
|
|
864
|
-
units: updated?.units ?? channel.units,
|
|
865
|
-
txHash: result.txHash,
|
|
866
|
-
})
|
|
867
|
-
}
|
|
868
|
-
|
|
869
|
-
async function handleVoucherCredential(
|
|
870
|
-
parameters: VoucherCredentialActionParameters,
|
|
871
|
-
): Promise<SessionReceipt> {
|
|
872
|
-
const {
|
|
873
|
-
store,
|
|
874
|
-
client,
|
|
875
|
-
challenge,
|
|
876
|
-
credentialSource,
|
|
877
|
-
payload,
|
|
878
|
-
chainId,
|
|
879
|
-
escrow,
|
|
880
|
-
minVoucherDelta,
|
|
881
|
-
channelStateTtl,
|
|
882
|
-
lastOnChainVerified,
|
|
883
|
-
} = parameters
|
|
884
|
-
const request = getChallengePaymentFields(challenge)
|
|
885
|
-
const expectedOperator = parameters.expectedOperator ?? zeroAddress
|
|
886
|
-
const channelId = ChannelStore.normalizeChannelId(payload.channelId)
|
|
887
|
-
const voucher = Voucher.parseVoucherFromPayload(
|
|
888
|
-
channelId,
|
|
889
|
-
payload.cumulativeAmount,
|
|
890
|
-
payload.signature,
|
|
891
|
-
)
|
|
892
|
-
assertDescriptor(payload)
|
|
893
|
-
validateChannelDescriptor(
|
|
894
|
-
payload.descriptor,
|
|
895
|
-
channelId,
|
|
896
|
-
chainId,
|
|
897
|
-
escrow,
|
|
898
|
-
request.recipient,
|
|
899
|
-
request.currency,
|
|
900
|
-
expectedOperator,
|
|
901
|
-
)
|
|
902
|
-
const channel = await ChannelStore.loadPrecompileChannel({
|
|
903
|
-
descriptor: payload.descriptor,
|
|
904
|
-
channelId,
|
|
905
|
-
chainId,
|
|
906
|
-
escrow,
|
|
907
|
-
store,
|
|
908
|
-
validateDescriptor: true,
|
|
909
|
-
})
|
|
910
|
-
assertCredentialSourceCanSpend({ chainId, channel, source: credentialSource })
|
|
911
|
-
if (channel.finalized) throw new ChannelClosedError({ reason: 'channel is finalized' })
|
|
912
|
-
const channelState = await resolveVoucherChannelState({
|
|
913
|
-
channel,
|
|
914
|
-
channelId,
|
|
915
|
-
channelStateTtl,
|
|
916
|
-
client,
|
|
917
|
-
escrow,
|
|
918
|
-
lastOnChainVerified,
|
|
919
|
-
})
|
|
920
|
-
if (channelState.closeRequestedAt !== 0) {
|
|
921
|
-
await store.updateChannel(channelId, (current) =>
|
|
922
|
-
current
|
|
923
|
-
? {
|
|
924
|
-
...current,
|
|
925
|
-
closeRequestedAt:
|
|
926
|
-
BigInt(channelState.closeRequestedAt) > current.closeRequestedAt
|
|
927
|
-
? BigInt(channelState.closeRequestedAt)
|
|
928
|
-
: current.closeRequestedAt,
|
|
929
|
-
}
|
|
930
|
-
: current,
|
|
931
|
-
)
|
|
932
|
-
}
|
|
933
|
-
return ChannelStore.verifyAndAcceptVoucher({
|
|
934
|
-
store,
|
|
935
|
-
minVoucherDelta,
|
|
936
|
-
challenge,
|
|
937
|
-
channel,
|
|
938
|
-
voucher,
|
|
939
|
-
channelState,
|
|
940
|
-
methodDetails: { chainId, escrowContract: escrow },
|
|
941
|
-
})
|
|
942
|
-
}
|
|
943
|
-
|
|
944
|
-
async function handleCloseCredential(
|
|
945
|
-
parameters: CloseCredentialActionParameters,
|
|
946
|
-
): Promise<SessionReceipt> {
|
|
947
|
-
const { store, client, challenge, payload, chainId, escrow } = parameters
|
|
948
|
-
const request = getChallengePaymentFields(challenge)
|
|
949
|
-
const expectedOperator = parameters.expectedOperator ?? zeroAddress
|
|
950
|
-
const cumulativeAmount = uint96(BigInt(payload.cumulativeAmount))
|
|
951
|
-
const channelId = ChannelStore.normalizeChannelId(payload.channelId)
|
|
952
|
-
assertDescriptor(payload)
|
|
953
|
-
validateChannelDescriptor(
|
|
954
|
-
payload.descriptor,
|
|
955
|
-
channelId,
|
|
956
|
-
chainId,
|
|
957
|
-
escrow,
|
|
958
|
-
request.recipient,
|
|
959
|
-
request.currency,
|
|
960
|
-
expectedOperator,
|
|
961
|
-
)
|
|
962
|
-
const channel = await ChannelStore.loadPrecompileChannel({
|
|
963
|
-
descriptor: payload.descriptor,
|
|
964
|
-
channelId,
|
|
965
|
-
chainId,
|
|
966
|
-
escrow,
|
|
967
|
-
store,
|
|
968
|
-
})
|
|
969
|
-
if (channel.finalized) throw new ChannelClosedError({ reason: 'channel is already finalized' })
|
|
970
|
-
const state = await Chain.getChannelState(client, channelId, escrow)
|
|
971
|
-
if (state.closeRequestedAt !== 0)
|
|
972
|
-
throw new ChannelClosedError({ reason: 'channel has a pending close request' })
|
|
973
|
-
if (state.deposit === 0n && (cumulativeAmount !== 0n || channel.spent !== 0n))
|
|
974
|
-
throw new ChannelClosedError({ reason: 'channel deposit is zero (settled)' })
|
|
975
|
-
if (cumulativeAmount < channel.spent)
|
|
976
|
-
throw new VerificationFailedError({
|
|
977
|
-
reason: `close voucher amount must be >= ${channel.spent} (spent)`,
|
|
978
|
-
})
|
|
979
|
-
if (cumulativeAmount < state.settled)
|
|
980
|
-
throw new VerificationFailedError({
|
|
981
|
-
reason: `close voucher amount must be >= ${state.settled} (on-chain settled)`,
|
|
982
|
-
})
|
|
983
|
-
const valid = await Voucher.verifyVoucher(
|
|
984
|
-
escrow,
|
|
985
|
-
chainId,
|
|
986
|
-
{ channelId, cumulativeAmount: cumulativeAmount, signature: payload.signature },
|
|
987
|
-
channel.authorizedSigner,
|
|
988
|
-
)
|
|
989
|
-
if (!valid) throw new InvalidSignatureError({ reason: 'invalid voucher signature' })
|
|
990
|
-
let captureAmount = uint96(channel.spent > state.settled ? channel.spent : state.settled)
|
|
991
|
-
if (captureAmount > state.deposit)
|
|
992
|
-
throw new AmountExceedsDepositError({ reason: 'close capture amount exceeds on-chain deposit' })
|
|
993
|
-
const pendingCloseStartedAt = BigInt(Math.floor(Date.now() / 1000) || 1)
|
|
994
|
-
const previousCloseRequestedAt = channel.closeRequestedAt
|
|
995
|
-
let pendingCloseMarked = false
|
|
996
|
-
await store.updateChannel(channelId, (current) => {
|
|
997
|
-
const next = ChannelStore.markPendingClose({
|
|
998
|
-
closeRequestedAt: pendingCloseStartedAt,
|
|
999
|
-
cumulativeAmount,
|
|
1000
|
-
current,
|
|
1001
|
-
onChainDeposit: state.deposit,
|
|
1002
|
-
onChainSettled: state.settled,
|
|
1003
|
-
})
|
|
1004
|
-
if (next.state) {
|
|
1005
|
-
captureAmount = next.captureAmount
|
|
1006
|
-
pendingCloseMarked = true
|
|
1007
|
-
}
|
|
1008
|
-
return next.state
|
|
1009
|
-
})
|
|
1010
|
-
const account = parameters.account ?? getClientAccount(client)
|
|
1011
|
-
let txHash: Hex | undefined
|
|
1012
|
-
let receipt: Awaited<ReturnType<typeof Chain.waitForSuccessfulReceipt>>
|
|
1013
|
-
try {
|
|
1014
|
-
assertSettlementSender({
|
|
1015
|
-
operation: 'close',
|
|
1016
|
-
channelId,
|
|
1017
|
-
operator: channel.operator,
|
|
1018
|
-
payee: channel.payee,
|
|
1019
|
-
sender: account?.address,
|
|
1020
|
-
})
|
|
1021
|
-
txHash = await Chain.closeOnChain(
|
|
1022
|
-
client,
|
|
1023
|
-
channel.descriptor,
|
|
1024
|
-
cumulativeAmount,
|
|
1025
|
-
captureAmount,
|
|
1026
|
-
payload.signature,
|
|
1027
|
-
escrow,
|
|
1028
|
-
account
|
|
1029
|
-
? {
|
|
1030
|
-
account,
|
|
1031
|
-
...(typeof parameters.feePayer === 'object' ? { feePayer: parameters.feePayer } : {}),
|
|
1032
|
-
...(parameters.feePayerPolicy ? { feePayerPolicy: parameters.feePayerPolicy } : {}),
|
|
1033
|
-
...(parameters.feeToken ? { feeToken: parameters.feeToken } : {}),
|
|
1034
|
-
candidateFeeTokens: [channel.token],
|
|
1035
|
-
}
|
|
1036
|
-
: undefined,
|
|
1037
|
-
)
|
|
1038
|
-
receipt = await Chain.waitForSuccessfulReceipt(client, txHash)
|
|
1039
|
-
} catch (error) {
|
|
1040
|
-
if (pendingCloseMarked) {
|
|
1041
|
-
await store.updateChannel(channelId, (current) =>
|
|
1042
|
-
current && current.closeRequestedAt === pendingCloseStartedAt
|
|
1043
|
-
? { ...current, closeRequestedAt: previousCloseRequestedAt }
|
|
1044
|
-
: current,
|
|
1045
|
-
)
|
|
1046
|
-
}
|
|
1047
|
-
throw error
|
|
1048
|
-
}
|
|
1049
|
-
const closed = readChannelClosedReceiptFields(
|
|
1050
|
-
Chain.getChannelEvent(receipt, 'ChannelClosed', channelId),
|
|
1051
|
-
)
|
|
1052
|
-
const { refundedToPayer, settledToPayee } = closed
|
|
1053
|
-
if (settledToPayee > captureAmount || settledToPayee + refundedToPayer > state.deposit)
|
|
1054
|
-
throw new VerificationFailedError({ reason: 'ChannelClosed amounts do not match state' })
|
|
1055
|
-
const updated = await store.updateChannel(channelId, (current) =>
|
|
1056
|
-
ChannelStore.finalizeClosedChannelState({
|
|
1057
|
-
captureAmount,
|
|
1058
|
-
channelId,
|
|
1059
|
-
cumulativeAmount,
|
|
1060
|
-
current,
|
|
1061
|
-
signature: payload.signature,
|
|
1062
|
-
}),
|
|
1063
|
-
)
|
|
1064
|
-
if (parameters.onSessionSettlement && txHash) {
|
|
1065
|
-
try {
|
|
1066
|
-
await parameters.onSessionSettlement(
|
|
1067
|
-
Object.freeze({
|
|
1068
|
-
txHash,
|
|
1069
|
-
channelId,
|
|
1070
|
-
trigger: 'close' as const,
|
|
1071
|
-
amount: settledToPayee,
|
|
1072
|
-
delta: settledToPayee - state.settled,
|
|
1073
|
-
}),
|
|
1074
|
-
)
|
|
1075
|
-
} catch {
|
|
1076
|
-
// Errors are isolated — observers cannot break the settlement flow.
|
|
1077
|
-
}
|
|
1078
|
-
}
|
|
1079
|
-
return createSessionReceipt({
|
|
1080
|
-
challengeId: challenge.id,
|
|
1081
|
-
channelId,
|
|
1082
|
-
acceptedCumulative: cumulativeAmount,
|
|
1083
|
-
spent: updated?.spent ?? channel.spent,
|
|
1084
|
-
units: updated?.units ?? channel.units,
|
|
1085
|
-
txHash,
|
|
1086
|
-
})
|
|
1087
|
-
}
|