mppx 0.6.31 → 0.8.0

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 (616) hide show
  1. package/CHANGELOG.md +50 -0
  2. package/README.md +20 -11
  3. package/dist/Challenge.d.ts.map +1 -1
  4. package/dist/Challenge.js +27 -13
  5. package/dist/Challenge.js.map +1 -1
  6. package/dist/Constants.d.ts +46 -0
  7. package/dist/Constants.d.ts.map +1 -0
  8. package/dist/Constants.js +46 -0
  9. package/dist/Constants.js.map +1 -0
  10. package/dist/Credential.d.ts.map +1 -1
  11. package/dist/Credential.js +5 -4
  12. package/dist/Credential.js.map +1 -1
  13. package/dist/Mcp.d.ts +3 -0
  14. package/dist/Mcp.d.ts.map +1 -1
  15. package/dist/Mcp.js +2 -0
  16. package/dist/Mcp.js.map +1 -1
  17. package/dist/Method.d.ts +32 -4
  18. package/dist/Method.d.ts.map +1 -1
  19. package/dist/Method.js +5 -2
  20. package/dist/Method.js.map +1 -1
  21. package/dist/PaymentRequest.d.ts +10 -10
  22. package/dist/PaymentRequest.js +8 -8
  23. package/dist/Receipt.d.ts.map +1 -1
  24. package/dist/Receipt.js +3 -2
  25. package/dist/Receipt.js.map +1 -1
  26. package/dist/cli/cli.d.ts.map +1 -1
  27. package/dist/cli/cli.js +19 -11
  28. package/dist/cli/cli.js.map +1 -1
  29. package/dist/cli/plugins/tempo.d.ts.map +1 -1
  30. package/dist/cli/plugins/tempo.js +17 -6
  31. package/dist/cli/plugins/tempo.js.map +1 -1
  32. package/dist/cli/utils.d.ts +5 -0
  33. package/dist/cli/utils.d.ts.map +1 -1
  34. package/dist/cli/utils.js +10 -0
  35. package/dist/cli/utils.js.map +1 -1
  36. package/dist/client/Methods.d.ts +5 -2
  37. package/dist/client/Methods.d.ts.map +1 -1
  38. package/dist/client/Methods.js +5 -2
  39. package/dist/client/Methods.js.map +1 -1
  40. package/dist/client/Mppx.js +2 -2
  41. package/dist/client/Mppx.js.map +1 -1
  42. package/dist/client/Transport.d.ts +11 -16
  43. package/dist/client/Transport.d.ts.map +1 -1
  44. package/dist/client/Transport.js +55 -76
  45. package/dist/client/Transport.js.map +1 -1
  46. package/dist/client/index.d.ts +5 -1
  47. package/dist/client/index.d.ts.map +1 -1
  48. package/dist/client/index.js +3 -1
  49. package/dist/client/index.js.map +1 -1
  50. package/dist/client/internal/Fetch.d.ts.map +1 -1
  51. package/dist/client/internal/Fetch.js +60 -13
  52. package/dist/client/internal/Fetch.js.map +1 -1
  53. package/dist/client/internal/protocols/Mcp.d.ts +7 -0
  54. package/dist/client/internal/protocols/Mcp.d.ts.map +1 -0
  55. package/dist/client/internal/protocols/Mcp.js +159 -0
  56. package/dist/client/internal/protocols/Mcp.js.map +1 -0
  57. package/dist/client/internal/protocols/Mpp.d.ts +4 -0
  58. package/dist/client/internal/protocols/Mpp.d.ts.map +1 -0
  59. package/dist/client/internal/protocols/Mpp.js +18 -0
  60. package/dist/client/internal/protocols/Mpp.js.map +1 -0
  61. package/dist/client/internal/protocols/Protocol.d.ts +10 -0
  62. package/dist/client/internal/protocols/Protocol.d.ts.map +1 -0
  63. package/dist/client/internal/protocols/Protocol.js +2 -0
  64. package/dist/client/internal/protocols/Protocol.js.map +1 -0
  65. package/dist/client/internal/protocols/Shared.d.ts +5 -0
  66. package/dist/client/internal/protocols/Shared.d.ts.map +1 -0
  67. package/dist/client/internal/protocols/Shared.js +20 -0
  68. package/dist/client/internal/protocols/Shared.js.map +1 -0
  69. package/dist/client/internal/protocols/X402.d.ts +8 -0
  70. package/dist/client/internal/protocols/X402.d.ts.map +1 -0
  71. package/dist/client/internal/protocols/X402.js +39 -0
  72. package/dist/client/internal/protocols/X402.js.map +1 -0
  73. package/dist/evm/client/index.d.ts +1 -0
  74. package/dist/evm/client/index.d.ts.map +1 -1
  75. package/dist/evm/client/index.js +1 -0
  76. package/dist/evm/client/index.js.map +1 -1
  77. package/dist/evm/index.d.ts +2 -0
  78. package/dist/evm/index.d.ts.map +1 -1
  79. package/dist/evm/index.js +2 -0
  80. package/dist/evm/index.js.map +1 -1
  81. package/dist/evm/server/Methods.d.ts +1 -1
  82. package/dist/evm/server/Methods.d.ts.map +1 -1
  83. package/dist/evm/server/index.d.ts +1 -0
  84. package/dist/evm/server/index.d.ts.map +1 -1
  85. package/dist/evm/server/index.js +1 -0
  86. package/dist/evm/server/index.js.map +1 -1
  87. package/dist/index.d.ts +1 -0
  88. package/dist/index.d.ts.map +1 -1
  89. package/dist/index.js +1 -0
  90. package/dist/index.js.map +1 -1
  91. package/dist/internal/AcceptPayment.d.ts +3 -0
  92. package/dist/internal/AcceptPayment.d.ts.map +1 -1
  93. package/dist/internal/AcceptPayment.js +15 -11
  94. package/dist/internal/AcceptPayment.js.map +1 -1
  95. package/dist/mcp/client/McpClient.d.ts +101 -0
  96. package/dist/mcp/client/McpClient.d.ts.map +1 -0
  97. package/dist/mcp/client/McpClient.js +162 -0
  98. package/dist/mcp/client/McpClient.js.map +1 -0
  99. package/dist/mcp/client/index.d.ts.map +1 -0
  100. package/dist/mcp/client/index.js.map +1 -0
  101. package/dist/mcp/server/Transport.d.ts.map +1 -0
  102. package/dist/mcp/server/Transport.js.map +1 -0
  103. package/dist/mcp/server/index.d.ts.map +1 -0
  104. package/dist/mcp/server/index.js.map +1 -0
  105. package/dist/server/Mppx.d.ts +12 -4
  106. package/dist/server/Mppx.d.ts.map +1 -1
  107. package/dist/server/Mppx.js +85 -27
  108. package/dist/server/Mppx.js.map +1 -1
  109. package/dist/server/Response.d.ts.map +1 -1
  110. package/dist/server/Response.js +2 -1
  111. package/dist/server/Response.js.map +1 -1
  112. package/dist/server/Transport.d.ts +1 -1
  113. package/dist/server/Transport.d.ts.map +1 -1
  114. package/dist/server/Transport.js +5 -4
  115. package/dist/server/Transport.js.map +1 -1
  116. package/dist/server/index.d.ts +1 -0
  117. package/dist/server/index.d.ts.map +1 -1
  118. package/dist/server/index.js +1 -0
  119. package/dist/server/index.js.map +1 -1
  120. package/dist/stripe/client/Charge.d.ts +1 -1
  121. package/dist/stripe/client/Charge.d.ts.map +1 -1
  122. package/dist/stripe/client/Charge.js +3 -1
  123. package/dist/stripe/client/Charge.js.map +1 -1
  124. package/dist/stripe/server/Charge.d.ts +1 -1
  125. package/dist/stripe/server/Charge.d.ts.map +1 -1
  126. package/dist/stripe/server/Charge.js +9 -2
  127. package/dist/stripe/server/Charge.js.map +1 -1
  128. package/dist/stripe/server/Methods.d.ts +1 -1
  129. package/dist/stripe/server/Methods.d.ts.map +1 -1
  130. package/dist/stripe/server/internal/html.gen.d.ts +1 -1
  131. package/dist/stripe/server/internal/html.gen.d.ts.map +1 -1
  132. package/dist/stripe/server/internal/html.gen.js +1 -1
  133. package/dist/stripe/server/internal/html.gen.js.map +1 -1
  134. package/dist/tempo/Methods.d.ts +18 -0
  135. package/dist/tempo/Methods.d.ts.map +1 -1
  136. package/dist/tempo/Methods.js +16 -1
  137. package/dist/tempo/Methods.js.map +1 -1
  138. package/dist/tempo/Proof.d.ts +85 -1
  139. package/dist/tempo/Proof.d.ts.map +1 -1
  140. package/dist/tempo/Proof.js +35 -0
  141. package/dist/tempo/Proof.js.map +1 -1
  142. package/dist/tempo/client/Charge.d.ts +19 -1
  143. package/dist/tempo/client/Charge.d.ts.map +1 -1
  144. package/dist/tempo/client/Charge.js +47 -27
  145. package/dist/tempo/client/Charge.js.map +1 -1
  146. package/dist/tempo/client/Methods.d.ts +41 -10
  147. package/dist/tempo/client/Methods.d.ts.map +1 -1
  148. package/dist/tempo/client/Methods.js +16 -7
  149. package/dist/tempo/client/Methods.js.map +1 -1
  150. package/dist/tempo/client/ResolveAccount.d.ts +40 -0
  151. package/dist/tempo/client/ResolveAccount.d.ts.map +1 -0
  152. package/dist/tempo/client/ResolveAccount.js +2 -0
  153. package/dist/tempo/client/ResolveAccount.js.map +1 -0
  154. package/dist/tempo/client/index.d.ts +7 -4
  155. package/dist/tempo/client/index.d.ts.map +1 -1
  156. package/dist/tempo/client/index.js +5 -3
  157. package/dist/tempo/client/index.js.map +1 -1
  158. package/dist/tempo/index.d.ts +1 -0
  159. package/dist/tempo/index.d.ts.map +1 -1
  160. package/dist/tempo/index.js +1 -0
  161. package/dist/tempo/index.js.map +1 -1
  162. package/dist/tempo/internal/fee-payer.d.ts +29 -1
  163. package/dist/tempo/internal/fee-payer.d.ts.map +1 -1
  164. package/dist/tempo/internal/fee-payer.js +138 -4
  165. package/dist/tempo/internal/fee-payer.js.map +1 -1
  166. package/dist/tempo/internal/proof.d.ts +71 -5
  167. package/dist/tempo/internal/proof.d.ts.map +1 -1
  168. package/dist/tempo/internal/proof.js +42 -6
  169. package/dist/tempo/internal/proof.js.map +1 -1
  170. package/dist/tempo/{client → legacy/client}/ChannelOps.d.ts +19 -6
  171. package/dist/tempo/legacy/client/ChannelOps.d.ts.map +1 -0
  172. package/dist/tempo/{client → legacy/client}/ChannelOps.js +9 -3
  173. package/dist/tempo/legacy/client/ChannelOps.js.map +1 -0
  174. package/dist/tempo/{client → legacy/client}/Session.d.ts +23 -4
  175. package/dist/tempo/legacy/client/Session.d.ts.map +1 -0
  176. package/dist/tempo/{client → legacy/client}/Session.js +14 -7
  177. package/dist/tempo/legacy/client/Session.js.map +1 -0
  178. package/dist/tempo/{client → legacy/client}/SessionManager.d.ts +20 -5
  179. package/dist/tempo/legacy/client/SessionManager.d.ts.map +1 -0
  180. package/dist/tempo/{client → legacy/client}/SessionManager.js +30 -19
  181. package/dist/tempo/legacy/client/SessionManager.js.map +1 -0
  182. package/dist/tempo/legacy/client/index.d.ts +7 -0
  183. package/dist/tempo/legacy/client/index.d.ts.map +1 -0
  184. package/dist/tempo/legacy/client/index.js +5 -0
  185. package/dist/tempo/legacy/client/index.js.map +1 -0
  186. package/dist/tempo/legacy/index.d.ts +7 -0
  187. package/dist/tempo/legacy/index.d.ts.map +1 -0
  188. package/dist/tempo/legacy/index.js +7 -0
  189. package/dist/tempo/legacy/index.js.map +1 -0
  190. package/dist/tempo/{server → legacy/server}/Session.d.ts +28 -11
  191. package/dist/tempo/legacy/server/Session.d.ts.map +1 -0
  192. package/dist/tempo/{server → legacy/server}/Session.js +12 -10
  193. package/dist/tempo/legacy/server/Session.js.map +1 -0
  194. package/dist/tempo/legacy/server/index.d.ts +5 -0
  195. package/dist/tempo/legacy/server/index.d.ts.map +1 -0
  196. package/dist/tempo/legacy/server/index.js +5 -0
  197. package/dist/tempo/legacy/server/index.js.map +1 -0
  198. package/dist/tempo/{session → legacy/session}/Chain.d.ts +30 -23
  199. package/dist/tempo/legacy/session/Chain.d.ts.map +1 -0
  200. package/dist/tempo/{session → legacy/session}/Chain.js +12 -11
  201. package/dist/tempo/legacy/session/Chain.js.map +1 -0
  202. package/dist/tempo/{session → legacy/session}/Channel.d.ts +1 -0
  203. package/dist/tempo/legacy/session/Channel.d.ts.map +1 -0
  204. package/dist/tempo/legacy/session/Channel.js.map +1 -0
  205. package/dist/tempo/legacy/session/ChannelStore.d.ts +22 -0
  206. package/dist/tempo/legacy/session/ChannelStore.d.ts.map +1 -0
  207. package/dist/tempo/legacy/session/ChannelStore.js +6 -0
  208. package/dist/tempo/legacy/session/ChannelStore.js.map +1 -0
  209. package/dist/tempo/legacy/session/Types.d.ts +73 -0
  210. package/dist/tempo/legacy/session/Types.d.ts.map +1 -0
  211. package/dist/tempo/legacy/session/Types.js.map +1 -0
  212. package/dist/tempo/{session → legacy/session}/Voucher.d.ts +4 -4
  213. package/dist/tempo/legacy/session/Voucher.d.ts.map +1 -0
  214. package/dist/tempo/{session → legacy/session}/Voucher.js +1 -1
  215. package/dist/tempo/legacy/session/Voucher.js.map +1 -0
  216. package/dist/tempo/{session → legacy/session}/escrow.abi.d.ts +1 -0
  217. package/dist/tempo/{session → legacy/session}/escrow.abi.d.ts.map +1 -1
  218. package/dist/tempo/{session → legacy/session}/escrow.abi.js +1 -0
  219. package/dist/tempo/legacy/session/escrow.abi.js.map +1 -0
  220. package/dist/tempo/legacy/session/index.d.ts +9 -0
  221. package/dist/tempo/legacy/session/index.d.ts.map +1 -0
  222. package/dist/tempo/legacy/session/index.js +9 -0
  223. package/dist/tempo/legacy/session/index.js.map +1 -0
  224. package/dist/tempo/server/Charge.d.ts +1 -1
  225. package/dist/tempo/server/Charge.d.ts.map +1 -1
  226. package/dist/tempo/server/Charge.js +51 -30
  227. package/dist/tempo/server/Charge.js.map +1 -1
  228. package/dist/tempo/server/Methods.d.ts +67 -8
  229. package/dist/tempo/server/Methods.d.ts.map +1 -1
  230. package/dist/tempo/server/Methods.js +40 -10
  231. package/dist/tempo/server/Methods.js.map +1 -1
  232. package/dist/tempo/server/Subscription.d.ts +11 -1
  233. package/dist/tempo/server/Subscription.d.ts.map +1 -1
  234. package/dist/tempo/server/Subscription.js +135 -23
  235. package/dist/tempo/server/Subscription.js.map +1 -1
  236. package/dist/tempo/server/index.d.ts +6 -5
  237. package/dist/tempo/server/index.d.ts.map +1 -1
  238. package/dist/tempo/server/index.js +5 -5
  239. package/dist/tempo/server/index.js.map +1 -1
  240. package/dist/tempo/server/internal/html.gen.d.ts +1 -1
  241. package/dist/tempo/server/internal/html.gen.d.ts.map +1 -1
  242. package/dist/tempo/server/internal/html.gen.js +1 -1
  243. package/dist/tempo/server/internal/html.gen.js.map +1 -1
  244. package/dist/tempo/server/internal/request-body.d.ts +7 -2
  245. package/dist/tempo/server/internal/request-body.d.ts.map +1 -1
  246. package/dist/tempo/server/internal/request-body.js +20 -3
  247. package/dist/tempo/server/internal/request-body.js.map +1 -1
  248. package/dist/tempo/server/internal/transport.d.ts +8 -4
  249. package/dist/tempo/server/internal/transport.d.ts.map +1 -1
  250. package/dist/tempo/server/internal/transport.js +8 -7
  251. package/dist/tempo/server/internal/transport.js.map +1 -1
  252. package/dist/tempo/session/Snapshot.d.ts +32 -0
  253. package/dist/tempo/session/Snapshot.d.ts.map +1 -0
  254. package/dist/tempo/session/Snapshot.js +37 -0
  255. package/dist/tempo/session/Snapshot.js.map +1 -0
  256. package/dist/tempo/session/client/ChannelOps.d.ts +81 -0
  257. package/dist/tempo/session/client/ChannelOps.d.ts.map +1 -0
  258. package/dist/tempo/session/client/ChannelOps.js +201 -0
  259. package/dist/tempo/session/client/ChannelOps.js.map +1 -0
  260. package/dist/tempo/session/client/ChannelStore.d.ts +51 -0
  261. package/dist/tempo/session/client/ChannelStore.d.ts.map +1 -0
  262. package/dist/tempo/session/client/ChannelStore.js +63 -0
  263. package/dist/tempo/session/client/ChannelStore.js.map +1 -0
  264. package/dist/tempo/session/client/CredentialState.d.ts +245 -0
  265. package/dist/tempo/session/client/CredentialState.d.ts.map +1 -0
  266. package/dist/tempo/session/client/CredentialState.js +419 -0
  267. package/dist/tempo/session/client/CredentialState.js.map +1 -0
  268. package/dist/tempo/session/client/ReceiptCoordinator.d.ts +26 -0
  269. package/dist/tempo/session/client/ReceiptCoordinator.d.ts.map +1 -0
  270. package/dist/tempo/session/client/ReceiptCoordinator.js +61 -0
  271. package/dist/tempo/session/client/ReceiptCoordinator.js.map +1 -0
  272. package/dist/tempo/session/client/Runtime.d.ts +464 -0
  273. package/dist/tempo/session/client/Runtime.d.ts.map +1 -0
  274. package/dist/tempo/session/client/Runtime.js +499 -0
  275. package/dist/tempo/session/client/Runtime.js.map +1 -0
  276. package/dist/tempo/session/client/Session.d.ts +138 -0
  277. package/dist/tempo/session/client/Session.d.ts.map +1 -0
  278. package/dist/tempo/session/client/Session.js +69 -0
  279. package/dist/tempo/session/client/Session.js.map +1 -0
  280. package/dist/tempo/session/client/SessionManager.d.ts +84 -0
  281. package/dist/tempo/session/client/SessionManager.d.ts.map +1 -0
  282. package/dist/tempo/session/client/SessionManager.js +577 -0
  283. package/dist/tempo/session/client/SessionManager.js.map +1 -0
  284. package/dist/tempo/session/client/Transports.d.ts +449 -0
  285. package/dist/tempo/session/client/Transports.d.ts.map +1 -0
  286. package/dist/tempo/session/client/Transports.js +721 -0
  287. package/dist/tempo/session/client/Transports.js.map +1 -0
  288. package/dist/tempo/session/client/index.d.ts +11 -0
  289. package/dist/tempo/session/client/index.d.ts.map +1 -0
  290. package/dist/tempo/session/client/index.js +6 -0
  291. package/dist/tempo/session/client/index.js.map +1 -0
  292. package/dist/tempo/session/index.d.ts +7 -8
  293. package/dist/tempo/session/index.d.ts.map +1 -1
  294. package/dist/tempo/session/index.js +7 -8
  295. package/dist/tempo/session/index.js.map +1 -1
  296. package/dist/tempo/session/precompile/Chain.d.ts +319 -0
  297. package/dist/tempo/session/precompile/Chain.d.ts.map +1 -0
  298. package/dist/tempo/session/precompile/Chain.js +492 -0
  299. package/dist/tempo/session/precompile/Chain.js.map +1 -0
  300. package/dist/tempo/session/precompile/Channel.d.ts +46 -0
  301. package/dist/tempo/session/precompile/Channel.d.ts.map +1 -0
  302. package/dist/tempo/session/precompile/Channel.js +56 -0
  303. package/dist/tempo/session/precompile/Channel.js.map +1 -0
  304. package/dist/tempo/session/precompile/Protocol.d.ts +308 -0
  305. package/dist/tempo/session/precompile/Protocol.d.ts.map +1 -0
  306. package/dist/tempo/session/precompile/Protocol.js +264 -0
  307. package/dist/tempo/session/precompile/Protocol.js.map +1 -0
  308. package/dist/tempo/session/precompile/Voucher.d.ts +40 -0
  309. package/dist/tempo/session/precompile/Voucher.d.ts.map +1 -0
  310. package/dist/tempo/session/precompile/Voucher.js +125 -0
  311. package/dist/tempo/session/precompile/Voucher.js.map +1 -0
  312. package/dist/tempo/session/precompile/escrow.abi.d.ts +522 -0
  313. package/dist/tempo/session/precompile/escrow.abi.d.ts.map +1 -0
  314. package/dist/tempo/session/precompile/escrow.abi.js +224 -0
  315. package/dist/tempo/session/precompile/escrow.abi.js.map +1 -0
  316. package/dist/tempo/session/precompile/index.d.ts +24 -0
  317. package/dist/tempo/session/precompile/index.d.ts.map +1 -0
  318. package/dist/tempo/session/precompile/index.js +22 -0
  319. package/dist/tempo/session/precompile/index.js.map +1 -0
  320. package/dist/tempo/session/server/ChannelOps.d.ts +56 -0
  321. package/dist/tempo/session/server/ChannelOps.d.ts.map +1 -0
  322. package/dist/tempo/session/server/ChannelOps.js +91 -0
  323. package/dist/tempo/session/server/ChannelOps.js.map +1 -0
  324. package/dist/tempo/session/server/ChannelStore.d.ts +347 -0
  325. package/dist/tempo/session/server/ChannelStore.d.ts.map +1 -0
  326. package/dist/tempo/session/server/ChannelStore.js +404 -0
  327. package/dist/tempo/session/server/ChannelStore.js.map +1 -0
  328. package/dist/tempo/session/server/CredentialVerification.d.ts +85 -0
  329. package/dist/tempo/session/server/CredentialVerification.d.ts.map +1 -0
  330. package/dist/tempo/session/server/CredentialVerification.js +494 -0
  331. package/dist/tempo/session/server/CredentialVerification.js.map +1 -0
  332. package/dist/tempo/session/server/MeteredStream.d.ts +40 -0
  333. package/dist/tempo/session/server/MeteredStream.d.ts.map +1 -0
  334. package/dist/tempo/session/server/MeteredStream.js +42 -0
  335. package/dist/tempo/session/server/MeteredStream.js.map +1 -0
  336. package/dist/tempo/session/server/RequestState.d.ts +208 -0
  337. package/dist/tempo/session/server/RequestState.d.ts.map +1 -0
  338. package/dist/tempo/session/server/RequestState.js +252 -0
  339. package/dist/tempo/session/server/RequestState.js.map +1 -0
  340. package/dist/tempo/session/server/Session.d.ts +169 -0
  341. package/dist/tempo/session/server/Session.d.ts.map +1 -0
  342. package/dist/tempo/session/server/Session.js +351 -0
  343. package/dist/tempo/session/server/Session.js.map +1 -0
  344. package/dist/tempo/session/server/Settlement.d.ts +185 -0
  345. package/dist/tempo/session/server/Settlement.d.ts.map +1 -0
  346. package/dist/tempo/session/server/Settlement.js +252 -0
  347. package/dist/tempo/session/server/Settlement.js.map +1 -0
  348. package/dist/tempo/session/{Sse.d.ts → server/Sse.d.ts} +9 -56
  349. package/dist/tempo/session/server/Sse.d.ts.map +1 -0
  350. package/dist/tempo/session/server/Sse.js +184 -0
  351. package/dist/tempo/session/server/Sse.js.map +1 -0
  352. package/dist/tempo/session/server/Transports.d.ts +89 -0
  353. package/dist/tempo/session/server/Transports.d.ts.map +1 -0
  354. package/dist/tempo/session/server/Transports.js +149 -0
  355. package/dist/tempo/session/server/Transports.js.map +1 -0
  356. package/dist/tempo/session/server/Ws.d.ts +48 -0
  357. package/dist/tempo/session/server/Ws.d.ts.map +1 -0
  358. package/dist/tempo/session/server/Ws.js +244 -0
  359. package/dist/tempo/session/server/Ws.js.map +1 -0
  360. package/dist/tempo/session/server/index.d.ts +4 -0
  361. package/dist/tempo/session/server/index.d.ts.map +1 -0
  362. package/dist/tempo/session/server/index.js +2 -0
  363. package/dist/tempo/session/server/index.js.map +1 -0
  364. package/dist/tempo/subscription/KeyAuthorization.d.ts +712 -1
  365. package/dist/tempo/subscription/KeyAuthorization.d.ts.map +1 -1
  366. package/dist/tempo/subscription/Store.d.ts +2 -0
  367. package/dist/tempo/subscription/Store.d.ts.map +1 -1
  368. package/dist/tempo/subscription/Store.js +16 -1
  369. package/dist/tempo/subscription/Store.js.map +1 -1
  370. package/dist/x402/index.d.ts +1 -0
  371. package/dist/x402/index.d.ts.map +1 -1
  372. package/dist/x402/index.js +1 -0
  373. package/dist/x402/index.js.map +1 -1
  374. package/package.json +25 -9
  375. package/src/Challenge.test.ts +40 -0
  376. package/src/Challenge.ts +28 -13
  377. package/src/Constants.ts +58 -0
  378. package/src/Credential.ts +5 -4
  379. package/src/Mcp.ts +4 -0
  380. package/src/Method.ts +46 -5
  381. package/src/PaymentRequest.ts +10 -10
  382. package/src/Receipt.ts +3 -2
  383. package/src/cli/cli.test.ts +38 -43
  384. package/src/cli/cli.ts +23 -10
  385. package/src/cli/mcp.test.ts +21 -7
  386. package/src/cli/plugins/tempo.ts +21 -8
  387. package/src/cli/utils.test.ts +25 -1
  388. package/src/cli/utils.ts +10 -0
  389. package/src/client/Methods.ts +5 -2
  390. package/src/client/Mppx.test-d.ts +31 -1
  391. package/src/client/Mppx.test.ts +76 -1
  392. package/src/client/Mppx.ts +2 -2
  393. package/src/client/Transport.test.ts +225 -178
  394. package/src/client/Transport.ts +77 -84
  395. package/src/client/index.ts +25 -1
  396. package/src/client/internal/Fetch.test.ts +236 -6
  397. package/src/client/internal/Fetch.ts +69 -11
  398. package/src/client/internal/protocols/Mcp.test.ts +220 -0
  399. package/src/client/internal/protocols/Mcp.ts +162 -0
  400. package/src/client/internal/protocols/Mpp.ts +21 -0
  401. package/src/client/internal/protocols/Protocol.ts +10 -0
  402. package/src/client/internal/protocols/Shared.ts +25 -0
  403. package/src/client/internal/protocols/X402.ts +42 -0
  404. package/src/discovery/OpenApi.test.ts +1 -1
  405. package/src/env.d.ts +1 -1
  406. package/src/evm/PublicInterface.test-d.ts +1 -1
  407. package/src/evm/client/index.ts +1 -0
  408. package/src/evm/index.ts +2 -0
  409. package/src/evm/server/Charge.test.ts +1 -1
  410. package/src/evm/server/index.ts +1 -0
  411. package/src/index.ts +1 -0
  412. package/src/internal/AcceptPayment.test.ts +61 -0
  413. package/src/internal/AcceptPayment.ts +21 -14
  414. package/src/{mcp-sdk → mcp}/client/McpClient.integration.test.ts +18 -11
  415. package/src/{mcp-sdk → mcp}/client/McpClient.test-d.ts +45 -11
  416. package/src/{mcp-sdk → mcp}/client/McpClient.test.ts +211 -5
  417. package/src/mcp/client/McpClient.ts +307 -0
  418. package/src/mcp/client/McpClient.unit.test.ts +135 -0
  419. package/src/middlewares/elysia.test.ts +9 -5
  420. package/src/middlewares/express.test.ts +9 -5
  421. package/src/middlewares/hono.test.ts +5 -5
  422. package/src/middlewares/internal/mppx.test.ts +1 -1
  423. package/src/middlewares/nextjs.test.ts +9 -5
  424. package/src/proxy/Proxy.test.ts +9 -9
  425. package/src/proxy/services/anthropic.test.ts +1 -1
  426. package/src/proxy/services/openai.test.ts +1 -1
  427. package/src/proxy/services/stripe.test.ts +1 -1
  428. package/src/server/Mppx.authorize.test.ts +1 -1
  429. package/src/server/Mppx.test-d.ts +55 -1
  430. package/src/server/Mppx.test.ts +220 -9
  431. package/src/server/Mppx.ts +501 -407
  432. package/src/server/Response.ts +2 -1
  433. package/src/server/Transport.test.ts +6 -6
  434. package/src/server/Transport.ts +5 -4
  435. package/src/server/index.ts +1 -0
  436. package/src/stripe/Charge.integration.test.ts +1 -1
  437. package/src/stripe/client/Charge.test.ts +21 -6
  438. package/src/stripe/client/Charge.ts +6 -2
  439. package/src/stripe/server/Charge.test.ts +115 -2
  440. package/src/stripe/server/Charge.ts +13 -2
  441. package/src/stripe/server/internal/html/package.json +1 -1
  442. package/src/stripe/server/internal/html.gen.ts +1 -1
  443. package/src/tempo/AccessKeyAuthorization.test.ts +4 -94
  444. package/src/tempo/Methods.test.ts +45 -17
  445. package/src/tempo/Methods.ts +22 -0
  446. package/src/tempo/Proof.conformance.test.ts +146 -0
  447. package/src/tempo/Proof.test-d.ts +15 -0
  448. package/src/tempo/Proof.ts +52 -1
  449. package/src/tempo/PublicExports.test-d.ts +105 -0
  450. package/src/tempo/Subscription.integration.test.ts +1 -1
  451. package/src/tempo/client/Charge.test.ts +258 -0
  452. package/src/tempo/client/Charge.ts +84 -38
  453. package/src/tempo/client/Methods.ts +22 -8
  454. package/src/tempo/client/ResolveAccount.ts +46 -0
  455. package/src/tempo/client/index.ts +15 -4
  456. package/src/tempo/index.ts +1 -0
  457. package/src/tempo/internal/fee-payer.test.ts +296 -17
  458. package/src/tempo/internal/fee-payer.ts +186 -4
  459. package/src/tempo/internal/fee-token.test.ts +14 -9
  460. package/src/tempo/internal/proof.test.ts +12 -4
  461. package/src/tempo/internal/proof.ts +55 -6
  462. package/src/tempo/legacy/AccessKeyAuthorization.test.ts +162 -0
  463. package/src/tempo/legacy/README.md +9 -0
  464. package/src/tempo/{client → legacy/client}/ChannelOps.test.ts +6 -7
  465. package/src/tempo/{client → legacy/client}/ChannelOps.ts +22 -9
  466. package/src/tempo/{client → legacy/client}/Session.test.ts +51 -9
  467. package/src/tempo/{client → legacy/client}/Session.ts +25 -11
  468. package/src/tempo/{client → legacy/client}/SessionManager.test.ts +81 -9
  469. package/src/tempo/{client → legacy/client}/SessionManager.ts +52 -23
  470. package/src/tempo/legacy/client/index.ts +6 -0
  471. package/src/tempo/legacy/index.ts +6 -0
  472. package/src/tempo/{server → legacy/server}/Session.test.ts +136 -71
  473. package/src/tempo/{server → legacy/server}/Session.ts +32 -23
  474. package/src/tempo/legacy/server/index.ts +4 -0
  475. package/src/tempo/{session → legacy/session}/Chain.test.ts +3 -4
  476. package/src/tempo/{session → legacy/session}/Chain.ts +94 -63
  477. package/src/tempo/{session → legacy/session}/Channel.ts +1 -0
  478. package/src/tempo/legacy/session/ChannelStore.test.ts +58 -0
  479. package/src/tempo/legacy/session/ChannelStore.ts +39 -0
  480. package/src/tempo/legacy/session/Types.ts +91 -0
  481. package/src/tempo/{session → legacy/session}/Voucher.ts +12 -8
  482. package/src/tempo/{session → legacy/session}/escrow.abi.ts +1 -0
  483. package/src/tempo/legacy/session/index.ts +8 -0
  484. package/src/tempo/server/AtomicStore.test-d.ts +16 -11
  485. package/src/tempo/server/Charge.test.ts +480 -31
  486. package/src/tempo/server/Charge.ts +54 -30
  487. package/src/tempo/server/Methods.ts +58 -10
  488. package/src/tempo/server/Sse.test.ts +2 -2
  489. package/src/tempo/server/Subscription.test.ts +465 -3
  490. package/src/tempo/server/Subscription.ts +174 -19
  491. package/src/tempo/server/index.ts +6 -5
  492. package/src/tempo/server/internal/html/package.json +2 -2
  493. package/src/tempo/server/internal/html.gen.ts +1 -1
  494. package/src/tempo/server/internal/request-body.test.ts +37 -4
  495. package/src/tempo/server/internal/request-body.ts +25 -6
  496. package/src/tempo/server/internal/transport.test.ts +4 -4
  497. package/src/tempo/server/internal/transport.ts +19 -10
  498. package/src/tempo/session/Snapshot.test.ts +41 -0
  499. package/src/tempo/session/Snapshot.ts +74 -0
  500. package/src/tempo/session/client/ChannelOps.test.ts +163 -0
  501. package/src/tempo/session/client/ChannelOps.ts +330 -0
  502. package/src/tempo/session/client/ChannelStore.ts +111 -0
  503. package/src/tempo/session/client/CredentialState.test.ts +789 -0
  504. package/src/tempo/session/client/CredentialState.ts +799 -0
  505. package/src/tempo/session/client/ReceiptCoordinator.ts +95 -0
  506. package/src/tempo/session/client/Runtime.test.ts +1092 -0
  507. package/src/tempo/session/client/Runtime.ts +986 -0
  508. package/src/tempo/session/client/Session.test.ts +774 -0
  509. package/src/tempo/session/client/Session.ts +123 -0
  510. package/src/tempo/session/client/SessionManager.test.ts +1397 -0
  511. package/src/tempo/session/client/SessionManager.ts +751 -0
  512. package/src/tempo/session/client/Transports.test.ts +837 -0
  513. package/src/tempo/session/client/Transports.ts +1292 -0
  514. package/src/tempo/session/client/index.ts +40 -0
  515. package/src/tempo/session/index.ts +7 -8
  516. package/src/tempo/session/precompile/Chain.integration.test.ts +321 -0
  517. package/src/tempo/session/precompile/Chain.test.ts +1258 -0
  518. package/src/tempo/session/precompile/Chain.ts +979 -0
  519. package/src/tempo/session/precompile/Channel.test.ts +138 -0
  520. package/src/tempo/session/precompile/Channel.ts +103 -0
  521. package/src/tempo/session/precompile/Protocol.test.ts +358 -0
  522. package/src/tempo/session/precompile/Protocol.ts +520 -0
  523. package/src/tempo/session/precompile/Voucher.test.ts +354 -0
  524. package/src/tempo/session/precompile/Voucher.ts +162 -0
  525. package/src/tempo/session/precompile/escrow.abi.ts +226 -0
  526. package/src/tempo/session/precompile/index.ts +33 -0
  527. package/src/tempo/session/server/ChannelOps.test.ts +129 -0
  528. package/src/tempo/session/server/ChannelOps.ts +157 -0
  529. package/src/tempo/session/{ChannelStore.test.ts → server/ChannelStore.test.ts} +536 -29
  530. package/src/tempo/session/server/ChannelStore.ts +835 -0
  531. package/src/tempo/session/server/CredentialVerification.test.ts +146 -0
  532. package/src/tempo/session/server/CredentialVerification.ts +710 -0
  533. package/src/tempo/session/server/MeteredStream.ts +88 -0
  534. package/src/tempo/session/server/RequestState.test.ts +531 -0
  535. package/src/tempo/session/server/RequestState.ts +499 -0
  536. package/src/tempo/session/server/Session.integration.test.ts +444 -0
  537. package/src/tempo/session/server/Session.test.ts +3253 -0
  538. package/src/tempo/session/server/Session.ts +543 -0
  539. package/src/tempo/session/server/Settlement.test.ts +329 -0
  540. package/src/tempo/session/server/Settlement.ts +471 -0
  541. package/src/tempo/session/{Sse.test.ts → server/Sse.test.ts} +37 -3
  542. package/src/tempo/session/server/Sse.ts +254 -0
  543. package/src/tempo/session/server/Transports.test.ts +346 -0
  544. package/src/tempo/session/server/Transports.ts +255 -0
  545. package/src/tempo/session/{Ws.test.ts → server/Ws.test.ts} +4 -4
  546. package/src/tempo/session/server/Ws.ts +380 -0
  547. package/src/tempo/session/server/index.ts +8 -0
  548. package/src/tempo/subscription/Store.ts +27 -9
  549. package/src/x402/Exact.e2e.test.ts +1 -1
  550. package/src/x402/PublicInterface.test-d.ts +1 -1
  551. package/src/x402/index.ts +1 -0
  552. package/dist/mcp-sdk/client/McpClient.d.ts +0 -78
  553. package/dist/mcp-sdk/client/McpClient.d.ts.map +0 -1
  554. package/dist/mcp-sdk/client/McpClient.js +0 -105
  555. package/dist/mcp-sdk/client/McpClient.js.map +0 -1
  556. package/dist/mcp-sdk/client/index.d.ts.map +0 -1
  557. package/dist/mcp-sdk/client/index.js.map +0 -1
  558. package/dist/mcp-sdk/server/Transport.d.ts.map +0 -1
  559. package/dist/mcp-sdk/server/Transport.js.map +0 -1
  560. package/dist/mcp-sdk/server/index.d.ts.map +0 -1
  561. package/dist/mcp-sdk/server/index.js.map +0 -1
  562. package/dist/tempo/client/ChannelOps.d.ts.map +0 -1
  563. package/dist/tempo/client/ChannelOps.js.map +0 -1
  564. package/dist/tempo/client/Session.d.ts.map +0 -1
  565. package/dist/tempo/client/Session.js.map +0 -1
  566. package/dist/tempo/client/SessionManager.d.ts.map +0 -1
  567. package/dist/tempo/client/SessionManager.js.map +0 -1
  568. package/dist/tempo/server/Session.d.ts.map +0 -1
  569. package/dist/tempo/server/Session.js.map +0 -1
  570. package/dist/tempo/session/Chain.d.ts.map +0 -1
  571. package/dist/tempo/session/Chain.js.map +0 -1
  572. package/dist/tempo/session/Channel.d.ts.map +0 -1
  573. package/dist/tempo/session/Channel.js.map +0 -1
  574. package/dist/tempo/session/ChannelStore.d.ts +0 -117
  575. package/dist/tempo/session/ChannelStore.d.ts.map +0 -1
  576. package/dist/tempo/session/ChannelStore.js +0 -172
  577. package/dist/tempo/session/ChannelStore.js.map +0 -1
  578. package/dist/tempo/session/Receipt.d.ts +0 -22
  579. package/dist/tempo/session/Receipt.d.ts.map +0 -1
  580. package/dist/tempo/session/Receipt.js +0 -34
  581. package/dist/tempo/session/Receipt.js.map +0 -1
  582. package/dist/tempo/session/Sse.d.ts.map +0 -1
  583. package/dist/tempo/session/Sse.js +0 -363
  584. package/dist/tempo/session/Sse.js.map +0 -1
  585. package/dist/tempo/session/Types.d.ts +0 -78
  586. package/dist/tempo/session/Types.d.ts.map +0 -1
  587. package/dist/tempo/session/Types.js.map +0 -1
  588. package/dist/tempo/session/Voucher.d.ts.map +0 -1
  589. package/dist/tempo/session/Voucher.js.map +0 -1
  590. package/dist/tempo/session/Ws.d.ts +0 -87
  591. package/dist/tempo/session/Ws.d.ts.map +0 -1
  592. package/dist/tempo/session/Ws.js +0 -443
  593. package/dist/tempo/session/Ws.js.map +0 -1
  594. package/dist/tempo/session/escrow.abi.js.map +0 -1
  595. package/src/mcp-sdk/client/McpClient.ts +0 -196
  596. package/src/tempo/session/ChannelStore.ts +0 -308
  597. package/src/tempo/session/Receipt.test.ts +0 -89
  598. package/src/tempo/session/Receipt.ts +0 -46
  599. package/src/tempo/session/Sse.ts +0 -462
  600. package/src/tempo/session/Types.ts +0 -86
  601. package/src/tempo/session/Ws.ts +0 -576
  602. /package/dist/{mcp-sdk → mcp}/client/index.d.ts +0 -0
  603. /package/dist/{mcp-sdk → mcp}/client/index.js +0 -0
  604. /package/dist/{mcp-sdk → mcp}/server/Transport.d.ts +0 -0
  605. /package/dist/{mcp-sdk → mcp}/server/Transport.js +0 -0
  606. /package/dist/{mcp-sdk → mcp}/server/index.d.ts +0 -0
  607. /package/dist/{mcp-sdk → mcp}/server/index.js +0 -0
  608. /package/dist/tempo/{session → legacy/session}/Channel.js +0 -0
  609. /package/dist/tempo/{session → legacy/session}/Types.js +0 -0
  610. /package/src/{mcp-sdk → mcp}/client/index.ts +0 -0
  611. /package/src/{mcp-sdk → mcp}/server/Transport.test.ts +0 -0
  612. /package/src/{mcp-sdk → mcp}/server/Transport.ts +0 -0
  613. /package/src/{mcp-sdk → mcp}/server/index.ts +0 -0
  614. /package/src/tempo/{session → legacy/session}/Channel.test.ts +0 -0
  615. /package/src/tempo/{session → legacy/session}/Voucher.test.ts +0 -0
  616. /package/src/tempo/session/{Sse.fuzz.test.ts → server/Sse.fuzz.test.ts} +0 -0
