@absol-labs/agent 0.11.0 → 0.12.0-rc.2

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 (366) hide show
  1. package/README.md +43 -51
  2. package/dist/capability/invocation-capability.d.ts +2 -2
  3. package/dist/capability/probe-capability.d.ts +225 -0
  4. package/dist/capability/probe-capability.d.ts.map +1 -0
  5. package/dist/capability/probe-capability.js +248 -0
  6. package/dist/capability/probe-capability.js.map +1 -0
  7. package/dist/cli/args.d.ts +11 -0
  8. package/dist/cli/args.d.ts.map +1 -1
  9. package/dist/cli/args.js +23 -0
  10. package/dist/cli/args.js.map +1 -1
  11. package/dist/cli/commands/claim.d.ts +32 -0
  12. package/dist/cli/commands/claim.d.ts.map +1 -1
  13. package/dist/cli/commands/claim.js +116 -28
  14. package/dist/cli/commands/claim.js.map +1 -1
  15. package/dist/cli/commands/close.d.ts.map +1 -1
  16. package/dist/cli/commands/close.js +35 -3
  17. package/dist/cli/commands/close.js.map +1 -1
  18. package/dist/cli/commands/invoke.d.ts +2 -0
  19. package/dist/cli/commands/invoke.d.ts.map +1 -1
  20. package/dist/cli/commands/invoke.js +2 -2
  21. package/dist/cli/commands/invoke.js.map +1 -1
  22. package/dist/cli/commands/mcp.d.ts.map +1 -1
  23. package/dist/cli/commands/mcp.js +15 -2
  24. package/dist/cli/commands/mcp.js.map +1 -1
  25. package/dist/cli/commands/open.d.ts.map +1 -1
  26. package/dist/cli/commands/open.js +58 -4
  27. package/dist/cli/commands/open.js.map +1 -1
  28. package/dist/cli/commands/pay.d.ts +34 -0
  29. package/dist/cli/commands/pay.d.ts.map +1 -0
  30. package/dist/cli/commands/pay.js +479 -0
  31. package/dist/cli/commands/pay.js.map +1 -0
  32. package/dist/cli/commands/reclaim-unverified.d.ts.map +1 -1
  33. package/dist/cli/commands/reclaim-unverified.js +3 -2
  34. package/dist/cli/commands/reclaim-unverified.js.map +1 -1
  35. package/dist/cli/commands/reclaim.d.ts +23 -2
  36. package/dist/cli/commands/reclaim.d.ts.map +1 -1
  37. package/dist/cli/commands/reclaim.js +204 -20
  38. package/dist/cli/commands/reclaim.js.map +1 -1
  39. package/dist/cli/commands/refund.d.ts +31 -0
  40. package/dist/cli/commands/refund.d.ts.map +1 -0
  41. package/dist/cli/commands/refund.js +397 -0
  42. package/dist/cli/commands/refund.js.map +1 -0
  43. package/dist/cli/commands/status.d.ts.map +1 -1
  44. package/dist/cli/commands/status.js +21 -2
  45. package/dist/cli/commands/status.js.map +1 -1
  46. package/dist/cli/commands/streams.js +8 -12
  47. package/dist/cli/commands/streams.js.map +1 -1
  48. package/dist/cli/commands/watch.d.ts.map +1 -1
  49. package/dist/cli/commands/watch.js +4 -1
  50. package/dist/cli/commands/watch.js.map +1 -1
  51. package/dist/cli/config.d.ts +44 -26
  52. package/dist/cli/config.d.ts.map +1 -1
  53. package/dist/cli/config.js +88 -38
  54. package/dist/cli/config.js.map +1 -1
  55. package/dist/cli/context.d.ts +19 -0
  56. package/dist/cli/context.d.ts.map +1 -1
  57. package/dist/cli/deps.d.ts +53 -0
  58. package/dist/cli/deps.d.ts.map +1 -1
  59. package/dist/cli/deps.js +51 -1
  60. package/dist/cli/deps.js.map +1 -1
  61. package/dist/cli/errors.d.ts.map +1 -1
  62. package/dist/cli/errors.js +21 -1
  63. package/dist/cli/errors.js.map +1 -1
  64. package/dist/cli/escape-hatch.d.ts +6 -4
  65. package/dist/cli/escape-hatch.d.ts.map +1 -1
  66. package/dist/cli/escape-hatch.js +6 -2
  67. package/dist/cli/escape-hatch.js.map +1 -1
  68. package/dist/cli/listings.d.ts +18 -0
  69. package/dist/cli/listings.d.ts.map +1 -1
  70. package/dist/cli/listings.js +22 -12
  71. package/dist/cli/listings.js.map +1 -1
  72. package/dist/cli/preflight.d.ts +20 -14
  73. package/dist/cli/preflight.d.ts.map +1 -1
  74. package/dist/cli/preflight.js +34 -20
  75. package/dist/cli/preflight.js.map +1 -1
  76. package/dist/cli/privy.d.ts.map +1 -1
  77. package/dist/cli/privy.js +4 -2
  78. package/dist/cli/privy.js.map +1 -1
  79. package/dist/cli/progress.d.ts +13 -1
  80. package/dist/cli/progress.d.ts.map +1 -1
  81. package/dist/cli/progress.js +7 -1
  82. package/dist/cli/progress.js.map +1 -1
  83. package/dist/cli/reclaimability.d.ts +82 -0
  84. package/dist/cli/reclaimability.d.ts.map +1 -0
  85. package/dist/cli/reclaimability.js +80 -0
  86. package/dist/cli/reclaimability.js.map +1 -0
  87. package/dist/cli/run.d.ts +2 -1
  88. package/dist/cli/run.d.ts.map +1 -1
  89. package/dist/cli/run.js +62 -21
  90. package/dist/cli/run.js.map +1 -1
  91. package/dist/cli/scan-range.d.ts +2 -2
  92. package/dist/cli/scan-range.js +2 -2
  93. package/dist/cli/status.d.ts +106 -1
  94. package/dist/cli/status.d.ts.map +1 -1
  95. package/dist/cli/status.js +325 -44
  96. package/dist/cli/status.js.map +1 -1
  97. package/dist/cli/wallet.d.ts +2 -2
  98. package/dist/cli/wallet.d.ts.map +1 -1
  99. package/dist/cli/wallet.js +29 -5
  100. package/dist/cli/wallet.js.map +1 -1
  101. package/dist/discovery/rate-band.d.ts +74 -0
  102. package/dist/discovery/rate-band.d.ts.map +1 -0
  103. package/dist/discovery/rate-band.js +114 -0
  104. package/dist/discovery/rate-band.js.map +1 -0
  105. package/dist/escrow-generation.d.ts +81 -0
  106. package/dist/escrow-generation.d.ts.map +1 -0
  107. package/dist/escrow-generation.js +76 -0
  108. package/dist/escrow-generation.js.map +1 -0
  109. package/dist/frameworks/agentkit.d.ts +8 -4
  110. package/dist/frameworks/agentkit.d.ts.map +1 -1
  111. package/dist/frameworks/agentkit.js +27 -10
  112. package/dist/frameworks/agentkit.js.map +1 -1
  113. package/dist/frameworks/eliza.d.ts +3 -3
  114. package/dist/frameworks/eliza.d.ts.map +1 -1
  115. package/dist/frameworks/eliza.js +15 -6
  116. package/dist/frameworks/eliza.js.map +1 -1
  117. package/dist/frameworks/langchain.d.ts.map +1 -1
  118. package/dist/frameworks/langchain.js +8 -0
  119. package/dist/frameworks/langchain.js.map +1 -1
  120. package/dist/gateway/caller-auth-gateway.d.ts +83 -31
  121. package/dist/gateway/caller-auth-gateway.d.ts.map +1 -1
  122. package/dist/gateway/caller-auth-gateway.js +180 -27
  123. package/dist/gateway/caller-auth-gateway.js.map +1 -1
  124. package/dist/gateway/http-server.d.ts +128 -44
  125. package/dist/gateway/http-server.d.ts.map +1 -1
  126. package/dist/gateway/http-server.js +506 -155
  127. package/dist/gateway/http-server.js.map +1 -1
  128. package/dist/gateway/probe-auth.d.ts +112 -0
  129. package/dist/gateway/probe-auth.d.ts.map +1 -0
  130. package/dist/gateway/probe-auth.js +127 -0
  131. package/dist/gateway/probe-auth.js.map +1 -0
  132. package/dist/gateway/signed-rate-bounds.d.ts +51 -0
  133. package/dist/gateway/signed-rate-bounds.d.ts.map +1 -0
  134. package/dist/gateway/signed-rate-bounds.js +94 -0
  135. package/dist/gateway/signed-rate-bounds.js.map +1 -0
  136. package/dist/gateway/x402-opener-mode.d.ts +252 -0
  137. package/dist/gateway/x402-opener-mode.d.ts.map +1 -0
  138. package/dist/gateway/x402-opener-mode.js +772 -0
  139. package/dist/gateway/x402-opener-mode.js.map +1 -0
  140. package/dist/index.d.ts +6 -2
  141. package/dist/index.d.ts.map +1 -1
  142. package/dist/index.js +10 -5
  143. package/dist/index.js.map +1 -1
  144. package/dist/mcp/server.d.ts +64 -1
  145. package/dist/mcp/server.d.ts.map +1 -1
  146. package/dist/mcp/server.js +247 -37
  147. package/dist/mcp/server.js.map +1 -1
  148. package/dist/mcp/x402-tools.d.ts +109 -0
  149. package/dist/mcp/x402-tools.d.ts.map +1 -0
  150. package/dist/mcp/x402-tools.js +554 -0
  151. package/dist/mcp/x402-tools.js.map +1 -0
  152. package/dist/network.d.ts +119 -0
  153. package/dist/network.d.ts.map +1 -0
  154. package/dist/network.js +199 -0
  155. package/dist/network.js.map +1 -0
  156. package/dist/sdk/client.d.ts +13 -0
  157. package/dist/sdk/client.d.ts.map +1 -1
  158. package/dist/sdk/client.js +15 -0
  159. package/dist/sdk/client.js.map +1 -1
  160. package/dist/sdk/invoke.d.ts +4 -0
  161. package/dist/sdk/invoke.d.ts.map +1 -1
  162. package/dist/sdk/invoke.js +2 -5
  163. package/dist/sdk/invoke.js.map +1 -1
  164. package/dist/wallet/autonomous-wallet-broker.d.ts +3 -0
  165. package/dist/wallet/autonomous-wallet-broker.d.ts.map +1 -1
  166. package/dist/wallet/autonomous-wallet-broker.js +27 -23
  167. package/dist/wallet/autonomous-wallet-broker.js.map +1 -1
  168. package/dist/wallet/autonomous-wallet-protocol.d.ts +8 -2
  169. package/dist/wallet/autonomous-wallet-protocol.d.ts.map +1 -1
  170. package/dist/wallet/autonomous-wallet-protocol.js +9 -2
  171. package/dist/wallet/autonomous-wallet-protocol.js.map +1 -1
  172. package/dist/wallet/autonomous-wallet.d.ts.map +1 -1
  173. package/dist/wallet/autonomous-wallet.js +3 -2
  174. package/dist/wallet/autonomous-wallet.js.map +1 -1
  175. package/dist/wallet/broker-escrows.d.ts +222 -0
  176. package/dist/wallet/broker-escrows.d.ts.map +1 -0
  177. package/dist/wallet/broker-escrows.js +36 -0
  178. package/dist/wallet/broker-escrows.js.map +1 -0
  179. package/dist/wallet/lifecycle.d.ts +21 -5
  180. package/dist/wallet/lifecycle.d.ts.map +1 -1
  181. package/dist/wallet/lifecycle.js +32 -12
  182. package/dist/wallet/lifecycle.js.map +1 -1
  183. package/dist/wallet/privy-broker-server.d.ts.map +1 -1
  184. package/dist/wallet/privy-broker-server.js +31 -26
  185. package/dist/wallet/privy-broker-server.js.map +1 -1
  186. package/dist/wallet/privy-session-broker.d.ts +14 -5
  187. package/dist/wallet/privy-session-broker.d.ts.map +1 -1
  188. package/dist/wallet/privy-session-broker.js +29 -17
  189. package/dist/wallet/privy-session-broker.js.map +1 -1
  190. package/dist/wallet/privy-session-provider.d.ts +3 -1
  191. package/dist/wallet/privy-session-provider.d.ts.map +1 -1
  192. package/dist/wallet/privy-session-provider.js +5 -3
  193. package/dist/wallet/privy-session-provider.js.map +1 -1
  194. package/dist/wallet/provider.d.ts.map +1 -1
  195. package/dist/wallet/provider.js +15 -8
  196. package/dist/wallet/provider.js.map +1 -1
  197. package/dist/x402/facilitator.d.ts +3 -30
  198. package/dist/x402/facilitator.d.ts.map +1 -1
  199. package/dist/x402/facilitator.js +0 -27
  200. package/dist/x402/facilitator.js.map +1 -1
  201. package/dist/x402-buyer/guarded-fetch.d.ts +51 -0
  202. package/dist/x402-buyer/guarded-fetch.d.ts.map +1 -0
  203. package/dist/x402-buyer/guarded-fetch.js +147 -0
  204. package/dist/x402-buyer/guarded-fetch.js.map +1 -0
  205. package/dist/x402-buyer/index.d.ts +10 -0
  206. package/dist/x402-buyer/index.d.ts.map +1 -0
  207. package/dist/x402-buyer/index.js +10 -0
  208. package/dist/x402-buyer/index.js.map +1 -0
  209. package/dist/x402-buyer/pay.d.ts +157 -0
  210. package/dist/x402-buyer/pay.d.ts.map +1 -0
  211. package/dist/x402-buyer/pay.js +366 -0
  212. package/dist/x402-buyer/pay.js.map +1 -0
  213. package/dist/x402-opener/abi.d.ts +684 -0
  214. package/dist/x402-opener/abi.d.ts.map +1 -0
  215. package/dist/x402-opener/abi.js +880 -0
  216. package/dist/x402-opener/abi.js.map +1 -0
  217. package/dist/x402-opener/facilitator-entry.d.ts +3 -0
  218. package/dist/x402-opener/facilitator-entry.d.ts.map +1 -0
  219. package/dist/x402-opener/facilitator-entry.js +40 -0
  220. package/dist/x402-opener/facilitator-entry.js.map +1 -0
  221. package/dist/x402-opener/facilitator-server.d.ts +209 -0
  222. package/dist/x402-opener/facilitator-server.d.ts.map +1 -0
  223. package/dist/x402-opener/facilitator-server.js +762 -0
  224. package/dist/x402-opener/facilitator-server.js.map +1 -0
  225. package/dist/x402-opener/index.d.ts +14 -0
  226. package/dist/x402-opener/index.d.ts.map +1 -0
  227. package/dist/x402-opener/index.js +14 -0
  228. package/dist/x402-opener/index.js.map +1 -0
  229. package/dist/x402-opener/listing-resolver.d.ts +55 -0
  230. package/dist/x402-opener/listing-resolver.d.ts.map +1 -0
  231. package/dist/x402-opener/listing-resolver.js +125 -0
  232. package/dist/x402-opener/listing-resolver.js.map +1 -0
  233. package/dist/x402-opener/refund-relay.d.ts +266 -0
  234. package/dist/x402-opener/refund-relay.d.ts.map +1 -0
  235. package/dist/x402-opener/refund-relay.js +1341 -0
  236. package/dist/x402-opener/refund-relay.js.map +1 -0
  237. package/dist/x402-opener/relayer-queue.d.ts +14 -0
  238. package/dist/x402-opener/relayer-queue.d.ts.map +1 -0
  239. package/dist/x402-opener/relayer-queue.js +18 -0
  240. package/dist/x402-opener/relayer-queue.js.map +1 -0
  241. package/dist/x402-opener/scheme.d.ts +296 -0
  242. package/dist/x402-opener/scheme.d.ts.map +1 -0
  243. package/dist/x402-opener/scheme.js +1035 -0
  244. package/dist/x402-opener/scheme.js.map +1 -0
  245. package/dist/x402-opener/terms.d.ts +165 -0
  246. package/dist/x402-opener/terms.d.ts.map +1 -0
  247. package/dist/x402-opener/terms.js +304 -0
  248. package/dist/x402-opener/terms.js.map +1 -0
  249. package/dist/zktls/reclaim.d.ts +2 -2
  250. package/dist/zktls/t2-delivery-proof.d.ts +6 -6
  251. package/docs/agent-layer.md +3 -2
  252. package/docs/autonomous-privy-wallet.md +188 -0
  253. package/docs/cli.md +265 -34
  254. package/docs/langchain.md +5 -0
  255. package/docs/mcp-reference.md +91 -5
  256. package/docs/probe-capability.md +191 -0
  257. package/docs/quickstart.md +39 -4
  258. package/docs/threat-model.md +20 -0
  259. package/docs/x402.md +766 -593
  260. package/package.json +19 -17
  261. package/src/capability/probe-capability.ts +355 -0
  262. package/src/cli/args.ts +29 -0
  263. package/src/cli/commands/claim.ts +168 -33
  264. package/src/cli/commands/close.ts +36 -3
  265. package/src/cli/commands/invoke.ts +5 -2
  266. package/src/cli/commands/mcp.ts +18 -2
  267. package/src/cli/commands/open.ts +75 -4
  268. package/src/cli/commands/pay.ts +584 -0
  269. package/src/cli/commands/reclaim-unverified.ts +8 -2
  270. package/src/cli/commands/reclaim.ts +277 -19
  271. package/src/cli/commands/refund.ts +475 -0
  272. package/src/cli/commands/status.ts +28 -2
  273. package/src/cli/commands/streams.ts +10 -14
  274. package/src/cli/commands/watch.ts +11 -1
  275. package/src/cli/config.ts +139 -52
  276. package/src/cli/context.ts +16 -0
  277. package/src/cli/deps.ts +111 -1
  278. package/src/cli/errors.ts +24 -1
  279. package/src/cli/escape-hatch.ts +19 -5
  280. package/src/cli/listings.ts +43 -10
  281. package/src/cli/preflight.ts +36 -21
  282. package/src/cli/privy.ts +4 -2
  283. package/src/cli/progress.ts +21 -2
  284. package/src/cli/reclaimability.ts +154 -0
  285. package/src/cli/run.ts +77 -21
  286. package/src/cli/scan-range.ts +2 -2
  287. package/src/cli/status.ts +454 -44
  288. package/src/cli/wallet.ts +45 -8
  289. package/src/discovery/rate-band.ts +172 -0
  290. package/src/escrow-generation.ts +135 -0
  291. package/src/frameworks/agentkit.ts +45 -11
  292. package/src/frameworks/eliza.ts +27 -5
  293. package/src/frameworks/langchain.ts +14 -0
  294. package/src/gateway/caller-auth-gateway.ts +320 -68
  295. package/src/gateway/http-server.ts +717 -220
  296. package/src/gateway/probe-auth.ts +191 -0
  297. package/src/gateway/signed-rate-bounds.ts +164 -0
  298. package/src/gateway/x402-opener-mode.ts +1171 -0
  299. package/src/index.ts +82 -19
  300. package/src/mcp/server.ts +351 -42
  301. package/src/mcp/x402-tools.ts +785 -0
  302. package/src/network.ts +302 -0
  303. package/src/sdk/client.ts +25 -0
  304. package/src/sdk/invoke.ts +6 -5
  305. package/src/wallet/autonomous-wallet-broker.ts +46 -20
  306. package/src/wallet/autonomous-wallet-protocol.ts +11 -2
  307. package/src/wallet/autonomous-wallet.ts +4 -2
  308. package/src/wallet/broker-escrows.ts +66 -0
  309. package/src/wallet/lifecycle.ts +53 -18
  310. package/src/wallet/privy-broker-server.ts +35 -25
  311. package/src/wallet/privy-session-broker.ts +58 -25
  312. package/src/wallet/privy-session-provider.ts +7 -3
  313. package/src/wallet/provider.ts +20 -15
  314. package/src/x402/facilitator.ts +3 -43
  315. package/src/x402-buyer/guarded-fetch.ts +213 -0
  316. package/src/x402-buyer/index.ts +9 -0
  317. package/src/x402-buyer/pay.ts +555 -0
  318. package/src/x402-opener/abi.ts +881 -0
  319. package/src/x402-opener/facilitator-entry.ts +48 -0
  320. package/src/x402-opener/facilitator-server.ts +1114 -0
  321. package/src/x402-opener/index.ts +13 -0
  322. package/src/x402-opener/listing-resolver.ts +202 -0
  323. package/src/x402-opener/refund-relay.ts +1873 -0
  324. package/src/x402-opener/relayer-queue.ts +18 -0
  325. package/src/x402-opener/scheme.ts +1551 -0
  326. package/src/x402-opener/terms.ts +453 -0
  327. package/dist/gateway/x402-mode.d.ts +0 -123
  328. package/dist/gateway/x402-mode.d.ts.map +0 -1
  329. package/dist/gateway/x402-mode.js +0 -212
  330. package/dist/gateway/x402-mode.js.map +0 -1
  331. package/dist/x402/delivery-oracle.d.ts +0 -108
  332. package/dist/x402/delivery-oracle.d.ts.map +0 -1
  333. package/dist/x402/delivery-oracle.js +0 -174
  334. package/dist/x402/delivery-oracle.js.map +0 -1
  335. package/dist/x402/facilitator-server-entry.d.ts +0 -3
  336. package/dist/x402/facilitator-server-entry.d.ts.map +0 -1
  337. package/dist/x402/facilitator-server-entry.js +0 -27
  338. package/dist/x402/facilitator-server-entry.js.map +0 -1
  339. package/dist/x402/facilitator-server.d.ts +0 -73
  340. package/dist/x402/facilitator-server.d.ts.map +0 -1
  341. package/dist/x402/facilitator-server.js +0 -305
  342. package/dist/x402/facilitator-server.js.map +0 -1
  343. package/dist/x402/payment-requirements.d.ts +0 -106
  344. package/dist/x402/payment-requirements.d.ts.map +0 -1
  345. package/dist/x402/payment-requirements.js +0 -138
  346. package/dist/x402/payment-requirements.js.map +0 -1
  347. package/dist/x402/relayer.d.ts +0 -41
  348. package/dist/x402/relayer.d.ts.map +0 -1
  349. package/dist/x402/relayer.js +0 -64
  350. package/dist/x402/relayer.js.map +0 -1
  351. package/dist/x402/resource-index.d.ts +0 -75
  352. package/dist/x402/resource-index.d.ts.map +0 -1
  353. package/dist/x402/resource-index.js +0 -126
  354. package/dist/x402/resource-index.js.map +0 -1
  355. package/dist/x402/verified-delivery-facilitator.d.ts +0 -285
  356. package/dist/x402/verified-delivery-facilitator.d.ts.map +0 -1
  357. package/dist/x402/verified-delivery-facilitator.js +0 -423
  358. package/dist/x402/verified-delivery-facilitator.js.map +0 -1
  359. package/src/gateway/x402-mode.ts +0 -350
  360. package/src/x402/delivery-oracle.ts +0 -285
  361. package/src/x402/facilitator-server-entry.ts +0 -35
  362. package/src/x402/facilitator-server.ts +0 -445
  363. package/src/x402/payment-requirements.ts +0 -231
  364. package/src/x402/relayer.ts +0 -122
  365. package/src/x402/resource-index.ts +0 -228
  366. package/src/x402/verified-delivery-facilitator.ts +0 -744
