mppx 0.8.14 → 0.8.17

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 (507) hide show
  1. package/CHANGELOG.md +57 -0
  2. package/dist/Challenge.d.ts.map +1 -1
  3. package/dist/Challenge.js +40 -35
  4. package/dist/Challenge.js.map +1 -1
  5. package/dist/Constants.d.ts +17 -17
  6. package/dist/Constants.d.ts.map +1 -1
  7. package/dist/Credential.d.ts.map +1 -1
  8. package/dist/Errors.d.ts +3 -3
  9. package/dist/Errors.d.ts.map +1 -1
  10. package/dist/Errors.js.map +1 -1
  11. package/dist/Method.d.ts +35 -5
  12. package/dist/Method.d.ts.map +1 -1
  13. package/dist/Method.js +7 -22
  14. package/dist/Method.js.map +1 -1
  15. package/dist/Store.d.ts +19 -0
  16. package/dist/Store.d.ts.map +1 -1
  17. package/dist/Store.js +43 -0
  18. package/dist/Store.js.map +1 -1
  19. package/dist/attestation/Client.d.ts +17 -0
  20. package/dist/attestation/Client.d.ts.map +1 -0
  21. package/dist/attestation/Client.js +28 -0
  22. package/dist/attestation/Client.js.map +1 -0
  23. package/dist/attestation/Constants.d.ts +15 -0
  24. package/dist/attestation/Constants.d.ts.map +1 -0
  25. package/dist/attestation/Constants.js +15 -0
  26. package/dist/attestation/Constants.js.map +1 -0
  27. package/dist/attestation/Server.d.ts +4 -0
  28. package/dist/attestation/Server.d.ts.map +1 -0
  29. package/dist/attestation/Server.js +8 -0
  30. package/dist/attestation/Server.js.map +1 -0
  31. package/dist/attestation/Types.d.ts +76 -0
  32. package/dist/attestation/Types.d.ts.map +1 -0
  33. package/dist/attestation/Types.js +2 -0
  34. package/dist/attestation/Types.js.map +1 -0
  35. package/dist/attestation/index.d.ts +6 -0
  36. package/dist/attestation/index.d.ts.map +1 -0
  37. package/dist/attestation/index.js +6 -0
  38. package/dist/attestation/index.js.map +1 -0
  39. package/dist/attestation/internal/HttpMessageSignature.d.ts +73 -0
  40. package/dist/attestation/internal/HttpMessageSignature.d.ts.map +1 -0
  41. package/dist/attestation/internal/HttpMessageSignature.js +320 -0
  42. package/dist/attestation/internal/HttpMessageSignature.js.map +1 -0
  43. package/dist/attestation/internal/SigningContext.d.ts +4 -0
  44. package/dist/attestation/internal/SigningContext.d.ts.map +1 -0
  45. package/dist/attestation/internal/SigningContext.js +11 -0
  46. package/dist/attestation/internal/SigningContext.js.map +1 -0
  47. package/dist/cli/account.d.ts +14 -14
  48. package/dist/cli/account.d.ts.map +1 -1
  49. package/dist/cli/cli.d.ts +6 -6
  50. package/dist/cli/cli.d.ts.map +1 -1
  51. package/dist/cli/cli.js +1 -0
  52. package/dist/cli/cli.js.map +1 -1
  53. package/dist/cli/plugins/tempo.js.map +1 -1
  54. package/dist/cli/sessions/commands.d.ts +4 -4
  55. package/dist/cli/sessions/commands.d.ts.map +1 -1
  56. package/dist/cli/sessions/commands.js.map +1 -1
  57. package/dist/cli/sessions/store.d.ts.map +1 -1
  58. package/dist/cli/sessions/store.js.map +1 -1
  59. package/dist/cli/utils.d.ts +1 -1
  60. package/dist/cli/utils.d.ts.map +1 -1
  61. package/dist/cli/utils.js.map +1 -1
  62. package/dist/cli/validate/discovery.js.map +1 -1
  63. package/dist/cli/validate/index.d.ts +3 -3
  64. package/dist/cli/validate/index.d.ts.map +1 -1
  65. package/dist/cli/validate/payment.d.ts.map +1 -1
  66. package/dist/cli/validate/payment.js +18 -4
  67. package/dist/cli/validate/payment.js.map +1 -1
  68. package/dist/client/Mppx.d.ts +3 -0
  69. package/dist/client/Mppx.d.ts.map +1 -1
  70. package/dist/client/Mppx.js +13 -5
  71. package/dist/client/Mppx.js.map +1 -1
  72. package/dist/client/Transport.d.ts +3 -5
  73. package/dist/client/Transport.d.ts.map +1 -1
  74. package/dist/client/Transport.js +1 -17
  75. package/dist/client/Transport.js.map +1 -1
  76. package/dist/client/internal/Fetch.d.ts.map +1 -1
  77. package/dist/client/internal/Fetch.js +92 -13
  78. package/dist/client/internal/Fetch.js.map +1 -1
  79. package/dist/client/internal/MethodChallenge.d.ts +2 -0
  80. package/dist/client/internal/MethodChallenge.d.ts.map +1 -1
  81. package/dist/client/internal/MethodChallenge.js +4 -0
  82. package/dist/client/internal/MethodChallenge.js.map +1 -1
  83. package/dist/client/internal/MethodResponse.d.ts +15 -0
  84. package/dist/client/internal/MethodResponse.d.ts.map +1 -1
  85. package/dist/client/internal/MethodResponse.js +10 -0
  86. package/dist/client/internal/MethodResponse.js.map +1 -1
  87. package/dist/client/node.js.map +1 -1
  88. package/dist/discovery/OpenApi.d.ts +3 -5
  89. package/dist/discovery/OpenApi.d.ts.map +1 -1
  90. package/dist/discovery/OpenApi.js +13 -34
  91. package/dist/discovery/OpenApi.js.map +1 -1
  92. package/dist/discovery/internal/Metadata.d.ts +20 -0
  93. package/dist/discovery/internal/Metadata.d.ts.map +1 -0
  94. package/dist/discovery/internal/Metadata.js +36 -0
  95. package/dist/discovery/internal/Metadata.js.map +1 -0
  96. package/dist/evm/Methods.d.ts +11 -11
  97. package/dist/evm/Methods.d.ts.map +1 -1
  98. package/dist/evm/Types.d.ts +17 -17
  99. package/dist/evm/Types.d.ts.map +1 -1
  100. package/dist/evm/client/Charge.d.ts +11 -11
  101. package/dist/evm/client/Methods.d.ts +11 -11
  102. package/dist/evm/server/Charge.d.ts +1 -1
  103. package/dist/evm/server/Charge.d.ts.map +1 -1
  104. package/dist/evm/server/Charge.js +2 -0
  105. package/dist/evm/server/Charge.js.map +1 -1
  106. package/dist/evm/server/Methods.d.ts +11 -11
  107. package/dist/internal/HeaderCodec.d.ts +2 -2
  108. package/dist/internal/HeaderCodec.d.ts.map +1 -1
  109. package/dist/internal/types.d.ts +6 -0
  110. package/dist/internal/types.d.ts.map +1 -1
  111. package/dist/middlewares/elysia.js.map +1 -1
  112. package/dist/middlewares/express.js.map +1 -1
  113. package/dist/middlewares/hono.js.map +1 -1
  114. package/dist/middlewares/nextjs.js.map +1 -1
  115. package/dist/proxy/Proxy.d.ts +2 -0
  116. package/dist/proxy/Proxy.d.ts.map +1 -1
  117. package/dist/proxy/Proxy.js +117 -9
  118. package/dist/proxy/Proxy.js.map +1 -1
  119. package/dist/proxy/Service.d.ts +36 -1
  120. package/dist/proxy/Service.d.ts.map +1 -1
  121. package/dist/proxy/Service.js +9 -8
  122. package/dist/proxy/Service.js.map +1 -1
  123. package/dist/proxy/services/anthropic.d.ts.map +1 -1
  124. package/dist/proxy/services/anthropic.js +1 -0
  125. package/dist/proxy/services/anthropic.js.map +1 -1
  126. package/dist/proxy/services/openai.d.ts.map +1 -1
  127. package/dist/proxy/services/openai.js +1 -0
  128. package/dist/proxy/services/openai.js.map +1 -1
  129. package/dist/proxy/services/stripe.d.ts.map +1 -1
  130. package/dist/proxy/services/stripe.js +1 -0
  131. package/dist/proxy/services/stripe.js.map +1 -1
  132. package/dist/server/Mppx.d.ts +75 -13
  133. package/dist/server/Mppx.d.ts.map +1 -1
  134. package/dist/server/Mppx.js +201 -23
  135. package/dist/server/Mppx.js.map +1 -1
  136. package/dist/server/internal/html/config.d.ts +9 -9
  137. package/dist/server/internal/html/config.d.ts.map +1 -1
  138. package/dist/server/internal/html/constants.d.ts +17 -17
  139. package/dist/server/internal/html/constants.d.ts.map +1 -1
  140. package/dist/stripe/Methods.d.ts +10 -10
  141. package/dist/stripe/Methods.d.ts.map +1 -1
  142. package/dist/stripe/client/Charge.d.ts +10 -10
  143. package/dist/stripe/client/Methods.d.ts +10 -10
  144. package/dist/stripe/internal/constants.d.ts +1 -1
  145. package/dist/stripe/internal/constants.js +1 -1
  146. package/dist/stripe/internal/types.d.ts +1 -0
  147. package/dist/stripe/internal/types.d.ts.map +1 -1
  148. package/dist/stripe/server/Charge.d.ts +11 -11
  149. package/dist/stripe/server/Charge.d.ts.map +1 -1
  150. package/dist/stripe/server/Charge.js +49 -1
  151. package/dist/stripe/server/Charge.js.map +1 -1
  152. package/dist/stripe/server/Methods.d.ts +137 -48
  153. package/dist/stripe/server/Methods.d.ts.map +1 -1
  154. package/dist/stripe/server/Methods.js +259 -4
  155. package/dist/stripe/server/Methods.js.map +1 -1
  156. package/dist/stripe/server/internal/deposit-address.d.ts +13 -0
  157. package/dist/stripe/server/internal/deposit-address.d.ts.map +1 -0
  158. package/dist/stripe/server/internal/deposit-address.js +28 -0
  159. package/dist/stripe/server/internal/deposit-address.js.map +1 -0
  160. package/dist/stripe/server/internal/html.gen.d.ts +1 -1
  161. package/dist/stripe/server/internal/html.gen.d.ts.map +1 -1
  162. package/dist/stripe/server/internal/html.gen.js +1 -1
  163. package/dist/stripe/server/internal/html.gen.js.map +1 -1
  164. package/dist/stripe/server/internal/record-payment.d.ts +15 -0
  165. package/dist/stripe/server/internal/record-payment.d.ts.map +1 -0
  166. package/dist/stripe/server/internal/record-payment.js +42 -0
  167. package/dist/stripe/server/internal/record-payment.js.map +1 -0
  168. package/dist/stripe/server/internal/request.d.ts +25 -0
  169. package/dist/stripe/server/internal/request.d.ts.map +1 -0
  170. package/dist/stripe/server/internal/request.js +29 -0
  171. package/dist/stripe/server/internal/request.js.map +1 -0
  172. package/dist/tap/Constants.d.ts +28 -0
  173. package/dist/tap/Constants.d.ts.map +1 -0
  174. package/dist/tap/Constants.js +32 -0
  175. package/dist/tap/Constants.js.map +1 -0
  176. package/dist/tap/Types.d.ts +11 -0
  177. package/dist/tap/Types.d.ts.map +1 -0
  178. package/dist/tap/Types.js +2 -0
  179. package/dist/tap/Types.js.map +1 -0
  180. package/dist/tap/client/index.d.ts +26 -0
  181. package/dist/tap/client/index.d.ts.map +1 -0
  182. package/dist/tap/client/index.js +33 -0
  183. package/dist/tap/client/index.js.map +1 -0
  184. package/dist/tap/index.d.ts +5 -0
  185. package/dist/tap/index.d.ts.map +1 -0
  186. package/dist/tap/index.js +5 -0
  187. package/dist/tap/index.js.map +1 -0
  188. package/dist/tap/server/index.d.ts +20 -0
  189. package/dist/tap/server/index.d.ts.map +1 -0
  190. package/dist/tap/server/index.js +36 -0
  191. package/dist/tap/server/index.js.map +1 -0
  192. package/dist/tempo/Attribution.d.ts +1 -1
  193. package/dist/tempo/Methods.d.ts +60 -60
  194. package/dist/tempo/Methods.d.ts.map +1 -1
  195. package/dist/tempo/Proof.d.ts +16 -16
  196. package/dist/tempo/client/Charge.d.ts +19 -19
  197. package/dist/tempo/client/Charge.d.ts.map +1 -1
  198. package/dist/tempo/client/Charge.js +1 -7
  199. package/dist/tempo/client/Charge.js.map +1 -1
  200. package/dist/tempo/client/Methods.d.ts +38 -38
  201. package/dist/tempo/client/Methods.js.map +1 -1
  202. package/dist/tempo/client/Subscription.d.ts +23 -23
  203. package/dist/tempo/client/Subscription.js.map +1 -1
  204. package/dist/tempo/internal/address.d.ts +2 -1
  205. package/dist/tempo/internal/address.d.ts.map +1 -1
  206. package/dist/tempo/internal/address.js +3 -1
  207. package/dist/tempo/internal/address.js.map +1 -1
  208. package/dist/tempo/internal/auto-swap.d.ts.map +1 -1
  209. package/dist/tempo/internal/auto-swap.js +4 -19
  210. package/dist/tempo/internal/auto-swap.js.map +1 -1
  211. package/dist/tempo/internal/defaults.d.ts +6 -6
  212. package/dist/tempo/internal/defaults.d.ts.map +1 -1
  213. package/dist/tempo/internal/fee-payer.d.ts +12 -12
  214. package/dist/tempo/internal/fee-payer.d.ts.map +1 -1
  215. package/dist/tempo/internal/fee-payer.js.map +1 -1
  216. package/dist/tempo/internal/proof.d.ts +17 -17
  217. package/dist/tempo/internal/proof.d.ts.map +1 -1
  218. package/dist/tempo/legacy/client/Session.d.ts +20 -20
  219. package/dist/tempo/legacy/client/Session.js.map +1 -1
  220. package/dist/tempo/legacy/client/SessionManager.js.map +1 -1
  221. package/dist/tempo/legacy/index.d.ts +1 -3
  222. package/dist/tempo/legacy/index.d.ts.map +1 -1
  223. package/dist/tempo/legacy/index.js +1 -3
  224. package/dist/tempo/legacy/index.js.map +1 -1
  225. package/dist/tempo/legacy/session/escrow.abi.d.ts +374 -374
  226. package/dist/tempo/legacy/session/escrow.abi.d.ts.map +1 -1
  227. package/dist/tempo/server/Charge.d.ts +34 -12
  228. package/dist/tempo/server/Charge.d.ts.map +1 -1
  229. package/dist/tempo/server/Charge.js +44 -39
  230. package/dist/tempo/server/Charge.js.map +1 -1
  231. package/dist/tempo/server/Methods.d.ts +37 -52
  232. package/dist/tempo/server/Methods.d.ts.map +1 -1
  233. package/dist/tempo/server/Methods.js +0 -14
  234. package/dist/tempo/server/Methods.js.map +1 -1
  235. package/dist/tempo/server/Relay.d.ts +14 -5
  236. package/dist/tempo/server/Relay.d.ts.map +1 -1
  237. package/dist/tempo/server/Relay.js +6 -4
  238. package/dist/tempo/server/Relay.js.map +1 -1
  239. package/dist/tempo/server/SponsorBudget.d.ts.map +1 -1
  240. package/dist/tempo/server/SponsorBudget.js +7 -1
  241. package/dist/tempo/server/SponsorBudget.js.map +1 -1
  242. package/dist/tempo/server/Subscription.d.ts +25 -25
  243. package/dist/tempo/server/Subscription.d.ts.map +1 -1
  244. package/dist/tempo/server/Subscription.js +2 -0
  245. package/dist/tempo/server/Subscription.js.map +1 -1
  246. package/dist/tempo/server/index.d.ts +1 -1
  247. package/dist/tempo/server/index.d.ts.map +1 -1
  248. package/dist/tempo/server/index.js +1 -1
  249. package/dist/tempo/server/index.js.map +1 -1
  250. package/dist/tempo/server/internal/html.gen.d.ts +1 -1
  251. package/dist/tempo/server/internal/html.gen.d.ts.map +1 -1
  252. package/dist/tempo/server/internal/html.gen.js +1 -1
  253. package/dist/tempo/server/internal/html.gen.js.map +1 -1
  254. package/dist/tempo/server/internal/transport.d.ts +2 -0
  255. package/dist/tempo/server/internal/transport.d.ts.map +1 -1
  256. package/dist/tempo/server/internal/transport.js +9 -2
  257. package/dist/tempo/server/internal/transport.js.map +1 -1
  258. package/dist/tempo/session/client/ChannelOps.js.map +1 -1
  259. package/dist/tempo/session/client/CredentialState.d.ts +1 -1
  260. package/dist/tempo/session/client/CredentialState.js.map +1 -1
  261. package/dist/tempo/session/client/ReceiptCoordinator.js.map +1 -1
  262. package/dist/tempo/session/client/Runtime.js.map +1 -1
  263. package/dist/tempo/session/client/Session.d.ts +19 -19
  264. package/dist/tempo/session/client/Session.d.ts.map +1 -1
  265. package/dist/tempo/session/client/Session.js +128 -14
  266. package/dist/tempo/session/client/Session.js.map +1 -1
  267. package/dist/tempo/session/client/SessionManager.d.ts.map +1 -1
  268. package/dist/tempo/session/client/SessionManager.js +62 -20
  269. package/dist/tempo/session/client/SessionManager.js.map +1 -1
  270. package/dist/tempo/session/client/Transports.d.ts +9 -1
  271. package/dist/tempo/session/client/Transports.d.ts.map +1 -1
  272. package/dist/tempo/session/client/Transports.js +36 -13
  273. package/dist/tempo/session/client/Transports.js.map +1 -1
  274. package/dist/tempo/session/precompile/Chain.d.ts +27 -0
  275. package/dist/tempo/session/precompile/Chain.d.ts.map +1 -1
  276. package/dist/tempo/session/precompile/Chain.js +68 -7
  277. package/dist/tempo/session/precompile/Chain.js.map +1 -1
  278. package/dist/tempo/session/precompile/Protocol.js.map +1 -1
  279. package/dist/tempo/session/precompile/Voucher.d.ts +4 -4
  280. package/dist/tempo/session/precompile/Voucher.d.ts.map +1 -1
  281. package/dist/tempo/session/precompile/escrow.abi.d.ts +306 -306
  282. package/dist/tempo/session/precompile/escrow.abi.d.ts.map +1 -1
  283. package/dist/tempo/session/server/ChannelStore.d.ts +9 -0
  284. package/dist/tempo/session/server/ChannelStore.d.ts.map +1 -1
  285. package/dist/tempo/session/server/ChannelStore.js +16 -8
  286. package/dist/tempo/session/server/ChannelStore.js.map +1 -1
  287. package/dist/tempo/session/server/CredentialVerification.d.ts +30 -13
  288. package/dist/tempo/session/server/CredentialVerification.d.ts.map +1 -1
  289. package/dist/tempo/session/server/CredentialVerification.js +207 -13
  290. package/dist/tempo/session/server/CredentialVerification.js.map +1 -1
  291. package/dist/tempo/session/server/MeteredStream.d.ts +3 -0
  292. package/dist/tempo/session/server/MeteredStream.d.ts.map +1 -1
  293. package/dist/tempo/session/server/MeteredStream.js +3 -1
  294. package/dist/tempo/session/server/MeteredStream.js.map +1 -1
  295. package/dist/tempo/session/server/Session.d.ts +32 -21
  296. package/dist/tempo/session/server/Session.d.ts.map +1 -1
  297. package/dist/tempo/session/server/Session.js +116 -53
  298. package/dist/tempo/session/server/Session.js.map +1 -1
  299. package/dist/tempo/session/server/Sse.d.ts +3 -1
  300. package/dist/tempo/session/server/Sse.d.ts.map +1 -1
  301. package/dist/tempo/session/server/Sse.js +2 -1
  302. package/dist/tempo/session/server/Sse.js.map +1 -1
  303. package/dist/tempo/session/server/Transports.d.ts +1 -1
  304. package/dist/tempo/session/server/Transports.d.ts.map +1 -1
  305. package/dist/tempo/session/server/Transports.js +1 -0
  306. package/dist/tempo/session/server/Transports.js.map +1 -1
  307. package/dist/tempo/session/server/Ws.d.ts +6 -1
  308. package/dist/tempo/session/server/Ws.d.ts.map +1 -1
  309. package/dist/tempo/session/server/Ws.js +4 -0
  310. package/dist/tempo/session/server/Ws.js.map +1 -1
  311. package/dist/tempo/subscription/KeyAuthorization.d.ts +38 -866
  312. package/dist/tempo/subscription/KeyAuthorization.d.ts.map +1 -1
  313. package/dist/tempo/subscription/KeyAuthorization.js +14 -3
  314. package/dist/tempo/subscription/KeyAuthorization.js.map +1 -1
  315. package/dist/viem/Account.d.ts.map +1 -1
  316. package/dist/viem/Account.js.map +1 -1
  317. package/dist/viem/Client.d.ts.map +1 -1
  318. package/dist/viem/Client.js +6 -1
  319. package/dist/viem/Client.js.map +1 -1
  320. package/dist/web-bot-auth/Constants.d.ts +20 -0
  321. package/dist/web-bot-auth/Constants.d.ts.map +1 -0
  322. package/dist/web-bot-auth/Constants.js +24 -0
  323. package/dist/web-bot-auth/Constants.js.map +1 -0
  324. package/dist/web-bot-auth/Types.d.ts +10 -0
  325. package/dist/web-bot-auth/Types.d.ts.map +1 -0
  326. package/dist/web-bot-auth/Types.js +2 -0
  327. package/dist/web-bot-auth/Types.js.map +1 -0
  328. package/dist/web-bot-auth/client/index.d.ts +29 -0
  329. package/dist/web-bot-auth/client/index.d.ts.map +1 -0
  330. package/dist/web-bot-auth/client/index.js +64 -0
  331. package/dist/web-bot-auth/client/index.js.map +1 -0
  332. package/dist/web-bot-auth/index.d.ts +7 -0
  333. package/dist/web-bot-auth/index.d.ts.map +1 -0
  334. package/dist/web-bot-auth/index.js +7 -0
  335. package/dist/web-bot-auth/index.js.map +1 -0
  336. package/dist/web-bot-auth/internal/JwkThumbprint.d.ts +5 -0
  337. package/dist/web-bot-auth/internal/JwkThumbprint.d.ts.map +1 -0
  338. package/dist/web-bot-auth/internal/JwkThumbprint.js +20 -0
  339. package/dist/web-bot-auth/internal/JwkThumbprint.js.map +1 -0
  340. package/dist/web-bot-auth/internal/SignatureAgent.d.ts +3 -0
  341. package/dist/web-bot-auth/internal/SignatureAgent.d.ts.map +1 -0
  342. package/dist/web-bot-auth/internal/SignatureAgent.js +18 -0
  343. package/dist/web-bot-auth/internal/SignatureAgent.js.map +1 -0
  344. package/dist/web-bot-auth/server/index.d.ts +35 -0
  345. package/dist/web-bot-auth/server/index.d.ts.map +1 -0
  346. package/dist/web-bot-auth/server/index.js +88 -0
  347. package/dist/web-bot-auth/server/index.js.map +1 -0
  348. package/dist/x402/Assets.d.ts.map +1 -1
  349. package/dist/x402/Types.d.ts +6 -6
  350. package/dist/x402/Types.d.ts.map +1 -1
  351. package/dist/x402/server/EvmCharge.d.ts.map +1 -1
  352. package/dist/x402/server/EvmCharge.js +32 -20
  353. package/dist/x402/server/EvmCharge.js.map +1 -1
  354. package/package.json +20 -4
  355. package/src/Challenge.fuzz.test.ts +80 -47
  356. package/src/Challenge.test.ts +65 -0
  357. package/src/Challenge.ts +39 -35
  358. package/src/Method.ts +82 -68
  359. package/src/Store.test-d.ts +16 -0
  360. package/src/Store.test.ts +50 -0
  361. package/src/Store.ts +68 -0
  362. package/src/attestation/Attestation.integration.test.ts +208 -0
  363. package/src/attestation/Client.test.ts +83 -0
  364. package/src/attestation/Client.ts +34 -0
  365. package/src/attestation/Constants.ts +15 -0
  366. package/src/attestation/Server.test.ts +60 -0
  367. package/src/attestation/Server.ts +12 -0
  368. package/src/attestation/Types.test-d.ts +54 -0
  369. package/src/attestation/Types.ts +77 -0
  370. package/src/attestation/index.ts +5 -0
  371. package/src/attestation/internal/HttpMessageSignature.test.ts +101 -0
  372. package/src/attestation/internal/HttpMessageSignature.ts +429 -0
  373. package/src/attestation/internal/SigningContext.ts +13 -0
  374. package/src/bin.js +2 -0
  375. package/src/cli/cli.ts +1 -0
  376. package/src/cli/validate/payment.ts +18 -4
  377. package/src/cli/validate.test.ts +16 -0
  378. package/src/client/Mppx.test-d.ts +17 -0
  379. package/src/client/Mppx.test.ts +14 -14
  380. package/src/client/Mppx.ts +25 -4
  381. package/src/client/Transport.test.ts +12 -45
  382. package/src/client/Transport.ts +3 -24
  383. package/src/client/internal/Fetch.test.ts +77 -0
  384. package/src/client/internal/Fetch.ts +112 -14
  385. package/src/client/internal/MethodChallenge.ts +5 -0
  386. package/src/client/internal/MethodResponse.ts +28 -0
  387. package/src/discovery/OpenApi.test.ts +170 -0
  388. package/src/discovery/OpenApi.ts +16 -48
  389. package/src/discovery/internal/Metadata.ts +51 -0
  390. package/src/evm/server/Charge.ts +6 -1
  391. package/src/internal/AcceptPayment.test.ts +12 -8
  392. package/src/internal/types.ts +9 -0
  393. package/src/mcp/client/McpClient.integration.test.ts +19 -32
  394. package/src/middlewares/elysia.test.ts +2 -12
  395. package/src/middlewares/express.test.ts +2 -12
  396. package/src/middlewares/hono.test.ts +6 -9
  397. package/src/middlewares/nextjs.test.ts +2 -12
  398. package/src/proxy/Proxy.test.ts +26 -19
  399. package/src/proxy/Proxy.ts +147 -9
  400. package/src/proxy/Proxy.upstreamError.test.ts +364 -0
  401. package/src/proxy/Service.test.ts +73 -3
  402. package/src/proxy/Service.ts +50 -23
  403. package/src/proxy/services/anthropic.ts +1 -0
  404. package/src/proxy/services/hooks.test-d.ts +14 -0
  405. package/src/proxy/services/hooks.test.ts +44 -0
  406. package/src/proxy/services/openai.ts +1 -0
  407. package/src/proxy/services/stripe.ts +1 -0
  408. package/src/server/Methods.test-d.ts +88 -0
  409. package/src/server/Methods.test.ts +69 -0
  410. package/src/server/Mppx.test-d.ts +141 -7
  411. package/src/server/Mppx.test.ts +1017 -119
  412. package/src/server/Mppx.ts +350 -54
  413. package/src/stripe/internal/constants.ts +1 -1
  414. package/src/stripe/internal/types.ts +1 -0
  415. package/src/stripe/server/Charge.test-d.ts +16 -1
  416. package/src/stripe/server/Charge.test.ts +79 -0
  417. package/src/stripe/server/Charge.ts +54 -1
  418. package/src/stripe/server/Methods.test-d.ts +157 -0
  419. package/src/stripe/server/Methods.test.ts +403 -0
  420. package/src/stripe/server/Methods.ts +423 -6
  421. package/src/stripe/server/internal/deposit-address.ts +57 -0
  422. package/src/stripe/server/internal/html/node_modules/.bin/mppx +3 -3
  423. package/src/stripe/server/internal/html/package.json +1 -1
  424. package/src/stripe/server/internal/html.gen.ts +1 -1
  425. package/src/stripe/server/internal/record-payment.ts +66 -0
  426. package/src/stripe/server/internal/request.ts +49 -0
  427. package/src/tap/Constants.ts +32 -0
  428. package/src/tap/Tap.test.ts +125 -0
  429. package/src/tap/Types.ts +11 -0
  430. package/src/tap/client/index.ts +54 -0
  431. package/src/tap/index.ts +4 -0
  432. package/src/tap/server/index.ts +48 -0
  433. package/src/tempo/PublicExports.test-d.ts +3 -3
  434. package/src/tempo/client/Charge.ts +1 -19
  435. package/src/tempo/internal/address.test.ts +42 -0
  436. package/src/tempo/internal/address.ts +3 -3
  437. package/src/tempo/internal/auto-swap.test.ts +4 -4
  438. package/src/tempo/internal/auto-swap.ts +7 -50
  439. package/src/tempo/legacy/README.md +5 -5
  440. package/src/tempo/legacy/index.ts +1 -3
  441. package/src/tempo/server/AtomicStore.test-d.ts +13 -0
  442. package/src/tempo/server/Charge.test.ts +19 -84
  443. package/src/tempo/server/Charge.ts +92 -56
  444. package/src/tempo/server/Methods.ts +0 -20
  445. package/src/tempo/server/Relay.test.ts +161 -7
  446. package/src/tempo/server/Relay.ts +15 -6
  447. package/src/tempo/server/SponsorBudget.test.ts +29 -0
  448. package/src/tempo/server/SponsorBudget.ts +7 -1
  449. package/src/tempo/server/Subscription.ts +4 -1
  450. package/src/tempo/server/index.ts +1 -1
  451. package/src/tempo/server/internal/html/node_modules/.bin/mppx +3 -3
  452. package/src/tempo/server/internal/html/package.json +1 -1
  453. package/src/tempo/server/internal/html.gen.ts +1 -1
  454. package/src/tempo/server/internal/transport.test.ts +22 -3
  455. package/src/tempo/server/internal/transport.ts +15 -3
  456. package/src/tempo/session/README.md +119 -0
  457. package/src/tempo/session/client/Session.test.ts +299 -33
  458. package/src/tempo/session/client/Session.ts +152 -16
  459. package/src/tempo/session/client/SessionManager.test.ts +216 -9
  460. package/src/tempo/session/client/SessionManager.ts +63 -17
  461. package/src/tempo/session/client/Transports.test.ts +22 -0
  462. package/src/tempo/session/client/Transports.ts +58 -22
  463. package/src/tempo/session/precompile/Chain.ts +131 -11
  464. package/src/tempo/session/server/ChannelStore.ts +33 -12
  465. package/src/tempo/session/server/CredentialVerification.test.ts +4 -4
  466. package/src/tempo/session/server/CredentialVerification.ts +340 -28
  467. package/src/tempo/session/server/MeteredStream.ts +5 -1
  468. package/src/tempo/session/server/Session.test.ts +483 -36
  469. package/src/tempo/session/server/Session.ts +159 -60
  470. package/src/tempo/session/server/Sse.test.ts +77 -0
  471. package/src/tempo/session/server/Sse.ts +8 -1
  472. package/src/tempo/session/server/Transports.ts +2 -1
  473. package/src/tempo/session/server/Ws.test.ts +171 -0
  474. package/src/tempo/session/server/Ws.ts +10 -1
  475. package/src/tempo/subscription/KeyAuthorization.test.ts +70 -1
  476. package/src/tempo/subscription/KeyAuthorization.ts +14 -3
  477. package/src/viem/Client.test.ts +18 -1
  478. package/src/viem/Client.ts +7 -1
  479. package/src/web-bot-auth/Constants.ts +24 -0
  480. package/src/web-bot-auth/Types.ts +9 -0
  481. package/src/web-bot-auth/WebBotAuth.test.ts +182 -0
  482. package/src/web-bot-auth/client/index.ts +84 -0
  483. package/src/web-bot-auth/index.ts +6 -0
  484. package/src/web-bot-auth/internal/JwkThumbprint.ts +21 -0
  485. package/src/web-bot-auth/internal/SignatureAgent.ts +18 -0
  486. package/src/web-bot-auth/server/index.ts +113 -0
  487. package/src/x402/Exact.e2e.test.ts +121 -81
  488. package/src/x402/Exact.localnet.test.ts +1 -1
  489. package/src/x402/server/EvmCharge.ts +35 -19
  490. package/dist/tempo/legacy/server/Session.d.ts +0 -208
  491. package/dist/tempo/legacy/server/Session.d.ts.map +0 -1
  492. package/dist/tempo/legacy/server/Session.js +0 -698
  493. package/dist/tempo/legacy/server/Session.js.map +0 -1
  494. package/dist/tempo/legacy/server/index.d.ts +0 -5
  495. package/dist/tempo/legacy/server/index.d.ts.map +0 -1
  496. package/dist/tempo/legacy/server/index.js +0 -5
  497. package/dist/tempo/legacy/server/index.js.map +0 -1
  498. package/dist/tempo/legacy/session/ChannelStore.d.ts +0 -22
  499. package/dist/tempo/legacy/session/ChannelStore.d.ts.map +0 -1
  500. package/dist/tempo/legacy/session/ChannelStore.js +0 -6
  501. package/dist/tempo/legacy/session/ChannelStore.js.map +0 -1
  502. package/src/tempo/legacy/server/Defaults.test-d.ts +0 -9
  503. package/src/tempo/legacy/server/Session.test.ts +0 -6370
  504. package/src/tempo/legacy/server/Session.ts +0 -1024
  505. package/src/tempo/legacy/server/index.ts +0 -4
  506. package/src/tempo/legacy/session/ChannelStore.test.ts +0 -58
  507. package/src/tempo/legacy/session/ChannelStore.ts +0 -39