@@ -1,11 +1,18 @@
1
- import { encodeFunctionData, maxUint256 } from 'viem'
2
- import { Abis, Addresses } from 'viem/tempo'
3
- import { describe, expect, test } from 'vp/test'
1
+ import { Address, Secp256k1 } from 'ox'
2
+ import { TxEnvelopeTempo } from 'ox/tempo'
3
+ import { encodeFunctionData, maxUint256, toHex } from 'viem'
4
+ import { Abis, Addresses, Transaction } from 'viem/tempo'
5
+ import { afterEach, describe, expect, test, vi } from 'vp/test'
4
6
 
7
+ import * as defaults from './defaults.js'
5
8
  import {
9
+ assertAllowedFeeToken,
6
10
  callScopes,
11
+ defaultAllowedFeeTokens,
7
12
  FeePayerValidationError,
13
+ fillHostedFeePayerTransaction,
8
14
  prepareSponsoredTransaction,
15
+ simulationTransaction,
9
16
  validateCalls,
10
17
  } from './fee-payer.js'
11
18
  import * as Selectors from './selectors.js'
@@ -19,8 +26,17 @@ const swapData = encodeFunctionData({
19
26
  functionName: 'swapExactAmountOut',
20
27
  args: [swapTokenIn, swapTokenOut, 100n, 100n],
21
28
  })
