@paraswap/dex-lib 3.6.2 → 3.6.3
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/build/dex/aave-v1/aave-v1.d.ts +1 -2
- package/build/dex/aave-v1/aave-v1.js +0 -23
- package/build/dex/aave-v1/aave-v1.js.map +1 -1
- package/build/dex/compound.js +1 -1
- package/build/dex/compound.js.map +1 -1
- package/build/dex/etherfi/etherfi.d.ts +26 -0
- package/build/dex/etherfi/etherfi.js +96 -0
- package/build/dex/etherfi/etherfi.js.map +1 -0
- package/build/dex/index.js +2 -0
- package/build/dex/index.js.map +1 -1
- package/build/dex/maverick-v2/config.d.ts +2 -2
- package/build/dex/maverick-v2/config.js +16 -9
- package/build/dex/maverick-v2/config.js.map +1 -1
- package/build/dex/maverick-v2/maverick-math/maverick-basic-math.js +3 -3
- package/build/dex/maverick-v2/maverick-math/maverick-basic-math.js.map +1 -1
- package/build/dex/maverick-v2/maverick-math/maverick-bin-math.js +4 -4
- package/build/dex/maverick-v2/maverick-math/maverick-bin-math.js.map +1 -1
- package/build/dex/maverick-v2/maverick-math/maverick-math.js +3 -3
- package/build/dex/maverick-v2/maverick-math/maverick-math.js.map +1 -1
- package/build/dex/maverick-v2/maverick-math/maverick-pool-math.js +13 -13
- package/build/dex/maverick-v2/maverick-math/maverick-pool-math.js.map +1 -1
- package/build/dex/maverick-v2/maverick-math/maverick-swap-math.js +1 -1
- package/build/dex/maverick-v2/maverick-math/maverick-swap-math.js.map +1 -1
- package/build/dex/maverick-v2/maverick-math/maverick-tick-math.js +4 -4
- package/build/dex/maverick-v2/maverick-math/maverick-tick-math.js.map +1 -1
- package/build/dex/maverick-v2/maverick-math/maverick-twa-math.js +3 -3
- package/build/dex/maverick-v2/maverick-math/maverick-twa-math.js.map +1 -1
- package/build/dex/maverick-v2/maverick-v2-pool.d.ts +12 -9
- package/build/dex/maverick-v2/maverick-v2-pool.js +71 -16
- package/build/dex/maverick-v2/maverick-v2-pool.js.map +1 -1
- package/build/dex/maverick-v2/maverick-v2.d.ts +4 -8
- package/build/dex/maverick-v2/maverick-v2.js +62 -90
- package/build/dex/maverick-v2/maverick-v2.js.map +1 -1
- package/build/dex/maverick-v2/types.d.ts +1 -2
- package/build/dex/platypus/platypus.d.ts +1 -2
- package/build/dex/platypus/platypus.js +0 -45
- package/build/dex/platypus/platypus.js.map +1 -1
- package/build/dex/sdai/config.d.ts +11 -0
- package/build/dex/sdai/config.js +21 -0
- package/build/dex/sdai/config.js.map +1 -0
- package/build/dex/sdai/constants.d.ts +2 -0
- package/build/dex/sdai/constants.js +6 -0
- package/build/dex/sdai/constants.js.map +1 -0
- package/build/dex/sdai/scripts/validate-state.js +102 -0
- package/build/dex/sdai/scripts/validate-state.js.map +1 -0
- package/build/dex/sdai/sdai-pool.d.ts +16 -0
- package/build/dex/sdai/sdai-pool.js +85 -0
- package/build/dex/sdai/sdai-pool.js.map +1 -0
- package/build/dex/sdai/sdai.d.ts +51 -0
- package/build/dex/sdai/sdai.js +172 -0
- package/build/dex/sdai/sdai.js.map +1 -0
- package/build/dex/sdai/types.d.ts +21 -0
- package/build/dex/sdai/types.js +11 -0
- package/build/dex/sdai/types.js.map +1 -0
- package/build/dex/sdai/utils.d.ts +4 -0
- package/build/dex/sdai/utils.js +39 -0
- package/build/dex/sdai/utils.js.map +1 -0
- package/build/dex/stable-pool.js +8 -1
- package/build/dex/stable-pool.js.map +1 -1
- package/build/dex/swaap-v1/swaap-v1.d.ts +1 -2
- package/build/dex/swaap-v1/swaap-v1.js +0 -14
- package/build/dex/swaap-v1/swaap-v1.js.map +1 -1
- package/package.json +1 -1
- package/src/abi/maverick-v2/MaverickV2Pool.json +1234 -0
- package/src/abi/maverick-v2/MaverickV2PoolLens.json +1232 -0
- package/src/abi/maverick-v2/MaverickV2Quoter.json +278 -0
- package/src/dex/index.ts +2 -0
- package/src/dex/maverick-v2/config.ts +28 -0
- package/src/dex/maverick-v2/maverick-math/maverick-basic-math.ts +152 -0
- package/src/dex/maverick-v2/maverick-math/maverick-bin-math.ts +288 -0
- package/src/dex/maverick-v2/maverick-math/maverick-delta-math.ts +32 -0
- package/src/dex/maverick-v2/maverick-math/maverick-math.ts +30 -0
- package/src/dex/maverick-v2/maverick-math/maverick-pool-lib.ts +42 -0
- package/src/dex/maverick-v2/maverick-math/maverick-pool-math.ts +709 -0
- package/src/dex/maverick-v2/maverick-math/maverick-swap-math.ts +199 -0
- package/src/dex/maverick-v2/maverick-math/maverick-tick-math.ts +171 -0
- package/src/dex/maverick-v2/maverick-math/maverick-twa-math.ts +54 -0
- package/src/dex/maverick-v2/maverick-v2-e2e.test.ts +193 -0
- package/src/dex/maverick-v2/maverick-v2-events.test.ts +112 -0
- package/src/dex/maverick-v2/maverick-v2-integration.test.ts +283 -0
- package/src/dex/maverick-v2/maverick-v2-pool.ts +346 -0
- package/src/dex/maverick-v2/maverick-v2.ts +380 -0
- package/src/dex/maverick-v2/types.ts +151 -0
- package/tests/constants-e2e.ts +2 -2
- package/.vscode/launch.json +0 -53
- package/.vscode/settings.json +0 -2
- package/.vscode/tasks.json +0 -15
- package/build/abi/uniswap-v3/AlienBaseV3Router.abi.json +0 -52
- package/build/abi/wombat/pool.json +0 -1289
- package/build/dex/aave-v2/tokens-avalanche.json +0 -44
- package/build/dex/aave-v2/tokens-mainnet.json +0 -188
- package/build/dex/aave-v2/tokens-polygon.json +0 -44
- package/build/dex/maker-psm/scripts/gem.abi.json +0 -136
- package/build/dex/maker-psm/scripts/validate-state.d.ts +0 -0
- package/build/dex/maker-psm/scripts/validate-state.js +0 -185
- package/build/dex/maker-psm/scripts/validate-state.js.map +0 -1
- package/build/dex/maker-psm/scripts/vat.abi.json +0 -243
- package/build/dex/solidly-v3/scripts/check-event-pool-event.js +0 -53
- package/build/dex/solidly-v3/scripts/check-event-pool-event.js.map +0 -1
- package/build/dex/uniswap-v3/forks/alien-base-v3/alien-base-v3.d.ts +0 -17
- package/build/dex/uniswap-v3/forks/alien-base-v3/alien-base-v3.js +0 -64
- package/build/dex/uniswap-v3/forks/alien-base-v3/alien-base-v3.js.map +0 -1
- package/build/dex/uniswap-v3/forks/alien-v3/alien-v3.d.ts +0 -17
- package/build/dex/uniswap-v3/forks/alien-v3/alien-v3.js +0 -79
- package/build/dex/uniswap-v3/forks/alien-v3/alien-v3.js.map +0 -1
- package/src/dex/maker-psm/scripts/gem.abi.json +0 -136
- package/src/dex/maker-psm/scripts/validate-state.ts +0 -221
- package/src/dex/maker-psm/scripts/vat.abi.json +0 -243
- /package/build/dex/{solidly-v3/scripts/check-event-pool-event.d.ts → sdai/scripts/validate-state.d.ts} +0 -0
|
@@ -0,0 +1,199 @@
|
|
|
1
|
+
import { BI_POWS } from '../../../bigint-constants';
|
|
2
|
+
import { _require } from '../../../utils';
|
|
3
|
+
import { TickData } from '../types';
|
|
4
|
+
import { Delta } from './maverick-delta-math';
|
|
5
|
+
import { MaverickBasicMath } from './maverick-basic-math';
|
|
6
|
+
|
|
7
|
+
export class MaverickSwapMath {
|
|
8
|
+
static amountToBinNetOfProtocolFee(
|
|
9
|
+
deltaInErc: bigint,
|
|
10
|
+
feeBasis: bigint,
|
|
11
|
+
protocolFeeD3: bigint,
|
|
12
|
+
): bigint {
|
|
13
|
+
return protocolFeeD3 != 0n
|
|
14
|
+
? MaverickBasicMath.clip(
|
|
15
|
+
deltaInErc,
|
|
16
|
+
MaverickBasicMath.mulDivUp(feeBasis, protocolFeeD3, BI_POWS[3]),
|
|
17
|
+
)
|
|
18
|
+
: deltaInErc;
|
|
19
|
+
}
|
|
20
|
+
|
|
21
|
+
static remainingBinInputSpaceGivenOutput(
|
|
22
|
+
binLiquidity: bigint,
|
|
23
|
+
output: bigint,
|
|
24
|
+
sqrtPrice: bigint,
|
|
25
|
+
tokenAIn: boolean,
|
|
26
|
+
): bigint {
|
|
27
|
+
let outOverL =
|
|
28
|
+
binLiquidity === 0n ? 0n : MaverickBasicMath.divUp(output, binLiquidity);
|
|
29
|
+
|
|
30
|
+
if (tokenAIn) {
|
|
31
|
+
return MaverickBasicMath.mulDivUp(
|
|
32
|
+
output,
|
|
33
|
+
sqrtPrice,
|
|
34
|
+
MaverickBasicMath.invFloor(sqrtPrice) - outOverL,
|
|
35
|
+
);
|
|
36
|
+
} else {
|
|
37
|
+
return MaverickBasicMath.divUp(
|
|
38
|
+
output,
|
|
39
|
+
MaverickBasicMath.mulDown(sqrtPrice, sqrtPrice - outOverL),
|
|
40
|
+
);
|
|
41
|
+
}
|
|
42
|
+
}
|
|
43
|
+
|
|
44
|
+
static computeSwapExactIn(
|
|
45
|
+
sqrtPrice: bigint,
|
|
46
|
+
tickData: TickData,
|
|
47
|
+
amountIn: bigint,
|
|
48
|
+
tokenAIn: boolean,
|
|
49
|
+
fee: bigint,
|
|
50
|
+
protocolFeeD3: bigint,
|
|
51
|
+
): Delta {
|
|
52
|
+
let delta: Delta = {
|
|
53
|
+
deltaInBinInternal: 0n,
|
|
54
|
+
deltaInErc: 0n,
|
|
55
|
+
deltaOutErc: 0n,
|
|
56
|
+
excess: 0n,
|
|
57
|
+
tokenAIn: tokenAIn,
|
|
58
|
+
exactOutput: false,
|
|
59
|
+
swappedToMaxPrice: false,
|
|
60
|
+
skipCombine: false,
|
|
61
|
+
tickLimit: 0n,
|
|
62
|
+
sqrtLowerTickPrice: 0n,
|
|
63
|
+
sqrtUpperTickPrice: 0n,
|
|
64
|
+
sqrtPrice: 0n,
|
|
65
|
+
fractionalPart: 0n,
|
|
66
|
+
};
|
|
67
|
+
|
|
68
|
+
delta.deltaOutErc = tokenAIn
|
|
69
|
+
? tickData.currentReserveB
|
|
70
|
+
: tickData.currentReserveA;
|
|
71
|
+
|
|
72
|
+
let binAmountIn = this.remainingBinInputSpaceGivenOutput(
|
|
73
|
+
tickData.currentLiquidity,
|
|
74
|
+
delta.deltaOutErc,
|
|
75
|
+
sqrtPrice,
|
|
76
|
+
tokenAIn,
|
|
77
|
+
);
|
|
78
|
+
|
|
79
|
+
let feeBasis;
|
|
80
|
+
let userBinAmountIn = MaverickBasicMath.mulDown(
|
|
81
|
+
amountIn,
|
|
82
|
+
BI_POWS[18] - fee,
|
|
83
|
+
);
|
|
84
|
+
|
|
85
|
+
if (userBinAmountIn < binAmountIn) {
|
|
86
|
+
binAmountIn = userBinAmountIn;
|
|
87
|
+
delta.deltaInErc = amountIn;
|
|
88
|
+
feeBasis = delta.deltaInErc - userBinAmountIn;
|
|
89
|
+
} else {
|
|
90
|
+
feeBasis = MaverickBasicMath.mulDivUp(
|
|
91
|
+
binAmountIn,
|
|
92
|
+
fee,
|
|
93
|
+
BI_POWS[18] - fee,
|
|
94
|
+
);
|
|
95
|
+
delta.deltaInErc = binAmountIn + feeBasis;
|
|
96
|
+
delta.excess = MaverickBasicMath.clip(amountIn, delta.deltaInErc);
|
|
97
|
+
}
|
|
98
|
+
|
|
99
|
+
delta.deltaInBinInternal = this.amountToBinNetOfProtocolFee(
|
|
100
|
+
delta.deltaInErc,
|
|
101
|
+
feeBasis,
|
|
102
|
+
protocolFeeD3,
|
|
103
|
+
);
|
|
104
|
+
|
|
105
|
+
if (delta.excess != 0n) return delta;
|
|
106
|
+
|
|
107
|
+
let inOverL = MaverickBasicMath.divUp(
|
|
108
|
+
binAmountIn,
|
|
109
|
+
tickData.currentLiquidity + 1n,
|
|
110
|
+
);
|
|
111
|
+
|
|
112
|
+
delta.deltaOutErc = MaverickBasicMath.min(
|
|
113
|
+
delta.deltaOutErc,
|
|
114
|
+
MaverickBasicMath.mulDivDown(
|
|
115
|
+
binAmountIn,
|
|
116
|
+
tokenAIn ? MaverickBasicMath.invFloor(sqrtPrice) : sqrtPrice,
|
|
117
|
+
inOverL + (tokenAIn ? sqrtPrice : MaverickBasicMath.invCeil(sqrtPrice)),
|
|
118
|
+
),
|
|
119
|
+
);
|
|
120
|
+
|
|
121
|
+
return delta;
|
|
122
|
+
}
|
|
123
|
+
|
|
124
|
+
static computeSwapExactOut(
|
|
125
|
+
sqrtPrice: bigint,
|
|
126
|
+
tickData: TickData,
|
|
127
|
+
amountOut: bigint,
|
|
128
|
+
tokenAIn: boolean,
|
|
129
|
+
fee: bigint,
|
|
130
|
+
protocolFeeD3: bigint,
|
|
131
|
+
): Delta {
|
|
132
|
+
let delta: Delta = {
|
|
133
|
+
deltaInBinInternal: 0n,
|
|
134
|
+
deltaInErc: 0n,
|
|
135
|
+
deltaOutErc: 0n,
|
|
136
|
+
excess: 0n,
|
|
137
|
+
tokenAIn: false,
|
|
138
|
+
exactOutput: false,
|
|
139
|
+
swappedToMaxPrice: false,
|
|
140
|
+
skipCombine: false,
|
|
141
|
+
tickLimit: 0n,
|
|
142
|
+
sqrtLowerTickPrice: 0n,
|
|
143
|
+
sqrtUpperTickPrice: 0n,
|
|
144
|
+
sqrtPrice: 0n,
|
|
145
|
+
fractionalPart: 0n,
|
|
146
|
+
};
|
|
147
|
+
|
|
148
|
+
let amountOutAvailable = tokenAIn
|
|
149
|
+
? tickData.currentReserveB
|
|
150
|
+
: tickData.currentReserveA;
|
|
151
|
+
let swapped = amountOutAvailable <= amountOut;
|
|
152
|
+
delta.deltaOutErc = swapped ? amountOutAvailable : amountOut;
|
|
153
|
+
let binAmountIn = this.remainingBinInputSpaceGivenOutput(
|
|
154
|
+
tickData.currentLiquidity,
|
|
155
|
+
delta.deltaOutErc,
|
|
156
|
+
sqrtPrice,
|
|
157
|
+
tokenAIn,
|
|
158
|
+
);
|
|
159
|
+
|
|
160
|
+
let feeBasis = MaverickBasicMath.mulDivUp(
|
|
161
|
+
binAmountIn,
|
|
162
|
+
fee,
|
|
163
|
+
BI_POWS[18] - fee,
|
|
164
|
+
);
|
|
165
|
+
delta.deltaInErc = binAmountIn + feeBasis;
|
|
166
|
+
delta.deltaInBinInternal = this.amountToBinNetOfProtocolFee(
|
|
167
|
+
delta.deltaInErc,
|
|
168
|
+
feeBasis,
|
|
169
|
+
protocolFeeD3,
|
|
170
|
+
);
|
|
171
|
+
delta.excess = swapped
|
|
172
|
+
? MaverickBasicMath.clip(amountOut, delta.deltaOutErc)
|
|
173
|
+
: 0n;
|
|
174
|
+
|
|
175
|
+
return delta;
|
|
176
|
+
}
|
|
177
|
+
|
|
178
|
+
static computeEndPrice(delta: Delta, newDelta: Delta, tickData: TickData) {
|
|
179
|
+
let endSqrtPrice =
|
|
180
|
+
MaverickBasicMath.divDown(
|
|
181
|
+
newDelta.deltaInBinInternal,
|
|
182
|
+
tickData.currentLiquidity,
|
|
183
|
+
) +
|
|
184
|
+
(delta.tokenAIn
|
|
185
|
+
? delta.sqrtPrice
|
|
186
|
+
: MaverickBasicMath.invFloor(delta.sqrtPrice));
|
|
187
|
+
if (!delta.tokenAIn) {
|
|
188
|
+
endSqrtPrice = MaverickBasicMath.invFloor(endSqrtPrice);
|
|
189
|
+
}
|
|
190
|
+
|
|
191
|
+
newDelta.fractionalPart = MaverickBasicMath.min(
|
|
192
|
+
BI_POWS[8],
|
|
193
|
+
MaverickBasicMath.divDown(
|
|
194
|
+
MaverickBasicMath.clip(endSqrtPrice, delta.sqrtLowerTickPrice),
|
|
195
|
+
BI_POWS[10] * (delta.sqrtUpperTickPrice - delta.sqrtLowerTickPrice),
|
|
196
|
+
),
|
|
197
|
+
);
|
|
198
|
+
}
|
|
199
|
+
}
|
|
@@ -0,0 +1,171 @@
|
|
|
1
|
+
import { BI_MAX_UINT256, BI_POWS } from '../../../bigint-constants';
|
|
2
|
+
import { _require } from '../../../utils';
|
|
3
|
+
import { MaverickBasicMath } from './maverick-basic-math';
|
|
4
|
+
|
|
5
|
+
const MAX_TICK = 460540;
|
|
6
|
+
|
|
7
|
+
export class MaverickTickMath {
|
|
8
|
+
static getTickSqrtPriceAndL(
|
|
9
|
+
reserveA: bigint,
|
|
10
|
+
reserveB: bigint,
|
|
11
|
+
sqrtLowerTickPrice: bigint,
|
|
12
|
+
sqrtUpperTickPrice: bigint,
|
|
13
|
+
): [bigint, bigint] {
|
|
14
|
+
let liquidity = this.getTickL(
|
|
15
|
+
reserveA,
|
|
16
|
+
reserveB,
|
|
17
|
+
sqrtLowerTickPrice,
|
|
18
|
+
sqrtUpperTickPrice,
|
|
19
|
+
);
|
|
20
|
+
|
|
21
|
+
let sqrtPrice = this.getSqrtPrice(
|
|
22
|
+
reserveA,
|
|
23
|
+
reserveB,
|
|
24
|
+
sqrtLowerTickPrice,
|
|
25
|
+
sqrtUpperTickPrice,
|
|
26
|
+
liquidity,
|
|
27
|
+
);
|
|
28
|
+
|
|
29
|
+
return [sqrtPrice, liquidity];
|
|
30
|
+
}
|
|
31
|
+
|
|
32
|
+
static getSqrtPrice(
|
|
33
|
+
reserveA: bigint,
|
|
34
|
+
reserveB: bigint,
|
|
35
|
+
sqrtLowerTickPrice: bigint,
|
|
36
|
+
sqrtUpperTickPrice: bigint,
|
|
37
|
+
liquidity: bigint,
|
|
38
|
+
): bigint {
|
|
39
|
+
if (reserveA === 0n) {
|
|
40
|
+
return sqrtLowerTickPrice;
|
|
41
|
+
}
|
|
42
|
+
if (reserveB === 0n) {
|
|
43
|
+
return sqrtUpperTickPrice;
|
|
44
|
+
}
|
|
45
|
+
|
|
46
|
+
let sqrtPrice = MaverickBasicMath.sqrt(
|
|
47
|
+
BI_POWS[18] *
|
|
48
|
+
MaverickBasicMath.divDown(
|
|
49
|
+
reserveA + MaverickBasicMath.mulDown(liquidity, sqrtLowerTickPrice),
|
|
50
|
+
reserveB + MaverickBasicMath.divDown(liquidity, sqrtUpperTickPrice),
|
|
51
|
+
),
|
|
52
|
+
);
|
|
53
|
+
|
|
54
|
+
return MaverickBasicMath.min(
|
|
55
|
+
MaverickBasicMath.max(sqrtPrice, sqrtLowerTickPrice),
|
|
56
|
+
sqrtUpperTickPrice,
|
|
57
|
+
);
|
|
58
|
+
}
|
|
59
|
+
|
|
60
|
+
static getTickL(
|
|
61
|
+
reserveA: bigint,
|
|
62
|
+
reserveB: bigint,
|
|
63
|
+
sqrtLowerTickPrice: bigint,
|
|
64
|
+
sqrtUpperTickPrice: bigint,
|
|
65
|
+
): bigint {
|
|
66
|
+
let precisionBump = 0n;
|
|
67
|
+
|
|
68
|
+
if (reserveA >> 78n === 0n && reserveB >> 78n === 0n) {
|
|
69
|
+
precisionBump = 57n;
|
|
70
|
+
reserveA <<= precisionBump;
|
|
71
|
+
reserveB <<= precisionBump;
|
|
72
|
+
}
|
|
73
|
+
|
|
74
|
+
let diff;
|
|
75
|
+
let b =
|
|
76
|
+
MaverickBasicMath.divDown(reserveA, sqrtUpperTickPrice) +
|
|
77
|
+
MaverickBasicMath.mulDown(reserveB, sqrtLowerTickPrice);
|
|
78
|
+
diff = sqrtUpperTickPrice - sqrtLowerTickPrice;
|
|
79
|
+
|
|
80
|
+
if (reserveA === 0n || reserveB === 0n)
|
|
81
|
+
return (
|
|
82
|
+
MaverickBasicMath.mulDivDown(b, sqrtUpperTickPrice, diff) >>
|
|
83
|
+
precisionBump
|
|
84
|
+
);
|
|
85
|
+
|
|
86
|
+
b >>= 1n;
|
|
87
|
+
|
|
88
|
+
return (
|
|
89
|
+
MaverickBasicMath.mulDiv(
|
|
90
|
+
b +
|
|
91
|
+
MaverickBasicMath.sqrt(
|
|
92
|
+
MaverickBasicMath.mulDiv(b, b, BI_POWS[18]) +
|
|
93
|
+
MaverickBasicMath.mulDiv(
|
|
94
|
+
MaverickBasicMath.mulFloor(reserveB, reserveA),
|
|
95
|
+
diff,
|
|
96
|
+
sqrtUpperTickPrice,
|
|
97
|
+
),
|
|
98
|
+
) *
|
|
99
|
+
BI_POWS[9],
|
|
100
|
+
sqrtUpperTickPrice,
|
|
101
|
+
diff,
|
|
102
|
+
) >> precisionBump
|
|
103
|
+
);
|
|
104
|
+
}
|
|
105
|
+
|
|
106
|
+
static tickSqrtPrices(tickSpacing: bigint, tick: bigint): [bigint, bigint] {
|
|
107
|
+
return [
|
|
108
|
+
this.tickSqrtPrice(tickSpacing, tick),
|
|
109
|
+
this.tickSqrtPrice(tickSpacing, tick + 1n),
|
|
110
|
+
];
|
|
111
|
+
}
|
|
112
|
+
|
|
113
|
+
static subTickIndex(tickSpacing: bigint, tick: bigint): bigint {
|
|
114
|
+
let subTick = MaverickBasicMath.abs(tick);
|
|
115
|
+
subTick *= tickSpacing;
|
|
116
|
+
if (subTick > MAX_TICK) {
|
|
117
|
+
throw new Error('OB');
|
|
118
|
+
}
|
|
119
|
+
return subTick;
|
|
120
|
+
}
|
|
121
|
+
|
|
122
|
+
static tickSqrtPrice(tickSpacing: bigint, _tick: bigint): bigint {
|
|
123
|
+
let tick = this.subTickIndex(tickSpacing, _tick);
|
|
124
|
+
|
|
125
|
+
let ratio: bigint =
|
|
126
|
+
(tick & 0x1n) != 0n
|
|
127
|
+
? 0xfffcb933bd6fad9d3af5f0b9f25db4d6n
|
|
128
|
+
: 0x100000000000000000000000000000000n;
|
|
129
|
+
if ((tick & 0x2n) != 0n)
|
|
130
|
+
ratio = (ratio * 0xfff97272373d41fd789c8cb37ffcaa1cn) >> 128n;
|
|
131
|
+
if ((tick & 0x4n) != 0n)
|
|
132
|
+
ratio = (ratio * 0xfff2e50f5f656ac9229c67059486f389n) >> 128n;
|
|
133
|
+
if ((tick & 0x8n) != 0n)
|
|
134
|
+
ratio = (ratio * 0xffe5caca7e10e81259b3cddc7a064941n) >> 128n;
|
|
135
|
+
if ((tick & 0x10n) != 0n)
|
|
136
|
+
ratio = (ratio * 0xffcb9843d60f67b19e8887e0bd251eb7n) >> 128n;
|
|
137
|
+
if ((tick & 0x20n) != 0n)
|
|
138
|
+
ratio = (ratio * 0xff973b41fa98cd2e57b660be99eb2c4an) >> 128n;
|
|
139
|
+
if ((tick & 0x40n) != 0n)
|
|
140
|
+
ratio = (ratio * 0xff2ea16466c9838804e327cb417cafcbn) >> 128n;
|
|
141
|
+
if ((tick & 0x80n) != 0n)
|
|
142
|
+
ratio = (ratio * 0xfe5dee046a99d51e2cc356c2f617dbe0n) >> 128n;
|
|
143
|
+
if ((tick & 0x100n) != 0n)
|
|
144
|
+
ratio = (ratio * 0xfcbe86c7900aecf64236ab31f1f9dcb5n) >> 128n;
|
|
145
|
+
if ((tick & 0x200n) != 0n)
|
|
146
|
+
ratio = (ratio * 0xf987a7253ac4d9194200696907cf2e37n) >> 128n;
|
|
147
|
+
if ((tick & 0x400n) != 0n)
|
|
148
|
+
ratio = (ratio * 0xf3392b0822b88206f8abe8a3b44dd9ben) >> 128n;
|
|
149
|
+
if ((tick & 0x800n) != 0n)
|
|
150
|
+
ratio = (ratio * 0xe7159475a2c578ef4f1d17b2b235d480n) >> 128n;
|
|
151
|
+
if ((tick & 0x1000n) != 0n)
|
|
152
|
+
ratio = (ratio * 0xd097f3bdfd254ee83bdd3f248e7e785en) >> 128n;
|
|
153
|
+
if ((tick & 0x2000n) != 0n)
|
|
154
|
+
ratio = (ratio * 0xa9f746462d8f7dd10e744d913d033333n) >> 128n;
|
|
155
|
+
if ((tick & 0x4000n) != 0n)
|
|
156
|
+
ratio = (ratio * 0x70d869a156ddd32a39e257bc3f50aa9bn) >> 128n;
|
|
157
|
+
if ((tick & 0x8000n) != 0n)
|
|
158
|
+
ratio = (ratio * 0x31be135f97da6e09a19dc367e3b6da40n) >> 128n;
|
|
159
|
+
if ((tick & 0x10000n) != 0n)
|
|
160
|
+
ratio = (ratio * 0x9aa508b5b7e5a9780b0cc4e25d61a56n) >> 128n;
|
|
161
|
+
if ((tick & 0x20000n) != 0n)
|
|
162
|
+
ratio = (ratio * 0x5d6af8dedbcb3a6ccb7ce618d14225n) >> 128n;
|
|
163
|
+
if ((tick & 0x40000n) != 0n)
|
|
164
|
+
ratio = (ratio * 0x2216e584f630389b2052b8db590en) >> 128n;
|
|
165
|
+
if ((tick & 0x80000n) != 0n)
|
|
166
|
+
ratio = (ratio * 0x48a1703920644d4030024fen) >> 128n;
|
|
167
|
+
if ((tick & 0x100000n) != 0n) ratio = (ratio * 0x149b34ee7b4532n) >> 128n;
|
|
168
|
+
if (_tick > 0) ratio = BI_MAX_UINT256 / ratio;
|
|
169
|
+
return (ratio * BI_POWS[18]) >> 128n;
|
|
170
|
+
}
|
|
171
|
+
}
|
|
@@ -0,0 +1,54 @@
|
|
|
1
|
+
import { BI_POWS } from '../../../bigint-constants';
|
|
2
|
+
import { _require } from '../../../utils';
|
|
3
|
+
import { PoolState } from '../types';
|
|
4
|
+
import { MaverickBasicMath } from './maverick-basic-math';
|
|
5
|
+
|
|
6
|
+
export class TwaMath {
|
|
7
|
+
static updateValue(
|
|
8
|
+
self: PoolState,
|
|
9
|
+
value: bigint,
|
|
10
|
+
lookback: bigint,
|
|
11
|
+
timestamp: bigint,
|
|
12
|
+
) {
|
|
13
|
+
if (timestamp === self.lastTimestamp) return;
|
|
14
|
+
self.lastTwaD8 = this.getTwa(self, lookback, timestamp);
|
|
15
|
+
self.lastTimestamp = timestamp;
|
|
16
|
+
self.lastLogPriceD8 = value;
|
|
17
|
+
}
|
|
18
|
+
|
|
19
|
+
static floor(self: PoolState) {
|
|
20
|
+
return MaverickBasicMath.floorD8Unchecked(self.lastTwaD8);
|
|
21
|
+
}
|
|
22
|
+
|
|
23
|
+
static getTwa(self: PoolState, lookback: bigint, timestamp: bigint): bigint {
|
|
24
|
+
let timeDiff = timestamp - self.lastTimestamp;
|
|
25
|
+
timeDiff = MaverickBasicMath.min(lookback, timeDiff);
|
|
26
|
+
if (timeDiff === 0n) return self.lastTwaD8;
|
|
27
|
+
|
|
28
|
+
let absValueDeviation = MaverickBasicMath.min(
|
|
29
|
+
BI_POWS[8],
|
|
30
|
+
MaverickBasicMath.abs(self.lastLogPriceD8 - self.lastTwaD8),
|
|
31
|
+
);
|
|
32
|
+
|
|
33
|
+
if (absValueDeviation === 0n) return self.lastTwaD8;
|
|
34
|
+
let twaDeviation = MaverickBasicMath.mulDivDown(
|
|
35
|
+
absValueDeviation,
|
|
36
|
+
timeDiff,
|
|
37
|
+
lookback,
|
|
38
|
+
);
|
|
39
|
+
|
|
40
|
+
return self.lastTwaD8 > self.lastLogPriceD8
|
|
41
|
+
? -twaDeviation + self.lastTwaD8
|
|
42
|
+
: twaDeviation + self.lastTwaD8;
|
|
43
|
+
}
|
|
44
|
+
|
|
45
|
+
static getTwaFloor(
|
|
46
|
+
self: PoolState,
|
|
47
|
+
lookback: bigint,
|
|
48
|
+
timestamp: bigint,
|
|
49
|
+
): bigint {
|
|
50
|
+
return MaverickBasicMath.floorD8Unchecked(
|
|
51
|
+
this.getTwa(self, lookback, timestamp),
|
|
52
|
+
);
|
|
53
|
+
}
|
|
54
|
+
}
|
|
@@ -0,0 +1,193 @@
|
|
|
1
|
+
/* eslint-disable no-console */
|
|
2
|
+
import dotenv from 'dotenv';
|
|
3
|
+
dotenv.config();
|
|
4
|
+
|
|
5
|
+
import { testE2E } from '../../../tests/utils-e2e';
|
|
6
|
+
import {
|
|
7
|
+
Tokens,
|
|
8
|
+
Holders,
|
|
9
|
+
NativeTokenSymbols,
|
|
10
|
+
} from '../../../tests/constants-e2e';
|
|
11
|
+
import { Network, ContractMethod, SwapSide } from '../../constants';
|
|
12
|
+
import { StaticJsonRpcProvider } from '@ethersproject/providers';
|
|
13
|
+
import { generateConfig } from '../../config';
|
|
14
|
+
import { ContractMethodV6 } from '@paraswap/sdk';
|
|
15
|
+
|
|
16
|
+
/*
|
|
17
|
+
README
|
|
18
|
+
======
|
|
19
|
+
|
|
20
|
+
This test script should add e2e tests for MaverickV2. The tests
|
|
21
|
+
should cover as many cases as possible. Most of the DEXes follow
|
|
22
|
+
the following test structure:
|
|
23
|
+
- DexName
|
|
24
|
+
- ForkName + Network
|
|
25
|
+
- ContractMethod
|
|
26
|
+
- ETH -> Token swap
|
|
27
|
+
- Token -> ETH swap
|
|
28
|
+
- Token -> Token swap
|
|
29
|
+
|
|
30
|
+
The template already enumerates the basic structure which involves
|
|
31
|
+
testing simpleSwap, multiSwap, megaSwap contract methods for
|
|
32
|
+
ETH <> TOKEN and TOKEN <> TOKEN swaps. You should replace tokenA and
|
|
33
|
+
tokenB with any two highly liquid tokens on MaverickV2 for the tests
|
|
34
|
+
to work. If the tokens that you would like to use are not defined in
|
|
35
|
+
Tokens or Holders map, you can update the './tests/constants-e2e'
|
|
36
|
+
|
|
37
|
+
Other than the standard cases that are already added by the template
|
|
38
|
+
it is highly recommended to add test cases which could be specific
|
|
39
|
+
to testing MaverickV2 (Eg. Tests based on poolType, special tokens,
|
|
40
|
+
etc).
|
|
41
|
+
|
|
42
|
+
You can run this individual test script by running:
|
|
43
|
+
`npx jest src/dex/<dex-name>/<dex-name>-e2e.test.ts`
|
|
44
|
+
|
|
45
|
+
e2e tests use the Tenderly fork api. Please add the following to your
|
|
46
|
+
.env file:
|
|
47
|
+
TENDERLY_TOKEN=Find this under Account>Settings>Authorization.
|
|
48
|
+
TENDERLY_ACCOUNT_ID=Your Tenderly account name.
|
|
49
|
+
TENDERLY_PROJECT=Name of a Tenderly project you have created in your
|
|
50
|
+
dashboard.
|
|
51
|
+
|
|
52
|
+
(This comment should be removed from the final implementation)
|
|
53
|
+
*/
|
|
54
|
+
|
|
55
|
+
function testForNetwork(
|
|
56
|
+
network: Network,
|
|
57
|
+
dexKey: string,
|
|
58
|
+
tokenASymbol: string,
|
|
59
|
+
tokenBSymbol: string,
|
|
60
|
+
tokenAAmount: string,
|
|
61
|
+
tokenBAmount: string,
|
|
62
|
+
nativeTokenAmount: string,
|
|
63
|
+
) {
|
|
64
|
+
const provider = new StaticJsonRpcProvider(
|
|
65
|
+
generateConfig(network).privateHttpProvider,
|
|
66
|
+
network,
|
|
67
|
+
);
|
|
68
|
+
const tokens = Tokens[network];
|
|
69
|
+
const holders = Holders[network];
|
|
70
|
+
const nativeTokenSymbol = NativeTokenSymbols[network];
|
|
71
|
+
|
|
72
|
+
const sideToContractMethods = new Map([
|
|
73
|
+
[
|
|
74
|
+
SwapSide.SELL,
|
|
75
|
+
[ContractMethod.simpleSwap, ContractMethod.swapExactAmountIn],
|
|
76
|
+
],
|
|
77
|
+
// [SwapSide.BUY, [ContractMethod.simpleBuy]],
|
|
78
|
+
]);
|
|
79
|
+
|
|
80
|
+
describe(`${network}`, () => {
|
|
81
|
+
sideToContractMethods.forEach((contractMethods, side) =>
|
|
82
|
+
describe(`${side}`, () => {
|
|
83
|
+
contractMethods.forEach((contractMethod: ContractMethod) => {
|
|
84
|
+
describe(`${contractMethod}`, () => {
|
|
85
|
+
it(`${nativeTokenSymbol} -> ${tokenASymbol}`, async () => {
|
|
86
|
+
await testE2E(
|
|
87
|
+
tokens[nativeTokenSymbol],
|
|
88
|
+
tokens[tokenASymbol],
|
|
89
|
+
holders[nativeTokenSymbol],
|
|
90
|
+
side === SwapSide.SELL ? nativeTokenAmount : tokenAAmount,
|
|
91
|
+
side,
|
|
92
|
+
dexKey,
|
|
93
|
+
contractMethod,
|
|
94
|
+
network,
|
|
95
|
+
provider,
|
|
96
|
+
);
|
|
97
|
+
});
|
|
98
|
+
it(`${tokenASymbol} -> ${nativeTokenSymbol}`, async () => {
|
|
99
|
+
await testE2E(
|
|
100
|
+
tokens[tokenASymbol],
|
|
101
|
+
tokens[nativeTokenSymbol],
|
|
102
|
+
holders[tokenASymbol],
|
|
103
|
+
side === SwapSide.SELL ? tokenAAmount : nativeTokenAmount,
|
|
104
|
+
side,
|
|
105
|
+
dexKey,
|
|
106
|
+
contractMethod,
|
|
107
|
+
network,
|
|
108
|
+
provider,
|
|
109
|
+
);
|
|
110
|
+
});
|
|
111
|
+
it(`${tokenASymbol} -> ${tokenBSymbol}`, async () => {
|
|
112
|
+
await testE2E(
|
|
113
|
+
tokens[tokenASymbol],
|
|
114
|
+
tokens[tokenBSymbol],
|
|
115
|
+
holders[tokenASymbol],
|
|
116
|
+
side === SwapSide.SELL ? tokenAAmount : tokenBAmount,
|
|
117
|
+
side,
|
|
118
|
+
dexKey,
|
|
119
|
+
contractMethod,
|
|
120
|
+
network,
|
|
121
|
+
provider,
|
|
122
|
+
);
|
|
123
|
+
});
|
|
124
|
+
it(`${tokenBSymbol} -> ${tokenASymbol}`, async () => {
|
|
125
|
+
await testE2E(
|
|
126
|
+
tokens[tokenBSymbol],
|
|
127
|
+
tokens[tokenASymbol],
|
|
128
|
+
holders[tokenBSymbol],
|
|
129
|
+
side === SwapSide.SELL ? tokenBAmount : tokenAAmount,
|
|
130
|
+
side,
|
|
131
|
+
dexKey,
|
|
132
|
+
contractMethod,
|
|
133
|
+
network,
|
|
134
|
+
provider,
|
|
135
|
+
);
|
|
136
|
+
});
|
|
137
|
+
});
|
|
138
|
+
});
|
|
139
|
+
}),
|
|
140
|
+
);
|
|
141
|
+
});
|
|
142
|
+
}
|
|
143
|
+
|
|
144
|
+
describe('MaverickV2 E2E', () => {
|
|
145
|
+
const dexKey = 'MaverickV2';
|
|
146
|
+
|
|
147
|
+
const testCases = [
|
|
148
|
+
{
|
|
149
|
+
network: Network.BASE,
|
|
150
|
+
tokenASymbol: 'MAV',
|
|
151
|
+
tokenBSymbol: 'PRIME',
|
|
152
|
+
tokenAAmount: '1000000000000000',
|
|
153
|
+
tokenBAmount: '1000000000000000',
|
|
154
|
+
},
|
|
155
|
+
{
|
|
156
|
+
network: Network.ARBITRUM,
|
|
157
|
+
tokenASymbol: 'USDC',
|
|
158
|
+
tokenBSymbol: 'USDT',
|
|
159
|
+
tokenAAmount: '100000000',
|
|
160
|
+
tokenBAmount: '100000000',
|
|
161
|
+
},
|
|
162
|
+
{
|
|
163
|
+
network: Network.BSC,
|
|
164
|
+
tokenASymbol: 'USDC',
|
|
165
|
+
tokenBSymbol: 'USDT',
|
|
166
|
+
tokenAAmount: '100000000',
|
|
167
|
+
tokenBAmount: '100000000',
|
|
168
|
+
},
|
|
169
|
+
{
|
|
170
|
+
network: Network.MAINNET,
|
|
171
|
+
tokenASymbol: 'USDC',
|
|
172
|
+
tokenBSymbol: 'USDT',
|
|
173
|
+
tokenAAmount: '100000000',
|
|
174
|
+
tokenBAmount: '100000000',
|
|
175
|
+
},
|
|
176
|
+
];
|
|
177
|
+
|
|
178
|
+
testCases.forEach(
|
|
179
|
+
({ network, tokenAAmount, tokenBAmount, tokenASymbol, tokenBSymbol }) => {
|
|
180
|
+
const nativeTokenAmount = '100000000000000';
|
|
181
|
+
|
|
182
|
+
testForNetwork(
|
|
183
|
+
network,
|
|
184
|
+
dexKey,
|
|
185
|
+
tokenASymbol,
|
|
186
|
+
tokenBSymbol,
|
|
187
|
+
tokenAAmount,
|
|
188
|
+
tokenBAmount,
|
|
189
|
+
nativeTokenAmount,
|
|
190
|
+
);
|
|
191
|
+
},
|
|
192
|
+
);
|
|
193
|
+
});
|