@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
@@ -1404,4 +1404,92 @@ describe('Solidly E2E', () => {
1404
1404
  );
1405
1405
  });
1406
1406
  });
1407
+
1408
+ describe('Base', () => {
1409
+ const network = Network.BASE;
1410
+
1411
+ describe('Aerodrome', () => {
1412
+ const dexKey = 'Aerodrome';
1413
+ const tokenASymbol: string = 'USDbC';
1414
+ const tokenBSymbol: string = 'DAI';
1415
+
1416
+ const tokenAAmount: string = '1111100000';
1417
+ const tokenBAmount: string = '100000000000000000';
1418
+ const nativeTokenAmount = '100000000000000000';
1419
+
1420
+ testForNetwork(
1421
+ network,
1422
+ dexKey,
1423
+ tokenASymbol,
1424
+ tokenBSymbol,
1425
+ tokenAAmount,
1426
+ tokenBAmount,
1427
+ nativeTokenAmount,
1428
+ );
1429
+ });
1430
+
1431
+ describe('Equalizer', () => {
1432
+ const dexKey = 'Equalizer';
1433
+ const network = Network.BASE;
1434
+
1435
+ const tokenASymbol: string = 'USDbC';
1436
+ const tokenAAmount: string = '1111100000';
1437
+ const nativeTokenAmount = '110000000000000000';
1438
+
1439
+ const provider = new StaticJsonRpcProvider(
1440
+ generateConfig(network).privateHttpProvider,
1441
+ network,
1442
+ );
1443
+ const tokens = Tokens[network];
1444
+ const holders = Holders[network];
1445
+ const nativeTokenSymbol = NativeTokenSymbols[network];
1446
+
1447
+ // TODO: Add any direct swap contractMethod name if it exists
1448
+ const sideToContractMethods = new Map([
1449
+ [
1450
+ SwapSide.SELL,
1451
+ [
1452
+ ContractMethod.simpleSwap,
1453
+ ContractMethod.multiSwap,
1454
+ ContractMethod.megaSwap,
1455
+ ],
1456
+ ],
1457
+ ]);
1458
+
1459
+ sideToContractMethods.forEach((contractMethods, side) =>
1460
+ describe(`${side}`, () => {
1461
+ contractMethods.forEach((contractMethod: ContractMethod) => {
1462
+ describe(`${contractMethod}`, () => {
1463
+ it(`${nativeTokenSymbol} -> ${tokenASymbol}`, async () => {
1464
+ await testE2E(
1465
+ tokens[nativeTokenSymbol],
1466
+ tokens[tokenASymbol],
1467
+ holders[nativeTokenSymbol],
1468
+ side === SwapSide.SELL ? nativeTokenAmount : tokenAAmount,
1469
+ side,
1470
+ dexKey,
1471
+ contractMethod,
1472
+ network,
1473
+ provider,
1474
+ );
1475
+ });
1476
+ it(`${tokenASymbol} -> ${nativeTokenSymbol}`, async () => {
1477
+ await testE2E(
1478
+ tokens[tokenASymbol],
1479
+ tokens[nativeTokenSymbol],
1480
+ holders[tokenASymbol],
1481
+ side === SwapSide.SELL ? tokenAAmount : nativeTokenAmount,
1482
+ side,
1483
+ dexKey,
1484
+ contractMethod,
1485
+ network,
1486
+ provider,
1487
+ );
1488
+ });
1489
+ });
1490
+ });
1491
+ }),
1492
+ );
1493
+ });
1494
+ });
1407
1495
  });
@@ -1202,4 +1202,70 @@ describe('Solidly integration tests', () => {
1202
1202
  });
1203
1203
  });
1204
1204
  });
