@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.
- package/dist/cli.js +9 -5
- package/dist/cli.mjs +9 -5
- package/dist/index.browser.global.js +67035 -40458
- package/dist/index.browser.mjs +5218 -1908
- package/dist/index.d.ts +478 -33
- package/dist/index.js +5500 -2157
- package/dist/index.mjs +5441 -2129
- package/package.json +4 -1
- package/src/data/ekubo-price-fethcer.abi.json +265 -0
- package/src/data/yoloVault.abi.json +777 -0
- 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/dataTypes/index.ts +3 -2
- package/src/dataTypes/mynumber.ts +141 -0
- package/src/global.ts +42 -0
- package/src/index.browser.ts +2 -1
- package/src/interfaces/common.tsx +168 -2
- package/src/modules/apollo-client-config.ts +28 -0
- package/src/modules/avnu.ts +1 -1
- package/src/modules/ekubo-pricer.ts +79 -0
- package/src/modules/erc20.ts +18 -2
- package/src/modules/pragma.ts +23 -8
- package/src/modules/pricer-from-api.ts +150 -14
- package/src/modules/pricer.ts +2 -1
- package/src/modules/pricerBase.ts +2 -1
- package/src/node/pricer-redis.ts +2 -1
- package/src/strategies/base-strategy.ts +81 -2
- package/src/strategies/ekubo-cl-vault.tsx +686 -316
- package/src/strategies/factory.ts +159 -0
- package/src/strategies/index.ts +5 -1
- package/src/strategies/registry.ts +239 -0
- package/src/strategies/sensei.ts +361 -13
- package/src/strategies/types.ts +4 -0
- package/src/strategies/universal-adapters/vesu-adapter.ts +48 -27
- package/src/strategies/universal-lst-muliplier-strategy.tsx +1396 -463
- package/src/strategies/universal-strategy.tsx +287 -129
- package/src/strategies/vesu-rebalance.tsx +242 -146
- package/src/strategies/yoloVault.ts +463 -0
- package/src/utils/index.ts +1 -1
- package/src/utils/logger.node.ts +11 -4
- 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
|
-
|
|
179
|
-
|
|
180
|
-
|
|
181
|
-
|
|
182
|
-
|
|
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(
|
|
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
|
-
|
|
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
|
-
|
|
1148
|
-
|
|
1149
|
-
|
|
1150
|
-
|
|
1151
|
-
|
|
1152
|
-
|
|
1153
|
-
|
|
1154
|
-
|
|
1155
|
-
|
|
1156
|
-
|
|
1157
|
-
|
|
1158
|
-
|
|
1159
|
-
|
|
1160
|
-
|
|
1161
|
-
|
|
1162
|
-
|
|
1163
|
-
|
|
1164
|
-
|
|
1165
|
-
|
|
1166
|
-
|
|
1167
|
-
|
|
1168
|
-
|
|
1169
|
-
|
|
1170
|
-
|
|
1171
|
-
|
|
1172
|
-
|
|
1173
|
-
|
|
1174
|
-
|
|
1175
|
-
|
|
1176
|
-
|
|
1177
|
-
|
|
1178
|
-
|
|
1179
|
-
|
|
1180
|
-
|
|
1181
|
-
|
|
1182
|
-
|
|
1183
|
-
|
|
1184
|
-
|
|
1185
|
-
|
|
1186
|
-
|
|
1187
|
-
|
|
1188
|
-
|
|
1189
|
-
|
|
1190
|
-
|
|
1191
|
-
|
|
1192
|
-
|
|
1193
|
-
|
|
1194
|
-
|
|
1195
|
-
|
|
1196
|
-
|
|
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
|
+
];
|