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
@@ -2,6 +2,7 @@ import { Challenge, Credential } from 'mppx'
2
2
  import { createClient, http } from 'viem'
3
3
  import { privateKeyToAccount } from 'viem/accounts'
4
4
  import { tempoLocalnet } from 'viem/chains'
5
+ import { Account, Secp256k1 } from 'viem/tempo'
5
6
  import { describe, expect, test, vi } from 'vp/test'
6
7
 
7
8
  import * as Methods from '../Methods.js'
@@ -83,6 +84,178 @@ describe('tempo.charge client', () => {
83
84
  expect(credential.source).toBe(`did:pkh:eip155:${chainId}:${account.address}`)
84
85
  })
85
86
 
87
+ test('resolveAccount selects the transaction account from executable calls', async () => {
88
+ vi.resetModules()
89
+ const selectedAccount = privateKeyToAccount(
90
+ '0x0000000000000000000000000000000000000000000000000000000000000002',
91
+ )
92
+ const chainId = 42431
93
+ const calls: charge.ResolveAccountInfo[] = []
94
+ const prepareTransactionRequest = vi.fn(async () => ({}))
95
+ const signTransaction = vi.fn(async () => '0xdeadbeef')
96
+ vi.doMock('viem/actions', () => ({
97
+ prepareTransactionRequest,
98
+ sendCallsSync: vi.fn(),
99
+ signTransaction,
100
+ signTypedData: vi.fn(),
101
+ }))
102
+
103
+ try {
104
+ const { charge: chargeWithMockedActions } = await import('./Charge.js')
105
+ const client = createClient({
106
+ account,
107
+ chain: tempoLocalnet,
108
+ transport: http('http://127.0.0.1'),
109
+ })
110
+ const method = chargeWithMockedActions({
111
+ account,
112
+ getClient: () => client,
113
+ resolveAccount(info) {
114
+ calls.push(info)
115
+ return selectedAccount
116
+ },
117
+ })
118
+
119
+ const credential = Credential.deserialize(
120
+ await method.createCredential({
121
+ challenge: createChallenge({ amount: '1', chainId, supportedModes: ['pull'] }),
122
+ context: {},
123
+ }),
124
+ )
125
+
126
+ expect(calls).toHaveLength(1)
127
+ expect(calls[0]!.account.address).toBe(account.address)
128
+ expect(calls[0]!.chainId).toBe(chainId)
129
+ expect(calls[0]!.operation.kind).toBe('executeCalls')
130
+ if (calls[0]!.operation.kind !== 'executeCalls') throw new Error('expected executeCalls')
131
+ expect(calls[0]!.operation.calls).toHaveLength(1)
132
+ expect(calls[0]!.operation.calls?.[0]?.to.toLowerCase()).toBe(currency.toLowerCase())
133
+ expect(prepareTransactionRequest).toHaveBeenCalledOnce()
134
+ expect(signTransaction).toHaveBeenCalledOnce()
135
+ expect(credential.payload).toEqual({ signature: '0xdeadbeef', type: 'transaction' })
136
+ expect(credential.source).toBe(`did:pkh:eip155:${chainId}:${selectedAccount.address}`)
137
+ } finally {
138
+ vi.doUnmock('viem/actions')
139
+ vi.resetModules()
140
+ }
141
+ })
142
+
143
+ test('resolveAccount omits executable calls when auto-swap routing is account-dependent', async () => {
144
+ vi.resetModules()
145
+ const selectedAccount = privateKeyToAccount(
146
+ '0x0000000000000000000000000000000000000000000000000000000000000002',
147
+ )
148
+ const chainId = 42431
149
+ const calls: charge.ResolveAccountInfo[] = []
150
+ const prepareTransactionRequest = vi.fn(async () => ({}))
151
+ const signTransaction = vi.fn(async () => '0xdeadbeef')
152
+ const findCalls = vi.fn(async (_client: unknown, _parameters: { account: string }) => undefined)
153
+ vi.doMock('viem/actions', () => ({
154
+ prepareTransactionRequest,
155
+ sendCallsSync: vi.fn(),
156
+ signTransaction,
157
+ signTypedData: vi.fn(),
158
+ }))
159
+ vi.doMock('../internal/auto-swap.js', () => ({
160
+ defaultCurrencies: [currency],
161
+ findCalls,
162
+ resolve: vi.fn(() => ({ tokenIn: [currency], slippage: 1 })),
163
+ }))
164
+
165
+ try {
166
+ const { charge: chargeWithMockedActions } = await import('./Charge.js')
167
+ const client = createClient({
168
+ account,
169
+ chain: tempoLocalnet,
170
+ transport: http('http://127.0.0.1'),
171
+ })
172
+ const method = chargeWithMockedActions({
173
+ account,
174
+ autoSwap: true,
175
+ getClient: () => client,
176
+ resolveAccount(info) {
177
+ calls.push(info)
178
+ return selectedAccount
179
+ },
180
+ })
181
+
182
+ const credential = Credential.deserialize(
183
+ await method.createCredential({
184
+ challenge: createChallenge({ amount: '1', chainId, supportedModes: ['pull'] }),
185
+ context: {},
186
+ }),
187
+ )
188
+
189
+ expect(calls).toHaveLength(1)
190
+ expect(calls[0]!.operation.kind).toBe('executeCalls')
191
+ if (calls[0]!.operation.kind !== 'executeCalls') throw new Error('expected executeCalls')
192
+ expect(calls[0]!.operation.calls).toBeUndefined()
193
+ expect(findCalls).toHaveBeenCalledOnce()
194
+ expect(findCalls.mock.calls[0]?.[1].account).toBe(selectedAccount.address)
195
+ expect(credential.payload).toEqual({ signature: '0xdeadbeef', type: 'transaction' })
196
+ } finally {
197
+ vi.doUnmock('viem/actions')
198
+ vi.doUnmock('../internal/auto-swap.js')
199
+ vi.resetModules()
200
+ }
201
+ })
202
+
203
+ test('zero-amount proof binds to the root payer for an access-key account', async () => {
204
+ vi.resetModules()
205
+ // Capture the typed data so we can assert what the proof commits to.
206
+ let signedTypedData: { message: { account: string } } | undefined
207
+ const signTypedData = vi.fn(async (_client: unknown, parameters: typeof signedTypedData) => {
208
+ signedTypedData = parameters
209
+ return '0xdeadbeef'
210
+ })
211
+ vi.doMock('viem/actions', () => ({
212
+ prepareTransactionRequest: vi.fn(),
213
+ sendCallsSync: vi.fn(),
214
+ signTransaction: vi.fn(),
215
+ signTypedData,
216
+ }))
217
+
218
+ try {
219
+ const { charge: chargeWithMockedActions } = await import('./Charge.js')
220
+ const chainId = 42431
221
+ // An access-key account signs with its own key but reports the root
222
+ // account as `address`; the proof must bind to that root payer.
223
+ const accessKey = Account.fromSecp256k1(Secp256k1.randomPrivateKey(), {
224
+ access: account,
225
+ })
226
+ expect(accessKey.address).toBe(account.address)
227
+ expect(accessKey.accessKeyAddress).not.toBe(account.address)
228
+
229
+ const client = createClient({
230
+ account: accessKey,
231
+ chain: tempoLocalnet,
232
+ transport: http('http://127.0.0.1'),
233
+ })
234
+ const resolveAccount = vi.fn()
235
+ const method = chargeWithMockedActions({
236
+ account: accessKey,
237
+ getClient: () => client,
238
+ resolveAccount,
239
+ })
240
+
241
+ const credential = Credential.deserialize(
242
+ await method.createCredential({
243
+ challenge: createChallenge({ chainId }),
244
+ context: {},
245
+ }),
246
+ )
247
+
248
+ expect(signTypedData).toHaveBeenCalledOnce()
249
+ expect(resolveAccount).not.toHaveBeenCalled()
250
+ expect(signedTypedData?.message.account).toBe(account.address)
251
+ expect(credential.payload).toEqual({ signature: '0xdeadbeef', type: 'proof' })
252
+ expect(credential.source).toBe(`did:pkh:eip155:${chainId}:${account.address}`)
253
+ } finally {
254
+ vi.doUnmock('viem/actions')
255
+ vi.resetModules()
256
+ }
257
+ })
258
+
86
259
  test('uses challenge chainId for non-zero transaction source', async () => {
87
260
  vi.resetModules()
88
261
  const prepareTransactionRequest = vi.fn(async () => ({}))
@@ -123,4 +296,89 @@ describe('tempo.charge client', () => {
123
296
  vi.resetModules()
124
297
  }
125
298
  })
299
+
300
+ describe('chain pinning', () => {
301
+ const client = createClient({
302
+ account,
303
+ chain: tempoLocalnet,
304
+ transport: http('http://127.0.0.1'),
305
+ })
306
+
307
+ test('rejects a challenge whose chainId conflicts with the pin', async () => {
308
+ const getClient = vi.fn(() => client)
309
+ const method = charge({
310
+ account,
311
+ expectedChainId: 42431,
312
+ getClient,
313
+ })
314
+
315
+ await expect(
316
+ method.createCredential({
317
+ challenge: createChallenge({ chainId: 1 }),
318
+ context: {},
319
+ }),
320
+ ).rejects.toThrow('Chain ID mismatch: expected 42431, got 1.')
321
+
322
+ // The mismatch is rejected before resolving a client or signing.
323
+ expect(getClient).not.toHaveBeenCalled()
324
+ })
325
+
326
+ test('accepts a challenge whose chainId matches the pin', async () => {
327
+ const chainId = 42431
328
+ const method = charge({
329
+ account,
330
+ expectedChainId: chainId,
331
+ getClient: () => client,
332
+ })
333
+
334
+ const credential = Credential.deserialize(
335
+ await method.createCredential({
336
+ challenge: createChallenge({ chainId }),
337
+ context: {},
338
+ }),
339
+ )
340
+
341
+ expect(credential.source).toBe(`did:pkh:eip155:${chainId}:${account.address}`)
342
+ })
343
+
344
+ test('signs on the pin when the challenge omits chainId', async () => {
345
+ let requestedChainId: number | undefined
346
+ const chainId = 42431
347
+ const method = charge({
348
+ account,
349
+ expectedChainId: chainId,
350
+ getClient: (parameters) => {
351
+ requestedChainId = parameters.chainId
352
+ return client
353
+ },
354
+ })
355
+
356
+ const credential = Credential.deserialize(
357
+ await method.createCredential({
358
+ challenge: createChallenge(),
359
+ context: {},
360
+ }),
361
+ )
362
+
363
+ expect(requestedChainId).toBe(chainId)
364
+ expect(credential.source).toBe(`did:pkh:eip155:${chainId}:${account.address}`)
365
+ })
366
+
367
+ test('unpinned client accepts any challenge chainId', async () => {
368
+ const chainId = 1
369
+ const method = charge({
370
+ account,
371
+ getClient: () => client,
372
+ })
373
+
374
+ const credential = Credential.deserialize(
375
+ await method.createCredential({
376
+ challenge: createChallenge({ chainId }),
377
+ context: {},
378
+ }),
379
+ )
380
+
381
+ expect(credential.source).toBe(`did:pkh:eip155:${chainId}:${account.address}`)
382
+ })
383
+ })
126
384
  })