1205
+
1206
+ describe('Base', () => {
1207
+ const network = Network.BASE;
1208
+ const dexHelper = new DummyDexHelper(network);
1209
+ const checkOnChainPricing = constructCheckOnChainPricing(dexHelper);
1210
+
1211
+ describe('Equalizer', () => {
1212
+ const dexKey = 'Equalizer';
1213
+ const equalizer = new Equalizer(network, dexKey, dexHelper);
1214
+
1215
+ describe('UniswapV2 like pool', function () {
1216
+ const TokenASymbol = 'USDbC';
1217
+ const tokenA = Tokens[network][TokenASymbol];
1218
+ const TokenBSymbol = 'ETH';
1219
+ const tokenB = Tokens[network][TokenBSymbol];
1220
+
1221
+ const amounts = amounts18;
1222
+
1223
+ it('getPoolIdentifiers and getPricesVolume', async function () {
1224
+ const blocknumber = await dexHelper.web3Provider.eth.getBlockNumber();
1225
+ const pools = await equalizer.getPoolIdentifiers(
1226
+ tokenA,
1227
+ tokenB,
1228
+ SwapSide.SELL,
1229
+ blocknumber,
1230
+ );
1231
+ console.log(
1232
+ `${TokenASymbol} <> ${TokenBSymbol} Pool Identifiers: `,
1233
+ pools,
1234
+ );
1235
+
1236
+ expect(pools.length).toBeGreaterThan(0);
1237
+
1238
+ const poolPrices = await equalizer.getPricesVolume(
1239
+ tokenA,
1240
+ tokenB,
1241
+ amounts,
1242
+ SwapSide.SELL,
1243
+ blocknumber,
1244
+ pools,
1245
+ );
1246
+ console.log(
1247
+ `${TokenASymbol} <> ${TokenBSymbol} Pool Prices: `,
1248
+ poolPrices,
1249
+ );
1250
+
1251
+ expect(poolPrices).not.toBeNull();
1252
+ checkPoolPrices(poolPrices!, amounts, SwapSide.SELL, dexKey);
1253
+
1254
+ // Check if onchain pricing equals to calculated ones
1255
+
1256
+ for (const poolPrice of poolPrices || []) {
1257
+ await checkOnChainPricing(
1258
+ equalizer,
1259
+ 'getAmountOut',
1260
+ blocknumber,
1261
+ poolPrice.prices,
1262
+ poolPrice.poolAddresses![0],
1263
+ tokenA.address,
1264
+ amounts,
1265
+ );
1266
+ }
1267
+ });
1268
+ });
1269
+ });
1270
+ });
1205
1271
  });
@@ -75,6 +75,7 @@ export class Solidly extends UniswapV2 {
75
75
  'Chronos',
76
76
  'Ramses',
77
77
  'Equalizer',
78
+ 'Aerodrome',
78
79
  ]),
79
80
  );
80
81
 
@@ -210,6 +210,19 @@ export const UniswapV3Config: DexConfigMap<DexParams> = {
210
210
  subgraphURL:
211
211
  'https://api.thegraph.com/subgraphs/name/sushi-v3/v3-optimism',
212
212
  },
213
+ [Network.BASE]: {
214
+ factory: '0xc35DADB65012eC5796536bD9864eD8773aBc74C4',
215
+ quoter: '0xb1E835Dc2785b52265711e17fCCb0fd018226a6e',
216
+ router: '0xCc0e85901f33D375FcdD9a888B05Df9616F68277',
217
+ supportedFees: SUPPORTED_FEES,
218
+ stateMulticall: '0x7160f736c52e1e78e92FD4eE4D73e21A7Cf4F950',
219
+ uniswapMulticall: '0x091e99cb1C49331a94dD62755D168E941AbD0693',
220
+ chunksCount: 10,
221
+ initRetryFrequency: 10,
222
+ initHash: `0xe34f199b19b2b4f47f68442619d555527d244f78a3297ea89325f843f87b8b54`,
223
+ subgraphURL:
224
+ 'https://api.studio.thegraph.com/query/32073/v3-base/v0.0.1',
225
+ },
213
226
  },
