@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
|
@@ -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"
|
|
@@ -219,11 +218,42 @@ export class VesuExtendedMultiplierStrategy<
|
|
|
219
218
|
vesuLeverage: number;
|
|
220
219
|
}> {
|
|
221
220
|
try {
|
|
221
|
+
logger.info(`${VesuExtendedMultiplierStrategy.name}::shouldInvest starting`);
|
|
222
222
|
const vesuAdapter = await this.getVesuAdapter();
|
|
223
223
|
const extendedAdapter = await this.getExtendedAdapter();
|
|
224
|
-
|
|
224
|
+
logger.info(`${VesuExtendedMultiplierStrategy.name}::shouldInvest adapters fetched: vesuAdapter=${!!vesuAdapter}, extendedAdapter=${!!extendedAdapter}, extendedAdapter.client=${!!extendedAdapter?.client}`);
|
|
225
|
+
|
|
226
|
+
if (!vesuAdapter) {
|
|
225
227
|
logger.error(
|
|
226
|
-
`
|
|
228
|
+
`Vesu adapter not configured in metadata. This is a configuration issue, not a temporary failure.`
|
|
229
|
+
);
|
|
230
|
+
return {
|
|
231
|
+
shouldInvest: false,
|
|
232
|
+
vesuAmount: new Web3Number(0, 0),
|
|
233
|
+
extendedAmount: new Web3Number(0, 0),
|
|
234
|
+
extendedLeverage: 0,
|
|
235
|
+
collateralPrice: 0,
|
|
236
|
+
debtPrice: 0,
|
|
237
|
+
vesuLeverage: 0,
|
|
238
|
+
};
|
|
239
|
+
}
|
|
240
|
+
if (!extendedAdapter) {
|
|
241
|
+
logger.error(
|
|
242
|
+
`Extended adapter not configured in metadata. This is a configuration issue, not a temporary failure.`
|
|
243
|
+
);
|
|
244
|
+
return {
|
|
245
|
+
shouldInvest: false,
|
|
246
|
+
vesuAmount: new Web3Number(0, 0),
|
|
247
|
+
extendedAmount: new Web3Number(0, 0),
|
|
248
|
+
extendedLeverage: 0,
|
|
249
|
+
collateralPrice: 0,
|
|
250
|
+
debtPrice: 0,
|
|
251
|
+
vesuLeverage: 0,
|
|
252
|
+
};
|
|
253
|
+
}
|
|
254
|
+
if (!extendedAdapter.client) {
|
|
255
|
+
logger.error(
|
|
256
|
+
`Extended adapter client not initialized. This may be a temporary initialization failure - check network connectivity and API availability.`
|
|
227
257
|
);
|
|
228
258
|
return {
|
|
229
259
|
shouldInvest: false,
|
|
@@ -235,11 +265,65 @@ export class VesuExtendedMultiplierStrategy<
|
|
|
235
265
|
vesuLeverage: 0,
|
|
236
266
|
};
|
|
237
267
|
}
|
|
268
|
+
|
|
269
|
+
logger.info(`${VesuExtendedMultiplierStrategy.name}::shouldInvest calling getUnusedBalance`);
|
|
238
270
|
const balance = await this.getUnusedBalance();
|
|
271
|
+
|
|
272
|
+
if (!Number.isFinite(balance.usdValue) || balance.usdValue < 0) {
|
|
273
|
+
logger.error(
|
|
274
|
+
`Invalid balance.usdValue: ${balance.usdValue}. Expected a finite, non-negative number.`
|
|
275
|
+
);
|
|
276
|
+
return {
|
|
277
|
+
shouldInvest: false,
|
|
278
|
+
vesuAmount: new Web3Number(0, 0),
|
|
279
|
+
extendedAmount: new Web3Number(0, 0),
|
|
280
|
+
extendedLeverage: 0,
|
|
281
|
+
collateralPrice: 0,
|
|
282
|
+
debtPrice: 0,
|
|
283
|
+
vesuLeverage: 0,
|
|
284
|
+
};
|
|
285
|
+
}
|
|
286
|
+
logger.info(`${VesuExtendedMultiplierStrategy.name}::shouldInvest balance: ${balance.usdValue}`);
|
|
239
287
|
const usdcBalanceOnExtended = await extendedAdapter.getExtendedDepositAmount();
|
|
288
|
+
|
|
289
|
+
if (usdcBalanceOnExtended) {
|
|
290
|
+
const availableForWithdrawal = parseFloat(usdcBalanceOnExtended.availableForWithdrawal);
|
|
291
|
+
if (!Number.isFinite(availableForWithdrawal) || availableForWithdrawal < 0) {
|
|
292
|
+
logger.error(
|
|
293
|
+
`Invalid usdcBalanceOnExtended.availableForWithdrawal: ${usdcBalanceOnExtended.availableForWithdrawal}. Expected a finite, non-negative number.`
|
|
294
|
+
);
|
|
295
|
+
return {
|
|
296
|
+
shouldInvest: false,
|
|
297
|
+
vesuAmount: new Web3Number(0, 0),
|
|
298
|
+
extendedAmount: new Web3Number(0, 0),
|
|
299
|
+
extendedLeverage: 0,
|
|
300
|
+
collateralPrice: 0,
|
|
301
|
+
debtPrice: 0,
|
|
302
|
+
vesuLeverage: 0,
|
|
303
|
+
};
|
|
304
|
+
}
|
|
305
|
+
}
|
|
306
|
+
|
|
240
307
|
/** 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).
|
|
242
|
-
|
|
308
|
+
const amountToInvest = new Web3Number(balance.usdValue, USDC_TOKEN_DECIMALS).plus(usdcBalanceOnExtended?.availableForWithdrawal ?? 0).multipliedBy(1 - LIMIT_BALANCE);
|
|
309
|
+
|
|
310
|
+
const amountToInvestNumber = amountToInvest.toNumber();
|
|
311
|
+
if (!Number.isFinite(amountToInvestNumber)) {
|
|
312
|
+
logger.error(
|
|
313
|
+
`Invalid amountToInvest calculation result: ${amountToInvestNumber}. Calculation may have produced NaN or Infinity.`
|
|
314
|
+
);
|
|
315
|
+
return {
|
|
316
|
+
shouldInvest: false,
|
|
317
|
+
vesuAmount: new Web3Number(0, 0),
|
|
318
|
+
extendedAmount: new Web3Number(0, 0),
|
|
319
|
+
extendedLeverage: 0,
|
|
320
|
+
collateralPrice: 0,
|
|
321
|
+
debtPrice: 0,
|
|
322
|
+
vesuLeverage: 0,
|
|
323
|
+
};
|
|
324
|
+
}
|
|
325
|
+
|
|
326
|
+
logger.info(`${VesuExtendedMultiplierStrategy.name}::shouldInvest amountToInvest: ${amountToInvestNumber}`);
|
|
243
327
|
if (amountToInvest.lessThan(0)) {
|
|
244
328
|
return {
|
|
245
329
|
shouldInvest: false,
|
|
@@ -272,6 +356,37 @@ export class VesuExtendedMultiplierStrategy<
|
|
|
272
356
|
collateralPrice,
|
|
273
357
|
debtPrice
|
|
274
358
|
} = await this.getAssetPrices();
|
|
359
|
+
|
|
360
|
+
|
|
361
|
+
if (!Number.isFinite(collateralPrice.price) || collateralPrice.price <= 0) {
|
|
362
|
+
logger.error(
|
|
363
|
+
`Invalid collateralPrice: ${collateralPrice.price}. Expected a finite, positive number.`
|
|
364
|
+
);
|
|
365
|
+
return {
|
|
366
|
+
shouldInvest: false,
|
|
367
|
+
vesuAmount: new Web3Number(0, 0),
|
|
368
|
+
extendedAmount: new Web3Number(0, 0),
|
|
369
|
+
extendedLeverage: 0,
|
|
370
|
+
collateralPrice: 0,
|
|
371
|
+
debtPrice: 0,
|
|
372
|
+
vesuLeverage: 0,
|
|
373
|
+
};
|
|
374
|
+
}
|
|
375
|
+
if (!Number.isFinite(debtPrice.price) || debtPrice.price <= 0) {
|
|
376
|
+
logger.error(
|
|
377
|
+
`Invalid debtPrice: ${debtPrice.price}. Expected a finite, positive number.`
|
|
378
|
+
);
|
|
379
|
+
return {
|
|
380
|
+
shouldInvest: false,
|
|
381
|
+
vesuAmount: new Web3Number(0, 0),
|
|
382
|
+
extendedAmount: new Web3Number(0, 0),
|
|
383
|
+
extendedLeverage: 0,
|
|
384
|
+
collateralPrice: 0,
|
|
385
|
+
debtPrice: 0,
|
|
386
|
+
vesuLeverage: 0,
|
|
387
|
+
};
|
|
388
|
+
}
|
|
389
|
+
|
|
275
390
|
const { vesu_amount, extended_amount, extended_leverage, vesu_leverage } =
|
|
276
391
|
await calculateAmountDistribution(
|
|
277
392
|
amountToInvest.toNumber(),
|
|
@@ -329,14 +444,65 @@ export class VesuExtendedMultiplierStrategy<
|
|
|
329
444
|
try {
|
|
330
445
|
const vesuAdapter = await this.getVesuAdapter();
|
|
331
446
|
const extendedAdapter = await this.getExtendedAdapter();
|
|
332
|
-
let calls: Call[] = [];
|
|
333
447
|
if (!vesuAdapter || !extendedAdapter || !extendedAdapter.client) {
|
|
334
448
|
logger.error(
|
|
335
449
|
`vesu or extended adapter not found: vesuAdapter=${vesuAdapter}, extendedAdapter=${extendedAdapter}`
|
|
336
450
|
);
|
|
337
|
-
return
|
|
451
|
+
return [];
|
|
452
|
+
}
|
|
453
|
+
|
|
454
|
+
const extendedHoldings = await extendedAdapter.getExtendedDepositAmount();
|
|
455
|
+
if (!extendedHoldings) {
|
|
456
|
+
logger.error(`error getting extended holdings: ${extendedHoldings}`);
|
|
457
|
+
return [];
|
|
458
|
+
}
|
|
459
|
+
const usdcAmountInWallet = (await this.getUnusedBalance()).amount;
|
|
460
|
+
const usdcAmountOnExtendedAvailableForWithdrawal = parseFloat(
|
|
461
|
+
extendedHoldings.availableForWithdrawal
|
|
462
|
+
);
|
|
463
|
+
|
|
464
|
+
logger.info(`${VesuExtendedMultiplierStrategy.name}::shouldMoveAssets calculating movements - Extended current: ${usdcAmountOnExtendedAvailableForWithdrawal}, Wallet: ${usdcAmountInWallet.toNumber()}, Target Extended: ${extendedAmount.toNumber()}, Target Vesu: ${vesuAmount.toNumber()}`);
|
|
465
|
+
|
|
466
|
+
let totalExtendedWithdrawal = new Web3Number(0, USDC_TOKEN_DECIMALS);
|
|
467
|
+
let totalExtendedDeposit = new Web3Number(0, USDC_TOKEN_DECIMALS);
|
|
468
|
+
|
|
469
|
+
if (extendedAmount.isNegative() && extendedAmount.abs().greaterThan(extendedAdapter.minimumExtendedMovementAmount)) {
|
|
470
|
+
totalExtendedWithdrawal = totalExtendedWithdrawal.plus(extendedAmount.abs());
|
|
471
|
+
}
|
|
472
|
+
|
|
473
|
+
// Calculate remaining Extended difference (target vs current)
|
|
474
|
+
// If extendedAmount was negative, we've already accounted for that withdrawal
|
|
475
|
+
// So we calculate based on what Extended will be after that withdrawal
|
|
476
|
+
const extendedTargetAmount = extendedAmount.abs(); // Use absolute value as target
|
|
477
|
+
let projectedExtendedBalance = usdcAmountOnExtendedAvailableForWithdrawal;
|
|
478
|
+
|
|
479
|
+
if (extendedAmount.isNegative()) {
|
|
480
|
+
projectedExtendedBalance = projectedExtendedBalance - extendedAmount.abs().toNumber();
|
|
481
|
+
}
|
|
482
|
+
|
|
483
|
+
const extendedAmountDifference = extendedTargetAmount.minus(projectedExtendedBalance);
|
|
484
|
+
const extendedAmountDifferenceAbs = extendedAmountDifference.abs();
|
|
485
|
+
|
|
486
|
+
// Track additional Extended movements
|
|
487
|
+
if (extendedAmountDifference.lessThan(0)) {
|
|
488
|
+
totalExtendedWithdrawal = totalExtendedWithdrawal.plus(extendedAmountDifferenceAbs);
|
|
489
|
+
} else if (extendedAmountDifference.greaterThan(0)) {
|
|
490
|
+
totalExtendedDeposit = totalExtendedDeposit.plus(extendedAmountDifference);
|
|
338
491
|
}
|
|
339
|
-
|
|
492
|
+
|
|
493
|
+
const vesuTargetAmount = vesuAmount.abs();
|
|
494
|
+
const projectedWalletBalance = usdcAmountInWallet
|
|
495
|
+
.plus(totalExtendedWithdrawal)
|
|
496
|
+
.minus(totalExtendedDeposit);
|
|
497
|
+
|
|
498
|
+
let vesuAmountDifference = vesuTargetAmount.minus(projectedWalletBalance);
|
|
499
|
+
const vesuAmountDifferenceAbs = vesuAmountDifference.abs();
|
|
500
|
+
|
|
501
|
+
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()}`);
|
|
502
|
+
let calls: Call[] = [];
|
|
503
|
+
|
|
504
|
+
// Handle negative extendedAmount (initial withdrawal needed)
|
|
505
|
+
if (extendedAmount.isNegative() && extendedAmount.abs().greaterThan(extendedAdapter.minimumExtendedMovementAmount)) {
|
|
340
506
|
try {
|
|
341
507
|
const { calls: extendedCalls, status: extendedStatus } = await this.moveAssets(
|
|
342
508
|
{
|
|
@@ -347,7 +513,6 @@ export class VesuExtendedMultiplierStrategy<
|
|
|
347
513
|
extendedAdapter,
|
|
348
514
|
vesuAdapter
|
|
349
515
|
);
|
|
350
|
-
//If withdrawal succesfull, then do further
|
|
351
516
|
if (extendedStatus) {
|
|
352
517
|
calls.push(...extendedCalls);
|
|
353
518
|
} else {
|
|
@@ -358,7 +523,7 @@ export class VesuExtendedMultiplierStrategy<
|
|
|
358
523
|
}
|
|
359
524
|
}
|
|
360
525
|
|
|
361
|
-
if (vesuAmount.
|
|
526
|
+
if (vesuAmount.isNegative() && vesuAmount.abs().greaterThan(vesuAdapter.minimumVesuMovementAmount)) {
|
|
362
527
|
try {
|
|
363
528
|
const { calls: vesuCalls, status: vesuStatus } = await this.moveAssets(
|
|
364
529
|
{
|
|
@@ -378,52 +543,83 @@ export class VesuExtendedMultiplierStrategy<
|
|
|
378
543
|
}
|
|
379
544
|
}
|
|
380
545
|
|
|
381
|
-
|
|
382
|
-
if (
|
|
383
|
-
|
|
384
|
-
|
|
385
|
-
|
|
386
|
-
|
|
387
|
-
|
|
388
|
-
|
|
389
|
-
|
|
390
|
-
|
|
391
|
-
|
|
392
|
-
|
|
393
|
-
|
|
394
|
-
{
|
|
395
|
-
|
|
396
|
-
|
|
397
|
-
|
|
398
|
-
|
|
399
|
-
|
|
400
|
-
|
|
401
|
-
|
|
402
|
-
|
|
403
|
-
|
|
404
|
-
|
|
546
|
+
// Handle Extended adjustments based on calculated difference
|
|
547
|
+
if (extendedAmountDifferenceAbs.greaterThan(extendedAdapter.minimumExtendedMovementAmount)) {
|
|
548
|
+
if (extendedAmountDifference.greaterThan(0)) {
|
|
549
|
+
try {
|
|
550
|
+
const { calls: extendedCalls, status: extendedStatus } = await this.moveAssets(
|
|
551
|
+
{
|
|
552
|
+
to: Protocols.EXTENDED.name,
|
|
553
|
+
from: Protocols.VAULT.name,
|
|
554
|
+
amount: extendedAmountDifference,
|
|
555
|
+
},
|
|
556
|
+
extendedAdapter,
|
|
557
|
+
vesuAdapter
|
|
558
|
+
);
|
|
559
|
+
if (extendedStatus) {
|
|
560
|
+
calls.push(...extendedCalls);
|
|
561
|
+
} else {
|
|
562
|
+
logger.error(`Failed to move assets to extended - operation returned false status`);
|
|
563
|
+
return [];
|
|
564
|
+
}
|
|
565
|
+
} catch (err) {
|
|
566
|
+
logger.error(`Failed moving assets to extended: ${err}`);
|
|
567
|
+
return [];
|
|
568
|
+
}
|
|
569
|
+
} else if (extendedAmountDifference.lessThan(0)) {
|
|
570
|
+
try {
|
|
571
|
+
const { calls: extendedCalls, status: extendedStatus } = await this.moveAssets(
|
|
572
|
+
{
|
|
573
|
+
to: Protocols.VAULT.name,
|
|
574
|
+
from: Protocols.EXTENDED.name,
|
|
575
|
+
amount: extendedAmountDifferenceAbs,
|
|
576
|
+
},
|
|
577
|
+
extendedAdapter,
|
|
578
|
+
vesuAdapter
|
|
579
|
+
);
|
|
580
|
+
if (extendedStatus) {
|
|
581
|
+
calls.push(...extendedCalls);
|
|
582
|
+
} else {
|
|
583
|
+
logger.error(`Failed to withdraw from extended - operation returned false status`);
|
|
584
|
+
return [];
|
|
585
|
+
}
|
|
586
|
+
} catch (err) {
|
|
587
|
+
logger.error(`Failed moving assets from extended to vault: ${err}`);
|
|
588
|
+
return [];
|
|
589
|
+
}
|
|
405
590
|
}
|
|
406
591
|
}
|
|
407
|
-
|
|
408
|
-
|
|
409
|
-
|
|
410
|
-
|
|
411
|
-
|
|
412
|
-
|
|
413
|
-
from: Protocols.EXTENDED.name,
|
|
414
|
-
amount: vesuAmount.minus(usdcAmountInWallet),
|
|
415
|
-
},
|
|
416
|
-
extendedAdapter,
|
|
417
|
-
vesuAdapter
|
|
592
|
+
|
|
593
|
+
// Handle Vesu adjustments based on calculated difference (already adjusted for Extended movements)
|
|
594
|
+
if (vesuAmountDifferenceAbs.greaterThan(vesuAdapter.minimumVesuMovementAmount)) {
|
|
595
|
+
if (vesuAmountDifference.lessThanOrEqualTo(0)) {
|
|
596
|
+
logger.warn(
|
|
597
|
+
`Vesu amount difference is negative or zero: ${vesuAmountDifference.toNumber()}. Skipping operation.`
|
|
418
598
|
);
|
|
419
|
-
|
|
599
|
+
} else {
|
|
600
|
+
// Move assets from Extended to Vault (which will then go to Vesu)
|
|
601
|
+
try {
|
|
602
|
+
const { calls: vesuCalls, status: vesuStatus } = await this.moveAssets(
|
|
603
|
+
{
|
|
604
|
+
to: Protocols.VAULT.name,
|
|
605
|
+
from: Protocols.EXTENDED.name,
|
|
606
|
+
amount: vesuAmountDifference,
|
|
607
|
+
},
|
|
608
|
+
extendedAdapter,
|
|
609
|
+
vesuAdapter
|
|
610
|
+
);
|
|
611
|
+
if (!vesuStatus) {
|
|
612
|
+
logger.error(`Failed to move assets to vesu - operation returned false status`);
|
|
613
|
+
return [];
|
|
614
|
+
}
|
|
615
|
+
calls.push(...vesuCalls);
|
|
616
|
+
} catch (err) {
|
|
617
|
+
logger.error(`Failed moving assets to vault: ${err}`);
|
|
420
618
|
return [];
|
|
421
619
|
}
|
|
422
|
-
calls.push(...vesuCalls);
|
|
423
|
-
} catch (err) {
|
|
424
|
-
logger.error(`Failed moving assets to vault: ${err}`);
|
|
425
620
|
}
|
|
426
621
|
}
|
|
622
|
+
|
|
427
623
|
return calls;
|
|
428
624
|
} catch (err) {
|
|
429
625
|
logger.error(`Failed moving assets to vesu: ${err}`);
|
|
@@ -444,6 +640,42 @@ export class VesuExtendedMultiplierStrategy<
|
|
|
444
640
|
status: boolean;
|
|
445
641
|
}> {
|
|
446
642
|
try {
|
|
643
|
+
// Validate amount is positive before starting operations
|
|
644
|
+
if (params.amount.lessThanOrEqualTo(0)) {
|
|
645
|
+
logger.error(
|
|
646
|
+
`Invalid amount for moveAssets: ${params.amount.toNumber()}. Amount must be positive.`
|
|
647
|
+
);
|
|
648
|
+
return {
|
|
649
|
+
calls: [],
|
|
650
|
+
status: false
|
|
651
|
+
};
|
|
652
|
+
}
|
|
653
|
+
|
|
654
|
+
// Check minimum movement amounts before starting operations
|
|
655
|
+
const amountAbs = params.amount.abs();
|
|
656
|
+
if (params.from === Protocols.EXTENDED.name || params.to === Protocols.EXTENDED.name) {
|
|
657
|
+
if (amountAbs.lessThanOrEqualTo(extendedAdapter.minimumExtendedMovementAmount)) {
|
|
658
|
+
logger.warn(
|
|
659
|
+
`Amount ${amountAbs.toNumber()} is below minimum Extended movement amount ${extendedAdapter.minimumExtendedMovementAmount}. Skipping operation.`
|
|
660
|
+
);
|
|
661
|
+
return {
|
|
662
|
+
calls: [],
|
|
663
|
+
status: false
|
|
664
|
+
};
|
|
665
|
+
}
|
|
666
|
+
}
|
|
667
|
+
if (params.from === Protocols.VESU.name || params.to === Protocols.VESU.name) {
|
|
668
|
+
if (amountAbs.lessThanOrEqualTo(vesuAdapter.minimumVesuMovementAmount)) {
|
|
669
|
+
logger.warn(
|
|
670
|
+
`Amount ${amountAbs.toNumber()} is below minimum Vesu movement amount ${vesuAdapter.minimumVesuMovementAmount}. Skipping operation.`
|
|
671
|
+
);
|
|
672
|
+
return {
|
|
673
|
+
calls: [],
|
|
674
|
+
status: false
|
|
675
|
+
};
|
|
676
|
+
}
|
|
677
|
+
}
|
|
678
|
+
|
|
447
679
|
const avnuAdapter = await this.getAvnuAdapter();
|
|
448
680
|
if (!avnuAdapter) {
|
|
449
681
|
logger.error(`avnu adapter not found: ${avnuAdapter}`);
|
|
@@ -504,12 +736,13 @@ export class VesuExtendedMultiplierStrategy<
|
|
|
504
736
|
)
|
|
505
737
|
if (!openLongPosition) {
|
|
506
738
|
logger.error(`error opening long position: ${openLongPosition}`);
|
|
507
|
-
return {
|
|
508
|
-
calls: [],
|
|
509
|
-
status: false
|
|
510
|
-
};
|
|
511
739
|
}
|
|
512
740
|
await new Promise(resolve => setTimeout(resolve, 5000));
|
|
741
|
+
const updatedHoldings = await extendedAdapter.getExtendedDepositAmount();
|
|
742
|
+
if (!updatedHoldings || new Web3Number(updatedHoldings.availableForWithdrawal, USDC_TOKEN_DECIMALS).lessThan(params.amount.abs())) {
|
|
743
|
+
logger.error(`Insufficient balance after opening position. Available: ${updatedHoldings?.availableForWithdrawal}, Needed: ${params.amount.abs()}`);
|
|
744
|
+
return { calls: [], status: false };
|
|
745
|
+
}
|
|
513
746
|
}
|
|
514
747
|
const withdrawalFromExtended =
|
|
515
748
|
await extendedAdapter.withdrawFromExtended(params.amount);
|
|
@@ -913,6 +1146,9 @@ function getLooperSettings(
|
|
|
913
1146
|
extendedBackendUrl: string,
|
|
914
1147
|
extendedApiKey: string,
|
|
915
1148
|
vaultIdExtended: number,
|
|
1149
|
+
minimumExtendedMovementAmount: number,
|
|
1150
|
+
minimumVesuMovementAmount: number,
|
|
1151
|
+
minimumExtendedRetriesDelayForOrderStatus: number,
|
|
916
1152
|
) {
|
|
917
1153
|
vaultSettings.leafAdapters = [];
|
|
918
1154
|
|
|
@@ -958,6 +1194,8 @@ function getLooperSettings(
|
|
|
958
1194
|
extendedMarketName: "BTC-USD",
|
|
959
1195
|
extendedPrecision: 5,
|
|
960
1196
|
avnuAdapter: avnuAdapter,
|
|
1197
|
+
retryDelayForOrderStatus: minimumExtendedRetriesDelayForOrderStatus ?? 3000,
|
|
1198
|
+
minimumExtendedMovementAmount: minimumExtendedMovementAmount ?? 5, //5 usdcs
|
|
961
1199
|
});
|
|
962
1200
|
|
|
963
1201
|
const vesuMultiplyAdapter = new VesuMultiplyAdapter({
|
|
@@ -972,6 +1210,7 @@ function getLooperSettings(
|
|
|
972
1210
|
{ asset: wbtcToken, isDebt: false },
|
|
973
1211
|
{ asset: usdcToken, isDebt: true },
|
|
974
1212
|
],
|
|
1213
|
+
minimumVesuMovementAmount: minimumVesuMovementAmount ?? 5, //5 usdc
|
|
975
1214
|
});
|
|
976
1215
|
|
|
977
1216
|
const unusedBalanceAdapter = new UnusedBalanceAdapter({
|
|
@@ -1105,15 +1344,15 @@ const re7UsdcPrimeDevansh: VesuExtendedStrategySettings = {
|
|
|
1105
1344
|
minimumWBTCDifferenceForAvnuSwap: MINIMUM_WBTC_DIFFERENCE_FOR_AVNU_SWAP,
|
|
1106
1345
|
}
|
|
1107
1346
|
|
|
1108
|
-
export const VesuExtendedTestStrategies = (extendedBackendUrl: string, extendedApiKey: string, vaultIdExtended: number): IStrategyMetadata<VesuExtendedStrategySettings>[] => {
|
|
1347
|
+
export const VesuExtendedTestStrategies = (extendedBackendUrl: string, extendedApiKey: string, vaultIdExtended: number, minimumExtendedMovementAmount: number, minimumVesuMovementAmount: number, minimumExtendedRetriesDelayForOrderStatus: number): IStrategyMetadata<VesuExtendedStrategySettings>[] => {
|
|
1109
1348
|
return [
|
|
1110
|
-
getStrategySettingsVesuExtended('WBTC', 'USDC', re7UsdcPrimeDevansh, false, false, extendedBackendUrl, extendedApiKey, vaultIdExtended),
|
|
1349
|
+
getStrategySettingsVesuExtended('WBTC', 'USDC', re7UsdcPrimeDevansh, false, false, extendedBackendUrl, extendedApiKey, vaultIdExtended, minimumExtendedMovementAmount, minimumVesuMovementAmount, minimumExtendedRetriesDelayForOrderStatus),
|
|
1111
1350
|
]
|
|
1112
1351
|
}
|
|
1113
1352
|
|
|
1114
1353
|
|
|
1115
1354
|
|
|
1116
|
-
function getStrategySettingsVesuExtended(lstSymbol: string, underlyingSymbol: string, addresses: VesuExtendedStrategySettings, isPreview: boolean = false, isLST: boolean, extendedBackendUrl: string, extendedApiKey: string, vaultIdExtended: number): IStrategyMetadata<VesuExtendedStrategySettings> {
|
|
1355
|
+
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
1356
|
return {
|
|
1118
1357
|
name: `Extended Test ${underlyingSymbol}`,
|
|
1119
1358
|
description: getDescription(lstSymbol, underlyingSymbol),
|
|
@@ -1121,7 +1360,7 @@ function getStrategySettingsVesuExtended(lstSymbol: string, underlyingSymbol: st
|
|
|
1121
1360
|
launchBlock: 0,
|
|
1122
1361
|
type: 'Other',
|
|
1123
1362
|
depositTokens: [Global.getDefaultTokens().find(token => token.symbol === underlyingSymbol)!],
|
|
1124
|
-
additionalInfo: getLooperSettings(lstSymbol, underlyingSymbol, addresses, VesuPools.Re7USDCPrime, extendedBackendUrl, extendedApiKey, vaultIdExtended),
|
|
1363
|
+
additionalInfo: getLooperSettings(lstSymbol, underlyingSymbol, addresses, VesuPools.Re7USDCPrime, extendedBackendUrl, extendedApiKey, vaultIdExtended, minimumExtendedMovementAmount, minimumVesuMovementAmount, minimumExtendedRetriesDelayForOrderStatus),
|
|
1125
1364
|
risk: {
|
|
1126
1365
|
riskFactor: _riskFactor,
|
|
1127
1366
|
netRisk:
|