@strkfarm/sdk 2.0.0-staging.7 → 2.0.0-staging.70
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 +3117 -1030
- package/dist/index.browser.mjs +2806 -711
- package/dist/index.d.ts +345 -50
- package/dist/index.js +2901 -794
- package/dist/index.mjs +2809 -711
- package/package.json +4 -4
- package/src/data/universal-vault.abi.json +143 -27
- package/src/dataTypes/_bignumber.ts +5 -0
- package/src/dataTypes/bignumber.browser.ts +5 -0
- package/src/dataTypes/bignumber.node.ts +5 -0
- package/src/global.ts +53 -1
- package/src/interfaces/common.tsx +77 -27
- package/src/modules/avnu.ts +1 -1
- package/src/modules/erc20.ts +18 -2
- package/src/modules/index.ts +3 -1
- package/src/modules/pricer-avnu-api.ts +114 -0
- package/src/modules/pricer.ts +63 -45
- package/src/node/pricer-redis.ts +1 -0
- package/src/strategies/base-strategy.ts +153 -8
- package/src/strategies/constants.ts +2 -2
- package/src/strategies/ekubo-cl-vault.tsx +254 -91
- package/src/strategies/factory.ts +21 -1
- package/src/strategies/index.ts +2 -0
- package/src/strategies/registry.ts +15 -30
- package/src/strategies/sensei.ts +52 -13
- package/src/strategies/types.ts +4 -0
- package/src/strategies/universal-adapters/vesu-adapter.ts +46 -25
- package/src/strategies/universal-lst-muliplier-strategy.tsx +1461 -584
- package/src/strategies/universal-strategy.tsx +157 -81
- package/src/strategies/vesu-rebalance.tsx +22 -12
- package/src/strategies/yoloVault.ts +1081 -0
- package/src/utils/strategy-utils.ts +6 -2
|
@@ -1,7 +1,13 @@
|
|
|
1
1
|
import { ContractAddr, Web3Number } from "@/dataTypes";
|
|
2
|
-
import {
|
|
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,
|
|
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(
|
|
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
|
-
|
|
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
|
-
|
|
1256
|
-
|
|
1257
|
-
|
|
1258
|
-
|
|
1259
|
-
|
|
1260
|
-
|
|
1261
|
-
|
|
1262
|
-
|
|
1263
|
-
|
|
1264
|
-
|
|
1265
|
-
|
|
1266
|
-
|
|
1267
|
-
|
|
1268
|
-
|
|
1269
|
-
|
|
1270
|
-
|
|
1271
|
-
|
|
1272
|
-
|
|
1273
|
-
|
|
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("
|
|
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
|
-
|
|
1292
|
-
|
|
1293
|
-
|
|
1294
|
-
|
|
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,50 @@ 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
|
-
|
|
1310
|
-
|
|
1311
|
-
|
|
1312
|
-
|
|
1313
|
-
|
|
1314
|
-
|
|
1315
|
-
|
|
1316
|
-
|
|
1317
|
-
|
|
1318
|
-
|
|
1319
|
-
|
|
1320
|
-
|
|
1321
|
-
|
|
1322
|
-
|
|
1323
|
-
|
|
1324
|
-
|
|
1325
|
-
|
|
1326
|
-
|
|
1327
|
-
|
|
1328
|
-
|
|
1329
|
-
|
|
1330
|
-
|
|
1331
|
-
|
|
1332
|
-
|
|
1333
|
-
|
|
1334
|
-
|
|
1335
|
-
|
|
1336
|
-
|
|
1337
|
-
|
|
1338
|
-
|
|
1339
|
-
|
|
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
|
+
curator: UnwrapLabsCurator,
|
|
1408
|
+
settings: createUniversalSettings(params.tokenSymbol),
|
|
1409
|
+
contractDetails: getContractDetails(params.vaultSettings),
|
|
1410
|
+
faqs: getFAQs(),
|
|
1411
|
+
investmentSteps: investmentSteps,
|
|
1412
|
+
tags: params.tags,
|
|
1413
|
+
security: EVERGREEN_SECURITY,
|
|
1414
|
+
redemptionInfo: EVERGREEN_REDEMPTION_INFO,
|
|
1415
|
+
discontinuationInfo: isUSDT ? {
|
|
1416
|
+
info: "This strategy has been retired and is no longer accepting new deposits."
|
|
1417
|
+
} : undefined,
|
|
1418
|
+
usualTimeToEarnings: null,
|
|
1419
|
+
usualTimeToEarningsDescription: null,
|
|
1420
|
+
};
|
|
1421
|
+
};
|
|
1341
1422
|
|
|
1342
1423
|
export const UniversalStrategies: IStrategyMetadata<UniversalStrategySettings>[] =
|
|
1343
1424
|
[
|
|
@@ -1347,9 +1428,8 @@ export const UniversalStrategies: IStrategyMetadata<UniversalStrategySettings>[]
|
|
|
1347
1428
|
vaultSettings: usdcVaultSettings,
|
|
1348
1429
|
token1Symbol: "USDC.e",
|
|
1349
1430
|
token2Symbol: "ETH",
|
|
1350
|
-
maxTVLDecimals: 6,
|
|
1351
1431
|
allowedSources: ["vesu", "extended"],
|
|
1352
|
-
tags: [StrategyTag.
|
|
1432
|
+
tags: [StrategyTag.META_VAULT]
|
|
1353
1433
|
}),
|
|
1354
1434
|
createUniversalStrategy({
|
|
1355
1435
|
tokenSymbol: "WBTC",
|
|
@@ -1357,9 +1437,8 @@ export const UniversalStrategies: IStrategyMetadata<UniversalStrategySettings>[]
|
|
|
1357
1437
|
vaultSettings: wbtcVaultSettings,
|
|
1358
1438
|
token1Symbol: "WBTC",
|
|
1359
1439
|
token2Symbol: "ETH",
|
|
1360
|
-
maxTVLDecimals: 8,
|
|
1361
1440
|
allowedSources: ["vesu", "endur", "extended"],
|
|
1362
|
-
tags: [StrategyTag.BTC, StrategyTag.
|
|
1441
|
+
tags: [StrategyTag.BTC, StrategyTag.META_VAULT]
|
|
1363
1442
|
}),
|
|
1364
1443
|
createUniversalStrategy({
|
|
1365
1444
|
tokenSymbol: "ETH",
|
|
@@ -1367,9 +1446,8 @@ export const UniversalStrategies: IStrategyMetadata<UniversalStrategySettings>[]
|
|
|
1367
1446
|
vaultSettings: ethVaultSettings,
|
|
1368
1447
|
token1Symbol: "ETH",
|
|
1369
1448
|
token2Symbol: "WBTC",
|
|
1370
|
-
maxTVLDecimals: 18,
|
|
1371
1449
|
allowedSources: ["vesu", "extended"],
|
|
1372
|
-
tags: [StrategyTag.
|
|
1450
|
+
tags: [StrategyTag.META_VAULT]
|
|
1373
1451
|
}),
|
|
1374
1452
|
createUniversalStrategy({
|
|
1375
1453
|
tokenSymbol: "STRK",
|
|
@@ -1377,9 +1455,8 @@ export const UniversalStrategies: IStrategyMetadata<UniversalStrategySettings>[]
|
|
|
1377
1455
|
vaultSettings: strkVaultSettings,
|
|
1378
1456
|
token1Symbol: "STRK",
|
|
1379
1457
|
token2Symbol: "ETH",
|
|
1380
|
-
maxTVLDecimals: 18,
|
|
1381
1458
|
allowedSources: ["vesu", "endur", "extended"],
|
|
1382
|
-
tags: [StrategyTag.
|
|
1459
|
+
tags: [StrategyTag.META_VAULT]
|
|
1383
1460
|
}),
|
|
1384
1461
|
createUniversalStrategy({
|
|
1385
1462
|
tokenSymbol: "USDT",
|
|
@@ -1387,8 +1464,7 @@ export const UniversalStrategies: IStrategyMetadata<UniversalStrategySettings>[]
|
|
|
1387
1464
|
vaultSettings: usdtVaultSettings,
|
|
1388
1465
|
token1Symbol: "USDT",
|
|
1389
1466
|
token2Symbol: "ETH",
|
|
1390
|
-
maxTVLDecimals: 6,
|
|
1391
1467
|
allowedSources: ["vesu"],
|
|
1392
|
-
tags: [StrategyTag.
|
|
1468
|
+
tags: [StrategyTag.META_VAULT]
|
|
1393
1469
|
})
|
|
1394
1470
|
];
|
|
@@ -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 {
|
|
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.
|
|
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_${
|
|
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.
|
|
1059
|
-
description:
|
|
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: [
|
|
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.
|
|
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
|
|