29
+ const feePayerSignature = {
30
+ r: '0x0000000000000000000000000000000000000000000000000000000000000002',
31
+ s: '0x0000000000000000000000000000000000000000000000000000000000000003',
32
+ yParity: 1,
33
+ }
22
34
  const sponsor = { address: bogus, type: 'local' } as any
23
35
 
36
+ afterEach(() => {
37
+ vi.unstubAllGlobals()
38
+ })
39
+
24
40
  describe('callScopes', () => {
25
41
  test('has 4 allowed patterns', () => {
26
42
  expect(callScopes).toHaveLength(4)
@@ -423,6 +439,269 @@ describe('validateCalls', () => {
423
439
  })
424
440
  })
425
441
 
442
+ describe('fee token allowlist', () => {
443
+ test('includes pathUSD and the chain default currency', () => {
444
+ expect(defaultAllowedFeeTokens(defaults.chainId.mainnet)).toEqual([
445
+ defaults.tokens.pathUsd,
446
+ defaults.tokens.usdc,
447
+ ])
448
+ })
449
+
450
+ test('dedupes when pathUSD is the chain default currency', () => {
451
+ expect(defaultAllowedFeeTokens(defaults.chainId.testnet)).toEqual([defaults.tokens.pathUsd])
452
+ })
453
+
454
+ test('accepts allowlisted fee tokens', () => {
455
+ expect(() =>
456
+ assertAllowedFeeToken(
457
+ { feeToken: defaults.tokens.usdc },
458
+ defaultAllowedFeeTokens(defaults.chainId.mainnet),
459
+ ),
460
+ ).not.toThrow()
461
+ })
462
+
463
+ test('error: rejects non-string fee tokens', () => {
464
+ expect(() =>
465
+ assertAllowedFeeToken({ feeToken: 1n }, defaultAllowedFeeTokens(defaults.chainId.mainnet)),
466
+ ).toThrow('feeToken is invalid')
467
+ })
468
+
469
+ test('error: rejects fee tokens outside the allowlist', () => {
470
+ expect(() =>
471
+ assertAllowedFeeToken(
472
+ { feeToken: swapTokenIn },
473
+ defaultAllowedFeeTokens(defaults.chainId.mainnet),
474
+ ),
475
+ ).toThrow('feeToken is not allowed')
476
+ })
477
+ })
478
+
479
+ describe('fillHostedFeePayerTransaction', () => {
480
+ const hostedTransaction = {
481
+ accessList: [],
482
+ calls: [
483
+ {
484
+ data: encodeFunctionData({
485
+ abi: Abis.tip20,
486
+ functionName: 'transfer',
487
+ args: [bogus, 100n],
488
+ }),
489
+ to: bogus,
490
+ },
491
+ ],
492
+ chainId: defaults.chainId.mainnet,
493
+ from: bogus,
494
+ gas: 150_000n,
495
+ maxFeePerGas: 1_000_000_000n,
496
+ maxPriorityFeePerGas: 0n,
497
+ nonce: 1n,
498
+ nonceKey: maxUint256,
499
+ signature: { r: 1n, s: 1n, yParity: 0 } as any,
500
+ validBefore: Math.floor(Date.now() / 1_000) + 300,
501
+ } as const
502
+
503
+ test('uses hosted fillTransaction and preserves sender-committed fields', async () => {
504
+ // Sign over the payload built from the actual RPC request body so this
505
+ // verifies recovery parity with the real request shape.
506
+ const sponsorPrivateKey =
507
+ '0x0000000000000000000000000000000000000000000000000000000000000042' as const
508
+ const sponsorAddress = Address.fromPublicKey(
509
+ Secp256k1.getPublicKey({ privateKey: sponsorPrivateKey }),
510
+ )
511
+ let realFeePayerSignature: ReturnType<typeof Secp256k1.sign> | undefined
512
+
513
+ const calls: { init?: RequestInit | undefined; input: RequestInfo | URL }[] = []
514
+ const fetchMock = vi.fn(async (input: RequestInfo | URL, init?: RequestInit) => {
515
+ calls.push({ init, input })
516
+ const rpc = JSON.parse(init!.body as string).params[0]
517
+ const quantity = (value: unknown) =>
518
+ value === undefined ? undefined : BigInt(value as string)
519
+ realFeePayerSignature = Secp256k1.sign({
520
+ payload: TxEnvelopeTempo.getFeePayerSignPayload(
521
+ TxEnvelopeTempo.from({
522
+ accessList: rpc.accessList,
523
+ calls: rpc.calls.map(({ value, ...call }: any) => ({
524
+ ...call,
525
+ ...(value && value !== '0x' ? { value: BigInt(value) } : {}),
526
+ })),
527
+ chainId: hostedTransaction.chainId,
528
+ feeToken: defaults.tokens.pathUsd,
529
+ from: rpc.from,
530
+ ...(quantity(rpc.gas) !== undefined ? { gas: quantity(rpc.gas) } : {}),
531
+ ...(rpc.keyAuthorization !== undefined
532
+ ? { keyAuthorization: rpc.keyAuthorization }
533
+ : {}),
534
+ ...(quantity(rpc.maxFeePerGas) !== undefined
535
+ ? { maxFeePerGas: quantity(rpc.maxFeePerGas) }
536
+ : {}),
537
+ ...(quantity(rpc.maxPriorityFeePerGas) !== undefined
538
+ ? { maxPriorityFeePerGas: quantity(rpc.maxPriorityFeePerGas) }
539
+ : {}),
540
+ ...(quantity(rpc.nonce) !== undefined ? { nonce: quantity(rpc.nonce) } : {}),
541
+ ...(quantity(rpc.nonceKey) !== undefined ? { nonceKey: quantity(rpc.nonceKey) } : {}),
542
+ type: 'tempo',
543
+ ...(rpc.validAfter !== undefined ? { validAfter: Number(BigInt(rpc.validAfter)) } : {}),
544
+ ...(rpc.validBefore !== undefined
545
+ ? { validBefore: Number(BigInt(rpc.validBefore)) }
546
+ : {}),
547
+ } as any) as any,
548
+ { sender: rpc.from },
549
+ ),
550
+ privateKey: sponsorPrivateKey,
551
+ })
552
+ return new Response(
553
+ JSON.stringify(
554
+ {
555
+ result: {
556
+ tx: {
557
+ feePayerSignature: realFeePayerSignature,
558
+ feeToken: defaults.tokens.pathUsd,
559
+ gas: '0x1',
560
+ maxFeePerGas: '0x2',
561
+ },
562
+ },
563
+ },
564
+ (_key, value) => (typeof value === 'bigint' ? toHex(value) : value),
565
+ ),
566
+ )
567
+ })
568
+ vi.stubGlobal('fetch', fetchMock)
569
+
570
+ const result = await fillHostedFeePayerTransaction({
571
+ allowedFeeTokens: defaultAllowedFeeTokens(defaults.chainId.mainnet),
572
+ transaction: hostedTransaction as any,
573
+ url: 'https://sponsor.example/tp_key',
574
+ })
575
+
576
+ expect(result.feeToken).toBe(defaults.tokens.pathUsd)
577
+ expect(result.feePayer.toLowerCase()).toBe(sponsorAddress.toLowerCase())
578
+ const serialized = result.serializedTransaction
579
+
580
+ expect(fetchMock).toHaveBeenCalledOnce()
581
+ expect(calls[0]!.input).toBe('https://sponsor.example/tp_key')
582
+ const body = JSON.parse(calls[0]!.init!.body as string)
583
+ expect(body).toMatchObject({
584
+ jsonrpc: '2.0',
585
+ method: 'eth_fillTransaction',
586
+ })
587
+ expect(body.params[0]).toMatchObject({
588
+ calls: hostedTransaction.calls.map((call) => ({
589
+ data: call.data,
590
+ to: call.to,
591
+ value: '0x',
592
+ })),
593
+ feePayer: true,
594
+ from: hostedTransaction.from,
595
+ gas: toHex(hostedTransaction.gas),
596
+ maxFeePerGas: toHex(hostedTransaction.maxFeePerGas),
597
+ maxPriorityFeePerGas: toHex(hostedTransaction.maxPriorityFeePerGas),
598
+ nonce: toHex(hostedTransaction.nonce),
599
+ nonceKey: toHex(hostedTransaction.nonceKey),
600
+ type: '0x76',
601
+ validBefore: toHex(hostedTransaction.validBefore),
602
+ })
603
+
604
+ const transaction: Transaction.TransactionSerializableTempo = Transaction.deserialize(
605
+ serialized as Transaction.TransactionSerializedTempo,
606
+ )
607
+ expect(transaction.gas).toBe(hostedTransaction.gas)
608
+ expect(transaction.maxFeePerGas).toBe(hostedTransaction.maxFeePerGas)
609
+ expect(transaction.calls).toEqual(hostedTransaction.calls)
610
+ expect(transaction.feeToken).toBe(defaults.tokens.pathUsd)
611
+ expect(BigInt(transaction.feePayerSignature!.r)).toBe(realFeePayerSignature!.r)
612
+ expect(BigInt(transaction.feePayerSignature!.s)).toBe(realFeePayerSignature!.s)
613
+ })
614
+
615
+ test('error: requires hosted fee payer to return a feeToken', async () => {
616
+ vi.stubGlobal(
617
+ 'fetch',
618
+ vi.fn(async () => new Response(JSON.stringify({ result: { tx: { feePayerSignature } } }))),
619
+ )
620
+
621
+ await expect(
622
+ fillHostedFeePayerTransaction({
623
+ allowedFeeTokens: defaultAllowedFeeTokens(defaults.chainId.mainnet),
624
+ transaction: hostedTransaction as any,
625
+ url: 'https://sponsor.example/tp_key',
626
+ }),
627
+ ).rejects.toThrow('did not return a feeToken')
628
+ })
629
+
630
+ test('error: rejects hosted feeToken outside the allowlist', async () => {
631
+ vi.stubGlobal(
632
+ 'fetch',
633
+ vi.fn(
634
+ async () =>
635
+ new Response(
636
+ JSON.stringify({
637
+ result: { tx: { feePayerSignature, feeToken: swapTokenIn } },
638
+ }),
639
+ ),
640
+ ),
641
+ )
642
+
643
+ await expect(
644
+ fillHostedFeePayerTransaction({
645
+ allowedFeeTokens: defaultAllowedFeeTokens(defaults.chainId.mainnet),
646
+ transaction: hostedTransaction as any,
647
+ url: 'https://sponsor.example/tp_key',
648
+ }),
649
+ ).rejects.toThrow('feeToken is not allowed')
650
+ })
651
+
652
+ test('error: surfaces hosted fee payer errors', async () => {
653
+ vi.stubGlobal(
654
+ 'fetch',
655
+ vi.fn(
656
+ async () =>
657
+ new Response(JSON.stringify({ error: { message: 'Invalid or revoked API key' } }), {
658
+ status: 401,
659
+ }),
660
+ ),
661
+ )
662
+
663
+ await expect(
664
+ fillHostedFeePayerTransaction({
665
+ allowedFeeTokens: defaultAllowedFeeTokens(defaults.chainId.mainnet),
666
+ transaction: hostedTransaction as any,
667
+ url: 'https://sponsor.example/tp_key',
668
+ }),
669
+ ).rejects.toThrow('Invalid or revoked API key')
670
+ })
671
+ })
672
+
673
+ describe('simulationTransaction', () => {
674
+ test('strips signed fee-payer fields for sponsored preflight simulation', () => {
675
+ const transaction = {
676
+ calls: [{ to: bogus }],
677
+ feePayerSignature,
678
+ from: bogus,
679
+ }
680
+
681
+ expect(simulationTransaction(transaction as any, { feePayer: true })).toEqual({
682
+ account: bogus,
683
+ calls: transaction.calls,
684
+ })
685
+ })
686
+
687
+ test('preserves non-sponsored transaction fields except feePayerSignature', () => {
688
+ const transaction = {
689
+ calls: [{ to: bogus }],
690
+ feePayerSignature,
691
+ from: bogus,
692
+ gas: 1n,
693
+ }
694
+
695
+ expect(simulationTransaction(transaction as any, { feePayer: false })).toEqual({
696
+ account: bogus,
697
+ calls: transaction.calls,
698
+ from: bogus,
699
+ gas: 1n,
700
+ feePayerSignature: undefined,
701
+ })
702
+ })
703
+ })
704
+
426
705
  describe('prepareSponsoredTransaction', () => {
427
706
  const baseTransaction = {
428
707
  accessList: [],
@@ -454,7 +733,7 @@ describe('prepareSponsoredTransaction', () => {
454
733
  account: sponsor,
455
734
  chainId: 42431,
456
735
  details,
457
- expectedFeeToken: bogus,
736
+ allowedFeeTokens: [bogus],
458
737
  transaction: baseTransaction as any,
459
738
  }),
460
739
  ).not.toThrow()
@@ -466,7 +745,7 @@ describe('prepareSponsoredTransaction', () => {
466
745
  account: sponsor,
467
746
  chainId: 42431,
468
747
  details,
469
- expectedFeeToken: bogus,
748
+ allowedFeeTokens: [bogus],
470
749
  transaction: {
471
750
  ...baseTransaction,
472
751
  nonceKey: maxUint256,
@@ -481,7 +760,7 @@ describe('prepareSponsoredTransaction', () => {
481
760
  account: sponsor,
482
761
  chainId: 42431,
483
762
  details,
484
- expectedFeeToken: bogus,
763
+ allowedFeeTokens: [bogus],
485
764
  transaction: {
486
765
  ...baseTransaction,
487
766
  nonceKey: 1n,
@@ -496,7 +775,7 @@ describe('prepareSponsoredTransaction', () => {
496
775
  account: sponsor,
497
776
  chainId: 42431,
498
777
  details,
499
- expectedFeeToken: bogus,
778
+ allowedFeeTokens: [bogus],
500
779
  transaction: {
501
780
  ...baseTransaction,
502
781
  gas: 626_497n,
@@ -513,7 +792,7 @@ describe('prepareSponsoredTransaction', () => {
513
792
  account: sponsor,
514
793
  chainId: 4217,
515
794
  details,
516
- expectedFeeToken: bogus,
795
+ allowedFeeTokens: [bogus],
517
796
  policy: { maxPriorityFeePerGas: 50_000_000_000n },
518
797
  transaction: {
519
798
  ...baseTransaction,
@@ -532,7 +811,7 @@ describe('prepareSponsoredTransaction', () => {
532
811
  account: sponsor,
533
812
  chainId: 4217,
534
813
  details,
535
- expectedFeeToken: bogus,
814
+ allowedFeeTokens: [bogus],
536
815
  policy: { maxPriorityFeePerGas: 20_000_000_000n },
537
816
  transaction: {
538
817
  ...baseTransaction,
@@ -551,7 +830,7 @@ describe('prepareSponsoredTransaction', () => {
551
830
  account: sponsor,
552
831
  chainId: 4217,
553
832
  details,
554
- expectedFeeToken: bogus,
833
+ allowedFeeTokens: [bogus],
555
834
  policy: { maxPriorityFeePerGas: undefined } as any,
556
835
  transaction: {
557
836
  ...baseTransaction,
@@ -578,7 +857,7 @@ describe('prepareSponsoredTransaction', () => {
578
857
  account: sponsor,
579
858
  chainId: 42431,
580
859
  details,
581
- expectedFeeToken: bogus,
860
+ allowedFeeTokens: [bogus],
582
861
  transaction: { ...baseTransaction, keyAuthorization } as any,
583
862
  }) as { keyAuthorization?: unknown }
584
863
 
@@ -591,7 +870,7 @@ describe('prepareSponsoredTransaction', () => {
591
870
  account: sponsor,
592
871
  chainId: 42431,
593
872
  details,
594
- expectedFeeToken: bogus,
873
+ allowedFeeTokens: [bogus],
595
874
  transaction: { ...baseTransaction, unexpectedField: 'ignored' } as any,
596
875
  }),
597
876
  ).toThrow('contains unsupported fields')
@@ -603,7 +882,7 @@ describe('prepareSponsoredTransaction', () => {
603
882
  account: sponsor,
604
883
  chainId: 42431,
605
884
  details,
606
- expectedFeeToken: bogus,
885
+ allowedFeeTokens: [bogus],
607
886
  transaction: {
608
887
  ...baseTransaction,
609
888
  feePayerSignature: { r: 2n, s: 3n, yParity: 1 },
@@ -618,7 +897,7 @@ describe('prepareSponsoredTransaction', () => {
618
897
  account: sponsor,
619
898
  chainId: 42431,
620
899
  details,
621
- expectedFeeToken: bogus,
900
+ allowedFeeTokens: [bogus],
622
901
  transaction: {
623
902
  ...baseTransaction,
624
903
  maxFeePerGas: 200_000_000_000n,
@@ -633,7 +912,7 @@ describe('prepareSponsoredTransaction', () => {
633
912
  account: sponsor,
634
913
  chainId: 42431,
635
914
  details,
636
- expectedFeeToken: bogus,
915
+ allowedFeeTokens: [bogus],
637
916
  transaction: {
638
917
  ...baseTransaction,
639
918
  gas: 1_500_000n,
@@ -649,7 +928,7 @@ describe('prepareSponsoredTransaction', () => {
649
928
  account: sponsor,
650
929
  chainId: 42431,
651
930
  details,
652
- expectedFeeToken: '0x0000000000000000000000000000000000000002',
931
+ allowedFeeTokens: ['0x0000000000000000000000000000000000000002'],
653
932
  transaction: baseTransaction as any,
654
933
  }),
655
934
  ).toThrow('feeToken is not allowed')
@@ -661,7 +940,7 @@ describe('prepareSponsoredTransaction', () => {
661
940
  account: sponsor,
662
941
  chainId: 42431,
663
942
  details,
664
- expectedFeeToken: bogus,
943
+ allowedFeeTokens: [bogus],
665
944
  transaction: {
666
945
  ...baseTransaction,
667
946
  validBefore: Math.floor(Date.now() / 1_000) + 3_600,
@@ -1,8 +1,9 @@
1
+ import { Secp256k1 } from 'ox'
1
2
  import type { TempoAddress } from 'ox/tempo'
2
3
  import { TxEnvelopeTempo } from 'ox/tempo'
3
4
  import type { Hex } from 'viem'
4
5
  import type { Account } from 'viem'
5
- import { decodeFunctionData, maxUint256 } from 'viem'
6
+ import { decodeFunctionData, maxUint256, toHex } from 'viem'
6
7
  import { Abis, Addresses, Transaction } from 'viem/tempo'
7
8
 
8
9
  import * as TempoAddress_internal from './address.js'
@@ -43,6 +44,16 @@ export type Policy = {
43
44
  // Tempo transaction fields.
44
45
  type SponsoredTransaction = ReturnType<(typeof Transaction)['deserialize']>
45
46
 
47
+ type HostedFeePayerFillResponse = {
48
+ error?: { message?: string | undefined } | undefined
49
+ result?: {
50
+ tx?: {
51
+ feePayerSignature?: unknown
52
+ feeToken?: unknown
53
+ }
54
+ }
55
+ }
56
+
46
57
  type ExpectedTransfer = {
47
58
  amount: string
48
59
  allowAnyMemo?: boolean | undefined
@@ -92,6 +103,172 @@ const supportedTransactionKeys = new Set<string>([
92
103
  ...rewrittenTransactionKeys,
93
104
  ])
94
105
 
106
+ function pushAllowedFeeToken(tokens: TempoAddress.Address[], token: string | undefined) {
107
+ if (!token) return
108
+ const normalized = token as TempoAddress.Address
109
+ if (tokens.some((existing) => TempoAddress_internal.isEqual(existing, normalized))) return
110
+ tokens.push(normalized)
111
+ }
112
+
113
+ /** Returns fee tokens that mppx allows sponsored transactions to charge. */
114
+ export function defaultAllowedFeeTokens(chainId: number | undefined) {
115
+ const tokens: TempoAddress.Address[] = []
116
+ pushAllowedFeeToken(tokens, defaults.tokens.pathUsd)
117
+ pushAllowedFeeToken(tokens, defaults.currency[chainId as keyof typeof defaults.currency])
118
+ return tokens
119
+ }
120
+
121
+ /** Rejects a sponsored fee token outside the server's allowlist. */
122
+ export function assertAllowedFeeToken(
123
+ transaction: { feeToken?: unknown },
124
+ allowedFeeTokens: readonly TempoAddress.Address[],
125
+ ) {
126
+ const { feeToken } = transaction
127
+ if (feeToken === undefined) return
128
+ if (typeof feeToken !== 'string')
129
+ throw new FeePayerValidationError('fee-sponsored transaction feeToken is invalid', {})
130
+ const normalized = feeToken as TempoAddress.Address
131
+ if (!allowedFeeTokens.some((allowed) => TempoAddress_internal.isEqual(allowed, normalized)))
132
+ throw new FeePayerValidationError('fee-sponsored transaction feeToken is not allowed', {
133
+ feeToken,
134
+ })
135
+ }
136
+
137
+ function hostedFeePayerRequest(transaction: SponsoredTransaction) {
138
+ return {
139
+ ...(transaction.accessList?.length ? { accessList: transaction.accessList } : {}),
140
+ calls: transaction.calls.map(
141
+ (call: {
142
+ data?: `0x${string}` | undefined
143
+ to?: TempoAddress.Address | undefined
144
+ value?: bigint | undefined
145
+ }) => ({
146
+ ...(call.to ? { to: call.to } : {}),
147
+ ...(call.data ? { data: call.data } : {}),
148
+ value: call.value === undefined ? '0x' : toHex(call.value),
149
+ }),
150
+ ),
151
+ feePayer: true,
152
+ from: transaction.from,
153
+ ...(transaction.gas !== undefined ? { gas: toHex(transaction.gas) } : {}),
154
+ ...(transaction.keyAuthorization !== undefined
155
+ ? { keyAuthorization: transaction.keyAuthorization }
156
+ : {}),
157
+ ...(transaction.maxFeePerGas !== undefined
158
+ ? { maxFeePerGas: toHex(transaction.maxFeePerGas) }
159
+ : {}),
160
+ ...(transaction.maxPriorityFeePerGas !== undefined
161
+ ? { maxPriorityFeePerGas: toHex(transaction.maxPriorityFeePerGas) }
162
+ : {}),
163
+ nonce: toHex(transaction.nonce ?? 0),
164
+ ...(transaction.nonceKey !== undefined ? { nonceKey: toHex(transaction.nonceKey) } : {}),
165
+ type: '0x76',
166
+ ...(transaction.validAfter !== undefined ? { validAfter: toHex(transaction.validAfter) } : {}),
167
+ ...(transaction.validBefore !== undefined
168
+ ? { validBefore: toHex(transaction.validBefore) }
169
+ : {}),
170
+ }
171
+ }
172
+
173
+ /**
174
+ * Co-signs a sender-signed partial sponsorship envelope using a hosted
175
+ * fee-payer endpoint without letting the endpoint mutate sender-committed
176
+ * transaction fields.
177
+ *
178
+ * @returns The serialized co-signed transaction plus the sponsor's recovered
179
+ * `feePayer` address and chosen `feeToken`, so callers can pre-broadcast
180
+ * simulate the exact transaction the sponsor broadcasts.
181
+ */
182
+ export async function fillHostedFeePayerTransaction(parameters: {
183
+ allowedFeeTokens: readonly TempoAddress.Address[]
184
+ transaction: SponsoredTransaction
185
+ url: string
186
+ }) {
187
+ const { allowedFeeTokens, transaction, url } = parameters
188
+ const response = await fetch(url, {
189
+ body: JSON.stringify(
190
+ {
191
+ id: 1,
192
+ jsonrpc: '2.0',
193
+ method: 'eth_fillTransaction',
194
+ params: [hostedFeePayerRequest(transaction)],
195
+ },
196
+ (_key, value) => (typeof value === 'bigint' ? toHex(value) : value),
197
+ ),
198
+ headers: { 'content-type': 'application/json' },
199
+ method: 'POST',
200
+ })
201
+ const payload = (await response.json().catch(async () => ({
202
+ error: { message: await response.text() },
203
+ }))) as HostedFeePayerFillResponse
204
+ const filled = payload.result?.tx
205
+ if (!response.ok || payload.error || !filled?.feePayerSignature)
206
+ throw new FeePayerValidationError(
207
+ payload.error?.message ?? 'hosted fee payer failed to sponsor transaction',
208
+ {},
209
+ )
210
+ if (typeof filled.feeToken !== 'string')
211
+ throw new FeePayerValidationError('hosted fee payer did not return a feeToken', {})
212
+
213
+ assertAllowedFeeToken({ feeToken: filled.feeToken }, allowedFeeTokens)
214
+
215
+ const feePayerSignature = filled.feePayerSignature
216
+ const feeToken = filled.feeToken
217
+
218
+ // Recover the concrete sponsor address so the simulation can use a concrete
219
+ // `feePayer` (the node rejects `eth_call` with `feePayer: true`).
220
+ const feePayer = (() => {
221
+ try {
222
+ return Secp256k1.recoverAddress({
223
+ payload: TxEnvelopeTempo.getFeePayerSignPayload(
224
+ TxEnvelopeTempo.from({
225
+ ...transaction,
226
+ feePayerSignature: undefined,
227
+ feeToken,
228
+ signature: undefined,
229
+ } as never),
230
+ { sender: transaction.from as never },
231
+ ),
232
+ signature: feePayerSignature as never,
233
+ })
234
+ } catch {
235
+ throw new FeePayerValidationError(
236
+ 'hosted fee payer returned an invalid feePayerSignature',
237
+ {},
238
+ )
239
+ }
240
+ })()
241
+
242
+ return {
243
+ feePayer,
244
+ feeToken,
245
+ serializedTransaction: await Transaction.serialize({
246
+ ...transaction,
247
+ feePayer: true,
248
+ feePayerSignature,
249
+ feeToken,
250
+ } as never),
251
+ }
252
+ }
253
+
254
+ /** Returns a transaction shape suitable for pre-broadcast simulation. */
255
+ export function simulationTransaction(
256
+ transaction: SponsoredTransaction,
257
+ options: { feePayer: boolean },
258
+ ) {
259
+ if (options.feePayer)
260
+ return {
261
+ account: transaction.from,
262
+ calls: transaction.calls,
263
+ }
264
+ return {
265
+ ...transaction,
266
+ account: transaction.from,
267
+ calls: transaction.calls,
268
+ feePayerSignature: undefined,
269
+ }
270
+ }
271
+
95
272
  /**
96
273
  * maxTotalFee must be high enough to cover `transferWithMemo` and
97
274
  * swap transactions at peak gas prices. Bumped from 0.01 ETH in #327.
@@ -258,20 +435,20 @@ export function validateCalls(
258
435
 
259
436
  export function prepareSponsoredTransaction(parameters: {
260
437
  account: Account
438
+ allowedFeeTokens?: readonly TempoAddress.Address[] | undefined
261
439
  challengeExpires?: string | undefined
262
440
  chainId: number
263
441
  details: Record<string, string>
264
- expectedFeeToken?: TempoAddress.Address | undefined
265
442
  now?: Date | undefined
266
443
  policy?: Partial<Policy> | undefined
267
444
  transaction: SponsoredTransaction
268
445
  }) {
269
446
  const {
270
447
  account,
448
+ allowedFeeTokens,
271
449
  challengeExpires,
272
450
  chainId,
273
451
  details,
274
- expectedFeeToken,
275
452
  now = new Date(),
276
453
  policy: policyOverrides,
277
454
  transaction,
@@ -392,7 +569,12 @@ export function prepareSponsoredTransaction(parameters: {
392
569
  })()
393
570
 
394
571
  if (normalizedFeeToken !== undefined) {
395
- if (expectedFeeToken && !TempoAddress_internal.isEqual(normalizedFeeToken, expectedFeeToken))
572
+ if (
573
+ allowedFeeTokens &&
574
+ !allowedFeeTokens.some((allowed) =>
575
+ TempoAddress_internal.isEqual(normalizedFeeToken, allowed),
576
+ )
577
+ )
396
578
  fail('fee-sponsored transaction feeToken is not allowed', {
397
579
  feeToken: normalizedFeeToken,
398
580
  })