@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.browser.mjs
CHANGED
|
@@ -28566,14 +28566,14 @@ var calculateExposureDelta = (exposure_extended, exposure_vesu) => {
|
|
|
28566
28566
|
var calculateBTCPriceDelta = (btcPrice, lastBtcPrice) => {
|
|
28567
28567
|
return (btcPrice - lastBtcPrice) / lastBtcPrice * 100;
|
|
28568
28568
|
};
|
|
28569
|
-
var calculateVesUPositionSizeGivenExtended = (extendedPositonValue, extendedHoldingAmount, collateralAmount, collateralPrice) => {
|
|
28569
|
+
var calculateVesUPositionSizeGivenExtended = (extendedPositonValue, extendedHoldingAmount, collateralAmount, collateralPrice, vesuDebtAmountToBeRepaid) => {
|
|
28570
28570
|
const extendedLeverage = calculateExtendedLevergae();
|
|
28571
28571
|
const vesuLeverage = calculateVesuLeverage();
|
|
28572
28572
|
const extendedAmount = extendedHoldingAmount;
|
|
28573
28573
|
const extendedAmountInBTC = extendedAmount.dividedBy(collateralPrice);
|
|
28574
28574
|
const numerator1 = extendedAmount.multipliedBy(extendedLeverage).plus(extendedPositonValue);
|
|
28575
28575
|
const numerator2 = collateralAmount.multipliedBy(collateralPrice).multipliedBy(-1);
|
|
28576
|
-
const vesuAmountInUsd = numerator1.plus(numerator2).dividedBy(vesuLeverage);
|
|
28576
|
+
const vesuAmountInUsd = numerator1.plus(numerator2).dividedBy(vesuLeverage).plus(vesuDebtAmountToBeRepaid);
|
|
28577
28577
|
const vesuAmountInBTC = vesuAmountInUsd.dividedBy(collateralPrice).toFixed(WBTC_TOKEN_DECIMALS);
|
|
28578
28578
|
return {
|
|
28579
28579
|
vesuAmountInUsd: vesuAmountInUsd.toFixed(2),
|
|
@@ -28581,6 +28581,17 @@ var calculateVesUPositionSizeGivenExtended = (extendedPositonValue, extendedHold
|
|
|
28581
28581
|
extendedAmountInBTC
|
|
28582
28582
|
};
|
|
28583
28583
|
};
|
|
28584
|
+
var calculateDeltaDebtAmount = (maxLtv = MAX_LTV_BTC_USDC, existingVesuCollateral, existingVesuDebt, collateralPrice, debtPrice, targetHf = TARGET_HF) => {
|
|
28585
|
+
try {
|
|
28586
|
+
const term1 = existingVesuCollateral.multipliedBy(collateralPrice).multipliedBy(maxLtv).dividedBy(targetHf);
|
|
28587
|
+
const term2 = existingVesuDebt.multipliedBy(debtPrice).multipliedBy(targetHf).multipliedBy(-1);
|
|
28588
|
+
const debtAmountToBeRepaid = term1.plus(term2).dividedBy(targetHf);
|
|
28589
|
+
return debtAmountToBeRepaid;
|
|
28590
|
+
} catch (err) {
|
|
28591
|
+
logger.error(`error calculating delta position: ${err}`);
|
|
28592
|
+
return null;
|
|
28593
|
+
}
|
|
28594
|
+
};
|
|
28584
28595
|
|
|
28585
28596
|
// src/utils/health-factor-math.ts
|
|
28586
28597
|
var HealthFactorMath = class {
|
|
@@ -30648,6 +30659,8 @@ var AvnuAdapter = class _AvnuAdapter extends BaseAdapter {
|
|
|
30648
30659
|
quote,
|
|
30649
30660
|
vaultAllocator.address
|
|
30650
30661
|
);
|
|
30662
|
+
const dataObject = quote;
|
|
30663
|
+
logger.info(`${_AvnuAdapter.name}::getQuotesAvnu finalAmountOfWbtcOut : ${dataObject.avnuFees} ${parseInt(dataObject.buyAmount.toString(), 16)} ${parseInt(dataObject.sellAmount.toString(), 16)} ${parseInt(dataObject.sellAmount.toString(), 16)}`);
|
|
30651
30664
|
const swapCallData = getCalldata[0];
|
|
30652
30665
|
const amount = uint25614.bnToUint256(quote.sellAmountInUsd * 10 ** 7);
|
|
30653
30666
|
return [
|
|
@@ -34394,11 +34407,17 @@ var VesuExtendedMultiplierStrategy = class _VesuExtendedMultiplierStrategy exten
|
|
|
34394
34407
|
WALLET_ADDRESS,
|
|
34395
34408
|
usdceToken.decimals
|
|
34396
34409
|
);
|
|
34397
|
-
logger.info(
|
|
34410
|
+
logger.info(
|
|
34411
|
+
`${_VesuExtendedMultiplierStrategy.name}::moveAssetsToVaultAllocator walletBalance: ${walletBalance}`
|
|
34412
|
+
);
|
|
34398
34413
|
const amountToBeTransferred = amount.minimum(walletBalance);
|
|
34399
|
-
logger.info(
|
|
34414
|
+
logger.info(
|
|
34415
|
+
`${_VesuExtendedMultiplierStrategy.name}::moveAssetsToVaultAllocator amountToBeTransferred: ${amountToBeTransferred.toNumber()}`
|
|
34416
|
+
);
|
|
34400
34417
|
if (amountToBeTransferred.lessThan(0)) {
|
|
34401
|
-
logger.error(
|
|
34418
|
+
logger.error(
|
|
34419
|
+
`${_VesuExtendedMultiplierStrategy.name}::moveAssetsToVaultAllocator amountToBeTransferred is less than 0: ${amountToBeTransferred.toNumber()}`
|
|
34420
|
+
);
|
|
34402
34421
|
return {
|
|
34403
34422
|
calls: [],
|
|
34404
34423
|
status: false
|
|
@@ -34436,10 +34455,14 @@ var VesuExtendedMultiplierStrategy = class _VesuExtendedMultiplierStrategy exten
|
|
|
34436
34455
|
}
|
|
34437
34456
|
async shouldInvest() {
|
|
34438
34457
|
try {
|
|
34439
|
-
logger.info(
|
|
34458
|
+
logger.info(
|
|
34459
|
+
`${_VesuExtendedMultiplierStrategy.name}::shouldInvest starting`
|
|
34460
|
+
);
|
|
34440
34461
|
const vesuAdapter = await this.getVesuAdapter();
|
|
34441
34462
|
const extendedAdapter = await this.getExtendedAdapter();
|
|
34442
|
-
logger.info(
|
|
34463
|
+
logger.info(
|
|
34464
|
+
`${_VesuExtendedMultiplierStrategy.name}::shouldInvest adapters fetched: vesuAdapter=${!!vesuAdapter}, extendedAdapter=${!!extendedAdapter}, extendedAdapter.client=${!!extendedAdapter?.client}`
|
|
34465
|
+
);
|
|
34443
34466
|
if (!vesuAdapter) {
|
|
34444
34467
|
logger.error(
|
|
34445
34468
|
`Vesu adapter not configured in metadata. This is a configuration issue, not a temporary failure.`
|
|
@@ -34451,7 +34474,8 @@ var VesuExtendedMultiplierStrategy = class _VesuExtendedMultiplierStrategy exten
|
|
|
34451
34474
|
extendedLeverage: 0,
|
|
34452
34475
|
collateralPrice: 0,
|
|
34453
34476
|
debtPrice: 0,
|
|
34454
|
-
vesuLeverage: 0
|
|
34477
|
+
vesuLeverage: 0,
|
|
34478
|
+
debtAmountToBeRepaid: new Web3Number(0, 0)
|
|
34455
34479
|
};
|
|
34456
34480
|
}
|
|
34457
34481
|
if (!extendedAdapter) {
|
|
@@ -34465,7 +34489,8 @@ var VesuExtendedMultiplierStrategy = class _VesuExtendedMultiplierStrategy exten
|
|
|
34465
34489
|
extendedLeverage: 0,
|
|
34466
34490
|
collateralPrice: 0,
|
|
34467
34491
|
debtPrice: 0,
|
|
34468
|
-
vesuLeverage: 0
|
|
34492
|
+
vesuLeverage: 0,
|
|
34493
|
+
debtAmountToBeRepaid: new Web3Number(0, 0)
|
|
34469
34494
|
};
|
|
34470
34495
|
}
|
|
34471
34496
|
if (!extendedAdapter.client) {
|
|
@@ -34479,10 +34504,13 @@ var VesuExtendedMultiplierStrategy = class _VesuExtendedMultiplierStrategy exten
|
|
|
34479
34504
|
extendedLeverage: 0,
|
|
34480
34505
|
collateralPrice: 0,
|
|
34481
34506
|
debtPrice: 0,
|
|
34482
|
-
vesuLeverage: 0
|
|
34507
|
+
vesuLeverage: 0,
|
|
34508
|
+
debtAmountToBeRepaid: new Web3Number(0, 0)
|
|
34483
34509
|
};
|
|
34484
34510
|
}
|
|
34485
|
-
logger.info(
|
|
34511
|
+
logger.info(
|
|
34512
|
+
`${_VesuExtendedMultiplierStrategy.name}::shouldInvest calling getUnusedBalance`
|
|
34513
|
+
);
|
|
34486
34514
|
const balance = await this.getUnusedBalance();
|
|
34487
34515
|
if (!Number.isFinite(balance.usdValue) || balance.usdValue < 0) {
|
|
34488
34516
|
logger.error(
|
|
@@ -34495,13 +34523,18 @@ var VesuExtendedMultiplierStrategy = class _VesuExtendedMultiplierStrategy exten
|
|
|
34495
34523
|
extendedLeverage: 0,
|
|
34496
34524
|
collateralPrice: 0,
|
|
34497
34525
|
debtPrice: 0,
|
|
34498
|
-
vesuLeverage: 0
|
|
34526
|
+
vesuLeverage: 0,
|
|
34527
|
+
debtAmountToBeRepaid: new Web3Number(0, 0)
|
|
34499
34528
|
};
|
|
34500
34529
|
}
|
|
34501
|
-
logger.info(
|
|
34530
|
+
logger.info(
|
|
34531
|
+
`${_VesuExtendedMultiplierStrategy.name}::shouldInvest balance: ${balance.usdValue}`
|
|
34532
|
+
);
|
|
34502
34533
|
const usdcBalanceOnExtended = await extendedAdapter.getExtendedDepositAmount();
|
|
34503
34534
|
if (usdcBalanceOnExtended) {
|
|
34504
|
-
const availableForWithdrawal = parseFloat(
|
|
34535
|
+
const availableForWithdrawal = parseFloat(
|
|
34536
|
+
usdcBalanceOnExtended.availableForWithdrawal
|
|
34537
|
+
);
|
|
34505
34538
|
if (!Number.isFinite(availableForWithdrawal) || availableForWithdrawal < 0) {
|
|
34506
34539
|
logger.error(
|
|
34507
34540
|
`Invalid usdcBalanceOnExtended.availableForWithdrawal: ${usdcBalanceOnExtended.availableForWithdrawal}. Expected a finite, non-negative number.`
|
|
@@ -34513,11 +34546,15 @@ var VesuExtendedMultiplierStrategy = class _VesuExtendedMultiplierStrategy exten
|
|
|
34513
34546
|
extendedLeverage: 0,
|
|
34514
34547
|
collateralPrice: 0,
|
|
34515
34548
|
debtPrice: 0,
|
|
34516
|
-
vesuLeverage: 0
|
|
34549
|
+
vesuLeverage: 0,
|
|
34550
|
+
debtAmountToBeRepaid: new Web3Number(0, 0)
|
|
34517
34551
|
};
|
|
34518
34552
|
}
|
|
34519
34553
|
}
|
|
34520
|
-
const amountToInvest = new Web3Number(
|
|
34554
|
+
const amountToInvest = new Web3Number(
|
|
34555
|
+
balance.usdValue,
|
|
34556
|
+
USDC_TOKEN_DECIMALS
|
|
34557
|
+
).plus(usdcBalanceOnExtended?.availableForTrade ?? 0).multipliedBy(1 - LIMIT_BALANCE);
|
|
34521
34558
|
const amountToInvestNumber = amountToInvest.toNumber();
|
|
34522
34559
|
if (!Number.isFinite(amountToInvestNumber)) {
|
|
34523
34560
|
logger.error(
|
|
@@ -34530,10 +34567,13 @@ var VesuExtendedMultiplierStrategy = class _VesuExtendedMultiplierStrategy exten
|
|
|
34530
34567
|
extendedLeverage: 0,
|
|
34531
34568
|
collateralPrice: 0,
|
|
34532
34569
|
debtPrice: 0,
|
|
34533
|
-
vesuLeverage: 0
|
|
34570
|
+
vesuLeverage: 0,
|
|
34571
|
+
debtAmountToBeRepaid: new Web3Number(0, 0)
|
|
34534
34572
|
};
|
|
34535
34573
|
}
|
|
34536
|
-
logger.info(
|
|
34574
|
+
logger.info(
|
|
34575
|
+
`${_VesuExtendedMultiplierStrategy.name}::shouldInvest amountToInvest: ${amountToInvestNumber}`
|
|
34576
|
+
);
|
|
34537
34577
|
if (amountToInvest.lessThan(LIMIT_BALANCE_VALUE)) {
|
|
34538
34578
|
return {
|
|
34539
34579
|
shouldInvest: false,
|
|
@@ -34542,7 +34582,8 @@ var VesuExtendedMultiplierStrategy = class _VesuExtendedMultiplierStrategy exten
|
|
|
34542
34582
|
extendedLeverage: 0,
|
|
34543
34583
|
collateralPrice: 0,
|
|
34544
34584
|
debtPrice: 0,
|
|
34545
|
-
vesuLeverage: 0
|
|
34585
|
+
vesuLeverage: 0,
|
|
34586
|
+
debtAmountToBeRepaid: new Web3Number(0, 0)
|
|
34546
34587
|
};
|
|
34547
34588
|
}
|
|
34548
34589
|
const extendedPositon = await extendedAdapter.getAllOpenPositions();
|
|
@@ -34555,14 +34596,12 @@ var VesuExtendedMultiplierStrategy = class _VesuExtendedMultiplierStrategy exten
|
|
|
34555
34596
|
extendedLeverage: 0,
|
|
34556
34597
|
collateralPrice: 0,
|
|
34557
34598
|
debtPrice: 0,
|
|
34558
|
-
vesuLeverage: 0
|
|
34599
|
+
vesuLeverage: 0,
|
|
34600
|
+
debtAmountToBeRepaid: new Web3Number(0, 0)
|
|
34559
34601
|
};
|
|
34560
34602
|
}
|
|
34561
|
-
const { collateralTokenAmount } = await vesuAdapter.vesuAdapter.getAssetPrices();
|
|
34562
|
-
const {
|
|
34563
|
-
collateralPrice,
|
|
34564
|
-
debtPrice
|
|
34565
|
-
} = await this.getAssetPrices();
|
|
34603
|
+
const { collateralTokenAmount, debtTokenAmount } = await vesuAdapter.vesuAdapter.getAssetPrices();
|
|
34604
|
+
const { collateralPrice, debtPrice } = await this.getAssetPrices();
|
|
34566
34605
|
if (!Number.isFinite(collateralPrice.price) || collateralPrice.price <= 0) {
|
|
34567
34606
|
logger.error(
|
|
34568
34607
|
`Invalid collateralPrice: ${collateralPrice.price}. Expected a finite, positive number.`
|
|
@@ -34574,7 +34613,8 @@ var VesuExtendedMultiplierStrategy = class _VesuExtendedMultiplierStrategy exten
|
|
|
34574
34613
|
extendedLeverage: 0,
|
|
34575
34614
|
collateralPrice: 0,
|
|
34576
34615
|
debtPrice: 0,
|
|
34577
|
-
vesuLeverage: 0
|
|
34616
|
+
vesuLeverage: 0,
|
|
34617
|
+
debtAmountToBeRepaid: new Web3Number(0, 0)
|
|
34578
34618
|
};
|
|
34579
34619
|
}
|
|
34580
34620
|
if (!Number.isFinite(debtPrice.price) || debtPrice.price <= 0) {
|
|
@@ -34588,11 +34628,34 @@ var VesuExtendedMultiplierStrategy = class _VesuExtendedMultiplierStrategy exten
|
|
|
34588
34628
|
extendedLeverage: 0,
|
|
34589
34629
|
collateralPrice: 0,
|
|
34590
34630
|
debtPrice: 0,
|
|
34591
|
-
vesuLeverage: 0
|
|
34631
|
+
vesuLeverage: 0,
|
|
34632
|
+
debtAmountToBeRepaid: new Web3Number(0, 0)
|
|
34592
34633
|
};
|
|
34593
34634
|
}
|
|
34635
|
+
const debtAmountToBeRepaid = calculateDeltaDebtAmount(
|
|
34636
|
+
MAX_LTV_BTC_USDC,
|
|
34637
|
+
collateralTokenAmount,
|
|
34638
|
+
debtTokenAmount,
|
|
34639
|
+
collateralPrice.price,
|
|
34640
|
+
debtPrice.price,
|
|
34641
|
+
this.metadata.additionalInfo.targetHealthFactor
|
|
34642
|
+
);
|
|
34643
|
+
if (!debtAmountToBeRepaid) {
|
|
34644
|
+
logger.error("error calculating debt amount to be repaid");
|
|
34645
|
+
return {
|
|
34646
|
+
shouldInvest: false,
|
|
34647
|
+
vesuAmount: new Web3Number(0, 0),
|
|
34648
|
+
extendedAmount: new Web3Number(0, 0),
|
|
34649
|
+
extendedLeverage: 0,
|
|
34650
|
+
collateralPrice: 0,
|
|
34651
|
+
debtPrice: 0,
|
|
34652
|
+
vesuLeverage: 0,
|
|
34653
|
+
debtAmountToBeRepaid: new Web3Number(0, 0)
|
|
34654
|
+
};
|
|
34655
|
+
}
|
|
34656
|
+
const amountToInvestAfterRepayingDebt = amountToInvest.minus(debtAmountToBeRepaid);
|
|
34594
34657
|
const { vesu_amount, extended_amount, extended_leverage, vesu_leverage } = await calculateAmountDistribution(
|
|
34595
|
-
|
|
34658
|
+
amountToInvestAfterRepayingDebt.toNumber(),
|
|
34596
34659
|
extendedAdapter.client,
|
|
34597
34660
|
extendedAdapter.config.extendedMarketName,
|
|
34598
34661
|
collateralPrice.price,
|
|
@@ -34611,10 +34674,13 @@ var VesuExtendedMultiplierStrategy = class _VesuExtendedMultiplierStrategy exten
|
|
|
34611
34674
|
extendedLeverage: 0,
|
|
34612
34675
|
collateralPrice: 0,
|
|
34613
34676
|
debtPrice: 0,
|
|
34614
|
-
vesuLeverage: 0
|
|
34677
|
+
vesuLeverage: 0,
|
|
34678
|
+
debtAmountToBeRepaid: new Web3Number(0, 0)
|
|
34615
34679
|
};
|
|
34616
34680
|
}
|
|
34617
|
-
logger.info(
|
|
34681
|
+
logger.info(
|
|
34682
|
+
`${_VesuExtendedMultiplierStrategy.name}::shouldInvest vesu_amount: ${vesu_amount.toNumber()}, extended_amount: ${extended_amount.toNumber()}`
|
|
34683
|
+
);
|
|
34618
34684
|
return {
|
|
34619
34685
|
shouldInvest: true,
|
|
34620
34686
|
vesuAmount: vesu_amount,
|
|
@@ -34622,7 +34688,8 @@ var VesuExtendedMultiplierStrategy = class _VesuExtendedMultiplierStrategy exten
|
|
|
34622
34688
|
extendedLeverage: extended_leverage,
|
|
34623
34689
|
vesuLeverage: vesu_leverage,
|
|
34624
34690
|
collateralPrice: collateralPrice.price,
|
|
34625
|
-
debtPrice: debtPrice.price
|
|
34691
|
+
debtPrice: debtPrice.price,
|
|
34692
|
+
debtAmountToBeRepaid
|
|
34626
34693
|
};
|
|
34627
34694
|
} catch (err) {
|
|
34628
34695
|
logger.error(`error deciding invest: ${err}`);
|
|
@@ -34633,7 +34700,8 @@ var VesuExtendedMultiplierStrategy = class _VesuExtendedMultiplierStrategy exten
|
|
|
34633
34700
|
extendedLeverage: 0,
|
|
34634
34701
|
collateralPrice: 0,
|
|
34635
34702
|
debtPrice: 0,
|
|
34636
|
-
vesuLeverage: 0
|
|
34703
|
+
vesuLeverage: 0,
|
|
34704
|
+
debtAmountToBeRepaid: new Web3Number(0, 0)
|
|
34637
34705
|
};
|
|
34638
34706
|
}
|
|
34639
34707
|
}
|
|
@@ -34653,37 +34721,52 @@ var VesuExtendedMultiplierStrategy = class _VesuExtendedMultiplierStrategy exten
|
|
|
34653
34721
|
return [];
|
|
34654
34722
|
}
|
|
34655
34723
|
const usdcAmountInWallet = (await this.getUnusedBalance()).amount;
|
|
34656
|
-
const
|
|
34657
|
-
extendedHoldings.
|
|
34724
|
+
const usdcAmountOnExtendedAvailableForTrade = parseFloat(
|
|
34725
|
+
extendedHoldings.availableForTrade
|
|
34726
|
+
);
|
|
34727
|
+
logger.info(
|
|
34728
|
+
`${_VesuExtendedMultiplierStrategy.name}::shouldMoveAssets calculating movements - Extended current: ${usdcAmountOnExtendedAvailableForTrade}, Wallet: ${usdcAmountInWallet.toNumber()}, Target Extended: ${extendedAmount.toNumber()}, Target Vesu: ${vesuAmount.toNumber()}`
|
|
34658
34729
|
);
|
|
34659
|
-
logger.info(`${_VesuExtendedMultiplierStrategy.name}::shouldMoveAssets calculating movements - Extended current: ${usdcAmountOnExtendedAvailableForWithdrawal}, Wallet: ${usdcAmountInWallet.toNumber()}, Target Extended: ${extendedAmount.toNumber()}, Target Vesu: ${vesuAmount.toNumber()}`);
|
|
34660
34730
|
let totalExtendedWithdrawal = new Web3Number(0, USDC_TOKEN_DECIMALS);
|
|
34661
34731
|
let totalExtendedDeposit = new Web3Number(0, USDC_TOKEN_DECIMALS);
|
|
34662
34732
|
if (extendedAmount.isNegative() && extendedAmount.abs().greaterThan(extendedAdapter.minimumExtendedMovementAmount)) {
|
|
34663
|
-
totalExtendedWithdrawal = totalExtendedWithdrawal.plus(
|
|
34733
|
+
totalExtendedWithdrawal = totalExtendedWithdrawal.plus(
|
|
34734
|
+
extendedAmount.abs()
|
|
34735
|
+
);
|
|
34664
34736
|
}
|
|
34665
34737
|
const extendedTargetAmount = extendedAmount.abs();
|
|
34666
|
-
let projectedExtendedBalance =
|
|
34738
|
+
let projectedExtendedBalance = usdcAmountOnExtendedAvailableForTrade;
|
|
34667
34739
|
if (extendedAmount.isNegative()) {
|
|
34668
34740
|
projectedExtendedBalance = projectedExtendedBalance - extendedAmount.abs().toNumber();
|
|
34669
34741
|
}
|
|
34670
|
-
const extendedAmountDifference = extendedTargetAmount.minus(
|
|
34742
|
+
const extendedAmountDifference = extendedTargetAmount.minus(
|
|
34743
|
+
projectedExtendedBalance
|
|
34744
|
+
);
|
|
34671
34745
|
const extendedAmountDifferenceAbs = extendedAmountDifference.abs();
|
|
34672
34746
|
if (extendedAmountDifference.lessThan(0)) {
|
|
34673
|
-
totalExtendedWithdrawal = totalExtendedWithdrawal.plus(
|
|
34747
|
+
totalExtendedWithdrawal = totalExtendedWithdrawal.plus(
|
|
34748
|
+
extendedAmountDifferenceAbs
|
|
34749
|
+
);
|
|
34674
34750
|
} else if (extendedAmountDifference.greaterThan(0)) {
|
|
34675
|
-
totalExtendedDeposit = totalExtendedDeposit.plus(
|
|
34751
|
+
totalExtendedDeposit = totalExtendedDeposit.plus(
|
|
34752
|
+
extendedAmountDifference
|
|
34753
|
+
);
|
|
34676
34754
|
}
|
|
34677
34755
|
const vesuTargetAmount = vesuAmount.abs();
|
|
34678
34756
|
const projectedWalletBalance = usdcAmountInWallet.plus(totalExtendedWithdrawal).minus(totalExtendedDeposit);
|
|
34679
34757
|
let vesuAmountDifference = vesuTargetAmount.minus(projectedWalletBalance);
|
|
34680
34758
|
const vesuAmountDifferenceAbs = vesuAmountDifference.abs();
|
|
34681
|
-
logger.info(
|
|
34682
|
-
|
|
34759
|
+
logger.info(
|
|
34760
|
+
`${_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()}`
|
|
34761
|
+
);
|
|
34683
34762
|
let transactionResults = [];
|
|
34684
34763
|
if (extendedAmount.isNegative() && extendedAmount.abs().greaterThan(extendedAdapter.minimumExtendedMovementAmount)) {
|
|
34685
34764
|
try {
|
|
34686
|
-
const {
|
|
34765
|
+
const {
|
|
34766
|
+
calls: extendedCalls,
|
|
34767
|
+
status: extendedStatus,
|
|
34768
|
+
transactionMetadata: extendedTransactionMetadata
|
|
34769
|
+
} = await this.moveAssets(
|
|
34687
34770
|
{
|
|
34688
34771
|
to: Protocols.VAULT.name,
|
|
34689
34772
|
from: Protocols.EXTENDED.name,
|
|
@@ -34703,16 +34786,44 @@ var VesuExtendedMultiplierStrategy = class _VesuExtendedMultiplierStrategy exten
|
|
|
34703
34786
|
}
|
|
34704
34787
|
});
|
|
34705
34788
|
} else {
|
|
34706
|
-
return [
|
|
34789
|
+
return [
|
|
34790
|
+
this.createTransactionResult(
|
|
34791
|
+
[],
|
|
34792
|
+
false,
|
|
34793
|
+
{
|
|
34794
|
+
from: Protocols.EXTENDED.name,
|
|
34795
|
+
to: Protocols.VAULT.name,
|
|
34796
|
+
amount: extendedAmount.abs()
|
|
34797
|
+
},
|
|
34798
|
+
"NONE",
|
|
34799
|
+
"INVESTMENT" /* INVESTMENT */
|
|
34800
|
+
)
|
|
34801
|
+
];
|
|
34707
34802
|
}
|
|
34708
34803
|
} catch (err) {
|
|
34709
34804
|
logger.error(`Failed moving assets to vault: ${err}`);
|
|
34710
|
-
return [
|
|
34805
|
+
return [
|
|
34806
|
+
this.createTransactionResult(
|
|
34807
|
+
[],
|
|
34808
|
+
false,
|
|
34809
|
+
{
|
|
34810
|
+
from: Protocols.EXTENDED.name,
|
|
34811
|
+
to: Protocols.VAULT.name,
|
|
34812
|
+
amount: extendedAmount.abs()
|
|
34813
|
+
},
|
|
34814
|
+
"NONE",
|
|
34815
|
+
"INVESTMENT" /* INVESTMENT */
|
|
34816
|
+
)
|
|
34817
|
+
];
|
|
34711
34818
|
}
|
|
34712
34819
|
}
|
|
34713
34820
|
if (vesuAmount.isNegative() && vesuAmount.abs().greaterThan(vesuAdapter.minimumVesuMovementAmount)) {
|
|
34714
34821
|
try {
|
|
34715
|
-
const {
|
|
34822
|
+
const {
|
|
34823
|
+
calls: vesuCalls,
|
|
34824
|
+
status: vesuStatus,
|
|
34825
|
+
transactionMetadata: vesuTransactionMetadata
|
|
34826
|
+
} = await this.moveAssets(
|
|
34716
34827
|
{
|
|
34717
34828
|
to: Protocols.EXTENDED.name,
|
|
34718
34829
|
from: Protocols.VESU.name,
|
|
@@ -34723,7 +34834,19 @@ var VesuExtendedMultiplierStrategy = class _VesuExtendedMultiplierStrategy exten
|
|
|
34723
34834
|
vesuAdapter
|
|
34724
34835
|
);
|
|
34725
34836
|
if (!vesuStatus) {
|
|
34726
|
-
return [
|
|
34837
|
+
return [
|
|
34838
|
+
this.createTransactionResult(
|
|
34839
|
+
[],
|
|
34840
|
+
false,
|
|
34841
|
+
{
|
|
34842
|
+
from: Protocols.VESU.name,
|
|
34843
|
+
to: Protocols.EXTENDED.name,
|
|
34844
|
+
amount: vesuAmount.abs()
|
|
34845
|
+
},
|
|
34846
|
+
"NONE",
|
|
34847
|
+
"INVESTMENT" /* INVESTMENT */
|
|
34848
|
+
)
|
|
34849
|
+
];
|
|
34727
34850
|
}
|
|
34728
34851
|
transactionResults.push({
|
|
34729
34852
|
status: vesuStatus,
|
|
@@ -34734,14 +34857,34 @@ var VesuExtendedMultiplierStrategy = class _VesuExtendedMultiplierStrategy exten
|
|
|
34734
34857
|
}
|
|
34735
34858
|
});
|
|
34736
34859
|
} catch (err) {
|
|
34737
|
-
logger.error(
|
|
34738
|
-
|
|
34860
|
+
logger.error(
|
|
34861
|
+
`Failed moving assets to extended via vault allocator: ${err}`
|
|
34862
|
+
);
|
|
34863
|
+
return [
|
|
34864
|
+
this.createTransactionResult(
|
|
34865
|
+
[],
|
|
34866
|
+
false,
|
|
34867
|
+
{
|
|
34868
|
+
from: Protocols.VESU.name,
|
|
34869
|
+
to: Protocols.EXTENDED.name,
|
|
34870
|
+
amount: vesuAmount.abs()
|
|
34871
|
+
},
|
|
34872
|
+
"NONE",
|
|
34873
|
+
"INVESTMENT" /* INVESTMENT */
|
|
34874
|
+
)
|
|
34875
|
+
];
|
|
34739
34876
|
}
|
|
34740
34877
|
}
|
|
34741
|
-
if (extendedAmountDifferenceAbs.greaterThan(
|
|
34878
|
+
if (extendedAmountDifferenceAbs.greaterThan(
|
|
34879
|
+
extendedAdapter.minimumExtendedMovementAmount
|
|
34880
|
+
)) {
|
|
34742
34881
|
if (extendedAmountDifference.greaterThan(0)) {
|
|
34743
34882
|
try {
|
|
34744
|
-
const {
|
|
34883
|
+
const {
|
|
34884
|
+
calls: extendedCalls,
|
|
34885
|
+
status: extendedStatus,
|
|
34886
|
+
transactionMetadata: extendedTransactionMetadata
|
|
34887
|
+
} = await this.moveAssets(
|
|
34745
34888
|
{
|
|
34746
34889
|
to: Protocols.EXTENDED.name,
|
|
34747
34890
|
from: Protocols.VAULT.name,
|
|
@@ -34758,16 +34901,46 @@ var VesuExtendedMultiplierStrategy = class _VesuExtendedMultiplierStrategy exten
|
|
|
34758
34901
|
transactionMetadata: extendedTransactionMetadata
|
|
34759
34902
|
});
|
|
34760
34903
|
} else {
|
|
34761
|
-
logger.error(
|
|
34762
|
-
|
|
34904
|
+
logger.error(
|
|
34905
|
+
`Failed to move assets to extended - operation returned false status`
|
|
34906
|
+
);
|
|
34907
|
+
return [
|
|
34908
|
+
this.createTransactionResult(
|
|
34909
|
+
[],
|
|
34910
|
+
false,
|
|
34911
|
+
{
|
|
34912
|
+
from: Protocols.VAULT.name,
|
|
34913
|
+
to: Protocols.EXTENDED.name,
|
|
34914
|
+
amount: extendedAmountDifference
|
|
34915
|
+
},
|
|
34916
|
+
"NONE",
|
|
34917
|
+
"INVESTMENT" /* INVESTMENT */
|
|
34918
|
+
)
|
|
34919
|
+
];
|
|
34763
34920
|
}
|
|
34764
34921
|
} catch (err) {
|
|
34765
34922
|
logger.error(`Failed moving assets to extended: ${err}`);
|
|
34766
|
-
return [
|
|
34923
|
+
return [
|
|
34924
|
+
this.createTransactionResult(
|
|
34925
|
+
[],
|
|
34926
|
+
false,
|
|
34927
|
+
{
|
|
34928
|
+
from: Protocols.VAULT.name,
|
|
34929
|
+
to: Protocols.EXTENDED.name,
|
|
34930
|
+
amount: extendedAmountDifference
|
|
34931
|
+
},
|
|
34932
|
+
"NONE",
|
|
34933
|
+
"INVESTMENT" /* INVESTMENT */
|
|
34934
|
+
)
|
|
34935
|
+
];
|
|
34767
34936
|
}
|
|
34768
34937
|
} else if (extendedAmountDifference.lessThan(0)) {
|
|
34769
34938
|
try {
|
|
34770
|
-
const {
|
|
34939
|
+
const {
|
|
34940
|
+
calls: extendedCalls,
|
|
34941
|
+
status: extendedStatus,
|
|
34942
|
+
transactionMetadata: extendedTransactionMetadata
|
|
34943
|
+
} = await this.moveAssets(
|
|
34771
34944
|
{
|
|
34772
34945
|
to: Protocols.VAULT.name,
|
|
34773
34946
|
from: Protocols.EXTENDED.name,
|
|
@@ -34787,23 +34960,55 @@ var VesuExtendedMultiplierStrategy = class _VesuExtendedMultiplierStrategy exten
|
|
|
34787
34960
|
}
|
|
34788
34961
|
});
|
|
34789
34962
|
} else {
|
|
34790
|
-
logger.error(
|
|
34791
|
-
|
|
34963
|
+
logger.error(
|
|
34964
|
+
`Failed to withdraw from extended - operation returned false status`
|
|
34965
|
+
);
|
|
34966
|
+
return [
|
|
34967
|
+
this.createTransactionResult(
|
|
34968
|
+
[],
|
|
34969
|
+
false,
|
|
34970
|
+
{
|
|
34971
|
+
from: Protocols.EXTENDED.name,
|
|
34972
|
+
to: Protocols.VAULT.name,
|
|
34973
|
+
amount: extendedAmountDifferenceAbs
|
|
34974
|
+
},
|
|
34975
|
+
"NONE",
|
|
34976
|
+
"INVESTMENT" /* INVESTMENT */
|
|
34977
|
+
)
|
|
34978
|
+
];
|
|
34792
34979
|
}
|
|
34793
34980
|
} catch (err) {
|
|
34794
34981
|
logger.error(`Failed moving assets from extended to vault: ${err}`);
|
|
34795
|
-
return [
|
|
34982
|
+
return [
|
|
34983
|
+
this.createTransactionResult(
|
|
34984
|
+
[],
|
|
34985
|
+
false,
|
|
34986
|
+
{
|
|
34987
|
+
from: Protocols.EXTENDED.name,
|
|
34988
|
+
to: Protocols.VAULT.name,
|
|
34989
|
+
amount: extendedAmountDifferenceAbs
|
|
34990
|
+
},
|
|
34991
|
+
"NONE",
|
|
34992
|
+
"INVESTMENT" /* INVESTMENT */
|
|
34993
|
+
)
|
|
34994
|
+
];
|
|
34796
34995
|
}
|
|
34797
34996
|
}
|
|
34798
34997
|
}
|
|
34799
|
-
if (vesuAmountDifferenceAbs.greaterThan(
|
|
34998
|
+
if (vesuAmountDifferenceAbs.greaterThan(
|
|
34999
|
+
vesuAdapter.minimumVesuMovementAmount
|
|
35000
|
+
)) {
|
|
34800
35001
|
if (vesuAmountDifference.lessThanOrEqualTo(0)) {
|
|
34801
35002
|
logger.warn(
|
|
34802
35003
|
`Vesu amount difference is negative or zero: ${vesuAmountDifference.toNumber()}. Skipping operation.`
|
|
34803
35004
|
);
|
|
34804
35005
|
} else {
|
|
34805
35006
|
try {
|
|
34806
|
-
const {
|
|
35007
|
+
const {
|
|
35008
|
+
calls: vesuCalls,
|
|
35009
|
+
status: vesuStatus,
|
|
35010
|
+
transactionMetadata: vesuTransactionMetadata
|
|
35011
|
+
} = await this.moveAssets(
|
|
34807
35012
|
{
|
|
34808
35013
|
to: Protocols.VAULT.name,
|
|
34809
35014
|
from: Protocols.EXTENDED.name,
|
|
@@ -34814,8 +35019,22 @@ var VesuExtendedMultiplierStrategy = class _VesuExtendedMultiplierStrategy exten
|
|
|
34814
35019
|
vesuAdapter
|
|
34815
35020
|
);
|
|
34816
35021
|
if (!vesuStatus) {
|
|
34817
|
-
logger.error(
|
|
34818
|
-
|
|
35022
|
+
logger.error(
|
|
35023
|
+
`Failed to move assets to vesu - operation returned false status`
|
|
35024
|
+
);
|
|
35025
|
+
return [
|
|
35026
|
+
this.createTransactionResult(
|
|
35027
|
+
[],
|
|
35028
|
+
false,
|
|
35029
|
+
{
|
|
35030
|
+
from: Protocols.EXTENDED.name,
|
|
35031
|
+
to: Protocols.VAULT.name,
|
|
35032
|
+
amount: vesuAmountDifference
|
|
35033
|
+
},
|
|
35034
|
+
"NONE",
|
|
35035
|
+
"INVESTMENT" /* INVESTMENT */
|
|
35036
|
+
)
|
|
35037
|
+
];
|
|
34819
35038
|
}
|
|
34820
35039
|
transactionResults.push({
|
|
34821
35040
|
status: vesuStatus,
|
|
@@ -34827,14 +35046,38 @@ var VesuExtendedMultiplierStrategy = class _VesuExtendedMultiplierStrategy exten
|
|
|
34827
35046
|
});
|
|
34828
35047
|
} catch (err) {
|
|
34829
35048
|
logger.error(`Failed moving assets to vault: ${err}`);
|
|
34830
|
-
return [
|
|
35049
|
+
return [
|
|
35050
|
+
this.createTransactionResult(
|
|
35051
|
+
[],
|
|
35052
|
+
false,
|
|
35053
|
+
{
|
|
35054
|
+
from: Protocols.EXTENDED.name,
|
|
35055
|
+
to: Protocols.VAULT.name,
|
|
35056
|
+
amount: vesuAmountDifference
|
|
35057
|
+
},
|
|
35058
|
+
"NONE",
|
|
35059
|
+
"INVESTMENT" /* INVESTMENT */
|
|
35060
|
+
)
|
|
35061
|
+
];
|
|
34831
35062
|
}
|
|
34832
35063
|
}
|
|
34833
35064
|
}
|
|
34834
35065
|
return transactionResults;
|
|
34835
35066
|
} catch (err) {
|
|
34836
35067
|
logger.error(`Failed moving assets to vesu: ${err}`);
|
|
34837
|
-
return [
|
|
35068
|
+
return [
|
|
35069
|
+
this.createTransactionResult(
|
|
35070
|
+
[],
|
|
35071
|
+
false,
|
|
35072
|
+
{
|
|
35073
|
+
from: Protocols.EXTENDED.name,
|
|
35074
|
+
to: Protocols.VAULT.name,
|
|
35075
|
+
amount: new Web3Number(0, USDC_TOKEN_DECIMALS)
|
|
35076
|
+
},
|
|
35077
|
+
"NONE",
|
|
35078
|
+
"INVESTMENT" /* INVESTMENT */
|
|
35079
|
+
)
|
|
35080
|
+
];
|
|
34838
35081
|
}
|
|
34839
35082
|
}
|
|
34840
35083
|
/**
|
|
@@ -34855,43 +35098,56 @@ var VesuExtendedMultiplierStrategy = class _VesuExtendedMultiplierStrategy exten
|
|
|
34855
35098
|
}
|
|
34856
35099
|
};
|
|
34857
35100
|
}
|
|
34858
|
-
return {
|
|
35101
|
+
return {
|
|
35102
|
+
calls: [],
|
|
35103
|
+
status: false,
|
|
35104
|
+
transactionMetadata: {
|
|
35105
|
+
protocolFrom: "",
|
|
35106
|
+
protocolTo: "",
|
|
35107
|
+
transactionType: "DEPOSIT",
|
|
35108
|
+
usdAmount: "0",
|
|
35109
|
+
status: "FAILED",
|
|
35110
|
+
cycleType
|
|
35111
|
+
}
|
|
35112
|
+
};
|
|
34859
35113
|
}
|
|
35114
|
+
/**
|
|
35115
|
+
* This method is used to move assets between protocols
|
|
35116
|
+
* @param params - The parameters for the move assets operation
|
|
35117
|
+
* @param extendedAdapter - The extended adapter
|
|
35118
|
+
* @param vesuAdapter - The vesu adapter
|
|
35119
|
+
* @returns The transaction result
|
|
35120
|
+
* If Extended amount is greater than amount of withdrawal from extended, then we need to open a long position
|
|
35121
|
+
* so that the amount of withdrawal from extended is fullfilled
|
|
35122
|
+
*/
|
|
34860
35123
|
async moveAssets(params, extendedAdapter, vesuAdapter) {
|
|
34861
35124
|
try {
|
|
34862
35125
|
if (params.amount.lessThanOrEqualTo(0)) {
|
|
34863
35126
|
logger.error(
|
|
34864
35127
|
`Invalid amount for moveAssets: ${params.amount.toNumber()}. Amount must be positive.`
|
|
34865
35128
|
);
|
|
34866
|
-
return this.createTransactionResult(
|
|
34867
|
-
|
|
34868
|
-
|
|
34869
|
-
|
|
34870
|
-
|
|
34871
|
-
|
|
34872
|
-
|
|
34873
|
-
);
|
|
34874
|
-
return this.createTransactionResult([], false, params, "NONE", params.cycleType);
|
|
34875
|
-
}
|
|
34876
|
-
}
|
|
34877
|
-
if (params.from === Protocols.VESU.name || params.to === Protocols.VESU.name) {
|
|
34878
|
-
if (amountAbs.lessThanOrEqualTo(vesuAdapter.minimumVesuMovementAmount)) {
|
|
34879
|
-
logger.warn(
|
|
34880
|
-
`Amount ${amountAbs.toNumber()} is below minimum Vesu movement amount ${vesuAdapter.minimumVesuMovementAmount}. Skipping operation.`
|
|
34881
|
-
);
|
|
34882
|
-
return this.createTransactionResult([], false, params, "NONE", params.cycleType);
|
|
34883
|
-
}
|
|
35129
|
+
return this.createTransactionResult(
|
|
35130
|
+
[],
|
|
35131
|
+
false,
|
|
35132
|
+
params,
|
|
35133
|
+
"NONE",
|
|
35134
|
+
params.cycleType
|
|
35135
|
+
);
|
|
34884
35136
|
}
|
|
34885
35137
|
const avnuAdapter = await this.getAvnuAdapter();
|
|
34886
35138
|
if (!avnuAdapter) {
|
|
34887
35139
|
logger.error(`avnu adapter not found: ${avnuAdapter}`);
|
|
34888
|
-
return this.createTransactionResult(
|
|
35140
|
+
return this.createTransactionResult(
|
|
35141
|
+
[],
|
|
35142
|
+
false,
|
|
35143
|
+
params,
|
|
35144
|
+
"NONE",
|
|
35145
|
+
params.cycleType
|
|
35146
|
+
);
|
|
34889
35147
|
}
|
|
34890
35148
|
logger.info(`moveAssets params, ${JSON.stringify(params)}`);
|
|
34891
35149
|
const collateralToken = vesuAdapter.config.supportedPositions[0].asset;
|
|
34892
|
-
const {
|
|
34893
|
-
collateralPrice
|
|
34894
|
-
} = await this.getAssetPrices();
|
|
35150
|
+
const { collateralPrice } = await this.getAssetPrices();
|
|
34895
35151
|
if (params.to === Protocols.EXTENDED.name && params.from === Protocols.VAULT.name) {
|
|
34896
35152
|
const proofsInfo = extendedAdapter.getProofs(
|
|
34897
35153
|
true,
|
|
@@ -34904,23 +35160,53 @@ var VesuExtendedMultiplierStrategy = class _VesuExtendedMultiplierStrategy exten
|
|
|
34904
35160
|
await proofsInfo.callConstructor({ amount: params.amount })
|
|
34905
35161
|
);
|
|
34906
35162
|
calls.push(call);
|
|
34907
|
-
return this.createTransactionResult(
|
|
35163
|
+
return this.createTransactionResult(
|
|
35164
|
+
calls,
|
|
35165
|
+
true,
|
|
35166
|
+
params,
|
|
35167
|
+
"DEPOSIT",
|
|
35168
|
+
params.cycleType
|
|
35169
|
+
);
|
|
34908
35170
|
} else if (params.to === Protocols.VAULT.name && params.from === Protocols.EXTENDED.name) {
|
|
34909
35171
|
const extendedLeverage = calculateExtendedLevergae();
|
|
34910
35172
|
const extendedHoldings = await extendedAdapter.getExtendedDepositAmount();
|
|
34911
35173
|
if (!extendedHoldings) {
|
|
34912
35174
|
logger.error(`error getting extended holdings: ${extendedHoldings}`);
|
|
34913
|
-
return this.createTransactionResult(
|
|
35175
|
+
return this.createTransactionResult(
|
|
35176
|
+
[],
|
|
35177
|
+
false,
|
|
35178
|
+
params,
|
|
35179
|
+
"NONE",
|
|
35180
|
+
params.cycleType
|
|
35181
|
+
);
|
|
34914
35182
|
}
|
|
34915
35183
|
const extendedHoldingAmount = new Web3Number(
|
|
34916
35184
|
extendedHoldings.availableForWithdrawal,
|
|
34917
35185
|
USDC_TOKEN_DECIMALS
|
|
34918
35186
|
);
|
|
34919
|
-
logger.info(
|
|
35187
|
+
logger.info(
|
|
35188
|
+
`${_VesuExtendedMultiplierStrategy.name}::moveAssets extendedHoldingAmount: ${extendedHoldingAmount.toNumber()}`
|
|
35189
|
+
);
|
|
34920
35190
|
if (params.amount.abs().greaterThan(extendedHoldingAmount)) {
|
|
34921
|
-
const leftAmountAfterWithdrawalAmountInAccount =
|
|
34922
|
-
|
|
34923
|
-
|
|
35191
|
+
const leftAmountAfterWithdrawalAmountInAccount = new Web3Number(
|
|
35192
|
+
Math.ceil(
|
|
35193
|
+
params.amount.abs().minus(extendedHoldingAmount).toNumber()
|
|
35194
|
+
),
|
|
35195
|
+
USDC_TOKEN_DECIMALS
|
|
35196
|
+
);
|
|
35197
|
+
logger.info(
|
|
35198
|
+
`${_VesuExtendedMultiplierStrategy.name}::moveAssets leftAmountAfterWithdrawalAmountInAccount: ${leftAmountAfterWithdrawalAmountInAccount.toNumber()}`
|
|
35199
|
+
);
|
|
35200
|
+
let priceOfBTC;
|
|
35201
|
+
const { ask, bid, status } = await extendedAdapter.fetchOrderBookBTCUSDC();
|
|
35202
|
+
const price = ask.plus(bid).dividedBy(2);
|
|
35203
|
+
if (status) {
|
|
35204
|
+
priceOfBTC = price;
|
|
35205
|
+
} else {
|
|
35206
|
+
logger.error(`error fetching order book btc usdc: ${status}`);
|
|
35207
|
+
priceOfBTC = collateralPrice.price;
|
|
35208
|
+
}
|
|
35209
|
+
const btcAmount = leftAmountAfterWithdrawalAmountInAccount.dividedBy(priceOfBTC);
|
|
34924
35210
|
const openLongPosition = btcAmount.multipliedBy(3).greaterThan(MINIMUM_EXTENDED_POSITION_SIZE) ? await extendedAdapter.createOrder(
|
|
34925
35211
|
extendedLeverage.toString(),
|
|
34926
35212
|
btcAmount.toNumber(),
|
|
@@ -34935,38 +35221,95 @@ var VesuExtendedMultiplierStrategy = class _VesuExtendedMultiplierStrategy exten
|
|
|
34935
35221
|
logger.error(`error opening long position: ${openLongPosition}`);
|
|
34936
35222
|
}
|
|
34937
35223
|
const updatedHoldings = await extendedAdapter.getExtendedDepositAmount();
|
|
34938
|
-
if (!updatedHoldings || new Web3Number(
|
|
34939
|
-
|
|
34940
|
-
|
|
35224
|
+
if (!updatedHoldings || new Web3Number(
|
|
35225
|
+
updatedHoldings.availableForWithdrawal,
|
|
35226
|
+
USDC_TOKEN_DECIMALS
|
|
35227
|
+
).lessThan(params.amount.abs())) {
|
|
35228
|
+
logger.error(
|
|
35229
|
+
`Insufficient balance after opening position. Available: ${updatedHoldings?.availableForWithdrawal}, Needed: ${params.amount.abs()}`
|
|
35230
|
+
);
|
|
35231
|
+
return this.createTransactionResult(
|
|
35232
|
+
[],
|
|
35233
|
+
false,
|
|
35234
|
+
params,
|
|
35235
|
+
"NONE",
|
|
35236
|
+
params.cycleType
|
|
35237
|
+
);
|
|
34941
35238
|
}
|
|
34942
35239
|
}
|
|
34943
35240
|
const {
|
|
34944
35241
|
status: withdrawalFromExtendedStatus,
|
|
34945
35242
|
receivedTxnHash: withdrawalFromExtendedTxnHash
|
|
34946
35243
|
} = await extendedAdapter.withdrawFromExtended(params.amount);
|
|
34947
|
-
logger.info(
|
|
35244
|
+
logger.info(
|
|
35245
|
+
`withdrawalFromExtendedStatus: ${withdrawalFromExtendedStatus}, withdrawalFromExtendedTxnHash: ${withdrawalFromExtendedTxnHash}`
|
|
35246
|
+
);
|
|
34948
35247
|
if (withdrawalFromExtendedStatus && withdrawalFromExtendedTxnHash) {
|
|
34949
35248
|
const extendedHoldings2 = await extendedAdapter.getExtendedDepositAmount();
|
|
34950
|
-
logger.info(
|
|
35249
|
+
logger.info(
|
|
35250
|
+
`extendedHoldings after withdrawal ${extendedHoldings2?.availableForWithdrawal}`
|
|
35251
|
+
);
|
|
34951
35252
|
await new Promise((resolve) => setTimeout(resolve, 5e3));
|
|
34952
|
-
const { calls, status } = await this.moveAssetsToVaultAllocator(
|
|
35253
|
+
const { calls, status } = await this.moveAssetsToVaultAllocator(
|
|
35254
|
+
params.amount,
|
|
35255
|
+
extendedAdapter
|
|
35256
|
+
);
|
|
34953
35257
|
if (calls.length > 0 && status) {
|
|
34954
|
-
return this.createTransactionResult(
|
|
35258
|
+
return this.createTransactionResult(
|
|
35259
|
+
calls,
|
|
35260
|
+
true,
|
|
35261
|
+
params,
|
|
35262
|
+
"WITHDRAWAL",
|
|
35263
|
+
params.cycleType
|
|
35264
|
+
);
|
|
34955
35265
|
} else {
|
|
34956
|
-
return this.createTransactionResult(
|
|
35266
|
+
return this.createTransactionResult(
|
|
35267
|
+
[],
|
|
35268
|
+
true,
|
|
35269
|
+
params,
|
|
35270
|
+
"WITHDRAWAL",
|
|
35271
|
+
params.cycleType
|
|
35272
|
+
);
|
|
34957
35273
|
}
|
|
34958
35274
|
} else if (withdrawalFromExtendedStatus && !withdrawalFromExtendedTxnHash) {
|
|
34959
|
-
logger.error(
|
|
34960
|
-
|
|
35275
|
+
logger.error(
|
|
35276
|
+
"withdrawal from extended successful, but funds didn't get transferred to the wallet"
|
|
35277
|
+
);
|
|
35278
|
+
return this.createTransactionResult(
|
|
35279
|
+
[],
|
|
35280
|
+
true,
|
|
35281
|
+
params,
|
|
35282
|
+
"WITHDRAWAL",
|
|
35283
|
+
params.cycleType
|
|
35284
|
+
);
|
|
34961
35285
|
} else {
|
|
34962
35286
|
logger.error("withdrawal from extended failed");
|
|
34963
|
-
return this.createTransactionResult(
|
|
35287
|
+
return this.createTransactionResult(
|
|
35288
|
+
[],
|
|
35289
|
+
false,
|
|
35290
|
+
params,
|
|
35291
|
+
"NONE",
|
|
35292
|
+
params.cycleType
|
|
35293
|
+
);
|
|
34964
35294
|
}
|
|
34965
35295
|
} else if (params.to === Protocols.VAULT.name && params.from === Protocols.VESU.name) {
|
|
34966
|
-
const isPriceDifferenceBetweenAvnuAndExtended = await this.checkPriceDifferenceBetweenAvnuAndExtended(
|
|
35296
|
+
const isPriceDifferenceBetweenAvnuAndExtended = await this.checkPriceDifferenceBetweenAvnuAndExtended(
|
|
35297
|
+
extendedAdapter,
|
|
35298
|
+
vesuAdapter,
|
|
35299
|
+
avnuAdapter,
|
|
35300
|
+
"close" /* CLOSE */
|
|
35301
|
+
);
|
|
34967
35302
|
if (!isPriceDifferenceBetweenAvnuAndExtended) {
|
|
34968
|
-
logger.warn(
|
|
34969
|
-
|
|
35303
|
+
logger.warn(
|
|
35304
|
+
`price difference between avnu and extended doesn't fit the range for close position, ${avnuAdapter.config.maximumExtendedPriceDifferenceForSwapClosing}`
|
|
35305
|
+
);
|
|
35306
|
+
return this.createTransactionResult(
|
|
35307
|
+
[],
|
|
35308
|
+
false,
|
|
35309
|
+
params,
|
|
35310
|
+
"NONE",
|
|
35311
|
+
params.cycleType
|
|
35312
|
+
);
|
|
34970
35313
|
}
|
|
34971
35314
|
const vesuAmountInBTC = new Web3Number(
|
|
34972
35315
|
params.amount.dividedBy(collateralPrice.price).toFixed(WBTC_TOKEN_DECIMALS),
|
|
@@ -34980,19 +35323,41 @@ var VesuExtendedMultiplierStrategy = class _VesuExtendedMultiplierStrategy exten
|
|
|
34980
35323
|
await proofsInfo.callConstructor({ amount: vesuAmountInBTC })
|
|
34981
35324
|
);
|
|
34982
35325
|
calls.push(call);
|
|
34983
|
-
const swapProofsInfo = avnuAdapter.getProofs(
|
|
35326
|
+
const swapProofsInfo = avnuAdapter.getProofs(
|
|
35327
|
+
false,
|
|
35328
|
+
this.getMerkleTree()
|
|
35329
|
+
);
|
|
34984
35330
|
const swapProofGroups = swapProofsInfo.proofs;
|
|
34985
35331
|
const swapCall = this.getManageCall(
|
|
34986
35332
|
swapProofGroups,
|
|
34987
35333
|
await swapProofsInfo.callConstructor({ amount: vesuAmountInBTC })
|
|
34988
35334
|
);
|
|
34989
35335
|
calls.push(swapCall);
|
|
34990
|
-
return this.createTransactionResult(
|
|
35336
|
+
return this.createTransactionResult(
|
|
35337
|
+
calls,
|
|
35338
|
+
true,
|
|
35339
|
+
params,
|
|
35340
|
+
"WITHDRAWAL",
|
|
35341
|
+
params.cycleType
|
|
35342
|
+
);
|
|
34991
35343
|
} else if (params.to === Protocols.EXTENDED.name && params.from === Protocols.VESU.name) {
|
|
34992
|
-
const isPriceDifferenceBetweenAvnuAndExtended = await this.checkPriceDifferenceBetweenAvnuAndExtended(
|
|
35344
|
+
const isPriceDifferenceBetweenAvnuAndExtended = await this.checkPriceDifferenceBetweenAvnuAndExtended(
|
|
35345
|
+
extendedAdapter,
|
|
35346
|
+
vesuAdapter,
|
|
35347
|
+
avnuAdapter,
|
|
35348
|
+
"close" /* CLOSE */
|
|
35349
|
+
);
|
|
34993
35350
|
if (!isPriceDifferenceBetweenAvnuAndExtended) {
|
|
34994
|
-
logger.warn(
|
|
34995
|
-
|
|
35351
|
+
logger.warn(
|
|
35352
|
+
`price difference between avnu and extended doesn't fit the range for close position, ${avnuAdapter.config.maximumExtendedPriceDifferenceForSwapClosing}`
|
|
35353
|
+
);
|
|
35354
|
+
return this.createTransactionResult(
|
|
35355
|
+
[],
|
|
35356
|
+
false,
|
|
35357
|
+
params,
|
|
35358
|
+
"NONE",
|
|
35359
|
+
params.cycleType
|
|
35360
|
+
);
|
|
34996
35361
|
}
|
|
34997
35362
|
const vesuAmountInBTC = new Web3Number(
|
|
34998
35363
|
params.amount.dividedBy(collateralPrice.price).toNumber(),
|
|
@@ -35006,7 +35371,10 @@ var VesuExtendedMultiplierStrategy = class _VesuExtendedMultiplierStrategy exten
|
|
|
35006
35371
|
await proofsInfo.callConstructor({ amount: vesuAmountInBTC })
|
|
35007
35372
|
);
|
|
35008
35373
|
calls.push(call);
|
|
35009
|
-
const swapProofsInfo = avnuAdapter.getProofs(
|
|
35374
|
+
const swapProofsInfo = avnuAdapter.getProofs(
|
|
35375
|
+
false,
|
|
35376
|
+
this.getMerkleTree()
|
|
35377
|
+
);
|
|
35010
35378
|
const swapProofGroups = swapProofsInfo.proofs;
|
|
35011
35379
|
const swapCall = this.getManageCall(
|
|
35012
35380
|
swapProofGroups,
|
|
@@ -35023,21 +35391,61 @@ var VesuExtendedMultiplierStrategy = class _VesuExtendedMultiplierStrategy exten
|
|
|
35023
35391
|
await proofsInfoDeposit.callConstructor({ amount: params.amount })
|
|
35024
35392
|
);
|
|
35025
35393
|
calls.push(callDeposit);
|
|
35026
|
-
return this.createTransactionResult(
|
|
35394
|
+
return this.createTransactionResult(
|
|
35395
|
+
calls,
|
|
35396
|
+
true,
|
|
35397
|
+
params,
|
|
35398
|
+
"DEPOSIT",
|
|
35399
|
+
params.cycleType
|
|
35400
|
+
);
|
|
35027
35401
|
}
|
|
35028
|
-
logger.error(
|
|
35029
|
-
|
|
35402
|
+
logger.error(
|
|
35403
|
+
`Unsupported assets movement: ${params.from} to ${params.to}`
|
|
35404
|
+
);
|
|
35405
|
+
return this.createTransactionResult(
|
|
35406
|
+
[],
|
|
35407
|
+
false,
|
|
35408
|
+
params,
|
|
35409
|
+
"NONE",
|
|
35410
|
+
params.cycleType
|
|
35411
|
+
);
|
|
35030
35412
|
} catch (err) {
|
|
35031
35413
|
logger.error(`error moving assets: ${err}`);
|
|
35032
|
-
return this.createTransactionResult(
|
|
35414
|
+
return this.createTransactionResult(
|
|
35415
|
+
[],
|
|
35416
|
+
false,
|
|
35417
|
+
params,
|
|
35418
|
+
"NONE",
|
|
35419
|
+
params.cycleType
|
|
35420
|
+
);
|
|
35033
35421
|
}
|
|
35034
35422
|
}
|
|
35035
35423
|
async handleDeposit() {
|
|
35036
35424
|
try {
|
|
35037
|
-
return this.createTransactionResult(
|
|
35425
|
+
return this.createTransactionResult(
|
|
35426
|
+
[],
|
|
35427
|
+
false,
|
|
35428
|
+
{
|
|
35429
|
+
from: Protocols.VAULT.name,
|
|
35430
|
+
to: Protocols.VAULT.name,
|
|
35431
|
+
amount: new Web3Number(0, 0)
|
|
35432
|
+
},
|
|
35433
|
+
"NONE",
|
|
35434
|
+
"INVESTMENT" /* INVESTMENT */
|
|
35435
|
+
);
|
|
35038
35436
|
} catch (err) {
|
|
35039
35437
|
logger.error(`error handling deposit: ${err}`);
|
|
35040
|
-
return this.createTransactionResult(
|
|
35438
|
+
return this.createTransactionResult(
|
|
35439
|
+
[],
|
|
35440
|
+
false,
|
|
35441
|
+
{
|
|
35442
|
+
from: Protocols.VAULT.name,
|
|
35443
|
+
to: Protocols.VAULT.name,
|
|
35444
|
+
amount: new Web3Number(0, 0)
|
|
35445
|
+
},
|
|
35446
|
+
"NONE",
|
|
35447
|
+
"INVESTMENT" /* INVESTMENT */
|
|
35448
|
+
);
|
|
35041
35449
|
}
|
|
35042
35450
|
}
|
|
35043
35451
|
/**
|
|
@@ -35049,32 +35457,42 @@ var VesuExtendedMultiplierStrategy = class _VesuExtendedMultiplierStrategy exten
|
|
|
35049
35457
|
* @returns true if the price difference is within the acceptable range, false otherwise
|
|
35050
35458
|
*/
|
|
35051
35459
|
async checkPriceDifferenceBetweenAvnuAndExtended(extendedAdapter, vesuAdapter, avnuAdapter, positionType) {
|
|
35052
|
-
const {
|
|
35053
|
-
ask,
|
|
35054
|
-
bid
|
|
35055
|
-
} = await extendedAdapter.fetchOrderBookBTCUSDC();
|
|
35460
|
+
const { ask, bid } = await extendedAdapter.fetchOrderBookBTCUSDC();
|
|
35056
35461
|
const price = ask.plus(bid).dividedBy(2);
|
|
35057
35462
|
const btcToken = vesuAdapter.config.supportedPositions[0].asset;
|
|
35058
|
-
const btcPriceAvnu = await avnuAdapter.getPriceOfToken(
|
|
35463
|
+
const btcPriceAvnu = await avnuAdapter.getPriceOfToken(
|
|
35464
|
+
btcToken.address.toString()
|
|
35465
|
+
);
|
|
35059
35466
|
if (!btcPriceAvnu) {
|
|
35060
35467
|
logger.error(`error getting btc price avnu: ${btcPriceAvnu}`);
|
|
35061
35468
|
return false;
|
|
35062
35469
|
}
|
|
35063
35470
|
logger.info(`price: ${price}`);
|
|
35064
35471
|
logger.info(`btcPriceAvnu: ${btcPriceAvnu}`);
|
|
35065
|
-
const priceDifference = new Web3Number(
|
|
35472
|
+
const priceDifference = new Web3Number(
|
|
35473
|
+
price.minus(btcPriceAvnu).toFixed(2),
|
|
35474
|
+
0
|
|
35475
|
+
);
|
|
35066
35476
|
logger.info(`priceDifference: ${priceDifference}`);
|
|
35067
35477
|
if (priceDifference.isNegative()) {
|
|
35068
35478
|
return false;
|
|
35069
35479
|
}
|
|
35070
35480
|
if (positionType === "open" /* OPEN */) {
|
|
35071
|
-
logger.info(
|
|
35072
|
-
|
|
35481
|
+
logger.info(
|
|
35482
|
+
`price difference between avnu and extended for open position: ${priceDifference.toNumber()}, minimumExtendedPriceDifferenceForSwapOpen: ${avnuAdapter.config.minimumExtendedPriceDifferenceForSwapOpen}`
|
|
35483
|
+
);
|
|
35484
|
+
const result = priceDifference.greaterThanOrEqualTo(
|
|
35485
|
+
avnuAdapter.config.minimumExtendedPriceDifferenceForSwapOpen
|
|
35486
|
+
);
|
|
35073
35487
|
logger.info(`result: ${result}`);
|
|
35074
35488
|
return result;
|
|
35075
35489
|
} else {
|
|
35076
|
-
logger.info(
|
|
35077
|
-
|
|
35490
|
+
logger.info(
|
|
35491
|
+
`price difference between avnu and extended for close position: ${priceDifference.toNumber()}, maximumExtendedPriceDifferenceForSwapClosing: ${avnuAdapter.config.maximumExtendedPriceDifferenceForSwapClosing}`
|
|
35492
|
+
);
|
|
35493
|
+
const result = priceDifference.lessThanOrEqualTo(
|
|
35494
|
+
avnuAdapter.config.maximumExtendedPriceDifferenceForSwapClosing
|
|
35495
|
+
);
|
|
35078
35496
|
logger.info(`result: ${result}`);
|
|
35079
35497
|
return result;
|
|
35080
35498
|
}
|
|
@@ -35096,7 +35514,19 @@ var VesuExtendedMultiplierStrategy = class _VesuExtendedMultiplierStrategy exten
|
|
|
35096
35514
|
amount: usdcBalanceVaultAllocator.amount
|
|
35097
35515
|
});
|
|
35098
35516
|
calls.push(withdrawCall2);
|
|
35099
|
-
return [
|
|
35517
|
+
return [
|
|
35518
|
+
this.createTransactionResult(
|
|
35519
|
+
calls,
|
|
35520
|
+
true,
|
|
35521
|
+
{
|
|
35522
|
+
from: Protocols.VAULT.name,
|
|
35523
|
+
to: Protocols.NONE.name,
|
|
35524
|
+
amount
|
|
35525
|
+
},
|
|
35526
|
+
"WITHDRAWAL",
|
|
35527
|
+
"WITHDRAWAL" /* WITHDRAWAL */
|
|
35528
|
+
)
|
|
35529
|
+
];
|
|
35100
35530
|
}
|
|
35101
35531
|
const vesuAdapter = await this.getVesuAdapter();
|
|
35102
35532
|
const extendedAdapter = await this.getExtendedAdapter();
|
|
@@ -35105,18 +35535,40 @@ var VesuExtendedMultiplierStrategy = class _VesuExtendedMultiplierStrategy exten
|
|
|
35105
35535
|
logger.error(
|
|
35106
35536
|
`vesu or extended adapter not found: vesuAdapter=${vesuAdapter}, extendedAdapter=${extendedAdapter}`
|
|
35107
35537
|
);
|
|
35108
|
-
return [
|
|
35538
|
+
return [
|
|
35539
|
+
this.createTransactionResult(
|
|
35540
|
+
calls,
|
|
35541
|
+
status,
|
|
35542
|
+
{
|
|
35543
|
+
from: Protocols.VAULT.name,
|
|
35544
|
+
to: Protocols.NONE.name,
|
|
35545
|
+
amount
|
|
35546
|
+
},
|
|
35547
|
+
"NONE",
|
|
35548
|
+
"WITHDRAWAL" /* WITHDRAWAL */
|
|
35549
|
+
)
|
|
35550
|
+
];
|
|
35109
35551
|
}
|
|
35110
35552
|
let transactionResults = [];
|
|
35111
35553
|
const { collateralTokenAmount } = await vesuAdapter.vesuAdapter.getAssetPrices();
|
|
35112
|
-
const {
|
|
35113
|
-
collateralPrice
|
|
35114
|
-
} = await this.getAssetPrices();
|
|
35554
|
+
const { collateralPrice } = await this.getAssetPrices();
|
|
35115
35555
|
const extendedPositon = await extendedAdapter.getAllOpenPositions();
|
|
35116
35556
|
if (!extendedPositon) {
|
|
35117
35557
|
status = false;
|
|
35118
35558
|
logger.error("error getting extended position", extendedPositon);
|
|
35119
|
-
return [
|
|
35559
|
+
return [
|
|
35560
|
+
this.createTransactionResult(
|
|
35561
|
+
calls,
|
|
35562
|
+
status,
|
|
35563
|
+
{
|
|
35564
|
+
from: Protocols.VAULT.name,
|
|
35565
|
+
to: Protocols.NONE.name,
|
|
35566
|
+
amount
|
|
35567
|
+
},
|
|
35568
|
+
"NONE",
|
|
35569
|
+
"WITHDRAWAL" /* WITHDRAWAL */
|
|
35570
|
+
)
|
|
35571
|
+
];
|
|
35120
35572
|
}
|
|
35121
35573
|
const amountDistributionForWithdrawal = await calculateAmountDistributionForWithdrawal(
|
|
35122
35574
|
usdcBalanceDifference,
|
|
@@ -35129,11 +35581,27 @@ var VesuExtendedMultiplierStrategy = class _VesuExtendedMultiplierStrategy exten
|
|
|
35129
35581
|
logger.error(
|
|
35130
35582
|
`error calculating amount distribution for withdrawal: ${amountDistributionForWithdrawal}`
|
|
35131
35583
|
);
|
|
35132
|
-
return [
|
|
35584
|
+
return [
|
|
35585
|
+
this.createTransactionResult(
|
|
35586
|
+
calls,
|
|
35587
|
+
status,
|
|
35588
|
+
{
|
|
35589
|
+
from: Protocols.VAULT.name,
|
|
35590
|
+
to: Protocols.NONE.name,
|
|
35591
|
+
amount
|
|
35592
|
+
},
|
|
35593
|
+
"NONE",
|
|
35594
|
+
"WITHDRAWAL" /* WITHDRAWAL */
|
|
35595
|
+
)
|
|
35596
|
+
];
|
|
35133
35597
|
}
|
|
35134
35598
|
const { vesu_amount, extended_amount } = amountDistributionForWithdrawal;
|
|
35135
35599
|
if (status && vesu_amount.greaterThan(0)) {
|
|
35136
|
-
const {
|
|
35600
|
+
const {
|
|
35601
|
+
calls: vesuCalls,
|
|
35602
|
+
status: vesuStatus,
|
|
35603
|
+
transactionMetadata: vesuTransactionMetadata
|
|
35604
|
+
} = await this.moveAssets(
|
|
35137
35605
|
{
|
|
35138
35606
|
amount: vesu_amount,
|
|
35139
35607
|
from: Protocols.VESU.name,
|
|
@@ -35151,7 +35619,11 @@ var VesuExtendedMultiplierStrategy = class _VesuExtendedMultiplierStrategy exten
|
|
|
35151
35619
|
});
|
|
35152
35620
|
}
|
|
35153
35621
|
if (status && extended_amount.greaterThan(0)) {
|
|
35154
|
-
const {
|
|
35622
|
+
const {
|
|
35623
|
+
calls: extendedCalls,
|
|
35624
|
+
status: extendedStatus,
|
|
35625
|
+
transactionMetadata: extendedTransactionMetadata
|
|
35626
|
+
} = await this.moveAssets(
|
|
35155
35627
|
{
|
|
35156
35628
|
amount: extended_amount,
|
|
35157
35629
|
from: Protocols.EXTENDED.name,
|
|
@@ -35169,8 +35641,22 @@ var VesuExtendedMultiplierStrategy = class _VesuExtendedMultiplierStrategy exten
|
|
|
35169
35641
|
transactionMetadata: extendedTransactionMetadata
|
|
35170
35642
|
});
|
|
35171
35643
|
} else {
|
|
35172
|
-
logger.error(
|
|
35173
|
-
|
|
35644
|
+
logger.error(
|
|
35645
|
+
"error moving assets to vault: extendedStatus: ${extendedStatus}"
|
|
35646
|
+
);
|
|
35647
|
+
return [
|
|
35648
|
+
this.createTransactionResult(
|
|
35649
|
+
[],
|
|
35650
|
+
status,
|
|
35651
|
+
{
|
|
35652
|
+
from: Protocols.VAULT.name,
|
|
35653
|
+
to: Protocols.NONE.name,
|
|
35654
|
+
amount
|
|
35655
|
+
},
|
|
35656
|
+
"NONE",
|
|
35657
|
+
"WITHDRAWAL" /* WITHDRAWAL */
|
|
35658
|
+
)
|
|
35659
|
+
];
|
|
35174
35660
|
}
|
|
35175
35661
|
}
|
|
35176
35662
|
const withdrawCall = await this.getBringLiquidityCall({
|
|
@@ -35192,7 +35678,19 @@ var VesuExtendedMultiplierStrategy = class _VesuExtendedMultiplierStrategy exten
|
|
|
35192
35678
|
return transactionResults;
|
|
35193
35679
|
} catch (err) {
|
|
35194
35680
|
logger.error(`error handling withdrawal: ${err}`);
|
|
35195
|
-
return [
|
|
35681
|
+
return [
|
|
35682
|
+
this.createTransactionResult(
|
|
35683
|
+
[],
|
|
35684
|
+
false,
|
|
35685
|
+
{
|
|
35686
|
+
from: Protocols.VAULT.name,
|
|
35687
|
+
to: Protocols.NONE.name,
|
|
35688
|
+
amount
|
|
35689
|
+
},
|
|
35690
|
+
"NONE",
|
|
35691
|
+
"WITHDRAWAL" /* WITHDRAWAL */
|
|
35692
|
+
)
|
|
35693
|
+
];
|
|
35196
35694
|
}
|
|
35197
35695
|
}
|
|
35198
35696
|
async getAUM() {
|
|
@@ -35244,8 +35742,12 @@ var VesuExtendedMultiplierStrategy = class _VesuExtendedMultiplierStrategy exten
|
|
|
35244
35742
|
const txnsToBeExecuted = txnData.filter((txn) => {
|
|
35245
35743
|
return txn.transactionMetadata.transactionType !== "NONE" && txn.transactionMetadata.protocolFrom !== "" && txn.transactionMetadata.protocolTo !== "";
|
|
35246
35744
|
});
|
|
35247
|
-
const callsToBeExecutedFinal = txnsToBeExecuted.flatMap(
|
|
35248
|
-
|
|
35745
|
+
const callsToBeExecutedFinal = txnsToBeExecuted.flatMap(
|
|
35746
|
+
(txn) => txn.calls
|
|
35747
|
+
);
|
|
35748
|
+
const txnMetadata = txnsToBeExecuted.map(
|
|
35749
|
+
(txn) => txn.transactionMetadata
|
|
35750
|
+
);
|
|
35249
35751
|
return { callsToBeExecutedFinal, txnMetadata };
|
|
35250
35752
|
} catch (err) {
|
|
35251
35753
|
logger.error(`error processing transaction data from SDK: ${err}`);
|
|
@@ -35275,23 +35777,42 @@ var VesuExtendedMultiplierStrategy = class _VesuExtendedMultiplierStrategy exten
|
|
|
35275
35777
|
if (!vesuAdapter || !extendedAdapter) {
|
|
35276
35778
|
return new Web3Number(0, 0);
|
|
35277
35779
|
}
|
|
35278
|
-
const extendedFundingRate = new Web3Number(
|
|
35780
|
+
const extendedFundingRate = new Web3Number(
|
|
35781
|
+
(await extendedAdapter.getNetAPY()).toFixed(4),
|
|
35782
|
+
0
|
|
35783
|
+
);
|
|
35279
35784
|
const extendedPositions = await extendedAdapter.getAllOpenPositions();
|
|
35280
35785
|
if (!extendedPositions || extendedPositions.length === 0) {
|
|
35281
35786
|
logger.info(`no extended positions found`);
|
|
35282
35787
|
return new Web3Number(0, 0);
|
|
35283
35788
|
}
|
|
35284
|
-
const extendePositionSizeUSD = new Web3Number(
|
|
35789
|
+
const extendePositionSizeUSD = new Web3Number(
|
|
35790
|
+
extendedPositions[0].value || 0,
|
|
35791
|
+
0
|
|
35792
|
+
);
|
|
35285
35793
|
const vesuPositions = await vesuAdapter.getPositions();
|
|
35286
35794
|
const vesuSupplyApy = vesuPositions[0].apy.apy;
|
|
35287
|
-
const vesuCollateralSizeUSD = new Web3Number(
|
|
35288
|
-
|
|
35795
|
+
const vesuCollateralSizeUSD = new Web3Number(
|
|
35796
|
+
vesuPositions[0].usdValue.toFixed(USDC_TOKEN_DECIMALS),
|
|
35797
|
+
USDC_TOKEN_DECIMALS
|
|
35798
|
+
);
|
|
35799
|
+
const vesuDebtSizeUSD = new Web3Number(
|
|
35800
|
+
vesuPositions[1].usdValue.toFixed(USDC_TOKEN_DECIMALS),
|
|
35801
|
+
USDC_TOKEN_DECIMALS
|
|
35802
|
+
);
|
|
35289
35803
|
const num1 = extendePositionSizeUSD.multipliedBy(extendedFundingRate);
|
|
35290
35804
|
const num22 = vesuCollateralSizeUSD.multipliedBy(vesuSupplyApy);
|
|
35291
35805
|
const num32 = vesuDebtSizeUSD.abs();
|
|
35292
35806
|
const maxBorrowApy = num1.plus(num22).minus(0.1).dividedBy(num32);
|
|
35293
|
-
const vesuMaxBorrowableAmount = await vesuAdapter.vesuAdapter.getMaxBorrowableByInterestRate(
|
|
35294
|
-
|
|
35807
|
+
const vesuMaxBorrowableAmount = await vesuAdapter.vesuAdapter.getMaxBorrowableByInterestRate(
|
|
35808
|
+
this.config,
|
|
35809
|
+
vesuAdapter.config.debt,
|
|
35810
|
+
maxBorrowApy.toNumber()
|
|
35811
|
+
);
|
|
35812
|
+
return new Web3Number(
|
|
35813
|
+
vesuMaxBorrowableAmount.toFixed(USDC_TOKEN_DECIMALS),
|
|
35814
|
+
USDC_TOKEN_DECIMALS
|
|
35815
|
+
);
|
|
35295
35816
|
}
|
|
35296
35817
|
async getVesuHealthFactors() {
|
|
35297
35818
|
const vesuAdapter = await this.getVesuAdapter();
|
|
@@ -35300,18 +35821,33 @@ var VesuExtendedMultiplierStrategy = class _VesuExtendedMultiplierStrategy exten
|
|
|
35300
35821
|
return [0, 0];
|
|
35301
35822
|
}
|
|
35302
35823
|
const vesuPositions = await vesuAdapter.getPositions();
|
|
35303
|
-
const vesuCollateralSizeUSD = new Web3Number(
|
|
35304
|
-
|
|
35824
|
+
const vesuCollateralSizeUSD = new Web3Number(
|
|
35825
|
+
vesuPositions[0].usdValue.toFixed(USDC_TOKEN_DECIMALS),
|
|
35826
|
+
0
|
|
35827
|
+
);
|
|
35828
|
+
const vesuDebtSizeUSD = new Web3Number(
|
|
35829
|
+
vesuPositions[1].usdValue.toFixed(USDC_TOKEN_DECIMALS),
|
|
35830
|
+
0
|
|
35831
|
+
);
|
|
35305
35832
|
const actualLtv = vesuDebtSizeUSD.dividedBy(vesuCollateralSizeUSD).abs();
|
|
35306
35833
|
logger.info(`actualLtv: ${actualLtv.toNumber()}`);
|
|
35307
|
-
const maxLtv = new Web3Number(
|
|
35308
|
-
|
|
35834
|
+
const maxLtv = new Web3Number(
|
|
35835
|
+
await vesuAdapter.vesuAdapter.getLTVConfig(this.config),
|
|
35836
|
+
4
|
|
35837
|
+
);
|
|
35838
|
+
const healthFactor = new Web3Number(
|
|
35839
|
+
maxLtv.dividedBy(actualLtv).toFixed(4),
|
|
35840
|
+
4
|
|
35841
|
+
);
|
|
35309
35842
|
logger.info(`healthFactor: ${healthFactor.toNumber()}`);
|
|
35310
35843
|
const extendedBalance = await extendedAdapter.getExtendedDepositAmount();
|
|
35311
35844
|
if (!extendedBalance) {
|
|
35312
35845
|
return [0, 0];
|
|
35313
35846
|
}
|
|
35314
|
-
const extendedLeverage = new Web3Number(
|
|
35847
|
+
const extendedLeverage = new Web3Number(
|
|
35848
|
+
(Number(extendedBalance.marginRatio) * 100).toFixed(4),
|
|
35849
|
+
4
|
|
35850
|
+
);
|
|
35315
35851
|
logger.info(`extendedLeverage: ${extendedLeverage.toNumber()}`);
|
|
35316
35852
|
return [healthFactor.toNumber(), extendedLeverage.toNumber()];
|
|
35317
35853
|
}
|
|
@@ -35332,12 +35868,16 @@ var VesuExtendedMultiplierStrategy = class _VesuExtendedMultiplierStrategy exten
|
|
|
35332
35868
|
splits: []
|
|
35333
35869
|
};
|
|
35334
35870
|
}
|
|
35335
|
-
let vesuPositions = allPositions.filter(
|
|
35871
|
+
let vesuPositions = allPositions.filter(
|
|
35872
|
+
(item) => item.protocol === Protocols.VESU
|
|
35873
|
+
);
|
|
35336
35874
|
vesuPositions.map((item) => {
|
|
35337
35875
|
item.apy.apy = item.apy.apy * 0.1;
|
|
35338
35876
|
});
|
|
35339
35877
|
const extendedPositions = await extendedAdapter.getAllOpenPositions();
|
|
35340
|
-
const usdcToken = Global.getDefaultTokens().find(
|
|
35878
|
+
const usdcToken = Global.getDefaultTokens().find(
|
|
35879
|
+
(token) => token.symbol === "USDC"
|
|
35880
|
+
);
|
|
35341
35881
|
if (!extendedPositions || !usdcToken) {
|
|
35342
35882
|
return {
|
|
35343
35883
|
net: 0,
|
|
@@ -35350,7 +35890,10 @@ var VesuExtendedMultiplierStrategy = class _VesuExtendedMultiplierStrategy exten
|
|
|
35350
35890
|
const totalHoldingsUSDValue = allPositions.reduce((acc, curr) => acc + curr.usdValue, 0) + Number(extendedEquity);
|
|
35351
35891
|
console.log(totalHoldingsUSDValue);
|
|
35352
35892
|
const extendedPositionSizeMultipliedByApy = Number(extendedPosition.value) * extendedApy;
|
|
35353
|
-
let weightedAPYs = allPositions.reduce(
|
|
35893
|
+
let weightedAPYs = allPositions.reduce(
|
|
35894
|
+
(acc, curr) => acc + curr.apy.apy * curr.usdValue,
|
|
35895
|
+
0
|
|
35896
|
+
) + extendedPositionSizeMultipliedByApy;
|
|
35354
35897
|
console.log(weightedAPYs);
|
|
35355
35898
|
const netAPY = weightedAPYs / totalHoldingsUSDValue;
|
|
35356
35899
|
console.log(netAPY);
|
|
@@ -35364,13 +35907,22 @@ var VesuExtendedMultiplierStrategy = class _VesuExtendedMultiplierStrategy exten
|
|
|
35364
35907
|
});
|
|
35365
35908
|
return {
|
|
35366
35909
|
net: netAPY,
|
|
35367
|
-
splits: allPositions.map((p) => ({
|
|
35910
|
+
splits: allPositions.map((p) => ({
|
|
35911
|
+
apy: p.apy.apy,
|
|
35912
|
+
id: p.remarks ?? ""
|
|
35913
|
+
}))
|
|
35368
35914
|
};
|
|
35369
35915
|
}
|
|
35370
35916
|
async getWalletHoldings() {
|
|
35371
|
-
const usdceToken = Global.getDefaultTokens().find(
|
|
35372
|
-
|
|
35373
|
-
|
|
35917
|
+
const usdceToken = Global.getDefaultTokens().find(
|
|
35918
|
+
(token) => token.symbol === "USDCe"
|
|
35919
|
+
);
|
|
35920
|
+
const wbtcToken = Global.getDefaultTokens().find(
|
|
35921
|
+
(token) => token.symbol === "WBTC"
|
|
35922
|
+
);
|
|
35923
|
+
const usdcToken = Global.getDefaultTokens().find(
|
|
35924
|
+
(token) => token.symbol === "USDC"
|
|
35925
|
+
);
|
|
35374
35926
|
if (!usdceToken || !wbtcToken || !usdcToken) {
|
|
35375
35927
|
return [];
|
|
35376
35928
|
}
|
|
@@ -35444,9 +35996,7 @@ function getLooperSettings2(lstSymbol, underlyingSymbol, vaultSettings, pool1, e
|
|
|
35444
35996
|
});
|
|
35445
35997
|
const extendedAdapter = new ExtendedAdapter({
|
|
35446
35998
|
...baseAdapterConfig,
|
|
35447
|
-
supportedPositions: [
|
|
35448
|
-
{ asset: usdcToken, isDebt: true }
|
|
35449
|
-
],
|
|
35999
|
+
supportedPositions: [{ asset: usdcToken, isDebt: true }],
|
|
35450
36000
|
vaultIdExtended,
|
|
35451
36001
|
extendedContract: EXTENDED_CONTRACT,
|
|
35452
36002
|
extendedBackendWriteUrl,
|
|
@@ -35503,11 +36053,11 @@ function getLooperSettings2(lstSymbol, underlyingSymbol, vaultSettings, pool1, e
|
|
|
35503
36053
|
asset: wbtcToken.address
|
|
35504
36054
|
});
|
|
35505
36055
|
vaultSettings.leafAdapters.push(() => vesuMultiplyAdapter.getDepositLeaf());
|
|
36056
|
+
vaultSettings.leafAdapters.push(() => vesuMultiplyAdapter.getWithdrawLeaf());
|
|
36057
|
+
vaultSettings.leafAdapters.push(() => extendedAdapter.getDepositLeaf());
|
|
35506
36058
|
vaultSettings.leafAdapters.push(
|
|
35507
|
-
() =>
|
|
36059
|
+
() => extendedAdapter.getSwapFromLegacyLeaf()
|
|
35508
36060
|
);
|
|
35509
|
-
vaultSettings.leafAdapters.push(() => extendedAdapter.getDepositLeaf());
|
|
35510
|
-
vaultSettings.leafAdapters.push(() => extendedAdapter.getSwapFromLegacyLeaf());
|
|
35511
36061
|
vaultSettings.leafAdapters.push(() => avnuAdapter.getDepositLeaf());
|
|
35512
36062
|
vaultSettings.leafAdapters.push(() => avnuAdapter.getWithdrawLeaf());
|
|
35513
36063
|
vaultSettings.leafAdapters.push(
|
|
@@ -35552,29 +36102,70 @@ function VaultDescription2(lstSymbol, underlyingSymbol) {
|
|
|
35552
36102
|
" to create leverage. Depositors receive vault shares that represent a proportional claim on the underlying assets and accrued yield."
|
|
35553
36103
|
] }),
|
|
35554
36104
|
/* @__PURE__ */ jsxs4("p", { style: { fontSize: "14px", lineHeight: "1.5", marginBottom: "16px" }, children: [
|
|
35555
|
-
"This vault uses Vesu for lending and borrowing. The oracle used by this pool is a
|
|
35556
|
-
|
|
36105
|
+
"This vault uses Vesu for lending and borrowing. The oracle used by this pool is a",
|
|
36106
|
+
" ",
|
|
36107
|
+
highlightTextWithLinks("conversion rate oracle", [
|
|
36108
|
+
{
|
|
36109
|
+
highlight: "conversion rate oracle",
|
|
36110
|
+
link: "https://docs.pragma.build/starknet/development#conversion-rate"
|
|
36111
|
+
}
|
|
36112
|
+
]),
|
|
35557
36113
|
" ",
|
|
35558
36114
|
"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."
|
|
35559
36115
|
] }),
|
|
35560
|
-
/* @__PURE__ */ jsx5(
|
|
35561
|
-
|
|
35562
|
-
|
|
35563
|
-
|
|
35564
|
-
|
|
35565
|
-
|
|
35566
|
-
|
|
35567
|
-
|
|
35568
|
-
|
|
35569
|
-
|
|
36116
|
+
/* @__PURE__ */ jsx5(
|
|
36117
|
+
"div",
|
|
36118
|
+
{
|
|
36119
|
+
style: {
|
|
36120
|
+
backgroundColor: "#222",
|
|
36121
|
+
padding: "10px",
|
|
36122
|
+
borderRadius: "8px",
|
|
36123
|
+
marginBottom: "20px",
|
|
36124
|
+
border: "1px solid #444"
|
|
36125
|
+
},
|
|
36126
|
+
children: /* @__PURE__ */ jsxs4("p", { style: { fontSize: "13px", color: "#ccc" }, children: [
|
|
36127
|
+
/* @__PURE__ */ jsx5("strong", { children: "Withdrawals:" }),
|
|
36128
|
+
" Requests can take up to",
|
|
36129
|
+
" ",
|
|
36130
|
+
/* @__PURE__ */ jsx5("strong", { children: "1-2 hours" }),
|
|
36131
|
+
" to process as the vault unwinds and settles routing."
|
|
36132
|
+
] })
|
|
36133
|
+
}
|
|
36134
|
+
),
|
|
36135
|
+
/* @__PURE__ */ jsx5(
|
|
36136
|
+
"div",
|
|
36137
|
+
{
|
|
36138
|
+
style: {
|
|
36139
|
+
backgroundColor: "#222",
|
|
36140
|
+
padding: "10px",
|
|
36141
|
+
borderRadius: "8px",
|
|
36142
|
+
marginBottom: "20px",
|
|
36143
|
+
border: "1px solid #444"
|
|
36144
|
+
},
|
|
36145
|
+
children: /* @__PURE__ */ jsxs4("p", { style: { fontSize: "13px", color: "#ccc" }, children: [
|
|
36146
|
+
/* @__PURE__ */ jsx5("strong", { children: "Debt limits:" }),
|
|
36147
|
+
" 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."
|
|
36148
|
+
] })
|
|
36149
|
+
}
|
|
36150
|
+
)
|
|
35570
36151
|
] });
|
|
35571
36152
|
}
|
|
35572
36153
|
var re7UsdcPrimeDevansh = {
|
|
35573
|
-
vaultAddress: ContractAddr.from(
|
|
35574
|
-
|
|
35575
|
-
|
|
35576
|
-
|
|
35577
|
-
|
|
36154
|
+
vaultAddress: ContractAddr.from(
|
|
36155
|
+
"0x058905be22d6a81792df79425dc9641cf3e1b77f36748631b7d7e5d713a32b55"
|
|
36156
|
+
),
|
|
36157
|
+
manager: ContractAddr.from(
|
|
36158
|
+
"0x02648d703783feb2d967cf0520314cb5aa800d69a9426f3e3b317395af44de16"
|
|
36159
|
+
),
|
|
36160
|
+
vaultAllocator: ContractAddr.from(
|
|
36161
|
+
"0x07d533c838eab6a4d854dd3aea96a55993fccd35821921970d00bde946b63b6f"
|
|
36162
|
+
),
|
|
36163
|
+
redeemRequestNFT: ContractAddr.from(
|
|
36164
|
+
"0x01ef91f08fb99729c00f82fc6e0ece37917bcc43952596c19996259dc8adbbba"
|
|
36165
|
+
),
|
|
36166
|
+
aumOracle: ContractAddr.from(
|
|
36167
|
+
"0x030b6acfec162f5d6e72b8a4d2798aedce78fb39de78a8f549f7cd277ae8bc8d"
|
|
36168
|
+
),
|
|
35578
36169
|
leafAdapters: [],
|
|
35579
36170
|
adapters: [],
|
|
35580
36171
|
targetHealthFactor: 1.4,
|
|
@@ -35586,13 +36177,29 @@ var re7UsdcPrimeDevansh = {
|
|
|
35586
36177
|
"0.001",
|
|
35587
36178
|
Global.getDefaultTokens().find((token) => token.symbol === "WBTC").decimals
|
|
35588
36179
|
),
|
|
35589
|
-
borrowable_assets: [
|
|
36180
|
+
borrowable_assets: [
|
|
36181
|
+
Global.getDefaultTokens().find((token) => token.symbol === "WBTC")
|
|
36182
|
+
],
|
|
35590
36183
|
minimumWBTCDifferenceForAvnuSwap: MINIMUM_WBTC_DIFFERENCE_FOR_AVNU_SWAP,
|
|
35591
36184
|
walletAddress: WALLET_ADDRESS
|
|
35592
36185
|
};
|
|
35593
36186
|
var VesuExtendedTestStrategies = (extendedBackendReadUrl, extendedBackendWriteUrl, vaultIdExtended, minimumExtendedMovementAmount, minimumVesuMovementAmount, minimumExtendedRetriesDelayForOrderStatus, minimumExtendedPriceDifferenceForSwapOpen, maximumExtendedPriceDifferenceForSwapClosing) => {
|
|
35594
36187
|
return [
|
|
35595
|
-
getStrategySettingsVesuExtended(
|
|
36188
|
+
getStrategySettingsVesuExtended(
|
|
36189
|
+
"WBTC",
|
|
36190
|
+
"USDC",
|
|
36191
|
+
re7UsdcPrimeDevansh,
|
|
36192
|
+
false,
|
|
36193
|
+
false,
|
|
36194
|
+
extendedBackendReadUrl,
|
|
36195
|
+
extendedBackendWriteUrl,
|
|
36196
|
+
vaultIdExtended,
|
|
36197
|
+
minimumExtendedMovementAmount,
|
|
36198
|
+
minimumVesuMovementAmount,
|
|
36199
|
+
minimumExtendedRetriesDelayForOrderStatus,
|
|
36200
|
+
minimumExtendedPriceDifferenceForSwapOpen,
|
|
36201
|
+
maximumExtendedPriceDifferenceForSwapClosing
|
|
36202
|
+
)
|
|
35596
36203
|
];
|
|
35597
36204
|
};
|
|
35598
36205
|
function getStrategySettingsVesuExtended(lstSymbol, underlyingSymbol, addresses, isPreview = false, isLST, extendedBackendReadUrl, extendedBackendWriteUrl, vaultIdExtended, minimumExtendedMovementAmount, minimumVesuMovementAmount, minimumExtendedRetriesDelayForOrderStatus, minimumExtendedPriceDifferenceForSwapOpen, maximumExtendedPriceDifferenceForSwapClosing) {
|
|
@@ -35602,8 +36209,25 @@ function getStrategySettingsVesuExtended(lstSymbol, underlyingSymbol, addresses,
|
|
|
35602
36209
|
address: addresses.vaultAddress,
|
|
35603
36210
|
launchBlock: 0,
|
|
35604
36211
|
type: "Other",
|
|
35605
|
-
depositTokens: [
|
|
35606
|
-
|
|
36212
|
+
depositTokens: [
|
|
36213
|
+
Global.getDefaultTokens().find(
|
|
36214
|
+
(token) => token.symbol === underlyingSymbol
|
|
36215
|
+
)
|
|
36216
|
+
],
|
|
36217
|
+
additionalInfo: getLooperSettings2(
|
|
36218
|
+
lstSymbol,
|
|
36219
|
+
underlyingSymbol,
|
|
36220
|
+
addresses,
|
|
36221
|
+
VesuPools.Re7USDCPrime,
|
|
36222
|
+
extendedBackendReadUrl,
|
|
36223
|
+
extendedBackendWriteUrl,
|
|
36224
|
+
vaultIdExtended,
|
|
36225
|
+
minimumExtendedMovementAmount,
|
|
36226
|
+
minimumVesuMovementAmount,
|
|
36227
|
+
minimumExtendedRetriesDelayForOrderStatus,
|
|
36228
|
+
minimumExtendedPriceDifferenceForSwapOpen,
|
|
36229
|
+
maximumExtendedPriceDifferenceForSwapClosing
|
|
36230
|
+
),
|
|
35607
36231
|
risk: {
|
|
35608
36232
|
riskFactor: _riskFactor3,
|
|
35609
36233
|
netRisk: _riskFactor3.reduce((acc, curr) => acc + curr.value * curr.weight, 0) / _riskFactor3.reduce((acc, curr) => acc + curr.weight, 0),
|
|
@@ -39361,6 +39985,7 @@ export {
|
|
|
39361
39985
|
calculateBTCPriceDelta,
|
|
39362
39986
|
calculateDebtAmount,
|
|
39363
39987
|
calculateDebtReductionAmountForWithdrawal,
|
|
39988
|
+
calculateDeltaDebtAmount,
|
|
39364
39989
|
calculateExposureDelta,
|
|
39365
39990
|
calculateExtendedLevergae,
|
|
39366
39991
|
calculateVesUPositionSizeGivenExtended,
|