@strkfarm/sdk 2.0.0-dev.20 → 2.0.0-dev.22
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 +31 -25
- package/dist/index.browser.mjs +31 -25
- package/dist/index.d.ts +9 -0
- package/dist/index.js +31 -25
- package/dist/index.mjs +31 -25
- package/package.json +1 -1
- package/src/strategies/universal-adapters/avnu-adapter.ts +2 -0
- package/src/strategies/vesu-extended-strategy/vesu-extended-strategy.tsx +61 -28
|
@@ -94873,6 +94873,8 @@ spurious results.`);
|
|
|
94873
94873
|
return null;
|
|
94874
94874
|
}
|
|
94875
94875
|
const dataObject = finalQuote.data[0];
|
|
94876
|
+
const wbtcAmountOut = parseInt(dataObject.buyAmount.toString(), 16);
|
|
94877
|
+
logger2.info(`${_AvnuAdapter.name}::getQuotesAvnu finalAmountOfWbtcOut : ${wbtcAmountOut} ${dataObject.buyAmount} ${dataObject.sellAmount.toString()} ${dataObject.sellAmount.toString()}`);
|
|
94876
94878
|
return dataObject;
|
|
94877
94879
|
} catch (err2) {
|
|
94878
94880
|
logger2.error(`No quotes available for this swap: ${err2}`);
|
|
@@ -98551,7 +98553,7 @@ spurious results.`);
|
|
|
98551
98553
|
};
|
|
98552
98554
|
}
|
|
98553
98555
|
}
|
|
98554
|
-
const amountToInvest = new Web3Number(balance.usdValue, USDC_TOKEN_DECIMALS).plus(usdcBalanceOnExtended?.
|
|
98556
|
+
const amountToInvest = new Web3Number(balance.usdValue, USDC_TOKEN_DECIMALS).plus(usdcBalanceOnExtended?.availableForTrade ?? 0).multipliedBy(1 - LIMIT_BALANCE);
|
|
98555
98557
|
const amountToInvestNumber = amountToInvest.toNumber();
|
|
98556
98558
|
if (!Number.isFinite(amountToInvestNumber)) {
|
|
98557
98559
|
logger2.error(
|
|
@@ -98687,17 +98689,17 @@ spurious results.`);
|
|
|
98687
98689
|
return [];
|
|
98688
98690
|
}
|
|
98689
98691
|
const usdcAmountInWallet = (await this.getUnusedBalance()).amount;
|
|
98690
|
-
const
|
|
98691
|
-
extendedHoldings.
|
|
98692
|
+
const usdcAmountOnExtendedAvailableForTrade = parseFloat(
|
|
98693
|
+
extendedHoldings.availableForTrade
|
|
98692
98694
|
);
|
|
98693
|
-
logger2.info(`${_VesuExtendedMultiplierStrategy.name}::shouldMoveAssets calculating movements - Extended current: ${
|
|
98695
|
+
logger2.info(`${_VesuExtendedMultiplierStrategy.name}::shouldMoveAssets calculating movements - Extended current: ${usdcAmountOnExtendedAvailableForTrade}, Wallet: ${usdcAmountInWallet.toNumber()}, Target Extended: ${extendedAmount.toNumber()}, Target Vesu: ${vesuAmount.toNumber()}`);
|
|
98694
98696
|
let totalExtendedWithdrawal = new Web3Number(0, USDC_TOKEN_DECIMALS);
|
|
98695
98697
|
let totalExtendedDeposit = new Web3Number(0, USDC_TOKEN_DECIMALS);
|
|
98696
98698
|
if (extendedAmount.isNegative() && extendedAmount.abs().greaterThan(extendedAdapter.minimumExtendedMovementAmount)) {
|
|
98697
98699
|
totalExtendedWithdrawal = totalExtendedWithdrawal.plus(extendedAmount.abs());
|
|
98698
98700
|
}
|
|
98699
98701
|
const extendedTargetAmount = extendedAmount.abs();
|
|
98700
|
-
let projectedExtendedBalance =
|
|
98702
|
+
let projectedExtendedBalance = usdcAmountOnExtendedAvailableForTrade;
|
|
98701
98703
|
if (extendedAmount.isNegative()) {
|
|
98702
98704
|
projectedExtendedBalance = projectedExtendedBalance - extendedAmount.abs().toNumber();
|
|
98703
98705
|
}
|
|
@@ -98713,7 +98715,6 @@ spurious results.`);
|
|
|
98713
98715
|
let vesuAmountDifference = vesuTargetAmount.minus(projectedWalletBalance);
|
|
98714
98716
|
const vesuAmountDifferenceAbs = vesuAmountDifference.abs();
|
|
98715
98717
|
logger2.info(`${_VesuExtendedMultiplierStrategy.name}::shouldMoveAssets calculated movements - Extended withdrawal: ${totalExtendedWithdrawal.toNumber()}, Extended deposit: ${totalExtendedDeposit.toNumber()}, Extended diff: ${extendedAmountDifference.toNumber()}, Projected wallet: ${projectedWalletBalance.toNumber()}, Vesu diff: ${vesuAmountDifference.toNumber()}`);
|
|
98716
|
-
let calls = [];
|
|
98717
98718
|
let transactionResults = [];
|
|
98718
98719
|
if (extendedAmount.isNegative() && extendedAmount.abs().greaterThan(extendedAdapter.minimumExtendedMovementAmount)) {
|
|
98719
98720
|
try {
|
|
@@ -98891,6 +98892,15 @@ spurious results.`);
|
|
|
98891
98892
|
}
|
|
98892
98893
|
return { calls: [], status: false, transactionMetadata: { protocolFrom: "", protocolTo: "", transactionType: "DEPOSIT", usdAmount: "0", status: "FAILED", cycleType } };
|
|
98893
98894
|
}
|
|
98895
|
+
/**
|
|
98896
|
+
* This method is used to move assets between protocols
|
|
98897
|
+
* @param params - The parameters for the move assets operation
|
|
98898
|
+
* @param extendedAdapter - The extended adapter
|
|
98899
|
+
* @param vesuAdapter - The vesu adapter
|
|
98900
|
+
* @returns The transaction result
|
|
98901
|
+
* If Extended amount is greater than amount of withdrawal from extended, then we need to open a long position
|
|
98902
|
+
* so that the amount of withdrawal from extended is fullfilled
|
|
98903
|
+
*/
|
|
98894
98904
|
async moveAssets(params, extendedAdapter, vesuAdapter) {
|
|
98895
98905
|
try {
|
|
98896
98906
|
if (params.amount.lessThanOrEqualTo(0)) {
|
|
@@ -98899,23 +98909,6 @@ spurious results.`);
|
|
|
98899
98909
|
);
|
|
98900
98910
|
return this.createTransactionResult([], false, params, "NONE", params.cycleType);
|
|
98901
98911
|
}
|
|
98902
|
-
const amountAbs = params.amount.abs();
|
|
98903
|
-
if (params.from === Protocols.EXTENDED.name || params.to === Protocols.EXTENDED.name) {
|
|
98904
|
-
if (amountAbs.lessThanOrEqualTo(extendedAdapter.minimumExtendedMovementAmount)) {
|
|
98905
|
-
logger2.warn(
|
|
98906
|
-
`Amount ${amountAbs.toNumber()} is below minimum Extended movement amount ${extendedAdapter.minimumExtendedMovementAmount}. Skipping operation.`
|
|
98907
|
-
);
|
|
98908
|
-
return this.createTransactionResult([], false, params, "NONE", params.cycleType);
|
|
98909
|
-
}
|
|
98910
|
-
}
|
|
98911
|
-
if (params.from === Protocols.VESU.name || params.to === Protocols.VESU.name) {
|
|
98912
|
-
if (amountAbs.lessThanOrEqualTo(vesuAdapter.minimumVesuMovementAmount)) {
|
|
98913
|
-
logger2.warn(
|
|
98914
|
-
`Amount ${amountAbs.toNumber()} is below minimum Vesu movement amount ${vesuAdapter.minimumVesuMovementAmount}. Skipping operation.`
|
|
98915
|
-
);
|
|
98916
|
-
return this.createTransactionResult([], false, params, "NONE", params.cycleType);
|
|
98917
|
-
}
|
|
98918
|
-
}
|
|
98919
98912
|
const avnuAdapter = await this.getAvnuAdapter();
|
|
98920
98913
|
if (!avnuAdapter) {
|
|
98921
98914
|
logger2.error(`avnu adapter not found: ${avnuAdapter}`);
|
|
@@ -98952,9 +98945,22 @@ spurious results.`);
|
|
|
98952
98945
|
);
|
|
98953
98946
|
logger2.info(`${_VesuExtendedMultiplierStrategy.name}::moveAssets extendedHoldingAmount: ${extendedHoldingAmount.toNumber()}`);
|
|
98954
98947
|
if (params.amount.abs().greaterThan(extendedHoldingAmount)) {
|
|
98955
|
-
const leftAmountAfterWithdrawalAmountInAccount = params.amount.abs().minus(extendedHoldingAmount);
|
|
98948
|
+
const leftAmountAfterWithdrawalAmountInAccount = new Web3Number(Math.ceil(params.amount.abs().minus(extendedHoldingAmount).toNumber()), USDC_TOKEN_DECIMALS);
|
|
98956
98949
|
logger2.info(`${_VesuExtendedMultiplierStrategy.name}::moveAssets leftAmountAfterWithdrawalAmountInAccount: ${leftAmountAfterWithdrawalAmountInAccount.toNumber()}`);
|
|
98957
|
-
|
|
98950
|
+
let priceOfBTC;
|
|
98951
|
+
const {
|
|
98952
|
+
ask,
|
|
98953
|
+
bid,
|
|
98954
|
+
status
|
|
98955
|
+
} = await extendedAdapter.fetchOrderBookBTCUSDC();
|
|
98956
|
+
const price = ask.plus(bid).dividedBy(2);
|
|
98957
|
+
if (status) {
|
|
98958
|
+
priceOfBTC = price;
|
|
98959
|
+
} else {
|
|
98960
|
+
logger2.error(`error fetching order book btc usdc: ${status}`);
|
|
98961
|
+
priceOfBTC = collateralPrice.price;
|
|
98962
|
+
}
|
|
98963
|
+
const btcAmount = leftAmountAfterWithdrawalAmountInAccount.dividedBy(priceOfBTC);
|
|
98958
98964
|
const openLongPosition = btcAmount.multipliedBy(3).greaterThan(MINIMUM_EXTENDED_POSITION_SIZE) ? await extendedAdapter.createOrder(
|
|
98959
98965
|
extendedLeverage.toString(),
|
|
98960
98966
|
btcAmount.toNumber(),
|
package/dist/index.browser.mjs
CHANGED
|
@@ -30834,6 +30834,8 @@ var AvnuAdapter = class _AvnuAdapter extends BaseAdapter {
|
|
|
30834
30834
|
return null;
|
|
30835
30835
|
}
|
|
30836
30836
|
const dataObject = finalQuote.data[0];
|
|
30837
|
+
const wbtcAmountOut = parseInt(dataObject.buyAmount.toString(), 16);
|
|
30838
|
+
logger.info(`${_AvnuAdapter.name}::getQuotesAvnu finalAmountOfWbtcOut : ${wbtcAmountOut} ${dataObject.buyAmount} ${dataObject.sellAmount.toString()} ${dataObject.sellAmount.toString()}`);
|
|
30837
30839
|
return dataObject;
|
|
30838
30840
|
} catch (err) {
|
|
30839
30841
|
logger.error(`No quotes available for this swap: ${err}`);
|
|
@@ -34515,7 +34517,7 @@ var VesuExtendedMultiplierStrategy = class _VesuExtendedMultiplierStrategy exten
|
|
|
34515
34517
|
};
|
|
34516
34518
|
}
|
|
34517
34519
|
}
|
|
34518
|
-
const amountToInvest = new Web3Number(balance.usdValue, USDC_TOKEN_DECIMALS).plus(usdcBalanceOnExtended?.
|
|
34520
|
+
const amountToInvest = new Web3Number(balance.usdValue, USDC_TOKEN_DECIMALS).plus(usdcBalanceOnExtended?.availableForTrade ?? 0).multipliedBy(1 - LIMIT_BALANCE);
|
|
34519
34521
|
const amountToInvestNumber = amountToInvest.toNumber();
|
|
34520
34522
|
if (!Number.isFinite(amountToInvestNumber)) {
|
|
34521
34523
|
logger.error(
|
|
@@ -34651,17 +34653,17 @@ var VesuExtendedMultiplierStrategy = class _VesuExtendedMultiplierStrategy exten
|
|
|
34651
34653
|
return [];
|
|
34652
34654
|
}
|
|
34653
34655
|
const usdcAmountInWallet = (await this.getUnusedBalance()).amount;
|
|
34654
|
-
const
|
|
34655
|
-
extendedHoldings.
|
|
34656
|
+
const usdcAmountOnExtendedAvailableForTrade = parseFloat(
|
|
34657
|
+
extendedHoldings.availableForTrade
|
|
34656
34658
|
);
|
|
34657
|
-
logger.info(`${_VesuExtendedMultiplierStrategy.name}::shouldMoveAssets calculating movements - Extended current: ${
|
|
34659
|
+
logger.info(`${_VesuExtendedMultiplierStrategy.name}::shouldMoveAssets calculating movements - Extended current: ${usdcAmountOnExtendedAvailableForTrade}, Wallet: ${usdcAmountInWallet.toNumber()}, Target Extended: ${extendedAmount.toNumber()}, Target Vesu: ${vesuAmount.toNumber()}`);
|
|
34658
34660
|
let totalExtendedWithdrawal = new Web3Number(0, USDC_TOKEN_DECIMALS);
|
|
34659
34661
|
let totalExtendedDeposit = new Web3Number(0, USDC_TOKEN_DECIMALS);
|
|
34660
34662
|
if (extendedAmount.isNegative() && extendedAmount.abs().greaterThan(extendedAdapter.minimumExtendedMovementAmount)) {
|
|
34661
34663
|
totalExtendedWithdrawal = totalExtendedWithdrawal.plus(extendedAmount.abs());
|
|
34662
34664
|
}
|
|
34663
34665
|
const extendedTargetAmount = extendedAmount.abs();
|
|
34664
|
-
let projectedExtendedBalance =
|
|
34666
|
+
let projectedExtendedBalance = usdcAmountOnExtendedAvailableForTrade;
|
|
34665
34667
|
if (extendedAmount.isNegative()) {
|
|
34666
34668
|
projectedExtendedBalance = projectedExtendedBalance - extendedAmount.abs().toNumber();
|
|
34667
34669
|
}
|
|
@@ -34677,7 +34679,6 @@ var VesuExtendedMultiplierStrategy = class _VesuExtendedMultiplierStrategy exten
|
|
|
34677
34679
|
let vesuAmountDifference = vesuTargetAmount.minus(projectedWalletBalance);
|
|
34678
34680
|
const vesuAmountDifferenceAbs = vesuAmountDifference.abs();
|
|
34679
34681
|
logger.info(`${_VesuExtendedMultiplierStrategy.name}::shouldMoveAssets calculated movements - Extended withdrawal: ${totalExtendedWithdrawal.toNumber()}, Extended deposit: ${totalExtendedDeposit.toNumber()}, Extended diff: ${extendedAmountDifference.toNumber()}, Projected wallet: ${projectedWalletBalance.toNumber()}, Vesu diff: ${vesuAmountDifference.toNumber()}`);
|
|
34680
|
-
let calls = [];
|
|
34681
34682
|
let transactionResults = [];
|
|
34682
34683
|
if (extendedAmount.isNegative() && extendedAmount.abs().greaterThan(extendedAdapter.minimumExtendedMovementAmount)) {
|
|
34683
34684
|
try {
|
|
@@ -34855,6 +34856,15 @@ var VesuExtendedMultiplierStrategy = class _VesuExtendedMultiplierStrategy exten
|
|
|
34855
34856
|
}
|
|
34856
34857
|
return { calls: [], status: false, transactionMetadata: { protocolFrom: "", protocolTo: "", transactionType: "DEPOSIT", usdAmount: "0", status: "FAILED", cycleType } };
|
|
34857
34858
|
}
|
|
34859
|
+
/**
|
|
34860
|
+
* This method is used to move assets between protocols
|
|
34861
|
+
* @param params - The parameters for the move assets operation
|
|
34862
|
+
* @param extendedAdapter - The extended adapter
|
|
34863
|
+
* @param vesuAdapter - The vesu adapter
|
|
34864
|
+
* @returns The transaction result
|
|
34865
|
+
* If Extended amount is greater than amount of withdrawal from extended, then we need to open a long position
|
|
34866
|
+
* so that the amount of withdrawal from extended is fullfilled
|
|
34867
|
+
*/
|
|
34858
34868
|
async moveAssets(params, extendedAdapter, vesuAdapter) {
|
|
34859
34869
|
try {
|
|
34860
34870
|
if (params.amount.lessThanOrEqualTo(0)) {
|
|
@@ -34863,23 +34873,6 @@ var VesuExtendedMultiplierStrategy = class _VesuExtendedMultiplierStrategy exten
|
|
|
34863
34873
|
);
|
|
34864
34874
|
return this.createTransactionResult([], false, params, "NONE", params.cycleType);
|
|
34865
34875
|
}
|
|
34866
|
-
const amountAbs = params.amount.abs();
|
|
34867
|
-
if (params.from === Protocols.EXTENDED.name || params.to === Protocols.EXTENDED.name) {
|
|
34868
|
-
if (amountAbs.lessThanOrEqualTo(extendedAdapter.minimumExtendedMovementAmount)) {
|
|
34869
|
-
logger.warn(
|
|
34870
|
-
`Amount ${amountAbs.toNumber()} is below minimum Extended movement amount ${extendedAdapter.minimumExtendedMovementAmount}. Skipping operation.`
|
|
34871
|
-
);
|
|
34872
|
-
return this.createTransactionResult([], false, params, "NONE", params.cycleType);
|
|
34873
|
-
}
|
|
34874
|
-
}
|
|
34875
|
-
if (params.from === Protocols.VESU.name || params.to === Protocols.VESU.name) {
|
|
34876
|
-
if (amountAbs.lessThanOrEqualTo(vesuAdapter.minimumVesuMovementAmount)) {
|
|
34877
|
-
logger.warn(
|
|
34878
|
-
`Amount ${amountAbs.toNumber()} is below minimum Vesu movement amount ${vesuAdapter.minimumVesuMovementAmount}. Skipping operation.`
|
|
34879
|
-
);
|
|
34880
|
-
return this.createTransactionResult([], false, params, "NONE", params.cycleType);
|
|
34881
|
-
}
|
|
34882
|
-
}
|
|
34883
34876
|
const avnuAdapter = await this.getAvnuAdapter();
|
|
34884
34877
|
if (!avnuAdapter) {
|
|
34885
34878
|
logger.error(`avnu adapter not found: ${avnuAdapter}`);
|
|
@@ -34916,9 +34909,22 @@ var VesuExtendedMultiplierStrategy = class _VesuExtendedMultiplierStrategy exten
|
|
|
34916
34909
|
);
|
|
34917
34910
|
logger.info(`${_VesuExtendedMultiplierStrategy.name}::moveAssets extendedHoldingAmount: ${extendedHoldingAmount.toNumber()}`);
|
|
34918
34911
|
if (params.amount.abs().greaterThan(extendedHoldingAmount)) {
|
|
34919
|
-
const leftAmountAfterWithdrawalAmountInAccount = params.amount.abs().minus(extendedHoldingAmount);
|
|
34912
|
+
const leftAmountAfterWithdrawalAmountInAccount = new Web3Number(Math.ceil(params.amount.abs().minus(extendedHoldingAmount).toNumber()), USDC_TOKEN_DECIMALS);
|
|
34920
34913
|
logger.info(`${_VesuExtendedMultiplierStrategy.name}::moveAssets leftAmountAfterWithdrawalAmountInAccount: ${leftAmountAfterWithdrawalAmountInAccount.toNumber()}`);
|
|
34921
|
-
|
|
34914
|
+
let priceOfBTC;
|
|
34915
|
+
const {
|
|
34916
|
+
ask,
|
|
34917
|
+
bid,
|
|
34918
|
+
status
|
|
34919
|
+
} = await extendedAdapter.fetchOrderBookBTCUSDC();
|
|
34920
|
+
const price = ask.plus(bid).dividedBy(2);
|
|
34921
|
+
if (status) {
|
|
34922
|
+
priceOfBTC = price;
|
|
34923
|
+
} else {
|
|
34924
|
+
logger.error(`error fetching order book btc usdc: ${status}`);
|
|
34925
|
+
priceOfBTC = collateralPrice.price;
|
|
34926
|
+
}
|
|
34927
|
+
const btcAmount = leftAmountAfterWithdrawalAmountInAccount.dividedBy(priceOfBTC);
|
|
34922
34928
|
const openLongPosition = btcAmount.multipliedBy(3).greaterThan(MINIMUM_EXTENDED_POSITION_SIZE) ? await extendedAdapter.createOrder(
|
|
34923
34929
|
extendedLeverage.toString(),
|
|
34924
34930
|
btcAmount.toNumber(),
|
package/dist/index.d.ts
CHANGED
|
@@ -2287,6 +2287,15 @@ declare class VesuExtendedMultiplierStrategy<S extends VesuExtendedStrategySetti
|
|
|
2287
2287
|
* Helper method to create transaction result with metadata
|
|
2288
2288
|
*/
|
|
2289
2289
|
private createTransactionResult;
|
|
2290
|
+
/**
|
|
2291
|
+
* This method is used to move assets between protocols
|
|
2292
|
+
* @param params - The parameters for the move assets operation
|
|
2293
|
+
* @param extendedAdapter - The extended adapter
|
|
2294
|
+
* @param vesuAdapter - The vesu adapter
|
|
2295
|
+
* @returns The transaction result
|
|
2296
|
+
* If Extended amount is greater than amount of withdrawal from extended, then we need to open a long position
|
|
2297
|
+
* so that the amount of withdrawal from extended is fullfilled
|
|
2298
|
+
*/
|
|
2290
2299
|
moveAssets(params: {
|
|
2291
2300
|
amount: Web3Number;
|
|
2292
2301
|
from: string;
|
package/dist/index.js
CHANGED
|
@@ -30991,6 +30991,8 @@ var AvnuAdapter = class _AvnuAdapter extends BaseAdapter {
|
|
|
30991
30991
|
return null;
|
|
30992
30992
|
}
|
|
30993
30993
|
const dataObject = finalQuote.data[0];
|
|
30994
|
+
const wbtcAmountOut = parseInt(dataObject.buyAmount.toString(), 16);
|
|
30995
|
+
logger.info(`${_AvnuAdapter.name}::getQuotesAvnu finalAmountOfWbtcOut : ${wbtcAmountOut} ${dataObject.buyAmount} ${dataObject.sellAmount.toString()} ${dataObject.sellAmount.toString()}`);
|
|
30994
30996
|
return dataObject;
|
|
30995
30997
|
} catch (err) {
|
|
30996
30998
|
logger.error(`No quotes available for this swap: ${err}`);
|
|
@@ -34672,7 +34674,7 @@ var VesuExtendedMultiplierStrategy = class _VesuExtendedMultiplierStrategy exten
|
|
|
34672
34674
|
};
|
|
34673
34675
|
}
|
|
34674
34676
|
}
|
|
34675
|
-
const amountToInvest = new Web3Number(balance.usdValue, USDC_TOKEN_DECIMALS).plus(usdcBalanceOnExtended?.
|
|
34677
|
+
const amountToInvest = new Web3Number(balance.usdValue, USDC_TOKEN_DECIMALS).plus(usdcBalanceOnExtended?.availableForTrade ?? 0).multipliedBy(1 - LIMIT_BALANCE);
|
|
34676
34678
|
const amountToInvestNumber = amountToInvest.toNumber();
|
|
34677
34679
|
if (!Number.isFinite(amountToInvestNumber)) {
|
|
34678
34680
|
logger.error(
|
|
@@ -34808,17 +34810,17 @@ var VesuExtendedMultiplierStrategy = class _VesuExtendedMultiplierStrategy exten
|
|
|
34808
34810
|
return [];
|
|
34809
34811
|
}
|
|
34810
34812
|
const usdcAmountInWallet = (await this.getUnusedBalance()).amount;
|
|
34811
|
-
const
|
|
34812
|
-
extendedHoldings.
|
|
34813
|
+
const usdcAmountOnExtendedAvailableForTrade = parseFloat(
|
|
34814
|
+
extendedHoldings.availableForTrade
|
|
34813
34815
|
);
|
|
34814
|
-
logger.info(`${_VesuExtendedMultiplierStrategy.name}::shouldMoveAssets calculating movements - Extended current: ${
|
|
34816
|
+
logger.info(`${_VesuExtendedMultiplierStrategy.name}::shouldMoveAssets calculating movements - Extended current: ${usdcAmountOnExtendedAvailableForTrade}, Wallet: ${usdcAmountInWallet.toNumber()}, Target Extended: ${extendedAmount.toNumber()}, Target Vesu: ${vesuAmount.toNumber()}`);
|
|
34815
34817
|
let totalExtendedWithdrawal = new Web3Number(0, USDC_TOKEN_DECIMALS);
|
|
34816
34818
|
let totalExtendedDeposit = new Web3Number(0, USDC_TOKEN_DECIMALS);
|
|
34817
34819
|
if (extendedAmount.isNegative() && extendedAmount.abs().greaterThan(extendedAdapter.minimumExtendedMovementAmount)) {
|
|
34818
34820
|
totalExtendedWithdrawal = totalExtendedWithdrawal.plus(extendedAmount.abs());
|
|
34819
34821
|
}
|
|
34820
34822
|
const extendedTargetAmount = extendedAmount.abs();
|
|
34821
|
-
let projectedExtendedBalance =
|
|
34823
|
+
let projectedExtendedBalance = usdcAmountOnExtendedAvailableForTrade;
|
|
34822
34824
|
if (extendedAmount.isNegative()) {
|
|
34823
34825
|
projectedExtendedBalance = projectedExtendedBalance - extendedAmount.abs().toNumber();
|
|
34824
34826
|
}
|
|
@@ -34834,7 +34836,6 @@ var VesuExtendedMultiplierStrategy = class _VesuExtendedMultiplierStrategy exten
|
|
|
34834
34836
|
let vesuAmountDifference = vesuTargetAmount.minus(projectedWalletBalance);
|
|
34835
34837
|
const vesuAmountDifferenceAbs = vesuAmountDifference.abs();
|
|
34836
34838
|
logger.info(`${_VesuExtendedMultiplierStrategy.name}::shouldMoveAssets calculated movements - Extended withdrawal: ${totalExtendedWithdrawal.toNumber()}, Extended deposit: ${totalExtendedDeposit.toNumber()}, Extended diff: ${extendedAmountDifference.toNumber()}, Projected wallet: ${projectedWalletBalance.toNumber()}, Vesu diff: ${vesuAmountDifference.toNumber()}`);
|
|
34837
|
-
let calls = [];
|
|
34838
34839
|
let transactionResults = [];
|
|
34839
34840
|
if (extendedAmount.isNegative() && extendedAmount.abs().greaterThan(extendedAdapter.minimumExtendedMovementAmount)) {
|
|
34840
34841
|
try {
|
|
@@ -35012,6 +35013,15 @@ var VesuExtendedMultiplierStrategy = class _VesuExtendedMultiplierStrategy exten
|
|
|
35012
35013
|
}
|
|
35013
35014
|
return { calls: [], status: false, transactionMetadata: { protocolFrom: "", protocolTo: "", transactionType: "DEPOSIT", usdAmount: "0", status: "FAILED", cycleType } };
|
|
35014
35015
|
}
|
|
35016
|
+
/**
|
|
35017
|
+
* This method is used to move assets between protocols
|
|
35018
|
+
* @param params - The parameters for the move assets operation
|
|
35019
|
+
* @param extendedAdapter - The extended adapter
|
|
35020
|
+
* @param vesuAdapter - The vesu adapter
|
|
35021
|
+
* @returns The transaction result
|
|
35022
|
+
* If Extended amount is greater than amount of withdrawal from extended, then we need to open a long position
|
|
35023
|
+
* so that the amount of withdrawal from extended is fullfilled
|
|
35024
|
+
*/
|
|
35015
35025
|
async moveAssets(params, extendedAdapter, vesuAdapter) {
|
|
35016
35026
|
try {
|
|
35017
35027
|
if (params.amount.lessThanOrEqualTo(0)) {
|
|
@@ -35020,23 +35030,6 @@ var VesuExtendedMultiplierStrategy = class _VesuExtendedMultiplierStrategy exten
|
|
|
35020
35030
|
);
|
|
35021
35031
|
return this.createTransactionResult([], false, params, "NONE", params.cycleType);
|
|
35022
35032
|
}
|
|
35023
|
-
const amountAbs = params.amount.abs();
|
|
35024
|
-
if (params.from === Protocols.EXTENDED.name || params.to === Protocols.EXTENDED.name) {
|
|
35025
|
-
if (amountAbs.lessThanOrEqualTo(extendedAdapter.minimumExtendedMovementAmount)) {
|
|
35026
|
-
logger.warn(
|
|
35027
|
-
`Amount ${amountAbs.toNumber()} is below minimum Extended movement amount ${extendedAdapter.minimumExtendedMovementAmount}. Skipping operation.`
|
|
35028
|
-
);
|
|
35029
|
-
return this.createTransactionResult([], false, params, "NONE", params.cycleType);
|
|
35030
|
-
}
|
|
35031
|
-
}
|
|
35032
|
-
if (params.from === Protocols.VESU.name || params.to === Protocols.VESU.name) {
|
|
35033
|
-
if (amountAbs.lessThanOrEqualTo(vesuAdapter.minimumVesuMovementAmount)) {
|
|
35034
|
-
logger.warn(
|
|
35035
|
-
`Amount ${amountAbs.toNumber()} is below minimum Vesu movement amount ${vesuAdapter.minimumVesuMovementAmount}. Skipping operation.`
|
|
35036
|
-
);
|
|
35037
|
-
return this.createTransactionResult([], false, params, "NONE", params.cycleType);
|
|
35038
|
-
}
|
|
35039
|
-
}
|
|
35040
35033
|
const avnuAdapter = await this.getAvnuAdapter();
|
|
35041
35034
|
if (!avnuAdapter) {
|
|
35042
35035
|
logger.error(`avnu adapter not found: ${avnuAdapter}`);
|
|
@@ -35073,9 +35066,22 @@ var VesuExtendedMultiplierStrategy = class _VesuExtendedMultiplierStrategy exten
|
|
|
35073
35066
|
);
|
|
35074
35067
|
logger.info(`${_VesuExtendedMultiplierStrategy.name}::moveAssets extendedHoldingAmount: ${extendedHoldingAmount.toNumber()}`);
|
|
35075
35068
|
if (params.amount.abs().greaterThan(extendedHoldingAmount)) {
|
|
35076
|
-
const leftAmountAfterWithdrawalAmountInAccount = params.amount.abs().minus(extendedHoldingAmount);
|
|
35069
|
+
const leftAmountAfterWithdrawalAmountInAccount = new Web3Number(Math.ceil(params.amount.abs().minus(extendedHoldingAmount).toNumber()), USDC_TOKEN_DECIMALS);
|
|
35077
35070
|
logger.info(`${_VesuExtendedMultiplierStrategy.name}::moveAssets leftAmountAfterWithdrawalAmountInAccount: ${leftAmountAfterWithdrawalAmountInAccount.toNumber()}`);
|
|
35078
|
-
|
|
35071
|
+
let priceOfBTC;
|
|
35072
|
+
const {
|
|
35073
|
+
ask,
|
|
35074
|
+
bid,
|
|
35075
|
+
status
|
|
35076
|
+
} = await extendedAdapter.fetchOrderBookBTCUSDC();
|
|
35077
|
+
const price = ask.plus(bid).dividedBy(2);
|
|
35078
|
+
if (status) {
|
|
35079
|
+
priceOfBTC = price;
|
|
35080
|
+
} else {
|
|
35081
|
+
logger.error(`error fetching order book btc usdc: ${status}`);
|
|
35082
|
+
priceOfBTC = collateralPrice.price;
|
|
35083
|
+
}
|
|
35084
|
+
const btcAmount = leftAmountAfterWithdrawalAmountInAccount.dividedBy(priceOfBTC);
|
|
35079
35085
|
const openLongPosition = btcAmount.multipliedBy(3).greaterThan(MINIMUM_EXTENDED_POSITION_SIZE) ? await extendedAdapter.createOrder(
|
|
35080
35086
|
extendedLeverage.toString(),
|
|
35081
35087
|
btcAmount.toNumber(),
|
package/dist/index.mjs
CHANGED
|
@@ -30845,6 +30845,8 @@ var AvnuAdapter = class _AvnuAdapter extends BaseAdapter {
|
|
|
30845
30845
|
return null;
|
|
30846
30846
|
}
|
|
30847
30847
|
const dataObject = finalQuote.data[0];
|
|
30848
|
+
const wbtcAmountOut = parseInt(dataObject.buyAmount.toString(), 16);
|
|
30849
|
+
logger.info(`${_AvnuAdapter.name}::getQuotesAvnu finalAmountOfWbtcOut : ${wbtcAmountOut} ${dataObject.buyAmount} ${dataObject.sellAmount.toString()} ${dataObject.sellAmount.toString()}`);
|
|
30848
30850
|
return dataObject;
|
|
30849
30851
|
} catch (err) {
|
|
30850
30852
|
logger.error(`No quotes available for this swap: ${err}`);
|
|
@@ -34526,7 +34528,7 @@ var VesuExtendedMultiplierStrategy = class _VesuExtendedMultiplierStrategy exten
|
|
|
34526
34528
|
};
|
|
34527
34529
|
}
|
|
34528
34530
|
}
|
|
34529
|
-
const amountToInvest = new Web3Number(balance.usdValue, USDC_TOKEN_DECIMALS).plus(usdcBalanceOnExtended?.
|
|
34531
|
+
const amountToInvest = new Web3Number(balance.usdValue, USDC_TOKEN_DECIMALS).plus(usdcBalanceOnExtended?.availableForTrade ?? 0).multipliedBy(1 - LIMIT_BALANCE);
|
|
34530
34532
|
const amountToInvestNumber = amountToInvest.toNumber();
|
|
34531
34533
|
if (!Number.isFinite(amountToInvestNumber)) {
|
|
34532
34534
|
logger.error(
|
|
@@ -34662,17 +34664,17 @@ var VesuExtendedMultiplierStrategy = class _VesuExtendedMultiplierStrategy exten
|
|
|
34662
34664
|
return [];
|
|
34663
34665
|
}
|
|
34664
34666
|
const usdcAmountInWallet = (await this.getUnusedBalance()).amount;
|
|
34665
|
-
const
|
|
34666
|
-
extendedHoldings.
|
|
34667
|
+
const usdcAmountOnExtendedAvailableForTrade = parseFloat(
|
|
34668
|
+
extendedHoldings.availableForTrade
|
|
34667
34669
|
);
|
|
34668
|
-
logger.info(`${_VesuExtendedMultiplierStrategy.name}::shouldMoveAssets calculating movements - Extended current: ${
|
|
34670
|
+
logger.info(`${_VesuExtendedMultiplierStrategy.name}::shouldMoveAssets calculating movements - Extended current: ${usdcAmountOnExtendedAvailableForTrade}, Wallet: ${usdcAmountInWallet.toNumber()}, Target Extended: ${extendedAmount.toNumber()}, Target Vesu: ${vesuAmount.toNumber()}`);
|
|
34669
34671
|
let totalExtendedWithdrawal = new Web3Number(0, USDC_TOKEN_DECIMALS);
|
|
34670
34672
|
let totalExtendedDeposit = new Web3Number(0, USDC_TOKEN_DECIMALS);
|
|
34671
34673
|
if (extendedAmount.isNegative() && extendedAmount.abs().greaterThan(extendedAdapter.minimumExtendedMovementAmount)) {
|
|
34672
34674
|
totalExtendedWithdrawal = totalExtendedWithdrawal.plus(extendedAmount.abs());
|
|
34673
34675
|
}
|
|
34674
34676
|
const extendedTargetAmount = extendedAmount.abs();
|
|
34675
|
-
let projectedExtendedBalance =
|
|
34677
|
+
let projectedExtendedBalance = usdcAmountOnExtendedAvailableForTrade;
|
|
34676
34678
|
if (extendedAmount.isNegative()) {
|
|
34677
34679
|
projectedExtendedBalance = projectedExtendedBalance - extendedAmount.abs().toNumber();
|
|
34678
34680
|
}
|
|
@@ -34688,7 +34690,6 @@ var VesuExtendedMultiplierStrategy = class _VesuExtendedMultiplierStrategy exten
|
|
|
34688
34690
|
let vesuAmountDifference = vesuTargetAmount.minus(projectedWalletBalance);
|
|
34689
34691
|
const vesuAmountDifferenceAbs = vesuAmountDifference.abs();
|
|
34690
34692
|
logger.info(`${_VesuExtendedMultiplierStrategy.name}::shouldMoveAssets calculated movements - Extended withdrawal: ${totalExtendedWithdrawal.toNumber()}, Extended deposit: ${totalExtendedDeposit.toNumber()}, Extended diff: ${extendedAmountDifference.toNumber()}, Projected wallet: ${projectedWalletBalance.toNumber()}, Vesu diff: ${vesuAmountDifference.toNumber()}`);
|
|
34691
|
-
let calls = [];
|
|
34692
34693
|
let transactionResults = [];
|
|
34693
34694
|
if (extendedAmount.isNegative() && extendedAmount.abs().greaterThan(extendedAdapter.minimumExtendedMovementAmount)) {
|
|
34694
34695
|
try {
|
|
@@ -34866,6 +34867,15 @@ var VesuExtendedMultiplierStrategy = class _VesuExtendedMultiplierStrategy exten
|
|
|
34866
34867
|
}
|
|
34867
34868
|
return { calls: [], status: false, transactionMetadata: { protocolFrom: "", protocolTo: "", transactionType: "DEPOSIT", usdAmount: "0", status: "FAILED", cycleType } };
|
|
34868
34869
|
}
|
|
34870
|
+
/**
|
|
34871
|
+
* This method is used to move assets between protocols
|
|
34872
|
+
* @param params - The parameters for the move assets operation
|
|
34873
|
+
* @param extendedAdapter - The extended adapter
|
|
34874
|
+
* @param vesuAdapter - The vesu adapter
|
|
34875
|
+
* @returns The transaction result
|
|
34876
|
+
* If Extended amount is greater than amount of withdrawal from extended, then we need to open a long position
|
|
34877
|
+
* so that the amount of withdrawal from extended is fullfilled
|
|
34878
|
+
*/
|
|
34869
34879
|
async moveAssets(params, extendedAdapter, vesuAdapter) {
|
|
34870
34880
|
try {
|
|
34871
34881
|
if (params.amount.lessThanOrEqualTo(0)) {
|
|
@@ -34874,23 +34884,6 @@ var VesuExtendedMultiplierStrategy = class _VesuExtendedMultiplierStrategy exten
|
|
|
34874
34884
|
);
|
|
34875
34885
|
return this.createTransactionResult([], false, params, "NONE", params.cycleType);
|
|
34876
34886
|
}
|
|
34877
|
-
const amountAbs = params.amount.abs();
|
|
34878
|
-
if (params.from === Protocols.EXTENDED.name || params.to === Protocols.EXTENDED.name) {
|
|
34879
|
-
if (amountAbs.lessThanOrEqualTo(extendedAdapter.minimumExtendedMovementAmount)) {
|
|
34880
|
-
logger.warn(
|
|
34881
|
-
`Amount ${amountAbs.toNumber()} is below minimum Extended movement amount ${extendedAdapter.minimumExtendedMovementAmount}. Skipping operation.`
|
|
34882
|
-
);
|
|
34883
|
-
return this.createTransactionResult([], false, params, "NONE", params.cycleType);
|
|
34884
|
-
}
|
|
34885
|
-
}
|
|
34886
|
-
if (params.from === Protocols.VESU.name || params.to === Protocols.VESU.name) {
|
|
34887
|
-
if (amountAbs.lessThanOrEqualTo(vesuAdapter.minimumVesuMovementAmount)) {
|
|
34888
|
-
logger.warn(
|
|
34889
|
-
`Amount ${amountAbs.toNumber()} is below minimum Vesu movement amount ${vesuAdapter.minimumVesuMovementAmount}. Skipping operation.`
|
|
34890
|
-
);
|
|
34891
|
-
return this.createTransactionResult([], false, params, "NONE", params.cycleType);
|
|
34892
|
-
}
|
|
34893
|
-
}
|
|
34894
34887
|
const avnuAdapter = await this.getAvnuAdapter();
|
|
34895
34888
|
if (!avnuAdapter) {
|
|
34896
34889
|
logger.error(`avnu adapter not found: ${avnuAdapter}`);
|
|
@@ -34927,9 +34920,22 @@ var VesuExtendedMultiplierStrategy = class _VesuExtendedMultiplierStrategy exten
|
|
|
34927
34920
|
);
|
|
34928
34921
|
logger.info(`${_VesuExtendedMultiplierStrategy.name}::moveAssets extendedHoldingAmount: ${extendedHoldingAmount.toNumber()}`);
|
|
34929
34922
|
if (params.amount.abs().greaterThan(extendedHoldingAmount)) {
|
|
34930
|
-
const leftAmountAfterWithdrawalAmountInAccount = params.amount.abs().minus(extendedHoldingAmount);
|
|
34923
|
+
const leftAmountAfterWithdrawalAmountInAccount = new Web3Number(Math.ceil(params.amount.abs().minus(extendedHoldingAmount).toNumber()), USDC_TOKEN_DECIMALS);
|
|
34931
34924
|
logger.info(`${_VesuExtendedMultiplierStrategy.name}::moveAssets leftAmountAfterWithdrawalAmountInAccount: ${leftAmountAfterWithdrawalAmountInAccount.toNumber()}`);
|
|
34932
|
-
|
|
34925
|
+
let priceOfBTC;
|
|
34926
|
+
const {
|
|
34927
|
+
ask,
|
|
34928
|
+
bid,
|
|
34929
|
+
status
|
|
34930
|
+
} = await extendedAdapter.fetchOrderBookBTCUSDC();
|
|
34931
|
+
const price = ask.plus(bid).dividedBy(2);
|
|
34932
|
+
if (status) {
|
|
34933
|
+
priceOfBTC = price;
|
|
34934
|
+
} else {
|
|
34935
|
+
logger.error(`error fetching order book btc usdc: ${status}`);
|
|
34936
|
+
priceOfBTC = collateralPrice.price;
|
|
34937
|
+
}
|
|
34938
|
+
const btcAmount = leftAmountAfterWithdrawalAmountInAccount.dividedBy(priceOfBTC);
|
|
34933
34939
|
const openLongPosition = btcAmount.multipliedBy(3).greaterThan(MINIMUM_EXTENDED_POSITION_SIZE) ? await extendedAdapter.createOrder(
|
|
34934
34940
|
extendedLeverage.toString(),
|
|
34935
34941
|
btcAmount.toNumber(),
|
package/package.json
CHANGED
|
@@ -387,6 +387,8 @@ export class AvnuAdapter extends BaseAdapter<DepositParams, WithdrawParams> {
|
|
|
387
387
|
return null;
|
|
388
388
|
}
|
|
389
389
|
const dataObject: Quote = finalQuote.data[0];
|
|
390
|
+
const wbtcAmountOut = parseInt(dataObject.buyAmount.toString(), 16);
|
|
391
|
+
logger.info(`${AvnuAdapter.name}::getQuotesAvnu finalAmountOfWbtcOut : ${wbtcAmountOut} ${dataObject.buyAmount} ${dataObject.sellAmount.toString()} ${dataObject.sellAmount.toString()}`);
|
|
390
392
|
return dataObject;
|
|
391
393
|
} catch (err) {
|
|
392
394
|
logger.error(`No quotes available for this swap: ${err}`);
|
|
@@ -335,7 +335,7 @@ export class VesuExtendedMultiplierStrategy<
|
|
|
335
335
|
}
|
|
336
336
|
|
|
337
337
|
/** The LIMIT_BALANCE is the bffer amount to keep in the investing Cycle */
|
|
338
|
-
const amountToInvest = new Web3Number(balance.usdValue, USDC_TOKEN_DECIMALS).plus(usdcBalanceOnExtended?.
|
|
338
|
+
const amountToInvest = new Web3Number(balance.usdValue, USDC_TOKEN_DECIMALS).plus(usdcBalanceOnExtended?.availableForTrade ?? 0).multipliedBy(1 - LIMIT_BALANCE);
|
|
339
339
|
|
|
340
340
|
|
|
341
341
|
const amountToInvestNumber = amountToInvest.toNumber();
|
|
@@ -488,11 +488,14 @@ export class VesuExtendedMultiplierStrategy<
|
|
|
488
488
|
return [];
|
|
489
489
|
}
|
|
490
490
|
const usdcAmountInWallet = (await this.getUnusedBalance()).amount;
|
|
491
|
-
|
|
492
|
-
|
|
491
|
+
/**
|
|
492
|
+
* Trade is the correct metric, since we can close position for some vesu amount, otherwise underutilisation of funds will be a huge issue
|
|
493
|
+
*/
|
|
494
|
+
const usdcAmountOnExtendedAvailableForTrade = parseFloat(
|
|
495
|
+
extendedHoldings.availableForTrade
|
|
493
496
|
);
|
|
494
497
|
|
|
495
|
-
logger.info(`${VesuExtendedMultiplierStrategy.name}::shouldMoveAssets calculating movements - Extended current: ${
|
|
498
|
+
logger.info(`${VesuExtendedMultiplierStrategy.name}::shouldMoveAssets calculating movements - Extended current: ${usdcAmountOnExtendedAvailableForTrade}, Wallet: ${usdcAmountInWallet.toNumber()}, Target Extended: ${extendedAmount.toNumber()}, Target Vesu: ${vesuAmount.toNumber()}`);
|
|
496
499
|
|
|
497
500
|
let totalExtendedWithdrawal = new Web3Number(0, USDC_TOKEN_DECIMALS);
|
|
498
501
|
let totalExtendedDeposit = new Web3Number(0, USDC_TOKEN_DECIMALS);
|
|
@@ -505,7 +508,7 @@ export class VesuExtendedMultiplierStrategy<
|
|
|
505
508
|
// If extendedAmount was negative, we've already accounted for that withdrawal
|
|
506
509
|
// So we calculate based on what Extended will be after that withdrawal
|
|
507
510
|
const extendedTargetAmount = extendedAmount.abs(); // Use absolute value as target
|
|
508
|
-
let projectedExtendedBalance =
|
|
511
|
+
let projectedExtendedBalance = usdcAmountOnExtendedAvailableForTrade;
|
|
509
512
|
|
|
510
513
|
if (extendedAmount.isNegative()) {
|
|
511
514
|
projectedExtendedBalance = projectedExtendedBalance - extendedAmount.abs().toNumber();
|
|
@@ -530,7 +533,6 @@ export class VesuExtendedMultiplierStrategy<
|
|
|
530
533
|
const vesuAmountDifferenceAbs = vesuAmountDifference.abs();
|
|
531
534
|
|
|
532
535
|
logger.info(`${VesuExtendedMultiplierStrategy.name}::shouldMoveAssets calculated movements - Extended withdrawal: ${totalExtendedWithdrawal.toNumber()}, Extended deposit: ${totalExtendedDeposit.toNumber()}, Extended diff: ${extendedAmountDifference.toNumber()}, Projected wallet: ${projectedWalletBalance.toNumber()}, Vesu diff: ${vesuAmountDifference.toNumber()}`);
|
|
533
|
-
let calls: Call[] = [];
|
|
534
536
|
let transactionResults: TransactionResult[] = [];
|
|
535
537
|
|
|
536
538
|
// Handle negative extendedAmount (initial withdrawal needed)
|
|
@@ -690,7 +692,6 @@ export class VesuExtendedMultiplierStrategy<
|
|
|
690
692
|
}
|
|
691
693
|
}
|
|
692
694
|
}
|
|
693
|
-
|
|
694
695
|
return transactionResults;
|
|
695
696
|
} catch (err) {
|
|
696
697
|
logger.error(`Failed moving assets to vesu: ${err}`);
|
|
@@ -725,6 +726,15 @@ export class VesuExtendedMultiplierStrategy<
|
|
|
725
726
|
return { calls: [], status: false, transactionMetadata: { protocolFrom: '', protocolTo: '', transactionType: 'DEPOSIT', usdAmount: '0', status: 'FAILED', cycleType: cycleType } };
|
|
726
727
|
}
|
|
727
728
|
|
|
729
|
+
/**
|
|
730
|
+
* This method is used to move assets between protocols
|
|
731
|
+
* @param params - The parameters for the move assets operation
|
|
732
|
+
* @param extendedAdapter - The extended adapter
|
|
733
|
+
* @param vesuAdapter - The vesu adapter
|
|
734
|
+
* @returns The transaction result
|
|
735
|
+
* If Extended amount is greater than amount of withdrawal from extended, then we need to open a long position
|
|
736
|
+
* so that the amount of withdrawal from extended is fullfilled
|
|
737
|
+
*/
|
|
728
738
|
async moveAssets(
|
|
729
739
|
params: {
|
|
730
740
|
amount: Web3Number;
|
|
@@ -745,23 +755,23 @@ export class VesuExtendedMultiplierStrategy<
|
|
|
745
755
|
}
|
|
746
756
|
|
|
747
757
|
// Check minimum movement amounts before starting operations
|
|
748
|
-
const amountAbs = params.amount.abs();
|
|
749
|
-
if (params.from === Protocols.EXTENDED.name || params.to === Protocols.EXTENDED.name) {
|
|
750
|
-
|
|
751
|
-
|
|
752
|
-
|
|
753
|
-
|
|
754
|
-
|
|
755
|
-
|
|
756
|
-
}
|
|
757
|
-
if (params.from === Protocols.VESU.name || params.to === Protocols.VESU.name) {
|
|
758
|
-
|
|
759
|
-
|
|
760
|
-
|
|
761
|
-
|
|
762
|
-
|
|
763
|
-
|
|
764
|
-
}
|
|
758
|
+
// const amountAbs = params.amount.abs();
|
|
759
|
+
// if (params.from === Protocols.EXTENDED.name || params.to === Protocols.EXTENDED.name) {
|
|
760
|
+
// if (amountAbs.lessThanOrEqualTo(extendedAdapter.minimumExtendedMovementAmount)) {
|
|
761
|
+
// logger.warn(
|
|
762
|
+
// `Amount ${amountAbs.toNumber()} is below minimum Extended movement amount ${extendedAdapter.minimumExtendedMovementAmount}. Skipping operation.`
|
|
763
|
+
// );
|
|
764
|
+
// return this.createTransactionResult([], false, params, "NONE", params.cycleType);
|
|
765
|
+
// }
|
|
766
|
+
// }
|
|
767
|
+
// if (params.from === Protocols.VESU.name || params.to === Protocols.VESU.name) {
|
|
768
|
+
// if (amountAbs.lessThanOrEqualTo(vesuAdapter.minimumVesuMovementAmount)) {
|
|
769
|
+
// logger.warn(
|
|
770
|
+
// `Amount ${amountAbs.toNumber()} is below minimum Vesu movement amount ${vesuAdapter.minimumVesuMovementAmount}. Skipping operation.`
|
|
771
|
+
// );
|
|
772
|
+
// return this.createTransactionResult([], false, params, "NONE", params.cycleType);
|
|
773
|
+
// }
|
|
774
|
+
// }
|
|
765
775
|
|
|
766
776
|
const avnuAdapter = await this.getAvnuAdapter();
|
|
767
777
|
if (!avnuAdapter) {
|
|
@@ -787,7 +797,8 @@ export class VesuExtendedMultiplierStrategy<
|
|
|
787
797
|
);
|
|
788
798
|
calls.push(call);
|
|
789
799
|
return this.createTransactionResult(calls, true, params, "DEPOSIT", params.cycleType);
|
|
790
|
-
}
|
|
800
|
+
}
|
|
801
|
+
else if (params.to === Protocols.VAULT.name && params.from === Protocols.EXTENDED.name) {
|
|
791
802
|
const extendedLeverage = calculateExtendedLevergae();
|
|
792
803
|
const extendedHoldings = await extendedAdapter.getExtendedDepositAmount();
|
|
793
804
|
if (!extendedHoldings) {
|
|
@@ -800,9 +811,26 @@ export class VesuExtendedMultiplierStrategy<
|
|
|
800
811
|
);
|
|
801
812
|
logger.info(`${VesuExtendedMultiplierStrategy.name}::moveAssets extendedHoldingAmount: ${extendedHoldingAmount.toNumber()}`);
|
|
802
813
|
if (params.amount.abs().greaterThan(extendedHoldingAmount)) {
|
|
803
|
-
const leftAmountAfterWithdrawalAmountInAccount = params.amount.abs().minus(extendedHoldingAmount);
|
|
814
|
+
const leftAmountAfterWithdrawalAmountInAccount = new Web3Number(Math.ceil(params.amount.abs().minus(extendedHoldingAmount).toNumber()), USDC_TOKEN_DECIMALS);
|
|
804
815
|
logger.info(`${VesuExtendedMultiplierStrategy.name}::moveAssets leftAmountAfterWithdrawalAmountInAccount: ${leftAmountAfterWithdrawalAmountInAccount.toNumber()}`);
|
|
805
|
-
|
|
816
|
+
let priceOfBTC;
|
|
817
|
+
const {
|
|
818
|
+
ask,
|
|
819
|
+
bid,
|
|
820
|
+
status
|
|
821
|
+
} = await extendedAdapter.fetchOrderBookBTCUSDC();
|
|
822
|
+
const price = ask.plus(bid).dividedBy(2);
|
|
823
|
+
if (status) {
|
|
824
|
+
priceOfBTC = price;
|
|
825
|
+
} else {
|
|
826
|
+
logger.error(`error fetching order book btc usdc: ${status}`);
|
|
827
|
+
priceOfBTC = collateralPrice.price;
|
|
828
|
+
}
|
|
829
|
+
const btcAmount = leftAmountAfterWithdrawalAmountInAccount.dividedBy(priceOfBTC);
|
|
830
|
+
/**
|
|
831
|
+
* If amount for withdrawal is greater than the amount in extended available for withdrawal,
|
|
832
|
+
* then we need to open a long position depending on the difference between the two
|
|
833
|
+
*/
|
|
806
834
|
const openLongPosition = btcAmount.multipliedBy(3).greaterThan(MINIMUM_EXTENDED_POSITION_SIZE) ? await extendedAdapter.createOrder(
|
|
807
835
|
extendedLeverage.toString(),
|
|
808
836
|
btcAmount.toNumber(),
|
|
@@ -856,6 +884,7 @@ export class VesuExtendedMultiplierStrategy<
|
|
|
856
884
|
return this.createTransactionResult([], false, params, "NONE", params.cycleType);
|
|
857
885
|
}
|
|
858
886
|
} else if (params.to === Protocols.VAULT.name && params.from === Protocols.VESU.name) {
|
|
887
|
+
|
|
859
888
|
const isPriceDifferenceBetweenAvnuAndExtended = await this.checkPriceDifferenceBetweenAvnuAndExtended(extendedAdapter, vesuAdapter, avnuAdapter, PositionTypeAvnuExtended.CLOSE);
|
|
860
889
|
if (!isPriceDifferenceBetweenAvnuAndExtended) {
|
|
861
890
|
logger.warn(`price difference between avnu and extended doesn't fit the range for close position, ${avnuAdapter.config.maximumExtendedPriceDifferenceForSwapClosing}`);
|
|
@@ -882,7 +911,10 @@ export class VesuExtendedMultiplierStrategy<
|
|
|
882
911
|
);
|
|
883
912
|
calls.push(swapCall);
|
|
884
913
|
return this.createTransactionResult(calls, true, params, "WITHDRAWAL", params.cycleType);
|
|
885
|
-
|
|
914
|
+
|
|
915
|
+
}
|
|
916
|
+
else if (params.to === Protocols.EXTENDED.name && params.from === Protocols.VESU.name) {
|
|
917
|
+
|
|
886
918
|
const isPriceDifferenceBetweenAvnuAndExtended = await this.checkPriceDifferenceBetweenAvnuAndExtended(extendedAdapter, vesuAdapter, avnuAdapter, PositionTypeAvnuExtended.CLOSE);
|
|
887
919
|
if (!isPriceDifferenceBetweenAvnuAndExtended) {
|
|
888
920
|
logger.warn(`price difference between avnu and extended doesn't fit the range for close position, ${avnuAdapter.config.maximumExtendedPriceDifferenceForSwapClosing}`);
|
|
@@ -922,6 +954,7 @@ export class VesuExtendedMultiplierStrategy<
|
|
|
922
954
|
}
|
|
923
955
|
logger.error(`Unsupported assets movement: ${params.from} to ${params.to}`);
|
|
924
956
|
return this.createTransactionResult([], false, params, "NONE", params.cycleType);
|
|
957
|
+
|
|
925
958
|
} catch (err) {
|
|
926
959
|
logger.error(`error moving assets: ${err}`);
|
|
927
960
|
return this.createTransactionResult([], false, params, "NONE", params.cycleType);
|