214
227
  ChronosV3: {
215
228
  [Network.ARBITRUM]: {
@@ -424,16 +424,16 @@ describe('UniswapV3 E2E', () => {
424
424
  [
425
425
  SwapSide.SELL,
426
426
  [
427
- // ContractMethod.simpleSwap,
427
+ ContractMethod.simpleSwap,
428
428
  ContractMethod.multiSwap,
429
- // ContractMethod.megaSwap,
429
+ ContractMethod.megaSwap,
430
430
  ],
431
431
  ],
432
432
  [
433
433
  SwapSide.BUY,
434
434
  [
435
- // ContractMethod.simpleBuy,
436
- // ContractMethod.buy
435
+ ContractMethod.simpleBuy,
436
+ ContractMethod.buy
437
437
  ],
438
438
  ],
439
439
  ]);
@@ -1094,5 +1094,26 @@ describe('UniswapV3 E2E', () => {
1094
1094
  nativeTokenAmount,
1095
1095
  );
1096
1096
  });
1097
+
1098
+ describe('BASE', () => {
1099
+ const network = Network.BASE;
1100
+
1101
+ const tokenASymbol: string = 'USDbC';
1102
+ const tokenBSymbol: string = 'DAI';
1103
+
1104
+ const tokenAAmount: string = '111110000';
1105
+ const tokenBAmount: string = '110000000000000000';
1106
+ const nativeTokenAmount = '1100000000000000000';
1107
+
1108
+ testForNetwork(
1109
+ network,
1110
+ dexKey,
1111
+ tokenASymbol,
1112
+ tokenBSymbol,
1113
+ tokenAAmount,
1114
+ tokenBAmount,
1115
+ nativeTokenAmount,
1116
+ );
1117
+ });
1097
1118
  });
1098
1119
  });
@@ -959,4 +959,146 @@ describe('SushiSwapV3', () => {
959
959
  expect(falseChecksCounter).toBeLessThan(poolPrices!.length);
960
960
  });
961
961
  });
