mppx 0.6.31 → 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 (477) hide show
  1. package/CHANGELOG.md +17 -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/Response.d.ts.map +1 -1
  62. package/dist/server/Response.js +2 -1
  63. package/dist/server/Response.js.map +1 -1
  64. package/dist/server/Transport.d.ts.map +1 -1
  65. package/dist/server/Transport.js +4 -3
  66. package/dist/server/Transport.js.map +1 -1
  67. package/dist/server/index.d.ts +1 -0
  68. package/dist/server/index.d.ts.map +1 -1
  69. package/dist/server/index.js +1 -0
  70. package/dist/server/index.js.map +1 -1
  71. package/dist/stripe/client/Charge.d.ts +1 -1
  72. package/dist/stripe/client/Charge.d.ts.map +1 -1
  73. package/dist/stripe/client/Charge.js +3 -1
  74. package/dist/stripe/client/Charge.js.map +1 -1
  75. package/dist/stripe/server/Charge.d.ts +1 -1
  76. package/dist/stripe/server/Charge.d.ts.map +1 -1
  77. package/dist/stripe/server/Charge.js +9 -2
  78. package/dist/stripe/server/Charge.js.map +1 -1
  79. package/dist/stripe/server/Methods.d.ts +1 -1
  80. package/dist/stripe/server/Methods.d.ts.map +1 -1
  81. package/dist/stripe/server/internal/html.gen.d.ts +1 -1
  82. package/dist/stripe/server/internal/html.gen.d.ts.map +1 -1
  83. package/dist/stripe/server/internal/html.gen.js +1 -1
  84. package/dist/stripe/server/internal/html.gen.js.map +1 -1
  85. package/dist/tempo/Methods.d.ts +18 -0
  86. package/dist/tempo/Methods.d.ts.map +1 -1
  87. package/dist/tempo/Methods.js +16 -1
  88. package/dist/tempo/Methods.js.map +1 -1
  89. package/dist/tempo/client/Charge.d.ts +6 -0
  90. package/dist/tempo/client/Charge.d.ts.map +1 -1
  91. package/dist/tempo/client/Charge.js +9 -2
  92. package/dist/tempo/client/Charge.js.map +1 -1
  93. package/dist/tempo/client/Methods.d.ts +36 -7
  94. package/dist/tempo/client/Methods.d.ts.map +1 -1
  95. package/dist/tempo/client/Methods.js +12 -5
  96. package/dist/tempo/client/Methods.js.map +1 -1
  97. package/dist/tempo/client/index.d.ts +7 -4
  98. package/dist/tempo/client/index.d.ts.map +1 -1
  99. package/dist/tempo/client/index.js +5 -3
  100. package/dist/tempo/client/index.js.map +1 -1
  101. package/dist/tempo/index.d.ts +1 -0
  102. package/dist/tempo/index.d.ts.map +1 -1
  103. package/dist/tempo/index.js +1 -0
  104. package/dist/tempo/index.js.map +1 -1
  105. package/dist/tempo/internal/fee-payer.d.ts +21 -1
  106. package/dist/tempo/internal/fee-payer.d.ts.map +1 -1
  107. package/dist/tempo/internal/fee-payer.js +109 -4
  108. package/dist/tempo/internal/fee-payer.js.map +1 -1
  109. package/dist/tempo/{client → legacy/client}/ChannelOps.d.ts +19 -6
  110. package/dist/tempo/legacy/client/ChannelOps.d.ts.map +1 -0
  111. package/dist/tempo/{client → legacy/client}/ChannelOps.js +9 -3
  112. package/dist/tempo/legacy/client/ChannelOps.js.map +1 -0
  113. package/dist/tempo/{client → legacy/client}/Session.d.ts +23 -4
  114. package/dist/tempo/legacy/client/Session.d.ts.map +1 -0
  115. package/dist/tempo/{client → legacy/client}/Session.js +14 -7
  116. package/dist/tempo/legacy/client/Session.js.map +1 -0
  117. package/dist/tempo/{client → legacy/client}/SessionManager.d.ts +20 -5
  118. package/dist/tempo/legacy/client/SessionManager.d.ts.map +1 -0
  119. package/dist/tempo/{client → legacy/client}/SessionManager.js +20 -16
  120. package/dist/tempo/legacy/client/SessionManager.js.map +1 -0
  121. package/dist/tempo/legacy/client/index.d.ts +7 -0
  122. package/dist/tempo/legacy/client/index.d.ts.map +1 -0
  123. package/dist/tempo/legacy/client/index.js +5 -0
  124. package/dist/tempo/legacy/client/index.js.map +1 -0
  125. package/dist/tempo/legacy/index.d.ts +7 -0
  126. package/dist/tempo/legacy/index.d.ts.map +1 -0
  127. package/dist/tempo/legacy/index.js +7 -0
  128. package/dist/tempo/legacy/index.js.map +1 -0
  129. package/dist/tempo/{server → legacy/server}/Session.d.ts +28 -11
  130. package/dist/tempo/legacy/server/Session.d.ts.map +1 -0
  131. package/dist/tempo/{server → legacy/server}/Session.js +12 -10
  132. package/dist/tempo/legacy/server/Session.js.map +1 -0
  133. package/dist/tempo/legacy/server/index.d.ts +5 -0
  134. package/dist/tempo/legacy/server/index.d.ts.map +1 -0
  135. package/dist/tempo/legacy/server/index.js +5 -0
  136. package/dist/tempo/legacy/server/index.js.map +1 -0
  137. package/dist/tempo/{session → legacy/session}/Chain.d.ts +30 -23
  138. package/dist/tempo/legacy/session/Chain.d.ts.map +1 -0
  139. package/dist/tempo/{session → legacy/session}/Chain.js +12 -11
  140. package/dist/tempo/legacy/session/Chain.js.map +1 -0
  141. package/dist/tempo/{session → legacy/session}/Channel.d.ts +1 -0
  142. package/dist/tempo/legacy/session/Channel.d.ts.map +1 -0
  143. package/dist/tempo/legacy/session/Channel.js.map +1 -0
  144. package/dist/tempo/legacy/session/ChannelStore.d.ts +22 -0
  145. package/dist/tempo/legacy/session/ChannelStore.d.ts.map +1 -0
  146. package/dist/tempo/legacy/session/ChannelStore.js +6 -0
  147. package/dist/tempo/legacy/session/ChannelStore.js.map +1 -0
  148. package/dist/tempo/legacy/session/Types.d.ts +73 -0
  149. package/dist/tempo/legacy/session/Types.d.ts.map +1 -0
  150. package/dist/tempo/legacy/session/Types.js.map +1 -0
  151. package/dist/tempo/{session → legacy/session}/Voucher.d.ts +4 -4
  152. package/dist/tempo/legacy/session/Voucher.d.ts.map +1 -0
  153. package/dist/tempo/{session → legacy/session}/Voucher.js +1 -1
  154. package/dist/tempo/legacy/session/Voucher.js.map +1 -0
  155. package/dist/tempo/{session → legacy/session}/escrow.abi.d.ts +1 -0
  156. package/dist/tempo/{session → legacy/session}/escrow.abi.d.ts.map +1 -1
  157. package/dist/tempo/{session → legacy/session}/escrow.abi.js +1 -0
  158. package/dist/tempo/legacy/session/escrow.abi.js.map +1 -0
  159. package/dist/tempo/legacy/session/index.d.ts +9 -0
  160. package/dist/tempo/legacy/session/index.d.ts.map +1 -0
  161. package/dist/tempo/legacy/session/index.js +9 -0
  162. package/dist/tempo/legacy/session/index.js.map +1 -0
  163. package/dist/tempo/server/Charge.d.ts +1 -1
  164. package/dist/tempo/server/Charge.d.ts.map +1 -1
  165. package/dist/tempo/server/Charge.js +13 -16
  166. package/dist/tempo/server/Charge.js.map +1 -1
  167. package/dist/tempo/server/Methods.d.ts +63 -6
  168. package/dist/tempo/server/Methods.d.ts.map +1 -1
  169. package/dist/tempo/server/Methods.js +36 -8
  170. package/dist/tempo/server/Methods.js.map +1 -1
  171. package/dist/tempo/server/Subscription.d.ts +1 -1
  172. package/dist/tempo/server/Subscription.d.ts.map +1 -1
  173. package/dist/tempo/server/index.d.ts +6 -5
  174. package/dist/tempo/server/index.d.ts.map +1 -1
  175. package/dist/tempo/server/index.js +5 -5
  176. package/dist/tempo/server/index.js.map +1 -1
  177. package/dist/tempo/server/internal/html.gen.d.ts +1 -1
  178. package/dist/tempo/server/internal/html.gen.d.ts.map +1 -1
  179. package/dist/tempo/server/internal/html.gen.js +1 -1
  180. package/dist/tempo/server/internal/html.gen.js.map +1 -1
  181. package/dist/tempo/server/internal/request-body.d.ts +7 -2
  182. package/dist/tempo/server/internal/request-body.d.ts.map +1 -1
  183. package/dist/tempo/server/internal/request-body.js +20 -3
  184. package/dist/tempo/server/internal/request-body.js.map +1 -1
  185. package/dist/tempo/server/internal/transport.d.ts +8 -4
  186. package/dist/tempo/server/internal/transport.d.ts.map +1 -1
  187. package/dist/tempo/server/internal/transport.js +8 -7
  188. package/dist/tempo/server/internal/transport.js.map +1 -1
  189. package/dist/tempo/session/Snapshot.d.ts +32 -0
  190. package/dist/tempo/session/Snapshot.d.ts.map +1 -0
  191. package/dist/tempo/session/Snapshot.js +37 -0
  192. package/dist/tempo/session/Snapshot.js.map +1 -0
  193. package/dist/tempo/session/client/ChannelOps.d.ts +82 -0
  194. package/dist/tempo/session/client/ChannelOps.d.ts.map +1 -0
  195. package/dist/tempo/session/client/ChannelOps.js +204 -0
  196. package/dist/tempo/session/client/ChannelOps.js.map +1 -0
  197. package/dist/tempo/session/client/CredentialState.d.ts +262 -0
  198. package/dist/tempo/session/client/CredentialState.d.ts.map +1 -0
  199. package/dist/tempo/session/client/CredentialState.js +417 -0
  200. package/dist/tempo/session/client/CredentialState.js.map +1 -0
  201. package/dist/tempo/session/client/ReceiptCoordinator.d.ts +26 -0
  202. package/dist/tempo/session/client/ReceiptCoordinator.d.ts.map +1 -0
  203. package/dist/tempo/session/client/ReceiptCoordinator.js +61 -0
  204. package/dist/tempo/session/client/ReceiptCoordinator.js.map +1 -0
  205. package/dist/tempo/session/client/Runtime.d.ts +464 -0
  206. package/dist/tempo/session/client/Runtime.d.ts.map +1 -0
  207. package/dist/tempo/session/client/Runtime.js +499 -0
  208. package/dist/tempo/session/client/Runtime.js.map +1 -0
  209. package/dist/tempo/session/client/Session.d.ts +132 -0
  210. package/dist/tempo/session/client/Session.d.ts.map +1 -0
  211. package/dist/tempo/session/client/Session.js +55 -0
  212. package/dist/tempo/session/client/Session.js.map +1 -0
  213. package/dist/tempo/session/client/SessionManager.d.ts +120 -0
  214. package/dist/tempo/session/client/SessionManager.d.ts.map +1 -0
  215. package/dist/tempo/session/client/SessionManager.js +627 -0
  216. package/dist/tempo/session/client/SessionManager.js.map +1 -0
  217. package/dist/tempo/session/client/Transports.d.ts +449 -0
  218. package/dist/tempo/session/client/Transports.d.ts.map +1 -0
  219. package/dist/tempo/session/client/Transports.js +721 -0
  220. package/dist/tempo/session/client/Transports.js.map +1 -0
  221. package/dist/tempo/session/client/index.d.ts +12 -0
  222. package/dist/tempo/session/client/index.d.ts.map +1 -0
  223. package/dist/tempo/session/client/index.js +5 -0
  224. package/dist/tempo/session/client/index.js.map +1 -0
  225. package/dist/tempo/session/index.d.ts +7 -8
  226. package/dist/tempo/session/index.d.ts.map +1 -1
  227. package/dist/tempo/session/index.js +7 -8
  228. package/dist/tempo/session/index.js.map +1 -1
  229. package/dist/tempo/session/precompile/Chain.d.ts +319 -0
  230. package/dist/tempo/session/precompile/Chain.d.ts.map +1 -0
  231. package/dist/tempo/session/precompile/Chain.js +492 -0
  232. package/dist/tempo/session/precompile/Chain.js.map +1 -0
  233. package/dist/tempo/session/precompile/Channel.d.ts +46 -0
  234. package/dist/tempo/session/precompile/Channel.d.ts.map +1 -0
  235. package/dist/tempo/session/precompile/Channel.js +56 -0
  236. package/dist/tempo/session/precompile/Channel.js.map +1 -0
  237. package/dist/tempo/session/precompile/Protocol.d.ts +308 -0
  238. package/dist/tempo/session/precompile/Protocol.d.ts.map +1 -0
  239. package/dist/tempo/session/precompile/Protocol.js +264 -0
  240. package/dist/tempo/session/precompile/Protocol.js.map +1 -0
  241. package/dist/tempo/session/precompile/Voucher.d.ts +40 -0
  242. package/dist/tempo/session/precompile/Voucher.d.ts.map +1 -0
  243. package/dist/tempo/session/precompile/Voucher.js +126 -0
  244. package/dist/tempo/session/precompile/Voucher.js.map +1 -0
  245. package/dist/tempo/session/precompile/escrow.abi.d.ts +522 -0
  246. package/dist/tempo/session/precompile/escrow.abi.d.ts.map +1 -0
  247. package/dist/tempo/session/precompile/escrow.abi.js +224 -0
  248. package/dist/tempo/session/precompile/escrow.abi.js.map +1 -0
  249. package/dist/tempo/session/precompile/index.d.ts +24 -0
  250. package/dist/tempo/session/precompile/index.d.ts.map +1 -0
  251. package/dist/tempo/session/precompile/index.js +22 -0
  252. package/dist/tempo/session/precompile/index.js.map +1 -0
  253. package/dist/tempo/session/server/ChannelOps.d.ts +56 -0
  254. package/dist/tempo/session/server/ChannelOps.d.ts.map +1 -0
  255. package/dist/tempo/session/server/ChannelOps.js +91 -0
  256. package/dist/tempo/session/server/ChannelOps.js.map +1 -0
  257. package/dist/tempo/session/server/ChannelStore.d.ts +347 -0
  258. package/dist/tempo/session/server/ChannelStore.d.ts.map +1 -0
  259. package/dist/tempo/session/server/ChannelStore.js +404 -0
  260. package/dist/tempo/session/server/ChannelStore.js.map +1 -0
  261. package/dist/tempo/session/server/CredentialVerification.d.ts +85 -0
  262. package/dist/tempo/session/server/CredentialVerification.d.ts.map +1 -0
  263. package/dist/tempo/session/server/CredentialVerification.js +494 -0
  264. package/dist/tempo/session/server/CredentialVerification.js.map +1 -0
  265. package/dist/tempo/session/server/MeteredStream.d.ts +40 -0
  266. package/dist/tempo/session/server/MeteredStream.d.ts.map +1 -0
  267. package/dist/tempo/session/server/MeteredStream.js +42 -0
  268. package/dist/tempo/session/server/MeteredStream.js.map +1 -0
  269. package/dist/tempo/session/server/RequestState.d.ts +208 -0
  270. package/dist/tempo/session/server/RequestState.d.ts.map +1 -0
  271. package/dist/tempo/session/server/RequestState.js +252 -0
  272. package/dist/tempo/session/server/RequestState.js.map +1 -0
  273. package/dist/tempo/session/server/Session.d.ts +169 -0
  274. package/dist/tempo/session/server/Session.d.ts.map +1 -0
  275. package/dist/tempo/session/server/Session.js +351 -0
  276. package/dist/tempo/session/server/Session.js.map +1 -0
  277. package/dist/tempo/session/server/Settlement.d.ts +185 -0
  278. package/dist/tempo/session/server/Settlement.d.ts.map +1 -0
  279. package/dist/tempo/session/server/Settlement.js +250 -0
  280. package/dist/tempo/session/server/Settlement.js.map +1 -0
  281. package/dist/tempo/session/{Sse.d.ts → server/Sse.d.ts} +9 -56
  282. package/dist/tempo/session/server/Sse.d.ts.map +1 -0
  283. package/dist/tempo/session/server/Sse.js +184 -0
  284. package/dist/tempo/session/server/Sse.js.map +1 -0
  285. package/dist/tempo/session/server/Transports.d.ts +89 -0
  286. package/dist/tempo/session/server/Transports.d.ts.map +1 -0
  287. package/dist/tempo/session/server/Transports.js +149 -0
  288. package/dist/tempo/session/server/Transports.js.map +1 -0
  289. package/dist/tempo/session/server/Ws.d.ts +48 -0
  290. package/dist/tempo/session/server/Ws.d.ts.map +1 -0
  291. package/dist/tempo/session/server/Ws.js +244 -0
  292. package/dist/tempo/session/server/Ws.js.map +1 -0
  293. package/dist/tempo/session/server/index.d.ts +4 -0
  294. package/dist/tempo/session/server/index.d.ts.map +1 -0
  295. package/dist/tempo/session/server/index.js +2 -0
  296. package/dist/tempo/session/server/index.js.map +1 -0
  297. package/package.json +6 -1
  298. package/src/Challenge.ts +9 -7
  299. package/src/Constants.ts +58 -0
  300. package/src/Credential.ts +5 -4
  301. package/src/Method.ts +46 -5
  302. package/src/Receipt.ts +3 -2
  303. package/src/cli/cli.test.ts +23 -28
  304. package/src/cli/cli.ts +23 -10
  305. package/src/cli/mcp.test.ts +21 -7
  306. package/src/cli/plugins/tempo.ts +21 -8
  307. package/src/cli/utils.test.ts +25 -1
  308. package/src/cli/utils.ts +10 -0
  309. package/src/client/Methods.ts +5 -2
  310. package/src/client/Mppx.test-d.ts +10 -0
  311. package/src/client/Mppx.test.ts +75 -0
  312. package/src/client/Transport.ts +4 -5
  313. package/src/client/index.ts +11 -1
  314. package/src/client/internal/Fetch.test.ts +29 -4
  315. package/src/client/internal/Fetch.ts +17 -5
  316. package/src/env.d.ts +1 -1
  317. package/src/index.ts +1 -0
  318. package/src/internal/AcceptPayment.test.ts +61 -0
  319. package/src/internal/AcceptPayment.ts +21 -14
  320. package/src/mcp-sdk/client/McpClient.integration.test.ts +8 -7
  321. package/src/mcp-sdk/client/McpClient.test-d.ts +7 -0
  322. package/src/mcp-sdk/client/McpClient.ts +99 -67
  323. package/src/mcp-sdk/client/McpClient.unit.test.ts +131 -0
  324. package/src/middlewares/elysia.test.ts +8 -4
  325. package/src/middlewares/express.test.ts +8 -4
  326. package/src/middlewares/hono.test.ts +4 -4
  327. package/src/middlewares/nextjs.test.ts +8 -4
  328. package/src/proxy/Proxy.test.ts +8 -8
  329. package/src/server/Mppx.test-d.ts +54 -0
  330. package/src/server/Mppx.test.ts +200 -7
  331. package/src/server/Mppx.ts +487 -406
  332. package/src/server/Response.ts +2 -1
  333. package/src/server/Transport.ts +4 -3
  334. package/src/server/index.ts +1 -0
  335. package/src/stripe/client/Charge.test.ts +20 -5
  336. package/src/stripe/client/Charge.ts +6 -2
  337. package/src/stripe/server/Charge.test.ts +114 -1
  338. package/src/stripe/server/Charge.ts +13 -2
  339. package/src/stripe/server/internal/html.gen.ts +1 -1
  340. package/src/tempo/AccessKeyAuthorization.test.ts +4 -94
  341. package/src/tempo/Methods.test.ts +45 -17
  342. package/src/tempo/Methods.ts +22 -0
  343. package/src/tempo/PublicExports.test-d.ts +105 -0
  344. package/src/tempo/client/Charge.test.ts +85 -0
  345. package/src/tempo/client/Charge.ts +19 -2
  346. package/src/tempo/client/Methods.ts +18 -6
  347. package/src/tempo/client/index.ts +15 -4
  348. package/src/tempo/index.ts +1 -0
  349. package/src/tempo/internal/fee-payer.test.ts +241 -17
  350. package/src/tempo/internal/fee-payer.ts +150 -4
  351. package/src/tempo/internal/fee-token.test.ts +14 -9
  352. package/src/tempo/legacy/AccessKeyAuthorization.test.ts +162 -0
  353. package/src/tempo/legacy/README.md +9 -0
  354. package/src/tempo/{client → legacy/client}/ChannelOps.test.ts +6 -7
  355. package/src/tempo/{client → legacy/client}/ChannelOps.ts +22 -9
  356. package/src/tempo/{client → legacy/client}/Session.test.ts +51 -9
  357. package/src/tempo/{client → legacy/client}/Session.ts +25 -11
  358. package/src/tempo/{client → legacy/client}/SessionManager.test.ts +81 -9
  359. package/src/tempo/{client → legacy/client}/SessionManager.ts +41 -20
  360. package/src/tempo/legacy/client/index.ts +6 -0
  361. package/src/tempo/legacy/index.ts +6 -0
  362. package/src/tempo/{server → legacy/server}/Session.test.ts +45 -45
  363. package/src/tempo/{server → legacy/server}/Session.ts +32 -23
  364. package/src/tempo/legacy/server/index.ts +4 -0
  365. package/src/tempo/{session → legacy/session}/Chain.test.ts +3 -4
  366. package/src/tempo/{session → legacy/session}/Chain.ts +94 -63
  367. package/src/tempo/{session → legacy/session}/Channel.ts +1 -0
  368. package/src/tempo/legacy/session/ChannelStore.test.ts +58 -0
  369. package/src/tempo/legacy/session/ChannelStore.ts +39 -0
  370. package/src/tempo/legacy/session/Types.ts +91 -0
  371. package/src/tempo/{session → legacy/session}/Voucher.ts +12 -8
  372. package/src/tempo/{session → legacy/session}/escrow.abi.ts +1 -0
  373. package/src/tempo/legacy/session/index.ts +8 -0
  374. package/src/tempo/server/AtomicStore.test-d.ts +16 -11
  375. package/src/tempo/server/Charge.test.ts +92 -14
  376. package/src/tempo/server/Charge.ts +18 -16
  377. package/src/tempo/server/Methods.ts +54 -8
  378. package/src/tempo/server/Sse.test.ts +2 -2
  379. package/src/tempo/server/index.ts +6 -5
  380. package/src/tempo/server/internal/html.gen.ts +1 -1
  381. package/src/tempo/server/internal/request-body.test.ts +37 -4
  382. package/src/tempo/server/internal/request-body.ts +25 -6
  383. package/src/tempo/server/internal/transport.test.ts +4 -4
  384. package/src/tempo/server/internal/transport.ts +19 -10
  385. package/src/tempo/session/Snapshot.test.ts +41 -0
  386. package/src/tempo/session/Snapshot.ts +74 -0
  387. package/src/tempo/session/client/ChannelOps.test.ts +163 -0
  388. package/src/tempo/session/client/ChannelOps.ts +344 -0
  389. package/src/tempo/session/client/CredentialState.test.ts +645 -0
  390. package/src/tempo/session/client/CredentialState.ts +814 -0
  391. package/src/tempo/session/client/ReceiptCoordinator.ts +95 -0
  392. package/src/tempo/session/client/Runtime.test.ts +1092 -0
  393. package/src/tempo/session/client/Runtime.ts +986 -0
  394. package/src/tempo/session/client/Session.test.ts +734 -0
  395. package/src/tempo/session/client/Session.ts +97 -0
  396. package/src/tempo/session/client/SessionManager.test.ts +1308 -0
  397. package/src/tempo/session/client/SessionManager.ts +845 -0
  398. package/src/tempo/session/client/Transports.test.ts +837 -0
  399. package/src/tempo/session/client/Transports.ts +1292 -0
  400. package/src/tempo/session/client/index.ts +37 -0
  401. package/src/tempo/session/index.ts +7 -8
  402. package/src/tempo/session/precompile/Chain.integration.test.ts +321 -0
  403. package/src/tempo/session/precompile/Chain.test.ts +1258 -0
  404. package/src/tempo/session/precompile/Chain.ts +979 -0
  405. package/src/tempo/session/precompile/Channel.test.ts +138 -0
  406. package/src/tempo/session/precompile/Channel.ts +103 -0
  407. package/src/tempo/session/precompile/Protocol.test.ts +358 -0
  408. package/src/tempo/session/precompile/Protocol.ts +520 -0
  409. package/src/tempo/session/precompile/Voucher.test.ts +316 -0
  410. package/src/tempo/session/precompile/Voucher.ts +160 -0
  411. package/src/tempo/session/precompile/escrow.abi.ts +226 -0
  412. package/src/tempo/session/precompile/index.ts +33 -0
  413. package/src/tempo/session/server/ChannelOps.test.ts +129 -0
  414. package/src/tempo/session/server/ChannelOps.ts +157 -0
  415. package/src/tempo/session/{ChannelStore.test.ts → server/ChannelStore.test.ts} +536 -29
  416. package/src/tempo/session/server/ChannelStore.ts +835 -0
  417. package/src/tempo/session/server/CredentialVerification.test.ts +146 -0
  418. package/src/tempo/session/server/CredentialVerification.ts +710 -0
  419. package/src/tempo/session/server/MeteredStream.ts +88 -0
  420. package/src/tempo/session/server/RequestState.test.ts +531 -0
  421. package/src/tempo/session/server/RequestState.ts +499 -0
  422. package/src/tempo/session/server/Session.integration.test.ts +444 -0
  423. package/src/tempo/session/server/Session.test.ts +3253 -0
  424. package/src/tempo/session/server/Session.ts +543 -0
  425. package/src/tempo/session/server/Settlement.test.ts +242 -0
  426. package/src/tempo/session/server/Settlement.ts +470 -0
  427. package/src/tempo/session/{Sse.test.ts → server/Sse.test.ts} +37 -3
  428. package/src/tempo/session/server/Sse.ts +256 -0
  429. package/src/tempo/session/server/Transports.test.ts +346 -0
  430. package/src/tempo/session/server/Transports.ts +255 -0
  431. package/src/tempo/session/{Ws.test.ts → server/Ws.test.ts} +4 -4
  432. package/src/tempo/session/server/Ws.ts +384 -0
  433. package/src/tempo/session/server/index.ts +8 -0
  434. package/dist/tempo/client/ChannelOps.d.ts.map +0 -1
  435. package/dist/tempo/client/ChannelOps.js.map +0 -1
  436. package/dist/tempo/client/Session.d.ts.map +0 -1
  437. package/dist/tempo/client/Session.js.map +0 -1
  438. package/dist/tempo/client/SessionManager.d.ts.map +0 -1
  439. package/dist/tempo/client/SessionManager.js.map +0 -1
  440. package/dist/tempo/server/Session.d.ts.map +0 -1
  441. package/dist/tempo/server/Session.js.map +0 -1
  442. package/dist/tempo/session/Chain.d.ts.map +0 -1
  443. package/dist/tempo/session/Chain.js.map +0 -1
  444. package/dist/tempo/session/Channel.d.ts.map +0 -1
  445. package/dist/tempo/session/Channel.js.map +0 -1
  446. package/dist/tempo/session/ChannelStore.d.ts +0 -117
  447. package/dist/tempo/session/ChannelStore.d.ts.map +0 -1
  448. package/dist/tempo/session/ChannelStore.js +0 -172
  449. package/dist/tempo/session/ChannelStore.js.map +0 -1
  450. package/dist/tempo/session/Receipt.d.ts +0 -22
  451. package/dist/tempo/session/Receipt.d.ts.map +0 -1
  452. package/dist/tempo/session/Receipt.js +0 -34
  453. package/dist/tempo/session/Receipt.js.map +0 -1
  454. package/dist/tempo/session/Sse.d.ts.map +0 -1
  455. package/dist/tempo/session/Sse.js +0 -363
  456. package/dist/tempo/session/Sse.js.map +0 -1
  457. package/dist/tempo/session/Types.d.ts +0 -78
  458. package/dist/tempo/session/Types.d.ts.map +0 -1
  459. package/dist/tempo/session/Types.js.map +0 -1
  460. package/dist/tempo/session/Voucher.d.ts.map +0 -1
  461. package/dist/tempo/session/Voucher.js.map +0 -1
  462. package/dist/tempo/session/Ws.d.ts +0 -87
  463. package/dist/tempo/session/Ws.d.ts.map +0 -1
  464. package/dist/tempo/session/Ws.js +0 -443
  465. package/dist/tempo/session/Ws.js.map +0 -1
  466. package/dist/tempo/session/escrow.abi.js.map +0 -1
  467. package/src/tempo/session/ChannelStore.ts +0 -308
  468. package/src/tempo/session/Receipt.test.ts +0 -89
  469. package/src/tempo/session/Receipt.ts +0 -46
  470. package/src/tempo/session/Sse.ts +0 -462
  471. package/src/tempo/session/Types.ts +0 -86
  472. package/src/tempo/session/Ws.ts +0 -576
  473. /package/dist/tempo/{session → legacy/session}/Channel.js +0 -0
  474. /package/dist/tempo/{session → legacy/session}/Types.js +0 -0
  475. /package/src/tempo/{session → legacy/session}/Channel.test.ts +0 -0
  476. /package/src/tempo/{session → legacy/session}/Voucher.test.ts +0 -0
  477. /package/src/tempo/session/{Sse.fuzz.test.ts → server/Sse.fuzz.test.ts} +0 -0
