mppx 0.6.31 → 0.8.0
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 +50 -0
- package/README.md +20 -11
- package/dist/Challenge.d.ts.map +1 -1
- package/dist/Challenge.js +27 -13
- package/dist/Challenge.js.map +1 -1
- package/dist/Constants.d.ts +46 -0
- package/dist/Constants.d.ts.map +1 -0
- package/dist/Constants.js +46 -0
- package/dist/Constants.js.map +1 -0
- package/dist/Credential.d.ts.map +1 -1
- package/dist/Credential.js +5 -4
- package/dist/Credential.js.map +1 -1
- package/dist/Mcp.d.ts +3 -0
- package/dist/Mcp.d.ts.map +1 -1
- package/dist/Mcp.js +2 -0
- package/dist/Mcp.js.map +1 -1
- package/dist/Method.d.ts +32 -4
- package/dist/Method.d.ts.map +1 -1
- package/dist/Method.js +5 -2
- package/dist/Method.js.map +1 -1
- package/dist/PaymentRequest.d.ts +10 -10
- package/dist/PaymentRequest.js +8 -8
- package/dist/Receipt.d.ts.map +1 -1
- package/dist/Receipt.js +3 -2
- package/dist/Receipt.js.map +1 -1
- package/dist/cli/cli.d.ts.map +1 -1
- package/dist/cli/cli.js +19 -11
- package/dist/cli/cli.js.map +1 -1
- package/dist/cli/plugins/tempo.d.ts.map +1 -1
- package/dist/cli/plugins/tempo.js +17 -6
- package/dist/cli/plugins/tempo.js.map +1 -1
- package/dist/cli/utils.d.ts +5 -0
- package/dist/cli/utils.d.ts.map +1 -1
- package/dist/cli/utils.js +10 -0
- package/dist/cli/utils.js.map +1 -1
- package/dist/client/Methods.d.ts +5 -2
- package/dist/client/Methods.d.ts.map +1 -1
- package/dist/client/Methods.js +5 -2
- package/dist/client/Methods.js.map +1 -1
- package/dist/client/Mppx.js +2 -2
- package/dist/client/Mppx.js.map +1 -1
- package/dist/client/Transport.d.ts +11 -16
- package/dist/client/Transport.d.ts.map +1 -1
- package/dist/client/Transport.js +55 -76
- package/dist/client/Transport.js.map +1 -1
- package/dist/client/index.d.ts +5 -1
- package/dist/client/index.d.ts.map +1 -1
- package/dist/client/index.js +3 -1
- package/dist/client/index.js.map +1 -1
- package/dist/client/internal/Fetch.d.ts.map +1 -1
- package/dist/client/internal/Fetch.js +60 -13
- package/dist/client/internal/Fetch.js.map +1 -1
- package/dist/client/internal/protocols/Mcp.d.ts +7 -0
- package/dist/client/internal/protocols/Mcp.d.ts.map +1 -0
- package/dist/client/internal/protocols/Mcp.js +159 -0
- package/dist/client/internal/protocols/Mcp.js.map +1 -0
- package/dist/client/internal/protocols/Mpp.d.ts +4 -0
- package/dist/client/internal/protocols/Mpp.d.ts.map +1 -0
- package/dist/client/internal/protocols/Mpp.js +18 -0
- package/dist/client/internal/protocols/Mpp.js.map +1 -0
- package/dist/client/internal/protocols/Protocol.d.ts +10 -0
- package/dist/client/internal/protocols/Protocol.d.ts.map +1 -0
- package/dist/client/internal/protocols/Protocol.js +2 -0
- package/dist/client/internal/protocols/Protocol.js.map +1 -0
- package/dist/client/internal/protocols/Shared.d.ts +5 -0
- package/dist/client/internal/protocols/Shared.d.ts.map +1 -0
- package/dist/client/internal/protocols/Shared.js +20 -0
- package/dist/client/internal/protocols/Shared.js.map +1 -0
- package/dist/client/internal/protocols/X402.d.ts +8 -0
- package/dist/client/internal/protocols/X402.d.ts.map +1 -0
- package/dist/client/internal/protocols/X402.js +39 -0
- package/dist/client/internal/protocols/X402.js.map +1 -0
- package/dist/evm/client/index.d.ts +1 -0
- package/dist/evm/client/index.d.ts.map +1 -1
- package/dist/evm/client/index.js +1 -0
- package/dist/evm/client/index.js.map +1 -1
- package/dist/evm/index.d.ts +2 -0
- package/dist/evm/index.d.ts.map +1 -1
- package/dist/evm/index.js +2 -0
- package/dist/evm/index.js.map +1 -1
- package/dist/evm/server/Methods.d.ts +1 -1
- package/dist/evm/server/Methods.d.ts.map +1 -1
- package/dist/evm/server/index.d.ts +1 -0
- package/dist/evm/server/index.d.ts.map +1 -1
- package/dist/evm/server/index.js +1 -0
- package/dist/evm/server/index.js.map +1 -1
- package/dist/index.d.ts +1 -0
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +1 -0
- package/dist/index.js.map +1 -1
- package/dist/internal/AcceptPayment.d.ts +3 -0
- package/dist/internal/AcceptPayment.d.ts.map +1 -1
- package/dist/internal/AcceptPayment.js +15 -11
- package/dist/internal/AcceptPayment.js.map +1 -1
- package/dist/mcp/client/McpClient.d.ts +101 -0
- package/dist/mcp/client/McpClient.d.ts.map +1 -0
- package/dist/mcp/client/McpClient.js +162 -0
- package/dist/mcp/client/McpClient.js.map +1 -0
- package/dist/mcp/client/index.d.ts.map +1 -0
- package/dist/mcp/client/index.js.map +1 -0
- package/dist/mcp/server/Transport.d.ts.map +1 -0
- package/dist/mcp/server/Transport.js.map +1 -0
- package/dist/mcp/server/index.d.ts.map +1 -0
- package/dist/mcp/server/index.js.map +1 -0
- package/dist/server/Mppx.d.ts +12 -4
- package/dist/server/Mppx.d.ts.map +1 -1
- package/dist/server/Mppx.js +85 -27
- package/dist/server/Mppx.js.map +1 -1
- package/dist/server/Response.d.ts.map +1 -1
- package/dist/server/Response.js +2 -1
- package/dist/server/Response.js.map +1 -1
- package/dist/server/Transport.d.ts +1 -1
- package/dist/server/Transport.d.ts.map +1 -1
- package/dist/server/Transport.js +5 -4
- package/dist/server/Transport.js.map +1 -1
- package/dist/server/index.d.ts +1 -0
- package/dist/server/index.d.ts.map +1 -1
- package/dist/server/index.js +1 -0
- package/dist/server/index.js.map +1 -1
- package/dist/stripe/client/Charge.d.ts +1 -1
- package/dist/stripe/client/Charge.d.ts.map +1 -1
- package/dist/stripe/client/Charge.js +3 -1
- package/dist/stripe/client/Charge.js.map +1 -1
- package/dist/stripe/server/Charge.d.ts +1 -1
- package/dist/stripe/server/Charge.d.ts.map +1 -1
- package/dist/stripe/server/Charge.js +9 -2
- package/dist/stripe/server/Charge.js.map +1 -1
- package/dist/stripe/server/Methods.d.ts +1 -1
- package/dist/stripe/server/Methods.d.ts.map +1 -1
- package/dist/stripe/server/internal/html.gen.d.ts +1 -1
- package/dist/stripe/server/internal/html.gen.d.ts.map +1 -1
- package/dist/stripe/server/internal/html.gen.js +1 -1
- package/dist/stripe/server/internal/html.gen.js.map +1 -1
- package/dist/tempo/Methods.d.ts +18 -0
- package/dist/tempo/Methods.d.ts.map +1 -1
- package/dist/tempo/Methods.js +16 -1
- package/dist/tempo/Methods.js.map +1 -1
- package/dist/tempo/Proof.d.ts +85 -1
- package/dist/tempo/Proof.d.ts.map +1 -1
- package/dist/tempo/Proof.js +35 -0
- package/dist/tempo/Proof.js.map +1 -1
- package/dist/tempo/client/Charge.d.ts +19 -1
- package/dist/tempo/client/Charge.d.ts.map +1 -1
- package/dist/tempo/client/Charge.js +47 -27
- package/dist/tempo/client/Charge.js.map +1 -1
- package/dist/tempo/client/Methods.d.ts +41 -10
- package/dist/tempo/client/Methods.d.ts.map +1 -1
- package/dist/tempo/client/Methods.js +16 -7
- package/dist/tempo/client/Methods.js.map +1 -1
- package/dist/tempo/client/ResolveAccount.d.ts +40 -0
- package/dist/tempo/client/ResolveAccount.d.ts.map +1 -0
- package/dist/tempo/client/ResolveAccount.js +2 -0
- package/dist/tempo/client/ResolveAccount.js.map +1 -0
- package/dist/tempo/client/index.d.ts +7 -4
- package/dist/tempo/client/index.d.ts.map +1 -1
- package/dist/tempo/client/index.js +5 -3
- package/dist/tempo/client/index.js.map +1 -1
- package/dist/tempo/index.d.ts +1 -0
- package/dist/tempo/index.d.ts.map +1 -1
- package/dist/tempo/index.js +1 -0
- package/dist/tempo/index.js.map +1 -1
- package/dist/tempo/internal/fee-payer.d.ts +29 -1
- package/dist/tempo/internal/fee-payer.d.ts.map +1 -1
- package/dist/tempo/internal/fee-payer.js +138 -4
- package/dist/tempo/internal/fee-payer.js.map +1 -1
- package/dist/tempo/internal/proof.d.ts +71 -5
- package/dist/tempo/internal/proof.d.ts.map +1 -1
- package/dist/tempo/internal/proof.js +42 -6
- package/dist/tempo/internal/proof.js.map +1 -1
- package/dist/tempo/{client → legacy/client}/ChannelOps.d.ts +19 -6
- package/dist/tempo/legacy/client/ChannelOps.d.ts.map +1 -0
- package/dist/tempo/{client → legacy/client}/ChannelOps.js +9 -3
- package/dist/tempo/legacy/client/ChannelOps.js.map +1 -0
- package/dist/tempo/{client → legacy/client}/Session.d.ts +23 -4
- package/dist/tempo/legacy/client/Session.d.ts.map +1 -0
- package/dist/tempo/{client → legacy/client}/Session.js +14 -7
- package/dist/tempo/legacy/client/Session.js.map +1 -0
- package/dist/tempo/{client → legacy/client}/SessionManager.d.ts +20 -5
- package/dist/tempo/legacy/client/SessionManager.d.ts.map +1 -0
- package/dist/tempo/{client → legacy/client}/SessionManager.js +30 -19
- package/dist/tempo/legacy/client/SessionManager.js.map +1 -0
- package/dist/tempo/legacy/client/index.d.ts +7 -0
- package/dist/tempo/legacy/client/index.d.ts.map +1 -0
- package/dist/tempo/legacy/client/index.js +5 -0
- package/dist/tempo/legacy/client/index.js.map +1 -0
- package/dist/tempo/legacy/index.d.ts +7 -0
- package/dist/tempo/legacy/index.d.ts.map +1 -0
- package/dist/tempo/legacy/index.js +7 -0
- package/dist/tempo/legacy/index.js.map +1 -0
- package/dist/tempo/{server → legacy/server}/Session.d.ts +28 -11
- package/dist/tempo/legacy/server/Session.d.ts.map +1 -0
- package/dist/tempo/{server → legacy/server}/Session.js +12 -10
- package/dist/tempo/legacy/server/Session.js.map +1 -0
- package/dist/tempo/legacy/server/index.d.ts +5 -0
- package/dist/tempo/legacy/server/index.d.ts.map +1 -0
- package/dist/tempo/legacy/server/index.js +5 -0
- package/dist/tempo/legacy/server/index.js.map +1 -0
- package/dist/tempo/{session → legacy/session}/Chain.d.ts +30 -23
- package/dist/tempo/legacy/session/Chain.d.ts.map +1 -0
- package/dist/tempo/{session → legacy/session}/Chain.js +12 -11
- package/dist/tempo/legacy/session/Chain.js.map +1 -0
- package/dist/tempo/{session → legacy/session}/Channel.d.ts +1 -0
- package/dist/tempo/legacy/session/Channel.d.ts.map +1 -0
- package/dist/tempo/legacy/session/Channel.js.map +1 -0
- package/dist/tempo/legacy/session/ChannelStore.d.ts +22 -0
- package/dist/tempo/legacy/session/ChannelStore.d.ts.map +1 -0
- package/dist/tempo/legacy/session/ChannelStore.js +6 -0
- package/dist/tempo/legacy/session/ChannelStore.js.map +1 -0
- package/dist/tempo/legacy/session/Types.d.ts +73 -0
- package/dist/tempo/legacy/session/Types.d.ts.map +1 -0
- package/dist/tempo/legacy/session/Types.js.map +1 -0
- package/dist/tempo/{session → legacy/session}/Voucher.d.ts +4 -4
- package/dist/tempo/legacy/session/Voucher.d.ts.map +1 -0
- package/dist/tempo/{session → legacy/session}/Voucher.js +1 -1
- package/dist/tempo/legacy/session/Voucher.js.map +1 -0
- package/dist/tempo/{session → legacy/session}/escrow.abi.d.ts +1 -0
- package/dist/tempo/{session → legacy/session}/escrow.abi.d.ts.map +1 -1
- package/dist/tempo/{session → legacy/session}/escrow.abi.js +1 -0
- package/dist/tempo/legacy/session/escrow.abi.js.map +1 -0
- package/dist/tempo/legacy/session/index.d.ts +9 -0
- package/dist/tempo/legacy/session/index.d.ts.map +1 -0
- package/dist/tempo/legacy/session/index.js +9 -0
- package/dist/tempo/legacy/session/index.js.map +1 -0
- package/dist/tempo/server/Charge.d.ts +1 -1
- package/dist/tempo/server/Charge.d.ts.map +1 -1
- package/dist/tempo/server/Charge.js +51 -30
- package/dist/tempo/server/Charge.js.map +1 -1
- package/dist/tempo/server/Methods.d.ts +67 -8
- package/dist/tempo/server/Methods.d.ts.map +1 -1
- package/dist/tempo/server/Methods.js +40 -10
- package/dist/tempo/server/Methods.js.map +1 -1
- package/dist/tempo/server/Subscription.d.ts +11 -1
- package/dist/tempo/server/Subscription.d.ts.map +1 -1
- package/dist/tempo/server/Subscription.js +135 -23
- package/dist/tempo/server/Subscription.js.map +1 -1
- package/dist/tempo/server/index.d.ts +6 -5
- package/dist/tempo/server/index.d.ts.map +1 -1
- package/dist/tempo/server/index.js +5 -5
- package/dist/tempo/server/index.js.map +1 -1
- package/dist/tempo/server/internal/html.gen.d.ts +1 -1
- package/dist/tempo/server/internal/html.gen.d.ts.map +1 -1
- package/dist/tempo/server/internal/html.gen.js +1 -1
- package/dist/tempo/server/internal/html.gen.js.map +1 -1
- package/dist/tempo/server/internal/request-body.d.ts +7 -2
- package/dist/tempo/server/internal/request-body.d.ts.map +1 -1
- package/dist/tempo/server/internal/request-body.js +20 -3
- package/dist/tempo/server/internal/request-body.js.map +1 -1
- package/dist/tempo/server/internal/transport.d.ts +8 -4
- package/dist/tempo/server/internal/transport.d.ts.map +1 -1
- package/dist/tempo/server/internal/transport.js +8 -7
- package/dist/tempo/server/internal/transport.js.map +1 -1
- package/dist/tempo/session/Snapshot.d.ts +32 -0
- package/dist/tempo/session/Snapshot.d.ts.map +1 -0
- package/dist/tempo/session/Snapshot.js +37 -0
- package/dist/tempo/session/Snapshot.js.map +1 -0
- package/dist/tempo/session/client/ChannelOps.d.ts +81 -0
- package/dist/tempo/session/client/ChannelOps.d.ts.map +1 -0
- package/dist/tempo/session/client/ChannelOps.js +201 -0
- package/dist/tempo/session/client/ChannelOps.js.map +1 -0
- package/dist/tempo/session/client/ChannelStore.d.ts +51 -0
- package/dist/tempo/session/client/ChannelStore.d.ts.map +1 -0
- package/dist/tempo/session/client/ChannelStore.js +63 -0
- package/dist/tempo/session/client/ChannelStore.js.map +1 -0
- package/dist/tempo/session/client/CredentialState.d.ts +245 -0
- package/dist/tempo/session/client/CredentialState.d.ts.map +1 -0
- package/dist/tempo/session/client/CredentialState.js +419 -0
- package/dist/tempo/session/client/CredentialState.js.map +1 -0
- package/dist/tempo/session/client/ReceiptCoordinator.d.ts +26 -0
- package/dist/tempo/session/client/ReceiptCoordinator.d.ts.map +1 -0
- package/dist/tempo/session/client/ReceiptCoordinator.js +61 -0
- package/dist/tempo/session/client/ReceiptCoordinator.js.map +1 -0
- package/dist/tempo/session/client/Runtime.d.ts +464 -0
- package/dist/tempo/session/client/Runtime.d.ts.map +1 -0
- package/dist/tempo/session/client/Runtime.js +499 -0
- package/dist/tempo/session/client/Runtime.js.map +1 -0
- package/dist/tempo/session/client/Session.d.ts +138 -0
- package/dist/tempo/session/client/Session.d.ts.map +1 -0
- package/dist/tempo/session/client/Session.js +69 -0
- package/dist/tempo/session/client/Session.js.map +1 -0
- package/dist/tempo/session/client/SessionManager.d.ts +84 -0
- package/dist/tempo/session/client/SessionManager.d.ts.map +1 -0
- package/dist/tempo/session/client/SessionManager.js +577 -0
- package/dist/tempo/session/client/SessionManager.js.map +1 -0
- package/dist/tempo/session/client/Transports.d.ts +449 -0
- package/dist/tempo/session/client/Transports.d.ts.map +1 -0
- package/dist/tempo/session/client/Transports.js +721 -0
- package/dist/tempo/session/client/Transports.js.map +1 -0
- package/dist/tempo/session/client/index.d.ts +11 -0
- package/dist/tempo/session/client/index.d.ts.map +1 -0
- package/dist/tempo/session/client/index.js +6 -0
- package/dist/tempo/session/client/index.js.map +1 -0
- package/dist/tempo/session/index.d.ts +7 -8
- package/dist/tempo/session/index.d.ts.map +1 -1
- package/dist/tempo/session/index.js +7 -8
- package/dist/tempo/session/index.js.map +1 -1
- package/dist/tempo/session/precompile/Chain.d.ts +319 -0
- package/dist/tempo/session/precompile/Chain.d.ts.map +1 -0
- package/dist/tempo/session/precompile/Chain.js +492 -0
- package/dist/tempo/session/precompile/Chain.js.map +1 -0
- package/dist/tempo/session/precompile/Channel.d.ts +46 -0
- package/dist/tempo/session/precompile/Channel.d.ts.map +1 -0
- package/dist/tempo/session/precompile/Channel.js +56 -0
- package/dist/tempo/session/precompile/Channel.js.map +1 -0
- package/dist/tempo/session/precompile/Protocol.d.ts +308 -0
- package/dist/tempo/session/precompile/Protocol.d.ts.map +1 -0
- package/dist/tempo/session/precompile/Protocol.js +264 -0
- package/dist/tempo/session/precompile/Protocol.js.map +1 -0
- package/dist/tempo/session/precompile/Voucher.d.ts +40 -0
- package/dist/tempo/session/precompile/Voucher.d.ts.map +1 -0
- package/dist/tempo/session/precompile/Voucher.js +125 -0
- package/dist/tempo/session/precompile/Voucher.js.map +1 -0
- package/dist/tempo/session/precompile/escrow.abi.d.ts +522 -0
- package/dist/tempo/session/precompile/escrow.abi.d.ts.map +1 -0
- package/dist/tempo/session/precompile/escrow.abi.js +224 -0
- package/dist/tempo/session/precompile/escrow.abi.js.map +1 -0
- package/dist/tempo/session/precompile/index.d.ts +24 -0
- package/dist/tempo/session/precompile/index.d.ts.map +1 -0
- package/dist/tempo/session/precompile/index.js +22 -0
- package/dist/tempo/session/precompile/index.js.map +1 -0
- package/dist/tempo/session/server/ChannelOps.d.ts +56 -0
- package/dist/tempo/session/server/ChannelOps.d.ts.map +1 -0
- package/dist/tempo/session/server/ChannelOps.js +91 -0
- package/dist/tempo/session/server/ChannelOps.js.map +1 -0
- package/dist/tempo/session/server/ChannelStore.d.ts +347 -0
- package/dist/tempo/session/server/ChannelStore.d.ts.map +1 -0
- package/dist/tempo/session/server/ChannelStore.js +404 -0
- package/dist/tempo/session/server/ChannelStore.js.map +1 -0
- package/dist/tempo/session/server/CredentialVerification.d.ts +85 -0
- package/dist/tempo/session/server/CredentialVerification.d.ts.map +1 -0
- package/dist/tempo/session/server/CredentialVerification.js +494 -0
- package/dist/tempo/session/server/CredentialVerification.js.map +1 -0
- package/dist/tempo/session/server/MeteredStream.d.ts +40 -0
- package/dist/tempo/session/server/MeteredStream.d.ts.map +1 -0
- package/dist/tempo/session/server/MeteredStream.js +42 -0
- package/dist/tempo/session/server/MeteredStream.js.map +1 -0
- package/dist/tempo/session/server/RequestState.d.ts +208 -0
- package/dist/tempo/session/server/RequestState.d.ts.map +1 -0
- package/dist/tempo/session/server/RequestState.js +252 -0
- package/dist/tempo/session/server/RequestState.js.map +1 -0
- package/dist/tempo/session/server/Session.d.ts +169 -0
- package/dist/tempo/session/server/Session.d.ts.map +1 -0
- package/dist/tempo/session/server/Session.js +351 -0
- package/dist/tempo/session/server/Session.js.map +1 -0
- package/dist/tempo/session/server/Settlement.d.ts +185 -0
- package/dist/tempo/session/server/Settlement.d.ts.map +1 -0
- package/dist/tempo/session/server/Settlement.js +252 -0
- package/dist/tempo/session/server/Settlement.js.map +1 -0
- package/dist/tempo/session/{Sse.d.ts → server/Sse.d.ts} +9 -56
- package/dist/tempo/session/server/Sse.d.ts.map +1 -0
- package/dist/tempo/session/server/Sse.js +184 -0
- package/dist/tempo/session/server/Sse.js.map +1 -0
- package/dist/tempo/session/server/Transports.d.ts +89 -0
- package/dist/tempo/session/server/Transports.d.ts.map +1 -0
- package/dist/tempo/session/server/Transports.js +149 -0
- package/dist/tempo/session/server/Transports.js.map +1 -0
- package/dist/tempo/session/server/Ws.d.ts +48 -0
- package/dist/tempo/session/server/Ws.d.ts.map +1 -0
- package/dist/tempo/session/server/Ws.js +244 -0
- package/dist/tempo/session/server/Ws.js.map +1 -0
- package/dist/tempo/session/server/index.d.ts +4 -0
- package/dist/tempo/session/server/index.d.ts.map +1 -0
- package/dist/tempo/session/server/index.js +2 -0
- package/dist/tempo/session/server/index.js.map +1 -0
- package/dist/tempo/subscription/KeyAuthorization.d.ts +712 -1
- package/dist/tempo/subscription/KeyAuthorization.d.ts.map +1 -1
- package/dist/tempo/subscription/Store.d.ts +2 -0
- package/dist/tempo/subscription/Store.d.ts.map +1 -1
- package/dist/tempo/subscription/Store.js +16 -1
- package/dist/tempo/subscription/Store.js.map +1 -1
- package/dist/x402/index.d.ts +1 -0
- package/dist/x402/index.d.ts.map +1 -1
- package/dist/x402/index.js +1 -0
- package/dist/x402/index.js.map +1 -1
- package/package.json +25 -9
- package/src/Challenge.test.ts +40 -0
- package/src/Challenge.ts +28 -13
- package/src/Constants.ts +58 -0
- package/src/Credential.ts +5 -4
- package/src/Mcp.ts +4 -0
- package/src/Method.ts +46 -5
- package/src/PaymentRequest.ts +10 -10
- package/src/Receipt.ts +3 -2
- package/src/cli/cli.test.ts +38 -43
- package/src/cli/cli.ts +23 -10
- package/src/cli/mcp.test.ts +21 -7
- package/src/cli/plugins/tempo.ts +21 -8
- package/src/cli/utils.test.ts +25 -1
- package/src/cli/utils.ts +10 -0
- package/src/client/Methods.ts +5 -2
- package/src/client/Mppx.test-d.ts +31 -1
- package/src/client/Mppx.test.ts +76 -1
- package/src/client/Mppx.ts +2 -2
- package/src/client/Transport.test.ts +225 -178
- package/src/client/Transport.ts +77 -84
- package/src/client/index.ts +25 -1
- package/src/client/internal/Fetch.test.ts +236 -6
- package/src/client/internal/Fetch.ts +69 -11
- package/src/client/internal/protocols/Mcp.test.ts +220 -0
- package/src/client/internal/protocols/Mcp.ts +162 -0
- package/src/client/internal/protocols/Mpp.ts +21 -0
- package/src/client/internal/protocols/Protocol.ts +10 -0
- package/src/client/internal/protocols/Shared.ts +25 -0
- package/src/client/internal/protocols/X402.ts +42 -0
- package/src/discovery/OpenApi.test.ts +1 -1
- package/src/env.d.ts +1 -1
- package/src/evm/PublicInterface.test-d.ts +1 -1
- package/src/evm/client/index.ts +1 -0
- package/src/evm/index.ts +2 -0
- package/src/evm/server/Charge.test.ts +1 -1
- package/src/evm/server/index.ts +1 -0
- package/src/index.ts +1 -0
- package/src/internal/AcceptPayment.test.ts +61 -0
- package/src/internal/AcceptPayment.ts +21 -14
- package/src/{mcp-sdk → mcp}/client/McpClient.integration.test.ts +18 -11
- package/src/{mcp-sdk → mcp}/client/McpClient.test-d.ts +45 -11
- package/src/{mcp-sdk → mcp}/client/McpClient.test.ts +211 -5
- package/src/mcp/client/McpClient.ts +307 -0
- package/src/mcp/client/McpClient.unit.test.ts +135 -0
- package/src/middlewares/elysia.test.ts +9 -5
- package/src/middlewares/express.test.ts +9 -5
- package/src/middlewares/hono.test.ts +5 -5
- package/src/middlewares/internal/mppx.test.ts +1 -1
- package/src/middlewares/nextjs.test.ts +9 -5
- package/src/proxy/Proxy.test.ts +9 -9
- package/src/proxy/services/anthropic.test.ts +1 -1
- package/src/proxy/services/openai.test.ts +1 -1
- package/src/proxy/services/stripe.test.ts +1 -1
- package/src/server/Mppx.authorize.test.ts +1 -1
- package/src/server/Mppx.test-d.ts +55 -1
- package/src/server/Mppx.test.ts +220 -9
- package/src/server/Mppx.ts +501 -407
- package/src/server/Response.ts +2 -1
- package/src/server/Transport.test.ts +6 -6
- package/src/server/Transport.ts +5 -4
- package/src/server/index.ts +1 -0
- package/src/stripe/Charge.integration.test.ts +1 -1
- package/src/stripe/client/Charge.test.ts +21 -6
- package/src/stripe/client/Charge.ts +6 -2
- package/src/stripe/server/Charge.test.ts +115 -2
- package/src/stripe/server/Charge.ts +13 -2
- package/src/stripe/server/internal/html/package.json +1 -1
- package/src/stripe/server/internal/html.gen.ts +1 -1
- package/src/tempo/AccessKeyAuthorization.test.ts +4 -94
- package/src/tempo/Methods.test.ts +45 -17
- package/src/tempo/Methods.ts +22 -0
- package/src/tempo/Proof.conformance.test.ts +146 -0
- package/src/tempo/Proof.test-d.ts +15 -0
- package/src/tempo/Proof.ts +52 -1
- package/src/tempo/PublicExports.test-d.ts +105 -0
- package/src/tempo/Subscription.integration.test.ts +1 -1
- package/src/tempo/client/Charge.test.ts +258 -0
- package/src/tempo/client/Charge.ts +84 -38
- package/src/tempo/client/Methods.ts +22 -8
- package/src/tempo/client/ResolveAccount.ts +46 -0
- package/src/tempo/client/index.ts +15 -4
- package/src/tempo/index.ts +1 -0
- package/src/tempo/internal/fee-payer.test.ts +296 -17
- package/src/tempo/internal/fee-payer.ts +186 -4
- package/src/tempo/internal/fee-token.test.ts +14 -9
- package/src/tempo/internal/proof.test.ts +12 -4
- package/src/tempo/internal/proof.ts +55 -6
- package/src/tempo/legacy/AccessKeyAuthorization.test.ts +162 -0
- package/src/tempo/legacy/README.md +9 -0
- package/src/tempo/{client → legacy/client}/ChannelOps.test.ts +6 -7
- package/src/tempo/{client → legacy/client}/ChannelOps.ts +22 -9
- package/src/tempo/{client → legacy/client}/Session.test.ts +51 -9
- package/src/tempo/{client → legacy/client}/Session.ts +25 -11
- package/src/tempo/{client → legacy/client}/SessionManager.test.ts +81 -9
- package/src/tempo/{client → legacy/client}/SessionManager.ts +52 -23
- package/src/tempo/legacy/client/index.ts +6 -0
- package/src/tempo/legacy/index.ts +6 -0
- package/src/tempo/{server → legacy/server}/Session.test.ts +136 -71
- package/src/tempo/{server → legacy/server}/Session.ts +32 -23
- package/src/tempo/legacy/server/index.ts +4 -0
- package/src/tempo/{session → legacy/session}/Chain.test.ts +3 -4
- package/src/tempo/{session → legacy/session}/Chain.ts +94 -63
- package/src/tempo/{session → legacy/session}/Channel.ts +1 -0
- package/src/tempo/legacy/session/ChannelStore.test.ts +58 -0
- package/src/tempo/legacy/session/ChannelStore.ts +39 -0
- package/src/tempo/legacy/session/Types.ts +91 -0
- package/src/tempo/{session → legacy/session}/Voucher.ts +12 -8
- package/src/tempo/{session → legacy/session}/escrow.abi.ts +1 -0
- package/src/tempo/legacy/session/index.ts +8 -0
- package/src/tempo/server/AtomicStore.test-d.ts +16 -11
- package/src/tempo/server/Charge.test.ts +480 -31
- package/src/tempo/server/Charge.ts +54 -30
- package/src/tempo/server/Methods.ts +58 -10
- package/src/tempo/server/Sse.test.ts +2 -2
- package/src/tempo/server/Subscription.test.ts +465 -3
- package/src/tempo/server/Subscription.ts +174 -19
- package/src/tempo/server/index.ts +6 -5
- package/src/tempo/server/internal/html/package.json +2 -2
- package/src/tempo/server/internal/html.gen.ts +1 -1
- package/src/tempo/server/internal/request-body.test.ts +37 -4
- package/src/tempo/server/internal/request-body.ts +25 -6
- package/src/tempo/server/internal/transport.test.ts +4 -4
- package/src/tempo/server/internal/transport.ts +19 -10
- package/src/tempo/session/Snapshot.test.ts +41 -0
- package/src/tempo/session/Snapshot.ts +74 -0
- package/src/tempo/session/client/ChannelOps.test.ts +163 -0
- package/src/tempo/session/client/ChannelOps.ts +330 -0
- package/src/tempo/session/client/ChannelStore.ts +111 -0
- package/src/tempo/session/client/CredentialState.test.ts +789 -0
- package/src/tempo/session/client/CredentialState.ts +799 -0
- package/src/tempo/session/client/ReceiptCoordinator.ts +95 -0
- package/src/tempo/session/client/Runtime.test.ts +1092 -0
- package/src/tempo/session/client/Runtime.ts +986 -0
- package/src/tempo/session/client/Session.test.ts +774 -0
- package/src/tempo/session/client/Session.ts +123 -0
- package/src/tempo/session/client/SessionManager.test.ts +1397 -0
- package/src/tempo/session/client/SessionManager.ts +751 -0
- package/src/tempo/session/client/Transports.test.ts +837 -0
- package/src/tempo/session/client/Transports.ts +1292 -0
- package/src/tempo/session/client/index.ts +40 -0
- package/src/tempo/session/index.ts +7 -8
- package/src/tempo/session/precompile/Chain.integration.test.ts +321 -0
- package/src/tempo/session/precompile/Chain.test.ts +1258 -0
- package/src/tempo/session/precompile/Chain.ts +979 -0
- package/src/tempo/session/precompile/Channel.test.ts +138 -0
- package/src/tempo/session/precompile/Channel.ts +103 -0
- package/src/tempo/session/precompile/Protocol.test.ts +358 -0
- package/src/tempo/session/precompile/Protocol.ts +520 -0
- package/src/tempo/session/precompile/Voucher.test.ts +354 -0
- package/src/tempo/session/precompile/Voucher.ts +162 -0
- package/src/tempo/session/precompile/escrow.abi.ts +226 -0
- package/src/tempo/session/precompile/index.ts +33 -0
- package/src/tempo/session/server/ChannelOps.test.ts +129 -0
- package/src/tempo/session/server/ChannelOps.ts +157 -0
- package/src/tempo/session/{ChannelStore.test.ts → server/ChannelStore.test.ts} +536 -29
- package/src/tempo/session/server/ChannelStore.ts +835 -0
- package/src/tempo/session/server/CredentialVerification.test.ts +146 -0
- package/src/tempo/session/server/CredentialVerification.ts +710 -0
- package/src/tempo/session/server/MeteredStream.ts +88 -0
- package/src/tempo/session/server/RequestState.test.ts +531 -0
- package/src/tempo/session/server/RequestState.ts +499 -0
- package/src/tempo/session/server/Session.integration.test.ts +444 -0
- package/src/tempo/session/server/Session.test.ts +3253 -0
- package/src/tempo/session/server/Session.ts +543 -0
- package/src/tempo/session/server/Settlement.test.ts +329 -0
- package/src/tempo/session/server/Settlement.ts +471 -0
- package/src/tempo/session/{Sse.test.ts → server/Sse.test.ts} +37 -3
- package/src/tempo/session/server/Sse.ts +254 -0
- package/src/tempo/session/server/Transports.test.ts +346 -0
- package/src/tempo/session/server/Transports.ts +255 -0
- package/src/tempo/session/{Ws.test.ts → server/Ws.test.ts} +4 -4
- package/src/tempo/session/server/Ws.ts +380 -0
- package/src/tempo/session/server/index.ts +8 -0
- package/src/tempo/subscription/Store.ts +27 -9
- package/src/x402/Exact.e2e.test.ts +1 -1
- package/src/x402/PublicInterface.test-d.ts +1 -1
- package/src/x402/index.ts +1 -0
- package/dist/mcp-sdk/client/McpClient.d.ts +0 -78
- package/dist/mcp-sdk/client/McpClient.d.ts.map +0 -1
- package/dist/mcp-sdk/client/McpClient.js +0 -105
- package/dist/mcp-sdk/client/McpClient.js.map +0 -1
- package/dist/mcp-sdk/client/index.d.ts.map +0 -1
- package/dist/mcp-sdk/client/index.js.map +0 -1
- package/dist/mcp-sdk/server/Transport.d.ts.map +0 -1
- package/dist/mcp-sdk/server/Transport.js.map +0 -1
- package/dist/mcp-sdk/server/index.d.ts.map +0 -1
- package/dist/mcp-sdk/server/index.js.map +0 -1
- package/dist/tempo/client/ChannelOps.d.ts.map +0 -1
- package/dist/tempo/client/ChannelOps.js.map +0 -1
- package/dist/tempo/client/Session.d.ts.map +0 -1
- package/dist/tempo/client/Session.js.map +0 -1
- package/dist/tempo/client/SessionManager.d.ts.map +0 -1
- package/dist/tempo/client/SessionManager.js.map +0 -1
- package/dist/tempo/server/Session.d.ts.map +0 -1
- package/dist/tempo/server/Session.js.map +0 -1
- package/dist/tempo/session/Chain.d.ts.map +0 -1
- package/dist/tempo/session/Chain.js.map +0 -1
- package/dist/tempo/session/Channel.d.ts.map +0 -1
- package/dist/tempo/session/Channel.js.map +0 -1
- package/dist/tempo/session/ChannelStore.d.ts +0 -117
- package/dist/tempo/session/ChannelStore.d.ts.map +0 -1
- package/dist/tempo/session/ChannelStore.js +0 -172
- package/dist/tempo/session/ChannelStore.js.map +0 -1
- package/dist/tempo/session/Receipt.d.ts +0 -22
- package/dist/tempo/session/Receipt.d.ts.map +0 -1
- package/dist/tempo/session/Receipt.js +0 -34
- package/dist/tempo/session/Receipt.js.map +0 -1
- package/dist/tempo/session/Sse.d.ts.map +0 -1
- package/dist/tempo/session/Sse.js +0 -363
- package/dist/tempo/session/Sse.js.map +0 -1
- package/dist/tempo/session/Types.d.ts +0 -78
- package/dist/tempo/session/Types.d.ts.map +0 -1
- package/dist/tempo/session/Types.js.map +0 -1
- package/dist/tempo/session/Voucher.d.ts.map +0 -1
- package/dist/tempo/session/Voucher.js.map +0 -1
- package/dist/tempo/session/Ws.d.ts +0 -87
- package/dist/tempo/session/Ws.d.ts.map +0 -1
- package/dist/tempo/session/Ws.js +0 -443
- package/dist/tempo/session/Ws.js.map +0 -1
- package/dist/tempo/session/escrow.abi.js.map +0 -1
- package/src/mcp-sdk/client/McpClient.ts +0 -196
- package/src/tempo/session/ChannelStore.ts +0 -308
- package/src/tempo/session/Receipt.test.ts +0 -89
- package/src/tempo/session/Receipt.ts +0 -46
- package/src/tempo/session/Sse.ts +0 -462
- package/src/tempo/session/Types.ts +0 -86
- package/src/tempo/session/Ws.ts +0 -576
- /package/dist/{mcp-sdk → mcp}/client/index.d.ts +0 -0
- /package/dist/{mcp-sdk → mcp}/client/index.js +0 -0
- /package/dist/{mcp-sdk → mcp}/server/Transport.d.ts +0 -0
- /package/dist/{mcp-sdk → mcp}/server/Transport.js +0 -0
- /package/dist/{mcp-sdk → mcp}/server/index.d.ts +0 -0
- /package/dist/{mcp-sdk → mcp}/server/index.js +0 -0
- /package/dist/tempo/{session → legacy/session}/Channel.js +0 -0
- /package/dist/tempo/{session → legacy/session}/Types.js +0 -0
- /package/src/{mcp-sdk → mcp}/client/index.ts +0 -0
- /package/src/{mcp-sdk → mcp}/server/Transport.test.ts +0 -0
- /package/src/{mcp-sdk → mcp}/server/Transport.ts +0 -0
- /package/src/{mcp-sdk → mcp}/server/index.ts +0 -0
- /package/src/tempo/{session → legacy/session}/Channel.test.ts +0 -0
- /package/src/tempo/{session → legacy/session}/Voucher.test.ts +0 -0
- /package/src/tempo/session/{Sse.fuzz.test.ts → server/Sse.fuzz.test.ts} +0 -0
|
@@ -2,6 +2,7 @@ import { Challenge, Credential } from 'mppx'
|
|
|
2
2
|
import { createClient, http } from 'viem'
|
|
3
3
|
import { privateKeyToAccount } from 'viem/accounts'
|
|
4
4
|
import { tempoLocalnet } from 'viem/chains'
|
|
5
|
+
import { Account, Secp256k1 } from 'viem/tempo'
|
|
5
6
|
import { describe, expect, test, vi } from 'vp/test'
|
|
6
7
|
|
|
7
8
|
import * as Methods from '../Methods.js'
|
|
@@ -83,6 +84,178 @@ describe('tempo.charge client', () => {
|
|
|
83
84
|
expect(credential.source).toBe(`did:pkh:eip155:${chainId}:${account.address}`)
|
|
84
85
|
})
|
|
85
86
|
|
|
87
|
+
test('resolveAccount selects the transaction account from executable calls', async () => {
|
|
88
|
+
vi.resetModules()
|
|
89
|
+
const selectedAccount = privateKeyToAccount(
|
|
90
|
+
'0x0000000000000000000000000000000000000000000000000000000000000002',
|
|
91
|
+
)
|
|
92
|
+
const chainId = 42431
|
|
93
|
+
const calls: charge.ResolveAccountInfo[] = []
|
|
94
|
+
const prepareTransactionRequest = vi.fn(async () => ({}))
|
|
95
|
+
const signTransaction = vi.fn(async () => '0xdeadbeef')
|
|
96
|
+
vi.doMock('viem/actions', () => ({
|
|
97
|
+
prepareTransactionRequest,
|
|
98
|
+
sendCallsSync: vi.fn(),
|
|
99
|
+
signTransaction,
|
|
100
|
+
signTypedData: vi.fn(),
|
|
101
|
+
}))
|
|
102
|
+
|
|
103
|
+
try {
|
|
104
|
+
const { charge: chargeWithMockedActions } = await import('./Charge.js')
|
|
105
|
+
const client = createClient({
|
|
106
|
+
account,
|
|
107
|
+
chain: tempoLocalnet,
|
|
108
|
+
transport: http('http://127.0.0.1'),
|
|
109
|
+
})
|
|
110
|
+
const method = chargeWithMockedActions({
|
|
111
|
+
account,
|
|
112
|
+
getClient: () => client,
|
|
113
|
+
resolveAccount(info) {
|
|
114
|
+
calls.push(info)
|
|
115
|
+
return selectedAccount
|
|
116
|
+
},
|
|
117
|
+
})
|
|
118
|
+
|
|
119
|
+
const credential = Credential.deserialize(
|
|
120
|
+
await method.createCredential({
|
|
121
|
+
challenge: createChallenge({ amount: '1', chainId, supportedModes: ['pull'] }),
|
|
122
|
+
context: {},
|
|
123
|
+
}),
|
|
124
|
+
)
|
|
125
|
+
|
|
126
|
+
expect(calls).toHaveLength(1)
|
|
127
|
+
expect(calls[0]!.account.address).toBe(account.address)
|
|
128
|
+
expect(calls[0]!.chainId).toBe(chainId)
|
|
129
|
+
expect(calls[0]!.operation.kind).toBe('executeCalls')
|
|
130
|
+
if (calls[0]!.operation.kind !== 'executeCalls') throw new Error('expected executeCalls')
|
|
131
|
+
expect(calls[0]!.operation.calls).toHaveLength(1)
|
|
132
|
+
expect(calls[0]!.operation.calls?.[0]?.to.toLowerCase()).toBe(currency.toLowerCase())
|
|
133
|
+
expect(prepareTransactionRequest).toHaveBeenCalledOnce()
|
|
134
|
+
expect(signTransaction).toHaveBeenCalledOnce()
|
|
135
|
+
expect(credential.payload).toEqual({ signature: '0xdeadbeef', type: 'transaction' })
|
|
136
|
+
expect(credential.source).toBe(`did:pkh:eip155:${chainId}:${selectedAccount.address}`)
|
|
137
|
+
} finally {
|
|
138
|
+
vi.doUnmock('viem/actions')
|
|
139
|
+
vi.resetModules()
|
|
140
|
+
}
|
|
141
|
+
})
|
|
142
|
+
|
|
143
|
+
test('resolveAccount omits executable calls when auto-swap routing is account-dependent', async () => {
|
|
144
|
+
vi.resetModules()
|
|
145
|
+
const selectedAccount = privateKeyToAccount(
|
|
146
|
+
'0x0000000000000000000000000000000000000000000000000000000000000002',
|
|
147
|
+
)
|
|
148
|
+
const chainId = 42431
|
|
149
|
+
const calls: charge.ResolveAccountInfo[] = []
|
|
150
|
+
const prepareTransactionRequest = vi.fn(async () => ({}))
|
|
151
|
+
const signTransaction = vi.fn(async () => '0xdeadbeef')
|
|
152
|
+
const findCalls = vi.fn(async (_client: unknown, _parameters: { account: string }) => undefined)
|
|
153
|
+
vi.doMock('viem/actions', () => ({
|
|
154
|
+
prepareTransactionRequest,
|
|
155
|
+
sendCallsSync: vi.fn(),
|
|
156
|
+
signTransaction,
|
|
157
|
+
signTypedData: vi.fn(),
|
|
158
|
+
}))
|
|
159
|
+
vi.doMock('../internal/auto-swap.js', () => ({
|
|
160
|
+
defaultCurrencies: [currency],
|
|
161
|
+
findCalls,
|
|
162
|
+
resolve: vi.fn(() => ({ tokenIn: [currency], slippage: 1 })),
|
|
163
|
+
}))
|
|
164
|
+
|
|
165
|
+
try {
|
|
166
|
+
const { charge: chargeWithMockedActions } = await import('./Charge.js')
|
|
167
|
+
const client = createClient({
|
|
168
|
+
account,
|
|
169
|
+
chain: tempoLocalnet,
|
|
170
|
+
transport: http('http://127.0.0.1'),
|
|
171
|
+
})
|
|
172
|
+
const method = chargeWithMockedActions({
|
|
173
|
+
account,
|
|
174
|
+
autoSwap: true,
|
|
175
|
+
getClient: () => client,
|
|
176
|
+
resolveAccount(info) {
|
|
177
|
+
calls.push(info)
|
|
178
|
+
return selectedAccount
|
|
179
|
+
},
|
|
180
|
+
})
|
|
181
|
+
|
|
182
|
+
const credential = Credential.deserialize(
|
|
183
|
+
await method.createCredential({
|
|
184
|
+
challenge: createChallenge({ amount: '1', chainId, supportedModes: ['pull'] }),
|
|
185
|
+
context: {},
|
|
186
|
+
}),
|
|
187
|
+
)
|
|
188
|
+
|
|
189
|
+
expect(calls).toHaveLength(1)
|
|
190
|
+
expect(calls[0]!.operation.kind).toBe('executeCalls')
|
|
191
|
+
if (calls[0]!.operation.kind !== 'executeCalls') throw new Error('expected executeCalls')
|
|
192
|
+
expect(calls[0]!.operation.calls).toBeUndefined()
|
|
193
|
+
expect(findCalls).toHaveBeenCalledOnce()
|
|
194
|
+
expect(findCalls.mock.calls[0]?.[1].account).toBe(selectedAccount.address)
|
|
195
|
+
expect(credential.payload).toEqual({ signature: '0xdeadbeef', type: 'transaction' })
|
|
196
|
+
} finally {
|
|
197
|
+
vi.doUnmock('viem/actions')
|
|
198
|
+
vi.doUnmock('../internal/auto-swap.js')
|
|
199
|
+
vi.resetModules()
|
|
200
|
+
}
|
|
201
|
+
})
|
|
202
|
+
|
|
203
|
+
test('zero-amount proof binds to the root payer for an access-key account', async () => {
|
|
204
|
+
vi.resetModules()
|
|
205
|
+
// Capture the typed data so we can assert what the proof commits to.
|
|
206
|
+
let signedTypedData: { message: { account: string } } | undefined
|
|
207
|
+
const signTypedData = vi.fn(async (_client: unknown, parameters: typeof signedTypedData) => {
|
|
208
|
+
signedTypedData = parameters
|
|
209
|
+
return '0xdeadbeef'
|
|
210
|
+
})
|
|
211
|
+
vi.doMock('viem/actions', () => ({
|
|
212
|
+
prepareTransactionRequest: vi.fn(),
|
|
213
|
+
sendCallsSync: vi.fn(),
|
|
214
|
+
signTransaction: vi.fn(),
|
|
215
|
+
signTypedData,
|
|
216
|
+
}))
|
|
217
|
+
|
|
218
|
+
try {
|
|
219
|
+
const { charge: chargeWithMockedActions } = await import('./Charge.js')
|
|
220
|
+
const chainId = 42431
|
|
221
|
+
// An access-key account signs with its own key but reports the root
|
|
222
|
+
// account as `address`; the proof must bind to that root payer.
|
|
223
|
+
const accessKey = Account.fromSecp256k1(Secp256k1.randomPrivateKey(), {
|
|
224
|
+
access: account,
|
|
225
|
+
})
|
|
226
|
+
expect(accessKey.address).toBe(account.address)
|
|
227
|
+
expect(accessKey.accessKeyAddress).not.toBe(account.address)
|
|
228
|
+
|
|
229
|
+
const client = createClient({
|
|
230
|
+
account: accessKey,
|
|
231
|
+
chain: tempoLocalnet,
|
|
232
|
+
transport: http('http://127.0.0.1'),
|
|
233
|
+
})
|
|
234
|
+
const resolveAccount = vi.fn()
|
|
235
|
+
const method = chargeWithMockedActions({
|
|
236
|
+
account: accessKey,
|
|
237
|
+
getClient: () => client,
|
|
238
|
+
resolveAccount,
|
|
239
|
+
})
|
|
240
|
+
|
|
241
|
+
const credential = Credential.deserialize(
|
|
242
|
+
await method.createCredential({
|
|
243
|
+
challenge: createChallenge({ chainId }),
|
|
244
|
+
context: {},
|
|
245
|
+
}),
|
|
246
|
+
)
|
|
247
|
+
|
|
248
|
+
expect(signTypedData).toHaveBeenCalledOnce()
|
|
249
|
+
expect(resolveAccount).not.toHaveBeenCalled()
|
|
250
|
+
expect(signedTypedData?.message.account).toBe(account.address)
|
|
251
|
+
expect(credential.payload).toEqual({ signature: '0xdeadbeef', type: 'proof' })
|
|
252
|
+
expect(credential.source).toBe(`did:pkh:eip155:${chainId}:${account.address}`)
|
|
253
|
+
} finally {
|
|
254
|
+
vi.doUnmock('viem/actions')
|
|
255
|
+
vi.resetModules()
|
|
256
|
+
}
|
|
257
|
+
})
|
|
258
|
+
|
|
86
259
|
test('uses challenge chainId for non-zero transaction source', async () => {
|
|
87
260
|
vi.resetModules()
|
|
88
261
|
const prepareTransactionRequest = vi.fn(async () => ({}))
|
|
@@ -123,4 +296,89 @@ describe('tempo.charge client', () => {
|
|
|
123
296
|
vi.resetModules()
|
|
124
297
|
}
|
|
125
298
|
})
|
|
299
|
+
|
|
300
|
+
describe('chain pinning', () => {
|
|
301
|
+
const client = createClient({
|
|
302
|
+
account,
|
|
303
|
+
chain: tempoLocalnet,
|
|
304
|
+
transport: http('http://127.0.0.1'),
|
|
305
|
+
})
|
|
306
|
+
|
|
307
|
+
test('rejects a challenge whose chainId conflicts with the pin', async () => {
|
|
308
|
+
const getClient = vi.fn(() => client)
|
|
309
|
+
const method = charge({
|
|
310
|
+
account,
|
|
311
|
+
expectedChainId: 42431,
|
|
312
|
+
getClient,
|
|
313
|
+
})
|
|
314
|
+
|
|
315
|
+
await expect(
|
|
316
|
+
method.createCredential({
|
|
317
|
+
challenge: createChallenge({ chainId: 1 }),
|
|
318
|
+
context: {},
|
|
319
|
+
}),
|
|
320
|
+
).rejects.toThrow('Chain ID mismatch: expected 42431, got 1.')
|
|
321
|
+
|
|
322
|
+
// The mismatch is rejected before resolving a client or signing.
|
|
323
|
+
expect(getClient).not.toHaveBeenCalled()
|
|
324
|
+
})
|
|
325
|
+
|
|
326
|
+
test('accepts a challenge whose chainId matches the pin', async () => {
|
|
327
|
+
const chainId = 42431
|
|
328
|
+
const method = charge({
|
|
329
|
+
account,
|
|
330
|
+
expectedChainId: chainId,
|
|
331
|
+
getClient: () => client,
|
|
332
|
+
})
|
|
333
|
+
|
|
334
|
+
const credential = Credential.deserialize(
|
|
335
|
+
await method.createCredential({
|
|
336
|
+
challenge: createChallenge({ chainId }),
|
|
337
|
+
context: {},
|
|
338
|
+
}),
|
|
339
|
+
)
|
|
340
|
+
|
|
341
|
+
expect(credential.source).toBe(`did:pkh:eip155:${chainId}:${account.address}`)
|
|
342
|
+
})
|
|
343
|
+
|
|
344
|
+
test('signs on the pin when the challenge omits chainId', async () => {
|
|
345
|
+
let requestedChainId: number | undefined
|
|
346
|
+
const chainId = 42431
|
|
347
|
+
const method = charge({
|
|
348
|
+
account,
|
|
349
|
+
expectedChainId: chainId,
|
|
350
|
+
getClient: (parameters) => {
|
|
351
|
+
requestedChainId = parameters.chainId
|
|
352
|
+
return client
|
|
353
|
+
},
|
|
354
|
+
})
|
|
355
|
+
|
|
356
|
+
const credential = Credential.deserialize(
|
|
357
|
+
await method.createCredential({
|
|
358
|
+
challenge: createChallenge(),
|
|
359
|
+
context: {},
|
|
360
|
+
}),
|
|
361
|
+
)
|
|
362
|
+
|
|
363
|
+
expect(requestedChainId).toBe(chainId)
|
|
364
|
+
expect(credential.source).toBe(`did:pkh:eip155:${chainId}:${account.address}`)
|
|
365
|
+
})
|
|
366
|
+
|
|
367
|
+
test('unpinned client accepts any challenge chainId', async () => {
|
|
368
|
+
const chainId = 1
|
|
369
|
+
const method = charge({
|
|
370
|
+
account,
|
|
371
|
+
getClient: () => client,
|
|
372
|
+
})
|
|
373
|
+
|
|
374
|
+
const credential = Credential.deserialize(
|
|
375
|
+
await method.createCredential({
|
|
376
|
+
challenge: createChallenge({ chainId }),
|
|
377
|
+
context: {},
|
|
378
|
+
}),
|
|
379
|
+
)
|
|
380
|
+
|
|
381
|
+
expect(credential.source).toBe(`did:pkh:eip155:${chainId}:${account.address}`)
|
|
382
|
+
})
|
|
383
|
+
})
|
|
126
384
|
})
|
|
@@ -20,6 +20,20 @@ import * as Charge_internal from '../internal/charge.js'
|
|
|
20
20
|
import * as defaults from '../internal/defaults.js'
|
|
21
21
|
import * as Proof from '../internal/proof.js'
|
|
22
22
|
import * as Methods from '../Methods.js'
|
|
23
|
+
import type * as AccountResolution from './ResolveAccount.js'
|
|
24
|
+
|
|
25
|
+
/** Runtime context accepted by the Tempo charge client method. */
|
|
26
|
+
export type ChargeContext = {
|
|
27
|
+
account?: Account.getResolver.Parameters['account'] | undefined
|
|
28
|
+
autoSwap?: AutoSwap.resolve.Value | undefined
|
|
29
|
+
mode?: Methods.ChargeMode | undefined
|
|
30
|
+
}
|
|
31
|
+
|
|
32
|
+
const chargeContextSchema = z.object({
|
|
33
|
+
account: z.optional(z.custom<ChargeContext['account']>()),
|
|
34
|
+
autoSwap: z.optional(z.custom<ChargeContext['autoSwap']>()),
|
|
35
|
+
mode: z.optional(z.enum(Methods.chargeModes)),
|
|
36
|
+
})
|
|
23
37
|
|
|
24
38
|
/**
|
|
25
39
|
* Creates a Tempo charge method intent for usage on the client.
|
|
@@ -44,37 +58,50 @@ export function charge(parameters: charge.Parameters = {}) {
|
|
|
44
58
|
const getAccount = Account.getResolver({ account: parameters.account })
|
|
45
59
|
|
|
46
60
|
return Method.toClient(Methods.charge, {
|
|
47
|
-
context:
|
|
48
|
-
account: z.optional(z.custom<Account.getResolver.Parameters['account']>()),
|
|
49
|
-
autoSwap: z.optional(z.custom<charge.AutoSwap>()),
|
|
50
|
-
mode: z.optional(z.enum(Methods.chargeModes)),
|
|
51
|
-
}),
|
|
61
|
+
context: chargeContextSchema,
|
|
52
62
|
|
|
53
63
|
async createCredential({ challenge, context }) {
|
|
64
|
+
// Chain pinning: reject a challenge whose chain ID conflicts with the
|
|
65
|
+
// pinned one, and sign on the pin when the challenge omits a chain ID.
|
|
54
66
|
const challengeChainId = challenge.request.methodDetails?.chainId
|
|
55
|
-
|
|
56
|
-
|
|
67
|
+
if (
|
|
68
|
+
parameters.expectedChainId !== undefined &&
|
|
69
|
+
challengeChainId !== undefined &&
|
|
70
|
+
challengeChainId !== parameters.expectedChainId
|
|
71
|
+
)
|
|
72
|
+
throw new Error(
|
|
73
|
+
`Chain ID mismatch: expected ${parameters.expectedChainId}, got ${challengeChainId}.`,
|
|
74
|
+
)
|
|
75
|
+
const resolvedChainId = challengeChainId ?? parameters.expectedChainId
|
|
76
|
+
const client = await getClient({ chainId: resolvedChainId })
|
|
77
|
+
const chainId = resolvedChainId ?? client.chain?.id
|
|
57
78
|
if (chainId === undefined)
|
|
58
79
|
throw new Error('No `chainId` provided. Pass a chain ID in the challenge or client.')
|
|
59
80
|
|
|
60
|
-
const account = getAccount(client, context)
|
|
61
|
-
|
|
62
81
|
const { request } = challenge
|
|
63
82
|
const { amount, methodDetails } = request
|
|
83
|
+
const supportedModes = (methodDetails?.supportedModes as
|
|
84
|
+
| readonly Methods.ChargeMode[]
|
|
85
|
+
| undefined) ?? ['pull', 'push']
|
|
86
|
+
const defaultAccount = getAccount(client, context)
|
|
64
87
|
|
|
65
88
|
// Zero-amount: sign EIP-712 typed data instead of creating a transaction.
|
|
66
89
|
if (BigInt(amount) === 0n) {
|
|
67
90
|
const signature = await signTypedData(client, {
|
|
68
|
-
account,
|
|
69
|
-
|
|
70
|
-
|
|
71
|
-
|
|
72
|
-
|
|
91
|
+
account: defaultAccount,
|
|
92
|
+
// `account` here is the signing account; the proof's bound payer is
|
|
93
|
+
// `account.address` (echoed in the credential `source` below).
|
|
94
|
+
...Proof.typedData({
|
|
95
|
+
account: defaultAccount.address,
|
|
96
|
+
chainId,
|
|
97
|
+
challengeId: challenge.id,
|
|
98
|
+
realm: challenge.realm,
|
|
99
|
+
}),
|
|
73
100
|
})
|
|
74
101
|
return Credential.serialize({
|
|
75
102
|
challenge,
|
|
76
103
|
payload: { signature, type: 'proof' },
|
|
77
|
-
source: Proof.proofSource({ address:
|
|
104
|
+
source: Proof.proofSource({ address: defaultAccount.address, chainId }),
|
|
78
105
|
})
|
|
79
106
|
}
|
|
80
107
|
|
|
@@ -89,22 +116,6 @@ export function charge(parameters: charge.Parameters = {}) {
|
|
|
89
116
|
}
|
|
90
117
|
}
|
|
91
118
|
}
|
|
92
|
-
const supportedModes = (methodDetails?.supportedModes as
|
|
93
|
-
| readonly Methods.ChargeMode[]
|
|
94
|
-
| undefined) ?? ['pull', 'push']
|
|
95
|
-
const mode = (() => {
|
|
96
|
-
const explicitMode = context?.mode ?? parameters.mode
|
|
97
|
-
if (explicitMode) {
|
|
98
|
-
if (!supportedModes.includes(explicitMode))
|
|
99
|
-
throw new Error(`Challenge does not support ${explicitMode} mode.`)
|
|
100
|
-
return explicitMode
|
|
101
|
-
}
|
|
102
|
-
|
|
103
|
-
const preferredMode = account.type === 'json-rpc' ? 'push' : 'pull'
|
|
104
|
-
if (supportedModes.includes(preferredMode)) return preferredMode
|
|
105
|
-
return supportedModes[0]!
|
|
106
|
-
})()
|
|
107
|
-
|
|
108
119
|
const memo = methodDetails?.memo
|
|
109
120
|
? (methodDetails.memo as Hex.Hex)
|
|
110
121
|
: Attribution.encode({ challengeId: challenge.id, clientId, serverId: challenge.realm })
|
|
@@ -116,13 +127,14 @@ export function charge(parameters: charge.Parameters = {}) {
|
|
|
116
127
|
},
|
|
117
128
|
recipient: request.recipient as Address,
|
|
118
129
|
})
|
|
119
|
-
const transferCalls = transfers.map(
|
|
120
|
-
|
|
121
|
-
|
|
122
|
-
|
|
123
|
-
|
|
124
|
-
|
|
125
|
-
|
|
130
|
+
const transferCalls = transfers.map(
|
|
131
|
+
(transfer): AccountResolution.ResolveAccountCall =>
|
|
132
|
+
Actions.token.transfer.call({
|
|
133
|
+
amount: BigInt(transfer.amount),
|
|
134
|
+
...(transfer.memo && { memo: transfer.memo as Hex.Hex }),
|
|
135
|
+
to: transfer.recipient as Address,
|
|
136
|
+
token: currency,
|
|
137
|
+
}) as AccountResolution.ResolveAccountCall,
|
|
126
138
|
)
|
|
127
139
|
|
|
128
140
|
const autoSwap = AutoSwap.resolve(
|
|
@@ -130,6 +142,29 @@ export function charge(parameters: charge.Parameters = {}) {
|
|
|
130
142
|
AutoSwap.defaultCurrencies,
|
|
131
143
|
)
|
|
132
144
|
|
|
145
|
+
const account =
|
|
146
|
+
(await parameters.resolveAccount?.({
|
|
147
|
+
account: defaultAccount,
|
|
148
|
+
chainId,
|
|
149
|
+
operation: {
|
|
150
|
+
kind: 'executeCalls',
|
|
151
|
+
...(autoSwap ? {} : { calls: transferCalls }),
|
|
152
|
+
},
|
|
153
|
+
})) ?? defaultAccount
|
|
154
|
+
|
|
155
|
+
const mode = (() => {
|
|
156
|
+
const explicitMode = context?.mode ?? parameters.mode
|
|
157
|
+
if (explicitMode) {
|
|
158
|
+
if (!supportedModes.includes(explicitMode))
|
|
159
|
+
throw new Error(`Challenge does not support ${explicitMode} mode.`)
|
|
160
|
+
return explicitMode
|
|
161
|
+
}
|
|
162
|
+
|
|
163
|
+
const preferredMode = account.type === 'json-rpc' ? 'push' : 'pull'
|
|
164
|
+
if (supportedModes.includes(preferredMode)) return preferredMode
|
|
165
|
+
return supportedModes[0]!
|
|
166
|
+
})()
|
|
167
|
+
|
|
133
168
|
const swapCalls = autoSwap
|
|
134
169
|
? await AutoSwap.findCalls(client, {
|
|
135
170
|
account: account.address,
|
|
@@ -187,6 +222,9 @@ export function charge(parameters: charge.Parameters = {}) {
|
|
|
187
222
|
|
|
188
223
|
export declare namespace charge {
|
|
189
224
|
type AutoSwap = AutoSwap.resolve.Value
|
|
225
|
+
type Context = ChargeContext
|
|
226
|
+
type ResolveAccount = AccountResolution.ResolveAccount
|
|
227
|
+
type ResolveAccountInfo = AccountResolution.ResolveAccountInfo
|
|
190
228
|
|
|
191
229
|
type Parameters = {
|
|
192
230
|
/**
|
|
@@ -198,6 +236,12 @@ export declare namespace charge {
|
|
|
198
236
|
autoSwap?: AutoSwap | undefined
|
|
199
237
|
/** Client identifier used to derive the client fingerprint in attribution memos. */
|
|
200
238
|
clientId?: string | undefined
|
|
239
|
+
/**
|
|
240
|
+
* Chain ID this client is willing to pay on. When set, the client rejects
|
|
241
|
+
* any challenge whose `methodDetails.chainId` differs, and signs on this
|
|
242
|
+
* chain when the challenge omits a chain ID.
|
|
243
|
+
*/
|
|
244
|
+
expectedChainId?: number | undefined
|
|
201
245
|
/**
|
|
202
246
|
* Allowlist of expected split recipient addresses. When set, the client
|
|
203
247
|
* rejects any challenge whose split recipients are not in this list.
|
|
@@ -215,6 +259,8 @@ export declare namespace charge {
|
|
|
215
259
|
* @default `'push'` for JSON-RPC accounts, `'pull'` for local accounts.
|
|
216
260
|
*/
|
|
217
261
|
mode?: Methods.ChargeMode | undefined
|
|
262
|
+
/** Selects the account that signs this charge after the challenge and chain are known. */
|
|
263
|
+
resolveAccount?: ResolveAccount | undefined
|
|
218
264
|
} & Account.getResolver.Parameters &
|
|
219
265
|
Client.getResolver.Parameters
|
|
220
266
|
}
|
|
@@ -1,31 +1,45 @@
|
|
|
1
|
+
import {
|
|
2
|
+
session as sessionLegacyIntent_,
|
|
3
|
+
sessionManager as sessionLegacy_,
|
|
4
|
+
} from '../legacy/client/index.js'
|
|
5
|
+
import { session as sessionMethod_ } from '../session/client/Session.js'
|
|
6
|
+
import { sessionManager as session_ } from '../session/client/SessionManager.js'
|
|
1
7
|
import { charge as charge_ } from './Charge.js'
|
|
2
|
-
import { session as sessionIntent_ } from './Session.js'
|
|
3
|
-
import { sessionManager as session_ } from './SessionManager.js'
|
|
4
8
|
import { subscription as subscription_ } from './Subscription.js'
|
|
5
9
|
|
|
10
|
+
const sessionClient = Object.assign(sessionMethod_, { manager: session_ })
|
|
11
|
+
const sessionLegacyClient = Object.assign(sessionLegacy_, { method: sessionLegacyIntent_ })
|
|
12
|
+
|
|
13
|
+
/** Creates a TIP-1034 client method, with explicit managed lifecycle helpers attached. */
|
|
14
|
+
export { sessionClient as session }
|
|
15
|
+
|
|
6
16
|
/**
|
|
7
|
-
* Creates
|
|
17
|
+
* Creates the common Tempo `charge` and `session` client methods from shared parameters.
|
|
8
18
|
*
|
|
9
19
|
* @example
|
|
10
20
|
* ```ts
|
|
11
21
|
* import { Mppx, tempo } from 'mppx/client'
|
|
12
22
|
*
|
|
13
23
|
* const mppx = Mppx.create({
|
|
14
|
-
* methods: [tempo({ account })],
|
|
24
|
+
* methods: [tempo.common({ account })],
|
|
15
25
|
* })
|
|
16
26
|
* ```
|
|
17
27
|
*/
|
|
18
28
|
export function tempo(parameters: tempo.Parameters = {}) {
|
|
19
|
-
return [charge_(parameters),
|
|
29
|
+
return [charge_(parameters), sessionClient(parameters)] as const
|
|
20
30
|
}
|
|
21
31
|
|
|
22
32
|
export namespace tempo {
|
|
23
|
-
export type Parameters = charge_.Parameters &
|
|
33
|
+
export type Parameters = charge_.Parameters & sessionMethod_.Parameters
|
|
24
34
|
|
|
25
35
|
/** Creates a Tempo `charge` client method for one-time TIP-20 token transfers. */
|
|
26
36
|
export const charge = charge_
|
|
27
|
-
/** Creates
|
|
28
|
-
export const
|
|
37
|
+
/** Creates the common Tempo `charge` and `session` client methods from shared parameters. */
|
|
38
|
+
export const common = tempo
|
|
39
|
+
/** Creates a TIP-1034 client method for Mppx registration. Use `tempo.session.manager()` for direct lifecycle control. */
|
|
40
|
+
export const session = sessionClient
|
|
41
|
+
/** @deprecated Use `tempo.session()` for the TIP-1034 session client method. */
|
|
42
|
+
export const sessionLegacy = sessionLegacyClient
|
|
29
43
|
/** Creates a Tempo `subscription` client method for recurring TIP-20 payments. */
|
|
30
44
|
export const subscription = subscription_
|
|
31
45
|
}
|
|
@@ -0,0 +1,46 @@
|
|
|
1
|
+
import type * as Hex from 'ox/Hex'
|
|
2
|
+
import type { Account, Address } from 'viem'
|
|
3
|
+
|
|
4
|
+
import type { MaybePromise } from '../../internal/types.js'
|
|
5
|
+
|
|
6
|
+
/** Resolves the account that should satisfy an mppx account operation. */
|
|
7
|
+
export type ResolveAccount = (info: ResolveAccountInfo) => MaybePromise<Account | undefined>
|
|
8
|
+
|
|
9
|
+
/** Account-resolution details for a client credential operation. */
|
|
10
|
+
export type ResolveAccountInfo = {
|
|
11
|
+
/** Account mppx will use when the hook returns `undefined`. */
|
|
12
|
+
account: Account
|
|
13
|
+
/** EIP-155 chain ID used for the operation. */
|
|
14
|
+
chainId: number
|
|
15
|
+
/** Capability the selected account must satisfy. */
|
|
16
|
+
operation: ResolveAccountOperation
|
|
17
|
+
}
|
|
18
|
+
|
|
19
|
+
/** Capability an mppx-selected account must satisfy. */
|
|
20
|
+
export type ResolveAccountOperation =
|
|
21
|
+
| {
|
|
22
|
+
kind: 'executeCalls'
|
|
23
|
+
/**
|
|
24
|
+
* Exact EVM calls the selected account will execute.
|
|
25
|
+
*
|
|
26
|
+
* Omitted when the calls depend on which account is selected, such as
|
|
27
|
+
* account-balance-dependent auto-swap routing.
|
|
28
|
+
*/
|
|
29
|
+
calls?: readonly ResolveAccountCall[] | undefined
|
|
30
|
+
}
|
|
31
|
+
| {
|
|
32
|
+
kind: 'authorizePaymentChannel'
|
|
33
|
+
/**
|
|
34
|
+
* Signer required by an existing reusable channel. Omitted when opening
|
|
35
|
+
* a new channel or when no existing channel has fixed a signer yet.
|
|
36
|
+
*/
|
|
37
|
+
authority?: Address | undefined
|
|
38
|
+
}
|
|
39
|
+
|
|
40
|
+
/** EVM call data used by account resolvers for scoped account selection. */
|
|
41
|
+
export type ResolveAccountCall = {
|
|
42
|
+
/** Contract address being called. */
|
|
43
|
+
to: Address
|
|
44
|
+
/** Calldata being sent. */
|
|
45
|
+
data: Hex.Hex
|
|
46
|
+
}
|
|
@@ -1,6 +1,17 @@
|
|
|
1
1
|
export { charge } from './Charge.js'
|
|
2
|
-
export { tempo } from './Methods.js'
|
|
3
|
-
export { session } from '
|
|
2
|
+
export { session, tempo } from './Methods.js'
|
|
3
|
+
export { session as sessionLegacy } from '../legacy/client/index.js'
|
|
4
4
|
export { subscription } from './Subscription.js'
|
|
5
|
-
export type {
|
|
6
|
-
|
|
5
|
+
export type {
|
|
6
|
+
PaymentResponse as SessionLegacyPaymentResponse,
|
|
7
|
+
SessionManager as SessionLegacyManager,
|
|
8
|
+
} from '../legacy/client/index.js'
|
|
9
|
+
export { sessionManager as sessionLegacyManager } from '../legacy/client/index.js'
|
|
10
|
+
export { session as sessionMethod } from '../session/client/Session.js'
|
|
11
|
+
export type {
|
|
12
|
+
PaymentResponse,
|
|
13
|
+
SessionManager,
|
|
14
|
+
SessionManagerSseOptions,
|
|
15
|
+
SessionManagerWebSocketOptions,
|
|
16
|
+
} from '../session/client/SessionManager.js'
|
|
17
|
+
export { sessionManager } from '../session/client/SessionManager.js'
|