@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.
Files changed (74) hide show
  1. package/build/abi/aerodrome/aerodrome-pool-factory.json +586 -0
  2. package/build/abi/api3-proxy.json +7 -0
  3. package/build/config.js +2 -2
  4. package/build/dex/algebra/algebra.js +5 -4
  5. package/build/dex/algebra/algebra.js.map +1 -1
  6. package/build/dex/balancer-v2/config.js +10 -2
  7. package/build/dex/balancer-v2/config.js.map +1 -1
  8. package/build/dex/index.js +2 -0
  9. package/build/dex/index.js.map +1 -1
  10. package/build/dex/maverick-v1/config.js +9 -0
  11. package/build/dex/maverick-v1/config.js.map +1 -1
  12. package/build/dex/maverick-v1/maverick-v1.js +11 -2
  13. package/build/dex/maverick-v1/maverick-v1.js.map +1 -1
  14. package/build/dex/pancakeswap-v3/config.js +17 -0
  15. package/build/dex/pancakeswap-v3/config.js.map +1 -1
  16. package/build/dex/pancakeswap-v3/pancakeswap-v3.js +7 -6
  17. package/build/dex/pancakeswap-v3/pancakeswap-v3.js.map +1 -1
  18. package/build/dex/quick-perps/pool.js +21 -6
  19. package/build/dex/quick-perps/pool.js.map +1 -1
  20. package/build/dex/quick-perps/quick-perps.js +34 -28
  21. package/build/dex/quick-perps/quick-perps.js.map +1 -1
  22. package/build/dex/solidly/config.js +22 -1
  23. package/build/dex/solidly/config.js.map +1 -1
  24. package/build/dex/solidly/forks-override/aerodrome.d.ts +14 -0
  25. package/build/dex/solidly/forks-override/aerodrome.js +48 -0
  26. package/build/dex/solidly/forks-override/aerodrome.js.map +1 -0
  27. package/build/dex/solidly/solidly.js +1 -0
  28. package/build/dex/solidly/solidly.js.map +1 -1
  29. package/build/dex/uniswap-v3/config.js +12 -0
  30. package/build/dex/uniswap-v3/config.js.map +1 -1
  31. package/build/dex/uniswap-v3/uniswap-v3.js +5 -4
  32. package/build/dex/uniswap-v3/uniswap-v3.js.map +1 -1
  33. package/build/dex/woo-fi-v2/config.js +13 -0
  34. package/build/dex/woo-fi-v2/config.js.map +1 -1
  35. package/build/dex-helper/dummy-dex-helper.d.ts +0 -1
  36. package/build/dex-helper/dummy-dex-helper.js +0 -3
  37. package/build/dex-helper/dummy-dex-helper.js.map +1 -1
  38. package/build/dex-helper/idex-helper.d.ts +0 -1
  39. package/build/lib/api3-feed.d.ts +4 -0
  40. package/build/lib/api3-feed.js +18 -0
  41. package/build/lib/api3-feed.js.map +1 -1
  42. package/package.json +1 -1
  43. package/src/abi/aerodrome/aerodrome-pool-factory.json +586 -0
  44. package/src/abi/api3-proxy.json +7 -0
  45. package/src/config.ts +2 -2
  46. package/src/dex/algebra/algebra.ts +10 -10
  47. package/src/dex/balancer-v2/balancer-v2-e2e.test.ts +120 -1
  48. package/src/dex/balancer-v2/config.ts +11 -2
  49. package/src/dex/index.ts +2 -0
  50. package/src/dex/maverick-v1/config.ts +10 -0
  51. package/src/dex/maverick-v1/maverick-v1-e2e.test.ts +115 -1
  52. package/src/dex/maverick-v1/maverick-v1.ts +12 -2
  53. package/src/dex/pancakeswap-v3/config.ts +19 -0
  54. package/src/dex/pancakeswap-v3/pancakeswap-v3-e2e.test.ts +114 -0
  55. package/src/dex/pancakeswap-v3/pancakeswap-v3.ts +12 -12
  56. package/src/dex/quick-perps/pool.ts +42 -7
  57. package/src/dex/quick-perps/quick-perps-events.test.ts +0 -1
  58. package/src/dex/quick-perps/quick-perps.ts +45 -35
  59. package/src/dex/solidly/config.ts +24 -1
  60. package/src/dex/solidly/forks-override/aerodrome.ts +53 -0
  61. package/src/dex/solidly/solidly-e2e.test.ts +88 -0
  62. package/src/dex/solidly/solidly-integration.test.ts +66 -0
  63. package/src/dex/solidly/solidly.ts +1 -0
  64. package/src/dex/uniswap-v3/config.ts +12 -0
  65. package/src/dex/uniswap-v3/uniswap-v3-e2e.test.ts +24 -9
  66. package/src/dex/uniswap-v3/uniswap-v3-integration.test.ts +140 -0
  67. package/src/dex/uniswap-v3/uniswap-v3.ts +10 -10
  68. package/src/dex/woo-fi-v2/config.ts +13 -0
  69. package/src/dex/woo-fi-v2/woo-fi-v2-e2e.test.ts +64 -0
  70. package/src/dex-helper/dummy-dex-helper.ts +0 -15
  71. package/src/dex-helper/idex-helper.ts +0 -7
  72. package/src/lib/api3-feed.ts +35 -0
  73. package/tests/constants-e2e.ts +30 -0
  74. 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: '0x9F77bb28e97F093Aa6CbE37cE095C18605d98Af2',
366
- BaseBuyAdapter: '0x8DE036910e34b0d8447Dd0D34C742636de1DDfEb',
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 = await this._getOutputs(
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 = await this._getOutputs(
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 async _getOutputs(
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
- ): Promise<OutputResult | null> {
809
+ ): OutputResult | null {
810
810
  try {
811
- const outputsResult = (await this.dexHelper.executeOnWorkerPool(
812
- this.network,
813
- this.dexKey,
814
- 'queryOutputs',
815
- [state, amounts, zeroForOne, side],
816
- )) as ReturnType<typeof AlgebraMath.queryOutputs>;
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 { Holders, Tokens } from '../../../tests/constants-e2e';
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('MaverickV1 MAINNET', () => {
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
- // TODO: update if there is any payload in getAdapterParam
185
- return CALLDATA_GAS_COST.DEX_NO_PAYLOAD;
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
- // Normalize once all config addresses and use across all scenarios
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 unknown error mark as failed and increase retryCount for retry init strategy
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 = await this._getOutputs(
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 = await this._getOutputs(
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 async _getOutputs(
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
- ): Promise<OutputResult | null> {
920
+ ): OutputResult | null {
921
921
  try {
922
- const outputsResult = (await this.dexHelper.executeOnWorkerPool(
923
- this.network,
924
- this.dexKey,
925
- 'queryOutputs',
926
- [state, amounts, zeroForOne, side],
927
- )) as ReturnType<typeof pancakeswapV3Math.queryOutputs>;
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) {