@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.
- package/dist/index.browser.global.js +319 -104
- package/dist/index.browser.mjs +319 -104
- package/dist/index.d.ts +31 -5
- package/dist/index.js +319 -104
- package/dist/index.mjs +319 -104
- package/package.json +1 -1
- package/src/dataTypes/address.ts +1 -1
- package/src/modules/ekubo-quoter.ts +1 -12
- package/src/strategies/universal-adapters/avnu-adapter.ts +7 -11
- package/src/strategies/universal-adapters/extended-adapter.ts +128 -11
- package/src/strategies/universal-adapters/vesu-multiply-adapter.ts +16 -16
- package/src/strategies/vesu-extended-strategy/services/operationService.ts +8 -2
- package/src/strategies/vesu-extended-strategy/utils/constants.ts +1 -0
- package/src/strategies/vesu-extended-strategy/utils/helper.ts +15 -17
- package/src/strategies/vesu-extended-strategy/vesu-extended-strategy.tsx +212 -64
package/dist/index.mjs
CHANGED
|
@@ -4328,20 +4328,13 @@ var EkuboQuoter = class _EkuboQuoter {
|
|
|
4328
4328
|
async getDexPrice(baseToken, quoteToken, amount) {
|
|
4329
4329
|
const lstTokenInfo = baseToken;
|
|
4330
4330
|
const lstUnderlyingTokenInfo = quoteToken;
|
|
4331
|
-
console.log("lstTokenInfo", lstTokenInfo);
|
|
4332
|
-
console.log("lstUnderlyingTokenInfo", lstUnderlyingTokenInfo);
|
|
4333
|
-
console.log("amount", amount);
|
|
4334
4331
|
const quote = await this.getQuote(
|
|
4335
4332
|
lstTokenInfo.address.address,
|
|
4336
4333
|
lstUnderlyingTokenInfo.address.address,
|
|
4337
4334
|
amount
|
|
4338
4335
|
);
|
|
4339
|
-
console.log("quote", quote);
|
|
4340
4336
|
const outputAmount = Web3Number.fromWei(quote.total_calculated, lstUnderlyingTokenInfo.decimals);
|
|
4341
|
-
console.log("outputAmount", outputAmount);
|
|
4342
|
-
console.log("amount", amount);
|
|
4343
4337
|
const price = outputAmount.toNumber() / amount.toNumber();
|
|
4344
|
-
console.log("price", price);
|
|
4345
4338
|
logger.verbose(`${_EkuboQuoter.name}:: LST Dex Price: ${price}`);
|
|
4346
4339
|
return price;
|
|
4347
4340
|
}
|
|
@@ -4360,16 +4353,12 @@ var EkuboQuoter = class _EkuboQuoter {
|
|
|
4360
4353
|
// debt collateral
|
|
4361
4354
|
async getSwapLimitAmount(fromToken, toToken, amount, max_slippage = 2e-3) {
|
|
4362
4355
|
const isExactAmountIn = amount.greaterThanOrEqualTo(0);
|
|
4363
|
-
console.log("isExactAmountIn", isExactAmountIn);
|
|
4364
4356
|
logger.verbose(`${_EkuboQuoter.name}::getSwapLimitAmount isExactAmountIn: ${isExactAmountIn}, fromToken: ${fromToken.symbol}, toToken: ${toToken.symbol}, amount: ${amount}`);
|
|
4365
4357
|
const isYieldToken = this.tokenMarketData.isAPYSupported(toToken);
|
|
4366
4358
|
console.log("isYieldToken", isYieldToken);
|
|
4367
4359
|
const baseToken = isExactAmountIn ? toToken : fromToken;
|
|
4368
4360
|
const quoteToken = isExactAmountIn ? fromToken : toToken;
|
|
4369
|
-
console.log("baseToken", baseToken);
|
|
4370
|
-
console.log("quoteToken", quoteToken);
|
|
4371
4361
|
const dexPrice = await this.getDexPrice(baseToken, quoteToken, amount);
|
|
4372
|
-
console.log("dexPrice", dexPrice);
|
|
4373
4362
|
const trueExchangeRate = isYieldToken ? await this.tokenMarketData.getTruePrice(baseToken) : dexPrice;
|
|
4374
4363
|
console.log("trueExchangeRate", trueExchangeRate);
|
|
4375
4364
|
if (isExactAmountIn) {
|
|
@@ -28021,6 +28010,7 @@ var vesu_multiple_abi_default = [
|
|
|
28021
28010
|
var AVNU_API = "https://starknet.api.avnu.fi/swap/v2/quotes";
|
|
28022
28011
|
var USDC_TOKEN_DECIMALS = 6;
|
|
28023
28012
|
var USDC_TOKEN_ADDRESS = "0x053C91253BC9682c04929cA02ED00b3E423f6710D2ee7e0D5EBB06F3eCF368A8";
|
|
28013
|
+
var BUFFER_USDC_IN_WITHDRAWAL = 5;
|
|
28024
28014
|
var WBTC_TOKEN_ADDRESS = "0x3fe2b97c1fd336e750087d68b9b867997fd64a2661ff3ca5a7c771641e8e7ac";
|
|
28025
28015
|
var WBTC_TOKEN_DECIMALS = 8;
|
|
28026
28016
|
var MAINTENANCE_MARGIN = 0.01;
|
|
@@ -28112,8 +28102,7 @@ var calculateAmountDistributionForWithdrawal = async (amountInUsdc, collateralPr
|
|
|
28112
28102
|
logger.error("error getting extended positions");
|
|
28113
28103
|
return null;
|
|
28114
28104
|
}
|
|
28115
|
-
const
|
|
28116
|
-
const extendedExposureUSD = extendedBTCExposure.multipliedBy(collateralPrice);
|
|
28105
|
+
const extendedExposureUSD = extendedPosition.length > 0 ? new Web3Number(extendedPosition[0].value, USDC_TOKEN_DECIMALS) : new Web3Number(0, USDC_TOKEN_DECIMALS);
|
|
28117
28106
|
const vesuExposureUSD = collateralUnits.multipliedBy(collateralPrice);
|
|
28118
28107
|
if (vesuExposureUSD.lessThan(0)) {
|
|
28119
28108
|
return {
|
|
@@ -28131,9 +28120,14 @@ var calculateAmountDistributionForWithdrawal = async (amountInUsdc, collateralPr
|
|
|
28131
28120
|
vesu_leverage
|
|
28132
28121
|
};
|
|
28133
28122
|
}
|
|
28123
|
+
console.log("the vesu exposure usd is", vesuExposureUSD.toNumber());
|
|
28124
|
+
console.log("the extended exposure usd is", extendedExposureUSD.toNumber());
|
|
28125
|
+
console.log("the amount in usdc is", amountInUsdc.toNumber());
|
|
28126
|
+
console.log("the extended leverage is", extended_leverage);
|
|
28127
|
+
console.log("the vesu leverage is", vesu_leverage);
|
|
28134
28128
|
const numerator1 = amountInUsdc.multipliedBy(extended_leverage);
|
|
28135
|
-
const numerator2 = vesuExposureUSD
|
|
28136
|
-
const numerator3 = extendedExposureUSD.multipliedBy(
|
|
28129
|
+
const numerator2 = vesuExposureUSD;
|
|
28130
|
+
const numerator3 = extendedExposureUSD.multipliedBy(-1);
|
|
28137
28131
|
const finalNumerator = numerator1.plus(numerator2).plus(numerator3);
|
|
28138
28132
|
const denominator = extended_leverage + vesu_leverage;
|
|
28139
28133
|
const vesuAmountInUSDC = finalNumerator.dividedBy(denominator);
|
|
@@ -28143,6 +28137,7 @@ var calculateAmountDistributionForWithdrawal = async (amountInUsdc, collateralPr
|
|
|
28143
28137
|
"the extended amount in usdc is",
|
|
28144
28138
|
extendedAmountInUSDC.toNumber()
|
|
28145
28139
|
);
|
|
28140
|
+
await new Promise((resolve) => setTimeout(resolve, 1e4));
|
|
28146
28141
|
return {
|
|
28147
28142
|
vesu_amount: vesuAmountInUSDC,
|
|
28148
28143
|
extended_amount: extendedAmountInUSDC,
|
|
@@ -28164,10 +28159,10 @@ var calculateExtendedLevergae = () => {
|
|
|
28164
28159
|
const extended_leverage_max = 1 / (MAINTENANCE_MARGIN + MAX_PRICE_DROP_PERCENTAGE);
|
|
28165
28160
|
return Math.floor(extended_leverage_max);
|
|
28166
28161
|
};
|
|
28167
|
-
var calculateDebtAmount = (collateralAmount, debtAmount, debtPrice, maxLtv =
|
|
28162
|
+
var calculateDebtAmount = (collateralAmount, debtAmount, debtPrice, maxLtv = MAX_LIQUIDATION_RATIO, addedAmount, collateralPrice, isDeposit) => {
|
|
28168
28163
|
try {
|
|
28169
|
-
const
|
|
28170
|
-
const numerator1 = collateralAmount.plus(
|
|
28164
|
+
const addedCollateral = addedAmount.multipliedBy(isDeposit ? 1 : -1);
|
|
28165
|
+
const numerator1 = collateralAmount.plus(addedCollateral).multipliedBy(collateralPrice).multipliedBy(maxLtv);
|
|
28171
28166
|
const numerator2 = debtAmount.multipliedBy(debtPrice).multipliedBy(TARGET_HF);
|
|
28172
28167
|
const denominator = TARGET_HF - maxLtv;
|
|
28173
28168
|
const x_debt_usd = numerator1.minus(numerator2).dividedBy(denominator);
|
|
@@ -28202,7 +28197,6 @@ var calculateAmountDepositOnExtendedWhenIncurringLosses = async (client) => {
|
|
|
28202
28197
|
const extendedHoldings = await client.getHoldings();
|
|
28203
28198
|
const extended_leverage = calculateExtendedLevergae();
|
|
28204
28199
|
const latestPosition = (await client.getPositions()).data.pop();
|
|
28205
|
-
console.log("the latest position is", latestPosition, extendedHoldings);
|
|
28206
28200
|
if (!extendedHoldings || !latestPosition) {
|
|
28207
28201
|
logger.error(`error getting extended position: extendedHoldings=${extendedHoldings}, latestPosition=${latestPosition}`);
|
|
28208
28202
|
return null;
|
|
@@ -28583,7 +28577,7 @@ var VesuMultiplyAdapter = class _VesuMultiplyAdapter extends BaseAdapter {
|
|
|
28583
28577
|
this.config.debt.address.toBigInt(),
|
|
28584
28578
|
this.config.vaultAllocator.toBigInt()
|
|
28585
28579
|
],
|
|
28586
|
-
sanitizer: SIMPLE_SANITIZER_V2,
|
|
28580
|
+
sanitizer: isV2 ? SIMPLE_SANITIZER_V2 : SIMPLE_SANITIZER,
|
|
28587
28581
|
// vmw = vesu multiply withdraw
|
|
28588
28582
|
id: `vmw_${this.config.poolId.shortString()}_${collateral.symbol}_${debt.symbol}`
|
|
28589
28583
|
},
|
|
@@ -28732,7 +28726,7 @@ var VesuMultiplyAdapter = class _VesuMultiplyAdapter extends BaseAdapter {
|
|
|
28732
28726
|
},
|
|
28733
28727
|
// Vesu multiply call
|
|
28734
28728
|
{
|
|
28735
|
-
sanitizer: SIMPLE_SANITIZER_V2,
|
|
28729
|
+
sanitizer: isV2 ? SIMPLE_SANITIZER_V2 : SIMPLE_SANITIZER,
|
|
28736
28730
|
call: {
|
|
28737
28731
|
contractAddress: vesuMultiply,
|
|
28738
28732
|
selector: hash5.getSelectorFromName("modify_lever"),
|
|
@@ -28820,19 +28814,13 @@ var VesuMultiplyAdapter = class _VesuMultiplyAdapter extends BaseAdapter {
|
|
|
28820
28814
|
leverSwap = ekuboQuoter.getVesuMultiplyQuote(swapQuote, debtToken, collateralToken);
|
|
28821
28815
|
const MAX_SLIPPAGE = 2e-3;
|
|
28822
28816
|
if (debtAmount.greaterThan(0)) {
|
|
28823
|
-
|
|
28824
|
-
leverSwapLimitAmount = await ekuboQuoter.getSwapLimitAmount(debtToken, collateralToken, debtAmount, MAX_SLIPPAGE);
|
|
28825
|
-
const anotherleverSwapLimitAmount = debtAmount.multipliedBy(1 + MAX_SLIPPAGE);
|
|
28826
|
-
console.log("anotherleverSwapLimitAmount", anotherleverSwapLimitAmount, leverSwapLimitAmount);
|
|
28817
|
+
leverSwapLimitAmount = debtAmount.multipliedBy(1 + MAX_SLIPPAGE);
|
|
28827
28818
|
} else if (debtAmount.lessThan(0)) {
|
|
28828
|
-
leverSwapLimitAmount =
|
|
28829
|
-
const anotherleverSwapLimitAmount = debtAmount.abs().multipliedBy(1 - MAX_SLIPPAGE);
|
|
28830
|
-
console.log("anotherleverSwapLimitAmount", anotherleverSwapLimitAmount, leverSwapLimitAmount);
|
|
28819
|
+
leverSwapLimitAmount = debtAmount.abs().multipliedBy(1 - MAX_SLIPPAGE);
|
|
28831
28820
|
} else {
|
|
28832
28821
|
leverSwapLimitAmount = Web3Number.fromWei(0, this.config.debt.decimals);
|
|
28833
28822
|
}
|
|
28834
28823
|
await new Promise((resolve) => setTimeout(resolve, 1e4));
|
|
28835
|
-
console.log("leverSwapLimitAmount", leverSwapLimitAmount);
|
|
28836
28824
|
} else {
|
|
28837
28825
|
throw new Error(`VesuMultiplyAdapter: Price impact too high (${swapQuote.price_impact}), skipping swap`);
|
|
28838
28826
|
}
|
|
@@ -28902,26 +28890,23 @@ var VesuMultiplyAdapter = class _VesuMultiplyAdapter extends BaseAdapter {
|
|
|
28902
28890
|
debtPrice.price,
|
|
28903
28891
|
debtToken.decimals
|
|
28904
28892
|
);
|
|
28905
|
-
console.log("debtAmountToRepay", debtAmountToRepay);
|
|
28906
28893
|
if (!debtAmountToRepay) {
|
|
28907
28894
|
throw new Error("error calculating debt amount to repay");
|
|
28908
28895
|
}
|
|
28909
28896
|
const ekuboQuoter = new EkuboQuoter(this.config.networkConfig, this.config.pricer);
|
|
28910
28897
|
const debtInDebtUnits = new Web3Number(debtAmountToRepay, debtToken.decimals).dividedBy(debtPrice.price).multipliedBy(10 ** debtToken.decimals);
|
|
28911
|
-
const debtInCollateralUnits = new Web3Number(debtAmountToRepay, debtToken.decimals).dividedBy(collateralPrice.price).multipliedBy(10 ** collateralToken.decimals);
|
|
28912
28898
|
const swapQuote = await ekuboQuoter.getQuote(
|
|
28913
28899
|
debtToken.address.address,
|
|
28914
28900
|
collateralToken.address.address,
|
|
28915
28901
|
debtInDebtUnits
|
|
28916
28902
|
);
|
|
28917
28903
|
const MAX_SLIPPAGE = 2e-3;
|
|
28918
|
-
if (swapQuote.price_impact <
|
|
28919
|
-
leverSwap = ekuboQuoter.getVesuMultiplyQuote(swapQuote,
|
|
28904
|
+
if (swapQuote.price_impact < 25e-4) {
|
|
28905
|
+
leverSwap = ekuboQuoter.getVesuMultiplyQuote(swapQuote, collateralToken, debtToken);
|
|
28920
28906
|
} else {
|
|
28921
28907
|
logger.error(`VesuMultiplyAdapter: Price impact too high (${swapQuote.price_impact}), skipping swap`);
|
|
28922
28908
|
}
|
|
28923
|
-
|
|
28924
|
-
leverSwapLimitAmount = await ekuboQuoter.getSwapLimitAmount(debtToken, collateralToken, debtInCollateralUnits, MAX_SLIPPAGE);
|
|
28909
|
+
leverSwapLimitAmount = new Web3Number(debtAmountToRepay, debtToken.decimals).abs().multipliedBy(1 + MAX_SLIPPAGE);
|
|
28925
28910
|
const multiplyParams = await this.getLeverParams(false, params, leverSwap, leverSwapLimitAmount);
|
|
28926
28911
|
const call = multiplyContract.populate("modify_lever", {
|
|
28927
28912
|
modify_lever_params: this.formatMultiplyParams(false, multiplyParams)
|
|
@@ -29493,6 +29478,41 @@ var ExtendedAdapter = class _ExtendedAdapter extends BaseAdapter {
|
|
|
29493
29478
|
}
|
|
29494
29479
|
];
|
|
29495
29480
|
}
|
|
29481
|
+
getSwapFromLegacyLeaf() {
|
|
29482
|
+
const leafConfigs = this._getSwapFromLegacyLeaf();
|
|
29483
|
+
const leaves = leafConfigs.map((config) => {
|
|
29484
|
+
const { target, method, packedArguments, sanitizer, id } = config;
|
|
29485
|
+
const leaf = this.constructSimpleLeafData({
|
|
29486
|
+
id,
|
|
29487
|
+
target,
|
|
29488
|
+
method,
|
|
29489
|
+
packedArguments
|
|
29490
|
+
}, sanitizer);
|
|
29491
|
+
return leaf;
|
|
29492
|
+
});
|
|
29493
|
+
return { leaves, callConstructor: this.getSwapFromLegacyCall.bind(this) };
|
|
29494
|
+
}
|
|
29495
|
+
_getSwapFromLegacyLeaf() {
|
|
29496
|
+
const usdceToken = Global.getDefaultTokens().find((token) => token.symbol === "USDCe");
|
|
29497
|
+
return [
|
|
29498
|
+
{
|
|
29499
|
+
target: usdceToken.address,
|
|
29500
|
+
method: "approve",
|
|
29501
|
+
packedArguments: [
|
|
29502
|
+
AVNU_EXCHANGE_FOR_LEGACY_USDC.toBigInt()
|
|
29503
|
+
],
|
|
29504
|
+
id: `extendedswaplegacyapprove_${usdceToken.symbol}`,
|
|
29505
|
+
sanitizer: AVNU_LEGACY_SANITIZER
|
|
29506
|
+
},
|
|
29507
|
+
{
|
|
29508
|
+
target: AVNU_EXCHANGE_FOR_LEGACY_USDC,
|
|
29509
|
+
method: "swap_to_new",
|
|
29510
|
+
packedArguments: [],
|
|
29511
|
+
id: `extended_swap_to_new_${usdceToken.symbol}`,
|
|
29512
|
+
sanitizer: AVNU_LEGACY_SANITIZER
|
|
29513
|
+
}
|
|
29514
|
+
];
|
|
29515
|
+
}
|
|
29496
29516
|
_getWithdrawLeaf() {
|
|
29497
29517
|
return [];
|
|
29498
29518
|
}
|
|
@@ -29573,6 +29593,70 @@ var ExtendedAdapter = class _ExtendedAdapter extends BaseAdapter {
|
|
|
29573
29593
|
return [];
|
|
29574
29594
|
}
|
|
29575
29595
|
}
|
|
29596
|
+
getProofsForFromLegacySwap(tree) {
|
|
29597
|
+
let proofGroups = [];
|
|
29598
|
+
const ids = this.getSwapFromLegacyLeaf().leaves.map((l) => l.readableId);
|
|
29599
|
+
for (const [i, v] of tree.entries()) {
|
|
29600
|
+
if (ids.includes(v.readableId)) {
|
|
29601
|
+
proofGroups.push(tree.getProof(i));
|
|
29602
|
+
}
|
|
29603
|
+
}
|
|
29604
|
+
if (proofGroups.length != ids.length) {
|
|
29605
|
+
throw new Error(`Not all proofs found for IDs: ${ids.join(", ")}`);
|
|
29606
|
+
}
|
|
29607
|
+
return {
|
|
29608
|
+
proofs: proofGroups,
|
|
29609
|
+
callConstructor: this.getSwapFromLegacyCall.bind(this)
|
|
29610
|
+
};
|
|
29611
|
+
}
|
|
29612
|
+
async getSwapFromLegacyCall(params) {
|
|
29613
|
+
try {
|
|
29614
|
+
const usdcToken = this.config.supportedPositions[0].asset;
|
|
29615
|
+
const usdceToken = Global.getDefaultTokens().find((token) => token.symbol === "USDCe");
|
|
29616
|
+
const amount = uint25613.bnToUint256(params.amount.multipliedBy(10).toWei());
|
|
29617
|
+
const quotes = await this.config.avnuAdapter.getQuotesAvnu(
|
|
29618
|
+
usdceToken.address.toString(),
|
|
29619
|
+
usdcToken.address.toString(),
|
|
29620
|
+
params.amount.toNumber(),
|
|
29621
|
+
this.config.avnuAdapter.config.vaultAllocator.address.toString(),
|
|
29622
|
+
usdcToken.decimals,
|
|
29623
|
+
false
|
|
29624
|
+
);
|
|
29625
|
+
if (!quotes) {
|
|
29626
|
+
logger.error("error getting quotes from avnu");
|
|
29627
|
+
return [];
|
|
29628
|
+
}
|
|
29629
|
+
const getCalldata = await this.config.avnuAdapter.getSwapCallData(quotes);
|
|
29630
|
+
const swapCallData = getCalldata[0];
|
|
29631
|
+
return [
|
|
29632
|
+
{
|
|
29633
|
+
sanitizer: AVNU_LEGACY_SANITIZER,
|
|
29634
|
+
call: {
|
|
29635
|
+
contractAddress: usdceToken.address,
|
|
29636
|
+
selector: hash6.getSelectorFromName("approve"),
|
|
29637
|
+
calldata: [
|
|
29638
|
+
AVNU_EXCHANGE_FOR_LEGACY_USDC.toBigInt(),
|
|
29639
|
+
toBigInt(amount.low.toString()),
|
|
29640
|
+
// amount low
|
|
29641
|
+
toBigInt(amount.high.toString())
|
|
29642
|
+
// amount high
|
|
29643
|
+
]
|
|
29644
|
+
}
|
|
29645
|
+
},
|
|
29646
|
+
{
|
|
29647
|
+
sanitizer: AVNU_LEGACY_SANITIZER,
|
|
29648
|
+
call: {
|
|
29649
|
+
contractAddress: AVNU_EXCHANGE_FOR_LEGACY_USDC,
|
|
29650
|
+
selector: hash6.getSelectorFromName("swap_to_new"),
|
|
29651
|
+
calldata: swapCallData
|
|
29652
|
+
}
|
|
29653
|
+
}
|
|
29654
|
+
];
|
|
29655
|
+
} catch (error) {
|
|
29656
|
+
logger.error(`Error creating Deposit Call: ${error}`);
|
|
29657
|
+
return [];
|
|
29658
|
+
}
|
|
29659
|
+
}
|
|
29576
29660
|
//Swap wbtc to usdc
|
|
29577
29661
|
async getWithdrawCall(params) {
|
|
29578
29662
|
try {
|
|
@@ -29590,10 +29674,10 @@ var ExtendedAdapter = class _ExtendedAdapter extends BaseAdapter {
|
|
|
29590
29674
|
if (!this.client) {
|
|
29591
29675
|
throw new Error("Client not initialized");
|
|
29592
29676
|
}
|
|
29593
|
-
const withdrawalRequest = this.client.withdrawUSDC(amount.
|
|
29594
|
-
if (
|
|
29595
|
-
|
|
29596
|
-
return
|
|
29677
|
+
const withdrawalRequest = await this.client.withdrawUSDC(amount.toFixed(2));
|
|
29678
|
+
if (withdrawalRequest.status === "OK") {
|
|
29679
|
+
const withdrawalStatus = await this.getDepositOrWithdrawalStatus(withdrawalRequest.data, "WITHDRAWAL" /* WITHDRAWAL */);
|
|
29680
|
+
return withdrawalStatus;
|
|
29597
29681
|
}
|
|
29598
29682
|
return false;
|
|
29599
29683
|
} catch (error) {
|
|
@@ -29774,7 +29858,7 @@ var ExtendedAdapter = class _ExtendedAdapter extends BaseAdapter {
|
|
|
29774
29858
|
logger.error(`createShortOrder failed on attempt ${attempt}: ${err.message}`);
|
|
29775
29859
|
if (attempt < maxAttempts) {
|
|
29776
29860
|
const backoff = 1200 * attempt;
|
|
29777
|
-
|
|
29861
|
+
logger.info(`Retrying after ${backoff}ms...`);
|
|
29778
29862
|
await new Promise((resolve) => setTimeout(resolve, backoff));
|
|
29779
29863
|
return this.createOrder(
|
|
29780
29864
|
leverage,
|
|
@@ -29805,7 +29889,7 @@ var ExtendedAdapter = class _ExtendedAdapter extends BaseAdapter {
|
|
|
29805
29889
|
}
|
|
29806
29890
|
return null;
|
|
29807
29891
|
} catch (err) {
|
|
29808
|
-
|
|
29892
|
+
logger.error(`Error opening short extended position, ${err}`);
|
|
29809
29893
|
return null;
|
|
29810
29894
|
}
|
|
29811
29895
|
}
|
|
@@ -29815,17 +29899,16 @@ var ExtendedAdapter = class _ExtendedAdapter extends BaseAdapter {
|
|
|
29815
29899
|
operationsType: [operationsType],
|
|
29816
29900
|
operationsStatus: ["COMPLETED" /* COMPLETED */]
|
|
29817
29901
|
});
|
|
29818
|
-
console.log("transferHistory", transferHistory);
|
|
29819
29902
|
if (operationsType === "DEPOSIT" /* DEPOSIT */) {
|
|
29820
29903
|
const myTransferStatus = transferHistory.data.find((operation) => operation.transactionHash === orderId);
|
|
29821
29904
|
if (!myTransferStatus) {
|
|
29822
|
-
return
|
|
29905
|
+
return true;
|
|
29823
29906
|
}
|
|
29824
29907
|
return true;
|
|
29825
29908
|
} else {
|
|
29826
|
-
const myTransferStatus = transferHistory.data.find((operation) => operation.id === orderId);
|
|
29909
|
+
const myTransferStatus = transferHistory.data.find((operation) => operation.id.toString() === orderId.toString());
|
|
29827
29910
|
if (!myTransferStatus) {
|
|
29828
|
-
return
|
|
29911
|
+
return true;
|
|
29829
29912
|
}
|
|
29830
29913
|
return true;
|
|
29831
29914
|
}
|
|
@@ -33414,7 +33497,7 @@ var AvnuAdapter = class _AvnuAdapter extends BaseAdapter {
|
|
|
33414
33497
|
packedArguments: [
|
|
33415
33498
|
fromToken.address.toBigInt(),
|
|
33416
33499
|
//wbtc
|
|
33417
|
-
|
|
33500
|
+
toToken.address.toBigInt(),
|
|
33418
33501
|
//usdc
|
|
33419
33502
|
vaultAllocator.toBigInt()
|
|
33420
33503
|
],
|
|
@@ -33428,13 +33511,11 @@ var AvnuAdapter = class _AvnuAdapter extends BaseAdapter {
|
|
|
33428
33511
|
}
|
|
33429
33512
|
async getDepositCall(params) {
|
|
33430
33513
|
try {
|
|
33431
|
-
console.log("params.amount", params.amount);
|
|
33432
33514
|
const fromToken = this.config.supportedPositions[0].asset;
|
|
33433
33515
|
const toToken = this.config.supportedPositions[1].asset;
|
|
33434
33516
|
const vaultAllocator = ContractAddr.from(
|
|
33435
33517
|
this.config.vaultAllocator.address
|
|
33436
33518
|
);
|
|
33437
|
-
console.log("vaultAllocator", vaultAllocator);
|
|
33438
33519
|
const quote = await this.getQuotesAvnu(
|
|
33439
33520
|
fromToken.address.toString(),
|
|
33440
33521
|
toToken.address.toString(),
|
|
@@ -33490,7 +33571,6 @@ var AvnuAdapter = class _AvnuAdapter extends BaseAdapter {
|
|
|
33490
33571
|
const vaultAllocator = ContractAddr.from(
|
|
33491
33572
|
this.config.vaultAllocator.address
|
|
33492
33573
|
);
|
|
33493
|
-
console.log("params.amount", params.amount);
|
|
33494
33574
|
const quote = await this.getQuotesAvnu(
|
|
33495
33575
|
fromToken.address.toString(),
|
|
33496
33576
|
toToken.address.toString(),
|
|
@@ -33509,8 +33589,6 @@ var AvnuAdapter = class _AvnuAdapter extends BaseAdapter {
|
|
|
33509
33589
|
);
|
|
33510
33590
|
const swapCallData = getCalldata[0];
|
|
33511
33591
|
const amount = uint25614.bnToUint256(params.amount.toWei());
|
|
33512
|
-
console.log("amount", amount);
|
|
33513
|
-
console.log("swapCallData", swapCallData);
|
|
33514
33592
|
return [
|
|
33515
33593
|
{
|
|
33516
33594
|
sanitizer: SIMPLE_SANITIZER,
|
|
@@ -33564,7 +33642,7 @@ var AvnuAdapter = class _AvnuAdapter extends BaseAdapter {
|
|
|
33564
33642
|
}
|
|
33565
33643
|
throw new Error("Failed to fetch quote after retries");
|
|
33566
33644
|
}
|
|
33567
|
-
async getQuotesAvnu(from_token_address, to_token_address, amount, takerAddress, toTokenDecimals, usdcToBtc, maxIterations = 5, tolerance =
|
|
33645
|
+
async getQuotesAvnu(from_token_address, to_token_address, amount, takerAddress, toTokenDecimals, usdcToBtc, maxIterations = 5, tolerance = 1e3) {
|
|
33568
33646
|
try {
|
|
33569
33647
|
const fromToken = this.config.supportedPositions[0].asset;
|
|
33570
33648
|
const toToken = this.config.supportedPositions[1].asset;
|
|
@@ -33585,14 +33663,12 @@ var AvnuAdapter = class _AvnuAdapter extends BaseAdapter {
|
|
|
33585
33663
|
return dataObject2;
|
|
33586
33664
|
}
|
|
33587
33665
|
const btcPrice = await this.getPriceOfToken(toToken.address.toString());
|
|
33588
|
-
console.log("btcPrice", btcPrice);
|
|
33589
33666
|
if (!btcPrice) {
|
|
33590
33667
|
logger.error(`error getting btc price: ${btcPrice}`);
|
|
33591
33668
|
return null;
|
|
33592
33669
|
}
|
|
33593
33670
|
const estimatedUsdcAmount = Math.floor(amount * btcPrice);
|
|
33594
33671
|
const targetBtcBig = BigInt(returnFormattedAmount(amount, toTokenDecimals));
|
|
33595
|
-
console.log("targetBtcBig", targetBtcBig);
|
|
33596
33672
|
let low = BigInt(
|
|
33597
33673
|
Math.floor(
|
|
33598
33674
|
estimatedUsdcAmount * 10 ** fromToken.decimals * 0.9
|
|
@@ -33695,6 +33771,23 @@ var VesuExtendedMultiplierStrategy = class _VesuExtendedMultiplierStrategy exten
|
|
|
33695
33771
|
debtPrice
|
|
33696
33772
|
};
|
|
33697
33773
|
}
|
|
33774
|
+
async getUnusedBalanceUSDCE() {
|
|
33775
|
+
const usdceToken = Global.getDefaultTokens().find(
|
|
33776
|
+
(token) => token.symbol === "USDCe"
|
|
33777
|
+
);
|
|
33778
|
+
const balance = await new ERC20(this.config).balanceOf(
|
|
33779
|
+
usdceToken.address,
|
|
33780
|
+
WALLET_ADDRESS,
|
|
33781
|
+
usdceToken.decimals
|
|
33782
|
+
);
|
|
33783
|
+
const price = await this.pricer.getPrice(usdceToken.symbol);
|
|
33784
|
+
const usdValue = Number(balance.toFixed(usdceToken.decimals)) * price.price;
|
|
33785
|
+
return {
|
|
33786
|
+
tokenInfo: usdceToken,
|
|
33787
|
+
amount: balance,
|
|
33788
|
+
usdValue
|
|
33789
|
+
};
|
|
33790
|
+
}
|
|
33698
33791
|
async getUnusedBalanceWBTC() {
|
|
33699
33792
|
const collateralToken = this.metadata.additionalInfo.borrowable_assets[0];
|
|
33700
33793
|
const balance = await new ERC20(this.config).balanceOf(
|
|
@@ -33740,22 +33833,30 @@ var VesuExtendedMultiplierStrategy = class _VesuExtendedMultiplierStrategy exten
|
|
|
33740
33833
|
}
|
|
33741
33834
|
return extendedAdapter.adapter;
|
|
33742
33835
|
}
|
|
33743
|
-
async moveAssetsToVaultAllocator(amount) {
|
|
33836
|
+
async moveAssetsToVaultAllocator(amount, extendedAdapter) {
|
|
33744
33837
|
try {
|
|
33745
|
-
const
|
|
33746
|
-
(token) => token.symbol === "
|
|
33838
|
+
const usdceToken = Global.getDefaultTokens().find(
|
|
33839
|
+
(token) => token.symbol === "USDCe"
|
|
33747
33840
|
);
|
|
33748
33841
|
const approveCall = new ERC20(this.config).approve(
|
|
33749
|
-
|
|
33842
|
+
usdceToken.address,
|
|
33750
33843
|
this.metadata.additionalInfo.vaultAllocator,
|
|
33751
33844
|
amount
|
|
33752
33845
|
);
|
|
33753
33846
|
const transferCall = new ERC20(this.config).transfer(
|
|
33754
|
-
|
|
33847
|
+
usdceToken.address,
|
|
33755
33848
|
this.metadata.additionalInfo.vaultAllocator,
|
|
33756
33849
|
amount
|
|
33757
33850
|
);
|
|
33758
|
-
|
|
33851
|
+
const proofsInfo = extendedAdapter.getProofsForFromLegacySwap(
|
|
33852
|
+
this.getMerkleTree()
|
|
33853
|
+
);
|
|
33854
|
+
const proofGroups = proofsInfo.proofs;
|
|
33855
|
+
const call = this.getManageCall(
|
|
33856
|
+
proofGroups,
|
|
33857
|
+
await proofsInfo.callConstructor({ amount })
|
|
33858
|
+
);
|
|
33859
|
+
return [approveCall, transferCall, call];
|
|
33759
33860
|
} catch (err) {
|
|
33760
33861
|
logger.error(`error moving assets to vault allocator: ${err}`);
|
|
33761
33862
|
return [];
|
|
@@ -33867,11 +33968,9 @@ var VesuExtendedMultiplierStrategy = class _VesuExtendedMultiplierStrategy exten
|
|
|
33867
33968
|
);
|
|
33868
33969
|
return calls;
|
|
33869
33970
|
}
|
|
33870
|
-
console.log("extendedAmount", extendedAmount);
|
|
33871
|
-
console.log("vesuAmount", vesuAmount);
|
|
33872
33971
|
if (extendedAmount.lessThan(0)) {
|
|
33873
33972
|
try {
|
|
33874
|
-
const extendedCalls = await this.moveAssets(
|
|
33973
|
+
const { calls: extendedCalls, status: extendedStatus } = await this.moveAssets(
|
|
33875
33974
|
{
|
|
33876
33975
|
to: Protocols.VAULT.name,
|
|
33877
33976
|
from: Protocols.EXTENDED.name,
|
|
@@ -33880,14 +33979,18 @@ var VesuExtendedMultiplierStrategy = class _VesuExtendedMultiplierStrategy exten
|
|
|
33880
33979
|
extendedAdapter,
|
|
33881
33980
|
vesuAdapter
|
|
33882
33981
|
);
|
|
33883
|
-
|
|
33982
|
+
if (extendedStatus) {
|
|
33983
|
+
calls.push(...extendedCalls);
|
|
33984
|
+
} else {
|
|
33985
|
+
return [];
|
|
33986
|
+
}
|
|
33884
33987
|
} catch (err) {
|
|
33885
33988
|
logger.error(`Failed moving assets to vault: ${err}`);
|
|
33886
33989
|
}
|
|
33887
33990
|
}
|
|
33888
33991
|
if (vesuAmount.lessThan(0)) {
|
|
33889
33992
|
try {
|
|
33890
|
-
const vesuCalls = await this.moveAssets(
|
|
33993
|
+
const { calls: vesuCalls, status: vesuStatus } = await this.moveAssets(
|
|
33891
33994
|
{
|
|
33892
33995
|
to: Protocols.EXTENDED.name,
|
|
33893
33996
|
from: Protocols.VESU.name,
|
|
@@ -33897,6 +34000,9 @@ var VesuExtendedMultiplierStrategy = class _VesuExtendedMultiplierStrategy exten
|
|
|
33897
34000
|
vesuAdapter
|
|
33898
34001
|
);
|
|
33899
34002
|
calls.push(...vesuCalls);
|
|
34003
|
+
if (!vesuStatus) {
|
|
34004
|
+
return [];
|
|
34005
|
+
}
|
|
33900
34006
|
} catch (err) {
|
|
33901
34007
|
logger.error(`Failed moving assets to vault: ${err}`);
|
|
33902
34008
|
}
|
|
@@ -33908,15 +34014,15 @@ var VesuExtendedMultiplierStrategy = class _VesuExtendedMultiplierStrategy exten
|
|
|
33908
34014
|
}
|
|
33909
34015
|
const usdcAmountInWallet = (await this.getUnusedBalance()).amount;
|
|
33910
34016
|
const usdcAmountOnExtended = parseFloat(
|
|
33911
|
-
extendedHoldings.
|
|
34017
|
+
extendedHoldings.availableForTrade
|
|
33912
34018
|
);
|
|
33913
|
-
if (extendedAmount.minus(usdcAmountOnExtended).greaterThan(0)) {
|
|
34019
|
+
if (extendedAmount.plus(BUFFER_USDC_IN_WITHDRAWAL).minus(usdcAmountOnExtended).greaterThan(0)) {
|
|
33914
34020
|
try {
|
|
33915
|
-
const extendedCalls = await this.moveAssets(
|
|
34021
|
+
const { calls: extendedCalls } = await this.moveAssets(
|
|
33916
34022
|
{
|
|
33917
34023
|
to: Protocols.EXTENDED.name,
|
|
33918
34024
|
from: Protocols.VAULT.name,
|
|
33919
|
-
amount: extendedAmount.minus(usdcAmountOnExtended)
|
|
34025
|
+
amount: extendedAmount.plus(BUFFER_USDC_IN_WITHDRAWAL).minus(usdcAmountOnExtended)
|
|
33920
34026
|
},
|
|
33921
34027
|
extendedAdapter,
|
|
33922
34028
|
vesuAdapter
|
|
@@ -33928,15 +34034,18 @@ var VesuExtendedMultiplierStrategy = class _VesuExtendedMultiplierStrategy exten
|
|
|
33928
34034
|
}
|
|
33929
34035
|
if (vesuAmount.minus(usdcAmountInWallet).greaterThan(0)) {
|
|
33930
34036
|
try {
|
|
33931
|
-
const vesuCalls = await this.moveAssets(
|
|
34037
|
+
const { calls: vesuCalls, status: vesuStatus } = await this.moveAssets(
|
|
33932
34038
|
{
|
|
33933
|
-
to: Protocols.
|
|
34039
|
+
to: Protocols.VAULT.name,
|
|
33934
34040
|
from: Protocols.EXTENDED.name,
|
|
33935
34041
|
amount: vesuAmount.minus(usdcAmountInWallet)
|
|
33936
34042
|
},
|
|
33937
34043
|
extendedAdapter,
|
|
33938
34044
|
vesuAdapter
|
|
33939
34045
|
);
|
|
34046
|
+
if (!vesuStatus) {
|
|
34047
|
+
return [];
|
|
34048
|
+
}
|
|
33940
34049
|
calls.push(...vesuCalls);
|
|
33941
34050
|
} catch (err) {
|
|
33942
34051
|
logger.error(`Failed moving assets to vault: ${err}`);
|
|
@@ -33953,9 +34062,12 @@ var VesuExtendedMultiplierStrategy = class _VesuExtendedMultiplierStrategy exten
|
|
|
33953
34062
|
const avnuAdapter = await this.getAvnuAdapter();
|
|
33954
34063
|
if (!avnuAdapter) {
|
|
33955
34064
|
logger.error(`avnu adapter not found: ${avnuAdapter}`);
|
|
33956
|
-
return
|
|
34065
|
+
return {
|
|
34066
|
+
calls: [],
|
|
34067
|
+
status: false
|
|
34068
|
+
};
|
|
33957
34069
|
}
|
|
33958
|
-
logger.info(
|
|
34070
|
+
logger.info(`moveAssets params, ${JSON.stringify(params)}`);
|
|
33959
34071
|
const collateralToken = vesuAdapter.config.supportedPositions[0].asset;
|
|
33960
34072
|
const {
|
|
33961
34073
|
collateralPrice
|
|
@@ -33972,18 +34084,67 @@ var VesuExtendedMultiplierStrategy = class _VesuExtendedMultiplierStrategy exten
|
|
|
33972
34084
|
await proofsInfo.callConstructor({ amount: params.amount })
|
|
33973
34085
|
);
|
|
33974
34086
|
calls.push(call);
|
|
33975
|
-
return
|
|
34087
|
+
return {
|
|
34088
|
+
calls: [call],
|
|
34089
|
+
status: true
|
|
34090
|
+
};
|
|
33976
34091
|
} else if (params.to === Protocols.VAULT.name && params.from === Protocols.EXTENDED.name) {
|
|
34092
|
+
const extendedLeverage = calculateExtendedLevergae();
|
|
34093
|
+
const extendedHoldings = await extendedAdapter.getExtendedDepositAmount();
|
|
34094
|
+
if (!extendedHoldings) {
|
|
34095
|
+
logger.error(`error getting extended holdings: ${extendedHoldings}`);
|
|
34096
|
+
return {
|
|
34097
|
+
calls: [],
|
|
34098
|
+
status: false
|
|
34099
|
+
};
|
|
34100
|
+
}
|
|
34101
|
+
const extendedHoldingAmount = new Web3Number(
|
|
34102
|
+
extendedHoldings.availableForWithdrawal,
|
|
34103
|
+
USDC_TOKEN_DECIMALS
|
|
34104
|
+
);
|
|
34105
|
+
logger.info(`${_VesuExtendedMultiplierStrategy.name}::moveAssets extendedHoldingAmount: ${extendedHoldingAmount.toNumber()}`);
|
|
34106
|
+
if (params.amount.abs().greaterThan(extendedHoldingAmount)) {
|
|
34107
|
+
const leftAmountAfterWithdrawalAmountInAccount = params.amount.abs().minus(extendedHoldingAmount);
|
|
34108
|
+
logger.info(`${_VesuExtendedMultiplierStrategy.name}::moveAssets leftAmountAfterWithdrawalAmountInAccount: ${leftAmountAfterWithdrawalAmountInAccount.toNumber()}`);
|
|
34109
|
+
const btcAmount = leftAmountAfterWithdrawalAmountInAccount.dividedBy(collateralPrice.price);
|
|
34110
|
+
const openLongPosition = btcAmount.multipliedBy(3).greaterThan(MINIMUM_EXTENDED_POSITION_SIZE) ? await extendedAdapter.createOrder(
|
|
34111
|
+
extendedLeverage.toString(),
|
|
34112
|
+
btcAmount.toNumber(),
|
|
34113
|
+
"BUY" /* BUY */
|
|
34114
|
+
) : await extendedAdapter.createOrder(
|
|
34115
|
+
extendedLeverage.toString(),
|
|
34116
|
+
35e-6,
|
|
34117
|
+
// just in case amount falls short then we need to create a withdrawal
|
|
34118
|
+
"BUY" /* BUY */
|
|
34119
|
+
);
|
|
34120
|
+
if (!openLongPosition) {
|
|
34121
|
+
logger.error(`error opening long position: ${openLongPosition}`);
|
|
34122
|
+
return {
|
|
34123
|
+
calls: [],
|
|
34124
|
+
status: false
|
|
34125
|
+
};
|
|
34126
|
+
}
|
|
34127
|
+
await new Promise((resolve) => setTimeout(resolve, 5e3));
|
|
34128
|
+
}
|
|
33977
34129
|
const withdrawalFromExtended = await extendedAdapter.withdrawFromExtended(params.amount);
|
|
33978
34130
|
if (withdrawalFromExtended) {
|
|
33979
|
-
const
|
|
34131
|
+
const extendedHoldings2 = await extendedAdapter.getExtendedDepositAmount();
|
|
34132
|
+
logger.info(`extendedHoldings after withdrawal ${extendedHoldings2}`);
|
|
34133
|
+
await new Promise((resolve) => setTimeout(resolve, 1e4));
|
|
34134
|
+
const calls = await this.moveAssetsToVaultAllocator(params.amount, extendedAdapter);
|
|
33980
34135
|
if (calls.length > 0) {
|
|
33981
|
-
return
|
|
34136
|
+
return {
|
|
34137
|
+
calls,
|
|
34138
|
+
status: true
|
|
34139
|
+
};
|
|
33982
34140
|
}
|
|
33983
34141
|
} else {
|
|
33984
34142
|
logger.error("withdrawal from extended failed");
|
|
34143
|
+
return {
|
|
34144
|
+
calls: [],
|
|
34145
|
+
status: false
|
|
34146
|
+
};
|
|
33985
34147
|
}
|
|
33986
|
-
return [];
|
|
33987
34148
|
} else if (params.to === Protocols.VAULT.name && params.from === Protocols.VESU.name) {
|
|
33988
34149
|
const vesuAmountInBTC = new Web3Number(
|
|
33989
34150
|
params.amount.dividedBy(collateralPrice.price).toNumber(),
|
|
@@ -34004,7 +34165,10 @@ var VesuExtendedMultiplierStrategy = class _VesuExtendedMultiplierStrategy exten
|
|
|
34004
34165
|
await swapProofsInfo.callConstructor({ amount: vesuAmountInBTC })
|
|
34005
34166
|
);
|
|
34006
34167
|
calls.push(swapCall);
|
|
34007
|
-
return
|
|
34168
|
+
return {
|
|
34169
|
+
calls,
|
|
34170
|
+
status: true
|
|
34171
|
+
};
|
|
34008
34172
|
} else if (params.to === Protocols.EXTENDED.name && params.from === Protocols.VESU.name) {
|
|
34009
34173
|
const vesuAmountInBTC = new Web3Number(
|
|
34010
34174
|
params.amount.dividedBy(collateralPrice.price).toNumber(),
|
|
@@ -34035,13 +34199,21 @@ var VesuExtendedMultiplierStrategy = class _VesuExtendedMultiplierStrategy exten
|
|
|
34035
34199
|
await proofsInfoDeposit.callConstructor({ amount: params.amount })
|
|
34036
34200
|
);
|
|
34037
34201
|
calls.push(callDeposit);
|
|
34038
|
-
return
|
|
34202
|
+
return {
|
|
34203
|
+
calls,
|
|
34204
|
+
status: true
|
|
34205
|
+
};
|
|
34039
34206
|
}
|
|
34040
|
-
|
|
34041
|
-
|
|
34207
|
+
return {
|
|
34208
|
+
calls: [],
|
|
34209
|
+
status: false
|
|
34210
|
+
};
|
|
34042
34211
|
} catch (err) {
|
|
34043
34212
|
logger.error(`error moving assets: ${err}`);
|
|
34044
|
-
return
|
|
34213
|
+
return {
|
|
34214
|
+
calls: [],
|
|
34215
|
+
status: false
|
|
34216
|
+
};
|
|
34045
34217
|
}
|
|
34046
34218
|
}
|
|
34047
34219
|
async handleDeposit() {
|
|
@@ -34078,6 +34250,7 @@ var VesuExtendedMultiplierStrategy = class _VesuExtendedMultiplierStrategy exten
|
|
|
34078
34250
|
};
|
|
34079
34251
|
}
|
|
34080
34252
|
const extendedPositionValue = position.length > 0 ? parseFloat(position[0].value) : 0;
|
|
34253
|
+
const BUFFER_AMOUNT_IN_AVAILABLE_FOR_TRADE = BUFFER_USDC_IN_WITHDRAWAL;
|
|
34081
34254
|
const extendedHoldings = await extendedAdapter.getExtendedDepositAmount();
|
|
34082
34255
|
if (!extendedHoldings) {
|
|
34083
34256
|
logger.error(`error getting extended holdings: ${extendedHoldings}`);
|
|
@@ -34087,7 +34260,7 @@ var VesuExtendedMultiplierStrategy = class _VesuExtendedMultiplierStrategy exten
|
|
|
34087
34260
|
};
|
|
34088
34261
|
}
|
|
34089
34262
|
const extendedHoldingAmount = new Web3Number(
|
|
34090
|
-
extendedHoldings.
|
|
34263
|
+
extendedHoldings.availableForTrade,
|
|
34091
34264
|
USDC_TOKEN_DECIMALS
|
|
34092
34265
|
);
|
|
34093
34266
|
const {
|
|
@@ -34096,12 +34269,11 @@ var VesuExtendedMultiplierStrategy = class _VesuExtendedMultiplierStrategy exten
|
|
|
34096
34269
|
const { collateralPrice } = await this.getAssetPrices();
|
|
34097
34270
|
const { vesuAmountInBTC, extendedAmountInBTC } = calculateVesUPositionSizeGivenExtended(
|
|
34098
34271
|
extendedPositionValue,
|
|
34099
|
-
extendedHoldingAmount,
|
|
34272
|
+
extendedHoldingAmount.minus(BUFFER_AMOUNT_IN_AVAILABLE_FOR_TRADE),
|
|
34100
34273
|
collateralTokenAmount,
|
|
34101
34274
|
collateralPrice.price
|
|
34102
34275
|
);
|
|
34103
|
-
|
|
34104
|
-
console.log("extendedAmountInBTC", extendedAmountInBTC);
|
|
34276
|
+
logger.info(`vesuAmountInBTC ${vesuAmountInBTC}, extendedAmountInBTC ${extendedAmountInBTC}`);
|
|
34105
34277
|
let calls = [];
|
|
34106
34278
|
if (vesuAmountInBTC.greaterThan(MINIMUM_EXTENDED_POSITION_SIZE)) {
|
|
34107
34279
|
const proofsInfo = vesuAdapter.getProofs(true, this.getMerkleTree());
|
|
@@ -34114,7 +34286,6 @@ var VesuExtendedMultiplierStrategy = class _VesuExtendedMultiplierStrategy exten
|
|
|
34114
34286
|
);
|
|
34115
34287
|
const { amount: wbtcAmountInVaultAllocator } = await this.getUnusedBalanceWBTC();
|
|
34116
34288
|
if (wbtcAmountInVaultAllocator.lessThan(vesuAmountInBTC)) {
|
|
34117
|
-
console.log("error wbtc amount in vault allocator is less than vesu amount in btc", wbtcAmountInVaultAllocator, vesuAmountInBTC);
|
|
34118
34289
|
const swapProofsInfo = avnuAdapter.getProofs(true, this.getMerkleTree());
|
|
34119
34290
|
const swapProofGroups = swapProofsInfo.proofs;
|
|
34120
34291
|
const swapCall = this.getManageCall(
|
|
@@ -34158,7 +34329,7 @@ var VesuExtendedMultiplierStrategy = class _VesuExtendedMultiplierStrategy exten
|
|
|
34158
34329
|
bid
|
|
34159
34330
|
} = await extendedAdapter.fetchOrderBookBTCUSDC();
|
|
34160
34331
|
const price = ask.plus(bid).dividedBy(2);
|
|
34161
|
-
const btcToken = vesuAdapter.config.supportedPositions[
|
|
34332
|
+
const btcToken = vesuAdapter.config.supportedPositions[0].asset;
|
|
34162
34333
|
const btcPriceAvnu = await avnuAdapter.getPriceOfToken(btcToken.address.toString());
|
|
34163
34334
|
if (!btcPriceAvnu) {
|
|
34164
34335
|
logger.error(`error getting btc price avnu: ${btcPriceAvnu}`);
|
|
@@ -34174,43 +34345,65 @@ var VesuExtendedMultiplierStrategy = class _VesuExtendedMultiplierStrategy exten
|
|
|
34174
34345
|
async handleWithdraw(amount) {
|
|
34175
34346
|
try {
|
|
34176
34347
|
const usdcBalanceVaultAllocator = await this.getUnusedBalance();
|
|
34177
|
-
const usdcBalanceDifference = amount.minus(usdcBalanceVaultAllocator.usdValue);
|
|
34348
|
+
const usdcBalanceDifference = amount.plus(BUFFER_USDC_IN_WITHDRAWAL).minus(usdcBalanceVaultAllocator.usdValue);
|
|
34178
34349
|
logger.info(`usdcBalanceDifference, ${usdcBalanceDifference.toNumber()}`);
|
|
34350
|
+
let calls = [];
|
|
34351
|
+
let status = true;
|
|
34179
34352
|
if (usdcBalanceDifference.lessThan(0)) {
|
|
34180
|
-
const
|
|
34181
|
-
amount
|
|
34353
|
+
const withdrawCall2 = await this.getBringLiquidityCall({
|
|
34354
|
+
amount: usdcBalanceVaultAllocator.amount
|
|
34182
34355
|
});
|
|
34183
|
-
logger.info("withdraw call",
|
|
34184
|
-
|
|
34356
|
+
logger.info("withdraw call", withdrawCall2);
|
|
34357
|
+
calls.push(withdrawCall2);
|
|
34358
|
+
return {
|
|
34359
|
+
calls,
|
|
34360
|
+
status: true
|
|
34361
|
+
};
|
|
34185
34362
|
}
|
|
34186
34363
|
const vesuAdapter = await this.getVesuAdapter();
|
|
34187
34364
|
const extendedAdapter = await this.getExtendedAdapter();
|
|
34188
34365
|
if (!vesuAdapter || !extendedAdapter || !extendedAdapter.client) {
|
|
34366
|
+
status = false;
|
|
34189
34367
|
logger.error(
|
|
34190
34368
|
`vesu or extended adapter not found: vesuAdapter=${vesuAdapter}, extendedAdapter=${extendedAdapter}`
|
|
34191
34369
|
);
|
|
34192
|
-
return
|
|
34370
|
+
return {
|
|
34371
|
+
calls,
|
|
34372
|
+
status
|
|
34373
|
+
};
|
|
34193
34374
|
}
|
|
34194
34375
|
const { collateralTokenAmount } = await vesuAdapter.vesuAdapter.getAssetPrices();
|
|
34195
34376
|
const {
|
|
34196
34377
|
collateralPrice
|
|
34197
34378
|
} = await this.getAssetPrices();
|
|
34198
34379
|
const extendedPositon = await extendedAdapter.getAllOpenPositions();
|
|
34380
|
+
if (!extendedPositon) {
|
|
34381
|
+
status = false;
|
|
34382
|
+
logger.error("error getting extended position", extendedPositon);
|
|
34383
|
+
return {
|
|
34384
|
+
calls,
|
|
34385
|
+
status
|
|
34386
|
+
};
|
|
34387
|
+
}
|
|
34199
34388
|
const amountDistributionForWithdrawal = await calculateAmountDistributionForWithdrawal(
|
|
34200
|
-
|
|
34389
|
+
usdcBalanceDifference,
|
|
34201
34390
|
collateralPrice.price,
|
|
34202
34391
|
collateralTokenAmount,
|
|
34203
34392
|
extendedPositon
|
|
34204
34393
|
);
|
|
34205
34394
|
if (!amountDistributionForWithdrawal) {
|
|
34395
|
+
status = false;
|
|
34206
34396
|
logger.error(
|
|
34207
34397
|
`error calculating amount distribution for withdrawal: ${amountDistributionForWithdrawal}`
|
|
34208
34398
|
);
|
|
34209
|
-
return
|
|
34399
|
+
return {
|
|
34400
|
+
calls,
|
|
34401
|
+
status
|
|
34402
|
+
};
|
|
34210
34403
|
}
|
|
34211
34404
|
const { vesu_amount, extended_amount } = amountDistributionForWithdrawal;
|
|
34212
|
-
if (vesu_amount.greaterThan(0)) {
|
|
34213
|
-
const
|
|
34405
|
+
if (status && vesu_amount.greaterThan(0)) {
|
|
34406
|
+
const { calls: vesuCalls, status: vesuStatus } = await this.moveAssets(
|
|
34214
34407
|
{
|
|
34215
34408
|
amount: vesu_amount,
|
|
34216
34409
|
from: Protocols.VESU.name,
|
|
@@ -34219,10 +34412,11 @@ var VesuExtendedMultiplierStrategy = class _VesuExtendedMultiplierStrategy exten
|
|
|
34219
34412
|
extendedAdapter,
|
|
34220
34413
|
vesuAdapter
|
|
34221
34414
|
);
|
|
34222
|
-
|
|
34415
|
+
status = vesuStatus;
|
|
34416
|
+
calls.push(...vesuCalls);
|
|
34223
34417
|
}
|
|
34224
|
-
if (extended_amount.greaterThan(0)) {
|
|
34225
|
-
const
|
|
34418
|
+
if (status && extended_amount.greaterThan(0)) {
|
|
34419
|
+
const { calls: extendedCalls, status: extendedStatus } = await this.moveAssets(
|
|
34226
34420
|
{
|
|
34227
34421
|
amount: extended_amount,
|
|
34228
34422
|
from: Protocols.EXTENDED.name,
|
|
@@ -34231,12 +34425,32 @@ var VesuExtendedMultiplierStrategy = class _VesuExtendedMultiplierStrategy exten
|
|
|
34231
34425
|
extendedAdapter,
|
|
34232
34426
|
vesuAdapter
|
|
34233
34427
|
);
|
|
34234
|
-
|
|
34428
|
+
status = extendedStatus;
|
|
34429
|
+
if (status) {
|
|
34430
|
+
calls.push(...extendedCalls);
|
|
34431
|
+
} else {
|
|
34432
|
+
logger.error("error moving assets to vault: extendedStatus: ${extendedStatus}");
|
|
34433
|
+
return {
|
|
34434
|
+
calls: [],
|
|
34435
|
+
status
|
|
34436
|
+
};
|
|
34437
|
+
}
|
|
34235
34438
|
}
|
|
34236
|
-
|
|
34439
|
+
const withdrawCall = await this.getBringLiquidityCall({
|
|
34440
|
+
amount
|
|
34441
|
+
});
|
|
34442
|
+
logger.info("withdraw call", withdrawCall);
|
|
34443
|
+
calls.push(withdrawCall);
|
|
34444
|
+
return {
|
|
34445
|
+
calls,
|
|
34446
|
+
status
|
|
34447
|
+
};
|
|
34237
34448
|
} catch (err) {
|
|
34238
34449
|
logger.error(`error handling withdrawal: ${err}`);
|
|
34239
|
-
return
|
|
34450
|
+
return {
|
|
34451
|
+
calls: [],
|
|
34452
|
+
status: false
|
|
34453
|
+
};
|
|
34240
34454
|
}
|
|
34241
34455
|
}
|
|
34242
34456
|
async getAUM() {
|
|
@@ -34370,6 +34584,7 @@ function getLooperSettings2(lstSymbol, underlyingSymbol, vaultSettings, pool1, e
|
|
|
34370
34584
|
() => vesuMultiplyAdapter.getWithdrawLeaf()
|
|
34371
34585
|
);
|
|
34372
34586
|
vaultSettings.leafAdapters.push(() => extendedAdapter.getDepositLeaf());
|
|
34587
|
+
vaultSettings.leafAdapters.push(() => extendedAdapter.getSwapFromLegacyLeaf());
|
|
34373
34588
|
vaultSettings.leafAdapters.push(() => avnuAdapter.getDepositLeaf());
|
|
34374
34589
|
vaultSettings.leafAdapters.push(() => avnuAdapter.getWithdrawLeaf());
|
|
34375
34590
|
vaultSettings.leafAdapters.push(
|