@paraswap/dex-lib 3.9.1 → 3.9.2-bebop.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 (34) hide show
  1. package/build/config.js +5 -0
  2. package/build/config.js.map +1 -1
  3. package/build/dex/bebop/bebop.d.ts +0 -1
  4. package/build/dex/bebop/bebop.js +37 -21
  5. package/build/dex/bebop/bebop.js.map +1 -1
  6. package/build/dex/bebop/constants.d.ts +4 -0
  7. package/build/dex/bebop/constants.js +5 -1
  8. package/build/dex/bebop/constants.js.map +1 -1
  9. package/build/dex/index.js +2 -0
  10. package/build/dex/index.js.map +1 -1
  11. package/build/executor/Executor01BytecodeBuilder.js +3 -2
  12. package/build/executor/Executor01BytecodeBuilder.js.map +1 -1
  13. package/build/executor/Executor02BytecodeBuilder.js +3 -2
  14. package/build/executor/Executor02BytecodeBuilder.js.map +1 -1
  15. package/build/executor/Executor03BytecodeBuilder.js +3 -2
  16. package/build/executor/Executor03BytecodeBuilder.js.map +1 -1
  17. package/build/types.d.ts +1 -0
  18. package/package.json +4 -2
  19. package/src/abi/bebop/BebopSettlement.abi.json +2137 -0
  20. package/src/config.ts +6 -0
  21. package/src/dex/bebop/bebop-e2e.test.ts +195 -0
  22. package/src/dex/bebop/bebop-integration.test.ts +170 -0
  23. package/src/dex/bebop/bebop.ts +865 -0
  24. package/src/dex/bebop/config.ts +37 -0
  25. package/src/dex/bebop/constants.ts +21 -0
  26. package/src/dex/bebop/rate-fetcher.ts +138 -0
  27. package/src/dex/bebop/types.ts +90 -0
  28. package/src/dex/bebop/validators.ts +29 -0
  29. package/src/dex/index.ts +2 -0
  30. package/src/executor/Executor01BytecodeBuilder.ts +3 -2
  31. package/src/executor/Executor02BytecodeBuilder.ts +3 -2
  32. package/src/executor/Executor03BytecodeBuilder.ts +3 -2
  33. package/src/lib/fetcher/wsFetcher.ts +145 -0
  34. package/src/types.ts +1 -0
package/src/config.ts CHANGED
@@ -34,6 +34,7 @@ type BaseConfig = {
34
34
  idleDaoAuthToken?: string;
35
35
  swaapV2AuthToken?: string;
36
36
  dexalotAuthToken?: string;
37
+ bebopAuthToken?: string;
37
38
  forceRpcFallbackDexs: string[];
38
39
  };
39
40
 