962
+
963
+ describe('Base', () => {
964
+ let blockNumber: number;
965
+ let sushiSwapV3: UniswapV3;
966
+ let sushiSwapV3Mainnet: UniswapV3;
967
+
968
+ const network = Network.BASE;
969
+ const dexHelper = new DummyDexHelper(network);
970
+ const TokenASymbol = 'USDbC';
971
+ const TokenA = Tokens[network][TokenASymbol];
972
+
973
+ const TokenBSymbol = 'DAI';
974
+ const TokenB = Tokens[network][TokenBSymbol];
975
+
976
+ beforeEach(async () => {
977
+ blockNumber = await dexHelper.web3Provider.eth.getBlockNumber();
978
+ sushiSwapV3 = new UniswapV3(network, dexKey, dexHelper);
979
+ sushiSwapV3Mainnet = new UniswapV3(Network.MAINNET, dexKey, dexHelper);
980
+ });
981
+
982
+ it('getPoolIdentifiers and getPricesVolume SELL', async function () {
983
+ const amounts = [0n, BI_POWS[6], 2000000n];
984
+
985
+ const pools = await sushiSwapV3.getPoolIdentifiers(
986
+ TokenA,
987
+ TokenB,
988
+ SwapSide.SELL,
989
+ blockNumber,
990
+ );
991
+ console.log(
992
+ `${TokenASymbol} <> ${TokenBSymbol} Pool Identifiers: `,
993
+ pools,
994
+ );
995
+
996
+ expect(pools.length).toBeGreaterThan(0);
997
+
998
+ const poolPrices = await sushiSwapV3.getPricesVolume(
999
+ TokenA,
1000
+ TokenB,
1001
+ amounts,
1002
+ SwapSide.SELL,
1003
+ blockNumber,
1004
+ pools,
1005
+ );
1006
+ console.log(
1007
+ `${TokenASymbol} <> ${TokenBSymbol} Pool Prices: `,
1008
+ poolPrices,
1009
+ );
1010
+
1011
+ expect(poolPrices).not.toBeNull();
1012
+ checkPoolPrices(poolPrices!, amounts, SwapSide.SELL, dexKey);
1013
+
1014
+ let falseChecksCounter = 0;
1015
+ await Promise.all(
1016
+ poolPrices!.map(async price => {
1017
+ const fee = sushiSwapV3.eventPools[price.poolIdentifier!]!.feeCode;
1018
+ const res = await checkOnChainPricing(
1019
+ dexHelper,
1020
+ sushiSwapV3,
1021
+ 'quoteExactInputSingle',
1022
+ blockNumber,
1023
+ '0xb1E835Dc2785b52265711e17fCCb0fd018226a6e',
1024
+ price.prices,
1025
+ TokenA.address,
1026
+ TokenB.address,
1027
+ fee,
1028
+ amounts,
1029
+ );
1030
+ if (res === false) falseChecksCounter++;
1031
+ }),
1032
+ );
1033
+
1034
+ expect(falseChecksCounter).toBeLessThan(poolPrices!.length);
1035
+ });
1036
+
1037
+ it('getPoolIdentifiers and getPricesVolume BUY', async function () {
1038
+ const amounts = [0n, BI_POWS[6], 2000000n];
1039
+
1040
+ const pools = await sushiSwapV3.getPoolIdentifiers(
1041
+ TokenA,
1042
+ TokenB,
1043
+ SwapSide.BUY,
1044
+ blockNumber,
1045
+ );
1046
+ console.log(
1047
+ `${TokenASymbol} <> ${TokenBSymbol} Pool Identifiers: `,
1048
+ pools,
1049
+ );
1050
+
1051
+ expect(pools.length).toBeGreaterThan(0);
1052
+
1053
+ const poolPrices = await sushiSwapV3.getPricesVolume(
1054
+ TokenA,
1055
+ TokenB,
1056
+ amounts,
1057
+ SwapSide.BUY,
1058
+ blockNumber,
1059
+ pools,
1060
+ );
1061
+ console.log(
1062
+ `${TokenASymbol} <> ${TokenBSymbol} Pool Prices: `,
1063
+ poolPrices,
1064
+ );
1065
+
1066
+ expect(poolPrices).not.toBeNull();
1067
+ checkPoolPrices(poolPrices!, amounts, SwapSide.SELL, dexKey);
1068
+
1069
+ let falseChecksCounter = 0;
1070
+ await Promise.all(
1071
+ poolPrices!.map(async price => {
1072
+ const fee = sushiSwapV3.eventPools[price.poolIdentifier!]!.feeCode;
1073
+ const res = await checkOnChainPricing(
1074
+ dexHelper,
1075
+ sushiSwapV3,
1076
+ 'quoteExactOutputSingle',
1077
+ blockNumber,
1078
+ '0xb1E835Dc2785b52265711e17fCCb0fd018226a6e',
1079
+ price.prices,
1080
+ TokenA.address,
1081
+ TokenB.address,
1082
+ fee,
1083
+ amounts,
1084
+ );
1085
+ if (res === false) falseChecksCounter++;
1086
+ }),
1087
+ );
1088
+
1089
+ expect(falseChecksCounter).toBeLessThan(poolPrices!.length);
1090
+ });
1091
+
1092
+ it('getTopPoolsForToken', async function () {
1093
+ const poolLiquidity = await sushiSwapV3.getTopPoolsForToken(
1094
+ TokenB.address,
1095
+ 10,
1096
+ );
1097
+ console.log(`${TokenASymbol} Top Pools:`, poolLiquidity);
1098
+
1099
+ checkPoolsLiquidity(poolLiquidity, TokenB.address, dexKey);
1100
+ });
1101
+ });
1102
+
962
1103
  });
1104
+
@@ -641,19 +641,20 @@ export class UniswapV3
641
641
  const balanceDestToken =
642
642
  _destAddress === pool.token0 ? state.balance0 : state.balance1;
643
643
 