@@ -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
+ }
@@ -0,0 +1,91 @@
1
+ import type { Address, Hex } from 'viem'
2
+
3
+ import type { SessionSignedVoucher, SessionVoucher } from '../../session/precompile/Protocol.js'
4
+
5
+ /**
6
+ * Legacy credential payload that opens a smart-contract-backed channel and authorizes initial spend.
7
+ */
8
+ export type LegacyOpenCredentialPayload = {
9
+ action: 'open'
10
+ type: 'transaction'
11
+ /** Session channel ID. */
12
+ channelId: Hex
13
+ /** Signed transaction containing the channel-open call. */
14
+ transaction: Hex
15
+ /** Voucher signature for `cumulativeAmount`. */
16
+ signature: Hex
17
+ /** Voucher signer selected for the opened channel. */
18
+ authorizedSigner?: Address | undefined
19
+ /** Initial cumulative spend authorized by the opening voucher, as raw units. */
20
+ cumulativeAmount: string
21
+ }
22
+
23
+ /** Legacy credential payload that adds deposit to an existing smart-contract-backed channel. */
24
+ export type LegacyTopUpCredentialPayload = {
25
+ action: 'topUp'
26
+ type: 'transaction'
27
+ /** Session channel ID being topped up. */
28
+ channelId: Hex
29
+ /** Signed transaction containing the channel top-up call. */
30
+ transaction: Hex
31
+ /** Additional deposit to add, as raw units. */
32
+ additionalDeposit: string
33
+ }
34
+
35
+ /** Legacy credential payload that increases cumulative spend authorization. */
36
+ export type LegacyVoucherCredentialPayload = {
37
+ action: 'voucher'
38
+ /** Session channel ID the voucher applies to. */
39
+ channelId: Hex
40
+ /** Highest cumulative spend authorized by this voucher, as raw units. */
41
+ cumulativeAmount: string
42
+ /** Voucher signature for `cumulativeAmount`. */
43
+ signature: Hex
44
+ }
45
+
46
+ /** Legacy credential payload that cooperatively closes a channel at final cumulative spend. */
47
+ export type LegacyCloseCredentialPayload = {
48
+ action: 'close'
49
+ /** Session channel ID being closed. */
50
+ channelId: Hex
51
+ /** Final cumulative spend authorized at close, as raw units. */
52
+ cumulativeAmount: string
53
+ /** Voucher signature for `cumulativeAmount`. */
54
+ signature: Hex
55
+ }
56
+
57
+ /**
58
+ * Legacy smart-contract-backed session credential payload.
59
+ */
60
+ export type LegacySessionCredentialPayload =
61
+ | LegacyOpenCredentialPayload
62
+ | LegacyTopUpCredentialPayload
63
+ | LegacyVoucherCredentialPayload
64
+ | LegacyCloseCredentialPayload
65
+
66
+ /** Legacy smart-contract-backed voucher for cumulative payment. */
67
+ export type LegacyVoucher = SessionVoucher
68
+
69
+ /** Legacy smart-contract-backed voucher with EIP-712 signature. */
70
+ export type LegacySignedVoucher = SessionSignedVoucher
71
+
72
+ /** @deprecated Use {@link LegacyVoucher}. */
73
+ export type Voucher = LegacyVoucher
74
+
75
+ /** @deprecated Use {@link LegacySignedVoucher}. */
76
+ export type SignedVoucher = LegacySignedVoucher
77
+
78
+ /** @deprecated Use {@link LegacyOpenCredentialPayload}. */
79
+ export type OpenCredentialPayload = LegacyOpenCredentialPayload
80
+
81
+ /** @deprecated Use {@link LegacyTopUpCredentialPayload}. */
82
+ export type TopUpCredentialPayload = LegacyTopUpCredentialPayload
83
+
84
+ /** @deprecated Use {@link LegacyVoucherCredentialPayload}. */
85
+ export type VoucherCredentialPayload = LegacyVoucherCredentialPayload
86
+
87
+ /** @deprecated Use {@link LegacyCloseCredentialPayload}. */
88
+ export type CloseCredentialPayload = LegacyCloseCredentialPayload
89
+
90
+ /** @deprecated Use {@link LegacySessionCredentialPayload}. */
91
+ export type SessionCredentialPayload = LegacySessionCredentialPayload
@@ -4,8 +4,8 @@ import type { Account, Client, Hex } from 'viem'
4
4
  import { hashTypedData } from 'viem'