@@ -316,8 +316,8 @@ function readTransactionType(value: unknown): 'transaction' {
316
316
  throw new VerificationFailedError({ reason: 'invalid session credential transaction type' })
317
317
  }
318
318
 
319
- /** Shared inputs required to verify a single precompile session credential payload. */
320
- export type VerifyCredentialPayloadParameters = {
319
+ /** Shared inputs required to broadcast a verified precompile session credential payload. */
320
+ export type BroadcastCredentialPayloadParameters = {
321
321
  /** Optional account override used for payee-side close settlement. */
322
322
  account?: viem_Account | undefined
323
323
  /** Challenge echoed by the credential. */
@@ -352,24 +352,31 @@ export type VerifyCredentialPayloadParameters = {
352
352
  store: ChannelStore.ChannelStore
353
353
  }
354
354
 
355
- /** Narrows shared credential verification inputs to one payload action. */
356
- export type VerifyCredentialActionParameters<action extends SessionCredentialPayload['action']> =
357
- Omit<VerifyCredentialPayloadParameters, 'payload'> & {
355
+ /** @deprecated Use {@link BroadcastCredentialPayloadParameters}. */
356
+ export type VerifyCredentialPayloadParameters = BroadcastCredentialPayloadParameters
357
+
358
+ /** Narrows shared credential broadcast inputs to one payload action. */
359
+ export type BroadcastCredentialActionParameters<action extends SessionCredentialPayload['action']> =
360
+ Omit<BroadcastCredentialPayloadParameters, 'payload'> & {
358
361
  /** Credential payload for the selected action. */
359
362
  payload: Extract<SessionCredentialPayload, { action: action }>
360
363
  }
361
364
 
362
- /** Inputs for verifying an open transaction credential and initial voucher. */
363
- export type OpenCredentialActionParameters = VerifyCredentialActionParameters<'open'>
365
+ /** @deprecated Use {@link BroadcastCredentialActionParameters}. */
366
+ export type VerifyCredentialActionParameters<action extends SessionCredentialPayload['action']> =
367
+ BroadcastCredentialActionParameters<action>
368
+
369
+ /** Inputs for broadcasting an open transaction credential and initial voucher. */
370
+ export type OpenCredentialActionParameters = BroadcastCredentialActionParameters<'open'>
364
371
 
365
- /** Inputs for verifying a top-up transaction credential. */
366
- export type TopUpCredentialActionParameters = VerifyCredentialActionParameters<'topUp'>
372
+ /** Inputs for broadcasting a top-up transaction credential. */
373
+ export type TopUpCredentialActionParameters = BroadcastCredentialActionParameters<'topUp'>
367
374
 
368
- /** Inputs for verifying and accepting an incremental voucher credential. */
369
- export type VoucherCredentialActionParameters = VerifyCredentialActionParameters<'voucher'>
375
+ /** Inputs for broadcasting and accepting an incremental voucher credential. */
376
+ export type VoucherCredentialActionParameters = BroadcastCredentialActionParameters<'voucher'>
370
377
 
371
- /** Inputs for verifying and settling a cooperative close credential. */
372
- export type CloseCredentialActionParameters = VerifyCredentialActionParameters<'close'>
378
+ /** Inputs for broadcasting and settling a cooperative close credential. */
379
+ export type CloseCredentialActionParameters = BroadcastCredentialActionParameters<'close'>
373
380
 
374
381
  const refreshOnChainVerificationCache = {
375
382
  close: false,
@@ -378,18 +385,323 @@ const refreshOnChainVerificationCache = {
378
385
  voucher: false,
379
386
  } satisfies Record<SessionCredentialPayload['action'], boolean>
380
387
 
381
- /** Verifies a session credential payload and applies the action-specific state transition. */
382
- export async function verifyCredentialPayload(
383
- context: VerifyCredentialPayloadParameters,
388
+ /** Inputs for validating a session credential without applying its state transition. */
389
+ export type ValidateCredentialPayloadParameters = Pick<
390
+ BroadcastCredentialPayloadParameters,
391
+ | 'account'
392
+ | 'channelStateTtl'
393
+ | 'chainId'
394
+ | 'client'
395
+ | 'credentialSource'
396
+ | 'escrow'
397
+ | 'expectedOperator'
398
+ | 'feePayer'
399
+ | 'feePayerPolicy'
400
+ | 'lastOnChainVerified'
401
+ | 'minVoucherDelta'
402
+ | 'payload'
403
+ | 'store'
404
+ | 'challenge'
405
+ >
406
+
407
+ /** Non-mutating result produced by session credential validation. */
408
+ export type CredentialPayloadValidation = {
409
+ /** Session action validated from the credential. */
410
+ action: SessionCredentialPayload['action']
411
+ /** Normalized channel ID targeted by the credential. */
412
+ channelId: Hex
413
+ }
414
+
415
+ /** Validates all action-specific session credential invariants without changing payment state. */
416
+ export async function validateCredentialPayload(
417
+ parameters: ValidateCredentialPayloadParameters,
418
+ ): Promise<CredentialPayloadValidation> {
419
+ const { payload } = parameters
420
+ switch (payload.action) {
421
+ case 'open':
422
+ await validateOpenCredential(parameters, payload)
423
+ break
424
+ case 'topUp':
425
+ await validateTopUpCredential(parameters, payload)
426
+ break
427
+ case 'voucher':
428
+ await validateVoucherCredential(parameters, payload)
429
+ break
430
+ case 'close':
431
+ await validateCloseCredential(parameters, payload)
432
+ break
433
+ }
434
+ return { action: payload.action, channelId: ChannelStore.normalizeChannelId(payload.channelId) }
435
+ }
436
+
437
+ async function validateOpenCredential(
438
+ parameters: ValidateCredentialPayloadParameters,
439
+ payload: Extract<SessionCredentialPayload, { action: 'open' }>,
440
+ ) {
441
+ const { challenge, chainId, client, escrow } = parameters
442
+ const request = getChallengePaymentFields(challenge)
443
+ const expectedOperator = parameters.expectedOperator ?? zeroAddress
444
+ const cumulativeAmount = uint96(BigInt(payload.cumulativeAmount))
445
+ assertDescriptor(payload)
446
+ if (
447
+ payload.authorizedSigner !== undefined &&
448
+ !isAddressEqual(payload.authorizedSigner, payload.descriptor.authorizedSigner)
449
+ )
450
+ throw new VerificationFailedError({
451
+ reason: 'credential authorizedSigner does not match descriptor',
452
+ })
453
+ const channelId = ChannelStore.normalizeChannelId(payload.channelId)
454
+ validateChannelDescriptor(
455
+ payload.descriptor,
456
+ channelId,
457
+ chainId,
458
+ escrow,
459
+ request.recipient,
460
+ request.currency,
461
+ expectedOperator,
462
+ )
463
+ const transaction = Chain.validateOpenCredentialTransaction({
464
+ challengeExpires: challenge.expires,
465
+ chainId,
466
+ escrowContract: escrow,
467
+ expectedAuthorizedSigner: payload.descriptor.authorizedSigner,
468
+ expectedChannelId: channelId,
469
+ expectedCurrency: request.currency,
470
+ expectedOperator,
471
+ expectedPayee: request.recipient,
472
+ expectedExpiringNonceHash: payload.descriptor.expiringNonceHash,
473
+ expectedPayer: payload.descriptor.payer,
474
+ feePayer: parameters.feePayer,
475
+ feePayerPolicy: parameters.feePayerPolicy,
476
+ serializedTransaction: payload.transaction,
477
+ })
478
+ assertOpenCredentialCoversRequest({
479
+ cumulativeAmount,
480
+ openDeposit: transaction.openDeposit,
481
+ requestAmount: request.amount,
482
+ })
483
+ assertSameDescriptor(transaction.descriptor, payload.descriptor)
484
+ if (cumulativeAmount > transaction.openDeposit)
485
+ throw new AmountExceedsDepositError({ reason: 'voucher amount exceeds open deposit' })
486
+ const valid = await Voucher.verifyVoucher(
487
+ escrow,
488
+ chainId,
489
+ { channelId, cumulativeAmount, signature: payload.signature },
490
+ authorizedSigner(transaction.descriptor),
491
+ )
492
+ if (!valid) throw new InvalidSignatureError({ reason: 'invalid voucher signature' })
493
+ await Chain.simulateCredentialTransaction({
494
+ client,
495
+ feePayer: parameters.feePayer,
496
+ transaction: transaction.transaction,
497
+ })
498
+ }
499
+
500
+ async function validateTopUpCredential(
501
+ parameters: ValidateCredentialPayloadParameters,
502
+ payload: Extract<SessionCredentialPayload, { action: 'topUp' }>,
503
+ ) {
504
+ const { challenge, chainId, client, escrow, store } = parameters
505
+ const request = getChallengePaymentFields(challenge)
506
+ const expectedOperator = parameters.expectedOperator ?? zeroAddress
507
+ const additionalDeposit = uint96(BigInt(payload.additionalDeposit))
508
+ assertDescriptor(payload)
509
+ const channelId = ChannelStore.normalizeChannelId(payload.channelId)
510
+ validateChannelDescriptor(
511
+ payload.descriptor,
512
+ channelId,
513
+ chainId,
514
+ escrow,
515
+ request.recipient,
516
+ request.currency,
517
+ expectedOperator,
518
+ )
519
+ const channel = await ChannelStore.loadPrecompileChannel({
520
+ descriptor: payload.descriptor,
521
+ channelId,
522
+ chainId,
523
+ escrow,
524
+ store,
525
+ validateDescriptor: true,
526
+ })
527
+ const transaction = Chain.validateTopUpCredentialTransaction({
528
+ additionalDeposit,
529
+ challengeExpires: challenge.expires,
530
+ chainId,
531
+ descriptor: channel.descriptor,
532
+ escrowContract: escrow,
533
+ expectedChannelId: channelId,
534
+ expectedCurrency: request.currency,
535
+ feePayer: parameters.feePayer,
536
+ feePayerPolicy: parameters.feePayerPolicy,
537
+ serializedTransaction: payload.transaction,
538
+ })
539
+ validateChannelState(await Chain.getChannelState(client, channelId, escrow))
540
+ await Chain.simulateCredentialTransaction({
541
+ client,
542
+ feePayer: parameters.feePayer,
543
+ transaction: transaction.transaction,
544
+ })
545
+ }
546
+
547
+ async function validateVoucherCredential(
548
+ parameters: ValidateCredentialPayloadParameters,
549
+ payload: Extract<SessionCredentialPayload, { action: 'voucher' }>,
550
+ ) {
551
+ const {
552
+ challenge,
553
+ chainId,
554
+ client,
555
+ credentialSource,
556
+ escrow,
557
+ minVoucherDelta,
558
+ store,
559
+ channelStateTtl,
560
+ lastOnChainVerified,
561
+ } = parameters
562
+ const request = getChallengePaymentFields(challenge)
563
+ const expectedOperator = parameters.expectedOperator ?? zeroAddress
564
+ const channelId = ChannelStore.normalizeChannelId(payload.channelId)
565
+ const voucher = Voucher.parseVoucherFromPayload(
566
+ channelId,
567
+ payload.cumulativeAmount,
568
+ payload.signature,
569
+ )
570
+ assertDescriptor(payload)
571
+ validateChannelDescriptor(
572
+ payload.descriptor,
573
+ channelId,
574
+ chainId,
575
+ escrow,
576
+ request.recipient,
577
+ request.currency,
578
+ expectedOperator,
579
+ )
580
+ const channel = await ChannelStore.loadPrecompileChannel({
581
+ descriptor: payload.descriptor,
582
+ channelId,
583
+ chainId,
584
+ escrow,
585
+ store,
586
+ validateDescriptor: true,
587
+ })
588
+ assertCredentialSourceCanSpend({ chainId, channel, source: credentialSource })
589
+ if (channel.finalized) throw new ChannelClosedError({ reason: 'channel is finalized' })
590
+ const channelState = await resolveVoucherChannelState({
591
+ channel,
592
+ channelId,
593
+ channelStateTtl,
594
+ client,
595
+ escrow,
596
+ lastOnChainVerified,
597
+ })
598
+ await ChannelStore.validateVoucher({
599
+ channel,
600
+ channelState,
601
+ methodDetails: { chainId, escrowContract: escrow },
602
+ minVoucherDelta,
603
+ voucher,
604
+ })
605
+ }
606
+
607
+ async function resolveVoucherChannelState(parameters: {
608
+ channel: ChannelStore.State
609
+ channelId: Hex
610
+ channelStateTtl: number
611
+ client: Chain.TransactionClient
612
+ escrow: Address
613
+ lastOnChainVerified: Map<Hex, number>
614
+ }): Promise<Chain.ChannelState> {
615
+ const { channel, channelId, channelStateTtl, client, escrow, lastOnChainVerified } = parameters
616
+ const isStale = Date.now() - (lastOnChainVerified.get(channelId) ?? 0) > channelStateTtl
617
+ const state = isStale ? await Chain.getChannelState(client, channelId, escrow) : undefined
618
+ if (state) lastOnChainVerified.set(channelId, Date.now())
619
+ return {
620
+ deposit: state?.deposit ?? uint96(channel.deposit),
621
+ settled: state?.settled ?? uint96(channel.settledOnChain),
622
+ closeRequestedAt: state?.closeRequestedAt ?? Number(channel.closeRequestedAt),
623
+ }
624
+ }
625
+
626
+ async function validateCloseCredential(
627
+ parameters: ValidateCredentialPayloadParameters,
628
+ payload: Extract<SessionCredentialPayload, { action: 'close' }>,
629
+ ) {
630
+ const { challenge, chainId, client, escrow, store } = parameters
631
+ const request = getChallengePaymentFields(challenge)
632
+ const expectedOperator = parameters.expectedOperator ?? zeroAddress
633
+ const cumulativeAmount = uint96(BigInt(payload.cumulativeAmount))
634
+ const channelId = ChannelStore.normalizeChannelId(payload.channelId)
635
+ assertDescriptor(payload)
636
+ validateChannelDescriptor(
637
+ payload.descriptor,
638
+ channelId,
639
+ chainId,
640
+ escrow,
641
+ request.recipient,
642
+ request.currency,
643
+ expectedOperator,
644
+ )
645
+ const channel = await ChannelStore.loadPrecompileChannel({
646
+ descriptor: payload.descriptor,
647
+ channelId,
648
+ chainId,
649
+ escrow,
650
+ store,
651
+ })
652
+ if (channel.finalized) throw new ChannelClosedError({ reason: 'channel is already finalized' })
653
+ const state = await Chain.getChannelState(client, channelId, escrow)
654
+ if (state.closeRequestedAt !== 0)
655
+ throw new ChannelClosedError({ reason: 'channel has a pending close request' })
656
+ if (state.deposit === 0n && (cumulativeAmount !== 0n || channel.spent !== 0n))
657
+ throw new ChannelClosedError({ reason: 'channel deposit is zero (settled)' })
658
+ if (cumulativeAmount < channel.spent)
659
+ throw new VerificationFailedError({
660
+ reason: `close voucher amount must be >= ${channel.spent} (spent)`,
661
+ })
662
+ if (cumulativeAmount < state.settled)
663
+ throw new VerificationFailedError({
664
+ reason: `close voucher amount must be >= ${state.settled} (on-chain settled)`,
665
+ })
666
+ const valid = await Voucher.verifyVoucher(
667
+ escrow,
668
+ chainId,
669
+ { channelId, cumulativeAmount, signature: payload.signature },
670
+ channel.authorizedSigner,
671
+ )
672
+ if (!valid) throw new InvalidSignatureError({ reason: 'invalid voucher signature' })
673
+ const captureAmount = uint96(channel.spent > state.settled ? channel.spent : state.settled)
674
+ if (captureAmount > state.deposit)
675
+ throw new AmountExceedsDepositError({ reason: 'close capture amount exceeds on-chain deposit' })
676
+ const account = parameters.account ?? getClientAccount(client)
677
+ assertSettlementSender({
678
+ operation: 'close',
679
+ channelId,
680
+ operator: channel.operator,
681
+ payee: channel.payee,
682
+ sender: account?.address,
683
+ })
684
+ }
685
+
686
+ /** Broadcasts a validated session credential payload and applies its state transition. */
687
+ export async function broadcastCredentialPayload(
688
+ context: BroadcastCredentialPayloadParameters,
384
689
  ): Promise<SessionReceipt> {
385
- const receipt = await verifyCredentialAction(context)
690
+ const receipt = await broadcastCredentialAction(context)
386
691
  if (refreshOnChainVerificationCache[context.payload.action])
387
692
  context.lastOnChainVerified.set(receipt.channelId, Date.now())
388
693
  return receipt
389
694
  }
390
695
 
391
- function verifyCredentialAction(
696
+ /** @deprecated Use {@link broadcastCredentialPayload}. */
697
+ export async function verifyCredentialPayload(
392
698
  context: VerifyCredentialPayloadParameters,
699
+ ): Promise<SessionReceipt> {
700
+ return broadcastCredentialPayload(context)
701
+ }
702
+
703
+ function broadcastCredentialAction(
704
+ context: BroadcastCredentialPayloadParameters,
393
705
  ): Promise<SessionReceipt> {
394
706
  const { payload } = context
395
707
  switch (payload.action) {
@@ -405,9 +717,9 @@ function verifyCredentialAction(
405
717
  }
406
718
 
407
719
  function actionContext<action extends SessionCredentialPayload['action']>(
408
- context: VerifyCredentialPayloadParameters,
720
+ context: BroadcastCredentialPayloadParameters,
409
721
  payload: Extract<SessionCredentialPayload, { action: action }>,
410
- ): VerifyCredentialActionParameters<action> {
722
+ ): BroadcastCredentialActionParameters<action> {
411
723
  return { ...context, payload }
412
724
  }
413
725
 
@@ -597,14 +909,14 @@ async function handleVoucherCredential(
597
909
  })
598
910
  assertCredentialSourceCanSpend({ chainId, channel, source: credentialSource })
599
911
  if (channel.finalized) throw new ChannelClosedError({ reason: 'channel is finalized' })
600
- const isStale = Date.now() - (lastOnChainVerified.get(channelId) ?? 0) > channelStateTtl
601
- const state = isStale ? await Chain.getChannelState(client, channelId, escrow) : undefined
602
- if (state) lastOnChainVerified.set(channelId, Date.now())
603
- const channelState = {
604
- deposit: state?.deposit ?? uint96(channel.deposit),
605
- settled: state?.settled ?? uint96(channel.settledOnChain),
606
- closeRequestedAt: state?.closeRequestedAt ?? Number(channel.closeRequestedAt),
607
- }
912
+ const channelState = await resolveVoucherChannelState({
913
+ channel,
914
+ channelId,
915
+ channelStateTtl,
916
+ client,
917
+ escrow,
918
+ lastOnChainVerified,
919
+ })
608
920
  if (channelState.closeRequestedAt !== 0) {
609
921
  await store.updateChannel(channelId, (current) =>
610
922
  current
@@ -1,5 +1,6 @@
1
1
  import type { Hex } from 'viem'
2
2
 
3
+ import type { MaybePromise } from '../../../internal/types.js'
3
4
  import type { NeedVoucherEvent } from '../precompile/Protocol.js'
4
5
  import * as ChannelStore from './ChannelStore.js'
5
6
  import { commitReservedCharges, reserveChargeOrWait } from './Transports.js'
@@ -37,6 +38,8 @@ export type MeteredStreamOptions = {
37
38
  formatNeedVoucher(parameters: NeedVoucherEvent): string
38
39
  /** Async source or manual-charge source. */
39
40
  generate: SessionStreamGenerator
41
+ /** Runs after a nonzero reserved charge has been committed. */
42
+ onChargeCommitted?: ((channel: ChannelStore.State) => MaybePromise<unknown>) | undefined
40
43
  /** Store polling interval when `waitForUpdate` is unavailable. */
41
44
  pollIntervalMs: number
42
45
  /** Pre-authorized units that may be emitted without reserving new voucher headroom. */
@@ -82,7 +85,7 @@ export async function* meterIterable(options: MeteredStreamOptions): AsyncGenera
82
85
  for await (const value of iterable) {
83
86
  if (options.signal?.aborted) break
84
87
  if (typeof options.generate !== 'function') await charge()
85
- await commitReservedCharges({
88
+ const channel = await commitReservedCharges({
86
89
  store: options.store,
87
90
  channelId: options.channelId,
88
91
  amount: reservedAmount,
@@ -90,6 +93,7 @@ export async function* meterIterable(options: MeteredStreamOptions): AsyncGenera
90
93
  })
91
94
  reservedAmount = 0n
92
95
  reservedUnits = 0
96
+ if (channel) await options.onChargeCommitted?.(channel)
93
97
  yield value
94
98
  }
95
99
  }