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
|
@@ -0,0 +1,799 @@
|
|
|
1
|
+
import {
|
|
2
|
+
isAddress,
|
|
3
|
+
parseUnits,
|
|
4
|
+
type Account as ViemAccount,
|
|
5
|
+
type Address,
|
|
6
|
+
type Client,
|
|
7
|
+
type Hex,
|
|
8
|
+
} from 'viem'
|
|
9
|
+
|
|
10
|
+
import type * as Challenge from '../../../Challenge.js'
|
|
11
|
+
import * as Constants from '../../../Constants.js'
|
|
12
|
+
import * as Account from '../../../viem/Account.js'
|
|
13
|
+
import * as z from '../../../zod.js'
|
|
14
|
+
import * as Chain from '../precompile/Chain.js'
|
|
15
|
+
import * as Channel from '../precompile/Channel.js'
|
|
16
|
+
import type { SessionCredentialPayload } from '../precompile/Protocol.js'
|
|
17
|
+
import type { SessionSnapshot } from '../Snapshot.js'
|
|
18
|
+
import {
|
|
19
|
+
createClosePayload,
|
|
20
|
+
createOpenPayload,
|
|
21
|
+
createTopUpPayload,
|
|
22
|
+
createVoucherPayload,
|
|
23
|
+
isSameAddress,
|
|
24
|
+
resolveAuthorizedSigner,
|
|
25
|
+
resolveEscrow,
|
|
26
|
+
type ChannelEntry,
|
|
27
|
+
} from './ChannelOps.js'
|
|
28
|
+
import { channelKey, entryKey, type ChannelSink } from './ChannelStore.js'
|
|
29
|
+
import { assertWithinMaxDeposit, resolveOpeningDeposit } from './Runtime.js'
|
|
30
|
+
|
|
31
|
+
/** Credential payload variants that carry cumulative voucher authorization. */
|
|
32
|
+
export type CumulativeCredentialPayload = Extract<
|
|
33
|
+
SessionCredentialPayload,
|
|
34
|
+
{ cumulativeAmount: string }
|
|
35
|
+
>
|
|
36
|
+
|
|
37
|
+
/** Returns whether a credential payload carries cumulative voucher authorization. */
|
|
38
|
+
export function hasCredentialCumulativeAmount(
|
|
39
|
+
payload: SessionCredentialPayload,
|
|
40
|
+
): payload is CumulativeCredentialPayload {
|
|
41
|
+
return 'cumulativeAmount' in payload
|
|
42
|
+
}
|
|
43
|
+
|
|
44
|
+
/** Reads cumulative authorization from a credential payload when the action carries one. */
|
|
45
|
+
export function readCredentialCumulativeAmount(
|
|
46
|
+
payload: SessionCredentialPayload,
|
|
47
|
+
): bigint | undefined {
|
|
48
|
+
if (!hasCredentialCumulativeAmount(payload)) return undefined
|
|
49
|
+
return BigInt(payload.cumulativeAmount)
|
|
50
|
+
}
|
|
51
|
+
|
|
52
|
+
/**
|
|
53
|
+
* Persists a channel entry through the sink and notifies observers. Closed
|
|
54
|
+
* channels are removed from the store but still reported to observers so callers
|
|
55
|
+
* can react to the close.
|
|
56
|
+
*/
|
|
57
|
+
async function storeChannelEntry(sink: ChannelSink, entry: ChannelEntry): Promise<void> {
|
|
58
|
+
if (entry.opened) await sink.store.set(entry)
|
|
59
|
+
else await sink.store.delete(entryKey(entry))
|
|
60
|
+
sink.notifyUpdate(entry)
|
|
61
|
+
}
|
|
62
|
+
|
|
63
|
+
/** Applies a credential payload's cumulative amount to the stored channel at `key`. */
|
|
64
|
+
async function applyCumulative(
|
|
65
|
+
sink: ChannelSink,
|
|
66
|
+
key: string,
|
|
67
|
+
payload: SessionCredentialPayload,
|
|
68
|
+
): Promise<void> {
|
|
69
|
+
const cumulativeAmount = readCredentialCumulativeAmount(payload)
|
|
70
|
+
if (cumulativeAmount === undefined) return
|
|
71
|
+
const entry = await sink.store.get(key)
|
|
72
|
+
if (!entry) return
|
|
73
|
+
if (entry.channelId.toLowerCase() !== payload.channelId.toLowerCase()) return
|
|
74
|
+
entry.cumulativeAmount =
|
|
75
|
+
entry.cumulativeAmount > cumulativeAmount ? entry.cumulativeAmount : cumulativeAmount
|
|
76
|
+
if (payload.action === 'close') entry.opened = false
|
|
77
|
+
await storeChannelEntry(sink, entry)
|
|
78
|
+
}
|
|
79
|
+
|
|
80
|
+
const hexSchema = z.custom<Hex>(
|
|
81
|
+
(value) => typeof value === 'string' && /^0x[0-9a-fA-F]*$/.test(value),
|
|
82
|
+
)
|
|
83
|
+
const hashSchema = z.custom<Hex>(
|
|
84
|
+
(value) => typeof value === 'string' && /^0x[0-9a-fA-F]{64}$/.test(value),
|
|
85
|
+
)
|
|
86
|
+
|
|
87
|
+
/** Runtime schema for low-level TIP-1034 session credential context. */
|
|
88
|
+
export const sessionContextSchema = z.object({
|
|
89
|
+
account: z.optional(z.custom<Account.getResolver.Parameters['account']>()),
|
|
90
|
+
action: z.optional(z.enum(['open', 'topUp', 'voucher', 'close'])),
|
|
91
|
+
channelId: z.optional(hashSchema),
|
|
92
|
+
cumulativeAmount: z.optional(z.amount()),
|
|
93
|
+
cumulativeAmountRaw: z.optional(z.string()),
|
|
94
|
+
transaction: z.optional(hexSchema),
|
|
95
|
+
descriptor: z.optional(z.custom<Channel.ChannelDescriptor>()),
|
|
96
|
+
additionalDeposit: z.optional(z.amount()),
|
|
97
|
+
additionalDepositRaw: z.optional(z.string()),
|
|
98
|
+
depositRaw: z.optional(z.string()),
|
|
99
|
+
})
|
|
100
|
+
|
|
101
|
+
/** Low-level context accepted by `tempo.session()` for manual credentials. */
|
|
102
|
+
export type SessionContext = {
|
|
103
|
+
/** Optional account override used for this credential only. */
|
|
104
|
+
account?: Account.getResolver.Parameters['account'] | undefined
|
|
105
|
+
/** Manual credential action. Omit for automatic open/recover/voucher management. */
|
|
106
|
+
action?: 'open' | 'topUp' | 'voucher' | 'close' | undefined
|
|
107
|
+
/** Channel ID being reused or manually operated on. */
|
|
108
|
+
channelId?: Hex | undefined
|
|
109
|
+
/** Human-readable cumulative voucher authorization, parsed with configured decimals. */
|
|
110
|
+
cumulativeAmount?: string | undefined
|
|
111
|
+
/** Raw cumulative voucher authorization. Takes precedence over `cumulativeAmount`. */
|
|
112
|
+
cumulativeAmountRaw?: string | undefined
|
|
113
|
+
/** Signed Tempo transaction for manual open/top-up credentials. */
|
|
114
|
+
transaction?: Hex | undefined
|
|
115
|
+
/** TIP-1034 descriptor required for recovery and manual credentials. */
|
|
116
|
+
descriptor?: Channel.ChannelDescriptor | undefined
|
|
117
|
+
/** Human-readable additional top-up deposit, parsed with configured decimals. */
|
|
118
|
+
additionalDeposit?: string | undefined
|
|
119
|
+
/** Raw additional top-up deposit. Takes precedence over `additionalDeposit`. */
|
|
120
|
+
additionalDepositRaw?: string | undefined
|
|
121
|
+
/** Raw opening deposit override for automatic open credentials. */
|
|
122
|
+
depositRaw?: string | undefined
|
|
123
|
+
}
|
|
124
|
+
|
|
125
|
+
/** Manual low-level TIP-1034 session action name. */
|
|
126
|
+
export type SessionAction = NonNullable<SessionContext['action']>
|
|
127
|
+
|
|
128
|
+
/** Context amount fields that may be supplied as human-readable or raw token units. */
|
|
129
|
+
export type SessionAmountField = 'additionalDeposit' | 'cumulativeAmount'
|
|
130
|
+
|
|
131
|
+
/** Session context narrowed to an explicit manual action. */
|
|
132
|
+
export type ManualSessionContext = SessionContext & { action: SessionAction }
|
|
133
|
+
|
|
134
|
+
/** Manual session action context after the required channel descriptor is present. */
|
|
135
|
+
export type ManualSessionDescriptorContext = ManualSessionContext & {
|
|
136
|
+
/** TIP-1034 channel descriptor used by manual open/top-up/voucher/close actions. */
|
|
137
|
+
descriptor: Channel.ChannelDescriptor
|
|
138
|
+
}
|
|
139
|
+
|
|
140
|
+
/** Session context narrowed to a recoverable TIP-1034 channel descriptor. */
|
|
141
|
+
export type DescriptorSessionContext = SessionContext & { descriptor: Channel.ChannelDescriptor }
|
|
142
|
+
|
|
143
|
+
/** Returns whether a session context contains an explicit manual action. */
|
|
144
|
+
export function hasSessionAction(
|
|
145
|
+
context: SessionContext | undefined,
|
|
146
|
+
): context is ManualSessionContext {
|
|
147
|
+
return context?.action !== undefined
|
|
148
|
+
}
|
|
149
|
+
|
|
150
|
+
/** Returns whether a context is a manual action with the descriptor required to execute it. */
|
|
151
|
+
export function hasManualSessionDescriptor(
|
|
152
|
+
context: SessionContext | undefined,
|
|
153
|
+
): context is ManualSessionDescriptorContext {
|
|
154
|
+
return hasSessionAction(context) && context.descriptor !== undefined
|
|
155
|
+
}
|
|
156
|
+
|
|
157
|
+
/** Returns whether a session context contains a recoverable channel descriptor. */
|
|
158
|
+
export function hasSessionDescriptor(
|
|
159
|
+
context: SessionContext | undefined,
|
|
160
|
+
): context is DescriptorSessionContext {
|
|
161
|
+
return context?.descriptor !== undefined
|
|
162
|
+
}
|
|
163
|
+
|
|
164
|
+
/** Parses an optional session context amount, preferring the raw-unit field when present. */
|
|
165
|
+
export function parseOptionalContextAmount(
|
|
166
|
+
context: SessionContext,
|
|
167
|
+
decimals: number,
|
|
168
|
+
field: SessionAmountField,
|
|
169
|
+
): bigint | undefined {
|
|
170
|
+
const raw =
|
|
171
|
+
field === 'additionalDeposit' ? context.additionalDepositRaw : context.cumulativeAmountRaw
|
|
172
|
+
const amount =
|
|
173
|
+
field === 'additionalDeposit' ? context.additionalDeposit : context.cumulativeAmount
|
|
174
|
+
if (raw) return BigInt(raw)
|
|
175
|
+
if (amount) return parseUnits(amount, decimals)
|
|
176
|
+
return undefined
|
|
177
|
+
}
|
|
178
|
+
|
|
179
|
+
/** Parses a required session context amount and throws with action-specific context when absent. */
|
|
180
|
+
export function requireContextAmount(
|
|
181
|
+
context: SessionContext,
|
|
182
|
+
decimals: number,
|
|
183
|
+
field: SessionAmountField,
|
|
184
|
+
action: string,
|
|
185
|
+
): bigint {
|
|
186
|
+
const amount = parseOptionalContextAmount(context, decimals, field)
|
|
187
|
+
if (amount === undefined) throw new Error(`${field} required for ${action} action`)
|
|
188
|
+
return amount
|
|
189
|
+
}
|
|
190
|
+
|
|
191
|
+
/** Tempo-specific details embedded in a `tempo/session` challenge request. */
|
|
192
|
+
export type ClientSessionMethodDetails = {
|
|
193
|
+
/** Chain ID used for voucher domain and channel ID derivation. */
|
|
194
|
+
chainId?: number | undefined
|
|
195
|
+
/** Escrow contract address advertised by the server. */
|
|
196
|
+
escrowContract?: Address | undefined
|
|
197
|
+
/** Legacy escrow hint accepted during migration. */
|
|
198
|
+
escrow?: Address | undefined
|
|
199
|
+
/** Whether the challenge allows fee-sponsored open/top-up transactions. */
|
|
200
|
+
feePayer?: boolean | undefined
|
|
201
|
+
/** Channel operator address advertised by the server. */
|
|
202
|
+
operator?: Address | undefined
|
|
203
|
+
/** Server bootstrap snapshot for a reusable session channel. */
|
|
204
|
+
sessionSnapshot?: SessionSnapshot | undefined
|
|
205
|
+
}
|
|
206
|
+
|
|
207
|
+
/** Dependencies used to resolve a challenge into typed credential-planning data. */
|
|
208
|
+
export type ResolveChallengeContextParameters = {
|
|
209
|
+
/** Challenge received from the 402 response. */
|
|
210
|
+
challenge: Challenge.Challenge
|
|
211
|
+
/** Optional local escrow override. */
|
|
212
|
+
escrowOverride?: Address | undefined
|
|
213
|
+
/** Resolves the viem client for the challenge chain. */
|
|
214
|
+
getClient(parameters: { chainId?: number | undefined }): Client | Promise<Client>
|
|
215
|
+
}
|
|
216
|
+
|
|
217
|
+
/** Reads TIP-1034 channel state for a recovery candidate. */
|
|
218
|
+
export type ReadReusableChannelState = (
|
|
219
|
+
client: Client,
|
|
220
|
+
channelId: Hex,
|
|
221
|
+
escrow: Address,
|
|
222
|
+
) => Promise<Chain.ChannelState>
|
|
223
|
+
|
|
224
|
+
/** Expected request fields used to prove a descriptor belongs to the current challenge. */
|
|
225
|
+
export type ReusableChannelExpectation = {
|
|
226
|
+
/** Chain ID used in the TIP-1034 channel ID derivation. */
|
|
227
|
+
chainId: number
|
|
228
|
+
/** Escrow precompile address used in the TIP-1034 channel ID derivation. */
|
|
229
|
+
escrow: Address
|
|
230
|
+
/** Payee expected by the current challenge. */
|
|
231
|
+
payee: Address
|
|
232
|
+
/** Payer address controlled by the local account. */
|
|
233
|
+
payer: Address
|
|
234
|
+
/** Voucher authority resolved from the local account. */
|
|
235
|
+
authorizedSigner: Address
|
|
236
|
+
/** Token expected by the current challenge. */
|
|
237
|
+
token: Address
|
|
238
|
+
}
|
|
239
|
+
|
|
240
|
+
/** Inputs for validating and loading an existing precompile session channel. */
|
|
241
|
+
export type ResolveReusableChannelParameters = {
|
|
242
|
+
/** Optional caller/server supplied channel ID. Must match the descriptor-derived ID. */
|
|
243
|
+
channelId?: string | undefined
|
|
244
|
+
/** Viem client used to read on-chain channel state. */
|
|
245
|
+
client: Client
|
|
246
|
+
/** Descriptor required by TIP-1034 vouchers and management transactions. */
|
|
247
|
+
descriptor: Channel.ChannelDescriptor
|
|
248
|
+
/** Expected challenge fields the descriptor must match. */
|
|
249
|
+
expected: ReusableChannelExpectation
|
|
250
|
+
/** Optional state reader for tests or custom clients. Defaults to `Chain.getChannelState`. */
|
|
251
|
+
readChannelState?: ReadReusableChannelState | undefined
|
|
252
|
+
}
|
|
253
|
+
|
|
254
|
+
/** Validated reusable channel data. */
|
|
255
|
+
export type ReusableChannel = {
|
|
256
|
+
/** Descriptor-derived TIP-1034 channel ID. */
|
|
257
|
+
channelId: Hex
|
|
258
|
+
/** On-chain channel state proving the channel is open and reusable. */
|
|
259
|
+
state: Chain.ChannelState
|
|
260
|
+
}
|
|
261
|
+
|
|
262
|
+
/** Resolved payment challenge fields used to plan a client-side session credential. */
|
|
263
|
+
export type ChallengeContext = {
|
|
264
|
+
amount: bigint
|
|
265
|
+
challenge: Challenge.Challenge
|
|
266
|
+
chainId: number
|
|
267
|
+
client: Client
|
|
268
|
+
escrow: Address
|
|
269
|
+
feePayer?: boolean | undefined
|
|
270
|
+
key: string
|
|
271
|
+
operator?: Address | undefined
|
|
272
|
+
payee: Address
|
|
273
|
+
snapshot?: SessionSnapshot | undefined
|
|
274
|
+
/** Server-provided raw deposit hint for opening a channel, before local maxDeposit capping. */
|
|
275
|
+
suggestedDepositRaw?: string | undefined
|
|
276
|
+
token: Address
|
|
277
|
+
}
|
|
278
|
+
|
|
279
|
+
/** Inputs used to choose the next client-side session credential operation. */
|
|
280
|
+
export type PlanCredentialParameters = {
|
|
281
|
+
account: ViemAccount
|
|
282
|
+
/** Channel previously stored for this challenge scope, fetched by the caller. */
|
|
283
|
+
entry: ChannelEntry | undefined
|
|
284
|
+
context?: SessionContext | undefined
|
|
285
|
+
decimals: number
|
|
286
|
+
maxDeposit?: bigint | undefined
|
|
287
|
+
resolved: ChallengeContext
|
|
288
|
+
}
|
|
289
|
+
|
|
290
|
+
/** Inputs used to derive reusable-channel recovery context from caller context and server hints. */
|
|
291
|
+
export type ResolveRecoverContextParameters = {
|
|
292
|
+
/** Caller-provided low-level session context, when present. */
|
|
293
|
+
context?: SessionContext | undefined
|
|
294
|
+
/** Server-provided session snapshot, when present. */
|
|
295
|
+
snapshot?: SessionSnapshot | undefined
|
|
296
|
+
}
|
|
297
|
+
|
|
298
|
+
/** Inputs used to choose the next cumulative authorization for a recovered channel. */
|
|
299
|
+
export type ResolveRecoveredCumulativeParameters = {
|
|
300
|
+
/** Caller or stored-channel recovery context. */
|
|
301
|
+
context: DescriptorSessionContext
|
|
302
|
+
/** Token decimals used to parse human-readable context amounts. */
|
|
303
|
+
decimals: number
|
|
304
|
+
/** Current request amount from the active challenge. */
|
|
305
|
+
requestAmount: bigint
|
|
306
|
+
/** Server snapshot for the recovered channel, when present. */
|
|
307
|
+
snapshot?: SessionSnapshot | undefined
|
|
308
|
+
/** On-chain settled amount used when no local/server accounting is available. */
|
|
309
|
+
settled: bigint
|
|
310
|
+
}
|
|
311
|
+
|
|
312
|
+
/** Data-first description of the next credential operation the client should execute. */
|
|
313
|
+
export type CredentialPlan =
|
|
314
|
+
/** No reusable channel is available, so create an open transaction and initial voucher. */
|
|
315
|
+
| {
|
|
316
|
+
type: 'open'
|
|
317
|
+
account: ViemAccount
|
|
318
|
+
context?: SessionContext | undefined
|
|
319
|
+
maxDeposit?: bigint | undefined
|
|
320
|
+
resolved: ChallengeContext
|
|
321
|
+
}
|
|
322
|
+
/** Rehydrate a known channel from server snapshot or caller descriptor before signing. */
|
|
323
|
+
| {
|
|
324
|
+
type: 'recover'
|
|
325
|
+
account: ViemAccount
|
|
326
|
+
context: DescriptorSessionContext
|
|
327
|
+
decimals: number
|
|
328
|
+
maxDeposit?: bigint | undefined
|
|
329
|
+
resolved: ChallengeContext
|
|
330
|
+
}
|
|
331
|
+
/** Reuse an active cached channel by increasing the cumulative voucher amount. */
|
|
332
|
+
| {
|
|
333
|
+
type: 'voucher'
|
|
334
|
+
account: ViemAccount
|
|
335
|
+
entry: ChannelEntry
|
|
336
|
+
maxDeposit?: bigint | undefined
|
|
337
|
+
resolved: ChallengeContext
|
|
338
|
+
}
|
|
339
|
+
/** Caller supplied an explicit low-level action such as top-up, voucher, or close. */
|
|
340
|
+
| {
|
|
341
|
+
type: 'manual'
|
|
342
|
+
account: ViemAccount
|
|
343
|
+
context: ManualSessionDescriptorContext
|
|
344
|
+
decimals: number
|
|
345
|
+
resolved: ChallengeContext
|
|
346
|
+
}
|
|
347
|
+
|
|
348
|
+
type ManualCredentialParameters = Pick<
|
|
349
|
+
Extract<CredentialPlan, { type: 'manual' }>,
|
|
350
|
+
'account' | 'context' | 'decimals' | 'resolved'
|
|
351
|
+
> & {
|
|
352
|
+
channelId: Hex
|
|
353
|
+
descriptor: Channel.ChannelDescriptor
|
|
354
|
+
}
|
|
355
|
+
|
|
356
|
+
function isObject(value: unknown): value is Record<string, unknown> {
|
|
357
|
+
return typeof value === 'object' && value !== null
|
|
358
|
+
}
|
|
359
|
+
|
|
360
|
+
function readOptionalAddress(value: unknown): Address | undefined {
|
|
361
|
+
return typeof value === 'string' && isAddress(value, { strict: false }) ? value : undefined
|
|
362
|
+
}
|
|
363
|
+
|
|
364
|
+
function readMethodDetails(challenge: Challenge.Challenge): ClientSessionMethodDetails {
|
|
365
|
+
const methodDetails = challenge.request.methodDetails
|
|
366
|
+
if (!isObject(methodDetails)) return {}
|
|
367
|
+
return {
|
|
368
|
+
chainId: typeof methodDetails.chainId === 'number' ? methodDetails.chainId : undefined,
|
|
369
|
+
escrowContract: readOptionalAddress(methodDetails.escrowContract),
|
|
370
|
+
escrow: readOptionalAddress(methodDetails.escrow),
|
|
371
|
+
feePayer: typeof methodDetails.feePayer === 'boolean' ? methodDetails.feePayer : undefined,
|
|
372
|
+
operator: readOptionalAddress(methodDetails.operator),
|
|
373
|
+
sessionSnapshot: Constants.getMethodDetail<SessionSnapshot>(
|
|
374
|
+
methodDetails,
|
|
375
|
+
Constants.MethodDetailKeys.sessionSnapshot,
|
|
376
|
+
),
|
|
377
|
+
}
|
|
378
|
+
}
|
|
379
|
+
|
|
380
|
+
function readAddress(value: unknown, label: string): Address {
|
|
381
|
+
if (typeof value === 'string' && isAddress(value, { strict: false })) return value
|
|
382
|
+
throw new Error(`tempo session challenge missing ${label}`)
|
|
383
|
+
}
|
|
384
|
+
|
|
385
|
+
function readAmount(value: unknown): bigint {
|
|
386
|
+
if (typeof value === 'string') return BigInt(value)
|
|
387
|
+
throw new Error('tempo session challenge missing amount')
|
|
388
|
+
}
|
|
389
|
+
|
|
390
|
+
function readSuggestedDeposit(value: unknown): string | undefined {
|
|
391
|
+
return typeof value === 'string' ? value : undefined
|
|
392
|
+
}
|
|
393
|
+
|
|
394
|
+
/** Resolves raw challenge fields into the typed data required by client credential planning. */
|
|
395
|
+
export async function resolveChallengeContext(
|
|
396
|
+
parameters: ResolveChallengeContextParameters,
|
|
397
|
+
): Promise<ChallengeContext> {
|
|
398
|
+
const { challenge, escrowOverride, getClient } = parameters
|
|
399
|
+
const methodDetails = readMethodDetails(challenge)
|
|
400
|
+
const client = await getClient({ chainId: methodDetails.chainId })
|
|
401
|
+
const chainId = methodDetails.chainId ?? client.chain?.id
|
|
402
|
+
if (!chainId) throw new Error('No chainId configured for TIP-1034 session challenge.')
|
|
403
|
+
|
|
404
|
+
const escrow = resolveEscrow(challenge, escrowOverride)
|
|
405
|
+
const payee = readAddress(challenge.request.recipient, 'recipient')
|
|
406
|
+
const token = readAddress(challenge.request.currency, 'currency')
|
|
407
|
+
|
|
408
|
+
return {
|
|
409
|
+
amount: readAmount(challenge.request.amount),
|
|
410
|
+
challenge,
|
|
411
|
+
chainId,
|
|
412
|
+
client,
|
|
413
|
+
escrow,
|
|
414
|
+
feePayer: methodDetails.feePayer,
|
|
415
|
+
key: channelKey({ payee, token, escrow, chainId }),
|
|
416
|
+
operator: methodDetails.operator,
|
|
417
|
+
payee,
|
|
418
|
+
snapshot: methodDetails.sessionSnapshot,
|
|
419
|
+
suggestedDepositRaw: readSuggestedDeposit(challenge.request.suggestedDeposit),
|
|
420
|
+
token,
|
|
421
|
+
}
|
|
422
|
+
}
|
|
423
|
+
|
|
424
|
+
/** Validates descriptor identity and reads open channel state for client-side recovery. */
|
|
425
|
+
export async function resolveReusableChannel(
|
|
426
|
+
parameters: ResolveReusableChannelParameters,
|
|
427
|
+
): Promise<ReusableChannel> {
|
|
428
|
+
const {
|
|
429
|
+
channelId,
|
|
430
|
+
client,
|
|
431
|
+
descriptor,
|
|
432
|
+
expected,
|
|
433
|
+
readChannelState = Chain.getChannelState,
|
|
434
|
+
} = parameters
|
|
435
|
+
const expectedChannelId = Channel.computeId({
|
|
436
|
+
...descriptor,
|
|
437
|
+
chainId: expected.chainId,
|
|
438
|
+
escrow: expected.escrow,
|
|
439
|
+
})
|
|
440
|
+
|
|
441
|
+
assertReusableChannelDescriptor({
|
|
442
|
+
channelId,
|
|
443
|
+
descriptor,
|
|
444
|
+
expectedChannelId,
|
|
445
|
+
payee: expected.payee,
|
|
446
|
+
payer: expected.payer,
|
|
447
|
+
authorizedSigner: expected.authorizedSigner,
|
|
448
|
+
token: expected.token,
|
|
449
|
+
})
|
|
450
|
+
|
|
451
|
+
const state = await readChannelState(client, expectedChannelId, expected.escrow)
|
|
452
|
+
if (state.deposit === 0n)
|
|
453
|
+
throw new Error(`Channel ${expectedChannelId} cannot be reused (closed or not found on-chain).`)
|
|
454
|
+
if (state.closeRequestedAt !== 0)
|
|
455
|
+
throw new Error(`Channel ${expectedChannelId} cannot be reused (pending close request).`)
|
|
456
|
+
|
|
457
|
+
return { channelId: expectedChannelId, state }
|
|
458
|
+
}
|
|
459
|
+
|
|
460
|
+
function assertReusableChannelDescriptor(parameters: {
|
|
461
|
+
channelId?: string | undefined
|
|
462
|
+
descriptor: Channel.ChannelDescriptor
|
|
463
|
+
expectedChannelId: string
|
|
464
|
+
payee: Address
|
|
465
|
+
payer: Address
|
|
466
|
+
authorizedSigner: Address
|
|
467
|
+
token: Address
|
|
468
|
+
}) {
|
|
469
|
+
const { authorizedSigner, channelId, descriptor, expectedChannelId, payee, payer, token } =
|
|
470
|
+
parameters
|
|
471
|
+
if (channelId && channelId.toLowerCase() !== expectedChannelId.toLowerCase())
|
|
472
|
+
throw new Error('context channelId does not match descriptor')
|
|
473
|
+
if (!isSameAddress(descriptor.payee, payee))
|
|
474
|
+
throw new Error('context descriptor payee does not match challenge')
|
|
475
|
+
if (!isSameAddress(descriptor.token, token))
|
|
476
|
+
throw new Error('context descriptor token does not match challenge')
|
|
477
|
+
if (!isSameAddress(descriptor.payer, payer))
|
|
478
|
+
throw new Error('context descriptor payer does not match account')
|
|
479
|
+
if (!isSameAddress(descriptor.authorizedSigner, authorizedSigner))
|
|
480
|
+
throw new Error('context descriptor authorizedSigner does not match account')
|
|
481
|
+
}
|
|
482
|
+
|
|
483
|
+
/** Resolves descriptor-based recovery data, preferring caller context over server hints. */
|
|
484
|
+
export function resolveRecoverContext(
|
|
485
|
+
parameters: ResolveRecoverContextParameters,
|
|
486
|
+
): DescriptorSessionContext | undefined {
|
|
487
|
+
const { context, snapshot } = parameters
|
|
488
|
+
const descriptor = context?.descriptor ?? snapshot?.descriptor
|
|
489
|
+
if (!descriptor) return undefined
|
|
490
|
+
return {
|
|
491
|
+
...context,
|
|
492
|
+
channelId: context?.channelId ?? snapshot?.channelId,
|
|
493
|
+
descriptor,
|
|
494
|
+
}
|
|
495
|
+
}
|
|
496
|
+
|
|
497
|
+
/** Resolves a voucher boundary that can satisfy the resumed request. */
|
|
498
|
+
export function resolveRecoveredCumulative(
|
|
499
|
+
parameters: ResolveRecoveredCumulativeParameters,
|
|
500
|
+
): bigint {
|
|
501
|
+
const { context, decimals, requestAmount, snapshot, settled } = parameters
|
|
502
|
+
|
|
503
|
+
if (snapshot) {
|
|
504
|
+
return BigInt(snapshot.spent) + requestAmount
|
|
505
|
+
}
|
|
506
|
+
|
|
507
|
+
const contextCumulative = parseOptionalContextAmount(context, decimals, 'cumulativeAmount')
|
|
508
|
+
if (contextCumulative !== undefined) return contextCumulative + requestAmount
|
|
509
|
+
return settled + requestAmount
|
|
510
|
+
}
|
|
511
|
+
|
|
512
|
+
/** Returns whether `account` can satisfy the descriptor's voucher authority. */
|
|
513
|
+
export function canSignDescriptor(
|
|
514
|
+
account: ViemAccount,
|
|
515
|
+
descriptor: Channel.ChannelDescriptor,
|
|
516
|
+
): boolean {
|
|
517
|
+
// Only the payer can deposit into and voucher against its own channel.
|
|
518
|
+
if (!isSameAddress(account.address, descriptor.payer)) return false
|
|
519
|
+
const authority = descriptor.authorizedSigner
|
|
520
|
+
if (BigInt(authority) === 0n || isSameAddress(authority, descriptor.payer)) return true
|
|
521
|
+
return isSameAddress(resolveAuthorizedSigner(account), authority)
|
|
522
|
+
}
|
|
523
|
+
|
|
524
|
+
/** Chooses the next credential plan from local channel cache and optional caller context. */
|
|
525
|
+
export function planCredential(parameters: PlanCredentialParameters): CredentialPlan {
|
|
526
|
+
const { account, entry, context, decimals, maxDeposit, resolved } = parameters
|
|
527
|
+
|
|
528
|
+
if (hasSessionAction(context)) {
|
|
529
|
+
if (!hasManualSessionDescriptor(context))
|
|
530
|
+
throw new Error('descriptor required for TIP-1034 session action')
|
|
531
|
+
return {
|
|
532
|
+
type: 'manual',
|
|
533
|
+
account,
|
|
534
|
+
context,
|
|
535
|
+
decimals,
|
|
536
|
+
resolved,
|
|
537
|
+
}
|
|
538
|
+
}
|
|
539
|
+
|
|
540
|
+
if (!entry && context?.channelId && !context.descriptor)
|
|
541
|
+
throw new Error('descriptor required to reuse TIP-1034 channel')
|
|
542
|
+
const recoverContext = resolveRecoverContext({ context, snapshot: resolved.snapshot })
|
|
543
|
+
if (!entry && recoverContext && canSignDescriptor(account, recoverContext.descriptor)) {
|
|
544
|
+
return {
|
|
545
|
+
type: 'recover',
|
|
546
|
+
account,
|
|
547
|
+
context: recoverContext,
|
|
548
|
+
decimals,
|
|
549
|
+
maxDeposit,
|
|
550
|
+
resolved,
|
|
551
|
+
}
|
|
552
|
+
}
|
|
553
|
+
if (entry?.opened && canSignDescriptor(account, entry.descriptor))
|
|
554
|
+
return { type: 'voucher', account, entry, maxDeposit, resolved }
|
|
555
|
+
return { type: 'open', account, context, maxDeposit, resolved }
|
|
556
|
+
}
|
|
557
|
+
|
|
558
|
+
/** Executes a credential plan and returns the concrete session credential payload. */
|
|
559
|
+
export async function executeCredentialPlan(
|
|
560
|
+
plan: CredentialPlan,
|
|
561
|
+
sink: ChannelSink,
|
|
562
|
+
): Promise<SessionCredentialPayload> {
|
|
563
|
+
switch (plan.type) {
|
|
564
|
+
case 'open':
|
|
565
|
+
return open(plan, sink)
|
|
566
|
+
case 'recover':
|
|
567
|
+
return recover(plan, sink)
|
|
568
|
+
case 'voucher':
|
|
569
|
+
return voucher(plan, sink)
|
|
570
|
+
case 'manual':
|
|
571
|
+
return manual(plan, sink)
|
|
572
|
+
}
|
|
573
|
+
}
|
|
574
|
+
|
|
575
|
+
async function open(
|
|
576
|
+
plan: Extract<CredentialPlan, { type: 'open' }>,
|
|
577
|
+
sink: ChannelSink,
|
|
578
|
+
): Promise<SessionCredentialPayload> {
|
|
579
|
+
const { account, resolved } = plan
|
|
580
|
+
const deposit = resolveOpeningDeposit({
|
|
581
|
+
contextDepositRaw: plan.context?.depositRaw,
|
|
582
|
+
maxDeposit: plan.maxDeposit,
|
|
583
|
+
requestAmount: resolved.amount,
|
|
584
|
+
suggestedDepositRaw: resolved.suggestedDepositRaw,
|
|
585
|
+
})
|
|
586
|
+
const payload = await createOpenPayload(resolved.client, account, {
|
|
587
|
+
chainId: resolved.chainId,
|
|
588
|
+
deposit,
|
|
589
|
+
escrow: resolved.escrow,
|
|
590
|
+
feePayer: resolved.feePayer,
|
|
591
|
+
initialAmount: resolved.amount,
|
|
592
|
+
operator: resolved.operator,
|
|
593
|
+
payee: resolved.payee,
|
|
594
|
+
token: resolved.token,
|
|
595
|
+
})
|
|
596
|
+
await storeChannelEntry(sink, {
|
|
597
|
+
channelId: payload.channelId,
|
|
598
|
+
cumulativeAmount: resolved.amount,
|
|
599
|
+
deposit,
|
|
600
|
+
descriptor: payload.descriptor,
|
|
601
|
+
escrow: resolved.escrow,
|
|
602
|
+
chainId: resolved.chainId,
|
|
603
|
+
opened: true,
|
|
604
|
+
})
|
|
605
|
+
return payload
|
|
606
|
+
}
|
|
607
|
+
|
|
608
|
+
async function recover(
|
|
609
|
+
plan: Extract<CredentialPlan, { type: 'recover' }>,
|
|
610
|
+
sink: ChannelSink,
|
|
611
|
+
): Promise<SessionCredentialPayload> {
|
|
612
|
+
const { account, context, decimals, maxDeposit, resolved } = plan
|
|
613
|
+
const { descriptor } = context
|
|
614
|
+
const reusable = await resolveReusableChannel({
|
|
615
|
+
channelId: context.channelId,
|
|
616
|
+
client: resolved.client,
|
|
617
|
+
descriptor,
|
|
618
|
+
expected: {
|
|
619
|
+
chainId: resolved.chainId,
|
|
620
|
+
escrow: resolved.escrow,
|
|
621
|
+
payee: resolved.payee,
|
|
622
|
+
payer: account.address,
|
|
623
|
+
authorizedSigner: resolveAuthorizedSigner(account),
|
|
624
|
+
token: resolved.token,
|
|
625
|
+
},
|
|
626
|
+
})
|
|
627
|
+
const cumulativeAmount = resolveRecoveredCumulative({
|
|
628
|
+
context,
|
|
629
|
+
decimals,
|
|
630
|
+
requestAmount: resolved.amount,
|
|
631
|
+
settled: reusable.state.settled,
|
|
632
|
+
snapshot: resolved.snapshot,
|
|
633
|
+
})
|
|
634
|
+
if (cumulativeAmount > reusable.state.deposit)
|
|
635
|
+
throw new Error('recovered voucher amount exceeds on-chain channel deposit')
|
|
636
|
+
assertWithinMaxDeposit(cumulativeAmount, maxDeposit)
|
|
637
|
+
const payload = await createVoucherPayload(
|
|
638
|
+
resolved.client,
|
|
639
|
+
account,
|
|
640
|
+
descriptor,
|
|
641
|
+
cumulativeAmount,
|
|
642
|
+
resolved.chainId,
|
|
643
|
+
resolved.escrow,
|
|
644
|
+
)
|
|
645
|
+
await storeChannelEntry(sink, {
|
|
646
|
+
channelId: reusable.channelId,
|
|
647
|
+
cumulativeAmount,
|
|
648
|
+
deposit: reusable.state.deposit,
|
|
649
|
+
descriptor,
|
|
650
|
+
escrow: resolved.escrow,
|
|
651
|
+
chainId: resolved.chainId,
|
|
652
|
+
opened: true,
|
|
653
|
+
})
|
|
654
|
+
return payload
|
|
655
|
+
}
|
|
656
|
+
|
|
657
|
+
async function voucher(
|
|
658
|
+
plan: Extract<CredentialPlan, { type: 'voucher' }>,
|
|
659
|
+
sink: ChannelSink,
|
|
660
|
+
): Promise<SessionCredentialPayload> {
|
|
661
|
+
const { account, entry, resolved } = plan
|
|
662
|
+
const cumulativeAmount = entry.cumulativeAmount + resolved.amount
|
|
663
|
+
assertWithinMaxDeposit(cumulativeAmount, plan.maxDeposit)
|
|
664
|
+
const payload = await createVoucherPayload(
|
|
665
|
+
resolved.client,
|
|
666
|
+
account,
|
|
667
|
+
entry.descriptor,
|
|
668
|
+
cumulativeAmount,
|
|
669
|
+
resolved.chainId,
|
|
670
|
+
resolved.escrow,
|
|
671
|
+
)
|
|
672
|
+
entry.cumulativeAmount = cumulativeAmount
|
|
673
|
+
await storeChannelEntry(sink, entry)
|
|
674
|
+
return payload
|
|
675
|
+
}
|
|
676
|
+
|
|
677
|
+
async function manual(
|
|
678
|
+
plan: Extract<CredentialPlan, { type: 'manual' }>,
|
|
679
|
+
sink: ChannelSink,
|
|
680
|
+
): Promise<SessionCredentialPayload> {
|
|
681
|
+
const { account, context, decimals, resolved } = plan
|
|
682
|
+
const { descriptor } = context
|
|
683
|
+
const channelId = Channel.computeId({
|
|
684
|
+
...descriptor,
|
|
685
|
+
chainId: resolved.chainId,
|
|
686
|
+
escrow: resolved.escrow,
|
|
687
|
+
})
|
|
688
|
+
assertReusableChannelDescriptor({
|
|
689
|
+
channelId: context.channelId,
|
|
690
|
+
descriptor,
|
|
691
|
+
expectedChannelId: channelId,
|
|
692
|
+
payee: resolved.payee,
|
|
693
|
+
payer: account.address,
|
|
694
|
+
authorizedSigner: resolveAuthorizedSigner(account),
|
|
695
|
+
token: resolved.token,
|
|
696
|
+
})
|
|
697
|
+
|
|
698
|
+
const payload = await executeManualCredential({
|
|
699
|
+
account,
|
|
700
|
+
channelId,
|
|
701
|
+
context,
|
|
702
|
+
decimals,
|
|
703
|
+
descriptor,
|
|
704
|
+
resolved,
|
|
705
|
+
})
|
|
706
|
+
await applyCumulative(sink, resolved.key, payload)
|
|
707
|
+
return payload
|
|
708
|
+
}
|
|
709
|
+
|
|
710
|
+
async function executeManualCredential(
|
|
711
|
+
parameters: ManualCredentialParameters,
|
|
712
|
+
): Promise<SessionCredentialPayload> {
|
|
713
|
+
switch (parameters.context.action) {
|
|
714
|
+
case 'open':
|
|
715
|
+
return manualOpen(parameters)
|
|
716
|
+
case 'topUp':
|
|
717
|
+
return manualTopUp(parameters)
|
|
718
|
+
case 'voucher':
|
|
719
|
+
return manualVoucher(parameters)
|
|
720
|
+
case 'close':
|
|
721
|
+
return manualClose(parameters)
|
|
722
|
+
}
|
|
723
|
+
}
|
|
724
|
+
|
|
725
|
+
async function manualOpen(
|
|
726
|
+
parameters: ManualCredentialParameters,
|
|
727
|
+
): Promise<SessionCredentialPayload> {
|
|
728
|
+
const { account, channelId, context, decimals, descriptor, resolved } = parameters
|
|
729
|
+
if (!context.transaction) throw new Error('transaction required for open action')
|
|
730
|
+
const cumulativeAmount = requireContextAmount(context, decimals, 'cumulativeAmount', 'open')
|
|
731
|
+
const voucher = await createVoucherPayload(
|
|
732
|
+
resolved.client,
|
|
733
|
+
account,
|
|
734
|
+
descriptor,
|
|
735
|
+
cumulativeAmount,
|
|
736
|
+
resolved.chainId,
|
|
737
|
+
resolved.escrow,
|
|
738
|
+
)
|
|
739
|
+
return {
|
|
740
|
+
action: 'open',
|
|
741
|
+
type: 'transaction',
|
|
742
|
+
channelId,
|
|
743
|
+
transaction: context.transaction,
|
|
744
|
+
signature: voucher.signature,
|
|
745
|
+
descriptor,
|
|
746
|
+
cumulativeAmount: cumulativeAmount.toString(),
|
|
747
|
+
authorizedSigner: descriptor.authorizedSigner,
|
|
748
|
+
}
|
|
749
|
+
}
|
|
750
|
+
|
|
751
|
+
async function manualTopUp(
|
|
752
|
+
parameters: ManualCredentialParameters,
|
|
753
|
+
): Promise<SessionCredentialPayload> {
|
|
754
|
+
const { account, channelId, context, decimals, descriptor, resolved } = parameters
|
|
755
|
+
const additionalDeposit = requireContextAmount(context, decimals, 'additionalDeposit', 'topUp')
|
|
756
|
+
if (context.transaction) {
|
|
757
|
+
return {
|
|
758
|
+
action: 'topUp',
|
|
759
|
+
type: 'transaction',
|
|
760
|
+
channelId,
|
|
761
|
+
transaction: context.transaction,
|
|
762
|
+
descriptor,
|
|
763
|
+
additionalDeposit: additionalDeposit.toString(),
|
|
764
|
+
}
|
|
765
|
+
}
|
|
766
|
+
return createTopUpPayload(
|
|
767
|
+
resolved.client,
|
|
768
|
+
account,
|
|
769
|
+
descriptor,
|
|
770
|
+
additionalDeposit,
|
|
771
|
+
resolved.chainId,
|
|
772
|
+
resolved.feePayer,
|
|
773
|
+
resolved.escrow,
|
|
774
|
+
)
|
|
775
|
+
}
|
|
776
|
+
|
|
777
|
+
function manualVoucher(parameters: ManualCredentialParameters): Promise<SessionCredentialPayload> {
|
|
778
|
+
const { account, context, decimals, descriptor, resolved } = parameters
|
|
779
|
+
return createVoucherPayload(
|
|
780
|
+
resolved.client,
|
|
781
|
+
account,
|
|
782
|
+
descriptor,
|
|
783
|
+
requireContextAmount(context, decimals, 'cumulativeAmount', 'voucher'),
|
|
784
|
+
resolved.chainId,
|
|
785
|
+
resolved.escrow,
|
|
786
|
+
)
|
|
787
|
+
}
|
|
788
|
+
|
|
789
|
+
function manualClose(parameters: ManualCredentialParameters): Promise<SessionCredentialPayload> {
|
|
790
|
+
const { account, context, decimals, descriptor, resolved } = parameters
|
|
791
|
+
return createClosePayload(
|
|
792
|
+
resolved.client,
|
|
793
|
+
account,
|
|
794
|
+
descriptor,
|
|
795
|
+
requireContextAmount(context, decimals, 'cumulativeAmount', 'close'),
|
|
796
|
+
resolved.chainId,
|
|
797
|
+
resolved.escrow,
|
|
798
|
+
)
|
|
799
|
+
}
|