@@ -20,6 +20,20 @@ import * as Charge_internal from '../internal/charge.js'
20
20
  import * as defaults from '../internal/defaults.js'
21
21
  import * as Proof from '../internal/proof.js'
22
22
  import * as Methods from '../Methods.js'
23
+ import type * as AccountResolution from './ResolveAccount.js'
24
+
25
+ /** Runtime context accepted by the Tempo charge client method. */
26
+ export type ChargeContext = {
27
+ account?: Account.getResolver.Parameters['account'] | undefined
28
+ autoSwap?: AutoSwap.resolve.Value | undefined
29
+ mode?: Methods.ChargeMode | undefined
30
+ }
31
+
32
+ const chargeContextSchema = z.object({
33
+ account: z.optional(z.custom<ChargeContext['account']>()),
34
+ autoSwap: z.optional(z.custom<ChargeContext['autoSwap']>()),
35
+ mode: z.optional(z.enum(Methods.chargeModes)),
36
+ })
23
37
 
24
38
  /**
25
39
  * Creates a Tempo charge method intent for usage on the client.
@@ -44,37 +58,50 @@ export function charge(parameters: charge.Parameters = {}) {
44
58
  const getAccount = Account.getResolver({ account: parameters.account })
45
59
 
46
60
  return Method.toClient(Methods.charge, {
47
- context: z.object({
48
- account: z.optional(z.custom<Account.getResolver.Parameters['account']>()),
49
- autoSwap: z.optional(z.custom<charge.AutoSwap>()),
50
- mode: z.optional(z.enum(Methods.chargeModes)),
51
- }),
61
+ context: chargeContextSchema,
52
62
 
53
63
  async createCredential({ challenge, context }) {
64
+ // Chain pinning: reject a challenge whose chain ID conflicts with the
65
+ // pinned one, and sign on the pin when the challenge omits a chain ID.
54
66
  const challengeChainId = challenge.request.methodDetails?.chainId
55
- const client = await getClient({ chainId: challengeChainId })
56
- const chainId = challengeChainId ?? client.chain?.id
67
+ if (
68
+ parameters.expectedChainId !== undefined &&
69
+ challengeChainId !== undefined &&
70
+ challengeChainId !== parameters.expectedChainId
71
+ )
72
+ throw new Error(
73
+ `Chain ID mismatch: expected ${parameters.expectedChainId}, got ${challengeChainId}.`,
74
+ )
75
+ const resolvedChainId = challengeChainId ?? parameters.expectedChainId
76
+ const client = await getClient({ chainId: resolvedChainId })
77
+ const chainId = resolvedChainId ?? client.chain?.id
57
78
  if (chainId === undefined)
58
79
  throw new Error('No `chainId` provided. Pass a chain ID in the challenge or client.')
59
80
 
60
- const account = getAccount(client, context)
61
-
62
81
  const { request } = challenge
63
82
  const { amount, methodDetails } = request
83
+ const supportedModes = (methodDetails?.supportedModes as
84
+ | readonly Methods.ChargeMode[]
85
+ | undefined) ?? ['pull', 'push']
86
+ const defaultAccount = getAccount(client, context)
64
87
 
65
88
  // Zero-amount: sign EIP-712 typed data instead of creating a transaction.
66
89
  if (BigInt(amount) === 0n) {
67
90
  const signature = await signTypedData(client, {
68
- account,
69
- domain: Proof.domain(chainId),
70
- types: Proof.types,
71
- primaryType: 'Proof',
72
- message: Proof.message(challenge.id, challenge.realm),
91
+ account: defaultAccount,
92
+ // `account` here is the signing account; the proof's bound payer is
93
+ // `account.address` (echoed in the credential `source` below).
94
+ ...Proof.typedData({
95
+ account: defaultAccount.address,
96
+ chainId,
97
+ challengeId: challenge.id,
98
+ realm: challenge.realm,
99
+ }),
73
100
  })
74
101
  return Credential.serialize({
75
102
  challenge,
76
103
  payload: { signature, type: 'proof' },
77
- source: Proof.proofSource({ address: account.address, chainId }),
104
+ source: Proof.proofSource({ address: defaultAccount.address, chainId }),
78
105
  })
79
106
  }
80
107
 
@@ -89,22 +116,6 @@ export function charge(parameters: charge.Parameters = {}) {
89
116
  }
90
117
  }
91
118
  }
92
- const supportedModes = (methodDetails?.supportedModes as
93
- | readonly Methods.ChargeMode[]
94
- | undefined) ?? ['pull', 'push']
95
- const mode = (() => {
96
- const explicitMode = context?.mode ?? parameters.mode
97
- if (explicitMode) {
98
- if (!supportedModes.includes(explicitMode))
99
- throw new Error(`Challenge does not support ${explicitMode} mode.`)
100
- return explicitMode
101
- }
102
-
103
- const preferredMode = account.type === 'json-rpc' ? 'push' : 'pull'
104
- if (supportedModes.includes(preferredMode)) return preferredMode
105
- return supportedModes[0]!
106
- })()
107
-
108
119
  const memo = methodDetails?.memo
109
120
  ? (methodDetails.memo as Hex.Hex)
110
121
  : Attribution.encode({ challengeId: challenge.id, clientId, serverId: challenge.realm })
@@ -116,13 +127,14 @@ export function charge(parameters: charge.Parameters = {}) {
116
127
  },
117
128
  recipient: request.recipient as Address,
118
129
  })
119
- const transferCalls = transfers.map((transfer) =>
120
- Actions.token.transfer.call({
121
- amount: BigInt(transfer.amount),
122
- ...(transfer.memo && { memo: transfer.memo as Hex.Hex }),
123
- to: transfer.recipient as Address,
124
- token: currency,
125
- }),
130
+ const transferCalls = transfers.map(
131
+ (transfer): AccountResolution.ResolveAccountCall =>
132
+ Actions.token.transfer.call({
133
+ amount: BigInt(transfer.amount),
134
+ ...(transfer.memo && { memo: transfer.memo as Hex.Hex }),
135
+ to: transfer.recipient as Address,
136
+ token: currency,
137
+ }) as AccountResolution.ResolveAccountCall,
126
138
  )
127
139
 
128
140
  const autoSwap = AutoSwap.resolve(
@@ -130,6 +142,29 @@ export function charge(parameters: charge.Parameters = {}) {
130
142
  AutoSwap.defaultCurrencies,
131
143
  )
132
144
 
145
+ const account =
146
+ (await parameters.resolveAccount?.({
147
+ account: defaultAccount,
148
+ chainId,
149
+ operation: {
150
+ kind: 'executeCalls',
151
+ ...(autoSwap ? {} : { calls: transferCalls }),
152
+ },
153
+ })) ?? defaultAccount
154
+
155
+ const mode = (() => {
156
+ const explicitMode = context?.mode ?? parameters.mode
157
+ if (explicitMode) {
158
+ if (!supportedModes.includes(explicitMode))
159
+ throw new Error(`Challenge does not support ${explicitMode} mode.`)
160
+ return explicitMode
161
+ }
162
+
163
+ const preferredMode = account.type === 'json-rpc' ? 'push' : 'pull'
164
+ if (supportedModes.includes(preferredMode)) return preferredMode
165
+ return supportedModes[0]!
166
+ })()
167
+
133
168
  const swapCalls = autoSwap
134
169
  ? await AutoSwap.findCalls(client, {
135
170
  account: account.address,
@@ -187,6 +222,9 @@ export function charge(parameters: charge.Parameters = {}) {
187
222
 
188
223
  export declare namespace charge {
189
224
  type AutoSwap = AutoSwap.resolve.Value
225
+ type Context = ChargeContext
226
+ type ResolveAccount = AccountResolution.ResolveAccount
227
+ type ResolveAccountInfo = AccountResolution.ResolveAccountInfo
190
228
 
191
229
  type Parameters = {
192
230
  /**
@@ -198,6 +236,12 @@ export declare namespace charge {
198
236
  autoSwap?: AutoSwap | undefined
199
237
  /** Client identifier used to derive the client fingerprint in attribution memos. */
