@strkfarm/sdk 2.0.0-staging.7 → 2.0.0-staging.71

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.
@@ -1,7 +1,13 @@
1
1
  import { ContractAddr, Web3Number } from "@/dataTypes";
2
- import { BaseStrategy, SingleActionAmount, SingleTokenInfo } from "./base-strategy";
2
+ import {
3
+ BaseStrategy,
4
+ SingleActionAmount,
5
+ SingleTokenInfo,
6
+ UserPositionCard,
7
+ UserPositionCardsInput,
8
+ } from "./base-strategy";
3
9
  import { PricerBase } from "@/modules/pricerBase";
4
- import { FAQ, getNoRiskTags, IConfig, IStrategyMetadata, Protocols, RiskFactor, RiskType, StrategyCategory, StrategyTag, VaultPosition, AuditStatus, SourceCodeType, AccessControlType, InstantWithdrawalVault, StrategyLiveStatus, StrategySettings, VaultType } from "@/interfaces";
10
+ import { FAQ, getNoRiskTags, IConfig, IStrategyMetadata, Protocols, RiskFactor, RiskType, StrategyTag, VaultPosition, AuditStatus, SourceCodeType, AccessControlType, InstantWithdrawalVault, StrategyLiveStatus, StrategySettings, VaultType, RedemptionInfo, UnwrapLabsCurator } from "@/interfaces";
5
11
  import { BlockIdentifier, Call, CallData, Contract, num, uint256 } from "starknet";
6
12
  import { VesuRebalanceSettings } from "./vesu-rebalance";
7
13
  import { assert, LeafData, logger, StandardMerkleTree } from "@/utils";
@@ -11,6 +17,7 @@ import { ApproveCallParams, AvnuSwapCallParams, BaseAdapter, CommonAdapter, Flas
11
17
  import { Global } from "@/global";
12
18
  import { AvnuWrapper, ERC20 } from "@/modules";
13
19
  import { AVNU_MIDDLEWARE, VESU_SINGLETON } from "./universal-adapters/adapter-utils";
20
+ import { LSTPriceType } from "./types";
14
21
  import { HarvestInfo, VesuHarvests } from "@/modules/harvests";
15
22
 
16
23
  export interface UniversalManageCall {
@@ -212,7 +219,7 @@ export class UniversalStrategy<
212
219
  });
213
220
  logger.verbose(`${this.metadata.name}::netAPY: vesu-pools: ${JSON.stringify(pools)}`);
214
221
  if (pools.some(p => !p)) {
215
- throw new Error('Pool not found');
222
+ throw new Error(`Pool not found`);
216
223
  };
217
224
  const positions = await this.getVesuPositions();
218
225
  logger.verbose(`${this.metadata.name}::netAPY: positions: ${JSON.stringify(positions)}`);
@@ -403,6 +410,50 @@ export class UniversalStrategy<
403
410
  return (apyForGivenBlocks * (365 * 24 * 3600)) / timeDiffSeconds;
404
411
  }
405
412
 
