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

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 (350) hide show
  1. package/README.md +42 -50
  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.js +1 -1
  12. package/dist/cli/commands/claim.js.map +1 -1
  13. package/dist/cli/commands/close.d.ts.map +1 -1
  14. package/dist/cli/commands/close.js +35 -3
  15. package/dist/cli/commands/close.js.map +1 -1
  16. package/dist/cli/commands/invoke.d.ts +2 -0
  17. package/dist/cli/commands/invoke.d.ts.map +1 -1
  18. package/dist/cli/commands/invoke.js +2 -2
  19. package/dist/cli/commands/invoke.js.map +1 -1
  20. package/dist/cli/commands/mcp.d.ts.map +1 -1
  21. package/dist/cli/commands/mcp.js +15 -2
  22. package/dist/cli/commands/mcp.js.map +1 -1
  23. package/dist/cli/commands/open.d.ts.map +1 -1
  24. package/dist/cli/commands/open.js +58 -4
  25. package/dist/cli/commands/open.js.map +1 -1
  26. package/dist/cli/commands/pay.d.ts +19 -0
  27. package/dist/cli/commands/pay.d.ts.map +1 -0
  28. package/dist/cli/commands/pay.js +355 -0
  29. package/dist/cli/commands/pay.js.map +1 -0
  30. package/dist/cli/commands/reclaim-unverified.d.ts.map +1 -1
  31. package/dist/cli/commands/reclaim-unverified.js +3 -2
  32. package/dist/cli/commands/reclaim-unverified.js.map +1 -1
  33. package/dist/cli/commands/reclaim.d.ts +23 -2
  34. package/dist/cli/commands/reclaim.d.ts.map +1 -1
  35. package/dist/cli/commands/reclaim.js +184 -16
  36. package/dist/cli/commands/reclaim.js.map +1 -1
  37. package/dist/cli/commands/refund.d.ts +13 -0
  38. package/dist/cli/commands/refund.d.ts.map +1 -0
  39. package/dist/cli/commands/refund.js +224 -0
  40. package/dist/cli/commands/refund.js.map +1 -0
  41. package/dist/cli/commands/status.d.ts.map +1 -1
  42. package/dist/cli/commands/status.js +10 -1
  43. package/dist/cli/commands/status.js.map +1 -1
  44. package/dist/cli/commands/streams.js +8 -12
  45. package/dist/cli/commands/streams.js.map +1 -1
  46. package/dist/cli/commands/watch.d.ts.map +1 -1
  47. package/dist/cli/commands/watch.js +2 -1
  48. package/dist/cli/commands/watch.js.map +1 -1
  49. package/dist/cli/config.d.ts +44 -26
  50. package/dist/cli/config.d.ts.map +1 -1
  51. package/dist/cli/config.js +88 -38
  52. package/dist/cli/config.js.map +1 -1
  53. package/dist/cli/deps.d.ts +33 -0
  54. package/dist/cli/deps.d.ts.map +1 -1
  55. package/dist/cli/deps.js +37 -1
  56. package/dist/cli/deps.js.map +1 -1
  57. package/dist/cli/errors.d.ts.map +1 -1
  58. package/dist/cli/errors.js +21 -1
  59. package/dist/cli/errors.js.map +1 -1
  60. package/dist/cli/escape-hatch.d.ts +6 -4
  61. package/dist/cli/escape-hatch.d.ts.map +1 -1
  62. package/dist/cli/escape-hatch.js +6 -2
  63. package/dist/cli/escape-hatch.js.map +1 -1
  64. package/dist/cli/listings.d.ts +18 -0
  65. package/dist/cli/listings.d.ts.map +1 -1
  66. package/dist/cli/listings.js +22 -12
  67. package/dist/cli/listings.js.map +1 -1
  68. package/dist/cli/preflight.d.ts +20 -14
  69. package/dist/cli/preflight.d.ts.map +1 -1
  70. package/dist/cli/preflight.js +34 -20
  71. package/dist/cli/preflight.js.map +1 -1
  72. package/dist/cli/privy.d.ts.map +1 -1
  73. package/dist/cli/privy.js +4 -2
  74. package/dist/cli/privy.js.map +1 -1
  75. package/dist/cli/reclaimability.d.ts +82 -0
  76. package/dist/cli/reclaimability.d.ts.map +1 -0
  77. package/dist/cli/reclaimability.js +80 -0
  78. package/dist/cli/reclaimability.js.map +1 -0
  79. package/dist/cli/run.d.ts +2 -1
  80. package/dist/cli/run.d.ts.map +1 -1
  81. package/dist/cli/run.js +40 -11
  82. package/dist/cli/run.js.map +1 -1
  83. package/dist/cli/scan-range.d.ts +2 -2
  84. package/dist/cli/scan-range.js +2 -2
  85. package/dist/cli/status.d.ts +3 -1
  86. package/dist/cli/status.d.ts.map +1 -1
  87. package/dist/cli/status.js +15 -3
  88. package/dist/cli/status.js.map +1 -1
  89. package/dist/cli/wallet.d.ts +1 -1
  90. package/dist/cli/wallet.js +2 -2
  91. package/dist/cli/wallet.js.map +1 -1
  92. package/dist/discovery/rate-band.d.ts +74 -0
  93. package/dist/discovery/rate-band.d.ts.map +1 -0
  94. package/dist/discovery/rate-band.js +114 -0
  95. package/dist/discovery/rate-band.js.map +1 -0
  96. package/dist/escrow-generation.d.ts +81 -0
  97. package/dist/escrow-generation.d.ts.map +1 -0
  98. package/dist/escrow-generation.js +76 -0
  99. package/dist/escrow-generation.js.map +1 -0
  100. package/dist/frameworks/agentkit.d.ts +8 -4
  101. package/dist/frameworks/agentkit.d.ts.map +1 -1
  102. package/dist/frameworks/agentkit.js +27 -10
  103. package/dist/frameworks/agentkit.js.map +1 -1
  104. package/dist/frameworks/eliza.d.ts +3 -3
  105. package/dist/frameworks/eliza.d.ts.map +1 -1
  106. package/dist/frameworks/eliza.js +15 -6
  107. package/dist/frameworks/eliza.js.map +1 -1
  108. package/dist/frameworks/langchain.d.ts.map +1 -1
  109. package/dist/frameworks/langchain.js +8 -0
  110. package/dist/frameworks/langchain.js.map +1 -1
  111. package/dist/gateway/caller-auth-gateway.d.ts +83 -31
  112. package/dist/gateway/caller-auth-gateway.d.ts.map +1 -1
  113. package/dist/gateway/caller-auth-gateway.js +180 -27
  114. package/dist/gateway/caller-auth-gateway.js.map +1 -1
  115. package/dist/gateway/http-server.d.ts +111 -44
  116. package/dist/gateway/http-server.d.ts.map +1 -1
  117. package/dist/gateway/http-server.js +439 -155
  118. package/dist/gateway/http-server.js.map +1 -1
  119. package/dist/gateway/probe-auth.d.ts +112 -0
  120. package/dist/gateway/probe-auth.d.ts.map +1 -0
  121. package/dist/gateway/probe-auth.js +127 -0
  122. package/dist/gateway/probe-auth.js.map +1 -0
  123. package/dist/gateway/signed-rate-bounds.d.ts +51 -0
  124. package/dist/gateway/signed-rate-bounds.d.ts.map +1 -0
  125. package/dist/gateway/signed-rate-bounds.js +94 -0
  126. package/dist/gateway/signed-rate-bounds.js.map +1 -0
  127. package/dist/gateway/x402-opener-mode.d.ts +215 -0
  128. package/dist/gateway/x402-opener-mode.d.ts.map +1 -0
  129. package/dist/gateway/x402-opener-mode.js +639 -0
  130. package/dist/gateway/x402-opener-mode.js.map +1 -0
  131. package/dist/index.d.ts +6 -2
  132. package/dist/index.d.ts.map +1 -1
  133. package/dist/index.js +10 -5
  134. package/dist/index.js.map +1 -1
  135. package/dist/mcp/server.d.ts +52 -1
  136. package/dist/mcp/server.d.ts.map +1 -1
  137. package/dist/mcp/server.js +228 -37
  138. package/dist/mcp/server.js.map +1 -1
  139. package/dist/mcp/x402-tools.d.ts +104 -0
  140. package/dist/mcp/x402-tools.d.ts.map +1 -0
  141. package/dist/mcp/x402-tools.js +434 -0
  142. package/dist/mcp/x402-tools.js.map +1 -0
  143. package/dist/network.d.ts +119 -0
  144. package/dist/network.d.ts.map +1 -0
  145. package/dist/network.js +199 -0
  146. package/dist/network.js.map +1 -0
  147. package/dist/sdk/invoke.d.ts +4 -0
  148. package/dist/sdk/invoke.d.ts.map +1 -1
  149. package/dist/sdk/invoke.js +2 -5
  150. package/dist/sdk/invoke.js.map +1 -1
  151. package/dist/wallet/autonomous-wallet-broker.d.ts +3 -0
  152. package/dist/wallet/autonomous-wallet-broker.d.ts.map +1 -1
  153. package/dist/wallet/autonomous-wallet-broker.js +27 -23
  154. package/dist/wallet/autonomous-wallet-broker.js.map +1 -1
  155. package/dist/wallet/autonomous-wallet-protocol.d.ts +8 -2
  156. package/dist/wallet/autonomous-wallet-protocol.d.ts.map +1 -1
  157. package/dist/wallet/autonomous-wallet-protocol.js +9 -2
  158. package/dist/wallet/autonomous-wallet-protocol.js.map +1 -1
  159. package/dist/wallet/autonomous-wallet.d.ts.map +1 -1
  160. package/dist/wallet/autonomous-wallet.js +3 -2
  161. package/dist/wallet/autonomous-wallet.js.map +1 -1
  162. package/dist/wallet/broker-escrows.d.ts +222 -0
  163. package/dist/wallet/broker-escrows.d.ts.map +1 -0
  164. package/dist/wallet/broker-escrows.js +36 -0
  165. package/dist/wallet/broker-escrows.js.map +1 -0
  166. package/dist/wallet/lifecycle.d.ts +21 -5
  167. package/dist/wallet/lifecycle.d.ts.map +1 -1
  168. package/dist/wallet/lifecycle.js +32 -12
  169. package/dist/wallet/lifecycle.js.map +1 -1
  170. package/dist/wallet/privy-broker-server.d.ts.map +1 -1
  171. package/dist/wallet/privy-broker-server.js +31 -26
  172. package/dist/wallet/privy-broker-server.js.map +1 -1
  173. package/dist/wallet/privy-session-broker.d.ts +14 -5
  174. package/dist/wallet/privy-session-broker.d.ts.map +1 -1
  175. package/dist/wallet/privy-session-broker.js +29 -17
  176. package/dist/wallet/privy-session-broker.js.map +1 -1
  177. package/dist/wallet/privy-session-provider.d.ts +3 -1
  178. package/dist/wallet/privy-session-provider.d.ts.map +1 -1
  179. package/dist/wallet/privy-session-provider.js +5 -3
  180. package/dist/wallet/privy-session-provider.js.map +1 -1
  181. package/dist/wallet/provider.d.ts.map +1 -1
  182. package/dist/wallet/provider.js +15 -8
  183. package/dist/wallet/provider.js.map +1 -1
  184. package/dist/x402/facilitator.d.ts +3 -30
  185. package/dist/x402/facilitator.d.ts.map +1 -1
  186. package/dist/x402/facilitator.js +0 -27
  187. package/dist/x402/facilitator.js.map +1 -1
  188. package/dist/x402-buyer/guarded-fetch.d.ts +51 -0
  189. package/dist/x402-buyer/guarded-fetch.d.ts.map +1 -0
  190. package/dist/x402-buyer/guarded-fetch.js +147 -0
  191. package/dist/x402-buyer/guarded-fetch.js.map +1 -0
  192. package/dist/x402-buyer/index.d.ts +10 -0
  193. package/dist/x402-buyer/index.d.ts.map +1 -0
  194. package/dist/x402-buyer/index.js +10 -0
  195. package/dist/x402-buyer/index.js.map +1 -0
  196. package/dist/x402-buyer/pay.d.ts +135 -0
  197. package/dist/x402-buyer/pay.d.ts.map +1 -0
  198. package/dist/x402-buyer/pay.js +336 -0
  199. package/dist/x402-buyer/pay.js.map +1 -0
  200. package/dist/x402-opener/abi.d.ts +684 -0
  201. package/dist/x402-opener/abi.d.ts.map +1 -0
  202. package/dist/x402-opener/abi.js +880 -0
  203. package/dist/x402-opener/abi.js.map +1 -0
  204. package/dist/x402-opener/facilitator-entry.d.ts +3 -0
  205. package/dist/x402-opener/facilitator-entry.d.ts.map +1 -0
  206. package/dist/x402-opener/facilitator-entry.js +37 -0
  207. package/dist/x402-opener/facilitator-entry.js.map +1 -0
  208. package/dist/x402-opener/facilitator-server.d.ts +180 -0
  209. package/dist/x402-opener/facilitator-server.d.ts.map +1 -0
  210. package/dist/x402-opener/facilitator-server.js +696 -0
  211. package/dist/x402-opener/facilitator-server.js.map +1 -0
  212. package/dist/x402-opener/index.d.ts +14 -0
  213. package/dist/x402-opener/index.d.ts.map +1 -0
  214. package/dist/x402-opener/index.js +14 -0
  215. package/dist/x402-opener/index.js.map +1 -0
  216. package/dist/x402-opener/listing-resolver.d.ts +55 -0
  217. package/dist/x402-opener/listing-resolver.d.ts.map +1 -0
  218. package/dist/x402-opener/listing-resolver.js +125 -0
  219. package/dist/x402-opener/listing-resolver.js.map +1 -0
  220. package/dist/x402-opener/refund-relay.d.ts +240 -0
  221. package/dist/x402-opener/refund-relay.d.ts.map +1 -0
  222. package/dist/x402-opener/refund-relay.js +1240 -0
  223. package/dist/x402-opener/refund-relay.js.map +1 -0
  224. package/dist/x402-opener/relayer-queue.d.ts +14 -0
  225. package/dist/x402-opener/relayer-queue.d.ts.map +1 -0
  226. package/dist/x402-opener/relayer-queue.js +18 -0
  227. package/dist/x402-opener/relayer-queue.js.map +1 -0
  228. package/dist/x402-opener/scheme.d.ts +217 -0
  229. package/dist/x402-opener/scheme.d.ts.map +1 -0
  230. package/dist/x402-opener/scheme.js +749 -0
  231. package/dist/x402-opener/scheme.js.map +1 -0
  232. package/dist/x402-opener/terms.d.ts +105 -0
  233. package/dist/x402-opener/terms.d.ts.map +1 -0
  234. package/dist/x402-opener/terms.js +212 -0
  235. package/dist/x402-opener/terms.js.map +1 -0
  236. package/dist/zktls/reclaim.d.ts +2 -2
  237. package/dist/zktls/t2-delivery-proof.d.ts +6 -6
  238. package/docs/agent-layer.md +3 -2
  239. package/docs/autonomous-privy-wallet.md +188 -0
  240. package/docs/cli.md +184 -31
  241. package/docs/langchain.md +5 -0
  242. package/docs/mcp-reference.md +75 -5
  243. package/docs/probe-capability.md +191 -0
  244. package/docs/quickstart.md +36 -1
  245. package/docs/threat-model.md +20 -0
  246. package/docs/x402.md +628 -595
  247. package/package.json +19 -17
  248. package/src/capability/probe-capability.ts +355 -0
  249. package/src/cli/args.ts +29 -0
  250. package/src/cli/commands/claim.ts +1 -1
  251. package/src/cli/commands/close.ts +36 -3
  252. package/src/cli/commands/invoke.ts +5 -2
  253. package/src/cli/commands/mcp.ts +18 -2
  254. package/src/cli/commands/open.ts +75 -4
  255. package/src/cli/commands/pay.ts +442 -0
  256. package/src/cli/commands/reclaim-unverified.ts +8 -2
  257. package/src/cli/commands/reclaim.ts +252 -14
  258. package/src/cli/commands/refund.ts +277 -0
  259. package/src/cli/commands/status.ts +17 -1
  260. package/src/cli/commands/streams.ts +10 -14
  261. package/src/cli/commands/watch.ts +7 -1
  262. package/src/cli/config.ts +139 -52
  263. package/src/cli/deps.ts +74 -1
  264. package/src/cli/errors.ts +24 -1
  265. package/src/cli/escape-hatch.ts +19 -5
  266. package/src/cli/listings.ts +43 -10
  267. package/src/cli/preflight.ts +36 -21
  268. package/src/cli/privy.ts +4 -2
  269. package/src/cli/reclaimability.ts +154 -0
  270. package/src/cli/run.ts +54 -11
  271. package/src/cli/scan-range.ts +2 -2
  272. package/src/cli/status.ts +14 -1
  273. package/src/cli/wallet.ts +2 -2
  274. package/src/discovery/rate-band.ts +172 -0
  275. package/src/escrow-generation.ts +135 -0
  276. package/src/frameworks/agentkit.ts +45 -11
  277. package/src/frameworks/eliza.ts +27 -5
  278. package/src/frameworks/langchain.ts +14 -0
  279. package/src/gateway/caller-auth-gateway.ts +320 -68
  280. package/src/gateway/http-server.ts +629 -220
  281. package/src/gateway/probe-auth.ts +191 -0
  282. package/src/gateway/signed-rate-bounds.ts +164 -0
  283. package/src/gateway/x402-opener-mode.ts +974 -0
  284. package/src/index.ts +82 -19
  285. package/src/mcp/server.ts +319 -42
  286. package/src/mcp/x402-tools.ts +621 -0
  287. package/src/network.ts +302 -0
  288. package/src/sdk/invoke.ts +6 -5
  289. package/src/wallet/autonomous-wallet-broker.ts +46 -20
  290. package/src/wallet/autonomous-wallet-protocol.ts +11 -2
  291. package/src/wallet/autonomous-wallet.ts +4 -2
  292. package/src/wallet/broker-escrows.ts +66 -0
  293. package/src/wallet/lifecycle.ts +53 -18
  294. package/src/wallet/privy-broker-server.ts +35 -25
  295. package/src/wallet/privy-session-broker.ts +58 -25
  296. package/src/wallet/privy-session-provider.ts +7 -3
  297. package/src/wallet/provider.ts +20 -15
  298. package/src/x402/facilitator.ts +3 -43
  299. package/src/x402-buyer/guarded-fetch.ts +213 -0
  300. package/src/x402-buyer/index.ts +9 -0
  301. package/src/x402-buyer/pay.ts +517 -0
  302. package/src/x402-opener/abi.ts +881 -0
  303. package/src/x402-opener/facilitator-entry.ts +45 -0
  304. package/src/x402-opener/facilitator-server.ts +1014 -0
  305. package/src/x402-opener/index.ts +13 -0
  306. package/src/x402-opener/listing-resolver.ts +202 -0
  307. package/src/x402-opener/refund-relay.ts +1743 -0
  308. package/src/x402-opener/relayer-queue.ts +18 -0
  309. package/src/x402-opener/scheme.ts +1133 -0
  310. package/src/x402-opener/terms.ts +300 -0
  311. package/dist/gateway/x402-mode.d.ts +0 -123
  312. package/dist/gateway/x402-mode.d.ts.map +0 -1
  313. package/dist/gateway/x402-mode.js +0 -212
  314. package/dist/gateway/x402-mode.js.map +0 -1
  315. package/dist/x402/delivery-oracle.d.ts +0 -108
  316. package/dist/x402/delivery-oracle.d.ts.map +0 -1
  317. package/dist/x402/delivery-oracle.js +0 -174
  318. package/dist/x402/delivery-oracle.js.map +0 -1
  319. package/dist/x402/facilitator-server-entry.d.ts +0 -3
  320. package/dist/x402/facilitator-server-entry.d.ts.map +0 -1
  321. package/dist/x402/facilitator-server-entry.js +0 -27
  322. package/dist/x402/facilitator-server-entry.js.map +0 -1
  323. package/dist/x402/facilitator-server.d.ts +0 -73
  324. package/dist/x402/facilitator-server.d.ts.map +0 -1
  325. package/dist/x402/facilitator-server.js +0 -305
  326. package/dist/x402/facilitator-server.js.map +0 -1
  327. package/dist/x402/payment-requirements.d.ts +0 -106
  328. package/dist/x402/payment-requirements.d.ts.map +0 -1
  329. package/dist/x402/payment-requirements.js +0 -138
  330. package/dist/x402/payment-requirements.js.map +0 -1
  331. package/dist/x402/relayer.d.ts +0 -41
  332. package/dist/x402/relayer.d.ts.map +0 -1
  333. package/dist/x402/relayer.js +0 -64
  334. package/dist/x402/relayer.js.map +0 -1
  335. package/dist/x402/resource-index.d.ts +0 -75
  336. package/dist/x402/resource-index.d.ts.map +0 -1
  337. package/dist/x402/resource-index.js +0 -126
  338. package/dist/x402/resource-index.js.map +0 -1
  339. package/dist/x402/verified-delivery-facilitator.d.ts +0 -285
  340. package/dist/x402/verified-delivery-facilitator.d.ts.map +0 -1
  341. package/dist/x402/verified-delivery-facilitator.js +0 -423
  342. package/dist/x402/verified-delivery-facilitator.js.map +0 -1
  343. package/src/gateway/x402-mode.ts +0 -350
  344. package/src/x402/delivery-oracle.ts +0 -285
  345. package/src/x402/facilitator-server-entry.ts +0 -35
  346. package/src/x402/facilitator-server.ts +0 -445
  347. package/src/x402/payment-requirements.ts +0 -231
  348. package/src/x402/relayer.ts +0 -122
  349. package/src/x402/resource-index.ts +0 -228
  350. package/src/x402/verified-delivery-facilitator.ts +0 -744