200
238
  clientId?: string | undefined
239
+ /**
240
+ * Chain ID this client is willing to pay on. When set, the client rejects
241
+ * any challenge whose `methodDetails.chainId` differs, and signs on this
242
+ * chain when the challenge omits a chain ID.
243
+ */
244
+ expectedChainId?: number | undefined
201
245
  /**
202
246
  * Allowlist of expected split recipient addresses. When set, the client
203
247
  * rejects any challenge whose split recipients are not in this list.
@@ -215,6 +259,8 @@ export declare namespace charge {
215
259
  * @default `'push'` for JSON-RPC accounts, `'pull'` for local accounts.
216
260
  */
217
261
  mode?: Methods.ChargeMode | undefined
262
+ /** Selects the account that signs this charge after the challenge and chain are known. */
263
+ resolveAccount?: ResolveAccount | undefined
218
264
  } & Account.getResolver.Parameters &
219
265
  Client.getResolver.Parameters
220
266
  }
@@ -1,31 +1,45 @@
1
+ import {
2
+ session as sessionLegacyIntent_,
3
+ sessionManager as sessionLegacy_,
4
+ } from '../legacy/client/index.js'
5
+ import { session as sessionMethod_ } from '../session/client/Session.js'
6
+ import { sessionManager as session_ } from '../session/client/SessionManager.js'
1
7
  import { charge as charge_ } from './Charge.js'
