mppx 0.6.30 → 0.7.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (483) hide show
  1. package/CHANGELOG.md +25 -0
  2. package/dist/Challenge.d.ts.map +1 -1
  3. package/dist/Challenge.js +9 -7
  4. package/dist/Challenge.js.map +1 -1
  5. package/dist/Constants.d.ts +46 -0
  6. package/dist/Constants.d.ts.map +1 -0
  7. package/dist/Constants.js +46 -0
  8. package/dist/Constants.js.map +1 -0
  9. package/dist/Credential.d.ts.map +1 -1
  10. package/dist/Credential.js +5 -4
  11. package/dist/Credential.js.map +1 -1
  12. package/dist/Method.d.ts +32 -4
  13. package/dist/Method.d.ts.map +1 -1
  14. package/dist/Method.js +5 -2
  15. package/dist/Method.js.map +1 -1
  16. package/dist/Receipt.d.ts.map +1 -1
  17. package/dist/Receipt.js +3 -2
  18. package/dist/Receipt.js.map +1 -1
  19. package/dist/cli/cli.d.ts.map +1 -1
  20. package/dist/cli/cli.js +19 -11
  21. package/dist/cli/cli.js.map +1 -1
  22. package/dist/cli/plugins/tempo.d.ts.map +1 -1
  23. package/dist/cli/plugins/tempo.js +17 -6
  24. package/dist/cli/plugins/tempo.js.map +1 -1
  25. package/dist/cli/utils.d.ts +5 -0
  26. package/dist/cli/utils.d.ts.map +1 -1
  27. package/dist/cli/utils.js +10 -0
  28. package/dist/cli/utils.js.map +1 -1
  29. package/dist/client/Methods.d.ts +5 -2
  30. package/dist/client/Methods.d.ts.map +1 -1
  31. package/dist/client/Methods.js +5 -2
  32. package/dist/client/Methods.js.map +1 -1
  33. package/dist/client/Transport.d.ts.map +1 -1
  34. package/dist/client/Transport.js +4 -5
  35. package/dist/client/Transport.js.map +1 -1
  36. package/dist/client/index.d.ts +2 -1
  37. package/dist/client/index.d.ts.map +1 -1
  38. package/dist/client/index.js +2 -1
  39. package/dist/client/index.js.map +1 -1
  40. package/dist/client/internal/Fetch.d.ts.map +1 -1
  41. package/dist/client/internal/Fetch.js +14 -6
  42. package/dist/client/internal/Fetch.js.map +1 -1
  43. package/dist/evm/server/Methods.d.ts +1 -1
  44. package/dist/evm/server/Methods.d.ts.map +1 -1
  45. package/dist/index.d.ts +1 -0
  46. package/dist/index.d.ts.map +1 -1
  47. package/dist/index.js +1 -0
  48. package/dist/index.js.map +1 -1
  49. package/dist/internal/AcceptPayment.d.ts +3 -0
  50. package/dist/internal/AcceptPayment.d.ts.map +1 -1
  51. package/dist/internal/AcceptPayment.js +15 -11
  52. package/dist/internal/AcceptPayment.js.map +1 -1
  53. package/dist/mcp-sdk/client/McpClient.d.ts +12 -5
  54. package/dist/mcp-sdk/client/McpClient.d.ts.map +1 -1
  55. package/dist/mcp-sdk/client/McpClient.js +55 -42
  56. package/dist/mcp-sdk/client/McpClient.js.map +1 -1
  57. package/dist/server/Mppx.d.ts +11 -3
  58. package/dist/server/Mppx.d.ts.map +1 -1
  59. package/dist/server/Mppx.js +76 -27
  60. package/dist/server/Mppx.js.map +1 -1
  61. package/dist/server/Request.js +24 -10
  62. package/dist/server/Request.js.map +1 -1
  63. package/dist/server/Response.d.ts.map +1 -1
  64. package/dist/server/Response.js +2 -1
  65. package/dist/server/Response.js.map +1 -1
  66. package/dist/server/Transport.d.ts.map +1 -1
  67. package/dist/server/Transport.js +4 -3
  68. package/dist/server/Transport.js.map +1 -1
  69. package/dist/server/index.d.ts +1 -0
  70. package/dist/server/index.d.ts.map +1 -1
  71. package/dist/server/index.js +1 -0
  72. package/dist/server/index.js.map +1 -1
  73. package/dist/stripe/client/Charge.d.ts +1 -1
  74. package/dist/stripe/client/Charge.d.ts.map +1 -1
  75. package/dist/stripe/client/Charge.js +3 -1
  76. package/dist/stripe/client/Charge.js.map +1 -1
  77. package/dist/stripe/server/Charge.d.ts +1 -1
  78. package/dist/stripe/server/Charge.d.ts.map +1 -1
  79. package/dist/stripe/server/Charge.js +9 -2
  80. package/dist/stripe/server/Charge.js.map +1 -1
  81. package/dist/stripe/server/Methods.d.ts +1 -1
  82. package/dist/stripe/server/Methods.d.ts.map +1 -1
  83. package/dist/stripe/server/internal/html.gen.d.ts +1 -1
  84. package/dist/stripe/server/internal/html.gen.d.ts.map +1 -1
  85. package/dist/stripe/server/internal/html.gen.js +1 -1
  86. package/dist/stripe/server/internal/html.gen.js.map +1 -1
  87. package/dist/tempo/Methods.d.ts +18 -0
  88. package/dist/tempo/Methods.d.ts.map +1 -1
  89. package/dist/tempo/Methods.js +16 -1
  90. package/dist/tempo/Methods.js.map +1 -1
  91. package/dist/tempo/client/Charge.d.ts +6 -0
  92. package/dist/tempo/client/Charge.d.ts.map +1 -1
  93. package/dist/tempo/client/Charge.js +9 -2
  94. package/dist/tempo/client/Charge.js.map +1 -1
  95. package/dist/tempo/client/Methods.d.ts +36 -7
  96. package/dist/tempo/client/Methods.d.ts.map +1 -1
  97. package/dist/tempo/client/Methods.js +12 -5
  98. package/dist/tempo/client/Methods.js.map +1 -1
  99. package/dist/tempo/client/index.d.ts +7 -4
  100. package/dist/tempo/client/index.d.ts.map +1 -1
  101. package/dist/tempo/client/index.js +5 -3
  102. package/dist/tempo/client/index.js.map +1 -1
  103. package/dist/tempo/index.d.ts +1 -0
  104. package/dist/tempo/index.d.ts.map +1 -1
  105. package/dist/tempo/index.js +1 -0
  106. package/dist/tempo/index.js.map +1 -1
  107. package/dist/tempo/internal/fee-payer.d.ts +21 -1
  108. package/dist/tempo/internal/fee-payer.d.ts.map +1 -1
  109. package/dist/tempo/internal/fee-payer.js +109 -4
  110. package/dist/tempo/internal/fee-payer.js.map +1 -1
  111. package/dist/tempo/{client → legacy/client}/ChannelOps.d.ts +19 -6
  112. package/dist/tempo/legacy/client/ChannelOps.d.ts.map +1 -0
  113. package/dist/tempo/{client → legacy/client}/ChannelOps.js +9 -3
  114. package/dist/tempo/legacy/client/ChannelOps.js.map +1 -0
  115. package/dist/tempo/{client → legacy/client}/Session.d.ts +23 -4
  116. package/dist/tempo/legacy/client/Session.d.ts.map +1 -0
  117. package/dist/tempo/{client → legacy/client}/Session.js +14 -7
  118. package/dist/tempo/legacy/client/Session.js.map +1 -0
  119. package/dist/tempo/{client → legacy/client}/SessionManager.d.ts +20 -5
  120. package/dist/tempo/legacy/client/SessionManager.d.ts.map +1 -0
  121. package/dist/tempo/{client → legacy/client}/SessionManager.js +20 -16
  122. package/dist/tempo/legacy/client/SessionManager.js.map +1 -0
  123. package/dist/tempo/legacy/client/index.d.ts +7 -0
  124. package/dist/tempo/legacy/client/index.d.ts.map +1 -0
  125. package/dist/tempo/legacy/client/index.js +5 -0
  126. package/dist/tempo/legacy/client/index.js.map +1 -0
  127. package/dist/tempo/legacy/index.d.ts +7 -0
  128. package/dist/tempo/legacy/index.d.ts.map +1 -0
  129. package/dist/tempo/legacy/index.js +7 -0
  130. package/dist/tempo/legacy/index.js.map +1 -0
  131. package/dist/tempo/{server → legacy/server}/Session.d.ts +28 -11
  132. package/dist/tempo/legacy/server/Session.d.ts.map +1 -0
  133. package/dist/tempo/{server → legacy/server}/Session.js +28 -23
  134. package/dist/tempo/legacy/server/Session.js.map +1 -0
  135. package/dist/tempo/legacy/server/index.d.ts +5 -0
  136. package/dist/tempo/legacy/server/index.d.ts.map +1 -0
  137. package/dist/tempo/legacy/server/index.js +5 -0
  138. package/dist/tempo/legacy/server/index.js.map +1 -0
  139. package/dist/tempo/{session → legacy/session}/Chain.d.ts +30 -23
  140. package/dist/tempo/legacy/session/Chain.d.ts.map +1 -0
  141. package/dist/tempo/{session → legacy/session}/Chain.js +12 -11
  142. package/dist/tempo/legacy/session/Chain.js.map +1 -0
  143. package/dist/tempo/{session → legacy/session}/Channel.d.ts +1 -0
  144. package/dist/tempo/legacy/session/Channel.d.ts.map +1 -0
  145. package/dist/tempo/legacy/session/Channel.js.map +1 -0
  146. package/dist/tempo/legacy/session/ChannelStore.d.ts +22 -0
  147. package/dist/tempo/legacy/session/ChannelStore.d.ts.map +1 -0
  148. package/dist/tempo/legacy/session/ChannelStore.js +6 -0
  149. package/dist/tempo/legacy/session/ChannelStore.js.map +1 -0
  150. package/dist/tempo/legacy/session/Types.d.ts +73 -0
  151. package/dist/tempo/legacy/session/Types.d.ts.map +1 -0
  152. package/dist/tempo/legacy/session/Types.js.map +1 -0
  153. package/dist/tempo/{session → legacy/session}/Voucher.d.ts +4 -4
  154. package/dist/tempo/legacy/session/Voucher.d.ts.map +1 -0
  155. package/dist/tempo/{session → legacy/session}/Voucher.js +1 -1
  156. package/dist/tempo/legacy/session/Voucher.js.map +1 -0
  157. package/dist/tempo/{session → legacy/session}/escrow.abi.d.ts +1 -0
  158. package/dist/tempo/{session → legacy/session}/escrow.abi.d.ts.map +1 -1
  159. package/dist/tempo/{session → legacy/session}/escrow.abi.js +1 -0
  160. package/dist/tempo/legacy/session/escrow.abi.js.map +1 -0
  161. package/dist/tempo/legacy/session/index.d.ts +9 -0
  162. package/dist/tempo/legacy/session/index.d.ts.map +1 -0
  163. package/dist/tempo/legacy/session/index.js +9 -0
  164. package/dist/tempo/legacy/session/index.js.map +1 -0
  165. package/dist/tempo/server/Charge.d.ts +1 -1
  166. package/dist/tempo/server/Charge.d.ts.map +1 -1
  167. package/dist/tempo/server/Charge.js +13 -16
  168. package/dist/tempo/server/Charge.js.map +1 -1
  169. package/dist/tempo/server/Methods.d.ts +63 -6
  170. package/dist/tempo/server/Methods.d.ts.map +1 -1
  171. package/dist/tempo/server/Methods.js +36 -8
  172. package/dist/tempo/server/Methods.js.map +1 -1
  173. package/dist/tempo/server/Subscription.d.ts +1 -1
  174. package/dist/tempo/server/Subscription.d.ts.map +1 -1
  175. package/dist/tempo/server/index.d.ts +6 -5
  176. package/dist/tempo/server/index.d.ts.map +1 -1
  177. package/dist/tempo/server/index.js +5 -5
  178. package/dist/tempo/server/index.js.map +1 -1
  179. package/dist/tempo/server/internal/html.gen.d.ts +1 -1
  180. package/dist/tempo/server/internal/html.gen.d.ts.map +1 -1
  181. package/dist/tempo/server/internal/html.gen.js +1 -1
  182. package/dist/tempo/server/internal/html.gen.js.map +1 -1
  183. package/dist/tempo/server/internal/request-body.d.ts +7 -2
  184. package/dist/tempo/server/internal/request-body.d.ts.map +1 -1
  185. package/dist/tempo/server/internal/request-body.js +20 -3
  186. package/dist/tempo/server/internal/request-body.js.map +1 -1
  187. package/dist/tempo/server/internal/transport.d.ts +8 -4
  188. package/dist/tempo/server/internal/transport.d.ts.map +1 -1
  189. package/dist/tempo/server/internal/transport.js +8 -7
  190. package/dist/tempo/server/internal/transport.js.map +1 -1
  191. package/dist/tempo/session/Snapshot.d.ts +32 -0
  192. package/dist/tempo/session/Snapshot.d.ts.map +1 -0
  193. package/dist/tempo/session/Snapshot.js +37 -0
  194. package/dist/tempo/session/Snapshot.js.map +1 -0
  195. package/dist/tempo/session/client/ChannelOps.d.ts +82 -0
  196. package/dist/tempo/session/client/ChannelOps.d.ts.map +1 -0
  197. package/dist/tempo/session/client/ChannelOps.js +204 -0
  198. package/dist/tempo/session/client/ChannelOps.js.map +1 -0
  199. package/dist/tempo/session/client/CredentialState.d.ts +262 -0
  200. package/dist/tempo/session/client/CredentialState.d.ts.map +1 -0
  201. package/dist/tempo/session/client/CredentialState.js +417 -0
  202. package/dist/tempo/session/client/CredentialState.js.map +1 -0
  203. package/dist/tempo/session/client/ReceiptCoordinator.d.ts +26 -0
  204. package/dist/tempo/session/client/ReceiptCoordinator.d.ts.map +1 -0
  205. package/dist/tempo/session/client/ReceiptCoordinator.js +61 -0
  206. package/dist/tempo/session/client/ReceiptCoordinator.js.map +1 -0
  207. package/dist/tempo/session/client/Runtime.d.ts +464 -0
  208. package/dist/tempo/session/client/Runtime.d.ts.map +1 -0
  209. package/dist/tempo/session/client/Runtime.js +499 -0
  210. package/dist/tempo/session/client/Runtime.js.map +1 -0
  211. package/dist/tempo/session/client/Session.d.ts +132 -0
  212. package/dist/tempo/session/client/Session.d.ts.map +1 -0
  213. package/dist/tempo/session/client/Session.js +55 -0
  214. package/dist/tempo/session/client/Session.js.map +1 -0
  215. package/dist/tempo/session/client/SessionManager.d.ts +120 -0
  216. package/dist/tempo/session/client/SessionManager.d.ts.map +1 -0
  217. package/dist/tempo/session/client/SessionManager.js +627 -0
  218. package/dist/tempo/session/client/SessionManager.js.map +1 -0
  219. package/dist/tempo/session/client/Transports.d.ts +449 -0
  220. package/dist/tempo/session/client/Transports.d.ts.map +1 -0
  221. package/dist/tempo/session/client/Transports.js +721 -0
  222. package/dist/tempo/session/client/Transports.js.map +1 -0
  223. package/dist/tempo/session/client/index.d.ts +12 -0
  224. package/dist/tempo/session/client/index.d.ts.map +1 -0
  225. package/dist/tempo/session/client/index.js +5 -0
  226. package/dist/tempo/session/client/index.js.map +1 -0
  227. package/dist/tempo/session/index.d.ts +7 -8
  228. package/dist/tempo/session/index.d.ts.map +1 -1
  229. package/dist/tempo/session/index.js +7 -8
  230. package/dist/tempo/session/index.js.map +1 -1
  231. package/dist/tempo/session/precompile/Chain.d.ts +319 -0
  232. package/dist/tempo/session/precompile/Chain.d.ts.map +1 -0
  233. package/dist/tempo/session/precompile/Chain.js +492 -0
  234. package/dist/tempo/session/precompile/Chain.js.map +1 -0
  235. package/dist/tempo/session/precompile/Channel.d.ts +46 -0
  236. package/dist/tempo/session/precompile/Channel.d.ts.map +1 -0
  237. package/dist/tempo/session/precompile/Channel.js +56 -0
  238. package/dist/tempo/session/precompile/Channel.js.map +1 -0
  239. package/dist/tempo/session/precompile/Protocol.d.ts +308 -0
  240. package/dist/tempo/session/precompile/Protocol.d.ts.map +1 -0
  241. package/dist/tempo/session/precompile/Protocol.js +264 -0
  242. package/dist/tempo/session/precompile/Protocol.js.map +1 -0
  243. package/dist/tempo/session/precompile/Voucher.d.ts +40 -0
  244. package/dist/tempo/session/precompile/Voucher.d.ts.map +1 -0
  245. package/dist/tempo/session/precompile/Voucher.js +126 -0
  246. package/dist/tempo/session/precompile/Voucher.js.map +1 -0
  247. package/dist/tempo/session/precompile/escrow.abi.d.ts +522 -0
  248. package/dist/tempo/session/precompile/escrow.abi.d.ts.map +1 -0
  249. package/dist/tempo/session/precompile/escrow.abi.js +224 -0
  250. package/dist/tempo/session/precompile/escrow.abi.js.map +1 -0
  251. package/dist/tempo/session/precompile/index.d.ts +24 -0
  252. package/dist/tempo/session/precompile/index.d.ts.map +1 -0
  253. package/dist/tempo/session/precompile/index.js +22 -0
  254. package/dist/tempo/session/precompile/index.js.map +1 -0
  255. package/dist/tempo/session/server/ChannelOps.d.ts +56 -0
  256. package/dist/tempo/session/server/ChannelOps.d.ts.map +1 -0
  257. package/dist/tempo/session/server/ChannelOps.js +91 -0
  258. package/dist/tempo/session/server/ChannelOps.js.map +1 -0
  259. package/dist/tempo/session/server/ChannelStore.d.ts +347 -0
  260. package/dist/tempo/session/server/ChannelStore.d.ts.map +1 -0
  261. package/dist/tempo/session/server/ChannelStore.js +404 -0
  262. package/dist/tempo/session/server/ChannelStore.js.map +1 -0
  263. package/dist/tempo/session/server/CredentialVerification.d.ts +85 -0
  264. package/dist/tempo/session/server/CredentialVerification.d.ts.map +1 -0
  265. package/dist/tempo/session/server/CredentialVerification.js +494 -0
  266. package/dist/tempo/session/server/CredentialVerification.js.map +1 -0
  267. package/dist/tempo/session/server/MeteredStream.d.ts +40 -0
  268. package/dist/tempo/session/server/MeteredStream.d.ts.map +1 -0
  269. package/dist/tempo/session/server/MeteredStream.js +42 -0
  270. package/dist/tempo/session/server/MeteredStream.js.map +1 -0
  271. package/dist/tempo/session/server/RequestState.d.ts +208 -0
  272. package/dist/tempo/session/server/RequestState.d.ts.map +1 -0
  273. package/dist/tempo/session/server/RequestState.js +252 -0
  274. package/dist/tempo/session/server/RequestState.js.map +1 -0
  275. package/dist/tempo/session/server/Session.d.ts +169 -0
  276. package/dist/tempo/session/server/Session.d.ts.map +1 -0
  277. package/dist/tempo/session/server/Session.js +351 -0
  278. package/dist/tempo/session/server/Session.js.map +1 -0
  279. package/dist/tempo/session/server/Settlement.d.ts +185 -0
  280. package/dist/tempo/session/server/Settlement.d.ts.map +1 -0
  281. package/dist/tempo/session/server/Settlement.js +250 -0
  282. package/dist/tempo/session/server/Settlement.js.map +1 -0
  283. package/dist/tempo/session/{Sse.d.ts → server/Sse.d.ts} +9 -56
  284. package/dist/tempo/session/server/Sse.d.ts.map +1 -0
  285. package/dist/tempo/session/server/Sse.js +184 -0
  286. package/dist/tempo/session/server/Sse.js.map +1 -0
  287. package/dist/tempo/session/server/Transports.d.ts +89 -0
  288. package/dist/tempo/session/server/Transports.d.ts.map +1 -0
  289. package/dist/tempo/session/server/Transports.js +149 -0
  290. package/dist/tempo/session/server/Transports.js.map +1 -0
  291. package/dist/tempo/session/server/Ws.d.ts +48 -0
  292. package/dist/tempo/session/server/Ws.d.ts.map +1 -0
  293. package/dist/tempo/session/server/Ws.js +244 -0
  294. package/dist/tempo/session/server/Ws.js.map +1 -0
  295. package/dist/tempo/session/server/index.d.ts +4 -0
  296. package/dist/tempo/session/server/index.d.ts.map +1 -0
  297. package/dist/tempo/session/server/index.js +2 -0
  298. package/dist/tempo/session/server/index.js.map +1 -0
  299. package/package.json +8 -3
  300. package/src/Challenge.ts +9 -7
  301. package/src/Constants.ts +58 -0
  302. package/src/Credential.ts +5 -4
  303. package/src/Method.ts +46 -5
  304. package/src/Receipt.ts +3 -2
  305. package/src/cli/cli.test.ts +23 -28
  306. package/src/cli/cli.ts +23 -10
  307. package/src/cli/mcp.test.ts +21 -7
  308. package/src/cli/plugins/tempo.ts +21 -8
  309. package/src/cli/utils.test.ts +25 -1
  310. package/src/cli/utils.ts +10 -0
  311. package/src/client/Methods.ts +5 -2
  312. package/src/client/Mppx.test-d.ts +10 -0
  313. package/src/client/Mppx.test.ts +75 -0
  314. package/src/client/Transport.ts +4 -5
  315. package/src/client/index.ts +11 -1
  316. package/src/client/internal/Fetch.test.ts +29 -4
  317. package/src/client/internal/Fetch.ts +17 -5
  318. package/src/env.d.ts +1 -1
  319. package/src/index.ts +1 -0
  320. package/src/internal/AcceptPayment.test.ts +61 -0
  321. package/src/internal/AcceptPayment.ts +21 -14
  322. package/src/mcp-sdk/client/McpClient.integration.test.ts +8 -7
  323. package/src/mcp-sdk/client/McpClient.test-d.ts +7 -0
  324. package/src/mcp-sdk/client/McpClient.ts +99 -67
  325. package/src/mcp-sdk/client/McpClient.unit.test.ts +131 -0
  326. package/src/middlewares/elysia.test.ts +8 -4
  327. package/src/middlewares/express.test.ts +8 -4
  328. package/src/middlewares/hono.test.ts +4 -4
  329. package/src/middlewares/nextjs.test.ts +8 -4
  330. package/src/proxy/Proxy.test.ts +8 -8
  331. package/src/server/Mppx.test-d.ts +54 -0
  332. package/src/server/Mppx.test.ts +274 -7
  333. package/src/server/Mppx.ts +487 -406
  334. package/src/server/Request.test.ts +81 -0
  335. package/src/server/Request.ts +23 -9
  336. package/src/server/Response.ts +2 -1
  337. package/src/server/Transport.ts +4 -3
  338. package/src/server/index.ts +1 -0
  339. package/src/stripe/client/Charge.test.ts +20 -5
  340. package/src/stripe/client/Charge.ts +6 -2
  341. package/src/stripe/server/Charge.test.ts +114 -1
  342. package/src/stripe/server/Charge.ts +13 -2
  343. package/src/stripe/server/internal/html/package.json +1 -1
  344. package/src/stripe/server/internal/html.gen.ts +1 -1
  345. package/src/tempo/AccessKeyAuthorization.test.ts +4 -94
  346. package/src/tempo/Methods.test.ts +45 -17
  347. package/src/tempo/Methods.ts +22 -0
  348. package/src/tempo/PublicExports.test-d.ts +105 -0
  349. package/src/tempo/client/Charge.test.ts +85 -0
  350. package/src/tempo/client/Charge.ts +19 -2
  351. package/src/tempo/client/Methods.ts +18 -6
  352. package/src/tempo/client/index.ts +15 -4
  353. package/src/tempo/index.ts +1 -0
  354. package/src/tempo/internal/fee-payer.test.ts +241 -17
  355. package/src/tempo/internal/fee-payer.ts +150 -4
  356. package/src/tempo/internal/fee-token.test.ts +14 -9
  357. package/src/tempo/legacy/AccessKeyAuthorization.test.ts +162 -0
  358. package/src/tempo/legacy/README.md +9 -0
  359. package/src/tempo/{client → legacy/client}/ChannelOps.test.ts +6 -7
  360. package/src/tempo/{client → legacy/client}/ChannelOps.ts +22 -9
  361. package/src/tempo/{client → legacy/client}/Session.test.ts +51 -9
  362. package/src/tempo/{client → legacy/client}/Session.ts +25 -11
  363. package/src/tempo/{client → legacy/client}/SessionManager.test.ts +81 -9
  364. package/src/tempo/{client → legacy/client}/SessionManager.ts +41 -20
  365. package/src/tempo/legacy/client/index.ts +6 -0
  366. package/src/tempo/legacy/index.ts +6 -0
  367. package/src/tempo/{server → legacy/server}/Session.test.ts +162 -63
  368. package/src/tempo/{server → legacy/server}/Session.ts +49 -37
  369. package/src/tempo/legacy/server/index.ts +4 -0
  370. package/src/tempo/{session → legacy/session}/Chain.test.ts +3 -4
  371. package/src/tempo/{session → legacy/session}/Chain.ts +94 -63
  372. package/src/tempo/{session → legacy/session}/Channel.ts +1 -0
  373. package/src/tempo/legacy/session/ChannelStore.test.ts +58 -0
  374. package/src/tempo/legacy/session/ChannelStore.ts +39 -0
  375. package/src/tempo/legacy/session/Types.ts +91 -0
  376. package/src/tempo/{session → legacy/session}/Voucher.ts +12 -8
  377. package/src/tempo/{session → legacy/session}/escrow.abi.ts +1 -0
  378. package/src/tempo/legacy/session/index.ts +8 -0
  379. package/src/tempo/server/AtomicStore.test-d.ts +16 -11
  380. package/src/tempo/server/Charge.test.ts +92 -14
  381. package/src/tempo/server/Charge.ts +18 -16
  382. package/src/tempo/server/Methods.ts +54 -8
  383. package/src/tempo/server/Sse.test.ts +2 -2
  384. package/src/tempo/server/index.ts +6 -5
  385. package/src/tempo/server/internal/html/package.json +1 -1
  386. package/src/tempo/server/internal/html.gen.ts +1 -1
  387. package/src/tempo/server/internal/request-body.test.ts +37 -4
  388. package/src/tempo/server/internal/request-body.ts +25 -6
  389. package/src/tempo/server/internal/transport.test.ts +4 -4
  390. package/src/tempo/server/internal/transport.ts +19 -10
  391. package/src/tempo/session/Snapshot.test.ts +41 -0
  392. package/src/tempo/session/Snapshot.ts +74 -0
  393. package/src/tempo/session/client/ChannelOps.test.ts +163 -0
  394. package/src/tempo/session/client/ChannelOps.ts +344 -0
  395. package/src/tempo/session/client/CredentialState.test.ts +645 -0
  396. package/src/tempo/session/client/CredentialState.ts +814 -0
  397. package/src/tempo/session/client/ReceiptCoordinator.ts +95 -0
  398. package/src/tempo/session/client/Runtime.test.ts +1092 -0
  399. package/src/tempo/session/client/Runtime.ts +986 -0
  400. package/src/tempo/session/client/Session.test.ts +734 -0
  401. package/src/tempo/session/client/Session.ts +97 -0
  402. package/src/tempo/session/client/SessionManager.test.ts +1308 -0
  403. package/src/tempo/session/client/SessionManager.ts +845 -0
  404. package/src/tempo/session/client/Transports.test.ts +837 -0
  405. package/src/tempo/session/client/Transports.ts +1292 -0
  406. package/src/tempo/session/client/index.ts +37 -0
  407. package/src/tempo/session/index.ts +7 -8
  408. package/src/tempo/session/precompile/Chain.integration.test.ts +321 -0
  409. package/src/tempo/session/precompile/Chain.test.ts +1258 -0
  410. package/src/tempo/session/precompile/Chain.ts +979 -0
  411. package/src/tempo/session/precompile/Channel.test.ts +138 -0
  412. package/src/tempo/session/precompile/Channel.ts +103 -0
  413. package/src/tempo/session/precompile/Protocol.test.ts +358 -0
  414. package/src/tempo/session/precompile/Protocol.ts +520 -0
  415. package/src/tempo/session/precompile/Voucher.test.ts +316 -0
  416. package/src/tempo/session/precompile/Voucher.ts +160 -0
  417. package/src/tempo/session/precompile/escrow.abi.ts +226 -0
  418. package/src/tempo/session/precompile/index.ts +33 -0
  419. package/src/tempo/session/server/ChannelOps.test.ts +129 -0
  420. package/src/tempo/session/server/ChannelOps.ts +157 -0
  421. package/src/tempo/session/{ChannelStore.test.ts → server/ChannelStore.test.ts} +536 -29
  422. package/src/tempo/session/server/ChannelStore.ts +835 -0
  423. package/src/tempo/session/server/CredentialVerification.test.ts +146 -0
  424. package/src/tempo/session/server/CredentialVerification.ts +710 -0
  425. package/src/tempo/session/server/MeteredStream.ts +88 -0
  426. package/src/tempo/session/server/RequestState.test.ts +531 -0
  427. package/src/tempo/session/server/RequestState.ts +499 -0
  428. package/src/tempo/session/server/Session.integration.test.ts +444 -0
  429. package/src/tempo/session/server/Session.test.ts +3253 -0
  430. package/src/tempo/session/server/Session.ts +543 -0
  431. package/src/tempo/session/server/Settlement.test.ts +242 -0
  432. package/src/tempo/session/server/Settlement.ts +470 -0
  433. package/src/tempo/session/{Sse.test.ts → server/Sse.test.ts} +37 -3
  434. package/src/tempo/session/server/Sse.ts +256 -0
  435. package/src/tempo/session/server/Transports.test.ts +346 -0
  436. package/src/tempo/session/server/Transports.ts +255 -0
  437. package/src/tempo/session/{Ws.test.ts → server/Ws.test.ts} +4 -4
  438. package/src/tempo/session/server/Ws.ts +384 -0
  439. package/src/tempo/session/server/index.ts +8 -0
  440. package/dist/tempo/client/ChannelOps.d.ts.map +0 -1
  441. package/dist/tempo/client/ChannelOps.js.map +0 -1
  442. package/dist/tempo/client/Session.d.ts.map +0 -1
  443. package/dist/tempo/client/Session.js.map +0 -1
  444. package/dist/tempo/client/SessionManager.d.ts.map +0 -1
  445. package/dist/tempo/client/SessionManager.js.map +0 -1
  446. package/dist/tempo/server/Session.d.ts.map +0 -1
  447. package/dist/tempo/server/Session.js.map +0 -1
  448. package/dist/tempo/session/Chain.d.ts.map +0 -1
  449. package/dist/tempo/session/Chain.js.map +0 -1
  450. package/dist/tempo/session/Channel.d.ts.map +0 -1
  451. package/dist/tempo/session/Channel.js.map +0 -1
  452. package/dist/tempo/session/ChannelStore.d.ts +0 -117
  453. package/dist/tempo/session/ChannelStore.d.ts.map +0 -1
  454. package/dist/tempo/session/ChannelStore.js +0 -172
  455. package/dist/tempo/session/ChannelStore.js.map +0 -1
  456. package/dist/tempo/session/Receipt.d.ts +0 -22
  457. package/dist/tempo/session/Receipt.d.ts.map +0 -1
  458. package/dist/tempo/session/Receipt.js +0 -34
  459. package/dist/tempo/session/Receipt.js.map +0 -1
  460. package/dist/tempo/session/Sse.d.ts.map +0 -1
  461. package/dist/tempo/session/Sse.js +0 -363
  462. package/dist/tempo/session/Sse.js.map +0 -1
  463. package/dist/tempo/session/Types.d.ts +0 -78
  464. package/dist/tempo/session/Types.d.ts.map +0 -1
  465. package/dist/tempo/session/Types.js.map +0 -1
  466. package/dist/tempo/session/Voucher.d.ts.map +0 -1
  467. package/dist/tempo/session/Voucher.js.map +0 -1
  468. package/dist/tempo/session/Ws.d.ts +0 -87
  469. package/dist/tempo/session/Ws.d.ts.map +0 -1
  470. package/dist/tempo/session/Ws.js +0 -443
  471. package/dist/tempo/session/Ws.js.map +0 -1
  472. package/dist/tempo/session/escrow.abi.js.map +0 -1
  473. package/src/tempo/session/ChannelStore.ts +0 -308
  474. package/src/tempo/session/Receipt.test.ts +0 -89
  475. package/src/tempo/session/Receipt.ts +0 -46
  476. package/src/tempo/session/Sse.ts +0 -462
  477. package/src/tempo/session/Types.ts +0 -86
  478. package/src/tempo/session/Ws.ts +0 -576
  479. /package/dist/tempo/{session → legacy/session}/Channel.js +0 -0
  480. /package/dist/tempo/{session → legacy/session}/Types.js +0 -0
  481. /package/src/tempo/{session → legacy/session}/Channel.test.ts +0 -0
  482. /package/src/tempo/{session → legacy/session}/Voucher.test.ts +0 -0
  483. /package/src/tempo/session/{Sse.fuzz.test.ts → server/Sse.fuzz.test.ts} +0 -0
