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
@@ -310,6 +310,28 @@ describe('HttpManagement', () => {
310
310
  expect(restoreCumulative).toHaveBeenCalledWith(channelId, 5n)
311
311
  })
312
312
 
313
+ test('retryHttpPaymentRequired restores cumulative authorization when retry throws', async () => {
314
+ const entry = channel({ cumulativeAmount: 5n })
315
+ const restoreCumulative = vi.fn()
316
+
317
+ await expect(
318
+ retryHttpPaymentRequired({
319
+ createSessionCredential: async () => 'voucher-credential',
320
+ fetch: async () => {
321
+ throw new Error('network failed')
322
+ },
323
+ getChannel: () => entry,
324
+ input: 'https://example.test/resource',
325
+ response: response402(challenge(snapshot())),
326
+ restoreCumulative,
327
+ setChallenge() {},
328
+ topUpIfNeeded: async () => {},
329
+ }),
330
+ ).rejects.toThrow('network failed')
331
+
332
+ expect(restoreCumulative).toHaveBeenCalledWith(channelId, 5n)
333
+ })
334
+
313
335
  test('closeHttpSession posts a close credential and parses the receipt', async () => {
314
336
  const entry = channel()
315
337
  const createSessionCredential = vi.fn(async (_challenge, context: SessionContext) => {
@@ -47,6 +47,8 @@ export const WebSocketReadyState = {
47
47
  /** Client-side close code used for payment protocol errors. */
48
48
  export const ClientWebSocketProtocolErrorCloseCode = 3008
49
49
 
50
+ const webSocketChallengeRefreshWindowMs = 5_000
51
+
50
52
  type EventType = 'close' | 'error' | 'message' | 'open'
51
53
  type ManagedEventMap = {
52
54
  close: { code: number; reason: string; type: 'close'; wasClean: boolean }
@@ -489,7 +491,7 @@ export type RetryHttpPaymentRequiredParameters = {
489
491
  /** Failed HTTP response that may contain a session challenge. */
490
492
  response: Response
491
493
  /** Restores local cumulative authorization if the voucher retry fails. */
492
- restoreCumulative(channelId: Hex.Hex, cumulativeAmount: bigint): void
494
+ restoreCumulative(channelId: Hex.Hex, cumulativeAmount: bigint): void | Promise<void>
493
495
  /** Stores the selected follow-up challenge on the manager. */
494
496
  setChallenge(challenge: TempoSessionChallenge): void
495
497
  /** Performs automatic top-up before the voucher retry when deposit is insufficient. */
@@ -692,18 +694,25 @@ export async function retryHttpPaymentRequired(
692
694
  currentChannel.cumulativeAmount > requiredCumulative
693
695
  ? currentChannel.cumulativeAmount
694
696
  : requiredCumulative
695
- const credential = await parameters.createSessionCredential(challenge, {
696
- action: 'voucher',
697
- channelId: snapshot.channelId,
698
- descriptor: currentChannel.descriptor,
699
- cumulativeAmountRaw: cumulativeAmount.toString(),
700
- })
701
- const retry = await parameters.fetch(
702
- parameters.input,
703
- requestInitWithAuthorization(parameters.input, parameters.init, credential),
704
- )
697
+ const restore = () => parameters.restoreCumulative(snapshot.channelId, cumulativeBeforeVoucher)
698
+ let retry: Response
699
+ try {
700
+ const credential = await parameters.createSessionCredential(challenge, {
701
+ action: 'voucher',
702
+ channelId: snapshot.channelId,
703
+ descriptor: currentChannel.descriptor,
704
+ cumulativeAmountRaw: cumulativeAmount.toString(),
705
+ })
706
+ retry = await parameters.fetch(
707
+ parameters.input,
708
+ requestInitWithAuthorization(parameters.input, parameters.init, credential),
709
+ )
710
+ } catch (error) {
711
+ await restore()
712
+ throw error
713
+ }
705
714
  if (!retry.ok && !retry.headers.get(Constants.Headers.paymentReceipt)) {
706
- parameters.restoreCumulative(snapshot.channelId, cumulativeBeforeVoucher)
715
+ await restore()
707
716
  }
708
717
  return retry
709
718
  }
@@ -1110,6 +1119,15 @@ export type PrepareWebSocketSessionParameters = {
1110
1119
  signal?: AbortSignal | undefined
1111
1120
  }
1112
1121
 
1122
+ /** Inputs for probing a paid WebSocket endpoint without creating a credential. */
1123
+ export type ProbeWebSocketSessionParameters = Omit<
1124
+ PrepareWebSocketSessionParameters,
1125
+ 'createSessionCredential'
1126
+ >
1127
+
1128
+ /** Result of resolving the current payment challenge for a WebSocket endpoint. */
1129
+ export type ProbedWebSocketSession = Omit<PreparedWebSocketSession, 'credential'>
1130
+
1113
1131
  /** Result of the HTTP probe and opening credential creation for a WebSocket session. */
1114
1132
  export type PreparedWebSocketSession = {
1115
1133
  /** Selected tempo/session challenge from the HTTP probe. */
@@ -1173,6 +1191,8 @@ export type OpenWebSocketSessionParameters = {
1173
1191
  getChannel(): ChannelEntry | null
1174
1192
  /** Stores the active socket state in the manager. */
1175
1193
  setSocketSession(session: ActiveSocketSession): void
1194
+ /** Fetches the route's current challenge after the active one expires. */
1195
+ refreshChallenge(): Promise<TempoSessionChallenge>
1176
1196
  /** Validates a cumulative amount against local client policy. */
1177
1197
  assertVoucherWithinLocalLimit(cumulativeAmount: bigint): void
1178
1198
  /** Applies an incoming receipt to manager state. */
@@ -1213,10 +1233,10 @@ export type ValidateSocketPaymentReceiptParameters = ExpectedSocketReceiptParame
1213
1233
  expectedCloseAmount: string | null
1214
1234
  }
1215
1235
 
1216
- /** Probes a WebSocket endpoint over HTTP and creates the opening credential. */
1217
- export async function prepareWebSocketSession(
1218
- parameters: PrepareWebSocketSessionParameters,
1219
- ): Promise<PreparedWebSocketSession> {
1236
+ /** Probes a WebSocket endpoint over HTTP and returns its current session challenge. */
1237
+ export async function probeWebSocketSession(
1238
+ parameters: ProbeWebSocketSessionParameters,
1239
+ ): Promise<ProbedWebSocketSession> {
1220
1240
  const wsUrl = new URL(parameters.input.toString())
1221
1241
  const httpUrl = webSocketProbeUrl(wsUrl)
1222
1242
  parameters.onProbeUrl?.(httpUrl)
@@ -1239,12 +1259,22 @@ export async function prepareWebSocketSession(
1239
1259
 
1240
1260
  return {
1241
1261
  challenge,
1242
- credential: await parameters.createSessionCredential(challenge, {}),
1243
1262
  httpUrl,
1244
1263
  wsUrl,
1245
1264
  }
1246
1265
  }
1247
1266
 
1267
+ /** Probes a WebSocket endpoint over HTTP and creates the opening credential. */
1268
+ export async function prepareWebSocketSession(
1269
+ parameters: PrepareWebSocketSessionParameters,
1270
+ ): Promise<PreparedWebSocketSession> {
1271
+ const probed = await probeWebSocketSession(parameters)
1272
+ return {
1273
+ ...probed,
1274
+ credential: await parameters.createSessionCredential(probed.challenge, {}),
1275
+ }
1276
+ }
1277
+
1248
1278
  /** Creates the initial runtime state for a paid WebSocket from its opening credential. */
1249
1279
  export function createActiveSocketSession(
1250
1280
  parameters: CreateActiveSocketSessionParameters,
@@ -1452,9 +1482,18 @@ async function handleNeedVoucher(
1452
1482
  event: NeedVoucherEvent,
1453
1483
  ) {
1454
1484
  try {
1485
+ let challenge = parameters.driver.challenge
1486
+ if (
1487
+ challenge.expires &&
1488
+ new Date(challenge.expires).getTime() <= Date.now() + webSocketChallengeRefreshWindowMs
1489
+ ) {
1490
+ challenge = await parameters.driver.refreshChallenge()
1491
+ parameters.driver.challenge = challenge
1492
+ parameters.socketState.challenge = challenge
1493
+ }
1455
1494
  const resolution = await resolveNeedVoucherContext({
1456
1495
  assertVoucherWithinLocalLimit: parameters.driver.assertVoucherWithinLocalLimit,
1457
- challenge: parameters.driver.challenge,
1496
+ challenge,
1458
1497
  event,
1459
1498
  expectedChannelId: parameters.socketState.channelId,
1460
1499
  getChannel: parameters.driver.getChannel,
@@ -1469,10 +1508,7 @@ async function handleNeedVoucher(
1469
1508
  )
1470
1509
  return
1471
1510
  }
1472
- const voucher = await parameters.driver.createSessionCredential(
1473
- parameters.driver.challenge,
1474
- resolution.context,
1475
- )
1511
+ const voucher = await parameters.driver.createSessionCredential(challenge, resolution.context)
1476
1512
  parameters.rawSocket.send(Ws.formatAuthorizationMessage(voucher))
1477
1513
  } catch (error) {
1478
1514
  parameters.failSocketFlow(
@@ -522,6 +522,55 @@ async function simulateTempoTransaction(client: Client, request: unknown) {
522
522
  await call(client, request as never)
523
523
  }
524
524
 
525
+ /** Simulates an unsponsored client-signed session transaction without broadcasting it. */
526
+ export async function simulateCredentialTransaction(parameters: {
527
+ /** viem client used for the read-only execution simulation. */
528
+ client: TransactionClient
529
+ /** Fee-payer configuration for the eventual broadcast. Sponsored transactions are simulated after completion. */
530
+ feePayer?: Account | true | undefined
531
+ /** Parsed client-signed Tempo transaction. */
532
+ transaction: ReturnType<(typeof Transaction)['deserialize']>
533
+ }): Promise<void> {
534
+ if (parameters.feePayer) return
535
+ await simulateTempoTransaction(
536
+ parameters.client,
537
+ FeePayer.simulationTransaction(parameters.transaction, { feePayer: false }),
538
+ )
539
+ }
540
+
541
+ function validateCredentialSponsorship(parameters: {
542
+ allowedFeeTokens: readonly Address[]
543
+ challengeExpires?: string | undefined
544
+ chainId: number
545
+ details: Record<string, string>
546
+ feePayer?: Account | true | undefined
547
+ feePayerPolicy?: Partial<FeePayer.Policy> | undefined
548
+ transaction: ReturnType<(typeof Transaction)['deserialize']>
549
+ }) {
550
+ const {
551
+ allowedFeeTokens,
552
+ challengeExpires,
553
+ chainId,
554
+ details,
555
+ feePayer,
556
+ feePayerPolicy,
557
+ transaction,
558
+ } = parameters
559
+ if (!feePayer || feePayer === true) return
560
+ FeePayer.prepareSponsoredTransaction({
561
+ account: feePayer,
562
+ allowedFeeTokens,
563
+ challengeExpires,
564
+ chainId,
565
+ details,
566
+ policy: feePayerPolicy,
567
+ transaction: {
568
+ ...transaction,
569
+ ...(allowedFeeTokens[0] ? { feeToken: transaction.feeToken ?? allowedFeeTokens[0] } : {}),
570
+ },
571
+ })
572
+ }
573
+
525
574
  async function signTempoTransaction(client: Client, transaction: unknown): Promise<Hex> {
526
575
  return (await signTransaction(client, transaction as never)) as Hex
527
576
  }
@@ -874,10 +923,25 @@ export type BroadcastOpenTransactionParameters = {
874
923
  serializedTransaction: Hex
875
924
  }
876
925
 
877
- /** Broadcast and validate a client-signed TIP-1034 open transaction. */
878
- export async function broadcastOpenTransaction(
879
- parameters: BroadcastOpenTransactionParameters,
880
- ): Promise<BroadcastOpenTransactionResult> {
926
+ /** Inputs for validating a client-signed TIP-1034 open transaction without broadcasting it. */
927
+ export type ValidateOpenCredentialTransactionParameters = Omit<
928
+ BroadcastOpenTransactionParameters,
929
+ 'beforeBroadcast' | 'client'
930
+ >
931
+
932
+ /** Validated fields recovered from a client-signed TIP-1034 open transaction. */
933
+ export type ValidatedOpenCredentialTransaction = Omit<
934
+ BroadcastOpenTransactionResult,
935
+ 'state' | 'txHash'
936
+ > & {
937
+ /** Parsed client-signed transaction, reused by simulation and broadcast. */
938
+ transaction: ReturnType<(typeof Transaction)['deserialize']>
939
+ }
940
+
941
+ /** Validates the immutable fields of a client-signed TIP-1034 open transaction. */
942
+ export function validateOpenCredentialTransaction(
943
+ parameters: ValidateOpenCredentialTransactionParameters,
944
+ ): ValidatedOpenCredentialTransaction {
881
945
  const { transaction, call, prefixCalls } = parsePrecompileCredentialTransaction({
882
946
  escrowContract: parameters.escrowContract,
883
947
  feePayer: parameters.feePayer,
@@ -909,6 +973,19 @@ export async function broadcastOpenTransaction(
909
973
  channelId: parameters.expectedChannelId,
910
974
  })
911
975
  if (parameters.feePayer) assertSenderSigned(transaction)
976
+ validateCredentialSponsorship({
977
+ allowedFeeTokens: [parameters.expectedCurrency],
978
+ challengeExpires: parameters.challengeExpires,
979
+ chainId: parameters.chainId,
980
+ details: {
981
+ channelId: parameters.expectedChannelId,
982
+ currency: parameters.expectedCurrency,
983
+ recipient: parameters.expectedPayee,
984
+ },
985
+ feePayer: parameters.feePayer,
986
+ feePayerPolicy: parameters.feePayerPolicy,
987
+ transaction,
988
+ })
912
989
  const expiringNonceHash = ChannelUtils.computeExpiringNonceHash(
913
990
  ChannelUtils.transactionForExpiringNonceHash({
914
991
  feePayer: parameters.feePayer,
@@ -920,10 +997,19 @@ export async function broadcastOpenTransaction(
920
997
  throw new VerificationFailedError({
921
998
  reason: 'credential expiringNonceHash does not match transaction',
922
999
  })
1000
+ return { descriptor, expiringNonceHash, openDeposit: open.deposit, transaction }
1001
+ }
1002
+
1003
+ /** Broadcast and validate a client-signed TIP-1034 open transaction. */
1004
+ export async function broadcastOpenTransaction(
1005
+ parameters: BroadcastOpenTransactionParameters,
1006
+ ): Promise<BroadcastOpenTransactionResult> {
1007
+ const { descriptor, expiringNonceHash, openDeposit, transaction } =
1008
+ validateOpenCredentialTransaction(parameters)
923
1009
  await parameters.beforeBroadcast?.({
924
1010
  descriptor,
925
1011
  expiringNonceHash,
926
- openDeposit: open.deposit,
1012
+ openDeposit,
927
1013
  })
928
1014
  const receipt = await sendCredentialTransaction({
929
1015
  challengeExpires: parameters.challengeExpires,
@@ -952,7 +1038,7 @@ export async function broadcastOpenTransaction(
952
1038
  emittedExpiringNonceHash: opened.expiringNonceHash,
953
1039
  escrow: parameters.escrowContract,
954
1040
  expectedChannelId: parameters.expectedChannelId,
955
- openDeposit: open.deposit,
1041
+ openDeposit,
956
1042
  })
957
1043
  const chainChannel = await readbackWithRetry(() =>
958
1044
  getChannel(parameters.client, descriptor, parameters.escrowContract, receipt.blockNumber),
@@ -964,7 +1050,7 @@ export async function broadcastOpenTransaction(
964
1050
  descriptor,
965
1051
  state,
966
1052
  expiringNonceHash: opened.expiringNonceHash,
967
- openDeposit: open.deposit,
1053
+ openDeposit,
968
1054
  }
969
1055
  }
970
1056
 
@@ -1004,10 +1090,22 @@ export type BroadcastTopUpTransactionParameters = {
1004
1090
  serializedTransaction: Hex
1005
1091
  }
1006
1092
 
1007
- /** Broadcast and validate a client-signed TIP-1034 top-up transaction. */
1008
- export async function broadcastTopUpTransaction(
1009
- parameters: BroadcastTopUpTransactionParameters,
1010
- ): Promise<BroadcastTopUpTransactionResult> {
1093
+ /** Inputs for validating a client-signed TIP-1034 top-up transaction without broadcasting it. */
1094
+ export type ValidateTopUpCredentialTransactionParameters = Omit<
1095
+ BroadcastTopUpTransactionParameters,
1096
+ 'client'
1097
+ >
1098
+
1099
+ /** Validated fields recovered from a client-signed TIP-1034 top-up transaction. */
1100
+ export type ValidatedTopUpCredentialTransaction = {
1101
+ /** Parsed client-signed transaction, reused by simulation and broadcast. */
1102
+ transaction: ReturnType<(typeof Transaction)['deserialize']>
1103
+ }
1104
+
1105
+ /** Validates the immutable fields of a client-signed TIP-1034 top-up transaction. */
1106
+ export function validateTopUpCredentialTransaction(
1107
+ parameters: ValidateTopUpCredentialTransactionParameters,
1108
+ ): ValidatedTopUpCredentialTransaction {
1011
1109
  const { transaction, call, prefixCalls } = parsePrecompileCredentialTransaction({
1012
1110
  escrowContract: parameters.escrowContract,
1013
1111
  feePayer: parameters.feePayer,
@@ -1027,6 +1125,28 @@ export async function broadcastTopUpTransaction(
1027
1125
  label: 'topUp',
1028
1126
  prefixCalls,
1029
1127
  })
1128
+ if (parameters.feePayer) assertSenderSigned(transaction)
1129
+ validateCredentialSponsorship({
1130
+ allowedFeeTokens: [parameters.expectedCurrency],
1131
+ challengeExpires: parameters.challengeExpires,
1132
+ chainId: parameters.chainId,
1133
+ details: {
1134
+ additionalDeposit: parameters.additionalDeposit.toString(),
1135
+ channelId: parameters.expectedChannelId,
1136
+ currency: parameters.expectedCurrency,
1137
+ },
1138
+ feePayer: parameters.feePayer,
1139
+ feePayerPolicy: parameters.feePayerPolicy,
1140
+ transaction,
1141
+ })
1142
+ return { transaction }
1143
+ }
1144
+
1145
+ /** Broadcast and validate a client-signed TIP-1034 top-up transaction. */
1146
+ export async function broadcastTopUpTransaction(
1147
+ parameters: BroadcastTopUpTransactionParameters,
1148
+ ): Promise<BroadcastTopUpTransactionResult> {
1149
+ const { transaction } = validateTopUpCredentialTransaction(parameters)
1030
1150
  const receipt = await sendCredentialTransaction({
1031
1151
  challengeExpires: parameters.challengeExpires,
1032
1152
  chainId: parameters.chainId,
@@ -240,6 +240,18 @@ export type VerifyAndAcceptVoucherParameters = {
240
240
  voucher: SignedVoucher
241
241
  }
242
242
 
243
+ /** Inputs for validating a cumulative voucher without recording it. */
244
+ export type ValidateVoucherParameters = Omit<
245
+ VerifyAndAcceptVoucherParameters,
246
+ 'challenge' | 'store'
247
+ >
248
+
249
+ /** Result of validating a cumulative voucher against persisted channel state. */
250
+ export type VoucherValidation = {
251
+ /** Whether the voucher was already accepted at the same cumulative amount. */
252
+ alreadyAccepted: boolean
253
+ }
254
+
243
255
  /** Channel backend-specific fields. */
244
256
  export type BackendState = CompatibilityBackendState | PrecompileBackendState
245
257
 
@@ -520,12 +532,11 @@ export async function loadPrecompileChannel(
520
532
  return channel
521
533
  }
522
534
 
523
- /** Verifies a cumulative voucher and returns a session receipt after store reconciliation. */
524
- export async function verifyAndAcceptVoucher(
525
- parameters: VerifyAndAcceptVoucherParameters,
526
- ): Promise<SessionReceipt> {
527
- const { store, minVoucherDelta, challenge, channel, voucher, channelState, methodDetails } =
528
- parameters
535
+ /** Verifies a cumulative voucher without changing persisted channel state. */
536
+ export async function validateVoucher(
537
+ parameters: ValidateVoucherParameters,
538
+ ): Promise<VoucherValidation> {
539
+ const { minVoucherDelta, channel, voucher, channelState, methodDetails } = parameters
529
540
 
530
541
  validateChannelState(channelState)
531
542
  if (voucher.cumulativeAmount > channelState.deposit)
@@ -546,7 +557,22 @@ export async function verifyAndAcceptVoucher(
546
557
  throw new VerificationFailedError({
547
558
  reason: 'voucher cumulativeAmount is below on-chain settled amount',
548
559
  })
549
- if (voucher.cumulativeAmount === channel.highestVoucherAmount)
560
+ if (voucher.cumulativeAmount === channel.highestVoucherAmount) return { alreadyAccepted: true }
561
+ const delta = voucher.cumulativeAmount - channel.highestVoucherAmount
562
+ if (delta < minVoucherDelta)
563
+ throw new DeltaTooSmallError({
564
+ reason: `voucher delta ${delta} below minimum ${minVoucherDelta}`,
565
+ })
566
+ return { alreadyAccepted: false }
567
+ }
568
+
569
+ /** Verifies a cumulative voucher and returns a session receipt after store reconciliation. */
570
+ export async function verifyAndAcceptVoucher(
571
+ parameters: VerifyAndAcceptVoucherParameters,
572
+ ): Promise<SessionReceipt> {
573
+ const { store, challenge, channel, voucher, channelState } = parameters
574
+ const validation = await validateVoucher(parameters)
575
+ if (validation.alreadyAccepted)
550
576
  return createSessionReceipt({
551
577
  challengeId: challenge.id,
552
578
  channelId: voucher.channelId,
@@ -554,11 +580,6 @@ export async function verifyAndAcceptVoucher(
554
580
  spent: channel.spent,
555
581
  units: channel.units,
556
582
  })
557
- const delta = voucher.cumulativeAmount - channel.highestVoucherAmount
558
- if (delta < minVoucherDelta)
559
- throw new DeltaTooSmallError({
560
- reason: `voucher delta ${delta} below minimum ${minVoucherDelta}`,
561
- })
562
583
  const updated = await store.updateChannel(voucher.channelId, (current) =>
563
584
  acceptVoucherStateUpdate({ channelState, current, voucher }),
564
585
  )
@@ -9,11 +9,11 @@ import * as Voucher from '../precompile/Voucher.js'
9
9
  import * as ChannelStore from './ChannelStore.js'
10
10
  import {
11
11
  assertOpenCredentialCoversRequest,
12
+ broadcastCredentialPayload,
12
13
  requireSessionCredentialAction,
13
14
  requireSessionCredentialPayload,
14
15
  requireSessionCredentialPayloadHeader,
15
16
  validateChannelDescriptor,
16
- verifyCredentialPayload,
17
17
  } from './CredentialVerification.js'
18
18
 
19
19
  describe('SessionCredentialGuards', () => {
@@ -190,7 +190,7 @@ describe('SessionCredentialGuards', () => {
190
190
  })
191
191
  })
192
192
 
193
- describe('verifyCredentialPayload', () => {
193
+ describe('broadcastCredentialPayload', () => {
194
194
  const escrow = '0x4D50500000000000000000000000000000000000' as Address
195
195
  const testChainId = chainIds.testnet
196
196
  const computedChannelId = Channel.computeId({ ...descriptor, chainId: testChainId, escrow })
@@ -246,7 +246,7 @@ describe('SessionCredentialGuards', () => {
246
246
  const verifyVoucher = vi.spyOn(Voucher, 'verifyVoucher').mockResolvedValue(true)
247
247
 
248
248
  await expect(
249
- verifyCredentialPayload({
249
+ broadcastCredentialPayload({
250
250
  challenge,
251
251
  channelStateTtl: 60_000,
252
252
  chainId: testChainId,
@@ -274,7 +274,7 @@ describe('SessionCredentialGuards', () => {
274
274
  const verifyVoucher = vi.spyOn(Voucher, 'verifyVoucher').mockResolvedValue(true)
275
275
 
276
276
  await expect(
277
- verifyCredentialPayload({
277
+ broadcastCredentialPayload({
278
278
  challenge,
279
279
  channelStateTtl: 60_000,
280
280
  chainId: testChainId,