agentwallet-sdk 4.0.5 → 5.0.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 (400) hide show
  1. package/README.md +154 -158
  2. package/dist/abi.d.ts +396 -46
  3. package/dist/abi.d.ts.map +1 -1
  4. package/dist/abi.js +0 -2
  5. package/dist/abi.js.map +1 -1
  6. package/dist/ap2/index.d.ts +185 -0
  7. package/dist/ap2/index.d.ts.map +1 -0
  8. package/dist/ap2/index.js +255 -0
  9. package/dist/ap2/index.js.map +1 -0
  10. package/dist/bridge/abis.d.ts.map +1 -1
  11. package/dist/bridge/abis.js +0 -2
  12. package/dist/bridge/abis.js.map +1 -1
  13. package/dist/bridge/client.d.ts +28 -43
  14. package/dist/bridge/client.d.ts.map +1 -1
  15. package/dist/bridge/client.js +0 -2
  16. package/dist/bridge/client.js.map +1 -1
  17. package/dist/bridge/index.d.ts +1 -0
  18. package/dist/bridge/index.d.ts.map +1 -1
  19. package/dist/bridge/index.js +0 -2
  20. package/dist/bridge/index.js.map +1 -1
  21. package/dist/bridge/types.d.ts +48 -32
  22. package/dist/bridge/types.d.ts.map +1 -1
  23. package/dist/bridge/types.js +0 -2
  24. package/dist/bridge/types.js.map +1 -1
  25. package/dist/bridge/unified.d.ts +101 -0
  26. package/dist/bridge/unified.d.ts.map +1 -0
  27. package/dist/bridge/unified.js +284 -0
  28. package/dist/bridge/unified.js.map +1 -0
  29. package/dist/chains.d.ts +62 -0
  30. package/dist/chains.d.ts.map +1 -0
  31. package/dist/chains.js +108 -0
  32. package/dist/chains.js.map +1 -0
  33. package/dist/escrow/MutualStakeEscrow.d.ts +75 -0
  34. package/dist/escrow/MutualStakeEscrow.d.ts.map +1 -0
  35. package/dist/escrow/MutualStakeEscrow.js +339 -0
  36. package/dist/escrow/MutualStakeEscrow.js.map +1 -0
  37. package/dist/escrow/types.d.ts +59 -0
  38. package/dist/escrow/types.d.ts.map +1 -0
  39. package/dist/escrow/types.js +11 -0
  40. package/dist/escrow/types.js.map +1 -0
  41. package/dist/escrow/verifiers.d.ts +26 -0
  42. package/dist/escrow/verifiers.d.ts.map +1 -0
  43. package/dist/escrow/verifiers.js +53 -0
  44. package/dist/escrow/verifiers.js.map +1 -0
  45. package/dist/fiat/index.d.ts +10 -0
  46. package/dist/fiat/index.d.ts.map +1 -0
  47. package/dist/fiat/index.js +9 -0
  48. package/dist/fiat/index.js.map +1 -0
  49. package/dist/fiat/onramp.d.ts +101 -0
  50. package/dist/fiat/onramp.d.ts.map +1 -0
  51. package/dist/fiat/onramp.js +155 -0
  52. package/dist/fiat/onramp.js.map +1 -0
  53. package/dist/fiat/providers/index.d.ts +16 -0
  54. package/dist/fiat/providers/index.d.ts.map +1 -0
  55. package/dist/fiat/providers/index.js +30 -0
  56. package/dist/fiat/providers/index.js.map +1 -0
  57. package/dist/fiat/providers/moonpay.d.ts +22 -0
  58. package/dist/fiat/providers/moonpay.d.ts.map +1 -0
  59. package/dist/fiat/providers/moonpay.js +107 -0
  60. package/dist/fiat/providers/moonpay.js.map +1 -0
  61. package/dist/fiat/providers/stripe.d.ts +26 -0
  62. package/dist/fiat/providers/stripe.d.ts.map +1 -0
  63. package/dist/fiat/providers/stripe.js +135 -0
  64. package/dist/fiat/providers/stripe.js.map +1 -0
  65. package/dist/fiat/providers/transak.d.ts +26 -0
  66. package/dist/fiat/providers/transak.d.ts.map +1 -0
  67. package/dist/fiat/providers/transak.js +119 -0
  68. package/dist/fiat/providers/transak.js.map +1 -0
  69. package/dist/fiat/types.d.ts +106 -0
  70. package/dist/fiat/types.d.ts.map +1 -0
  71. package/dist/fiat/types.js +13 -0
  72. package/dist/fiat/types.js.map +1 -0
  73. package/dist/flash/executor.d.ts +119 -0
  74. package/dist/flash/executor.d.ts.map +1 -0
  75. package/dist/flash/executor.js +195 -0
  76. package/dist/flash/executor.js.map +1 -0
  77. package/dist/flash/index.d.ts +28 -0
  78. package/dist/flash/index.d.ts.map +1 -0
  79. package/dist/flash/index.js +29 -0
  80. package/dist/flash/index.js.map +1 -0
  81. package/dist/flash/scanner.d.ts +133 -0
  82. package/dist/flash/scanner.d.ts.map +1 -0
  83. package/dist/flash/scanner.js +212 -0
  84. package/dist/flash/scanner.js.map +1 -0
  85. package/dist/flash/types.d.ts +136 -0
  86. package/dist/flash/types.d.ts.map +1 -0
  87. package/dist/flash/types.js +23 -0
  88. package/dist/flash/types.js.map +1 -0
  89. package/dist/gas/index.d.ts +4 -0
  90. package/dist/gas/index.d.ts.map +1 -0
  91. package/dist/gas/index.js +3 -0
  92. package/dist/gas/index.js.map +1 -0
  93. package/dist/gas/sponsor.d.ts +70 -0
  94. package/dist/gas/sponsor.d.ts.map +1 -0
  95. package/dist/gas/sponsor.js +193 -0
  96. package/dist/gas/sponsor.js.map +1 -0
  97. package/dist/gas/types.d.ts +76 -0
  98. package/dist/gas/types.d.ts.map +1 -0
  99. package/dist/gas/types.js +21 -0
  100. package/dist/gas/types.js.map +1 -0
  101. package/dist/identity/agent-identity.d.ts +276 -0
  102. package/dist/identity/agent-identity.d.ts.map +1 -0
  103. package/dist/identity/agent-identity.js +300 -0
  104. package/dist/identity/agent-identity.js.map +1 -0
  105. package/dist/identity/erc6551.d.ts +441 -0
  106. package/dist/identity/erc6551.d.ts.map +1 -0
  107. package/dist/identity/erc6551.js +517 -0
  108. package/dist/identity/erc6551.js.map +1 -0
  109. package/dist/identity/erc8004.d.ts +296 -141
  110. package/dist/identity/erc8004.d.ts.map +1 -1
  111. package/dist/identity/erc8004.js +43 -12
  112. package/dist/identity/erc8004.js.map +1 -1
  113. package/dist/identity/index.d.ts +6 -2
  114. package/dist/identity/index.d.ts.map +1 -1
  115. package/dist/identity/index.js +3 -2
  116. package/dist/identity/index.js.map +1 -1
  117. package/dist/identity/reputation.d.ts +318 -0
  118. package/dist/identity/reputation.d.ts.map +1 -0
  119. package/dist/identity/reputation.js +272 -0
  120. package/dist/identity/reputation.js.map +1 -0
  121. package/dist/identity/validation.d.ts +284 -0
  122. package/dist/identity/validation.d.ts.map +1 -0
  123. package/dist/identity/validation.js +226 -0
  124. package/dist/identity/validation.js.map +1 -0
  125. package/dist/index.d.ts +32624 -1011
  126. package/dist/index.d.ts.map +1 -1
  127. package/dist/index.js +16 -12
  128. package/dist/index.js.map +1 -1
  129. package/dist/mev/index.d.ts +4 -0
  130. package/dist/mev/index.d.ts.map +1 -0
  131. package/dist/mev/index.js +8 -0
  132. package/dist/mev/index.js.map +1 -0
  133. package/dist/mev/protection.d.ts +54 -0
  134. package/dist/mev/protection.d.ts.map +1 -0
  135. package/dist/mev/protection.js +185 -0
  136. package/dist/mev/protection.js.map +1 -0
  137. package/dist/mev/risk.d.ts +19 -0
  138. package/dist/mev/risk.d.ts.map +1 -0
  139. package/dist/mev/risk.js +95 -0
  140. package/dist/mev/risk.js.map +1 -0
  141. package/dist/mev/types.d.ts +49 -0
  142. package/dist/mev/types.d.ts.map +1 -0
  143. package/dist/mev/types.js +2 -0
  144. package/dist/mev/types.js.map +1 -0
  145. package/dist/plugins/elizaos.d.ts +26 -14
  146. package/dist/plugins/elizaos.d.ts.map +1 -1
  147. package/dist/plugins/elizaos.js +0 -2
  148. package/dist/plugins/elizaos.js.map +1 -1
  149. package/dist/policy/SpendingPolicy.d.ts +89 -15
  150. package/dist/policy/SpendingPolicy.d.ts.map +1 -1
  151. package/dist/policy/SpendingPolicy.js +0 -2
  152. package/dist/policy/SpendingPolicy.js.map +1 -1
  153. package/dist/policy/SpendingPolicy.test.d.ts +2 -0
  154. package/dist/policy/SpendingPolicy.test.d.ts.map +1 -0
  155. package/dist/policy/SpendingPolicy.test.js +143 -0
  156. package/dist/policy/SpendingPolicy.test.js.map +1 -0
  157. package/dist/settlement/index.d.ts +4 -0
  158. package/dist/settlement/index.d.ts.map +1 -0
  159. package/dist/settlement/index.js +3 -0
  160. package/dist/settlement/index.js.map +1 -0
  161. package/dist/settlement/types.d.ts +66 -0
  162. package/dist/settlement/types.d.ts.map +1 -0
  163. package/dist/settlement/types.js +37 -0
  164. package/dist/settlement/types.js.map +1 -0
  165. package/dist/settlement/verifier.d.ts +75 -0
  166. package/dist/settlement/verifier.d.ts.map +1 -0
  167. package/dist/settlement/verifier.js +354 -0
  168. package/dist/settlement/verifier.js.map +1 -0
  169. package/dist/solana/bridge.d.ts +144 -0
  170. package/dist/solana/bridge.d.ts.map +1 -0
  171. package/dist/solana/bridge.js +352 -0
  172. package/dist/solana/bridge.js.map +1 -0
  173. package/dist/solana/index.d.ts +8 -0
  174. package/dist/solana/index.d.ts.map +1 -0
  175. package/dist/solana/index.js +6 -0
  176. package/dist/solana/index.js.map +1 -0
  177. package/dist/solana/swap.d.ts +85 -0
  178. package/dist/solana/swap.d.ts.map +1 -0
  179. package/dist/solana/swap.js +173 -0
  180. package/dist/solana/swap.js.map +1 -0
  181. package/dist/solana/types.d.ts +126 -0
  182. package/dist/solana/types.d.ts.map +1 -0
  183. package/dist/solana/types.js +10 -0
  184. package/dist/solana/types.js.map +1 -0
  185. package/dist/solana/wallet.d.ts +83 -0
  186. package/dist/solana/wallet.d.ts.map +1 -0
  187. package/dist/solana/wallet.js +164 -0
  188. package/dist/solana/wallet.js.map +1 -0
  189. package/dist/solana/x402.d.ts +69 -0
  190. package/dist/solana/x402.d.ts.map +1 -0
  191. package/dist/solana/x402.js +154 -0
  192. package/dist/solana/x402.js.map +1 -0
  193. package/dist/solver/adapter.d.ts +47 -0
  194. package/dist/solver/adapter.d.ts.map +1 -0
  195. package/dist/solver/adapter.js +146 -0
  196. package/dist/solver/adapter.js.map +1 -0
  197. package/dist/solver/analyzer.d.ts +48 -0
  198. package/dist/solver/analyzer.d.ts.map +1 -0
  199. package/dist/solver/analyzer.js +171 -0
  200. package/dist/solver/analyzer.js.map +1 -0
  201. package/dist/solver/builder.d.ts +31 -0
  202. package/dist/solver/builder.d.ts.map +1 -0
  203. package/dist/solver/builder.js +60 -0
  204. package/dist/solver/builder.js.map +1 -0
  205. package/dist/solver/index.d.ts +22 -0
  206. package/dist/solver/index.d.ts.map +1 -0
  207. package/dist/solver/index.js +25 -0
  208. package/dist/solver/index.js.map +1 -0
  209. package/dist/solver/types.d.ts +115 -0
  210. package/dist/solver/types.d.ts.map +1 -0
  211. package/dist/solver/types.js +10 -0
  212. package/dist/solver/types.js.map +1 -0
  213. package/dist/spend-guard/index.d.ts +125 -0
  214. package/dist/spend-guard/index.d.ts.map +1 -0
  215. package/dist/spend-guard/index.js +150 -0
  216. package/dist/spend-guard/index.js.map +1 -0
  217. package/dist/swap/SwapModule.d.ts +28 -39
  218. package/dist/swap/SwapModule.d.ts.map +1 -1
  219. package/dist/swap/SwapModule.js +2 -4
  220. package/dist/swap/SwapModule.js.map +1 -1
  221. package/dist/swap/abi.d.ts.map +1 -1
  222. package/dist/swap/abi.js +0 -2
  223. package/dist/swap/abi.js.map +1 -1
  224. package/dist/swap/index.d.ts +1 -0
  225. package/dist/swap/index.d.ts.map +1 -1
  226. package/dist/swap/index.js +0 -2
  227. package/dist/swap/index.js.map +1 -1
  228. package/dist/swap/router/cache.d.ts +13 -0
  229. package/dist/swap/router/cache.d.ts.map +1 -0
  230. package/dist/swap/router/cache.js +30 -0
  231. package/dist/swap/router/cache.js.map +1 -0
  232. package/dist/swap/router/flashbots.d.ts +10 -0
  233. package/dist/swap/router/flashbots.d.ts.map +1 -0
  234. package/dist/swap/router/flashbots.js +43 -0
  235. package/dist/swap/router/flashbots.js.map +1 -0
  236. package/dist/swap/router/health.d.ts +17 -0
  237. package/dist/swap/router/health.d.ts.map +1 -0
  238. package/dist/swap/router/health.js +38 -0
  239. package/dist/swap/router/health.js.map +1 -0
  240. package/dist/swap/router/index.d.ts +10 -0
  241. package/dist/swap/router/index.d.ts.map +1 -0
  242. package/dist/swap/router/index.js +10 -0
  243. package/dist/swap/router/index.js.map +1 -0
  244. package/dist/swap/router/providers/cowswap.d.ts +11 -0
  245. package/dist/swap/router/providers/cowswap.d.ts.map +1 -0
  246. package/dist/swap/router/providers/cowswap.js +79 -0
  247. package/dist/swap/router/providers/cowswap.js.map +1 -0
  248. package/dist/swap/router/providers/index.d.ts +20 -0
  249. package/dist/swap/router/providers/index.d.ts.map +1 -0
  250. package/dist/swap/router/providers/index.js +32 -0
  251. package/dist/swap/router/providers/index.js.map +1 -0
  252. package/dist/swap/router/providers/jupiter.d.ts +12 -0
  253. package/dist/swap/router/providers/jupiter.d.ts.map +1 -0
  254. package/dist/swap/router/providers/jupiter.js +73 -0
  255. package/dist/swap/router/providers/jupiter.js.map +1 -0
  256. package/dist/swap/router/providers/lifi.d.ts +11 -0
  257. package/dist/swap/router/providers/lifi.d.ts.map +1 -0
  258. package/dist/swap/router/providers/lifi.js +123 -0
  259. package/dist/swap/router/providers/lifi.js.map +1 -0
  260. package/dist/swap/router/providers/oneinch.d.ts +13 -0
  261. package/dist/swap/router/providers/oneinch.d.ts.map +1 -0
  262. package/dist/swap/router/providers/oneinch.js +71 -0
  263. package/dist/swap/router/providers/oneinch.js.map +1 -0
  264. package/dist/swap/router/providers/paraswap.d.ts +11 -0
  265. package/dist/swap/router/providers/paraswap.d.ts.map +1 -0
  266. package/dist/swap/router/providers/paraswap.js +73 -0
  267. package/dist/swap/router/providers/paraswap.js.map +1 -0
  268. package/dist/swap/router/providers/uniswap.d.ts +31 -0
  269. package/dist/swap/router/providers/uniswap.d.ts.map +1 -0
  270. package/dist/swap/router/providers/uniswap.js +237 -0
  271. package/dist/swap/router/providers/uniswap.js.map +1 -0
  272. package/dist/swap/router/providers/zerox.d.ts +13 -0
  273. package/dist/swap/router/providers/zerox.d.ts.map +1 -0
  274. package/dist/swap/router/providers/zerox.js +94 -0
  275. package/dist/swap/router/providers/zerox.js.map +1 -0
  276. package/dist/swap/router/router.d.ts +86 -0
  277. package/dist/swap/router/router.d.ts.map +1 -0
  278. package/dist/swap/router/router.js +224 -0
  279. package/dist/swap/router/router.js.map +1 -0
  280. package/dist/swap/router/rsi/engine.d.ts +60 -0
  281. package/dist/swap/router/rsi/engine.d.ts.map +1 -0
  282. package/dist/swap/router/rsi/engine.js +483 -0
  283. package/dist/swap/router/rsi/engine.js.map +1 -0
  284. package/dist/swap/router/rsi/index.d.ts +3 -0
  285. package/dist/swap/router/rsi/index.d.ts.map +1 -0
  286. package/dist/swap/router/rsi/index.js +3 -0
  287. package/dist/swap/router/rsi/index.js.map +1 -0
  288. package/dist/swap/router/rsi/types.d.ts +106 -0
  289. package/dist/swap/router/rsi/types.d.ts.map +1 -0
  290. package/dist/swap/router/rsi/types.js +3 -0
  291. package/dist/swap/router/rsi/types.js.map +1 -0
  292. package/dist/swap/router/types.d.ts +120 -0
  293. package/dist/swap/router/types.d.ts.map +1 -0
  294. package/dist/swap/router/types.js +16 -0
  295. package/dist/swap/router/types.js.map +1 -0
  296. package/dist/swap/types.d.ts +41 -7
  297. package/dist/swap/types.d.ts.map +1 -1
  298. package/dist/swap/types.js +1 -3
  299. package/dist/swap/types.js.map +1 -1
  300. package/dist/tax/engine.d.ts +131 -0
  301. package/dist/tax/engine.d.ts.map +1 -0
  302. package/dist/tax/engine.js +307 -0
  303. package/dist/tax/engine.js.map +1 -0
  304. package/dist/tax/index.d.ts +9 -0
  305. package/dist/tax/index.d.ts.map +1 -0
  306. package/dist/tax/index.js +12 -0
  307. package/dist/tax/index.js.map +1 -0
  308. package/dist/tax/lots.d.ts +60 -0
  309. package/dist/tax/lots.d.ts.map +1 -0
  310. package/dist/tax/lots.js +129 -0
  311. package/dist/tax/lots.js.map +1 -0
  312. package/dist/tax/types.d.ts +113 -0
  313. package/dist/tax/types.d.ts.map +1 -0
  314. package/dist/tax/types.js +18 -0
  315. package/dist/tax/types.js.map +1 -0
  316. package/dist/types.d.ts +106 -5
  317. package/dist/types.d.ts.map +1 -1
  318. package/dist/types.js +0 -2
  319. package/dist/types.js.map +1 -1
  320. package/dist/x402/__tests__/budget.test.d.ts +2 -0
  321. package/dist/x402/__tests__/budget.test.d.ts.map +1 -0
  322. package/dist/x402/__tests__/budget.test.js +114 -0
  323. package/dist/x402/__tests__/budget.test.js.map +1 -0
  324. package/dist/x402/__tests__/client.test.d.ts +2 -0
  325. package/dist/x402/__tests__/client.test.d.ts.map +1 -0
  326. package/dist/x402/__tests__/client.test.js +107 -0
  327. package/dist/x402/__tests__/client.test.js.map +1 -0
  328. package/dist/x402/budget.d.ts +23 -15
  329. package/dist/x402/budget.d.ts.map +1 -1
  330. package/dist/x402/budget.js +0 -2
  331. package/dist/x402/budget.js.map +1 -1
  332. package/dist/x402/chains/abstract/index.d.ts +87 -59
  333. package/dist/x402/chains/abstract/index.d.ts.map +1 -1
  334. package/dist/x402/chains/abstract/index.js +0 -2
  335. package/dist/x402/chains/abstract/index.js.map +1 -1
  336. package/dist/x402/client.d.ts +27 -13
  337. package/dist/x402/client.d.ts.map +1 -1
  338. package/dist/x402/client.js +0 -2
  339. package/dist/x402/client.js.map +1 -1
  340. package/dist/x402/index.d.ts +2 -0
  341. package/dist/x402/index.d.ts.map +1 -1
  342. package/dist/x402/index.js +0 -2
  343. package/dist/x402/index.js.map +1 -1
  344. package/dist/x402/middleware.d.ts +4 -4
  345. package/dist/x402/middleware.d.ts.map +1 -1
  346. package/dist/x402/middleware.js +0 -2
  347. package/dist/x402/middleware.js.map +1 -1
  348. package/dist/x402/types.d.ts +88 -5
  349. package/dist/x402/types.d.ts.map +1 -1
  350. package/dist/x402/types.js +0 -2
  351. package/dist/x402/types.js.map +1 -1
  352. package/dist/yield/index.d.ts +26 -0
  353. package/dist/yield/index.d.ts.map +1 -0
  354. package/dist/yield/index.js +29 -0
  355. package/dist/yield/index.js.map +1 -0
  356. package/dist/yield/rates.d.ts +114 -0
  357. package/dist/yield/rates.d.ts.map +1 -0
  358. package/dist/yield/rates.js +351 -0
  359. package/dist/yield/rates.js.map +1 -0
  360. package/dist/yield/types.d.ts +134 -0
  361. package/dist/yield/types.d.ts.map +1 -0
  362. package/dist/yield/types.js +24 -0
  363. package/dist/yield/types.js.map +1 -0
  364. package/dist/yield/vault.d.ts +112 -0
  365. package/dist/yield/vault.d.ts.map +1 -0
  366. package/dist/yield/vault.js +264 -0
  367. package/dist/yield/vault.js.map +1 -0
  368. package/package.json +18 -32
  369. package/dist/__tests__/identity.did.test.d.ts +0 -2
  370. package/dist/__tests__/identity.did.test.d.ts.map +0 -1
  371. package/dist/__tests__/identity.did.test.js +0 -56
  372. package/dist/__tests__/identity.did.test.js.map +0 -1
  373. package/dist/__tests__/staking.test.d.ts +0 -2
  374. package/dist/__tests__/staking.test.d.ts.map +0 -1
  375. package/dist/__tests__/staking.test.js +0 -70
  376. package/dist/__tests__/staking.test.js.map +0 -1
  377. package/dist/__tests__/verify.test.d.ts +0 -2
  378. package/dist/__tests__/verify.test.d.ts.map +0 -1
  379. package/dist/__tests__/verify.test.js +0 -57
  380. package/dist/__tests__/verify.test.js.map +0 -1
  381. package/dist/identity/did.d.ts +0 -66
  382. package/dist/identity/did.d.ts.map +0 -1
  383. package/dist/identity/did.js +0 -186
  384. package/dist/identity/did.js.map +0 -1
  385. package/dist/staking/AgentStakingPool.d.ts +0 -100
  386. package/dist/staking/AgentStakingPool.d.ts.map +0 -1
  387. package/dist/staking/AgentStakingPool.js +0 -298
  388. package/dist/staking/AgentStakingPool.js.map +0 -1
  389. package/dist/staking/index.d.ts +0 -2
  390. package/dist/staking/index.d.ts.map +0 -1
  391. package/dist/staking/index.js +0 -2
  392. package/dist/staking/index.js.map +0 -1
  393. package/dist/verify/index.d.ts +0 -2
  394. package/dist/verify/index.d.ts.map +0 -1
  395. package/dist/verify/index.js +0 -2
  396. package/dist/verify/index.js.map +0 -1
  397. package/dist/verify/verifyAgent.d.ts +0 -42
  398. package/dist/verify/verifyAgent.d.ts.map +0 -1
  399. package/dist/verify/verifyAgent.js +0 -216
  400. package/dist/verify/verifyAgent.js.map +0 -1