2
- import { session as sessionIntent_ } from './Session.js'
3
- import { sessionManager as session_ } from './SessionManager.js'
4
8
  import { subscription as subscription_ } from './Subscription.js'
5
9
 
10
+ const sessionClient = Object.assign(sessionMethod_, { manager: session_ })
11
+ const sessionLegacyClient = Object.assign(sessionLegacy_, { method: sessionLegacyIntent_ })
12
+
13
+ /** Creates a TIP-1034 client method, with explicit managed lifecycle helpers attached. */
14
+ export { sessionClient as session }
15
+
6
16
  /**
7
- * Creates both Tempo `charge` and `session` client methods from shared parameters.
17
+ * Creates the common Tempo `charge` and `session` client methods from shared parameters.
8
18
  *
9
19
  * @example
10
20
  * ```ts
11
21
  * import { Mppx, tempo } from 'mppx/client'
12
22
  *
13
23
  * const mppx = Mppx.create({
14
- * methods: [tempo({ account })],
24
+ * methods: [tempo.common({ account })],
15
25
  * })
16
26
  * ```
17
27
  */
18
28
  export function tempo(parameters: tempo.Parameters = {}) {
19
- return [charge_(parameters), sessionIntent_(parameters)] as const
29
+ return [charge_(parameters), sessionClient(parameters)] as const
20
30
  }
