mppx 0.8.17 → 0.8.19

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 (914) hide show
  1. package/CHANGELOG.md +61 -0
  2. package/README.md +15 -0
  3. package/dist/Challenge.js +21 -4
  4. package/dist/bin.js +3 -3
  5. package/dist/cli/THIRD-PARTY-LICENSES.txt +328 -0
  6. package/dist/cli/cli.js +253 -1505
  7. package/dist/cli/plugins/index.js +19 -5
  8. package/dist/cli/plugins/tempo.js +7 -3
  9. package/dist/cli/sessions/Manager.js +7 -4
  10. package/dist/cli/sessions/request.d.ts +2 -0
  11. package/dist/cli/sessions/request.js +18 -0
  12. package/dist/cli/sessions/store.js +28 -14
  13. package/dist/discovery/Discovery.js +2 -1
  14. package/dist/evm/client/Charge.js +8 -0
  15. package/dist/server/core.d.ts +9 -0
  16. package/dist/server/core.js +9 -0
  17. package/dist/stripe/server/Charge.js +2 -4
  18. package/dist/stripe/server/Methods.d.ts +2 -2
  19. package/dist/stripe/server/Methods.js +17 -11
  20. package/dist/stripe/server/internal/html.gen.d.ts +1 -1
  21. package/dist/stripe/server/internal/html.gen.js +1 -1
  22. package/dist/stripe/server/spt.d.ts +8 -0
  23. package/dist/stripe/server/spt.js +8 -0
  24. package/dist/tempo/Methods.d.ts +13 -0
  25. package/dist/tempo/Methods.js +14 -3
  26. package/dist/tempo/client/Charge.d.ts +3 -0
  27. package/dist/tempo/client/Charge.js +31 -9
  28. package/dist/tempo/client/Methods.d.ts +13 -0
  29. package/dist/tempo/internal/defaults.d.ts +11 -0
  30. package/dist/tempo/internal/defaults.js +11 -0
  31. package/dist/tempo/internal/machine-token-charge.d.ts +51 -0
  32. package/dist/tempo/internal/machine-token-charge.js +113 -0
  33. package/dist/tempo/internal/machine-token-session.d.ts +88 -0
  34. package/dist/tempo/internal/machine-token-session.js +173 -0
  35. package/dist/tempo/internal/signature-envelope.d.ts +14 -0
  36. package/dist/tempo/internal/signature-envelope.js +28 -0
  37. package/dist/tempo/legacy/client/ChannelOps.d.ts +2 -2
  38. package/dist/tempo/legacy/client/ChannelOps.js +11 -5
  39. package/dist/tempo/legacy/client/Session.d.ts +13 -1
  40. package/dist/tempo/legacy/client/Session.js +3 -3
  41. package/dist/tempo/legacy/client/SessionManager.d.ts +3 -1
  42. package/dist/tempo/legacy/client/SessionManager.js +2 -0
  43. package/dist/tempo/server/Charge.d.ts +3 -0
  44. package/dist/tempo/server/Charge.js +58 -17
  45. package/dist/tempo/server/Methods.d.ts +21 -4
  46. package/dist/tempo/server/Methods.js +8 -4
  47. package/dist/tempo/server/internal/html.gen.d.ts +1 -1
  48. package/dist/tempo/server/internal/html.gen.js +1 -1
  49. package/dist/tempo/session/client/ChannelOps.d.ts +18 -3
  50. package/dist/tempo/session/client/ChannelOps.js +35 -6
  51. package/dist/tempo/session/client/ChannelStore.d.ts +0 -5
  52. package/dist/tempo/session/client/ChannelStore.js +2 -2
  53. package/dist/tempo/session/client/CredentialState.d.ts +17 -2
  54. package/dist/tempo/session/client/CredentialState.js +77 -76
  55. package/dist/tempo/session/client/Runtime.d.ts +4 -2
  56. package/dist/tempo/session/client/Runtime.js +21 -5
  57. package/dist/tempo/session/client/Session.d.ts +15 -3
  58. package/dist/tempo/session/client/Session.js +186 -63
  59. package/dist/tempo/session/client/SessionManager.d.ts +3 -1
  60. package/dist/tempo/session/client/SessionManager.js +35 -11
  61. package/dist/tempo/session/client/Transports.d.ts +2 -0
  62. package/dist/tempo/session/client/Transports.js +12 -2
  63. package/dist/tempo/session/precompile/Chain.d.ts +10 -2
  64. package/dist/tempo/session/precompile/Chain.js +51 -10
  65. package/dist/tempo/session/precompile/Protocol.d.ts +15 -0
  66. package/dist/tempo/session/precompile/Protocol.js +7 -0
  67. package/dist/tempo/session/precompile/Voucher.d.ts +3 -1
  68. package/dist/tempo/session/precompile/Voucher.js +6 -12
  69. package/dist/tempo/session/server/ChannelStore.d.ts +6 -0
  70. package/dist/tempo/session/server/ChannelStore.js +11 -4
  71. package/dist/tempo/session/server/CredentialVerification.d.ts +11 -9
  72. package/dist/tempo/session/server/CredentialVerification.js +185 -109
  73. package/dist/tempo/session/server/MeteredStream.d.ts +1 -1
  74. package/dist/tempo/session/server/MeteredStream.js +5 -4
  75. package/dist/tempo/session/server/RequestState.d.ts +19 -0
  76. package/dist/tempo/session/server/RequestState.js +61 -15
  77. package/dist/tempo/session/server/Session.d.ts +14 -2
  78. package/dist/tempo/session/server/Session.js +37 -6
  79. package/dist/tempo/session/server/Settlement.d.ts +11 -4
  80. package/dist/tempo/session/server/Settlement.js +53 -21
  81. package/dist/x402/client/Exact.d.ts +8 -0
  82. package/dist/x402/client/Exact.js +40 -10
  83. package/dist/x402/server/EvmCharge.d.ts +22 -0
  84. package/dist/x402/server/EvmCharge.js +23 -1
  85. package/package.json +15 -37
  86. package/dist/BodyDigest.d.ts.map +0 -1
  87. package/dist/BodyDigest.js.map +0 -1
  88. package/dist/Challenge.d.ts.map +0 -1
  89. package/dist/Challenge.js.map +0 -1
  90. package/dist/Constants.d.ts.map +0 -1
  91. package/dist/Constants.js.map +0 -1
  92. package/dist/Credential.d.ts.map +0 -1
  93. package/dist/Credential.js.map +0 -1
  94. package/dist/Errors.d.ts.map +0 -1
  95. package/dist/Errors.js.map +0 -1
  96. package/dist/Expires.d.ts.map +0 -1
  97. package/dist/Expires.js.map +0 -1
  98. package/dist/Html.d.ts.map +0 -1
  99. package/dist/Html.js.map +0 -1
  100. package/dist/Mcp.d.ts.map +0 -1
  101. package/dist/Mcp.js.map +0 -1
  102. package/dist/Method.d.ts.map +0 -1
  103. package/dist/Method.js.map +0 -1
  104. package/dist/PaymentRequest.d.ts.map +0 -1
  105. package/dist/PaymentRequest.js.map +0 -1
  106. package/dist/Receipt.d.ts.map +0 -1
  107. package/dist/Receipt.js.map +0 -1
  108. package/dist/Store.d.ts.map +0 -1
  109. package/dist/Store.js.map +0 -1
  110. package/dist/attestation/Client.d.ts.map +0 -1
  111. package/dist/attestation/Client.js.map +0 -1
  112. package/dist/attestation/Constants.d.ts.map +0 -1
  113. package/dist/attestation/Constants.js.map +0 -1
  114. package/dist/attestation/Server.d.ts.map +0 -1
  115. package/dist/attestation/Server.js.map +0 -1
  116. package/dist/attestation/Types.d.ts.map +0 -1
  117. package/dist/attestation/Types.js.map +0 -1
  118. package/dist/attestation/index.d.ts.map +0 -1
  119. package/dist/attestation/index.js.map +0 -1
  120. package/dist/attestation/internal/HttpMessageSignature.d.ts.map +0 -1
  121. package/dist/attestation/internal/HttpMessageSignature.js.map +0 -1
  122. package/dist/attestation/internal/SigningContext.d.ts.map +0 -1
  123. package/dist/attestation/internal/SigningContext.js.map +0 -1
  124. package/dist/bin.d.ts.map +0 -1
  125. package/dist/bin.js.map +0 -1
  126. package/dist/cli/account.d.ts.map +0 -1
  127. package/dist/cli/account.js.map +0 -1
  128. package/dist/cli/cli.d.ts.map +0 -1
  129. package/dist/cli/cli.js.map +0 -1
  130. package/dist/cli/config.d.ts.map +0 -1
  131. package/dist/cli/config.js.map +0 -1
  132. package/dist/cli/internal.d.ts.map +0 -1
  133. package/dist/cli/internal.js.map +0 -1
  134. package/dist/cli/plugins/evm.d.ts.map +0 -1
  135. package/dist/cli/plugins/evm.js.map +0 -1
  136. package/dist/cli/plugins/index.d.ts.map +0 -1
  137. package/dist/cli/plugins/index.js.map +0 -1
  138. package/dist/cli/plugins/plugin.d.ts.map +0 -1
  139. package/dist/cli/plugins/plugin.js.map +0 -1
  140. package/dist/cli/plugins/stripe.d.ts.map +0 -1
  141. package/dist/cli/plugins/stripe.js.map +0 -1
  142. package/dist/cli/plugins/tempo.d.ts.map +0 -1
  143. package/dist/cli/plugins/tempo.js.map +0 -1
  144. package/dist/cli/sessions/Manager.d.ts.map +0 -1
  145. package/dist/cli/sessions/Manager.js.map +0 -1
  146. package/dist/cli/sessions/commands.d.ts.map +0 -1
  147. package/dist/cli/sessions/commands.js.map +0 -1
  148. package/dist/cli/sessions/request.d.ts.map +0 -1
  149. package/dist/cli/sessions/request.js.map +0 -1
  150. package/dist/cli/sessions/store.d.ts.map +0 -1
  151. package/dist/cli/sessions/store.js.map +0 -1
  152. package/dist/cli/utils.d.ts.map +0 -1
  153. package/dist/cli/utils.js.map +0 -1
  154. package/dist/cli/validate/challenge.d.ts.map +0 -1
  155. package/dist/cli/validate/challenge.js.map +0 -1
  156. package/dist/cli/validate/discovery.d.ts.map +0 -1
  157. package/dist/cli/validate/discovery.js.map +0 -1
  158. package/dist/cli/validate/helpers.d.ts.map +0 -1
  159. package/dist/cli/validate/helpers.js.map +0 -1
  160. package/dist/cli/validate/index.d.ts.map +0 -1
  161. package/dist/cli/validate/index.js.map +0 -1
  162. package/dist/cli/validate/messages.d.ts.map +0 -1
  163. package/dist/cli/validate/messages.js.map +0 -1
  164. package/dist/cli/validate/payment.d.ts.map +0 -1
  165. package/dist/cli/validate/payment.js.map +0 -1
  166. package/dist/client/Methods.d.ts.map +0 -1
  167. package/dist/client/Methods.js.map +0 -1
  168. package/dist/client/Mppx.d.ts.map +0 -1
  169. package/dist/client/Mppx.js.map +0 -1
  170. package/dist/client/Transport.d.ts.map +0 -1
  171. package/dist/client/Transport.js.map +0 -1
  172. package/dist/client/index.d.ts.map +0 -1
  173. package/dist/client/index.js.map +0 -1
  174. package/dist/client/internal/Fetch.d.ts.map +0 -1
  175. package/dist/client/internal/Fetch.js.map +0 -1
  176. package/dist/client/internal/MethodChallenge.d.ts.map +0 -1
  177. package/dist/client/internal/MethodChallenge.js.map +0 -1
  178. package/dist/client/internal/MethodResponse.d.ts.map +0 -1
  179. package/dist/client/internal/MethodResponse.js.map +0 -1
  180. package/dist/client/internal/protocols/Mcp.d.ts.map +0 -1
  181. package/dist/client/internal/protocols/Mcp.js.map +0 -1
  182. package/dist/client/internal/protocols/Mpp.d.ts.map +0 -1
  183. package/dist/client/internal/protocols/Mpp.js.map +0 -1
  184. package/dist/client/internal/protocols/Protocol.d.ts.map +0 -1
  185. package/dist/client/internal/protocols/Protocol.js.map +0 -1
  186. package/dist/client/internal/protocols/Shared.d.ts.map +0 -1
  187. package/dist/client/internal/protocols/Shared.js.map +0 -1
  188. package/dist/client/internal/protocols/X402.d.ts.map +0 -1
  189. package/dist/client/internal/protocols/X402.js.map +0 -1
  190. package/dist/client/node.d.ts.map +0 -1
  191. package/dist/client/node.js.map +0 -1
  192. package/dist/discovery/Discovery.d.ts.map +0 -1
  193. package/dist/discovery/Discovery.js.map +0 -1
  194. package/dist/discovery/OpenApi.d.ts.map +0 -1
  195. package/dist/discovery/OpenApi.js.map +0 -1
  196. package/dist/discovery/Validate.d.ts.map +0 -1
  197. package/dist/discovery/Validate.js.map +0 -1
  198. package/dist/discovery/index.d.ts.map +0 -1
  199. package/dist/discovery/index.js.map +0 -1
  200. package/dist/discovery/internal/Metadata.d.ts.map +0 -1
  201. package/dist/discovery/internal/Metadata.js.map +0 -1
  202. package/dist/evm/Assets.d.ts.map +0 -1
  203. package/dist/evm/Assets.js.map +0 -1
  204. package/dist/evm/Chains.d.ts.map +0 -1
  205. package/dist/evm/Chains.js.map +0 -1
  206. package/dist/evm/Methods.d.ts.map +0 -1
  207. package/dist/evm/Methods.js.map +0 -1
  208. package/dist/evm/Types.d.ts.map +0 -1
  209. package/dist/evm/Types.js.map +0 -1
  210. package/dist/evm/client/Charge.d.ts.map +0 -1
  211. package/dist/evm/client/Charge.js.map +0 -1
  212. package/dist/evm/client/Methods.d.ts.map +0 -1
  213. package/dist/evm/client/Methods.js.map +0 -1
  214. package/dist/evm/client/index.d.ts.map +0 -1
  215. package/dist/evm/client/index.js.map +0 -1
  216. package/dist/evm/index.d.ts.map +0 -1
  217. package/dist/evm/index.js.map +0 -1
  218. package/dist/evm/server/Charge.d.ts.map +0 -1
  219. package/dist/evm/server/Charge.js.map +0 -1
  220. package/dist/evm/server/Methods.d.ts.map +0 -1
  221. package/dist/evm/server/Methods.js.map +0 -1
  222. package/dist/evm/server/index.d.ts.map +0 -1
  223. package/dist/evm/server/index.js.map +0 -1
  224. package/dist/index.d.ts.map +0 -1
  225. package/dist/index.js.map +0 -1
  226. package/dist/internal/AcceptPayment.d.ts.map +0 -1
  227. package/dist/internal/AcceptPayment.js.map +0 -1
  228. package/dist/internal/HeaderCodec.d.ts.map +0 -1
  229. package/dist/internal/HeaderCodec.js.map +0 -1
  230. package/dist/internal/constantTimeEqual.d.ts.map +0 -1
  231. package/dist/internal/constantTimeEqual.js.map +0 -1
  232. package/dist/internal/env.d.ts.map +0 -1
  233. package/dist/internal/env.js.map +0 -1
  234. package/dist/internal/types.d.ts.map +0 -1
  235. package/dist/internal/types.js.map +0 -1
  236. package/dist/mcp/client/McpClient.d.ts.map +0 -1
  237. package/dist/mcp/client/McpClient.js.map +0 -1
  238. package/dist/mcp/client/index.d.ts.map +0 -1
  239. package/dist/mcp/client/index.js.map +0 -1
  240. package/dist/mcp/server/Transport.d.ts.map +0 -1
  241. package/dist/mcp/server/Transport.js.map +0 -1
  242. package/dist/mcp/server/index.d.ts.map +0 -1
  243. package/dist/mcp/server/index.js.map +0 -1
  244. package/dist/middlewares/elysia.d.ts.map +0 -1
  245. package/dist/middlewares/elysia.js.map +0 -1
  246. package/dist/middlewares/express.d.ts.map +0 -1
  247. package/dist/middlewares/express.js.map +0 -1
  248. package/dist/middlewares/hono.d.ts.map +0 -1
  249. package/dist/middlewares/hono.js.map +0 -1
  250. package/dist/middlewares/internal/mppx.d.ts.map +0 -1
  251. package/dist/middlewares/internal/mppx.js.map +0 -1
  252. package/dist/middlewares/nextjs.d.ts.map +0 -1
  253. package/dist/middlewares/nextjs.js.map +0 -1
  254. package/dist/proxy/Proxy.d.ts.map +0 -1
  255. package/dist/proxy/Proxy.js.map +0 -1
  256. package/dist/proxy/Service.d.ts.map +0 -1
  257. package/dist/proxy/Service.js.map +0 -1
  258. package/dist/proxy/index.d.ts.map +0 -1
  259. package/dist/proxy/index.js.map +0 -1
  260. package/dist/proxy/internal/Headers.d.ts.map +0 -1
  261. package/dist/proxy/internal/Headers.js.map +0 -1
  262. package/dist/proxy/internal/Route.d.ts.map +0 -1
  263. package/dist/proxy/internal/Route.js.map +0 -1
  264. package/dist/proxy/services/anthropic.d.ts.map +0 -1
  265. package/dist/proxy/services/anthropic.js.map +0 -1
  266. package/dist/proxy/services/openai.d.ts.map +0 -1
  267. package/dist/proxy/services/openai.js.map +0 -1
  268. package/dist/proxy/services/stripe.d.ts.map +0 -1
  269. package/dist/proxy/services/stripe.js.map +0 -1
  270. package/dist/server/Methods.d.ts.map +0 -1
  271. package/dist/server/Methods.js.map +0 -1
  272. package/dist/server/Mppx.d.ts.map +0 -1
  273. package/dist/server/Mppx.js.map +0 -1
  274. package/dist/server/NodeListener.d.ts.map +0 -1
  275. package/dist/server/NodeListener.js.map +0 -1
  276. package/dist/server/Request.d.ts.map +0 -1
  277. package/dist/server/Request.js.map +0 -1
  278. package/dist/server/Response.d.ts.map +0 -1
  279. package/dist/server/Response.js.map +0 -1
  280. package/dist/server/Transport.d.ts.map +0 -1
  281. package/dist/server/Transport.js.map +0 -1
  282. package/dist/server/index.d.ts.map +0 -1
  283. package/dist/server/index.js.map +0 -1
  284. package/dist/server/internal/html/compose.main.gen.d.ts.map +0 -1
  285. package/dist/server/internal/html/compose.main.gen.js.map +0 -1
  286. package/dist/server/internal/html/config.d.ts.map +0 -1
  287. package/dist/server/internal/html/config.js.map +0 -1
  288. package/dist/server/internal/html/constants.d.ts.map +0 -1
  289. package/dist/server/internal/html/constants.js.map +0 -1
  290. package/dist/server/internal/html/serviceWorker.client.d.ts.map +0 -1
  291. package/dist/server/internal/html/serviceWorker.client.js.map +0 -1
  292. package/dist/server/internal/html/serviceWorker.gen.d.ts.map +0 -1
  293. package/dist/server/internal/html/serviceWorker.gen.js.map +0 -1
  294. package/dist/server/internal/scope.d.ts.map +0 -1
  295. package/dist/server/internal/scope.js.map +0 -1
  296. package/dist/stripe/Methods.d.ts.map +0 -1
  297. package/dist/stripe/Methods.js.map +0 -1
  298. package/dist/stripe/client/Charge.d.ts.map +0 -1
  299. package/dist/stripe/client/Charge.js.map +0 -1
  300. package/dist/stripe/client/Methods.d.ts.map +0 -1
  301. package/dist/stripe/client/Methods.js.map +0 -1
  302. package/dist/stripe/client/index.d.ts.map +0 -1
  303. package/dist/stripe/client/index.js.map +0 -1
  304. package/dist/stripe/index.d.ts.map +0 -1
  305. package/dist/stripe/index.js.map +0 -1
  306. package/dist/stripe/internal/constants.d.ts.map +0 -1
  307. package/dist/stripe/internal/constants.js.map +0 -1
  308. package/dist/stripe/internal/types.d.ts.map +0 -1
  309. package/dist/stripe/internal/types.js.map +0 -1
  310. package/dist/stripe/server/Charge.d.ts.map +0 -1
  311. package/dist/stripe/server/Charge.js.map +0 -1
  312. package/dist/stripe/server/Methods.d.ts.map +0 -1
  313. package/dist/stripe/server/Methods.js.map +0 -1
  314. package/dist/stripe/server/index.d.ts.map +0 -1
  315. package/dist/stripe/server/index.js.map +0 -1
  316. package/dist/stripe/server/internal/deposit-address.d.ts.map +0 -1
  317. package/dist/stripe/server/internal/deposit-address.js.map +0 -1
  318. package/dist/stripe/server/internal/html/types.d.ts.map +0 -1
  319. package/dist/stripe/server/internal/html/types.js.map +0 -1
  320. package/dist/stripe/server/internal/html.gen.d.ts.map +0 -1
  321. package/dist/stripe/server/internal/html.gen.js.map +0 -1
  322. package/dist/stripe/server/internal/record-payment.d.ts.map +0 -1
  323. package/dist/stripe/server/internal/record-payment.js.map +0 -1
  324. package/dist/stripe/server/internal/request.d.ts.map +0 -1
  325. package/dist/stripe/server/internal/request.js.map +0 -1
  326. package/dist/tap/Constants.d.ts.map +0 -1
  327. package/dist/tap/Constants.js.map +0 -1
  328. package/dist/tap/Types.d.ts.map +0 -1
  329. package/dist/tap/Types.js.map +0 -1
  330. package/dist/tap/client/index.d.ts.map +0 -1
  331. package/dist/tap/client/index.js.map +0 -1
  332. package/dist/tap/index.d.ts.map +0 -1
  333. package/dist/tap/index.js.map +0 -1
  334. package/dist/tap/server/index.d.ts.map +0 -1
  335. package/dist/tap/server/index.js.map +0 -1
  336. package/dist/tempo/Attribution.d.ts.map +0 -1
  337. package/dist/tempo/Attribution.js.map +0 -1
  338. package/dist/tempo/Methods.d.ts.map +0 -1
  339. package/dist/tempo/Methods.js.map +0 -1
  340. package/dist/tempo/Proof.d.ts.map +0 -1
  341. package/dist/tempo/Proof.js.map +0 -1
  342. package/dist/tempo/client/Charge.d.ts.map +0 -1
  343. package/dist/tempo/client/Charge.js.map +0 -1
  344. package/dist/tempo/client/Methods.d.ts.map +0 -1
  345. package/dist/tempo/client/Methods.js.map +0 -1
  346. package/dist/tempo/client/ResolveAccount.d.ts.map +0 -1
  347. package/dist/tempo/client/ResolveAccount.js.map +0 -1
  348. package/dist/tempo/client/Subscription.d.ts.map +0 -1
  349. package/dist/tempo/client/Subscription.js.map +0 -1
  350. package/dist/tempo/client/index.d.ts.map +0 -1
  351. package/dist/tempo/client/index.js.map +0 -1
  352. package/dist/tempo/index.d.ts.map +0 -1
  353. package/dist/tempo/index.js.map +0 -1
  354. package/dist/tempo/internal/account.d.ts.map +0 -1
  355. package/dist/tempo/internal/account.js.map +0 -1
  356. package/dist/tempo/internal/address.d.ts.map +0 -1
  357. package/dist/tempo/internal/address.js.map +0 -1
  358. package/dist/tempo/internal/auto-swap.d.ts.map +0 -1
  359. package/dist/tempo/internal/auto-swap.js.map +0 -1
  360. package/dist/tempo/internal/charge.d.ts.map +0 -1
  361. package/dist/tempo/internal/charge.js.map +0 -1
  362. package/dist/tempo/internal/defaults.d.ts.map +0 -1
  363. package/dist/tempo/internal/defaults.js.map +0 -1
  364. package/dist/tempo/internal/fee-payer.d.ts.map +0 -1
  365. package/dist/tempo/internal/fee-payer.js.map +0 -1
  366. package/dist/tempo/internal/fee-token.d.ts.map +0 -1
  367. package/dist/tempo/internal/fee-token.js.map +0 -1
  368. package/dist/tempo/internal/proof.d.ts.map +0 -1
  369. package/dist/tempo/internal/proof.js.map +0 -1
  370. package/dist/tempo/internal/selectors.d.ts.map +0 -1
  371. package/dist/tempo/internal/selectors.js.map +0 -1
  372. package/dist/tempo/internal/types.d.ts.map +0 -1
  373. package/dist/tempo/internal/types.js.map +0 -1
  374. package/dist/tempo/legacy/client/ChannelOps.d.ts.map +0 -1
  375. package/dist/tempo/legacy/client/ChannelOps.js.map +0 -1
  376. package/dist/tempo/legacy/client/Session.d.ts.map +0 -1
  377. package/dist/tempo/legacy/client/Session.js.map +0 -1
  378. package/dist/tempo/legacy/client/SessionManager.d.ts.map +0 -1
  379. package/dist/tempo/legacy/client/SessionManager.js.map +0 -1
  380. package/dist/tempo/legacy/client/index.d.ts.map +0 -1
  381. package/dist/tempo/legacy/client/index.js.map +0 -1
  382. package/dist/tempo/legacy/index.d.ts.map +0 -1
  383. package/dist/tempo/legacy/index.js.map +0 -1
  384. package/dist/tempo/legacy/session/Chain.d.ts.map +0 -1
  385. package/dist/tempo/legacy/session/Chain.js.map +0 -1
  386. package/dist/tempo/legacy/session/Channel.d.ts.map +0 -1
  387. package/dist/tempo/legacy/session/Channel.js.map +0 -1
  388. package/dist/tempo/legacy/session/Types.d.ts.map +0 -1
  389. package/dist/tempo/legacy/session/Types.js.map +0 -1
  390. package/dist/tempo/legacy/session/Voucher.d.ts.map +0 -1
  391. package/dist/tempo/legacy/session/Voucher.js.map +0 -1
  392. package/dist/tempo/legacy/session/escrow.abi.d.ts.map +0 -1
  393. package/dist/tempo/legacy/session/escrow.abi.js.map +0 -1
  394. package/dist/tempo/legacy/session/index.d.ts.map +0 -1
  395. package/dist/tempo/legacy/session/index.js.map +0 -1
  396. package/dist/tempo/server/Charge.d.ts.map +0 -1
  397. package/dist/tempo/server/Charge.js.map +0 -1
  398. package/dist/tempo/server/Methods.d.ts.map +0 -1
  399. package/dist/tempo/server/Methods.js.map +0 -1
  400. package/dist/tempo/server/Relay.d.ts.map +0 -1
  401. package/dist/tempo/server/Relay.js.map +0 -1
  402. package/dist/tempo/server/SponsorBudget.d.ts.map +0 -1
  403. package/dist/tempo/server/SponsorBudget.js.map +0 -1
  404. package/dist/tempo/server/Subscription.d.ts.map +0 -1
  405. package/dist/tempo/server/Subscription.js.map +0 -1
  406. package/dist/tempo/server/index.d.ts.map +0 -1
  407. package/dist/tempo/server/index.js.map +0 -1
  408. package/dist/tempo/server/internal/html.gen.d.ts.map +0 -1
  409. package/dist/tempo/server/internal/html.gen.js.map +0 -1
  410. package/dist/tempo/server/internal/request-body.d.ts.map +0 -1
  411. package/dist/tempo/server/internal/request-body.js.map +0 -1
  412. package/dist/tempo/server/internal/transport.d.ts.map +0 -1
  413. package/dist/tempo/server/internal/transport.js.map +0 -1
  414. package/dist/tempo/session/Snapshot.d.ts.map +0 -1
  415. package/dist/tempo/session/Snapshot.js.map +0 -1
  416. package/dist/tempo/session/client/ChannelOps.d.ts.map +0 -1
  417. package/dist/tempo/session/client/ChannelOps.js.map +0 -1
  418. package/dist/tempo/session/client/ChannelStore.d.ts.map +0 -1
  419. package/dist/tempo/session/client/ChannelStore.js.map +0 -1
  420. package/dist/tempo/session/client/CredentialState.d.ts.map +0 -1
  421. package/dist/tempo/session/client/CredentialState.js.map +0 -1
  422. package/dist/tempo/session/client/ReceiptCoordinator.d.ts.map +0 -1
  423. package/dist/tempo/session/client/ReceiptCoordinator.js.map +0 -1
  424. package/dist/tempo/session/client/Runtime.d.ts.map +0 -1
  425. package/dist/tempo/session/client/Runtime.js.map +0 -1
  426. package/dist/tempo/session/client/Session.d.ts.map +0 -1
  427. package/dist/tempo/session/client/Session.js.map +0 -1
  428. package/dist/tempo/session/client/SessionManager.d.ts.map +0 -1
  429. package/dist/tempo/session/client/SessionManager.js.map +0 -1
  430. package/dist/tempo/session/client/Transports.d.ts.map +0 -1
  431. package/dist/tempo/session/client/Transports.js.map +0 -1
  432. package/dist/tempo/session/client/index.d.ts.map +0 -1
  433. package/dist/tempo/session/client/index.js.map +0 -1
  434. package/dist/tempo/session/client/internal/SessionManager.d.ts.map +0 -1
  435. package/dist/tempo/session/client/internal/SessionManager.js.map +0 -1
  436. package/dist/tempo/session/index.d.ts.map +0 -1
  437. package/dist/tempo/session/index.js.map +0 -1
  438. package/dist/tempo/session/precompile/Chain.d.ts.map +0 -1
  439. package/dist/tempo/session/precompile/Chain.js.map +0 -1
  440. package/dist/tempo/session/precompile/Channel.d.ts.map +0 -1
  441. package/dist/tempo/session/precompile/Channel.js.map +0 -1
  442. package/dist/tempo/session/precompile/Protocol.d.ts.map +0 -1
  443. package/dist/tempo/session/precompile/Protocol.js.map +0 -1
  444. package/dist/tempo/session/precompile/Voucher.d.ts.map +0 -1
  445. package/dist/tempo/session/precompile/Voucher.js.map +0 -1
  446. package/dist/tempo/session/precompile/escrow.abi.d.ts.map +0 -1
  447. package/dist/tempo/session/precompile/escrow.abi.js.map +0 -1
  448. package/dist/tempo/session/precompile/index.d.ts.map +0 -1
  449. package/dist/tempo/session/precompile/index.js.map +0 -1
  450. package/dist/tempo/session/server/ChannelOps.d.ts.map +0 -1
  451. package/dist/tempo/session/server/ChannelOps.js.map +0 -1
  452. package/dist/tempo/session/server/ChannelStore.d.ts.map +0 -1
  453. package/dist/tempo/session/server/ChannelStore.js.map +0 -1
  454. package/dist/tempo/session/server/CredentialVerification.d.ts.map +0 -1
  455. package/dist/tempo/session/server/CredentialVerification.js.map +0 -1
  456. package/dist/tempo/session/server/MeteredStream.d.ts.map +0 -1
  457. package/dist/tempo/session/server/MeteredStream.js.map +0 -1
  458. package/dist/tempo/session/server/RequestState.d.ts.map +0 -1
  459. package/dist/tempo/session/server/RequestState.js.map +0 -1
  460. package/dist/tempo/session/server/Session.d.ts.map +0 -1
  461. package/dist/tempo/session/server/Session.js.map +0 -1
  462. package/dist/tempo/session/server/Settlement.d.ts.map +0 -1
  463. package/dist/tempo/session/server/Settlement.js.map +0 -1
  464. package/dist/tempo/session/server/Sse.d.ts.map +0 -1
  465. package/dist/tempo/session/server/Sse.js.map +0 -1
  466. package/dist/tempo/session/server/Transports.d.ts.map +0 -1
  467. package/dist/tempo/session/server/Transports.js.map +0 -1
  468. package/dist/tempo/session/server/Ws.d.ts.map +0 -1
  469. package/dist/tempo/session/server/Ws.js.map +0 -1
  470. package/dist/tempo/session/server/index.d.ts.map +0 -1
  471. package/dist/tempo/session/server/index.js.map +0 -1
  472. package/dist/tempo/subscription/KeyAuthorization.d.ts.map +0 -1
  473. package/dist/tempo/subscription/KeyAuthorization.js.map +0 -1
  474. package/dist/tempo/subscription/Receipt.d.ts.map +0 -1
  475. package/dist/tempo/subscription/Receipt.js.map +0 -1
  476. package/dist/tempo/subscription/Store.d.ts.map +0 -1
  477. package/dist/tempo/subscription/Store.js.map +0 -1
  478. package/dist/tempo/subscription/Types.d.ts.map +0 -1
  479. package/dist/tempo/subscription/Types.js.map +0 -1
  480. package/dist/tempo/subscription/index.d.ts.map +0 -1
  481. package/dist/tempo/subscription/index.js.map +0 -1
  482. package/dist/validation/core.d.ts.map +0 -1
  483. package/dist/validation/core.js.map +0 -1
  484. package/dist/validation/index.d.ts.map +0 -1
  485. package/dist/validation/index.js.map +0 -1
  486. package/dist/viem/Account.d.ts.map +0 -1
  487. package/dist/viem/Account.js.map +0 -1
  488. package/dist/viem/Client.d.ts.map +0 -1
  489. package/dist/viem/Client.js.map +0 -1
  490. package/dist/web-bot-auth/Constants.d.ts.map +0 -1
  491. package/dist/web-bot-auth/Constants.js.map +0 -1
  492. package/dist/web-bot-auth/Types.d.ts.map +0 -1
  493. package/dist/web-bot-auth/Types.js.map +0 -1
  494. package/dist/web-bot-auth/client/index.d.ts.map +0 -1
  495. package/dist/web-bot-auth/client/index.js.map +0 -1
  496. package/dist/web-bot-auth/index.d.ts.map +0 -1
  497. package/dist/web-bot-auth/index.js.map +0 -1
  498. package/dist/web-bot-auth/internal/JwkThumbprint.d.ts.map +0 -1
  499. package/dist/web-bot-auth/internal/JwkThumbprint.js.map +0 -1
  500. package/dist/web-bot-auth/internal/SignatureAgent.d.ts.map +0 -1
  501. package/dist/web-bot-auth/internal/SignatureAgent.js.map +0 -1
  502. package/dist/web-bot-auth/server/index.d.ts.map +0 -1
  503. package/dist/web-bot-auth/server/index.js.map +0 -1
  504. package/dist/x402/Assets.d.ts.map +0 -1
  505. package/dist/x402/Assets.js.map +0 -1
  506. package/dist/x402/Header.d.ts.map +0 -1
  507. package/dist/x402/Header.js.map +0 -1
  508. package/dist/x402/Types.d.ts.map +0 -1
  509. package/dist/x402/Types.js.map +0 -1
  510. package/dist/x402/client/Exact.d.ts.map +0 -1
  511. package/dist/x402/client/Exact.js.map +0 -1
  512. package/dist/x402/index.d.ts.map +0 -1
  513. package/dist/x402/index.js.map +0 -1
  514. package/dist/x402/internal/ChallengeBrand.d.ts.map +0 -1
  515. package/dist/x402/internal/ChallengeBrand.js.map +0 -1
  516. package/dist/x402/internal/RouteBinding.d.ts.map +0 -1
  517. package/dist/x402/internal/RouteBinding.js.map +0 -1
  518. package/dist/x402/server/EvmCharge.d.ts.map +0 -1
  519. package/dist/x402/server/EvmCharge.js.map +0 -1
  520. package/dist/x402/server/Facilitator.d.ts.map +0 -1
  521. package/dist/x402/server/Facilitator.js.map +0 -1
  522. package/dist/zod.d.ts.map +0 -1
  523. package/dist/zod.js.map +0 -1
  524. package/src/BodyDigest.test.ts +0 -43
  525. package/src/BodyDigest.ts +0 -55
  526. package/src/Challenge.fuzz.test.ts +0 -154
  527. package/src/Challenge.test-d.ts +0 -82
  528. package/src/Challenge.test.ts +0 -1060
  529. package/src/Challenge.ts +0 -687
  530. package/src/Constants.ts +0 -58
  531. package/src/Credential.fuzz.test.ts +0 -62
  532. package/src/Credential.test.ts +0 -378
  533. package/src/Credential.ts +0 -217
  534. package/src/Errors.test.ts +0 -520
  535. package/src/Errors.ts +0 -448
  536. package/src/Expires.test.ts +0 -112
  537. package/src/Expires.ts +0 -59
  538. package/src/Html.ts +0 -67
  539. package/src/Mcp.ts +0 -85
  540. package/src/Method.test.ts +0 -177
  541. package/src/Method.ts +0 -631
  542. package/src/PaymentRequest.test.ts +0 -147
  543. package/src/PaymentRequest.ts +0 -108
  544. package/src/Receipt.test.ts +0 -151
  545. package/src/Receipt.ts +0 -146
  546. package/src/Store.test-d.ts +0 -211
  547. package/src/Store.test.ts +0 -407
  548. package/src/Store.ts +0 -397
  549. package/src/attestation/Attestation.integration.test.ts +0 -208
  550. package/src/attestation/Client.test.ts +0 -83
  551. package/src/attestation/Client.ts +0 -34
  552. package/src/attestation/Constants.ts +0 -15
  553. package/src/attestation/Server.test.ts +0 -60
  554. package/src/attestation/Server.ts +0 -12
  555. package/src/attestation/Types.test-d.ts +0 -54
  556. package/src/attestation/Types.ts +0 -77
  557. package/src/attestation/index.ts +0 -5
  558. package/src/attestation/internal/HttpMessageSignature.test.ts +0 -101
  559. package/src/attestation/internal/HttpMessageSignature.ts +0 -429
  560. package/src/attestation/internal/SigningContext.ts +0 -13
  561. package/src/bin.js +0 -2
  562. package/src/bin.ts +0 -4
  563. package/src/cli/account.ts +0 -269
  564. package/src/cli/cli.test.ts +0 -2221
  565. package/src/cli/cli.ts +0 -1650
  566. package/src/cli/config.test.ts +0 -89
  567. package/src/cli/config.ts +0 -50
  568. package/src/cli/internal.ts +0 -114
  569. package/src/cli/mcp.test.ts +0 -262
  570. package/src/cli/plugins/evm.ts +0 -55
  571. package/src/cli/plugins/index.ts +0 -4
  572. package/src/cli/plugins/plugin.ts +0 -84
  573. package/src/cli/plugins/stripe.ts +0 -174
  574. package/src/cli/plugins/tempo.ts +0 -1102
  575. package/src/cli/sessions/Manager.test.ts +0 -249
  576. package/src/cli/sessions/Manager.ts +0 -93
  577. package/src/cli/sessions/commands.ts +0 -444
  578. package/src/cli/sessions/request.test.ts +0 -51
  579. package/src/cli/sessions/request.ts +0 -353
  580. package/src/cli/sessions/store.test.ts +0 -581
  581. package/src/cli/sessions/store.ts +0 -940
  582. package/src/cli/utils.test.ts +0 -156
  583. package/src/cli/utils.ts +0 -394
  584. package/src/cli/validate/challenge.ts +0 -565
  585. package/src/cli/validate/discovery.test.ts +0 -435
  586. package/src/cli/validate/discovery.ts +0 -221
  587. package/src/cli/validate/helpers.ts +0 -166
  588. package/src/cli/validate/index.ts +0 -229
  589. package/src/cli/validate/messages.ts +0 -7
  590. package/src/cli/validate/payment.ts +0 -774
  591. package/src/cli/validate.test.ts +0 -843
  592. package/src/client/Methods.ts +0 -8
  593. package/src/client/Mppx.test-d.ts +0 -287
  594. package/src/client/Mppx.test.ts +0 -1065
  595. package/src/client/Mppx.ts +0 -487
  596. package/src/client/Transport.test.ts +0 -586
  597. package/src/client/Transport.ts +0 -170
  598. package/src/client/index.ts +0 -29
  599. package/src/client/internal/Fetch.browser.test.ts +0 -197
  600. package/src/client/internal/Fetch.test-d.ts +0 -109
  601. package/src/client/internal/Fetch.test.ts +0 -2336
  602. package/src/client/internal/Fetch.ts +0 -1075
  603. package/src/client/internal/MethodChallenge.ts +0 -35
  604. package/src/client/internal/MethodResponse.ts +0 -67
  605. package/src/client/internal/protocols/Mcp.test.ts +0 -220
  606. package/src/client/internal/protocols/Mcp.ts +0 -186
  607. package/src/client/internal/protocols/Mpp.ts +0 -21
  608. package/src/client/internal/protocols/Protocol.ts +0 -10
  609. package/src/client/internal/protocols/Shared.ts +0 -25
  610. package/src/client/internal/protocols/X402.ts +0 -46
  611. package/src/client/node.test.ts +0 -115
  612. package/src/client/node.ts +0 -247
  613. package/src/discovery/Discovery.test.ts +0 -214
  614. package/src/discovery/Discovery.ts +0 -105
  615. package/src/discovery/OpenApi.test.ts +0 -623
  616. package/src/discovery/OpenApi.ts +0 -192
  617. package/src/discovery/Validate.test.ts +0 -305
  618. package/src/discovery/Validate.ts +0 -77
  619. package/src/discovery/index.ts +0 -3
  620. package/src/discovery/internal/Metadata.ts +0 -51
  621. package/src/env.d.ts +0 -12
  622. package/src/evm/Assets.ts +0 -1
  623. package/src/evm/Chains.ts +0 -11
  624. package/src/evm/Methods.ts +0 -44
  625. package/src/evm/PublicInterface.test-d.ts +0 -134
  626. package/src/evm/Types.ts +0 -140
  627. package/src/evm/client/Charge.test.ts +0 -347
  628. package/src/evm/client/Charge.ts +0 -187
  629. package/src/evm/client/Methods.ts +0 -19
  630. package/src/evm/client/index.ts +0 -6
  631. package/src/evm/index.ts +0 -16
  632. package/src/evm/server/Charge.test.ts +0 -339
  633. package/src/evm/server/Charge.ts +0 -295
  634. package/src/evm/server/Methods.ts +0 -22
  635. package/src/evm/server/index.ts +0 -6
  636. package/src/index.ts +0 -14
  637. package/src/internal/AcceptPayment.test.ts +0 -347
  638. package/src/internal/AcceptPayment.ts +0 -366
  639. package/src/internal/HeaderCodec.ts +0 -36
  640. package/src/internal/changeset.test.ts +0 -106
  641. package/src/internal/constantTimeEqual.test.ts +0 -47
  642. package/src/internal/constantTimeEqual.ts +0 -10
  643. package/src/internal/env.test.ts +0 -42
  644. package/src/internal/env.ts +0 -49
  645. package/src/internal/types.test-d.ts +0 -21
  646. package/src/internal/types.ts +0 -479
  647. package/src/mcp/client/McpClient.integration.test.ts +0 -639
  648. package/src/mcp/client/McpClient.test-d.ts +0 -144
  649. package/src/mcp/client/McpClient.test.ts +0 -463
  650. package/src/mcp/client/McpClient.ts +0 -307
  651. package/src/mcp/client/McpClient.unit.test.ts +0 -135
  652. package/src/mcp/client/index.ts +0 -2
  653. package/src/mcp/server/Transport.test.ts +0 -191
  654. package/src/mcp/server/Transport.ts +0 -111
  655. package/src/mcp/server/index.ts +0 -1
  656. package/src/middlewares/elysia.test.ts +0 -285
  657. package/src/middlewares/elysia.ts +0 -116
  658. package/src/middlewares/express.test.ts +0 -361
  659. package/src/middlewares/express.ts +0 -140
  660. package/src/middlewares/hono.test.ts +0 -473
  661. package/src/middlewares/hono.ts +0 -153
  662. package/src/middlewares/internal/mppx.test.ts +0 -177
  663. package/src/middlewares/internal/mppx.ts +0 -67
  664. package/src/middlewares/nextjs.test.ts +0 -359
  665. package/src/middlewares/nextjs.ts +0 -107
  666. package/src/proxy/Proxy.test.ts +0 -1038
  667. package/src/proxy/Proxy.ts +0 -483
  668. package/src/proxy/Proxy.upstreamError.test.ts +0 -364
  669. package/src/proxy/Service.test.ts +0 -252
  670. package/src/proxy/Service.ts +0 -280
  671. package/src/proxy/index.ts +0 -6
  672. package/src/proxy/internal/Headers.test.ts +0 -139
  673. package/src/proxy/internal/Headers.ts +0 -66
  674. package/src/proxy/internal/Route.test.ts +0 -217
  675. package/src/proxy/internal/Route.ts +0 -64
  676. package/src/proxy/services/anthropic.test.ts +0 -132
  677. package/src/proxy/services/anthropic.ts +0 -53
  678. package/src/proxy/services/hooks.test-d.ts +0 -14
  679. package/src/proxy/services/hooks.test.ts +0 -44
  680. package/src/proxy/services/openai.test.ts +0 -157
  681. package/src/proxy/services/openai.ts +0 -60
  682. package/src/proxy/services/stripe.test.ts +0 -175
  683. package/src/proxy/services/stripe.ts +0 -59
  684. package/src/server/Methods.test-d.ts +0 -88
  685. package/src/server/Methods.test.ts +0 -69
  686. package/src/server/Methods.ts +0 -3
  687. package/src/server/Mppx.authorize.test.ts +0 -210
  688. package/src/server/Mppx.test-d.ts +0 -494
  689. package/src/server/Mppx.test.ts +0 -6711
  690. package/src/server/Mppx.ts +0 -2919
  691. package/src/server/NodeListener.test.ts +0 -293
  692. package/src/server/NodeListener.ts +0 -45
  693. package/src/server/Request.test.ts +0 -255
  694. package/src/server/Request.ts +0 -155
  695. package/src/server/Response.test.ts +0 -32
  696. package/src/server/Response.ts +0 -45
  697. package/src/server/Transport.test.ts +0 -598
  698. package/src/server/Transport.ts +0 -320
  699. package/src/server/index.ts +0 -9
  700. package/src/server/internal/html/compose.main.gen.ts +0 -2
  701. package/src/server/internal/html/compose.main.ts +0 -88
  702. package/src/server/internal/html/config.ts +0 -672
  703. package/src/server/internal/html/constants.ts +0 -28
  704. package/src/server/internal/html/serviceWorker.client.ts +0 -28
  705. package/src/server/internal/html/serviceWorker.gen.ts +0 -2
  706. package/src/server/internal/html/serviceWorker.ts +0 -27
  707. package/src/server/internal/html/tsconfig.compose.json +0 -8
  708. package/src/server/internal/html/tsconfig.worker.client.json +0 -8
  709. package/src/server/internal/html/tsconfig.worker.json +0 -8
  710. package/src/server/internal/scope.ts +0 -43
  711. package/src/stripe/Charge.integration.test.ts +0 -329
  712. package/src/stripe/Methods.test.ts +0 -62
  713. package/src/stripe/Methods.ts +0 -44
  714. package/src/stripe/client/Charge.test.ts +0 -205
  715. package/src/stripe/client/Charge.ts +0 -132
  716. package/src/stripe/client/Methods.ts +0 -37
  717. package/src/stripe/client/index.ts +0 -2
  718. package/src/stripe/index.ts +0 -1
  719. package/src/stripe/internal/constants.ts +0 -7
  720. package/src/stripe/internal/types.ts +0 -47
  721. package/src/stripe/server/Charge.test-d.ts +0 -81
  722. package/src/stripe/server/Charge.test.ts +0 -700
  723. package/src/stripe/server/Charge.ts +0 -487
  724. package/src/stripe/server/Methods.test-d.ts +0 -157
  725. package/src/stripe/server/Methods.test.ts +0 -403
  726. package/src/stripe/server/Methods.ts +0 -441
  727. package/src/stripe/server/index.ts +0 -2
  728. package/src/stripe/server/internal/deposit-address.ts +0 -57
  729. package/src/stripe/server/internal/html/main.ts +0 -165
  730. package/src/stripe/server/internal/html/node_modules/.bin/mppx +0 -22
  731. package/src/stripe/server/internal/html/node_modules/.bin/mppx.src +0 -22
  732. package/src/stripe/server/internal/html/package.json +0 -9
  733. package/src/stripe/server/internal/html/stripe-js-pure.d.ts +0 -7
  734. package/src/stripe/server/internal/html/tsconfig.json +0 -8
  735. package/src/stripe/server/internal/html/types.ts +0 -5
  736. package/src/stripe/server/internal/html.gen.ts +0 -2
  737. package/src/stripe/server/internal/record-payment.ts +0 -66
  738. package/src/stripe/server/internal/request.ts +0 -49
  739. package/src/tap/Constants.ts +0 -32
  740. package/src/tap/Tap.test.ts +0 -125
  741. package/src/tap/Types.ts +0 -11
  742. package/src/tap/client/index.ts +0 -54
  743. package/src/tap/index.ts +0 -4
  744. package/src/tap/server/index.ts +0 -48
  745. package/src/tempo/AccessKeyAuthorization.test.ts +0 -141
  746. package/src/tempo/Attribution.test.ts +0 -294
  747. package/src/tempo/Attribution.ts +0 -185
  748. package/src/tempo/Methods.test.ts +0 -425
  749. package/src/tempo/Methods.ts +0 -367
  750. package/src/tempo/Proof.conformance.test.ts +0 -146
  751. package/src/tempo/Proof.test-d.ts +0 -32
  752. package/src/tempo/Proof.test.ts +0 -40
  753. package/src/tempo/Proof.ts +0 -69
  754. package/src/tempo/PublicExports.test-d.ts +0 -130
  755. package/src/tempo/Subscription.integration.test.ts +0 -591
  756. package/src/tempo/client/Charge.test.ts +0 -501
  757. package/src/tempo/client/Charge.ts +0 -271
  758. package/src/tempo/client/Methods.ts +0 -45
  759. package/src/tempo/client/ResolveAccount.ts +0 -46
  760. package/src/tempo/client/Subscription.test.ts +0 -180
  761. package/src/tempo/client/Subscription.ts +0 -156
  762. package/src/tempo/client/index.ts +0 -17
  763. package/src/tempo/index.ts +0 -5
  764. package/src/tempo/internal/account.ts +0 -56
  765. package/src/tempo/internal/address.test.ts +0 -42
  766. package/src/tempo/internal/address.ts +0 -6
  767. package/src/tempo/internal/auto-swap.test.ts +0 -198
  768. package/src/tempo/internal/auto-swap.ts +0 -145
  769. package/src/tempo/internal/charge.test.ts +0 -66
  770. package/src/tempo/internal/charge.ts +0 -43
  771. package/src/tempo/internal/defaults.test.ts +0 -95
  772. package/src/tempo/internal/defaults.ts +0 -53
  773. package/src/tempo/internal/fee-payer.test.ts +0 -1177
  774. package/src/tempo/internal/fee-payer.ts +0 -808
  775. package/src/tempo/internal/fee-token.test.ts +0 -165
  776. package/src/tempo/internal/fee-token.ts +0 -72
  777. package/src/tempo/internal/proof.test.ts +0 -97
  778. package/src/tempo/internal/proof.ts +0 -87
  779. package/src/tempo/internal/selectors.ts +0 -10
  780. package/src/tempo/internal/types.ts +0 -19
  781. package/src/tempo/legacy/AccessKeyAuthorization.test.ts +0 -162
  782. package/src/tempo/legacy/README.md +0 -9
  783. package/src/tempo/legacy/client/ChannelOps.test.ts +0 -379
  784. package/src/tempo/legacy/client/ChannelOps.ts +0 -271
  785. package/src/tempo/legacy/client/Session.test.ts +0 -800
  786. package/src/tempo/legacy/client/Session.ts +0 -397
  787. package/src/tempo/legacy/client/SessionManager.test.ts +0 -468
  788. package/src/tempo/legacy/client/SessionManager.ts +0 -909
  789. package/src/tempo/legacy/client/index.ts +0 -6
  790. package/src/tempo/legacy/index.ts +0 -4
  791. package/src/tempo/legacy/session/Chain.test.ts +0 -1349
  792. package/src/tempo/legacy/session/Chain.ts +0 -830
  793. package/src/tempo/legacy/session/Channel.test.ts +0 -109
  794. package/src/tempo/legacy/session/Channel.ts +0 -51
  795. package/src/tempo/legacy/session/Types.ts +0 -91
  796. package/src/tempo/legacy/session/Voucher.test.ts +0 -410
  797. package/src/tempo/legacy/session/Voucher.ts +0 -183
  798. package/src/tempo/legacy/session/escrow.abi.ts +0 -760
  799. package/src/tempo/legacy/session/index.ts +0 -8
  800. package/src/tempo/server/AtomicStore.test-d.ts +0 -63
  801. package/src/tempo/server/Charge.test.ts +0 -6056
  802. package/src/tempo/server/Charge.ts +0 -1379
  803. package/src/tempo/server/Methods.ts +0 -86
  804. package/src/tempo/server/Relay.test.ts +0 -677
  805. package/src/tempo/server/Relay.ts +0 -297
  806. package/src/tempo/server/SponsorBudget.test.ts +0 -154
  807. package/src/tempo/server/SponsorBudget.ts +0 -219
  808. package/src/tempo/server/Sse.test.ts +0 -321
  809. package/src/tempo/server/Subscription.test.ts +0 -1944
  810. package/src/tempo/server/Subscription.ts +0 -1336
  811. package/src/tempo/server/index.ts +0 -12
  812. package/src/tempo/server/internal/html/main.ts +0 -115
  813. package/src/tempo/server/internal/html/node_modules/.bin/mppx +0 -22
  814. package/src/tempo/server/internal/html/node_modules/.bin/mppx.src +0 -22
  815. package/src/tempo/server/internal/html/package.json +0 -10
  816. package/src/tempo/server/internal/html/tsconfig.json +0 -8
  817. package/src/tempo/server/internal/html.gen.ts +0 -2
  818. package/src/tempo/server/internal/request-body.test.ts +0 -210
  819. package/src/tempo/server/internal/request-body.ts +0 -61
  820. package/src/tempo/server/internal/transport.test.ts +0 -922
  821. package/src/tempo/server/internal/transport.ts +0 -322
  822. package/src/tempo/session/README.md +0 -320
  823. package/src/tempo/session/Snapshot.test.ts +0 -41
  824. package/src/tempo/session/Snapshot.ts +0 -95
  825. package/src/tempo/session/client/ChannelOps.test.ts +0 -218
  826. package/src/tempo/session/client/ChannelOps.ts +0 -348
  827. package/src/tempo/session/client/ChannelStore.ts +0 -111
  828. package/src/tempo/session/client/CredentialState.test.ts +0 -789
  829. package/src/tempo/session/client/CredentialState.ts +0 -942
  830. package/src/tempo/session/client/ReceiptCoordinator.ts +0 -95
  831. package/src/tempo/session/client/Runtime.test.ts +0 -1104
  832. package/src/tempo/session/client/Runtime.ts +0 -1008
  833. package/src/tempo/session/client/Session.test.ts +0 -1355
  834. package/src/tempo/session/client/Session.ts +0 -420
  835. package/src/tempo/session/client/SessionManager.test.ts +0 -1899
  836. package/src/tempo/session/client/SessionManager.ts +0 -996
  837. package/src/tempo/session/client/Transports.test.ts +0 -1141
  838. package/src/tempo/session/client/Transports.ts +0 -1534
  839. package/src/tempo/session/client/index.ts +0 -40
  840. package/src/tempo/session/client/internal/SessionManager.ts +0 -36
  841. package/src/tempo/session/index.ts +0 -7
  842. package/src/tempo/session/precompile/Chain.integration.test.ts +0 -339
  843. package/src/tempo/session/precompile/Chain.test.ts +0 -1641
  844. package/src/tempo/session/precompile/Chain.ts +0 -1269
  845. package/src/tempo/session/precompile/Channel.test.ts +0 -147
  846. package/src/tempo/session/precompile/Channel.ts +0 -108
  847. package/src/tempo/session/precompile/Protocol.test.ts +0 -358
  848. package/src/tempo/session/precompile/Protocol.ts +0 -520
  849. package/src/tempo/session/precompile/Voucher.test.ts +0 -354
  850. package/src/tempo/session/precompile/Voucher.ts +0 -162
  851. package/src/tempo/session/precompile/escrow.abi.ts +0 -226
  852. package/src/tempo/session/precompile/index.ts +0 -33
  853. package/src/tempo/session/server/ChannelOps.test.ts +0 -129
  854. package/src/tempo/session/server/ChannelOps.ts +0 -157
  855. package/src/tempo/session/server/ChannelStore.test.ts +0 -1093
  856. package/src/tempo/session/server/ChannelStore.ts +0 -856
  857. package/src/tempo/session/server/CredentialVerification.test.ts +0 -299
  858. package/src/tempo/session/server/CredentialVerification.ts +0 -1087
  859. package/src/tempo/session/server/MeteredStream.ts +0 -99
  860. package/src/tempo/session/server/RequestState.test.ts +0 -574
  861. package/src/tempo/session/server/RequestState.ts +0 -507
  862. package/src/tempo/session/server/Session.integration.test.ts +0 -449
  863. package/src/tempo/session/server/Session.test.ts +0 -4247
  864. package/src/tempo/session/server/Session.ts +0 -669
  865. package/src/tempo/session/server/Settlement.test.ts +0 -345
  866. package/src/tempo/session/server/Settlement.ts +0 -527
  867. package/src/tempo/session/server/Sse.fuzz.test.ts +0 -138
  868. package/src/tempo/session/server/Sse.test.ts +0 -634
  869. package/src/tempo/session/server/Sse.ts +0 -261
  870. package/src/tempo/session/server/Transports.test.ts +0 -346
  871. package/src/tempo/session/server/Transports.ts +0 -256
  872. package/src/tempo/session/server/Ws.test.ts +0 -765
  873. package/src/tempo/session/server/Ws.ts +0 -391
  874. package/src/tempo/session/server/index.ts +0 -12
  875. package/src/tempo/subscription/KeyAuthorization.test.ts +0 -282
  876. package/src/tempo/subscription/KeyAuthorization.ts +0 -396
  877. package/src/tempo/subscription/Receipt.ts +0 -28
  878. package/src/tempo/subscription/Store.test.ts +0 -609
  879. package/src/tempo/subscription/Store.ts +0 -449
  880. package/src/tempo/subscription/Types.ts +0 -68
  881. package/src/tempo/subscription/index.ts +0 -23
  882. package/src/tsconfig.json +0 -10
  883. package/src/validation/core.ts +0 -386
  884. package/src/validation/index.ts +0 -11
  885. package/src/viem/Account.test.ts +0 -72
  886. package/src/viem/Account.ts +0 -30
  887. package/src/viem/Client.test.ts +0 -366
  888. package/src/viem/Client.ts +0 -93
  889. package/src/web-bot-auth/Constants.ts +0 -24
  890. package/src/web-bot-auth/Types.ts +0 -9
  891. package/src/web-bot-auth/WebBotAuth.test.ts +0 -182
  892. package/src/web-bot-auth/client/index.ts +0 -84
  893. package/src/web-bot-auth/index.ts +0 -6
  894. package/src/web-bot-auth/internal/JwkThumbprint.ts +0 -21
  895. package/src/web-bot-auth/internal/SignatureAgent.ts +0 -18
  896. package/src/web-bot-auth/server/index.ts +0 -113
  897. package/src/x402/Assets.test.ts +0 -253
  898. package/src/x402/Assets.ts +0 -221
  899. package/src/x402/Exact.e2e.test.ts +0 -488
  900. package/src/x402/Exact.localnet.test.ts +0 -475
  901. package/src/x402/Header.test.ts +0 -73
  902. package/src/x402/Header.ts +0 -79
  903. package/src/x402/PublicInterface.test-d.ts +0 -39
  904. package/src/x402/Types.ts +0 -248
  905. package/src/x402/client/Exact.test.ts +0 -309
  906. package/src/x402/client/Exact.ts +0 -186
  907. package/src/x402/index.ts +0 -6
  908. package/src/x402/internal/ChallengeBrand.ts +0 -14
  909. package/src/x402/internal/RouteBinding.ts +0 -18
  910. package/src/x402/server/EvmCharge.ts +0 -410
  911. package/src/x402/server/Facilitator.test.ts +0 -111
  912. package/src/x402/server/Facilitator.ts +0 -56
  913. package/src/zod.test.ts +0 -169
  914. package/src/zod.ts +0 -71
