@paraswap/dex-lib 3.7.9-dex-deprecation.0 → 3.8.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 (262) hide show
  1. package/.idea/aws.xml +17 -0
  2. package/.idea/codeStyles/Project.xml +19 -0
  3. package/.idea/codeStyles/codeStyleConfig.xml +5 -0
  4. package/.idea/misc.xml +6 -0
  5. package/.idea/modules.xml +8 -0
  6. package/.idea/paraswap-dex-lib.iml +9 -0
  7. package/.idea/prettier.xml +7 -0
  8. package/.idea/vcs.xml +6 -0
  9. package/build/abi/curve-v1-factory/CurveV1Router.abi.json +331 -0
  10. package/build/config.js +1 -1
  11. package/build/dex/curve-v1-factory/config.js +47 -10
  12. package/build/dex/curve-v1-factory/config.js.map +1 -1
  13. package/build/dex/curve-v1-factory/curve-v1-factory.d.ts +2 -2
  14. package/build/dex/curve-v1-factory/curve-v1-factory.js +96 -36
  15. package/build/dex/curve-v1-factory/curve-v1-factory.js.map +1 -1
  16. package/build/dex/curve-v1-factory/optimizer.d.ts +2 -0
  17. package/build/dex/curve-v1-factory/optimizer.js +54 -0
  18. package/build/dex/curve-v1-factory/optimizer.js.map +1 -0
  19. package/build/dex/curve-v1-factory/price-handlers/functions/constants.js.map +1 -1
  20. package/build/dex/curve-v1-factory/price-handlers/functions/get_dx.js +13 -1
  21. package/build/dex/curve-v1-factory/price-handlers/functions/get_dx.js.map +1 -1
  22. package/build/dex/curve-v1-factory/state-polling-pools/custom-pool-polling.d.ts +2 -2
  23. package/build/dex/curve-v1-factory/state-polling-pools/custom-pool-polling.js +1 -1
  24. package/build/dex/curve-v1-factory/state-polling-pools/custom-pool-polling.js.map +1 -1
  25. package/build/dex/curve-v1-factory/state-polling-pools/factory-pool-polling.js +1 -1
  26. package/build/dex/curve-v1-factory/state-polling-pools/factory-pool-polling.js.map +1 -1
  27. package/build/dex/curve-v1-factory/state-polling-pools/pool-polling-base.d.ts +4 -3
  28. package/build/dex/curve-v1-factory/state-polling-pools/pool-polling-base.js +24 -9
  29. package/build/dex/curve-v1-factory/state-polling-pools/pool-polling-base.js.map +1 -1
  30. package/build/dex/curve-v1-factory/types.d.ts +20 -4
  31. package/build/dex/curve-v1-factory/types.js +11 -3
  32. package/build/dex/curve-v1-factory/types.js.map +1 -1
  33. package/build/dex/curve-v1-stable-ng/config.js +18 -0
  34. package/build/dex/curve-v1-stable-ng/config.js.map +1 -1
  35. package/build/dex/index.js +18 -0
  36. package/build/dex/index.js.map +1 -1
  37. package/build/utils.d.ts +1 -1
  38. package/package.json +2 -2
  39. package/src/abi/BProtocol.json +1155 -0
  40. package/src/abi/Jarvis.json +1172 -0
  41. package/src/abi/MStableAsset.json +1545 -0
  42. package/src/abi/OneInchLp.json +1304 -0
  43. package/src/abi/Onebit.json +736 -0
  44. package/src/abi/Shell.json +1294 -0
  45. package/src/abi/TraderJoeV2Router.json +50 -0
  46. package/src/abi/curve-v1-factory/CurveV1Router.abi.json +331 -0
  47. package/src/abi/zrx.v2.json +1967 -0
  48. package/src/abi/zrx.v3.json +3454 -0
  49. package/src/abi/zrx.v4.json +2193 -0
  50. package/src/config.ts +1 -1
  51. package/src/dex/OneInchLp.ts +84 -0
  52. package/src/dex/bProtocol/bProtocol-e2e.test.ts +93 -0
  53. package/src/dex/bProtocol/bProtocol.ts +108 -0
  54. package/src/dex/bProtocol/types.ts +13 -0
  55. package/src/dex/curve-v1-factory/config.ts +47 -10
  56. package/src/dex/curve-v1-factory/curve-v1-factory-e2e.test.ts +92 -16
  57. package/src/dex/curve-v1-factory/curve-v1-factory-integration.test.ts +125 -5
  58. package/src/dex/curve-v1-factory/curve-v1-factory.ts +137 -45
  59. package/src/dex/curve-v1-factory/optimizer.ts +61 -0
  60. package/src/dex/curve-v1-factory/price-handlers/functions/constants.ts +0 -2
  61. package/src/dex/curve-v1-factory/price-handlers/functions/get_dx.ts +24 -1
  62. package/src/dex/curve-v1-factory/state-polling-pools/custom-pool-polling.ts +3 -2
  63. package/src/dex/curve-v1-factory/state-polling-pools/factory-pool-polling.ts +1 -0
  64. package/src/dex/curve-v1-factory/state-polling-pools/pool-polling-base.ts +31 -10
  65. package/src/dex/curve-v1-factory/types.ts +22 -6
  66. package/src/dex/curve-v1-stable-ng/config.ts +18 -0
  67. package/src/dex/curve-v1-stable-ng/curve-v1-stable-ng-e2e.test.ts +17 -0
  68. package/src/dex/index.ts +18 -0
  69. package/src/dex/jarvis.ts +262 -0
  70. package/src/dex/mStable.ts +147 -0
  71. package/src/dex/onebit/onebit.ts +113 -0
  72. package/src/dex/onebit/types.ts +17 -0
  73. package/src/dex/shell.ts +84 -0
  74. package/src/dex/trader-joe-v2.ts +148 -0
  75. package/src/dex/zerox/config.ts +31 -0
  76. package/src/dex/zerox/index.ts +328 -0
  77. package/src/dex/zerox/order.ts +62 -0
  78. package/src/dex/zerox/types.ts +82 -0
  79. package/src/dex/zerox/zerox-e2e.test.ts +110 -0
  80. package/tests/constants-e2e.ts +1 -1
  81. package/tests/utils-e2e.ts +2 -0
  82. package/.vscode/launch.json +0 -53
  83. package/.vscode/settings.json +0 -2
  84. package/.vscode/tasks.json +0 -15
  85. package/build/abi/AaveV1_lending_pool.json +0 -27
  86. package/build/abi/platypus/asset.json +0 -490
  87. package/build/abi/platypus/avax-pool.json +0 -820
  88. package/build/abi/platypus/oracle.json +0 -119
  89. package/build/abi/platypus/pool.json +0 -677
  90. package/build/abi/smardex/all/smardex-router.json +0 -648
  91. package/build/abi/smardex/layer-1/smardex-factory.json +0 -242
  92. package/build/abi/smardex/layer-1/smardex-pool.json +0 -506
  93. package/build/abi/smardex/layer-2/smardex-factory.json +0 -185
  94. package/build/abi/smardex/layer-2/smardex-pool.json +0 -578
  95. package/build/abi/swaap-v1/pool.json +0 -1346
  96. package/build/abi/uniswap-v3/AlienBaseV3Router.abi.json +0 -52
  97. package/build/abi/wombat/pool.json +0 -1289
  98. package/build/dex/aave-v1/aave-v1.d.ts +0 -34
  99. package/build/dex/aave-v1/aave-v1.js +0 -181
  100. package/build/dex/aave-v1/aave-v1.js.map +0 -1
  101. package/build/dex/aave-v1/config.d.ts +0 -11
  102. package/build/dex/aave-v1/config.js +0 -20
  103. package/build/dex/aave-v1/config.js.map +0 -1
  104. package/build/dex/aave-v1/tokens-mainnet.json +0 -134
  105. package/build/dex/aave-v1/tokens.d.ts +0 -3
  106. package/build/dex/aave-v1/tokens.js +0 -50
  107. package/build/dex/aave-v1/tokens.js.map +0 -1
  108. package/build/dex/aave-v1/types.d.ts +0 -12
  109. package/build/dex/aave-v1/types.js +0 -3
  110. package/build/dex/aave-v1/types.js.map +0 -1
  111. package/build/dex/aave-v2/tokens-avalanche.json +0 -44
  112. package/build/dex/aave-v2/tokens-mainnet.json +0 -188
  113. package/build/dex/aave-v2/tokens-polygon.json +0 -44
  114. package/build/dex/bProtocol.d.ts +0 -18
  115. package/build/dex/bProtocol.js +0 -39
  116. package/build/dex/bProtocol.js.map +0 -1
  117. package/build/dex/bancor.d.ts +0 -26
  118. package/build/dex/bancor.js +0 -58
  119. package/build/dex/bancor.js.map +0 -1
  120. package/build/dex/compound.d.ts +0 -18
  121. package/build/dex/compound.js +0 -46
  122. package/build/dex/compound.js.map +0 -1
  123. package/build/dex/curve-v2.d.ts +0 -58
  124. package/build/dex/curve-v2.js +0 -180
  125. package/build/dex/curve-v2.js.map +0 -1
  126. package/build/dex/dodo-v1.d.ts +0 -33
  127. package/build/dex/dodo-v1.js +0 -63
  128. package/build/dex/dodo-v1.js.map +0 -1
  129. package/build/dex/lido.d.ts +0 -19
  130. package/build/dex/lido.js +0 -42
  131. package/build/dex/lido.js.map +0 -1
  132. package/build/dex/maker-psm/scripts/gem.abi.json +0 -136
  133. package/build/dex/maker-psm/scripts/validate-state.d.ts +0 -0
  134. package/build/dex/maker-psm/scripts/validate-state.js +0 -185
  135. package/build/dex/maker-psm/scripts/validate-state.js.map +0 -1
  136. package/build/dex/maker-psm/scripts/vat.abi.json +0 -243
  137. package/build/dex/onebit.d.ts +0 -25
  138. package/build/dex/onebit.js +0 -42
  139. package/build/dex/onebit.js.map +0 -1
  140. package/build/dex/platypus/asset.d.ts +0 -14
  141. package/build/dex/platypus/asset.js +0 -97
  142. package/build/dex/platypus/asset.js.map +0 -1
  143. package/build/dex/platypus/config.d.ts +0 -11
  144. package/build/dex/platypus/config.js +0 -69
  145. package/build/dex/platypus/config.js.map +0 -1
  146. package/build/dex/platypus/platypus.d.ts +0 -63
  147. package/build/dex/platypus/platypus.js +0 -487
  148. package/build/dex/platypus/platypus.js.map +0 -1
  149. package/build/dex/platypus/pool-avax.d.ts +0 -8
  150. package/build/dex/platypus/pool-avax.js +0 -54
  151. package/build/dex/platypus/pool-avax.js.map +0 -1
  152. package/build/dex/platypus/pool-base.d.ts +0 -19
  153. package/build/dex/platypus/pool-base.js +0 -86
  154. package/build/dex/platypus/pool-base.js.map +0 -1
  155. package/build/dex/platypus/pool-pure.d.ts +0 -8
  156. package/build/dex/platypus/pool-pure.js +0 -37
  157. package/build/dex/platypus/pool-pure.js.map +0 -1
  158. package/build/dex/platypus/pool-subscriber.d.ts +0 -14
  159. package/build/dex/platypus/pool-subscriber.js +0 -167
  160. package/build/dex/platypus/pool-subscriber.js.map +0 -1
  161. package/build/dex/platypus/pool.d.ts +0 -8
  162. package/build/dex/platypus/pool.js +0 -58
  163. package/build/dex/platypus/pool.js.map +0 -1
  164. package/build/dex/platypus/types.d.ts +0 -92
  165. package/build/dex/platypus/types.js +0 -10
  166. package/build/dex/platypus/types.js.map +0 -1
  167. package/build/dex/quickswap/spiritswap-v3.d.ts +0 -6
  168. package/build/dex/quickswap/spiritswap-v3.js +0 -19
  169. package/build/dex/quickswap/spiritswap-v3.js.map +0 -1
  170. package/build/dex/smardex/config.d.ts +0 -4
  171. package/build/dex/smardex/config.js +0 -64
  172. package/build/dex/smardex/config.js.map +0 -1
  173. package/build/dex/smardex/constants.d.ts +0 -18
  174. package/build/dex/smardex/constants.js +0 -33
  175. package/build/dex/smardex/constants.js.map +0 -1
  176. package/build/dex/smardex/sdk/constants.d.ts +0 -6
  177. package/build/dex/smardex/sdk/constants.js +0 -13
  178. package/build/dex/smardex/sdk/constants.js.map +0 -1
  179. package/build/dex/smardex/sdk/core.d.ts +0 -113
  180. package/build/dex/smardex/sdk/core.js +0 -499
  181. package/build/dex/smardex/sdk/core.js.map +0 -1
  182. package/build/dex/smardex/sdk/errors.d.ts +0 -15
  183. package/build/dex/smardex/sdk/errors.js +0 -22
  184. package/build/dex/smardex/sdk/errors.js.map +0 -1
  185. package/build/dex/smardex/sdk/types.d.ts +0 -62
  186. package/build/dex/smardex/sdk/types.js +0 -3
  187. package/build/dex/smardex/sdk/types.js.map +0 -1
  188. package/build/dex/smardex/sdk/utils.d.ts +0 -44
  189. package/build/dex/smardex/sdk/utils.js +0 -133
  190. package/build/dex/smardex/sdk/utils.js.map +0 -1
  191. package/build/dex/smardex/smardex-event-pool.d.ts +0 -28
  192. package/build/dex/smardex/smardex-event-pool.js +0 -119
  193. package/build/dex/smardex/smardex-event-pool.js.map +0 -1
  194. package/build/dex/smardex/smardex.d.ts +0 -65
  195. package/build/dex/smardex/smardex.js +0 -519
  196. package/build/dex/smardex/smardex.js.map +0 -1
  197. package/build/dex/smardex/types.d.ts +0 -55
  198. package/build/dex/smardex/types.js +0 -3
  199. package/build/dex/smardex/types.js.map +0 -1
  200. package/build/dex/smoothy.d.ts +0 -26
  201. package/build/dex/smoothy.js +0 -48
  202. package/build/dex/smoothy.js.map +0 -1
  203. package/build/dex/solidly/forks-override/cone.d.ts +0 -22
  204. package/build/dex/solidly/forks-override/cone.js +0 -53
  205. package/build/dex/solidly/forks-override/cone.js.map +0 -1
  206. package/build/dex/solidly/forks-override/solisnek.d.ts +0 -8
  207. package/build/dex/solidly/forks-override/solisnek.js +0 -15
  208. package/build/dex/solidly/forks-override/solisnek.js.map +0 -1
  209. package/build/dex/solidly-v3/scripts/check-event-pool-event.d.ts +0 -1
  210. package/build/dex/solidly-v3/scripts/check-event-pool-event.js +0 -53
  211. package/build/dex/solidly-v3/scripts/check-event-pool-event.js.map +0 -1
  212. package/build/dex/stable-pool.d.ts +0 -28
  213. package/build/dex/stable-pool.js +0 -55
  214. package/build/dex/stable-pool.js.map +0 -1
  215. package/build/dex/swaap-v1/config.d.ts +0 -17
  216. package/build/dex/swaap-v1/config.js +0 -56
  217. package/build/dex/swaap-v1/config.js.map +0 -1
  218. package/build/dex/swaap-v1/constants.d.ts +0 -6
  219. package/build/dex/swaap-v1/constants.js +0 -17
  220. package/build/dex/swaap-v1/constants.js.map +0 -1
  221. package/build/dex/swaap-v1/libraries/ChainlinkUtils.d.ts +0 -25
  222. package/build/dex/swaap-v1/libraries/ChainlinkUtils.js +0 -62
  223. package/build/dex/swaap-v1/libraries/ChainlinkUtils.js.map +0 -1
  224. package/build/dex/swaap-v1/libraries/Const.d.ts +0 -18
  225. package/build/dex/swaap-v1/libraries/Const.js +0 -26
  226. package/build/dex/swaap-v1/libraries/Const.js.map +0 -1
  227. package/build/dex/swaap-v1/libraries/GeometricBrownianMotion.d.ts +0 -77
  228. package/build/dex/swaap-v1/libraries/GeometricBrownianMotion.js +0 -316
  229. package/build/dex/swaap-v1/libraries/GeometricBrownianMotion.js.map +0 -1
  230. package/build/dex/swaap-v1/libraries/LogExpMath.d.ts +0 -75
  231. package/build/dex/swaap-v1/libraries/LogExpMath.js +0 -418
  232. package/build/dex/swaap-v1/libraries/LogExpMath.js.map +0 -1
  233. package/build/dex/swaap-v1/libraries/MathMMM.d.ts +0 -185
  234. package/build/dex/swaap-v1/libraries/MathMMM.js +0 -453
  235. package/build/dex/swaap-v1/libraries/MathMMM.js.map +0 -1
  236. package/build/dex/swaap-v1/libraries/Num.d.ts +0 -31
  237. package/build/dex/swaap-v1/libraries/Num.js +0 -167
  238. package/build/dex/swaap-v1/libraries/Num.js.map +0 -1
  239. package/build/dex/swaap-v1/libraries/PoolQuotations.d.ts +0 -23
  240. package/build/dex/swaap-v1/libraries/PoolQuotations.js +0 -131
  241. package/build/dex/swaap-v1/libraries/PoolQuotations.js.map +0 -1
  242. package/build/dex/swaap-v1/libraries/Struct.d.ts +0 -56
  243. package/build/dex/swaap-v1/libraries/Struct.js +0 -3
  244. package/build/dex/swaap-v1/libraries/Struct.js.map +0 -1
  245. package/build/dex/swaap-v1/swaap-v1-pool.d.ts +0 -45
  246. package/build/dex/swaap-v1/swaap-v1-pool.js +0 -656
  247. package/build/dex/swaap-v1/swaap-v1-pool.js.map +0 -1
  248. package/build/dex/swaap-v1/swaap-v1.d.ts +0 -62
  249. package/build/dex/swaap-v1/swaap-v1.js +0 -383
  250. package/build/dex/swaap-v1/swaap-v1.js.map +0 -1
  251. package/build/dex/swaap-v1/types.d.ts +0 -106
  252. package/build/dex/swaap-v1/types.js +0 -9
  253. package/build/dex/swaap-v1/types.js.map +0 -1
  254. package/build/dex/trader-joe-v2.1.d.ts +0 -43
  255. package/build/dex/trader-joe-v2.1.js +0 -79
  256. package/build/dex/trader-joe-v2.1.js.map +0 -1
  257. package/build/dex/uniswap-v3/forks/alien-base-v3/alien-base-v3.d.ts +0 -17
  258. package/build/dex/uniswap-v3/forks/alien-base-v3/alien-base-v3.js +0 -64
  259. package/build/dex/uniswap-v3/forks/alien-base-v3/alien-base-v3.js.map +0 -1
  260. package/build/dex/uniswap-v3/forks/alien-v3/alien-v3.d.ts +0 -17
  261. package/build/dex/uniswap-v3/forks/alien-v3/alien-v3.js +0 -79
  262. package/build/dex/uniswap-v3/forks/alien-v3/alien-v3.js.map +0 -1
