@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.
- package/.idea/aws.xml +17 -0
- package/.idea/codeStyles/Project.xml +19 -0
- package/.idea/codeStyles/codeStyleConfig.xml +5 -0
- package/.idea/misc.xml +6 -0
- package/.idea/modules.xml +8 -0
- package/.idea/paraswap-dex-lib.iml +9 -0
- package/.idea/prettier.xml +7 -0
- package/.idea/vcs.xml +6 -0
- package/build/abi/curve-v1-factory/CurveV1Router.abi.json +331 -0
- package/build/config.js +1 -1
- package/build/dex/curve-v1-factory/config.js +47 -10
- package/build/dex/curve-v1-factory/config.js.map +1 -1
- package/build/dex/curve-v1-factory/curve-v1-factory.d.ts +2 -2
- package/build/dex/curve-v1-factory/curve-v1-factory.js +96 -36
- package/build/dex/curve-v1-factory/curve-v1-factory.js.map +1 -1
- package/build/dex/curve-v1-factory/optimizer.d.ts +2 -0
- package/build/dex/curve-v1-factory/optimizer.js +54 -0
- package/build/dex/curve-v1-factory/optimizer.js.map +1 -0
- package/build/dex/curve-v1-factory/price-handlers/functions/constants.js.map +1 -1
- package/build/dex/curve-v1-factory/price-handlers/functions/get_dx.js +13 -1
- package/build/dex/curve-v1-factory/price-handlers/functions/get_dx.js.map +1 -1
- package/build/dex/curve-v1-factory/state-polling-pools/custom-pool-polling.d.ts +2 -2
- package/build/dex/curve-v1-factory/state-polling-pools/custom-pool-polling.js +1 -1
- package/build/dex/curve-v1-factory/state-polling-pools/custom-pool-polling.js.map +1 -1
- package/build/dex/curve-v1-factory/state-polling-pools/factory-pool-polling.js +1 -1
- package/build/dex/curve-v1-factory/state-polling-pools/factory-pool-polling.js.map +1 -1
- package/build/dex/curve-v1-factory/state-polling-pools/pool-polling-base.d.ts +4 -3
- package/build/dex/curve-v1-factory/state-polling-pools/pool-polling-base.js +24 -9
- package/build/dex/curve-v1-factory/state-polling-pools/pool-polling-base.js.map +1 -1
- package/build/dex/curve-v1-factory/types.d.ts +20 -4
- package/build/dex/curve-v1-factory/types.js +11 -3
- package/build/dex/curve-v1-factory/types.js.map +1 -1
- package/build/dex/curve-v1-stable-ng/config.js +18 -0
- package/build/dex/curve-v1-stable-ng/config.js.map +1 -1
- package/build/dex/index.js +18 -0
- package/build/dex/index.js.map +1 -1
- package/build/utils.d.ts +1 -1
- package/package.json +2 -2
- package/src/abi/BProtocol.json +1155 -0
- package/src/abi/Jarvis.json +1172 -0
- package/src/abi/MStableAsset.json +1545 -0
- package/src/abi/OneInchLp.json +1304 -0
- package/src/abi/Onebit.json +736 -0
- package/src/abi/Shell.json +1294 -0
- package/src/abi/TraderJoeV2Router.json +50 -0
- package/src/abi/curve-v1-factory/CurveV1Router.abi.json +331 -0
- package/src/abi/zrx.v2.json +1967 -0
- package/src/abi/zrx.v3.json +3454 -0
- package/src/abi/zrx.v4.json +2193 -0
- package/src/config.ts +1 -1
- package/src/dex/OneInchLp.ts +84 -0
- package/src/dex/bProtocol/bProtocol-e2e.test.ts +93 -0
- package/src/dex/bProtocol/bProtocol.ts +108 -0
- package/src/dex/bProtocol/types.ts +13 -0
- package/src/dex/curve-v1-factory/config.ts +47 -10
- package/src/dex/curve-v1-factory/curve-v1-factory-e2e.test.ts +92 -16
- package/src/dex/curve-v1-factory/curve-v1-factory-integration.test.ts +125 -5
- package/src/dex/curve-v1-factory/curve-v1-factory.ts +137 -45
- package/src/dex/curve-v1-factory/optimizer.ts +61 -0
- package/src/dex/curve-v1-factory/price-handlers/functions/constants.ts +0 -2
- package/src/dex/curve-v1-factory/price-handlers/functions/get_dx.ts +24 -1
- package/src/dex/curve-v1-factory/state-polling-pools/custom-pool-polling.ts +3 -2
- package/src/dex/curve-v1-factory/state-polling-pools/factory-pool-polling.ts +1 -0
- package/src/dex/curve-v1-factory/state-polling-pools/pool-polling-base.ts +31 -10
- package/src/dex/curve-v1-factory/types.ts +22 -6
- package/src/dex/curve-v1-stable-ng/config.ts +18 -0
- package/src/dex/curve-v1-stable-ng/curve-v1-stable-ng-e2e.test.ts +17 -0
- package/src/dex/index.ts +18 -0
- package/src/dex/jarvis.ts +262 -0
- package/src/dex/mStable.ts +147 -0
- package/src/dex/onebit/onebit.ts +113 -0
- package/src/dex/onebit/types.ts +17 -0
- package/src/dex/shell.ts +84 -0
- package/src/dex/trader-joe-v2.ts +148 -0
- package/src/dex/zerox/config.ts +31 -0
- package/src/dex/zerox/index.ts +328 -0
- package/src/dex/zerox/order.ts +62 -0
- package/src/dex/zerox/types.ts +82 -0
- package/src/dex/zerox/zerox-e2e.test.ts +110 -0
- package/tests/constants-e2e.ts +1 -1
- package/tests/utils-e2e.ts +2 -0
- package/.vscode/launch.json +0 -53
- package/.vscode/settings.json +0 -2
- package/.vscode/tasks.json +0 -15
- package/build/abi/AaveV1_lending_pool.json +0 -27
- package/build/abi/platypus/asset.json +0 -490
- package/build/abi/platypus/avax-pool.json +0 -820
- package/build/abi/platypus/oracle.json +0 -119
- package/build/abi/platypus/pool.json +0 -677
- package/build/abi/smardex/all/smardex-router.json +0 -648
- package/build/abi/smardex/layer-1/smardex-factory.json +0 -242
- package/build/abi/smardex/layer-1/smardex-pool.json +0 -506
- package/build/abi/smardex/layer-2/smardex-factory.json +0 -185
- package/build/abi/smardex/layer-2/smardex-pool.json +0 -578
- package/build/abi/swaap-v1/pool.json +0 -1346
- package/build/abi/uniswap-v3/AlienBaseV3Router.abi.json +0 -52
- package/build/abi/wombat/pool.json +0 -1289
- package/build/dex/aave-v1/aave-v1.d.ts +0 -34
- package/build/dex/aave-v1/aave-v1.js +0 -181
- package/build/dex/aave-v1/aave-v1.js.map +0 -1
- package/build/dex/aave-v1/config.d.ts +0 -11
- package/build/dex/aave-v1/config.js +0 -20
- package/build/dex/aave-v1/config.js.map +0 -1
- package/build/dex/aave-v1/tokens-mainnet.json +0 -134
- package/build/dex/aave-v1/tokens.d.ts +0 -3
- package/build/dex/aave-v1/tokens.js +0 -50
- package/build/dex/aave-v1/tokens.js.map +0 -1
- package/build/dex/aave-v1/types.d.ts +0 -12
- package/build/dex/aave-v1/types.js +0 -3
- package/build/dex/aave-v1/types.js.map +0 -1
- package/build/dex/aave-v2/tokens-avalanche.json +0 -44
- package/build/dex/aave-v2/tokens-mainnet.json +0 -188
- package/build/dex/aave-v2/tokens-polygon.json +0 -44
- package/build/dex/bProtocol.d.ts +0 -18
- package/build/dex/bProtocol.js +0 -39
- package/build/dex/bProtocol.js.map +0 -1
- package/build/dex/bancor.d.ts +0 -26
- package/build/dex/bancor.js +0 -58
- package/build/dex/bancor.js.map +0 -1
- package/build/dex/compound.d.ts +0 -18
- package/build/dex/compound.js +0 -46
- package/build/dex/compound.js.map +0 -1
- package/build/dex/curve-v2.d.ts +0 -58
- package/build/dex/curve-v2.js +0 -180
- package/build/dex/curve-v2.js.map +0 -1
- package/build/dex/dodo-v1.d.ts +0 -33
- package/build/dex/dodo-v1.js +0 -63
- package/build/dex/dodo-v1.js.map +0 -1
- package/build/dex/lido.d.ts +0 -19
- package/build/dex/lido.js +0 -42
- package/build/dex/lido.js.map +0 -1
- package/build/dex/maker-psm/scripts/gem.abi.json +0 -136
- package/build/dex/maker-psm/scripts/validate-state.d.ts +0 -0
- package/build/dex/maker-psm/scripts/validate-state.js +0 -185
- package/build/dex/maker-psm/scripts/validate-state.js.map +0 -1
- package/build/dex/maker-psm/scripts/vat.abi.json +0 -243
- package/build/dex/onebit.d.ts +0 -25
- package/build/dex/onebit.js +0 -42
- package/build/dex/onebit.js.map +0 -1
- package/build/dex/platypus/asset.d.ts +0 -14
- package/build/dex/platypus/asset.js +0 -97
- package/build/dex/platypus/asset.js.map +0 -1
- package/build/dex/platypus/config.d.ts +0 -11
- package/build/dex/platypus/config.js +0 -69
- package/build/dex/platypus/config.js.map +0 -1
- package/build/dex/platypus/platypus.d.ts +0 -63
- package/build/dex/platypus/platypus.js +0 -487
- package/build/dex/platypus/platypus.js.map +0 -1
- package/build/dex/platypus/pool-avax.d.ts +0 -8
- package/build/dex/platypus/pool-avax.js +0 -54
- package/build/dex/platypus/pool-avax.js.map +0 -1
- package/build/dex/platypus/pool-base.d.ts +0 -19
- package/build/dex/platypus/pool-base.js +0 -86
- package/build/dex/platypus/pool-base.js.map +0 -1
- package/build/dex/platypus/pool-pure.d.ts +0 -8
- package/build/dex/platypus/pool-pure.js +0 -37
- package/build/dex/platypus/pool-pure.js.map +0 -1
- package/build/dex/platypus/pool-subscriber.d.ts +0 -14
- package/build/dex/platypus/pool-subscriber.js +0 -167
- package/build/dex/platypus/pool-subscriber.js.map +0 -1
- package/build/dex/platypus/pool.d.ts +0 -8
- package/build/dex/platypus/pool.js +0 -58
- package/build/dex/platypus/pool.js.map +0 -1
- package/build/dex/platypus/types.d.ts +0 -92
- package/build/dex/platypus/types.js +0 -10
- package/build/dex/platypus/types.js.map +0 -1
- package/build/dex/quickswap/spiritswap-v3.d.ts +0 -6
- package/build/dex/quickswap/spiritswap-v3.js +0 -19
- package/build/dex/quickswap/spiritswap-v3.js.map +0 -1
- package/build/dex/smardex/config.d.ts +0 -4
- package/build/dex/smardex/config.js +0 -64
- package/build/dex/smardex/config.js.map +0 -1
- package/build/dex/smardex/constants.d.ts +0 -18
- package/build/dex/smardex/constants.js +0 -33
- package/build/dex/smardex/constants.js.map +0 -1
- package/build/dex/smardex/sdk/constants.d.ts +0 -6
- package/build/dex/smardex/sdk/constants.js +0 -13
- package/build/dex/smardex/sdk/constants.js.map +0 -1
- package/build/dex/smardex/sdk/core.d.ts +0 -113
- package/build/dex/smardex/sdk/core.js +0 -499
- package/build/dex/smardex/sdk/core.js.map +0 -1
- package/build/dex/smardex/sdk/errors.d.ts +0 -15
- package/build/dex/smardex/sdk/errors.js +0 -22
- package/build/dex/smardex/sdk/errors.js.map +0 -1
- package/build/dex/smardex/sdk/types.d.ts +0 -62
- package/build/dex/smardex/sdk/types.js +0 -3
- package/build/dex/smardex/sdk/types.js.map +0 -1
- package/build/dex/smardex/sdk/utils.d.ts +0 -44
- package/build/dex/smardex/sdk/utils.js +0 -133
- package/build/dex/smardex/sdk/utils.js.map +0 -1
- package/build/dex/smardex/smardex-event-pool.d.ts +0 -28
- package/build/dex/smardex/smardex-event-pool.js +0 -119
- package/build/dex/smardex/smardex-event-pool.js.map +0 -1
- package/build/dex/smardex/smardex.d.ts +0 -65
- package/build/dex/smardex/smardex.js +0 -519
- package/build/dex/smardex/smardex.js.map +0 -1
- package/build/dex/smardex/types.d.ts +0 -55
- package/build/dex/smardex/types.js +0 -3
- package/build/dex/smardex/types.js.map +0 -1
- package/build/dex/smoothy.d.ts +0 -26
- package/build/dex/smoothy.js +0 -48
- package/build/dex/smoothy.js.map +0 -1
- package/build/dex/solidly/forks-override/cone.d.ts +0 -22
- package/build/dex/solidly/forks-override/cone.js +0 -53
- package/build/dex/solidly/forks-override/cone.js.map +0 -1
- package/build/dex/solidly/forks-override/solisnek.d.ts +0 -8
- package/build/dex/solidly/forks-override/solisnek.js +0 -15
- package/build/dex/solidly/forks-override/solisnek.js.map +0 -1
- package/build/dex/solidly-v3/scripts/check-event-pool-event.d.ts +0 -1
- package/build/dex/solidly-v3/scripts/check-event-pool-event.js +0 -53
- package/build/dex/solidly-v3/scripts/check-event-pool-event.js.map +0 -1
- package/build/dex/stable-pool.d.ts +0 -28
- package/build/dex/stable-pool.js +0 -55
- package/build/dex/stable-pool.js.map +0 -1
- package/build/dex/swaap-v1/config.d.ts +0 -17
- package/build/dex/swaap-v1/config.js +0 -56
- package/build/dex/swaap-v1/config.js.map +0 -1
- package/build/dex/swaap-v1/constants.d.ts +0 -6
- package/build/dex/swaap-v1/constants.js +0 -17
- package/build/dex/swaap-v1/constants.js.map +0 -1
- package/build/dex/swaap-v1/libraries/ChainlinkUtils.d.ts +0 -25
- package/build/dex/swaap-v1/libraries/ChainlinkUtils.js +0 -62
- package/build/dex/swaap-v1/libraries/ChainlinkUtils.js.map +0 -1
- package/build/dex/swaap-v1/libraries/Const.d.ts +0 -18
- package/build/dex/swaap-v1/libraries/Const.js +0 -26
- package/build/dex/swaap-v1/libraries/Const.js.map +0 -1
- package/build/dex/swaap-v1/libraries/GeometricBrownianMotion.d.ts +0 -77
- package/build/dex/swaap-v1/libraries/GeometricBrownianMotion.js +0 -316
- package/build/dex/swaap-v1/libraries/GeometricBrownianMotion.js.map +0 -1
- package/build/dex/swaap-v1/libraries/LogExpMath.d.ts +0 -75
- package/build/dex/swaap-v1/libraries/LogExpMath.js +0 -418
- package/build/dex/swaap-v1/libraries/LogExpMath.js.map +0 -1
- package/build/dex/swaap-v1/libraries/MathMMM.d.ts +0 -185
- package/build/dex/swaap-v1/libraries/MathMMM.js +0 -453
- package/build/dex/swaap-v1/libraries/MathMMM.js.map +0 -1
- package/build/dex/swaap-v1/libraries/Num.d.ts +0 -31
- package/build/dex/swaap-v1/libraries/Num.js +0 -167
- package/build/dex/swaap-v1/libraries/Num.js.map +0 -1
- package/build/dex/swaap-v1/libraries/PoolQuotations.d.ts +0 -23
- package/build/dex/swaap-v1/libraries/PoolQuotations.js +0 -131
- package/build/dex/swaap-v1/libraries/PoolQuotations.js.map +0 -1
- package/build/dex/swaap-v1/libraries/Struct.d.ts +0 -56
- package/build/dex/swaap-v1/libraries/Struct.js +0 -3
- package/build/dex/swaap-v1/libraries/Struct.js.map +0 -1
- package/build/dex/swaap-v1/swaap-v1-pool.d.ts +0 -45
- package/build/dex/swaap-v1/swaap-v1-pool.js +0 -656
- package/build/dex/swaap-v1/swaap-v1-pool.js.map +0 -1
- package/build/dex/swaap-v1/swaap-v1.d.ts +0 -62
- package/build/dex/swaap-v1/swaap-v1.js +0 -383
- package/build/dex/swaap-v1/swaap-v1.js.map +0 -1
- package/build/dex/swaap-v1/types.d.ts +0 -106
- package/build/dex/swaap-v1/types.js +0 -9
- package/build/dex/swaap-v1/types.js.map +0 -1
- package/build/dex/trader-joe-v2.1.d.ts +0 -43
- package/build/dex/trader-joe-v2.1.js +0 -79
- package/build/dex/trader-joe-v2.1.js.map +0 -1
- package/build/dex/uniswap-v3/forks/alien-base-v3/alien-base-v3.d.ts +0 -17
- package/build/dex/uniswap-v3/forks/alien-base-v3/alien-base-v3.js +0 -64
- package/build/dex/uniswap-v3/forks/alien-base-v3/alien-base-v3.js.map +0 -1
- package/build/dex/uniswap-v3/forks/alien-v3/alien-v3.d.ts +0 -17
- package/build/dex/uniswap-v3/forks/alien-v3/alien-v3.js +0 -79
- 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
|
|
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
|
-
|
|
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 (
|
|
927
|
-
throw new Error(
|
|
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 (
|
|
1142
|
-
throw new Error(
|
|
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 (
|
|
1179
|
-
|
|
1207
|
+
if (data.path.length === 1) {
|
|
1208
|
+
// Single pool encoding
|
|
1209
|
+
const { exchange, i, j, underlyingSwap } = data.path[0];
|
|
1180
1210
|
|
|
1181
|
-
|
|
1211
|
+
const minAmountToReceive =
|
|
1212
|
+
side === SwapSide.SELL ? MIN_AMOUNT_TO_RECEIVE : destAmount;
|
|
1213
|
+
const defaultArgs = [i, j, srcAmount, minAmountToReceive];
|
|
1182
1214
|
|
|
1183
|
-
|
|
1184
|
-
|
|
1185
|
-
|
|
1215
|
+
const swapMethod = underlyingSwap
|
|
1216
|
+
? CurveSwapFunctions.exchange_underlying
|
|
1217
|
+
: CurveSwapFunctions.exchange;
|
|
1186
1218
|
|
|
1187
|
-
|
|
1188
|
-
|
|
1189
|
-
|
|
1190
|
-
|
|
1191
|
-
|
|
1192
|
-
|
|
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:
|
|
1200
|
-
targetExchange:
|
|
1201
|
-
returnAmountPos:
|
|
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
|
+
}
|
|
@@ -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]:
|
|
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
|
-
|
|
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:
|
|
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,
|