21
31
 
22
32
  export namespace tempo {
23
- export type Parameters = charge_.Parameters & sessionIntent_.Parameters
33
+ export type Parameters = charge_.Parameters & sessionMethod_.Parameters
24
34
 
25
35
  /** Creates a Tempo `charge` client method for one-time TIP-20 token transfers. */
26
36
  export const charge = charge_
27
- /** Creates a client-side streaming session for managing payment channels. */
28
- export const session = session_
37
+ /** Creates the common Tempo `charge` and `session` client methods from shared parameters. */
38
+ export const common = tempo
39
+ /** Creates a TIP-1034 client method for Mppx registration. Use `tempo.session.manager()` for direct lifecycle control. */
40
+ export const session = sessionClient
41
+ /** @deprecated Use `tempo.session()` for the TIP-1034 session client method. */
42
+ export const sessionLegacy = sessionLegacyClient
29
43
  /** Creates a Tempo `subscription` client method for recurring TIP-20 payments. */
30
44
  export const subscription = subscription_
31
45
  }
@@ -0,0 +1,46 @@
1
+ import type * as Hex from 'ox/Hex'
2
+ import type { Account, Address } from 'viem'
3
+
4
+ import type { MaybePromise } from '../../internal/types.js'
5
+
6
+ /** Resolves the account that should satisfy an mppx account operation. */
7
+ export type ResolveAccount = (info: ResolveAccountInfo) => MaybePromise<Account | undefined>
8
+
9
+ /** Account-resolution details for a client credential operation. */
10
+ export type ResolveAccountInfo = {
11
+ /** Account mppx will use when the hook returns `undefined`. */
12
+ account: Account
13
+ /** EIP-155 chain ID used for the operation. */
14
+ chainId: number
15
+ /** Capability the selected account must satisfy. */
16
+ operation: ResolveAccountOperation
17
+ }
18
+
19
+ /** Capability an mppx-selected account must satisfy. */
20
+ export type ResolveAccountOperation =
21
+ | {
22
+ kind: 'executeCalls'
23
+ /**
24
+ * Exact EVM calls the selected account will execute.
25
+ *
26
+ * Omitted when the calls depend on which account is selected, such as
27
+ * account-balance-dependent auto-swap routing.
28
+ */
29
+ calls?: readonly ResolveAccountCall[] | undefined
30
+ }
31
+ | {
32
+ kind: 'authorizePaymentChannel'
33
+ /**
34
+ * Signer required by an existing reusable channel. Omitted when opening
35
+ * a new channel or when no existing channel has fixed a signer yet.
36
+ */
37
+ authority?: Address | undefined
38
+ }
39
+
40
+ /** EVM call data used by account resolvers for scoped account selection. */
41
+ export type ResolveAccountCall = {
42
+ /** Contract address being called. */
43
+ to: Address
44
+ /** Calldata being sent. */
45
+ data: Hex.Hex
46
+ }
@@ -1,6 +1,17 @@
1
1
  export { charge } from './Charge.js'
