mppx 0.8.15 → 0.8.18

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