mppx 0.8.15 → 0.8.18

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (966) hide show
  1. package/CHANGELOG.md +91 -0
  2. package/README.md +15 -0
  3. package/dist/Challenge.js +61 -39
  4. package/dist/Constants.d.ts +17 -17
  5. package/dist/Errors.d.ts +3 -3
  6. package/dist/Method.d.ts +35 -5
  7. package/dist/Method.js +7 -22
  8. package/dist/Store.d.ts +19 -0
  9. package/dist/Store.js +43 -0
  10. package/dist/attestation/Client.d.ts +17 -0
  11. package/dist/attestation/Client.js +28 -0
  12. package/dist/attestation/Constants.d.ts +15 -0
  13. package/dist/attestation/Constants.js +15 -0
  14. package/dist/attestation/Server.d.ts +4 -0
  15. package/dist/attestation/Server.js +8 -0
  16. package/dist/attestation/Types.d.ts +76 -0
  17. package/dist/attestation/Types.js +2 -0
  18. package/dist/attestation/index.d.ts +6 -0
  19. package/dist/attestation/index.js +6 -0
  20. package/dist/attestation/internal/HttpMessageSignature.d.ts +73 -0
  21. package/dist/attestation/internal/HttpMessageSignature.js +320 -0
  22. package/dist/attestation/internal/SigningContext.d.ts +4 -0
  23. package/dist/attestation/internal/SigningContext.js +11 -0
  24. package/dist/bin.js +3 -3
  25. package/dist/cli/THIRD-PARTY-LICENSES.txt +328 -0
  26. package/dist/cli/account.d.ts +14 -14
  27. package/dist/cli/cli.d.ts +6 -6
  28. package/dist/cli/cli.js +253 -1504
  29. package/dist/cli/plugins/index.js +19 -5
  30. package/dist/cli/plugins/tempo.js +7 -3
  31. package/dist/cli/sessions/Manager.js +7 -4
  32. package/dist/cli/sessions/commands.d.ts +4 -4
  33. package/dist/cli/sessions/request.d.ts +2 -0
  34. package/dist/cli/sessions/request.js +18 -0
  35. package/dist/cli/sessions/store.js +28 -14
  36. package/dist/cli/utils.d.ts +1 -1
  37. package/dist/cli/validate/index.d.ts +3 -3
  38. package/dist/client/Mppx.d.ts +3 -0
  39. package/dist/client/Mppx.js +13 -5
  40. package/dist/client/Transport.d.ts +3 -5
  41. package/dist/client/Transport.js +1 -17
  42. package/dist/client/internal/Fetch.js +2 -6
  43. package/dist/discovery/Discovery.js +2 -1
  44. package/dist/discovery/OpenApi.d.ts +3 -5
  45. package/dist/discovery/OpenApi.js +13 -34
  46. package/dist/discovery/internal/Metadata.d.ts +20 -0
  47. package/dist/discovery/internal/Metadata.js +36 -0
  48. package/dist/evm/Methods.d.ts +11 -11
  49. package/dist/evm/Types.d.ts +17 -17
  50. package/dist/evm/client/Charge.d.ts +11 -11
  51. package/dist/evm/client/Charge.js +8 -0
  52. package/dist/evm/client/Methods.d.ts +11 -11
  53. package/dist/evm/server/Charge.d.ts +1 -1
  54. package/dist/evm/server/Charge.js +2 -0
  55. package/dist/evm/server/Methods.d.ts +11 -11
  56. package/dist/internal/HeaderCodec.d.ts +2 -2
  57. package/dist/internal/types.d.ts +6 -0
  58. package/dist/proxy/Proxy.d.ts +2 -0
  59. package/dist/proxy/Proxy.js +117 -9
  60. package/dist/proxy/Service.d.ts +36 -1
  61. package/dist/proxy/Service.js +9 -8
  62. package/dist/proxy/services/anthropic.js +1 -0
  63. package/dist/proxy/services/openai.js +1 -0
  64. package/dist/proxy/services/stripe.js +1 -0
  65. package/dist/server/Mppx.d.ts +75 -13
  66. package/dist/server/Mppx.js +201 -23
  67. package/dist/server/core.d.ts +9 -0
  68. package/dist/server/core.js +9 -0
  69. package/dist/server/internal/html/config.d.ts +9 -9
  70. package/dist/server/internal/html/constants.d.ts +17 -17
  71. package/dist/stripe/Methods.d.ts +10 -10
  72. package/dist/stripe/client/Charge.d.ts +10 -10
  73. package/dist/stripe/client/Methods.d.ts +10 -10
  74. package/dist/stripe/internal/constants.d.ts +1 -1
  75. package/dist/stripe/internal/constants.js +1 -1
  76. package/dist/stripe/internal/types.d.ts +1 -0
  77. package/dist/stripe/server/Charge.d.ts +11 -11
  78. package/dist/stripe/server/Charge.js +51 -5
  79. package/dist/stripe/server/Methods.d.ts +137 -48
  80. package/dist/stripe/server/Methods.js +265 -4
  81. package/dist/stripe/server/internal/deposit-address.d.ts +13 -0
  82. package/dist/stripe/server/internal/deposit-address.js +28 -0
  83. package/dist/stripe/server/internal/html.gen.d.ts +1 -1
  84. package/dist/stripe/server/internal/html.gen.js +1 -1
  85. package/dist/stripe/server/internal/record-payment.d.ts +15 -0
  86. package/dist/stripe/server/internal/record-payment.js +42 -0
  87. package/dist/stripe/server/internal/request.d.ts +25 -0
  88. package/dist/stripe/server/internal/request.js +29 -0
  89. package/dist/stripe/server/spt.d.ts +8 -0
  90. package/dist/stripe/server/spt.js +8 -0
  91. package/dist/tap/Constants.d.ts +28 -0
  92. package/dist/tap/Constants.js +32 -0
  93. package/dist/tap/Types.d.ts +11 -0
  94. package/dist/tap/Types.js +2 -0
  95. package/dist/tap/client/index.d.ts +26 -0
  96. package/dist/tap/client/index.js +33 -0
  97. package/dist/tap/index.d.ts +5 -0
  98. package/dist/tap/index.js +5 -0
  99. package/dist/tap/server/index.d.ts +20 -0
  100. package/dist/tap/server/index.js +36 -0
  101. package/dist/tempo/Attribution.d.ts +1 -1
  102. package/dist/tempo/Methods.d.ts +73 -60
  103. package/dist/tempo/Methods.js +14 -3
  104. package/dist/tempo/Proof.d.ts +16 -16
  105. package/dist/tempo/client/Charge.d.ts +22 -19
  106. package/dist/tempo/client/Charge.js +32 -16
  107. package/dist/tempo/client/Methods.d.ts +51 -38
  108. package/dist/tempo/client/Subscription.d.ts +23 -23
  109. package/dist/tempo/internal/address.d.ts +2 -1
  110. package/dist/tempo/internal/address.js +3 -1
  111. package/dist/tempo/internal/auto-swap.js +4 -19
  112. package/dist/tempo/internal/defaults.d.ts +17 -6
  113. package/dist/tempo/internal/defaults.js +11 -0
  114. package/dist/tempo/internal/fee-payer.d.ts +12 -12
  115. package/dist/tempo/internal/machine-token-charge.d.ts +51 -0
  116. package/dist/tempo/internal/machine-token-charge.js +113 -0
  117. package/dist/tempo/internal/machine-token-session.d.ts +88 -0
  118. package/dist/tempo/internal/machine-token-session.js +173 -0
  119. package/dist/tempo/internal/proof.d.ts +17 -17
  120. package/dist/tempo/internal/signature-envelope.d.ts +14 -0
  121. package/dist/tempo/internal/signature-envelope.js +28 -0
  122. package/dist/tempo/legacy/client/ChannelOps.d.ts +2 -2
  123. package/dist/tempo/legacy/client/ChannelOps.js +11 -5
  124. package/dist/tempo/legacy/client/Session.d.ts +33 -21
  125. package/dist/tempo/legacy/client/Session.js +3 -3
  126. package/dist/tempo/legacy/client/SessionManager.d.ts +3 -1
  127. package/dist/tempo/legacy/client/SessionManager.js +2 -0
  128. package/dist/tempo/legacy/index.d.ts +1 -3
  129. package/dist/tempo/legacy/index.js +1 -3
  130. package/dist/tempo/legacy/session/escrow.abi.d.ts +374 -374
  131. package/dist/tempo/server/Charge.d.ts +28 -11
  132. package/dist/tempo/server/Charge.js +101 -55
  133. package/dist/tempo/server/Methods.d.ts +58 -56
  134. package/dist/tempo/server/Methods.js +8 -18
  135. package/dist/tempo/server/Relay.d.ts +1 -1
  136. package/dist/tempo/server/Relay.js +2 -2
  137. package/dist/tempo/server/Subscription.d.ts +25 -25
  138. package/dist/tempo/server/Subscription.js +2 -0
  139. package/dist/tempo/server/index.d.ts +1 -1
  140. package/dist/tempo/server/index.js +1 -1
  141. package/dist/tempo/server/internal/html.gen.d.ts +1 -1
  142. package/dist/tempo/server/internal/html.gen.js +1 -1
  143. package/dist/tempo/server/internal/transport.d.ts +2 -0
  144. package/dist/tempo/server/internal/transport.js +9 -2
  145. package/dist/tempo/session/client/ChannelOps.d.ts +18 -3
  146. package/dist/tempo/session/client/ChannelOps.js +35 -6
  147. package/dist/tempo/session/client/ChannelStore.d.ts +0 -5
  148. package/dist/tempo/session/client/ChannelStore.js +2 -2
  149. package/dist/tempo/session/client/CredentialState.d.ts +18 -3
  150. package/dist/tempo/session/client/CredentialState.js +77 -76
  151. package/dist/tempo/session/client/Runtime.d.ts +4 -2
  152. package/dist/tempo/session/client/Runtime.js +21 -5
  153. package/dist/tempo/session/client/Session.d.ts +34 -22
  154. package/dist/tempo/session/client/Session.js +186 -63
  155. package/dist/tempo/session/client/SessionManager.d.ts +3 -1
  156. package/dist/tempo/session/client/SessionManager.js +35 -11
  157. package/dist/tempo/session/client/Transports.d.ts +2 -0
  158. package/dist/tempo/session/client/Transports.js +12 -2
  159. package/dist/tempo/session/precompile/Chain.d.ts +37 -2
  160. package/dist/tempo/session/precompile/Chain.js +116 -15
  161. package/dist/tempo/session/precompile/Protocol.d.ts +15 -0
  162. package/dist/tempo/session/precompile/Protocol.js +7 -0
  163. package/dist/tempo/session/precompile/Voucher.d.ts +7 -5
  164. package/dist/tempo/session/precompile/Voucher.js +6 -12
  165. package/dist/tempo/session/precompile/escrow.abi.d.ts +306 -306
  166. package/dist/tempo/session/server/ChannelStore.d.ts +15 -0
  167. package/dist/tempo/session/server/ChannelStore.js +27 -12
  168. package/dist/tempo/session/server/CredentialVerification.d.ts +39 -20
  169. package/dist/tempo/session/server/CredentialVerification.js +359 -89
  170. package/dist/tempo/session/server/MeteredStream.d.ts +4 -1
  171. package/dist/tempo/session/server/MeteredStream.js +8 -5
  172. package/dist/tempo/session/server/RequestState.d.ts +19 -0
  173. package/dist/tempo/session/server/RequestState.js +61 -15
  174. package/dist/tempo/session/server/Session.d.ts +46 -23
  175. package/dist/tempo/session/server/Session.js +150 -56
  176. package/dist/tempo/session/server/Settlement.d.ts +11 -4
  177. package/dist/tempo/session/server/Settlement.js +53 -21
  178. package/dist/tempo/session/server/Sse.d.ts +3 -1
  179. package/dist/tempo/session/server/Sse.js +2 -1
  180. package/dist/tempo/session/server/Transports.d.ts +1 -1
  181. package/dist/tempo/session/server/Transports.js +1 -0
  182. package/dist/tempo/session/server/Ws.d.ts +6 -1
  183. package/dist/tempo/session/server/Ws.js +1 -0
  184. package/dist/tempo/subscription/KeyAuthorization.d.ts +39 -39
  185. package/dist/web-bot-auth/Constants.d.ts +20 -0
  186. package/dist/web-bot-auth/Constants.js +24 -0
  187. package/dist/web-bot-auth/Types.d.ts +10 -0
  188. package/dist/web-bot-auth/Types.js +2 -0
  189. package/dist/web-bot-auth/client/index.d.ts +29 -0
  190. package/dist/web-bot-auth/client/index.js +64 -0
  191. package/dist/web-bot-auth/index.d.ts +7 -0
  192. package/dist/web-bot-auth/index.js +7 -0
  193. package/dist/web-bot-auth/internal/JwkThumbprint.d.ts +5 -0
  194. package/dist/web-bot-auth/internal/JwkThumbprint.js +20 -0
  195. package/dist/web-bot-auth/internal/SignatureAgent.d.ts +3 -0
  196. package/dist/web-bot-auth/internal/SignatureAgent.js +18 -0
  197. package/dist/web-bot-auth/server/index.d.ts +35 -0
  198. package/dist/web-bot-auth/server/index.js +88 -0
  199. package/dist/x402/Types.d.ts +6 -6
  200. package/dist/x402/client/Exact.d.ts +8 -0
  201. package/dist/x402/client/Exact.js +40 -10
  202. package/dist/x402/server/EvmCharge.d.ts +22 -0
  203. package/dist/x402/server/EvmCharge.js +54 -20
  204. package/package.json +28 -34
  205. package/dist/BodyDigest.d.ts.map +0 -1
  206. package/dist/BodyDigest.js.map +0 -1
  207. package/dist/Challenge.d.ts.map +0 -1
  208. package/dist/Challenge.js.map +0 -1
  209. package/dist/Constants.d.ts.map +0 -1
  210. package/dist/Constants.js.map +0 -1
  211. package/dist/Credential.d.ts.map +0 -1
  212. package/dist/Credential.js.map +0 -1
  213. package/dist/Errors.d.ts.map +0 -1
  214. package/dist/Errors.js.map +0 -1
  215. package/dist/Expires.d.ts.map +0 -1
  216. package/dist/Expires.js.map +0 -1
  217. package/dist/Html.d.ts.map +0 -1
  218. package/dist/Html.js.map +0 -1
  219. package/dist/Mcp.d.ts.map +0 -1
  220. package/dist/Mcp.js.map +0 -1
  221. package/dist/Method.d.ts.map +0 -1
  222. package/dist/Method.js.map +0 -1
  223. package/dist/PaymentRequest.d.ts.map +0 -1
  224. package/dist/PaymentRequest.js.map +0 -1
  225. package/dist/Receipt.d.ts.map +0 -1
  226. package/dist/Receipt.js.map +0 -1
  227. package/dist/Store.d.ts.map +0 -1
  228. package/dist/Store.js.map +0 -1
  229. package/dist/bin.d.ts.map +0 -1
  230. package/dist/bin.js.map +0 -1
  231. package/dist/cli/account.d.ts.map +0 -1
  232. package/dist/cli/account.js.map +0 -1
  233. package/dist/cli/cli.d.ts.map +0 -1
  234. package/dist/cli/cli.js.map +0 -1
  235. package/dist/cli/config.d.ts.map +0 -1
  236. package/dist/cli/config.js.map +0 -1
  237. package/dist/cli/internal.d.ts.map +0 -1
  238. package/dist/cli/internal.js.map +0 -1
  239. package/dist/cli/plugins/evm.d.ts.map +0 -1
  240. package/dist/cli/plugins/evm.js.map +0 -1
  241. package/dist/cli/plugins/index.d.ts.map +0 -1
  242. package/dist/cli/plugins/index.js.map +0 -1
  243. package/dist/cli/plugins/plugin.d.ts.map +0 -1
  244. package/dist/cli/plugins/plugin.js.map +0 -1
  245. package/dist/cli/plugins/stripe.d.ts.map +0 -1
  246. package/dist/cli/plugins/stripe.js.map +0 -1
  247. package/dist/cli/plugins/tempo.d.ts.map +0 -1
  248. package/dist/cli/plugins/tempo.js.map +0 -1
  249. package/dist/cli/sessions/Manager.d.ts.map +0 -1
  250. package/dist/cli/sessions/Manager.js.map +0 -1
  251. package/dist/cli/sessions/commands.d.ts.map +0 -1
  252. package/dist/cli/sessions/commands.js.map +0 -1
  253. package/dist/cli/sessions/request.d.ts.map +0 -1
  254. package/dist/cli/sessions/request.js.map +0 -1
  255. package/dist/cli/sessions/store.d.ts.map +0 -1
  256. package/dist/cli/sessions/store.js.map +0 -1
  257. package/dist/cli/utils.d.ts.map +0 -1
  258. package/dist/cli/utils.js.map +0 -1
  259. package/dist/cli/validate/challenge.d.ts.map +0 -1
  260. package/dist/cli/validate/challenge.js.map +0 -1
  261. package/dist/cli/validate/discovery.d.ts.map +0 -1
  262. package/dist/cli/validate/discovery.js.map +0 -1
  263. package/dist/cli/validate/helpers.d.ts.map +0 -1
  264. package/dist/cli/validate/helpers.js.map +0 -1
  265. package/dist/cli/validate/index.d.ts.map +0 -1
  266. package/dist/cli/validate/index.js.map +0 -1
  267. package/dist/cli/validate/messages.d.ts.map +0 -1
  268. package/dist/cli/validate/messages.js.map +0 -1
  269. package/dist/cli/validate/payment.d.ts.map +0 -1
  270. package/dist/cli/validate/payment.js.map +0 -1
  271. package/dist/client/Methods.d.ts.map +0 -1
  272. package/dist/client/Methods.js.map +0 -1
  273. package/dist/client/Mppx.d.ts.map +0 -1
  274. package/dist/client/Mppx.js.map +0 -1
  275. package/dist/client/Transport.d.ts.map +0 -1
  276. package/dist/client/Transport.js.map +0 -1
  277. package/dist/client/index.d.ts.map +0 -1
  278. package/dist/client/index.js.map +0 -1
  279. package/dist/client/internal/Fetch.d.ts.map +0 -1
  280. package/dist/client/internal/Fetch.js.map +0 -1
  281. package/dist/client/internal/MethodChallenge.d.ts.map +0 -1
  282. package/dist/client/internal/MethodChallenge.js.map +0 -1
  283. package/dist/client/internal/MethodResponse.d.ts.map +0 -1
  284. package/dist/client/internal/MethodResponse.js.map +0 -1
  285. package/dist/client/internal/protocols/Mcp.d.ts.map +0 -1
  286. package/dist/client/internal/protocols/Mcp.js.map +0 -1
  287. package/dist/client/internal/protocols/Mpp.d.ts.map +0 -1
  288. package/dist/client/internal/protocols/Mpp.js.map +0 -1
  289. package/dist/client/internal/protocols/Protocol.d.ts.map +0 -1
  290. package/dist/client/internal/protocols/Protocol.js.map +0 -1
  291. package/dist/client/internal/protocols/Shared.d.ts.map +0 -1
  292. package/dist/client/internal/protocols/Shared.js.map +0 -1
  293. package/dist/client/internal/protocols/X402.d.ts.map +0 -1
  294. package/dist/client/internal/protocols/X402.js.map +0 -1
  295. package/dist/client/node.d.ts.map +0 -1
  296. package/dist/client/node.js.map +0 -1
  297. package/dist/discovery/Discovery.d.ts.map +0 -1
  298. package/dist/discovery/Discovery.js.map +0 -1
  299. package/dist/discovery/OpenApi.d.ts.map +0 -1
  300. package/dist/discovery/OpenApi.js.map +0 -1
  301. package/dist/discovery/Validate.d.ts.map +0 -1
  302. package/dist/discovery/Validate.js.map +0 -1
  303. package/dist/discovery/index.d.ts.map +0 -1
  304. package/dist/discovery/index.js.map +0 -1
  305. package/dist/evm/Assets.d.ts.map +0 -1
  306. package/dist/evm/Assets.js.map +0 -1
  307. package/dist/evm/Chains.d.ts.map +0 -1
  308. package/dist/evm/Chains.js.map +0 -1
  309. package/dist/evm/Methods.d.ts.map +0 -1
  310. package/dist/evm/Methods.js.map +0 -1
  311. package/dist/evm/Types.d.ts.map +0 -1
  312. package/dist/evm/Types.js.map +0 -1
  313. package/dist/evm/client/Charge.d.ts.map +0 -1
  314. package/dist/evm/client/Charge.js.map +0 -1
  315. package/dist/evm/client/Methods.d.ts.map +0 -1
  316. package/dist/evm/client/Methods.js.map +0 -1
  317. package/dist/evm/client/index.d.ts.map +0 -1
  318. package/dist/evm/client/index.js.map +0 -1
  319. package/dist/evm/index.d.ts.map +0 -1
  320. package/dist/evm/index.js.map +0 -1
  321. package/dist/evm/server/Charge.d.ts.map +0 -1
  322. package/dist/evm/server/Charge.js.map +0 -1
  323. package/dist/evm/server/Methods.d.ts.map +0 -1
  324. package/dist/evm/server/Methods.js.map +0 -1
  325. package/dist/evm/server/index.d.ts.map +0 -1
  326. package/dist/evm/server/index.js.map +0 -1
  327. package/dist/index.d.ts.map +0 -1
  328. package/dist/index.js.map +0 -1
  329. package/dist/internal/AcceptPayment.d.ts.map +0 -1
  330. package/dist/internal/AcceptPayment.js.map +0 -1
  331. package/dist/internal/HeaderCodec.d.ts.map +0 -1
  332. package/dist/internal/HeaderCodec.js.map +0 -1
  333. package/dist/internal/constantTimeEqual.d.ts.map +0 -1
  334. package/dist/internal/constantTimeEqual.js.map +0 -1
  335. package/dist/internal/env.d.ts.map +0 -1
  336. package/dist/internal/env.js.map +0 -1
  337. package/dist/internal/types.d.ts.map +0 -1
  338. package/dist/internal/types.js.map +0 -1
  339. package/dist/mcp/client/McpClient.d.ts.map +0 -1
  340. package/dist/mcp/client/McpClient.js.map +0 -1
  341. package/dist/mcp/client/index.d.ts.map +0 -1
  342. package/dist/mcp/client/index.js.map +0 -1
  343. package/dist/mcp/server/Transport.d.ts.map +0 -1
  344. package/dist/mcp/server/Transport.js.map +0 -1
  345. package/dist/mcp/server/index.d.ts.map +0 -1
  346. package/dist/mcp/server/index.js.map +0 -1
  347. package/dist/middlewares/elysia.d.ts.map +0 -1
  348. package/dist/middlewares/elysia.js.map +0 -1
  349. package/dist/middlewares/express.d.ts.map +0 -1
  350. package/dist/middlewares/express.js.map +0 -1
  351. package/dist/middlewares/hono.d.ts.map +0 -1
  352. package/dist/middlewares/hono.js.map +0 -1
  353. package/dist/middlewares/internal/mppx.d.ts.map +0 -1
  354. package/dist/middlewares/internal/mppx.js.map +0 -1
  355. package/dist/middlewares/nextjs.d.ts.map +0 -1
  356. package/dist/middlewares/nextjs.js.map +0 -1
  357. package/dist/proxy/Proxy.d.ts.map +0 -1
  358. package/dist/proxy/Proxy.js.map +0 -1
  359. package/dist/proxy/Service.d.ts.map +0 -1
  360. package/dist/proxy/Service.js.map +0 -1
  361. package/dist/proxy/index.d.ts.map +0 -1
  362. package/dist/proxy/index.js.map +0 -1
  363. package/dist/proxy/internal/Headers.d.ts.map +0 -1
  364. package/dist/proxy/internal/Headers.js.map +0 -1
  365. package/dist/proxy/internal/Route.d.ts.map +0 -1
  366. package/dist/proxy/internal/Route.js.map +0 -1
  367. package/dist/proxy/services/anthropic.d.ts.map +0 -1
  368. package/dist/proxy/services/anthropic.js.map +0 -1
  369. package/dist/proxy/services/openai.d.ts.map +0 -1
  370. package/dist/proxy/services/openai.js.map +0 -1
  371. package/dist/proxy/services/stripe.d.ts.map +0 -1
  372. package/dist/proxy/services/stripe.js.map +0 -1
  373. package/dist/server/Methods.d.ts.map +0 -1
  374. package/dist/server/Methods.js.map +0 -1
  375. package/dist/server/Mppx.d.ts.map +0 -1
  376. package/dist/server/Mppx.js.map +0 -1
  377. package/dist/server/NodeListener.d.ts.map +0 -1
  378. package/dist/server/NodeListener.js.map +0 -1
  379. package/dist/server/Request.d.ts.map +0 -1
  380. package/dist/server/Request.js.map +0 -1
  381. package/dist/server/Response.d.ts.map +0 -1
  382. package/dist/server/Response.js.map +0 -1
  383. package/dist/server/Transport.d.ts.map +0 -1
  384. package/dist/server/Transport.js.map +0 -1
  385. package/dist/server/index.d.ts.map +0 -1
  386. package/dist/server/index.js.map +0 -1
  387. package/dist/server/internal/html/compose.main.gen.d.ts.map +0 -1
  388. package/dist/server/internal/html/compose.main.gen.js.map +0 -1
  389. package/dist/server/internal/html/config.d.ts.map +0 -1
  390. package/dist/server/internal/html/config.js.map +0 -1
  391. package/dist/server/internal/html/constants.d.ts.map +0 -1
  392. package/dist/server/internal/html/constants.js.map +0 -1
  393. package/dist/server/internal/html/serviceWorker.client.d.ts.map +0 -1
  394. package/dist/server/internal/html/serviceWorker.client.js.map +0 -1
  395. package/dist/server/internal/html/serviceWorker.gen.d.ts.map +0 -1
  396. package/dist/server/internal/html/serviceWorker.gen.js.map +0 -1
  397. package/dist/server/internal/scope.d.ts.map +0 -1
  398. package/dist/server/internal/scope.js.map +0 -1
  399. package/dist/stripe/Methods.d.ts.map +0 -1
  400. package/dist/stripe/Methods.js.map +0 -1
  401. package/dist/stripe/client/Charge.d.ts.map +0 -1
  402. package/dist/stripe/client/Charge.js.map +0 -1
  403. package/dist/stripe/client/Methods.d.ts.map +0 -1
  404. package/dist/stripe/client/Methods.js.map +0 -1
  405. package/dist/stripe/client/index.d.ts.map +0 -1
  406. package/dist/stripe/client/index.js.map +0 -1
  407. package/dist/stripe/index.d.ts.map +0 -1
  408. package/dist/stripe/index.js.map +0 -1
  409. package/dist/stripe/internal/constants.d.ts.map +0 -1
  410. package/dist/stripe/internal/constants.js.map +0 -1
  411. package/dist/stripe/internal/types.d.ts.map +0 -1
  412. package/dist/stripe/internal/types.js.map +0 -1
  413. package/dist/stripe/server/Charge.d.ts.map +0 -1
  414. package/dist/stripe/server/Charge.js.map +0 -1
  415. package/dist/stripe/server/Methods.d.ts.map +0 -1
  416. package/dist/stripe/server/Methods.js.map +0 -1
  417. package/dist/stripe/server/index.d.ts.map +0 -1
  418. package/dist/stripe/server/index.js.map +0 -1
  419. package/dist/stripe/server/internal/html/types.d.ts.map +0 -1
  420. package/dist/stripe/server/internal/html/types.js.map +0 -1
  421. package/dist/stripe/server/internal/html.gen.d.ts.map +0 -1
  422. package/dist/stripe/server/internal/html.gen.js.map +0 -1
  423. package/dist/tempo/Attribution.d.ts.map +0 -1
  424. package/dist/tempo/Attribution.js.map +0 -1
  425. package/dist/tempo/Methods.d.ts.map +0 -1
  426. package/dist/tempo/Methods.js.map +0 -1
  427. package/dist/tempo/Proof.d.ts.map +0 -1
  428. package/dist/tempo/Proof.js.map +0 -1
  429. package/dist/tempo/client/Charge.d.ts.map +0 -1
  430. package/dist/tempo/client/Charge.js.map +0 -1
  431. package/dist/tempo/client/Methods.d.ts.map +0 -1
  432. package/dist/tempo/client/Methods.js.map +0 -1
  433. package/dist/tempo/client/ResolveAccount.d.ts.map +0 -1
  434. package/dist/tempo/client/ResolveAccount.js.map +0 -1
  435. package/dist/tempo/client/Subscription.d.ts.map +0 -1
  436. package/dist/tempo/client/Subscription.js.map +0 -1
  437. package/dist/tempo/client/index.d.ts.map +0 -1
  438. package/dist/tempo/client/index.js.map +0 -1
  439. package/dist/tempo/index.d.ts.map +0 -1
  440. package/dist/tempo/index.js.map +0 -1
  441. package/dist/tempo/internal/account.d.ts.map +0 -1
  442. package/dist/tempo/internal/account.js.map +0 -1
  443. package/dist/tempo/internal/address.d.ts.map +0 -1
  444. package/dist/tempo/internal/address.js.map +0 -1
  445. package/dist/tempo/internal/auto-swap.d.ts.map +0 -1
  446. package/dist/tempo/internal/auto-swap.js.map +0 -1
  447. package/dist/tempo/internal/charge.d.ts.map +0 -1
  448. package/dist/tempo/internal/charge.js.map +0 -1
  449. package/dist/tempo/internal/defaults.d.ts.map +0 -1
  450. package/dist/tempo/internal/defaults.js.map +0 -1
  451. package/dist/tempo/internal/fee-payer.d.ts.map +0 -1
  452. package/dist/tempo/internal/fee-payer.js.map +0 -1
  453. package/dist/tempo/internal/fee-token.d.ts.map +0 -1
  454. package/dist/tempo/internal/fee-token.js.map +0 -1
  455. package/dist/tempo/internal/proof.d.ts.map +0 -1
  456. package/dist/tempo/internal/proof.js.map +0 -1
  457. package/dist/tempo/internal/selectors.d.ts.map +0 -1
  458. package/dist/tempo/internal/selectors.js.map +0 -1
  459. package/dist/tempo/internal/types.d.ts.map +0 -1
  460. package/dist/tempo/internal/types.js.map +0 -1
  461. package/dist/tempo/legacy/client/ChannelOps.d.ts.map +0 -1
  462. package/dist/tempo/legacy/client/ChannelOps.js.map +0 -1
  463. package/dist/tempo/legacy/client/Session.d.ts.map +0 -1
  464. package/dist/tempo/legacy/client/Session.js.map +0 -1
  465. package/dist/tempo/legacy/client/SessionManager.d.ts.map +0 -1
  466. package/dist/tempo/legacy/client/SessionManager.js.map +0 -1
  467. package/dist/tempo/legacy/client/index.d.ts.map +0 -1
  468. package/dist/tempo/legacy/client/index.js.map +0 -1
  469. package/dist/tempo/legacy/index.d.ts.map +0 -1
  470. package/dist/tempo/legacy/index.js.map +0 -1
  471. package/dist/tempo/legacy/server/Session.d.ts +0 -208
  472. package/dist/tempo/legacy/server/Session.d.ts.map +0 -1
  473. package/dist/tempo/legacy/server/Session.js +0 -698
  474. package/dist/tempo/legacy/server/Session.js.map +0 -1
  475. package/dist/tempo/legacy/server/index.d.ts +0 -5
  476. package/dist/tempo/legacy/server/index.d.ts.map +0 -1
  477. package/dist/tempo/legacy/server/index.js +0 -5
  478. package/dist/tempo/legacy/server/index.js.map +0 -1
  479. package/dist/tempo/legacy/session/Chain.d.ts.map +0 -1
  480. package/dist/tempo/legacy/session/Chain.js.map +0 -1
  481. package/dist/tempo/legacy/session/Channel.d.ts.map +0 -1
  482. package/dist/tempo/legacy/session/Channel.js.map +0 -1
  483. package/dist/tempo/legacy/session/ChannelStore.d.ts +0 -22
  484. package/dist/tempo/legacy/session/ChannelStore.d.ts.map +0 -1
  485. package/dist/tempo/legacy/session/ChannelStore.js +0 -6
  486. package/dist/tempo/legacy/session/ChannelStore.js.map +0 -1
  487. package/dist/tempo/legacy/session/Types.d.ts.map +0 -1
  488. package/dist/tempo/legacy/session/Types.js.map +0 -1
  489. package/dist/tempo/legacy/session/Voucher.d.ts.map +0 -1
  490. package/dist/tempo/legacy/session/Voucher.js.map +0 -1
  491. package/dist/tempo/legacy/session/escrow.abi.d.ts.map +0 -1
  492. package/dist/tempo/legacy/session/escrow.abi.js.map +0 -1
  493. package/dist/tempo/legacy/session/index.d.ts.map +0 -1
  494. package/dist/tempo/legacy/session/index.js.map +0 -1
  495. package/dist/tempo/server/Charge.d.ts.map +0 -1
  496. package/dist/tempo/server/Charge.js.map +0 -1
  497. package/dist/tempo/server/Methods.d.ts.map +0 -1
  498. package/dist/tempo/server/Methods.js.map +0 -1
  499. package/dist/tempo/server/Relay.d.ts.map +0 -1
  500. package/dist/tempo/server/Relay.js.map +0 -1
  501. package/dist/tempo/server/SponsorBudget.d.ts.map +0 -1
  502. package/dist/tempo/server/SponsorBudget.js.map +0 -1
  503. package/dist/tempo/server/Subscription.d.ts.map +0 -1
  504. package/dist/tempo/server/Subscription.js.map +0 -1
  505. package/dist/tempo/server/index.d.ts.map +0 -1
  506. package/dist/tempo/server/index.js.map +0 -1
  507. package/dist/tempo/server/internal/html.gen.d.ts.map +0 -1
  508. package/dist/tempo/server/internal/html.gen.js.map +0 -1
  509. package/dist/tempo/server/internal/request-body.d.ts.map +0 -1
  510. package/dist/tempo/server/internal/request-body.js.map +0 -1
  511. package/dist/tempo/server/internal/transport.d.ts.map +0 -1
  512. package/dist/tempo/server/internal/transport.js.map +0 -1
  513. package/dist/tempo/session/Snapshot.d.ts.map +0 -1
  514. package/dist/tempo/session/Snapshot.js.map +0 -1
  515. package/dist/tempo/session/client/ChannelOps.d.ts.map +0 -1
  516. package/dist/tempo/session/client/ChannelOps.js.map +0 -1
  517. package/dist/tempo/session/client/ChannelStore.d.ts.map +0 -1
  518. package/dist/tempo/session/client/ChannelStore.js.map +0 -1
  519. package/dist/tempo/session/client/CredentialState.d.ts.map +0 -1
  520. package/dist/tempo/session/client/CredentialState.js.map +0 -1
  521. package/dist/tempo/session/client/ReceiptCoordinator.d.ts.map +0 -1
  522. package/dist/tempo/session/client/ReceiptCoordinator.js.map +0 -1
  523. package/dist/tempo/session/client/Runtime.d.ts.map +0 -1
  524. package/dist/tempo/session/client/Runtime.js.map +0 -1
  525. package/dist/tempo/session/client/Session.d.ts.map +0 -1
  526. package/dist/tempo/session/client/Session.js.map +0 -1
  527. package/dist/tempo/session/client/SessionManager.d.ts.map +0 -1
  528. package/dist/tempo/session/client/SessionManager.js.map +0 -1
  529. package/dist/tempo/session/client/Transports.d.ts.map +0 -1
  530. package/dist/tempo/session/client/Transports.js.map +0 -1
  531. package/dist/tempo/session/client/index.d.ts.map +0 -1
  532. package/dist/tempo/session/client/index.js.map +0 -1
  533. package/dist/tempo/session/client/internal/SessionManager.d.ts.map +0 -1
  534. package/dist/tempo/session/client/internal/SessionManager.js.map +0 -1
  535. package/dist/tempo/session/index.d.ts.map +0 -1
  536. package/dist/tempo/session/index.js.map +0 -1
  537. package/dist/tempo/session/precompile/Chain.d.ts.map +0 -1
  538. package/dist/tempo/session/precompile/Chain.js.map +0 -1
  539. package/dist/tempo/session/precompile/Channel.d.ts.map +0 -1
  540. package/dist/tempo/session/precompile/Channel.js.map +0 -1
  541. package/dist/tempo/session/precompile/Protocol.d.ts.map +0 -1
  542. package/dist/tempo/session/precompile/Protocol.js.map +0 -1
  543. package/dist/tempo/session/precompile/Voucher.d.ts.map +0 -1
  544. package/dist/tempo/session/precompile/Voucher.js.map +0 -1
  545. package/dist/tempo/session/precompile/escrow.abi.d.ts.map +0 -1
  546. package/dist/tempo/session/precompile/escrow.abi.js.map +0 -1
  547. package/dist/tempo/session/precompile/index.d.ts.map +0 -1
  548. package/dist/tempo/session/precompile/index.js.map +0 -1
  549. package/dist/tempo/session/server/ChannelOps.d.ts.map +0 -1
  550. package/dist/tempo/session/server/ChannelOps.js.map +0 -1
  551. package/dist/tempo/session/server/ChannelStore.d.ts.map +0 -1
  552. package/dist/tempo/session/server/ChannelStore.js.map +0 -1
  553. package/dist/tempo/session/server/CredentialVerification.d.ts.map +0 -1
  554. package/dist/tempo/session/server/CredentialVerification.js.map +0 -1
  555. package/dist/tempo/session/server/MeteredStream.d.ts.map +0 -1
  556. package/dist/tempo/session/server/MeteredStream.js.map +0 -1
  557. package/dist/tempo/session/server/RequestState.d.ts.map +0 -1
  558. package/dist/tempo/session/server/RequestState.js.map +0 -1
  559. package/dist/tempo/session/server/Session.d.ts.map +0 -1
  560. package/dist/tempo/session/server/Session.js.map +0 -1
  561. package/dist/tempo/session/server/Settlement.d.ts.map +0 -1
  562. package/dist/tempo/session/server/Settlement.js.map +0 -1
  563. package/dist/tempo/session/server/Sse.d.ts.map +0 -1
  564. package/dist/tempo/session/server/Sse.js.map +0 -1
  565. package/dist/tempo/session/server/Transports.d.ts.map +0 -1
  566. package/dist/tempo/session/server/Transports.js.map +0 -1
  567. package/dist/tempo/session/server/Ws.d.ts.map +0 -1
  568. package/dist/tempo/session/server/Ws.js.map +0 -1
  569. package/dist/tempo/session/server/index.d.ts.map +0 -1
  570. package/dist/tempo/session/server/index.js.map +0 -1
  571. package/dist/tempo/subscription/KeyAuthorization.d.ts.map +0 -1
  572. package/dist/tempo/subscription/KeyAuthorization.js.map +0 -1
  573. package/dist/tempo/subscription/Receipt.d.ts.map +0 -1
  574. package/dist/tempo/subscription/Receipt.js.map +0 -1
  575. package/dist/tempo/subscription/Store.d.ts.map +0 -1
  576. package/dist/tempo/subscription/Store.js.map +0 -1
  577. package/dist/tempo/subscription/Types.d.ts.map +0 -1
  578. package/dist/tempo/subscription/Types.js.map +0 -1
  579. package/dist/tempo/subscription/index.d.ts.map +0 -1
  580. package/dist/tempo/subscription/index.js.map +0 -1
  581. package/dist/validation/core.d.ts.map +0 -1
  582. package/dist/validation/core.js.map +0 -1
  583. package/dist/validation/index.d.ts.map +0 -1
  584. package/dist/validation/index.js.map +0 -1
  585. package/dist/viem/Account.d.ts.map +0 -1
  586. package/dist/viem/Account.js.map +0 -1
  587. package/dist/viem/Client.d.ts.map +0 -1
  588. package/dist/viem/Client.js.map +0 -1
  589. package/dist/x402/Assets.d.ts.map +0 -1
  590. package/dist/x402/Assets.js.map +0 -1
  591. package/dist/x402/Header.d.ts.map +0 -1
  592. package/dist/x402/Header.js.map +0 -1
  593. package/dist/x402/Types.d.ts.map +0 -1
  594. package/dist/x402/Types.js.map +0 -1
  595. package/dist/x402/client/Exact.d.ts.map +0 -1
  596. package/dist/x402/client/Exact.js.map +0 -1
  597. package/dist/x402/index.d.ts.map +0 -1
  598. package/dist/x402/index.js.map +0 -1
  599. package/dist/x402/internal/ChallengeBrand.d.ts.map +0 -1
  600. package/dist/x402/internal/ChallengeBrand.js.map +0 -1
  601. package/dist/x402/internal/RouteBinding.d.ts.map +0 -1
  602. package/dist/x402/internal/RouteBinding.js.map +0 -1
  603. package/dist/x402/server/EvmCharge.d.ts.map +0 -1
  604. package/dist/x402/server/EvmCharge.js.map +0 -1
  605. package/dist/x402/server/Facilitator.d.ts.map +0 -1
  606. package/dist/x402/server/Facilitator.js.map +0 -1
  607. package/dist/zod.d.ts.map +0 -1
  608. package/dist/zod.js.map +0 -1
  609. package/src/BodyDigest.test.ts +0 -43
  610. package/src/BodyDigest.ts +0 -55
  611. package/src/Challenge.fuzz.test.ts +0 -121
  612. package/src/Challenge.test-d.ts +0 -82
  613. package/src/Challenge.test.ts +0 -995
  614. package/src/Challenge.ts +0 -683
  615. package/src/Constants.ts +0 -58
  616. package/src/Credential.fuzz.test.ts +0 -62
  617. package/src/Credential.test.ts +0 -378
  618. package/src/Credential.ts +0 -217
  619. package/src/Errors.test.ts +0 -520
  620. package/src/Errors.ts +0 -448
  621. package/src/Expires.test.ts +0 -112
  622. package/src/Expires.ts +0 -59
  623. package/src/Html.ts +0 -67
  624. package/src/Mcp.ts +0 -85
  625. package/src/Method.test.ts +0 -177
  626. package/src/Method.ts +0 -617
  627. package/src/PaymentRequest.test.ts +0 -147
  628. package/src/PaymentRequest.ts +0 -108
  629. package/src/Receipt.test.ts +0 -151
  630. package/src/Receipt.ts +0 -146
  631. package/src/Store.test-d.ts +0 -195
  632. package/src/Store.test.ts +0 -357
  633. package/src/Store.ts +0 -329
  634. package/src/bin.ts +0 -4
  635. package/src/cli/account.ts +0 -269
  636. package/src/cli/cli.test.ts +0 -2221
  637. package/src/cli/cli.ts +0 -1649
  638. package/src/cli/config.test.ts +0 -89
  639. package/src/cli/config.ts +0 -50
  640. package/src/cli/internal.ts +0 -114
  641. package/src/cli/mcp.test.ts +0 -262
  642. package/src/cli/plugins/evm.ts +0 -55
  643. package/src/cli/plugins/index.ts +0 -4
  644. package/src/cli/plugins/plugin.ts +0 -84
  645. package/src/cli/plugins/stripe.ts +0 -174
  646. package/src/cli/plugins/tempo.ts +0 -1102
  647. package/src/cli/sessions/Manager.test.ts +0 -249
  648. package/src/cli/sessions/Manager.ts +0 -93
  649. package/src/cli/sessions/commands.ts +0 -444
  650. package/src/cli/sessions/request.test.ts +0 -51
  651. package/src/cli/sessions/request.ts +0 -353
  652. package/src/cli/sessions/store.test.ts +0 -581
  653. package/src/cli/sessions/store.ts +0 -940
  654. package/src/cli/utils.test.ts +0 -156
  655. package/src/cli/utils.ts +0 -394
  656. package/src/cli/validate/challenge.ts +0 -565
  657. package/src/cli/validate/discovery.test.ts +0 -435
  658. package/src/cli/validate/discovery.ts +0 -221
  659. package/src/cli/validate/helpers.ts +0 -166
  660. package/src/cli/validate/index.ts +0 -229
  661. package/src/cli/validate/messages.ts +0 -7
  662. package/src/cli/validate/payment.ts +0 -774
  663. package/src/cli/validate.test.ts +0 -843
  664. package/src/client/Methods.ts +0 -8
  665. package/src/client/Mppx.test-d.ts +0 -270
  666. package/src/client/Mppx.test.ts +0 -1065
  667. package/src/client/Mppx.ts +0 -466
  668. package/src/client/Transport.test.ts +0 -619
  669. package/src/client/Transport.ts +0 -191
  670. package/src/client/index.ts +0 -29
  671. package/src/client/internal/Fetch.browser.test.ts +0 -197
  672. package/src/client/internal/Fetch.test-d.ts +0 -109
  673. package/src/client/internal/Fetch.test.ts +0 -2336
  674. package/src/client/internal/Fetch.ts +0 -1079
  675. package/src/client/internal/MethodChallenge.ts +0 -35
  676. package/src/client/internal/MethodResponse.ts +0 -67
  677. package/src/client/internal/protocols/Mcp.test.ts +0 -220
  678. package/src/client/internal/protocols/Mcp.ts +0 -186
  679. package/src/client/internal/protocols/Mpp.ts +0 -21
  680. package/src/client/internal/protocols/Protocol.ts +0 -10
  681. package/src/client/internal/protocols/Shared.ts +0 -25
  682. package/src/client/internal/protocols/X402.ts +0 -46
  683. package/src/client/node.test.ts +0 -115
  684. package/src/client/node.ts +0 -247
  685. package/src/discovery/Discovery.test.ts +0 -214
  686. package/src/discovery/Discovery.ts +0 -105
  687. package/src/discovery/OpenApi.test.ts +0 -453
  688. package/src/discovery/OpenApi.ts +0 -224
  689. package/src/discovery/Validate.test.ts +0 -305
  690. package/src/discovery/Validate.ts +0 -77
  691. package/src/discovery/index.ts +0 -3
  692. package/src/env.d.ts +0 -12
  693. package/src/evm/Assets.ts +0 -1
  694. package/src/evm/Chains.ts +0 -11
  695. package/src/evm/Methods.ts +0 -44
  696. package/src/evm/PublicInterface.test-d.ts +0 -134
  697. package/src/evm/Types.ts +0 -140
  698. package/src/evm/client/Charge.test.ts +0 -347
  699. package/src/evm/client/Charge.ts +0 -187
  700. package/src/evm/client/Methods.ts +0 -19
  701. package/src/evm/client/index.ts +0 -6
  702. package/src/evm/index.ts +0 -16
  703. package/src/evm/server/Charge.test.ts +0 -339
  704. package/src/evm/server/Charge.ts +0 -290
  705. package/src/evm/server/Methods.ts +0 -22
  706. package/src/evm/server/index.ts +0 -6
  707. package/src/index.ts +0 -14
  708. package/src/internal/AcceptPayment.test.ts +0 -343
  709. package/src/internal/AcceptPayment.ts +0 -366
  710. package/src/internal/HeaderCodec.ts +0 -36
  711. package/src/internal/changeset.test.ts +0 -106
  712. package/src/internal/constantTimeEqual.test.ts +0 -47
  713. package/src/internal/constantTimeEqual.ts +0 -10
  714. package/src/internal/env.test.ts +0 -42
  715. package/src/internal/env.ts +0 -49
  716. package/src/internal/types.test-d.ts +0 -21
  717. package/src/internal/types.ts +0 -470
  718. package/src/mcp/client/McpClient.integration.test.ts +0 -652
  719. package/src/mcp/client/McpClient.test-d.ts +0 -144
  720. package/src/mcp/client/McpClient.test.ts +0 -463
  721. package/src/mcp/client/McpClient.ts +0 -307
  722. package/src/mcp/client/McpClient.unit.test.ts +0 -135
  723. package/src/mcp/client/index.ts +0 -2
  724. package/src/mcp/server/Transport.test.ts +0 -191
  725. package/src/mcp/server/Transport.ts +0 -111
  726. package/src/mcp/server/index.ts +0 -1
  727. package/src/middlewares/elysia.test.ts +0 -295
  728. package/src/middlewares/elysia.ts +0 -116
  729. package/src/middlewares/express.test.ts +0 -371
  730. package/src/middlewares/express.ts +0 -140
  731. package/src/middlewares/hono.test.ts +0 -476
  732. package/src/middlewares/hono.ts +0 -153
  733. package/src/middlewares/internal/mppx.test.ts +0 -177
  734. package/src/middlewares/internal/mppx.ts +0 -67
  735. package/src/middlewares/nextjs.test.ts +0 -369
  736. package/src/middlewares/nextjs.ts +0 -107
  737. package/src/proxy/Proxy.test.ts +0 -1031
  738. package/src/proxy/Proxy.ts +0 -345
  739. package/src/proxy/Service.test.ts +0 -182
  740. package/src/proxy/Service.ts +0 -253
  741. package/src/proxy/index.ts +0 -6
  742. package/src/proxy/internal/Headers.test.ts +0 -139
  743. package/src/proxy/internal/Headers.ts +0 -66
  744. package/src/proxy/internal/Route.test.ts +0 -217
  745. package/src/proxy/internal/Route.ts +0 -64
  746. package/src/proxy/services/anthropic.test.ts +0 -132
  747. package/src/proxy/services/anthropic.ts +0 -52
  748. package/src/proxy/services/openai.test.ts +0 -157
  749. package/src/proxy/services/openai.ts +0 -59
  750. package/src/proxy/services/stripe.test.ts +0 -175
  751. package/src/proxy/services/stripe.ts +0 -58
  752. package/src/server/Methods.ts +0 -3
  753. package/src/server/Mppx.authorize.test.ts +0 -210
  754. package/src/server/Mppx.test-d.ts +0 -360
  755. package/src/server/Mppx.test.ts +0 -5813
  756. package/src/server/Mppx.ts +0 -2623
  757. package/src/server/NodeListener.test.ts +0 -293
  758. package/src/server/NodeListener.ts +0 -45
  759. package/src/server/Request.test.ts +0 -255
  760. package/src/server/Request.ts +0 -155
  761. package/src/server/Response.test.ts +0 -32
  762. package/src/server/Response.ts +0 -45
  763. package/src/server/Transport.test.ts +0 -598
  764. package/src/server/Transport.ts +0 -320
  765. package/src/server/index.ts +0 -9
  766. package/src/server/internal/html/compose.main.gen.ts +0 -2
  767. package/src/server/internal/html/compose.main.ts +0 -88
  768. package/src/server/internal/html/config.ts +0 -672
  769. package/src/server/internal/html/constants.ts +0 -28
  770. package/src/server/internal/html/serviceWorker.client.ts +0 -28
  771. package/src/server/internal/html/serviceWorker.gen.ts +0 -2
  772. package/src/server/internal/html/serviceWorker.ts +0 -27
  773. package/src/server/internal/html/tsconfig.compose.json +0 -8
  774. package/src/server/internal/html/tsconfig.worker.client.json +0 -8
  775. package/src/server/internal/html/tsconfig.worker.json +0 -8
  776. package/src/server/internal/scope.ts +0 -43
  777. package/src/stripe/Charge.integration.test.ts +0 -329
  778. package/src/stripe/Methods.test.ts +0 -62
  779. package/src/stripe/Methods.ts +0 -44
  780. package/src/stripe/client/Charge.test.ts +0 -205
  781. package/src/stripe/client/Charge.ts +0 -132
  782. package/src/stripe/client/Methods.ts +0 -37
  783. package/src/stripe/client/index.ts +0 -2
  784. package/src/stripe/index.ts +0 -1
  785. package/src/stripe/internal/constants.ts +0 -7
  786. package/src/stripe/internal/types.ts +0 -46
  787. package/src/stripe/server/Charge.test-d.ts +0 -66
  788. package/src/stripe/server/Charge.test.ts +0 -621
  789. package/src/stripe/server/Charge.ts +0 -434
  790. package/src/stripe/server/Methods.ts +0 -24
  791. package/src/stripe/server/index.ts +0 -2
  792. package/src/stripe/server/internal/html/main.ts +0 -165
  793. package/src/stripe/server/internal/html/node_modules/.bin/mppx +0 -22
  794. package/src/stripe/server/internal/html/node_modules/.bin/mppx.src +0 -22
  795. package/src/stripe/server/internal/html/package.json +0 -9
  796. package/src/stripe/server/internal/html/stripe-js-pure.d.ts +0 -7
  797. package/src/stripe/server/internal/html/tsconfig.json +0 -8
  798. package/src/stripe/server/internal/html/types.ts +0 -5
  799. package/src/stripe/server/internal/html.gen.ts +0 -2
  800. package/src/tempo/AccessKeyAuthorization.test.ts +0 -141
  801. package/src/tempo/Attribution.test.ts +0 -294
  802. package/src/tempo/Attribution.ts +0 -185
  803. package/src/tempo/Methods.test.ts +0 -425
  804. package/src/tempo/Methods.ts +0 -367
  805. package/src/tempo/Proof.conformance.test.ts +0 -146
  806. package/src/tempo/Proof.test-d.ts +0 -32
  807. package/src/tempo/Proof.test.ts +0 -40
  808. package/src/tempo/Proof.ts +0 -69
  809. package/src/tempo/PublicExports.test-d.ts +0 -130
  810. package/src/tempo/Subscription.integration.test.ts +0 -591
  811. package/src/tempo/client/Charge.test.ts +0 -501
  812. package/src/tempo/client/Charge.ts +0 -289
  813. package/src/tempo/client/Methods.ts +0 -45
  814. package/src/tempo/client/ResolveAccount.ts +0 -46
  815. package/src/tempo/client/Subscription.test.ts +0 -180
  816. package/src/tempo/client/Subscription.ts +0 -156
  817. package/src/tempo/client/index.ts +0 -17
  818. package/src/tempo/index.ts +0 -5
  819. package/src/tempo/internal/account.ts +0 -56
  820. package/src/tempo/internal/address.ts +0 -6
  821. package/src/tempo/internal/auto-swap.test.ts +0 -198
  822. package/src/tempo/internal/auto-swap.ts +0 -188
  823. package/src/tempo/internal/charge.test.ts +0 -66
  824. package/src/tempo/internal/charge.ts +0 -43
  825. package/src/tempo/internal/defaults.test.ts +0 -95
  826. package/src/tempo/internal/defaults.ts +0 -53
  827. package/src/tempo/internal/fee-payer.test.ts +0 -1177
  828. package/src/tempo/internal/fee-payer.ts +0 -808
  829. package/src/tempo/internal/fee-token.test.ts +0 -165
  830. package/src/tempo/internal/fee-token.ts +0 -72
  831. package/src/tempo/internal/proof.test.ts +0 -97
  832. package/src/tempo/internal/proof.ts +0 -87
  833. package/src/tempo/internal/selectors.ts +0 -10
  834. package/src/tempo/internal/types.ts +0 -19
  835. package/src/tempo/legacy/AccessKeyAuthorization.test.ts +0 -162
  836. package/src/tempo/legacy/README.md +0 -9
  837. package/src/tempo/legacy/client/ChannelOps.test.ts +0 -379
  838. package/src/tempo/legacy/client/ChannelOps.ts +0 -271
  839. package/src/tempo/legacy/client/Session.test.ts +0 -800
  840. package/src/tempo/legacy/client/Session.ts +0 -397
  841. package/src/tempo/legacy/client/SessionManager.test.ts +0 -468
  842. package/src/tempo/legacy/client/SessionManager.ts +0 -909
  843. package/src/tempo/legacy/client/index.ts +0 -6
  844. package/src/tempo/legacy/index.ts +0 -6
  845. package/src/tempo/legacy/server/Defaults.test-d.ts +0 -9
  846. package/src/tempo/legacy/server/Session.test.ts +0 -6370
  847. package/src/tempo/legacy/server/Session.ts +0 -1024
  848. package/src/tempo/legacy/server/index.ts +0 -4
  849. package/src/tempo/legacy/session/Chain.test.ts +0 -1349
  850. package/src/tempo/legacy/session/Chain.ts +0 -830
  851. package/src/tempo/legacy/session/Channel.test.ts +0 -109
  852. package/src/tempo/legacy/session/Channel.ts +0 -51
  853. package/src/tempo/legacy/session/ChannelStore.test.ts +0 -58
  854. package/src/tempo/legacy/session/ChannelStore.ts +0 -39
  855. package/src/tempo/legacy/session/Types.ts +0 -91
  856. package/src/tempo/legacy/session/Voucher.test.ts +0 -410
  857. package/src/tempo/legacy/session/Voucher.ts +0 -183
  858. package/src/tempo/legacy/session/escrow.abi.ts +0 -760
  859. package/src/tempo/legacy/session/index.ts +0 -8
  860. package/src/tempo/server/AtomicStore.test-d.ts +0 -50
  861. package/src/tempo/server/Charge.test.ts +0 -6121
  862. package/src/tempo/server/Charge.ts +0 -1351
  863. package/src/tempo/server/Methods.ts +0 -106
  864. package/src/tempo/server/Relay.test.ts +0 -677
  865. package/src/tempo/server/Relay.ts +0 -297
  866. package/src/tempo/server/SponsorBudget.test.ts +0 -154
  867. package/src/tempo/server/SponsorBudget.ts +0 -219
  868. package/src/tempo/server/Sse.test.ts +0 -321
  869. package/src/tempo/server/Subscription.test.ts +0 -1944
  870. package/src/tempo/server/Subscription.ts +0 -1333
  871. package/src/tempo/server/index.ts +0 -12
  872. package/src/tempo/server/internal/html/main.ts +0 -115
  873. package/src/tempo/server/internal/html/node_modules/.bin/mppx +0 -22
  874. package/src/tempo/server/internal/html/node_modules/.bin/mppx.src +0 -22
  875. package/src/tempo/server/internal/html/package.json +0 -10
  876. package/src/tempo/server/internal/html/tsconfig.json +0 -8
  877. package/src/tempo/server/internal/html.gen.ts +0 -2
  878. package/src/tempo/server/internal/request-body.test.ts +0 -210
  879. package/src/tempo/server/internal/request-body.ts +0 -61
  880. package/src/tempo/server/internal/transport.test.ts +0 -903
  881. package/src/tempo/server/internal/transport.ts +0 -310
  882. package/src/tempo/session/README.md +0 -208
  883. package/src/tempo/session/Snapshot.test.ts +0 -41
  884. package/src/tempo/session/Snapshot.ts +0 -95
  885. package/src/tempo/session/client/ChannelOps.test.ts +0 -218
  886. package/src/tempo/session/client/ChannelOps.ts +0 -348
  887. package/src/tempo/session/client/ChannelStore.ts +0 -111
  888. package/src/tempo/session/client/CredentialState.test.ts +0 -789
  889. package/src/tempo/session/client/CredentialState.ts +0 -942
  890. package/src/tempo/session/client/ReceiptCoordinator.ts +0 -95
  891. package/src/tempo/session/client/Runtime.test.ts +0 -1104
  892. package/src/tempo/session/client/Runtime.ts +0 -1008
  893. package/src/tempo/session/client/Session.test.ts +0 -1355
  894. package/src/tempo/session/client/Session.ts +0 -420
  895. package/src/tempo/session/client/SessionManager.test.ts +0 -1899
  896. package/src/tempo/session/client/SessionManager.ts +0 -996
  897. package/src/tempo/session/client/Transports.test.ts +0 -1141
  898. package/src/tempo/session/client/Transports.ts +0 -1534
  899. package/src/tempo/session/client/index.ts +0 -40
  900. package/src/tempo/session/client/internal/SessionManager.ts +0 -36
  901. package/src/tempo/session/index.ts +0 -7
  902. package/src/tempo/session/precompile/Chain.integration.test.ts +0 -339
  903. package/src/tempo/session/precompile/Chain.test.ts +0 -1641
  904. package/src/tempo/session/precompile/Chain.ts +0 -1149
  905. package/src/tempo/session/precompile/Channel.test.ts +0 -147
  906. package/src/tempo/session/precompile/Channel.ts +0 -108
  907. package/src/tempo/session/precompile/Protocol.test.ts +0 -358
  908. package/src/tempo/session/precompile/Protocol.ts +0 -520
  909. package/src/tempo/session/precompile/Voucher.test.ts +0 -354
  910. package/src/tempo/session/precompile/Voucher.ts +0 -162
  911. package/src/tempo/session/precompile/escrow.abi.ts +0 -226
  912. package/src/tempo/session/precompile/index.ts +0 -33
  913. package/src/tempo/session/server/ChannelOps.test.ts +0 -129
  914. package/src/tempo/session/server/ChannelOps.ts +0 -157
  915. package/src/tempo/session/server/ChannelStore.test.ts +0 -1093
  916. package/src/tempo/session/server/ChannelStore.ts +0 -835
  917. package/src/tempo/session/server/CredentialVerification.test.ts +0 -299
  918. package/src/tempo/session/server/CredentialVerification.ts +0 -775
  919. package/src/tempo/session/server/MeteredStream.ts +0 -95
  920. package/src/tempo/session/server/RequestState.test.ts +0 -574
  921. package/src/tempo/session/server/RequestState.ts +0 -507
  922. package/src/tempo/session/server/Session.integration.test.ts +0 -449
  923. package/src/tempo/session/server/Session.test.ts +0 -3862
  924. package/src/tempo/session/server/Session.ts +0 -570
  925. package/src/tempo/session/server/Settlement.test.ts +0 -345
  926. package/src/tempo/session/server/Settlement.ts +0 -527
  927. package/src/tempo/session/server/Sse.fuzz.test.ts +0 -138
  928. package/src/tempo/session/server/Sse.test.ts +0 -557
  929. package/src/tempo/session/server/Sse.ts +0 -254
  930. package/src/tempo/session/server/Transports.test.ts +0 -346
  931. package/src/tempo/session/server/Transports.ts +0 -255
  932. package/src/tempo/session/server/Ws.test.ts +0 -594
  933. package/src/tempo/session/server/Ws.ts +0 -385
  934. package/src/tempo/session/server/index.ts +0 -12
  935. package/src/tempo/subscription/KeyAuthorization.test.ts +0 -282
  936. package/src/tempo/subscription/KeyAuthorization.ts +0 -396
  937. package/src/tempo/subscription/Receipt.ts +0 -28
  938. package/src/tempo/subscription/Store.test.ts +0 -609
  939. package/src/tempo/subscription/Store.ts +0 -449
  940. package/src/tempo/subscription/Types.ts +0 -68
  941. package/src/tempo/subscription/index.ts +0 -23
  942. package/src/tsconfig.json +0 -10
  943. package/src/validation/core.ts +0 -386
  944. package/src/validation/index.ts +0 -11
  945. package/src/viem/Account.test.ts +0 -72
  946. package/src/viem/Account.ts +0 -30
  947. package/src/viem/Client.test.ts +0 -366
  948. package/src/viem/Client.ts +0 -93
  949. package/src/x402/Assets.test.ts +0 -253
  950. package/src/x402/Assets.ts +0 -221
  951. package/src/x402/Exact.e2e.test.ts +0 -448
  952. package/src/x402/Exact.localnet.test.ts +0 -475
  953. package/src/x402/Header.test.ts +0 -73
  954. package/src/x402/Header.ts +0 -79
  955. package/src/x402/PublicInterface.test-d.ts +0 -39
  956. package/src/x402/Types.ts +0 -248
  957. package/src/x402/client/Exact.test.ts +0 -309
  958. package/src/x402/client/Exact.ts +0 -186
  959. package/src/x402/index.ts +0 -6
  960. package/src/x402/internal/ChallengeBrand.ts +0 -14
  961. package/src/x402/internal/RouteBinding.ts +0 -18
  962. package/src/x402/server/EvmCharge.ts +0 -394
  963. package/src/x402/server/Facilitator.test.ts +0 -111
  964. package/src/x402/server/Facilitator.ts +0 -56
  965. package/src/zod.test.ts +0 -169
  966. package/src/zod.ts +0 -71
