@strkfarm/sdk 2.0.0-dev.21 → 2.0.0-dev.23
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/index.browser.global.js +887 -262
- package/dist/index.browser.mjs +813 -188
- package/dist/index.d.ts +24 -2
- package/dist/index.js +814 -188
- package/dist/index.mjs +813 -188
- package/package.json +1 -1
- package/src/strategies/universal-adapters/avnu-adapter.ts +2 -1
- package/src/strategies/vesu-extended-strategy/services/operationService.ts +1 -0
- package/src/strategies/vesu-extended-strategy/utils/helper.ts +32 -2
- package/src/strategies/vesu-extended-strategy/vesu-extended-strategy.tsx +1144 -337
package/dist/index.mjs
CHANGED
|
@@ -28222,14 +28222,14 @@ var calculateExposureDelta = (exposure_extended, exposure_vesu) => {
|
|
|
28222
28222
|
var calculateBTCPriceDelta = (btcPrice, lastBtcPrice) => {
|
|
28223
28223
|
return (btcPrice - lastBtcPrice) / lastBtcPrice * 100;
|
|
28224
28224
|
};
|
|
28225
|
-
var calculateVesUPositionSizeGivenExtended = (extendedPositonValue, extendedHoldingAmount, collateralAmount, collateralPrice) => {
|
|
28225
|
+
var calculateVesUPositionSizeGivenExtended = (extendedPositonValue, extendedHoldingAmount, collateralAmount, collateralPrice, vesuDebtAmountToBeRepaid) => {
|
|
28226
28226
|
const extendedLeverage = calculateExtendedLevergae();
|
|
28227
28227
|
const vesuLeverage = calculateVesuLeverage();
|
|
28228
28228
|
const extendedAmount = extendedHoldingAmount;
|
|
28229
28229
|
const extendedAmountInBTC = extendedAmount.dividedBy(collateralPrice);
|
|
28230
28230
|
const numerator1 = extendedAmount.multipliedBy(extendedLeverage).plus(extendedPositonValue);
|
|
28231
28231
|
const numerator2 = collateralAmount.multipliedBy(collateralPrice).multipliedBy(-1);
|
|
28232
|
-
const vesuAmountInUsd = numerator1.plus(numerator2).dividedBy(vesuLeverage);
|
|
28232
|
+
const vesuAmountInUsd = numerator1.plus(numerator2).dividedBy(vesuLeverage).plus(vesuDebtAmountToBeRepaid);
|
|
28233
28233
|
const vesuAmountInBTC = vesuAmountInUsd.dividedBy(collateralPrice).toFixed(WBTC_TOKEN_DECIMALS);
|
|
28234
28234
|
return {
|
|
28235
28235
|
vesuAmountInUsd: vesuAmountInUsd.toFixed(2),
|
|
@@ -28237,6 +28237,17 @@ var calculateVesUPositionSizeGivenExtended = (extendedPositonValue, extendedHold
|
|
|
28237
28237
|
extendedAmountInBTC
|
|
28238
28238
|
};
|
|
28239
28239
|
};
|
|
28240
|
+
var calculateDeltaDebtAmount = (maxLtv = MAX_LTV_BTC_USDC, existingVesuCollateral, existingVesuDebt, collateralPrice, debtPrice, targetHf = TARGET_HF) => {
|
|
28241
|
+
try {
|
|
28242
|
+
const term1 = existingVesuCollateral.multipliedBy(collateralPrice).multipliedBy(maxLtv).dividedBy(targetHf);
|
|
28243
|
+
const term2 = existingVesuDebt.multipliedBy(debtPrice).multipliedBy(targetHf).multipliedBy(-1);
|
|
28244
|
+
const debtAmountToBeRepaid = term1.plus(term2).dividedBy(targetHf);
|
|
28245
|
+
return debtAmountToBeRepaid;
|
|
28246
|
+
} catch (err) {
|
|
28247
|
+
logger.error(`error calculating delta position: ${err}`);
|
|
28248
|
+
return null;
|
|
28249
|
+
}
|
|
28250
|
+
};
|
|
28240
28251
|
|
|
28241
28252
|
// src/utils/health-factor-math.ts
|
|
28242
28253
|
var HealthFactorMath = class {
|
|
@@ -30659,6 +30670,8 @@ var AvnuAdapter = class _AvnuAdapter extends BaseAdapter {
|
|
|
30659
30670
|
quote,
|
|
30660
30671
|
vaultAllocator.address
|
|
30661
30672
|
);
|
|
30673
|
+
const dataObject = quote;
|
|
30674
|
+
logger.info(`${_AvnuAdapter.name}::getQuotesAvnu finalAmountOfWbtcOut : ${dataObject.avnuFees} ${parseInt(dataObject.buyAmount.toString(), 16)} ${parseInt(dataObject.sellAmount.toString(), 16)} ${parseInt(dataObject.sellAmount.toString(), 16)}`);
|
|
30662
30675
|
const swapCallData = getCalldata[0];
|
|
30663
30676
|
const amount = uint25614.bnToUint256(quote.sellAmountInUsd * 10 ** 7);
|
|
30664
30677
|
return [
|
|
@@ -34405,11 +34418,17 @@ var VesuExtendedMultiplierStrategy = class _VesuExtendedMultiplierStrategy exten
|
|
|
34405
34418
|
WALLET_ADDRESS,
|
|
34406
34419
|
usdceToken.decimals
|
|
34407
34420
|
);
|
|
34408
|
-
logger.info(
|
|
34421
|
+
logger.info(
|
|
34422
|
+
`${_VesuExtendedMultiplierStrategy.name}::moveAssetsToVaultAllocator walletBalance: ${walletBalance}`
|
|
34423
|
+
);
|
|
34409
34424
|
const amountToBeTransferred = amount.minimum(walletBalance);
|
|
34410
|
-
logger.info(
|
|
34425
|
+
logger.info(
|
|
34426
|
+
`${_VesuExtendedMultiplierStrategy.name}::moveAssetsToVaultAllocator amountToBeTransferred: ${amountToBeTransferred.toNumber()}`
|
|
34427
|
+
);
|
|
34411
34428
|
if (amountToBeTransferred.lessThan(0)) {
|
|
34412
|
-
logger.error(
|
|
34429
|
+
logger.error(
|
|
34430
|
+
`${_VesuExtendedMultiplierStrategy.name}::moveAssetsToVaultAllocator amountToBeTransferred is less than 0: ${amountToBeTransferred.toNumber()}`
|
|
34431
|
+
);
|
|
34413
34432
|
return {
|
|
34414
34433
|
calls: [],
|
|
34415
34434
|
status: false
|
|
@@ -34447,10 +34466,14 @@ var VesuExtendedMultiplierStrategy = class _VesuExtendedMultiplierStrategy exten
|
|
|
34447
34466
|
}
|
|
34448
34467
|
async shouldInvest() {
|
|
34449
34468
|
try {
|
|
34450
|
-
logger.info(
|
|
34469
|
+
logger.info(
|
|
34470
|
+
`${_VesuExtendedMultiplierStrategy.name}::shouldInvest starting`
|
|
34471
|
+
);
|
|
34451
34472
|
const vesuAdapter = await this.getVesuAdapter();
|
|
34452
34473
|
const extendedAdapter = await this.getExtendedAdapter();
|
|
34453
|
-
logger.info(
|
|
34474
|
+
logger.info(
|
|
34475
|
+
`${_VesuExtendedMultiplierStrategy.name}::shouldInvest adapters fetched: vesuAdapter=${!!vesuAdapter}, extendedAdapter=${!!extendedAdapter}, extendedAdapter.client=${!!extendedAdapter?.client}`
|
|
34476
|
+
);
|
|
34454
34477
|
if (!vesuAdapter) {
|
|
34455
34478
|
logger.error(
|
|
34456
34479
|
`Vesu adapter not configured in metadata. This is a configuration issue, not a temporary failure.`
|
|
@@ -34462,7 +34485,8 @@ var VesuExtendedMultiplierStrategy = class _VesuExtendedMultiplierStrategy exten
|
|
|
34462
34485
|
extendedLeverage: 0,
|
|
34463
34486
|
collateralPrice: 0,
|
|
34464
34487
|
debtPrice: 0,
|
|
34465
|
-
vesuLeverage: 0
|
|
34488
|
+
vesuLeverage: 0,
|
|
34489
|
+
debtAmountToBeRepaid: new Web3Number(0, 0)
|
|
34466
34490
|
};
|
|
34467
34491
|
}
|
|
34468
34492
|
if (!extendedAdapter) {
|
|
@@ -34476,7 +34500,8 @@ var VesuExtendedMultiplierStrategy = class _VesuExtendedMultiplierStrategy exten
|
|
|
34476
34500
|
extendedLeverage: 0,
|
|
34477
34501
|
collateralPrice: 0,
|
|
34478
34502
|
debtPrice: 0,
|
|
34479
|
-
vesuLeverage: 0
|
|
34503
|
+
vesuLeverage: 0,
|
|
34504
|
+
debtAmountToBeRepaid: new Web3Number(0, 0)
|
|
34480
34505
|
};
|
|
34481
34506
|
}
|
|
34482
34507
|
if (!extendedAdapter.client) {
|
|
@@ -34490,10 +34515,13 @@ var VesuExtendedMultiplierStrategy = class _VesuExtendedMultiplierStrategy exten
|
|
|
34490
34515
|
extendedLeverage: 0,
|
|
34491
34516
|
collateralPrice: 0,
|
|
34492
34517
|
debtPrice: 0,
|
|
34493
|
-
vesuLeverage: 0
|
|
34518
|
+
vesuLeverage: 0,
|
|
34519
|
+
debtAmountToBeRepaid: new Web3Number(0, 0)
|
|
34494
34520
|
};
|
|
34495
34521
|
}
|
|
34496
|
-
logger.info(
|
|
34522
|
+
logger.info(
|
|
34523
|
+
`${_VesuExtendedMultiplierStrategy.name}::shouldInvest calling getUnusedBalance`
|
|
34524
|
+
);
|
|
34497
34525
|
const balance = await this.getUnusedBalance();
|
|
34498
34526
|
if (!Number.isFinite(balance.usdValue) || balance.usdValue < 0) {
|
|
34499
34527
|
logger.error(
|
|
@@ -34506,13 +34534,18 @@ var VesuExtendedMultiplierStrategy = class _VesuExtendedMultiplierStrategy exten
|
|
|
34506
34534
|
extendedLeverage: 0,
|
|
34507
34535
|
collateralPrice: 0,
|
|
34508
34536
|
debtPrice: 0,
|
|
34509
|
-
vesuLeverage: 0
|
|
34537
|
+
vesuLeverage: 0,
|
|
34538
|
+
debtAmountToBeRepaid: new Web3Number(0, 0)
|
|
34510
34539
|
};
|
|
34511
34540
|
}
|
|
34512
|
-
logger.info(
|
|
34541
|
+
logger.info(
|
|
34542
|
+
`${_VesuExtendedMultiplierStrategy.name}::shouldInvest balance: ${balance.usdValue}`
|
|
34543
|
+
);
|
|
34513
34544
|
const usdcBalanceOnExtended = await extendedAdapter.getExtendedDepositAmount();
|
|
34514
34545
|
if (usdcBalanceOnExtended) {
|
|
34515
|
-
const availableForWithdrawal = parseFloat(
|
|
34546
|
+
const availableForWithdrawal = parseFloat(
|
|
34547
|
+
usdcBalanceOnExtended.availableForWithdrawal
|
|
34548
|
+
);
|
|
34516
34549
|
if (!Number.isFinite(availableForWithdrawal) || availableForWithdrawal < 0) {
|
|
34517
34550
|
logger.error(
|
|
34518
34551
|
`Invalid usdcBalanceOnExtended.availableForWithdrawal: ${usdcBalanceOnExtended.availableForWithdrawal}. Expected a finite, non-negative number.`
|
|
@@ -34524,11 +34557,15 @@ var VesuExtendedMultiplierStrategy = class _VesuExtendedMultiplierStrategy exten
|
|
|
34524
34557
|
extendedLeverage: 0,
|
|
34525
34558
|
collateralPrice: 0,
|
|
34526
34559
|
debtPrice: 0,
|
|
34527
|
-
vesuLeverage: 0
|
|
34560
|
+
vesuLeverage: 0,
|
|
34561
|
+
debtAmountToBeRepaid: new Web3Number(0, 0)
|
|
34528
34562
|
};
|
|
34529
34563
|
}
|
|
34530
34564
|
}
|
|
34531
|
-
const amountToInvest = new Web3Number(
|
|
34565
|
+
const amountToInvest = new Web3Number(
|
|
34566
|
+
balance.usdValue,
|
|
34567
|
+
USDC_TOKEN_DECIMALS
|
|
34568
|
+
).plus(usdcBalanceOnExtended?.availableForTrade ?? 0).multipliedBy(1 - LIMIT_BALANCE);
|
|
34532
34569
|
const amountToInvestNumber = amountToInvest.toNumber();
|
|
34533
34570
|
if (!Number.isFinite(amountToInvestNumber)) {
|
|
34534
34571
|
logger.error(
|
|
@@ -34541,10 +34578,13 @@ var VesuExtendedMultiplierStrategy = class _VesuExtendedMultiplierStrategy exten
|
|
|
34541
34578
|
extendedLeverage: 0,
|
|
34542
34579
|
collateralPrice: 0,
|
|
34543
34580
|
debtPrice: 0,
|
|
34544
|
-
vesuLeverage: 0
|
|
34581
|
+
vesuLeverage: 0,
|
|
34582
|
+
debtAmountToBeRepaid: new Web3Number(0, 0)
|
|
34545
34583
|
};
|
|
34546
34584
|
}
|
|
34547
|
-
logger.info(
|
|
34585
|
+
logger.info(
|
|
34586
|
+
`${_VesuExtendedMultiplierStrategy.name}::shouldInvest amountToInvest: ${amountToInvestNumber}`
|
|
34587
|
+
);
|
|
34548
34588
|
if (amountToInvest.lessThan(LIMIT_BALANCE_VALUE)) {
|
|
34549
34589
|
return {
|
|
34550
34590
|
shouldInvest: false,
|
|
@@ -34553,7 +34593,8 @@ var VesuExtendedMultiplierStrategy = class _VesuExtendedMultiplierStrategy exten
|
|
|
34553
34593
|
extendedLeverage: 0,
|
|
34554
34594
|
collateralPrice: 0,
|
|
34555
34595
|
debtPrice: 0,
|
|
34556
|
-
vesuLeverage: 0
|
|
34596
|
+
vesuLeverage: 0,
|
|
34597
|
+
debtAmountToBeRepaid: new Web3Number(0, 0)
|
|
34557
34598
|
};
|
|
34558
34599
|
}
|
|
34559
34600
|
const extendedPositon = await extendedAdapter.getAllOpenPositions();
|
|
@@ -34566,14 +34607,12 @@ var VesuExtendedMultiplierStrategy = class _VesuExtendedMultiplierStrategy exten
|
|
|
34566
34607
|
extendedLeverage: 0,
|
|
34567
34608
|
collateralPrice: 0,
|
|
34568
34609
|
debtPrice: 0,
|
|
34569
|
-
vesuLeverage: 0
|
|
34610
|
+
vesuLeverage: 0,
|
|
34611
|
+
debtAmountToBeRepaid: new Web3Number(0, 0)
|
|
34570
34612
|
};
|
|
34571
34613
|
}
|
|
34572
|
-
const { collateralTokenAmount } = await vesuAdapter.vesuAdapter.getAssetPrices();
|
|
34573
|
-
const {
|
|
34574
|
-
collateralPrice,
|
|
34575
|
-
debtPrice
|
|
34576
|
-
} = await this.getAssetPrices();
|
|
34614
|
+
const { collateralTokenAmount, debtTokenAmount } = await vesuAdapter.vesuAdapter.getAssetPrices();
|
|
34615
|
+
const { collateralPrice, debtPrice } = await this.getAssetPrices();
|
|
34577
34616
|
if (!Number.isFinite(collateralPrice.price) || collateralPrice.price <= 0) {
|
|
34578
34617
|
logger.error(
|
|
34579
34618
|
`Invalid collateralPrice: ${collateralPrice.price}. Expected a finite, positive number.`
|
|
@@ -34585,7 +34624,8 @@ var VesuExtendedMultiplierStrategy = class _VesuExtendedMultiplierStrategy exten
|
|
|
34585
34624
|
extendedLeverage: 0,
|
|
34586
34625
|
collateralPrice: 0,
|
|
34587
34626
|
debtPrice: 0,
|
|
34588
|
-
vesuLeverage: 0
|
|
34627
|
+
vesuLeverage: 0,
|
|
34628
|
+
debtAmountToBeRepaid: new Web3Number(0, 0)
|
|
34589
34629
|
};
|
|
34590
34630
|
}
|
|
34591
34631
|
if (!Number.isFinite(debtPrice.price) || debtPrice.price <= 0) {
|
|
@@ -34599,11 +34639,34 @@ var VesuExtendedMultiplierStrategy = class _VesuExtendedMultiplierStrategy exten
|
|
|
34599
34639
|
extendedLeverage: 0,
|
|
34600
34640
|
collateralPrice: 0,
|
|
34601
34641
|
debtPrice: 0,
|
|
34602
|
-
vesuLeverage: 0
|
|
34642
|
+
vesuLeverage: 0,
|
|
34643
|
+
debtAmountToBeRepaid: new Web3Number(0, 0)
|
|
34603
34644
|
};
|
|
34604
34645
|
}
|
|
34646
|
+
const debtAmountToBeRepaid = calculateDeltaDebtAmount(
|
|
34647
|
+
MAX_LTV_BTC_USDC,
|
|
34648
|
+
collateralTokenAmount,
|
|
34649
|
+
debtTokenAmount,
|
|
34650
|
+
collateralPrice.price,
|
|
34651
|
+
debtPrice.price,
|
|
34652
|
+
this.metadata.additionalInfo.targetHealthFactor
|
|
34653
|
+
);
|
|
34654
|
+
if (!debtAmountToBeRepaid) {
|
|
34655
|
+
logger.error("error calculating debt amount to be repaid");
|
|
34656
|
+
return {
|
|
34657
|
+
shouldInvest: false,
|
|
34658
|
+
vesuAmount: new Web3Number(0, 0),
|
|
34659
|
+
extendedAmount: new Web3Number(0, 0),
|
|
34660
|
+
extendedLeverage: 0,
|
|
34661
|
+
collateralPrice: 0,
|
|
34662
|
+
debtPrice: 0,
|
|
34663
|
+
vesuLeverage: 0,
|
|
34664
|
+
debtAmountToBeRepaid: new Web3Number(0, 0)
|
|
34665
|
+
};
|
|
34666
|
+
}
|
|
34667
|
+
const amountToInvestAfterRepayingDebt = amountToInvest.minus(debtAmountToBeRepaid);
|
|
34605
34668
|
const { vesu_amount, extended_amount, extended_leverage, vesu_leverage } = await calculateAmountDistribution(
|
|
34606
|
-
|
|
34669
|
+
amountToInvestAfterRepayingDebt.toNumber(),
|
|
34607
34670
|
extendedAdapter.client,
|
|
34608
34671
|
extendedAdapter.config.extendedMarketName,
|
|
34609
34672
|
collateralPrice.price,
|
|
@@ -34622,10 +34685,13 @@ var VesuExtendedMultiplierStrategy = class _VesuExtendedMultiplierStrategy exten
|
|
|
34622
34685
|
extendedLeverage: 0,
|
|
34623
34686
|
collateralPrice: 0,
|
|
34624
34687
|
debtPrice: 0,
|
|
34625
|
-
vesuLeverage: 0
|
|
34688
|
+
vesuLeverage: 0,
|
|
34689
|
+
debtAmountToBeRepaid: new Web3Number(0, 0)
|
|
34626
34690
|
};
|
|
34627
34691
|
}
|
|
34628
|
-
logger.info(
|
|
34692
|
+
logger.info(
|
|
34693
|
+
`${_VesuExtendedMultiplierStrategy.name}::shouldInvest vesu_amount: ${vesu_amount.toNumber()}, extended_amount: ${extended_amount.toNumber()}`
|
|
34694
|
+
);
|
|
34629
34695
|
return {
|
|
34630
34696
|
shouldInvest: true,
|
|
34631
34697
|
vesuAmount: vesu_amount,
|
|
@@ -34633,7 +34699,8 @@ var VesuExtendedMultiplierStrategy = class _VesuExtendedMultiplierStrategy exten
|
|
|
34633
34699
|
extendedLeverage: extended_leverage,
|
|
34634
34700
|
vesuLeverage: vesu_leverage,
|
|
34635
34701
|
collateralPrice: collateralPrice.price,
|
|
34636
|
-
debtPrice: debtPrice.price
|
|
34702
|
+
debtPrice: debtPrice.price,
|
|
34703
|
+
debtAmountToBeRepaid
|
|
34637
34704
|
};
|
|
34638
34705
|
} catch (err) {
|
|
34639
34706
|
logger.error(`error deciding invest: ${err}`);
|
|
@@ -34644,7 +34711,8 @@ var VesuExtendedMultiplierStrategy = class _VesuExtendedMultiplierStrategy exten
|
|
|
34644
34711
|
extendedLeverage: 0,
|
|
34645
34712
|
collateralPrice: 0,
|
|
34646
34713
|
debtPrice: 0,
|
|
34647
|
-
vesuLeverage: 0
|
|
34714
|
+
vesuLeverage: 0,
|
|
34715
|
+
debtAmountToBeRepaid: new Web3Number(0, 0)
|
|
34648
34716
|
};
|
|
34649
34717
|
}
|
|
34650
34718
|
}
|
|
@@ -34664,37 +34732,52 @@ var VesuExtendedMultiplierStrategy = class _VesuExtendedMultiplierStrategy exten
|
|
|
34664
34732
|
return [];
|
|
34665
34733
|
}
|
|
34666
34734
|
const usdcAmountInWallet = (await this.getUnusedBalance()).amount;
|
|
34667
|
-
const
|
|
34668
|
-
extendedHoldings.
|
|
34735
|
+
const usdcAmountOnExtendedAvailableForTrade = parseFloat(
|
|
34736
|
+
extendedHoldings.availableForTrade
|
|
34737
|
+
);
|
|
34738
|
+
logger.info(
|
|
34739
|
+
`${_VesuExtendedMultiplierStrategy.name}::shouldMoveAssets calculating movements - Extended current: ${usdcAmountOnExtendedAvailableForTrade}, Wallet: ${usdcAmountInWallet.toNumber()}, Target Extended: ${extendedAmount.toNumber()}, Target Vesu: ${vesuAmount.toNumber()}`
|
|
34669
34740
|
);
|
|
34670
|
-
logger.info(`${_VesuExtendedMultiplierStrategy.name}::shouldMoveAssets calculating movements - Extended current: ${usdcAmountOnExtendedAvailableForWithdrawal}, Wallet: ${usdcAmountInWallet.toNumber()}, Target Extended: ${extendedAmount.toNumber()}, Target Vesu: ${vesuAmount.toNumber()}`);
|
|
34671
34741
|
let totalExtendedWithdrawal = new Web3Number(0, USDC_TOKEN_DECIMALS);
|
|
34672
34742
|
let totalExtendedDeposit = new Web3Number(0, USDC_TOKEN_DECIMALS);
|
|
34673
34743
|
if (extendedAmount.isNegative() && extendedAmount.abs().greaterThan(extendedAdapter.minimumExtendedMovementAmount)) {
|
|
34674
|
-
totalExtendedWithdrawal = totalExtendedWithdrawal.plus(
|
|
34744
|
+
totalExtendedWithdrawal = totalExtendedWithdrawal.plus(
|
|
34745
|
+
extendedAmount.abs()
|
|
34746
|
+
);
|
|
34675
34747
|
}
|
|
34676
34748
|
const extendedTargetAmount = extendedAmount.abs();
|
|
34677
|
-
let projectedExtendedBalance =
|
|
34749
|
+
let projectedExtendedBalance = usdcAmountOnExtendedAvailableForTrade;
|
|
34678
34750
|
if (extendedAmount.isNegative()) {
|
|
34679
34751
|
projectedExtendedBalance = projectedExtendedBalance - extendedAmount.abs().toNumber();
|
|
34680
34752
|
}
|
|
34681
|
-
const extendedAmountDifference = extendedTargetAmount.minus(
|
|
34753
|
+
const extendedAmountDifference = extendedTargetAmount.minus(
|
|
34754
|
+
projectedExtendedBalance
|
|
34755
|
+
);
|
|
34682
34756
|
const extendedAmountDifferenceAbs = extendedAmountDifference.abs();
|
|
34683
34757
|
if (extendedAmountDifference.lessThan(0)) {
|
|
34684
|
-
totalExtendedWithdrawal = totalExtendedWithdrawal.plus(
|
|
34758
|
+
totalExtendedWithdrawal = totalExtendedWithdrawal.plus(
|
|
34759
|
+
extendedAmountDifferenceAbs
|
|
34760
|
+
);
|
|
34685
34761
|
} else if (extendedAmountDifference.greaterThan(0)) {
|
|
34686
|
-
totalExtendedDeposit = totalExtendedDeposit.plus(
|
|
34762
|
+
totalExtendedDeposit = totalExtendedDeposit.plus(
|
|
34763
|
+
extendedAmountDifference
|
|
34764
|
+
);
|
|
34687
34765
|
}
|
|
34688
34766
|
const vesuTargetAmount = vesuAmount.abs();
|
|
34689
34767
|
const projectedWalletBalance = usdcAmountInWallet.plus(totalExtendedWithdrawal).minus(totalExtendedDeposit);
|
|
34690
34768
|
let vesuAmountDifference = vesuTargetAmount.minus(projectedWalletBalance);
|
|
34691
34769
|
const vesuAmountDifferenceAbs = vesuAmountDifference.abs();
|
|
34692
|
-
logger.info(
|
|
34693
|
-
|
|
34770
|
+
logger.info(
|
|
34771
|
+
`${_VesuExtendedMultiplierStrategy.name}::shouldMoveAssets calculated movements - Extended withdrawal: ${totalExtendedWithdrawal.toNumber()}, Extended deposit: ${totalExtendedDeposit.toNumber()}, Extended diff: ${extendedAmountDifference.toNumber()}, Projected wallet: ${projectedWalletBalance.toNumber()}, Vesu diff: ${vesuAmountDifference.toNumber()}`
|
|
34772
|
+
);
|
|
34694
34773
|
let transactionResults = [];
|
|
34695
34774
|
if (extendedAmount.isNegative() && extendedAmount.abs().greaterThan(extendedAdapter.minimumExtendedMovementAmount)) {
|
|
34696
34775
|
try {
|
|
34697
|
-
const {
|
|
34776
|
+
const {
|
|
34777
|
+
calls: extendedCalls,
|
|
34778
|
+
status: extendedStatus,
|
|
34779
|
+
transactionMetadata: extendedTransactionMetadata
|
|
34780
|
+
} = await this.moveAssets(
|
|
34698
34781
|
{
|
|
34699
34782
|
to: Protocols.VAULT.name,
|
|
34700
34783
|
from: Protocols.EXTENDED.name,
|
|
@@ -34714,16 +34797,44 @@ var VesuExtendedMultiplierStrategy = class _VesuExtendedMultiplierStrategy exten
|
|
|
34714
34797
|
}
|
|
34715
34798
|
});
|
|
34716
34799
|
} else {
|
|
34717
|
-
return [
|
|
34800
|
+
return [
|
|
34801
|
+
this.createTransactionResult(
|
|
34802
|
+
[],
|
|
34803
|
+
false,
|
|
34804
|
+
{
|
|
34805
|
+
from: Protocols.EXTENDED.name,
|
|
34806
|
+
to: Protocols.VAULT.name,
|
|
34807
|
+
amount: extendedAmount.abs()
|
|
34808
|
+
},
|
|
34809
|
+
"NONE",
|
|
34810
|
+
"INVESTMENT" /* INVESTMENT */
|
|
34811
|
+
)
|
|
34812
|
+
];
|
|
34718
34813
|
}
|
|
34719
34814
|
} catch (err) {
|
|
34720
34815
|
logger.error(`Failed moving assets to vault: ${err}`);
|
|
34721
|
-
return [
|
|
34816
|
+
return [
|
|
34817
|
+
this.createTransactionResult(
|
|
34818
|
+
[],
|
|
34819
|
+
false,
|
|
34820
|
+
{
|
|
34821
|
+
from: Protocols.EXTENDED.name,
|
|
34822
|
+
to: Protocols.VAULT.name,
|
|
34823
|
+
amount: extendedAmount.abs()
|
|
34824
|
+
},
|
|
34825
|
+
"NONE",
|
|
34826
|
+
"INVESTMENT" /* INVESTMENT */
|
|
34827
|
+
)
|
|
34828
|
+
];
|
|
34722
34829
|
}
|
|
34723
34830
|
}
|
|
34724
34831
|
if (vesuAmount.isNegative() && vesuAmount.abs().greaterThan(vesuAdapter.minimumVesuMovementAmount)) {
|
|
34725
34832
|
try {
|
|
34726
|
-
const {
|
|
34833
|
+
const {
|
|
34834
|
+
calls: vesuCalls,
|
|
34835
|
+
status: vesuStatus,
|
|
34836
|
+
transactionMetadata: vesuTransactionMetadata
|
|
34837
|
+
} = await this.moveAssets(
|
|
34727
34838
|
{
|
|
34728
34839
|
to: Protocols.EXTENDED.name,
|
|
34729
34840
|
from: Protocols.VESU.name,
|
|
@@ -34734,7 +34845,19 @@ var VesuExtendedMultiplierStrategy = class _VesuExtendedMultiplierStrategy exten
|
|
|
34734
34845
|
vesuAdapter
|
|
34735
34846
|
);
|
|
34736
34847
|
if (!vesuStatus) {
|
|
34737
|
-
return [
|
|
34848
|
+
return [
|
|
34849
|
+
this.createTransactionResult(
|
|
34850
|
+
[],
|
|
34851
|
+
false,
|
|
34852
|
+
{
|
|
34853
|
+
from: Protocols.VESU.name,
|
|
34854
|
+
to: Protocols.EXTENDED.name,
|
|
34855
|
+
amount: vesuAmount.abs()
|
|
34856
|
+
},
|
|
34857
|
+
"NONE",
|
|
34858
|
+
"INVESTMENT" /* INVESTMENT */
|
|
34859
|
+
)
|
|
34860
|
+
];
|
|
34738
34861
|
}
|
|
34739
34862
|
transactionResults.push({
|
|
34740
34863
|
status: vesuStatus,
|
|
@@ -34745,14 +34868,34 @@ var VesuExtendedMultiplierStrategy = class _VesuExtendedMultiplierStrategy exten
|
|
|
34745
34868
|
}
|
|
34746
34869
|
});
|
|
34747
34870
|
} catch (err) {
|
|
34748
|
-
logger.error(
|
|
34749
|
-
|
|
34871
|
+
logger.error(
|
|
34872
|
+
`Failed moving assets to extended via vault allocator: ${err}`
|
|
34873
|
+
);
|
|
34874
|
+
return [
|
|
34875
|
+
this.createTransactionResult(
|
|
34876
|
+
[],
|
|
34877
|
+
false,
|
|
34878
|
+
{
|
|
34879
|
+
from: Protocols.VESU.name,
|
|
34880
|
+
to: Protocols.EXTENDED.name,
|
|
34881
|
+
amount: vesuAmount.abs()
|
|
34882
|
+
},
|
|
34883
|
+
"NONE",
|
|
34884
|
+
"INVESTMENT" /* INVESTMENT */
|
|
34885
|
+
)
|
|
34886
|
+
];
|
|
34750
34887
|
}
|
|
34751
34888
|
}
|
|
34752
|
-
if (extendedAmountDifferenceAbs.greaterThan(
|
|
34889
|
+
if (extendedAmountDifferenceAbs.greaterThan(
|
|
34890
|
+
extendedAdapter.minimumExtendedMovementAmount
|
|
34891
|
+
)) {
|
|
34753
34892
|
if (extendedAmountDifference.greaterThan(0)) {
|
|
34754
34893
|
try {
|
|
34755
|
-
const {
|
|
34894
|
+
const {
|
|
34895
|
+
calls: extendedCalls,
|
|
34896
|
+
status: extendedStatus,
|
|
34897
|
+
transactionMetadata: extendedTransactionMetadata
|
|
34898
|
+
} = await this.moveAssets(
|
|
34756
34899
|
{
|
|
34757
34900
|
to: Protocols.EXTENDED.name,
|
|
34758
34901
|
from: Protocols.VAULT.name,
|
|
@@ -34769,16 +34912,46 @@ var VesuExtendedMultiplierStrategy = class _VesuExtendedMultiplierStrategy exten
|
|
|
34769
34912
|
transactionMetadata: extendedTransactionMetadata
|
|
34770
34913
|
});
|
|
34771
34914
|
} else {
|
|
34772
|
-
logger.error(
|
|
34773
|
-
|
|
34915
|
+
logger.error(
|
|
34916
|
+
`Failed to move assets to extended - operation returned false status`
|
|
34917
|
+
);
|
|
34918
|
+
return [
|
|
34919
|
+
this.createTransactionResult(
|
|
34920
|
+
[],
|
|
34921
|
+
false,
|
|
34922
|
+
{
|
|
34923
|
+
from: Protocols.VAULT.name,
|
|
34924
|
+
to: Protocols.EXTENDED.name,
|
|
34925
|
+
amount: extendedAmountDifference
|
|
34926
|
+
},
|
|
34927
|
+
"NONE",
|
|
34928
|
+
"INVESTMENT" /* INVESTMENT */
|
|
34929
|
+
)
|
|
34930
|
+
];
|
|
34774
34931
|
}
|
|
34775
34932
|
} catch (err) {
|
|
34776
34933
|
logger.error(`Failed moving assets to extended: ${err}`);
|
|
34777
|
-
return [
|
|
34934
|
+
return [
|
|
34935
|
+
this.createTransactionResult(
|
|
34936
|
+
[],
|
|
34937
|
+
false,
|
|
34938
|
+
{
|
|
34939
|
+
from: Protocols.VAULT.name,
|
|
34940
|
+
to: Protocols.EXTENDED.name,
|
|
34941
|
+
amount: extendedAmountDifference
|
|
34942
|
+
},
|
|
34943
|
+
"NONE",
|
|
34944
|
+
"INVESTMENT" /* INVESTMENT */
|
|
34945
|
+
)
|
|
34946
|
+
];
|
|
34778
34947
|
}
|
|
34779
34948
|
} else if (extendedAmountDifference.lessThan(0)) {
|
|
34780
34949
|
try {
|
|
34781
|
-
const {
|
|
34950
|
+
const {
|
|
34951
|
+
calls: extendedCalls,
|
|
34952
|
+
status: extendedStatus,
|
|
34953
|
+
transactionMetadata: extendedTransactionMetadata
|
|
34954
|
+
} = await this.moveAssets(
|
|
34782
34955
|
{
|
|
34783
34956
|
to: Protocols.VAULT.name,
|
|
34784
34957
|
from: Protocols.EXTENDED.name,
|
|
@@ -34798,23 +34971,55 @@ var VesuExtendedMultiplierStrategy = class _VesuExtendedMultiplierStrategy exten
|
|
|
34798
34971
|
}
|
|
34799
34972
|
});
|
|
34800
34973
|
} else {
|
|
34801
|
-
logger.error(
|
|
34802
|
-
|
|
34974
|
+
logger.error(
|
|
34975
|
+
`Failed to withdraw from extended - operation returned false status`
|
|
34976
|
+
);
|
|
34977
|
+
return [
|
|
34978
|
+
this.createTransactionResult(
|
|
34979
|
+
[],
|
|
34980
|
+
false,
|
|
34981
|
+
{
|
|
34982
|
+
from: Protocols.EXTENDED.name,
|
|
34983
|
+
to: Protocols.VAULT.name,
|
|
34984
|
+
amount: extendedAmountDifferenceAbs
|
|
34985
|
+
},
|
|
34986
|
+
"NONE",
|
|
34987
|
+
"INVESTMENT" /* INVESTMENT */
|
|
34988
|
+
)
|
|
34989
|
+
];
|
|
34803
34990
|
}
|
|
34804
34991
|
} catch (err) {
|
|
34805
34992
|
logger.error(`Failed moving assets from extended to vault: ${err}`);
|
|
34806
|
-
return [
|
|
34993
|
+
return [
|
|
34994
|
+
this.createTransactionResult(
|
|
34995
|
+
[],
|
|
34996
|
+
false,
|
|
34997
|
+
{
|
|
34998
|
+
from: Protocols.EXTENDED.name,
|
|
34999
|
+
to: Protocols.VAULT.name,
|
|
35000
|
+
amount: extendedAmountDifferenceAbs
|
|
35001
|
+
},
|
|
35002
|
+
"NONE",
|
|
35003
|
+
"INVESTMENT" /* INVESTMENT */
|
|
35004
|
+
)
|
|
35005
|
+
];
|
|
34807
35006
|
}
|
|
34808
35007
|
}
|
|
34809
35008
|
}
|
|
34810
|
-
if (vesuAmountDifferenceAbs.greaterThan(
|
|
35009
|
+
if (vesuAmountDifferenceAbs.greaterThan(
|
|
35010
|
+
vesuAdapter.minimumVesuMovementAmount
|
|
35011
|
+
)) {
|
|
34811
35012
|
if (vesuAmountDifference.lessThanOrEqualTo(0)) {
|
|
34812
35013
|
logger.warn(
|
|
34813
35014
|
`Vesu amount difference is negative or zero: ${vesuAmountDifference.toNumber()}. Skipping operation.`
|
|
34814
35015
|
);
|
|
34815
35016
|
} else {
|
|
34816
35017
|
try {
|
|
34817
|
-
const {
|
|
35018
|
+
const {
|
|
35019
|
+
calls: vesuCalls,
|
|
35020
|
+
status: vesuStatus,
|
|
35021
|
+
transactionMetadata: vesuTransactionMetadata
|
|
35022
|
+
} = await this.moveAssets(
|
|
34818
35023
|
{
|
|
34819
35024
|
to: Protocols.VAULT.name,
|
|
34820
35025
|
from: Protocols.EXTENDED.name,
|
|
@@ -34825,8 +35030,22 @@ var VesuExtendedMultiplierStrategy = class _VesuExtendedMultiplierStrategy exten
|
|
|
34825
35030
|
vesuAdapter
|
|
34826
35031
|
);
|
|
34827
35032
|
if (!vesuStatus) {
|
|
34828
|
-
logger.error(
|
|
34829
|
-
|
|
35033
|
+
logger.error(
|
|
35034
|
+
`Failed to move assets to vesu - operation returned false status`
|
|
35035
|
+
);
|
|
35036
|
+
return [
|
|
35037
|
+
this.createTransactionResult(
|
|
35038
|
+
[],
|
|
35039
|
+
false,
|
|
35040
|
+
{
|
|
35041
|
+
from: Protocols.EXTENDED.name,
|
|
35042
|
+
to: Protocols.VAULT.name,
|
|
35043
|
+
amount: vesuAmountDifference
|
|
35044
|
+
},
|
|
35045
|
+
"NONE",
|
|
35046
|
+
"INVESTMENT" /* INVESTMENT */
|
|
35047
|
+
)
|
|
35048
|
+
];
|
|
34830
35049
|
}
|
|
34831
35050
|
transactionResults.push({
|
|
34832
35051
|
status: vesuStatus,
|
|
@@ -34838,14 +35057,38 @@ var VesuExtendedMultiplierStrategy = class _VesuExtendedMultiplierStrategy exten
|
|
|
34838
35057
|
});
|
|
34839
35058
|
} catch (err) {
|
|
34840
35059
|
logger.error(`Failed moving assets to vault: ${err}`);
|
|
34841
|
-
return [
|
|
35060
|
+
return [
|
|
35061
|
+
this.createTransactionResult(
|
|
35062
|
+
[],
|
|
35063
|
+
false,
|
|
35064
|
+
{
|
|
35065
|
+
from: Protocols.EXTENDED.name,
|
|
35066
|
+
to: Protocols.VAULT.name,
|
|
35067
|
+
amount: vesuAmountDifference
|
|
35068
|
+
},
|
|
35069
|
+
"NONE",
|
|
35070
|
+
"INVESTMENT" /* INVESTMENT */
|
|
35071
|
+
)
|
|
35072
|
+
];
|
|
34842
35073
|
}
|
|
34843
35074
|
}
|
|
34844
35075
|
}
|
|
34845
35076
|
return transactionResults;
|
|
34846
35077
|
} catch (err) {
|
|
34847
35078
|
logger.error(`Failed moving assets to vesu: ${err}`);
|
|
34848
|
-
return [
|
|
35079
|
+
return [
|
|
35080
|
+
this.createTransactionResult(
|
|
35081
|
+
[],
|
|
35082
|
+
false,
|
|
35083
|
+
{
|
|
35084
|
+
from: Protocols.EXTENDED.name,
|
|
35085
|
+
to: Protocols.VAULT.name,
|
|
35086
|
+
amount: new Web3Number(0, USDC_TOKEN_DECIMALS)
|
|
35087
|
+
},
|
|
35088
|
+
"NONE",
|
|
35089
|
+
"INVESTMENT" /* INVESTMENT */
|
|
35090
|
+
)
|
|
35091
|
+
];
|
|
34849
35092
|
}
|
|
34850
35093
|
}
|
|
34851
35094
|
/**
|
|
@@ -34866,43 +35109,56 @@ var VesuExtendedMultiplierStrategy = class _VesuExtendedMultiplierStrategy exten
|
|
|
34866
35109
|
}
|
|
34867
35110
|
};
|
|
34868
35111
|
}
|
|
34869
|
-
return {
|
|
35112
|
+
return {
|
|
35113
|
+
calls: [],
|
|
35114
|
+
status: false,
|
|
35115
|
+
transactionMetadata: {
|
|
35116
|
+
protocolFrom: "",
|
|
35117
|
+
protocolTo: "",
|
|
35118
|
+
transactionType: "DEPOSIT",
|
|
35119
|
+
usdAmount: "0",
|
|
35120
|
+
status: "FAILED",
|
|
35121
|
+
cycleType
|
|
35122
|
+
}
|
|
35123
|
+
};
|
|
34870
35124
|
}
|
|
35125
|
+
/**
|
|
35126
|
+
* This method is used to move assets between protocols
|
|
35127
|
+
* @param params - The parameters for the move assets operation
|
|
35128
|
+
* @param extendedAdapter - The extended adapter
|
|
35129
|
+
* @param vesuAdapter - The vesu adapter
|
|
35130
|
+
* @returns The transaction result
|
|
35131
|
+
* If Extended amount is greater than amount of withdrawal from extended, then we need to open a long position
|
|
35132
|
+
* so that the amount of withdrawal from extended is fullfilled
|
|
35133
|
+
*/
|
|
34871
35134
|
async moveAssets(params, extendedAdapter, vesuAdapter) {
|
|
34872
35135
|
try {
|
|
34873
35136
|
if (params.amount.lessThanOrEqualTo(0)) {
|
|
34874
35137
|
logger.error(
|
|
34875
35138
|
`Invalid amount for moveAssets: ${params.amount.toNumber()}. Amount must be positive.`
|
|
34876
35139
|
);
|
|
34877
|
-
return this.createTransactionResult(
|
|
34878
|
-
|
|
34879
|
-
|
|
34880
|
-
|
|
34881
|
-
|
|
34882
|
-
|
|
34883
|
-
|
|
34884
|
-
);
|
|
34885
|
-
return this.createTransactionResult([], false, params, "NONE", params.cycleType);
|
|
34886
|
-
}
|
|
34887
|
-
}
|
|
34888
|
-
if (params.from === Protocols.VESU.name || params.to === Protocols.VESU.name) {
|
|
34889
|
-
if (amountAbs.lessThanOrEqualTo(vesuAdapter.minimumVesuMovementAmount)) {
|
|
34890
|
-
logger.warn(
|
|
34891
|
-
`Amount ${amountAbs.toNumber()} is below minimum Vesu movement amount ${vesuAdapter.minimumVesuMovementAmount}. Skipping operation.`
|
|
34892
|
-
);
|
|
34893
|
-
return this.createTransactionResult([], false, params, "NONE", params.cycleType);
|
|
34894
|
-
}
|
|
35140
|
+
return this.createTransactionResult(
|
|
35141
|
+
[],
|
|
35142
|
+
false,
|
|
35143
|
+
params,
|
|
35144
|
+
"NONE",
|
|
35145
|
+
params.cycleType
|
|
35146
|
+
);
|
|
34895
35147
|
}
|
|
34896
35148
|
const avnuAdapter = await this.getAvnuAdapter();
|
|
34897
35149
|
if (!avnuAdapter) {
|
|
34898
35150
|
logger.error(`avnu adapter not found: ${avnuAdapter}`);
|
|
34899
|
-
return this.createTransactionResult(
|
|
35151
|
+
return this.createTransactionResult(
|
|
35152
|
+
[],
|
|
35153
|
+
false,
|
|
35154
|
+
params,
|
|
35155
|
+
"NONE",
|
|
35156
|
+
params.cycleType
|
|
35157
|
+
);
|
|
34900
35158
|
}
|
|
34901
35159
|
logger.info(`moveAssets params, ${JSON.stringify(params)}`);
|
|
34902
35160
|
const collateralToken = vesuAdapter.config.supportedPositions[0].asset;
|
|
34903
|
-
const {
|
|
34904
|
-
collateralPrice
|
|
34905
|
-
} = await this.getAssetPrices();
|
|
35161
|
+
const { collateralPrice } = await this.getAssetPrices();
|
|
34906
35162
|
if (params.to === Protocols.EXTENDED.name && params.from === Protocols.VAULT.name) {
|
|
34907
35163
|
const proofsInfo = extendedAdapter.getProofs(
|
|
34908
35164
|
true,
|
|
@@ -34915,23 +35171,53 @@ var VesuExtendedMultiplierStrategy = class _VesuExtendedMultiplierStrategy exten
|
|
|
34915
35171
|
await proofsInfo.callConstructor({ amount: params.amount })
|
|
34916
35172
|
);
|
|
34917
35173
|
calls.push(call);
|
|
34918
|
-
return this.createTransactionResult(
|
|
35174
|
+
return this.createTransactionResult(
|
|
35175
|
+
calls,
|
|
35176
|
+
true,
|
|
35177
|
+
params,
|
|
35178
|
+
"DEPOSIT",
|
|
35179
|
+
params.cycleType
|
|
35180
|
+
);
|
|
34919
35181
|
} else if (params.to === Protocols.VAULT.name && params.from === Protocols.EXTENDED.name) {
|
|
34920
35182
|
const extendedLeverage = calculateExtendedLevergae();
|
|
34921
35183
|
const extendedHoldings = await extendedAdapter.getExtendedDepositAmount();
|
|
34922
35184
|
if (!extendedHoldings) {
|
|
34923
35185
|
logger.error(`error getting extended holdings: ${extendedHoldings}`);
|
|
34924
|
-
return this.createTransactionResult(
|
|
35186
|
+
return this.createTransactionResult(
|
|
35187
|
+
[],
|
|
35188
|
+
false,
|
|
35189
|
+
params,
|
|
35190
|
+
"NONE",
|
|
35191
|
+
params.cycleType
|
|
35192
|
+
);
|
|
34925
35193
|
}
|
|
34926
35194
|
const extendedHoldingAmount = new Web3Number(
|
|
34927
35195
|
extendedHoldings.availableForWithdrawal,
|
|
34928
35196
|
USDC_TOKEN_DECIMALS
|
|
34929
35197
|
);
|
|
34930
|
-
logger.info(
|
|
35198
|
+
logger.info(
|
|
35199
|
+
`${_VesuExtendedMultiplierStrategy.name}::moveAssets extendedHoldingAmount: ${extendedHoldingAmount.toNumber()}`
|
|
35200
|
+
);
|
|
34931
35201
|
if (params.amount.abs().greaterThan(extendedHoldingAmount)) {
|
|
34932
|
-
const leftAmountAfterWithdrawalAmountInAccount =
|
|
34933
|
-
|
|
34934
|
-
|
|
35202
|
+
const leftAmountAfterWithdrawalAmountInAccount = new Web3Number(
|
|
35203
|
+
Math.ceil(
|
|
35204
|
+
params.amount.abs().minus(extendedHoldingAmount).toNumber()
|
|
35205
|
+
),
|
|
35206
|
+
USDC_TOKEN_DECIMALS
|
|
35207
|
+
);
|
|
35208
|
+
logger.info(
|
|
35209
|
+
`${_VesuExtendedMultiplierStrategy.name}::moveAssets leftAmountAfterWithdrawalAmountInAccount: ${leftAmountAfterWithdrawalAmountInAccount.toNumber()}`
|
|
35210
|
+
);
|
|
35211
|
+
let priceOfBTC;
|
|
35212
|
+
const { ask, bid, status } = await extendedAdapter.fetchOrderBookBTCUSDC();
|
|
35213
|
+
const price = ask.plus(bid).dividedBy(2);
|
|
35214
|
+
if (status) {
|
|
35215
|
+
priceOfBTC = price;
|
|
35216
|
+
} else {
|
|
35217
|
+
logger.error(`error fetching order book btc usdc: ${status}`);
|
|
35218
|
+
priceOfBTC = collateralPrice.price;
|
|
35219
|
+
}
|
|
35220
|
+
const btcAmount = leftAmountAfterWithdrawalAmountInAccount.dividedBy(priceOfBTC);
|
|
34935
35221
|
const openLongPosition = btcAmount.multipliedBy(3).greaterThan(MINIMUM_EXTENDED_POSITION_SIZE) ? await extendedAdapter.createOrder(
|
|
34936
35222
|
extendedLeverage.toString(),
|
|
34937
35223
|
btcAmount.toNumber(),
|
|
@@ -34946,38 +35232,95 @@ var VesuExtendedMultiplierStrategy = class _VesuExtendedMultiplierStrategy exten
|
|
|
34946
35232
|
logger.error(`error opening long position: ${openLongPosition}`);
|
|
34947
35233
|
}
|
|
34948
35234
|
const updatedHoldings = await extendedAdapter.getExtendedDepositAmount();
|
|
34949
|
-
if (!updatedHoldings || new Web3Number(
|
|
34950
|
-
|
|
34951
|
-
|
|
35235
|
+
if (!updatedHoldings || new Web3Number(
|
|
35236
|
+
updatedHoldings.availableForWithdrawal,
|
|
35237
|
+
USDC_TOKEN_DECIMALS
|
|
35238
|
+
).lessThan(params.amount.abs())) {
|
|
35239
|
+
logger.error(
|
|
35240
|
+
`Insufficient balance after opening position. Available: ${updatedHoldings?.availableForWithdrawal}, Needed: ${params.amount.abs()}`
|
|
35241
|
+
);
|
|
35242
|
+
return this.createTransactionResult(
|
|
35243
|
+
[],
|
|
35244
|
+
false,
|
|
35245
|
+
params,
|
|
35246
|
+
"NONE",
|
|
35247
|
+
params.cycleType
|
|
35248
|
+
);
|
|
34952
35249
|
}
|
|
34953
35250
|
}
|
|
34954
35251
|
const {
|
|
34955
35252
|
status: withdrawalFromExtendedStatus,
|
|
34956
35253
|
receivedTxnHash: withdrawalFromExtendedTxnHash
|
|
34957
35254
|
} = await extendedAdapter.withdrawFromExtended(params.amount);
|
|
34958
|
-
logger.info(
|
|
35255
|
+
logger.info(
|
|
35256
|
+
`withdrawalFromExtendedStatus: ${withdrawalFromExtendedStatus}, withdrawalFromExtendedTxnHash: ${withdrawalFromExtendedTxnHash}`
|
|
35257
|
+
);
|
|
34959
35258
|
if (withdrawalFromExtendedStatus && withdrawalFromExtendedTxnHash) {
|
|
34960
35259
|
const extendedHoldings2 = await extendedAdapter.getExtendedDepositAmount();
|
|
34961
|
-
logger.info(
|
|
35260
|
+
logger.info(
|
|
35261
|
+
`extendedHoldings after withdrawal ${extendedHoldings2?.availableForWithdrawal}`
|
|
35262
|
+
);
|
|
34962
35263
|
await new Promise((resolve) => setTimeout(resolve, 5e3));
|
|
34963
|
-
const { calls, status } = await this.moveAssetsToVaultAllocator(
|
|
35264
|
+
const { calls, status } = await this.moveAssetsToVaultAllocator(
|
|
35265
|
+
params.amount,
|
|
35266
|
+
extendedAdapter
|
|
35267
|
+
);
|
|
34964
35268
|
if (calls.length > 0 && status) {
|
|
34965
|
-
return this.createTransactionResult(
|
|
35269
|
+
return this.createTransactionResult(
|
|
35270
|
+
calls,
|
|
35271
|
+
true,
|
|
35272
|
+
params,
|
|
35273
|
+
"WITHDRAWAL",
|
|
35274
|
+
params.cycleType
|
|
35275
|
+
);
|
|
34966
35276
|
} else {
|
|
34967
|
-
return this.createTransactionResult(
|
|
35277
|
+
return this.createTransactionResult(
|
|
35278
|
+
[],
|
|
35279
|
+
true,
|
|
35280
|
+
params,
|
|
35281
|
+
"WITHDRAWAL",
|
|
35282
|
+
params.cycleType
|
|
35283
|
+
);
|
|
34968
35284
|
}
|
|
34969
35285
|
} else if (withdrawalFromExtendedStatus && !withdrawalFromExtendedTxnHash) {
|
|
34970
|
-
logger.error(
|
|
34971
|
-
|
|
35286
|
+
logger.error(
|
|
35287
|
+
"withdrawal from extended successful, but funds didn't get transferred to the wallet"
|
|
35288
|
+
);
|
|
35289
|
+
return this.createTransactionResult(
|
|
35290
|
+
[],
|
|
35291
|
+
true,
|
|
35292
|
+
params,
|
|
35293
|
+
"WITHDRAWAL",
|
|
35294
|
+
params.cycleType
|
|
35295
|
+
);
|
|
34972
35296
|
} else {
|
|
34973
35297
|
logger.error("withdrawal from extended failed");
|
|
34974
|
-
return this.createTransactionResult(
|
|
35298
|
+
return this.createTransactionResult(
|
|
35299
|
+
[],
|
|
35300
|
+
false,
|
|
35301
|
+
params,
|
|
35302
|
+
"NONE",
|
|
35303
|
+
params.cycleType
|
|
35304
|
+
);
|
|
34975
35305
|
}
|
|
34976
35306
|
} else if (params.to === Protocols.VAULT.name && params.from === Protocols.VESU.name) {
|
|
34977
|
-
const isPriceDifferenceBetweenAvnuAndExtended = await this.checkPriceDifferenceBetweenAvnuAndExtended(
|
|
35307
|
+
const isPriceDifferenceBetweenAvnuAndExtended = await this.checkPriceDifferenceBetweenAvnuAndExtended(
|
|
35308
|
+
extendedAdapter,
|
|
35309
|
+
vesuAdapter,
|
|
35310
|
+
avnuAdapter,
|
|
35311
|
+
"close" /* CLOSE */
|
|
35312
|
+
);
|
|
34978
35313
|
if (!isPriceDifferenceBetweenAvnuAndExtended) {
|
|
34979
|
-
logger.warn(
|
|
34980
|
-
|
|
35314
|
+
logger.warn(
|
|
35315
|
+
`price difference between avnu and extended doesn't fit the range for close position, ${avnuAdapter.config.maximumExtendedPriceDifferenceForSwapClosing}`
|
|
35316
|
+
);
|
|
35317
|
+
return this.createTransactionResult(
|
|
35318
|
+
[],
|
|
35319
|
+
false,
|
|
35320
|
+
params,
|
|
35321
|
+
"NONE",
|
|
35322
|
+
params.cycleType
|
|
35323
|
+
);
|
|
34981
35324
|
}
|
|
34982
35325
|
const vesuAmountInBTC = new Web3Number(
|
|
34983
35326
|
params.amount.dividedBy(collateralPrice.price).toFixed(WBTC_TOKEN_DECIMALS),
|
|
@@ -34991,19 +35334,41 @@ var VesuExtendedMultiplierStrategy = class _VesuExtendedMultiplierStrategy exten
|
|
|
34991
35334
|
await proofsInfo.callConstructor({ amount: vesuAmountInBTC })
|
|
34992
35335
|
);
|
|
34993
35336
|
calls.push(call);
|
|
34994
|
-
const swapProofsInfo = avnuAdapter.getProofs(
|
|
35337
|
+
const swapProofsInfo = avnuAdapter.getProofs(
|
|
35338
|
+
false,
|
|
35339
|
+
this.getMerkleTree()
|
|
35340
|
+
);
|
|
34995
35341
|
const swapProofGroups = swapProofsInfo.proofs;
|
|
34996
35342
|
const swapCall = this.getManageCall(
|
|
34997
35343
|
swapProofGroups,
|
|
34998
35344
|
await swapProofsInfo.callConstructor({ amount: vesuAmountInBTC })
|
|
34999
35345
|
);
|
|
35000
35346
|
calls.push(swapCall);
|
|
35001
|
-
return this.createTransactionResult(
|
|
35347
|
+
return this.createTransactionResult(
|
|
35348
|
+
calls,
|
|
35349
|
+
true,
|
|
35350
|
+
params,
|
|
35351
|
+
"WITHDRAWAL",
|
|
35352
|
+
params.cycleType
|
|
35353
|
+
);
|
|
35002
35354
|
} else if (params.to === Protocols.EXTENDED.name && params.from === Protocols.VESU.name) {
|
|
35003
|
-
const isPriceDifferenceBetweenAvnuAndExtended = await this.checkPriceDifferenceBetweenAvnuAndExtended(
|
|
35355
|
+
const isPriceDifferenceBetweenAvnuAndExtended = await this.checkPriceDifferenceBetweenAvnuAndExtended(
|
|
35356
|
+
extendedAdapter,
|
|
35357
|
+
vesuAdapter,
|
|
35358
|
+
avnuAdapter,
|
|
35359
|
+
"close" /* CLOSE */
|
|
35360
|
+
);
|
|
35004
35361
|
if (!isPriceDifferenceBetweenAvnuAndExtended) {
|
|
35005
|
-
logger.warn(
|
|
35006
|
-
|
|
35362
|
+
logger.warn(
|
|
35363
|
+
`price difference between avnu and extended doesn't fit the range for close position, ${avnuAdapter.config.maximumExtendedPriceDifferenceForSwapClosing}`
|
|
35364
|
+
);
|
|
35365
|
+
return this.createTransactionResult(
|
|
35366
|
+
[],
|
|
35367
|
+
false,
|
|
35368
|
+
params,
|
|
35369
|
+
"NONE",
|
|
35370
|
+
params.cycleType
|
|
35371
|
+
);
|
|
35007
35372
|
}
|
|
35008
35373
|
const vesuAmountInBTC = new Web3Number(
|
|
35009
35374
|
params.amount.dividedBy(collateralPrice.price).toNumber(),
|
|
@@ -35017,7 +35382,10 @@ var VesuExtendedMultiplierStrategy = class _VesuExtendedMultiplierStrategy exten
|
|
|
35017
35382
|
await proofsInfo.callConstructor({ amount: vesuAmountInBTC })
|
|
35018
35383
|
);
|
|
35019
35384
|
calls.push(call);
|
|
35020
|
-
const swapProofsInfo = avnuAdapter.getProofs(
|
|
35385
|
+
const swapProofsInfo = avnuAdapter.getProofs(
|
|
35386
|
+
false,
|
|
35387
|
+
this.getMerkleTree()
|
|
35388
|
+
);
|
|
35021
35389
|
const swapProofGroups = swapProofsInfo.proofs;
|
|
35022
35390
|
const swapCall = this.getManageCall(
|
|
35023
35391
|
swapProofGroups,
|
|
@@ -35034,21 +35402,61 @@ var VesuExtendedMultiplierStrategy = class _VesuExtendedMultiplierStrategy exten
|
|
|
35034
35402
|
await proofsInfoDeposit.callConstructor({ amount: params.amount })
|
|
35035
35403
|
);
|
|
35036
35404
|
calls.push(callDeposit);
|
|
35037
|
-
return this.createTransactionResult(
|
|
35405
|
+
return this.createTransactionResult(
|
|
35406
|
+
calls,
|
|
35407
|
+
true,
|
|
35408
|
+
params,
|
|
35409
|
+
"DEPOSIT",
|
|
35410
|
+
params.cycleType
|
|
35411
|
+
);
|
|
35038
35412
|
}
|
|
35039
|
-
logger.error(
|
|
35040
|
-
|
|
35413
|
+
logger.error(
|
|
35414
|
+
`Unsupported assets movement: ${params.from} to ${params.to}`
|
|
35415
|
+
);
|
|
35416
|
+
return this.createTransactionResult(
|
|
35417
|
+
[],
|
|
35418
|
+
false,
|
|
35419
|
+
params,
|
|
35420
|
+
"NONE",
|
|
35421
|
+
params.cycleType
|
|
35422
|
+
);
|
|
35041
35423
|
} catch (err) {
|
|
35042
35424
|
logger.error(`error moving assets: ${err}`);
|
|
35043
|
-
return this.createTransactionResult(
|
|
35425
|
+
return this.createTransactionResult(
|
|
35426
|
+
[],
|
|
35427
|
+
false,
|
|
35428
|
+
params,
|
|
35429
|
+
"NONE",
|
|
35430
|
+
params.cycleType
|
|
35431
|
+
);
|
|
35044
35432
|
}
|
|
35045
35433
|
}
|
|
35046
35434
|
async handleDeposit() {
|
|
35047
35435
|
try {
|
|
35048
|
-
return this.createTransactionResult(
|
|
35436
|
+
return this.createTransactionResult(
|
|
35437
|
+
[],
|
|
35438
|
+
false,
|
|
35439
|
+
{
|
|
35440
|
+
from: Protocols.VAULT.name,
|
|
35441
|
+
to: Protocols.VAULT.name,
|
|
35442
|
+
amount: new Web3Number(0, 0)
|
|
35443
|
+
},
|
|
35444
|
+
"NONE",
|
|
35445
|
+
"INVESTMENT" /* INVESTMENT */
|
|
35446
|
+
);
|
|
35049
35447
|
} catch (err) {
|
|
35050
35448
|
logger.error(`error handling deposit: ${err}`);
|
|
35051
|
-
return this.createTransactionResult(
|
|
35449
|
+
return this.createTransactionResult(
|
|
35450
|
+
[],
|
|
35451
|
+
false,
|
|
35452
|
+
{
|
|
35453
|
+
from: Protocols.VAULT.name,
|
|
35454
|
+
to: Protocols.VAULT.name,
|
|
35455
|
+
amount: new Web3Number(0, 0)
|
|
35456
|
+
},
|
|
35457
|
+
"NONE",
|
|
35458
|
+
"INVESTMENT" /* INVESTMENT */
|
|
35459
|
+
);
|
|
35052
35460
|
}
|
|
35053
35461
|
}
|
|
35054
35462
|
/**
|
|
@@ -35060,32 +35468,42 @@ var VesuExtendedMultiplierStrategy = class _VesuExtendedMultiplierStrategy exten
|
|
|
35060
35468
|
* @returns true if the price difference is within the acceptable range, false otherwise
|
|
35061
35469
|
*/
|
|
35062
35470
|
async checkPriceDifferenceBetweenAvnuAndExtended(extendedAdapter, vesuAdapter, avnuAdapter, positionType) {
|
|
35063
|
-
const {
|
|
35064
|
-
ask,
|
|
35065
|
-
bid
|
|
35066
|
-
} = await extendedAdapter.fetchOrderBookBTCUSDC();
|
|
35471
|
+
const { ask, bid } = await extendedAdapter.fetchOrderBookBTCUSDC();
|
|
35067
35472
|
const price = ask.plus(bid).dividedBy(2);
|
|
35068
35473
|
const btcToken = vesuAdapter.config.supportedPositions[0].asset;
|
|
35069
|
-
const btcPriceAvnu = await avnuAdapter.getPriceOfToken(
|
|
35474
|
+
const btcPriceAvnu = await avnuAdapter.getPriceOfToken(
|
|
35475
|
+
btcToken.address.toString()
|
|
35476
|
+
);
|
|
35070
35477
|
if (!btcPriceAvnu) {
|
|
35071
35478
|
logger.error(`error getting btc price avnu: ${btcPriceAvnu}`);
|
|
35072
35479
|
return false;
|
|
35073
35480
|
}
|
|
35074
35481
|
logger.info(`price: ${price}`);
|
|
35075
35482
|
logger.info(`btcPriceAvnu: ${btcPriceAvnu}`);
|
|
35076
|
-
const priceDifference = new Web3Number(
|
|
35483
|
+
const priceDifference = new Web3Number(
|
|
35484
|
+
price.minus(btcPriceAvnu).toFixed(2),
|
|
35485
|
+
0
|
|
35486
|
+
);
|
|
35077
35487
|
logger.info(`priceDifference: ${priceDifference}`);
|
|
35078
35488
|
if (priceDifference.isNegative()) {
|
|
35079
35489
|
return false;
|
|
35080
35490
|
}
|
|
35081
35491
|
if (positionType === "open" /* OPEN */) {
|
|
35082
|
-
logger.info(
|
|
35083
|
-
|
|
35492
|
+
logger.info(
|
|
35493
|
+
`price difference between avnu and extended for open position: ${priceDifference.toNumber()}, minimumExtendedPriceDifferenceForSwapOpen: ${avnuAdapter.config.minimumExtendedPriceDifferenceForSwapOpen}`
|
|
35494
|
+
);
|
|
35495
|
+
const result = priceDifference.greaterThanOrEqualTo(
|
|
35496
|
+
avnuAdapter.config.minimumExtendedPriceDifferenceForSwapOpen
|
|
35497
|
+
);
|
|
35084
35498
|
logger.info(`result: ${result}`);
|
|
35085
35499
|
return result;
|
|
35086
35500
|
} else {
|
|
35087
|
-
logger.info(
|
|
35088
|
-
|
|
35501
|
+
logger.info(
|
|
35502
|
+
`price difference between avnu and extended for close position: ${priceDifference.toNumber()}, maximumExtendedPriceDifferenceForSwapClosing: ${avnuAdapter.config.maximumExtendedPriceDifferenceForSwapClosing}`
|
|
35503
|
+
);
|
|
35504
|
+
const result = priceDifference.lessThanOrEqualTo(
|
|
35505
|
+
avnuAdapter.config.maximumExtendedPriceDifferenceForSwapClosing
|
|
35506
|
+
);
|
|
35089
35507
|
logger.info(`result: ${result}`);
|
|
35090
35508
|
return result;
|
|
35091
35509
|
}
|
|
@@ -35107,7 +35525,19 @@ var VesuExtendedMultiplierStrategy = class _VesuExtendedMultiplierStrategy exten
|
|
|
35107
35525
|
amount: usdcBalanceVaultAllocator.amount
|
|
35108
35526
|
});
|
|
35109
35527
|
calls.push(withdrawCall2);
|
|
35110
|
-
return [
|
|
35528
|
+
return [
|
|
35529
|
+
this.createTransactionResult(
|
|
35530
|
+
calls,
|
|
35531
|
+
true,
|
|
35532
|
+
{
|
|
35533
|
+
from: Protocols.VAULT.name,
|
|
35534
|
+
to: Protocols.NONE.name,
|
|
35535
|
+
amount
|
|
35536
|
+
},
|
|
35537
|
+
"WITHDRAWAL",
|
|
35538
|
+
"WITHDRAWAL" /* WITHDRAWAL */
|
|
35539
|
+
)
|
|
35540
|
+
];
|
|
35111
35541
|
}
|
|
35112
35542
|
const vesuAdapter = await this.getVesuAdapter();
|
|
35113
35543
|
const extendedAdapter = await this.getExtendedAdapter();
|
|
@@ -35116,18 +35546,40 @@ var VesuExtendedMultiplierStrategy = class _VesuExtendedMultiplierStrategy exten
|
|
|
35116
35546
|
logger.error(
|
|
35117
35547
|
`vesu or extended adapter not found: vesuAdapter=${vesuAdapter}, extendedAdapter=${extendedAdapter}`
|
|
35118
35548
|
);
|
|
35119
|
-
return [
|
|
35549
|
+
return [
|
|
35550
|
+
this.createTransactionResult(
|
|
35551
|
+
calls,
|
|
35552
|
+
status,
|
|
35553
|
+
{
|
|
35554
|
+
from: Protocols.VAULT.name,
|
|
35555
|
+
to: Protocols.NONE.name,
|
|
35556
|
+
amount
|
|
35557
|
+
},
|
|
35558
|
+
"NONE",
|
|
35559
|
+
"WITHDRAWAL" /* WITHDRAWAL */
|
|
35560
|
+
)
|
|
35561
|
+
];
|
|
35120
35562
|
}
|
|
35121
35563
|
let transactionResults = [];
|
|
35122
35564
|
const { collateralTokenAmount } = await vesuAdapter.vesuAdapter.getAssetPrices();
|
|
35123
|
-
const {
|
|
35124
|
-
collateralPrice
|
|
35125
|
-
} = await this.getAssetPrices();
|
|
35565
|
+
const { collateralPrice } = await this.getAssetPrices();
|
|
35126
35566
|
const extendedPositon = await extendedAdapter.getAllOpenPositions();
|
|
35127
35567
|
if (!extendedPositon) {
|
|
35128
35568
|
status = false;
|
|
35129
35569
|
logger.error("error getting extended position", extendedPositon);
|
|
35130
|
-
return [
|
|
35570
|
+
return [
|
|
35571
|
+
this.createTransactionResult(
|
|
35572
|
+
calls,
|
|
35573
|
+
status,
|
|
35574
|
+
{
|
|
35575
|
+
from: Protocols.VAULT.name,
|
|
35576
|
+
to: Protocols.NONE.name,
|
|
35577
|
+
amount
|
|
35578
|
+
},
|
|
35579
|
+
"NONE",
|
|
35580
|
+
"WITHDRAWAL" /* WITHDRAWAL */
|
|
35581
|
+
)
|
|
35582
|
+
];
|
|
35131
35583
|
}
|
|
35132
35584
|
const amountDistributionForWithdrawal = await calculateAmountDistributionForWithdrawal(
|
|
35133
35585
|
usdcBalanceDifference,
|
|
@@ -35140,11 +35592,27 @@ var VesuExtendedMultiplierStrategy = class _VesuExtendedMultiplierStrategy exten
|
|
|
35140
35592
|
logger.error(
|
|
35141
35593
|
`error calculating amount distribution for withdrawal: ${amountDistributionForWithdrawal}`
|
|
35142
35594
|
);
|
|
35143
|
-
return [
|
|
35595
|
+
return [
|
|
35596
|
+
this.createTransactionResult(
|
|
35597
|
+
calls,
|
|
35598
|
+
status,
|
|
35599
|
+
{
|
|
35600
|
+
from: Protocols.VAULT.name,
|
|
35601
|
+
to: Protocols.NONE.name,
|
|
35602
|
+
amount
|
|
35603
|
+
},
|
|
35604
|
+
"NONE",
|
|
35605
|
+
"WITHDRAWAL" /* WITHDRAWAL */
|
|
35606
|
+
)
|
|
35607
|
+
];
|
|
35144
35608
|
}
|
|
35145
35609
|
const { vesu_amount, extended_amount } = amountDistributionForWithdrawal;
|
|
35146
35610
|
if (status && vesu_amount.greaterThan(0)) {
|
|
35147
|
-
const {
|
|
35611
|
+
const {
|
|
35612
|
+
calls: vesuCalls,
|
|
35613
|
+
status: vesuStatus,
|
|
35614
|
+
transactionMetadata: vesuTransactionMetadata
|
|
35615
|
+
} = await this.moveAssets(
|
|
35148
35616
|
{
|
|
35149
35617
|
amount: vesu_amount,
|
|
35150
35618
|
from: Protocols.VESU.name,
|
|
@@ -35162,7 +35630,11 @@ var VesuExtendedMultiplierStrategy = class _VesuExtendedMultiplierStrategy exten
|
|
|
35162
35630
|
});
|
|
35163
35631
|
}
|
|
35164
35632
|
if (status && extended_amount.greaterThan(0)) {
|
|
35165
|
-
const {
|
|
35633
|
+
const {
|
|
35634
|
+
calls: extendedCalls,
|
|
35635
|
+
status: extendedStatus,
|
|
35636
|
+
transactionMetadata: extendedTransactionMetadata
|
|
35637
|
+
} = await this.moveAssets(
|
|
35166
35638
|
{
|
|
35167
35639
|
amount: extended_amount,
|
|
35168
35640
|
from: Protocols.EXTENDED.name,
|
|
@@ -35180,8 +35652,22 @@ var VesuExtendedMultiplierStrategy = class _VesuExtendedMultiplierStrategy exten
|
|
|
35180
35652
|
transactionMetadata: extendedTransactionMetadata
|
|
35181
35653
|
});
|
|
35182
35654
|
} else {
|
|
35183
|
-
logger.error(
|
|
35184
|
-
|
|
35655
|
+
logger.error(
|
|
35656
|
+
"error moving assets to vault: extendedStatus: ${extendedStatus}"
|
|
35657
|
+
);
|
|
35658
|
+
return [
|
|
35659
|
+
this.createTransactionResult(
|
|
35660
|
+
[],
|
|
35661
|
+
status,
|
|
35662
|
+
{
|
|
35663
|
+
from: Protocols.VAULT.name,
|
|
35664
|
+
to: Protocols.NONE.name,
|
|
35665
|
+
amount
|
|
35666
|
+
},
|
|
35667
|
+
"NONE",
|
|
35668
|
+
"WITHDRAWAL" /* WITHDRAWAL */
|
|
35669
|
+
)
|
|
35670
|
+
];
|
|
35185
35671
|
}
|
|
35186
35672
|
}
|
|
35187
35673
|
const withdrawCall = await this.getBringLiquidityCall({
|
|
@@ -35203,7 +35689,19 @@ var VesuExtendedMultiplierStrategy = class _VesuExtendedMultiplierStrategy exten
|
|
|
35203
35689
|
return transactionResults;
|
|
35204
35690
|
} catch (err) {
|
|
35205
35691
|
logger.error(`error handling withdrawal: ${err}`);
|
|
35206
|
-
return [
|
|
35692
|
+
return [
|
|
35693
|
+
this.createTransactionResult(
|
|
35694
|
+
[],
|
|
35695
|
+
false,
|
|
35696
|
+
{
|
|
35697
|
+
from: Protocols.VAULT.name,
|
|
35698
|
+
to: Protocols.NONE.name,
|
|
35699
|
+
amount
|
|
35700
|
+
},
|
|
35701
|
+
"NONE",
|
|
35702
|
+
"WITHDRAWAL" /* WITHDRAWAL */
|
|
35703
|
+
)
|
|
35704
|
+
];
|
|
35207
35705
|
}
|
|
35208
35706
|
}
|
|
35209
35707
|
async getAUM() {
|
|
@@ -35255,8 +35753,12 @@ var VesuExtendedMultiplierStrategy = class _VesuExtendedMultiplierStrategy exten
|
|
|
35255
35753
|
const txnsToBeExecuted = txnData.filter((txn) => {
|
|
35256
35754
|
return txn.transactionMetadata.transactionType !== "NONE" && txn.transactionMetadata.protocolFrom !== "" && txn.transactionMetadata.protocolTo !== "";
|
|
35257
35755
|
});
|
|
35258
|
-
const callsToBeExecutedFinal = txnsToBeExecuted.flatMap(
|
|
35259
|
-
|
|
35756
|
+
const callsToBeExecutedFinal = txnsToBeExecuted.flatMap(
|
|
35757
|
+
(txn) => txn.calls
|
|
35758
|
+
);
|
|
35759
|
+
const txnMetadata = txnsToBeExecuted.map(
|
|
35760
|
+
(txn) => txn.transactionMetadata
|
|
35761
|
+
);
|
|
35260
35762
|
return { callsToBeExecutedFinal, txnMetadata };
|
|
35261
35763
|
} catch (err) {
|
|
35262
35764
|
logger.error(`error processing transaction data from SDK: ${err}`);
|
|
@@ -35286,23 +35788,42 @@ var VesuExtendedMultiplierStrategy = class _VesuExtendedMultiplierStrategy exten
|
|
|
35286
35788
|
if (!vesuAdapter || !extendedAdapter) {
|
|
35287
35789
|
return new Web3Number(0, 0);
|
|
35288
35790
|
}
|
|
35289
|
-
const extendedFundingRate = new Web3Number(
|
|
35791
|
+
const extendedFundingRate = new Web3Number(
|
|
35792
|
+
(await extendedAdapter.getNetAPY()).toFixed(4),
|
|
35793
|
+
0
|
|
35794
|
+
);
|
|
35290
35795
|
const extendedPositions = await extendedAdapter.getAllOpenPositions();
|
|
35291
35796
|
if (!extendedPositions || extendedPositions.length === 0) {
|
|
35292
35797
|
logger.info(`no extended positions found`);
|
|
35293
35798
|
return new Web3Number(0, 0);
|
|
35294
35799
|
}
|
|
35295
|
-
const extendePositionSizeUSD = new Web3Number(
|
|
35800
|
+
const extendePositionSizeUSD = new Web3Number(
|
|
35801
|
+
extendedPositions[0].value || 0,
|
|
35802
|
+
0
|
|
35803
|
+
);
|
|
35296
35804
|
const vesuPositions = await vesuAdapter.getPositions();
|
|
35297
35805
|
const vesuSupplyApy = vesuPositions[0].apy.apy;
|
|
35298
|
-
const vesuCollateralSizeUSD = new Web3Number(
|
|
35299
|
-
|
|
35806
|
+
const vesuCollateralSizeUSD = new Web3Number(
|
|
35807
|
+
vesuPositions[0].usdValue.toFixed(USDC_TOKEN_DECIMALS),
|
|
35808
|
+
USDC_TOKEN_DECIMALS
|
|
35809
|
+
);
|
|
35810
|
+
const vesuDebtSizeUSD = new Web3Number(
|
|
35811
|
+
vesuPositions[1].usdValue.toFixed(USDC_TOKEN_DECIMALS),
|
|
35812
|
+
USDC_TOKEN_DECIMALS
|
|
35813
|
+
);
|
|
35300
35814
|
const num1 = extendePositionSizeUSD.multipliedBy(extendedFundingRate);
|
|
35301
35815
|
const num22 = vesuCollateralSizeUSD.multipliedBy(vesuSupplyApy);
|
|
35302
35816
|
const num32 = vesuDebtSizeUSD.abs();
|
|
35303
35817
|
const maxBorrowApy = num1.plus(num22).minus(0.1).dividedBy(num32);
|
|
35304
|
-
const vesuMaxBorrowableAmount = await vesuAdapter.vesuAdapter.getMaxBorrowableByInterestRate(
|
|
35305
|
-
|
|
35818
|
+
const vesuMaxBorrowableAmount = await vesuAdapter.vesuAdapter.getMaxBorrowableByInterestRate(
|
|
35819
|
+
this.config,
|
|
35820
|
+
vesuAdapter.config.debt,
|
|
35821
|
+
maxBorrowApy.toNumber()
|
|
35822
|
+
);
|
|
35823
|
+
return new Web3Number(
|
|
35824
|
+
vesuMaxBorrowableAmount.toFixed(USDC_TOKEN_DECIMALS),
|
|
35825
|
+
USDC_TOKEN_DECIMALS
|
|
35826
|
+
);
|
|
35306
35827
|
}
|
|
35307
35828
|
async getVesuHealthFactors() {
|
|
35308
35829
|
const vesuAdapter = await this.getVesuAdapter();
|
|
@@ -35311,18 +35832,33 @@ var VesuExtendedMultiplierStrategy = class _VesuExtendedMultiplierStrategy exten
|
|
|
35311
35832
|
return [0, 0];
|
|
35312
35833
|
}
|
|
35313
35834
|
const vesuPositions = await vesuAdapter.getPositions();
|
|
35314
|
-
const vesuCollateralSizeUSD = new Web3Number(
|
|
35315
|
-
|
|
35835
|
+
const vesuCollateralSizeUSD = new Web3Number(
|
|
35836
|
+
vesuPositions[0].usdValue.toFixed(USDC_TOKEN_DECIMALS),
|
|
35837
|
+
0
|
|
35838
|
+
);
|
|
35839
|
+
const vesuDebtSizeUSD = new Web3Number(
|
|
35840
|
+
vesuPositions[1].usdValue.toFixed(USDC_TOKEN_DECIMALS),
|
|
35841
|
+
0
|
|
35842
|
+
);
|
|
35316
35843
|
const actualLtv = vesuDebtSizeUSD.dividedBy(vesuCollateralSizeUSD).abs();
|
|
35317
35844
|
logger.info(`actualLtv: ${actualLtv.toNumber()}`);
|
|
35318
|
-
const maxLtv = new Web3Number(
|
|
35319
|
-
|
|
35845
|
+
const maxLtv = new Web3Number(
|
|
35846
|
+
await vesuAdapter.vesuAdapter.getLTVConfig(this.config),
|
|
35847
|
+
4
|
|
35848
|
+
);
|
|
35849
|
+
const healthFactor = new Web3Number(
|
|
35850
|
+
maxLtv.dividedBy(actualLtv).toFixed(4),
|
|
35851
|
+
4
|
|
35852
|
+
);
|
|
35320
35853
|
logger.info(`healthFactor: ${healthFactor.toNumber()}`);
|
|
35321
35854
|
const extendedBalance = await extendedAdapter.getExtendedDepositAmount();
|
|
35322
35855
|
if (!extendedBalance) {
|
|
35323
35856
|
return [0, 0];
|
|
35324
35857
|
}
|
|
35325
|
-
const extendedLeverage = new Web3Number(
|
|
35858
|
+
const extendedLeverage = new Web3Number(
|
|
35859
|
+
(Number(extendedBalance.marginRatio) * 100).toFixed(4),
|
|
35860
|
+
4
|
|
35861
|
+
);
|
|
35326
35862
|
logger.info(`extendedLeverage: ${extendedLeverage.toNumber()}`);
|
|
35327
35863
|
return [healthFactor.toNumber(), extendedLeverage.toNumber()];
|
|
35328
35864
|
}
|
|
@@ -35343,12 +35879,16 @@ var VesuExtendedMultiplierStrategy = class _VesuExtendedMultiplierStrategy exten
|
|
|
35343
35879
|
splits: []
|
|
35344
35880
|
};
|
|
35345
35881
|
}
|
|
35346
|
-
let vesuPositions = allPositions.filter(
|
|
35882
|
+
let vesuPositions = allPositions.filter(
|
|
35883
|
+
(item) => item.protocol === Protocols.VESU
|
|
35884
|
+
);
|
|
35347
35885
|
vesuPositions.map((item) => {
|
|
35348
35886
|
item.apy.apy = item.apy.apy * 0.1;
|
|
35349
35887
|
});
|
|
35350
35888
|
const extendedPositions = await extendedAdapter.getAllOpenPositions();
|
|
35351
|
-
const usdcToken = Global.getDefaultTokens().find(
|
|
35889
|
+
const usdcToken = Global.getDefaultTokens().find(
|
|
35890
|
+
(token) => token.symbol === "USDC"
|
|
35891
|
+
);
|
|
35352
35892
|
if (!extendedPositions || !usdcToken) {
|
|
35353
35893
|
return {
|
|
35354
35894
|
net: 0,
|
|
@@ -35361,7 +35901,10 @@ var VesuExtendedMultiplierStrategy = class _VesuExtendedMultiplierStrategy exten
|
|
|
35361
35901
|
const totalHoldingsUSDValue = allPositions.reduce((acc, curr) => acc + curr.usdValue, 0) + Number(extendedEquity);
|
|
35362
35902
|
console.log(totalHoldingsUSDValue);
|
|
35363
35903
|
const extendedPositionSizeMultipliedByApy = Number(extendedPosition.value) * extendedApy;
|
|
35364
|
-
let weightedAPYs = allPositions.reduce(
|
|
35904
|
+
let weightedAPYs = allPositions.reduce(
|
|
35905
|
+
(acc, curr) => acc + curr.apy.apy * curr.usdValue,
|
|
35906
|
+
0
|
|
35907
|
+
) + extendedPositionSizeMultipliedByApy;
|
|
35365
35908
|
console.log(weightedAPYs);
|
|
35366
35909
|
const netAPY = weightedAPYs / totalHoldingsUSDValue;
|
|
35367
35910
|
console.log(netAPY);
|
|
@@ -35375,13 +35918,22 @@ var VesuExtendedMultiplierStrategy = class _VesuExtendedMultiplierStrategy exten
|
|
|
35375
35918
|
});
|
|
35376
35919
|
return {
|
|
35377
35920
|
net: netAPY,
|
|
35378
|
-
splits: allPositions.map((p) => ({
|
|
35921
|
+
splits: allPositions.map((p) => ({
|
|
35922
|
+
apy: p.apy.apy,
|
|
35923
|
+
id: p.remarks ?? ""
|
|
35924
|
+
}))
|
|
35379
35925
|
};
|
|
35380
35926
|
}
|
|
35381
35927
|
async getWalletHoldings() {
|
|
35382
|
-
const usdceToken = Global.getDefaultTokens().find(
|
|
35383
|
-
|
|
35384
|
-
|
|
35928
|
+
const usdceToken = Global.getDefaultTokens().find(
|
|
35929
|
+
(token) => token.symbol === "USDCe"
|
|
35930
|
+
);
|
|
35931
|
+
const wbtcToken = Global.getDefaultTokens().find(
|
|
35932
|
+
(token) => token.symbol === "WBTC"
|
|
35933
|
+
);
|
|
35934
|
+
const usdcToken = Global.getDefaultTokens().find(
|
|
35935
|
+
(token) => token.symbol === "USDC"
|
|
35936
|
+
);
|
|
35385
35937
|
if (!usdceToken || !wbtcToken || !usdcToken) {
|
|
35386
35938
|
return [];
|
|
35387
35939
|
}
|
|
@@ -35455,9 +36007,7 @@ function getLooperSettings2(lstSymbol, underlyingSymbol, vaultSettings, pool1, e
|
|
|
35455
36007
|
});
|
|
35456
36008
|
const extendedAdapter = new ExtendedAdapter({
|
|
35457
36009
|
...baseAdapterConfig,
|
|
35458
|
-
supportedPositions: [
|
|
35459
|
-
{ asset: usdcToken, isDebt: true }
|
|
35460
|
-
],
|
|
36010
|
+
supportedPositions: [{ asset: usdcToken, isDebt: true }],
|
|
35461
36011
|
vaultIdExtended,
|
|
35462
36012
|
extendedContract: EXTENDED_CONTRACT,
|
|
35463
36013
|
extendedBackendWriteUrl,
|
|
@@ -35514,11 +36064,11 @@ function getLooperSettings2(lstSymbol, underlyingSymbol, vaultSettings, pool1, e
|
|
|
35514
36064
|
asset: wbtcToken.address
|
|
35515
36065
|
});
|
|
35516
36066
|
vaultSettings.leafAdapters.push(() => vesuMultiplyAdapter.getDepositLeaf());
|
|
36067
|
+
vaultSettings.leafAdapters.push(() => vesuMultiplyAdapter.getWithdrawLeaf());
|
|
36068
|
+
vaultSettings.leafAdapters.push(() => extendedAdapter.getDepositLeaf());
|
|
35517
36069
|
vaultSettings.leafAdapters.push(
|
|
35518
|
-
() =>
|
|
36070
|
+
() => extendedAdapter.getSwapFromLegacyLeaf()
|
|
35519
36071
|
);
|
|
35520
|
-
vaultSettings.leafAdapters.push(() => extendedAdapter.getDepositLeaf());
|
|
35521
|
-
vaultSettings.leafAdapters.push(() => extendedAdapter.getSwapFromLegacyLeaf());
|
|
35522
36072
|
vaultSettings.leafAdapters.push(() => avnuAdapter.getDepositLeaf());
|
|
35523
36073
|
vaultSettings.leafAdapters.push(() => avnuAdapter.getWithdrawLeaf());
|
|
35524
36074
|
vaultSettings.leafAdapters.push(
|
|
@@ -35563,29 +36113,70 @@ function VaultDescription2(lstSymbol, underlyingSymbol) {
|
|
|
35563
36113
|
" to create leverage. Depositors receive vault shares that represent a proportional claim on the underlying assets and accrued yield."
|
|
35564
36114
|
] }),
|
|
35565
36115
|
/* @__PURE__ */ jsxs4("p", { style: { fontSize: "14px", lineHeight: "1.5", marginBottom: "16px" }, children: [
|
|
35566
|
-
"This vault uses Vesu for lending and borrowing. The oracle used by this pool is a
|
|
35567
|
-
|
|
36116
|
+
"This vault uses Vesu for lending and borrowing. The oracle used by this pool is a",
|
|
36117
|
+
" ",
|
|
36118
|
+
highlightTextWithLinks("conversion rate oracle", [
|
|
36119
|
+
{
|
|
36120
|
+
highlight: "conversion rate oracle",
|
|
36121
|
+
link: "https://docs.pragma.build/starknet/development#conversion-rate"
|
|
36122
|
+
}
|
|
36123
|
+
]),
|
|
35568
36124
|
" ",
|
|
35569
36125
|
"which is resilient to liquidity issues and price volatility, hence reducing the risk of liquidation. However, overtime, if left un-monitored, debt can increase enough to trigger a liquidation. But no worries, our continuous monitoring systems look for situations with reduced health factor and balance collateral/debt to bring it back to safe levels. With Troves, you can have a peaceful sleep."
|
|
35570
36126
|
] }),
|
|
35571
|
-
/* @__PURE__ */ jsx5(
|
|
35572
|
-
|
|
35573
|
-
|
|
35574
|
-
|
|
35575
|
-
|
|
35576
|
-
|
|
35577
|
-
|
|
35578
|
-
|
|
35579
|
-
|
|
35580
|
-
|
|
36127
|
+
/* @__PURE__ */ jsx5(
|
|
36128
|
+
"div",
|
|
36129
|
+
{
|
|
36130
|
+
style: {
|
|
36131
|
+
backgroundColor: "#222",
|
|
36132
|
+
padding: "10px",
|
|
36133
|
+
borderRadius: "8px",
|
|
36134
|
+
marginBottom: "20px",
|
|
36135
|
+
border: "1px solid #444"
|
|
36136
|
+
},
|
|
36137
|
+
children: /* @__PURE__ */ jsxs4("p", { style: { fontSize: "13px", color: "#ccc" }, children: [
|
|
36138
|
+
/* @__PURE__ */ jsx5("strong", { children: "Withdrawals:" }),
|
|
36139
|
+
" Requests can take up to",
|
|
36140
|
+
" ",
|
|
36141
|
+
/* @__PURE__ */ jsx5("strong", { children: "1-2 hours" }),
|
|
36142
|
+
" to process as the vault unwinds and settles routing."
|
|
36143
|
+
] })
|
|
36144
|
+
}
|
|
36145
|
+
),
|
|
36146
|
+
/* @__PURE__ */ jsx5(
|
|
36147
|
+
"div",
|
|
36148
|
+
{
|
|
36149
|
+
style: {
|
|
36150
|
+
backgroundColor: "#222",
|
|
36151
|
+
padding: "10px",
|
|
36152
|
+
borderRadius: "8px",
|
|
36153
|
+
marginBottom: "20px",
|
|
36154
|
+
border: "1px solid #444"
|
|
36155
|
+
},
|
|
36156
|
+
children: /* @__PURE__ */ jsxs4("p", { style: { fontSize: "13px", color: "#ccc" }, children: [
|
|
36157
|
+
/* @__PURE__ */ jsx5("strong", { children: "Debt limits:" }),
|
|
36158
|
+
" Pools on Vesu have debt caps that are gradually increased over time. Until caps are raised, deposited Tokens remain in the vault, generating a shared net return for all depositors. There is no additional fee taken by Troves on Yield token's APY, its only on added gain."
|
|
36159
|
+
] })
|
|
36160
|
+
}
|
|
36161
|
+
)
|
|
35581
36162
|
] });
|
|
35582
36163
|
}
|
|
35583
36164
|
var re7UsdcPrimeDevansh = {
|
|
35584
|
-
vaultAddress: ContractAddr.from(
|
|
35585
|
-
|
|
35586
|
-
|
|
35587
|
-
|
|
35588
|
-
|
|
36165
|
+
vaultAddress: ContractAddr.from(
|
|
36166
|
+
"0x058905be22d6a81792df79425dc9641cf3e1b77f36748631b7d7e5d713a32b55"
|
|
36167
|
+
),
|
|
36168
|
+
manager: ContractAddr.from(
|
|
36169
|
+
"0x02648d703783feb2d967cf0520314cb5aa800d69a9426f3e3b317395af44de16"
|
|
36170
|
+
),
|
|
36171
|
+
vaultAllocator: ContractAddr.from(
|
|
36172
|
+
"0x07d533c838eab6a4d854dd3aea96a55993fccd35821921970d00bde946b63b6f"
|
|
36173
|
+
),
|
|
36174
|
+
redeemRequestNFT: ContractAddr.from(
|
|
36175
|
+
"0x01ef91f08fb99729c00f82fc6e0ece37917bcc43952596c19996259dc8adbbba"
|
|
36176
|
+
),
|
|
36177
|
+
aumOracle: ContractAddr.from(
|
|
36178
|
+
"0x030b6acfec162f5d6e72b8a4d2798aedce78fb39de78a8f549f7cd277ae8bc8d"
|
|
36179
|
+
),
|
|
35589
36180
|
leafAdapters: [],
|
|
35590
36181
|
adapters: [],
|
|
35591
36182
|
targetHealthFactor: 1.4,
|
|
@@ -35597,13 +36188,29 @@ var re7UsdcPrimeDevansh = {
|
|
|
35597
36188
|
"0.001",
|
|
35598
36189
|
Global.getDefaultTokens().find((token) => token.symbol === "WBTC").decimals
|
|
35599
36190
|
),
|
|
35600
|
-
borrowable_assets: [
|
|
36191
|
+
borrowable_assets: [
|
|
36192
|
+
Global.getDefaultTokens().find((token) => token.symbol === "WBTC")
|
|
36193
|
+
],
|
|
35601
36194
|
minimumWBTCDifferenceForAvnuSwap: MINIMUM_WBTC_DIFFERENCE_FOR_AVNU_SWAP,
|
|
35602
36195
|
walletAddress: WALLET_ADDRESS
|
|
35603
36196
|
};
|
|
35604
36197
|
var VesuExtendedTestStrategies = (extendedBackendReadUrl, extendedBackendWriteUrl, vaultIdExtended, minimumExtendedMovementAmount, minimumVesuMovementAmount, minimumExtendedRetriesDelayForOrderStatus, minimumExtendedPriceDifferenceForSwapOpen, maximumExtendedPriceDifferenceForSwapClosing) => {
|
|
35605
36198
|
return [
|
|
35606
|
-
getStrategySettingsVesuExtended(
|
|
36199
|
+
getStrategySettingsVesuExtended(
|
|
36200
|
+
"WBTC",
|
|
36201
|
+
"USDC",
|
|
36202
|
+
re7UsdcPrimeDevansh,
|
|
36203
|
+
false,
|
|
36204
|
+
false,
|
|
36205
|
+
extendedBackendReadUrl,
|
|
36206
|
+
extendedBackendWriteUrl,
|
|
36207
|
+
vaultIdExtended,
|
|
36208
|
+
minimumExtendedMovementAmount,
|
|
36209
|
+
minimumVesuMovementAmount,
|
|
36210
|
+
minimumExtendedRetriesDelayForOrderStatus,
|
|
36211
|
+
minimumExtendedPriceDifferenceForSwapOpen,
|
|
36212
|
+
maximumExtendedPriceDifferenceForSwapClosing
|
|
36213
|
+
)
|
|
35607
36214
|
];
|
|
35608
36215
|
};
|
|
35609
36216
|
function getStrategySettingsVesuExtended(lstSymbol, underlyingSymbol, addresses, isPreview = false, isLST, extendedBackendReadUrl, extendedBackendWriteUrl, vaultIdExtended, minimumExtendedMovementAmount, minimumVesuMovementAmount, minimumExtendedRetriesDelayForOrderStatus, minimumExtendedPriceDifferenceForSwapOpen, maximumExtendedPriceDifferenceForSwapClosing) {
|
|
@@ -35613,8 +36220,25 @@ function getStrategySettingsVesuExtended(lstSymbol, underlyingSymbol, addresses,
|
|
|
35613
36220
|
address: addresses.vaultAddress,
|
|
35614
36221
|
launchBlock: 0,
|
|
35615
36222
|
type: "Other",
|
|
35616
|
-
depositTokens: [
|
|
35617
|
-
|
|
36223
|
+
depositTokens: [
|
|
36224
|
+
Global.getDefaultTokens().find(
|
|
36225
|
+
(token) => token.symbol === underlyingSymbol
|
|
36226
|
+
)
|
|
36227
|
+
],
|
|
36228
|
+
additionalInfo: getLooperSettings2(
|
|
36229
|
+
lstSymbol,
|
|
36230
|
+
underlyingSymbol,
|
|
36231
|
+
addresses,
|
|
36232
|
+
VesuPools.Re7USDCPrime,
|
|
36233
|
+
extendedBackendReadUrl,
|
|
36234
|
+
extendedBackendWriteUrl,
|
|
36235
|
+
vaultIdExtended,
|
|
36236
|
+
minimumExtendedMovementAmount,
|
|
36237
|
+
minimumVesuMovementAmount,
|
|
36238
|
+
minimumExtendedRetriesDelayForOrderStatus,
|
|
36239
|
+
minimumExtendedPriceDifferenceForSwapOpen,
|
|
36240
|
+
maximumExtendedPriceDifferenceForSwapClosing
|
|
36241
|
+
),
|
|
35618
36242
|
risk: {
|
|
35619
36243
|
riskFactor: _riskFactor3,
|
|
35620
36244
|
netRisk: _riskFactor3.reduce((acc, curr) => acc + curr.value * curr.weight, 0) / _riskFactor3.reduce((acc, curr) => acc + curr.weight, 0),
|
|
@@ -39938,6 +40562,7 @@ export {
|
|
|
39938
40562
|
calculateBTCPriceDelta,
|
|
39939
40563
|
calculateDebtAmount,
|
|
39940
40564
|
calculateDebtReductionAmountForWithdrawal,
|
|
40565
|
+
calculateDeltaDebtAmount,
|
|
39941
40566
|
calculateExposureDelta,
|
|
39942
40567
|
calculateExtendedLevergae,
|
|
39943
40568
|
calculateVesUPositionSizeGivenExtended,
|