mppx 0.8.17 → 0.8.19

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (914) hide show
  1. package/CHANGELOG.md +61 -0
  2. package/README.md +15 -0
  3. package/dist/Challenge.js +21 -4
  4. package/dist/bin.js +3 -3
  5. package/dist/cli/THIRD-PARTY-LICENSES.txt +328 -0
  6. package/dist/cli/cli.js +253 -1505
  7. package/dist/cli/plugins/index.js +19 -5
  8. package/dist/cli/plugins/tempo.js +7 -3
  9. package/dist/cli/sessions/Manager.js +7 -4
  10. package/dist/cli/sessions/request.d.ts +2 -0
  11. package/dist/cli/sessions/request.js +18 -0
  12. package/dist/cli/sessions/store.js +28 -14
  13. package/dist/discovery/Discovery.js +2 -1
  14. package/dist/evm/client/Charge.js +8 -0
  15. package/dist/server/core.d.ts +9 -0
  16. package/dist/server/core.js +9 -0
  17. package/dist/stripe/server/Charge.js +2 -4
  18. package/dist/stripe/server/Methods.d.ts +2 -2
  19. package/dist/stripe/server/Methods.js +17 -11
  20. package/dist/stripe/server/internal/html.gen.d.ts +1 -1
  21. package/dist/stripe/server/internal/html.gen.js +1 -1
  22. package/dist/stripe/server/spt.d.ts +8 -0
  23. package/dist/stripe/server/spt.js +8 -0
  24. package/dist/tempo/Methods.d.ts +13 -0
  25. package/dist/tempo/Methods.js +14 -3
  26. package/dist/tempo/client/Charge.d.ts +3 -0
  27. package/dist/tempo/client/Charge.js +31 -9
  28. package/dist/tempo/client/Methods.d.ts +13 -0
  29. package/dist/tempo/internal/defaults.d.ts +11 -0
  30. package/dist/tempo/internal/defaults.js +11 -0
  31. package/dist/tempo/internal/machine-token-charge.d.ts +51 -0
  32. package/dist/tempo/internal/machine-token-charge.js +113 -0
  33. package/dist/tempo/internal/machine-token-session.d.ts +88 -0
  34. package/dist/tempo/internal/machine-token-session.js +173 -0
  35. package/dist/tempo/internal/signature-envelope.d.ts +14 -0
  36. package/dist/tempo/internal/signature-envelope.js +28 -0
  37. package/dist/tempo/legacy/client/ChannelOps.d.ts +2 -2
  38. package/dist/tempo/legacy/client/ChannelOps.js +11 -5
  39. package/dist/tempo/legacy/client/Session.d.ts +13 -1
  40. package/dist/tempo/legacy/client/Session.js +3 -3
  41. package/dist/tempo/legacy/client/SessionManager.d.ts +3 -1
  42. package/dist/tempo/legacy/client/SessionManager.js +2 -0
  43. package/dist/tempo/server/Charge.d.ts +3 -0
  44. package/dist/tempo/server/Charge.js +58 -17
  45. package/dist/tempo/server/Methods.d.ts +21 -4
  46. package/dist/tempo/server/Methods.js +8 -4
  47. package/dist/tempo/server/internal/html.gen.d.ts +1 -1
  48. package/dist/tempo/server/internal/html.gen.js +1 -1
  49. package/dist/tempo/session/client/ChannelOps.d.ts +18 -3
  50. package/dist/tempo/session/client/ChannelOps.js +35 -6
  51. package/dist/tempo/session/client/ChannelStore.d.ts +0 -5
  52. package/dist/tempo/session/client/ChannelStore.js +2 -2
  53. package/dist/tempo/session/client/CredentialState.d.ts +17 -2
  54. package/dist/tempo/session/client/CredentialState.js +77 -76
  55. package/dist/tempo/session/client/Runtime.d.ts +4 -2
  56. package/dist/tempo/session/client/Runtime.js +21 -5
  57. package/dist/tempo/session/client/Session.d.ts +15 -3
  58. package/dist/tempo/session/client/Session.js +186 -63
  59. package/dist/tempo/session/client/SessionManager.d.ts +3 -1
  60. package/dist/tempo/session/client/SessionManager.js +35 -11
  61. package/dist/tempo/session/client/Transports.d.ts +2 -0
  62. package/dist/tempo/session/client/Transports.js +12 -2
  63. package/dist/tempo/session/precompile/Chain.d.ts +10 -2
  64. package/dist/tempo/session/precompile/Chain.js +51 -10
  65. package/dist/tempo/session/precompile/Protocol.d.ts +15 -0
  66. package/dist/tempo/session/precompile/Protocol.js +7 -0
  67. package/dist/tempo/session/precompile/Voucher.d.ts +3 -1
  68. package/dist/tempo/session/precompile/Voucher.js +6 -12
  69. package/dist/tempo/session/server/ChannelStore.d.ts +6 -0
  70. package/dist/tempo/session/server/ChannelStore.js +11 -4
  71. package/dist/tempo/session/server/CredentialVerification.d.ts +11 -9
  72. package/dist/tempo/session/server/CredentialVerification.js +185 -109
  73. package/dist/tempo/session/server/MeteredStream.d.ts +1 -1
  74. package/dist/tempo/session/server/MeteredStream.js +5 -4
  75. package/dist/tempo/session/server/RequestState.d.ts +19 -0
  76. package/dist/tempo/session/server/RequestState.js +61 -15
  77. package/dist/tempo/session/server/Session.d.ts +14 -2
  78. package/dist/tempo/session/server/Session.js +37 -6
  79. package/dist/tempo/session/server/Settlement.d.ts +11 -4
  80. package/dist/tempo/session/server/Settlement.js +53 -21
  81. package/dist/x402/client/Exact.d.ts +8 -0
  82. package/dist/x402/client/Exact.js +40 -10
  83. package/dist/x402/server/EvmCharge.d.ts +22 -0
  84. package/dist/x402/server/EvmCharge.js +23 -1
  85. package/package.json +15 -37
  86. package/dist/BodyDigest.d.ts.map +0 -1
  87. package/dist/BodyDigest.js.map +0 -1
  88. package/dist/Challenge.d.ts.map +0 -1
  89. package/dist/Challenge.js.map +0 -1
  90. package/dist/Constants.d.ts.map +0 -1
  91. package/dist/Constants.js.map +0 -1
  92. package/dist/Credential.d.ts.map +0 -1
  93. package/dist/Credential.js.map +0 -1
  94. package/dist/Errors.d.ts.map +0 -1
  95. package/dist/Errors.js.map +0 -1
  96. package/dist/Expires.d.ts.map +0 -1
  97. package/dist/Expires.js.map +0 -1
  98. package/dist/Html.d.ts.map +0 -1
  99. package/dist/Html.js.map +0 -1
  100. package/dist/Mcp.d.ts.map +0 -1
  101. package/dist/Mcp.js.map +0 -1
  102. package/dist/Method.d.ts.map +0 -1
  103. package/dist/Method.js.map +0 -1
  104. package/dist/PaymentRequest.d.ts.map +0 -1
  105. package/dist/PaymentRequest.js.map +0 -1
  106. package/dist/Receipt.d.ts.map +0 -1
  107. package/dist/Receipt.js.map +0 -1
  108. package/dist/Store.d.ts.map +0 -1
  109. package/dist/Store.js.map +0 -1
  110. package/dist/attestation/Client.d.ts.map +0 -1
  111. package/dist/attestation/Client.js.map +0 -1
  112. package/dist/attestation/Constants.d.ts.map +0 -1
  113. package/dist/attestation/Constants.js.map +0 -1
  114. package/dist/attestation/Server.d.ts.map +0 -1
  115. package/dist/attestation/Server.js.map +0 -1
  116. package/dist/attestation/Types.d.ts.map +0 -1
  117. package/dist/attestation/Types.js.map +0 -1
  118. package/dist/attestation/index.d.ts.map +0 -1
  119. package/dist/attestation/index.js.map +0 -1
  120. package/dist/attestation/internal/HttpMessageSignature.d.ts.map +0 -1
  121. package/dist/attestation/internal/HttpMessageSignature.js.map +0 -1
  122. package/dist/attestation/internal/SigningContext.d.ts.map +0 -1
  123. package/dist/attestation/internal/SigningContext.js.map +0 -1
  124. package/dist/bin.d.ts.map +0 -1
  125. package/dist/bin.js.map +0 -1
  126. package/dist/cli/account.d.ts.map +0 -1
  127. package/dist/cli/account.js.map +0 -1
  128. package/dist/cli/cli.d.ts.map +0 -1
  129. package/dist/cli/cli.js.map +0 -1
  130. package/dist/cli/config.d.ts.map +0 -1
  131. package/dist/cli/config.js.map +0 -1
  132. package/dist/cli/internal.d.ts.map +0 -1
  133. package/dist/cli/internal.js.map +0 -1
  134. package/dist/cli/plugins/evm.d.ts.map +0 -1
  135. package/dist/cli/plugins/evm.js.map +0 -1
  136. package/dist/cli/plugins/index.d.ts.map +0 -1
  137. package/dist/cli/plugins/index.js.map +0 -1
  138. package/dist/cli/plugins/plugin.d.ts.map +0 -1
  139. package/dist/cli/plugins/plugin.js.map +0 -1
  140. package/dist/cli/plugins/stripe.d.ts.map +0 -1
  141. package/dist/cli/plugins/stripe.js.map +0 -1
  142. package/dist/cli/plugins/tempo.d.ts.map +0 -1
  143. package/dist/cli/plugins/tempo.js.map +0 -1
  144. package/dist/cli/sessions/Manager.d.ts.map +0 -1
  145. package/dist/cli/sessions/Manager.js.map +0 -1
  146. package/dist/cli/sessions/commands.d.ts.map +0 -1
  147. package/dist/cli/sessions/commands.js.map +0 -1
  148. package/dist/cli/sessions/request.d.ts.map +0 -1
  149. package/dist/cli/sessions/request.js.map +0 -1
  150. package/dist/cli/sessions/store.d.ts.map +0 -1
  151. package/dist/cli/sessions/store.js.map +0 -1
  152. package/dist/cli/utils.d.ts.map +0 -1
  153. package/dist/cli/utils.js.map +0 -1
  154. package/dist/cli/validate/challenge.d.ts.map +0 -1
  155. package/dist/cli/validate/challenge.js.map +0 -1
  156. package/dist/cli/validate/discovery.d.ts.map +0 -1
  157. package/dist/cli/validate/discovery.js.map +0 -1
  158. package/dist/cli/validate/helpers.d.ts.map +0 -1
  159. package/dist/cli/validate/helpers.js.map +0 -1
  160. package/dist/cli/validate/index.d.ts.map +0 -1
  161. package/dist/cli/validate/index.js.map +0 -1
  162. package/dist/cli/validate/messages.d.ts.map +0 -1
  163. package/dist/cli/validate/messages.js.map +0 -1
  164. package/dist/cli/validate/payment.d.ts.map +0 -1
  165. package/dist/cli/validate/payment.js.map +0 -1
  166. package/dist/client/Methods.d.ts.map +0 -1
  167. package/dist/client/Methods.js.map +0 -1
  168. package/dist/client/Mppx.d.ts.map +0 -1
  169. package/dist/client/Mppx.js.map +0 -1
  170. package/dist/client/Transport.d.ts.map +0 -1
  171. package/dist/client/Transport.js.map +0 -1
  172. package/dist/client/index.d.ts.map +0 -1
  173. package/dist/client/index.js.map +0 -1
  174. package/dist/client/internal/Fetch.d.ts.map +0 -1
  175. package/dist/client/internal/Fetch.js.map +0 -1
  176. package/dist/client/internal/MethodChallenge.d.ts.map +0 -1
  177. package/dist/client/internal/MethodChallenge.js.map +0 -1
  178. package/dist/client/internal/MethodResponse.d.ts.map +0 -1
  179. package/dist/client/internal/MethodResponse.js.map +0 -1
  180. package/dist/client/internal/protocols/Mcp.d.ts.map +0 -1
  181. package/dist/client/internal/protocols/Mcp.js.map +0 -1
  182. package/dist/client/internal/protocols/Mpp.d.ts.map +0 -1
  183. package/dist/client/internal/protocols/Mpp.js.map +0 -1
  184. package/dist/client/internal/protocols/Protocol.d.ts.map +0 -1
  185. package/dist/client/internal/protocols/Protocol.js.map +0 -1
  186. package/dist/client/internal/protocols/Shared.d.ts.map +0 -1
  187. package/dist/client/internal/protocols/Shared.js.map +0 -1
  188. package/dist/client/internal/protocols/X402.d.ts.map +0 -1
  189. package/dist/client/internal/protocols/X402.js.map +0 -1
  190. package/dist/client/node.d.ts.map +0 -1
  191. package/dist/client/node.js.map +0 -1
  192. package/dist/discovery/Discovery.d.ts.map +0 -1
  193. package/dist/discovery/Discovery.js.map +0 -1
  194. package/dist/discovery/OpenApi.d.ts.map +0 -1
  195. package/dist/discovery/OpenApi.js.map +0 -1
  196. package/dist/discovery/Validate.d.ts.map +0 -1
  197. package/dist/discovery/Validate.js.map +0 -1
  198. package/dist/discovery/index.d.ts.map +0 -1
  199. package/dist/discovery/index.js.map +0 -1
  200. package/dist/discovery/internal/Metadata.d.ts.map +0 -1
  201. package/dist/discovery/internal/Metadata.js.map +0 -1
  202. package/dist/evm/Assets.d.ts.map +0 -1
  203. package/dist/evm/Assets.js.map +0 -1
  204. package/dist/evm/Chains.d.ts.map +0 -1
  205. package/dist/evm/Chains.js.map +0 -1
  206. package/dist/evm/Methods.d.ts.map +0 -1
  207. package/dist/evm/Methods.js.map +0 -1
  208. package/dist/evm/Types.d.ts.map +0 -1
  209. package/dist/evm/Types.js.map +0 -1
  210. package/dist/evm/client/Charge.d.ts.map +0 -1
  211. package/dist/evm/client/Charge.js.map +0 -1
  212. package/dist/evm/client/Methods.d.ts.map +0 -1
  213. package/dist/evm/client/Methods.js.map +0 -1
  214. package/dist/evm/client/index.d.ts.map +0 -1
  215. package/dist/evm/client/index.js.map +0 -1
  216. package/dist/evm/index.d.ts.map +0 -1
  217. package/dist/evm/index.js.map +0 -1
  218. package/dist/evm/server/Charge.d.ts.map +0 -1
  219. package/dist/evm/server/Charge.js.map +0 -1
  220. package/dist/evm/server/Methods.d.ts.map +0 -1
  221. package/dist/evm/server/Methods.js.map +0 -1
  222. package/dist/evm/server/index.d.ts.map +0 -1
  223. package/dist/evm/server/index.js.map +0 -1
  224. package/dist/index.d.ts.map +0 -1
  225. package/dist/index.js.map +0 -1
  226. package/dist/internal/AcceptPayment.d.ts.map +0 -1
  227. package/dist/internal/AcceptPayment.js.map +0 -1
  228. package/dist/internal/HeaderCodec.d.ts.map +0 -1
  229. package/dist/internal/HeaderCodec.js.map +0 -1
  230. package/dist/internal/constantTimeEqual.d.ts.map +0 -1
  231. package/dist/internal/constantTimeEqual.js.map +0 -1
  232. package/dist/internal/env.d.ts.map +0 -1
  233. package/dist/internal/env.js.map +0 -1
  234. package/dist/internal/types.d.ts.map +0 -1
  235. package/dist/internal/types.js.map +0 -1
  236. package/dist/mcp/client/McpClient.d.ts.map +0 -1
  237. package/dist/mcp/client/McpClient.js.map +0 -1
  238. package/dist/mcp/client/index.d.ts.map +0 -1
  239. package/dist/mcp/client/index.js.map +0 -1
  240. package/dist/mcp/server/Transport.d.ts.map +0 -1
  241. package/dist/mcp/server/Transport.js.map +0 -1
  242. package/dist/mcp/server/index.d.ts.map +0 -1
  243. package/dist/mcp/server/index.js.map +0 -1
  244. package/dist/middlewares/elysia.d.ts.map +0 -1
  245. package/dist/middlewares/elysia.js.map +0 -1
  246. package/dist/middlewares/express.d.ts.map +0 -1
  247. package/dist/middlewares/express.js.map +0 -1
  248. package/dist/middlewares/hono.d.ts.map +0 -1
  249. package/dist/middlewares/hono.js.map +0 -1
  250. package/dist/middlewares/internal/mppx.d.ts.map +0 -1
  251. package/dist/middlewares/internal/mppx.js.map +0 -1
  252. package/dist/middlewares/nextjs.d.ts.map +0 -1
  253. package/dist/middlewares/nextjs.js.map +0 -1
  254. package/dist/proxy/Proxy.d.ts.map +0 -1
  255. package/dist/proxy/Proxy.js.map +0 -1
  256. package/dist/proxy/Service.d.ts.map +0 -1
  257. package/dist/proxy/Service.js.map +0 -1
  258. package/dist/proxy/index.d.ts.map +0 -1
  259. package/dist/proxy/index.js.map +0 -1
  260. package/dist/proxy/internal/Headers.d.ts.map +0 -1
  261. package/dist/proxy/internal/Headers.js.map +0 -1
  262. package/dist/proxy/internal/Route.d.ts.map +0 -1
  263. package/dist/proxy/internal/Route.js.map +0 -1
  264. package/dist/proxy/services/anthropic.d.ts.map +0 -1
  265. package/dist/proxy/services/anthropic.js.map +0 -1
  266. package/dist/proxy/services/openai.d.ts.map +0 -1
  267. package/dist/proxy/services/openai.js.map +0 -1
  268. package/dist/proxy/services/stripe.d.ts.map +0 -1
  269. package/dist/proxy/services/stripe.js.map +0 -1
  270. package/dist/server/Methods.d.ts.map +0 -1
  271. package/dist/server/Methods.js.map +0 -1
  272. package/dist/server/Mppx.d.ts.map +0 -1
  273. package/dist/server/Mppx.js.map +0 -1
  274. package/dist/server/NodeListener.d.ts.map +0 -1
  275. package/dist/server/NodeListener.js.map +0 -1
  276. package/dist/server/Request.d.ts.map +0 -1
  277. package/dist/server/Request.js.map +0 -1
  278. package/dist/server/Response.d.ts.map +0 -1
  279. package/dist/server/Response.js.map +0 -1
  280. package/dist/server/Transport.d.ts.map +0 -1
  281. package/dist/server/Transport.js.map +0 -1
  282. package/dist/server/index.d.ts.map +0 -1
  283. package/dist/server/index.js.map +0 -1
  284. package/dist/server/internal/html/compose.main.gen.d.ts.map +0 -1
  285. package/dist/server/internal/html/compose.main.gen.js.map +0 -1
  286. package/dist/server/internal/html/config.d.ts.map +0 -1
  287. package/dist/server/internal/html/config.js.map +0 -1
  288. package/dist/server/internal/html/constants.d.ts.map +0 -1
  289. package/dist/server/internal/html/constants.js.map +0 -1
  290. package/dist/server/internal/html/serviceWorker.client.d.ts.map +0 -1
  291. package/dist/server/internal/html/serviceWorker.client.js.map +0 -1
  292. package/dist/server/internal/html/serviceWorker.gen.d.ts.map +0 -1
  293. package/dist/server/internal/html/serviceWorker.gen.js.map +0 -1
  294. package/dist/server/internal/scope.d.ts.map +0 -1
  295. package/dist/server/internal/scope.js.map +0 -1
  296. package/dist/stripe/Methods.d.ts.map +0 -1
  297. package/dist/stripe/Methods.js.map +0 -1
  298. package/dist/stripe/client/Charge.d.ts.map +0 -1
  299. package/dist/stripe/client/Charge.js.map +0 -1
  300. package/dist/stripe/client/Methods.d.ts.map +0 -1
  301. package/dist/stripe/client/Methods.js.map +0 -1
  302. package/dist/stripe/client/index.d.ts.map +0 -1
  303. package/dist/stripe/client/index.js.map +0 -1
  304. package/dist/stripe/index.d.ts.map +0 -1
  305. package/dist/stripe/index.js.map +0 -1
  306. package/dist/stripe/internal/constants.d.ts.map +0 -1
  307. package/dist/stripe/internal/constants.js.map +0 -1
  308. package/dist/stripe/internal/types.d.ts.map +0 -1
  309. package/dist/stripe/internal/types.js.map +0 -1
  310. package/dist/stripe/server/Charge.d.ts.map +0 -1
  311. package/dist/stripe/server/Charge.js.map +0 -1
  312. package/dist/stripe/server/Methods.d.ts.map +0 -1
  313. package/dist/stripe/server/Methods.js.map +0 -1
  314. package/dist/stripe/server/index.d.ts.map +0 -1
  315. package/dist/stripe/server/index.js.map +0 -1
  316. package/dist/stripe/server/internal/deposit-address.d.ts.map +0 -1
  317. package/dist/stripe/server/internal/deposit-address.js.map +0 -1
  318. package/dist/stripe/server/internal/html/types.d.ts.map +0 -1
  319. package/dist/stripe/server/internal/html/types.js.map +0 -1
  320. package/dist/stripe/server/internal/html.gen.d.ts.map +0 -1
  321. package/dist/stripe/server/internal/html.gen.js.map +0 -1
  322. package/dist/stripe/server/internal/record-payment.d.ts.map +0 -1
  323. package/dist/stripe/server/internal/record-payment.js.map +0 -1
  324. package/dist/stripe/server/internal/request.d.ts.map +0 -1
  325. package/dist/stripe/server/internal/request.js.map +0 -1
  326. package/dist/tap/Constants.d.ts.map +0 -1
  327. package/dist/tap/Constants.js.map +0 -1
  328. package/dist/tap/Types.d.ts.map +0 -1
  329. package/dist/tap/Types.js.map +0 -1
  330. package/dist/tap/client/index.d.ts.map +0 -1
  331. package/dist/tap/client/index.js.map +0 -1
  332. package/dist/tap/index.d.ts.map +0 -1
  333. package/dist/tap/index.js.map +0 -1
  334. package/dist/tap/server/index.d.ts.map +0 -1
  335. package/dist/tap/server/index.js.map +0 -1
  336. package/dist/tempo/Attribution.d.ts.map +0 -1
  337. package/dist/tempo/Attribution.js.map +0 -1
  338. package/dist/tempo/Methods.d.ts.map +0 -1
  339. package/dist/tempo/Methods.js.map +0 -1
  340. package/dist/tempo/Proof.d.ts.map +0 -1
  341. package/dist/tempo/Proof.js.map +0 -1
  342. package/dist/tempo/client/Charge.d.ts.map +0 -1
  343. package/dist/tempo/client/Charge.js.map +0 -1
  344. package/dist/tempo/client/Methods.d.ts.map +0 -1
  345. package/dist/tempo/client/Methods.js.map +0 -1
  346. package/dist/tempo/client/ResolveAccount.d.ts.map +0 -1
  347. package/dist/tempo/client/ResolveAccount.js.map +0 -1
  348. package/dist/tempo/client/Subscription.d.ts.map +0 -1
  349. package/dist/tempo/client/Subscription.js.map +0 -1
  350. package/dist/tempo/client/index.d.ts.map +0 -1
  351. package/dist/tempo/client/index.js.map +0 -1
  352. package/dist/tempo/index.d.ts.map +0 -1
  353. package/dist/tempo/index.js.map +0 -1
  354. package/dist/tempo/internal/account.d.ts.map +0 -1
  355. package/dist/tempo/internal/account.js.map +0 -1
  356. package/dist/tempo/internal/address.d.ts.map +0 -1
  357. package/dist/tempo/internal/address.js.map +0 -1
  358. package/dist/tempo/internal/auto-swap.d.ts.map +0 -1
  359. package/dist/tempo/internal/auto-swap.js.map +0 -1
  360. package/dist/tempo/internal/charge.d.ts.map +0 -1
  361. package/dist/tempo/internal/charge.js.map +0 -1
  362. package/dist/tempo/internal/defaults.d.ts.map +0 -1
  363. package/dist/tempo/internal/defaults.js.map +0 -1
  364. package/dist/tempo/internal/fee-payer.d.ts.map +0 -1
  365. package/dist/tempo/internal/fee-payer.js.map +0 -1
  366. package/dist/tempo/internal/fee-token.d.ts.map +0 -1
  367. package/dist/tempo/internal/fee-token.js.map +0 -1
  368. package/dist/tempo/internal/proof.d.ts.map +0 -1
  369. package/dist/tempo/internal/proof.js.map +0 -1
  370. package/dist/tempo/internal/selectors.d.ts.map +0 -1
  371. package/dist/tempo/internal/selectors.js.map +0 -1
  372. package/dist/tempo/internal/types.d.ts.map +0 -1
  373. package/dist/tempo/internal/types.js.map +0 -1
  374. package/dist/tempo/legacy/client/ChannelOps.d.ts.map +0 -1
  375. package/dist/tempo/legacy/client/ChannelOps.js.map +0 -1
  376. package/dist/tempo/legacy/client/Session.d.ts.map +0 -1
  377. package/dist/tempo/legacy/client/Session.js.map +0 -1
  378. package/dist/tempo/legacy/client/SessionManager.d.ts.map +0 -1
  379. package/dist/tempo/legacy/client/SessionManager.js.map +0 -1
  380. package/dist/tempo/legacy/client/index.d.ts.map +0 -1
  381. package/dist/tempo/legacy/client/index.js.map +0 -1
  382. package/dist/tempo/legacy/index.d.ts.map +0 -1
  383. package/dist/tempo/legacy/index.js.map +0 -1
  384. package/dist/tempo/legacy/session/Chain.d.ts.map +0 -1
  385. package/dist/tempo/legacy/session/Chain.js.map +0 -1
  386. package/dist/tempo/legacy/session/Channel.d.ts.map +0 -1
  387. package/dist/tempo/legacy/session/Channel.js.map +0 -1
  388. package/dist/tempo/legacy/session/Types.d.ts.map +0 -1
  389. package/dist/tempo/legacy/session/Types.js.map +0 -1
  390. package/dist/tempo/legacy/session/Voucher.d.ts.map +0 -1
  391. package/dist/tempo/legacy/session/Voucher.js.map +0 -1
  392. package/dist/tempo/legacy/session/escrow.abi.d.ts.map +0 -1
  393. package/dist/tempo/legacy/session/escrow.abi.js.map +0 -1
  394. package/dist/tempo/legacy/session/index.d.ts.map +0 -1
  395. package/dist/tempo/legacy/session/index.js.map +0 -1
  396. package/dist/tempo/server/Charge.d.ts.map +0 -1
  397. package/dist/tempo/server/Charge.js.map +0 -1
  398. package/dist/tempo/server/Methods.d.ts.map +0 -1
  399. package/dist/tempo/server/Methods.js.map +0 -1
  400. package/dist/tempo/server/Relay.d.ts.map +0 -1
  401. package/dist/tempo/server/Relay.js.map +0 -1
  402. package/dist/tempo/server/SponsorBudget.d.ts.map +0 -1
  403. package/dist/tempo/server/SponsorBudget.js.map +0 -1
  404. package/dist/tempo/server/Subscription.d.ts.map +0 -1
  405. package/dist/tempo/server/Subscription.js.map +0 -1
  406. package/dist/tempo/server/index.d.ts.map +0 -1
  407. package/dist/tempo/server/index.js.map +0 -1
  408. package/dist/tempo/server/internal/html.gen.d.ts.map +0 -1
  409. package/dist/tempo/server/internal/html.gen.js.map +0 -1
  410. package/dist/tempo/server/internal/request-body.d.ts.map +0 -1
  411. package/dist/tempo/server/internal/request-body.js.map +0 -1
  412. package/dist/tempo/server/internal/transport.d.ts.map +0 -1
  413. package/dist/tempo/server/internal/transport.js.map +0 -1
  414. package/dist/tempo/session/Snapshot.d.ts.map +0 -1
  415. package/dist/tempo/session/Snapshot.js.map +0 -1
  416. package/dist/tempo/session/client/ChannelOps.d.ts.map +0 -1
  417. package/dist/tempo/session/client/ChannelOps.js.map +0 -1
  418. package/dist/tempo/session/client/ChannelStore.d.ts.map +0 -1
  419. package/dist/tempo/session/client/ChannelStore.js.map +0 -1
  420. package/dist/tempo/session/client/CredentialState.d.ts.map +0 -1
  421. package/dist/tempo/session/client/CredentialState.js.map +0 -1
  422. package/dist/tempo/session/client/ReceiptCoordinator.d.ts.map +0 -1
  423. package/dist/tempo/session/client/ReceiptCoordinator.js.map +0 -1
  424. package/dist/tempo/session/client/Runtime.d.ts.map +0 -1
  425. package/dist/tempo/session/client/Runtime.js.map +0 -1
  426. package/dist/tempo/session/client/Session.d.ts.map +0 -1
  427. package/dist/tempo/session/client/Session.js.map +0 -1
  428. package/dist/tempo/session/client/SessionManager.d.ts.map +0 -1
  429. package/dist/tempo/session/client/SessionManager.js.map +0 -1
  430. package/dist/tempo/session/client/Transports.d.ts.map +0 -1
  431. package/dist/tempo/session/client/Transports.js.map +0 -1
  432. package/dist/tempo/session/client/index.d.ts.map +0 -1
  433. package/dist/tempo/session/client/index.js.map +0 -1
  434. package/dist/tempo/session/client/internal/SessionManager.d.ts.map +0 -1
  435. package/dist/tempo/session/client/internal/SessionManager.js.map +0 -1
  436. package/dist/tempo/session/index.d.ts.map +0 -1
  437. package/dist/tempo/session/index.js.map +0 -1
  438. package/dist/tempo/session/precompile/Chain.d.ts.map +0 -1
  439. package/dist/tempo/session/precompile/Chain.js.map +0 -1
  440. package/dist/tempo/session/precompile/Channel.d.ts.map +0 -1
  441. package/dist/tempo/session/precompile/Channel.js.map +0 -1
  442. package/dist/tempo/session/precompile/Protocol.d.ts.map +0 -1
  443. package/dist/tempo/session/precompile/Protocol.js.map +0 -1
  444. package/dist/tempo/session/precompile/Voucher.d.ts.map +0 -1
  445. package/dist/tempo/session/precompile/Voucher.js.map +0 -1
  446. package/dist/tempo/session/precompile/escrow.abi.d.ts.map +0 -1
  447. package/dist/tempo/session/precompile/escrow.abi.js.map +0 -1
  448. package/dist/tempo/session/precompile/index.d.ts.map +0 -1
  449. package/dist/tempo/session/precompile/index.js.map +0 -1
  450. package/dist/tempo/session/server/ChannelOps.d.ts.map +0 -1
  451. package/dist/tempo/session/server/ChannelOps.js.map +0 -1
  452. package/dist/tempo/session/server/ChannelStore.d.ts.map +0 -1
  453. package/dist/tempo/session/server/ChannelStore.js.map +0 -1
  454. package/dist/tempo/session/server/CredentialVerification.d.ts.map +0 -1
  455. package/dist/tempo/session/server/CredentialVerification.js.map +0 -1
  456. package/dist/tempo/session/server/MeteredStream.d.ts.map +0 -1
  457. package/dist/tempo/session/server/MeteredStream.js.map +0 -1
  458. package/dist/tempo/session/server/RequestState.d.ts.map +0 -1
  459. package/dist/tempo/session/server/RequestState.js.map +0 -1
  460. package/dist/tempo/session/server/Session.d.ts.map +0 -1
  461. package/dist/tempo/session/server/Session.js.map +0 -1
  462. package/dist/tempo/session/server/Settlement.d.ts.map +0 -1
  463. package/dist/tempo/session/server/Settlement.js.map +0 -1
  464. package/dist/tempo/session/server/Sse.d.ts.map +0 -1
  465. package/dist/tempo/session/server/Sse.js.map +0 -1
  466. package/dist/tempo/session/server/Transports.d.ts.map +0 -1
  467. package/dist/tempo/session/server/Transports.js.map +0 -1
  468. package/dist/tempo/session/server/Ws.d.ts.map +0 -1
  469. package/dist/tempo/session/server/Ws.js.map +0 -1
  470. package/dist/tempo/session/server/index.d.ts.map +0 -1
  471. package/dist/tempo/session/server/index.js.map +0 -1
  472. package/dist/tempo/subscription/KeyAuthorization.d.ts.map +0 -1
  473. package/dist/tempo/subscription/KeyAuthorization.js.map +0 -1
  474. package/dist/tempo/subscription/Receipt.d.ts.map +0 -1
  475. package/dist/tempo/subscription/Receipt.js.map +0 -1
  476. package/dist/tempo/subscription/Store.d.ts.map +0 -1
  477. package/dist/tempo/subscription/Store.js.map +0 -1
  478. package/dist/tempo/subscription/Types.d.ts.map +0 -1
  479. package/dist/tempo/subscription/Types.js.map +0 -1
  480. package/dist/tempo/subscription/index.d.ts.map +0 -1
  481. package/dist/tempo/subscription/index.js.map +0 -1
  482. package/dist/validation/core.d.ts.map +0 -1
  483. package/dist/validation/core.js.map +0 -1
  484. package/dist/validation/index.d.ts.map +0 -1
  485. package/dist/validation/index.js.map +0 -1
  486. package/dist/viem/Account.d.ts.map +0 -1
  487. package/dist/viem/Account.js.map +0 -1
  488. package/dist/viem/Client.d.ts.map +0 -1
  489. package/dist/viem/Client.js.map +0 -1
  490. package/dist/web-bot-auth/Constants.d.ts.map +0 -1
  491. package/dist/web-bot-auth/Constants.js.map +0 -1
  492. package/dist/web-bot-auth/Types.d.ts.map +0 -1
  493. package/dist/web-bot-auth/Types.js.map +0 -1
  494. package/dist/web-bot-auth/client/index.d.ts.map +0 -1
  495. package/dist/web-bot-auth/client/index.js.map +0 -1
  496. package/dist/web-bot-auth/index.d.ts.map +0 -1
  497. package/dist/web-bot-auth/index.js.map +0 -1
  498. package/dist/web-bot-auth/internal/JwkThumbprint.d.ts.map +0 -1
  499. package/dist/web-bot-auth/internal/JwkThumbprint.js.map +0 -1
  500. package/dist/web-bot-auth/internal/SignatureAgent.d.ts.map +0 -1
  501. package/dist/web-bot-auth/internal/SignatureAgent.js.map +0 -1
  502. package/dist/web-bot-auth/server/index.d.ts.map +0 -1
  503. package/dist/web-bot-auth/server/index.js.map +0 -1
  504. package/dist/x402/Assets.d.ts.map +0 -1
  505. package/dist/x402/Assets.js.map +0 -1
  506. package/dist/x402/Header.d.ts.map +0 -1
  507. package/dist/x402/Header.js.map +0 -1
  508. package/dist/x402/Types.d.ts.map +0 -1
  509. package/dist/x402/Types.js.map +0 -1
  510. package/dist/x402/client/Exact.d.ts.map +0 -1
  511. package/dist/x402/client/Exact.js.map +0 -1
  512. package/dist/x402/index.d.ts.map +0 -1
  513. package/dist/x402/index.js.map +0 -1
  514. package/dist/x402/internal/ChallengeBrand.d.ts.map +0 -1
  515. package/dist/x402/internal/ChallengeBrand.js.map +0 -1
  516. package/dist/x402/internal/RouteBinding.d.ts.map +0 -1
  517. package/dist/x402/internal/RouteBinding.js.map +0 -1
  518. package/dist/x402/server/EvmCharge.d.ts.map +0 -1
  519. package/dist/x402/server/EvmCharge.js.map +0 -1
  520. package/dist/x402/server/Facilitator.d.ts.map +0 -1
  521. package/dist/x402/server/Facilitator.js.map +0 -1
  522. package/dist/zod.d.ts.map +0 -1
  523. package/dist/zod.js.map +0 -1
  524. package/src/BodyDigest.test.ts +0 -43
  525. package/src/BodyDigest.ts +0 -55
  526. package/src/Challenge.fuzz.test.ts +0 -154
  527. package/src/Challenge.test-d.ts +0 -82
  528. package/src/Challenge.test.ts +0 -1060
  529. package/src/Challenge.ts +0 -687
  530. package/src/Constants.ts +0 -58
  531. package/src/Credential.fuzz.test.ts +0 -62
  532. package/src/Credential.test.ts +0 -378
  533. package/src/Credential.ts +0 -217
  534. package/src/Errors.test.ts +0 -520
  535. package/src/Errors.ts +0 -448
  536. package/src/Expires.test.ts +0 -112
  537. package/src/Expires.ts +0 -59
  538. package/src/Html.ts +0 -67
  539. package/src/Mcp.ts +0 -85
  540. package/src/Method.test.ts +0 -177
  541. package/src/Method.ts +0 -631
  542. package/src/PaymentRequest.test.ts +0 -147
  543. package/src/PaymentRequest.ts +0 -108
  544. package/src/Receipt.test.ts +0 -151
  545. package/src/Receipt.ts +0 -146
  546. package/src/Store.test-d.ts +0 -211
  547. package/src/Store.test.ts +0 -407
  548. package/src/Store.ts +0 -397
  549. package/src/attestation/Attestation.integration.test.ts +0 -208
  550. package/src/attestation/Client.test.ts +0 -83
  551. package/src/attestation/Client.ts +0 -34
  552. package/src/attestation/Constants.ts +0 -15
  553. package/src/attestation/Server.test.ts +0 -60
  554. package/src/attestation/Server.ts +0 -12
  555. package/src/attestation/Types.test-d.ts +0 -54
  556. package/src/attestation/Types.ts +0 -77
  557. package/src/attestation/index.ts +0 -5
  558. package/src/attestation/internal/HttpMessageSignature.test.ts +0 -101
  559. package/src/attestation/internal/HttpMessageSignature.ts +0 -429
  560. package/src/attestation/internal/SigningContext.ts +0 -13
  561. package/src/bin.js +0 -2
  562. package/src/bin.ts +0 -4
  563. package/src/cli/account.ts +0 -269
  564. package/src/cli/cli.test.ts +0 -2221
  565. package/src/cli/cli.ts +0 -1650
  566. package/src/cli/config.test.ts +0 -89
  567. package/src/cli/config.ts +0 -50
  568. package/src/cli/internal.ts +0 -114
  569. package/src/cli/mcp.test.ts +0 -262
  570. package/src/cli/plugins/evm.ts +0 -55
  571. package/src/cli/plugins/index.ts +0 -4
  572. package/src/cli/plugins/plugin.ts +0 -84
  573. package/src/cli/plugins/stripe.ts +0 -174
  574. package/src/cli/plugins/tempo.ts +0 -1102
  575. package/src/cli/sessions/Manager.test.ts +0 -249
  576. package/src/cli/sessions/Manager.ts +0 -93
  577. package/src/cli/sessions/commands.ts +0 -444
  578. package/src/cli/sessions/request.test.ts +0 -51
  579. package/src/cli/sessions/request.ts +0 -353
  580. package/src/cli/sessions/store.test.ts +0 -581
  581. package/src/cli/sessions/store.ts +0 -940
  582. package/src/cli/utils.test.ts +0 -156
  583. package/src/cli/utils.ts +0 -394
  584. package/src/cli/validate/challenge.ts +0 -565
  585. package/src/cli/validate/discovery.test.ts +0 -435
  586. package/src/cli/validate/discovery.ts +0 -221
  587. package/src/cli/validate/helpers.ts +0 -166
  588. package/src/cli/validate/index.ts +0 -229
  589. package/src/cli/validate/messages.ts +0 -7
  590. package/src/cli/validate/payment.ts +0 -774
  591. package/src/cli/validate.test.ts +0 -843
  592. package/src/client/Methods.ts +0 -8
  593. package/src/client/Mppx.test-d.ts +0 -287
  594. package/src/client/Mppx.test.ts +0 -1065
  595. package/src/client/Mppx.ts +0 -487
  596. package/src/client/Transport.test.ts +0 -586
  597. package/src/client/Transport.ts +0 -170
  598. package/src/client/index.ts +0 -29
  599. package/src/client/internal/Fetch.browser.test.ts +0 -197
  600. package/src/client/internal/Fetch.test-d.ts +0 -109
  601. package/src/client/internal/Fetch.test.ts +0 -2336
  602. package/src/client/internal/Fetch.ts +0 -1075
  603. package/src/client/internal/MethodChallenge.ts +0 -35
  604. package/src/client/internal/MethodResponse.ts +0 -67
  605. package/src/client/internal/protocols/Mcp.test.ts +0 -220
  606. package/src/client/internal/protocols/Mcp.ts +0 -186
  607. package/src/client/internal/protocols/Mpp.ts +0 -21
  608. package/src/client/internal/protocols/Protocol.ts +0 -10
  609. package/src/client/internal/protocols/Shared.ts +0 -25
  610. package/src/client/internal/protocols/X402.ts +0 -46
  611. package/src/client/node.test.ts +0 -115
  612. package/src/client/node.ts +0 -247
  613. package/src/discovery/Discovery.test.ts +0 -214
  614. package/src/discovery/Discovery.ts +0 -105
  615. package/src/discovery/OpenApi.test.ts +0 -623
  616. package/src/discovery/OpenApi.ts +0 -192
  617. package/src/discovery/Validate.test.ts +0 -305
  618. package/src/discovery/Validate.ts +0 -77
  619. package/src/discovery/index.ts +0 -3
  620. package/src/discovery/internal/Metadata.ts +0 -51
  621. package/src/env.d.ts +0 -12
  622. package/src/evm/Assets.ts +0 -1
  623. package/src/evm/Chains.ts +0 -11
  624. package/src/evm/Methods.ts +0 -44
  625. package/src/evm/PublicInterface.test-d.ts +0 -134
  626. package/src/evm/Types.ts +0 -140
  627. package/src/evm/client/Charge.test.ts +0 -347
  628. package/src/evm/client/Charge.ts +0 -187
  629. package/src/evm/client/Methods.ts +0 -19
  630. package/src/evm/client/index.ts +0 -6
  631. package/src/evm/index.ts +0 -16
  632. package/src/evm/server/Charge.test.ts +0 -339
  633. package/src/evm/server/Charge.ts +0 -295
  634. package/src/evm/server/Methods.ts +0 -22
  635. package/src/evm/server/index.ts +0 -6
  636. package/src/index.ts +0 -14
  637. package/src/internal/AcceptPayment.test.ts +0 -347
  638. package/src/internal/AcceptPayment.ts +0 -366
  639. package/src/internal/HeaderCodec.ts +0 -36
  640. package/src/internal/changeset.test.ts +0 -106
  641. package/src/internal/constantTimeEqual.test.ts +0 -47
  642. package/src/internal/constantTimeEqual.ts +0 -10
  643. package/src/internal/env.test.ts +0 -42
  644. package/src/internal/env.ts +0 -49
  645. package/src/internal/types.test-d.ts +0 -21
  646. package/src/internal/types.ts +0 -479
  647. package/src/mcp/client/McpClient.integration.test.ts +0 -639
  648. package/src/mcp/client/McpClient.test-d.ts +0 -144
  649. package/src/mcp/client/McpClient.test.ts +0 -463
  650. package/src/mcp/client/McpClient.ts +0 -307
  651. package/src/mcp/client/McpClient.unit.test.ts +0 -135
  652. package/src/mcp/client/index.ts +0 -2
  653. package/src/mcp/server/Transport.test.ts +0 -191
  654. package/src/mcp/server/Transport.ts +0 -111
  655. package/src/mcp/server/index.ts +0 -1
  656. package/src/middlewares/elysia.test.ts +0 -285
  657. package/src/middlewares/elysia.ts +0 -116
  658. package/src/middlewares/express.test.ts +0 -361
  659. package/src/middlewares/express.ts +0 -140
  660. package/src/middlewares/hono.test.ts +0 -473
  661. package/src/middlewares/hono.ts +0 -153
  662. package/src/middlewares/internal/mppx.test.ts +0 -177
  663. package/src/middlewares/internal/mppx.ts +0 -67
  664. package/src/middlewares/nextjs.test.ts +0 -359
  665. package/src/middlewares/nextjs.ts +0 -107
  666. package/src/proxy/Proxy.test.ts +0 -1038
  667. package/src/proxy/Proxy.ts +0 -483
  668. package/src/proxy/Proxy.upstreamError.test.ts +0 -364
  669. package/src/proxy/Service.test.ts +0 -252
  670. package/src/proxy/Service.ts +0 -280
  671. package/src/proxy/index.ts +0 -6
  672. package/src/proxy/internal/Headers.test.ts +0 -139
  673. package/src/proxy/internal/Headers.ts +0 -66
  674. package/src/proxy/internal/Route.test.ts +0 -217
  675. package/src/proxy/internal/Route.ts +0 -64
  676. package/src/proxy/services/anthropic.test.ts +0 -132
  677. package/src/proxy/services/anthropic.ts +0 -53
  678. package/src/proxy/services/hooks.test-d.ts +0 -14
  679. package/src/proxy/services/hooks.test.ts +0 -44
  680. package/src/proxy/services/openai.test.ts +0 -157
  681. package/src/proxy/services/openai.ts +0 -60
  682. package/src/proxy/services/stripe.test.ts +0 -175
  683. package/src/proxy/services/stripe.ts +0 -59
  684. package/src/server/Methods.test-d.ts +0 -88
  685. package/src/server/Methods.test.ts +0 -69
  686. package/src/server/Methods.ts +0 -3
  687. package/src/server/Mppx.authorize.test.ts +0 -210
  688. package/src/server/Mppx.test-d.ts +0 -494
  689. package/src/server/Mppx.test.ts +0 -6711
  690. package/src/server/Mppx.ts +0 -2919
  691. package/src/server/NodeListener.test.ts +0 -293
  692. package/src/server/NodeListener.ts +0 -45
  693. package/src/server/Request.test.ts +0 -255
  694. package/src/server/Request.ts +0 -155
  695. package/src/server/Response.test.ts +0 -32
  696. package/src/server/Response.ts +0 -45
  697. package/src/server/Transport.test.ts +0 -598
  698. package/src/server/Transport.ts +0 -320
  699. package/src/server/index.ts +0 -9
  700. package/src/server/internal/html/compose.main.gen.ts +0 -2
  701. package/src/server/internal/html/compose.main.ts +0 -88
  702. package/src/server/internal/html/config.ts +0 -672
  703. package/src/server/internal/html/constants.ts +0 -28
  704. package/src/server/internal/html/serviceWorker.client.ts +0 -28
  705. package/src/server/internal/html/serviceWorker.gen.ts +0 -2
  706. package/src/server/internal/html/serviceWorker.ts +0 -27
  707. package/src/server/internal/html/tsconfig.compose.json +0 -8
  708. package/src/server/internal/html/tsconfig.worker.client.json +0 -8
  709. package/src/server/internal/html/tsconfig.worker.json +0 -8
  710. package/src/server/internal/scope.ts +0 -43
  711. package/src/stripe/Charge.integration.test.ts +0 -329
  712. package/src/stripe/Methods.test.ts +0 -62
  713. package/src/stripe/Methods.ts +0 -44
  714. package/src/stripe/client/Charge.test.ts +0 -205
  715. package/src/stripe/client/Charge.ts +0 -132
  716. package/src/stripe/client/Methods.ts +0 -37
  717. package/src/stripe/client/index.ts +0 -2
  718. package/src/stripe/index.ts +0 -1
  719. package/src/stripe/internal/constants.ts +0 -7
  720. package/src/stripe/internal/types.ts +0 -47
  721. package/src/stripe/server/Charge.test-d.ts +0 -81
  722. package/src/stripe/server/Charge.test.ts +0 -700
  723. package/src/stripe/server/Charge.ts +0 -487
  724. package/src/stripe/server/Methods.test-d.ts +0 -157
  725. package/src/stripe/server/Methods.test.ts +0 -403
  726. package/src/stripe/server/Methods.ts +0 -441
  727. package/src/stripe/server/index.ts +0 -2
  728. package/src/stripe/server/internal/deposit-address.ts +0 -57
  729. package/src/stripe/server/internal/html/main.ts +0 -165
  730. package/src/stripe/server/internal/html/node_modules/.bin/mppx +0 -22
  731. package/src/stripe/server/internal/html/node_modules/.bin/mppx.src +0 -22
  732. package/src/stripe/server/internal/html/package.json +0 -9
  733. package/src/stripe/server/internal/html/stripe-js-pure.d.ts +0 -7
  734. package/src/stripe/server/internal/html/tsconfig.json +0 -8
  735. package/src/stripe/server/internal/html/types.ts +0 -5
  736. package/src/stripe/server/internal/html.gen.ts +0 -2
  737. package/src/stripe/server/internal/record-payment.ts +0 -66
  738. package/src/stripe/server/internal/request.ts +0 -49
  739. package/src/tap/Constants.ts +0 -32
  740. package/src/tap/Tap.test.ts +0 -125
  741. package/src/tap/Types.ts +0 -11
  742. package/src/tap/client/index.ts +0 -54
  743. package/src/tap/index.ts +0 -4
  744. package/src/tap/server/index.ts +0 -48
  745. package/src/tempo/AccessKeyAuthorization.test.ts +0 -141
  746. package/src/tempo/Attribution.test.ts +0 -294
  747. package/src/tempo/Attribution.ts +0 -185
  748. package/src/tempo/Methods.test.ts +0 -425
  749. package/src/tempo/Methods.ts +0 -367
  750. package/src/tempo/Proof.conformance.test.ts +0 -146
  751. package/src/tempo/Proof.test-d.ts +0 -32
  752. package/src/tempo/Proof.test.ts +0 -40
  753. package/src/tempo/Proof.ts +0 -69
  754. package/src/tempo/PublicExports.test-d.ts +0 -130
  755. package/src/tempo/Subscription.integration.test.ts +0 -591
  756. package/src/tempo/client/Charge.test.ts +0 -501
  757. package/src/tempo/client/Charge.ts +0 -271
  758. package/src/tempo/client/Methods.ts +0 -45
  759. package/src/tempo/client/ResolveAccount.ts +0 -46
  760. package/src/tempo/client/Subscription.test.ts +0 -180
  761. package/src/tempo/client/Subscription.ts +0 -156
  762. package/src/tempo/client/index.ts +0 -17
  763. package/src/tempo/index.ts +0 -5
  764. package/src/tempo/internal/account.ts +0 -56
  765. package/src/tempo/internal/address.test.ts +0 -42
  766. package/src/tempo/internal/address.ts +0 -6
  767. package/src/tempo/internal/auto-swap.test.ts +0 -198
  768. package/src/tempo/internal/auto-swap.ts +0 -145
  769. package/src/tempo/internal/charge.test.ts +0 -66
  770. package/src/tempo/internal/charge.ts +0 -43
  771. package/src/tempo/internal/defaults.test.ts +0 -95
  772. package/src/tempo/internal/defaults.ts +0 -53
  773. package/src/tempo/internal/fee-payer.test.ts +0 -1177
  774. package/src/tempo/internal/fee-payer.ts +0 -808
  775. package/src/tempo/internal/fee-token.test.ts +0 -165
  776. package/src/tempo/internal/fee-token.ts +0 -72
  777. package/src/tempo/internal/proof.test.ts +0 -97
  778. package/src/tempo/internal/proof.ts +0 -87
  779. package/src/tempo/internal/selectors.ts +0 -10
  780. package/src/tempo/internal/types.ts +0 -19
  781. package/src/tempo/legacy/AccessKeyAuthorization.test.ts +0 -162
  782. package/src/tempo/legacy/README.md +0 -9
  783. package/src/tempo/legacy/client/ChannelOps.test.ts +0 -379
  784. package/src/tempo/legacy/client/ChannelOps.ts +0 -271
  785. package/src/tempo/legacy/client/Session.test.ts +0 -800
  786. package/src/tempo/legacy/client/Session.ts +0 -397
  787. package/src/tempo/legacy/client/SessionManager.test.ts +0 -468
  788. package/src/tempo/legacy/client/SessionManager.ts +0 -909
  789. package/src/tempo/legacy/client/index.ts +0 -6
  790. package/src/tempo/legacy/index.ts +0 -4
  791. package/src/tempo/legacy/session/Chain.test.ts +0 -1349
  792. package/src/tempo/legacy/session/Chain.ts +0 -830
  793. package/src/tempo/legacy/session/Channel.test.ts +0 -109
  794. package/src/tempo/legacy/session/Channel.ts +0 -51
  795. package/src/tempo/legacy/session/Types.ts +0 -91
  796. package/src/tempo/legacy/session/Voucher.test.ts +0 -410
  797. package/src/tempo/legacy/session/Voucher.ts +0 -183
  798. package/src/tempo/legacy/session/escrow.abi.ts +0 -760
  799. package/src/tempo/legacy/session/index.ts +0 -8
  800. package/src/tempo/server/AtomicStore.test-d.ts +0 -63
  801. package/src/tempo/server/Charge.test.ts +0 -6056
  802. package/src/tempo/server/Charge.ts +0 -1379
  803. package/src/tempo/server/Methods.ts +0 -86
  804. package/src/tempo/server/Relay.test.ts +0 -677
  805. package/src/tempo/server/Relay.ts +0 -297
  806. package/src/tempo/server/SponsorBudget.test.ts +0 -154
  807. package/src/tempo/server/SponsorBudget.ts +0 -219
  808. package/src/tempo/server/Sse.test.ts +0 -321
  809. package/src/tempo/server/Subscription.test.ts +0 -1944
  810. package/src/tempo/server/Subscription.ts +0 -1336
  811. package/src/tempo/server/index.ts +0 -12
  812. package/src/tempo/server/internal/html/main.ts +0 -115
  813. package/src/tempo/server/internal/html/node_modules/.bin/mppx +0 -22
  814. package/src/tempo/server/internal/html/node_modules/.bin/mppx.src +0 -22
  815. package/src/tempo/server/internal/html/package.json +0 -10
  816. package/src/tempo/server/internal/html/tsconfig.json +0 -8
  817. package/src/tempo/server/internal/html.gen.ts +0 -2
  818. package/src/tempo/server/internal/request-body.test.ts +0 -210
  819. package/src/tempo/server/internal/request-body.ts +0 -61
  820. package/src/tempo/server/internal/transport.test.ts +0 -922
  821. package/src/tempo/server/internal/transport.ts +0 -322
  822. package/src/tempo/session/README.md +0 -320
  823. package/src/tempo/session/Snapshot.test.ts +0 -41
  824. package/src/tempo/session/Snapshot.ts +0 -95
  825. package/src/tempo/session/client/ChannelOps.test.ts +0 -218
  826. package/src/tempo/session/client/ChannelOps.ts +0 -348
  827. package/src/tempo/session/client/ChannelStore.ts +0 -111
  828. package/src/tempo/session/client/CredentialState.test.ts +0 -789
  829. package/src/tempo/session/client/CredentialState.ts +0 -942
  830. package/src/tempo/session/client/ReceiptCoordinator.ts +0 -95
  831. package/src/tempo/session/client/Runtime.test.ts +0 -1104
  832. package/src/tempo/session/client/Runtime.ts +0 -1008
  833. package/src/tempo/session/client/Session.test.ts +0 -1355
  834. package/src/tempo/session/client/Session.ts +0 -420
  835. package/src/tempo/session/client/SessionManager.test.ts +0 -1899
  836. package/src/tempo/session/client/SessionManager.ts +0 -996
  837. package/src/tempo/session/client/Transports.test.ts +0 -1141
  838. package/src/tempo/session/client/Transports.ts +0 -1534
  839. package/src/tempo/session/client/index.ts +0 -40
  840. package/src/tempo/session/client/internal/SessionManager.ts +0 -36
  841. package/src/tempo/session/index.ts +0 -7
  842. package/src/tempo/session/precompile/Chain.integration.test.ts +0 -339
  843. package/src/tempo/session/precompile/Chain.test.ts +0 -1641
  844. package/src/tempo/session/precompile/Chain.ts +0 -1269
  845. package/src/tempo/session/precompile/Channel.test.ts +0 -147
  846. package/src/tempo/session/precompile/Channel.ts +0 -108
  847. package/src/tempo/session/precompile/Protocol.test.ts +0 -358
  848. package/src/tempo/session/precompile/Protocol.ts +0 -520
  849. package/src/tempo/session/precompile/Voucher.test.ts +0 -354
  850. package/src/tempo/session/precompile/Voucher.ts +0 -162
  851. package/src/tempo/session/precompile/escrow.abi.ts +0 -226
  852. package/src/tempo/session/precompile/index.ts +0 -33
  853. package/src/tempo/session/server/ChannelOps.test.ts +0 -129
  854. package/src/tempo/session/server/ChannelOps.ts +0 -157
  855. package/src/tempo/session/server/ChannelStore.test.ts +0 -1093
  856. package/src/tempo/session/server/ChannelStore.ts +0 -856
  857. package/src/tempo/session/server/CredentialVerification.test.ts +0 -299
  858. package/src/tempo/session/server/CredentialVerification.ts +0 -1087
  859. package/src/tempo/session/server/MeteredStream.ts +0 -99
  860. package/src/tempo/session/server/RequestState.test.ts +0 -574
  861. package/src/tempo/session/server/RequestState.ts +0 -507
  862. package/src/tempo/session/server/Session.integration.test.ts +0 -449
  863. package/src/tempo/session/server/Session.test.ts +0 -4247
  864. package/src/tempo/session/server/Session.ts +0 -669
  865. package/src/tempo/session/server/Settlement.test.ts +0 -345
  866. package/src/tempo/session/server/Settlement.ts +0 -527
  867. package/src/tempo/session/server/Sse.fuzz.test.ts +0 -138
  868. package/src/tempo/session/server/Sse.test.ts +0 -634
  869. package/src/tempo/session/server/Sse.ts +0 -261
  870. package/src/tempo/session/server/Transports.test.ts +0 -346
  871. package/src/tempo/session/server/Transports.ts +0 -256
  872. package/src/tempo/session/server/Ws.test.ts +0 -765
  873. package/src/tempo/session/server/Ws.ts +0 -391
  874. package/src/tempo/session/server/index.ts +0 -12
  875. package/src/tempo/subscription/KeyAuthorization.test.ts +0 -282
  876. package/src/tempo/subscription/KeyAuthorization.ts +0 -396
  877. package/src/tempo/subscription/Receipt.ts +0 -28
  878. package/src/tempo/subscription/Store.test.ts +0 -609
  879. package/src/tempo/subscription/Store.ts +0 -449
  880. package/src/tempo/subscription/Types.ts +0 -68
  881. package/src/tempo/subscription/index.ts +0 -23
  882. package/src/tsconfig.json +0 -10
  883. package/src/validation/core.ts +0 -386
  884. package/src/validation/index.ts +0 -11
  885. package/src/viem/Account.test.ts +0 -72
  886. package/src/viem/Account.ts +0 -30
  887. package/src/viem/Client.test.ts +0 -366
  888. package/src/viem/Client.ts +0 -93
  889. package/src/web-bot-auth/Constants.ts +0 -24
  890. package/src/web-bot-auth/Types.ts +0 -9
  891. package/src/web-bot-auth/WebBotAuth.test.ts +0 -182
  892. package/src/web-bot-auth/client/index.ts +0 -84
  893. package/src/web-bot-auth/index.ts +0 -6
  894. package/src/web-bot-auth/internal/JwkThumbprint.ts +0 -21
  895. package/src/web-bot-auth/internal/SignatureAgent.ts +0 -18
  896. package/src/web-bot-auth/server/index.ts +0 -113
  897. package/src/x402/Assets.test.ts +0 -253
  898. package/src/x402/Assets.ts +0 -221
  899. package/src/x402/Exact.e2e.test.ts +0 -488
  900. package/src/x402/Exact.localnet.test.ts +0 -475
  901. package/src/x402/Header.test.ts +0 -73
  902. package/src/x402/Header.ts +0 -79
  903. package/src/x402/PublicInterface.test-d.ts +0 -39
  904. package/src/x402/Types.ts +0 -248
  905. package/src/x402/client/Exact.test.ts +0 -309
  906. package/src/x402/client/Exact.ts +0 -186
  907. package/src/x402/index.ts +0 -6
  908. package/src/x402/internal/ChallengeBrand.ts +0 -14
  909. package/src/x402/internal/RouteBinding.ts +0 -18
  910. package/src/x402/server/EvmCharge.ts +0 -410
  911. package/src/x402/server/Facilitator.test.ts +0 -111
  912. package/src/x402/server/Facilitator.ts +0 -56
  913. package/src/zod.test.ts +0 -169
  914. package/src/zod.ts +0 -71