@@ -0,0 +1,66 @@
1
+ export interface SettlementVerifierConfig {
2
+ /** Alchemy API key (optional — falls back to public RPC if not provided) */
3
+ alchemyApiKey?: string;
4
+ }
5
+ /** Status of an on-chain settlement */
6
+ export type SettlementStatus = 'confirmed' | 'pending' | 'failed' | 'not_found';
7
+ /** Result of verifying a single transaction */
8
+ export interface SettlementResult {
9
+ status: SettlementStatus;
10
+ txHash: string;
11
+ /** Block number where the tx was included (0 if pending/not found) */
12
+ blockNumber: bigint;
13
+ /** Number of confirmations at query time */
14
+ confirmations: number;
15
+ /** Gas used by the transaction */
16
+ gasUsed?: bigint;
17
+ /** Whether the tx succeeded (status=1) or reverted (status=0) */
18
+ success?: boolean;
19
+ /** Any error message if verification failed */
20
+ error?: string;
21
+ }
22
+ /** Result of verifying a CCTP bridge transfer end-to-end */
23
+ export interface BridgeSettlementResult {
24
+ /** Overall bridge status */
25
+ status: BridgeSettlementStatus;
26
+ /** Source chain burn transaction */
27
+ sourceTx: SettlementResult;
28
+ /** Destination chain mint transaction (if found) */
29
+ destinationTx?: SettlementResult;
30
+ /** Circle attestation status */
31
+ attestationStatus?: 'pending_confirmations' | 'complete' | 'error';
32
+ /** Amount that was bridged (from source tx logs) */
33
+ amount?: bigint;
34
+ /** Destination address that received funds */
35
+ recipient?: string;
36
+ /** Any error or warning messages */
37
+ error?: string;
38
+ }
39
+ export type BridgeSettlementStatus = 'source_confirmed_awaiting_attestation' | 'attestation_complete_awaiting_mint' | 'complete' | 'source_failed' | 'source_pending' | 'not_found' | 'error';
40
+ /** Result of verifying an x402 payment */
41
+ export interface PaymentSettlementResult {
42
+ status: SettlementStatus;
43
+ txHash: string;
44
+ /** Whether the payment went to the expected payee */
45
+ payeeVerified: boolean;
46
+ /** Whether the amount matches */
47
+ amountVerified: boolean;
48
+ /** Actual amount transferred (from event logs) */
49
+ actualAmount?: bigint;
50
+ /** Actual payee address (from event logs) */
51
+ actualPayee?: string;
52
+ /** Token contract address */
53
+ tokenAddress?: string;
54
+ error?: string;
55
+ }
56
+ /** Alchemy network slugs for settlement verification (subset: EVM chains with Alchemy support) */
57
+ export declare const SETTLEMENT_ALCHEMY_NETWORKS: Record<string, string>;
58
+ /** Public RPC fallbacks for chains without Alchemy Gas Manager support */
59
+ export declare const SETTLEMENT_PUBLIC_RPCS: Record<string, string>;
60
+ /** Circle CCTP attestation API base URL */
61
+ export declare const CIRCLE_ATTESTATION_API = "https://iris-api.circle.com/attestations";
62
+ /** ERC20 Transfer event topic: keccak256("Transfer(address,address,uint256)") */
63
+ export declare const ERC20_TRANSFER_TOPIC = "0xddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef";
64
+ /** Solana RPC endpoint */
65
+ export declare const SOLANA_RPC_URL = "https://api.mainnet-beta.solana.com";
66
+ //# sourceMappingURL=types.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../src/settlement/types.ts"],"names":[],"mappings":"AAGA,MAAM,WAAW,wBAAwB;IACvC,4EAA4E;IAC5E,aAAa,CAAC,EAAE,MAAM,CAAC;CACxB;AAED,uCAAuC;AACvC,MAAM,MAAM,gBAAgB,GAAG,WAAW,GAAG,SAAS,GAAG,QAAQ,GAAG,WAAW,CAAC;AAEhF,+CAA+C;AAC/C,MAAM,WAAW,gBAAgB;IAC/B,MAAM,EAAE,gBAAgB,CAAC;IACzB,MAAM,EAAE,MAAM,CAAC;IACf,sEAAsE;IACtE,WAAW,EAAE,MAAM,CAAC;IACpB,4CAA4C;IAC5C,aAAa,EAAE,MAAM,CAAC;IACtB,kCAAkC;IAClC,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,iEAAiE;IACjE,OAAO,CAAC,EAAE,OAAO,CAAC;IAClB,+CAA+C;IAC/C,KAAK,CAAC,EAAE,MAAM,CAAC;CAChB;AAED,4DAA4D;AAC5D,MAAM,WAAW,sBAAsB;IACrC,4BAA4B;IAC5B,MAAM,EAAE,sBAAsB,CAAC;IAC/B,oCAAoC;IACpC,QAAQ,EAAE,gBAAgB,CAAC;IAC3B,oDAAoD;IACpD,aAAa,CAAC,EAAE,gBAAgB,CAAC;IACjC,gCAAgC;IAChC,iBAAiB,CAAC,EAAE,uBAAuB,GAAG,UAAU,GAAG,OAAO,CAAC;IACnE,oDAAoD;IACpD,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,8CAA8C;IAC9C,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,oCAAoC;IACpC,KAAK,CAAC,EAAE,MAAM,CAAC;CAChB;AAED,MAAM,MAAM,sBAAsB,GAC9B,uCAAuC,GACvC,oCAAoC,GACpC,UAAU,GACV,eAAe,GACf,gBAAgB,GAChB,WAAW,GACX,OAAO,CAAC;AAEZ,0CAA0C;AAC1C,MAAM,WAAW,uBAAuB;IACtC,MAAM,EAAE,gBAAgB,CAAC;IACzB,MAAM,EAAE,MAAM,CAAC;IACf,qDAAqD;IACrD,aAAa,EAAE,OAAO,CAAC;IACvB,iCAAiC;IACjC,cAAc,EAAE,OAAO,CAAC;IACxB,kDAAkD;IAClD,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,6CAA6C;IAC7C,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,6BAA6B;IAC7B,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,KAAK,CAAC,EAAE,MAAM,CAAC;CAChB;AAED,kGAAkG;AAClG,eAAO,MAAM,2BAA2B,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAO9D,CAAC;AAEF,0EAA0E;AAC1E,eAAO,MAAM,sBAAsB,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAiBzD,CAAC;AAEF,2CAA2C;AAC3C,eAAO,MAAM,sBAAsB,6CAA6C,CAAC;AAEjF,iFAAiF;AACjF,eAAO,MAAM,oBAAoB,uEACqC,CAAC;AAEvE,0BAA0B;AAC1B,eAAO,MAAM,cAAc,wCAAwC,CAAC"}
@@ -0,0 +1,37 @@
1
+ // Settlement Verification — Types
2
+ // Verify that transactions, bridge transfers, and x402 payments actually settled on-chain.
3
+ /** Alchemy network slugs for settlement verification (subset: EVM chains with Alchemy support) */
4
+ export const SETTLEMENT_ALCHEMY_NETWORKS = {
5
+ ethereum: 'eth-mainnet',
6
+ base: 'base-mainnet',
7
+ arbitrum: 'arb-mainnet',
8
+ optimism: 'opt-mainnet',
9
+ polygon: 'polygon-mainnet',
10
+ worldchain: 'worldchain-mainnet',
11
+ };
12
+ /** Public RPC fallbacks for chains without Alchemy Gas Manager support */
13
+ export const SETTLEMENT_PUBLIC_RPCS = {
14
+ ethereum: 'https://eth.llamarpc.com',
15
+ base: 'https://mainnet.base.org',
16
+ arbitrum: 'https://arb1.arbitrum.io/rpc',
17
+ optimism: 'https://mainnet.optimism.io',
18
+ polygon: 'https://polygon-rpc.com',
19
+ worldchain: 'https://worldchain-mainnet.g.alchemy.com/public',
20
+ avalanche: 'https://api.avax.network/ext/bc/C/rpc',
21
+ unichain: 'https://mainnet.unichain.org',
22
+ linea: 'https://rpc.linea.build',
23
+ sonic: 'https://rpc.soniclabs.com',
24
+ sei: 'https://evm-rpc.sei-apis.com',
25
+ ink: 'https://rpc-gel.inkonchain.com',
26
+ hyperevm: 'https://rpc.hyperliquid.xyz/evm',
27
+ plume: 'https://rpc.plumenetwork.xyz',
28
+ xdc: 'https://rpc.xinfin.network',
29
+ codex: 'https://rpc.codex.storage',
30
+ };
31
+ /** Circle CCTP attestation API base URL */
32
+ export const CIRCLE_ATTESTATION_API = 'https://iris-api.circle.com/attestations';
33
+ /** ERC20 Transfer event topic: keccak256("Transfer(address,address,uint256)") */
34
+ export const ERC20_TRANSFER_TOPIC = '0xddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef';
35
+ /** Solana RPC endpoint */
36
+ export const SOLANA_RPC_URL = 'https://api.mainnet-beta.solana.com';
37
+ //# sourceMappingURL=types.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"types.js","sourceRoot":"","sources":["../../src/settlement/types.ts"],"names":[],"mappings":"AAAA,kCAAkC;AAClC,2FAA2F;AAsE3F,kGAAkG;AAClG,MAAM,CAAC,MAAM,2BAA2B,GAA2B;IACjE,QAAQ,EAAE,aAAa;IACvB,IAAI,EAAE,cAAc;IACpB,QAAQ,EAAE,aAAa;IACvB,QAAQ,EAAE,aAAa;IACvB,OAAO,EAAE,iBAAiB;IAC1B,UAAU,EAAE,oBAAoB;CACjC,CAAC;AAEF,0EAA0E;AAC1E,MAAM,CAAC,MAAM,sBAAsB,GAA2B;IAC5D,QAAQ,EAAE,0BAA0B;IACpC,IAAI,EAAE,0BAA0B;IAChC,QAAQ,EAAE,8BAA8B;IACxC,QAAQ,EAAE,6BAA6B;IACvC,OAAO,EAAE,yBAAyB;IAClC,UAAU,EAAE,iDAAiD;IAC7D,SAAS,EAAE,uCAAuC;IAClD,QAAQ,EAAE,8BAA8B;IACxC,KAAK,EAAE,yBAAyB;IAChC,KAAK,EAAE,2BAA2B;IAClC,GAAG,EAAE,8BAA8B;IACnC,GAAG,EAAE,gCAAgC;IACrC,QAAQ,EAAE,iCAAiC;IAC3C,KAAK,EAAE,8BAA8B;IACrC,GAAG,EAAE,4BAA4B;IACjC,KAAK,EAAE,2BAA2B;CACnC,CAAC;AAEF,2CAA2C;AAC3C,MAAM,CAAC,MAAM,sBAAsB,GAAG,0CAA0C,CAAC;AAEjF,iFAAiF;AACjF,MAAM,CAAC,MAAM,oBAAoB,GAC/B,oEAAoE,CAAC;AAEvE,0BAA0B;AAC1B,MAAM,CAAC,MAAM,cAAc,GAAG,qCAAqC,CAAC"}
@@ -0,0 +1,75 @@
1
+ import type { SettlementVerifierConfig, SettlementResult, BridgeSettlementResult, PaymentSettlementResult } from './types.js';
2
+ export declare class SettlementVerifier {
3
+ private readonly alchemyApiKey;
4
+ constructor(config?: SettlementVerifierConfig);
5
+ /**
6
+ * Verify that an EVM transaction settled on-chain.
7
+ *
8
+ * Uses Alchemy RPC if apiKey is configured and chain is supported,
9
+ * otherwise falls back to public RPCs.
10
+ *
11
+ * @param params.chain - SDK chain name (e.g. 'base', 'arbitrum')
12
+ * @param params.txHash - Transaction hash to verify
13
+ * @param params.confirmations - Minimum confirmations required (default: 1)
14
+ */
15
+ verifyEvmTransaction(params: {
16
+ chain: string;
17
+ txHash: string;
18
+ confirmations?: number;
19
+ }): Promise<SettlementResult>;
20
+ /**
21
+ * Verify that a Solana transaction settled on-chain.
22
+ *
23
+ * @param params.signature - Solana transaction signature (base58)
24
+ * @param params.commitment - Commitment level: 'confirmed' or 'finalized' (default: 'confirmed')
25
+ */
26
+ verifySolanaTransaction(params: {
27
+ signature: string;
28
+ commitment?: 'confirmed' | 'finalized';
29
+ }): Promise<SettlementResult>;
30
+ /**
31
+ * Verify a CCTP bridge transfer settled end-to-end:
32
+ * 1. Verifies source chain burn tx succeeded
33
+ * 2. Checks Circle attestation API for the message hash
34
+ * 3. Attempts to find destination mint tx (if attestation is complete)
35
+ *
36
+ * @param params.sourceTxHash - Burn tx hash on source chain
37
+ * @param params.sourceChain - Source chain name (e.g. 'solana', 'base')
38
+ * @param params.destinationChain - Destination chain name
39
+ * @param params.expectedAmount - Expected USDC amount in base units (6 decimals)
40
+ */
41
+ verifyBridgeSettlement(params: {
42
+ sourceTxHash: string;
43
+ sourceChain: string;
44
+ destinationChain: string;
45
+ expectedAmount: bigint;
46
+ }): Promise<BridgeSettlementResult>;
47
+ /**
48
+ * Verify an x402 payment settled on-chain by inspecting ERC20 Transfer event logs.
49
+ *
50
+ * Checks that the tx:
51
+ * - Succeeded (status=1)
52
+ * - Emitted an ERC20 Transfer event to expectedPayee
53
+ * - The transferred amount matches expectedAmount
54
+ *
55
+ * @param params.chain - EVM chain name
56
+ * @param params.txHash - Transaction hash
57
+ * @param params.expectedPayee - Address that should have received the payment
58
+ * @param params.expectedAmount - Amount in USDC base units (6 decimals)
59
+ */
60
+ verifyX402Payment(params: {
61
+ chain: string;
62
+ txHash: string;
63
+ expectedPayee: string;
64
+ expectedAmount: bigint;
65
+ }): Promise<PaymentSettlementResult>;
66
+ /** Get the RPC URL for a chain, preferring Alchemy over public RPCs */
67
+ private _getRpcUrl;
68
+ /** Make an EVM JSON-RPC call */
69
+ private _evmRpc;
70
+ /** Make a Solana JSON-RPC call */
71
+ private _solanaRpc;
72
+ /** Check Circle attestation API for a CCTP burn message */
73
+ private _checkCircleAttestation;
74
+ }
75
+ //# sourceMappingURL=verifier.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"verifier.d.ts","sourceRoot":"","sources":["../../src/settlement/verifier.ts"],"names":[],"mappings":"AAWA,OAAO,KAAK,EACV,wBAAwB,EACxB,gBAAgB,EAChB,sBAAsB,EACtB,uBAAuB,EACxB,MAAM,YAAY,CAAC;AASpB,qBAAa,kBAAkB;IAC7B,OAAO,CAAC,QAAQ,CAAC,aAAa,CAAqB;gBAEvC,MAAM,GAAE,wBAA6B;IAMjD;;;;;;;;;OASG;IACG,oBAAoB,CAAC,MAAM,EAAE;QACjC,KAAK,EAAE,MAAM,CAAC;QACd,MAAM,EAAE,MAAM,CAAC;QACf,aAAa,CAAC,EAAE,MAAM,CAAC;KACxB,GAAG,OAAO,CAAC,gBAAgB,CAAC;IA2E7B;;;;;OAKG;IACG,uBAAuB,CAAC,MAAM,EAAE;QACpC,SAAS,EAAE,MAAM,CAAC;QAClB,UAAU,CAAC,EAAE,WAAW,GAAG,WAAW,CAAC;KACxC,GAAG,OAAO,CAAC,gBAAgB,CAAC;IAqD7B;;;;;;;;;;OAUG;IACG,sBAAsB,CAAC,MAAM,EAAE;QACnC,YAAY,EAAE,MAAM,CAAC;QACrB,WAAW,EAAE,MAAM,CAAC;QACpB,gBAAgB,EAAE,MAAM,CAAC;QACzB,cAAc,EAAE,MAAM,CAAC;KACxB,GAAG,OAAO,CAAC,sBAAsB,CAAC;IAkEnC;;;;;;;;;;;;OAYG;IACG,iBAAiB,CAAC,MAAM,EAAE;QAC9B,KAAK,EAAE,MAAM,CAAC;QACd,MAAM,EAAE,MAAM,CAAC;QACf,aAAa,EAAE,MAAM,CAAC;QACtB,cAAc,EAAE,MAAM,CAAC;KACxB,GAAG,OAAO,CAAC,uBAAuB,CAAC;IAqFpC,uEAAuE;IACvE,OAAO,CAAC,UAAU;IAYlB,gCAAgC;YAClB,OAAO;IAoBrB,kCAAkC;YACpB,UAAU;IAmBxB,2DAA2D;YAC7C,uBAAuB;CA0BtC"}
@@ -0,0 +1,354 @@
1
+ // SettlementVerifier — On-chain settlement verification for agent transactions
2
+ //
3
+ // Verifies that bridge transfers, x402 payments, and regular transactions actually
4
+ // settled on-chain. Uses Alchemy RPC for supported chains, public RPCs as fallback.
5
+ //
6
+ // Supported verification types:
7
+ // - EVM transaction receipts (any EVM chain)
8
+ // - Solana transaction confirmation
9
+ // - CCTP bridge transfers end-to-end (source burn + attestation + dest mint)
10
+ // - x402 ERC20 payment verification (payee + amount from event logs)
11
+ import { SETTLEMENT_ALCHEMY_NETWORKS, SETTLEMENT_PUBLIC_RPCS, CIRCLE_ATTESTATION_API, ERC20_TRANSFER_TOPIC, SOLANA_RPC_URL, } from './types.js';
12
+ export class SettlementVerifier {
13
+ constructor(config = {}) {
14
+ this.alchemyApiKey = config.alchemyApiKey;
15
+ }
16
+ // ─── EVM Transaction Verification ───
17
+ /**
18
+ * Verify that an EVM transaction settled on-chain.
19
+ *
20
+ * Uses Alchemy RPC if apiKey is configured and chain is supported,
21
+ * otherwise falls back to public RPCs.
22
+ *
23
+ * @param params.chain - SDK chain name (e.g. 'base', 'arbitrum')
24
+ * @param params.txHash - Transaction hash to verify
25
+ * @param params.confirmations - Minimum confirmations required (default: 1)
26
+ */
27
+ async verifyEvmTransaction(params) {
28
+ const requiredConfirmations = params.confirmations ?? 1;
29
+ const rpcUrl = this._getRpcUrl(params.chain);
30
+ try {
31
+ // Get receipt
32
+ const receiptResp = await this._evmRpc(rpcUrl, 'eth_getTransactionReceipt', [params.txHash]);
33
+ const receipt = receiptResp.result;
34
+ if (!receipt) {
35
+ // Not mined yet — check if it's in the mempool
36
+ return {
37
+ status: 'pending',
38
+ txHash: params.txHash,
39
+ blockNumber: 0n,
40
+ confirmations: 0,
41
+ };
42
+ }
43
+ // Get current block number to compute confirmations
44
+ const blockResp = await this._evmRpc(rpcUrl, 'eth_blockNumber', []);
45
+ const currentBlock = BigInt(blockResp.result);
46
+ const txBlock = BigInt(receipt.blockNumber);
47
+ const confirmationCount = Number(currentBlock - txBlock) + 1;
48
+ const success = receipt.status === '0x1';
49
+ if (!success) {
50
+ return {
51
+ status: 'failed',
52
+ txHash: params.txHash,
53
+ blockNumber: txBlock,
54
+ confirmations: confirmationCount,
55
+ gasUsed: BigInt(receipt.gasUsed),
56
+ success: false,
57
+ error: 'Transaction reverted (status=0)',
58
+ };
59
+ }
60
+ if (confirmationCount < requiredConfirmations) {
61
+ return {
62
+ status: 'pending',
63
+ txHash: params.txHash,
64
+ blockNumber: txBlock,
65
+ confirmations: confirmationCount,
66
+ gasUsed: BigInt(receipt.gasUsed),
67
+ success: true,
68
+ };
69
+ }
70
+ return {
71
+ status: 'confirmed',
72
+ txHash: params.txHash,
73
+ blockNumber: txBlock,
74
+ confirmations: confirmationCount,
75
+ gasUsed: BigInt(receipt.gasUsed),
76
+ success: true,
77
+ };
78
+ }
79
+ catch (err) {
80
+ return {
81
+ status: 'not_found',
82
+ txHash: params.txHash,
83
+ blockNumber: 0n,
84
+ confirmations: 0,
85
+ error: err instanceof Error ? err.message : String(err),
86
+ };
87
+ }
88
+ }
89
+ // ─── Solana Transaction Verification ───
90
+ /**
91
+ * Verify that a Solana transaction settled on-chain.
92
+ *
93
+ * @param params.signature - Solana transaction signature (base58)
94
+ * @param params.commitment - Commitment level: 'confirmed' or 'finalized' (default: 'confirmed')
95
+ */
96
+ async verifySolanaTransaction(params) {
97
+ const commitment = params.commitment ?? 'confirmed';
98
+ try {
99
+ const resp = await this._solanaRpc('getTransaction', [
100
+ params.signature,
101
+ { encoding: 'json', commitment, maxSupportedTransactionVersion: 0 },
102
+ ]);
103
+ const tx = resp.result;
104
+ if (!tx) {
105
+ return {
106
+ status: 'not_found',
107
+ txHash: params.signature,
108
+ blockNumber: 0n,
109
+ confirmations: 0,
110
+ error: 'Transaction not found or not yet confirmed',
111
+ };
112
+ }
113
+ const success = tx.meta.err === null;
114
+ // Get current slot for confirmation count approximation
115
+ const slotResp = await this._solanaRpc('getSlot', [{ commitment }]);
116
+ const currentSlot = slotResp.result;
117
+ const confirmations = currentSlot - tx.slot;
118
+ return {
119
+ status: success ? 'confirmed' : 'failed',
120
+ txHash: params.signature,
121
+ blockNumber: BigInt(tx.slot),
122
+ confirmations,
123
+ success,
124
+ error: !success ? `Solana transaction error: ${JSON.stringify(tx.meta.err)}` : undefined,
125
+ };
126
+ }
127
+ catch (err) {
128
+ return {
129
+ status: 'not_found',
130
+ txHash: params.signature,
131
+ blockNumber: 0n,
132
+ confirmations: 0,
133
+ error: err instanceof Error ? err.message : String(err),
134
+ };
135
+ }
136
+ }
137
+ // ─── CCTP Bridge Settlement ───
138
+ /**
139
+ * Verify a CCTP bridge transfer settled end-to-end:
140
+ * 1. Verifies source chain burn tx succeeded
141
+ * 2. Checks Circle attestation API for the message hash
142
+ * 3. Attempts to find destination mint tx (if attestation is complete)
143
+ *
144
+ * @param params.sourceTxHash - Burn tx hash on source chain
145
+ * @param params.sourceChain - Source chain name (e.g. 'solana', 'base')
146
+ * @param params.destinationChain - Destination chain name
147
+ * @param params.expectedAmount - Expected USDC amount in base units (6 decimals)
148
+ */
149
+ async verifyBridgeSettlement(params) {
150
+ // Step 1: verify source tx
151
+ let sourceTx;
152
+ if (params.sourceChain === 'solana') {
153
+ sourceTx = await this.verifySolanaTransaction({ signature: params.sourceTxHash });
154
+ }
155
+ else {
156
+ sourceTx = await this.verifyEvmTransaction({
157
+ chain: params.sourceChain,
158
+ txHash: params.sourceTxHash,
159
+ confirmations: params.sourceChain === 'ethereum' ? 65 : 1, // Ethereum needs more for CCTP
160
+ });
161
+ }
162
+ if (sourceTx.status === 'failed') {
163
+ return {
164
+ status: 'source_failed',
165
+ sourceTx,
166
+ error: 'Source chain burn transaction failed or reverted',
167
+ };
168
+ }
169
+ if (sourceTx.status === 'pending' || sourceTx.status === 'not_found') {
170
+ return {
171
+ status: 'source_pending',
172
+ sourceTx,
173
+ };
174
+ }
175
+ // Step 2: check Circle attestation API
176
+ let attestationStatus;
177
+ try {
178
+ attestationStatus = await this._checkCircleAttestation(params.sourceTxHash);
179
+ }
180
+ catch {
181
+ attestationStatus = 'error';
182
+ }
183
+ if (attestationStatus === 'pending_confirmations') {
184
+ return {
185
+ status: 'source_confirmed_awaiting_attestation',
186
+ sourceTx,
187
+ attestationStatus,
188
+ };
189
+ }
190
+ if (attestationStatus === 'complete') {
191
+ // Step 3: Try to find the destination mint tx
192
+ // For now, we report attestation complete and let the caller poll for mint
193
+ // A full implementation would index destination chain events
194
+ return {
195
+ status: 'attestation_complete_awaiting_mint',
196
+ sourceTx,
197
+ attestationStatus,
198
+ };
199
+ }
200
+ // If we can verify source + attestation but not destination, return partial
201
+ return {
202
+ status: 'error',
203
+ sourceTx,
204
+ attestationStatus,
205
+ error: 'Could not determine attestation status',
206
+ };
207
+ }
208
+ // ─── x402 Payment Verification ───
209
+ /**
210
+ * Verify an x402 payment settled on-chain by inspecting ERC20 Transfer event logs.
211
+ *
212
+ * Checks that the tx:
213
+ * - Succeeded (status=1)
214
+ * - Emitted an ERC20 Transfer event to expectedPayee
215
+ * - The transferred amount matches expectedAmount
216
+ *
217
+ * @param params.chain - EVM chain name
218
+ * @param params.txHash - Transaction hash
219
+ * @param params.expectedPayee - Address that should have received the payment
220
+ * @param params.expectedAmount - Amount in USDC base units (6 decimals)
221
+ */
222
+ async verifyX402Payment(params) {
223
+ const rpcUrl = this._getRpcUrl(params.chain);
224
+ try {
225
+ const receiptResp = await this._evmRpc(rpcUrl, 'eth_getTransactionReceipt', [params.txHash]);
226
+ const receipt = receiptResp.result;
227
+ if (!receipt) {
228
+ return {
229
+ status: 'pending',
230
+ txHash: params.txHash,
231
+ payeeVerified: false,
232
+ amountVerified: false,
233
+ };
234
+ }
235
+ if (receipt.status !== '0x1') {
236
+ return {
237
+ status: 'failed',
238
+ txHash: params.txHash,
239
+ payeeVerified: false,
240
+ amountVerified: false,
241
+ error: 'Transaction reverted',
242
+ };
243
+ }
244
+ // Find ERC20 Transfer events — topic[0] = Transfer sig, topic[2] = to address
245
+ const expectedPayeeHex = params.expectedPayee.toLowerCase().replace('0x', '').padStart(64, '0');
246
+ const transferLog = receipt.logs.find((log) => {
247
+ return (log.topics[0]?.toLowerCase() === ERC20_TRANSFER_TOPIC &&
248
+ log.topics[2]?.toLowerCase() === `0x${expectedPayeeHex}`);
249
+ });
250
+ if (!transferLog) {
251
+ return {
252
+ status: 'confirmed',
253
+ txHash: params.txHash,
254
+ payeeVerified: false,
255
+ amountVerified: false,
256
+ error: `No ERC20 Transfer found to payee ${params.expectedPayee}`,
257
+ };
258
+ }
259
+ // Decode amount from log.data (ABI-encoded uint256)
260
+ const actualAmount = BigInt(transferLog.data);
261
+ const amountVerified = actualAmount === params.expectedAmount;
262
+ const actualPayee = `0x${transferLog.topics[2]?.slice(-40)}`;
263
+ const tokenAddress = transferLog.address;
264
+ return {
265
+ status: 'confirmed',
266
+ txHash: params.txHash,
267
+ payeeVerified: true,
268
+ amountVerified,
269
+ actualAmount,
270
+ actualPayee,
271
+ tokenAddress,
272
+ error: amountVerified
273
+ ? undefined
274
+ : `Amount mismatch: expected ${params.expectedAmount}, got ${actualAmount}`,
275
+ };
276
+ }
277
+ catch (err) {
278
+ return {
279
+ status: 'not_found',
280
+ txHash: params.txHash,
281
+ payeeVerified: false,
282
+ amountVerified: false,
283
+ error: err instanceof Error ? err.message : String(err),
284
+ };
285
+ }
286
+ }
287
+ // ─── Internal Helpers ───
288
+ /** Get the RPC URL for a chain, preferring Alchemy over public RPCs */
289
+ _getRpcUrl(chain) {
290
+ if (this.alchemyApiKey && chain in SETTLEMENT_ALCHEMY_NETWORKS) {
291
+ const slug = SETTLEMENT_ALCHEMY_NETWORKS[chain];
292
+ return `https://${slug}.g.alchemy.com/v2/${this.alchemyApiKey}`;
293
+ }
294
+ const publicRpc = SETTLEMENT_PUBLIC_RPCS[chain];
295
+ if (!publicRpc) {
296
+ throw new Error(`No RPC URL available for chain "${chain}"`);
297
+ }
298
+ return publicRpc;
299
+ }
300
+ /** Make an EVM JSON-RPC call */
301
+ async _evmRpc(url, method, params) {
302
+ const resp = await fetch(url, {
303
+ method: 'POST',
304
+ headers: { 'Content-Type': 'application/json' },
305
+ body: JSON.stringify({ jsonrpc: '2.0', id: 1, method, params }),
306
+ });
307
+ if (!resp.ok) {
308
+ throw new Error(`EVM RPC error: HTTP ${resp.status}`);
309
+ }
310
+ const json = (await resp.json());
311
+ if (json.error)
312
+ throw new Error(`EVM RPC error: ${json.error.message}`);
313
+ return json;
314
+ }
315
+ /** Make a Solana JSON-RPC call */
316
+ async _solanaRpc(method, params) {
317
+ const resp = await fetch(SOLANA_RPC_URL, {
318
+ method: 'POST',
319
+ headers: { 'Content-Type': 'application/json' },
320
+ body: JSON.stringify({ jsonrpc: '2.0', id: 1, method, params }),
321
+ });
322
+ if (!resp.ok) {
323
+ throw new Error(`Solana RPC error: HTTP ${resp.status}`);
324
+ }
325
+ const json = (await resp.json());
326
+ if (json.error)
327
+ throw new Error(`Solana RPC error: ${json.error.message}`);
328
+ return json;
329
+ }
330
+ /** Check Circle attestation API for a CCTP burn message */
331
+ async _checkCircleAttestation(burnTxHash) {
332
+ // Circle attestation API: GET /attestations/{messageHash}
333
+ // For CCTP, the messageHash is derived from the MessageSent event in the burn tx.
334
+ // Since we don't have the full event parsing here, we query by tx hash pattern.
335
+ // In production, callers should provide the message hash from the burn tx receipt.
336
+ const url = `${CIRCLE_ATTESTATION_API}/${burnTxHash}`;
337
+ const resp = await fetch(url, {
338
+ headers: { Accept: 'application/json' },
339
+ });
340
+ if (resp.status === 404) {
341
+ return 'pending_confirmations';
342
+ }
343
+ if (!resp.ok) {
344
+ return 'error';
345
+ }
346
+ const json = (await resp.json());
347
+ if (json.status === 'complete')
348
+ return 'complete';
349
+ if (json.status === 'pending_confirmations')
350
+ return 'pending_confirmations';
351
+ return 'error';
352
+ }
353
+ }
354
+ //# sourceMappingURL=verifier.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"verifier.js","sourceRoot":"","sources":["../../src/settlement/verifier.ts"],"names":[],"mappings":"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"}