@rabby-wallet/staking-sdk 0.1.0-alpha.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.
- package/README.md +25 -0
- package/dist/addresses/deployments.d.ts +200 -0
- package/dist/addresses/deployments.d.ts.map +1 -0
- package/dist/addresses/deployments.js +223 -0
- package/dist/addresses/deployments.js.map +1 -0
- package/dist/addresses/erc4626.d.ts +74 -0
- package/dist/addresses/erc4626.d.ts.map +1 -0
- package/dist/addresses/erc4626.js +83 -0
- package/dist/addresses/erc4626.js.map +1 -0
- package/dist/addresses/index.d.ts +78 -0
- package/dist/addresses/index.d.ts.map +1 -0
- package/dist/addresses/index.js +13 -0
- package/dist/addresses/index.js.map +1 -0
- package/dist/addresses/univ2.d.ts +2 -0
- package/dist/addresses/univ2.d.ts.map +1 -0
- package/dist/addresses/univ2.js +2 -0
- package/dist/addresses/univ2.js.map +1 -0
- package/dist/addresses/univ3.d.ts +2 -0
- package/dist/addresses/univ3.d.ts.map +1 -0
- package/dist/addresses/univ3.js +2 -0
- package/dist/addresses/univ3.js.map +1 -0
- package/dist/core/abi/erc20.d.ts +13 -0
- package/dist/core/abi/erc20.d.ts.map +1 -0
- package/dist/core/abi/erc20.js +15 -0
- package/dist/core/abi/erc20.js.map +1 -0
- package/dist/core/abi/erc4626.d.ts +194 -0
- package/dist/core/abi/erc4626.d.ts.map +1 -0
- package/dist/core/abi/erc4626.js +191 -0
- package/dist/core/abi/erc4626.js.map +1 -0
- package/dist/core/abi/univ2.d.ts +181 -0
- package/dist/core/abi/univ2.d.ts.map +1 -0
- package/dist/core/abi/univ2.js +161 -0
- package/dist/core/abi/univ2.js.map +1 -0
- package/dist/core/abi/univ3.d.ts +369 -0
- package/dist/core/abi/univ3.d.ts.map +1 -0
- package/dist/core/abi/univ3.js +319 -0
- package/dist/core/abi/univ3.js.map +1 -0
- package/dist/core/chains.d.ts +3 -0
- package/dist/core/chains.d.ts.map +1 -0
- package/dist/core/chains.js +19 -0
- package/dist/core/chains.js.map +1 -0
- package/dist/core/errors.d.ts +30 -0
- package/dist/core/errors.d.ts.map +1 -0
- package/dist/core/errors.js +49 -0
- package/dist/core/errors.js.map +1 -0
- package/dist/core/read/erc20.d.ts +7 -0
- package/dist/core/read/erc20.d.ts.map +1 -0
- package/dist/core/read/erc20.js +7 -0
- package/dist/core/read/erc20.js.map +1 -0
- package/dist/core/types.d.ts +172 -0
- package/dist/core/types.d.ts.map +1 -0
- package/dist/core/types.js +2 -0
- package/dist/core/types.js.map +1 -0
- package/dist/core/utils/abi.d.ts +9 -0
- package/dist/core/utils/abi.d.ts.map +1 -0
- package/dist/core/utils/abi.js +70 -0
- package/dist/core/utils/abi.js.map +1 -0
- package/dist/core/utils/address.d.ts +7 -0
- package/dist/core/utils/address.d.ts.map +1 -0
- package/dist/core/utils/address.js +17 -0
- package/dist/core/utils/address.js.map +1 -0
- package/dist/core/validation/allowlist.d.ts +18 -0
- package/dist/core/validation/allowlist.d.ts.map +1 -0
- package/dist/core/validation/allowlist.js +42 -0
- package/dist/core/validation/allowlist.js.map +1 -0
- package/dist/core/validation/deployments.d.ts +16 -0
- package/dist/core/validation/deployments.d.ts.map +1 -0
- package/dist/core/validation/deployments.js +65 -0
- package/dist/core/validation/deployments.js.map +1 -0
- package/dist/index.d.ts +17 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +17 -0
- package/dist/index.js.map +1 -0
- package/dist/protocols/erc4626/builders.d.ts +23 -0
- package/dist/protocols/erc4626/builders.d.ts.map +1 -0
- package/dist/protocols/erc4626/builders.js +94 -0
- package/dist/protocols/erc4626/builders.js.map +1 -0
- package/dist/protocols/erc4626/index.d.ts +3 -0
- package/dist/protocols/erc4626/index.d.ts.map +1 -0
- package/dist/protocols/erc4626/index.js +3 -0
- package/dist/protocols/erc4626/index.js.map +1 -0
- package/dist/protocols/erc4626/read.d.ts +17 -0
- package/dist/protocols/erc4626/read.d.ts.map +1 -0
- package/dist/protocols/erc4626/read.js +46 -0
- package/dist/protocols/erc4626/read.js.map +1 -0
- package/dist/protocols/univ2/builders.d.ts +24 -0
- package/dist/protocols/univ2/builders.d.ts.map +1 -0
- package/dist/protocols/univ2/builders.js +94 -0
- package/dist/protocols/univ2/builders.js.map +1 -0
- package/dist/protocols/univ2/index.d.ts +5 -0
- package/dist/protocols/univ2/index.d.ts.map +1 -0
- package/dist/protocols/univ2/index.js +5 -0
- package/dist/protocols/univ2/index.js.map +1 -0
- package/dist/protocols/univ2/math.d.ts +24 -0
- package/dist/protocols/univ2/math.d.ts.map +1 -0
- package/dist/protocols/univ2/math.js +70 -0
- package/dist/protocols/univ2/math.js.map +1 -0
- package/dist/protocols/univ2/read.d.ts +22 -0
- package/dist/protocols/univ2/read.d.ts.map +1 -0
- package/dist/protocols/univ2/read.js +52 -0
- package/dist/protocols/univ2/read.js.map +1 -0
- package/dist/protocols/univ2/resolve.d.ts +34 -0
- package/dist/protocols/univ2/resolve.d.ts.map +1 -0
- package/dist/protocols/univ2/resolve.js +130 -0
- package/dist/protocols/univ2/resolve.js.map +1 -0
- package/dist/protocols/univ3/builders.d.ts +56 -0
- package/dist/protocols/univ3/builders.d.ts.map +1 -0
- package/dist/protocols/univ3/builders.js +197 -0
- package/dist/protocols/univ3/builders.js.map +1 -0
- package/dist/protocols/univ3/index.d.ts +7 -0
- package/dist/protocols/univ3/index.d.ts.map +1 -0
- package/dist/protocols/univ3/index.js +7 -0
- package/dist/protocols/univ3/index.js.map +1 -0
- package/dist/protocols/univ3/math.d.ts +45 -0
- package/dist/protocols/univ3/math.d.ts.map +1 -0
- package/dist/protocols/univ3/math.js +219 -0
- package/dist/protocols/univ3/math.js.map +1 -0
- package/dist/protocols/univ3/quote.d.ts +117 -0
- package/dist/protocols/univ3/quote.d.ts.map +1 -0
- package/dist/protocols/univ3/quote.js +315 -0
- package/dist/protocols/univ3/quote.js.map +1 -0
- package/dist/protocols/univ3/read.d.ts +28 -0
- package/dist/protocols/univ3/read.d.ts.map +1 -0
- package/dist/protocols/univ3/read.js +73 -0
- package/dist/protocols/univ3/read.js.map +1 -0
- package/dist/protocols/univ3/resolve.d.ts +38 -0
- package/dist/protocols/univ3/resolve.d.ts.map +1 -0
- package/dist/protocols/univ3/resolve.js +166 -0
- package/dist/protocols/univ3/resolve.js.map +1 -0
- package/dist/protocols/univ3/ticks.d.ts +15 -0
- package/dist/protocols/univ3/ticks.d.ts.map +1 -0
- package/dist/protocols/univ3/ticks.js +61 -0
- package/dist/protocols/univ3/ticks.js.map +1 -0
- package/package.json +49 -0
|
@@ -0,0 +1,219 @@
|
|
|
1
|
+
import { InvalidQuoteError, InvalidTickError } from '../../core/errors.js';
|
|
2
|
+
import { MAX_UINT128, parseRawUint128, parseRawUint160, parseRawUint256, } from '../../core/utils/abi.js';
|
|
3
|
+
import { UNIV3_MAX_TICK, UNIV3_MIN_TICK } from './ticks.js';
|
|
4
|
+
// Dependency-free port of the small Uniswap V3 math surface needed for previews.
|
|
5
|
+
// Keep this file limited to tick, sqrt-price, liquidity, and amount conversions.
|
|
6
|
+
export const Q96 = 2n ** 96n;
|
|
7
|
+
export const UNIV3_MIN_SQRT_RATIO = 4295128739n;
|
|
8
|
+
export const UNIV3_MAX_SQRT_RATIO = 1461446703485210103287273052203988822378723970342n;
|
|
9
|
+
const MAX_UINT256 = (1n << 256n) - 1n;
|
|
10
|
+
const mulDivRoundingUp = (multiplicand, multiplier, denominator) => {
|
|
11
|
+
if (denominator === 0n) {
|
|
12
|
+
throw new InvalidQuoteError('Division by zero');
|
|
13
|
+
}
|
|
14
|
+
const product = multiplicand * multiplier;
|
|
15
|
+
const result = product / denominator;
|
|
16
|
+
return product % denominator === 0n ? result : result + 1n;
|
|
17
|
+
};
|
|
18
|
+
const divRoundingUp = (numerator, denominator) => {
|
|
19
|
+
if (denominator === 0n) {
|
|
20
|
+
throw new InvalidQuoteError('Division by zero');
|
|
21
|
+
}
|
|
22
|
+
const result = numerator / denominator;
|
|
23
|
+
return numerator % denominator === 0n ? result : result + 1n;
|
|
24
|
+
};
|
|
25
|
+
const sortSqrtRatios = (sqrtRatioAX96, sqrtRatioBX96) => {
|
|
26
|
+
const sqrtA = parseUniv3SqrtPriceX96(sqrtRatioAX96);
|
|
27
|
+
const sqrtB = parseUniv3SqrtPriceX96(sqrtRatioBX96);
|
|
28
|
+
return sqrtA <= sqrtB ? [sqrtA, sqrtB] : [sqrtB, sqrtA];
|
|
29
|
+
};
|
|
30
|
+
export const parseUniv3SqrtPriceX96 = (value) => {
|
|
31
|
+
const parsed = parseRawUint160(value);
|
|
32
|
+
if (parsed < UNIV3_MIN_SQRT_RATIO || parsed > UNIV3_MAX_SQRT_RATIO) {
|
|
33
|
+
throw new InvalidQuoteError(`V3 sqrtPriceX96 is out of bounds: ${parsed}`);
|
|
34
|
+
}
|
|
35
|
+
return parsed;
|
|
36
|
+
};
|
|
37
|
+
export const getSqrtRatioAtUniv3Tick = (tick) => {
|
|
38
|
+
if (!Number.isInteger(tick) || tick < UNIV3_MIN_TICK || tick > UNIV3_MAX_TICK) {
|
|
39
|
+
throw new InvalidTickError(`Invalid V3 tick: ${tick}`);
|
|
40
|
+
}
|
|
41
|
+
const absTick = tick < 0 ? -tick : tick;
|
|
42
|
+
let ratio = (absTick & 0x1) !== 0
|
|
43
|
+
? 0xfffcb933bd6fad37aa2d162d1a594001n
|
|
44
|
+
: 0x100000000000000000000000000000000n;
|
|
45
|
+
if ((absTick & 0x2) !== 0) {
|
|
46
|
+
ratio = (ratio * 0xfff97272373d413259a46990580e213an) >> 128n;
|
|
47
|
+
}
|
|
48
|
+
if ((absTick & 0x4) !== 0) {
|
|
49
|
+
ratio = (ratio * 0xfff2e50f5f656932ef12357cf3c7fdccn) >> 128n;
|
|
50
|
+
}
|
|
51
|
+
if ((absTick & 0x8) !== 0) {
|
|
52
|
+
ratio = (ratio * 0xffe5caca7e10e4e61c3624eaa0941cd0n) >> 128n;
|
|
53
|
+
}
|
|
54
|
+
if ((absTick & 0x10) !== 0) {
|
|
55
|
+
ratio = (ratio * 0xffcb9843d60f6159c9db58835c926644n) >> 128n;
|
|
56
|
+
}
|
|
57
|
+
if ((absTick & 0x20) !== 0) {
|
|
58
|
+
ratio = (ratio * 0xff973b41fa98c081472e6896dfb254c0n) >> 128n;
|
|
59
|
+
}
|
|
60
|
+
if ((absTick & 0x40) !== 0) {
|
|
61
|
+
ratio = (ratio * 0xff2ea16466c96a3843ec78b326b52861n) >> 128n;
|
|
62
|
+
}
|
|
63
|
+
if ((absTick & 0x80) !== 0) {
|
|
64
|
+
ratio = (ratio * 0xfe5dee046a99a2a811c461f1969c3053n) >> 128n;
|
|
65
|
+
}
|
|
66
|
+
if ((absTick & 0x100) !== 0) {
|
|
67
|
+
ratio = (ratio * 0xfcbe86c7900a88aedcffc83b479aa3a4n) >> 128n;
|
|
68
|
+
}
|
|
69
|
+
if ((absTick & 0x200) !== 0) {
|
|
70
|
+
ratio = (ratio * 0xf987a7253ac413176f2b074cf7815e54n) >> 128n;
|
|
71
|
+
}
|
|
72
|
+
if ((absTick & 0x400) !== 0) {
|
|
73
|
+
ratio = (ratio * 0xf3392b0822b70005940c7a398e4b70f3n) >> 128n;
|
|
74
|
+
}
|
|
75
|
+
if ((absTick & 0x800) !== 0) {
|
|
76
|
+
ratio = (ratio * 0xe7159475a2c29b7443b29c7fa6e889d9n) >> 128n;
|
|
77
|
+
}
|
|
78
|
+
if ((absTick & 0x1000) !== 0) {
|
|
79
|
+
ratio = (ratio * 0xd097f3bdfd2022b8845ad8f792aa5825n) >> 128n;
|
|
80
|
+
}
|
|
81
|
+
if ((absTick & 0x2000) !== 0) {
|
|
82
|
+
ratio = (ratio * 0xa9f746462d870fdf8a65dc1f90e061e5n) >> 128n;
|
|
83
|
+
}
|
|
84
|
+
if ((absTick & 0x4000) !== 0) {
|
|
85
|
+
ratio = (ratio * 0x70d869a156d2a1b890bb3df62baf32f7n) >> 128n;
|
|
86
|
+
}
|
|
87
|
+
if ((absTick & 0x8000) !== 0) {
|
|
88
|
+
ratio = (ratio * 0x31be135f97d08fd981231505542fcfa6n) >> 128n;
|
|
89
|
+
}
|
|
90
|
+
if ((absTick & 0x10000) !== 0) {
|
|
91
|
+
ratio = (ratio * 0x9aa508b5b7a84e1c677de54f3e99bc9n) >> 128n;
|
|
92
|
+
}
|
|
93
|
+
if ((absTick & 0x20000) !== 0) {
|
|
94
|
+
ratio = (ratio * 0x5d6af8dedb81196699c329225ee604n) >> 128n;
|
|
95
|
+
}
|
|
96
|
+
if ((absTick & 0x40000) !== 0) {
|
|
97
|
+
ratio = (ratio * 0x2216e584f5fa1ea926041bedfe98n) >> 128n;
|
|
98
|
+
}
|
|
99
|
+
if ((absTick & 0x80000) !== 0) {
|
|
100
|
+
ratio = (ratio * 0x48a170391f7dc42444e8fa2n) >> 128n;
|
|
101
|
+
}
|
|
102
|
+
if (tick > 0) {
|
|
103
|
+
ratio = MAX_UINT256 / ratio;
|
|
104
|
+
}
|
|
105
|
+
const remainder = ratio % (1n << 32n);
|
|
106
|
+
return (ratio >> 32n) + (remainder === 0n ? 0n : 1n);
|
|
107
|
+
};
|
|
108
|
+
export const getUniv3Amount0Delta = ({ sqrtRatioAX96, sqrtRatioBX96, liquidity, roundUp = false, }) => {
|
|
109
|
+
const [sqrtA, sqrtB] = sortSqrtRatios(sqrtRatioAX96, sqrtRatioBX96);
|
|
110
|
+
const parsedLiquidity = parseRawUint128(liquidity);
|
|
111
|
+
if (sqrtA === 0n) {
|
|
112
|
+
throw new InvalidQuoteError('V3 sqrt price cannot be zero');
|
|
113
|
+
}
|
|
114
|
+
const numerator1 = parsedLiquidity << 96n;
|
|
115
|
+
const numerator2 = sqrtB - sqrtA;
|
|
116
|
+
if (roundUp) {
|
|
117
|
+
return divRoundingUp(mulDivRoundingUp(numerator1, numerator2, sqrtB), sqrtA);
|
|
118
|
+
}
|
|
119
|
+
return ((numerator1 * numerator2) / sqrtB) / sqrtA;
|
|
120
|
+
};
|
|
121
|
+
export const getUniv3Amount1Delta = ({ sqrtRatioAX96, sqrtRatioBX96, liquidity, roundUp = false, }) => {
|
|
122
|
+
const [sqrtA, sqrtB] = sortSqrtRatios(sqrtRatioAX96, sqrtRatioBX96);
|
|
123
|
+
const parsedLiquidity = parseRawUint128(liquidity);
|
|
124
|
+
const delta = sqrtB - sqrtA;
|
|
125
|
+
return roundUp
|
|
126
|
+
? mulDivRoundingUp(parsedLiquidity, delta, Q96)
|
|
127
|
+
: (parsedLiquidity * delta) / Q96;
|
|
128
|
+
};
|
|
129
|
+
export const getUniv3LiquidityForAmount0 = ({ sqrtRatioAX96, sqrtRatioBX96, amount0, }) => {
|
|
130
|
+
const [sqrtA, sqrtB] = sortSqrtRatios(sqrtRatioAX96, sqrtRatioBX96);
|
|
131
|
+
const parsedAmount0 = parseRawUint256(amount0);
|
|
132
|
+
const intermediate = (sqrtA * sqrtB) / Q96;
|
|
133
|
+
return (parsedAmount0 * intermediate) / (sqrtB - sqrtA);
|
|
134
|
+
};
|
|
135
|
+
export const getUniv3LiquidityForAmount1 = ({ sqrtRatioAX96, sqrtRatioBX96, amount1, }) => {
|
|
136
|
+
const [sqrtA, sqrtB] = sortSqrtRatios(sqrtRatioAX96, sqrtRatioBX96);
|
|
137
|
+
const parsedAmount1 = parseRawUint256(amount1);
|
|
138
|
+
return (parsedAmount1 * Q96) / (sqrtB - sqrtA);
|
|
139
|
+
};
|
|
140
|
+
export const getUniv3LiquidityForAmounts = ({ sqrtRatioX96, sqrtRatioAX96, sqrtRatioBX96, amount0, amount1, }) => {
|
|
141
|
+
const sqrtX = parseUniv3SqrtPriceX96(sqrtRatioX96);
|
|
142
|
+
const [sqrtA, sqrtB] = sortSqrtRatios(sqrtRatioAX96, sqrtRatioBX96);
|
|
143
|
+
const parsedAmount0 = parseRawUint256(amount0);
|
|
144
|
+
const parsedAmount1 = parseRawUint256(amount1);
|
|
145
|
+
let liquidity;
|
|
146
|
+
if (sqrtX <= sqrtA) {
|
|
147
|
+
liquidity = getUniv3LiquidityForAmount0({
|
|
148
|
+
sqrtRatioAX96: sqrtA,
|
|
149
|
+
sqrtRatioBX96: sqrtB,
|
|
150
|
+
amount0: parsedAmount0,
|
|
151
|
+
});
|
|
152
|
+
}
|
|
153
|
+
else if (sqrtX < sqrtB) {
|
|
154
|
+
const liquidity0 = getUniv3LiquidityForAmount0({
|
|
155
|
+
sqrtRatioAX96: sqrtX,
|
|
156
|
+
sqrtRatioBX96: sqrtB,
|
|
157
|
+
amount0: parsedAmount0,
|
|
158
|
+
});
|
|
159
|
+
const liquidity1 = getUniv3LiquidityForAmount1({
|
|
160
|
+
sqrtRatioAX96: sqrtA,
|
|
161
|
+
sqrtRatioBX96: sqrtX,
|
|
162
|
+
amount1: parsedAmount1,
|
|
163
|
+
});
|
|
164
|
+
liquidity = liquidity0 < liquidity1 ? liquidity0 : liquidity1;
|
|
165
|
+
}
|
|
166
|
+
else {
|
|
167
|
+
liquidity = getUniv3LiquidityForAmount1({
|
|
168
|
+
sqrtRatioAX96: sqrtA,
|
|
169
|
+
sqrtRatioBX96: sqrtB,
|
|
170
|
+
amount1: parsedAmount1,
|
|
171
|
+
});
|
|
172
|
+
}
|
|
173
|
+
if (liquidity > MAX_UINT128) {
|
|
174
|
+
throw new InvalidQuoteError(`V3 liquidity exceeds uint128: ${liquidity}`);
|
|
175
|
+
}
|
|
176
|
+
return liquidity;
|
|
177
|
+
};
|
|
178
|
+
export const getUniv3AmountsForLiquidity = ({ sqrtRatioX96, sqrtRatioAX96, sqrtRatioBX96, liquidity, roundUp = false, }) => {
|
|
179
|
+
const sqrtX = parseUniv3SqrtPriceX96(sqrtRatioX96);
|
|
180
|
+
const [sqrtA, sqrtB] = sortSqrtRatios(sqrtRatioAX96, sqrtRatioBX96);
|
|
181
|
+
const parsedLiquidity = parseRawUint128(liquidity);
|
|
182
|
+
if (sqrtX <= sqrtA) {
|
|
183
|
+
return {
|
|
184
|
+
amount0: getUniv3Amount0Delta({
|
|
185
|
+
sqrtRatioAX96: sqrtA,
|
|
186
|
+
sqrtRatioBX96: sqrtB,
|
|
187
|
+
liquidity: parsedLiquidity,
|
|
188
|
+
roundUp,
|
|
189
|
+
}),
|
|
190
|
+
amount1: 0n,
|
|
191
|
+
};
|
|
192
|
+
}
|
|
193
|
+
if (sqrtX < sqrtB) {
|
|
194
|
+
return {
|
|
195
|
+
amount0: getUniv3Amount0Delta({
|
|
196
|
+
sqrtRatioAX96: sqrtX,
|
|
197
|
+
sqrtRatioBX96: sqrtB,
|
|
198
|
+
liquidity: parsedLiquidity,
|
|
199
|
+
roundUp,
|
|
200
|
+
}),
|
|
201
|
+
amount1: getUniv3Amount1Delta({
|
|
202
|
+
sqrtRatioAX96: sqrtA,
|
|
203
|
+
sqrtRatioBX96: sqrtX,
|
|
204
|
+
liquidity: parsedLiquidity,
|
|
205
|
+
roundUp,
|
|
206
|
+
}),
|
|
207
|
+
};
|
|
208
|
+
}
|
|
209
|
+
return {
|
|
210
|
+
amount0: 0n,
|
|
211
|
+
amount1: getUniv3Amount1Delta({
|
|
212
|
+
sqrtRatioAX96: sqrtA,
|
|
213
|
+
sqrtRatioBX96: sqrtB,
|
|
214
|
+
liquidity: parsedLiquidity,
|
|
215
|
+
roundUp,
|
|
216
|
+
}),
|
|
217
|
+
};
|
|
218
|
+
};
|
|
219
|
+
//# sourceMappingURL=math.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"math.js","sourceRoot":"","sources":["../../../src/protocols/univ3/math.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,117 @@
|
|
|
1
|
+
export type Univ3RangePreset = '10%' | '20%' | '40%';
|
|
2
|
+
export type Univ3PresetRangeMode = 'each-side' | 'total-width';
|
|
3
|
+
export interface Univ3QuotePoolState {
|
|
4
|
+
tickCurrent: number;
|
|
5
|
+
tickSpacing: number;
|
|
6
|
+
sqrtPriceX96: string | bigint;
|
|
7
|
+
liquidity?: string | bigint;
|
|
8
|
+
token0?: string;
|
|
9
|
+
token1?: string;
|
|
10
|
+
fee?: string | number | bigint;
|
|
11
|
+
}
|
|
12
|
+
export interface Univ3RangeTickQuote {
|
|
13
|
+
tickLower: number;
|
|
14
|
+
tickUpper: number;
|
|
15
|
+
tickLowerRaw: number;
|
|
16
|
+
tickUpperRaw: number;
|
|
17
|
+
lowerBps: number;
|
|
18
|
+
upperBps: number;
|
|
19
|
+
mode: Univ3PresetRangeMode | 'amount-ratio';
|
|
20
|
+
}
|
|
21
|
+
export interface QuoteUniv3LiquidityParams {
|
|
22
|
+
poolState: Univ3QuotePoolState;
|
|
23
|
+
amount0Desired: string | bigint;
|
|
24
|
+
amount1Desired: string | bigint;
|
|
25
|
+
tickLower: number;
|
|
26
|
+
tickUpper: number;
|
|
27
|
+
slippageBps?: number;
|
|
28
|
+
}
|
|
29
|
+
export interface QuoteUniv3RangeDepositParams {
|
|
30
|
+
poolState: Univ3QuotePoolState;
|
|
31
|
+
amount0Desired: string | bigint;
|
|
32
|
+
amount1Desired: string | bigint;
|
|
33
|
+
rangeStrategy: Univ3RangeStrategy;
|
|
34
|
+
slippageBps?: number;
|
|
35
|
+
}
|
|
36
|
+
export type Univ3RangeStrategy = {
|
|
37
|
+
type: 'preset';
|
|
38
|
+
preset: Univ3RangePreset;
|
|
39
|
+
mode?: Univ3PresetRangeMode;
|
|
40
|
+
} | {
|
|
41
|
+
type: 'amount-ratio';
|
|
42
|
+
constraints?: Univ3AmountRatioRangeConstraints;
|
|
43
|
+
};
|
|
44
|
+
export interface Univ3AmountRatioRangeConstraints {
|
|
45
|
+
mustIncludeCurrentPrice?: boolean;
|
|
46
|
+
targetWidthBps?: number;
|
|
47
|
+
maxWidthBps?: number;
|
|
48
|
+
minWidthBps?: number;
|
|
49
|
+
searchStepBps?: number;
|
|
50
|
+
}
|
|
51
|
+
export interface Univ3LiquidityQuote {
|
|
52
|
+
tickLower: number;
|
|
53
|
+
tickUpper: number;
|
|
54
|
+
liquidity: bigint;
|
|
55
|
+
amount0: bigint;
|
|
56
|
+
amount1: bigint;
|
|
57
|
+
amount0Desired: bigint;
|
|
58
|
+
amount1Desired: bigint;
|
|
59
|
+
amount0Unused: bigint;
|
|
60
|
+
amount1Unused: bigint;
|
|
61
|
+
amount0Min: bigint;
|
|
62
|
+
amount1Min: bigint;
|
|
63
|
+
mintParams: {
|
|
64
|
+
tickLower: number;
|
|
65
|
+
tickUpper: number;
|
|
66
|
+
amount0Desired: string;
|
|
67
|
+
amount1Desired: string;
|
|
68
|
+
amount0Min: string;
|
|
69
|
+
amount1Min: string;
|
|
70
|
+
};
|
|
71
|
+
increaseLiquidityParams: {
|
|
72
|
+
amount0Desired: string;
|
|
73
|
+
amount1Desired: string;
|
|
74
|
+
amount0Min: string;
|
|
75
|
+
amount1Min: string;
|
|
76
|
+
};
|
|
77
|
+
}
|
|
78
|
+
export interface Univ3RangeDepositQuote extends Univ3LiquidityQuote {
|
|
79
|
+
range: Univ3RangeTickQuote;
|
|
80
|
+
}
|
|
81
|
+
export interface QuoteUniv3DecreaseLiquidityParams {
|
|
82
|
+
poolState: Univ3QuotePoolState;
|
|
83
|
+
tickLower: number;
|
|
84
|
+
tickUpper: number;
|
|
85
|
+
liquidity: string | bigint;
|
|
86
|
+
slippageBps?: number;
|
|
87
|
+
tokensOwed0?: string | bigint;
|
|
88
|
+
tokensOwed1?: string | bigint;
|
|
89
|
+
}
|
|
90
|
+
export interface Univ3DecreaseLiquidityQuote {
|
|
91
|
+
tickLower: number;
|
|
92
|
+
tickUpper: number;
|
|
93
|
+
liquidity: bigint;
|
|
94
|
+
amount0: bigint;
|
|
95
|
+
amount1: bigint;
|
|
96
|
+
amount0Min: bigint;
|
|
97
|
+
amount1Min: bigint;
|
|
98
|
+
tokensOwed0: bigint;
|
|
99
|
+
tokensOwed1: bigint;
|
|
100
|
+
estimatedCollectAmount0: bigint;
|
|
101
|
+
estimatedCollectAmount1: bigint;
|
|
102
|
+
decreaseLiquidityParams: {
|
|
103
|
+
liquidity: string;
|
|
104
|
+
amount0Min: string;
|
|
105
|
+
amount1Min: string;
|
|
106
|
+
};
|
|
107
|
+
}
|
|
108
|
+
export declare const getUniv3PresetRangeTicks: ({ tickCurrent, tickSpacing, preset, mode, }: {
|
|
109
|
+
tickCurrent: number;
|
|
110
|
+
tickSpacing: number;
|
|
111
|
+
preset: Univ3RangePreset;
|
|
112
|
+
mode?: Univ3PresetRangeMode;
|
|
113
|
+
}) => Univ3RangeTickQuote;
|
|
114
|
+
export declare const quoteUniv3Liquidity: ({ poolState, amount0Desired, amount1Desired, tickLower, tickUpper, slippageBps, }: QuoteUniv3LiquidityParams) => Univ3LiquidityQuote;
|
|
115
|
+
export declare const quoteUniv3RangeDeposit: ({ poolState, amount0Desired, amount1Desired, rangeStrategy, slippageBps, }: QuoteUniv3RangeDepositParams) => Univ3RangeDepositQuote;
|
|
116
|
+
export declare const quoteUniv3DecreaseLiquidity: ({ poolState, tickLower, tickUpper, liquidity, slippageBps, tokensOwed0, tokensOwed1, }: QuoteUniv3DecreaseLiquidityParams) => Univ3DecreaseLiquidityQuote;
|
|
117
|
+
//# sourceMappingURL=quote.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"quote.d.ts","sourceRoot":"","sources":["../../../src/protocols/univ3/quote.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,315 @@
|
|
|
1
|
+
import { InvalidQuoteError, InvalidTickError } from '../../core/errors.js';
|
|
2
|
+
import { parseRawUint128, parseRawUint256, } from '../../core/utils/abi.js';
|
|
3
|
+
import { getSqrtRatioAtUniv3Tick, getUniv3AmountsForLiquidity, getUniv3LiquidityForAmounts, parseUniv3SqrtPriceX96, } from './math.js';
|
|
4
|
+
import { assertUniv3TickRange, getUniv3UsableTickCeil, getUniv3UsableTickFloor, } from './ticks.js';
|
|
5
|
+
const BPS_DENOMINATOR = 10000n;
|
|
6
|
+
const LN_1_0001 = Math.log(1.0001);
|
|
7
|
+
const presetToBps = (preset) => {
|
|
8
|
+
switch (preset) {
|
|
9
|
+
case '10%':
|
|
10
|
+
return 1_000;
|
|
11
|
+
case '20%':
|
|
12
|
+
return 2_000;
|
|
13
|
+
case '40%':
|
|
14
|
+
return 4_000;
|
|
15
|
+
default:
|
|
16
|
+
throw new InvalidQuoteError(`Unsupported V3 range preset: ${preset}`);
|
|
17
|
+
}
|
|
18
|
+
};
|
|
19
|
+
const parseBps = (label, value, fallback) => {
|
|
20
|
+
const parsed = value ?? fallback;
|
|
21
|
+
if (!Number.isInteger(parsed) || parsed < 0 || parsed > 10_000) {
|
|
22
|
+
throw new InvalidQuoteError(`Invalid ${label}: ${String(parsed)}`);
|
|
23
|
+
}
|
|
24
|
+
return parsed;
|
|
25
|
+
};
|
|
26
|
+
const parsePositiveBps = (label, value, fallback) => {
|
|
27
|
+
const parsed = parseBps(label, value, fallback);
|
|
28
|
+
if (parsed <= 0) {
|
|
29
|
+
throw new InvalidQuoteError(`${label} must be greater than zero`);
|
|
30
|
+
}
|
|
31
|
+
return parsed;
|
|
32
|
+
};
|
|
33
|
+
const parseSlippageBps = (value) => {
|
|
34
|
+
const parsed = parseBps('slippageBps', value, 0);
|
|
35
|
+
return BigInt(parsed);
|
|
36
|
+
};
|
|
37
|
+
const applySlippage = (amount, slippageBps) => (amount * (BPS_DENOMINATOR - slippageBps)) / BPS_DENOMINATOR;
|
|
38
|
+
const assertTickCurrent = (tickCurrent) => {
|
|
39
|
+
if (!Number.isInteger(tickCurrent)) {
|
|
40
|
+
throw new InvalidQuoteError(`Invalid V3 current tick: ${tickCurrent}`);
|
|
41
|
+
}
|
|
42
|
+
};
|
|
43
|
+
const targetTicksFromBps = ({ tickCurrent, tickSpacing, lowerBps, upperBps, }) => {
|
|
44
|
+
assertTickCurrent(tickCurrent);
|
|
45
|
+
if (lowerBps <= 0 || lowerBps >= 10_000) {
|
|
46
|
+
throw new InvalidQuoteError(`Invalid lowerBps: ${lowerBps}`);
|
|
47
|
+
}
|
|
48
|
+
if (upperBps <= 0) {
|
|
49
|
+
throw new InvalidQuoteError(`Invalid upperBps: ${upperBps}`);
|
|
50
|
+
}
|
|
51
|
+
const lowerMultiplier = 1 - lowerBps / 10_000;
|
|
52
|
+
const upperMultiplier = 1 + upperBps / 10_000;
|
|
53
|
+
const tickLowerRaw = Math.floor(tickCurrent + Math.log(lowerMultiplier) / LN_1_0001);
|
|
54
|
+
const tickUpperRaw = Math.ceil(tickCurrent + Math.log(upperMultiplier) / LN_1_0001);
|
|
55
|
+
const tickLower = getUniv3UsableTickFloor(tickLowerRaw, tickSpacing);
|
|
56
|
+
const tickUpper = getUniv3UsableTickCeil(tickUpperRaw, tickSpacing);
|
|
57
|
+
assertUniv3TickRange({ tickLower, tickUpper, tickSpacing });
|
|
58
|
+
return {
|
|
59
|
+
tickLower,
|
|
60
|
+
tickUpper,
|
|
61
|
+
tickLowerRaw,
|
|
62
|
+
tickUpperRaw,
|
|
63
|
+
lowerBps,
|
|
64
|
+
upperBps,
|
|
65
|
+
mode: 'amount-ratio',
|
|
66
|
+
};
|
|
67
|
+
};
|
|
68
|
+
const amountUsedIsWithinDesired = ({ amount0, amount1, desired0, desired1, }) => amount0 <= desired0 && amount1 <= desired1;
|
|
69
|
+
const quoteLiquidityForParsedAmounts = ({ poolState, desired0, desired1, tickLower, tickUpper, slippageBps, }) => {
|
|
70
|
+
assertUniv3TickRange({
|
|
71
|
+
tickLower,
|
|
72
|
+
tickUpper,
|
|
73
|
+
tickSpacing: poolState.tickSpacing,
|
|
74
|
+
});
|
|
75
|
+
const sqrtPriceX96 = parseUniv3SqrtPriceX96(poolState.sqrtPriceX96);
|
|
76
|
+
const sqrtRatioAX96 = getSqrtRatioAtUniv3Tick(tickLower);
|
|
77
|
+
const sqrtRatioBX96 = getSqrtRatioAtUniv3Tick(tickUpper);
|
|
78
|
+
let liquidity = getUniv3LiquidityForAmounts({
|
|
79
|
+
sqrtRatioX96: sqrtPriceX96,
|
|
80
|
+
sqrtRatioAX96,
|
|
81
|
+
sqrtRatioBX96,
|
|
82
|
+
amount0: desired0,
|
|
83
|
+
amount1: desired1,
|
|
84
|
+
});
|
|
85
|
+
if (liquidity === 0n) {
|
|
86
|
+
throw new InvalidQuoteError('V3 liquidity quote is zero');
|
|
87
|
+
}
|
|
88
|
+
let amounts = getUniv3AmountsForLiquidity({
|
|
89
|
+
sqrtRatioX96: sqrtPriceX96,
|
|
90
|
+
sqrtRatioAX96,
|
|
91
|
+
sqrtRatioBX96,
|
|
92
|
+
liquidity,
|
|
93
|
+
roundUp: true,
|
|
94
|
+
});
|
|
95
|
+
let guard = 0;
|
|
96
|
+
while (liquidity > 0n &&
|
|
97
|
+
!amountUsedIsWithinDesired({
|
|
98
|
+
amount0: amounts.amount0,
|
|
99
|
+
amount1: amounts.amount1,
|
|
100
|
+
desired0,
|
|
101
|
+
desired1,
|
|
102
|
+
})) {
|
|
103
|
+
liquidity -= 1n;
|
|
104
|
+
amounts = getUniv3AmountsForLiquidity({
|
|
105
|
+
sqrtRatioX96: sqrtPriceX96,
|
|
106
|
+
sqrtRatioAX96,
|
|
107
|
+
sqrtRatioBX96,
|
|
108
|
+
liquidity,
|
|
109
|
+
roundUp: true,
|
|
110
|
+
});
|
|
111
|
+
guard += 1;
|
|
112
|
+
if (guard > 256) {
|
|
113
|
+
throw new InvalidQuoteError('Unable to fit V3 liquidity into desired amounts');
|
|
114
|
+
}
|
|
115
|
+
}
|
|
116
|
+
if (liquidity === 0n) {
|
|
117
|
+
throw new InvalidQuoteError('V3 liquidity quote is zero');
|
|
118
|
+
}
|
|
119
|
+
const amount0Min = applySlippage(amounts.amount0, slippageBps);
|
|
120
|
+
const amount1Min = applySlippage(amounts.amount1, slippageBps);
|
|
121
|
+
return {
|
|
122
|
+
tickLower,
|
|
123
|
+
tickUpper,
|
|
124
|
+
liquidity,
|
|
125
|
+
amount0: amounts.amount0,
|
|
126
|
+
amount1: amounts.amount1,
|
|
127
|
+
amount0Desired: desired0,
|
|
128
|
+
amount1Desired: desired1,
|
|
129
|
+
amount0Unused: desired0 > amounts.amount0 ? desired0 - amounts.amount0 : 0n,
|
|
130
|
+
amount1Unused: desired1 > amounts.amount1 ? desired1 - amounts.amount1 : 0n,
|
|
131
|
+
amount0Min,
|
|
132
|
+
amount1Min,
|
|
133
|
+
mintParams: {
|
|
134
|
+
tickLower,
|
|
135
|
+
tickUpper,
|
|
136
|
+
amount0Desired: amounts.amount0.toString(),
|
|
137
|
+
amount1Desired: amounts.amount1.toString(),
|
|
138
|
+
amount0Min: amount0Min.toString(),
|
|
139
|
+
amount1Min: amount1Min.toString(),
|
|
140
|
+
},
|
|
141
|
+
increaseLiquidityParams: {
|
|
142
|
+
amount0Desired: amounts.amount0.toString(),
|
|
143
|
+
amount1Desired: amounts.amount1.toString(),
|
|
144
|
+
amount0Min: amount0Min.toString(),
|
|
145
|
+
amount1Min: amount1Min.toString(),
|
|
146
|
+
},
|
|
147
|
+
};
|
|
148
|
+
};
|
|
149
|
+
export const getUniv3PresetRangeTicks = ({ tickCurrent, tickSpacing, preset, mode = 'each-side', }) => {
|
|
150
|
+
const presetBps = presetToBps(preset);
|
|
151
|
+
const sideBps = mode === 'total-width' ? presetBps / 2 : presetBps;
|
|
152
|
+
const range = targetTicksFromBps({
|
|
153
|
+
tickCurrent,
|
|
154
|
+
tickSpacing,
|
|
155
|
+
lowerBps: sideBps,
|
|
156
|
+
upperBps: sideBps,
|
|
157
|
+
});
|
|
158
|
+
return {
|
|
159
|
+
...range,
|
|
160
|
+
mode,
|
|
161
|
+
};
|
|
162
|
+
};
|
|
163
|
+
export const quoteUniv3Liquidity = ({ poolState, amount0Desired, amount1Desired, tickLower, tickUpper, slippageBps, }) => {
|
|
164
|
+
const desired0 = parseRawUint256(amount0Desired);
|
|
165
|
+
const desired1 = parseRawUint256(amount1Desired);
|
|
166
|
+
if (desired0 === 0n && desired1 === 0n) {
|
|
167
|
+
throw new InvalidQuoteError('V3 quote requires a non-zero desired amount');
|
|
168
|
+
}
|
|
169
|
+
return quoteLiquidityForParsedAmounts({
|
|
170
|
+
poolState,
|
|
171
|
+
desired0,
|
|
172
|
+
desired1,
|
|
173
|
+
tickLower,
|
|
174
|
+
tickUpper,
|
|
175
|
+
slippageBps: parseSlippageBps(slippageBps),
|
|
176
|
+
});
|
|
177
|
+
};
|
|
178
|
+
const quoteAmountRatioRange = ({ poolState, desired0, desired1, constraints, slippageBps, }) => {
|
|
179
|
+
const mustIncludeCurrentPrice = constraints?.mustIncludeCurrentPrice ?? true;
|
|
180
|
+
if (!mustIncludeCurrentPrice) {
|
|
181
|
+
throw new InvalidQuoteError('amount-ratio ranges outside the current price are not supported yet');
|
|
182
|
+
}
|
|
183
|
+
const targetWidthBps = parsePositiveBps('targetWidthBps', constraints?.targetWidthBps, constraints?.maxWidthBps ?? 4_000);
|
|
184
|
+
const maxWidthBps = parsePositiveBps('maxWidthBps', constraints?.maxWidthBps, targetWidthBps);
|
|
185
|
+
const minWidthBps = parseBps('minWidthBps', constraints?.minWidthBps, 2);
|
|
186
|
+
const searchStepBps = parsePositiveBps('searchStepBps', constraints?.searchStepBps, Math.max(1, Math.floor(targetWidthBps / 200)));
|
|
187
|
+
if (targetWidthBps > maxWidthBps) {
|
|
188
|
+
throw new InvalidQuoteError('targetWidthBps cannot exceed maxWidthBps');
|
|
189
|
+
}
|
|
190
|
+
if (minWidthBps >= targetWidthBps) {
|
|
191
|
+
throw new InvalidQuoteError('minWidthBps must be lower than targetWidthBps');
|
|
192
|
+
}
|
|
193
|
+
let best;
|
|
194
|
+
const evaluate = (lowerBps) => {
|
|
195
|
+
const upperBps = targetWidthBps - lowerBps;
|
|
196
|
+
if (lowerBps <= 0 || upperBps <= 0)
|
|
197
|
+
return;
|
|
198
|
+
let range;
|
|
199
|
+
try {
|
|
200
|
+
range = targetTicksFromBps({
|
|
201
|
+
tickCurrent: poolState.tickCurrent,
|
|
202
|
+
tickSpacing: poolState.tickSpacing,
|
|
203
|
+
lowerBps,
|
|
204
|
+
upperBps,
|
|
205
|
+
});
|
|
206
|
+
const quote = quoteLiquidityForParsedAmounts({
|
|
207
|
+
poolState,
|
|
208
|
+
desired0,
|
|
209
|
+
desired1,
|
|
210
|
+
tickLower: range.tickLower,
|
|
211
|
+
tickUpper: range.tickUpper,
|
|
212
|
+
slippageBps,
|
|
213
|
+
});
|
|
214
|
+
const candidate = { ...quote, range };
|
|
215
|
+
if (!best || candidate.liquidity > best.liquidity) {
|
|
216
|
+
best = candidate;
|
|
217
|
+
}
|
|
218
|
+
}
|
|
219
|
+
catch (error) {
|
|
220
|
+
if (error instanceof InvalidQuoteError || error instanceof InvalidTickError)
|
|
221
|
+
return;
|
|
222
|
+
throw error;
|
|
223
|
+
}
|
|
224
|
+
};
|
|
225
|
+
for (let lowerBps = Math.max(1, minWidthBps); lowerBps <= targetWidthBps - Math.max(1, minWidthBps); lowerBps += searchStepBps) {
|
|
226
|
+
evaluate(lowerBps);
|
|
227
|
+
}
|
|
228
|
+
if (best) {
|
|
229
|
+
const bestLowerBps = best.range.lowerBps;
|
|
230
|
+
const refineStart = Math.max(1, bestLowerBps - searchStepBps);
|
|
231
|
+
const refineEnd = Math.min(targetWidthBps - 1, bestLowerBps + searchStepBps);
|
|
232
|
+
for (let lowerBps = refineStart; lowerBps <= refineEnd; lowerBps += 1) {
|
|
233
|
+
evaluate(lowerBps);
|
|
234
|
+
}
|
|
235
|
+
}
|
|
236
|
+
if (!best) {
|
|
237
|
+
throw new InvalidQuoteError('Unable to find a valid V3 amount-ratio range');
|
|
238
|
+
}
|
|
239
|
+
return best;
|
|
240
|
+
};
|
|
241
|
+
export const quoteUniv3RangeDeposit = ({ poolState, amount0Desired, amount1Desired, rangeStrategy, slippageBps, }) => {
|
|
242
|
+
const desired0 = parseRawUint256(amount0Desired);
|
|
243
|
+
const desired1 = parseRawUint256(amount1Desired);
|
|
244
|
+
if (desired0 === 0n && desired1 === 0n) {
|
|
245
|
+
throw new InvalidQuoteError('V3 quote requires a non-zero desired amount');
|
|
246
|
+
}
|
|
247
|
+
const parsedSlippageBps = parseSlippageBps(slippageBps);
|
|
248
|
+
if (rangeStrategy.type === 'preset') {
|
|
249
|
+
const range = getUniv3PresetRangeTicks({
|
|
250
|
+
tickCurrent: poolState.tickCurrent,
|
|
251
|
+
tickSpacing: poolState.tickSpacing,
|
|
252
|
+
preset: rangeStrategy.preset,
|
|
253
|
+
mode: rangeStrategy.mode,
|
|
254
|
+
});
|
|
255
|
+
const quote = quoteLiquidityForParsedAmounts({
|
|
256
|
+
poolState,
|
|
257
|
+
desired0,
|
|
258
|
+
desired1,
|
|
259
|
+
tickLower: range.tickLower,
|
|
260
|
+
tickUpper: range.tickUpper,
|
|
261
|
+
slippageBps: parsedSlippageBps,
|
|
262
|
+
});
|
|
263
|
+
return { ...quote, range };
|
|
264
|
+
}
|
|
265
|
+
return quoteAmountRatioRange({
|
|
266
|
+
poolState,
|
|
267
|
+
desired0,
|
|
268
|
+
desired1,
|
|
269
|
+
constraints: rangeStrategy.constraints,
|
|
270
|
+
slippageBps: parsedSlippageBps,
|
|
271
|
+
});
|
|
272
|
+
};
|
|
273
|
+
export const quoteUniv3DecreaseLiquidity = ({ poolState, tickLower, tickUpper, liquidity, slippageBps, tokensOwed0 = 0n, tokensOwed1 = 0n, }) => {
|
|
274
|
+
assertUniv3TickRange({
|
|
275
|
+
tickLower,
|
|
276
|
+
tickUpper,
|
|
277
|
+
tickSpacing: poolState.tickSpacing,
|
|
278
|
+
});
|
|
279
|
+
const parsedLiquidity = parseRawUint128(liquidity);
|
|
280
|
+
if (parsedLiquidity === 0n) {
|
|
281
|
+
throw new InvalidQuoteError('V3 decrease quote requires non-zero liquidity');
|
|
282
|
+
}
|
|
283
|
+
const sqrtPriceX96 = parseUniv3SqrtPriceX96(poolState.sqrtPriceX96);
|
|
284
|
+
const amounts = getUniv3AmountsForLiquidity({
|
|
285
|
+
sqrtRatioX96: sqrtPriceX96,
|
|
286
|
+
sqrtRatioAX96: getSqrtRatioAtUniv3Tick(tickLower),
|
|
287
|
+
sqrtRatioBX96: getSqrtRatioAtUniv3Tick(tickUpper),
|
|
288
|
+
liquidity: parsedLiquidity,
|
|
289
|
+
roundUp: false,
|
|
290
|
+
});
|
|
291
|
+
const parsedSlippageBps = parseSlippageBps(slippageBps);
|
|
292
|
+
const amount0Min = applySlippage(amounts.amount0, parsedSlippageBps);
|
|
293
|
+
const amount1Min = applySlippage(amounts.amount1, parsedSlippageBps);
|
|
294
|
+
const parsedTokensOwed0 = parseRawUint256(tokensOwed0);
|
|
295
|
+
const parsedTokensOwed1 = parseRawUint256(tokensOwed1);
|
|
296
|
+
return {
|
|
297
|
+
tickLower,
|
|
298
|
+
tickUpper,
|
|
299
|
+
liquidity: parsedLiquidity,
|
|
300
|
+
amount0: amounts.amount0,
|
|
301
|
+
amount1: amounts.amount1,
|
|
302
|
+
amount0Min,
|
|
303
|
+
amount1Min,
|
|
304
|
+
tokensOwed0: parsedTokensOwed0,
|
|
305
|
+
tokensOwed1: parsedTokensOwed1,
|
|
306
|
+
estimatedCollectAmount0: amounts.amount0 + parsedTokensOwed0,
|
|
307
|
+
estimatedCollectAmount1: amounts.amount1 + parsedTokensOwed1,
|
|
308
|
+
decreaseLiquidityParams: {
|
|
309
|
+
liquidity: parsedLiquidity.toString(),
|
|
310
|
+
amount0Min: amount0Min.toString(),
|
|
311
|
+
amount1Min: amount1Min.toString(),
|
|
312
|
+
},
|
|
313
|
+
};
|
|
314
|
+
};
|
|
315
|
+
//# sourceMappingURL=quote.js.map
|