@strkfarm/sdk 2.0.0-dev.6 → 2.0.0-dev.7
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 +29 -21
- package/dist/index.browser.mjs +29 -21
- package/dist/index.d.ts +7 -1
- package/dist/index.js +29 -21
- package/dist/index.mjs +29 -21
- package/package.json +1 -1
- package/src/strategies/universal-adapters/extended-adapter.ts +12 -6
- package/src/strategies/universal-adapters/vesu-multiply-adapter.ts +3 -1
- package/src/strategies/universal-lst-muliplier-strategy.tsx +2 -1
- package/src/strategies/vesu-extended-strategy/utils/constants.ts +1 -1
- package/src/strategies/vesu-extended-strategy/vesu-extended-strategy.tsx +16 -11
|
@@ -92380,7 +92380,7 @@ spurious results.`);
|
|
|
92380
92380
|
var MAX_RETRIES = Number(process.env.MAX_RETRIES ?? 3);
|
|
92381
92381
|
var MAX_DELAY = Number(process.env.MAX_DELAY ?? 100);
|
|
92382
92382
|
var EXTEND_MARKET_NAME = "BTC-USD";
|
|
92383
|
-
var LIMIT_BALANCE = Number(process.env.LIMIT_BALANCE ??
|
|
92383
|
+
var LIMIT_BALANCE = Number(process.env.LIMIT_BALANCE ?? 0.05);
|
|
92384
92384
|
var REBALANCER_INTERVAL = Number(process.env.REBALANCER_INTERVAL ?? 18e4);
|
|
92385
92385
|
var WITHDRAWAL_INTERVAL = Number(process.env.WITHDRAWAL_INTERVAL ?? 18e6);
|
|
92386
92386
|
var INVESTING_INTERVAL = Number(process.env.INVESTING_INTERVAL ?? 18e4);
|
|
@@ -92637,6 +92637,7 @@ spurious results.`);
|
|
|
92637
92637
|
vaultAllocator: config3.vaultAllocator,
|
|
92638
92638
|
id: ""
|
|
92639
92639
|
});
|
|
92640
|
+
this.minimumVesuMovementAmount = config3.minimumVesuMovementAmount ?? 5;
|
|
92640
92641
|
this.tokenMarketData = new TokenMarketData(
|
|
92641
92642
|
this.config.pricer,
|
|
92642
92643
|
this.config.networkConfig
|
|
@@ -93645,7 +93646,9 @@ spurious results.`);
|
|
|
93645
93646
|
timeout: this.config.extendedTimeout,
|
|
93646
93647
|
retries: this.config.extendedRetries
|
|
93647
93648
|
});
|
|
93649
|
+
this.minimumExtendedMovementAmount = this.config.minimumExtendedMovementAmount ?? 5;
|
|
93648
93650
|
this.client = client;
|
|
93651
|
+
this.retryDelayForOrderStatus = this.config.retryDelayForOrderStatus ?? 3e3;
|
|
93649
93652
|
}
|
|
93650
93653
|
//abstract means the method has no implementation in this class; instead, child classes must implement it.
|
|
93651
93654
|
async getAPY(supportedPosition) {
|
|
@@ -94029,13 +94032,13 @@ spurious results.`);
|
|
|
94029
94032
|
if (!orderhistory || orderhistory.length === 0) {
|
|
94030
94033
|
logger2.error(`error getting order history: ${orderId}`);
|
|
94031
94034
|
} else {
|
|
94032
|
-
const order = orderhistory.slice(0,
|
|
94035
|
+
const order = orderhistory.slice(0, 10).find((order2) => order2.id.toString() === orderId);
|
|
94033
94036
|
if (order) {
|
|
94034
94037
|
return order;
|
|
94035
94038
|
}
|
|
94036
94039
|
}
|
|
94037
|
-
for (let attempt = 1; attempt <=
|
|
94038
|
-
await new Promise((resolve) => setTimeout(resolve,
|
|
94040
|
+
for (let attempt = 1; attempt <= 5; attempt++) {
|
|
94041
|
+
await new Promise((resolve) => setTimeout(resolve, this.retryDelayForOrderStatus));
|
|
94039
94042
|
orderhistory = await this.getOrderHistory(marketName);
|
|
94040
94043
|
if (!orderhistory || orderhistory.length === 0) {
|
|
94041
94044
|
logger2.error(
|
|
@@ -94044,11 +94047,11 @@ spurious results.`);
|
|
|
94044
94047
|
continue;
|
|
94045
94048
|
}
|
|
94046
94049
|
const order = orderhistory.slice(0, 5).find((order2) => order2.id.toString() === orderId);
|
|
94047
|
-
if (order) {
|
|
94050
|
+
if (order && order.status === "FILLED" /* FILLED */) {
|
|
94048
94051
|
return order;
|
|
94049
94052
|
}
|
|
94050
94053
|
logger2.error(
|
|
94051
|
-
`order not found in top
|
|
94054
|
+
`order not found in top 15 entries on retry ${attempt}: ${orderId}`
|
|
94052
94055
|
);
|
|
94053
94056
|
}
|
|
94054
94057
|
logger2.error(`error getting order after all retries: ${orderId}`);
|
|
@@ -94129,7 +94132,7 @@ spurious results.`);
|
|
|
94129
94132
|
result2.position_id,
|
|
94130
94133
|
this.config.extendedMarketName
|
|
94131
94134
|
);
|
|
94132
|
-
if (!openOrder
|
|
94135
|
+
if (!openOrder) {
|
|
94133
94136
|
if (attempt >= maxAttempts) {
|
|
94134
94137
|
logger2.error("Max retries reached \u2014 could not verify open position");
|
|
94135
94138
|
return null;
|
|
@@ -97480,7 +97483,8 @@ spurious results.`);
|
|
|
97480
97483
|
minHealthFactor: vaultSettings.minHealthFactor,
|
|
97481
97484
|
quoteAmountToFetchPrice: vaultSettings.quoteAmountToFetchPrice,
|
|
97482
97485
|
...baseAdapterConfig,
|
|
97483
|
-
supportedPositions: [{ asset: lstToken, isDebt: false }, { asset: Global.getDefaultTokens().find((token) => token.symbol === position), isDebt: true }]
|
|
97486
|
+
supportedPositions: [{ asset: lstToken, isDebt: false }, { asset: Global.getDefaultTokens().find((token) => token.symbol === position), isDebt: true }],
|
|
97487
|
+
minimumVesuMovementAmount: 0
|
|
97484
97488
|
}));
|
|
97485
97489
|
const unusedBalanceAdapter = new UnusedBalanceAdapter({
|
|
97486
97490
|
...baseAdapterConfig
|
|
@@ -97821,7 +97825,6 @@ spurious results.`);
|
|
|
97821
97825
|
toToken.decimals,
|
|
97822
97826
|
true
|
|
97823
97827
|
);
|
|
97824
|
-
console.log(`${_AvnuAdapter.name}::getDepositCall quote: ${quote?.sellAmountInUsd}`);
|
|
97825
97828
|
if (!quote) {
|
|
97826
97829
|
logger2.error("error getting quote from avnu");
|
|
97827
97830
|
return [];
|
|
@@ -98180,7 +98183,7 @@ spurious results.`);
|
|
|
98180
98183
|
}
|
|
98181
98184
|
const balance = await this.getUnusedBalance();
|
|
98182
98185
|
const usdcBalanceOnExtended = await extendedAdapter.getExtendedDepositAmount();
|
|
98183
|
-
const amountToInvest = new Web3Number(balance.usdValue, USDC_TOKEN_DECIMALS).plus(usdcBalanceOnExtended?.availableForWithdrawal ?? 0).
|
|
98186
|
+
const amountToInvest = new Web3Number(balance.usdValue, USDC_TOKEN_DECIMALS).plus(usdcBalanceOnExtended?.availableForWithdrawal ?? 0).multipliedBy(1 - LIMIT_BALANCE);
|
|
98184
98187
|
logger2.info(`${_VesuExtendedMultiplierStrategy.name}::shouldInvest amountToInvest: ${amountToInvest.toNumber()}`);
|
|
98185
98188
|
if (amountToInvest.lessThan(0)) {
|
|
98186
98189
|
return {
|
|
@@ -98268,7 +98271,7 @@ spurious results.`);
|
|
|
98268
98271
|
);
|
|
98269
98272
|
return calls;
|
|
98270
98273
|
}
|
|
98271
|
-
if (extendedAmount.
|
|
98274
|
+
if (extendedAmount.isNegative() && extendedAmount.abs().greaterThan(extendedAdapter.minimumExtendedMovementAmount)) {
|
|
98272
98275
|
try {
|
|
98273
98276
|
const { calls: extendedCalls, status: extendedStatus } = await this.moveAssets(
|
|
98274
98277
|
{
|
|
@@ -98288,7 +98291,7 @@ spurious results.`);
|
|
|
98288
98291
|
logger2.error(`Failed moving assets to vault: ${err2}`);
|
|
98289
98292
|
}
|
|
98290
98293
|
}
|
|
98291
|
-
if (vesuAmount.lessThan(
|
|
98294
|
+
if (vesuAmount.isNegative() && vesuAmount.lessThan(vesuAdapter.minimumVesuMovementAmount)) {
|
|
98292
98295
|
try {
|
|
98293
98296
|
const { calls: vesuCalls, status: vesuStatus } = await this.moveAssets(
|
|
98294
98297
|
{
|
|
@@ -98316,7 +98319,7 @@ spurious results.`);
|
|
|
98316
98319
|
const usdcAmountOnExtended = parseFloat(
|
|
98317
98320
|
extendedHoldings.availableForWithdrawal
|
|
98318
98321
|
);
|
|
98319
|
-
if (extendedAmount.minus(usdcAmountOnExtended).greaterThan(
|
|
98322
|
+
if (extendedAmount.minus(usdcAmountOnExtended).greaterThan(extendedAdapter.minimumExtendedMovementAmount)) {
|
|
98320
98323
|
try {
|
|
98321
98324
|
const { calls: extendedCalls } = await this.moveAssets(
|
|
98322
98325
|
{
|
|
@@ -98332,7 +98335,7 @@ spurious results.`);
|
|
|
98332
98335
|
logger2.error(`Failed moving assets to extended: ${err2}`);
|
|
98333
98336
|
}
|
|
98334
98337
|
}
|
|
98335
|
-
if (vesuAmount.minus(usdcAmountInWallet).greaterThan(
|
|
98338
|
+
if (vesuAmount.minus(usdcAmountInWallet).greaterThan(vesuAdapter.minimumVesuMovementAmount)) {
|
|
98336
98339
|
try {
|
|
98337
98340
|
const { calls: vesuCalls, status: vesuStatus } = await this.moveAssets(
|
|
98338
98341
|
{
|
|
@@ -98797,7 +98800,7 @@ spurious results.`);
|
|
|
98797
98800
|
};
|
|
98798
98801
|
}
|
|
98799
98802
|
};
|
|
98800
|
-
function getLooperSettings2(lstSymbol, underlyingSymbol, vaultSettings, pool1, extendedBackendUrl, extendedApiKey, vaultIdExtended) {
|
|
98803
|
+
function getLooperSettings2(lstSymbol, underlyingSymbol, vaultSettings, pool1, extendedBackendUrl, extendedApiKey, vaultIdExtended, minimumExtendedMovementAmount, minimumVesuMovementAmount, minimumExtendedRetriesDelayForOrderStatus) {
|
|
98801
98804
|
vaultSettings.leafAdapters = [];
|
|
98802
98805
|
const wbtcToken = Global.getDefaultTokens().find(
|
|
98803
98806
|
(token) => token.symbol === lstSymbol
|
|
@@ -98837,7 +98840,10 @@ spurious results.`);
|
|
|
98837
98840
|
extendedBaseUrl: "https://api.starknet.extended.exchange",
|
|
98838
98841
|
extendedMarketName: "BTC-USD",
|
|
98839
98842
|
extendedPrecision: 5,
|
|
98840
|
-
avnuAdapter
|
|
98843
|
+
avnuAdapter,
|
|
98844
|
+
retryDelayForOrderStatus: minimumExtendedRetriesDelayForOrderStatus ?? 3e3,
|
|
98845
|
+
minimumExtendedMovementAmount: minimumExtendedMovementAmount ?? 5
|
|
98846
|
+
//5 usdcs
|
|
98841
98847
|
});
|
|
98842
98848
|
const vesuMultiplyAdapter = new VesuMultiplyAdapter({
|
|
98843
98849
|
poolId: pool1,
|
|
@@ -98850,7 +98856,9 @@ spurious results.`);
|
|
|
98850
98856
|
supportedPositions: [
|
|
98851
98857
|
{ asset: wbtcToken, isDebt: false },
|
|
98852
98858
|
{ asset: usdcToken, isDebt: true }
|
|
98853
|
-
]
|
|
98859
|
+
],
|
|
98860
|
+
minimumVesuMovementAmount: minimumVesuMovementAmount ?? 5
|
|
98861
|
+
//5 usdc
|
|
98854
98862
|
});
|
|
98855
98863
|
const unusedBalanceAdapter = new UnusedBalanceAdapter({
|
|
98856
98864
|
...baseAdapterConfig
|
|
@@ -98965,12 +98973,12 @@ spurious results.`);
|
|
|
98965
98973
|
borrowable_assets: [Global.getDefaultTokens().find((token) => token.symbol === "WBTC")],
|
|
98966
98974
|
minimumWBTCDifferenceForAvnuSwap: MINIMUM_WBTC_DIFFERENCE_FOR_AVNU_SWAP
|
|
98967
98975
|
};
|
|
98968
|
-
var VesuExtendedTestStrategies = (extendedBackendUrl, extendedApiKey, vaultIdExtended) => {
|
|
98976
|
+
var VesuExtendedTestStrategies = (extendedBackendUrl, extendedApiKey, vaultIdExtended, minimumExtendedMovementAmount, minimumVesuMovementAmount, minimumExtendedRetriesDelayForOrderStatus) => {
|
|
98969
98977
|
return [
|
|
98970
|
-
getStrategySettingsVesuExtended("WBTC", "USDC", re7UsdcPrimeDevansh, false, false, extendedBackendUrl, extendedApiKey, vaultIdExtended)
|
|
98978
|
+
getStrategySettingsVesuExtended("WBTC", "USDC", re7UsdcPrimeDevansh, false, false, extendedBackendUrl, extendedApiKey, vaultIdExtended, minimumExtendedMovementAmount, minimumVesuMovementAmount, minimumExtendedRetriesDelayForOrderStatus)
|
|
98971
98979
|
];
|
|
98972
98980
|
};
|
|
98973
|
-
function getStrategySettingsVesuExtended(lstSymbol, underlyingSymbol, addresses, isPreview = false, isLST, extendedBackendUrl, extendedApiKey, vaultIdExtended) {
|
|
98981
|
+
function getStrategySettingsVesuExtended(lstSymbol, underlyingSymbol, addresses, isPreview = false, isLST, extendedBackendUrl, extendedApiKey, vaultIdExtended, minimumExtendedMovementAmount, minimumVesuMovementAmount, minimumExtendedRetriesDelayForOrderStatus) {
|
|
98974
98982
|
return {
|
|
98975
98983
|
name: `Extended Test ${underlyingSymbol}`,
|
|
98976
98984
|
description: getDescription2(lstSymbol, underlyingSymbol),
|
|
@@ -98978,7 +98986,7 @@ spurious results.`);
|
|
|
98978
98986
|
launchBlock: 0,
|
|
98979
98987
|
type: "Other",
|
|
98980
98988
|
depositTokens: [Global.getDefaultTokens().find((token) => token.symbol === underlyingSymbol)],
|
|
98981
|
-
additionalInfo: getLooperSettings2(lstSymbol, underlyingSymbol, addresses, VesuPools.Re7USDCPrime, extendedBackendUrl, extendedApiKey, vaultIdExtended),
|
|
98989
|
+
additionalInfo: getLooperSettings2(lstSymbol, underlyingSymbol, addresses, VesuPools.Re7USDCPrime, extendedBackendUrl, extendedApiKey, vaultIdExtended, minimumExtendedMovementAmount, minimumVesuMovementAmount, minimumExtendedRetriesDelayForOrderStatus),
|
|
98982
98990
|
risk: {
|
|
98983
98991
|
riskFactor: _riskFactor3,
|
|
98984
98992
|
netRisk: _riskFactor3.reduce((acc, curr) => acc + curr.value * curr.weight, 0) / _riskFactor3.reduce((acc, curr) => acc + curr.weight, 0),
|
package/dist/index.browser.mjs
CHANGED
|
@@ -28351,7 +28351,7 @@ var STRK_API_RPC = process.env.STRK_API_RPC ?? "https://mainnet.starknet.a5a.ch"
|
|
|
28351
28351
|
var MAX_RETRIES = Number(process.env.MAX_RETRIES ?? 3);
|
|
28352
28352
|
var MAX_DELAY = Number(process.env.MAX_DELAY ?? 100);
|
|
28353
28353
|
var EXTEND_MARKET_NAME = "BTC-USD";
|
|
28354
|
-
var LIMIT_BALANCE = Number(process.env.LIMIT_BALANCE ??
|
|
28354
|
+
var LIMIT_BALANCE = Number(process.env.LIMIT_BALANCE ?? 0.05);
|
|
28355
28355
|
var REBALANCER_INTERVAL = Number(process.env.REBALANCER_INTERVAL ?? 18e4);
|
|
28356
28356
|
var WITHDRAWAL_INTERVAL = Number(process.env.WITHDRAWAL_INTERVAL ?? 18e6);
|
|
28357
28357
|
var INVESTING_INTERVAL = Number(process.env.INVESTING_INTERVAL ?? 18e4);
|
|
@@ -28608,6 +28608,7 @@ var VesuMultiplyAdapter = class _VesuMultiplyAdapter extends BaseAdapter {
|
|
|
28608
28608
|
vaultAllocator: config.vaultAllocator,
|
|
28609
28609
|
id: ""
|
|
28610
28610
|
});
|
|
28611
|
+
this.minimumVesuMovementAmount = config.minimumVesuMovementAmount ?? 5;
|
|
28611
28612
|
this.tokenMarketData = new TokenMarketData(
|
|
28612
28613
|
this.config.pricer,
|
|
28613
28614
|
this.config.networkConfig
|
|
@@ -29618,7 +29619,9 @@ var ExtendedAdapter = class _ExtendedAdapter extends BaseAdapter {
|
|
|
29618
29619
|
timeout: this.config.extendedTimeout,
|
|
29619
29620
|
retries: this.config.extendedRetries
|
|
29620
29621
|
});
|
|
29622
|
+
this.minimumExtendedMovementAmount = this.config.minimumExtendedMovementAmount ?? 5;
|
|
29621
29623
|
this.client = client;
|
|
29624
|
+
this.retryDelayForOrderStatus = this.config.retryDelayForOrderStatus ?? 3e3;
|
|
29622
29625
|
}
|
|
29623
29626
|
//abstract means the method has no implementation in this class; instead, child classes must implement it.
|
|
29624
29627
|
async getAPY(supportedPosition) {
|
|
@@ -30002,13 +30005,13 @@ var ExtendedAdapter = class _ExtendedAdapter extends BaseAdapter {
|
|
|
30002
30005
|
if (!orderhistory || orderhistory.length === 0) {
|
|
30003
30006
|
logger.error(`error getting order history: ${orderId}`);
|
|
30004
30007
|
} else {
|
|
30005
|
-
const order = orderhistory.slice(0,
|
|
30008
|
+
const order = orderhistory.slice(0, 10).find((order2) => order2.id.toString() === orderId);
|
|
30006
30009
|
if (order) {
|
|
30007
30010
|
return order;
|
|
30008
30011
|
}
|
|
30009
30012
|
}
|
|
30010
|
-
for (let attempt = 1; attempt <=
|
|
30011
|
-
await new Promise((resolve) => setTimeout(resolve,
|
|
30013
|
+
for (let attempt = 1; attempt <= 5; attempt++) {
|
|
30014
|
+
await new Promise((resolve) => setTimeout(resolve, this.retryDelayForOrderStatus));
|
|
30012
30015
|
orderhistory = await this.getOrderHistory(marketName);
|
|
30013
30016
|
if (!orderhistory || orderhistory.length === 0) {
|
|
30014
30017
|
logger.error(
|
|
@@ -30017,11 +30020,11 @@ var ExtendedAdapter = class _ExtendedAdapter extends BaseAdapter {
|
|
|
30017
30020
|
continue;
|
|
30018
30021
|
}
|
|
30019
30022
|
const order = orderhistory.slice(0, 5).find((order2) => order2.id.toString() === orderId);
|
|
30020
|
-
if (order) {
|
|
30023
|
+
if (order && order.status === "FILLED" /* FILLED */) {
|
|
30021
30024
|
return order;
|
|
30022
30025
|
}
|
|
30023
30026
|
logger.error(
|
|
30024
|
-
`order not found in top
|
|
30027
|
+
`order not found in top 15 entries on retry ${attempt}: ${orderId}`
|
|
30025
30028
|
);
|
|
30026
30029
|
}
|
|
30027
30030
|
logger.error(`error getting order after all retries: ${orderId}`);
|
|
@@ -30102,7 +30105,7 @@ var ExtendedAdapter = class _ExtendedAdapter extends BaseAdapter {
|
|
|
30102
30105
|
result.position_id,
|
|
30103
30106
|
this.config.extendedMarketName
|
|
30104
30107
|
);
|
|
30105
|
-
if (!openOrder
|
|
30108
|
+
if (!openOrder) {
|
|
30106
30109
|
if (attempt >= maxAttempts) {
|
|
30107
30110
|
logger.error("Max retries reached \u2014 could not verify open position");
|
|
30108
30111
|
return null;
|
|
@@ -33456,7 +33459,8 @@ function getLooperSettings(lstSymbol, underlyingSymbol, vaultSettings, pool1) {
|
|
|
33456
33459
|
minHealthFactor: vaultSettings.minHealthFactor,
|
|
33457
33460
|
quoteAmountToFetchPrice: vaultSettings.quoteAmountToFetchPrice,
|
|
33458
33461
|
...baseAdapterConfig,
|
|
33459
|
-
supportedPositions: [{ asset: lstToken, isDebt: false }, { asset: Global.getDefaultTokens().find((token) => token.symbol === position), isDebt: true }]
|
|
33462
|
+
supportedPositions: [{ asset: lstToken, isDebt: false }, { asset: Global.getDefaultTokens().find((token) => token.symbol === position), isDebt: true }],
|
|
33463
|
+
minimumVesuMovementAmount: 0
|
|
33460
33464
|
}));
|
|
33461
33465
|
const unusedBalanceAdapter = new UnusedBalanceAdapter({
|
|
33462
33466
|
...baseAdapterConfig
|
|
@@ -33799,7 +33803,6 @@ var AvnuAdapter = class _AvnuAdapter extends BaseAdapter {
|
|
|
33799
33803
|
toToken.decimals,
|
|
33800
33804
|
true
|
|
33801
33805
|
);
|
|
33802
|
-
console.log(`${_AvnuAdapter.name}::getDepositCall quote: ${quote?.sellAmountInUsd}`);
|
|
33803
33806
|
if (!quote) {
|
|
33804
33807
|
logger.error("error getting quote from avnu");
|
|
33805
33808
|
return [];
|
|
@@ -34158,7 +34161,7 @@ var VesuExtendedMultiplierStrategy = class _VesuExtendedMultiplierStrategy exten
|
|
|
34158
34161
|
}
|
|
34159
34162
|
const balance = await this.getUnusedBalance();
|
|
34160
34163
|
const usdcBalanceOnExtended = await extendedAdapter.getExtendedDepositAmount();
|
|
34161
|
-
const amountToInvest = new Web3Number(balance.usdValue, USDC_TOKEN_DECIMALS).plus(usdcBalanceOnExtended?.availableForWithdrawal ?? 0).
|
|
34164
|
+
const amountToInvest = new Web3Number(balance.usdValue, USDC_TOKEN_DECIMALS).plus(usdcBalanceOnExtended?.availableForWithdrawal ?? 0).multipliedBy(1 - LIMIT_BALANCE);
|
|
34162
34165
|
logger.info(`${_VesuExtendedMultiplierStrategy.name}::shouldInvest amountToInvest: ${amountToInvest.toNumber()}`);
|
|
34163
34166
|
if (amountToInvest.lessThan(0)) {
|
|
34164
34167
|
return {
|
|
@@ -34246,7 +34249,7 @@ var VesuExtendedMultiplierStrategy = class _VesuExtendedMultiplierStrategy exten
|
|
|
34246
34249
|
);
|
|
34247
34250
|
return calls;
|
|
34248
34251
|
}
|
|
34249
|
-
if (extendedAmount.
|
|
34252
|
+
if (extendedAmount.isNegative() && extendedAmount.abs().greaterThan(extendedAdapter.minimumExtendedMovementAmount)) {
|
|
34250
34253
|
try {
|
|
34251
34254
|
const { calls: extendedCalls, status: extendedStatus } = await this.moveAssets(
|
|
34252
34255
|
{
|
|
@@ -34266,7 +34269,7 @@ var VesuExtendedMultiplierStrategy = class _VesuExtendedMultiplierStrategy exten
|
|
|
34266
34269
|
logger.error(`Failed moving assets to vault: ${err}`);
|
|
34267
34270
|
}
|
|
34268
34271
|
}
|
|
34269
|
-
if (vesuAmount.lessThan(
|
|
34272
|
+
if (vesuAmount.isNegative() && vesuAmount.lessThan(vesuAdapter.minimumVesuMovementAmount)) {
|
|
34270
34273
|
try {
|
|
34271
34274
|
const { calls: vesuCalls, status: vesuStatus } = await this.moveAssets(
|
|
34272
34275
|
{
|
|
@@ -34294,7 +34297,7 @@ var VesuExtendedMultiplierStrategy = class _VesuExtendedMultiplierStrategy exten
|
|
|
34294
34297
|
const usdcAmountOnExtended = parseFloat(
|
|
34295
34298
|
extendedHoldings.availableForWithdrawal
|
|
34296
34299
|
);
|
|
34297
|
-
if (extendedAmount.minus(usdcAmountOnExtended).greaterThan(
|
|
34300
|
+
if (extendedAmount.minus(usdcAmountOnExtended).greaterThan(extendedAdapter.minimumExtendedMovementAmount)) {
|
|
34298
34301
|
try {
|
|
34299
34302
|
const { calls: extendedCalls } = await this.moveAssets(
|
|
34300
34303
|
{
|
|
@@ -34310,7 +34313,7 @@ var VesuExtendedMultiplierStrategy = class _VesuExtendedMultiplierStrategy exten
|
|
|
34310
34313
|
logger.error(`Failed moving assets to extended: ${err}`);
|
|
34311
34314
|
}
|
|
34312
34315
|
}
|
|
34313
|
-
if (vesuAmount.minus(usdcAmountInWallet).greaterThan(
|
|
34316
|
+
if (vesuAmount.minus(usdcAmountInWallet).greaterThan(vesuAdapter.minimumVesuMovementAmount)) {
|
|
34314
34317
|
try {
|
|
34315
34318
|
const { calls: vesuCalls, status: vesuStatus } = await this.moveAssets(
|
|
34316
34319
|
{
|
|
@@ -34775,7 +34778,7 @@ var VesuExtendedMultiplierStrategy = class _VesuExtendedMultiplierStrategy exten
|
|
|
34775
34778
|
};
|
|
34776
34779
|
}
|
|
34777
34780
|
};
|
|
34778
|
-
function getLooperSettings2(lstSymbol, underlyingSymbol, vaultSettings, pool1, extendedBackendUrl, extendedApiKey, vaultIdExtended) {
|
|
34781
|
+
function getLooperSettings2(lstSymbol, underlyingSymbol, vaultSettings, pool1, extendedBackendUrl, extendedApiKey, vaultIdExtended, minimumExtendedMovementAmount, minimumVesuMovementAmount, minimumExtendedRetriesDelayForOrderStatus) {
|
|
34779
34782
|
vaultSettings.leafAdapters = [];
|
|
34780
34783
|
const wbtcToken = Global.getDefaultTokens().find(
|
|
34781
34784
|
(token) => token.symbol === lstSymbol
|
|
@@ -34815,7 +34818,10 @@ function getLooperSettings2(lstSymbol, underlyingSymbol, vaultSettings, pool1, e
|
|
|
34815
34818
|
extendedBaseUrl: "https://api.starknet.extended.exchange",
|
|
34816
34819
|
extendedMarketName: "BTC-USD",
|
|
34817
34820
|
extendedPrecision: 5,
|
|
34818
|
-
avnuAdapter
|
|
34821
|
+
avnuAdapter,
|
|
34822
|
+
retryDelayForOrderStatus: minimumExtendedRetriesDelayForOrderStatus ?? 3e3,
|
|
34823
|
+
minimumExtendedMovementAmount: minimumExtendedMovementAmount ?? 5
|
|
34824
|
+
//5 usdcs
|
|
34819
34825
|
});
|
|
34820
34826
|
const vesuMultiplyAdapter = new VesuMultiplyAdapter({
|
|
34821
34827
|
poolId: pool1,
|
|
@@ -34828,7 +34834,9 @@ function getLooperSettings2(lstSymbol, underlyingSymbol, vaultSettings, pool1, e
|
|
|
34828
34834
|
supportedPositions: [
|
|
34829
34835
|
{ asset: wbtcToken, isDebt: false },
|
|
34830
34836
|
{ asset: usdcToken, isDebt: true }
|
|
34831
|
-
]
|
|
34837
|
+
],
|
|
34838
|
+
minimumVesuMovementAmount: minimumVesuMovementAmount ?? 5
|
|
34839
|
+
//5 usdc
|
|
34832
34840
|
});
|
|
34833
34841
|
const unusedBalanceAdapter = new UnusedBalanceAdapter({
|
|
34834
34842
|
...baseAdapterConfig
|
|
@@ -34943,12 +34951,12 @@ var re7UsdcPrimeDevansh = {
|
|
|
34943
34951
|
borrowable_assets: [Global.getDefaultTokens().find((token) => token.symbol === "WBTC")],
|
|
34944
34952
|
minimumWBTCDifferenceForAvnuSwap: MINIMUM_WBTC_DIFFERENCE_FOR_AVNU_SWAP
|
|
34945
34953
|
};
|
|
34946
|
-
var VesuExtendedTestStrategies = (extendedBackendUrl, extendedApiKey, vaultIdExtended) => {
|
|
34954
|
+
var VesuExtendedTestStrategies = (extendedBackendUrl, extendedApiKey, vaultIdExtended, minimumExtendedMovementAmount, minimumVesuMovementAmount, minimumExtendedRetriesDelayForOrderStatus) => {
|
|
34947
34955
|
return [
|
|
34948
|
-
getStrategySettingsVesuExtended("WBTC", "USDC", re7UsdcPrimeDevansh, false, false, extendedBackendUrl, extendedApiKey, vaultIdExtended)
|
|
34956
|
+
getStrategySettingsVesuExtended("WBTC", "USDC", re7UsdcPrimeDevansh, false, false, extendedBackendUrl, extendedApiKey, vaultIdExtended, minimumExtendedMovementAmount, minimumVesuMovementAmount, minimumExtendedRetriesDelayForOrderStatus)
|
|
34949
34957
|
];
|
|
34950
34958
|
};
|
|
34951
|
-
function getStrategySettingsVesuExtended(lstSymbol, underlyingSymbol, addresses, isPreview = false, isLST, extendedBackendUrl, extendedApiKey, vaultIdExtended) {
|
|
34959
|
+
function getStrategySettingsVesuExtended(lstSymbol, underlyingSymbol, addresses, isPreview = false, isLST, extendedBackendUrl, extendedApiKey, vaultIdExtended, minimumExtendedMovementAmount, minimumVesuMovementAmount, minimumExtendedRetriesDelayForOrderStatus) {
|
|
34952
34960
|
return {
|
|
34953
34961
|
name: `Extended Test ${underlyingSymbol}`,
|
|
34954
34962
|
description: getDescription2(lstSymbol, underlyingSymbol),
|
|
@@ -34956,7 +34964,7 @@ function getStrategySettingsVesuExtended(lstSymbol, underlyingSymbol, addresses,
|
|
|
34956
34964
|
launchBlock: 0,
|
|
34957
34965
|
type: "Other",
|
|
34958
34966
|
depositTokens: [Global.getDefaultTokens().find((token) => token.symbol === underlyingSymbol)],
|
|
34959
|
-
additionalInfo: getLooperSettings2(lstSymbol, underlyingSymbol, addresses, VesuPools.Re7USDCPrime, extendedBackendUrl, extendedApiKey, vaultIdExtended),
|
|
34967
|
+
additionalInfo: getLooperSettings2(lstSymbol, underlyingSymbol, addresses, VesuPools.Re7USDCPrime, extendedBackendUrl, extendedApiKey, vaultIdExtended, minimumExtendedMovementAmount, minimumVesuMovementAmount, minimumExtendedRetriesDelayForOrderStatus),
|
|
34960
34968
|
risk: {
|
|
34961
34969
|
riskFactor: _riskFactor3,
|
|
34962
34970
|
netRisk: _riskFactor3.reduce((acc, curr) => acc + curr.value * curr.weight, 0) / _riskFactor3.reduce((acc, curr) => acc + curr.weight, 0),
|
package/dist/index.d.ts
CHANGED
|
@@ -945,11 +945,13 @@ interface VesuMultiplyAdapterConfig extends BaseAdapterConfig {
|
|
|
945
945
|
targetHealthFactor: number;
|
|
946
946
|
minHealthFactor: number;
|
|
947
947
|
quoteAmountToFetchPrice: Web3Number;
|
|
948
|
+
minimumVesuMovementAmount: number;
|
|
948
949
|
}
|
|
949
950
|
declare class VesuMultiplyAdapter extends BaseAdapter<DepositParams, WithdrawParams> {
|
|
950
951
|
readonly config: VesuMultiplyAdapterConfig;
|
|
951
952
|
readonly vesuAdapter: VesuAdapter;
|
|
952
953
|
readonly tokenMarketData: TokenMarketData;
|
|
954
|
+
readonly minimumVesuMovementAmount: number;
|
|
953
955
|
constructor(config: VesuMultiplyAdapterConfig);
|
|
954
956
|
protected getAPY(supportedPosition: SupportedPosition): Promise<PositionAPY>;
|
|
955
957
|
protected getPosition(supportedPosition: SupportedPosition): Promise<PositionAmount>;
|
|
@@ -1472,10 +1474,14 @@ interface ExtendedAdapterConfig extends BaseAdapterConfig {
|
|
|
1472
1474
|
extendedMarketName: string;
|
|
1473
1475
|
extendedPrecision: number;
|
|
1474
1476
|
avnuAdapter: AvnuAdapter;
|
|
1477
|
+
retryDelayForOrderStatus: number;
|
|
1478
|
+
minimumExtendedMovementAmount: number;
|
|
1475
1479
|
}
|
|
1476
1480
|
declare class ExtendedAdapter extends BaseAdapter<DepositParams, WithdrawParams> {
|
|
1477
1481
|
readonly config: ExtendedAdapterConfig;
|
|
1478
1482
|
readonly client: ExtendedWrapper;
|
|
1483
|
+
readonly retryDelayForOrderStatus: number;
|
|
1484
|
+
readonly minimumExtendedMovementAmount: number;
|
|
1479
1485
|
constructor(config: ExtendedAdapterConfig);
|
|
1480
1486
|
protected getAPY(supportedPosition: SupportedPosition): Promise<PositionAPY>;
|
|
1481
1487
|
protected getPosition(supportedPosition: SupportedPosition): Promise<PositionAmount>;
|
|
@@ -2245,7 +2251,7 @@ declare class VesuExtendedMultiplierStrategy<S extends VesuExtendedStrategySetti
|
|
|
2245
2251
|
splits: PositionInfo[];
|
|
2246
2252
|
}>;
|
|
2247
2253
|
}
|
|
2248
|
-
declare const VesuExtendedTestStrategies: (extendedBackendUrl: string, extendedApiKey: string, vaultIdExtended: number) => IStrategyMetadata<VesuExtendedStrategySettings>[];
|
|
2254
|
+
declare const VesuExtendedTestStrategies: (extendedBackendUrl: string, extendedApiKey: string, vaultIdExtended: number, minimumExtendedMovementAmount: number, minimumVesuMovementAmount: number, minimumExtendedRetriesDelayForOrderStatus: number) => IStrategyMetadata<VesuExtendedStrategySettings>[];
|
|
2249
2255
|
|
|
2250
2256
|
declare const AddressesConfig: {
|
|
2251
2257
|
readonly tokens: {
|
package/dist/index.js
CHANGED
|
@@ -28168,7 +28168,7 @@ var STRK_API_RPC = process.env.STRK_API_RPC ?? "https://mainnet.starknet.a5a.ch"
|
|
|
28168
28168
|
var MAX_RETRIES = Number(process.env.MAX_RETRIES ?? 3);
|
|
28169
28169
|
var MAX_DELAY = Number(process.env.MAX_DELAY ?? 100);
|
|
28170
28170
|
var EXTEND_MARKET_NAME = "BTC-USD";
|
|
28171
|
-
var LIMIT_BALANCE = Number(process.env.LIMIT_BALANCE ??
|
|
28171
|
+
var LIMIT_BALANCE = Number(process.env.LIMIT_BALANCE ?? 0.05);
|
|
28172
28172
|
var REBALANCER_INTERVAL = Number(process.env.REBALANCER_INTERVAL ?? 18e4);
|
|
28173
28173
|
var WITHDRAWAL_INTERVAL = Number(process.env.WITHDRAWAL_INTERVAL ?? 18e6);
|
|
28174
28174
|
var INVESTING_INTERVAL = Number(process.env.INVESTING_INTERVAL ?? 18e4);
|
|
@@ -28425,6 +28425,7 @@ var VesuMultiplyAdapter = class _VesuMultiplyAdapter extends BaseAdapter {
|
|
|
28425
28425
|
vaultAllocator: config.vaultAllocator,
|
|
28426
28426
|
id: ""
|
|
28427
28427
|
});
|
|
28428
|
+
this.minimumVesuMovementAmount = config.minimumVesuMovementAmount ?? 5;
|
|
28428
28429
|
this.tokenMarketData = new TokenMarketData(
|
|
28429
28430
|
this.config.pricer,
|
|
28430
28431
|
this.config.networkConfig
|
|
@@ -29771,7 +29772,9 @@ var ExtendedAdapter = class _ExtendedAdapter extends BaseAdapter {
|
|
|
29771
29772
|
timeout: this.config.extendedTimeout,
|
|
29772
29773
|
retries: this.config.extendedRetries
|
|
29773
29774
|
});
|
|
29775
|
+
this.minimumExtendedMovementAmount = this.config.minimumExtendedMovementAmount ?? 5;
|
|
29774
29776
|
this.client = client;
|
|
29777
|
+
this.retryDelayForOrderStatus = this.config.retryDelayForOrderStatus ?? 3e3;
|
|
29775
29778
|
}
|
|
29776
29779
|
//abstract means the method has no implementation in this class; instead, child classes must implement it.
|
|
29777
29780
|
async getAPY(supportedPosition) {
|
|
@@ -30155,13 +30158,13 @@ var ExtendedAdapter = class _ExtendedAdapter extends BaseAdapter {
|
|
|
30155
30158
|
if (!orderhistory || orderhistory.length === 0) {
|
|
30156
30159
|
logger.error(`error getting order history: ${orderId}`);
|
|
30157
30160
|
} else {
|
|
30158
|
-
const order = orderhistory.slice(0,
|
|
30161
|
+
const order = orderhistory.slice(0, 10).find((order2) => order2.id.toString() === orderId);
|
|
30159
30162
|
if (order) {
|
|
30160
30163
|
return order;
|
|
30161
30164
|
}
|
|
30162
30165
|
}
|
|
30163
|
-
for (let attempt = 1; attempt <=
|
|
30164
|
-
await new Promise((resolve) => setTimeout(resolve,
|
|
30166
|
+
for (let attempt = 1; attempt <= 5; attempt++) {
|
|
30167
|
+
await new Promise((resolve) => setTimeout(resolve, this.retryDelayForOrderStatus));
|
|
30165
30168
|
orderhistory = await this.getOrderHistory(marketName);
|
|
30166
30169
|
if (!orderhistory || orderhistory.length === 0) {
|
|
30167
30170
|
logger.error(
|
|
@@ -30170,11 +30173,11 @@ var ExtendedAdapter = class _ExtendedAdapter extends BaseAdapter {
|
|
|
30170
30173
|
continue;
|
|
30171
30174
|
}
|
|
30172
30175
|
const order = orderhistory.slice(0, 5).find((order2) => order2.id.toString() === orderId);
|
|
30173
|
-
if (order) {
|
|
30176
|
+
if (order && order.status === "FILLED" /* FILLED */) {
|
|
30174
30177
|
return order;
|
|
30175
30178
|
}
|
|
30176
30179
|
logger.error(
|
|
30177
|
-
`order not found in top
|
|
30180
|
+
`order not found in top 15 entries on retry ${attempt}: ${orderId}`
|
|
30178
30181
|
);
|
|
30179
30182
|
}
|
|
30180
30183
|
logger.error(`error getting order after all retries: ${orderId}`);
|
|
@@ -30255,7 +30258,7 @@ var ExtendedAdapter = class _ExtendedAdapter extends BaseAdapter {
|
|
|
30255
30258
|
result.position_id,
|
|
30256
30259
|
this.config.extendedMarketName
|
|
30257
30260
|
);
|
|
30258
|
-
if (!openOrder
|
|
30261
|
+
if (!openOrder) {
|
|
30259
30262
|
if (attempt >= maxAttempts) {
|
|
30260
30263
|
logger.error("Max retries reached \u2014 could not verify open position");
|
|
30261
30264
|
return null;
|
|
@@ -33609,7 +33612,8 @@ function getLooperSettings(lstSymbol, underlyingSymbol, vaultSettings, pool1) {
|
|
|
33609
33612
|
minHealthFactor: vaultSettings.minHealthFactor,
|
|
33610
33613
|
quoteAmountToFetchPrice: vaultSettings.quoteAmountToFetchPrice,
|
|
33611
33614
|
...baseAdapterConfig,
|
|
33612
|
-
supportedPositions: [{ asset: lstToken, isDebt: false }, { asset: Global.getDefaultTokens().find((token) => token.symbol === position), isDebt: true }]
|
|
33615
|
+
supportedPositions: [{ asset: lstToken, isDebt: false }, { asset: Global.getDefaultTokens().find((token) => token.symbol === position), isDebt: true }],
|
|
33616
|
+
minimumVesuMovementAmount: 0
|
|
33613
33617
|
}));
|
|
33614
33618
|
const unusedBalanceAdapter = new UnusedBalanceAdapter({
|
|
33615
33619
|
...baseAdapterConfig
|
|
@@ -33952,7 +33956,6 @@ var AvnuAdapter = class _AvnuAdapter extends BaseAdapter {
|
|
|
33952
33956
|
toToken.decimals,
|
|
33953
33957
|
true
|
|
33954
33958
|
);
|
|
33955
|
-
console.log(`${_AvnuAdapter.name}::getDepositCall quote: ${quote?.sellAmountInUsd}`);
|
|
33956
33959
|
if (!quote) {
|
|
33957
33960
|
logger.error("error getting quote from avnu");
|
|
33958
33961
|
return [];
|
|
@@ -34311,7 +34314,7 @@ var VesuExtendedMultiplierStrategy = class _VesuExtendedMultiplierStrategy exten
|
|
|
34311
34314
|
}
|
|
34312
34315
|
const balance = await this.getUnusedBalance();
|
|
34313
34316
|
const usdcBalanceOnExtended = await extendedAdapter.getExtendedDepositAmount();
|
|
34314
|
-
const amountToInvest = new Web3Number(balance.usdValue, USDC_TOKEN_DECIMALS).plus(usdcBalanceOnExtended?.availableForWithdrawal ?? 0).
|
|
34317
|
+
const amountToInvest = new Web3Number(balance.usdValue, USDC_TOKEN_DECIMALS).plus(usdcBalanceOnExtended?.availableForWithdrawal ?? 0).multipliedBy(1 - LIMIT_BALANCE);
|
|
34315
34318
|
logger.info(`${_VesuExtendedMultiplierStrategy.name}::shouldInvest amountToInvest: ${amountToInvest.toNumber()}`);
|
|
34316
34319
|
if (amountToInvest.lessThan(0)) {
|
|
34317
34320
|
return {
|
|
@@ -34399,7 +34402,7 @@ var VesuExtendedMultiplierStrategy = class _VesuExtendedMultiplierStrategy exten
|
|
|
34399
34402
|
);
|
|
34400
34403
|
return calls;
|
|
34401
34404
|
}
|
|
34402
|
-
if (extendedAmount.
|
|
34405
|
+
if (extendedAmount.isNegative() && extendedAmount.abs().greaterThan(extendedAdapter.minimumExtendedMovementAmount)) {
|
|
34403
34406
|
try {
|
|
34404
34407
|
const { calls: extendedCalls, status: extendedStatus } = await this.moveAssets(
|
|
34405
34408
|
{
|
|
@@ -34419,7 +34422,7 @@ var VesuExtendedMultiplierStrategy = class _VesuExtendedMultiplierStrategy exten
|
|
|
34419
34422
|
logger.error(`Failed moving assets to vault: ${err}`);
|
|
34420
34423
|
}
|
|
34421
34424
|
}
|
|
34422
|
-
if (vesuAmount.lessThan(
|
|
34425
|
+
if (vesuAmount.isNegative() && vesuAmount.lessThan(vesuAdapter.minimumVesuMovementAmount)) {
|
|
34423
34426
|
try {
|
|
34424
34427
|
const { calls: vesuCalls, status: vesuStatus } = await this.moveAssets(
|
|
34425
34428
|
{
|
|
@@ -34447,7 +34450,7 @@ var VesuExtendedMultiplierStrategy = class _VesuExtendedMultiplierStrategy exten
|
|
|
34447
34450
|
const usdcAmountOnExtended = parseFloat(
|
|
34448
34451
|
extendedHoldings.availableForWithdrawal
|
|
34449
34452
|
);
|
|
34450
|
-
if (extendedAmount.minus(usdcAmountOnExtended).greaterThan(
|
|
34453
|
+
if (extendedAmount.minus(usdcAmountOnExtended).greaterThan(extendedAdapter.minimumExtendedMovementAmount)) {
|
|
34451
34454
|
try {
|
|
34452
34455
|
const { calls: extendedCalls } = await this.moveAssets(
|
|
34453
34456
|
{
|
|
@@ -34463,7 +34466,7 @@ var VesuExtendedMultiplierStrategy = class _VesuExtendedMultiplierStrategy exten
|
|
|
34463
34466
|
logger.error(`Failed moving assets to extended: ${err}`);
|
|
34464
34467
|
}
|
|
34465
34468
|
}
|
|
34466
|
-
if (vesuAmount.minus(usdcAmountInWallet).greaterThan(
|
|
34469
|
+
if (vesuAmount.minus(usdcAmountInWallet).greaterThan(vesuAdapter.minimumVesuMovementAmount)) {
|
|
34467
34470
|
try {
|
|
34468
34471
|
const { calls: vesuCalls, status: vesuStatus } = await this.moveAssets(
|
|
34469
34472
|
{
|
|
@@ -34928,7 +34931,7 @@ var VesuExtendedMultiplierStrategy = class _VesuExtendedMultiplierStrategy exten
|
|
|
34928
34931
|
};
|
|
34929
34932
|
}
|
|
34930
34933
|
};
|
|
34931
|
-
function getLooperSettings2(lstSymbol, underlyingSymbol, vaultSettings, pool1, extendedBackendUrl, extendedApiKey, vaultIdExtended) {
|
|
34934
|
+
function getLooperSettings2(lstSymbol, underlyingSymbol, vaultSettings, pool1, extendedBackendUrl, extendedApiKey, vaultIdExtended, minimumExtendedMovementAmount, minimumVesuMovementAmount, minimumExtendedRetriesDelayForOrderStatus) {
|
|
34932
34935
|
vaultSettings.leafAdapters = [];
|
|
34933
34936
|
const wbtcToken = Global.getDefaultTokens().find(
|
|
34934
34937
|
(token) => token.symbol === lstSymbol
|
|
@@ -34968,7 +34971,10 @@ function getLooperSettings2(lstSymbol, underlyingSymbol, vaultSettings, pool1, e
|
|
|
34968
34971
|
extendedBaseUrl: "https://api.starknet.extended.exchange",
|
|
34969
34972
|
extendedMarketName: "BTC-USD",
|
|
34970
34973
|
extendedPrecision: 5,
|
|
34971
|
-
avnuAdapter
|
|
34974
|
+
avnuAdapter,
|
|
34975
|
+
retryDelayForOrderStatus: minimumExtendedRetriesDelayForOrderStatus ?? 3e3,
|
|
34976
|
+
minimumExtendedMovementAmount: minimumExtendedMovementAmount ?? 5
|
|
34977
|
+
//5 usdcs
|
|
34972
34978
|
});
|
|
34973
34979
|
const vesuMultiplyAdapter = new VesuMultiplyAdapter({
|
|
34974
34980
|
poolId: pool1,
|
|
@@ -34981,7 +34987,9 @@ function getLooperSettings2(lstSymbol, underlyingSymbol, vaultSettings, pool1, e
|
|
|
34981
34987
|
supportedPositions: [
|
|
34982
34988
|
{ asset: wbtcToken, isDebt: false },
|
|
34983
34989
|
{ asset: usdcToken, isDebt: true }
|
|
34984
|
-
]
|
|
34990
|
+
],
|
|
34991
|
+
minimumVesuMovementAmount: minimumVesuMovementAmount ?? 5
|
|
34992
|
+
//5 usdc
|
|
34985
34993
|
});
|
|
34986
34994
|
const unusedBalanceAdapter = new UnusedBalanceAdapter({
|
|
34987
34995
|
...baseAdapterConfig
|
|
@@ -35096,12 +35104,12 @@ var re7UsdcPrimeDevansh = {
|
|
|
35096
35104
|
borrowable_assets: [Global.getDefaultTokens().find((token) => token.symbol === "WBTC")],
|
|
35097
35105
|
minimumWBTCDifferenceForAvnuSwap: MINIMUM_WBTC_DIFFERENCE_FOR_AVNU_SWAP
|
|
35098
35106
|
};
|
|
35099
|
-
var VesuExtendedTestStrategies = (extendedBackendUrl, extendedApiKey, vaultIdExtended) => {
|
|
35107
|
+
var VesuExtendedTestStrategies = (extendedBackendUrl, extendedApiKey, vaultIdExtended, minimumExtendedMovementAmount, minimumVesuMovementAmount, minimumExtendedRetriesDelayForOrderStatus) => {
|
|
35100
35108
|
return [
|
|
35101
|
-
getStrategySettingsVesuExtended("WBTC", "USDC", re7UsdcPrimeDevansh, false, false, extendedBackendUrl, extendedApiKey, vaultIdExtended)
|
|
35109
|
+
getStrategySettingsVesuExtended("WBTC", "USDC", re7UsdcPrimeDevansh, false, false, extendedBackendUrl, extendedApiKey, vaultIdExtended, minimumExtendedMovementAmount, minimumVesuMovementAmount, minimumExtendedRetriesDelayForOrderStatus)
|
|
35102
35110
|
];
|
|
35103
35111
|
};
|
|
35104
|
-
function getStrategySettingsVesuExtended(lstSymbol, underlyingSymbol, addresses, isPreview = false, isLST, extendedBackendUrl, extendedApiKey, vaultIdExtended) {
|
|
35112
|
+
function getStrategySettingsVesuExtended(lstSymbol, underlyingSymbol, addresses, isPreview = false, isLST, extendedBackendUrl, extendedApiKey, vaultIdExtended, minimumExtendedMovementAmount, minimumVesuMovementAmount, minimumExtendedRetriesDelayForOrderStatus) {
|
|
35105
35113
|
return {
|
|
35106
35114
|
name: `Extended Test ${underlyingSymbol}`,
|
|
35107
35115
|
description: getDescription2(lstSymbol, underlyingSymbol),
|
|
@@ -35109,7 +35117,7 @@ function getStrategySettingsVesuExtended(lstSymbol, underlyingSymbol, addresses,
|
|
|
35109
35117
|
launchBlock: 0,
|
|
35110
35118
|
type: "Other",
|
|
35111
35119
|
depositTokens: [Global.getDefaultTokens().find((token) => token.symbol === underlyingSymbol)],
|
|
35112
|
-
additionalInfo: getLooperSettings2(lstSymbol, underlyingSymbol, addresses, VesuPools.Re7USDCPrime, extendedBackendUrl, extendedApiKey, vaultIdExtended),
|
|
35120
|
+
additionalInfo: getLooperSettings2(lstSymbol, underlyingSymbol, addresses, VesuPools.Re7USDCPrime, extendedBackendUrl, extendedApiKey, vaultIdExtended, minimumExtendedMovementAmount, minimumVesuMovementAmount, minimumExtendedRetriesDelayForOrderStatus),
|
|
35113
35121
|
risk: {
|
|
35114
35122
|
riskFactor: _riskFactor3,
|
|
35115
35123
|
netRisk: _riskFactor3.reduce((acc, curr) => acc + curr.value * curr.weight, 0) / _riskFactor3.reduce((acc, curr) => acc + curr.weight, 0),
|
package/dist/index.mjs
CHANGED
|
@@ -28026,7 +28026,7 @@ var STRK_API_RPC = process.env.STRK_API_RPC ?? "https://mainnet.starknet.a5a.ch"
|
|
|
28026
28026
|
var MAX_RETRIES = Number(process.env.MAX_RETRIES ?? 3);
|
|
28027
28027
|
var MAX_DELAY = Number(process.env.MAX_DELAY ?? 100);
|
|
28028
28028
|
var EXTEND_MARKET_NAME = "BTC-USD";
|
|
28029
|
-
var LIMIT_BALANCE = Number(process.env.LIMIT_BALANCE ??
|
|
28029
|
+
var LIMIT_BALANCE = Number(process.env.LIMIT_BALANCE ?? 0.05);
|
|
28030
28030
|
var REBALANCER_INTERVAL = Number(process.env.REBALANCER_INTERVAL ?? 18e4);
|
|
28031
28031
|
var WITHDRAWAL_INTERVAL = Number(process.env.WITHDRAWAL_INTERVAL ?? 18e6);
|
|
28032
28032
|
var INVESTING_INTERVAL = Number(process.env.INVESTING_INTERVAL ?? 18e4);
|
|
@@ -28283,6 +28283,7 @@ var VesuMultiplyAdapter = class _VesuMultiplyAdapter extends BaseAdapter {
|
|
|
28283
28283
|
vaultAllocator: config.vaultAllocator,
|
|
28284
28284
|
id: ""
|
|
28285
28285
|
});
|
|
28286
|
+
this.minimumVesuMovementAmount = config.minimumVesuMovementAmount ?? 5;
|
|
28286
28287
|
this.tokenMarketData = new TokenMarketData(
|
|
28287
28288
|
this.config.pricer,
|
|
28288
28289
|
this.config.networkConfig
|
|
@@ -29629,7 +29630,9 @@ var ExtendedAdapter = class _ExtendedAdapter extends BaseAdapter {
|
|
|
29629
29630
|
timeout: this.config.extendedTimeout,
|
|
29630
29631
|
retries: this.config.extendedRetries
|
|
29631
29632
|
});
|
|
29633
|
+
this.minimumExtendedMovementAmount = this.config.minimumExtendedMovementAmount ?? 5;
|
|
29632
29634
|
this.client = client;
|
|
29635
|
+
this.retryDelayForOrderStatus = this.config.retryDelayForOrderStatus ?? 3e3;
|
|
29633
29636
|
}
|
|
29634
29637
|
//abstract means the method has no implementation in this class; instead, child classes must implement it.
|
|
29635
29638
|
async getAPY(supportedPosition) {
|
|
@@ -30013,13 +30016,13 @@ var ExtendedAdapter = class _ExtendedAdapter extends BaseAdapter {
|
|
|
30013
30016
|
if (!orderhistory || orderhistory.length === 0) {
|
|
30014
30017
|
logger.error(`error getting order history: ${orderId}`);
|
|
30015
30018
|
} else {
|
|
30016
|
-
const order = orderhistory.slice(0,
|
|
30019
|
+
const order = orderhistory.slice(0, 10).find((order2) => order2.id.toString() === orderId);
|
|
30017
30020
|
if (order) {
|
|
30018
30021
|
return order;
|
|
30019
30022
|
}
|
|
30020
30023
|
}
|
|
30021
|
-
for (let attempt = 1; attempt <=
|
|
30022
|
-
await new Promise((resolve) => setTimeout(resolve,
|
|
30024
|
+
for (let attempt = 1; attempt <= 5; attempt++) {
|
|
30025
|
+
await new Promise((resolve) => setTimeout(resolve, this.retryDelayForOrderStatus));
|
|
30023
30026
|
orderhistory = await this.getOrderHistory(marketName);
|
|
30024
30027
|
if (!orderhistory || orderhistory.length === 0) {
|
|
30025
30028
|
logger.error(
|
|
@@ -30028,11 +30031,11 @@ var ExtendedAdapter = class _ExtendedAdapter extends BaseAdapter {
|
|
|
30028
30031
|
continue;
|
|
30029
30032
|
}
|
|
30030
30033
|
const order = orderhistory.slice(0, 5).find((order2) => order2.id.toString() === orderId);
|
|
30031
|
-
if (order) {
|
|
30034
|
+
if (order && order.status === "FILLED" /* FILLED */) {
|
|
30032
30035
|
return order;
|
|
30033
30036
|
}
|
|
30034
30037
|
logger.error(
|
|
30035
|
-
`order not found in top
|
|
30038
|
+
`order not found in top 15 entries on retry ${attempt}: ${orderId}`
|
|
30036
30039
|
);
|
|
30037
30040
|
}
|
|
30038
30041
|
logger.error(`error getting order after all retries: ${orderId}`);
|
|
@@ -30113,7 +30116,7 @@ var ExtendedAdapter = class _ExtendedAdapter extends BaseAdapter {
|
|
|
30113
30116
|
result.position_id,
|
|
30114
30117
|
this.config.extendedMarketName
|
|
30115
30118
|
);
|
|
30116
|
-
if (!openOrder
|
|
30119
|
+
if (!openOrder) {
|
|
30117
30120
|
if (attempt >= maxAttempts) {
|
|
30118
30121
|
logger.error("Max retries reached \u2014 could not verify open position");
|
|
30119
30122
|
return null;
|
|
@@ -33467,7 +33470,8 @@ function getLooperSettings(lstSymbol, underlyingSymbol, vaultSettings, pool1) {
|
|
|
33467
33470
|
minHealthFactor: vaultSettings.minHealthFactor,
|
|
33468
33471
|
quoteAmountToFetchPrice: vaultSettings.quoteAmountToFetchPrice,
|
|
33469
33472
|
...baseAdapterConfig,
|
|
33470
|
-
supportedPositions: [{ asset: lstToken, isDebt: false }, { asset: Global.getDefaultTokens().find((token) => token.symbol === position), isDebt: true }]
|
|
33473
|
+
supportedPositions: [{ asset: lstToken, isDebt: false }, { asset: Global.getDefaultTokens().find((token) => token.symbol === position), isDebt: true }],
|
|
33474
|
+
minimumVesuMovementAmount: 0
|
|
33471
33475
|
}));
|
|
33472
33476
|
const unusedBalanceAdapter = new UnusedBalanceAdapter({
|
|
33473
33477
|
...baseAdapterConfig
|
|
@@ -33810,7 +33814,6 @@ var AvnuAdapter = class _AvnuAdapter extends BaseAdapter {
|
|
|
33810
33814
|
toToken.decimals,
|
|
33811
33815
|
true
|
|
33812
33816
|
);
|
|
33813
|
-
console.log(`${_AvnuAdapter.name}::getDepositCall quote: ${quote?.sellAmountInUsd}`);
|
|
33814
33817
|
if (!quote) {
|
|
33815
33818
|
logger.error("error getting quote from avnu");
|
|
33816
33819
|
return [];
|
|
@@ -34169,7 +34172,7 @@ var VesuExtendedMultiplierStrategy = class _VesuExtendedMultiplierStrategy exten
|
|
|
34169
34172
|
}
|
|
34170
34173
|
const balance = await this.getUnusedBalance();
|
|
34171
34174
|
const usdcBalanceOnExtended = await extendedAdapter.getExtendedDepositAmount();
|
|
34172
|
-
const amountToInvest = new Web3Number(balance.usdValue, USDC_TOKEN_DECIMALS).plus(usdcBalanceOnExtended?.availableForWithdrawal ?? 0).
|
|
34175
|
+
const amountToInvest = new Web3Number(balance.usdValue, USDC_TOKEN_DECIMALS).plus(usdcBalanceOnExtended?.availableForWithdrawal ?? 0).multipliedBy(1 - LIMIT_BALANCE);
|
|
34173
34176
|
logger.info(`${_VesuExtendedMultiplierStrategy.name}::shouldInvest amountToInvest: ${amountToInvest.toNumber()}`);
|
|
34174
34177
|
if (amountToInvest.lessThan(0)) {
|
|
34175
34178
|
return {
|
|
@@ -34257,7 +34260,7 @@ var VesuExtendedMultiplierStrategy = class _VesuExtendedMultiplierStrategy exten
|
|
|
34257
34260
|
);
|
|
34258
34261
|
return calls;
|
|
34259
34262
|
}
|
|
34260
|
-
if (extendedAmount.
|
|
34263
|
+
if (extendedAmount.isNegative() && extendedAmount.abs().greaterThan(extendedAdapter.minimumExtendedMovementAmount)) {
|
|
34261
34264
|
try {
|
|
34262
34265
|
const { calls: extendedCalls, status: extendedStatus } = await this.moveAssets(
|
|
34263
34266
|
{
|
|
@@ -34277,7 +34280,7 @@ var VesuExtendedMultiplierStrategy = class _VesuExtendedMultiplierStrategy exten
|
|
|
34277
34280
|
logger.error(`Failed moving assets to vault: ${err}`);
|
|
34278
34281
|
}
|
|
34279
34282
|
}
|
|
34280
|
-
if (vesuAmount.lessThan(
|
|
34283
|
+
if (vesuAmount.isNegative() && vesuAmount.lessThan(vesuAdapter.minimumVesuMovementAmount)) {
|
|
34281
34284
|
try {
|
|
34282
34285
|
const { calls: vesuCalls, status: vesuStatus } = await this.moveAssets(
|
|
34283
34286
|
{
|
|
@@ -34305,7 +34308,7 @@ var VesuExtendedMultiplierStrategy = class _VesuExtendedMultiplierStrategy exten
|
|
|
34305
34308
|
const usdcAmountOnExtended = parseFloat(
|
|
34306
34309
|
extendedHoldings.availableForWithdrawal
|
|
34307
34310
|
);
|
|
34308
|
-
if (extendedAmount.minus(usdcAmountOnExtended).greaterThan(
|
|
34311
|
+
if (extendedAmount.minus(usdcAmountOnExtended).greaterThan(extendedAdapter.minimumExtendedMovementAmount)) {
|
|
34309
34312
|
try {
|
|
34310
34313
|
const { calls: extendedCalls } = await this.moveAssets(
|
|
34311
34314
|
{
|
|
@@ -34321,7 +34324,7 @@ var VesuExtendedMultiplierStrategy = class _VesuExtendedMultiplierStrategy exten
|
|
|
34321
34324
|
logger.error(`Failed moving assets to extended: ${err}`);
|
|
34322
34325
|
}
|
|
34323
34326
|
}
|
|
34324
|
-
if (vesuAmount.minus(usdcAmountInWallet).greaterThan(
|
|
34327
|
+
if (vesuAmount.minus(usdcAmountInWallet).greaterThan(vesuAdapter.minimumVesuMovementAmount)) {
|
|
34325
34328
|
try {
|
|
34326
34329
|
const { calls: vesuCalls, status: vesuStatus } = await this.moveAssets(
|
|
34327
34330
|
{
|
|
@@ -34786,7 +34789,7 @@ var VesuExtendedMultiplierStrategy = class _VesuExtendedMultiplierStrategy exten
|
|
|
34786
34789
|
};
|
|
34787
34790
|
}
|
|
34788
34791
|
};
|
|
34789
|
-
function getLooperSettings2(lstSymbol, underlyingSymbol, vaultSettings, pool1, extendedBackendUrl, extendedApiKey, vaultIdExtended) {
|
|
34792
|
+
function getLooperSettings2(lstSymbol, underlyingSymbol, vaultSettings, pool1, extendedBackendUrl, extendedApiKey, vaultIdExtended, minimumExtendedMovementAmount, minimumVesuMovementAmount, minimumExtendedRetriesDelayForOrderStatus) {
|
|
34790
34793
|
vaultSettings.leafAdapters = [];
|
|
34791
34794
|
const wbtcToken = Global.getDefaultTokens().find(
|
|
34792
34795
|
(token) => token.symbol === lstSymbol
|
|
@@ -34826,7 +34829,10 @@ function getLooperSettings2(lstSymbol, underlyingSymbol, vaultSettings, pool1, e
|
|
|
34826
34829
|
extendedBaseUrl: "https://api.starknet.extended.exchange",
|
|
34827
34830
|
extendedMarketName: "BTC-USD",
|
|
34828
34831
|
extendedPrecision: 5,
|
|
34829
|
-
avnuAdapter
|
|
34832
|
+
avnuAdapter,
|
|
34833
|
+
retryDelayForOrderStatus: minimumExtendedRetriesDelayForOrderStatus ?? 3e3,
|
|
34834
|
+
minimumExtendedMovementAmount: minimumExtendedMovementAmount ?? 5
|
|
34835
|
+
//5 usdcs
|
|
34830
34836
|
});
|
|
34831
34837
|
const vesuMultiplyAdapter = new VesuMultiplyAdapter({
|
|
34832
34838
|
poolId: pool1,
|
|
@@ -34839,7 +34845,9 @@ function getLooperSettings2(lstSymbol, underlyingSymbol, vaultSettings, pool1, e
|
|
|
34839
34845
|
supportedPositions: [
|
|
34840
34846
|
{ asset: wbtcToken, isDebt: false },
|
|
34841
34847
|
{ asset: usdcToken, isDebt: true }
|
|
34842
|
-
]
|
|
34848
|
+
],
|
|
34849
|
+
minimumVesuMovementAmount: minimumVesuMovementAmount ?? 5
|
|
34850
|
+
//5 usdc
|
|
34843
34851
|
});
|
|
34844
34852
|
const unusedBalanceAdapter = new UnusedBalanceAdapter({
|
|
34845
34853
|
...baseAdapterConfig
|
|
@@ -34954,12 +34962,12 @@ var re7UsdcPrimeDevansh = {
|
|
|
34954
34962
|
borrowable_assets: [Global.getDefaultTokens().find((token) => token.symbol === "WBTC")],
|
|
34955
34963
|
minimumWBTCDifferenceForAvnuSwap: MINIMUM_WBTC_DIFFERENCE_FOR_AVNU_SWAP
|
|
34956
34964
|
};
|
|
34957
|
-
var VesuExtendedTestStrategies = (extendedBackendUrl, extendedApiKey, vaultIdExtended) => {
|
|
34965
|
+
var VesuExtendedTestStrategies = (extendedBackendUrl, extendedApiKey, vaultIdExtended, minimumExtendedMovementAmount, minimumVesuMovementAmount, minimumExtendedRetriesDelayForOrderStatus) => {
|
|
34958
34966
|
return [
|
|
34959
|
-
getStrategySettingsVesuExtended("WBTC", "USDC", re7UsdcPrimeDevansh, false, false, extendedBackendUrl, extendedApiKey, vaultIdExtended)
|
|
34967
|
+
getStrategySettingsVesuExtended("WBTC", "USDC", re7UsdcPrimeDevansh, false, false, extendedBackendUrl, extendedApiKey, vaultIdExtended, minimumExtendedMovementAmount, minimumVesuMovementAmount, minimumExtendedRetriesDelayForOrderStatus)
|
|
34960
34968
|
];
|
|
34961
34969
|
};
|
|
34962
|
-
function getStrategySettingsVesuExtended(lstSymbol, underlyingSymbol, addresses, isPreview = false, isLST, extendedBackendUrl, extendedApiKey, vaultIdExtended) {
|
|
34970
|
+
function getStrategySettingsVesuExtended(lstSymbol, underlyingSymbol, addresses, isPreview = false, isLST, extendedBackendUrl, extendedApiKey, vaultIdExtended, minimumExtendedMovementAmount, minimumVesuMovementAmount, minimumExtendedRetriesDelayForOrderStatus) {
|
|
34963
34971
|
return {
|
|
34964
34972
|
name: `Extended Test ${underlyingSymbol}`,
|
|
34965
34973
|
description: getDescription2(lstSymbol, underlyingSymbol),
|
|
@@ -34967,7 +34975,7 @@ function getStrategySettingsVesuExtended(lstSymbol, underlyingSymbol, addresses,
|
|
|
34967
34975
|
launchBlock: 0,
|
|
34968
34976
|
type: "Other",
|
|
34969
34977
|
depositTokens: [Global.getDefaultTokens().find((token) => token.symbol === underlyingSymbol)],
|
|
34970
|
-
additionalInfo: getLooperSettings2(lstSymbol, underlyingSymbol, addresses, VesuPools.Re7USDCPrime, extendedBackendUrl, extendedApiKey, vaultIdExtended),
|
|
34978
|
+
additionalInfo: getLooperSettings2(lstSymbol, underlyingSymbol, addresses, VesuPools.Re7USDCPrime, extendedBackendUrl, extendedApiKey, vaultIdExtended, minimumExtendedMovementAmount, minimumVesuMovementAmount, minimumExtendedRetriesDelayForOrderStatus),
|
|
34971
34979
|
risk: {
|
|
34972
34980
|
riskFactor: _riskFactor3,
|
|
34973
34981
|
netRisk: _riskFactor3.reduce((acc, curr) => acc + curr.value * curr.weight, 0) / _riskFactor3.reduce((acc, curr) => acc + curr.weight, 0),
|
package/package.json
CHANGED
|
@@ -45,6 +45,8 @@ export interface ExtendedAdapterConfig extends BaseAdapterConfig {
|
|
|
45
45
|
extendedMarketName: string;
|
|
46
46
|
extendedPrecision: number;
|
|
47
47
|
avnuAdapter: AvnuAdapter;
|
|
48
|
+
retryDelayForOrderStatus: number;
|
|
49
|
+
minimumExtendedMovementAmount: number;
|
|
48
50
|
}
|
|
49
51
|
|
|
50
52
|
export class ExtendedAdapter extends BaseAdapter<
|
|
@@ -53,6 +55,8 @@ export class ExtendedAdapter extends BaseAdapter<
|
|
|
53
55
|
> {
|
|
54
56
|
readonly config: ExtendedAdapterConfig;
|
|
55
57
|
readonly client: ExtendedWrapper;
|
|
58
|
+
readonly retryDelayForOrderStatus: number;
|
|
59
|
+
readonly minimumExtendedMovementAmount: number;
|
|
56
60
|
|
|
57
61
|
constructor(config: ExtendedAdapterConfig) {
|
|
58
62
|
super(config, ExtendedAdapter.name, Protocols.EXTENDED);
|
|
@@ -63,7 +67,9 @@ export class ExtendedAdapter extends BaseAdapter<
|
|
|
63
67
|
timeout: this.config.extendedTimeout,
|
|
64
68
|
retries: this.config.extendedRetries,
|
|
65
69
|
});
|
|
70
|
+
this.minimumExtendedMovementAmount = this.config.minimumExtendedMovementAmount ?? 5; //5 usdc
|
|
66
71
|
this.client = client;
|
|
72
|
+
this.retryDelayForOrderStatus = this.config.retryDelayForOrderStatus ?? 3000;
|
|
67
73
|
}
|
|
68
74
|
//abstract means the method has no implementation in this class; instead, child classes must implement it.
|
|
69
75
|
protected async getAPY(
|
|
@@ -507,7 +513,7 @@ export class ExtendedAdapter extends BaseAdapter<
|
|
|
507
513
|
logger.error(`error getting order history: ${orderId}`);
|
|
508
514
|
} else {
|
|
509
515
|
const order = orderhistory
|
|
510
|
-
.slice(0,
|
|
516
|
+
.slice(0, 10)
|
|
511
517
|
.find((order) => order.id.toString() === orderId);
|
|
512
518
|
if (order) {
|
|
513
519
|
return order;
|
|
@@ -515,8 +521,8 @@ export class ExtendedAdapter extends BaseAdapter<
|
|
|
515
521
|
}
|
|
516
522
|
|
|
517
523
|
// Retry logic: 3 more attempts with 3 second delay each
|
|
518
|
-
for (let attempt = 1; attempt <=
|
|
519
|
-
await new Promise((resolve) => setTimeout(resolve,
|
|
524
|
+
for (let attempt = 1; attempt <= 5; attempt++) {
|
|
525
|
+
await new Promise((resolve) => setTimeout(resolve, this.retryDelayForOrderStatus));
|
|
520
526
|
orderhistory = await this.getOrderHistory(marketName);
|
|
521
527
|
|
|
522
528
|
if (!orderhistory || orderhistory.length === 0) {
|
|
@@ -530,12 +536,12 @@ export class ExtendedAdapter extends BaseAdapter<
|
|
|
530
536
|
.slice(0, 5)
|
|
531
537
|
.find((order) => order.id.toString() === orderId);
|
|
532
538
|
|
|
533
|
-
if (order) {
|
|
539
|
+
if (order && order.status === OrderStatus.FILLED) {
|
|
534
540
|
return order;
|
|
535
541
|
}
|
|
536
542
|
|
|
537
543
|
logger.error(
|
|
538
|
-
`order not found in top
|
|
544
|
+
`order not found in top 15 entries on retry ${attempt}: ${orderId}`
|
|
539
545
|
);
|
|
540
546
|
}
|
|
541
547
|
|
|
@@ -631,7 +637,7 @@ export class ExtendedAdapter extends BaseAdapter<
|
|
|
631
637
|
result.position_id,
|
|
632
638
|
this.config.extendedMarketName
|
|
633
639
|
);
|
|
634
|
-
if (!openOrder
|
|
640
|
+
if (!openOrder) {
|
|
635
641
|
if (attempt >= maxAttempts) {
|
|
636
642
|
logger.error("Max retries reached — could not verify open position");
|
|
637
643
|
return null;
|
|
@@ -50,6 +50,7 @@ export interface VesuMultiplyAdapterConfig extends BaseAdapterConfig {
|
|
|
50
50
|
targetHealthFactor: number;
|
|
51
51
|
minHealthFactor: number;
|
|
52
52
|
quoteAmountToFetchPrice: Web3Number;
|
|
53
|
+
minimumVesuMovementAmount: number;
|
|
53
54
|
}
|
|
54
55
|
|
|
55
56
|
export class VesuMultiplyAdapter extends BaseAdapter<
|
|
@@ -59,7 +60,7 @@ export class VesuMultiplyAdapter extends BaseAdapter<
|
|
|
59
60
|
readonly config: VesuMultiplyAdapterConfig;
|
|
60
61
|
readonly vesuAdapter: VesuAdapter;
|
|
61
62
|
readonly tokenMarketData: TokenMarketData;
|
|
62
|
-
|
|
63
|
+
readonly minimumVesuMovementAmount: number;
|
|
63
64
|
constructor(config: VesuMultiplyAdapterConfig) {
|
|
64
65
|
super(config, VesuMultiplyAdapter.name, Protocols.VESU);
|
|
65
66
|
this.config = config;
|
|
@@ -70,6 +71,7 @@ export class VesuMultiplyAdapter extends BaseAdapter<
|
|
|
70
71
|
vaultAllocator: config.vaultAllocator,
|
|
71
72
|
id: "",
|
|
72
73
|
});
|
|
74
|
+
this.minimumVesuMovementAmount = config.minimumVesuMovementAmount ?? 5; //5 usdc
|
|
73
75
|
this.tokenMarketData = new TokenMarketData(
|
|
74
76
|
this.config.pricer,
|
|
75
77
|
this.config.networkConfig
|
|
@@ -786,7 +786,8 @@ function getLooperSettings(
|
|
|
786
786
|
minHealthFactor: vaultSettings.minHealthFactor,
|
|
787
787
|
quoteAmountToFetchPrice: vaultSettings.quoteAmountToFetchPrice,
|
|
788
788
|
...baseAdapterConfig,
|
|
789
|
-
supportedPositions: [{asset: lstToken, isDebt: false}, {asset: Global.getDefaultTokens().find(token => token.symbol === position)!, isDebt: true}]
|
|
789
|
+
supportedPositions: [{asset: lstToken, isDebt: false}, {asset: Global.getDefaultTokens().find(token => token.symbol === position)!, isDebt: true}],
|
|
790
|
+
minimumVesuMovementAmount: 0
|
|
790
791
|
}));
|
|
791
792
|
|
|
792
793
|
const unusedBalanceAdapter = new UnusedBalanceAdapter({
|
|
@@ -22,7 +22,7 @@ export const STRK_API_RPC = process.env.STRK_API_RPC ?? "https://mainnet.starkne
|
|
|
22
22
|
export const MAX_RETRIES = Number(process.env.MAX_RETRIES ?? 3);
|
|
23
23
|
export const MAX_DELAY = Number(process.env.MAX_DELAY ?? 100);
|
|
24
24
|
export const EXTEND_MARKET_NAME = "BTC-USD";
|
|
25
|
-
export const LIMIT_BALANCE = Number(process.env.LIMIT_BALANCE ??
|
|
25
|
+
export const LIMIT_BALANCE = Number(process.env.LIMIT_BALANCE ?? 0.05);
|
|
26
26
|
export const REBALANCER_INTERVAL = Number(process.env.REBALANCER_INTERVAL ?? 180000); //3 mins
|
|
27
27
|
export const WITHDRAWAL_INTERVAL = Number(process.env.WITHDRAWAL_INTERVAL ?? 18000000); //5 hours
|
|
28
28
|
export const INVESTING_INTERVAL = Number(process.env.INVESTING_INTERVAL ?? 180000); //3 mins
|
|
@@ -71,7 +71,6 @@ export class VesuExtendedMultiplierStrategy<
|
|
|
71
71
|
>
|
|
72
72
|
extends SVKStrategy<S>
|
|
73
73
|
implements Operations {
|
|
74
|
-
|
|
75
74
|
constructor(
|
|
76
75
|
config: IConfig,
|
|
77
76
|
pricer: PricerBase,
|
|
@@ -108,7 +107,7 @@ export class VesuExtendedMultiplierStrategy<
|
|
|
108
107
|
debtPrice,
|
|
109
108
|
};
|
|
110
109
|
}
|
|
111
|
-
|
|
110
|
+
|
|
112
111
|
async getUnusedBalanceUSDCE(): Promise<SingleTokenInfo> {
|
|
113
112
|
const usdceToken = Global.getDefaultTokens().find(
|
|
114
113
|
(token) => token.symbol === "USDCe"
|
|
@@ -238,7 +237,7 @@ export class VesuExtendedMultiplierStrategy<
|
|
|
238
237
|
const balance = await this.getUnusedBalance();
|
|
239
238
|
const usdcBalanceOnExtended = await extendedAdapter.getExtendedDepositAmount();
|
|
240
239
|
/** The LIMIT_BALANCE is the bffer amount to keep in the investing Cycle */
|
|
241
|
-
const amountToInvest = new Web3Number(balance.usdValue, USDC_TOKEN_DECIMALS).plus(usdcBalanceOnExtended?.availableForWithdrawal ?? 0).
|
|
240
|
+
const amountToInvest = new Web3Number(balance.usdValue, USDC_TOKEN_DECIMALS).plus(usdcBalanceOnExtended?.availableForWithdrawal ?? 0).multipliedBy(1 - LIMIT_BALANCE);
|
|
242
241
|
logger.info(`${VesuExtendedMultiplierStrategy.name}::shouldInvest amountToInvest: ${amountToInvest.toNumber()}`);
|
|
243
242
|
if (amountToInvest.lessThan(0)) {
|
|
244
243
|
return {
|
|
@@ -336,7 +335,7 @@ export class VesuExtendedMultiplierStrategy<
|
|
|
336
335
|
);
|
|
337
336
|
return calls;
|
|
338
337
|
}
|
|
339
|
-
if (extendedAmount.
|
|
338
|
+
if (extendedAmount.isNegative() && extendedAmount.abs().greaterThan(extendedAdapter.minimumExtendedMovementAmount)) {
|
|
340
339
|
try {
|
|
341
340
|
const { calls: extendedCalls, status: extendedStatus } = await this.moveAssets(
|
|
342
341
|
{
|
|
@@ -358,7 +357,7 @@ export class VesuExtendedMultiplierStrategy<
|
|
|
358
357
|
}
|
|
359
358
|
}
|
|
360
359
|
|
|
361
|
-
if (vesuAmount.lessThan(
|
|
360
|
+
if (vesuAmount.isNegative() && vesuAmount.lessThan(vesuAdapter.minimumVesuMovementAmount)) {
|
|
362
361
|
try {
|
|
363
362
|
const { calls: vesuCalls, status: vesuStatus } = await this.moveAssets(
|
|
364
363
|
{
|
|
@@ -387,7 +386,7 @@ export class VesuExtendedMultiplierStrategy<
|
|
|
387
386
|
const usdcAmountOnExtended = parseFloat(
|
|
388
387
|
extendedHoldings.availableForWithdrawal
|
|
389
388
|
);
|
|
390
|
-
if (extendedAmount.minus(usdcAmountOnExtended).greaterThan(
|
|
389
|
+
if (extendedAmount.minus(usdcAmountOnExtended).greaterThan(extendedAdapter.minimumExtendedMovementAmount)) {
|
|
391
390
|
//move assets to extended
|
|
392
391
|
try {
|
|
393
392
|
const { calls: extendedCalls } = await this.moveAssets(
|
|
@@ -404,7 +403,7 @@ export class VesuExtendedMultiplierStrategy<
|
|
|
404
403
|
logger.error(`Failed moving assets to extended: ${err}`);
|
|
405
404
|
}
|
|
406
405
|
}
|
|
407
|
-
if (vesuAmount.minus(usdcAmountInWallet).greaterThan(
|
|
406
|
+
if (vesuAmount.minus(usdcAmountInWallet).greaterThan(vesuAdapter.minimumVesuMovementAmount)) {
|
|
408
407
|
//move assets to vesu
|
|
409
408
|
try {
|
|
410
409
|
const { calls: vesuCalls, status: vesuStatus } = await this.moveAssets(
|
|
@@ -913,6 +912,9 @@ function getLooperSettings(
|
|
|
913
912
|
extendedBackendUrl: string,
|
|
914
913
|
extendedApiKey: string,
|
|
915
914
|
vaultIdExtended: number,
|
|
915
|
+
minimumExtendedMovementAmount: number,
|
|
916
|
+
minimumVesuMovementAmount: number,
|
|
917
|
+
minimumExtendedRetriesDelayForOrderStatus: number,
|
|
916
918
|
) {
|
|
917
919
|
vaultSettings.leafAdapters = [];
|
|
918
920
|
|
|
@@ -958,6 +960,8 @@ function getLooperSettings(
|
|
|
958
960
|
extendedMarketName: "BTC-USD",
|
|
959
961
|
extendedPrecision: 5,
|
|
960
962
|
avnuAdapter: avnuAdapter,
|
|
963
|
+
retryDelayForOrderStatus: minimumExtendedRetriesDelayForOrderStatus ?? 3000,
|
|
964
|
+
minimumExtendedMovementAmount: minimumExtendedMovementAmount ?? 5, //5 usdcs
|
|
961
965
|
});
|
|
962
966
|
|
|
963
967
|
const vesuMultiplyAdapter = new VesuMultiplyAdapter({
|
|
@@ -972,6 +976,7 @@ function getLooperSettings(
|
|
|
972
976
|
{ asset: wbtcToken, isDebt: false },
|
|
973
977
|
{ asset: usdcToken, isDebt: true },
|
|
974
978
|
],
|
|
979
|
+
minimumVesuMovementAmount: minimumVesuMovementAmount ?? 5, //5 usdc
|
|
975
980
|
});
|
|
976
981
|
|
|
977
982
|
const unusedBalanceAdapter = new UnusedBalanceAdapter({
|
|
@@ -1105,15 +1110,15 @@ const re7UsdcPrimeDevansh: VesuExtendedStrategySettings = {
|
|
|
1105
1110
|
minimumWBTCDifferenceForAvnuSwap: MINIMUM_WBTC_DIFFERENCE_FOR_AVNU_SWAP,
|
|
1106
1111
|
}
|
|
1107
1112
|
|
|
1108
|
-
export const VesuExtendedTestStrategies = (extendedBackendUrl: string, extendedApiKey: string, vaultIdExtended: number): IStrategyMetadata<VesuExtendedStrategySettings>[] => {
|
|
1113
|
+
export const VesuExtendedTestStrategies = (extendedBackendUrl: string, extendedApiKey: string, vaultIdExtended: number, minimumExtendedMovementAmount: number, minimumVesuMovementAmount: number, minimumExtendedRetriesDelayForOrderStatus: number): IStrategyMetadata<VesuExtendedStrategySettings>[] => {
|
|
1109
1114
|
return [
|
|
1110
|
-
getStrategySettingsVesuExtended('WBTC', 'USDC', re7UsdcPrimeDevansh, false, false, extendedBackendUrl, extendedApiKey, vaultIdExtended),
|
|
1115
|
+
getStrategySettingsVesuExtended('WBTC', 'USDC', re7UsdcPrimeDevansh, false, false, extendedBackendUrl, extendedApiKey, vaultIdExtended, minimumExtendedMovementAmount, minimumVesuMovementAmount, minimumExtendedRetriesDelayForOrderStatus),
|
|
1111
1116
|
]
|
|
1112
1117
|
}
|
|
1113
1118
|
|
|
1114
1119
|
|
|
1115
1120
|
|
|
1116
|
-
function getStrategySettingsVesuExtended(lstSymbol: string, underlyingSymbol: string, addresses: VesuExtendedStrategySettings, isPreview: boolean = false, isLST: boolean, extendedBackendUrl: string, extendedApiKey: string, vaultIdExtended: number): IStrategyMetadata<VesuExtendedStrategySettings> {
|
|
1121
|
+
function getStrategySettingsVesuExtended(lstSymbol: string, underlyingSymbol: string, addresses: VesuExtendedStrategySettings, isPreview: boolean = false, isLST: boolean, extendedBackendUrl: string, extendedApiKey: string, vaultIdExtended: number, minimumExtendedMovementAmount: number, minimumVesuMovementAmount: number, minimumExtendedRetriesDelayForOrderStatus: number): IStrategyMetadata<VesuExtendedStrategySettings> {
|
|
1117
1122
|
return {
|
|
1118
1123
|
name: `Extended Test ${underlyingSymbol}`,
|
|
1119
1124
|
description: getDescription(lstSymbol, underlyingSymbol),
|
|
@@ -1121,7 +1126,7 @@ function getStrategySettingsVesuExtended(lstSymbol: string, underlyingSymbol: st
|
|
|
1121
1126
|
launchBlock: 0,
|
|
1122
1127
|
type: 'Other',
|
|
1123
1128
|
depositTokens: [Global.getDefaultTokens().find(token => token.symbol === underlyingSymbol)!],
|
|
1124
|
-
additionalInfo: getLooperSettings(lstSymbol, underlyingSymbol, addresses, VesuPools.Re7USDCPrime, extendedBackendUrl, extendedApiKey, vaultIdExtended),
|
|
1129
|
+
additionalInfo: getLooperSettings(lstSymbol, underlyingSymbol, addresses, VesuPools.Re7USDCPrime, extendedBackendUrl, extendedApiKey, vaultIdExtended, minimumExtendedMovementAmount, minimumVesuMovementAmount, minimumExtendedRetriesDelayForOrderStatus),
|
|
1125
1130
|
risk: {
|
|
1126
1131
|
riskFactor: _riskFactor,
|
|
1127
1132
|
netRisk:
|