@strkfarm/sdk 1.2.1 → 2.0.0-dca.2

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.
Files changed (42) hide show
  1. package/dist/cli.js +9 -5
  2. package/dist/cli.mjs +9 -5
  3. package/dist/index.browser.global.js +67035 -40458
  4. package/dist/index.browser.mjs +5218 -1908
  5. package/dist/index.d.ts +478 -33
  6. package/dist/index.js +5500 -2157
  7. package/dist/index.mjs +5441 -2129
  8. package/package.json +4 -1
  9. package/src/data/ekubo-price-fethcer.abi.json +265 -0
  10. package/src/data/yoloVault.abi.json +777 -0
  11. package/src/dataTypes/_bignumber.ts +5 -0
  12. package/src/dataTypes/bignumber.browser.ts +5 -0
  13. package/src/dataTypes/bignumber.node.ts +5 -0
  14. package/src/dataTypes/index.ts +3 -2
  15. package/src/dataTypes/mynumber.ts +141 -0
  16. package/src/global.ts +42 -0
  17. package/src/index.browser.ts +2 -1
  18. package/src/interfaces/common.tsx +168 -2
  19. package/src/modules/apollo-client-config.ts +28 -0
  20. package/src/modules/avnu.ts +1 -1
  21. package/src/modules/ekubo-pricer.ts +79 -0
  22. package/src/modules/erc20.ts +18 -2
  23. package/src/modules/pragma.ts +23 -8
  24. package/src/modules/pricer-from-api.ts +150 -14
  25. package/src/modules/pricer.ts +2 -1
  26. package/src/modules/pricerBase.ts +2 -1
  27. package/src/node/pricer-redis.ts +2 -1
  28. package/src/strategies/base-strategy.ts +81 -2
  29. package/src/strategies/ekubo-cl-vault.tsx +686 -316
  30. package/src/strategies/factory.ts +159 -0
  31. package/src/strategies/index.ts +5 -1
  32. package/src/strategies/registry.ts +239 -0
  33. package/src/strategies/sensei.ts +361 -13
  34. package/src/strategies/types.ts +4 -0
  35. package/src/strategies/universal-adapters/vesu-adapter.ts +48 -27
  36. package/src/strategies/universal-lst-muliplier-strategy.tsx +1396 -463
  37. package/src/strategies/universal-strategy.tsx +287 -129
  38. package/src/strategies/vesu-rebalance.tsx +242 -146
  39. package/src/strategies/yoloVault.ts +463 -0
  40. package/src/utils/index.ts +1 -1
  41. package/src/utils/logger.node.ts +11 -4
  42. package/src/utils/strategy-utils.ts +61 -0
@@ -1,7 +1,7 @@
1
1
  import { ContractAddr, Web3Number } from "@/dataTypes";
2
2
  import { BaseStrategy, SingleActionAmount, SingleTokenInfo } from "./base-strategy";
3
3
  import { PricerBase } from "@/modules/pricerBase";
4
- import { FAQ, getNoRiskTags, IConfig, IStrategyMetadata, Protocols, RiskFactor, RiskType, VaultPosition } from "@/interfaces";
4
+ import { FAQ, getNoRiskTags, IConfig, IStrategyMetadata, Protocols, RiskFactor, RiskType, StrategyTag, VaultPosition, AuditStatus, SourceCodeType, AccessControlType, InstantWithdrawalVault, StrategyLiveStatus, StrategySettings, VaultType, RedemptionInfo } from "@/interfaces";
5
5
  import { BlockIdentifier, Call, CallData, Contract, num, uint256 } from "starknet";
6
6
  import { VesuRebalanceSettings } from "./vesu-rebalance";
7
7
  import { assert, LeafData, logger, StandardMerkleTree } from "@/utils";
