@steerprotocol/sdk 1.30.4 → 1.30.6

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 (355) hide show
  1. package/dist/cjs/const/amm/configs/ammConfig.js +33 -34
  2. package/dist/cjs/const/amm/configs/ammConfig.js.map +1 -1
  3. package/dist/cjs/const/amm/configs/protocols/index.js +0 -39
  4. package/dist/cjs/const/amm/configs/protocols/index.js.map +1 -1
  5. package/dist/cjs/const/stabilityVaults/index.js +1 -1
  6. package/dist/cjs/const/stabilityVaults/index.js.map +1 -1
  7. package/dist/esm/base/FeeManagerClient.js +26 -22
  8. package/dist/esm/base/FeeManagerClient.js.map +1 -1
  9. package/dist/esm/base/PoolClient.js +19 -15
  10. package/dist/esm/base/PoolClient.js.map +1 -1
  11. package/dist/esm/base/SmartRewardClient.js +10 -6
  12. package/dist/esm/base/SmartRewardClient.js.map +1 -1
  13. package/dist/esm/base/SmartRewards.js +11 -7
  14. package/dist/esm/base/SmartRewards.js.map +1 -1
  15. package/dist/esm/base/StakingClient.js +18 -14
  16. package/dist/esm/base/StakingClient.js.map +1 -1
  17. package/dist/esm/base/SubgraphClient.js +8 -4
  18. package/dist/esm/base/SubgraphClient.js.map +1 -1
  19. package/dist/esm/base/VaultClient.js +55 -37
  20. package/dist/esm/base/VaultClient.js.map +1 -1
  21. package/dist/esm/base/vault/deposit/index.js +42 -38
  22. package/dist/esm/base/vault/deposit/index.js.map +1 -1
  23. package/dist/esm/base/vault/deposit/types.js +2 -1
  24. package/dist/esm/base/vault/single-asset/calculateLimitPrice.js +39 -32
  25. package/dist/esm/base/vault/single-asset/calculateLimitPrice.js.map +1 -1
  26. package/dist/esm/base/vault/single-asset/calculateSwapAmount.js +8 -5
  27. package/dist/esm/base/vault/single-asset/calculateSwapAmount.js.map +1 -1
  28. package/dist/esm/base/vault/single-asset/estimateLpTokens.js +12 -7
  29. package/dist/esm/base/vault/single-asset/estimateLpTokens.js.map +1 -1
  30. package/dist/esm/base/vault/single-asset/index.js +32 -6
  31. package/dist/esm/base/vault/single-asset/index.js.map +1 -1
  32. package/dist/esm/base/vault/single-asset/simulateSwap.js +30 -24
  33. package/dist/esm/base/vault/single-asset/simulateSwap.js.map +1 -1
  34. package/dist/esm/base/vault/single-asset/singleAssetDeposit.js +33 -29
  35. package/dist/esm/base/vault/single-asset/singleAssetDeposit.js.map +1 -1
  36. package/dist/esm/base/vault/single-asset/types.js +5 -2
  37. package/dist/esm/base/vault/single-asset/types.js.map +1 -1
  38. package/dist/esm/base/vault/utils.js +16 -7
  39. package/dist/esm/base/vault/utils.js.map +1 -1
  40. package/dist/esm/base/vault/withdraw/index.js +10 -6
  41. package/dist/esm/base/vault/withdraw/index.js.map +1 -1
  42. package/dist/esm/base/vault/withdraw/types.js +2 -1
  43. package/dist/esm/client.js +15 -11
  44. package/dist/esm/client.js.map +1 -1
  45. package/dist/esm/const/abis/UniswapPool.js +4 -1
  46. package/dist/esm/const/abis/UniswapPool.js.map +1 -1
  47. package/dist/esm/const/abis/erc1155.js +4 -1
  48. package/dist/esm/const/abis/erc1155.js.map +1 -1
  49. package/dist/esm/const/abis/erc20.js +4 -1
  50. package/dist/esm/const/abis/erc20.js.map +1 -1
  51. package/dist/esm/const/abis/erc721.js +4 -1
  52. package/dist/esm/const/abis/erc721.js.map +1 -1
  53. package/dist/esm/const/abis/feeManager.js +4 -1
  54. package/dist/esm/const/abis/feeManager.js.map +1 -1
  55. package/dist/esm/const/abis/index.js +24 -8
  56. package/dist/esm/const/abis/index.js.map +1 -1
  57. package/dist/esm/const/abis/quoter.js +9 -6
  58. package/dist/esm/const/abis/quoter.js.map +1 -1
  59. package/dist/esm/const/abis/singleTokenDeposit.js +4 -1
  60. package/dist/esm/const/abis/singleTokenDeposit.js.map +1 -1
  61. package/dist/esm/const/abis/vaultFees.js +4 -1
  62. package/dist/esm/const/abis/vaultFees.js.map +1 -1
  63. package/dist/esm/const/amm/configs/ammConfig.js +98 -95
  64. package/dist/esm/const/amm/configs/ammConfig.js.map +1 -1
  65. package/dist/esm/const/amm/configs/protocols/aerodrome-v2.js +12 -8
  66. package/dist/esm/const/amm/configs/protocols/aerodrome-v2.js.map +1 -1
  67. package/dist/esm/const/amm/configs/protocols/aerodrome.js +12 -8
  68. package/dist/esm/const/amm/configs/protocols/aerodrome.js.map +1 -1
  69. package/dist/esm/const/amm/configs/protocols/arthswap.js +14 -10
  70. package/dist/esm/const/amm/configs/protocols/arthswap.js.map +1 -1
  71. package/dist/esm/const/amm/configs/protocols/baseswap.js +11 -7
  72. package/dist/esm/const/amm/configs/protocols/baseswap.js.map +1 -1
  73. package/dist/esm/const/amm/configs/protocols/basex.js +12 -8
  74. package/dist/esm/const/amm/configs/protocols/basex.js.map +1 -1
  75. package/dist/esm/const/amm/configs/protocols/beam.js +11 -7
  76. package/dist/esm/const/amm/configs/protocols/beam.js.map +1 -1
  77. package/dist/esm/const/amm/configs/protocols/beamswap.js +11 -7
  78. package/dist/esm/const/amm/configs/protocols/beamswap.js.map +1 -1
  79. package/dist/esm/const/amm/configs/protocols/blackhole.js +12 -8
  80. package/dist/esm/const/amm/configs/protocols/blackhole.js.map +1 -1
  81. package/dist/esm/const/amm/configs/protocols/camelot.js +17 -13
  82. package/dist/esm/const/amm/configs/protocols/camelot.js.map +1 -1
  83. package/dist/esm/const/amm/configs/protocols/crust.js +11 -7
  84. package/dist/esm/const/amm/configs/protocols/crust.js.map +1 -1
  85. package/dist/esm/const/amm/configs/protocols/cypher.js +13 -9
  86. package/dist/esm/const/amm/configs/protocols/cypher.js.map +1 -1
  87. package/dist/esm/const/amm/configs/protocols/dodo.js +11 -7
  88. package/dist/esm/const/amm/configs/protocols/dodo.js.map +1 -1
  89. package/dist/esm/const/amm/configs/protocols/dragonswap.js +11 -7
  90. package/dist/esm/const/amm/configs/protocols/dragonswap.js.map +1 -1
  91. package/dist/esm/const/amm/configs/protocols/eddy.js +11 -7
  92. package/dist/esm/const/amm/configs/protocols/eddy.js.map +1 -1
  93. package/dist/esm/const/amm/configs/protocols/equilibre.js +11 -7
  94. package/dist/esm/const/amm/configs/protocols/equilibre.js.map +1 -1
  95. package/dist/esm/const/amm/configs/protocols/fenix.js +11 -7
  96. package/dist/esm/const/amm/configs/protocols/fenix.js.map +1 -1
  97. package/dist/esm/const/amm/configs/protocols/forge.js +13 -9
  98. package/dist/esm/const/amm/configs/protocols/forge.js.map +1 -1
  99. package/dist/esm/const/amm/configs/protocols/fusionx.js +12 -8
  100. package/dist/esm/const/amm/configs/protocols/fusionx.js.map +1 -1
  101. package/dist/esm/const/amm/configs/protocols/glyph.js +13 -9
  102. package/dist/esm/const/amm/configs/protocols/glyph.js.map +1 -1
  103. package/dist/esm/const/amm/configs/protocols/henjin.js +11 -7
  104. package/dist/esm/const/amm/configs/protocols/henjin.js.map +1 -1
  105. package/dist/esm/const/amm/configs/protocols/hercules.js +11 -7
  106. package/dist/esm/const/amm/configs/protocols/hercules.js.map +1 -1
  107. package/dist/esm/const/amm/configs/protocols/horiza.js +13 -9
  108. package/dist/esm/const/amm/configs/protocols/horiza.js.map +1 -1
  109. package/dist/esm/const/amm/configs/protocols/index.js +56 -79
  110. package/dist/esm/const/amm/configs/protocols/index.js.map +1 -1
  111. package/dist/esm/const/amm/configs/protocols/katana.js +10 -6
  112. package/dist/esm/const/amm/configs/protocols/katana.js.map +1 -1
  113. package/dist/esm/const/amm/configs/protocols/katanaIntegral.js +10 -6
  114. package/dist/esm/const/amm/configs/protocols/katanaIntegral.js.map +1 -1
  115. package/dist/esm/const/amm/configs/protocols/kim.js +15 -11
  116. package/dist/esm/const/amm/configs/protocols/kim.js.map +1 -1
  117. package/dist/esm/const/amm/configs/protocols/kinetix.js +14 -10
  118. package/dist/esm/const/amm/configs/protocols/kinetix.js.map +1 -1
  119. package/dist/esm/const/amm/configs/protocols/kodiak.js +14 -10
  120. package/dist/esm/const/amm/configs/protocols/kodiak.js.map +1 -1
  121. package/dist/esm/const/amm/configs/protocols/kyo.js +12 -8
  122. package/dist/esm/const/amm/configs/protocols/kyo.js.map +1 -1
  123. package/dist/esm/const/amm/configs/protocols/linehub.js +11 -7
  124. package/dist/esm/const/amm/configs/protocols/linehub.js.map +1 -1
  125. package/dist/esm/const/amm/configs/protocols/lynex.js +13 -9
  126. package/dist/esm/const/amm/configs/protocols/lynex.js.map +1 -1
  127. package/dist/esm/const/amm/configs/protocols/machinex.js +13 -9
  128. package/dist/esm/const/amm/configs/protocols/machinex.js.map +1 -1
  129. package/dist/esm/const/amm/configs/protocols/maia.js +13 -9
  130. package/dist/esm/const/amm/configs/protocols/maia.js.map +1 -1
  131. package/dist/esm/const/amm/configs/protocols/metavault.js +16 -12
  132. package/dist/esm/const/amm/configs/protocols/metavault.js.map +1 -1
  133. package/dist/esm/const/amm/configs/protocols/nest.js +12 -8
  134. package/dist/esm/const/amm/configs/protocols/nest.js.map +1 -1
  135. package/dist/esm/const/amm/configs/protocols/novaswap.js +11 -7
  136. package/dist/esm/const/amm/configs/protocols/novaswap.js.map +1 -1
  137. package/dist/esm/const/amm/configs/protocols/ocelex.js +11 -7
  138. package/dist/esm/const/amm/configs/protocols/ocelex.js.map +1 -1
  139. package/dist/esm/const/amm/configs/protocols/pancakeswap.js +17 -13
  140. package/dist/esm/const/amm/configs/protocols/pancakeswap.js.map +1 -1
  141. package/dist/esm/const/amm/configs/protocols/poolshark.js +11 -7
  142. package/dist/esm/const/amm/configs/protocols/poolshark.js.map +1 -1
  143. package/dist/esm/const/amm/configs/protocols/quickswap-algebra.js +12 -8
  144. package/dist/esm/const/amm/configs/protocols/quickswap-algebra.js.map +1 -1
  145. package/dist/esm/const/amm/configs/protocols/quickswap-integral.js +17 -13
  146. package/dist/esm/const/amm/configs/protocols/quickswap-integral.js.map +1 -1
  147. package/dist/esm/const/amm/configs/protocols/quickswap-univ3.js +20 -16
  148. package/dist/esm/const/amm/configs/protocols/quickswap-univ3.js.map +1 -1
  149. package/dist/esm/const/amm/configs/protocols/quickswap.js +18 -14
  150. package/dist/esm/const/amm/configs/protocols/quickswap.js.map +1 -1
  151. package/dist/esm/const/amm/configs/protocols/retro.js +13 -9
  152. package/dist/esm/const/amm/configs/protocols/retro.js.map +1 -1
  153. package/dist/esm/const/amm/configs/protocols/sailor.js +11 -7
  154. package/dist/esm/const/amm/configs/protocols/sailor.js.map +1 -1
  155. package/dist/esm/const/amm/configs/protocols/shadow.js +13 -9
  156. package/dist/esm/const/amm/configs/protocols/shadow.js.map +1 -1
  157. package/dist/esm/const/amm/configs/protocols/silverswap.js +15 -11
  158. package/dist/esm/const/amm/configs/protocols/silverswap.js.map +1 -1
  159. package/dist/esm/const/amm/configs/protocols/spark-integral.js +12 -8
  160. package/dist/esm/const/amm/configs/protocols/spark-integral.js.map +1 -1
  161. package/dist/esm/const/amm/configs/protocols/spark.js +11 -7
  162. package/dist/esm/const/amm/configs/protocols/spark.js.map +1 -1
  163. package/dist/esm/const/amm/configs/protocols/spark32.js +11 -7
  164. package/dist/esm/const/amm/configs/protocols/spark32.js.map +1 -1
  165. package/dist/esm/const/amm/configs/protocols/spookyswap.js +11 -7
  166. package/dist/esm/const/amm/configs/protocols/spookyswap.js.map +1 -1
  167. package/dist/esm/const/amm/configs/protocols/stellaswap.js +13 -9
  168. package/dist/esm/const/amm/configs/protocols/stellaswap.js.map +1 -1
  169. package/dist/esm/const/amm/configs/protocols/supswap.js +11 -7
  170. package/dist/esm/const/amm/configs/protocols/supswap.js.map +1 -1
  171. package/dist/esm/const/amm/configs/protocols/sushi.js +73 -69
  172. package/dist/esm/const/amm/configs/protocols/sushi.js.map +1 -1
  173. package/dist/esm/const/amm/configs/protocols/swapmode.js +11 -7
  174. package/dist/esm/const/amm/configs/protocols/swapmode.js.map +1 -1
  175. package/dist/esm/const/amm/configs/protocols/swapsicle.js +11 -7
  176. package/dist/esm/const/amm/configs/protocols/swapsicle.js.map +1 -1
  177. package/dist/esm/const/amm/configs/protocols/thena.js +13 -9
  178. package/dist/esm/const/amm/configs/protocols/thena.js.map +1 -1
  179. package/dist/esm/const/amm/configs/protocols/thick.js +12 -8
  180. package/dist/esm/const/amm/configs/protocols/thick.js.map +1 -1
  181. package/dist/esm/const/amm/configs/protocols/thickv2.js +12 -8
  182. package/dist/esm/const/amm/configs/protocols/thickv2.js.map +1 -1
  183. package/dist/esm/const/amm/configs/protocols/thruster.js +12 -8
  184. package/dist/esm/const/amm/configs/protocols/thruster.js.map +1 -1
  185. package/dist/esm/const/amm/configs/protocols/uniswap.js +83 -79
  186. package/dist/esm/const/amm/configs/protocols/uniswap.js.map +1 -1
  187. package/dist/esm/const/amm/configs/protocols/wasabee.js +11 -7
  188. package/dist/esm/const/amm/configs/protocols/wasabee.js.map +1 -1
  189. package/dist/esm/const/amm/index.js +19 -3
  190. package/dist/esm/const/amm/index.js.map +1 -1
  191. package/dist/esm/const/amm/utils/beacon.js +76 -70
  192. package/dist/esm/const/amm/utils/beacon.js.map +1 -1
  193. package/dist/esm/const/amm/utils/contracts.js +26 -16
  194. package/dist/esm/const/amm/utils/contracts.js.map +1 -1
  195. package/dist/esm/const/amm/utils/index.js +46 -22
  196. package/dist/esm/const/amm/utils/index.js.map +1 -1
  197. package/dist/esm/const/amm/utils/protocol.js +24 -16
  198. package/dist/esm/const/amm/utils/protocol.js.map +1 -1
  199. package/dist/esm/const/api.js +7 -3
  200. package/dist/esm/const/api.js.map +1 -1
  201. package/dist/esm/const/capabilities.js +20 -15
  202. package/dist/esm/const/capabilities.js.map +1 -1
  203. package/dist/esm/const/chain.js +12 -9
  204. package/dist/esm/const/chain.js.map +1 -1
  205. package/dist/esm/const/deployments/abis.js +4 -1
  206. package/dist/esm/const/deployments/abis.js.map +1 -1
  207. package/dist/esm/const/deployments/apechain.js +4 -1
  208. package/dist/esm/const/deployments/apechain.js.map +1 -1
  209. package/dist/esm/const/deployments/arbitrum.js +4 -1
  210. package/dist/esm/const/deployments/arbitrum.js.map +1 -1
  211. package/dist/esm/const/deployments/arbitrumgoerli.js +4 -1
  212. package/dist/esm/const/deployments/arbitrumgoerli.js.map +1 -1
  213. package/dist/esm/const/deployments/astar.js +4 -1
  214. package/dist/esm/const/deployments/astar.js.map +1 -1
  215. package/dist/esm/const/deployments/astarzkevm.js +4 -1
  216. package/dist/esm/const/deployments/astarzkevm.js.map +1 -1
  217. package/dist/esm/const/deployments/avalanche.js +4 -1
  218. package/dist/esm/const/deployments/avalanche.js.map +1 -1
  219. package/dist/esm/const/deployments/bartiotest.js +4 -1
  220. package/dist/esm/const/deployments/bartiotest.js.map +1 -1
  221. package/dist/esm/const/deployments/base.js +4 -1
  222. package/dist/esm/const/deployments/base.js.map +1 -1
  223. package/dist/esm/const/deployments/bera.js +4 -1
  224. package/dist/esm/const/deployments/bera.js.map +1 -1
  225. package/dist/esm/const/deployments/berachainbartio.js +4 -1
  226. package/dist/esm/const/deployments/berachainbartio.js.map +1 -1
  227. package/dist/esm/const/deployments/blast.js +4 -1
  228. package/dist/esm/const/deployments/blast.js.map +1 -1
  229. package/dist/esm/const/deployments/bsc.js +4 -1
  230. package/dist/esm/const/deployments/bsc.js.map +1 -1
  231. package/dist/esm/const/deployments/celo.js +4 -1
  232. package/dist/esm/const/deployments/celo.js.map +1 -1
  233. package/dist/esm/const/deployments/core.js +4 -1
  234. package/dist/esm/const/deployments/core.js.map +1 -1
  235. package/dist/esm/const/deployments/eth.js +4 -1
  236. package/dist/esm/const/deployments/eth.js.map +1 -1
  237. package/dist/esm/const/deployments/evmos.js +4 -1
  238. package/dist/esm/const/deployments/evmos.js.map +1 -1
  239. package/dist/esm/const/deployments/fantom.js +4 -1
  240. package/dist/esm/const/deployments/fantom.js.map +1 -1
  241. package/dist/esm/const/deployments/filecoin.js +4 -1
  242. package/dist/esm/const/deployments/filecoin.js.map +1 -1
  243. package/dist/esm/const/deployments/flare.js +4 -1
  244. package/dist/esm/const/deployments/flare.js.map +1 -1
  245. package/dist/esm/const/deployments/goerli.js +4 -1
  246. package/dist/esm/const/deployments/goerli.js.map +1 -1
  247. package/dist/esm/const/deployments/hemi.js +4 -1
  248. package/dist/esm/const/deployments/hemi.js.map +1 -1
  249. package/dist/esm/const/deployments/hyperevm.js +4 -1
  250. package/dist/esm/const/deployments/hyperevm.js.map +1 -1
  251. package/dist/esm/const/deployments/index.js +99 -48
  252. package/dist/esm/const/deployments/index.js.map +1 -1
  253. package/dist/esm/const/deployments/katana.js +4 -1
  254. package/dist/esm/const/deployments/katana.js.map +1 -1
  255. package/dist/esm/const/deployments/kava.js +4 -1
  256. package/dist/esm/const/deployments/kava.js.map +1 -1
  257. package/dist/esm/const/deployments/linea.js +4 -1
  258. package/dist/esm/const/deployments/linea.js.map +1 -1
  259. package/dist/esm/const/deployments/localhost.js +4 -1
  260. package/dist/esm/const/deployments/localhost.js.map +1 -1
  261. package/dist/esm/const/deployments/manta.js +4 -1
  262. package/dist/esm/const/deployments/manta.js.map +1 -1
  263. package/dist/esm/const/deployments/mantle.js +4 -1
  264. package/dist/esm/const/deployments/mantle.js.map +1 -1
  265. package/dist/esm/const/deployments/metis.js +4 -1
  266. package/dist/esm/const/deployments/metis.js.map +1 -1
  267. package/dist/esm/const/deployments/mode.js +4 -1
  268. package/dist/esm/const/deployments/mode.js.map +1 -1
  269. package/dist/esm/const/deployments/moonbeam.js +4 -1
  270. package/dist/esm/const/deployments/moonbeam.js.map +1 -1
  271. package/dist/esm/const/deployments/mumbai.js +4 -1
  272. package/dist/esm/const/deployments/mumbai.js.map +1 -1
  273. package/dist/esm/const/deployments/nibiru.js +4 -1
  274. package/dist/esm/const/deployments/nibiru.js.map +1 -1
  275. package/dist/esm/const/deployments/okxtestnet.js +4 -1
  276. package/dist/esm/const/deployments/okxtestnet.js.map +1 -1
  277. package/dist/esm/const/deployments/optimism.js +4 -1
  278. package/dist/esm/const/deployments/optimism.js.map +1 -1
  279. package/dist/esm/const/deployments/optimismgoerli.js +4 -1
  280. package/dist/esm/const/deployments/optimismgoerli.js.map +1 -1
  281. package/dist/esm/const/deployments/peaq.js +4 -1
  282. package/dist/esm/const/deployments/peaq.js.map +1 -1
  283. package/dist/esm/const/deployments/polygon.js +4 -1
  284. package/dist/esm/const/deployments/polygon.js.map +1 -1
  285. package/dist/esm/const/deployments/polyzkevm.js +4 -1
  286. package/dist/esm/const/deployments/polyzkevm.js.map +1 -1
  287. package/dist/esm/const/deployments/pyzkevm.js +4 -1
  288. package/dist/esm/const/deployments/pyzkevm.js.map +1 -1
  289. package/dist/esm/const/deployments/ronin.js +4 -1
  290. package/dist/esm/const/deployments/ronin.js.map +1 -1
  291. package/dist/esm/const/deployments/rootstock.js +4 -1
  292. package/dist/esm/const/deployments/rootstock.js.map +1 -1
  293. package/dist/esm/const/deployments/saga.js +4 -1
  294. package/dist/esm/const/deployments/saga.js.map +1 -1
  295. package/dist/esm/const/deployments/scroll.js +4 -1
  296. package/dist/esm/const/deployments/scroll.js.map +1 -1
  297. package/dist/esm/const/deployments/sei.js +4 -1
  298. package/dist/esm/const/deployments/sei.js.map +1 -1
  299. package/dist/esm/const/deployments/soneium.js +4 -1
  300. package/dist/esm/const/deployments/soneium.js.map +1 -1
  301. package/dist/esm/const/deployments/sonic.js +4 -1
  302. package/dist/esm/const/deployments/sonic.js.map +1 -1
  303. package/dist/esm/const/deployments/taiko.js +4 -1
  304. package/dist/esm/const/deployments/taiko.js.map +1 -1
  305. package/dist/esm/const/deployments/tataratestnet.js +4 -1
  306. package/dist/esm/const/deployments/tataratestnet.js.map +1 -1
  307. package/dist/esm/const/deployments/telos.js +4 -1
  308. package/dist/esm/const/deployments/telos.js.map +1 -1
  309. package/dist/esm/const/deployments/thundercore.js +4 -1
  310. package/dist/esm/const/deployments/thundercore.js.map +1 -1
  311. package/dist/esm/const/deployments/uni.js +4 -1
  312. package/dist/esm/const/deployments/uni.js.map +1 -1
  313. package/dist/esm/const/deployments/xlayer.js +4 -1
  314. package/dist/esm/const/deployments/xlayer.js.map +1 -1
  315. package/dist/esm/const/deployments/zeta.js +4 -1
  316. package/dist/esm/const/deployments/zeta.js.map +1 -1
  317. package/dist/esm/const/deployments/zircuit.js +4 -1
  318. package/dist/esm/const/deployments/zircuit.js.map +1 -1
  319. package/dist/esm/const/deployments/zklinknova.js +4 -1
  320. package/dist/esm/const/deployments/zklinknova.js.map +1 -1
  321. package/dist/esm/const/index.js +28 -12
  322. package/dist/esm/const/index.js.map +1 -1
  323. package/dist/esm/const/network.js +232 -223
  324. package/dist/esm/const/network.js.map +1 -1
  325. package/dist/esm/const/protocol.js +97 -83
  326. package/dist/esm/const/protocol.js.map +1 -1
  327. package/dist/esm/const/quoter.js +53 -42
  328. package/dist/esm/const/quoter.js.map +1 -1
  329. package/dist/esm/const/stabilityVaults/index.js +17 -1
  330. package/dist/esm/const/stabilityVaults/index.js.map +1 -1
  331. package/dist/esm/const/stabilityVaults/stabilityVaultsConfig.js +15 -10
  332. package/dist/esm/const/stabilityVaults/stabilityVaultsConfig.js.map +1 -1
  333. package/dist/esm/const/subgraph.js +60 -56
  334. package/dist/esm/const/subgraph.js.map +1 -1
  335. package/dist/esm/const/thegraph.js +5 -1
  336. package/dist/esm/const/thegraph.js.map +1 -1
  337. package/dist/esm/index.js +31 -12
  338. package/dist/esm/index.js.map +1 -1
  339. package/dist/esm/scripts/processDeployments.js +15 -10
  340. package/dist/esm/scripts/processDeployments.js.map +1 -1
  341. package/dist/esm/types.js +2 -1
  342. package/dist/esm/utils/PoolQueryAdapter.js +44 -38
  343. package/dist/esm/utils/PoolQueryAdapter.js.map +1 -1
  344. package/dist/esm/utils/SubgraphVaultClient.js +10 -6
  345. package/dist/esm/utils/SubgraphVaultClient.js.map +1 -1
  346. package/dist/esm/utils/subgraph-types.js +2 -1
  347. package/dist/types/const/amm/configs/ammConfig.d.ts.map +1 -1
  348. package/dist/types/const/amm/configs/protocols/index.d.ts +0 -39
  349. package/dist/types/const/amm/configs/protocols/index.d.ts.map +1 -1
  350. package/dist/types/const/stabilityVaults/index.d.ts +1 -1
  351. package/dist/types/const/stabilityVaults/index.d.ts.map +1 -1
  352. package/package.json +2 -2
  353. package/src/const/amm/configs/ammConfig.ts +2 -3
  354. package/src/const/amm/configs/protocols/index.ts +1 -40
  355. package/src/const/stabilityVaults/index.ts +1 -1