@@ -73,6 +74,7 @@ const baseConfigs: { [network: number]: BaseConfig } = {
73
74
  rpcPollingBlocksBackToTriggerUpdate: 0,
74
75
  swaapV2AuthToken: process.env.API_KEY_SWAAP_V2_AUTH_TOKEN || '',
75
76
  hashFlowAuthToken: process.env.API_KEY_HASHFLOW_AUTH_TOKEN || '',
77
+ bebopAuthToken: process.env.API_KEY_BEBOP_AUTH_TOKEN || '',
76
78
  idleDaoAuthToken: process.env.API_KEY_IDLEDAO_AUTH_TOKEN || '',
77
79
  hashFlowDisabledMMs:
78
80
  process.env[`HASHFLOW_DISABLED_MMS_1`]?.split(',') || [],
@@ -297,6 +299,7 @@ const baseConfigs: { [network: number]: BaseConfig } = {
297
299
  Executor03: '0xe009F00e200A090090fC70e02d70B232000c0802',
298
300
  },
299
301
  dexalotAuthToken: process.env.API_KEY_DEXALOT_AUTH_TOKEN || '',
302
+ bebopAuthToken: process.env.API_KEY_BEBOP_AUTH_TOKEN || '',
300
303
  adapterAddresses: {
301
304
  ArbitrumAdapter01: '0x369A2FDb910d432f0a07381a5E3d27572c876713',
302
305
  ArbitrumAdapter02: '0x58a5f0b73969800FAFf8556cD2187E3FCE71A6cb',
@@ -343,6 +346,7 @@ const baseConfigs: { [network: number]: BaseConfig } = {
343
346
  uniswapV2ExchangeRouterAddress:
344
347
  '0xB41dD984730dAf82f5C41489E21ac79D5e3B61bC',
345
348
  uniswapV3EventLoggingSampleRate: 0,
349
+ bebopAuthToken: process.env.API_KEY_BEBOP_AUTH_TOKEN || '',
346
350
  rfqConfigs: {},
347
351
  rpcPollingMaxAllowedStateDelayInBlocks: 5,
348
352
  rpcPollingBlocksBackToTriggerUpdate: 3,
@@ -397,6 +401,7 @@ const baseConfigs: { [network: number]: BaseConfig } = {
397
401
  multicallV2Address: '0xeDF6D2a16e8081F777eB623EeB4411466556aF3d',
398
402
  privateHttpProvider: process.env.HTTP_PROVIDER_8453,
399
403
  dexalotAuthToken: process.env.API_KEY_DEXALOT_AUTH_TOKEN || '',
404
+ bebopAuthToken: process.env.API_KEY_BEBOP_AUTH_TOKEN || '',
400
405
  hashFlowAuthToken: process.env.API_KEY_HASHFLOW_AUTH_TOKEN || '',
401
406
  swaapV2AuthToken: process.env.API_KEY_SWAAP_V2_AUTH_TOKEN || '',
402
407
  hashFlowDisabledMMs: [],
@@ -464,6 +469,7 @@ export function generateConfig(network: number): Config {
464
469
  idleDaoAuthToken: baseConfig.idleDaoAuthToken,
465
470
  swaapV2AuthToken: baseConfig.swaapV2AuthToken,
466
471
  dexalotAuthToken: baseConfig.dexalotAuthToken,
472
+ bebopAuthToken: baseConfig.bebopAuthToken,
467
473
  hashFlowDisabledMMs: baseConfig.hashFlowDisabledMMs,
468
474
  forceRpcFallbackDexs: baseConfig.forceRpcFallbackDexs,
469
475
  apiKeyTheGraph: process.env.API_KEY_THE_GRAPH || '',
@@ -0,0 +1,195 @@
1
+ /* eslint-disable no-console */
2
+ import dotenv from 'dotenv';
3
+ dotenv.config();
4
+
5
+ import { testE2E } from '../../../tests/utils-e2e';
6
+ import {
7
+ Tokens,
8
+ Holders,
9
+ NativeTokenSymbols,
10
+ } from '../../../tests/constants-e2e';
11
+ import { Network, ContractMethod, SwapSide } from '../../constants';
12
+ import { StaticJsonRpcProvider } from '@ethersproject/providers';
13
+ import { generateConfig } from '../../config';
14
+
15
+ function testForNetwork(
16
+ network: Network,
17
+ dexKey: string,
18
+ tokenASymbol: string,
19
+ tokenBSymbol: string,
20
+ tokenAAmount: string,
21
+ tokenBAmount: string,
22
+ nativeTokenAmount: string,
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
+ [SwapSide.SELL, [ContractMethod.swapExactAmountIn]],
34
+ [SwapSide.BUY, [ContractMethod.swapExactAmountOut]],
35
+ ]);
36
+
37
+ describe(`${network}`, () => {
38
+ sideToContractMethods.forEach((contractMethods, side) =>
39
+ describe(`${side}`, () => {
40
+ contractMethods.forEach((contractMethod: ContractMethod) => {
41
+ describe(`${contractMethod}`, () => {
42
+ it(`${nativeTokenSymbol} -> ${tokenASymbol}`, async () => {
43
+ await testE2E(
44
+ tokens[nativeTokenSymbol],
45
+ tokens[tokenASymbol],
46
+ holders[nativeTokenSymbol],
47
+ side === SwapSide.SELL ? nativeTokenAmount : tokenAAmount,
48
+ side,
49
+ dexKey,
50
+ contractMethod,
51
+ network,
52
+ provider,
53
+ );
54
+ });
55
+ it(`${tokenASymbol} -> ${nativeTokenSymbol}`, async () => {
56
+ await testE2E(
57
+ tokens[tokenASymbol],
58
+ tokens[nativeTokenSymbol],
59
+ holders[tokenASymbol],
60
+ side === SwapSide.SELL ? tokenAAmount : nativeTokenAmount,
61
+ side,
62
+ dexKey,
63
+ contractMethod,
64
+ network,
65
+ provider,
66
+ );
67
+ });
68
+ it(`${tokenASymbol} -> ${tokenBSymbol}`, async () => {
69
+ await testE2E(
70
+ tokens[tokenASymbol],
71
+ tokens[tokenBSymbol],
72
+ holders[tokenASymbol],
73
+ side === SwapSide.SELL ? tokenAAmount : tokenBAmount,
74
+ side,
75
+ dexKey,
76
+ contractMethod,
77
+ network,
78
+ provider,
79
+ );
80
+ });
81
+ });
82
+ });
83
+ }),
84
+ );
85
+ });
86
+ }
87
+
88
+ describe('Bebop E2E', () => {
89
+ const dexKey = 'Bebop';
90
+
91
+ describe('Mainnetx', () => {
92
+ const network = Network.MAINNET;
93
+
94
+ const tokenASymbol: string = 'USDC';
95
+ const tokenBSymbol: string = 'WETH';
96
+
97
+ const tokenAAmount: string = '1000000000';
98
+ const tokenBAmount: string = '1000000000000000000';
99
+ const nativeTokenAmount = '1000000000000000000';
100
+
101
+ testForNetwork(
102
+ network,
103
+ dexKey,
104
+ tokenASymbol,
105
+ tokenBSymbol,
106
+ tokenAAmount,
107
+ tokenBAmount,
108
+ nativeTokenAmount,
109
+ );
110
+ });
111
+
112
+ describe('Mainnet Alt Pair', () => {
113
+ const network = Network.MAINNET;
114
+
115
+ const tokenASymbol: string = 'WBTC';
116
+ const tokenBSymbol: string = 'WETH';
117
+
118
+ const tokenAAmount: string = '10000000';
119
+ const tokenBAmount: string = '1000000000000000000';
120
+ const nativeTokenAmount = '1000000000000000000';
121
+
122
+ testForNetwork(
123
+ network,
124
+ dexKey,
125
+ tokenASymbol,
126
+ tokenBSymbol,
127
+ tokenAAmount,
128
+ tokenBAmount,
129
+ nativeTokenAmount,
130
+ );
131
+ });
132
+
133
+ describe('Arbitrum', () => {
134
+ const network = Network.ARBITRUM;
135
+
136
+ const tokenASymbol: string = 'USDC';
137
+ const tokenBSymbol: string = 'WETH';
138
+
139
+ const tokenAAmount: string = '1000000000';
140
+ const tokenBAmount: string = '1000000000000000000';
141
+ const nativeTokenAmount = '1000000000000000000';
142
+
143
+ testForNetwork(
144
+ network,
145
+ dexKey,
146
+ tokenASymbol,
147
+ tokenBSymbol,
148
+ tokenAAmount,
149
+ tokenBAmount,
150
+ nativeTokenAmount,
151
+ );
152
+ });
153
+
154
+ describe('Base', () => {
155
+ const network = Network.BASE;
156
+
157
+ const tokenASymbol: string = 'USDbC';
158
+ const tokenBSymbol: string = 'WETH';
159
+
160
+ const tokenAAmount: string = '1000000000';
161
+ const tokenBAmount: string = '1000000000000000000';
162
+ const nativeTokenAmount = '1000000000000000000';
163
+
164
+ testForNetwork(
165
+ network,
166
+ dexKey,
167
+ tokenASymbol,
168
+ tokenBSymbol,
169
+ tokenAAmount,
170
+ tokenBAmount,
171
+ nativeTokenAmount,
172
+ );
173
+ });
174
+
175
+ describe('Optimism', () => {
176
+ const network = Network.OPTIMISM;
177
+
178
+ const tokenASymbol: string = 'USDT';
179
+ const tokenBSymbol: string = 'WETH';
180
+
181
+ const tokenAAmount: string = '1000000000';
182
+ const tokenBAmount: string = '1000000000000000000';
183
+ const nativeTokenAmount = '1000000000000000000';
184
+
185
+ testForNetwork(
186
+ network,
187
+ dexKey,
188
+ tokenASymbol,
189
+ tokenBSymbol,
190
+ tokenAAmount,
191
+ tokenBAmount,
192
+ nativeTokenAmount,
193
+ );
194
+ });
195
+ });
@@ -0,0 +1,170 @@
1
+ /* eslint-disable no-console */
2
+ import dotenv from 'dotenv';
3
+ dotenv.config();
4
+
5
+ import { Interface, Result } from '@ethersproject/abi';
6
+ import { DummyDexHelper } from '../../dex-helper/index';
7
+ import { Network, SwapSide } from '../../constants';
8
+ import { BI_POWS } from '../../bigint-constants';
9
+ import { Bebop } from './bebop';
10
+ import {
11
+ checkPoolPrices,
12
+ checkPoolsLiquidity,
13
+ checkConstantPoolPrices,
14
+ } from '../../../tests/utils';
15
+ import { Tokens } from '../../../tests/constants-e2e';
16
+
17
+ async function testPricingOnNetwork(
18
+ bebop: Bebop,
19
+ network: Network,
20
+ dexKey: string,
21
+ blockNumber: number,
22
+ srcTokenSymbol: string,
23
+ destTokenSymbol: string,
24
+ side: SwapSide,
25
+ amounts: bigint[],
26
+ ) {
27
+ const networkTokens = Tokens[network];
28
+
29
+ const pools = await bebop.getPoolIdentifiers(
30
+ networkTokens[srcTokenSymbol],
31
+ networkTokens[destTokenSymbol],
32
+ side,
33
+ blockNumber,
34
+ );
35
+ console.log(
36
+ `${srcTokenSymbol} <> ${destTokenSymbol} Pool Identifiers: `,
37
+ pools,
38
+ );
39
+
40
+ expect(pools.length).toBeGreaterThan(0);
41
+
42
+ const poolPrices = await bebop.getPricesVolume(
43
+ networkTokens[srcTokenSymbol],
44
+ networkTokens[destTokenSymbol],
45
+ amounts,
46
+ side,
47
+ blockNumber,
48
+ pools,
49
+ );
50
+ console.log(
51
+ `${srcTokenSymbol} <> ${destTokenSymbol} Pool Prices: `,
52
+ poolPrices,
53
+ );
54
+
55
+ expect(poolPrices).not.toBeNull();
56
+ if (bebop.hasConstantPriceLargeAmounts) {
57
+ checkConstantPoolPrices(poolPrices!, amounts, dexKey);
58
+ } else {
59
+ checkPoolPrices(poolPrices!, amounts, side, dexKey, false);
60
+ }
61
+ }
62
+
63
+ describe('Bebop', function () {
64
+ const dexKey = 'Bebop';
65
+ let blockNumber: number;
66
+ let bebop: Bebop;
67
+
68
+ describe('Mainnet', () => {
69
+ const network = Network.MAINNET;
70
+ const dexHelper = new DummyDexHelper(network);
71
+
72
+ const tokens = Tokens[network];
73
+
74
+ const srcTokenSymbol = 'ETH';
75
+ const destTokenSymbol = 'USDC';
76
+
77
+ const amountsForSell = [
78
+ 0n,
79
+ 1n * BI_POWS[tokens[srcTokenSymbol].decimals],
80
+ 2n * BI_POWS[tokens[srcTokenSymbol].decimals],
81
+ 3n * BI_POWS[tokens[srcTokenSymbol].decimals],
82
+ 4n * BI_POWS[tokens[srcTokenSymbol].decimals],
83
+ 5n * BI_POWS[tokens[srcTokenSymbol].decimals],
84
+ 6n * BI_POWS[tokens[srcTokenSymbol].decimals],
85
+ 7n * BI_POWS[tokens[srcTokenSymbol].decimals],
86
+ 8n * BI_POWS[tokens[srcTokenSymbol].decimals],
87
+ 9n * BI_POWS[tokens[srcTokenSymbol].decimals],
88
+ 10n * BI_POWS[tokens[srcTokenSymbol].decimals],
89
+ ];
90
+
91
+ const amountsForBuy = [
92
+ 0n,
93
+ 1000n * BI_POWS[tokens[destTokenSymbol].decimals],
94
+ 2000n * BI_POWS[tokens[destTokenSymbol].decimals],
95
+ 3000n * BI_POWS[tokens[destTokenSymbol].decimals],
96
+ 4000n * BI_POWS[tokens[destTokenSymbol].decimals],
97
+ 5000n * BI_POWS[tokens[destTokenSymbol].decimals],
98
+ 6000n * BI_POWS[tokens[destTokenSymbol].decimals],
99
+ 7000n * BI_POWS[tokens[destTokenSymbol].decimals],
100
+ 8000n * BI_POWS[tokens[destTokenSymbol].decimals],
101
+ 9000n * BI_POWS[tokens[destTokenSymbol].decimals],
102
+ 10000n * BI_POWS[tokens[destTokenSymbol].decimals],
103
+ ];
104
+
105
+ beforeAll(async () => {
106
+ blockNumber = await dexHelper.web3Provider.eth.getBlockNumber();
107
+ bebop = new Bebop(network, dexKey, dexHelper);
108
+ if (bebop.initializePricing) {
109
+ await bebop.initializePricing(blockNumber);
110
+ }
111
+ });
112
+
113
+ afterAll(async () => {
114
+ if (bebop.releaseResources) {
115
+ await bebop.releaseResources();
116
+ }
117
+ });
118
+
119
+ it('getPoolIdentifiers and getPricesVolume SELL', async function () {
120
+ await testPricingOnNetwork(
121
+ bebop,
122
+ network,
123
+ dexKey,
124
+ blockNumber,
125
+ srcTokenSymbol,
126
+ destTokenSymbol,
127
+ SwapSide.SELL,
128
+ amountsForSell,
129
+ );
130
+ });
131
+
132
+ it('getPoolIdentifiers and getPricesVolume BUY', async function () {
133
+ await testPricingOnNetwork(
134
+ bebop,
135
+ network,
136
+ dexKey,
137
+ blockNumber,
138
+ srcTokenSymbol,
139
+ destTokenSymbol,
140
+ SwapSide.BUY,
141
+ amountsForBuy,
142
+ );
143
+ });
144
+
145
+ it('getTopPoolsForToken', async function () {
146
+ // We have to check without calling initializePricing, because
147
+ // pool-tracker is not calling that function
148
+ const newBebop = new Bebop(network, dexKey, dexHelper);
149
+ if (newBebop.updatePoolState) {
150
+ await newBebop.updatePoolState();
151
+ }
152
+ const poolLiquidity = await newBebop.getTopPoolsForToken(
153
+ tokens[srcTokenSymbol].address,
154
+ 10,
155
+ );
156
+ console.log(
157
+ `${srcTokenSymbol} Top Pools:`,
158
+ JSON.stringify(poolLiquidity, null, 2),
159
+ );
160
+
161
+ if (!newBebop.hasConstantPriceLargeAmounts) {
162
+ checkPoolsLiquidity(
163
+ poolLiquidity,
164
+ Tokens[network][srcTokenSymbol].address,
165
+ dexKey,
166
+ );
167
+ }
168
+ });
169
+ });
170
+ });