@@ -1,1379 +0,0 @@
1
- import * as SignatureEnvelope from 'ox/tempo/SignatureEnvelope'
2
- import {
3
- decodeFunctionData,
4
- formatUnits,
5
- keccak256,
6
- parseEventLogs,
7
- type TransactionReceipt,
8
- } from 'viem'
9
- import {
10
- getTransactionReceipt,
11
- sendRawTransaction,
12
- sendRawTransactionSync,
13
- signTransaction,
14
- verifyTypedData,
15
- call as viem_call,
16
- } from 'viem/actions'
17
- import { Abis, Actions, Transaction } from 'viem/tempo'
18
- import { tempo as tempo_chain } from 'viem/tempo/chains'
19
-
20
- import { PaymentError, VerificationFailedError } from '../../Errors.js'
21
- import * as Expires from '../../Expires.js'
22
- import type { LooseOmit, NoExtraKeys } from '../../internal/types.js'
23
- import * as Method from '../../Method.js'
24
- import type * as Html from '../../server/internal/html/config.ts'
25
- import * as Store from '../../Store.js'
26
- import * as Client from '../../viem/Client.js'
27
- import type * as z from '../../zod.js'
28
- import * as Attribution from '../Attribution.js'
29
- import * as Account from '../internal/account.js'
30
- import * as TempoAddress from '../internal/address.js'
31
- import * as Charge_internal from '../internal/charge.js'
32
- import * as defaults from '../internal/defaults.js'
33
- import * as FeePayer from '../internal/fee-payer.js'
34
- import { resolveFeeToken } from '../internal/fee-token.js'
35
- import * as Proof from '../internal/proof.js'
36
- import * as Selectors from '../internal/selectors.js'
37
- import type * as types from '../internal/types.js'
38
- import * as Methods from '../Methods.js'
39
- import { html as htmlContent } from './internal/html.gen.js'
40
- import * as Relay from './Relay.js'
41
- import * as SponsorBudget from './SponsorBudget.js'
42
-
43
- /**
44
- * Creates a Tempo charge method intent for usage on the server.
45
- *
46
- * @example
47
- * ```ts
48
- * import { tempo } from 'mppx/server'
49
- *
50
- * const charge = tempo.charge()
51
- * ```
52
- */
53
- export function charge<const parameters extends charge.Parameters>(
54
- parameters: NoExtraKeys<parameters, charge.Parameters> = {} as NoExtraKeys<
55
- parameters,
56
- charge.Parameters
57
- >,
58
- ): Method.Server<typeof Methods.charge, charge.DeriveDefaults<parameters>> {
59
- const {
60
- amount,
61
- currency = defaults.resolveCurrency(parameters),
62
- decimals = defaults.decimals,
63
- description,
64
- externalId,
65
- feeToken: configuredFeeToken,
66
- feePayerPolicy,
67
- html,
68
- memo,
69
- relay,
70
- sponsorBudget,
71
- splits,
72
- supportedModes,
73
- validateSender,
74
- waitForConfirmation = true,
75
- } = parameters
76
- const storeKeyPrefix = parameters.storeKeyPrefix ?? ''
77
- const rawStore = (parameters.store ?? Store.memory()) as Store.AtomicStore<charge.StoreItemMap>
78
- const store = Store.from(rawStore, { keyPrefix: storeKeyPrefix })
79
- const {
80
- maxInFlightReservations: legacyMaxInFlightReservations,
81
- maxInFlightTotalFee: legacyMaxInFlightTotalFee,
82
- ...transactionFeePayerPolicy
83
- } = feePayerPolicy ?? {}
84
- const sponsorBudgetConfig = sponsorBudget === false ? undefined : (sponsorBudget ?? {})
85
- const maxInFlightReservations =
86
- sponsorBudgetConfig?.maxInFlightReservations ?? legacyMaxInFlightReservations ?? 100
87
- const maxInFlightTotalFee =
88
- sponsorBudgetConfig?.maxInFlightTotalFee ??
89
- legacyMaxInFlightTotalFee ??
90
- (feePayerPolicy?.maxTotalFee ?? 50_000_000_000_000_000n) * 10n
91
- if (sponsorBudgetConfig) {
92
- if (!Number.isSafeInteger(maxInFlightReservations) || maxInFlightReservations <= 0)
93
- throw new Error('`sponsorBudget.maxInFlightReservations` must be a positive safe integer.')
94
- if (maxInFlightTotalFee <= 0n)
95
- throw new Error('`sponsorBudget.maxInFlightTotalFee` must be greater than zero.')
96
- }
97
- // Aggregate exposure belongs to the actual sponsor, not a caller-specific replay namespace.
98
- // Keep it unprefixed and shared across every tenant/process using the sponsor.
99
- const sponsorBudgetStore = sponsorBudgetConfig
100
- ? (Store.from(sponsorBudgetConfig.store ?? rawStore) as Store.AtomicStore<{
101
- [key: `mppx:charge:sponsor-budget:${string}`]: SponsorBudget.State
102
- }>)
103
- : undefined
104
- const proofStore = parameters.store
105
- ? Store.from(parameters.store as Store.AtomicStore<charge.StoreItemMap>, {
106
- keyPrefix: storeKeyPrefix,
107
- })
108
- : undefined
109
-
110
- const { recipient, feePayer, feePayerUrl } = Account.resolve(parameters)
111
- if (configuredFeeToken && feePayerUrl)
112
- throw new Error('`feeToken` can only be configured for a local fee payer.')
113
-
114
- const getClient = Client.getResolver({
115
- chain: { ...tempo_chain, experimental_preconfirmationTime: 500 },
116
- feePayerUrl,
117
- getClient: parameters.getClient,
118
- rpcUrl: defaults.rpcUrl,
119
- })
120
-
121
- function resolveRequest(request: Method.VerifyContext<typeof Methods.charge>['request']) {
122
- const parsed = Methods.charge.schema.request.safeParse(request)
123
- if (parsed.success) return parsed.data
124
- // Credential handlers receive the HMAC-bound request in canonical output
125
- // form, so it must not be transformed a second time.
126
- return request as unknown as z.output<typeof Methods.charge.schema.request>
127
- }
128
-
129
- async function resolveCredentialContext({
130
- credential,
131
- request,
132
- }: {
133
- credential: Method.VerifyContext<typeof Methods.charge>['credential']
134
- request: Method.VerifyContext<typeof Methods.charge>['request']
135
- }) {
136
- const { challenge, payload } = credential
137
- const resolvedRequest = resolveRequest(request)
138
- const chainId = resolvedRequest.methodDetails?.chainId ?? request.chainId
139
- const { amount, methodDetails } = resolvedRequest
140
- const supportedModes = methodDetails?.supportedModes as
141
- | readonly Methods.ChargeMode[]
142
- | undefined
143
- const currency = resolvedRequest.currency as `0x${string}`
144
- const recipient = resolvedRequest.recipient as `0x${string}`
145
- const memo = methodDetails?.memo as `0x${string}` | undefined
146
- const isZeroAmount = BigInt(amount) === 0n
147
-
148
- Expires.assert(challenge.expires, challenge.id)
149
-
150
- if (isZeroAmount && payload.type !== 'proof')
151
- throw new MismatchError('Zero-amount challenges require a proof credential.', {})
152
-
153
- return {
154
- amount,
155
- chainId,
156
- challenge,
157
- client: await getClient({ chainId }),
158
- currency,
159
- isZeroAmount,
160
- memo,
161
- methodDetails,
162
- payload,
163
- recipient,
164
- requestAllowsFeePayer: request.feePayer !== false,
165
- resolvedRequest,
166
- supportedModes,
167
- }
168
- }
169
-
170
- type CredentialContext = Awaited<ReturnType<typeof resolveCredentialContext>>
171
- type Credential = Method.VerifyContext<typeof Methods.charge>['credential']
172
- type HashPayload = Extract<Credential['payload'], { type: 'hash' }>
173
- type ProofPayload = Extract<Credential['payload'], { type: 'proof' }>
174
- type TransactionPayload = Extract<Credential['payload'], { type: 'transaction' }>
175
-
176
- async function validateHashCredential(
177
- credential: Credential,
178
- payload: HashPayload,
179
- context: CredentialContext,
180
- ) {
181
- const {
182
- amount,
183
- chainId,
184
- challenge,
185
- client,
186
- currency,
187
- memo,
188
- methodDetails,
189
- recipient,
190
- supportedModes,
191
- } = context
192
- if (supportedModes && !supportedModes.includes('push'))
193
- throw new MismatchError('Hash credentials are not supported for this challenge.', {})
194
-
195
- const source = parseHashCredentialSource({
196
- chainId: chainId ?? client.chain?.id,
197
- source: credential.source,
198
- })
199
- const transfers = getExpectedTransfers({ amount, memo, methodDetails, recipient })
200
- const receipt = await getTransactionReceipt(client, {
201
- hash: payload.hash as `0x${string}`,
202
- })
203
- const sender = source?.address ?? receipt.from
204
- const matchedLogs = await assertTransferLogs(receipt, {
205
- currency,
206
- sender,
207
- source,
208
- transfers,
209
- validateSender,
210
- })
211
- if (!memo)
212
- assertChallengeBoundMemo(matchedLogs, {
213
- challengeId: challenge.id,
214
- realm: challenge.realm,
215
- })
216
- return { receipt: toReceipt(receipt), sender, transfers }
217
- }
218
-
219
- async function validateProofCredential(
220
- credential: Credential,
221
- payload: ProofPayload,
222
- context: CredentialContext,
223
- ) {
224
- const { chainId, challenge, client, isZeroAmount } = context
225
- if (!isZeroAmount)
226
- throw new MismatchError('Proof credentials are only valid for zero-amount challenges.', {})
227
-
228
- const expectedSource = credential.source
229
- if (!expectedSource) throw new MismatchError('Proof credential must include a source.', {})
230
-
231
- const resolvedChainId = challenge.request.methodDetails?.chainId ?? chainId!
232
- const source = Proof.parsePkhSource(expectedSource)
233
- if (!source || source.chainId !== resolvedChainId)
234
- throw new MismatchError('Proof credential source is invalid.', {})
235
-
236
- const valid = await verifyTypedData(client, {
237
- address: source.address,
238
- ...Proof.typedData({
239
- account: source.address,
240
- chainId: resolvedChainId,
241
- challengeId: challenge.id,
242
- realm: challenge.realm,
243
- }),
244
- signature: payload.signature as `0x${string}`,
245
- })
246
- if (!valid) {
247
- const proofSigner = recoverAuthorizedProofSigner({
248
- chainId: resolvedChainId,
249
- challengeId: challenge.id,
250
- realm: challenge.realm,
251
- signature: payload.signature as `0x${string}`,
252
- sourceAddress: source.address,
253
- })
254
- const authorized = proofSigner
255
- ? await isActiveAccessKey(client, { accessKey: proofSigner, account: source.address })
256
- : false
257
- if (!authorized) throw new MismatchError('Proof signature does not match source.', {})
258
- }
259
- return { sender: source.address }
260
- }
261
-
262
- async function validateTransactionCredential(
263
- credential: Credential,
264
- payload: TransactionPayload,
265
- request: Method.VerifyContext<typeof Methods.charge>['request'],
266
- context: CredentialContext,
267
- ) {
268
- const {
269
- amount,
270
- chainId,
271
- challenge,
272
- client,
273
- currency,
274
- memo,
275
- methodDetails,
276
- recipient,
277
- requestAllowsFeePayer,
278
- supportedModes,
279
- } = context
280
- if (supportedModes && !supportedModes.includes('pull'))
281
- throw new MismatchError('Transaction credentials are not supported for this challenge.', {})
282
-
283
- const serializedTransaction = payload.signature as Transaction.TransactionSerializedTempo
284
- if (!FeePayer.isTempoTransaction(serializedTransaction))
285
- throw new MismatchError('Only Tempo (0x76/0x78) transactions are supported.', {})
286
-
287
- const transaction = Transaction.deserialize(serializedTransaction)
288
- if (!transaction.signature || !transaction.from)
289
- throw new MismatchError(
290
- 'Transaction must be signed by the sender before fee payer co-signing.',
291
- {},
292
- )
293
-
294
- const isFeePayerTx =
295
- methodDetails?.feePayer === true &&
296
- requestAllowsFeePayer &&
297
- !!(typeof request.feePayer === 'object' ? request.feePayer : feePayer || feePayerUrl)
298
- const transfers = getExpectedTransfers({ amount, memo, methodDetails, recipient })
299
- const matchedCalls = assertTransferCalls(transaction.calls ?? [], {
300
- currency,
301
- exactCount: isFeePayerTx,
302
- transfers,
303
- })
304
- if (!memo)
305
- assertChallengeBoundCallMemo(matchedCalls, {
306
- challengeId: challenge.id,
307
- realm: challenge.realm,
308
- })
309
-
310
- if (isFeePayerTx) {
311
- FeePayer.validateCalls(
312
- transaction.calls,
313
- { amount, currency, recipient },
314
- { currency, expectedTransfers: transfers },
315
- )
316
- FeePayer.assertAllowedFeeToken(transaction, FeePayer.defaultAllowedFeeTokens(chainId))
317
- } else {
318
- await viem_call(
319
- client,
320
- FeePayer.simulationTransaction(transaction, { feePayer: false }) as never,
321
- )
322
- }
323
-
324
- return { isFeePayerTx, serializedTransaction, transaction, transfers }
325
- }
326
-
327
- async function validateCredential(
328
- credential: Credential,
329
- request: Method.VerifyContext<typeof Methods.charge>['request'],
330
- context: CredentialContext,
331
- ) {
332
- switch (context.payload.type) {
333
- case 'hash': {
334
- const { receipt, sender, transfers } = await validateHashCredential(
335
- credential,
336
- context.payload,
337
- context,
338
- )
339
- return {
340
- details: { mode: 'push' as const, sender, transfers },
341
- hash: context.payload.hash as `0x${string}`,
342
- receipt,
343
- type: 'hash' as const,
344
- }
345
- }
346
-
347
- case 'proof': {
348
- const { sender } = await validateProofCredential(credential, context.payload, context)
349
- return { details: { mode: 'proof' as const, sender }, type: 'proof' as const }
350
- }
351
-
352
- case 'transaction': {
353
- const { isFeePayerTx, serializedTransaction, transaction, transfers } =
354
- await validateTransactionCredential(credential, context.payload, request, context)
355
- return {
356
- details: {
357
- mode: 'pull' as const,
358
- sender: transaction.from as `0x${string}`,
359
- serializedTransaction,
360
- transfers,
361
- },
362
- isFeePayerTx,
363
- serializedTransaction,
364
- transaction,
365
- transfers,
366
- type: 'transaction' as const,
367
- }
368
- }
369
- }
370
- }
371
-
372
- type Defaults = charge.DeriveDefaults<parameters>
373
- const method = Method.toServer<typeof Methods.charge, Defaults>(Methods.charge, {
374
- canOffer: parameters.canOffer,
375
- onPaymentSuccess: parameters.onPaymentSuccess,
376
- defaults: {
377
- amount,
378
- currency,
379
- decimals,
380
- description,
381
- externalId,
382
- memo,
383
- recipient,
384
- splits,
385
- supportedModes,
386
- } as unknown as Defaults,
387
-
388
- stableBinding: chargeBinding,
389
-
390
- html: html
391
- ? {
392
- config: {},
393
- content: htmlContent,
394
- formatAmount: async (request: z.output<typeof Methods.charge.schema.request>) => {
395
- try {
396
- const chainId = request.methodDetails?.chainId
397
- if (chainId === undefined) throw new Error('no chainId')
398
- const client = await getClient({ chainId })
399
- const metadata = await Actions.token.getMetadata(client, {
400
- token: request.currency as `0x${string}`,
401
- })
402
- const symbol =
403
- new Intl.NumberFormat('en', {
404
- style: 'currency',
405
- currency: metadata.currency,
406
- currencyDisplay: 'narrowSymbol',
407
- })
408
- .formatToParts(0)
409
- .find((p) => p.type === 'currency')?.value ?? metadata.currency
410
- return `${symbol}${formatUnits(BigInt(request.amount), metadata.decimals)}`
411
- } catch {
412
- return `$${request.amount}`
413
- }
414
- },
415
- text: typeof html === 'object' ? html.text : undefined,
416
- theme: typeof html === 'object' ? html.theme : undefined,
417
- }
418
- : undefined,
419
-
420
- // TODO: dedupe `{charge,session}.request`
421
- async request({ credential, request }) {
422
- const chainId = await (async () => {
423
- if (request.chainId) return request.chainId
424
- if (parameters.testnet) return defaults.chainId.testnet
425
- return (await getClient({})).chain?.id
426
- })()
427
-
428
- const client = await (async () => {
429
- try {
430
- return await getClient({ chainId })
431
- } catch {
432
- throw new Error(`No client configured with chainId ${chainId}.`)
433
- }
434
- })()
435
- if (client.chain?.id !== chainId)
436
- throw new Error(`Client not configured with chainId ${chainId}.`)
437
-
438
- const resolvedFeePayer = (() => {
439
- if (request.feePayer === false) return credential ? false : undefined
440
- const account = typeof request.feePayer === 'object' ? request.feePayer : feePayer
441
- const requested = account ?? feePayer ?? feePayerUrl
442
- if (credential) return account ?? (feePayerUrl ? true : undefined)
443
- if (requested) return true
444
- return undefined
445
- })()
446
-
447
- return {
448
- ...request,
449
- chainId,
450
- feePayer: resolvedFeePayer,
451
- memo: request.memo || undefined,
452
- }
453
- },
454
-
455
- async validate({ credential, request }) {
456
- const context = await resolveCredentialContext({ credential, request })
457
- const validated = await validateCredential(credential, request, context)
458
-
459
- return {
460
- challenge: context.challenge,
461
- credential,
462
- details: validated.details,
463
- intent: 'charge',
464
- method: 'tempo',
465
- request: context.resolvedRequest,
466
- source: credential.source,
467
- }
468
- },
469
-
470
- async broadcast({ credential, request }) {
471
- const context = await resolveCredentialContext({ credential, request })
472
- const {
473
- amount,
474
- chainId,
475
- challenge,
476
- client,
477
- currency,
478
- memo,
479
- methodDetails,
480
- recipient,
481
- requestAllowsFeePayer,
482
- } = context
483
- const validated = await validateCredential(credential, request, context)
484
- const feePayerAccount =
485
- methodDetails?.feePayer === true && requestAllowsFeePayer
486
- ? typeof request.feePayer === 'object'
487
- ? request.feePayer
488
- : feePayer
489
- : undefined
490
- const expires = challenge.expires
491
- Expires.assert(expires, challenge.id)
492
- const replayExpires = Date.parse(expires)
493
-
494
- switch (validated.type) {
495
- case 'hash': {
496
- const { hash, receipt } = validated
497
- if (!(await tryClaimHash(store, hash, replayExpires))) {
498
- throw new VerificationFailedError({
499
- reason: 'Transaction hash has already been used',
500
- })
501
- }
502
- return receipt
503
- }
504
-
505
- case 'proof': {
506
- if (proofStore && !(await tryClaimProof(proofStore, challenge.id, replayExpires))) {
507
- throw new VerificationFailedError({
508
- reason: 'Proof credential has already been used',
509
- })
510
- }
511
-
512
- return {
513
- method: 'tempo',
514
- status: 'success',
515
- timestamp: new Date().toISOString(),
516
- reference: challenge.id,
517
- } as const
518
- }
519
-
520
- case 'transaction': {
521
- const { isFeePayerTx, serializedTransaction, transaction, transfers } = validated
522
-
523
- // Pre-broadcast dedup: catch exact byte-for-byte replays early.
524
- const hash = keccak256(serializedTransaction)
525
- if (!(await tryClaimHash(store, hash, replayExpires))) {
526
- throw new VerificationFailedError({
527
- reason: 'Transaction hash has already been used',
528
- })
529
- }
530
-
531
- let broadcastAttempted = false
532
- let finalHash: `0x${string}` | undefined
533
- let reservation: SponsorBudget.Handle | undefined
534
-
535
- try {
536
- const allowedFeeTokens = FeePayer.defaultAllowedFeeTokens(chainId)
537
- if (isFeePayerTx) FeePayer.assertAllowedFeeToken(transaction, allowedFeeTokens)
538
- const selectableFeeTokens = allowedFeeTokens as readonly `0x${string}`[]
539
-
540
- const completedTransaction = await (async () => {
541
- if (feePayerAccount && methodDetails?.feePayer !== false) {
542
- const completed = await FeePayer.preflightSponsorship({
543
- transaction,
544
- simulate: (request) => viem_call(client, request as never),
545
- async complete() {
546
- const feeToken =
547
- configuredFeeToken ??
548
- (await resolveFeeToken({
549
- account: feePayerAccount.address,
550
- allowedTokens: selectableFeeTokens,
551
- candidateTokens: selectableFeeTokens,
552
- client,
553
- prioritizeCandidates: true,
554
- }))
555
- const sponsored = FeePayer.prepareSponsoredTransaction({
556
- account: feePayerAccount,
557
- allowedFeeTokens,
558
- challengeExpires: expires,
559
- chainId: chainId ?? client.chain!.id,
560
- details: { amount, currency, recipient },
561
- policy: transactionFeePayerPolicy,
562
- transaction: {
563
- ...transaction,
564
- ...(feeToken ? { feeToken } : {}),
565
- },
566
- })
567
- return { feePayer: feePayerAccount.address, transaction: sponsored }
568
- },
569
- })
570
- return {
571
- serializedTransaction: await signTransaction(
572
- client,
573
- completed.transaction as never,
574
- ),
575
- sponsor: completed.feePayer,
576
- }
577
- }
578
- if (feePayerUrl && isFeePayerTx) {
579
- const completed = await FeePayer.preflightSponsorship({
580
- transaction,
581
- simulate: (request) => viem_call(client, request as never),
582
- async complete() {
583
- const hosted = await FeePayer.fillHostedFeePayerTransaction({
584
- allowedFeeTokens,
585
- challengeExpires: expires,
586
- chainId: chainId ?? client.chain!.id,
587
- details: { amount, currency, recipient },
588
- policy: transactionFeePayerPolicy,
589
- transaction,
590
- url: feePayerUrl,
591
- })
592
- return { ...hosted, transaction }
593
- },
594
- })
595
- return {
596
- serializedTransaction: completed.serializedTransaction,
597
- sponsor: completed.feePayer,
598
- }
599
- }
600
- return { serializedTransaction, sponsor: undefined }
601
- })()
602
- const serializedTransaction_final = completedTransaction.serializedTransaction
603
- finalHash = keccak256(serializedTransaction_final)
604
-
605
- if (
606
- finalHash.toLowerCase() !== hash.toLowerCase() &&
607
- !(await tryClaimHash(store, finalHash, replayExpires))
608
- )
609
- throw new VerificationFailedError({
610
- reason: 'Transaction hash has already been used',
611
- })
612
-
613
- if (isFeePayerTx) {
614
- const sponsor = completedTransaction.sponsor
615
- if (!sponsor)
616
- throw new VerificationFailedError({
617
- reason: 'Sponsored transaction has no configured fee payer',
618
- })
619
- const reservationChainId = chainId ?? client.chain!.id
620
- const { totalFee, validBeforeValue } = FeePayer.assertTransactionPolicy({
621
- challengeExpires: expires,
622
- chainId: reservationChainId,
623
- details: { amount, currency, recipient },
624
- policy: transactionFeePayerPolicy,
625
- transaction,
626
- })
627
- const expiresAt = validBeforeValue * 1_000
628
- const waitUntil = Math.min(
629
- expiresAt,
630
- expires ? Date.parse(expires) : Number.MAX_SAFE_INTEGER,
631
- )
632
- if (sponsorBudgetStore)
633
- reservation = await SponsorBudget.reserve(sponsorBudgetStore, {
634
- chainId: reservationChainId,
635
- expiresAt,
636
- fee: totalFee,
637
- getReceipt: (transactionHash) =>
638
- getTransactionReceipt(client, { hash: transactionHash }),
639
- id: finalHash.toLowerCase(),
640
- maxReservations: maxInFlightReservations,
641
- maxTotalFee: maxInFlightTotalFee,
642
- owner: globalThis.crypto.randomUUID(),
643
- sponsor,
644
- transactionHash: finalHash,
645
- waitUntil,
646
- })
647
- Expires.assert(challenge.expires, challenge.id)
648
- }
649
-
650
- // Pre-broadcast simulation for non-sponsored transactions.
651
- if (!isFeePayerTx)
652
- await viem_call(
653
- client,
654
- FeePayer.simulationTransaction(transaction, { feePayer: false }) as never,
655
- )
656
-
657
- if (
658
- reservation &&
659
- !(await SponsorBudget.transition(sponsorBudgetStore!, reservation, 'broadcasting'))
660
- )
661
- throw new VerificationFailedError({
662
- reason: 'Sponsor budget reservation ownership was lost before broadcast',
663
- })
664
-
665
- broadcastAttempted = true
666
- if (waitForConfirmation) {
667
- const receipt = await sendRawTransactionSync(client, {
668
- serializedTransaction: serializedTransaction_final,
669
- })
670
- if (reservation) await SponsorBudget.release(sponsorBudgetStore!, reservation)
671
- const matchedLogs = await assertTransferLogs(receipt, {
672
- currency,
673
- sender: transaction.from! as `0x${string}`,
674
- transfers,
675
- })
676
- if (!memo)
677
- assertChallengeBoundMemo(matchedLogs, {
678
- challengeId: challenge.id,
679
- realm: challenge.realm,
680
- })
681
- if (receipt.transactionHash.toLowerCase() !== finalHash.toLowerCase())
682
- throw new VerificationFailedError({
683
- reason: 'Broadcast transaction hash does not match the signed transaction',
684
- })
685
- return toReceipt(receipt)
686
- }
687
-
688
- // Optimistic path: broadcast without waiting for confirmation
689
- // (simulation above already ran). The returned receipt assumes
690
- // success — callers opt in via waitForConfirmation: false.
691
- const reference = await sendRawTransaction(client, {
692
- serializedTransaction: serializedTransaction_final,
693
- })
694
- if (reference.toLowerCase() !== finalHash.toLowerCase())
695
- throw new VerificationFailedError({
696
- reason: 'Broadcast transaction hash does not match the signed transaction',
697
- })
698
- if (
699
- reservation &&
700
- !(await SponsorBudget.transition(sponsorBudgetStore!, reservation, 'pending'))
701
- )
702
- throw new VerificationFailedError({
703
- reason: 'Sponsor budget reservation ownership was lost after broadcast',
704
- })
705
- return {
706
- method: 'tempo',
707
- status: 'success',
708
- timestamp: new Date().toISOString(),
709
- reference,
710
- } as const
711
- } catch (error) {
712
- if (!broadcastAttempted) {
713
- if (reservation) await SponsorBudget.release(sponsorBudgetStore!, reservation)
714
- if (finalHash && finalHash.toLowerCase() !== hash.toLowerCase())
715
- await releaseHashUse(store, finalHash)
716
- await releaseHashUse(store, hash)
717
- }
718
- throw error
719
- }
720
- }
721
- }
722
- },
723
- })
724
- return relay ? (Relay.configure(method, relay) as typeof method) : method
725
- }
726
-
727
- export declare namespace charge {
728
- type StoreItemMap = {
729
- [key: `mppx:charge:${string}`]: number | SponsorBudget.State | Store.ReplayMarker
730
- }
731
-
732
- type Defaults = LooseOmit<Method.RequestDefaults<typeof Methods.charge>, 'feePayer' | 'recipient'>
733
-
734
- type ValidateSender = (parameters: ValidateSenderParameters) => boolean | Promise<boolean>
735
-
736
- type ValidationDetails = {
737
- mode: 'proof' | 'pull' | 'push'
738
- sender?: `0x${string}` | undefined
739
- serializedTransaction?: Transaction.TransactionSerializedTempo | undefined
740
- transfers?: readonly ExpectedTransfer[] | undefined
741
- }
742
-
743
- type ValidateSenderParameters = {
744
- /** Actual TIP-20 `Transfer.from` address. */
745
- sender: `0x${string}`
746
- /** Address that mppx would normally require as the sender. */
747
- expectedSender: `0x${string}`
748
- /** Parsed hash credential source when the credential includes one. */
749
- source?: { address: `0x${string}`; chainId: number } | undefined
750
- }
751
-
752
- type Parameters = {
753
- /** Render payment page when Accept header is text/html (e.g. in browsers) */
754
- html?: boolean | Html.Config | undefined
755
- /**
756
- * Override the fee-sponsor policy used when co-signing Tempo charge
757
- * transactions. Defaults resolve per chain, including a higher
758
- * priority-fee ceiling on Moderato. Aggregate in-flight exposure is
759
- * configured separately with `sponsorBudget`.
760
- */
761
- feePayerPolicy?: FeePayerPolicy | undefined
762
- /**
763
- * Token a local fee payer uses to pay gas. If omitted, mppx selects a
764
- * funded allowed token, preferring pathUSD.
765
- *
766
- * This option is not supported with a remote fee-payer URL, which selects
767
- * its own token.
768
- */
769
- feeToken?: `0x${string}` | undefined
770
- /** Testnet mode. */
771
- testnet?: boolean | undefined
772
- /**
773
- * Store for charge replay protection.
774
- *
775
- * Non-zero charge flows default to an in-memory store if omitted. For
776
- * zero-dollar proof auth, replay prevention is enabled only when a store
777
- * is explicitly provided; otherwise proofs remain reusable until the
778
- * challenge expires.
779
- *
780
- * Replay protection requires a {@link Store.AtomicStore} so replay markers
781
- * can be written atomically.
782
- *
783
- * Use a shared store in multi-instance deployments so consumed hashes and
784
- * proofs are visible across all server instances.
785
- */
786
- store?: Store.AtomicStore | undefined
787
- /**
788
- * Validates a TIP-20 transfer sender when it differs from the credential
789
- * source. Core verification still validates amount, currency, recipient,
790
- * memo binding, transaction success, and replay protection.
791
- */
792
- validateSender?: ValidateSender | undefined
793
- /**
794
- * Prefix prepended to charge replay-protection store keys.
795
- *
796
- * By default, no prefix is applied.
797
- */
798
- storeKeyPrefix?: string | undefined
799
- /**
800
- * Delegates Tempo charge credential validation and broadcast to Tempo API
801
- * or a compatible MPP relay.
802
- *
803
- * The adapter delegates finalization to the relay for both modes. The
804
- * relay broadcasts pull credentials, while it recognizes a push
805
- * credential as already broadcast and returns its receipt without sending
806
- * it again.
807
- */
808
- relay?: RelayOptions | undefined
809
- /**
810
- * Configures aggregate in-flight fee exposure for sponsored transactions.
811
- *
812
- * Set to `false` only when aggregate exposure is enforced outside mppx.
813
- * The configured store must be shared by every process using the sponsor.
814
- * @default `{}`
815
- */
816
- sponsorBudget?: SponsorBudgetConfig | false | undefined
817
- /**
818
- * Whether to wait for the charge transaction to confirm on-chain before
819
- * responding. @default true
820
- *
821
- * When `false`, the transaction is simulated via `eth_estimateGas` and
822
- * broadcast without waiting for inclusion. The receipt will optimistically
823
- * report `status: 'success'` based on simulation alone — if the
824
- * transaction reverts on-chain after broadcast (e.g. due to a state
825
- * change between simulation and inclusion), the receipt will not reflect
826
- * the failure.
827
- */
828
- waitForConfirmation?: boolean | undefined
829
- } & Client.getResolver.Parameters &
830
- Account.resolve.Parameters &
831
- Defaults &
832
- Method.ComposableHooks<typeof Methods.charge>
833
-
834
- type DeriveDefaults<parameters extends Parameters> = types.DeriveDefaults<
835
- parameters,
836
- Defaults,
837
- {
838
- currency: string
839
- decimals: number
840
- }
841
- >
842
-
843
- type FeePayerPolicy = Partial<FeePayer.Policy> & {
844
- /**
845
- * Maximum number of sponsored transactions awaiting a terminal receipt.
846
- * @deprecated Use `sponsorBudget.maxInFlightReservations`.
847
- */
848
- maxInFlightReservations?: number | undefined
849
- /**
850
- * Maximum aggregate declared fee exposure awaiting terminal receipts.
851
- *
852
- * @deprecated Use `sponsorBudget.maxInFlightTotalFee`.
853
- */
854
- maxInFlightTotalFee?: bigint | undefined
855
- }
856
-
857
- type SponsorBudgetConfig = {
858
- /** Maximum number of sponsored transactions awaiting a terminal receipt. @default 100 */
859
- maxInFlightReservations?: number | undefined
860
- /** Maximum aggregate declared fee exposure. @default `feePayerPolicy.maxTotalFee * 10` */
861
- maxInFlightTotalFee?: bigint | undefined
862
- /** Atomic store shared by every process using the sponsor. Defaults to `store`. */
863
- store?: Store.AtomicStore | undefined
864
- }
865
-
866
- /** Tempo API relay configuration for server-side charges. */
867
- type RelayOptions = Relay.configure.Options
868
- }
869
-
870
- type ChargeRequest = z.output<typeof Methods.charge.schema.request>
871
-
872
- function chargeBinding(request: ChargeRequest) {
873
- // Exhaustively destructure so new charge request fields require an explicit binding decision.
874
- const { amount, currency, description, externalId, methodDetails, recipient, ...requestRest } =
875
- request
876
- requestRest satisfies Record<string, never>
877
-
878
- const { chainId, feePayer, memo, splits, supportedModes, ...methodDetailsRest } =
879
- methodDetails ?? {}
880
- methodDetailsRest satisfies Record<string, never>
881
- void feePayer
882
-
883
- return {
884
- amount,
885
- chainId,
886
- currency,
887
- description,
888
- externalId,
889
- memo,
890
- recipient,
891
- splits,
892
- supportedModes,
893
- }
894
- }
895
-
896
- type ExpectedTransfer = {
897
- amount: string
898
- allowAnyMemo?: boolean | undefined
899
- memo?: `0x${string}` | undefined
900
- recipient: `0x${string}`
901
- }
902
-
903
- function getExpectedTransfers(parameters: {
904
- amount: string
905
- memo: `0x${string}` | undefined
906
- methodDetails: { splits?: readonly Charge_internal.Split[] | undefined } | undefined
907
- recipient: `0x${string}`
908
- }): ExpectedTransfer[] {
909
- return Charge_internal.getTransfers({
910
- amount: parameters.amount,
911
- methodDetails: {
912
- memo: parameters.memo,
913
- splits: parameters.methodDetails?.splits,
914
- },
915
- recipient: parameters.recipient,
916
- }).map((transfer) => ({
917
- ...transfer,
918
- ...(!transfer.memo ? { allowAnyMemo: true } : {}),
919
- })) as ExpectedTransfer[]
920
- }
921
-
922
- function assertTransferCalls(
923
- calls: readonly { data?: `0x${string}` | undefined; to?: `0x${string}` | undefined }[],
924
- parameters: {
925
- currency: `0x${string}`
926
- exactCount?: boolean | undefined
927
- transfers: readonly ExpectedTransfer[]
928
- },
929
- ) {
930
- const transferCalls = getTransferCalls(calls)
931
-
932
- if (parameters.exactCount && transferCalls.length !== parameters.transfers.length)
933
- throw new MismatchError('Invalid transaction: no matching payment call found', {
934
- expectedCalls: String(parameters.transfers.length),
935
- actualCalls: String(transferCalls.length),
936
- })
937
-
938
- // Match memo-specific transfers before wildcards to avoid greedy
939
- // consumption of memo-bearing calls by allowAnyMemo entries.
940
- const sorted = [...parameters.transfers].sort((a, b) => {
941
- if (a.memo && !b.memo) return -1
942
- if (!a.memo && b.memo) return 1
943
- return 0
944
- })
945
-
946
- const used = new Set<number>()
947
- const matched: Charge_internal.Transfer[] = []
948
- for (const expected of sorted) {
949
- const matchIndex = transferCalls.findIndex((call, index) => {
950
- if (used.has(index)) return false
951
- const decoded = decodeTransferCall(call, parameters.currency)
952
- if (!decoded) return false
953
-
954
- if (!TempoAddress.isEqual(decoded.recipient, expected.recipient)) return false
955
- if (decoded.amount !== expected.amount) return false
956
- if (expected.memo) {
957
- return decoded.memo?.toLowerCase() === expected.memo.toLowerCase()
958
- }
959
- if (expected.allowAnyMemo) return true
960
- return decoded.memo === undefined
961
- })
962
-
963
- if (matchIndex === -1) {
964
- throw new MismatchError('Invalid transaction: no matching payment call found', {
965
- amount: expected.amount,
966
- currency: parameters.currency,
967
- recipient: expected.recipient,
968
- })
969
- }
970
-
971
- used.add(matchIndex)
972
- matched.push(decodeTransferCall(transferCalls[matchIndex]!, parameters.currency)!)
973
- }
974
-
975
- return matched
976
- }
977
-
978
- function getTransferCalls(
979
- calls: readonly { data?: `0x${string}` | undefined; to?: `0x${string}` | undefined }[],
980
- ) {
981
- const selectors = calls.map((call) => call.data?.slice(0, 10))
982
- const offset =
983
- selectors[0] === Selectors.approve && selectors[1] === Selectors.swapExactAmountOut ? 2 : 0
984
- const transferCalls = calls.slice(offset)
985
-
986
- if (
987
- transferCalls.length === 0 ||
988
- selectors
989
- .slice(offset)
990
- .some(
991
- (selector) => selector !== Selectors.transfer && selector !== Selectors.transferWithMemo,
992
- )
993
- ) {
994
- throw new MismatchError('Invalid transaction: no matching payment call found', {})
995
- }
996
-
997
- return transferCalls
998
- }
999
-
1000
- function decodeTransferCall(
1001
- call: { data?: `0x${string}` | undefined; to?: `0x${string}` | undefined },
1002
- currency: `0x${string}`,
1003
- ) {
1004
- if (!call.to || !TempoAddress.isEqual(call.to, currency) || !call.data) return null
1005
-
1006
- try {
1007
- const selector = call.data.slice(0, 10)
1008
- if (selector === Selectors.transfer) {
1009
- const { args } = decodeFunctionData({ abi: Abis.tip20, data: call.data })
1010
- const [recipient, amount] = args as [`0x${string}`, bigint]
1011
- return { amount: amount.toString(), recipient }
1012
- }
1013
-
1014
- if (selector === Selectors.transferWithMemo) {
1015
- const { args } = decodeFunctionData({ abi: Abis.tip20, data: call.data })
1016
- const [recipient, amount, memo] = args as [`0x${string}`, bigint, `0x${string}`]
1017
- return { amount: amount.toString(), memo, recipient }
1018
- }
1019
- } catch {
1020
- return null
1021
- }
1022
-
1023
- return null
1024
- }
1025
-
1026
- type TransferLog =
1027
- | {
1028
- kind: 'transfer'
1029
- args: { from: `0x${string}`; to: `0x${string}`; amount: bigint }
1030
- address: `0x${string}`
1031
- }
1032
- | {
1033
- kind: 'memo'
1034
- args: { from: `0x${string}`; to: `0x${string}`; amount: bigint; memo: `0x${string}` }
1035
- address: `0x${string}`
1036
- }
1037
-
1038
- async function assertTransferLogs(
1039
- receipt: TransactionReceipt,
1040
- parameters: {
1041
- currency: `0x${string}`
1042
- sender: `0x${string}`
1043
- source?: { address: `0x${string}`; chainId: number } | undefined
1044
- transfers: readonly ExpectedTransfer[]
1045
- validateSender?: charge.ValidateSender | undefined
1046
- },
1047
- ): Promise<TransferLog[]> {
1048
- const logs = getTransferLogEffects(receipt)
1049
- const used = new Set<number>()
1050
- const matched: TransferLog[] = []
1051
-
1052
- // Match memo-specific transfers before wildcards to avoid greedy
1053
- // consumption of memo-bearing logs by allowAnyMemo entries.
1054
- const sorted = [...parameters.transfers].sort((a, b) => {
1055
- if (a.memo && !b.memo) return -1
1056
- if (!a.memo && b.memo) return 1
1057
- return 0
1058
- })
1059
-
1060
- for (const transfer of sorted) {
1061
- let matchIndex = -1
1062
- for (const [index, log] of logs.entries()) {
1063
- if (used.has(index)) continue
1064
- if (!TempoAddress.isEqual(log.address, parameters.currency)) continue
1065
- if (!TempoAddress.isEqual(log.args.to, transfer.recipient)) continue
1066
- if (log.args.amount.toString() !== transfer.amount) continue
1067
- const memoMatches = (() => {
1068
- if (transfer.memo)
1069
- return log.kind === 'memo' && log.args.memo.toLowerCase() === transfer.memo.toLowerCase()
1070
- if (transfer.allowAnyMemo) return log.kind === 'transfer' || log.kind === 'memo'
1071
- return log.kind === 'transfer'
1072
- })()
1073
- if (!memoMatches) continue
1074
- if (
1075
- !(await isValidTransferSender({
1076
- expectedSender: parameters.sender,
1077
- sender: log.args.from,
1078
- source: parameters.source,
1079
- validateSender: parameters.validateSender,
1080
- }))
1081
- )
1082
- continue
1083
- matchIndex = index
1084
- break
1085
- }
1086
-
1087
- if (matchIndex === -1) {
1088
- throw new MismatchError('Payment verification failed: no matching transfer found.', {
1089
- amount: transfer.amount,
1090
- currency: parameters.currency,
1091
- recipient: transfer.recipient,
1092
- })
1093
- }
1094
-
1095
- used.add(matchIndex)
1096
- matched.push(logs[matchIndex]! as TransferLog)
1097
- }
1098
-
1099
- return matched
1100
- }
1101
-
1102
- type ParsedTransferLog =
1103
- | {
1104
- kind: 'transfer'
1105
- args: { from: `0x${string}`; to: `0x${string}`; amount: bigint }
1106
- address: `0x${string}`
1107
- logIndex: number
1108
- }
1109
- | {
1110
- kind: 'memo'
1111
- args: { from: `0x${string}`; to: `0x${string}`; amount: bigint; memo: `0x${string}` }
1112
- address: `0x${string}`
1113
- logIndex: number
1114
- }
1115
-
1116
- function getTransferLogEffects(receipt: TransactionReceipt): TransferLog[] {
1117
- const transferLogs = parseEventLogs({
1118
- abi: Abis.tip20,
1119
- eventName: 'Transfer',
1120
- logs: receipt.logs,
1121
- }).map(
1122
- (log) =>
1123
- ({
1124
- address: log.address,
1125
- args: log.args,
1126
- kind: 'transfer',
1127
- logIndex: log.logIndex,
1128
- }) as ParsedTransferLog,
1129
- )
1130
-
1131
- const memoLogs = parseEventLogs({
1132
- abi: Abis.tip20,
1133
- eventName: 'TransferWithMemo',
1134
- logs: receipt.logs,
1135
- }).map(
1136
- (log) =>
1137
- ({
1138
- address: log.address,
1139
- args: log.args,
1140
- kind: 'memo',
1141
- logIndex: log.logIndex,
1142
- }) as ParsedTransferLog,
1143
- )
1144
-
1145
- const logs = [...transferLogs, ...memoLogs].sort((a, b) => a.logIndex - b.logIndex)
1146
- const effects: TransferLog[] = []
1147
-
1148
- for (let index = 0; index < logs.length; index++) {
1149
- const log = logs[index]!
1150
- const next = logs[index + 1]
1151
- if (next && log.kind !== next.kind && isSameTransferLog(log, next)) {
1152
- const memoLog = log.kind === 'memo' ? log : next.kind === 'memo' ? next : undefined
1153
- if (!memoLog) continue
1154
- effects.push({
1155
- address: memoLog.address,
1156
- args: memoLog.args,
1157
- kind: 'memo',
1158
- })
1159
- index++
1160
- continue
1161
- }
1162
-
1163
- effects.push({
1164
- address: log.address,
1165
- args: log.args,
1166
- kind: log.kind,
1167
- } as TransferLog)
1168
- }
1169
-
1170
- return effects
1171
- }
1172
-
1173
- function isSameTransferLog(a: ParsedTransferLog, b: ParsedTransferLog): boolean {
1174
- return (
1175
- TempoAddress.isEqual(a.address, b.address) &&
1176
- TempoAddress.isEqual(a.args.from, b.args.from) &&
1177
- TempoAddress.isEqual(a.args.to, b.args.to) &&
1178
- a.args.amount === b.args.amount &&
1179
- Math.abs(a.logIndex - b.logIndex) === 1
1180
- )
1181
- }
1182
-
1183
- async function isValidTransferSender(parameters: {
1184
- expectedSender: `0x${string}`
1185
- sender: `0x${string}`
1186
- source?: { address: `0x${string}`; chainId: number } | undefined
1187
- validateSender?: charge.ValidateSender | undefined
1188
- }): Promise<boolean> {
1189
- if (TempoAddress.isEqual(parameters.sender, parameters.expectedSender)) return true
1190
- if (!parameters.validateSender) return false
1191
- return parameters.validateSender({
1192
- expectedSender: parameters.expectedSender,
1193
- sender: parameters.sender,
1194
- source: parameters.source,
1195
- })
1196
- }
1197
-
1198
- /** @internal */
1199
- function getHashStoreKey(hash: `0x${string}`): `mppx:charge:${string}` {
1200
- return `mppx:charge:${hash.toLowerCase()}`
1201
- }
1202
-
1203
- /** @internal */
1204
- function getProofStoreKey(challengeId: string): `mppx:charge:${string}` {
1205
- return `mppx:charge:proof:${challengeId}`
1206
- }
1207
-
1208
- async function tryClaimHash(
1209
- store: Store.AtomicStore<charge.StoreItemMap>,
1210
- hash: `0x${string}`,
1211
- expires: number,
1212
- ): Promise<boolean> {
1213
- return Store.tryClaim(store, getHashStoreKey(hash), expires)
1214
- }
1215
-
1216
- /** @internal */
1217
- async function releaseHashUse(
1218
- store: Store.AtomicStore<charge.StoreItemMap>,
1219
- hash: `0x${string}`,
1220
- ): Promise<void> {
1221
- await store.delete(getHashStoreKey(hash))
1222
- }
1223
-
1224
- function parseHashCredentialSource(parameters: {
1225
- chainId: number | undefined
1226
- source: string | undefined
1227
- }): { address: `0x${string}`; chainId: number } | undefined {
1228
- const { chainId, source } = parameters
1229
- if (!source) return undefined
1230
-
1231
- const parsed = Proof.parsePkhSource(source)
1232
- if (!parsed || (chainId !== undefined && parsed.chainId !== chainId)) {
1233
- throw new MismatchError('Hash credential source is invalid.', {})
1234
- }
1235
-
1236
- return parsed
1237
- }
1238
-
1239
- /** @internal */
1240
- async function tryClaimProof(
1241
- store: Store.AtomicStore<charge.StoreItemMap>,
1242
- challengeId: string,
1243
- expires: number,
1244
- ): Promise<boolean> {
1245
- return Store.tryClaim(store, getProofStoreKey(challengeId), expires)
1246
- }
1247
-
1248
- function recoverAuthorizedProofSigner(parameters: {
1249
- chainId: number
1250
- challengeId: string
1251
- realm: string
1252
- signature: `0x${string}`
1253
- sourceAddress: `0x${string}`
1254
- }): `0x${string}` | null {
1255
- const { chainId, challengeId, realm, signature, sourceAddress } = parameters
1256
-
1257
- try {
1258
- const envelope = SignatureEnvelope.from(signature)
1259
- const proofHash = Proof.hash({ account: sourceAddress, chainId, challengeId, realm })
1260
-
1261
- if (envelope.type === 'keychain') {
1262
- if (!TempoAddress.isEqual(envelope.userAddress, sourceAddress)) return null
1263
-
1264
- const keychainPayload =
1265
- envelope.version === 'v2'
1266
- ? keccak256(`0x04${proofHash.slice(2)}${sourceAddress.slice(2)}` as `0x${string}`)
1267
- : proofHash
1268
-
1269
- const signer = SignatureEnvelope.extractAddress({
1270
- payload: keychainPayload,
1271
- signature: envelope.inner,
1272
- })
1273
- const valid = SignatureEnvelope.verify(envelope.inner, {
1274
- address: signer,
1275
- payload: keychainPayload,
1276
- })
1277
- if (!valid) return null
1278
-
1279
- return signer
1280
- }
1281
-
1282
- const signer = SignatureEnvelope.extractAddress({
1283
- payload: proofHash,
1284
- signature: envelope,
1285
- })
1286
- const valid = SignatureEnvelope.verify(envelope, {
1287
- address: signer,
1288
- payload: proofHash,
1289
- })
1290
- if (!valid) return null
1291
-
1292
- return signer
1293
- } catch {
1294
- return null
1295
- }
1296
- }
1297
-
1298
- async function isActiveAccessKey(
1299
- client: Awaited<ReturnType<ReturnType<typeof Client.getResolver>>>,
1300
- parameters: { account: `0x${string}`; accessKey: `0x${string}` },
1301
- ): Promise<boolean> {
1302
- try {
1303
- const metadata = await Actions.accessKey.getMetadata(client, parameters)
1304
- const nowSeconds = BigInt(Math.floor(Date.now() / 1000))
1305
- return !metadata.isRevoked && metadata.expiry > nowSeconds
1306
- } catch {
1307
- return false
1308
- }
1309
- }
1310
-
1311
- /** @internal */
1312
- function toReceipt(receipt: TransactionReceipt) {
1313
- const { status, transactionHash } = receipt
1314
- if (status !== 'success') {
1315
- throw new Error(`Transaction reverted: ${transactionHash}`)
1316
- }
1317
- return {
1318
- method: 'tempo',
1319
- status: 'success',
1320
- timestamp: new Date().toISOString(),
1321
- reference: transactionHash,
1322
- } as const
1323
- }
1324
-
1325
- /**
1326
- * Asserts that at least one of the matched payment logs carries a
1327
- * challenge-bound memo nonce (keccak256(challengeId)[0..6] in bytes 25–31).
1328
- * Only checks logs that were matched by `assertTransferLogs`, not the
1329
- * entire receipt — preventing unrelated dust transfers from satisfying
1330
- * the binding.
1331
- * @internal
1332
- */
1333
- function assertChallengeBoundMemo(
1334
- matchedLogs: readonly TransferLog[],
1335
- parameters: { challengeId: string; realm: string },
1336
- ) {
1337
- const bound = matchedLogs.some((log) => {
1338
- if (log.kind !== 'memo') return false
1339
- if (!Attribution.verifyServer(log.args.memo, parameters.realm)) return false
1340
- return Attribution.verifyChallengeBinding(log.args.memo, parameters.challengeId)
1341
- })
1342
-
1343
- if (!bound)
1344
- throw new MismatchError('Payment verification failed: memo is not bound to this challenge.', {})
1345
- }
1346
-
1347
- function assertChallengeBoundCallMemo(
1348
- matchedCalls: readonly Charge_internal.Transfer[],
1349
- parameters: { challengeId: string; realm: string },
1350
- ) {
1351
- const bound = matchedCalls.some((call) => {
1352
- if (!call.memo) return false
1353
- const memo = call.memo as `0x${string}`
1354
- if (!Attribution.verifyServer(memo, parameters.realm)) return false
1355
- return Attribution.verifyChallengeBinding(memo, parameters.challengeId)
1356
- })
1357
-
1358
- if (!bound)
1359
- throw new MismatchError('Payment verification failed: memo is not bound to this challenge.', {})
1360
- }
1361
-
1362
- /** @internal */
1363
- class MismatchError extends PaymentError {
1364
- override readonly name = 'MismatchError'
1365
- readonly title = 'Verification Failed'
1366
- readonly type = 'https://paymentauth.org/problems/verification-failed'
1367
-
1368
- constructor(reason: string, details: Record<string, string>) {
1369
- super(
1370
- [
1371
- reason.startsWith('Payment verification failed')
1372
- ? reason
1373
- : `Payment verification failed: ${reason}`,
1374
- ...Object.entries(details).map(([k, v]) => ` - ${k}: ${v}`),
1375
- ].join('\n'),
1376
- { details },
1377
- )
1378
- }
1379
- }