@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.browser.mjs
CHANGED
|
@@ -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
|
|
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
|
|
28461
|
-
const numerator3 = extendedExposureUSD.multipliedBy(
|
|
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 =
|
|
28487
|
+
var calculateDebtAmount = (collateralAmount, debtAmount, debtPrice, maxLtv = MAX_LIQUIDATION_RATIO, addedAmount, collateralPrice, isDeposit) => {
|
|
28493
28488
|
try {
|
|
28494
|
-
const
|
|
28495
|
-
const numerator1 = collateralAmount.plus(
|
|
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
|
-
|
|
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 =
|
|
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 <
|
|
29244
|
-
leverSwap = ekuboQuoter.getVesuMultiplyQuote(swapQuote,
|
|
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
|
-
|
|
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.
|
|
29583
|
-
if (
|
|
29584
|
-
|
|
29585
|
-
return
|
|
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
|
-
|
|
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
|
-
|
|
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
|
|
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
|
|
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
|
-
|
|
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 =
|
|
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
|
|
33735
|
-
(token) => token.symbol === "
|
|
33827
|
+
const usdceToken = Global.getDefaultTokens().find(
|
|
33828
|
+
(token) => token.symbol === "USDCe"
|
|
33736
33829
|
);
|
|
33737
33830
|
const approveCall = new ERC20(this.config).approve(
|
|
33738
|
-
|
|
33831
|
+
usdceToken.address,
|
|
33739
33832
|
this.metadata.additionalInfo.vaultAllocator,
|
|
33740
33833
|
amount
|
|
33741
33834
|
);
|
|
33742
33835
|
const transferCall = new ERC20(this.config).transfer(
|
|
33743
|
-
|
|
33836
|
+
usdceToken.address,
|
|
33744
33837
|
this.metadata.additionalInfo.vaultAllocator,
|
|
33745
33838
|
amount
|
|
33746
33839
|
);
|
|
33747
|
-
|
|
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
|
-
|
|
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.
|
|
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.
|
|
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(
|
|
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
|
|
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
|
|
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
|
|
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
|
|
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
|
|
34191
|
+
return {
|
|
34192
|
+
calls,
|
|
34193
|
+
status: true
|
|
34194
|
+
};
|
|
34028
34195
|
}
|
|
34029
|
-
|
|
34030
|
-
|
|
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.
|
|
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
|
-
|
|
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[
|
|
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
|
|
34170
|
-
amount
|
|
34342
|
+
const withdrawCall2 = await this.getBringLiquidityCall({
|
|
34343
|
+
amount: usdcBalanceVaultAllocator.amount
|
|
34171
34344
|
});
|
|
34172
|
-
logger.info("withdraw call",
|
|
34173
|
-
|
|
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
|
-
|
|
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
|
|
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
|
-
|
|
34404
|
+
status = vesuStatus;
|
|
34405
|
+
calls.push(...vesuCalls);
|
|
34212
34406
|
}
|
|
34213
|
-
if (extended_amount.greaterThan(0)) {
|
|
34214
|
-
const
|
|
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
|
-
|
|
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
|
-
|
|
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(
|