5
5
  import { signTypedData } from 'viem/actions'
6
6
 
7
- import { getAccountSignerAddress, isAccessKeyAccount } from '../internal/account.js'
8
- import type { SignedVoucher, Voucher } from './Types.js'
7
+ import { getAccountSignerAddress, isAccessKeyAccount } from '../../internal/account.js'
8
+ import type { LegacySignedVoucher, LegacyVoucher } from './Types.js'
9
9
 
10
10
  /** Must match the on-chain TempoStreamChannel DOMAIN_SEPARATOR name. */
11
11
  const DOMAIN_NAME = 'Tempo Stream Channel'
@@ -37,14 +37,18 @@ const voucherTypes = {
37
37
 
38
38
  const acceptTip1020VoucherSignatures = false
39
39
 
40
- function getVoucherMessage(message: Voucher) {
40
+ function getVoucherMessage(message: LegacyVoucher) {
41
41
  return {
42
42
  channelId: message.channelId,
43
43
  cumulativeAmount: message.cumulativeAmount,
44
44
  }
45
45
  }
46
46
 
47
- function getVoucherDigest(escrowContract: Address.Address, chainId: number, message: Voucher) {
47
+ function getVoucherDigest(
48
+ escrowContract: Address.Address,
49
+ chainId: number,
50
+ message: LegacyVoucher,
51
+ ) {
48
52
  return hashTypedData({
49
53
  domain: getVoucherDomain(escrowContract, chainId),
50
54
  types: voucherTypes,
@@ -56,7 +60,7 @@ function getVoucherDigest(escrowContract: Address.Address, chainId: number, mess
56
60
  async function signVoucherTypedData(
57
61
  client: Client,
58
62
  account: Account,
59
- message: Voucher,
63
+ message: LegacyVoucher,
60
64
  escrowContract: Address.Address,
61
65
  chainId: number,
62
66
  ): Promise<Hex> {
@@ -106,7 +110,7 @@ function assertSupportedVoucherEnvelope(envelope: SignatureEnvelope.SignatureEnv
106
110
  export async function signVoucher(
107
111
  client: Client,
108
112
  account: Account,
109
- message: Voucher,
113
+ message: LegacyVoucher,
110
114
  escrowContract: Address.Address,
111
115
  chainId: number,
112
116
  voucherSigner?: Account | undefined,
@@ -143,7 +147,7 @@ export async function signVoucher(
143
147
  export async function verifyVoucher(
144
148
  escrowContract: Address.Address,
145
149
  chainId: number,
146
- voucher: SignedVoucher,
150
+ voucher: LegacySignedVoucher,
147
151
  expectedSigner: Address.Address,
148
152
  ): Promise<boolean> {
149
153
  try {
@@ -170,7 +174,7 @@ export function parseVoucherFromPayload(
170
174
  channelId: Hex,
171
175
  cumulativeAmount: string,
172
176
  signature: Hex,
173
- ): SignedVoucher {
177
+ ): LegacySignedVoucher {
174
178
  return {
175
179
  channelId,
176
180
  cumulativeAmount: BigInt(cumulativeAmount),
@@ -1,3 +1,4 @@
1
+ /** ABI for the legacy contract-backed Tempo stream channel escrow. */
1
2
  export const escrowAbi = [
2
3
  {
3
4
  type: 'function',
@@ -0,0 +1,8 @@
1
+ /** Legacy contract-backed channel chain helpers. */
2
+ export * as Chain from './Chain.js'
3
+ /** Legacy contract-backed channel ID helpers. */
4
+ export * as Channel from './Channel.js'
5
+ /** Legacy contract-backed session protocol types. */
6
+ export * as Types from './Types.js'
7
+ /** Legacy contract-backed voucher helpers. */
8
+ export * as Voucher from './Voucher.js'
@@ -2,6 +2,7 @@ import { expectTypeOf, test } from 'vp/test'
2
2
 
3
3
  import { tempo } from '../../server/index.js'
4
4
  import * as Store from '../../Store.js'
5
+ import * as Tempo from '../index.js'
5
6
 
6
7
  test('tempo.charge store parameter requires AtomicStore', () => {
7
8
  type ChargeParameters = NonNullable<Parameters<typeof tempo.charge>[0]>
@@ -18,17 +19,6 @@ test('tempo.charge store parameter requires AtomicStore', () => {
18
19
  tempo.charge({ store: Store.memory() })
19
20
  })
20
21
 
21
- test('tempo.charge validateSender exposes only sender context', () => {
22
- tempo.charge({
23
- validateSender({ expectedSender, sender, source }) {
24
- expectTypeOf(expectedSender).toEqualTypeOf<`0x${string}`>()
25
- expectTypeOf(sender).toEqualTypeOf<`0x${string}`>()
26
- expectTypeOf(source).toEqualTypeOf<{ address: `0x${string}`; chainId: number } | undefined>()
27
- return true
28
- },
29
- })
30
- })
31
-
32
22
  test('tempo.session store parameter requires AtomicStore', () => {
33
23
  type SessionParameters = NonNullable<Parameters<typeof tempo.session>[0]>
34
24
  expectTypeOf<SessionParameters['store']>().toEqualTypeOf<Store.AtomicStore | undefined>()
@@ -43,3 +33,18 @@ test('tempo.session store parameter requires AtomicStore', () => {
43
33
  tempo.session({ store: nonAtomic })
44
34
  tempo.session({ store: Store.memory() })
45
35
  })
36
+
37
+ test('tempo Session server session store parameter requires AtomicStore', () => {
38
+ type SessionParameters = NonNullable<Parameters<typeof Tempo.Session.Server.session>[0]>
39
+ expectTypeOf<SessionParameters['store']>().toEqualTypeOf<Store.AtomicStore | undefined>()
40
+
41
+ const nonAtomic = Store.from({
42
+ get: async () => null,
43
+ put: async () => {},
44
+ delete: async () => {},
45
+ })
46
+
47
+ // @ts-expect-error — session state updates require AtomicStore
48
+ Tempo.Session.Server.session({ store: nonAtomic })
49
+ Tempo.Session.Server.session({ store: Store.memory() })
50
+ })