@paraswap/dex-lib 2.35.7-worker-pool.3 → 2.36.1
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/build/abi/aerodrome/aerodrome-pool-factory.json +586 -0
- package/build/abi/api3-proxy.json +7 -0
- package/build/config.js +2 -2
- package/build/dex/algebra/algebra.js +5 -4
- package/build/dex/algebra/algebra.js.map +1 -1
- package/build/dex/balancer-v2/config.js +10 -2
- package/build/dex/balancer-v2/config.js.map +1 -1
- 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.js +7 -6
- package/build/dex/pancakeswap-v3/pancakeswap-v3.js.map +1 -1
- package/build/dex/quick-perps/pool.js +21 -6
- package/build/dex/quick-perps/pool.js.map +1 -1
- package/build/dex/quick-perps/quick-perps.js +34 -28
- package/build/dex/quick-perps/quick-perps.js.map +1 -1
- 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/uniswap-v3/config.js +12 -0
- package/build/dex/uniswap-v3/config.js.map +1 -1
- package/build/dex/uniswap-v3/uniswap-v3.js +5 -4
- 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/build/lib/api3-feed.d.ts +4 -0
- package/build/lib/api3-feed.js +18 -0
- package/build/lib/api3-feed.js.map +1 -1
- package/package.json +1 -1
- package/src/abi/aerodrome/aerodrome-pool-factory.json +586 -0
- package/src/abi/api3-proxy.json +7 -0
- package/src/config.ts +2 -2
- package/src/dex/algebra/algebra.ts +10 -10
- package/src/dex/balancer-v2/balancer-v2-e2e.test.ts +120 -1
- package/src/dex/balancer-v2/config.ts +11 -2
- 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 +115 -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 +114 -0
- package/src/dex/pancakeswap-v3/pancakeswap-v3.ts +12 -12
- package/src/dex/quick-perps/pool.ts +42 -7
- package/src/dex/quick-perps/quick-perps-events.test.ts +0 -1
- package/src/dex/quick-perps/quick-perps.ts +45 -35
- package/src/dex/solidly/config.ts +24 -1
- package/src/dex/solidly/forks-override/aerodrome.ts +53 -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 +12 -0
- package/src/dex/uniswap-v3/uniswap-v3-e2e.test.ts +24 -9
- package/src/dex/uniswap-v3/uniswap-v3-integration.test.ts +140 -0
- package/src/dex/uniswap-v3/uniswap-v3.ts +10 -10
- 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/src/lib/api3-feed.ts +35 -0
- package/tests/constants-e2e.ts +30 -0
- package/tests/utils-e2e.ts +1 -0
package/src/config.ts
CHANGED
|
@@ -362,8 +362,8 @@ const baseConfigs: { [network: number]: BaseConfig } = {
|
|
|
362
362
|
hashFlowAuthToken: process.env.API_KEY_HASHFLOW_AUTH_TOKEN || '',
|
|
363
363
|
hashFlowDisabledMMs: [],
|
|
364
364
|
adapterAddresses: {
|
|
365
|
-
BaseAdapter01: '
|
|
366
|
-
BaseBuyAdapter: '
|
|
365
|
+
BaseAdapter01: '0x30F6B9b6485ff0B67E881f5ac80D3F1c70A4B23d',
|
|
366
|
+
BaseBuyAdapter: '0xB11bCA7B01b425afD0743A4D77B4f593883f94C0',
|
|
367
367
|
},
|
|
368
368
|
uniswapV2ExchangeRouterAddress:
|
|
369
369
|
'0x75d199EfB540e47D27D52c62Da3E7daC2B9e834F',
|
|
@@ -527,14 +527,14 @@ export class Algebra extends SimpleExchange implements IDex<AlgebraData> {
|
|
|
527
527
|
const balanceDestToken =
|
|
528
528
|
_destAddress === pool.token0 ? state.balance0 : state.balance1;
|
|
529
529
|
|
|
530
|
-
const unitResult =
|
|
530
|
+
const unitResult = this._getOutputs(
|
|
531
531
|
state,
|
|
532
532
|
[unitAmount],
|
|
533
533
|
zeroForOne,
|
|
534
534
|
side,
|
|
535
535
|
balanceDestToken,
|
|
536
536
|
);
|
|
537
|
-
const pricesResult =
|
|
537
|
+
const pricesResult = this._getOutputs(
|
|
538
538
|
state,
|
|
539
539
|
_amounts,
|
|
540
540
|
zeroForOne,
|
|
@@ -800,20 +800,20 @@ export class Algebra extends SimpleExchange implements IDex<AlgebraData> {
|
|
|
800
800
|
return newConfig;
|
|
801
801
|
}
|
|
802
802
|
|
|
803
|
-
private
|
|
803
|
+
private _getOutputs(
|
|
804
804
|
state: DeepReadonly<IAlgebraPoolState>,
|
|
805
805
|
amounts: bigint[],
|
|
806
806
|
zeroForOne: boolean,
|
|
807
807
|
side: SwapSide,
|
|
808
808
|
destTokenBalance: bigint,
|
|
809
|
-
):
|
|
809
|
+
): OutputResult | null {
|
|
810
810
|
try {
|
|
811
|
-
const outputsResult =
|
|
812
|
-
|
|
813
|
-
|
|
814
|
-
|
|
815
|
-
|
|
816
|
-
)
|
|
811
|
+
const outputsResult = AlgebraMath.queryOutputs(
|
|
812
|
+
state,
|
|
813
|
+
amounts,
|
|
814
|
+
zeroForOne,
|
|
815
|
+
side,
|
|
816
|
+
);
|
|
817
817
|
|
|
818
818
|
if (side === SwapSide.SELL) {
|
|
819
819
|
if (outputsResult.outputs[0] > destTokenBalance) {
|
|
@@ -2,7 +2,11 @@ import dotenv from 'dotenv';
|
|
|
2
2
|
dotenv.config();
|
|
3
3
|
|
|
4
4
|
import { testE2E } from '../../../tests/utils-e2e';
|
|
5
|
-
import {
|
|
5
|
+
import {
|
|
6
|
+
Holders,
|
|
7
|
+
NativeTokenSymbols,
|
|
8
|
+
Tokens,
|
|
9
|
+
} from '../../../tests/constants-e2e';
|
|
6
10
|
import { ContractMethod, Network, SwapSide } from '../../constants';
|
|
7
11
|
import { StaticJsonRpcProvider } from '@ethersproject/providers';
|
|
8
12
|
|
|
@@ -10,6 +14,99 @@ import { generateConfig } from '../../config';
|
|
|
10
14
|
|
|
11
15
|
jest.setTimeout(50 * 1000);
|
|
12
16
|
|
|
17
|
+
function testForNetwork(
|
|
18
|
+
network: Network,
|
|
19
|
+
dexKey: string,
|
|
20
|
+
tokenASymbol: string,
|
|
21
|
+
tokenBSymbol: string,
|
|
22
|
+
tokenAAmount: string,
|
|
23
|
+
tokenBAmount: string,
|
|
24
|
+
nativeTokenAmount: string,
|
|
25
|
+
slippage?: number | undefined,
|
|
26
|
+
) {
|
|
27
|
+
const provider = new StaticJsonRpcProvider(
|
|
28
|
+
generateConfig(network).privateHttpProvider,
|
|
29
|
+
network,
|
|
30
|
+
);
|
|
31
|
+
const tokens = Tokens[network];
|
|
32
|
+
const holders = Holders[network];
|
|
33
|
+
const nativeTokenSymbol = NativeTokenSymbols[network];
|
|
34
|
+
|
|
35
|
+
const sideToContractMethods = new Map([
|
|
36
|
+
[
|
|
37
|
+
SwapSide.SELL,
|
|
38
|
+
[
|
|
39
|
+
ContractMethod.simpleSwap,
|
|
40
|
+
ContractMethod.multiSwap,
|
|
41
|
+
ContractMethod.megaSwap,
|
|
42
|
+
],
|
|
43
|
+
],
|
|
44
|
+
[SwapSide.BUY, [ContractMethod.simpleBuy, ContractMethod.buy]],
|
|
45
|
+
]);
|
|
46
|
+
|
|
47
|
+
describe(`${network}`, () => {
|
|
48
|
+
sideToContractMethods.forEach((contractMethods, side) =>
|
|
49
|
+
describe(`${side}`, () => {
|
|
50
|
+
contractMethods.forEach((contractMethod: ContractMethod) => {
|
|
51
|
+
describe(`${contractMethod}`, () => {
|
|
52
|
+
it(`${nativeTokenSymbol} -> ${tokenASymbol}`, async () => {
|
|
53
|
+
await testE2E(
|
|
54
|
+
tokens[nativeTokenSymbol],
|
|
55
|
+
tokens[tokenASymbol],
|
|
56
|
+
holders[nativeTokenSymbol],
|
|
57
|
+
side === SwapSide.SELL ? nativeTokenAmount : tokenAAmount,
|
|
58
|
+
side,
|
|
59
|
+
dexKey,
|
|
60
|
+
contractMethod,
|
|
61
|
+
network,
|
|
62
|
+
provider,
|
|
63
|
+
undefined,
|
|
64
|
+
undefined,
|
|
65
|
+
undefined,
|
|
66
|
+
slippage,
|
|
67
|
+
);
|
|
68
|
+
});
|
|
69
|
+
it(`${tokenASymbol} -> ${nativeTokenSymbol}`, async () => {
|
|
70
|
+
await testE2E(
|
|
71
|
+
tokens[tokenASymbol],
|
|
72
|
+
tokens[nativeTokenSymbol],
|
|
73
|
+
holders[tokenASymbol],
|
|
74
|
+
side === SwapSide.SELL ? tokenAAmount : nativeTokenAmount,
|
|
75
|
+
side,
|
|
76
|
+
dexKey,
|
|
77
|
+
contractMethod,
|
|
78
|
+
network,
|
|
79
|
+
provider,
|
|
80
|
+
undefined,
|
|
81
|
+
undefined,
|
|
82
|
+
undefined,
|
|
83
|
+
slippage,
|
|
84
|
+
);
|
|
85
|
+
});
|
|
86
|
+
it(`${tokenASymbol} -> ${tokenBSymbol}`, async () => {
|
|
87
|
+
await testE2E(
|
|
88
|
+
tokens[tokenASymbol],
|
|
89
|
+
tokens[tokenBSymbol],
|
|
90
|
+
holders[tokenASymbol],
|
|
91
|
+
side === SwapSide.SELL ? tokenAAmount : tokenBAmount,
|
|
92
|
+
side,
|
|
93
|
+
dexKey,
|
|
94
|
+
contractMethod,
|
|
95
|
+
network,
|
|
96
|
+
provider,
|
|
97
|
+
undefined,
|
|
98
|
+
undefined,
|
|
99
|
+
undefined,
|
|
100
|
+
slippage,
|
|
101
|
+
);
|
|
102
|
+
});
|
|
103
|
+
});
|
|
104
|
+
});
|
|
105
|
+
}),
|
|
106
|
+
);
|
|
107
|
+
});
|
|
108
|
+
}
|
|
109
|
+
|
|
13
110
|
describe('BalancerV2 E2E', () => {
|
|
14
111
|
describe('BalancerV2 MAINNET', () => {
|
|
15
112
|
const dexKey = 'BalancerV2';
|
|
@@ -1195,6 +1292,28 @@ describe('BalancerV2 E2E', () => {
|
|
|
1195
1292
|
});
|
|
1196
1293
|
});
|
|
1197
1294
|
|
|
1295
|
+
describe('BalancerV2 Base', () => {
|
|
1296
|
+
const dexKey = 'BalancerV2';
|
|
1297
|
+
const network = Network.BASE;
|
|
1298
|
+
|
|
1299
|
+
const tokenASymbol: string = 'USDC';
|
|
1300
|
+
const tokenBSymbol: string = 'GOLD';
|
|
1301
|
+
|
|
1302
|
+
const tokenAAmount: string = '11110010';
|
|
1303
|
+
const tokenBAmount: string = '210000000000000000000';
|
|
1304
|
+
const nativeTokenAmount = '1000000000000000000';
|
|
1305
|
+
|
|
1306
|
+
testForNetwork(
|
|
1307
|
+
network,
|
|
1308
|
+
dexKey,
|
|
1309
|
+
tokenASymbol,
|
|
1310
|
+
tokenBSymbol,
|
|
1311
|
+
tokenAAmount,
|
|
1312
|
+
tokenBAmount,
|
|
1313
|
+
nativeTokenAmount,
|
|
1314
|
+
);
|
|
1315
|
+
});
|
|
1316
|
+
|
|
1198
1317
|
describe('BeetsFi OPTIMISM', () => {
|
|
1199
1318
|
const dexKey = 'BeetsFi';
|
|
1200
1319
|
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 }],
|
|
74
|
-
}
|
|
79
|
+
},
|
|
80
|
+
[Network.BASE]: {
|
|
81
|
+
[SwapSide.SELL]: [{ name: 'BaseAdapter01', index: 4 }],
|
|
82
|
+
[SwapSide.BUY]: [{ name: 'BaseBuyAdapter', index: 3 }],
|
|
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,103 @@ 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
|
+
[SwapSide.BUY, [ContractMethod.simpleBuy, ContractMethod.buy]],
|
|
42
|
+
]);
|
|
43
|
+
|
|
44
|
+
describe(`${network}`, () => {
|
|
45
|
+
sideToContractMethods.forEach((contractMethods, side) =>
|
|
46
|
+
describe(`${side}`, () => {
|
|
47
|
+
contractMethods.forEach((contractMethod: ContractMethod) => {
|
|
48
|
+
describe(`${contractMethod}`, () => {
|
|
49
|
+
it(`${nativeTokenSymbol} -> ${tokenASymbol}`, async () => {
|
|
50
|
+
await testE2E(
|
|
51
|
+
tokens[nativeTokenSymbol],
|
|
52
|
+
tokens[tokenASymbol],
|
|
53
|
+
holders[nativeTokenSymbol],
|
|
54
|
+
side === SwapSide.SELL ? nativeTokenAmount : tokenAAmount,
|
|
55
|
+
side,
|
|
56
|
+
dexKey,
|
|
57
|
+
contractMethod,
|
|
58
|
+
network,
|
|
59
|
+
provider,
|
|
60
|
+
undefined,
|
|
61
|
+
undefined,
|
|
62
|
+
undefined,
|
|
63
|
+
slippage,
|
|
64
|
+
);
|
|
65
|
+
});
|
|
66
|
+
it(`${tokenASymbol} -> ${nativeTokenSymbol}`, async () => {
|
|
67
|
+
await testE2E(
|
|
68
|
+
tokens[tokenASymbol],
|
|
69
|
+
tokens[nativeTokenSymbol],
|
|
70
|
+
holders[tokenASymbol],
|
|
71
|
+
side === SwapSide.SELL ? tokenAAmount : nativeTokenAmount,
|
|
72
|
+
side,
|
|
73
|
+
dexKey,
|
|
74
|
+
contractMethod,
|
|
75
|
+
network,
|
|
76
|
+
provider,
|
|
77
|
+
undefined,
|
|
78
|
+
undefined,
|
|
79
|
+
undefined,
|
|
80
|
+
slippage,
|
|
81
|
+
);
|
|
82
|
+
});
|
|
83
|
+
it(`${tokenASymbol} -> ${tokenBSymbol}`, async () => {
|
|
84
|
+
await testE2E(
|
|
85
|
+
tokens[tokenASymbol],
|
|
86
|
+
tokens[tokenBSymbol],
|
|
87
|
+
holders[tokenASymbol],
|
|
88
|
+
side === SwapSide.SELL ? tokenAAmount : tokenBAmount,
|
|
89
|
+
side,
|
|
90
|
+
dexKey,
|
|
91
|
+
contractMethod,
|
|
92
|
+
network,
|
|
93
|
+
provider,
|
|
94
|
+
undefined,
|
|
95
|
+
undefined,
|
|
96
|
+
undefined,
|
|
97
|
+
slippage,
|
|
98
|
+
);
|
|
99
|
+
});
|
|
100
|
+
});
|
|
101
|
+
});
|
|
102
|
+
}),
|
|
103
|
+
);
|
|
104
|
+
});
|
|
105
|
+
}
|
|
106
|
+
|
|
14
107
|
describe('MaverickV1 E2E', () => {
|
|
15
108
|
const dexKey = 'MaverickV1';
|
|
16
109
|
|
|
17
|
-
describe('
|
|
110
|
+
describe('MAINNET', () => {
|
|
18
111
|
const network = Network.MAINNET;
|
|
19
112
|
const tokens = Tokens[network];
|
|
20
113
|
const holders = Holders[network];
|
|
@@ -121,4 +214,25 @@ describe('MaverickV1 E2E', () => {
|
|
|
121
214
|
);
|
|
122
215
|
});
|
|
123
216
|
});
|
|
217
|
+
|
|
218
|
+
describe('BASE', () => {
|
|
219
|
+
const network = Network.BASE;
|
|
220
|
+
|
|
221
|
+
const tokenASymbol: string = 'USDbC';
|
|
222
|
+
const tokenBSymbol: string = 'MAV';
|
|
223
|
+
|
|
224
|
+
const tokenAAmount: string = '1111100000';
|
|
225
|
+
const tokenBAmount: string = '1100000000000000000';
|
|
226
|
+
const nativeTokenAmount = '100000000000000000';
|
|
227
|
+
|
|
228
|
+
testForNetwork(
|
|
229
|
+
network,
|
|
230
|
+
dexKey,
|
|
231
|
+
tokenASymbol,
|
|
232
|
+
tokenBSymbol,
|
|
233
|
+
tokenAAmount,
|
|
234
|
+
tokenBAmount,
|
|
235
|
+
nativeTokenAmount,
|
|
236
|
+
);
|
|
237
|
+
});
|
|
124
238
|
});
|
|
@@ -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,99 @@ 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
|
+
[SwapSide.BUY, [ContractMethod.simpleBuy, ContractMethod.buy]],
|
|
42
|
+
]);
|
|
43
|
+
|
|
44
|
+
describe(`${network}`, () => {
|
|
45
|
+
sideToContractMethods.forEach((contractMethods, side) =>
|
|
46
|
+
describe(`${side}`, () => {
|
|
47
|
+
contractMethods.forEach((contractMethod: ContractMethod) => {
|
|
48
|
+
describe(`${contractMethod}`, () => {
|
|
49
|
+
it(`${nativeTokenSymbol} -> ${tokenASymbol}`, async () => {
|
|
50
|
+
await testE2E(
|
|
51
|
+
tokens[nativeTokenSymbol],
|
|
52
|
+
tokens[tokenASymbol],
|
|
53
|
+
holders[nativeTokenSymbol],
|
|
54
|
+
side === SwapSide.SELL ? nativeTokenAmount : tokenAAmount,
|
|
55
|
+
side,
|
|
56
|
+
dexKey,
|
|
57
|
+
contractMethod,
|
|
58
|
+
network,
|
|
59
|
+
provider,
|
|
60
|
+
undefined,
|
|
61
|
+
undefined,
|
|
62
|
+
undefined,
|
|
63
|
+
slippage,
|
|
64
|
+
);
|
|
65
|
+
});
|
|
66
|
+
it(`${tokenASymbol} -> ${nativeTokenSymbol}`, async () => {
|
|
67
|
+
await testE2E(
|
|
68
|
+
tokens[tokenASymbol],
|
|
69
|
+
tokens[nativeTokenSymbol],
|
|
70
|
+
holders[tokenASymbol],
|
|
71
|
+
side === SwapSide.SELL ? tokenAAmount : nativeTokenAmount,
|
|
72
|
+
side,
|
|
73
|
+
dexKey,
|
|
74
|
+
contractMethod,
|
|
75
|
+
network,
|
|
76
|
+
provider,
|
|
77
|
+
undefined,
|
|
78
|
+
undefined,
|
|
79
|
+
undefined,
|
|
80
|
+
slippage,
|
|
81
|
+
);
|
|
82
|
+
});
|
|
83
|
+
it(`${tokenASymbol} -> ${tokenBSymbol}`, async () => {
|
|
84
|
+
await testE2E(
|
|
85
|
+
tokens[tokenASymbol],
|
|
86
|
+
tokens[tokenBSymbol],
|
|
87
|
+
holders[tokenASymbol],
|
|
88
|
+
side === SwapSide.SELL ? tokenAAmount : tokenBAmount,
|
|
89
|
+
side,
|
|
90
|
+
dexKey,
|
|
91
|
+
contractMethod,
|
|
92
|
+
network,
|
|
93
|
+
provider,
|
|
94
|
+
undefined,
|
|
95
|
+
undefined,
|
|
96
|
+
undefined,
|
|
97
|
+
slippage,
|
|
98
|
+
);
|
|
99
|
+
});
|
|
100
|
+
});
|
|
101
|
+
});
|
|
102
|
+
}),
|
|
103
|
+
);
|
|
104
|
+
});
|
|
105
|
+
}
|
|
106
|
+
|
|
14
107
|
describe('PancakeswapV3 E2E', () => {
|
|
15
108
|
const dexKey = 'PancakeswapV3';
|
|
16
109
|
|
|
@@ -307,4 +400,25 @@ describe('PancakeswapV3 E2E', () => {
|
|
|
307
400
|
}),
|
|
308
401
|
);
|
|
309
402
|
});
|
|
403
|
+
|
|
404
|
+
describe('PancakeswapV3 Base', () => {
|
|
405
|
+
const network = Network.BASE;
|
|
406
|
+
|
|
407
|
+
const tokenASymbol: string = 'USDbC';
|
|
408
|
+
const tokenBSymbol: string = 'DAI';
|
|
409
|
+
|
|
410
|
+
const tokenAAmount: string = '11111000000';
|
|
411
|
+
const tokenBAmount: string = '210000000000000000';
|
|
412
|
+
const nativeTokenAmount = '110000000000000000000';
|
|
413
|
+
|
|
414
|
+
testForNetwork(
|
|
415
|
+
network,
|
|
416
|
+
dexKey,
|
|
417
|
+
tokenASymbol,
|
|
418
|
+
tokenBSymbol,
|
|
419
|
+
tokenAAmount,
|
|
420
|
+
tokenBAmount,
|
|
421
|
+
nativeTokenAmount,
|
|
422
|
+
);
|
|
423
|
+
});
|
|
310
424
|
});
|
|
@@ -112,7 +112,7 @@ export class PancakeswapV3
|
|
|
112
112
|
// To receive revert reasons
|
|
113
113
|
this.dexHelper.web3Provider.eth.handleRevert = false;
|
|
114
114
|
|
|
115
|
-
//
|
|
115
|
+
// Normalise once all config addresses and use across all scenarios
|
|
116
116
|
this.config = this._toLowerForAllConfigAddresses();
|
|
117
117
|
|
|
118
118
|
this.notExistingPoolSetKey =
|
|
@@ -253,7 +253,7 @@ export class PancakeswapV3
|
|
|
253
253
|
e,
|
|
254
254
|
);
|
|
255
255
|
} else {
|
|
256
|
-
// on
|
|
256
|
+
// on unkown error mark as failed and increase retryCount for retry init strategy
|
|
257
257
|
// note: state would be null by default which allows to fallback
|
|
258
258
|
this.logger.warn(
|
|
259
259
|
`${this.dexKey}: Can not generate pool state for srcAddress=${srcAddress}, destAddress=${destAddress}, fee=${fee} pool fallback to rpc and retry every ${this.config.initRetryFrequency} times, initRetryAttemptCount=${pool.initRetryAttemptCount}`,
|
|
@@ -608,14 +608,14 @@ export class PancakeswapV3
|
|
|
608
608
|
const balanceDestToken =
|
|
609
609
|
_destAddress === pool.token0 ? state.balance0 : state.balance1;
|
|
610
610
|
|
|
611
|
-
const unitResult =
|
|
611
|
+
const unitResult = this._getOutputs(
|
|
612
612
|
state,
|
|
613
613
|
[unitAmount],
|
|
614
614
|
zeroForOne,
|
|
615
615
|
side,
|
|
616
616
|
balanceDestToken,
|
|
617
617
|
);
|
|
618
|
-
const pricesResult =
|
|
618
|
+
const pricesResult = this._getOutputs(
|
|
619
619
|
state,
|
|
620
620
|
_amounts,
|
|
621
621
|
zeroForOne,
|
|
@@ -911,20 +911,20 @@ export class PancakeswapV3
|
|
|
911
911
|
return newConfig;
|
|
912
912
|
}
|
|
913
913
|
|
|
914
|
-
private
|
|
914
|
+
private _getOutputs(
|
|
915
915
|
state: DeepReadonly<PoolState>,
|
|
916
916
|
amounts: bigint[],
|
|
917
917
|
zeroForOne: boolean,
|
|
918
918
|
side: SwapSide,
|
|
919
919
|
destTokenBalance: bigint,
|
|
920
|
-
):
|
|
920
|
+
): OutputResult | null {
|
|
921
921
|
try {
|
|
922
|
-
const outputsResult =
|
|
923
|
-
|
|
924
|
-
|
|
925
|
-
|
|
926
|
-
|
|
927
|
-
)
|
|
922
|
+
const outputsResult = pancakeswapV3Math.queryOutputs(
|
|
923
|
+
state,
|
|
924
|
+
amounts,
|
|
925
|
+
zeroForOne,
|
|
926
|
+
side,
|
|
927
|
+
);
|
|
928
928
|
|
|
929
929
|
if (side === SwapSide.SELL) {
|
|
930
930
|
if (outputsResult.outputs[0] > destTokenBalance) {
|