mppx 0.6.31 → 0.8.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 (616) hide show
  1. package/CHANGELOG.md +50 -0
  2. package/README.md +20 -11
  3. package/dist/Challenge.d.ts.map +1 -1
  4. package/dist/Challenge.js +27 -13
  5. package/dist/Challenge.js.map +1 -1
  6. package/dist/Constants.d.ts +46 -0
  7. package/dist/Constants.d.ts.map +1 -0
  8. package/dist/Constants.js +46 -0
  9. package/dist/Constants.js.map +1 -0
  10. package/dist/Credential.d.ts.map +1 -1
  11. package/dist/Credential.js +5 -4
  12. package/dist/Credential.js.map +1 -1
  13. package/dist/Mcp.d.ts +3 -0
  14. package/dist/Mcp.d.ts.map +1 -1
  15. package/dist/Mcp.js +2 -0
  16. package/dist/Mcp.js.map +1 -1
  17. package/dist/Method.d.ts +32 -4
  18. package/dist/Method.d.ts.map +1 -1
  19. package/dist/Method.js +5 -2
  20. package/dist/Method.js.map +1 -1
  21. package/dist/PaymentRequest.d.ts +10 -10
  22. package/dist/PaymentRequest.js +8 -8
  23. package/dist/Receipt.d.ts.map +1 -1
  24. package/dist/Receipt.js +3 -2
  25. package/dist/Receipt.js.map +1 -1
  26. package/dist/cli/cli.d.ts.map +1 -1
  27. package/dist/cli/cli.js +19 -11
  28. package/dist/cli/cli.js.map +1 -1
  29. package/dist/cli/plugins/tempo.d.ts.map +1 -1
  30. package/dist/cli/plugins/tempo.js +17 -6
  31. package/dist/cli/plugins/tempo.js.map +1 -1
  32. package/dist/cli/utils.d.ts +5 -0
  33. package/dist/cli/utils.d.ts.map +1 -1
  34. package/dist/cli/utils.js +10 -0
  35. package/dist/cli/utils.js.map +1 -1
  36. package/dist/client/Methods.d.ts +5 -2
  37. package/dist/client/Methods.d.ts.map +1 -1
  38. package/dist/client/Methods.js +5 -2
  39. package/dist/client/Methods.js.map +1 -1
  40. package/dist/client/Mppx.js +2 -2
  41. package/dist/client/Mppx.js.map +1 -1
  42. package/dist/client/Transport.d.ts +11 -16
  43. package/dist/client/Transport.d.ts.map +1 -1
  44. package/dist/client/Transport.js +55 -76
  45. package/dist/client/Transport.js.map +1 -1
  46. package/dist/client/index.d.ts +5 -1
  47. package/dist/client/index.d.ts.map +1 -1
  48. package/dist/client/index.js +3 -1
  49. package/dist/client/index.js.map +1 -1
  50. package/dist/client/internal/Fetch.d.ts.map +1 -1
  51. package/dist/client/internal/Fetch.js +60 -13
  52. package/dist/client/internal/Fetch.js.map +1 -1
  53. package/dist/client/internal/protocols/Mcp.d.ts +7 -0
  54. package/dist/client/internal/protocols/Mcp.d.ts.map +1 -0
  55. package/dist/client/internal/protocols/Mcp.js +159 -0
  56. package/dist/client/internal/protocols/Mcp.js.map +1 -0
  57. package/dist/client/internal/protocols/Mpp.d.ts +4 -0
  58. package/dist/client/internal/protocols/Mpp.d.ts.map +1 -0
  59. package/dist/client/internal/protocols/Mpp.js +18 -0
  60. package/dist/client/internal/protocols/Mpp.js.map +1 -0
  61. package/dist/client/internal/protocols/Protocol.d.ts +10 -0
  62. package/dist/client/internal/protocols/Protocol.d.ts.map +1 -0
  63. package/dist/client/internal/protocols/Protocol.js +2 -0
  64. package/dist/client/internal/protocols/Protocol.js.map +1 -0
  65. package/dist/client/internal/protocols/Shared.d.ts +5 -0
  66. package/dist/client/internal/protocols/Shared.d.ts.map +1 -0
  67. package/dist/client/internal/protocols/Shared.js +20 -0
  68. package/dist/client/internal/protocols/Shared.js.map +1 -0
  69. package/dist/client/internal/protocols/X402.d.ts +8 -0
  70. package/dist/client/internal/protocols/X402.d.ts.map +1 -0
  71. package/dist/client/internal/protocols/X402.js +39 -0
  72. package/dist/client/internal/protocols/X402.js.map +1 -0
  73. package/dist/evm/client/index.d.ts +1 -0
  74. package/dist/evm/client/index.d.ts.map +1 -1
  75. package/dist/evm/client/index.js +1 -0
  76. package/dist/evm/client/index.js.map +1 -1
  77. package/dist/evm/index.d.ts +2 -0
  78. package/dist/evm/index.d.ts.map +1 -1
  79. package/dist/evm/index.js +2 -0
  80. package/dist/evm/index.js.map +1 -1
  81. package/dist/evm/server/Methods.d.ts +1 -1
  82. package/dist/evm/server/Methods.d.ts.map +1 -1
  83. package/dist/evm/server/index.d.ts +1 -0
  84. package/dist/evm/server/index.d.ts.map +1 -1
  85. package/dist/evm/server/index.js +1 -0
  86. package/dist/evm/server/index.js.map +1 -1
  87. package/dist/index.d.ts +1 -0
  88. package/dist/index.d.ts.map +1 -1
  89. package/dist/index.js +1 -0
  90. package/dist/index.js.map +1 -1
  91. package/dist/internal/AcceptPayment.d.ts +3 -0
  92. package/dist/internal/AcceptPayment.d.ts.map +1 -1
  93. package/dist/internal/AcceptPayment.js +15 -11
  94. package/dist/internal/AcceptPayment.js.map +1 -1
  95. package/dist/mcp/client/McpClient.d.ts +101 -0
  96. package/dist/mcp/client/McpClient.d.ts.map +1 -0
  97. package/dist/mcp/client/McpClient.js +162 -0
  98. package/dist/mcp/client/McpClient.js.map +1 -0
  99. package/dist/mcp/client/index.d.ts.map +1 -0
  100. package/dist/mcp/client/index.js.map +1 -0
  101. package/dist/mcp/server/Transport.d.ts.map +1 -0
  102. package/dist/mcp/server/Transport.js.map +1 -0
  103. package/dist/mcp/server/index.d.ts.map +1 -0
  104. package/dist/mcp/server/index.js.map +1 -0
  105. package/dist/server/Mppx.d.ts +12 -4
  106. package/dist/server/Mppx.d.ts.map +1 -1
  107. package/dist/server/Mppx.js +85 -27
  108. package/dist/server/Mppx.js.map +1 -1
  109. package/dist/server/Response.d.ts.map +1 -1
  110. package/dist/server/Response.js +2 -1
  111. package/dist/server/Response.js.map +1 -1
  112. package/dist/server/Transport.d.ts +1 -1
  113. package/dist/server/Transport.d.ts.map +1 -1
  114. package/dist/server/Transport.js +5 -4
  115. package/dist/server/Transport.js.map +1 -1
  116. package/dist/server/index.d.ts +1 -0
  117. package/dist/server/index.d.ts.map +1 -1
  118. package/dist/server/index.js +1 -0
  119. package/dist/server/index.js.map +1 -1
  120. package/dist/stripe/client/Charge.d.ts +1 -1
  121. package/dist/stripe/client/Charge.d.ts.map +1 -1
  122. package/dist/stripe/client/Charge.js +3 -1
  123. package/dist/stripe/client/Charge.js.map +1 -1
  124. package/dist/stripe/server/Charge.d.ts +1 -1
  125. package/dist/stripe/server/Charge.d.ts.map +1 -1
  126. package/dist/stripe/server/Charge.js +9 -2
  127. package/dist/stripe/server/Charge.js.map +1 -1
  128. package/dist/stripe/server/Methods.d.ts +1 -1
  129. package/dist/stripe/server/Methods.d.ts.map +1 -1
  130. package/dist/stripe/server/internal/html.gen.d.ts +1 -1
  131. package/dist/stripe/server/internal/html.gen.d.ts.map +1 -1
  132. package/dist/stripe/server/internal/html.gen.js +1 -1
  133. package/dist/stripe/server/internal/html.gen.js.map +1 -1
  134. package/dist/tempo/Methods.d.ts +18 -0
  135. package/dist/tempo/Methods.d.ts.map +1 -1
  136. package/dist/tempo/Methods.js +16 -1
  137. package/dist/tempo/Methods.js.map +1 -1
  138. package/dist/tempo/Proof.d.ts +85 -1
  139. package/dist/tempo/Proof.d.ts.map +1 -1
  140. package/dist/tempo/Proof.js +35 -0
  141. package/dist/tempo/Proof.js.map +1 -1
  142. package/dist/tempo/client/Charge.d.ts +19 -1
  143. package/dist/tempo/client/Charge.d.ts.map +1 -1
  144. package/dist/tempo/client/Charge.js +47 -27
  145. package/dist/tempo/client/Charge.js.map +1 -1
  146. package/dist/tempo/client/Methods.d.ts +41 -10
  147. package/dist/tempo/client/Methods.d.ts.map +1 -1
  148. package/dist/tempo/client/Methods.js +16 -7
  149. package/dist/tempo/client/Methods.js.map +1 -1
  150. package/dist/tempo/client/ResolveAccount.d.ts +40 -0
  151. package/dist/tempo/client/ResolveAccount.d.ts.map +1 -0
  152. package/dist/tempo/client/ResolveAccount.js +2 -0
  153. package/dist/tempo/client/ResolveAccount.js.map +1 -0
  154. package/dist/tempo/client/index.d.ts +7 -4
  155. package/dist/tempo/client/index.d.ts.map +1 -1
  156. package/dist/tempo/client/index.js +5 -3
  157. package/dist/tempo/client/index.js.map +1 -1
  158. package/dist/tempo/index.d.ts +1 -0
  159. package/dist/tempo/index.d.ts.map +1 -1
  160. package/dist/tempo/index.js +1 -0
  161. package/dist/tempo/index.js.map +1 -1
  162. package/dist/tempo/internal/fee-payer.d.ts +29 -1
  163. package/dist/tempo/internal/fee-payer.d.ts.map +1 -1
  164. package/dist/tempo/internal/fee-payer.js +138 -4
  165. package/dist/tempo/internal/fee-payer.js.map +1 -1
  166. package/dist/tempo/internal/proof.d.ts +71 -5
  167. package/dist/tempo/internal/proof.d.ts.map +1 -1
  168. package/dist/tempo/internal/proof.js +42 -6
  169. package/dist/tempo/internal/proof.js.map +1 -1
  170. package/dist/tempo/{client → legacy/client}/ChannelOps.d.ts +19 -6
  171. package/dist/tempo/legacy/client/ChannelOps.d.ts.map +1 -0
  172. package/dist/tempo/{client → legacy/client}/ChannelOps.js +9 -3
  173. package/dist/tempo/legacy/client/ChannelOps.js.map +1 -0
  174. package/dist/tempo/{client → legacy/client}/Session.d.ts +23 -4
  175. package/dist/tempo/legacy/client/Session.d.ts.map +1 -0
  176. package/dist/tempo/{client → legacy/client}/Session.js +14 -7
  177. package/dist/tempo/legacy/client/Session.js.map +1 -0
  178. package/dist/tempo/{client → legacy/client}/SessionManager.d.ts +20 -5
  179. package/dist/tempo/legacy/client/SessionManager.d.ts.map +1 -0
  180. package/dist/tempo/{client → legacy/client}/SessionManager.js +30 -19
  181. package/dist/tempo/legacy/client/SessionManager.js.map +1 -0
  182. package/dist/tempo/legacy/client/index.d.ts +7 -0
  183. package/dist/tempo/legacy/client/index.d.ts.map +1 -0
  184. package/dist/tempo/legacy/client/index.js +5 -0
  185. package/dist/tempo/legacy/client/index.js.map +1 -0
  186. package/dist/tempo/legacy/index.d.ts +7 -0
  187. package/dist/tempo/legacy/index.d.ts.map +1 -0
  188. package/dist/tempo/legacy/index.js +7 -0
  189. package/dist/tempo/legacy/index.js.map +1 -0
  190. package/dist/tempo/{server → legacy/server}/Session.d.ts +28 -11
  191. package/dist/tempo/legacy/server/Session.d.ts.map +1 -0
  192. package/dist/tempo/{server → legacy/server}/Session.js +12 -10
  193. package/dist/tempo/legacy/server/Session.js.map +1 -0
  194. package/dist/tempo/legacy/server/index.d.ts +5 -0
  195. package/dist/tempo/legacy/server/index.d.ts.map +1 -0
  196. package/dist/tempo/legacy/server/index.js +5 -0
  197. package/dist/tempo/legacy/server/index.js.map +1 -0
  198. package/dist/tempo/{session → legacy/session}/Chain.d.ts +30 -23
  199. package/dist/tempo/legacy/session/Chain.d.ts.map +1 -0
  200. package/dist/tempo/{session → legacy/session}/Chain.js +12 -11
  201. package/dist/tempo/legacy/session/Chain.js.map +1 -0
  202. package/dist/tempo/{session → legacy/session}/Channel.d.ts +1 -0
  203. package/dist/tempo/legacy/session/Channel.d.ts.map +1 -0
  204. package/dist/tempo/legacy/session/Channel.js.map +1 -0
  205. package/dist/tempo/legacy/session/ChannelStore.d.ts +22 -0
  206. package/dist/tempo/legacy/session/ChannelStore.d.ts.map +1 -0
  207. package/dist/tempo/legacy/session/ChannelStore.js +6 -0
  208. package/dist/tempo/legacy/session/ChannelStore.js.map +1 -0
  209. package/dist/tempo/legacy/session/Types.d.ts +73 -0
  210. package/dist/tempo/legacy/session/Types.d.ts.map +1 -0
  211. package/dist/tempo/legacy/session/Types.js.map +1 -0
  212. package/dist/tempo/{session → legacy/session}/Voucher.d.ts +4 -4
  213. package/dist/tempo/legacy/session/Voucher.d.ts.map +1 -0
  214. package/dist/tempo/{session → legacy/session}/Voucher.js +1 -1
  215. package/dist/tempo/legacy/session/Voucher.js.map +1 -0
  216. package/dist/tempo/{session → legacy/session}/escrow.abi.d.ts +1 -0
  217. package/dist/tempo/{session → legacy/session}/escrow.abi.d.ts.map +1 -1
  218. package/dist/tempo/{session → legacy/session}/escrow.abi.js +1 -0
  219. package/dist/tempo/legacy/session/escrow.abi.js.map +1 -0
  220. package/dist/tempo/legacy/session/index.d.ts +9 -0
  221. package/dist/tempo/legacy/session/index.d.ts.map +1 -0
  222. package/dist/tempo/legacy/session/index.js +9 -0
  223. package/dist/tempo/legacy/session/index.js.map +1 -0
  224. package/dist/tempo/server/Charge.d.ts +1 -1
  225. package/dist/tempo/server/Charge.d.ts.map +1 -1
  226. package/dist/tempo/server/Charge.js +51 -30
  227. package/dist/tempo/server/Charge.js.map +1 -1
  228. package/dist/tempo/server/Methods.d.ts +67 -8
  229. package/dist/tempo/server/Methods.d.ts.map +1 -1
  230. package/dist/tempo/server/Methods.js +40 -10
  231. package/dist/tempo/server/Methods.js.map +1 -1
  232. package/dist/tempo/server/Subscription.d.ts +11 -1
  233. package/dist/tempo/server/Subscription.d.ts.map +1 -1
  234. package/dist/tempo/server/Subscription.js +135 -23
  235. package/dist/tempo/server/Subscription.js.map +1 -1
  236. package/dist/tempo/server/index.d.ts +6 -5
  237. package/dist/tempo/server/index.d.ts.map +1 -1
  238. package/dist/tempo/server/index.js +5 -5
  239. package/dist/tempo/server/index.js.map +1 -1
  240. package/dist/tempo/server/internal/html.gen.d.ts +1 -1
  241. package/dist/tempo/server/internal/html.gen.d.ts.map +1 -1
  242. package/dist/tempo/server/internal/html.gen.js +1 -1
  243. package/dist/tempo/server/internal/html.gen.js.map +1 -1
  244. package/dist/tempo/server/internal/request-body.d.ts +7 -2
  245. package/dist/tempo/server/internal/request-body.d.ts.map +1 -1
  246. package/dist/tempo/server/internal/request-body.js +20 -3
  247. package/dist/tempo/server/internal/request-body.js.map +1 -1
  248. package/dist/tempo/server/internal/transport.d.ts +8 -4
  249. package/dist/tempo/server/internal/transport.d.ts.map +1 -1
  250. package/dist/tempo/server/internal/transport.js +8 -7
  251. package/dist/tempo/server/internal/transport.js.map +1 -1
  252. package/dist/tempo/session/Snapshot.d.ts +32 -0
  253. package/dist/tempo/session/Snapshot.d.ts.map +1 -0
  254. package/dist/tempo/session/Snapshot.js +37 -0
  255. package/dist/tempo/session/Snapshot.js.map +1 -0
  256. package/dist/tempo/session/client/ChannelOps.d.ts +81 -0
  257. package/dist/tempo/session/client/ChannelOps.d.ts.map +1 -0
  258. package/dist/tempo/session/client/ChannelOps.js +201 -0
  259. package/dist/tempo/session/client/ChannelOps.js.map +1 -0
  260. package/dist/tempo/session/client/ChannelStore.d.ts +51 -0
  261. package/dist/tempo/session/client/ChannelStore.d.ts.map +1 -0
  262. package/dist/tempo/session/client/ChannelStore.js +63 -0
  263. package/dist/tempo/session/client/ChannelStore.js.map +1 -0
  264. package/dist/tempo/session/client/CredentialState.d.ts +245 -0
  265. package/dist/tempo/session/client/CredentialState.d.ts.map +1 -0
  266. package/dist/tempo/session/client/CredentialState.js +419 -0
  267. package/dist/tempo/session/client/CredentialState.js.map +1 -0
  268. package/dist/tempo/session/client/ReceiptCoordinator.d.ts +26 -0
  269. package/dist/tempo/session/client/ReceiptCoordinator.d.ts.map +1 -0
  270. package/dist/tempo/session/client/ReceiptCoordinator.js +61 -0
  271. package/dist/tempo/session/client/ReceiptCoordinator.js.map +1 -0
  272. package/dist/tempo/session/client/Runtime.d.ts +464 -0
  273. package/dist/tempo/session/client/Runtime.d.ts.map +1 -0
  274. package/dist/tempo/session/client/Runtime.js +499 -0
  275. package/dist/tempo/session/client/Runtime.js.map +1 -0
  276. package/dist/tempo/session/client/Session.d.ts +138 -0
  277. package/dist/tempo/session/client/Session.d.ts.map +1 -0
  278. package/dist/tempo/session/client/Session.js +69 -0
  279. package/dist/tempo/session/client/Session.js.map +1 -0
  280. package/dist/tempo/session/client/SessionManager.d.ts +84 -0
  281. package/dist/tempo/session/client/SessionManager.d.ts.map +1 -0
  282. package/dist/tempo/session/client/SessionManager.js +577 -0
  283. package/dist/tempo/session/client/SessionManager.js.map +1 -0
  284. package/dist/tempo/session/client/Transports.d.ts +449 -0
  285. package/dist/tempo/session/client/Transports.d.ts.map +1 -0
  286. package/dist/tempo/session/client/Transports.js +721 -0
  287. package/dist/tempo/session/client/Transports.js.map +1 -0
  288. package/dist/tempo/session/client/index.d.ts +11 -0
  289. package/dist/tempo/session/client/index.d.ts.map +1 -0
  290. package/dist/tempo/session/client/index.js +6 -0
  291. package/dist/tempo/session/client/index.js.map +1 -0
  292. package/dist/tempo/session/index.d.ts +7 -8
  293. package/dist/tempo/session/index.d.ts.map +1 -1
  294. package/dist/tempo/session/index.js +7 -8
  295. package/dist/tempo/session/index.js.map +1 -1
  296. package/dist/tempo/session/precompile/Chain.d.ts +319 -0
  297. package/dist/tempo/session/precompile/Chain.d.ts.map +1 -0
  298. package/dist/tempo/session/precompile/Chain.js +492 -0
  299. package/dist/tempo/session/precompile/Chain.js.map +1 -0
  300. package/dist/tempo/session/precompile/Channel.d.ts +46 -0
  301. package/dist/tempo/session/precompile/Channel.d.ts.map +1 -0
  302. package/dist/tempo/session/precompile/Channel.js +56 -0
  303. package/dist/tempo/session/precompile/Channel.js.map +1 -0
  304. package/dist/tempo/session/precompile/Protocol.d.ts +308 -0
  305. package/dist/tempo/session/precompile/Protocol.d.ts.map +1 -0
  306. package/dist/tempo/session/precompile/Protocol.js +264 -0
  307. package/dist/tempo/session/precompile/Protocol.js.map +1 -0
  308. package/dist/tempo/session/precompile/Voucher.d.ts +40 -0
  309. package/dist/tempo/session/precompile/Voucher.d.ts.map +1 -0
  310. package/dist/tempo/session/precompile/Voucher.js +125 -0
  311. package/dist/tempo/session/precompile/Voucher.js.map +1 -0
  312. package/dist/tempo/session/precompile/escrow.abi.d.ts +522 -0
  313. package/dist/tempo/session/precompile/escrow.abi.d.ts.map +1 -0
  314. package/dist/tempo/session/precompile/escrow.abi.js +224 -0
  315. package/dist/tempo/session/precompile/escrow.abi.js.map +1 -0
  316. package/dist/tempo/session/precompile/index.d.ts +24 -0
  317. package/dist/tempo/session/precompile/index.d.ts.map +1 -0
  318. package/dist/tempo/session/precompile/index.js +22 -0
  319. package/dist/tempo/session/precompile/index.js.map +1 -0
  320. package/dist/tempo/session/server/ChannelOps.d.ts +56 -0
  321. package/dist/tempo/session/server/ChannelOps.d.ts.map +1 -0
  322. package/dist/tempo/session/server/ChannelOps.js +91 -0
  323. package/dist/tempo/session/server/ChannelOps.js.map +1 -0
  324. package/dist/tempo/session/server/ChannelStore.d.ts +347 -0
  325. package/dist/tempo/session/server/ChannelStore.d.ts.map +1 -0
  326. package/dist/tempo/session/server/ChannelStore.js +404 -0
  327. package/dist/tempo/session/server/ChannelStore.js.map +1 -0
  328. package/dist/tempo/session/server/CredentialVerification.d.ts +85 -0
  329. package/dist/tempo/session/server/CredentialVerification.d.ts.map +1 -0
  330. package/dist/tempo/session/server/CredentialVerification.js +494 -0
  331. package/dist/tempo/session/server/CredentialVerification.js.map +1 -0
  332. package/dist/tempo/session/server/MeteredStream.d.ts +40 -0
  333. package/dist/tempo/session/server/MeteredStream.d.ts.map +1 -0
  334. package/dist/tempo/session/server/MeteredStream.js +42 -0
  335. package/dist/tempo/session/server/MeteredStream.js.map +1 -0
  336. package/dist/tempo/session/server/RequestState.d.ts +208 -0
  337. package/dist/tempo/session/server/RequestState.d.ts.map +1 -0
  338. package/dist/tempo/session/server/RequestState.js +252 -0
  339. package/dist/tempo/session/server/RequestState.js.map +1 -0
  340. package/dist/tempo/session/server/Session.d.ts +169 -0
  341. package/dist/tempo/session/server/Session.d.ts.map +1 -0
  342. package/dist/tempo/session/server/Session.js +351 -0
  343. package/dist/tempo/session/server/Session.js.map +1 -0
  344. package/dist/tempo/session/server/Settlement.d.ts +185 -0
  345. package/dist/tempo/session/server/Settlement.d.ts.map +1 -0
  346. package/dist/tempo/session/server/Settlement.js +252 -0
  347. package/dist/tempo/session/server/Settlement.js.map +1 -0
  348. package/dist/tempo/session/{Sse.d.ts → server/Sse.d.ts} +9 -56
  349. package/dist/tempo/session/server/Sse.d.ts.map +1 -0
  350. package/dist/tempo/session/server/Sse.js +184 -0
  351. package/dist/tempo/session/server/Sse.js.map +1 -0
  352. package/dist/tempo/session/server/Transports.d.ts +89 -0
  353. package/dist/tempo/session/server/Transports.d.ts.map +1 -0
  354. package/dist/tempo/session/server/Transports.js +149 -0
  355. package/dist/tempo/session/server/Transports.js.map +1 -0
  356. package/dist/tempo/session/server/Ws.d.ts +48 -0
  357. package/dist/tempo/session/server/Ws.d.ts.map +1 -0
  358. package/dist/tempo/session/server/Ws.js +244 -0
  359. package/dist/tempo/session/server/Ws.js.map +1 -0
  360. package/dist/tempo/session/server/index.d.ts +4 -0
  361. package/dist/tempo/session/server/index.d.ts.map +1 -0
  362. package/dist/tempo/session/server/index.js +2 -0
  363. package/dist/tempo/session/server/index.js.map +1 -0
  364. package/dist/tempo/subscription/KeyAuthorization.d.ts +712 -1
  365. package/dist/tempo/subscription/KeyAuthorization.d.ts.map +1 -1
  366. package/dist/tempo/subscription/Store.d.ts +2 -0
  367. package/dist/tempo/subscription/Store.d.ts.map +1 -1
  368. package/dist/tempo/subscription/Store.js +16 -1
  369. package/dist/tempo/subscription/Store.js.map +1 -1
  370. package/dist/x402/index.d.ts +1 -0
  371. package/dist/x402/index.d.ts.map +1 -1
  372. package/dist/x402/index.js +1 -0
  373. package/dist/x402/index.js.map +1 -1
  374. package/package.json +25 -9
  375. package/src/Challenge.test.ts +40 -0
  376. package/src/Challenge.ts +28 -13
  377. package/src/Constants.ts +58 -0
  378. package/src/Credential.ts +5 -4
  379. package/src/Mcp.ts +4 -0
  380. package/src/Method.ts +46 -5
  381. package/src/PaymentRequest.ts +10 -10
  382. package/src/Receipt.ts +3 -2
  383. package/src/cli/cli.test.ts +38 -43
  384. package/src/cli/cli.ts +23 -10
  385. package/src/cli/mcp.test.ts +21 -7
  386. package/src/cli/plugins/tempo.ts +21 -8
  387. package/src/cli/utils.test.ts +25 -1
  388. package/src/cli/utils.ts +10 -0
  389. package/src/client/Methods.ts +5 -2
  390. package/src/client/Mppx.test-d.ts +31 -1
  391. package/src/client/Mppx.test.ts +76 -1
  392. package/src/client/Mppx.ts +2 -2
  393. package/src/client/Transport.test.ts +225 -178
  394. package/src/client/Transport.ts +77 -84
  395. package/src/client/index.ts +25 -1
  396. package/src/client/internal/Fetch.test.ts +236 -6
  397. package/src/client/internal/Fetch.ts +69 -11
  398. package/src/client/internal/protocols/Mcp.test.ts +220 -0
  399. package/src/client/internal/protocols/Mcp.ts +162 -0
  400. package/src/client/internal/protocols/Mpp.ts +21 -0
  401. package/src/client/internal/protocols/Protocol.ts +10 -0
  402. package/src/client/internal/protocols/Shared.ts +25 -0
  403. package/src/client/internal/protocols/X402.ts +42 -0
  404. package/src/discovery/OpenApi.test.ts +1 -1
  405. package/src/env.d.ts +1 -1
  406. package/src/evm/PublicInterface.test-d.ts +1 -1
  407. package/src/evm/client/index.ts +1 -0
  408. package/src/evm/index.ts +2 -0
  409. package/src/evm/server/Charge.test.ts +1 -1
  410. package/src/evm/server/index.ts +1 -0
  411. package/src/index.ts +1 -0
  412. package/src/internal/AcceptPayment.test.ts +61 -0
  413. package/src/internal/AcceptPayment.ts +21 -14
  414. package/src/{mcp-sdk → mcp}/client/McpClient.integration.test.ts +18 -11
  415. package/src/{mcp-sdk → mcp}/client/McpClient.test-d.ts +45 -11
  416. package/src/{mcp-sdk → mcp}/client/McpClient.test.ts +211 -5
  417. package/src/mcp/client/McpClient.ts +307 -0
  418. package/src/mcp/client/McpClient.unit.test.ts +135 -0
  419. package/src/middlewares/elysia.test.ts +9 -5
  420. package/src/middlewares/express.test.ts +9 -5
  421. package/src/middlewares/hono.test.ts +5 -5
  422. package/src/middlewares/internal/mppx.test.ts +1 -1
  423. package/src/middlewares/nextjs.test.ts +9 -5
  424. package/src/proxy/Proxy.test.ts +9 -9
  425. package/src/proxy/services/anthropic.test.ts +1 -1
  426. package/src/proxy/services/openai.test.ts +1 -1
  427. package/src/proxy/services/stripe.test.ts +1 -1
  428. package/src/server/Mppx.authorize.test.ts +1 -1
  429. package/src/server/Mppx.test-d.ts +55 -1
  430. package/src/server/Mppx.test.ts +220 -9
  431. package/src/server/Mppx.ts +501 -407
  432. package/src/server/Response.ts +2 -1
  433. package/src/server/Transport.test.ts +6 -6
  434. package/src/server/Transport.ts +5 -4
  435. package/src/server/index.ts +1 -0
  436. package/src/stripe/Charge.integration.test.ts +1 -1
  437. package/src/stripe/client/Charge.test.ts +21 -6
  438. package/src/stripe/client/Charge.ts +6 -2
  439. package/src/stripe/server/Charge.test.ts +115 -2
  440. package/src/stripe/server/Charge.ts +13 -2
  441. package/src/stripe/server/internal/html/package.json +1 -1
  442. package/src/stripe/server/internal/html.gen.ts +1 -1
  443. package/src/tempo/AccessKeyAuthorization.test.ts +4 -94
  444. package/src/tempo/Methods.test.ts +45 -17
  445. package/src/tempo/Methods.ts +22 -0
  446. package/src/tempo/Proof.conformance.test.ts +146 -0
  447. package/src/tempo/Proof.test-d.ts +15 -0
  448. package/src/tempo/Proof.ts +52 -1
  449. package/src/tempo/PublicExports.test-d.ts +105 -0
  450. package/src/tempo/Subscription.integration.test.ts +1 -1
  451. package/src/tempo/client/Charge.test.ts +258 -0
  452. package/src/tempo/client/Charge.ts +84 -38
  453. package/src/tempo/client/Methods.ts +22 -8
  454. package/src/tempo/client/ResolveAccount.ts +46 -0
  455. package/src/tempo/client/index.ts +15 -4
  456. package/src/tempo/index.ts +1 -0
  457. package/src/tempo/internal/fee-payer.test.ts +296 -17
  458. package/src/tempo/internal/fee-payer.ts +186 -4
  459. package/src/tempo/internal/fee-token.test.ts +14 -9
  460. package/src/tempo/internal/proof.test.ts +12 -4
  461. package/src/tempo/internal/proof.ts +55 -6
  462. package/src/tempo/legacy/AccessKeyAuthorization.test.ts +162 -0
  463. package/src/tempo/legacy/README.md +9 -0
  464. package/src/tempo/{client → legacy/client}/ChannelOps.test.ts +6 -7
  465. package/src/tempo/{client → legacy/client}/ChannelOps.ts +22 -9
  466. package/src/tempo/{client → legacy/client}/Session.test.ts +51 -9
  467. package/src/tempo/{client → legacy/client}/Session.ts +25 -11
  468. package/src/tempo/{client → legacy/client}/SessionManager.test.ts +81 -9
  469. package/src/tempo/{client → legacy/client}/SessionManager.ts +52 -23
  470. package/src/tempo/legacy/client/index.ts +6 -0
  471. package/src/tempo/legacy/index.ts +6 -0
  472. package/src/tempo/{server → legacy/server}/Session.test.ts +136 -71
  473. package/src/tempo/{server → legacy/server}/Session.ts +32 -23
  474. package/src/tempo/legacy/server/index.ts +4 -0
  475. package/src/tempo/{session → legacy/session}/Chain.test.ts +3 -4
  476. package/src/tempo/{session → legacy/session}/Chain.ts +94 -63
  477. package/src/tempo/{session → legacy/session}/Channel.ts +1 -0
  478. package/src/tempo/legacy/session/ChannelStore.test.ts +58 -0
  479. package/src/tempo/legacy/session/ChannelStore.ts +39 -0
  480. package/src/tempo/legacy/session/Types.ts +91 -0
  481. package/src/tempo/{session → legacy/session}/Voucher.ts +12 -8
  482. package/src/tempo/{session → legacy/session}/escrow.abi.ts +1 -0
  483. package/src/tempo/legacy/session/index.ts +8 -0
  484. package/src/tempo/server/AtomicStore.test-d.ts +16 -11
  485. package/src/tempo/server/Charge.test.ts +480 -31
  486. package/src/tempo/server/Charge.ts +54 -30
  487. package/src/tempo/server/Methods.ts +58 -10
  488. package/src/tempo/server/Sse.test.ts +2 -2
  489. package/src/tempo/server/Subscription.test.ts +465 -3
  490. package/src/tempo/server/Subscription.ts +174 -19
  491. package/src/tempo/server/index.ts +6 -5
  492. package/src/tempo/server/internal/html/package.json +2 -2
  493. package/src/tempo/server/internal/html.gen.ts +1 -1
  494. package/src/tempo/server/internal/request-body.test.ts +37 -4
  495. package/src/tempo/server/internal/request-body.ts +25 -6
  496. package/src/tempo/server/internal/transport.test.ts +4 -4
  497. package/src/tempo/server/internal/transport.ts +19 -10
  498. package/src/tempo/session/Snapshot.test.ts +41 -0
  499. package/src/tempo/session/Snapshot.ts +74 -0
  500. package/src/tempo/session/client/ChannelOps.test.ts +163 -0
  501. package/src/tempo/session/client/ChannelOps.ts +330 -0
  502. package/src/tempo/session/client/ChannelStore.ts +111 -0
  503. package/src/tempo/session/client/CredentialState.test.ts +789 -0
  504. package/src/tempo/session/client/CredentialState.ts +799 -0
  505. package/src/tempo/session/client/ReceiptCoordinator.ts +95 -0
  506. package/src/tempo/session/client/Runtime.test.ts +1092 -0
  507. package/src/tempo/session/client/Runtime.ts +986 -0
  508. package/src/tempo/session/client/Session.test.ts +774 -0
  509. package/src/tempo/session/client/Session.ts +123 -0
  510. package/src/tempo/session/client/SessionManager.test.ts +1397 -0
  511. package/src/tempo/session/client/SessionManager.ts +751 -0
  512. package/src/tempo/session/client/Transports.test.ts +837 -0
  513. package/src/tempo/session/client/Transports.ts +1292 -0
  514. package/src/tempo/session/client/index.ts +40 -0
  515. package/src/tempo/session/index.ts +7 -8
  516. package/src/tempo/session/precompile/Chain.integration.test.ts +321 -0
  517. package/src/tempo/session/precompile/Chain.test.ts +1258 -0
  518. package/src/tempo/session/precompile/Chain.ts +979 -0
  519. package/src/tempo/session/precompile/Channel.test.ts +138 -0
  520. package/src/tempo/session/precompile/Channel.ts +103 -0
  521. package/src/tempo/session/precompile/Protocol.test.ts +358 -0
  522. package/src/tempo/session/precompile/Protocol.ts +520 -0
  523. package/src/tempo/session/precompile/Voucher.test.ts +354 -0
  524. package/src/tempo/session/precompile/Voucher.ts +162 -0
  525. package/src/tempo/session/precompile/escrow.abi.ts +226 -0
  526. package/src/tempo/session/precompile/index.ts +33 -0
  527. package/src/tempo/session/server/ChannelOps.test.ts +129 -0
  528. package/src/tempo/session/server/ChannelOps.ts +157 -0
  529. package/src/tempo/session/{ChannelStore.test.ts → server/ChannelStore.test.ts} +536 -29
  530. package/src/tempo/session/server/ChannelStore.ts +835 -0
  531. package/src/tempo/session/server/CredentialVerification.test.ts +146 -0
  532. package/src/tempo/session/server/CredentialVerification.ts +710 -0
  533. package/src/tempo/session/server/MeteredStream.ts +88 -0
  534. package/src/tempo/session/server/RequestState.test.ts +531 -0
  535. package/src/tempo/session/server/RequestState.ts +499 -0
  536. package/src/tempo/session/server/Session.integration.test.ts +444 -0
  537. package/src/tempo/session/server/Session.test.ts +3253 -0
  538. package/src/tempo/session/server/Session.ts +543 -0
  539. package/src/tempo/session/server/Settlement.test.ts +329 -0
  540. package/src/tempo/session/server/Settlement.ts +471 -0
  541. package/src/tempo/session/{Sse.test.ts → server/Sse.test.ts} +37 -3
  542. package/src/tempo/session/server/Sse.ts +254 -0
  543. package/src/tempo/session/server/Transports.test.ts +346 -0
  544. package/src/tempo/session/server/Transports.ts +255 -0
  545. package/src/tempo/session/{Ws.test.ts → server/Ws.test.ts} +4 -4
  546. package/src/tempo/session/server/Ws.ts +380 -0
  547. package/src/tempo/session/server/index.ts +8 -0
  548. package/src/tempo/subscription/Store.ts +27 -9
  549. package/src/x402/Exact.e2e.test.ts +1 -1
  550. package/src/x402/PublicInterface.test-d.ts +1 -1
  551. package/src/x402/index.ts +1 -0
  552. package/dist/mcp-sdk/client/McpClient.d.ts +0 -78
  553. package/dist/mcp-sdk/client/McpClient.d.ts.map +0 -1
  554. package/dist/mcp-sdk/client/McpClient.js +0 -105
  555. package/dist/mcp-sdk/client/McpClient.js.map +0 -1
  556. package/dist/mcp-sdk/client/index.d.ts.map +0 -1
  557. package/dist/mcp-sdk/client/index.js.map +0 -1
  558. package/dist/mcp-sdk/server/Transport.d.ts.map +0 -1
  559. package/dist/mcp-sdk/server/Transport.js.map +0 -1
  560. package/dist/mcp-sdk/server/index.d.ts.map +0 -1
  561. package/dist/mcp-sdk/server/index.js.map +0 -1
  562. package/dist/tempo/client/ChannelOps.d.ts.map +0 -1
  563. package/dist/tempo/client/ChannelOps.js.map +0 -1
  564. package/dist/tempo/client/Session.d.ts.map +0 -1
  565. package/dist/tempo/client/Session.js.map +0 -1
  566. package/dist/tempo/client/SessionManager.d.ts.map +0 -1
  567. package/dist/tempo/client/SessionManager.js.map +0 -1
  568. package/dist/tempo/server/Session.d.ts.map +0 -1
  569. package/dist/tempo/server/Session.js.map +0 -1
  570. package/dist/tempo/session/Chain.d.ts.map +0 -1
  571. package/dist/tempo/session/Chain.js.map +0 -1
  572. package/dist/tempo/session/Channel.d.ts.map +0 -1
  573. package/dist/tempo/session/Channel.js.map +0 -1
  574. package/dist/tempo/session/ChannelStore.d.ts +0 -117
  575. package/dist/tempo/session/ChannelStore.d.ts.map +0 -1
  576. package/dist/tempo/session/ChannelStore.js +0 -172
  577. package/dist/tempo/session/ChannelStore.js.map +0 -1
  578. package/dist/tempo/session/Receipt.d.ts +0 -22
  579. package/dist/tempo/session/Receipt.d.ts.map +0 -1
  580. package/dist/tempo/session/Receipt.js +0 -34
  581. package/dist/tempo/session/Receipt.js.map +0 -1
  582. package/dist/tempo/session/Sse.d.ts.map +0 -1
  583. package/dist/tempo/session/Sse.js +0 -363
  584. package/dist/tempo/session/Sse.js.map +0 -1
  585. package/dist/tempo/session/Types.d.ts +0 -78
  586. package/dist/tempo/session/Types.d.ts.map +0 -1
  587. package/dist/tempo/session/Types.js.map +0 -1
  588. package/dist/tempo/session/Voucher.d.ts.map +0 -1
  589. package/dist/tempo/session/Voucher.js.map +0 -1
  590. package/dist/tempo/session/Ws.d.ts +0 -87
  591. package/dist/tempo/session/Ws.d.ts.map +0 -1
  592. package/dist/tempo/session/Ws.js +0 -443
  593. package/dist/tempo/session/Ws.js.map +0 -1
  594. package/dist/tempo/session/escrow.abi.js.map +0 -1
  595. package/src/mcp-sdk/client/McpClient.ts +0 -196
  596. package/src/tempo/session/ChannelStore.ts +0 -308
  597. package/src/tempo/session/Receipt.test.ts +0 -89
  598. package/src/tempo/session/Receipt.ts +0 -46
  599. package/src/tempo/session/Sse.ts +0 -462
  600. package/src/tempo/session/Types.ts +0 -86
  601. package/src/tempo/session/Ws.ts +0 -576
  602. /package/dist/{mcp-sdk → mcp}/client/index.d.ts +0 -0
  603. /package/dist/{mcp-sdk → mcp}/client/index.js +0 -0
  604. /package/dist/{mcp-sdk → mcp}/server/Transport.d.ts +0 -0
  605. /package/dist/{mcp-sdk → mcp}/server/Transport.js +0 -0
  606. /package/dist/{mcp-sdk → mcp}/server/index.d.ts +0 -0
  607. /package/dist/{mcp-sdk → mcp}/server/index.js +0 -0
  608. /package/dist/tempo/{session → legacy/session}/Channel.js +0 -0
  609. /package/dist/tempo/{session → legacy/session}/Types.js +0 -0
  610. /package/src/{mcp-sdk → mcp}/client/index.ts +0 -0
  611. /package/src/{mcp-sdk → mcp}/server/Transport.test.ts +0 -0
  612. /package/src/{mcp-sdk → mcp}/server/Transport.ts +0 -0
  613. /package/src/{mcp-sdk → mcp}/server/index.ts +0 -0
  614. /package/src/tempo/{session → legacy/session}/Channel.test.ts +0 -0
  615. /package/src/tempo/{session → legacy/session}/Voucher.test.ts +0 -0
  616. /package/src/tempo/session/{Sse.fuzz.test.ts → server/Sse.fuzz.test.ts} +0 -0
