mppx 0.8.17 → 0.8.18
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/CHANGELOG.md +55 -0
- package/README.md +15 -0
- package/dist/Challenge.js +21 -4
- package/dist/bin.js +3 -3
- package/dist/cli/THIRD-PARTY-LICENSES.txt +328 -0
- package/dist/cli/cli.js +253 -1505
- package/dist/cli/plugins/index.js +19 -5
- package/dist/cli/plugins/tempo.js +7 -3
- package/dist/cli/sessions/Manager.js +7 -4
- package/dist/cli/sessions/request.d.ts +2 -0
- package/dist/cli/sessions/request.js +18 -0
- package/dist/cli/sessions/store.js +28 -14
- package/dist/discovery/Discovery.js +2 -1
- package/dist/evm/client/Charge.js +8 -0
- package/dist/server/core.d.ts +9 -0
- package/dist/server/core.js +9 -0
- package/dist/stripe/server/Charge.js +2 -4
- package/dist/stripe/server/Methods.d.ts +2 -2
- package/dist/stripe/server/Methods.js +17 -11
- package/dist/stripe/server/internal/html.gen.d.ts +1 -1
- package/dist/stripe/server/internal/html.gen.js +1 -1
- package/dist/stripe/server/spt.d.ts +8 -0
- package/dist/stripe/server/spt.js +8 -0
- package/dist/tempo/Methods.d.ts +13 -0
- package/dist/tempo/Methods.js +14 -3
- package/dist/tempo/client/Charge.d.ts +3 -0
- package/dist/tempo/client/Charge.js +31 -9
- package/dist/tempo/client/Methods.d.ts +13 -0
- package/dist/tempo/internal/defaults.d.ts +11 -0
- package/dist/tempo/internal/defaults.js +11 -0
- package/dist/tempo/internal/machine-token-charge.d.ts +51 -0
- package/dist/tempo/internal/machine-token-charge.js +113 -0
- package/dist/tempo/internal/machine-token-session.d.ts +88 -0
- package/dist/tempo/internal/machine-token-session.js +173 -0
- package/dist/tempo/internal/signature-envelope.d.ts +14 -0
- package/dist/tempo/internal/signature-envelope.js +28 -0
- package/dist/tempo/legacy/client/ChannelOps.d.ts +2 -2
- package/dist/tempo/legacy/client/ChannelOps.js +11 -5
- package/dist/tempo/legacy/client/Session.d.ts +13 -1
- package/dist/tempo/legacy/client/Session.js +3 -3
- package/dist/tempo/legacy/client/SessionManager.d.ts +3 -1
- package/dist/tempo/legacy/client/SessionManager.js +2 -0
- package/dist/tempo/server/Charge.d.ts +3 -0
- package/dist/tempo/server/Charge.js +58 -17
- package/dist/tempo/server/Methods.d.ts +21 -4
- package/dist/tempo/server/Methods.js +8 -4
- package/dist/tempo/server/internal/html.gen.d.ts +1 -1
- package/dist/tempo/server/internal/html.gen.js +1 -1
- package/dist/tempo/session/client/ChannelOps.d.ts +18 -3
- package/dist/tempo/session/client/ChannelOps.js +35 -6
- package/dist/tempo/session/client/ChannelStore.d.ts +0 -5
- package/dist/tempo/session/client/ChannelStore.js +2 -2
- package/dist/tempo/session/client/CredentialState.d.ts +17 -2
- package/dist/tempo/session/client/CredentialState.js +77 -76
- package/dist/tempo/session/client/Runtime.d.ts +4 -2
- package/dist/tempo/session/client/Runtime.js +21 -5
- package/dist/tempo/session/client/Session.d.ts +15 -3
- package/dist/tempo/session/client/Session.js +186 -63
- package/dist/tempo/session/client/SessionManager.d.ts +3 -1
- package/dist/tempo/session/client/SessionManager.js +35 -11
- package/dist/tempo/session/client/Transports.d.ts +2 -0
- package/dist/tempo/session/client/Transports.js +12 -2
- package/dist/tempo/session/precompile/Chain.d.ts +10 -2
- package/dist/tempo/session/precompile/Chain.js +50 -10
- package/dist/tempo/session/precompile/Protocol.d.ts +15 -0
- package/dist/tempo/session/precompile/Protocol.js +7 -0
- package/dist/tempo/session/precompile/Voucher.d.ts +3 -1
- package/dist/tempo/session/precompile/Voucher.js +6 -12
- package/dist/tempo/session/server/ChannelStore.d.ts +6 -0
- package/dist/tempo/session/server/ChannelStore.js +11 -4
- package/dist/tempo/session/server/CredentialVerification.d.ts +11 -9
- package/dist/tempo/session/server/CredentialVerification.js +185 -109
- package/dist/tempo/session/server/MeteredStream.d.ts +1 -1
- package/dist/tempo/session/server/MeteredStream.js +5 -4
- package/dist/tempo/session/server/RequestState.d.ts +19 -0
- package/dist/tempo/session/server/RequestState.js +61 -15
- package/dist/tempo/session/server/Session.d.ts +14 -2
- package/dist/tempo/session/server/Session.js +37 -6
- package/dist/tempo/session/server/Settlement.d.ts +11 -4
- package/dist/tempo/session/server/Settlement.js +53 -21
- package/dist/x402/client/Exact.d.ts +8 -0
- package/dist/x402/client/Exact.js +40 -10
- package/dist/x402/server/EvmCharge.d.ts +22 -0
- package/dist/x402/server/EvmCharge.js +23 -1
- package/package.json +15 -37
- package/dist/BodyDigest.d.ts.map +0 -1
- package/dist/BodyDigest.js.map +0 -1
- package/dist/Challenge.d.ts.map +0 -1
- package/dist/Challenge.js.map +0 -1
- package/dist/Constants.d.ts.map +0 -1
- package/dist/Constants.js.map +0 -1
- package/dist/Credential.d.ts.map +0 -1
- package/dist/Credential.js.map +0 -1
- package/dist/Errors.d.ts.map +0 -1
- package/dist/Errors.js.map +0 -1
- package/dist/Expires.d.ts.map +0 -1
- package/dist/Expires.js.map +0 -1
- package/dist/Html.d.ts.map +0 -1
- package/dist/Html.js.map +0 -1
- package/dist/Mcp.d.ts.map +0 -1
- package/dist/Mcp.js.map +0 -1
- package/dist/Method.d.ts.map +0 -1
- package/dist/Method.js.map +0 -1
- package/dist/PaymentRequest.d.ts.map +0 -1
- package/dist/PaymentRequest.js.map +0 -1
- package/dist/Receipt.d.ts.map +0 -1
- package/dist/Receipt.js.map +0 -1
- package/dist/Store.d.ts.map +0 -1
- package/dist/Store.js.map +0 -1
- package/dist/attestation/Client.d.ts.map +0 -1
- package/dist/attestation/Client.js.map +0 -1
- package/dist/attestation/Constants.d.ts.map +0 -1
- package/dist/attestation/Constants.js.map +0 -1
- package/dist/attestation/Server.d.ts.map +0 -1
- package/dist/attestation/Server.js.map +0 -1
- package/dist/attestation/Types.d.ts.map +0 -1
- package/dist/attestation/Types.js.map +0 -1
- package/dist/attestation/index.d.ts.map +0 -1
- package/dist/attestation/index.js.map +0 -1
- package/dist/attestation/internal/HttpMessageSignature.d.ts.map +0 -1
- package/dist/attestation/internal/HttpMessageSignature.js.map +0 -1
- package/dist/attestation/internal/SigningContext.d.ts.map +0 -1
- package/dist/attestation/internal/SigningContext.js.map +0 -1
- package/dist/bin.d.ts.map +0 -1
- package/dist/bin.js.map +0 -1
- package/dist/cli/account.d.ts.map +0 -1
- package/dist/cli/account.js.map +0 -1
- package/dist/cli/cli.d.ts.map +0 -1
- package/dist/cli/cli.js.map +0 -1
- package/dist/cli/config.d.ts.map +0 -1
- package/dist/cli/config.js.map +0 -1
- package/dist/cli/internal.d.ts.map +0 -1
- package/dist/cli/internal.js.map +0 -1
- package/dist/cli/plugins/evm.d.ts.map +0 -1
- package/dist/cli/plugins/evm.js.map +0 -1
- package/dist/cli/plugins/index.d.ts.map +0 -1
- package/dist/cli/plugins/index.js.map +0 -1
- package/dist/cli/plugins/plugin.d.ts.map +0 -1
- package/dist/cli/plugins/plugin.js.map +0 -1
- package/dist/cli/plugins/stripe.d.ts.map +0 -1
- package/dist/cli/plugins/stripe.js.map +0 -1
- package/dist/cli/plugins/tempo.d.ts.map +0 -1
- package/dist/cli/plugins/tempo.js.map +0 -1
- package/dist/cli/sessions/Manager.d.ts.map +0 -1
- package/dist/cli/sessions/Manager.js.map +0 -1
- package/dist/cli/sessions/commands.d.ts.map +0 -1
- package/dist/cli/sessions/commands.js.map +0 -1
- package/dist/cli/sessions/request.d.ts.map +0 -1
- package/dist/cli/sessions/request.js.map +0 -1
- package/dist/cli/sessions/store.d.ts.map +0 -1
- package/dist/cli/sessions/store.js.map +0 -1
- package/dist/cli/utils.d.ts.map +0 -1
- package/dist/cli/utils.js.map +0 -1
- package/dist/cli/validate/challenge.d.ts.map +0 -1
- package/dist/cli/validate/challenge.js.map +0 -1
- package/dist/cli/validate/discovery.d.ts.map +0 -1
- package/dist/cli/validate/discovery.js.map +0 -1
- package/dist/cli/validate/helpers.d.ts.map +0 -1
- package/dist/cli/validate/helpers.js.map +0 -1
- package/dist/cli/validate/index.d.ts.map +0 -1
- package/dist/cli/validate/index.js.map +0 -1
- package/dist/cli/validate/messages.d.ts.map +0 -1
- package/dist/cli/validate/messages.js.map +0 -1
- package/dist/cli/validate/payment.d.ts.map +0 -1
- package/dist/cli/validate/payment.js.map +0 -1
- package/dist/client/Methods.d.ts.map +0 -1
- package/dist/client/Methods.js.map +0 -1
- package/dist/client/Mppx.d.ts.map +0 -1
- package/dist/client/Mppx.js.map +0 -1
- package/dist/client/Transport.d.ts.map +0 -1
- package/dist/client/Transport.js.map +0 -1
- package/dist/client/index.d.ts.map +0 -1
- package/dist/client/index.js.map +0 -1
- package/dist/client/internal/Fetch.d.ts.map +0 -1
- package/dist/client/internal/Fetch.js.map +0 -1
- package/dist/client/internal/MethodChallenge.d.ts.map +0 -1
- package/dist/client/internal/MethodChallenge.js.map +0 -1
- package/dist/client/internal/MethodResponse.d.ts.map +0 -1
- package/dist/client/internal/MethodResponse.js.map +0 -1
- package/dist/client/internal/protocols/Mcp.d.ts.map +0 -1
- package/dist/client/internal/protocols/Mcp.js.map +0 -1
- package/dist/client/internal/protocols/Mpp.d.ts.map +0 -1
- package/dist/client/internal/protocols/Mpp.js.map +0 -1
- package/dist/client/internal/protocols/Protocol.d.ts.map +0 -1
- package/dist/client/internal/protocols/Protocol.js.map +0 -1
- package/dist/client/internal/protocols/Shared.d.ts.map +0 -1
- package/dist/client/internal/protocols/Shared.js.map +0 -1
- package/dist/client/internal/protocols/X402.d.ts.map +0 -1
- package/dist/client/internal/protocols/X402.js.map +0 -1
- package/dist/client/node.d.ts.map +0 -1
- package/dist/client/node.js.map +0 -1
- package/dist/discovery/Discovery.d.ts.map +0 -1
- package/dist/discovery/Discovery.js.map +0 -1
- package/dist/discovery/OpenApi.d.ts.map +0 -1
- package/dist/discovery/OpenApi.js.map +0 -1
- package/dist/discovery/Validate.d.ts.map +0 -1
- package/dist/discovery/Validate.js.map +0 -1
- package/dist/discovery/index.d.ts.map +0 -1
- package/dist/discovery/index.js.map +0 -1
- package/dist/discovery/internal/Metadata.d.ts.map +0 -1
- package/dist/discovery/internal/Metadata.js.map +0 -1
- package/dist/evm/Assets.d.ts.map +0 -1
- package/dist/evm/Assets.js.map +0 -1
- package/dist/evm/Chains.d.ts.map +0 -1
- package/dist/evm/Chains.js.map +0 -1
- package/dist/evm/Methods.d.ts.map +0 -1
- package/dist/evm/Methods.js.map +0 -1
- package/dist/evm/Types.d.ts.map +0 -1
- package/dist/evm/Types.js.map +0 -1
- package/dist/evm/client/Charge.d.ts.map +0 -1
- package/dist/evm/client/Charge.js.map +0 -1
- package/dist/evm/client/Methods.d.ts.map +0 -1
- package/dist/evm/client/Methods.js.map +0 -1
- package/dist/evm/client/index.d.ts.map +0 -1
- package/dist/evm/client/index.js.map +0 -1
- package/dist/evm/index.d.ts.map +0 -1
- package/dist/evm/index.js.map +0 -1
- package/dist/evm/server/Charge.d.ts.map +0 -1
- package/dist/evm/server/Charge.js.map +0 -1
- package/dist/evm/server/Methods.d.ts.map +0 -1
- package/dist/evm/server/Methods.js.map +0 -1
- package/dist/evm/server/index.d.ts.map +0 -1
- package/dist/evm/server/index.js.map +0 -1
- package/dist/index.d.ts.map +0 -1
- package/dist/index.js.map +0 -1
- package/dist/internal/AcceptPayment.d.ts.map +0 -1
- package/dist/internal/AcceptPayment.js.map +0 -1
- package/dist/internal/HeaderCodec.d.ts.map +0 -1
- package/dist/internal/HeaderCodec.js.map +0 -1
- package/dist/internal/constantTimeEqual.d.ts.map +0 -1
- package/dist/internal/constantTimeEqual.js.map +0 -1
- package/dist/internal/env.d.ts.map +0 -1
- package/dist/internal/env.js.map +0 -1
- package/dist/internal/types.d.ts.map +0 -1
- package/dist/internal/types.js.map +0 -1
- package/dist/mcp/client/McpClient.d.ts.map +0 -1
- package/dist/mcp/client/McpClient.js.map +0 -1
- package/dist/mcp/client/index.d.ts.map +0 -1
- package/dist/mcp/client/index.js.map +0 -1
- package/dist/mcp/server/Transport.d.ts.map +0 -1
- package/dist/mcp/server/Transport.js.map +0 -1
- package/dist/mcp/server/index.d.ts.map +0 -1
- package/dist/mcp/server/index.js.map +0 -1
- package/dist/middlewares/elysia.d.ts.map +0 -1
- package/dist/middlewares/elysia.js.map +0 -1
- package/dist/middlewares/express.d.ts.map +0 -1
- package/dist/middlewares/express.js.map +0 -1
- package/dist/middlewares/hono.d.ts.map +0 -1
- package/dist/middlewares/hono.js.map +0 -1
- package/dist/middlewares/internal/mppx.d.ts.map +0 -1
- package/dist/middlewares/internal/mppx.js.map +0 -1
- package/dist/middlewares/nextjs.d.ts.map +0 -1
- package/dist/middlewares/nextjs.js.map +0 -1
- package/dist/proxy/Proxy.d.ts.map +0 -1
- package/dist/proxy/Proxy.js.map +0 -1
- package/dist/proxy/Service.d.ts.map +0 -1
- package/dist/proxy/Service.js.map +0 -1
- package/dist/proxy/index.d.ts.map +0 -1
- package/dist/proxy/index.js.map +0 -1
- package/dist/proxy/internal/Headers.d.ts.map +0 -1
- package/dist/proxy/internal/Headers.js.map +0 -1
- package/dist/proxy/internal/Route.d.ts.map +0 -1
- package/dist/proxy/internal/Route.js.map +0 -1
- package/dist/proxy/services/anthropic.d.ts.map +0 -1
- package/dist/proxy/services/anthropic.js.map +0 -1
- package/dist/proxy/services/openai.d.ts.map +0 -1
- package/dist/proxy/services/openai.js.map +0 -1
- package/dist/proxy/services/stripe.d.ts.map +0 -1
- package/dist/proxy/services/stripe.js.map +0 -1
- package/dist/server/Methods.d.ts.map +0 -1
- package/dist/server/Methods.js.map +0 -1
- package/dist/server/Mppx.d.ts.map +0 -1
- package/dist/server/Mppx.js.map +0 -1
- package/dist/server/NodeListener.d.ts.map +0 -1
- package/dist/server/NodeListener.js.map +0 -1
- package/dist/server/Request.d.ts.map +0 -1
- package/dist/server/Request.js.map +0 -1
- package/dist/server/Response.d.ts.map +0 -1
- package/dist/server/Response.js.map +0 -1
- package/dist/server/Transport.d.ts.map +0 -1
- package/dist/server/Transport.js.map +0 -1
- package/dist/server/index.d.ts.map +0 -1
- package/dist/server/index.js.map +0 -1
- package/dist/server/internal/html/compose.main.gen.d.ts.map +0 -1
- package/dist/server/internal/html/compose.main.gen.js.map +0 -1
- package/dist/server/internal/html/config.d.ts.map +0 -1
- package/dist/server/internal/html/config.js.map +0 -1
- package/dist/server/internal/html/constants.d.ts.map +0 -1
- package/dist/server/internal/html/constants.js.map +0 -1
- package/dist/server/internal/html/serviceWorker.client.d.ts.map +0 -1
- package/dist/server/internal/html/serviceWorker.client.js.map +0 -1
- package/dist/server/internal/html/serviceWorker.gen.d.ts.map +0 -1
- package/dist/server/internal/html/serviceWorker.gen.js.map +0 -1
- package/dist/server/internal/scope.d.ts.map +0 -1
- package/dist/server/internal/scope.js.map +0 -1
- package/dist/stripe/Methods.d.ts.map +0 -1
- package/dist/stripe/Methods.js.map +0 -1
- package/dist/stripe/client/Charge.d.ts.map +0 -1
- package/dist/stripe/client/Charge.js.map +0 -1
- package/dist/stripe/client/Methods.d.ts.map +0 -1
- package/dist/stripe/client/Methods.js.map +0 -1
- package/dist/stripe/client/index.d.ts.map +0 -1
- package/dist/stripe/client/index.js.map +0 -1
- package/dist/stripe/index.d.ts.map +0 -1
- package/dist/stripe/index.js.map +0 -1
- package/dist/stripe/internal/constants.d.ts.map +0 -1
- package/dist/stripe/internal/constants.js.map +0 -1
- package/dist/stripe/internal/types.d.ts.map +0 -1
- package/dist/stripe/internal/types.js.map +0 -1
- package/dist/stripe/server/Charge.d.ts.map +0 -1
- package/dist/stripe/server/Charge.js.map +0 -1
- package/dist/stripe/server/Methods.d.ts.map +0 -1
- package/dist/stripe/server/Methods.js.map +0 -1
- package/dist/stripe/server/index.d.ts.map +0 -1
- package/dist/stripe/server/index.js.map +0 -1
- package/dist/stripe/server/internal/deposit-address.d.ts.map +0 -1
- package/dist/stripe/server/internal/deposit-address.js.map +0 -1
- package/dist/stripe/server/internal/html/types.d.ts.map +0 -1
- package/dist/stripe/server/internal/html/types.js.map +0 -1
- package/dist/stripe/server/internal/html.gen.d.ts.map +0 -1
- package/dist/stripe/server/internal/html.gen.js.map +0 -1
- package/dist/stripe/server/internal/record-payment.d.ts.map +0 -1
- package/dist/stripe/server/internal/record-payment.js.map +0 -1
- package/dist/stripe/server/internal/request.d.ts.map +0 -1
- package/dist/stripe/server/internal/request.js.map +0 -1
- package/dist/tap/Constants.d.ts.map +0 -1
- package/dist/tap/Constants.js.map +0 -1
- package/dist/tap/Types.d.ts.map +0 -1
- package/dist/tap/Types.js.map +0 -1
- package/dist/tap/client/index.d.ts.map +0 -1
- package/dist/tap/client/index.js.map +0 -1
- package/dist/tap/index.d.ts.map +0 -1
- package/dist/tap/index.js.map +0 -1
- package/dist/tap/server/index.d.ts.map +0 -1
- package/dist/tap/server/index.js.map +0 -1
- package/dist/tempo/Attribution.d.ts.map +0 -1
- package/dist/tempo/Attribution.js.map +0 -1
- package/dist/tempo/Methods.d.ts.map +0 -1
- package/dist/tempo/Methods.js.map +0 -1
- package/dist/tempo/Proof.d.ts.map +0 -1
- package/dist/tempo/Proof.js.map +0 -1
- package/dist/tempo/client/Charge.d.ts.map +0 -1
- package/dist/tempo/client/Charge.js.map +0 -1
- package/dist/tempo/client/Methods.d.ts.map +0 -1
- package/dist/tempo/client/Methods.js.map +0 -1
- package/dist/tempo/client/ResolveAccount.d.ts.map +0 -1
- package/dist/tempo/client/ResolveAccount.js.map +0 -1
- package/dist/tempo/client/Subscription.d.ts.map +0 -1
- package/dist/tempo/client/Subscription.js.map +0 -1
- package/dist/tempo/client/index.d.ts.map +0 -1
- package/dist/tempo/client/index.js.map +0 -1
- package/dist/tempo/index.d.ts.map +0 -1
- package/dist/tempo/index.js.map +0 -1
- package/dist/tempo/internal/account.d.ts.map +0 -1
- package/dist/tempo/internal/account.js.map +0 -1
- package/dist/tempo/internal/address.d.ts.map +0 -1
- package/dist/tempo/internal/address.js.map +0 -1
- package/dist/tempo/internal/auto-swap.d.ts.map +0 -1
- package/dist/tempo/internal/auto-swap.js.map +0 -1
- package/dist/tempo/internal/charge.d.ts.map +0 -1
- package/dist/tempo/internal/charge.js.map +0 -1
- package/dist/tempo/internal/defaults.d.ts.map +0 -1
- package/dist/tempo/internal/defaults.js.map +0 -1
- package/dist/tempo/internal/fee-payer.d.ts.map +0 -1
- package/dist/tempo/internal/fee-payer.js.map +0 -1
- package/dist/tempo/internal/fee-token.d.ts.map +0 -1
- package/dist/tempo/internal/fee-token.js.map +0 -1
- package/dist/tempo/internal/proof.d.ts.map +0 -1
- package/dist/tempo/internal/proof.js.map +0 -1
- package/dist/tempo/internal/selectors.d.ts.map +0 -1
- package/dist/tempo/internal/selectors.js.map +0 -1
- package/dist/tempo/internal/types.d.ts.map +0 -1
- package/dist/tempo/internal/types.js.map +0 -1
- package/dist/tempo/legacy/client/ChannelOps.d.ts.map +0 -1
- package/dist/tempo/legacy/client/ChannelOps.js.map +0 -1
- package/dist/tempo/legacy/client/Session.d.ts.map +0 -1
- package/dist/tempo/legacy/client/Session.js.map +0 -1
- package/dist/tempo/legacy/client/SessionManager.d.ts.map +0 -1
- package/dist/tempo/legacy/client/SessionManager.js.map +0 -1
- package/dist/tempo/legacy/client/index.d.ts.map +0 -1
- package/dist/tempo/legacy/client/index.js.map +0 -1
- package/dist/tempo/legacy/index.d.ts.map +0 -1
- package/dist/tempo/legacy/index.js.map +0 -1
- package/dist/tempo/legacy/session/Chain.d.ts.map +0 -1
- package/dist/tempo/legacy/session/Chain.js.map +0 -1
- package/dist/tempo/legacy/session/Channel.d.ts.map +0 -1
- package/dist/tempo/legacy/session/Channel.js.map +0 -1
- package/dist/tempo/legacy/session/Types.d.ts.map +0 -1
- package/dist/tempo/legacy/session/Types.js.map +0 -1
- package/dist/tempo/legacy/session/Voucher.d.ts.map +0 -1
- package/dist/tempo/legacy/session/Voucher.js.map +0 -1
- package/dist/tempo/legacy/session/escrow.abi.d.ts.map +0 -1
- package/dist/tempo/legacy/session/escrow.abi.js.map +0 -1
- package/dist/tempo/legacy/session/index.d.ts.map +0 -1
- package/dist/tempo/legacy/session/index.js.map +0 -1
- package/dist/tempo/server/Charge.d.ts.map +0 -1
- package/dist/tempo/server/Charge.js.map +0 -1
- package/dist/tempo/server/Methods.d.ts.map +0 -1
- package/dist/tempo/server/Methods.js.map +0 -1
- package/dist/tempo/server/Relay.d.ts.map +0 -1
- package/dist/tempo/server/Relay.js.map +0 -1
- package/dist/tempo/server/SponsorBudget.d.ts.map +0 -1
- package/dist/tempo/server/SponsorBudget.js.map +0 -1
- package/dist/tempo/server/Subscription.d.ts.map +0 -1
- package/dist/tempo/server/Subscription.js.map +0 -1
- package/dist/tempo/server/index.d.ts.map +0 -1
- package/dist/tempo/server/index.js.map +0 -1
- package/dist/tempo/server/internal/html.gen.d.ts.map +0 -1
- package/dist/tempo/server/internal/html.gen.js.map +0 -1
- package/dist/tempo/server/internal/request-body.d.ts.map +0 -1
- package/dist/tempo/server/internal/request-body.js.map +0 -1
- package/dist/tempo/server/internal/transport.d.ts.map +0 -1
- package/dist/tempo/server/internal/transport.js.map +0 -1
- package/dist/tempo/session/Snapshot.d.ts.map +0 -1
- package/dist/tempo/session/Snapshot.js.map +0 -1
- package/dist/tempo/session/client/ChannelOps.d.ts.map +0 -1
- package/dist/tempo/session/client/ChannelOps.js.map +0 -1
- package/dist/tempo/session/client/ChannelStore.d.ts.map +0 -1
- package/dist/tempo/session/client/ChannelStore.js.map +0 -1
- package/dist/tempo/session/client/CredentialState.d.ts.map +0 -1
- package/dist/tempo/session/client/CredentialState.js.map +0 -1
- package/dist/tempo/session/client/ReceiptCoordinator.d.ts.map +0 -1
- package/dist/tempo/session/client/ReceiptCoordinator.js.map +0 -1
- package/dist/tempo/session/client/Runtime.d.ts.map +0 -1
- package/dist/tempo/session/client/Runtime.js.map +0 -1
- package/dist/tempo/session/client/Session.d.ts.map +0 -1
- package/dist/tempo/session/client/Session.js.map +0 -1
- package/dist/tempo/session/client/SessionManager.d.ts.map +0 -1
- package/dist/tempo/session/client/SessionManager.js.map +0 -1
- package/dist/tempo/session/client/Transports.d.ts.map +0 -1
- package/dist/tempo/session/client/Transports.js.map +0 -1
- package/dist/tempo/session/client/index.d.ts.map +0 -1
- package/dist/tempo/session/client/index.js.map +0 -1
- package/dist/tempo/session/client/internal/SessionManager.d.ts.map +0 -1
- package/dist/tempo/session/client/internal/SessionManager.js.map +0 -1
- package/dist/tempo/session/index.d.ts.map +0 -1
- package/dist/tempo/session/index.js.map +0 -1
- package/dist/tempo/session/precompile/Chain.d.ts.map +0 -1
- package/dist/tempo/session/precompile/Chain.js.map +0 -1
- package/dist/tempo/session/precompile/Channel.d.ts.map +0 -1
- package/dist/tempo/session/precompile/Channel.js.map +0 -1
- package/dist/tempo/session/precompile/Protocol.d.ts.map +0 -1
- package/dist/tempo/session/precompile/Protocol.js.map +0 -1
- package/dist/tempo/session/precompile/Voucher.d.ts.map +0 -1
- package/dist/tempo/session/precompile/Voucher.js.map +0 -1
- package/dist/tempo/session/precompile/escrow.abi.d.ts.map +0 -1
- package/dist/tempo/session/precompile/escrow.abi.js.map +0 -1
- package/dist/tempo/session/precompile/index.d.ts.map +0 -1
- package/dist/tempo/session/precompile/index.js.map +0 -1
- package/dist/tempo/session/server/ChannelOps.d.ts.map +0 -1
- package/dist/tempo/session/server/ChannelOps.js.map +0 -1
- package/dist/tempo/session/server/ChannelStore.d.ts.map +0 -1
- package/dist/tempo/session/server/ChannelStore.js.map +0 -1
- package/dist/tempo/session/server/CredentialVerification.d.ts.map +0 -1
- package/dist/tempo/session/server/CredentialVerification.js.map +0 -1
- package/dist/tempo/session/server/MeteredStream.d.ts.map +0 -1
- package/dist/tempo/session/server/MeteredStream.js.map +0 -1
- package/dist/tempo/session/server/RequestState.d.ts.map +0 -1
- package/dist/tempo/session/server/RequestState.js.map +0 -1
- package/dist/tempo/session/server/Session.d.ts.map +0 -1
- package/dist/tempo/session/server/Session.js.map +0 -1
- package/dist/tempo/session/server/Settlement.d.ts.map +0 -1
- package/dist/tempo/session/server/Settlement.js.map +0 -1
- package/dist/tempo/session/server/Sse.d.ts.map +0 -1
- package/dist/tempo/session/server/Sse.js.map +0 -1
- package/dist/tempo/session/server/Transports.d.ts.map +0 -1
- package/dist/tempo/session/server/Transports.js.map +0 -1
- package/dist/tempo/session/server/Ws.d.ts.map +0 -1
- package/dist/tempo/session/server/Ws.js.map +0 -1
- package/dist/tempo/session/server/index.d.ts.map +0 -1
- package/dist/tempo/session/server/index.js.map +0 -1
- package/dist/tempo/subscription/KeyAuthorization.d.ts.map +0 -1
- package/dist/tempo/subscription/KeyAuthorization.js.map +0 -1
- package/dist/tempo/subscription/Receipt.d.ts.map +0 -1
- package/dist/tempo/subscription/Receipt.js.map +0 -1
- package/dist/tempo/subscription/Store.d.ts.map +0 -1
- package/dist/tempo/subscription/Store.js.map +0 -1
- package/dist/tempo/subscription/Types.d.ts.map +0 -1
- package/dist/tempo/subscription/Types.js.map +0 -1
- package/dist/tempo/subscription/index.d.ts.map +0 -1
- package/dist/tempo/subscription/index.js.map +0 -1
- package/dist/validation/core.d.ts.map +0 -1
- package/dist/validation/core.js.map +0 -1
- package/dist/validation/index.d.ts.map +0 -1
- package/dist/validation/index.js.map +0 -1
- package/dist/viem/Account.d.ts.map +0 -1
- package/dist/viem/Account.js.map +0 -1
- package/dist/viem/Client.d.ts.map +0 -1
- package/dist/viem/Client.js.map +0 -1
- package/dist/web-bot-auth/Constants.d.ts.map +0 -1
- package/dist/web-bot-auth/Constants.js.map +0 -1
- package/dist/web-bot-auth/Types.d.ts.map +0 -1
- package/dist/web-bot-auth/Types.js.map +0 -1
- package/dist/web-bot-auth/client/index.d.ts.map +0 -1
- package/dist/web-bot-auth/client/index.js.map +0 -1
- package/dist/web-bot-auth/index.d.ts.map +0 -1
- package/dist/web-bot-auth/index.js.map +0 -1
- package/dist/web-bot-auth/internal/JwkThumbprint.d.ts.map +0 -1
- package/dist/web-bot-auth/internal/JwkThumbprint.js.map +0 -1
- package/dist/web-bot-auth/internal/SignatureAgent.d.ts.map +0 -1
- package/dist/web-bot-auth/internal/SignatureAgent.js.map +0 -1
- package/dist/web-bot-auth/server/index.d.ts.map +0 -1
- package/dist/web-bot-auth/server/index.js.map +0 -1
- package/dist/x402/Assets.d.ts.map +0 -1
- package/dist/x402/Assets.js.map +0 -1
- package/dist/x402/Header.d.ts.map +0 -1
- package/dist/x402/Header.js.map +0 -1
- package/dist/x402/Types.d.ts.map +0 -1
- package/dist/x402/Types.js.map +0 -1
- package/dist/x402/client/Exact.d.ts.map +0 -1
- package/dist/x402/client/Exact.js.map +0 -1
- package/dist/x402/index.d.ts.map +0 -1
- package/dist/x402/index.js.map +0 -1
- package/dist/x402/internal/ChallengeBrand.d.ts.map +0 -1
- package/dist/x402/internal/ChallengeBrand.js.map +0 -1
- package/dist/x402/internal/RouteBinding.d.ts.map +0 -1
- package/dist/x402/internal/RouteBinding.js.map +0 -1
- package/dist/x402/server/EvmCharge.d.ts.map +0 -1
- package/dist/x402/server/EvmCharge.js.map +0 -1
- package/dist/x402/server/Facilitator.d.ts.map +0 -1
- package/dist/x402/server/Facilitator.js.map +0 -1
- package/dist/zod.d.ts.map +0 -1
- package/dist/zod.js.map +0 -1
- package/src/BodyDigest.test.ts +0 -43
- package/src/BodyDigest.ts +0 -55
- package/src/Challenge.fuzz.test.ts +0 -154
- package/src/Challenge.test-d.ts +0 -82
- package/src/Challenge.test.ts +0 -1060
- package/src/Challenge.ts +0 -687
- package/src/Constants.ts +0 -58
- package/src/Credential.fuzz.test.ts +0 -62
- package/src/Credential.test.ts +0 -378
- package/src/Credential.ts +0 -217
- package/src/Errors.test.ts +0 -520
- package/src/Errors.ts +0 -448
- package/src/Expires.test.ts +0 -112
- package/src/Expires.ts +0 -59
- package/src/Html.ts +0 -67
- package/src/Mcp.ts +0 -85
- package/src/Method.test.ts +0 -177
- package/src/Method.ts +0 -631
- package/src/PaymentRequest.test.ts +0 -147
- package/src/PaymentRequest.ts +0 -108
- package/src/Receipt.test.ts +0 -151
- package/src/Receipt.ts +0 -146
- package/src/Store.test-d.ts +0 -211
- package/src/Store.test.ts +0 -407
- package/src/Store.ts +0 -397
- package/src/attestation/Attestation.integration.test.ts +0 -208
- package/src/attestation/Client.test.ts +0 -83
- package/src/attestation/Client.ts +0 -34
- package/src/attestation/Constants.ts +0 -15
- package/src/attestation/Server.test.ts +0 -60
- package/src/attestation/Server.ts +0 -12
- package/src/attestation/Types.test-d.ts +0 -54
- package/src/attestation/Types.ts +0 -77
- package/src/attestation/index.ts +0 -5
- package/src/attestation/internal/HttpMessageSignature.test.ts +0 -101
- package/src/attestation/internal/HttpMessageSignature.ts +0 -429
- package/src/attestation/internal/SigningContext.ts +0 -13
- package/src/bin.js +0 -2
- package/src/bin.ts +0 -4
- package/src/cli/account.ts +0 -269
- package/src/cli/cli.test.ts +0 -2221
- package/src/cli/cli.ts +0 -1650
- package/src/cli/config.test.ts +0 -89
- package/src/cli/config.ts +0 -50
- package/src/cli/internal.ts +0 -114
- package/src/cli/mcp.test.ts +0 -262
- package/src/cli/plugins/evm.ts +0 -55
- package/src/cli/plugins/index.ts +0 -4
- package/src/cli/plugins/plugin.ts +0 -84
- package/src/cli/plugins/stripe.ts +0 -174
- package/src/cli/plugins/tempo.ts +0 -1102
- package/src/cli/sessions/Manager.test.ts +0 -249
- package/src/cli/sessions/Manager.ts +0 -93
- package/src/cli/sessions/commands.ts +0 -444
- package/src/cli/sessions/request.test.ts +0 -51
- package/src/cli/sessions/request.ts +0 -353
- package/src/cli/sessions/store.test.ts +0 -581
- package/src/cli/sessions/store.ts +0 -940
- package/src/cli/utils.test.ts +0 -156
- package/src/cli/utils.ts +0 -394
- package/src/cli/validate/challenge.ts +0 -565
- package/src/cli/validate/discovery.test.ts +0 -435
- package/src/cli/validate/discovery.ts +0 -221
- package/src/cli/validate/helpers.ts +0 -166
- package/src/cli/validate/index.ts +0 -229
- package/src/cli/validate/messages.ts +0 -7
- package/src/cli/validate/payment.ts +0 -774
- package/src/cli/validate.test.ts +0 -843
- package/src/client/Methods.ts +0 -8
- package/src/client/Mppx.test-d.ts +0 -287
- package/src/client/Mppx.test.ts +0 -1065
- package/src/client/Mppx.ts +0 -487
- package/src/client/Transport.test.ts +0 -586
- package/src/client/Transport.ts +0 -170
- package/src/client/index.ts +0 -29
- package/src/client/internal/Fetch.browser.test.ts +0 -197
- package/src/client/internal/Fetch.test-d.ts +0 -109
- package/src/client/internal/Fetch.test.ts +0 -2336
- package/src/client/internal/Fetch.ts +0 -1075
- package/src/client/internal/MethodChallenge.ts +0 -35
- package/src/client/internal/MethodResponse.ts +0 -67
- package/src/client/internal/protocols/Mcp.test.ts +0 -220
- package/src/client/internal/protocols/Mcp.ts +0 -186
- package/src/client/internal/protocols/Mpp.ts +0 -21
- package/src/client/internal/protocols/Protocol.ts +0 -10
- package/src/client/internal/protocols/Shared.ts +0 -25
- package/src/client/internal/protocols/X402.ts +0 -46
- package/src/client/node.test.ts +0 -115
- package/src/client/node.ts +0 -247
- package/src/discovery/Discovery.test.ts +0 -214
- package/src/discovery/Discovery.ts +0 -105
- package/src/discovery/OpenApi.test.ts +0 -623
- package/src/discovery/OpenApi.ts +0 -192
- package/src/discovery/Validate.test.ts +0 -305
- package/src/discovery/Validate.ts +0 -77
- package/src/discovery/index.ts +0 -3
- package/src/discovery/internal/Metadata.ts +0 -51
- package/src/env.d.ts +0 -12
- package/src/evm/Assets.ts +0 -1
- package/src/evm/Chains.ts +0 -11
- package/src/evm/Methods.ts +0 -44
- package/src/evm/PublicInterface.test-d.ts +0 -134
- package/src/evm/Types.ts +0 -140
- package/src/evm/client/Charge.test.ts +0 -347
- package/src/evm/client/Charge.ts +0 -187
- package/src/evm/client/Methods.ts +0 -19
- package/src/evm/client/index.ts +0 -6
- package/src/evm/index.ts +0 -16
- package/src/evm/server/Charge.test.ts +0 -339
- package/src/evm/server/Charge.ts +0 -295
- package/src/evm/server/Methods.ts +0 -22
- package/src/evm/server/index.ts +0 -6
- package/src/index.ts +0 -14
- package/src/internal/AcceptPayment.test.ts +0 -347
- package/src/internal/AcceptPayment.ts +0 -366
- package/src/internal/HeaderCodec.ts +0 -36
- package/src/internal/changeset.test.ts +0 -106
- package/src/internal/constantTimeEqual.test.ts +0 -47
- package/src/internal/constantTimeEqual.ts +0 -10
- package/src/internal/env.test.ts +0 -42
- package/src/internal/env.ts +0 -49
- package/src/internal/types.test-d.ts +0 -21
- package/src/internal/types.ts +0 -479
- package/src/mcp/client/McpClient.integration.test.ts +0 -639
- package/src/mcp/client/McpClient.test-d.ts +0 -144
- package/src/mcp/client/McpClient.test.ts +0 -463
- package/src/mcp/client/McpClient.ts +0 -307
- package/src/mcp/client/McpClient.unit.test.ts +0 -135
- package/src/mcp/client/index.ts +0 -2
- package/src/mcp/server/Transport.test.ts +0 -191
- package/src/mcp/server/Transport.ts +0 -111
- package/src/mcp/server/index.ts +0 -1
- package/src/middlewares/elysia.test.ts +0 -285
- package/src/middlewares/elysia.ts +0 -116
- package/src/middlewares/express.test.ts +0 -361
- package/src/middlewares/express.ts +0 -140
- package/src/middlewares/hono.test.ts +0 -473
- package/src/middlewares/hono.ts +0 -153
- package/src/middlewares/internal/mppx.test.ts +0 -177
- package/src/middlewares/internal/mppx.ts +0 -67
- package/src/middlewares/nextjs.test.ts +0 -359
- package/src/middlewares/nextjs.ts +0 -107
- package/src/proxy/Proxy.test.ts +0 -1038
- package/src/proxy/Proxy.ts +0 -483
- package/src/proxy/Proxy.upstreamError.test.ts +0 -364
- package/src/proxy/Service.test.ts +0 -252
- package/src/proxy/Service.ts +0 -280
- package/src/proxy/index.ts +0 -6
- package/src/proxy/internal/Headers.test.ts +0 -139
- package/src/proxy/internal/Headers.ts +0 -66
- package/src/proxy/internal/Route.test.ts +0 -217
- package/src/proxy/internal/Route.ts +0 -64
- package/src/proxy/services/anthropic.test.ts +0 -132
- package/src/proxy/services/anthropic.ts +0 -53
- package/src/proxy/services/hooks.test-d.ts +0 -14
- package/src/proxy/services/hooks.test.ts +0 -44
- package/src/proxy/services/openai.test.ts +0 -157
- package/src/proxy/services/openai.ts +0 -60
- package/src/proxy/services/stripe.test.ts +0 -175
- package/src/proxy/services/stripe.ts +0 -59
- package/src/server/Methods.test-d.ts +0 -88
- package/src/server/Methods.test.ts +0 -69
- package/src/server/Methods.ts +0 -3
- package/src/server/Mppx.authorize.test.ts +0 -210
- package/src/server/Mppx.test-d.ts +0 -494
- package/src/server/Mppx.test.ts +0 -6711
- package/src/server/Mppx.ts +0 -2919
- package/src/server/NodeListener.test.ts +0 -293
- package/src/server/NodeListener.ts +0 -45
- package/src/server/Request.test.ts +0 -255
- package/src/server/Request.ts +0 -155
- package/src/server/Response.test.ts +0 -32
- package/src/server/Response.ts +0 -45
- package/src/server/Transport.test.ts +0 -598
- package/src/server/Transport.ts +0 -320
- package/src/server/index.ts +0 -9
- package/src/server/internal/html/compose.main.gen.ts +0 -2
- package/src/server/internal/html/compose.main.ts +0 -88
- package/src/server/internal/html/config.ts +0 -672
- package/src/server/internal/html/constants.ts +0 -28
- package/src/server/internal/html/serviceWorker.client.ts +0 -28
- package/src/server/internal/html/serviceWorker.gen.ts +0 -2
- package/src/server/internal/html/serviceWorker.ts +0 -27
- package/src/server/internal/html/tsconfig.compose.json +0 -8
- package/src/server/internal/html/tsconfig.worker.client.json +0 -8
- package/src/server/internal/html/tsconfig.worker.json +0 -8
- package/src/server/internal/scope.ts +0 -43
- package/src/stripe/Charge.integration.test.ts +0 -329
- package/src/stripe/Methods.test.ts +0 -62
- package/src/stripe/Methods.ts +0 -44
- package/src/stripe/client/Charge.test.ts +0 -205
- package/src/stripe/client/Charge.ts +0 -132
- package/src/stripe/client/Methods.ts +0 -37
- package/src/stripe/client/index.ts +0 -2
- package/src/stripe/index.ts +0 -1
- package/src/stripe/internal/constants.ts +0 -7
- package/src/stripe/internal/types.ts +0 -47
- package/src/stripe/server/Charge.test-d.ts +0 -81
- package/src/stripe/server/Charge.test.ts +0 -700
- package/src/stripe/server/Charge.ts +0 -487
- package/src/stripe/server/Methods.test-d.ts +0 -157
- package/src/stripe/server/Methods.test.ts +0 -403
- package/src/stripe/server/Methods.ts +0 -441
- package/src/stripe/server/index.ts +0 -2
- package/src/stripe/server/internal/deposit-address.ts +0 -57
- package/src/stripe/server/internal/html/main.ts +0 -165
- package/src/stripe/server/internal/html/node_modules/.bin/mppx +0 -22
- package/src/stripe/server/internal/html/node_modules/.bin/mppx.src +0 -22
- package/src/stripe/server/internal/html/package.json +0 -9
- package/src/stripe/server/internal/html/stripe-js-pure.d.ts +0 -7
- package/src/stripe/server/internal/html/tsconfig.json +0 -8
- package/src/stripe/server/internal/html/types.ts +0 -5
- package/src/stripe/server/internal/html.gen.ts +0 -2
- package/src/stripe/server/internal/record-payment.ts +0 -66
- package/src/stripe/server/internal/request.ts +0 -49
- package/src/tap/Constants.ts +0 -32
- package/src/tap/Tap.test.ts +0 -125
- package/src/tap/Types.ts +0 -11
- package/src/tap/client/index.ts +0 -54
- package/src/tap/index.ts +0 -4
- package/src/tap/server/index.ts +0 -48
- package/src/tempo/AccessKeyAuthorization.test.ts +0 -141
- package/src/tempo/Attribution.test.ts +0 -294
- package/src/tempo/Attribution.ts +0 -185
- package/src/tempo/Methods.test.ts +0 -425
- package/src/tempo/Methods.ts +0 -367
- package/src/tempo/Proof.conformance.test.ts +0 -146
- package/src/tempo/Proof.test-d.ts +0 -32
- package/src/tempo/Proof.test.ts +0 -40
- package/src/tempo/Proof.ts +0 -69
- package/src/tempo/PublicExports.test-d.ts +0 -130
- package/src/tempo/Subscription.integration.test.ts +0 -591
- package/src/tempo/client/Charge.test.ts +0 -501
- package/src/tempo/client/Charge.ts +0 -271
- package/src/tempo/client/Methods.ts +0 -45
- package/src/tempo/client/ResolveAccount.ts +0 -46
- package/src/tempo/client/Subscription.test.ts +0 -180
- package/src/tempo/client/Subscription.ts +0 -156
- package/src/tempo/client/index.ts +0 -17
- package/src/tempo/index.ts +0 -5
- package/src/tempo/internal/account.ts +0 -56
- package/src/tempo/internal/address.test.ts +0 -42
- package/src/tempo/internal/address.ts +0 -6
- package/src/tempo/internal/auto-swap.test.ts +0 -198
- package/src/tempo/internal/auto-swap.ts +0 -145
- package/src/tempo/internal/charge.test.ts +0 -66
- package/src/tempo/internal/charge.ts +0 -43
- package/src/tempo/internal/defaults.test.ts +0 -95
- package/src/tempo/internal/defaults.ts +0 -53
- package/src/tempo/internal/fee-payer.test.ts +0 -1177
- package/src/tempo/internal/fee-payer.ts +0 -808
- package/src/tempo/internal/fee-token.test.ts +0 -165
- package/src/tempo/internal/fee-token.ts +0 -72
- package/src/tempo/internal/proof.test.ts +0 -97
- package/src/tempo/internal/proof.ts +0 -87
- package/src/tempo/internal/selectors.ts +0 -10
- package/src/tempo/internal/types.ts +0 -19
- package/src/tempo/legacy/AccessKeyAuthorization.test.ts +0 -162
- package/src/tempo/legacy/README.md +0 -9
- package/src/tempo/legacy/client/ChannelOps.test.ts +0 -379
- package/src/tempo/legacy/client/ChannelOps.ts +0 -271
- package/src/tempo/legacy/client/Session.test.ts +0 -800
- package/src/tempo/legacy/client/Session.ts +0 -397
- package/src/tempo/legacy/client/SessionManager.test.ts +0 -468
- package/src/tempo/legacy/client/SessionManager.ts +0 -909
- package/src/tempo/legacy/client/index.ts +0 -6
- package/src/tempo/legacy/index.ts +0 -4
- package/src/tempo/legacy/session/Chain.test.ts +0 -1349
- package/src/tempo/legacy/session/Chain.ts +0 -830
- package/src/tempo/legacy/session/Channel.test.ts +0 -109
- package/src/tempo/legacy/session/Channel.ts +0 -51
- package/src/tempo/legacy/session/Types.ts +0 -91
- package/src/tempo/legacy/session/Voucher.test.ts +0 -410
- package/src/tempo/legacy/session/Voucher.ts +0 -183
- package/src/tempo/legacy/session/escrow.abi.ts +0 -760
- package/src/tempo/legacy/session/index.ts +0 -8
- package/src/tempo/server/AtomicStore.test-d.ts +0 -63
- package/src/tempo/server/Charge.test.ts +0 -6056
- package/src/tempo/server/Charge.ts +0 -1379
- package/src/tempo/server/Methods.ts +0 -86
- package/src/tempo/server/Relay.test.ts +0 -677
- package/src/tempo/server/Relay.ts +0 -297
- package/src/tempo/server/SponsorBudget.test.ts +0 -154
- package/src/tempo/server/SponsorBudget.ts +0 -219
- package/src/tempo/server/Sse.test.ts +0 -321
- package/src/tempo/server/Subscription.test.ts +0 -1944
- package/src/tempo/server/Subscription.ts +0 -1336
- package/src/tempo/server/index.ts +0 -12
- package/src/tempo/server/internal/html/main.ts +0 -115
- package/src/tempo/server/internal/html/node_modules/.bin/mppx +0 -22
- package/src/tempo/server/internal/html/node_modules/.bin/mppx.src +0 -22
- package/src/tempo/server/internal/html/package.json +0 -10
- package/src/tempo/server/internal/html/tsconfig.json +0 -8
- package/src/tempo/server/internal/html.gen.ts +0 -2
- package/src/tempo/server/internal/request-body.test.ts +0 -210
- package/src/tempo/server/internal/request-body.ts +0 -61
- package/src/tempo/server/internal/transport.test.ts +0 -922
- package/src/tempo/server/internal/transport.ts +0 -322
- package/src/tempo/session/README.md +0 -320
- package/src/tempo/session/Snapshot.test.ts +0 -41
- package/src/tempo/session/Snapshot.ts +0 -95
- package/src/tempo/session/client/ChannelOps.test.ts +0 -218
- package/src/tempo/session/client/ChannelOps.ts +0 -348
- package/src/tempo/session/client/ChannelStore.ts +0 -111
- package/src/tempo/session/client/CredentialState.test.ts +0 -789
- package/src/tempo/session/client/CredentialState.ts +0 -942
- package/src/tempo/session/client/ReceiptCoordinator.ts +0 -95
- package/src/tempo/session/client/Runtime.test.ts +0 -1104
- package/src/tempo/session/client/Runtime.ts +0 -1008
- package/src/tempo/session/client/Session.test.ts +0 -1355
- package/src/tempo/session/client/Session.ts +0 -420
- package/src/tempo/session/client/SessionManager.test.ts +0 -1899
- package/src/tempo/session/client/SessionManager.ts +0 -996
- package/src/tempo/session/client/Transports.test.ts +0 -1141
- package/src/tempo/session/client/Transports.ts +0 -1534
- package/src/tempo/session/client/index.ts +0 -40
- package/src/tempo/session/client/internal/SessionManager.ts +0 -36
- package/src/tempo/session/index.ts +0 -7
- package/src/tempo/session/precompile/Chain.integration.test.ts +0 -339
- package/src/tempo/session/precompile/Chain.test.ts +0 -1641
- package/src/tempo/session/precompile/Chain.ts +0 -1269
- package/src/tempo/session/precompile/Channel.test.ts +0 -147
- package/src/tempo/session/precompile/Channel.ts +0 -108
- package/src/tempo/session/precompile/Protocol.test.ts +0 -358
- package/src/tempo/session/precompile/Protocol.ts +0 -520
- package/src/tempo/session/precompile/Voucher.test.ts +0 -354
- package/src/tempo/session/precompile/Voucher.ts +0 -162
- package/src/tempo/session/precompile/escrow.abi.ts +0 -226
- package/src/tempo/session/precompile/index.ts +0 -33
- package/src/tempo/session/server/ChannelOps.test.ts +0 -129
- package/src/tempo/session/server/ChannelOps.ts +0 -157
- package/src/tempo/session/server/ChannelStore.test.ts +0 -1093
- package/src/tempo/session/server/ChannelStore.ts +0 -856
- package/src/tempo/session/server/CredentialVerification.test.ts +0 -299
- package/src/tempo/session/server/CredentialVerification.ts +0 -1087
- package/src/tempo/session/server/MeteredStream.ts +0 -99
- package/src/tempo/session/server/RequestState.test.ts +0 -574
- package/src/tempo/session/server/RequestState.ts +0 -507
- package/src/tempo/session/server/Session.integration.test.ts +0 -449
- package/src/tempo/session/server/Session.test.ts +0 -4247
- package/src/tempo/session/server/Session.ts +0 -669
- package/src/tempo/session/server/Settlement.test.ts +0 -345
- package/src/tempo/session/server/Settlement.ts +0 -527
- package/src/tempo/session/server/Sse.fuzz.test.ts +0 -138
- package/src/tempo/session/server/Sse.test.ts +0 -634
- package/src/tempo/session/server/Sse.ts +0 -261
- package/src/tempo/session/server/Transports.test.ts +0 -346
- package/src/tempo/session/server/Transports.ts +0 -256
- package/src/tempo/session/server/Ws.test.ts +0 -765
- package/src/tempo/session/server/Ws.ts +0 -391
- package/src/tempo/session/server/index.ts +0 -12
- package/src/tempo/subscription/KeyAuthorization.test.ts +0 -282
- package/src/tempo/subscription/KeyAuthorization.ts +0 -396
- package/src/tempo/subscription/Receipt.ts +0 -28
- package/src/tempo/subscription/Store.test.ts +0 -609
- package/src/tempo/subscription/Store.ts +0 -449
- package/src/tempo/subscription/Types.ts +0 -68
- package/src/tempo/subscription/index.ts +0 -23
- package/src/tsconfig.json +0 -10
- package/src/validation/core.ts +0 -386
- package/src/validation/index.ts +0 -11
- package/src/viem/Account.test.ts +0 -72
- package/src/viem/Account.ts +0 -30
- package/src/viem/Client.test.ts +0 -366
- package/src/viem/Client.ts +0 -93
- package/src/web-bot-auth/Constants.ts +0 -24
- package/src/web-bot-auth/Types.ts +0 -9
- package/src/web-bot-auth/WebBotAuth.test.ts +0 -182
- package/src/web-bot-auth/client/index.ts +0 -84
- package/src/web-bot-auth/index.ts +0 -6
- package/src/web-bot-auth/internal/JwkThumbprint.ts +0 -21
- package/src/web-bot-auth/internal/SignatureAgent.ts +0 -18
- package/src/web-bot-auth/server/index.ts +0 -113
- package/src/x402/Assets.test.ts +0 -253
- package/src/x402/Assets.ts +0 -221
- package/src/x402/Exact.e2e.test.ts +0 -488
- package/src/x402/Exact.localnet.test.ts +0 -475
- package/src/x402/Header.test.ts +0 -73
- package/src/x402/Header.ts +0 -79
- package/src/x402/PublicInterface.test-d.ts +0 -39
- package/src/x402/Types.ts +0 -248
- package/src/x402/client/Exact.test.ts +0 -309
- package/src/x402/client/Exact.ts +0 -186
- package/src/x402/index.ts +0 -6
- package/src/x402/internal/ChallengeBrand.ts +0 -14
- package/src/x402/internal/RouteBinding.ts +0 -18
- package/src/x402/server/EvmCharge.ts +0 -410
- package/src/x402/server/Facilitator.test.ts +0 -111
- package/src/x402/server/Facilitator.ts +0 -56
- package/src/zod.test.ts +0 -169
- package/src/zod.ts +0 -71
|
@@ -1,1379 +0,0 @@
|
|
|
1
|
-
import * as SignatureEnvelope from 'ox/tempo/SignatureEnvelope'
|
|
2
|
-
import {
|
|
3
|
-
decodeFunctionData,
|
|
4
|
-
formatUnits,
|
|
5
|
-
keccak256,
|
|
6
|
-
parseEventLogs,
|
|
7
|
-
type TransactionReceipt,
|
|
8
|
-
} from 'viem'
|
|
9
|
-
import {
|
|
10
|
-
getTransactionReceipt,
|
|
11
|
-
sendRawTransaction,
|
|
12
|
-
sendRawTransactionSync,
|
|
13
|
-
signTransaction,
|
|
14
|
-
verifyTypedData,
|
|
15
|
-
call as viem_call,
|
|
16
|
-
} from 'viem/actions'
|
|
17
|
-
import { Abis, Actions, Transaction } from 'viem/tempo'
|
|
18
|
-
import { tempo as tempo_chain } from 'viem/tempo/chains'
|
|
19
|
-
|
|
20
|
-
import { PaymentError, VerificationFailedError } from '../../Errors.js'
|
|
21
|
-
import * as Expires from '../../Expires.js'
|
|
22
|
-
import type { LooseOmit, NoExtraKeys } from '../../internal/types.js'
|
|
23
|
-
import * as Method from '../../Method.js'
|
|
24
|
-
import type * as Html from '../../server/internal/html/config.ts'
|
|
25
|
-
import * as Store from '../../Store.js'
|
|
26
|
-
import * as Client from '../../viem/Client.js'
|
|
27
|
-
import type * as z from '../../zod.js'
|
|
28
|
-
import * as Attribution from '../Attribution.js'
|
|
29
|
-
import * as Account from '../internal/account.js'
|
|
30
|
-
import * as TempoAddress from '../internal/address.js'
|
|
31
|
-
import * as Charge_internal from '../internal/charge.js'
|
|
32
|
-
import * as defaults from '../internal/defaults.js'
|
|
33
|
-
import * as FeePayer from '../internal/fee-payer.js'
|
|
34
|
-
import { resolveFeeToken } from '../internal/fee-token.js'
|
|
35
|
-
import * as Proof from '../internal/proof.js'
|
|
36
|
-
import * as Selectors from '../internal/selectors.js'
|
|
37
|
-
import type * as types from '../internal/types.js'
|
|
38
|
-
import * as Methods from '../Methods.js'
|
|
39
|
-
import { html as htmlContent } from './internal/html.gen.js'
|
|
40
|
-
import * as Relay from './Relay.js'
|
|
41
|
-
import * as SponsorBudget from './SponsorBudget.js'
|
|
42
|
-
|
|
43
|
-
/**
|
|
44
|
-
* Creates a Tempo charge method intent for usage on the server.
|
|
45
|
-
*
|
|
46
|
-
* @example
|
|
47
|
-
* ```ts
|
|
48
|
-
* import { tempo } from 'mppx/server'
|
|
49
|
-
*
|
|
50
|
-
* const charge = tempo.charge()
|
|
51
|
-
* ```
|
|
52
|
-
*/
|
|
53
|
-
export function charge<const parameters extends charge.Parameters>(
|
|
54
|
-
parameters: NoExtraKeys<parameters, charge.Parameters> = {} as NoExtraKeys<
|
|
55
|
-
parameters,
|
|
56
|
-
charge.Parameters
|
|
57
|
-
>,
|
|
58
|
-
): Method.Server<typeof Methods.charge, charge.DeriveDefaults<parameters>> {
|
|
59
|
-
const {
|
|
60
|
-
amount,
|
|
61
|
-
currency = defaults.resolveCurrency(parameters),
|
|
62
|
-
decimals = defaults.decimals,
|
|
63
|
-
description,
|
|
64
|
-
externalId,
|
|
65
|
-
feeToken: configuredFeeToken,
|
|
66
|
-
feePayerPolicy,
|
|
67
|
-
html,
|
|
68
|
-
memo,
|
|
69
|
-
relay,
|
|
70
|
-
sponsorBudget,
|
|
71
|
-
splits,
|
|
72
|
-
supportedModes,
|
|
73
|
-
validateSender,
|
|
74
|
-
waitForConfirmation = true,
|
|
75
|
-
} = parameters
|
|
76
|
-
const storeKeyPrefix = parameters.storeKeyPrefix ?? ''
|
|
77
|
-
const rawStore = (parameters.store ?? Store.memory()) as Store.AtomicStore<charge.StoreItemMap>
|
|
78
|
-
const store = Store.from(rawStore, { keyPrefix: storeKeyPrefix })
|
|
79
|
-
const {
|
|
80
|
-
maxInFlightReservations: legacyMaxInFlightReservations,
|
|
81
|
-
maxInFlightTotalFee: legacyMaxInFlightTotalFee,
|
|
82
|
-
...transactionFeePayerPolicy
|
|
83
|
-
} = feePayerPolicy ?? {}
|
|
84
|
-
const sponsorBudgetConfig = sponsorBudget === false ? undefined : (sponsorBudget ?? {})
|
|
85
|
-
const maxInFlightReservations =
|
|
86
|
-
sponsorBudgetConfig?.maxInFlightReservations ?? legacyMaxInFlightReservations ?? 100
|
|
87
|
-
const maxInFlightTotalFee =
|
|
88
|
-
sponsorBudgetConfig?.maxInFlightTotalFee ??
|
|
89
|
-
legacyMaxInFlightTotalFee ??
|
|
90
|
-
(feePayerPolicy?.maxTotalFee ?? 50_000_000_000_000_000n) * 10n
|
|
91
|
-
if (sponsorBudgetConfig) {
|
|
92
|
-
if (!Number.isSafeInteger(maxInFlightReservations) || maxInFlightReservations <= 0)
|
|
93
|
-
throw new Error('`sponsorBudget.maxInFlightReservations` must be a positive safe integer.')
|
|
94
|
-
if (maxInFlightTotalFee <= 0n)
|
|
95
|
-
throw new Error('`sponsorBudget.maxInFlightTotalFee` must be greater than zero.')
|
|
96
|
-
}
|
|
97
|
-
// Aggregate exposure belongs to the actual sponsor, not a caller-specific replay namespace.
|
|
98
|
-
// Keep it unprefixed and shared across every tenant/process using the sponsor.
|
|
99
|
-
const sponsorBudgetStore = sponsorBudgetConfig
|
|
100
|
-
? (Store.from(sponsorBudgetConfig.store ?? rawStore) as Store.AtomicStore<{
|
|
101
|
-
[key: `mppx:charge:sponsor-budget:${string}`]: SponsorBudget.State
|
|
102
|
-
}>)
|
|
103
|
-
: undefined
|
|
104
|
-
const proofStore = parameters.store
|
|
105
|
-
? Store.from(parameters.store as Store.AtomicStore<charge.StoreItemMap>, {
|
|
106
|
-
keyPrefix: storeKeyPrefix,
|
|
107
|
-
})
|
|
108
|
-
: undefined
|
|
109
|
-
|
|
110
|
-
const { recipient, feePayer, feePayerUrl } = Account.resolve(parameters)
|
|
111
|
-
if (configuredFeeToken && feePayerUrl)
|
|
112
|
-
throw new Error('`feeToken` can only be configured for a local fee payer.')
|
|
113
|
-
|
|
114
|
-
const getClient = Client.getResolver({
|
|
115
|
-
chain: { ...tempo_chain, experimental_preconfirmationTime: 500 },
|
|
116
|
-
feePayerUrl,
|
|
117
|
-
getClient: parameters.getClient,
|
|
118
|
-
rpcUrl: defaults.rpcUrl,
|
|
119
|
-
})
|
|
120
|
-
|
|
121
|
-
function resolveRequest(request: Method.VerifyContext<typeof Methods.charge>['request']) {
|
|
122
|
-
const parsed = Methods.charge.schema.request.safeParse(request)
|
|
123
|
-
if (parsed.success) return parsed.data
|
|
124
|
-
// Credential handlers receive the HMAC-bound request in canonical output
|
|
125
|
-
// form, so it must not be transformed a second time.
|
|
126
|
-
return request as unknown as z.output<typeof Methods.charge.schema.request>
|
|
127
|
-
}
|
|
128
|
-
|
|
129
|
-
async function resolveCredentialContext({
|
|
130
|
-
credential,
|
|
131
|
-
request,
|
|
132
|
-
}: {
|
|
133
|
-
credential: Method.VerifyContext<typeof Methods.charge>['credential']
|
|
134
|
-
request: Method.VerifyContext<typeof Methods.charge>['request']
|
|
135
|
-
}) {
|
|
136
|
-
const { challenge, payload } = credential
|
|
137
|
-
const resolvedRequest = resolveRequest(request)
|
|
138
|
-
const chainId = resolvedRequest.methodDetails?.chainId ?? request.chainId
|
|
139
|
-
const { amount, methodDetails } = resolvedRequest
|
|
140
|
-
const supportedModes = methodDetails?.supportedModes as
|
|
141
|
-
| readonly Methods.ChargeMode[]
|
|
142
|
-
| undefined
|
|
143
|
-
const currency = resolvedRequest.currency as `0x${string}`
|
|
144
|
-
const recipient = resolvedRequest.recipient as `0x${string}`
|
|
145
|
-
const memo = methodDetails?.memo as `0x${string}` | undefined
|
|
146
|
-
const isZeroAmount = BigInt(amount) === 0n
|
|
147
|
-
|
|
148
|
-
Expires.assert(challenge.expires, challenge.id)
|
|
149
|
-
|
|
150
|
-
if (isZeroAmount && payload.type !== 'proof')
|
|
151
|
-
throw new MismatchError('Zero-amount challenges require a proof credential.', {})
|
|
152
|
-
|
|
153
|
-
return {
|
|
154
|
-
amount,
|
|
155
|
-
chainId,
|
|
156
|
-
challenge,
|
|
157
|
-
client: await getClient({ chainId }),
|
|
158
|
-
currency,
|
|
159
|
-
isZeroAmount,
|
|
160
|
-
memo,
|
|
161
|
-
methodDetails,
|
|
162
|
-
payload,
|
|
163
|
-
recipient,
|
|
164
|
-
requestAllowsFeePayer: request.feePayer !== false,
|
|
165
|
-
resolvedRequest,
|
|
166
|
-
supportedModes,
|
|
167
|
-
}
|
|
168
|
-
}
|
|
169
|
-
|
|
170
|
-
type CredentialContext = Awaited<ReturnType<typeof resolveCredentialContext>>
|
|
171
|
-
type Credential = Method.VerifyContext<typeof Methods.charge>['credential']
|
|
172
|
-
type HashPayload = Extract<Credential['payload'], { type: 'hash' }>
|
|
173
|
-
type ProofPayload = Extract<Credential['payload'], { type: 'proof' }>
|
|
174
|
-
type TransactionPayload = Extract<Credential['payload'], { type: 'transaction' }>
|
|
175
|
-
|
|
176
|
-
async function validateHashCredential(
|
|
177
|
-
credential: Credential,
|
|
178
|
-
payload: HashPayload,
|
|
179
|
-
context: CredentialContext,
|
|
180
|
-
) {
|
|
181
|
-
const {
|
|
182
|
-
amount,
|
|
183
|
-
chainId,
|
|
184
|
-
challenge,
|
|
185
|
-
client,
|
|
186
|
-
currency,
|
|
187
|
-
memo,
|
|
188
|
-
methodDetails,
|
|
189
|
-
recipient,
|
|
190
|
-
supportedModes,
|
|
191
|
-
} = context
|
|
192
|
-
if (supportedModes && !supportedModes.includes('push'))
|
|
193
|
-
throw new MismatchError('Hash credentials are not supported for this challenge.', {})
|
|
194
|
-
|
|
195
|
-
const source = parseHashCredentialSource({
|
|
196
|
-
chainId: chainId ?? client.chain?.id,
|
|
197
|
-
source: credential.source,
|
|
198
|
-
})
|
|
199
|
-
const transfers = getExpectedTransfers({ amount, memo, methodDetails, recipient })
|
|
200
|
-
const receipt = await getTransactionReceipt(client, {
|
|
201
|
-
hash: payload.hash as `0x${string}`,
|
|
202
|
-
})
|
|
203
|
-
const sender = source?.address ?? receipt.from
|
|
204
|
-
const matchedLogs = await assertTransferLogs(receipt, {
|
|
205
|
-
currency,
|
|
206
|
-
sender,
|
|
207
|
-
source,
|
|
208
|
-
transfers,
|
|
209
|
-
validateSender,
|
|
210
|
-
})
|
|
211
|
-
if (!memo)
|
|
212
|
-
assertChallengeBoundMemo(matchedLogs, {
|
|
213
|
-
challengeId: challenge.id,
|
|
214
|
-
realm: challenge.realm,
|
|
215
|
-
})
|
|
216
|
-
return { receipt: toReceipt(receipt), sender, transfers }
|
|
217
|
-
}
|
|
218
|
-
|
|
219
|
-
async function validateProofCredential(
|
|
220
|
-
credential: Credential,
|
|
221
|
-
payload: ProofPayload,
|
|
222
|
-
context: CredentialContext,
|
|
223
|
-
) {
|
|
224
|
-
const { chainId, challenge, client, isZeroAmount } = context
|
|
225
|
-
if (!isZeroAmount)
|
|
226
|
-
throw new MismatchError('Proof credentials are only valid for zero-amount challenges.', {})
|
|
227
|
-
|
|
228
|
-
const expectedSource = credential.source
|
|
229
|
-
if (!expectedSource) throw new MismatchError('Proof credential must include a source.', {})
|
|
230
|
-
|
|
231
|
-
const resolvedChainId = challenge.request.methodDetails?.chainId ?? chainId!
|
|
232
|
-
const source = Proof.parsePkhSource(expectedSource)
|
|
233
|
-
if (!source || source.chainId !== resolvedChainId)
|
|
234
|
-
throw new MismatchError('Proof credential source is invalid.', {})
|
|
235
|
-
|
|
236
|
-
const valid = await verifyTypedData(client, {
|
|
237
|
-
address: source.address,
|
|
238
|
-
...Proof.typedData({
|
|
239
|
-
account: source.address,
|
|
240
|
-
chainId: resolvedChainId,
|
|
241
|
-
challengeId: challenge.id,
|
|
242
|
-
realm: challenge.realm,
|
|
243
|
-
}),
|
|
244
|
-
signature: payload.signature as `0x${string}`,
|
|
245
|
-
})
|
|
246
|
-
if (!valid) {
|
|
247
|
-
const proofSigner = recoverAuthorizedProofSigner({
|
|
248
|
-
chainId: resolvedChainId,
|
|
249
|
-
challengeId: challenge.id,
|
|
250
|
-
realm: challenge.realm,
|
|
251
|
-
signature: payload.signature as `0x${string}`,
|
|
252
|
-
sourceAddress: source.address,
|
|
253
|
-
})
|
|
254
|
-
const authorized = proofSigner
|
|
255
|
-
? await isActiveAccessKey(client, { accessKey: proofSigner, account: source.address })
|
|
256
|
-
: false
|
|
257
|
-
if (!authorized) throw new MismatchError('Proof signature does not match source.', {})
|
|
258
|
-
}
|
|
259
|
-
return { sender: source.address }
|
|
260
|
-
}
|
|
261
|
-
|
|
262
|
-
async function validateTransactionCredential(
|
|
263
|
-
credential: Credential,
|
|
264
|
-
payload: TransactionPayload,
|
|
265
|
-
request: Method.VerifyContext<typeof Methods.charge>['request'],
|
|
266
|
-
context: CredentialContext,
|
|
267
|
-
) {
|
|
268
|
-
const {
|
|
269
|
-
amount,
|
|
270
|
-
chainId,
|
|
271
|
-
challenge,
|
|
272
|
-
client,
|
|
273
|
-
currency,
|
|
274
|
-
memo,
|
|
275
|
-
methodDetails,
|
|
276
|
-
recipient,
|
|
277
|
-
requestAllowsFeePayer,
|
|
278
|
-
supportedModes,
|
|
279
|
-
} = context
|
|
280
|
-
if (supportedModes && !supportedModes.includes('pull'))
|
|
281
|
-
throw new MismatchError('Transaction credentials are not supported for this challenge.', {})
|
|
282
|
-
|
|
283
|
-
const serializedTransaction = payload.signature as Transaction.TransactionSerializedTempo
|
|
284
|
-
if (!FeePayer.isTempoTransaction(serializedTransaction))
|
|
285
|
-
throw new MismatchError('Only Tempo (0x76/0x78) transactions are supported.', {})
|
|
286
|
-
|
|
287
|
-
const transaction = Transaction.deserialize(serializedTransaction)
|
|
288
|
-
if (!transaction.signature || !transaction.from)
|
|
289
|
-
throw new MismatchError(
|
|
290
|
-
'Transaction must be signed by the sender before fee payer co-signing.',
|
|
291
|
-
{},
|
|
292
|
-
)
|
|
293
|
-
|
|
294
|
-
const isFeePayerTx =
|
|
295
|
-
methodDetails?.feePayer === true &&
|
|
296
|
-
requestAllowsFeePayer &&
|
|
297
|
-
!!(typeof request.feePayer === 'object' ? request.feePayer : feePayer || feePayerUrl)
|
|
298
|
-
const transfers = getExpectedTransfers({ amount, memo, methodDetails, recipient })
|
|
299
|
-
const matchedCalls = assertTransferCalls(transaction.calls ?? [], {
|
|
300
|
-
currency,
|
|
301
|
-
exactCount: isFeePayerTx,
|
|
302
|
-
transfers,
|
|
303
|
-
})
|
|
304
|
-
if (!memo)
|
|
305
|
-
assertChallengeBoundCallMemo(matchedCalls, {
|
|
306
|
-
challengeId: challenge.id,
|
|
307
|
-
realm: challenge.realm,
|
|
308
|
-
})
|
|
309
|
-
|
|
310
|
-
if (isFeePayerTx) {
|
|
311
|
-
FeePayer.validateCalls(
|
|
312
|
-
transaction.calls,
|
|
313
|
-
{ amount, currency, recipient },
|
|
314
|
-
{ currency, expectedTransfers: transfers },
|
|
315
|
-
)
|
|
316
|
-
FeePayer.assertAllowedFeeToken(transaction, FeePayer.defaultAllowedFeeTokens(chainId))
|
|
317
|
-
} else {
|
|
318
|
-
await viem_call(
|
|
319
|
-
client,
|
|
320
|
-
FeePayer.simulationTransaction(transaction, { feePayer: false }) as never,
|
|
321
|
-
)
|
|
322
|
-
}
|
|
323
|
-
|
|
324
|
-
return { isFeePayerTx, serializedTransaction, transaction, transfers }
|
|
325
|
-
}
|
|
326
|
-
|
|
327
|
-
async function validateCredential(
|
|
328
|
-
credential: Credential,
|
|
329
|
-
request: Method.VerifyContext<typeof Methods.charge>['request'],
|
|
330
|
-
context: CredentialContext,
|
|
331
|
-
) {
|
|
332
|
-
switch (context.payload.type) {
|
|
333
|
-
case 'hash': {
|
|
334
|
-
const { receipt, sender, transfers } = await validateHashCredential(
|
|
335
|
-
credential,
|
|
336
|
-
context.payload,
|
|
337
|
-
context,
|
|
338
|
-
)
|
|
339
|
-
return {
|
|
340
|
-
details: { mode: 'push' as const, sender, transfers },
|
|
341
|
-
hash: context.payload.hash as `0x${string}`,
|
|
342
|
-
receipt,
|
|
343
|
-
type: 'hash' as const,
|
|
344
|
-
}
|
|
345
|
-
}
|
|
346
|
-
|
|
347
|
-
case 'proof': {
|
|
348
|
-
const { sender } = await validateProofCredential(credential, context.payload, context)
|
|
349
|
-
return { details: { mode: 'proof' as const, sender }, type: 'proof' as const }
|
|
350
|
-
}
|
|
351
|
-
|
|
352
|
-
case 'transaction': {
|
|
353
|
-
const { isFeePayerTx, serializedTransaction, transaction, transfers } =
|
|
354
|
-
await validateTransactionCredential(credential, context.payload, request, context)
|
|
355
|
-
return {
|
|
356
|
-
details: {
|
|
357
|
-
mode: 'pull' as const,
|
|
358
|
-
sender: transaction.from as `0x${string}`,
|
|
359
|
-
serializedTransaction,
|
|
360
|
-
transfers,
|
|
361
|
-
},
|
|
362
|
-
isFeePayerTx,
|
|
363
|
-
serializedTransaction,
|
|
364
|
-
transaction,
|
|
365
|
-
transfers,
|
|
366
|
-
type: 'transaction' as const,
|
|
367
|
-
}
|
|
368
|
-
}
|
|
369
|
-
}
|
|
370
|
-
}
|
|
371
|
-
|
|
372
|
-
type Defaults = charge.DeriveDefaults<parameters>
|
|
373
|
-
const method = Method.toServer<typeof Methods.charge, Defaults>(Methods.charge, {
|
|
374
|
-
canOffer: parameters.canOffer,
|
|
375
|
-
onPaymentSuccess: parameters.onPaymentSuccess,
|
|
376
|
-
defaults: {
|
|
377
|
-
amount,
|
|
378
|
-
currency,
|
|
379
|
-
decimals,
|
|
380
|
-
description,
|
|
381
|
-
externalId,
|
|
382
|
-
memo,
|
|
383
|
-
recipient,
|
|
384
|
-
splits,
|
|
385
|
-
supportedModes,
|
|
386
|
-
} as unknown as Defaults,
|
|
387
|
-
|
|
388
|
-
stableBinding: chargeBinding,
|
|
389
|
-
|
|
390
|
-
html: html
|
|
391
|
-
? {
|
|
392
|
-
config: {},
|
|
393
|
-
content: htmlContent,
|
|
394
|
-
formatAmount: async (request: z.output<typeof Methods.charge.schema.request>) => {
|
|
395
|
-
try {
|
|
396
|
-
const chainId = request.methodDetails?.chainId
|
|
397
|
-
if (chainId === undefined) throw new Error('no chainId')
|
|
398
|
-
const client = await getClient({ chainId })
|
|
399
|
-
const metadata = await Actions.token.getMetadata(client, {
|
|
400
|
-
token: request.currency as `0x${string}`,
|
|
401
|
-
})
|
|
402
|
-
const symbol =
|
|
403
|
-
new Intl.NumberFormat('en', {
|
|
404
|
-
style: 'currency',
|
|
405
|
-
currency: metadata.currency,
|
|
406
|
-
currencyDisplay: 'narrowSymbol',
|
|
407
|
-
})
|
|
408
|
-
.formatToParts(0)
|
|
409
|
-
.find((p) => p.type === 'currency')?.value ?? metadata.currency
|
|
410
|
-
return `${symbol}${formatUnits(BigInt(request.amount), metadata.decimals)}`
|
|
411
|
-
} catch {
|
|
412
|
-
return `$${request.amount}`
|
|
413
|
-
}
|
|
414
|
-
},
|
|
415
|
-
text: typeof html === 'object' ? html.text : undefined,
|
|
416
|
-
theme: typeof html === 'object' ? html.theme : undefined,
|
|
417
|
-
}
|
|
418
|
-
: undefined,
|
|
419
|
-
|
|
420
|
-
// TODO: dedupe `{charge,session}.request`
|
|
421
|
-
async request({ credential, request }) {
|
|
422
|
-
const chainId = await (async () => {
|
|
423
|
-
if (request.chainId) return request.chainId
|
|
424
|
-
if (parameters.testnet) return defaults.chainId.testnet
|
|
425
|
-
return (await getClient({})).chain?.id
|
|
426
|
-
})()
|
|
427
|
-
|
|
428
|
-
const client = await (async () => {
|
|
429
|
-
try {
|
|
430
|
-
return await getClient({ chainId })
|
|
431
|
-
} catch {
|
|
432
|
-
throw new Error(`No client configured with chainId ${chainId}.`)
|
|
433
|
-
}
|
|
434
|
-
})()
|
|
435
|
-
if (client.chain?.id !== chainId)
|
|
436
|
-
throw new Error(`Client not configured with chainId ${chainId}.`)
|
|
437
|
-
|
|
438
|
-
const resolvedFeePayer = (() => {
|
|
439
|
-
if (request.feePayer === false) return credential ? false : undefined
|
|
440
|
-
const account = typeof request.feePayer === 'object' ? request.feePayer : feePayer
|
|
441
|
-
const requested = account ?? feePayer ?? feePayerUrl
|
|
442
|
-
if (credential) return account ?? (feePayerUrl ? true : undefined)
|
|
443
|
-
if (requested) return true
|
|
444
|
-
return undefined
|
|
445
|
-
})()
|
|
446
|
-
|
|
447
|
-
return {
|
|
448
|
-
...request,
|
|
449
|
-
chainId,
|
|
450
|
-
feePayer: resolvedFeePayer,
|
|
451
|
-
memo: request.memo || undefined,
|
|
452
|
-
}
|
|
453
|
-
},
|
|
454
|
-
|
|
455
|
-
async validate({ credential, request }) {
|
|
456
|
-
const context = await resolveCredentialContext({ credential, request })
|
|
457
|
-
const validated = await validateCredential(credential, request, context)
|
|
458
|
-
|
|
459
|
-
return {
|
|
460
|
-
challenge: context.challenge,
|
|
461
|
-
credential,
|
|
462
|
-
details: validated.details,
|
|
463
|
-
intent: 'charge',
|
|
464
|
-
method: 'tempo',
|
|
465
|
-
request: context.resolvedRequest,
|
|
466
|
-
source: credential.source,
|
|
467
|
-
}
|
|
468
|
-
},
|
|
469
|
-
|
|
470
|
-
async broadcast({ credential, request }) {
|
|
471
|
-
const context = await resolveCredentialContext({ credential, request })
|
|
472
|
-
const {
|
|
473
|
-
amount,
|
|
474
|
-
chainId,
|
|
475
|
-
challenge,
|
|
476
|
-
client,
|
|
477
|
-
currency,
|
|
478
|
-
memo,
|
|
479
|
-
methodDetails,
|
|
480
|
-
recipient,
|
|
481
|
-
requestAllowsFeePayer,
|
|
482
|
-
} = context
|
|
483
|
-
const validated = await validateCredential(credential, request, context)
|
|
484
|
-
const feePayerAccount =
|
|
485
|
-
methodDetails?.feePayer === true && requestAllowsFeePayer
|
|
486
|
-
? typeof request.feePayer === 'object'
|
|
487
|
-
? request.feePayer
|
|
488
|
-
: feePayer
|
|
489
|
-
: undefined
|
|
490
|
-
const expires = challenge.expires
|
|
491
|
-
Expires.assert(expires, challenge.id)
|
|
492
|
-
const replayExpires = Date.parse(expires)
|
|
493
|
-
|
|
494
|
-
switch (validated.type) {
|
|
495
|
-
case 'hash': {
|
|
496
|
-
const { hash, receipt } = validated
|
|
497
|
-
if (!(await tryClaimHash(store, hash, replayExpires))) {
|
|
498
|
-
throw new VerificationFailedError({
|
|
499
|
-
reason: 'Transaction hash has already been used',
|
|
500
|
-
})
|
|
501
|
-
}
|
|
502
|
-
return receipt
|
|
503
|
-
}
|
|
504
|
-
|
|
505
|
-
case 'proof': {
|
|
506
|
-
if (proofStore && !(await tryClaimProof(proofStore, challenge.id, replayExpires))) {
|
|
507
|
-
throw new VerificationFailedError({
|
|
508
|
-
reason: 'Proof credential has already been used',
|
|
509
|
-
})
|
|
510
|
-
}
|
|
511
|
-
|
|
512
|
-
return {
|
|
513
|
-
method: 'tempo',
|
|
514
|
-
status: 'success',
|
|
515
|
-
timestamp: new Date().toISOString(),
|
|
516
|
-
reference: challenge.id,
|
|
517
|
-
} as const
|
|
518
|
-
}
|
|
519
|
-
|
|
520
|
-
case 'transaction': {
|
|
521
|
-
const { isFeePayerTx, serializedTransaction, transaction, transfers } = validated
|
|
522
|
-
|
|
523
|
-
// Pre-broadcast dedup: catch exact byte-for-byte replays early.
|
|
524
|
-
const hash = keccak256(serializedTransaction)
|
|
525
|
-
if (!(await tryClaimHash(store, hash, replayExpires))) {
|
|
526
|
-
throw new VerificationFailedError({
|
|
527
|
-
reason: 'Transaction hash has already been used',
|
|
528
|
-
})
|
|
529
|
-
}
|
|
530
|
-
|
|
531
|
-
let broadcastAttempted = false
|
|
532
|
-
let finalHash: `0x${string}` | undefined
|
|
533
|
-
let reservation: SponsorBudget.Handle | undefined
|
|
534
|
-
|
|
535
|
-
try {
|
|
536
|
-
const allowedFeeTokens = FeePayer.defaultAllowedFeeTokens(chainId)
|
|
537
|
-
if (isFeePayerTx) FeePayer.assertAllowedFeeToken(transaction, allowedFeeTokens)
|
|
538
|
-
const selectableFeeTokens = allowedFeeTokens as readonly `0x${string}`[]
|
|
539
|
-
|
|
540
|
-
const completedTransaction = await (async () => {
|
|
541
|
-
if (feePayerAccount && methodDetails?.feePayer !== false) {
|
|
542
|
-
const completed = await FeePayer.preflightSponsorship({
|
|
543
|
-
transaction,
|
|
544
|
-
simulate: (request) => viem_call(client, request as never),
|
|
545
|
-
async complete() {
|
|
546
|
-
const feeToken =
|
|
547
|
-
configuredFeeToken ??
|
|
548
|
-
(await resolveFeeToken({
|
|
549
|
-
account: feePayerAccount.address,
|
|
550
|
-
allowedTokens: selectableFeeTokens,
|
|
551
|
-
candidateTokens: selectableFeeTokens,
|
|
552
|
-
client,
|
|
553
|
-
prioritizeCandidates: true,
|
|
554
|
-
}))
|
|
555
|
-
const sponsored = FeePayer.prepareSponsoredTransaction({
|
|
556
|
-
account: feePayerAccount,
|
|
557
|
-
allowedFeeTokens,
|
|
558
|
-
challengeExpires: expires,
|
|
559
|
-
chainId: chainId ?? client.chain!.id,
|
|
560
|
-
details: { amount, currency, recipient },
|
|
561
|
-
policy: transactionFeePayerPolicy,
|
|
562
|
-
transaction: {
|
|
563
|
-
...transaction,
|
|
564
|
-
...(feeToken ? { feeToken } : {}),
|
|
565
|
-
},
|
|
566
|
-
})
|
|
567
|
-
return { feePayer: feePayerAccount.address, transaction: sponsored }
|
|
568
|
-
},
|
|
569
|
-
})
|
|
570
|
-
return {
|
|
571
|
-
serializedTransaction: await signTransaction(
|
|
572
|
-
client,
|
|
573
|
-
completed.transaction as never,
|
|
574
|
-
),
|
|
575
|
-
sponsor: completed.feePayer,
|
|
576
|
-
}
|
|
577
|
-
}
|
|
578
|
-
if (feePayerUrl && isFeePayerTx) {
|
|
579
|
-
const completed = await FeePayer.preflightSponsorship({
|
|
580
|
-
transaction,
|
|
581
|
-
simulate: (request) => viem_call(client, request as never),
|
|
582
|
-
async complete() {
|
|
583
|
-
const hosted = await FeePayer.fillHostedFeePayerTransaction({
|
|
584
|
-
allowedFeeTokens,
|
|
585
|
-
challengeExpires: expires,
|
|
586
|
-
chainId: chainId ?? client.chain!.id,
|
|
587
|
-
details: { amount, currency, recipient },
|
|
588
|
-
policy: transactionFeePayerPolicy,
|
|
589
|
-
transaction,
|
|
590
|
-
url: feePayerUrl,
|
|
591
|
-
})
|
|
592
|
-
return { ...hosted, transaction }
|
|
593
|
-
},
|
|
594
|
-
})
|
|
595
|
-
return {
|
|
596
|
-
serializedTransaction: completed.serializedTransaction,
|
|
597
|
-
sponsor: completed.feePayer,
|
|
598
|
-
}
|
|
599
|
-
}
|
|
600
|
-
return { serializedTransaction, sponsor: undefined }
|
|
601
|
-
})()
|
|
602
|
-
const serializedTransaction_final = completedTransaction.serializedTransaction
|
|
603
|
-
finalHash = keccak256(serializedTransaction_final)
|
|
604
|
-
|
|
605
|
-
if (
|
|
606
|
-
finalHash.toLowerCase() !== hash.toLowerCase() &&
|
|
607
|
-
!(await tryClaimHash(store, finalHash, replayExpires))
|
|
608
|
-
)
|
|
609
|
-
throw new VerificationFailedError({
|
|
610
|
-
reason: 'Transaction hash has already been used',
|
|
611
|
-
})
|
|
612
|
-
|
|
613
|
-
if (isFeePayerTx) {
|
|
614
|
-
const sponsor = completedTransaction.sponsor
|
|
615
|
-
if (!sponsor)
|
|
616
|
-
throw new VerificationFailedError({
|
|
617
|
-
reason: 'Sponsored transaction has no configured fee payer',
|
|
618
|
-
})
|
|
619
|
-
const reservationChainId = chainId ?? client.chain!.id
|
|
620
|
-
const { totalFee, validBeforeValue } = FeePayer.assertTransactionPolicy({
|
|
621
|
-
challengeExpires: expires,
|
|
622
|
-
chainId: reservationChainId,
|
|
623
|
-
details: { amount, currency, recipient },
|
|
624
|
-
policy: transactionFeePayerPolicy,
|
|
625
|
-
transaction,
|
|
626
|
-
})
|
|
627
|
-
const expiresAt = validBeforeValue * 1_000
|
|
628
|
-
const waitUntil = Math.min(
|
|
629
|
-
expiresAt,
|
|
630
|
-
expires ? Date.parse(expires) : Number.MAX_SAFE_INTEGER,
|
|
631
|
-
)
|
|
632
|
-
if (sponsorBudgetStore)
|
|
633
|
-
reservation = await SponsorBudget.reserve(sponsorBudgetStore, {
|
|
634
|
-
chainId: reservationChainId,
|
|
635
|
-
expiresAt,
|
|
636
|
-
fee: totalFee,
|
|
637
|
-
getReceipt: (transactionHash) =>
|
|
638
|
-
getTransactionReceipt(client, { hash: transactionHash }),
|
|
639
|
-
id: finalHash.toLowerCase(),
|
|
640
|
-
maxReservations: maxInFlightReservations,
|
|
641
|
-
maxTotalFee: maxInFlightTotalFee,
|
|
642
|
-
owner: globalThis.crypto.randomUUID(),
|
|
643
|
-
sponsor,
|
|
644
|
-
transactionHash: finalHash,
|
|
645
|
-
waitUntil,
|
|
646
|
-
})
|
|
647
|
-
Expires.assert(challenge.expires, challenge.id)
|
|
648
|
-
}
|
|
649
|
-
|
|
650
|
-
// Pre-broadcast simulation for non-sponsored transactions.
|
|
651
|
-
if (!isFeePayerTx)
|
|
652
|
-
await viem_call(
|
|
653
|
-
client,
|
|
654
|
-
FeePayer.simulationTransaction(transaction, { feePayer: false }) as never,
|
|
655
|
-
)
|
|
656
|
-
|
|
657
|
-
if (
|
|
658
|
-
reservation &&
|
|
659
|
-
!(await SponsorBudget.transition(sponsorBudgetStore!, reservation, 'broadcasting'))
|
|
660
|
-
)
|
|
661
|
-
throw new VerificationFailedError({
|
|
662
|
-
reason: 'Sponsor budget reservation ownership was lost before broadcast',
|
|
663
|
-
})
|
|
664
|
-
|
|
665
|
-
broadcastAttempted = true
|
|
666
|
-
if (waitForConfirmation) {
|
|
667
|
-
const receipt = await sendRawTransactionSync(client, {
|
|
668
|
-
serializedTransaction: serializedTransaction_final,
|
|
669
|
-
})
|
|
670
|
-
if (reservation) await SponsorBudget.release(sponsorBudgetStore!, reservation)
|
|
671
|
-
const matchedLogs = await assertTransferLogs(receipt, {
|
|
672
|
-
currency,
|
|
673
|
-
sender: transaction.from! as `0x${string}`,
|
|
674
|
-
transfers,
|
|
675
|
-
})
|
|
676
|
-
if (!memo)
|
|
677
|
-
assertChallengeBoundMemo(matchedLogs, {
|
|
678
|
-
challengeId: challenge.id,
|
|
679
|
-
realm: challenge.realm,
|
|
680
|
-
})
|
|
681
|
-
if (receipt.transactionHash.toLowerCase() !== finalHash.toLowerCase())
|
|
682
|
-
throw new VerificationFailedError({
|
|
683
|
-
reason: 'Broadcast transaction hash does not match the signed transaction',
|
|
684
|
-
})
|
|
685
|
-
return toReceipt(receipt)
|
|
686
|
-
}
|
|
687
|
-
|
|
688
|
-
// Optimistic path: broadcast without waiting for confirmation
|
|
689
|
-
// (simulation above already ran). The returned receipt assumes
|
|
690
|
-
// success — callers opt in via waitForConfirmation: false.
|
|
691
|
-
const reference = await sendRawTransaction(client, {
|
|
692
|
-
serializedTransaction: serializedTransaction_final,
|
|
693
|
-
})
|
|
694
|
-
if (reference.toLowerCase() !== finalHash.toLowerCase())
|
|
695
|
-
throw new VerificationFailedError({
|
|
696
|
-
reason: 'Broadcast transaction hash does not match the signed transaction',
|
|
697
|
-
})
|
|
698
|
-
if (
|
|
699
|
-
reservation &&
|
|
700
|
-
!(await SponsorBudget.transition(sponsorBudgetStore!, reservation, 'pending'))
|
|
701
|
-
)
|
|
702
|
-
throw new VerificationFailedError({
|
|
703
|
-
reason: 'Sponsor budget reservation ownership was lost after broadcast',
|
|
704
|
-
})
|
|
705
|
-
return {
|
|
706
|
-
method: 'tempo',
|
|
707
|
-
status: 'success',
|
|
708
|
-
timestamp: new Date().toISOString(),
|
|
709
|
-
reference,
|
|
710
|
-
} as const
|
|
711
|
-
} catch (error) {
|
|
712
|
-
if (!broadcastAttempted) {
|
|
713
|
-
if (reservation) await SponsorBudget.release(sponsorBudgetStore!, reservation)
|
|
714
|
-
if (finalHash && finalHash.toLowerCase() !== hash.toLowerCase())
|
|
715
|
-
await releaseHashUse(store, finalHash)
|
|
716
|
-
await releaseHashUse(store, hash)
|
|
717
|
-
}
|
|
718
|
-
throw error
|
|
719
|
-
}
|
|
720
|
-
}
|
|
721
|
-
}
|
|
722
|
-
},
|
|
723
|
-
})
|
|
724
|
-
return relay ? (Relay.configure(method, relay) as typeof method) : method
|
|
725
|
-
}
|
|
726
|
-
|
|
727
|
-
export declare namespace charge {
|
|
728
|
-
type StoreItemMap = {
|
|
729
|
-
[key: `mppx:charge:${string}`]: number | SponsorBudget.State | Store.ReplayMarker
|
|
730
|
-
}
|
|
731
|
-
|
|
732
|
-
type Defaults = LooseOmit<Method.RequestDefaults<typeof Methods.charge>, 'feePayer' | 'recipient'>
|
|
733
|
-
|
|
734
|
-
type ValidateSender = (parameters: ValidateSenderParameters) => boolean | Promise<boolean>
|
|
735
|
-
|
|
736
|
-
type ValidationDetails = {
|
|
737
|
-
mode: 'proof' | 'pull' | 'push'
|
|
738
|
-
sender?: `0x${string}` | undefined
|
|
739
|
-
serializedTransaction?: Transaction.TransactionSerializedTempo | undefined
|
|
740
|
-
transfers?: readonly ExpectedTransfer[] | undefined
|
|
741
|
-
}
|
|
742
|
-
|
|
743
|
-
type ValidateSenderParameters = {
|
|
744
|
-
/** Actual TIP-20 `Transfer.from` address. */
|
|
745
|
-
sender: `0x${string}`
|
|
746
|
-
/** Address that mppx would normally require as the sender. */
|
|
747
|
-
expectedSender: `0x${string}`
|
|
748
|
-
/** Parsed hash credential source when the credential includes one. */
|
|
749
|
-
source?: { address: `0x${string}`; chainId: number } | undefined
|
|
750
|
-
}
|
|
751
|
-
|
|
752
|
-
type Parameters = {
|
|
753
|
-
/** Render payment page when Accept header is text/html (e.g. in browsers) */
|
|
754
|
-
html?: boolean | Html.Config | undefined
|
|
755
|
-
/**
|
|
756
|
-
* Override the fee-sponsor policy used when co-signing Tempo charge
|
|
757
|
-
* transactions. Defaults resolve per chain, including a higher
|
|
758
|
-
* priority-fee ceiling on Moderato. Aggregate in-flight exposure is
|
|
759
|
-
* configured separately with `sponsorBudget`.
|
|
760
|
-
*/
|
|
761
|
-
feePayerPolicy?: FeePayerPolicy | undefined
|
|
762
|
-
/**
|
|
763
|
-
* Token a local fee payer uses to pay gas. If omitted, mppx selects a
|
|
764
|
-
* funded allowed token, preferring pathUSD.
|
|
765
|
-
*
|
|
766
|
-
* This option is not supported with a remote fee-payer URL, which selects
|
|
767
|
-
* its own token.
|
|
768
|
-
*/
|
|
769
|
-
feeToken?: `0x${string}` | undefined
|
|
770
|
-
/** Testnet mode. */
|
|
771
|
-
testnet?: boolean | undefined
|
|
772
|
-
/**
|
|
773
|
-
* Store for charge replay protection.
|
|
774
|
-
*
|
|
775
|
-
* Non-zero charge flows default to an in-memory store if omitted. For
|
|
776
|
-
* zero-dollar proof auth, replay prevention is enabled only when a store
|
|
777
|
-
* is explicitly provided; otherwise proofs remain reusable until the
|
|
778
|
-
* challenge expires.
|
|
779
|
-
*
|
|
780
|
-
* Replay protection requires a {@link Store.AtomicStore} so replay markers
|
|
781
|
-
* can be written atomically.
|
|
782
|
-
*
|
|
783
|
-
* Use a shared store in multi-instance deployments so consumed hashes and
|
|
784
|
-
* proofs are visible across all server instances.
|
|
785
|
-
*/
|
|
786
|
-
store?: Store.AtomicStore | undefined
|
|
787
|
-
/**
|
|
788
|
-
* Validates a TIP-20 transfer sender when it differs from the credential
|
|
789
|
-
* source. Core verification still validates amount, currency, recipient,
|
|
790
|
-
* memo binding, transaction success, and replay protection.
|
|
791
|
-
*/
|
|
792
|
-
validateSender?: ValidateSender | undefined
|
|
793
|
-
/**
|
|
794
|
-
* Prefix prepended to charge replay-protection store keys.
|
|
795
|
-
*
|
|
796
|
-
* By default, no prefix is applied.
|
|
797
|
-
*/
|
|
798
|
-
storeKeyPrefix?: string | undefined
|
|
799
|
-
/**
|
|
800
|
-
* Delegates Tempo charge credential validation and broadcast to Tempo API
|
|
801
|
-
* or a compatible MPP relay.
|
|
802
|
-
*
|
|
803
|
-
* The adapter delegates finalization to the relay for both modes. The
|
|
804
|
-
* relay broadcasts pull credentials, while it recognizes a push
|
|
805
|
-
* credential as already broadcast and returns its receipt without sending
|
|
806
|
-
* it again.
|
|
807
|
-
*/
|
|
808
|
-
relay?: RelayOptions | undefined
|
|
809
|
-
/**
|
|
810
|
-
* Configures aggregate in-flight fee exposure for sponsored transactions.
|
|
811
|
-
*
|
|
812
|
-
* Set to `false` only when aggregate exposure is enforced outside mppx.
|
|
813
|
-
* The configured store must be shared by every process using the sponsor.
|
|
814
|
-
* @default `{}`
|
|
815
|
-
*/
|
|
816
|
-
sponsorBudget?: SponsorBudgetConfig | false | undefined
|
|
817
|
-
/**
|
|
818
|
-
* Whether to wait for the charge transaction to confirm on-chain before
|
|
819
|
-
* responding. @default true
|
|
820
|
-
*
|
|
821
|
-
* When `false`, the transaction is simulated via `eth_estimateGas` and
|
|
822
|
-
* broadcast without waiting for inclusion. The receipt will optimistically
|
|
823
|
-
* report `status: 'success'` based on simulation alone — if the
|
|
824
|
-
* transaction reverts on-chain after broadcast (e.g. due to a state
|
|
825
|
-
* change between simulation and inclusion), the receipt will not reflect
|
|
826
|
-
* the failure.
|
|
827
|
-
*/
|
|
828
|
-
waitForConfirmation?: boolean | undefined
|
|
829
|
-
} & Client.getResolver.Parameters &
|
|
830
|
-
Account.resolve.Parameters &
|
|
831
|
-
Defaults &
|
|
832
|
-
Method.ComposableHooks<typeof Methods.charge>
|
|
833
|
-
|
|
834
|
-
type DeriveDefaults<parameters extends Parameters> = types.DeriveDefaults<
|
|
835
|
-
parameters,
|
|
836
|
-
Defaults,
|
|
837
|
-
{
|
|
838
|
-
currency: string
|
|
839
|
-
decimals: number
|
|
840
|
-
}
|
|
841
|
-
>
|
|
842
|
-
|
|
843
|
-
type FeePayerPolicy = Partial<FeePayer.Policy> & {
|
|
844
|
-
/**
|
|
845
|
-
* Maximum number of sponsored transactions awaiting a terminal receipt.
|
|
846
|
-
* @deprecated Use `sponsorBudget.maxInFlightReservations`.
|
|
847
|
-
*/
|
|
848
|
-
maxInFlightReservations?: number | undefined
|
|
849
|
-
/**
|
|
850
|
-
* Maximum aggregate declared fee exposure awaiting terminal receipts.
|
|
851
|
-
*
|
|
852
|
-
* @deprecated Use `sponsorBudget.maxInFlightTotalFee`.
|
|
853
|
-
*/
|
|
854
|
-
maxInFlightTotalFee?: bigint | undefined
|
|
855
|
-
}
|
|
856
|
-
|
|
857
|
-
type SponsorBudgetConfig = {
|
|
858
|
-
/** Maximum number of sponsored transactions awaiting a terminal receipt. @default 100 */
|
|
859
|
-
maxInFlightReservations?: number | undefined
|
|
860
|
-
/** Maximum aggregate declared fee exposure. @default `feePayerPolicy.maxTotalFee * 10` */
|
|
861
|
-
maxInFlightTotalFee?: bigint | undefined
|
|
862
|
-
/** Atomic store shared by every process using the sponsor. Defaults to `store`. */
|
|
863
|
-
store?: Store.AtomicStore | undefined
|
|
864
|
-
}
|
|
865
|
-
|
|
866
|
-
/** Tempo API relay configuration for server-side charges. */
|
|
867
|
-
type RelayOptions = Relay.configure.Options
|
|
868
|
-
}
|
|
869
|
-
|
|
870
|
-
type ChargeRequest = z.output<typeof Methods.charge.schema.request>
|
|
871
|
-
|
|
872
|
-
function chargeBinding(request: ChargeRequest) {
|
|
873
|
-
// Exhaustively destructure so new charge request fields require an explicit binding decision.
|
|
874
|
-
const { amount, currency, description, externalId, methodDetails, recipient, ...requestRest } =
|
|
875
|
-
request
|
|
876
|
-
requestRest satisfies Record<string, never>
|
|
877
|
-
|
|
878
|
-
const { chainId, feePayer, memo, splits, supportedModes, ...methodDetailsRest } =
|
|
879
|
-
methodDetails ?? {}
|
|
880
|
-
methodDetailsRest satisfies Record<string, never>
|
|
881
|
-
void feePayer
|
|
882
|
-
|
|
883
|
-
return {
|
|
884
|
-
amount,
|
|
885
|
-
chainId,
|
|
886
|
-
currency,
|
|
887
|
-
description,
|
|
888
|
-
externalId,
|
|
889
|
-
memo,
|
|
890
|
-
recipient,
|
|
891
|
-
splits,
|
|
892
|
-
supportedModes,
|
|
893
|
-
}
|
|
894
|
-
}
|
|
895
|
-
|
|
896
|
-
type ExpectedTransfer = {
|
|
897
|
-
amount: string
|
|
898
|
-
allowAnyMemo?: boolean | undefined
|
|
899
|
-
memo?: `0x${string}` | undefined
|
|
900
|
-
recipient: `0x${string}`
|
|
901
|
-
}
|
|
902
|
-
|
|
903
|
-
function getExpectedTransfers(parameters: {
|
|
904
|
-
amount: string
|
|
905
|
-
memo: `0x${string}` | undefined
|
|
906
|
-
methodDetails: { splits?: readonly Charge_internal.Split[] | undefined } | undefined
|
|
907
|
-
recipient: `0x${string}`
|
|
908
|
-
}): ExpectedTransfer[] {
|
|
909
|
-
return Charge_internal.getTransfers({
|
|
910
|
-
amount: parameters.amount,
|
|
911
|
-
methodDetails: {
|
|
912
|
-
memo: parameters.memo,
|
|
913
|
-
splits: parameters.methodDetails?.splits,
|
|
914
|
-
},
|
|
915
|
-
recipient: parameters.recipient,
|
|
916
|
-
}).map((transfer) => ({
|
|
917
|
-
...transfer,
|
|
918
|
-
...(!transfer.memo ? { allowAnyMemo: true } : {}),
|
|
919
|
-
})) as ExpectedTransfer[]
|
|
920
|
-
}
|
|
921
|
-
|
|
922
|
-
function assertTransferCalls(
|
|
923
|
-
calls: readonly { data?: `0x${string}` | undefined; to?: `0x${string}` | undefined }[],
|
|
924
|
-
parameters: {
|
|
925
|
-
currency: `0x${string}`
|
|
926
|
-
exactCount?: boolean | undefined
|
|
927
|
-
transfers: readonly ExpectedTransfer[]
|
|
928
|
-
},
|
|
929
|
-
) {
|
|
930
|
-
const transferCalls = getTransferCalls(calls)
|
|
931
|
-
|
|
932
|
-
if (parameters.exactCount && transferCalls.length !== parameters.transfers.length)
|
|
933
|
-
throw new MismatchError('Invalid transaction: no matching payment call found', {
|
|
934
|
-
expectedCalls: String(parameters.transfers.length),
|
|
935
|
-
actualCalls: String(transferCalls.length),
|
|
936
|
-
})
|
|
937
|
-
|
|
938
|
-
// Match memo-specific transfers before wildcards to avoid greedy
|
|
939
|
-
// consumption of memo-bearing calls by allowAnyMemo entries.
|
|
940
|
-
const sorted = [...parameters.transfers].sort((a, b) => {
|
|
941
|
-
if (a.memo && !b.memo) return -1
|
|
942
|
-
if (!a.memo && b.memo) return 1
|
|
943
|
-
return 0
|
|
944
|
-
})
|
|
945
|
-
|
|
946
|
-
const used = new Set<number>()
|
|
947
|
-
const matched: Charge_internal.Transfer[] = []
|
|
948
|
-
for (const expected of sorted) {
|
|
949
|
-
const matchIndex = transferCalls.findIndex((call, index) => {
|
|
950
|
-
if (used.has(index)) return false
|
|
951
|
-
const decoded = decodeTransferCall(call, parameters.currency)
|
|
952
|
-
if (!decoded) return false
|
|
953
|
-
|
|
954
|
-
if (!TempoAddress.isEqual(decoded.recipient, expected.recipient)) return false
|
|
955
|
-
if (decoded.amount !== expected.amount) return false
|
|
956
|
-
if (expected.memo) {
|
|
957
|
-
return decoded.memo?.toLowerCase() === expected.memo.toLowerCase()
|
|
958
|
-
}
|
|
959
|
-
if (expected.allowAnyMemo) return true
|
|
960
|
-
return decoded.memo === undefined
|
|
961
|
-
})
|
|
962
|
-
|
|
963
|
-
if (matchIndex === -1) {
|
|
964
|
-
throw new MismatchError('Invalid transaction: no matching payment call found', {
|
|
965
|
-
amount: expected.amount,
|
|
966
|
-
currency: parameters.currency,
|
|
967
|
-
recipient: expected.recipient,
|
|
968
|
-
})
|
|
969
|
-
}
|
|
970
|
-
|
|
971
|
-
used.add(matchIndex)
|
|
972
|
-
matched.push(decodeTransferCall(transferCalls[matchIndex]!, parameters.currency)!)
|
|
973
|
-
}
|
|
974
|
-
|
|
975
|
-
return matched
|
|
976
|
-
}
|
|
977
|
-
|
|
978
|
-
function getTransferCalls(
|
|
979
|
-
calls: readonly { data?: `0x${string}` | undefined; to?: `0x${string}` | undefined }[],
|
|
980
|
-
) {
|
|
981
|
-
const selectors = calls.map((call) => call.data?.slice(0, 10))
|
|
982
|
-
const offset =
|
|
983
|
-
selectors[0] === Selectors.approve && selectors[1] === Selectors.swapExactAmountOut ? 2 : 0
|
|
984
|
-
const transferCalls = calls.slice(offset)
|
|
985
|
-
|
|
986
|
-
if (
|
|
987
|
-
transferCalls.length === 0 ||
|
|
988
|
-
selectors
|
|
989
|
-
.slice(offset)
|
|
990
|
-
.some(
|
|
991
|
-
(selector) => selector !== Selectors.transfer && selector !== Selectors.transferWithMemo,
|
|
992
|
-
)
|
|
993
|
-
) {
|
|
994
|
-
throw new MismatchError('Invalid transaction: no matching payment call found', {})
|
|
995
|
-
}
|
|
996
|
-
|
|
997
|
-
return transferCalls
|
|
998
|
-
}
|
|
999
|
-
|
|
1000
|
-
function decodeTransferCall(
|
|
1001
|
-
call: { data?: `0x${string}` | undefined; to?: `0x${string}` | undefined },
|
|
1002
|
-
currency: `0x${string}`,
|
|
1003
|
-
) {
|
|
1004
|
-
if (!call.to || !TempoAddress.isEqual(call.to, currency) || !call.data) return null
|
|
1005
|
-
|
|
1006
|
-
try {
|
|
1007
|
-
const selector = call.data.slice(0, 10)
|
|
1008
|
-
if (selector === Selectors.transfer) {
|
|
1009
|
-
const { args } = decodeFunctionData({ abi: Abis.tip20, data: call.data })
|
|
1010
|
-
const [recipient, amount] = args as [`0x${string}`, bigint]
|
|
1011
|
-
return { amount: amount.toString(), recipient }
|
|
1012
|
-
}
|
|
1013
|
-
|
|
1014
|
-
if (selector === Selectors.transferWithMemo) {
|
|
1015
|
-
const { args } = decodeFunctionData({ abi: Abis.tip20, data: call.data })
|
|
1016
|
-
const [recipient, amount, memo] = args as [`0x${string}`, bigint, `0x${string}`]
|
|
1017
|
-
return { amount: amount.toString(), memo, recipient }
|
|
1018
|
-
}
|
|
1019
|
-
} catch {
|
|
1020
|
-
return null
|
|
1021
|
-
}
|
|
1022
|
-
|
|
1023
|
-
return null
|
|
1024
|
-
}
|
|
1025
|
-
|
|
1026
|
-
type TransferLog =
|
|
1027
|
-
| {
|
|
1028
|
-
kind: 'transfer'
|
|
1029
|
-
args: { from: `0x${string}`; to: `0x${string}`; amount: bigint }
|
|
1030
|
-
address: `0x${string}`
|
|
1031
|
-
}
|
|
1032
|
-
| {
|
|
1033
|
-
kind: 'memo'
|
|
1034
|
-
args: { from: `0x${string}`; to: `0x${string}`; amount: bigint; memo: `0x${string}` }
|
|
1035
|
-
address: `0x${string}`
|
|
1036
|
-
}
|
|
1037
|
-
|
|
1038
|
-
async function assertTransferLogs(
|
|
1039
|
-
receipt: TransactionReceipt,
|
|
1040
|
-
parameters: {
|
|
1041
|
-
currency: `0x${string}`
|
|
1042
|
-
sender: `0x${string}`
|
|
1043
|
-
source?: { address: `0x${string}`; chainId: number } | undefined
|
|
1044
|
-
transfers: readonly ExpectedTransfer[]
|
|
1045
|
-
validateSender?: charge.ValidateSender | undefined
|
|
1046
|
-
},
|
|
1047
|
-
): Promise<TransferLog[]> {
|
|
1048
|
-
const logs = getTransferLogEffects(receipt)
|
|
1049
|
-
const used = new Set<number>()
|
|
1050
|
-
const matched: TransferLog[] = []
|
|
1051
|
-
|
|
1052
|
-
// Match memo-specific transfers before wildcards to avoid greedy
|
|
1053
|
-
// consumption of memo-bearing logs by allowAnyMemo entries.
|
|
1054
|
-
const sorted = [...parameters.transfers].sort((a, b) => {
|
|
1055
|
-
if (a.memo && !b.memo) return -1
|
|
1056
|
-
if (!a.memo && b.memo) return 1
|
|
1057
|
-
return 0
|
|
1058
|
-
})
|
|
1059
|
-
|
|
1060
|
-
for (const transfer of sorted) {
|
|
1061
|
-
let matchIndex = -1
|
|
1062
|
-
for (const [index, log] of logs.entries()) {
|
|
1063
|
-
if (used.has(index)) continue
|
|
1064
|
-
if (!TempoAddress.isEqual(log.address, parameters.currency)) continue
|
|
1065
|
-
if (!TempoAddress.isEqual(log.args.to, transfer.recipient)) continue
|
|
1066
|
-
if (log.args.amount.toString() !== transfer.amount) continue
|
|
1067
|
-
const memoMatches = (() => {
|
|
1068
|
-
if (transfer.memo)
|
|
1069
|
-
return log.kind === 'memo' && log.args.memo.toLowerCase() === transfer.memo.toLowerCase()
|
|
1070
|
-
if (transfer.allowAnyMemo) return log.kind === 'transfer' || log.kind === 'memo'
|
|
1071
|
-
return log.kind === 'transfer'
|
|
1072
|
-
})()
|
|
1073
|
-
if (!memoMatches) continue
|
|
1074
|
-
if (
|
|
1075
|
-
!(await isValidTransferSender({
|
|
1076
|
-
expectedSender: parameters.sender,
|
|
1077
|
-
sender: log.args.from,
|
|
1078
|
-
source: parameters.source,
|
|
1079
|
-
validateSender: parameters.validateSender,
|
|
1080
|
-
}))
|
|
1081
|
-
)
|
|
1082
|
-
continue
|
|
1083
|
-
matchIndex = index
|
|
1084
|
-
break
|
|
1085
|
-
}
|
|
1086
|
-
|
|
1087
|
-
if (matchIndex === -1) {
|
|
1088
|
-
throw new MismatchError('Payment verification failed: no matching transfer found.', {
|
|
1089
|
-
amount: transfer.amount,
|
|
1090
|
-
currency: parameters.currency,
|
|
1091
|
-
recipient: transfer.recipient,
|
|
1092
|
-
})
|
|
1093
|
-
}
|
|
1094
|
-
|
|
1095
|
-
used.add(matchIndex)
|
|
1096
|
-
matched.push(logs[matchIndex]! as TransferLog)
|
|
1097
|
-
}
|
|
1098
|
-
|
|
1099
|
-
return matched
|
|
1100
|
-
}
|
|
1101
|
-
|
|
1102
|
-
type ParsedTransferLog =
|
|
1103
|
-
| {
|
|
1104
|
-
kind: 'transfer'
|
|
1105
|
-
args: { from: `0x${string}`; to: `0x${string}`; amount: bigint }
|
|
1106
|
-
address: `0x${string}`
|
|
1107
|
-
logIndex: number
|
|
1108
|
-
}
|
|
1109
|
-
| {
|
|
1110
|
-
kind: 'memo'
|
|
1111
|
-
args: { from: `0x${string}`; to: `0x${string}`; amount: bigint; memo: `0x${string}` }
|
|
1112
|
-
address: `0x${string}`
|
|
1113
|
-
logIndex: number
|
|
1114
|
-
}
|
|
1115
|
-
|
|
1116
|
-
function getTransferLogEffects(receipt: TransactionReceipt): TransferLog[] {
|
|
1117
|
-
const transferLogs = parseEventLogs({
|
|
1118
|
-
abi: Abis.tip20,
|
|
1119
|
-
eventName: 'Transfer',
|
|
1120
|
-
logs: receipt.logs,
|
|
1121
|
-
}).map(
|
|
1122
|
-
(log) =>
|
|
1123
|
-
({
|
|
1124
|
-
address: log.address,
|
|
1125
|
-
args: log.args,
|
|
1126
|
-
kind: 'transfer',
|
|
1127
|
-
logIndex: log.logIndex,
|
|
1128
|
-
}) as ParsedTransferLog,
|
|
1129
|
-
)
|
|
1130
|
-
|
|
1131
|
-
const memoLogs = parseEventLogs({
|
|
1132
|
-
abi: Abis.tip20,
|
|
1133
|
-
eventName: 'TransferWithMemo',
|
|
1134
|
-
logs: receipt.logs,
|
|
1135
|
-
}).map(
|
|
1136
|
-
(log) =>
|
|
1137
|
-
({
|
|
1138
|
-
address: log.address,
|
|
1139
|
-
args: log.args,
|
|
1140
|
-
kind: 'memo',
|
|
1141
|
-
logIndex: log.logIndex,
|
|
1142
|
-
}) as ParsedTransferLog,
|
|
1143
|
-
)
|
|
1144
|
-
|
|
1145
|
-
const logs = [...transferLogs, ...memoLogs].sort((a, b) => a.logIndex - b.logIndex)
|
|
1146
|
-
const effects: TransferLog[] = []
|
|
1147
|
-
|
|
1148
|
-
for (let index = 0; index < logs.length; index++) {
|
|
1149
|
-
const log = logs[index]!
|
|
1150
|
-
const next = logs[index + 1]
|
|
1151
|
-
if (next && log.kind !== next.kind && isSameTransferLog(log, next)) {
|
|
1152
|
-
const memoLog = log.kind === 'memo' ? log : next.kind === 'memo' ? next : undefined
|
|
1153
|
-
if (!memoLog) continue
|
|
1154
|
-
effects.push({
|
|
1155
|
-
address: memoLog.address,
|
|
1156
|
-
args: memoLog.args,
|
|
1157
|
-
kind: 'memo',
|
|
1158
|
-
})
|
|
1159
|
-
index++
|
|
1160
|
-
continue
|
|
1161
|
-
}
|
|
1162
|
-
|
|
1163
|
-
effects.push({
|
|
1164
|
-
address: log.address,
|
|
1165
|
-
args: log.args,
|
|
1166
|
-
kind: log.kind,
|
|
1167
|
-
} as TransferLog)
|
|
1168
|
-
}
|
|
1169
|
-
|
|
1170
|
-
return effects
|
|
1171
|
-
}
|
|
1172
|
-
|
|
1173
|
-
function isSameTransferLog(a: ParsedTransferLog, b: ParsedTransferLog): boolean {
|
|
1174
|
-
return (
|
|
1175
|
-
TempoAddress.isEqual(a.address, b.address) &&
|
|
1176
|
-
TempoAddress.isEqual(a.args.from, b.args.from) &&
|
|
1177
|
-
TempoAddress.isEqual(a.args.to, b.args.to) &&
|
|
1178
|
-
a.args.amount === b.args.amount &&
|
|
1179
|
-
Math.abs(a.logIndex - b.logIndex) === 1
|
|
1180
|
-
)
|
|
1181
|
-
}
|
|
1182
|
-
|
|
1183
|
-
async function isValidTransferSender(parameters: {
|
|
1184
|
-
expectedSender: `0x${string}`
|
|
1185
|
-
sender: `0x${string}`
|
|
1186
|
-
source?: { address: `0x${string}`; chainId: number } | undefined
|
|
1187
|
-
validateSender?: charge.ValidateSender | undefined
|
|
1188
|
-
}): Promise<boolean> {
|
|
1189
|
-
if (TempoAddress.isEqual(parameters.sender, parameters.expectedSender)) return true
|
|
1190
|
-
if (!parameters.validateSender) return false
|
|
1191
|
-
return parameters.validateSender({
|
|
1192
|
-
expectedSender: parameters.expectedSender,
|
|
1193
|
-
sender: parameters.sender,
|
|
1194
|
-
source: parameters.source,
|
|
1195
|
-
})
|
|
1196
|
-
}
|
|
1197
|
-
|
|
1198
|
-
/** @internal */
|
|
1199
|
-
function getHashStoreKey(hash: `0x${string}`): `mppx:charge:${string}` {
|
|
1200
|
-
return `mppx:charge:${hash.toLowerCase()}`
|
|
1201
|
-
}
|
|
1202
|
-
|
|
1203
|
-
/** @internal */
|
|
1204
|
-
function getProofStoreKey(challengeId: string): `mppx:charge:${string}` {
|
|
1205
|
-
return `mppx:charge:proof:${challengeId}`
|
|
1206
|
-
}
|
|
1207
|
-
|
|
1208
|
-
async function tryClaimHash(
|
|
1209
|
-
store: Store.AtomicStore<charge.StoreItemMap>,
|
|
1210
|
-
hash: `0x${string}`,
|
|
1211
|
-
expires: number,
|
|
1212
|
-
): Promise<boolean> {
|
|
1213
|
-
return Store.tryClaim(store, getHashStoreKey(hash), expires)
|
|
1214
|
-
}
|
|
1215
|
-
|
|
1216
|
-
/** @internal */
|
|
1217
|
-
async function releaseHashUse(
|
|
1218
|
-
store: Store.AtomicStore<charge.StoreItemMap>,
|
|
1219
|
-
hash: `0x${string}`,
|
|
1220
|
-
): Promise<void> {
|
|
1221
|
-
await store.delete(getHashStoreKey(hash))
|
|
1222
|
-
}
|
|
1223
|
-
|
|
1224
|
-
function parseHashCredentialSource(parameters: {
|
|
1225
|
-
chainId: number | undefined
|
|
1226
|
-
source: string | undefined
|
|
1227
|
-
}): { address: `0x${string}`; chainId: number } | undefined {
|
|
1228
|
-
const { chainId, source } = parameters
|
|
1229
|
-
if (!source) return undefined
|
|
1230
|
-
|
|
1231
|
-
const parsed = Proof.parsePkhSource(source)
|
|
1232
|
-
if (!parsed || (chainId !== undefined && parsed.chainId !== chainId)) {
|
|
1233
|
-
throw new MismatchError('Hash credential source is invalid.', {})
|
|
1234
|
-
}
|
|
1235
|
-
|
|
1236
|
-
return parsed
|
|
1237
|
-
}
|
|
1238
|
-
|
|
1239
|
-
/** @internal */
|
|
1240
|
-
async function tryClaimProof(
|
|
1241
|
-
store: Store.AtomicStore<charge.StoreItemMap>,
|
|
1242
|
-
challengeId: string,
|
|
1243
|
-
expires: number,
|
|
1244
|
-
): Promise<boolean> {
|
|
1245
|
-
return Store.tryClaim(store, getProofStoreKey(challengeId), expires)
|
|
1246
|
-
}
|
|
1247
|
-
|
|
1248
|
-
function recoverAuthorizedProofSigner(parameters: {
|
|
1249
|
-
chainId: number
|
|
1250
|
-
challengeId: string
|
|
1251
|
-
realm: string
|
|
1252
|
-
signature: `0x${string}`
|
|
1253
|
-
sourceAddress: `0x${string}`
|
|
1254
|
-
}): `0x${string}` | null {
|
|
1255
|
-
const { chainId, challengeId, realm, signature, sourceAddress } = parameters
|
|
1256
|
-
|
|
1257
|
-
try {
|
|
1258
|
-
const envelope = SignatureEnvelope.from(signature)
|
|
1259
|
-
const proofHash = Proof.hash({ account: sourceAddress, chainId, challengeId, realm })
|
|
1260
|
-
|
|
1261
|
-
if (envelope.type === 'keychain') {
|
|
1262
|
-
if (!TempoAddress.isEqual(envelope.userAddress, sourceAddress)) return null
|
|
1263
|
-
|
|
1264
|
-
const keychainPayload =
|
|
1265
|
-
envelope.version === 'v2'
|
|
1266
|
-
? keccak256(`0x04${proofHash.slice(2)}${sourceAddress.slice(2)}` as `0x${string}`)
|
|
1267
|
-
: proofHash
|
|
1268
|
-
|
|
1269
|
-
const signer = SignatureEnvelope.extractAddress({
|
|
1270
|
-
payload: keychainPayload,
|
|
1271
|
-
signature: envelope.inner,
|
|
1272
|
-
})
|
|
1273
|
-
const valid = SignatureEnvelope.verify(envelope.inner, {
|
|
1274
|
-
address: signer,
|
|
1275
|
-
payload: keychainPayload,
|
|
1276
|
-
})
|
|
1277
|
-
if (!valid) return null
|
|
1278
|
-
|
|
1279
|
-
return signer
|
|
1280
|
-
}
|
|
1281
|
-
|
|
1282
|
-
const signer = SignatureEnvelope.extractAddress({
|
|
1283
|
-
payload: proofHash,
|
|
1284
|
-
signature: envelope,
|
|
1285
|
-
})
|
|
1286
|
-
const valid = SignatureEnvelope.verify(envelope, {
|
|
1287
|
-
address: signer,
|
|
1288
|
-
payload: proofHash,
|
|
1289
|
-
})
|
|
1290
|
-
if (!valid) return null
|
|
1291
|
-
|
|
1292
|
-
return signer
|
|
1293
|
-
} catch {
|
|
1294
|
-
return null
|
|
1295
|
-
}
|
|
1296
|
-
}
|
|
1297
|
-
|
|
1298
|
-
async function isActiveAccessKey(
|
|
1299
|
-
client: Awaited<ReturnType<ReturnType<typeof Client.getResolver>>>,
|
|
1300
|
-
parameters: { account: `0x${string}`; accessKey: `0x${string}` },
|
|
1301
|
-
): Promise<boolean> {
|
|
1302
|
-
try {
|
|
1303
|
-
const metadata = await Actions.accessKey.getMetadata(client, parameters)
|
|
1304
|
-
const nowSeconds = BigInt(Math.floor(Date.now() / 1000))
|
|
1305
|
-
return !metadata.isRevoked && metadata.expiry > nowSeconds
|
|
1306
|
-
} catch {
|
|
1307
|
-
return false
|
|
1308
|
-
}
|
|
1309
|
-
}
|
|
1310
|
-
|
|
1311
|
-
/** @internal */
|
|
1312
|
-
function toReceipt(receipt: TransactionReceipt) {
|
|
1313
|
-
const { status, transactionHash } = receipt
|
|
1314
|
-
if (status !== 'success') {
|
|
1315
|
-
throw new Error(`Transaction reverted: ${transactionHash}`)
|
|
1316
|
-
}
|
|
1317
|
-
return {
|
|
1318
|
-
method: 'tempo',
|
|
1319
|
-
status: 'success',
|
|
1320
|
-
timestamp: new Date().toISOString(),
|
|
1321
|
-
reference: transactionHash,
|
|
1322
|
-
} as const
|
|
1323
|
-
}
|
|
1324
|
-
|
|
1325
|
-
/**
|
|
1326
|
-
* Asserts that at least one of the matched payment logs carries a
|
|
1327
|
-
* challenge-bound memo nonce (keccak256(challengeId)[0..6] in bytes 25–31).
|
|
1328
|
-
* Only checks logs that were matched by `assertTransferLogs`, not the
|
|
1329
|
-
* entire receipt — preventing unrelated dust transfers from satisfying
|
|
1330
|
-
* the binding.
|
|
1331
|
-
* @internal
|
|
1332
|
-
*/
|
|
1333
|
-
function assertChallengeBoundMemo(
|
|
1334
|
-
matchedLogs: readonly TransferLog[],
|
|
1335
|
-
parameters: { challengeId: string; realm: string },
|
|
1336
|
-
) {
|
|
1337
|
-
const bound = matchedLogs.some((log) => {
|
|
1338
|
-
if (log.kind !== 'memo') return false
|
|
1339
|
-
if (!Attribution.verifyServer(log.args.memo, parameters.realm)) return false
|
|
1340
|
-
return Attribution.verifyChallengeBinding(log.args.memo, parameters.challengeId)
|
|
1341
|
-
})
|
|
1342
|
-
|
|
1343
|
-
if (!bound)
|
|
1344
|
-
throw new MismatchError('Payment verification failed: memo is not bound to this challenge.', {})
|
|
1345
|
-
}
|
|
1346
|
-
|
|
1347
|
-
function assertChallengeBoundCallMemo(
|
|
1348
|
-
matchedCalls: readonly Charge_internal.Transfer[],
|
|
1349
|
-
parameters: { challengeId: string; realm: string },
|
|
1350
|
-
) {
|
|
1351
|
-
const bound = matchedCalls.some((call) => {
|
|
1352
|
-
if (!call.memo) return false
|
|
1353
|
-
const memo = call.memo as `0x${string}`
|
|
1354
|
-
if (!Attribution.verifyServer(memo, parameters.realm)) return false
|
|
1355
|
-
return Attribution.verifyChallengeBinding(memo, parameters.challengeId)
|
|
1356
|
-
})
|
|
1357
|
-
|
|
1358
|
-
if (!bound)
|
|
1359
|
-
throw new MismatchError('Payment verification failed: memo is not bound to this challenge.', {})
|
|
1360
|
-
}
|
|
1361
|
-
|
|
1362
|
-
/** @internal */
|
|
1363
|
-
class MismatchError extends PaymentError {
|
|
1364
|
-
override readonly name = 'MismatchError'
|
|
1365
|
-
readonly title = 'Verification Failed'
|
|
1366
|
-
readonly type = 'https://paymentauth.org/problems/verification-failed'
|
|
1367
|
-
|
|
1368
|
-
constructor(reason: string, details: Record<string, string>) {
|
|
1369
|
-
super(
|
|
1370
|
-
[
|
|
1371
|
-
reason.startsWith('Payment verification failed')
|
|
1372
|
-
? reason
|
|
1373
|
-
: `Payment verification failed: ${reason}`,
|
|
1374
|
-
...Object.entries(details).map(([k, v]) => ` - ${k}: ${v}`),
|
|
1375
|
-
].join('\n'),
|
|
1376
|
-
{ details },
|
|
1377
|
-
)
|
|
1378
|
-
}
|
|
1379
|
-
}
|