@echoclaw/echo-0g 1.0.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (371) hide show
  1. package/README.md +1175 -0
  2. package/dist/0g-compute/account.d.ts +36 -0
  3. package/dist/0g-compute/account.d.ts.map +1 -0
  4. package/dist/0g-compute/account.js +85 -0
  5. package/dist/0g-compute/account.js.map +1 -0
  6. package/dist/0g-compute/bridge.d.ts +16 -0
  7. package/dist/0g-compute/bridge.d.ts.map +1 -0
  8. package/dist/0g-compute/bridge.js +40 -0
  9. package/dist/0g-compute/bridge.js.map +1 -0
  10. package/dist/0g-compute/broker-factory.d.ts +19 -0
  11. package/dist/0g-compute/broker-factory.d.ts.map +1 -0
  12. package/dist/0g-compute/broker-factory.js +65 -0
  13. package/dist/0g-compute/broker-factory.js.map +1 -0
  14. package/dist/0g-compute/constants.d.ts +10 -0
  15. package/dist/0g-compute/constants.d.ts.map +1 -0
  16. package/dist/0g-compute/constants.js +12 -0
  17. package/dist/0g-compute/constants.js.map +1 -0
  18. package/dist/0g-compute/monitor.d.ts +43 -0
  19. package/dist/0g-compute/monitor.d.ts.map +1 -0
  20. package/dist/0g-compute/monitor.js +302 -0
  21. package/dist/0g-compute/monitor.js.map +1 -0
  22. package/dist/0g-compute/pricing.d.ts +43 -0
  23. package/dist/0g-compute/pricing.d.ts.map +1 -0
  24. package/dist/0g-compute/pricing.js +53 -0
  25. package/dist/0g-compute/pricing.js.map +1 -0
  26. package/dist/0g-compute/sdk-bridge.cjs +17 -0
  27. package/dist/0g-compute/sdk-bridge.cjs.map +1 -0
  28. package/dist/0g-compute/sdk-bridge.d.cts +9 -0
  29. package/dist/0g-compute/sdk-bridge.d.cts.map +1 -0
  30. package/dist/0g-compute/smoke-test.d.ts +11 -0
  31. package/dist/0g-compute/smoke-test.d.ts.map +1 -0
  32. package/dist/0g-compute/smoke-test.js +172 -0
  33. package/dist/0g-compute/smoke-test.js.map +1 -0
  34. package/dist/bot/daemon.d.ts +34 -0
  35. package/dist/bot/daemon.d.ts.map +1 -0
  36. package/dist/bot/daemon.js +386 -0
  37. package/dist/bot/daemon.js.map +1 -0
  38. package/dist/bot/executor.d.ts +14238 -0
  39. package/dist/bot/executor.d.ts.map +1 -0
  40. package/dist/bot/executor.js +183 -0
  41. package/dist/bot/executor.js.map +1 -0
  42. package/dist/bot/nonce-queue.d.ts +20 -0
  43. package/dist/bot/nonce-queue.d.ts.map +1 -0
  44. package/dist/bot/nonce-queue.js +41 -0
  45. package/dist/bot/nonce-queue.js.map +1 -0
  46. package/dist/bot/notify.d.ts +15 -0
  47. package/dist/bot/notify.d.ts.map +1 -0
  48. package/dist/bot/notify.js +98 -0
  49. package/dist/bot/notify.js.map +1 -0
  50. package/dist/bot/orders.d.ts +30 -0
  51. package/dist/bot/orders.d.ts.map +1 -0
  52. package/dist/bot/orders.js +172 -0
  53. package/dist/bot/orders.js.map +1 -0
  54. package/dist/bot/state.d.ts +14 -0
  55. package/dist/bot/state.d.ts.map +1 -0
  56. package/dist/bot/state.js +109 -0
  57. package/dist/bot/state.js.map +1 -0
  58. package/dist/bot/stream.d.ts +28 -0
  59. package/dist/bot/stream.d.ts.map +1 -0
  60. package/dist/bot/stream.js +96 -0
  61. package/dist/bot/stream.js.map +1 -0
  62. package/dist/bot/triggers.d.ts +17 -0
  63. package/dist/bot/triggers.d.ts.map +1 -0
  64. package/dist/bot/triggers.js +95 -0
  65. package/dist/bot/triggers.js.map +1 -0
  66. package/dist/bot/types.d.ts +199 -0
  67. package/dist/bot/types.d.ts.map +1 -0
  68. package/dist/bot/types.js +12 -0
  69. package/dist/bot/types.js.map +1 -0
  70. package/dist/chainscan/client.d.ts +28 -0
  71. package/dist/chainscan/client.d.ts.map +1 -0
  72. package/dist/chainscan/client.js +361 -0
  73. package/dist/chainscan/client.js.map +1 -0
  74. package/dist/chainscan/constants.d.ts +15 -0
  75. package/dist/chainscan/constants.d.ts.map +1 -0
  76. package/dist/chainscan/constants.js +15 -0
  77. package/dist/chainscan/constants.js.map +1 -0
  78. package/dist/chainscan/types.d.ts +148 -0
  79. package/dist/chainscan/types.d.ts.map +1 -0
  80. package/dist/chainscan/types.js +2 -0
  81. package/dist/chainscan/types.js.map +1 -0
  82. package/dist/chainscan/validation.d.ts +35 -0
  83. package/dist/chainscan/validation.d.ts.map +1 -0
  84. package/dist/chainscan/validation.js +97 -0
  85. package/dist/chainscan/validation.js.map +1 -0
  86. package/dist/cli.d.ts +7 -0
  87. package/dist/cli.d.ts.map +1 -0
  88. package/dist/cli.js +328 -0
  89. package/dist/cli.js.map +1 -0
  90. package/dist/commands/0g-compute.d.ts +21 -0
  91. package/dist/commands/0g-compute.d.ts.map +1 -0
  92. package/dist/commands/0g-compute.js +850 -0
  93. package/dist/commands/0g-compute.js.map +1 -0
  94. package/dist/commands/chainscan.d.ts +17 -0
  95. package/dist/commands/chainscan.d.ts.map +1 -0
  96. package/dist/commands/chainscan.js +605 -0
  97. package/dist/commands/chainscan.js.map +1 -0
  98. package/dist/commands/config.d.ts +3 -0
  99. package/dist/commands/config.d.ts.map +1 -0
  100. package/dist/commands/config.js +251 -0
  101. package/dist/commands/config.js.map +1 -0
  102. package/dist/commands/echobook.d.ts +17 -0
  103. package/dist/commands/echobook.d.ts.map +1 -0
  104. package/dist/commands/echobook.js +905 -0
  105. package/dist/commands/echobook.js.map +1 -0
  106. package/dist/commands/jaine-subgraph.d.ts +3 -0
  107. package/dist/commands/jaine-subgraph.d.ts.map +1 -0
  108. package/dist/commands/jaine-subgraph.js +565 -0
  109. package/dist/commands/jaine-subgraph.js.map +1 -0
  110. package/dist/commands/jaine.d.ts +3 -0
  111. package/dist/commands/jaine.d.ts.map +1 -0
  112. package/dist/commands/jaine.js +1415 -0
  113. package/dist/commands/jaine.js.map +1 -0
  114. package/dist/commands/marketmaker.d.ts +6 -0
  115. package/dist/commands/marketmaker.d.ts.map +1 -0
  116. package/dist/commands/marketmaker.js +451 -0
  117. package/dist/commands/marketmaker.js.map +1 -0
  118. package/dist/commands/send.d.ts +3 -0
  119. package/dist/commands/send.d.ts.map +1 -0
  120. package/dist/commands/send.js +229 -0
  121. package/dist/commands/send.js.map +1 -0
  122. package/dist/commands/setup.d.ts +3 -0
  123. package/dist/commands/setup.d.ts.map +1 -0
  124. package/dist/commands/setup.js +263 -0
  125. package/dist/commands/setup.js.map +1 -0
  126. package/dist/commands/slop-app.d.ts +9 -0
  127. package/dist/commands/slop-app.d.ts.map +1 -0
  128. package/dist/commands/slop-app.js +708 -0
  129. package/dist/commands/slop-app.js.map +1 -0
  130. package/dist/commands/slop-stream.d.ts +9 -0
  131. package/dist/commands/slop-stream.d.ts.map +1 -0
  132. package/dist/commands/slop-stream.js +99 -0
  133. package/dist/commands/slop-stream.js.map +1 -0
  134. package/dist/commands/slop.d.ts +3 -0
  135. package/dist/commands/slop.d.ts.map +1 -0
  136. package/dist/commands/slop.js +1053 -0
  137. package/dist/commands/slop.js.map +1 -0
  138. package/dist/commands/wallet.d.ts +13 -0
  139. package/dist/commands/wallet.d.ts.map +1 -0
  140. package/dist/commands/wallet.js +748 -0
  141. package/dist/commands/wallet.js.map +1 -0
  142. package/dist/config/paths.d.ts +13 -0
  143. package/dist/config/paths.d.ts.map +1 -0
  144. package/dist/config/paths.js +33 -0
  145. package/dist/config/paths.js.map +1 -0
  146. package/dist/config/store.d.ts +48 -0
  147. package/dist/config/store.d.ts.map +1 -0
  148. package/dist/config/store.js +113 -0
  149. package/dist/config/store.js.map +1 -0
  150. package/dist/constants/chain.d.ts +57 -0
  151. package/dist/constants/chain.d.ts.map +1 -0
  152. package/dist/constants/chain.js +51 -0
  153. package/dist/constants/chain.js.map +1 -0
  154. package/dist/echobook/api.d.ts +38 -0
  155. package/dist/echobook/api.d.ts.map +1 -0
  156. package/dist/echobook/api.js +86 -0
  157. package/dist/echobook/api.js.map +1 -0
  158. package/dist/echobook/auth.d.ts +31 -0
  159. package/dist/echobook/auth.d.ts.map +1 -0
  160. package/dist/echobook/auth.js +93 -0
  161. package/dist/echobook/auth.js.map +1 -0
  162. package/dist/echobook/comments.d.ts +26 -0
  163. package/dist/echobook/comments.d.ts.map +1 -0
  164. package/dist/echobook/comments.js +20 -0
  165. package/dist/echobook/comments.js.map +1 -0
  166. package/dist/echobook/follows.d.ts +19 -0
  167. package/dist/echobook/follows.d.ts.map +1 -0
  168. package/dist/echobook/follows.js +21 -0
  169. package/dist/echobook/follows.js.map +1 -0
  170. package/dist/echobook/jwtCache.d.ts +15 -0
  171. package/dist/echobook/jwtCache.d.ts.map +1 -0
  172. package/dist/echobook/jwtCache.js +63 -0
  173. package/dist/echobook/jwtCache.js.map +1 -0
  174. package/dist/echobook/notifications.d.ts +30 -0
  175. package/dist/echobook/notifications.d.ts.map +1 -0
  176. package/dist/echobook/notifications.js +26 -0
  177. package/dist/echobook/notifications.js.map +1 -0
  178. package/dist/echobook/points.d.ts +35 -0
  179. package/dist/echobook/points.d.ts.map +1 -0
  180. package/dist/echobook/points.js +20 -0
  181. package/dist/echobook/points.js.map +1 -0
  182. package/dist/echobook/posts.d.ts +46 -0
  183. package/dist/echobook/posts.d.ts.map +1 -0
  184. package/dist/echobook/posts.js +43 -0
  185. package/dist/echobook/posts.js.map +1 -0
  186. package/dist/echobook/profile.d.ts +29 -0
  187. package/dist/echobook/profile.d.ts.map +1 -0
  188. package/dist/echobook/profile.js +14 -0
  189. package/dist/echobook/profile.js.map +1 -0
  190. package/dist/echobook/submolts.d.ts +22 -0
  191. package/dist/echobook/submolts.d.ts.map +1 -0
  192. package/dist/echobook/submolts.js +24 -0
  193. package/dist/echobook/submolts.js.map +1 -0
  194. package/dist/echobook/tradeProof.d.ts +21 -0
  195. package/dist/echobook/tradeProof.d.ts.map +1 -0
  196. package/dist/echobook/tradeProof.js +14 -0
  197. package/dist/echobook/tradeProof.js.map +1 -0
  198. package/dist/echobook/votes.d.ts +17 -0
  199. package/dist/echobook/votes.d.ts.map +1 -0
  200. package/dist/echobook/votes.js +20 -0
  201. package/dist/echobook/votes.js.map +1 -0
  202. package/dist/errors.d.ts +125 -0
  203. package/dist/errors.d.ts.map +1 -0
  204. package/dist/errors.js +147 -0
  205. package/dist/errors.js.map +1 -0
  206. package/dist/intents/store.d.ts +22 -0
  207. package/dist/intents/store.d.ts.map +1 -0
  208. package/dist/intents/store.js +76 -0
  209. package/dist/intents/store.js.map +1 -0
  210. package/dist/intents/types.d.ts +21 -0
  211. package/dist/intents/types.d.ts.map +1 -0
  212. package/dist/intents/types.js +2 -0
  213. package/dist/intents/types.js.map +1 -0
  214. package/dist/jaine/abi/erc20.d.ts +90 -0
  215. package/dist/jaine/abi/erc20.d.ts.map +1 -0
  216. package/dist/jaine/abi/erc20.js +65 -0
  217. package/dist/jaine/abi/erc20.js.map +1 -0
  218. package/dist/jaine/abi/factory.d.ts +38 -0
  219. package/dist/jaine/abi/factory.d.ts.map +1 -0
  220. package/dist/jaine/abi/factory.js +26 -0
  221. package/dist/jaine/abi/factory.js.map +1 -0
  222. package/dist/jaine/abi/index.d.ts +11 -0
  223. package/dist/jaine/abi/index.d.ts.map +1 -0
  224. package/dist/jaine/abi/index.js +11 -0
  225. package/dist/jaine/abi/index.js.map +1 -0
  226. package/dist/jaine/abi/nftManager.d.ts +282 -0
  227. package/dist/jaine/abi/nftManager.d.ts.map +1 -0
  228. package/dist/jaine/abi/nftManager.js +182 -0
  229. package/dist/jaine/abi/nftManager.js.map +1 -0
  230. package/dist/jaine/abi/pool.d.ts +77 -0
  231. package/dist/jaine/abi/pool.d.ts.map +1 -0
  232. package/dist/jaine/abi/pool.js +56 -0
  233. package/dist/jaine/abi/pool.js.map +1 -0
  234. package/dist/jaine/abi/quoter.d.ts +84 -0
  235. package/dist/jaine/abi/quoter.d.ts.map +1 -0
  236. package/dist/jaine/abi/quoter.js +53 -0
  237. package/dist/jaine/abi/quoter.js.map +1 -0
  238. package/dist/jaine/abi/router.d.ts +135 -0
  239. package/dist/jaine/abi/router.d.ts.map +1 -0
  240. package/dist/jaine/abi/router.js +88 -0
  241. package/dist/jaine/abi/router.js.map +1 -0
  242. package/dist/jaine/abi/w0g.d.ts +41 -0
  243. package/dist/jaine/abi/w0g.d.ts.map +1 -0
  244. package/dist/jaine/abi/w0g.js +34 -0
  245. package/dist/jaine/abi/w0g.js.map +1 -0
  246. package/dist/jaine/allowance.d.ts +48 -0
  247. package/dist/jaine/allowance.d.ts.map +1 -0
  248. package/dist/jaine/allowance.js +192 -0
  249. package/dist/jaine/allowance.js.map +1 -0
  250. package/dist/jaine/coreTokens.d.ts +32 -0
  251. package/dist/jaine/coreTokens.d.ts.map +1 -0
  252. package/dist/jaine/coreTokens.js +91 -0
  253. package/dist/jaine/coreTokens.js.map +1 -0
  254. package/dist/jaine/pathEncoding.d.ts +39 -0
  255. package/dist/jaine/pathEncoding.d.ts.map +1 -0
  256. package/dist/jaine/pathEncoding.js +98 -0
  257. package/dist/jaine/pathEncoding.js.map +1 -0
  258. package/dist/jaine/paths.d.ts +11 -0
  259. package/dist/jaine/paths.d.ts.map +1 -0
  260. package/dist/jaine/paths.js +20 -0
  261. package/dist/jaine/paths.js.map +1 -0
  262. package/dist/jaine/poolCache.d.ts +47 -0
  263. package/dist/jaine/poolCache.d.ts.map +1 -0
  264. package/dist/jaine/poolCache.js +195 -0
  265. package/dist/jaine/poolCache.js.map +1 -0
  266. package/dist/jaine/routing.d.ts +41 -0
  267. package/dist/jaine/routing.d.ts.map +1 -0
  268. package/dist/jaine/routing.js +247 -0
  269. package/dist/jaine/routing.js.map +1 -0
  270. package/dist/jaine/subgraph/client.d.ts +26 -0
  271. package/dist/jaine/subgraph/client.d.ts.map +1 -0
  272. package/dist/jaine/subgraph/client.js +201 -0
  273. package/dist/jaine/subgraph/client.js.map +1 -0
  274. package/dist/jaine/subgraph/constants.d.ts +9 -0
  275. package/dist/jaine/subgraph/constants.d.ts.map +1 -0
  276. package/dist/jaine/subgraph/constants.js +9 -0
  277. package/dist/jaine/subgraph/constants.js.map +1 -0
  278. package/dist/jaine/subgraph/queries.d.ts +21 -0
  279. package/dist/jaine/subgraph/queries.d.ts.map +1 -0
  280. package/dist/jaine/subgraph/queries.js +304 -0
  281. package/dist/jaine/subgraph/queries.js.map +1 -0
  282. package/dist/jaine/subgraph/types.d.ts +209 -0
  283. package/dist/jaine/subgraph/types.d.ts.map +1 -0
  284. package/dist/jaine/subgraph/types.js +7 -0
  285. package/dist/jaine/subgraph/types.js.map +1 -0
  286. package/dist/jaine/userTokens.d.ts +27 -0
  287. package/dist/jaine/userTokens.d.ts.map +1 -0
  288. package/dist/jaine/userTokens.js +89 -0
  289. package/dist/jaine/userTokens.js.map +1 -0
  290. package/dist/openclaw/config.d.ts +43 -0
  291. package/dist/openclaw/config.d.ts.map +1 -0
  292. package/dist/openclaw/config.js +231 -0
  293. package/dist/openclaw/config.js.map +1 -0
  294. package/dist/openclaw/hooks-client.d.ts +24 -0
  295. package/dist/openclaw/hooks-client.d.ts.map +1 -0
  296. package/dist/openclaw/hooks-client.js +119 -0
  297. package/dist/openclaw/hooks-client.js.map +1 -0
  298. package/dist/slop/abi/factory.d.ts +128 -0
  299. package/dist/slop/abi/factory.d.ts.map +1 -0
  300. package/dist/slop/abi/factory.js +70 -0
  301. package/dist/slop/abi/factory.js.map +1 -0
  302. package/dist/slop/abi/feeCollector.d.ts +95 -0
  303. package/dist/slop/abi/feeCollector.d.ts.map +1 -0
  304. package/dist/slop/abi/feeCollector.js +71 -0
  305. package/dist/slop/abi/feeCollector.js.map +1 -0
  306. package/dist/slop/abi/index.d.ts +5 -0
  307. package/dist/slop/abi/index.d.ts.map +1 -0
  308. package/dist/slop/abi/index.js +5 -0
  309. package/dist/slop/abi/index.js.map +1 -0
  310. package/dist/slop/abi/registry.d.ts +135 -0
  311. package/dist/slop/abi/registry.d.ts.map +1 -0
  312. package/dist/slop/abi/registry.js +90 -0
  313. package/dist/slop/abi/registry.js.map +1 -0
  314. package/dist/slop/abi/token.d.ts +320 -0
  315. package/dist/slop/abi/token.d.ts.map +1 -0
  316. package/dist/slop/abi/token.js +251 -0
  317. package/dist/slop/abi/token.js.map +1 -0
  318. package/dist/slop/auth.d.ts +19 -0
  319. package/dist/slop/auth.d.ts.map +1 -0
  320. package/dist/slop/auth.js +92 -0
  321. package/dist/slop/auth.js.map +1 -0
  322. package/dist/slop/jwtCache.d.ts +27 -0
  323. package/dist/slop/jwtCache.d.ts.map +1 -0
  324. package/dist/slop/jwtCache.js +91 -0
  325. package/dist/slop/jwtCache.js.map +1 -0
  326. package/dist/slop/quote.d.ts +80 -0
  327. package/dist/slop/quote.d.ts.map +1 -0
  328. package/dist/slop/quote.js +174 -0
  329. package/dist/slop/quote.js.map +1 -0
  330. package/dist/utils/canonicalJson.d.ts +8 -0
  331. package/dist/utils/canonicalJson.d.ts.map +1 -0
  332. package/dist/utils/canonicalJson.js +20 -0
  333. package/dist/utils/canonicalJson.js.map +1 -0
  334. package/dist/utils/env.d.ts +11 -0
  335. package/dist/utils/env.d.ts.map +1 -0
  336. package/dist/utils/env.js +20 -0
  337. package/dist/utils/env.js.map +1 -0
  338. package/dist/utils/http.d.ts +19 -0
  339. package/dist/utils/http.d.ts.map +1 -0
  340. package/dist/utils/http.js +61 -0
  341. package/dist/utils/http.js.map +1 -0
  342. package/dist/utils/logger.d.ts +4 -0
  343. package/dist/utils/logger.d.ts.map +1 -0
  344. package/dist/utils/logger.js +21 -0
  345. package/dist/utils/logger.js.map +1 -0
  346. package/dist/utils/output.d.ts +29 -0
  347. package/dist/utils/output.d.ts.map +1 -0
  348. package/dist/utils/output.js +51 -0
  349. package/dist/utils/output.js.map +1 -0
  350. package/dist/utils/rateLimit.d.ts +22 -0
  351. package/dist/utils/rateLimit.d.ts.map +1 -0
  352. package/dist/utils/rateLimit.js +58 -0
  353. package/dist/utils/rateLimit.js.map +1 -0
  354. package/dist/utils/respond.d.ts +19 -0
  355. package/dist/utils/respond.d.ts.map +1 -0
  356. package/dist/utils/respond.js +25 -0
  357. package/dist/utils/respond.js.map +1 -0
  358. package/dist/utils/ui.d.ts +38 -0
  359. package/dist/utils/ui.d.ts.map +1 -0
  360. package/dist/utils/ui.js +126 -0
  361. package/dist/utils/ui.js.map +1 -0
  362. package/dist/wallet/client.d.ts +4 -0
  363. package/dist/wallet/client.d.ts.map +1 -0
  364. package/dist/wallet/client.js +53 -0
  365. package/dist/wallet/client.js.map +1 -0
  366. package/dist/wallet/keystore.d.ts +22 -0
  367. package/dist/wallet/keystore.d.ts.map +1 -0
  368. package/dist/wallet/keystore.js +111 -0
  369. package/dist/wallet/keystore.js.map +1 -0
  370. package/package.json +63 -0
  371. package/skills/echo/SKILL.md +1121 -0