644
- const unitResult = (await this.dexHelper.executeOnWorkerPool(
645
- this.network,
646
- this.dexKey,
647
- 'getOutputs',
648
- [state, [unitAmount], zeroForOne, side, balanceDestToken],
649
- )) as ReturnType<typeof this.getOutputs>;
650
-
651
- const pricesResult = (await this.dexHelper.executeOnWorkerPool(
652
- this.network,
653
- this.dexKey,
654
- 'getOutputs',
655
- [state, _amounts, zeroForOne, side, balanceDestToken],
656
- )) as ReturnType<typeof this.getOutputs>;
644
+ const unitResult = this._getOutputs(
645
+ state,
646
+ [unitAmount],
647
+ zeroForOne,
648
+ side,
649
+ balanceDestToken,
650
+ );
651
+ const pricesResult = this._getOutputs(
652
+ state,
653
+ _amounts,
654
+ zeroForOne,
655
+ side,
656
+ balanceDestToken,
657
+ );
657
658
 
658
659
  if (!unitResult || !pricesResult) {
659
660
  this.logger.debug('Prices or unit is not calculated');
@@ -1070,7 +1071,7 @@ export class UniswapV3
1070
1071
  return newConfig;
1071
1072
  }
1072
1073
 
1073
- getOutputs(
1074
+ private _getOutputs(
1074
1075
  state: DeepReadonly<PoolState>,
1075
1076
  amounts: bigint[],
1076
1077
  zeroForOne: boolean,
@@ -64,6 +64,16 @@ export const WooFiV2Config: DexConfigMap<DexParams> = {
64
64
  decimals: 6,
65
65
  },
66
66
  },
67
+ [Network.BASE]: {
68
+ wooPPV2Address: '0xb130a49065178465931d4f887056328CeA5D723f',
69
+ wooOracleV2Address: '0x2Fe5E5D341cFFa606a5d9DA1B6B646a381B0f7ec',
70
+ integrationHelperAddress: '0xC4E9B633685461E7B7A807D12a246C81f96F31B8',
71
+ // USDbC
72
+ quoteToken: {
73
+ address: '0xd9aAEc86B65D86f6A7B5B1b0c42FFA531710b6CA',
74
+ decimals: 6,
75
+ },
76
+ },
67
77
  },
68
78
  };
69
79
 
@@ -84,4 +94,7 @@ export const Adapters: Record<number, AdapterMappings> = {
84
94
  [Network.AVALANCHE]: {
85
95
  [SwapSide.SELL]: [{ name: 'AvalancheAdapter01', index: 12 }],
86
96
  },
97
+ [Network.BASE]: {
98
+ [SwapSide.SELL]: [{ name: 'BaseAdapter01', index: 5 }],
99
+ },
87
100
  };
@@ -213,4 +213,68 @@ describe('WooFiV2 E2E', () => {
213
213
  tokenQuoteAmount,
214
214
  );
215
215
  });
216
+
217
+ describe('Base', () => {
218
+ const network = Network.BASE;
219
+
220
+ const baseATokenSymbol = 'USDbC';
221
+ const baseBTokenSymbol = 'ETH';
222
+
223
+ const tokenBaseAAmount = '100000000';
224
+ const tokenBaseBAmount = '1000000000000000000';
225
+
226
+ const tokens = Tokens[network];
227
+ const holders = Holders[network];
228
+
229
+ const provider = new StaticJsonRpcProvider(
230
+ generateConfig(network).privateHttpProvider,
231
+ network,
232
+ );
233
+
234
+ const sideToContractMethods = new Map([
235
+ [
236
+ SwapSide.SELL,
237
+ [
238
+ ContractMethod.simpleSwap,
239
+ ContractMethod.multiSwap,
240
+ ContractMethod.megaSwap,
241
+ ],
242
+ ],
243
+ ]);
244
+
245
+ sideToContractMethods.forEach((contractMethods, side) =>
246
+ describe(`${side}`, () => {
247
+ contractMethods.forEach((contractMethod: ContractMethod) => {
248
+ describe(`${contractMethod}`, () => {
249
+ it(`${baseATokenSymbol} -> ${baseBTokenSymbol}`, async () => {
250
+ await testE2E(
251
+ tokens[baseATokenSymbol],
252
+ tokens[baseBTokenSymbol],
253
+ holders[baseATokenSymbol],
254
+ tokenBaseAAmount,
255
+ side,
256
+ dexKey,
257
+ contractMethod,
258
+ network,
259
+ provider,
260
+ );
261
+ });
262
+ it(`${baseBTokenSymbol} -> ${baseATokenSymbol}`, async () => {
263
+ await testE2E(
264
+ tokens[baseBTokenSymbol],
265
+ tokens[baseATokenSymbol],
266
+ holders[baseBTokenSymbol],
267
+ tokenBaseBAmount,
268
+ side,
269
+ dexKey,
270
+ contractMethod,
271
+ network,
272
+ provider,
273
+ );
274
+ });
275
+ });
276
+ });
277
+ }),
278
+ );
279
+ });
216
280
  });
