@andrewkimjoseph/celina-sdk 0.9.7 → 0.9.9

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 (365) hide show
  1. package/build/analytics/mcp-tool-events.js +2 -0
  2. package/build/analytics/mcp-tool-events.js.map +1 -1
  3. package/build/index.d.ts +1 -1
  4. package/build/services/gooddollar.service.d.ts +16 -2
  5. package/build/services/gooddollar.service.js +54 -31
  6. package/build/services/gooddollar.service.js.map +1 -1
  7. package/build/src/a2a/agent-card.d.ts +37 -0
  8. package/build/src/a2a/agent-card.js +46 -0
  9. package/build/src/a2a/agent-card.js.map +1 -0
  10. package/build/src/a2a/index.d.ts +2 -0
  11. package/build/src/a2a/index.js +3 -0
  12. package/build/src/a2a/index.js.map +1 -0
  13. package/build/src/a2a/skills.d.ts +18 -0
  14. package/build/src/a2a/skills.js +101 -0
  15. package/build/src/a2a/skills.js.map +1 -0
  16. package/build/src/abis/aave-pool.d.ts +37 -0
  17. package/build/src/abis/aave-pool.js +26 -0
  18. package/build/src/abis/aave-pool.js.map +1 -0
  19. package/build/src/abis/accounts.d.ts +13 -0
  20. package/build/src/abis/accounts.js +10 -0
  21. package/build/src/abis/accounts.js.map +1 -0
  22. package/build/src/abis/election.d.ts +124 -0
  23. package/build/src/abis/election.js +88 -0
  24. package/build/src/abis/election.js.map +1 -0
  25. package/build/src/abis/gooddollar-broker.d.ts +77 -0
  26. package/build/src/abis/gooddollar-broker.js +44 -0
  27. package/build/src/abis/gooddollar-broker.js.map +1 -0
  28. package/build/src/abis/gooddollar-identity.d.ts +85 -0
  29. package/build/src/abis/gooddollar-identity.js +52 -0
  30. package/build/src/abis/gooddollar-identity.js.map +1 -0
  31. package/build/src/abis/governance.d.ts +86 -0
  32. package/build/src/abis/governance.js +68 -0
  33. package/build/src/abis/governance.js.map +1 -0
  34. package/build/src/abis/locked-gold.d.ts +10 -0
  35. package/build/src/abis/locked-gold.js +10 -0
  36. package/build/src/abis/locked-gold.js.map +1 -0
  37. package/build/src/abis/nft.d.ts +107 -0
  38. package/build/src/abis/nft.js +75 -0
  39. package/build/src/abis/nft.js.map +1 -0
  40. package/build/src/abis/permit2.d.ts +43 -0
  41. package/build/src/abis/permit2.js +30 -0
  42. package/build/src/abis/permit2.js.map +1 -0
  43. package/build/src/abis/self-registry.d.ts +194 -0
  44. package/build/src/abis/self-registry.js +120 -0
  45. package/build/src/abis/self-registry.js.map +1 -0
  46. package/build/src/abis/ubi-scheme.d.ts +91 -0
  47. package/build/src/abis/ubi-scheme.js +66 -0
  48. package/build/src/abis/ubi-scheme.js.map +1 -0
  49. package/build/src/abis/uniswap-state-view.d.ts +34 -0
  50. package/build/src/abis/uniswap-state-view.js +22 -0
  51. package/build/src/abis/uniswap-state-view.js.map +1 -0
  52. package/build/src/abis/uniswap-v4-quoter.d.ts +86 -0
  53. package/build/src/abis/uniswap-v4-quoter.js +64 -0
  54. package/build/src/abis/uniswap-v4-quoter.js.map +1 -0
  55. package/build/src/abis/universal-router.d.ts +16 -0
  56. package/build/src/abis/universal-router.js +14 -0
  57. package/build/src/abis/universal-router.js.map +1 -0
  58. package/build/src/abis/validators-minimal.d.ts +65 -0
  59. package/build/src/abis/validators-minimal.js +39 -0
  60. package/build/src/abis/validators-minimal.js.map +1 -0
  61. package/build/src/analytics/amplitude.d.ts +11 -0
  62. package/build/src/analytics/amplitude.js +76 -0
  63. package/build/src/analytics/amplitude.js.map +1 -0
  64. package/build/src/analytics/config.d.ts +7 -0
  65. package/build/src/analytics/config.js +28 -0
  66. package/build/src/analytics/config.js.map +1 -0
  67. package/build/src/analytics/consumer-package.d.ts +9 -0
  68. package/build/src/analytics/consumer-package.js +143 -0
  69. package/build/src/analytics/consumer-package.js.map +1 -0
  70. package/build/src/analytics/mcp-tool-events.d.ts +5 -0
  71. package/build/src/analytics/mcp-tool-events.js +53 -0
  72. package/build/src/analytics/mcp-tool-events.js.map +1 -0
  73. package/build/src/analytics/wallet-context.d.ts +11 -0
  74. package/build/src/analytics/wallet-context.js +81 -0
  75. package/build/src/analytics/wallet-context.js.map +1 -0
  76. package/build/src/analytics/wallet-extract.d.ts +9 -0
  77. package/build/src/analytics/wallet-extract.js +21 -0
  78. package/build/src/analytics/wallet-extract.js.map +1 -0
  79. package/build/src/analytics/wrap-service.d.ts +5 -0
  80. package/build/src/analytics/wrap-service.js +38 -0
  81. package/build/src/analytics/wrap-service.js.map +1 -0
  82. package/build/src/clients/celo-client.d.ts +17 -0
  83. package/build/src/clients/celo-client.js +28 -0
  84. package/build/src/clients/celo-client.js.map +1 -0
  85. package/build/src/clients/ens-client.d.ts +17 -0
  86. package/build/src/clients/ens-client.js +30 -0
  87. package/build/src/clients/ens-client.js.map +1 -0
  88. package/build/src/clients/mento-sdk.d.ts +2 -0
  89. package/build/src/clients/mento-sdk.js +9 -0
  90. package/build/src/clients/mento-sdk.js.map +1 -0
  91. package/build/src/clients/self-api.d.ts +82 -0
  92. package/build/src/clients/self-api.js +242 -0
  93. package/build/src/clients/self-api.js.map +1 -0
  94. package/build/src/clients/uniswap-sdk.d.ts +4 -0
  95. package/build/src/clients/uniswap-sdk.js +13 -0
  96. package/build/src/clients/uniswap-sdk.js.map +1 -0
  97. package/build/src/config/aave.d.ts +17 -0
  98. package/build/src/config/aave.js +77 -0
  99. package/build/src/config/aave.js.map +1 -0
  100. package/build/src/config/celina-tag.d.ts +4 -0
  101. package/build/src/config/celina-tag.js +13 -0
  102. package/build/src/config/celina-tag.js.map +1 -0
  103. package/build/src/config/celo-core-contracts.d.ts +8 -0
  104. package/build/src/config/celo-core-contracts.js +9 -0
  105. package/build/src/config/celo-core-contracts.js.map +1 -0
  106. package/build/src/config/chains.d.ts +937 -0
  107. package/build/src/config/chains.js +319 -0
  108. package/build/src/config/chains.js.map +1 -0
  109. package/build/src/config/gooddollar.d.ts +16 -0
  110. package/build/src/config/gooddollar.js +24 -0
  111. package/build/src/config/gooddollar.js.map +1 -0
  112. package/build/src/config/sdk-config.d.ts +33 -0
  113. package/build/src/config/sdk-config.js +31 -0
  114. package/build/src/config/sdk-config.js.map +1 -0
  115. package/build/src/config/self.d.ts +22 -0
  116. package/build/src/config/self.js +27 -0
  117. package/build/src/config/self.js.map +1 -0
  118. package/build/src/config/uniswap.d.ts +42 -0
  119. package/build/src/config/uniswap.js +76 -0
  120. package/build/src/config/uniswap.js.map +1 -0
  121. package/build/src/index.d.ts +90 -0
  122. package/build/src/index.js +65 -0
  123. package/build/src/index.js.map +1 -0
  124. package/build/src/oasf/index.d.ts +2 -0
  125. package/build/src/oasf/index.js +3 -0
  126. package/build/src/oasf/index.js.map +1 -0
  127. package/build/src/oasf/record.d.ts +39 -0
  128. package/build/src/oasf/record.js +35 -0
  129. package/build/src/oasf/record.js.map +1 -0
  130. package/build/src/oasf/taxonomy.d.ts +19 -0
  131. package/build/src/oasf/taxonomy.js +46 -0
  132. package/build/src/oasf/taxonomy.js.map +1 -0
  133. package/build/src/services/aave.service.d.ts +58 -0
  134. package/build/src/services/aave.service.js +210 -0
  135. package/build/src/services/aave.service.js.map +1 -0
  136. package/build/src/services/account.service.d.ts +22 -0
  137. package/build/src/services/account.service.js +29 -0
  138. package/build/src/services/account.service.js.map +1 -0
  139. package/build/src/services/blockchain.service.d.ts +107 -0
  140. package/build/src/services/blockchain.service.js +151 -0
  141. package/build/src/services/blockchain.service.js.map +1 -0
  142. package/build/src/services/contract.service.d.ts +78 -0
  143. package/build/src/services/contract.service.js +117 -0
  144. package/build/src/services/contract.service.js.map +1 -0
  145. package/build/src/services/ens.service.d.ts +44 -0
  146. package/build/src/services/ens.service.js +92 -0
  147. package/build/src/services/ens.service.js.map +1 -0
  148. package/build/src/services/gooddollar.service.d.ts +183 -0
  149. package/build/src/services/gooddollar.service.js +675 -0
  150. package/build/src/services/gooddollar.service.js.map +1 -0
  151. package/build/src/services/governance.service.d.ts +96 -0
  152. package/build/src/services/governance.service.js +255 -0
  153. package/build/src/services/governance.service.js.map +1 -0
  154. package/build/src/services/mento-fx.service.d.ts +80 -0
  155. package/build/src/services/mento-fx.service.js +319 -0
  156. package/build/src/services/mento-fx.service.js.map +1 -0
  157. package/build/src/services/nft.service.d.ts +58 -0
  158. package/build/src/services/nft.service.js +222 -0
  159. package/build/src/services/nft.service.js.map +1 -0
  160. package/build/src/services/self-session-store.d.ts +19 -0
  161. package/build/src/services/self-session-store.js +28 -0
  162. package/build/src/services/self-session-store.js.map +1 -0
  163. package/build/src/services/self.service.d.ts +241 -0
  164. package/build/src/services/self.service.js +699 -0
  165. package/build/src/services/self.service.js.map +1 -0
  166. package/build/src/services/staking.service.d.ts +140 -0
  167. package/build/src/services/staking.service.js +444 -0
  168. package/build/src/services/staking.service.js.map +1 -0
  169. package/build/src/services/token.service.d.ts +110 -0
  170. package/build/src/services/token.service.js +189 -0
  171. package/build/src/services/token.service.js.map +1 -0
  172. package/build/src/services/transaction.service.d.ts +68 -0
  173. package/build/src/services/transaction.service.js +198 -0
  174. package/build/src/services/transaction.service.js.map +1 -0
  175. package/build/src/services/uniswap-path-router.d.ts +40 -0
  176. package/build/src/services/uniswap-path-router.js +168 -0
  177. package/build/src/services/uniswap-path-router.js.map +1 -0
  178. package/build/src/services/uniswap-pool-discovery.d.ts +55 -0
  179. package/build/src/services/uniswap-pool-discovery.js +198 -0
  180. package/build/src/services/uniswap-pool-discovery.js.map +1 -0
  181. package/build/src/services/uniswap.service.d.ts +82 -0
  182. package/build/src/services/uniswap.service.js +352 -0
  183. package/build/src/services/uniswap.service.js.map +1 -0
  184. package/build/src/simulation/index.d.ts +5 -0
  185. package/build/src/simulation/index.js +2 -0
  186. package/build/src/simulation/index.js.map +1 -0
  187. package/build/src/simulation/simulate-prepared-step.d.ts +17 -0
  188. package/build/src/simulation/simulate-prepared-step.js +42 -0
  189. package/build/src/simulation/simulate-prepared-step.js.map +1 -0
  190. package/build/src/tools/catalog.d.ts +11 -0
  191. package/build/src/tools/catalog.js +43 -0
  192. package/build/src/tools/catalog.js.map +1 -0
  193. package/build/src/tools/domains/aave.d.ts +2 -0
  194. package/build/src/tools/domains/aave.js +115 -0
  195. package/build/src/tools/domains/aave.js.map +1 -0
  196. package/build/src/tools/domains/blockchain.d.ts +2 -0
  197. package/build/src/tools/domains/blockchain.js +86 -0
  198. package/build/src/tools/domains/blockchain.js.map +1 -0
  199. package/build/src/tools/domains/browser.d.ts +2 -0
  200. package/build/src/tools/domains/browser.js +45 -0
  201. package/build/src/tools/domains/browser.js.map +1 -0
  202. package/build/src/tools/domains/contract.d.ts +2 -0
  203. package/build/src/tools/domains/contract.js +67 -0
  204. package/build/src/tools/domains/contract.js.map +1 -0
  205. package/build/src/tools/domains/ens.d.ts +2 -0
  206. package/build/src/tools/domains/ens.js +16 -0
  207. package/build/src/tools/domains/ens.js.map +1 -0
  208. package/build/src/tools/domains/gooddollar.d.ts +2 -0
  209. package/build/src/tools/domains/gooddollar.js +171 -0
  210. package/build/src/tools/domains/gooddollar.js.map +1 -0
  211. package/build/src/tools/domains/governance.d.ts +2 -0
  212. package/build/src/tools/domains/governance.js +41 -0
  213. package/build/src/tools/domains/governance.js.map +1 -0
  214. package/build/src/tools/domains/index.d.ts +1 -0
  215. package/build/src/tools/domains/index.js +31 -0
  216. package/build/src/tools/domains/index.js.map +1 -0
  217. package/build/src/tools/domains/mento-fx.d.ts +2 -0
  218. package/build/src/tools/domains/mento-fx.js +67 -0
  219. package/build/src/tools/domains/mento-fx.js.map +1 -0
  220. package/build/src/tools/domains/nft.d.ts +2 -0
  221. package/build/src/tools/domains/nft.js +38 -0
  222. package/build/src/tools/domains/nft.js.map +1 -0
  223. package/build/src/tools/domains/self.d.ts +2 -0
  224. package/build/src/tools/domains/self.js +187 -0
  225. package/build/src/tools/domains/self.js.map +1 -0
  226. package/build/src/tools/domains/staking.d.ts +2 -0
  227. package/build/src/tools/domains/staking.js +74 -0
  228. package/build/src/tools/domains/staking.js.map +1 -0
  229. package/build/src/tools/domains/token.d.ts +2 -0
  230. package/build/src/tools/domains/token.js +74 -0
  231. package/build/src/tools/domains/token.js.map +1 -0
  232. package/build/src/tools/domains/transaction.d.ts +2 -0
  233. package/build/src/tools/domains/transaction.js +120 -0
  234. package/build/src/tools/domains/transaction.js.map +1 -0
  235. package/build/src/tools/domains/uniswap.d.ts +2 -0
  236. package/build/src/tools/domains/uniswap.js +67 -0
  237. package/build/src/tools/domains/uniswap.js.map +1 -0
  238. package/build/src/tools/filter.d.ts +2 -0
  239. package/build/src/tools/filter.js +50 -0
  240. package/build/src/tools/filter.js.map +1 -0
  241. package/build/src/tools/index.d.ts +7 -0
  242. package/build/src/tools/index.js +7 -0
  243. package/build/src/tools/index.js.map +1 -0
  244. package/build/src/tools/schemas/common.d.ts +165 -0
  245. package/build/src/tools/schemas/common.js +207 -0
  246. package/build/src/tools/schemas/common.js.map +1 -0
  247. package/build/src/tools/schemas/wallet-params.d.ts +9 -0
  248. package/build/src/tools/schemas/wallet-params.js +52 -0
  249. package/build/src/tools/schemas/wallet-params.js.map +1 -0
  250. package/build/src/tools/swap-routing.d.ts +25 -0
  251. package/build/src/tools/swap-routing.js +174 -0
  252. package/build/src/tools/swap-routing.js.map +1 -0
  253. package/build/src/tools/types.d.ts +124 -0
  254. package/build/src/tools/types.js +2 -0
  255. package/build/src/tools/types.js.map +1 -0
  256. package/build/src/tools/utils/normalize-token.d.ts +2 -0
  257. package/build/src/tools/utils/normalize-token.js +12 -0
  258. package/build/src/tools/utils/normalize-token.js.map +1 -0
  259. package/build/src/tools/utils/wallet.d.ts +4 -0
  260. package/build/src/tools/utils/wallet.js +8 -0
  261. package/build/src/tools/utils/wallet.js.map +1 -0
  262. package/build/src/tools/website-sync.d.ts +28 -0
  263. package/build/src/tools/website-sync.js +165 -0
  264. package/build/src/tools/website-sync.js.map +1 -0
  265. package/build/src/types/prepared.d.ts +28 -0
  266. package/build/src/types/prepared.js +12 -0
  267. package/build/src/types/prepared.js.map +1 -0
  268. package/build/src/utils/celo-format.d.ts +6 -0
  269. package/build/src/utils/celo-format.js +17 -0
  270. package/build/src/utils/celo-format.js.map +1 -0
  271. package/build/src/utils/erc20-allowance-storage.d.ts +20 -0
  272. package/build/src/utils/erc20-allowance-storage.js +64 -0
  273. package/build/src/utils/erc20-allowance-storage.js.map +1 -0
  274. package/build/src/utils/format-date.d.ts +2 -0
  275. package/build/src/utils/format-date.js +13 -0
  276. package/build/src/utils/format-date.js.map +1 -0
  277. package/build/src/utils/format-duration.d.ts +2 -0
  278. package/build/src/utils/format-duration.js +17 -0
  279. package/build/src/utils/format-duration.js.map +1 -0
  280. package/build/src/utils/format-unix-datetime.d.ts +4 -0
  281. package/build/src/utils/format-unix-datetime.js +18 -0
  282. package/build/src/utils/format-unix-datetime.js.map +1 -0
  283. package/build/src/utils/gooddollar-ubi-period.d.ts +23 -0
  284. package/build/src/utils/gooddollar-ubi-period.js +23 -0
  285. package/build/src/utils/gooddollar-ubi-period.js.map +1 -0
  286. package/build/src/utils/normalize-address.d.ts +7 -0
  287. package/build/src/utils/normalize-address.js +16 -0
  288. package/build/src/utils/normalize-address.js.map +1 -0
  289. package/build/src/utils/self-format.d.ts +28 -0
  290. package/build/src/utils/self-format.js +79 -0
  291. package/build/src/utils/self-format.js.map +1 -0
  292. package/build/src/utils/self-signing.d.ts +4 -0
  293. package/build/src/utils/self-signing.js +38 -0
  294. package/build/src/utils/self-signing.js.map +1 -0
  295. package/build/src/utils/transaction-errors.d.ts +3 -0
  296. package/build/src/utils/transaction-errors.js +17 -0
  297. package/build/src/utils/transaction-errors.js.map +1 -0
  298. package/build/tests/catalog/domains/blockchain.d.ts +2 -0
  299. package/build/tests/catalog/domains/blockchain.js +127 -0
  300. package/build/tests/catalog/domains/blockchain.js.map +1 -0
  301. package/build/tests/catalog/domains/chain-ext.d.ts +5 -0
  302. package/build/tests/catalog/domains/chain-ext.js +207 -0
  303. package/build/tests/catalog/domains/chain-ext.js.map +1 -0
  304. package/build/tests/catalog/domains/defi.d.ts +6 -0
  305. package/build/tests/catalog/domains/defi.js +581 -0
  306. package/build/tests/catalog/domains/defi.js.map +1 -0
  307. package/build/tests/catalog/domains/self.d.ts +2 -0
  308. package/build/tests/catalog/domains/self.js +208 -0
  309. package/build/tests/catalog/domains/self.js.map +1 -0
  310. package/build/tests/catalog/domains/token.d.ts +2 -0
  311. package/build/tests/catalog/domains/token.js +70 -0
  312. package/build/tests/catalog/domains/token.js.map +1 -0
  313. package/build/tests/catalog/domains/transaction.d.ts +2 -0
  314. package/build/tests/catalog/domains/transaction.js +96 -0
  315. package/build/tests/catalog/domains/transaction.js.map +1 -0
  316. package/build/tests/catalog/index.d.ts +2 -0
  317. package/build/tests/catalog/index.js +2 -0
  318. package/build/tests/catalog/index.js.map +1 -0
  319. package/build/tests/catalog/operations.d.ts +12 -0
  320. package/build/tests/catalog/operations.js +29 -0
  321. package/build/tests/catalog/operations.js.map +1 -0
  322. package/build/tests/catalog/types.d.ts +24 -0
  323. package/build/tests/catalog/types.js +2 -0
  324. package/build/tests/catalog/types.js.map +1 -0
  325. package/build/tests/fixtures/mainnet.d.ts +54 -0
  326. package/build/tests/fixtures/mainnet.js +53 -0
  327. package/build/tests/fixtures/mainnet.js.map +1 -0
  328. package/build/tests/helpers/assert.d.ts +4 -0
  329. package/build/tests/helpers/assert.js +24 -0
  330. package/build/tests/helpers/assert.js.map +1 -0
  331. package/build/tests/helpers/env.d.ts +11 -0
  332. package/build/tests/helpers/env.js +28 -0
  333. package/build/tests/helpers/env.js.map +1 -0
  334. package/build/tests/helpers/gating.d.ts +3 -0
  335. package/build/tests/helpers/gating.js +23 -0
  336. package/build/tests/helpers/gating.js.map +1 -0
  337. package/build/tests/testing-entry.d.ts +6 -0
  338. package/build/tests/testing-entry.js +6 -0
  339. package/build/tests/testing-entry.js.map +1 -0
  340. package/build/tools/domains/browser.js +4 -1
  341. package/build/tools/domains/browser.js.map +1 -1
  342. package/build/tools/domains/gooddollar.js +11 -7
  343. package/build/tools/domains/gooddollar.js.map +1 -1
  344. package/build/tools/schemas/common.d.ts +7 -0
  345. package/build/tools/schemas/common.js +9 -1
  346. package/build/tools/schemas/common.js.map +1 -1
  347. package/build/tools/swap-routing.d.ts +1 -0
  348. package/build/tools/swap-routing.js +2 -1
  349. package/build/tools/swap-routing.js.map +1 -1
  350. package/package.json +5 -9
  351. package/tests/README.md +0 -78
  352. package/tests/catalog/domains/blockchain.ts +0 -133
  353. package/tests/catalog/domains/chain-ext.ts +0 -219
  354. package/tests/catalog/domains/defi.ts +0 -532
  355. package/tests/catalog/domains/self.ts +0 -220
  356. package/tests/catalog/domains/token.ts +0 -74
  357. package/tests/catalog/domains/transaction.ts +0 -111
  358. package/tests/catalog/index.ts +0 -7
  359. package/tests/catalog/operations.ts +0 -53
  360. package/tests/catalog/types.ts +0 -27
  361. package/tests/fixtures/mainnet.ts +0 -93
  362. package/tests/helpers/assert.ts +0 -30
  363. package/tests/helpers/env.ts +0 -38
  364. package/tests/helpers/gating.ts +0 -36
  365. package/tests/testing-entry.ts +0 -27
