@mento-protocol/mento-sdk 3.2.7 → 3.3.0-beta.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (302) hide show
  1. package/dist/cache/routes.d.ts +13 -0
  2. package/dist/cache/routes.js +14588 -0
  3. package/dist/cache/tokens.d.ts +68 -0
  4. package/dist/cache/tokens.js +514 -0
  5. package/dist/core/abis/activePool.d.ts +2 -0
  6. package/dist/core/abis/activePool.js +14 -0
  7. package/dist/core/abis/addressesRegistry.d.ts +2 -0
  8. package/dist/core/abis/addressesRegistry.js +26 -0
  9. package/dist/core/abis/bipoolmanager.d.ts +34 -0
  10. package/dist/core/abis/bipoolmanager.js +72 -0
  11. package/dist/core/abis/borrowerOperations.d.ts +9 -0
  12. package/dist/core/abis/borrowerOperations.js +89 -0
  13. package/dist/core/abis/breakerbox.d.ts +13 -0
  14. package/dist/core/abis/breakerbox.js +8 -0
  15. package/dist/core/abis/broker.d.ts +2 -0
  16. package/dist/core/abis/broker.js +9 -0
  17. package/dist/core/abis/erc20.d.ts +9 -0
  18. package/dist/core/abis/erc20.js +21 -0
  19. package/dist/core/abis/fpmm.d.ts +270 -0
  20. package/dist/core/abis/fpmm.js +49 -0
  21. package/dist/core/abis/fpmmFactory.d.ts +85 -0
  22. package/dist/core/abis/fpmmFactory.js +26 -0
  23. package/dist/core/abis/hintHelpers.d.ts +2 -0
  24. package/dist/core/abis/hintHelpers.js +14 -0
  25. package/dist/core/abis/index.d.ts +22 -0
  26. package/dist/core/abis/index.js +38 -0
  27. package/dist/core/abis/liquidityStrategy.d.ts +132 -0
  28. package/dist/core/abis/liquidityStrategy.js +10 -0
  29. package/dist/core/abis/multiTroveGetter.d.ts +8 -0
  30. package/dist/core/abis/multiTroveGetter.js +15 -0
  31. package/dist/core/abis/priceFeed.d.ts +7 -0
  32. package/dist/core/abis/priceFeed.js +16 -0
  33. package/dist/core/abis/pricingmodule.d.ts +2 -0
  34. package/dist/core/abis/pricingmodule.js +6 -0
  35. package/dist/core/abis/reserve.d.ts +3 -0
  36. package/dist/core/abis/reserve.js +18 -0
  37. package/dist/core/abis/router.d.ts +521 -0
  38. package/dist/core/abis/router.js +45 -0
  39. package/dist/core/abis/sortedTroves.d.ts +2 -0
  40. package/dist/core/abis/sortedTroves.js +15 -0
  41. package/dist/core/abis/systemParams.d.ts +2 -0
  42. package/dist/core/abis/systemParams.js +14 -0
  43. package/dist/core/abis/troveManager.d.ts +2 -0
  44. package/dist/core/abis/troveManager.js +27 -0
  45. package/dist/core/abis/troveNFT.d.ts +2 -0
  46. package/dist/core/abis/troveNFT.js +9 -0
  47. package/dist/core/abis/virtualPool.d.ts +50 -0
  48. package/dist/core/abis/virtualPool.js +11 -0
  49. package/dist/core/abis/virtualPoolFactory.d.ts +59 -0
  50. package/dist/core/abis/virtualPoolFactory.js +17 -0
  51. package/dist/core/constants/addresses.d.ts +18 -0
  52. package/dist/core/constants/addresses.js +125 -0
  53. package/dist/core/constants/borrowConstants.d.ts +10 -0
  54. package/dist/core/constants/borrowConstants.js +16 -0
  55. package/dist/core/constants/borrowRegistries.d.ts +7 -0
  56. package/dist/core/constants/borrowRegistries.js +34 -0
  57. package/dist/core/constants/chainId.d.ts +8 -0
  58. package/dist/core/constants/chainId.js +12 -0
  59. package/dist/core/constants/contractNames.d.ts +21 -0
  60. package/dist/core/constants/contractNames.js +24 -0
  61. package/dist/core/constants/index.d.ts +6 -0
  62. package/dist/core/constants/index.js +22 -0
  63. package/dist/core/errors/base.d.ts +8 -0
  64. package/dist/core/errors/base.js +17 -0
  65. package/dist/core/errors/index.d.ts +4 -0
  66. package/dist/core/errors/index.js +20 -0
  67. package/dist/core/errors/oracle.d.ts +9 -0
  68. package/dist/core/errors/oracle.js +15 -0
  69. package/dist/core/errors/router.d.ts +14 -0
  70. package/dist/core/errors/router.js +24 -0
  71. package/dist/core/types/borrow.d.ts +87 -0
  72. package/dist/core/types/borrow.js +3 -0
  73. package/dist/core/types/contractAddresses.d.ts +42 -0
  74. package/dist/core/types/contractAddresses.js +3 -0
  75. package/dist/core/types/index.d.ts +10 -0
  76. package/dist/core/types/index.js +26 -0
  77. package/dist/core/types/liquidity.d.ts +194 -0
  78. package/dist/core/types/liquidity.js +3 -0
  79. package/dist/core/types/pool.d.ts +208 -0
  80. package/dist/core/types/pool.js +14 -0
  81. package/dist/core/types/provider.d.ts +45 -0
  82. package/dist/core/types/provider.js +3 -0
  83. package/dist/core/types/route.d.ts +62 -0
  84. package/dist/core/types/route.js +3 -0
  85. package/dist/core/types/token.d.ts +21 -0
  86. package/dist/core/types/token.js +3 -0
  87. package/dist/core/types/tradingLimits.d.ts +91 -0
  88. package/dist/core/types/tradingLimits.js +3 -0
  89. package/dist/core/types/tradingMode.d.ts +24 -0
  90. package/dist/core/types/tradingMode.js +31 -0
  91. package/dist/core/types/transaction.d.ts +45 -0
  92. package/dist/core/types/transaction.js +3 -0
  93. package/dist/esm/cache/routes.js +14583 -0
  94. package/dist/esm/cache/tokens.js +506 -0
  95. package/dist/esm/core/abis/activePool.js +10 -0
  96. package/dist/esm/core/abis/addressesRegistry.js +22 -0
  97. package/dist/esm/core/abis/bipoolmanager.js +68 -0
  98. package/dist/esm/core/abis/borrowerOperations.js +85 -0
  99. package/dist/esm/core/abis/breakerbox.js +4 -0
  100. package/dist/esm/core/abis/broker.js +5 -0
  101. package/dist/esm/core/abis/erc20.js +17 -0
  102. package/dist/esm/core/abis/fpmm.js +45 -0
  103. package/dist/esm/core/abis/fpmmFactory.js +22 -0
  104. package/dist/esm/core/abis/hintHelpers.js +10 -0
  105. package/dist/esm/core/abis/index.js +21 -0
  106. package/dist/esm/core/abis/liquidityStrategy.js +6 -0
  107. package/dist/esm/core/abis/multiTroveGetter.js +11 -0
  108. package/dist/esm/core/abis/priceFeed.js +12 -0
  109. package/dist/esm/core/abis/pricingmodule.js +2 -0
  110. package/dist/esm/core/abis/reserve.js +14 -0
  111. package/dist/esm/core/abis/router.js +41 -0
  112. package/dist/esm/core/abis/sortedTroves.js +11 -0
  113. package/dist/esm/core/abis/systemParams.js +10 -0
  114. package/dist/esm/core/abis/troveManager.js +23 -0
  115. package/dist/esm/core/abis/troveNFT.js +5 -0
  116. package/dist/esm/core/abis/virtualPool.js +7 -0
  117. package/dist/esm/core/abis/virtualPoolFactory.js +13 -0
  118. package/dist/esm/core/constants/addresses.js +119 -0
  119. package/dist/esm/core/constants/borrowConstants.js +12 -0
  120. package/dist/esm/core/constants/borrowRegistries.js +29 -0
  121. package/dist/esm/core/constants/chainId.js +8 -0
  122. package/dist/esm/core/constants/contractNames.js +20 -0
  123. package/dist/esm/core/constants/index.js +5 -0
  124. package/dist/esm/core/errors/base.js +12 -0
  125. package/dist/esm/core/errors/index.js +3 -0
  126. package/dist/esm/core/errors/oracle.js +10 -0
  127. package/dist/esm/core/errors/router.js +18 -0
  128. package/dist/esm/core/types/borrow.js +1 -0
  129. package/dist/esm/core/types/contractAddresses.js +1 -0
  130. package/dist/esm/core/types/index.js +9 -0
  131. package/dist/esm/core/types/liquidity.js +1 -0
  132. package/dist/esm/core/types/pool.js +10 -0
  133. package/dist/esm/core/types/provider.js +1 -0
  134. package/dist/esm/core/types/route.js +1 -0
  135. package/dist/esm/core/types/token.js +1 -0
  136. package/dist/esm/core/types/tradingLimits.js +1 -0
  137. package/dist/esm/core/types/tradingMode.js +26 -0
  138. package/dist/esm/core/types/transaction.js +1 -0
  139. package/dist/esm/index.js +139 -0
  140. package/dist/esm/package.json +1 -0
  141. package/dist/esm/services/borrow/BorrowService.js +455 -0
  142. package/dist/esm/services/borrow/borrowHelpers.js +3 -0
  143. package/dist/esm/services/borrow/borrowMath.js +127 -0
  144. package/dist/esm/services/borrow/index.js +3 -0
  145. package/dist/esm/services/borrow/internal/borrowApprovalService.js +48 -0
  146. package/dist/esm/services/borrow/internal/borrowContextStore.js +35 -0
  147. package/dist/esm/services/borrow/internal/borrowErc20.js +38 -0
  148. package/dist/esm/services/borrow/internal/borrowHints.js +27 -0
  149. package/dist/esm/services/borrow/internal/borrowPositionParser.js +82 -0
  150. package/dist/esm/services/borrow/internal/borrowReadService.js +271 -0
  151. package/dist/esm/services/borrow/internal/borrowRegistryReader.js +108 -0
  152. package/dist/esm/services/borrow/internal/borrowTransactionService.js +271 -0
  153. package/dist/esm/services/borrow/internal/borrowTypes.js +1 -0
  154. package/dist/esm/services/borrow/internal/borrowValidation.js +89 -0
  155. package/dist/esm/services/index.js +8 -0
  156. package/dist/esm/services/liquidity/LiquidityService.js +163 -0
  157. package/dist/esm/services/liquidity/basicLiquidity.js +162 -0
  158. package/dist/esm/services/liquidity/index.js +1 -0
  159. package/dist/esm/services/liquidity/liquidityHelpers.js +95 -0
  160. package/dist/esm/services/liquidity/rebalance.js +59 -0
  161. package/dist/esm/services/liquidity/zapHelpers.js +181 -0
  162. package/dist/esm/services/liquidity/zapIn.js +131 -0
  163. package/dist/esm/services/liquidity/zapOut.js +248 -0
  164. package/dist/esm/services/pools/PoolService.js +204 -0
  165. package/dist/esm/services/pools/index.js +1 -0
  166. package/dist/esm/services/pools/poolDetails.js +209 -0
  167. package/dist/esm/services/pools/poolDiscovery.js +112 -0
  168. package/dist/esm/services/pools/rebalancePreview.js +181 -0
  169. package/dist/esm/services/quotes/QuoteService.js +85 -0
  170. package/dist/esm/services/quotes/index.js +1 -0
  171. package/dist/esm/services/routes/RouteService.js +268 -0
  172. package/dist/esm/services/routes/index.js +1 -0
  173. package/dist/esm/services/swap/SwapService.js +247 -0
  174. package/dist/esm/services/swap/index.js +1 -0
  175. package/dist/esm/services/tokens/index.js +1 -0
  176. package/dist/esm/services/tokens/tokenService.js +285 -0
  177. package/dist/esm/services/trading/TradingLimitsService.js +154 -0
  178. package/dist/esm/services/trading/TradingService.js +222 -0
  179. package/dist/esm/services/trading/index.js +2 -0
  180. package/dist/esm/utils/chainConfig.js +122 -0
  181. package/dist/esm/utils/costUtils.js +56 -0
  182. package/dist/esm/utils/deadline.js +22 -0
  183. package/dist/esm/utils/index.js +9 -0
  184. package/dist/esm/utils/multicall.js +47 -0
  185. package/dist/esm/utils/pathEncoder.js +69 -0
  186. package/dist/esm/utils/rateFeed.js +23 -0
  187. package/dist/esm/utils/retry.js +24 -0
  188. package/dist/esm/utils/routeUtils.js +361 -0
  189. package/dist/esm/utils/routes.js +2 -0
  190. package/dist/esm/utils/sortUtils.js +33 -0
  191. package/dist/esm/utils/tokens.js +2 -0
  192. package/dist/esm/utils/tradingLimits.js +163 -0
  193. package/dist/esm/utils/validation.js +30 -0
  194. package/dist/index.d.ts +101 -0
  195. package/dist/index.js +158 -0
  196. package/dist/services/borrow/BorrowService.d.ts +381 -0
  197. package/dist/services/borrow/BorrowService.js +460 -0
  198. package/dist/services/borrow/borrowHelpers.d.ts +4 -0
  199. package/dist/services/borrow/borrowHelpers.js +13 -0
  200. package/dist/services/borrow/borrowMath.d.ts +21 -0
  201. package/dist/services/borrow/borrowMath.js +137 -0
  202. package/dist/services/borrow/index.d.ts +4 -0
  203. package/dist/services/borrow/index.js +20 -0
  204. package/dist/services/borrow/internal/borrowApprovalService.d.ts +14 -0
  205. package/dist/services/borrow/internal/borrowApprovalService.js +53 -0
  206. package/dist/services/borrow/internal/borrowContextStore.d.ts +11 -0
  207. package/dist/services/borrow/internal/borrowContextStore.js +40 -0
  208. package/dist/services/borrow/internal/borrowErc20.d.ts +5 -0
  209. package/dist/services/borrow/internal/borrowErc20.js +43 -0
  210. package/dist/services/borrow/internal/borrowHints.d.ts +7 -0
  211. package/dist/services/borrow/internal/borrowHints.js +31 -0
  212. package/dist/services/borrow/internal/borrowPositionParser.d.ts +4 -0
  213. package/dist/services/borrow/internal/borrowPositionParser.js +87 -0
  214. package/dist/services/borrow/internal/borrowReadService.d.ts +31 -0
  215. package/dist/services/borrow/internal/borrowReadService.js +276 -0
  216. package/dist/services/borrow/internal/borrowRegistryReader.d.ts +5 -0
  217. package/dist/services/borrow/internal/borrowRegistryReader.js +113 -0
  218. package/dist/services/borrow/internal/borrowTransactionService.d.ts +23 -0
  219. package/dist/services/borrow/internal/borrowTransactionService.js +276 -0
  220. package/dist/services/borrow/internal/borrowTypes.d.ts +15 -0
  221. package/dist/services/borrow/internal/borrowTypes.js +3 -0
  222. package/dist/services/borrow/internal/borrowValidation.d.ts +14 -0
  223. package/dist/services/borrow/internal/borrowValidation.js +104 -0
  224. package/dist/services/index.d.ts +9 -0
  225. package/dist/services/index.js +25 -0
  226. package/dist/services/liquidity/LiquidityService.d.ts +139 -0
  227. package/dist/services/liquidity/LiquidityService.js +168 -0
  228. package/dist/services/liquidity/basicLiquidity.d.ts +11 -0
  229. package/dist/services/liquidity/basicLiquidity.js +172 -0
  230. package/dist/services/liquidity/index.d.ts +2 -0
  231. package/dist/services/liquidity/index.js +18 -0
  232. package/dist/services/liquidity/liquidityHelpers.d.ts +19 -0
  233. package/dist/services/liquidity/liquidityHelpers.js +104 -0
  234. package/dist/services/liquidity/rebalance.d.ts +6 -0
  235. package/dist/services/liquidity/rebalance.js +64 -0
  236. package/dist/services/liquidity/zapHelpers.d.ts +100 -0
  237. package/dist/services/liquidity/zapHelpers.js +192 -0
  238. package/dist/services/liquidity/zapIn.d.ts +18 -0
  239. package/dist/services/liquidity/zapIn.js +138 -0
  240. package/dist/services/liquidity/zapOut.d.ts +9 -0
  241. package/dist/services/liquidity/zapOut.js +255 -0
  242. package/dist/services/pools/PoolService.d.ts +69 -0
  243. package/dist/services/pools/PoolService.js +209 -0
  244. package/dist/services/pools/index.d.ts +2 -0
  245. package/dist/services/pools/index.js +18 -0
  246. package/dist/services/pools/poolDetails.d.ts +13 -0
  247. package/dist/services/pools/poolDetails.js +216 -0
  248. package/dist/services/pools/poolDiscovery.d.ts +12 -0
  249. package/dist/services/pools/poolDiscovery.js +117 -0
  250. package/dist/services/pools/rebalancePreview.d.ts +5 -0
  251. package/dist/services/pools/rebalancePreview.js +186 -0
  252. package/dist/services/quotes/QuoteService.d.ts +51 -0
  253. package/dist/services/quotes/QuoteService.js +91 -0
  254. package/dist/services/quotes/index.d.ts +2 -0
  255. package/dist/services/quotes/index.js +18 -0
  256. package/dist/services/routes/RouteService.d.ts +117 -0
  257. package/dist/services/routes/RouteService.js +306 -0
  258. package/dist/services/routes/index.d.ts +2 -0
  259. package/dist/services/routes/index.js +18 -0
  260. package/dist/services/swap/SwapService.d.ts +198 -0
  261. package/dist/services/swap/SwapService.js +252 -0
  262. package/dist/services/swap/index.d.ts +2 -0
  263. package/dist/services/swap/index.js +18 -0
  264. package/dist/services/tokens/index.d.ts +2 -0
  265. package/dist/services/tokens/index.js +18 -0
  266. package/dist/services/tokens/tokenService.d.ts +55 -0
  267. package/dist/services/tokens/tokenService.js +290 -0
  268. package/dist/services/trading/TradingLimitsService.d.ts +38 -0
  269. package/dist/services/trading/TradingLimitsService.js +159 -0
  270. package/dist/services/trading/TradingService.d.ts +115 -0
  271. package/dist/services/trading/TradingService.js +227 -0
  272. package/dist/services/trading/index.d.ts +3 -0
  273. package/dist/services/trading/index.js +19 -0
  274. package/dist/utils/chainConfig.d.ts +16 -0
  275. package/dist/utils/chainConfig.js +127 -0
  276. package/dist/utils/costUtils.d.ts +12 -0
  277. package/dist/utils/costUtils.js +60 -0
  278. package/dist/utils/deadline.d.ts +21 -0
  279. package/dist/utils/deadline.js +26 -0
  280. package/dist/utils/index.d.ts +10 -0
  281. package/dist/utils/index.js +26 -0
  282. package/dist/utils/multicall.d.ts +30 -0
  283. package/dist/utils/multicall.js +52 -0
  284. package/dist/utils/pathEncoder.d.ts +34 -0
  285. package/dist/utils/pathEncoder.js +73 -0
  286. package/dist/utils/rateFeed.d.ts +18 -0
  287. package/dist/utils/rateFeed.js +27 -0
  288. package/dist/utils/retry.d.ts +12 -0
  289. package/dist/utils/retry.js +28 -0
  290. package/dist/utils/routeUtils.d.ts +295 -0
  291. package/dist/utils/routeUtils.js +371 -0
  292. package/dist/utils/routes.d.ts +3 -0
  293. package/dist/utils/routes.js +8 -0
  294. package/dist/utils/sortUtils.d.ts +24 -0
  295. package/dist/utils/sortUtils.js +39 -0
  296. package/dist/utils/tokens.d.ts +2 -0
  297. package/dist/utils/tokens.js +13 -0
  298. package/dist/utils/tradingLimits.d.ts +41 -0
  299. package/dist/utils/tradingLimits.js +171 -0
  300. package/dist/utils/validation.d.ts +19 -0
  301. package/dist/utils/validation.js +34 -0
  302. package/package.json +1 -1
