@paraswap/dex-lib 2.30.1 → 2.30.2-chronos-v3

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 (150) 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/curve-v1/StableSwapFRXETH.json +889 -0
  9. package/build/abi/curve-v1/StableSwapWBETH.json +1223 -0
  10. package/build/abi/uniswap-v3/pancakeswap-v3/PancakeswapV3QuoterV2.abi.json +285 -0
  11. package/build/abi/uniswap-v3/pancakeswap-v3/PancakeswapV3Router.abi.json +583 -0
  12. package/build/abi/wBETH.json +1527 -0
  13. package/build/abi/woo-fi/WooFeeManager.abi.json +318 -0
  14. package/build/abi/woo-fi/WooPP.abi.json +548 -0
  15. package/build/abi/woo-fi/Wooracle.abi.json +260 -0
  16. package/build/dex/aave-v3/tokens/arbitrum.json +50 -0
  17. package/build/dex/aave-v3/tokens/avalanche.json +74 -0
  18. package/build/dex/aave-v3/tokens/fantom.json +62 -0
  19. package/build/dex/aave-v3/tokens/optimism.json +50 -0
  20. package/build/dex/aave-v3/tokens/polygon.json +116 -0
  21. package/build/dex/balancer-v2/LinearMath.d.ts +19 -0
  22. package/build/dex/balancer-v2/LinearMath.js +179 -0
  23. package/build/dex/balancer-v2/LinearMath.js.map +1 -0
  24. package/build/dex/balancer-v2/LinearPool.d.ts +47 -0
  25. package/build/dex/balancer-v2/LinearPool.js +324 -0
  26. package/build/dex/balancer-v2/LinearPool.js.map +1 -0
  27. package/build/dex/balancer-v2/PhantomStablePool.d.ts +47 -0
  28. package/build/dex/balancer-v2/PhantomStablePool.js +294 -0
  29. package/build/dex/balancer-v2/PhantomStablePool.js.map +1 -0
  30. package/build/dex/balancer-v2/StableMath.d.ts +9 -0
  31. package/build/dex/balancer-v2/StableMath.js +272 -0
  32. package/build/dex/balancer-v2/StableMath.js.map +1 -0
  33. package/build/dex/balancer-v2/balancer-v2-pool.d.ts +75 -0
  34. package/build/dex/balancer-v2/balancer-v2-pool.js +417 -0
  35. package/build/dex/balancer-v2/balancer-v2-pool.js.map +1 -0
  36. package/build/dex/balancer-v2/balancer-v2.js +2 -0
  37. package/build/dex/balancer-v2/balancer-v2.js.map +1 -1
  38. package/build/dex/balancer-v2/optimizer.js +51 -38
  39. package/build/dex/balancer-v2/optimizer.js.map +1 -1
  40. package/build/dex/balancer-v2/types.d.ts +4 -0
  41. package/build/dex/balancer-v2/types.js.map +1 -1
  42. package/build/dex/curve-v1/pools/frxETHpool.d.ts +7 -0
  43. package/build/dex/curve-v1/pools/frxETHpool.js +27 -0
  44. package/build/dex/curve-v1/pools/frxETHpool.js.map +1 -0
  45. package/build/dex/curve-v1/pools/wbETHpool.d.ts +29 -0
  46. package/build/dex/curve-v1/pools/wbETHpool.js +408 -0
  47. package/build/dex/curve-v1/pools/wbETHpool.js.map +1 -0
  48. package/build/dex/curve-v1-factory/price-handlers/functions/calc_token_amount.js +26 -1
  49. package/build/dex/curve-v1-factory/price-handlers/functions/calc_token_amount.js.map +1 -1
  50. package/build/dex/pancakeswap-v3/types.d.ts +14 -0
  51. package/build/dex/pancakeswap-v3/types.js +3 -0
  52. package/build/dex/pancakeswap-v3/types.js.map +1 -0
  53. package/build/dex/quickswap-v3.d.ts +21 -0
  54. package/build/dex/quickswap-v3.js +40 -0
  55. package/build/dex/quickswap-v3.js.map +1 -0
  56. package/build/dex/ramses-v2/config.d.ts +4 -0
  57. package/build/dex/ramses-v2/config.js +28 -0
  58. package/build/dex/ramses-v2/config.js.map +1 -0
  59. package/build/dex/ramses-v2/constants.d.ts +28 -0
  60. package/build/dex/ramses-v2/constants.js +35 -0
  61. package/build/dex/ramses-v2/constants.js.map +1 -0
  62. package/build/dex/ramses-v2/contract-math/BitMath.d.ts +4 -0
  63. package/build/dex/ramses-v2/contract-math/BitMath.js +93 -0
  64. package/build/dex/ramses-v2/contract-math/BitMath.js.map +1 -0
  65. package/build/dex/ramses-v2/contract-math/FixedPoint128.d.ts +3 -0
  66. package/build/dex/ramses-v2/contract-math/FixedPoint128.js +8 -0
  67. package/build/dex/ramses-v2/contract-math/FixedPoint128.js.map +1 -0
  68. package/build/dex/ramses-v2/contract-math/FixedPoint96.d.ts +4 -0
  69. package/build/dex/ramses-v2/contract-math/FixedPoint96.js +9 -0
  70. package/build/dex/ramses-v2/contract-math/FixedPoint96.js.map +1 -0
  71. package/build/dex/ramses-v2/contract-math/FullMath.d.ts +4 -0
  72. package/build/dex/ramses-v2/contract-math/FullMath.js +19 -0
  73. package/build/dex/ramses-v2/contract-math/FullMath.js.map +1 -0
  74. package/build/dex/ramses-v2/contract-math/LiquidityMath.d.ts +3 -0
  75. package/build/dex/ramses-v2/contract-math/LiquidityMath.js +22 -0
  76. package/build/dex/ramses-v2/contract-math/LiquidityMath.js.map +1 -0
  77. package/build/dex/ramses-v2/contract-math/Oracle.d.ts +10 -0
  78. package/build/dex/ramses-v2/contract-math/Oracle.js +133 -0
  79. package/build/dex/ramses-v2/contract-math/Oracle.js.map +1 -0
  80. package/build/dex/ramses-v2/contract-math/SqrtPriceMath.d.ts +10 -0
  81. package/build/dex/ramses-v2/contract-math/SqrtPriceMath.js +91 -0
  82. package/build/dex/ramses-v2/contract-math/SqrtPriceMath.js.map +1 -0
  83. package/build/dex/ramses-v2/contract-math/SwapMath.d.ts +8 -0
  84. package/build/dex/ramses-v2/contract-math/SwapMath.js +70 -0
  85. package/build/dex/ramses-v2/contract-math/SwapMath.js.map +1 -0
  86. package/build/dex/ramses-v2/contract-math/Tick.d.ts +7 -0
  87. package/build/dex/ramses-v2/contract-math/Tick.js +45 -0
  88. package/build/dex/ramses-v2/contract-math/Tick.js.map +1 -0
  89. package/build/dex/ramses-v2/contract-math/TickBitMap.d.ts +8 -0
  90. package/build/dex/ramses-v2/contract-math/TickBitMap.js +87 -0
  91. package/build/dex/ramses-v2/contract-math/TickBitMap.js.map +1 -0
  92. package/build/dex/ramses-v2/contract-math/TickMath.d.ts +8 -0
  93. package/build/dex/ramses-v2/contract-math/TickMath.js +162 -0
  94. package/build/dex/ramses-v2/contract-math/TickMath.js.map +1 -0
  95. package/build/dex/ramses-v2/contract-math/UnsafeMath.d.ts +3 -0
  96. package/build/dex/ramses-v2/contract-math/UnsafeMath.js +10 -0
  97. package/build/dex/ramses-v2/contract-math/UnsafeMath.js.map +1 -0
  98. package/build/dex/ramses-v2/contract-math/uniswap-v3-math.d.ts +18 -0
  99. package/build/dex/ramses-v2/contract-math/uniswap-v3-math.js +392 -0
  100. package/build/dex/ramses-v2/contract-math/uniswap-v3-math.js.map +1 -0
  101. package/build/dex/ramses-v2/contract-math/utils.d.ts +3 -0
  102. package/build/dex/ramses-v2/contract-math/utils.js +16 -0
  103. package/build/dex/ramses-v2/contract-math/utils.js.map +1 -0
  104. package/build/dex/ramses-v2/ramses-v2-pool.d.ts +42 -0
  105. package/build/dex/ramses-v2/ramses-v2-pool.js +307 -0
  106. package/build/dex/ramses-v2/ramses-v2-pool.js.map +1 -0
  107. package/build/dex/ramses-v2/ramses-v2.d.ts +61 -0
  108. package/build/dex/ramses-v2/ramses-v2.js +690 -0
  109. package/build/dex/ramses-v2/ramses-v2.js.map +1 -0
  110. package/build/dex/ramses-v2/types.d.ts +154 -0
  111. package/build/dex/ramses-v2/types.js +9 -0
  112. package/build/dex/ramses-v2/types.js.map +1 -0
  113. package/build/dex/ramses-v2/utils.d.ts +6 -0
  114. package/build/dex/ramses-v2/utils.js +71 -0
  115. package/build/dex/ramses-v2/utils.js.map +1 -0
  116. package/build/dex/uniswap-v3/config.js +14 -0
  117. package/build/dex/uniswap-v3/config.js.map +1 -1
  118. package/build/dex/uniswap-v3/forks/pancakeswap-v3/pancakeswap-v3.d.ts +12 -0
  119. package/build/dex/uniswap-v3/forks/pancakeswap-v3/pancakeswap-v3.js +23 -0
  120. package/build/dex/uniswap-v3/forks/pancakeswap-v3/pancakeswap-v3.js.map +1 -0
  121. package/build/dex/uniswap-v3/uniswap-v3.js +2 -2
  122. package/build/dex/uniswap-v3/uniswap-v3.js.map +1 -1
  123. package/build/dex/woo-fi/config.d.ts +4 -0
  124. package/build/dex/woo-fi/config.js +141 -0
  125. package/build/dex/woo-fi/config.js.map +1 -0
  126. package/build/dex/woo-fi/constants.d.ts +5 -0
  127. package/build/dex/woo-fi/constants.js +20 -0
  128. package/build/dex/woo-fi/constants.js.map +1 -0
  129. package/build/dex/woo-fi/types.d.ts +48 -0
  130. package/build/dex/woo-fi/types.js +3 -0
  131. package/build/dex/woo-fi/types.js.map +1 -0
  132. package/build/dex/woo-fi/woo-fi-decimal-math.d.ts +14 -0
  133. package/build/dex/woo-fi/woo-fi-decimal-math.js +42 -0
  134. package/build/dex/woo-fi/woo-fi-decimal-math.js.map +1 -0
  135. package/build/dex/woo-fi/woo-fi-math.d.ts +31 -0
  136. package/build/dex/woo-fi/woo-fi-math.js +300 -0
  137. package/build/dex/woo-fi/woo-fi-math.js.map +1 -0
  138. package/build/dex/woo-fi/woo-fi.d.ts +65 -0
  139. package/build/dex/woo-fi/woo-fi.js +480 -0
  140. package/build/dex/woo-fi/woo-fi.js.map +1 -0
  141. package/package.json +2 -1
  142. package/scripts/dex-integration.ts +1 -1
  143. package/src/dex/balancer-v2/balancer-v2.ts +2 -0
  144. package/src/dex/balancer-v2/optimizer.ts +62 -49
  145. package/src/dex/balancer-v2/types.ts +4 -0
  146. package/src/dex/curve-v1-factory/price-handlers/functions/calc_token_amount.ts +33 -1
  147. package/src/dex/uniswap-v3/config.ts +16 -0
  148. package/src/dex/uniswap-v3/uniswap-v3-e2e.test.ts +87 -0
  149. package/src/dex/uniswap-v3/uniswap-v3-integration.test.ts +135 -0
  150. package/src/dex/uniswap-v3/uniswap-v3.ts +4 -5