@@ -0,0 +1,168 @@
1
+ import { v4QuoterAbi } from "../abis/uniswap-v4-quoter.js";
2
+ import { normalizeUniswapPoolKey, UNISWAP_V4, } from "../config/uniswap.js";
3
+ import { getUniswapPoolIndex, poolsBetween, } from "./uniswap-pool-discovery.js";
4
+ /** Maximum pools in a route (2 intermediate currencies → 3 pools). */
5
+ const MAX_POOLS = 3;
6
+ function otherToken(poolKey, currency) {
7
+ const c = currency.toLowerCase();
8
+ if (poolKey.currency0.toLowerCase() === c)
9
+ return poolKey.currency1;
10
+ if (poolKey.currency1.toLowerCase() === c)
11
+ return poolKey.currency0;
12
+ return null;
13
+ }
14
+ function buildPathKeys(pools, currencyIn) {
15
+ let current = currencyIn;
16
+ const pathKeys = [];
17
+ for (const poolKey of pools) {
18
+ const out = otherToken(poolKey, current);
19
+ if (!out) {
20
+ throw new Error("Invalid swap path for Uniswap v4 pools.");
21
+ }
22
+ pathKeys.push({
23
+ intermediateCurrency: out,
24
+ fee: poolKey.fee,
25
+ tickSpacing: poolKey.tickSpacing,
26
+ hooks: poolKey.hooks,
27
+ hookData: "0x",
28
+ });
29
+ current = out;
30
+ }
31
+ return pathKeys;
32
+ }
33
+ function enumeratePaths(index, currencyIn, currencyOut) {
34
+ const start = currencyIn.toLowerCase();
35
+ const goal = currencyOut.toLowerCase();
36
+ if (start === goal) {
37
+ return [];
38
+ }
39
+ const results = [];
40
+ const queue = [{ currency: start, pools: [], visited: new Set([start]) }];
41
+ while (queue.length > 0) {
42
+ const node = queue.shift();
43
+ if (node.pools.length >= MAX_POOLS) {
44
+ continue;
45
+ }
46
+ const neighbors = index.adjacency.get(node.currency);
47
+ if (!neighbors) {
48
+ continue;
49
+ }
50
+ for (const neighbor of neighbors) {
51
+ if (node.visited.has(neighbor)) {
52
+ continue;
53
+ }
54
+ // A pair can have several pools (different fee tiers); branch over each so
55
+ // the quoter can pick the genuinely best-priced one.
56
+ for (const poolKey of poolsBetween(index, node.currency, neighbor)) {
57
+ const nextPools = [...node.pools, poolKey];
58
+ if (neighbor === goal) {
59
+ results.push(nextPools);
60
+ continue;
61
+ }
62
+ if (nextPools.length < MAX_POOLS) {
63
+ queue.push({
64
+ currency: neighbor,
65
+ pools: nextPools,
66
+ visited: new Set([...node.visited, neighbor]),
67
+ });
68
+ }
69
+ }
70
+ }
71
+ }
72
+ return results;
73
+ }
74
+ async function quotePath(client, currencyIn, pools, amountIn) {
75
+ if (pools.length === 0) {
76
+ return 0n;
77
+ }
78
+ if (pools.length === 1) {
79
+ const poolKey = normalizeUniswapPoolKey(pools[0]);
80
+ const zeroForOne = currencyIn.toLowerCase() === poolKey.currency0.toLowerCase();
81
+ const { result } = await client.simulateContract({
82
+ address: UNISWAP_V4.v4Quoter,
83
+ abi: v4QuoterAbi,
84
+ functionName: "quoteExactInputSingle",
85
+ args: [
86
+ {
87
+ poolKey,
88
+ zeroForOne,
89
+ exactAmount: amountIn,
90
+ hookData: "0x",
91
+ },
92
+ ],
93
+ });
94
+ return result[0];
95
+ }
96
+ const pathKeys = buildPathKeys(pools, currencyIn);
97
+ const { result } = await client.simulateContract({
98
+ address: UNISWAP_V4.v4Quoter,
99
+ abi: v4QuoterAbi,
100
+ functionName: "quoteExactInput",
101
+ args: [
102
+ {
103
+ exactCurrency: currencyIn,
104
+ path: pathKeys,
105
+ exactAmount: amountIn,
106
+ },
107
+ ],
108
+ });
109
+ return result[0];
110
+ }
111
+ /**
112
+ * Quote all candidate paths and return the highest-output Uniswap v4 route.
113
+ * @param client - Celo public client for quoter simulation
114
+ * @param currencyIn - Input currency address (native CELO maps to WCELO upstream)
115
+ * @param currencyOut - Output currency address
116
+ * @param amountIn - Input amount in base units
117
+ * @returns Best route and quoter output, or `null` when no path quotes successfully
118
+ */
119
+ export async function findBestUniswapRoute(client, currencyIn, currencyOut, amountIn) {
120
+ const index = await getUniswapPoolIndex(client);
121
+ const candidatePaths = enumeratePaths(index, currencyIn, currencyOut);
122
+ // Quote every candidate path concurrently; failed quotes (e.g. uninitialized
123
+ // pools or insufficient liquidity) are dropped rather than aborting the rest.
124
+ const quotes = await Promise.allSettled(candidatePaths.map(async (pools) => ({
125
+ pools,
126
+ amountOut: await quotePath(client, currencyIn, pools, amountIn),
127
+ })));
128
+ let best = null;
129
+ for (const quote of quotes) {
130
+ if (quote.status !== "fulfilled") {
131
+ continue;
132
+ }
133
+ const { pools, amountOut } = quote.value;
134
+ if (amountOut <= 0n) {
135
+ continue;
136
+ }
137
+ if (!best || amountOut > best.amountOut) {
138
+ best = {
139
+ amountOut,
140
+ route: {
141
+ currencyIn,
142
+ currencyOut,
143
+ pools,
144
+ pathKeys: buildPathKeys(pools, currencyIn),
145
+ hops: pools.length,
146
+ },
147
+ };
148
+ }
149
+ }
150
+ if (!best) {
151
+ return null;
152
+ }
153
+ return {
154
+ route: best.route,
155
+ amountOut: best.amountOut,
156
+ indexSource: index.source,
157
+ };
158
+ }
159
+ /**
160
+ * Apply slippage tolerance to a quoted output amount.
161
+ * @param amountOut - Quoted output in base units
162
+ * @param slippagePercent - Max slippage in percent (e.g. `0.5` for 0.5%)
163
+ */
164
+ export function applySlippage(amountOut, slippagePercent) {
165
+ const bps = BigInt(Math.round(slippagePercent * 100));
166
+ return (amountOut * (10000n - bps)) / 10000n;
167
+ }
168
+ //# sourceMappingURL=uniswap-path-router.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"uniswap-path-router.js","sourceRoot":"","sources":["../../../src/services/uniswap-path-router.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,55 @@
1
+ /**
2
+ * Uniswap v4 pool discovery: subgraph index with on-chain hub fallback.
3
+ */
4
+ import { type PublicClient } from "viem";
5
+ import { type UniswapPoolKey } from "../config/uniswap.js";
6
+ /** One edge in the v4 pool routing graph. */
7
+ export type UniswapPoolEdge = {
8
+ poolKey: UniswapPoolKey;
9
+ tokenA: `0x${string}`;
10
+ tokenB: `0x${string}`;
11
+ };
12
+ /** Cached routing graph of v4 pools on Celo mainnet. */
13
+ export type UniswapPoolIndex = {
14
+ edges: UniswapPoolEdge[];
15
+ /** Currency address (lowercase) → neighbor currencies in the graph. */
16
+ adjacency: Map<string, Set<string>>;
17
+ /**
18
+ * Sorted pair key (`tokenLo|tokenHi`, lowercase) → every pool connecting that
19
+ * pair. A single token pair can have several pools across fee tiers, so the
20
+ * router must consider all of them to find the best rate.
21
+ */
22
+ poolsByPair: Map<string, UniswapPoolKey[]>;
23
+ /** Whether pools came from the v4 subgraph or on-chain hub probing. */
24
+ source: "subgraph" | "onchain";
25
+ fetchedAt: number;
26
+ };
27
+ /**
28
+ * Compute the Uniswap v4 pool id (keccak256 of sorted pool key fields).
29
+ * @param poolKey - Pool key (normalized so currency0 sorts before currency1)
30
+ */
31
+ export declare function computeUniswapPoolId(poolKey: UniswapPoolKey): `0x${string}`;
32
+ /**
33
+ * Load or refresh the v4 pool index (subgraph first, on-chain hub fallback).
34
+ * @param client - Celo public client for StateView probing
35
+ * @param options.forceRefresh - Bypass TTL cache when true
36
+ */
37
+ export declare function getUniswapPoolIndex(client: PublicClient, options?: {
38
+ forceRefresh?: boolean;
39
+ }): Promise<UniswapPoolIndex>;
40
+ /**
41
+ * All pools connecting two tokens in a cached index (one per fee tier / hooks).
42
+ * @param index - Pool graph from `getUniswapPoolIndex`
43
+ * @param tokenA - First currency address
44
+ * @param tokenB - Second currency address
45
+ */
46
+ export declare function poolsBetween(index: UniswapPoolIndex, tokenA: `0x${string}`, tokenB: `0x${string}`): UniswapPoolKey[];
47
+ /**
48
+ * Find a pool key connecting two tokens in a cached index, if present.
49
+ * @param index - Pool graph from `getUniswapPoolIndex`
50
+ * @param tokenA - First currency address
51
+ * @param tokenB - Second currency address
52
+ */
53
+ export declare function findPoolBetween(index: UniswapPoolIndex, tokenA: `0x${string}`, tokenB: `0x${string}`): UniswapPoolKey | null;
54
+ /** Reset cached index (for tests). */
55
+ export declare function resetUniswapPoolIndexCache(): void;
@@ -0,0 +1,198 @@
1
+ /**
2
+ * Uniswap v4 pool discovery: subgraph index with on-chain hub fallback.
3
+ */
4
+ import { encodeAbiParameters, keccak256, parseAbiParameters, } from "viem";
5
+ import { stateViewAbi } from "../abis/uniswap-state-view.js";
6
+ import { normalizeUniswapPoolKey, UNISWAP_DEFAULT_TICK_SPACING, UNISWAP_FEE_TIERS, UNISWAP_HUB_CURRENCIES, UNISWAP_POOL_CACHE_TTL_MS, UNISWAP_SUBGRAPH_URL, UNISWAP_V4, } from "../config/uniswap.js";
7
+ let cachedIndex = null;
8
+ /** Canonical lowercase key for the unordered pair `(a, b)`. */
9
+ function pairKey(a, b) {
10
+ const lo = a.toLowerCase();
11
+ const hi = b.toLowerCase();
12
+ return lo < hi ? `${lo}|${hi}` : `${hi}|${lo}`;
13
+ }
14
+ /**
15
+ * Compute the Uniswap v4 pool id (keccak256 of sorted pool key fields).
16
+ * @param poolKey - Pool key (normalized so currency0 sorts before currency1)
17
+ */
18
+ export function computeUniswapPoolId(poolKey) {
19
+ const normalized = normalizeUniswapPoolKey(poolKey);
20
+ return keccak256(encodeAbiParameters(parseAbiParameters("address currency0, address currency1, uint24 fee, int24 tickSpacing, address hooks"), [
21
+ normalized.currency0,
22
+ normalized.currency1,
23
+ normalized.fee,
24
+ normalized.tickSpacing,
25
+ normalized.hooks,
26
+ ]));
27
+ }
28
+ /**
29
+ * Build a routing index from raw pool keys: dedup by pool id, then derive the
30
+ * edge list, currency adjacency, and per-pair pool buckets.
31
+ */
32
+ function buildPoolIndex(poolKeys, source) {
33
+ const edges = [];
34
+ const adjacency = new Map();
35
+ const poolsByPair = new Map();
36
+ const seen = new Set();
37
+ for (const key of poolKeys) {
38
+ const normalized = normalizeUniswapPoolKey(key);
39
+ const id = computeUniswapPoolId(normalized);
40
+ if (seen.has(id)) {
41
+ continue;
42
+ }
43
+ seen.add(id);
44
+ const a = normalized.currency0.toLowerCase();
45
+ const b = normalized.currency1.toLowerCase();
46
+ edges.push({
47
+ poolKey: normalized,
48
+ tokenA: normalized.currency0,
49
+ tokenB: normalized.currency1,
50
+ });
51
+ if (!adjacency.has(a))
52
+ adjacency.set(a, new Set());
53
+ if (!adjacency.has(b))
54
+ adjacency.set(b, new Set());
55
+ adjacency.get(a).add(b);
56
+ adjacency.get(b).add(a);
57
+ const pk = pairKey(a, b);
58
+ const bucket = poolsByPair.get(pk);
59
+ if (bucket) {
60
+ bucket.push(normalized);
61
+ }
62
+ else {
63
+ poolsByPair.set(pk, [normalized]);
64
+ }
65
+ }
66
+ return { edges, adjacency, poolsByPair, source, fetchedAt: Date.now() };
67
+ }
68
+ async function fetchSubgraphPools() {
69
+ try {
70
+ const response = await fetch(UNISWAP_SUBGRAPH_URL, {
71
+ method: "POST",
72
+ headers: { "Content-Type": "application/json" },
73
+ body: JSON.stringify({
74
+ query: `{
75
+ pools(first: 500, orderBy: totalValueLockedUSD, orderDirection: desc) {
76
+ feeTier
77
+ tickSpacing
78
+ hooks
79
+ token0 { id }
80
+ token1 { id }
81
+ }
82
+ }`,
83
+ }),
84
+ });
85
+ if (!response.ok) {
86
+ return null;
87
+ }
88
+ const json = (await response.json());
89
+ const pools = json.data?.pools;
90
+ if (!pools?.length) {
91
+ return null;
92
+ }
93
+ return pools.map((pool) => ({
94
+ currency0: pool.token0.id,
95
+ currency1: pool.token1.id,
96
+ fee: Number(pool.feeTier),
97
+ tickSpacing: Number(pool.tickSpacing),
98
+ hooks: (pool.hooks || UNISWAP_V4.zeroHooks),
99
+ }));
100
+ }
101
+ catch {
102
+ return null;
103
+ }
104
+ }
105
+ async function probePoolOnChain(client, currencyA, currencyB, fee, tickSpacing) {
106
+ const poolKey = normalizeUniswapPoolKey({
107
+ currency0: currencyA,
108
+ currency1: currencyB,
109
+ fee,
110
+ tickSpacing,
111
+ hooks: UNISWAP_V4.zeroHooks,
112
+ });
113
+ const poolId = computeUniswapPoolId(poolKey);
114
+ try {
115
+ const [slot0, liquidity] = await Promise.all([
116
+ client.readContract({
117
+ address: UNISWAP_V4.stateView,
118
+ abi: stateViewAbi,
119
+ functionName: "getSlot0",
120
+ args: [poolId],
121
+ }),
122
+ client.readContract({
123
+ address: UNISWAP_V4.stateView,
124
+ abi: stateViewAbi,
125
+ functionName: "getLiquidity",
126
+ args: [poolId],
127
+ }),
128
+ ]);
129
+ if (slot0[0] > 0n && liquidity > 0n) {
130
+ return poolKey;
131
+ }
132
+ }
133
+ catch {
134
+ // pool not initialized
135
+ }
136
+ return null;
137
+ }
138
+ async function buildOnChainIndex(client) {
139
+ const hubs = [...UNISWAP_HUB_CURRENCIES];
140
+ const probes = [];
141
+ for (let i = 0; i < hubs.length; i++) {
142
+ for (let j = i + 1; j < hubs.length; j++) {
143
+ const [currency0, currency1] = hubs[i].toLowerCase() < hubs[j].toLowerCase()
144
+ ? [hubs[i], hubs[j]]
145
+ : [hubs[j], hubs[i]];
146
+ for (const fee of UNISWAP_FEE_TIERS) {
147
+ const tickSpacing = UNISWAP_DEFAULT_TICK_SPACING[fee] ??
148
+ UNISWAP_DEFAULT_TICK_SPACING[3000];
149
+ probes.push(probePoolOnChain(client, currency0, currency1, fee, tickSpacing));
150
+ }
151
+ }
152
+ }
153
+ const poolKeys = (await Promise.all(probes)).filter((poolKey) => poolKey !== null);
154
+ return buildPoolIndex(poolKeys, "onchain");
155
+ }
156
+ /**
157
+ * Load or refresh the v4 pool index (subgraph first, on-chain hub fallback).
158
+ * @param client - Celo public client for StateView probing
159
+ * @param options.forceRefresh - Bypass TTL cache when true
160
+ */
161
+ export async function getUniswapPoolIndex(client, options) {
162
+ const now = Date.now();
163
+ if (!options?.forceRefresh &&
164
+ cachedIndex &&
165
+ now - cachedIndex.fetchedAt < UNISWAP_POOL_CACHE_TTL_MS) {
166
+ return cachedIndex;
167
+ }
168
+ const subgraphPools = await fetchSubgraphPools();
169
+ if (subgraphPools?.length) {
170
+ cachedIndex = buildPoolIndex(subgraphPools, "subgraph");
171
+ return cachedIndex;
172
+ }
173
+ cachedIndex = await buildOnChainIndex(client);
174
+ return cachedIndex;
175
+ }
176
+ /**
177
+ * All pools connecting two tokens in a cached index (one per fee tier / hooks).
178
+ * @param index - Pool graph from `getUniswapPoolIndex`
179
+ * @param tokenA - First currency address
180
+ * @param tokenB - Second currency address
181
+ */
182
+ export function poolsBetween(index, tokenA, tokenB) {
183
+ return index.poolsByPair.get(pairKey(tokenA, tokenB)) ?? [];
184
+ }
185
+ /**
186
+ * Find a pool key connecting two tokens in a cached index, if present.
187
+ * @param index - Pool graph from `getUniswapPoolIndex`
188
+ * @param tokenA - First currency address
189
+ * @param tokenB - Second currency address
190
+ */
191
+ export function findPoolBetween(index, tokenA, tokenB) {
192
+ return poolsBetween(index, tokenA, tokenB)[0] ?? null;
193
+ }
194
+ /** Reset cached index (for tests). */
195
+ export function resetUniswapPoolIndexCache() {
196
+ cachedIndex = null;
197
+ }
198
+ //# sourceMappingURL=uniswap-pool-discovery.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"uniswap-pool-discovery.js","sourceRoot":"","sources":["../../../src/services/uniswap-pool-discovery.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,82 @@
1
+ import type { CeloClientFactory } from "../clients/celo-client.js";
2
+ import { type SerializedPreparedFlow } from "../types/prepared.js";
3
+ /** Optional parameters for Uniswap v4 swap estimates and prepares. */
4
+ export interface UniswapSwapParams {
5
+ /** Max slippage tolerance in percent (default `0.5`). */
6
+ slippageTolerance?: number;
7
+ /** Swap deadline in minutes from now (default `5`). */
8
+ deadlineMinutes?: number;
9
+ /** Address receiving output tokens (default: `from`). */
10
+ recipient?: `0x${string}`;
11
+ }
12
+ /** Uniswap v4 quotes, gas estimates, and `prepareSwap` flows on Celo mainnet. */
13
+ export declare class UniswapService {
14
+ private readonly clientFactory;
15
+ private readonly tokenService;
16
+ constructor(clientFactory: CeloClientFactory);
17
+ private resolvePair;
18
+ private baseQuoteFields;
19
+ private buildSwapRoute;
20
+ private buildUniversalRouterCalldata;
21
+ private getApprovalSteps;
22
+ private estimateCallGas;
23
+ private estimateSwapGasWithAllowance;
24
+ /**
25
+ * Expected Uniswap v4 output for a token pair — no wallet required.
26
+ * @param tokenIn - Input token symbol or address
27
+ * @param tokenOut - Output token symbol or address
28
+ * @param amount - Human-readable input amount
29
+ * @param _from - Deprecated; ignored. Balance checks run on prepare/estimate only.
30
+ */
31
+ getSwapQuote(tokenIn: string, tokenOut: string, amount: string, _from?: `0x${string}`): Promise<{
32
+ route: {
33
+ pools: import("../config/uniswap.js").UniswapPoolKey[];
34
+ };
35
+ protocol: "uniswap_v4";
36
+ network: "mainnet";
37
+ tokenIn: string;
38
+ tokenOut: string;
39
+ amountIn: string;
40
+ expectedOut: string;
41
+ routeHops: number;
42
+ indexSource: string | undefined;
43
+ }>;
44
+ /**
45
+ * Simulate gas for a Uniswap v4 swap from `from`, including Permit2 approvals when needed.
46
+ * @param from - Sender wallet address
47
+ * @param tokenIn - Input token symbol or address
48
+ * @param tokenOut - Output token symbol or address
49
+ * @param amount - Human-readable input amount
50
+ * @param params - Optional slippage, deadline, and recipient
51
+ */
52
+ estimateSwap(from: `0x${string}`, tokenIn: string, tokenOut: string, amount: string, params?: UniswapSwapParams): Promise<{
53
+ from: `0x${string}`;
54
+ recipient: `0x${string}`;
55
+ amountOutMin: string;
56
+ approvalStepsNeeded: number;
57
+ approvalGas: string[];
58
+ swapGas: string | undefined;
59
+ swapGasEstimated: boolean;
60
+ slippageTolerance: number;
61
+ deadline: string;
62
+ deadlineMinutes: number;
63
+ protocol: "uniswap_v4";
64
+ network: "mainnet";
65
+ tokenIn: string;
66
+ tokenOut: string;
67
+ amountIn: string;
68
+ expectedOut: string;
69
+ routeHops: number;
70
+ indexSource: string | undefined;
71
+ }>;
72
+ /**
73
+ * Build unsigned Uniswap v4 steps (ERC-20 approve → Permit2 approve → swap when needed).
74
+ * @param from - Sender wallet address
75
+ * @param tokenIn - Input token symbol or address
76
+ * @param tokenOut - Output token symbol or address
77
+ * @param amount - Human-readable input amount
78
+ * @param params - Optional slippage, deadline, and recipient
79
+ * @returns 1–3 step `SerializedPreparedFlow` for sequential wallet signing
80
+ */
81
+ prepareSwap(from: `0x${string}`, tokenIn: string, tokenOut: string, amount: string, params?: UniswapSwapParams): Promise<SerializedPreparedFlow>;
82
+ }