@mento-protocol/mento-sdk 3.0.0-beta.2 → 3.0.0-beta.21

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 (327) hide show
  1. package/README.md +34 -0
  2. package/dist/cache/routes.d.ts +13 -0
  3. package/dist/cache/routes.d.ts.map +1 -0
  4. package/dist/cache/routes.js +130 -0
  5. package/dist/cache/routes.js.map +1 -0
  6. package/dist/cache/tokens.d.ts +67 -0
  7. package/dist/cache/tokens.d.ts.map +1 -0
  8. package/dist/cache/tokens.js +379 -0
  9. package/dist/cache/tokens.js.map +1 -0
  10. package/dist/core/abis/activePool.d.ts +2 -0
  11. package/dist/core/abis/activePool.d.ts.map +1 -0
  12. package/dist/core/abis/activePool.js +14 -0
  13. package/dist/core/abis/activePool.js.map +1 -0
  14. package/dist/core/abis/addressesRegistry.d.ts +2 -0
  15. package/dist/core/abis/addressesRegistry.d.ts.map +1 -0
  16. package/dist/core/abis/addressesRegistry.js +26 -0
  17. package/dist/core/abis/addressesRegistry.js.map +1 -0
  18. package/dist/core/abis/borrowerOperations.d.ts +9 -0
  19. package/dist/core/abis/borrowerOperations.d.ts.map +1 -0
  20. package/dist/core/abis/borrowerOperations.js +89 -0
  21. package/dist/core/abis/borrowerOperations.js.map +1 -0
  22. package/dist/core/abis/breakerbox.d.ts +13 -0
  23. package/dist/core/abis/breakerbox.d.ts.map +1 -0
  24. package/dist/core/abis/breakerbox.js +8 -0
  25. package/dist/core/abis/breakerbox.js.map +1 -0
  26. package/dist/core/abis/erc20.d.ts +7 -0
  27. package/dist/core/abis/erc20.d.ts.map +1 -1
  28. package/dist/core/abis/erc20.js +7 -0
  29. package/dist/core/abis/erc20.js.map +1 -1
  30. package/dist/core/abis/fpmm.d.ts +128 -0
  31. package/dist/core/abis/fpmm.d.ts.map +1 -1
  32. package/dist/core/abis/fpmm.js +10 -0
  33. package/dist/core/abis/fpmm.js.map +1 -1
  34. package/dist/core/abis/hintHelpers.d.ts +2 -0
  35. package/dist/core/abis/hintHelpers.d.ts.map +1 -0
  36. package/dist/core/abis/hintHelpers.js +14 -0
  37. package/dist/core/abis/hintHelpers.js.map +1 -0
  38. package/dist/core/abis/index.d.ts +12 -0
  39. package/dist/core/abis/index.d.ts.map +1 -1
  40. package/dist/core/abis/index.js +12 -0
  41. package/dist/core/abis/index.js.map +1 -1
  42. package/dist/core/abis/multiTroveGetter.d.ts +8 -0
  43. package/dist/core/abis/multiTroveGetter.d.ts.map +1 -0
  44. package/dist/core/abis/multiTroveGetter.js +15 -0
  45. package/dist/core/abis/multiTroveGetter.js.map +1 -0
  46. package/dist/core/abis/priceFeed.d.ts +7 -0
  47. package/dist/core/abis/priceFeed.d.ts.map +1 -0
  48. package/dist/core/abis/priceFeed.js +16 -0
  49. package/dist/core/abis/priceFeed.js.map +1 -0
  50. package/dist/core/abis/router.d.ts +436 -1
  51. package/dist/core/abis/router.d.ts.map +1 -1
  52. package/dist/core/abis/router.js +13 -0
  53. package/dist/core/abis/router.js.map +1 -1
  54. package/dist/core/abis/sortedTroves.d.ts +2 -0
  55. package/dist/core/abis/sortedTroves.d.ts.map +1 -0
  56. package/dist/core/abis/sortedTroves.js +15 -0
  57. package/dist/core/abis/sortedTroves.js.map +1 -0
  58. package/dist/core/abis/systemParams.d.ts +2 -0
  59. package/dist/core/abis/systemParams.d.ts.map +1 -0
  60. package/dist/core/abis/systemParams.js +14 -0
  61. package/dist/core/abis/systemParams.js.map +1 -0
  62. package/dist/core/abis/troveManager.d.ts +2 -0
  63. package/dist/core/abis/troveManager.d.ts.map +1 -0
  64. package/dist/core/abis/troveManager.js +27 -0
  65. package/dist/core/abis/troveManager.js.map +1 -0
  66. package/dist/core/abis/troveNFT.d.ts +2 -0
  67. package/dist/core/abis/troveNFT.d.ts.map +1 -0
  68. package/dist/core/abis/troveNFT.js +9 -0
  69. package/dist/core/abis/troveNFT.js.map +1 -0
  70. package/dist/core/abis/virtualPool.d.ts +40 -0
  71. package/dist/core/abis/virtualPool.d.ts.map +1 -1
  72. package/dist/core/abis/virtualPool.js +6 -1
  73. package/dist/core/abis/virtualPool.js.map +1 -1
  74. package/dist/core/abis/virtualPoolFactory.d.ts +8 -0
  75. package/dist/core/abis/virtualPoolFactory.d.ts.map +1 -1
  76. package/dist/core/abis/virtualPoolFactory.js +1 -0
  77. package/dist/core/abis/virtualPoolFactory.js.map +1 -1
  78. package/dist/core/constants/aaveConfig.js +2 -2
  79. package/dist/core/constants/addresses.d.ts.map +1 -1
  80. package/dist/core/constants/addresses.js +9 -4
  81. package/dist/core/constants/addresses.js.map +1 -1
  82. package/dist/core/constants/borrowConstants.d.ts +10 -0
  83. package/dist/core/constants/borrowConstants.d.ts.map +1 -0
  84. package/dist/core/constants/borrowConstants.js +16 -0
  85. package/dist/core/constants/borrowConstants.js.map +1 -0
  86. package/dist/core/constants/borrowRegistries.d.ts +7 -0
  87. package/dist/core/constants/borrowRegistries.d.ts.map +1 -0
  88. package/dist/core/constants/borrowRegistries.js +31 -0
  89. package/dist/core/constants/borrowRegistries.js.map +1 -0
  90. package/dist/core/constants/index.d.ts +2 -0
  91. package/dist/core/constants/index.d.ts.map +1 -1
  92. package/dist/core/constants/index.js +2 -0
  93. package/dist/core/constants/index.js.map +1 -1
  94. package/dist/core/errors/index.d.ts +1 -0
  95. package/dist/core/errors/index.d.ts.map +1 -1
  96. package/dist/core/errors/index.js +1 -0
  97. package/dist/core/errors/index.js.map +1 -1
  98. package/dist/core/errors/oracle.d.ts +9 -0
  99. package/dist/core/errors/oracle.d.ts.map +1 -0
  100. package/dist/core/errors/oracle.js +15 -0
  101. package/dist/core/errors/oracle.js.map +1 -0
  102. package/dist/core/errors/router.d.ts +6 -0
  103. package/dist/core/errors/router.d.ts.map +1 -1
  104. package/dist/core/errors/router.js +11 -1
  105. package/dist/core/errors/router.js.map +1 -1
  106. package/dist/core/types/borrow.d.ts +87 -0
  107. package/dist/core/types/borrow.d.ts.map +1 -0
  108. package/dist/core/types/borrow.js +3 -0
  109. package/dist/core/types/borrow.js.map +1 -0
  110. package/dist/core/types/contractAddresses.d.ts +2 -0
  111. package/dist/core/types/contractAddresses.d.ts.map +1 -1
  112. package/dist/core/types/index.d.ts +5 -1
  113. package/dist/core/types/index.d.ts.map +1 -1
  114. package/dist/core/types/index.js +5 -1
  115. package/dist/core/types/index.js.map +1 -1
  116. package/dist/core/types/liquidity.d.ts +117 -0
  117. package/dist/core/types/liquidity.d.ts.map +1 -0
  118. package/dist/core/types/liquidity.js +3 -0
  119. package/dist/core/types/liquidity.js.map +1 -0
  120. package/dist/core/types/pool.d.ts +110 -0
  121. package/dist/core/types/pool.d.ts.map +1 -1
  122. package/dist/core/types/provider.d.ts.map +1 -1
  123. package/dist/core/types/provider.js +0 -1
  124. package/dist/core/types/provider.js.map +1 -1
  125. package/dist/core/types/route.d.ts +3 -3
  126. package/dist/core/types/route.d.ts.map +1 -1
  127. package/dist/core/types/token.d.ts +13 -3
  128. package/dist/core/types/token.d.ts.map +1 -1
  129. package/dist/core/types/tradingLimits.d.ts +91 -0
  130. package/dist/core/types/tradingLimits.d.ts.map +1 -0
  131. package/dist/core/types/tradingLimits.js +3 -0
  132. package/dist/core/types/tradingLimits.js.map +1 -0
  133. package/dist/core/types/tradingMode.d.ts +24 -0
  134. package/dist/core/types/tradingMode.d.ts.map +1 -0
  135. package/dist/core/types/tradingMode.js +31 -0
  136. package/dist/core/types/tradingMode.js.map +1 -0
  137. package/dist/core/types/transaction.d.ts +45 -0
  138. package/dist/core/types/transaction.d.ts.map +1 -0
  139. package/dist/core/types/transaction.js +3 -0
  140. package/dist/core/types/transaction.js.map +1 -0
  141. package/dist/index.d.ts +34 -8
  142. package/dist/index.d.ts.map +1 -1
  143. package/dist/index.js +47 -10
  144. package/dist/index.js.map +1 -1
  145. package/dist/services/borrow/BorrowService.d.ts +54 -0
  146. package/dist/services/borrow/BorrowService.d.ts.map +1 -0
  147. package/dist/services/borrow/BorrowService.js +129 -0
  148. package/dist/services/borrow/BorrowService.js.map +1 -0
  149. package/dist/services/borrow/borrowHelpers.d.ts +4 -0
  150. package/dist/services/borrow/borrowHelpers.d.ts.map +1 -0
  151. package/dist/services/borrow/borrowHelpers.js +13 -0
  152. package/dist/services/borrow/borrowHelpers.js.map +1 -0
  153. package/dist/services/borrow/borrowMath.d.ts +13 -0
  154. package/dist/services/borrow/borrowMath.d.ts.map +1 -0
  155. package/dist/services/borrow/borrowMath.js +129 -0
  156. package/dist/services/borrow/borrowMath.js.map +1 -0
  157. package/dist/services/borrow/index.d.ts +2 -0
  158. package/dist/services/borrow/index.d.ts.map +1 -0
  159. package/dist/services/borrow/index.js +18 -0
  160. package/dist/services/borrow/index.js.map +1 -0
  161. package/dist/services/borrow/internal/borrowApprovalService.d.ts +14 -0
  162. package/dist/services/borrow/internal/borrowApprovalService.d.ts.map +1 -0
  163. package/dist/services/borrow/internal/borrowApprovalService.js +53 -0
  164. package/dist/services/borrow/internal/borrowApprovalService.js.map +1 -0
  165. package/dist/services/borrow/internal/borrowContextStore.d.ts +11 -0
  166. package/dist/services/borrow/internal/borrowContextStore.d.ts.map +1 -0
  167. package/dist/services/borrow/internal/borrowContextStore.js +40 -0
  168. package/dist/services/borrow/internal/borrowContextStore.js.map +1 -0
  169. package/dist/services/borrow/internal/borrowErc20.d.ts +5 -0
  170. package/dist/services/borrow/internal/borrowErc20.d.ts.map +1 -0
  171. package/dist/services/borrow/internal/borrowErc20.js +43 -0
  172. package/dist/services/borrow/internal/borrowErc20.js.map +1 -0
  173. package/dist/services/borrow/internal/borrowHints.d.ts +7 -0
  174. package/dist/services/borrow/internal/borrowHints.d.ts.map +1 -0
  175. package/dist/services/borrow/internal/borrowHints.js +31 -0
  176. package/dist/services/borrow/internal/borrowHints.js.map +1 -0
  177. package/dist/services/borrow/internal/borrowPositionParser.d.ts +4 -0
  178. package/dist/services/borrow/internal/borrowPositionParser.d.ts.map +1 -0
  179. package/dist/services/borrow/internal/borrowPositionParser.js +87 -0
  180. package/dist/services/borrow/internal/borrowPositionParser.js.map +1 -0
  181. package/dist/services/borrow/internal/borrowReadService.d.ts +28 -0
  182. package/dist/services/borrow/internal/borrowReadService.d.ts.map +1 -0
  183. package/dist/services/borrow/internal/borrowReadService.js +218 -0
  184. package/dist/services/borrow/internal/borrowReadService.js.map +1 -0
  185. package/dist/services/borrow/internal/borrowRegistryReader.d.ts +5 -0
  186. package/dist/services/borrow/internal/borrowRegistryReader.d.ts.map +1 -0
  187. package/dist/services/borrow/internal/borrowRegistryReader.js +96 -0
  188. package/dist/services/borrow/internal/borrowRegistryReader.js.map +1 -0
  189. package/dist/services/borrow/internal/borrowTransactionService.d.ts +23 -0
  190. package/dist/services/borrow/internal/borrowTransactionService.d.ts.map +1 -0
  191. package/dist/services/borrow/internal/borrowTransactionService.js +276 -0
  192. package/dist/services/borrow/internal/borrowTransactionService.js.map +1 -0
  193. package/dist/services/borrow/internal/borrowTypes.d.ts +15 -0
  194. package/dist/services/borrow/internal/borrowTypes.d.ts.map +1 -0
  195. package/dist/services/borrow/internal/borrowTypes.js +3 -0
  196. package/dist/services/borrow/internal/borrowTypes.js.map +1 -0
  197. package/dist/services/borrow/internal/borrowValidation.d.ts +13 -0
  198. package/dist/services/borrow/internal/borrowValidation.d.ts.map +1 -0
  199. package/dist/services/borrow/internal/borrowValidation.js +96 -0
  200. package/dist/services/borrow/internal/borrowValidation.js.map +1 -0
  201. package/dist/services/index.d.ts +2 -0
  202. package/dist/services/index.d.ts.map +1 -1
  203. package/dist/services/index.js +2 -0
  204. package/dist/services/index.js.map +1 -1
  205. package/dist/services/liquidity/LiquidityService.d.ts +154 -0
  206. package/dist/services/liquidity/LiquidityService.d.ts.map +1 -0
  207. package/dist/services/liquidity/LiquidityService.js +184 -0
  208. package/dist/services/liquidity/LiquidityService.js.map +1 -0
  209. package/dist/services/liquidity/basicLiquidity.d.ts +11 -0
  210. package/dist/services/liquidity/basicLiquidity.d.ts.map +1 -0
  211. package/dist/services/liquidity/basicLiquidity.js +172 -0
  212. package/dist/services/liquidity/basicLiquidity.js.map +1 -0
  213. package/dist/services/liquidity/index.d.ts +2 -0
  214. package/dist/services/liquidity/index.d.ts.map +1 -0
  215. package/dist/services/liquidity/index.js +18 -0
  216. package/dist/services/liquidity/index.js.map +1 -0
  217. package/dist/services/liquidity/liquidityHelpers.d.ts +13 -0
  218. package/dist/services/liquidity/liquidityHelpers.d.ts.map +1 -0
  219. package/dist/services/liquidity/liquidityHelpers.js +74 -0
  220. package/dist/services/liquidity/liquidityHelpers.js.map +1 -0
  221. package/dist/services/liquidity/zapHelpers.d.ts +66 -0
  222. package/dist/services/liquidity/zapHelpers.d.ts.map +1 -0
  223. package/dist/services/liquidity/zapHelpers.js +133 -0
  224. package/dist/services/liquidity/zapHelpers.js.map +1 -0
  225. package/dist/services/liquidity/zapIn.d.ts +17 -0
  226. package/dist/services/liquidity/zapIn.d.ts.map +1 -0
  227. package/dist/services/liquidity/zapIn.js +125 -0
  228. package/dist/services/liquidity/zapIn.js.map +1 -0
  229. package/dist/services/liquidity/zapOut.d.ts +17 -0
  230. package/dist/services/liquidity/zapOut.d.ts.map +1 -0
  231. package/dist/services/liquidity/zapOut.js +242 -0
  232. package/dist/services/liquidity/zapOut.js.map +1 -0
  233. package/dist/services/pools/PoolService.d.ts +35 -10
  234. package/dist/services/pools/PoolService.d.ts.map +1 -1
  235. package/dist/services/pools/PoolService.js +61 -109
  236. package/dist/services/pools/PoolService.js.map +1 -1
  237. package/dist/services/pools/poolDetails.d.ts +11 -0
  238. package/dist/services/pools/poolDetails.d.ts.map +1 -0
  239. package/dist/services/pools/poolDetails.js +145 -0
  240. package/dist/services/pools/poolDetails.js.map +1 -0
  241. package/dist/services/pools/poolDiscovery.d.ts +12 -0
  242. package/dist/services/pools/poolDiscovery.d.ts.map +1 -0
  243. package/dist/services/pools/poolDiscovery.js +114 -0
  244. package/dist/services/pools/poolDiscovery.js.map +1 -0
  245. package/dist/services/quotes/QuoteService.d.ts +21 -12
  246. package/dist/services/quotes/QuoteService.d.ts.map +1 -1
  247. package/dist/services/quotes/QuoteService.js +41 -17
  248. package/dist/services/quotes/QuoteService.js.map +1 -1
  249. package/dist/services/routes/RouteService.d.ts +3 -3
  250. package/dist/services/routes/RouteService.d.ts.map +1 -1
  251. package/dist/services/routes/RouteService.js +3 -5
  252. package/dist/services/routes/RouteService.js.map +1 -1
  253. package/dist/services/swap/SwapService.d.ts +23 -19
  254. package/dist/services/swap/SwapService.d.ts.map +1 -1
  255. package/dist/services/swap/SwapService.js +36 -15
  256. package/dist/services/swap/SwapService.js.map +1 -1
  257. package/dist/services/tokens/supplyAdjustmentService.d.ts +0 -4
  258. package/dist/services/tokens/supplyAdjustmentService.d.ts.map +1 -1
  259. package/dist/services/tokens/supplyAdjustmentService.js +3 -8
  260. package/dist/services/tokens/supplyAdjustmentService.js.map +1 -1
  261. package/dist/services/tokens/tokenService.d.ts.map +1 -1
  262. package/dist/services/tokens/tokenService.js +2 -2
  263. package/dist/services/tokens/tokenService.js.map +1 -1
  264. package/dist/services/trading/TradingLimitsService.d.ts +38 -0
  265. package/dist/services/trading/TradingLimitsService.d.ts.map +1 -0
  266. package/dist/services/trading/TradingLimitsService.js +157 -0
  267. package/dist/services/trading/TradingLimitsService.js.map +1 -0
  268. package/dist/services/trading/TradingService.d.ts +110 -0
  269. package/dist/services/trading/TradingService.d.ts.map +1 -0
  270. package/dist/services/trading/TradingService.js +162 -0
  271. package/dist/services/trading/TradingService.js.map +1 -0
  272. package/dist/services/trading/index.d.ts +3 -0
  273. package/dist/services/trading/index.d.ts.map +1 -0
  274. package/dist/services/trading/index.js +19 -0
  275. package/dist/services/trading/index.js.map +1 -0
  276. package/dist/utils/costUtils.js +4 -4
  277. package/dist/utils/costUtils.js.map +1 -1
  278. package/dist/utils/deadline.d.ts +21 -0
  279. package/dist/utils/deadline.d.ts.map +1 -0
  280. package/dist/utils/deadline.js +26 -0
  281. package/dist/utils/deadline.js.map +1 -0
  282. package/dist/utils/index.d.ts +3 -0
  283. package/dist/utils/index.d.ts.map +1 -1
  284. package/dist/utils/index.js +3 -0
  285. package/dist/utils/index.js.map +1 -1
  286. package/dist/utils/pathEncoder.d.ts +8 -2
  287. package/dist/utils/pathEncoder.d.ts.map +1 -1
  288. package/dist/utils/pathEncoder.js +19 -3
  289. package/dist/utils/pathEncoder.js.map +1 -1
  290. package/dist/utils/rateFeed.d.ts +18 -0
  291. package/dist/utils/rateFeed.d.ts.map +1 -0
  292. package/dist/utils/rateFeed.js +27 -0
  293. package/dist/utils/rateFeed.js.map +1 -0
  294. package/dist/utils/routeUtils.d.ts +53 -53
  295. package/dist/utils/routeUtils.d.ts.map +1 -1
  296. package/dist/utils/routeUtils.js +41 -41
  297. package/dist/utils/routeUtils.js.map +1 -1
  298. package/dist/utils/routes.d.ts +2 -8
  299. package/dist/utils/routes.d.ts.map +1 -1
  300. package/dist/utils/routes.js +5 -46
  301. package/dist/utils/routes.js.map +1 -1
  302. package/dist/utils/tokens.d.ts +1 -77
  303. package/dist/utils/tokens.d.ts.map +1 -1
  304. package/dist/utils/tokens.js +10 -178
  305. package/dist/utils/tokens.js.map +1 -1
  306. package/dist/utils/tradingLimits.d.ts +41 -0
  307. package/dist/utils/tradingLimits.d.ts.map +1 -0
  308. package/dist/utils/tradingLimits.js +171 -0
  309. package/dist/utils/tradingLimits.js.map +1 -0
  310. package/dist/utils/validation.d.ts +19 -0
  311. package/dist/utils/validation.d.ts.map +1 -0
  312. package/dist/utils/validation.js +34 -0
  313. package/dist/utils/validation.js.map +1 -0
  314. package/package.json +3 -1
  315. package/dist/cache/routes.11142220.js +0 -1
  316. package/dist/cache/routes.42220.d.ts +0 -3
  317. package/dist/cache/routes.42220.d.ts.map +0 -1
  318. package/dist/cache/routes.42220.js +0 -112
  319. package/dist/cache/routes.42220.js.map +0 -1
  320. package/dist/cache/tokens.11142220.d.ts +0 -3
  321. package/dist/cache/tokens.11142220.d.ts.map +0 -1
  322. package/dist/cache/tokens.11142220.js +0 -129
  323. package/dist/cache/tokens.11142220.js.map +0 -1
  324. package/dist/cache/tokens.42220.d.ts +0 -3
  325. package/dist/cache/tokens.42220.d.ts.map +0 -1
  326. package/dist/cache/tokens.42220.js +0 -129
  327. package/dist/cache/tokens.42220.js.map +0 -1