@@ -1,122 +0,0 @@
1
- import {
2
- createPublicClient,
3
- createWalletClient,
4
- http,
5
- publicActions,
6
- type Chain,
7
- type Hex,
8
- } from "viem";
9
- import { privateKeyToAccount } from "viem/accounts";
10
- import { base, baseSepolia } from "viem/chains";
11
- import { settle as x402Settle, verify as x402Verify } from "x402/facilitator";
12
- import type {
13
- PaymentPayload,
14
- PaymentRequirements,
15
- SettleResponse,
16
- VerifyResponse,
17
- } from "x402/types";
18
-
19
- import type {
20
- PaymentSettler,
21
- PaymentVerifier,
22
- } from "./verified-delivery-facilitator.js";
23
-
24
- /**
25
- * Chain wiring for the payment half of Metrik's x402 facilitator.
26
- *
27
- * Nothing here is Metrik-specific: verification and settlement are delegated
28
- * VERBATIM to the real `x402/facilitator` implementation of the `exact` scheme.
29
- * Metrik does not reimplement EIP-3009, and a change in the library's rules is
30
- * inherited rather than drifted away from. The Metrik-specific part — the
31
- * delivery gate — lives entirely in `./verified-delivery-facilitator.ts` and is
32
- * layered ON TOP of whatever this returns.
33
- */
34
-
35
- export const X402_CHAINS: Readonly<Record<number, Chain>> = Object.freeze({
36
- 8453: base,
37
- 84532: baseSepolia,
38
- });
39
-
40
- export interface X402ChainOptions {
41
- /** Default `84532` (Base Sepolia). */
42
- readonly chainId?: number;
43
- /** RPC endpoint. Required: the library's default public RPCs are not operable infrastructure. */
44
- readonly rpcUrl: string;
45
- }
46
-
47
- function chainFor(chainId: number): Chain {
48
- const chain = X402_CHAINS[chainId];
49
- if (chain === undefined) {
50
- throw new Error(`unsupported x402 settlement chain: ${chainId}`);
51
- }
52
- return chain;
53
- }
54
-
55
- /**
56
- * Read-only verifier. Needs an RPC because the `exact` scheme checks the payer's
57
- * on-chain balance; it holds no key and can broadcast nothing.
58
- */
59
- export function createX402PaymentVerifier(
60
- options: X402ChainOptions,
61
- ): PaymentVerifier {
62
- const chain = chainFor(options.chainId ?? 84532);
63
- const client = createPublicClient({
64
- chain,
65
- transport: http(options.rpcUrl),
66
- });
67
- return {
68
- verify(
69
- payload: PaymentPayload,
70
- requirements: PaymentRequirements,
71
- ): Promise<VerifyResponse> {
72
- return x402Verify(
73
- client as Parameters<typeof x402Verify>[0],
74
- payload,
75
- requirements,
76
- );
77
- },
78
- };
79
- }
80
-
81
- export interface X402RelayerOptions extends X402ChainOptions {
82
- /**
83
- * The relayer's private key. This wallet BROADCASTS and pays gas; it never
84
- * custodies payment funds (EIP-3009 moves value directly from payer to payee).
85
- * Supplied by the operator through the environment, exactly like every other
86
- * wallet in this package. Never committed, never defaulted.
87
- */
88
- readonly privateKey: Hex;
89
- }
90
-
91
- /**
92
- * The settlement half. Constructing this is the ONLY place a key enters the
93
- * facilitator, and there is no code path that broadcasts without one.
94
- */
95
- export function createX402PaymentSettler(
96
- options: X402RelayerOptions,
97
- ): PaymentSettler {
98
- const chain = chainFor(options.chainId ?? 84532);
99
- const account = privateKeyToAccount(options.privateKey);
100
- const signer = createWalletClient({
101
- account,
102
- chain,
103
- transport: http(options.rpcUrl),
104
- }).extend(publicActions);
105
- return {
106
- settle(
107
- payload: PaymentPayload,
108
- requirements: PaymentRequirements,
109
- ): Promise<SettleResponse> {
110
- return x402Settle(
111
- signer as Parameters<typeof x402Settle>[0],
112
- payload,
113
- requirements,
114
- );
115
- },
116
- };
117
- }
118
-
119
- /** The relayer address, so an operator can check what they must fund with gas. */
120
- export function relayerAddress(privateKey: Hex): `0x${string}` {
121
- return privateKeyToAccount(privateKey).address;
122
- }
@@ -1,228 +0,0 @@
1
- import {
2
- discoverServices,
3
- type DiscoverServicesOptions,
4
- type ServiceListing,
5
- } from "../discovery/registry.js";
6
- import type { SignedListingPayee } from "./payment-requirements.js";
7
-
8
- /**
9
- * Maps an x402 `PaymentRequirements.resource` URL onto the Metrik listing that
10
- * serves it — the step that decides whether Metrik has any business having an
11
- * opinion about a payment at all.
12
- *
13
- * ## Derived, never supplied
14
- *
15
- * The only thing taken from the request is the `resource` URL itself, because
16
- * the x402 wire format gives the facilitator nothing else to key on. Everything
17
- * the verdict is actually computed from — which listing that URL belongs to, the
18
- * operator address on it, and the delivery record for it — is resolved HERE,
19
- * from Metrik's own verified view of the registry. In particular the
20
- * `extra.metrikServiceRef` hint that `buildMetrikPaymentRequirements` publishes
21
- * is deliberately ignored: it rides inside a caller-supplied body, and reading
22
- * it would let a caller choose which service's delivery record gets checked.
23
- *
24
- * ## Origin matching, and why not path matching
25
- *
26
- * A listing owns an ORIGIN (scheme + host + port). Matching on origin means a
27
- * seller does not have to re-register every route, and it cannot over-reach: two
28
- * listings never share an origin, because the origin is what the oracle probes
29
- * and what `serviceRef` is derived from. A resource whose origin matches no
30
- * listing is simply not ours.
31
- */
32
-
33
- export interface ResolvedMetrikResource extends SignedListingPayee {
34
- /** The listing, as verified by `discoverServices` (EIP-712 signer recovered). */
35
- readonly listing: ServiceListing;
36
- /** Which of the listing's signed origins the resource matched. */
37
- readonly matchedOrigin: string;
38
- }
39
-
40
- export type ResourceIndexStatus =
41
- | "resolved"
42
- | "not-listed"
43
- /**
44
- * Two or more signed listings claim this origin, so there is no single right
45
- * answer about whose delivery record applies.
46
- *
47
- * Picking one — which "first claimant wins" did — is the origin-squatting
48
- * primitive: a second listing claiming a victim's origin could take over the
49
- * victim's gate and permanently refuse their payments. Not exploitable while
50
- * listing insertion requires an operator-held key, but "unresolvable" costs
51
- * nothing and removes the primitive before registration ever opens.
52
- */
53
- | "ambiguous"
54
- | "registry-unavailable";
55
-
56
- export interface ResourceLookup {
57
- readonly status: ResourceIndexStatus;
58
- readonly resource?: ResolvedMetrikResource;
59
- }
60
-
61
- export interface MetrikResourceIndex {
62
- /** Never throws: an unreachable registry is a status, not an exception. */
63
- lookup(resourceUrl: string): Promise<ResourceLookup>;
64
- }
65
-
66
- /** How long a registry snapshot is reused before a refresh is attempted. */
67
- export const DEFAULT_RESOURCE_INDEX_REFRESH_MS = 60_000;
68
-
69
- /**
70
- * How long a stale snapshot keeps being served after refreshes start failing.
71
- * Serving a stale listing is safe in a way that serving a stale DELIVERY verdict
72
- * is not: listings change on a human timescale (a new signed descriptor), and
73
- * the fields used from them — `operator`, `serviceRef` — are the stable ones. The
74
- * live verdict is always fetched fresh by the delivery oracle.
75
- */
76
- export const DEFAULT_RESOURCE_INDEX_MAX_STALE_MS = 15 * 60_000;
77
-
78
- export interface RegistryResourceIndexOptions {
79
- readonly discover?: () => Promise<readonly ServiceListing[]>;
80
- readonly discoverOptions?: DiscoverServicesOptions;
81
- readonly refreshMs?: number;
82
- readonly maxStaleMs?: number;
83
- readonly now?: () => number;
84
- }
85
-
86
- export function createRegistryResourceIndex(
87
- options: RegistryResourceIndexOptions = {},
88
- ): MetrikResourceIndex {
89
- const refreshMs = options.refreshMs ?? DEFAULT_RESOURCE_INDEX_REFRESH_MS;
90
- const maxStaleMs = options.maxStaleMs ?? DEFAULT_RESOURCE_INDEX_MAX_STALE_MS;
91
- const now = options.now ?? (() => Date.now());
92
- const discover =
93
- options.discover ??
94
- (() =>
95
- discoverServices(options.discoverOptions ?? {}) as Promise<
96
- readonly ServiceListing[]
97
- >);
98
-
99
- interface Snapshot {
100
- readonly loadedAtMs: number;
101
- readonly byOrigin: ReadonlyMap<string, ResolvedMetrikResource>;
102
- readonly ambiguous: ReadonlySet<string>;
103
- }
104
- let snapshot: Snapshot | undefined;
105
- let inFlight: Promise<Snapshot | undefined> | undefined;
106
-
107
- async function refresh(): Promise<Snapshot | undefined> {
108
- try {
109
- const listings = await discover();
110
- const byOrigin = new Map<string, ResolvedMetrikResource>();
111
- const ambiguous = new Set<string>();
112
- for (const listing of listings) {
113
- for (const origin of signedOriginsOf(listing)) {
114
- const claimed = byOrigin.get(origin);
115
- if (claimed === undefined) {
116
- byOrigin.set(origin, {
117
- serviceRef: listing.serviceRef,
118
- operator: listing.operator,
119
- listing,
120
- matchedOrigin: origin,
121
- });
122
- continue;
123
- }
124
- // A DIFFERENT service claiming an origin another already claims makes
125
- // the origin unresolvable, not first-come-first-served. See the
126
- // `ambiguous` doc on `ResourceIndexStatus`. A listing re-claiming its
127
- // OWN origin (e.g. publicUrl and baseUrl agreeing) is not a conflict.
128
- if (
129
- claimed.serviceRef.toLowerCase() !==
130
- listing.serviceRef.toLowerCase()
131
- ) {
132
- ambiguous.add(origin);
133
- }
134
- }
135
- }
136
- for (const origin of ambiguous) {
137
- byOrigin.delete(origin);
138
- }
139
- return { loadedAtMs: now(), byOrigin, ambiguous };
140
- } catch {
141
- return undefined;
142
- }
143
- }
144
-
145
- async function currentSnapshot(): Promise<Snapshot | undefined> {
146
- const cached = snapshot;
147
- if (cached !== undefined && now() - cached.loadedAtMs < refreshMs) {
148
- return cached;
149
- }
150
- inFlight ??= refresh().finally(() => {
151
- inFlight = undefined;
152
- });
153
- const loaded = await inFlight;
154
- if (loaded !== undefined) {
155
- snapshot = loaded;
156
- return loaded;
157
- }
158
- if (cached !== undefined && now() - cached.loadedAtMs <= maxStaleMs) {
159
- return cached;
160
- }
161
- return undefined;
162
- }
163
-
164
- return {
165
- async lookup(resourceUrl) {
166
- const origin = originOf(resourceUrl);
167
- if (origin === undefined) {
168
- return { status: "not-listed" };
169
- }
170
- const loaded = await currentSnapshot();
171
- if (loaded === undefined) {
172
- return { status: "registry-unavailable" };
173
- }
174
- if (loaded.ambiguous.has(origin)) {
175
- return { status: "ambiguous" };
176
- }
177
- const resource = loaded.byOrigin.get(origin);
178
- return resource === undefined
179
- ? { status: "not-listed" }
180
- : { status: "resolved", resource };
181
- },
182
- };
183
- }
184
-
185
- /** Every origin the SIGNED record claims for a listing. */
186
- export function signedOriginsOf(listing: ServiceListing): readonly string[] {
187
- const candidates: (string | undefined)[] = [
188
- listing.publicUrl,
189
- listing.accessUrl,
190
- ];
191
- const descriptor = (
192
- listing.signed as {
193
- descriptor?: {
194
- interface?: { baseUrl?: string };
195
- callerAuth?: { accessUrl?: string };
196
- publicUrl?: string;
197
- };
198
- }
199
- ).descriptor;
200
- if (descriptor !== undefined) {
201
- candidates.push(
202
- descriptor.publicUrl,
203
- descriptor.interface?.baseUrl,
204
- descriptor.callerAuth?.accessUrl,
205
- );
206
- }
207
- const origins = new Set<string>();
208
- for (const candidate of candidates) {
209
- const origin = candidate === undefined ? undefined : originOf(candidate);
210
- if (origin !== undefined) {
211
- origins.add(origin);
212
- }
213
- }
214
- return [...origins];
215
- }
216
-
217
- /** Normalized `scheme://host[:port]`, or `undefined` if not a usable URL. */
218
- export function originOf(url: string): string | undefined {
219
- try {
220
- const parsed = new URL(url);
221
- if (parsed.protocol !== "http:" && parsed.protocol !== "https:") {
222
- return undefined;
223
- }
224
- return `${parsed.protocol}//${parsed.host.toLowerCase()}`;
225
- } catch {
226
- return undefined;
227
- }
228
- }