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,1641 +0,0 @@
1
- import {
2
- createClient,
3
- custom,
4
- encodeAbiParameters,
5
- encodeEventTopics,
6
- encodeFunctionData,
7
- encodeFunctionResult,
8
- erc20Abi,
9
- maxUint256,
10
- zeroAddress,
11
- type Address,
12
- type Hex,
13
- } from 'viem'
14
- import { privateKeyToAccount } from 'viem/accounts'
15
- import { Abis, Addresses, Transaction } from 'viem/tempo'
16
- import { describe, expect, test } from 'vp/test'
17
-
18
- import { VerificationFailedError } from '../../../Errors.js'
19
- import * as ServerChannelOps from '../server/ChannelOps.js'
20
- import * as Chain from './Chain.js'
21
- import * as Channel from './Channel.js'
22
- import { escrowAbi } from './escrow.abi.js'
23
- import { tip20ChannelEscrow } from './Protocol.js'
24
- import * as Types from './Protocol.js'
25
-
26
- const descriptor = {
27
- payer: '0x1111111111111111111111111111111111111111',
28
- payee: '0x2222222222222222222222222222222222222222',
29
- operator: '0x3333333333333333333333333333333333333333',
30
- token: '0x4444444444444444444444444444444444444444',
31
- salt: '0x0000000000000000000000000000000000000000000000000000000000000001',
32
- authorizedSigner: '0x5555555555555555555555555555555555555555',
33
- expiringNonceHash: '0xaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa',
34
- } as const
35
-
36
- const deposit = Types.uint96(1_000_000n)
37
- const chainId = 42431
38
- const txHash = `0x${'ab'.repeat(32)}` as const
39
- const sourceToken = '0x6666666666666666666666666666666666666666' as const
40
- const feePayer = privateKeyToAccount(
41
- '0x59c6995e998f97a5a0044966f0945389d1fc6e60e7346d6c36c49d32f75b9a1b',
42
- )
43
- const mockFeePayer = {
44
- ...feePayer,
45
- async signTransaction() {
46
- return `0x76${'00'.repeat(32)}` as `0x${string}`
47
- },
48
- }
49
-
50
- function createMockClient(
51
- parameters: {
52
- channel?: { descriptor: Channel.ChannelDescriptor; state: Chain.ChannelState } | undefined
53
- receipt?: Record<string, unknown> | null | undefined
54
- rpcMethods?: string[] | undefined
55
- onRequest?: ((method: string, params: unknown) => void) | undefined
56
- } = {},
57
- ) {
58
- return createClient({
59
- account: feePayer,
60
- chain: { id: chainId } as never,
61
- transport: custom({
62
- async request(args) {
63
- parameters.rpcMethods?.push(args.method)
64
- parameters.onRequest?.(args.method, args.params)
65
- if (args.method === 'eth_chainId') return `0x${chainId.toString(16)}`
66
- if (args.method === 'eth_sendTransaction') return txHash
67
- if (args.method === 'eth_sendRawTransaction') return txHash
68
- if (args.method === 'eth_sendRawTransactionSync') return parameters.receipt ?? receipt([])
69
- if (args.method === 'eth_getTransactionReceipt') return parameters.receipt ?? null
70
- if (args.method === 'eth_call') {
71
- const data = (args.params as [{ data?: `0x${string}` }])[0].data
72
- const channel = parameters.channel
73
- if (!channel || !data) return '0x'
74
- const selector = data.slice(0, 10)
75
- const getChannelSelector = encodeFunctionData({
76
- abi: escrowAbi,
77
- functionName: 'getChannel',
78
- args: [channel.descriptor],
79
- }).slice(0, 10)
80
- if (selector === getChannelSelector)
81
- return encodeFunctionResult({
82
- abi: escrowAbi,
83
- functionName: 'getChannel',
84
- result: { descriptor: channel.descriptor, state: channel.state },
85
- })
86
- return encodeFunctionResult({
87
- abi: escrowAbi,
88
- functionName: 'getChannelState',
89
- result: channel.state,
90
- })
91
- }
92
- throw new Error(`unexpected rpc request: ${args.method}`)
93
- },
94
- }),
95
- })
96
- }
97
-
98
- function receipt(logs: readonly Record<string, unknown>[], transactionHash: Hex = txHash) {
99
- return {
100
- blockHash: `0x${'01'.repeat(32)}`,
101
- blockNumber: '0x1',
102
- contractAddress: null,
103
- cumulativeGasUsed: '0x1',
104
- effectiveGasPrice: '0x1',
105
- from: descriptor.payer,
106
- gasUsed: '0x1',
107
- logs,
108
- logsBloom: `0x${'00'.repeat(256)}`,
109
- status: '0x1',
110
- to: tip20ChannelEscrow,
111
- transactionHash,
112
- transactionIndex: '0x0',
113
- type: '0x76',
114
- }
115
- }
116
-
117
- function openedLog(parameters: {
118
- channelId: `0x${string}`
119
- expiringNonceHash: `0x${string}`
120
- deposit?: bigint | undefined
121
- }) {
122
- return {
123
- address: tip20ChannelEscrow,
124
- data: encodeAbiParameters(
125
- [
126
- { type: 'address' },
127
- { type: 'address' },
128
- { type: 'address' },
129
- { type: 'bytes32' },
130
- { type: 'bytes32' },
131
- { type: 'uint96' },
132
- ],
133
- [
134
- descriptor.operator,
135
- descriptor.token,
136
- descriptor.authorizedSigner,
137
- descriptor.salt,
138
- parameters.expiringNonceHash,
139
- parameters.deposit ?? deposit,
140
- ],
141
- ),
142
- topics: encodeEventTopics({
143
- abi: escrowAbi,
144
- eventName: 'ChannelOpened',
145
- args: { channelId: parameters.channelId, payer: descriptor.payer, payee: descriptor.payee },
146
- }),
147
- }
148
- }
149
-
150
- function topUpLog(parameters: { channelId: `0x${string}`; newDeposit: bigint }) {
151
- return {
152
- address: tip20ChannelEscrow,
153
- data: encodeAbiParameters(
154
- [{ type: 'uint96' }, { type: 'uint96' }],
155
- [deposit, parameters.newDeposit],
156
- ),
157
- topics: encodeEventTopics({
158
- abi: escrowAbi,
159
- eventName: 'TopUp',
160
- args: { channelId: parameters.channelId, payer: descriptor.payer, payee: descriptor.payee },
161
- }),
162
- }
163
- }
164
-
165
- async function createSerializedTransaction(parameters: {
166
- calls: {
167
- to?: `0x${string}` | undefined
168
- data?: `0x${string}` | undefined
169
- value?: bigint | undefined
170
- }[]
171
- gas?: bigint | undefined
172
- signed?: boolean | undefined
173
- }) {
174
- return (await Transaction.serialize({
175
- chainId,
176
- calls: parameters.calls,
177
- feeToken: descriptor.token,
178
- nonce: 0,
179
- ...(parameters.gas !== undefined ? { gas: parameters.gas } : {}),
180
- ...(parameters.signed
181
- ? {
182
- maxFeePerGas: 1n,
183
- maxPriorityFeePerGas: 1n,
184
- nonceKey: maxUint256,
185
- validBefore: Math.floor(Date.now() / 1_000) + 600,
186
- }
187
- : {}),
188
- ...(parameters.signed
189
- ? {
190
- signature: {
191
- r: `0x${'01'.repeat(32)}` as `0x${string}`,
192
- s: `0x${'02'.repeat(32)}` as `0x${string}`,
193
- yParity: 0,
194
- },
195
- }
196
- : {}),
197
- } as never)) as `0x${string}`
198
- }
199
-
200
- function autoSwapCalls(amountOut: bigint = deposit) {
201
- const maxAmountIn = amountOut + 1_000n
202
- return [
203
- {
204
- to: sourceToken,
205
- data: encodeFunctionData({
206
- abi: Abis.tip20,
207
- functionName: 'approve',
208
- args: [Addresses.stablecoinDex, maxAmountIn],
209
- }),
210
- },
211
- {
212
- to: Addresses.stablecoinDex,
213
- data: encodeFunctionData({
214
- abi: Abis.stablecoinDex,
215
- functionName: 'swapExactAmountOut',
216
- args: [sourceToken, descriptor.token, amountOut, maxAmountIn],
217
- }),
218
- },
219
- ] as const
220
- }
221
-
222
- async function createOpenTransaction(
223
- parameters: {
224
- authorizedSigner?: `0x${string}` | undefined
225
- gas?: bigint | undefined
226
- operator?: `0x${string}` | undefined
227
- payee?: `0x${string}` | undefined
228
- signed?: boolean | undefined
229
- token?: `0x${string}` | undefined
230
- to?: `0x${string}` | undefined
231
- prefixCalls?:
232
- | readonly {
233
- to?: `0x${string}` | undefined
234
- data?: `0x${string}` | undefined
235
- value?: bigint | undefined
236
- }[]
237
- | undefined
238
- } = {},
239
- ) {
240
- const data = encodeFunctionData({
241
- abi: escrowAbi,
242
- functionName: 'open',
243
- args: [
244
- parameters.payee ?? descriptor.payee,
245
- parameters.operator ?? descriptor.operator,
246
- parameters.token ?? descriptor.token,
247
- deposit,
248
- descriptor.salt,
249
- parameters.authorizedSigner ?? descriptor.authorizedSigner,
250
- ],
251
- })
252
- return createSerializedTransaction({
253
- calls: [...(parameters.prefixCalls ?? []), { to: parameters.to ?? tip20ChannelEscrow, data }],
254
- gas: parameters.gas,
255
- signed: parameters.signed,
256
- })
257
- }
258
-
259
- async function createTopUpTransaction(
260
- parameters: {
261
- additionalDeposit?: bigint | undefined
262
- descriptor_?: Channel.ChannelDescriptor | undefined
263
- gas?: bigint | undefined
264
- signed?: boolean | undefined
265
- to?: `0x${string}` | undefined
266
- prefixCalls?:
267
- | readonly {
268
- to?: `0x${string}` | undefined
269
- data?: `0x${string}` | undefined
270
- value?: bigint | undefined
271
- }[]
272
- | undefined
273
- } = {},
274
- ) {
275
- const data = encodeFunctionData({
276
- abi: escrowAbi,
277
- functionName: 'topUp',
278
- args: [
279
- parameters.descriptor_ ?? descriptor,
280
- Types.uint96(parameters.additionalDeposit ?? deposit),
281
- ],
282
- })
283
- return createSerializedTransaction({
284
- calls: [...(parameters.prefixCalls ?? []), { to: parameters.to ?? tip20ChannelEscrow, data }],
285
- gas: parameters.gas,
286
- signed: parameters.signed,
287
- })
288
- }
289
-
290
- function expectedExpiringNonceHash(serializedTransaction: `0x${string}`) {
291
- const transaction = Transaction.deserialize(
292
- serializedTransaction as Transaction.TransactionSerializedTempo,
293
- )
294
- return Channel.computeExpiringNonceHash(
295
- Channel.transactionForExpiringNonceHash({ transaction }),
296
- { sender: descriptor.payer },
297
- )
298
- }
299
-
300
- describe('precompile receipt wait', () => {
301
- test('does not run replacement detection while waiting for Tempo receipts', async () => {
302
- const requestedHash = `0x${'12'.repeat(32)}` as Hex
303
- const rpcMethods: string[] = []
304
- let receiptReads = 0
305
- let blockNumber = 0n
306
- const client = createClient({
307
- chain: { id: chainId } as never,
308
- pollingInterval: 1,
309
- transport: custom({
310
- async request(args) {
311
- rpcMethods.push(args.method)
312
- if (args.method === 'eth_chainId') return `0x${chainId.toString(16)}`
313
- if (args.method === 'eth_blockNumber') {
314
- blockNumber += 1n
315
- return `0x${blockNumber.toString(16)}`
316
- }
317
- if (args.method === 'eth_getTransactionReceipt') {
318
- receiptReads += 1
319
- if (receiptReads === 1) return null
320
- return receipt([], requestedHash)
321
- }
322
- throw new Error(`unexpected rpc request: ${args.method}`)
323
- },
324
- }),
325
- })
326
-
327
- const result = await Chain.waitForSuccessfulReceipt(client, requestedHash)
328
-
329
- expect(result.transactionHash).toBe(requestedHash)
330
- expect(rpcMethods).not.toContain('eth_getTransactionByHash')
331
- expect(rpcMethods).not.toContain('eth_getBlockByNumber')
332
- })
333
- })
334
-
335
- describe('precompile server transactions', () => {
336
- test('does not add a fee-payer signature when the sender and fee payer are the same account', async () => {
337
- const rpcMethods: string[] = []
338
- const client = createMockClient({ rpcMethods })
339
- const sender = { address: feePayer.address, type: 'json-rpc' } as const
340
-
341
- await Chain.closeOnChain(
342
- client,
343
- descriptor,
344
- 1n,
345
- 1n,
346
- `0x${'11'.repeat(65)}`,
347
- tip20ChannelEscrow,
348
- {
349
- account: sender,
350
- candidateFeeTokens: [descriptor.token],
351
- feePayer,
352
- },
353
- )
354
-
355
- expect(rpcMethods).toContain('eth_sendTransaction')
356
- expect(rpcMethods).not.toContain('eth_sendRawTransactionSync')
357
- })
358
- })
359
-
360
- describe('precompile open calldata parsing', () => {
361
- test('parseOpenCall accepts TIP-1034 open calldata', () => {
362
- const data = encodeFunctionData({
363
- abi: escrowAbi,
364
- functionName: 'open',
365
- args: [
366
- descriptor.payee,
367
- descriptor.operator,
368
- descriptor.token,
369
- deposit,
370
- descriptor.salt,
371
- descriptor.authorizedSigner,
372
- ],
373
- })
374
- const open = ServerChannelOps.parseOpenCall({
375
- data,
376
- expected: {
377
- authorizedSigner: descriptor.authorizedSigner,
378
- deposit,
379
- operator: descriptor.operator,
380
- payee: descriptor.payee,
381
- token: descriptor.token,
382
- },
383
- })
384
- expect(open).toEqual({
385
- authorizedSigner: descriptor.authorizedSigner,
386
- deposit,
387
- operator: descriptor.operator,
388
- payee: descriptor.payee,
389
- salt: descriptor.salt,
390
- token: descriptor.token,
391
- })
392
- })
393
-
394
- test('parseOpenCall rejects non-open calldata and expected mismatches', () => {
395
- const approve = encodeFunctionData({
396
- abi: erc20Abi,
397
- functionName: 'approve',
398
- args: [descriptor.payee, deposit],
399
- })
400
- expect(() => ServerChannelOps.parseOpenCall({ data: approve })).toThrow(
401
- 'Expected TIP-1034 open calldata',
402
- )
403
-
404
- const data = encodeFunctionData({
405
- abi: escrowAbi,
406
- functionName: 'open',
407
- args: [
408
- descriptor.payee,
409
- descriptor.operator,
410
- descriptor.token,
411
- deposit,
412
- descriptor.salt,
413
- descriptor.authorizedSigner,
414
- ],
415
- })
416
- expect(() =>
417
- ServerChannelOps.parseOpenCall({
418
- data,
419
- expected: { payee: '0xffffffffffffffffffffffffffffffffffffffff' },
420
- }),
421
- ).toThrow('payee does not match')
422
- expect(() =>
423
- ServerChannelOps.parseOpenCall({
424
- data,
425
- expected: { operator: '0xffffffffffffffffffffffffffffffffffffffff' },
426
- }),
427
- ).toThrow('operator does not match')
428
- expect(() =>
429
- ServerChannelOps.parseOpenCall({
430
- data,
431
- expected: { token: '0xffffffffffffffffffffffffffffffffffffffff' },
432
- }),
433
- ).toThrow('token does not match')
434
- expect(() =>
435
- ServerChannelOps.parseOpenCall({
436
- data,
437
- expected: { authorizedSigner: '0xffffffffffffffffffffffffffffffffffffffff' },
438
- }),
439
- ).toThrow('authorizedSigner does not match')
440
- expect(() =>
441
- ServerChannelOps.parseOpenCall({ data, expected: { deposit: Types.uint96(1n) } }),
442
- ).toThrow('deposit does not match')
443
- })
444
- })
445
-
446
- describe('precompile broadcastOpenTransaction', () => {
447
- test('rejects transactions with extra calls', async () => {
448
- const serializedTransaction = await createSerializedTransaction({
449
- calls: [
450
- {
451
- to: tip20ChannelEscrow,
452
- data: encodeFunctionData({
453
- abi: escrowAbi,
454
- functionName: 'open',
455
- args: [
456
- descriptor.payee,
457
- descriptor.operator,
458
- descriptor.token,
459
- deposit,
460
- descriptor.salt,
461
- descriptor.authorizedSigner,
462
- ],
463
- }),
464
- },
465
- {
466
- to: descriptor.token,
467
- data: encodeFunctionData({
468
- abi: erc20Abi,
469
- functionName: 'approve',
470
- args: [tip20ChannelEscrow, deposit],
471
- }),
472
- },
473
- ],
474
- })
475
-
476
- await expect(
477
- Chain.broadcastOpenTransaction({
478
- chainId,
479
- client: createMockClient(),
480
- escrowContract: tip20ChannelEscrow,
481
- expectedAuthorizedSigner: descriptor.authorizedSigner,
482
- expectedChannelId: `0x${'11'.repeat(32)}`,
483
- expectedCurrency: descriptor.token,
484
- expectedExpiringNonceHash: `0x${'aa'.repeat(32)}`,
485
- expectedOperator: descriptor.operator,
486
- expectedPayee: descriptor.payee,
487
- expectedPayer: descriptor.payer,
488
- serializedTransaction,
489
- }),
490
- ).rejects.toThrow(
491
- 'TIP-1034 open transaction must contain one management call, optionally preceded by an auto-swap',
492
- )
493
- })
494
-
495
- const [validApprove, validSwap] = autoSwapCalls()
496
- const wrongToken = '0x7777777777777777777777777777777777777777' as const
497
- const maxAmountIn = deposit + 1_000n
498
- const approve = (parameters: {
499
- amount?: bigint | undefined
500
- spender?: Address | undefined
501
- token?: Address | undefined
502
- }) => ({
503
- to: parameters.token ?? sourceToken,
504
- data: encodeFunctionData({
505
- abi: Abis.tip20,
506
- functionName: 'approve',
507
- args: [parameters.spender ?? Addresses.stablecoinDex, parameters.amount ?? maxAmountIn],
508
- }),
509
- })
510
- const swap = (parameters: {
511
- amountOut?: bigint | undefined
512
- maxAmount?: bigint | undefined
513
- tokenIn?: Address | undefined
514
- tokenOut?: Address | undefined
515
- }) => ({
516
- to: Addresses.stablecoinDex as Address,
517
- data: encodeFunctionData({
518
- abi: Abis.stablecoinDex,
519
- functionName: 'swapExactAmountOut',
520
- args: [
521
- parameters.tokenIn ?? sourceToken,
522
- parameters.tokenOut ?? descriptor.token,
523
- parameters.amountOut ?? deposit,
524
- parameters.maxAmount ?? maxAmountIn,
525
- ],
526
- }),
527
- })
528
- const invalidAutoSwapPrefixes = [
529
- {
530
- name: 'missing call target',
531
- prefixCalls: [{ data: validApprove.data }, validSwap],
532
- reason: 'call is missing a target or calldata',
533
- },
534
- {
535
- name: 'native value',
536
- prefixCalls: [{ ...validApprove, value: 1n }, validSwap],
537
- reason: 'calls must not transfer native value',
538
- },
539
- {
540
- name: 'wrong DEX target',
541
- prefixCalls: [validApprove, { ...validSwap, to: wrongToken }],
542
- reason: 'targets the wrong DEX',
543
- },
544
- {
545
- name: 'invalid approval calldata',
546
- prefixCalls: [{ ...validApprove, data: '0x12345678' as const }, validSwap],
547
- reason: 'approval calldata is invalid',
548
- },
549
- {
550
- name: 'invalid swap calldata',
551
- prefixCalls: [validApprove, { ...validSwap, data: '0x12345678' as const }],
552
- reason: 'swap calldata is invalid',
553
- },
554
- {
555
- name: 'wrong approval function',
556
- prefixCalls: [
557
- {
558
- to: sourceToken,
559
- data: encodeFunctionData({
560
- abi: Abis.tip20,
561
- functionName: 'transfer',
562
- args: [Addresses.stablecoinDex, maxAmountIn],
563
- }),
564
- },
565
- validSwap,
566
- ],
567
- reason: 'must contain approve followed by swapExactAmountOut',
568
- },
569
- {
570
- name: 'approval token mismatch',
571
- prefixCalls: [approve({ token: wrongToken }), validSwap],
572
- reason: 'approval token does not match swap input',
573
- },
574
- {
575
- name: 'approval spender mismatch',
576
- prefixCalls: [approve({ spender: wrongToken }), validSwap],
577
- reason: 'approval spender is not the DEX',
578
- },
579
- {
580
- name: 'approval amount mismatch',
581
- prefixCalls: [approve({ amount: maxAmountIn + 1n }), validSwap],
582
- reason: 'approval amount does not match swap maximum input',
583
- },
584
- {
585
- name: 'output token mismatch',
586
- prefixCalls: [validApprove, swap({ tokenOut: wrongToken })],
587
- reason: 'output token does not match channel currency',
588
- },
589
- {
590
- name: 'output amount mismatch',
591
- prefixCalls: [
592
- approve({ amount: maxAmountIn + 1n }),
593
- swap({ amountOut: deposit + 1n, maxAmount: maxAmountIn + 1n }),
594
- ],
595
- reason: 'output amount does not match channel deposit',
596
- },
597
- {
598
- name: 'identical input and output tokens',
599
- prefixCalls: [approve({ token: descriptor.token }), swap({ tokenIn: descriptor.token })],
600
- reason: 'input and output tokens must differ',
601
- },
602
- {
603
- name: 'non-canonical approval calldata',
604
- prefixCalls: [{ ...validApprove, data: `${validApprove.data}00` as Hex }, validSwap],
605
- reason: 'approval calldata is not canonical',
606
- },
607
- {
608
- name: 'non-canonical swap calldata',
609
- prefixCalls: [validApprove, { ...validSwap, data: `${validSwap.data}00` as Hex }],
610
- reason: 'swap calldata is not canonical',
611
- },
612
- ] as const
613
-
614
- test.each(invalidAutoSwapPrefixes)(
615
- 'rejects an auto-swap with $name',
616
- async ({ prefixCalls, reason }) => {
617
- const serializedTransaction = await createOpenTransaction({ prefixCalls })
618
-
619
- await expect(
620
- Chain.broadcastOpenTransaction({
621
- chainId,
622
- client: createMockClient(),
623
- escrowContract: tip20ChannelEscrow,
624
- expectedAuthorizedSigner: descriptor.authorizedSigner,
625
- expectedChannelId: `0x${'11'.repeat(32)}`,
626
- expectedCurrency: descriptor.token,
627
- expectedExpiringNonceHash: expectedExpiringNonceHash(serializedTransaction),
628
- expectedOperator: descriptor.operator,
629
- expectedPayee: descriptor.payee,
630
- expectedPayer: descriptor.payer,
631
- serializedTransaction,
632
- }),
633
- ).rejects.toThrow(`TIP-1034 open auto-swap ${reason}`)
634
- },
635
- )
636
-
637
- test('rejects open transactions targeting the wrong escrow contract', async () => {
638
- const serializedTransaction = await createOpenTransaction({ to: descriptor.token })
639
-
640
- await expect(
641
- Chain.broadcastOpenTransaction({
642
- chainId,
643
- client: createMockClient(),
644
- escrowContract: tip20ChannelEscrow,
645
- expectedAuthorizedSigner: descriptor.authorizedSigner,
646
- expectedChannelId: `0x${'11'.repeat(32)}`,
647
- expectedCurrency: descriptor.token,
648
- expectedExpiringNonceHash: expectedExpiringNonceHash(serializedTransaction),
649
- expectedOperator: descriptor.operator,
650
- expectedPayee: descriptor.payee,
651
- expectedPayer: descriptor.payer,
652
- serializedTransaction,
653
- }),
654
- ).rejects.toThrow('TIP-1034 open transaction targets the wrong address')
655
- })
656
-
657
- test('rejects open transactions missing calldata', async () => {
658
- const serializedTransaction = await createSerializedTransaction({
659
- calls: [{ to: tip20ChannelEscrow }],
660
- })
661
-
662
- await expect(
663
- Chain.broadcastOpenTransaction({
664
- chainId,
665
- client: createMockClient(),
666
- escrowContract: tip20ChannelEscrow,
667
- expectedAuthorizedSigner: descriptor.authorizedSigner,
668
- expectedChannelId: `0x${'11'.repeat(32)}`,
669
- expectedCurrency: descriptor.token,
670
- expectedExpiringNonceHash: expectedExpiringNonceHash(serializedTransaction),
671
- expectedOperator: descriptor.operator,
672
- expectedPayee: descriptor.payee,
673
- expectedPayer: descriptor.payer,
674
- serializedTransaction,
675
- }),
676
- ).rejects.toThrow('TIP-1034 open transaction is missing calldata')
677
- })
678
-
679
- test('rejects open calldata mismatches before broadcasting', async () => {
680
- const serializedTransaction = await createOpenTransaction({ payee: zeroAddress })
681
-
682
- await expect(
683
- Chain.broadcastOpenTransaction({
684
- chainId,
685
- client: createMockClient(),
686
- escrowContract: tip20ChannelEscrow,
687
- expectedAuthorizedSigner: descriptor.authorizedSigner,
688
- expectedChannelId: `0x${'11'.repeat(32)}`,
689
- expectedCurrency: descriptor.token,
690
- expectedExpiringNonceHash: expectedExpiringNonceHash(serializedTransaction),
691
- expectedOperator: descriptor.operator,
692
- expectedPayee: descriptor.payee,
693
- expectedPayer: descriptor.payer,
694
- serializedTransaction,
695
- }),
696
- ).rejects.toThrow('payee does not match')
697
- })
698
-
699
- test('fee-payer rejects non-Tempo open transactions', async () => {
700
- await expect(
701
- Chain.broadcastOpenTransaction({
702
- chainId,
703
- client: createMockClient(),
704
- escrowContract: tip20ChannelEscrow,
705
- expectedAuthorizedSigner: descriptor.authorizedSigner,
706
- expectedChannelId: `0x${'11'.repeat(32)}`,
707
- expectedCurrency: descriptor.token,
708
- expectedExpiringNonceHash: `0x${'aa'.repeat(32)}`,
709
- expectedOperator: descriptor.operator,
710
- expectedPayee: descriptor.payee,
711
- expectedPayer: descriptor.payer,
712
- feePayer: { address: descriptor.payee } as never,
713
- serializedTransaction: '0x1234',
714
- }),
715
- ).rejects.toThrow('Only Tempo (0x76/0x78) transactions are supported')
716
- })
717
-
718
- test('fee-payer rejects unsigned open transactions', async () => {
719
- const serializedTransaction = await createOpenTransaction()
720
- const expiringNonceHash = expectedExpiringNonceHash(serializedTransaction)
721
- const expectedDescriptor = { ...descriptor, expiringNonceHash }
722
- const channelId = Channel.computeId({
723
- ...expectedDescriptor,
724
- chainId,
725
- escrow: tip20ChannelEscrow,
726
- })
727
-
728
- await expect(
729
- Chain.broadcastOpenTransaction({
730
- chainId,
731
- client: createMockClient(),
732
- escrowContract: tip20ChannelEscrow,
733
- expectedAuthorizedSigner: descriptor.authorizedSigner,
734
- expectedChannelId: channelId,
735
- expectedCurrency: descriptor.token,
736
- expectedExpiringNonceHash: expiringNonceHash,
737
- expectedOperator: descriptor.operator,
738
- expectedPayee: descriptor.payee,
739
- expectedPayer: descriptor.payer,
740
- feePayer: { address: descriptor.payee } as never,
741
- serializedTransaction,
742
- }),
743
- ).rejects.toThrow('Transaction must be signed by the sender before fee payer co-signing')
744
- })
745
-
746
- test('fee-payer rejects open transactions whose gas budget exceeds sponsor policy', async () => {
747
- const serializedTransaction = await createOpenTransaction({ gas: 2_000_001n, signed: true })
748
- const transaction = Transaction.deserialize(
749
- serializedTransaction as Transaction.TransactionSerializedTempo,
750
- )
751
- const payer = transaction.from!
752
- const expiringNonceHash = Channel.computeExpiringNonceHash(
753
- Channel.transactionForExpiringNonceHash({ feePayer, transaction }),
754
- { sender: payer },
755
- )
756
- const expectedDescriptor = { ...descriptor, payer, expiringNonceHash }
757
- const channelId = Channel.computeId({
758
- ...expectedDescriptor,
759
- chainId,
760
- escrow: tip20ChannelEscrow,
761
- })
762
-
763
- await expect(
764
- Chain.broadcastOpenTransaction({
765
- chainId,
766
- client: createMockClient(),
767
- escrowContract: tip20ChannelEscrow,
768
- expectedAuthorizedSigner: descriptor.authorizedSigner,
769
- expectedChannelId: channelId,
770
- expectedCurrency: descriptor.token,
771
- expectedExpiringNonceHash: expiringNonceHash,
772
- expectedOperator: descriptor.operator,
773
- expectedPayee: descriptor.payee,
774
- expectedPayer: payer,
775
- feePayer,
776
- feePayerPolicy: { maxGas: 2_000_000n },
777
- serializedTransaction,
778
- }),
779
- ).rejects.toThrow('fee-sponsored transaction gas exceeds sponsor policy')
780
- })
781
-
782
- test('fee-payer simulates open before raw broadcast', async () => {
783
- const rpcMethods: string[] = []
784
- const serializedTransaction = await createOpenTransaction({ gas: 100_000n, signed: true })
785
- const transaction = Transaction.deserialize(
786
- serializedTransaction as Transaction.TransactionSerializedTempo,
787
- )
788
- const payer = transaction.from!
789
- const expiringNonceHash = Channel.computeExpiringNonceHash(
790
- Channel.transactionForExpiringNonceHash({ feePayer, transaction }),
791
- { sender: payer },
792
- )
793
- const expectedDescriptor = { ...descriptor, payer, expiringNonceHash }
794
- const channelId = Channel.computeId({
795
- ...expectedDescriptor,
796
- chainId,
797
- escrow: tip20ChannelEscrow,
798
- })
799
- const state = { settled: 0n, deposit, closeRequestedAt: 0 }
800
-
801
- await Chain.broadcastOpenTransaction({
802
- chainId,
803
- client: createMockClient({
804
- channel: { descriptor: expectedDescriptor, state },
805
- receipt: receipt([openedLog({ channelId, expiringNonceHash })]),
806
- rpcMethods,
807
- }),
808
- escrowContract: tip20ChannelEscrow,
809
- expectedAuthorizedSigner: descriptor.authorizedSigner,
810
- expectedChannelId: channelId,
811
- expectedCurrency: descriptor.token,
812
- expectedExpiringNonceHash: expiringNonceHash,
813
- expectedOperator: descriptor.operator,
814
- expectedPayee: descriptor.payee,
815
- expectedPayer: payer,
816
- feePayer: mockFeePayer,
817
- serializedTransaction,
818
- })
819
-
820
- const broadcastIndex = rpcMethods.indexOf('eth_sendRawTransactionSync')
821
- const simulationIndex = rpcMethods.indexOf('eth_call')
822
- expect(broadcastIndex).toBeGreaterThan(-1)
823
- expect(simulationIndex).toBeGreaterThan(-1)
824
- expect(simulationIndex).toBeLessThan(broadcastIndex)
825
- expect(
826
- rpcMethods.slice(0, broadcastIndex).filter((method) => method === 'eth_call'),
827
- ).toHaveLength(2)
828
- })
829
-
830
- test('hosted fee-payer relays a sender-signed open without local co-signing', async () => {
831
- const rpcMethods: string[] = []
832
- const serializedTransaction = await createOpenTransaction({ signed: true })
833
- const transaction = Transaction.deserialize(
834
- serializedTransaction as Transaction.TransactionSerializedTempo,
835
- )
836
- const payer = transaction.from!
837
- const expiringNonceHash = Channel.computeExpiringNonceHash(
838
- Channel.transactionForExpiringNonceHash({ feePayer: true, transaction }),
839
- { sender: payer },
840
- )
841
- const expectedDescriptor = { ...descriptor, payer, expiringNonceHash }
842
- const channelId = Channel.computeId({
843
- ...expectedDescriptor,
844
- chainId,
845
- escrow: tip20ChannelEscrow,
846
- })
847
- const state = { settled: 0n, deposit, closeRequestedAt: 0 }
848
-
849
- await Chain.broadcastOpenTransaction({
850
- chainId,
851
- client: createMockClient({
852
- channel: { descriptor: expectedDescriptor, state },
853
- receipt: receipt([openedLog({ channelId, expiringNonceHash })]),
854
- rpcMethods,
855
- }),
856
- escrowContract: tip20ChannelEscrow,
857
- expectedAuthorizedSigner: descriptor.authorizedSigner,
858
- expectedChannelId: channelId,
859
- expectedCurrency: descriptor.token,
860
- expectedExpiringNonceHash: expiringNonceHash,
861
- expectedOperator: descriptor.operator,
862
- expectedPayee: descriptor.payee,
863
- expectedPayer: payer,
864
- feePayer: true,
865
- serializedTransaction,
866
- })
867
-
868
- expect(rpcMethods).toContain('eth_sendRawTransaction')
869
- expect(rpcMethods).not.toContain('eth_sendRawTransactionSync')
870
- expect(rpcMethods.indexOf('eth_call')).toBeLessThan(
871
- rpcMethods.indexOf('eth_sendRawTransaction'),
872
- )
873
- })
874
-
875
- test('rejects expiring nonce hash mismatches before broadcasting', async () => {
876
- const serializedTransaction = await createOpenTransaction()
877
-
878
- const wrongExpiringNonceHash = `0x${'bb'.repeat(32)}` as const
879
- const expectedChannelId = Channel.computeId({
880
- ...descriptor,
881
- chainId,
882
- escrow: tip20ChannelEscrow,
883
- expiringNonceHash: wrongExpiringNonceHash,
884
- })
885
-
886
- await expect(
887
- Chain.broadcastOpenTransaction({
888
- chainId,
889
- client: createMockClient(),
890
- escrowContract: tip20ChannelEscrow,
891
- expectedAuthorizedSigner: descriptor.authorizedSigner,
892
- expectedChannelId,
893
- expectedCurrency: descriptor.token,
894
- expectedExpiringNonceHash: wrongExpiringNonceHash,
895
- expectedOperator: descriptor.operator,
896
- expectedPayee: descriptor.payee,
897
- expectedPayer: descriptor.payer,
898
- serializedTransaction,
899
- }),
900
- ).rejects.toThrow('credential expiringNonceHash does not match transaction')
901
- })
902
-
903
- test('accepts an exact-output auto-swap before open', async () => {
904
- const serializedTransaction = await createOpenTransaction({ prefixCalls: autoSwapCalls() })
905
- const expiringNonceHash = expectedExpiringNonceHash(serializedTransaction)
906
- const expectedDescriptor = { ...descriptor, expiringNonceHash }
907
- const channelId = Channel.computeId({
908
- ...expectedDescriptor,
909
- chainId,
910
- escrow: tip20ChannelEscrow,
911
- })
912
- const state = { settled: 0n, deposit, closeRequestedAt: 0 }
913
-
914
- const result = await Chain.broadcastOpenTransaction({
915
- chainId,
916
- client: createMockClient({
917
- channel: { descriptor: expectedDescriptor, state },
918
- receipt: receipt([openedLog({ channelId, expiringNonceHash })]),
919
- }),
920
- escrowContract: tip20ChannelEscrow,
921
- expectedAuthorizedSigner: descriptor.authorizedSigner,
922
- expectedChannelId: channelId,
923
- expectedCurrency: descriptor.token,
924
- expectedExpiringNonceHash: expiringNonceHash,
925
- expectedOperator: descriptor.operator,
926
- expectedPayee: descriptor.payee,
927
- expectedPayer: descriptor.payer,
928
- serializedTransaction,
929
- })
930
-
931
- expect(result).toEqual({
932
- txHash,
933
- descriptor: expectedDescriptor,
934
- state,
935
- expiringNonceHash,
936
- openDeposit: deposit,
937
- })
938
- })
939
-
940
- test('pins the read-back to the block that included the open transaction', async () => {
941
- const serializedTransaction = await createOpenTransaction()
942
- const expiringNonceHash = expectedExpiringNonceHash(serializedTransaction)
943
- const expectedDescriptor = { ...descriptor, expiringNonceHash }
944
- const channelId = Channel.computeId({
945
- ...expectedDescriptor,
946
- chainId,
947
- escrow: tip20ChannelEscrow,
948
- })
949
- const state = { settled: 0n, deposit, closeRequestedAt: 0 }
950
- // The open tx is mined in block 0x1 (see `receipt`). The read-back must be
951
- // pinned to that block, not `latest`, so a lagging RPC replica cannot
952
- // answer with stale/empty state.
953
- const ethCallBlockTags: unknown[] = []
954
-
955
- await Chain.broadcastOpenTransaction({
956
- chainId,
957
- client: createMockClient({
958
- channel: { descriptor: expectedDescriptor, state },
959
- receipt: receipt([openedLog({ channelId, expiringNonceHash })]),
960
- onRequest: (method, params) => {
961
- if (method === 'eth_call') ethCallBlockTags.push((params as unknown[])[1])
962
- },
963
- }),
964
- escrowContract: tip20ChannelEscrow,
965
- expectedAuthorizedSigner: descriptor.authorizedSigner,
966
- expectedChannelId: channelId,
967
- expectedCurrency: descriptor.token,
968
- expectedExpiringNonceHash: expiringNonceHash,
969
- expectedOperator: descriptor.operator,
970
- expectedPayee: descriptor.payee,
971
- expectedPayer: descriptor.payer,
972
- serializedTransaction,
973
- })
974
-
975
- expect(ethCallBlockTags).toEqual(['0x1'])
976
- })
977
-
978
- test('rejects ChannelOpened receipt deposit mismatches', async () => {
979
- const serializedTransaction = await createOpenTransaction()
980
- const expiringNonceHash = expectedExpiringNonceHash(serializedTransaction)
981
- const expectedDescriptor = { ...descriptor, expiringNonceHash }
982
- const channelId = Channel.computeId({
983
- ...expectedDescriptor,
984
- chainId,
985
- escrow: tip20ChannelEscrow,
986
- })
987
-
988
- await expect(
989
- Chain.broadcastOpenTransaction({
990
- chainId,
991
- client: createMockClient({
992
- channel: {
993
- descriptor: expectedDescriptor,
994
- state: { settled: 0n, deposit, closeRequestedAt: 0 },
995
- },
996
- receipt: receipt([openedLog({ channelId, expiringNonceHash, deposit: deposit + 1n })]),
997
- }),
998
- escrowContract: tip20ChannelEscrow,
999
- expectedAuthorizedSigner: descriptor.authorizedSigner,
1000
- expectedChannelId: channelId,
1001
- expectedCurrency: descriptor.token,
1002
- expectedExpiringNonceHash: expiringNonceHash,
1003
- expectedOperator: descriptor.operator,
1004
- expectedPayee: descriptor.payee,
1005
- expectedPayer: descriptor.payer,
1006
- serializedTransaction,
1007
- }),
1008
- ).rejects.toThrow('ChannelOpened deposit does not match calldata')
1009
- })
1010
- })
1011
-
1012
- describe('precompile broadcastTopUpTransaction', () => {
1013
- test('rejects transactions with extra calls', async () => {
1014
- const serializedTransaction = await createSerializedTransaction({
1015
- calls: [
1016
- {
1017
- to: tip20ChannelEscrow,
1018
- data: encodeFunctionData({
1019
- abi: escrowAbi,
1020
- functionName: 'topUp',
1021
- args: [descriptor, deposit],
1022
- }),
1023
- },
1024
- {
1025
- to: descriptor.token,
1026
- data: encodeFunctionData({
1027
- abi: erc20Abi,
1028
- functionName: 'approve',
1029
- args: [tip20ChannelEscrow, deposit],
1030
- }),
1031
- },
1032
- ],
1033
- })
1034
-
1035
- await expect(
1036
- Chain.broadcastTopUpTransaction({
1037
- additionalDeposit: deposit,
1038
- chainId,
1039
- client: createMockClient(),
1040
- descriptor,
1041
- escrowContract: tip20ChannelEscrow,
1042
- expectedChannelId: `0x${'11'.repeat(32)}`,
1043
- expectedCurrency: descriptor.token,
1044
- serializedTransaction,
1045
- }),
1046
- ).rejects.toThrow(
1047
- 'TIP-1034 topUp transaction must contain one management call, optionally preceded by an auto-swap',
1048
- )
1049
- })
1050
-
1051
- test('rejects top-up transactions targeting the wrong escrow contract', async () => {
1052
- const serializedTransaction = await createTopUpTransaction({ to: descriptor.token })
1053
-
1054
- await expect(
1055
- Chain.broadcastTopUpTransaction({
1056
- additionalDeposit: deposit,
1057
- chainId,
1058
- client: createMockClient(),
1059
- descriptor,
1060
- escrowContract: tip20ChannelEscrow,
1061
- expectedChannelId: `0x${'11'.repeat(32)}`,
1062
- expectedCurrency: descriptor.token,
1063
- serializedTransaction,
1064
- }),
1065
- ).rejects.toThrow('TIP-1034 topUp transaction targets the wrong address')
1066
- })
1067
-
1068
- test('rejects top-up transactions missing calldata', async () => {
1069
- const serializedTransaction = await createSerializedTransaction({
1070
- calls: [{ to: tip20ChannelEscrow }],
1071
- })
1072
-
1073
- await expect(
1074
- Chain.broadcastTopUpTransaction({
1075
- additionalDeposit: deposit,
1076
- chainId,
1077
- client: createMockClient(),
1078
- descriptor,
1079
- escrowContract: tip20ChannelEscrow,
1080
- expectedChannelId: `0x${'11'.repeat(32)}`,
1081
- expectedCurrency: descriptor.token,
1082
- serializedTransaction,
1083
- }),
1084
- ).rejects.toThrow('TIP-1034 topUp transaction is missing calldata')
1085
- })
1086
-
1087
- test('rejects top-up calldata descriptor mismatches before broadcasting', async () => {
1088
- const serializedTransaction = await createTopUpTransaction({
1089
- descriptor_: { ...descriptor, payee: zeroAddress },
1090
- })
1091
-
1092
- await expect(
1093
- Chain.broadcastTopUpTransaction({
1094
- additionalDeposit: deposit,
1095
- chainId,
1096
- client: createMockClient(),
1097
- descriptor,
1098
- escrowContract: tip20ChannelEscrow,
1099
- expectedChannelId: `0x${'11'.repeat(32)}`,
1100
- expectedCurrency: descriptor.token,
1101
- serializedTransaction,
1102
- }),
1103
- ).rejects.toThrow('descriptor does not match')
1104
- })
1105
-
1106
- test('fee-payer rejects non-Tempo top-up transactions', async () => {
1107
- await expect(
1108
- Chain.broadcastTopUpTransaction({
1109
- additionalDeposit: deposit,
1110
- chainId,
1111
- client: createMockClient(),
1112
- descriptor,
1113
- escrowContract: tip20ChannelEscrow,
1114
- expectedChannelId: `0x${'11'.repeat(32)}`,
1115
- expectedCurrency: descriptor.token,
1116
- feePayer: { address: descriptor.payee } as never,
1117
- serializedTransaction: '0x1234',
1118
- }),
1119
- ).rejects.toThrow('Only Tempo (0x76/0x78) transactions are supported')
1120
- })
1121
-
1122
- test('fee-payer rejects unsigned top-up transactions', async () => {
1123
- const serializedTransaction = await createTopUpTransaction()
1124
-
1125
- await expect(
1126
- Chain.broadcastTopUpTransaction({
1127
- additionalDeposit: deposit,
1128
- chainId,
1129
- client: createMockClient(),
1130
- descriptor,
1131
- escrowContract: tip20ChannelEscrow,
1132
- expectedChannelId: Channel.computeId({
1133
- ...descriptor,
1134
- chainId,
1135
- escrow: tip20ChannelEscrow,
1136
- }),
1137
- expectedCurrency: descriptor.token,
1138
- feePayer: { address: descriptor.payee } as never,
1139
- serializedTransaction,
1140
- }),
1141
- ).rejects.toThrow('Transaction must be signed by the sender before fee payer co-signing')
1142
- })
1143
-
1144
- test('fee-payer rejects top-up transactions whose gas budget exceeds sponsor policy', async () => {
1145
- const serializedTransaction = await createTopUpTransaction({ gas: 2_000_001n, signed: true })
1146
-
1147
- await expect(
1148
- Chain.broadcastTopUpTransaction({
1149
- additionalDeposit: deposit,
1150
- chainId,
1151
- client: createMockClient(),
1152
- descriptor,
1153
- escrowContract: tip20ChannelEscrow,
1154
- expectedChannelId: Channel.computeId({
1155
- ...descriptor,
1156
- chainId,
1157
- escrow: tip20ChannelEscrow,
1158
- }),
1159
- expectedCurrency: descriptor.token,
1160
- feePayer,
1161
- feePayerPolicy: { maxGas: 2_000_000n },
1162
- serializedTransaction,
1163
- }),
1164
- ).rejects.toThrow('fee-sponsored transaction gas exceeds sponsor policy')
1165
- })
1166
-
1167
- test('fee-payer simulates top-up before raw broadcast', async () => {
1168
- const rpcMethods: string[] = []
1169
- const serializedTransaction = await createTopUpTransaction({ gas: 100_000n, signed: true })
1170
- const channelId = Channel.computeId({ ...descriptor, chainId, escrow: tip20ChannelEscrow })
1171
- const newDeposit = deposit * 2n
1172
- await Chain.broadcastTopUpTransaction({
1173
- additionalDeposit: deposit,
1174
- chainId,
1175
- client: createMockClient({
1176
- channel: { descriptor, state: { settled: 0n, deposit: newDeposit, closeRequestedAt: 0 } },
1177
- receipt: receipt([topUpLog({ channelId, newDeposit })]),
1178
- rpcMethods,
1179
- }),
1180
- descriptor,
1181
- escrowContract: tip20ChannelEscrow,
1182
- expectedChannelId: channelId,
1183
- expectedCurrency: descriptor.token,
1184
- feePayer: mockFeePayer,
1185
- serializedTransaction,
1186
- })
1187
-
1188
- const broadcastIndex = rpcMethods.indexOf('eth_sendRawTransactionSync')
1189
- const simulationIndex = rpcMethods.indexOf('eth_call')
1190
- expect(broadcastIndex).toBeGreaterThan(-1)
1191
- expect(simulationIndex).toBeGreaterThan(-1)
1192
- expect(simulationIndex).toBeLessThan(broadcastIndex)
1193
- expect(
1194
- rpcMethods.slice(0, broadcastIndex).filter((method) => method === 'eth_call'),
1195
- ).toHaveLength(2)
1196
- })
1197
-
1198
- test('rejects top-up calldata amount mismatches before broadcasting', async () => {
1199
- const serializedTransaction = await createTopUpTransaction({ additionalDeposit: 1n })
1200
-
1201
- await expect(
1202
- Chain.broadcastTopUpTransaction({
1203
- additionalDeposit: deposit,
1204
- chainId,
1205
- client: createMockClient(),
1206
- descriptor,
1207
- escrowContract: tip20ChannelEscrow,
1208
- expectedChannelId: `0x${'11'.repeat(32)}`,
1209
- expectedCurrency: descriptor.token,
1210
- serializedTransaction,
1211
- }),
1212
- ).rejects.toThrow('topUp deposit does not match credential')
1213
- })
1214
-
1215
- test('accepts an exact-output auto-swap before top-up', async () => {
1216
- const serializedTransaction = await createTopUpTransaction({ prefixCalls: autoSwapCalls() })
1217
- const channelId = Channel.computeId({ ...descriptor, chainId, escrow: tip20ChannelEscrow })
1218
- const newDeposit = deposit * 2n
1219
- const state = { settled: 0n, deposit: newDeposit, closeRequestedAt: 0 }
1220
-
1221
- const result = await Chain.broadcastTopUpTransaction({
1222
- additionalDeposit: deposit,
1223
- chainId,
1224
- client: createMockClient({
1225
- channel: { descriptor, state },
1226
- receipt: receipt([topUpLog({ channelId, newDeposit })]),
1227
- }),
1228
- descriptor,
1229
- escrowContract: tip20ChannelEscrow,
1230
- expectedChannelId: channelId,
1231
- expectedCurrency: descriptor.token,
1232
- serializedTransaction,
1233
- })
1234
-
1235
- expect(result).toEqual({ txHash, newDeposit, state })
1236
- })
1237
-
1238
- test('rejects top-up receipt/readback deposit mismatches', async () => {
1239
- const serializedTransaction = await createTopUpTransaction()
1240
- const channelId = Channel.computeId({ ...descriptor, chainId, escrow: tip20ChannelEscrow })
1241
-
1242
- await expect(
1243
- Chain.broadcastTopUpTransaction({
1244
- additionalDeposit: deposit,
1245
- chainId,
1246
- client: createMockClient({
1247
- channel: { descriptor, state: { settled: 0n, deposit: deposit, closeRequestedAt: 0 } },
1248
- receipt: receipt([topUpLog({ channelId, newDeposit: deposit * 2n })]),
1249
- }),
1250
- descriptor,
1251
- escrowContract: tip20ChannelEscrow,
1252
- expectedChannelId: channelId,
1253
- expectedCurrency: descriptor.token,
1254
- serializedTransaction,
1255
- }),
1256
- ).rejects.toThrow('on-chain channel state does not match topUp receipt')
1257
- })
1258
- })
1259
-
1260
- describe('precompile escrowAbi parity', () => {
1261
- test('contains all TIP-1034 functions and events', () => {
1262
- const functions = escrowAbi.filter((item) => item.type === 'function').map((item) => item.name)
1263
- expect(functions).toEqual([
1264
- 'CLOSE_GRACE_PERIOD',
1265
- 'VOUCHER_TYPEHASH',
1266
- 'open',
1267
- 'settle',
1268
- 'topUp',
1269
- 'close',
1270
- 'requestClose',
1271
- 'withdraw',
1272
- 'getChannel',
1273
- 'getChannelState',
1274
- 'getChannelStatesBatch',
1275
- 'computeChannelId',
1276
- 'getVoucherDigest',
1277
- 'domainSeparator',
1278
- ])
1279
-
1280
- const events = escrowAbi.filter((item) => item.type === 'event').map((item) => item.name)
1281
- expect(events).toEqual([
1282
- 'ChannelOpened',
1283
- 'Settled',
1284
- 'TopUp',
1285
- 'CloseRequested',
1286
- 'ChannelClosed',
1287
- 'CloseRequestCancelled',
1288
- ])
1289
- })
1290
-
1291
- test('keeps ChannelDescriptor component order and ChannelOpened expiringNonceHash', () => {
1292
- const settle = escrowAbi.find((item) => item.type === 'function' && item.name === 'settle')!
1293
- const descriptorInput = settle.inputs[0]
1294
- expect(descriptorInput.components.map((component) => component.name)).toEqual([
1295
- 'payer',
1296
- 'payee',
1297
- 'operator',
1298
- 'token',
1299
- 'salt',
1300
- 'authorizedSigner',
1301
- 'expiringNonceHash',
1302
- ])
1303
-
1304
- const opened = escrowAbi.find((item) => item.type === 'event' && item.name === 'ChannelOpened')!
1305
- expect(opened.inputs.map((input) => input.name)).toContain('expiringNonceHash')
1306
- })
1307
- })
1308
-
1309
- const receiptValidationChainId = 42431
1310
- const receiptValidationEscrow = '0x4D50500000000000000000000000000000000000' as Address
1311
- const receiptValidationDescriptor = {
1312
- payer: '0x0000000000000000000000000000000000000001' as Address,
1313
- payee: '0x0000000000000000000000000000000000000002' as Address,
1314
- operator: '0x0000000000000000000000000000000000000000' as Address,
1315
- token: '0x20c0000000000000000000000000000000000001' as Address,
1316
- salt: `0x${'11'.repeat(32)}` as Hex,
1317
- authorizedSigner: '0x0000000000000000000000000000000000000001' as Address,
1318
- expiringNonceHash: `0x${'22'.repeat(32)}` as Hex,
1319
- } satisfies Channel.ChannelDescriptor
1320
- const receiptValidationChannelId = Channel.computeId({
1321
- ...receiptValidationDescriptor,
1322
- chainId: receiptValidationChainId,
1323
- escrow: receiptValidationEscrow,
1324
- })
1325
-
1326
- describe('ChainReceiptValidation', () => {
1327
- test('reads typed ChannelOpened receipt fields', () => {
1328
- expect(
1329
- Chain.readChannelOpenedReceiptFields({
1330
- args: {
1331
- channelId: receiptValidationChannelId,
1332
- deposit: 100n,
1333
- expiringNonceHash: receiptValidationDescriptor.expiringNonceHash,
1334
- },
1335
- }),
1336
- ).toEqual({
1337
- channelId: receiptValidationChannelId,
1338
- deposit: 100n,
1339
- expiringNonceHash: receiptValidationDescriptor.expiringNonceHash,
1340
- })
1341
- })
1342
-
1343
- test('reads typed TopUp receipt fields', () => {
1344
- expect(
1345
- Chain.readTopUpReceiptFields({
1346
- args: { channelId: receiptValidationChannelId, newDeposit: 200n },
1347
- }),
1348
- ).toEqual({
1349
- channelId: receiptValidationChannelId,
1350
- newDeposit: 200n,
1351
- })
1352
- })
1353
-
1354
- test('reads typed settlement receipt fields', () => {
1355
- expect(Chain.readSettledReceiptFields({ args: { newSettled: 300n } })).toEqual({
1356
- newSettled: 300n,
1357
- })
1358
- })
1359
-
1360
- test('reads typed ChannelClosed receipt fields', () => {
1361
- expect(
1362
- Chain.readChannelClosedReceiptFields({
1363
- args: {
1364
- settledToPayee: 250n,
1365
- refundedToPayer: 50n,
1366
- },
1367
- }),
1368
- ).toEqual({
1369
- settledToPayee: 250n,
1370
- refundedToPayer: 50n,
1371
- })
1372
- })
1373
-
1374
- test('rejects malformed receipt event fields', () => {
1375
- expect(() =>
1376
- Chain.readChannelOpenedReceiptFields({
1377
- args: {
1378
- channelId: receiptValidationChannelId,
1379
- deposit: '100',
1380
- expiringNonceHash: receiptValidationDescriptor.expiringNonceHash,
1381
- },
1382
- }),
1383
- ).toThrow('ChannelOpened deposit missing from receipt event')
1384
-
1385
- expect(() =>
1386
- Chain.readChannelOpenedReceiptFields({
1387
- args: {
1388
- channelId: '0x1234',
1389
- deposit: 100n,
1390
- expiringNonceHash: receiptValidationDescriptor.expiringNonceHash,
1391
- },
1392
- }),
1393
- ).toThrow('ChannelOpened channelId missing from receipt event')
1394
-
1395
- expect(() =>
1396
- Chain.readChannelOpenedReceiptFields({
1397
- args: {
1398
- channelId: receiptValidationChannelId,
1399
- deposit: 100n,
1400
- expiringNonceHash: `0x${'zz'.repeat(32)}`,
1401
- },
1402
- }),
1403
- ).toThrow('ChannelOpened expiringNonceHash missing from receipt event')
1404
-
1405
- expect(() =>
1406
- Chain.readTopUpReceiptFields({
1407
- args: {
1408
- channelId: '0x1234',
1409
- newDeposit: 200n,
1410
- },
1411
- }),
1412
- ).toThrow('TopUp channelId missing from receipt event')
1413
-
1414
- expect(() =>
1415
- Chain.readTopUpReceiptFields({
1416
- args: {
1417
- channelId: receiptValidationChannelId,
1418
- newDeposit: 2n ** 96n,
1419
- },
1420
- }),
1421
- ).toThrow('TopUp newDeposit exceeds uint96 range')
1422
-
1423
- expect(() => Chain.readSettledReceiptFields({ args: { newSettled: '300' } })).toThrow(
1424
- 'Settled newSettled missing from receipt event',
1425
- )
1426
-
1427
- expect(() =>
1428
- Chain.readChannelClosedReceiptFields({
1429
- args: {
1430
- settledToPayee: 250n,
1431
- refundedToPayer: 2n ** 96n,
1432
- },
1433
- }),
1434
- ).toThrow('ChannelClosed refundedToPayer exceeds uint96 range')
1435
- })
1436
-
1437
- test('accepts a matching ChannelOpened receipt and read-back state', () => {
1438
- expect(() =>
1439
- Chain.validateChannelOpenedReceipt({
1440
- chainId: receiptValidationChainId,
1441
- descriptor: receiptValidationDescriptor,
1442
- emittedChannelId: receiptValidationChannelId,
1443
- emittedDeposit: 100n,
1444
- emittedExpiringNonceHash: receiptValidationDescriptor.expiringNonceHash,
1445
- escrow: receiptValidationEscrow,
1446
- expectedChannelId: receiptValidationChannelId,
1447
- openDeposit: 100n,
1448
- }),
1449
- ).not.toThrow()
1450
-
1451
- expect(() =>
1452
- Chain.validateOpenReadbackState({
1453
- emittedDeposit: 100n,
1454
- state: { deposit: 100n, settled: 0n, closeRequestedAt: 0 },
1455
- }),
1456
- ).not.toThrow()
1457
- })
1458
-
1459
- test('rejects ChannelOpened mismatches', () => {
1460
- const cases = [
1461
- {
1462
- parameters: { emittedChannelId: `0x${'ff'.repeat(32)}` as Hex },
1463
- message: 'ChannelOpened channelId does not match credential',
1464
- },
1465
- {
1466
- parameters: { emittedExpiringNonceHash: `0x${'33'.repeat(32)}` as Hex },
1467
- message: 'ChannelOpened expiringNonceHash does not match descriptor',
1468
- },
1469
- {
1470
- parameters: { emittedDeposit: 101n },
1471
- message: 'ChannelOpened deposit does not match calldata',
1472
- },
1473
- ] as const
1474
-
1475
- for (const item of cases) {
1476
- expect(() =>
1477
- Chain.validateChannelOpenedReceipt({
1478
- chainId: receiptValidationChainId,
1479
- descriptor: receiptValidationDescriptor,
1480
- emittedChannelId: receiptValidationChannelId,
1481
- emittedDeposit: 100n,
1482
- emittedExpiringNonceHash: receiptValidationDescriptor.expiringNonceHash,
1483
- escrow: receiptValidationEscrow,
1484
- expectedChannelId: receiptValidationChannelId,
1485
- openDeposit: 100n,
1486
- ...item.parameters,
1487
- }),
1488
- ).toThrow(item.message)
1489
- }
1490
- })
1491
-
1492
- test('rejects mismatched open read-back state', () => {
1493
- expect(() =>
1494
- Chain.validateOpenReadbackState({
1495
- emittedDeposit: 100n,
1496
- state: { deposit: 100n, settled: 1n, closeRequestedAt: 0 },
1497
- }),
1498
- ).toThrow(VerificationFailedError)
1499
- })
1500
-
1501
- test('validates top-up receipt and read-back state', () => {
1502
- expect(() =>
1503
- Chain.validateTopUpReceipt({
1504
- emittedChannelId: receiptValidationChannelId,
1505
- expectedChannelId: receiptValidationChannelId,
1506
- }),
1507
- ).not.toThrow()
1508
- expect(() =>
1509
- Chain.validateTopUpReadbackState({
1510
- newDeposit: 200n,
1511
- state: { deposit: 200n, settled: 0n, closeRequestedAt: 0 },
1512
- }),
1513
- ).not.toThrow()
1514
- })
1515
-
1516
- test('rejects top-up receipt and read-back mismatches', () => {
1517
- expect(() =>
1518
- Chain.validateTopUpReceipt({
1519
- emittedChannelId: `0x${'ff'.repeat(32)}` as Hex,
1520
- expectedChannelId: receiptValidationChannelId,
1521
- }),
1522
- ).toThrow('TopUp channelId does not match credential')
1523
-
1524
- expect(() =>
1525
- Chain.validateTopUpReadbackState({
1526
- newDeposit: 200n,
1527
- state: { deposit: 199n, settled: 0n, closeRequestedAt: 0 },
1528
- }),
1529
- ).toThrow('on-chain channel state does not match topUp receipt')
1530
- })
1531
- })
1532
-
1533
- describe('Chain.assertPrecompileFeePayerPolicy', () => {
1534
- test('allows transactions within configured sponsor limits', () => {
1535
- expect(() =>
1536
- Chain.assertPrecompileFeePayerPolicy({
1537
- prepared: {
1538
- gas: 100n,
1539
- maxFeePerGas: 20n,
1540
- maxPriorityFeePerGas: 5n,
1541
- },
1542
- policy: {
1543
- maxGas: 100n,
1544
- maxFeePerGas: 20n,
1545
- maxPriorityFeePerGas: 5n,
1546
- maxTotalFee: 2_000n,
1547
- },
1548
- }),
1549
- ).not.toThrow()
1550
- })
1551
-
1552
- test('allows missing optional policy', () => {
1553
- expect(() =>
1554
- Chain.assertPrecompileFeePayerPolicy({
1555
- prepared: {
1556
- gas: 100n,
1557
- maxFeePerGas: 20n,
1558
- maxPriorityFeePerGas: 5n,
1559
- },
1560
- }),
1561
- ).not.toThrow()
1562
- })
1563
-
1564
- test('rejects each exceeded sponsor limit', () => {
1565
- const cases = [
1566
- {
1567
- policy: { maxGas: 99n },
1568
- reason: 'fee-payer policy maxGas exceeded',
1569
- },
1570
- {
1571
- policy: { maxFeePerGas: 19n },
1572
- reason: 'fee-payer policy maxFeePerGas exceeded',
1573
- },
1574
- {
1575
- policy: { maxPriorityFeePerGas: 4n },
1576
- reason: 'fee-payer policy maxPriorityFeePerGas exceeded',
1577
- },
1578
- {
1579
- policy: { maxTotalFee: 1_999n },
1580
- reason: 'fee-payer policy maxTotalFee exceeded',
1581
- },
1582
- ] as const
1583
-
1584
- for (const item of cases) {
1585
- expect(() =>
1586
- Chain.assertPrecompileFeePayerPolicy({
1587
- prepared: {
1588
- gas: 100n,
1589
- maxFeePerGas: 20n,
1590
- maxPriorityFeePerGas: 5n,
1591
- },
1592
- policy: item.policy,
1593
- }),
1594
- ).toThrow(item.reason)
1595
- }
1596
- })
1597
- })
1598
-
1599
- describe('Chain.readbackWithRetry', () => {
1600
- test('returns immediately when the read succeeds on the first attempt', async () => {
1601
- let calls = 0
1602
- const result = await Chain.readbackWithRetry(
1603
- async () => {
1604
- calls++
1605
- return 'ok'
1606
- },
1607
- { delayMs: 0 },
1608
- )
1609
- expect(result).toBe('ok')
1610
- expect(calls).toBe(1)
1611
- })
1612
-
1613
- test('retries a lagging read until it resolves', async () => {
1614
- let calls = 0
1615
- const result = await Chain.readbackWithRetry(
1616
- async () => {
1617
- calls++
1618
- if (calls < 3) throw new Error('header not found')
1619
- return 'ok'
1620
- },
1621
- { retries: 5, delayMs: 0 },
1622
- )
1623
- expect(result).toBe('ok')
1624
- expect(calls).toBe(3)
1625
- })
1626
-
1627
- test('rethrows the last error after exhausting retries', async () => {
1628
- let calls = 0
1629
- await expect(
1630
- Chain.readbackWithRetry(
1631
- async () => {
1632
- calls++
1633
- throw new Error(`attempt ${calls}`)
1634
- },
1635
- { retries: 2, delayMs: 0 },
1636
- ),
1637
- ).rejects.toThrow('attempt 3')
1638
- // 1 initial attempt + 2 retries.
1639
- expect(calls).toBe(3)
1640
- })
1641
- })