@@ -1,70 +1,83 @@
1
- import { UnoptimizedRate, OptimalSwapExchange } from '../../types';
2
- import { BalancerSwapV2 } from './types';
1
+ import _ from 'lodash';
2
+ import { UnoptimizedRate } from '../../types';
3
3
  import { SwapSide } from '../../constants';
4
4
  import { BalancerConfig } from './config';
5
-
6
- const MAX_UINT256 =
7
- '115792089237316195423570985008687907853269984665640564039457584007913129639935';
8
-
9
- const AllBalancerV2Forks = Object.keys(BalancerConfig);
5
+ import { OptimalSwap } from '@paraswap/core';
10
6
 
11
7
  export function balancerV2Merge(or: UnoptimizedRate): UnoptimizedRate {
12
- const fixSwap = (
13
- rawSwap: OptimalSwapExchange<any>[],
14
- side: SwapSide,
15
- ): OptimalSwapExchange<any>[] => {
16
- const newBalancers: { [key: string]: OptimalSwapExchange<any> } = {};
17
- let optimizedSwap = new Array<OptimalSwapExchange<any>>();
18
- rawSwap.forEach((s: OptimalSwapExchange<any>) => {
19
- const exchangeKey = s.exchange.toLowerCase();
20
- if (AllBalancerV2Forks.some(d => d.toLowerCase() === exchangeKey)) {
21
- if (!(exchangeKey in newBalancers)) {
22
- newBalancers[exchangeKey] = {
23
- exchange: s.exchange,
24
- srcAmount: '0',
25
- destAmount: '0',
26
- percent: 0,
27
- poolAddresses: [],
28
- data: {
29
- swaps: new Array<BalancerSwapV2>(),
30
- gasUSD: '0',
31
- },
32
- };
33
- }
34
- newBalancers[exchangeKey].srcAmount = (
35
- BigInt(newBalancers[exchangeKey].srcAmount) + BigInt(s.srcAmount)
8
+ const balancerForksList = Object.keys(BalancerConfig).map(b =>
9
+ b.toLowerCase(),
10
+ );
11
+ const fixSwap = (rawRate: OptimalSwap[], side: SwapSide): OptimalSwap[] => {
12
+ let lastExchange: false | OptimalSwap = false;
13
+ let optimizedRate = new Array<OptimalSwap>();
14
+ rawRate.forEach((s: OptimalSwap) => {
15
+ if (
16
+ s.swapExchanges.length !== 1 ||
17
+ !balancerForksList.includes(s.swapExchanges[0].exchange.toLowerCase())
18
+ ) {
19
+ lastExchange = false;
20
+ optimizedRate.push(s);
21
+ } else if (
22
+ lastExchange &&
23
+ lastExchange.swapExchanges[0].exchange.toLowerCase() ===
24
+ s.swapExchanges[0].exchange.toLowerCase() &&
25
+ _.last(
26
+ <any[]>lastExchange.swapExchanges[0].data.swaps,
27
+ )!.tokenOut.toLowerCase() ===
28
+ s.swapExchanges[0].data.tokenIn.toLowerCase()
29
+ ) {
30
+ const [lastExchangeSwap] = lastExchange.swapExchanges;
31
+ const [currentSwap] = s.swapExchanges;
32
+ lastExchangeSwap.srcAmount = (
33
+ BigInt(lastExchangeSwap.srcAmount) + BigInt(currentSwap.srcAmount)
36
34
  ).toString();
37
35
 
38
- newBalancers[exchangeKey].destAmount = (
39
- BigInt(newBalancers[exchangeKey].destAmount) + BigInt(s.destAmount)
36
+ lastExchangeSwap.destAmount = (
37
+ BigInt(lastExchangeSwap.destAmount) + BigInt(currentSwap.destAmount)
40
38
  ).toString();
41
39
 
42
- newBalancers[exchangeKey].percent += s.percent;
43
- newBalancers[exchangeKey].data.exchangeProxy = s.data.exchangeProxy;
44
- newBalancers[exchangeKey].data.gasUSD = (
45
- parseFloat(newBalancers[exchangeKey].data.gasUSD) +
46
- parseFloat(s.data.gasUSD)
40
+ lastExchangeSwap.percent += currentSwap.percent;
41
+ lastExchangeSwap.data.gasUSD = (
42
+ parseFloat(lastExchangeSwap.data.gasUSD) +
43
+ parseFloat(currentSwap.data.gasUSD)
47
44
  ).toFixed(6);
48
45
 
49
- newBalancers[exchangeKey].data.swaps.push({
50
- poolId: s.data.poolId,
51
- amount: side === SwapSide.SELL ? s.srcAmount : s.destAmount,
46
+ lastExchangeSwap.data.swaps.push({
47
+ poolId: currentSwap.data.poolId,
48
+ amount:
49
+ side === SwapSide.SELL
50
+ ? currentSwap.srcAmount
51
+ : currentSwap.destAmount,
52
+ tokenIn: currentSwap.data.tokenIn,
53
+ tokenOut: currentSwap.data.tokenOut,
52
54
  });
53
- newBalancers[exchangeKey].poolAddresses!.push(s.poolAddresses![0]);
55
+ lastExchangeSwap.poolAddresses!.push(currentSwap.poolAddresses![0]);
54
56
  } else {
55
- optimizedSwap.push(s);
57
+ lastExchange = _.cloneDeep(s);
58
+ lastExchange.swapExchanges[0].data = {};
59
+ lastExchange.swapExchanges[0].data.gasUSD =
60
+ s.swapExchanges[0].data.gasUSD;
61
+ lastExchange.swapExchanges[0].data.swaps = [
62
+ {
63
+ poolId: s.swapExchanges[0].data.poolId,
64
+ amount:
65
+ side === SwapSide.SELL
66
+ ? s.swapExchanges[0].srcAmount
67
+ : s.swapExchanges[0].destAmount,
68
+ tokenIn: s.swapExchanges[0].data.tokenIn,
69
+ tokenOut: s.swapExchanges[0].data.tokenOut,
70
+ },
71
+ ];
72
+ optimizedRate.push(lastExchange);
56
73
  }
57
74
  });
58
- optimizedSwap = optimizedSwap.concat(Object.values(newBalancers));
59
- return optimizedSwap;
75
+ return optimizedRate;
60
76
  };
61
77
 
62
78
  or.bestRoute = or.bestRoute.map(r => ({
63
79
  ...r,
64
- swaps: r.swaps.map(s => ({
65
- ...s,
66
- swapExchanges: fixSwap(s.swapExchanges, or.side),
67
- })),
80
+ swaps: fixSwap(r.swaps, or.side),
68
81
  }));
69
82
  return or;
70
83
  }
@@ -82,6 +82,8 @@ export interface SubgraphPoolBase {
82
82
  export type BalancerSwapV2 = {
83
83
  poolId: string;
84
84
  amount: string;
85
+ tokenIn: string;
86
+ tokenOut: string;
85
87
  };
86
88
 
87
89
  export type OptimizedBalancerV2Data = {
@@ -139,6 +141,8 @@ export type BalancerV2DirectParam = [
139
141
 
140
142
  export type BalancerV2Data = {
141
143
  poolId: string;
144
+ tokenIn: string;
145
+ tokenOut: string;
142
146
  };
143
147
 
144
148
  export type DexParams = {
@@ -35,6 +35,38 @@ const customPlain3CoinThree: calc_token_amount = (
35
35
  return (diff * token_amount) / D0;
36
36
  };
37
37
 
38
+ const factoryPlain2Basic: calc_token_amount = (
39
+ self: IPoolContext,
40
+ state: PoolState,
41
+ amounts: bigint[],
42
+ is_deposit: boolean,
43
+ ) => {
44
+ const { N_COINS } = self.constants;
45
+ const amp = state.A;
46
+ const balances = [...state.balances];
47
+ const D0 = self.get_D(self, balances, amp);
48
+ for (const i of _.range(N_COINS)) {
49
+ if (is_deposit) balances[i] += amounts[i];
50
+ else balances[i] -= amounts[i];
51
+ }
52
+ const D1 = self.get_D(self, balances, amp);
53
+
54
+ if (state.totalSupply === undefined) {
55
+ throw new Error(
56
+ `${self.IMPLEMENTATION_NAME} customPlain3CoinThree: totalSupply is not provided`,
57
+ );
58
+ }
59
+
60
+ const token_amount = state.totalSupply;
61
+ let diff = 0n;
62
+ if (is_deposit) {
63
+ diff = D1 - D0;
64
+ } else {
65
+ diff = D0 - D1;
66
+ }
67
+ return (diff * token_amount) / D0;
68
+ };
69
+
38
70
  const customAvalanche3CoinLending: calc_token_amount = (
39
71
  self: IPoolContext,
40
72
  state: PoolState,
@@ -114,7 +146,7 @@ const implementations: Record<ImplementationNames, calc_token_amount> = {
114
146
  [ImplementationNames.FACTORY_META_USD_BALANCES_FRAX_USDC]: notImplemented,
115
147
 
116
148
  [ImplementationNames.FACTORY_PLAIN_2_BALANCES]: notImplemented,
117
- [ImplementationNames.FACTORY_PLAIN_2_BASIC]: notImplemented,
149
+ [ImplementationNames.FACTORY_PLAIN_2_BASIC]: factoryPlain2Basic,
118
150
  [ImplementationNames.FACTORY_PLAIN_2_ETH]: notImplemented,
119
151
  [ImplementationNames.FACTORY_PLAIN_2_OPTIMIZED]: notImplemented,
120
152
 
@@ -107,6 +107,22 @@ export const UniswapV3Config: DexConfigMap<DexParams> = {
107
107
  'https://api.thegraph.com/subgraphs/name/lynnshaoyu/uniswap-v3-avax',
108
108
  },
109
109
  },
110
+ ChronosV3: {
111
+ [Network.ARBITRUM]: {
112
+ factory: '0x4Db9D624F67E00dbF8ef7AE0e0e8eE54aF1dee49',
113
+ quoter: '0x6E7f0Ca45171a4440c0CDdF3A46A8dC5D4c2d4A0',
114
+ router: '0xE0aBdFD837D451640CF43cB1Ec4eE87976eFbb41',
115
+ supportedFees: SUPPORTED_FEES,
116
+ stateMulticall: '0x46b44eb4Cc3bEbB9f04C419f691aB85Ff885A4D6',
117
+ uniswapMulticall: '0xaBB58098A7B5172A9b0B38a1925A522dbf0b4FC3',
118
+ chunksCount: 10,
119
+ initRetryFrequency: 10,
120
+ initHash:
121
+ '0x09c178be473df44d1de6970978a4fdedce1ce52a23b2b979754547f6b43a19a5',
122
+ subgraphURL:
123
+ 'https://subgraph.chronos.exchange/subgraphs/name/chronos-v3',
124
+ },
125
+ },
110
126
  RamsesV2: {
111
127
  [Network.ARBITRUM]: {
112
128
  factory: '0xAA2cd7477c451E703f3B9Ba5663334914763edF8',
@@ -501,4 +501,91 @@ describe('UniswapV3 E2E', () => {
501
501
  );
502
502
  });
503
503
  });
504
+
505
+ describe('ChronosV3', () => {
506
+ const dexKey = 'ChronosV3';
507
+ describe('Arbitrum', () => {
508
+ const network = Network.ARBITRUM;
509
+ const tokens = Tokens[network];
510
+ const holders = Holders[network];
511
+ const provider = new StaticJsonRpcProvider(
512
+ generateConfig(network).privateHttpProvider,
513
+ network,
514
+ );
515
+
516
+ const tokenASymbol: string = 'USDCe';
517
+ const tokenBSymbol: string = 'USDT';
518
+ const nativeTokenSymbol = NativeTokenSymbols[network];
519
+
520
+ const tokenAAmount: string = '2000000';
521
+ const tokenBAmount: string = '2000000';
522
+ const nativeTokenAmount = '100000000000000000';
523
+
524
+ const sideToContractMethods = new Map([
525
+ [
526
+ SwapSide.SELL,
527
+ [
528
+ ContractMethod.simpleSwap,
529
+ ContractMethod.multiSwap,
530
+ ContractMethod.megaSwap,
531
+ ContractMethod.directUniV3Swap,
532
+ ],
533
+ ],
534
+ [
535
+ SwapSide.BUY,
536
+ [
537
+ ContractMethod.simpleBuy,
538
+ ContractMethod.buy,
539
+ ContractMethod.directUniV3Buy,
540
+ ],
541
+ ],
542
+ ]);
543
+
544
+ sideToContractMethods.forEach((contractMethods, side) =>
545
+ contractMethods.forEach((contractMethod: ContractMethod) => {
546
+ describe(`${contractMethod}`, () => {
547
+ it(`${network} ${side} ${contractMethod} ${nativeTokenSymbol} -> ${tokenASymbol}`, async () => {
548
+ await testE2E(
549
+ tokens[nativeTokenSymbol],
550
+ tokens[tokenASymbol],
551
+ holders[nativeTokenSymbol],
552
+ side === SwapSide.SELL ? nativeTokenAmount : tokenAAmount,
553
+ side,
554
+ dexKey,
555
+ contractMethod,
556
+ network,
557
+ provider,
558
+ );
559
+ });
560
+ it(`${network} ${side} ${contractMethod} ${tokenASymbol} -> ${nativeTokenSymbol}`, async () => {
561
+ await testE2E(
562
+ tokens[tokenASymbol],
563
+ tokens[nativeTokenSymbol],
564
+ holders[tokenASymbol],
565
+ side === SwapSide.SELL ? tokenAAmount : nativeTokenAmount,
566
+ side,
567
+ dexKey,
568
+ contractMethod,
569
+ network,
570
+ provider,
571
+ );
572
+ });
573
+ it(`${network} ${side} ${contractMethod} ${tokenASymbol} -> ${tokenBSymbol}`, async () => {
574
+ await testE2E(
575
+ tokens[tokenASymbol],
576
+ tokens[tokenBSymbol],
577
+ holders[tokenASymbol],
578
+ side === SwapSide.SELL ? tokenAAmount : tokenBAmount,
579
+ side,
580
+ dexKey,
581
+ contractMethod,
582
+ network,
583
+ provider,
584
+ );
585
+ });
586
+ });
587
+ }),
588
+ );
589
+ });
590
+ });
504
591
  });
@@ -624,3 +624,138 @@ describe('RamsesV2', () => {
624
624
  expect(falseChecksCounter).toBeLessThan(poolPrices!.length);
625
625
  });
626
626
  });
627
+
628
+ describe('ChronosV3', () => {
629
+ const dexKey = 'ChronosV3';
630
+ let blockNumber: number;
631
+ let uniswapV3: UniswapV3;
632
+ let uniswapV3Mainnet: UniswapV3;
633
+
634
+ const network = Network.ARBITRUM;
635
+ const dexHelper = new DummyDexHelper(network);
636
+ const TokenASymbol = 'USDCe';
637
+ const TokenA = Tokens[network][TokenASymbol];
638
+
639
+ const TokenBSymbol = 'USDT';
640
+ const TokenB = Tokens[network][TokenBSymbol];
641
+
642
+ beforeEach(async () => {
643
+ blockNumber = await dexHelper.web3Provider.eth.getBlockNumber();
644
+ uniswapV3 = new UniswapV3(network, dexKey, dexHelper);
645
+ uniswapV3Mainnet = new UniswapV3(
646
+ Network.ARBITRUM,
647
+ dexKey,
648
+ dexHelper,
649
+ );
650
+ });
651
+
652
+ it('getPoolIdentifiers and getPricesVolume SELL', async function () {
653
+
654
+ const amounts = [0n, BI_POWS[6], 2000000n];
655
+
656
+ const pools = await uniswapV3.getPoolIdentifiers(
657
+ TokenA,
658
+ TokenB,
659
+ SwapSide.SELL,
660
+ blockNumber,
661
+ );
662
+ console.log(`${TokenASymbol} <> ${TokenBSymbol} Pool Identifiers: `, pools);
663
+
664
+ expect(pools.length).toBeGreaterThan(0);
665
+
666
+ const poolPrices = await uniswapV3.getPricesVolume(
667
+ TokenA,
668
+ TokenB,
669
+ amounts,
670
+ SwapSide.SELL,
671
+ blockNumber,
672
+ pools,
673
+ );
674
+ console.log(`${TokenASymbol} <> ${TokenBSymbol} Pool Prices: `, poolPrices);
675
+
676
+ expect(poolPrices).not.toBeNull();
677
+ checkPoolPrices(poolPrices!, amounts, SwapSide.SELL, dexKey);
678
+
679
+ let falseChecksCounter = 0;
680
+ await Promise.all(
681
+ poolPrices!.map(async price => {
682
+ const fee = uniswapV3.eventPools[price.poolIdentifier!]!.feeCode;
683
+ const res = await checkOnChainPricing(
684
+ dexHelper,
685
+ uniswapV3,
686
+ 'quoteExactInputSingle',
687
+ blockNumber,
688
+ '0x6E7f0Ca45171a4440c0CDdF3A46A8dC5D4c2d4A0',
689
+ price.prices,
690
+ TokenA.address,
691
+ TokenB.address,
692
+ fee,
693
+ amounts,
694
+ );
695
+ if (res === false) falseChecksCounter++;
696
+ }),
697
+ );
698
+
699
+ expect(falseChecksCounter).toBeLessThan(poolPrices!.length);
700
+ });
701
+
702
+ it('getPoolIdentifiers and getPricesVolume BUY', async function () {
703
+
704
+ const amounts = [0n, BI_POWS[6], 2000000n];
705
+
706
+ const pools = await uniswapV3.getPoolIdentifiers(
707
+ TokenA,
708
+ TokenB,
709
+ SwapSide.BUY,
710
+ blockNumber,
711
+ );
712
+ console.log(`${TokenASymbol} <> ${TokenBSymbol} Pool Identifiers: `, pools);
713
+
714
+ expect(pools.length).toBeGreaterThan(0);
715
+
716
+ const poolPrices = await uniswapV3.getPricesVolume(
717
+ TokenA,
718
+ TokenB,
719
+ amounts,
720
+ SwapSide.BUY,
721
+ blockNumber,
722
+ pools,
723
+ );
724
+ console.log(`${TokenASymbol} <> ${TokenBSymbol} Pool Prices: `, poolPrices);
725
+
726
+ expect(poolPrices).not.toBeNull();
727
+ checkPoolPrices(poolPrices!, amounts, SwapSide.SELL, dexKey);
728
+
729
+ let falseChecksCounter = 0;
730
+ await Promise.all(
731
+ poolPrices!.map(async price => {
732
+ const fee = uniswapV3.eventPools[price.poolIdentifier!]!.feeCode;
733
+ const res = await checkOnChainPricing(
734
+ dexHelper,
735
+ uniswapV3,
736
+ 'quoteExactOutputSingle',
737
+ blockNumber,
738
+ '0x6E7f0Ca45171a4440c0CDdF3A46A8dC5D4c2d4A0',
739
+ price.prices,
740
+ TokenA.address,
741
+ TokenB.address,
742
+ fee,
743
+ amounts,
744
+ );
745
+ if (res === false) falseChecksCounter++;
746
+ }),
747
+ );
748
+
749
+ expect(falseChecksCounter).toBeLessThan(poolPrices!.length);
750
+ });
751
+
752
+ it.skip('getTopPoolsForToken', async function () {
753
+ const poolLiquidity = await uniswapV3.getTopPoolsForToken(
754
+ TokenB.address,
755
+ 10,
756
+ );
757
+ console.log(`${TokenASymbol} Top Pools:`, poolLiquidity);
758
+
759
+ checkPoolsLiquidity(poolLiquidity, TokenB.address, dexKey);
760
+ });
761
+ });
@@ -91,7 +91,7 @@ export class UniswapV3
91
91
 
92
92
  public static dexKeysWithNetwork: { key: string; networks: Network[] }[] =
93
93
  getDexKeysWithNetwork(
94
- _.pick(UniswapV3Config, ['UniswapV3', 'QuickSwapV3.1', 'RamsesV2']),
94
+ _.pick(UniswapV3Config, ['UniswapV3', 'QuickSwapV3.1', 'RamsesV2', 'ChronosV3']),
95
95
  );
96
96
 
97
97
  logger: Logger;
@@ -120,7 +120,7 @@ export class UniswapV3
120
120
  this.stateMultiContract = new this.dexHelper.web3Provider.eth.Contract(
121
121
  this.config.stateMultiCallAbi !== undefined
122
122
  ? this.config.stateMultiCallAbi
123
- : (UniswapV3StateMulticallABI as AbiItem[]),
123
+ : UniswapV3StateMulticallABI as AbiItem[],
124
124
  this.config.stateMulticall,
125
125
  );
126
126
 
@@ -279,7 +279,7 @@ export class UniswapV3
279
279
  e,
280
280
  );
281
281
  } else {
282
- // on unkown error mark as failed and increase retryCount for retry init strategy
282
+ // on unknown error mark as failed and increase retryCount for retry init strategy
283
283
  // note: state would be null by default which allows to fallback
284
284
  this.logger.warn(
285
285
  `${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}`,
@@ -1059,8 +1059,7 @@ export class UniswapV3
1059
1059
  initHash: this.config.initHash,
1060
1060
  subgraphURL: this.config.subgraphURL,
1061
1061
  stateMultiCallAbi: this.config.stateMultiCallAbi,
1062
- decodeStateMultiCallResultWithRelativeBitmaps:
1063
- this.config.decodeStateMultiCallResultWithRelativeBitmaps,
1062
+ decodeStateMultiCallResultWithRelativeBitmaps: this.config.decodeStateMultiCallResultWithRelativeBitmaps,
1064
1063
  };
1065
1064
  return newConfig;
1066
1065
  }