@@ -1,5 +1,8 @@
1
- import { singleTokenDepositAbi } from '../../../const/abis/singleTokenDeposit.js';
2
- import { getContractAddressByChainIdAndContractName } from '../../../const/index.js';
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.calculateSwapAmount = calculateSwapAmount;
4
+ const singleTokenDeposit_js_1 = require("../../../const/abis/singleTokenDeposit.js");
5
+ const index_js_1 = require("../../../const/index.js");
3
6
  /**
4
7
  * Calculates the amount that needs to be swapped for a single-asset deposit
5
8
  * This function calls the smart contract's calculateSwapAmount function
@@ -25,14 +28,14 @@ import { getContractAddressByChainIdAndContractName } from '../../../const/index
25
28
  * }
26
29
  * ```
27
30
  */
28
- export async function calculateSwapAmount(publicClient, params) {
31
+ async function calculateSwapAmount(publicClient, params) {
29
32
  try {
30
33
  // Call the smart contract's calculateSwapAmount function
31
34
  const chainId = await publicClient.getChainId();
32
- const singleAssentDeposit = params.singleAssetDepositContract || getContractAddressByChainIdAndContractName(chainId, 'SingleAssetDeposit');
35
+ const singleAssentDeposit = params.singleAssetDepositContract || (0, index_js_1.getContractAddressByChainIdAndContractName)(chainId, 'SingleAssetDeposit');
33
36
  const result = await publicClient.readContract({
34
37
  address: singleAssentDeposit,
35
- abi: singleTokenDepositAbi,
38
+ abi: singleTokenDeposit_js_1.singleTokenDepositAbi,
36
39
  functionName: 'calculateSwapAmount',
37
40
  args: [
38
41
  params.depositAmount,
@@ -1 +1 @@
1
- {"version":3,"file":"calculateSwapAmount.js","sourceRoot":"","sources":["../../../../../src/base/vault/single-asset/calculateSwapAmount.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,qBAAqB,EAAE,MAAM,2CAA2C,CAAC;AAGlF,OAAO,EAAE,0CAA0C,EAAE,MAAM,yBAAyB,CAAC;AAErF;;;;;;;;;;;;;;;;;;;;;;;;GAwBG;AACH,MAAM,CAAC,KAAK,UAAU,mBAAmB,CACvC,YAA0B,EAC1B,MAAiC;IAEjC,IAAI,CAAC;QACH,yDAAyD;QAEzD,MAAM,OAAO,GAAG,MAAM,YAAY,CAAC,UAAU,EAAE,CAAC;QAChD,MAAM,mBAAmB,GAAG,MAAM,CAAC,0BAA0B,IAAI,0CAA0C,CAAC,OAAO,EAAE,oBAAoB,CAAC,CAAA;QAE1I,MAAM,MAAM,GAAG,MAAM,YAAY,CAAC,YAAY,CAAC;YAC7C,OAAO,EAAE,mBAAmB;YAC5B,GAAG,EAAE,qBAAqB;YAC1B,YAAY,EAAE,qBAAqB;YACnC,IAAI,EAAE;gBACJ,MAAM,CAAC,aAAa;gBACpB,MAAM,CAAC,QAAQ;gBACf,MAAM,CAAC,KAAK;gBACZ,MAAM,CAAC,IAAI;gBACX,MAAM,CAAC,OAAO;aACf;SACF,CAAC,CAAC;QAEH,+CAA+C;QAC/C,MAAM,CAAC,UAAU,EAAE,SAAS,CAAC,GAAG,MAA0B,CAAC;QAE3D,OAAO;YACL,IAAI,EAAE;gBACJ,UAAU;gBACV,SAAS;aACV;YACD,MAAM,EAAE,GAAG;YACX,OAAO,EAAE,IAAI;SACd,CAAC;IACJ,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QACf,OAAO;YACL,IAAI,EAAE,IAAI;YACV,MAAM,EAAE,GAAG;YACX,OAAO,EAAE,KAAK;YACd,KAAK,EAAE,KAAK,YAAY,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,iCAAiC;SAClF,CAAC;IACJ,CAAC;AACH,CAAC","sourcesContent":["import type { PublicClient } from 'viem';\nimport { singleTokenDepositAbi } from '../../../const/abis/singleTokenDeposit.js';\nimport { SteerResponse } from '../../../types.js';\nimport type { CalculateSwapAmountParams, SwapAmountResponse } from './types.js';\nimport { getContractAddressByChainIdAndContractName } from '../../../const/index.js';\n\n/**\n * Calculates the amount that needs to be swapped for a single-asset deposit\n * This function calls the smart contract's calculateSwapAmount function\n * \n * @param publicClient - Viem public client for blockchain reads\n * @param params - Parameters for swap amount calculation\n * @returns Promise resolving to swap amount and current sqrt price\n * \n * @example\n * ```typescript\n * const result = await calculateSwapAmount(publicClient, {\n * depositAmount: parseEther('100'),\n * isToken0: true,\n * vault: '0x...',\n * pool: '0x...',\n * ammType: AMMType.UniswapV3,\n * singleAssetDepositContract: '0x...'\n * });\n * \n * if (result.success) {\n * console.log('Swap amount:', result.data.swapAmount);\n * console.log('Current sqrt price:', result.data.sqrtPrice);\n * }\n * ```\n */\nexport async function calculateSwapAmount(\n publicClient: PublicClient,\n params: CalculateSwapAmountParams\n): Promise<SteerResponse<SwapAmountResponse>> {\n try {\n // Call the smart contract's calculateSwapAmount function\n\n const chainId = await publicClient.getChainId();\n const singleAssentDeposit = params.singleAssetDepositContract || getContractAddressByChainIdAndContractName(chainId, 'SingleAssetDeposit')\n\n const result = await publicClient.readContract({\n address: singleAssentDeposit,\n abi: singleTokenDepositAbi,\n functionName: 'calculateSwapAmount',\n args: [\n params.depositAmount,\n params.isToken0,\n params.vault,\n params.pool,\n params.ammType\n ]\n });\n\n // The contract returns [swapAmount, sqrtPrice]\n const [swapAmount, sqrtPrice] = result as [bigint, bigint];\n\n return {\n data: {\n swapAmount,\n sqrtPrice\n },\n status: 200,\n success: true\n };\n } catch (error) {\n return {\n data: null,\n status: 500,\n success: false,\n error: error instanceof Error ? error.message : 'Failed to calculate swap amount'\n };\n }\n} "]}
1
+ {"version":3,"file":"calculateSwapAmount.js","sourceRoot":"","sources":["../../../../../src/base/vault/single-asset/calculateSwapAmount.ts"],"names":[],"mappings":";;AA+BA,kDA0CC;AAxED,qFAAkF;AAGlF,sDAAqF;AAErF;;;;;;;;;;;;;;;;;;;;;;;;GAwBG;AACI,KAAK,UAAU,mBAAmB,CACvC,YAA0B,EAC1B,MAAiC;IAEjC,IAAI,CAAC;QACH,yDAAyD;QAEzD,MAAM,OAAO,GAAG,MAAM,YAAY,CAAC,UAAU,EAAE,CAAC;QAChD,MAAM,mBAAmB,GAAG,MAAM,CAAC,0BAA0B,IAAI,IAAA,qDAA0C,EAAC,OAAO,EAAE,oBAAoB,CAAC,CAAA;QAE1I,MAAM,MAAM,GAAG,MAAM,YAAY,CAAC,YAAY,CAAC;YAC7C,OAAO,EAAE,mBAAmB;YAC5B,GAAG,EAAE,6CAAqB;YAC1B,YAAY,EAAE,qBAAqB;YACnC,IAAI,EAAE;gBACJ,MAAM,CAAC,aAAa;gBACpB,MAAM,CAAC,QAAQ;gBACf,MAAM,CAAC,KAAK;gBACZ,MAAM,CAAC,IAAI;gBACX,MAAM,CAAC,OAAO;aACf;SACF,CAAC,CAAC;QAEH,+CAA+C;QAC/C,MAAM,CAAC,UAAU,EAAE,SAAS,CAAC,GAAG,MAA0B,CAAC;QAE3D,OAAO;YACL,IAAI,EAAE;gBACJ,UAAU;gBACV,SAAS;aACV;YACD,MAAM,EAAE,GAAG;YACX,OAAO,EAAE,IAAI;SACd,CAAC;IACJ,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QACf,OAAO;YACL,IAAI,EAAE,IAAI;YACV,MAAM,EAAE,GAAG;YACX,OAAO,EAAE,KAAK;YACd,KAAK,EAAE,KAAK,YAAY,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,iCAAiC;SAClF,CAAC;IACJ,CAAC;AACH,CAAC","sourcesContent":["import type { PublicClient } from 'viem';\nimport { singleTokenDepositAbi } from '../../../const/abis/singleTokenDeposit.js';\nimport { SteerResponse } from '../../../types.js';\nimport type { CalculateSwapAmountParams, SwapAmountResponse } from './types.js';\nimport { getContractAddressByChainIdAndContractName } from '../../../const/index.js';\n\n/**\n * Calculates the amount that needs to be swapped for a single-asset deposit\n * This function calls the smart contract's calculateSwapAmount function\n * \n * @param publicClient - Viem public client for blockchain reads\n * @param params - Parameters for swap amount calculation\n * @returns Promise resolving to swap amount and current sqrt price\n * \n * @example\n * ```typescript\n * const result = await calculateSwapAmount(publicClient, {\n * depositAmount: parseEther('100'),\n * isToken0: true,\n * vault: '0x...',\n * pool: '0x...',\n * ammType: AMMType.UniswapV3,\n * singleAssetDepositContract: '0x...'\n * });\n * \n * if (result.success) {\n * console.log('Swap amount:', result.data.swapAmount);\n * console.log('Current sqrt price:', result.data.sqrtPrice);\n * }\n * ```\n */\nexport async function calculateSwapAmount(\n publicClient: PublicClient,\n params: CalculateSwapAmountParams\n): Promise<SteerResponse<SwapAmountResponse>> {\n try {\n // Call the smart contract's calculateSwapAmount function\n\n const chainId = await publicClient.getChainId();\n const singleAssentDeposit = params.singleAssetDepositContract || getContractAddressByChainIdAndContractName(chainId, 'SingleAssetDeposit')\n\n const result = await publicClient.readContract({\n address: singleAssentDeposit,\n abi: singleTokenDepositAbi,\n functionName: 'calculateSwapAmount',\n args: [\n params.depositAmount,\n params.isToken0,\n params.vault,\n params.pool,\n params.ammType\n ]\n });\n\n // The contract returns [swapAmount, sqrtPrice]\n const [swapAmount, sqrtPrice] = result as [bigint, bigint];\n\n return {\n data: {\n swapAmount,\n sqrtPrice\n },\n status: 200,\n success: true\n };\n } catch (error) {\n return {\n data: null,\n status: 500,\n success: false,\n error: error instanceof Error ? error.message : 'Failed to calculate swap amount'\n };\n }\n} "]}
@@ -1,7 +1,12 @@
1
- import { abis } from '../../../const/deployments/abis.js';
2
- import { getContractAddressByChainIdAndContractName } from '../../../const/network.js';
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.estimateLpTokens = estimateLpTokens;
4
+ exports.getShares = getShares;
5
+ exports.getVaultReserves = getVaultReserves;
6
+ const abis_js_1 = require("../../../const/deployments/abis.js");
7
+ const network_js_1 = require("../../../const/network.js");
3
8
  // Use the vault ABI for reading vault state
4
- const VAULT_ABI = abis.QuickSwapUniv3MultiPositionLiquidityManager;
9
+ const VAULT_ABI = abis_js_1.abis.QuickSwapUniv3MultiPositionLiquidityManager;
5
10
  /**
6
11
  * Estimates the amount of LP tokens that will be received based on the final token amounts
7
12
  * This calculation follows the Solidity getShares implementation from the vault contract
@@ -27,7 +32,7 @@ const VAULT_ABI = abis.QuickSwapUniv3MultiPositionLiquidityManager;
27
32
  * }
28
33
  * ```
29
34
  */
30
- export async function estimateLpTokens(publicClient, params) {
35
+ async function estimateLpTokens(publicClient, params) {
31
36
  try {
32
37
  // Calculate final amounts based on original deposit and swap results
33
38
  const finalAmount0 = params.isToken0
@@ -80,7 +85,7 @@ export async function estimateLpTokens(publicClient, params) {
80
85
  })
81
86
  ]);
82
87
  const chainId = await publicClient.getChainId();
83
- const helper = getContractAddressByChainIdAndContractName(chainId, 'Helper');
88
+ const helper = (0, network_js_1.getContractAddressByChainIdAndContractName)(chainId, 'Helper');
84
89
  const [shares, amount0Used, amount1Used] = await publicClient.readContract({
85
90
  address: helper,
86
91
  abi: [{
@@ -192,7 +197,7 @@ export async function estimateLpTokens(publicClient, params) {
192
197
  * @param minShares - Minimum shares required (set to 0n)
193
198
  * @returns Object with shares, amount0Used, and amount1Used
194
199
  */
195
- export function getShares(totalSupply, total0, total1, amount0Desired, amount1Desired, amount0Min, amount1Min, minShares) {
200
+ function getShares(totalSupply, total0, total1, amount0Desired, amount1Desired, amount0Min, amount1Min, minShares) {
196
201
  // If total supply > 0, vault can't be empty.
197
202
  if (!(totalSupply === 0n || total0 > 0n || total1 > 0n)) {
198
203
  throw new Error('Invalid vault state');
@@ -279,7 +284,7 @@ function min(a, b) {
279
284
  * @param vaultAddress - Address of the vault
280
285
  * @returns Promise resolving to [token0Balance, token1Balance, totalSupply]
281
286
  */
282
- export async function getVaultReserves(publicClient, vaultAddress) {
287
+ async function getVaultReserves(publicClient, vaultAddress) {
283
288
  try {
284
289
  const [totalSupply, token0Address, token1Address] = await Promise.all([
285
290
  publicClient.readContract({
@@ -1 +1 @@
1
- {"version":3,"file":"estimateLpTokens.js","sourceRoot":"","sources":["../../../../../src/base/vault/single-asset/estimateLpTokens.ts"],"names":[],"mappings":"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","sourcesContent":["import type { Address, PublicClient } from 'viem';\nimport { abis } from '../../../const/deployments/abis.js';\nimport { getContractAddressByChainIdAndContractName } from '../../../const/network.js';\nimport { SteerResponse } from '../../../types.js';\nimport type { EstimateLpTokensParams, LpTokenEstimationResponse } from './types.js';\n\n// Use the vault ABI for reading vault state\nconst VAULT_ABI = abis.QuickSwapUniv3MultiPositionLiquidityManager;\n\n/**\n * Estimates the amount of LP tokens that will be received based on the final token amounts\n * This calculation follows the Solidity getShares implementation from the vault contract\n * \n * @param publicClient - Viem public client for blockchain reads\n * @param params - Parameters for LP token estimation\n * @returns Promise resolving to the estimated LP tokens and final amounts\n * \n * @example\n * ```typescript\n * const result = await estimateLpTokens(publicClient, {\n * vault: '0x...',\n * originalAssets: parseEther('100'),\n * swapAmount: parseEther('50'),\n * swapResult: { amount0: -parseEther('50'), amount1: parseEther('150') },\n * isToken0: true\n * });\n * \n * if (result.success) {\n * console.log('Estimated LP tokens:', result.data.lpTokens);\n * console.log('Final amount0:', result.data.finalAmount0);\n * console.log('Final amount1:', result.data.finalAmount1);\n * }\n * ```\n */\nexport async function estimateLpTokens(\n publicClient: PublicClient,\n params: EstimateLpTokensParams\n): Promise<SteerResponse<LpTokenEstimationResponse>> {\n try {\n // Calculate final amounts based on original deposit and swap results\n const finalAmount0 = params.isToken0 \n ? params.originalAssets - params.swapAmount + (params.swapResult.amount0 < 0n ? -params.swapResult.amount0 : params.swapResult.amount0)\n : (params.swapResult.amount0 < 0n ? -params.swapResult.amount0 : params.swapResult.amount0);\n \n const finalAmount1 = params.isToken0\n ? (params.swapResult.amount1 < 0n ? -params.swapResult.amount1 : params.swapResult.amount1)\n : params.originalAssets - params.swapAmount + (params.swapResult.amount1 < 0n ? -params.swapResult.amount1 : params.swapResult.amount1);\n\n // Get vault reserves and total supply\n const [totalSupply, tokenBalances] = await Promise.all([\n publicClient.readContract({\n address: params.vault,\n abi: [ {\n \"inputs\": [],\n \"name\": \"totalSupply\",\n \"outputs\": [\n {\n \"internalType\": \"uint256\",\n \"name\": \"\",\n \"type\": \"uint256\"\n }\n ],\n \"stateMutability\": \"view\",\n \"type\": \"function\"\n },],\n functionName: 'totalSupply'\n }) as Promise<bigint>,\n \n // Get token0 address first, then balance\n publicClient.readContract({\n address: params.vault,\n abi: [ {\n \"inputs\": [],\n \"name\": \"getTotalAmounts\",\n \"outputs\": [\n {\n \"internalType\": \"uint256\",\n \"name\": \"total0\",\n \"type\": \"uint256\"\n },\n {\n \"internalType\": \"uint256\",\n \"name\": \"total1\",\n \"type\": \"uint256\"\n }\n ],\n \"stateMutability\": \"view\",\n \"type\": \"function\"\n },],\n functionName: 'getTotalAmounts'\n })\n ])\n\n const chainId = await publicClient.getChainId();\n const helper = getContractAddressByChainIdAndContractName(\n chainId,\n 'Helper'\n )\n\n const [shares, amount0Used, amount1Used] = await publicClient.readContract({\n address: helper as Address,\n abi: [{\n \"inputs\": [\n {\n \"internalType\": \"uint256\",\n \"name\": \"_totalSupply\",\n \"type\": \"uint256\"\n },\n {\n \"internalType\": \"uint256\",\n \"name\": \"total0\",\n \"type\": \"uint256\"\n },\n {\n \"internalType\": \"uint256\",\n \"name\": \"total1\",\n \"type\": \"uint256\"\n },\n {\n \"internalType\": \"uint256\",\n \"name\": \"amount0Desired\",\n \"type\": \"uint256\"\n },\n {\n \"internalType\": \"uint256\",\n \"name\": \"amount1Desired\",\n \"type\": \"uint256\"\n },\n {\n \"internalType\": \"uint256\",\n \"name\": \"amount0Min\",\n \"type\": \"uint256\"\n },\n {\n \"internalType\": \"uint256\",\n \"name\": \"amount1Min\",\n \"type\": \"uint256\"\n },\n {\n \"internalType\": \"uint256\",\n \"name\": \"minShares\",\n \"type\": \"uint256\"\n }\n ],\n \"name\": \"getShares\",\n \"outputs\": [\n {\n \"internalType\": \"uint256\",\n \"name\": \"shares\",\n \"type\": \"uint256\"\n },\n {\n \"internalType\": \"uint256\",\n \"name\": \"amount0Used\",\n \"type\": \"uint256\"\n },\n {\n \"internalType\": \"uint256\",\n \"name\": \"amount1Used\",\n \"type\": \"uint256\"\n }\n ],\n \"stateMutability\": \"pure\",\n \"type\": \"function\"\n }],\n functionName: 'getShares',\n args: [\n totalSupply,\n tokenBalances[0],\n tokenBalances[1],\n finalAmount0,\n finalAmount1,\n 0n, // amount0Min = 0 as requested\n 0n, // amount1Min = 0 as requested\n 0n // minShares = 0\n ]\n })\n\n\n return {\n data: {\n lpTokens: shares,\n finalAmount0: amount0Used,\n finalAmount1: amount1Used\n },\n status: 200,\n success: true\n };\n } catch (error) {\n return {\n data: null,\n status: 500,\n success: false,\n error: error instanceof Error ? error.message : 'Failed to estimate LP tokens'\n };\n }\n}\n\n/**\n * Calculates shares (LP tokens) based on deposit amounts and vault reserves\n * This is a TypeScript implementation of the Solidity getShares function\n * \n * @param totalSupply - Current total supply of LP tokens\n * @param total0 - Current balance of token0 in vault\n * @param total1 - Current balance of token1 in vault\n * @param amount0Desired - Desired amount of token0 to deposit\n * @param amount1Desired - Desired amount of token1 to deposit\n * @param amount0Min - Minimum amount of token0 (set to 0n)\n * @param amount1Min - Minimum amount of token1 (set to 0n)\n * @param minShares - Minimum shares required (set to 0n)\n * @returns Object with shares, amount0Used, and amount1Used\n */\nexport function getShares(\n totalSupply: bigint,\n total0: bigint,\n total1: bigint,\n amount0Desired: bigint,\n amount1Desired: bigint,\n amount0Min: bigint,\n amount1Min: bigint,\n minShares: bigint\n): { shares: bigint; amount0Used: bigint; amount1Used: bigint } {\n // If total supply > 0, vault can't be empty.\n if (!(totalSupply === 0n || total0 > 0n || total1 > 0n)) {\n throw new Error('Invalid vault state');\n }\n\n let shares: bigint;\n let amount0Used: bigint = 0n;\n let amount1Used: bigint = 0n;\n\n if (totalSupply === 0n) {\n // For first deposit, just use the amounts desired\n amount0Used = amount0Desired;\n amount1Used = amount1Desired;\n shares = amount0Used > amount1Used ? amount0Used : amount1Used;\n \n if (shares < minShares) {\n throw new Error('Insufficient shares for minimum requirement');\n }\n } else if (total0 === 0n) {\n // Vault only has token1\n shares = mulDiv(amount1Desired, totalSupply, total1);\n amount1Used = mulDivRoundingUp(shares, total1, totalSupply);\n amount0Used = 0n;\n } else if (total1 === 0n) {\n // Vault only has token0\n shares = mulDiv(amount0Desired, totalSupply, total0);\n amount0Used = mulDivRoundingUp(shares, total0, totalSupply);\n amount1Used = 0n;\n } else {\n // Both tokens present - calculate cross product\n const cross = min(amount0Desired * total1, amount1Desired * total0);\n\n if (cross === 0n) {\n throw new Error('Invalid deposit ratio - cross product is zero');\n }\n\n // Round up amounts\n amount0Used = ((cross - 1n) / total1) + 1n;\n amount1Used = ((cross - 1n) / total0) + 1n;\n\n shares = mulDiv(cross, totalSupply, total0) / total1;\n }\n\n // Validate requirements\n if (shares === 0n) {\n throw new Error('Zero shares calculated');\n }\n if (amount0Used < amount0Min) {\n throw new Error('Amount0 used less than minimum');\n }\n if (amount1Used < amount1Min) {\n throw new Error('Amount1 used less than minimum');\n }\n\n return { shares, amount0Used, amount1Used };\n}\n\n/**\n * Multiplies two BigInt values and divides by a third (a * b / c)\n * Equivalent to Solidity's FullMath.mulDiv\n */\nfunction mulDiv(a: bigint, b: bigint, c: bigint): bigint {\n if (c === 0n) {\n throw new Error('Division by zero');\n }\n return (a * b) / c;\n}\n\n/**\n * Multiplies two BigInt values, divides by a third, and rounds up\n * Equivalent to Solidity's FullMath.mulDivRoundingUp\n */\nfunction mulDivRoundingUp(a: bigint, b: bigint, c: bigint): bigint {\n if (c === 0n) {\n throw new Error('Division by zero');\n }\n const result = (a * b) / c;\n const remainder = (a * b) % c;\n return remainder > 0n ? result + 1n : result;\n}\n\n/**\n * Returns the minimum of two BigInt values\n */\nfunction min(a: bigint, b: bigint): bigint {\n return a < b ? a : b;\n}\n\n/**\n * Gets the current vault reserves for both tokens\n * \n * @param publicClient - Viem public client for blockchain reads\n * @param vaultAddress - Address of the vault\n * @returns Promise resolving to [token0Balance, token1Balance, totalSupply]\n */\nexport async function getVaultReserves(\n publicClient: PublicClient,\n vaultAddress: `0x${string}`\n): Promise<SteerResponse<{ token0Balance: bigint; token1Balance: bigint; totalSupply: bigint }>> {\n try {\n const [totalSupply, token0Address, token1Address] = await Promise.all([\n publicClient.readContract({\n address: vaultAddress,\n abi: VAULT_ABI,\n functionName: 'totalSupply'\n }) as Promise<bigint>,\n \n publicClient.readContract({\n address: vaultAddress,\n abi: VAULT_ABI,\n functionName: 'token0'\n }) as Promise<`0x${string}`>,\n \n publicClient.readContract({\n address: vaultAddress,\n abi: VAULT_ABI,\n functionName: 'token1'\n }) as Promise<`0x${string}`>\n ]);\n\n const [token0Balance, token1Balance] = await Promise.all([\n publicClient.readContract({\n address: token0Address,\n abi: [\n {\n type: 'function',\n name: 'balanceOf',\n inputs: [{ name: 'account', type: 'address', internalType: 'address' }],\n outputs: [{ name: '', type: 'uint256', internalType: 'uint256' }],\n stateMutability: 'view'\n }\n ],\n functionName: 'balanceOf',\n args: [vaultAddress]\n }) as Promise<bigint>,\n \n publicClient.readContract({\n address: token1Address,\n abi: [\n {\n type: 'function',\n name: 'balanceOf',\n inputs: [{ name: 'account', type: 'address', internalType: 'address' }],\n outputs: [{ name: '', type: 'uint256', internalType: 'uint256' }],\n stateMutability: 'view'\n }\n ],\n functionName: 'balanceOf',\n args: [vaultAddress]\n }) as Promise<bigint>\n ]);\n\n return {\n data: {\n token0Balance,\n token1Balance,\n totalSupply\n },\n status: 200,\n success: true\n };\n } catch (error) {\n return {\n data: null,\n status: 500,\n success: false,\n error: error instanceof Error ? error.message : 'Failed to get vault reserves'\n };\n }\n} \n\n"]}
1
+ {"version":3,"file":"estimateLpTokens.js","sourceRoot":"","sources":["../../../../../src/base/vault/single-asset/estimateLpTokens.ts"],"names":[],"mappings":"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","sourcesContent":["import type { Address, PublicClient } from 'viem';\nimport { abis } from '../../../const/deployments/abis.js';\nimport { getContractAddressByChainIdAndContractName } from '../../../const/network.js';\nimport { SteerResponse } from '../../../types.js';\nimport type { EstimateLpTokensParams, LpTokenEstimationResponse } from './types.js';\n\n// Use the vault ABI for reading vault state\nconst VAULT_ABI = abis.QuickSwapUniv3MultiPositionLiquidityManager;\n\n/**\n * Estimates the amount of LP tokens that will be received based on the final token amounts\n * This calculation follows the Solidity getShares implementation from the vault contract\n * \n * @param publicClient - Viem public client for blockchain reads\n * @param params - Parameters for LP token estimation\n * @returns Promise resolving to the estimated LP tokens and final amounts\n * \n * @example\n * ```typescript\n * const result = await estimateLpTokens(publicClient, {\n * vault: '0x...',\n * originalAssets: parseEther('100'),\n * swapAmount: parseEther('50'),\n * swapResult: { amount0: -parseEther('50'), amount1: parseEther('150') },\n * isToken0: true\n * });\n * \n * if (result.success) {\n * console.log('Estimated LP tokens:', result.data.lpTokens);\n * console.log('Final amount0:', result.data.finalAmount0);\n * console.log('Final amount1:', result.data.finalAmount1);\n * }\n * ```\n */\nexport async function estimateLpTokens(\n publicClient: PublicClient,\n params: EstimateLpTokensParams\n): Promise<SteerResponse<LpTokenEstimationResponse>> {\n try {\n // Calculate final amounts based on original deposit and swap results\n const finalAmount0 = params.isToken0 \n ? params.originalAssets - params.swapAmount + (params.swapResult.amount0 < 0n ? -params.swapResult.amount0 : params.swapResult.amount0)\n : (params.swapResult.amount0 < 0n ? -params.swapResult.amount0 : params.swapResult.amount0);\n \n const finalAmount1 = params.isToken0\n ? (params.swapResult.amount1 < 0n ? -params.swapResult.amount1 : params.swapResult.amount1)\n : params.originalAssets - params.swapAmount + (params.swapResult.amount1 < 0n ? -params.swapResult.amount1 : params.swapResult.amount1);\n\n // Get vault reserves and total supply\n const [totalSupply, tokenBalances] = await Promise.all([\n publicClient.readContract({\n address: params.vault,\n abi: [ {\n \"inputs\": [],\n \"name\": \"totalSupply\",\n \"outputs\": [\n {\n \"internalType\": \"uint256\",\n \"name\": \"\",\n \"type\": \"uint256\"\n }\n ],\n \"stateMutability\": \"view\",\n \"type\": \"function\"\n },],\n functionName: 'totalSupply'\n }) as Promise<bigint>,\n \n // Get token0 address first, then balance\n publicClient.readContract({\n address: params.vault,\n abi: [ {\n \"inputs\": [],\n \"name\": \"getTotalAmounts\",\n \"outputs\": [\n {\n \"internalType\": \"uint256\",\n \"name\": \"total0\",\n \"type\": \"uint256\"\n },\n {\n \"internalType\": \"uint256\",\n \"name\": \"total1\",\n \"type\": \"uint256\"\n }\n ],\n \"stateMutability\": \"view\",\n \"type\": \"function\"\n },],\n functionName: 'getTotalAmounts'\n })\n ])\n\n const chainId = await publicClient.getChainId();\n const helper = getContractAddressByChainIdAndContractName(\n chainId,\n 'Helper'\n )\n\n const [shares, amount0Used, amount1Used] = await publicClient.readContract({\n address: helper as Address,\n abi: [{\n \"inputs\": [\n {\n \"internalType\": \"uint256\",\n \"name\": \"_totalSupply\",\n \"type\": \"uint256\"\n },\n {\n \"internalType\": \"uint256\",\n \"name\": \"total0\",\n \"type\": \"uint256\"\n },\n {\n \"internalType\": \"uint256\",\n \"name\": \"total1\",\n \"type\": \"uint256\"\n },\n {\n \"internalType\": \"uint256\",\n \"name\": \"amount0Desired\",\n \"type\": \"uint256\"\n },\n {\n \"internalType\": \"uint256\",\n \"name\": \"amount1Desired\",\n \"type\": \"uint256\"\n },\n {\n \"internalType\": \"uint256\",\n \"name\": \"amount0Min\",\n \"type\": \"uint256\"\n },\n {\n \"internalType\": \"uint256\",\n \"name\": \"amount1Min\",\n \"type\": \"uint256\"\n },\n {\n \"internalType\": \"uint256\",\n \"name\": \"minShares\",\n \"type\": \"uint256\"\n }\n ],\n \"name\": \"getShares\",\n \"outputs\": [\n {\n \"internalType\": \"uint256\",\n \"name\": \"shares\",\n \"type\": \"uint256\"\n },\n {\n \"internalType\": \"uint256\",\n \"name\": \"amount0Used\",\n \"type\": \"uint256\"\n },\n {\n \"internalType\": \"uint256\",\n \"name\": \"amount1Used\",\n \"type\": \"uint256\"\n }\n ],\n \"stateMutability\": \"pure\",\n \"type\": \"function\"\n }],\n functionName: 'getShares',\n args: [\n totalSupply,\n tokenBalances[0],\n tokenBalances[1],\n finalAmount0,\n finalAmount1,\n 0n, // amount0Min = 0 as requested\n 0n, // amount1Min = 0 as requested\n 0n // minShares = 0\n ]\n })\n\n\n return {\n data: {\n lpTokens: shares,\n finalAmount0: amount0Used,\n finalAmount1: amount1Used\n },\n status: 200,\n success: true\n };\n } catch (error) {\n return {\n data: null,\n status: 500,\n success: false,\n error: error instanceof Error ? error.message : 'Failed to estimate LP tokens'\n };\n }\n}\n\n/**\n * Calculates shares (LP tokens) based on deposit amounts and vault reserves\n * This is a TypeScript implementation of the Solidity getShares function\n * \n * @param totalSupply - Current total supply of LP tokens\n * @param total0 - Current balance of token0 in vault\n * @param total1 - Current balance of token1 in vault\n * @param amount0Desired - Desired amount of token0 to deposit\n * @param amount1Desired - Desired amount of token1 to deposit\n * @param amount0Min - Minimum amount of token0 (set to 0n)\n * @param amount1Min - Minimum amount of token1 (set to 0n)\n * @param minShares - Minimum shares required (set to 0n)\n * @returns Object with shares, amount0Used, and amount1Used\n */\nexport function getShares(\n totalSupply: bigint,\n total0: bigint,\n total1: bigint,\n amount0Desired: bigint,\n amount1Desired: bigint,\n amount0Min: bigint,\n amount1Min: bigint,\n minShares: bigint\n): { shares: bigint; amount0Used: bigint; amount1Used: bigint } {\n // If total supply > 0, vault can't be empty.\n if (!(totalSupply === 0n || total0 > 0n || total1 > 0n)) {\n throw new Error('Invalid vault state');\n }\n\n let shares: bigint;\n let amount0Used: bigint = 0n;\n let amount1Used: bigint = 0n;\n\n if (totalSupply === 0n) {\n // For first deposit, just use the amounts desired\n amount0Used = amount0Desired;\n amount1Used = amount1Desired;\n shares = amount0Used > amount1Used ? amount0Used : amount1Used;\n \n if (shares < minShares) {\n throw new Error('Insufficient shares for minimum requirement');\n }\n } else if (total0 === 0n) {\n // Vault only has token1\n shares = mulDiv(amount1Desired, totalSupply, total1);\n amount1Used = mulDivRoundingUp(shares, total1, totalSupply);\n amount0Used = 0n;\n } else if (total1 === 0n) {\n // Vault only has token0\n shares = mulDiv(amount0Desired, totalSupply, total0);\n amount0Used = mulDivRoundingUp(shares, total0, totalSupply);\n amount1Used = 0n;\n } else {\n // Both tokens present - calculate cross product\n const cross = min(amount0Desired * total1, amount1Desired * total0);\n\n if (cross === 0n) {\n throw new Error('Invalid deposit ratio - cross product is zero');\n }\n\n // Round up amounts\n amount0Used = ((cross - 1n) / total1) + 1n;\n amount1Used = ((cross - 1n) / total0) + 1n;\n\n shares = mulDiv(cross, totalSupply, total0) / total1;\n }\n\n // Validate requirements\n if (shares === 0n) {\n throw new Error('Zero shares calculated');\n }\n if (amount0Used < amount0Min) {\n throw new Error('Amount0 used less than minimum');\n }\n if (amount1Used < amount1Min) {\n throw new Error('Amount1 used less than minimum');\n }\n\n return { shares, amount0Used, amount1Used };\n}\n\n/**\n * Multiplies two BigInt values and divides by a third (a * b / c)\n * Equivalent to Solidity's FullMath.mulDiv\n */\nfunction mulDiv(a: bigint, b: bigint, c: bigint): bigint {\n if (c === 0n) {\n throw new Error('Division by zero');\n }\n return (a * b) / c;\n}\n\n/**\n * Multiplies two BigInt values, divides by a third, and rounds up\n * Equivalent to Solidity's FullMath.mulDivRoundingUp\n */\nfunction mulDivRoundingUp(a: bigint, b: bigint, c: bigint): bigint {\n if (c === 0n) {\n throw new Error('Division by zero');\n }\n const result = (a * b) / c;\n const remainder = (a * b) % c;\n return remainder > 0n ? result + 1n : result;\n}\n\n/**\n * Returns the minimum of two BigInt values\n */\nfunction min(a: bigint, b: bigint): bigint {\n return a < b ? a : b;\n}\n\n/**\n * Gets the current vault reserves for both tokens\n * \n * @param publicClient - Viem public client for blockchain reads\n * @param vaultAddress - Address of the vault\n * @returns Promise resolving to [token0Balance, token1Balance, totalSupply]\n */\nexport async function getVaultReserves(\n publicClient: PublicClient,\n vaultAddress: `0x${string}`\n): Promise<SteerResponse<{ token0Balance: bigint; token1Balance: bigint; totalSupply: bigint }>> {\n try {\n const [totalSupply, token0Address, token1Address] = await Promise.all([\n publicClient.readContract({\n address: vaultAddress,\n abi: VAULT_ABI,\n functionName: 'totalSupply'\n }) as Promise<bigint>,\n \n publicClient.readContract({\n address: vaultAddress,\n abi: VAULT_ABI,\n functionName: 'token0'\n }) as Promise<`0x${string}`>,\n \n publicClient.readContract({\n address: vaultAddress,\n abi: VAULT_ABI,\n functionName: 'token1'\n }) as Promise<`0x${string}`>\n ]);\n\n const [token0Balance, token1Balance] = await Promise.all([\n publicClient.readContract({\n address: token0Address,\n abi: [\n {\n type: 'function',\n name: 'balanceOf',\n inputs: [{ name: 'account', type: 'address', internalType: 'address' }],\n outputs: [{ name: '', type: 'uint256', internalType: 'uint256' }],\n stateMutability: 'view'\n }\n ],\n functionName: 'balanceOf',\n args: [vaultAddress]\n }) as Promise<bigint>,\n \n publicClient.readContract({\n address: token1Address,\n abi: [\n {\n type: 'function',\n name: 'balanceOf',\n inputs: [{ name: 'account', type: 'address', internalType: 'address' }],\n outputs: [{ name: '', type: 'uint256', internalType: 'uint256' }],\n stateMutability: 'view'\n }\n ],\n functionName: 'balanceOf',\n args: [vaultAddress]\n }) as Promise<bigint>\n ]);\n\n return {\n data: {\n token0Balance,\n token1Balance,\n totalSupply\n },\n status: 200,\n success: true\n };\n } catch (error) {\n return {\n data: null,\n status: 500,\n success: false,\n error: error instanceof Error ? error.message : 'Failed to get vault reserves'\n };\n }\n} \n\n"]}
@@ -1,12 +1,38 @@
1
+ "use strict";
2
+ var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
3
+ if (k2 === undefined) k2 = k;
4
+ var desc = Object.getOwnPropertyDescriptor(m, k);
5
+ if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
6
+ desc = { enumerable: true, get: function() { return m[k]; } };
7
+ }
8
+ Object.defineProperty(o, k2, desc);
9
+ }) : (function(o, m, k, k2) {
10
+ if (k2 === undefined) k2 = k;
11
+ o[k2] = m[k];
12
+ }));
13
+ var __exportStar = (this && this.__exportStar) || function(m, exports) {
14
+ for (var p in m) if (p !== "default" && !Object.prototype.hasOwnProperty.call(exports, p)) __createBinding(exports, m, p);
15
+ };
16
+ Object.defineProperty(exports, "__esModule", { value: true });
17
+ exports.SingleAssetDepositClient = exports.getVaultReserves = exports.estimateLpTokens = exports.validateSwapParams = exports.determineSwapDirection = exports.simulateSwap = exports.getPoolSlot0 = exports.calculateLimitPrice = exports.calculateSwapAmount = void 0;
1
18
  // Export all types
2
- export * from './types.js';
19
+ __exportStar(require("./types.js"), exports);
3
20
  // Export individual functions for separate testing and usage
4
- export { calculateSwapAmount } from './calculateSwapAmount.js';
5
- export { calculateLimitPrice, getPoolSlot0 } from './calculateLimitPrice.js';
6
- export { simulateSwap, determineSwapDirection, validateSwapParams } from './simulateSwap.js';
7
- export { estimateLpTokens, getVaultReserves } from './estimateLpTokens.js';
21
+ var calculateSwapAmount_js_1 = require("./calculateSwapAmount.js");
22
+ Object.defineProperty(exports, "calculateSwapAmount", { enumerable: true, get: function () { return calculateSwapAmount_js_1.calculateSwapAmount; } });
23
+ var calculateLimitPrice_js_1 = require("./calculateLimitPrice.js");
24
+ Object.defineProperty(exports, "calculateLimitPrice", { enumerable: true, get: function () { return calculateLimitPrice_js_1.calculateLimitPrice; } });
25
+ Object.defineProperty(exports, "getPoolSlot0", { enumerable: true, get: function () { return calculateLimitPrice_js_1.getPoolSlot0; } });
26
+ var simulateSwap_js_1 = require("./simulateSwap.js");
27
+ Object.defineProperty(exports, "simulateSwap", { enumerable: true, get: function () { return simulateSwap_js_1.simulateSwap; } });
28
+ Object.defineProperty(exports, "determineSwapDirection", { enumerable: true, get: function () { return simulateSwap_js_1.determineSwapDirection; } });
29
+ Object.defineProperty(exports, "validateSwapParams", { enumerable: true, get: function () { return simulateSwap_js_1.validateSwapParams; } });
30
+ var estimateLpTokens_js_1 = require("./estimateLpTokens.js");
31
+ Object.defineProperty(exports, "estimateLpTokens", { enumerable: true, get: function () { return estimateLpTokens_js_1.estimateLpTokens; } });
32
+ Object.defineProperty(exports, "getVaultReserves", { enumerable: true, get: function () { return estimateLpTokens_js_1.getVaultReserves; } });
8
33
  // Export the main client
9
- export { SingleAssetDepositClient } from './singleAssetDeposit.js';
34
+ var singleAssetDeposit_js_1 = require("./singleAssetDeposit.js");
35
+ Object.defineProperty(exports, "SingleAssetDepositClient", { enumerable: true, get: function () { return singleAssetDeposit_js_1.SingleAssetDepositClient; } });
10
36
  /**
11
37
  * @fileoverview Single-Asset Deposit Module
12
38
  *
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../../../../../src/base/vault/single-asset/index.ts"],"names":[],"mappings":"AAAA,mBAAmB;AACnB,cAAc,YAAY,CAAC;AAE3B,6DAA6D;AAC7D,OAAO,EAAE,mBAAmB,EAAE,MAAM,0BAA0B,CAAC;AAC/D,OAAO,EAAE,mBAAmB,EAAE,YAAY,EAAE,MAAM,0BAA0B,CAAC;AAC7E,OAAO,EAAE,YAAY,EAAE,sBAAsB,EAAE,kBAAkB,EAAE,MAAM,mBAAmB,CAAC;AAC7F,OAAO,EAAE,gBAAgB,EAAE,gBAAgB,EAAE,MAAM,uBAAuB,CAAC;AAE3E,yBAAyB;AACzB,OAAO,EAAE,wBAAwB,EAAE,MAAM,yBAAyB,CAAC;AAEnE;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAwEG","sourcesContent":["// Export all types\nexport * from './types.js';\n\n// Export individual functions for separate testing and usage\nexport { calculateSwapAmount } from './calculateSwapAmount.js';\nexport { calculateLimitPrice, getPoolSlot0 } from './calculateLimitPrice.js';\nexport { simulateSwap, determineSwapDirection, validateSwapParams } from './simulateSwap.js';\nexport { estimateLpTokens, getVaultReserves } from './estimateLpTokens.js';\n\n// Export the main client\nexport { SingleAssetDepositClient } from './singleAssetDeposit.js';\n\n/**\n * @fileoverview Single-Asset Deposit Module\n * \n * This module provides comprehensive functionality for single-asset deposits into liquidity vaults.\n * The process allows users to deposit only one token (token0 or token1), while the contract \n * internally performs a swap to balance the token pair before depositing into the vault.\n * \n * ## Architecture\n * \n * The single-asset deposit process is broken down into separate, testable functions:\n * \n * 1. **calculateSwapAmount** - Determines how much of the input token needs to be swapped\n * 2. **calculateLimitPrice** - Calculates slippage protection limits for the internal swap\n * 3. **simulateSwap** - Simulates the swap to preview expected output amounts\n * 4. **estimateLpTokens** - Estimates the final LP tokens that will be received\n * 5. **SingleAssetDepositClient** - Main orchestrator that combines all steps\n * \n * ## Supported AMM Types\n * \n * Currently supports:\n * - UniswapV3 (fully implemented)\n * - Algebra variants (planned for future implementation)\n * \n * ## Example Usage\n * \n * ```typescript\n * import { SingleAssetDepositClient, AMMType } from '@steerprotocol/sdk';\n * import { parseEther } from 'viem';\n * \n * // Initialize the client\n * const client = new SingleAssetDepositClient(publicClient, walletClient);\n * \n * // Preview the deposit\n * const preview = await client.previewDeposit({\n * assets: parseEther('100'),\n * receiver: userAddress,\n * vault: vaultAddress,\n * isToken0: true,\n * depositSlippagePercent: 5n,\n * swapSlippageBP: 500,\n * ammType: AMMType.UniswapV3,\n * singleAssetDepositContract: contractAddress\n * }, poolAddress);\n * \n * if (preview.success) {\n * console.log('Expected LP tokens:', preview.data.lpEstimation.lpTokens);\n * \n * // Execute the deposit\n * const result = await client.deposit(params);\n * if (result.success) {\n * console.log('Transaction hash:', result.data);\n * }\n * }\n * ```\n * \n * ## Testing Individual Functions\n * \n * Each function can be tested separately:\n * \n * ```typescript\n * import { calculateSwapAmount, AMMType } from '@steerprotocol/sdk';\n * \n * // Test swap amount calculation\n * const result = await calculateSwapAmount(publicClient, {\n * depositAmount: parseEther('100'),\n * isToken0: true,\n * vault: vaultAddress,\n * pool: poolAddress,\n * ammType: AMMType.UniswapV3,\n * singleAssetDepositContract: contractAddress\n * });\n * ```\n */ "]}
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../../../../src/base/vault/single-asset/index.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;;AAAA,mBAAmB;AACnB,6CAA2B;AAE3B,6DAA6D;AAC7D,mEAA+D;AAAtD,6HAAA,mBAAmB,OAAA;AAC5B,mEAA6E;AAApE,6HAAA,mBAAmB,OAAA;AAAE,sHAAA,YAAY,OAAA;AAC1C,qDAA6F;AAApF,+GAAA,YAAY,OAAA;AAAE,yHAAA,sBAAsB,OAAA;AAAE,qHAAA,kBAAkB,OAAA;AACjE,6DAA2E;AAAlE,uHAAA,gBAAgB,OAAA;AAAE,uHAAA,gBAAgB,OAAA;AAE3C,yBAAyB;AACzB,iEAAmE;AAA1D,iIAAA,wBAAwB,OAAA;AAEjC;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAwEG","sourcesContent":["// Export all types\nexport * from './types.js';\n\n// Export individual functions for separate testing and usage\nexport { calculateSwapAmount } from './calculateSwapAmount.js';\nexport { calculateLimitPrice, getPoolSlot0 } from './calculateLimitPrice.js';\nexport { simulateSwap, determineSwapDirection, validateSwapParams } from './simulateSwap.js';\nexport { estimateLpTokens, getVaultReserves } from './estimateLpTokens.js';\n\n// Export the main client\nexport { SingleAssetDepositClient } from './singleAssetDeposit.js';\n\n/**\n * @fileoverview Single-Asset Deposit Module\n * \n * This module provides comprehensive functionality for single-asset deposits into liquidity vaults.\n * The process allows users to deposit only one token (token0 or token1), while the contract \n * internally performs a swap to balance the token pair before depositing into the vault.\n * \n * ## Architecture\n * \n * The single-asset deposit process is broken down into separate, testable functions:\n * \n * 1. **calculateSwapAmount** - Determines how much of the input token needs to be swapped\n * 2. **calculateLimitPrice** - Calculates slippage protection limits for the internal swap\n * 3. **simulateSwap** - Simulates the swap to preview expected output amounts\n * 4. **estimateLpTokens** - Estimates the final LP tokens that will be received\n * 5. **SingleAssetDepositClient** - Main orchestrator that combines all steps\n * \n * ## Supported AMM Types\n * \n * Currently supports:\n * - UniswapV3 (fully implemented)\n * - Algebra variants (planned for future implementation)\n * \n * ## Example Usage\n * \n * ```typescript\n * import { SingleAssetDepositClient, AMMType } from '@steerprotocol/sdk';\n * import { parseEther } from 'viem';\n * \n * // Initialize the client\n * const client = new SingleAssetDepositClient(publicClient, walletClient);\n * \n * // Preview the deposit\n * const preview = await client.previewDeposit({\n * assets: parseEther('100'),\n * receiver: userAddress,\n * vault: vaultAddress,\n * isToken0: true,\n * depositSlippagePercent: 5n,\n * swapSlippageBP: 500,\n * ammType: AMMType.UniswapV3,\n * singleAssetDepositContract: contractAddress\n * }, poolAddress);\n * \n * if (preview.success) {\n * console.log('Expected LP tokens:', preview.data.lpEstimation.lpTokens);\n * \n * // Execute the deposit\n * const result = await client.deposit(params);\n * if (result.success) {\n * console.log('Transaction hash:', result.data);\n * }\n * }\n * ```\n * \n * ## Testing Individual Functions\n * \n * Each function can be tested separately:\n * \n * ```typescript\n * import { calculateSwapAmount, AMMType } from '@steerprotocol/sdk';\n * \n * // Test swap amount calculation\n * const result = await calculateSwapAmount(publicClient, {\n * depositAmount: parseEther('100'),\n * isToken0: true,\n * vault: vaultAddress,\n * pool: poolAddress,\n * ammType: AMMType.UniswapV3,\n * singleAssetDepositContract: contractAddress\n * });\n * ```\n */ "]}
@@ -1,9 +1,15 @@
1
- import { decodeFunctionResult, encodeFunctionData } from 'viem';
2
- import { getNetworkByChainId, getProtcolTypeByAmmType, isAlgebraIntegralProtocol } from '../../../const/index.js';
3
- import { QuoterV2Factory } from '../../../const/quoter.js';
4
- import { getPoolPrice } from '../utils.js';
5
- import { bigintToDecimal, decimalToBigint, getPoolSlot0, getQuoteFromSqrtRatioX96 } from './calculateLimitPrice.js';
6
- import { AMMType } from './types.js';
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.simulateSwap = simulateSwap;
4
+ exports.determineSwapDirection = determineSwapDirection;
5
+ exports.validateSwapParams = validateSwapParams;
6
+ exports.simulateSwapWithSlippage = simulateSwapWithSlippage;
7
+ const viem_1 = require("viem");
8
+ const index_js_1 = require("../../../const/index.js");
9
+ const quoter_js_1 = require("../../../const/quoter.js");
10
+ const utils_js_1 = require("../utils.js");
11
+ const calculateLimitPrice_js_1 = require("./calculateLimitPrice.js");
12
+ const types_js_1 = require("./types.js");
7
13
  /**
8
14
  * Simulates a swap to get the expected output amounts without executing the swap
9
15
  * Uses Uniswap V3 Quoter contract for accurate simulation
@@ -32,16 +38,16 @@ import { AMMType } from './types.js';
32
38
  * }
33
39
  * ```
34
40
  */
35
- export async function simulateSwap(publicClient, params, chainId) {
41
+ async function simulateSwap(publicClient, params, chainId) {
36
42
  try {
37
43
  // For now, only handle UniswapV3 - other AMMs can be added later
38
44
  // Get the appropriate Quoter contract address
39
- const networkConfig = getNetworkByChainId(chainId);
45
+ const networkConfig = (0, index_js_1.getNetworkByChainId)(chainId);
40
46
  if (!networkConfig) {
41
47
  throw Error('Network config not found');
42
48
  }
43
- const protocol = params.protocol || getProtcolTypeByAmmType(params.ammType);
44
- const quoterFactory = new QuoterV2Factory(networkConfig);
49
+ const protocol = params.protocol || (0, index_js_1.getProtcolTypeByAmmType)(params.ammType);
50
+ const quoterFactory = new quoter_js_1.QuoterV2Factory(networkConfig);
45
51
  const quoterABI = quoterFactory.getQuoterAbi(protocol);
46
52
  const quoteParams = quoterFactory.getQuoteParams(protocol, {
47
53
  tokenIn: params.tokenIn,
@@ -56,7 +62,7 @@ export async function simulateSwap(publicClient, params, chainId) {
56
62
  // Use Quoter's quoteExactInputSingle for simulation
57
63
  const result = await publicClient.call({
58
64
  to: quoterAddress,
59
- data: encodeFunctionData({
65
+ data: (0, viem_1.encodeFunctionData)({
60
66
  abi: quoterABI,
61
67
  functionName: 'quoteExactInputSingle',
62
68
  //@ts-expect-error Parameters are dynamic in nature and very based on abi types
@@ -71,7 +77,7 @@ export async function simulateSwap(publicClient, params, chainId) {
71
77
  // Decode the result - Different quoters return different tuple structures:
72
78
  // - Standard Uniswap/QuickSwap: [amountOut, sqrtPriceX96After, initializedTicksCrossed, gasEstimate]
73
79
  // - AlgebraIntegral: [amountOut, amountIn, sqrtPriceX96After, initializedTicksCrossed, gasEstimate, fee]
74
- const decodedResult = decodeFunctionResult({
80
+ const decodedResult = (0, viem_1.decodeFunctionResult)({
75
81
  abi: quoterABI,
76
82
  functionName: 'quoteExactInputSingle',
77
83
  data: result.data
@@ -80,7 +86,7 @@ export async function simulateSwap(publicClient, params, chainId) {
80
86
  let amountOut;
81
87
  let sqrtPriceX96After;
82
88
  // Check if this is an AlgebraIntegral protocol (which has amountIn as second return value)
83
- if (protocol && isAlgebraIntegralProtocol(protocol)) {
89
+ if (protocol && (0, index_js_1.isAlgebraIntegralProtocol)(protocol)) {
84
90
  // AlgebraIntegral format: [amountOut, amountIn, sqrtPriceX96After, ...]
85
91
  const [out, , priceAfter] = decodedResult;
86
92
  amountOut = out;
@@ -130,7 +136,7 @@ export async function simulateSwap(publicClient, params, chainId) {
130
136
  * @param isToken0 - true if depositing token0, false if token1
131
137
  * @returns true if swapping token0 → token1, false otherwise
132
138
  */
133
- export function determineSwapDirection(isToken0) {
139
+ function determineSwapDirection(isToken0) {
134
140
  // If depositing token0, we need to swap some token0 to token1
135
141
  // If depositing token1, we need to swap some token1 to token0
136
142
  return isToken0;
@@ -141,7 +147,7 @@ export function determineSwapDirection(isToken0) {
141
147
  * @param params - Parameters to validate
142
148
  * @throws Error if parameters are invalid
143
149
  */
144
- export function validateSwapParams(params) {
150
+ function validateSwapParams(params) {
145
151
  if (!params.pool || params.pool === '0x0000000000000000000000000000000000000000') {
146
152
  throw new Error('Invalid pool address');
147
153
  }
@@ -194,20 +200,20 @@ export function validateSwapParams(params) {
194
200
  * }
195
201
  * ```
196
202
  */
197
- export async function simulateSwapWithSlippage(publicClient, params, chainId) {
203
+ async function simulateSwapWithSlippage(publicClient, params, chainId) {
198
204
  try {
199
205
  // Validate params
200
206
  validateSwapWithSlippageParams(params);
201
207
  // Step 1: Get current pool state from slot0
202
- const slot0Result = await getPoolSlot0(publicClient, params.poolAddress, params.ammType);
208
+ const slot0Result = await (0, calculateLimitPrice_js_1.getPoolSlot0)(publicClient, params.poolAddress, params.ammType);
203
209
  if (!slot0Result.data) {
204
210
  throw new Error('Failed to get pool slot0 data');
205
211
  }
206
212
  // Decode slot0 result
207
213
  const currentSlot0 = {
208
- sqrtPriceX96: getPoolPrice(slot0Result.data, {
209
- isAlgebraPool: params.ammType === AMMType.Algebra,
210
- isAlgebraIntegralPool: params.ammType === AMMType.AlgebraIntegral,
214
+ sqrtPriceX96: (0, utils_js_1.getPoolPrice)(slot0Result.data, {
215
+ isAlgebraPool: params.ammType === types_js_1.AMMType.Algebra,
216
+ isAlgebraIntegralPool: params.ammType === types_js_1.AMMType.AlgebraIntegral,
211
217
  isPoolSharkPool: false // PoolShark not defined in AMMType enum
212
218
  }) || BigInt(0),
213
219
  tick: slot0Result.data.tick,
@@ -254,8 +260,8 @@ export async function simulateSwapWithSlippage(publicClient, params, chainId) {
254
260
  throw new Error(swapResult.error || 'Swap simulation failed');
255
261
  }
256
262
  // Step 3: Calculate price slippage
257
- const currentPrice = getQuoteFromSqrtRatioX96(bigintToDecimal(currentSlot0.sqrtPriceX96), bigintToDecimal(10n ** 18n), params.tokenIn, params.tokenOut);
258
- const priceAfter = getQuoteFromSqrtRatioX96(bigintToDecimal(swapResult.data.sqrtPriceX96After), bigintToDecimal(10n ** 18n), params.tokenIn, params.tokenOut);
263
+ const currentPrice = (0, calculateLimitPrice_js_1.getQuoteFromSqrtRatioX96)((0, calculateLimitPrice_js_1.bigintToDecimal)(currentSlot0.sqrtPriceX96), (0, calculateLimitPrice_js_1.bigintToDecimal)(10n ** 18n), params.tokenIn, params.tokenOut);
264
+ const priceAfter = (0, calculateLimitPrice_js_1.getQuoteFromSqrtRatioX96)((0, calculateLimitPrice_js_1.bigintToDecimal)(swapResult.data.sqrtPriceX96After), (0, calculateLimitPrice_js_1.bigintToDecimal)(10n ** 18n), params.tokenIn, params.tokenOut);
259
265
  // Calculate slippage percentage
260
266
  // Positive slippage means unfavorable price movement
261
267
  const priceSlippagePercent = calculatePriceSlippage(currentPrice, priceAfter, params.zeroForOne);
@@ -264,8 +270,8 @@ export async function simulateSwapWithSlippage(publicClient, params, chainId) {
264
270
  currentSlot0,
265
271
  swapSimulation: swapResult.data,
266
272
  priceSlippagePercent: priceSlippagePercent.toFixed(5),
267
- currentPrice: decimalToBigint(currentPrice),
268
- priceAfter: decimalToBigint(priceAfter)
273
+ currentPrice: (0, calculateLimitPrice_js_1.decimalToBigint)(currentPrice),
274
+ priceAfter: (0, calculateLimitPrice_js_1.decimalToBigint)(priceAfter)
269
275
  },
270
276
  status: 200,
271
277
  success: true
@@ -1 +1 @@
1
- {"version":3,"file":"simulateSwap.js","sourceRoot":"","sources":["../../../../../src/base/vault/single-asset/simulateSwap.ts"],"names":[],"mappings":"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","sourcesContent":["import { Decimal } from 'decimal.js';\nimport type { Address, PublicClient } from 'viem';\nimport { decodeFunctionResult, encodeFunctionData } from 'viem';\nimport { getNetworkByChainId, getProtcolTypeByAmmType, Protocol, isAlgebraIntegralProtocol } from '../../../const/index.js';\nimport { QuoterV2Factory } from '../../../const/quoter.js';\nimport { SteerResponse } from '../../../types.js';\nimport { getPoolPrice } from '../utils.js';\nimport { bigintToDecimal, decimalToBigint, getPoolSlot0, getQuoteFromSqrtRatioX96 } from './calculateLimitPrice.js';\nimport type { PoolSlot0, SimulateSwapParams, SwapSimulationResponse } from './types.js';\nimport { AMMType } from './types.js';\n\n/**\n * Simulates a swap to get the expected output amounts without executing the swap\n * Uses Uniswap V3 Quoter contract for accurate simulation\n * \n * @param publicClient - Viem public client for blockchain reads\n * @param params - Parameters for swap simulation\n * @param chainId - Chain ID to get the appropriate Quoter address\n * @returns Promise resolving to the simulated swap results\n * \n * @example\n * ```typescript\n * const result = await simulateSwap(publicClient, {\n * pool: '0x...',\n * recipient: '0x...',\n * zeroForOne: true,\n * amountSpecified: parseEther('10'),\n * sqrtPriceLimitX96: limitPrice,\n * ammType: AMMType.UniswapV3,\n * tokenIn: '0x...',\n * tokenOut: '0x...',\n * fee: 3000\n * }, 137); // Polygon chain ID\n * \n * if (result.success) {\n * console.log('Amount out:', result.data.amountOut);\n * }\n * ```\n */\nexport async function simulateSwap(\n publicClient: PublicClient,\n params: SimulateSwapParams,\n chainId: number\n): Promise<SteerResponse<SwapSimulationResponse>> {\n try {\n // For now, only handle UniswapV3 - other AMMs can be added later\n\n // Get the appropriate Quoter contract address\n\n const networkConfig = getNetworkByChainId(chainId);\n\n if (!networkConfig) {\n throw Error('Network config not found')\n }\n \n const protocol = params.protocol || getProtcolTypeByAmmType(params.ammType);\n\n const quoterFactory = new QuoterV2Factory(networkConfig);\n\n const quoterABI = quoterFactory.getQuoterAbi(protocol);\n\n const quoteParams = quoterFactory.getQuoteParams(protocol, {\n tokenIn: params.tokenIn,\n tokenOut: params.tokenOut,\n fee: params.fee,\n tickSpacing: params.tickSpacing,\n amountIn: params.amountSpecified,\n sqrtPriceLimitX96: params.sqrtPriceLimitX96,\n limitSqrtPrice: params.sqrtPriceLimitX96,\n })\n\n const quoterAddress = quoterFactory.getQuoterV2Address(\n protocol\n )\n // Use Quoter's quoteExactInputSingle for simulation\n const result = await publicClient.call({\n to: quoterAddress as Address,\n data: encodeFunctionData({\n abi: quoterABI,\n functionName: 'quoteExactInputSingle',\n //@ts-expect-error Parameters are dynamic in nature and very based on abi types\n args: [{\n ...quoteParams\n }]\n })\n });\n\n if (!result.data) {\n throw new Error('No data returned from quoter simulation');\n }\n\n // Decode the result - Different quoters return different tuple structures:\n // - Standard Uniswap/QuickSwap: [amountOut, sqrtPriceX96After, initializedTicksCrossed, gasEstimate]\n // - AlgebraIntegral: [amountOut, amountIn, sqrtPriceX96After, initializedTicksCrossed, gasEstimate, fee]\n const decodedResult = decodeFunctionResult({\n abi: quoterABI,\n functionName: 'quoteExactInputSingle',\n data: result.data\n });\n\n // Extract values based on protocol type\n let amountOut: bigint;\n let sqrtPriceX96After: bigint;\n \n // Check if this is an AlgebraIntegral protocol (which has amountIn as second return value)\n if (protocol && isAlgebraIntegralProtocol(protocol)) {\n // AlgebraIntegral format: [amountOut, amountIn, sqrtPriceX96After, ...]\n const [out, , priceAfter] = decodedResult as readonly [bigint, bigint, bigint, number, bigint, number];\n amountOut = out;\n sqrtPriceX96After = priceAfter;\n } else {\n // Standard format: [amountOut, sqrtPriceX96After, ...]\n const [out, priceAfter] = decodedResult as readonly [bigint, bigint, number, bigint];\n amountOut = out;\n sqrtPriceX96After = priceAfter;\n }\n\n // Convert to the expected SwapSimulationResponse format\n // For exact input swaps, we know the input amount and get the output amount\n let amount0: bigint, amount1: bigint;\n \n if (params.zeroForOne) {\n // Swapping token0 for token1\n amount0 = -params.amountSpecified; // negative because we're giving token0\n amount1 = amountOut; // positive because we're receiving token1\n } else {\n // Swapping token1 for token0\n amount0 = amountOut; // positive because we're receiving token0\n amount1 = -params.amountSpecified; // negative because we're giving token1\n }\n\n return {\n data: {\n amount0,\n amount1,\n sqrtPriceX96After\n },\n status: 200,\n success: true\n };\n } catch (error) {\n return {\n data: null,\n status: 500,\n success: false,\n error: error instanceof Error ? error.message : 'Failed to simulate swap'\n };\n }\n}\n\n/**\n * Determines the swap direction based on the token being deposited\n * \n * @param isToken0 - true if depositing token0, false if token1\n * @returns true if swapping token0 → token1, false otherwise\n */\nexport function determineSwapDirection(isToken0: boolean): boolean {\n // If depositing token0, we need to swap some token0 to token1\n // If depositing token1, we need to swap some token1 to token0\n return isToken0;\n}\n\n/**\n * Validates swap simulation parameters\n * \n * @param params - Parameters to validate\n * @throws Error if parameters are invalid\n */\nexport function validateSwapParams(params: SimulateSwapParams): void {\n if (!params.pool || params.pool === '0x0000000000000000000000000000000000000000') {\n throw new Error('Invalid pool address');\n }\n \n if (!params.recipient || params.recipient === '0x0000000000000000000000000000000000000000') {\n throw new Error('Invalid recipient address');\n }\n \n if (params.amountSpecified <= 0n) {\n throw new Error('Amount specified must be greater than 0');\n }\n \n if (params.sqrtPriceLimitX96 <= 0n) {\n throw new Error('Sqrt price limit must be greater than 0');\n }\n\n if (!params.tokenIn || params.tokenIn === '0x0000000000000000000000000000000000000000') {\n throw new Error('Invalid tokenIn address');\n }\n\n if (!params.tokenOut || params.tokenOut === '0x0000000000000000000000000000000000000000') {\n throw new Error('Invalid tokenOut address');\n }\n\n if (params.fee <= 0) {\n throw new Error('Pool fee must be greater than 0');\n }\n} \n\n/**\n * Parameters for swap with slippage analysis\n */\nexport interface SwapWithSlippageParams {\n /** Address of the pool */\n poolAddress: string;\n /** Address that will receive the swap output (or address(this) for simulation) */\n recipient: string;\n /** true if swapping token0 → token1, else false */\n zeroForOne: boolean;\n /** Amount to swap */\n amountSpecified: bigint;\n /** Slippage-adjusted limit price */\n sqrtPriceLimitX96: bigint;\n /** AMM type */\n ammType: AMMType;\n /** Input token address (required for Quoter) */\n tokenIn: string;\n /** Output token address (required for Quoter) */\n tokenOut: string;\n /** Pool fee (required for Quoter) */\n fee: number;\n /** Quoter contract address (optional - will use default if not provided) */\n quoterAddress?: string;\n /** Protocol */\n protocol?: Protocol | null;\n}\n\n/**\n * Response from swap simulation with slippage analysis\n */\nexport interface SwapWithSlippageResponse {\n /** Current pool slot0 data */\n currentSlot0: PoolSlot0;\n /** Swap simulation results */\n swapSimulation: SwapSimulationResponse;\n /** Price slippage percentage (positive means price moved unfavorably) */\n priceSlippagePercent: string;\n /** Current price (derived from sqrtPriceX96) */\n currentPrice: bigint;\n /** Price after swap (derived from sqrtPriceX96After) */\n priceAfter: bigint;\n}\n\n/**\n * Simulates a swap with slippage analysis by first getting current pool state,\n * then simulating the swap and calculating price impact\n * \n * @param publicClient - Viem public client for blockchain reads\n * @param params - Parameters for swap simulation with slippage analysis\n * @param chainId - Chain ID to get the appropriate Quoter address\n * @returns Promise resolving to swap results with slippage analysis\n * \n * @example\n * ```typescript\n * const result = await simulateSwapWithSlippage(publicClient, {\n * poolAddress: '0x...',\n * recipient: '0x...',\n * zeroForOne: true,\n * amountSpecified: parseEther('10'),\n * sqrtPriceLimitX96: limitPrice,\n * ammType: AMMType.UniswapV3,\n * tokenIn: '0x...',\n * tokenOut: '0x...',\n * fee: 3000\n * }, 137); // Polygon chain ID\n * \n * if (result.success) {\n * console.log('Price slippage:', result.data.priceSlippagePercent, '%');\n * console.log('Current price:', result.data.currentPrice);\n * console.log('Price after swap:', result.data.priceAfter);\n * }\n * ```\n */\nexport async function simulateSwapWithSlippage(\n publicClient: PublicClient,\n params: SwapWithSlippageParams,\n chainId: number\n): Promise<SteerResponse<SwapWithSlippageResponse>> {\n try {\n // Validate params\n validateSwapWithSlippageParams(params);\n\n // Step 1: Get current pool state from slot0\n\n const slot0Result = await getPoolSlot0(\n publicClient,\n params.poolAddress as `0x${string}`,\n params.ammType\n )\n\n if (!slot0Result.data) {\n throw new Error('Failed to get pool slot0 data');\n }\n\n // Decode slot0 result\n const currentSlot0: PoolSlot0 = {\n sqrtPriceX96: getPoolPrice(slot0Result.data, {\n isAlgebraPool: params.ammType === AMMType.Algebra,\n isAlgebraIntegralPool: params.ammType === AMMType.AlgebraIntegral,\n isPoolSharkPool: false // PoolShark not defined in AMMType enum\n }) || BigInt(0),\n tick: slot0Result.data.tick,\n observationIndex: slot0Result.data.observationIndex,\n observationCardinality: slot0Result.data.observationCardinality,\n observationCardinalityNext: slot0Result.data.observationCardinalityNext,\n feeProtocol: slot0Result.data.feeProtocol,\n unlocked: slot0Result.data.unlocked\n };\n\n const tickSpacing = await publicClient.readContract({\n abi: [ {\n \"inputs\": [],\n \"name\": \"tickSpacing\",\n \"outputs\": [\n {\n \"internalType\": \"int24\",\n \"name\": \"\",\n \"type\": \"int24\"\n }\n ],\n \"stateMutability\": \"view\",\n \"type\": \"function\"\n },],\n functionName: 'tickSpacing',\n address: params.poolAddress as `0x${string}`,\n })\n\n // Step 2: Simulate the swap using existing function\n const swapParams: SimulateSwapParams = {\n pool: params.poolAddress as `0x${string}`,\n recipient: params.recipient as `0x${string}`,\n zeroForOne: params.zeroForOne,\n amountSpecified: params.amountSpecified,\n sqrtPriceLimitX96: params.sqrtPriceLimitX96,\n ammType: params.ammType,\n tokenIn: params.tokenIn as `0x${string}`,\n tokenOut: params.tokenOut as `0x${string}`,\n fee: params.fee,\n tickSpacing: tickSpacing,\n quoterAddress: params.quoterAddress as `0x${string}` | undefined,\n protocol: params.protocol\n };\n\n const swapResult = await simulateSwap(publicClient, swapParams, chainId);\n\n if (!swapResult.success || !swapResult.data) {\n throw new Error(swapResult.error || 'Swap simulation failed');\n }\n\n // Step 3: Calculate price slippage\n const currentPrice = getQuoteFromSqrtRatioX96(\n bigintToDecimal(currentSlot0.sqrtPriceX96),\n bigintToDecimal(10n**18n),\n params.tokenIn as `0x${string}`,\n params.tokenOut as `0x${string}`\n );\n const priceAfter = getQuoteFromSqrtRatioX96(\n bigintToDecimal(swapResult.data.sqrtPriceX96After),\n bigintToDecimal(10n**18n),\n params.tokenIn as `0x${string}`,\n params.tokenOut as `0x${string}`\n );\n \n // Calculate slippage percentage\n // Positive slippage means unfavorable price movement\n const priceSlippagePercent = calculatePriceSlippage(\n currentPrice,\n priceAfter,\n params.zeroForOne\n );\n\n return {\n data: {\n currentSlot0,\n swapSimulation: swapResult.data,\n priceSlippagePercent: priceSlippagePercent.toFixed(5),\n currentPrice: decimalToBigint(currentPrice),\n priceAfter: decimalToBigint(priceAfter)\n },\n status: 200,\n success: true\n };\n } catch (error) {\n return {\n data: null,\n status: 500,\n success: false,\n error: error instanceof Error ? error.message : 'Failed to simulate swap with slippage'\n };\n }\n}\n\n/**\n * Calculates price slippage percentage using Decimal.js\n * \n * @param priceBefore - Price before the swap (Decimal)\n * @param priceAfter - Price after the swap (Decimal)\n * @param zeroForOne - Swap direction (true if token0 → token1)\n * @returns Slippage percentage (positive means unfavorable movement)\n */\nfunction calculatePriceSlippage(\n priceBefore: Decimal,\n priceAfter: Decimal,\n zeroForOne: boolean\n): Decimal {\n if (priceBefore.isZero()) {\n throw new Error('Price before cannot be zero');\n }\n\n const priceChange = priceAfter.minus(priceBefore).dividedBy(priceBefore).times(100);\n \n // For zeroForOne swaps (selling token0), favorable movement is price going down\n // For oneForZero swaps (selling token1), favorable movement is price going up\n // We return positive values for unfavorable movement (slippage)\n return zeroForOne ? priceChange : priceChange.negated();\n}\n\n/**\n * Validates swap with slippage parameters\n * \n * @param params - Parameters to validate\n * @throws Error if parameters are invalid\n */\nfunction validateSwapWithSlippageParams(params: SwapWithSlippageParams): void {\n if (!params.poolAddress || params.poolAddress === '0x0000000000000000000000000000000000000000') {\n throw new Error('Invalid pool address');\n }\n \n if (!params.recipient || params.recipient === '0x0000000000000000000000000000000000000000') {\n throw new Error('Invalid recipient address');\n }\n \n if (params.amountSpecified <= 0n) {\n throw new Error('Amount specified must be greater than 0');\n }\n \n if (params.sqrtPriceLimitX96 <= 0n) {\n throw new Error('Sqrt price limit must be greater than 0');\n }\n\n if (!params.tokenIn || params.tokenIn === '0x0000000000000000000000000000000000000000') {\n throw new Error('Invalid tokenIn address');\n }\n\n if (!params.tokenOut || params.tokenOut === '0x0000000000000000000000000000000000000000') {\n throw new Error('Invalid tokenOut address');\n }\n\n if (params.fee <= 0) {\n throw new Error('Pool fee must be greater than 0');\n }\n} "]}
1
+ {"version":3,"file":"simulateSwap.js","sourceRoot":"","sources":["../../../../../src/base/vault/single-asset/simulateSwap.ts"],"names":[],"mappings":";;AAuCA,oCA6GC;AAQD,wDAIC;AAQD,gDA4BC;AA4ED,4DAqHC;AAnYD,+BAAgE;AAChE,sDAA4H;AAC5H,wDAA2D;AAE3D,0CAA2C;AAC3C,qEAAoH;AAEpH,yCAAqC;AAErC;;;;;;;;;;;;;;;;;;;;;;;;;;;GA2BG;AACI,KAAK,UAAU,YAAY,CAChC,YAA0B,EAC1B,MAA0B,EAC1B,OAAe;IAEf,IAAI,CAAC;QACH,iEAAiE;QAEjE,8CAA8C;QAE9C,MAAM,aAAa,GAAG,IAAA,8BAAmB,EAAC,OAAO,CAAC,CAAC;QAEnD,IAAI,CAAC,aAAa,EAAE,CAAC;YACnB,MAAM,KAAK,CAAC,0BAA0B,CAAC,CAAA;QACzC,CAAC;QAED,MAAM,QAAQ,GAAG,MAAM,CAAC,QAAQ,IAAI,IAAA,kCAAuB,EAAC,MAAM,CAAC,OAAO,CAAC,CAAC;QAE5E,MAAM,aAAa,GAAG,IAAI,2BAAe,CAAC,aAAa,CAAC,CAAC;QAEzD,MAAM,SAAS,GAAG,aAAa,CAAC,YAAY,CAAC,QAAQ,CAAC,CAAC;QAEvD,MAAM,WAAW,GAAG,aAAa,CAAC,cAAc,CAAC,QAAQ,EAAE;YACzD,OAAO,EAAE,MAAM,CAAC,OAAO;YACvB,QAAQ,EAAE,MAAM,CAAC,QAAQ;YACzB,GAAG,EAAE,MAAM,CAAC,GAAG;YACf,WAAW,EAAE,MAAM,CAAC,WAAW;YAC/B,QAAQ,EAAE,MAAM,CAAC,eAAe;YAChC,iBAAiB,EAAE,MAAM,CAAC,iBAAiB;YAC3C,cAAc,EAAE,MAAM,CAAC,iBAAiB;SACzC,CAAC,CAAA;QAEF,MAAM,aAAa,GAAG,aAAa,CAAC,kBAAkB,CACpD,QAAQ,CACT,CAAA;QACD,oDAAoD;QACpD,MAAM,MAAM,GAAG,MAAM,YAAY,CAAC,IAAI,CAAC;YACrC,EAAE,EAAE,aAAwB;YAC5B,IAAI,EAAE,IAAA,yBAAkB,EAAC;gBACvB,GAAG,EAAE,SAAS;gBACd,YAAY,EAAE,uBAAuB;gBACrC,+EAA+E;gBAC/E,IAAI,EAAE,CAAC;wBACL,GAAG,WAAW;qBACf,CAAC;aACH,CAAC;SACH,CAAC,CAAC;QAEH,IAAI,CAAC,MAAM,CAAC,IAAI,EAAE,CAAC;YACjB,MAAM,IAAI,KAAK,CAAC,yCAAyC,CAAC,CAAC;QAC7D,CAAC;QAED,2EAA2E;QAC3E,qGAAqG;QACrG,yGAAyG;QACzG,MAAM,aAAa,GAAG,IAAA,2BAAoB,EAAC;YACzC,GAAG,EAAE,SAAS;YACd,YAAY,EAAE,uBAAuB;YACrC,IAAI,EAAE,MAAM,CAAC,IAAI;SAClB,CAAC,CAAC;QAEH,wCAAwC;QACxC,IAAI,SAAiB,CAAC;QACtB,IAAI,iBAAyB,CAAC;QAE9B,2FAA2F;QAC3F,IAAI,QAAQ,IAAI,IAAA,oCAAyB,EAAC,QAAQ,CAAC,EAAE,CAAC;YACpD,wEAAwE;YACxE,MAAM,CAAC,GAAG,EAAE,AAAD,EAAG,UAAU,CAAC,GAAG,aAA0E,CAAC;YACvG,SAAS,GAAG,GAAG,CAAC;YAChB,iBAAiB,GAAG,UAAU,CAAC;QACjC,CAAC;aAAM,CAAC;YACN,uDAAuD;YACvD,MAAM,CAAC,GAAG,EAAE,UAAU,CAAC,GAAG,aAA0D,CAAC;YACrF,SAAS,GAAG,GAAG,CAAC;YAChB,iBAAiB,GAAG,UAAU,CAAC;QACjC,CAAC;QAED,wDAAwD;QACxD,4EAA4E;QAC5E,IAAI,OAAe,EAAE,OAAe,CAAC;QAErC,IAAI,MAAM,CAAC,UAAU,EAAE,CAAC;YACtB,6BAA6B;YAC7B,OAAO,GAAG,CAAC,MAAM,CAAC,eAAe,CAAC,CAAC,uCAAuC;YAC1E,OAAO,GAAG,SAAS,CAAC,CAAC,0CAA0C;QACjE,CAAC;aAAM,CAAC;YACN,6BAA6B;YAC7B,OAAO,GAAG,SAAS,CAAC,CAAC,0CAA0C;YAC/D,OAAO,GAAG,CAAC,MAAM,CAAC,eAAe,CAAC,CAAC,uCAAuC;QAC5E,CAAC;QAED,OAAO;YACL,IAAI,EAAE;gBACJ,OAAO;gBACP,OAAO;gBACP,iBAAiB;aAClB;YACD,MAAM,EAAE,GAAG;YACX,OAAO,EAAE,IAAI;SACd,CAAC;IACJ,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QACf,OAAO;YACL,IAAI,EAAE,IAAI;YACV,MAAM,EAAE,GAAG;YACX,OAAO,EAAE,KAAK;YACd,KAAK,EAAE,KAAK,YAAY,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,yBAAyB;SAC1E,CAAC;IACJ,CAAC;AACH,CAAC;AAED;;;;;GAKG;AACH,SAAgB,sBAAsB,CAAC,QAAiB;IACtD,8DAA8D;IAC9D,8DAA8D;IAC9D,OAAO,QAAQ,CAAC;AAClB,CAAC;AAED;;;;;GAKG;AACH,SAAgB,kBAAkB,CAAC,MAA0B;IAC3D,IAAI,CAAC,MAAM,CAAC,IAAI,IAAI,MAAM,CAAC,IAAI,KAAK,4CAA4C,EAAE,CAAC;QACjF,MAAM,IAAI,KAAK,CAAC,sBAAsB,CAAC,CAAC;IAC1C,CAAC;IAED,IAAI,CAAC,MAAM,CAAC,SAAS,IAAI,MAAM,CAAC,SAAS,KAAK,4CAA4C,EAAE,CAAC;QAC3F,MAAM,IAAI,KAAK,CAAC,2BAA2B,CAAC,CAAC;IAC/C,CAAC;IAED,IAAI,MAAM,CAAC,eAAe,IAAI,EAAE,EAAE,CAAC;QACjC,MAAM,IAAI,KAAK,CAAC,yCAAyC,CAAC,CAAC;IAC7D,CAAC;IAED,IAAI,MAAM,CAAC,iBAAiB,IAAI,EAAE,EAAE,CAAC;QACnC,MAAM,IAAI,KAAK,CAAC,yCAAyC,CAAC,CAAC;IAC7D,CAAC;IAED,IAAI,CAAC,MAAM,CAAC,OAAO,IAAI,MAAM,CAAC,OAAO,KAAK,4CAA4C,EAAE,CAAC;QACvF,MAAM,IAAI,KAAK,CAAC,yBAAyB,CAAC,CAAC;IAC7C,CAAC;IAED,IAAI,CAAC,MAAM,CAAC,QAAQ,IAAI,MAAM,CAAC,QAAQ,KAAK,4CAA4C,EAAE,CAAC;QACzF,MAAM,IAAI,KAAK,CAAC,0BAA0B,CAAC,CAAC;IAC9C,CAAC;IAED,IAAI,MAAM,CAAC,GAAG,IAAI,CAAC,EAAE,CAAC;QACpB,MAAM,IAAI,KAAK,CAAC,iCAAiC,CAAC,CAAC;IACrD,CAAC;AACH,CAAC;AA8CD;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA6BG;AACI,KAAK,UAAU,wBAAwB,CAC5C,YAA0B,EAC1B,MAA8B,EAC9B,OAAe;IAEf,IAAI,CAAC;QACH,kBAAkB;QAClB,8BAA8B,CAAC,MAAM,CAAC,CAAC;QAEvC,4CAA4C;QAE5C,MAAM,WAAW,GAAG,MAAM,IAAA,qCAAY,EACpC,YAAY,EACZ,MAAM,CAAC,WAA4B,EACnC,MAAM,CAAC,OAAO,CACf,CAAA;QAED,IAAI,CAAC,WAAW,CAAC,IAAI,EAAE,CAAC;YACtB,MAAM,IAAI,KAAK,CAAC,+BAA+B,CAAC,CAAC;QACnD,CAAC;QAED,sBAAsB;QACtB,MAAM,YAAY,GAAc;YAC9B,YAAY,EAAE,IAAA,uBAAY,EAAC,WAAW,CAAC,IAAI,EAAE;gBAC3C,aAAa,EAAE,MAAM,CAAC,OAAO,KAAK,kBAAO,CAAC,OAAO;gBACjD,qBAAqB,EAAE,MAAM,CAAC,OAAO,KAAK,kBAAO,CAAC,eAAe;gBACjE,eAAe,EAAE,KAAK,CAAC,wCAAwC;aAChE,CAAC,IAAI,MAAM,CAAC,CAAC,CAAC;YACf,IAAI,EAAE,WAAW,CAAC,IAAI,CAAC,IAAI;YAC3B,gBAAgB,EAAE,WAAW,CAAC,IAAI,CAAC,gBAAgB;YACnD,sBAAsB,EAAE,WAAW,CAAC,IAAI,CAAC,sBAAsB;YAC/D,0BAA0B,EAAE,WAAW,CAAC,IAAI,CAAC,0BAA0B;YACvE,WAAW,EAAE,WAAW,CAAC,IAAI,CAAC,WAAW;YACzC,QAAQ,EAAE,WAAW,CAAC,IAAI,CAAC,QAAQ;SACpC,CAAC;QAEF,MAAM,WAAW,GAAG,MAAM,YAAY,CAAC,YAAY,CAAC;YAClD,GAAG,EAAE,CAAG;oBACN,QAAQ,EAAE,EAAE;oBACZ,MAAM,EAAE,aAAa;oBACrB,SAAS,EAAE;wBACT;4BACE,cAAc,EAAE,OAAO;4BACvB,MAAM,EAAE,EAAE;4BACV,MAAM,EAAE,OAAO;yBAChB;qBACF;oBACD,iBAAiB,EAAE,MAAM;oBACzB,MAAM,EAAE,UAAU;iBACnB,EAAE;YACH,YAAY,EAAE,aAAa;YAC3B,OAAO,EAAE,MAAM,CAAC,WAA4B;SAC7C,CAAC,CAAA;QAEF,oDAAoD;QACpD,MAAM,UAAU,GAAuB;YACrC,IAAI,EAAE,MAAM,CAAC,WAA4B;YACzC,SAAS,EAAE,MAAM,CAAC,SAA0B;YAC5C,UAAU,EAAE,MAAM,CAAC,UAAU;YAC7B,eAAe,EAAE,MAAM,CAAC,eAAe;YACvC,iBAAiB,EAAE,MAAM,CAAC,iBAAiB;YAC3C,OAAO,EAAE,MAAM,CAAC,OAAO;YACvB,OAAO,EAAE,MAAM,CAAC,OAAwB;YACxC,QAAQ,EAAE,MAAM,CAAC,QAAyB;YAC1C,GAAG,EAAE,MAAM,CAAC,GAAG;YACf,WAAW,EAAE,WAAW;YACxB,aAAa,EAAE,MAAM,CAAC,aAA0C;YAChE,QAAQ,EAAE,MAAM,CAAC,QAAQ;SAC1B,CAAC;QAEF,MAAM,UAAU,GAAG,MAAM,YAAY,CAAC,YAAY,EAAE,UAAU,EAAE,OAAO,CAAC,CAAC;QAEzE,IAAI,CAAC,UAAU,CAAC,OAAO,IAAI,CAAC,UAAU,CAAC,IAAI,EAAE,CAAC;YAC5C,MAAM,IAAI,KAAK,CAAC,UAAU,CAAC,KAAK,IAAI,wBAAwB,CAAC,CAAC;QAChE,CAAC;QAED,mCAAmC;QACnC,MAAM,YAAY,GAAG,IAAA,iDAAwB,EAC3C,IAAA,wCAAe,EAAC,YAAY,CAAC,YAAY,CAAC,EAC1C,IAAA,wCAAe,EAAC,GAAG,IAAE,GAAG,CAAC,EACzB,MAAM,CAAC,OAAwB,EAC/B,MAAM,CAAC,QAAyB,CACjC,CAAC;QACF,MAAM,UAAU,GAAG,IAAA,iDAAwB,EACzC,IAAA,wCAAe,EAAC,UAAU,CAAC,IAAI,CAAC,iBAAiB,CAAC,EAClD,IAAA,wCAAe,EAAC,GAAG,IAAE,GAAG,CAAC,EACzB,MAAM,CAAC,OAAwB,EAC/B,MAAM,CAAC,QAAyB,CACjC,CAAC;QAEF,gCAAgC;QAChC,qDAAqD;QACrD,MAAM,oBAAoB,GAAG,sBAAsB,CACjD,YAAY,EACZ,UAAU,EACV,MAAM,CAAC,UAAU,CAClB,CAAC;QAEF,OAAO;YACL,IAAI,EAAE;gBACJ,YAAY;gBACZ,cAAc,EAAE,UAAU,CAAC,IAAI;gBAC/B,oBAAoB,EAAE,oBAAoB,CAAC,OAAO,CAAC,CAAC,CAAC;gBACrD,YAAY,EAAE,IAAA,wCAAe,EAAC,YAAY,CAAC;gBAC3C,UAAU,EAAE,IAAA,wCAAe,EAAC,UAAU,CAAC;aACxC;YACD,MAAM,EAAE,GAAG;YACX,OAAO,EAAE,IAAI;SACd,CAAC;IACJ,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QACf,OAAO;YACL,IAAI,EAAE,IAAI;YACV,MAAM,EAAE,GAAG;YACX,OAAO,EAAE,KAAK;YACd,KAAK,EAAE,KAAK,YAAY,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,uCAAuC;SACxF,CAAC;IACJ,CAAC;AACH,CAAC;AAED;;;;;;;GAOG;AACH,SAAS,sBAAsB,CAC7B,WAAoB,EACpB,UAAmB,EACnB,UAAmB;IAEnB,IAAI,WAAW,CAAC,MAAM,EAAE,EAAE,CAAC;QACzB,MAAM,IAAI,KAAK,CAAC,6BAA6B,CAAC,CAAC;IACjD,CAAC;IAED,MAAM,WAAW,GAAG,UAAU,CAAC,KAAK,CAAC,WAAW,CAAC,CAAC,SAAS,CAAC,WAAW,CAAC,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC;IAEpF,gFAAgF;IAChF,8EAA8E;IAC9E,gEAAgE;IAChE,OAAO,UAAU,CAAC,CAAC,CAAC,WAAW,CAAC,CAAC,CAAC,WAAW,CAAC,OAAO,EAAE,CAAC;AAC1D,CAAC;AAED;;;;;GAKG;AACH,SAAS,8BAA8B,CAAC,MAA8B;IACpE,IAAI,CAAC,MAAM,CAAC,WAAW,IAAI,MAAM,CAAC,WAAW,KAAK,4CAA4C,EAAE,CAAC;QAC/F,MAAM,IAAI,KAAK,CAAC,sBAAsB,CAAC,CAAC;IAC1C,CAAC;IAED,IAAI,CAAC,MAAM,CAAC,SAAS,IAAI,MAAM,CAAC,SAAS,KAAK,4CAA4C,EAAE,CAAC;QAC3F,MAAM,IAAI,KAAK,CAAC,2BAA2B,CAAC,CAAC;IAC/C,CAAC;IAED,IAAI,MAAM,CAAC,eAAe,IAAI,EAAE,EAAE,CAAC;QACjC,MAAM,IAAI,KAAK,CAAC,yCAAyC,CAAC,CAAC;IAC7D,CAAC;IAED,IAAI,MAAM,CAAC,iBAAiB,IAAI,EAAE,EAAE,CAAC;QACnC,MAAM,IAAI,KAAK,CAAC,yCAAyC,CAAC,CAAC;IAC7D,CAAC;IAED,IAAI,CAAC,MAAM,CAAC,OAAO,IAAI,MAAM,CAAC,OAAO,KAAK,4CAA4C,EAAE,CAAC;QACvF,MAAM,IAAI,KAAK,CAAC,yBAAyB,CAAC,CAAC;IAC7C,CAAC;IAED,IAAI,CAAC,MAAM,CAAC,QAAQ,IAAI,MAAM,CAAC,QAAQ,KAAK,4CAA4C,EAAE,CAAC;QACzF,MAAM,IAAI,KAAK,CAAC,0BAA0B,CAAC,CAAC;IAC9C,CAAC;IAED,IAAI,MAAM,CAAC,GAAG,IAAI,CAAC,EAAE,CAAC;QACpB,MAAM,IAAI,KAAK,CAAC,iCAAiC,CAAC,CAAC;IACrD,CAAC;AACH,CAAC","sourcesContent":["import { Decimal } from 'decimal.js';\nimport type { Address, PublicClient } from 'viem';\nimport { decodeFunctionResult, encodeFunctionData } from 'viem';\nimport { getNetworkByChainId, getProtcolTypeByAmmType, Protocol, isAlgebraIntegralProtocol } from '../../../const/index.js';\nimport { QuoterV2Factory } from '../../../const/quoter.js';\nimport { SteerResponse } from '../../../types.js';\nimport { getPoolPrice } from '../utils.js';\nimport { bigintToDecimal, decimalToBigint, getPoolSlot0, getQuoteFromSqrtRatioX96 } from './calculateLimitPrice.js';\nimport type { PoolSlot0, SimulateSwapParams, SwapSimulationResponse } from './types.js';\nimport { AMMType } from './types.js';\n\n/**\n * Simulates a swap to get the expected output amounts without executing the swap\n * Uses Uniswap V3 Quoter contract for accurate simulation\n * \n * @param publicClient - Viem public client for blockchain reads\n * @param params - Parameters for swap simulation\n * @param chainId - Chain ID to get the appropriate Quoter address\n * @returns Promise resolving to the simulated swap results\n * \n * @example\n * ```typescript\n * const result = await simulateSwap(publicClient, {\n * pool: '0x...',\n * recipient: '0x...',\n * zeroForOne: true,\n * amountSpecified: parseEther('10'),\n * sqrtPriceLimitX96: limitPrice,\n * ammType: AMMType.UniswapV3,\n * tokenIn: '0x...',\n * tokenOut: '0x...',\n * fee: 3000\n * }, 137); // Polygon chain ID\n * \n * if (result.success) {\n * console.log('Amount out:', result.data.amountOut);\n * }\n * ```\n */\nexport async function simulateSwap(\n publicClient: PublicClient,\n params: SimulateSwapParams,\n chainId: number\n): Promise<SteerResponse<SwapSimulationResponse>> {\n try {\n // For now, only handle UniswapV3 - other AMMs can be added later\n\n // Get the appropriate Quoter contract address\n\n const networkConfig = getNetworkByChainId(chainId);\n\n if (!networkConfig) {\n throw Error('Network config not found')\n }\n \n const protocol = params.protocol || getProtcolTypeByAmmType(params.ammType);\n\n const quoterFactory = new QuoterV2Factory(networkConfig);\n\n const quoterABI = quoterFactory.getQuoterAbi(protocol);\n\n const quoteParams = quoterFactory.getQuoteParams(protocol, {\n tokenIn: params.tokenIn,\n tokenOut: params.tokenOut,\n fee: params.fee,\n tickSpacing: params.tickSpacing,\n amountIn: params.amountSpecified,\n sqrtPriceLimitX96: params.sqrtPriceLimitX96,\n limitSqrtPrice: params.sqrtPriceLimitX96,\n })\n\n const quoterAddress = quoterFactory.getQuoterV2Address(\n protocol\n )\n // Use Quoter's quoteExactInputSingle for simulation\n const result = await publicClient.call({\n to: quoterAddress as Address,\n data: encodeFunctionData({\n abi: quoterABI,\n functionName: 'quoteExactInputSingle',\n //@ts-expect-error Parameters are dynamic in nature and very based on abi types\n args: [{\n ...quoteParams\n }]\n })\n });\n\n if (!result.data) {\n throw new Error('No data returned from quoter simulation');\n }\n\n // Decode the result - Different quoters return different tuple structures:\n // - Standard Uniswap/QuickSwap: [amountOut, sqrtPriceX96After, initializedTicksCrossed, gasEstimate]\n // - AlgebraIntegral: [amountOut, amountIn, sqrtPriceX96After, initializedTicksCrossed, gasEstimate, fee]\n const decodedResult = decodeFunctionResult({\n abi: quoterABI,\n functionName: 'quoteExactInputSingle',\n data: result.data\n });\n\n // Extract values based on protocol type\n let amountOut: bigint;\n let sqrtPriceX96After: bigint;\n \n // Check if this is an AlgebraIntegral protocol (which has amountIn as second return value)\n if (protocol && isAlgebraIntegralProtocol(protocol)) {\n // AlgebraIntegral format: [amountOut, amountIn, sqrtPriceX96After, ...]\n const [out, , priceAfter] = decodedResult as readonly [bigint, bigint, bigint, number, bigint, number];\n amountOut = out;\n sqrtPriceX96After = priceAfter;\n } else {\n // Standard format: [amountOut, sqrtPriceX96After, ...]\n const [out, priceAfter] = decodedResult as readonly [bigint, bigint, number, bigint];\n amountOut = out;\n sqrtPriceX96After = priceAfter;\n }\n\n // Convert to the expected SwapSimulationResponse format\n // For exact input swaps, we know the input amount and get the output amount\n let amount0: bigint, amount1: bigint;\n \n if (params.zeroForOne) {\n // Swapping token0 for token1\n amount0 = -params.amountSpecified; // negative because we're giving token0\n amount1 = amountOut; // positive because we're receiving token1\n } else {\n // Swapping token1 for token0\n amount0 = amountOut; // positive because we're receiving token0\n amount1 = -params.amountSpecified; // negative because we're giving token1\n }\n\n return {\n data: {\n amount0,\n amount1,\n sqrtPriceX96After\n },\n status: 200,\n success: true\n };\n } catch (error) {\n return {\n data: null,\n status: 500,\n success: false,\n error: error instanceof Error ? error.message : 'Failed to simulate swap'\n };\n }\n}\n\n/**\n * Determines the swap direction based on the token being deposited\n * \n * @param isToken0 - true if depositing token0, false if token1\n * @returns true if swapping token0 → token1, false otherwise\n */\nexport function determineSwapDirection(isToken0: boolean): boolean {\n // If depositing token0, we need to swap some token0 to token1\n // If depositing token1, we need to swap some token1 to token0\n return isToken0;\n}\n\n/**\n * Validates swap simulation parameters\n * \n * @param params - Parameters to validate\n * @throws Error if parameters are invalid\n */\nexport function validateSwapParams(params: SimulateSwapParams): void {\n if (!params.pool || params.pool === '0x0000000000000000000000000000000000000000') {\n throw new Error('Invalid pool address');\n }\n \n if (!params.recipient || params.recipient === '0x0000000000000000000000000000000000000000') {\n throw new Error('Invalid recipient address');\n }\n \n if (params.amountSpecified <= 0n) {\n throw new Error('Amount specified must be greater than 0');\n }\n \n if (params.sqrtPriceLimitX96 <= 0n) {\n throw new Error('Sqrt price limit must be greater than 0');\n }\n\n if (!params.tokenIn || params.tokenIn === '0x0000000000000000000000000000000000000000') {\n throw new Error('Invalid tokenIn address');\n }\n\n if (!params.tokenOut || params.tokenOut === '0x0000000000000000000000000000000000000000') {\n throw new Error('Invalid tokenOut address');\n }\n\n if (params.fee <= 0) {\n throw new Error('Pool fee must be greater than 0');\n }\n} \n\n/**\n * Parameters for swap with slippage analysis\n */\nexport interface SwapWithSlippageParams {\n /** Address of the pool */\n poolAddress: string;\n /** Address that will receive the swap output (or address(this) for simulation) */\n recipient: string;\n /** true if swapping token0 → token1, else false */\n zeroForOne: boolean;\n /** Amount to swap */\n amountSpecified: bigint;\n /** Slippage-adjusted limit price */\n sqrtPriceLimitX96: bigint;\n /** AMM type */\n ammType: AMMType;\n /** Input token address (required for Quoter) */\n tokenIn: string;\n /** Output token address (required for Quoter) */\n tokenOut: string;\n /** Pool fee (required for Quoter) */\n fee: number;\n /** Quoter contract address (optional - will use default if not provided) */\n quoterAddress?: string;\n /** Protocol */\n protocol?: Protocol | null;\n}\n\n/**\n * Response from swap simulation with slippage analysis\n */\nexport interface SwapWithSlippageResponse {\n /** Current pool slot0 data */\n currentSlot0: PoolSlot0;\n /** Swap simulation results */\n swapSimulation: SwapSimulationResponse;\n /** Price slippage percentage (positive means price moved unfavorably) */\n priceSlippagePercent: string;\n /** Current price (derived from sqrtPriceX96) */\n currentPrice: bigint;\n /** Price after swap (derived from sqrtPriceX96After) */\n priceAfter: bigint;\n}\n\n/**\n * Simulates a swap with slippage analysis by first getting current pool state,\n * then simulating the swap and calculating price impact\n * \n * @param publicClient - Viem public client for blockchain reads\n * @param params - Parameters for swap simulation with slippage analysis\n * @param chainId - Chain ID to get the appropriate Quoter address\n * @returns Promise resolving to swap results with slippage analysis\n * \n * @example\n * ```typescript\n * const result = await simulateSwapWithSlippage(publicClient, {\n * poolAddress: '0x...',\n * recipient: '0x...',\n * zeroForOne: true,\n * amountSpecified: parseEther('10'),\n * sqrtPriceLimitX96: limitPrice,\n * ammType: AMMType.UniswapV3,\n * tokenIn: '0x...',\n * tokenOut: '0x...',\n * fee: 3000\n * }, 137); // Polygon chain ID\n * \n * if (result.success) {\n * console.log('Price slippage:', result.data.priceSlippagePercent, '%');\n * console.log('Current price:', result.data.currentPrice);\n * console.log('Price after swap:', result.data.priceAfter);\n * }\n * ```\n */\nexport async function simulateSwapWithSlippage(\n publicClient: PublicClient,\n params: SwapWithSlippageParams,\n chainId: number\n): Promise<SteerResponse<SwapWithSlippageResponse>> {\n try {\n // Validate params\n validateSwapWithSlippageParams(params);\n\n // Step 1: Get current pool state from slot0\n\n const slot0Result = await getPoolSlot0(\n publicClient,\n params.poolAddress as `0x${string}`,\n params.ammType\n )\n\n if (!slot0Result.data) {\n throw new Error('Failed to get pool slot0 data');\n }\n\n // Decode slot0 result\n const currentSlot0: PoolSlot0 = {\n sqrtPriceX96: getPoolPrice(slot0Result.data, {\n isAlgebraPool: params.ammType === AMMType.Algebra,\n isAlgebraIntegralPool: params.ammType === AMMType.AlgebraIntegral,\n isPoolSharkPool: false // PoolShark not defined in AMMType enum\n }) || BigInt(0),\n tick: slot0Result.data.tick,\n observationIndex: slot0Result.data.observationIndex,\n observationCardinality: slot0Result.data.observationCardinality,\n observationCardinalityNext: slot0Result.data.observationCardinalityNext,\n feeProtocol: slot0Result.data.feeProtocol,\n unlocked: slot0Result.data.unlocked\n };\n\n const tickSpacing = await publicClient.readContract({\n abi: [ {\n \"inputs\": [],\n \"name\": \"tickSpacing\",\n \"outputs\": [\n {\n \"internalType\": \"int24\",\n \"name\": \"\",\n \"type\": \"int24\"\n }\n ],\n \"stateMutability\": \"view\",\n \"type\": \"function\"\n },],\n functionName: 'tickSpacing',\n address: params.poolAddress as `0x${string}`,\n })\n\n // Step 2: Simulate the swap using existing function\n const swapParams: SimulateSwapParams = {\n pool: params.poolAddress as `0x${string}`,\n recipient: params.recipient as `0x${string}`,\n zeroForOne: params.zeroForOne,\n amountSpecified: params.amountSpecified,\n sqrtPriceLimitX96: params.sqrtPriceLimitX96,\n ammType: params.ammType,\n tokenIn: params.tokenIn as `0x${string}`,\n tokenOut: params.tokenOut as `0x${string}`,\n fee: params.fee,\n tickSpacing: tickSpacing,\n quoterAddress: params.quoterAddress as `0x${string}` | undefined,\n protocol: params.protocol\n };\n\n const swapResult = await simulateSwap(publicClient, swapParams, chainId);\n\n if (!swapResult.success || !swapResult.data) {\n throw new Error(swapResult.error || 'Swap simulation failed');\n }\n\n // Step 3: Calculate price slippage\n const currentPrice = getQuoteFromSqrtRatioX96(\n bigintToDecimal(currentSlot0.sqrtPriceX96),\n bigintToDecimal(10n**18n),\n params.tokenIn as `0x${string}`,\n params.tokenOut as `0x${string}`\n );\n const priceAfter = getQuoteFromSqrtRatioX96(\n bigintToDecimal(swapResult.data.sqrtPriceX96After),\n bigintToDecimal(10n**18n),\n params.tokenIn as `0x${string}`,\n params.tokenOut as `0x${string}`\n );\n \n // Calculate slippage percentage\n // Positive slippage means unfavorable price movement\n const priceSlippagePercent = calculatePriceSlippage(\n currentPrice,\n priceAfter,\n params.zeroForOne\n );\n\n return {\n data: {\n currentSlot0,\n swapSimulation: swapResult.data,\n priceSlippagePercent: priceSlippagePercent.toFixed(5),\n currentPrice: decimalToBigint(currentPrice),\n priceAfter: decimalToBigint(priceAfter)\n },\n status: 200,\n success: true\n };\n } catch (error) {\n return {\n data: null,\n status: 500,\n success: false,\n error: error instanceof Error ? error.message : 'Failed to simulate swap with slippage'\n };\n }\n}\n\n/**\n * Calculates price slippage percentage using Decimal.js\n * \n * @param priceBefore - Price before the swap (Decimal)\n * @param priceAfter - Price after the swap (Decimal)\n * @param zeroForOne - Swap direction (true if token0 → token1)\n * @returns Slippage percentage (positive means unfavorable movement)\n */\nfunction calculatePriceSlippage(\n priceBefore: Decimal,\n priceAfter: Decimal,\n zeroForOne: boolean\n): Decimal {\n if (priceBefore.isZero()) {\n throw new Error('Price before cannot be zero');\n }\n\n const priceChange = priceAfter.minus(priceBefore).dividedBy(priceBefore).times(100);\n \n // For zeroForOne swaps (selling token0), favorable movement is price going down\n // For oneForZero swaps (selling token1), favorable movement is price going up\n // We return positive values for unfavorable movement (slippage)\n return zeroForOne ? priceChange : priceChange.negated();\n}\n\n/**\n * Validates swap with slippage parameters\n * \n * @param params - Parameters to validate\n * @throws Error if parameters are invalid\n */\nfunction validateSwapWithSlippageParams(params: SwapWithSlippageParams): void {\n if (!params.poolAddress || params.poolAddress === '0x0000000000000000000000000000000000000000') {\n throw new Error('Invalid pool address');\n }\n \n if (!params.recipient || params.recipient === '0x0000000000000000000000000000000000000000') {\n throw new Error('Invalid recipient address');\n }\n \n if (params.amountSpecified <= 0n) {\n throw new Error('Amount specified must be greater than 0');\n }\n \n if (params.sqrtPriceLimitX96 <= 0n) {\n throw new Error('Sqrt price limit must be greater than 0');\n }\n\n if (!params.tokenIn || params.tokenIn === '0x0000000000000000000000000000000000000000') {\n throw new Error('Invalid tokenIn address');\n }\n\n if (!params.tokenOut || params.tokenOut === '0x0000000000000000000000000000000000000000') {\n throw new Error('Invalid tokenOut address');\n }\n\n if (params.fee <= 0) {\n throw new Error('Pool fee must be greater than 0');\n }\n} "]}