@strkfarm/sdk 2.0.0-dev.6 → 2.0.0-dev.8
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 +438 -111
- package/dist/index.browser.mjs +438 -111
- package/dist/index.d.ts +7 -1
- package/dist/index.js +438 -111
- package/dist/index.mjs +438 -111
- package/package.json +1 -1
- package/src/strategies/universal-adapters/avnu-adapter.ts +2 -3
- package/src/strategies/universal-adapters/extended-adapter.ts +221 -61
- 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 +297 -58
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) {
|
|
@@ -29927,8 +29930,47 @@ var ExtendedAdapter = class _ExtendedAdapter extends BaseAdapter {
|
|
|
29927
29930
|
async withdrawFromExtended(amount) {
|
|
29928
29931
|
try {
|
|
29929
29932
|
if (!this.client) {
|
|
29930
|
-
|
|
29933
|
+
logger.error("Client not initialized");
|
|
29934
|
+
return false;
|
|
29935
|
+
}
|
|
29936
|
+
if (amount.lessThanOrEqualTo(0)) {
|
|
29937
|
+
logger.error(
|
|
29938
|
+
`Invalid withdrawal amount: ${amount.toNumber()}. Amount must be positive.`
|
|
29939
|
+
);
|
|
29940
|
+
return false;
|
|
29941
|
+
}
|
|
29942
|
+
if (amount.lessThanOrEqualTo(this.minimumExtendedMovementAmount)) {
|
|
29943
|
+
logger.warn(
|
|
29944
|
+
`Withdrawal amount ${amount.toNumber()} is below minimum Extended movement amount ${this.minimumExtendedMovementAmount}. Skipping withdrawal.`
|
|
29945
|
+
);
|
|
29946
|
+
return false;
|
|
29947
|
+
}
|
|
29948
|
+
const holdings = await this.getExtendedDepositAmount();
|
|
29949
|
+
if (!holdings) {
|
|
29950
|
+
logger.error(
|
|
29951
|
+
"Cannot get holdings - unable to validate withdrawal amount"
|
|
29952
|
+
);
|
|
29953
|
+
return false;
|
|
29954
|
+
}
|
|
29955
|
+
const availableForWithdrawal = parseFloat(
|
|
29956
|
+
holdings.availableForWithdrawal
|
|
29957
|
+
);
|
|
29958
|
+
if (!Number.isFinite(availableForWithdrawal) || availableForWithdrawal < 0) {
|
|
29959
|
+
logger.error(
|
|
29960
|
+
`Invalid availableForWithdrawal: ${holdings.availableForWithdrawal}. Expected a finite, non-negative number.`
|
|
29961
|
+
);
|
|
29962
|
+
return false;
|
|
29963
|
+
}
|
|
29964
|
+
const withdrawalAmount = amount.toNumber();
|
|
29965
|
+
if (withdrawalAmount > availableForWithdrawal) {
|
|
29966
|
+
logger.error(
|
|
29967
|
+
`Withdrawal amount ${withdrawalAmount} exceeds available balance ${availableForWithdrawal}`
|
|
29968
|
+
);
|
|
29969
|
+
return false;
|
|
29931
29970
|
}
|
|
29971
|
+
logger.info(
|
|
29972
|
+
`Withdrawing ${withdrawalAmount} from Extended. Available balance: ${availableForWithdrawal}`
|
|
29973
|
+
);
|
|
29932
29974
|
const withdrawalRequest = await this.client.withdrawUSDC(
|
|
29933
29975
|
amount.toFixed(2)
|
|
29934
29976
|
);
|
|
@@ -29939,6 +29981,9 @@ var ExtendedAdapter = class _ExtendedAdapter extends BaseAdapter {
|
|
|
29939
29981
|
);
|
|
29940
29982
|
return withdrawalStatus;
|
|
29941
29983
|
}
|
|
29984
|
+
logger.error(
|
|
29985
|
+
`Withdrawal request failed with status: ${withdrawalRequest.status}`
|
|
29986
|
+
);
|
|
29942
29987
|
return false;
|
|
29943
29988
|
} catch (error) {
|
|
29944
29989
|
logger.error(`Error creating Withdraw Call: ${error}`);
|
|
@@ -29949,21 +29994,44 @@ var ExtendedAdapter = class _ExtendedAdapter extends BaseAdapter {
|
|
|
29949
29994
|
return Promise.resolve(1);
|
|
29950
29995
|
}
|
|
29951
29996
|
async getExtendedDepositAmount() {
|
|
29952
|
-
|
|
29953
|
-
|
|
29954
|
-
|
|
29955
|
-
|
|
29956
|
-
|
|
29957
|
-
|
|
29958
|
-
|
|
29959
|
-
|
|
29960
|
-
|
|
29961
|
-
|
|
29962
|
-
|
|
29963
|
-
|
|
29997
|
+
try {
|
|
29998
|
+
if (this.client === null) {
|
|
29999
|
+
logger.error("error initializing client - client is null");
|
|
30000
|
+
return void 0;
|
|
30001
|
+
}
|
|
30002
|
+
const result = await this.client.getHoldings();
|
|
30003
|
+
if (!result) {
|
|
30004
|
+
logger.error("error getting holdings - API returned null/undefined");
|
|
30005
|
+
return void 0;
|
|
30006
|
+
}
|
|
30007
|
+
if (result.status && result.status !== "OK") {
|
|
30008
|
+
logger.error(
|
|
30009
|
+
`error getting holdings - API returned status: ${result.status}`
|
|
30010
|
+
);
|
|
30011
|
+
return void 0;
|
|
30012
|
+
}
|
|
30013
|
+
const holdings = result.data;
|
|
30014
|
+
if (!holdings) {
|
|
30015
|
+
logger.warn(
|
|
30016
|
+
"holdings data is null/undefined - treating as zero balance"
|
|
30017
|
+
);
|
|
30018
|
+
return {
|
|
30019
|
+
collateral_name: "",
|
|
30020
|
+
balance: "0",
|
|
30021
|
+
equity: "0",
|
|
30022
|
+
availableForTrade: "0",
|
|
30023
|
+
availableForWithdrawal: "0",
|
|
30024
|
+
unrealisedPnl: "0",
|
|
30025
|
+
initialMargin: "0",
|
|
30026
|
+
marginRatio: "0",
|
|
30027
|
+
updatedTime: Date.now()
|
|
30028
|
+
};
|
|
30029
|
+
}
|
|
30030
|
+
return holdings;
|
|
30031
|
+
} catch (error) {
|
|
30032
|
+
logger.error(`error getting holdings - exception: ${error}`);
|
|
29964
30033
|
return void 0;
|
|
29965
30034
|
}
|
|
29966
|
-
return holdings;
|
|
29967
30035
|
}
|
|
29968
30036
|
async setLeverage(leverage, marketName) {
|
|
29969
30037
|
if (this.client === null) {
|
|
@@ -30005,38 +30073,24 @@ var ExtendedAdapter = class _ExtendedAdapter extends BaseAdapter {
|
|
|
30005
30073
|
return result.data;
|
|
30006
30074
|
}
|
|
30007
30075
|
async getOrderStatus(orderId, marketName) {
|
|
30008
|
-
|
|
30009
|
-
|
|
30010
|
-
|
|
30011
|
-
|
|
30012
|
-
let orderhistory = await this.getOrderHistory(marketName);
|
|
30013
|
-
if (!orderhistory || orderhistory.length === 0) {
|
|
30014
|
-
logger.error(`error getting order history: ${orderId}`);
|
|
30015
|
-
} else {
|
|
30016
|
-
const order = orderhistory.slice(0, 5).find((order2) => order2.id.toString() === orderId);
|
|
30017
|
-
if (order) {
|
|
30018
|
-
return order;
|
|
30076
|
+
try {
|
|
30077
|
+
if (this.client === null) {
|
|
30078
|
+
logger.error("error initializing client");
|
|
30079
|
+
return null;
|
|
30019
30080
|
}
|
|
30020
|
-
|
|
30021
|
-
for (let attempt = 1; attempt <= 3; attempt++) {
|
|
30022
|
-
await new Promise((resolve) => setTimeout(resolve, 3e3));
|
|
30023
|
-
orderhistory = await this.getOrderHistory(marketName);
|
|
30081
|
+
const orderhistory = await this.getOrderHistory(marketName);
|
|
30024
30082
|
if (!orderhistory || orderhistory.length === 0) {
|
|
30025
|
-
|
|
30026
|
-
`error getting order history on retry ${attempt}: ${orderId}`
|
|
30027
|
-
);
|
|
30028
|
-
continue;
|
|
30083
|
+
return null;
|
|
30029
30084
|
}
|
|
30030
|
-
const order = orderhistory.slice(0,
|
|
30085
|
+
const order = orderhistory.slice(0, 20).find((order2) => order2.id.toString() === orderId);
|
|
30031
30086
|
if (order) {
|
|
30032
30087
|
return order;
|
|
30033
30088
|
}
|
|
30034
|
-
|
|
30035
|
-
|
|
30036
|
-
);
|
|
30089
|
+
return null;
|
|
30090
|
+
} catch (error) {
|
|
30091
|
+
logger.error(`error getting order status: ${error}`);
|
|
30092
|
+
return null;
|
|
30037
30093
|
}
|
|
30038
|
-
logger.error(`error getting order after all retries: ${orderId}`);
|
|
30039
|
-
return null;
|
|
30040
30094
|
}
|
|
30041
30095
|
async fetchOrderBookBTCUSDC() {
|
|
30042
30096
|
try {
|
|
@@ -30087,14 +30141,40 @@ var ExtendedAdapter = class _ExtendedAdapter extends BaseAdapter {
|
|
|
30087
30141
|
logger.error("error depositing or setting leverage");
|
|
30088
30142
|
return null;
|
|
30089
30143
|
}
|
|
30090
|
-
const
|
|
30091
|
-
if (
|
|
30144
|
+
const { ask, bid } = await this.fetchOrderBookBTCUSDC();
|
|
30145
|
+
if (!ask || !bid || ask.lessThanOrEqualTo(0) || bid.lessThanOrEqualTo(0)) {
|
|
30146
|
+
logger.error(
|
|
30147
|
+
`Invalid orderbook prices: ask=${ask?.toNumber()}, bid=${bid?.toNumber()}`
|
|
30148
|
+
);
|
|
30092
30149
|
return null;
|
|
30093
30150
|
}
|
|
30094
|
-
const { ask, bid } = await this.fetchOrderBookBTCUSDC();
|
|
30095
30151
|
const spread = ask.minus(bid);
|
|
30096
|
-
|
|
30097
|
-
|
|
30152
|
+
const midPrice = ask.plus(bid).div(2);
|
|
30153
|
+
const MAX_PRICE_DEVIATION_MULTIPLIER = 0.5;
|
|
30154
|
+
const priceAdjustmentMultiplier = Math.min(
|
|
30155
|
+
0.2 * attempt,
|
|
30156
|
+
MAX_PRICE_DEVIATION_MULTIPLIER
|
|
30157
|
+
);
|
|
30158
|
+
const priceAdjustment = spread.times(priceAdjustmentMultiplier);
|
|
30159
|
+
let price = midPrice;
|
|
30160
|
+
if (side === "SELL" /* SELL */) {
|
|
30161
|
+
price = midPrice.minus(priceAdjustment);
|
|
30162
|
+
} else {
|
|
30163
|
+
price = midPrice.plus(priceAdjustment);
|
|
30164
|
+
}
|
|
30165
|
+
const maxDeviation = midPrice.times(0.5);
|
|
30166
|
+
if (price.minus(midPrice).abs().greaterThan(maxDeviation)) {
|
|
30167
|
+
logger.error(
|
|
30168
|
+
`Price deviation too large on attempt ${attempt}: price=${price.toNumber()}, midPrice=${midPrice.toNumber()}, deviation=${price.minus(midPrice).abs().toNumber()}`
|
|
30169
|
+
);
|
|
30170
|
+
if (attempt >= maxAttempts) {
|
|
30171
|
+
return null;
|
|
30172
|
+
}
|
|
30173
|
+
price = side === "SELL" /* SELL */ ? midPrice.minus(maxDeviation) : midPrice.plus(maxDeviation);
|
|
30174
|
+
}
|
|
30175
|
+
logger.info(
|
|
30176
|
+
`createOrder attempt ${attempt}/${maxAttempts}: side=${side}, midPrice=${midPrice.toNumber()}, adjustedPrice=${price.toNumber()}, adjustment=${priceAdjustmentMultiplier * 100}%`
|
|
30177
|
+
);
|
|
30098
30178
|
const amount_in_token = (btcAmount * parseInt(leverage)).toFixed(
|
|
30099
30179
|
this.config.extendedPrecision
|
|
30100
30180
|
);
|
|
@@ -30105,17 +30185,57 @@ var ExtendedAdapter = class _ExtendedAdapter extends BaseAdapter {
|
|
|
30105
30185
|
price.toFixed(0),
|
|
30106
30186
|
side
|
|
30107
30187
|
);
|
|
30108
|
-
if (!result) {
|
|
30188
|
+
if (!result || !result.position_id) {
|
|
30189
|
+
logger.error("Failed to create order - no position_id returned");
|
|
30109
30190
|
return null;
|
|
30110
30191
|
}
|
|
30111
|
-
|
|
30112
|
-
|
|
30113
|
-
|
|
30192
|
+
const positionId = result.position_id;
|
|
30193
|
+
logger.info(
|
|
30194
|
+
`Order created with position_id: ${positionId}. Waiting for API to update...`
|
|
30195
|
+
);
|
|
30196
|
+
let openOrder = await this.getOrderStatus(
|
|
30197
|
+
positionId,
|
|
30114
30198
|
this.config.extendedMarketName
|
|
30115
30199
|
);
|
|
30116
|
-
|
|
30200
|
+
const maxStatusRetries = 3;
|
|
30201
|
+
const statusRetryDelay = 5e3;
|
|
30202
|
+
if (!openOrder) {
|
|
30203
|
+
logger.warn(
|
|
30204
|
+
`Order ${positionId} not found in API yet. Retrying status fetch (max ${maxStatusRetries} times)...`
|
|
30205
|
+
);
|
|
30206
|
+
for (let statusRetry = 1; statusRetry <= maxStatusRetries; statusRetry++) {
|
|
30207
|
+
await new Promise((resolve) => setTimeout(resolve, statusRetryDelay));
|
|
30208
|
+
openOrder = await this.getOrderStatus(
|
|
30209
|
+
positionId,
|
|
30210
|
+
this.config.extendedMarketName
|
|
30211
|
+
);
|
|
30212
|
+
if (openOrder) {
|
|
30213
|
+
logger.info(
|
|
30214
|
+
`Order ${positionId} found after ${statusRetry} status retry(ies)`
|
|
30215
|
+
);
|
|
30216
|
+
break;
|
|
30217
|
+
}
|
|
30218
|
+
logger.warn(
|
|
30219
|
+
`Order ${positionId} still not found after ${statusRetry}/${maxStatusRetries} status retries`
|
|
30220
|
+
);
|
|
30221
|
+
}
|
|
30222
|
+
}
|
|
30223
|
+
if (openOrder && openOrder.status === "FILLED" /* FILLED */) {
|
|
30224
|
+
logger.info(
|
|
30225
|
+
`Order ${positionId} successfully filled with quantity ${openOrder.qty}`
|
|
30226
|
+
);
|
|
30227
|
+
return {
|
|
30228
|
+
position_id: positionId,
|
|
30229
|
+
btc_exposure: openOrder.qty
|
|
30230
|
+
};
|
|
30231
|
+
} else if (openOrder && openOrder.status !== "FILLED" /* FILLED */) {
|
|
30232
|
+
logger.warn(
|
|
30233
|
+
`Order ${positionId} found but status is ${openOrder.status}, not FILLED. Retrying order creation...`
|
|
30234
|
+
);
|
|
30117
30235
|
if (attempt >= maxAttempts) {
|
|
30118
|
-
logger.error(
|
|
30236
|
+
logger.error(
|
|
30237
|
+
`Max retries reached \u2014 order ${positionId} status is ${openOrder.status}, not FILLED`
|
|
30238
|
+
);
|
|
30119
30239
|
return null;
|
|
30120
30240
|
} else {
|
|
30121
30241
|
const backoff = 2e3 * attempt;
|
|
@@ -30129,9 +30249,12 @@ var ExtendedAdapter = class _ExtendedAdapter extends BaseAdapter {
|
|
|
30129
30249
|
);
|
|
30130
30250
|
}
|
|
30131
30251
|
} else {
|
|
30252
|
+
logger.warn(
|
|
30253
|
+
`Order ${positionId} not found in API after ${maxStatusRetries} status retries (API update delayed ~30s). We got position_id from creation, so order exists. Returning position_id - status will be checked in next loop iteration.`
|
|
30254
|
+
);
|
|
30132
30255
|
return {
|
|
30133
|
-
position_id:
|
|
30134
|
-
btc_exposure:
|
|
30256
|
+
position_id: positionId,
|
|
30257
|
+
btc_exposure: amount_in_token
|
|
30135
30258
|
};
|
|
30136
30259
|
}
|
|
30137
30260
|
} catch (err) {
|
|
@@ -33467,7 +33590,8 @@ function getLooperSettings(lstSymbol, underlyingSymbol, vaultSettings, pool1) {
|
|
|
33467
33590
|
minHealthFactor: vaultSettings.minHealthFactor,
|
|
33468
33591
|
quoteAmountToFetchPrice: vaultSettings.quoteAmountToFetchPrice,
|
|
33469
33592
|
...baseAdapterConfig,
|
|
33470
|
-
supportedPositions: [{ asset: lstToken, isDebt: false }, { asset: Global.getDefaultTokens().find((token) => token.symbol === position), isDebt: true }]
|
|
33593
|
+
supportedPositions: [{ asset: lstToken, isDebt: false }, { asset: Global.getDefaultTokens().find((token) => token.symbol === position), isDebt: true }],
|
|
33594
|
+
minimumVesuMovementAmount: 0
|
|
33471
33595
|
}));
|
|
33472
33596
|
const unusedBalanceAdapter = new UnusedBalanceAdapter({
|
|
33473
33597
|
...baseAdapterConfig
|
|
@@ -33810,7 +33934,6 @@ var AvnuAdapter = class _AvnuAdapter extends BaseAdapter {
|
|
|
33810
33934
|
toToken.decimals,
|
|
33811
33935
|
true
|
|
33812
33936
|
);
|
|
33813
|
-
console.log(`${_AvnuAdapter.name}::getDepositCall quote: ${quote?.sellAmountInUsd}`);
|
|
33814
33937
|
if (!quote) {
|
|
33815
33938
|
logger.error("error getting quote from avnu");
|
|
33816
33939
|
return [];
|
|
@@ -34151,11 +34274,41 @@ var VesuExtendedMultiplierStrategy = class _VesuExtendedMultiplierStrategy exten
|
|
|
34151
34274
|
}
|
|
34152
34275
|
async shouldInvest() {
|
|
34153
34276
|
try {
|
|
34277
|
+
logger.info(`${_VesuExtendedMultiplierStrategy.name}::shouldInvest starting`);
|
|
34154
34278
|
const vesuAdapter = await this.getVesuAdapter();
|
|
34155
34279
|
const extendedAdapter = await this.getExtendedAdapter();
|
|
34156
|
-
|
|
34280
|
+
logger.info(`${_VesuExtendedMultiplierStrategy.name}::shouldInvest adapters fetched: vesuAdapter=${!!vesuAdapter}, extendedAdapter=${!!extendedAdapter}, extendedAdapter.client=${!!extendedAdapter?.client}`);
|
|
34281
|
+
if (!vesuAdapter) {
|
|
34157
34282
|
logger.error(
|
|
34158
|
-
`
|
|
34283
|
+
`Vesu adapter not configured in metadata. This is a configuration issue, not a temporary failure.`
|
|
34284
|
+
);
|
|
34285
|
+
return {
|
|
34286
|
+
shouldInvest: false,
|
|
34287
|
+
vesuAmount: new Web3Number(0, 0),
|
|
34288
|
+
extendedAmount: new Web3Number(0, 0),
|
|
34289
|
+
extendedLeverage: 0,
|
|
34290
|
+
collateralPrice: 0,
|
|
34291
|
+
debtPrice: 0,
|
|
34292
|
+
vesuLeverage: 0
|
|
34293
|
+
};
|
|
34294
|
+
}
|
|
34295
|
+
if (!extendedAdapter) {
|
|
34296
|
+
logger.error(
|
|
34297
|
+
`Extended adapter not configured in metadata. This is a configuration issue, not a temporary failure.`
|
|
34298
|
+
);
|
|
34299
|
+
return {
|
|
34300
|
+
shouldInvest: false,
|
|
34301
|
+
vesuAmount: new Web3Number(0, 0),
|
|
34302
|
+
extendedAmount: new Web3Number(0, 0),
|
|
34303
|
+
extendedLeverage: 0,
|
|
34304
|
+
collateralPrice: 0,
|
|
34305
|
+
debtPrice: 0,
|
|
34306
|
+
vesuLeverage: 0
|
|
34307
|
+
};
|
|
34308
|
+
}
|
|
34309
|
+
if (!extendedAdapter.client) {
|
|
34310
|
+
logger.error(
|
|
34311
|
+
`Extended adapter client not initialized. This may be a temporary initialization failure - check network connectivity and API availability.`
|
|
34159
34312
|
);
|
|
34160
34313
|
return {
|
|
34161
34314
|
shouldInvest: false,
|
|
@@ -34167,10 +34320,58 @@ var VesuExtendedMultiplierStrategy = class _VesuExtendedMultiplierStrategy exten
|
|
|
34167
34320
|
vesuLeverage: 0
|
|
34168
34321
|
};
|
|
34169
34322
|
}
|
|
34323
|
+
logger.info(`${_VesuExtendedMultiplierStrategy.name}::shouldInvest calling getUnusedBalance`);
|
|
34170
34324
|
const balance = await this.getUnusedBalance();
|
|
34325
|
+
if (!Number.isFinite(balance.usdValue) || balance.usdValue < 0) {
|
|
34326
|
+
logger.error(
|
|
34327
|
+
`Invalid balance.usdValue: ${balance.usdValue}. Expected a finite, non-negative number.`
|
|
34328
|
+
);
|
|
34329
|
+
return {
|
|
34330
|
+
shouldInvest: false,
|
|
34331
|
+
vesuAmount: new Web3Number(0, 0),
|
|
34332
|
+
extendedAmount: new Web3Number(0, 0),
|
|
34333
|
+
extendedLeverage: 0,
|
|
34334
|
+
collateralPrice: 0,
|
|
34335
|
+
debtPrice: 0,
|
|
34336
|
+
vesuLeverage: 0
|
|
34337
|
+
};
|
|
34338
|
+
}
|
|
34339
|
+
logger.info(`${_VesuExtendedMultiplierStrategy.name}::shouldInvest balance: ${balance.usdValue}`);
|
|
34171
34340
|
const usdcBalanceOnExtended = await extendedAdapter.getExtendedDepositAmount();
|
|
34172
|
-
|
|
34173
|
-
|
|
34341
|
+
if (usdcBalanceOnExtended) {
|
|
34342
|
+
const availableForWithdrawal = parseFloat(usdcBalanceOnExtended.availableForWithdrawal);
|
|
34343
|
+
if (!Number.isFinite(availableForWithdrawal) || availableForWithdrawal < 0) {
|
|
34344
|
+
logger.error(
|
|
34345
|
+
`Invalid usdcBalanceOnExtended.availableForWithdrawal: ${usdcBalanceOnExtended.availableForWithdrawal}. Expected a finite, non-negative number.`
|
|
34346
|
+
);
|
|
34347
|
+
return {
|
|
34348
|
+
shouldInvest: false,
|
|
34349
|
+
vesuAmount: new Web3Number(0, 0),
|
|
34350
|
+
extendedAmount: new Web3Number(0, 0),
|
|
34351
|
+
extendedLeverage: 0,
|
|
34352
|
+
collateralPrice: 0,
|
|
34353
|
+
debtPrice: 0,
|
|
34354
|
+
vesuLeverage: 0
|
|
34355
|
+
};
|
|
34356
|
+
}
|
|
34357
|
+
}
|
|
34358
|
+
const amountToInvest = new Web3Number(balance.usdValue, USDC_TOKEN_DECIMALS).plus(usdcBalanceOnExtended?.availableForWithdrawal ?? 0).multipliedBy(1 - LIMIT_BALANCE);
|
|
34359
|
+
const amountToInvestNumber = amountToInvest.toNumber();
|
|
34360
|
+
if (!Number.isFinite(amountToInvestNumber)) {
|
|
34361
|
+
logger.error(
|
|
34362
|
+
`Invalid amountToInvest calculation result: ${amountToInvestNumber}. Calculation may have produced NaN or Infinity.`
|
|
34363
|
+
);
|
|
34364
|
+
return {
|
|
34365
|
+
shouldInvest: false,
|
|
34366
|
+
vesuAmount: new Web3Number(0, 0),
|
|
34367
|
+
extendedAmount: new Web3Number(0, 0),
|
|
34368
|
+
extendedLeverage: 0,
|
|
34369
|
+
collateralPrice: 0,
|
|
34370
|
+
debtPrice: 0,
|
|
34371
|
+
vesuLeverage: 0
|
|
34372
|
+
};
|
|
34373
|
+
}
|
|
34374
|
+
logger.info(`${_VesuExtendedMultiplierStrategy.name}::shouldInvest amountToInvest: ${amountToInvestNumber}`);
|
|
34174
34375
|
if (amountToInvest.lessThan(0)) {
|
|
34175
34376
|
return {
|
|
34176
34377
|
shouldInvest: false,
|
|
@@ -34200,6 +34401,34 @@ var VesuExtendedMultiplierStrategy = class _VesuExtendedMultiplierStrategy exten
|
|
|
34200
34401
|
collateralPrice,
|
|
34201
34402
|
debtPrice
|
|
34202
34403
|
} = await this.getAssetPrices();
|
|
34404
|
+
if (!Number.isFinite(collateralPrice.price) || collateralPrice.price <= 0) {
|
|
34405
|
+
logger.error(
|
|
34406
|
+
`Invalid collateralPrice: ${collateralPrice.price}. Expected a finite, positive number.`
|
|
34407
|
+
);
|
|
34408
|
+
return {
|
|
34409
|
+
shouldInvest: false,
|
|
34410
|
+
vesuAmount: new Web3Number(0, 0),
|
|
34411
|
+
extendedAmount: new Web3Number(0, 0),
|
|
34412
|
+
extendedLeverage: 0,
|
|
34413
|
+
collateralPrice: 0,
|
|
34414
|
+
debtPrice: 0,
|
|
34415
|
+
vesuLeverage: 0
|
|
34416
|
+
};
|
|
34417
|
+
}
|
|
34418
|
+
if (!Number.isFinite(debtPrice.price) || debtPrice.price <= 0) {
|
|
34419
|
+
logger.error(
|
|
34420
|
+
`Invalid debtPrice: ${debtPrice.price}. Expected a finite, positive number.`
|
|
34421
|
+
);
|
|
34422
|
+
return {
|
|
34423
|
+
shouldInvest: false,
|
|
34424
|
+
vesuAmount: new Web3Number(0, 0),
|
|
34425
|
+
extendedAmount: new Web3Number(0, 0),
|
|
34426
|
+
extendedLeverage: 0,
|
|
34427
|
+
collateralPrice: 0,
|
|
34428
|
+
debtPrice: 0,
|
|
34429
|
+
vesuLeverage: 0
|
|
34430
|
+
};
|
|
34431
|
+
}
|
|
34203
34432
|
const { vesu_amount, extended_amount, extended_leverage, vesu_leverage } = await calculateAmountDistribution(
|
|
34204
34433
|
amountToInvest.toNumber(),
|
|
34205
34434
|
extendedAdapter.client,
|
|
@@ -34250,14 +34479,46 @@ var VesuExtendedMultiplierStrategy = class _VesuExtendedMultiplierStrategy exten
|
|
|
34250
34479
|
try {
|
|
34251
34480
|
const vesuAdapter = await this.getVesuAdapter();
|
|
34252
34481
|
const extendedAdapter = await this.getExtendedAdapter();
|
|
34253
|
-
let calls = [];
|
|
34254
34482
|
if (!vesuAdapter || !extendedAdapter || !extendedAdapter.client) {
|
|
34255
34483
|
logger.error(
|
|
34256
34484
|
`vesu or extended adapter not found: vesuAdapter=${vesuAdapter}, extendedAdapter=${extendedAdapter}`
|
|
34257
34485
|
);
|
|
34258
|
-
return
|
|
34486
|
+
return [];
|
|
34487
|
+
}
|
|
34488
|
+
const extendedHoldings = await extendedAdapter.getExtendedDepositAmount();
|
|
34489
|
+
if (!extendedHoldings) {
|
|
34490
|
+
logger.error(`error getting extended holdings: ${extendedHoldings}`);
|
|
34491
|
+
return [];
|
|
34259
34492
|
}
|
|
34260
|
-
|
|
34493
|
+
const usdcAmountInWallet = (await this.getUnusedBalance()).amount;
|
|
34494
|
+
const usdcAmountOnExtendedAvailableForWithdrawal = parseFloat(
|
|
34495
|
+
extendedHoldings.availableForWithdrawal
|
|
34496
|
+
);
|
|
34497
|
+
logger.info(`${_VesuExtendedMultiplierStrategy.name}::shouldMoveAssets calculating movements - Extended current: ${usdcAmountOnExtendedAvailableForWithdrawal}, Wallet: ${usdcAmountInWallet.toNumber()}, Target Extended: ${extendedAmount.toNumber()}, Target Vesu: ${vesuAmount.toNumber()}`);
|
|
34498
|
+
let totalExtendedWithdrawal = new Web3Number(0, USDC_TOKEN_DECIMALS);
|
|
34499
|
+
let totalExtendedDeposit = new Web3Number(0, USDC_TOKEN_DECIMALS);
|
|
34500
|
+
if (extendedAmount.isNegative() && extendedAmount.abs().greaterThan(extendedAdapter.minimumExtendedMovementAmount)) {
|
|
34501
|
+
totalExtendedWithdrawal = totalExtendedWithdrawal.plus(extendedAmount.abs());
|
|
34502
|
+
}
|
|
34503
|
+
const extendedTargetAmount = extendedAmount.abs();
|
|
34504
|
+
let projectedExtendedBalance = usdcAmountOnExtendedAvailableForWithdrawal;
|
|
34505
|
+
if (extendedAmount.isNegative()) {
|
|
34506
|
+
projectedExtendedBalance = projectedExtendedBalance - extendedAmount.abs().toNumber();
|
|
34507
|
+
}
|
|
34508
|
+
const extendedAmountDifference = extendedTargetAmount.minus(projectedExtendedBalance);
|
|
34509
|
+
const extendedAmountDifferenceAbs = extendedAmountDifference.abs();
|
|
34510
|
+
if (extendedAmountDifference.lessThan(0)) {
|
|
34511
|
+
totalExtendedWithdrawal = totalExtendedWithdrawal.plus(extendedAmountDifferenceAbs);
|
|
34512
|
+
} else if (extendedAmountDifference.greaterThan(0)) {
|
|
34513
|
+
totalExtendedDeposit = totalExtendedDeposit.plus(extendedAmountDifference);
|
|
34514
|
+
}
|
|
34515
|
+
const vesuTargetAmount = vesuAmount.abs();
|
|
34516
|
+
const projectedWalletBalance = usdcAmountInWallet.plus(totalExtendedWithdrawal).minus(totalExtendedDeposit);
|
|
34517
|
+
let vesuAmountDifference = vesuTargetAmount.minus(projectedWalletBalance);
|
|
34518
|
+
const vesuAmountDifferenceAbs = vesuAmountDifference.abs();
|
|
34519
|
+
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()}`);
|
|
34520
|
+
let calls = [];
|
|
34521
|
+
if (extendedAmount.isNegative() && extendedAmount.abs().greaterThan(extendedAdapter.minimumExtendedMovementAmount)) {
|
|
34261
34522
|
try {
|
|
34262
34523
|
const { calls: extendedCalls, status: extendedStatus } = await this.moveAssets(
|
|
34263
34524
|
{
|
|
@@ -34277,7 +34538,7 @@ var VesuExtendedMultiplierStrategy = class _VesuExtendedMultiplierStrategy exten
|
|
|
34277
34538
|
logger.error(`Failed moving assets to vault: ${err}`);
|
|
34278
34539
|
}
|
|
34279
34540
|
}
|
|
34280
|
-
if (vesuAmount.
|
|
34541
|
+
if (vesuAmount.isNegative() && vesuAmount.abs().greaterThan(vesuAdapter.minimumVesuMovementAmount)) {
|
|
34281
34542
|
try {
|
|
34282
34543
|
const { calls: vesuCalls, status: vesuStatus } = await this.moveAssets(
|
|
34283
34544
|
{
|
|
@@ -34296,48 +34557,76 @@ var VesuExtendedMultiplierStrategy = class _VesuExtendedMultiplierStrategy exten
|
|
|
34296
34557
|
logger.error(`Failed moving assets to vault: ${err}`);
|
|
34297
34558
|
}
|
|
34298
34559
|
}
|
|
34299
|
-
|
|
34300
|
-
|
|
34301
|
-
|
|
34302
|
-
|
|
34303
|
-
|
|
34304
|
-
|
|
34305
|
-
|
|
34306
|
-
|
|
34307
|
-
|
|
34308
|
-
|
|
34309
|
-
|
|
34310
|
-
|
|
34311
|
-
{
|
|
34312
|
-
|
|
34313
|
-
|
|
34314
|
-
|
|
34315
|
-
|
|
34316
|
-
|
|
34317
|
-
|
|
34318
|
-
|
|
34319
|
-
|
|
34320
|
-
|
|
34321
|
-
|
|
34560
|
+
if (extendedAmountDifferenceAbs.greaterThan(extendedAdapter.minimumExtendedMovementAmount)) {
|
|
34561
|
+
if (extendedAmountDifference.greaterThan(0)) {
|
|
34562
|
+
try {
|
|
34563
|
+
const { calls: extendedCalls, status: extendedStatus } = await this.moveAssets(
|
|
34564
|
+
{
|
|
34565
|
+
to: Protocols.EXTENDED.name,
|
|
34566
|
+
from: Protocols.VAULT.name,
|
|
34567
|
+
amount: extendedAmountDifference
|
|
34568
|
+
},
|
|
34569
|
+
extendedAdapter,
|
|
34570
|
+
vesuAdapter
|
|
34571
|
+
);
|
|
34572
|
+
if (extendedStatus) {
|
|
34573
|
+
calls.push(...extendedCalls);
|
|
34574
|
+
} else {
|
|
34575
|
+
logger.error(`Failed to move assets to extended - operation returned false status`);
|
|
34576
|
+
return [];
|
|
34577
|
+
}
|
|
34578
|
+
} catch (err) {
|
|
34579
|
+
logger.error(`Failed moving assets to extended: ${err}`);
|
|
34580
|
+
return [];
|
|
34581
|
+
}
|
|
34582
|
+
} else if (extendedAmountDifference.lessThan(0)) {
|
|
34583
|
+
try {
|
|
34584
|
+
const { calls: extendedCalls, status: extendedStatus } = await this.moveAssets(
|
|
34585
|
+
{
|
|
34586
|
+
to: Protocols.VAULT.name,
|
|
34587
|
+
from: Protocols.EXTENDED.name,
|
|
34588
|
+
amount: extendedAmountDifferenceAbs
|
|
34589
|
+
},
|
|
34590
|
+
extendedAdapter,
|
|
34591
|
+
vesuAdapter
|
|
34592
|
+
);
|
|
34593
|
+
if (extendedStatus) {
|
|
34594
|
+
calls.push(...extendedCalls);
|
|
34595
|
+
} else {
|
|
34596
|
+
logger.error(`Failed to withdraw from extended - operation returned false status`);
|
|
34597
|
+
return [];
|
|
34598
|
+
}
|
|
34599
|
+
} catch (err) {
|
|
34600
|
+
logger.error(`Failed moving assets from extended to vault: ${err}`);
|
|
34601
|
+
return [];
|
|
34602
|
+
}
|
|
34322
34603
|
}
|
|
34323
34604
|
}
|
|
34324
|
-
if (
|
|
34325
|
-
|
|
34326
|
-
|
|
34327
|
-
{
|
|
34328
|
-
to: Protocols.VAULT.name,
|
|
34329
|
-
from: Protocols.EXTENDED.name,
|
|
34330
|
-
amount: vesuAmount.minus(usdcAmountInWallet)
|
|
34331
|
-
},
|
|
34332
|
-
extendedAdapter,
|
|
34333
|
-
vesuAdapter
|
|
34605
|
+
if (vesuAmountDifferenceAbs.greaterThan(vesuAdapter.minimumVesuMovementAmount)) {
|
|
34606
|
+
if (vesuAmountDifference.lessThanOrEqualTo(0)) {
|
|
34607
|
+
logger.warn(
|
|
34608
|
+
`Vesu amount difference is negative or zero: ${vesuAmountDifference.toNumber()}. Skipping operation.`
|
|
34334
34609
|
);
|
|
34335
|
-
|
|
34610
|
+
} else {
|
|
34611
|
+
try {
|
|
34612
|
+
const { calls: vesuCalls, status: vesuStatus } = await this.moveAssets(
|
|
34613
|
+
{
|
|
34614
|
+
to: Protocols.VAULT.name,
|
|
34615
|
+
from: Protocols.EXTENDED.name,
|
|
34616
|
+
amount: vesuAmountDifference
|
|
34617
|
+
},
|
|
34618
|
+
extendedAdapter,
|
|
34619
|
+
vesuAdapter
|
|
34620
|
+
);
|
|
34621
|
+
if (!vesuStatus) {
|
|
34622
|
+
logger.error(`Failed to move assets to vesu - operation returned false status`);
|
|
34623
|
+
return [];
|
|
34624
|
+
}
|
|
34625
|
+
calls.push(...vesuCalls);
|
|
34626
|
+
} catch (err) {
|
|
34627
|
+
logger.error(`Failed moving assets to vault: ${err}`);
|
|
34336
34628
|
return [];
|
|
34337
34629
|
}
|
|
34338
|
-
calls.push(...vesuCalls);
|
|
34339
|
-
} catch (err) {
|
|
34340
|
-
logger.error(`Failed moving assets to vault: ${err}`);
|
|
34341
34630
|
}
|
|
34342
34631
|
}
|
|
34343
34632
|
return calls;
|
|
@@ -34348,6 +34637,38 @@ var VesuExtendedMultiplierStrategy = class _VesuExtendedMultiplierStrategy exten
|
|
|
34348
34637
|
}
|
|
34349
34638
|
async moveAssets(params, extendedAdapter, vesuAdapter) {
|
|
34350
34639
|
try {
|
|
34640
|
+
if (params.amount.lessThanOrEqualTo(0)) {
|
|
34641
|
+
logger.error(
|
|
34642
|
+
`Invalid amount for moveAssets: ${params.amount.toNumber()}. Amount must be positive.`
|
|
34643
|
+
);
|
|
34644
|
+
return {
|
|
34645
|
+
calls: [],
|
|
34646
|
+
status: false
|
|
34647
|
+
};
|
|
34648
|
+
}
|
|
34649
|
+
const amountAbs = params.amount.abs();
|
|
34650
|
+
if (params.from === Protocols.EXTENDED.name || params.to === Protocols.EXTENDED.name) {
|
|
34651
|
+
if (amountAbs.lessThanOrEqualTo(extendedAdapter.minimumExtendedMovementAmount)) {
|
|
34652
|
+
logger.warn(
|
|
34653
|
+
`Amount ${amountAbs.toNumber()} is below minimum Extended movement amount ${extendedAdapter.minimumExtendedMovementAmount}. Skipping operation.`
|
|
34654
|
+
);
|
|
34655
|
+
return {
|
|
34656
|
+
calls: [],
|
|
34657
|
+
status: false
|
|
34658
|
+
};
|
|
34659
|
+
}
|
|
34660
|
+
}
|
|
34661
|
+
if (params.from === Protocols.VESU.name || params.to === Protocols.VESU.name) {
|
|
34662
|
+
if (amountAbs.lessThanOrEqualTo(vesuAdapter.minimumVesuMovementAmount)) {
|
|
34663
|
+
logger.warn(
|
|
34664
|
+
`Amount ${amountAbs.toNumber()} is below minimum Vesu movement amount ${vesuAdapter.minimumVesuMovementAmount}. Skipping operation.`
|
|
34665
|
+
);
|
|
34666
|
+
return {
|
|
34667
|
+
calls: [],
|
|
34668
|
+
status: false
|
|
34669
|
+
};
|
|
34670
|
+
}
|
|
34671
|
+
}
|
|
34351
34672
|
const avnuAdapter = await this.getAvnuAdapter();
|
|
34352
34673
|
if (!avnuAdapter) {
|
|
34353
34674
|
logger.error(`avnu adapter not found: ${avnuAdapter}`);
|
|
@@ -34408,12 +34729,13 @@ var VesuExtendedMultiplierStrategy = class _VesuExtendedMultiplierStrategy exten
|
|
|
34408
34729
|
);
|
|
34409
34730
|
if (!openLongPosition) {
|
|
34410
34731
|
logger.error(`error opening long position: ${openLongPosition}`);
|
|
34411
|
-
return {
|
|
34412
|
-
calls: [],
|
|
34413
|
-
status: false
|
|
34414
|
-
};
|
|
34415
34732
|
}
|
|
34416
34733
|
await new Promise((resolve) => setTimeout(resolve, 5e3));
|
|
34734
|
+
const updatedHoldings = await extendedAdapter.getExtendedDepositAmount();
|
|
34735
|
+
if (!updatedHoldings || new Web3Number(updatedHoldings.availableForWithdrawal, USDC_TOKEN_DECIMALS).lessThan(params.amount.abs())) {
|
|
34736
|
+
logger.error(`Insufficient balance after opening position. Available: ${updatedHoldings?.availableForWithdrawal}, Needed: ${params.amount.abs()}`);
|
|
34737
|
+
return { calls: [], status: false };
|
|
34738
|
+
}
|
|
34417
34739
|
}
|
|
34418
34740
|
const withdrawalFromExtended = await extendedAdapter.withdrawFromExtended(params.amount);
|
|
34419
34741
|
if (withdrawalFromExtended) {
|
|
@@ -34786,7 +35108,7 @@ var VesuExtendedMultiplierStrategy = class _VesuExtendedMultiplierStrategy exten
|
|
|
34786
35108
|
};
|
|
34787
35109
|
}
|
|
34788
35110
|
};
|
|
34789
|
-
function getLooperSettings2(lstSymbol, underlyingSymbol, vaultSettings, pool1, extendedBackendUrl, extendedApiKey, vaultIdExtended) {
|
|
35111
|
+
function getLooperSettings2(lstSymbol, underlyingSymbol, vaultSettings, pool1, extendedBackendUrl, extendedApiKey, vaultIdExtended, minimumExtendedMovementAmount, minimumVesuMovementAmount, minimumExtendedRetriesDelayForOrderStatus) {
|
|
34790
35112
|
vaultSettings.leafAdapters = [];
|
|
34791
35113
|
const wbtcToken = Global.getDefaultTokens().find(
|
|
34792
35114
|
(token) => token.symbol === lstSymbol
|
|
@@ -34826,7 +35148,10 @@ function getLooperSettings2(lstSymbol, underlyingSymbol, vaultSettings, pool1, e
|
|
|
34826
35148
|
extendedBaseUrl: "https://api.starknet.extended.exchange",
|
|
34827
35149
|
extendedMarketName: "BTC-USD",
|
|
34828
35150
|
extendedPrecision: 5,
|
|
34829
|
-
avnuAdapter
|
|
35151
|
+
avnuAdapter,
|
|
35152
|
+
retryDelayForOrderStatus: minimumExtendedRetriesDelayForOrderStatus ?? 3e3,
|
|
35153
|
+
minimumExtendedMovementAmount: minimumExtendedMovementAmount ?? 5
|
|
35154
|
+
//5 usdcs
|
|
34830
35155
|
});
|
|
34831
35156
|
const vesuMultiplyAdapter = new VesuMultiplyAdapter({
|
|
34832
35157
|
poolId: pool1,
|
|
@@ -34839,7 +35164,9 @@ function getLooperSettings2(lstSymbol, underlyingSymbol, vaultSettings, pool1, e
|
|
|
34839
35164
|
supportedPositions: [
|
|
34840
35165
|
{ asset: wbtcToken, isDebt: false },
|
|
34841
35166
|
{ asset: usdcToken, isDebt: true }
|
|
34842
|
-
]
|
|
35167
|
+
],
|
|
35168
|
+
minimumVesuMovementAmount: minimumVesuMovementAmount ?? 5
|
|
35169
|
+
//5 usdc
|
|
34843
35170
|
});
|
|
34844
35171
|
const unusedBalanceAdapter = new UnusedBalanceAdapter({
|
|
34845
35172
|
...baseAdapterConfig
|
|
@@ -34954,12 +35281,12 @@ var re7UsdcPrimeDevansh = {
|
|
|
34954
35281
|
borrowable_assets: [Global.getDefaultTokens().find((token) => token.symbol === "WBTC")],
|
|
34955
35282
|
minimumWBTCDifferenceForAvnuSwap: MINIMUM_WBTC_DIFFERENCE_FOR_AVNU_SWAP
|
|
34956
35283
|
};
|
|
34957
|
-
var VesuExtendedTestStrategies = (extendedBackendUrl, extendedApiKey, vaultIdExtended) => {
|
|
35284
|
+
var VesuExtendedTestStrategies = (extendedBackendUrl, extendedApiKey, vaultIdExtended, minimumExtendedMovementAmount, minimumVesuMovementAmount, minimumExtendedRetriesDelayForOrderStatus) => {
|
|
34958
35285
|
return [
|
|
34959
|
-
getStrategySettingsVesuExtended("WBTC", "USDC", re7UsdcPrimeDevansh, false, false, extendedBackendUrl, extendedApiKey, vaultIdExtended)
|
|
35286
|
+
getStrategySettingsVesuExtended("WBTC", "USDC", re7UsdcPrimeDevansh, false, false, extendedBackendUrl, extendedApiKey, vaultIdExtended, minimumExtendedMovementAmount, minimumVesuMovementAmount, minimumExtendedRetriesDelayForOrderStatus)
|
|
34960
35287
|
];
|
|
34961
35288
|
};
|
|
34962
|
-
function getStrategySettingsVesuExtended(lstSymbol, underlyingSymbol, addresses, isPreview = false, isLST, extendedBackendUrl, extendedApiKey, vaultIdExtended) {
|
|
35289
|
+
function getStrategySettingsVesuExtended(lstSymbol, underlyingSymbol, addresses, isPreview = false, isLST, extendedBackendUrl, extendedApiKey, vaultIdExtended, minimumExtendedMovementAmount, minimumVesuMovementAmount, minimumExtendedRetriesDelayForOrderStatus) {
|
|
34963
35290
|
return {
|
|
34964
35291
|
name: `Extended Test ${underlyingSymbol}`,
|
|
34965
35292
|
description: getDescription2(lstSymbol, underlyingSymbol),
|
|
@@ -34967,7 +35294,7 @@ function getStrategySettingsVesuExtended(lstSymbol, underlyingSymbol, addresses,
|
|
|
34967
35294
|
launchBlock: 0,
|
|
34968
35295
|
type: "Other",
|
|
34969
35296
|
depositTokens: [Global.getDefaultTokens().find((token) => token.symbol === underlyingSymbol)],
|
|
34970
|
-
additionalInfo: getLooperSettings2(lstSymbol, underlyingSymbol, addresses, VesuPools.Re7USDCPrime, extendedBackendUrl, extendedApiKey, vaultIdExtended),
|
|
35297
|
+
additionalInfo: getLooperSettings2(lstSymbol, underlyingSymbol, addresses, VesuPools.Re7USDCPrime, extendedBackendUrl, extendedApiKey, vaultIdExtended, minimumExtendedMovementAmount, minimumVesuMovementAmount, minimumExtendedRetriesDelayForOrderStatus),
|
|
34971
35298
|
risk: {
|
|
34972
35299
|
riskFactor: _riskFactor3,
|
|
34973
35300
|
netRisk: _riskFactor3.reduce((acc, curr) => acc + curr.value * curr.weight, 0) / _riskFactor3.reduce((acc, curr) => acc + curr.weight, 0),
|