2
- export { tempo } from './Methods.js'
3
- export { session } from './Session.js'
2
+ export { session, tempo } from './Methods.js'
3
+ export { session as sessionLegacy } from '../legacy/client/index.js'
4
4
  export { subscription } from './Subscription.js'
5
- export type { PaymentResponse, SessionManager } from './SessionManager.js'
6
- export { sessionManager } from './SessionManager.js'
5
+ export type {
6
+ PaymentResponse as SessionLegacyPaymentResponse,
7
+ SessionManager as SessionLegacyManager,
8
+ } from '../legacy/client/index.js'
9
+ export { sessionManager as sessionLegacyManager } from '../legacy/client/index.js'
10
+ export { session as sessionMethod } from '../session/client/Session.js'
11
+ export type {
12
+ PaymentResponse,
13
+ SessionManager,
14
+ SessionManagerSseOptions,
15
+ SessionManagerWebSocketOptions,
16
+ } from '../session/client/SessionManager.js'
17
+ export { sessionManager } from '../session/client/SessionManager.js'
@@ -1,4 +1,5 @@
1
1
  export * as Proof from './Proof.js'
2
2
  export * as Methods from './Methods.js'
3
3
  export * as Session from './session/index.js'
4
+ export * as SessionLegacy from './legacy/index.js'
4
5
  export * as Subscription from './subscription/index.js'