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
|
@@ -310,6 +310,28 @@ describe('HttpManagement', () => {
|
|
|
310
310
|
expect(restoreCumulative).toHaveBeenCalledWith(channelId, 5n)
|
|
311
311
|
})
|
|
312
312
|
|
|
313
|
+
test('retryHttpPaymentRequired restores cumulative authorization when retry throws', async () => {
|
|
314
|
+
const entry = channel({ cumulativeAmount: 5n })
|
|
315
|
+
const restoreCumulative = vi.fn()
|
|
316
|
+
|
|
317
|
+
await expect(
|
|
318
|
+
retryHttpPaymentRequired({
|
|
319
|
+
createSessionCredential: async () => 'voucher-credential',
|
|
320
|
+
fetch: async () => {
|
|
321
|
+
throw new Error('network failed')
|
|
322
|
+
},
|
|
323
|
+
getChannel: () => entry,
|
|
324
|
+
input: 'https://example.test/resource',
|
|
325
|
+
response: response402(challenge(snapshot())),
|
|
326
|
+
restoreCumulative,
|
|
327
|
+
setChallenge() {},
|
|
328
|
+
topUpIfNeeded: async () => {},
|
|
329
|
+
}),
|
|
330
|
+
).rejects.toThrow('network failed')
|
|
331
|
+
|
|
332
|
+
expect(restoreCumulative).toHaveBeenCalledWith(channelId, 5n)
|
|
333
|
+
})
|
|
334
|
+
|
|
313
335
|
test('closeHttpSession posts a close credential and parses the receipt', async () => {
|
|
314
336
|
const entry = channel()
|
|
315
337
|
const createSessionCredential = vi.fn(async (_challenge, context: SessionContext) => {
|
|
@@ -47,6 +47,8 @@ export const WebSocketReadyState = {
|
|
|
47
47
|
/** Client-side close code used for payment protocol errors. */
|
|
48
48
|
export const ClientWebSocketProtocolErrorCloseCode = 3008
|
|
49
49
|
|
|
50
|
+
const webSocketChallengeRefreshWindowMs = 5_000
|
|
51
|
+
|
|
50
52
|
type EventType = 'close' | 'error' | 'message' | 'open'
|
|
51
53
|
type ManagedEventMap = {
|
|
52
54
|
close: { code: number; reason: string; type: 'close'; wasClean: boolean }
|
|
@@ -489,7 +491,7 @@ export type RetryHttpPaymentRequiredParameters = {
|
|
|
489
491
|
/** Failed HTTP response that may contain a session challenge. */
|
|
490
492
|
response: Response
|
|
491
493
|
/** Restores local cumulative authorization if the voucher retry fails. */
|
|
492
|
-
restoreCumulative(channelId: Hex.Hex, cumulativeAmount: bigint): void
|
|
494
|
+
restoreCumulative(channelId: Hex.Hex, cumulativeAmount: bigint): void | Promise<void>
|
|
493
495
|
/** Stores the selected follow-up challenge on the manager. */
|
|
494
496
|
setChallenge(challenge: TempoSessionChallenge): void
|
|
495
497
|
/** Performs automatic top-up before the voucher retry when deposit is insufficient. */
|
|
@@ -692,18 +694,25 @@ export async function retryHttpPaymentRequired(
|
|
|
692
694
|
currentChannel.cumulativeAmount > requiredCumulative
|
|
693
695
|
? currentChannel.cumulativeAmount
|
|
694
696
|
: requiredCumulative
|
|
695
|
-
const
|
|
696
|
-
|
|
697
|
-
|
|
698
|
-
|
|
699
|
-
|
|
700
|
-
|
|
701
|
-
|
|
702
|
-
|
|
703
|
-
|
|
704
|
-
|
|
697
|
+
const restore = () => parameters.restoreCumulative(snapshot.channelId, cumulativeBeforeVoucher)
|
|
698
|
+
let retry: Response
|
|
699
|
+
try {
|
|
700
|
+
const credential = await parameters.createSessionCredential(challenge, {
|
|
701
|
+
action: 'voucher',
|
|
702
|
+
channelId: snapshot.channelId,
|
|
703
|
+
descriptor: currentChannel.descriptor,
|
|
704
|
+
cumulativeAmountRaw: cumulativeAmount.toString(),
|
|
705
|
+
})
|
|
706
|
+
retry = await parameters.fetch(
|
|
707
|
+
parameters.input,
|
|
708
|
+
requestInitWithAuthorization(parameters.input, parameters.init, credential),
|
|
709
|
+
)
|
|
710
|
+
} catch (error) {
|
|
711
|
+
await restore()
|
|
712
|
+
throw error
|
|
713
|
+
}
|
|
705
714
|
if (!retry.ok && !retry.headers.get(Constants.Headers.paymentReceipt)) {
|
|
706
|
-
|
|
715
|
+
await restore()
|
|
707
716
|
}
|
|
708
717
|
return retry
|
|
709
718
|
}
|
|
@@ -1110,6 +1119,15 @@ export type PrepareWebSocketSessionParameters = {
|
|
|
1110
1119
|
signal?: AbortSignal | undefined
|
|
1111
1120
|
}
|
|
1112
1121
|
|
|
1122
|
+
/** Inputs for probing a paid WebSocket endpoint without creating a credential. */
|
|
1123
|
+
export type ProbeWebSocketSessionParameters = Omit<
|
|
1124
|
+
PrepareWebSocketSessionParameters,
|
|
1125
|
+
'createSessionCredential'
|
|
1126
|
+
>
|
|
1127
|
+
|
|
1128
|
+
/** Result of resolving the current payment challenge for a WebSocket endpoint. */
|
|
1129
|
+
export type ProbedWebSocketSession = Omit<PreparedWebSocketSession, 'credential'>
|
|
1130
|
+
|
|
1113
1131
|
/** Result of the HTTP probe and opening credential creation for a WebSocket session. */
|
|
1114
1132
|
export type PreparedWebSocketSession = {
|
|
1115
1133
|
/** Selected tempo/session challenge from the HTTP probe. */
|
|
@@ -1173,6 +1191,8 @@ export type OpenWebSocketSessionParameters = {
|
|
|
1173
1191
|
getChannel(): ChannelEntry | null
|
|
1174
1192
|
/** Stores the active socket state in the manager. */
|
|
1175
1193
|
setSocketSession(session: ActiveSocketSession): void
|
|
1194
|
+
/** Fetches the route's current challenge after the active one expires. */
|
|
1195
|
+
refreshChallenge(): Promise<TempoSessionChallenge>
|
|
1176
1196
|
/** Validates a cumulative amount against local client policy. */
|
|
1177
1197
|
assertVoucherWithinLocalLimit(cumulativeAmount: bigint): void
|
|
1178
1198
|
/** Applies an incoming receipt to manager state. */
|
|
@@ -1213,10 +1233,10 @@ export type ValidateSocketPaymentReceiptParameters = ExpectedSocketReceiptParame
|
|
|
1213
1233
|
expectedCloseAmount: string | null
|
|
1214
1234
|
}
|
|
1215
1235
|
|
|
1216
|
-
/** Probes a WebSocket endpoint over HTTP and
|
|
1217
|
-
export async function
|
|
1218
|
-
parameters:
|
|
1219
|
-
): Promise<
|
|
1236
|
+
/** Probes a WebSocket endpoint over HTTP and returns its current session challenge. */
|
|
1237
|
+
export async function probeWebSocketSession(
|
|
1238
|
+
parameters: ProbeWebSocketSessionParameters,
|
|
1239
|
+
): Promise<ProbedWebSocketSession> {
|
|
1220
1240
|
const wsUrl = new URL(parameters.input.toString())
|
|
1221
1241
|
const httpUrl = webSocketProbeUrl(wsUrl)
|
|
1222
1242
|
parameters.onProbeUrl?.(httpUrl)
|
|
@@ -1239,12 +1259,22 @@ export async function prepareWebSocketSession(
|
|
|
1239
1259
|
|
|
1240
1260
|
return {
|
|
1241
1261
|
challenge,
|
|
1242
|
-
credential: await parameters.createSessionCredential(challenge, {}),
|
|
1243
1262
|
httpUrl,
|
|
1244
1263
|
wsUrl,
|
|
1245
1264
|
}
|
|
1246
1265
|
}
|
|
1247
1266
|
|
|
1267
|
+
/** Probes a WebSocket endpoint over HTTP and creates the opening credential. */
|
|
1268
|
+
export async function prepareWebSocketSession(
|
|
1269
|
+
parameters: PrepareWebSocketSessionParameters,
|
|
1270
|
+
): Promise<PreparedWebSocketSession> {
|
|
1271
|
+
const probed = await probeWebSocketSession(parameters)
|
|
1272
|
+
return {
|
|
1273
|
+
...probed,
|
|
1274
|
+
credential: await parameters.createSessionCredential(probed.challenge, {}),
|
|
1275
|
+
}
|
|
1276
|
+
}
|
|
1277
|
+
|
|
1248
1278
|
/** Creates the initial runtime state for a paid WebSocket from its opening credential. */
|
|
1249
1279
|
export function createActiveSocketSession(
|
|
1250
1280
|
parameters: CreateActiveSocketSessionParameters,
|
|
@@ -1452,9 +1482,18 @@ async function handleNeedVoucher(
|
|
|
1452
1482
|
event: NeedVoucherEvent,
|
|
1453
1483
|
) {
|
|
1454
1484
|
try {
|
|
1485
|
+
let challenge = parameters.driver.challenge
|
|
1486
|
+
if (
|
|
1487
|
+
challenge.expires &&
|
|
1488
|
+
new Date(challenge.expires).getTime() <= Date.now() + webSocketChallengeRefreshWindowMs
|
|
1489
|
+
) {
|
|
1490
|
+
challenge = await parameters.driver.refreshChallenge()
|
|
1491
|
+
parameters.driver.challenge = challenge
|
|
1492
|
+
parameters.socketState.challenge = challenge
|
|
1493
|
+
}
|
|
1455
1494
|
const resolution = await resolveNeedVoucherContext({
|
|
1456
1495
|
assertVoucherWithinLocalLimit: parameters.driver.assertVoucherWithinLocalLimit,
|
|
1457
|
-
challenge
|
|
1496
|
+
challenge,
|
|
1458
1497
|
event,
|
|
1459
1498
|
expectedChannelId: parameters.socketState.channelId,
|
|
1460
1499
|
getChannel: parameters.driver.getChannel,
|
|
@@ -1469,10 +1508,7 @@ async function handleNeedVoucher(
|
|
|
1469
1508
|
)
|
|
1470
1509
|
return
|
|
1471
1510
|
}
|
|
1472
|
-
const voucher = await parameters.driver.createSessionCredential(
|
|
1473
|
-
parameters.driver.challenge,
|
|
1474
|
-
resolution.context,
|
|
1475
|
-
)
|
|
1511
|
+
const voucher = await parameters.driver.createSessionCredential(challenge, resolution.context)
|
|
1476
1512
|
parameters.rawSocket.send(Ws.formatAuthorizationMessage(voucher))
|
|
1477
1513
|
} catch (error) {
|
|
1478
1514
|
parameters.failSocketFlow(
|
|
@@ -522,6 +522,55 @@ async function simulateTempoTransaction(client: Client, request: unknown) {
|
|
|
522
522
|
await call(client, request as never)
|
|
523
523
|
}
|
|
524
524
|
|
|
525
|
+
/** Simulates an unsponsored client-signed session transaction without broadcasting it. */
|
|
526
|
+
export async function simulateCredentialTransaction(parameters: {
|
|
527
|
+
/** viem client used for the read-only execution simulation. */
|
|
528
|
+
client: TransactionClient
|
|
529
|
+
/** Fee-payer configuration for the eventual broadcast. Sponsored transactions are simulated after completion. */
|
|
530
|
+
feePayer?: Account | true | undefined
|
|
531
|
+
/** Parsed client-signed Tempo transaction. */
|
|
532
|
+
transaction: ReturnType<(typeof Transaction)['deserialize']>
|
|
533
|
+
}): Promise<void> {
|
|
534
|
+
if (parameters.feePayer) return
|
|
535
|
+
await simulateTempoTransaction(
|
|
536
|
+
parameters.client,
|
|
537
|
+
FeePayer.simulationTransaction(parameters.transaction, { feePayer: false }),
|
|
538
|
+
)
|
|
539
|
+
}
|
|
540
|
+
|
|
541
|
+
function validateCredentialSponsorship(parameters: {
|
|
542
|
+
allowedFeeTokens: readonly Address[]
|
|
543
|
+
challengeExpires?: string | undefined
|
|
544
|
+
chainId: number
|
|
545
|
+
details: Record<string, string>
|
|
546
|
+
feePayer?: Account | true | undefined
|
|
547
|
+
feePayerPolicy?: Partial<FeePayer.Policy> | undefined
|
|
548
|
+
transaction: ReturnType<(typeof Transaction)['deserialize']>
|
|
549
|
+
}) {
|
|
550
|
+
const {
|
|
551
|
+
allowedFeeTokens,
|
|
552
|
+
challengeExpires,
|
|
553
|
+
chainId,
|
|
554
|
+
details,
|
|
555
|
+
feePayer,
|
|
556
|
+
feePayerPolicy,
|
|
557
|
+
transaction,
|
|
558
|
+
} = parameters
|
|
559
|
+
if (!feePayer || feePayer === true) return
|
|
560
|
+
FeePayer.prepareSponsoredTransaction({
|
|
561
|
+
account: feePayer,
|
|
562
|
+
allowedFeeTokens,
|
|
563
|
+
challengeExpires,
|
|
564
|
+
chainId,
|
|
565
|
+
details,
|
|
566
|
+
policy: feePayerPolicy,
|
|
567
|
+
transaction: {
|
|
568
|
+
...transaction,
|
|
569
|
+
...(allowedFeeTokens[0] ? { feeToken: transaction.feeToken ?? allowedFeeTokens[0] } : {}),
|
|
570
|
+
},
|
|
571
|
+
})
|
|
572
|
+
}
|
|
573
|
+
|
|
525
574
|
async function signTempoTransaction(client: Client, transaction: unknown): Promise<Hex> {
|
|
526
575
|
return (await signTransaction(client, transaction as never)) as Hex
|
|
527
576
|
}
|
|
@@ -874,10 +923,25 @@ export type BroadcastOpenTransactionParameters = {
|
|
|
874
923
|
serializedTransaction: Hex
|
|
875
924
|
}
|
|
876
925
|
|
|
877
|
-
/**
|
|
878
|
-
export
|
|
879
|
-
|
|
880
|
-
|
|
926
|
+
/** Inputs for validating a client-signed TIP-1034 open transaction without broadcasting it. */
|
|
927
|
+
export type ValidateOpenCredentialTransactionParameters = Omit<
|
|
928
|
+
BroadcastOpenTransactionParameters,
|
|
929
|
+
'beforeBroadcast' | 'client'
|
|
930
|
+
>
|
|
931
|
+
|
|
932
|
+
/** Validated fields recovered from a client-signed TIP-1034 open transaction. */
|
|
933
|
+
export type ValidatedOpenCredentialTransaction = Omit<
|
|
934
|
+
BroadcastOpenTransactionResult,
|
|
935
|
+
'state' | 'txHash'
|
|
936
|
+
> & {
|
|
937
|
+
/** Parsed client-signed transaction, reused by simulation and broadcast. */
|
|
938
|
+
transaction: ReturnType<(typeof Transaction)['deserialize']>
|
|
939
|
+
}
|
|
940
|
+
|
|
941
|
+
/** Validates the immutable fields of a client-signed TIP-1034 open transaction. */
|
|
942
|
+
export function validateOpenCredentialTransaction(
|
|
943
|
+
parameters: ValidateOpenCredentialTransactionParameters,
|
|
944
|
+
): ValidatedOpenCredentialTransaction {
|
|
881
945
|
const { transaction, call, prefixCalls } = parsePrecompileCredentialTransaction({
|
|
882
946
|
escrowContract: parameters.escrowContract,
|
|
883
947
|
feePayer: parameters.feePayer,
|
|
@@ -909,6 +973,19 @@ export async function broadcastOpenTransaction(
|
|
|
909
973
|
channelId: parameters.expectedChannelId,
|
|
910
974
|
})
|
|
911
975
|
if (parameters.feePayer) assertSenderSigned(transaction)
|
|
976
|
+
validateCredentialSponsorship({
|
|
977
|
+
allowedFeeTokens: [parameters.expectedCurrency],
|
|
978
|
+
challengeExpires: parameters.challengeExpires,
|
|
979
|
+
chainId: parameters.chainId,
|
|
980
|
+
details: {
|
|
981
|
+
channelId: parameters.expectedChannelId,
|
|
982
|
+
currency: parameters.expectedCurrency,
|
|
983
|
+
recipient: parameters.expectedPayee,
|
|
984
|
+
},
|
|
985
|
+
feePayer: parameters.feePayer,
|
|
986
|
+
feePayerPolicy: parameters.feePayerPolicy,
|
|
987
|
+
transaction,
|
|
988
|
+
})
|
|
912
989
|
const expiringNonceHash = ChannelUtils.computeExpiringNonceHash(
|
|
913
990
|
ChannelUtils.transactionForExpiringNonceHash({
|
|
914
991
|
feePayer: parameters.feePayer,
|
|
@@ -920,10 +997,19 @@ export async function broadcastOpenTransaction(
|
|
|
920
997
|
throw new VerificationFailedError({
|
|
921
998
|
reason: 'credential expiringNonceHash does not match transaction',
|
|
922
999
|
})
|
|
1000
|
+
return { descriptor, expiringNonceHash, openDeposit: open.deposit, transaction }
|
|
1001
|
+
}
|
|
1002
|
+
|
|
1003
|
+
/** Broadcast and validate a client-signed TIP-1034 open transaction. */
|
|
1004
|
+
export async function broadcastOpenTransaction(
|
|
1005
|
+
parameters: BroadcastOpenTransactionParameters,
|
|
1006
|
+
): Promise<BroadcastOpenTransactionResult> {
|
|
1007
|
+
const { descriptor, expiringNonceHash, openDeposit, transaction } =
|
|
1008
|
+
validateOpenCredentialTransaction(parameters)
|
|
923
1009
|
await parameters.beforeBroadcast?.({
|
|
924
1010
|
descriptor,
|
|
925
1011
|
expiringNonceHash,
|
|
926
|
-
openDeposit
|
|
1012
|
+
openDeposit,
|
|
927
1013
|
})
|
|
928
1014
|
const receipt = await sendCredentialTransaction({
|
|
929
1015
|
challengeExpires: parameters.challengeExpires,
|
|
@@ -952,7 +1038,7 @@ export async function broadcastOpenTransaction(
|
|
|
952
1038
|
emittedExpiringNonceHash: opened.expiringNonceHash,
|
|
953
1039
|
escrow: parameters.escrowContract,
|
|
954
1040
|
expectedChannelId: parameters.expectedChannelId,
|
|
955
|
-
openDeposit
|
|
1041
|
+
openDeposit,
|
|
956
1042
|
})
|
|
957
1043
|
const chainChannel = await readbackWithRetry(() =>
|
|
958
1044
|
getChannel(parameters.client, descriptor, parameters.escrowContract, receipt.blockNumber),
|
|
@@ -964,7 +1050,7 @@ export async function broadcastOpenTransaction(
|
|
|
964
1050
|
descriptor,
|
|
965
1051
|
state,
|
|
966
1052
|
expiringNonceHash: opened.expiringNonceHash,
|
|
967
|
-
openDeposit
|
|
1053
|
+
openDeposit,
|
|
968
1054
|
}
|
|
969
1055
|
}
|
|
970
1056
|
|
|
@@ -1004,10 +1090,22 @@ export type BroadcastTopUpTransactionParameters = {
|
|
|
1004
1090
|
serializedTransaction: Hex
|
|
1005
1091
|
}
|
|
1006
1092
|
|
|
1007
|
-
/**
|
|
1008
|
-
export
|
|
1009
|
-
|
|
1010
|
-
|
|
1093
|
+
/** Inputs for validating a client-signed TIP-1034 top-up transaction without broadcasting it. */
|
|
1094
|
+
export type ValidateTopUpCredentialTransactionParameters = Omit<
|
|
1095
|
+
BroadcastTopUpTransactionParameters,
|
|
1096
|
+
'client'
|
|
1097
|
+
>
|
|
1098
|
+
|
|
1099
|
+
/** Validated fields recovered from a client-signed TIP-1034 top-up transaction. */
|
|
1100
|
+
export type ValidatedTopUpCredentialTransaction = {
|
|
1101
|
+
/** Parsed client-signed transaction, reused by simulation and broadcast. */
|
|
1102
|
+
transaction: ReturnType<(typeof Transaction)['deserialize']>
|
|
1103
|
+
}
|
|
1104
|
+
|
|
1105
|
+
/** Validates the immutable fields of a client-signed TIP-1034 top-up transaction. */
|
|
1106
|
+
export function validateTopUpCredentialTransaction(
|
|
1107
|
+
parameters: ValidateTopUpCredentialTransactionParameters,
|
|
1108
|
+
): ValidatedTopUpCredentialTransaction {
|
|
1011
1109
|
const { transaction, call, prefixCalls } = parsePrecompileCredentialTransaction({
|
|
1012
1110
|
escrowContract: parameters.escrowContract,
|
|
1013
1111
|
feePayer: parameters.feePayer,
|
|
@@ -1027,6 +1125,28 @@ export async function broadcastTopUpTransaction(
|
|
|
1027
1125
|
label: 'topUp',
|
|
1028
1126
|
prefixCalls,
|
|
1029
1127
|
})
|
|
1128
|
+
if (parameters.feePayer) assertSenderSigned(transaction)
|
|
1129
|
+
validateCredentialSponsorship({
|
|
1130
|
+
allowedFeeTokens: [parameters.expectedCurrency],
|
|
1131
|
+
challengeExpires: parameters.challengeExpires,
|
|
1132
|
+
chainId: parameters.chainId,
|
|
1133
|
+
details: {
|
|
1134
|
+
additionalDeposit: parameters.additionalDeposit.toString(),
|
|
1135
|
+
channelId: parameters.expectedChannelId,
|
|
1136
|
+
currency: parameters.expectedCurrency,
|
|
1137
|
+
},
|
|
1138
|
+
feePayer: parameters.feePayer,
|
|
1139
|
+
feePayerPolicy: parameters.feePayerPolicy,
|
|
1140
|
+
transaction,
|
|
1141
|
+
})
|
|
1142
|
+
return { transaction }
|
|
1143
|
+
}
|
|
1144
|
+
|
|
1145
|
+
/** Broadcast and validate a client-signed TIP-1034 top-up transaction. */
|
|
1146
|
+
export async function broadcastTopUpTransaction(
|
|
1147
|
+
parameters: BroadcastTopUpTransactionParameters,
|
|
1148
|
+
): Promise<BroadcastTopUpTransactionResult> {
|
|
1149
|
+
const { transaction } = validateTopUpCredentialTransaction(parameters)
|
|
1030
1150
|
const receipt = await sendCredentialTransaction({
|
|
1031
1151
|
challengeExpires: parameters.challengeExpires,
|
|
1032
1152
|
chainId: parameters.chainId,
|
|
@@ -240,6 +240,18 @@ export type VerifyAndAcceptVoucherParameters = {
|
|
|
240
240
|
voucher: SignedVoucher
|
|
241
241
|
}
|
|
242
242
|
|
|
243
|
+
/** Inputs for validating a cumulative voucher without recording it. */
|
|
244
|
+
export type ValidateVoucherParameters = Omit<
|
|
245
|
+
VerifyAndAcceptVoucherParameters,
|
|
246
|
+
'challenge' | 'store'
|
|
247
|
+
>
|
|
248
|
+
|
|
249
|
+
/** Result of validating a cumulative voucher against persisted channel state. */
|
|
250
|
+
export type VoucherValidation = {
|
|
251
|
+
/** Whether the voucher was already accepted at the same cumulative amount. */
|
|
252
|
+
alreadyAccepted: boolean
|
|
253
|
+
}
|
|
254
|
+
|
|
243
255
|
/** Channel backend-specific fields. */
|
|
244
256
|
export type BackendState = CompatibilityBackendState | PrecompileBackendState
|
|
245
257
|
|
|
@@ -520,12 +532,11 @@ export async function loadPrecompileChannel(
|
|
|
520
532
|
return channel
|
|
521
533
|
}
|
|
522
534
|
|
|
523
|
-
/** Verifies a cumulative voucher
|
|
524
|
-
export async function
|
|
525
|
-
parameters:
|
|
526
|
-
): Promise<
|
|
527
|
-
const {
|
|
528
|
-
parameters
|
|
535
|
+
/** Verifies a cumulative voucher without changing persisted channel state. */
|
|
536
|
+
export async function validateVoucher(
|
|
537
|
+
parameters: ValidateVoucherParameters,
|
|
538
|
+
): Promise<VoucherValidation> {
|
|
539
|
+
const { minVoucherDelta, channel, voucher, channelState, methodDetails } = parameters
|
|
529
540
|
|
|
530
541
|
validateChannelState(channelState)
|
|
531
542
|
if (voucher.cumulativeAmount > channelState.deposit)
|
|
@@ -546,7 +557,22 @@ export async function verifyAndAcceptVoucher(
|
|
|
546
557
|
throw new VerificationFailedError({
|
|
547
558
|
reason: 'voucher cumulativeAmount is below on-chain settled amount',
|
|
548
559
|
})
|
|
549
|
-
if (voucher.cumulativeAmount === channel.highestVoucherAmount)
|
|
560
|
+
if (voucher.cumulativeAmount === channel.highestVoucherAmount) return { alreadyAccepted: true }
|
|
561
|
+
const delta = voucher.cumulativeAmount - channel.highestVoucherAmount
|
|
562
|
+
if (delta < minVoucherDelta)
|
|
563
|
+
throw new DeltaTooSmallError({
|
|
564
|
+
reason: `voucher delta ${delta} below minimum ${minVoucherDelta}`,
|
|
565
|
+
})
|
|
566
|
+
return { alreadyAccepted: false }
|
|
567
|
+
}
|
|
568
|
+
|
|
569
|
+
/** Verifies a cumulative voucher and returns a session receipt after store reconciliation. */
|
|
570
|
+
export async function verifyAndAcceptVoucher(
|
|
571
|
+
parameters: VerifyAndAcceptVoucherParameters,
|
|
572
|
+
): Promise<SessionReceipt> {
|
|
573
|
+
const { store, challenge, channel, voucher, channelState } = parameters
|
|
574
|
+
const validation = await validateVoucher(parameters)
|
|
575
|
+
if (validation.alreadyAccepted)
|
|
550
576
|
return createSessionReceipt({
|
|
551
577
|
challengeId: challenge.id,
|
|
552
578
|
channelId: voucher.channelId,
|
|
@@ -554,11 +580,6 @@ export async function verifyAndAcceptVoucher(
|
|
|
554
580
|
spent: channel.spent,
|
|
555
581
|
units: channel.units,
|
|
556
582
|
})
|
|
557
|
-
const delta = voucher.cumulativeAmount - channel.highestVoucherAmount
|
|
558
|
-
if (delta < minVoucherDelta)
|
|
559
|
-
throw new DeltaTooSmallError({
|
|
560
|
-
reason: `voucher delta ${delta} below minimum ${minVoucherDelta}`,
|
|
561
|
-
})
|
|
562
583
|
const updated = await store.updateChannel(voucher.channelId, (current) =>
|
|
563
584
|
acceptVoucherStateUpdate({ channelState, current, voucher }),
|
|
564
585
|
)
|
|
@@ -9,11 +9,11 @@ import * as Voucher from '../precompile/Voucher.js'
|
|
|
9
9
|
import * as ChannelStore from './ChannelStore.js'
|
|
10
10
|
import {
|
|
11
11
|
assertOpenCredentialCoversRequest,
|
|
12
|
+
broadcastCredentialPayload,
|
|
12
13
|
requireSessionCredentialAction,
|
|
13
14
|
requireSessionCredentialPayload,
|
|
14
15
|
requireSessionCredentialPayloadHeader,
|
|
15
16
|
validateChannelDescriptor,
|
|
16
|
-
verifyCredentialPayload,
|
|
17
17
|
} from './CredentialVerification.js'
|
|
18
18
|
|
|
19
19
|
describe('SessionCredentialGuards', () => {
|
|
@@ -190,7 +190,7 @@ describe('SessionCredentialGuards', () => {
|
|
|
190
190
|
})
|
|
191
191
|
})
|
|
192
192
|
|
|
193
|
-
describe('
|
|
193
|
+
describe('broadcastCredentialPayload', () => {
|
|
194
194
|
const escrow = '0x4D50500000000000000000000000000000000000' as Address
|
|
195
195
|
const testChainId = chainIds.testnet
|
|
196
196
|
const computedChannelId = Channel.computeId({ ...descriptor, chainId: testChainId, escrow })
|
|
@@ -246,7 +246,7 @@ describe('SessionCredentialGuards', () => {
|
|
|
246
246
|
const verifyVoucher = vi.spyOn(Voucher, 'verifyVoucher').mockResolvedValue(true)
|
|
247
247
|
|
|
248
248
|
await expect(
|
|
249
|
-
|
|
249
|
+
broadcastCredentialPayload({
|
|
250
250
|
challenge,
|
|
251
251
|
channelStateTtl: 60_000,
|
|
252
252
|
chainId: testChainId,
|
|
@@ -274,7 +274,7 @@ describe('SessionCredentialGuards', () => {
|
|
|
274
274
|
const verifyVoucher = vi.spyOn(Voucher, 'verifyVoucher').mockResolvedValue(true)
|
|
275
275
|
|
|
276
276
|
await expect(
|
|
277
|
-
|
|
277
|
+
broadcastCredentialPayload({
|
|
278
278
|
challenge,
|
|
279
279
|
channelStateTtl: 60_000,
|
|
280
280
|
chainId: testChainId,
|