mppx 0.8.14 → 0.8.17
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 +57 -0
- package/dist/Challenge.d.ts.map +1 -1
- package/dist/Challenge.js +40 -35
- package/dist/Challenge.js.map +1 -1
- package/dist/Constants.d.ts +17 -17
- package/dist/Constants.d.ts.map +1 -1
- package/dist/Credential.d.ts.map +1 -1
- package/dist/Errors.d.ts +3 -3
- package/dist/Errors.d.ts.map +1 -1
- package/dist/Errors.js.map +1 -1
- package/dist/Method.d.ts +35 -5
- package/dist/Method.d.ts.map +1 -1
- package/dist/Method.js +7 -22
- package/dist/Method.js.map +1 -1
- package/dist/Store.d.ts +19 -0
- package/dist/Store.d.ts.map +1 -1
- package/dist/Store.js +43 -0
- package/dist/Store.js.map +1 -1
- package/dist/attestation/Client.d.ts +17 -0
- package/dist/attestation/Client.d.ts.map +1 -0
- package/dist/attestation/Client.js +28 -0
- package/dist/attestation/Client.js.map +1 -0
- package/dist/attestation/Constants.d.ts +15 -0
- package/dist/attestation/Constants.d.ts.map +1 -0
- package/dist/attestation/Constants.js +15 -0
- package/dist/attestation/Constants.js.map +1 -0
- package/dist/attestation/Server.d.ts +4 -0
- package/dist/attestation/Server.d.ts.map +1 -0
- package/dist/attestation/Server.js +8 -0
- package/dist/attestation/Server.js.map +1 -0
- package/dist/attestation/Types.d.ts +76 -0
- package/dist/attestation/Types.d.ts.map +1 -0
- package/dist/attestation/Types.js +2 -0
- package/dist/attestation/Types.js.map +1 -0
- package/dist/attestation/index.d.ts +6 -0
- package/dist/attestation/index.d.ts.map +1 -0
- package/dist/attestation/index.js +6 -0
- package/dist/attestation/index.js.map +1 -0
- package/dist/attestation/internal/HttpMessageSignature.d.ts +73 -0
- package/dist/attestation/internal/HttpMessageSignature.d.ts.map +1 -0
- package/dist/attestation/internal/HttpMessageSignature.js +320 -0
- package/dist/attestation/internal/HttpMessageSignature.js.map +1 -0
- package/dist/attestation/internal/SigningContext.d.ts +4 -0
- package/dist/attestation/internal/SigningContext.d.ts.map +1 -0
- package/dist/attestation/internal/SigningContext.js +11 -0
- package/dist/attestation/internal/SigningContext.js.map +1 -0
- package/dist/cli/account.d.ts +14 -14
- package/dist/cli/account.d.ts.map +1 -1
- package/dist/cli/cli.d.ts +6 -6
- package/dist/cli/cli.d.ts.map +1 -1
- package/dist/cli/cli.js +1 -0
- package/dist/cli/cli.js.map +1 -1
- package/dist/cli/plugins/tempo.js.map +1 -1
- package/dist/cli/sessions/commands.d.ts +4 -4
- package/dist/cli/sessions/commands.d.ts.map +1 -1
- package/dist/cli/sessions/commands.js.map +1 -1
- package/dist/cli/sessions/store.d.ts.map +1 -1
- package/dist/cli/sessions/store.js.map +1 -1
- package/dist/cli/utils.d.ts +1 -1
- package/dist/cli/utils.d.ts.map +1 -1
- package/dist/cli/utils.js.map +1 -1
- package/dist/cli/validate/discovery.js.map +1 -1
- package/dist/cli/validate/index.d.ts +3 -3
- package/dist/cli/validate/index.d.ts.map +1 -1
- package/dist/cli/validate/payment.d.ts.map +1 -1
- package/dist/cli/validate/payment.js +18 -4
- package/dist/cli/validate/payment.js.map +1 -1
- package/dist/client/Mppx.d.ts +3 -0
- package/dist/client/Mppx.d.ts.map +1 -1
- package/dist/client/Mppx.js +13 -5
- package/dist/client/Mppx.js.map +1 -1
- package/dist/client/Transport.d.ts +3 -5
- package/dist/client/Transport.d.ts.map +1 -1
- package/dist/client/Transport.js +1 -17
- package/dist/client/Transport.js.map +1 -1
- package/dist/client/internal/Fetch.d.ts.map +1 -1
- package/dist/client/internal/Fetch.js +92 -13
- package/dist/client/internal/Fetch.js.map +1 -1
- package/dist/client/internal/MethodChallenge.d.ts +2 -0
- package/dist/client/internal/MethodChallenge.d.ts.map +1 -1
- package/dist/client/internal/MethodChallenge.js +4 -0
- package/dist/client/internal/MethodChallenge.js.map +1 -1
- package/dist/client/internal/MethodResponse.d.ts +15 -0
- package/dist/client/internal/MethodResponse.d.ts.map +1 -1
- package/dist/client/internal/MethodResponse.js +10 -0
- package/dist/client/internal/MethodResponse.js.map +1 -1
- package/dist/client/node.js.map +1 -1
- package/dist/discovery/OpenApi.d.ts +3 -5
- package/dist/discovery/OpenApi.d.ts.map +1 -1
- package/dist/discovery/OpenApi.js +13 -34
- package/dist/discovery/OpenApi.js.map +1 -1
- package/dist/discovery/internal/Metadata.d.ts +20 -0
- package/dist/discovery/internal/Metadata.d.ts.map +1 -0
- package/dist/discovery/internal/Metadata.js +36 -0
- package/dist/discovery/internal/Metadata.js.map +1 -0
- package/dist/evm/Methods.d.ts +11 -11
- package/dist/evm/Methods.d.ts.map +1 -1
- package/dist/evm/Types.d.ts +17 -17
- package/dist/evm/Types.d.ts.map +1 -1
- package/dist/evm/client/Charge.d.ts +11 -11
- package/dist/evm/client/Methods.d.ts +11 -11
- package/dist/evm/server/Charge.d.ts +1 -1
- package/dist/evm/server/Charge.d.ts.map +1 -1
- package/dist/evm/server/Charge.js +2 -0
- package/dist/evm/server/Charge.js.map +1 -1
- package/dist/evm/server/Methods.d.ts +11 -11
- package/dist/internal/HeaderCodec.d.ts +2 -2
- package/dist/internal/HeaderCodec.d.ts.map +1 -1
- package/dist/internal/types.d.ts +6 -0
- package/dist/internal/types.d.ts.map +1 -1
- package/dist/middlewares/elysia.js.map +1 -1
- package/dist/middlewares/express.js.map +1 -1
- package/dist/middlewares/hono.js.map +1 -1
- package/dist/middlewares/nextjs.js.map +1 -1
- package/dist/proxy/Proxy.d.ts +2 -0
- package/dist/proxy/Proxy.d.ts.map +1 -1
- package/dist/proxy/Proxy.js +117 -9
- package/dist/proxy/Proxy.js.map +1 -1
- package/dist/proxy/Service.d.ts +36 -1
- package/dist/proxy/Service.d.ts.map +1 -1
- package/dist/proxy/Service.js +9 -8
- package/dist/proxy/Service.js.map +1 -1
- package/dist/proxy/services/anthropic.d.ts.map +1 -1
- package/dist/proxy/services/anthropic.js +1 -0
- package/dist/proxy/services/anthropic.js.map +1 -1
- package/dist/proxy/services/openai.d.ts.map +1 -1
- package/dist/proxy/services/openai.js +1 -0
- package/dist/proxy/services/openai.js.map +1 -1
- package/dist/proxy/services/stripe.d.ts.map +1 -1
- package/dist/proxy/services/stripe.js +1 -0
- package/dist/proxy/services/stripe.js.map +1 -1
- package/dist/server/Mppx.d.ts +75 -13
- package/dist/server/Mppx.d.ts.map +1 -1
- package/dist/server/Mppx.js +201 -23
- package/dist/server/Mppx.js.map +1 -1
- package/dist/server/internal/html/config.d.ts +9 -9
- package/dist/server/internal/html/config.d.ts.map +1 -1
- package/dist/server/internal/html/constants.d.ts +17 -17
- package/dist/server/internal/html/constants.d.ts.map +1 -1
- package/dist/stripe/Methods.d.ts +10 -10
- package/dist/stripe/Methods.d.ts.map +1 -1
- package/dist/stripe/client/Charge.d.ts +10 -10
- package/dist/stripe/client/Methods.d.ts +10 -10
- package/dist/stripe/internal/constants.d.ts +1 -1
- package/dist/stripe/internal/constants.js +1 -1
- package/dist/stripe/internal/types.d.ts +1 -0
- package/dist/stripe/internal/types.d.ts.map +1 -1
- package/dist/stripe/server/Charge.d.ts +11 -11
- package/dist/stripe/server/Charge.d.ts.map +1 -1
- package/dist/stripe/server/Charge.js +49 -1
- package/dist/stripe/server/Charge.js.map +1 -1
- package/dist/stripe/server/Methods.d.ts +137 -48
- package/dist/stripe/server/Methods.d.ts.map +1 -1
- package/dist/stripe/server/Methods.js +259 -4
- package/dist/stripe/server/Methods.js.map +1 -1
- package/dist/stripe/server/internal/deposit-address.d.ts +13 -0
- package/dist/stripe/server/internal/deposit-address.d.ts.map +1 -0
- package/dist/stripe/server/internal/deposit-address.js +28 -0
- package/dist/stripe/server/internal/deposit-address.js.map +1 -0
- package/dist/stripe/server/internal/html.gen.d.ts +1 -1
- package/dist/stripe/server/internal/html.gen.d.ts.map +1 -1
- package/dist/stripe/server/internal/html.gen.js +1 -1
- package/dist/stripe/server/internal/html.gen.js.map +1 -1
- package/dist/stripe/server/internal/record-payment.d.ts +15 -0
- package/dist/stripe/server/internal/record-payment.d.ts.map +1 -0
- package/dist/stripe/server/internal/record-payment.js +42 -0
- package/dist/stripe/server/internal/record-payment.js.map +1 -0
- package/dist/stripe/server/internal/request.d.ts +25 -0
- package/dist/stripe/server/internal/request.d.ts.map +1 -0
- package/dist/stripe/server/internal/request.js +29 -0
- package/dist/stripe/server/internal/request.js.map +1 -0
- package/dist/tap/Constants.d.ts +28 -0
- package/dist/tap/Constants.d.ts.map +1 -0
- package/dist/tap/Constants.js +32 -0
- package/dist/tap/Constants.js.map +1 -0
- package/dist/tap/Types.d.ts +11 -0
- package/dist/tap/Types.d.ts.map +1 -0
- package/dist/tap/Types.js +2 -0
- package/dist/tap/Types.js.map +1 -0
- package/dist/tap/client/index.d.ts +26 -0
- package/dist/tap/client/index.d.ts.map +1 -0
- package/dist/tap/client/index.js +33 -0
- package/dist/tap/client/index.js.map +1 -0
- package/dist/tap/index.d.ts +5 -0
- package/dist/tap/index.d.ts.map +1 -0
- package/dist/tap/index.js +5 -0
- package/dist/tap/index.js.map +1 -0
- package/dist/tap/server/index.d.ts +20 -0
- package/dist/tap/server/index.d.ts.map +1 -0
- package/dist/tap/server/index.js +36 -0
- package/dist/tap/server/index.js.map +1 -0
- package/dist/tempo/Attribution.d.ts +1 -1
- package/dist/tempo/Methods.d.ts +60 -60
- package/dist/tempo/Methods.d.ts.map +1 -1
- package/dist/tempo/Proof.d.ts +16 -16
- package/dist/tempo/client/Charge.d.ts +19 -19
- package/dist/tempo/client/Charge.d.ts.map +1 -1
- package/dist/tempo/client/Charge.js +1 -7
- package/dist/tempo/client/Charge.js.map +1 -1
- package/dist/tempo/client/Methods.d.ts +38 -38
- package/dist/tempo/client/Methods.js.map +1 -1
- package/dist/tempo/client/Subscription.d.ts +23 -23
- package/dist/tempo/client/Subscription.js.map +1 -1
- package/dist/tempo/internal/address.d.ts +2 -1
- package/dist/tempo/internal/address.d.ts.map +1 -1
- package/dist/tempo/internal/address.js +3 -1
- package/dist/tempo/internal/address.js.map +1 -1
- package/dist/tempo/internal/auto-swap.d.ts.map +1 -1
- package/dist/tempo/internal/auto-swap.js +4 -19
- package/dist/tempo/internal/auto-swap.js.map +1 -1
- package/dist/tempo/internal/defaults.d.ts +6 -6
- package/dist/tempo/internal/defaults.d.ts.map +1 -1
- package/dist/tempo/internal/fee-payer.d.ts +12 -12
- package/dist/tempo/internal/fee-payer.d.ts.map +1 -1
- package/dist/tempo/internal/fee-payer.js.map +1 -1
- package/dist/tempo/internal/proof.d.ts +17 -17
- package/dist/tempo/internal/proof.d.ts.map +1 -1
- package/dist/tempo/legacy/client/Session.d.ts +20 -20
- package/dist/tempo/legacy/client/Session.js.map +1 -1
- package/dist/tempo/legacy/client/SessionManager.js.map +1 -1
- package/dist/tempo/legacy/index.d.ts +1 -3
- package/dist/tempo/legacy/index.d.ts.map +1 -1
- package/dist/tempo/legacy/index.js +1 -3
- package/dist/tempo/legacy/index.js.map +1 -1
- package/dist/tempo/legacy/session/escrow.abi.d.ts +374 -374
- package/dist/tempo/legacy/session/escrow.abi.d.ts.map +1 -1
- package/dist/tempo/server/Charge.d.ts +34 -12
- package/dist/tempo/server/Charge.d.ts.map +1 -1
- package/dist/tempo/server/Charge.js +44 -39
- package/dist/tempo/server/Charge.js.map +1 -1
- package/dist/tempo/server/Methods.d.ts +37 -52
- package/dist/tempo/server/Methods.d.ts.map +1 -1
- package/dist/tempo/server/Methods.js +0 -14
- package/dist/tempo/server/Methods.js.map +1 -1
- package/dist/tempo/server/Relay.d.ts +14 -5
- package/dist/tempo/server/Relay.d.ts.map +1 -1
- package/dist/tempo/server/Relay.js +6 -4
- package/dist/tempo/server/Relay.js.map +1 -1
- package/dist/tempo/server/SponsorBudget.d.ts.map +1 -1
- package/dist/tempo/server/SponsorBudget.js +7 -1
- package/dist/tempo/server/SponsorBudget.js.map +1 -1
- package/dist/tempo/server/Subscription.d.ts +25 -25
- package/dist/tempo/server/Subscription.d.ts.map +1 -1
- package/dist/tempo/server/Subscription.js +2 -0
- package/dist/tempo/server/Subscription.js.map +1 -1
- package/dist/tempo/server/index.d.ts +1 -1
- package/dist/tempo/server/index.d.ts.map +1 -1
- package/dist/tempo/server/index.js +1 -1
- package/dist/tempo/server/index.js.map +1 -1
- package/dist/tempo/server/internal/html.gen.d.ts +1 -1
- package/dist/tempo/server/internal/html.gen.d.ts.map +1 -1
- package/dist/tempo/server/internal/html.gen.js +1 -1
- package/dist/tempo/server/internal/html.gen.js.map +1 -1
- package/dist/tempo/server/internal/transport.d.ts +2 -0
- package/dist/tempo/server/internal/transport.d.ts.map +1 -1
- package/dist/tempo/server/internal/transport.js +9 -2
- package/dist/tempo/server/internal/transport.js.map +1 -1
- package/dist/tempo/session/client/ChannelOps.js.map +1 -1
- package/dist/tempo/session/client/CredentialState.d.ts +1 -1
- package/dist/tempo/session/client/CredentialState.js.map +1 -1
- package/dist/tempo/session/client/ReceiptCoordinator.js.map +1 -1
- package/dist/tempo/session/client/Runtime.js.map +1 -1
- package/dist/tempo/session/client/Session.d.ts +19 -19
- package/dist/tempo/session/client/Session.d.ts.map +1 -1
- package/dist/tempo/session/client/Session.js +128 -14
- package/dist/tempo/session/client/Session.js.map +1 -1
- package/dist/tempo/session/client/SessionManager.d.ts.map +1 -1
- package/dist/tempo/session/client/SessionManager.js +62 -20
- package/dist/tempo/session/client/SessionManager.js.map +1 -1
- package/dist/tempo/session/client/Transports.d.ts +9 -1
- package/dist/tempo/session/client/Transports.d.ts.map +1 -1
- package/dist/tempo/session/client/Transports.js +36 -13
- package/dist/tempo/session/client/Transports.js.map +1 -1
- package/dist/tempo/session/precompile/Chain.d.ts +27 -0
- package/dist/tempo/session/precompile/Chain.d.ts.map +1 -1
- package/dist/tempo/session/precompile/Chain.js +68 -7
- package/dist/tempo/session/precompile/Chain.js.map +1 -1
- package/dist/tempo/session/precompile/Protocol.js.map +1 -1
- package/dist/tempo/session/precompile/Voucher.d.ts +4 -4
- package/dist/tempo/session/precompile/Voucher.d.ts.map +1 -1
- package/dist/tempo/session/precompile/escrow.abi.d.ts +306 -306
- package/dist/tempo/session/precompile/escrow.abi.d.ts.map +1 -1
- package/dist/tempo/session/server/ChannelStore.d.ts +9 -0
- package/dist/tempo/session/server/ChannelStore.d.ts.map +1 -1
- package/dist/tempo/session/server/ChannelStore.js +16 -8
- package/dist/tempo/session/server/ChannelStore.js.map +1 -1
- package/dist/tempo/session/server/CredentialVerification.d.ts +30 -13
- package/dist/tempo/session/server/CredentialVerification.d.ts.map +1 -1
- package/dist/tempo/session/server/CredentialVerification.js +207 -13
- package/dist/tempo/session/server/CredentialVerification.js.map +1 -1
- package/dist/tempo/session/server/MeteredStream.d.ts +3 -0
- package/dist/tempo/session/server/MeteredStream.d.ts.map +1 -1
- package/dist/tempo/session/server/MeteredStream.js +3 -1
- package/dist/tempo/session/server/MeteredStream.js.map +1 -1
- package/dist/tempo/session/server/Session.d.ts +32 -21
- package/dist/tempo/session/server/Session.d.ts.map +1 -1
- package/dist/tempo/session/server/Session.js +116 -53
- package/dist/tempo/session/server/Session.js.map +1 -1
- package/dist/tempo/session/server/Sse.d.ts +3 -1
- package/dist/tempo/session/server/Sse.d.ts.map +1 -1
- package/dist/tempo/session/server/Sse.js +2 -1
- package/dist/tempo/session/server/Sse.js.map +1 -1
- package/dist/tempo/session/server/Transports.d.ts +1 -1
- package/dist/tempo/session/server/Transports.d.ts.map +1 -1
- package/dist/tempo/session/server/Transports.js +1 -0
- package/dist/tempo/session/server/Transports.js.map +1 -1
- package/dist/tempo/session/server/Ws.d.ts +6 -1
- package/dist/tempo/session/server/Ws.d.ts.map +1 -1
- package/dist/tempo/session/server/Ws.js +4 -0
- package/dist/tempo/session/server/Ws.js.map +1 -1
- package/dist/tempo/subscription/KeyAuthorization.d.ts +38 -866
- package/dist/tempo/subscription/KeyAuthorization.d.ts.map +1 -1
- package/dist/tempo/subscription/KeyAuthorization.js +14 -3
- package/dist/tempo/subscription/KeyAuthorization.js.map +1 -1
- package/dist/viem/Account.d.ts.map +1 -1
- package/dist/viem/Account.js.map +1 -1
- package/dist/viem/Client.d.ts.map +1 -1
- package/dist/viem/Client.js +6 -1
- package/dist/viem/Client.js.map +1 -1
- package/dist/web-bot-auth/Constants.d.ts +20 -0
- package/dist/web-bot-auth/Constants.d.ts.map +1 -0
- package/dist/web-bot-auth/Constants.js +24 -0
- package/dist/web-bot-auth/Constants.js.map +1 -0
- package/dist/web-bot-auth/Types.d.ts +10 -0
- package/dist/web-bot-auth/Types.d.ts.map +1 -0
- package/dist/web-bot-auth/Types.js +2 -0
- package/dist/web-bot-auth/Types.js.map +1 -0
- package/dist/web-bot-auth/client/index.d.ts +29 -0
- package/dist/web-bot-auth/client/index.d.ts.map +1 -0
- package/dist/web-bot-auth/client/index.js +64 -0
- package/dist/web-bot-auth/client/index.js.map +1 -0
- package/dist/web-bot-auth/index.d.ts +7 -0
- package/dist/web-bot-auth/index.d.ts.map +1 -0
- package/dist/web-bot-auth/index.js +7 -0
- package/dist/web-bot-auth/index.js.map +1 -0
- package/dist/web-bot-auth/internal/JwkThumbprint.d.ts +5 -0
- package/dist/web-bot-auth/internal/JwkThumbprint.d.ts.map +1 -0
- package/dist/web-bot-auth/internal/JwkThumbprint.js +20 -0
- package/dist/web-bot-auth/internal/JwkThumbprint.js.map +1 -0
- package/dist/web-bot-auth/internal/SignatureAgent.d.ts +3 -0
- package/dist/web-bot-auth/internal/SignatureAgent.d.ts.map +1 -0
- package/dist/web-bot-auth/internal/SignatureAgent.js +18 -0
- package/dist/web-bot-auth/internal/SignatureAgent.js.map +1 -0
- package/dist/web-bot-auth/server/index.d.ts +35 -0
- package/dist/web-bot-auth/server/index.d.ts.map +1 -0
- package/dist/web-bot-auth/server/index.js +88 -0
- package/dist/web-bot-auth/server/index.js.map +1 -0
- package/dist/x402/Assets.d.ts.map +1 -1
- package/dist/x402/Types.d.ts +6 -6
- package/dist/x402/Types.d.ts.map +1 -1
- package/dist/x402/server/EvmCharge.d.ts.map +1 -1
- package/dist/x402/server/EvmCharge.js +32 -20
- package/dist/x402/server/EvmCharge.js.map +1 -1
- package/package.json +20 -4
- package/src/Challenge.fuzz.test.ts +80 -47
- package/src/Challenge.test.ts +65 -0
- package/src/Challenge.ts +39 -35
- package/src/Method.ts +82 -68
- package/src/Store.test-d.ts +16 -0
- package/src/Store.test.ts +50 -0
- package/src/Store.ts +68 -0
- package/src/attestation/Attestation.integration.test.ts +208 -0
- package/src/attestation/Client.test.ts +83 -0
- package/src/attestation/Client.ts +34 -0
- package/src/attestation/Constants.ts +15 -0
- package/src/attestation/Server.test.ts +60 -0
- package/src/attestation/Server.ts +12 -0
- package/src/attestation/Types.test-d.ts +54 -0
- package/src/attestation/Types.ts +77 -0
- package/src/attestation/index.ts +5 -0
- package/src/attestation/internal/HttpMessageSignature.test.ts +101 -0
- package/src/attestation/internal/HttpMessageSignature.ts +429 -0
- package/src/attestation/internal/SigningContext.ts +13 -0
- package/src/bin.js +2 -0
- package/src/cli/cli.ts +1 -0
- package/src/cli/validate/payment.ts +18 -4
- package/src/cli/validate.test.ts +16 -0
- package/src/client/Mppx.test-d.ts +17 -0
- package/src/client/Mppx.test.ts +14 -14
- package/src/client/Mppx.ts +25 -4
- package/src/client/Transport.test.ts +12 -45
- package/src/client/Transport.ts +3 -24
- package/src/client/internal/Fetch.test.ts +77 -0
- package/src/client/internal/Fetch.ts +112 -14
- package/src/client/internal/MethodChallenge.ts +5 -0
- package/src/client/internal/MethodResponse.ts +28 -0
- package/src/discovery/OpenApi.test.ts +170 -0
- package/src/discovery/OpenApi.ts +16 -48
- package/src/discovery/internal/Metadata.ts +51 -0
- package/src/evm/server/Charge.ts +6 -1
- package/src/internal/AcceptPayment.test.ts +12 -8
- package/src/internal/types.ts +9 -0
- package/src/mcp/client/McpClient.integration.test.ts +19 -32
- package/src/middlewares/elysia.test.ts +2 -12
- package/src/middlewares/express.test.ts +2 -12
- package/src/middlewares/hono.test.ts +6 -9
- package/src/middlewares/nextjs.test.ts +2 -12
- package/src/proxy/Proxy.test.ts +26 -19
- package/src/proxy/Proxy.ts +147 -9
- package/src/proxy/Proxy.upstreamError.test.ts +364 -0
- package/src/proxy/Service.test.ts +73 -3
- package/src/proxy/Service.ts +50 -23
- package/src/proxy/services/anthropic.ts +1 -0
- package/src/proxy/services/hooks.test-d.ts +14 -0
- package/src/proxy/services/hooks.test.ts +44 -0
- package/src/proxy/services/openai.ts +1 -0
- package/src/proxy/services/stripe.ts +1 -0
- package/src/server/Methods.test-d.ts +88 -0
- package/src/server/Methods.test.ts +69 -0
- package/src/server/Mppx.test-d.ts +141 -7
- package/src/server/Mppx.test.ts +1017 -119
- package/src/server/Mppx.ts +350 -54
- package/src/stripe/internal/constants.ts +1 -1
- package/src/stripe/internal/types.ts +1 -0
- package/src/stripe/server/Charge.test-d.ts +16 -1
- package/src/stripe/server/Charge.test.ts +79 -0
- package/src/stripe/server/Charge.ts +54 -1
- package/src/stripe/server/Methods.test-d.ts +157 -0
- package/src/stripe/server/Methods.test.ts +403 -0
- package/src/stripe/server/Methods.ts +423 -6
- package/src/stripe/server/internal/deposit-address.ts +57 -0
- package/src/stripe/server/internal/html/node_modules/.bin/mppx +3 -3
- package/src/stripe/server/internal/html/package.json +1 -1
- package/src/stripe/server/internal/html.gen.ts +1 -1
- package/src/stripe/server/internal/record-payment.ts +66 -0
- package/src/stripe/server/internal/request.ts +49 -0
- package/src/tap/Constants.ts +32 -0
- package/src/tap/Tap.test.ts +125 -0
- package/src/tap/Types.ts +11 -0
- package/src/tap/client/index.ts +54 -0
- package/src/tap/index.ts +4 -0
- package/src/tap/server/index.ts +48 -0
- package/src/tempo/PublicExports.test-d.ts +3 -3
- package/src/tempo/client/Charge.ts +1 -19
- package/src/tempo/internal/address.test.ts +42 -0
- package/src/tempo/internal/address.ts +3 -3
- package/src/tempo/internal/auto-swap.test.ts +4 -4
- package/src/tempo/internal/auto-swap.ts +7 -50
- package/src/tempo/legacy/README.md +5 -5
- package/src/tempo/legacy/index.ts +1 -3
- package/src/tempo/server/AtomicStore.test-d.ts +13 -0
- package/src/tempo/server/Charge.test.ts +19 -84
- package/src/tempo/server/Charge.ts +92 -56
- package/src/tempo/server/Methods.ts +0 -20
- package/src/tempo/server/Relay.test.ts +161 -7
- package/src/tempo/server/Relay.ts +15 -6
- package/src/tempo/server/SponsorBudget.test.ts +29 -0
- package/src/tempo/server/SponsorBudget.ts +7 -1
- package/src/tempo/server/Subscription.ts +4 -1
- package/src/tempo/server/index.ts +1 -1
- package/src/tempo/server/internal/html/node_modules/.bin/mppx +3 -3
- package/src/tempo/server/internal/html/package.json +1 -1
- package/src/tempo/server/internal/html.gen.ts +1 -1
- package/src/tempo/server/internal/transport.test.ts +22 -3
- package/src/tempo/server/internal/transport.ts +15 -3
- package/src/tempo/session/README.md +119 -0
- package/src/tempo/session/client/Session.test.ts +299 -33
- package/src/tempo/session/client/Session.ts +152 -16
- package/src/tempo/session/client/SessionManager.test.ts +216 -9
- package/src/tempo/session/client/SessionManager.ts +63 -17
- package/src/tempo/session/client/Transports.test.ts +22 -0
- package/src/tempo/session/client/Transports.ts +58 -22
- package/src/tempo/session/precompile/Chain.ts +131 -11
- package/src/tempo/session/server/ChannelStore.ts +33 -12
- package/src/tempo/session/server/CredentialVerification.test.ts +4 -4
- package/src/tempo/session/server/CredentialVerification.ts +340 -28
- package/src/tempo/session/server/MeteredStream.ts +5 -1
- package/src/tempo/session/server/Session.test.ts +483 -36
- package/src/tempo/session/server/Session.ts +159 -60
- package/src/tempo/session/server/Sse.test.ts +77 -0
- package/src/tempo/session/server/Sse.ts +8 -1
- package/src/tempo/session/server/Transports.ts +2 -1
- package/src/tempo/session/server/Ws.test.ts +171 -0
- package/src/tempo/session/server/Ws.ts +10 -1
- package/src/tempo/subscription/KeyAuthorization.test.ts +70 -1
- package/src/tempo/subscription/KeyAuthorization.ts +14 -3
- package/src/viem/Client.test.ts +18 -1
- package/src/viem/Client.ts +7 -1
- package/src/web-bot-auth/Constants.ts +24 -0
- package/src/web-bot-auth/Types.ts +9 -0
- package/src/web-bot-auth/WebBotAuth.test.ts +182 -0
- package/src/web-bot-auth/client/index.ts +84 -0
- package/src/web-bot-auth/index.ts +6 -0
- package/src/web-bot-auth/internal/JwkThumbprint.ts +21 -0
- package/src/web-bot-auth/internal/SignatureAgent.ts +18 -0
- package/src/web-bot-auth/server/index.ts +113 -0
- package/src/x402/Exact.e2e.test.ts +121 -81
- package/src/x402/Exact.localnet.test.ts +1 -1
- package/src/x402/server/EvmCharge.ts +35 -19
- package/dist/tempo/legacy/server/Session.d.ts +0 -208
- package/dist/tempo/legacy/server/Session.d.ts.map +0 -1
- package/dist/tempo/legacy/server/Session.js +0 -698
- package/dist/tempo/legacy/server/Session.js.map +0 -1
- package/dist/tempo/legacy/server/index.d.ts +0 -5
- package/dist/tempo/legacy/server/index.d.ts.map +0 -1
- package/dist/tempo/legacy/server/index.js +0 -5
- package/dist/tempo/legacy/server/index.js.map +0 -1
- package/dist/tempo/legacy/session/ChannelStore.d.ts +0 -22
- package/dist/tempo/legacy/session/ChannelStore.d.ts.map +0 -1
- package/dist/tempo/legacy/session/ChannelStore.js +0 -6
- package/dist/tempo/legacy/session/ChannelStore.js.map +0 -1
- package/src/tempo/legacy/server/Defaults.test-d.ts +0 -9
- package/src/tempo/legacy/server/Session.test.ts +0 -6370
- package/src/tempo/legacy/server/Session.ts +0 -1024
- package/src/tempo/legacy/server/index.ts +0 -4
- package/src/tempo/legacy/session/ChannelStore.test.ts +0 -58
- package/src/tempo/legacy/session/ChannelStore.ts +0 -39
|
@@ -316,8 +316,8 @@ function readTransactionType(value: unknown): 'transaction' {
|
|
|
316
316
|
throw new VerificationFailedError({ reason: 'invalid session credential transaction type' })
|
|
317
317
|
}
|
|
318
318
|
|
|
319
|
-
/** Shared inputs required to
|
|
320
|
-
export type
|
|
319
|
+
/** Shared inputs required to broadcast a verified precompile session credential payload. */
|
|
320
|
+
export type BroadcastCredentialPayloadParameters = {
|
|
321
321
|
/** Optional account override used for payee-side close settlement. */
|
|
322
322
|
account?: viem_Account | undefined
|
|
323
323
|
/** Challenge echoed by the credential. */
|
|
@@ -352,24 +352,31 @@ export type VerifyCredentialPayloadParameters = {
|
|
|
352
352
|
store: ChannelStore.ChannelStore
|
|
353
353
|
}
|
|
354
354
|
|
|
355
|
-
/**
|
|
356
|
-
export type
|
|
357
|
-
|
|
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'> & {
|
|
358
361
|
/** Credential payload for the selected action. */
|
|
359
362
|
payload: Extract<SessionCredentialPayload, { action: action }>
|
|
360
363
|
}
|
|
361
364
|
|
|
362
|
-
/**
|
|
363
|
-
export type
|
|
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'>
|
|
364
371
|
|
|
365
|
-
/** Inputs for
|
|
366
|
-
export type TopUpCredentialActionParameters =
|
|
372
|
+
/** Inputs for broadcasting a top-up transaction credential. */
|
|
373
|
+
export type TopUpCredentialActionParameters = BroadcastCredentialActionParameters<'topUp'>
|
|
367
374
|
|
|
368
|
-
/** Inputs for
|
|
369
|
-
export type VoucherCredentialActionParameters =
|
|
375
|
+
/** Inputs for broadcasting and accepting an incremental voucher credential. */
|
|
376
|
+
export type VoucherCredentialActionParameters = BroadcastCredentialActionParameters<'voucher'>
|
|
370
377
|
|
|
371
|
-
/** Inputs for
|
|
372
|
-
export type CloseCredentialActionParameters =
|
|
378
|
+
/** Inputs for broadcasting and settling a cooperative close credential. */
|
|
379
|
+
export type CloseCredentialActionParameters = BroadcastCredentialActionParameters<'close'>
|
|
373
380
|
|
|
374
381
|
const refreshOnChainVerificationCache = {
|
|
375
382
|
close: false,
|
|
@@ -378,18 +385,323 @@ const refreshOnChainVerificationCache = {
|
|
|
378
385
|
voucher: false,
|
|
379
386
|
} satisfies Record<SessionCredentialPayload['action'], boolean>
|
|
380
387
|
|
|
381
|
-
/**
|
|
382
|
-
export
|
|
383
|
-
|
|
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,
|
|
384
689
|
): Promise<SessionReceipt> {
|
|
385
|
-
const receipt = await
|
|
690
|
+
const receipt = await broadcastCredentialAction(context)
|
|
386
691
|
if (refreshOnChainVerificationCache[context.payload.action])
|
|
387
692
|
context.lastOnChainVerified.set(receipt.channelId, Date.now())
|
|
388
693
|
return receipt
|
|
389
694
|
}
|
|
390
695
|
|
|
391
|
-
|
|
696
|
+
/** @deprecated Use {@link broadcastCredentialPayload}. */
|
|
697
|
+
export async function verifyCredentialPayload(
|
|
392
698
|
context: VerifyCredentialPayloadParameters,
|
|
699
|
+
): Promise<SessionReceipt> {
|
|
700
|
+
return broadcastCredentialPayload(context)
|
|
701
|
+
}
|
|
702
|
+
|
|
703
|
+
function broadcastCredentialAction(
|
|
704
|
+
context: BroadcastCredentialPayloadParameters,
|
|
393
705
|
): Promise<SessionReceipt> {
|
|
394
706
|
const { payload } = context
|
|
395
707
|
switch (payload.action) {
|
|
@@ -405,9 +717,9 @@ function verifyCredentialAction(
|
|
|
405
717
|
}
|
|
406
718
|
|
|
407
719
|
function actionContext<action extends SessionCredentialPayload['action']>(
|
|
408
|
-
context:
|
|
720
|
+
context: BroadcastCredentialPayloadParameters,
|
|
409
721
|
payload: Extract<SessionCredentialPayload, { action: action }>,
|
|
410
|
-
):
|
|
722
|
+
): BroadcastCredentialActionParameters<action> {
|
|
411
723
|
return { ...context, payload }
|
|
412
724
|
}
|
|
413
725
|
|
|
@@ -597,14 +909,14 @@ async function handleVoucherCredential(
|
|
|
597
909
|
})
|
|
598
910
|
assertCredentialSourceCanSpend({ chainId, channel, source: credentialSource })
|
|
599
911
|
if (channel.finalized) throw new ChannelClosedError({ reason: 'channel is finalized' })
|
|
600
|
-
const
|
|
601
|
-
|
|
602
|
-
|
|
603
|
-
|
|
604
|
-
|
|
605
|
-
|
|
606
|
-
|
|
607
|
-
}
|
|
912
|
+
const channelState = await resolveVoucherChannelState({
|
|
913
|
+
channel,
|
|
914
|
+
channelId,
|
|
915
|
+
channelStateTtl,
|
|
916
|
+
client,
|
|
917
|
+
escrow,
|
|
918
|
+
lastOnChainVerified,
|
|
919
|
+
})
|
|
608
920
|
if (channelState.closeRequestedAt !== 0) {
|
|
609
921
|
await store.updateChannel(channelId, (current) =>
|
|
610
922
|
current
|
|
@@ -1,5 +1,6 @@
|
|
|
1
1
|
import type { Hex } from 'viem'
|
|
2
2
|
|
|
3
|
+
import type { MaybePromise } from '../../../internal/types.js'
|
|
3
4
|
import type { NeedVoucherEvent } from '../precompile/Protocol.js'
|
|
4
5
|
import * as ChannelStore from './ChannelStore.js'
|
|
5
6
|
import { commitReservedCharges, reserveChargeOrWait } from './Transports.js'
|
|
@@ -37,6 +38,8 @@ export type MeteredStreamOptions = {
|
|
|
37
38
|
formatNeedVoucher(parameters: NeedVoucherEvent): string
|
|
38
39
|
/** Async source or manual-charge source. */
|
|
39
40
|
generate: SessionStreamGenerator
|
|
41
|
+
/** Runs after a nonzero reserved charge has been committed. */
|
|
42
|
+
onChargeCommitted?: ((channel: ChannelStore.State) => MaybePromise<unknown>) | undefined
|
|
40
43
|
/** Store polling interval when `waitForUpdate` is unavailable. */
|
|
41
44
|
pollIntervalMs: number
|
|
42
45
|
/** Pre-authorized units that may be emitted without reserving new voucher headroom. */
|
|
@@ -82,7 +85,7 @@ export async function* meterIterable(options: MeteredStreamOptions): AsyncGenera
|
|
|
82
85
|
for await (const value of iterable) {
|
|
83
86
|
if (options.signal?.aborted) break
|
|
84
87
|
if (typeof options.generate !== 'function') await charge()
|
|
85
|
-
await commitReservedCharges({
|
|
88
|
+
const channel = await commitReservedCharges({
|
|
86
89
|
store: options.store,
|
|
87
90
|
channelId: options.channelId,
|
|
88
91
|
amount: reservedAmount,
|
|
@@ -90,6 +93,7 @@ export async function* meterIterable(options: MeteredStreamOptions): AsyncGenera
|
|
|
90
93
|
})
|
|
91
94
|
reservedAmount = 0n
|
|
92
95
|
reservedUnits = 0
|
|
96
|
+
if (channel) await options.onChargeCommitted?.(channel)
|
|
93
97
|
yield value
|
|
94
98
|
}
|
|
95
99
|
}
|