@strkfarm/sdk 2.0.0-dev.2 → 2.0.0-dev.4
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 +37 -41
- package/dist/index.browser.mjs +37 -41
- package/dist/index.js +37 -41
- package/dist/index.mjs +37 -41
- package/package.json +1 -1
- package/src/modules/ekubo-quoter.ts +0 -12
- package/src/strategies/universal-adapters/avnu-adapter.ts +6 -3
- package/src/strategies/vesu-extended-strategy/utils/helper.ts +8 -12
- package/src/strategies/vesu-extended-strategy/vesu-extended-strategy.tsx +54 -48
|
@@ -55997,20 +55997,13 @@ ${JSON.stringify(data, null, 2)}`;
|
|
|
55997
55997
|
async getDexPrice(baseToken, quoteToken, amount) {
|
|
55998
55998
|
const lstTokenInfo = baseToken;
|
|
55999
55999
|
const lstUnderlyingTokenInfo = quoteToken;
|
|
56000
|
-
console.log("lstTokenInfo", lstTokenInfo);
|
|
56001
|
-
console.log("lstUnderlyingTokenInfo", lstUnderlyingTokenInfo);
|
|
56002
|
-
console.log("amount", amount);
|
|
56003
56000
|
const quote = await this.getQuote(
|
|
56004
56001
|
lstTokenInfo.address.address,
|
|
56005
56002
|
lstUnderlyingTokenInfo.address.address,
|
|
56006
56003
|
amount
|
|
56007
56004
|
);
|
|
56008
|
-
console.log("quote", quote);
|
|
56009
56005
|
const outputAmount = Web3Number.fromWei(quote.total_calculated, lstUnderlyingTokenInfo.decimals);
|
|
56010
|
-
console.log("outputAmount", outputAmount);
|
|
56011
|
-
console.log("amount", amount);
|
|
56012
56006
|
const price = outputAmount.toNumber() / amount.toNumber();
|
|
56013
|
-
console.log("price", price);
|
|
56014
56007
|
logger2.verbose(`${_EkuboQuoter.name}:: LST Dex Price: ${price}`);
|
|
56015
56008
|
return price;
|
|
56016
56009
|
}
|
|
@@ -56029,16 +56022,12 @@ ${JSON.stringify(data, null, 2)}`;
|
|
|
56029
56022
|
// debt collateral
|
|
56030
56023
|
async getSwapLimitAmount(fromToken, toToken, amount, max_slippage = 2e-3) {
|
|
56031
56024
|
const isExactAmountIn = amount.greaterThanOrEqualTo(0);
|
|
56032
|
-
console.log("isExactAmountIn", isExactAmountIn);
|
|
56033
56025
|
logger2.verbose(`${_EkuboQuoter.name}::getSwapLimitAmount isExactAmountIn: ${isExactAmountIn}, fromToken: ${fromToken.symbol}, toToken: ${toToken.symbol}, amount: ${amount}`);
|
|
56034
56026
|
const isYieldToken = this.tokenMarketData.isAPYSupported(toToken);
|
|
56035
56027
|
console.log("isYieldToken", isYieldToken);
|
|
56036
56028
|
const baseToken = isExactAmountIn ? toToken : fromToken;
|
|
56037
56029
|
const quoteToken = isExactAmountIn ? fromToken : toToken;
|
|
56038
|
-
console.log("baseToken", baseToken);
|
|
56039
|
-
console.log("quoteToken", quoteToken);
|
|
56040
56030
|
const dexPrice = await this.getDexPrice(baseToken, quoteToken, amount);
|
|
56041
|
-
console.log("dexPrice", dexPrice);
|
|
56042
56031
|
const trueExchangeRate = isYieldToken ? await this.tokenMarketData.getTruePrice(baseToken) : dexPrice;
|
|
56043
56032
|
console.log("trueExchangeRate", trueExchangeRate);
|
|
56044
56033
|
if (isExactAmountIn) {
|
|
@@ -56069,7 +56058,6 @@ ${JSON.stringify(data, null, 2)}`;
|
|
|
56069
56058
|
return quote.splits.map((split2) => {
|
|
56070
56059
|
const isNegativeAmount = BigInt(split2.amount_specified) <= 0n;
|
|
56071
56060
|
const token = isNegativeAmount ? toTokenInfo : fromTokenInfo;
|
|
56072
|
-
console.log("token for withdrawal", token, isNegativeAmount);
|
|
56073
56061
|
return {
|
|
56074
56062
|
route: split2.route.map((_route) => ({
|
|
56075
56063
|
pool_key: {
|
|
@@ -92469,7 +92457,6 @@ spurious results.`);
|
|
|
92469
92457
|
return null;
|
|
92470
92458
|
}
|
|
92471
92459
|
const extendedExposureUSD = extendedPosition.length > 0 ? new Web3Number(extendedPosition[0].value, USDC_TOKEN_DECIMALS) : new Web3Number(0, USDC_TOKEN_DECIMALS);
|
|
92472
|
-
console.log("THe collateral is", collateralPrice, collateralUnits);
|
|
92473
92460
|
const vesuExposureUSD = collateralUnits.multipliedBy(collateralPrice);
|
|
92474
92461
|
if (vesuExposureUSD.lessThan(0)) {
|
|
92475
92462
|
return {
|
|
@@ -92526,10 +92513,10 @@ spurious results.`);
|
|
|
92526
92513
|
const extended_leverage_max = 1 / (MAINTENANCE_MARGIN + MAX_PRICE_DROP_PERCENTAGE);
|
|
92527
92514
|
return Math.floor(extended_leverage_max);
|
|
92528
92515
|
};
|
|
92529
|
-
var calculateDebtAmount = (collateralAmount, debtAmount, debtPrice, maxLtv =
|
|
92516
|
+
var calculateDebtAmount = (collateralAmount, debtAmount, debtPrice, maxLtv = MAX_LIQUIDATION_RATIO, addedAmount, collateralPrice, isDeposit) => {
|
|
92530
92517
|
try {
|
|
92531
|
-
const
|
|
92532
|
-
const numerator1 = collateralAmount.plus(
|
|
92518
|
+
const addedCollateral = addedAmount.multipliedBy(isDeposit ? 1 : -1);
|
|
92519
|
+
const numerator1 = collateralAmount.plus(addedCollateral).multipliedBy(collateralPrice).multipliedBy(maxLtv);
|
|
92533
92520
|
const numerator2 = debtAmount.multipliedBy(debtPrice).multipliedBy(TARGET_HF);
|
|
92534
92521
|
const denominator = TARGET_HF - maxLtv;
|
|
92535
92522
|
const x_debt_usd = numerator1.minus(numerator2).dividedBy(denominator);
|
|
@@ -92564,16 +92551,16 @@ spurious results.`);
|
|
|
92564
92551
|
const extendedHoldings = await client.getHoldings();
|
|
92565
92552
|
const extended_leverage = calculateExtendedLevergae();
|
|
92566
92553
|
const latestPosition = (await client.getPositions()).data.pop();
|
|
92567
|
-
console.log("the latest position is", latestPosition, extendedHoldings);
|
|
92568
92554
|
if (!extendedHoldings || !latestPosition) {
|
|
92569
92555
|
logger2.error(`error getting extended position: extendedHoldings=${extendedHoldings}, latestPosition=${latestPosition}`);
|
|
92570
92556
|
return null;
|
|
92571
92557
|
}
|
|
92572
|
-
const positionValueInUSD = latestPosition.value;
|
|
92558
|
+
const positionValueInUSD = new Web3Number(latestPosition.value, USDC_TOKEN_DECIMALS);
|
|
92573
92559
|
const equity = extendedHoldings.data.equity;
|
|
92574
|
-
const deposit =
|
|
92575
|
-
return new Web3Number(
|
|
92560
|
+
const deposit = positionValueInUSD.dividedBy(extended_leverage).minus(equity).toFixed(2);
|
|
92561
|
+
return new Web3Number(deposit, USDC_TOKEN_DECIMALS);
|
|
92576
92562
|
} catch (err2) {
|
|
92563
|
+
logger2.error(`error calculating amount deposit on extended when incurring losses: ${err2}`);
|
|
92577
92564
|
return null;
|
|
92578
92565
|
}
|
|
92579
92566
|
};
|
|
@@ -97667,7 +97654,7 @@ spurious results.`);
|
|
|
97667
97654
|
}
|
|
97668
97655
|
throw new Error("Failed to fetch quote after retries");
|
|
97669
97656
|
}
|
|
97670
|
-
async getQuotesAvnu(from_token_address, to_token_address, amount, takerAddress, toTokenDecimals, usdcToBtc, maxIterations = 5, tolerance =
|
|
97657
|
+
async getQuotesAvnu(from_token_address, to_token_address, amount, takerAddress, toTokenDecimals, usdcToBtc, maxIterations = 5, tolerance = 1e3) {
|
|
97671
97658
|
try {
|
|
97672
97659
|
const fromToken = this.config.supportedPositions[0].asset;
|
|
97673
97660
|
const toToken = this.config.supportedPositions[1].asset;
|
|
@@ -98039,15 +98026,15 @@ spurious results.`);
|
|
|
98039
98026
|
}
|
|
98040
98027
|
const usdcAmountInWallet = (await this.getUnusedBalance()).amount;
|
|
98041
98028
|
const usdcAmountOnExtended = parseFloat(
|
|
98042
|
-
extendedHoldings.
|
|
98029
|
+
extendedHoldings.availableForTrade
|
|
98043
98030
|
);
|
|
98044
|
-
if (extendedAmount.minus(usdcAmountOnExtended).greaterThan(0)) {
|
|
98031
|
+
if (extendedAmount.plus(BUFFER_USDC_IN_WITHDRAWAL).minus(usdcAmountOnExtended).greaterThan(0)) {
|
|
98045
98032
|
try {
|
|
98046
98033
|
const { calls: extendedCalls } = await this.moveAssets(
|
|
98047
98034
|
{
|
|
98048
98035
|
to: Protocols.EXTENDED.name,
|
|
98049
98036
|
from: Protocols.VAULT.name,
|
|
98050
|
-
amount: extendedAmount.minus(usdcAmountOnExtended)
|
|
98037
|
+
amount: extendedAmount.plus(BUFFER_USDC_IN_WITHDRAWAL).minus(usdcAmountOnExtended)
|
|
98051
98038
|
},
|
|
98052
98039
|
extendedAdapter,
|
|
98053
98040
|
vesuAdapter
|
|
@@ -98127,21 +98114,30 @@ spurious results.`);
|
|
|
98127
98114
|
extendedHoldings.availableForWithdrawal,
|
|
98128
98115
|
USDC_TOKEN_DECIMALS
|
|
98129
98116
|
);
|
|
98130
|
-
|
|
98131
|
-
|
|
98132
|
-
|
|
98133
|
-
|
|
98134
|
-
btcAmount.
|
|
98135
|
-
|
|
98136
|
-
|
|
98137
|
-
|
|
98138
|
-
|
|
98139
|
-
|
|
98140
|
-
|
|
98141
|
-
|
|
98142
|
-
|
|
98117
|
+
logger2.info(`${_VesuExtendedMultiplierStrategy.name}::moveAssets extendedHoldingAmount: ${extendedHoldingAmount.toNumber()}`);
|
|
98118
|
+
if (params.amount.abs().greaterThan(extendedHoldingAmount)) {
|
|
98119
|
+
const leftAmountAfterWithdrawalAmountInAccount = params.amount.abs().minus(extendedHoldingAmount);
|
|
98120
|
+
logger2.info(`${_VesuExtendedMultiplierStrategy.name}::moveAssets leftAmountAfterWithdrawalAmountInAccount: ${leftAmountAfterWithdrawalAmountInAccount.toNumber()}`);
|
|
98121
|
+
const btcAmount = leftAmountAfterWithdrawalAmountInAccount.dividedBy(collateralPrice.price);
|
|
98122
|
+
const openLongPosition = btcAmount.multipliedBy(3).greaterThan(MINIMUM_EXTENDED_POSITION_SIZE) ? await extendedAdapter.createOrder(
|
|
98123
|
+
extendedLeverage.toString(),
|
|
98124
|
+
btcAmount.toNumber(),
|
|
98125
|
+
"BUY" /* BUY */
|
|
98126
|
+
) : await extendedAdapter.createOrder(
|
|
98127
|
+
extendedLeverage.toString(),
|
|
98128
|
+
35e-6,
|
|
98129
|
+
// just in case amount falls short then we need to create a withdrawal
|
|
98130
|
+
"BUY" /* BUY */
|
|
98131
|
+
);
|
|
98132
|
+
if (!openLongPosition) {
|
|
98133
|
+
logger2.error(`error opening long position: ${openLongPosition}`);
|
|
98134
|
+
return {
|
|
98135
|
+
calls: [],
|
|
98136
|
+
status: false
|
|
98137
|
+
};
|
|
98138
|
+
}
|
|
98139
|
+
await new Promise((resolve) => setTimeout(resolve, 5e3));
|
|
98143
98140
|
}
|
|
98144
|
-
await new Promise((resolve) => setTimeout(resolve, 5e3));
|
|
98145
98141
|
const withdrawalFromExtended = await extendedAdapter.withdrawFromExtended(params.amount);
|
|
98146
98142
|
if (withdrawalFromExtended) {
|
|
98147
98143
|
const extendedHoldings2 = await extendedAdapter.getExtendedDepositAmount();
|
|
@@ -98266,6 +98262,7 @@ spurious results.`);
|
|
|
98266
98262
|
};
|
|
98267
98263
|
}
|
|
98268
98264
|
const extendedPositionValue = position.length > 0 ? parseFloat(position[0].value) : 0;
|
|
98265
|
+
const BUFFER_AMOUNT_IN_AVAILABLE_FOR_TRADE = BUFFER_USDC_IN_WITHDRAWAL;
|
|
98269
98266
|
const extendedHoldings = await extendedAdapter.getExtendedDepositAmount();
|
|
98270
98267
|
if (!extendedHoldings) {
|
|
98271
98268
|
logger2.error(`error getting extended holdings: ${extendedHoldings}`);
|
|
@@ -98275,7 +98272,7 @@ spurious results.`);
|
|
|
98275
98272
|
};
|
|
98276
98273
|
}
|
|
98277
98274
|
const extendedHoldingAmount = new Web3Number(
|
|
98278
|
-
extendedHoldings.
|
|
98275
|
+
extendedHoldings.availableForTrade,
|
|
98279
98276
|
USDC_TOKEN_DECIMALS
|
|
98280
98277
|
);
|
|
98281
98278
|
const {
|
|
@@ -98284,7 +98281,7 @@ spurious results.`);
|
|
|
98284
98281
|
const { collateralPrice } = await this.getAssetPrices();
|
|
98285
98282
|
const { vesuAmountInBTC, extendedAmountInBTC } = calculateVesUPositionSizeGivenExtended(
|
|
98286
98283
|
extendedPositionValue,
|
|
98287
|
-
extendedHoldingAmount,
|
|
98284
|
+
extendedHoldingAmount.minus(BUFFER_AMOUNT_IN_AVAILABLE_FOR_TRADE),
|
|
98288
98285
|
collateralTokenAmount,
|
|
98289
98286
|
collateralPrice.price
|
|
98290
98287
|
);
|
|
@@ -98301,7 +98298,6 @@ spurious results.`);
|
|
|
98301
98298
|
);
|
|
98302
98299
|
const { amount: wbtcAmountInVaultAllocator } = await this.getUnusedBalanceWBTC();
|
|
98303
98300
|
if (wbtcAmountInVaultAllocator.lessThan(vesuAmountInBTC)) {
|
|
98304
|
-
logger2.info(`WBTC amount in vault allocator is less than vesu amount required in WBTC thus swapping, wbtcAmountInVaultAllocator: ${wbtcAmountInVaultAllocator}, vesuAmountInBTC: ${vesuAmountInBTC}`);
|
|
98305
98301
|
const swapProofsInfo = avnuAdapter.getProofs(true, this.getMerkleTree());
|
|
98306
98302
|
const swapProofGroups = swapProofsInfo.proofs;
|
|
98307
98303
|
const swapCall = this.getManageCall(
|
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) {
|
|
@@ -4341,7 +4330,6 @@ var EkuboQuoter = class _EkuboQuoter {
|
|
|
4341
4330
|
return quote.splits.map((split) => {
|
|
4342
4331
|
const isNegativeAmount = BigInt(split.amount_specified) <= 0n;
|
|
4343
4332
|
const token = isNegativeAmount ? toTokenInfo : fromTokenInfo;
|
|
4344
|
-
console.log("token for withdrawal", token, isNegativeAmount);
|
|
4345
4333
|
return {
|
|
4346
4334
|
route: split.route.map((_route) => ({
|
|
4347
4335
|
pool_key: {
|
|
@@ -28440,7 +28428,6 @@ var calculateAmountDistributionForWithdrawal = async (amountInUsdc, collateralPr
|
|
|
28440
28428
|
return null;
|
|
28441
28429
|
}
|
|
28442
28430
|
const extendedExposureUSD = extendedPosition.length > 0 ? new Web3Number(extendedPosition[0].value, USDC_TOKEN_DECIMALS) : new Web3Number(0, USDC_TOKEN_DECIMALS);
|
|
28443
|
-
console.log("THe collateral is", collateralPrice, collateralUnits);
|
|
28444
28431
|
const vesuExposureUSD = collateralUnits.multipliedBy(collateralPrice);
|
|
28445
28432
|
if (vesuExposureUSD.lessThan(0)) {
|
|
28446
28433
|
return {
|
|
@@ -28497,10 +28484,10 @@ var calculateExtendedLevergae = () => {
|
|
|
28497
28484
|
const extended_leverage_max = 1 / (MAINTENANCE_MARGIN + MAX_PRICE_DROP_PERCENTAGE);
|
|
28498
28485
|
return Math.floor(extended_leverage_max);
|
|
28499
28486
|
};
|
|
28500
|
-
var calculateDebtAmount = (collateralAmount, debtAmount, debtPrice, maxLtv =
|
|
28487
|
+
var calculateDebtAmount = (collateralAmount, debtAmount, debtPrice, maxLtv = MAX_LIQUIDATION_RATIO, addedAmount, collateralPrice, isDeposit) => {
|
|
28501
28488
|
try {
|
|
28502
|
-
const
|
|
28503
|
-
const numerator1 = collateralAmount.plus(
|
|
28489
|
+
const addedCollateral = addedAmount.multipliedBy(isDeposit ? 1 : -1);
|
|
28490
|
+
const numerator1 = collateralAmount.plus(addedCollateral).multipliedBy(collateralPrice).multipliedBy(maxLtv);
|
|
28504
28491
|
const numerator2 = debtAmount.multipliedBy(debtPrice).multipliedBy(TARGET_HF);
|
|
28505
28492
|
const denominator = TARGET_HF - maxLtv;
|
|
28506
28493
|
const x_debt_usd = numerator1.minus(numerator2).dividedBy(denominator);
|
|
@@ -28535,16 +28522,16 @@ var calculateAmountDepositOnExtendedWhenIncurringLosses = async (client) => {
|
|
|
28535
28522
|
const extendedHoldings = await client.getHoldings();
|
|
28536
28523
|
const extended_leverage = calculateExtendedLevergae();
|
|
28537
28524
|
const latestPosition = (await client.getPositions()).data.pop();
|
|
28538
|
-
console.log("the latest position is", latestPosition, extendedHoldings);
|
|
28539
28525
|
if (!extendedHoldings || !latestPosition) {
|
|
28540
28526
|
logger.error(`error getting extended position: extendedHoldings=${extendedHoldings}, latestPosition=${latestPosition}`);
|
|
28541
28527
|
return null;
|
|
28542
28528
|
}
|
|
28543
|
-
const positionValueInUSD = latestPosition.value;
|
|
28529
|
+
const positionValueInUSD = new Web3Number(latestPosition.value, USDC_TOKEN_DECIMALS);
|
|
28544
28530
|
const equity = extendedHoldings.data.equity;
|
|
28545
|
-
const deposit =
|
|
28546
|
-
return new Web3Number(
|
|
28531
|
+
const deposit = positionValueInUSD.dividedBy(extended_leverage).minus(equity).toFixed(2);
|
|
28532
|
+
return new Web3Number(deposit, USDC_TOKEN_DECIMALS);
|
|
28547
28533
|
} catch (err) {
|
|
28534
|
+
logger.error(`error calculating amount deposit on extended when incurring losses: ${err}`);
|
|
28548
28535
|
return null;
|
|
28549
28536
|
}
|
|
28550
28537
|
};
|
|
@@ -33645,7 +33632,7 @@ var AvnuAdapter = class _AvnuAdapter extends BaseAdapter {
|
|
|
33645
33632
|
}
|
|
33646
33633
|
throw new Error("Failed to fetch quote after retries");
|
|
33647
33634
|
}
|
|
33648
|
-
async getQuotesAvnu(from_token_address, to_token_address, amount, takerAddress, toTokenDecimals, usdcToBtc, maxIterations = 5, tolerance =
|
|
33635
|
+
async getQuotesAvnu(from_token_address, to_token_address, amount, takerAddress, toTokenDecimals, usdcToBtc, maxIterations = 5, tolerance = 1e3) {
|
|
33649
33636
|
try {
|
|
33650
33637
|
const fromToken = this.config.supportedPositions[0].asset;
|
|
33651
33638
|
const toToken = this.config.supportedPositions[1].asset;
|
|
@@ -34017,15 +34004,15 @@ var VesuExtendedMultiplierStrategy = class _VesuExtendedMultiplierStrategy exten
|
|
|
34017
34004
|
}
|
|
34018
34005
|
const usdcAmountInWallet = (await this.getUnusedBalance()).amount;
|
|
34019
34006
|
const usdcAmountOnExtended = parseFloat(
|
|
34020
|
-
extendedHoldings.
|
|
34007
|
+
extendedHoldings.availableForTrade
|
|
34021
34008
|
);
|
|
34022
|
-
if (extendedAmount.minus(usdcAmountOnExtended).greaterThan(0)) {
|
|
34009
|
+
if (extendedAmount.plus(BUFFER_USDC_IN_WITHDRAWAL).minus(usdcAmountOnExtended).greaterThan(0)) {
|
|
34023
34010
|
try {
|
|
34024
34011
|
const { calls: extendedCalls } = await this.moveAssets(
|
|
34025
34012
|
{
|
|
34026
34013
|
to: Protocols.EXTENDED.name,
|
|
34027
34014
|
from: Protocols.VAULT.name,
|
|
34028
|
-
amount: extendedAmount.minus(usdcAmountOnExtended)
|
|
34015
|
+
amount: extendedAmount.plus(BUFFER_USDC_IN_WITHDRAWAL).minus(usdcAmountOnExtended)
|
|
34029
34016
|
},
|
|
34030
34017
|
extendedAdapter,
|
|
34031
34018
|
vesuAdapter
|
|
@@ -34105,21 +34092,30 @@ var VesuExtendedMultiplierStrategy = class _VesuExtendedMultiplierStrategy exten
|
|
|
34105
34092
|
extendedHoldings.availableForWithdrawal,
|
|
34106
34093
|
USDC_TOKEN_DECIMALS
|
|
34107
34094
|
);
|
|
34108
|
-
|
|
34109
|
-
|
|
34110
|
-
|
|
34111
|
-
|
|
34112
|
-
btcAmount.
|
|
34113
|
-
|
|
34114
|
-
|
|
34115
|
-
|
|
34116
|
-
|
|
34117
|
-
|
|
34118
|
-
|
|
34119
|
-
|
|
34120
|
-
|
|
34095
|
+
logger.info(`${_VesuExtendedMultiplierStrategy.name}::moveAssets extendedHoldingAmount: ${extendedHoldingAmount.toNumber()}`);
|
|
34096
|
+
if (params.amount.abs().greaterThan(extendedHoldingAmount)) {
|
|
34097
|
+
const leftAmountAfterWithdrawalAmountInAccount = params.amount.abs().minus(extendedHoldingAmount);
|
|
34098
|
+
logger.info(`${_VesuExtendedMultiplierStrategy.name}::moveAssets leftAmountAfterWithdrawalAmountInAccount: ${leftAmountAfterWithdrawalAmountInAccount.toNumber()}`);
|
|
34099
|
+
const btcAmount = leftAmountAfterWithdrawalAmountInAccount.dividedBy(collateralPrice.price);
|
|
34100
|
+
const openLongPosition = btcAmount.multipliedBy(3).greaterThan(MINIMUM_EXTENDED_POSITION_SIZE) ? await extendedAdapter.createOrder(
|
|
34101
|
+
extendedLeverage.toString(),
|
|
34102
|
+
btcAmount.toNumber(),
|
|
34103
|
+
"BUY" /* BUY */
|
|
34104
|
+
) : await extendedAdapter.createOrder(
|
|
34105
|
+
extendedLeverage.toString(),
|
|
34106
|
+
35e-6,
|
|
34107
|
+
// just in case amount falls short then we need to create a withdrawal
|
|
34108
|
+
"BUY" /* BUY */
|
|
34109
|
+
);
|
|
34110
|
+
if (!openLongPosition) {
|
|
34111
|
+
logger.error(`error opening long position: ${openLongPosition}`);
|
|
34112
|
+
return {
|
|
34113
|
+
calls: [],
|
|
34114
|
+
status: false
|
|
34115
|
+
};
|
|
34116
|
+
}
|
|
34117
|
+
await new Promise((resolve) => setTimeout(resolve, 5e3));
|
|
34121
34118
|
}
|
|
34122
|
-
await new Promise((resolve) => setTimeout(resolve, 5e3));
|
|
34123
34119
|
const withdrawalFromExtended = await extendedAdapter.withdrawFromExtended(params.amount);
|
|
34124
34120
|
if (withdrawalFromExtended) {
|
|
34125
34121
|
const extendedHoldings2 = await extendedAdapter.getExtendedDepositAmount();
|
|
@@ -34244,6 +34240,7 @@ var VesuExtendedMultiplierStrategy = class _VesuExtendedMultiplierStrategy exten
|
|
|
34244
34240
|
};
|
|
34245
34241
|
}
|
|
34246
34242
|
const extendedPositionValue = position.length > 0 ? parseFloat(position[0].value) : 0;
|
|
34243
|
+
const BUFFER_AMOUNT_IN_AVAILABLE_FOR_TRADE = BUFFER_USDC_IN_WITHDRAWAL;
|
|
34247
34244
|
const extendedHoldings = await extendedAdapter.getExtendedDepositAmount();
|
|
34248
34245
|
if (!extendedHoldings) {
|
|
34249
34246
|
logger.error(`error getting extended holdings: ${extendedHoldings}`);
|
|
@@ -34253,7 +34250,7 @@ var VesuExtendedMultiplierStrategy = class _VesuExtendedMultiplierStrategy exten
|
|
|
34253
34250
|
};
|
|
34254
34251
|
}
|
|
34255
34252
|
const extendedHoldingAmount = new Web3Number(
|
|
34256
|
-
extendedHoldings.
|
|
34253
|
+
extendedHoldings.availableForTrade,
|
|
34257
34254
|
USDC_TOKEN_DECIMALS
|
|
34258
34255
|
);
|
|
34259
34256
|
const {
|
|
@@ -34262,7 +34259,7 @@ var VesuExtendedMultiplierStrategy = class _VesuExtendedMultiplierStrategy exten
|
|
|
34262
34259
|
const { collateralPrice } = await this.getAssetPrices();
|
|
34263
34260
|
const { vesuAmountInBTC, extendedAmountInBTC } = calculateVesUPositionSizeGivenExtended(
|
|
34264
34261
|
extendedPositionValue,
|
|
34265
|
-
extendedHoldingAmount,
|
|
34262
|
+
extendedHoldingAmount.minus(BUFFER_AMOUNT_IN_AVAILABLE_FOR_TRADE),
|
|
34266
34263
|
collateralTokenAmount,
|
|
34267
34264
|
collateralPrice.price
|
|
34268
34265
|
);
|
|
@@ -34279,7 +34276,6 @@ var VesuExtendedMultiplierStrategy = class _VesuExtendedMultiplierStrategy exten
|
|
|
34279
34276
|
);
|
|
34280
34277
|
const { amount: wbtcAmountInVaultAllocator } = await this.getUnusedBalanceWBTC();
|
|
34281
34278
|
if (wbtcAmountInVaultAllocator.lessThan(vesuAmountInBTC)) {
|
|
34282
|
-
logger.info(`WBTC amount in vault allocator is less than vesu amount required in WBTC thus swapping, wbtcAmountInVaultAllocator: ${wbtcAmountInVaultAllocator}, vesuAmountInBTC: ${vesuAmountInBTC}`);
|
|
34283
34279
|
const swapProofsInfo = avnuAdapter.getProofs(true, this.getMerkleTree());
|
|
34284
34280
|
const swapProofGroups = swapProofsInfo.proofs;
|
|
34285
34281
|
const swapCall = this.getManageCall(
|
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) {
|
|
@@ -4546,7 +4535,6 @@ var EkuboQuoter = class _EkuboQuoter {
|
|
|
4546
4535
|
return quote.splits.map((split) => {
|
|
4547
4536
|
const isNegativeAmount = BigInt(split.amount_specified) <= 0n;
|
|
4548
4537
|
const token = isNegativeAmount ? toTokenInfo : fromTokenInfo;
|
|
4549
|
-
console.log("token for withdrawal", token, isNegativeAmount);
|
|
4550
4538
|
return {
|
|
4551
4539
|
route: split.route.map((_route) => ({
|
|
4552
4540
|
pool_key: {
|
|
@@ -28257,7 +28245,6 @@ var calculateAmountDistributionForWithdrawal = async (amountInUsdc, collateralPr
|
|
|
28257
28245
|
return null;
|
|
28258
28246
|
}
|
|
28259
28247
|
const extendedExposureUSD = extendedPosition.length > 0 ? new Web3Number(extendedPosition[0].value, USDC_TOKEN_DECIMALS) : new Web3Number(0, USDC_TOKEN_DECIMALS);
|
|
28260
|
-
console.log("THe collateral is", collateralPrice, collateralUnits);
|
|
28261
28248
|
const vesuExposureUSD = collateralUnits.multipliedBy(collateralPrice);
|
|
28262
28249
|
if (vesuExposureUSD.lessThan(0)) {
|
|
28263
28250
|
return {
|
|
@@ -28314,10 +28301,10 @@ var calculateExtendedLevergae = () => {
|
|
|
28314
28301
|
const extended_leverage_max = 1 / (MAINTENANCE_MARGIN + MAX_PRICE_DROP_PERCENTAGE);
|
|
28315
28302
|
return Math.floor(extended_leverage_max);
|
|
28316
28303
|
};
|
|
28317
|
-
var calculateDebtAmount = (collateralAmount, debtAmount, debtPrice, maxLtv =
|
|
28304
|
+
var calculateDebtAmount = (collateralAmount, debtAmount, debtPrice, maxLtv = MAX_LIQUIDATION_RATIO, addedAmount, collateralPrice, isDeposit) => {
|
|
28318
28305
|
try {
|
|
28319
|
-
const
|
|
28320
|
-
const numerator1 = collateralAmount.plus(
|
|
28306
|
+
const addedCollateral = addedAmount.multipliedBy(isDeposit ? 1 : -1);
|
|
28307
|
+
const numerator1 = collateralAmount.plus(addedCollateral).multipliedBy(collateralPrice).multipliedBy(maxLtv);
|
|
28321
28308
|
const numerator2 = debtAmount.multipliedBy(debtPrice).multipliedBy(TARGET_HF);
|
|
28322
28309
|
const denominator = TARGET_HF - maxLtv;
|
|
28323
28310
|
const x_debt_usd = numerator1.minus(numerator2).dividedBy(denominator);
|
|
@@ -28352,16 +28339,16 @@ var calculateAmountDepositOnExtendedWhenIncurringLosses = async (client) => {
|
|
|
28352
28339
|
const extendedHoldings = await client.getHoldings();
|
|
28353
28340
|
const extended_leverage = calculateExtendedLevergae();
|
|
28354
28341
|
const latestPosition = (await client.getPositions()).data.pop();
|
|
28355
|
-
console.log("the latest position is", latestPosition, extendedHoldings);
|
|
28356
28342
|
if (!extendedHoldings || !latestPosition) {
|
|
28357
28343
|
logger.error(`error getting extended position: extendedHoldings=${extendedHoldings}, latestPosition=${latestPosition}`);
|
|
28358
28344
|
return null;
|
|
28359
28345
|
}
|
|
28360
|
-
const positionValueInUSD = latestPosition.value;
|
|
28346
|
+
const positionValueInUSD = new Web3Number(latestPosition.value, USDC_TOKEN_DECIMALS);
|
|
28361
28347
|
const equity = extendedHoldings.data.equity;
|
|
28362
|
-
const deposit =
|
|
28363
|
-
return new Web3Number(
|
|
28348
|
+
const deposit = positionValueInUSD.dividedBy(extended_leverage).minus(equity).toFixed(2);
|
|
28349
|
+
return new Web3Number(deposit, USDC_TOKEN_DECIMALS);
|
|
28364
28350
|
} catch (err) {
|
|
28351
|
+
logger.error(`error calculating amount deposit on extended when incurring losses: ${err}`);
|
|
28365
28352
|
return null;
|
|
28366
28353
|
}
|
|
28367
28354
|
};
|
|
@@ -33798,7 +33785,7 @@ var AvnuAdapter = class _AvnuAdapter extends BaseAdapter {
|
|
|
33798
33785
|
}
|
|
33799
33786
|
throw new Error("Failed to fetch quote after retries");
|
|
33800
33787
|
}
|
|
33801
|
-
async getQuotesAvnu(from_token_address, to_token_address, amount, takerAddress, toTokenDecimals, usdcToBtc, maxIterations = 5, tolerance =
|
|
33788
|
+
async getQuotesAvnu(from_token_address, to_token_address, amount, takerAddress, toTokenDecimals, usdcToBtc, maxIterations = 5, tolerance = 1e3) {
|
|
33802
33789
|
try {
|
|
33803
33790
|
const fromToken = this.config.supportedPositions[0].asset;
|
|
33804
33791
|
const toToken = this.config.supportedPositions[1].asset;
|
|
@@ -34170,15 +34157,15 @@ var VesuExtendedMultiplierStrategy = class _VesuExtendedMultiplierStrategy exten
|
|
|
34170
34157
|
}
|
|
34171
34158
|
const usdcAmountInWallet = (await this.getUnusedBalance()).amount;
|
|
34172
34159
|
const usdcAmountOnExtended = parseFloat(
|
|
34173
|
-
extendedHoldings.
|
|
34160
|
+
extendedHoldings.availableForTrade
|
|
34174
34161
|
);
|
|
34175
|
-
if (extendedAmount.minus(usdcAmountOnExtended).greaterThan(0)) {
|
|
34162
|
+
if (extendedAmount.plus(BUFFER_USDC_IN_WITHDRAWAL).minus(usdcAmountOnExtended).greaterThan(0)) {
|
|
34176
34163
|
try {
|
|
34177
34164
|
const { calls: extendedCalls } = await this.moveAssets(
|
|
34178
34165
|
{
|
|
34179
34166
|
to: Protocols.EXTENDED.name,
|
|
34180
34167
|
from: Protocols.VAULT.name,
|
|
34181
|
-
amount: extendedAmount.minus(usdcAmountOnExtended)
|
|
34168
|
+
amount: extendedAmount.plus(BUFFER_USDC_IN_WITHDRAWAL).minus(usdcAmountOnExtended)
|
|
34182
34169
|
},
|
|
34183
34170
|
extendedAdapter,
|
|
34184
34171
|
vesuAdapter
|
|
@@ -34258,21 +34245,30 @@ var VesuExtendedMultiplierStrategy = class _VesuExtendedMultiplierStrategy exten
|
|
|
34258
34245
|
extendedHoldings.availableForWithdrawal,
|
|
34259
34246
|
USDC_TOKEN_DECIMALS
|
|
34260
34247
|
);
|
|
34261
|
-
|
|
34262
|
-
|
|
34263
|
-
|
|
34264
|
-
|
|
34265
|
-
btcAmount.
|
|
34266
|
-
|
|
34267
|
-
|
|
34268
|
-
|
|
34269
|
-
|
|
34270
|
-
|
|
34271
|
-
|
|
34272
|
-
|
|
34273
|
-
|
|
34248
|
+
logger.info(`${_VesuExtendedMultiplierStrategy.name}::moveAssets extendedHoldingAmount: ${extendedHoldingAmount.toNumber()}`);
|
|
34249
|
+
if (params.amount.abs().greaterThan(extendedHoldingAmount)) {
|
|
34250
|
+
const leftAmountAfterWithdrawalAmountInAccount = params.amount.abs().minus(extendedHoldingAmount);
|
|
34251
|
+
logger.info(`${_VesuExtendedMultiplierStrategy.name}::moveAssets leftAmountAfterWithdrawalAmountInAccount: ${leftAmountAfterWithdrawalAmountInAccount.toNumber()}`);
|
|
34252
|
+
const btcAmount = leftAmountAfterWithdrawalAmountInAccount.dividedBy(collateralPrice.price);
|
|
34253
|
+
const openLongPosition = btcAmount.multipliedBy(3).greaterThan(MINIMUM_EXTENDED_POSITION_SIZE) ? await extendedAdapter.createOrder(
|
|
34254
|
+
extendedLeverage.toString(),
|
|
34255
|
+
btcAmount.toNumber(),
|
|
34256
|
+
"BUY" /* BUY */
|
|
34257
|
+
) : await extendedAdapter.createOrder(
|
|
34258
|
+
extendedLeverage.toString(),
|
|
34259
|
+
35e-6,
|
|
34260
|
+
// just in case amount falls short then we need to create a withdrawal
|
|
34261
|
+
"BUY" /* BUY */
|
|
34262
|
+
);
|
|
34263
|
+
if (!openLongPosition) {
|
|
34264
|
+
logger.error(`error opening long position: ${openLongPosition}`);
|
|
34265
|
+
return {
|
|
34266
|
+
calls: [],
|
|
34267
|
+
status: false
|
|
34268
|
+
};
|
|
34269
|
+
}
|
|
34270
|
+
await new Promise((resolve) => setTimeout(resolve, 5e3));
|
|
34274
34271
|
}
|
|
34275
|
-
await new Promise((resolve) => setTimeout(resolve, 5e3));
|
|
34276
34272
|
const withdrawalFromExtended = await extendedAdapter.withdrawFromExtended(params.amount);
|
|
34277
34273
|
if (withdrawalFromExtended) {
|
|
34278
34274
|
const extendedHoldings2 = await extendedAdapter.getExtendedDepositAmount();
|
|
@@ -34397,6 +34393,7 @@ var VesuExtendedMultiplierStrategy = class _VesuExtendedMultiplierStrategy exten
|
|
|
34397
34393
|
};
|
|
34398
34394
|
}
|
|
34399
34395
|
const extendedPositionValue = position.length > 0 ? parseFloat(position[0].value) : 0;
|
|
34396
|
+
const BUFFER_AMOUNT_IN_AVAILABLE_FOR_TRADE = BUFFER_USDC_IN_WITHDRAWAL;
|
|
34400
34397
|
const extendedHoldings = await extendedAdapter.getExtendedDepositAmount();
|
|
34401
34398
|
if (!extendedHoldings) {
|
|
34402
34399
|
logger.error(`error getting extended holdings: ${extendedHoldings}`);
|
|
@@ -34406,7 +34403,7 @@ var VesuExtendedMultiplierStrategy = class _VesuExtendedMultiplierStrategy exten
|
|
|
34406
34403
|
};
|
|
34407
34404
|
}
|
|
34408
34405
|
const extendedHoldingAmount = new Web3Number(
|
|
34409
|
-
extendedHoldings.
|
|
34406
|
+
extendedHoldings.availableForTrade,
|
|
34410
34407
|
USDC_TOKEN_DECIMALS
|
|
34411
34408
|
);
|
|
34412
34409
|
const {
|
|
@@ -34415,7 +34412,7 @@ var VesuExtendedMultiplierStrategy = class _VesuExtendedMultiplierStrategy exten
|
|
|
34415
34412
|
const { collateralPrice } = await this.getAssetPrices();
|
|
34416
34413
|
const { vesuAmountInBTC, extendedAmountInBTC } = calculateVesUPositionSizeGivenExtended(
|
|
34417
34414
|
extendedPositionValue,
|
|
34418
|
-
extendedHoldingAmount,
|
|
34415
|
+
extendedHoldingAmount.minus(BUFFER_AMOUNT_IN_AVAILABLE_FOR_TRADE),
|
|
34419
34416
|
collateralTokenAmount,
|
|
34420
34417
|
collateralPrice.price
|
|
34421
34418
|
);
|
|
@@ -34432,7 +34429,6 @@ var VesuExtendedMultiplierStrategy = class _VesuExtendedMultiplierStrategy exten
|
|
|
34432
34429
|
);
|
|
34433
34430
|
const { amount: wbtcAmountInVaultAllocator } = await this.getUnusedBalanceWBTC();
|
|
34434
34431
|
if (wbtcAmountInVaultAllocator.lessThan(vesuAmountInBTC)) {
|
|
34435
|
-
logger.info(`WBTC amount in vault allocator is less than vesu amount required in WBTC thus swapping, wbtcAmountInVaultAllocator: ${wbtcAmountInVaultAllocator}, vesuAmountInBTC: ${vesuAmountInBTC}`);
|
|
34436
34432
|
const swapProofsInfo = avnuAdapter.getProofs(true, this.getMerkleTree());
|
|
34437
34433
|
const swapProofGroups = swapProofsInfo.proofs;
|
|
34438
34434
|
const swapCall = this.getManageCall(
|
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) {
|
|
@@ -4400,7 +4389,6 @@ var EkuboQuoter = class _EkuboQuoter {
|
|
|
4400
4389
|
return quote.splits.map((split) => {
|
|
4401
4390
|
const isNegativeAmount = BigInt(split.amount_specified) <= 0n;
|
|
4402
4391
|
const token = isNegativeAmount ? toTokenInfo : fromTokenInfo;
|
|
4403
|
-
console.log("token for withdrawal", token, isNegativeAmount);
|
|
4404
4392
|
return {
|
|
4405
4393
|
route: split.route.map((_route) => ({
|
|
4406
4394
|
pool_key: {
|
|
@@ -28115,7 +28103,6 @@ var calculateAmountDistributionForWithdrawal = async (amountInUsdc, collateralPr
|
|
|
28115
28103
|
return null;
|
|
28116
28104
|
}
|
|
28117
28105
|
const extendedExposureUSD = extendedPosition.length > 0 ? new Web3Number(extendedPosition[0].value, USDC_TOKEN_DECIMALS) : new Web3Number(0, USDC_TOKEN_DECIMALS);
|
|
28118
|
-
console.log("THe collateral is", collateralPrice, collateralUnits);
|
|
28119
28106
|
const vesuExposureUSD = collateralUnits.multipliedBy(collateralPrice);
|
|
28120
28107
|
if (vesuExposureUSD.lessThan(0)) {
|
|
28121
28108
|
return {
|
|
@@ -28172,10 +28159,10 @@ var calculateExtendedLevergae = () => {
|
|
|
28172
28159
|
const extended_leverage_max = 1 / (MAINTENANCE_MARGIN + MAX_PRICE_DROP_PERCENTAGE);
|
|
28173
28160
|
return Math.floor(extended_leverage_max);
|
|
28174
28161
|
};
|
|
28175
|
-
var calculateDebtAmount = (collateralAmount, debtAmount, debtPrice, maxLtv =
|
|
28162
|
+
var calculateDebtAmount = (collateralAmount, debtAmount, debtPrice, maxLtv = MAX_LIQUIDATION_RATIO, addedAmount, collateralPrice, isDeposit) => {
|
|
28176
28163
|
try {
|
|
28177
|
-
const
|
|
28178
|
-
const numerator1 = collateralAmount.plus(
|
|
28164
|
+
const addedCollateral = addedAmount.multipliedBy(isDeposit ? 1 : -1);
|
|
28165
|
+
const numerator1 = collateralAmount.plus(addedCollateral).multipliedBy(collateralPrice).multipliedBy(maxLtv);
|
|
28179
28166
|
const numerator2 = debtAmount.multipliedBy(debtPrice).multipliedBy(TARGET_HF);
|
|
28180
28167
|
const denominator = TARGET_HF - maxLtv;
|
|
28181
28168
|
const x_debt_usd = numerator1.minus(numerator2).dividedBy(denominator);
|
|
@@ -28210,16 +28197,16 @@ var calculateAmountDepositOnExtendedWhenIncurringLosses = async (client) => {
|
|
|
28210
28197
|
const extendedHoldings = await client.getHoldings();
|
|
28211
28198
|
const extended_leverage = calculateExtendedLevergae();
|
|
28212
28199
|
const latestPosition = (await client.getPositions()).data.pop();
|
|
28213
|
-
console.log("the latest position is", latestPosition, extendedHoldings);
|
|
28214
28200
|
if (!extendedHoldings || !latestPosition) {
|
|
28215
28201
|
logger.error(`error getting extended position: extendedHoldings=${extendedHoldings}, latestPosition=${latestPosition}`);
|
|
28216
28202
|
return null;
|
|
28217
28203
|
}
|
|
28218
|
-
const positionValueInUSD = latestPosition.value;
|
|
28204
|
+
const positionValueInUSD = new Web3Number(latestPosition.value, USDC_TOKEN_DECIMALS);
|
|
28219
28205
|
const equity = extendedHoldings.data.equity;
|
|
28220
|
-
const deposit =
|
|
28221
|
-
return new Web3Number(
|
|
28206
|
+
const deposit = positionValueInUSD.dividedBy(extended_leverage).minus(equity).toFixed(2);
|
|
28207
|
+
return new Web3Number(deposit, USDC_TOKEN_DECIMALS);
|
|
28222
28208
|
} catch (err) {
|
|
28209
|
+
logger.error(`error calculating amount deposit on extended when incurring losses: ${err}`);
|
|
28223
28210
|
return null;
|
|
28224
28211
|
}
|
|
28225
28212
|
};
|
|
@@ -33656,7 +33643,7 @@ var AvnuAdapter = class _AvnuAdapter extends BaseAdapter {
|
|
|
33656
33643
|
}
|
|
33657
33644
|
throw new Error("Failed to fetch quote after retries");
|
|
33658
33645
|
}
|
|
33659
|
-
async getQuotesAvnu(from_token_address, to_token_address, amount, takerAddress, toTokenDecimals, usdcToBtc, maxIterations = 5, tolerance =
|
|
33646
|
+
async getQuotesAvnu(from_token_address, to_token_address, amount, takerAddress, toTokenDecimals, usdcToBtc, maxIterations = 5, tolerance = 1e3) {
|
|
33660
33647
|
try {
|
|
33661
33648
|
const fromToken = this.config.supportedPositions[0].asset;
|
|
33662
33649
|
const toToken = this.config.supportedPositions[1].asset;
|
|
@@ -34028,15 +34015,15 @@ var VesuExtendedMultiplierStrategy = class _VesuExtendedMultiplierStrategy exten
|
|
|
34028
34015
|
}
|
|
34029
34016
|
const usdcAmountInWallet = (await this.getUnusedBalance()).amount;
|
|
34030
34017
|
const usdcAmountOnExtended = parseFloat(
|
|
34031
|
-
extendedHoldings.
|
|
34018
|
+
extendedHoldings.availableForTrade
|
|
34032
34019
|
);
|
|
34033
|
-
if (extendedAmount.minus(usdcAmountOnExtended).greaterThan(0)) {
|
|
34020
|
+
if (extendedAmount.plus(BUFFER_USDC_IN_WITHDRAWAL).minus(usdcAmountOnExtended).greaterThan(0)) {
|
|
34034
34021
|
try {
|
|
34035
34022
|
const { calls: extendedCalls } = await this.moveAssets(
|
|
34036
34023
|
{
|
|
34037
34024
|
to: Protocols.EXTENDED.name,
|
|
34038
34025
|
from: Protocols.VAULT.name,
|
|
34039
|
-
amount: extendedAmount.minus(usdcAmountOnExtended)
|
|
34026
|
+
amount: extendedAmount.plus(BUFFER_USDC_IN_WITHDRAWAL).minus(usdcAmountOnExtended)
|
|
34040
34027
|
},
|
|
34041
34028
|
extendedAdapter,
|
|
34042
34029
|
vesuAdapter
|
|
@@ -34116,21 +34103,30 @@ var VesuExtendedMultiplierStrategy = class _VesuExtendedMultiplierStrategy exten
|
|
|
34116
34103
|
extendedHoldings.availableForWithdrawal,
|
|
34117
34104
|
USDC_TOKEN_DECIMALS
|
|
34118
34105
|
);
|
|
34119
|
-
|
|
34120
|
-
|
|
34121
|
-
|
|
34122
|
-
|
|
34123
|
-
btcAmount.
|
|
34124
|
-
|
|
34125
|
-
|
|
34126
|
-
|
|
34127
|
-
|
|
34128
|
-
|
|
34129
|
-
|
|
34130
|
-
|
|
34131
|
-
|
|
34106
|
+
logger.info(`${_VesuExtendedMultiplierStrategy.name}::moveAssets extendedHoldingAmount: ${extendedHoldingAmount.toNumber()}`);
|
|
34107
|
+
if (params.amount.abs().greaterThan(extendedHoldingAmount)) {
|
|
34108
|
+
const leftAmountAfterWithdrawalAmountInAccount = params.amount.abs().minus(extendedHoldingAmount);
|
|
34109
|
+
logger.info(`${_VesuExtendedMultiplierStrategy.name}::moveAssets leftAmountAfterWithdrawalAmountInAccount: ${leftAmountAfterWithdrawalAmountInAccount.toNumber()}`);
|
|
34110
|
+
const btcAmount = leftAmountAfterWithdrawalAmountInAccount.dividedBy(collateralPrice.price);
|
|
34111
|
+
const openLongPosition = btcAmount.multipliedBy(3).greaterThan(MINIMUM_EXTENDED_POSITION_SIZE) ? await extendedAdapter.createOrder(
|
|
34112
|
+
extendedLeverage.toString(),
|
|
34113
|
+
btcAmount.toNumber(),
|
|
34114
|
+
"BUY" /* BUY */
|
|
34115
|
+
) : await extendedAdapter.createOrder(
|
|
34116
|
+
extendedLeverage.toString(),
|
|
34117
|
+
35e-6,
|
|
34118
|
+
// just in case amount falls short then we need to create a withdrawal
|
|
34119
|
+
"BUY" /* BUY */
|
|
34120
|
+
);
|
|
34121
|
+
if (!openLongPosition) {
|
|
34122
|
+
logger.error(`error opening long position: ${openLongPosition}`);
|
|
34123
|
+
return {
|
|
34124
|
+
calls: [],
|
|
34125
|
+
status: false
|
|
34126
|
+
};
|
|
34127
|
+
}
|
|
34128
|
+
await new Promise((resolve) => setTimeout(resolve, 5e3));
|
|
34132
34129
|
}
|
|
34133
|
-
await new Promise((resolve) => setTimeout(resolve, 5e3));
|
|
34134
34130
|
const withdrawalFromExtended = await extendedAdapter.withdrawFromExtended(params.amount);
|
|
34135
34131
|
if (withdrawalFromExtended) {
|
|
34136
34132
|
const extendedHoldings2 = await extendedAdapter.getExtendedDepositAmount();
|
|
@@ -34255,6 +34251,7 @@ var VesuExtendedMultiplierStrategy = class _VesuExtendedMultiplierStrategy exten
|
|
|
34255
34251
|
};
|
|
34256
34252
|
}
|
|
34257
34253
|
const extendedPositionValue = position.length > 0 ? parseFloat(position[0].value) : 0;
|
|
34254
|
+
const BUFFER_AMOUNT_IN_AVAILABLE_FOR_TRADE = BUFFER_USDC_IN_WITHDRAWAL;
|
|
34258
34255
|
const extendedHoldings = await extendedAdapter.getExtendedDepositAmount();
|
|
34259
34256
|
if (!extendedHoldings) {
|
|
34260
34257
|
logger.error(`error getting extended holdings: ${extendedHoldings}`);
|
|
@@ -34264,7 +34261,7 @@ var VesuExtendedMultiplierStrategy = class _VesuExtendedMultiplierStrategy exten
|
|
|
34264
34261
|
};
|
|
34265
34262
|
}
|
|
34266
34263
|
const extendedHoldingAmount = new Web3Number(
|
|
34267
|
-
extendedHoldings.
|
|
34264
|
+
extendedHoldings.availableForTrade,
|
|
34268
34265
|
USDC_TOKEN_DECIMALS
|
|
34269
34266
|
);
|
|
34270
34267
|
const {
|
|
@@ -34273,7 +34270,7 @@ var VesuExtendedMultiplierStrategy = class _VesuExtendedMultiplierStrategy exten
|
|
|
34273
34270
|
const { collateralPrice } = await this.getAssetPrices();
|
|
34274
34271
|
const { vesuAmountInBTC, extendedAmountInBTC } = calculateVesUPositionSizeGivenExtended(
|
|
34275
34272
|
extendedPositionValue,
|
|
34276
|
-
extendedHoldingAmount,
|
|
34273
|
+
extendedHoldingAmount.minus(BUFFER_AMOUNT_IN_AVAILABLE_FOR_TRADE),
|
|
34277
34274
|
collateralTokenAmount,
|
|
34278
34275
|
collateralPrice.price
|
|
34279
34276
|
);
|
|
@@ -34290,7 +34287,6 @@ var VesuExtendedMultiplierStrategy = class _VesuExtendedMultiplierStrategy exten
|
|
|
34290
34287
|
);
|
|
34291
34288
|
const { amount: wbtcAmountInVaultAllocator } = await this.getUnusedBalanceWBTC();
|
|
34292
34289
|
if (wbtcAmountInVaultAllocator.lessThan(vesuAmountInBTC)) {
|
|
34293
|
-
logger.info(`WBTC amount in vault allocator is less than vesu amount required in WBTC thus swapping, wbtcAmountInVaultAllocator: ${wbtcAmountInVaultAllocator}, vesuAmountInBTC: ${vesuAmountInBTC}`);
|
|
34294
34290
|
const swapProofsInfo = avnuAdapter.getProofs(true, this.getMerkleTree());
|
|
34295
34291
|
const swapProofGroups = swapProofsInfo.proofs;
|
|
34296
34292
|
const swapCall = this.getManageCall(
|
package/package.json
CHANGED
|
@@ -70,21 +70,14 @@ export class EkuboQuoter {
|
|
|
70
70
|
async getDexPrice(baseToken: TokenInfo, quoteToken: TokenInfo, amount: Web3Number) {
|
|
71
71
|
const lstTokenInfo = baseToken;
|
|
72
72
|
const lstUnderlyingTokenInfo = quoteToken;
|
|
73
|
-
console.log("lstTokenInfo", lstTokenInfo);
|
|
74
|
-
console.log("lstUnderlyingTokenInfo", lstUnderlyingTokenInfo);
|
|
75
|
-
console.log("amount", amount);
|
|
76
73
|
const quote = await this.getQuote(
|
|
77
74
|
lstTokenInfo.address.address,
|
|
78
75
|
lstUnderlyingTokenInfo.address.address,
|
|
79
76
|
amount
|
|
80
77
|
);
|
|
81
|
-
console.log("quote", quote);
|
|
82
78
|
// in Underlying
|
|
83
79
|
const outputAmount = Web3Number.fromWei(quote.total_calculated, lstUnderlyingTokenInfo.decimals);
|
|
84
|
-
console.log("outputAmount", outputAmount);
|
|
85
|
-
console.log("amount", amount);
|
|
86
80
|
const price = outputAmount.toNumber() / amount.toNumber();
|
|
87
|
-
console.log("price", price);
|
|
88
81
|
logger.verbose(`${EkuboQuoter.name}:: LST Dex Price: ${price}`);
|
|
89
82
|
return price;
|
|
90
83
|
}
|
|
@@ -105,7 +98,6 @@ export class EkuboQuoter {
|
|
|
105
98
|
// debt collateral
|
|
106
99
|
async getSwapLimitAmount(fromToken: TokenInfo, toToken: TokenInfo, amount: Web3Number, max_slippage: number = 0.002): Promise<Web3Number> {
|
|
107
100
|
const isExactAmountIn = amount.greaterThanOrEqualTo(0);
|
|
108
|
-
console.log("isExactAmountIn", isExactAmountIn);
|
|
109
101
|
logger.verbose(`${EkuboQuoter.name}::getSwapLimitAmount isExactAmountIn: ${isExactAmountIn}, fromToken: ${fromToken.symbol}, toToken: ${toToken.symbol}, amount: ${amount}`);
|
|
110
102
|
const isYieldToken = this.tokenMarketData.isAPYSupported(toToken);
|
|
111
103
|
console.log("isYieldToken", isYieldToken);
|
|
@@ -114,13 +106,10 @@ export class EkuboQuoter {
|
|
|
114
106
|
// wbtc
|
|
115
107
|
const baseToken = isExactAmountIn ? toToken : fromToken; // fromToken -> wbtc,
|
|
116
108
|
const quoteToken = isExactAmountIn ? fromToken : toToken; // toToken -> usdc,
|
|
117
|
-
console.log("baseToken", baseToken);
|
|
118
|
-
console.log("quoteToken", quoteToken);
|
|
119
109
|
// need dex price of from token in toToken
|
|
120
110
|
// from baseToken to underlying token
|
|
121
111
|
// for withdraw, usdc to btc with amount negative
|
|
122
112
|
const dexPrice = await this.getDexPrice(baseToken, quoteToken, amount);
|
|
123
|
-
console.log("dexPrice", dexPrice);
|
|
124
113
|
const trueExchangeRate = isYieldToken ? await this.tokenMarketData.getTruePrice(baseToken) : dexPrice;
|
|
125
114
|
console.log("trueExchangeRate", trueExchangeRate);
|
|
126
115
|
if (isExactAmountIn) {
|
|
@@ -155,7 +144,6 @@ export class EkuboQuoter {
|
|
|
155
144
|
|
|
156
145
|
const isNegativeAmount = BigInt(split.amount_specified) <= 0n;
|
|
157
146
|
const token = isNegativeAmount ? toTokenInfo : fromTokenInfo;
|
|
158
|
-
console.log("token for withdrawal", token, isNegativeAmount);
|
|
159
147
|
return {
|
|
160
148
|
route: split.route.map(_route => ({
|
|
161
149
|
pool_key: {
|
|
@@ -156,8 +156,8 @@ export class AvnuAdapter extends BaseAdapter<DepositParams, WithdrawParams> {
|
|
|
156
156
|
|
|
157
157
|
async getDepositCall(params: DepositParams): Promise<ManageCall[]> {
|
|
158
158
|
try {
|
|
159
|
-
const fromToken = this.config.supportedPositions[0].asset;
|
|
160
|
-
const toToken = this.config.supportedPositions[1].asset;
|
|
159
|
+
const fromToken = this.config.supportedPositions[0].asset; //usdc
|
|
160
|
+
const toToken = this.config.supportedPositions[1].asset; //wbtc
|
|
161
161
|
const vaultAllocator = ContractAddr.from(
|
|
162
162
|
this.config.vaultAllocator.address
|
|
163
163
|
);
|
|
@@ -169,15 +169,18 @@ export class AvnuAdapter extends BaseAdapter<DepositParams, WithdrawParams> {
|
|
|
169
169
|
toToken.decimals,
|
|
170
170
|
true
|
|
171
171
|
)
|
|
172
|
+
//console.log(`${AvnuAdapter.name}::getDepositCall quote: ${JSON.stringify(quote)}`);
|
|
172
173
|
if (!quote) {
|
|
173
174
|
logger.error("error getting quote from avnu");
|
|
174
175
|
return [];
|
|
175
176
|
}
|
|
177
|
+
|
|
176
178
|
const getCalldata = await this.avnuWrapper.getSwapCallData(
|
|
177
179
|
quote,
|
|
178
180
|
vaultAllocator.address
|
|
179
181
|
);
|
|
180
182
|
const swapCallData = getCalldata[0];
|
|
183
|
+
|
|
181
184
|
// const approveCallData = getCalldata[0];
|
|
182
185
|
const amount = uint256.bnToUint256(quote.sellAmountInUsd*10**7)
|
|
183
186
|
return [
|
|
@@ -300,7 +303,7 @@ export class AvnuAdapter extends BaseAdapter<DepositParams, WithdrawParams> {
|
|
|
300
303
|
toTokenDecimals: number,
|
|
301
304
|
usdcToBtc: boolean,
|
|
302
305
|
maxIterations: number = 5,
|
|
303
|
-
tolerance: number =
|
|
306
|
+
tolerance: number = 1000
|
|
304
307
|
): Promise<Quote | null>{
|
|
305
308
|
try {
|
|
306
309
|
const fromToken = this.config.supportedPositions[0].asset;
|
|
@@ -131,9 +131,6 @@ export const calculateAmountDistributionForWithdrawal = async (
|
|
|
131
131
|
extendedPosition.length > 0
|
|
132
132
|
? new Web3Number(extendedPosition[0].value, USDC_TOKEN_DECIMALS)
|
|
133
133
|
: new Web3Number(0, USDC_TOKEN_DECIMALS);
|
|
134
|
-
console.log("THe collateral is", collateralPrice, collateralUnits);
|
|
135
|
-
// console.log("the extended exposure usd is", extendedExposureUSD.toNumber());
|
|
136
|
-
//console.log("the collateral units are", collateralUnits.toNumber());\
|
|
137
134
|
const vesuExposureUSD = collateralUnits.multipliedBy(collateralPrice);
|
|
138
135
|
if (vesuExposureUSD.lessThan(0)) {
|
|
139
136
|
return {
|
|
@@ -223,16 +220,16 @@ export const calculateDebtAmount = (
|
|
|
223
220
|
collateralAmount: Web3Number,
|
|
224
221
|
debtAmount: Web3Number,
|
|
225
222
|
debtPrice: number,
|
|
226
|
-
maxLtv: number =
|
|
223
|
+
maxLtv: number = MAX_LIQUIDATION_RATIO,
|
|
227
224
|
addedAmount: Web3Number, // this is in btc
|
|
228
225
|
collateralPrice: number,
|
|
229
226
|
isDeposit: boolean
|
|
230
227
|
) => {
|
|
231
228
|
try {
|
|
232
229
|
// => X = (((collateral + legDepositAmount) * collateralPrice * ltv) - (debt * debtPrice * target hf)) / (target hf - ltv)
|
|
233
|
-
const
|
|
234
|
-
const numerator1 = collateralAmount
|
|
235
|
-
.plus(
|
|
230
|
+
const addedCollateral = addedAmount.multipliedBy(isDeposit ? 1 : -1);
|
|
231
|
+
const numerator1 = (collateralAmount
|
|
232
|
+
.plus(addedCollateral))
|
|
236
233
|
.multipliedBy(collateralPrice)
|
|
237
234
|
.multipliedBy(maxLtv);
|
|
238
235
|
const numerator2 = debtAmount
|
|
@@ -308,17 +305,16 @@ export const calculateAmountDepositOnExtendedWhenIncurringLosses = async (
|
|
|
308
305
|
const extendedHoldings = await client.getHoldings();
|
|
309
306
|
const extended_leverage = calculateExtendedLevergae();
|
|
310
307
|
const latestPosition = (await client.getPositions()).data.pop();
|
|
311
|
-
console.log("the latest position is", latestPosition, extendedHoldings);
|
|
312
308
|
if (!extendedHoldings || !latestPosition) {
|
|
313
309
|
logger.error(`error getting extended position: extendedHoldings=${extendedHoldings}, latestPosition=${latestPosition}`);
|
|
314
310
|
return null;
|
|
315
311
|
}
|
|
316
|
-
const positionValueInUSD = latestPosition.value;
|
|
312
|
+
const positionValueInUSD = new Web3Number(latestPosition.value, USDC_TOKEN_DECIMALS);
|
|
317
313
|
const equity = extendedHoldings.data.equity;
|
|
318
|
-
const deposit =
|
|
319
|
-
|
|
320
|
-
return new Web3Number(Math.floor(deposit / 0.2) * 0.2, USDC_TOKEN_DECIMALS);
|
|
314
|
+
const deposit = positionValueInUSD.dividedBy(extended_leverage).minus(equity).toFixed(2);
|
|
315
|
+
return new Web3Number(deposit, USDC_TOKEN_DECIMALS);
|
|
321
316
|
} catch (err) {
|
|
317
|
+
logger.error(`error calculating amount deposit on extended when incurring losses: ${err}`);
|
|
322
318
|
return null;
|
|
323
319
|
}
|
|
324
320
|
};
|
|
@@ -337,7 +337,7 @@ export class VesuExtendedMultiplierStrategy<
|
|
|
337
337
|
}
|
|
338
338
|
if (extendedAmount.lessThan(0)) {
|
|
339
339
|
try {
|
|
340
|
-
const {calls: extendedCalls, status: extendedStatus} = await this.moveAssets(
|
|
340
|
+
const { calls: extendedCalls, status: extendedStatus } = await this.moveAssets(
|
|
341
341
|
{
|
|
342
342
|
to: Protocols.VAULT.name,
|
|
343
343
|
from: Protocols.EXTENDED.name,
|
|
@@ -347,9 +347,9 @@ export class VesuExtendedMultiplierStrategy<
|
|
|
347
347
|
vesuAdapter
|
|
348
348
|
);
|
|
349
349
|
//If withdrawal succesfull, then do further
|
|
350
|
-
if(extendedStatus){
|
|
351
|
-
|
|
352
|
-
}else{
|
|
350
|
+
if (extendedStatus) {
|
|
351
|
+
calls.push(...extendedCalls);
|
|
352
|
+
} else {
|
|
353
353
|
return [];
|
|
354
354
|
}
|
|
355
355
|
} catch (err) {
|
|
@@ -359,7 +359,7 @@ export class VesuExtendedMultiplierStrategy<
|
|
|
359
359
|
|
|
360
360
|
if (vesuAmount.lessThan(0)) {
|
|
361
361
|
try {
|
|
362
|
-
const {calls: vesuCalls, status: vesuStatus} = await this.moveAssets(
|
|
362
|
+
const { calls: vesuCalls, status: vesuStatus } = await this.moveAssets(
|
|
363
363
|
{
|
|
364
364
|
to: Protocols.EXTENDED.name,
|
|
365
365
|
from: Protocols.VESU.name,
|
|
@@ -369,7 +369,7 @@ export class VesuExtendedMultiplierStrategy<
|
|
|
369
369
|
vesuAdapter
|
|
370
370
|
);
|
|
371
371
|
calls.push(...vesuCalls);
|
|
372
|
-
if(!vesuStatus){
|
|
372
|
+
if (!vesuStatus) {
|
|
373
373
|
return [];
|
|
374
374
|
}
|
|
375
375
|
} catch (err) {
|
|
@@ -384,16 +384,16 @@ export class VesuExtendedMultiplierStrategy<
|
|
|
384
384
|
}
|
|
385
385
|
const usdcAmountInWallet = (await this.getUnusedBalance()).amount;
|
|
386
386
|
const usdcAmountOnExtended = parseFloat(
|
|
387
|
-
extendedHoldings.
|
|
387
|
+
extendedHoldings.availableForTrade
|
|
388
388
|
);
|
|
389
|
-
if (extendedAmount.minus(usdcAmountOnExtended).greaterThan(0)) {
|
|
389
|
+
if (extendedAmount.plus(BUFFER_USDC_IN_WITHDRAWAL).minus(usdcAmountOnExtended).greaterThan(0)) {
|
|
390
390
|
//move assets to extended
|
|
391
391
|
try {
|
|
392
|
-
const {calls: extendedCalls} = await this.moveAssets(
|
|
392
|
+
const { calls: extendedCalls } = await this.moveAssets(
|
|
393
393
|
{
|
|
394
394
|
to: Protocols.EXTENDED.name,
|
|
395
395
|
from: Protocols.VAULT.name,
|
|
396
|
-
amount: extendedAmount.minus(usdcAmountOnExtended),
|
|
396
|
+
amount: extendedAmount.plus(BUFFER_USDC_IN_WITHDRAWAL).minus(usdcAmountOnExtended),
|
|
397
397
|
},
|
|
398
398
|
extendedAdapter,
|
|
399
399
|
vesuAdapter
|
|
@@ -406,7 +406,7 @@ export class VesuExtendedMultiplierStrategy<
|
|
|
406
406
|
if (vesuAmount.minus(usdcAmountInWallet).greaterThan(0)) {
|
|
407
407
|
//move assets to vesu
|
|
408
408
|
try {
|
|
409
|
-
const {calls: vesuCalls, status: vesuStatus} = await this.moveAssets(
|
|
409
|
+
const { calls: vesuCalls, status: vesuStatus } = await this.moveAssets(
|
|
410
410
|
{
|
|
411
411
|
to: Protocols.VAULT.name,
|
|
412
412
|
from: Protocols.EXTENDED.name,
|
|
@@ -415,7 +415,7 @@ export class VesuExtendedMultiplierStrategy<
|
|
|
415
415
|
extendedAdapter,
|
|
416
416
|
vesuAdapter
|
|
417
417
|
);
|
|
418
|
-
if(!vesuStatus){
|
|
418
|
+
if (!vesuStatus) {
|
|
419
419
|
return [];
|
|
420
420
|
}
|
|
421
421
|
calls.push(...vesuCalls);
|
|
@@ -487,22 +487,29 @@ export class VesuExtendedMultiplierStrategy<
|
|
|
487
487
|
extendedHoldings.availableForWithdrawal,
|
|
488
488
|
USDC_TOKEN_DECIMALS
|
|
489
489
|
);
|
|
490
|
-
|
|
491
|
-
|
|
492
|
-
|
|
493
|
-
|
|
494
|
-
|
|
495
|
-
btcAmount.
|
|
496
|
-
|
|
497
|
-
|
|
498
|
-
|
|
499
|
-
|
|
500
|
-
|
|
501
|
-
|
|
502
|
-
|
|
503
|
-
|
|
490
|
+
logger.info(`${VesuExtendedMultiplierStrategy.name}::moveAssets extendedHoldingAmount: ${extendedHoldingAmount.toNumber()}`);
|
|
491
|
+
if (params.amount.abs().greaterThan(extendedHoldingAmount)) {
|
|
492
|
+
const leftAmountAfterWithdrawalAmountInAccount = params.amount.abs().minus(extendedHoldingAmount);
|
|
493
|
+
logger.info(`${VesuExtendedMultiplierStrategy.name}::moveAssets leftAmountAfterWithdrawalAmountInAccount: ${leftAmountAfterWithdrawalAmountInAccount.toNumber()}`);
|
|
494
|
+
const btcAmount = leftAmountAfterWithdrawalAmountInAccount.dividedBy(collateralPrice.price);
|
|
495
|
+
const openLongPosition = btcAmount.multipliedBy(3).greaterThan(MINIMUM_EXTENDED_POSITION_SIZE) ? await extendedAdapter.createOrder(
|
|
496
|
+
extendedLeverage.toString(),
|
|
497
|
+
btcAmount.toNumber(),
|
|
498
|
+
OrderSide.BUY
|
|
499
|
+
) : await extendedAdapter.createOrder(
|
|
500
|
+
extendedLeverage.toString(),
|
|
501
|
+
0.000035, // just in case amount falls short then we need to create a withdrawal
|
|
502
|
+
OrderSide.BUY
|
|
503
|
+
)
|
|
504
|
+
if (!openLongPosition) {
|
|
505
|
+
logger.error(`error opening long position: ${openLongPosition}`);
|
|
506
|
+
return {
|
|
507
|
+
calls: [],
|
|
508
|
+
status: false
|
|
509
|
+
};
|
|
510
|
+
}
|
|
511
|
+
await new Promise(resolve => setTimeout(resolve, 5000));
|
|
504
512
|
}
|
|
505
|
-
await new Promise(resolve => setTimeout(resolve, 5000));
|
|
506
513
|
const withdrawalFromExtended =
|
|
507
514
|
await extendedAdapter.withdrawFromExtended(params.amount);
|
|
508
515
|
if (withdrawalFromExtended) {
|
|
@@ -642,6 +649,7 @@ export class VesuExtendedMultiplierStrategy<
|
|
|
642
649
|
};
|
|
643
650
|
}
|
|
644
651
|
const extendedPositionValue = position.length > 0 ? parseFloat(position[0].value) : 0;
|
|
652
|
+
const BUFFER_AMOUNT_IN_AVAILABLE_FOR_TRADE = BUFFER_USDC_IN_WITHDRAWAL;
|
|
645
653
|
const extendedHoldings = await extendedAdapter.getExtendedDepositAmount();
|
|
646
654
|
if (!extendedHoldings) {
|
|
647
655
|
logger.error(`error getting extended holdings: ${extendedHoldings}`);
|
|
@@ -651,7 +659,7 @@ export class VesuExtendedMultiplierStrategy<
|
|
|
651
659
|
};
|
|
652
660
|
}
|
|
653
661
|
const extendedHoldingAmount = new Web3Number(
|
|
654
|
-
extendedHoldings.
|
|
662
|
+
extendedHoldings.availableForTrade,
|
|
655
663
|
USDC_TOKEN_DECIMALS
|
|
656
664
|
);
|
|
657
665
|
const {
|
|
@@ -660,12 +668,12 @@ export class VesuExtendedMultiplierStrategy<
|
|
|
660
668
|
const { collateralPrice } = await this.getAssetPrices();
|
|
661
669
|
const { vesuAmountInBTC, extendedAmountInBTC } = calculateVesUPositionSizeGivenExtended(
|
|
662
670
|
extendedPositionValue,
|
|
663
|
-
extendedHoldingAmount,
|
|
671
|
+
extendedHoldingAmount.minus(BUFFER_AMOUNT_IN_AVAILABLE_FOR_TRADE),
|
|
664
672
|
collateralTokenAmount,
|
|
665
673
|
collateralPrice.price
|
|
666
674
|
);
|
|
667
|
-
|
|
668
|
-
|
|
675
|
+
logger.info(`vesuAmountInBTC ${vesuAmountInBTC}, extendedAmountInBTC ${extendedAmountInBTC}`);
|
|
676
|
+
|
|
669
677
|
let calls: Call[] = [];
|
|
670
678
|
if (vesuAmountInBTC.greaterThan(MINIMUM_EXTENDED_POSITION_SIZE)) {
|
|
671
679
|
const proofsInfo = vesuAdapter.getProofs(true, this.getMerkleTree());
|
|
@@ -678,7 +686,6 @@ export class VesuExtendedMultiplierStrategy<
|
|
|
678
686
|
);
|
|
679
687
|
const { amount: wbtcAmountInVaultAllocator } = await this.getUnusedBalanceWBTC();
|
|
680
688
|
if (wbtcAmountInVaultAllocator.lessThan(vesuAmountInBTC)) {
|
|
681
|
-
logger.info(`WBTC amount in vault allocator is less than vesu amount required in WBTC thus swapping, wbtcAmountInVaultAllocator: ${wbtcAmountInVaultAllocator}, vesuAmountInBTC: ${vesuAmountInBTC}`);
|
|
682
689
|
const swapProofsInfo = avnuAdapter.getProofs(true, this.getMerkleTree());
|
|
683
690
|
const swapProofGroups = swapProofsInfo.proofs;
|
|
684
691
|
const swapCall = this.getManageCall(
|
|
@@ -691,7 +698,6 @@ export class VesuExtendedMultiplierStrategy<
|
|
|
691
698
|
}
|
|
692
699
|
calls.push(call);
|
|
693
700
|
}
|
|
694
|
-
|
|
695
701
|
const shortPosition = extendedAmountInBTC.multipliedBy(3).abs().greaterThan(MINIMUM_EXTENDED_POSITION_SIZE) ? await extendedAdapter.createOrder(
|
|
696
702
|
extendedLeverage.toString(),
|
|
697
703
|
extendedAmountInBTC.toNumber(),
|
|
@@ -736,7 +742,7 @@ export class VesuExtendedMultiplierStrategy<
|
|
|
736
742
|
return false;
|
|
737
743
|
}
|
|
738
744
|
|
|
739
|
-
async handleWithdraw(amount: Web3Number): Promise<{calls: Call[], status: boolean}> {
|
|
745
|
+
async handleWithdraw(amount: Web3Number): Promise<{ calls: Call[], status: boolean }> {
|
|
740
746
|
try {
|
|
741
747
|
const usdcBalanceVaultAllocator = await this.getUnusedBalance()
|
|
742
748
|
const usdcBalanceDifference = amount.plus(BUFFER_USDC_IN_WITHDRAWAL).minus(usdcBalanceVaultAllocator.usdValue);
|
|
@@ -750,8 +756,8 @@ export class VesuExtendedMultiplierStrategy<
|
|
|
750
756
|
logger.info("withdraw call", withdrawCall);
|
|
751
757
|
calls.push(withdrawCall);
|
|
752
758
|
return {
|
|
753
|
-
calls:calls,
|
|
754
|
-
status:true
|
|
759
|
+
calls: calls,
|
|
760
|
+
status: true
|
|
755
761
|
};
|
|
756
762
|
}
|
|
757
763
|
const vesuAdapter = await this.getVesuAdapter();
|
|
@@ -762,8 +768,8 @@ export class VesuExtendedMultiplierStrategy<
|
|
|
762
768
|
`vesu or extended adapter not found: vesuAdapter=${vesuAdapter}, extendedAdapter=${extendedAdapter}`
|
|
763
769
|
);
|
|
764
770
|
return {
|
|
765
|
-
calls:calls,
|
|
766
|
-
status:status
|
|
771
|
+
calls: calls,
|
|
772
|
+
status: status
|
|
767
773
|
};
|
|
768
774
|
}
|
|
769
775
|
const { collateralTokenAmount } =
|
|
@@ -772,12 +778,12 @@ export class VesuExtendedMultiplierStrategy<
|
|
|
772
778
|
collateralPrice
|
|
773
779
|
} = await this.getAssetPrices();
|
|
774
780
|
const extendedPositon = await extendedAdapter.getAllOpenPositions();
|
|
775
|
-
if(!extendedPositon) {
|
|
781
|
+
if (!extendedPositon) {
|
|
776
782
|
status = false;
|
|
777
783
|
logger.error("error getting extended position", extendedPositon);
|
|
778
784
|
return {
|
|
779
|
-
calls:calls,
|
|
780
|
-
status:status
|
|
785
|
+
calls: calls,
|
|
786
|
+
status: status
|
|
781
787
|
}
|
|
782
788
|
}
|
|
783
789
|
const amountDistributionForWithdrawal =
|
|
@@ -793,14 +799,14 @@ export class VesuExtendedMultiplierStrategy<
|
|
|
793
799
|
`error calculating amount distribution for withdrawal: ${amountDistributionForWithdrawal}`
|
|
794
800
|
);
|
|
795
801
|
return {
|
|
796
|
-
calls:calls,
|
|
797
|
-
status:status
|
|
802
|
+
calls: calls,
|
|
803
|
+
status: status
|
|
798
804
|
};
|
|
799
805
|
}
|
|
800
806
|
const { vesu_amount, extended_amount } = amountDistributionForWithdrawal;
|
|
801
|
-
|
|
807
|
+
|
|
802
808
|
if (status && vesu_amount.greaterThan(0)) {
|
|
803
|
-
const {calls: vesuCalls, status: vesuStatus} = await this.moveAssets(
|
|
809
|
+
const { calls: vesuCalls, status: vesuStatus } = await this.moveAssets(
|
|
804
810
|
{
|
|
805
811
|
amount: vesu_amount,
|
|
806
812
|
from: Protocols.VESU.name,
|
|
@@ -813,7 +819,7 @@ export class VesuExtendedMultiplierStrategy<
|
|
|
813
819
|
calls.push(...vesuCalls);
|
|
814
820
|
}
|
|
815
821
|
if (status && extended_amount.greaterThan(0)) {
|
|
816
|
-
const {calls: extendedCalls, status: extendedStatus} = await this.moveAssets(
|
|
822
|
+
const { calls: extendedCalls, status: extendedStatus } = await this.moveAssets(
|
|
817
823
|
{
|
|
818
824
|
amount: extended_amount,
|
|
819
825
|
from: Protocols.EXTENDED.name,
|
|
@@ -823,9 +829,9 @@ export class VesuExtendedMultiplierStrategy<
|
|
|
823
829
|
vesuAdapter
|
|
824
830
|
);
|
|
825
831
|
status = extendedStatus;
|
|
826
|
-
if(status) {
|
|
832
|
+
if (status) {
|
|
827
833
|
calls.push(...extendedCalls);
|
|
828
|
-
}else{
|
|
834
|
+
} else {
|
|
829
835
|
logger.error("error moving assets to vault: extendedStatus: ${extendedStatus}");
|
|
830
836
|
return {
|
|
831
837
|
calls: [],
|