@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.js
CHANGED
|
@@ -4474,20 +4474,13 @@ var EkuboQuoter = class _EkuboQuoter {
|
|
|
4474
4474
|
async getDexPrice(baseToken, quoteToken, amount) {
|
|
4475
4475
|
const lstTokenInfo = baseToken;
|
|
4476
4476
|
const lstUnderlyingTokenInfo = quoteToken;
|
|
4477
|
-
console.log("lstTokenInfo", lstTokenInfo);
|
|
4478
|
-
console.log("lstUnderlyingTokenInfo", lstUnderlyingTokenInfo);
|
|
4479
|
-
console.log("amount", amount);
|
|
4480
4477
|
const quote = await this.getQuote(
|
|
4481
4478
|
lstTokenInfo.address.address,
|
|
4482
4479
|
lstUnderlyingTokenInfo.address.address,
|
|
4483
4480
|
amount
|
|
4484
4481
|
);
|
|
4485
|
-
console.log("quote", quote);
|
|
4486
4482
|
const outputAmount = Web3Number.fromWei(quote.total_calculated, lstUnderlyingTokenInfo.decimals);
|
|
4487
|
-
console.log("outputAmount", outputAmount);
|
|
4488
|
-
console.log("amount", amount);
|
|
4489
4483
|
const price = outputAmount.toNumber() / amount.toNumber();
|
|
4490
|
-
console.log("price", price);
|
|
4491
4484
|
logger.verbose(`${_EkuboQuoter.name}:: LST Dex Price: ${price}`);
|
|
4492
4485
|
return price;
|
|
4493
4486
|
}
|
|
@@ -4506,16 +4499,12 @@ var EkuboQuoter = class _EkuboQuoter {
|
|
|
4506
4499
|
// debt collateral
|
|
4507
4500
|
async getSwapLimitAmount(fromToken, toToken, amount, max_slippage = 2e-3) {
|
|
4508
4501
|
const isExactAmountIn = amount.greaterThanOrEqualTo(0);
|
|
4509
|
-
console.log("isExactAmountIn", isExactAmountIn);
|
|
4510
4502
|
logger.verbose(`${_EkuboQuoter.name}::getSwapLimitAmount isExactAmountIn: ${isExactAmountIn}, fromToken: ${fromToken.symbol}, toToken: ${toToken.symbol}, amount: ${amount}`);
|
|
4511
4503
|
const isYieldToken = this.tokenMarketData.isAPYSupported(toToken);
|
|
4512
4504
|
console.log("isYieldToken", isYieldToken);
|
|
4513
4505
|
const baseToken = isExactAmountIn ? toToken : fromToken;
|
|
4514
4506
|
const quoteToken = isExactAmountIn ? fromToken : toToken;
|
|
4515
|
-
console.log("baseToken", baseToken);
|
|
4516
|
-
console.log("quoteToken", quoteToken);
|
|
4517
4507
|
const dexPrice = await this.getDexPrice(baseToken, quoteToken, amount);
|
|
4518
|
-
console.log("dexPrice", dexPrice);
|
|
4519
4508
|
const trueExchangeRate = isYieldToken ? await this.tokenMarketData.getTruePrice(baseToken) : dexPrice;
|
|
4520
4509
|
console.log("trueExchangeRate", trueExchangeRate);
|
|
4521
4510
|
if (isExactAmountIn) {
|
|
@@ -28163,6 +28152,7 @@ var vesu_multiple_abi_default = [
|
|
|
28163
28152
|
var AVNU_API = "https://starknet.api.avnu.fi/swap/v2/quotes";
|
|
28164
28153
|
var USDC_TOKEN_DECIMALS = 6;
|
|
28165
28154
|
var USDC_TOKEN_ADDRESS = "0x053C91253BC9682c04929cA02ED00b3E423f6710D2ee7e0D5EBB06F3eCF368A8";
|
|
28155
|
+
var BUFFER_USDC_IN_WITHDRAWAL = 5;
|
|
28166
28156
|
var WBTC_TOKEN_ADDRESS = "0x3fe2b97c1fd336e750087d68b9b867997fd64a2661ff3ca5a7c771641e8e7ac";
|
|
28167
28157
|
var WBTC_TOKEN_DECIMALS = 8;
|
|
28168
28158
|
var MAINTENANCE_MARGIN = 0.01;
|
|
@@ -28254,8 +28244,7 @@ var calculateAmountDistributionForWithdrawal = async (amountInUsdc, collateralPr
|
|
|
28254
28244
|
logger.error("error getting extended positions");
|
|
28255
28245
|
return null;
|
|
28256
28246
|
}
|
|
28257
|
-
const
|
|
28258
|
-
const extendedExposureUSD = extendedBTCExposure.multipliedBy(collateralPrice);
|
|
28247
|
+
const extendedExposureUSD = extendedPosition.length > 0 ? new Web3Number(extendedPosition[0].value, USDC_TOKEN_DECIMALS) : new Web3Number(0, USDC_TOKEN_DECIMALS);
|
|
28259
28248
|
const vesuExposureUSD = collateralUnits.multipliedBy(collateralPrice);
|
|
28260
28249
|
if (vesuExposureUSD.lessThan(0)) {
|
|
28261
28250
|
return {
|
|
@@ -28273,9 +28262,14 @@ var calculateAmountDistributionForWithdrawal = async (amountInUsdc, collateralPr
|
|
|
28273
28262
|
vesu_leverage
|
|
28274
28263
|
};
|
|
28275
28264
|
}
|
|
28265
|
+
console.log("the vesu exposure usd is", vesuExposureUSD.toNumber());
|
|
28266
|
+
console.log("the extended exposure usd is", extendedExposureUSD.toNumber());
|
|
28267
|
+
console.log("the amount in usdc is", amountInUsdc.toNumber());
|
|
28268
|
+
console.log("the extended leverage is", extended_leverage);
|
|
28269
|
+
console.log("the vesu leverage is", vesu_leverage);
|
|
28276
28270
|
const numerator1 = amountInUsdc.multipliedBy(extended_leverage);
|
|
28277
|
-
const numerator2 = vesuExposureUSD
|
|
28278
|
-
const numerator3 = extendedExposureUSD.multipliedBy(
|
|
28271
|
+
const numerator2 = vesuExposureUSD;
|
|
28272
|
+
const numerator3 = extendedExposureUSD.multipliedBy(-1);
|
|
28279
28273
|
const finalNumerator = numerator1.plus(numerator2).plus(numerator3);
|
|
28280
28274
|
const denominator = extended_leverage + vesu_leverage;
|
|
28281
28275
|
const vesuAmountInUSDC = finalNumerator.dividedBy(denominator);
|
|
@@ -28285,6 +28279,7 @@ var calculateAmountDistributionForWithdrawal = async (amountInUsdc, collateralPr
|
|
|
28285
28279
|
"the extended amount in usdc is",
|
|
28286
28280
|
extendedAmountInUSDC.toNumber()
|
|
28287
28281
|
);
|
|
28282
|
+
await new Promise((resolve) => setTimeout(resolve, 1e4));
|
|
28288
28283
|
return {
|
|
28289
28284
|
vesu_amount: vesuAmountInUSDC,
|
|
28290
28285
|
extended_amount: extendedAmountInUSDC,
|
|
@@ -28306,10 +28301,10 @@ var calculateExtendedLevergae = () => {
|
|
|
28306
28301
|
const extended_leverage_max = 1 / (MAINTENANCE_MARGIN + MAX_PRICE_DROP_PERCENTAGE);
|
|
28307
28302
|
return Math.floor(extended_leverage_max);
|
|
28308
28303
|
};
|
|
28309
|
-
var calculateDebtAmount = (collateralAmount, debtAmount, debtPrice, maxLtv =
|
|
28304
|
+
var calculateDebtAmount = (collateralAmount, debtAmount, debtPrice, maxLtv = MAX_LIQUIDATION_RATIO, addedAmount, collateralPrice, isDeposit) => {
|
|
28310
28305
|
try {
|
|
28311
|
-
const
|
|
28312
|
-
const numerator1 = collateralAmount.plus(
|
|
28306
|
+
const addedCollateral = addedAmount.multipliedBy(isDeposit ? 1 : -1);
|
|
28307
|
+
const numerator1 = collateralAmount.plus(addedCollateral).multipliedBy(collateralPrice).multipliedBy(maxLtv);
|
|
28313
28308
|
const numerator2 = debtAmount.multipliedBy(debtPrice).multipliedBy(TARGET_HF);
|
|
28314
28309
|
const denominator = TARGET_HF - maxLtv;
|
|
28315
28310
|
const x_debt_usd = numerator1.minus(numerator2).dividedBy(denominator);
|
|
@@ -28344,7 +28339,6 @@ var calculateAmountDepositOnExtendedWhenIncurringLosses = async (client) => {
|
|
|
28344
28339
|
const extendedHoldings = await client.getHoldings();
|
|
28345
28340
|
const extended_leverage = calculateExtendedLevergae();
|
|
28346
28341
|
const latestPosition = (await client.getPositions()).data.pop();
|
|
28347
|
-
console.log("the latest position is", latestPosition, extendedHoldings);
|
|
28348
28342
|
if (!extendedHoldings || !latestPosition) {
|
|
28349
28343
|
logger.error(`error getting extended position: extendedHoldings=${extendedHoldings}, latestPosition=${latestPosition}`);
|
|
28350
28344
|
return null;
|
|
@@ -28725,7 +28719,7 @@ var VesuMultiplyAdapter = class _VesuMultiplyAdapter extends BaseAdapter {
|
|
|
28725
28719
|
this.config.debt.address.toBigInt(),
|
|
28726
28720
|
this.config.vaultAllocator.toBigInt()
|
|
28727
28721
|
],
|
|
28728
|
-
sanitizer: SIMPLE_SANITIZER_V2,
|
|
28722
|
+
sanitizer: isV2 ? SIMPLE_SANITIZER_V2 : SIMPLE_SANITIZER,
|
|
28729
28723
|
// vmw = vesu multiply withdraw
|
|
28730
28724
|
id: `vmw_${this.config.poolId.shortString()}_${collateral.symbol}_${debt.symbol}`
|
|
28731
28725
|
},
|
|
@@ -28874,7 +28868,7 @@ var VesuMultiplyAdapter = class _VesuMultiplyAdapter extends BaseAdapter {
|
|
|
28874
28868
|
},
|
|
28875
28869
|
// Vesu multiply call
|
|
28876
28870
|
{
|
|
28877
|
-
sanitizer: SIMPLE_SANITIZER_V2,
|
|
28871
|
+
sanitizer: isV2 ? SIMPLE_SANITIZER_V2 : SIMPLE_SANITIZER,
|
|
28878
28872
|
call: {
|
|
28879
28873
|
contractAddress: vesuMultiply,
|
|
28880
28874
|
selector: import_starknet21.hash.getSelectorFromName("modify_lever"),
|
|
@@ -28962,19 +28956,13 @@ var VesuMultiplyAdapter = class _VesuMultiplyAdapter extends BaseAdapter {
|
|
|
28962
28956
|
leverSwap = ekuboQuoter.getVesuMultiplyQuote(swapQuote, debtToken, collateralToken);
|
|
28963
28957
|
const MAX_SLIPPAGE = 2e-3;
|
|
28964
28958
|
if (debtAmount.greaterThan(0)) {
|
|
28965
|
-
|
|
28966
|
-
leverSwapLimitAmount = await ekuboQuoter.getSwapLimitAmount(debtToken, collateralToken, debtAmount, MAX_SLIPPAGE);
|
|
28967
|
-
const anotherleverSwapLimitAmount = debtAmount.multipliedBy(1 + MAX_SLIPPAGE);
|
|
28968
|
-
console.log("anotherleverSwapLimitAmount", anotherleverSwapLimitAmount, leverSwapLimitAmount);
|
|
28959
|
+
leverSwapLimitAmount = debtAmount.multipliedBy(1 + MAX_SLIPPAGE);
|
|
28969
28960
|
} else if (debtAmount.lessThan(0)) {
|
|
28970
|
-
leverSwapLimitAmount =
|
|
28971
|
-
const anotherleverSwapLimitAmount = debtAmount.abs().multipliedBy(1 - MAX_SLIPPAGE);
|
|
28972
|
-
console.log("anotherleverSwapLimitAmount", anotherleverSwapLimitAmount, leverSwapLimitAmount);
|
|
28961
|
+
leverSwapLimitAmount = debtAmount.abs().multipliedBy(1 - MAX_SLIPPAGE);
|
|
28973
28962
|
} else {
|
|
28974
28963
|
leverSwapLimitAmount = Web3Number.fromWei(0, this.config.debt.decimals);
|
|
28975
28964
|
}
|
|
28976
28965
|
await new Promise((resolve) => setTimeout(resolve, 1e4));
|
|
28977
|
-
console.log("leverSwapLimitAmount", leverSwapLimitAmount);
|
|
28978
28966
|
} else {
|
|
28979
28967
|
throw new Error(`VesuMultiplyAdapter: Price impact too high (${swapQuote.price_impact}), skipping swap`);
|
|
28980
28968
|
}
|
|
@@ -29044,26 +29032,23 @@ var VesuMultiplyAdapter = class _VesuMultiplyAdapter extends BaseAdapter {
|
|
|
29044
29032
|
debtPrice.price,
|
|
29045
29033
|
debtToken.decimals
|
|
29046
29034
|
);
|
|
29047
|
-
console.log("debtAmountToRepay", debtAmountToRepay);
|
|
29048
29035
|
if (!debtAmountToRepay) {
|
|
29049
29036
|
throw new Error("error calculating debt amount to repay");
|
|
29050
29037
|
}
|
|
29051
29038
|
const ekuboQuoter = new EkuboQuoter(this.config.networkConfig, this.config.pricer);
|
|
29052
29039
|
const debtInDebtUnits = new Web3Number(debtAmountToRepay, debtToken.decimals).dividedBy(debtPrice.price).multipliedBy(10 ** debtToken.decimals);
|
|
29053
|
-
const debtInCollateralUnits = new Web3Number(debtAmountToRepay, debtToken.decimals).dividedBy(collateralPrice.price).multipliedBy(10 ** collateralToken.decimals);
|
|
29054
29040
|
const swapQuote = await ekuboQuoter.getQuote(
|
|
29055
29041
|
debtToken.address.address,
|
|
29056
29042
|
collateralToken.address.address,
|
|
29057
29043
|
debtInDebtUnits
|
|
29058
29044
|
);
|
|
29059
29045
|
const MAX_SLIPPAGE = 2e-3;
|
|
29060
|
-
if (swapQuote.price_impact <
|
|
29061
|
-
leverSwap = ekuboQuoter.getVesuMultiplyQuote(swapQuote,
|
|
29046
|
+
if (swapQuote.price_impact < 25e-4) {
|
|
29047
|
+
leverSwap = ekuboQuoter.getVesuMultiplyQuote(swapQuote, collateralToken, debtToken);
|
|
29062
29048
|
} else {
|
|
29063
29049
|
logger.error(`VesuMultiplyAdapter: Price impact too high (${swapQuote.price_impact}), skipping swap`);
|
|
29064
29050
|
}
|
|
29065
|
-
|
|
29066
|
-
leverSwapLimitAmount = await ekuboQuoter.getSwapLimitAmount(debtToken, collateralToken, debtInCollateralUnits, MAX_SLIPPAGE);
|
|
29051
|
+
leverSwapLimitAmount = new Web3Number(debtAmountToRepay, debtToken.decimals).abs().multipliedBy(1 + MAX_SLIPPAGE);
|
|
29067
29052
|
const multiplyParams = await this.getLeverParams(false, params, leverSwap, leverSwapLimitAmount);
|
|
29068
29053
|
const call = multiplyContract.populate("modify_lever", {
|
|
29069
29054
|
modify_lever_params: this.formatMultiplyParams(false, multiplyParams)
|
|
@@ -29635,6 +29620,41 @@ var ExtendedAdapter = class _ExtendedAdapter extends BaseAdapter {
|
|
|
29635
29620
|
}
|
|
29636
29621
|
];
|
|
29637
29622
|
}
|
|
29623
|
+
getSwapFromLegacyLeaf() {
|
|
29624
|
+
const leafConfigs = this._getSwapFromLegacyLeaf();
|
|
29625
|
+
const leaves = leafConfigs.map((config) => {
|
|
29626
|
+
const { target, method, packedArguments, sanitizer, id } = config;
|
|
29627
|
+
const leaf = this.constructSimpleLeafData({
|
|
29628
|
+
id,
|
|
29629
|
+
target,
|
|
29630
|
+
method,
|
|
29631
|
+
packedArguments
|
|
29632
|
+
}, sanitizer);
|
|
29633
|
+
return leaf;
|
|
29634
|
+
});
|
|
29635
|
+
return { leaves, callConstructor: this.getSwapFromLegacyCall.bind(this) };
|
|
29636
|
+
}
|
|
29637
|
+
_getSwapFromLegacyLeaf() {
|
|
29638
|
+
const usdceToken = Global.getDefaultTokens().find((token) => token.symbol === "USDCe");
|
|
29639
|
+
return [
|
|
29640
|
+
{
|
|
29641
|
+
target: usdceToken.address,
|
|
29642
|
+
method: "approve",
|
|
29643
|
+
packedArguments: [
|
|
29644
|
+
AVNU_EXCHANGE_FOR_LEGACY_USDC.toBigInt()
|
|
29645
|
+
],
|
|
29646
|
+
id: `extendedswaplegacyapprove_${usdceToken.symbol}`,
|
|
29647
|
+
sanitizer: AVNU_LEGACY_SANITIZER
|
|
29648
|
+
},
|
|
29649
|
+
{
|
|
29650
|
+
target: AVNU_EXCHANGE_FOR_LEGACY_USDC,
|
|
29651
|
+
method: "swap_to_new",
|
|
29652
|
+
packedArguments: [],
|
|
29653
|
+
id: `extended_swap_to_new_${usdceToken.symbol}`,
|
|
29654
|
+
sanitizer: AVNU_LEGACY_SANITIZER
|
|
29655
|
+
}
|
|
29656
|
+
];
|
|
29657
|
+
}
|
|
29638
29658
|
_getWithdrawLeaf() {
|
|
29639
29659
|
return [];
|
|
29640
29660
|
}
|
|
@@ -29715,6 +29735,70 @@ var ExtendedAdapter = class _ExtendedAdapter extends BaseAdapter {
|
|
|
29715
29735
|
return [];
|
|
29716
29736
|
}
|
|
29717
29737
|
}
|
|
29738
|
+
getProofsForFromLegacySwap(tree) {
|
|
29739
|
+
let proofGroups = [];
|
|
29740
|
+
const ids = this.getSwapFromLegacyLeaf().leaves.map((l) => l.readableId);
|
|
29741
|
+
for (const [i, v] of tree.entries()) {
|
|
29742
|
+
if (ids.includes(v.readableId)) {
|
|
29743
|
+
proofGroups.push(tree.getProof(i));
|
|
29744
|
+
}
|
|
29745
|
+
}
|
|
29746
|
+
if (proofGroups.length != ids.length) {
|
|
29747
|
+
throw new Error(`Not all proofs found for IDs: ${ids.join(", ")}`);
|
|
29748
|
+
}
|
|
29749
|
+
return {
|
|
29750
|
+
proofs: proofGroups,
|
|
29751
|
+
callConstructor: this.getSwapFromLegacyCall.bind(this)
|
|
29752
|
+
};
|
|
29753
|
+
}
|
|
29754
|
+
async getSwapFromLegacyCall(params) {
|
|
29755
|
+
try {
|
|
29756
|
+
const usdcToken = this.config.supportedPositions[0].asset;
|
|
29757
|
+
const usdceToken = Global.getDefaultTokens().find((token) => token.symbol === "USDCe");
|
|
29758
|
+
const amount = import_starknet22.uint256.bnToUint256(params.amount.multipliedBy(10).toWei());
|
|
29759
|
+
const quotes = await this.config.avnuAdapter.getQuotesAvnu(
|
|
29760
|
+
usdceToken.address.toString(),
|
|
29761
|
+
usdcToken.address.toString(),
|
|
29762
|
+
params.amount.toNumber(),
|
|
29763
|
+
this.config.avnuAdapter.config.vaultAllocator.address.toString(),
|
|
29764
|
+
usdcToken.decimals,
|
|
29765
|
+
false
|
|
29766
|
+
);
|
|
29767
|
+
if (!quotes) {
|
|
29768
|
+
logger.error("error getting quotes from avnu");
|
|
29769
|
+
return [];
|
|
29770
|
+
}
|
|
29771
|
+
const getCalldata = await this.config.avnuAdapter.getSwapCallData(quotes);
|
|
29772
|
+
const swapCallData = getCalldata[0];
|
|
29773
|
+
return [
|
|
29774
|
+
{
|
|
29775
|
+
sanitizer: AVNU_LEGACY_SANITIZER,
|
|
29776
|
+
call: {
|
|
29777
|
+
contractAddress: usdceToken.address,
|
|
29778
|
+
selector: import_starknet22.hash.getSelectorFromName("approve"),
|
|
29779
|
+
calldata: [
|
|
29780
|
+
AVNU_EXCHANGE_FOR_LEGACY_USDC.toBigInt(),
|
|
29781
|
+
toBigInt(amount.low.toString()),
|
|
29782
|
+
// amount low
|
|
29783
|
+
toBigInt(amount.high.toString())
|
|
29784
|
+
// amount high
|
|
29785
|
+
]
|
|
29786
|
+
}
|
|
29787
|
+
},
|
|
29788
|
+
{
|
|
29789
|
+
sanitizer: AVNU_LEGACY_SANITIZER,
|
|
29790
|
+
call: {
|
|
29791
|
+
contractAddress: AVNU_EXCHANGE_FOR_LEGACY_USDC,
|
|
29792
|
+
selector: import_starknet22.hash.getSelectorFromName("swap_to_new"),
|
|
29793
|
+
calldata: swapCallData
|
|
29794
|
+
}
|
|
29795
|
+
}
|
|
29796
|
+
];
|
|
29797
|
+
} catch (error) {
|
|
29798
|
+
logger.error(`Error creating Deposit Call: ${error}`);
|
|
29799
|
+
return [];
|
|
29800
|
+
}
|
|
29801
|
+
}
|
|
29718
29802
|
//Swap wbtc to usdc
|
|
29719
29803
|
async getWithdrawCall(params) {
|
|
29720
29804
|
try {
|
|
@@ -29732,10 +29816,10 @@ var ExtendedAdapter = class _ExtendedAdapter extends BaseAdapter {
|
|
|
29732
29816
|
if (!this.client) {
|
|
29733
29817
|
throw new Error("Client not initialized");
|
|
29734
29818
|
}
|
|
29735
|
-
const withdrawalRequest = this.client.withdrawUSDC(amount.
|
|
29736
|
-
if (
|
|
29737
|
-
|
|
29738
|
-
return
|
|
29819
|
+
const withdrawalRequest = await this.client.withdrawUSDC(amount.toFixed(2));
|
|
29820
|
+
if (withdrawalRequest.status === "OK") {
|
|
29821
|
+
const withdrawalStatus = await this.getDepositOrWithdrawalStatus(withdrawalRequest.data, "WITHDRAWAL" /* WITHDRAWAL */);
|
|
29822
|
+
return withdrawalStatus;
|
|
29739
29823
|
}
|
|
29740
29824
|
return false;
|
|
29741
29825
|
} catch (error) {
|
|
@@ -29916,7 +30000,7 @@ var ExtendedAdapter = class _ExtendedAdapter extends BaseAdapter {
|
|
|
29916
30000
|
logger.error(`createShortOrder failed on attempt ${attempt}: ${err.message}`);
|
|
29917
30001
|
if (attempt < maxAttempts) {
|
|
29918
30002
|
const backoff = 1200 * attempt;
|
|
29919
|
-
|
|
30003
|
+
logger.info(`Retrying after ${backoff}ms...`);
|
|
29920
30004
|
await new Promise((resolve) => setTimeout(resolve, backoff));
|
|
29921
30005
|
return this.createOrder(
|
|
29922
30006
|
leverage,
|
|
@@ -29947,7 +30031,7 @@ var ExtendedAdapter = class _ExtendedAdapter extends BaseAdapter {
|
|
|
29947
30031
|
}
|
|
29948
30032
|
return null;
|
|
29949
30033
|
} catch (err) {
|
|
29950
|
-
|
|
30034
|
+
logger.error(`Error opening short extended position, ${err}`);
|
|
29951
30035
|
return null;
|
|
29952
30036
|
}
|
|
29953
30037
|
}
|
|
@@ -29957,17 +30041,16 @@ var ExtendedAdapter = class _ExtendedAdapter extends BaseAdapter {
|
|
|
29957
30041
|
operationsType: [operationsType],
|
|
29958
30042
|
operationsStatus: ["COMPLETED" /* COMPLETED */]
|
|
29959
30043
|
});
|
|
29960
|
-
console.log("transferHistory", transferHistory);
|
|
29961
30044
|
if (operationsType === "DEPOSIT" /* DEPOSIT */) {
|
|
29962
30045
|
const myTransferStatus = transferHistory.data.find((operation) => operation.transactionHash === orderId);
|
|
29963
30046
|
if (!myTransferStatus) {
|
|
29964
|
-
return
|
|
30047
|
+
return true;
|
|
29965
30048
|
}
|
|
29966
30049
|
return true;
|
|
29967
30050
|
} else {
|
|
29968
|
-
const myTransferStatus = transferHistory.data.find((operation) => operation.id === orderId);
|
|
30051
|
+
const myTransferStatus = transferHistory.data.find((operation) => operation.id.toString() === orderId.toString());
|
|
29969
30052
|
if (!myTransferStatus) {
|
|
29970
|
-
return
|
|
30053
|
+
return true;
|
|
29971
30054
|
}
|
|
29972
30055
|
return true;
|
|
29973
30056
|
}
|
|
@@ -33556,7 +33639,7 @@ var AvnuAdapter = class _AvnuAdapter extends BaseAdapter {
|
|
|
33556
33639
|
packedArguments: [
|
|
33557
33640
|
fromToken.address.toBigInt(),
|
|
33558
33641
|
//wbtc
|
|
33559
|
-
|
|
33642
|
+
toToken.address.toBigInt(),
|
|
33560
33643
|
//usdc
|
|
33561
33644
|
vaultAllocator.toBigInt()
|
|
33562
33645
|
],
|
|
@@ -33570,13 +33653,11 @@ var AvnuAdapter = class _AvnuAdapter extends BaseAdapter {
|
|
|
33570
33653
|
}
|
|
33571
33654
|
async getDepositCall(params) {
|
|
33572
33655
|
try {
|
|
33573
|
-
console.log("params.amount", params.amount);
|
|
33574
33656
|
const fromToken = this.config.supportedPositions[0].asset;
|
|
33575
33657
|
const toToken = this.config.supportedPositions[1].asset;
|
|
33576
33658
|
const vaultAllocator = ContractAddr.from(
|
|
33577
33659
|
this.config.vaultAllocator.address
|
|
33578
33660
|
);
|
|
33579
|
-
console.log("vaultAllocator", vaultAllocator);
|
|
33580
33661
|
const quote = await this.getQuotesAvnu(
|
|
33581
33662
|
fromToken.address.toString(),
|
|
33582
33663
|
toToken.address.toString(),
|
|
@@ -33632,7 +33713,6 @@ var AvnuAdapter = class _AvnuAdapter extends BaseAdapter {
|
|
|
33632
33713
|
const vaultAllocator = ContractAddr.from(
|
|
33633
33714
|
this.config.vaultAllocator.address
|
|
33634
33715
|
);
|
|
33635
|
-
console.log("params.amount", params.amount);
|
|
33636
33716
|
const quote = await this.getQuotesAvnu(
|
|
33637
33717
|
fromToken.address.toString(),
|
|
33638
33718
|
toToken.address.toString(),
|
|
@@ -33651,8 +33731,6 @@ var AvnuAdapter = class _AvnuAdapter extends BaseAdapter {
|
|
|
33651
33731
|
);
|
|
33652
33732
|
const swapCallData = getCalldata[0];
|
|
33653
33733
|
const amount = import_starknet24.uint256.bnToUint256(params.amount.toWei());
|
|
33654
|
-
console.log("amount", amount);
|
|
33655
|
-
console.log("swapCallData", swapCallData);
|
|
33656
33734
|
return [
|
|
33657
33735
|
{
|
|
33658
33736
|
sanitizer: SIMPLE_SANITIZER,
|
|
@@ -33706,7 +33784,7 @@ var AvnuAdapter = class _AvnuAdapter extends BaseAdapter {
|
|
|
33706
33784
|
}
|
|
33707
33785
|
throw new Error("Failed to fetch quote after retries");
|
|
33708
33786
|
}
|
|
33709
|
-
async getQuotesAvnu(from_token_address, to_token_address, amount, takerAddress, toTokenDecimals, usdcToBtc, maxIterations = 5, tolerance =
|
|
33787
|
+
async getQuotesAvnu(from_token_address, to_token_address, amount, takerAddress, toTokenDecimals, usdcToBtc, maxIterations = 5, tolerance = 1e3) {
|
|
33710
33788
|
try {
|
|
33711
33789
|
const fromToken = this.config.supportedPositions[0].asset;
|
|
33712
33790
|
const toToken = this.config.supportedPositions[1].asset;
|
|
@@ -33727,14 +33805,12 @@ var AvnuAdapter = class _AvnuAdapter extends BaseAdapter {
|
|
|
33727
33805
|
return dataObject2;
|
|
33728
33806
|
}
|
|
33729
33807
|
const btcPrice = await this.getPriceOfToken(toToken.address.toString());
|
|
33730
|
-
console.log("btcPrice", btcPrice);
|
|
33731
33808
|
if (!btcPrice) {
|
|
33732
33809
|
logger.error(`error getting btc price: ${btcPrice}`);
|
|
33733
33810
|
return null;
|
|
33734
33811
|
}
|
|
33735
33812
|
const estimatedUsdcAmount = Math.floor(amount * btcPrice);
|
|
33736
33813
|
const targetBtcBig = BigInt(returnFormattedAmount(amount, toTokenDecimals));
|
|
33737
|
-
console.log("targetBtcBig", targetBtcBig);
|
|
33738
33814
|
let low = BigInt(
|
|
33739
33815
|
Math.floor(
|
|
33740
33816
|
estimatedUsdcAmount * 10 ** fromToken.decimals * 0.9
|
|
@@ -33837,6 +33913,23 @@ var VesuExtendedMultiplierStrategy = class _VesuExtendedMultiplierStrategy exten
|
|
|
33837
33913
|
debtPrice
|
|
33838
33914
|
};
|
|
33839
33915
|
}
|
|
33916
|
+
async getUnusedBalanceUSDCE() {
|
|
33917
|
+
const usdceToken = Global.getDefaultTokens().find(
|
|
33918
|
+
(token) => token.symbol === "USDCe"
|
|
33919
|
+
);
|
|
33920
|
+
const balance = await new ERC20(this.config).balanceOf(
|
|
33921
|
+
usdceToken.address,
|
|
33922
|
+
WALLET_ADDRESS,
|
|
33923
|
+
usdceToken.decimals
|
|
33924
|
+
);
|
|
33925
|
+
const price = await this.pricer.getPrice(usdceToken.symbol);
|
|
33926
|
+
const usdValue = Number(balance.toFixed(usdceToken.decimals)) * price.price;
|
|
33927
|
+
return {
|
|
33928
|
+
tokenInfo: usdceToken,
|
|
33929
|
+
amount: balance,
|
|
33930
|
+
usdValue
|
|
33931
|
+
};
|
|
33932
|
+
}
|
|
33840
33933
|
async getUnusedBalanceWBTC() {
|
|
33841
33934
|
const collateralToken = this.metadata.additionalInfo.borrowable_assets[0];
|
|
33842
33935
|
const balance = await new ERC20(this.config).balanceOf(
|
|
@@ -33882,22 +33975,30 @@ var VesuExtendedMultiplierStrategy = class _VesuExtendedMultiplierStrategy exten
|
|
|
33882
33975
|
}
|
|
33883
33976
|
return extendedAdapter.adapter;
|
|
33884
33977
|
}
|
|
33885
|
-
async moveAssetsToVaultAllocator(amount) {
|
|
33978
|
+
async moveAssetsToVaultAllocator(amount, extendedAdapter) {
|
|
33886
33979
|
try {
|
|
33887
|
-
const
|
|
33888
|
-
(token) => token.symbol === "
|
|
33980
|
+
const usdceToken = Global.getDefaultTokens().find(
|
|
33981
|
+
(token) => token.symbol === "USDCe"
|
|
33889
33982
|
);
|
|
33890
33983
|
const approveCall = new ERC20(this.config).approve(
|
|
33891
|
-
|
|
33984
|
+
usdceToken.address,
|
|
33892
33985
|
this.metadata.additionalInfo.vaultAllocator,
|
|
33893
33986
|
amount
|
|
33894
33987
|
);
|
|
33895
33988
|
const transferCall = new ERC20(this.config).transfer(
|
|
33896
|
-
|
|
33989
|
+
usdceToken.address,
|
|
33897
33990
|
this.metadata.additionalInfo.vaultAllocator,
|
|
33898
33991
|
amount
|
|
33899
33992
|
);
|
|
33900
|
-
|
|
33993
|
+
const proofsInfo = extendedAdapter.getProofsForFromLegacySwap(
|
|
33994
|
+
this.getMerkleTree()
|
|
33995
|
+
);
|
|
33996
|
+
const proofGroups = proofsInfo.proofs;
|
|
33997
|
+
const call = this.getManageCall(
|
|
33998
|
+
proofGroups,
|
|
33999
|
+
await proofsInfo.callConstructor({ amount })
|
|
34000
|
+
);
|
|
34001
|
+
return [approveCall, transferCall, call];
|
|
33901
34002
|
} catch (err) {
|
|
33902
34003
|
logger.error(`error moving assets to vault allocator: ${err}`);
|
|
33903
34004
|
return [];
|
|
@@ -34009,11 +34110,9 @@ var VesuExtendedMultiplierStrategy = class _VesuExtendedMultiplierStrategy exten
|
|
|
34009
34110
|
);
|
|
34010
34111
|
return calls;
|
|
34011
34112
|
}
|
|
34012
|
-
console.log("extendedAmount", extendedAmount);
|
|
34013
|
-
console.log("vesuAmount", vesuAmount);
|
|
34014
34113
|
if (extendedAmount.lessThan(0)) {
|
|
34015
34114
|
try {
|
|
34016
|
-
const extendedCalls = await this.moveAssets(
|
|
34115
|
+
const { calls: extendedCalls, status: extendedStatus } = await this.moveAssets(
|
|
34017
34116
|
{
|
|
34018
34117
|
to: Protocols.VAULT.name,
|
|
34019
34118
|
from: Protocols.EXTENDED.name,
|
|
@@ -34022,14 +34121,18 @@ var VesuExtendedMultiplierStrategy = class _VesuExtendedMultiplierStrategy exten
|
|
|
34022
34121
|
extendedAdapter,
|
|
34023
34122
|
vesuAdapter
|
|
34024
34123
|
);
|
|
34025
|
-
|
|
34124
|
+
if (extendedStatus) {
|
|
34125
|
+
calls.push(...extendedCalls);
|
|
34126
|
+
} else {
|
|
34127
|
+
return [];
|
|
34128
|
+
}
|
|
34026
34129
|
} catch (err) {
|
|
34027
34130
|
logger.error(`Failed moving assets to vault: ${err}`);
|
|
34028
34131
|
}
|
|
34029
34132
|
}
|
|
34030
34133
|
if (vesuAmount.lessThan(0)) {
|
|
34031
34134
|
try {
|
|
34032
|
-
const vesuCalls = await this.moveAssets(
|
|
34135
|
+
const { calls: vesuCalls, status: vesuStatus } = await this.moveAssets(
|
|
34033
34136
|
{
|
|
34034
34137
|
to: Protocols.EXTENDED.name,
|
|
34035
34138
|
from: Protocols.VESU.name,
|
|
@@ -34039,6 +34142,9 @@ var VesuExtendedMultiplierStrategy = class _VesuExtendedMultiplierStrategy exten
|
|
|
34039
34142
|
vesuAdapter
|
|
34040
34143
|
);
|
|
34041
34144
|
calls.push(...vesuCalls);
|
|
34145
|
+
if (!vesuStatus) {
|
|
34146
|
+
return [];
|
|
34147
|
+
}
|
|
34042
34148
|
} catch (err) {
|
|
34043
34149
|
logger.error(`Failed moving assets to vault: ${err}`);
|
|
34044
34150
|
}
|
|
@@ -34050,15 +34156,15 @@ var VesuExtendedMultiplierStrategy = class _VesuExtendedMultiplierStrategy exten
|
|
|
34050
34156
|
}
|
|
34051
34157
|
const usdcAmountInWallet = (await this.getUnusedBalance()).amount;
|
|
34052
34158
|
const usdcAmountOnExtended = parseFloat(
|
|
34053
|
-
extendedHoldings.
|
|
34159
|
+
extendedHoldings.availableForTrade
|
|
34054
34160
|
);
|
|
34055
|
-
if (extendedAmount.minus(usdcAmountOnExtended).greaterThan(0)) {
|
|
34161
|
+
if (extendedAmount.plus(BUFFER_USDC_IN_WITHDRAWAL).minus(usdcAmountOnExtended).greaterThan(0)) {
|
|
34056
34162
|
try {
|
|
34057
|
-
const extendedCalls = await this.moveAssets(
|
|
34163
|
+
const { calls: extendedCalls } = await this.moveAssets(
|
|
34058
34164
|
{
|
|
34059
34165
|
to: Protocols.EXTENDED.name,
|
|
34060
34166
|
from: Protocols.VAULT.name,
|
|
34061
|
-
amount: extendedAmount.minus(usdcAmountOnExtended)
|
|
34167
|
+
amount: extendedAmount.plus(BUFFER_USDC_IN_WITHDRAWAL).minus(usdcAmountOnExtended)
|
|
34062
34168
|
},
|
|
34063
34169
|
extendedAdapter,
|
|
34064
34170
|
vesuAdapter
|
|
@@ -34070,15 +34176,18 @@ var VesuExtendedMultiplierStrategy = class _VesuExtendedMultiplierStrategy exten
|
|
|
34070
34176
|
}
|
|
34071
34177
|
if (vesuAmount.minus(usdcAmountInWallet).greaterThan(0)) {
|
|
34072
34178
|
try {
|
|
34073
|
-
const vesuCalls = await this.moveAssets(
|
|
34179
|
+
const { calls: vesuCalls, status: vesuStatus } = await this.moveAssets(
|
|
34074
34180
|
{
|
|
34075
|
-
to: Protocols.
|
|
34181
|
+
to: Protocols.VAULT.name,
|
|
34076
34182
|
from: Protocols.EXTENDED.name,
|
|
34077
34183
|
amount: vesuAmount.minus(usdcAmountInWallet)
|
|
34078
34184
|
},
|
|
34079
34185
|
extendedAdapter,
|
|
34080
34186
|
vesuAdapter
|
|
34081
34187
|
);
|
|
34188
|
+
if (!vesuStatus) {
|
|
34189
|
+
return [];
|
|
34190
|
+
}
|
|
34082
34191
|
calls.push(...vesuCalls);
|
|
34083
34192
|
} catch (err) {
|
|
34084
34193
|
logger.error(`Failed moving assets to vault: ${err}`);
|
|
@@ -34095,9 +34204,12 @@ var VesuExtendedMultiplierStrategy = class _VesuExtendedMultiplierStrategy exten
|
|
|
34095
34204
|
const avnuAdapter = await this.getAvnuAdapter();
|
|
34096
34205
|
if (!avnuAdapter) {
|
|
34097
34206
|
logger.error(`avnu adapter not found: ${avnuAdapter}`);
|
|
34098
|
-
return
|
|
34207
|
+
return {
|
|
34208
|
+
calls: [],
|
|
34209
|
+
status: false
|
|
34210
|
+
};
|
|
34099
34211
|
}
|
|
34100
|
-
logger.info(
|
|
34212
|
+
logger.info(`moveAssets params, ${JSON.stringify(params)}`);
|
|
34101
34213
|
const collateralToken = vesuAdapter.config.supportedPositions[0].asset;
|
|
34102
34214
|
const {
|
|
34103
34215
|
collateralPrice
|
|
@@ -34114,18 +34226,67 @@ var VesuExtendedMultiplierStrategy = class _VesuExtendedMultiplierStrategy exten
|
|
|
34114
34226
|
await proofsInfo.callConstructor({ amount: params.amount })
|
|
34115
34227
|
);
|
|
34116
34228
|
calls.push(call);
|
|
34117
|
-
return
|
|
34229
|
+
return {
|
|
34230
|
+
calls: [call],
|
|
34231
|
+
status: true
|
|
34232
|
+
};
|
|
34118
34233
|
} else if (params.to === Protocols.VAULT.name && params.from === Protocols.EXTENDED.name) {
|
|
34234
|
+
const extendedLeverage = calculateExtendedLevergae();
|
|
34235
|
+
const extendedHoldings = await extendedAdapter.getExtendedDepositAmount();
|
|
34236
|
+
if (!extendedHoldings) {
|
|
34237
|
+
logger.error(`error getting extended holdings: ${extendedHoldings}`);
|
|
34238
|
+
return {
|
|
34239
|
+
calls: [],
|
|
34240
|
+
status: false
|
|
34241
|
+
};
|
|
34242
|
+
}
|
|
34243
|
+
const extendedHoldingAmount = new Web3Number(
|
|
34244
|
+
extendedHoldings.availableForWithdrawal,
|
|
34245
|
+
USDC_TOKEN_DECIMALS
|
|
34246
|
+
);
|
|
34247
|
+
logger.info(`${_VesuExtendedMultiplierStrategy.name}::moveAssets extendedHoldingAmount: ${extendedHoldingAmount.toNumber()}`);
|
|
34248
|
+
if (params.amount.abs().greaterThan(extendedHoldingAmount)) {
|
|
34249
|
+
const leftAmountAfterWithdrawalAmountInAccount = params.amount.abs().minus(extendedHoldingAmount);
|
|
34250
|
+
logger.info(`${_VesuExtendedMultiplierStrategy.name}::moveAssets leftAmountAfterWithdrawalAmountInAccount: ${leftAmountAfterWithdrawalAmountInAccount.toNumber()}`);
|
|
34251
|
+
const btcAmount = leftAmountAfterWithdrawalAmountInAccount.dividedBy(collateralPrice.price);
|
|
34252
|
+
const openLongPosition = btcAmount.multipliedBy(3).greaterThan(MINIMUM_EXTENDED_POSITION_SIZE) ? await extendedAdapter.createOrder(
|
|
34253
|
+
extendedLeverage.toString(),
|
|
34254
|
+
btcAmount.toNumber(),
|
|
34255
|
+
"BUY" /* BUY */
|
|
34256
|
+
) : await extendedAdapter.createOrder(
|
|
34257
|
+
extendedLeverage.toString(),
|
|
34258
|
+
35e-6,
|
|
34259
|
+
// just in case amount falls short then we need to create a withdrawal
|
|
34260
|
+
"BUY" /* BUY */
|
|
34261
|
+
);
|
|
34262
|
+
if (!openLongPosition) {
|
|
34263
|
+
logger.error(`error opening long position: ${openLongPosition}`);
|
|
34264
|
+
return {
|
|
34265
|
+
calls: [],
|
|
34266
|
+
status: false
|
|
34267
|
+
};
|
|
34268
|
+
}
|
|
34269
|
+
await new Promise((resolve) => setTimeout(resolve, 5e3));
|
|
34270
|
+
}
|
|
34119
34271
|
const withdrawalFromExtended = await extendedAdapter.withdrawFromExtended(params.amount);
|
|
34120
34272
|
if (withdrawalFromExtended) {
|
|
34121
|
-
const
|
|
34273
|
+
const extendedHoldings2 = await extendedAdapter.getExtendedDepositAmount();
|
|
34274
|
+
logger.info(`extendedHoldings after withdrawal ${extendedHoldings2}`);
|
|
34275
|
+
await new Promise((resolve) => setTimeout(resolve, 1e4));
|
|
34276
|
+
const calls = await this.moveAssetsToVaultAllocator(params.amount, extendedAdapter);
|
|
34122
34277
|
if (calls.length > 0) {
|
|
34123
|
-
return
|
|
34278
|
+
return {
|
|
34279
|
+
calls,
|
|
34280
|
+
status: true
|
|
34281
|
+
};
|
|
34124
34282
|
}
|
|
34125
34283
|
} else {
|
|
34126
34284
|
logger.error("withdrawal from extended failed");
|
|
34285
|
+
return {
|
|
34286
|
+
calls: [],
|
|
34287
|
+
status: false
|
|
34288
|
+
};
|
|
34127
34289
|
}
|
|
34128
|
-
return [];
|
|
34129
34290
|
} else if (params.to === Protocols.VAULT.name && params.from === Protocols.VESU.name) {
|
|
34130
34291
|
const vesuAmountInBTC = new Web3Number(
|
|
34131
34292
|
params.amount.dividedBy(collateralPrice.price).toNumber(),
|
|
@@ -34146,7 +34307,10 @@ var VesuExtendedMultiplierStrategy = class _VesuExtendedMultiplierStrategy exten
|
|
|
34146
34307
|
await swapProofsInfo.callConstructor({ amount: vesuAmountInBTC })
|
|
34147
34308
|
);
|
|
34148
34309
|
calls.push(swapCall);
|
|
34149
|
-
return
|
|
34310
|
+
return {
|
|
34311
|
+
calls,
|
|
34312
|
+
status: true
|
|
34313
|
+
};
|
|
34150
34314
|
} else if (params.to === Protocols.EXTENDED.name && params.from === Protocols.VESU.name) {
|
|
34151
34315
|
const vesuAmountInBTC = new Web3Number(
|
|
34152
34316
|
params.amount.dividedBy(collateralPrice.price).toNumber(),
|
|
@@ -34177,13 +34341,21 @@ var VesuExtendedMultiplierStrategy = class _VesuExtendedMultiplierStrategy exten
|
|
|
34177
34341
|
await proofsInfoDeposit.callConstructor({ amount: params.amount })
|
|
34178
34342
|
);
|
|
34179
34343
|
calls.push(callDeposit);
|
|
34180
|
-
return
|
|
34344
|
+
return {
|
|
34345
|
+
calls,
|
|
34346
|
+
status: true
|
|
34347
|
+
};
|
|
34181
34348
|
}
|
|
34182
|
-
|
|
34183
|
-
|
|
34349
|
+
return {
|
|
34350
|
+
calls: [],
|
|
34351
|
+
status: false
|
|
34352
|
+
};
|
|
34184
34353
|
} catch (err) {
|
|
34185
34354
|
logger.error(`error moving assets: ${err}`);
|
|
34186
|
-
return
|
|
34355
|
+
return {
|
|
34356
|
+
calls: [],
|
|
34357
|
+
status: false
|
|
34358
|
+
};
|
|
34187
34359
|
}
|
|
34188
34360
|
}
|
|
34189
34361
|
async handleDeposit() {
|
|
@@ -34220,6 +34392,7 @@ var VesuExtendedMultiplierStrategy = class _VesuExtendedMultiplierStrategy exten
|
|
|
34220
34392
|
};
|
|
34221
34393
|
}
|
|
34222
34394
|
const extendedPositionValue = position.length > 0 ? parseFloat(position[0].value) : 0;
|
|
34395
|
+
const BUFFER_AMOUNT_IN_AVAILABLE_FOR_TRADE = BUFFER_USDC_IN_WITHDRAWAL;
|
|
34223
34396
|
const extendedHoldings = await extendedAdapter.getExtendedDepositAmount();
|
|
34224
34397
|
if (!extendedHoldings) {
|
|
34225
34398
|
logger.error(`error getting extended holdings: ${extendedHoldings}`);
|
|
@@ -34229,7 +34402,7 @@ var VesuExtendedMultiplierStrategy = class _VesuExtendedMultiplierStrategy exten
|
|
|
34229
34402
|
};
|
|
34230
34403
|
}
|
|
34231
34404
|
const extendedHoldingAmount = new Web3Number(
|
|
34232
|
-
extendedHoldings.
|
|
34405
|
+
extendedHoldings.availableForTrade,
|
|
34233
34406
|
USDC_TOKEN_DECIMALS
|
|
34234
34407
|
);
|
|
34235
34408
|
const {
|
|
@@ -34238,12 +34411,11 @@ var VesuExtendedMultiplierStrategy = class _VesuExtendedMultiplierStrategy exten
|
|
|
34238
34411
|
const { collateralPrice } = await this.getAssetPrices();
|
|
34239
34412
|
const { vesuAmountInBTC, extendedAmountInBTC } = calculateVesUPositionSizeGivenExtended(
|
|
34240
34413
|
extendedPositionValue,
|
|
34241
|
-
extendedHoldingAmount,
|
|
34414
|
+
extendedHoldingAmount.minus(BUFFER_AMOUNT_IN_AVAILABLE_FOR_TRADE),
|
|
34242
34415
|
collateralTokenAmount,
|
|
34243
34416
|
collateralPrice.price
|
|
34244
34417
|
);
|
|
34245
|
-
|
|
34246
|
-
console.log("extendedAmountInBTC", extendedAmountInBTC);
|
|
34418
|
+
logger.info(`vesuAmountInBTC ${vesuAmountInBTC}, extendedAmountInBTC ${extendedAmountInBTC}`);
|
|
34247
34419
|
let calls = [];
|
|
34248
34420
|
if (vesuAmountInBTC.greaterThan(MINIMUM_EXTENDED_POSITION_SIZE)) {
|
|
34249
34421
|
const proofsInfo = vesuAdapter.getProofs(true, this.getMerkleTree());
|
|
@@ -34256,7 +34428,6 @@ var VesuExtendedMultiplierStrategy = class _VesuExtendedMultiplierStrategy exten
|
|
|
34256
34428
|
);
|
|
34257
34429
|
const { amount: wbtcAmountInVaultAllocator } = await this.getUnusedBalanceWBTC();
|
|
34258
34430
|
if (wbtcAmountInVaultAllocator.lessThan(vesuAmountInBTC)) {
|
|
34259
|
-
console.log("error wbtc amount in vault allocator is less than vesu amount in btc", wbtcAmountInVaultAllocator, vesuAmountInBTC);
|
|
34260
34431
|
const swapProofsInfo = avnuAdapter.getProofs(true, this.getMerkleTree());
|
|
34261
34432
|
const swapProofGroups = swapProofsInfo.proofs;
|
|
34262
34433
|
const swapCall = this.getManageCall(
|
|
@@ -34300,7 +34471,7 @@ var VesuExtendedMultiplierStrategy = class _VesuExtendedMultiplierStrategy exten
|
|
|
34300
34471
|
bid
|
|
34301
34472
|
} = await extendedAdapter.fetchOrderBookBTCUSDC();
|
|
34302
34473
|
const price = ask.plus(bid).dividedBy(2);
|
|
34303
|
-
const btcToken = vesuAdapter.config.supportedPositions[
|
|
34474
|
+
const btcToken = vesuAdapter.config.supportedPositions[0].asset;
|
|
34304
34475
|
const btcPriceAvnu = await avnuAdapter.getPriceOfToken(btcToken.address.toString());
|
|
34305
34476
|
if (!btcPriceAvnu) {
|
|
34306
34477
|
logger.error(`error getting btc price avnu: ${btcPriceAvnu}`);
|
|
@@ -34316,43 +34487,65 @@ var VesuExtendedMultiplierStrategy = class _VesuExtendedMultiplierStrategy exten
|
|
|
34316
34487
|
async handleWithdraw(amount) {
|
|
34317
34488
|
try {
|
|
34318
34489
|
const usdcBalanceVaultAllocator = await this.getUnusedBalance();
|
|
34319
|
-
const usdcBalanceDifference = amount.minus(usdcBalanceVaultAllocator.usdValue);
|
|
34490
|
+
const usdcBalanceDifference = amount.plus(BUFFER_USDC_IN_WITHDRAWAL).minus(usdcBalanceVaultAllocator.usdValue);
|
|
34320
34491
|
logger.info(`usdcBalanceDifference, ${usdcBalanceDifference.toNumber()}`);
|
|
34492
|
+
let calls = [];
|
|
34493
|
+
let status = true;
|
|
34321
34494
|
if (usdcBalanceDifference.lessThan(0)) {
|
|
34322
|
-
const
|
|
34323
|
-
amount
|
|
34495
|
+
const withdrawCall2 = await this.getBringLiquidityCall({
|
|
34496
|
+
amount: usdcBalanceVaultAllocator.amount
|
|
34324
34497
|
});
|
|
34325
|
-
logger.info("withdraw call",
|
|
34326
|
-
|
|
34498
|
+
logger.info("withdraw call", withdrawCall2);
|
|
34499
|
+
calls.push(withdrawCall2);
|
|
34500
|
+
return {
|
|
34501
|
+
calls,
|
|
34502
|
+
status: true
|
|
34503
|
+
};
|
|
34327
34504
|
}
|
|
34328
34505
|
const vesuAdapter = await this.getVesuAdapter();
|
|
34329
34506
|
const extendedAdapter = await this.getExtendedAdapter();
|
|
34330
34507
|
if (!vesuAdapter || !extendedAdapter || !extendedAdapter.client) {
|
|
34508
|
+
status = false;
|
|
34331
34509
|
logger.error(
|
|
34332
34510
|
`vesu or extended adapter not found: vesuAdapter=${vesuAdapter}, extendedAdapter=${extendedAdapter}`
|
|
34333
34511
|
);
|
|
34334
|
-
return
|
|
34512
|
+
return {
|
|
34513
|
+
calls,
|
|
34514
|
+
status
|
|
34515
|
+
};
|
|
34335
34516
|
}
|
|
34336
34517
|
const { collateralTokenAmount } = await vesuAdapter.vesuAdapter.getAssetPrices();
|
|
34337
34518
|
const {
|
|
34338
34519
|
collateralPrice
|
|
34339
34520
|
} = await this.getAssetPrices();
|
|
34340
34521
|
const extendedPositon = await extendedAdapter.getAllOpenPositions();
|
|
34522
|
+
if (!extendedPositon) {
|
|
34523
|
+
status = false;
|
|
34524
|
+
logger.error("error getting extended position", extendedPositon);
|
|
34525
|
+
return {
|
|
34526
|
+
calls,
|
|
34527
|
+
status
|
|
34528
|
+
};
|
|
34529
|
+
}
|
|
34341
34530
|
const amountDistributionForWithdrawal = await calculateAmountDistributionForWithdrawal(
|
|
34342
|
-
|
|
34531
|
+
usdcBalanceDifference,
|
|
34343
34532
|
collateralPrice.price,
|
|
34344
34533
|
collateralTokenAmount,
|
|
34345
34534
|
extendedPositon
|
|
34346
34535
|
);
|
|
34347
34536
|
if (!amountDistributionForWithdrawal) {
|
|
34537
|
+
status = false;
|
|
34348
34538
|
logger.error(
|
|
34349
34539
|
`error calculating amount distribution for withdrawal: ${amountDistributionForWithdrawal}`
|
|
34350
34540
|
);
|
|
34351
|
-
return
|
|
34541
|
+
return {
|
|
34542
|
+
calls,
|
|
34543
|
+
status
|
|
34544
|
+
};
|
|
34352
34545
|
}
|
|
34353
34546
|
const { vesu_amount, extended_amount } = amountDistributionForWithdrawal;
|
|
34354
|
-
if (vesu_amount.greaterThan(0)) {
|
|
34355
|
-
const
|
|
34547
|
+
if (status && vesu_amount.greaterThan(0)) {
|
|
34548
|
+
const { calls: vesuCalls, status: vesuStatus } = await this.moveAssets(
|
|
34356
34549
|
{
|
|
34357
34550
|
amount: vesu_amount,
|
|
34358
34551
|
from: Protocols.VESU.name,
|
|
@@ -34361,10 +34554,11 @@ var VesuExtendedMultiplierStrategy = class _VesuExtendedMultiplierStrategy exten
|
|
|
34361
34554
|
extendedAdapter,
|
|
34362
34555
|
vesuAdapter
|
|
34363
34556
|
);
|
|
34364
|
-
|
|
34557
|
+
status = vesuStatus;
|
|
34558
|
+
calls.push(...vesuCalls);
|
|
34365
34559
|
}
|
|
34366
|
-
if (extended_amount.greaterThan(0)) {
|
|
34367
|
-
const
|
|
34560
|
+
if (status && extended_amount.greaterThan(0)) {
|
|
34561
|
+
const { calls: extendedCalls, status: extendedStatus } = await this.moveAssets(
|
|
34368
34562
|
{
|
|
34369
34563
|
amount: extended_amount,
|
|
34370
34564
|
from: Protocols.EXTENDED.name,
|
|
@@ -34373,12 +34567,32 @@ var VesuExtendedMultiplierStrategy = class _VesuExtendedMultiplierStrategy exten
|
|
|
34373
34567
|
extendedAdapter,
|
|
34374
34568
|
vesuAdapter
|
|
34375
34569
|
);
|
|
34376
|
-
|
|
34570
|
+
status = extendedStatus;
|
|
34571
|
+
if (status) {
|
|
34572
|
+
calls.push(...extendedCalls);
|
|
34573
|
+
} else {
|
|
34574
|
+
logger.error("error moving assets to vault: extendedStatus: ${extendedStatus}");
|
|
34575
|
+
return {
|
|
34576
|
+
calls: [],
|
|
34577
|
+
status
|
|
34578
|
+
};
|
|
34579
|
+
}
|
|
34377
34580
|
}
|
|
34378
|
-
|
|
34581
|
+
const withdrawCall = await this.getBringLiquidityCall({
|
|
34582
|
+
amount
|
|
34583
|
+
});
|
|
34584
|
+
logger.info("withdraw call", withdrawCall);
|
|
34585
|
+
calls.push(withdrawCall);
|
|
34586
|
+
return {
|
|
34587
|
+
calls,
|
|
34588
|
+
status
|
|
34589
|
+
};
|
|
34379
34590
|
} catch (err) {
|
|
34380
34591
|
logger.error(`error handling withdrawal: ${err}`);
|
|
34381
|
-
return
|
|
34592
|
+
return {
|
|
34593
|
+
calls: [],
|
|
34594
|
+
status: false
|
|
34595
|
+
};
|
|
34382
34596
|
}
|
|
34383
34597
|
}
|
|
34384
34598
|
async getAUM() {
|
|
@@ -34512,6 +34726,7 @@ function getLooperSettings2(lstSymbol, underlyingSymbol, vaultSettings, pool1, e
|
|
|
34512
34726
|
() => vesuMultiplyAdapter.getWithdrawLeaf()
|
|
34513
34727
|
);
|
|
34514
34728
|
vaultSettings.leafAdapters.push(() => extendedAdapter.getDepositLeaf());
|
|
34729
|
+
vaultSettings.leafAdapters.push(() => extendedAdapter.getSwapFromLegacyLeaf());
|
|
34515
34730
|
vaultSettings.leafAdapters.push(() => avnuAdapter.getDepositLeaf());
|
|
34516
34731
|
vaultSettings.leafAdapters.push(() => avnuAdapter.getWithdrawLeaf());
|
|
34517
34732
|
vaultSettings.leafAdapters.push(
|