@strkfarm/sdk 2.0.0-dev.1 → 2.0.0-dev.3

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.
@@ -4269,20 +4269,13 @@ var EkuboQuoter = class _EkuboQuoter {
4269
4269
  async getDexPrice(baseToken, quoteToken, amount) {
4270
4270
  const lstTokenInfo = baseToken;
4271
4271
  const lstUnderlyingTokenInfo = quoteToken;
4272
- console.log("lstTokenInfo", lstTokenInfo);
4273
- console.log("lstUnderlyingTokenInfo", lstUnderlyingTokenInfo);
4274
- console.log("amount", amount);
4275
4272
  const quote = await this.getQuote(
4276
4273
  lstTokenInfo.address.address,
4277
4274
  lstUnderlyingTokenInfo.address.address,
4278
4275
  amount
4279
4276
  );
4280
- console.log("quote", quote);
4281
4277
  const outputAmount = Web3Number.fromWei(quote.total_calculated, lstUnderlyingTokenInfo.decimals);
4282
- console.log("outputAmount", outputAmount);
4283
- console.log("amount", amount);
4284
4278
  const price = outputAmount.toNumber() / amount.toNumber();
4285
- console.log("price", price);
4286
4279
  logger.verbose(`${_EkuboQuoter.name}:: LST Dex Price: ${price}`);
4287
4280
  return price;
4288
4281
  }
@@ -4301,16 +4294,12 @@ var EkuboQuoter = class _EkuboQuoter {
4301
4294
  // debt collateral
4302
4295
  async getSwapLimitAmount(fromToken, toToken, amount, max_slippage = 2e-3) {
4303
4296
  const isExactAmountIn = amount.greaterThanOrEqualTo(0);
4304
- console.log("isExactAmountIn", isExactAmountIn);
4305
4297
  logger.verbose(`${_EkuboQuoter.name}::getSwapLimitAmount isExactAmountIn: ${isExactAmountIn}, fromToken: ${fromToken.symbol}, toToken: ${toToken.symbol}, amount: ${amount}`);
4306
4298
  const isYieldToken = this.tokenMarketData.isAPYSupported(toToken);
4307
4299
  console.log("isYieldToken", isYieldToken);
4308
4300
  const baseToken = isExactAmountIn ? toToken : fromToken;
4309
4301
  const quoteToken = isExactAmountIn ? fromToken : toToken;
4310
- console.log("baseToken", baseToken);
4311
- console.log("quoteToken", quoteToken);
4312
4302
  const dexPrice = await this.getDexPrice(baseToken, quoteToken, amount);
4313
- console.log("dexPrice", dexPrice);
4314
4303
  const trueExchangeRate = isYieldToken ? await this.tokenMarketData.getTruePrice(baseToken) : dexPrice;
4315
4304
  console.log("trueExchangeRate", trueExchangeRate);
4316
4305
  if (isExactAmountIn) {
@@ -28346,6 +28335,7 @@ var vesu_multiple_abi_default = [
28346
28335
  var AVNU_API = "https://starknet.api.avnu.fi/swap/v2/quotes";
28347
28336
  var USDC_TOKEN_DECIMALS = 6;
28348
28337
  var USDC_TOKEN_ADDRESS = "0x053C91253BC9682c04929cA02ED00b3E423f6710D2ee7e0D5EBB06F3eCF368A8";
28338
+ var BUFFER_USDC_IN_WITHDRAWAL = 5;
28349
28339
  var WBTC_TOKEN_ADDRESS = "0x3fe2b97c1fd336e750087d68b9b867997fd64a2661ff3ca5a7c771641e8e7ac";
28350
28340
  var WBTC_TOKEN_DECIMALS = 8;
28351
28341
  var MAINTENANCE_MARGIN = 0.01;
@@ -28437,8 +28427,7 @@ var calculateAmountDistributionForWithdrawal = async (amountInUsdc, collateralPr
28437
28427
  logger.error("error getting extended positions");
28438
28428
  return null;
28439
28429
  }
28440
- const extendedBTCExposure = extendedPosition.length > 0 ? new Web3Number(extendedPosition[0].size, WBTC_TOKEN_DECIMALS) : new Web3Number(0, WBTC_TOKEN_DECIMALS);
28441
- const extendedExposureUSD = extendedBTCExposure.multipliedBy(collateralPrice);
28430
+ const extendedExposureUSD = extendedPosition.length > 0 ? new Web3Number(extendedPosition[0].value, USDC_TOKEN_DECIMALS) : new Web3Number(0, USDC_TOKEN_DECIMALS);
28442
28431
  const vesuExposureUSD = collateralUnits.multipliedBy(collateralPrice);
28443
28432
  if (vesuExposureUSD.lessThan(0)) {
28444
28433
  return {
@@ -28456,9 +28445,14 @@ var calculateAmountDistributionForWithdrawal = async (amountInUsdc, collateralPr
28456
28445
  vesu_leverage
28457
28446
  };
28458
28447
  }
28448
+ console.log("the vesu exposure usd is", vesuExposureUSD.toNumber());
28449
+ console.log("the extended exposure usd is", extendedExposureUSD.toNumber());
28450
+ console.log("the amount in usdc is", amountInUsdc.toNumber());
28451
+ console.log("the extended leverage is", extended_leverage);
28452
+ console.log("the vesu leverage is", vesu_leverage);
28459
28453
  const numerator1 = amountInUsdc.multipliedBy(extended_leverage);
28460
- const numerator2 = vesuExposureUSD.multipliedBy(vesu_leverage);
28461
- const numerator3 = extendedExposureUSD.multipliedBy(extended_leverage).multipliedBy(-1);
28454
+ const numerator2 = vesuExposureUSD;
28455
+ const numerator3 = extendedExposureUSD.multipliedBy(-1);
28462
28456
  const finalNumerator = numerator1.plus(numerator2).plus(numerator3);
28463
28457
  const denominator = extended_leverage + vesu_leverage;
28464
28458
  const vesuAmountInUSDC = finalNumerator.dividedBy(denominator);
@@ -28468,6 +28462,7 @@ var calculateAmountDistributionForWithdrawal = async (amountInUsdc, collateralPr
28468
28462
  "the extended amount in usdc is",
28469
28463
  extendedAmountInUSDC.toNumber()
28470
28464
  );
28465
+ await new Promise((resolve) => setTimeout(resolve, 1e4));
28471
28466
  return {
28472
28467
  vesu_amount: vesuAmountInUSDC,
28473
28468
  extended_amount: extendedAmountInUSDC,
@@ -28489,10 +28484,10 @@ var calculateExtendedLevergae = () => {
28489
28484
  const extended_leverage_max = 1 / (MAINTENANCE_MARGIN + MAX_PRICE_DROP_PERCENTAGE);
28490
28485
  return Math.floor(extended_leverage_max);
28491
28486
  };
28492
- var calculateDebtAmount = (collateralAmount, debtAmount, debtPrice, maxLtv = MAX_LTV_BTC_USDC, addedAmount, collateralPrice, isDeposit) => {
28487
+ var calculateDebtAmount = (collateralAmount, debtAmount, debtPrice, maxLtv = MAX_LIQUIDATION_RATIO, addedAmount, collateralPrice, isDeposit) => {
28493
28488
  try {
28494
- const marginAmount = addedAmount.multipliedBy(isDeposit ? 1 : -1);
28495
- const numerator1 = collateralAmount.plus(addedAmount).multipliedBy(collateralPrice).multipliedBy(maxLtv);
28489
+ const addedCollateral = addedAmount.multipliedBy(isDeposit ? 1 : -1);
28490
+ const numerator1 = collateralAmount.plus(addedCollateral).multipliedBy(collateralPrice).multipliedBy(maxLtv);
28496
28491
  const numerator2 = debtAmount.multipliedBy(debtPrice).multipliedBy(TARGET_HF);
28497
28492
  const denominator = TARGET_HF - maxLtv;
28498
28493
  const x_debt_usd = numerator1.minus(numerator2).dividedBy(denominator);
@@ -28527,7 +28522,6 @@ var calculateAmountDepositOnExtendedWhenIncurringLosses = async (client) => {
28527
28522
  const extendedHoldings = await client.getHoldings();
28528
28523
  const extended_leverage = calculateExtendedLevergae();
28529
28524
  const latestPosition = (await client.getPositions()).data.pop();
28530
- console.log("the latest position is", latestPosition, extendedHoldings);
28531
28525
  if (!extendedHoldings || !latestPosition) {
28532
28526
  logger.error(`error getting extended position: extendedHoldings=${extendedHoldings}, latestPosition=${latestPosition}`);
28533
28527
  return null;
@@ -28908,7 +28902,7 @@ var VesuMultiplyAdapter = class _VesuMultiplyAdapter extends BaseAdapter {
28908
28902
  this.config.debt.address.toBigInt(),
28909
28903
  this.config.vaultAllocator.toBigInt()
28910
28904
  ],
28911
- sanitizer: SIMPLE_SANITIZER_V2,
28905
+ sanitizer: isV2 ? SIMPLE_SANITIZER_V2 : SIMPLE_SANITIZER,
28912
28906
  // vmw = vesu multiply withdraw
28913
28907
  id: `vmw_${this.config.poolId.shortString()}_${collateral.symbol}_${debt.symbol}`
28914
28908
  },
@@ -29057,7 +29051,7 @@ var VesuMultiplyAdapter = class _VesuMultiplyAdapter extends BaseAdapter {
29057
29051
  },
29058
29052
  // Vesu multiply call
29059
29053
  {
29060
- sanitizer: SIMPLE_SANITIZER_V2,
29054
+ sanitizer: isV2 ? SIMPLE_SANITIZER_V2 : SIMPLE_SANITIZER,
29061
29055
  call: {
29062
29056
  contractAddress: vesuMultiply,
29063
29057
  selector: hash5.getSelectorFromName("modify_lever"),
@@ -29145,19 +29139,13 @@ var VesuMultiplyAdapter = class _VesuMultiplyAdapter extends BaseAdapter {
29145
29139
  leverSwap = ekuboQuoter.getVesuMultiplyQuote(swapQuote, debtToken, collateralToken);
29146
29140
  const MAX_SLIPPAGE = 2e-3;
29147
29141
  if (debtAmount.greaterThan(0)) {
29148
- console.log("debtAmountInCollateralUnits", debtAmountInCollateralUnits.toNumber());
29149
- leverSwapLimitAmount = await ekuboQuoter.getSwapLimitAmount(debtToken, collateralToken, debtAmount, MAX_SLIPPAGE);
29150
- const anotherleverSwapLimitAmount = debtAmount.multipliedBy(1 + MAX_SLIPPAGE);
29151
- console.log("anotherleverSwapLimitAmount", anotherleverSwapLimitAmount, leverSwapLimitAmount);
29142
+ leverSwapLimitAmount = debtAmount.multipliedBy(1 + MAX_SLIPPAGE);
29152
29143
  } else if (debtAmount.lessThan(0)) {
29153
- leverSwapLimitAmount = await ekuboQuoter.getSwapLimitAmount(collateralToken, debtToken, debtAmountInCollateralUnits.multipliedBy(-1), MAX_SLIPPAGE);
29154
- const anotherleverSwapLimitAmount = debtAmount.abs().multipliedBy(1 - MAX_SLIPPAGE);
29155
- console.log("anotherleverSwapLimitAmount", anotherleverSwapLimitAmount, leverSwapLimitAmount);
29144
+ leverSwapLimitAmount = debtAmount.abs().multipliedBy(1 - MAX_SLIPPAGE);
29156
29145
  } else {
29157
29146
  leverSwapLimitAmount = Web3Number.fromWei(0, this.config.debt.decimals);
29158
29147
  }
29159
29148
  await new Promise((resolve) => setTimeout(resolve, 1e4));
29160
- console.log("leverSwapLimitAmount", leverSwapLimitAmount);
29161
29149
  } else {
29162
29150
  throw new Error(`VesuMultiplyAdapter: Price impact too high (${swapQuote.price_impact}), skipping swap`);
29163
29151
  }
@@ -29227,26 +29215,23 @@ var VesuMultiplyAdapter = class _VesuMultiplyAdapter extends BaseAdapter {
29227
29215
  debtPrice.price,
29228
29216
  debtToken.decimals
29229
29217
  );
29230
- console.log("debtAmountToRepay", debtAmountToRepay);
29231
29218
  if (!debtAmountToRepay) {
29232
29219
  throw new Error("error calculating debt amount to repay");
29233
29220
  }
29234
29221
  const ekuboQuoter = new EkuboQuoter(this.config.networkConfig, this.config.pricer);
29235
29222
  const debtInDebtUnits = new Web3Number(debtAmountToRepay, debtToken.decimals).dividedBy(debtPrice.price).multipliedBy(10 ** debtToken.decimals);
29236
- const debtInCollateralUnits = new Web3Number(debtAmountToRepay, debtToken.decimals).dividedBy(collateralPrice.price).multipliedBy(10 ** collateralToken.decimals);
29237
29223
  const swapQuote = await ekuboQuoter.getQuote(
29238
29224
  debtToken.address.address,
29239
29225
  collateralToken.address.address,
29240
29226
  debtInDebtUnits
29241
29227
  );
29242
29228
  const MAX_SLIPPAGE = 2e-3;
29243
- if (swapQuote.price_impact < 0.025) {
29244
- leverSwap = ekuboQuoter.getVesuMultiplyQuote(swapQuote, debtToken, collateralToken);
29229
+ if (swapQuote.price_impact < 25e-4) {
29230
+ leverSwap = ekuboQuoter.getVesuMultiplyQuote(swapQuote, collateralToken, debtToken);
29245
29231
  } else {
29246
29232
  logger.error(`VesuMultiplyAdapter: Price impact too high (${swapQuote.price_impact}), skipping swap`);
29247
29233
  }
29248
- const anotherLeverSwapLimitAmount = await ekuboQuoter.getSwapLimitAmount(collateralToken, debtToken, debtInDebtUnits, MAX_SLIPPAGE);
29249
- leverSwapLimitAmount = await ekuboQuoter.getSwapLimitAmount(debtToken, collateralToken, debtInCollateralUnits, MAX_SLIPPAGE);
29234
+ leverSwapLimitAmount = new Web3Number(debtAmountToRepay, debtToken.decimals).abs().multipliedBy(1 + MAX_SLIPPAGE);
29250
29235
  const multiplyParams = await this.getLeverParams(false, params, leverSwap, leverSwapLimitAmount);
29251
29236
  const call = multiplyContract.populate("modify_lever", {
29252
29237
  modify_lever_params: this.formatMultiplyParams(false, multiplyParams)
@@ -29482,6 +29467,41 @@ var ExtendedAdapter = class _ExtendedAdapter extends BaseAdapter {
29482
29467
  }
29483
29468
  ];
29484
29469
  }
29470
+ getSwapFromLegacyLeaf() {
29471
+ const leafConfigs = this._getSwapFromLegacyLeaf();
29472
+ const leaves = leafConfigs.map((config) => {
29473
+ const { target, method, packedArguments, sanitizer, id } = config;
29474
+ const leaf = this.constructSimpleLeafData({
29475
+ id,
29476
+ target,
29477
+ method,
29478
+ packedArguments
29479
+ }, sanitizer);
29480
+ return leaf;
29481
+ });
29482
+ return { leaves, callConstructor: this.getSwapFromLegacyCall.bind(this) };
29483
+ }
29484
+ _getSwapFromLegacyLeaf() {
29485
+ const usdceToken = Global.getDefaultTokens().find((token) => token.symbol === "USDCe");
29486
+ return [
29487
+ {
29488
+ target: usdceToken.address,
29489
+ method: "approve",
29490
+ packedArguments: [
29491
+ AVNU_EXCHANGE_FOR_LEGACY_USDC.toBigInt()
29492
+ ],
29493
+ id: `extendedswaplegacyapprove_${usdceToken.symbol}`,
29494
+ sanitizer: AVNU_LEGACY_SANITIZER
29495
+ },
29496
+ {
29497
+ target: AVNU_EXCHANGE_FOR_LEGACY_USDC,
29498
+ method: "swap_to_new",
29499
+ packedArguments: [],
29500
+ id: `extended_swap_to_new_${usdceToken.symbol}`,
29501
+ sanitizer: AVNU_LEGACY_SANITIZER
29502
+ }
29503
+ ];
29504
+ }
29485
29505
  _getWithdrawLeaf() {
29486
29506
  return [];
29487
29507
  }
@@ -29562,6 +29582,70 @@ var ExtendedAdapter = class _ExtendedAdapter extends BaseAdapter {
29562
29582
  return [];
29563
29583
  }
29564
29584
  }
29585
+ getProofsForFromLegacySwap(tree) {
29586
+ let proofGroups = [];
29587
+ const ids = this.getSwapFromLegacyLeaf().leaves.map((l) => l.readableId);
29588
+ for (const [i, v] of tree.entries()) {
29589
+ if (ids.includes(v.readableId)) {
29590
+ proofGroups.push(tree.getProof(i));
29591
+ }
29592
+ }
29593
+ if (proofGroups.length != ids.length) {
29594
+ throw new Error(`Not all proofs found for IDs: ${ids.join(", ")}`);
29595
+ }
29596
+ return {
29597
+ proofs: proofGroups,
29598
+ callConstructor: this.getSwapFromLegacyCall.bind(this)
29599
+ };
29600
+ }
29601
+ async getSwapFromLegacyCall(params) {
29602
+ try {
29603
+ const usdcToken = this.config.supportedPositions[0].asset;
29604
+ const usdceToken = Global.getDefaultTokens().find((token) => token.symbol === "USDCe");
29605
+ const amount = uint25613.bnToUint256(params.amount.multipliedBy(10).toWei());
29606
+ const quotes = await this.config.avnuAdapter.getQuotesAvnu(
29607
+ usdceToken.address.toString(),
29608
+ usdcToken.address.toString(),
29609
+ params.amount.toNumber(),
29610
+ this.config.avnuAdapter.config.vaultAllocator.address.toString(),
29611
+ usdcToken.decimals,
29612
+ false
29613
+ );
29614
+ if (!quotes) {
29615
+ logger.error("error getting quotes from avnu");
29616
+ return [];
29617
+ }
29618
+ const getCalldata = await this.config.avnuAdapter.getSwapCallData(quotes);
29619
+ const swapCallData = getCalldata[0];
29620
+ return [
29621
+ {
29622
+ sanitizer: AVNU_LEGACY_SANITIZER,
29623
+ call: {
29624
+ contractAddress: usdceToken.address,
29625
+ selector: hash6.getSelectorFromName("approve"),
29626
+ calldata: [
29627
+ AVNU_EXCHANGE_FOR_LEGACY_USDC.toBigInt(),
29628
+ toBigInt(amount.low.toString()),
29629
+ // amount low
29630
+ toBigInt(amount.high.toString())
29631
+ // amount high
29632
+ ]
29633
+ }
29634
+ },
29635
+ {
29636
+ sanitizer: AVNU_LEGACY_SANITIZER,
29637
+ call: {
29638
+ contractAddress: AVNU_EXCHANGE_FOR_LEGACY_USDC,
29639
+ selector: hash6.getSelectorFromName("swap_to_new"),
29640
+ calldata: swapCallData
29641
+ }
29642
+ }
29643
+ ];
29644
+ } catch (error) {
29645
+ logger.error(`Error creating Deposit Call: ${error}`);
29646
+ return [];
29647
+ }
29648
+ }
29565
29649
  //Swap wbtc to usdc
29566
29650
  async getWithdrawCall(params) {
29567
29651
  try {
@@ -29579,10 +29663,10 @@ var ExtendedAdapter = class _ExtendedAdapter extends BaseAdapter {
29579
29663
  if (!this.client) {
29580
29664
  throw new Error("Client not initialized");
29581
29665
  }
29582
- const withdrawalRequest = this.client.withdrawUSDC(amount.toString());
29583
- if ((await withdrawalRequest).status === "OK") {
29584
- console.log("Withdrawal request successful");
29585
- return true;
29666
+ const withdrawalRequest = await this.client.withdrawUSDC(amount.toFixed(2));
29667
+ if (withdrawalRequest.status === "OK") {
29668
+ const withdrawalStatus = await this.getDepositOrWithdrawalStatus(withdrawalRequest.data, "WITHDRAWAL" /* WITHDRAWAL */);
29669
+ return withdrawalStatus;
29586
29670
  }
29587
29671
  return false;
29588
29672
  } catch (error) {
@@ -29763,7 +29847,7 @@ var ExtendedAdapter = class _ExtendedAdapter extends BaseAdapter {
29763
29847
  logger.error(`createShortOrder failed on attempt ${attempt}: ${err.message}`);
29764
29848
  if (attempt < maxAttempts) {
29765
29849
  const backoff = 1200 * attempt;
29766
- console.log(`Retrying after ${backoff}ms...`);
29850
+ logger.info(`Retrying after ${backoff}ms...`);
29767
29851
  await new Promise((resolve) => setTimeout(resolve, backoff));
29768
29852
  return this.createOrder(
29769
29853
  leverage,
@@ -29794,7 +29878,7 @@ var ExtendedAdapter = class _ExtendedAdapter extends BaseAdapter {
29794
29878
  }
29795
29879
  return null;
29796
29880
  } catch (err) {
29797
- console.log("Error opening short extended position", err);
29881
+ logger.error(`Error opening short extended position, ${err}`);
29798
29882
  return null;
29799
29883
  }
29800
29884
  }
@@ -29804,17 +29888,16 @@ var ExtendedAdapter = class _ExtendedAdapter extends BaseAdapter {
29804
29888
  operationsType: [operationsType],
29805
29889
  operationsStatus: ["COMPLETED" /* COMPLETED */]
29806
29890
  });
29807
- console.log("transferHistory", transferHistory);
29808
29891
  if (operationsType === "DEPOSIT" /* DEPOSIT */) {
29809
29892
  const myTransferStatus = transferHistory.data.find((operation) => operation.transactionHash === orderId);
29810
29893
  if (!myTransferStatus) {
29811
- return false;
29894
+ return true;
29812
29895
  }
29813
29896
  return true;
29814
29897
  } else {
29815
- const myTransferStatus = transferHistory.data.find((operation) => operation.id === orderId);
29898
+ const myTransferStatus = transferHistory.data.find((operation) => operation.id.toString() === orderId.toString());
29816
29899
  if (!myTransferStatus) {
29817
- return false;
29900
+ return true;
29818
29901
  }
29819
29902
  return true;
29820
29903
  }
@@ -33403,7 +33486,7 @@ var AvnuAdapter = class _AvnuAdapter extends BaseAdapter {
33403
33486
  packedArguments: [
33404
33487
  fromToken.address.toBigInt(),
33405
33488
  //wbtc
33406
- fromToken.address.toBigInt(),
33489
+ toToken.address.toBigInt(),
33407
33490
  //usdc
33408
33491
  vaultAllocator.toBigInt()
33409
33492
  ],
@@ -33417,13 +33500,11 @@ var AvnuAdapter = class _AvnuAdapter extends BaseAdapter {
33417
33500
  }
33418
33501
  async getDepositCall(params) {
33419
33502
  try {
33420
- console.log("params.amount", params.amount);
33421
33503
  const fromToken = this.config.supportedPositions[0].asset;
33422
33504
  const toToken = this.config.supportedPositions[1].asset;
33423
33505
  const vaultAllocator = ContractAddr.from(
33424
33506
  this.config.vaultAllocator.address
33425
33507
  );
33426
- console.log("vaultAllocator", vaultAllocator);
33427
33508
  const quote = await this.getQuotesAvnu(
33428
33509
  fromToken.address.toString(),
33429
33510
  toToken.address.toString(),
@@ -33479,7 +33560,6 @@ var AvnuAdapter = class _AvnuAdapter extends BaseAdapter {
33479
33560
  const vaultAllocator = ContractAddr.from(
33480
33561
  this.config.vaultAllocator.address
33481
33562
  );
33482
- console.log("params.amount", params.amount);
33483
33563
  const quote = await this.getQuotesAvnu(
33484
33564
  fromToken.address.toString(),
33485
33565
  toToken.address.toString(),
@@ -33498,8 +33578,6 @@ var AvnuAdapter = class _AvnuAdapter extends BaseAdapter {
33498
33578
  );
33499
33579
  const swapCallData = getCalldata[0];
33500
33580
  const amount = uint25614.bnToUint256(params.amount.toWei());
33501
- console.log("amount", amount);
33502
- console.log("swapCallData", swapCallData);
33503
33581
  return [
33504
33582
  {
33505
33583
  sanitizer: SIMPLE_SANITIZER,
@@ -33553,7 +33631,7 @@ var AvnuAdapter = class _AvnuAdapter extends BaseAdapter {
33553
33631
  }
33554
33632
  throw new Error("Failed to fetch quote after retries");
33555
33633
  }
33556
- async getQuotesAvnu(from_token_address, to_token_address, amount, takerAddress, toTokenDecimals, usdcToBtc, maxIterations = 5, tolerance = 1e4) {
33634
+ async getQuotesAvnu(from_token_address, to_token_address, amount, takerAddress, toTokenDecimals, usdcToBtc, maxIterations = 5, tolerance = 1e3) {
33557
33635
  try {
33558
33636
  const fromToken = this.config.supportedPositions[0].asset;
33559
33637
  const toToken = this.config.supportedPositions[1].asset;
@@ -33574,14 +33652,12 @@ var AvnuAdapter = class _AvnuAdapter extends BaseAdapter {
33574
33652
  return dataObject2;
33575
33653
  }
33576
33654
  const btcPrice = await this.getPriceOfToken(toToken.address.toString());
33577
- console.log("btcPrice", btcPrice);
33578
33655
  if (!btcPrice) {
33579
33656
  logger.error(`error getting btc price: ${btcPrice}`);
33580
33657
  return null;
33581
33658
  }
33582
33659
  const estimatedUsdcAmount = Math.floor(amount * btcPrice);
33583
33660
  const targetBtcBig = BigInt(returnFormattedAmount(amount, toTokenDecimals));
33584
- console.log("targetBtcBig", targetBtcBig);
33585
33661
  let low = BigInt(
33586
33662
  Math.floor(
33587
33663
  estimatedUsdcAmount * 10 ** fromToken.decimals * 0.9
@@ -33684,6 +33760,23 @@ var VesuExtendedMultiplierStrategy = class _VesuExtendedMultiplierStrategy exten
33684
33760
  debtPrice
33685
33761
  };
33686
33762
  }
33763
+ async getUnusedBalanceUSDCE() {
33764
+ const usdceToken = Global.getDefaultTokens().find(
33765
+ (token) => token.symbol === "USDCe"
33766
+ );
33767
+ const balance = await new ERC20(this.config).balanceOf(
33768
+ usdceToken.address,
33769
+ WALLET_ADDRESS,
33770
+ usdceToken.decimals
33771
+ );
33772
+ const price = await this.pricer.getPrice(usdceToken.symbol);
33773
+ const usdValue = Number(balance.toFixed(usdceToken.decimals)) * price.price;
33774
+ return {
33775
+ tokenInfo: usdceToken,
33776
+ amount: balance,
33777
+ usdValue
33778
+ };
33779
+ }
33687
33780
  async getUnusedBalanceWBTC() {
33688
33781
  const collateralToken = this.metadata.additionalInfo.borrowable_assets[0];
33689
33782
  const balance = await new ERC20(this.config).balanceOf(
@@ -33729,22 +33822,30 @@ var VesuExtendedMultiplierStrategy = class _VesuExtendedMultiplierStrategy exten
33729
33822
  }
33730
33823
  return extendedAdapter.adapter;
33731
33824
  }
33732
- async moveAssetsToVaultAllocator(amount) {
33825
+ async moveAssetsToVaultAllocator(amount, extendedAdapter) {
33733
33826
  try {
33734
- const usdcToken = Global.getDefaultTokens().find(
33735
- (token) => token.symbol === "USDC"
33827
+ const usdceToken = Global.getDefaultTokens().find(
33828
+ (token) => token.symbol === "USDCe"
33736
33829
  );
33737
33830
  const approveCall = new ERC20(this.config).approve(
33738
- usdcToken.address,
33831
+ usdceToken.address,
33739
33832
  this.metadata.additionalInfo.vaultAllocator,
33740
33833
  amount
33741
33834
  );
33742
33835
  const transferCall = new ERC20(this.config).transfer(
33743
- usdcToken.address,
33836
+ usdceToken.address,
33744
33837
  this.metadata.additionalInfo.vaultAllocator,
33745
33838
  amount
33746
33839
  );
33747
- return [approveCall, transferCall];
33840
+ const proofsInfo = extendedAdapter.getProofsForFromLegacySwap(
33841
+ this.getMerkleTree()
33842
+ );
33843
+ const proofGroups = proofsInfo.proofs;
33844
+ const call = this.getManageCall(
33845
+ proofGroups,
33846
+ await proofsInfo.callConstructor({ amount })
33847
+ );
33848
+ return [approveCall, transferCall, call];
33748
33849
  } catch (err) {
33749
33850
  logger.error(`error moving assets to vault allocator: ${err}`);
33750
33851
  return [];
@@ -33856,11 +33957,9 @@ var VesuExtendedMultiplierStrategy = class _VesuExtendedMultiplierStrategy exten
33856
33957
  );
33857
33958
  return calls;
33858
33959
  }
33859
- console.log("extendedAmount", extendedAmount);
33860
- console.log("vesuAmount", vesuAmount);
33861
33960
  if (extendedAmount.lessThan(0)) {
33862
33961
  try {
33863
- const extendedCalls = await this.moveAssets(
33962
+ const { calls: extendedCalls, status: extendedStatus } = await this.moveAssets(
33864
33963
  {
33865
33964
  to: Protocols.VAULT.name,
33866
33965
  from: Protocols.EXTENDED.name,
@@ -33869,14 +33968,18 @@ var VesuExtendedMultiplierStrategy = class _VesuExtendedMultiplierStrategy exten
33869
33968
  extendedAdapter,
33870
33969
  vesuAdapter
33871
33970
  );
33872
- calls.push(...extendedCalls);
33971
+ if (extendedStatus) {
33972
+ calls.push(...extendedCalls);
33973
+ } else {
33974
+ return [];
33975
+ }
33873
33976
  } catch (err) {
33874
33977
  logger.error(`Failed moving assets to vault: ${err}`);
33875
33978
  }
33876
33979
  }
33877
33980
  if (vesuAmount.lessThan(0)) {
33878
33981
  try {
33879
- const vesuCalls = await this.moveAssets(
33982
+ const { calls: vesuCalls, status: vesuStatus } = await this.moveAssets(
33880
33983
  {
33881
33984
  to: Protocols.EXTENDED.name,
33882
33985
  from: Protocols.VESU.name,
@@ -33886,6 +33989,9 @@ var VesuExtendedMultiplierStrategy = class _VesuExtendedMultiplierStrategy exten
33886
33989
  vesuAdapter
33887
33990
  );
33888
33991
  calls.push(...vesuCalls);
33992
+ if (!vesuStatus) {
33993
+ return [];
33994
+ }
33889
33995
  } catch (err) {
33890
33996
  logger.error(`Failed moving assets to vault: ${err}`);
33891
33997
  }
@@ -33897,15 +34003,15 @@ var VesuExtendedMultiplierStrategy = class _VesuExtendedMultiplierStrategy exten
33897
34003
  }
33898
34004
  const usdcAmountInWallet = (await this.getUnusedBalance()).amount;
33899
34005
  const usdcAmountOnExtended = parseFloat(
33900
- extendedHoldings.availableForWithdrawal
34006
+ extendedHoldings.availableForTrade
33901
34007
  );
33902
- if (extendedAmount.minus(usdcAmountOnExtended).greaterThan(0)) {
34008
+ if (extendedAmount.plus(BUFFER_USDC_IN_WITHDRAWAL).minus(usdcAmountOnExtended).greaterThan(0)) {
33903
34009
  try {
33904
- const extendedCalls = await this.moveAssets(
34010
+ const { calls: extendedCalls } = await this.moveAssets(
33905
34011
  {
33906
34012
  to: Protocols.EXTENDED.name,
33907
34013
  from: Protocols.VAULT.name,
33908
- amount: extendedAmount.minus(usdcAmountOnExtended)
34014
+ amount: extendedAmount.plus(BUFFER_USDC_IN_WITHDRAWAL).minus(usdcAmountOnExtended)
33909
34015
  },
33910
34016
  extendedAdapter,
33911
34017
  vesuAdapter
@@ -33917,15 +34023,18 @@ var VesuExtendedMultiplierStrategy = class _VesuExtendedMultiplierStrategy exten
33917
34023
  }
33918
34024
  if (vesuAmount.minus(usdcAmountInWallet).greaterThan(0)) {
33919
34025
  try {
33920
- const vesuCalls = await this.moveAssets(
34026
+ const { calls: vesuCalls, status: vesuStatus } = await this.moveAssets(
33921
34027
  {
33922
- to: Protocols.VESU.name,
34028
+ to: Protocols.VAULT.name,
33923
34029
  from: Protocols.EXTENDED.name,
33924
34030
  amount: vesuAmount.minus(usdcAmountInWallet)
33925
34031
  },
33926
34032
  extendedAdapter,
33927
34033
  vesuAdapter
33928
34034
  );
34035
+ if (!vesuStatus) {
34036
+ return [];
34037
+ }
33929
34038
  calls.push(...vesuCalls);
33930
34039
  } catch (err) {
33931
34040
  logger.error(`Failed moving assets to vault: ${err}`);
@@ -33942,9 +34051,12 @@ var VesuExtendedMultiplierStrategy = class _VesuExtendedMultiplierStrategy exten
33942
34051
  const avnuAdapter = await this.getAvnuAdapter();
33943
34052
  if (!avnuAdapter) {
33944
34053
  logger.error(`avnu adapter not found: ${avnuAdapter}`);
33945
- return [];
34054
+ return {
34055
+ calls: [],
34056
+ status: false
34057
+ };
33946
34058
  }
33947
- logger.info("moveAssets params", params);
34059
+ logger.info(`moveAssets params, ${JSON.stringify(params)}`);
33948
34060
  const collateralToken = vesuAdapter.config.supportedPositions[0].asset;
33949
34061
  const {
33950
34062
  collateralPrice
@@ -33961,18 +34073,67 @@ var VesuExtendedMultiplierStrategy = class _VesuExtendedMultiplierStrategy exten
33961
34073
  await proofsInfo.callConstructor({ amount: params.amount })
33962
34074
  );
33963
34075
  calls.push(call);
33964
- return calls;
34076
+ return {
34077
+ calls: [call],
34078
+ status: true
34079
+ };
33965
34080
  } else if (params.to === Protocols.VAULT.name && params.from === Protocols.EXTENDED.name) {
34081
+ const extendedLeverage = calculateExtendedLevergae();
34082
+ const extendedHoldings = await extendedAdapter.getExtendedDepositAmount();
34083
+ if (!extendedHoldings) {
34084
+ logger.error(`error getting extended holdings: ${extendedHoldings}`);
34085
+ return {
34086
+ calls: [],
34087
+ status: false
34088
+ };
34089
+ }
34090
+ const extendedHoldingAmount = new Web3Number(
34091
+ extendedHoldings.availableForWithdrawal,
34092
+ USDC_TOKEN_DECIMALS
34093
+ );
34094
+ logger.info(`${_VesuExtendedMultiplierStrategy.name}::moveAssets extendedHoldingAmount: ${extendedHoldingAmount.toNumber()}`);
34095
+ if (params.amount.abs().greaterThan(extendedHoldingAmount)) {
34096
+ const leftAmountAfterWithdrawalAmountInAccount = params.amount.abs().minus(extendedHoldingAmount);
34097
+ logger.info(`${_VesuExtendedMultiplierStrategy.name}::moveAssets leftAmountAfterWithdrawalAmountInAccount: ${leftAmountAfterWithdrawalAmountInAccount.toNumber()}`);
34098
+ const btcAmount = leftAmountAfterWithdrawalAmountInAccount.dividedBy(collateralPrice.price);
34099
+ const openLongPosition = btcAmount.multipliedBy(3).greaterThan(MINIMUM_EXTENDED_POSITION_SIZE) ? await extendedAdapter.createOrder(
34100
+ extendedLeverage.toString(),
34101
+ btcAmount.toNumber(),
34102
+ "BUY" /* BUY */
34103
+ ) : await extendedAdapter.createOrder(
34104
+ extendedLeverage.toString(),
34105
+ 35e-6,
34106
+ // just in case amount falls short then we need to create a withdrawal
34107
+ "BUY" /* BUY */
34108
+ );
34109
+ if (!openLongPosition) {
34110
+ logger.error(`error opening long position: ${openLongPosition}`);
34111
+ return {
34112
+ calls: [],
34113
+ status: false
34114
+ };
34115
+ }
34116
+ await new Promise((resolve) => setTimeout(resolve, 5e3));
34117
+ }
33966
34118
  const withdrawalFromExtended = await extendedAdapter.withdrawFromExtended(params.amount);
33967
34119
  if (withdrawalFromExtended) {
33968
- const calls = await this.moveAssetsToVaultAllocator(params.amount);
34120
+ const extendedHoldings2 = await extendedAdapter.getExtendedDepositAmount();
34121
+ logger.info(`extendedHoldings after withdrawal ${extendedHoldings2}`);
34122
+ await new Promise((resolve) => setTimeout(resolve, 1e4));
34123
+ const calls = await this.moveAssetsToVaultAllocator(params.amount, extendedAdapter);
33969
34124
  if (calls.length > 0) {
33970
- return calls;
34125
+ return {
34126
+ calls,
34127
+ status: true
34128
+ };
33971
34129
  }
33972
34130
  } else {
33973
34131
  logger.error("withdrawal from extended failed");
34132
+ return {
34133
+ calls: [],
34134
+ status: false
34135
+ };
33974
34136
  }
33975
- return [];
33976
34137
  } else if (params.to === Protocols.VAULT.name && params.from === Protocols.VESU.name) {
33977
34138
  const vesuAmountInBTC = new Web3Number(
33978
34139
  params.amount.dividedBy(collateralPrice.price).toNumber(),
@@ -33993,7 +34154,10 @@ var VesuExtendedMultiplierStrategy = class _VesuExtendedMultiplierStrategy exten
33993
34154
  await swapProofsInfo.callConstructor({ amount: vesuAmountInBTC })
33994
34155
  );
33995
34156
  calls.push(swapCall);
33996
- return calls;
34157
+ return {
34158
+ calls,
34159
+ status: true
34160
+ };
33997
34161
  } else if (params.to === Protocols.EXTENDED.name && params.from === Protocols.VESU.name) {
33998
34162
  const vesuAmountInBTC = new Web3Number(
33999
34163
  params.amount.dividedBy(collateralPrice.price).toNumber(),
@@ -34024,13 +34188,21 @@ var VesuExtendedMultiplierStrategy = class _VesuExtendedMultiplierStrategy exten
34024
34188
  await proofsInfoDeposit.callConstructor({ amount: params.amount })
34025
34189
  );
34026
34190
  calls.push(callDeposit);
34027
- return calls;
34191
+ return {
34192
+ calls,
34193
+ status: true
34194
+ };
34028
34195
  }
34029
- console.warn("moveAssets received unsupported route:", params);
34030
- return [];
34196
+ return {
34197
+ calls: [],
34198
+ status: false
34199
+ };
34031
34200
  } catch (err) {
34032
34201
  logger.error(`error moving assets: ${err}`);
34033
- return [];
34202
+ return {
34203
+ calls: [],
34204
+ status: false
34205
+ };
34034
34206
  }
34035
34207
  }
34036
34208
  async handleDeposit() {
@@ -34067,6 +34239,7 @@ var VesuExtendedMultiplierStrategy = class _VesuExtendedMultiplierStrategy exten
34067
34239
  };
34068
34240
  }
34069
34241
  const extendedPositionValue = position.length > 0 ? parseFloat(position[0].value) : 0;
34242
+ const BUFFER_AMOUNT_IN_AVAILABLE_FOR_TRADE = BUFFER_USDC_IN_WITHDRAWAL;
34070
34243
  const extendedHoldings = await extendedAdapter.getExtendedDepositAmount();
34071
34244
  if (!extendedHoldings) {
34072
34245
  logger.error(`error getting extended holdings: ${extendedHoldings}`);
@@ -34076,7 +34249,7 @@ var VesuExtendedMultiplierStrategy = class _VesuExtendedMultiplierStrategy exten
34076
34249
  };
34077
34250
  }
34078
34251
  const extendedHoldingAmount = new Web3Number(
34079
- extendedHoldings.availableForWithdrawal,
34252
+ extendedHoldings.availableForTrade,
34080
34253
  USDC_TOKEN_DECIMALS
34081
34254
  );
34082
34255
  const {
@@ -34085,12 +34258,11 @@ var VesuExtendedMultiplierStrategy = class _VesuExtendedMultiplierStrategy exten
34085
34258
  const { collateralPrice } = await this.getAssetPrices();
34086
34259
  const { vesuAmountInBTC, extendedAmountInBTC } = calculateVesUPositionSizeGivenExtended(
34087
34260
  extendedPositionValue,
34088
- extendedHoldingAmount,
34261
+ extendedHoldingAmount.minus(BUFFER_AMOUNT_IN_AVAILABLE_FOR_TRADE),
34089
34262
  collateralTokenAmount,
34090
34263
  collateralPrice.price
34091
34264
  );
34092
- console.log("vesuAmountInBTC", vesuAmountInBTC);
34093
- console.log("extendedAmountInBTC", extendedAmountInBTC);
34265
+ logger.info(`vesuAmountInBTC ${vesuAmountInBTC}, extendedAmountInBTC ${extendedAmountInBTC}`);
34094
34266
  let calls = [];
34095
34267
  if (vesuAmountInBTC.greaterThan(MINIMUM_EXTENDED_POSITION_SIZE)) {
34096
34268
  const proofsInfo = vesuAdapter.getProofs(true, this.getMerkleTree());
@@ -34103,7 +34275,6 @@ var VesuExtendedMultiplierStrategy = class _VesuExtendedMultiplierStrategy exten
34103
34275
  );
34104
34276
  const { amount: wbtcAmountInVaultAllocator } = await this.getUnusedBalanceWBTC();
34105
34277
  if (wbtcAmountInVaultAllocator.lessThan(vesuAmountInBTC)) {
34106
- console.log("error wbtc amount in vault allocator is less than vesu amount in btc", wbtcAmountInVaultAllocator, vesuAmountInBTC);
34107
34278
  const swapProofsInfo = avnuAdapter.getProofs(true, this.getMerkleTree());
34108
34279
  const swapProofGroups = swapProofsInfo.proofs;
34109
34280
  const swapCall = this.getManageCall(
@@ -34147,7 +34318,7 @@ var VesuExtendedMultiplierStrategy = class _VesuExtendedMultiplierStrategy exten
34147
34318
  bid
34148
34319
  } = await extendedAdapter.fetchOrderBookBTCUSDC();
34149
34320
  const price = ask.plus(bid).dividedBy(2);
34150
- const btcToken = vesuAdapter.config.supportedPositions[1].asset;
34321
+ const btcToken = vesuAdapter.config.supportedPositions[0].asset;
34151
34322
  const btcPriceAvnu = await avnuAdapter.getPriceOfToken(btcToken.address.toString());
34152
34323
  if (!btcPriceAvnu) {
34153
34324
  logger.error(`error getting btc price avnu: ${btcPriceAvnu}`);
@@ -34163,43 +34334,65 @@ var VesuExtendedMultiplierStrategy = class _VesuExtendedMultiplierStrategy exten
34163
34334
  async handleWithdraw(amount) {
34164
34335
  try {
34165
34336
  const usdcBalanceVaultAllocator = await this.getUnusedBalance();
34166
- const usdcBalanceDifference = amount.minus(usdcBalanceVaultAllocator.usdValue);
34337
+ const usdcBalanceDifference = amount.plus(BUFFER_USDC_IN_WITHDRAWAL).minus(usdcBalanceVaultAllocator.usdValue);
34167
34338
  logger.info(`usdcBalanceDifference, ${usdcBalanceDifference.toNumber()}`);
34339
+ let calls = [];
34340
+ let status = true;
34168
34341
  if (usdcBalanceDifference.lessThan(0)) {
34169
- const withdrawCall = await this.getBringLiquidityCall({
34170
- amount
34342
+ const withdrawCall2 = await this.getBringLiquidityCall({
34343
+ amount: usdcBalanceVaultAllocator.amount
34171
34344
  });
34172
- logger.info("withdraw call", withdrawCall);
34173
- return [withdrawCall];
34345
+ logger.info("withdraw call", withdrawCall2);
34346
+ calls.push(withdrawCall2);
34347
+ return {
34348
+ calls,
34349
+ status: true
34350
+ };
34174
34351
  }
34175
34352
  const vesuAdapter = await this.getVesuAdapter();
34176
34353
  const extendedAdapter = await this.getExtendedAdapter();
34177
34354
  if (!vesuAdapter || !extendedAdapter || !extendedAdapter.client) {
34355
+ status = false;
34178
34356
  logger.error(
34179
34357
  `vesu or extended adapter not found: vesuAdapter=${vesuAdapter}, extendedAdapter=${extendedAdapter}`
34180
34358
  );
34181
- return [];
34359
+ return {
34360
+ calls,
34361
+ status
34362
+ };
34182
34363
  }
34183
34364
  const { collateralTokenAmount } = await vesuAdapter.vesuAdapter.getAssetPrices();
34184
34365
  const {
34185
34366
  collateralPrice
34186
34367
  } = await this.getAssetPrices();
34187
34368
  const extendedPositon = await extendedAdapter.getAllOpenPositions();
34369
+ if (!extendedPositon) {
34370
+ status = false;
34371
+ logger.error("error getting extended position", extendedPositon);
34372
+ return {
34373
+ calls,
34374
+ status
34375
+ };
34376
+ }
34188
34377
  const amountDistributionForWithdrawal = await calculateAmountDistributionForWithdrawal(
34189
- amount,
34378
+ usdcBalanceDifference,
34190
34379
  collateralPrice.price,
34191
34380
  collateralTokenAmount,
34192
34381
  extendedPositon
34193
34382
  );
34194
34383
  if (!amountDistributionForWithdrawal) {
34384
+ status = false;
34195
34385
  logger.error(
34196
34386
  `error calculating amount distribution for withdrawal: ${amountDistributionForWithdrawal}`
34197
34387
  );
34198
- return [];
34388
+ return {
34389
+ calls,
34390
+ status
34391
+ };
34199
34392
  }
34200
34393
  const { vesu_amount, extended_amount } = amountDistributionForWithdrawal;
34201
- if (vesu_amount.greaterThan(0)) {
34202
- const result = await this.moveAssets(
34394
+ if (status && vesu_amount.greaterThan(0)) {
34395
+ const { calls: vesuCalls, status: vesuStatus } = await this.moveAssets(
34203
34396
  {
34204
34397
  amount: vesu_amount,
34205
34398
  from: Protocols.VESU.name,
@@ -34208,10 +34401,11 @@ var VesuExtendedMultiplierStrategy = class _VesuExtendedMultiplierStrategy exten
34208
34401
  extendedAdapter,
34209
34402
  vesuAdapter
34210
34403
  );
34211
- return result;
34404
+ status = vesuStatus;
34405
+ calls.push(...vesuCalls);
34212
34406
  }
34213
- if (extended_amount.greaterThan(0)) {
34214
- const result = await this.moveAssets(
34407
+ if (status && extended_amount.greaterThan(0)) {
34408
+ const { calls: extendedCalls, status: extendedStatus } = await this.moveAssets(
34215
34409
  {
34216
34410
  amount: extended_amount,
34217
34411
  from: Protocols.EXTENDED.name,
@@ -34220,12 +34414,32 @@ var VesuExtendedMultiplierStrategy = class _VesuExtendedMultiplierStrategy exten
34220
34414
  extendedAdapter,
34221
34415
  vesuAdapter
34222
34416
  );
34223
- return result;
34417
+ status = extendedStatus;
34418
+ if (status) {
34419
+ calls.push(...extendedCalls);
34420
+ } else {
34421
+ logger.error("error moving assets to vault: extendedStatus: ${extendedStatus}");
34422
+ return {
34423
+ calls: [],
34424
+ status
34425
+ };
34426
+ }
34224
34427
  }
34225
- return [];
34428
+ const withdrawCall = await this.getBringLiquidityCall({
34429
+ amount
34430
+ });
34431
+ logger.info("withdraw call", withdrawCall);
34432
+ calls.push(withdrawCall);
34433
+ return {
34434
+ calls,
34435
+ status
34436
+ };
34226
34437
  } catch (err) {
34227
34438
  logger.error(`error handling withdrawal: ${err}`);
34228
- return [];
34439
+ return {
34440
+ calls: [],
34441
+ status: false
34442
+ };
34229
34443
  }
34230
34444
  }
34231
34445
  async getAUM() {
@@ -34359,6 +34573,7 @@ function getLooperSettings2(lstSymbol, underlyingSymbol, vaultSettings, pool1, e
34359
34573
  () => vesuMultiplyAdapter.getWithdrawLeaf()
34360
34574
  );
34361
34575
  vaultSettings.leafAdapters.push(() => extendedAdapter.getDepositLeaf());
34576
+ vaultSettings.leafAdapters.push(() => extendedAdapter.getSwapFromLegacyLeaf());
34362
34577
  vaultSettings.leafAdapters.push(() => avnuAdapter.getDepositLeaf());
34363
34578
  vaultSettings.leafAdapters.push(() => avnuAdapter.getWithdrawLeaf());
34364
34579
  vaultSettings.leafAdapters.push(