@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.
Files changed (190) hide show
  1. package/.idea/aws.xml +17 -0
  2. package/.idea/codeStyles/Project.xml +19 -0
  3. package/.idea/codeStyles/codeStyleConfig.xml +5 -0
  4. package/.idea/misc.xml +6 -0
  5. package/.idea/modules.xml +8 -0
  6. package/.idea/paraswap-dex-lib.iml +9 -0
  7. package/.idea/vcs.xml +6 -0
  8. package/build/abi/aerodrome/aerodrome-pool-factory.json +586 -0
  9. package/build/abi/algebra/AlgebraPool.abi.json +727 -0
  10. package/build/abi/curve-v1/StableSwapFRXETH.json +889 -0
  11. package/build/abi/curve-v1/StableSwapWBETH.json +1223 -0
  12. package/build/abi/sushiswap-v3/QuoterV2.json +267 -0
  13. package/build/abi/sushiswap-v3/RouterProcessor3.json +289 -0
  14. package/build/abi/wBETH.json +1527 -0
  15. package/build/config.js +2 -2
  16. package/build/dex/algebra/algebra-pool.d.ts +46 -0
  17. package/build/dex/algebra/algebra-pool.js +336 -0
  18. package/build/dex/algebra/algebra-pool.js.map +1 -0
  19. package/build/dex/algebra/algebra.d.ts +2 -4
  20. package/build/dex/algebra/algebra.js +3 -4
  21. package/build/dex/algebra/algebra.js.map +1 -1
  22. package/build/dex/balancer-v2/config.js +9 -1
  23. package/build/dex/balancer-v2/config.js.map +1 -1
  24. package/build/dex/curve-v1/pools/frxETHpool.d.ts +7 -0
  25. package/build/dex/curve-v1/pools/frxETHpool.js +27 -0
  26. package/build/dex/curve-v1/pools/frxETHpool.js.map +1 -0
  27. package/build/dex/curve-v1/pools/wbETHpool.d.ts +29 -0
  28. package/build/dex/curve-v1/pools/wbETHpool.js +408 -0
  29. package/build/dex/curve-v1/pools/wbETHpool.js.map +1 -0
  30. package/build/dex/index.js +2 -0
  31. package/build/dex/index.js.map +1 -1
  32. package/build/dex/maverick-v1/config.js +9 -0
  33. package/build/dex/maverick-v1/config.js.map +1 -1
  34. package/build/dex/maverick-v1/maverick-v1.js +11 -2
  35. package/build/dex/maverick-v1/maverick-v1.js.map +1 -1
  36. package/build/dex/pancakeswap-v3/config.js +17 -0
  37. package/build/dex/pancakeswap-v3/config.js.map +1 -1
  38. package/build/dex/pancakeswap-v3/pancakeswap-v3.d.ts +2 -3
  39. package/build/dex/pancakeswap-v3/pancakeswap-v3.js +3 -3
  40. package/build/dex/pancakeswap-v3/pancakeswap-v3.js.map +1 -1
  41. package/build/dex/pancakeswap-v3/types.d.ts +14 -0
  42. package/build/dex/{test-dex → pancakeswap-v3}/types.js.map +1 -1
  43. package/build/dex/{test-dex → ramses-v2}/config.d.ts +1 -1
  44. package/build/dex/ramses-v2/config.js +28 -0
  45. package/build/dex/ramses-v2/config.js.map +1 -0
  46. package/build/dex/ramses-v2/constants.d.ts +28 -0
  47. package/build/dex/ramses-v2/constants.js +35 -0
  48. package/build/dex/ramses-v2/constants.js.map +1 -0
  49. package/build/dex/ramses-v2/contract-math/BitMath.d.ts +4 -0
  50. package/build/dex/ramses-v2/contract-math/BitMath.js +93 -0
  51. package/build/dex/ramses-v2/contract-math/BitMath.js.map +1 -0
  52. package/build/dex/ramses-v2/contract-math/FixedPoint128.d.ts +3 -0
  53. package/build/dex/ramses-v2/contract-math/FixedPoint128.js +8 -0
  54. package/build/dex/ramses-v2/contract-math/FixedPoint128.js.map +1 -0
  55. package/build/dex/ramses-v2/contract-math/FixedPoint96.d.ts +4 -0
  56. package/build/dex/ramses-v2/contract-math/FixedPoint96.js +9 -0
  57. package/build/dex/ramses-v2/contract-math/FixedPoint96.js.map +1 -0
  58. package/build/dex/ramses-v2/contract-math/FullMath.d.ts +4 -0
  59. package/build/dex/ramses-v2/contract-math/FullMath.js +19 -0
  60. package/build/dex/ramses-v2/contract-math/FullMath.js.map +1 -0
  61. package/build/dex/ramses-v2/contract-math/LiquidityMath.d.ts +3 -0
  62. package/build/dex/ramses-v2/contract-math/LiquidityMath.js +22 -0
  63. package/build/dex/ramses-v2/contract-math/LiquidityMath.js.map +1 -0
  64. package/build/dex/ramses-v2/contract-math/Oracle.d.ts +10 -0
  65. package/build/dex/ramses-v2/contract-math/Oracle.js +133 -0
  66. package/build/dex/ramses-v2/contract-math/Oracle.js.map +1 -0
  67. package/build/dex/ramses-v2/contract-math/SqrtPriceMath.d.ts +10 -0
  68. package/build/dex/ramses-v2/contract-math/SqrtPriceMath.js +91 -0
  69. package/build/dex/ramses-v2/contract-math/SqrtPriceMath.js.map +1 -0
  70. package/build/dex/ramses-v2/contract-math/SwapMath.d.ts +8 -0
  71. package/build/dex/ramses-v2/contract-math/SwapMath.js +70 -0
  72. package/build/dex/ramses-v2/contract-math/SwapMath.js.map +1 -0
  73. package/build/dex/ramses-v2/contract-math/Tick.d.ts +7 -0
  74. package/build/dex/ramses-v2/contract-math/Tick.js +45 -0
  75. package/build/dex/ramses-v2/contract-math/Tick.js.map +1 -0
  76. package/build/dex/ramses-v2/contract-math/TickBitMap.d.ts +8 -0
  77. package/build/dex/ramses-v2/contract-math/TickBitMap.js +87 -0
  78. package/build/dex/ramses-v2/contract-math/TickBitMap.js.map +1 -0
  79. package/build/dex/ramses-v2/contract-math/TickMath.d.ts +8 -0
  80. package/build/dex/ramses-v2/contract-math/TickMath.js +162 -0
  81. package/build/dex/ramses-v2/contract-math/TickMath.js.map +1 -0
  82. package/build/dex/ramses-v2/contract-math/UnsafeMath.d.ts +3 -0
  83. package/build/dex/ramses-v2/contract-math/UnsafeMath.js +10 -0
  84. package/build/dex/ramses-v2/contract-math/UnsafeMath.js.map +1 -0
  85. package/build/dex/ramses-v2/contract-math/uniswap-v3-math.d.ts +18 -0
  86. package/build/dex/ramses-v2/contract-math/uniswap-v3-math.js +392 -0
  87. package/build/dex/ramses-v2/contract-math/uniswap-v3-math.js.map +1 -0
  88. package/build/dex/ramses-v2/contract-math/utils.d.ts +3 -0
  89. package/build/dex/ramses-v2/contract-math/utils.js +16 -0
  90. package/build/dex/ramses-v2/contract-math/utils.js.map +1 -0
  91. package/build/dex/ramses-v2/ramses-v2-pool.d.ts +42 -0
  92. package/build/dex/ramses-v2/ramses-v2-pool.js +307 -0
  93. package/build/dex/ramses-v2/ramses-v2-pool.js.map +1 -0
  94. package/build/dex/ramses-v2/ramses-v2.d.ts +61 -0
  95. package/build/dex/ramses-v2/ramses-v2.js +690 -0
  96. package/build/dex/ramses-v2/ramses-v2.js.map +1 -0
  97. package/build/dex/ramses-v2/types.d.ts +154 -0
  98. package/build/dex/ramses-v2/types.js +9 -0
  99. package/build/dex/ramses-v2/types.js.map +1 -0
  100. package/build/dex/ramses-v2/utils.d.ts +6 -0
  101. package/build/dex/ramses-v2/utils.js +71 -0
  102. package/build/dex/ramses-v2/utils.js.map +1 -0
  103. package/build/dex/solidly/config.js +22 -1
  104. package/build/dex/solidly/config.js.map +1 -1
  105. package/build/dex/solidly/forks-override/aerodrome.d.ts +14 -0
  106. package/build/dex/solidly/forks-override/aerodrome.js +48 -0
  107. package/build/dex/solidly/forks-override/aerodrome.js.map +1 -0
  108. package/build/dex/solidly/solidly.js +1 -0
  109. package/build/dex/solidly/solidly.js.map +1 -1
  110. package/build/dex/sushiswap-v3/config.d.ts +4 -0
  111. package/build/dex/sushiswap-v3/config.js +132 -0
  112. package/build/dex/sushiswap-v3/config.js.map +1 -0
  113. package/build/dex/sushiswap-v3/constants.d.ts +4 -0
  114. package/build/dex/sushiswap-v3/constants.js +32 -0
  115. package/build/dex/sushiswap-v3/constants.js.map +1 -0
  116. package/build/dex/sushiswap-v3/sushiswap-v3-original.d.ts +56 -0
  117. package/build/dex/sushiswap-v3/sushiswap-v3-original.js +598 -0
  118. package/build/dex/sushiswap-v3/sushiswap-v3-original.js.map +1 -0
  119. package/build/dex/sushiswap-v3/sushiswap-v3-pool.d.ts +1 -0
  120. package/build/dex/sushiswap-v3/sushiswap-v3-pool.js +6 -0
  121. package/build/dex/sushiswap-v3/sushiswap-v3-pool.js.map +1 -0
  122. package/build/dex/sushiswap-v3/sushiswap-v3.d.ts +21 -0
  123. package/build/dex/sushiswap-v3/sushiswap-v3.js +58 -0
  124. package/build/dex/sushiswap-v3/sushiswap-v3.js.map +1 -0
  125. package/build/dex/sushiswap-v3/token.d.ts +6 -0
  126. package/build/dex/sushiswap-v3/token.js +23 -0
  127. package/build/dex/sushiswap-v3/token.js.map +1 -0
  128. package/build/dex/sushiswap-v3/types.d.ts +15 -0
  129. package/build/dex/sushiswap-v3/types.js +18 -0
  130. package/build/dex/sushiswap-v3/types.js.map +1 -0
  131. package/build/dex/uniswap-v3/config.js +12 -0
  132. package/build/dex/uniswap-v3/config.js.map +1 -1
  133. package/build/dex/uniswap-v3/uniswap-v3.d.ts +2 -3
  134. package/build/dex/uniswap-v3/uniswap-v3.js +3 -3
  135. package/build/dex/uniswap-v3/uniswap-v3.js.map +1 -1
  136. package/build/dex/woo-fi-v2/config.js +13 -0
  137. package/build/dex/woo-fi-v2/config.js.map +1 -1
  138. package/build/dex-helper/dummy-dex-helper.d.ts +0 -1
  139. package/build/dex-helper/dummy-dex-helper.js +0 -3
  140. package/build/dex-helper/dummy-dex-helper.js.map +1 -1
  141. package/build/dex-helper/idex-helper.d.ts +0 -1
  142. package/package.json +1 -1
  143. package/src/abi/aerodrome/aerodrome-pool-factory.json +586 -0
  144. package/src/config.ts +2 -2
  145. package/src/dex/algebra/algebra.ts +15 -15
  146. package/src/dex/balancer-v2/balancer-v2-e2e.test.ts +122 -1
  147. package/src/dex/balancer-v2/config.ts +10 -1
  148. package/src/dex/index.ts +2 -0
  149. package/src/dex/maverick-v1/config.ts +10 -0
  150. package/src/dex/maverick-v1/maverick-v1-e2e.test.ts +121 -1
  151. package/src/dex/maverick-v1/maverick-v1.ts +12 -2
  152. package/src/dex/pancakeswap-v3/config.ts +19 -0
  153. package/src/dex/pancakeswap-v3/pancakeswap-v3-e2e.test.ts +120 -0
  154. package/src/dex/pancakeswap-v3/pancakeswap-v3.ts +16 -14
  155. package/src/dex/solidly/config.ts +24 -1
  156. package/src/dex/solidly/forks-override/aerodrome.ts +57 -0
  157. package/src/dex/solidly/solidly-e2e.test.ts +88 -0
  158. package/src/dex/solidly/solidly-integration.test.ts +66 -0
  159. package/src/dex/solidly/solidly.ts +1 -0
  160. package/src/dex/uniswap-v3/config.ts +13 -0
  161. package/src/dex/uniswap-v3/uniswap-v3-e2e.test.ts +25 -4
  162. package/src/dex/uniswap-v3/uniswap-v3-integration.test.ts +142 -0
  163. package/src/dex/uniswap-v3/uniswap-v3.ts +15 -14
  164. package/src/dex/woo-fi-v2/config.ts +13 -0
  165. package/src/dex/woo-fi-v2/woo-fi-v2-e2e.test.ts +64 -0
  166. package/src/dex-helper/dummy-dex-helper.ts +0 -15
  167. package/src/dex-helper/idex-helper.ts +0 -7
  168. package/tests/constants-e2e.ts +30 -0
  169. package/tests/utils-e2e.ts +1 -0
  170. package/build/abi/quickPerps/fast-price-events.json +0 -70
  171. package/build/abi/quickPerps/fast-price-feed.json +0 -748
  172. package/build/abi/quickPerps/reader.json +0 -313
  173. package/build/abi/quickPerps/vault-price-feed.json +0 -477
  174. package/build/abi/quickPerps/vault.json +0 -1953
  175. package/build/dex/test-dex/config.js +0 -15
  176. package/build/dex/test-dex/config.js.map +0 -1
  177. package/build/dex/test-dex/test-dex-pool.d.ts +0 -39
  178. package/build/dex/test-dex/test-dex-pool.js +0 -63
  179. package/build/dex/test-dex/test-dex-pool.js.map +0 -1
  180. package/build/dex/test-dex/test-dex.d.ts +0 -37
  181. package/build/dex/test-dex/test-dex.js +0 -126
  182. package/build/dex/test-dex/test-dex.js.map +0 -1
  183. package/build/dex/test-dex/types.d.ts +0 -6
  184. package/build/dex/woo-fi-v2/woo-fi-math.d.ts +0 -16
  185. package/build/dex/woo-fi-v2/woo-fi-math.js +0 -137
  186. package/build/dex/woo-fi-v2/woo-fi-math.js.map +0 -1
  187. package/build/workers.d.ts +0 -0
  188. package/build/workers.js +0 -2
  189. package/build/workers.js.map +0 -1
  190. /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('MaverickV1 MAINNET', () => {
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
- // 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,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 = (await this.dexHelper.executeOnWorkerPool(
612
- this.network,
613
- this.dexKey,
614
- 'getOutputs',
615
- [state, [unitAmount], zeroForOne, side, balanceDestToken],
616
- )) as ReturnType<typeof this.getOutputs>;
617
-
618
- const pricesResult = (await this.dexHelper.executeOnWorkerPool(
619
- this.network,
620
- this.dexKey,
621
- 'getOutputs',
622
- [state, _amounts, zeroForOne, side, balanceDestToken],
623
- )) as ReturnType<typeof this.getOutputs>;
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
- getOutputs(
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 + spiritSwapV2 + Equalizer
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
+ }