@@ -246,12 +246,6 @@ export class DummyDexHelper implements IDexHelper {
246
246
  getLogger: LoggerConstructor;
247
247
  web3Provider: Web3;
248
248
  getTokenUSDPrice: (token: Token, amount: bigint) => Promise<number>;
249
- executeOnWorkerPool: (
250
- network: number,
251
- dexKeys: string,
252
- methodSelector: string,
253
- payload: any[],
254
- ) => Promise<any>;
255
249
 
256
250
  constructor(network: number, rpcUrl?: string) {
257
251
  this.config = new ConfigHelper(false, generateConfig(network), 'is');
@@ -287,15 +281,6 @@ export class DummyDexHelper implements IDexHelper {
287
281
  5,
288
282
  this.getLogger(`PromiseScheduler-${network}`),
289
283
  );
290
-
291
- this.executeOnWorkerPool = async (
292
- network: number,
293
- dexKey: string,
294
- methodSelector: string,
295
- payload: any[],
296
- ) => {
297
- return null;
298
- };
299
284
  }
300
285
 
301
286
  replaceProviderWithRPC(rpcUrl: string) {
@@ -21,12 +21,5 @@ export interface IDexHelper {
21
21
  web3Provider: Web3;
22
22
  blockManager: IBlockManager;
23
23
  getLogger: LoggerConstructor;
24
- executeOnWorkerPool: (
25
- network: number,
26
- dexKey: string,
27
- methodSelector: string,
28
- // For POC it is ok to have any
29
- payload: any[],
30
- ) => Promise<any>;
31
24
  getTokenUSDPrice: (token: Token, amount: bigint) => Promise<number>;
32
25
  }
@@ -892,6 +892,30 @@ export const Tokens: {
892
892
  address: '0x4200000000000000000000000000000000000006',
893
893
  decimals: 18,
894
894
  },
895
+ MAV: {
896
+ address: '0x64b88c73A5DfA78D1713fE1b4c69a22d7E0faAa7',
897
+ decimals: 18,
898
+ },
899
+ USDC: {
900
+ address: '0x833589fcd6edb6e08f4c7c32d4f71b54bda02913',
901
+ decimals: 6,
902
+ },
903
+ USDbC: {
904
+ address: '0xd9aAEc86B65D86f6A7B5B1b0c42FFA531710b6CA',
905
+ decimals: 6,
906
+ },
907
+ DAI: {
908
+ address: '0x50c5725949a6f0c72e6c4a641f24049a917db0cb',
909
+ decimals: 18,
910
+ },
911
+ BAL: {
912
+ address: '0x4158734d47fc9692176b5085e0f52ee0da5d47f1',
913
+ decimals: 18,
914
+ },
915
+ GOLD: {
916
+ address: '0xbeFD5C25A59ef2C1316c5A4944931171F30Cd3E4',
917
+ decimals: 18,
918
+ },
895
919
  ETH: { address: ETHER_ADDRESS, decimals: 18 },
896
920
  },
897
921
  };