@@ -0,0 +1,192 @@
1
+ import { maxUint256, getAddress } from "viem";
2
+ import { createWalletClient, http } from "viem";
3
+ import { privateKeyToAccount } from "viem/accounts";
4
+ import { ERC20_EXTENDED_ABI } from "./abi/erc20.js";
5
+ import { getPublicClient } from "../wallet/client.js";
6
+ import { loadConfig } from "../config/store.js";
7
+ import { EchoError, ErrorCodes } from "../errors.js";
8
+ import logger from "../utils/logger.js";
9
+ /**
10
+ * Allowed spenders - only these addresses can be approved
11
+ */
12
+ export function getAllowedSpenders() {
13
+ const cfg = loadConfig();
14
+ return {
15
+ router: cfg.protocol.jaineRouter,
16
+ nft: cfg.protocol.nftPositionManager,
17
+ };
18
+ }
19
+ /**
20
+ * Validate that spender is in the allowlist
21
+ */
22
+ export function validateSpender(spender) {
23
+ const allowed = getAllowedSpenders();
24
+ const isAllowed = Object.values(allowed).some((addr) => getAddress(addr) === getAddress(spender));
25
+ if (!isAllowed) {
26
+ throw new EchoError(ErrorCodes.INVALID_SPENDER, `Spender ${spender} is not in allowlist`, `Allowed spenders: router (${allowed.router}), nft (${allowed.nft})`);
27
+ }
28
+ }
29
+ /**
30
+ * Get spender address by type
31
+ */
32
+ export function getSpenderAddress(spenderType) {
33
+ const allowed = getAllowedSpenders();
34
+ return allowed[spenderType];
35
+ }
36
+ /**
37
+ * Get current allowance for a token
38
+ */
39
+ export async function getAllowance(token, owner, spender) {
40
+ const client = getPublicClient();
41
+ const allowance = await client.readContract({
42
+ address: token,
43
+ abi: ERC20_EXTENDED_ABI,
44
+ functionName: "allowance",
45
+ args: [owner, spender],
46
+ });
47
+ return allowance;
48
+ }
49
+ /**
50
+ * Get allowances for both spenders
51
+ */
52
+ export async function getAllAllowances(token, owner) {
53
+ const allowed = getAllowedSpenders();
54
+ const client = getPublicClient();
55
+ const [routerAllowance, nftAllowance] = await Promise.all([
56
+ client.readContract({
57
+ address: token,
58
+ abi: ERC20_EXTENDED_ABI,
59
+ functionName: "allowance",
60
+ args: [owner, allowed.router],
61
+ }),
62
+ client.readContract({
63
+ address: token,
64
+ abi: ERC20_EXTENDED_ABI,
65
+ functionName: "allowance",
66
+ args: [owner, allowed.nft],
67
+ }),
68
+ ]);
69
+ return {
70
+ router: routerAllowance,
71
+ nft: nftAllowance,
72
+ };
73
+ }
74
+ /**
75
+ * Safe approve with USDT-style reset handling
76
+ *
77
+ * Some tokens (like USDT) require setting allowance to 0 before
78
+ * setting a new non-zero allowance if current allowance is non-zero.
79
+ *
80
+ * @param token - Token address
81
+ * @param spender - Spender address (must be in allowlist)
82
+ * @param amount - Amount to approve (use maxUint256 for unlimited)
83
+ * @param privateKey - Private key for signing
84
+ * @returns Transaction hash(es)
85
+ */
86
+ export async function safeApprove(token, spender, amount, privateKey) {
87
+ // Validate spender is in allowlist
88
+ validateSpender(spender);
89
+ const cfg = loadConfig();
90
+ const client = getPublicClient();
91
+ const account = privateKeyToAccount(privateKey);
92
+ const walletClient = createWalletClient({
93
+ account,
94
+ chain: {
95
+ id: cfg.chain.chainId,
96
+ name: "0G",
97
+ nativeCurrency: { name: "0G", symbol: "0G", decimals: 18 },
98
+ rpcUrls: { default: { http: [cfg.chain.rpcUrl] } },
99
+ },
100
+ transport: http(cfg.chain.rpcUrl, {
101
+ timeout: 30_000,
102
+ retryCount: 2,
103
+ }),
104
+ });
105
+ // Check current allowance
106
+ const currentAllowance = await getAllowance(token, account.address, spender);
107
+ // If current allowance is sufficient, no action needed
108
+ if (currentAllowance >= amount) {
109
+ logger.debug(`Allowance already sufficient: ${currentAllowance} >= ${amount}`);
110
+ return { txHash: "0x0" }; // No-op
111
+ }
112
+ let resetTxHash;
113
+ // If current allowance > 0 and < amount, reset to 0 first (USDT-style)
114
+ if (currentAllowance > 0n && currentAllowance < amount) {
115
+ logger.debug("Resetting allowance to 0 (USDT-style)");
116
+ try {
117
+ resetTxHash = await walletClient.writeContract({
118
+ address: token,
119
+ abi: ERC20_EXTENDED_ABI,
120
+ functionName: "approve",
121
+ args: [spender, 0n],
122
+ });
123
+ // Wait for reset tx to confirm
124
+ await client.waitForTransactionReceipt({ hash: resetTxHash });
125
+ }
126
+ catch (err) {
127
+ throw new EchoError(ErrorCodes.APPROVAL_FAILED, `Failed to reset allowance: ${err instanceof Error ? err.message : err}`);
128
+ }
129
+ }
130
+ // Approve the target amount
131
+ try {
132
+ const txHash = await walletClient.writeContract({
133
+ address: token,
134
+ abi: ERC20_EXTENDED_ABI,
135
+ functionName: "approve",
136
+ args: [spender, amount],
137
+ });
138
+ // Wait for approve tx to confirm before returning
139
+ await client.waitForTransactionReceipt({ hash: txHash });
140
+ return { txHash, resetTxHash };
141
+ }
142
+ catch (err) {
143
+ throw new EchoError(ErrorCodes.APPROVAL_FAILED, `Failed to approve: ${err instanceof Error ? err.message : err}`);
144
+ }
145
+ }
146
+ /**
147
+ * Revoke approval (set to 0)
148
+ */
149
+ export async function revokeApproval(token, spender, privateKey) {
150
+ // Validate spender is in allowlist
151
+ validateSpender(spender);
152
+ const cfg = loadConfig();
153
+ const account = privateKeyToAccount(privateKey);
154
+ const walletClient = createWalletClient({
155
+ account,
156
+ chain: {
157
+ id: cfg.chain.chainId,
158
+ name: "0G",
159
+ nativeCurrency: { name: "0G", symbol: "0G", decimals: 18 },
160
+ rpcUrls: { default: { http: [cfg.chain.rpcUrl] } },
161
+ },
162
+ transport: http(cfg.chain.rpcUrl, {
163
+ timeout: 30_000,
164
+ retryCount: 2,
165
+ }),
166
+ });
167
+ try {
168
+ const txHash = await walletClient.writeContract({
169
+ address: token,
170
+ abi: ERC20_EXTENDED_ABI,
171
+ functionName: "approve",
172
+ args: [spender, 0n],
173
+ });
174
+ return txHash;
175
+ }
176
+ catch (err) {
177
+ throw new EchoError(ErrorCodes.APPROVAL_FAILED, `Failed to revoke approval: ${err instanceof Error ? err.message : err}`);
178
+ }
179
+ }
180
+ /**
181
+ * Ensure allowance is sufficient, approve if needed
182
+ */
183
+ export async function ensureAllowance(token, spender, requiredAmount, privateKey, approveExact = false) {
184
+ const account = privateKeyToAccount(privateKey);
185
+ const currentAllowance = await getAllowance(token, account.address, spender);
186
+ if (currentAllowance >= requiredAmount) {
187
+ return null; // No approval needed
188
+ }
189
+ const approveAmount = approveExact ? requiredAmount : maxUint256;
190
+ return safeApprove(token, spender, approveAmount, privateKey);
191
+ }
192
+ //# sourceMappingURL=allowance.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"allowance.js","sourceRoot":"","sources":["../../src/jaine/allowance.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,32 @@
1
+ import type { Address } from "viem";
2
+ /**
3
+ * Core tokens on 0G mainnet supported by Jaine DEX
4
+ * Addresses from MOLTBOT/jaine.md
5
+ */
6
+ export declare const CORE_TOKENS: Record<string, Address>;
7
+ /** List of core token symbols */
8
+ export declare const CORE_TOKEN_SYMBOLS: (keyof typeof CORE_TOKENS)[];
9
+ /**
10
+ * Resolve token symbol or address to checksummed address
11
+ * @param tokenOrSymbol - Token symbol (e.g., "USDC") or address (0x...)
12
+ * @param userAliases - Optional user-defined token aliases
13
+ * @returns Checksummed address
14
+ * @throws EchoError if token not found
15
+ */
16
+ export declare function resolveToken(tokenOrSymbol: string, userAliases?: Record<string, Address>): Address;
17
+ /**
18
+ * Get symbol for a token address (reverse lookup)
19
+ * @param address - Token address
20
+ * @param userAliases - Optional user-defined token aliases
21
+ * @returns Symbol if found, shortened address otherwise
22
+ */
23
+ export declare function getTokenSymbol(address: Address, userAliases?: Record<string, Address>): string;
24
+ /**
25
+ * Check if a token is a core token
26
+ */
27
+ export declare function isCoreToken(address: Address): boolean;
28
+ /**
29
+ * Get all core token addresses
30
+ */
31
+ export declare function getCoreTokenAddresses(): Address[];
32
+ //# sourceMappingURL=coreTokens.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"coreTokens.d.ts","sourceRoot":"","sources":["../../src/jaine/coreTokens.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,MAAM,CAAC;AAIpC;;;GAGG;AACH,eAAO,MAAM,WAAW,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAatC,CAAC;AAEX,iCAAiC;AACjC,eAAO,MAAM,kBAAkB,EAA+B,CAAC,MAAM,OAAO,WAAW,CAAC,EAAE,CAAC;AAE3F;;;;;;GAMG;AACH,wBAAgB,YAAY,CAC1B,aAAa,EAAE,MAAM,EACrB,WAAW,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GACpC,OAAO,CA8BT;AAED;;;;;GAKG;AACH,wBAAgB,cAAc,CAC5B,OAAO,EAAE,OAAO,EAChB,WAAW,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GACpC,MAAM,CAqBR;AAED;;GAEG;AACH,wBAAgB,WAAW,CAAC,OAAO,EAAE,OAAO,GAAG,OAAO,CAGrD;AAED;;GAEG;AACH,wBAAgB,qBAAqB,IAAI,OAAO,EAAE,CAEjD"}
@@ -0,0 +1,91 @@
1
+ import { isAddress, getAddress } from "viem";
2
+ import { EchoError, ErrorCodes } from "../errors.js";
3
+ /**
4
+ * Core tokens on 0G mainnet supported by Jaine DEX
5
+ * Addresses from MOLTBOT/jaine.md
6
+ */
7
+ export const CORE_TOKENS = {
8
+ USDC: "0x1f3aa82227281ca364bfb3d253b0f1af1da6473e",
9
+ WETH: "0x564770837ef8bbf077cfe54e5f6106538c815b22",
10
+ stgUSDT: "0x9FBBAFC2Ad79af2b57eD23C60DfF79eF5c2b0FB5",
11
+ stgUSDC: "0x8a2B28364102Bea189D99A475C494330Ef2bDD0B",
12
+ w0G: "0x1Cd0690fF9a693f5EF2dD976660a8dAFc81A109c",
13
+ st0G: "0x7bBC63D01CA42491c3E084C941c3E86e55951404",
14
+ wstETH: "0x161a128567BF0C005b58211757F7e46eed983F02",
15
+ PAI: "0x59ef6F3943bBdFE2fB19565037Ac85071223E94C",
16
+ oUSDT: "0x1217BfE6c773EEC6cc4A38b5Dc45B92292B6E189",
17
+ LINK: "0x76159c2b43ff6F630193e37EC68452169914C1Bb",
18
+ coinbaseBTC: "0xa5613ac7f1E83a68719b1398c8F6aAA25581db82",
19
+ HAIO: "0xbCB868d3d0A823ced82B77DD72E4f7A3C720A40E",
20
+ };
21
+ /** List of core token symbols */
22
+ export const CORE_TOKEN_SYMBOLS = Object.keys(CORE_TOKENS);
23
+ /**
24
+ * Resolve token symbol or address to checksummed address
25
+ * @param tokenOrSymbol - Token symbol (e.g., "USDC") or address (0x...)
26
+ * @param userAliases - Optional user-defined token aliases
27
+ * @returns Checksummed address
28
+ * @throws EchoError if token not found
29
+ */
30
+ export function resolveToken(tokenOrSymbol, userAliases) {
31
+ // If it's already a valid address, return checksummed
32
+ if (isAddress(tokenOrSymbol)) {
33
+ return getAddress(tokenOrSymbol);
34
+ }
35
+ // Normalize symbol to match case-insensitive
36
+ const upperSymbol = tokenOrSymbol.toUpperCase();
37
+ // Check user aliases first (they have priority)
38
+ if (userAliases) {
39
+ for (const [symbol, addr] of Object.entries(userAliases)) {
40
+ if (symbol.toUpperCase() === upperSymbol) {
41
+ return getAddress(addr);
42
+ }
43
+ }
44
+ }
45
+ // Check core tokens (case-insensitive)
46
+ for (const [symbol, addr] of Object.entries(CORE_TOKENS)) {
47
+ if (symbol.toUpperCase() === upperSymbol) {
48
+ return getAddress(addr);
49
+ }
50
+ }
51
+ throw new EchoError(ErrorCodes.TOKEN_NOT_FOUND, `Token not found: ${tokenOrSymbol}`, `Use a valid address or one of: ${CORE_TOKEN_SYMBOLS.join(", ")}`);
52
+ }
53
+ /**
54
+ * Get symbol for a token address (reverse lookup)
55
+ * @param address - Token address
56
+ * @param userAliases - Optional user-defined token aliases
57
+ * @returns Symbol if found, shortened address otherwise
58
+ */
59
+ export function getTokenSymbol(address, userAliases) {
60
+ const checksummed = getAddress(address);
61
+ // Check user aliases first
62
+ if (userAliases) {
63
+ for (const [symbol, addr] of Object.entries(userAliases)) {
64
+ if (getAddress(addr) === checksummed) {
65
+ return symbol;
66
+ }
67
+ }
68
+ }
69
+ // Check core tokens
70
+ for (const [symbol, addr] of Object.entries(CORE_TOKENS)) {
71
+ if (getAddress(addr) === checksummed) {
72
+ return symbol;
73
+ }
74
+ }
75
+ // Return shortened address if not found
76
+ return `${checksummed.slice(0, 6)}...${checksummed.slice(-4)}`;
77
+ }
78
+ /**
79
+ * Check if a token is a core token
80
+ */
81
+ export function isCoreToken(address) {
82
+ const checksummed = getAddress(address);
83
+ return Object.values(CORE_TOKENS).some((addr) => getAddress(addr) === checksummed);
84
+ }
85
+ /**
86
+ * Get all core token addresses
87
+ */
88
+ export function getCoreTokenAddresses() {
89
+ return Object.values(CORE_TOKENS).map((addr) => getAddress(addr));
90
+ }
91
+ //# sourceMappingURL=coreTokens.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"coreTokens.js","sourceRoot":"","sources":["../../src/jaine/coreTokens.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,39 @@
1
+ import type { Address, Hex } from "viem";
2
+ /**
3
+ * Encode path for Uniswap V3 exactInput
4
+ * Format: token0 + fee0 + token1 + fee1 + token2 + ...
5
+ *
6
+ * @param tokens - Array of token addresses in swap order
7
+ * @param fees - Array of fee tiers (length = tokens.length - 1)
8
+ * @returns Encoded path bytes
9
+ */
10
+ export declare function encodePath(tokens: Address[], fees: number[]): Hex;
11
+ /**
12
+ * Encode path for Uniswap V3 exactOutput
13
+ * Note: exactOutput requires REVERSED path (tokenOut first)
14
+ *
15
+ * @param tokens - Array of token addresses in swap order (tokenIn → tokenOut)
16
+ * @param fees - Array of fee tiers
17
+ * @returns Encoded path bytes (reversed for exactOutput)
18
+ */
19
+ export declare function encodePathForExactOutput(tokens: Address[], fees: number[]): Hex;
20
+ /**
21
+ * Decode path bytes into tokens and fees
22
+ *
23
+ * @param path - Encoded path bytes
24
+ * @returns Object with tokens array and fees array
25
+ */
26
+ export declare function decodePath(path: Hex): {
27
+ tokens: Address[];
28
+ fees: number[];
29
+ };
30
+ /**
31
+ * Calculate the number of hops in a path
32
+ */
33
+ export declare function getPathHops(tokens: Address[]): number;
34
+ /**
35
+ * Format path as human-readable string
36
+ * e.g., "USDC → [0.3%] → w0G → [0.05%] → WETH"
37
+ */
38
+ export declare function formatPath(tokens: Address[], fees: number[], getSymbol: (addr: Address) => string): string;
39
+ //# sourceMappingURL=pathEncoding.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"pathEncoding.d.ts","sourceRoot":"","sources":["../../src/jaine/pathEncoding.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,OAAO,EAAE,GAAG,EAAE,MAAM,MAAM,CAAC;AAGzC;;;;;;;GAOG;AACH,wBAAgB,UAAU,CAAC,MAAM,EAAE,OAAO,EAAE,EAAE,IAAI,EAAE,MAAM,EAAE,GAAG,GAAG,CAwBjE;AAED;;;;;;;GAOG;AACH,wBAAgB,wBAAwB,CAAC,MAAM,EAAE,OAAO,EAAE,EAAE,IAAI,EAAE,MAAM,EAAE,GAAG,GAAG,CAK/E;AAED;;;;;GAKG;AACH,wBAAgB,UAAU,CAAC,IAAI,EAAE,GAAG,GAAG;IAAE,MAAM,EAAE,OAAO,EAAE,CAAC;IAAC,IAAI,EAAE,MAAM,EAAE,CAAA;CAAE,CA4B3E;AAED;;GAEG;AACH,wBAAgB,WAAW,CAAC,MAAM,EAAE,OAAO,EAAE,GAAG,MAAM,CAErD;AAED;;;GAGG;AACH,wBAAgB,UAAU,CACxB,MAAM,EAAE,OAAO,EAAE,EACjB,IAAI,EAAE,MAAM,EAAE,EACd,SAAS,EAAE,CAAC,IAAI,EAAE,OAAO,KAAK,MAAM,GACnC,MAAM,CAaR"}
@@ -0,0 +1,98 @@
1
+ import { concat, pad, toHex } from "viem";
2
+ /**
3
+ * Encode path for Uniswap V3 exactInput
4
+ * Format: token0 + fee0 + token1 + fee1 + token2 + ...
5
+ *
6
+ * @param tokens - Array of token addresses in swap order
7
+ * @param fees - Array of fee tiers (length = tokens.length - 1)
8
+ * @returns Encoded path bytes
9
+ */
10
+ export function encodePath(tokens, fees) {
11
+ if (tokens.length < 2) {
12
+ throw new Error("Path must have at least 2 tokens");
13
+ }
14
+ if (fees.length !== tokens.length - 1) {
15
+ throw new Error("Fees length must be tokens.length - 1");
16
+ }
17
+ // Each address is 20 bytes, each fee is 3 bytes
18
+ const parts = [];
19
+ for (let i = 0; i < tokens.length; i++) {
20
+ // Add token address (20 bytes)
21
+ parts.push(tokens[i].toLowerCase());
22
+ // Add fee if not last token (3 bytes)
23
+ if (i < fees.length) {
24
+ // Fee is uint24, encode as 3 bytes
25
+ const feeHex = pad(toHex(fees[i]), { size: 3 });
26
+ parts.push(feeHex);
27
+ }
28
+ }
29
+ return concat(parts);
30
+ }
31
+ /**
32
+ * Encode path for Uniswap V3 exactOutput
33
+ * Note: exactOutput requires REVERSED path (tokenOut first)
34
+ *
35
+ * @param tokens - Array of token addresses in swap order (tokenIn → tokenOut)
36
+ * @param fees - Array of fee tiers
37
+ * @returns Encoded path bytes (reversed for exactOutput)
38
+ */
39
+ export function encodePathForExactOutput(tokens, fees) {
40
+ // Reverse both arrays for exactOutput
41
+ const reversedTokens = [...tokens].reverse();
42
+ const reversedFees = [...fees].reverse();
43
+ return encodePath(reversedTokens, reversedFees);
44
+ }
45
+ /**
46
+ * Decode path bytes into tokens and fees
47
+ *
48
+ * @param path - Encoded path bytes
49
+ * @returns Object with tokens array and fees array
50
+ */
51
+ export function decodePath(path) {
52
+ // Remove 0x prefix
53
+ const data = path.slice(2);
54
+ // Each token is 20 bytes (40 hex chars), each fee is 3 bytes (6 hex chars)
55
+ const tokens = [];
56
+ const fees = [];
57
+ let offset = 0;
58
+ let isToken = true;
59
+ while (offset < data.length) {
60
+ if (isToken) {
61
+ // Read 20 bytes for token
62
+ const tokenHex = data.slice(offset, offset + 40);
63
+ tokens.push(`0x${tokenHex}`);
64
+ offset += 40;
65
+ isToken = false;
66
+ }
67
+ else {
68
+ // Read 3 bytes for fee
69
+ const feeHex = data.slice(offset, offset + 6);
70
+ fees.push(parseInt(feeHex, 16));
71
+ offset += 6;
72
+ isToken = true;
73
+ }
74
+ }
75
+ return { tokens, fees };
76
+ }
77
+ /**
78
+ * Calculate the number of hops in a path
79
+ */
80
+ export function getPathHops(tokens) {
81
+ return tokens.length - 1;
82
+ }
83
+ /**
84
+ * Format path as human-readable string
85
+ * e.g., "USDC → [0.3%] → w0G → [0.05%] → WETH"
86
+ */
87
+ export function formatPath(tokens, fees, getSymbol) {
88
+ const parts = [];
89
+ for (let i = 0; i < tokens.length; i++) {
90
+ parts.push(getSymbol(tokens[i]));
91
+ if (i < fees.length) {
92
+ const feePercent = (fees[i] / 10000).toFixed(2);
93
+ parts.push(`→ [${feePercent}%] →`);
94
+ }
95
+ }
96
+ return parts.join(" ");
97
+ }
98
+ //# sourceMappingURL=pathEncoding.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"pathEncoding.js","sourceRoot":"","sources":["../../src/jaine/pathEncoding.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,11 @@
1
+ /** Jaine-specific data directory */
2
+ export declare const JAINE_DIR: string;
3
+ /** Pool cache file */
4
+ export declare const POOLS_CACHE_FILE: string;
5
+ /** User token aliases file */
6
+ export declare const TOKENS_FILE: string;
7
+ /**
8
+ * Ensure Jaine data directory exists
9
+ */
10
+ export declare function ensureJaineDir(): void;
11
+ //# sourceMappingURL=paths.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"paths.d.ts","sourceRoot":"","sources":["../../src/jaine/paths.ts"],"names":[],"mappings":"AAKA,oCAAoC;AACpC,eAAO,MAAM,SAAS,QAA4B,CAAC;AAEnD,sBAAsB;AACtB,eAAO,MAAM,gBAAgB,QAAyC,CAAC;AAEvE,8BAA8B;AAC9B,eAAO,MAAM,WAAW,QAAiC,CAAC;AAE1D;;GAEG;AACH,wBAAgB,cAAc,IAAI,IAAI,CAKrC"}
@@ -0,0 +1,20 @@
1
+ import { existsSync, mkdirSync } from "node:fs";
2
+ import { join } from "node:path";
3
+ import { CONFIG_DIR } from "../config/paths.js";
4
+ import logger from "../utils/logger.js";
5
+ /** Jaine-specific data directory */
6
+ export const JAINE_DIR = join(CONFIG_DIR, "jaine");
7
+ /** Pool cache file */
8
+ export const POOLS_CACHE_FILE = join(JAINE_DIR, "pools-cache.v1.json");
9
+ /** User token aliases file */
10
+ export const TOKENS_FILE = join(JAINE_DIR, "tokens.json");
11
+ /**
12
+ * Ensure Jaine data directory exists
13
+ */
14
+ export function ensureJaineDir() {
15
+ if (!existsSync(JAINE_DIR)) {
16
+ mkdirSync(JAINE_DIR, { recursive: true });
17
+ logger.debug(`Created Jaine directory: ${JAINE_DIR}`);
18
+ }
19
+ }
20
+ //# sourceMappingURL=paths.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"paths.js","sourceRoot":"","sources":["../../src/jaine/paths.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,SAAS,EAAE,MAAM,SAAS,CAAC;AAChD,OAAO,EAAE,IAAI,EAAE,MAAM,WAAW,CAAC;AACjC,OAAO,EAAE,UAAU,EAAE,MAAM,oBAAoB,CAAC;AAChD,OAAO,MAAM,MAAM,oBAAoB,CAAC;AAExC,oCAAoC;AACpC,MAAM,CAAC,MAAM,SAAS,GAAG,IAAI,CAAC,UAAU,EAAE,OAAO,CAAC,CAAC;AAEnD,sBAAsB;AACtB,MAAM,CAAC,MAAM,gBAAgB,GAAG,IAAI,CAAC,SAAS,EAAE,qBAAqB,CAAC,CAAC;AAEvE,8BAA8B;AAC9B,MAAM,CAAC,MAAM,WAAW,GAAG,IAAI,CAAC,SAAS,EAAE,aAAa,CAAC,CAAC;AAE1D;;GAEG;AACH,MAAM,UAAU,cAAc;IAC5B,IAAI,CAAC,UAAU,CAAC,SAAS,CAAC,EAAE,CAAC;QAC3B,SAAS,CAAC,SAAS,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;QAC1C,MAAM,CAAC,KAAK,CAAC,4BAA4B,SAAS,EAAE,CAAC,CAAC;IACxD,CAAC;AACH,CAAC"}
@@ -0,0 +1,47 @@
1
+ import type { Address } from "viem";
2
+ import { type FeeTier } from "./abi/factory.js";
3
+ export interface PoolInfo {
4
+ address: Address;
5
+ token0: Address;
6
+ token1: Address;
7
+ fee: FeeTier;
8
+ }
9
+ export interface PoolsCache {
10
+ version: number;
11
+ chainId: number;
12
+ generatedAt: string;
13
+ pools: PoolInfo[];
14
+ }
15
+ /**
16
+ * Load pools cache from disk
17
+ */
18
+ export declare function loadPoolsCache(): PoolsCache | null;
19
+ /**
20
+ * Save pools cache to disk (atomic write)
21
+ */
22
+ export declare function savePoolsCache(cache: PoolsCache): void;
23
+ /**
24
+ * Scan factory for pools between core tokens
25
+ * @param feeTiers - Fee tiers to scan (defaults to all standard tiers)
26
+ * @param onProgress - Optional progress callback (poolsFound, pairsScanned)
27
+ */
28
+ export declare function scanCorePools(feeTiers?: readonly FeeTier[], onProgress?: (poolsFound: number, pairsScanned: number) => void): Promise<PoolInfo[]>;
29
+ /**
30
+ * Get pool for specific token pair and fee
31
+ */
32
+ export declare function getPool(tokenA: Address, tokenB: Address, fee: FeeTier): Promise<Address | null>;
33
+ /**
34
+ * Sync pool cache from Goldsky subgraph (fast, read-only).
35
+ * Fetches top pools by TVL and maps them to PoolInfo format.
36
+ */
37
+ export declare function syncPoolsFromSubgraph(maxPools?: number, onProgress?: (poolsFetched: number) => void): Promise<PoolInfo[]>;
38
+ /**
39
+ * Find pools containing a specific token from cache
40
+ */
41
+ export declare function findPoolsForToken(token: Address, cache?: PoolsCache | null): PoolInfo[];
42
+ /**
43
+ * Find pool between two tokens from cache
44
+ * Returns all matching pools (different fee tiers)
45
+ */
46
+ export declare function findPoolsBetweenTokens(tokenA: Address, tokenB: Address, cache?: PoolsCache | null): PoolInfo[];
47
+ //# sourceMappingURL=poolCache.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"poolCache.d.ts","sourceRoot":"","sources":["../../src/jaine/poolCache.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,MAAM,CAAC;AAGpC,OAAO,EAA0B,KAAK,OAAO,EAAE,MAAM,kBAAkB,CAAC;AAUxE,MAAM,WAAW,QAAQ;IACvB,OAAO,EAAE,OAAO,CAAC;IACjB,MAAM,EAAE,OAAO,CAAC;IAChB,MAAM,EAAE,OAAO,CAAC;IAChB,GAAG,EAAE,OAAO,CAAC;CACd;AAED,MAAM,WAAW,UAAU;IACzB,OAAO,EAAE,MAAM,CAAC;IAChB,OAAO,EAAE,MAAM,CAAC;IAChB,WAAW,EAAE,MAAM,CAAC;IACpB,KAAK,EAAE,QAAQ,EAAE,CAAC;CACnB;AAED;;GAEG;AACH,wBAAgB,cAAc,IAAI,UAAU,GAAG,IAAI,CA0BlD;AAED;;GAEG;AACH,wBAAgB,cAAc,CAAC,KAAK,EAAE,UAAU,GAAG,IAAI,CAoBtD;AAED;;;;GAIG;AACH,wBAAsB,aAAa,CACjC,QAAQ,GAAE,SAAS,OAAO,EAAc,EACxC,UAAU,CAAC,EAAE,CAAC,UAAU,EAAE,MAAM,EAAE,YAAY,EAAE,MAAM,KAAK,IAAI,GAC9D,OAAO,CAAC,QAAQ,EAAE,CAAC,CAsDrB;AAED;;GAEG;AACH,wBAAsB,OAAO,CAC3B,MAAM,EAAE,OAAO,EACf,MAAM,EAAE,OAAO,EACf,GAAG,EAAE,OAAO,GACX,OAAO,CAAC,OAAO,GAAG,IAAI,CAAC,CAmBzB;AAED;;;GAGG;AACH,wBAAsB,qBAAqB,CACzC,QAAQ,GAAE,MAA6C,EACvD,UAAU,CAAC,EAAE,CAAC,YAAY,EAAE,MAAM,KAAK,IAAI,GAC1C,OAAO,CAAC,QAAQ,EAAE,CAAC,CA4BrB;AAED;;GAEG;AACH,wBAAgB,iBAAiB,CAAC,KAAK,EAAE,OAAO,EAAE,KAAK,CAAC,EAAE,UAAU,GAAG,IAAI,GAAG,QAAQ,EAAE,CAQvF;AAED;;;GAGG;AACH,wBAAgB,sBAAsB,CACpC,MAAM,EAAE,OAAO,EACf,MAAM,EAAE,OAAO,EACf,KAAK,CAAC,EAAE,UAAU,GAAG,IAAI,GACxB,QAAQ,EAAE,CAYZ"}