@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.
- package/.idea/aws.xml +17 -0
- package/.idea/codeStyles/Project.xml +19 -0
- package/.idea/codeStyles/codeStyleConfig.xml +5 -0
- package/.idea/misc.xml +6 -0
- package/.idea/modules.xml +8 -0
- package/.idea/paraswap-dex-lib.iml +9 -0
- package/.idea/vcs.xml +6 -0
- package/build/abi/curve-v1/StableSwapFRXETH.json +889 -0
- package/build/abi/curve-v1/StableSwapWBETH.json +1223 -0
- package/build/abi/uniswap-v3/pancakeswap-v3/PancakeswapV3QuoterV2.abi.json +285 -0
- package/build/abi/uniswap-v3/pancakeswap-v3/PancakeswapV3Router.abi.json +583 -0
- package/build/abi/wBETH.json +1527 -0
- package/build/abi/woo-fi/WooFeeManager.abi.json +318 -0
- package/build/abi/woo-fi/WooPP.abi.json +548 -0
- package/build/abi/woo-fi/Wooracle.abi.json +260 -0
- package/build/dex/aave-v3/tokens/arbitrum.json +50 -0
- package/build/dex/aave-v3/tokens/avalanche.json +74 -0
- package/build/dex/aave-v3/tokens/fantom.json +62 -0
- package/build/dex/aave-v3/tokens/optimism.json +50 -0
- package/build/dex/aave-v3/tokens/polygon.json +116 -0
- package/build/dex/balancer-v2/LinearMath.d.ts +19 -0
- package/build/dex/balancer-v2/LinearMath.js +179 -0
- package/build/dex/balancer-v2/LinearMath.js.map +1 -0
- package/build/dex/balancer-v2/LinearPool.d.ts +47 -0
- package/build/dex/balancer-v2/LinearPool.js +324 -0
- package/build/dex/balancer-v2/LinearPool.js.map +1 -0
- package/build/dex/balancer-v2/PhantomStablePool.d.ts +47 -0
- package/build/dex/balancer-v2/PhantomStablePool.js +294 -0
- package/build/dex/balancer-v2/PhantomStablePool.js.map +1 -0
- package/build/dex/balancer-v2/StableMath.d.ts +9 -0
- package/build/dex/balancer-v2/StableMath.js +272 -0
- package/build/dex/balancer-v2/StableMath.js.map +1 -0
- package/build/dex/balancer-v2/balancer-v2-pool.d.ts +75 -0
- package/build/dex/balancer-v2/balancer-v2-pool.js +417 -0
- package/build/dex/balancer-v2/balancer-v2-pool.js.map +1 -0
- package/build/dex/balancer-v2/balancer-v2.js +2 -0
- package/build/dex/balancer-v2/balancer-v2.js.map +1 -1
- package/build/dex/balancer-v2/optimizer.js +51 -38
- package/build/dex/balancer-v2/optimizer.js.map +1 -1
- package/build/dex/balancer-v2/types.d.ts +4 -0
- package/build/dex/balancer-v2/types.js.map +1 -1
- package/build/dex/curve-v1/pools/frxETHpool.d.ts +7 -0
- package/build/dex/curve-v1/pools/frxETHpool.js +27 -0
- package/build/dex/curve-v1/pools/frxETHpool.js.map +1 -0
- package/build/dex/curve-v1/pools/wbETHpool.d.ts +29 -0
- package/build/dex/curve-v1/pools/wbETHpool.js +408 -0
- package/build/dex/curve-v1/pools/wbETHpool.js.map +1 -0
- package/build/dex/curve-v1-factory/price-handlers/functions/calc_token_amount.js +26 -1
- package/build/dex/curve-v1-factory/price-handlers/functions/calc_token_amount.js.map +1 -1
- package/build/dex/pancakeswap-v3/types.d.ts +14 -0
- package/build/dex/pancakeswap-v3/types.js +3 -0
- package/build/dex/pancakeswap-v3/types.js.map +1 -0
- package/build/dex/quickswap-v3.d.ts +21 -0
- package/build/dex/quickswap-v3.js +40 -0
- package/build/dex/quickswap-v3.js.map +1 -0
- package/build/dex/ramses-v2/config.d.ts +4 -0
- package/build/dex/ramses-v2/config.js +28 -0
- package/build/dex/ramses-v2/config.js.map +1 -0
- package/build/dex/ramses-v2/constants.d.ts +28 -0
- package/build/dex/ramses-v2/constants.js +35 -0
- package/build/dex/ramses-v2/constants.js.map +1 -0
- package/build/dex/ramses-v2/contract-math/BitMath.d.ts +4 -0
- package/build/dex/ramses-v2/contract-math/BitMath.js +93 -0
- package/build/dex/ramses-v2/contract-math/BitMath.js.map +1 -0
- package/build/dex/ramses-v2/contract-math/FixedPoint128.d.ts +3 -0
- package/build/dex/ramses-v2/contract-math/FixedPoint128.js +8 -0
- package/build/dex/ramses-v2/contract-math/FixedPoint128.js.map +1 -0
- package/build/dex/ramses-v2/contract-math/FixedPoint96.d.ts +4 -0
- package/build/dex/ramses-v2/contract-math/FixedPoint96.js +9 -0
- package/build/dex/ramses-v2/contract-math/FixedPoint96.js.map +1 -0
- package/build/dex/ramses-v2/contract-math/FullMath.d.ts +4 -0
- package/build/dex/ramses-v2/contract-math/FullMath.js +19 -0
- package/build/dex/ramses-v2/contract-math/FullMath.js.map +1 -0
- package/build/dex/ramses-v2/contract-math/LiquidityMath.d.ts +3 -0
- package/build/dex/ramses-v2/contract-math/LiquidityMath.js +22 -0
- package/build/dex/ramses-v2/contract-math/LiquidityMath.js.map +1 -0
- package/build/dex/ramses-v2/contract-math/Oracle.d.ts +10 -0
- package/build/dex/ramses-v2/contract-math/Oracle.js +133 -0
- package/build/dex/ramses-v2/contract-math/Oracle.js.map +1 -0
- package/build/dex/ramses-v2/contract-math/SqrtPriceMath.d.ts +10 -0
- package/build/dex/ramses-v2/contract-math/SqrtPriceMath.js +91 -0
- package/build/dex/ramses-v2/contract-math/SqrtPriceMath.js.map +1 -0
- package/build/dex/ramses-v2/contract-math/SwapMath.d.ts +8 -0
- package/build/dex/ramses-v2/contract-math/SwapMath.js +70 -0
- package/build/dex/ramses-v2/contract-math/SwapMath.js.map +1 -0
- package/build/dex/ramses-v2/contract-math/Tick.d.ts +7 -0
- package/build/dex/ramses-v2/contract-math/Tick.js +45 -0
- package/build/dex/ramses-v2/contract-math/Tick.js.map +1 -0
- package/build/dex/ramses-v2/contract-math/TickBitMap.d.ts +8 -0
- package/build/dex/ramses-v2/contract-math/TickBitMap.js +87 -0
- package/build/dex/ramses-v2/contract-math/TickBitMap.js.map +1 -0
- package/build/dex/ramses-v2/contract-math/TickMath.d.ts +8 -0
- package/build/dex/ramses-v2/contract-math/TickMath.js +162 -0
- package/build/dex/ramses-v2/contract-math/TickMath.js.map +1 -0
- package/build/dex/ramses-v2/contract-math/UnsafeMath.d.ts +3 -0
- package/build/dex/ramses-v2/contract-math/UnsafeMath.js +10 -0
- package/build/dex/ramses-v2/contract-math/UnsafeMath.js.map +1 -0
- package/build/dex/ramses-v2/contract-math/uniswap-v3-math.d.ts +18 -0
- package/build/dex/ramses-v2/contract-math/uniswap-v3-math.js +392 -0
- package/build/dex/ramses-v2/contract-math/uniswap-v3-math.js.map +1 -0
- package/build/dex/ramses-v2/contract-math/utils.d.ts +3 -0
- package/build/dex/ramses-v2/contract-math/utils.js +16 -0
- package/build/dex/ramses-v2/contract-math/utils.js.map +1 -0
- package/build/dex/ramses-v2/ramses-v2-pool.d.ts +42 -0
- package/build/dex/ramses-v2/ramses-v2-pool.js +307 -0
- package/build/dex/ramses-v2/ramses-v2-pool.js.map +1 -0
- package/build/dex/ramses-v2/ramses-v2.d.ts +61 -0
- package/build/dex/ramses-v2/ramses-v2.js +690 -0
- package/build/dex/ramses-v2/ramses-v2.js.map +1 -0
- package/build/dex/ramses-v2/types.d.ts +154 -0
- package/build/dex/ramses-v2/types.js +9 -0
- package/build/dex/ramses-v2/types.js.map +1 -0
- package/build/dex/ramses-v2/utils.d.ts +6 -0
- package/build/dex/ramses-v2/utils.js +71 -0
- package/build/dex/ramses-v2/utils.js.map +1 -0
- package/build/dex/uniswap-v3/config.js +14 -0
- package/build/dex/uniswap-v3/config.js.map +1 -1
- package/build/dex/uniswap-v3/forks/pancakeswap-v3/pancakeswap-v3.d.ts +12 -0
- package/build/dex/uniswap-v3/forks/pancakeswap-v3/pancakeswap-v3.js +23 -0
- package/build/dex/uniswap-v3/forks/pancakeswap-v3/pancakeswap-v3.js.map +1 -0
- package/build/dex/uniswap-v3/uniswap-v3.js +2 -2
- package/build/dex/uniswap-v3/uniswap-v3.js.map +1 -1
- package/build/dex/woo-fi/config.d.ts +4 -0
- package/build/dex/woo-fi/config.js +141 -0
- package/build/dex/woo-fi/config.js.map +1 -0
- package/build/dex/woo-fi/constants.d.ts +5 -0
- package/build/dex/woo-fi/constants.js +20 -0
- package/build/dex/woo-fi/constants.js.map +1 -0
- package/build/dex/woo-fi/types.d.ts +48 -0
- package/build/dex/woo-fi/types.js +3 -0
- package/build/dex/woo-fi/types.js.map +1 -0
- package/build/dex/woo-fi/woo-fi-decimal-math.d.ts +14 -0
- package/build/dex/woo-fi/woo-fi-decimal-math.js +42 -0
- package/build/dex/woo-fi/woo-fi-decimal-math.js.map +1 -0
- package/build/dex/woo-fi/woo-fi-math.d.ts +31 -0
- package/build/dex/woo-fi/woo-fi-math.js +300 -0
- package/build/dex/woo-fi/woo-fi-math.js.map +1 -0
- package/build/dex/woo-fi/woo-fi.d.ts +65 -0
- package/build/dex/woo-fi/woo-fi.js +480 -0
- package/build/dex/woo-fi/woo-fi.js.map +1 -0
- package/package.json +2 -1
- package/scripts/dex-integration.ts +1 -1
- package/src/dex/balancer-v2/balancer-v2.ts +2 -0
- package/src/dex/balancer-v2/optimizer.ts +62 -49
- package/src/dex/balancer-v2/types.ts +4 -0
- package/src/dex/curve-v1-factory/price-handlers/functions/calc_token_amount.ts +33 -1
- package/src/dex/uniswap-v3/config.ts +16 -0
- package/src/dex/uniswap-v3/uniswap-v3-e2e.test.ts +87 -0
- package/src/dex/uniswap-v3/uniswap-v3-integration.test.ts +135 -0
- package/src/dex/uniswap-v3/uniswap-v3.ts +4 -5
|
@@ -1,70 +1,83 @@
|
|
|
1
|
-
import
|
|
2
|
-
import {
|
|
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
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
):
|
|
16
|
-
|
|
17
|
-
let
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
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
|
-
|
|
39
|
-
BigInt(
|
|
36
|
+
lastExchangeSwap.destAmount = (
|
|
37
|
+
BigInt(lastExchangeSwap.destAmount) + BigInt(currentSwap.destAmount)
|
|
40
38
|
).toString();
|
|
41
39
|
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
parseFloat(
|
|
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
|
-
|
|
50
|
-
poolId:
|
|
51
|
-
amount:
|
|
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
|
-
|
|
55
|
+
lastExchangeSwap.poolAddresses!.push(currentSwap.poolAddresses![0]);
|
|
54
56
|
} else {
|
|
55
|
-
|
|
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
|
-
|
|
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.
|
|
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]:
|
|
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
|
-
:
|
|
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
|
|
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
|
}
|