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
@@ -3,8 +3,8 @@ import { Mppx as Mppx_client, tempo as tempo_client } from 'mppx/client'
3
3
  import { Mppx as Mppx_server, tempo as tempo_server } from 'mppx/server'
4
4
  import { P256, type Hex, WebAuthnP256 } from 'ox'
5
5
  import { SignatureEnvelope, TxEnvelopeTempo } from 'ox/tempo'
6
- import { Handler } from 'tempo.ts/server'
7
- import { createClient, custom, encodeFunctionData, parseUnits } from 'viem'
6
+ import { createClient, custom, encodeFunctionData, parseSignature, parseUnits } from 'viem'
7
+ import { generatePrivateKey, privateKeyToAccount } from 'viem/accounts'
8
8
  import {
9
9
  getTransactionReceipt,
10
10
  prepareTransactionRequest,
@@ -15,16 +15,36 @@ import {
15
15
  import { Abis, Account, Actions, Addresses, Secp256k1, Tick, Transaction } from 'viem/tempo'
16
16
  import { beforeAll, describe, expect, test } from 'vp/test'
17
17
  import * as Http from '~test/Http.js'
18
- import { closeChannelOnChain, deployEscrow, openChannel } from '~test/tempo/session.js'
18
+ import {
19
+ closeChannelOnChain,
20
+ deployEscrow,
21
+ openChannel,
22
+ signVoucher,
23
+ } from '~test/tempo/legacy/session.js'
19
24
  import { accounts, asset, chain, client, fundAccount, http } from '~test/tempo/viem.js'
20
25
 
21
26
  import * as Store from '../../Store.js'
22
27
  import * as Attribution from '../Attribution.js'
28
+ import * as defaults from '../internal/defaults.js'
23
29
  import * as Proof from '../internal/proof.js'
24
- import { signVoucher } from '../session/Voucher.js'
25
30
 
26
31
  const realm = 'api.example.com'
27
- const secretKey = 'test-secret-key'
32
+ const secretKey = 'test-secret-key-test-secret-key-32'
33
+
34
+ function isPairAlreadyExistsError(error: unknown) {
35
+ if (typeof error !== 'object' || error === null) return false
36
+ const candidate = error as {
37
+ details?: string | undefined
38
+ shortMessage?: string | undefined
39
+ }
40
+ return [candidate.details, candidate.shortMessage].some((message) =>
41
+ message?.includes('PairAlreadyExists'),
42
+ )
43
+ }
44
+
45
+ function testAccount() {
46
+ return privateKeyToAccount(generatePrivateKey())
47
+ }
28
48
 
29
49
  type ProofAccessKeyContext = {
30
50
  accessKey: ReturnType<typeof Account.fromSecp256k1>
@@ -1584,6 +1604,228 @@ describe('tempo', () => {
1584
1604
  httpServer.close()
1585
1605
  })
1586
1606
 
1607
+ test('behavior: fee payer pre-broadcast simulation targets the co-signed transaction', async () => {
1608
+ // The pre-broadcast simulation must reflect the FINAL co-signed envelope
1609
+ // (concrete sponsor fee payer), not the pre-cosign 0x78 (`feePayer: true`).
1610
+ const callRequests: any[] = []
1611
+ const interceptingClient = createClient({
1612
+ account: accounts[0],
1613
+ chain: client.chain,
1614
+ transport: custom({
1615
+ async request(args: any) {
1616
+ if (args.method === 'eth_call') callRequests.push(args.params?.[0])
1617
+ return client.transport.request(args)
1618
+ },
1619
+ }),
1620
+ })
1621
+
1622
+ const serverWithTrace = Mppx_server.create({
1623
+ methods: [
1624
+ tempo_server.charge({
1625
+ getClient() {
1626
+ return interceptingClient
1627
+ },
1628
+ currency: asset,
1629
+ account: accounts[0],
1630
+ }),
1631
+ ],
1632
+ realm,
1633
+ secretKey,
1634
+ })
1635
+
1636
+ const mppx = Mppx_client.create({
1637
+ polyfill: false,
1638
+ methods: [
1639
+ tempo_client({
1640
+ account: accounts[1],
1641
+ getClient() {
1642
+ return client
1643
+ },
1644
+ }),
1645
+ ],
1646
+ })
1647
+
1648
+ const httpServer = await Http.createServer(async (req, res) => {
1649
+ const result = await Mppx_server.toNodeListener(
1650
+ serverWithTrace.charge({
1651
+ feePayer: accounts[0],
1652
+ amount: '1',
1653
+ currency: asset,
1654
+ recipient: accounts[0].address,
1655
+ }),
1656
+ )(req, res)
1657
+ if (result.status === 402) return
1658
+ res.end('OK')
1659
+ })
1660
+
1661
+ const challengeResponse = await fetch(httpServer.url)
1662
+ const credential = await mppx.createCredential(challengeResponse)
1663
+ callRequests.length = 0
1664
+
1665
+ const authResponse = await fetch(httpServer.url, {
1666
+ headers: { Authorization: credential },
1667
+ })
1668
+ expect(authResponse.status).toBe(200)
1669
+
1670
+ expect(callRequests.length).toBeGreaterThan(0)
1671
+ const simRequest = callRequests[0]
1672
+ // The co-signed envelope names a concrete sponsor as fee payer. The
1673
+ // pre-cosign 0x78 instead carries `feePayer: true`; asserting the address
1674
+ // proves we simulate the transaction the sponsor actually broadcasts.
1675
+ expect(simRequest.feePayer).not.toBe(true)
1676
+ expect(typeof simRequest.feePayer).toBe('string')
1677
+ expect((simRequest.feePayer as string).toLowerCase()).toBe(accounts[0].address.toLowerCase())
1678
+ // Execution runs as the sender, not the sponsor.
1679
+ expect((simRequest.from as string).toLowerCase()).toBe(accounts[1].address.toLowerCase())
1680
+ expect(simRequest.calls?.length).toBeGreaterThan(0)
1681
+
1682
+ httpServer.close()
1683
+ })
1684
+
1685
+ test('behavior: fee payer fails closed when pre-broadcast simulation reverts', async () => {
1686
+ // A reverting pre-broadcast simulation must abort before broadcast so the
1687
+ // sponsor never pays gas for a transaction that would revert.
1688
+ const rpcMethods: string[] = []
1689
+ const interceptingClient = createClient({
1690
+ account: accounts[0],
1691
+ chain: client.chain,
1692
+ transport: custom({
1693
+ async request(args: any) {
1694
+ rpcMethods.push(args.method)
1695
+ if (args.method === 'eth_call')
1696
+ throw new Error('execution reverted: simulation fixture')
1697
+ return client.transport.request(args)
1698
+ },
1699
+ }),
1700
+ })
1701
+
1702
+ const serverWithRevert = Mppx_server.create({
1703
+ methods: [
1704
+ tempo_server.charge({
1705
+ getClient() {
1706
+ return interceptingClient
1707
+ },
1708
+ currency: asset,
1709
+ account: accounts[0],
1710
+ }),
1711
+ ],
1712
+ realm,
1713
+ secretKey,
1714
+ })
1715
+
1716
+ const mppx = Mppx_client.create({
1717
+ polyfill: false,
1718
+ methods: [
1719
+ tempo_client({
1720
+ account: accounts[1],
1721
+ getClient() {
1722
+ return client
1723
+ },
1724
+ }),
1725
+ ],
1726
+ })
1727
+
1728
+ const httpServer = await Http.createServer(async (req, res) => {
1729
+ const result = await Mppx_server.toNodeListener(
1730
+ serverWithRevert.charge({
1731
+ feePayer: accounts[0],
1732
+ amount: '1',
1733
+ currency: asset,
1734
+ recipient: accounts[0].address,
1735
+ }),
1736
+ )(req, res)
1737
+ if (result.status === 402) return
1738
+ res.end('OK')
1739
+ })
1740
+
1741
+ const challengeResponse = await fetch(httpServer.url)
1742
+ const credential = await mppx.createCredential(challengeResponse)
1743
+ rpcMethods.length = 0
1744
+
1745
+ const authResponse = await fetch(httpServer.url, {
1746
+ headers: { Authorization: credential },
1747
+ })
1748
+
1749
+ // Fails closed: not successful, and the transaction is never broadcast.
1750
+ expect(authResponse.status).not.toBe(200)
1751
+ expect(rpcMethods).toContain('eth_call')
1752
+ expect(rpcMethods).not.toContain('eth_sendRawTransactionSync')
1753
+ expect(rpcMethods).not.toContain('eth_sendRawTransaction')
1754
+
1755
+ httpServer.close()
1756
+ })
1757
+
1758
+ test('behavior: fee payer fails closed when simulation reverts (optimistic mode)', async () => {
1759
+ const rpcMethods: string[] = []
1760
+ const interceptingClient = createClient({
1761
+ account: accounts[0],
1762
+ chain: client.chain,
1763
+ transport: custom({
1764
+ async request(args: any) {
1765
+ rpcMethods.push(args.method)
1766
+ if (args.method === 'eth_call')
1767
+ throw new Error('execution reverted: simulation fixture')
1768
+ return client.transport.request(args)
1769
+ },
1770
+ }),
1771
+ })
1772
+
1773
+ const serverNoWait = Mppx_server.create({
1774
+ methods: [
1775
+ tempo_server.charge({
1776
+ getClient() {
1777
+ return interceptingClient
1778
+ },
1779
+ currency: asset,
1780
+ account: accounts[0],
1781
+ waitForConfirmation: false,
1782
+ }),
1783
+ ],
1784
+ realm,
1785
+ secretKey,
1786
+ })
1787
+
1788
+ const mppx = Mppx_client.create({
1789
+ polyfill: false,
1790
+ methods: [
1791
+ tempo_client({
1792
+ account: accounts[1],
1793
+ getClient() {
1794
+ return client
1795
+ },
1796
+ }),
1797
+ ],
1798
+ })
1799
+
1800
+ const httpServer = await Http.createServer(async (req, res) => {
1801
+ const result = await Mppx_server.toNodeListener(
1802
+ serverNoWait.charge({
1803
+ feePayer: accounts[0],
1804
+ amount: '1',
1805
+ currency: asset,
1806
+ recipient: accounts[0].address,
1807
+ }),
1808
+ )(req, res)
1809
+ if (result.status === 402) return
1810
+ res.end('OK')
1811
+ })
1812
+
1813
+ const challengeResponse = await fetch(httpServer.url)
1814
+ const credential = await mppx.createCredential(challengeResponse)
1815
+ rpcMethods.length = 0
1816
+
1817
+ const authResponse = await fetch(httpServer.url, {
1818
+ headers: { Authorization: credential },
1819
+ })
1820
+
1821
+ expect(authResponse.status).not.toBe(200)
1822
+ expect(rpcMethods).toContain('eth_call')
1823
+ expect(rpcMethods).not.toContain('eth_sendRawTransaction')
1824
+ expect(rpcMethods).not.toContain('eth_sendRawTransactionSync')
1825
+
1826
+ httpServer.close()
1827
+ })
1828
+
1587
1829
  test('behavior: fee payer rejects concurrent in-flight transactions from one sender', async () => {
1588
1830
  let releaseSimulation!: () => void
1589
1831
  let resolveSimulationStarted!: () => void
@@ -1796,11 +2038,64 @@ describe('tempo', () => {
1796
2038
  })
1797
2039
 
1798
2040
  test('behavior: fee payer URL (withFeePayer transport)', async () => {
1799
- const feePayerHandler = Handler.feePayer({
1800
- account: accounts[0],
1801
- client,
2041
+ const feePayerRequests: any[] = []
2042
+ const feePayerServer = await Http.createServer(async (req, res) => {
2043
+ let requestBody = ''
2044
+ for await (const chunk of req) requestBody += chunk
2045
+ const request = JSON.parse(requestBody)
2046
+ feePayerRequests.push(request)
2047
+
2048
+ const transaction = request.params[0]
2049
+ const quantity = (value: unknown) =>
2050
+ value === undefined ? undefined : BigInt(value as string | number | bigint | boolean)
2051
+ const envelope = TxEnvelopeTempo.from({
2052
+ accessList: transaction.accessList,
2053
+ calls: transaction.calls.map(({ value, ...call }: any) => ({
2054
+ ...call,
2055
+ ...(value && value !== '0x' ? { value: BigInt(value) } : {}),
2056
+ })),
2057
+ chainId: chain.id,
2058
+ feeToken: defaults.tokens.pathUsd,
2059
+ from: transaction.from,
2060
+ ...(quantity(transaction.gas) !== undefined ? { gas: quantity(transaction.gas) } : {}),
2061
+ ...(quantity(transaction.maxFeePerGas) !== undefined
2062
+ ? { maxFeePerGas: quantity(transaction.maxFeePerGas) }
2063
+ : {}),
2064
+ ...(quantity(transaction.maxPriorityFeePerGas) !== undefined
2065
+ ? { maxPriorityFeePerGas: quantity(transaction.maxPriorityFeePerGas) }
2066
+ : {}),
2067
+ ...(quantity(transaction.nonce) !== undefined
2068
+ ? { nonce: quantity(transaction.nonce) }
2069
+ : {}),
2070
+ ...(quantity(transaction.nonceKey) !== undefined
2071
+ ? { nonceKey: quantity(transaction.nonceKey) }
2072
+ : {}),
2073
+ type: 'tempo',
2074
+ ...(transaction.validAfter ? { validAfter: Number(BigInt(transaction.validAfter)) } : {}),
2075
+ ...(transaction.validBefore
2076
+ ? { validBefore: Number(BigInt(transaction.validBefore)) }
2077
+ : {}),
2078
+ })
2079
+ const hash = TxEnvelopeTempo.getFeePayerSignPayload(envelope, {
2080
+ sender: transaction.from,
2081
+ })
2082
+ const { r, s, yParity } = parseSignature(await accounts[0].sign!({ hash }))
2083
+ const feePayerSignature = { r, s, yParity }
2084
+
2085
+ res.setHeader('content-type', 'application/json')
2086
+ res.end(
2087
+ JSON.stringify({
2088
+ id: request.id,
2089
+ jsonrpc: '2.0',
2090
+ result: {
2091
+ tx: {
2092
+ feePayerSignature,
2093
+ feeToken: defaults.tokens.pathUsd,
2094
+ },
2095
+ },
2096
+ }),
2097
+ )
1802
2098
  })
1803
- const feePayerServer = await Http.createServer(feePayerHandler.listener)
1804
2099
 
1805
2100
  const serverWithFeePayer = Mppx_server.create({
1806
2101
  methods: [
@@ -1838,6 +2133,7 @@ describe('tempo', () => {
1838
2133
 
1839
2134
  const response = await mppx.fetch(httpServer.url)
1840
2135
  expect(response.status).toBe(200)
2136
+ expect(feePayerRequests.map(({ method }) => method)).toEqual(['eth_fillTransaction'])
1841
2137
 
1842
2138
  const receipt = Receipt.fromResponse(response)
1843
2139
  expect(receipt.status).toBe('success')
@@ -2410,7 +2706,11 @@ describe('tempo', () => {
2410
2706
  domain: Proof.domain(chain.id),
2411
2707
  types: Proof.types,
2412
2708
  primaryType: 'Proof',
2413
- message: Proof.message(challenge.id, challenge.realm),
2709
+ message: Proof.message({
2710
+ account: accounts[1].address,
2711
+ challengeId: challenge.id,
2712
+ realm: challenge.realm,
2713
+ }),
2414
2714
  })
2415
2715
 
2416
2716
  const credential = Credential.from({
@@ -2448,7 +2748,11 @@ describe('tempo', () => {
2448
2748
  domain: Proof.domain(chain.id),
2449
2749
  types: Proof.types,
2450
2750
  primaryType: 'Proof',
2451
- message: Proof.message(challenge.id, challenge.realm),
2751
+ message: Proof.message({
2752
+ account: accounts[1].address,
2753
+ challengeId: challenge.id,
2754
+ realm: challenge.realm,
2755
+ }),
2452
2756
  })
2453
2757
 
2454
2758
  const credential = Credential.from({
@@ -2563,7 +2867,11 @@ describe('tempo', () => {
2563
2867
  domain: Proof.domain(chain.id),
2564
2868
  types: Proof.types,
2565
2869
  primaryType: 'Proof',
2566
- message: Proof.message(challenge.id, challenge.realm),
2870
+ message: Proof.message({
2871
+ account: accounts[1].address,
2872
+ challengeId: challenge.id,
2873
+ realm: challenge.realm,
2874
+ }),
2567
2875
  })
2568
2876
 
2569
2877
  const credential = Credential.from({
@@ -2687,6 +2995,91 @@ describe('tempo', () => {
2687
2995
  },
2688
2996
  )
2689
2997
 
2998
+ test('behavior: rejects access-key proof replayed across a co-authorized account', async () => {
2999
+ // The same access key is authorized by two roots (`payer` and `other`),
3000
+ // so a proof bound to `payer` must not be claimable as `other` even
3001
+ // though `other` independently authorized the key.
3002
+ const payer = accounts[1]
3003
+ const other = accounts[2]
3004
+ const accessKey = Account.fromSecp256k1(Secp256k1.randomPrivateKey(), {
3005
+ access: payer,
3006
+ })
3007
+
3008
+ await fundAccount({ address: other.address, token: asset })
3009
+ await Actions.accessKey.authorizeSync(client, {
3010
+ account: payer,
3011
+ accessKey,
3012
+ feeToken: asset,
3013
+ })
3014
+ await Actions.accessKey.authorizeSync(client, {
3015
+ account: other,
3016
+ accessKey,
3017
+ feeToken: asset,
3018
+ })
3019
+
3020
+ const httpServer = await Http.createServer(async (req, res) => {
3021
+ const result = await Mppx_server.toNodeListener(
3022
+ server.charge({ amount: '0', decimals: 6 }),
3023
+ )(req, res)
3024
+ if (result.status === 402) return
3025
+ res.end('OK')
3026
+ })
3027
+
3028
+ try {
3029
+ const response1 = await fetch(httpServer.url)
3030
+ expect(response1.status).toBe(402)
3031
+
3032
+ const challenge = Challenge.fromResponse(response1, {
3033
+ methods: [tempo_client.charge()],
3034
+ })
3035
+
3036
+ // Access key signs a proof bound to `payer` (the `account` field).
3037
+ const signature = await signTypedData(client, {
3038
+ account: accessKey,
3039
+ domain: Proof.domain(chain.id),
3040
+ types: Proof.types,
3041
+ primaryType: 'Proof',
3042
+ message: Proof.message({
3043
+ account: payer.address,
3044
+ challengeId: challenge.id,
3045
+ realm: challenge.realm,
3046
+ }),
3047
+ })
3048
+
3049
+ // The bound payer accepts the proof.
3050
+ const accepted = await fetch(httpServer.url, {
3051
+ headers: {
3052
+ Authorization: Credential.serialize(
3053
+ Credential.from({
3054
+ challenge,
3055
+ payload: { signature, type: 'proof' as const },
3056
+ source: `did:pkh:eip155:${chain.id}:${payer.address}`,
3057
+ }),
3058
+ ),
3059
+ },
3060
+ })
3061
+ expect(accepted.status).toBe(200)
3062
+
3063
+ // Replaying the same proof as `other` is rejected by the wallet binding.
3064
+ const replay = await fetch(httpServer.url, {
3065
+ headers: {
3066
+ Authorization: Credential.serialize(
3067
+ Credential.from({
3068
+ challenge,
3069
+ payload: { signature, type: 'proof' as const },
3070
+ source: `did:pkh:eip155:${chain.id}:${other.address}`,
3071
+ }),
3072
+ ),
3073
+ },
3074
+ })
3075
+ expect(replay.status).toBe(402)
3076
+ const body = (await replay.json()) as { detail: string }
3077
+ expect(body.detail).toContain('Proof signature does not match source.')
3078
+ } finally {
3079
+ httpServer.close()
3080
+ }
3081
+ })
3082
+
2690
3083
  test('behavior: rejects replayed proof credential when store is configured', async () => {
2691
3084
  const replayStore = Store.memory()
2692
3085
  const server_ = Mppx_server.create({
@@ -2724,7 +3117,11 @@ describe('tempo', () => {
2724
3117
  domain: Proof.domain(chain.id),
2725
3118
  types: Proof.types,
2726
3119
  primaryType: 'Proof',
2727
- message: Proof.message(challenge.id, challenge.realm),
3120
+ message: Proof.message({
3121
+ account: accounts[1].address,
3122
+ challengeId: challenge.id,
3123
+ realm: challenge.realm,
3124
+ }),
2728
3125
  })
2729
3126
 
2730
3127
  const credential = Credential.from({
@@ -2785,7 +3182,11 @@ describe('tempo', () => {
2785
3182
  domain: Proof.domain(chain.id),
2786
3183
  types: Proof.types,
2787
3184
  primaryType: 'Proof',
2788
- message: Proof.message(challenge.id, challenge.realm),
3185
+ message: Proof.message({
3186
+ account: accounts[1].address,
3187
+ challengeId: challenge.id,
3188
+ realm: challenge.realm,
3189
+ }),
2789
3190
  })
2790
3191
 
2791
3192
  const credential = Credential.serialize(
@@ -2859,7 +3260,11 @@ describe('tempo', () => {
2859
3260
  domain: Proof.domain(chain.id),
2860
3261
  types: Proof.types,
2861
3262
  primaryType: 'Proof',
2862
- message: Proof.message(challenge.id, challenge.realm),
3263
+ message: Proof.message({
3264
+ account: accounts[1].address,
3265
+ challengeId: challenge.id,
3266
+ realm: challenge.realm,
3267
+ }),
2863
3268
  })
2864
3269
 
2865
3270
  const credential = Credential.from({
@@ -2922,7 +3327,11 @@ describe('tempo', () => {
2922
3327
  domain: Proof.domain(chain.id),
2923
3328
  types: Proof.types,
2924
3329
  primaryType: 'Proof',
2925
- message: Proof.message(challenge1.id, challenge1.realm),
3330
+ message: Proof.message({
3331
+ account: accounts[1].address,
3332
+ challengeId: challenge1.id,
3333
+ realm: challenge1.realm,
3334
+ }),
2926
3335
  })
2927
3336
 
2928
3337
  const credential1 = Credential.from({
@@ -2953,7 +3362,11 @@ describe('tempo', () => {
2953
3362
  domain: Proof.domain(chain.id),
2954
3363
  types: Proof.types,
2955
3364
  primaryType: 'Proof',
2956
- message: Proof.message(challenge2.id, challenge2.realm),
3365
+ message: Proof.message({
3366
+ account: accounts[1].address,
3367
+ challengeId: challenge2.id,
3368
+ realm: challenge2.realm,
3369
+ }),
2957
3370
  })
2958
3371
 
2959
3372
  const credential2 = Credential.from({
@@ -2990,7 +3403,11 @@ describe('tempo', () => {
2990
3403
  domain: Proof.domain(chain.id),
2991
3404
  types: Proof.types,
2992
3405
  primaryType: 'Proof',
2993
- message: Proof.message(challenge.id, challenge.realm),
3406
+ message: Proof.message({
3407
+ account: accounts[1].address,
3408
+ challengeId: challenge.id,
3409
+ realm: challenge.realm,
3410
+ }),
2994
3411
  })
2995
3412
 
2996
3413
  const credential = Credential.from({
@@ -3026,7 +3443,11 @@ describe('tempo', () => {
3026
3443
  domain: Proof.domain(chain.id),
3027
3444
  types: Proof.types,
3028
3445
  primaryType: 'Proof',
3029
- message: Proof.message(challenge.id, challenge.realm),
3446
+ message: Proof.message({
3447
+ account: accounts[1].address,
3448
+ challengeId: challenge.id,
3449
+ realm: challenge.realm,
3450
+ }),
3030
3451
  })
3031
3452
 
3032
3453
  const credential = Credential.from({
@@ -3125,7 +3546,11 @@ describe('tempo', () => {
3125
3546
  domain: Proof.domain(chain.id),
3126
3547
  types: Proof.types,
3127
3548
  primaryType: 'Proof',
3128
- message: Proof.message(challenge.id, challenge.realm),
3549
+ message: Proof.message({
3550
+ account: accounts[1].address,
3551
+ challengeId: challenge.id,
3552
+ realm: challenge.realm,
3553
+ }),
3129
3554
  })
3130
3555
 
3131
3556
  const credential = Credential.from({
@@ -3163,7 +3588,11 @@ describe('tempo', () => {
3163
3588
  domain: Proof.domain(chain.id),
3164
3589
  types: Proof.types,
3165
3590
  primaryType: 'Proof',
3166
- message: Proof.message(challenge.id, challenge.realm),
3591
+ message: Proof.message({
3592
+ account: accounts[1].address,
3593
+ challengeId: challenge.id,
3594
+ realm: challenge.realm,
3595
+ }),
3167
3596
  })
3168
3597
 
3169
3598
  const credential = Credential.from({
@@ -3202,7 +3631,11 @@ describe('tempo', () => {
3202
3631
  domain: Proof.domain(99999),
3203
3632
  types: Proof.types,
3204
3633
  primaryType: 'Proof',
3205
- message: Proof.message(challenge.id, challenge.realm),
3634
+ message: Proof.message({
3635
+ account: accounts[1].address,
3636
+ challengeId: challenge.id,
3637
+ realm: challenge.realm,
3638
+ }),
3206
3639
  })
3207
3640
 
3208
3641
  const credential = Credential.from({
@@ -3238,7 +3671,11 @@ describe('tempo', () => {
3238
3671
  domain: Proof.domain(chain.id),
3239
3672
  types: Proof.types,
3240
3673
  primaryType: 'Proof',
3241
- message: Proof.message(challenge.id, 'evil.example.com'),
3674
+ message: Proof.message({
3675
+ account: accounts[1].address,
3676
+ challengeId: challenge.id,
3677
+ realm: 'evil.example.com',
3678
+ }),
3242
3679
  })
3243
3680
 
3244
3681
  const credential = Credential.from({
@@ -3274,7 +3711,11 @@ describe('tempo', () => {
3274
3711
  domain: Proof.domain(chain.id),
3275
3712
  types: Proof.types,
3276
3713
  primaryType: 'Proof',
3277
- message: Proof.message(challenge.id, challenge.realm),
3714
+ message: Proof.message({
3715
+ account: accounts[1].address,
3716
+ challengeId: challenge.id,
3717
+ realm: challenge.realm,
3718
+ }),
3278
3719
  })
3279
3720
 
3280
3721
  const credential = Credential.from({
@@ -3310,7 +3751,11 @@ describe('tempo', () => {
3310
3751
  domain: Proof.domain(chain.id),
3311
3752
  types: Proof.types,
3312
3753
  primaryType: 'Proof',
3313
- message: Proof.message(challenge.id, challenge.realm),
3754
+ message: Proof.message({
3755
+ account: accounts[1].address,
3756
+ challengeId: challenge.id,
3757
+ realm: challenge.realm,
3758
+ }),
3314
3759
  })
3315
3760
 
3316
3761
  const credential = Credential.from({
@@ -4931,19 +5376,21 @@ describe('tempo', () => {
4931
5376
 
4932
5377
  describe('auto-swap', () => {
4933
5378
  // Use accounts[3] as payer with pathUsd only (no asset).
4934
- // Use accounts[4] as payer with zero balance.
4935
5379
  const swapPayer = accounts[3]!
4936
- const brokePayer = accounts[4]!
4937
5380
 
4938
5381
  beforeAll(async () => {
4939
5382
  // Fund swap payer with pathUsd only
4940
5383
  await fundAccount({ address: swapPayer.address, token: Addresses.pathUsd as Hex.Hex })
4941
5384
 
4942
5385
  // Seed DEX liquidity: create pair, then place a sell order for `asset`.
4943
- await Actions.dex.createPair(client, {
4944
- account: accounts[0]!,
4945
- base: asset,
4946
- })
5386
+ await Actions.dex
5387
+ .createPair(client, {
5388
+ account: accounts[0]!,
5389
+ base: asset,
5390
+ })
5391
+ .catch((error) => {
5392
+ if (!isPairAlreadyExistsError(error)) throw error
5393
+ })
4947
5394
  await fundAccount({ address: accounts[0]!.address, token: asset })
4948
5395
  await Actions.token.approveSync(client, {
4949
5396
  account: accounts[0]!,
@@ -5171,6 +5618,7 @@ describe('tempo', () => {
5171
5618
  })
5172
5619
 
5173
5620
  test('error: throws when no fallback currency has sufficient balance', async () => {
5621
+ const brokePayer = testAccount()
5174
5622
  const mppx = Mppx_client.create({
5175
5623
  polyfill: false,
5176
5624
  methods: [
@@ -5234,6 +5682,7 @@ describe('tempo', () => {
5234
5682
 
5235
5683
  test('error: throws when tokenIn list has no viable candidates', async () => {
5236
5684
  const bogusToken = '0x0000000000000000000000000000000000099999' as const
5685
+ const brokePayer = testAccount()
5237
5686
 
5238
5687
  const mppx = Mppx_client.create({
5239
5688
  polyfill: false,