mppx 0.6.30 → 0.7.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 +25 -0
- package/dist/Challenge.d.ts.map +1 -1
- package/dist/Challenge.js +9 -7
- 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/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/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/Transport.d.ts.map +1 -1
- package/dist/client/Transport.js +4 -5
- package/dist/client/Transport.js.map +1 -1
- package/dist/client/index.d.ts +2 -1
- package/dist/client/index.d.ts.map +1 -1
- package/dist/client/index.js +2 -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 +14 -6
- package/dist/client/internal/Fetch.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/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-sdk/client/McpClient.d.ts +12 -5
- package/dist/mcp-sdk/client/McpClient.d.ts.map +1 -1
- package/dist/mcp-sdk/client/McpClient.js +55 -42
- package/dist/mcp-sdk/client/McpClient.js.map +1 -1
- package/dist/server/Mppx.d.ts +11 -3
- package/dist/server/Mppx.d.ts.map +1 -1
- package/dist/server/Mppx.js +76 -27
- package/dist/server/Mppx.js.map +1 -1
- package/dist/server/Request.js +24 -10
- package/dist/server/Request.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.map +1 -1
- package/dist/server/Transport.js +4 -3
- 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/client/Charge.d.ts +6 -0
- package/dist/tempo/client/Charge.d.ts.map +1 -1
- package/dist/tempo/client/Charge.js +9 -2
- package/dist/tempo/client/Charge.js.map +1 -1
- package/dist/tempo/client/Methods.d.ts +36 -7
- package/dist/tempo/client/Methods.d.ts.map +1 -1
- package/dist/tempo/client/Methods.js +12 -5
- package/dist/tempo/client/Methods.js.map +1 -1
- 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 +21 -1
- package/dist/tempo/internal/fee-payer.d.ts.map +1 -1
- package/dist/tempo/internal/fee-payer.js +109 -4
- package/dist/tempo/internal/fee-payer.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 +20 -16
- 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 +28 -23
- 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 +13 -16
- package/dist/tempo/server/Charge.js.map +1 -1
- package/dist/tempo/server/Methods.d.ts +63 -6
- package/dist/tempo/server/Methods.d.ts.map +1 -1
- package/dist/tempo/server/Methods.js +36 -8
- package/dist/tempo/server/Methods.js.map +1 -1
- package/dist/tempo/server/Subscription.d.ts +1 -1
- package/dist/tempo/server/Subscription.d.ts.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 +82 -0
- package/dist/tempo/session/client/ChannelOps.d.ts.map +1 -0
- package/dist/tempo/session/client/ChannelOps.js +204 -0
- package/dist/tempo/session/client/ChannelOps.js.map +1 -0
- package/dist/tempo/session/client/CredentialState.d.ts +262 -0
- package/dist/tempo/session/client/CredentialState.d.ts.map +1 -0
- package/dist/tempo/session/client/CredentialState.js +417 -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 +132 -0
- package/dist/tempo/session/client/Session.d.ts.map +1 -0
- package/dist/tempo/session/client/Session.js +55 -0
- package/dist/tempo/session/client/Session.js.map +1 -0
- package/dist/tempo/session/client/SessionManager.d.ts +120 -0
- package/dist/tempo/session/client/SessionManager.d.ts.map +1 -0
- package/dist/tempo/session/client/SessionManager.js +627 -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 +12 -0
- package/dist/tempo/session/client/index.d.ts.map +1 -0
- package/dist/tempo/session/client/index.js +5 -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 +126 -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 +250 -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/package.json +8 -3
- package/src/Challenge.ts +9 -7
- package/src/Constants.ts +58 -0
- package/src/Credential.ts +5 -4
- package/src/Method.ts +46 -5
- package/src/Receipt.ts +3 -2
- package/src/cli/cli.test.ts +23 -28
- 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 +10 -0
- package/src/client/Mppx.test.ts +75 -0
- package/src/client/Transport.ts +4 -5
- package/src/client/index.ts +11 -1
- package/src/client/internal/Fetch.test.ts +29 -4
- package/src/client/internal/Fetch.ts +17 -5
- package/src/env.d.ts +1 -1
- 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/client/McpClient.integration.test.ts +8 -7
- package/src/mcp-sdk/client/McpClient.test-d.ts +7 -0
- package/src/mcp-sdk/client/McpClient.ts +99 -67
- package/src/mcp-sdk/client/McpClient.unit.test.ts +131 -0
- package/src/middlewares/elysia.test.ts +8 -4
- package/src/middlewares/express.test.ts +8 -4
- package/src/middlewares/hono.test.ts +4 -4
- package/src/middlewares/nextjs.test.ts +8 -4
- package/src/proxy/Proxy.test.ts +8 -8
- package/src/server/Mppx.test-d.ts +54 -0
- package/src/server/Mppx.test.ts +274 -7
- package/src/server/Mppx.ts +487 -406
- package/src/server/Request.test.ts +81 -0
- package/src/server/Request.ts +23 -9
- package/src/server/Response.ts +2 -1
- package/src/server/Transport.ts +4 -3
- package/src/server/index.ts +1 -0
- package/src/stripe/client/Charge.test.ts +20 -5
- package/src/stripe/client/Charge.ts +6 -2
- package/src/stripe/server/Charge.test.ts +114 -1
- 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/PublicExports.test-d.ts +105 -0
- package/src/tempo/client/Charge.test.ts +85 -0
- package/src/tempo/client/Charge.ts +19 -2
- package/src/tempo/client/Methods.ts +18 -6
- package/src/tempo/client/index.ts +15 -4
- package/src/tempo/index.ts +1 -0
- package/src/tempo/internal/fee-payer.test.ts +241 -17
- package/src/tempo/internal/fee-payer.ts +150 -4
- package/src/tempo/internal/fee-token.test.ts +14 -9
- 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 +41 -20
- 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 +162 -63
- package/src/tempo/{server → legacy/server}/Session.ts +49 -37
- 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 +92 -14
- package/src/tempo/server/Charge.ts +18 -16
- package/src/tempo/server/Methods.ts +54 -8
- package/src/tempo/server/Sse.test.ts +2 -2
- package/src/tempo/server/index.ts +6 -5
- package/src/tempo/server/internal/html/package.json +1 -1
- package/src/tempo/server/internal/html.gen.ts +1 -1
- package/src/tempo/server/internal/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 +344 -0
- package/src/tempo/session/client/CredentialState.test.ts +645 -0
- package/src/tempo/session/client/CredentialState.ts +814 -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 +734 -0
- package/src/tempo/session/client/Session.ts +97 -0
- package/src/tempo/session/client/SessionManager.test.ts +1308 -0
- package/src/tempo/session/client/SessionManager.ts +845 -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 +37 -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 +316 -0
- package/src/tempo/session/precompile/Voucher.ts +160 -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 +242 -0
- package/src/tempo/session/server/Settlement.ts +470 -0
- package/src/tempo/session/{Sse.test.ts → server/Sse.test.ts} +37 -3
- package/src/tempo/session/server/Sse.ts +256 -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 +384 -0
- package/src/tempo/session/server/index.ts +8 -0
- 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/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/tempo/{session → legacy/session}/Channel.js +0 -0
- /package/dist/tempo/{session → legacy/session}/Types.js +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
|
@@ -20,6 +20,7 @@ import {
|
|
|
20
20
|
} from 'viem'
|
|
21
21
|
import { tempo as tempo_chain } from 'viem/tempo/chains'
|
|
22
22
|
|
|
23
|
+
import * as Constants from '../../../Constants.js'
|
|
23
24
|
import {
|
|
24
25
|
AmountExceedsDepositError,
|
|
25
26
|
BadRequestError,
|
|
@@ -29,18 +30,25 @@ import {
|
|
|
29
30
|
InsufficientBalanceError,
|
|
30
31
|
InvalidSignatureError,
|
|
31
32
|
VerificationFailedError,
|
|
32
|
-
} from '
|
|
33
|
-
import type { Challenge, Credential } from '
|
|
34
|
-
import type { LooseOmit, NoExtraKeys } from '
|
|
35
|
-
import * as Method from '
|
|
36
|
-
import * as Store from '
|
|
37
|
-
import * as Client from '
|
|
38
|
-
import type * as z from '
|
|
39
|
-
import * as Account from '
|
|
40
|
-
import * as defaults from '
|
|
41
|
-
import * as FeePayer from '
|
|
42
|
-
import type * as types from '
|
|
43
|
-
import * as Methods from '
|
|
33
|
+
} from '../../../Errors.js'
|
|
34
|
+
import type { Challenge, Credential } from '../../../index.js'
|
|
35
|
+
import type { LooseOmit, NoExtraKeys } from '../../../internal/types.js'
|
|
36
|
+
import * as Method from '../../../Method.js'
|
|
37
|
+
import * as Store from '../../../Store.js'
|
|
38
|
+
import * as Client from '../../../viem/Client.js'
|
|
39
|
+
import type * as z from '../../../zod.js'
|
|
40
|
+
import * as Account from '../../internal/account.js'
|
|
41
|
+
import * as defaults from '../../internal/defaults.js'
|
|
42
|
+
import * as FeePayer from '../../internal/fee-payer.js'
|
|
43
|
+
import type * as types from '../../internal/types.js'
|
|
44
|
+
import * as Methods from '../../Methods.js'
|
|
45
|
+
import {
|
|
46
|
+
captureRequestBodyProbe,
|
|
47
|
+
isSessionContentRequest,
|
|
48
|
+
} from '../../server/internal/request-body.js'
|
|
49
|
+
import * as Transport from '../../server/internal/transport.js'
|
|
50
|
+
import { createSessionReceipt } from '../../session/precompile/Protocol.js'
|
|
51
|
+
import type { SessionReceipt } from '../../session/precompile/Protocol.js'
|
|
44
52
|
import {
|
|
45
53
|
broadcastOpenTransaction,
|
|
46
54
|
broadcastTopUpTransaction,
|
|
@@ -50,11 +58,8 @@ import {
|
|
|
50
58
|
settleOnChain,
|
|
51
59
|
} from '../session/Chain.js'
|
|
52
60
|
import * as ChannelStore from '../session/ChannelStore.js'
|
|
53
|
-
import {
|
|
54
|
-
import type { SessionCredentialPayload, SessionReceipt, SignedVoucher } from '../session/Types.js'
|
|
61
|
+
import type { LegacySessionCredentialPayload, LegacySignedVoucher } from '../session/Types.js'
|
|
55
62
|
import { parseVoucherFromPayload, verifyVoucher } from '../session/Voucher.js'
|
|
56
|
-
import { captureRequestBodyProbe, isSessionContentRequest } from './internal/request-body.js'
|
|
57
|
-
import * as Transport from './internal/transport.js'
|
|
58
63
|
|
|
59
64
|
/** Challenge methodDetails shape for session methods. */
|
|
60
65
|
type SessionMethodDetails = {
|
|
@@ -63,6 +68,7 @@ type SessionMethodDetails = {
|
|
|
63
68
|
channelId?: Hex | undefined
|
|
64
69
|
minVoucherDelta?: string | undefined
|
|
65
70
|
feePayer?: boolean | undefined
|
|
71
|
+
sessionProtocol?: Constants.SessionProtocol | undefined
|
|
66
72
|
}
|
|
67
73
|
|
|
68
74
|
/**
|
|
@@ -183,11 +189,13 @@ export function session<const parameters extends session.Parameters>(
|
|
|
183
189
|
chainId,
|
|
184
190
|
escrowContract: resolvedEscrow,
|
|
185
191
|
feePayer: resolvedFeePayer,
|
|
192
|
+
sessionProtocol: Constants.SessionProtocols.v1,
|
|
186
193
|
}
|
|
187
194
|
},
|
|
188
195
|
|
|
189
196
|
async verify({ credential, envelope, request }) {
|
|
190
|
-
const { challenge, payload } =
|
|
197
|
+
const { challenge, payload } =
|
|
198
|
+
credential as Credential.Credential<LegacySessionCredentialPayload>
|
|
191
199
|
|
|
192
200
|
const resolvedRequest = (() => {
|
|
193
201
|
const parsed = Methods.session.schema.request.safeParse(request)
|
|
@@ -285,7 +293,8 @@ export function session<const parameters extends session.Parameters>(
|
|
|
285
293
|
if (
|
|
286
294
|
envelope &&
|
|
287
295
|
isSessionContentRequest(envelope.capturedRequest) &&
|
|
288
|
-
(payload.action === 'open' ||
|
|
296
|
+
(payload.action === 'open' ||
|
|
297
|
+
(payload.action === 'voucher' && !isSseNegotiationRequest(envelope.capturedRequest)))
|
|
289
298
|
) {
|
|
290
299
|
const charged = await charge(
|
|
291
300
|
store,
|
|
@@ -314,18 +323,25 @@ export function session<const parameters extends session.Parameters>(
|
|
|
314
323
|
// during verification. Non-billable requests are treated as management
|
|
315
324
|
// updates; billable requests fall through to the application handler.
|
|
316
325
|
respond({ credential, envelope, input }) {
|
|
317
|
-
const { payload } = credential as Credential.Credential<
|
|
326
|
+
const { payload } = credential as Credential.Credential<LegacySessionCredentialPayload>
|
|
327
|
+
const request = envelope?.capturedRequest ?? captureRequestBodyProbe(input)
|
|
318
328
|
|
|
319
329
|
if (payload.action === 'close') return new Response(null, { status: 204 })
|
|
320
330
|
if (payload.action === 'topUp') return new Response(null, { status: 204 })
|
|
331
|
+
if (parameters.sse && payload.action === 'voucher' && isSseNegotiationRequest(request))
|
|
332
|
+
return new Response(null, { status: 204 })
|
|
321
333
|
|
|
322
|
-
const request = envelope?.capturedRequest ?? captureRequestBodyProbe(input)
|
|
323
334
|
if (isSessionContentRequest(request)) return undefined
|
|
324
335
|
return new Response(null, { status: 204 })
|
|
325
336
|
},
|
|
326
337
|
})
|
|
327
338
|
}
|
|
328
339
|
|
|
340
|
+
function isSseNegotiationRequest(input: Pick<Method.CapturedRequest, 'headers'>): boolean {
|
|
341
|
+
return input.headers.get('Accept')?.includes('text/event-stream') ?? false
|
|
342
|
+
}
|
|
343
|
+
|
|
344
|
+
/** Type helpers for the legacy contract-backed session server method. */
|
|
329
345
|
export declare namespace session {
|
|
330
346
|
type Defaults = LooseOmit<
|
|
331
347
|
Method.RequestDefaults<typeof Methods.session>,
|
|
@@ -530,7 +546,7 @@ async function verifyAndAcceptVoucher(parameters: {
|
|
|
530
546
|
challenge: Challenge.Challenge
|
|
531
547
|
channel: ChannelStore.State
|
|
532
548
|
channelId: Hex
|
|
533
|
-
voucher:
|
|
549
|
+
voucher: LegacySignedVoucher
|
|
534
550
|
onChain: OnChainChannel
|
|
535
551
|
}): Promise<SessionReceipt> {
|
|
536
552
|
const { store, minVoucherDelta, challenge, channel, channelId, voucher, onChain } = parameters
|
|
@@ -553,7 +569,7 @@ async function verifyAndAcceptVoucher(parameters: {
|
|
|
553
569
|
|
|
554
570
|
if (voucher.cumulativeAmount <= onChain.settled) {
|
|
555
571
|
throw new VerificationFailedError({
|
|
556
|
-
reason: 'voucher cumulativeAmount is below on-chain settled amount',
|
|
572
|
+
reason: 'voucher cumulativeAmount is at or below on-chain settled amount',
|
|
557
573
|
})
|
|
558
574
|
}
|
|
559
575
|
|
|
@@ -561,12 +577,6 @@ async function verifyAndAcceptVoucher(parameters: {
|
|
|
561
577
|
throw new AmountExceedsDepositError({ reason: 'voucher amount exceeds on-chain deposit' })
|
|
562
578
|
}
|
|
563
579
|
|
|
564
|
-
if (voucher.cumulativeAmount < channel.highestVoucherAmount) {
|
|
565
|
-
throw new VerificationFailedError({
|
|
566
|
-
reason: 'voucher cumulativeAmount must be strictly greater than highest accepted voucher',
|
|
567
|
-
})
|
|
568
|
-
}
|
|
569
|
-
|
|
570
580
|
const isValid = await verifyVoucher(
|
|
571
581
|
channel.escrowContract,
|
|
572
582
|
channel.chainId,
|
|
@@ -578,9 +588,11 @@ async function verifyAndAcceptVoucher(parameters: {
|
|
|
578
588
|
throw new InvalidSignatureError({ reason: 'invalid voucher signature' })
|
|
579
589
|
}
|
|
580
590
|
|
|
581
|
-
// Idempotent replay:
|
|
582
|
-
//
|
|
583
|
-
|
|
591
|
+
// Idempotent replay: a non-advancing voucher (at or below the highest
|
|
592
|
+
// accepted amount, but above the on-chain settled amount checked above)
|
|
593
|
+
// returns 200 OK with the current highest amount without advancing state,
|
|
594
|
+
// per the session spec's idempotency requirement.
|
|
595
|
+
if (voucher.cumulativeAmount <= channel.highestVoucherAmount) {
|
|
584
596
|
return createSessionReceipt({
|
|
585
597
|
challengeId: challenge.id,
|
|
586
598
|
channelId,
|
|
@@ -632,7 +644,7 @@ async function handleOpen(
|
|
|
632
644
|
store: ChannelStore.ChannelStore,
|
|
633
645
|
client: viem_Client,
|
|
634
646
|
challenge: Challenge.Challenge,
|
|
635
|
-
payload:
|
|
647
|
+
payload: LegacySessionCredentialPayload & { action: 'open' },
|
|
636
648
|
methodDetails: SessionMethodDetails,
|
|
637
649
|
feePayer: viem_Account | undefined,
|
|
638
650
|
isSponsored: boolean,
|
|
@@ -660,7 +672,7 @@ async function handleOpen(
|
|
|
660
672
|
|
|
661
673
|
if (voucher.cumulativeAmount <= onChain.settled) {
|
|
662
674
|
throw new VerificationFailedError({
|
|
663
|
-
reason: 'voucher cumulativeAmount is below on-chain settled amount',
|
|
675
|
+
reason: 'voucher cumulativeAmount is at or below on-chain settled amount',
|
|
664
676
|
})
|
|
665
677
|
}
|
|
666
678
|
|
|
@@ -701,7 +713,7 @@ async function handleOpen(
|
|
|
701
713
|
if (existing) {
|
|
702
714
|
if (voucher.cumulativeAmount <= existing.settledOnChain) {
|
|
703
715
|
throw new VerificationFailedError({
|
|
704
|
-
reason: 'voucher amount is below settled on-chain amount',
|
|
716
|
+
reason: 'voucher amount is at or below settled on-chain amount',
|
|
705
717
|
})
|
|
706
718
|
}
|
|
707
719
|
|
|
@@ -771,7 +783,7 @@ async function handleTopUp(
|
|
|
771
783
|
store: ChannelStore.ChannelStore,
|
|
772
784
|
client: viem_Client,
|
|
773
785
|
challenge: Challenge.Challenge,
|
|
774
|
-
payload:
|
|
786
|
+
payload: LegacySessionCredentialPayload & { action: 'topUp' },
|
|
775
787
|
methodDetails: SessionMethodDetails,
|
|
776
788
|
feePayer: viem_Account | undefined,
|
|
777
789
|
isSponsored: boolean,
|
|
@@ -821,7 +833,7 @@ async function handleVoucher(
|
|
|
821
833
|
client: viem_Client,
|
|
822
834
|
minVoucherDelta: bigint,
|
|
823
835
|
challenge: Challenge.Challenge,
|
|
824
|
-
payload:
|
|
836
|
+
payload: LegacySessionCredentialPayload & { action: 'voucher' },
|
|
825
837
|
methodDetails: SessionMethodDetails,
|
|
826
838
|
channelStateTtl: number,
|
|
827
839
|
lastOnChainVerified: Map<Hex, number>,
|
|
@@ -893,7 +905,7 @@ async function handleClose(
|
|
|
893
905
|
store: ChannelStore.ChannelStore,
|
|
894
906
|
client: viem_Client,
|
|
895
907
|
challenge: Challenge.Challenge,
|
|
896
|
-
payload:
|
|
908
|
+
payload: LegacySessionCredentialPayload & { action: 'close' },
|
|
897
909
|
methodDetails: SessionMethodDetails,
|
|
898
910
|
account?: viem_Account,
|
|
899
911
|
feePayer?: viem_Account,
|
|
@@ -10,7 +10,7 @@ import {
|
|
|
10
10
|
import { prepareTransactionRequest, signTransaction, waitForTransactionReceipt } from 'viem/actions'
|
|
11
11
|
import { Addresses, Transaction } from 'viem/tempo'
|
|
12
12
|
import { beforeAll, describe, expect, test } from 'vp/test'
|
|
13
|
-
import {
|
|
13
|
+
import { tempoNetwork } from '~test/config.js'
|
|
14
14
|
import {
|
|
15
15
|
closeChannelOnChain,
|
|
16
16
|
deployEscrow,
|
|
@@ -18,7 +18,7 @@ import {
|
|
|
18
18
|
signOpenChannel,
|
|
19
19
|
signTopUpChannel,
|
|
20
20
|
topUpChannel,
|
|
21
|
-
} from '~test/tempo/session.js'
|
|
21
|
+
} from '~test/tempo/legacy/session.js'
|
|
22
22
|
import { accounts, asset, chain, client, fundAccount } from '~test/tempo/viem.js'
|
|
23
23
|
|
|
24
24
|
import {
|
|
@@ -33,9 +33,8 @@ import {
|
|
|
33
33
|
import * as Channel from './Channel.js'
|
|
34
34
|
import { signVoucher } from './Voucher.js'
|
|
35
35
|
|
|
36
|
-
const isLocalnet = nodeEnv === 'localnet'
|
|
37
|
-
|
|
38
36
|
const UINT128_MAX = 2n ** 128n - 1n
|
|
37
|
+
const isLocalnet = tempoNetwork === 'localnet'
|
|
39
38
|
|
|
40
39
|
describe('assertUint128 (via settleOnChain / closeOnChain)', () => {
|
|
41
40
|
const mockClient = { chain: { id: 42431 } } as any
|
|
@@ -20,23 +20,28 @@ import {
|
|
|
20
20
|
} from 'viem/actions'
|
|
21
21
|
import { Transaction } from 'viem/tempo'
|
|
22
22
|
|
|
23
|
-
import { BadRequestError, ChannelClosedError, VerificationFailedError } from '
|
|
24
|
-
import * as TempoAddress from '
|
|
25
|
-
import * as defaults from '
|
|
26
|
-
import * as FeePayer from '
|
|
27
|
-
import { resolveFeeToken } from '
|
|
23
|
+
import { BadRequestError, ChannelClosedError, VerificationFailedError } from '../../../Errors.js'
|
|
24
|
+
import * as TempoAddress from '../../internal/address.js'
|
|
25
|
+
import * as defaults from '../../internal/defaults.js'
|
|
26
|
+
import * as FeePayer from '../../internal/fee-payer.js'
|
|
27
|
+
import { resolveFeeToken } from '../../internal/fee-token.js'
|
|
28
28
|
import * as Channel from './Channel.js'
|
|
29
29
|
import { escrowAbi } from './escrow.abi.js'
|
|
30
|
-
import type {
|
|
30
|
+
import type { LegacySignedVoucher } from './Types.js'
|
|
31
31
|
|
|
32
32
|
export { escrowAbi }
|
|
33
33
|
|
|
34
|
+
type SenderSignedTransaction = {
|
|
35
|
+
from?: Address | undefined
|
|
36
|
+
signature?: unknown
|
|
37
|
+
}
|
|
38
|
+
|
|
34
39
|
/**
|
|
35
40
|
* Asserts that a deserialized transaction has an existing sender signature —
|
|
36
41
|
* required before fee payer co-signing to prevent the fee payer from becoming
|
|
37
42
|
* the sender.
|
|
38
43
|
*/
|
|
39
|
-
function assertSenderSigned(transaction:
|
|
44
|
+
function assertSenderSigned(transaction: SenderSignedTransaction): void {
|
|
40
45
|
if (!transaction.signature || !transaction.from)
|
|
41
46
|
throw new BadRequestError({
|
|
42
47
|
reason: 'Transaction must be signed by the sender before fee payer co-signing',
|
|
@@ -109,7 +114,7 @@ export type SettleOptions =
|
|
|
109
114
|
export async function settleOnChain(
|
|
110
115
|
client: Client,
|
|
111
116
|
escrowContract: Address,
|
|
112
|
-
voucher:
|
|
117
|
+
voucher: LegacySignedVoucher,
|
|
113
118
|
options?: SettleOptions,
|
|
114
119
|
): Promise<Hex> {
|
|
115
120
|
assertUint128(voucher.cumulativeAmount)
|
|
@@ -160,7 +165,7 @@ export type CloseOptions =
|
|
|
160
165
|
export async function closeOnChain(
|
|
161
166
|
client: Client,
|
|
162
167
|
escrowContract: Address,
|
|
163
|
-
voucher:
|
|
168
|
+
voucher: LegacySignedVoucher,
|
|
164
169
|
options?: CloseOptions,
|
|
165
170
|
): Promise<Hex> {
|
|
166
171
|
assertUint128(voucher.cumulativeAmount)
|
|
@@ -298,11 +303,75 @@ const erc20ApproveSelector = /*#__PURE__*/ toFunctionSelector(
|
|
|
298
303
|
'function approve(address spender, uint256 amount)',
|
|
299
304
|
)
|
|
300
305
|
|
|
306
|
+
/** Result returned after a legacy open transaction is broadcast or recovered from on-chain state. */
|
|
301
307
|
export type BroadcastResult = {
|
|
302
308
|
txHash: Hex | undefined
|
|
303
309
|
onChain: OnChainChannel
|
|
304
310
|
}
|
|
305
311
|
|
|
312
|
+
/** Inputs for validating an ERC-20 approve call inside a fee-sponsored legacy channel transaction. */
|
|
313
|
+
type SponsoredApproveCallParameters = {
|
|
314
|
+
action: 'open' | 'topUp'
|
|
315
|
+
call: TempoCall
|
|
316
|
+
currency: Address
|
|
317
|
+
escrowContract: Address
|
|
318
|
+
expectedAmount: bigint
|
|
319
|
+
}
|
|
320
|
+
|
|
321
|
+
/** Inputs for extracting the escrow open call from a fee-sponsored legacy channel transaction. */
|
|
322
|
+
type SponsoredOpenCallsParameters = {
|
|
323
|
+
calls: readonly TempoCall[]
|
|
324
|
+
currency: Address
|
|
325
|
+
deposit: bigint
|
|
326
|
+
escrowContract: Address
|
|
327
|
+
}
|
|
328
|
+
|
|
329
|
+
/** Inputs for extracting the escrow top-up call from a fee-sponsored legacy channel transaction. */
|
|
330
|
+
type SponsoredTopUpCallsParameters = {
|
|
331
|
+
calls: readonly TempoCall[]
|
|
332
|
+
currency: Address
|
|
333
|
+
escrowContract: Address
|
|
334
|
+
topUpAmount: bigint
|
|
335
|
+
}
|
|
336
|
+
|
|
337
|
+
/** Inputs for broadcasting and validating a legacy contract-backed open transaction. */
|
|
338
|
+
export type BroadcastOpenTransactionParameters = {
|
|
339
|
+
beforeBroadcast?: ((onChain: OnChainChannel) => Promise<void> | void) | undefined
|
|
340
|
+
challengeExpires?: string | undefined
|
|
341
|
+
channelId: Hex
|
|
342
|
+
client: Client
|
|
343
|
+
currency: Address
|
|
344
|
+
escrowContract: Address
|
|
345
|
+
feePayer?: Account | undefined
|
|
346
|
+
feePayerPolicy?: Partial<FeePayer.Policy> | undefined
|
|
347
|
+
isSponsored?: boolean | undefined
|
|
348
|
+
recipient: Address
|
|
349
|
+
serializedTransaction: Hex
|
|
350
|
+
/** When false, simulates instead of waiting for confirmation and returns derived on-chain state. @default true */
|
|
351
|
+
waitForConfirmation?: boolean | undefined
|
|
352
|
+
}
|
|
353
|
+
|
|
354
|
+
/** Inputs for broadcasting and validating a legacy contract-backed top-up transaction. */
|
|
355
|
+
export type BroadcastTopUpTransactionParameters = {
|
|
356
|
+
challengeExpires?: string | undefined
|
|
357
|
+
channelId: Hex
|
|
358
|
+
client: Client
|
|
359
|
+
currency: Address
|
|
360
|
+
declaredDeposit: bigint
|
|
361
|
+
escrowContract: Address
|
|
362
|
+
feePayer?: Account | undefined
|
|
363
|
+
feePayerPolicy?: Partial<FeePayer.Policy> | undefined
|
|
364
|
+
isSponsored?: boolean | undefined
|
|
365
|
+
previousDeposit: bigint
|
|
366
|
+
serializedTransaction: Hex
|
|
367
|
+
}
|
|
368
|
+
|
|
369
|
+
/** Result returned after a legacy top-up transaction is broadcast and verified. */
|
|
370
|
+
export type BroadcastTopUpTransactionResult = {
|
|
371
|
+
newDeposit: bigint
|
|
372
|
+
txHash: Hex
|
|
373
|
+
}
|
|
374
|
+
|
|
306
375
|
type TempoCall = NonNullable<ReturnType<(typeof Transaction)['deserialize']>['calls']>[number]
|
|
307
376
|
|
|
308
377
|
function assertCallHasTargetAndData(call: TempoCall): { to: Address; data: Hex } {
|
|
@@ -314,13 +383,7 @@ function assertCallHasTargetAndData(call: TempoCall): { to: Address; data: Hex }
|
|
|
314
383
|
return { to: call.to, data: call.data }
|
|
315
384
|
}
|
|
316
385
|
|
|
317
|
-
function validateSponsoredApproveCall(parameters: {
|
|
318
|
-
action: 'open' | 'topUp'
|
|
319
|
-
call: TempoCall
|
|
320
|
-
currency: Address
|
|
321
|
-
escrowContract: Address
|
|
322
|
-
expectedAmount: bigint
|
|
323
|
-
}) {
|
|
386
|
+
function validateSponsoredApproveCall(parameters: SponsoredApproveCallParameters) {
|
|
324
387
|
const { action, call, currency, escrowContract, expectedAmount } = parameters
|
|
325
388
|
const { to, data } = assertCallHasTargetAndData(call)
|
|
326
389
|
|
|
@@ -346,12 +409,7 @@ function validateSponsoredApproveCall(parameters: {
|
|
|
346
409
|
}
|
|
347
410
|
}
|
|
348
411
|
|
|
349
|
-
function validateSponsoredOpenCalls(parameters: {
|
|
350
|
-
calls: readonly TempoCall[]
|
|
351
|
-
currency: Address
|
|
352
|
-
escrowContract: Address
|
|
353
|
-
deposit: bigint
|
|
354
|
-
}) {
|
|
412
|
+
function validateSponsoredOpenCalls(parameters: SponsoredOpenCallsParameters) {
|
|
355
413
|
const { calls, currency, escrowContract, deposit } = parameters
|
|
356
414
|
|
|
357
415
|
let openCall: TempoCall | undefined
|
|
@@ -401,12 +459,7 @@ function validateSponsoredOpenCalls(parameters: {
|
|
|
401
459
|
return openCall
|
|
402
460
|
}
|
|
403
461
|
|
|
404
|
-
function validateSponsoredTopUpCalls(parameters: {
|
|
405
|
-
calls: readonly TempoCall[]
|
|
406
|
-
currency: Address
|
|
407
|
-
escrowContract: Address
|
|
408
|
-
topUpAmount: bigint
|
|
409
|
-
}) {
|
|
462
|
+
function validateSponsoredTopUpCalls(parameters: SponsoredTopUpCallsParameters) {
|
|
410
463
|
const { calls, currency, escrowContract, topUpAmount } = parameters
|
|
411
464
|
|
|
412
465
|
let topUpCall: TempoCall | undefined
|
|
@@ -456,21 +509,9 @@ function validateSponsoredTopUpCalls(parameters: {
|
|
|
456
509
|
return topUpCall
|
|
457
510
|
}
|
|
458
511
|
|
|
459
|
-
export async function broadcastOpenTransaction(
|
|
460
|
-
|
|
461
|
-
|
|
462
|
-
escrowContract: Address
|
|
463
|
-
channelId: Hex
|
|
464
|
-
recipient: Address
|
|
465
|
-
currency: Address
|
|
466
|
-
challengeExpires?: string | undefined
|
|
467
|
-
feePayerPolicy?: Partial<FeePayer.Policy> | undefined
|
|
468
|
-
feePayer?: Account | undefined
|
|
469
|
-
isSponsored?: boolean | undefined
|
|
470
|
-
beforeBroadcast?: ((onChain: OnChainChannel) => Promise<void> | void) | undefined
|
|
471
|
-
/** When false, simulates instead of waiting for confirmation and returns derived on-chain state. @default true */
|
|
472
|
-
waitForConfirmation?: boolean | undefined
|
|
473
|
-
}): Promise<BroadcastResult> {
|
|
512
|
+
export async function broadcastOpenTransaction(
|
|
513
|
+
parameters: BroadcastOpenTransactionParameters,
|
|
514
|
+
): Promise<BroadcastResult> {
|
|
474
515
|
const {
|
|
475
516
|
client,
|
|
476
517
|
serializedTransaction,
|
|
@@ -569,8 +610,8 @@ export async function broadcastOpenTransaction(parameters: {
|
|
|
569
610
|
reason: 'open transaction does not match claimed channelId',
|
|
570
611
|
})
|
|
571
612
|
|
|
572
|
-
const
|
|
573
|
-
|
|
613
|
+
const defaultFeeToken = defaults.currency[client.chain?.id as keyof typeof defaults.currency]
|
|
614
|
+
const resolvedFeeToken = transaction.feeToken ?? defaultFeeToken
|
|
574
615
|
|
|
575
616
|
const pendingOnChain = {
|
|
576
617
|
finalized: false,
|
|
@@ -594,10 +635,10 @@ export async function broadcastOpenTransaction(parameters: {
|
|
|
594
635
|
|
|
595
636
|
const sponsored = FeePayer.prepareSponsoredTransaction({
|
|
596
637
|
account: feePayer,
|
|
638
|
+
allowedFeeTokens: defaultFeeToken ? [defaultFeeToken] : undefined,
|
|
597
639
|
challengeExpires,
|
|
598
640
|
chainId: client.chain!.id,
|
|
599
641
|
details: { channelId, currency, recipient },
|
|
600
|
-
expectedFeeToken: defaults.currency[client.chain?.id as keyof typeof defaults.currency],
|
|
601
642
|
policy: feePayerPolicy,
|
|
602
643
|
transaction: {
|
|
603
644
|
...transaction,
|
|
@@ -660,19 +701,9 @@ export async function broadcastOpenTransaction(parameters: {
|
|
|
660
701
|
return { txHash, onChain }
|
|
661
702
|
}
|
|
662
703
|
|
|
663
|
-
export async function broadcastTopUpTransaction(
|
|
664
|
-
|
|
665
|
-
|
|
666
|
-
escrowContract: Address
|
|
667
|
-
channelId: Hex
|
|
668
|
-
currency: Address
|
|
669
|
-
declaredDeposit: bigint
|
|
670
|
-
previousDeposit: bigint
|
|
671
|
-
challengeExpires?: string | undefined
|
|
672
|
-
feePayerPolicy?: Partial<FeePayer.Policy> | undefined
|
|
673
|
-
feePayer?: Account | undefined
|
|
674
|
-
isSponsored?: boolean | undefined
|
|
675
|
-
}): Promise<{ txHash: Hex; newDeposit: bigint }> {
|
|
704
|
+
export async function broadcastTopUpTransaction(
|
|
705
|
+
parameters: BroadcastTopUpTransactionParameters,
|
|
706
|
+
): Promise<BroadcastTopUpTransactionResult> {
|
|
676
707
|
const {
|
|
677
708
|
client,
|
|
678
709
|
serializedTransaction,
|
|
@@ -743,9 +774,10 @@ export async function broadcastTopUpTransaction(parameters: {
|
|
|
743
774
|
reason: 'transaction does not contain a valid escrow topUp call',
|
|
744
775
|
})
|
|
745
776
|
|
|
746
|
-
const
|
|
777
|
+
const defaultFeeToken = defaults.currency[client.chain?.id as keyof typeof defaults.currency]
|
|
747
778
|
const sponsored = FeePayer.prepareSponsoredTransaction({
|
|
748
779
|
account: feePayer,
|
|
780
|
+
allowedFeeTokens: defaultFeeToken ? [defaultFeeToken] : undefined,
|
|
749
781
|
challengeExpires,
|
|
750
782
|
chainId: client.chain!.id,
|
|
751
783
|
details: {
|
|
@@ -753,12 +785,11 @@ export async function broadcastTopUpTransaction(parameters: {
|
|
|
753
785
|
channelId,
|
|
754
786
|
currency,
|
|
755
787
|
},
|
|
756
|
-
expectedFeeToken,
|
|
757
788
|
policy: feePayerPolicy,
|
|
758
789
|
transaction: {
|
|
759
790
|
...transaction,
|
|
760
|
-
...((transaction.feeToken ??
|
|
761
|
-
? { feeToken: transaction.feeToken ??
|
|
791
|
+
...((transaction.feeToken ?? defaultFeeToken)
|
|
792
|
+
? { feeToken: transaction.feeToken ?? defaultFeeToken }
|
|
762
793
|
: {}),
|
|
763
794
|
},
|
|
764
795
|
})
|
|
@@ -30,6 +30,7 @@ export function computeId(parameters: computeId.Parameters): Hex.Hex {
|
|
|
30
30
|
return Hash.keccak256(encoded)
|
|
31
31
|
}
|
|
32
32
|
|
|
33
|
+
/** Type helpers for {@link computeId}. */
|
|
33
34
|
export declare namespace computeId {
|
|
34
35
|
type Parameters = {
|
|
35
36
|
/** Address authorized to sign vouchers on behalf of the payer. */
|
|
@@ -0,0 +1,58 @@
|
|
|
1
|
+
import type { Address, Hex } from 'viem'
|
|
2
|
+
import { describe, expect, test } from 'vp/test'
|
|
3
|
+
|
|
4
|
+
import * as Store from '../../../Store.js'
|
|
5
|
+
import { chainId, escrowContract as escrowContractDefaults } from '../../internal/defaults.js'
|
|
6
|
+
import * as ChannelStore from './ChannelStore.js'
|
|
7
|
+
|
|
8
|
+
const channelId = '0x0000000000000000000000000000000000000000000000000000000000000001' as Hex
|
|
9
|
+
|
|
10
|
+
function legacyChannel(
|
|
11
|
+
overrides: Partial<ChannelStore.LegacyState> = {},
|
|
12
|
+
): ChannelStore.LegacyState {
|
|
13
|
+
return {
|
|
14
|
+
channelId,
|
|
15
|
+
payer: '0x0000000000000000000000000000000000000001' as Address,
|
|
16
|
+
payee: '0x0000000000000000000000000000000000000002' as Address,
|
|
17
|
+
token: '0x0000000000000000000000000000000000000003' as Address,
|
|
18
|
+
authorizedSigner: '0x0000000000000000000000000000000000000004' as Address,
|
|
19
|
+
chainId: 42431,
|
|
20
|
+
escrowContract: escrowContractDefaults[chainId.testnet] as Address,
|
|
21
|
+
deposit: 10_000_000n,
|
|
22
|
+
settledOnChain: 0n,
|
|
23
|
+
highestVoucherAmount: 10_000_000n,
|
|
24
|
+
highestVoucher: null,
|
|
25
|
+
spent: 0n,
|
|
26
|
+
units: 0,
|
|
27
|
+
closeRequestedAt: 0n,
|
|
28
|
+
finalized: false,
|
|
29
|
+
createdAt: '2025-01-01T00:00:00.000Z',
|
|
30
|
+
...overrides,
|
|
31
|
+
}
|
|
32
|
+
}
|
|
33
|
+
|
|
34
|
+
describe('legacy ChannelStore', () => {
|
|
35
|
+
test('keeps existing contract-backed channels compatible when backend fields are absent', async () => {
|
|
36
|
+
const store = ChannelStore.fromStore(Store.memory())
|
|
37
|
+
await store.updateChannel(channelId, () => legacyChannel())
|
|
38
|
+
|
|
39
|
+
const loaded = await store.getChannel(channelId)
|
|
40
|
+
expect(loaded).not.toBeNull()
|
|
41
|
+
expect(ChannelStore.isContractState(loaded!)).toBe(true)
|
|
42
|
+
expect(loaded!.backend).toBeUndefined()
|
|
43
|
+
expect('operator' in loaded!).toBe(false)
|
|
44
|
+
expect('salt' in loaded!).toBe(false)
|
|
45
|
+
expect('expiringNonceHash' in loaded!).toBe(false)
|
|
46
|
+
expect('descriptor' in loaded!).toBe(false)
|
|
47
|
+
})
|
|
48
|
+
|
|
49
|
+
test('supports explicit contract-backed channel state', async () => {
|
|
50
|
+
const store = ChannelStore.fromStore(Store.memory())
|
|
51
|
+
await store.updateChannel(channelId, () => legacyChannel({ backend: 'contract' }))
|
|
52
|
+
|
|
53
|
+
const loaded = await store.getChannel(channelId)
|
|
54
|
+
expect(loaded).not.toBeNull()
|
|
55
|
+
expect(ChannelStore.isContractState(loaded!)).toBe(true)
|
|
56
|
+
expect(loaded!.backend).toBe('contract')
|
|
57
|
+
})
|
|
58
|
+
})
|
|
@@ -0,0 +1,39 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Legacy contract-backed session channel-store facade.
|
|
3
|
+
*
|
|
4
|
+
* Legacy code imports channel-store types and helpers from this module so the
|
|
5
|
+
* contract-backed backend stays rooted under `tempo/legacy`. The underlying
|
|
6
|
+
* store adapter is shared with the TIP-1034 implementation because both
|
|
7
|
+
* backends persist the same accounting counters.
|
|
8
|
+
*/
|
|
9
|
+
import type * as SharedChannelStore from '../../session/server/ChannelStore.js'
|
|
10
|
+
|
|
11
|
+
export {
|
|
12
|
+
deductFromChannel,
|
|
13
|
+
fromStore,
|
|
14
|
+
normalizeChannelId,
|
|
15
|
+
type BackendState,
|
|
16
|
+
type BaseState,
|
|
17
|
+
type ChannelStore,
|
|
18
|
+
type DeductResult,
|
|
19
|
+
type State,
|
|
20
|
+
} from '../../session/server/ChannelStore.js'
|
|
21
|
+
|
|
22
|
+
/** State for a legacy smart-contract-backed payment channel. */
|
|
23
|
+
export interface LegacyContractBackendState {
|
|
24
|
+
/** Channel backend. Omitted for existing legacy records. */
|
|
25
|
+
backend?: 'contract' | undefined
|
|
26
|
+
}
|
|
27
|
+
|
|
28
|
+
/** @deprecated Use {@link LegacyContractBackendState}. */
|
|
29
|
+
export type ContractBackendState = LegacyContractBackendState
|
|
30
|
+
|
|
31
|
+
/** Legacy contract-backed channel state persisted by `tempo.sessionLegacy`. */
|
|
32
|
+
export type LegacyState = SharedChannelStore.BaseState & LegacyContractBackendState
|
|
33
|
+
|
|
34
|
+
/** Returns whether a channel is backed by the legacy smart contract escrow. */
|
|
35
|
+
export function isContractState(
|
|
36
|
+
state: SharedChannelStore.State,
|
|
37
|
+
): state is SharedChannelStore.BaseState & LegacyContractBackendState {
|
|
38
|
+
return state.backend === undefined || state.backend === 'contract'
|
|
39
|
+
}
|