@@ -0,0 +1,366 @@
1
+ import { findStreamForAuthorization, payWithX402, X402PaymentRefusedError, } from "@absol-labs/sdk/x402";
2
+ import { decodePaymentSignatureHeader } from "@x402/core/http";
3
+ import { createPublicClient, getAddress, http } from "viem";
4
+ import { checkMandate, verifySignedMandate, } from "../mandates/mandate.js";
5
+ /**
6
+ * Buyer-side x402 payments under a spend mandate (metrik-agent#121).
7
+ *
8
+ * The golden rule of this package — no spend without a mandate — applies to an
9
+ * x402 payment exactly as it applies to `metrik open`, because a Metrik x402
10
+ * payment IS a stream open: the opener facilitator settles the payer's EIP-3009
11
+ * authorization with `factory.deployAndSettle`, which opens a `StreamEscrowV2`
12
+ * stream with `deposit = price`. So the payment is mapped onto the SAME
13
+ * {@link HireRequest} a stream open is checked as, from the quote's opener terms
14
+ * (which the SDK has already proven on-chain: `payTo == factory.predict(terms)`):
15
+ *
16
+ * | Mandate field | x402 quote field |
17
+ * | ---------------------- | ------------------------------------------------ |
18
+ * | `maxPerStreamUsdc` | `amount` (the deposit; the price of the call) |
19
+ * | `maxTotalUsdc` | `spentSoFar + amount` |
20
+ * | `maxRatePerSecondUsdc` | `ratePerSecond` (how fast the seller can earn) |
21
+ * | `maxDurationSeconds` | `maxDuration` (the stream's window) |
22
+ * | `allowedOperators` | `operator` (who the stream pays) |
23
+ *
24
+ * An UPFRONT ("minimum charge") opener quote is mapped the same way, with
25
+ * `budgetUsdc = price` — the WHOLE payment, of which `upfrontAmount` is
26
+ * non-refundable (paid to the seller at settlement) and only the rest is
27
+ * escrowed. So the per-stream and total caps always count the upfront part as
28
+ * spent, and nothing a refund returns is ever credited back. Its size is also
29
+ * capped separately, before signing, by the SDK's `maxUpfrontAmount` (default
30
+ * 0.10 USDC; pass {@link PayX402WithMandateInput.maxUpfrontAmount} to tighten
31
+ * it, `0n` to refuse every upfront charge).
32
+ *
33
+ * The check runs inside the SDK's `onQuote` hook — after every SDK protection
34
+ * (scheme, network, USDC domain, EIP-3009 only, registered factory, on-chain
35
+ * `predict`, authorization lifetime) and BEFORE anything is signed — so a
36
+ * denied payment never produces a signature. It is enforced twice: the mandate's
37
+ * caps are also handed to the SDK as `maxAmount` / `maxRatePerSecond`. A quote
38
+ * that is not a Metrik opener payment (no operator/rate/duration terms) is
39
+ * refused: there would be no stream to bound and nothing to recover.
40
+ *
41
+ * The mandate itself (signature, expiry, revocation) is verified FIRST, before
42
+ * any request reaches the seller.
43
+ */
44
+ /** A payment refused by the spend mandate. Nothing was signed. */
45
+ export class X402MandateDeniedError extends Error {
46
+ reason;
47
+ quote;
48
+ constructor(reason, quote, detail) {
49
+ super(`x402 payment refused by the spend mandate: ${reason}${detail === undefined ? "" : ` (${detail})`}. Nothing was signed.`);
50
+ this.name = "X402MandateDeniedError";
51
+ this.reason = reason;
52
+ this.quote = quote;
53
+ }
54
+ }
55
+ /**
56
+ * The stream-open request an x402 quote would create, or a refusal reason when
57
+ * the quote does not carry Metrik opener terms.
58
+ */
59
+ export function x402QuoteToHireRequest(quote) {
60
+ if (quote.operator === null ||
61
+ quote.ratePerSecond === null ||
62
+ quote.maxDuration === null) {
63
+ return {
64
+ refused: "the quote carries no Metrik opener terms (operator, ratePerSecond, maxDuration), so it would not open a recoverable stream",
65
+ };
66
+ }
67
+ if (quote.maxDuration > BigInt(Number.MAX_SAFE_INTEGER)) {
68
+ return { refused: `maxDuration ${quote.maxDuration} is out of range` };
69
+ }
70
+ return {
71
+ operator: quote.operator,
72
+ budgetUsdc: quote.amount,
73
+ ratePerSecondUsdc: quote.ratePerSecond,
74
+ maxDurationSeconds: Number(quote.maxDuration),
75
+ };
76
+ }
77
+ /**
78
+ * The payment was APPROVED and its authorization signed and handed to the
79
+ * seller, then something failed (a malformed or missing PAYMENT-RESPONSE, a
80
+ * settlement the SDK could not confirm, a dropped connection). The money may
81
+ * have moved: {@link X402PostSignatureError.state} says what is known, and
82
+ * {@link X402PostSignatureError.releasable} is `true` only when the
83
+ * authorization provably can never be used. A spend reservation must be kept
84
+ * otherwise.
85
+ */
86
+ export class X402PostSignatureError extends Error {
87
+ state;
88
+ approved;
89
+ quote;
90
+ authorization;
91
+ /** The stream the payment opened, when it could be identified. */
92
+ streamId;
93
+ opener;
94
+ /**
95
+ * `true` when the chain shows (or the signed quote implies) an UPFRONT-ONLY
96
+ * payment: no stream, the whole price was a non-refundable charge, nothing
97
+ * to recover.
98
+ */
99
+ upfrontOnly;
100
+ constructor(context) {
101
+ const upfrontOnly = context.upfrontOnly === true || context.quote.upfrontOnly === true;
102
+ const what = context.state === "used"
103
+ ? upfrontOnly
104
+ ? "the payment SETTLED (the authorization was used) as an UPFRONT-ONLY charge: the whole price went to the seller, no stream was opened and there is nothing to refund"
105
+ : `the payment SETTLED (the authorization was used)${context.streamId === null ? ", but its stream could not be identified" : ` into stream ${context.streamId}`}`
106
+ : context.state === "possibly-used"
107
+ ? "the payment MAY HAVE SETTLED: whether the authorization was used could not be established, so treat it as spent"
108
+ : context.state === "unused-but-valid"
109
+ ? `the authorization has not been used, but it stays valid until ${context.authorization?.validBefore.toString() ?? "its validBefore"} and the seller still holds it — treat it as spent until then, or cancel it on USDC (cancelAuthorization)`
110
+ : "the authorization was never used and has expired: nothing moved";
111
+ super(`x402 payment of ${context.approved.budgetUsdc.toString()} USDC base units to ${context.quote.payTo} did not complete cleanly: ${what}. Cause: ${context.cause instanceof Error ? context.cause.message : String(context.cause)}`, { cause: context.cause });
112
+ this.name = "X402PostSignatureError";
113
+ this.state = context.state;
114
+ this.approved = context.approved;
115
+ this.quote = context.quote;
116
+ this.authorization = context.authorization;
117
+ this.streamId = context.streamId;
118
+ this.opener = getAddress(context.quote.payTo);
119
+ this.upfrontOnly = upfrontOnly;
120
+ }
121
+ /** Only an authorization that provably can never move funds frees its reservation. */
122
+ get releasable() {
123
+ return this.state === "unused-expired";
124
+ }
125
+ }
126
+ function headerValue(headers, name) {
127
+ if (headers === undefined)
128
+ return null;
129
+ if (headers instanceof Headers)
130
+ return headers.get(name);
131
+ if (Array.isArray(headers)) {
132
+ const hit = headers.find((pair) => pair[0]?.toLowerCase() === name);
133
+ return hit?.[1] ?? null;
134
+ }
135
+ for (const [key, value] of Object.entries(headers)) {
136
+ if (key.toLowerCase() === name) {
137
+ return typeof value === "string" ? value : (value[0] ?? null);
138
+ }
139
+ }
140
+ return null;
141
+ }
142
+ /** The EIP-3009 authorization inside an x402 v2 PAYMENT-SIGNATURE header, if decodable. */
143
+ function authorizationFromHeader(header) {
144
+ try {
145
+ const payload = decodePaymentSignatureHeader(header);
146
+ const auth = payload.payload?.authorization;
147
+ if (auth === undefined)
148
+ return null;
149
+ return {
150
+ from: getAddress(auth.from),
151
+ to: getAddress(auth.to),
152
+ value: BigInt(auth.value),
153
+ validAfter: BigInt(auth.validAfter),
154
+ validBefore: BigInt(auth.validBefore),
155
+ nonce: auth.nonce,
156
+ };
157
+ }
158
+ catch {
159
+ return null;
160
+ }
161
+ }
162
+ function smaller(a, b) {
163
+ return b !== undefined && b < a ? b : a;
164
+ }
165
+ /**
166
+ * Pay an x402 v2 endpoint through the SDK's `payWithX402`, gated by
167
+ * `checkMandate()`. Fail closed: a mandate that does not verify, a quote it
168
+ * denies, or a quote without opener terms is a hard stop with nothing signed.
169
+ */
170
+ export async function payX402WithMandate(input) {
171
+ const mandate = input.signedMandate.mandate;
172
+ // 1. The mandate itself, before the seller is even contacted.
173
+ const verdict = await verifySignedMandate(input.signedMandate, {
174
+ nowSeconds: input.nowSeconds,
175
+ ...(input.revokedMandateIds === undefined
176
+ ? {}
177
+ : { revokedMandateIds: input.revokedMandateIds }),
178
+ });
179
+ if (!verdict.allowed) {
180
+ throw new X402MandateDeniedError(verdict.reason ?? "invalid-signature", null);
181
+ }
182
+ if (input.signedMandate.owner.toLowerCase() !==
183
+ input.signer.address.toLowerCase()) {
184
+ throw new X402MandateDeniedError("invalid-signature", null, `the mandate is owned by ${input.signedMandate.owner}, not the payer ${input.signer.address}`);
185
+ }
186
+ if (input.signedMandate.chainId !== input.network.chain.id) {
187
+ throw new X402MandateDeniedError("invalid-signature", null, `the mandate is for chain ${input.signedMandate.chainId}, not ${input.network.name} (${input.network.chain.id})`);
188
+ }
189
+ // 2. The SDK's own ceilings, never looser than the mandate.
190
+ const remaining = mandate.maxTotalUsdc - input.spentSoFarUsdc;
191
+ if (remaining <= 0n) {
192
+ throw new X402MandateDeniedError("exceeds-total-cap", null, "the mandate's total cap is already spent");
193
+ }
194
+ const maxAmount = smaller(smaller(mandate.maxPerStreamUsdc, remaining), input.maxAmount);
195
+ const maxRatePerSecond = smaller(mandate.maxRatePerSecondUsdc, input.maxRatePerSecond);
196
+ // A negative maxUpfrontAmount is refused by the SDK (InvalidInputError)
197
+ // before the seller is contacted.
198
+ // 3. The per-quote mandate check, before signing.
199
+ let denial = null;
200
+ let approved = null;
201
+ let approvedQuote = null;
202
+ // The authorization exactly as it left this process, read from the
203
+ // PAYMENT-SIGNATURE header on the way out — so a post-signature failure can
204
+ // still be traced on-chain even when the SDK error does not carry it.
205
+ let sentAuthorization = null;
206
+ const baseFetch = input.sdkOptions?.fetch ?? globalThis.fetch.bind(globalThis);
207
+ const capturingFetch = (async (resource, init) => {
208
+ const header = headerValue(init?.headers, "payment-signature") ??
209
+ (resource instanceof Request
210
+ ? resource.headers.get("payment-signature")
211
+ : null);
212
+ if (header !== null) {
213
+ sentAuthorization = authorizationFromHeader(header) ?? sentAuthorization;
214
+ }
215
+ return await baseFetch(resource, init);
216
+ });
217
+ const pay = input.payImpl ?? payWithX402;
218
+ let result;
219
+ try {
220
+ result = await pay(input.url, input.init, {
221
+ ...input.sdkOptions,
222
+ fetch: capturingFetch,
223
+ signer: input.signer,
224
+ network: input.network,
225
+ maxAmount,
226
+ maxRatePerSecond,
227
+ ...(input.maxUpfrontAmount === undefined
228
+ ? {}
229
+ : { maxUpfrontAmount: smaller(input.maxUpfrontAmount, maxAmount) }),
230
+ ...(input.minDurationSeconds === undefined
231
+ ? {}
232
+ : { minDurationSeconds: input.minDurationSeconds }),
233
+ onQuote: async (quote) => {
234
+ const request = x402QuoteToHireRequest(quote);
235
+ if ("refused" in request) {
236
+ denial = new X402MandateDeniedError("not-an-opener-quote", quote, request.refused);
237
+ return false;
238
+ }
239
+ const decision = await checkMandate(input.signedMandate, request, input.spentSoFarUsdc, {
240
+ nowSeconds: input.nowSeconds,
241
+ ...(input.revokedMandateIds === undefined
242
+ ? {}
243
+ : { revokedMandateIds: input.revokedMandateIds }),
244
+ });
245
+ if (!decision.allowed) {
246
+ denial = new X402MandateDeniedError(decision.reason ?? "invalid-signature", quote);
247
+ return false;
248
+ }
249
+ // Reserve BEFORE the SDK signs: from here on the money can move.
250
+ // A reservation hook that fails refuses the quote.
251
+ await input.onApproved?.({ request, quote });
252
+ approved = request;
253
+ approvedQuote = quote;
254
+ denial = null;
255
+ return true;
256
+ },
257
+ });
258
+ }
259
+ catch (error) {
260
+ if (error instanceof X402PaymentRefusedError) {
261
+ // The SDK's own statement: nothing was signed or sent. A reservation
262
+ // made in onApproved can be released by the caller.
263
+ if (denial !== null)
264
+ throw denial;
265
+ throw error;
266
+ }
267
+ if (approved === null || approvedQuote === null)
268
+ throw error;
269
+ throw await classifyPostSignatureFailure(input, {
270
+ error,
271
+ approved,
272
+ quote: approvedQuote,
273
+ sentAuthorization,
274
+ });
275
+ }
276
+ return { ...result, approved: result.paid ? approved : null };
277
+ }
278
+ /**
279
+ * After a failure past the point of signing, establish what happened from the
280
+ * CHAIN, never from the seller: USDC `authorizationState(from, nonce)` and the
281
+ * opener's `StreamOpenedFor(streamId, payer, authorizationNonce, …)` log.
282
+ */
283
+ async function classifyPostSignatureFailure(input, context) {
284
+ const sdkError = context.error;
285
+ const authorization = sdkError.authorization ?? context.sentAuthorization ?? null;
286
+ let used = typeof sdkError.authorizationUsed === "boolean"
287
+ ? sdkError.authorizationUsed
288
+ : null;
289
+ let upfrontOnly = sdkError.upfrontOnly === true;
290
+ let streamId = typeof sdkError.streamId === "string" &&
291
+ /^0x[0-9a-fA-F]{64}$/.test(sdkError.streamId)
292
+ ? sdkError.streamId
293
+ : null;
294
+ const reader = input.chainReader ??
295
+ input.sdkOptions?.publicClient ??
296
+ createPublicClient({
297
+ transport: input.sdkOptions?.transport ?? http(input.network.rpcUrls[0]),
298
+ });
299
+ if (authorization !== null) {
300
+ if (used === null) {
301
+ try {
302
+ used = await reader.readContract({
303
+ address: input.network.usdc.address,
304
+ abi: authorizationStateAbi,
305
+ functionName: "authorizationState",
306
+ args: [authorization.from, authorization.nonce],
307
+ });
308
+ }
309
+ catch {
310
+ used = null;
311
+ }
312
+ }
313
+ if (streamId === null && used !== false) {
314
+ // The SDK's recovery: only a registered factory's opener
315
+ // (factory.isOpener read on-chain) can prove a stream for this nonce.
316
+ try {
317
+ const recovery = await findStreamForAuthorization({
318
+ authorization,
319
+ network: input.network,
320
+ factory: context.quote.factory ?? null,
321
+ publicClient: reader,
322
+ });
323
+ streamId = recovery.streamId;
324
+ // An upfront-only payment opens no stream: the opener's
325
+ // UpfrontCharged (streamId 0), read on-chain, proves it was used.
326
+ if (recovery.upfrontOnly)
327
+ upfrontOnly = true;
328
+ }
329
+ catch {
330
+ streamId = null;
331
+ }
332
+ if (streamId !== null || upfrontOnly)
333
+ used = true;
334
+ }
335
+ }
336
+ const nowSeconds = BigInt(Math.floor(Date.now() / 1000));
337
+ const state = streamId !== null || upfrontOnly || used === true
338
+ ? "used"
339
+ : used === false && authorization !== null
340
+ ? authorization.validBefore <= nowSeconds
341
+ ? "unused-expired"
342
+ : "unused-but-valid"
343
+ : "possibly-used";
344
+ return new X402PostSignatureError({
345
+ state,
346
+ approved: context.approved,
347
+ quote: context.quote,
348
+ authorization,
349
+ streamId,
350
+ upfrontOnly,
351
+ cause: context.error,
352
+ });
353
+ }
354
+ const authorizationStateAbi = [
355
+ {
356
+ type: "function",
357
+ name: "authorizationState",
358
+ stateMutability: "view",
359
+ inputs: [
360
+ { name: "authorizer", type: "address" },
361
+ { name: "nonce", type: "bytes32" },
362
+ ],
363
+ outputs: [{ name: "", type: "bool" }],
364
+ },
365
+ ];
366
+ //# sourceMappingURL=pay.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"pay.js","sourceRoot":"","sources":["../../src/x402-buyer/pay.ts"],"names":[],"mappings":"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"}