@@ -1,1336 +0,0 @@
1
- import { Base64 } from 'ox'
2
- import { KeyAuthorization } from 'ox/tempo'
3
- import {
4
- encodeFunctionData,
5
- isAddressEqual,
6
- parseEventLogs,
7
- type Address,
8
- type Client as ViemClient,
9
- type TransactionReceipt,
10
- } from 'viem'
11
- import {
12
- call as viem_call,
13
- prepareTransactionRequest,
14
- sendRawTransaction,
15
- sendRawTransactionSync,
16
- signTransaction,
17
- } from 'viem/actions'
18
- import { Abis, Account as TempoAccount, Transaction } from 'viem/tempo'
19
- import { tempo as tempo_chain } from 'viem/tempo/chains'
20
-
21
- import { VerificationFailedError } from '../../Errors.js'
22
- import type { LooseOmit, MaybePromise, NoExtraKeys } from '../../internal/types.js'
23
- import * as Method from '../../Method.js'
24
- import * as Store from '../../Store.js'
25
- import type * as Client from '../../viem/Client.js'
26
- import * as ClientResolver from '../../viem/Client.js'
27
- import * as Attribution from '../Attribution.js'
28
- import * as Account from '../internal/account.js'
29
- import * as defaults from '../internal/defaults.js'
30
- import * as FeePayer from '../internal/fee-payer.js'
31
- import * as Proof from '../internal/proof.js'
32
- import type * as types from '../internal/types.js'
33
- import * as Methods from '../Methods.js'
34
- import {
35
- assertSubscriptionTiming,
36
- toSubscriptionPeriodSeconds,
37
- verifySubscriptionKeyAuthorization,
38
- } from '../subscription/KeyAuthorization.js'
39
- import * as SubscriptionReceipt from '../subscription/Receipt.js'
40
- import * as SubscriptionStore from '../subscription/Store.js'
41
- import type {
42
- SubscriptionAccessKey,
43
- SubscriptionCredentialPayload,
44
- SubscriptionLookup,
45
- SubscriptionPeriodUnit,
46
- SubscriptionRecord,
47
- SubscriptionReceipt as SubscriptionReceiptValue,
48
- } from '../subscription/Types.js'
49
-
50
- type SubscriptionRequest = ReturnType<typeof Methods.subscription.schema.request.parse>
51
- type RenewalHandler = NonNullable<subscription.Parameters['renew']>
52
-
53
- /**
54
- * Creates a Tempo subscription method for recurring TIP-20 token payments.
55
- *
56
- * The method handles activation, request-path reuse, and optional lazy renewals.
57
- */
58
- export function subscription<const parameters extends subscription.Parameters>(
59
- p: NoExtraKeys<parameters, subscription.Parameters>,
60
- ) {
61
- const parameters = p as parameters
62
- const rawStore = (parameters.store ?? Store.memory()) as Store.AtomicStore<
63
- Record<string, unknown>
64
- >
65
- if (typeof rawStore.update !== 'function') {
66
- throw new Error('tempo.subscription() requires an atomic store with `update`.')
67
- }
68
- const defaultChainId = parameters.chainId ?? defaults.chainId.testnet
69
- const {
70
- amount,
71
- currency = defaults.resolveCurrency({ chainId: defaultChainId }),
72
- decimals = defaults.decimals,
73
- description,
74
- externalId,
75
- periodCount,
76
- periodUnit,
77
- subscriptionExpires,
78
- } = parameters
79
-
80
- const { recipient } = Account.resolve(parameters)
81
- const context = createContext(parameters, {
82
- store: Store.from(rawStore, { keyPrefix: parameters.storeKeyPrefix }),
83
- options: {
84
- activationTimeoutMs: parameters.activationTimeoutMs,
85
- renewalTimeoutMs: parameters.renewalTimeoutMs,
86
- },
87
- })
88
- const { feePayer, feePayerPolicy, getClient, store, waitForConfirmation } = context
89
-
90
- type Defaults = subscription.DeriveDefaults<parameters>
91
- const method = Method.toServer<
92
- typeof Methods.subscription,
93
- Defaults,
94
- undefined,
95
- subscription.Extensions
96
- >(Methods.subscription, {
97
- canOffer: parameters.canOffer,
98
- onPaymentSuccess: parameters.onPaymentSuccess,
99
- defaults: {
100
- amount,
101
- currency,
102
- decimals,
103
- description,
104
- externalId,
105
- periodCount,
106
- periodUnit,
107
- recipient,
108
- subscriptionExpires,
109
- } as unknown as Defaults,
110
- extensions: {
111
- renew: (parameters) =>
112
- renewWithContext({
113
- context: {
114
- ...context,
115
- feePayerPolicy: parameters.feePayerPolicy
116
- ? resolveFeePayerPolicy(context.feePayerPolicy, parameters.feePayerPolicy)
117
- : context.feePayerPolicy,
118
- waitForConfirmation: parameters.waitForConfirmation ?? context.waitForConfirmation,
119
- },
120
- subscriptionId: parameters.subscriptionId,
121
- }),
122
- },
123
-
124
- async authorize({ input, request }) {
125
- if (parameters.requireCredential) return undefined
126
-
127
- const resolved = await parameters.resolve({ input, request })
128
- if (!resolved) return undefined
129
-
130
- const subscription = await store.getByKey(resolved.key)
131
- if (!subscription || !isActive(subscription)) return undefined
132
- if (!subscriptionMatchesRequest(subscription, request)) return undefined
133
-
134
- const periodIndex = getPeriodIndex(subscription)
135
- if (periodIndex > subscription.lastChargedPeriod) {
136
- const renew = resolveRenewalHandler({
137
- feePayer,
138
- feePayerPolicy,
139
- getClient,
140
- parameters,
141
- store,
142
- subscription,
143
- waitForConfirmation,
144
- })
145
- if (!renew) return undefined
146
-
147
- const renewal = await settleRenewal({
148
- expectedLookupKey: resolved.key,
149
- periodIndex,
150
- renew,
151
- request,
152
- store,
153
- subscription,
154
- })
155
- if (!renewal) return undefined
156
- if (renewal.status === 'charged') return { receipt: renewal.receipt }
157
- if (renewal.status === 'inFlight') {
158
- return {
159
- receipt: renewal.receipt,
160
- response: new Response(null, {
161
- headers: { 'Retry-After': '1' },
162
- status: 409,
163
- }),
164
- }
165
- }
166
-
167
- await parameters.hooks?.renewed?.({
168
- periodIndex,
169
- receipt: renewal.result.receipt,
170
- subscription: renewal.result.subscription,
171
- })
172
- return {
173
- receipt: renewal.result.receipt,
174
- }
175
- }
176
-
177
- return {
178
- receipt: SubscriptionReceipt.fromRecord(subscription),
179
- }
180
- },
181
-
182
- async request({ capturedRequest, credential, request }) {
183
- const credentialRequest = credential?.challenge.request as SubscriptionRequest | undefined
184
- const chainId =
185
- request.chainId ??
186
- parameters.chainId ??
187
- credentialRequest?.methodDetails?.chainId ??
188
- defaults.chainId.testnet
189
- const parsedRequest = Methods.subscription.schema.request.parse({
190
- ...request,
191
- chainId,
192
- })
193
- const input = requestFromCaptured(capturedRequest)
194
- const resolved = await parameters.resolve({ input, request: parsedRequest })
195
- const existing = resolved ? await store.getByKey(resolved.key) : null
196
- const accessKey = !credential
197
- ? resolved
198
- ? await resolveChallengeAccessKey({
199
- existing,
200
- input,
201
- parameters,
202
- request: parsedRequest,
203
- resolved,
204
- store,
205
- })
206
- : parameters.requireCredential && !parameters.activate
207
- ? await createUnboundChallengeAccessKey({ store })
208
- : undefined
209
- : (credentialRequest?.methodDetails?.accessKey ?? parsedRequest.methodDetails?.accessKey)
210
- if (!accessKey) {
211
- throw new VerificationFailedError({ reason: 'subscription accessKey is missing' })
212
- }
213
-
214
- // Challenges carry the server-generated key in methodDetails so the shared request shape stays spec-compatible.
215
- return {
216
- ...request,
217
- methodDetails: {
218
- ...request.methodDetails,
219
- accessKey,
220
- },
221
- chainId,
222
- }
223
- },
224
-
225
- stableBinding: subscriptionBinding,
226
-
227
- async verify({ credential, envelope, request }) {
228
- const input = requestFromCaptured(envelope?.capturedRequest)
229
- const parsed = Methods.subscription.schema.request.safeParse(request)
230
- const parsedRequest = parsed.success ? parsed.data : (request as SubscriptionRequest)
231
- assertSubscriptionTiming({
232
- challengeExpires: credential.challenge.expires,
233
- request: parsedRequest,
234
- })
235
- const challengeRequest = credential.challenge.request as SubscriptionRequest
236
- let resolved: subscription.ResolvedSubscription | null = null
237
- let accessKey =
238
- challengeRequest.methodDetails?.accessKey ?? parsedRequest.methodDetails?.accessKey
239
- if (!accessKey) {
240
- resolved = await parameters.resolve({ input, request: parsedRequest })
241
- if (!resolved) {
242
- throw new VerificationFailedError({ reason: 'subscription could not be resolved' })
243
- }
244
- accessKey = await resolveAccessKey({ input, parameters, request: parsedRequest, resolved })
245
- }
246
- if (!accessKey) {
247
- throw new VerificationFailedError({ reason: 'subscription accessKey is missing' })
248
- }
249
- const verified = verifySubscriptionKeyAuthorization({
250
- accessKey,
251
- chainId: parsedRequest.methodDetails?.chainId ?? defaults.chainId.testnet,
252
- payload: credential.payload as SubscriptionCredentialPayload,
253
- request: parsedRequest,
254
- })
255
- const declaredSource = credential.source ? Proof.parsePkhSource(credential.source) : null
256
- if (
257
- declaredSource &&
258
- (declaredSource.chainId !== verified.source.chainId ||
259
- !isAddressEqual(declaredSource.address, verified.source.address))
260
- ) {
261
- throw new VerificationFailedError({
262
- reason: 'credential source does not match signature',
263
- })
264
- }
265
- resolved =
266
- (await parameters.resolve({ input, request: parsedRequest, source: verified.source })) ??
267
- resolved
268
-
269
- if (!resolved) {
270
- throw new VerificationFailedError({ reason: 'subscription could not be resolved' })
271
- }
272
-
273
- const activation = await store.activate({
274
- challengeId: credential.challenge.id,
275
- isReusable: (subscription) =>
276
- parameters.requireCredential
277
- ? isActiveSubscriptionForRequest(subscription, parsedRequest)
278
- : isReusableSubscription(subscription, parsedRequest),
279
- lookupKey: resolved.key,
280
- async create() {
281
- const activation = withSubscriptionAccessKey(
282
- await activateSubscription({
283
- accessKey,
284
- auto: {
285
- challengeId: credential.challenge.id,
286
- feePayer,
287
- feePayerPolicy,
288
- getClient,
289
- keyAuthorization: (credential.payload as SubscriptionCredentialPayload).signature,
290
- realm: credential.challenge.realm,
291
- store,
292
- waitForConfirmation,
293
- },
294
- credential: credential as typeof credential & {
295
- payload: SubscriptionCredentialPayload
296
- },
297
- input,
298
- parameters,
299
- request: parsedRequest,
300
- resolved,
301
- source: verified.source,
302
- }),
303
- accessKey,
304
- )
305
- validateSubscriptionSettlement(activation, {
306
- expectedLookupKey: resolved.key,
307
- expectedPeriodIndex: 0,
308
- request: parsedRequest,
309
- })
310
- return activation
311
- },
312
- })
313
- if (activation.status === 'replayed') {
314
- throw new VerificationFailedError({
315
- reason: 'subscription credential has already been used',
316
- })
317
- }
318
- if (activation.status === 'inFlight') {
319
- throw new VerificationFailedError({
320
- reason: 'subscription activation is already in flight',
321
- })
322
- }
323
- if (activation.status === 'claimMismatch') {
324
- throw new VerificationFailedError({ reason: 'subscription activation claim mismatch' })
325
- }
326
- if (activation.status === 'existing') {
327
- const subscription = activation.subscription
328
- assertSubscriptionPayer(subscription, verified.source, {
329
- required: parameters.requireCredential,
330
- })
331
-
332
- const periodIndex = getPeriodIndex(subscription)
333
- if (periodIndex > subscription.lastChargedPeriod) {
334
- const renew = resolveRenewalHandler({
335
- feePayer,
336
- feePayerPolicy,
337
- getClient,
338
- parameters,
339
- store,
340
- subscription,
341
- waitForConfirmation,
342
- })
343
- if (!renew) {
344
- throw new VerificationFailedError({ reason: 'subscription renewal is required' })
345
- }
346
-
347
- const renewal = await settleRenewal({
348
- expectedLookupKey: resolved.key,
349
- periodIndex,
350
- renew,
351
- request: parsedRequest,
352
- store,
353
- subscription,
354
- })
355
- if (!renewal) {
356
- throw new VerificationFailedError({ reason: 'subscription renewal failed' })
357
- }
358
- if (renewal.status === 'charged' || renewal.status === 'inFlight') {
359
- return renewal.receipt
360
- }
361
-
362
- await parameters.hooks?.renewed?.({
363
- periodIndex,
364
- receipt: renewal.result.receipt,
365
- subscription: renewal.result.subscription,
366
- })
367
- return renewal.result.receipt
368
- }
369
-
370
- return SubscriptionReceipt.fromRecord(subscription)
371
- }
372
-
373
- await parameters.hooks?.activated?.({
374
- receipt: activation.result.receipt,
375
- subscription: activation.result.subscription,
376
- })
377
- return activation.result.receipt
378
- },
379
- })
380
- return method
381
- }
382
-
383
- // Access-key provisioning can cost around 4M gas.
384
- const defaultFeePayerPolicy = {
385
- maxGas: 5_000_000n,
386
- maxTotalFee: 200_000_000_000_000_000n,
387
- } satisfies Partial<FeePayer.Policy>
388
-
389
- function resolveFeePayerPolicy(
390
- ...policies: (Partial<FeePayer.Policy> | undefined)[]
391
- ): Partial<FeePayer.Policy> {
392
- return Object.assign({}, defaultFeePayerPolicy, ...policies)
393
- }
394
-
395
- function requestFromCaptured(capturedRequest: Method.CapturedRequest | undefined): Request {
396
- if (!capturedRequest) return new Request('https://subscription.invalid')
397
- return new Request(capturedRequest.url, {
398
- headers: capturedRequest.headers,
399
- method: capturedRequest.method,
400
- })
401
- }
402
-
403
- async function resolveAccessKey(parameters: {
404
- input: Request
405
- parameters: subscription.Parameters
406
- request: SubscriptionRequest
407
- resolved: subscription.ResolvedSubscription
408
- }) {
409
- const { input, parameters: subscriptionParameters, request, resolved } = parameters
410
- return (
411
- resolved.accessKey ??
412
- (subscriptionParameters.accessKey
413
- ? await subscriptionParameters.accessKey({ input, request, resolved })
414
- : undefined)
415
- )
416
- }
417
-
418
- async function resolveChallengeAccessKey(parameters: {
419
- existing: SubscriptionRecord | null
420
- input: Request
421
- parameters: subscription.Parameters
422
- request: SubscriptionRequest
423
- resolved: subscription.ResolvedSubscription
424
- store: SubscriptionStore.SubscriptionStore
425
- }) {
426
- const {
427
- existing,
428
- input,
429
- parameters: subscriptionParameters,
430
- request,
431
- resolved,
432
- store,
433
- } = parameters
434
- if (!subscriptionParameters.activate) {
435
- // In automatic mode, the SDK owns the server access key so apps can issue
436
- // challenges from only their resolved subscription lookup key.
437
- const accessKey = await store.getOrCreateAccessKey(resolved.key)
438
- return {
439
- accessKeyAddress: accessKey.accessKeyAddress,
440
- keyType: accessKey.keyType,
441
- } satisfies SubscriptionAccessKey
442
- }
443
- // Manual activation keeps the lower-level API: callers can provide the
444
- // access key for new challenges, while active subscriptions reuse the stored key.
445
- return (
446
- (await resolveAccessKey({ input, parameters: subscriptionParameters, request, resolved })) ??
447
- (existing && isActive(existing) ? existing.accessKey : undefined)
448
- )
449
- }
450
-
451
- async function createUnboundChallengeAccessKey(parameters: {
452
- store: SubscriptionStore.SubscriptionStore
453
- }) {
454
- const accessKey = await parameters.store.getOrCreateAccessKey(
455
- `challenge:${createSubscriptionId()}`,
456
- )
457
- return {
458
- accessKeyAddress: accessKey.accessKeyAddress,
459
- keyType: accessKey.keyType,
460
- } satisfies SubscriptionAccessKey
461
- }
462
-
463
- async function activateSubscription(parameters: {
464
- accessKey: SubscriptionAccessKey
465
- auto: {
466
- challengeId: string
467
- feePayer?: ReturnType<typeof Account.resolve>['feePayer'] | undefined
468
- feePayerPolicy?: Partial<FeePayer.Policy> | undefined
469
- getClient: (parameters: { chainId?: number | undefined }) => MaybePromise<ViemClient>
470
- keyAuthorization: `0x${string}`
471
- realm: string
472
- store: SubscriptionStore.SubscriptionStore
473
- waitForConfirmation: boolean
474
- }
475
- credential: {
476
- payload: SubscriptionCredentialPayload
477
- source?: string | undefined
478
- }
479
- input: Request
480
- parameters: subscription.Parameters
481
- request: SubscriptionRequest
482
- resolved: subscription.ResolvedSubscription
483
- source: { address: Address; chainId: number } | null
484
- }) {
485
- const {
486
- accessKey,
487
- auto,
488
- credential,
489
- input,
490
- parameters: subscriptionParameters,
491
- request,
492
- resolved,
493
- source,
494
- } = parameters
495
- if (subscriptionParameters.activate) {
496
- // A custom activate hook owns settlement and record creation.
497
- return subscriptionParameters.activate({
498
- accessKey,
499
- credential,
500
- input,
501
- request,
502
- resolved,
503
- source,
504
- })
505
- }
506
- if (!source) {
507
- throw new VerificationFailedError({ reason: 'subscription payer is missing' })
508
- }
509
-
510
- // Automatic activation bills the first period and persists the recurring
511
- // billing authority needed for request-path and background renewals.
512
- const reference = await submitSubscriptionPayment({
513
- accessKey,
514
- feePayer: auto.feePayer,
515
- feePayerPolicy: auto.feePayerPolicy,
516
- getClient: auto.getClient,
517
- keyAuthorization: auto.keyAuthorization,
518
- lookupKey: resolved.key,
519
- request,
520
- settlementReference: auto.challengeId,
521
- source,
522
- store: auto.store,
523
- waitForConfirmation: auto.waitForConfirmation,
524
- })
525
- const timestamp = new Date().toISOString()
526
- const subscription = {
527
- accessKey,
528
- amount: request.amount,
529
- billingAnchor: timestamp,
530
- chainId: request.methodDetails?.chainId,
531
- currency: request.currency,
532
- externalId: request.externalId,
533
- keyAuthorization: auto.keyAuthorization,
534
- lastChargedPeriod: 0,
535
- lookupKey: resolved.key,
536
- payer: source,
537
- periodCount: request.periodCount,
538
- periodUnit: request.periodUnit,
539
- recipient: request.recipient,
540
- reference,
541
- subscriptionExpires: request.subscriptionExpires,
542
- subscriptionId: createSubscriptionId(),
543
- timestamp,
544
- } satisfies SubscriptionRecord
545
-
546
- return {
547
- receipt: SubscriptionReceipt.createSubscriptionReceipt(subscription),
548
- subscription,
549
- }
550
- }
551
-
552
- async function settleRenewal(parameters: {
553
- expectedLookupKey: string
554
- periodIndex: number
555
- renew: (parameters: {
556
- inFlightReference: string
557
- periodIndex: number
558
- subscription: SubscriptionRecord
559
- }) => Promise<subscription.RenewalResult>
560
- request?: SubscriptionRequest | undefined
561
- store: SubscriptionStore.SubscriptionStore
562
- subscription: SubscriptionRecord
563
- }): Promise<
564
- | { status: 'charged'; receipt: SubscriptionReceiptValue }
565
- | { status: 'inFlight'; receipt: SubscriptionReceiptValue }
566
- | { status: 'renewed'; result: subscription.RenewalResult }
567
- | null
568
- > {
569
- const { expectedLookupKey, periodIndex, renew, request, store, subscription } = parameters
570
- const inFlightReference = renewalReference(subscription.subscriptionId, periodIndex)
571
- const renewal = await store.renew({
572
- inFlightReference,
573
- periodIndex,
574
- async renew({ inFlightReference, periodIndex, subscription: started }) {
575
- const renewed = withSubscriptionAccessKey(
576
- await renew({
577
- inFlightReference,
578
- periodIndex,
579
- subscription: started,
580
- }),
581
- started.accessKey,
582
- )
583
- validateSubscriptionSettlement(renewed, {
584
- expectedLookupKey,
585
- expectedPeriodIndex: periodIndex,
586
- expectedSubscriptionId: subscription.subscriptionId,
587
- previous: started,
588
- request,
589
- })
590
- return renewed
591
- },
592
- subscriptionId: subscription.subscriptionId,
593
- })
594
-
595
- if (renewal.status === 'charged') {
596
- return { receipt: SubscriptionReceipt.fromRecord(renewal.subscription), status: 'charged' }
597
- }
598
- if (renewal.status === 'inFlight') {
599
- return { receipt: SubscriptionReceipt.fromRecord(renewal.subscription), status: 'inFlight' }
600
- }
601
- if (renewal.status === 'renewed') return { result: renewal.result, status: 'renewed' }
602
- if (renewal.status === 'claimMismatch') {
603
- throw new VerificationFailedError({ reason: 'subscription renewal claim mismatch' })
604
- }
605
- return null
606
- }
607
-
608
- function renewalReference(subscriptionId: string, periodIndex: number): string {
609
- // This stable identifier is persisted before the billing hook runs so apps can
610
- // use it as an idempotency/reconciliation key if a renewal crashes mid-flight.
611
- return `renewal:${subscriptionId}:${periodIndex}`
612
- }
613
-
614
- function withSubscriptionAccessKey<
615
- result extends subscription.ActivationResult | subscription.RenewalResult,
616
- >(result: result, accessKey: SubscriptionAccessKey | undefined): result {
617
- if (!accessKey || result.subscription.accessKey) return result
618
- return {
619
- ...result,
620
- subscription: {
621
- ...result.subscription,
622
- accessKey,
623
- },
624
- }
625
- }
626
-
627
- function getPeriodIndex(subscription: SubscriptionRecord): number {
628
- const anchor = new Date(subscription.billingAnchor).getTime()
629
- const expires = new Date(subscription.subscriptionExpires).getTime()
630
- const now = Date.now()
631
- if (!Number.isFinite(anchor) || !Number.isFinite(expires) || now >= expires) {
632
- return Number.POSITIVE_INFINITY
633
- }
634
-
635
- let periodSeconds: number
636
- try {
637
- periodSeconds = toSubscriptionPeriodSeconds(subscription)
638
- } catch {
639
- return Number.POSITIVE_INFINITY
640
- }
641
-
642
- return Math.max(0, Math.floor((now - anchor) / (periodSeconds * 1_000)))
643
- }
644
-
645
- function isActive(subscription: SubscriptionRecord): boolean {
646
- if (subscription.canceledAt || subscription.revokedAt) return false
647
- return new Date(subscription.subscriptionExpires).getTime() > Date.now()
648
- }
649
-
650
- function isActiveSubscriptionForRequest(
651
- subscription: SubscriptionRecord,
652
- request: SubscriptionRequest,
653
- ): boolean {
654
- return isActive(subscription) && subscriptionMatchesRequest(subscription, request)
655
- }
656
-
657
- function isReusableSubscription(
658
- subscription: SubscriptionRecord,
659
- request: SubscriptionRequest,
660
- ): boolean {
661
- return (
662
- isActiveSubscriptionForRequest(subscription, request) &&
663
- getPeriodIndex(subscription) <= subscription.lastChargedPeriod
664
- )
665
- }
666
-
667
- function subscriptionMatchesRequest(
668
- subscription: SubscriptionRecord,
669
- request: SubscriptionRequest | SubscriptionRecord,
670
- ): boolean {
671
- const actual = comparableSubscriptionBinding(subscription)
672
- const expected = comparableSubscriptionBinding(request)
673
- return (Object.keys(expected) as (keyof typeof expected)[]).every(
674
- (key) => actual[key] === expected[key],
675
- )
676
- }
677
-
678
- function assertSubscriptionPayer(
679
- subscription: SubscriptionRecord,
680
- source: { address: Address; chainId: number },
681
- options?: { required?: boolean | undefined },
682
- ) {
683
- if (!subscription.payer) {
684
- if (options?.required) {
685
- throw new VerificationFailedError({ reason: 'subscription payer is missing' })
686
- }
687
- return
688
- }
689
- if (
690
- subscription.payer.chainId !== source.chainId ||
691
- !isAddressEqual(subscription.payer.address, source.address)
692
- ) {
693
- throw new VerificationFailedError({ reason: 'subscription payer mismatch' })
694
- }
695
- }
696
-
697
- function comparableSubscriptionBinding(value: SubscriptionRecord | SubscriptionRequest) {
698
- const chainId =
699
- 'chainId' in value ? value.chainId : (value as SubscriptionRequest).methodDetails?.chainId
700
- return {
701
- amount: value.amount,
702
- chainId,
703
- currency: value.currency.toLowerCase(),
704
- externalId: value.externalId,
705
- periodCount: value.periodCount,
706
- periodUnit: value.periodUnit,
707
- recipient: value.recipient.toLowerCase(),
708
- subscriptionExpires: value.subscriptionExpires,
709
- }
710
- }
711
-
712
- function validateSubscriptionSettlement(
713
- result: subscription.ActivationResult | subscription.RenewalResult,
714
- options: {
715
- expectedLookupKey: string
716
- expectedPeriodIndex: number
717
- expectedSubscriptionId?: string | undefined
718
- previous?: SubscriptionRecord | undefined
719
- request?: SubscriptionRequest | undefined
720
- },
721
- ) {
722
- const { receipt, subscription } = result
723
- assertSubscriptionReceipt(receipt, subscription)
724
- assertSubscriptionRecord(subscription, options)
725
-
726
- if (options.request) {
727
- assertSubscriptionRequestMatch(subscription, options.request)
728
- } else if (options.previous) {
729
- assertSubscriptionRequestMatch(subscription, options.previous)
730
- }
731
- }
732
-
733
- function assertSubscriptionReceipt(
734
- receipt: SubscriptionReceiptValue,
735
- subscription: SubscriptionRecord,
736
- ) {
737
- if (receipt.method !== 'tempo' || receipt.status !== 'success') {
738
- throw new VerificationFailedError({ reason: 'subscription receipt is invalid' })
739
- }
740
- if (receipt.subscriptionId !== subscription.subscriptionId) {
741
- throw new VerificationFailedError({ reason: 'subscription receipt id mismatch' })
742
- }
743
- if (receipt.reference !== subscription.reference) {
744
- throw new VerificationFailedError({ reason: 'subscription receipt reference mismatch' })
745
- }
746
- if (receipt.timestamp !== subscription.timestamp) {
747
- throw new VerificationFailedError({ reason: 'subscription receipt timestamp mismatch' })
748
- }
749
- assertTransactionHash(receipt.reference, 'subscription reference must be a transaction hash')
750
- assertValidDate(receipt.timestamp, 'subscription receipt timestamp is invalid')
751
- }
752
-
753
- function assertSubscriptionRecord(
754
- subscription: SubscriptionRecord,
755
- options: {
756
- expectedLookupKey: string
757
- expectedPeriodIndex: number
758
- expectedSubscriptionId?: string | undefined
759
- },
760
- ) {
761
- assertBase64Url(subscription.subscriptionId, 'subscriptionId must be base64url')
762
- assertTransactionHash(subscription.reference, 'subscription reference must be a transaction hash')
763
- const billingAnchor = assertValidDate(
764
- subscription.billingAnchor,
765
- 'subscription billingAnchor is invalid',
766
- )
767
- const subscriptionExpires = assertValidDate(
768
- subscription.subscriptionExpires,
769
- 'subscriptionExpires is invalid',
770
- )
771
-
772
- assertEqual(subscription.lookupKey, options.expectedLookupKey, {
773
- reason: 'subscription lookupKey does not match the resolved key',
774
- })
775
- assertEqual(subscription.lastChargedPeriod, options.expectedPeriodIndex, {
776
- reason: 'subscription lastChargedPeriod does not match the settled period',
777
- })
778
- if (options.expectedSubscriptionId) {
779
- assertEqual(subscription.subscriptionId, options.expectedSubscriptionId, {
780
- reason: 'subscriptionId does not match the active subscription',
781
- })
782
- }
783
- if (billingAnchor >= subscriptionExpires) {
784
- throw new VerificationFailedError({
785
- reason: 'subscription billingAnchor must be before subscriptionExpires',
786
- })
787
- }
788
- }
789
-
790
- function assertSubscriptionRequestMatch(
791
- subscription: SubscriptionRecord,
792
- request: SubscriptionRequest | SubscriptionRecord,
793
- ) {
794
- if (!subscriptionMatchesRequest(subscription, request)) {
795
- throw new VerificationFailedError({ reason: 'subscription record does not match request' })
796
- }
797
- }
798
-
799
- function assertBase64Url(value: string, reason: string) {
800
- if (!/^[A-Za-z0-9_-]+$/.test(value)) {
801
- throw new VerificationFailedError({ reason })
802
- }
803
- }
804
-
805
- function assertTransactionHash(value: string, reason: string) {
806
- if (!/^0x[0-9a-fA-F]{64}$/.test(value)) {
807
- throw new VerificationFailedError({ reason })
808
- }
809
- }
810
-
811
- function assertValidDate(value: string, reason: string) {
812
- const milliseconds = new Date(value).getTime()
813
- if (!Number.isFinite(milliseconds)) {
814
- throw new VerificationFailedError({ reason })
815
- }
816
- return milliseconds
817
- }
818
-
819
- function assertEqual<value>(actual: value, expected: value, options: { reason: string }) {
820
- if (actual !== expected) {
821
- throw new VerificationFailedError(options)
822
- }
823
- }
824
-
825
- function subscriptionBinding(request: SubscriptionRequest) {
826
- return {
827
- amount: request.amount,
828
- chainId: request.methodDetails?.chainId,
829
- currency: request.currency,
830
- externalId: request.externalId,
831
- periodCount: request.periodCount,
832
- periodUnit: request.periodUnit,
833
- recipient: request.recipient,
834
- subscriptionExpires: request.subscriptionExpires,
835
- }
836
- }
837
-
838
- function resolveRenewalHandler(parameters: {
839
- feePayer?: ReturnType<typeof Account.resolve>['feePayer'] | undefined
840
- feePayerPolicy?: Partial<FeePayer.Policy> | undefined
841
- getClient: (parameters: { chainId?: number | undefined }) => MaybePromise<ViemClient>
842
- parameters: Pick<createContext.Parameters, 'renew'>
843
- store: SubscriptionStore.SubscriptionStore
844
- subscription: SubscriptionRecord
845
- waitForConfirmation: boolean
846
- }): RenewalHandler | undefined {
847
- const {
848
- feePayer,
849
- feePayerPolicy,
850
- getClient,
851
- parameters: subscriptionParameters,
852
- store,
853
- subscription,
854
- waitForConfirmation,
855
- } = parameters
856
- if (subscriptionParameters.renew) return subscriptionParameters.renew
857
- if (!subscription.accessKey || !subscription.payer) return undefined
858
- return async ({ inFlightReference, periodIndex, subscription }) => {
859
- const reference = await submitSubscriptionPayment({
860
- accessKey: subscription.accessKey!,
861
- feePayer,
862
- feePayerPolicy,
863
- getClient,
864
- lookupKey: subscription.lookupKey,
865
- request: subscription,
866
- settlementReference: inFlightReference,
867
- source: subscription.payer!,
868
- store,
869
- waitForConfirmation,
870
- })
871
- const record = {
872
- ...subscription,
873
- lastChargedPeriod: periodIndex,
874
- reference,
875
- timestamp: new Date().toISOString(),
876
- } satisfies SubscriptionRecord
877
- return {
878
- receipt: SubscriptionReceipt.createSubscriptionReceipt(record),
879
- subscription: record,
880
- }
881
- }
882
- }
883
-
884
- async function submitSubscriptionPayment(parameters: {
885
- accessKey: SubscriptionAccessKey
886
- feePayer?: ReturnType<typeof Account.resolve>['feePayer'] | undefined
887
- feePayerPolicy?: Partial<FeePayer.Policy> | undefined
888
- getClient: (parameters: { chainId?: number | undefined }) => MaybePromise<ViemClient>
889
- keyAuthorization?: `0x${string}` | undefined
890
- lookupKey: string
891
- request: Pick<SubscriptionRequest, 'amount'> & {
892
- methodDetails?: { chainId?: number | undefined } | undefined
893
- } & { currency: Address | string; recipient: Address | string }
894
- settlementReference: string
895
- source: { address: Address; chainId: number }
896
- store: SubscriptionStore.SubscriptionStore
897
- waitForConfirmation: boolean
898
- }) {
899
- const {
900
- accessKey,
901
- feePayer,
902
- feePayerPolicy,
903
- getClient,
904
- keyAuthorization,
905
- lookupKey,
906
- request,
907
- settlementReference,
908
- source,
909
- store,
910
- waitForConfirmation,
911
- } = parameters
912
- const stored =
913
- (await store.getAccessKey(lookupKey)) ??
914
- (await store.getAccessKeyByAddress(accessKey.accessKeyAddress))
915
- if (!stored) {
916
- throw new VerificationFailedError({ reason: 'subscription access key is missing' })
917
- }
918
- const rawAccessAccount = TempoAccount.fromSecp256k1(stored.privateKey)
919
- if (!isAddressEqual(rawAccessAccount.address, accessKey.accessKeyAddress)) {
920
- throw new VerificationFailedError({
921
- reason: 'subscription access key does not match stored key',
922
- })
923
- }
924
-
925
- const chainId = request.methodDetails?.chainId ?? source.chainId
926
- const client = await getClient({ chainId })
927
- const account = TempoAccount.fromSecp256k1(stored.privateKey, {
928
- access: source.address,
929
- })
930
- const memo = Attribution.encode({
931
- challengeId: settlementReference,
932
- serverId: lookupKey,
933
- })
934
- const baseTransaction = {
935
- account,
936
- calls: [
937
- {
938
- data: encodeFunctionData({
939
- abi: Abis.tip20,
940
- functionName: 'transferWithMemo',
941
- args: [request.recipient as Address, BigInt(request.amount), memo],
942
- }),
943
- to: request.currency as Address,
944
- },
945
- ],
946
- chainId,
947
- ...(keyAuthorization
948
- ? { keyAuthorization: KeyAuthorization.deserialize(keyAuthorization) }
949
- : {}),
950
- }
951
- const serializedTransaction = await (async () => {
952
- if (!feePayer) return await signTransaction(client, baseTransaction as never)
953
- // For sponsored payments, prepare the tx via `prepareTransactionRequest`
954
- // (without `feePayer: true`) so viem returns the chain's full
955
- // proof-inclusive gas estimate. With `feePayer: true` viem sets a
956
- // dummy sig + null feePayerSignature, dropping signature and key
957
- // authorization verification costs -- see chainConfig.js FIXME. We add
958
- // a small buffer for fee-payer overhead, then flip `feePayer = true`
959
- // and re-sign with the fee-payer-sponsored envelope.
960
- const prepared = await prepareTransactionRequest(client, {
961
- ...baseTransaction,
962
- nonceKey: 'expiring',
963
- } as never)
964
- prepared.gas = (prepared.gas ?? 0n) + 5_000n
965
- ;(prepared as Record<string, unknown>).feePayer = true
966
- const userSerialized = await signTransaction(client, prepared as never)
967
- const userTransaction = Transaction.deserialize(
968
- userSerialized as Transaction.TransactionSerializedTempo,
969
- )
970
- const completed = await FeePayer.preflightSponsorship({
971
- transaction: userTransaction,
972
- simulate: (request) => viem_call(client, request as never),
973
- async complete() {
974
- const sponsored = FeePayer.prepareSponsoredTransaction({
975
- account: feePayer,
976
- chainId: chainId ?? client.chain!.id,
977
- details: {
978
- amount: String(request.amount),
979
- currency: String(request.currency),
980
- recipient: String(request.recipient),
981
- },
982
- ...(feePayerPolicy ? { policy: feePayerPolicy } : {}),
983
- transaction: userTransaction as never,
984
- })
985
- return { feePayer: feePayer.address, transaction: sponsored }
986
- },
987
- })
988
- return await signTransaction(client, completed.transaction as never)
989
- })()
990
- const transaction = Transaction.deserialize(
991
- serializedTransaction as Transaction.TransactionSerializedTempo,
992
- )
993
- if (!feePayer)
994
- await viem_call(client, {
995
- ...transaction,
996
- account: transaction.from,
997
- calls: transaction.calls,
998
- feePayerSignature: undefined,
999
- } as never)
1000
-
1001
- if (!waitForConfirmation) {
1002
- // Optimistic mode has no receipt to inspect, so it cannot detect a T6
1003
- // (TIP-1028) held transfer. Use `waitForConfirmation: true` for T6-safe proof.
1004
- return sendRawTransaction(client, {
1005
- serializedTransaction: serializedTransaction as Transaction.TransactionSerializedTempo,
1006
- })
1007
- }
1008
-
1009
- const receipt = await sendRawTransactionSync(client, {
1010
- serializedTransaction: serializedTransaction as Transaction.TransactionSerializedTempo,
1011
- })
1012
- if (receipt.status !== 'success') {
1013
- throw new VerificationFailedError({
1014
- reason: `subscription transaction reverted: ${receipt.transactionHash}`,
1015
- })
1016
- }
1017
- assertSubscriptionTransfer(receipt, {
1018
- amount: BigInt(request.amount),
1019
- currency: request.currency as Address,
1020
- memo,
1021
- recipient: request.recipient as Address,
1022
- })
1023
- return receipt.transactionHash
1024
- }
1025
-
1026
- /**
1027
- * Asserts a confirmed subscription payment credited the recipient.
1028
- *
1029
- * Transaction success alone is not proof: under Tempo T6 (TIP-1028) a recipient
1030
- * receive policy can hold the funds in `ReceivePolicyGuard` while the tx still
1031
- * succeeds. Settlement always emits one `transferWithMemo(recipient, amount,
1032
- * memo)`, so this requires a matching `TransferWithMemo` log on the expected
1033
- * token. A held transfer fails because its `to` is the guard, and the memo
1034
- * binding excludes unrelated transfer effects in the same receipt.
1035
- */
1036
- function assertSubscriptionTransfer(
1037
- receipt: TransactionReceipt,
1038
- parameters: { amount: bigint; currency: Address; memo: `0x${string}`; recipient: Address },
1039
- ): void {
1040
- const { amount, currency, memo, recipient } = parameters
1041
- const credited = parseEventLogs({
1042
- abi: Abis.tip20,
1043
- eventName: 'TransferWithMemo',
1044
- logs: receipt.logs,
1045
- }).some(
1046
- (log) =>
1047
- isAddressEqual(log.address, currency) &&
1048
- isAddressEqual(log.args.to, recipient) &&
1049
- log.args.amount === amount &&
1050
- log.args.memo.toLowerCase() === memo.toLowerCase(),
1051
- )
1052
- if (!credited) {
1053
- throw new VerificationFailedError({
1054
- reason:
1055
- `subscription transfer was not credited to the recipient ` +
1056
- `(funds may have been held by a receive policy): ${receipt.transactionHash}`,
1057
- })
1058
- }
1059
- }
1060
-
1061
- function createSubscriptionId() {
1062
- const bytes = new Uint8Array(18)
1063
- globalThis.crypto.getRandomValues(bytes)
1064
- return Base64.fromBytes(bytes, { url: true }).replace(/=+$/, '')
1065
- }
1066
-
1067
- /**
1068
- * Renews an overdue subscription outside of the HTTP request path.
1069
- * Intended for cron jobs or background workers that bill subscriptions on a schedule.
1070
- *
1071
- * Returns the renewal result if the subscription was overdue, or `null` if already current.
1072
- */
1073
- export async function renew(parameters: renew.Parameters): Promise<renew.Result | null> {
1074
- const context = createContext(parameters, {
1075
- store: parameters.store,
1076
- options: {
1077
- renewalTimeoutMs: parameters.renewalTimeoutMs,
1078
- },
1079
- })
1080
-
1081
- return renewWithContext({
1082
- context,
1083
- subscriptionId: parameters.subscriptionId,
1084
- })
1085
- }
1086
-
1087
- async function renewWithContext(parameters: {
1088
- context: createContext.Return
1089
- subscriptionId: string
1090
- }): Promise<renew.Result | null> {
1091
- const { context, subscriptionId } = parameters
1092
- const record = await context.store.get(subscriptionId)
1093
- if (!record) return null
1094
- if (!isActive(record)) return null
1095
- const active = await context.store.getByKey(record.lookupKey)
1096
- if (active?.subscriptionId !== record.subscriptionId) return null
1097
-
1098
- const periodIndex = getPeriodIndex(record)
1099
- if (periodIndex <= record.lastChargedPeriod) return null
1100
-
1101
- const renew = resolveRenewalHandler({
1102
- feePayer: context.feePayer,
1103
- feePayerPolicy: context.feePayerPolicy,
1104
- getClient: context.getClient,
1105
- parameters: context.parameters,
1106
- store: context.store,
1107
- subscription: record,
1108
- waitForConfirmation: context.waitForConfirmation,
1109
- })
1110
- if (!renew) return null
1111
-
1112
- const renewal = await settleRenewal({
1113
- expectedLookupKey: record.lookupKey,
1114
- periodIndex,
1115
- renew,
1116
- store: context.store,
1117
- subscription: record,
1118
- })
1119
- if (renewal?.status !== 'renewed') return null
1120
-
1121
- await context.parameters.hooks?.renewed?.({
1122
- periodIndex,
1123
- receipt: renewal.result.receipt,
1124
- subscription: renewal.result.subscription,
1125
- })
1126
- return renewal.result
1127
- }
1128
-
1129
- export declare namespace renew {
1130
- /** Parameters for renewing an overdue subscription outside the request path. */
1131
- type Parameters = Account.resolve.Parameters &
1132
- Client.getResolver.Parameters & {
1133
- /** The subscription to renew. */
1134
- subscriptionId: string
1135
- /** Billing callback -- same signature as the `renew` hook on {@link subscription}. */
1136
- renew?: subscription.Parameters['renew']
1137
- /** Store containing subscription records. */
1138
- store: Store.AtomicStore<Record<string, unknown>>
1139
- /**
1140
- * Milliseconds before an in-flight renewal lock can be replaced.
1141
- * Keeps concurrent renewal safe while allowing recovery from abandoned attempts.
1142
- */
1143
- renewalTimeoutMs?: number | undefined
1144
- /**
1145
- * Override the fee-payer policy for sponsored subscription payments.
1146
- * Useful when the access key renewal tx requires more gas than the default policy allows.
1147
- */
1148
- feePayerPolicy?: Partial<FeePayer.Policy> | undefined
1149
- waitForConfirmation?: boolean | undefined
1150
- }
1151
-
1152
- /** Renewal result returned by {@link renew}. */
1153
- type Result = subscription.RenewalResult
1154
- }
1155
-
1156
- export declare namespace subscription {
1157
- /** Request-scoped lookup key used to find the active subscription. */
1158
- type ResolvedSubscription = SubscriptionLookup
1159
-
1160
- /** Activation result returned after the initial credential is verified. */
1161
- type ActivationResult = {
1162
- receipt: SubscriptionReceiptValue
1163
- subscription: SubscriptionRecord
1164
- }
1165
-
1166
- /** Renewal result returned when an overdue subscription is charged. */
1167
- type RenewalResult = {
1168
- receipt: SubscriptionReceiptValue
1169
- subscription: SubscriptionRecord
1170
- }
1171
-
1172
- /** Parameters for renewing through a configured `mppx.tempo.subscription` handler. */
1173
- type RenewParameters = {
1174
- /** The subscription to renew. */
1175
- subscriptionId: string
1176
- /**
1177
- * Override the fee-payer policy for sponsored subscription payments.
1178
- * Useful when the access key renewal tx requires more gas than the default policy allows.
1179
- */
1180
- feePayerPolicy?: Partial<FeePayer.Policy> | undefined
1181
- waitForConfirmation?: boolean | undefined
1182
- }
1183
-
1184
- /** Handler extensions attached to `mppx.tempo.subscription`. */
1185
- type Extensions = {
1186
- renew: (parameters: RenewParameters) => Promise<renew.Result | null>
1187
- }
1188
-
1189
- /** Request defaults supported by the subscription method. */
1190
- type Defaults = LooseOmit<
1191
- Method.RequestDefaults<typeof Methods.subscription>,
1192
- 'accessKey' | 'recipient'
1193
- >
1194
-
1195
- /** Parameters for configuring a Tempo subscription method. */
1196
- type Parameters = Account.resolve.Parameters &
1197
- Client.getResolver.Parameters & {
1198
- accessKey?:
1199
- | ((parameters: {
1200
- input: Request
1201
- request: SubscriptionRequest
1202
- resolved: ResolvedSubscription
1203
- }) => MaybePromise<SubscriptionAccessKey>)
1204
- | undefined
1205
- /**
1206
- * Milliseconds before an in-flight activation lock can be replaced.
1207
- * Keeps concurrent activation safe while allowing recovery from abandoned attempts.
1208
- */
1209
- activationTimeoutMs?: number | undefined
1210
- /**
1211
- * Milliseconds before an in-flight renewal lock can be replaced.
1212
- * Keeps concurrent renewal safe while allowing recovery from abandoned attempts.
1213
- */
1214
- renewalTimeoutMs?: number | undefined
1215
- /**
1216
- * Requires a fresh subscription Credential even when a subscription is active.
1217
- * This binds access reuse to the stored payer instead of trusting request metadata alone.
1218
- */
1219
- requireCredential?: boolean | undefined
1220
- /**
1221
- * Override the fee-payer policy for sponsored subscription payments.
1222
- * Useful when the access key + key authorization tx requires more gas
1223
- * than the default policy allows.
1224
- */
1225
- feePayerPolicy?: Partial<FeePayer.Policy> | undefined
1226
- activate?:
1227
- | ((parameters: {
1228
- /** Custom activation must verify this access key matches the resolved subscription. */
1229
- accessKey: SubscriptionAccessKey
1230
- credential: {
1231
- payload: SubscriptionCredentialPayload
1232
- source?: string | undefined
1233
- }
1234
- input: Request
1235
- request: SubscriptionRequest
1236
- resolved: ResolvedSubscription
1237
- source: { address: Address; chainId: number } | null
1238
- }) => Promise<ActivationResult>)
1239
- | undefined
1240
- hooks?:
1241
- | {
1242
- activated?:
1243
- | ((parameters: {
1244
- receipt: SubscriptionReceiptValue
1245
- subscription: SubscriptionRecord
1246
- }) => MaybePromise<void>)
1247
- | undefined
1248
- renewed?:
1249
- | ((parameters: {
1250
- periodIndex: number
1251
- receipt: SubscriptionReceiptValue
1252
- subscription: SubscriptionRecord
1253
- }) => MaybePromise<void>)
1254
- | undefined
1255
- }
1256
- | undefined
1257
- periodCount?: Methods.SubscriptionPeriodCountInput | undefined
1258
- periodUnit?: SubscriptionPeriodUnit | undefined
1259
- /**
1260
- * Resolves the request identity. This callback must authenticate and
1261
- * authorize the caller before returning a key; automatic mode may create
1262
- * a server-owned access key for that key while issuing a challenge.
1263
- */
1264
- resolve: (parameters: {
1265
- input: Request
1266
- request: SubscriptionRequest
1267
- /** Verified payer identity recovered from a signed subscription credential. */
1268
- source?: { address: Address; chainId: number } | undefined
1269
- }) => MaybePromise<ResolvedSubscription | null>
1270
- renew?: (parameters: {
1271
- /** Stable idempotency/reconciliation reference persisted before the renewal hook runs. */
1272
- inFlightReference: string
1273
- periodIndex: number
1274
- /** Custom renewal hooks must preserve amount, currency, recipient, period, expiry, and lookup key. */
1275
- subscription: SubscriptionRecord
1276
- }) => Promise<RenewalResult>
1277
- store?: Store.AtomicStore<Record<string, unknown>> | undefined
1278
- /**
1279
- * Prefix prepended to all subscription store keys.
1280
- *
1281
- * By default, no prefix is applied.
1282
- */
1283
- storeKeyPrefix?: string | undefined
1284
- testnet?: boolean | undefined
1285
- waitForConfirmation?: boolean | undefined
1286
- } & Defaults &
1287
- Method.ComposableHooks<typeof Methods.subscription>
1288
-
1289
- /** Derived defaults after account and chain configuration are applied. */
1290
- type DeriveDefaults<parameters extends Parameters> = types.DeriveDefaults<
1291
- parameters,
1292
- Defaults,
1293
- {
1294
- currency: string
1295
- decimals: number
1296
- }
1297
- >
1298
- }
1299
-
1300
- function createContext<const parameters extends createContext.Parameters>(
1301
- parameters: parameters,
1302
- options: createContext.Options,
1303
- ) {
1304
- const { feePayer } = Account.resolve(parameters)
1305
- const store = SubscriptionStore.fromStore(options.store, options.options)
1306
- const getClient = ClientResolver.getResolver({
1307
- chain: tempo_chain,
1308
- getClient: parameters.getClient,
1309
- rpcUrl: defaults.rpcUrl,
1310
- })
1311
- return {
1312
- feePayer,
1313
- feePayerPolicy: resolveFeePayerPolicy(parameters.feePayerPolicy),
1314
- getClient,
1315
- parameters,
1316
- store,
1317
- waitForConfirmation: parameters.waitForConfirmation ?? true,
1318
- }
1319
- }
1320
-
1321
- declare namespace createContext {
1322
- type Parameters = Account.resolve.Parameters &
1323
- Client.getResolver.Parameters & {
1324
- feePayerPolicy?: Partial<FeePayer.Policy> | undefined
1325
- hooks?: subscription.Parameters['hooks']
1326
- renew?: subscription.Parameters['renew']
1327
- waitForConfirmation?: boolean | undefined
1328
- }
1329
-
1330
- type Options = {
1331
- store: Store.AtomicStore<Record<string, unknown>>
1332
- options?: SubscriptionStore.fromStore.Options | undefined
1333
- }
1334
-
1335
- type Return = ReturnType<typeof createContext>
1336
- }