@@ -20,6 +20,7 @@ import {
20
20
  } from 'viem'
21
21
  import { tempo as tempo_chain } from 'viem/tempo/chains'
22
22
 
23
+ import * as Constants from '../../../Constants.js'
23
24
  import {
24
25
  AmountExceedsDepositError,
25
26
  BadRequestError,
@@ -29,18 +30,25 @@ import {
29
30
  InsufficientBalanceError,
30
31
  InvalidSignatureError,
31
32
  VerificationFailedError,
32
- } from '../../Errors.js'
33
- import type { Challenge, Credential } from '../../index.js'
34
- import type { LooseOmit, NoExtraKeys } from '../../internal/types.js'
35
- import * as Method from '../../Method.js'
36
- import * as Store from '../../Store.js'
37
- import * as Client from '../../viem/Client.js'
38
- import type * as z from '../../zod.js'
39
- import * as Account from '../internal/account.js'
40
- import * as defaults from '../internal/defaults.js'
41
- import * as FeePayer from '../internal/fee-payer.js'
42
- import type * as types from '../internal/types.js'
43
- import * as Methods from '../Methods.js'
33
+ } from '../../../Errors.js'
34
+ import type { Challenge, Credential } from '../../../index.js'
35
+ import type { LooseOmit, NoExtraKeys } from '../../../internal/types.js'
36
+ import * as Method from '../../../Method.js'
37
+ import * as Store from '../../../Store.js'
38
+ import * as Client from '../../../viem/Client.js'
39
+ import type * as z from '../../../zod.js'
40
+ import * as Account from '../../internal/account.js'
41
+ import * as defaults from '../../internal/defaults.js'
42
+ import * as FeePayer from '../../internal/fee-payer.js'
43
+ import type * as types from '../../internal/types.js'
44
+ import * as Methods from '../../Methods.js'
45
+ import {
46
+ captureRequestBodyProbe,
47
+ isSessionContentRequest,
48
+ } from '../../server/internal/request-body.js'
49
+ import * as Transport from '../../server/internal/transport.js'
50
+ import { createSessionReceipt } from '../../session/precompile/Protocol.js'
51
+ import type { SessionReceipt } from '../../session/precompile/Protocol.js'
44
52
  import {
45
53
  broadcastOpenTransaction,
46
54
  broadcastTopUpTransaction,
@@ -50,11 +58,8 @@ import {
50
58
  settleOnChain,
51
59
  } from '../session/Chain.js'
52
60
  import * as ChannelStore from '../session/ChannelStore.js'
53
- import { createSessionReceipt } from '../session/Receipt.js'
54
- import type { SessionCredentialPayload, SessionReceipt, SignedVoucher } from '../session/Types.js'
61
+ import type { LegacySessionCredentialPayload, LegacySignedVoucher } from '../session/Types.js'
55
62
  import { parseVoucherFromPayload, verifyVoucher } from '../session/Voucher.js'
56
- import { captureRequestBodyProbe, isSessionContentRequest } from './internal/request-body.js'
57
- import * as Transport from './internal/transport.js'
58
63
 
59
64
  /** Challenge methodDetails shape for session methods. */
60
65
  type SessionMethodDetails = {
@@ -63,6 +68,7 @@ type SessionMethodDetails = {
63
68
  channelId?: Hex | undefined
64
69
  minVoucherDelta?: string | undefined
65
70
  feePayer?: boolean | undefined
71
+ sessionProtocol?: Constants.SessionProtocol | undefined
66
72
  }
67
73
 
68
74
  /**
@@ -183,11 +189,13 @@ export function session<const parameters extends session.Parameters>(
183
189
  chainId,
184
190
  escrowContract: resolvedEscrow,
185
191
  feePayer: resolvedFeePayer,
192
+ sessionProtocol: Constants.SessionProtocols.v1,
186
193
  }
187
194
  },
188
195
 
189
196
  async verify({ credential, envelope, request }) {
190
- const { challenge, payload } = credential as Credential.Credential<SessionCredentialPayload>
197
+ const { challenge, payload } =
198
+ credential as Credential.Credential<LegacySessionCredentialPayload>
191
199
 
192
200
  const resolvedRequest = (() => {
193
201
  const parsed = Methods.session.schema.request.safeParse(request)
@@ -285,7 +293,8 @@ export function session<const parameters extends session.Parameters>(
285
293
  if (
286
294
  envelope &&
287
295
  isSessionContentRequest(envelope.capturedRequest) &&
288
- (payload.action === 'open' || payload.action === 'voucher')
296
+ (payload.action === 'open' ||
297
+ (payload.action === 'voucher' && !isSseNegotiationRequest(envelope.capturedRequest)))
289
298
  ) {
290
299
  const charged = await charge(
291
300
  store,
@@ -314,18 +323,25 @@ export function session<const parameters extends session.Parameters>(
314
323
  // during verification. Non-billable requests are treated as management
315
324
  // updates; billable requests fall through to the application handler.
316
325
  respond({ credential, envelope, input }) {
317
- const { payload } = credential as Credential.Credential<SessionCredentialPayload>
326
+ const { payload } = credential as Credential.Credential<LegacySessionCredentialPayload>
327
+ const request = envelope?.capturedRequest ?? captureRequestBodyProbe(input)
318
328
 
319
329
  if (payload.action === 'close') return new Response(null, { status: 204 })
320
330
  if (payload.action === 'topUp') return new Response(null, { status: 204 })
331
+ if (parameters.sse && payload.action === 'voucher' && isSseNegotiationRequest(request))
332
+ return new Response(null, { status: 204 })
321
333
 
322
- const request = envelope?.capturedRequest ?? captureRequestBodyProbe(input)
323
334
  if (isSessionContentRequest(request)) return undefined
324
335
  return new Response(null, { status: 204 })
325
336
  },
326
337
  })
327
338
  }
328
339
 
340
+ function isSseNegotiationRequest(input: Pick<Method.CapturedRequest, 'headers'>): boolean {
341
+ return input.headers.get('Accept')?.includes('text/event-stream') ?? false
342
+ }
343
+
344
+ /** Type helpers for the legacy contract-backed session server method. */
329
345
  export declare namespace session {
330
346
  type Defaults = LooseOmit<
331
347
  Method.RequestDefaults<typeof Methods.session>,
@@ -530,7 +546,7 @@ async function verifyAndAcceptVoucher(parameters: {
530
546
  challenge: Challenge.Challenge
531
547
  channel: ChannelStore.State
532
548
  channelId: Hex
533
- voucher: SignedVoucher
549
+ voucher: LegacySignedVoucher
534
550
  onChain: OnChainChannel
535
551
  }): Promise<SessionReceipt> {
536
552
  const { store, minVoucherDelta, challenge, channel, channelId, voucher, onChain } = parameters
@@ -553,7 +569,7 @@ async function verifyAndAcceptVoucher(parameters: {
553
569
 
554
570
  if (voucher.cumulativeAmount <= onChain.settled) {
555
571
  throw new VerificationFailedError({
556
- reason: 'voucher cumulativeAmount is below on-chain settled amount',
572
+ reason: 'voucher cumulativeAmount is at or below on-chain settled amount',
557
573
  })
558
574
  }
559
575
 
@@ -561,12 +577,6 @@ async function verifyAndAcceptVoucher(parameters: {
561
577
  throw new AmountExceedsDepositError({ reason: 'voucher amount exceeds on-chain deposit' })
562
578
  }
563
579
 
564
- if (voucher.cumulativeAmount < channel.highestVoucherAmount) {
565
- throw new VerificationFailedError({
566
- reason: 'voucher cumulativeAmount must be strictly greater than highest accepted voucher',
567
- })
568
- }
569
-
570
580
  const isValid = await verifyVoucher(
571
581
  channel.escrowContract,
572
582
  channel.chainId,
@@ -578,9 +588,11 @@ async function verifyAndAcceptVoucher(parameters: {
578
588
  throw new InvalidSignatureError({ reason: 'invalid voucher signature' })
579
589
  }
580
590
 
581
- // Idempotent replay: equal cumulative voucher is accepted without
582
- // advancing channel state or charging additional value.
583
- if (voucher.cumulativeAmount === channel.highestVoucherAmount) {
591
+ // Idempotent replay: a non-advancing voucher (at or below the highest
592
+ // accepted amount, but above the on-chain settled amount checked above)
593
+ // returns 200 OK with the current highest amount without advancing state,
594
+ // per the session spec's idempotency requirement.
595
+ if (voucher.cumulativeAmount <= channel.highestVoucherAmount) {
584
596
  return createSessionReceipt({
585
597
  challengeId: challenge.id,
586
598
  channelId,
@@ -632,7 +644,7 @@ async function handleOpen(
632
644
  store: ChannelStore.ChannelStore,
633
645
  client: viem_Client,
634
646
  challenge: Challenge.Challenge,
635
- payload: SessionCredentialPayload & { action: 'open' },
647
+ payload: LegacySessionCredentialPayload & { action: 'open' },
636
648
  methodDetails: SessionMethodDetails,
637
649
  feePayer: viem_Account | undefined,
638
650
  isSponsored: boolean,
@@ -660,7 +672,7 @@ async function handleOpen(
660
672
 
661
673
  if (voucher.cumulativeAmount <= onChain.settled) {
662
674
  throw new VerificationFailedError({
663
- reason: 'voucher cumulativeAmount is below on-chain settled amount',
675
+ reason: 'voucher cumulativeAmount is at or below on-chain settled amount',
664
676
  })
665
677
  }
666
678
 
@@ -701,7 +713,7 @@ async function handleOpen(
701
713
  if (existing) {
702
714
  if (voucher.cumulativeAmount <= existing.settledOnChain) {
703
715
  throw new VerificationFailedError({
704
- reason: 'voucher amount is below settled on-chain amount',
716
+ reason: 'voucher amount is at or below settled on-chain amount',
705
717
  })
706
718
  }
707
719
 
@@ -771,7 +783,7 @@ async function handleTopUp(
771
783
  store: ChannelStore.ChannelStore,
772
784
  client: viem_Client,
773
785
  challenge: Challenge.Challenge,
774
- payload: SessionCredentialPayload & { action: 'topUp' },
786
+ payload: LegacySessionCredentialPayload & { action: 'topUp' },
775
787
  methodDetails: SessionMethodDetails,
776
788
  feePayer: viem_Account | undefined,
777
789
  isSponsored: boolean,
@@ -821,7 +833,7 @@ async function handleVoucher(
821
833
  client: viem_Client,
822
834
  minVoucherDelta: bigint,
823
835
  challenge: Challenge.Challenge,
824
- payload: SessionCredentialPayload & { action: 'voucher' },
836
+ payload: LegacySessionCredentialPayload & { action: 'voucher' },
825
837
  methodDetails: SessionMethodDetails,
826
838
  channelStateTtl: number,
827
839
  lastOnChainVerified: Map<Hex, number>,
@@ -893,7 +905,7 @@ async function handleClose(
893
905
  store: ChannelStore.ChannelStore,
894
906
  client: viem_Client,
895
907
  challenge: Challenge.Challenge,
896
- payload: SessionCredentialPayload & { action: 'close' },
908
+ payload: LegacySessionCredentialPayload & { action: 'close' },
897
909
  methodDetails: SessionMethodDetails,
898
910
  account?: viem_Account,
899
911
  feePayer?: viem_Account,
@@ -0,0 +1,4 @@
1
+ /** Legacy contract-backed session server method. */
2
+ export { session } from './Session.js'
3
+ /** Legacy contract-backed one-shot settle helper. */
4
+ export { settle } from './Session.js'
@@ -10,7 +10,7 @@ import {
10
10
  import { prepareTransactionRequest, signTransaction, waitForTransactionReceipt } from 'viem/actions'
11
11
  import { Addresses, Transaction } from 'viem/tempo'
12
12
  import { beforeAll, describe, expect, test } from 'vp/test'
13
- import { nodeEnv } from '~test/config.js'
13
+ import { tempoNetwork } from '~test/config.js'
14
14
  import {
15
15
  closeChannelOnChain,
16
16
  deployEscrow,
@@ -18,7 +18,7 @@ import {
18
18
  signOpenChannel,
19
19
  signTopUpChannel,
20
20
  topUpChannel,
21
- } from '~test/tempo/session.js'
21
+ } from '~test/tempo/legacy/session.js'
22
22
  import { accounts, asset, chain, client, fundAccount } from '~test/tempo/viem.js'
23
23
 
24
24
  import {
@@ -33,9 +33,8 @@ import {
33
33
  import * as Channel from './Channel.js'
34
34
  import { signVoucher } from './Voucher.js'
35
35
 
36
- const isLocalnet = nodeEnv === 'localnet'
37
-
38
36
  const UINT128_MAX = 2n ** 128n - 1n
37
+ const isLocalnet = tempoNetwork === 'localnet'
39
38
 
40
39
  describe('assertUint128 (via settleOnChain / closeOnChain)', () => {
41
40
  const mockClient = { chain: { id: 42431 } } as any
@@ -20,23 +20,28 @@ import {
20
20
  } from 'viem/actions'
21
21
  import { Transaction } from 'viem/tempo'
22
22
 
23
- import { BadRequestError, ChannelClosedError, VerificationFailedError } from '../../Errors.js'
24
- import * as TempoAddress from '../internal/address.js'
25
- import * as defaults from '../internal/defaults.js'
26
- import * as FeePayer from '../internal/fee-payer.js'
27
- import { resolveFeeToken } from '../internal/fee-token.js'
23
+ import { BadRequestError, ChannelClosedError, VerificationFailedError } from '../../../Errors.js'
24
+ import * as TempoAddress from '../../internal/address.js'
25
+ import * as defaults from '../../internal/defaults.js'
26
+ import * as FeePayer from '../../internal/fee-payer.js'
27
+ import { resolveFeeToken } from '../../internal/fee-token.js'
28
28
  import * as Channel from './Channel.js'
29
29
  import { escrowAbi } from './escrow.abi.js'
30
- import type { SignedVoucher } from './Types.js'
30
+ import type { LegacySignedVoucher } from './Types.js'
31
31
 
32
32
  export { escrowAbi }
33
33
 
34
+ type SenderSignedTransaction = {
35
+ from?: Address | undefined
36
+ signature?: unknown
37
+ }
38
+
34
39
  /**
35
40
  * Asserts that a deserialized transaction has an existing sender signature —
36
41
  * required before fee payer co-signing to prevent the fee payer from becoming
37
42
  * the sender.
38
43
  */
39
- function assertSenderSigned(transaction: any): void {
44
+ function assertSenderSigned(transaction: SenderSignedTransaction): void {
40
45
  if (!transaction.signature || !transaction.from)
41
46
  throw new BadRequestError({
42
47
  reason: 'Transaction must be signed by the sender before fee payer co-signing',
@@ -109,7 +114,7 @@ export type SettleOptions =
109
114
  export async function settleOnChain(
110
115
  client: Client,
111
116
  escrowContract: Address,
112
- voucher: SignedVoucher,
117
+ voucher: LegacySignedVoucher,
113
118
  options?: SettleOptions,
114
119
  ): Promise<Hex> {
115
120
  assertUint128(voucher.cumulativeAmount)
@@ -160,7 +165,7 @@ export type CloseOptions =
160
165
  export async function closeOnChain(
161
166
  client: Client,
162
167
  escrowContract: Address,
163
- voucher: SignedVoucher,
168
+ voucher: LegacySignedVoucher,
164
169
  options?: CloseOptions,
165
170
  ): Promise<Hex> {
166
171
  assertUint128(voucher.cumulativeAmount)
@@ -298,11 +303,75 @@ const erc20ApproveSelector = /*#__PURE__*/ toFunctionSelector(
298
303
  'function approve(address spender, uint256 amount)',
299
304
  )
300
305
 
306
+ /** Result returned after a legacy open transaction is broadcast or recovered from on-chain state. */
301
307
  export type BroadcastResult = {
302
308
  txHash: Hex | undefined
303
309
  onChain: OnChainChannel
304
310
  }
305
311
 
312
+ /** Inputs for validating an ERC-20 approve call inside a fee-sponsored legacy channel transaction. */
313
+ type SponsoredApproveCallParameters = {
314
+ action: 'open' | 'topUp'
315
+ call: TempoCall
316
+ currency: Address
317
+ escrowContract: Address
318
+ expectedAmount: bigint
319
+ }
320
+
321
+ /** Inputs for extracting the escrow open call from a fee-sponsored legacy channel transaction. */
322
+ type SponsoredOpenCallsParameters = {
323
+ calls: readonly TempoCall[]
324
+ currency: Address
325
+ deposit: bigint
326
+ escrowContract: Address
327
+ }
328
+
329
+ /** Inputs for extracting the escrow top-up call from a fee-sponsored legacy channel transaction. */
330
+ type SponsoredTopUpCallsParameters = {
331
+ calls: readonly TempoCall[]
332
+ currency: Address
333
+ escrowContract: Address
334
+ topUpAmount: bigint
335
+ }
336
+
337
+ /** Inputs for broadcasting and validating a legacy contract-backed open transaction. */
338
+ export type BroadcastOpenTransactionParameters = {
339
+ beforeBroadcast?: ((onChain: OnChainChannel) => Promise<void> | void) | undefined
340
+ challengeExpires?: string | undefined
341
+ channelId: Hex
342
+ client: Client
343
+ currency: Address
344
+ escrowContract: Address
345
+ feePayer?: Account | undefined
346
+ feePayerPolicy?: Partial<FeePayer.Policy> | undefined
347
+ isSponsored?: boolean | undefined
348
+ recipient: Address
349
+ serializedTransaction: Hex
350
+ /** When false, simulates instead of waiting for confirmation and returns derived on-chain state. @default true */
351
+ waitForConfirmation?: boolean | undefined
352
+ }
353
+
354
+ /** Inputs for broadcasting and validating a legacy contract-backed top-up transaction. */
355
+ export type BroadcastTopUpTransactionParameters = {
356
+ challengeExpires?: string | undefined
357
+ channelId: Hex
358
+ client: Client
359
+ currency: Address
360
+ declaredDeposit: bigint
361
+ escrowContract: Address
362
+ feePayer?: Account | undefined
363
+ feePayerPolicy?: Partial<FeePayer.Policy> | undefined
364
+ isSponsored?: boolean | undefined
365
+ previousDeposit: bigint
366
+ serializedTransaction: Hex
367
+ }
368
+
369
+ /** Result returned after a legacy top-up transaction is broadcast and verified. */
370
+ export type BroadcastTopUpTransactionResult = {
371
+ newDeposit: bigint
372
+ txHash: Hex
373
+ }
374
+
306
375
  type TempoCall = NonNullable<ReturnType<(typeof Transaction)['deserialize']>['calls']>[number]
307
376
 
308
377
  function assertCallHasTargetAndData(call: TempoCall): { to: Address; data: Hex } {
@@ -314,13 +383,7 @@ function assertCallHasTargetAndData(call: TempoCall): { to: Address; data: Hex }
314
383
  return { to: call.to, data: call.data }
315
384
  }
316
385
 
317
- function validateSponsoredApproveCall(parameters: {
318
- action: 'open' | 'topUp'
319
- call: TempoCall
320
- currency: Address
321
- escrowContract: Address
322
- expectedAmount: bigint
323
- }) {
386
+ function validateSponsoredApproveCall(parameters: SponsoredApproveCallParameters) {
324
387
  const { action, call, currency, escrowContract, expectedAmount } = parameters
325
388
  const { to, data } = assertCallHasTargetAndData(call)
326
389
 
@@ -346,12 +409,7 @@ function validateSponsoredApproveCall(parameters: {
346
409
  }
347
410
  }
348
411
 
349
- function validateSponsoredOpenCalls(parameters: {
350
- calls: readonly TempoCall[]
351
- currency: Address
352
- escrowContract: Address
353
- deposit: bigint
354
- }) {
412
+ function validateSponsoredOpenCalls(parameters: SponsoredOpenCallsParameters) {
355
413
  const { calls, currency, escrowContract, deposit } = parameters
356
414
 
357
415
  let openCall: TempoCall | undefined
@@ -401,12 +459,7 @@ function validateSponsoredOpenCalls(parameters: {
401
459
  return openCall
402
460
  }
403
461
 
404
- function validateSponsoredTopUpCalls(parameters: {
405
- calls: readonly TempoCall[]
406
- currency: Address
407
- escrowContract: Address
408
- topUpAmount: bigint
409
- }) {
462
+ function validateSponsoredTopUpCalls(parameters: SponsoredTopUpCallsParameters) {
410
463
  const { calls, currency, escrowContract, topUpAmount } = parameters
411
464
 
412
465
  let topUpCall: TempoCall | undefined
@@ -456,21 +509,9 @@ function validateSponsoredTopUpCalls(parameters: {
456
509
  return topUpCall
457
510
  }
458
511
 
459
- export async function broadcastOpenTransaction(parameters: {
460
- client: Client
461
- serializedTransaction: Hex
462
- escrowContract: Address
463
- channelId: Hex
464
- recipient: Address
465
- currency: Address
466
- challengeExpires?: string | undefined
467
- feePayerPolicy?: Partial<FeePayer.Policy> | undefined
468
- feePayer?: Account | undefined
469
- isSponsored?: boolean | undefined
470
- beforeBroadcast?: ((onChain: OnChainChannel) => Promise<void> | void) | undefined
471
- /** When false, simulates instead of waiting for confirmation and returns derived on-chain state. @default true */
472
- waitForConfirmation?: boolean | undefined
473
- }): Promise<BroadcastResult> {
512
+ export async function broadcastOpenTransaction(
513
+ parameters: BroadcastOpenTransactionParameters,
514
+ ): Promise<BroadcastResult> {
474
515
  const {
475
516
  client,
476
517
  serializedTransaction,
@@ -569,8 +610,8 @@ export async function broadcastOpenTransaction(parameters: {
569
610
  reason: 'open transaction does not match claimed channelId',
570
611
  })
571
612
 
572
- const resolvedFeeToken =
573
- transaction.feeToken ?? defaults.currency[client.chain?.id as keyof typeof defaults.currency]
613
+ const defaultFeeToken = defaults.currency[client.chain?.id as keyof typeof defaults.currency]
614
+ const resolvedFeeToken = transaction.feeToken ?? defaultFeeToken
574
615
 
575
616
  const pendingOnChain = {
576
617
  finalized: false,
@@ -594,10 +635,10 @@ export async function broadcastOpenTransaction(parameters: {
594
635
 
595
636
  const sponsored = FeePayer.prepareSponsoredTransaction({
596
637
  account: feePayer,
638
+ allowedFeeTokens: defaultFeeToken ? [defaultFeeToken] : undefined,
597
639
  challengeExpires,
598
640
  chainId: client.chain!.id,
599
641
  details: { channelId, currency, recipient },
600
- expectedFeeToken: defaults.currency[client.chain?.id as keyof typeof defaults.currency],
601
642
  policy: feePayerPolicy,
602
643
  transaction: {
603
644
  ...transaction,
@@ -660,19 +701,9 @@ export async function broadcastOpenTransaction(parameters: {
660
701
  return { txHash, onChain }
661
702
  }
662
703
 
663
- export async function broadcastTopUpTransaction(parameters: {
664
- client: Client
665
- serializedTransaction: Hex
666
- escrowContract: Address
667
- channelId: Hex
668
- currency: Address
669
- declaredDeposit: bigint
670
- previousDeposit: bigint
671
- challengeExpires?: string | undefined
672
- feePayerPolicy?: Partial<FeePayer.Policy> | undefined
673
- feePayer?: Account | undefined
674
- isSponsored?: boolean | undefined
675
- }): Promise<{ txHash: Hex; newDeposit: bigint }> {
704
+ export async function broadcastTopUpTransaction(
705
+ parameters: BroadcastTopUpTransactionParameters,
706
+ ): Promise<BroadcastTopUpTransactionResult> {
676
707
  const {
677
708
  client,
678
709
  serializedTransaction,
@@ -743,9 +774,10 @@ export async function broadcastTopUpTransaction(parameters: {
743
774
  reason: 'transaction does not contain a valid escrow topUp call',
744
775
  })
745
776
 
746
- const expectedFeeToken = defaults.currency[client.chain?.id as keyof typeof defaults.currency]
777
+ const defaultFeeToken = defaults.currency[client.chain?.id as keyof typeof defaults.currency]
747
778
  const sponsored = FeePayer.prepareSponsoredTransaction({
748
779
  account: feePayer,
780
+ allowedFeeTokens: defaultFeeToken ? [defaultFeeToken] : undefined,
749
781
  challengeExpires,
750
782
  chainId: client.chain!.id,
751
783
  details: {
@@ -753,12 +785,11 @@ export async function broadcastTopUpTransaction(parameters: {
753
785
  channelId,
754
786
  currency,
755
787
  },
756
- expectedFeeToken,
757
788
  policy: feePayerPolicy,
758
789
  transaction: {
759
790
  ...transaction,
760
- ...((transaction.feeToken ?? expectedFeeToken)
761
- ? { feeToken: transaction.feeToken ?? expectedFeeToken }
791
+ ...((transaction.feeToken ?? defaultFeeToken)
792
+ ? { feeToken: transaction.feeToken ?? defaultFeeToken }
762
793
  : {}),
763
794
  },
764
795
  })
@@ -30,6 +30,7 @@ export function computeId(parameters: computeId.Parameters): Hex.Hex {
30
30
  return Hash.keccak256(encoded)
31
31
  }
32
32
 
33
+ /** Type helpers for {@link computeId}. */
33
34
  export declare namespace computeId {
34
35
  type Parameters = {
35
36
  /** Address authorized to sign vouchers on behalf of the payer. */
@@ -0,0 +1,58 @@
1
+ import type { Address, Hex } from 'viem'
2
+ import { describe, expect, test } from 'vp/test'
3
+
4
+ import * as Store from '../../../Store.js'
5
+ import { chainId, escrowContract as escrowContractDefaults } from '../../internal/defaults.js'
6
+ import * as ChannelStore from './ChannelStore.js'
7
+
8
+ const channelId = '0x0000000000000000000000000000000000000000000000000000000000000001' as Hex
9
+
10
+ function legacyChannel(
11
+ overrides: Partial<ChannelStore.LegacyState> = {},
12
+ ): ChannelStore.LegacyState {
13
+ return {
14
+ channelId,
15
+ payer: '0x0000000000000000000000000000000000000001' as Address,
16
+ payee: '0x0000000000000000000000000000000000000002' as Address,
17
+ token: '0x0000000000000000000000000000000000000003' as Address,
18
+ authorizedSigner: '0x0000000000000000000000000000000000000004' as Address,
19
+ chainId: 42431,
20
+ escrowContract: escrowContractDefaults[chainId.testnet] as Address,
21
+ deposit: 10_000_000n,
22
+ settledOnChain: 0n,
23
+ highestVoucherAmount: 10_000_000n,
24
+ highestVoucher: null,
25
+ spent: 0n,
26
+ units: 0,
27
+ closeRequestedAt: 0n,
28
+ finalized: false,
29
+ createdAt: '2025-01-01T00:00:00.000Z',
30
+ ...overrides,
31
+ }
32
+ }
33
+
34
+ describe('legacy ChannelStore', () => {
35
+ test('keeps existing contract-backed channels compatible when backend fields are absent', async () => {
36
+ const store = ChannelStore.fromStore(Store.memory())
37
+ await store.updateChannel(channelId, () => legacyChannel())
38
+
39
+ const loaded = await store.getChannel(channelId)
40
+ expect(loaded).not.toBeNull()
41
+ expect(ChannelStore.isContractState(loaded!)).toBe(true)
42
+ expect(loaded!.backend).toBeUndefined()
43
+ expect('operator' in loaded!).toBe(false)
44
+ expect('salt' in loaded!).toBe(false)
45
+ expect('expiringNonceHash' in loaded!).toBe(false)
46
+ expect('descriptor' in loaded!).toBe(false)
47
+ })
48
+
49
+ test('supports explicit contract-backed channel state', async () => {
50
+ const store = ChannelStore.fromStore(Store.memory())
51
+ await store.updateChannel(channelId, () => legacyChannel({ backend: 'contract' }))
52
+
53
+ const loaded = await store.getChannel(channelId)
54
+ expect(loaded).not.toBeNull()
55
+ expect(ChannelStore.isContractState(loaded!)).toBe(true)
56
+ expect(loaded!.backend).toBe('contract')
57
+ })
58
+ })
@@ -0,0 +1,39 @@
1
+ /**
2
+ * Legacy contract-backed session channel-store facade.
3
+ *
4
+ * Legacy code imports channel-store types and helpers from this module so the
5
+ * contract-backed backend stays rooted under `tempo/legacy`. The underlying
6
+ * store adapter is shared with the TIP-1034 implementation because both
7
+ * backends persist the same accounting counters.
8
+ */
9
+ import type * as SharedChannelStore from '../../session/server/ChannelStore.js'
10
+
11
+ export {
12
+ deductFromChannel,
13
+ fromStore,
14
+ normalizeChannelId,
15
+ type BackendState,
16
+ type BaseState,
17
+ type ChannelStore,
18
+ type DeductResult,
19
+ type State,
20
+ } from '../../session/server/ChannelStore.js'
21
+
22
+ /** State for a legacy smart-contract-backed payment channel. */
23
+ export interface LegacyContractBackendState {
24
+ /** Channel backend. Omitted for existing legacy records. */
25
+ backend?: 'contract' | undefined
26
+ }
27
+
28
+ /** @deprecated Use {@link LegacyContractBackendState}. */
29
+ export type ContractBackendState = LegacyContractBackendState
30
+
31
+ /** Legacy contract-backed channel state persisted by `tempo.sessionLegacy`. */
32
+ export type LegacyState = SharedChannelStore.BaseState & LegacyContractBackendState
33
+
34
+ /** Returns whether a channel is backed by the legacy smart contract escrow. */
35
+ export function isContractState(
36
+ state: SharedChannelStore.State,
37
+ ): state is SharedChannelStore.BaseState & LegacyContractBackendState {
38
+ return state.backend === undefined || state.backend === 'contract'
39
+ }