@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,195 @@
1
+ import { existsSync, readFileSync, writeFileSync, renameSync, unlinkSync } from "node:fs";
2
+ import { dirname, join } from "node:path";
3
+ import { getAddress, zeroAddress } from "viem";
4
+ import { POOLS_CACHE_FILE, ensureJaineDir } from "./paths.js";
5
+ import { FACTORY_ABI, FEE_TIERS } from "./abi/factory.js";
6
+ import { getCoreTokenAddresses } from "./coreTokens.js";
7
+ import { getPublicClient } from "../wallet/client.js";
8
+ import { loadConfig } from "../config/store.js";
9
+ import logger from "../utils/logger.js";
10
+ import { subgraphClient } from "./subgraph/client.js";
11
+ import { SUBGRAPH_DEFAULTS } from "./subgraph/constants.js";
12
+ const CACHE_VERSION = 1;
13
+ /**
14
+ * Load pools cache from disk
15
+ */
16
+ export function loadPoolsCache() {
17
+ if (!existsSync(POOLS_CACHE_FILE)) {
18
+ return null;
19
+ }
20
+ try {
21
+ const raw = readFileSync(POOLS_CACHE_FILE, "utf-8");
22
+ const parsed = JSON.parse(raw);
23
+ // Validate version and chain
24
+ if (parsed.version !== CACHE_VERSION) {
25
+ logger.debug(`Pool cache version mismatch: ${parsed.version} != ${CACHE_VERSION}`);
26
+ return null;
27
+ }
28
+ const cfg = loadConfig();
29
+ if (parsed.chainId !== cfg.chain.chainId) {
30
+ logger.debug(`Pool cache chain mismatch: ${parsed.chainId} != ${cfg.chain.chainId}`);
31
+ return null;
32
+ }
33
+ return parsed;
34
+ }
35
+ catch (err) {
36
+ logger.error(`Failed to parse pool cache: ${err}`);
37
+ return null;
38
+ }
39
+ }
40
+ /**
41
+ * Save pools cache to disk (atomic write)
42
+ */
43
+ export function savePoolsCache(cache) {
44
+ ensureJaineDir();
45
+ const dir = dirname(POOLS_CACHE_FILE);
46
+ const tmpFile = join(dir, `.pools-cache.tmp.${Date.now()}.json`);
47
+ try {
48
+ writeFileSync(tmpFile, JSON.stringify(cache, null, 2), "utf-8");
49
+ renameSync(tmpFile, POOLS_CACHE_FILE);
50
+ logger.debug(`Pool cache saved: ${cache.pools.length} pools`);
51
+ }
52
+ catch (err) {
53
+ try {
54
+ if (existsSync(tmpFile)) {
55
+ unlinkSync(tmpFile);
56
+ }
57
+ }
58
+ catch {
59
+ // Ignore cleanup errors
60
+ }
61
+ throw err;
62
+ }
63
+ }
64
+ /**
65
+ * Scan factory for pools between core tokens
66
+ * @param feeTiers - Fee tiers to scan (defaults to all standard tiers)
67
+ * @param onProgress - Optional progress callback (poolsFound, pairsScanned)
68
+ */
69
+ export async function scanCorePools(feeTiers = FEE_TIERS, onProgress) {
70
+ const cfg = loadConfig();
71
+ const client = getPublicClient();
72
+ const factoryAddress = cfg.protocol.jaineFactory;
73
+ const coreTokens = getCoreTokenAddresses();
74
+ const pools = [];
75
+ let pairsScanned = 0;
76
+ // Generate all unique token pairs
77
+ const pairs = [];
78
+ for (let i = 0; i < coreTokens.length; i++) {
79
+ for (let j = i + 1; j < coreTokens.length; j++) {
80
+ pairs.push([coreTokens[i], coreTokens[j]]);
81
+ }
82
+ }
83
+ // Scan each pair × fee tier sequentially (avoid rate limiting)
84
+ for (const [tokenA, tokenB] of pairs) {
85
+ for (const fee of feeTiers) {
86
+ try {
87
+ const poolAddress = await client.readContract({
88
+ address: factoryAddress,
89
+ abi: FACTORY_ABI,
90
+ functionName: "getPool",
91
+ args: [tokenA, tokenB, fee],
92
+ });
93
+ if (poolAddress && poolAddress !== zeroAddress) {
94
+ // Sort tokens to ensure consistent ordering (token0 < token1)
95
+ const [token0, token1] = tokenA.toLowerCase() < tokenB.toLowerCase()
96
+ ? [tokenA, tokenB]
97
+ : [tokenB, tokenA];
98
+ pools.push({
99
+ address: getAddress(poolAddress),
100
+ token0: getAddress(token0),
101
+ token1: getAddress(token1),
102
+ fee,
103
+ });
104
+ }
105
+ }
106
+ catch (err) {
107
+ logger.debug(`Failed to query pool ${tokenA}/${tokenB}/${fee}: ${err}`);
108
+ // Continue scanning other pools
109
+ }
110
+ }
111
+ pairsScanned++;
112
+ if (onProgress) {
113
+ onProgress(pools.length, pairsScanned);
114
+ }
115
+ }
116
+ return pools;
117
+ }
118
+ /**
119
+ * Get pool for specific token pair and fee
120
+ */
121
+ export async function getPool(tokenA, tokenB, fee) {
122
+ const cfg = loadConfig();
123
+ const client = getPublicClient();
124
+ try {
125
+ const poolAddress = await client.readContract({
126
+ address: cfg.protocol.jaineFactory,
127
+ abi: FACTORY_ABI,
128
+ functionName: "getPool",
129
+ args: [tokenA, tokenB, fee],
130
+ });
131
+ if (poolAddress && poolAddress !== zeroAddress) {
132
+ return getAddress(poolAddress);
133
+ }
134
+ return null;
135
+ }
136
+ catch {
137
+ return null;
138
+ }
139
+ }
140
+ /**
141
+ * Sync pool cache from Goldsky subgraph (fast, read-only).
142
+ * Fetches top pools by TVL and maps them to PoolInfo format.
143
+ */
144
+ export async function syncPoolsFromSubgraph(maxPools = SUBGRAPH_DEFAULTS.DEFAULT_POOL_LIMIT, onProgress) {
145
+ const pools = await subgraphClient.getTopPools(maxPools);
146
+ if (onProgress)
147
+ onProgress(pools.length);
148
+ // Deduplicate by pool address (lowercase) and map to PoolInfo
149
+ const seen = new Map();
150
+ for (const sp of pools) {
151
+ const key = sp.id.toLowerCase();
152
+ if (seen.has(key))
153
+ continue;
154
+ const fee = parseInt(sp.feeTier, 10);
155
+ // Only include pools with valid fee tiers
156
+ if (!FEE_TIERS.includes(fee)) {
157
+ logger.debug(`[Subgraph] Skipping pool ${sp.id} with unknown fee tier ${fee}`);
158
+ continue;
159
+ }
160
+ seen.set(key, {
161
+ address: getAddress(sp.id),
162
+ token0: getAddress(sp.token0.id),
163
+ token1: getAddress(sp.token1.id),
164
+ fee: fee,
165
+ });
166
+ }
167
+ return Array.from(seen.values());
168
+ }
169
+ /**
170
+ * Find pools containing a specific token from cache
171
+ */
172
+ export function findPoolsForToken(token, cache) {
173
+ const c = cache ?? loadPoolsCache();
174
+ if (!c)
175
+ return [];
176
+ const tokenLower = token.toLowerCase();
177
+ return c.pools.filter((p) => p.token0.toLowerCase() === tokenLower || p.token1.toLowerCase() === tokenLower);
178
+ }
179
+ /**
180
+ * Find pool between two tokens from cache
181
+ * Returns all matching pools (different fee tiers)
182
+ */
183
+ export function findPoolsBetweenTokens(tokenA, tokenB, cache) {
184
+ const c = cache ?? loadPoolsCache();
185
+ if (!c)
186
+ return [];
187
+ const aLower = tokenA.toLowerCase();
188
+ const bLower = tokenB.toLowerCase();
189
+ return c.pools.filter((p) => {
190
+ const t0 = p.token0.toLowerCase();
191
+ const t1 = p.token1.toLowerCase();
192
+ return (t0 === aLower && t1 === bLower) || (t0 === bLower && t1 === aLower);
193
+ });
194
+ }
195
+ //# sourceMappingURL=poolCache.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"poolCache.js","sourceRoot":"","sources":["../../src/jaine/poolCache.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,41 @@
1
+ import type { Address, Hex } from "viem";
2
+ import { type PoolsCache } from "./poolCache.js";
3
+ export interface Route {
4
+ tokens: Address[];
5
+ fees: number[];
6
+ pools: Address[];
7
+ }
8
+ export interface QuotedRoute extends Route {
9
+ amountIn: bigint;
10
+ amountOut: bigint;
11
+ encodedPath: Hex;
12
+ gasEstimate: bigint;
13
+ }
14
+ export interface FindRouteOptions {
15
+ maxHops?: number;
16
+ maxCandidates?: number;
17
+ cache?: PoolsCache | null;
18
+ }
19
+ /**
20
+ * Find the best route for a swap (exactInput)
21
+ * @param tokenIn - Input token address
22
+ * @param tokenOut - Output token address
23
+ * @param amountIn - Input amount
24
+ * @param options - Routing options
25
+ * @returns Best route or null if no route found
26
+ */
27
+ export declare function findBestRouteExactInput(tokenIn: Address, tokenOut: Address, amountIn: bigint, options?: FindRouteOptions): Promise<QuotedRoute | null>;
28
+ /**
29
+ * Find the best route for a swap (exactOutput)
30
+ * @param tokenIn - Input token address
31
+ * @param tokenOut - Output token address
32
+ * @param amountOut - Desired output amount
33
+ * @param options - Routing options
34
+ * @returns Best route or null if no route found
35
+ */
36
+ export declare function findBestRouteExactOutput(tokenIn: Address, tokenOut: Address, amountOut: bigint, options?: FindRouteOptions): Promise<QuotedRoute | null>;
37
+ /**
38
+ * Format route for display
39
+ */
40
+ export declare function formatRoute(route: Route, userAliases?: Record<string, Address>): string;
41
+ //# sourceMappingURL=routing.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"routing.d.ts","sourceRoot":"","sources":["../../src/jaine/routing.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,OAAO,EAAE,GAAG,EAAE,MAAM,MAAM,CAAC;AAEzC,OAAO,EAAiC,KAAK,UAAU,EAAE,MAAM,gBAAgB,CAAC;AAYhF,MAAM,WAAW,KAAK;IACpB,MAAM,EAAE,OAAO,EAAE,CAAC;IAClB,IAAI,EAAE,MAAM,EAAE,CAAC;IACf,KAAK,EAAE,OAAO,EAAE,CAAC;CAClB;AAED,MAAM,WAAW,WAAY,SAAQ,KAAK;IACxC,QAAQ,EAAE,MAAM,CAAC;IACjB,SAAS,EAAE,MAAM,CAAC;IAClB,WAAW,EAAE,GAAG,CAAC;IACjB,WAAW,EAAE,MAAM,CAAC;CACrB;AA8KD,MAAM,WAAW,gBAAgB;IAC/B,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,aAAa,CAAC,EAAE,MAAM,CAAC;IACvB,KAAK,CAAC,EAAE,UAAU,GAAG,IAAI,CAAC;CAC3B;AAED;;;;;;;GAOG;AACH,wBAAsB,uBAAuB,CAC3C,OAAO,EAAE,OAAO,EAChB,QAAQ,EAAE,OAAO,EACjB,QAAQ,EAAE,MAAM,EAChB,OAAO,GAAE,gBAAqB,GAC7B,OAAO,CAAC,WAAW,GAAG,IAAI,CAAC,CAyD7B;AAED;;;;;;;GAOG;AACH,wBAAsB,wBAAwB,CAC5C,OAAO,EAAE,OAAO,EAChB,QAAQ,EAAE,OAAO,EACjB,SAAS,EAAE,MAAM,EACjB,OAAO,GAAE,gBAAqB,GAC7B,OAAO,CAAC,WAAW,GAAG,IAAI,CAAC,CAwD7B;AAED;;GAEG;AACH,wBAAgB,WAAW,CACzB,KAAK,EAAE,KAAK,EACZ,WAAW,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GACpC,MAAM,CAIR"}
@@ -0,0 +1,247 @@
1
+ import { getAddress } from "viem";
2
+ import { loadPoolsCache } from "./poolCache.js";
3
+ import { encodePath, encodePathForExactOutput, formatPath } from "./pathEncoding.js";
4
+ import { getTokenSymbol } from "./coreTokens.js";
5
+ import { QUOTER_ABI } from "./abi/quoter.js";
6
+ import { getPublicClient } from "../wallet/client.js";
7
+ import { loadConfig } from "../config/store.js";
8
+ import { EchoError, ErrorCodes } from "../errors.js";
9
+ import logger from "../utils/logger.js";
10
+ const DEFAULT_MAX_HOPS = 3;
11
+ const DEFAULT_MAX_CANDIDATES = 20;
12
+ /**
13
+ * Build a graph of pools for routing
14
+ */
15
+ function buildPoolGraph(pools) {
16
+ // Graph: token -> (neighbor token -> pools)
17
+ const graph = new Map();
18
+ const ensureNode = (token) => {
19
+ if (!graph.has(token)) {
20
+ graph.set(token, new Map());
21
+ }
22
+ };
23
+ for (const pool of pools) {
24
+ const t0 = pool.token0.toLowerCase();
25
+ const t1 = pool.token1.toLowerCase();
26
+ ensureNode(t0);
27
+ ensureNode(t1);
28
+ // Add bidirectional edges
29
+ const t0Neighbors = graph.get(t0);
30
+ const t1Neighbors = graph.get(t1);
31
+ if (!t0Neighbors.has(t1)) {
32
+ t0Neighbors.set(t1, []);
33
+ }
34
+ t0Neighbors.get(t1).push(pool);
35
+ if (!t1Neighbors.has(t0)) {
36
+ t1Neighbors.set(t0, []);
37
+ }
38
+ t1Neighbors.get(t0).push(pool);
39
+ }
40
+ return graph;
41
+ }
42
+ /**
43
+ * BFS to find all routes between tokenIn and tokenOut
44
+ */
45
+ function findAllRoutes(tokenIn, tokenOut, pools, maxHops) {
46
+ const graph = buildPoolGraph(pools);
47
+ const routes = [];
48
+ const inLower = tokenIn.toLowerCase();
49
+ const outLower = tokenOut.toLowerCase();
50
+ const queue = [
51
+ {
52
+ current: inLower,
53
+ tokens: [getAddress(tokenIn)],
54
+ fees: [],
55
+ pools: [],
56
+ visited: new Set([inLower]),
57
+ },
58
+ ];
59
+ while (queue.length > 0) {
60
+ const state = queue.shift();
61
+ const { current, tokens, fees, pools: routePools, visited } = state;
62
+ // Check if we reached destination
63
+ if (current === outLower) {
64
+ routes.push({
65
+ tokens: [...tokens],
66
+ fees: [...fees],
67
+ pools: [...routePools],
68
+ });
69
+ continue;
70
+ }
71
+ // Don't explore further if max hops reached
72
+ if (tokens.length > maxHops) {
73
+ continue;
74
+ }
75
+ // Get neighbors
76
+ const neighbors = graph.get(current);
77
+ if (!neighbors)
78
+ continue;
79
+ for (const [neighborToken, poolsToNeighbor] of neighbors) {
80
+ // Skip if already visited (no cycles)
81
+ if (visited.has(neighborToken))
82
+ continue;
83
+ // For each pool option to this neighbor
84
+ for (const pool of poolsToNeighbor) {
85
+ queue.push({
86
+ current: neighborToken,
87
+ tokens: [...tokens, getAddress(neighborToken)],
88
+ fees: [...fees, pool.fee],
89
+ pools: [...routePools, pool.address],
90
+ visited: new Set([...visited, neighborToken]),
91
+ });
92
+ }
93
+ }
94
+ }
95
+ return routes;
96
+ }
97
+ /**
98
+ * Quote a route using the quoter contract
99
+ */
100
+ async function quoteRoute(route, amountIn, quoterAddress, direction) {
101
+ const client = getPublicClient();
102
+ try {
103
+ if (direction === "exactInput") {
104
+ const path = encodePath(route.tokens, route.fees);
105
+ // QuoterV1 returns single uint256, not tuple
106
+ const amountOut = await client.readContract({
107
+ address: quoterAddress,
108
+ abi: QUOTER_ABI,
109
+ functionName: "quoteExactInput",
110
+ args: [path, amountIn],
111
+ });
112
+ return {
113
+ ...route,
114
+ amountIn,
115
+ amountOut,
116
+ encodedPath: path,
117
+ gasEstimate: 0n,
118
+ };
119
+ }
120
+ else {
121
+ // exactOutput - path is reversed
122
+ const path = encodePathForExactOutput(route.tokens, route.fees);
123
+ // QuoterV1 returns single uint256, not tuple
124
+ const amountInRequired = await client.readContract({
125
+ address: quoterAddress,
126
+ abi: QUOTER_ABI,
127
+ functionName: "quoteExactOutput",
128
+ args: [path, amountIn], // amountIn is actually amountOut for exactOutput
129
+ });
130
+ return {
131
+ ...route,
132
+ amountIn: amountInRequired,
133
+ amountOut: amountIn, // The desired output
134
+ encodedPath: path,
135
+ gasEstimate: 0n,
136
+ };
137
+ }
138
+ }
139
+ catch (err) {
140
+ logger.debug(`Quote failed for route: ${err}`);
141
+ return null;
142
+ }
143
+ }
144
+ /**
145
+ * Find the best route for a swap (exactInput)
146
+ * @param tokenIn - Input token address
147
+ * @param tokenOut - Output token address
148
+ * @param amountIn - Input amount
149
+ * @param options - Routing options
150
+ * @returns Best route or null if no route found
151
+ */
152
+ export async function findBestRouteExactInput(tokenIn, tokenOut, amountIn, options = {}) {
153
+ const { maxHops = DEFAULT_MAX_HOPS, maxCandidates = DEFAULT_MAX_CANDIDATES } = options;
154
+ const cache = options.cache !== undefined ? options.cache : loadPoolsCache();
155
+ if (!cache || cache.pools.length === 0) {
156
+ throw new EchoError(ErrorCodes.NO_ROUTE_FOUND, "Pool cache is empty", "Run: echo jaine pools scan-core");
157
+ }
158
+ const cfg = loadConfig();
159
+ const quoterAddress = cfg.protocol.quoter;
160
+ // Find all possible routes
161
+ const routes = findAllRoutes(tokenIn, tokenOut, cache.pools, maxHops);
162
+ if (routes.length === 0) {
163
+ return null;
164
+ }
165
+ // Limit candidates
166
+ const candidates = routes.slice(0, maxCandidates);
167
+ // Quote all routes in parallel (with limit)
168
+ const quotedRoutes = [];
169
+ // Process in batches of 5 to avoid rate limiting
170
+ const batchSize = 5;
171
+ for (let i = 0; i < candidates.length; i += batchSize) {
172
+ const batch = candidates.slice(i, i + batchSize);
173
+ const results = await Promise.all(batch.map((route) => quoteRoute(route, amountIn, quoterAddress, "exactInput")));
174
+ for (const result of results) {
175
+ if (result) {
176
+ quotedRoutes.push(result);
177
+ }
178
+ }
179
+ }
180
+ if (quotedRoutes.length === 0) {
181
+ return null;
182
+ }
183
+ // Sort by amountOut descending, then by fewer hops
184
+ quotedRoutes.sort((a, b) => {
185
+ const amountDiff = b.amountOut - a.amountOut;
186
+ if (amountDiff !== 0n) {
187
+ return amountDiff > 0n ? 1 : -1;
188
+ }
189
+ return a.tokens.length - b.tokens.length;
190
+ });
191
+ return quotedRoutes[0];
192
+ }
193
+ /**
194
+ * Find the best route for a swap (exactOutput)
195
+ * @param tokenIn - Input token address
196
+ * @param tokenOut - Output token address
197
+ * @param amountOut - Desired output amount
198
+ * @param options - Routing options
199
+ * @returns Best route or null if no route found
200
+ */
201
+ export async function findBestRouteExactOutput(tokenIn, tokenOut, amountOut, options = {}) {
202
+ const { maxHops = DEFAULT_MAX_HOPS, maxCandidates = DEFAULT_MAX_CANDIDATES } = options;
203
+ const cache = options.cache !== undefined ? options.cache : loadPoolsCache();
204
+ if (!cache || cache.pools.length === 0) {
205
+ throw new EchoError(ErrorCodes.NO_ROUTE_FOUND, "Pool cache is empty", "Run: echo jaine pools scan-core");
206
+ }
207
+ const cfg = loadConfig();
208
+ const quoterAddress = cfg.protocol.quoter;
209
+ // Find all possible routes
210
+ const routes = findAllRoutes(tokenIn, tokenOut, cache.pools, maxHops);
211
+ if (routes.length === 0) {
212
+ return null;
213
+ }
214
+ // Limit candidates
215
+ const candidates = routes.slice(0, maxCandidates);
216
+ // Quote all routes
217
+ const quotedRoutes = [];
218
+ const batchSize = 5;
219
+ for (let i = 0; i < candidates.length; i += batchSize) {
220
+ const batch = candidates.slice(i, i + batchSize);
221
+ const results = await Promise.all(batch.map((route) => quoteRoute(route, amountOut, quoterAddress, "exactOutput")));
222
+ for (const result of results) {
223
+ if (result) {
224
+ quotedRoutes.push(result);
225
+ }
226
+ }
227
+ }
228
+ if (quotedRoutes.length === 0) {
229
+ return null;
230
+ }
231
+ // Sort by amountIn ascending (minimize input), then by fewer hops
232
+ quotedRoutes.sort((a, b) => {
233
+ const amountDiff = a.amountIn - b.amountIn;
234
+ if (amountDiff !== 0n) {
235
+ return amountDiff > 0n ? 1 : -1;
236
+ }
237
+ return a.tokens.length - b.tokens.length;
238
+ });
239
+ return quotedRoutes[0];
240
+ }
241
+ /**
242
+ * Format route for display
243
+ */
244
+ export function formatRoute(route, userAliases) {
245
+ return formatPath(route.tokens, route.fees, (addr) => getTokenSymbol(addr, userAliases));
246
+ }
247
+ //# sourceMappingURL=routing.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"routing.js","sourceRoot":"","sources":["../../src/jaine/routing.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,UAAU,EAAE,MAAM,MAAM,CAAC;AAClC,OAAO,EAAE,cAAc,EAAkC,MAAM,gBAAgB,CAAC;AAChF,OAAO,EAAE,UAAU,EAAE,wBAAwB,EAAE,UAAU,EAAE,MAAM,mBAAmB,CAAC;AACrF,OAAO,EAAE,cAAc,EAAE,MAAM,iBAAiB,CAAC;AACjD,OAAO,EAAE,UAAU,EAAE,MAAM,iBAAiB,CAAC;AAC7C,OAAO,EAAE,eAAe,EAAE,MAAM,qBAAqB,CAAC;AACtD,OAAO,EAAE,UAAU,EAAE,MAAM,oBAAoB,CAAC;AAChD,OAAO,EAAE,SAAS,EAAE,UAAU,EAAE,MAAM,cAAc,CAAC;AACrD,OAAO,MAAM,MAAM,oBAAoB,CAAC;AAExC,MAAM,gBAAgB,GAAG,CAAC,CAAC;AAC3B,MAAM,sBAAsB,GAAG,EAAE,CAAC;AAelC;;GAEG;AACH,SAAS,cAAc,CACrB,KAAiB;IAEjB,4CAA4C;IAC5C,MAAM,KAAK,GAAG,IAAI,GAAG,EAAmC,CAAC;IAEzD,MAAM,UAAU,GAAG,CAAC,KAAa,EAAE,EAAE;QACnC,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,KAAK,CAAC,EAAE,CAAC;YACtB,KAAK,CAAC,GAAG,CAAC,KAAK,EAAE,IAAI,GAAG,EAAE,CAAC,CAAC;QAC9B,CAAC;IACH,CAAC,CAAC;IAEF,KAAK,MAAM,IAAI,IAAI,KAAK,EAAE,CAAC;QACzB,MAAM,EAAE,GAAG,IAAI,CAAC,MAAM,CAAC,WAAW,EAAE,CAAC;QACrC,MAAM,EAAE,GAAG,IAAI,CAAC,MAAM,CAAC,WAAW,EAAE,CAAC;QAErC,UAAU,CAAC,EAAE,CAAC,CAAC;QACf,UAAU,CAAC,EAAE,CAAC,CAAC;QAEf,0BAA0B;QAC1B,MAAM,WAAW,GAAG,KAAK,CAAC,GAAG,CAAC,EAAE,CAAE,CAAC;QACnC,MAAM,WAAW,GAAG,KAAK,CAAC,GAAG,CAAC,EAAE,CAAE,CAAC;QAEnC,IAAI,CAAC,WAAW,CAAC,GAAG,CAAC,EAAE,CAAC,EAAE,CAAC;YACzB,WAAW,CAAC,GAAG,CAAC,EAAE,EAAE,EAAE,CAAC,CAAC;QAC1B,CAAC;QACD,WAAW,CAAC,GAAG,CAAC,EAAE,CAAE,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;QAEhC,IAAI,CAAC,WAAW,CAAC,GAAG,CAAC,EAAE,CAAC,EAAE,CAAC;YACzB,WAAW,CAAC,GAAG,CAAC,EAAE,EAAE,EAAE,CAAC,CAAC;QAC1B,CAAC;QACD,WAAW,CAAC,GAAG,CAAC,EAAE,CAAE,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;IAClC,CAAC;IAED,OAAO,KAAK,CAAC;AACf,CAAC;AAED;;GAEG;AACH,SAAS,aAAa,CACpB,OAAgB,EAChB,QAAiB,EACjB,KAAiB,EACjB,OAAe;IAEf,MAAM,KAAK,GAAG,cAAc,CAAC,KAAK,CAAC,CAAC;IACpC,MAAM,MAAM,GAAY,EAAE,CAAC;IAC3B,MAAM,OAAO,GAAG,OAAO,CAAC,WAAW,EAAE,CAAC;IACtC,MAAM,QAAQ,GAAG,QAAQ,CAAC,WAAW,EAAE,CAAC;IAWxC,MAAM,KAAK,GAAe;QACxB;YACE,OAAO,EAAE,OAAO;YAChB,MAAM,EAAE,CAAC,UAAU,CAAC,OAAO,CAAC,CAAC;YAC7B,IAAI,EAAE,EAAE;YACR,KAAK,EAAE,EAAE;YACT,OAAO,EAAE,IAAI,GAAG,CAAC,CAAC,OAAO,CAAC,CAAC;SAC5B;KACF,CAAC;IAEF,OAAO,KAAK,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;QACxB,MAAM,KAAK,GAAG,KAAK,CAAC,KAAK,EAAG,CAAC;QAC7B,MAAM,EAAE,OAAO,EAAE,MAAM,EAAE,IAAI,EAAE,KAAK,EAAE,UAAU,EAAE,OAAO,EAAE,GAAG,KAAK,CAAC;QAEpE,kCAAkC;QAClC,IAAI,OAAO,KAAK,QAAQ,EAAE,CAAC;YACzB,MAAM,CAAC,IAAI,CAAC;gBACV,MAAM,EAAE,CAAC,GAAG,MAAM,CAAC;gBACnB,IAAI,EAAE,CAAC,GAAG,IAAI,CAAC;gBACf,KAAK,EAAE,CAAC,GAAG,UAAU,CAAC;aACvB,CAAC,CAAC;YACH,SAAS;QACX,CAAC;QAED,4CAA4C;QAC5C,IAAI,MAAM,CAAC,MAAM,GAAG,OAAO,EAAE,CAAC;YAC5B,SAAS;QACX,CAAC;QAED,gBAAgB;QAChB,MAAM,SAAS,GAAG,KAAK,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC;QACrC,IAAI,CAAC,SAAS;YAAE,SAAS;QAEzB,KAAK,MAAM,CAAC,aAAa,EAAE,eAAe,CAAC,IAAI,SAAS,EAAE,CAAC;YACzD,sCAAsC;YACtC,IAAI,OAAO,CAAC,GAAG,CAAC,aAAa,CAAC;gBAAE,SAAS;YAEzC,wCAAwC;YACxC,KAAK,MAAM,IAAI,IAAI,eAAe,EAAE,CAAC;gBACnC,KAAK,CAAC,IAAI,CAAC;oBACT,OAAO,EAAE,aAAa;oBACtB,MAAM,EAAE,CAAC,GAAG,MAAM,EAAE,UAAU,CAAC,aAAwB,CAAC,CAAC;oBACzD,IAAI,EAAE,CAAC,GAAG,IAAI,EAAE,IAAI,CAAC,GAAG,CAAC;oBACzB,KAAK,EAAE,CAAC,GAAG,UAAU,EAAE,IAAI,CAAC,OAAO,CAAC;oBACpC,OAAO,EAAE,IAAI,GAAG,CAAC,CAAC,GAAG,OAAO,EAAE,aAAa,CAAC,CAAC;iBAC9C,CAAC,CAAC;YACL,CAAC;QACH,CAAC;IACH,CAAC;IAED,OAAO,MAAM,CAAC;AAChB,CAAC;AAED;;GAEG;AACH,KAAK,UAAU,UAAU,CACvB,KAAY,EACZ,QAAgB,EAChB,aAAsB,EACtB,SAAuC;IAEvC,MAAM,MAAM,GAAG,eAAe,EAAE,CAAC;IAEjC,IAAI,CAAC;QACH,IAAI,SAAS,KAAK,YAAY,EAAE,CAAC;YAC/B,MAAM,IAAI,GAAG,UAAU,CAAC,KAAK,CAAC,MAAM,EAAE,KAAK,CAAC,IAAI,CAAC,CAAC;YAElD,6CAA6C;YAC7C,MAAM,SAAS,GAAG,MAAM,MAAM,CAAC,YAAY,CAAC;gBAC1C,OAAO,EAAE,aAAa;gBACtB,GAAG,EAAE,UAAU;gBACf,YAAY,EAAE,iBAAiB;gBAC/B,IAAI,EAAE,CAAC,IAAI,EAAE,QAAQ,CAAC;aACvB,CAAC,CAAC;YAEH,OAAO;gBACL,GAAG,KAAK;gBACR,QAAQ;gBACR,SAAS;gBACT,WAAW,EAAE,IAAI;gBACjB,WAAW,EAAE,EAAE;aAChB,CAAC;QACJ,CAAC;aAAM,CAAC;YACN,iCAAiC;YACjC,MAAM,IAAI,GAAG,wBAAwB,CAAC,KAAK,CAAC,MAAM,EAAE,KAAK,CAAC,IAAI,CAAC,CAAC;YAEhE,6CAA6C;YAC7C,MAAM,gBAAgB,GAAG,MAAM,MAAM,CAAC,YAAY,CAAC;gBACjD,OAAO,EAAE,aAAa;gBACtB,GAAG,EAAE,UAAU;gBACf,YAAY,EAAE,kBAAkB;gBAChC,IAAI,EAAE,CAAC,IAAI,EAAE,QAAQ,CAAC,EAAE,iDAAiD;aAC1E,CAAC,CAAC;YAEH,OAAO;gBACL,GAAG,KAAK;gBACR,QAAQ,EAAE,gBAAgB;gBAC1B,SAAS,EAAE,QAAQ,EAAE,qBAAqB;gBAC1C,WAAW,EAAE,IAAI;gBACjB,WAAW,EAAE,EAAE;aAChB,CAAC;QACJ,CAAC;IACH,CAAC;IAAC,OAAO,GAAG,EAAE,CAAC;QACb,MAAM,CAAC,KAAK,CAAC,2BAA2B,GAAG,EAAE,CAAC,CAAC;QAC/C,OAAO,IAAI,CAAC;IACd,CAAC;AACH,CAAC;AAQD;;;;;;;GAOG;AACH,MAAM,CAAC,KAAK,UAAU,uBAAuB,CAC3C,OAAgB,EAChB,QAAiB,EACjB,QAAgB,EAChB,UAA4B,EAAE;IAE9B,MAAM,EAAE,OAAO,GAAG,gBAAgB,EAAE,aAAa,GAAG,sBAAsB,EAAE,GAAG,OAAO,CAAC;IACvF,MAAM,KAAK,GAAG,OAAO,CAAC,KAAK,KAAK,SAAS,CAAC,CAAC,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC,CAAC,cAAc,EAAE,CAAC;IAE7E,IAAI,CAAC,KAAK,IAAI,KAAK,CAAC,KAAK,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;QACvC,MAAM,IAAI,SAAS,CACjB,UAAU,CAAC,cAAc,EACzB,qBAAqB,EACrB,iCAAiC,CAClC,CAAC;IACJ,CAAC;IAED,MAAM,GAAG,GAAG,UAAU,EAAE,CAAC;IACzB,MAAM,aAAa,GAAG,GAAG,CAAC,QAAQ,CAAC,MAAM,CAAC;IAE1C,2BAA2B;IAC3B,MAAM,MAAM,GAAG,aAAa,CAAC,OAAO,EAAE,QAAQ,EAAE,KAAK,CAAC,KAAK,EAAE,OAAO,CAAC,CAAC;IAEtE,IAAI,MAAM,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;QACxB,OAAO,IAAI,CAAC;IACd,CAAC;IAED,mBAAmB;IACnB,MAAM,UAAU,GAAG,MAAM,CAAC,KAAK,CAAC,CAAC,EAAE,aAAa,CAAC,CAAC;IAElD,4CAA4C;IAC5C,MAAM,YAAY,GAAkB,EAAE,CAAC;IAEvC,iDAAiD;IACjD,MAAM,SAAS,GAAG,CAAC,CAAC;IACpB,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,UAAU,CAAC,MAAM,EAAE,CAAC,IAAI,SAAS,EAAE,CAAC;QACtD,MAAM,KAAK,GAAG,UAAU,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,GAAG,SAAS,CAAC,CAAC;QACjD,MAAM,OAAO,GAAG,MAAM,OAAO,CAAC,GAAG,CAC/B,KAAK,CAAC,GAAG,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC,UAAU,CAAC,KAAK,EAAE,QAAQ,EAAE,aAAa,EAAE,YAAY,CAAC,CAAC,CAC/E,CAAC;QAEF,KAAK,MAAM,MAAM,IAAI,OAAO,EAAE,CAAC;YAC7B,IAAI,MAAM,EAAE,CAAC;gBACX,YAAY,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC;YAC5B,CAAC;QACH,CAAC;IACH,CAAC;IAED,IAAI,YAAY,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;QAC9B,OAAO,IAAI,CAAC;IACd,CAAC;IAED,mDAAmD;IACnD,YAAY,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE;QACzB,MAAM,UAAU,GAAG,CAAC,CAAC,SAAS,GAAG,CAAC,CAAC,SAAS,CAAC;QAC7C,IAAI,UAAU,KAAK,EAAE,EAAE,CAAC;YACtB,OAAO,UAAU,GAAG,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;QAClC,CAAC;QACD,OAAO,CAAC,CAAC,MAAM,CAAC,MAAM,GAAG,CAAC,CAAC,MAAM,CAAC,MAAM,CAAC;IAC3C,CAAC,CAAC,CAAC;IAEH,OAAO,YAAY,CAAC,CAAC,CAAC,CAAC;AACzB,CAAC;AAED;;;;;;;GAOG;AACH,MAAM,CAAC,KAAK,UAAU,wBAAwB,CAC5C,OAAgB,EAChB,QAAiB,EACjB,SAAiB,EACjB,UAA4B,EAAE;IAE9B,MAAM,EAAE,OAAO,GAAG,gBAAgB,EAAE,aAAa,GAAG,sBAAsB,EAAE,GAAG,OAAO,CAAC;IACvF,MAAM,KAAK,GAAG,OAAO,CAAC,KAAK,KAAK,SAAS,CAAC,CAAC,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC,CAAC,cAAc,EAAE,CAAC;IAE7E,IAAI,CAAC,KAAK,IAAI,KAAK,CAAC,KAAK,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;QACvC,MAAM,IAAI,SAAS,CACjB,UAAU,CAAC,cAAc,EACzB,qBAAqB,EACrB,iCAAiC,CAClC,CAAC;IACJ,CAAC;IAED,MAAM,GAAG,GAAG,UAAU,EAAE,CAAC;IACzB,MAAM,aAAa,GAAG,GAAG,CAAC,QAAQ,CAAC,MAAM,CAAC;IAE1C,2BAA2B;IAC3B,MAAM,MAAM,GAAG,aAAa,CAAC,OAAO,EAAE,QAAQ,EAAE,KAAK,CAAC,KAAK,EAAE,OAAO,CAAC,CAAC;IAEtE,IAAI,MAAM,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;QACxB,OAAO,IAAI,CAAC;IACd,CAAC;IAED,mBAAmB;IACnB,MAAM,UAAU,GAAG,MAAM,CAAC,KAAK,CAAC,CAAC,EAAE,aAAa,CAAC,CAAC;IAElD,mBAAmB;IACnB,MAAM,YAAY,GAAkB,EAAE,CAAC;IAEvC,MAAM,SAAS,GAAG,CAAC,CAAC;IACpB,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,UAAU,CAAC,MAAM,EAAE,CAAC,IAAI,SAAS,EAAE,CAAC;QACtD,MAAM,KAAK,GAAG,UAAU,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,GAAG,SAAS,CAAC,CAAC;QACjD,MAAM,OAAO,GAAG,MAAM,OAAO,CAAC,GAAG,CAC/B,KAAK,CAAC,GAAG,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC,UAAU,CAAC,KAAK,EAAE,SAAS,EAAE,aAAa,EAAE,aAAa,CAAC,CAAC,CACjF,CAAC;QAEF,KAAK,MAAM,MAAM,IAAI,OAAO,EAAE,CAAC;YAC7B,IAAI,MAAM,EAAE,CAAC;gBACX,YAAY,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC;YAC5B,CAAC;QACH,CAAC;IACH,CAAC;IAED,IAAI,YAAY,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;QAC9B,OAAO,IAAI,CAAC;IACd,CAAC;IAED,kEAAkE;IAClE,YAAY,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE;QACzB,MAAM,UAAU,GAAG,CAAC,CAAC,QAAQ,GAAG,CAAC,CAAC,QAAQ,CAAC;QAC3C,IAAI,UAAU,KAAK,EAAE,EAAE,CAAC;YACtB,OAAO,UAAU,GAAG,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;QAClC,CAAC;QACD,OAAO,CAAC,CAAC,MAAM,CAAC,MAAM,GAAG,CAAC,CAAC,MAAM,CAAC,MAAM,CAAC;IAC3C,CAAC,CAAC,CAAC;IAEH,OAAO,YAAY,CAAC,CAAC,CAAC,CAAC;AACzB,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,WAAW,CACzB,KAAY,EACZ,WAAqC;IAErC,OAAO,UAAU,CAAC,KAAK,CAAC,MAAM,EAAE,KAAK,CAAC,IAAI,EAAE,CAAC,IAAI,EAAE,EAAE,CACnD,cAAc,CAAC,IAAI,EAAE,WAAW,CAAC,CAClC,CAAC;AACJ,CAAC"}
@@ -0,0 +1,26 @@
1
+ import type { SubgraphMeta, SubgraphPool, SubgraphSwap, SubgraphMint, SubgraphBurn, SubgraphCollect, SubgraphPoolDayData, SubgraphPoolHourData, SubgraphDexDayData, SubgraphToken } from "./types.js";
2
+ interface PaginationOpts {
3
+ limit?: number;
4
+ skip?: number;
5
+ }
6
+ export declare const subgraphClient: {
7
+ getMeta(): Promise<SubgraphMeta>;
8
+ getTopPools(limit?: number, skip?: number): Promise<SubgraphPool[]>;
9
+ getPoolsForToken(token: string, opts?: PaginationOpts): Promise<SubgraphPool[]>;
10
+ getPoolsForPair(tokenA: string, tokenB: string, opts?: PaginationOpts): Promise<SubgraphPool[]>;
11
+ getNewestPools(limit?: number): Promise<SubgraphPool[]>;
12
+ getPool(id: string): Promise<SubgraphPool | null>;
13
+ getPoolDayData(poolId: string, opts?: PaginationOpts): Promise<SubgraphPoolDayData[]>;
14
+ getPoolHourData(poolId: string, opts?: PaginationOpts): Promise<SubgraphPoolHourData[]>;
15
+ getRecentSwaps(poolId: string, opts?: PaginationOpts): Promise<SubgraphSwap[]>;
16
+ getMints(poolId: string, opts?: PaginationOpts): Promise<SubgraphMint[]>;
17
+ getBurns(poolId: string, opts?: PaginationOpts): Promise<SubgraphBurn[]>;
18
+ getCollects(poolId: string, opts?: PaginationOpts): Promise<SubgraphCollect[]>;
19
+ getDexDayData(limit?: number): Promise<SubgraphDexDayData[]>;
20
+ getToken(id: string): Promise<SubgraphToken | null>;
21
+ getTopTokens(opts?: PaginationOpts & {
22
+ by?: "tvl" | "volume";
23
+ }): Promise<SubgraphToken[]>;
24
+ };
25
+ export {};
26
+ //# sourceMappingURL=client.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"client.d.ts","sourceRoot":"","sources":["../../../src/jaine/subgraph/client.ts"],"names":[],"mappings":"AAMA,OAAO,KAAK,EAEV,YAAY,EACZ,YAAY,EACZ,YAAY,EACZ,YAAY,EACZ,YAAY,EACZ,eAAe,EACf,mBAAmB,EACnB,oBAAoB,EACpB,kBAAkB,EAClB,aAAa,EACd,MAAM,YAAY,CAAC;AAyGpB,UAAU,cAAc;IACtB,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,IAAI,CAAC,EAAE,MAAM,CAAC;CACf;AAED,eAAO,MAAM,cAAc;eACR,OAAO,CAAC,YAAY,CAAC;wBAKb,MAAM,kBAAoD,OAAO,CAAC,YAAY,EAAE,CAAC;4BAQ5E,MAAM,SAAS,cAAc,GAAG,OAAO,CAAC,YAAY,EAAE,CAAC;4BASvD,MAAM,UAAU,MAAM,SAAS,cAAc,GAAG,OAAO,CAAC,YAAY,EAAE,CAAC;oCAUnE,OAAO,CAAC,YAAY,EAAE,CAAC;gBAOvC,MAAM,GAAG,OAAO,CAAC,YAAY,GAAG,IAAI,CAAC;2BAO1B,MAAM,SAAS,cAAc,GAAG,OAAO,CAAC,mBAAmB,EAAE,CAAC;4BAS7D,MAAM,SAAS,cAAc,GAAG,OAAO,CAAC,oBAAoB,EAAE,CAAC;2BAShE,MAAM,SAAS,cAAc,GAAG,OAAO,CAAC,YAAY,EAAE,CAAC;qBAS7D,MAAM,SAAS,cAAc,GAAG,OAAO,CAAC,YAAY,EAAE,CAAC;qBASvD,MAAM,SAAS,cAAc,GAAG,OAAO,CAAC,YAAY,EAAE,CAAC;wBASpD,MAAM,SAAS,cAAc,GAAG,OAAO,CAAC,eAAe,EAAE,CAAC;mCASnD,OAAO,CAAC,kBAAkB,EAAE,CAAC;iBAO3C,MAAM,GAAG,OAAO,CAAC,aAAa,GAAG,IAAI,CAAC;wBAO/B,cAAc,GAAG;QAAE,EAAE,CAAC,EAAE,KAAK,GAAG,QAAQ,CAAA;KAAE,GAAG,OAAO,CAAC,aAAa,EAAE,CAAC;CAQhG,CAAC"}