@@ -1117,6 +1141,12 @@ export const Holders: {
1117
1141
  WETH: '0x4bb6b2efe7036020ba6f02a05602546c9f25bf28',
1118
1142
  PRIME: '0x956bcc6b56c99db382d9d97a30ba5f1402144b3e',
1119
1143
  ETH: '0xdd9176ea3e7559d6b68b537ef555d3e89403f742',
1144
+ MAV: '0x7499785aa5d1bdf0a0ac862c1ef3698d3cba6568',
1145
+ USDC: '0xaac391f166f33cdaefaa4afa6616a3bea66b694d',
1146
+ USDbC: '0xc9d05a1c3c8e01dcb701d6185cdc21a5bb94becb',
1147
+ DAI: '0x20f03e26968b179025f65c1f4afadfd3959c8d03',
1148
+ BAL: '0x854b004700885a61107b458f11ecc169a019b764',
1149
+ GOLD: '0x1374c25b3710758c326ee0c70ec48b595d5ccf8c',
1120
1150
  },
1121
1151
  };
1122
1152
 
@@ -86,6 +86,7 @@ const MULTISIG: { [nid: number]: string } = {
86
86
  [Network.AVALANCHE]: '0x1e2ECA5e812D08D2A7F8664D69035163ff5BfEC2',
87
87
  [Network.OPTIMISM]: '0xf01121e808F782d7F34E857c27dA31AD1f151b39',
88
88
  [Network.ARBITRUM]: '0x90DfD8a6454CFE19be39EaB42ac93CD850c7f339',
89
+ [Network.BASE]: '0x6C674c8Df1aC663b822c4B6A56B4E5e889379AE0',
89
90
  };
90
91
 
91
92
  class APIParaswapSDK implements IParaSwapSDK {
@@ -1,70 +0,0 @@
1
- [
2
- {
3
- "anonymous": false,
4
- "inputs": [
5
- {
6
- "indexed": false,
7
- "internalType": "address",
8
- "name": "token",
9
- "type": "address"
10
- },
11
- {
12
- "indexed": false,
13
- "internalType": "uint256",
14
- "name": "price",
15
- "type": "uint256"
16
- },
17
- {
18
- "indexed": false,
19
- "internalType": "address",
20
- "name": "priceFeed",
21
- "type": "address"
22
- }
23
- ],
24
- "name": "PriceUpdate",
25
- "type": "event"
26
- },
27
- {
28
- "inputs": [
29
- { "internalType": "address", "name": "_token", "type": "address" },
30
- { "internalType": "uint256", "name": "_price", "type": "uint256" }
31
- ],
32
- "name": "emitPriceEvent",
33
- "outputs": [],
34
- "stateMutability": "nonpayable",
35
- "type": "function"
36
- },
37
- {
38
- "inputs": [],
39
- "name": "gov",
40
- "outputs": [{ "internalType": "address", "name": "", "type": "address" }],
41
- "stateMutability": "view",
42
- "type": "function"
43
- },
44
- {
45
- "inputs": [{ "internalType": "address", "name": "", "type": "address" }],
46
- "name": "isPriceFeed",
47
- "outputs": [{ "internalType": "bool", "name": "", "type": "bool" }],
48
- "stateMutability": "view",
49
- "type": "function"
50
- },
51
- {
52
- "inputs": [
53
- { "internalType": "address", "name": "_gov", "type": "address" }
54
- ],
55
- "name": "setGov",
56
- "outputs": [],
57
- "stateMutability": "nonpayable",
58
- "type": "function"
59
- },
60
- {
61
- "inputs": [
62
- { "internalType": "address", "name": "_priceFeed", "type": "address" },
63
- { "internalType": "bool", "name": "_isPriceFeed", "type": "bool" }
64
- ],
65
- "name": "setIsPriceFeed",
66
- "outputs": [],
67
- "stateMutability": "nonpayable",
68
- "type": "function"
69
- }
70
- ]