@@ -11,6 +11,7 @@ import { ApproveCallParams, AvnuSwapCallParams, BaseAdapter, CommonAdapter, Flas
11
11
  import { Global } from "@/global";
12
12
  import { AvnuWrapper, ERC20 } from "@/modules";
13
13
  import { AVNU_MIDDLEWARE, VESU_SINGLETON } from "./universal-adapters/adapter-utils";
14
+ import { LSTPriceType } from "./types";
14
15
  import { HarvestInfo, VesuHarvests } from "@/modules/harvests";
15
16
 
16
17
  export interface UniversalManageCall {
@@ -174,22 +175,26 @@ export class UniversalStrategy<
174
175
  return [call];
175
176
  }
176
177
 
177
- /**
178
- * Calculates the Total Value Locked (TVL) for a specific user.
179
- * @param user - Address of the user
180
- * @returns Object containing the amount in token units and USD value
181
- */
182
- async getUserTVL(user: ContractAddr) {
183
- const shares = await this.contract.balanceOf(user.address);
184
- const assets = await this.contract.convert_to_assets(
185
- uint256.bnToUint256(shares)
178
+ async getUserTVL(user: ContractAddr, blockIdentifier: BlockIdentifier = "latest") {
179
+ const shares: any = await this.contract.call("balanceOf", [user.address], { blockIdentifier });
180
+ const assets: any = await this.contract.call(
181
+ "convert_to_assets",
182
+ [uint256.bnToUint256(shares)],
183
+ { blockIdentifier }
186
184
  );
187
185
  const amount = Web3Number.fromWei(
188
186
  assets.toString(),
189
187
  this.metadata.depositTokens[0].decimals
190
188
  );
189
+
190
+ // Convert blockIdentifier to block number for pricer if it's a number
191
+ const blockNumber = typeof blockIdentifier === 'number' || typeof blockIdentifier === 'bigint'
192
+ ? Number(blockIdentifier)
193
+ : undefined;
194
+
191
195
  let price = await this.pricer.getPrice(
192
- this.metadata.depositTokens[0].symbol
196
+ this.metadata.depositTokens[0].symbol,
197
+ blockNumber
193
198
  );
194
199
  const usdValue = Number(amount.toFixed(6)) * price.price;
195
200
  return {
@@ -208,7 +213,7 @@ export class UniversalStrategy<
208
213
  });
209
214
  logger.verbose(`${this.metadata.name}::netAPY: vesu-pools: ${JSON.stringify(pools)}`);
210
215
  if (pools.some(p => !p)) {
211
- throw new Error('Pool not found');
216
+ throw new Error(`Pool not found, available pools: ${allVesuPools.pools.length}, requiredPools: ${JSON.stringify(vesuAdapters.map(v => v.config.poolId))}`);
212
217
  };
213
218
  const positions = await this.getVesuPositions();
214
219
  logger.verbose(`${this.metadata.name}::netAPY: positions: ${JSON.stringify(positions)}`);
@@ -305,6 +310,100 @@ export class UniversalStrategy<
305
310
  return weightedSum / currentAUM.toNumber();
306
311
  }
307
312
 
313
+ /**
314
+ * Calculates user realized APY based on trueSharesBasedAPY method.
315
+ * Returns the APY as a number.
316
+ */
317
+ async getUserRealizedAPY(
318
+ blockIdentifier: BlockIdentifier = "latest",
319
+ sinceBlocks = 600000
320
+ ): Promise<number> {
321
+ logger.verbose(
322
+ `${this.getTag()}: getUserRealizedAPY => starting with blockIdentifier=${blockIdentifier}, sinceBlocks=${sinceBlocks}`
323
+ );
324
+
325
+ // Determine current block number and timestamp
326
+ let blockNow =
327
+ typeof blockIdentifier === "number" || typeof blockIdentifier === "bigint"
328
+ ? Number(blockIdentifier)
329
+ : (await this.config.provider.getBlockLatestAccepted()).block_number;
330
+ const blockNowTime =
331
+ typeof blockIdentifier === "number" || typeof blockIdentifier === "bigint"
332
+ ? (await this.config.provider.getBlockWithTxs(blockIdentifier)).timestamp
333
+ : new Date().getTime() / 1000;
334
+
335
+ // Look back window, but never before launch block
336
+ const blockBefore = Math.max(
337
+ blockNow - sinceBlocks,
338
+ this.metadata.launchBlock
339
+ );
340
+
341
+ // TVL amounts (in underlying token units) and supply at current reference block
342
+ const assetsNowRaw: bigint = await this.contract.call("total_assets", [], {
343
+ blockIdentifier,
344
+ }) as bigint;
345
+ const amountNow = Web3Number.fromWei(
346
+ assetsNowRaw.toString(),
347
+ this.metadata.depositTokens[0].decimals
348
+ );
349
+
350
+ const supplyNowRaw: bigint = await this.contract.call("total_supply", [], {
351
+ blockIdentifier,
352
+ }) as bigint;
353
+ const supplyNow = Web3Number.fromWei(supplyNowRaw.toString(), 18);
354
+
355
+ // Historical TVL and supply
356
+ const assetsBeforeRaw: bigint = await this.contract.call(
357
+ "total_assets",
358
+ [],
359
+ { blockIdentifier: blockBefore }
360
+ ) as bigint;
361
+ const amountBefore = Web3Number.fromWei(
362
+ assetsBeforeRaw.toString(),
363
+ this.metadata.depositTokens[0].decimals
364
+ );
365
+
366
+ const supplyBeforeRaw: bigint = await this.contract.call(
367
+ "total_supply",
368
+ [],
369
+ { blockIdentifier: blockBefore }
370
+ ) as bigint;
371
+ const supplyBefore = Web3Number.fromWei(supplyBeforeRaw.toString(), 18);
372
+
373
+ const blockBeforeInfo = await this.config.provider.getBlockWithTxs(
374
+ blockBefore
375
+ );
376
+
377
+ // Calculate assets per share
378
+ const assetsPerShareNow = amountNow
379
+ .multipliedBy(1e18)
380
+ .dividedBy(supplyNow.toString());
381
+
382
+ const assetsPerShareBf = amountBefore
383
+ .multipliedBy(1e18)
384
+ .dividedBy(supplyBefore.toString());
385
+
386
+ const timeDiffSeconds = blockNowTime - blockBeforeInfo.timestamp;
387
+
388
+ logger.verbose(`${this.getTag()} [getUserRealizedAPY] assetsNow: ${amountNow.toString()}`);
389
+ logger.verbose(`${this.getTag()} [getUserRealizedAPY] assetsBefore: ${amountBefore.toString()}`);
390
+ logger.verbose(`${this.getTag()} [getUserRealizedAPY] assetsPerShareNow: ${assetsPerShareNow.toString()}`);
391
+ logger.verbose(`${this.getTag()} [getUserRealizedAPY] assetsPerShareBf: ${assetsPerShareBf.toString()}`);
392
+ logger.verbose(`${this.getTag()} [getUserRealizedAPY] Supply before: ${supplyBefore.toString()}`);
393
+ logger.verbose(`${this.getTag()} [getUserRealizedAPY] Supply now: ${supplyNow.toString()}`);
394
+ logger.verbose(`${this.getTag()} [getUserRealizedAPY] Time diff in seconds: ${timeDiffSeconds}`);
395
+
396
+ const apyForGivenBlocks =
397
+ Number(
398
+ assetsPerShareNow
399
+ .minus(assetsPerShareBf)
400
+ .multipliedBy(10000)
401
+ .dividedBy(assetsPerShareBf)
402
+ ) / 10000;
403
+
404
+ return (apyForGivenBlocks * (365 * 24 * 3600)) / timeDiffSeconds;
405
+ }
406
+
308
407
  /**
309
408
  * Calculates the total TVL of the strategy.
310
409
  * @returns Object containing the total amount in token units and USD value
@@ -337,7 +436,7 @@ export class UniversalStrategy<
337
436
  };
338
437
  }
339
438
 
340
- protected async getVesuAUM(adapter: VesuAdapter) {
439
+ protected async getVesuAUM(adapter: VesuAdapter, _priceType?: LSTPriceType) {
341
440
  const legAUM = await adapter.getPositions(this.config);
342
441
  const underlying = this.asset();
343
442
  let vesuAum = Web3Number.fromWei("0", underlying.decimals);
@@ -370,7 +469,7 @@ export class UniversalStrategy<
370
469
  return prevAum;
371
470
  }
372
471
 
373
- async getAUM(): Promise<{net: SingleTokenInfo, prevAum: Web3Number, splits: {id: string, aum: Web3Number}[]}> {
472
+ async getAUM(unrealizedAUM?: boolean): Promise<{net: SingleTokenInfo, prevAum: Web3Number, splits: {id: string, aum: Web3Number}[]}> {
374
473
  const prevAum = await this.getPrevAUM();
375
474
  const token1Price = await this.pricer.getPrice(this.metadata.depositTokens[0].symbol);
376
475
 
@@ -378,7 +477,9 @@ export class UniversalStrategy<
378
477
  const vesuAdapters = this.getVesuAdapters();
379
478
  let vesuAum = Web3Number.fromWei("0", this.asset().decimals);
380
479
  for (const adapter of vesuAdapters) {
381
- vesuAum = vesuAum.plus(await this.getVesuAUM(adapter));
480
+ const priceType = unrealizedAUM ? LSTPriceType.ENDUR_PRICE : LSTPriceType.AVNU_PRICE;
481
+ const aumValue = await this.getVesuAUM(adapter, priceType);
482
+ vesuAum = vesuAum.plus(aumValue);
382
483
  }
383
484
 
384
485
  // account unused balance as aum as well (from vault allocator)
@@ -997,7 +1098,6 @@ export default function MetaVaultDescription(allowedSources: AllowedSources[]) {
997
1098
  const containerStyle = {
998
1099
  maxWidth: "800px",
999
1100
  margin: "0 auto",
1000
- backgroundColor: "#111",
1001
1101
  color: "#eee",
1002
1102
  fontFamily: "Arial, sans-serif",
1003
1103
  borderRadius: "12px",
@@ -1024,7 +1124,6 @@ export default function MetaVaultDescription(allowedSources: AllowedSources[]) {
1024
1124
  <h1 style={{ fontSize: "18px", marginBottom: "10px" }}>Meta Vault — Automated Yield Router</h1>
1025
1125
  <p style={{ fontSize: "14px", lineHeight: "1.5", marginBottom: "16px" }}>
1026
1126
  This Evergreen vault is a tokenized Meta Vault, auto-compounding strategy that continuously allocates your deposited
1027
- asset to the best available yield source in the ecosystem. Depositors receive vault shares that
1028
1127
  represent a proportional claim on the underlying assets and accrued yield. Allocation shifts are
1029
1128
  handled programmatically based on on-chain signals and risk filters, minimizing idle capital and
1030
1129
  maximizing net APY.
@@ -1141,116 +1240,175 @@ const investmentSteps: string[] = [
1141
1240
  ]
1142
1241
 
1143
1242
  const AUDIT_URL = 'https://docs.troves.fi/p/security#starknet-vault-kit'
1243
+
1244
+ // Helper to create common risk object
1245
+ const getUniversalRisk = () => ({
1246
+ riskFactor: _riskFactor,
1247
+ netRisk:
1248
+ _riskFactor.reduce((acc, curr) => acc + curr.value * curr.weight, 0) /
1249
+ _riskFactor.reduce((acc, curr) => acc + curr.weight, 0),
1250
+ notARisks: getNoRiskTags(_riskFactor)
1251
+ });
1252
+
1253
+ // Helper to create Universal strategy settings
1254
+ const createUniversalSettings = (
1255
+ tokenSymbol: string,
1256
+ maxTVLDecimals: number
1257
+ ): StrategySettings => {
1258
+ const isUSDT = tokenSymbol === "USDT";
1259
+ return {
1260
+ maxTVL: Web3Number.fromWei(0, maxTVLDecimals),
1261
+ isAudited: true,
1262
+ liveStatus: isUSDT ? StrategyLiveStatus.RETIRED : StrategyLiveStatus.ACTIVE,
1263
+ isPaused: isUSDT,
1264
+ isInstantWithdrawal: false,
1265
+ hideHarvestInfo: true,
1266
+ quoteToken: Global.getDefaultTokens().find(
1267
+ (token) => token.symbol === tokenSymbol
1268
+ )!,
1269
+ alerts: [
1270
+ {
1271
+ tab: "withdraw" as const,
1272
+ 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.",
1273
+ type: "info" as const
1274
+ }
1275
+ ],
1276
+ showWithdrawalWarningModal: true
1277
+ };
1278
+ };
1279
+
1280
+ const EVERGREEN_SECURITY = {
1281
+ auditStatus: AuditStatus.AUDITED,
1282
+ sourceCode: {
1283
+ type: SourceCodeType.CLOSED_SOURCE,
1284
+ contractLink: "https://github.com/trovesfi/troves-contracts",
1285
+ },
1286
+ accessControl: {
1287
+ type: AccessControlType.STANDARD_ACCOUNT,
1288
+ addresses: [ContractAddr.from("0x0")],
1289
+ timeLock: "2 Days",
1290
+ },
1291
+ };
1292
+
1293
+ const EVERGREEN_REDEMPTION_INFO: RedemptionInfo = {
1294
+ instantWithdrawalVault: InstantWithdrawalVault.NO,
1295
+ redemptionsInfo: [{
1296
+ title: "Typical Duration",
1297
+ description: "1-2 hours"
1298
+ }],
1299
+ alerts: [{
1300
+ type: 'info',
1301
+ 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.',
1302
+ tab: 'withdraw'
1303
+ }]
1304
+ };
1305
+
1306
+ // Helper to create a Universal strategy
1307
+ const createUniversalStrategy = (params: {
1308
+ tokenSymbol: string;
1309
+ address: string;
1310
+ vaultSettings: UniversalStrategySettings;
1311
+ token1Symbol: string;
1312
+ token2Symbol: string;
1313
+ maxTVLDecimals: number;
1314
+ allowedSources: AllowedSources[];
1315
+ tags: StrategyTag[];
1316
+ }): IStrategyMetadata<UniversalStrategySettings> => {
1317
+ const isUSDT = params.tokenSymbol === "USDT";
1318
+ return {
1319
+ id: `evergreen_${params.tokenSymbol.toLowerCase()}`,
1320
+ name: `${params.tokenSymbol} Evergreen`,
1321
+ description: getDescription(params.tokenSymbol, params.allowedSources),
1322
+ address: ContractAddr.from(params.address),
1323
+ launchBlock: 0,
1324
+ type: "ERC4626" as const,
1325
+ vaultType: {
1326
+ type: VaultType.META_VAULT,
1327
+ description: "Automatically allocates funds to the best available yield source in the ecosystem"
1328
+ },
1329
+ depositTokens: [
1330
+ Global.getDefaultTokens().find((token) => token.symbol === params.tokenSymbol)!
1331
+ ],
1332
+ additionalInfo: getLooperSettings(
1333
+ params.token1Symbol,
1334
+ params.token2Symbol,
1335
+ params.vaultSettings,
1336
+ VesuPools.Genesis,
1337
+ VesuPools.Genesis
1338
+ ),
1339
+ risk: getUniversalRisk(),
1340
+ auditUrl: AUDIT_URL,
1341
+ protocols: [Protocols.VESU],
1342
+ realizedAPYMethodology: "The realizedAPY is based on past 14 days performance by the vault",
1343
+ curator: {
1344
+ name: "Unwrap Labs",
1345
+ logo: "https://assets.troves.fi/integrations/unwraplabs/white.png"
1346
+ },
1347
+ settings: createUniversalSettings(params.tokenSymbol, params.maxTVLDecimals),
1348
+ contractDetails: getContractDetails(params.vaultSettings),
1349
+ faqs: getFAQs(),
1350
+ investmentSteps: investmentSteps,
1351
+ tags: params.tags,
1352
+ security: EVERGREEN_SECURITY,
1353
+ redemptionInfo: EVERGREEN_REDEMPTION_INFO,
1354
+ discontinuationInfo: isUSDT ? {
1355
+ info: "This strategy has been retired and is no longer accepting new deposits."
1356
+ } : undefined,
1357
+ usualTimeToEarnings: null,
1358
+ usualTimeToEarningsDescription: null,
1359
+ };
1360
+ };
1361
+
1144
1362
  export const UniversalStrategies: IStrategyMetadata<UniversalStrategySettings>[] =
1145
- [
1146
- {
1147
- name: "USDC.e Evergreen",
1148
- description: getDescription('USDC.e', ['vesu', 'extended']),
1149
- address: ContractAddr.from('0x7e6498cf6a1bfc7e6fc89f1831865e2dacb9756def4ec4b031a9138788a3b5e'),
1150
- launchBlock: 0,
1151
- type: 'ERC4626',
1152
- depositTokens: [Global.getDefaultTokens().find(token => token.symbol === 'USDC.e')!],
1153
- additionalInfo: getLooperSettings('USDC.e', 'ETH', usdcVaultSettings, VesuPools.Genesis, VesuPools.Genesis),
1154
- risk: {
1155
- riskFactor: _riskFactor,
1156
- netRisk:
1157
- _riskFactor.reduce((acc, curr) => acc + curr.value * curr.weight, 0) /
1158
- _riskFactor.reduce((acc, curr) => acc + curr.weight, 0),
1159
- notARisks: getNoRiskTags(_riskFactor)
1160
- },
1161
- auditUrl: AUDIT_URL,
1162
- protocols: [Protocols.VESU],
1163
- maxTVL: Web3Number.fromWei(0, 6),
1164
- contractDetails: getContractDetails(usdcVaultSettings),
1165
- faqs: getFAQs(),
1166
- investmentSteps: investmentSteps,
1167
- },
1168
- {
1169
- name: "WBTC Evergreen",
1170
- description: getDescription('WBTC', ['vesu', 'endur', 'extended']),
1171
- address: ContractAddr.from('0x5a4c1651b913aa2ea7afd9024911603152a19058624c3e425405370d62bf80c'),
1172
- launchBlock: 0,
1173
- type: 'ERC4626',
1174
- depositTokens: [Global.getDefaultTokens().find(token => token.symbol === 'WBTC')!],
1175
- additionalInfo: getLooperSettings('WBTC', 'ETH', wbtcVaultSettings, VesuPools.Genesis, VesuPools.Genesis),
1176
- risk: {
1177
- riskFactor: _riskFactor,
1178
- netRisk:
1179
- _riskFactor.reduce((acc, curr) => acc + curr.value * curr.weight, 0) /
1180
- _riskFactor.reduce((acc, curr) => acc + curr.weight, 0),
1181
- notARisks: getNoRiskTags(_riskFactor)
1182
- },
1183
- protocols: [Protocols.VESU],
1184
- maxTVL: Web3Number.fromWei(0, 8),
1185
- contractDetails: getContractDetails(wbtcVaultSettings),
1186
- faqs: getFAQs(),
1187
- investmentSteps: investmentSteps,
1188
- auditUrl: AUDIT_URL,
1189
- },
1190
- {
1191
- name: "ETH Evergreen",
1192
- description: getDescription('ETH', ['vesu', 'extended']),
1193
- address: ContractAddr.from('0x446c22d4d3f5cb52b4950ba832ba1df99464c6673a37c092b1d9622650dbd8'),
1194
- launchBlock: 0,
1195
- type: 'ERC4626',
1196
- depositTokens: [Global.getDefaultTokens().find(token => token.symbol === 'ETH')!],
1197
- additionalInfo: getLooperSettings('ETH', 'WBTC', ethVaultSettings, VesuPools.Genesis, VesuPools.Genesis),
1198
- risk: {
1199
- riskFactor: _riskFactor,
1200
- netRisk:
1201
- _riskFactor.reduce((acc, curr) => acc + curr.value * curr.weight, 0) /
1202
- _riskFactor.reduce((acc, curr) => acc + curr.weight, 0),
1203
- notARisks: getNoRiskTags(_riskFactor)
1204
- },
1205
- protocols: [Protocols.VESU],
1206
- maxTVL: Web3Number.fromWei(0, 18),
1207
- contractDetails: getContractDetails(ethVaultSettings),
1208
- faqs: getFAQs(),
1209
- investmentSteps: investmentSteps,
1210
- auditUrl: AUDIT_URL,
1211
- },
1212
- {
1213
- name: "STRK Evergreen",
1214
- description: getDescription('STRK', ['vesu', 'endur', 'extended']),
1215
- address: ContractAddr.from('0x55d012f57e58c96e0a5c7ebbe55853989d01e6538b15a95e7178aca4af05c21'),
1216
- launchBlock: 0,
1217
- type: 'ERC4626',
1218
- depositTokens: [Global.getDefaultTokens().find(token => token.symbol === 'STRK')!],
1219
- additionalInfo: getLooperSettings('STRK', 'ETH', strkVaultSettings, VesuPools.Genesis, VesuPools.Genesis),
1220
- risk: {
1221
- riskFactor: _riskFactor,
1222
- netRisk:
1223
- _riskFactor.reduce((acc, curr) => acc + curr.value * curr.weight, 0) /
1224
- _riskFactor.reduce((acc, curr) => acc + curr.weight, 0),
1225
- notARisks: getNoRiskTags(_riskFactor)
1226
- },
1227
- protocols: [Protocols.VESU],
1228
- maxTVL: Web3Number.fromWei(0, 18),
1229
- contractDetails: getContractDetails(strkVaultSettings),
1230
- faqs: getFAQs(),
1231
- investmentSteps: investmentSteps,
1232
- auditUrl: AUDIT_URL,
1233
- },
1234
- {
1235
- name: "USDT Evergreen",
1236
- description: getDescription('USDT', ['vesu']),
1237
- address: ContractAddr.from('0x1c4933d1880c6778585e597154eaca7b428579d72f3aae425ad2e4d26c6bb3'),
1238
- launchBlock: 0,
1239
- type: 'ERC4626',
1240
- depositTokens: [Global.getDefaultTokens().find(token => token.symbol === 'USDT')!],
1241
- additionalInfo: getLooperSettings('USDT', 'ETH', usdtVaultSettings, VesuPools.Genesis, VesuPools.Genesis),
1242
- risk: {
1243
- riskFactor: _riskFactor,
1244
- netRisk:
1245
- _riskFactor.reduce((acc, curr) => acc + curr.value * curr.weight, 0) /
1246
- _riskFactor.reduce((acc, curr) => acc + curr.weight, 0),
1247
- notARisks: getNoRiskTags(_riskFactor)
1248
- },
1249
- protocols: [Protocols.VESU],
1250
- maxTVL: Web3Number.fromWei(0, 6),
1251
- contractDetails: getContractDetails(usdtVaultSettings),
1252
- faqs: getFAQs(),
1253
- investmentSteps: investmentSteps,
1254
- auditUrl: AUDIT_URL,
1255
- }
1256
- ]
1363
+ [
1364
+ createUniversalStrategy({
1365
+ tokenSymbol: "USDC.e",
1366
+ address: "0x7e6498cf6a1bfc7e6fc89f1831865e2dacb9756def4ec4b031a9138788a3b5e",
1367
+ vaultSettings: usdcVaultSettings,
1368
+ token1Symbol: "USDC.e",
1369
+ token2Symbol: "ETH",
1370
+ maxTVLDecimals: 6,
1371
+ allowedSources: ["vesu", "extended"],
1372
+ tags: [StrategyTag.META_VAULT]
1373
+ }),
1374
+ createUniversalStrategy({
1375
+ tokenSymbol: "WBTC",
1376
+ address: "0x5a4c1651b913aa2ea7afd9024911603152a19058624c3e425405370d62bf80c",
1377
+ vaultSettings: wbtcVaultSettings,
1378
+ token1Symbol: "WBTC",
1379
+ token2Symbol: "ETH",
1380
+ maxTVLDecimals: 8,
1381
+ allowedSources: ["vesu", "endur", "extended"],
1382
+ tags: [StrategyTag.BTC, StrategyTag.META_VAULT]
1383
+ }),
1384
+ createUniversalStrategy({
1385
+ tokenSymbol: "ETH",
1386
+ address: "0x446c22d4d3f5cb52b4950ba832ba1df99464c6673a37c092b1d9622650dbd8",
1387
+ vaultSettings: ethVaultSettings,
1388
+ token1Symbol: "ETH",
1389
+ token2Symbol: "WBTC",
1390
+ maxTVLDecimals: 18,
1391
+ allowedSources: ["vesu", "extended"],
1392
+ tags: [StrategyTag.META_VAULT]
1393
+ }),
1394
+ createUniversalStrategy({
1395
+ tokenSymbol: "STRK",
1396
+ address: "0x55d012f57e58c96e0a5c7ebbe55853989d01e6538b15a95e7178aca4af05c21",
1397
+ vaultSettings: strkVaultSettings,
1398
+ token1Symbol: "STRK",
1399
+ token2Symbol: "ETH",
1400
+ maxTVLDecimals: 18,
1401
+ allowedSources: ["vesu", "endur", "extended"],
1402
+ tags: [StrategyTag.META_VAULT]
1403
+ }),
1404
+ createUniversalStrategy({
1405
+ tokenSymbol: "USDT",
1406
+ address: "0x1c4933d1880c6778585e597154eaca7b428579d72f3aae425ad2e4d26c6bb3",
1407
+ vaultSettings: usdtVaultSettings,
1408
+ token1Symbol: "USDT",
1409
+ token2Symbol: "ETH",
1410
+ maxTVLDecimals: 6,
1411
+ allowedSources: ["vesu"],
1412
+ tags: [StrategyTag.META_VAULT]
1413
+ })
1414
+ ];