@@ -15,6 +15,8 @@ import {
15
15
  import { Tokens } from '../../../tests/constants-e2e';
16
16
  import { Address } from '@paraswap/core';
17
17
  import StableSwap3PoolABI from '../../abi/curve-v1/StableSwap3Pool.json';
18
+ import CurveV1StableNgPoolAbi from '../../abi/curve-v1/CurveV1StableNg.json';
19
+ import * as util from 'util';
18
20
 
19
21
  export function getReaderCalldata(
20
22
  exchangeAddress: string,
@@ -113,7 +115,7 @@ export async function testPricingOnNetwork(
113
115
  );
114
116
  console.log(
115
117
  `${srcTokenSymbol} <> ${destTokenSymbol} Pool Prices: `,
116
- poolPrices,
118
+ util.inspect(poolPrices, false, null, true),
117
119
  );
118
120
 
119
121
  expect(poolPrices).not.toBeNull();
@@ -126,15 +128,15 @@ export async function testPricingOnNetwork(
126
128
  // Check if onchain pricing equals to calculated ones
127
129
  await checkOnChainPricing(
128
130
  curveV1Factory,
129
- poolPrices![0].data.exchange,
130
- poolPrices![0].data.underlyingSwap
131
+ poolPrices![0].data.path[0].exchange,
132
+ poolPrices![0].data.path[0].underlyingSwap
131
133
  ? 'get_dy_underlying'
132
134
  : poolContractMethod,
133
135
  blockNumber,
134
136
  poolPrices![0].prices,
135
137
  amounts,
136
- poolPrices![0].data.i,
137
- poolPrices![0].data.j,
138
+ poolPrices![0].data.path[0].i,
139
+ poolPrices![0].data.path[0].j,
138
140
  readerIface,
139
141
  );
140
142
  }
@@ -226,6 +228,10 @@ describe('CurveV1Factory', function () {
226
228
  });
227
229
 
228
230
  describe(`crvUSD-GHO`, () => {
231
+ const readerIface = new Interface(
232
+ CurveV1StableNgPoolAbi as JsonFragment[],
233
+ );
234
+
229
235
  const srcTokenSymbol = 'crvUSD';
230
236
  const destTokenSymbol = 'GHO';
231
237
  const amountsForSell = [
@@ -242,6 +248,102 @@ describe('CurveV1Factory', function () {
242
248
  10n * BI_POWS[tokens[srcTokenSymbol].decimals],
243
249
  ];
244
250
 
251
+ const amountsForBuy = [
252
+ 0n,
253
+ 1n * BI_POWS[tokens[destTokenSymbol].decimals],
254
+ 2n * BI_POWS[tokens[destTokenSymbol].decimals],
255
+ 3n * BI_POWS[tokens[destTokenSymbol].decimals],
256
+ 4n * BI_POWS[tokens[destTokenSymbol].decimals],
257
+ 5n * BI_POWS[tokens[destTokenSymbol].decimals],
258
+ ];
259
+
260
+ it('getPoolIdentifiers and getPricesVolume SELL', async function () {
261
+ await testPricingOnNetwork(
262
+ curveV1Factory,
263
+ network,
264
+ dexKey,
265
+ blockNumber,
266
+ srcTokenSymbol,
267
+ destTokenSymbol,
268
+ SwapSide.SELL,
269
+ amountsForSell,
270
+ 'get_dy',
271
+ readerIface,
272
+ );
273
+ });
274
+
275
+ it('getPoolIdentifiers and getPricesVolume BUY', async function () {
276
+ await testPricingOnNetwork(
277
+ curveV1Factory,
278
+ network,
279
+ dexKey,
280
+ blockNumber,
281
+ srcTokenSymbol,
282
+ destTokenSymbol,
283
+ SwapSide.BUY,
284
+ amountsForBuy,
285
+ 'get_dx',
286
+ readerIface,
287
+ );
288
+ });
289
+
290
+ it('getTopPoolsForToken', async function () {
291
+ // We have to check without calling initializePricing, because
292
+ // pool-tracker is not calling that function
293
+ const newCurveV1Factory = new CurveV1Factory(
294
+ network,
295
+ dexKey,
296
+ dexHelper,
297
+ );
298
+ if (newCurveV1Factory.updatePoolState) {
299
+ await newCurveV1Factory.updatePoolState();
300
+ }
301
+ const poolLiquidity = await newCurveV1Factory.getTopPoolsForToken(
302
+ tokens[srcTokenSymbol].address,
303
+ 10,
304
+ );
305
+ console.log(`${srcTokenSymbol} Top Pools:`, poolLiquidity);
306
+
307
+ if (!newCurveV1Factory.hasConstantPriceLargeAmounts) {
308
+ checkPoolsLiquidity(
309
+ poolLiquidity,
310
+ Tokens[network][srcTokenSymbol].address,
311
+ dexKey,
312
+ );
313
+ }
314
+ });
315
+ });
316
+
317
+ describe(`crvUSD-USDT`, () => {
318
+ const readerIface = new Interface(
319
+ CurveV1StableNgPoolAbi as JsonFragment[],
320
+ );
321
+
322
+ const srcTokenSymbol = 'crvUSD';
323
+ const destTokenSymbol = 'USDT';
324
+ const amountsForSell = [
325
+ 0n,
326
+ 1n * BI_POWS[tokens[srcTokenSymbol].decimals],
327
+ 2n * BI_POWS[tokens[srcTokenSymbol].decimals],
328
+ 3n * BI_POWS[tokens[srcTokenSymbol].decimals],
329
+ 4n * BI_POWS[tokens[srcTokenSymbol].decimals],
330
+ 5n * BI_POWS[tokens[srcTokenSymbol].decimals],
331
+ 6n * BI_POWS[tokens[srcTokenSymbol].decimals],
332
+ 7n * BI_POWS[tokens[srcTokenSymbol].decimals],
333
+ 8n * BI_POWS[tokens[srcTokenSymbol].decimals],
334
+ 9n * BI_POWS[tokens[srcTokenSymbol].decimals],
335
+ 10n * BI_POWS[tokens[srcTokenSymbol].decimals],
336
+ ];
337
+
338
+ const amountsForBuy = [
339
+ 0n,
340
+ 1n * BI_POWS[tokens[destTokenSymbol].decimals],
341
+ 2n * BI_POWS[tokens[destTokenSymbol].decimals],
342
+ 3n * BI_POWS[tokens[destTokenSymbol].decimals],
343
+ 4n * BI_POWS[tokens[destTokenSymbol].decimals],
344
+ 5n * BI_POWS[tokens[destTokenSymbol].decimals],
345
+ ];
346
+
245
347
  it('getPoolIdentifiers and getPricesVolume SELL', async function () {
246
348
  await testPricingOnNetwork(
247
349
  curveV1Factory,
@@ -252,6 +354,24 @@ describe('CurveV1Factory', function () {
252
354
  destTokenSymbol,
253
355
  SwapSide.SELL,
254
356
  amountsForSell,
357
+ 'get_dy',
358
+ readerIface,
359
+ );
360
+ });
361
+
362
+ it('getPoolIdentifiers and getPricesVolume BUY', async function () {
363
+ console.log('amountsForBuy: ', amountsForBuy);
364
+ await testPricingOnNetwork(
365
+ curveV1Factory,
366
+ network,
367
+ dexKey,
368
+ blockNumber,
369
+ srcTokenSymbol,
370
+ destTokenSymbol,
371
+ SwapSide.BUY,
372
+ amountsForBuy,
373
+ 'get_dx',
374
+ readerIface,
255
375
  );
256
376
  });
257
377
 
@@ -34,6 +34,8 @@ import {
34
34
  import { IDex } from '../idex';
35
35
  import { IDexHelper } from '../../dex-helper/idex-helper';
36
36
  import {
37
+ CurveRouterPoolType,
38
+ CurveRouterSwapType,
37
39
  CurveSwapFunctions,
38
40
  CurveV1FactoryData,
39
41
  CurveV1FactoryDirectSwap,
@@ -42,6 +44,7 @@ import {
42
44
  CustomImplementationNames,
43
45
  DirectCurveV1FactoryParamV6,
44
46
  DirectCurveV1Param,
47
+ FactoryImplementationNames,
45
48
  ImplementationNames,
46
49
  PoolConstants,
47
50
  } from './types';
@@ -60,6 +63,7 @@ import {
60
63
  } from './constants';
61
64
  import { CurveV1FactoryPoolManager } from './curve-v1-pool-manager';
62
65
  import CurveABI from '../../abi/Curve.json';
66
+ import CurveV1RouterABI from '../../abi/curve-v1-factory/CurveV1Router.abi.json';
63
67
  import DirectSwapABI from '../../abi/DirectSwap.json';
64
68
  import FactoryCurveV1ABI from '../../abi/curve-v1-factory/FactoryCurveV1.json';
65
69
  import ThreePoolABI from '../../abi/curve-v1-factory/ThreePool.json';
@@ -81,6 +85,7 @@ import { PriceHandler } from './price-handlers/price-handler';
81
85
  import { hexConcat, hexlify, hexZeroPad } from 'ethers/lib/utils';
82
86
  import { packCurveData } from '../../lib/curve/encoder';
83
87
  import { encodeCurveAssets } from '../curve-v1/packer';
88
+ import { extractReturnAmountPosition } from '../../executor/utils';
84
89
 
85
90
  export const DefaultCoinsABI: AbiItem = {
86
91
  type: 'function',
@@ -122,7 +127,12 @@ export class CurveV1Factory
122
127
 
123
128
  readonly directSwapIface = new Interface(DirectSwapABI);
124
129
 
125
- protected buySideSupported: boolean = false;
130
+ protected factoryImplementationsSupportBuySide = new Set<ImplementationNames>(
131
+ [
132
+ FactoryImplementationNames.FACTORY_PLAIN_2_CRV_EMA,
133
+ FactoryImplementationNames.FACTORY_STABLE_NG,
134
+ ],
135
+ );
126
136
 
127
137
  public static dexKeysWithNetwork: { key: string; networks: Network[] }[] =
128
138
  getDexKeysWithNetwork(CurveV1FactoryConfig);
@@ -144,6 +154,7 @@ export class CurveV1Factory
144
154
  this.config.factories?.map(e => e.address.toLowerCase()) || [];
145
155
  this.ifaces = {
146
156
  exchangeRouter: new Interface(CurveABI),
157
+ curveV1Router: new Interface(CurveV1RouterABI),
147
158
  factory: new Interface(FactoryCurveV1ABI as JsonFragment[]),
148
159
  erc20: new Interface(ERC20ABI as JsonFragment[]),
149
160
  threePool: new Interface(ThreePoolABI as JsonFragment[]),
@@ -287,7 +298,7 @@ export class CurveV1Factory
287
298
  this.dexKey,
288
299
  this.dexHelper.config.data.network,
289
300
  this.cacheStateKey,
290
- customPool.name,
301
+ customPool.name as CustomImplementationNames,
291
302
  implementationAddress,
292
303
  customPool.address,
293
304
  this.config.stateUpdatePeriodMs,
@@ -308,7 +319,7 @@ export class CurveV1Factory
308
319
  this.dexKey,
309
320
  this.dexHelper.config.data.network,
310
321
  this.cacheStateKey,
311
- customPool.name,
322
+ customPool.name as CustomImplementationNames,
312
323
  implementationAddress,
313
324
  customPool.address,
314
325
  this.config.stateUpdatePeriodMs,
@@ -703,10 +714,6 @@ export class CurveV1Factory
703
714
  side: SwapSide,
704
715
  blockNumber: number,
705
716
  ): Promise<string[]> {
706
- if (!this.buySideSupported && side === SwapSide.BUY) {
707
- return [];
708
- }
709
-
710
717
  const _srcToken = this.needWrapNative
711
718
  ? this.dexHelper.config.wrapETH(srcToken)
712
719
  : srcToken;
@@ -721,11 +728,17 @@ export class CurveV1Factory
721
728
  return [];
722
729
  }
723
730
 
724
- const pools = this.poolManager.getPoolsForPair(
731
+ let pools = this.poolManager.getPoolsForPair(
725
732
  srcTokenAddress,
726
733
  destTokenAddress,
727
734
  );
728
735
 
736
+ if (side === SwapSide.BUY) {
737
+ pools = pools.filter(pool =>
738
+ this.factoryImplementationsSupportBuySide.has(pool.implementationName),
739
+ );
740
+ }
741
+
729
742
  return pools.map(pool =>
730
743
  this.getPoolIdentifier(pool.address, pool.isMetaPool),
731
744
  );
@@ -746,10 +759,6 @@ export class CurveV1Factory
746
759
  },
747
760
  ): Promise<null | ExchangePrices<CurveV1FactoryData>> {
748
761
  try {
749
- if (!this.buySideSupported && side === SwapSide.BUY) {
750
- return null;
751
- }
752
-
753
762
  const _isSrcTokenTransferFeeToBeExchanged =
754
763
  isSrcTokenTransferFeeToBeExchanged(transferFees);
755
764
 
@@ -789,6 +798,14 @@ export class CurveV1Factory
789
798
  );
790
799
  }
791
800
 
801
+ if (side === SwapSide.BUY) {
802
+ pools = pools.filter(pool =>
803
+ this.factoryImplementationsSupportBuySide.has(
804
+ pool.implementationName,
805
+ ),
806
+ );
807
+ }
808
+
792
809
  if (pools.length <= 0) {
793
810
  return null;
794
811
  }
@@ -859,9 +876,9 @@ export class CurveV1Factory
859
876
  side,
860
877
  state,
861
878
  amountsWithUnitAndFee,
862
- poolData.i,
863
- poolData.j,
864
- poolData.underlyingSwap,
879
+ poolData.path[0].i,
880
+ poolData.path[0].j,
881
+ poolData.path[0].underlyingSwap,
865
882
  );
866
883
 
867
884
  outputs = applyTransferFee(
@@ -923,10 +940,11 @@ export class CurveV1Factory
923
940
  data: CurveV1FactoryData,
924
941
  side: SwapSide,
925
942
  ): AdapterExchangeParam {
926
- if (!this.buySideSupported && side === SwapSide.BUY)
927
- throw new Error(`Buy not supported`);
943
+ if (data.path.length > 1) {
944
+ throw new Error('Multihop is not supported by v5');
945
+ }
928
946
 
929
- const { i, j, underlyingSwap } = data;
947
+ const { i, j, underlyingSwap } = data.path[0];
930
948
  const payload = this.abiCoder.encodeParameter(
931
949
  {
932
950
  ParentStruct: {
@@ -940,7 +958,7 @@ export class CurveV1Factory
940
958
  );
941
959
 
942
960
  return {
943
- targetExchange: data.exchange,
961
+ targetExchange: data.path[0].exchange,
944
962
  payload,
945
963
  networkFee: '0',
946
964
  };
@@ -978,7 +996,7 @@ export class CurveV1Factory
978
996
  isApproved = await this.dexHelper.augustusApprovals.hasApproval(
979
997
  options.executionContractAddress,
980
998
  this.dexHelper.config.wrapETH(srcToken).address,
981
- optimalSwapExchange.data.exchange,
999
+ optimalSwapExchange.data.path[0].exchange,
982
1000
  );
983
1001
  } catch (e) {
984
1002
  this.logger.error(
@@ -1020,6 +1038,11 @@ export class CurveV1Factory
1020
1038
  if (contractMethod !== DIRECT_METHOD_NAME) {
1021
1039
  throw new Error(`Invalid contract method ${contractMethod}`);
1022
1040
  }
1041
+
1042
+ if (data.path.length > 1) {
1043
+ throw new Error('Multihop is not supported by v5');
1044
+ }
1045
+
1023
1046
  assert(side === SwapSide.SELL, 'Buy not supported');
1024
1047
 
1025
1048
  let isApproved: boolean = !!data.isApproved;
@@ -1030,16 +1053,16 @@ export class CurveV1Factory
1030
1053
  const swapParams: DirectCurveV1Param = [
1031
1054
  srcToken,
1032
1055
  destToken,
1033
- data.exchange,
1056
+ data.path[0].exchange,
1034
1057
  srcAmount,
1035
1058
  destAmount,
1036
1059
  expectedAmount,
1037
1060
  feePercent,
1038
- data.i.toString(),
1039
- data.j.toString(),
1061
+ data.path[0].i.toString(),
1062
+ data.path[0].j.toString(),
1040
1063
  partner,
1041
1064
  isApproved,
1042
- data.underlyingSwap
1065
+ data.path[0].underlyingSwap
1043
1066
  ? CurveV1SwapType.EXCHANGE_UNDERLYING
1044
1067
  : CurveV1SwapType.EXCHANGE,
1045
1068
  beneficiary,
@@ -1080,6 +1103,11 @@ export class CurveV1Factory
1080
1103
  if (contractMethod !== DIRECT_METHOD_NAME_V6) {
1081
1104
  throw new Error(`Invalid contract method ${contractMethod}`);
1082
1105
  }
1106
+
1107
+ if (data.path.length > 1) {
1108
+ throw new Error('Multihop is not supported by direct method');
1109
+ }
1110
+
1083
1111
  assert(side === SwapSide.SELL, 'Buy not supported');
1084
1112
 
1085
1113
  const metadata = hexConcat([
@@ -1089,14 +1117,14 @@ export class CurveV1Factory
1089
1117
 
1090
1118
  const swapParams: DirectCurveV1FactoryParamV6 = [
1091
1119
  packCurveData(
1092
- data.exchange,
1120
+ data.path[0].exchange,
1093
1121
  !data.isApproved, // approve flag, if not approved then set to true
1094
1122
  isETHAddress(destToken) ? 0 : isETHAddress(srcToken) ? 3 : 0,
1095
- data.underlyingSwap
1123
+ data.path[0].underlyingSwap
1096
1124
  ? CurveV1SwapType.EXCHANGE_UNDERLYING
1097
1125
  : CurveV1SwapType.EXCHANGE,
1098
1126
  ).toString(),
1099
- encodeCurveAssets(data.i, data.j).toString(),
1127
+ encodeCurveAssets(data.path[0].i, data.path[0].j).toString(),
1100
1128
  srcToken,
1101
1129
  destToken,
1102
1130
  fromAmount,
@@ -1138,10 +1166,11 @@ export class CurveV1Factory
1138
1166
  data: CurveV1FactoryData,
1139
1167
  side: SwapSide,
1140
1168
  ): Promise<SimpleExchangeParam> {
1141
- if (!this.buySideSupported && side === SwapSide.BUY)
1142
- throw new Error(`Buy not supported`);
1169
+ if (data.path.length > 1) {
1170
+ throw new Error('Multihop is not supported by v5');
1171
+ }
1143
1172
 
1144
- const { exchange, i, j, underlyingSwap } = data;
1173
+ const { exchange, i, j, underlyingSwap } = data.path[0];
1145
1174
  const defaultArgs = [i, j, srcAmount, MIN_AMOUNT_TO_RECEIVE];
1146
1175
  const swapMethod = underlyingSwap
1147
1176
  ? CurveSwapFunctions.exchange_underlying
@@ -1175,30 +1204,93 @@ export class CurveV1Factory
1175
1204
  data: CurveV1FactoryData,
1176
1205
  side: SwapSide,
1177
1206
  ): DexExchangeParam {
1178
- if (!this.buySideSupported && side === SwapSide.BUY)
1179
- throw new Error(`Buy not supported`);
1207
+ if (data.path.length === 1) {
1208
+ // Single pool encoding
1209
+ const { exchange, i, j, underlyingSwap } = data.path[0];
1180
1210
 
1181
- const { exchange, i, j, underlyingSwap } = data;
1211
+ const minAmountToReceive =
1212
+ side === SwapSide.SELL ? MIN_AMOUNT_TO_RECEIVE : destAmount;
1213
+ const defaultArgs = [i, j, srcAmount, minAmountToReceive];
1182
1214
 
1183
- const minAmountToReceive =
1184
- side === SwapSide.SELL ? MIN_AMOUNT_TO_RECEIVE : destAmount;
1185
- const defaultArgs = [i, j, srcAmount, minAmountToReceive];
1215
+ const swapMethod = underlyingSwap
1216
+ ? CurveSwapFunctions.exchange_underlying
1217
+ : CurveSwapFunctions.exchange;
1186
1218
 
1187
- const swapMethod = underlyingSwap
1188
- ? CurveSwapFunctions.exchange_underlying
1189
- : CurveSwapFunctions.exchange;
1190
- const exchangeData = this.ifaces.exchangeRouter.encodeFunctionData(
1191
- swapMethod,
1192
- defaultArgs,
1219
+ const exchangeData = this.ifaces.exchangeRouter.encodeFunctionData(
1220
+ swapMethod,
1221
+ defaultArgs,
1222
+ );
1223
+
1224
+ return {
1225
+ exchangeData,
1226
+ needWrapNative: this.needWrapNative,
1227
+ sendEthButSupportsInsertFromAmount: true,
1228
+ dexFuncHasRecipient: false,
1229
+ targetExchange: exchange,
1230
+ returnAmountPos: undefined,
1231
+ };
1232
+ }
1233
+
1234
+ // Multihop case encoding
1235
+ // Curve Ng Router exchange function params description https://github.com/curvefi/curve-router-ng/blob/master/contracts/Router.vy#L180
1236
+ const pathLength = 11;
1237
+ const swapParamsLength = 5;
1238
+ const poolsLength = 5;
1239
+
1240
+ const path = data.path
1241
+ .map((item, index) =>
1242
+ index === 0
1243
+ ? [item.tokenIn, item.exchange, item.tokenOut] // we need tokenIn only for the first item because there is no prev pool
1244
+ : [item.exchange, item.tokenOut],
1245
+ )
1246
+ .flat();
1247
+
1248
+ while (path.length < pathLength) {
1249
+ path.push(NULL_ADDRESS);
1250
+ }
1251
+
1252
+ const swapParams = data.path.map(item => [
1253
+ item.i,
1254
+ item.j,
1255
+ item.underlyingSwap
1256
+ ? CurveRouterSwapType.exchange_underlying
1257
+ : CurveRouterSwapType.exchange,
1258
+ CurveRouterPoolType.stable,
1259
+ item.n_coins,
1260
+ ]);
1261
+
1262
+ while (swapParams.length < swapParamsLength) {
1263
+ swapParams.push([0, 0, 0, 0, 0]);
1264
+ }
1265
+
1266
+ const pools = [];
1267
+
1268
+ while (pools.length < poolsLength) {
1269
+ pools.push(NULL_ADDRESS);
1270
+ }
1271
+
1272
+ const exchangeData = this.ifaces.curveV1Router.encodeFunctionData(
1273
+ `exchange(address[${pathLength}], uint256[5][${swapParamsLength}], uint256, uint256, address[${poolsLength}], address)`,
1274
+ [
1275
+ path,
1276
+ swapParams,
1277
+ srcAmount,
1278
+ side === SwapSide.SELL ? MIN_AMOUNT_TO_RECEIVE : destAmount,
1279
+ pools,
1280
+ recipient,
1281
+ ],
1193
1282
  );
1194
1283
 
1195
1284
  return {
1196
1285
  exchangeData,
1197
1286
  needWrapNative: this.needWrapNative,
1198
1287
  sendEthButSupportsInsertFromAmount: true,
1199
- dexFuncHasRecipient: false,
1200
- targetExchange: exchange,
1201
- returnAmountPos: undefined,
1288
+ dexFuncHasRecipient: true,
1289
+ targetExchange: this.config.router,
1290
+ returnAmountPos: extractReturnAmountPosition(
1291
+ this.ifaces.curveV1Router,
1292
+ `exchange(address[${pathLength}], uint256[5][${swapParamsLength}], uint256, uint256, address[${poolsLength}], address)`,
1293
+ ),
1202
1294
  };
1203
1295
  }
1204
1296
 
@@ -0,0 +1,61 @@
1
+ import { UnoptimizedRate } from '../../types';
2
+ import { OptimalSwap, ParaSwapVersion } from '@paraswap/core';
3
+ import _ from 'lodash';
4
+ import { CurveV1FactoryConfig } from './config';
5
+ import { CurveV1StableNgConfig } from '../curve-v1-stable-ng/config';
6
+
7
+ const CurveV1FactoryForks = Object.keys(CurveV1FactoryConfig)
8
+ .concat(Object.keys(CurveV1StableNgConfig))
9
+ .map(dexName => dexName.toLowerCase());
10
+
11
+ export function curveV1Merge(or: UnoptimizedRate): UnoptimizedRate {
12
+ // apply optimisation only for V6
13
+ if (or.version !== ParaSwapVersion.V6) {
14
+ return or;
15
+ }
16
+
17
+ const fixRoute = (rawRate: OptimalSwap[]): OptimalSwap[] => {
18
+ let lastExchange: false | OptimalSwap = false;
19
+ let optimizedRate = new Array<OptimalSwap>();
20
+ rawRate.forEach((s: OptimalSwap) => {
21
+ if (
22
+ s.swapExchanges.length !== 1 ||
23
+ !CurveV1FactoryForks.includes(s.swapExchanges[0].exchange.toLowerCase())
24
+ ) {
25
+ lastExchange = false;
26
+ optimizedRate.push(s);
27
+ } else if (
28
+ lastExchange &&
29
+ _.last(
30
+ <any[]>lastExchange.swapExchanges[0].data.path,
31
+ )!.tokenOut.toLowerCase() ===
32
+ s.swapExchanges[0].data.path[0].tokenIn.toLowerCase()
33
+ ) {
34
+ lastExchange.swapExchanges[0].data.path.push(
35
+ s.swapExchanges[0].data.path[0],
36
+ );
37
+ lastExchange.swapExchanges[0].poolAddresses!.push(
38
+ s.swapExchanges[0].poolAddresses![0],
39
+ );
40
+ lastExchange.swapExchanges[0].data.gasUSD = (
41
+ parseFloat(lastExchange.swapExchanges[0].data.gasUSD) +
42
+ parseFloat(s.swapExchanges[0].data.gasUSD)
43
+ ).toFixed(6);
44
+ lastExchange.destToken = s.destToken;
45
+ lastExchange.destDecimals = s.destDecimals;
46
+ lastExchange.swapExchanges[0].destAmount =
47
+ s.swapExchanges[0].destAmount;
48
+ } else {
49
+ lastExchange = _.cloneDeep(s);
50
+ optimizedRate.push(lastExchange);
51
+ }
52
+ });
53
+ return optimizedRate;
54
+ };
55
+ or.bestRoute = or.bestRoute.map(r => ({
56
+ ...r,
57
+ swaps: fixRoute(r.swaps),
58
+ }));
59
+
60
+ return or;
61
+ }
@@ -1,6 +1,4 @@
1
- import {} from 'ts-essentials';
2
1
  import { BI_POWS } from '../../../../bigint-constants';
3
- import { PRECISION } from '../../../kyberdmm/fee-formula';
4
2
  import { ImplementationNames, PoolContextConstants } from '../../types';
5
3
 
6
4
  const implementationConstants: Record<
@@ -3,6 +3,29 @@ import { get_dx, IPoolContext } from '../types';
3
3
  import { requireValue, throwNotExist } from './utils';
4
4
  import _ from 'lodash';
5
5
 
6
+ const factoryPlain2CrvEma: get_dx = (
7
+ self: IPoolContext,
8
+ state: PoolState,
9
+ i: number,
10
+ j: number,
11
+ dy: bigint,
12
+ ) => {
13
+ const balances = requireValue(self, state, 'balances', 'factoryPlain2CrvEma');
14
+ const fee = requireValue(self, state, 'fee', 'factoryPlain2CrvEma');
15
+ const { PRECISION, FEE_DENOMINATOR } = self.constants;
16
+ const { rate_multipliers: rates } = state.constants;
17
+
18
+ const xp = self._xp_mem(self, rates, balances);
19
+
20
+ const y =
21
+ xp[j] -
22
+ (((dy * rates[j]) / PRECISION + 1n) * FEE_DENOMINATOR) /
23
+ (FEE_DENOMINATOR - fee);
24
+ const x = self.get_y(self, state, j, i, y, xp, 0n, 0n);
25
+
26
+ return ((x - xp[i]) * PRECISION) / rates[i];
27
+ };
28
+
6
29
  const stableNg: get_dx = (
7
30
  self: IPoolContext,
8
31
  state: PoolState,
@@ -110,7 +133,7 @@ const implementations: Record<ImplementationNames, get_dx> = {
110
133
  [ImplementationNames.FACTORY_PLAIN_2_BASIC_EMA]: notExist,
111
134
  [ImplementationNames.FACTORY_PLAIN_2_ETH_EMA]: notExist,
112
135
  [ImplementationNames.FACTORY_PLAIN_2_ETH_EMA2]: notExist,
113
- [ImplementationNames.FACTORY_PLAIN_2_CRV_EMA]: notExist,
136
+ [ImplementationNames.FACTORY_PLAIN_2_CRV_EMA]: factoryPlain2CrvEma,
114
137
 
115
138
  [ImplementationNames.FACTORY_STABLE_NG]: stableNg,
116
139
  };
@@ -2,7 +2,7 @@ import _ from 'lodash';
2
2
  import { Logger } from 'log4js';
3
3
  import { MultiCallParams } from '../../../lib/multi-wrapper';
4
4
  import {
5
- ImplementationNames,
5
+ CustomImplementationNames,
6
6
  PoolConstants,
7
7
  PoolContextConstants,
8
8
  PoolState,
@@ -101,7 +101,7 @@ export class CustomBasePoolForFactory extends PoolPollingBase {
101
101
  readonly dexKey: string,
102
102
  network: number,
103
103
  cacheStateKey: string,
104
- implementationName: ImplementationNames,
104
+ implementationName: CustomImplementationNames,
105
105
  implementationAddress: Address,
106
106
  address: Address,
107
107
  stateUpdatePeriodMs: number,
@@ -128,6 +128,7 @@ export class CustomBasePoolForFactory extends PoolPollingBase {
128
128
  stateUpdatePeriodMs,
129
129
  poolIdentifier,
130
130
  poolConstants,
131
+ poolContextConstants,
131
132
  address,
132
133
  curveLiquidityApiSlug,
133
134
  isLendingPool,
@@ -67,6 +67,7 @@ export class FactoryStateHandler extends PoolPollingBase {
67
67
  config.stateUpdatePeriodMs,
68
68
  poolIdentifier,
69
69
  poolConstants,
70
+ poolContextConstants,
70
71
  address,
71
72
  liquidityApiSlug,
72
73
  false,