@@ -1,1093 +0,0 @@
1
- import type { Address, Hex } from 'viem'
2
- import { afterEach, describe, expect, test, vi } from 'vp/test'
3
-
4
- import * as Challenge from '../../../Challenge.js'
5
- import {
6
- AmountExceedsDepositError,
7
- ChannelNotFoundError,
8
- DeltaTooSmallError,
9
- VerificationFailedError,
10
- } from '../../../Errors.js'
11
- import * as Store from '../../../Store.js'
12
- import { chainId, escrowContract as escrowContractDefaults } from '../../internal/defaults.js'
13
- import * as PrecompileChannel from '../precompile/Channel.js'
14
- import type { SessionSignedVoucher } from '../precompile/Protocol.js'
15
- import type { SignedVoucher } from '../precompile/Protocol.js'
16
- import * as Voucher from '../precompile/Voucher.js'
17
- import * as ChannelStore from './ChannelStore.js'
18
-
19
- const channelId = '0x0000000000000000000000000000000000000000000000000000000000000001' as Hex
20
- const channelId2 = '0x0000000000000000000000000000000000000000000000000000000000000002' as Hex
21
- const lowerCaseAliasChannelId = `0x${'ab'.repeat(31)}cd` as Hex
22
- const mixedCaseAliasChannelId = lowerCaseAliasChannelId.replace(/[a-f]/g, (character, index) =>
23
- index % 2 === 0 ? character.toUpperCase() : character,
24
- ) as Hex
25
-
26
- const precompileDescriptor = {
27
- payer: '0x0000000000000000000000000000000000000001' as Address,
28
- payee: '0x0000000000000000000000000000000000000002' as Address,
29
- operator: '0x0000000000000000000000000000000000000005' as Address,
30
- token: '0x0000000000000000000000000000000000000003' as Address,
31
- salt: `0x${'11'.repeat(32)}` as Hex,
32
- authorizedSigner: '0x0000000000000000000000000000000000000004' as Address,
33
- expiringNonceHash: `0x${'22'.repeat(32)}` as Hex,
34
- } satisfies PrecompileChannel.ChannelDescriptor
35
-
36
- type PrecompileChannelOverrides = Partial<ChannelStore.BaseState> &
37
- ChannelStore.PrecompileBackendState
38
-
39
- type ChannelOverrides = Partial<ChannelStore.State> | PrecompileChannelOverrides
40
-
41
- function makeChannel(overrides?: ChannelOverrides): ChannelStore.State {
42
- return {
43
- channelId,
44
- payer: '0x0000000000000000000000000000000000000001' as Address,
45
- payee: '0x0000000000000000000000000000000000000002' as Address,
46
- token: '0x0000000000000000000000000000000000000003' as Address,
47
- authorizedSigner: '0x0000000000000000000000000000000000000004' as Address,
48
- chainId: 42431,
49
- escrowContract: escrowContractDefaults[chainId.testnet] as Address,
50
- deposit: 10_000_000n,
51
- settledOnChain: 0n,
52
- highestVoucherAmount: 10_000_000n,
53
- highestVoucher: null,
54
- spent: 0n,
55
- units: 0,
56
- closeRequestedAt: 0n,
57
- finalized: false,
58
- createdAt: '2025-01-01T00:00:00.000Z',
59
- backend: 'precompile',
60
- operator: precompileDescriptor.operator,
61
- salt: precompileDescriptor.salt,
62
- expiringNonceHash: precompileDescriptor.expiringNonceHash,
63
- descriptor: precompileDescriptor,
64
- ...overrides,
65
- } as ChannelStore.State
66
- }
67
-
68
- function seedChannel(
69
- store: ChannelStore.ChannelStore,
70
- overrides?: ChannelOverrides,
71
- ): Promise<ChannelStore.State | null> {
72
- return store.updateChannel(channelId, () => {
73
- return makeChannel(overrides)
74
- })
75
- }
76
-
77
- function stripUpdateMethod(store: Store.Store | Store.AtomicStore): Store.Store {
78
- return {
79
- get: store.get.bind(store),
80
- put: store.put.bind(store),
81
- delete: store.delete.bind(store),
82
- }
83
- }
84
-
85
- function delayedStore(delayMs: number): Store.Store {
86
- const store = new Map<string, unknown>()
87
- return {
88
- async get(key) {
89
- await sleep(delayMs)
90
- return (store.get(key) ?? null) as any
91
- },
92
- async put(key, value) {
93
- await sleep(delayMs)
94
- store.set(key, value)
95
- },
96
- async delete(key) {
97
- await sleep(delayMs)
98
- store.delete(key)
99
- },
100
- }
101
- }
102
-
103
- function sleep(ms: number): Promise<void> {
104
- return new Promise((r) => setTimeout(r, ms))
105
- }
106
-
107
- afterEach(() => {
108
- vi.restoreAllMocks()
109
- })
110
-
111
- // ---------- Store.memory ----------
112
-
113
- describe('Store.memory', () => {
114
- test('get returns null for missing key', async () => {
115
- const s = Store.memory()
116
- expect(await s.get('missing')).toBeNull()
117
- })
118
-
119
- test('put then get returns value', async () => {
120
- const s = Store.memory()
121
- const ch = makeChannel()
122
- await s.put('k', ch)
123
- const result = await s.get('k')
124
- expect(result).toEqual(ch)
125
- })
126
-
127
- test('delete removes key', async () => {
128
- const s = Store.memory()
129
- await s.put('k', makeChannel())
130
- await s.delete('k')
131
- expect(await s.get('k')).toBeNull()
132
- })
133
- })
134
-
135
- const stateUpdateChannelId = `0x${'01'.repeat(32)}` as Hex
136
- const stateUpdateSignature = `0x${'aa'.repeat(65)}` as Hex
137
- const stateUpdateToken = '0x20c0000000000000000000000000000000000001' as Address
138
-
139
- const stateUpdateDescriptor = {
140
- payer: '0x0000000000000000000000000000000000000001' as Address,
141
- payee: '0x0000000000000000000000000000000000000002' as Address,
142
- operator: '0x0000000000000000000000000000000000000000' as Address,
143
- token: stateUpdateToken,
144
- salt: `0x${'02'.repeat(32)}` as Hex,
145
- authorizedSigner: '0x0000000000000000000000000000000000000001' as Address,
146
- expiringNonceHash: `0x${'03'.repeat(32)}` as Hex,
147
- }
148
-
149
- function stateUpdateVoucher(cumulativeAmount: bigint): SessionSignedVoucher {
150
- return { channelId: stateUpdateChannelId, cumulativeAmount, signature: stateUpdateSignature }
151
- }
152
-
153
- function stateUpdateChannel(overrides: Partial<ChannelStore.State> = {}): ChannelStore.State {
154
- return {
155
- backend: 'precompile',
156
- authorizedSigner: stateUpdateDescriptor.authorizedSigner,
157
- chainId: 4217,
158
- escrowContract: '0x4D50500000000000000000000000000000000000',
159
- channelId: stateUpdateChannelId,
160
- closeRequestedAt: 0n,
161
- createdAt: '2026-01-01T00:00:00.000Z',
162
- deposit: 100n,
163
- finalized: false,
164
- highestVoucher: stateUpdateVoucher(50n),
165
- highestVoucherAmount: 50n,
166
- payee: stateUpdateDescriptor.payee,
167
- payer: stateUpdateDescriptor.payer,
168
- settledOnChain: 10n,
169
- spent: 20n,
170
- token: stateUpdateToken,
171
- units: 2,
172
- descriptor: stateUpdateDescriptor,
173
- expiringNonceHash: stateUpdateDescriptor.expiringNonceHash,
174
- operator: stateUpdateDescriptor.operator,
175
- salt: stateUpdateDescriptor.salt,
176
- ...overrides,
177
- }
178
- }
179
-
180
- describe('ChannelStore state updates', () => {
181
- test('keeps the greater bigint value', () => {
182
- expect(ChannelStore.keepGreater(10n, 5n)).toBe(10n)
183
- expect(ChannelStore.keepGreater(10n, 15n)).toBe(15n)
184
- })
185
-
186
- test('keeps the greater close timestamp', () => {
187
- expect(ChannelStore.keepGreaterTimestamp(10n, 5)).toBe(10n)
188
- expect(ChannelStore.keepGreaterTimestamp(10n, 15)).toBe(15n)
189
- expect(ChannelStore.keepGreaterTimestamp(10n, 15n)).toBe(15n)
190
- })
191
-
192
- test('merges active on-chain state without decreasing persisted fields', () => {
193
- expect(
194
- ChannelStore.mergeActiveOnChainState(
195
- {
196
- closeRequestedAt: 7n,
197
- deposit: 100n,
198
- settledOnChain: 20n,
199
- },
200
- {
201
- closeRequestedAt: 5,
202
- deposit: 90n,
203
- settled: 25n,
204
- },
205
- ),
206
- ).toEqual({
207
- closeRequestedAt: 7n,
208
- deposit: 100n,
209
- settledOnChain: 25n,
210
- })
211
- })
212
-
213
- test('stores a new voucher when it is higher than current state', () => {
214
- expect(
215
- ChannelStore.resolveHighestVoucher({
216
- channelId: stateUpdateChannelId,
217
- current: { highestVoucherAmount: 10n, highestVoucher: null },
218
- cumulativeAmount: 20n,
219
- signature: stateUpdateSignature,
220
- }),
221
- ).toEqual({
222
- highestVoucherAmount: 20n,
223
- highestVoucher: {
224
- channelId: stateUpdateChannelId,
225
- cumulativeAmount: 20n,
226
- signature: stateUpdateSignature,
227
- },
228
- })
229
- })
230
-
231
- test('keeps an existing higher voucher', () => {
232
- const currentVoucher = stateUpdateVoucher(30n)
233
-
234
- expect(
235
- ChannelStore.resolveHighestVoucher({
236
- channelId: stateUpdateChannelId,
237
- current: { highestVoucherAmount: 30n, highestVoucher: currentVoucher },
238
- cumulativeAmount: 20n,
239
- signature: stateUpdateSignature,
240
- }),
241
- ).toEqual({
242
- highestVoucherAmount: 30n,
243
- highestVoucher: currentVoucher,
244
- })
245
- })
246
-
247
- test('resolvePrecompileChannelIdentity derives immutable descriptor identity fields', () => {
248
- expect(
249
- ChannelStore.resolvePrecompileChannelIdentity({
250
- authorizedSigner: stateUpdateDescriptor.authorizedSigner,
251
- chainId: 4217,
252
- channelId: stateUpdateChannelId,
253
- descriptor: stateUpdateDescriptor,
254
- escrow: '0x4D50500000000000000000000000000000000000',
255
- expiringNonceHash: stateUpdateDescriptor.expiringNonceHash,
256
- }),
257
- ).toEqual({
258
- authorizedSigner: stateUpdateDescriptor.authorizedSigner,
259
- backend: 'precompile',
260
- chainId: 4217,
261
- channelId: stateUpdateChannelId,
262
- descriptor: stateUpdateDescriptor,
263
- escrowContract: '0x4D50500000000000000000000000000000000000',
264
- expiringNonceHash: stateUpdateDescriptor.expiringNonceHash,
265
- operator: stateUpdateDescriptor.operator,
266
- payee: stateUpdateDescriptor.payee,
267
- payer: stateUpdateDescriptor.payer,
268
- salt: stateUpdateDescriptor.salt,
269
- token: stateUpdateToken,
270
- })
271
- })
272
-
273
- test('openChannelState creates precompile state and preserves higher accepted voucher', () => {
274
- const current = stateUpdateChannel({
275
- highestVoucherAmount: 80n,
276
- highestVoucher: stateUpdateVoucher(80n),
277
- spent: 25n,
278
- })
279
- const next = ChannelStore.openChannelState({
280
- authorizedSigner: stateUpdateDescriptor.authorizedSigner,
281
- chainId: 4217,
282
- channelId: stateUpdateChannelId,
283
- current,
284
- descriptor: stateUpdateDescriptor,
285
- escrow: current.escrowContract,
286
- expiringNonceHash: stateUpdateDescriptor.expiringNonceHash,
287
- cumulativeAmount: 60n,
288
- signature: stateUpdateSignature,
289
- state: { deposit: 120n, settled: 15n, closeRequestedAt: 0 },
290
- })
291
-
292
- expect(next.backend).toBe('precompile')
293
- expect(next.highestVoucherAmount).toBe(80n)
294
- expect(next.highestVoucher).toEqual(stateUpdateVoucher(80n))
295
- expect(next.deposit).toBe(120n)
296
- expect(next.spent).toBe(25n)
297
- })
298
-
299
- test('topUpChannelState only increases deposit, settled, and close timestamp', () => {
300
- const current = stateUpdateChannel({
301
- deposit: 100n,
302
- settledOnChain: 30n,
303
- closeRequestedAt: 4n,
304
- })
305
-
306
- const next = ChannelStore.topUpChannelState({
307
- current,
308
- state: { deposit: 90n, settled: 20n, closeRequestedAt: 3 },
309
- })
310
-
311
- expect(next).toMatchObject({
312
- deposit: 100n,
313
- settledOnChain: 30n,
314
- closeRequestedAt: 4n,
315
- })
316
- })
317
-
318
- test('acceptVoucherStateUpdate stores newer voucher and reconciles on-chain state', () => {
319
- const next = ChannelStore.acceptVoucherStateUpdate({
320
- current: stateUpdateChannel(),
321
- voucher: stateUpdateVoucher(70n),
322
- channelState: { deposit: 120n, settled: 25n, closeRequestedAt: 0 },
323
- })
324
-
325
- expect(next.highestVoucherAmount).toBe(70n)
326
- expect(next.deposit).toBe(120n)
327
- expect(next.settledOnChain).toBe(25n)
328
- })
329
-
330
- test('markPendingClose returns max(spent, on-chain settled) as capture amount', () => {
331
- const next = ChannelStore.markPendingClose({
332
- closeRequestedAt: 11n,
333
- cumulativeAmount: 50n,
334
- current: stateUpdateChannel({ spent: 20n }),
335
- onChainDeposit: 100n,
336
- onChainSettled: 30n,
337
- })
338
-
339
- expect(next.captureAmount).toBe(30n)
340
- expect(next.state?.closeRequestedAt).toBe(11n)
341
- })
342
-
343
- test('markPendingClose rejects close voucher below capture amount', () => {
344
- expect(() =>
345
- ChannelStore.markPendingClose({
346
- closeRequestedAt: 11n,
347
- cumulativeAmount: 25n,
348
- current: stateUpdateChannel({ spent: 20n }),
349
- onChainDeposit: 100n,
350
- onChainSettled: 30n,
351
- }),
352
- ).toThrow(VerificationFailedError)
353
- })
354
-
355
- test('markPendingClose rejects capture above on-chain deposit', () => {
356
- expect(() =>
357
- ChannelStore.markPendingClose({
358
- closeRequestedAt: 11n,
359
- cumulativeAmount: 50n,
360
- current: stateUpdateChannel({ spent: 40n }),
361
- onChainDeposit: 30n,
362
- onChainSettled: 0n,
363
- }),
364
- ).toThrow(AmountExceedsDepositError)
365
- })
366
-
367
- test('resolveCloseCaptureAmount captures max(local spent, on-chain settled)', () => {
368
- expect(
369
- ChannelStore.resolveCloseCaptureAmount({
370
- cumulativeAmount: 50n,
371
- onChainDeposit: 100n,
372
- onChainSettled: 30n,
373
- spent: 20n,
374
- }),
375
- ).toBe(30n)
376
-
377
- expect(
378
- ChannelStore.resolveCloseCaptureAmount({
379
- cumulativeAmount: 50n,
380
- onChainDeposit: 100n,
381
- onChainSettled: 10n,
382
- spent: 20n,
383
- }),
384
- ).toBe(20n)
385
- })
386
-
387
- test('resolveCloseCaptureAmount rejects invalid close boundaries', () => {
388
- expect(() =>
389
- ChannelStore.resolveCloseCaptureAmount({
390
- cumulativeAmount: 19n,
391
- onChainDeposit: 100n,
392
- onChainSettled: 10n,
393
- spent: 20n,
394
- }),
395
- ).toThrow(VerificationFailedError)
396
-
397
- expect(() =>
398
- ChannelStore.resolveCloseCaptureAmount({
399
- cumulativeAmount: 25n,
400
- onChainDeposit: 100n,
401
- onChainSettled: 30n,
402
- spent: 20n,
403
- }),
404
- ).toThrow(VerificationFailedError)
405
-
406
- expect(() =>
407
- ChannelStore.resolveCloseCaptureAmount({
408
- cumulativeAmount: 50n,
409
- onChainDeposit: 30n,
410
- onChainSettled: 0n,
411
- spent: 40n,
412
- }),
413
- ).toThrow(AmountExceedsDepositError)
414
- })
415
-
416
- test('finalizeClosedChannelState closes channel and records newer close voucher', () => {
417
- const next = ChannelStore.finalizeClosedChannelState({
418
- captureAmount: 60n,
419
- channelId: stateUpdateChannelId,
420
- cumulativeAmount: 70n,
421
- current: stateUpdateChannel({ highestVoucherAmount: 50n, settledOnChain: 20n }),
422
- signature: stateUpdateSignature,
423
- })
424
-
425
- expect(next).toMatchObject({
426
- finalized: true,
427
- closeRequestedAt: 0n,
428
- deposit: 0n,
429
- settledOnChain: 60n,
430
- highestVoucherAmount: 70n,
431
- })
432
- expect(next?.highestVoucher).toEqual(stateUpdateVoucher(70n))
433
- })
434
- })
435
-
436
- const voucherAcceptanceEscrow = '0x4D50500000000000000000000000000000000000' as Address
437
-
438
- const voucherAcceptanceChallenge = Challenge.from({
439
- id: 'challenge-1',
440
- realm: 'example.test',
441
- method: 'tempo',
442
- intent: 'session',
443
- request: {
444
- amount: '1',
445
- currency: stateUpdateToken,
446
- recipient: stateUpdateDescriptor.payee,
447
- unitType: 'request',
448
- },
449
- })
450
-
451
- function voucherAcceptanceVoucher(cumulativeAmount: bigint): SignedVoucher {
452
- return {
453
- channelId: stateUpdateChannelId,
454
- cumulativeAmount,
455
- signature: stateUpdateSignature,
456
- }
457
- }
458
-
459
- function voucherAcceptanceChannel(overrides: Partial<ChannelStore.State> = {}): ChannelStore.State {
460
- return stateUpdateChannel({
461
- escrowContract: voucherAcceptanceEscrow,
462
- highestVoucher: voucherAcceptanceVoucher(50n),
463
- ...overrides,
464
- })
465
- }
466
-
467
- function memoryChannelStore(initial: ChannelStore.State | null): ChannelStore.ChannelStore {
468
- let state = initial
469
- return {
470
- async getChannel() {
471
- return state
472
- },
473
- async updateChannel(_channelId, fn) {
474
- state = fn(state)
475
- return state
476
- },
477
- }
478
- }
479
-
480
- describe('ChannelStore voucher acceptance', () => {
481
- test('loads persisted precompile channels', async () => {
482
- const stored = voucherAcceptanceChannel()
483
-
484
- await expect(
485
- ChannelStore.loadPrecompileChannel({
486
- channelId: stateUpdateChannelId,
487
- chainId: 4217,
488
- descriptor: stateUpdateDescriptor,
489
- escrow: voucherAcceptanceEscrow,
490
- store: memoryChannelStore(stored),
491
- }),
492
- ).resolves.toBe(stored)
493
- })
494
-
495
- test('rejects missing and non-precompile channels', async () => {
496
- await expect(
497
- ChannelStore.loadPrecompileChannel({
498
- channelId: stateUpdateChannelId,
499
- chainId: 4217,
500
- descriptor: stateUpdateDescriptor,
501
- escrow: voucherAcceptanceEscrow,
502
- store: memoryChannelStore(null),
503
- }),
504
- ).rejects.toThrow(ChannelNotFoundError)
505
-
506
- await expect(
507
- ChannelStore.loadPrecompileChannel({
508
- channelId: stateUpdateChannelId,
509
- chainId: 4217,
510
- descriptor: stateUpdateDescriptor,
511
- escrow: voucherAcceptanceEscrow,
512
- store: memoryChannelStore(voucherAcceptanceChannel({ backend: 'external' })),
513
- }),
514
- ).rejects.toThrow(VerificationFailedError)
515
- })
516
-
517
- test('accepts a valid voucher and reconciles store state', async () => {
518
- vi.spyOn(Voucher, 'verifyVoucher').mockReturnValue(true)
519
- const store = memoryChannelStore(
520
- voucherAcceptanceChannel({ highestVoucherAmount: 50n, spent: 20n, units: 2 }),
521
- )
522
-
523
- const receipt = await ChannelStore.verifyAndAcceptVoucher({
524
- challenge: voucherAcceptanceChallenge,
525
- channel: (await store.getChannel(stateUpdateChannelId))!,
526
- channelState: { deposit: 100n, settled: 10n, closeRequestedAt: 0 },
527
- methodDetails: { chainId: 4217, escrowContract: voucherAcceptanceEscrow },
528
- minVoucherDelta: 5n,
529
- store,
530
- voucher: voucherAcceptanceVoucher(70n),
531
- })
532
-
533
- expect(receipt).toMatchObject({
534
- challengeId: voucherAcceptanceChallenge.id,
535
- channelId: stateUpdateChannelId,
536
- acceptedCumulative: '70',
537
- spent: '20',
538
- units: 2,
539
- })
540
- expect((await store.getChannel(stateUpdateChannelId))?.highestVoucherAmount).toBe(70n)
541
- })
542
-
543
- test('returns an idempotent receipt for an already accepted voucher', async () => {
544
- vi.spyOn(Voucher, 'verifyVoucher').mockReturnValue(true)
545
- const stored = voucherAcceptanceChannel({ highestVoucherAmount: 50n, spent: 30n, units: 4 })
546
- const store = memoryChannelStore(stored)
547
-
548
- const receipt = await ChannelStore.verifyAndAcceptVoucher({
549
- challenge: voucherAcceptanceChallenge,
550
- channel: stored,
551
- channelState: { deposit: 100n, settled: 10n, closeRequestedAt: 0 },
552
- methodDetails: { chainId: 4217, escrowContract: voucherAcceptanceEscrow },
553
- minVoucherDelta: 5n,
554
- store,
555
- voucher: voucherAcceptanceVoucher(50n),
556
- })
557
-
558
- expect(receipt).toMatchObject({ acceptedCumulative: '50', spent: '30', units: 4 })
559
- expect((await store.getChannel(stateUpdateChannelId))?.highestVoucherAmount).toBe(50n)
560
- })
561
-
562
- test('rejects an already accepted voucher when it has settled on-chain', async () => {
563
- vi.spyOn(Voucher, 'verifyVoucher').mockReturnValue(true)
564
- const stored = voucherAcceptanceChannel({ highestVoucherAmount: 50n })
565
-
566
- await expect(
567
- ChannelStore.verifyAndAcceptVoucher({
568
- challenge: voucherAcceptanceChallenge,
569
- channel: stored,
570
- channelState: { deposit: 100n, settled: 50n, closeRequestedAt: 0 },
571
- methodDetails: { chainId: 4217, escrowContract: voucherAcceptanceEscrow },
572
- minVoucherDelta: 5n,
573
- store: memoryChannelStore(stored),
574
- voucher: voucherAcceptanceVoucher(50n),
575
- }),
576
- ).rejects.toThrow(VerificationFailedError)
577
- })
578
-
579
- test('rejects vouchers beyond deposit or below minimum delta', async () => {
580
- vi.spyOn(Voucher, 'verifyVoucher').mockReturnValue(true)
581
- const stored = voucherAcceptanceChannel({ highestVoucherAmount: 50n })
582
-
583
- await expect(
584
- ChannelStore.verifyAndAcceptVoucher({
585
- challenge: voucherAcceptanceChallenge,
586
- channel: stored,
587
- channelState: { deposit: 60n, settled: 10n, closeRequestedAt: 0 },
588
- methodDetails: { chainId: 4217, escrowContract: voucherAcceptanceEscrow },
589
- minVoucherDelta: 5n,
590
- store: memoryChannelStore(stored),
591
- voucher: voucherAcceptanceVoucher(70n),
592
- }),
593
- ).rejects.toThrow(AmountExceedsDepositError)
594
-
595
- await expect(
596
- ChannelStore.verifyAndAcceptVoucher({
597
- challenge: voucherAcceptanceChallenge,
598
- channel: stored,
599
- channelState: { deposit: 100n, settled: 10n, closeRequestedAt: 0 },
600
- methodDetails: { chainId: 4217, escrowContract: voucherAcceptanceEscrow },
601
- minVoucherDelta: 5n,
602
- store: memoryChannelStore(stored),
603
- voucher: voucherAcceptanceVoucher(53n),
604
- }),
605
- ).rejects.toThrow(DeltaTooSmallError)
606
- })
607
- })
608
-
609
- // ---------- channelStore ----------
610
-
611
- describe('channelStore', () => {
612
- describe('getChannel', () => {
613
- test('returns null for missing channel', async () => {
614
- const cs = ChannelStore.fromStore(Store.memory())
615
- expect(await cs.getChannel(channelId)).toBeNull()
616
- })
617
-
618
- test('rejects malformed channel IDs before store access', async () => {
619
- const cs = ChannelStore.fromStore(Store.memory())
620
- await expect(cs.getChannel('0x1234' as Hex)).rejects.toThrow('Invalid session channel ID')
621
- await expect(cs.updateChannel('not-a-channel-id' as Hex, () => null)).rejects.toThrow(
622
- 'Invalid session channel ID',
623
- )
624
- expect(() => ChannelStore.normalizeChannelId('0x1234')).toThrow('Invalid session channel ID')
625
- })
626
-
627
- test('returns channel after update', async () => {
628
- const cs = ChannelStore.fromStore(Store.memory())
629
- const ch = makeChannel()
630
- await cs.updateChannel(channelId, () => ch)
631
-
632
- const loaded = await cs.getChannel(channelId)
633
- expect(loaded).not.toBeNull()
634
- expect(loaded!.channelId).toBe(channelId)
635
- expect(loaded!.deposit).toBe(10_000_000n)
636
- expect(typeof loaded!.deposit).toBe('bigint')
637
- expect(typeof loaded!.createdAt).toBe('string')
638
- })
639
-
640
- test('treats case-variant channelIds as the same record', async () => {
641
- const cs = ChannelStore.fromStore(Store.memory())
642
- await cs.updateChannel(mixedCaseAliasChannelId, () =>
643
- makeChannel({ channelId: mixedCaseAliasChannelId }),
644
- )
645
-
646
- const loaded = await cs.getChannel(lowerCaseAliasChannelId)
647
- expect(loaded).not.toBeNull()
648
- expect(loaded!.channelId).toBe(lowerCaseAliasChannelId)
649
-
650
- await cs.updateChannel(lowerCaseAliasChannelId, (current) =>
651
- current ? { ...current, spent: 1_000_000n } : null,
652
- )
653
-
654
- const aliased = await cs.getChannel(mixedCaseAliasChannelId)
655
- expect(aliased!.channelId).toBe(lowerCaseAliasChannelId)
656
- expect(aliased!.spent).toBe(1_000_000n)
657
- })
658
- })
659
-
660
- describe('updateChannel', () => {
661
- test('creates channel from null', async () => {
662
- const cs = ChannelStore.fromStore(Store.memory())
663
- const result = await cs.updateChannel(channelId, (current) => {
664
- expect(current).toBeNull()
665
- return makeChannel()
666
- })
667
- expect(result).not.toBeNull()
668
- expect(result!.deposit).toBe(10_000_000n)
669
- })
670
-
671
- test('updates existing channel', async () => {
672
- const cs = ChannelStore.fromStore(Store.memory())
673
- await seedChannel(cs)
674
-
675
- const result = await cs.updateChannel(channelId, (current) => {
676
- return { ...current!, spent: current!.spent + 1_000_000n, units: current!.units + 1 }
677
- })
678
- expect(result!.spent).toBe(1_000_000n)
679
- expect(result!.units).toBe(1)
680
- })
681
-
682
- test('returning null deletes channel', async () => {
683
- const cs = ChannelStore.fromStore(Store.memory())
684
- await seedChannel(cs)
685
-
686
- const result = await cs.updateChannel(channelId, () => null)
687
- expect(result).toBeNull()
688
- expect(await cs.getChannel(channelId)).toBeNull()
689
- })
690
-
691
- test('preserves bigint fields', async () => {
692
- const cs = ChannelStore.fromStore(Store.memory())
693
- const ch = makeChannel({
694
- deposit: 999_999_999_999_999_999n,
695
- settledOnChain: 123_456_789n,
696
- highestVoucherAmount: 888_888_888n,
697
- spent: 42n,
698
- })
699
- await cs.updateChannel(channelId, () => ch)
700
-
701
- const loaded = await cs.getChannel(channelId)
702
- expect(loaded!.deposit).toBe(999_999_999_999_999_999n)
703
- expect(loaded!.settledOnChain).toBe(123_456_789n)
704
- expect(loaded!.highestVoucherAmount).toBe(888_888_888n)
705
- expect(loaded!.spent).toBe(42n)
706
- })
707
-
708
- test('persists precompile descriptor fields without affecting accounting', async () => {
709
- const cs = ChannelStore.fromStore(Store.memory())
710
- await seedChannel(cs, {
711
- backend: 'precompile',
712
- operator: precompileDescriptor.operator,
713
- salt: precompileDescriptor.salt,
714
- expiringNonceHash: precompileDescriptor.expiringNonceHash,
715
- descriptor: precompileDescriptor,
716
- })
717
-
718
- const deducted = await ChannelStore.deductFromChannel(cs, channelId, 1_000_000n)
719
- expect(deducted.ok).toBe(true)
720
-
721
- const loaded = await cs.getChannel(channelId)
722
- expect(ChannelStore.isPrecompileState(loaded!)).toBe(true)
723
- if (!ChannelStore.isPrecompileState(loaded!)) throw new Error('expected precompile channel')
724
- expect(loaded!.backend).toBe('precompile')
725
- expect(loaded!.operator).toBe(precompileDescriptor.operator)
726
- expect(loaded!.salt).toBe(precompileDescriptor.salt)
727
- expect(loaded!.expiringNonceHash).toBe(precompileDescriptor.expiringNonceHash)
728
- expect(loaded!.descriptor).toEqual(precompileDescriptor)
729
- expect(loaded!.spent).toBe(1_000_000n)
730
- expect(loaded!.units).toBe(1)
731
- })
732
- })
733
-
734
- describe('waitForUpdate', () => {
735
- test('resolves on next updateChannel call', async () => {
736
- const cs = ChannelStore.fromStore(Store.memory())
737
- await seedChannel(cs)
738
-
739
- let resolved = false
740
- const waiter = cs.waitForUpdate!(channelId).then(() => {
741
- resolved = true
742
- })
743
-
744
- await sleep(10)
745
- expect(resolved).toBe(false)
746
-
747
- await cs.updateChannel(channelId, (c) => (c ? { ...c, spent: 1n } : null))
748
- await waiter
749
- expect(resolved).toBe(true)
750
- })
751
-
752
- test('multiple waiters all resolve', async () => {
753
- const cs = ChannelStore.fromStore(Store.memory())
754
- await seedChannel(cs)
755
-
756
- let count = 0
757
- const w1 = cs.waitForUpdate!(channelId).then(() => count++)
758
- const w2 = cs.waitForUpdate!(channelId).then(() => count++)
759
- const w3 = cs.waitForUpdate!(channelId).then(() => count++)
760
-
761
- await cs.updateChannel(channelId, (c) => (c ? { ...c, spent: 1n } : null))
762
- await Promise.all([w1, w2, w3])
763
- expect(count).toBe(3)
764
- })
765
-
766
- test('different channels are independent', async () => {
767
- const cs = ChannelStore.fromStore(Store.memory())
768
- await seedChannel(cs)
769
- await cs.updateChannel(channelId2, () => makeChannel({ channelId: channelId2 }))
770
-
771
- let ch1Resolved = false
772
- cs.waitForUpdate!(channelId).then(() => {
773
- ch1Resolved = true
774
- })
775
-
776
- await cs.updateChannel(channelId2, (c) => (c ? { ...c, spent: 1n } : null))
777
- await sleep(10)
778
- expect(ch1Resolved).toBe(false)
779
- })
780
-
781
- test('resolves on successful deductFromChannel with atomic store.update', async () => {
782
- const cs = ChannelStore.fromStore(Store.memory())
783
- await seedChannel(cs, { highestVoucherAmount: 5_000_000n, spent: 0n })
784
-
785
- let resolved = false
786
- const waiter = cs.waitForUpdate!(channelId).then(() => {
787
- resolved = true
788
- })
789
-
790
- await sleep(10)
791
- expect(resolved).toBe(false)
792
-
793
- const result = await ChannelStore.deductFromChannel(cs, channelId, 1_000_000n)
794
- expect(result.ok).toBe(true)
795
-
796
- await waiter
797
- expect(resolved).toBe(true)
798
- })
799
- })
800
- })
801
-
802
- // ---------- ChannelStore.deductFromChannel ----------
803
-
804
- describe('ChannelStore.deductFromChannel', () => {
805
- test('deducts when balance is sufficient', async () => {
806
- const cs = ChannelStore.fromStore(Store.memory())
807
- await seedChannel(cs, { highestVoucherAmount: 5_000_000n, spent: 0n })
808
-
809
- const result = await ChannelStore.deductFromChannel(cs, channelId, 1_000_000n)
810
- expect(result.ok).toBe(true)
811
- expect(result.channel.spent).toBe(1_000_000n)
812
- expect(result.channel.units).toBe(1)
813
- })
814
-
815
- test('returns ok: false when balance insufficient', async () => {
816
- const cs = ChannelStore.fromStore(Store.memory())
817
- await seedChannel(cs, { highestVoucherAmount: 1_000_000n, spent: 500_000n })
818
-
819
- const result = await ChannelStore.deductFromChannel(cs, channelId, 1_000_000n)
820
- expect(result.ok).toBe(false)
821
- expect(result.channel.spent).toBe(500_000n)
822
- })
823
-
824
- test('throws when channel does not exist', async () => {
825
- const cs = ChannelStore.fromStore(Store.memory())
826
- await expect(ChannelStore.deductFromChannel(cs, channelId, 1_000_000n)).rejects.toThrow(
827
- 'channel not found',
828
- )
829
- })
830
-
831
- test('rejects deduction when channel is finalized', async () => {
832
- const cs = ChannelStore.fromStore(Store.memory())
833
- await seedChannel(cs, { highestVoucherAmount: 10_000_000n, spent: 0n, finalized: true })
834
-
835
- const result = await ChannelStore.deductFromChannel(cs, channelId, 1_000_000n)
836
- expect(result.ok).toBe(false)
837
- expect(result.channel.spent).toBe(0n)
838
- })
839
-
840
- test.each([
841
- { label: 'atomic backend', create: () => ChannelStore.fromStore(Store.memory()) },
842
- {
843
- label: 'mutex fallback',
844
- create: () => ChannelStore.fromStore(stripUpdateMethod(Store.memory())),
845
- },
846
- ])('rejects deduction when channel close has been requested ($label)', async ({ create }) => {
847
- const cs = create()
848
- await seedChannel(cs, {
849
- highestVoucherAmount: 10_000_000n,
850
- spent: 0n,
851
- closeRequestedAt: 1n,
852
- })
853
-
854
- const result = await ChannelStore.deductFromChannel(cs, channelId, 1_000_000n)
855
- expect(result.ok).toBe(false)
856
- expect(result.channel.closeRequestedAt).toBe(1n)
857
- expect(result.channel.spent).toBe(0n)
858
- expect(result.channel.units).toBe(0)
859
- })
860
-
861
- test('exact balance succeeds', async () => {
862
- const cs = ChannelStore.fromStore(Store.memory())
863
- await seedChannel(cs, { highestVoucherAmount: 1_000_000n, spent: 0n })
864
-
865
- const result = await ChannelStore.deductFromChannel(cs, channelId, 1_000_000n)
866
- expect(result.ok).toBe(true)
867
- expect(result.channel.spent).toBe(1_000_000n)
868
- })
869
-
870
- test('sequential deductions accumulate correctly', async () => {
871
- const cs = ChannelStore.fromStore(Store.memory())
872
- await seedChannel(cs, { highestVoucherAmount: 5_000_000n, spent: 0n })
873
-
874
- for (let i = 0; i < 5; i++) {
875
- const result = await ChannelStore.deductFromChannel(cs, channelId, 1_000_000n)
876
- expect(result.ok).toBe(true)
877
- expect(result.channel.spent).toBe(BigInt((i + 1) * 1_000_000))
878
- expect(result.channel.units).toBe(i + 1)
879
- }
880
-
881
- const final = await ChannelStore.deductFromChannel(cs, channelId, 1_000_000n)
882
- expect(final.ok).toBe(false)
883
- })
884
- })
885
-
886
- // ---------- Concurrency ----------
887
-
888
- describe('concurrency', () => {
889
- describe('with update (atomic backend)', () => {
890
- test('concurrent deductions do not lose updates', async () => {
891
- const cs = ChannelStore.fromStore(Store.memory())
892
- await seedChannel(cs, { highestVoucherAmount: 100_000_000n, spent: 0n })
893
-
894
- const N = 50
895
- const results = await Promise.all(
896
- Array.from({ length: N }, () => ChannelStore.deductFromChannel(cs, channelId, 1_000_000n)),
897
- )
898
-
899
- const successes = results.filter((r) => r.ok).length
900
- expect(successes).toBe(N)
901
-
902
- const channel = await cs.getChannel(channelId)
903
- expect(channel!.spent).toBe(BigInt(N * 1_000_000))
904
- expect(channel!.units).toBe(N)
905
- })
906
-
907
- test('concurrent deductions respect balance limit', async () => {
908
- const cs = ChannelStore.fromStore(Store.memory())
909
- await seedChannel(cs, { highestVoucherAmount: 3_000_000n, spent: 0n })
910
-
911
- const N = 10
912
- const results = await Promise.all(
913
- Array.from({ length: N }, () => ChannelStore.deductFromChannel(cs, channelId, 1_000_000n)),
914
- )
915
-
916
- const successes = results.filter((r) => r.ok).length
917
- const failures = results.filter((r) => !r.ok).length
918
- expect(successes).toBe(3)
919
- expect(failures).toBe(7)
920
-
921
- const channel = await cs.getChannel(channelId)
922
- expect(channel!.spent).toBe(3_000_000n)
923
- expect(channel!.units).toBe(3)
924
- })
925
-
926
- test('concurrent updates to different channels are independent', async () => {
927
- const cs = ChannelStore.fromStore(Store.memory())
928
- await seedChannel(cs, { highestVoucherAmount: 10_000_000n, spent: 0n })
929
- await cs.updateChannel(channelId2, () =>
930
- makeChannel({ channelId: channelId2, highestVoucherAmount: 10_000_000n, spent: 0n }),
931
- )
932
-
933
- const N = 20
934
- const [results1, results2] = await Promise.all([
935
- Promise.all(
936
- Array.from({ length: N }, () =>
937
- ChannelStore.deductFromChannel(cs, channelId, 1_000_000n),
938
- ),
939
- ),
940
- Promise.all(
941
- Array.from({ length: N }, () =>
942
- ChannelStore.deductFromChannel(cs, channelId2, 1_000_000n),
943
- ),
944
- ),
945
- ])
946
-
947
- expect(results1.filter((r) => r.ok).length).toBe(10)
948
- expect(results2.filter((r) => r.ok).length).toBe(10)
949
-
950
- const ch1 = await cs.getChannel(channelId)
951
- const ch2 = await cs.getChannel(channelId2)
952
- expect(ch1!.spent).toBe(10_000_000n)
953
- expect(ch2!.spent).toBe(10_000_000n)
954
- })
955
- })
956
-
957
- describe('with mutex fallback (no update method)', () => {
958
- test('concurrent deductions do not lose updates', async () => {
959
- const cs = ChannelStore.fromStore(stripUpdateMethod(Store.memory()))
960
- await seedChannel(cs, { highestVoucherAmount: 100_000_000n, spent: 0n })
961
-
962
- const N = 50
963
- const results = await Promise.all(
964
- Array.from({ length: N }, () => ChannelStore.deductFromChannel(cs, channelId, 1_000_000n)),
965
- )
966
-
967
- const successes = results.filter((r) => r.ok).length
968
- expect(successes).toBe(N)
969
-
970
- const channel = await cs.getChannel(channelId)
971
- expect(channel!.spent).toBe(BigInt(N * 1_000_000))
972
- expect(channel!.units).toBe(N)
973
- })
974
-
975
- test('concurrent deductions respect balance limit', async () => {
976
- const cs = ChannelStore.fromStore(stripUpdateMethod(Store.memory()))
977
- await seedChannel(cs, { highestVoucherAmount: 3_000_000n, spent: 0n })
978
-
979
- const N = 10
980
- const results = await Promise.all(
981
- Array.from({ length: N }, () => ChannelStore.deductFromChannel(cs, channelId, 1_000_000n)),
982
- )
983
-
984
- const successes = results.filter((r) => r.ok).length
985
- const failures = results.filter((r) => !r.ok).length
986
- expect(successes).toBe(3)
987
- expect(failures).toBe(7)
988
-
989
- const channel = await cs.getChannel(channelId)
990
- expect(channel!.spent).toBe(3_000_000n)
991
- expect(channel!.units).toBe(3)
992
- })
993
-
994
- test('mutex serializes async operations', async () => {
995
- const s = delayedStore(5)
996
- const cs = ChannelStore.fromStore(s)
997
- await seedChannel(cs, { highestVoucherAmount: 100_000_000n, spent: 0n })
998
-
999
- const N = 10
1000
- const results = await Promise.all(
1001
- Array.from({ length: N }, () => ChannelStore.deductFromChannel(cs, channelId, 1_000_000n)),
1002
- )
1003
-
1004
- const successes = results.filter((r) => r.ok).length
1005
- expect(successes).toBe(N)
1006
-
1007
- const channel = await cs.getChannel(channelId)
1008
- expect(channel!.spent).toBe(BigInt(N * 1_000_000))
1009
- expect(channel!.units).toBe(N)
1010
- })
1011
-
1012
- test('mutex does not block different channels', async () => {
1013
- const cs = ChannelStore.fromStore(stripUpdateMethod(Store.memory()))
1014
- await seedChannel(cs, { highestVoucherAmount: 10_000_000n, spent: 0n })
1015
- await cs.updateChannel(channelId2, () =>
1016
- makeChannel({ channelId: channelId2, highestVoucherAmount: 10_000_000n, spent: 0n }),
1017
- )
1018
-
1019
- const N = 20
1020
- const [results1, results2] = await Promise.all([
1021
- Promise.all(
1022
- Array.from({ length: N }, () =>
1023
- ChannelStore.deductFromChannel(cs, channelId, 1_000_000n),
1024
- ),
1025
- ),
1026
- Promise.all(
1027
- Array.from({ length: N }, () =>
1028
- ChannelStore.deductFromChannel(cs, channelId2, 1_000_000n),
1029
- ),
1030
- ),
1031
- ])
1032
-
1033
- expect(results1.filter((r) => r.ok).length).toBe(10)
1034
- expect(results2.filter((r) => r.ok).length).toBe(10)
1035
- })
1036
-
1037
- test('mutex releases on callback error', async () => {
1038
- const cs = ChannelStore.fromStore(stripUpdateMethod(Store.memory()))
1039
- await seedChannel(cs)
1040
-
1041
- await expect(
1042
- cs.updateChannel(channelId, () => {
1043
- throw new Error('callback error')
1044
- }),
1045
- ).rejects.toThrow('callback error')
1046
-
1047
- const result = await cs.updateChannel(channelId, (c) => (c ? { ...c, spent: 1n } : null))
1048
- expect(result!.spent).toBe(1n)
1049
- })
1050
- })
1051
-
1052
- describe('parity: atomic vs mutex produce same results', () => {
1053
- test('same final state after N concurrent deductions', async () => {
1054
- const N = 30
1055
- const balance = 20_000_000n
1056
- const deduction = 1_000_000n
1057
-
1058
- const atomicCs = ChannelStore.fromStore(Store.memory())
1059
- await atomicCs.updateChannel(channelId, () =>
1060
- makeChannel({ highestVoucherAmount: balance, spent: 0n }),
1061
- )
1062
-
1063
- const mutexCs = ChannelStore.fromStore(stripUpdateMethod(Store.memory()))
1064
- await mutexCs.updateChannel(channelId, () =>
1065
- makeChannel({ highestVoucherAmount: balance, spent: 0n }),
1066
- )
1067
-
1068
- const [atomicResults, mutexResults] = await Promise.all([
1069
- Promise.all(
1070
- Array.from({ length: N }, () =>
1071
- ChannelStore.deductFromChannel(atomicCs, channelId, deduction),
1072
- ),
1073
- ),
1074
- Promise.all(
1075
- Array.from({ length: N }, () =>
1076
- ChannelStore.deductFromChannel(mutexCs, channelId, deduction),
1077
- ),
1078
- ),
1079
- ])
1080
-
1081
- const atomicSuccesses = atomicResults.filter((r) => r.ok).length
1082
- const mutexSuccesses = mutexResults.filter((r) => r.ok).length
1083
- expect(atomicSuccesses).toBe(mutexSuccesses)
1084
- expect(atomicSuccesses).toBe(20)
1085
-
1086
- const atomicChannel = await atomicCs.getChannel(channelId)
1087
- const mutexChannel = await mutexCs.getChannel(channelId)
1088
- expect(atomicChannel!.spent).toBe(mutexChannel!.spent)
1089
- expect(atomicChannel!.units).toBe(mutexChannel!.units)
1090
- expect(atomicChannel!.spent).toBe(balance)
1091
- })
1092
- })
1093
- })