@@ -0,0 +1,774 @@
1
+ import { type Address, createClient, custom, decodeFunctionData, encodeFunctionResult } from 'viem'
2
+ import { privateKeyToAccount } from 'viem/accounts'
3
+ import { Account as TempoAccount, Secp256k1, Transaction } from 'viem/tempo'
4
+ import { describe, expect, test } from 'vp/test'
5
+
6
+ import type { Challenge } from '../../../Challenge.js'
7
+ import * as Constants from '../../../Constants.js'
8
+ import * as Credential from '../../../Credential.js'
9
+ import * as z from '../../../zod.js'
10
+ import * as Methods from '../../Methods.js'
11
+ import * as Channel from '../precompile/Channel.js'
12
+ import { escrowAbi } from '../precompile/escrow.abi.js'
13
+ import { tip20ChannelEscrow } from '../precompile/Protocol.js'
14
+ import * as Types from '../precompile/Protocol.js'
15
+ import * as Voucher from '../precompile/Voucher.js'
16
+ import { session } from './Session.js'
17
+
18
+ const account = privateKeyToAccount(
19
+ '0xac0974bec39a17e36ba6a6b4d238ff944bacb478cbed5efcae784d7bf4f2ff80',
20
+ )
21
+ const chainId = 42431
22
+ const client = createClient({
23
+ account,
24
+ chain: { id: chainId } as never,
25
+ transport: custom({
26
+ async request(args) {
27
+ if (args.method === 'eth_chainId') return `0x${chainId.toString(16)}`
28
+ if (args.method === 'eth_getTransactionCount') return '0x0'
29
+ if (args.method === 'eth_estimateGas') return '0x5208'
30
+ if (args.method === 'eth_maxPriorityFeePerGas') return '0x1'
31
+ if (args.method === 'eth_getBlockByNumber') return { baseFeePerGas: '0x1' }
32
+ if (args.method === 'eth_call')
33
+ return encodeFunctionResult({
34
+ abi: escrowAbi,
35
+ functionName: 'getChannelState',
36
+ result: { settled: 0n, deposit: 1_000n, closeRequestedAt: 0 },
37
+ })
38
+ throw new Error(`unexpected rpc request: ${args.method}`)
39
+ },
40
+ }),
41
+ })
42
+
43
+ const descriptor = {
44
+ payer: account.address,
45
+ payee: '0x0000000000000000000000000000000000000002' as Address,
46
+ operator: '0x0000000000000000000000000000000000000000' as Address,
47
+ token: '0x0000000000000000000000000000000000000003' as Address,
48
+ salt: `0x${'11'.repeat(32)}` as `0x${string}`,
49
+ authorizedSigner: account.address,
50
+ expiringNonceHash: `0x${'22'.repeat(32)}` as `0x${string}`,
51
+ } satisfies Channel.ChannelDescriptor
52
+
53
+ type SessionChallenge = Challenge<
54
+ z.output<typeof Methods.session.schema.request>,
55
+ typeof Methods.session.intent,
56
+ typeof Methods.session.name
57
+ >
58
+
59
+ function makeChallenge(overrides: Partial<SessionChallenge['request']> = {}): SessionChallenge {
60
+ const request: SessionChallenge['request'] = {
61
+ amount: '100',
62
+ currency: descriptor.token,
63
+ recipient: descriptor.payee,
64
+ unitType: 'request',
65
+ methodDetails: { chainId, escrowContract: tip20ChannelEscrow },
66
+ }
67
+
68
+ return {
69
+ id: 'test-id',
70
+ realm: 'test.com',
71
+ method: 'tempo',
72
+ intent: 'session',
73
+ request: Object.assign(request, overrides),
74
+ }
75
+ }
76
+
77
+ function deserialize(credential: string) {
78
+ return Credential.deserialize(credential).payload as Types.SessionCredentialPayload
79
+ }
80
+
81
+ function deserializeCredential(credential: string) {
82
+ return Credential.deserialize<Types.SessionCredentialPayload>(credential)
83
+ }
84
+
85
+ function openArgs(payload: Types.SessionCredentialPayload) {
86
+ if (payload.action !== 'open') throw new Error('expected open payload')
87
+ const transaction = Transaction.deserialize(payload.transaction)
88
+ if (!('calls' in transaction)) throw new Error('expected tempo calls')
89
+ const calls = transaction.calls as readonly { to?: Address; data?: `0x${string}` }[]
90
+ const call = calls[0]!
91
+ const decoded = decodeFunctionData({ abi: escrowAbi, data: call.data! })
92
+ if (decoded.functionName !== 'open') throw new Error('expected open call')
93
+ return decoded.args
94
+ }
95
+
96
+ function openDeposit(payload: Types.SessionCredentialPayload): bigint {
97
+ return openArgs(payload)[3]
98
+ }
99
+
100
+ describe('precompile client session', () => {
101
+ test('handles only TIP-1034 session challenges', () => {
102
+ const method = session({ account, getClient: () => client })
103
+
104
+ expect(
105
+ method.canHandleChallenge?.({
106
+ challenge: makeChallenge({
107
+ methodDetails: {
108
+ chainId,
109
+ escrowContract: tip20ChannelEscrow,
110
+ sessionProtocol: Constants.SessionProtocols.v2,
111
+ },
112
+ }),
113
+ }),
114
+ ).toBe(true)
115
+ expect(method.canHandleChallenge?.({ challenge: makeChallenge() })).toBe(false)
116
+ expect(
117
+ method.canHandleChallenge?.({
118
+ challenge: makeChallenge({
119
+ methodDetails: {
120
+ chainId,
121
+ escrowContract: tip20ChannelEscrow,
122
+ sessionProtocol: Constants.SessionProtocols.v1,
123
+ },
124
+ }),
125
+ }),
126
+ ).toBe(false)
127
+ })
128
+
129
+ test('opens for the current amount without client deposit configuration', async () => {
130
+ const method = session({ account, getClient: () => client })
131
+ const payload = deserialize(
132
+ await method.createCredential({ challenge: makeChallenge(), context: {} }),
133
+ )
134
+
135
+ expect(payload.action).toBe('open')
136
+ expect(openDeposit(payload)).toBe(100n)
137
+ })
138
+
139
+ test('uses client chain ID when the challenge omits chain ID', async () => {
140
+ const method = session({ account, getClient: () => client })
141
+ const credential = deserializeCredential(
142
+ await method.createCredential({
143
+ challenge: makeChallenge({
144
+ methodDetails: { escrowContract: tip20ChannelEscrow },
145
+ }),
146
+ context: {},
147
+ }),
148
+ )
149
+ const payload = credential.payload
150
+
151
+ if (payload.action !== 'open') throw new Error('expected open payload')
152
+ expect(credential.source).toBe(`did:pkh:eip155:${chainId}:${account.address}`)
153
+ expect(payload.channelId).toBe(
154
+ Channel.computeId({ ...payload.descriptor, chainId, escrow: tip20ChannelEscrow }),
155
+ )
156
+ })
157
+
158
+ test('uses explicit context depositRaw before server hints', async () => {
159
+ const method = session({ account, getClient: () => client })
160
+ const payload = deserialize(
161
+ await method.createCredential({
162
+ challenge: makeChallenge(),
163
+ context: { depositRaw: '500' },
164
+ }),
165
+ )
166
+
167
+ expect(payload.action).toBe('open')
168
+ expect(openDeposit(payload)).toBe(500n)
169
+ })
170
+
171
+ test('caps suggestedDeposit by maxDeposit', async () => {
172
+ const method = session({ account, decimals: 0, maxDeposit: '500', getClient: () => client })
173
+ const payload = deserialize(
174
+ await method.createCredential({
175
+ challenge: makeChallenge({ suggestedDeposit: '1000' }),
176
+ context: {},
177
+ }),
178
+ )
179
+
180
+ expect(payload.action).toBe('open')
181
+ expect(openDeposit(payload)).toBe(500n)
182
+ })
183
+
184
+ test('uses suggestedDeposit when below maxDeposit', async () => {
185
+ const method = session({ account, decimals: 0, maxDeposit: '1000', getClient: () => client })
186
+ const payload = deserialize(
187
+ await method.createCredential({
188
+ challenge: makeChallenge({ suggestedDeposit: '700' }),
189
+ context: {},
190
+ }),
191
+ )
192
+
193
+ expect(payload.action).toBe('open')
194
+ expect(openDeposit(payload)).toBe(700n)
195
+ })
196
+
197
+ test('uses current amount without suggestedDeposit even when maxDeposit is higher', async () => {
198
+ const method = session({ account, decimals: 0, maxDeposit: '1000', getClient: () => client })
199
+ const payload = deserialize(
200
+ await method.createCredential({ challenge: makeChallenge(), context: {} }),
201
+ )
202
+
203
+ expect(payload.action).toBe('open')
204
+ expect(openDeposit(payload)).toBe(100n)
205
+ })
206
+
207
+ test('rejects open when maxDeposit is below the request amount', async () => {
208
+ const method = session({ account, decimals: 0, maxDeposit: '50', getClient: () => client })
209
+
210
+ await expect(
211
+ method.createCredential({ challenge: makeChallenge(), context: {} }),
212
+ ).rejects.toThrow('requested voucher amount 100 exceeds local maxDeposit 50')
213
+ })
214
+
215
+ test('rejects explicit opening deposits below the request amount', async () => {
216
+ const method = session({ account, decimals: 0, maxDeposit: '1000', getClient: () => client })
217
+
218
+ await expect(
219
+ method.createCredential({
220
+ challenge: makeChallenge(),
221
+ context: { depositRaw: '50' },
222
+ }),
223
+ ).rejects.toThrow('opening deposit 50 below request amount 100')
224
+ })
225
+
226
+ test('uses resolved escrow address for open transactions', async () => {
227
+ const challengeEscrow = '0x0000000000000000000000000000000000000005' as Address
228
+ const method = session({ account, decimals: 0, getClient: () => client })
229
+ const payload = deserialize(
230
+ await method.createCredential({
231
+ challenge: makeChallenge({
232
+ methodDetails: { chainId, escrowContract: challengeEscrow },
233
+ }),
234
+ context: {},
235
+ }),
236
+ )
237
+
238
+ if (payload.action !== 'open') throw new Error('expected open payload')
239
+ const transaction = Transaction.deserialize(payload.transaction)
240
+ if (!('calls' in transaction)) throw new Error('expected tempo calls')
241
+ const calls = transaction.calls as readonly { to?: Address; data?: `0x${string}` }[]
242
+ expect(calls[0]!.to?.toLowerCase()).toBe(challengeEscrow.toLowerCase())
243
+ expect(payload.channelId).toBe(
244
+ Channel.computeId({ ...payload.descriptor, chainId, escrow: challengeEscrow }),
245
+ )
246
+ })
247
+
248
+ test('uses challenge-advertised operator for open transactions', async () => {
249
+ const operator = '0x0000000000000000000000000000000000000006' as Address
250
+ const method = session({ account, decimals: 0, getClient: () => client })
251
+ const payload = deserialize(
252
+ await method.createCredential({
253
+ challenge: makeChallenge({
254
+ methodDetails: { chainId, escrowContract: tip20ChannelEscrow, operator },
255
+ }),
256
+ context: {},
257
+ }),
258
+ )
259
+
260
+ if (payload.action !== 'open') throw new Error('expected open payload')
261
+ expect(openArgs(payload)[1].toLowerCase()).toBe(operator.toLowerCase())
262
+ expect(payload.descriptor.operator.toLowerCase()).toBe(operator.toLowerCase())
263
+ })
264
+
265
+ test('tracks cumulative amount and calls onChannelUpdate in auto mode', async () => {
266
+ const updates: bigint[] = []
267
+ const method = session({
268
+ account,
269
+ decimals: 0,
270
+ maxDeposit: '1000',
271
+ getClient: () => client,
272
+ onChannelUpdate: (entry) => updates.push(entry.cumulativeAmount),
273
+ })
274
+ const first = deserialize(
275
+ await method.createCredential({ challenge: makeChallenge(), context: {} }),
276
+ )
277
+ const second = deserialize(
278
+ await method.createCredential({ challenge: makeChallenge(), context: {} }),
279
+ )
280
+
281
+ expect(first.action).toBe('open')
282
+ expect(second.action).toBe('voucher')
283
+ if (second.action !== 'voucher') throw new Error('expected voucher')
284
+ expect(second.channelId).toBe(first.channelId)
285
+ expect(second.cumulativeAmount).toBe('200')
286
+ expect(updates).toEqual([100n, 200n])
287
+ })
288
+
289
+ test('passes existing channel authority to resolveAccount before reusing session channel', async () => {
290
+ const accessKey = TempoAccount.fromSecp256k1(Secp256k1.randomPrivateKey(), {
291
+ access: account,
292
+ })
293
+ const calls: session.ResolveAccountInfo[] = []
294
+ const method = session({
295
+ account,
296
+ decimals: 0,
297
+ maxDeposit: '1000',
298
+ getClient: () => client,
299
+ resolveAccount(info) {
300
+ calls.push(info)
301
+ return accessKey
302
+ },
303
+ })
304
+ const first = deserializeCredential(
305
+ await method.createCredential({ challenge: makeChallenge(), context: {} }),
306
+ )
307
+ const second = deserializeCredential(
308
+ await method.createCredential({ challenge: makeChallenge(), context: {} }),
309
+ )
310
+
311
+ expect(calls).toHaveLength(2)
312
+ expect(calls[0]!.account.address).toBe(account.address)
313
+ expect(calls[0]!.operation).toEqual({ kind: 'authorizePaymentChannel' })
314
+ expect(calls[1]!.operation).toEqual({
315
+ kind: 'authorizePaymentChannel',
316
+ authority: accessKey.accessKeyAddress,
317
+ })
318
+ expect(first.source).toBe(`did:pkh:eip155:${chainId}:${account.address}`)
319
+ expect(second.source).toBe(`did:pkh:eip155:${chainId}:${account.address}`)
320
+ expect(first.payload.action).toBe('open')
321
+ if (first.payload.action !== 'open' || second.payload.action !== 'voucher')
322
+ throw new Error('expected open then voucher payloads')
323
+ expect(first.payload.descriptor.payer).toBe(account.address)
324
+ expect(first.payload.descriptor.authorizedSigner).toBe(accessKey.accessKeyAddress)
325
+ expect(second.payload.channelId).toBe(first.payload.channelId)
326
+ expect(second.payload.cumulativeAmount).toBe('200')
327
+ })
328
+
329
+ test('enforces maxDeposit when reusing a cached auto-mode channel', async () => {
330
+ const updates: bigint[] = []
331
+ const method = session({
332
+ account,
333
+ decimals: 0,
334
+ maxDeposit: '150',
335
+ getClient: () => client,
336
+ onChannelUpdate: (entry) => updates.push(entry.cumulativeAmount),
337
+ })
338
+
339
+ await method.createCredential({ challenge: makeChallenge(), context: {} })
340
+
341
+ await expect(
342
+ method.createCredential({ challenge: makeChallenge(), context: {} }),
343
+ ).rejects.toThrow('requested voucher amount 200 exceeds local maxDeposit 150')
344
+ expect(updates).toEqual([100n])
345
+ })
346
+
347
+ test('recovers and reuses a descriptor supplied in context', async () => {
348
+ const updates: bigint[] = []
349
+ const method = session({
350
+ account,
351
+ decimals: 0,
352
+ maxDeposit: '1000',
353
+ getClient: () => client,
354
+ onChannelUpdate: (entry) => updates.push(entry.cumulativeAmount),
355
+ })
356
+ const channelId = Channel.computeId({ ...descriptor, chainId, escrow: tip20ChannelEscrow })
357
+ const recovered = deserialize(
358
+ await method.createCredential({
359
+ challenge: makeChallenge(),
360
+ context: { channelId, descriptor },
361
+ }),
362
+ )
363
+ const next = deserialize(
364
+ await method.createCredential({ challenge: makeChallenge(), context: {} }),
365
+ )
366
+
367
+ expect(recovered.action).toBe('voucher')
368
+ if (recovered.action !== 'voucher' || next.action !== 'voucher')
369
+ throw new Error('expected voucher')
370
+ expect(recovered.channelId).toBe(channelId)
371
+ expect(recovered.cumulativeAmount).toBe('100')
372
+ expect(next.channelId).toBe(channelId)
373
+ expect(next.cumulativeAmount).toBe('200')
374
+ expect(updates).toEqual([100n, 200n])
375
+ })
376
+
377
+ test('increments stored cumulative when recovering without a server snapshot', async () => {
378
+ const method = session({ account, decimals: 0, maxDeposit: '1000', getClient: () => client })
379
+ const channelId = Channel.computeId({ ...descriptor, chainId, escrow: tip20ChannelEscrow })
380
+ const payload = deserialize(
381
+ await method.createCredential({
382
+ challenge: makeChallenge(),
383
+ context: { channelId, cumulativeAmountRaw: '100', descriptor },
384
+ }),
385
+ )
386
+
387
+ expect(payload.action).toBe('voucher')
388
+ if (payload.action !== 'voucher') throw new Error('expected voucher')
389
+ expect(payload.channelId).toBe(channelId)
390
+ expect(payload.cumulativeAmount).toBe('200')
391
+ })
392
+
393
+ test('uses required server snapshot cumulative when recovering a channel', async () => {
394
+ const method = session({ account, decimals: 0, maxDeposit: '1000', getClient: () => client })
395
+ const channelId = Channel.computeId({ ...descriptor, chainId, escrow: tip20ChannelEscrow })
396
+ const payload = deserialize(
397
+ await method.createCredential({
398
+ challenge: makeChallenge({
399
+ methodDetails: {
400
+ chainId,
401
+ escrowContract: tip20ChannelEscrow,
402
+ sessionSnapshot: {
403
+ acceptedCumulative: '400',
404
+ chainId,
405
+ channelId,
406
+ deposit: '1000',
407
+ descriptor,
408
+ escrow: tip20ChannelEscrow,
409
+ requiredCumulative: '400',
410
+ settled: '0',
411
+ spent: '300',
412
+ units: 3,
413
+ },
414
+ },
415
+ }),
416
+ context: {},
417
+ }),
418
+ )
419
+
420
+ expect(payload.action).toBe('voucher')
421
+ if (payload.action !== 'voucher') throw new Error('expected voucher')
422
+ expect(payload.channelId).toBe(channelId)
423
+ expect(payload.descriptor).toEqual(descriptor)
424
+ expect(payload.cumulativeAmount).toBe('400')
425
+ })
426
+
427
+ test('ignores accepted snapshot headroom above current request spend', async () => {
428
+ const method = session({ account, decimals: 0, maxDeposit: '1000', getClient: () => client })
429
+ const channelId = Channel.computeId({ ...descriptor, chainId, escrow: tip20ChannelEscrow })
430
+ const payload = deserialize(
431
+ await method.createCredential({
432
+ challenge: makeChallenge({
433
+ methodDetails: {
434
+ chainId,
435
+ escrowContract: tip20ChannelEscrow,
436
+ sessionSnapshot: {
437
+ acceptedCumulative: '500',
438
+ chainId,
439
+ channelId,
440
+ deposit: '1000',
441
+ descriptor,
442
+ escrow: tip20ChannelEscrow,
443
+ requiredCumulative: '400',
444
+ settled: '0',
445
+ spent: '300',
446
+ units: 3,
447
+ },
448
+ },
449
+ }),
450
+ context: {},
451
+ }),
452
+ )
453
+
454
+ expect(payload.action).toBe('voucher')
455
+ if (payload.action !== 'voucher') throw new Error('expected voucher')
456
+ expect(payload.cumulativeAmount).toBe('400')
457
+ })
458
+
459
+ test('caps recovered voucher authorization by maxDeposit', async () => {
460
+ const method = session({ account, decimals: 0, maxDeposit: '300', getClient: () => client })
461
+ const channelId = Channel.computeId({ ...descriptor, chainId, escrow: tip20ChannelEscrow })
462
+
463
+ await expect(
464
+ method.createCredential({
465
+ challenge: makeChallenge({
466
+ methodDetails: {
467
+ chainId,
468
+ escrowContract: tip20ChannelEscrow,
469
+ sessionSnapshot: {
470
+ acceptedCumulative: '300',
471
+ chainId,
472
+ channelId,
473
+ deposit: '1000',
474
+ descriptor,
475
+ escrow: tip20ChannelEscrow,
476
+ requiredCumulative: '300',
477
+ settled: '0',
478
+ spent: '200',
479
+ },
480
+ },
481
+ }),
482
+ context: {},
483
+ }),
484
+ ).resolves.toBeDefined()
485
+
486
+ const overLimitMethod = session({
487
+ account,
488
+ decimals: 0,
489
+ maxDeposit: '300',
490
+ getClient: () => client,
491
+ })
492
+ await expect(
493
+ overLimitMethod.createCredential({
494
+ challenge: makeChallenge({
495
+ amount: '400',
496
+ methodDetails: {
497
+ chainId,
498
+ escrowContract: tip20ChannelEscrow,
499
+ sessionSnapshot: {
500
+ acceptedCumulative: '1000',
501
+ chainId,
502
+ channelId,
503
+ deposit: '1000',
504
+ descriptor,
505
+ escrow: tip20ChannelEscrow,
506
+ requiredCumulative: '1000',
507
+ settled: '0',
508
+ spent: '300',
509
+ },
510
+ },
511
+ }),
512
+ context: {},
513
+ }),
514
+ ).rejects.toThrow('requested voucher amount 700 exceeds local maxDeposit 300')
515
+ })
516
+
517
+ test('rejects descriptor recovery for closed or missing channels', async () => {
518
+ const closedClient = createClient({
519
+ account,
520
+ chain: { id: chainId } as never,
521
+ transport: custom({
522
+ async request(args) {
523
+ if (args.method === 'eth_chainId') return `0x${chainId.toString(16)}`
524
+ if (args.method === 'eth_call')
525
+ return encodeFunctionResult({
526
+ abi: escrowAbi,
527
+ functionName: 'getChannelState',
528
+ result: { settled: 0n, deposit: 0n, closeRequestedAt: 0 },
529
+ })
530
+ throw new Error(`unexpected rpc request: ${args.method}`)
531
+ },
532
+ }),
533
+ })
534
+ const method = session({
535
+ account,
536
+ decimals: 0,
537
+ maxDeposit: '1000',
538
+ getClient: () => closedClient,
539
+ })
540
+ const channelId = Channel.computeId({ ...descriptor, chainId, escrow: tip20ChannelEscrow })
541
+
542
+ await expect(
543
+ method.createCredential({
544
+ challenge: makeChallenge(),
545
+ context: { channelId, descriptor },
546
+ }),
547
+ ).rejects.toThrow(/cannot be reused \(closed or not found on-chain\)/)
548
+ })
549
+
550
+ test('rejects channel recovery without descriptor', async () => {
551
+ const method = session({ account, decimals: 0, maxDeposit: '1000', getClient: () => client })
552
+
553
+ await expect(
554
+ method.createCredential({
555
+ challenge: makeChallenge(),
556
+ context: { channelId: `0x${'33'.repeat(32)}` },
557
+ }),
558
+ ).rejects.toThrow('descriptor required to reuse TIP-1034 channel')
559
+ })
560
+
561
+ test('defaults precompile authorizedSigner to account access key address', async () => {
562
+ const accessKeyAddress = '0x0000000000000000000000000000000000000009' as Address
563
+ const accessKeyAccount = Object.assign({}, account, { accessKeyAddress })
564
+ const method = session({
565
+ account: accessKeyAccount,
566
+ decimals: 0,
567
+ maxDeposit: '1000',
568
+ getClient: () => client,
569
+ })
570
+ const payload = deserialize(
571
+ await method.createCredential({ challenge: makeChallenge(), context: {} }),
572
+ )
573
+
574
+ expect(payload.action).toBe('open')
575
+ if (payload.action !== 'open') throw new Error('expected open payload')
576
+ expect(payload.descriptor.authorizedSigner).toBe(accessKeyAddress)
577
+ })
578
+
579
+ test('manual open requires transaction', async () => {
580
+ const method = session({ account, getClient: () => client })
581
+
582
+ await expect(
583
+ method.createCredential({
584
+ challenge: makeChallenge(),
585
+ context: { action: 'open', descriptor, cumulativeAmountRaw: '100' },
586
+ }),
587
+ ).rejects.toThrow('transaction required for open action')
588
+ })
589
+
590
+ test('manual open requires cumulativeAmount', async () => {
591
+ const method = session({ account, getClient: () => client })
592
+
593
+ await expect(
594
+ method.createCredential({
595
+ challenge: makeChallenge(),
596
+ context: { action: 'open', descriptor, transaction: '0x1234' },
597
+ }),
598
+ ).rejects.toThrow('cumulativeAmount required for open action')
599
+ })
600
+
601
+ test('manual topUp requires additionalDeposit', async () => {
602
+ const method = session({ account, getClient: () => client })
603
+
604
+ await expect(
605
+ method.createCredential({
606
+ challenge: makeChallenge(),
607
+ context: { action: 'topUp', descriptor, transaction: '0x1234' },
608
+ }),
609
+ ).rejects.toThrow('additionalDeposit required for topUp action')
610
+ })
611
+
612
+ test('manual voucher requires cumulativeAmount', async () => {
613
+ const method = session({ account, getClient: () => client })
614
+
615
+ await expect(
616
+ method.createCredential({
617
+ challenge: makeChallenge(),
618
+ context: { action: 'voucher', descriptor },
619
+ }),
620
+ ).rejects.toThrow('cumulativeAmount required for voucher action')
621
+ })
622
+
623
+ test('manual close requires cumulativeAmount', async () => {
624
+ const method = session({ account, getClient: () => client })
625
+
626
+ await expect(
627
+ method.createCredential({
628
+ challenge: makeChallenge(),
629
+ context: { action: 'close', descriptor },
630
+ }),
631
+ ).rejects.toThrow('cumulativeAmount required for close action')
632
+ })
633
+
634
+ test('manual actions require descriptors', async () => {
635
+ const method = session({ account, getClient: () => client })
636
+
637
+ await expect(
638
+ method.createCredential({
639
+ challenge: makeChallenge(),
640
+ context: { action: 'voucher', cumulativeAmountRaw: '100' },
641
+ }),
642
+ ).rejects.toThrow('descriptor required for TIP-1034 session action')
643
+ })
644
+
645
+ test('creates manual voucher credentials with descriptor payloads', async () => {
646
+ const method = session({ account, getClient: () => client })
647
+ const credential = await method.createCredential({
648
+ challenge: makeChallenge(),
649
+ context: {
650
+ action: 'voucher',
651
+ descriptor,
652
+ cumulativeAmountRaw: '250',
653
+ },
654
+ })
655
+
656
+ const decoded = deserializeCredential(credential)
657
+ const payload = decoded.payload as Types.SessionCredentialPayload
658
+ const cumulativeAmount = Types.uint96(250n)
659
+ const channelId = Channel.computeId({ ...descriptor, chainId, escrow: tip20ChannelEscrow })
660
+
661
+ expect(decoded.challenge.id).toBe('test-id')
662
+ expect(decoded.challenge.realm).toBe('test.com')
663
+ expect(decoded.challenge.method).toBe('tempo')
664
+ expect(decoded.challenge.intent).toBe('session')
665
+ expect(payload.action).toBe('voucher')
666
+ if (payload.action !== 'voucher') throw new Error('expected voucher payload')
667
+ expect(payload.channelId).toBe(channelId)
668
+ expect(payload.descriptor).toEqual(descriptor)
669
+ expect(payload.cumulativeAmount).toBe('250')
670
+ expect(decoded.source).toBe(`did:pkh:eip155:${chainId}:${account.address}`)
671
+ expect(
672
+ Voucher.verifyVoucher(
673
+ tip20ChannelEscrow,
674
+ chainId,
675
+ { channelId, cumulativeAmount, signature: payload.signature },
676
+ descriptor.authorizedSigner,
677
+ ),
678
+ ).toBe(true)
679
+ })
680
+
681
+ test('creates manual open credentials with descriptor payloads', async () => {
682
+ const method = session({ account, getClient: () => client })
683
+ const credential = await method.createCredential({
684
+ challenge: makeChallenge(),
685
+ context: {
686
+ action: 'open',
687
+ descriptor,
688
+ cumulativeAmountRaw: '250',
689
+ transaction: '0x1234',
690
+ },
691
+ })
692
+
693
+ const decoded = deserializeCredential(credential)
694
+ const payload = decoded.payload
695
+ const cumulativeAmount = Types.uint96(250n)
696
+ const channelId = Channel.computeId({ ...descriptor, chainId, escrow: tip20ChannelEscrow })
697
+
698
+ expect(decoded.challenge.id).toBe('test-id')
699
+ expect(payload.action).toBe('open')
700
+ if (payload.action !== 'open') throw new Error('expected open payload')
701
+ expect(payload.type).toBe('transaction')
702
+ expect(payload.channelId).toBe(channelId)
703
+ expect(payload.descriptor).toEqual(descriptor)
704
+ expect(payload.transaction).toBe('0x1234')
705
+ expect(payload.cumulativeAmount).toBe('250')
706
+ expect(payload.authorizedSigner).toBe(descriptor.authorizedSigner)
707
+ expect(decoded.source).toBe(`did:pkh:eip155:${chainId}:${account.address}`)
708
+ expect(
709
+ Voucher.verifyVoucher(
710
+ tip20ChannelEscrow,
711
+ chainId,
712
+ { channelId, cumulativeAmount, signature: payload.signature },
713
+ descriptor.authorizedSigner,
714
+ ),
715
+ ).toBe(true)
716
+ })
717
+
718
+ test('creates manual top-up credentials from provided transactions', async () => {
719
+ const method = session({ account, getClient: () => client })
720
+ const credential = await method.createCredential({
721
+ challenge: makeChallenge(),
722
+ context: {
723
+ action: 'topUp',
724
+ descriptor,
725
+ additionalDepositRaw: '500',
726
+ transaction: '0x1234',
727
+ },
728
+ })
729
+
730
+ const decoded = deserializeCredential(credential)
731
+ const payload = decoded.payload as Types.SessionCredentialPayload
732
+ const channelId = Channel.computeId({ ...descriptor, chainId, escrow: tip20ChannelEscrow })
733
+
734
+ expect(payload.action).toBe('topUp')
735
+ if (payload.action !== 'topUp') throw new Error('expected topUp payload')
736
+ expect(payload.channelId).toBe(channelId)
737
+ expect(payload.descriptor).toEqual(descriptor)
738
+ expect(payload.additionalDeposit).toBe('500')
739
+ expect(payload.transaction).toBe('0x1234')
740
+ expect(decoded.source).toBe(`did:pkh:eip155:${chainId}:${account.address}`)
741
+ })
742
+
743
+ test('creates manual close credentials with descriptor payloads', async () => {
744
+ const method = session({ account, getClient: () => client })
745
+ const credential = await method.createCredential({
746
+ challenge: makeChallenge(),
747
+ context: {
748
+ action: 'close',
749
+ descriptor,
750
+ cumulativeAmountRaw: '250',
751
+ },
752
+ })
753
+
754
+ const decoded = deserializeCredential(credential)
755
+ const payload = decoded.payload
756
+ const cumulativeAmount = Types.uint96(250n)
757
+ const channelId = Channel.computeId({ ...descriptor, chainId, escrow: tip20ChannelEscrow })
758
+
759
+ expect(payload.action).toBe('close')
760
+ if (payload.action !== 'close') throw new Error('expected close payload')
761
+ expect(payload.channelId).toBe(channelId)
762
+ expect(payload.descriptor).toEqual(descriptor)
763
+ expect(payload.cumulativeAmount).toBe('250')
764
+ expect(decoded.source).toBe(`did:pkh:eip155:${chainId}:${account.address}`)
765
+ expect(
766
+ Voucher.verifyVoucher(
767
+ tip20ChannelEscrow,
768
+ chainId,
769
+ { channelId, cumulativeAmount, signature: payload.signature },
770
+ descriptor.authorizedSigner,
771
+ ),
772
+ ).toBe(true)
773
+ })
774
+ })