413
+ async getUserPositionCards(input: UserPositionCardsInput): Promise<UserPositionCard[]> {
414
+ const { user, investmentFlows = [] } = input;
415
+ const [userTVL] = await Promise.all([
416
+ this.getUserTVL(user),
417
+ ]);
418
+ const cards: UserPositionCard[] = [
419
+ {
420
+ title: "Your Holdings",
421
+ tooltip: "Your Holdings",
422
+ value: this.formatTokenAmountForCard(userTVL.amount, userTVL.tokenInfo),
423
+ subValue: `≈ ${this.formatUSDForCard(userTVL.usdValue)}`,
424
+ subValueColor: "positive",
425
+ },
426
+ ];
427
+
428
+ let lifetimeAmount = userTVL.amount.multipliedBy(0);
429
+ let lifetimeTokenInfo = userTVL.tokenInfo;
430
+ let lifetimeUsdValue = 0;
431
+ if (investmentFlows.length > 0) {
432
+ try {
433
+ const earningsResult = this.getLifetimeEarnings(userTVL, investmentFlows);
434
+ lifetimeAmount = earningsResult.lifetimeEarnings;
435
+ lifetimeTokenInfo = earningsResult.tokenInfo.tokenInfo;
436
+ const userAmount = userTVL.amount.toNumber();
437
+ if (Number.isFinite(userAmount) && userAmount > 0) {
438
+ const pricePerToken = userTVL.usdValue / userAmount;
439
+ lifetimeUsdValue = lifetimeAmount.toNumber() * pricePerToken;
440
+ }
441
+ } catch (error) {
442
+ logger.warn(`${this.getTag()}::getUserPositionCards lifetime earnings fallback`, error);
443
+ }
444
+ }
445
+
446
+ cards.push({
447
+ title: "Lifetime Earnings",
448
+ tooltip: "Lifetime Earnings",
449
+ value: this.formatTokenAmountForCard(lifetimeAmount, lifetimeTokenInfo),
450
+ subValue: `≈ ${this.formatUSDForCard(lifetimeUsdValue)}`,
451
+ subValueColor: this.getSubValueColorFromSignedNumber(lifetimeUsdValue),
452
+ });
453
+
454
+ return cards;
455
+ }
456
+
406
457
  /**
407
458
  * Calculates the total TVL of the strategy.
408
459
  * @returns Object containing the total amount in token units and USD value
@@ -417,6 +468,19 @@ export class UniversalStrategy<
417
468
  this.metadata.depositTokens[0].symbol
418
469
  );
419
470
  const usdValue = Number(amount.toFixed(6)) * price.price;
471
+
472
+ if (
473
+ (usdValue === 0 || amount.eq(0)) &&
474
+ this.metadata.settings?.liveStatus === StrategyLiveStatus.ACTIVE
475
+ ) {
476
+ logger.warn(
477
+ `${this.metadata.name}:getTVL - Zero value detected: ` +
478
+ `usdValue=${usdValue}, ` +
479
+ `amount=${amount.toString()}, ` +
480
+ `price=${price.price}`
481
+ );
482
+ }
483
+
420
484
  return {
421
485
  tokenInfo: this.asset(),
422
486
  amount,
@@ -424,6 +488,11 @@ export class UniversalStrategy<
424
488
  };
425
489
  }
426
490
 
491
+ async getMaxTVL(): Promise<Web3Number> {
492
+ // This strategy doesn't have a maxTVL so returning 0 simply
493
+ return new Web3Number('0', 18);
494
+ }
495
+
427
496
  async getUnusedBalance(): Promise<SingleTokenInfo> {
428
497
  const balance = await (new ERC20(this.config)).balanceOf(this.asset().address, this.metadata.additionalInfo.vaultAllocator, this.asset().decimals);
429
498
  const price = await this.pricer.getPrice(this.metadata.depositTokens[0].symbol);
@@ -435,7 +504,7 @@ export class UniversalStrategy<
435
504
  };
436
505
  }
437
506
 
438
- protected async getVesuAUM(adapter: VesuAdapter) {
507
+ protected async getVesuAUM(adapter: VesuAdapter, _priceType?: LSTPriceType) {
439
508
  const legAUM = await adapter.getPositions(this.config);
440
509
  const underlying = this.asset();
441
510
  let vesuAum = Web3Number.fromWei("0", underlying.decimals);
@@ -468,7 +537,7 @@ export class UniversalStrategy<
468
537
  return prevAum;
469
538
  }
470
539
 
471
- async getAUM(): Promise<{net: SingleTokenInfo, prevAum: Web3Number, splits: {id: string, aum: Web3Number}[]}> {
540
+ async getAUM(unrealizedAUM?: boolean): Promise<{net: SingleTokenInfo, prevAum: Web3Number, splits: {id: string, aum: Web3Number}[]}> {
472
541
  const prevAum = await this.getPrevAUM();
473
542
  const token1Price = await this.pricer.getPrice(this.metadata.depositTokens[0].symbol);
474
543
 
@@ -476,7 +545,9 @@ export class UniversalStrategy<
476
545
  const vesuAdapters = this.getVesuAdapters();
477
546
  let vesuAum = Web3Number.fromWei("0", this.asset().decimals);
478
547
  for (const adapter of vesuAdapters) {
479
- vesuAum = vesuAum.plus(await this.getVesuAUM(adapter));
548
+ const priceType = unrealizedAUM ? LSTPriceType.ENDUR_PRICE : LSTPriceType.AVNU_PRICE;
549
+ const aumValue = await this.getVesuAUM(adapter, priceType);
550
+ vesuAum = vesuAum.plus(aumValue);
480
551
  }
481
552
 
482
553
  // account unused balance as aum as well (from vault allocator)
@@ -1095,7 +1166,6 @@ export default function MetaVaultDescription(allowedSources: AllowedSources[]) {
1095
1166
  const containerStyle = {
1096
1167
  maxWidth: "800px",
1097
1168
  margin: "0 auto",
1098
- backgroundColor: "#111",
1099
1169
  color: "#eee",
1100
1170
  fontFamily: "Arial, sans-serif",
1101
1171
  borderRadius: "12px",
@@ -1122,7 +1192,6 @@ export default function MetaVaultDescription(allowedSources: AllowedSources[]) {
1122
1192
  <h1 style={{ fontSize: "18px", marginBottom: "10px" }}>Meta Vault — Automated Yield Router</h1>
1123
1193
  <p style={{ fontSize: "14px", lineHeight: "1.5", marginBottom: "16px" }}>
1124
1194
  This Evergreen vault is a tokenized Meta Vault, auto-compounding strategy that continuously allocates your deposited
1125
- asset to the best available yield source in the ecosystem. Depositors receive vault shares that
1126
1195
  represent a proportional claim on the underlying assets and accrued yield. Allocation shifts are
1127
1196
  handled programmatically based on on-chain signals and risk filters, minimizing idle capital and
1128
1197
  maximizing net APY.
@@ -1251,27 +1320,28 @@ const getUniversalRisk = () => ({
1251
1320
 
1252
1321
  // Helper to create Universal strategy settings
1253
1322
  const createUniversalSettings = (
1254
- tokenSymbol: string,
1255
- maxTVLDecimals: number
1256
- ): StrategySettings => ({
1257
- maxTVL: Web3Number.fromWei(0, maxTVLDecimals),
1258
- isAudited: true,
1259
- liveStatus: StrategyLiveStatus.ACTIVE,
1260
- isPaused: false,
1261
- isInstantWithdrawal: false,
1262
- hideHarvestInfo: true,
1263
- quoteToken: Global.getDefaultTokens().find(
1264
- (token) => token.symbol === tokenSymbol
1265
- )!,
1266
- alerts: [
1267
- {
1268
- tab: "withdraw" as const,
1269
- text: "On withdrawal, you will receive an NFT representing your withdrawal request. The funds will be automatically sent to your wallet (NFT owner) in 1-2 hours. You can monitor the status in transactions tab.",
1270
- type: "info" as const
1271
- }
1272
- ],
1273
- showWithdrawalWarningModal: true
1274
- });
1323
+ tokenSymbol: string
1324
+ ): StrategySettings => {
1325
+ const isUSDT = tokenSymbol === "USDT";
1326
+ return {
1327
+ isAudited: true,
1328
+ liveStatus: isUSDT ? StrategyLiveStatus.RETIRED : StrategyLiveStatus.ACTIVE,
1329
+ isPaused: isUSDT,
1330
+ isInstantWithdrawal: false,
1331
+ hideHarvestInfo: true,
1332
+ quoteToken: Global.getDefaultTokens().find(
1333
+ (token) => token.symbol === tokenSymbol
1334
+ )!,
1335
+ alerts: [
1336
+ {
1337
+ tab: "withdraw" as const,
1338
+ text: "On withdrawal, you will receive an NFT representing your withdrawal request. The funds will be automatically sent to your wallet (NFT owner) in 1-2 hours. You can monitor the status in transactions tab.",
1339
+ type: "info" as const
1340
+ }
1341
+ ],
1342
+ showWithdrawalWarningModal: true
1343
+ };
1344
+ };
1275
1345
 
1276
1346
  const EVERGREEN_SECURITY = {
1277
1347
  auditStatus: AuditStatus.AUDITED,
@@ -1281,18 +1351,21 @@ const EVERGREEN_SECURITY = {
1281
1351
  },
1282
1352
  accessControl: {
1283
1353
  type: AccessControlType.STANDARD_ACCOUNT,
1284
- addresses: [ContractAddr.from("0x0")],
1285
- timeLock: "2 Days",
1354
+ addresses: [ContractAddr.from("0x03495DD1e4838aa06666aac236036D86E81A6553e222FC02e70C2Cbc0062e8d0")],
1286
1355
  },
1287
1356
  };
1288
1357
 
1289
- const EVERGREEN_REDEMPTION_INFO = {
1358
+ const EVERGREEN_REDEMPTION_INFO: RedemptionInfo = {
1290
1359
  instantWithdrawalVault: InstantWithdrawalVault.NO,
1291
- expectedRedemptionTime: {
1292
- upto1M: "1-2hrs",
1293
- upto10M: "24hrs",
1294
- above10M: "2-3 Days",
1295
- },
1360
+ redemptionsInfo: [{
1361
+ title: "Typical Duration",
1362
+ description: "1-2 hours"
1363
+ }],
1364
+ alerts: [{
1365
+ type: 'info',
1366
+ text: 'In cases of low liquidity, high slippages, the redemptions can take longer time. Redemption times are estimates and may vary based on network conditions and liquidity requirements.',
1367
+ tab: 'withdraw'
1368
+ }]
1296
1369
  };
1297
1370
 
1298
1371
  // Helper to create a Universal strategy
@@ -1302,42 +1375,53 @@ const createUniversalStrategy = (params: {
1302
1375
  vaultSettings: UniversalStrategySettings;
1303
1376
  token1Symbol: string;
1304
1377
  token2Symbol: string;
1305
- maxTVLDecimals: number;
1306
1378
  allowedSources: AllowedSources[];
1307
1379
  tags: StrategyTag[];
1308
- }): IStrategyMetadata<UniversalStrategySettings> => ({
1309
- id: `evergreen_${params.tokenSymbol.toLowerCase()}`,
1310
- name: `${params.tokenSymbol} Evergreen`,
1311
- description: getDescription(params.tokenSymbol, params.allowedSources),
1312
- address: ContractAddr.from(params.address),
1313
- launchBlock: 0,
1314
- type: "ERC4626" as const,
1315
- vaultType: {
1316
- type: VaultType.FARMING,
1317
- description: "this is a yield farming vault"
1318
- },
1319
- depositTokens: [
1320
- Global.getDefaultTokens().find((token) => token.symbol === params.tokenSymbol)!
1321
- ],
1322
- additionalInfo: getLooperSettings(
1323
- params.token1Symbol,
1324
- params.token2Symbol,
1325
- params.vaultSettings,
1326
- VesuPools.Genesis,
1327
- VesuPools.Genesis
1328
- ),
1329
- risk: getUniversalRisk(),
1330
- auditUrl: AUDIT_URL,
1331
- protocols: [Protocols.VESU],
1332
- settings: createUniversalSettings(params.tokenSymbol, params.maxTVLDecimals),
1333
- contractDetails: getContractDetails(params.vaultSettings),
1334
- faqs: getFAQs(),
1335
- investmentSteps: investmentSteps,
1336
- category: StrategyCategory.META_VAULTS,
1337
- tags: params.tags,
1338
- security: EVERGREEN_SECURITY,
1339
- redemptionInfo: EVERGREEN_REDEMPTION_INFO
1340
- });
1380
+ }): IStrategyMetadata<UniversalStrategySettings> => {
1381
+ const isUSDT = params.tokenSymbol === "USDT";
1382
+ return {
1383
+ id: `evergreen_${params.tokenSymbol.toLowerCase()}`,
1384
+ name: `${params.tokenSymbol} Evergreen`,
1385
+ description: getDescription(params.tokenSymbol, params.allowedSources),
1386
+ address: ContractAddr.from(params.address),
1387
+ launchBlock: 0,
1388
+ type: "ERC4626" as const,
1389
+ vaultType: {
1390
+ type: VaultType.META_VAULT,
1391
+ description: "Automatically allocates funds to the best available yield source in the ecosystem"
1392
+ },
1393
+ depositTokens: [
1394
+ Global.getDefaultTokens().find((token) => token.symbol === params.tokenSymbol)!
1395
+ ],
1396
+ additionalInfo: getLooperSettings(
1397
+ params.token1Symbol,
1398
+ params.token2Symbol,
1399
+ params.vaultSettings,
1400
+ VesuPools.Genesis,
1401
+ VesuPools.Genesis
1402
+ ),
1403
+ risk: getUniversalRisk(),
1404
+ auditUrl: AUDIT_URL,
1405
+ protocols: [Protocols.VESU],
1406
+ realizedApyMethodology: "The realizedAPY is based on past 14 days performance by the vault",
1407
+ feeBps: {
1408
+ performanceFeeBps: 1000,
1409
+ },
1410
+ curator: UnwrapLabsCurator,
1411
+ settings: createUniversalSettings(params.tokenSymbol),
1412
+ contractDetails: getContractDetails(params.vaultSettings),
1413
+ faqs: getFAQs(),
1414
+ investmentSteps: investmentSteps,
1415
+ tags: params.tags,
1416
+ security: EVERGREEN_SECURITY,
1417
+ redemptionInfo: EVERGREEN_REDEMPTION_INFO,
1418
+ discontinuationInfo: isUSDT ? {
1419
+ info: "This strategy has been retired and is no longer accepting new deposits."
1420
+ } : undefined,
1421
+ usualTimeToEarnings: null,
1422
+ usualTimeToEarningsDescription: null,
1423
+ };
1424
+ };
1341
1425
 
1342
1426
  export const UniversalStrategies: IStrategyMetadata<UniversalStrategySettings>[] =
1343
1427
  [
@@ -1347,9 +1431,8 @@ export const UniversalStrategies: IStrategyMetadata<UniversalStrategySettings>[]
1347
1431
  vaultSettings: usdcVaultSettings,
1348
1432
  token1Symbol: "USDC.e",
1349
1433
  token2Symbol: "ETH",
1350
- maxTVLDecimals: 6,
1351
1434
  allowedSources: ["vesu", "extended"],
1352
- tags: [StrategyTag.EVERGREEN]
1435
+ tags: [StrategyTag.META_VAULT]
1353
1436
  }),
1354
1437
  createUniversalStrategy({
1355
1438
  tokenSymbol: "WBTC",
@@ -1357,9 +1440,8 @@ export const UniversalStrategies: IStrategyMetadata<UniversalStrategySettings>[]
1357
1440
  vaultSettings: wbtcVaultSettings,
1358
1441
  token1Symbol: "WBTC",
1359
1442
  token2Symbol: "ETH",
1360
- maxTVLDecimals: 8,
1361
1443
  allowedSources: ["vesu", "endur", "extended"],
1362
- tags: [StrategyTag.BTC, StrategyTag.EVERGREEN]
1444
+ tags: [StrategyTag.BTC, StrategyTag.META_VAULT]
1363
1445
  }),
1364
1446
  createUniversalStrategy({
1365
1447
  tokenSymbol: "ETH",
@@ -1367,9 +1449,8 @@ export const UniversalStrategies: IStrategyMetadata<UniversalStrategySettings>[]
1367
1449
  vaultSettings: ethVaultSettings,
1368
1450
  token1Symbol: "ETH",
1369
1451
  token2Symbol: "WBTC",
1370
- maxTVLDecimals: 18,
1371
1452
  allowedSources: ["vesu", "extended"],
1372
- tags: [StrategyTag.EVERGREEN]
1453
+ tags: [StrategyTag.META_VAULT]
1373
1454
  }),
1374
1455
  createUniversalStrategy({
1375
1456
  tokenSymbol: "STRK",
@@ -1377,9 +1458,8 @@ export const UniversalStrategies: IStrategyMetadata<UniversalStrategySettings>[]
1377
1458
  vaultSettings: strkVaultSettings,
1378
1459
  token1Symbol: "STRK",
1379
1460
  token2Symbol: "ETH",
1380
- maxTVLDecimals: 18,
1381
1461
  allowedSources: ["vesu", "endur", "extended"],
1382
- tags: [StrategyTag.EVERGREEN]
1462
+ tags: [StrategyTag.META_VAULT]
1383
1463
  }),
1384
1464
  createUniversalStrategy({
1385
1465
  tokenSymbol: "USDT",
@@ -1387,8 +1467,7 @@ export const UniversalStrategies: IStrategyMetadata<UniversalStrategySettings>[]
1387
1467
  vaultSettings: usdtVaultSettings,
1388
1468
  token1Symbol: "USDT",
1389
1469
  token2Symbol: "ETH",
1390
- maxTVLDecimals: 6,
1391
1470
  allowedSources: ["vesu"],
1392
- tags: [StrategyTag.EVERGREEN]
1471
+ tags: [StrategyTag.META_VAULT]
1393
1472
  })
1394
1473
  ];
@@ -10,7 +10,6 @@ import {
10
10
  IStrategyMetadata,
11
11
  RiskFactor,
12
12
  RiskType,
13
- StrategyCategory,
14
13
  StrategyTag,
15
14
  AuditStatus,
16
15
  SourceCodeType,
@@ -19,6 +18,7 @@ import {
19
18
  StrategySettings,
20
19
  StrategyLiveStatus,
21
20
  VaultType,
21
+ UnwrapLabsCurator,
22
22
  } from "@/interfaces";
23
23
  import { AvnuWrapper, Pricer, SwapInfo } from "@/modules";
24
24
  import { Account, CairoCustomEnum, Contract, num, uint256, BlockIdentifier } from "starknet";
@@ -36,7 +36,7 @@ import {
36
36
  import { getAPIUsingHeadlessBrowser } from "@/node/headless";
37
37
  import { HarvestInfo, VesuHarvests } from "@/modules/harvests";
38
38
  import VesuPoolIDs from "@/data/vesu_pools.json";
39
- import { COMMON_CONTRACTS, ENDPOINTS } from "./constants";
39
+ import { ENDPOINTS } from "./constants";
40
40
 
41
41
  interface PoolProps {
42
42
  pool_id: ContractAddr;
@@ -1032,9 +1032,8 @@ const createVesuRebalanceSettings = (tokenSymbol: string): StrategySettings => {
1032
1032
  (t) => t.symbol === tokenSymbol
1033
1033
  )!;
1034
1034
  return {
1035
- maxTVL: Web3Number.fromWei("0", depositToken.decimals),
1036
1035
  isPaused: false,
1037
- liveStatus: StrategyLiveStatus.ACTIVE,
1036
+ liveStatus: StrategyLiveStatus.DEPRECATED,
1038
1037
  isAudited: true,
1039
1038
  isInstantWithdrawal: true,
1040
1039
  quoteToken: depositToken,
@@ -1044,25 +1043,27 @@ const createVesuRebalanceSettings = (tokenSymbol: string): StrategySettings => {
1044
1043
 
1045
1044
  // Helper to create a Vesu Rebalance strategy
1046
1045
  const createVesuRebalanceStrategy = (
1046
+ idSymbol: string,
1047
1047
  name: string,
1048
1048
  tokenSymbol: string,
1049
1049
  address: string
1050
1050
  ): IStrategyMetadata<VesuRebalanceSettings> => ({
1051
- id: `vesu_fusion_${tokenSymbol.toLowerCase()}`,
1051
+ id: `vesu_fusion_${idSymbol.toLowerCase()}`,
1052
1052
  name,
1053
1053
  description: _description.replace("{{TOKEN}}", tokenSymbol),
1054
1054
  address: ContractAddr.from(address),
1055
1055
  launchBlock: 0,
1056
1056
  type: "ERC4626" as const,
1057
1057
  vaultType: {
1058
- type: VaultType.FARMING,
1059
- description: "this is a yield farming vault"
1058
+ type: VaultType.META_VAULT,
1059
+ description: `Automatically diversify ${tokenSymbol} holdings into different Vesu pools while reducing risk and maximizing yield. Defi spring ${tokenSymbol} Rewards are auto-compounded as well.`
1060
1060
  },
1061
1061
  depositTokens: [
1062
1062
  Global.getDefaultTokens().find((t) => t.symbol === tokenSymbol)!
1063
1063
  ],
1064
1064
  protocols: [_protocol],
1065
1065
  auditUrl: AUDIT_URL,
1066
+ curator: UnwrapLabsCurator,
1066
1067
  settings: createVesuRebalanceSettings(tokenSymbol),
1067
1068
  risk: getVesuRebalanceRisk(),
1068
1069
  additionalInfo: {
@@ -1071,10 +1072,14 @@ const createVesuRebalanceStrategy = (
1071
1072
  faqs,
1072
1073
  contractDetails: [],
1073
1074
  investmentSteps: [],
1074
- tags: [StrategyTag.VESU],
1075
- category: StrategyCategory.ALL,
1075
+ tags: [],
1076
1076
  security: VESU_SECURITY,
1077
1077
  redemptionInfo: VESU_REDEMPTION_INFO,
1078
+ discontinuationInfo: {
1079
+ info: "This strategy has been deprecated and is no longer accepting new deposits."
1080
+ },
1081
+ usualTimeToEarnings: null,
1082
+ usualTimeToEarningsDescription: null,
1078
1083
  });
1079
1084
 
1080
1085
  // Shared security & redemption metadata for all Vesu strategies
@@ -1085,7 +1090,7 @@ const VESU_SECURITY = {
1085
1090
  contractLink: "https://github.com/trovesfi/troves-contracts",
1086
1091
  },
1087
1092
  accessControl: {
1088
- type: AccessControlType.STANDARD_ACCOUNT,
1093
+ type: AccessControlType.ROLE_BASED_ACCESS,
1089
1094
  addresses: [ContractAddr.from("0x0")],
1090
1095
  timeLock: "2 Days",
1091
1096
  },
@@ -1093,6 +1098,8 @@ const VESU_SECURITY = {
1093
1098
 
1094
1099
  const VESU_REDEMPTION_INFO = {
1095
1100
  instantWithdrawalVault: InstantWithdrawalVault.YES,
1101
+ redemptionsInfo: [],
1102
+ alerts: [],
1096
1103
  };
1097
1104
 
1098
1105
  const faqs: FAQ[] = [
@@ -1148,21 +1155,25 @@ const faqs: FAQ[] = [
1148
1155
  export const VesuRebalanceStrategies: IStrategyMetadata<VesuRebalanceSettings>[] =
1149
1156
  [
1150
1157
  createVesuRebalanceStrategy(
1158
+ 'strk',
1151
1159
  "Vesu Fusion STRK",
1152
1160
  "STRK",
1153
1161
  "0x7fb5bcb8525954a60fde4e8fb8220477696ce7117ef264775a1770e23571929"
1154
1162
  ),
1155
1163
  createVesuRebalanceStrategy(
1164
+ 'eth',
1156
1165
  "Vesu Fusion ETH",
1157
1166
  "ETH",
1158
1167
  "0x5eaf5ee75231cecf79921ff8ded4b5ffe96be718bcb3daf206690ad1a9ad0ca"
1159
1168
  ),
1160
1169
  createVesuRebalanceStrategy(
1170
+ 'usdc',
1161
1171
  "Vesu Fusion USDC.e",
1162
1172
  "USDC.e",
1163
1173
  "0xa858c97e9454f407d1bd7c57472fc8d8d8449a777c822b41d18e387816f29c"
1164
1174
  ),
1165
1175
  createVesuRebalanceStrategy(
1176
+ 'usdt',
1166
1177
  "Vesu Fusion USDT",
1167
1178
  "USDT",
1168
1179
  "0x115e94e722cfc4c77a2f15c4aefb0928c1c0029e5a57570df24c650cb7cec2c"
@@ -1176,8 +1187,7 @@ VesuRebalanceStrategies.forEach((s) => {
1176
1187
  address: s.address,
1177
1188
  name: "Vault",
1178
1189
  sourceCodeUrl: "https://github.com/strkfarm/strkfarm-contracts/tree/main/src/strategies/vesu_rebalance"
1179
- },
1180
- ...COMMON_CONTRACTS];
1190
+ }];
1181
1191
  // set docs link
1182
1192
  s.docs = "https://docs.troves.fi/p/strategies/vesu-fusion-rebalancing-vaults"
1183
1193