@@ -0,0 +1,133 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.encodeZapInCall = encodeZapInCall;
4
+ exports.encodeZapOutCall = encodeZapOutCall;
5
+ exports.findZapInRoutes = findZapInRoutes;
6
+ exports.findZapOutRoutes = findZapOutRoutes;
7
+ exports.splitAmount = splitAmount;
8
+ exports.estimateLiquidityFromZapIn = estimateLiquidityFromZapIn;
9
+ const viem_1 = require("viem");
10
+ const abis_1 = require("../../core/abis");
11
+ const pathEncoder_1 = require("../../utils/pathEncoder");
12
+ // ========== ENCODING FUNCTIONS ==========
13
+ /**
14
+ * Encodes the zapIn function call for the Router contract
15
+ */
16
+ function encodeZapInCall(tokenIn, amountInA, amountInB, zapParams, routesA, routesB, recipient) {
17
+ return (0, viem_1.encodeFunctionData)({
18
+ abi: abis_1.ROUTER_ABI,
19
+ functionName: 'zapIn',
20
+ args: [tokenIn, amountInA, amountInB, zapParams, routesA, routesB, recipient],
21
+ });
22
+ }
23
+ /**
24
+ * Encodes the zapOut function call for the Router contract
25
+ */
26
+ function encodeZapOutCall(tokenOut, liquidity, zapParams, routesA, routesB) {
27
+ return (0, viem_1.encodeFunctionData)({
28
+ abi: abis_1.ROUTER_ABI,
29
+ functionName: 'zapOut',
30
+ args: [tokenOut, liquidity, zapParams, routesA, routesB],
31
+ });
32
+ }
33
+ // ========== ROUTING FUNCTIONS ==========
34
+ /**
35
+ * Finds routes for zap in operations (from tokenIn to both pool tokens)
36
+ *
37
+ * @param routeService - Route service for finding swap paths
38
+ * @param tokenIn - Input token address
39
+ * @param token0 - Pool's token0 address
40
+ * @param token1 - Pool's token1 address
41
+ * @returns Routes from tokenIn to token0 and token1
42
+ */
43
+ async function findZapInRoutes(routeService, tokenIn, token0, token1) {
44
+ let routesA = [];
45
+ let routesB = [];
46
+ // Find route from tokenIn to token0 (if different)
47
+ if (tokenIn.toLowerCase() !== token0.toLowerCase()) {
48
+ const routeA = await routeService.findRoute(tokenIn, token0);
49
+ routesA = (0, pathEncoder_1.encodeRoutePath)(routeA.path, tokenIn, token0);
50
+ }
51
+ // Find route from tokenIn to token1 (if different)
52
+ if (tokenIn.toLowerCase() !== token1.toLowerCase()) {
53
+ const routeB = await routeService.findRoute(tokenIn, token1);
54
+ routesB = (0, pathEncoder_1.encodeRoutePath)(routeB.path, tokenIn, token1);
55
+ }
56
+ return { routesA, routesB };
57
+ }
58
+ /**
59
+ * Finds routes for zap out operations (from both pool tokens to tokenOut)
60
+ *
61
+ * @param routeService - Route service for finding swap paths
62
+ * @param token0 - Pool's token0 address
63
+ * @param token1 - Pool's token1 address
64
+ * @param tokenOut - Output token address
65
+ * @returns Routes from token0 and token1 to tokenOut
66
+ */
67
+ async function findZapOutRoutes(routeService, token0, token1, tokenOut) {
68
+ let routesA = [];
69
+ let routesB = [];
70
+ // Find route from token0 to tokenOut (if different)
71
+ if (token0.toLowerCase() !== tokenOut.toLowerCase()) {
72
+ const routeA = await routeService.findRoute(token0, tokenOut);
73
+ routesA = (0, pathEncoder_1.encodeRoutePath)(routeA.path, token0, tokenOut);
74
+ }
75
+ // Find route from token1 to tokenOut (if different)
76
+ if (token1.toLowerCase() !== tokenOut.toLowerCase()) {
77
+ const routeB = await routeService.findRoute(token1, tokenOut);
78
+ routesB = (0, pathEncoder_1.encodeRoutePath)(routeB.path, token1, tokenOut);
79
+ }
80
+ return { routesA, routesB };
81
+ }
82
+ // ========== CALCULATION FUNCTIONS ==========
83
+ /**
84
+ * Splits an amount into two parts based on a ratio
85
+ *
86
+ * @param amountIn - Total input amount
87
+ * @param splitRatio - Ratio for splitting (0-1, e.g., 0.5 for 50/50)
88
+ * @returns Split amounts for each part
89
+ */
90
+ function splitAmount(amountIn, splitRatio) {
91
+ if (splitRatio < 0 || splitRatio > 1) {
92
+ throw new Error('Split ratio must be between 0 and 1');
93
+ }
94
+ const amountA = (amountIn * BigInt(Math.floor(splitRatio * 10000))) / 10000n;
95
+ const amountB = amountIn - amountA;
96
+ return { amountA, amountB };
97
+ }
98
+ /**
99
+ * Estimates minimum LP tokens from zap in amounts.
100
+ *
101
+ * This is a conservative lower-bound estimate. The inputs are slippage-adjusted
102
+ * minimums, not expected amounts. Actual LP tokens minted on-chain may be higher
103
+ * because the router uses balanceOf(address(this)) after swaps, which can exceed
104
+ * the pre-calculated minimums.
105
+ *
106
+ * @param amountOutA - Minimum amount of token0 after swap (slippage-adjusted)
107
+ * @param amountOutB - Minimum amount of token1 after swap (slippage-adjusted)
108
+ * @param reserve0 - Current reserve of token0 in pool
109
+ * @param reserve1 - Current reserve of token1 in pool
110
+ * @param totalSupply - Total LP token supply
111
+ * @returns Conservative estimate of minimum LP tokens to be minted
112
+ */
113
+ function estimateLiquidityFromZapIn(amountOutA, amountOutB, reserve0, reserve1, totalSupply) {
114
+ if (totalSupply === 0n) {
115
+ // First liquidity provision - use geometric mean with BigInt sqrt
116
+ // to avoid precision loss from Number() conversion on 18-decimal values
117
+ const product = amountOutA * amountOutB;
118
+ if (product === 0n)
119
+ return 0n;
120
+ let x = product;
121
+ let y = (x + 1n) / 2n;
122
+ while (y < x) {
123
+ x = y;
124
+ y = (x + product / x) / 2n;
125
+ }
126
+ return x;
127
+ }
128
+ // Existing pool - calculate based on smaller ratio
129
+ const liquidityA = (amountOutA * totalSupply) / reserve0;
130
+ const liquidityB = (amountOutB * totalSupply) / reserve1;
131
+ return liquidityA < liquidityB ? liquidityA : liquidityB;
132
+ }
133
+ //# sourceMappingURL=zapHelpers.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"zapHelpers.js","sourceRoot":"","sources":["../../../src/services/liquidity/zapHelpers.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,17 @@
1
+ import { PublicClient } from 'viem';
2
+ import { PoolService } from '../pools';
3
+ import { RouteService } from '../routes';
4
+ import { LiquidityOptions, ZapInQuote, ZapInDetails, ZapInTransaction } from '../../core/types';
5
+ /**
6
+ * Builds a complete zap in transaction including approval if needed
7
+ */
8
+ export declare function buildZapInTransactionInternal(publicClient: PublicClient, chainId: number, poolService: PoolService, routeService: RouteService, poolAddress: string, tokenIn: string, amountIn: bigint, amountInSplit: number, recipient: string, owner: string, options: LiquidityOptions): Promise<ZapInTransaction>;
9
+ /**
10
+ * Builds zap in transaction parameters without checking approval
11
+ */
12
+ export declare function buildZapInParamsInternal(publicClient: PublicClient, chainId: number, poolService: PoolService, routeService: RouteService, poolAddress: string, tokenIn: string, amountIn: bigint, amountInSplit: number, recipient: string, options: LiquidityOptions): Promise<ZapInDetails>;
13
+ /**
14
+ * Quotes a zap in operation (read-only)
15
+ */
16
+ export declare function quoteZapInInternal(publicClient: PublicClient, chainId: number, poolService: PoolService, routeService: RouteService, poolAddress: string, tokenIn: string, amountIn: bigint, amountInSplit: number, options: LiquidityOptions): Promise<ZapInQuote>;
17
+ //# sourceMappingURL=zapIn.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"zapIn.d.ts","sourceRoot":"","sources":["../../../src/services/liquidity/zapIn.ts"],"names":[],"mappings":"AAAA,OAAO,EAAW,YAAY,EAAE,MAAM,MAAM,CAAA;AAC5C,OAAO,EAAE,WAAW,EAAE,MAAM,UAAU,CAAA;AACtC,OAAO,EAAE,YAAY,EAAE,MAAM,WAAW,CAAA;AACxC,OAAO,EACL,gBAAgB,EAChB,UAAU,EACV,YAAY,EACZ,gBAAgB,EAEjB,MAAM,kBAAkB,CAAA;AAezB;;GAEG;AACH,wBAAsB,6BAA6B,CACjD,YAAY,EAAE,YAAY,EAC1B,OAAO,EAAE,MAAM,EACf,WAAW,EAAE,WAAW,EACxB,YAAY,EAAE,YAAY,EAC1B,WAAW,EAAE,MAAM,EACnB,OAAO,EAAE,MAAM,EACf,QAAQ,EAAE,MAAM,EAChB,aAAa,EAAE,MAAM,EACrB,SAAS,EAAE,MAAM,EACjB,KAAK,EAAE,MAAM,EACb,OAAO,EAAE,gBAAgB,GACxB,OAAO,CAAC,gBAAgB,CAAC,CA4B3B;AAED;;GAEG;AACH,wBAAsB,wBAAwB,CAC5C,YAAY,EAAE,YAAY,EAC1B,OAAO,EAAE,MAAM,EACf,WAAW,EAAE,WAAW,EACxB,YAAY,EAAE,YAAY,EAC1B,WAAW,EAAE,MAAM,EACnB,OAAO,EAAE,MAAM,EACf,QAAQ,EAAE,MAAM,EAChB,aAAa,EAAE,MAAM,EACrB,SAAS,EAAE,MAAM,EACjB,OAAO,EAAE,gBAAgB,GACxB,OAAO,CAAC,YAAY,CAAC,CAyEvB;AAED;;GAEG;AACH,wBAAsB,kBAAkB,CACtC,YAAY,EAAE,YAAY,EAC1B,OAAO,EAAE,MAAM,EACf,WAAW,EAAE,WAAW,EACxB,YAAY,EAAE,YAAY,EAC1B,WAAW,EAAE,MAAM,EACnB,OAAO,EAAE,MAAM,EACf,QAAQ,EAAE,MAAM,EAChB,aAAa,EAAE,MAAM,EACrB,OAAO,EAAE,gBAAgB,GACxB,OAAO,CAAC,UAAU,CAAC,CA0CrB"}
@@ -0,0 +1,125 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.buildZapInTransactionInternal = buildZapInTransactionInternal;
4
+ exports.buildZapInParamsInternal = buildZapInParamsInternal;
5
+ exports.quoteZapInInternal = quoteZapInInternal;
6
+ const abis_1 = require("../../core/abis");
7
+ const constants_1 = require("../../core/constants");
8
+ const validation_1 = require("../../utils/validation");
9
+ const liquidityHelpers_1 = require("./liquidityHelpers");
10
+ const zapHelpers_1 = require("./zapHelpers");
11
+ // ========== ZAP IN OPERATIONS ==========
12
+ /**
13
+ * Builds a complete zap in transaction including approval if needed
14
+ */
15
+ async function buildZapInTransactionInternal(publicClient, chainId, poolService, routeService, poolAddress, tokenIn, amountIn, amountInSplit, recipient, owner, options) {
16
+ (0, validation_1.validateAddress)(owner, 'owner');
17
+ // Build zap in params
18
+ const zapIn = await buildZapInParamsInternal(publicClient, chainId, poolService, routeService, poolAddress, tokenIn, amountIn, amountInSplit, recipient, options);
19
+ // Check allowance for input token
20
+ const tokenInAddr = tokenIn;
21
+ const ownerAddr = owner;
22
+ const currentAllowance = await (0, liquidityHelpers_1.getAllowance)(publicClient, tokenInAddr, ownerAddr, chainId);
23
+ // Build approval if needed
24
+ const approval = currentAllowance < amountIn
25
+ ? { token: tokenIn, amount: amountIn, params: (0, liquidityHelpers_1.buildApprovalParams)(chainId, tokenInAddr, amountIn) }
26
+ : null;
27
+ return { approval, zapIn };
28
+ }
29
+ /**
30
+ * Builds zap in transaction parameters without checking approval
31
+ */
32
+ async function buildZapInParamsInternal(publicClient, chainId, poolService, routeService, poolAddress, tokenIn, amountIn, amountInSplit, recipient, options) {
33
+ (0, validation_1.validateAddress)(poolAddress, 'poolAddress');
34
+ (0, validation_1.validateAddress)(tokenIn, 'tokenIn');
35
+ (0, validation_1.validateAddress)(recipient, 'recipient');
36
+ // Get pool info
37
+ const { token0, token1, factoryAddr } = await (0, liquidityHelpers_1.getPoolInfo)(poolService, poolAddress);
38
+ // Split input amount
39
+ const { amountA: amountInA, amountB: amountInB } = (0, zapHelpers_1.splitAmount)(amountIn, amountInSplit);
40
+ // Find routes for swapping
41
+ const { routesA, routesB } = await (0, zapHelpers_1.findZapInRoutes)(routeService, tokenIn, token0, token1);
42
+ // Generate zap parameters using Router helper
43
+ const routerAddress = (0, constants_1.getContractAddress)(chainId, 'Router');
44
+ const [amountOutMinA, amountOutMinB, amountAMin, amountBMin] = (await publicClient.readContract({
45
+ address: routerAddress,
46
+ abi: abis_1.ROUTER_ABI,
47
+ functionName: 'generateZapInParams',
48
+ args: [token0, token1, factoryAddr, amountInA, amountInB, routesA, routesB],
49
+ }));
50
+ // Apply slippage to all minimum amounts
51
+ const finalAmountAMin = (0, liquidityHelpers_1.calculateMinAmount)(amountAMin, options.slippageTolerance);
52
+ const finalAmountBMin = (0, liquidityHelpers_1.calculateMinAmount)(amountBMin, options.slippageTolerance);
53
+ const finalAmountOutMinA = (0, liquidityHelpers_1.calculateMinAmount)(amountOutMinA, options.slippageTolerance);
54
+ const finalAmountOutMinB = (0, liquidityHelpers_1.calculateMinAmount)(amountOutMinB, options.slippageTolerance);
55
+ // Estimate expected liquidity
56
+ const poolDetails = await poolService.getPoolDetails(poolAddress);
57
+ const totalSupply = (await publicClient.readContract({
58
+ address: poolAddress,
59
+ abi: abis_1.ERC20_ABI,
60
+ functionName: 'totalSupply',
61
+ args: [],
62
+ }));
63
+ const expectedLiquidity = (0, zapHelpers_1.estimateLiquidityFromZapIn)(finalAmountOutMinA, finalAmountOutMinB, poolDetails.reserve0, poolDetails.reserve1, totalSupply);
64
+ const zapParams = {
65
+ tokenA: token0,
66
+ tokenB: token1,
67
+ factory: factoryAddr,
68
+ amountAMin: finalAmountAMin,
69
+ amountBMin: finalAmountBMin,
70
+ amountOutMinA: finalAmountOutMinA,
71
+ amountOutMinB: finalAmountOutMinB,
72
+ };
73
+ const data = (0, zapHelpers_1.encodeZapInCall)(tokenIn, amountInA, amountInB, zapParams, routesA, routesB, recipient);
74
+ return {
75
+ params: {
76
+ to: routerAddress,
77
+ data,
78
+ value: '0',
79
+ },
80
+ poolAddress,
81
+ tokenIn,
82
+ amountIn,
83
+ amountInA,
84
+ amountInB,
85
+ routesA,
86
+ routesB,
87
+ zapParams,
88
+ estimatedMinLiquidity: expectedLiquidity,
89
+ };
90
+ }
91
+ /**
92
+ * Quotes a zap in operation (read-only)
93
+ */
94
+ async function quoteZapInInternal(publicClient, chainId, poolService, routeService, poolAddress, tokenIn, amountIn, amountInSplit, options) {
95
+ (0, validation_1.validateAddress)(poolAddress, 'poolAddress');
96
+ (0, validation_1.validateAddress)(tokenIn, 'tokenIn');
97
+ const { token0, token1, factoryAddr } = await (0, liquidityHelpers_1.getPoolInfo)(poolService, poolAddress);
98
+ const { amountA: amountInA, amountB: amountInB } = (0, zapHelpers_1.splitAmount)(amountIn, amountInSplit);
99
+ const { routesA, routesB } = await (0, zapHelpers_1.findZapInRoutes)(routeService, tokenIn, token0, token1);
100
+ const routerAddress = (0, constants_1.getContractAddress)(chainId, 'Router');
101
+ const [amountOutMinA, amountOutMinB, amountAMin, amountBMin] = (await publicClient.readContract({
102
+ address: routerAddress,
103
+ abi: abis_1.ROUTER_ABI,
104
+ functionName: 'generateZapInParams',
105
+ args: [token0, token1, factoryAddr, amountInA, amountInB, routesA, routesB],
106
+ }));
107
+ const poolDetails = await poolService.getPoolDetails(poolAddress);
108
+ const totalSupply = (await publicClient.readContract({
109
+ address: poolAddress,
110
+ abi: abis_1.ERC20_ABI,
111
+ functionName: 'totalSupply',
112
+ args: [],
113
+ }));
114
+ const finalAmountOutMinA = (0, liquidityHelpers_1.calculateMinAmount)(amountOutMinA, options.slippageTolerance);
115
+ const finalAmountOutMinB = (0, liquidityHelpers_1.calculateMinAmount)(amountOutMinB, options.slippageTolerance);
116
+ const expectedLiquidity = (0, zapHelpers_1.estimateLiquidityFromZapIn)(finalAmountOutMinA, finalAmountOutMinB, poolDetails.reserve0, poolDetails.reserve1, totalSupply);
117
+ return {
118
+ amountOutMinA: finalAmountOutMinA,
119
+ amountOutMinB: finalAmountOutMinB,
120
+ amountAMin: (0, liquidityHelpers_1.calculateMinAmount)(amountAMin, options.slippageTolerance),
121
+ amountBMin: (0, liquidityHelpers_1.calculateMinAmount)(amountBMin, options.slippageTolerance),
122
+ estimatedMinLiquidity: expectedLiquidity,
123
+ };
124
+ }
125
+ //# sourceMappingURL=zapIn.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"zapIn.js","sourceRoot":"","sources":["../../../src/services/liquidity/zapIn.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,17 @@
1
+ import { PublicClient } from 'viem';
2
+ import { PoolService } from '../pools';
3
+ import { RouteService } from '../routes';
4
+ import { LiquidityOptions, ZapOutQuote, ZapOutDetails, ZapOutTransaction } from '../../core/types';
5
+ /**
6
+ * Builds a complete zap out transaction including approval if needed
7
+ */
8
+ export declare function buildZapOutTransactionInternal(publicClient: PublicClient, chainId: number, poolService: PoolService, routeService: RouteService, poolAddress: string, tokenOut: string, liquidity: bigint, recipient: string, owner: string, options: LiquidityOptions): Promise<ZapOutTransaction>;
9
+ /**
10
+ * Builds zap out transaction parameters without checking approval
11
+ */
12
+ export declare function buildZapOutParamsInternal(publicClient: PublicClient, chainId: number, poolService: PoolService, routeService: RouteService, poolAddress: string, tokenOut: string, liquidity: bigint, recipient: string, options: LiquidityOptions): Promise<ZapOutDetails>;
13
+ /**
14
+ * Quotes a zap out operation (read-only)
15
+ */
16
+ export declare function quoteZapOutInternal(publicClient: PublicClient, chainId: number, poolService: PoolService, routeService: RouteService, poolAddress: string, tokenOut: string, liquidity: bigint, options: LiquidityOptions): Promise<ZapOutQuote>;
17
+ //# sourceMappingURL=zapOut.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"zapOut.d.ts","sourceRoot":"","sources":["../../../src/services/liquidity/zapOut.ts"],"names":[],"mappings":"AAAA,OAAO,EAAgB,YAAY,EAAE,MAAM,MAAM,CAAA;AACjD,OAAO,EAAE,WAAW,EAAE,MAAM,UAAU,CAAA;AACtC,OAAO,EAAE,YAAY,EAAE,MAAM,WAAW,CAAA;AACxC,OAAO,EACL,gBAAgB,EAGhB,WAAW,EACX,aAAa,EACb,iBAAiB,EAElB,MAAM,kBAAkB,CAAA;AAezB;;GAEG;AACH,wBAAsB,8BAA8B,CAClD,YAAY,EAAE,YAAY,EAC1B,OAAO,EAAE,MAAM,EACf,WAAW,EAAE,WAAW,EACxB,YAAY,EAAE,YAAY,EAC1B,WAAW,EAAE,MAAM,EACnB,QAAQ,EAAE,MAAM,EAChB,SAAS,EAAE,MAAM,EACjB,SAAS,EAAE,MAAM,EACjB,KAAK,EAAE,MAAM,EACb,OAAO,EAAE,gBAAgB,GACxB,OAAO,CAAC,iBAAiB,CAAC,CAqD5B;AAED;;GAEG;AACH,wBAAsB,yBAAyB,CAC7C,YAAY,EAAE,YAAY,EAC1B,OAAO,EAAE,MAAM,EACf,WAAW,EAAE,WAAW,EACxB,YAAY,EAAE,YAAY,EAC1B,WAAW,EAAE,MAAM,EACnB,QAAQ,EAAE,MAAM,EAChB,SAAS,EAAE,MAAM,EACjB,SAAS,EAAE,MAAM,EACjB,OAAO,EAAE,gBAAgB,GACxB,OAAO,CAAC,aAAa,CAAC,CAwBxB;AAED;;GAEG;AACH,wBAAsB,mBAAmB,CACvC,YAAY,EAAE,YAAY,EAC1B,OAAO,EAAE,MAAM,EACf,WAAW,EAAE,WAAW,EACxB,YAAY,EAAE,YAAY,EAC1B,WAAW,EAAE,MAAM,EACnB,QAAQ,EAAE,MAAM,EAChB,SAAS,EAAE,MAAM,EACjB,OAAO,EAAE,gBAAgB,GACxB,OAAO,CAAC,WAAW,CAAC,CA2BtB"}
@@ -0,0 +1,242 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.buildZapOutTransactionInternal = buildZapOutTransactionInternal;
4
+ exports.buildZapOutParamsInternal = buildZapOutParamsInternal;
5
+ exports.quoteZapOutInternal = quoteZapOutInternal;
6
+ const abis_1 = require("../../core/abis");
7
+ const constants_1 = require("../../core/constants");
8
+ const errors_1 = require("../../core/errors");
9
+ const validation_1 = require("../../utils/validation");
10
+ const pathEncoder_1 = require("../../utils/pathEncoder");
11
+ const liquidityHelpers_1 = require("./liquidityHelpers");
12
+ const zapHelpers_1 = require("./zapHelpers");
13
+ // ========== ZAP OUT OPERATIONS ==========
14
+ const INSUFFICIENT_LIQUIDITY_SELECTOR = '0xbb55fd27';
15
+ const MAX_ROUTE_CANDIDATES_PER_LEG = 8;
16
+ const MAX_ROUTE_COMBINATIONS = 48;
17
+ /**
18
+ * Builds a complete zap out transaction including approval if needed
19
+ */
20
+ async function buildZapOutTransactionInternal(publicClient, chainId, poolService, routeService, poolAddress, tokenOut, liquidity, recipient, owner, options) {
21
+ (0, validation_1.validateAddress)(owner, 'owner');
22
+ // Build zap out params
23
+ let zapOut = await buildZapOutParamsInternal(publicClient, chainId, poolService, routeService, poolAddress, tokenOut, liquidity, recipient, options);
24
+ // Check LP token allowance
25
+ const poolAddr = poolAddress;
26
+ const ownerAddr = owner;
27
+ const currentAllowance = await (0, liquidityHelpers_1.getAllowance)(publicClient, poolAddr, ownerAddr, chainId);
28
+ // Build approval if needed
29
+ const approval = currentAllowance < liquidity
30
+ ? { token: poolAddress, amount: liquidity, params: (0, liquidityHelpers_1.buildApprovalParams)(chainId, poolAddr, liquidity) }
31
+ : null;
32
+ // We can only preflight/simulate a real zap call when approval is already sufficient.
33
+ // Before approval, transferFrom in zapOut() would fail and make simulation meaningless.
34
+ if (currentAllowance >= liquidity) {
35
+ const routerAddress = (0, constants_1.getContractAddress)(chainId, 'Router');
36
+ try {
37
+ await simulateZapOut(publicClient, ownerAddr, routerAddress, zapOut.params.data);
38
+ }
39
+ catch (error) {
40
+ // Only attempt route fallback for the known liquidity failure.
41
+ if (!isInsufficientLiquidityError(error)) {
42
+ throw error;
43
+ }
44
+ zapOut = await findViableZapOutDetails(publicClient, chainId, poolService, routeService, poolAddress, tokenOut, liquidity, ownerAddr, options);
45
+ }
46
+ }
47
+ return { approval, zapOut };
48
+ }
49
+ /**
50
+ * Builds zap out transaction parameters without checking approval
51
+ */
52
+ async function buildZapOutParamsInternal(publicClient, chainId, poolService, routeService, poolAddress, tokenOut, liquidity, recipient, options) {
53
+ (0, validation_1.validateAddress)(poolAddress, 'poolAddress');
54
+ (0, validation_1.validateAddress)(tokenOut, 'tokenOut');
55
+ (0, validation_1.validateAddress)(recipient, 'recipient');
56
+ // Get pool info
57
+ const { token0, token1, factoryAddr } = await (0, liquidityHelpers_1.getPoolInfo)(poolService, poolAddress);
58
+ // Find routes for swapping (from pool tokens to tokenOut)
59
+ const { routesA, routesB } = await (0, zapHelpers_1.findZapOutRoutes)(routeService, token0, token1, tokenOut);
60
+ return buildZapOutDetailsForRoutes(publicClient, chainId, poolAddress, tokenOut, liquidity, token0, token1, factoryAddr, routesA, routesB, options);
61
+ }
62
+ /**
63
+ * Quotes a zap out operation (read-only)
64
+ */
65
+ async function quoteZapOutInternal(publicClient, chainId, poolService, routeService, poolAddress, tokenOut, liquidity, options) {
66
+ (0, validation_1.validateAddress)(poolAddress, 'poolAddress');
67
+ (0, validation_1.validateAddress)(tokenOut, 'tokenOut');
68
+ const { token0, token1, factoryAddr } = await (0, liquidityHelpers_1.getPoolInfo)(poolService, poolAddress);
69
+ // Find routes for swapping (from pool tokens to tokenOut)
70
+ const { routesA, routesB } = await (0, zapHelpers_1.findZapOutRoutes)(routeService, token0, token1, tokenOut);
71
+ const routerAddress = (0, constants_1.getContractAddress)(chainId, 'Router');
72
+ const [amountOutMinA, amountOutMinB, amountAMin, amountBMin] = (await publicClient.readContract({
73
+ address: routerAddress,
74
+ abi: abis_1.ROUTER_ABI,
75
+ functionName: 'generateZapOutParams',
76
+ args: [token0, token1, factoryAddr, liquidity, routesA, routesB],
77
+ }));
78
+ const finalAmountOutFromA = (0, liquidityHelpers_1.calculateMinAmount)(amountOutMinA, options.slippageTolerance);
79
+ const finalAmountOutFromB = (0, liquidityHelpers_1.calculateMinAmount)(amountOutMinB, options.slippageTolerance);
80
+ return {
81
+ amountOutFromA: finalAmountOutFromA,
82
+ amountOutFromB: finalAmountOutFromB,
83
+ amountAMin: (0, liquidityHelpers_1.calculateMinAmount)(amountAMin, options.slippageTolerance),
84
+ amountBMin: (0, liquidityHelpers_1.calculateMinAmount)(amountBMin, options.slippageTolerance),
85
+ estimatedMinTokenOut: finalAmountOutFromA + finalAmountOutFromB,
86
+ };
87
+ }
88
+ async function buildZapOutDetailsForRoutes(publicClient, chainId, poolAddress, tokenOut, liquidity, token0, token1, factoryAddr, routesA, routesB, options) {
89
+ const routerAddress = (0, constants_1.getContractAddress)(chainId, 'Router');
90
+ const [amountOutMinA, amountOutMinB, amountAMin, amountBMin] = (await publicClient.readContract({
91
+ address: routerAddress,
92
+ abi: abis_1.ROUTER_ABI,
93
+ functionName: 'generateZapOutParams',
94
+ args: [token0, token1, factoryAddr, liquidity, routesA, routesB],
95
+ }));
96
+ const finalAmountAMin = (0, liquidityHelpers_1.calculateMinAmount)(amountAMin, options.slippageTolerance);
97
+ const finalAmountBMin = (0, liquidityHelpers_1.calculateMinAmount)(amountBMin, options.slippageTolerance);
98
+ const finalAmountOutMinA = (0, liquidityHelpers_1.calculateMinAmount)(amountOutMinA, options.slippageTolerance);
99
+ const finalAmountOutMinB = (0, liquidityHelpers_1.calculateMinAmount)(amountOutMinB, options.slippageTolerance);
100
+ const zapParams = {
101
+ tokenA: token0,
102
+ tokenB: token1,
103
+ factory: factoryAddr,
104
+ amountAMin: finalAmountAMin,
105
+ amountBMin: finalAmountBMin,
106
+ amountOutMinA: finalAmountOutMinA,
107
+ amountOutMinB: finalAmountOutMinB,
108
+ };
109
+ const data = (0, zapHelpers_1.encodeZapOutCall)(tokenOut, liquidity, zapParams, routesA, routesB);
110
+ return {
111
+ params: {
112
+ to: routerAddress,
113
+ data,
114
+ value: '0',
115
+ },
116
+ poolAddress,
117
+ tokenOut,
118
+ liquidity,
119
+ routesA,
120
+ routesB,
121
+ zapParams,
122
+ estimatedMinTokenOut: finalAmountOutMinA + finalAmountOutMinB,
123
+ };
124
+ }
125
+ async function findViableZapOutDetails(publicClient, chainId, poolService, routeService, poolAddress, tokenOut, liquidity, owner, options) {
126
+ const { token0, token1, factoryAddr } = await (0, liquidityHelpers_1.getPoolInfo)(poolService, poolAddress);
127
+ const routerAddress = (0, constants_1.getContractAddress)(chainId, 'Router');
128
+ const routesAOptions = await getEncodedRouteCandidates(routeService, token0, tokenOut, poolAddress);
129
+ const routesBOptions = await getEncodedRouteCandidates(routeService, token1, tokenOut, poolAddress);
130
+ let best = null;
131
+ let combinationsTried = 0;
132
+ outer: for (const routesA of routesAOptions) {
133
+ for (const routesB of routesBOptions) {
134
+ if (combinationsTried >= MAX_ROUTE_COMBINATIONS) {
135
+ break outer;
136
+ }
137
+ combinationsTried += 1;
138
+ try {
139
+ const candidate = await buildZapOutDetailsForRoutes(publicClient, chainId, poolAddress, tokenOut, liquidity, token0, token1, factoryAddr, routesA, routesB, options);
140
+ await simulateZapOut(publicClient, owner, routerAddress, candidate.params.data);
141
+ if (!best || candidate.estimatedMinTokenOut > best.estimatedMinTokenOut) {
142
+ best = candidate;
143
+ }
144
+ }
145
+ catch {
146
+ // Ignore non-viable route combination and continue searching.
147
+ }
148
+ }
149
+ }
150
+ if (!best) {
151
+ throw new errors_1.ZapOutRouteNotViableError(poolAddress, tokenOut);
152
+ }
153
+ return best;
154
+ }
155
+ async function getEncodedRouteCandidates(routeService, tokenIn, tokenOut, sourcePoolAddress) {
156
+ if (tokenIn.toLowerCase() === tokenOut.toLowerCase()) {
157
+ return [[]];
158
+ }
159
+ const rawCandidates = [];
160
+ // Include the SDK default first for consistency.
161
+ try {
162
+ rawCandidates.push(await routeService.findRoute(tokenIn, tokenOut));
163
+ }
164
+ catch {
165
+ // Continue; we'll try full route enumeration next.
166
+ }
167
+ // Build a broader candidate set for fallback route selection.
168
+ const allRoutes = await routeService.getRoutes({ cached: false, returnAllRoutes: true });
169
+ const pairCandidates = allRoutes.filter((route) => {
170
+ const a0 = route.tokens[0].address.toLowerCase();
171
+ const a1 = route.tokens[1].address.toLowerCase();
172
+ const t0 = tokenIn.toLowerCase();
173
+ const t1 = tokenOut.toLowerCase();
174
+ return (a0 === t0 && a1 === t1) || (a0 === t1 && a1 === t0);
175
+ });
176
+ rawCandidates.push(...pairCandidates);
177
+ if (rawCandidates.length === 0) {
178
+ throw new errors_1.RouteNotFoundError(tokenIn, tokenOut);
179
+ }
180
+ // Prioritize routes that avoid swapping through the same pool being zapped out.
181
+ rawCandidates.sort((a, b) => {
182
+ const aUsesSourcePool = routeUsesPool(a, sourcePoolAddress) ? 1 : 0;
183
+ const bUsesSourcePool = routeUsesPool(b, sourcePoolAddress) ? 1 : 0;
184
+ if (aUsesSourcePool !== bUsesSourcePool)
185
+ return aUsesSourcePool - bUsesSourcePool;
186
+ if (a.path.length !== b.path.length)
187
+ return a.path.length - b.path.length;
188
+ return 0;
189
+ });
190
+ const encodedRoutes = [];
191
+ const seen = new Set();
192
+ for (const route of rawCandidates) {
193
+ try {
194
+ const encoded = (0, pathEncoder_1.encodeRoutePath)(route.path, tokenIn, tokenOut);
195
+ const key = JSON.stringify(encoded);
196
+ if (seen.has(key))
197
+ continue;
198
+ seen.add(key);
199
+ encodedRoutes.push(encoded);
200
+ if (encodedRoutes.length >= MAX_ROUTE_CANDIDATES_PER_LEG) {
201
+ break;
202
+ }
203
+ }
204
+ catch {
205
+ // Invalid path encoding for this direction; skip.
206
+ }
207
+ }
208
+ if (encodedRoutes.length === 0) {
209
+ throw new errors_1.RouteNotFoundError(tokenIn, tokenOut);
210
+ }
211
+ return encodedRoutes;
212
+ }
213
+ function routeUsesPool(route, poolAddress) {
214
+ const normalizedPool = poolAddress.toLowerCase();
215
+ return route.path.some((hop) => hop.poolAddr.toLowerCase() === normalizedPool);
216
+ }
217
+ async function simulateZapOut(publicClient, owner, routerAddress, data) {
218
+ await publicClient.call({
219
+ account: owner,
220
+ to: routerAddress,
221
+ data,
222
+ });
223
+ }
224
+ function isInsufficientLiquidityError(error) {
225
+ const message = extractErrorMessage(error).toLowerCase();
226
+ return (message.includes(INSUFFICIENT_LIQUIDITY_SELECTOR) ||
227
+ message.includes('insufficientliquidity'));
228
+ }
229
+ function extractErrorMessage(error) {
230
+ if (!(error instanceof Error)) {
231
+ return String(error);
232
+ }
233
+ const typed = error;
234
+ const parts = [
235
+ typed.message,
236
+ typed.shortMessage,
237
+ typed.details,
238
+ typed.cause instanceof Error ? typed.cause.message : undefined,
239
+ ].filter((part) => Boolean(part));
240
+ return parts.join(' | ');
241
+ }
242
+ //# sourceMappingURL=zapOut.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"zapOut.js","sourceRoot":"","sources":["../../../src/services/liquidity/zapOut.ts"],"names":[],"mappings":"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"}