@@ -0,0 +1,255 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.buildZapOutTransactionInternal = buildZapOutTransactionInternal;
4
+ exports.buildZapOutParamsInternal = buildZapOutParamsInternal;
5
+ exports.quoteZapOutInternal = quoteZapOutInternal;
6
+ exports.prepareZapOutInternal = prepareZapOutInternal;
7
+ const abis_1 = require("../../core/abis");
8
+ const constants_1 = require("../../core/constants");
9
+ const errors_1 = require("../../core/errors");
10
+ const validation_1 = require("../../utils/validation");
11
+ const pathEncoder_1 = require("../../utils/pathEncoder");
12
+ const liquidityHelpers_1 = require("./liquidityHelpers");
13
+ const zapHelpers_1 = require("./zapHelpers");
14
+ const INSUFFICIENT_LIQUIDITY_SELECTOR = '0xbb55fd27';
15
+ const MAX_ROUTE_CANDIDATES_PER_LEG = 8;
16
+ const MAX_ROUTE_COMBINATIONS = 48;
17
+ const ROUTE_SIMULATION_BATCH_SIZE = 6;
18
+ async function buildZapOutTransactionInternal(publicClient, chainId, poolService, routeService, poolAddress, tokenOut, liquidity, recipient, owner, options) {
19
+ const prepared = await prepareZapOutInternal(publicClient, chainId, poolService, routeService, poolAddress, tokenOut, liquidity, recipient, owner, options);
20
+ return {
21
+ approval: prepared.approval ?? null,
22
+ zapOut: prepared.details,
23
+ };
24
+ }
25
+ async function buildZapOutParamsInternal(publicClient, chainId, poolService, routeService, poolAddress, tokenOut, liquidity, recipient, options) {
26
+ const prepared = await prepareZapOutInternal(publicClient, chainId, poolService, routeService, poolAddress, tokenOut, liquidity, recipient, undefined, options);
27
+ return prepared.details;
28
+ }
29
+ async function quoteZapOutInternal(publicClient, chainId, poolService, routeService, poolAddress, tokenOut, liquidity, options) {
30
+ const prepared = await prepareZapOutInternal(publicClient, chainId, poolService, routeService, poolAddress, tokenOut, liquidity, tokenOut, undefined, options);
31
+ return prepared.quote;
32
+ }
33
+ async function prepareZapOutInternal(publicClient, chainId, poolService, routeService, poolAddress, tokenOut, liquidity, recipient, owner, options) {
34
+ if (owner) {
35
+ (0, validation_1.validateAddress)(owner, 'owner');
36
+ }
37
+ const [context, currentAllowance] = await Promise.all([
38
+ prepareZapOutContextInternal(publicClient, chainId, poolService, routeService, poolAddress, tokenOut, liquidity, recipient, options),
39
+ owner ? (0, liquidityHelpers_1.getAllowance)(publicClient, poolAddress, owner, chainId) : Promise.resolve(null),
40
+ ]);
41
+ let details = context.details;
42
+ const approval = owner && currentAllowance !== null && currentAllowance < liquidity
43
+ ? { token: poolAddress, amount: liquidity, params: (0, liquidityHelpers_1.buildApprovalParams)(chainId, poolAddress, liquidity) }
44
+ : owner
45
+ ? null
46
+ : undefined;
47
+ if (owner && currentAllowance !== null && currentAllowance >= liquidity) {
48
+ const ownerAddr = owner;
49
+ const routerAddress = (0, constants_1.getContractAddress)(chainId, 'Router');
50
+ try {
51
+ await simulateZapOut(publicClient, ownerAddr, routerAddress, details.params.data);
52
+ }
53
+ catch (error) {
54
+ if (!isInsufficientLiquidityError(error)) {
55
+ throw error;
56
+ }
57
+ details = await findViableZapOutDetails(publicClient, chainId, poolService, routeService, poolAddress, tokenOut, liquidity, ownerAddr, options);
58
+ }
59
+ }
60
+ return {
61
+ routesA: details.routesA,
62
+ routesB: details.routesB,
63
+ quote: {
64
+ amountOutFromA: details.zapParams.amountOutMinA,
65
+ amountOutFromB: details.zapParams.amountOutMinB,
66
+ amountAMin: details.zapParams.amountAMin,
67
+ amountBMin: details.zapParams.amountBMin,
68
+ estimatedMinTokenOut: details.estimatedMinTokenOut,
69
+ },
70
+ approval,
71
+ details,
72
+ };
73
+ }
74
+ async function prepareZapOutContextInternal(publicClient, chainId, poolService, routeService, poolAddress, tokenOut, liquidity, recipient, options) {
75
+ (0, validation_1.validateAddress)(poolAddress, 'poolAddress');
76
+ (0, validation_1.validateAddress)(tokenOut, 'tokenOut');
77
+ (0, validation_1.validateAddress)(recipient, 'recipient');
78
+ const { token0, token1, factoryAddr } = await (0, liquidityHelpers_1.getPoolInfo)(poolService, poolAddress);
79
+ const { routesA, routesB } = await (0, zapHelpers_1.findZapOutRoutes)(routeService, token0, token1, tokenOut);
80
+ const details = await buildZapOutDetailsForRoutes(publicClient, chainId, poolAddress, tokenOut, liquidity, token0, token1, factoryAddr, routesA, routesB, options);
81
+ return {
82
+ routesA,
83
+ routesB,
84
+ quote: {
85
+ amountOutFromA: details.zapParams.amountOutMinA,
86
+ amountOutFromB: details.zapParams.amountOutMinB,
87
+ amountAMin: details.zapParams.amountAMin,
88
+ amountBMin: details.zapParams.amountBMin,
89
+ estimatedMinTokenOut: details.estimatedMinTokenOut,
90
+ },
91
+ details,
92
+ };
93
+ }
94
+ async function buildZapOutDetailsForRoutes(publicClient, chainId, poolAddress, tokenOut, liquidity, token0, token1, factoryAddr, routesA, routesB, options) {
95
+ const routerAddress = (0, constants_1.getContractAddress)(chainId, 'Router');
96
+ const [amountOutMinA, amountOutMinB, amountAMin, amountBMin] = (await publicClient.readContract({
97
+ address: routerAddress,
98
+ abi: abis_1.ROUTER_ABI,
99
+ functionName: 'generateZapOutParams',
100
+ args: [token0, token1, factoryAddr, liquidity, routesA, routesB],
101
+ }));
102
+ const finalAmountAMin = (0, liquidityHelpers_1.calculateMinAmount)(amountAMin, options.slippageTolerance);
103
+ const finalAmountBMin = (0, liquidityHelpers_1.calculateMinAmount)(amountBMin, options.slippageTolerance);
104
+ const finalAmountOutMinA = (0, liquidityHelpers_1.calculateMinAmount)(amountOutMinA, options.slippageTolerance);
105
+ const finalAmountOutMinB = (0, liquidityHelpers_1.calculateMinAmount)(amountOutMinB, options.slippageTolerance);
106
+ const zapParams = {
107
+ tokenA: token0,
108
+ tokenB: token1,
109
+ factory: factoryAddr,
110
+ amountAMin: finalAmountAMin,
111
+ amountBMin: finalAmountBMin,
112
+ amountOutMinA: finalAmountOutMinA,
113
+ amountOutMinB: finalAmountOutMinB,
114
+ };
115
+ const data = (0, zapHelpers_1.encodeZapOutCall)(tokenOut, liquidity, zapParams, routesA, routesB);
116
+ return {
117
+ params: {
118
+ to: routerAddress,
119
+ data,
120
+ value: '0',
121
+ },
122
+ poolAddress,
123
+ tokenOut,
124
+ liquidity,
125
+ routesA,
126
+ routesB,
127
+ zapParams,
128
+ estimatedMinTokenOut: finalAmountOutMinA + finalAmountOutMinB,
129
+ };
130
+ }
131
+ async function findViableZapOutDetails(publicClient, chainId, poolService, routeService, poolAddress, tokenOut, liquidity, owner, options) {
132
+ const { token0, token1, factoryAddr } = await (0, liquidityHelpers_1.getPoolInfo)(poolService, poolAddress);
133
+ const routerAddress = (0, constants_1.getContractAddress)(chainId, 'Router');
134
+ const allRoutes = await routeService.getRoutes({ cached: false, returnAllRoutes: true });
135
+ const [routesAOptions, routesBOptions] = await Promise.all([
136
+ getEncodedRouteCandidates(routeService, token0, tokenOut, poolAddress, allRoutes),
137
+ getEncodedRouteCandidates(routeService, token1, tokenOut, poolAddress, allRoutes),
138
+ ]);
139
+ const routeCombinations = [];
140
+ outer: for (const routesA of routesAOptions) {
141
+ for (const routesB of routesBOptions) {
142
+ routeCombinations.push({ routesA, routesB });
143
+ if (routeCombinations.length >= MAX_ROUTE_COMBINATIONS) {
144
+ break outer;
145
+ }
146
+ }
147
+ }
148
+ let best = null;
149
+ for (let index = 0; index < routeCombinations.length; index += ROUTE_SIMULATION_BATCH_SIZE) {
150
+ const batch = routeCombinations.slice(index, index + ROUTE_SIMULATION_BATCH_SIZE);
151
+ const candidates = await Promise.all(batch.map(async ({ routesA, routesB }) => {
152
+ try {
153
+ const candidate = await buildZapOutDetailsForRoutes(publicClient, chainId, poolAddress, tokenOut, liquidity, token0, token1, factoryAddr, routesA, routesB, options);
154
+ await simulateZapOut(publicClient, owner, routerAddress, candidate.params.data);
155
+ return candidate;
156
+ }
157
+ catch {
158
+ return null;
159
+ }
160
+ }));
161
+ for (const candidate of candidates) {
162
+ if (candidate && (!best || candidate.estimatedMinTokenOut > best.estimatedMinTokenOut)) {
163
+ best = candidate;
164
+ }
165
+ }
166
+ }
167
+ if (!best) {
168
+ throw new errors_1.ZapOutRouteNotViableError(poolAddress, tokenOut);
169
+ }
170
+ return best;
171
+ }
172
+ async function getEncodedRouteCandidates(routeService, tokenIn, tokenOut, sourcePoolAddress, allRoutes) {
173
+ if (tokenIn.toLowerCase() === tokenOut.toLowerCase()) {
174
+ return [[]];
175
+ }
176
+ const rawCandidates = [];
177
+ try {
178
+ rawCandidates.push(await routeService.findRoute(tokenIn, tokenOut));
179
+ }
180
+ catch {
181
+ // Continue; we'll try the broader route set next.
182
+ }
183
+ const pairCandidates = (allRoutes ?? await routeService.getRoutes({ cached: false, returnAllRoutes: true })).filter((route) => {
184
+ const a0 = route.tokens[0].address.toLowerCase();
185
+ const a1 = route.tokens[1].address.toLowerCase();
186
+ const t0 = tokenIn.toLowerCase();
187
+ const t1 = tokenOut.toLowerCase();
188
+ return (a0 === t0 && a1 === t1) || (a0 === t1 && a1 === t0);
189
+ });
190
+ rawCandidates.push(...pairCandidates);
191
+ if (rawCandidates.length === 0) {
192
+ throw new errors_1.RouteNotFoundError(tokenIn, tokenOut);
193
+ }
194
+ rawCandidates.sort((routeA, routeB) => {
195
+ const routeAUsesSourcePool = routeUsesPool(routeA, sourcePoolAddress) ? 1 : 0;
196
+ const routeBUsesSourcePool = routeUsesPool(routeB, sourcePoolAddress) ? 1 : 0;
197
+ if (routeAUsesSourcePool !== routeBUsesSourcePool)
198
+ return routeAUsesSourcePool - routeBUsesSourcePool;
199
+ if (routeA.path.length !== routeB.path.length)
200
+ return routeA.path.length - routeB.path.length;
201
+ return 0;
202
+ });
203
+ const encodedRoutes = [];
204
+ const seen = new Set();
205
+ for (const route of rawCandidates) {
206
+ try {
207
+ const encoded = (0, pathEncoder_1.encodeRoutePath)(route.path, tokenIn, tokenOut);
208
+ const key = JSON.stringify(encoded);
209
+ if (seen.has(key))
210
+ continue;
211
+ seen.add(key);
212
+ encodedRoutes.push(encoded);
213
+ if (encodedRoutes.length >= MAX_ROUTE_CANDIDATES_PER_LEG) {
214
+ break;
215
+ }
216
+ }
217
+ catch {
218
+ // Invalid path encoding for this direction; skip.
219
+ }
220
+ }
221
+ if (encodedRoutes.length === 0) {
222
+ throw new errors_1.RouteNotFoundError(tokenIn, tokenOut);
223
+ }
224
+ return encodedRoutes;
225
+ }
226
+ function routeUsesPool(route, poolAddress) {
227
+ const normalizedPool = poolAddress.toLowerCase();
228
+ return route.path.some((hop) => hop.poolAddr.toLowerCase() === normalizedPool);
229
+ }
230
+ async function simulateZapOut(publicClient, owner, routerAddress, data) {
231
+ await publicClient.call({
232
+ account: owner,
233
+ to: routerAddress,
234
+ data,
235
+ });
236
+ }
237
+ function isInsufficientLiquidityError(error) {
238
+ const message = extractErrorMessage(error).toLowerCase();
239
+ return (message.includes(INSUFFICIENT_LIQUIDITY_SELECTOR) ||
240
+ message.includes('insufficientliquidity'));
241
+ }
242
+ function extractErrorMessage(error) {
243
+ if (!(error instanceof Error)) {
244
+ return String(error);
245
+ }
246
+ const typed = error;
247
+ const parts = [
248
+ typed.message,
249
+ typed.shortMessage,
250
+ typed.details,
251
+ typed.cause instanceof Error ? typed.cause.message : undefined,
252
+ ].filter((part) => Boolean(part));
253
+ return parts.join(' | ');
254
+ }
255
+ //# sourceMappingURL=zapOut.js.map
@@ -0,0 +1,69 @@
1
+ import { Pool, PoolDetails, PoolRebalancePreview } from '../../core/types';
2
+ import { PublicClient } from 'viem';
3
+ /**
4
+ * Result of pool discovery including any warnings from failed factories
5
+ */
6
+ export interface PoolDiscoveryResult {
7
+ pools: Pool[];
8
+ warnings: string[];
9
+ }
10
+ /**
11
+ * Service for discovering liquidity pools in the Mento protocol.
12
+ * Aggregates pools from multiple factory contracts (FPMM and VirtualPool).
13
+ */
14
+ export declare class PoolService {
15
+ private publicClient;
16
+ private chainId;
17
+ private poolsCache;
18
+ private discoveryWarnings;
19
+ private poolsPromise;
20
+ private poolDetailsCache;
21
+ private poolDetailPromises;
22
+ constructor(publicClient: PublicClient, chainId: number);
23
+ /**
24
+ * Returns any warnings from the last pool discovery operation.
25
+ * Useful for debugging when some factories fail but others succeed.
26
+ */
27
+ getDiscoveryWarnings(): string[];
28
+ /**
29
+ * Fetches all pools available in the protocol from both FPMM and Virtual pool factories
30
+ * Results are cached in memory for the service instance lifetime
31
+ *
32
+ * @returns Array of all pools available in the protocol
33
+ * @throws {Error} If no pools can be discovered from any factory
34
+ *
35
+ * @example
36
+ * ```typescript
37
+ * const pools = await poolService.getPools()
38
+ * console.log(`Found ${pools.length} pools`)
39
+ * ```
40
+ */
41
+ getPools(): Promise<Pool[]>;
42
+ private loadPools;
43
+ /**
44
+ * Fetches enriched on-chain details for a specific pool by address.
45
+ * Resolves the pool type from the discovery cache, then fetches
46
+ * pool-type-specific data (pricing, fees, rebalancing for FPMM; reserves and spread for Virtual).
47
+ *
48
+ * @param poolAddr - The deployed pool contract address
49
+ * @returns Enriched pool details (FPMMPoolDetails or VirtualPoolDetails)
50
+ * @throws {Error} If the pool address is not found in any known factory
51
+ * @throws {Error} If on-chain calls fail
52
+ *
53
+ * @example
54
+ * ```typescript
55
+ * const details = await poolService.getPoolDetails('0x...')
56
+ * if (details.poolType === 'FPMM') {
57
+ * console.log(details.pricing.oraclePrice)
58
+ * console.log(details.rebalancing.inBand)
59
+ * } else {
60
+ * console.log(details.spreadPercent)
61
+ * }
62
+ * ```
63
+ */
64
+ getPoolDetails(poolAddr: string): Promise<PoolDetails>;
65
+ getPoolRebalancePreview(poolAddr: string): Promise<PoolRebalancePreview | null>;
66
+ getPoolRebalancePreviewBatch(poolAddresses?: string[]): Promise<Array<PoolRebalancePreview | null>>;
67
+ getPoolDetailsBatch(poolAddresses?: string[]): Promise<PoolDetails[]>;
68
+ }
69
+ //# sourceMappingURL=PoolService.d.ts.map
@@ -0,0 +1,209 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.PoolService = void 0;
4
+ const types_1 = require("../../core/types");
5
+ const poolDiscovery_1 = require("./poolDiscovery");
6
+ const poolDetails_1 = require("./poolDetails");
7
+ const rebalancePreview_1 = require("./rebalancePreview");
8
+ /**
9
+ * Service for discovering liquidity pools in the Mento protocol.
10
+ * Aggregates pools from multiple factory contracts (FPMM and VirtualPool).
11
+ */
12
+ class PoolService {
13
+ constructor(publicClient, chainId) {
14
+ this.publicClient = publicClient;
15
+ this.chainId = chainId;
16
+ this.poolsCache = null;
17
+ this.discoveryWarnings = [];
18
+ this.poolsPromise = null;
19
+ this.poolDetailsCache = new Map();
20
+ this.poolDetailPromises = new Map();
21
+ }
22
+ /**
23
+ * Returns any warnings from the last pool discovery operation.
24
+ * Useful for debugging when some factories fail but others succeed.
25
+ */
26
+ getDiscoveryWarnings() {
27
+ return [...this.discoveryWarnings];
28
+ }
29
+ /**
30
+ * Fetches all pools available in the protocol from both FPMM and Virtual pool factories
31
+ * Results are cached in memory for the service instance lifetime
32
+ *
33
+ * @returns Array of all pools available in the protocol
34
+ * @throws {Error} If no pools can be discovered from any factory
35
+ *
36
+ * @example
37
+ * ```typescript
38
+ * const pools = await poolService.getPools()
39
+ * console.log(`Found ${pools.length} pools`)
40
+ * ```
41
+ */
42
+ async getPools() {
43
+ if (this.poolsCache) {
44
+ return this.poolsCache;
45
+ }
46
+ if (this.poolsPromise) {
47
+ return this.poolsPromise;
48
+ }
49
+ this.poolsPromise = this.loadPools();
50
+ try {
51
+ return await this.poolsPromise;
52
+ }
53
+ finally {
54
+ this.poolsPromise = null;
55
+ }
56
+ }
57
+ async loadPools() {
58
+ const warnings = [];
59
+ const settled = await Promise.allSettled([
60
+ (0, poolDiscovery_1.fetchFPMMPools)(this.publicClient, this.chainId),
61
+ (0, poolDiscovery_1.fetchVirtualPools)(this.publicClient, this.chainId),
62
+ ]);
63
+ const pools = [];
64
+ const [fpmmResult, virtualResult] = settled;
65
+ if (fpmmResult.status === 'fulfilled') {
66
+ pools.push(...fpmmResult.value);
67
+ }
68
+ else {
69
+ warnings.push(`Failed to fetch FPMM pools: ${fpmmResult.reason instanceof Error ? fpmmResult.reason.message : String(fpmmResult.reason)}`);
70
+ }
71
+ if (virtualResult.status === 'fulfilled') {
72
+ pools.push(...virtualResult.value);
73
+ }
74
+ else {
75
+ warnings.push(`Failed to fetch Virtual pools: ${virtualResult.reason instanceof Error ? virtualResult.reason.message : String(virtualResult.reason)}`);
76
+ }
77
+ this.discoveryWarnings = warnings;
78
+ // Only throw if NO pools were discovered from any factory
79
+ if (pools.length === 0) {
80
+ throw new Error('Failed to discover any pools from any factory. ' +
81
+ 'All pool factory queries failed. Check network connectivity and RPC endpoint.');
82
+ }
83
+ this.poolsCache = pools;
84
+ return pools;
85
+ }
86
+ /**
87
+ * Fetches enriched on-chain details for a specific pool by address.
88
+ * Resolves the pool type from the discovery cache, then fetches
89
+ * pool-type-specific data (pricing, fees, rebalancing for FPMM; reserves and spread for Virtual).
90
+ *
91
+ * @param poolAddr - The deployed pool contract address
92
+ * @returns Enriched pool details (FPMMPoolDetails or VirtualPoolDetails)
93
+ * @throws {Error} If the pool address is not found in any known factory
94
+ * @throws {Error} If on-chain calls fail
95
+ *
96
+ * @example
97
+ * ```typescript
98
+ * const details = await poolService.getPoolDetails('0x...')
99
+ * if (details.poolType === 'FPMM') {
100
+ * console.log(details.pricing.oraclePrice)
101
+ * console.log(details.rebalancing.inBand)
102
+ * } else {
103
+ * console.log(details.spreadPercent)
104
+ * }
105
+ * ```
106
+ */
107
+ async getPoolDetails(poolAddr) {
108
+ const [details] = await this.getPoolDetailsBatch([poolAddr]);
109
+ return details;
110
+ }
111
+ async getPoolRebalancePreview(poolAddr) {
112
+ const details = await this.getPoolDetails(poolAddr);
113
+ return (0, rebalancePreview_1.fetchPoolRebalancePreview)(this.publicClient, details);
114
+ }
115
+ async getPoolRebalancePreviewBatch(poolAddresses) {
116
+ const details = await this.getPoolDetailsBatch(poolAddresses);
117
+ return (0, rebalancePreview_1.fetchPoolRebalancePreviewBatch)(this.publicClient, details);
118
+ }
119
+ async getPoolDetailsBatch(poolAddresses) {
120
+ const pools = await this.getPools();
121
+ const targets = poolAddresses
122
+ ? poolAddresses.map((poolAddress) => {
123
+ const pool = pools.find((candidate) => candidate.poolAddr.toLowerCase() === poolAddress.toLowerCase());
124
+ if (!pool) {
125
+ throw new Error(`Pool not found: ${poolAddress}. Ensure the address is a valid pool discovered by getPools().`);
126
+ }
127
+ return pool;
128
+ })
129
+ : pools;
130
+ const results = new Array(targets.length);
131
+ const pendingResults = [];
132
+ const missingTargets = [];
133
+ for (const [index, pool] of targets.entries()) {
134
+ const key = pool.poolAddr.toLowerCase();
135
+ const cached = this.poolDetailsCache.get(key);
136
+ if (cached) {
137
+ results[index] = cached;
138
+ continue;
139
+ }
140
+ const inFlight = this.poolDetailPromises.get(key);
141
+ if (inFlight) {
142
+ pendingResults.push(inFlight.then((detail) => {
143
+ results[index] = detail;
144
+ }));
145
+ continue;
146
+ }
147
+ missingTargets.push({ pool, index, key });
148
+ }
149
+ if (missingTargets.length > 0) {
150
+ const grouped = {
151
+ fpmm: missingTargets.filter(({ pool }) => pool.poolType === types_1.PoolType.FPMM),
152
+ virtual: missingTargets.filter(({ pool }) => pool.poolType !== types_1.PoolType.FPMM),
153
+ };
154
+ const createdPromises = new Map();
155
+ const createdPendingResults = [];
156
+ for (const target of missingTargets) {
157
+ const deferred = createDeferred();
158
+ this.poolDetailPromises.set(target.key, deferred.promise);
159
+ createdPromises.set(target.key, deferred);
160
+ const pendingResult = deferred.promise.then((detail) => {
161
+ results[target.index] = detail;
162
+ });
163
+ pendingResults.push(pendingResult);
164
+ createdPendingResults.push(pendingResult);
165
+ }
166
+ try {
167
+ const [fpmmDetails, virtualDetails] = await Promise.all([
168
+ (0, poolDetails_1.fetchFPMMPoolDetailsBatch)(this.publicClient, this.chainId, grouped.fpmm.map(({ pool }) => pool)),
169
+ (0, poolDetails_1.fetchVirtualPoolDetailsBatch)(this.publicClient, grouped.virtual.map(({ pool }) => pool)),
170
+ ]);
171
+ for (const [groupIndex, detail] of fpmmDetails.entries()) {
172
+ const target = grouped.fpmm[groupIndex];
173
+ this.poolDetailsCache.set(target.key, detail);
174
+ createdPromises.get(target.key)?.resolve(detail);
175
+ }
176
+ for (const [groupIndex, detail] of virtualDetails.entries()) {
177
+ const target = grouped.virtual[groupIndex];
178
+ this.poolDetailsCache.set(target.key, detail);
179
+ createdPromises.get(target.key)?.resolve(detail);
180
+ }
181
+ }
182
+ catch (error) {
183
+ for (const target of missingTargets) {
184
+ createdPromises.get(target.key)?.reject(error);
185
+ }
186
+ await Promise.allSettled(createdPendingResults);
187
+ throw error;
188
+ }
189
+ finally {
190
+ for (const target of missingTargets) {
191
+ this.poolDetailPromises.delete(target.key);
192
+ }
193
+ }
194
+ }
195
+ await Promise.all(pendingResults);
196
+ return results;
197
+ }
198
+ }
199
+ exports.PoolService = PoolService;
200
+ function createDeferred() {
201
+ let resolve;
202
+ let reject;
203
+ const promise = new Promise((resolvePromise, rejectPromise) => {
204
+ resolve = resolvePromise;
205
+ reject = rejectPromise;
206
+ });
207
+ return { promise, resolve, reject };
208
+ }
209
+ //# sourceMappingURL=PoolService.js.map
@@ -0,0 +1,2 @@
1
+ export * from "./PoolService";
2
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1,18 @@
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
+ __exportStar(require("./PoolService"), exports);
18
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1,13 @@
1
+ import { Pool, FPMMPoolDetails, VirtualPoolDetails } from '../../core/types';
2
+ import { PublicClient } from 'viem';
3
+ /**
4
+ * Fetches enriched details for an FPMM pool
5
+ */
6
+ export declare function fetchFPMMPoolDetails(publicClient: PublicClient, chainId: number, pool: Pool): Promise<FPMMPoolDetails>;
7
+ export declare function fetchFPMMPoolDetailsBatch(publicClient: PublicClient, chainId: number, pools: Pool[]): Promise<FPMMPoolDetails[]>;
8
+ /**
9
+ * Fetches enriched details for a Virtual pool
10
+ */
11
+ export declare function fetchVirtualPoolDetails(publicClient: PublicClient, pool: Pool): Promise<VirtualPoolDetails>;
12
+ export declare function fetchVirtualPoolDetailsBatch(publicClient: PublicClient, pools: Pool[]): Promise<VirtualPoolDetails[]>;
13
+ //# sourceMappingURL=poolDetails.d.ts.map