@paraswap/dex-lib 2.35.7-worker-pool.2 → 2.36.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/vcs.xml +6 -0
- package/build/abi/aerodrome/aerodrome-pool-factory.json +586 -0
- package/build/abi/algebra/AlgebraPool.abi.json +727 -0
- package/build/abi/curve-v1/StableSwapFRXETH.json +889 -0
- package/build/abi/curve-v1/StableSwapWBETH.json +1223 -0
- package/build/abi/sushiswap-v3/QuoterV2.json +267 -0
- package/build/abi/sushiswap-v3/RouterProcessor3.json +289 -0
- package/build/abi/wBETH.json +1527 -0
- package/build/config.js +2 -2
- package/build/dex/algebra/algebra-pool.d.ts +46 -0
- package/build/dex/algebra/algebra-pool.js +336 -0
- package/build/dex/algebra/algebra-pool.js.map +1 -0
- package/build/dex/algebra/algebra.d.ts +2 -4
- package/build/dex/algebra/algebra.js +3 -4
- package/build/dex/algebra/algebra.js.map +1 -1
- package/build/dex/balancer-v2/config.js +9 -1
- package/build/dex/balancer-v2/config.js.map +1 -1
- package/build/dex/curve-v1/pools/frxETHpool.d.ts +7 -0
- package/build/dex/curve-v1/pools/frxETHpool.js +27 -0
- package/build/dex/curve-v1/pools/frxETHpool.js.map +1 -0
- package/build/dex/curve-v1/pools/wbETHpool.d.ts +29 -0
- package/build/dex/curve-v1/pools/wbETHpool.js +408 -0
- package/build/dex/curve-v1/pools/wbETHpool.js.map +1 -0
- package/build/dex/index.js +2 -0
- package/build/dex/index.js.map +1 -1
- package/build/dex/maverick-v1/config.js +9 -0
- package/build/dex/maverick-v1/config.js.map +1 -1
- package/build/dex/maverick-v1/maverick-v1.js +11 -2
- package/build/dex/maverick-v1/maverick-v1.js.map +1 -1
- package/build/dex/pancakeswap-v3/config.js +17 -0
- package/build/dex/pancakeswap-v3/config.js.map +1 -1
- package/build/dex/pancakeswap-v3/pancakeswap-v3.d.ts +2 -3
- package/build/dex/pancakeswap-v3/pancakeswap-v3.js +3 -3
- package/build/dex/pancakeswap-v3/pancakeswap-v3.js.map +1 -1
- package/build/dex/pancakeswap-v3/types.d.ts +14 -0
- package/build/dex/{test-dex → pancakeswap-v3}/types.js.map +1 -1
- package/build/dex/{test-dex → ramses-v2}/config.d.ts +1 -1
- package/build/dex/ramses-v2/config.js +28 -0
- package/build/dex/ramses-v2/config.js.map +1 -0
- package/build/dex/ramses-v2/constants.d.ts +28 -0
- package/build/dex/ramses-v2/constants.js +35 -0
- package/build/dex/ramses-v2/constants.js.map +1 -0
- package/build/dex/ramses-v2/contract-math/BitMath.d.ts +4 -0
- package/build/dex/ramses-v2/contract-math/BitMath.js +93 -0
- package/build/dex/ramses-v2/contract-math/BitMath.js.map +1 -0
- package/build/dex/ramses-v2/contract-math/FixedPoint128.d.ts +3 -0
- package/build/dex/ramses-v2/contract-math/FixedPoint128.js +8 -0
- package/build/dex/ramses-v2/contract-math/FixedPoint128.js.map +1 -0
- package/build/dex/ramses-v2/contract-math/FixedPoint96.d.ts +4 -0
- package/build/dex/ramses-v2/contract-math/FixedPoint96.js +9 -0
- package/build/dex/ramses-v2/contract-math/FixedPoint96.js.map +1 -0
- package/build/dex/ramses-v2/contract-math/FullMath.d.ts +4 -0
- package/build/dex/ramses-v2/contract-math/FullMath.js +19 -0
- package/build/dex/ramses-v2/contract-math/FullMath.js.map +1 -0
- package/build/dex/ramses-v2/contract-math/LiquidityMath.d.ts +3 -0
- package/build/dex/ramses-v2/contract-math/LiquidityMath.js +22 -0
- package/build/dex/ramses-v2/contract-math/LiquidityMath.js.map +1 -0
- package/build/dex/ramses-v2/contract-math/Oracle.d.ts +10 -0
- package/build/dex/ramses-v2/contract-math/Oracle.js +133 -0
- package/build/dex/ramses-v2/contract-math/Oracle.js.map +1 -0
- package/build/dex/ramses-v2/contract-math/SqrtPriceMath.d.ts +10 -0
- package/build/dex/ramses-v2/contract-math/SqrtPriceMath.js +91 -0
- package/build/dex/ramses-v2/contract-math/SqrtPriceMath.js.map +1 -0
- package/build/dex/ramses-v2/contract-math/SwapMath.d.ts +8 -0
- package/build/dex/ramses-v2/contract-math/SwapMath.js +70 -0
- package/build/dex/ramses-v2/contract-math/SwapMath.js.map +1 -0
- package/build/dex/ramses-v2/contract-math/Tick.d.ts +7 -0
- package/build/dex/ramses-v2/contract-math/Tick.js +45 -0
- package/build/dex/ramses-v2/contract-math/Tick.js.map +1 -0
- package/build/dex/ramses-v2/contract-math/TickBitMap.d.ts +8 -0
- package/build/dex/ramses-v2/contract-math/TickBitMap.js +87 -0
- package/build/dex/ramses-v2/contract-math/TickBitMap.js.map +1 -0
- package/build/dex/ramses-v2/contract-math/TickMath.d.ts +8 -0
- package/build/dex/ramses-v2/contract-math/TickMath.js +162 -0
- package/build/dex/ramses-v2/contract-math/TickMath.js.map +1 -0
- package/build/dex/ramses-v2/contract-math/UnsafeMath.d.ts +3 -0
- package/build/dex/ramses-v2/contract-math/UnsafeMath.js +10 -0
- package/build/dex/ramses-v2/contract-math/UnsafeMath.js.map +1 -0
- package/build/dex/ramses-v2/contract-math/uniswap-v3-math.d.ts +18 -0
- package/build/dex/ramses-v2/contract-math/uniswap-v3-math.js +392 -0
- package/build/dex/ramses-v2/contract-math/uniswap-v3-math.js.map +1 -0
- package/build/dex/ramses-v2/contract-math/utils.d.ts +3 -0
- package/build/dex/ramses-v2/contract-math/utils.js +16 -0
- package/build/dex/ramses-v2/contract-math/utils.js.map +1 -0
- package/build/dex/ramses-v2/ramses-v2-pool.d.ts +42 -0
- package/build/dex/ramses-v2/ramses-v2-pool.js +307 -0
- package/build/dex/ramses-v2/ramses-v2-pool.js.map +1 -0
- package/build/dex/ramses-v2/ramses-v2.d.ts +61 -0
- package/build/dex/ramses-v2/ramses-v2.js +690 -0
- package/build/dex/ramses-v2/ramses-v2.js.map +1 -0
- package/build/dex/ramses-v2/types.d.ts +154 -0
- package/build/dex/ramses-v2/types.js +9 -0
- package/build/dex/ramses-v2/types.js.map +1 -0
- package/build/dex/ramses-v2/utils.d.ts +6 -0
- package/build/dex/ramses-v2/utils.js +71 -0
- package/build/dex/ramses-v2/utils.js.map +1 -0
- package/build/dex/solidly/config.js +22 -1
- package/build/dex/solidly/config.js.map +1 -1
- package/build/dex/solidly/forks-override/aerodrome.d.ts +14 -0
- package/build/dex/solidly/forks-override/aerodrome.js +48 -0
- package/build/dex/solidly/forks-override/aerodrome.js.map +1 -0
- package/build/dex/solidly/solidly.js +1 -0
- package/build/dex/solidly/solidly.js.map +1 -1
- package/build/dex/sushiswap-v3/config.d.ts +4 -0
- package/build/dex/sushiswap-v3/config.js +132 -0
- package/build/dex/sushiswap-v3/config.js.map +1 -0
- package/build/dex/sushiswap-v3/constants.d.ts +4 -0
- package/build/dex/sushiswap-v3/constants.js +32 -0
- package/build/dex/sushiswap-v3/constants.js.map +1 -0
- package/build/dex/sushiswap-v3/sushiswap-v3-original.d.ts +56 -0
- package/build/dex/sushiswap-v3/sushiswap-v3-original.js +598 -0
- package/build/dex/sushiswap-v3/sushiswap-v3-original.js.map +1 -0
- package/build/dex/sushiswap-v3/sushiswap-v3-pool.d.ts +1 -0
- package/build/dex/sushiswap-v3/sushiswap-v3-pool.js +6 -0
- package/build/dex/sushiswap-v3/sushiswap-v3-pool.js.map +1 -0
- package/build/dex/sushiswap-v3/sushiswap-v3.d.ts +21 -0
- package/build/dex/sushiswap-v3/sushiswap-v3.js +58 -0
- package/build/dex/sushiswap-v3/sushiswap-v3.js.map +1 -0
- package/build/dex/sushiswap-v3/token.d.ts +6 -0
- package/build/dex/sushiswap-v3/token.js +23 -0
- package/build/dex/sushiswap-v3/token.js.map +1 -0
- package/build/dex/sushiswap-v3/types.d.ts +15 -0
- package/build/dex/sushiswap-v3/types.js +18 -0
- package/build/dex/sushiswap-v3/types.js.map +1 -0
- package/build/dex/uniswap-v3/config.js +12 -0
- package/build/dex/uniswap-v3/config.js.map +1 -1
- package/build/dex/uniswap-v3/uniswap-v3.d.ts +2 -3
- package/build/dex/uniswap-v3/uniswap-v3.js +3 -3
- package/build/dex/uniswap-v3/uniswap-v3.js.map +1 -1
- package/build/dex/woo-fi-v2/config.js +13 -0
- package/build/dex/woo-fi-v2/config.js.map +1 -1
- package/build/dex-helper/dummy-dex-helper.d.ts +0 -1
- package/build/dex-helper/dummy-dex-helper.js +0 -3
- package/build/dex-helper/dummy-dex-helper.js.map +1 -1
- package/build/dex-helper/idex-helper.d.ts +0 -1
- package/package.json +1 -1
- package/src/abi/aerodrome/aerodrome-pool-factory.json +586 -0
- package/src/config.ts +2 -2
- package/src/dex/algebra/algebra.ts +15 -15
- package/src/dex/balancer-v2/balancer-v2-e2e.test.ts +122 -1
- package/src/dex/balancer-v2/config.ts +10 -1
- package/src/dex/index.ts +2 -0
- package/src/dex/maverick-v1/config.ts +10 -0
- package/src/dex/maverick-v1/maverick-v1-e2e.test.ts +121 -1
- package/src/dex/maverick-v1/maverick-v1.ts +12 -2
- package/src/dex/pancakeswap-v3/config.ts +19 -0
- package/src/dex/pancakeswap-v3/pancakeswap-v3-e2e.test.ts +120 -0
- package/src/dex/pancakeswap-v3/pancakeswap-v3.ts +16 -14
- package/src/dex/solidly/config.ts +24 -1
- package/src/dex/solidly/forks-override/aerodrome.ts +57 -0
- package/src/dex/solidly/solidly-e2e.test.ts +88 -0
- package/src/dex/solidly/solidly-integration.test.ts +66 -0
- package/src/dex/solidly/solidly.ts +1 -0
- package/src/dex/uniswap-v3/config.ts +13 -0
- package/src/dex/uniswap-v3/uniswap-v3-e2e.test.ts +25 -4
- package/src/dex/uniswap-v3/uniswap-v3-integration.test.ts +142 -0
- package/src/dex/uniswap-v3/uniswap-v3.ts +15 -14
- package/src/dex/woo-fi-v2/config.ts +13 -0
- package/src/dex/woo-fi-v2/woo-fi-v2-e2e.test.ts +64 -0
- package/src/dex-helper/dummy-dex-helper.ts +0 -15
- package/src/dex-helper/idex-helper.ts +0 -7
- package/tests/constants-e2e.ts +30 -0
- package/tests/utils-e2e.ts +1 -0
- package/build/abi/quickPerps/fast-price-events.json +0 -70
- package/build/abi/quickPerps/fast-price-feed.json +0 -748
- package/build/abi/quickPerps/reader.json +0 -313
- package/build/abi/quickPerps/vault-price-feed.json +0 -477
- package/build/abi/quickPerps/vault.json +0 -1953
- package/build/dex/test-dex/config.js +0 -15
- package/build/dex/test-dex/config.js.map +0 -1
- package/build/dex/test-dex/test-dex-pool.d.ts +0 -39
- package/build/dex/test-dex/test-dex-pool.js +0 -63
- package/build/dex/test-dex/test-dex-pool.js.map +0 -1
- package/build/dex/test-dex/test-dex.d.ts +0 -37
- package/build/dex/test-dex/test-dex.js +0 -126
- package/build/dex/test-dex/test-dex.js.map +0 -1
- package/build/dex/test-dex/types.d.ts +0 -6
- package/build/dex/woo-fi-v2/woo-fi-math.d.ts +0 -16
- package/build/dex/woo-fi-v2/woo-fi-math.js +0 -137
- package/build/dex/woo-fi-v2/woo-fi-math.js.map +0 -1
- package/build/workers.d.ts +0 -0
- package/build/workers.js +0 -2
- package/build/workers.js.map +0 -1
- /package/build/dex/{test-dex → pancakeswap-v3}/types.js +0 -0
|
@@ -2,7 +2,7 @@ import dotenv from 'dotenv';
|
|
|
2
2
|
dotenv.config();
|
|
3
3
|
|
|
4
4
|
import { testE2E } from '../../../tests/utils-e2e';
|
|
5
|
-
import { Holders, Tokens } from '../../../tests/constants-e2e';
|
|
5
|
+
import { Holders, NativeTokenSymbols, Tokens } from '../../../tests/constants-e2e';
|
|
6
6
|
import { ContractMethod, Network, SwapSide } from '../../constants';
|
|
7
7
|
import { StaticJsonRpcProvider } from '@ethersproject/providers';
|
|
8
8
|
|
|
@@ -10,6 +10,105 @@ import { generateConfig } from '../../config';
|
|
|
10
10
|
|
|
11
11
|
jest.setTimeout(50 * 1000);
|
|
12
12
|
|
|
13
|
+
function testForNetwork(
|
|
14
|
+
network: Network,
|
|
15
|
+
dexKey: string,
|
|
16
|
+
tokenASymbol: string,
|
|
17
|
+
tokenBSymbol: string,
|
|
18
|
+
tokenAAmount: string,
|
|
19
|
+
tokenBAmount: string,
|
|
20
|
+
nativeTokenAmount: string,
|
|
21
|
+
slippage?: number | undefined,
|
|
22
|
+
) {
|
|
23
|
+
const provider = new StaticJsonRpcProvider(
|
|
24
|
+
generateConfig(network).privateHttpProvider,
|
|
25
|
+
network,
|
|
26
|
+
);
|
|
27
|
+
const tokens = Tokens[network];
|
|
28
|
+
const holders = Holders[network];
|
|
29
|
+
const nativeTokenSymbol = NativeTokenSymbols[network];
|
|
30
|
+
|
|
31
|
+
const sideToContractMethods = new Map([
|
|
32
|
+
[
|
|
33
|
+
SwapSide.SELL,
|
|
34
|
+
[
|
|
35
|
+
ContractMethod.simpleSwap,
|
|
36
|
+
ContractMethod.multiSwap,
|
|
37
|
+
ContractMethod.megaSwap,
|
|
38
|
+
],
|
|
39
|
+
],
|
|
40
|
+
[
|
|
41
|
+
SwapSide.BUY,
|
|
42
|
+
[
|
|
43
|
+
ContractMethod.simpleBuy,
|
|
44
|
+
ContractMethod.buy,
|
|
45
|
+
],
|
|
46
|
+
],
|
|
47
|
+
]);
|
|
48
|
+
|
|
49
|
+
describe(`${network}`, () => {
|
|
50
|
+
sideToContractMethods.forEach((contractMethods, side) =>
|
|
51
|
+
describe(`${side}`, () => {
|
|
52
|
+
contractMethods.forEach((contractMethod: ContractMethod) => {
|
|
53
|
+
describe(`${contractMethod}`, () => {
|
|
54
|
+
it(`${nativeTokenSymbol} -> ${tokenASymbol}`, async () => {
|
|
55
|
+
await testE2E(
|
|
56
|
+
tokens[nativeTokenSymbol],
|
|
57
|
+
tokens[tokenASymbol],
|
|
58
|
+
holders[nativeTokenSymbol],
|
|
59
|
+
side === SwapSide.SELL ? nativeTokenAmount : tokenAAmount,
|
|
60
|
+
side,
|
|
61
|
+
dexKey,
|
|
62
|
+
contractMethod,
|
|
63
|
+
network,
|
|
64
|
+
provider,
|
|
65
|
+
undefined,
|
|
66
|
+
undefined,
|
|
67
|
+
undefined,
|
|
68
|
+
slippage,
|
|
69
|
+
);
|
|
70
|
+
});
|
|
71
|
+
it(`${tokenASymbol} -> ${nativeTokenSymbol}`, async () => {
|
|
72
|
+
await testE2E(
|
|
73
|
+
tokens[tokenASymbol],
|
|
74
|
+
tokens[nativeTokenSymbol],
|
|
75
|
+
holders[tokenASymbol],
|
|
76
|
+
side === SwapSide.SELL ? tokenAAmount : nativeTokenAmount,
|
|
77
|
+
side,
|
|
78
|
+
dexKey,
|
|
79
|
+
contractMethod,
|
|
80
|
+
network,
|
|
81
|
+
provider,
|
|
82
|
+
undefined,
|
|
83
|
+
undefined,
|
|
84
|
+
undefined,
|
|
85
|
+
slippage,
|
|
86
|
+
);
|
|
87
|
+
});
|
|
88
|
+
it(`${tokenASymbol} -> ${tokenBSymbol}`, async () => {
|
|
89
|
+
await testE2E(
|
|
90
|
+
tokens[tokenASymbol],
|
|
91
|
+
tokens[tokenBSymbol],
|
|
92
|
+
holders[tokenASymbol],
|
|
93
|
+
side === SwapSide.SELL ? tokenAAmount : tokenBAmount,
|
|
94
|
+
side,
|
|
95
|
+
dexKey,
|
|
96
|
+
contractMethod,
|
|
97
|
+
network,
|
|
98
|
+
provider,
|
|
99
|
+
undefined,
|
|
100
|
+
undefined,
|
|
101
|
+
undefined,
|
|
102
|
+
slippage,
|
|
103
|
+
);
|
|
104
|
+
});
|
|
105
|
+
});
|
|
106
|
+
});
|
|
107
|
+
}),
|
|
108
|
+
);
|
|
109
|
+
});
|
|
110
|
+
}
|
|
111
|
+
|
|
13
112
|
describe('BalancerV2 E2E', () => {
|
|
14
113
|
describe('BalancerV2 MAINNET', () => {
|
|
15
114
|
const dexKey = 'BalancerV2';
|
|
@@ -1195,6 +1294,28 @@ describe('BalancerV2 E2E', () => {
|
|
|
1195
1294
|
});
|
|
1196
1295
|
});
|
|
1197
1296
|
|
|
1297
|
+
describe('BalancerV2 Base', () => {
|
|
1298
|
+
const dexKey = 'BalancerV2';
|
|
1299
|
+
const network = Network.BASE;
|
|
1300
|
+
|
|
1301
|
+
const tokenASymbol: string = 'USDC';
|
|
1302
|
+
const tokenBSymbol: string = 'GOLD';
|
|
1303
|
+
|
|
1304
|
+
const tokenAAmount: string = '11110010';
|
|
1305
|
+
const tokenBAmount: string = '210000000000000000000';
|
|
1306
|
+
const nativeTokenAmount = '1000000000000000000';
|
|
1307
|
+
|
|
1308
|
+
testForNetwork(
|
|
1309
|
+
network,
|
|
1310
|
+
dexKey,
|
|
1311
|
+
tokenASymbol,
|
|
1312
|
+
tokenBSymbol,
|
|
1313
|
+
tokenAAmount,
|
|
1314
|
+
tokenBAmount,
|
|
1315
|
+
nativeTokenAmount,
|
|
1316
|
+
);
|
|
1317
|
+
});
|
|
1318
|
+
|
|
1198
1319
|
describe('BeetsFi OPTIMISM', () => {
|
|
1199
1320
|
const dexKey = 'BeetsFi';
|
|
1200
1321
|
const network = Network.OPTIMISM;
|
|
@@ -23,7 +23,12 @@ export const BalancerConfig: DexConfigMap<DexParams> = {
|
|
|
23
23
|
subgraphURL:
|
|
24
24
|
'https://api.thegraph.com/subgraphs/name/balancer-labs/balancer-avalanche-v2',
|
|
25
25
|
vaultAddress: '0xBA12222222228d8Ba445958a75a0704d566BF2C8',
|
|
26
|
-
}
|
|
26
|
+
},
|
|
27
|
+
[Network.BASE]: {
|
|
28
|
+
subgraphURL:
|
|
29
|
+
'https://api.studio.thegraph.com/query/24660/balancer-base-v2/version/latest',
|
|
30
|
+
vaultAddress: '0xBA12222222228d8Ba445958a75a0704d566BF2C8',
|
|
31
|
+
},
|
|
27
32
|
},
|
|
28
33
|
BeetsFi: {
|
|
29
34
|
[Network.FANTOM]: {
|
|
@@ -71,5 +76,9 @@ export const Adapters: Record<number, AdapterMappings> = {
|
|
|
71
76
|
[Network.AVALANCHE]: {
|
|
72
77
|
[SwapSide.SELL]: [{ name: 'AvalancheAdapter01', index: 8 }],
|
|
73
78
|
[SwapSide.BUY]: [{ name: 'AvalancheBuyAdapter', index: 7 }],
|
|
79
|
+
},
|
|
80
|
+
[Network.BASE]: {
|
|
81
|
+
[SwapSide.SELL]: [{ name: 'BaseAdapter01', index: 4 }],
|
|
82
|
+
[SwapSide.BUY]: [{ name: 'BaseBuyAdapter', index: 3 }],
|
|
74
83
|
}
|
|
75
84
|
};
|
package/src/dex/index.ts
CHANGED
|
@@ -47,6 +47,7 @@ import { Thena } from './solidly/forks-override/thena';
|
|
|
47
47
|
import { Chronos } from './solidly/forks-override/chronos';
|
|
48
48
|
import { Velodrome } from './solidly/forks-override/velodrome';
|
|
49
49
|
import { VelodromeV2 } from './solidly/forks-override/velodromeV2';
|
|
50
|
+
import { Aerodrome } from './solidly/forks-override/aerodrome';
|
|
50
51
|
import { SpiritSwapV2 } from './solidly/forks-override/spiritSwapV2';
|
|
51
52
|
import { Synthetix } from './synthetix/synthetix';
|
|
52
53
|
import { Cone } from './solidly/forks-override/cone';
|
|
@@ -134,6 +135,7 @@ const Dexes = [
|
|
|
134
135
|
Chronos,
|
|
135
136
|
Velodrome,
|
|
136
137
|
VelodromeV2,
|
|
138
|
+
Aerodrome,
|
|
137
139
|
Cone,
|
|
138
140
|
SoliSnek,
|
|
139
141
|
Equalizer,
|
|
@@ -14,6 +14,12 @@ export const MaverickV1Config: DexConfigMap<DexParams> = {
|
|
|
14
14
|
routerAddress: '0x4a585e0f7c18e2c414221d6402652d5e0990e5f8',
|
|
15
15
|
poolInspectorAddress: '0xaA5BF61a664109e959D69C38734d4EA7dF74e456',
|
|
16
16
|
},
|
|
17
|
+
[Network.BASE]: {
|
|
18
|
+
subgraphURL:
|
|
19
|
+
'https://api.studio.thegraph.com/query/42519/maverick-base/version/latest',
|
|
20
|
+
routerAddress: '0x32AED3Bce901DA12ca8489788F3A99fCe1056e14',
|
|
21
|
+
poolInspectorAddress: '0x65A3AD03Be97619284bA7AA1E3Ca05638B9d6364',
|
|
22
|
+
},
|
|
17
23
|
},
|
|
18
24
|
};
|
|
19
25
|
|
|
@@ -22,4 +28,8 @@ export const Adapters: Record<number, AdapterMappings> = {
|
|
|
22
28
|
[SwapSide.SELL]: [{ name: 'Adapter04', index: 2 }],
|
|
23
29
|
[SwapSide.BUY]: [{ name: 'BuyAdapter', index: 8 }],
|
|
24
30
|
},
|
|
31
|
+
[Network.BASE]: {
|
|
32
|
+
[SwapSide.SELL]: [{ name: 'BaseAdapter01', index: 2 }],
|
|
33
|
+
[SwapSide.BUY]: [{ name: 'BaseBuyAdapter', index: 2 }],
|
|
34
|
+
},
|
|
25
35
|
};
|
|
@@ -11,10 +11,109 @@ import { Network, ContractMethod, SwapSide } from '../../constants';
|
|
|
11
11
|
import { StaticJsonRpcProvider } from '@ethersproject/providers';
|
|
12
12
|
import { generateConfig } from '../../config';
|
|
13
13
|
|
|
14
|
+
function testForNetwork(
|
|
15
|
+
network: Network,
|
|
16
|
+
dexKey: string,
|
|
17
|
+
tokenASymbol: string,
|
|
18
|
+
tokenBSymbol: string,
|
|
19
|
+
tokenAAmount: string,
|
|
20
|
+
tokenBAmount: string,
|
|
21
|
+
nativeTokenAmount: string,
|
|
22
|
+
slippage?: number | undefined,
|
|
23
|
+
) {
|
|
24
|
+
const provider = new StaticJsonRpcProvider(
|
|
25
|
+
generateConfig(network).privateHttpProvider,
|
|
26
|
+
network,
|
|
27
|
+
);
|
|
28
|
+
const tokens = Tokens[network];
|
|
29
|
+
const holders = Holders[network];
|
|
30
|
+
const nativeTokenSymbol = NativeTokenSymbols[network];
|
|
31
|
+
|
|
32
|
+
const sideToContractMethods = new Map([
|
|
33
|
+
[
|
|
34
|
+
SwapSide.SELL,
|
|
35
|
+
[
|
|
36
|
+
ContractMethod.simpleSwap,
|
|
37
|
+
ContractMethod.multiSwap,
|
|
38
|
+
ContractMethod.megaSwap,
|
|
39
|
+
],
|
|
40
|
+
],
|
|
41
|
+
[
|
|
42
|
+
SwapSide.BUY,
|
|
43
|
+
[
|
|
44
|
+
ContractMethod.simpleBuy,
|
|
45
|
+
ContractMethod.buy,
|
|
46
|
+
],
|
|
47
|
+
],
|
|
48
|
+
]);
|
|
49
|
+
|
|
50
|
+
describe(`${network}`, () => {
|
|
51
|
+
sideToContractMethods.forEach((contractMethods, side) =>
|
|
52
|
+
describe(`${side}`, () => {
|
|
53
|
+
contractMethods.forEach((contractMethod: ContractMethod) => {
|
|
54
|
+
describe(`${contractMethod}`, () => {
|
|
55
|
+
it(`${nativeTokenSymbol} -> ${tokenASymbol}`, async () => {
|
|
56
|
+
await testE2E(
|
|
57
|
+
tokens[nativeTokenSymbol],
|
|
58
|
+
tokens[tokenASymbol],
|
|
59
|
+
holders[nativeTokenSymbol],
|
|
60
|
+
side === SwapSide.SELL ? nativeTokenAmount : tokenAAmount,
|
|
61
|
+
side,
|
|
62
|
+
dexKey,
|
|
63
|
+
contractMethod,
|
|
64
|
+
network,
|
|
65
|
+
provider,
|
|
66
|
+
undefined,
|
|
67
|
+
undefined,
|
|
68
|
+
undefined,
|
|
69
|
+
slippage,
|
|
70
|
+
);
|
|
71
|
+
});
|
|
72
|
+
it(`${tokenASymbol} -> ${nativeTokenSymbol}`, async () => {
|
|
73
|
+
await testE2E(
|
|
74
|
+
tokens[tokenASymbol],
|
|
75
|
+
tokens[nativeTokenSymbol],
|
|
76
|
+
holders[tokenASymbol],
|
|
77
|
+
side === SwapSide.SELL ? tokenAAmount : nativeTokenAmount,
|
|
78
|
+
side,
|
|
79
|
+
dexKey,
|
|
80
|
+
contractMethod,
|
|
81
|
+
network,
|
|
82
|
+
provider,
|
|
83
|
+
undefined,
|
|
84
|
+
undefined,
|
|
85
|
+
undefined,
|
|
86
|
+
slippage,
|
|
87
|
+
);
|
|
88
|
+
});
|
|
89
|
+
it(`${tokenASymbol} -> ${tokenBSymbol}`, async () => {
|
|
90
|
+
await testE2E(
|
|
91
|
+
tokens[tokenASymbol],
|
|
92
|
+
tokens[tokenBSymbol],
|
|
93
|
+
holders[tokenASymbol],
|
|
94
|
+
side === SwapSide.SELL ? tokenAAmount : tokenBAmount,
|
|
95
|
+
side,
|
|
96
|
+
dexKey,
|
|
97
|
+
contractMethod,
|
|
98
|
+
network,
|
|
99
|
+
provider,
|
|
100
|
+
undefined,
|
|
101
|
+
undefined,
|
|
102
|
+
undefined,
|
|
103
|
+
slippage,
|
|
104
|
+
);
|
|
105
|
+
});
|
|
106
|
+
});
|
|
107
|
+
});
|
|
108
|
+
}),
|
|
109
|
+
);
|
|
110
|
+
});
|
|
111
|
+
}
|
|
112
|
+
|
|
14
113
|
describe('MaverickV1 E2E', () => {
|
|
15
114
|
const dexKey = 'MaverickV1';
|
|
16
115
|
|
|
17
|
-
describe('
|
|
116
|
+
describe('MAINNET', () => {
|
|
18
117
|
const network = Network.MAINNET;
|
|
19
118
|
const tokens = Tokens[network];
|
|
20
119
|
const holders = Holders[network];
|
|
@@ -121,4 +220,25 @@ describe('MaverickV1 E2E', () => {
|
|
|
121
220
|
);
|
|
122
221
|
});
|
|
123
222
|
});
|
|
223
|
+
|
|
224
|
+
describe('BASE', () => {
|
|
225
|
+
const network = Network.BASE;
|
|
226
|
+
|
|
227
|
+
const tokenASymbol: string = 'USDbC';
|
|
228
|
+
const tokenBSymbol: string = 'MAV';
|
|
229
|
+
|
|
230
|
+
const tokenAAmount: string = '1111100000';
|
|
231
|
+
const tokenBAmount: string = '1100000000000000000';
|
|
232
|
+
const nativeTokenAmount = '100000000000000000';
|
|
233
|
+
|
|
234
|
+
testForNetwork(
|
|
235
|
+
network,
|
|
236
|
+
dexKey,
|
|
237
|
+
tokenASymbol,
|
|
238
|
+
tokenBSymbol,
|
|
239
|
+
tokenAAmount,
|
|
240
|
+
tokenBAmount,
|
|
241
|
+
nativeTokenAmount,
|
|
242
|
+
);
|
|
243
|
+
});
|
|
124
244
|
});
|
|
@@ -78,6 +78,7 @@ export class MaverickV1
|
|
|
78
78
|
|
|
79
79
|
async setupEventPools(blockNumber: number) {
|
|
80
80
|
const pools = await this.fetchAllSubgraphPools();
|
|
81
|
+
|
|
81
82
|
await Promise.all(
|
|
82
83
|
pools.map(async (pool: any) => {
|
|
83
84
|
const eventPool = new MaverickV1EventPool(
|
|
@@ -181,8 +182,17 @@ export class MaverickV1
|
|
|
181
182
|
getCalldataGasCost(
|
|
182
183
|
poolPrices: PoolPrices<MaverickV1Data>,
|
|
183
184
|
): number | number[] {
|
|
184
|
-
|
|
185
|
-
|
|
185
|
+
const gasCost = CALLDATA_GAS_COST.DEX_NO_PAYLOAD;
|
|
186
|
+
|
|
187
|
+
const arr = new Array(poolPrices.prices.length);
|
|
188
|
+
poolPrices.prices.forEach((p, index) => {
|
|
189
|
+
if (p == 0n) {
|
|
190
|
+
arr[index] = 0;
|
|
191
|
+
} else {
|
|
192
|
+
arr[index] = gasCost;
|
|
193
|
+
}
|
|
194
|
+
});
|
|
195
|
+
return arr;
|
|
186
196
|
}
|
|
187
197
|
|
|
188
198
|
// Returns pool prices for amounts.
|
|
@@ -53,6 +53,21 @@ export const PancakeswapV3Config: DexConfigMap<DexParams> = {
|
|
|
53
53
|
subgraphURL:
|
|
54
54
|
'https://api.studio.thegraph.com/query/45376/exchange-v3-arbitrum/version/latest',
|
|
55
55
|
},
|
|
56
|
+
[Network.BASE]: {
|
|
57
|
+
factory: '0x0BFbCF9fa4f9C56B0F40a671Ad40E0805A091865',
|
|
58
|
+
deployer: '0x41ff9AA7e16B8B1a8a8dc4f0eFacd93D02d071c9',
|
|
59
|
+
quoter: '0xB048Bbc1Ee6b733FFfCFb9e9CeF7375518e25997',
|
|
60
|
+
router: '0x1b81D678ffb9C0263b24A97847620C99d213eB14',
|
|
61
|
+
supportedFees: PANCAKE_SUPPORTED_FEES,
|
|
62
|
+
stateMulticall: '0xeBF40A40CA3D4310Bf53048F48e860656e1D7C81',
|
|
63
|
+
uniswapMulticall: '0x091e99cb1C49331a94dD62755D168E941AbD0693',
|
|
64
|
+
chunksCount: 10,
|
|
65
|
+
initRetryFrequency: 30,
|
|
66
|
+
initHash:
|
|
67
|
+
'0x6ce8eb472fa82df5469c6ab6d485f17c3ad13c8cd7af59b3d4a8026c5ce0f7e2',
|
|
68
|
+
subgraphURL:
|
|
69
|
+
'https://api.studio.thegraph.com/query/45376/exchange-v3-base/version/latest',
|
|
70
|
+
},
|
|
56
71
|
},
|
|
57
72
|
};
|
|
58
73
|
|
|
@@ -69,4 +84,8 @@ export const Adapters: Record<number, AdapterMappings> = {
|
|
|
69
84
|
[SwapSide.SELL]: [{ name: 'ArbitrumAdapter01', index: 3 }],
|
|
70
85
|
[SwapSide.BUY]: [{ name: 'ArbitrumBuyAdapter', index: 2 }],
|
|
71
86
|
},
|
|
87
|
+
[Network.BASE]: {
|
|
88
|
+
[SwapSide.SELL]: [{ name: 'BaseAdapter01', index: 1 }],
|
|
89
|
+
[SwapSide.BUY]: [{ name: 'BaseBuyAdapter', index: 1 }],
|
|
90
|
+
},
|
|
72
91
|
};
|
|
@@ -11,6 +11,105 @@ import { Network, ContractMethod, SwapSide } from '../../constants';
|
|
|
11
11
|
import { StaticJsonRpcProvider } from '@ethersproject/providers';
|
|
12
12
|
import { generateConfig } from '../../config';
|
|
13
13
|
|
|
14
|
+
function testForNetwork(
|
|
15
|
+
network: Network,
|
|
16
|
+
dexKey: string,
|
|
17
|
+
tokenASymbol: string,
|
|
18
|
+
tokenBSymbol: string,
|
|
19
|
+
tokenAAmount: string,
|
|
20
|
+
tokenBAmount: string,
|
|
21
|
+
nativeTokenAmount: string,
|
|
22
|
+
slippage?: number | undefined,
|
|
23
|
+
) {
|
|
24
|
+
const provider = new StaticJsonRpcProvider(
|
|
25
|
+
generateConfig(network).privateHttpProvider,
|
|
26
|
+
network,
|
|
27
|
+
);
|
|
28
|
+
const tokens = Tokens[network];
|
|
29
|
+
const holders = Holders[network];
|
|
30
|
+
const nativeTokenSymbol = NativeTokenSymbols[network];
|
|
31
|
+
|
|
32
|
+
const sideToContractMethods = new Map([
|
|
33
|
+
[
|
|
34
|
+
SwapSide.SELL,
|
|
35
|
+
[
|
|
36
|
+
ContractMethod.simpleSwap,
|
|
37
|
+
ContractMethod.multiSwap,
|
|
38
|
+
ContractMethod.megaSwap,
|
|
39
|
+
],
|
|
40
|
+
],
|
|
41
|
+
[
|
|
42
|
+
SwapSide.BUY,
|
|
43
|
+
[
|
|
44
|
+
ContractMethod.simpleBuy,
|
|
45
|
+
ContractMethod.buy,
|
|
46
|
+
],
|
|
47
|
+
],
|
|
48
|
+
]);
|
|
49
|
+
|
|
50
|
+
describe(`${network}`, () => {
|
|
51
|
+
sideToContractMethods.forEach((contractMethods, side) =>
|
|
52
|
+
describe(`${side}`, () => {
|
|
53
|
+
contractMethods.forEach((contractMethod: ContractMethod) => {
|
|
54
|
+
describe(`${contractMethod}`, () => {
|
|
55
|
+
it(`${nativeTokenSymbol} -> ${tokenASymbol}`, async () => {
|
|
56
|
+
await testE2E(
|
|
57
|
+
tokens[nativeTokenSymbol],
|
|
58
|
+
tokens[tokenASymbol],
|
|
59
|
+
holders[nativeTokenSymbol],
|
|
60
|
+
side === SwapSide.SELL ? nativeTokenAmount : tokenAAmount,
|
|
61
|
+
side,
|
|
62
|
+
dexKey,
|
|
63
|
+
contractMethod,
|
|
64
|
+
network,
|
|
65
|
+
provider,
|
|
66
|
+
undefined,
|
|
67
|
+
undefined,
|
|
68
|
+
undefined,
|
|
69
|
+
slippage,
|
|
70
|
+
);
|
|
71
|
+
});
|
|
72
|
+
it(`${tokenASymbol} -> ${nativeTokenSymbol}`, async () => {
|
|
73
|
+
await testE2E(
|
|
74
|
+
tokens[tokenASymbol],
|
|
75
|
+
tokens[nativeTokenSymbol],
|
|
76
|
+
holders[tokenASymbol],
|
|
77
|
+
side === SwapSide.SELL ? tokenAAmount : nativeTokenAmount,
|
|
78
|
+
side,
|
|
79
|
+
dexKey,
|
|
80
|
+
contractMethod,
|
|
81
|
+
network,
|
|
82
|
+
provider,
|
|
83
|
+
undefined,
|
|
84
|
+
undefined,
|
|
85
|
+
undefined,
|
|
86
|
+
slippage,
|
|
87
|
+
);
|
|
88
|
+
});
|
|
89
|
+
it(`${tokenASymbol} -> ${tokenBSymbol}`, async () => {
|
|
90
|
+
await testE2E(
|
|
91
|
+
tokens[tokenASymbol],
|
|
92
|
+
tokens[tokenBSymbol],
|
|
93
|
+
holders[tokenASymbol],
|
|
94
|
+
side === SwapSide.SELL ? tokenAAmount : tokenBAmount,
|
|
95
|
+
side,
|
|
96
|
+
dexKey,
|
|
97
|
+
contractMethod,
|
|
98
|
+
network,
|
|
99
|
+
provider,
|
|
100
|
+
undefined,
|
|
101
|
+
undefined,
|
|
102
|
+
undefined,
|
|
103
|
+
slippage,
|
|
104
|
+
);
|
|
105
|
+
});
|
|
106
|
+
});
|
|
107
|
+
});
|
|
108
|
+
}),
|
|
109
|
+
);
|
|
110
|
+
});
|
|
111
|
+
}
|
|
112
|
+
|
|
14
113
|
describe('PancakeswapV3 E2E', () => {
|
|
15
114
|
const dexKey = 'PancakeswapV3';
|
|
16
115
|
|
|
@@ -307,4 +406,25 @@ describe('PancakeswapV3 E2E', () => {
|
|
|
307
406
|
}),
|
|
308
407
|
);
|
|
309
408
|
});
|
|
409
|
+
|
|
410
|
+
describe('PancakeswapV3 Base', () => {
|
|
411
|
+
const network = Network.BASE;
|
|
412
|
+
|
|
413
|
+
const tokenASymbol: string = 'USDbC';
|
|
414
|
+
const tokenBSymbol: string = 'DAI';
|
|
415
|
+
|
|
416
|
+
const tokenAAmount: string = '11111000000';
|
|
417
|
+
const tokenBAmount: string = '210000000000000000';
|
|
418
|
+
const nativeTokenAmount = '110000000000000000000';
|
|
419
|
+
|
|
420
|
+
testForNetwork(
|
|
421
|
+
network,
|
|
422
|
+
dexKey,
|
|
423
|
+
tokenASymbol,
|
|
424
|
+
tokenBSymbol,
|
|
425
|
+
tokenAAmount,
|
|
426
|
+
tokenBAmount,
|
|
427
|
+
nativeTokenAmount,
|
|
428
|
+
);
|
|
429
|
+
});
|
|
310
430
|
});
|
|
@@ -608,19 +608,21 @@ export class PancakeswapV3
|
|
|
608
608
|
const balanceDestToken =
|
|
609
609
|
_destAddress === pool.token0 ? state.balance0 : state.balance1;
|
|
610
610
|
|
|
611
|
-
const unitResult =
|
|
612
|
-
|
|
613
|
-
|
|
614
|
-
|
|
615
|
-
|
|
616
|
-
|
|
617
|
-
|
|
618
|
-
const pricesResult =
|
|
619
|
-
|
|
620
|
-
|
|
621
|
-
|
|
622
|
-
|
|
623
|
-
|
|
611
|
+
const unitResult = this._getOutputs(
|
|
612
|
+
state,
|
|
613
|
+
[unitAmount],
|
|
614
|
+
zeroForOne,
|
|
615
|
+
side,
|
|
616
|
+
balanceDestToken,
|
|
617
|
+
);
|
|
618
|
+
const pricesResult = this._getOutputs(
|
|
619
|
+
state,
|
|
620
|
+
_amounts,
|
|
621
|
+
zeroForOne,
|
|
622
|
+
side,
|
|
623
|
+
balanceDestToken,
|
|
624
|
+
);
|
|
625
|
+
|
|
624
626
|
if (!pricesResult) {
|
|
625
627
|
this.logger.debug('Prices or unit is not calculated');
|
|
626
628
|
return null;
|
|
@@ -909,7 +911,7 @@ export class PancakeswapV3
|
|
|
909
911
|
return newConfig;
|
|
910
912
|
}
|
|
911
913
|
|
|
912
|
-
|
|
914
|
+
private _getOutputs(
|
|
913
915
|
state: DeepReadonly<PoolState>,
|
|
914
916
|
amounts: bigint[],
|
|
915
917
|
zeroForOne: boolean,
|
|
@@ -83,6 +83,17 @@ export const SolidlyConfig: DexConfigMap<DexParams> = {
|
|
|
83
83
|
feeCode: 0,
|
|
84
84
|
},
|
|
85
85
|
},
|
|
86
|
+
Aerodrome: {
|
|
87
|
+
[Network.BASE]: {
|
|
88
|
+
// There is no subgraph for Aerodrome
|
|
89
|
+
factoryAddress: '0x420DD381b31aEf6683db6B902084cB0FFECe40Da',
|
|
90
|
+
router: '0xDCf4EE5B700e2a5Fec458e06B763A4a3E3004494',
|
|
91
|
+
initCode:
|
|
92
|
+
'0x1a8f01f7eab324003d9388f229ea17991eee9c9d14586f429799f3656790eba0',
|
|
93
|
+
poolGasCost: 180 * 1000,
|
|
94
|
+
feeCode: 0,
|
|
95
|
+
},
|
|
96
|
+
},
|
|
86
97
|
Cone: {
|
|
87
98
|
[Network.BSC]: {
|
|
88
99
|
subgraphURL: 'https://api.thegraph.com/subgraphs/name/cone-exchange/cone',
|
|
@@ -157,6 +168,15 @@ export const SolidlyConfig: DexConfigMap<DexParams> = {
|
|
|
157
168
|
feeCode: 0,
|
|
158
169
|
poolGasCost: 180 * 1000,
|
|
159
170
|
},
|
|
171
|
+
[Network.BASE]: {
|
|
172
|
+
factoryAddress: '0xed8db60acc29e14bc867a497d94ca6e3ceb5ec04',
|
|
173
|
+
router: '0xDCf4EE5B700e2a5Fec458e06B763A4a3E3004494',
|
|
174
|
+
initCode:
|
|
175
|
+
'0x7ba31a081e879b8e7f06d4e8bf5ee26b5c2680669c5701f4cdbdcde51727b275',
|
|
176
|
+
feeCode: 0,
|
|
177
|
+
feeFactor: 1e18,
|
|
178
|
+
poolGasCost: 180 * 1000,
|
|
179
|
+
},
|
|
160
180
|
},
|
|
161
181
|
};
|
|
162
182
|
|
|
@@ -165,7 +185,7 @@ export const Adapters: Record<number, AdapterMappings> = {
|
|
|
165
185
|
[SwapSide.SELL]: [{ name: 'PolygonAdapter02', index: 3 }], // dystopia
|
|
166
186
|
},
|
|
167
187
|
[Network.FANTOM]: {
|
|
168
|
-
[SwapSide.SELL]: [{ name: 'FantomAdapter01', index: 10 }], // solidly
|
|
188
|
+
[SwapSide.SELL]: [{ name: 'FantomAdapter01', index: 10 }], // solidly, spiritSwapV2, equalizer
|
|
169
189
|
},
|
|
170
190
|
[Network.OPTIMISM]: {
|
|
171
191
|
[SwapSide.SELL]: [{ name: 'OptimismAdapter01', index: 8 }], // velodrome
|
|
@@ -182,4 +202,7 @@ export const Adapters: Record<number, AdapterMappings> = {
|
|
|
182
202
|
[Network.ARBITRUM]: {
|
|
183
203
|
[SwapSide.SELL]: [{ name: 'ArbitrumAdapter02', index: 1 }], // chronos, ramses
|
|
184
204
|
},
|
|
205
|
+
[Network.BASE]: {
|
|
206
|
+
[SwapSide.SELL]: [{ name: 'BaseAdapter01', index: 3 }], // aerodrome, equalizer
|
|
207
|
+
}
|
|
185
208
|
};
|
|
@@ -0,0 +1,57 @@
|
|
|
1
|
+
import { VelodromeV2 } from './velodromeV2';
|
|
2
|
+
import { Network, NULL_ADDRESS } from '../../../constants';
|
|
3
|
+
import { getDexKeysWithNetwork } from '../../../utils';
|
|
4
|
+
import _ from 'lodash';
|
|
5
|
+
import { SolidlyConfig } from '../config';
|
|
6
|
+
import { Token } from '../../../types';
|
|
7
|
+
import { IDexHelper } from '../../../dex-helper';
|
|
8
|
+
import AerodromeFactoryABI from '../../../abi/aerodrome/aerodrome-pool-factory.json';
|
|
9
|
+
|
|
10
|
+
export class Aerodrome extends VelodromeV2 {
|
|
11
|
+
public static dexKeysWithNetwork: { key: string; networks: Network[] }[] =
|
|
12
|
+
getDexKeysWithNetwork(_.pick(SolidlyConfig, ['Aerodrome']));
|
|
13
|
+
|
|
14
|
+
constructor(
|
|
15
|
+
protected network: Network,
|
|
16
|
+
dexKey: string,
|
|
17
|
+
protected dexHelper: IDexHelper,
|
|
18
|
+
) {
|
|
19
|
+
super(
|
|
20
|
+
network,
|
|
21
|
+
dexKey,
|
|
22
|
+
dexHelper,
|
|
23
|
+
);
|
|
24
|
+
|
|
25
|
+
this.factory = new dexHelper.web3Provider.eth.Contract(
|
|
26
|
+
AerodromeFactoryABI as any,
|
|
27
|
+
SolidlyConfig[dexKey][network].factoryAddress,
|
|
28
|
+
);
|
|
29
|
+
}
|
|
30
|
+
|
|
31
|
+
async findSolidlyPair(from: Token, to: Token, stable: boolean) {
|
|
32
|
+
if (from.address.toLowerCase() === to.address.toLowerCase()) return null;
|
|
33
|
+
const [token0, token1] =
|
|
34
|
+
from.address.toLowerCase() < to.address.toLowerCase()
|
|
35
|
+
? [from, to]
|
|
36
|
+
: [to, from];
|
|
37
|
+
|
|
38
|
+
const typePostfix = this.poolPostfix(stable);
|
|
39
|
+
const key = `${token0.address.toLowerCase()}-${token1.address.toLowerCase()}-${typePostfix}`;
|
|
40
|
+
let pair = this.pairs[key];
|
|
41
|
+
if (pair) return pair;
|
|
42
|
+
|
|
43
|
+
let exchange = await this.factory.methods
|
|
44
|
+
// Solidly has additional boolean parameter "StablePool"
|
|
45
|
+
// At first we look for uniswap-like volatile pool
|
|
46
|
+
.getPool(token0.address, token1.address, stable)
|
|
47
|
+
.call();
|
|
48
|
+
|
|
49
|
+
if (exchange === NULL_ADDRESS) {
|
|
50
|
+
pair = { token0, token1, stable };
|
|
51
|
+
} else {
|
|
52
|
+
pair = { token0, token1, exchange, stable };
|
|
53
|
+
}
|
|
54
|
+
this.pairs[key] = pair;
|
|
55
|
+
return pair;
|
|
56
|
+
}
|
|
57
|
+
}
|