@strkfarm/sdk 2.0.0-dev.35 → 2.0.0-dev.37
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/dist/cli.js +2 -2
- package/dist/cli.mjs +2 -2
- package/dist/index.browser.global.js +19596 -28786
- package/dist/index.browser.mjs +8559 -17931
- package/dist/index.d.ts +578 -2746
- package/dist/index.js +8649 -18059
- package/dist/index.mjs +8577 -17949
- package/package.json +3 -3
- package/src/data/universal-vault.abi.json +8 -7
- package/src/dataTypes/bignumber.browser.ts +5 -1
- package/src/dataTypes/bignumber.node.ts +5 -0
- package/src/global.ts +21 -1
- package/src/interfaces/common.tsx +39 -4
- package/src/modules/avnu.ts +19 -10
- package/src/modules/index.ts +1 -1
- package/src/strategies/base-strategy.ts +92 -8
- package/src/strategies/constants.ts +8 -3
- package/src/strategies/ekubo-cl-vault.tsx +150 -16
- package/src/strategies/factory.ts +21 -1
- package/src/strategies/index.ts +2 -7
- package/src/strategies/registry.ts +28 -5
- package/src/strategies/sensei.ts +29 -13
- package/src/strategies/svk-strategy.ts +26 -2
- package/src/strategies/token-boosted-xstrk-carry-strategy.tsx +1223 -0
- package/src/strategies/universal-adapters/avnu-adapter.ts +16 -8
- package/src/strategies/universal-adapters/index.ts +1 -2
- package/src/strategies/universal-adapters/svk-troves-adapter.ts +19 -6
- package/src/strategies/universal-adapters/vesu-modify-position-adapter.ts +22 -3
- package/src/strategies/universal-adapters/vesu-multiply-adapter.ts +75 -52
- package/src/strategies/universal-adapters/vesu-position-common.ts +38 -31
- package/src/strategies/universal-lst-muliplier-strategy.tsx +222 -269
- package/src/strategies/universal-strategy.tsx +166 -105
- package/src/strategies/vesu-rebalance.tsx +3 -6
- package/src/strategies/yoloVault.ts +1084 -0
- package/src/utils/health-factor-math.ts +29 -0
- package/src/modules/ExtendedWrapperSDk/index.ts +0 -62
- package/src/modules/ExtendedWrapperSDk/types.ts +0 -334
- package/src/modules/ExtendedWrapperSDk/wrapper.ts +0 -611
- package/src/strategies/universal-adapters/extended-adapter.ts +0 -860
- package/src/strategies/universal-adapters/usdc<>usdce-adapter.ts +0 -200
- package/src/strategies/usdc-boosted-strategy.tsx +0 -693
- package/src/strategies/vesu-extended-strategy/services/executionService.ts +0 -2234
- package/src/strategies/vesu-extended-strategy/services/extended-vesu-state-manager.ts +0 -4254
- package/src/strategies/vesu-extended-strategy/services/ltv-imbalance-rebalance-math.ts +0 -783
- package/src/strategies/vesu-extended-strategy/services/operationService.ts +0 -56
- package/src/strategies/vesu-extended-strategy/types/transaction-metadata.ts +0 -88
- package/src/strategies/vesu-extended-strategy/utils/config.runtime.ts +0 -78
- package/src/strategies/vesu-extended-strategy/utils/constants.ts +0 -48
- package/src/strategies/vesu-extended-strategy/utils/helper.ts +0 -528
- package/src/strategies/vesu-extended-strategy/vesu-extended-strategy.tsx +0 -1014
|
@@ -1,528 +0,0 @@
|
|
|
1
|
-
import {
|
|
2
|
-
MAINTENANCE_MARGIN,
|
|
3
|
-
MAX_LTV_BTC_USDC,
|
|
4
|
-
MAX_PRICE_DROP_PERCENTAGE,
|
|
5
|
-
TARGET_HF,
|
|
6
|
-
WBTC_TOKEN_ADDRESS,
|
|
7
|
-
USDC_TOKEN_ADDRESS,
|
|
8
|
-
WBTC_TOKEN_DECIMALS,
|
|
9
|
-
USDC_TOKEN_DECIMALS,
|
|
10
|
-
MAX_LIQUIDATION_RATIO,
|
|
11
|
-
} from "./constants";
|
|
12
|
-
import { VesuConfig } from "./config.runtime";
|
|
13
|
-
import { ExtendedAdapter } from "../../universal-adapters/extended-adapter";
|
|
14
|
-
import { Balance } from "@/modules/ExtendedWrapperSDk";
|
|
15
|
-
import { Web3Number } from "@/dataTypes";
|
|
16
|
-
import { Position } from "@/modules/ExtendedWrapperSDk";
|
|
17
|
-
// import { getAllOpenPositionsExtended } from "../services/extendedService";
|
|
18
|
-
import ExtendedWrapper from "@/modules/ExtendedWrapperSDk";
|
|
19
|
-
import { logger } from "@/utils";
|
|
20
|
-
import { HealthFactorMath } from "@/utils/health-factor-math";
|
|
21
|
-
// import {
|
|
22
|
-
// calculatePositionOnVesu,
|
|
23
|
-
// getAssetPrice,
|
|
24
|
-
// } from "../services/vesuService";
|
|
25
|
-
/**
|
|
26
|
-
* Function to return formatted amount to BigInt
|
|
27
|
-
* Converts a decimal amount to the proper format for blockchain transactions
|
|
28
|
-
* @param {number} amount - The decimal amount to convert
|
|
29
|
-
* @param {number} fromTokenDecimals - The decimal precision of the token
|
|
30
|
-
* @returns {string} The formatted amount as a hexadecimal string
|
|
31
|
-
*/
|
|
32
|
-
export const returnFormattedAmount = (
|
|
33
|
-
amount: number,
|
|
34
|
-
toTokenDecimals: number,
|
|
35
|
-
) => {
|
|
36
|
-
const formattedAmount =
|
|
37
|
-
"0x" + BigInt(Math.floor(amount * 10 ** toTokenDecimals)).toString(16);
|
|
38
|
-
return formattedAmount;
|
|
39
|
-
};
|
|
40
|
-
|
|
41
|
-
/**
|
|
42
|
-
* calculates the amount to distribute to Extended and Vesu
|
|
43
|
-
* Determines how much to allocate to each platform based on leverage calculations
|
|
44
|
-
* @param {number} amount - The total amount to distribute
|
|
45
|
-
* @returns {object} Object containing avnu_amount, extended_amount, and extended_leverage
|
|
46
|
-
*/
|
|
47
|
-
export const calculateAmountDistribution = (
|
|
48
|
-
amountToInvest: number,
|
|
49
|
-
collateralPrice: number, // in usd
|
|
50
|
-
collateralUnits: Web3Number, // existing collateral in vesu (e.g. BTC)
|
|
51
|
-
extendedExposureUsd: Web3Number,
|
|
52
|
-
): {
|
|
53
|
-
vesuAmount: Web3Number;
|
|
54
|
-
extendedAmount: Web3Number;
|
|
55
|
-
extendedLeverage: number;
|
|
56
|
-
vesuLeverage: number;
|
|
57
|
-
} => {
|
|
58
|
-
try {
|
|
59
|
-
/**
|
|
60
|
-
* Logic: Match the newly created total exposure in USD on both sides
|
|
61
|
-
* New Vesu exposure = VesuAmount * vesuLeverage
|
|
62
|
-
* New Extended exposure = ExtendedAmount * extendedLeverage
|
|
63
|
-
* VesuAmount + ExtendedAmount = amountToInvest
|
|
64
|
-
* ExtendedAmount * extendedleverage = (amountToInvest - ExtendedAmount) * vesuLeverage
|
|
65
|
-
* ExtendedAmount * (extendedleverage + vesuLeverage) = amountToInvest * vesuLeverage
|
|
66
|
-
* ExtendedAmount = amountToInvest * vesuLeverage / (extendedleverage + vesuLeverage)
|
|
67
|
-
* VesuAmount = amountToInvest - ExtendedAmount
|
|
68
|
-
* @dev note: below cal includes existing exposures too
|
|
69
|
-
*/
|
|
70
|
-
|
|
71
|
-
const extendedLeverage = calculateExtendedLevergae();
|
|
72
|
-
const vesuLeverage = calculateVesuLeverage();
|
|
73
|
-
const vesuBTCExposureUSD = collateralUnits.multipliedBy(collateralPrice);
|
|
74
|
-
const numerator1 = vesuLeverage * amountToInvest + vesuBTCExposureUSD.toNumber();
|
|
75
|
-
const numerator2 = extendedExposureUsd.toNumber();
|
|
76
|
-
const denominator = vesuLeverage + extendedLeverage;
|
|
77
|
-
const ExtendedAmount = new Web3Number(
|
|
78
|
-
((numerator1 - numerator2) / denominator).toFixed(2),
|
|
79
|
-
USDC_TOKEN_DECIMALS,
|
|
80
|
-
);
|
|
81
|
-
|
|
82
|
-
const VesuAmount = new Web3Number(
|
|
83
|
-
amountToInvest.toFixed(2),
|
|
84
|
-
USDC_TOKEN_DECIMALS,
|
|
85
|
-
).minus(ExtendedAmount);
|
|
86
|
-
|
|
87
|
-
return {
|
|
88
|
-
vesuAmount: VesuAmount,
|
|
89
|
-
extendedAmount: ExtendedAmount,
|
|
90
|
-
extendedLeverage,
|
|
91
|
-
vesuLeverage,
|
|
92
|
-
};
|
|
93
|
-
} catch (err) {
|
|
94
|
-
return {
|
|
95
|
-
vesuAmount: new Web3Number(0, 0),
|
|
96
|
-
extendedAmount: new Web3Number(0, 0),
|
|
97
|
-
extendedLeverage: 0,
|
|
98
|
-
vesuLeverage: 0,
|
|
99
|
-
};
|
|
100
|
-
}
|
|
101
|
-
};
|
|
102
|
-
|
|
103
|
-
/**
|
|
104
|
-
* calculate the amount distribution for withdrawal
|
|
105
|
-
* @param amount - The amount to withdraw
|
|
106
|
-
* @param client - The client
|
|
107
|
-
* @param marketName - The market name
|
|
108
|
-
* @returns {object} Object containing avnu_amount and extended_amount
|
|
109
|
-
*/
|
|
110
|
-
export const calculateAmountDistributionForWithdrawal = async (
|
|
111
|
-
amountInUsdc: Web3Number,
|
|
112
|
-
collateralPrice: number,
|
|
113
|
-
collateralUnits: Web3Number,
|
|
114
|
-
extendedPosition: Position[] | null,
|
|
115
|
-
): Promise<{
|
|
116
|
-
vesu_amount: Web3Number;
|
|
117
|
-
extended_amount: Web3Number;
|
|
118
|
-
extended_leverage: number;
|
|
119
|
-
vesu_leverage: number;
|
|
120
|
-
} | null> => {
|
|
121
|
-
try {
|
|
122
|
-
const extended_leverage = calculateExtendedLevergae();
|
|
123
|
-
const vesu_leverage = calculateVesuLeverage();
|
|
124
|
-
if (extendedPosition === null) {
|
|
125
|
-
logger.error("error getting extended positions");
|
|
126
|
-
return null;
|
|
127
|
-
}
|
|
128
|
-
const extendedExposureUSD =
|
|
129
|
-
extendedPosition.length > 0
|
|
130
|
-
? new Web3Number(extendedPosition[0].value, USDC_TOKEN_DECIMALS)
|
|
131
|
-
: new Web3Number(0, USDC_TOKEN_DECIMALS);
|
|
132
|
-
const vesuExposureUSD = collateralUnits.multipliedBy(collateralPrice);
|
|
133
|
-
if (vesuExposureUSD.lessThan(0)) {
|
|
134
|
-
return {
|
|
135
|
-
vesu_amount: new Web3Number(0, USDC_TOKEN_DECIMALS),
|
|
136
|
-
extended_amount: amountInUsdc,
|
|
137
|
-
extended_leverage,
|
|
138
|
-
vesu_leverage,
|
|
139
|
-
};
|
|
140
|
-
}
|
|
141
|
-
if (extendedExposureUSD.lessThan(0)) {
|
|
142
|
-
return {
|
|
143
|
-
vesu_amount: amountInUsdc,
|
|
144
|
-
extended_amount: new Web3Number(0, USDC_TOKEN_DECIMALS),
|
|
145
|
-
extended_leverage,
|
|
146
|
-
vesu_leverage,
|
|
147
|
-
};
|
|
148
|
-
}
|
|
149
|
-
logger.debug(`calculateAmountDistributionForWithdrawal vesuExposureUsd=${vesuExposureUSD.toNumber()}`);
|
|
150
|
-
logger.debug(`calculateAmountDistributionForWithdrawal extendedExposureUsd=${extendedExposureUSD.toNumber()}`);
|
|
151
|
-
logger.debug(`calculateAmountDistributionForWithdrawal amountInUsdc=${amountInUsdc.toNumber()}`);
|
|
152
|
-
logger.debug(`calculateAmountDistributionForWithdrawal extendedLeverage=${extended_leverage}`);
|
|
153
|
-
logger.debug(`calculateAmountDistributionForWithdrawal vesuLeverage=${vesu_leverage}`);
|
|
154
|
-
const numerator1 = amountInUsdc.multipliedBy(extended_leverage);
|
|
155
|
-
const numerator2 = vesuExposureUSD;
|
|
156
|
-
const numerator3 = extendedExposureUSD.multipliedBy(-1);
|
|
157
|
-
const finalNumerator = numerator1.plus(numerator2).plus(numerator3);
|
|
158
|
-
const denominator = extended_leverage + vesu_leverage;
|
|
159
|
-
const vesuAmountInUSDC = finalNumerator.dividedBy(denominator);
|
|
160
|
-
logger.debug(`calculateAmountDistributionForWithdrawal vesuAmountInUsdc=${vesuAmountInUSDC.toNumber()}`);
|
|
161
|
-
const extendedAmountInUSDC = amountInUsdc.minus(vesuAmountInUSDC);
|
|
162
|
-
logger.debug(`calculateAmountDistributionForWithdrawal extendedAmountInUsdc=${extendedAmountInUSDC.toNumber()}`);
|
|
163
|
-
//console.log("the vesu amount in usdc is", vesuAmountInUSDC.toNumber());
|
|
164
|
-
//console.log("the extended amount in usdc is", extendedAmountInUSDC.toNumber());\
|
|
165
|
-
await new Promise((resolve) => setTimeout(resolve, 10000));
|
|
166
|
-
return {
|
|
167
|
-
vesu_amount: vesuAmountInUSDC,
|
|
168
|
-
extended_amount: extendedAmountInUSDC,
|
|
169
|
-
extended_leverage,
|
|
170
|
-
vesu_leverage,
|
|
171
|
-
};
|
|
172
|
-
} catch (err) {
|
|
173
|
-
logger.error(
|
|
174
|
-
`error calculating amount distribution for withdrawal: ${err}`,
|
|
175
|
-
);
|
|
176
|
-
return null;
|
|
177
|
-
}
|
|
178
|
-
};
|
|
179
|
-
/**
|
|
180
|
-
* calculate the leverage required for Avnu
|
|
181
|
-
* calculates the optimal leverage for Avnu based on LTV ratios and price drop protection
|
|
182
|
-
* @returns {number} The calculated leverage value
|
|
183
|
-
*/
|
|
184
|
-
export const calculateVesuLeverage = () => {
|
|
185
|
-
const targetLtv = VesuConfig.targetLtv;
|
|
186
|
-
const debtBorrowed = targetLtv / (1 - targetLtv);
|
|
187
|
-
const leverage = (1 + debtBorrowed);
|
|
188
|
-
return leverage;
|
|
189
|
-
};
|
|
190
|
-
|
|
191
|
-
/**
|
|
192
|
-
* calculate leverage for extended
|
|
193
|
-
* calculates the maximum safe leverage for Extended based on maintenance margin and price drop protection
|
|
194
|
-
* @returns {number} The calculated leverage value
|
|
195
|
-
*/
|
|
196
|
-
export const calculateExtendedLevergae = () => {
|
|
197
|
-
const extended_leverage_max =
|
|
198
|
-
1 / (MAINTENANCE_MARGIN + MAX_PRICE_DROP_PERCENTAGE);
|
|
199
|
-
return Math.floor(extended_leverage_max);
|
|
200
|
-
};
|
|
201
|
-
|
|
202
|
-
/**
|
|
203
|
-
* calculates the debt amount for leverage operations
|
|
204
|
-
* Determines how much debt to add or remove based on collateral changes and target health factor
|
|
205
|
-
* @param {Web3Number} collateralAmount - Current collateral amount
|
|
206
|
-
* @param {Web3Number} debtAmount - Current debt amount
|
|
207
|
-
* @param {number} debtPrice - Current price of the debt token
|
|
208
|
-
* @param {number} maxLtv - Maximum loan-to-value ratio (default: MAX_LTV_BTC_USDC)
|
|
209
|
-
* @param {number} addedAmount - Amount being added to collateral
|
|
210
|
-
* @param {number} collateralPrice - Current price of the collateral token
|
|
211
|
-
* @param {boolean} isDeposit - Whether this is a deposit (true) or withdrawal (false)
|
|
212
|
-
* @returns {object} Object containing deltadebtAmountUnits and isIncrease flag
|
|
213
|
-
*/
|
|
214
|
-
// In case BTC_PRICE DROPS the added amount will be zero, and use this formula to calculated the debt that needs to be paid to maintain the ltv
|
|
215
|
-
|
|
216
|
-
export const calculateDebtAmount = (
|
|
217
|
-
collateralAmount: Web3Number,
|
|
218
|
-
debtAmount: Web3Number,
|
|
219
|
-
debtPrice: number,
|
|
220
|
-
maxLtv: number = VesuConfig.maxLtv,
|
|
221
|
-
addedAmount: Web3Number, // this is in btc
|
|
222
|
-
collateralPrice: number,
|
|
223
|
-
isDeposit: boolean,
|
|
224
|
-
targetLtv: number = VesuConfig.targetLtv,
|
|
225
|
-
) => {
|
|
226
|
-
try {
|
|
227
|
-
// => X = (((collateral + legDepositAmount) * collateralPrice * ltv) - (debt * debtPrice * target hf)) / (target hf - ltv)
|
|
228
|
-
logger.debug(`calculateDebtAmount maxLtv=${maxLtv}, collateralAmount=${collateralAmount.toNumber()}`);
|
|
229
|
-
logger.debug(`calculateDebtAmount targetLtv=${targetLtv}, debtAmount=${debtAmount.toNumber()}`);
|
|
230
|
-
|
|
231
|
-
const targetHf = VesuConfig.maxLtv / targetLtv;
|
|
232
|
-
logger.debug(`calculateDebtAmount targetHf=${targetHf}`);
|
|
233
|
-
const addedCollateral = addedAmount.multipliedBy(isDeposit ? 1 : -1);
|
|
234
|
-
logger.debug(`calculateDebtAmount addedCollateral=${addedCollateral.toNumber()}, collateralPrice=${collateralPrice}`);
|
|
235
|
-
const numerator1 = collateralAmount
|
|
236
|
-
.plus(addedCollateral)
|
|
237
|
-
.multipliedBy(collateralPrice)
|
|
238
|
-
.multipliedBy(maxLtv);
|
|
239
|
-
logger.debug(`calculateDebtAmount numerator1=${numerator1.toNumber()}`);
|
|
240
|
-
const numerator2 = debtAmount
|
|
241
|
-
.multipliedBy(debtPrice)
|
|
242
|
-
.multipliedBy(targetHf);
|
|
243
|
-
logger.debug(`calculateDebtAmount numerator2=${numerator2.toNumber()}`);
|
|
244
|
-
const denominator = targetHf - maxLtv;
|
|
245
|
-
logger.debug(`calculateDebtAmount denominator=${denominator}`);
|
|
246
|
-
const x_debt_usd = numerator1.minus(numerator2).dividedBy(denominator);
|
|
247
|
-
logger.debug(`calculateDebtAmount xDebtUsd=${x_debt_usd.toNumber()}`);
|
|
248
|
-
const deltadebtAmountUnits = new Web3Number(
|
|
249
|
-
x_debt_usd.dividedBy(debtPrice).toFixed(2),
|
|
250
|
-
2,
|
|
251
|
-
);
|
|
252
|
-
const isIncrease = x_debt_usd.greaterThan(0);
|
|
253
|
-
return { deltadebtAmountUnits, isIncrease };
|
|
254
|
-
} catch (err) {
|
|
255
|
-
return { deltadebtAmountUnits: null, isIncrease: null };
|
|
256
|
-
}
|
|
257
|
-
};
|
|
258
|
-
|
|
259
|
-
/**
|
|
260
|
-
* calculate the debt amount to be repaid for withdrawal
|
|
261
|
-
* @param debtAmount in debt units
|
|
262
|
-
* @param collateralAmount in collateral units
|
|
263
|
-
* @param maxLtv in percentage
|
|
264
|
-
* @param withdrawalAmount in collateral units
|
|
265
|
-
* @param collateralPrice in usd
|
|
266
|
-
* @param debtPrice in usd
|
|
267
|
-
* @returns deltadebtAmountUnits in debt units
|
|
268
|
-
* isIncrease: true if the debt amount is increasing, false if it is decreasing
|
|
269
|
-
*/
|
|
270
|
-
export const calculateDebtReductionAmountForWithdrawal = (
|
|
271
|
-
debtAmount: Web3Number,
|
|
272
|
-
collateralAmount: Web3Number,
|
|
273
|
-
maxLtv: number = MAX_LTV_BTC_USDC,
|
|
274
|
-
withdrawalAmount: Web3Number,
|
|
275
|
-
collateralPrice: number,
|
|
276
|
-
debtPrice: number,
|
|
277
|
-
usdcDecimals: number,
|
|
278
|
-
) => {
|
|
279
|
-
try {
|
|
280
|
-
const vesuLeverage = calculateVesuLeverage();
|
|
281
|
-
const numerator1 = collateralAmount
|
|
282
|
-
.multipliedBy(collateralPrice)
|
|
283
|
-
.multipliedBy(maxLtv)
|
|
284
|
-
.multipliedBy(-1);
|
|
285
|
-
withdrawalAmount = withdrawalAmount.multipliedBy(vesuLeverage);
|
|
286
|
-
const numerator2 = debtAmount
|
|
287
|
-
.multipliedBy(debtPrice)
|
|
288
|
-
.multipliedBy(TARGET_HF);
|
|
289
|
-
const numerator3 = withdrawalAmount
|
|
290
|
-
.multipliedBy(collateralPrice)
|
|
291
|
-
.multipliedBy(maxLtv);
|
|
292
|
-
const numeratorTotal = numerator1.plus(numerator2).plus(numerator3);
|
|
293
|
-
const denominator = debtPrice * TARGET_HF;
|
|
294
|
-
const x_debt_usdc = numeratorTotal.dividedBy(denominator);
|
|
295
|
-
let deltadebtAmountUnits = x_debt_usdc
|
|
296
|
-
.multipliedBy(-1)
|
|
297
|
-
.toFixed(usdcDecimals); // means we are paying debt
|
|
298
|
-
return { deltadebtAmountUnits };
|
|
299
|
-
} catch (err) {
|
|
300
|
-
return { deltadebtAmountUnits: null };
|
|
301
|
-
}
|
|
302
|
-
};
|
|
303
|
-
|
|
304
|
-
|
|
305
|
-
// ! required?
|
|
306
|
-
/**
|
|
307
|
-
* calculate the amount to deposit on extended when incurring losses
|
|
308
|
-
* @param client - The client
|
|
309
|
-
* @returns The amount to deposit on extended when incurring losses
|
|
310
|
-
*/
|
|
311
|
-
export const calculateAmountDepositOnExtendedWhenIncurringLosses = async (
|
|
312
|
-
client: ExtendedWrapper,
|
|
313
|
-
) => {
|
|
314
|
-
try {
|
|
315
|
-
const extendedHoldings = await client.getHoldings();
|
|
316
|
-
const extended_leverage = calculateExtendedLevergae();
|
|
317
|
-
const latestPosition = (await client.getPositions()).data.pop();
|
|
318
|
-
if (!extendedHoldings || !latestPosition) {
|
|
319
|
-
logger.error(
|
|
320
|
-
`error getting extended position: extendedHoldings=${extendedHoldings}, latestPosition=${latestPosition}`,
|
|
321
|
-
);
|
|
322
|
-
return null;
|
|
323
|
-
}
|
|
324
|
-
const positionValueInUSD = new Web3Number(
|
|
325
|
-
latestPosition.value,
|
|
326
|
-
USDC_TOKEN_DECIMALS,
|
|
327
|
-
);
|
|
328
|
-
const equity = extendedHoldings.data.equity;
|
|
329
|
-
const deposit = positionValueInUSD
|
|
330
|
-
.dividedBy(extended_leverage)
|
|
331
|
-
.minus(equity)
|
|
332
|
-
.toFixed(2);
|
|
333
|
-
return new Web3Number(deposit, USDC_TOKEN_DECIMALS);
|
|
334
|
-
} catch (err) {
|
|
335
|
-
logger.error(
|
|
336
|
-
`error calculating amount deposit on extended when incurring losses: ${err}`,
|
|
337
|
-
);
|
|
338
|
-
return null;
|
|
339
|
-
}
|
|
340
|
-
};
|
|
341
|
-
|
|
342
|
-
/**
|
|
343
|
-
* calculate the amount of collateral to deposit to maintain the ltv
|
|
344
|
-
* The formula is:
|
|
345
|
-
* ((debt * debtPrice * targetHF) - (collateral * collateralPrice * ltv)) / ltv
|
|
346
|
-
* @param collateralAmount in collateral units
|
|
347
|
-
* @param debtAmount in debt units
|
|
348
|
-
* @param debtPrice in usd
|
|
349
|
-
* @param maxLtv
|
|
350
|
-
* @param collateralPrice in usd
|
|
351
|
-
* @param targetHF
|
|
352
|
-
* @returns deltaCollateralAmountUnits in collateral units
|
|
353
|
-
* null if there is an error
|
|
354
|
-
*/
|
|
355
|
-
export const calculateWBTCAmountToMaintainLTV = (
|
|
356
|
-
collateralAmount: Web3Number,
|
|
357
|
-
debtAmount: Web3Number,
|
|
358
|
-
debtPrice: number,
|
|
359
|
-
maxLtv: number = MAX_LIQUIDATION_RATIO,
|
|
360
|
-
collateralPrice: number,
|
|
361
|
-
) => {
|
|
362
|
-
try {
|
|
363
|
-
const targetHf = VesuConfig.maxLtv / VesuConfig.targetLtv;
|
|
364
|
-
const numerator1 = collateralAmount
|
|
365
|
-
.multipliedBy(collateralPrice)
|
|
366
|
-
.multipliedBy(maxLtv);
|
|
367
|
-
const numerator2 = debtAmount
|
|
368
|
-
.multipliedBy(debtPrice)
|
|
369
|
-
.multipliedBy(targetHf);
|
|
370
|
-
const denominator = maxLtv;
|
|
371
|
-
const collateralAmountToMaintainLTV = numerator2
|
|
372
|
-
.minus(numerator1)
|
|
373
|
-
.dividedBy(denominator);
|
|
374
|
-
let deltaCollateralAmountUnits = new Web3Number(
|
|
375
|
-
collateralAmountToMaintainLTV
|
|
376
|
-
.dividedBy(collateralPrice)
|
|
377
|
-
.toFixed(WBTC_TOKEN_DECIMALS),
|
|
378
|
-
WBTC_TOKEN_DECIMALS,
|
|
379
|
-
);
|
|
380
|
-
return { deltaCollateralAmountUnits };
|
|
381
|
-
} catch (err) {
|
|
382
|
-
return { deltaCollateralAmountUnits: null };
|
|
383
|
-
}
|
|
384
|
-
};
|
|
385
|
-
|
|
386
|
-
// ! required?
|
|
387
|
-
export const calculateExposureDelta = (
|
|
388
|
-
exposure_extended: number,
|
|
389
|
-
exposure_vesu: number,
|
|
390
|
-
) => {
|
|
391
|
-
const exposure_delta = new Web3Number(exposure_extended - exposure_vesu, 2);
|
|
392
|
-
return exposure_delta.absoluteValue().toNumber();
|
|
393
|
-
};
|
|
394
|
-
|
|
395
|
-
|
|
396
|
-
// ! required?
|
|
397
|
-
/**
|
|
398
|
-
* calculate the delta percentage between the current btc price and the last btc price
|
|
399
|
-
* @param {number} btcPrice - The current btc price
|
|
400
|
-
* @param {number} lastBtcPrice - The last btc price
|
|
401
|
-
* @returns {number} The delta percentage
|
|
402
|
-
*/
|
|
403
|
-
export const calculateBTCPriceDelta = (
|
|
404
|
-
btcPrice: number,
|
|
405
|
-
lastBtcPrice: number,
|
|
406
|
-
) => {
|
|
407
|
-
return ((btcPrice - lastBtcPrice) / lastBtcPrice) * 100;
|
|
408
|
-
};
|
|
409
|
-
|
|
410
|
-
export const calculateVesUPositionSizeGivenExtended = (
|
|
411
|
-
extendedPositonSize: number,
|
|
412
|
-
extendedHoldingAmount: Web3Number,
|
|
413
|
-
collateralAmount: Web3Number,
|
|
414
|
-
extendedBtcPrice: number,
|
|
415
|
-
) => {
|
|
416
|
-
const extendedLeverage = calculateExtendedLevergae();
|
|
417
|
-
const vesuLeverage = calculateVesuLeverage();
|
|
418
|
-
logger.debug(`calculateVesUPositionSizeGivenExtended extendedLeverage=${extendedLeverage}`);
|
|
419
|
-
logger.debug(`calculateVesUPositionSizeGivenExtended vesuLeverage=${vesuLeverage}`);
|
|
420
|
-
const extendedAmountInBTC = new Web3Number(extendedHoldingAmount.dividedBy(extendedBtcPrice).toFixed(WBTC_TOKEN_DECIMALS), WBTC_TOKEN_DECIMALS);
|
|
421
|
-
logger.debug(`calculateVesUPositionSizeGivenExtended extendedAmountInBTC=${extendedAmountInBTC.toNumber()}`);
|
|
422
|
-
const numerator1 = extendedAmountInBTC
|
|
423
|
-
.multipliedBy(extendedLeverage)
|
|
424
|
-
.plus(extendedPositonSize);
|
|
425
|
-
logger.debug(`calculateVesUPositionSizeGivenExtended numerator1=${numerator1.toNumber()}`);
|
|
426
|
-
const numerator2 = collateralAmount
|
|
427
|
-
.multipliedBy(-1);
|
|
428
|
-
logger.debug(`calculateVesUPositionSizeGivenExtended numerator2=${numerator2.toNumber()}`);
|
|
429
|
-
const vesuAmountInBTC = new Web3Number(numerator1.plus(numerator2).dividedBy(vesuLeverage).toFixed(WBTC_TOKEN_DECIMALS), WBTC_TOKEN_DECIMALS);
|
|
430
|
-
logger.debug(`calculateVesUPositionSizeGivenExtended vesuAmountInBTC=${vesuAmountInBTC.toNumber()}`);
|
|
431
|
-
return {
|
|
432
|
-
vesuAmountInBTC: vesuAmountInBTC,
|
|
433
|
-
extendedAmountInBTC: extendedAmountInBTC,
|
|
434
|
-
};
|
|
435
|
-
};
|
|
436
|
-
|
|
437
|
-
/**
|
|
438
|
-
* calculate the debt amount to be repaid to maintain the ltv
|
|
439
|
-
* @param maxLtv - The maximum ltv
|
|
440
|
-
* @param existingVesuCollateral - The existing vesu collateral
|
|
441
|
-
* @param existingVesuDebt - The existing vesu debt
|
|
442
|
-
* @param collateralPrice - The collateral price
|
|
443
|
-
* @param debtPrice - The debt price
|
|
444
|
-
* @param targetHf - The target hf
|
|
445
|
-
* @@dev returns negative to represent debt to be repaid
|
|
446
|
-
* @returns The debt amount to be repaid
|
|
447
|
-
*/
|
|
448
|
-
export const calculateDeltaDebtAmount = (
|
|
449
|
-
existingVesuCollateral: Web3Number,
|
|
450
|
-
existingVesuDebt: Web3Number,
|
|
451
|
-
debtPrice: number,
|
|
452
|
-
collateralPrice: number,
|
|
453
|
-
) => {
|
|
454
|
-
const currentHf = HealthFactorMath.getHealthFactor(
|
|
455
|
-
existingVesuCollateral,
|
|
456
|
-
collateralPrice,
|
|
457
|
-
VesuConfig.maxLtv,
|
|
458
|
-
existingVesuDebt,
|
|
459
|
-
debtPrice
|
|
460
|
-
);
|
|
461
|
-
const targetHf = VesuConfig.maxLtv / VesuConfig.targetLtv;
|
|
462
|
-
logger.debug(`calculateDeltaDebtAmount currentHf=${currentHf} targetHf=${targetHf}`);
|
|
463
|
-
|
|
464
|
-
const term1 = existingVesuCollateral
|
|
465
|
-
.multipliedBy(collateralPrice)
|
|
466
|
-
.multipliedBy(VesuConfig.maxLtv);
|
|
467
|
-
|
|
468
|
-
const term2 = existingVesuDebt
|
|
469
|
-
.multipliedBy(debtPrice)
|
|
470
|
-
.multipliedBy(targetHf)
|
|
471
|
-
.multipliedBy(-1);
|
|
472
|
-
const debtAmountToBeRepaid = term1.plus(term2).dividedBy(targetHf);
|
|
473
|
-
return {
|
|
474
|
-
deltaDebt: new Web3Number(
|
|
475
|
-
debtAmountToBeRepaid.toFixed(USDC_TOKEN_DECIMALS),
|
|
476
|
-
USDC_TOKEN_DECIMALS,
|
|
477
|
-
),
|
|
478
|
-
shouldRebalance: currentHf < (targetHf - 0.05),
|
|
479
|
-
}
|
|
480
|
-
};
|
|
481
|
-
|
|
482
|
-
export const calculatePositionToCloseToWithdrawAmount = async (
|
|
483
|
-
extendedBalance: Balance,
|
|
484
|
-
extendedPositions: Position,
|
|
485
|
-
amountToWithdraw: Web3Number,
|
|
486
|
-
) => {
|
|
487
|
-
try {
|
|
488
|
-
const extendedLeverage = calculateExtendedLevergae();
|
|
489
|
-
const extendedPosition = extendedPositions.value;
|
|
490
|
-
const marginRequired = new Web3Number(
|
|
491
|
-
extendedBalance.initialMargin,
|
|
492
|
-
USDC_TOKEN_DECIMALS,
|
|
493
|
-
);
|
|
494
|
-
const unrealisedPnl = new Web3Number(
|
|
495
|
-
extendedBalance.unrealisedPnl,
|
|
496
|
-
USDC_TOKEN_DECIMALS,
|
|
497
|
-
);
|
|
498
|
-
const availableForWithdrawal = new Web3Number(
|
|
499
|
-
extendedBalance.availableForWithdrawal,
|
|
500
|
-
USDC_TOKEN_DECIMALS,
|
|
501
|
-
);
|
|
502
|
-
const upnlPercent = unrealisedPnl.dividedBy(extendedPosition);
|
|
503
|
-
/**
|
|
504
|
-
* New Formula
|
|
505
|
-
*/
|
|
506
|
-
const walletBalance = new Web3Number(
|
|
507
|
-
extendedBalance.balance,
|
|
508
|
-
USDC_TOKEN_DECIMALS,
|
|
509
|
-
);
|
|
510
|
-
const term1 = marginRequired
|
|
511
|
-
.minus(walletBalance)
|
|
512
|
-
.minus(availableForWithdrawal)
|
|
513
|
-
.plus(amountToWithdraw)
|
|
514
|
-
.multipliedBy(extendedLeverage);
|
|
515
|
-
const denominator = upnlPercent.multipliedBy(extendedLeverage).plus(1);
|
|
516
|
-
return new Web3Number(
|
|
517
|
-
Math.ceil(
|
|
518
|
-
term1.dividedBy(denominator).dividedBy(extendedLeverage).toNumber(),
|
|
519
|
-
),
|
|
520
|
-
USDC_TOKEN_DECIMALS,
|
|
521
|
-
);
|
|
522
|
-
} catch (err) {
|
|
523
|
-
logger.error(
|
|
524
|
-
`error calculating position to close to withdraw amount: ${err}`,
|
|
525
|
-
);
|
|
526
|
-
return new Web3Number(0, USDC_TOKEN_DECIMALS);
|
|
527
|
-
}
|
|
528
|
-
};
|