@strkfarm/sdk 2.0.0-dev.35 → 2.0.0-dev.36

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (50) hide show
  1. package/dist/cli.js +2 -2
  2. package/dist/cli.mjs +2 -2
  3. package/dist/index.browser.global.js +19244 -28574
  4. package/dist/index.browser.mjs +8439 -17951
  5. package/dist/index.d.ts +578 -2746
  6. package/dist/index.js +8528 -18078
  7. package/dist/index.mjs +8456 -17968
  8. package/package.json +3 -3
  9. package/src/data/universal-vault.abi.json +8 -7
  10. package/src/dataTypes/bignumber.browser.ts +5 -1
  11. package/src/dataTypes/bignumber.node.ts +5 -0
  12. package/src/global.ts +21 -1
  13. package/src/interfaces/common.tsx +39 -4
  14. package/src/modules/avnu.ts +19 -10
  15. package/src/modules/index.ts +1 -1
  16. package/src/strategies/base-strategy.ts +92 -8
  17. package/src/strategies/constants.ts +8 -3
  18. package/src/strategies/ekubo-cl-vault.tsx +150 -16
  19. package/src/strategies/factory.ts +21 -1
  20. package/src/strategies/index.ts +2 -7
  21. package/src/strategies/registry.ts +28 -5
  22. package/src/strategies/sensei.ts +29 -13
  23. package/src/strategies/svk-strategy.ts +26 -2
  24. package/src/strategies/token-boosted-xstrk-carry-strategy.tsx +1057 -0
  25. package/src/strategies/universal-adapters/avnu-adapter.ts +16 -8
  26. package/src/strategies/universal-adapters/index.ts +1 -2
  27. package/src/strategies/universal-adapters/svk-troves-adapter.ts +19 -6
  28. package/src/strategies/universal-adapters/vesu-modify-position-adapter.ts +22 -3
  29. package/src/strategies/universal-adapters/vesu-multiply-adapter.ts +75 -52
  30. package/src/strategies/universal-adapters/vesu-position-common.ts +38 -31
  31. package/src/strategies/universal-lst-muliplier-strategy.tsx +222 -269
  32. package/src/strategies/universal-strategy.tsx +166 -105
  33. package/src/strategies/vesu-rebalance.tsx +3 -6
  34. package/src/strategies/yoloVault.ts +1084 -0
  35. package/src/utils/health-factor-math.ts +29 -0
  36. package/src/modules/ExtendedWrapperSDk/index.ts +0 -62
  37. package/src/modules/ExtendedWrapperSDk/types.ts +0 -334
  38. package/src/modules/ExtendedWrapperSDk/wrapper.ts +0 -611
  39. package/src/strategies/universal-adapters/extended-adapter.ts +0 -860
  40. package/src/strategies/universal-adapters/usdc<>usdce-adapter.ts +0 -200
  41. package/src/strategies/usdc-boosted-strategy.tsx +0 -693
  42. package/src/strategies/vesu-extended-strategy/services/executionService.ts +0 -2234
  43. package/src/strategies/vesu-extended-strategy/services/extended-vesu-state-manager.ts +0 -4254
  44. package/src/strategies/vesu-extended-strategy/services/ltv-imbalance-rebalance-math.ts +0 -783
  45. package/src/strategies/vesu-extended-strategy/services/operationService.ts +0 -56
  46. package/src/strategies/vesu-extended-strategy/types/transaction-metadata.ts +0 -88
  47. package/src/strategies/vesu-extended-strategy/utils/config.runtime.ts +0 -78
  48. package/src/strategies/vesu-extended-strategy/utils/constants.ts +0 -48
  49. package/src/strategies/vesu-extended-strategy/utils/helper.ts +0 -528
  50. 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
- };