mppx 0.8.15 → 0.8.18

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