mppx 0.8.17 → 0.8.18

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (914) hide show
  1. package/CHANGELOG.md +55 -0
  2. package/README.md +15 -0
  3. package/dist/Challenge.js +21 -4
  4. package/dist/bin.js +3 -3
  5. package/dist/cli/THIRD-PARTY-LICENSES.txt +328 -0
  6. package/dist/cli/cli.js +253 -1505
  7. package/dist/cli/plugins/index.js +19 -5
  8. package/dist/cli/plugins/tempo.js +7 -3
  9. package/dist/cli/sessions/Manager.js +7 -4
  10. package/dist/cli/sessions/request.d.ts +2 -0
  11. package/dist/cli/sessions/request.js +18 -0
  12. package/dist/cli/sessions/store.js +28 -14
  13. package/dist/discovery/Discovery.js +2 -1
  14. package/dist/evm/client/Charge.js +8 -0
  15. package/dist/server/core.d.ts +9 -0
  16. package/dist/server/core.js +9 -0
  17. package/dist/stripe/server/Charge.js +2 -4
  18. package/dist/stripe/server/Methods.d.ts +2 -2
  19. package/dist/stripe/server/Methods.js +17 -11
  20. package/dist/stripe/server/internal/html.gen.d.ts +1 -1
  21. package/dist/stripe/server/internal/html.gen.js +1 -1
  22. package/dist/stripe/server/spt.d.ts +8 -0
  23. package/dist/stripe/server/spt.js +8 -0
  24. package/dist/tempo/Methods.d.ts +13 -0
  25. package/dist/tempo/Methods.js +14 -3
  26. package/dist/tempo/client/Charge.d.ts +3 -0
  27. package/dist/tempo/client/Charge.js +31 -9
  28. package/dist/tempo/client/Methods.d.ts +13 -0
  29. package/dist/tempo/internal/defaults.d.ts +11 -0
  30. package/dist/tempo/internal/defaults.js +11 -0
  31. package/dist/tempo/internal/machine-token-charge.d.ts +51 -0
  32. package/dist/tempo/internal/machine-token-charge.js +113 -0
  33. package/dist/tempo/internal/machine-token-session.d.ts +88 -0
  34. package/dist/tempo/internal/machine-token-session.js +173 -0
  35. package/dist/tempo/internal/signature-envelope.d.ts +14 -0
  36. package/dist/tempo/internal/signature-envelope.js +28 -0
  37. package/dist/tempo/legacy/client/ChannelOps.d.ts +2 -2
  38. package/dist/tempo/legacy/client/ChannelOps.js +11 -5
  39. package/dist/tempo/legacy/client/Session.d.ts +13 -1
  40. package/dist/tempo/legacy/client/Session.js +3 -3
  41. package/dist/tempo/legacy/client/SessionManager.d.ts +3 -1
  42. package/dist/tempo/legacy/client/SessionManager.js +2 -0
  43. package/dist/tempo/server/Charge.d.ts +3 -0
  44. package/dist/tempo/server/Charge.js +58 -17
  45. package/dist/tempo/server/Methods.d.ts +21 -4
  46. package/dist/tempo/server/Methods.js +8 -4
  47. package/dist/tempo/server/internal/html.gen.d.ts +1 -1
  48. package/dist/tempo/server/internal/html.gen.js +1 -1
  49. package/dist/tempo/session/client/ChannelOps.d.ts +18 -3
  50. package/dist/tempo/session/client/ChannelOps.js +35 -6
  51. package/dist/tempo/session/client/ChannelStore.d.ts +0 -5
  52. package/dist/tempo/session/client/ChannelStore.js +2 -2
  53. package/dist/tempo/session/client/CredentialState.d.ts +17 -2
  54. package/dist/tempo/session/client/CredentialState.js +77 -76
  55. package/dist/tempo/session/client/Runtime.d.ts +4 -2
  56. package/dist/tempo/session/client/Runtime.js +21 -5
  57. package/dist/tempo/session/client/Session.d.ts +15 -3
  58. package/dist/tempo/session/client/Session.js +186 -63
  59. package/dist/tempo/session/client/SessionManager.d.ts +3 -1
  60. package/dist/tempo/session/client/SessionManager.js +35 -11
  61. package/dist/tempo/session/client/Transports.d.ts +2 -0
  62. package/dist/tempo/session/client/Transports.js +12 -2
  63. package/dist/tempo/session/precompile/Chain.d.ts +10 -2
  64. package/dist/tempo/session/precompile/Chain.js +50 -10
  65. package/dist/tempo/session/precompile/Protocol.d.ts +15 -0
  66. package/dist/tempo/session/precompile/Protocol.js +7 -0
  67. package/dist/tempo/session/precompile/Voucher.d.ts +3 -1
  68. package/dist/tempo/session/precompile/Voucher.js +6 -12
  69. package/dist/tempo/session/server/ChannelStore.d.ts +6 -0
  70. package/dist/tempo/session/server/ChannelStore.js +11 -4
  71. package/dist/tempo/session/server/CredentialVerification.d.ts +11 -9
  72. package/dist/tempo/session/server/CredentialVerification.js +185 -109
  73. package/dist/tempo/session/server/MeteredStream.d.ts +1 -1
  74. package/dist/tempo/session/server/MeteredStream.js +5 -4
  75. package/dist/tempo/session/server/RequestState.d.ts +19 -0
  76. package/dist/tempo/session/server/RequestState.js +61 -15
  77. package/dist/tempo/session/server/Session.d.ts +14 -2
  78. package/dist/tempo/session/server/Session.js +37 -6
  79. package/dist/tempo/session/server/Settlement.d.ts +11 -4
  80. package/dist/tempo/session/server/Settlement.js +53 -21
  81. package/dist/x402/client/Exact.d.ts +8 -0
  82. package/dist/x402/client/Exact.js +40 -10
  83. package/dist/x402/server/EvmCharge.d.ts +22 -0
  84. package/dist/x402/server/EvmCharge.js +23 -1
  85. package/package.json +15 -37
  86. package/dist/BodyDigest.d.ts.map +0 -1
  87. package/dist/BodyDigest.js.map +0 -1
  88. package/dist/Challenge.d.ts.map +0 -1
  89. package/dist/Challenge.js.map +0 -1
  90. package/dist/Constants.d.ts.map +0 -1
  91. package/dist/Constants.js.map +0 -1
  92. package/dist/Credential.d.ts.map +0 -1
  93. package/dist/Credential.js.map +0 -1
  94. package/dist/Errors.d.ts.map +0 -1
  95. package/dist/Errors.js.map +0 -1
  96. package/dist/Expires.d.ts.map +0 -1
  97. package/dist/Expires.js.map +0 -1
  98. package/dist/Html.d.ts.map +0 -1
  99. package/dist/Html.js.map +0 -1
  100. package/dist/Mcp.d.ts.map +0 -1
  101. package/dist/Mcp.js.map +0 -1
  102. package/dist/Method.d.ts.map +0 -1
  103. package/dist/Method.js.map +0 -1
  104. package/dist/PaymentRequest.d.ts.map +0 -1
  105. package/dist/PaymentRequest.js.map +0 -1
  106. package/dist/Receipt.d.ts.map +0 -1
  107. package/dist/Receipt.js.map +0 -1
  108. package/dist/Store.d.ts.map +0 -1
  109. package/dist/Store.js.map +0 -1
  110. package/dist/attestation/Client.d.ts.map +0 -1
  111. package/dist/attestation/Client.js.map +0 -1
  112. package/dist/attestation/Constants.d.ts.map +0 -1
  113. package/dist/attestation/Constants.js.map +0 -1
  114. package/dist/attestation/Server.d.ts.map +0 -1
  115. package/dist/attestation/Server.js.map +0 -1
  116. package/dist/attestation/Types.d.ts.map +0 -1
  117. package/dist/attestation/Types.js.map +0 -1
  118. package/dist/attestation/index.d.ts.map +0 -1
  119. package/dist/attestation/index.js.map +0 -1
  120. package/dist/attestation/internal/HttpMessageSignature.d.ts.map +0 -1
  121. package/dist/attestation/internal/HttpMessageSignature.js.map +0 -1
  122. package/dist/attestation/internal/SigningContext.d.ts.map +0 -1
  123. package/dist/attestation/internal/SigningContext.js.map +0 -1
  124. package/dist/bin.d.ts.map +0 -1
  125. package/dist/bin.js.map +0 -1
  126. package/dist/cli/account.d.ts.map +0 -1
  127. package/dist/cli/account.js.map +0 -1
  128. package/dist/cli/cli.d.ts.map +0 -1
  129. package/dist/cli/cli.js.map +0 -1
  130. package/dist/cli/config.d.ts.map +0 -1
  131. package/dist/cli/config.js.map +0 -1
  132. package/dist/cli/internal.d.ts.map +0 -1
  133. package/dist/cli/internal.js.map +0 -1
  134. package/dist/cli/plugins/evm.d.ts.map +0 -1
  135. package/dist/cli/plugins/evm.js.map +0 -1
  136. package/dist/cli/plugins/index.d.ts.map +0 -1
  137. package/dist/cli/plugins/index.js.map +0 -1
  138. package/dist/cli/plugins/plugin.d.ts.map +0 -1
  139. package/dist/cli/plugins/plugin.js.map +0 -1
  140. package/dist/cli/plugins/stripe.d.ts.map +0 -1
  141. package/dist/cli/plugins/stripe.js.map +0 -1
  142. package/dist/cli/plugins/tempo.d.ts.map +0 -1
  143. package/dist/cli/plugins/tempo.js.map +0 -1
  144. package/dist/cli/sessions/Manager.d.ts.map +0 -1
  145. package/dist/cli/sessions/Manager.js.map +0 -1
  146. package/dist/cli/sessions/commands.d.ts.map +0 -1
  147. package/dist/cli/sessions/commands.js.map +0 -1
  148. package/dist/cli/sessions/request.d.ts.map +0 -1
  149. package/dist/cli/sessions/request.js.map +0 -1
  150. package/dist/cli/sessions/store.d.ts.map +0 -1
  151. package/dist/cli/sessions/store.js.map +0 -1
  152. package/dist/cli/utils.d.ts.map +0 -1
  153. package/dist/cli/utils.js.map +0 -1
  154. package/dist/cli/validate/challenge.d.ts.map +0 -1
  155. package/dist/cli/validate/challenge.js.map +0 -1
  156. package/dist/cli/validate/discovery.d.ts.map +0 -1
  157. package/dist/cli/validate/discovery.js.map +0 -1
  158. package/dist/cli/validate/helpers.d.ts.map +0 -1
  159. package/dist/cli/validate/helpers.js.map +0 -1
  160. package/dist/cli/validate/index.d.ts.map +0 -1
  161. package/dist/cli/validate/index.js.map +0 -1
  162. package/dist/cli/validate/messages.d.ts.map +0 -1
  163. package/dist/cli/validate/messages.js.map +0 -1
  164. package/dist/cli/validate/payment.d.ts.map +0 -1
  165. package/dist/cli/validate/payment.js.map +0 -1
  166. package/dist/client/Methods.d.ts.map +0 -1
  167. package/dist/client/Methods.js.map +0 -1
  168. package/dist/client/Mppx.d.ts.map +0 -1
  169. package/dist/client/Mppx.js.map +0 -1
  170. package/dist/client/Transport.d.ts.map +0 -1
  171. package/dist/client/Transport.js.map +0 -1
  172. package/dist/client/index.d.ts.map +0 -1
  173. package/dist/client/index.js.map +0 -1
  174. package/dist/client/internal/Fetch.d.ts.map +0 -1
  175. package/dist/client/internal/Fetch.js.map +0 -1
  176. package/dist/client/internal/MethodChallenge.d.ts.map +0 -1
  177. package/dist/client/internal/MethodChallenge.js.map +0 -1
  178. package/dist/client/internal/MethodResponse.d.ts.map +0 -1
  179. package/dist/client/internal/MethodResponse.js.map +0 -1
  180. package/dist/client/internal/protocols/Mcp.d.ts.map +0 -1
  181. package/dist/client/internal/protocols/Mcp.js.map +0 -1
  182. package/dist/client/internal/protocols/Mpp.d.ts.map +0 -1
  183. package/dist/client/internal/protocols/Mpp.js.map +0 -1
  184. package/dist/client/internal/protocols/Protocol.d.ts.map +0 -1
  185. package/dist/client/internal/protocols/Protocol.js.map +0 -1
  186. package/dist/client/internal/protocols/Shared.d.ts.map +0 -1
  187. package/dist/client/internal/protocols/Shared.js.map +0 -1
  188. package/dist/client/internal/protocols/X402.d.ts.map +0 -1
  189. package/dist/client/internal/protocols/X402.js.map +0 -1
  190. package/dist/client/node.d.ts.map +0 -1
  191. package/dist/client/node.js.map +0 -1
  192. package/dist/discovery/Discovery.d.ts.map +0 -1
  193. package/dist/discovery/Discovery.js.map +0 -1
  194. package/dist/discovery/OpenApi.d.ts.map +0 -1
  195. package/dist/discovery/OpenApi.js.map +0 -1
  196. package/dist/discovery/Validate.d.ts.map +0 -1
  197. package/dist/discovery/Validate.js.map +0 -1
  198. package/dist/discovery/index.d.ts.map +0 -1
  199. package/dist/discovery/index.js.map +0 -1
  200. package/dist/discovery/internal/Metadata.d.ts.map +0 -1
  201. package/dist/discovery/internal/Metadata.js.map +0 -1
  202. package/dist/evm/Assets.d.ts.map +0 -1
  203. package/dist/evm/Assets.js.map +0 -1
  204. package/dist/evm/Chains.d.ts.map +0 -1
  205. package/dist/evm/Chains.js.map +0 -1
  206. package/dist/evm/Methods.d.ts.map +0 -1
  207. package/dist/evm/Methods.js.map +0 -1
  208. package/dist/evm/Types.d.ts.map +0 -1
  209. package/dist/evm/Types.js.map +0 -1
  210. package/dist/evm/client/Charge.d.ts.map +0 -1
  211. package/dist/evm/client/Charge.js.map +0 -1
  212. package/dist/evm/client/Methods.d.ts.map +0 -1
  213. package/dist/evm/client/Methods.js.map +0 -1
  214. package/dist/evm/client/index.d.ts.map +0 -1
  215. package/dist/evm/client/index.js.map +0 -1
  216. package/dist/evm/index.d.ts.map +0 -1
  217. package/dist/evm/index.js.map +0 -1
  218. package/dist/evm/server/Charge.d.ts.map +0 -1
  219. package/dist/evm/server/Charge.js.map +0 -1
  220. package/dist/evm/server/Methods.d.ts.map +0 -1
  221. package/dist/evm/server/Methods.js.map +0 -1
  222. package/dist/evm/server/index.d.ts.map +0 -1
  223. package/dist/evm/server/index.js.map +0 -1
  224. package/dist/index.d.ts.map +0 -1
  225. package/dist/index.js.map +0 -1
  226. package/dist/internal/AcceptPayment.d.ts.map +0 -1
  227. package/dist/internal/AcceptPayment.js.map +0 -1
  228. package/dist/internal/HeaderCodec.d.ts.map +0 -1
  229. package/dist/internal/HeaderCodec.js.map +0 -1
  230. package/dist/internal/constantTimeEqual.d.ts.map +0 -1
  231. package/dist/internal/constantTimeEqual.js.map +0 -1
  232. package/dist/internal/env.d.ts.map +0 -1
  233. package/dist/internal/env.js.map +0 -1
  234. package/dist/internal/types.d.ts.map +0 -1
  235. package/dist/internal/types.js.map +0 -1
  236. package/dist/mcp/client/McpClient.d.ts.map +0 -1
  237. package/dist/mcp/client/McpClient.js.map +0 -1
  238. package/dist/mcp/client/index.d.ts.map +0 -1
  239. package/dist/mcp/client/index.js.map +0 -1
  240. package/dist/mcp/server/Transport.d.ts.map +0 -1
  241. package/dist/mcp/server/Transport.js.map +0 -1
  242. package/dist/mcp/server/index.d.ts.map +0 -1
  243. package/dist/mcp/server/index.js.map +0 -1
  244. package/dist/middlewares/elysia.d.ts.map +0 -1
  245. package/dist/middlewares/elysia.js.map +0 -1
  246. package/dist/middlewares/express.d.ts.map +0 -1
  247. package/dist/middlewares/express.js.map +0 -1
  248. package/dist/middlewares/hono.d.ts.map +0 -1
  249. package/dist/middlewares/hono.js.map +0 -1
  250. package/dist/middlewares/internal/mppx.d.ts.map +0 -1
  251. package/dist/middlewares/internal/mppx.js.map +0 -1
  252. package/dist/middlewares/nextjs.d.ts.map +0 -1
  253. package/dist/middlewares/nextjs.js.map +0 -1
  254. package/dist/proxy/Proxy.d.ts.map +0 -1
  255. package/dist/proxy/Proxy.js.map +0 -1
  256. package/dist/proxy/Service.d.ts.map +0 -1
  257. package/dist/proxy/Service.js.map +0 -1
  258. package/dist/proxy/index.d.ts.map +0 -1
  259. package/dist/proxy/index.js.map +0 -1
  260. package/dist/proxy/internal/Headers.d.ts.map +0 -1
  261. package/dist/proxy/internal/Headers.js.map +0 -1
  262. package/dist/proxy/internal/Route.d.ts.map +0 -1
  263. package/dist/proxy/internal/Route.js.map +0 -1
  264. package/dist/proxy/services/anthropic.d.ts.map +0 -1
  265. package/dist/proxy/services/anthropic.js.map +0 -1
  266. package/dist/proxy/services/openai.d.ts.map +0 -1
  267. package/dist/proxy/services/openai.js.map +0 -1
  268. package/dist/proxy/services/stripe.d.ts.map +0 -1
  269. package/dist/proxy/services/stripe.js.map +0 -1
  270. package/dist/server/Methods.d.ts.map +0 -1
  271. package/dist/server/Methods.js.map +0 -1
  272. package/dist/server/Mppx.d.ts.map +0 -1
  273. package/dist/server/Mppx.js.map +0 -1
  274. package/dist/server/NodeListener.d.ts.map +0 -1
  275. package/dist/server/NodeListener.js.map +0 -1
  276. package/dist/server/Request.d.ts.map +0 -1
  277. package/dist/server/Request.js.map +0 -1
  278. package/dist/server/Response.d.ts.map +0 -1
  279. package/dist/server/Response.js.map +0 -1
  280. package/dist/server/Transport.d.ts.map +0 -1
  281. package/dist/server/Transport.js.map +0 -1
  282. package/dist/server/index.d.ts.map +0 -1
  283. package/dist/server/index.js.map +0 -1
  284. package/dist/server/internal/html/compose.main.gen.d.ts.map +0 -1
  285. package/dist/server/internal/html/compose.main.gen.js.map +0 -1
  286. package/dist/server/internal/html/config.d.ts.map +0 -1
  287. package/dist/server/internal/html/config.js.map +0 -1
  288. package/dist/server/internal/html/constants.d.ts.map +0 -1
  289. package/dist/server/internal/html/constants.js.map +0 -1
  290. package/dist/server/internal/html/serviceWorker.client.d.ts.map +0 -1
  291. package/dist/server/internal/html/serviceWorker.client.js.map +0 -1
  292. package/dist/server/internal/html/serviceWorker.gen.d.ts.map +0 -1
  293. package/dist/server/internal/html/serviceWorker.gen.js.map +0 -1
  294. package/dist/server/internal/scope.d.ts.map +0 -1
  295. package/dist/server/internal/scope.js.map +0 -1
  296. package/dist/stripe/Methods.d.ts.map +0 -1
  297. package/dist/stripe/Methods.js.map +0 -1
  298. package/dist/stripe/client/Charge.d.ts.map +0 -1
  299. package/dist/stripe/client/Charge.js.map +0 -1
  300. package/dist/stripe/client/Methods.d.ts.map +0 -1
  301. package/dist/stripe/client/Methods.js.map +0 -1
  302. package/dist/stripe/client/index.d.ts.map +0 -1
  303. package/dist/stripe/client/index.js.map +0 -1
  304. package/dist/stripe/index.d.ts.map +0 -1
  305. package/dist/stripe/index.js.map +0 -1
  306. package/dist/stripe/internal/constants.d.ts.map +0 -1
  307. package/dist/stripe/internal/constants.js.map +0 -1
  308. package/dist/stripe/internal/types.d.ts.map +0 -1
  309. package/dist/stripe/internal/types.js.map +0 -1
  310. package/dist/stripe/server/Charge.d.ts.map +0 -1
  311. package/dist/stripe/server/Charge.js.map +0 -1
  312. package/dist/stripe/server/Methods.d.ts.map +0 -1
  313. package/dist/stripe/server/Methods.js.map +0 -1
  314. package/dist/stripe/server/index.d.ts.map +0 -1
  315. package/dist/stripe/server/index.js.map +0 -1
  316. package/dist/stripe/server/internal/deposit-address.d.ts.map +0 -1
  317. package/dist/stripe/server/internal/deposit-address.js.map +0 -1
  318. package/dist/stripe/server/internal/html/types.d.ts.map +0 -1
  319. package/dist/stripe/server/internal/html/types.js.map +0 -1
  320. package/dist/stripe/server/internal/html.gen.d.ts.map +0 -1
  321. package/dist/stripe/server/internal/html.gen.js.map +0 -1
  322. package/dist/stripe/server/internal/record-payment.d.ts.map +0 -1
  323. package/dist/stripe/server/internal/record-payment.js.map +0 -1
  324. package/dist/stripe/server/internal/request.d.ts.map +0 -1
  325. package/dist/stripe/server/internal/request.js.map +0 -1
  326. package/dist/tap/Constants.d.ts.map +0 -1
  327. package/dist/tap/Constants.js.map +0 -1
  328. package/dist/tap/Types.d.ts.map +0 -1
  329. package/dist/tap/Types.js.map +0 -1
  330. package/dist/tap/client/index.d.ts.map +0 -1
  331. package/dist/tap/client/index.js.map +0 -1
  332. package/dist/tap/index.d.ts.map +0 -1
  333. package/dist/tap/index.js.map +0 -1
  334. package/dist/tap/server/index.d.ts.map +0 -1
  335. package/dist/tap/server/index.js.map +0 -1
  336. package/dist/tempo/Attribution.d.ts.map +0 -1
  337. package/dist/tempo/Attribution.js.map +0 -1
  338. package/dist/tempo/Methods.d.ts.map +0 -1
  339. package/dist/tempo/Methods.js.map +0 -1
  340. package/dist/tempo/Proof.d.ts.map +0 -1
  341. package/dist/tempo/Proof.js.map +0 -1
  342. package/dist/tempo/client/Charge.d.ts.map +0 -1
  343. package/dist/tempo/client/Charge.js.map +0 -1
  344. package/dist/tempo/client/Methods.d.ts.map +0 -1
  345. package/dist/tempo/client/Methods.js.map +0 -1
  346. package/dist/tempo/client/ResolveAccount.d.ts.map +0 -1
  347. package/dist/tempo/client/ResolveAccount.js.map +0 -1
  348. package/dist/tempo/client/Subscription.d.ts.map +0 -1
  349. package/dist/tempo/client/Subscription.js.map +0 -1
  350. package/dist/tempo/client/index.d.ts.map +0 -1
  351. package/dist/tempo/client/index.js.map +0 -1
  352. package/dist/tempo/index.d.ts.map +0 -1
  353. package/dist/tempo/index.js.map +0 -1
  354. package/dist/tempo/internal/account.d.ts.map +0 -1
  355. package/dist/tempo/internal/account.js.map +0 -1
  356. package/dist/tempo/internal/address.d.ts.map +0 -1
  357. package/dist/tempo/internal/address.js.map +0 -1
  358. package/dist/tempo/internal/auto-swap.d.ts.map +0 -1
  359. package/dist/tempo/internal/auto-swap.js.map +0 -1
  360. package/dist/tempo/internal/charge.d.ts.map +0 -1
  361. package/dist/tempo/internal/charge.js.map +0 -1
  362. package/dist/tempo/internal/defaults.d.ts.map +0 -1
  363. package/dist/tempo/internal/defaults.js.map +0 -1
  364. package/dist/tempo/internal/fee-payer.d.ts.map +0 -1
  365. package/dist/tempo/internal/fee-payer.js.map +0 -1
  366. package/dist/tempo/internal/fee-token.d.ts.map +0 -1
  367. package/dist/tempo/internal/fee-token.js.map +0 -1
  368. package/dist/tempo/internal/proof.d.ts.map +0 -1
  369. package/dist/tempo/internal/proof.js.map +0 -1
  370. package/dist/tempo/internal/selectors.d.ts.map +0 -1
  371. package/dist/tempo/internal/selectors.js.map +0 -1
  372. package/dist/tempo/internal/types.d.ts.map +0 -1
  373. package/dist/tempo/internal/types.js.map +0 -1
  374. package/dist/tempo/legacy/client/ChannelOps.d.ts.map +0 -1
  375. package/dist/tempo/legacy/client/ChannelOps.js.map +0 -1
  376. package/dist/tempo/legacy/client/Session.d.ts.map +0 -1
  377. package/dist/tempo/legacy/client/Session.js.map +0 -1
  378. package/dist/tempo/legacy/client/SessionManager.d.ts.map +0 -1
  379. package/dist/tempo/legacy/client/SessionManager.js.map +0 -1
  380. package/dist/tempo/legacy/client/index.d.ts.map +0 -1
  381. package/dist/tempo/legacy/client/index.js.map +0 -1
  382. package/dist/tempo/legacy/index.d.ts.map +0 -1
  383. package/dist/tempo/legacy/index.js.map +0 -1
  384. package/dist/tempo/legacy/session/Chain.d.ts.map +0 -1
  385. package/dist/tempo/legacy/session/Chain.js.map +0 -1
  386. package/dist/tempo/legacy/session/Channel.d.ts.map +0 -1
  387. package/dist/tempo/legacy/session/Channel.js.map +0 -1
  388. package/dist/tempo/legacy/session/Types.d.ts.map +0 -1
  389. package/dist/tempo/legacy/session/Types.js.map +0 -1
  390. package/dist/tempo/legacy/session/Voucher.d.ts.map +0 -1
  391. package/dist/tempo/legacy/session/Voucher.js.map +0 -1
  392. package/dist/tempo/legacy/session/escrow.abi.d.ts.map +0 -1
  393. package/dist/tempo/legacy/session/escrow.abi.js.map +0 -1
  394. package/dist/tempo/legacy/session/index.d.ts.map +0 -1
  395. package/dist/tempo/legacy/session/index.js.map +0 -1
  396. package/dist/tempo/server/Charge.d.ts.map +0 -1
  397. package/dist/tempo/server/Charge.js.map +0 -1
  398. package/dist/tempo/server/Methods.d.ts.map +0 -1
  399. package/dist/tempo/server/Methods.js.map +0 -1
  400. package/dist/tempo/server/Relay.d.ts.map +0 -1
  401. package/dist/tempo/server/Relay.js.map +0 -1
  402. package/dist/tempo/server/SponsorBudget.d.ts.map +0 -1
  403. package/dist/tempo/server/SponsorBudget.js.map +0 -1
  404. package/dist/tempo/server/Subscription.d.ts.map +0 -1
  405. package/dist/tempo/server/Subscription.js.map +0 -1
  406. package/dist/tempo/server/index.d.ts.map +0 -1
  407. package/dist/tempo/server/index.js.map +0 -1
  408. package/dist/tempo/server/internal/html.gen.d.ts.map +0 -1
  409. package/dist/tempo/server/internal/html.gen.js.map +0 -1
  410. package/dist/tempo/server/internal/request-body.d.ts.map +0 -1
  411. package/dist/tempo/server/internal/request-body.js.map +0 -1
  412. package/dist/tempo/server/internal/transport.d.ts.map +0 -1
  413. package/dist/tempo/server/internal/transport.js.map +0 -1
  414. package/dist/tempo/session/Snapshot.d.ts.map +0 -1
  415. package/dist/tempo/session/Snapshot.js.map +0 -1
  416. package/dist/tempo/session/client/ChannelOps.d.ts.map +0 -1
  417. package/dist/tempo/session/client/ChannelOps.js.map +0 -1
  418. package/dist/tempo/session/client/ChannelStore.d.ts.map +0 -1
  419. package/dist/tempo/session/client/ChannelStore.js.map +0 -1
  420. package/dist/tempo/session/client/CredentialState.d.ts.map +0 -1
  421. package/dist/tempo/session/client/CredentialState.js.map +0 -1
  422. package/dist/tempo/session/client/ReceiptCoordinator.d.ts.map +0 -1
  423. package/dist/tempo/session/client/ReceiptCoordinator.js.map +0 -1
  424. package/dist/tempo/session/client/Runtime.d.ts.map +0 -1
  425. package/dist/tempo/session/client/Runtime.js.map +0 -1
  426. package/dist/tempo/session/client/Session.d.ts.map +0 -1
  427. package/dist/tempo/session/client/Session.js.map +0 -1
  428. package/dist/tempo/session/client/SessionManager.d.ts.map +0 -1
  429. package/dist/tempo/session/client/SessionManager.js.map +0 -1
  430. package/dist/tempo/session/client/Transports.d.ts.map +0 -1
  431. package/dist/tempo/session/client/Transports.js.map +0 -1
  432. package/dist/tempo/session/client/index.d.ts.map +0 -1
  433. package/dist/tempo/session/client/index.js.map +0 -1
  434. package/dist/tempo/session/client/internal/SessionManager.d.ts.map +0 -1
  435. package/dist/tempo/session/client/internal/SessionManager.js.map +0 -1
  436. package/dist/tempo/session/index.d.ts.map +0 -1
  437. package/dist/tempo/session/index.js.map +0 -1
  438. package/dist/tempo/session/precompile/Chain.d.ts.map +0 -1
  439. package/dist/tempo/session/precompile/Chain.js.map +0 -1
  440. package/dist/tempo/session/precompile/Channel.d.ts.map +0 -1
  441. package/dist/tempo/session/precompile/Channel.js.map +0 -1
  442. package/dist/tempo/session/precompile/Protocol.d.ts.map +0 -1
  443. package/dist/tempo/session/precompile/Protocol.js.map +0 -1
  444. package/dist/tempo/session/precompile/Voucher.d.ts.map +0 -1
  445. package/dist/tempo/session/precompile/Voucher.js.map +0 -1
  446. package/dist/tempo/session/precompile/escrow.abi.d.ts.map +0 -1
  447. package/dist/tempo/session/precompile/escrow.abi.js.map +0 -1
  448. package/dist/tempo/session/precompile/index.d.ts.map +0 -1
  449. package/dist/tempo/session/precompile/index.js.map +0 -1
  450. package/dist/tempo/session/server/ChannelOps.d.ts.map +0 -1
  451. package/dist/tempo/session/server/ChannelOps.js.map +0 -1
  452. package/dist/tempo/session/server/ChannelStore.d.ts.map +0 -1
  453. package/dist/tempo/session/server/ChannelStore.js.map +0 -1
  454. package/dist/tempo/session/server/CredentialVerification.d.ts.map +0 -1
  455. package/dist/tempo/session/server/CredentialVerification.js.map +0 -1
  456. package/dist/tempo/session/server/MeteredStream.d.ts.map +0 -1
  457. package/dist/tempo/session/server/MeteredStream.js.map +0 -1
  458. package/dist/tempo/session/server/RequestState.d.ts.map +0 -1
  459. package/dist/tempo/session/server/RequestState.js.map +0 -1
  460. package/dist/tempo/session/server/Session.d.ts.map +0 -1
  461. package/dist/tempo/session/server/Session.js.map +0 -1
  462. package/dist/tempo/session/server/Settlement.d.ts.map +0 -1
  463. package/dist/tempo/session/server/Settlement.js.map +0 -1
  464. package/dist/tempo/session/server/Sse.d.ts.map +0 -1
  465. package/dist/tempo/session/server/Sse.js.map +0 -1
  466. package/dist/tempo/session/server/Transports.d.ts.map +0 -1
  467. package/dist/tempo/session/server/Transports.js.map +0 -1
  468. package/dist/tempo/session/server/Ws.d.ts.map +0 -1
  469. package/dist/tempo/session/server/Ws.js.map +0 -1
  470. package/dist/tempo/session/server/index.d.ts.map +0 -1
  471. package/dist/tempo/session/server/index.js.map +0 -1
  472. package/dist/tempo/subscription/KeyAuthorization.d.ts.map +0 -1
  473. package/dist/tempo/subscription/KeyAuthorization.js.map +0 -1
  474. package/dist/tempo/subscription/Receipt.d.ts.map +0 -1
  475. package/dist/tempo/subscription/Receipt.js.map +0 -1
  476. package/dist/tempo/subscription/Store.d.ts.map +0 -1
  477. package/dist/tempo/subscription/Store.js.map +0 -1
  478. package/dist/tempo/subscription/Types.d.ts.map +0 -1
  479. package/dist/tempo/subscription/Types.js.map +0 -1
  480. package/dist/tempo/subscription/index.d.ts.map +0 -1
  481. package/dist/tempo/subscription/index.js.map +0 -1
  482. package/dist/validation/core.d.ts.map +0 -1
  483. package/dist/validation/core.js.map +0 -1
  484. package/dist/validation/index.d.ts.map +0 -1
  485. package/dist/validation/index.js.map +0 -1
  486. package/dist/viem/Account.d.ts.map +0 -1
  487. package/dist/viem/Account.js.map +0 -1
  488. package/dist/viem/Client.d.ts.map +0 -1
  489. package/dist/viem/Client.js.map +0 -1
  490. package/dist/web-bot-auth/Constants.d.ts.map +0 -1
  491. package/dist/web-bot-auth/Constants.js.map +0 -1
  492. package/dist/web-bot-auth/Types.d.ts.map +0 -1
  493. package/dist/web-bot-auth/Types.js.map +0 -1
  494. package/dist/web-bot-auth/client/index.d.ts.map +0 -1
  495. package/dist/web-bot-auth/client/index.js.map +0 -1
  496. package/dist/web-bot-auth/index.d.ts.map +0 -1
  497. package/dist/web-bot-auth/index.js.map +0 -1
  498. package/dist/web-bot-auth/internal/JwkThumbprint.d.ts.map +0 -1
  499. package/dist/web-bot-auth/internal/JwkThumbprint.js.map +0 -1
  500. package/dist/web-bot-auth/internal/SignatureAgent.d.ts.map +0 -1
  501. package/dist/web-bot-auth/internal/SignatureAgent.js.map +0 -1
  502. package/dist/web-bot-auth/server/index.d.ts.map +0 -1
  503. package/dist/web-bot-auth/server/index.js.map +0 -1
  504. package/dist/x402/Assets.d.ts.map +0 -1
  505. package/dist/x402/Assets.js.map +0 -1
  506. package/dist/x402/Header.d.ts.map +0 -1
  507. package/dist/x402/Header.js.map +0 -1
  508. package/dist/x402/Types.d.ts.map +0 -1
  509. package/dist/x402/Types.js.map +0 -1
  510. package/dist/x402/client/Exact.d.ts.map +0 -1
  511. package/dist/x402/client/Exact.js.map +0 -1
  512. package/dist/x402/index.d.ts.map +0 -1
  513. package/dist/x402/index.js.map +0 -1
  514. package/dist/x402/internal/ChallengeBrand.d.ts.map +0 -1
  515. package/dist/x402/internal/ChallengeBrand.js.map +0 -1
  516. package/dist/x402/internal/RouteBinding.d.ts.map +0 -1
  517. package/dist/x402/internal/RouteBinding.js.map +0 -1
  518. package/dist/x402/server/EvmCharge.d.ts.map +0 -1
  519. package/dist/x402/server/EvmCharge.js.map +0 -1
  520. package/dist/x402/server/Facilitator.d.ts.map +0 -1
  521. package/dist/x402/server/Facilitator.js.map +0 -1
  522. package/dist/zod.d.ts.map +0 -1
  523. package/dist/zod.js.map +0 -1
  524. package/src/BodyDigest.test.ts +0 -43
  525. package/src/BodyDigest.ts +0 -55
  526. package/src/Challenge.fuzz.test.ts +0 -154
  527. package/src/Challenge.test-d.ts +0 -82
  528. package/src/Challenge.test.ts +0 -1060
  529. package/src/Challenge.ts +0 -687
  530. package/src/Constants.ts +0 -58
  531. package/src/Credential.fuzz.test.ts +0 -62
  532. package/src/Credential.test.ts +0 -378
  533. package/src/Credential.ts +0 -217
  534. package/src/Errors.test.ts +0 -520
  535. package/src/Errors.ts +0 -448
  536. package/src/Expires.test.ts +0 -112
  537. package/src/Expires.ts +0 -59
  538. package/src/Html.ts +0 -67
  539. package/src/Mcp.ts +0 -85
  540. package/src/Method.test.ts +0 -177
  541. package/src/Method.ts +0 -631
  542. package/src/PaymentRequest.test.ts +0 -147
  543. package/src/PaymentRequest.ts +0 -108
  544. package/src/Receipt.test.ts +0 -151
  545. package/src/Receipt.ts +0 -146
  546. package/src/Store.test-d.ts +0 -211
  547. package/src/Store.test.ts +0 -407
  548. package/src/Store.ts +0 -397
  549. package/src/attestation/Attestation.integration.test.ts +0 -208
  550. package/src/attestation/Client.test.ts +0 -83
  551. package/src/attestation/Client.ts +0 -34
  552. package/src/attestation/Constants.ts +0 -15
  553. package/src/attestation/Server.test.ts +0 -60
  554. package/src/attestation/Server.ts +0 -12
  555. package/src/attestation/Types.test-d.ts +0 -54
  556. package/src/attestation/Types.ts +0 -77
  557. package/src/attestation/index.ts +0 -5
  558. package/src/attestation/internal/HttpMessageSignature.test.ts +0 -101
  559. package/src/attestation/internal/HttpMessageSignature.ts +0 -429
  560. package/src/attestation/internal/SigningContext.ts +0 -13
  561. package/src/bin.js +0 -2
  562. package/src/bin.ts +0 -4
  563. package/src/cli/account.ts +0 -269
  564. package/src/cli/cli.test.ts +0 -2221
  565. package/src/cli/cli.ts +0 -1650
  566. package/src/cli/config.test.ts +0 -89
  567. package/src/cli/config.ts +0 -50
  568. package/src/cli/internal.ts +0 -114
  569. package/src/cli/mcp.test.ts +0 -262
  570. package/src/cli/plugins/evm.ts +0 -55
  571. package/src/cli/plugins/index.ts +0 -4
  572. package/src/cli/plugins/plugin.ts +0 -84
  573. package/src/cli/plugins/stripe.ts +0 -174
  574. package/src/cli/plugins/tempo.ts +0 -1102
  575. package/src/cli/sessions/Manager.test.ts +0 -249
  576. package/src/cli/sessions/Manager.ts +0 -93
  577. package/src/cli/sessions/commands.ts +0 -444
  578. package/src/cli/sessions/request.test.ts +0 -51
  579. package/src/cli/sessions/request.ts +0 -353
  580. package/src/cli/sessions/store.test.ts +0 -581
  581. package/src/cli/sessions/store.ts +0 -940
  582. package/src/cli/utils.test.ts +0 -156
  583. package/src/cli/utils.ts +0 -394
  584. package/src/cli/validate/challenge.ts +0 -565
  585. package/src/cli/validate/discovery.test.ts +0 -435
  586. package/src/cli/validate/discovery.ts +0 -221
  587. package/src/cli/validate/helpers.ts +0 -166
  588. package/src/cli/validate/index.ts +0 -229
  589. package/src/cli/validate/messages.ts +0 -7
  590. package/src/cli/validate/payment.ts +0 -774
  591. package/src/cli/validate.test.ts +0 -843
  592. package/src/client/Methods.ts +0 -8
  593. package/src/client/Mppx.test-d.ts +0 -287
  594. package/src/client/Mppx.test.ts +0 -1065
  595. package/src/client/Mppx.ts +0 -487
  596. package/src/client/Transport.test.ts +0 -586
  597. package/src/client/Transport.ts +0 -170
  598. package/src/client/index.ts +0 -29
  599. package/src/client/internal/Fetch.browser.test.ts +0 -197
  600. package/src/client/internal/Fetch.test-d.ts +0 -109
  601. package/src/client/internal/Fetch.test.ts +0 -2336
  602. package/src/client/internal/Fetch.ts +0 -1075
  603. package/src/client/internal/MethodChallenge.ts +0 -35
  604. package/src/client/internal/MethodResponse.ts +0 -67
  605. package/src/client/internal/protocols/Mcp.test.ts +0 -220
  606. package/src/client/internal/protocols/Mcp.ts +0 -186
  607. package/src/client/internal/protocols/Mpp.ts +0 -21
  608. package/src/client/internal/protocols/Protocol.ts +0 -10
  609. package/src/client/internal/protocols/Shared.ts +0 -25
  610. package/src/client/internal/protocols/X402.ts +0 -46
  611. package/src/client/node.test.ts +0 -115
  612. package/src/client/node.ts +0 -247
  613. package/src/discovery/Discovery.test.ts +0 -214
  614. package/src/discovery/Discovery.ts +0 -105
  615. package/src/discovery/OpenApi.test.ts +0 -623
  616. package/src/discovery/OpenApi.ts +0 -192
  617. package/src/discovery/Validate.test.ts +0 -305
  618. package/src/discovery/Validate.ts +0 -77
  619. package/src/discovery/index.ts +0 -3
  620. package/src/discovery/internal/Metadata.ts +0 -51
  621. package/src/env.d.ts +0 -12
  622. package/src/evm/Assets.ts +0 -1
  623. package/src/evm/Chains.ts +0 -11
  624. package/src/evm/Methods.ts +0 -44
  625. package/src/evm/PublicInterface.test-d.ts +0 -134
  626. package/src/evm/Types.ts +0 -140
  627. package/src/evm/client/Charge.test.ts +0 -347
  628. package/src/evm/client/Charge.ts +0 -187
  629. package/src/evm/client/Methods.ts +0 -19
  630. package/src/evm/client/index.ts +0 -6
  631. package/src/evm/index.ts +0 -16
  632. package/src/evm/server/Charge.test.ts +0 -339
  633. package/src/evm/server/Charge.ts +0 -295
  634. package/src/evm/server/Methods.ts +0 -22
  635. package/src/evm/server/index.ts +0 -6
  636. package/src/index.ts +0 -14
  637. package/src/internal/AcceptPayment.test.ts +0 -347
  638. package/src/internal/AcceptPayment.ts +0 -366
  639. package/src/internal/HeaderCodec.ts +0 -36
  640. package/src/internal/changeset.test.ts +0 -106
  641. package/src/internal/constantTimeEqual.test.ts +0 -47
  642. package/src/internal/constantTimeEqual.ts +0 -10
  643. package/src/internal/env.test.ts +0 -42
  644. package/src/internal/env.ts +0 -49
  645. package/src/internal/types.test-d.ts +0 -21
  646. package/src/internal/types.ts +0 -479
  647. package/src/mcp/client/McpClient.integration.test.ts +0 -639
  648. package/src/mcp/client/McpClient.test-d.ts +0 -144
  649. package/src/mcp/client/McpClient.test.ts +0 -463
  650. package/src/mcp/client/McpClient.ts +0 -307
  651. package/src/mcp/client/McpClient.unit.test.ts +0 -135
  652. package/src/mcp/client/index.ts +0 -2
  653. package/src/mcp/server/Transport.test.ts +0 -191
  654. package/src/mcp/server/Transport.ts +0 -111
  655. package/src/mcp/server/index.ts +0 -1
  656. package/src/middlewares/elysia.test.ts +0 -285
  657. package/src/middlewares/elysia.ts +0 -116
  658. package/src/middlewares/express.test.ts +0 -361
  659. package/src/middlewares/express.ts +0 -140
  660. package/src/middlewares/hono.test.ts +0 -473
  661. package/src/middlewares/hono.ts +0 -153
  662. package/src/middlewares/internal/mppx.test.ts +0 -177
  663. package/src/middlewares/internal/mppx.ts +0 -67
  664. package/src/middlewares/nextjs.test.ts +0 -359
  665. package/src/middlewares/nextjs.ts +0 -107
  666. package/src/proxy/Proxy.test.ts +0 -1038
  667. package/src/proxy/Proxy.ts +0 -483
  668. package/src/proxy/Proxy.upstreamError.test.ts +0 -364
  669. package/src/proxy/Service.test.ts +0 -252
  670. package/src/proxy/Service.ts +0 -280
  671. package/src/proxy/index.ts +0 -6
  672. package/src/proxy/internal/Headers.test.ts +0 -139
  673. package/src/proxy/internal/Headers.ts +0 -66
  674. package/src/proxy/internal/Route.test.ts +0 -217
  675. package/src/proxy/internal/Route.ts +0 -64
  676. package/src/proxy/services/anthropic.test.ts +0 -132
  677. package/src/proxy/services/anthropic.ts +0 -53
  678. package/src/proxy/services/hooks.test-d.ts +0 -14
  679. package/src/proxy/services/hooks.test.ts +0 -44
  680. package/src/proxy/services/openai.test.ts +0 -157
  681. package/src/proxy/services/openai.ts +0 -60
  682. package/src/proxy/services/stripe.test.ts +0 -175
  683. package/src/proxy/services/stripe.ts +0 -59
  684. package/src/server/Methods.test-d.ts +0 -88
  685. package/src/server/Methods.test.ts +0 -69
  686. package/src/server/Methods.ts +0 -3
  687. package/src/server/Mppx.authorize.test.ts +0 -210
  688. package/src/server/Mppx.test-d.ts +0 -494
  689. package/src/server/Mppx.test.ts +0 -6711
  690. package/src/server/Mppx.ts +0 -2919
  691. package/src/server/NodeListener.test.ts +0 -293
  692. package/src/server/NodeListener.ts +0 -45
  693. package/src/server/Request.test.ts +0 -255
  694. package/src/server/Request.ts +0 -155
  695. package/src/server/Response.test.ts +0 -32
  696. package/src/server/Response.ts +0 -45
  697. package/src/server/Transport.test.ts +0 -598
  698. package/src/server/Transport.ts +0 -320
  699. package/src/server/index.ts +0 -9
  700. package/src/server/internal/html/compose.main.gen.ts +0 -2
  701. package/src/server/internal/html/compose.main.ts +0 -88
  702. package/src/server/internal/html/config.ts +0 -672
  703. package/src/server/internal/html/constants.ts +0 -28
  704. package/src/server/internal/html/serviceWorker.client.ts +0 -28
  705. package/src/server/internal/html/serviceWorker.gen.ts +0 -2
  706. package/src/server/internal/html/serviceWorker.ts +0 -27
  707. package/src/server/internal/html/tsconfig.compose.json +0 -8
  708. package/src/server/internal/html/tsconfig.worker.client.json +0 -8
  709. package/src/server/internal/html/tsconfig.worker.json +0 -8
  710. package/src/server/internal/scope.ts +0 -43
  711. package/src/stripe/Charge.integration.test.ts +0 -329
  712. package/src/stripe/Methods.test.ts +0 -62
  713. package/src/stripe/Methods.ts +0 -44
  714. package/src/stripe/client/Charge.test.ts +0 -205
  715. package/src/stripe/client/Charge.ts +0 -132
  716. package/src/stripe/client/Methods.ts +0 -37
  717. package/src/stripe/client/index.ts +0 -2
  718. package/src/stripe/index.ts +0 -1
  719. package/src/stripe/internal/constants.ts +0 -7
  720. package/src/stripe/internal/types.ts +0 -47
  721. package/src/stripe/server/Charge.test-d.ts +0 -81
  722. package/src/stripe/server/Charge.test.ts +0 -700
  723. package/src/stripe/server/Charge.ts +0 -487
  724. package/src/stripe/server/Methods.test-d.ts +0 -157
  725. package/src/stripe/server/Methods.test.ts +0 -403
  726. package/src/stripe/server/Methods.ts +0 -441
  727. package/src/stripe/server/index.ts +0 -2
  728. package/src/stripe/server/internal/deposit-address.ts +0 -57
  729. package/src/stripe/server/internal/html/main.ts +0 -165
  730. package/src/stripe/server/internal/html/node_modules/.bin/mppx +0 -22
  731. package/src/stripe/server/internal/html/node_modules/.bin/mppx.src +0 -22
  732. package/src/stripe/server/internal/html/package.json +0 -9
  733. package/src/stripe/server/internal/html/stripe-js-pure.d.ts +0 -7
  734. package/src/stripe/server/internal/html/tsconfig.json +0 -8
  735. package/src/stripe/server/internal/html/types.ts +0 -5
  736. package/src/stripe/server/internal/html.gen.ts +0 -2
  737. package/src/stripe/server/internal/record-payment.ts +0 -66
  738. package/src/stripe/server/internal/request.ts +0 -49
  739. package/src/tap/Constants.ts +0 -32
  740. package/src/tap/Tap.test.ts +0 -125
  741. package/src/tap/Types.ts +0 -11
  742. package/src/tap/client/index.ts +0 -54
  743. package/src/tap/index.ts +0 -4
  744. package/src/tap/server/index.ts +0 -48
  745. package/src/tempo/AccessKeyAuthorization.test.ts +0 -141
  746. package/src/tempo/Attribution.test.ts +0 -294
  747. package/src/tempo/Attribution.ts +0 -185
  748. package/src/tempo/Methods.test.ts +0 -425
  749. package/src/tempo/Methods.ts +0 -367
  750. package/src/tempo/Proof.conformance.test.ts +0 -146
  751. package/src/tempo/Proof.test-d.ts +0 -32
  752. package/src/tempo/Proof.test.ts +0 -40
  753. package/src/tempo/Proof.ts +0 -69
  754. package/src/tempo/PublicExports.test-d.ts +0 -130
  755. package/src/tempo/Subscription.integration.test.ts +0 -591
  756. package/src/tempo/client/Charge.test.ts +0 -501
  757. package/src/tempo/client/Charge.ts +0 -271
  758. package/src/tempo/client/Methods.ts +0 -45
  759. package/src/tempo/client/ResolveAccount.ts +0 -46
  760. package/src/tempo/client/Subscription.test.ts +0 -180
  761. package/src/tempo/client/Subscription.ts +0 -156
  762. package/src/tempo/client/index.ts +0 -17
  763. package/src/tempo/index.ts +0 -5
  764. package/src/tempo/internal/account.ts +0 -56
  765. package/src/tempo/internal/address.test.ts +0 -42
  766. package/src/tempo/internal/address.ts +0 -6
  767. package/src/tempo/internal/auto-swap.test.ts +0 -198
  768. package/src/tempo/internal/auto-swap.ts +0 -145
  769. package/src/tempo/internal/charge.test.ts +0 -66
  770. package/src/tempo/internal/charge.ts +0 -43
  771. package/src/tempo/internal/defaults.test.ts +0 -95
  772. package/src/tempo/internal/defaults.ts +0 -53
  773. package/src/tempo/internal/fee-payer.test.ts +0 -1177
  774. package/src/tempo/internal/fee-payer.ts +0 -808
  775. package/src/tempo/internal/fee-token.test.ts +0 -165
  776. package/src/tempo/internal/fee-token.ts +0 -72
  777. package/src/tempo/internal/proof.test.ts +0 -97
  778. package/src/tempo/internal/proof.ts +0 -87
  779. package/src/tempo/internal/selectors.ts +0 -10
  780. package/src/tempo/internal/types.ts +0 -19
  781. package/src/tempo/legacy/AccessKeyAuthorization.test.ts +0 -162
  782. package/src/tempo/legacy/README.md +0 -9
  783. package/src/tempo/legacy/client/ChannelOps.test.ts +0 -379
  784. package/src/tempo/legacy/client/ChannelOps.ts +0 -271
  785. package/src/tempo/legacy/client/Session.test.ts +0 -800
  786. package/src/tempo/legacy/client/Session.ts +0 -397
  787. package/src/tempo/legacy/client/SessionManager.test.ts +0 -468
  788. package/src/tempo/legacy/client/SessionManager.ts +0 -909
  789. package/src/tempo/legacy/client/index.ts +0 -6
  790. package/src/tempo/legacy/index.ts +0 -4
  791. package/src/tempo/legacy/session/Chain.test.ts +0 -1349
  792. package/src/tempo/legacy/session/Chain.ts +0 -830
  793. package/src/tempo/legacy/session/Channel.test.ts +0 -109
  794. package/src/tempo/legacy/session/Channel.ts +0 -51
  795. package/src/tempo/legacy/session/Types.ts +0 -91
  796. package/src/tempo/legacy/session/Voucher.test.ts +0 -410
  797. package/src/tempo/legacy/session/Voucher.ts +0 -183
  798. package/src/tempo/legacy/session/escrow.abi.ts +0 -760
  799. package/src/tempo/legacy/session/index.ts +0 -8
  800. package/src/tempo/server/AtomicStore.test-d.ts +0 -63
  801. package/src/tempo/server/Charge.test.ts +0 -6056
  802. package/src/tempo/server/Charge.ts +0 -1379
  803. package/src/tempo/server/Methods.ts +0 -86
  804. package/src/tempo/server/Relay.test.ts +0 -677
  805. package/src/tempo/server/Relay.ts +0 -297
  806. package/src/tempo/server/SponsorBudget.test.ts +0 -154
  807. package/src/tempo/server/SponsorBudget.ts +0 -219
  808. package/src/tempo/server/Sse.test.ts +0 -321
  809. package/src/tempo/server/Subscription.test.ts +0 -1944
  810. package/src/tempo/server/Subscription.ts +0 -1336
  811. package/src/tempo/server/index.ts +0 -12
  812. package/src/tempo/server/internal/html/main.ts +0 -115
  813. package/src/tempo/server/internal/html/node_modules/.bin/mppx +0 -22
  814. package/src/tempo/server/internal/html/node_modules/.bin/mppx.src +0 -22
  815. package/src/tempo/server/internal/html/package.json +0 -10
  816. package/src/tempo/server/internal/html/tsconfig.json +0 -8
  817. package/src/tempo/server/internal/html.gen.ts +0 -2
  818. package/src/tempo/server/internal/request-body.test.ts +0 -210
  819. package/src/tempo/server/internal/request-body.ts +0 -61
  820. package/src/tempo/server/internal/transport.test.ts +0 -922
  821. package/src/tempo/server/internal/transport.ts +0 -322
  822. package/src/tempo/session/README.md +0 -320
  823. package/src/tempo/session/Snapshot.test.ts +0 -41
  824. package/src/tempo/session/Snapshot.ts +0 -95
  825. package/src/tempo/session/client/ChannelOps.test.ts +0 -218
  826. package/src/tempo/session/client/ChannelOps.ts +0 -348
  827. package/src/tempo/session/client/ChannelStore.ts +0 -111
  828. package/src/tempo/session/client/CredentialState.test.ts +0 -789
  829. package/src/tempo/session/client/CredentialState.ts +0 -942
  830. package/src/tempo/session/client/ReceiptCoordinator.ts +0 -95
  831. package/src/tempo/session/client/Runtime.test.ts +0 -1104
  832. package/src/tempo/session/client/Runtime.ts +0 -1008
  833. package/src/tempo/session/client/Session.test.ts +0 -1355
  834. package/src/tempo/session/client/Session.ts +0 -420
  835. package/src/tempo/session/client/SessionManager.test.ts +0 -1899
  836. package/src/tempo/session/client/SessionManager.ts +0 -996
  837. package/src/tempo/session/client/Transports.test.ts +0 -1141
  838. package/src/tempo/session/client/Transports.ts +0 -1534
  839. package/src/tempo/session/client/index.ts +0 -40
  840. package/src/tempo/session/client/internal/SessionManager.ts +0 -36
  841. package/src/tempo/session/index.ts +0 -7
  842. package/src/tempo/session/precompile/Chain.integration.test.ts +0 -339
  843. package/src/tempo/session/precompile/Chain.test.ts +0 -1641
  844. package/src/tempo/session/precompile/Chain.ts +0 -1269
  845. package/src/tempo/session/precompile/Channel.test.ts +0 -147
  846. package/src/tempo/session/precompile/Channel.ts +0 -108
  847. package/src/tempo/session/precompile/Protocol.test.ts +0 -358
  848. package/src/tempo/session/precompile/Protocol.ts +0 -520
  849. package/src/tempo/session/precompile/Voucher.test.ts +0 -354
  850. package/src/tempo/session/precompile/Voucher.ts +0 -162
  851. package/src/tempo/session/precompile/escrow.abi.ts +0 -226
  852. package/src/tempo/session/precompile/index.ts +0 -33
  853. package/src/tempo/session/server/ChannelOps.test.ts +0 -129
  854. package/src/tempo/session/server/ChannelOps.ts +0 -157
  855. package/src/tempo/session/server/ChannelStore.test.ts +0 -1093
  856. package/src/tempo/session/server/ChannelStore.ts +0 -856
  857. package/src/tempo/session/server/CredentialVerification.test.ts +0 -299
  858. package/src/tempo/session/server/CredentialVerification.ts +0 -1087
  859. package/src/tempo/session/server/MeteredStream.ts +0 -99
  860. package/src/tempo/session/server/RequestState.test.ts +0 -574
  861. package/src/tempo/session/server/RequestState.ts +0 -507
  862. package/src/tempo/session/server/Session.integration.test.ts +0 -449
  863. package/src/tempo/session/server/Session.test.ts +0 -4247
  864. package/src/tempo/session/server/Session.ts +0 -669
  865. package/src/tempo/session/server/Settlement.test.ts +0 -345
  866. package/src/tempo/session/server/Settlement.ts +0 -527
  867. package/src/tempo/session/server/Sse.fuzz.test.ts +0 -138
  868. package/src/tempo/session/server/Sse.test.ts +0 -634
  869. package/src/tempo/session/server/Sse.ts +0 -261
  870. package/src/tempo/session/server/Transports.test.ts +0 -346
  871. package/src/tempo/session/server/Transports.ts +0 -256
  872. package/src/tempo/session/server/Ws.test.ts +0 -765
  873. package/src/tempo/session/server/Ws.ts +0 -391
  874. package/src/tempo/session/server/index.ts +0 -12
  875. package/src/tempo/subscription/KeyAuthorization.test.ts +0 -282
  876. package/src/tempo/subscription/KeyAuthorization.ts +0 -396
  877. package/src/tempo/subscription/Receipt.ts +0 -28
  878. package/src/tempo/subscription/Store.test.ts +0 -609
  879. package/src/tempo/subscription/Store.ts +0 -449
  880. package/src/tempo/subscription/Types.ts +0 -68
  881. package/src/tempo/subscription/index.ts +0 -23
  882. package/src/tsconfig.json +0 -10
  883. package/src/validation/core.ts +0 -386
  884. package/src/validation/index.ts +0 -11
  885. package/src/viem/Account.test.ts +0 -72
  886. package/src/viem/Account.ts +0 -30
  887. package/src/viem/Client.test.ts +0 -366
  888. package/src/viem/Client.ts +0 -93
  889. package/src/web-bot-auth/Constants.ts +0 -24
  890. package/src/web-bot-auth/Types.ts +0 -9
  891. package/src/web-bot-auth/WebBotAuth.test.ts +0 -182
  892. package/src/web-bot-auth/client/index.ts +0 -84
  893. package/src/web-bot-auth/index.ts +0 -6
  894. package/src/web-bot-auth/internal/JwkThumbprint.ts +0 -21
  895. package/src/web-bot-auth/internal/SignatureAgent.ts +0 -18
  896. package/src/web-bot-auth/server/index.ts +0 -113
  897. package/src/x402/Assets.test.ts +0 -253
  898. package/src/x402/Assets.ts +0 -221
  899. package/src/x402/Exact.e2e.test.ts +0 -488
  900. package/src/x402/Exact.localnet.test.ts +0 -475
  901. package/src/x402/Header.test.ts +0 -73
  902. package/src/x402/Header.ts +0 -79
  903. package/src/x402/PublicInterface.test-d.ts +0 -39
  904. package/src/x402/Types.ts +0 -248
  905. package/src/x402/client/Exact.test.ts +0 -309
  906. package/src/x402/client/Exact.ts +0 -186
  907. package/src/x402/index.ts +0 -6
  908. package/src/x402/internal/ChallengeBrand.ts +0 -14
  909. package/src/x402/internal/RouteBinding.ts +0 -18
  910. package/src/x402/server/EvmCharge.ts +0 -410
  911. package/src/x402/server/Facilitator.test.ts +0 -111
  912. package/src/x402/server/Facilitator.ts +0 -56
  913. package/src/zod.test.ts +0 -169
  914. 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
- })