@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.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(`${_VesuExtendedMultiplierStrategy.name}::moveAssetsToVaultAllocator walletBalance: ${walletBalance}`);
34421
+ logger.info(
34422
+ `${_VesuExtendedMultiplierStrategy.name}::moveAssetsToVaultAllocator walletBalance: ${walletBalance}`
34423
+ );
34409
34424
  const amountToBeTransferred = amount.minimum(walletBalance);
34410
- logger.info(`${_VesuExtendedMultiplierStrategy.name}::moveAssetsToVaultAllocator amountToBeTransferred: ${amountToBeTransferred.toNumber()}`);
34425
+ logger.info(
34426
+ `${_VesuExtendedMultiplierStrategy.name}::moveAssetsToVaultAllocator amountToBeTransferred: ${amountToBeTransferred.toNumber()}`
34427
+ );
34411
34428
  if (amountToBeTransferred.lessThan(0)) {
34412
- logger.error(`${_VesuExtendedMultiplierStrategy.name}::moveAssetsToVaultAllocator amountToBeTransferred is less than 0: ${amountToBeTransferred.toNumber()}`);
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(`${_VesuExtendedMultiplierStrategy.name}::shouldInvest starting`);
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(`${_VesuExtendedMultiplierStrategy.name}::shouldInvest adapters fetched: vesuAdapter=${!!vesuAdapter}, extendedAdapter=${!!extendedAdapter}, extendedAdapter.client=${!!extendedAdapter?.client}`);
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(`${_VesuExtendedMultiplierStrategy.name}::shouldInvest calling getUnusedBalance`);
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(`${_VesuExtendedMultiplierStrategy.name}::shouldInvest balance: ${balance.usdValue}`);
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(usdcBalanceOnExtended.availableForWithdrawal);
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(balance.usdValue, USDC_TOKEN_DECIMALS).plus(usdcBalanceOnExtended?.availableForWithdrawal ?? 0).multipliedBy(1 - LIMIT_BALANCE);
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(`${_VesuExtendedMultiplierStrategy.name}::shouldInvest amountToInvest: ${amountToInvestNumber}`);
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
- amountToInvest.toNumber(),
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(`${_VesuExtendedMultiplierStrategy.name}::shouldInvest vesu_amount: ${vesu_amount.toNumber()}, extended_amount: ${extended_amount.toNumber()}`);
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 usdcAmountOnExtendedAvailableForWithdrawal = parseFloat(
34668
- extendedHoldings.availableForWithdrawal
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(extendedAmount.abs());
34744
+ totalExtendedWithdrawal = totalExtendedWithdrawal.plus(
34745
+ extendedAmount.abs()
34746
+ );
34675
34747
  }
34676
34748
  const extendedTargetAmount = extendedAmount.abs();
34677
- let projectedExtendedBalance = usdcAmountOnExtendedAvailableForWithdrawal;
34749
+ let projectedExtendedBalance = usdcAmountOnExtendedAvailableForTrade;
34678
34750
  if (extendedAmount.isNegative()) {
34679
34751
  projectedExtendedBalance = projectedExtendedBalance - extendedAmount.abs().toNumber();
34680
34752
  }
34681
- const extendedAmountDifference = extendedTargetAmount.minus(projectedExtendedBalance);
34753
+ const extendedAmountDifference = extendedTargetAmount.minus(
34754
+ projectedExtendedBalance
34755
+ );
34682
34756
  const extendedAmountDifferenceAbs = extendedAmountDifference.abs();
34683
34757
  if (extendedAmountDifference.lessThan(0)) {
34684
- totalExtendedWithdrawal = totalExtendedWithdrawal.plus(extendedAmountDifferenceAbs);
34758
+ totalExtendedWithdrawal = totalExtendedWithdrawal.plus(
34759
+ extendedAmountDifferenceAbs
34760
+ );
34685
34761
  } else if (extendedAmountDifference.greaterThan(0)) {
34686
- totalExtendedDeposit = totalExtendedDeposit.plus(extendedAmountDifference);
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(`${_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()}`);
34693
- let calls = [];
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 { calls: extendedCalls, status: extendedStatus, transactionMetadata: extendedTransactionMetadata } = await this.moveAssets(
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 [this.createTransactionResult([], false, { from: Protocols.EXTENDED.name, to: Protocols.VAULT.name, amount: extendedAmount.abs() }, "NONE", "INVESTMENT" /* INVESTMENT */)];
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 [this.createTransactionResult([], false, { from: Protocols.EXTENDED.name, to: Protocols.VAULT.name, amount: extendedAmount.abs() }, "NONE", "INVESTMENT" /* INVESTMENT */)];
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 { calls: vesuCalls, status: vesuStatus, transactionMetadata: vesuTransactionMetadata } = await this.moveAssets(
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 [this.createTransactionResult([], false, { from: Protocols.VESU.name, to: Protocols.EXTENDED.name, amount: vesuAmount.abs() }, "NONE", "INVESTMENT" /* INVESTMENT */)];
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(`Failed moving assets to extended via vault allocator: ${err}`);
34749
- return [this.createTransactionResult([], false, { from: Protocols.VESU.name, to: Protocols.EXTENDED.name, amount: vesuAmount.abs() }, "NONE", "INVESTMENT" /* INVESTMENT */)];
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(extendedAdapter.minimumExtendedMovementAmount)) {
34889
+ if (extendedAmountDifferenceAbs.greaterThan(
34890
+ extendedAdapter.minimumExtendedMovementAmount
34891
+ )) {
34753
34892
  if (extendedAmountDifference.greaterThan(0)) {
34754
34893
  try {
34755
- const { calls: extendedCalls, status: extendedStatus, transactionMetadata: extendedTransactionMetadata } = await this.moveAssets(
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(`Failed to move assets to extended - operation returned false status`);
34773
- return [this.createTransactionResult([], false, { from: Protocols.VAULT.name, to: Protocols.EXTENDED.name, amount: extendedAmountDifference }, "NONE", "INVESTMENT" /* INVESTMENT */)];
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 [this.createTransactionResult([], false, { from: Protocols.VAULT.name, to: Protocols.EXTENDED.name, amount: extendedAmountDifference }, "NONE", "INVESTMENT" /* INVESTMENT */)];
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 { calls: extendedCalls, status: extendedStatus, transactionMetadata: extendedTransactionMetadata } = await this.moveAssets(
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(`Failed to withdraw from extended - operation returned false status`);
34802
- return [this.createTransactionResult([], false, { from: Protocols.EXTENDED.name, to: Protocols.VAULT.name, amount: extendedAmountDifferenceAbs }, "NONE", "INVESTMENT" /* INVESTMENT */)];
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 [this.createTransactionResult([], false, { from: Protocols.EXTENDED.name, to: Protocols.VAULT.name, amount: extendedAmountDifferenceAbs }, "NONE", "INVESTMENT" /* INVESTMENT */)];
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(vesuAdapter.minimumVesuMovementAmount)) {
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 { calls: vesuCalls, status: vesuStatus, transactionMetadata: vesuTransactionMetadata } = await this.moveAssets(
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(`Failed to move assets to vesu - operation returned false status`);
34829
- return [this.createTransactionResult([], false, { from: Protocols.EXTENDED.name, to: Protocols.VAULT.name, amount: vesuAmountDifference }, "NONE", "INVESTMENT" /* INVESTMENT */)];
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 [this.createTransactionResult([], false, { from: Protocols.EXTENDED.name, to: Protocols.VAULT.name, amount: vesuAmountDifference }, "NONE", "INVESTMENT" /* INVESTMENT */)];
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 [this.createTransactionResult([], false, { from: Protocols.EXTENDED.name, to: Protocols.VAULT.name, amount: new Web3Number(0, USDC_TOKEN_DECIMALS) }, "NONE", "INVESTMENT" /* INVESTMENT */)];
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 { calls: [], status: false, transactionMetadata: { protocolFrom: "", protocolTo: "", transactionType: "DEPOSIT", usdAmount: "0", status: "FAILED", cycleType } };
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([], false, params, "NONE", params.cycleType);
34878
- }
34879
- const amountAbs = params.amount.abs();
34880
- if (params.from === Protocols.EXTENDED.name || params.to === Protocols.EXTENDED.name) {
34881
- if (amountAbs.lessThanOrEqualTo(extendedAdapter.minimumExtendedMovementAmount)) {
34882
- logger.warn(
34883
- `Amount ${amountAbs.toNumber()} is below minimum Extended movement amount ${extendedAdapter.minimumExtendedMovementAmount}. Skipping operation.`
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([], false, params, "NONE", params.cycleType);
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(calls, true, params, "DEPOSIT", params.cycleType);
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([], false, params, "NONE", params.cycleType);
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(`${_VesuExtendedMultiplierStrategy.name}::moveAssets extendedHoldingAmount: ${extendedHoldingAmount.toNumber()}`);
35198
+ logger.info(
35199
+ `${_VesuExtendedMultiplierStrategy.name}::moveAssets extendedHoldingAmount: ${extendedHoldingAmount.toNumber()}`
35200
+ );
34931
35201
  if (params.amount.abs().greaterThan(extendedHoldingAmount)) {
34932
- const leftAmountAfterWithdrawalAmountInAccount = params.amount.abs().minus(extendedHoldingAmount);
34933
- logger.info(`${_VesuExtendedMultiplierStrategy.name}::moveAssets leftAmountAfterWithdrawalAmountInAccount: ${leftAmountAfterWithdrawalAmountInAccount.toNumber()}`);
34934
- const btcAmount = leftAmountAfterWithdrawalAmountInAccount.dividedBy(collateralPrice.price);
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(updatedHoldings.availableForWithdrawal, USDC_TOKEN_DECIMALS).lessThan(params.amount.abs())) {
34950
- logger.error(`Insufficient balance after opening position. Available: ${updatedHoldings?.availableForWithdrawal}, Needed: ${params.amount.abs()}`);
34951
- return this.createTransactionResult([], false, params, "NONE", params.cycleType);
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(`withdrawalFromExtendedStatus: ${withdrawalFromExtendedStatus}, withdrawalFromExtendedTxnHash: ${withdrawalFromExtendedTxnHash}`);
35255
+ logger.info(
35256
+ `withdrawalFromExtendedStatus: ${withdrawalFromExtendedStatus}, withdrawalFromExtendedTxnHash: ${withdrawalFromExtendedTxnHash}`
35257
+ );
34959
35258
  if (withdrawalFromExtendedStatus && withdrawalFromExtendedTxnHash) {
34960
35259
  const extendedHoldings2 = await extendedAdapter.getExtendedDepositAmount();
34961
- logger.info(`extendedHoldings after withdrawal ${extendedHoldings2?.availableForWithdrawal}`);
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(params.amount, extendedAdapter);
35264
+ const { calls, status } = await this.moveAssetsToVaultAllocator(
35265
+ params.amount,
35266
+ extendedAdapter
35267
+ );
34964
35268
  if (calls.length > 0 && status) {
34965
- return this.createTransactionResult(calls, true, params, "WITHDRAWAL", params.cycleType);
35269
+ return this.createTransactionResult(
35270
+ calls,
35271
+ true,
35272
+ params,
35273
+ "WITHDRAWAL",
35274
+ params.cycleType
35275
+ );
34966
35276
  } else {
34967
- return this.createTransactionResult([], true, params, "WITHDRAWAL", params.cycleType);
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("withdrawal from extended successful, but funds didn't get transferred to the wallet");
34971
- return this.createTransactionResult([], true, params, "WITHDRAWAL", params.cycleType);
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([], false, params, "NONE", params.cycleType);
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(extendedAdapter, vesuAdapter, avnuAdapter, "close" /* CLOSE */);
35307
+ const isPriceDifferenceBetweenAvnuAndExtended = await this.checkPriceDifferenceBetweenAvnuAndExtended(
35308
+ extendedAdapter,
35309
+ vesuAdapter,
35310
+ avnuAdapter,
35311
+ "close" /* CLOSE */
35312
+ );
34978
35313
  if (!isPriceDifferenceBetweenAvnuAndExtended) {
34979
- logger.warn(`price difference between avnu and extended doesn't fit the range for close position, ${avnuAdapter.config.maximumExtendedPriceDifferenceForSwapClosing}`);
34980
- return this.createTransactionResult([], false, params, "NONE", params.cycleType);
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(false, this.getMerkleTree());
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(calls, true, params, "WITHDRAWAL", params.cycleType);
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(extendedAdapter, vesuAdapter, avnuAdapter, "close" /* CLOSE */);
35355
+ const isPriceDifferenceBetweenAvnuAndExtended = await this.checkPriceDifferenceBetweenAvnuAndExtended(
35356
+ extendedAdapter,
35357
+ vesuAdapter,
35358
+ avnuAdapter,
35359
+ "close" /* CLOSE */
35360
+ );
35004
35361
  if (!isPriceDifferenceBetweenAvnuAndExtended) {
35005
- logger.warn(`price difference between avnu and extended doesn't fit the range for close position, ${avnuAdapter.config.maximumExtendedPriceDifferenceForSwapClosing}`);
35006
- return this.createTransactionResult([], false, params, "NONE", params.cycleType);
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(false, this.getMerkleTree());
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(calls, true, params, "DEPOSIT", params.cycleType);
35405
+ return this.createTransactionResult(
35406
+ calls,
35407
+ true,
35408
+ params,
35409
+ "DEPOSIT",
35410
+ params.cycleType
35411
+ );
35038
35412
  }
35039
- logger.error(`Unsupported assets movement: ${params.from} to ${params.to}`);
35040
- return this.createTransactionResult([], false, params, "NONE", params.cycleType);
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([], false, params, "NONE", params.cycleType);
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([], false, { from: Protocols.VAULT.name, to: Protocols.VAULT.name, amount: new Web3Number(0, 0) }, "NONE", "INVESTMENT" /* INVESTMENT */);
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([], false, { from: Protocols.VAULT.name, to: Protocols.VAULT.name, amount: new Web3Number(0, 0) }, "NONE", "INVESTMENT" /* INVESTMENT */);
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(btcToken.address.toString());
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(price.minus(btcPriceAvnu).toFixed(2), 0);
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(`price difference between avnu and extended for open position: ${priceDifference.toNumber()}, minimumExtendedPriceDifferenceForSwapOpen: ${avnuAdapter.config.minimumExtendedPriceDifferenceForSwapOpen}`);
35083
- const result = priceDifference.greaterThanOrEqualTo(avnuAdapter.config.minimumExtendedPriceDifferenceForSwapOpen);
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(`price difference between avnu and extended for close position: ${priceDifference.toNumber()}, maximumExtendedPriceDifferenceForSwapClosing: ${avnuAdapter.config.maximumExtendedPriceDifferenceForSwapClosing}`);
35088
- const result = priceDifference.lessThanOrEqualTo(avnuAdapter.config.maximumExtendedPriceDifferenceForSwapClosing);
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 [this.createTransactionResult(calls, true, { from: Protocols.VAULT.name, to: Protocols.NONE.name, amount }, "WITHDRAWAL", "WITHDRAWAL" /* WITHDRAWAL */)];
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 [this.createTransactionResult(calls, status, { from: Protocols.VAULT.name, to: Protocols.NONE.name, amount }, "NONE", "WITHDRAWAL" /* WITHDRAWAL */)];
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 [this.createTransactionResult(calls, status, { from: Protocols.VAULT.name, to: Protocols.NONE.name, amount }, "NONE", "WITHDRAWAL" /* WITHDRAWAL */)];
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 [this.createTransactionResult(calls, status, { from: Protocols.VAULT.name, to: Protocols.NONE.name, amount }, "NONE", "WITHDRAWAL" /* WITHDRAWAL */)];
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 { calls: vesuCalls, status: vesuStatus, transactionMetadata: vesuTransactionMetadata } = await this.moveAssets(
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 { calls: extendedCalls, status: extendedStatus, transactionMetadata: extendedTransactionMetadata } = await this.moveAssets(
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("error moving assets to vault: extendedStatus: ${extendedStatus}");
35184
- return [this.createTransactionResult([], status, { from: Protocols.VAULT.name, to: Protocols.NONE.name, amount }, "NONE", "WITHDRAWAL" /* WITHDRAWAL */)];
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 [this.createTransactionResult([], false, { from: Protocols.VAULT.name, to: Protocols.NONE.name, amount }, "NONE", "WITHDRAWAL" /* WITHDRAWAL */)];
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((txn) => txn.calls);
35259
- const txnMetadata = txnsToBeExecuted.map((txn) => txn.transactionMetadata);
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((await extendedAdapter.getNetAPY()).toFixed(4), 0);
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(extendedPositions[0].value || 0, 0);
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(vesuPositions[0].usdValue.toFixed(USDC_TOKEN_DECIMALS), USDC_TOKEN_DECIMALS);
35299
- const vesuDebtSizeUSD = new Web3Number(vesuPositions[1].usdValue.toFixed(USDC_TOKEN_DECIMALS), USDC_TOKEN_DECIMALS);
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(this.config, vesuAdapter.config.debt, maxBorrowApy.toNumber());
35305
- return new Web3Number(vesuMaxBorrowableAmount.toFixed(USDC_TOKEN_DECIMALS), USDC_TOKEN_DECIMALS);
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(vesuPositions[0].usdValue.toFixed(USDC_TOKEN_DECIMALS), 0);
35315
- const vesuDebtSizeUSD = new Web3Number(vesuPositions[1].usdValue.toFixed(USDC_TOKEN_DECIMALS), 0);
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(await vesuAdapter.vesuAdapter.getLTVConfig(this.config), 4);
35319
- const healthFactor = new Web3Number(maxLtv.dividedBy(actualLtv).toFixed(4), 4);
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((Number(extendedBalance.marginRatio) * 100).toFixed(4), 4);
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((item) => item.protocol === Protocols.VESU);
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((token) => token.symbol === "USDC");
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((acc, curr) => acc + curr.apy.apy * curr.usdValue, 0) + extendedPositionSizeMultipliedByApy;
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) => ({ apy: p.apy.apy, id: p.remarks ?? "" }))
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((token) => token.symbol === "USDCe");
35383
- const wbtcToken = Global.getDefaultTokens().find((token) => token.symbol === "WBTC");
35384
- const usdcToken = Global.getDefaultTokens().find((token) => token.symbol === "USDC");
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
- () => vesuMultiplyAdapter.getWithdrawLeaf()
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
- highlightTextWithLinks("conversion rate oracle", [{ highlight: "conversion rate oracle", link: "https://docs.pragma.build/starknet/development#conversion-rate" }]),
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("div", { style: { backgroundColor: "#222", padding: "10px", borderRadius: "8px", marginBottom: "20px", border: "1px solid #444" }, children: /* @__PURE__ */ jsxs4("p", { style: { fontSize: "13px", color: "#ccc" }, children: [
35572
- /* @__PURE__ */ jsx5("strong", { children: "Withdrawals:" }),
35573
- " Requests can take up to ",
35574
- /* @__PURE__ */ jsx5("strong", { children: "1-2 hours" }),
35575
- " to process as the vault unwinds and settles routing."
35576
- ] }) }),
35577
- /* @__PURE__ */ jsx5("div", { style: { backgroundColor: "#222", padding: "10px", borderRadius: "8px", marginBottom: "20px", border: "1px solid #444" }, children: /* @__PURE__ */ jsxs4("p", { style: { fontSize: "13px", color: "#ccc" }, children: [
35578
- /* @__PURE__ */ jsx5("strong", { children: "Debt limits:" }),
35579
- " 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."
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("0x058905be22d6a81792df79425dc9641cf3e1b77f36748631b7d7e5d713a32b55"),
35585
- manager: ContractAddr.from("0x02648d703783feb2d967cf0520314cb5aa800d69a9426f3e3b317395af44de16"),
35586
- vaultAllocator: ContractAddr.from("0x07d533c838eab6a4d854dd3aea96a55993fccd35821921970d00bde946b63b6f"),
35587
- redeemRequestNFT: ContractAddr.from("0x01ef91f08fb99729c00f82fc6e0ece37917bcc43952596c19996259dc8adbbba"),
35588
- aumOracle: ContractAddr.from("0x030b6acfec162f5d6e72b8a4d2798aedce78fb39de78a8f549f7cd277ae8bc8d"),
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: [Global.getDefaultTokens().find((token) => token.symbol === "WBTC")],
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("WBTC", "USDC", re7UsdcPrimeDevansh, false, false, extendedBackendReadUrl, extendedBackendWriteUrl, vaultIdExtended, minimumExtendedMovementAmount, minimumVesuMovementAmount, minimumExtendedRetriesDelayForOrderStatus, minimumExtendedPriceDifferenceForSwapOpen, maximumExtendedPriceDifferenceForSwapClosing)
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: [Global.getDefaultTokens().find((token) => token.symbol === underlyingSymbol)],
35617
- additionalInfo: getLooperSettings2(lstSymbol, underlyingSymbol, addresses, VesuPools.Re7USDCPrime, extendedBackendReadUrl, extendedBackendWriteUrl, vaultIdExtended, minimumExtendedMovementAmount, minimumVesuMovementAmount, minimumExtendedRetriesDelayForOrderStatus, minimumExtendedPriceDifferenceForSwapOpen, maximumExtendedPriceDifferenceForSwapClosing),
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,