@strkfarm/sdk 2.0.0-dev.5 → 2.0.0-dev.50
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 +190 -36
- package/dist/cli.mjs +188 -34
- package/dist/index.browser.global.js +119400 -92821
- package/dist/index.browser.mjs +13293 -11146
- package/dist/index.d.ts +2281 -1938
- package/dist/index.js +13532 -11179
- package/dist/index.mjs +14165 -11836
- package/package.json +59 -60
- package/src/data/avnu.abi.json +840 -0
- package/src/data/ekubo-price-fethcer.abi.json +265 -0
- package/src/data/redeem-request-nft.abi.json +752 -0
- package/src/data/universal-vault.abi.json +8 -7
- package/src/dataTypes/_bignumber.ts +13 -4
- package/src/dataTypes/bignumber.browser.ts +10 -1
- package/src/dataTypes/bignumber.node.ts +10 -1
- package/src/dataTypes/index.ts +3 -2
- package/src/dataTypes/mynumber.ts +141 -0
- package/src/global.ts +279 -233
- package/src/index.browser.ts +2 -1
- package/src/interfaces/common.tsx +228 -6
- package/src/modules/apollo-client-config.ts +28 -0
- package/src/modules/avnu.ts +21 -12
- package/src/modules/ekubo-pricer.ts +80 -0
- package/src/modules/ekubo-quoter.ts +48 -30
- package/src/modules/erc20.ts +17 -0
- package/src/modules/harvests.ts +43 -29
- package/src/modules/index.ts +2 -1
- package/src/modules/pragma.ts +23 -8
- package/src/modules/pricer-avnu-api.ts +114 -0
- package/src/modules/pricer-from-api.ts +156 -15
- package/src/modules/pricer-lst.ts +1 -1
- package/src/modules/pricer.ts +107 -41
- package/src/modules/pricerBase.ts +2 -1
- package/src/modules/zkLend.ts +3 -2
- package/src/node/deployer.ts +36 -1
- package/src/node/pricer-redis.ts +3 -1
- package/src/strategies/base-strategy.ts +168 -16
- package/src/strategies/constants.ts +8 -3
- package/src/strategies/ekubo-cl-vault.tsx +1048 -355
- package/src/strategies/factory.ts +199 -0
- package/src/strategies/index.ts +5 -3
- package/src/strategies/registry.ts +262 -0
- package/src/strategies/sensei.ts +354 -10
- package/src/strategies/svk-strategy.ts +292 -31
- package/src/strategies/token-boosted-xstrk-carry-strategy.tsx +1261 -0
- package/src/strategies/types.ts +4 -0
- package/src/strategies/universal-adapters/adapter-utils.ts +4 -1
- package/src/strategies/universal-adapters/avnu-adapter.ts +196 -272
- package/src/strategies/universal-adapters/baseAdapter.ts +263 -251
- package/src/strategies/universal-adapters/common-adapter.ts +206 -203
- package/src/strategies/universal-adapters/index.ts +10 -8
- package/src/strategies/universal-adapters/svk-troves-adapter.ts +511 -0
- package/src/strategies/universal-adapters/token-transfer-adapter.ts +200 -0
- package/src/strategies/universal-adapters/vesu-adapter.ts +120 -82
- package/src/strategies/universal-adapters/vesu-modify-position-adapter.ts +525 -0
- package/src/strategies/universal-adapters/vesu-multiply-adapter.ts +866 -860
- package/src/strategies/universal-adapters/vesu-position-common.ts +258 -0
- package/src/strategies/universal-adapters/vesu-supply-only-adapter.ts +18 -3
- package/src/strategies/universal-lst-muliplier-strategy.tsx +895 -416
- package/src/strategies/universal-strategy.tsx +1332 -1173
- package/src/strategies/vesu-rebalance.tsx +254 -153
- package/src/strategies/yoloVault.ts +1096 -0
- package/src/utils/cacheClass.ts +11 -2
- package/src/utils/health-factor-math.ts +33 -1
- package/src/utils/index.ts +3 -1
- package/src/utils/logger.browser.ts +22 -4
- package/src/utils/logger.node.ts +259 -24
- package/src/utils/starknet-call-parser.ts +1036 -0
- package/src/utils/strategy-utils.ts +61 -0
- package/src/modules/ExtendedWrapperSDk/index.ts +0 -62
- package/src/modules/ExtendedWrapperSDk/types.ts +0 -311
- package/src/modules/ExtendedWrapperSDk/wrapper.ts +0 -395
- package/src/strategies/universal-adapters/extended-adapter.ts +0 -662
- package/src/strategies/universal-adapters/unused-balance-adapter.ts +0 -109
- package/src/strategies/vesu-extended-strategy/services/operationService.ts +0 -34
- package/src/strategies/vesu-extended-strategy/utils/config.runtime.ts +0 -77
- package/src/strategies/vesu-extended-strategy/utils/constants.ts +0 -49
- package/src/strategies/vesu-extended-strategy/utils/helper.ts +0 -372
- package/src/strategies/vesu-extended-strategy/vesu-extended-strategy.tsx +0 -1140
|
@@ -9,10 +9,19 @@ import {
|
|
|
9
9
|
IProtocol,
|
|
10
10
|
IStrategyMetadata,
|
|
11
11
|
RiskFactor,
|
|
12
|
-
RiskType
|
|
12
|
+
RiskType,
|
|
13
|
+
StrategyTag,
|
|
14
|
+
AuditStatus,
|
|
15
|
+
SourceCodeType,
|
|
16
|
+
AccessControlType,
|
|
17
|
+
InstantWithdrawalVault,
|
|
18
|
+
StrategySettings,
|
|
19
|
+
StrategyLiveStatus,
|
|
20
|
+
VaultType,
|
|
21
|
+
UnwrapLabsCurator,
|
|
13
22
|
} from "@/interfaces";
|
|
14
23
|
import { AvnuWrapper, Pricer, SwapInfo } from "@/modules";
|
|
15
|
-
import { Account, CairoCustomEnum, Contract, num, uint256 } from "starknet";
|
|
24
|
+
import { Account, CairoCustomEnum, Contract, num, uint256, BlockIdentifier } from "starknet";
|
|
16
25
|
import VesuRebalanceAbi from "@/data/vesu-rebalance.abi.json";
|
|
17
26
|
import { Global } from "@/global";
|
|
18
27
|
import { assert } from "@/utils";
|
|
@@ -26,7 +35,7 @@ import {
|
|
|
26
35
|
SingleTokenInfo
|
|
27
36
|
} from "./base-strategy";
|
|
28
37
|
import { getAPIUsingHeadlessBrowser } from "@/node/headless";
|
|
29
|
-
import { VESU_REWARDS_ENDPOINT, VesuHarvests } from "@/modules/harvests";
|
|
38
|
+
import { VESU_REWARDS_ENDPOINT, VesuHarvests, HarvestInfo } from "@/modules/harvests";
|
|
30
39
|
import VesuPoolIDs from "@/data/vesu_pools.json";
|
|
31
40
|
import { COMMON_CONTRACTS, ENDPOINTS } from "./constants";
|
|
32
41
|
|
|
@@ -150,7 +159,8 @@ export class VesuRebalance extends BaseStrategy<
|
|
|
150
159
|
async withdrawCall(
|
|
151
160
|
amountInfo: SingleActionAmount,
|
|
152
161
|
receiver: ContractAddr,
|
|
153
|
-
owner: ContractAddr
|
|
162
|
+
owner: ContractAddr,
|
|
163
|
+
_isMaxWithdraw: boolean = false
|
|
154
164
|
) {
|
|
155
165
|
return [
|
|
156
166
|
this.contract.populate("withdraw", [
|
|
@@ -177,22 +187,26 @@ export class VesuRebalance extends BaseStrategy<
|
|
|
177
187
|
return this.metadata.depositTokens[0].decimals; // same as underlying token
|
|
178
188
|
}
|
|
179
189
|
|
|
180
|
-
|
|
181
|
-
|
|
182
|
-
|
|
183
|
-
|
|
184
|
-
|
|
185
|
-
|
|
186
|
-
const shares = await this.contract.balance_of(user.address);
|
|
187
|
-
const assets = await this.contract.convert_to_assets(
|
|
188
|
-
uint256.bnToUint256(shares)
|
|
190
|
+
async getUserTVL(user: ContractAddr, blockIdentifier: BlockIdentifier = "latest") {
|
|
191
|
+
const shares: any = await this.contract.call("balanceOf", [user.address], { blockIdentifier });
|
|
192
|
+
const assets: any = await this.contract.call(
|
|
193
|
+
"convert_to_assets",
|
|
194
|
+
[uint256.bnToUint256(shares)],
|
|
195
|
+
{ blockIdentifier }
|
|
189
196
|
);
|
|
190
197
|
const amount = Web3Number.fromWei(
|
|
191
198
|
assets.toString(),
|
|
192
199
|
this.metadata.depositTokens[0].decimals
|
|
193
200
|
);
|
|
201
|
+
|
|
202
|
+
// Convert blockIdentifier to block number for pricer if it's a number
|
|
203
|
+
const blockNumber = typeof blockIdentifier === 'number' || typeof blockIdentifier === 'bigint'
|
|
204
|
+
? Number(blockIdentifier)
|
|
205
|
+
: undefined;
|
|
206
|
+
|
|
194
207
|
let price = await this.pricer.getPrice(
|
|
195
|
-
this.metadata.depositTokens[0].symbol
|
|
208
|
+
this.metadata.depositTokens[0].symbol,
|
|
209
|
+
blockNumber
|
|
196
210
|
);
|
|
197
211
|
const usdValue = Number(amount.toFixed(6)) * price.price;
|
|
198
212
|
return {
|
|
@@ -202,6 +216,105 @@ export class VesuRebalance extends BaseStrategy<
|
|
|
202
216
|
};
|
|
203
217
|
}
|
|
204
218
|
|
|
219
|
+
/**
|
|
220
|
+
* Calculates user realized APY based on trueSharesBasedAPY method.
|
|
221
|
+
* Returns the APY as a number.
|
|
222
|
+
*/
|
|
223
|
+
async getUserRealizedAPY(
|
|
224
|
+
blockIdentifier: BlockIdentifier = "latest",
|
|
225
|
+
sinceBlocks = 600000
|
|
226
|
+
): Promise<number> {
|
|
227
|
+
logger.verbose(
|
|
228
|
+
`${VesuRebalance.name}: getUserRealizedAPY => starting with blockIdentifier=${blockIdentifier}, sinceBlocks=${sinceBlocks}`
|
|
229
|
+
);
|
|
230
|
+
|
|
231
|
+
// Determine current block number and timestamp
|
|
232
|
+
let blockNow =
|
|
233
|
+
typeof blockIdentifier === "number" || typeof blockIdentifier === "bigint"
|
|
234
|
+
? Number(blockIdentifier)
|
|
235
|
+
: (await this.config.provider.getBlockLatestAccepted()).block_number;
|
|
236
|
+
const blockNowTime =
|
|
237
|
+
typeof blockIdentifier === "number" || typeof blockIdentifier === "bigint"
|
|
238
|
+
? (await this.config.provider.getBlockWithTxs(blockIdentifier)).timestamp
|
|
239
|
+
: new Date().getTime() / 1000;
|
|
240
|
+
|
|
241
|
+
// Look back window, but never before launch block
|
|
242
|
+
const blockBefore = Math.max(
|
|
243
|
+
blockNow - sinceBlocks,
|
|
244
|
+
this.metadata.launchBlock
|
|
245
|
+
);
|
|
246
|
+
|
|
247
|
+
// TVL amounts (in underlying token units) and supply at current reference block
|
|
248
|
+
const assetsNowRaw: bigint = await this.contract.call("total_assets", [], {
|
|
249
|
+
blockIdentifier,
|
|
250
|
+
}) as bigint;
|
|
251
|
+
const amountNow = Web3Number.fromWei(
|
|
252
|
+
assetsNowRaw.toString(),
|
|
253
|
+
this.metadata.depositTokens[0].decimals
|
|
254
|
+
);
|
|
255
|
+
|
|
256
|
+
const supplyNowRaw: bigint = await this.contract.call("total_supply", [], {
|
|
257
|
+
blockIdentifier,
|
|
258
|
+
}) as bigint;
|
|
259
|
+
const supplyNow = Web3Number.fromWei(
|
|
260
|
+
supplyNowRaw.toString(),
|
|
261
|
+
this.metadata.depositTokens[0].decimals
|
|
262
|
+
);
|
|
263
|
+
|
|
264
|
+
// Historical TVL and supply
|
|
265
|
+
const assetsBeforeRaw: bigint = await this.contract.call(
|
|
266
|
+
"total_assets",
|
|
267
|
+
[],
|
|
268
|
+
{ blockIdentifier: blockBefore }
|
|
269
|
+
) as bigint;
|
|
270
|
+
const amountBefore = Web3Number.fromWei(
|
|
271
|
+
assetsBeforeRaw.toString(),
|
|
272
|
+
this.metadata.depositTokens[0].decimals
|
|
273
|
+
);
|
|
274
|
+
|
|
275
|
+
const supplyBeforeRaw: bigint = await this.contract.call(
|
|
276
|
+
"total_supply",
|
|
277
|
+
[],
|
|
278
|
+
{ blockIdentifier: blockBefore }
|
|
279
|
+
) as bigint;
|
|
280
|
+
const supplyBefore = Web3Number.fromWei(
|
|
281
|
+
supplyBeforeRaw.toString(),
|
|
282
|
+
this.metadata.depositTokens[0].decimals
|
|
283
|
+
);
|
|
284
|
+
|
|
285
|
+
const blockBeforeInfo = await this.config.provider.getBlockWithTxs(
|
|
286
|
+
blockBefore
|
|
287
|
+
);
|
|
288
|
+
|
|
289
|
+
const assetsPerShareNow = amountNow
|
|
290
|
+
.multipliedBy(1e18)
|
|
291
|
+
.dividedBy(supplyNow.toString());
|
|
292
|
+
|
|
293
|
+
const assetsPerShareBf = amountBefore
|
|
294
|
+
.multipliedBy(1e18)
|
|
295
|
+
.dividedBy(supplyBefore.toString());
|
|
296
|
+
|
|
297
|
+
const timeDiffSeconds = blockNowTime - blockBeforeInfo.timestamp;
|
|
298
|
+
|
|
299
|
+
logger.verbose(`${VesuRebalance.name}:${this.metadata.name} [getUserRealizedAPY] assetsNow: ${amountNow.toString()}`);
|
|
300
|
+
logger.verbose(`${VesuRebalance.name}:${this.metadata.name} [getUserRealizedAPY] assetsBefore: ${amountBefore.toString()}`);
|
|
301
|
+
logger.verbose(`${VesuRebalance.name}:${this.metadata.name} [getUserRealizedAPY] assetsPerShareNow: ${assetsPerShareNow.toString()}`);
|
|
302
|
+
logger.verbose(`${VesuRebalance.name}:${this.metadata.name} [getUserRealizedAPY] assetsPerShareBf: ${assetsPerShareBf.toString()}`);
|
|
303
|
+
logger.verbose(`${VesuRebalance.name}:${this.metadata.name} [getUserRealizedAPY] Supply before: ${supplyBefore.toString()}`);
|
|
304
|
+
logger.verbose(`${VesuRebalance.name}:${this.metadata.name} [getUserRealizedAPY] Supply now: ${supplyNow.toString()}`);
|
|
305
|
+
logger.verbose(`${VesuRebalance.name}:${this.metadata.name} [getUserRealizedAPY] Time diff in seconds: ${timeDiffSeconds}`);
|
|
306
|
+
|
|
307
|
+
const apyForGivenBlocks =
|
|
308
|
+
Number(
|
|
309
|
+
assetsPerShareNow
|
|
310
|
+
.minus(assetsPerShareBf)
|
|
311
|
+
.multipliedBy(10000)
|
|
312
|
+
.dividedBy(assetsPerShareBf)
|
|
313
|
+
) / 10000;
|
|
314
|
+
|
|
315
|
+
return (apyForGivenBlocks * (365 * 24 * 3600)) / timeDiffSeconds;
|
|
316
|
+
}
|
|
317
|
+
|
|
205
318
|
/**
|
|
206
319
|
* Calculates the total TVL of the strategy.
|
|
207
320
|
* @returns Object containing the total amount in token units and USD value
|
|
@@ -224,7 +337,7 @@ export class VesuRebalance extends BaseStrategy<
|
|
|
224
337
|
}
|
|
225
338
|
|
|
226
339
|
static async getAllPossibleVerifiedPools(asset: ContractAddr) {
|
|
227
|
-
const data = await getAPIUsingHeadlessBrowser(`${ENDPOINTS.
|
|
340
|
+
const data = await getAPIUsingHeadlessBrowser(`${ENDPOINTS.VESU_BASE}/pools`);
|
|
228
341
|
const verifiedPools = data.data.filter((d: any) => d.isVerified);
|
|
229
342
|
const pools = verifiedPools
|
|
230
343
|
.map((p: any) => {
|
|
@@ -490,7 +603,7 @@ export class VesuRebalance extends BaseStrategy<
|
|
|
490
603
|
let pools: any[] = [];
|
|
491
604
|
try {
|
|
492
605
|
const data = await getAPIUsingHeadlessBrowser(
|
|
493
|
-
`${ENDPOINTS.
|
|
606
|
+
`${ENDPOINTS.VESU_BASE}/pools`
|
|
494
607
|
);
|
|
495
608
|
pools = data.data;
|
|
496
609
|
|
|
@@ -767,10 +880,17 @@ export class VesuRebalance extends BaseStrategy<
|
|
|
767
880
|
return [baseFlow];
|
|
768
881
|
}
|
|
769
882
|
|
|
770
|
-
async
|
|
771
|
-
const
|
|
772
|
-
|
|
773
|
-
|
|
883
|
+
async getPendingRewards(): Promise<HarvestInfo[]> {
|
|
884
|
+
const vesuHarvests = new VesuHarvests(this.config);
|
|
885
|
+
return await vesuHarvests.getUnHarvestedRewards(this.address);
|
|
886
|
+
}
|
|
887
|
+
|
|
888
|
+
async harvest(acc: Account) {
|
|
889
|
+
const pendingRewards = await this.getPendingRewards();
|
|
890
|
+
if (pendingRewards.length == 0) {
|
|
891
|
+
throw new Error(`No pending rewards found`);
|
|
892
|
+
}
|
|
893
|
+
const harvest = pendingRewards[0];
|
|
774
894
|
const avnu = new AvnuWrapper();
|
|
775
895
|
let swapInfo: SwapInfo = {
|
|
776
896
|
token_from_address: harvest.token.address,
|
|
@@ -902,6 +1022,91 @@ const _riskFactor: RiskFactor[] = [
|
|
|
902
1022
|
const AUDIT_URL =
|
|
903
1023
|
"https://assets.troves.fi/strkfarm/audit_report_vesu_and_ekubo_strats.pdf";
|
|
904
1024
|
|
|
1025
|
+
// Helper to create common risk object
|
|
1026
|
+
const getVesuRebalanceRisk = () => ({
|
|
1027
|
+
riskFactor: _riskFactor,
|
|
1028
|
+
netRisk:
|
|
1029
|
+
_riskFactor.reduce((acc, curr) => acc + curr.value * curr.weight, 0) /
|
|
1030
|
+
_riskFactor.reduce((acc, curr) => acc + curr.weight, 0),
|
|
1031
|
+
notARisks: getNoRiskTags(_riskFactor)
|
|
1032
|
+
});
|
|
1033
|
+
|
|
1034
|
+
// Helper to create Vesu Rebalance strategy settings
|
|
1035
|
+
const createVesuRebalanceSettings = (tokenSymbol: string): StrategySettings => {
|
|
1036
|
+
const depositToken = Global.getDefaultTokens().find(
|
|
1037
|
+
(t) => t.symbol === tokenSymbol
|
|
1038
|
+
)!;
|
|
1039
|
+
return {
|
|
1040
|
+
isPaused: false,
|
|
1041
|
+
liveStatus: StrategyLiveStatus.DEPRECATED,
|
|
1042
|
+
isAudited: true,
|
|
1043
|
+
isInstantWithdrawal: true,
|
|
1044
|
+
quoteToken: depositToken,
|
|
1045
|
+
alerts: []
|
|
1046
|
+
};
|
|
1047
|
+
};
|
|
1048
|
+
|
|
1049
|
+
// Helper to create a Vesu Rebalance strategy
|
|
1050
|
+
const createVesuRebalanceStrategy = (
|
|
1051
|
+
idSymbol: string,
|
|
1052
|
+
name: string,
|
|
1053
|
+
tokenSymbol: string,
|
|
1054
|
+
address: string
|
|
1055
|
+
): IStrategyMetadata<VesuRebalanceSettings> => ({
|
|
1056
|
+
id: `vesu_fusion_${idSymbol.toLowerCase()}`,
|
|
1057
|
+
name,
|
|
1058
|
+
description: _description.replace("{{TOKEN}}", tokenSymbol),
|
|
1059
|
+
address: ContractAddr.from(address),
|
|
1060
|
+
launchBlock: 0,
|
|
1061
|
+
type: "ERC4626" as const,
|
|
1062
|
+
vaultType: {
|
|
1063
|
+
type: VaultType.META_VAULT,
|
|
1064
|
+
description: `Automatically diversify ${tokenSymbol} holdings into different Vesu pools while reducing risk and maximizing yield. Defi spring ${tokenSymbol} Rewards are auto-compounded as well.`
|
|
1065
|
+
},
|
|
1066
|
+
depositTokens: [
|
|
1067
|
+
Global.getDefaultTokens().find((t) => t.symbol === tokenSymbol)!
|
|
1068
|
+
],
|
|
1069
|
+
protocols: [_protocol],
|
|
1070
|
+
auditUrl: AUDIT_URL,
|
|
1071
|
+
curator: UnwrapLabsCurator,
|
|
1072
|
+
settings: createVesuRebalanceSettings(tokenSymbol),
|
|
1073
|
+
risk: getVesuRebalanceRisk(),
|
|
1074
|
+
additionalInfo: {
|
|
1075
|
+
feeBps: 1000
|
|
1076
|
+
},
|
|
1077
|
+
faqs,
|
|
1078
|
+
contractDetails: [],
|
|
1079
|
+
investmentSteps: [],
|
|
1080
|
+
tags: [],
|
|
1081
|
+
security: VESU_SECURITY,
|
|
1082
|
+
redemptionInfo: VESU_REDEMPTION_INFO,
|
|
1083
|
+
discontinuationInfo: {
|
|
1084
|
+
info: "This strategy has been deprecated and is no longer accepting new deposits."
|
|
1085
|
+
},
|
|
1086
|
+
usualTimeToEarnings: null,
|
|
1087
|
+
usualTimeToEarningsDescription: null,
|
|
1088
|
+
});
|
|
1089
|
+
|
|
1090
|
+
// Shared security & redemption metadata for all Vesu strategies
|
|
1091
|
+
const VESU_SECURITY = {
|
|
1092
|
+
auditStatus: AuditStatus.AUDITED,
|
|
1093
|
+
sourceCode: {
|
|
1094
|
+
type: SourceCodeType.OPEN_SOURCE,
|
|
1095
|
+
contractLink: "https://github.com/trovesfi/troves-contracts",
|
|
1096
|
+
},
|
|
1097
|
+
accessControl: {
|
|
1098
|
+
type: AccessControlType.ROLE_BASED_ACCESS,
|
|
1099
|
+
addresses: [ContractAddr.from("0x0")],
|
|
1100
|
+
timeLock: "2 Days",
|
|
1101
|
+
},
|
|
1102
|
+
};
|
|
1103
|
+
|
|
1104
|
+
const VESU_REDEMPTION_INFO = {
|
|
1105
|
+
instantWithdrawalVault: InstantWithdrawalVault.YES,
|
|
1106
|
+
redemptionsInfo: [],
|
|
1107
|
+
alerts: [],
|
|
1108
|
+
};
|
|
1109
|
+
|
|
905
1110
|
const faqs: FAQ[] = [
|
|
906
1111
|
{
|
|
907
1112
|
question: "What is the Vesu Rebalancing Strategy?",
|
|
@@ -953,137 +1158,32 @@ const faqs: FAQ[] = [
|
|
|
953
1158
|
* Represents the Vesu Rebalance Strategies.
|
|
954
1159
|
*/
|
|
955
1160
|
export const VesuRebalanceStrategies: IStrategyMetadata<VesuRebalanceSettings>[] =
|
|
956
|
-
|
|
957
|
-
|
|
958
|
-
|
|
959
|
-
|
|
960
|
-
|
|
961
|
-
|
|
962
|
-
|
|
963
|
-
|
|
964
|
-
|
|
965
|
-
|
|
966
|
-
|
|
967
|
-
|
|
968
|
-
|
|
969
|
-
|
|
970
|
-
|
|
971
|
-
|
|
972
|
-
|
|
973
|
-
|
|
974
|
-
|
|
975
|
-
|
|
976
|
-
|
|
977
|
-
|
|
978
|
-
|
|
979
|
-
|
|
980
|
-
|
|
981
|
-
|
|
982
|
-
contractDetails: [],
|
|
983
|
-
investmentSteps: []
|
|
984
|
-
},
|
|
985
|
-
{
|
|
986
|
-
name: "Vesu Fusion ETH",
|
|
987
|
-
description: _description.replace("{{TOKEN}}", "ETH"),
|
|
988
|
-
address: ContractAddr.from(
|
|
989
|
-
"0x5eaf5ee75231cecf79921ff8ded4b5ffe96be718bcb3daf206690ad1a9ad0ca"
|
|
990
|
-
),
|
|
991
|
-
launchBlock: 0,
|
|
992
|
-
type: "ERC4626",
|
|
993
|
-
auditUrl: AUDIT_URL,
|
|
994
|
-
depositTokens: [
|
|
995
|
-
Global.getDefaultTokens().find((t) => t.symbol === "ETH")!
|
|
996
|
-
],
|
|
997
|
-
protocols: [_protocol],
|
|
998
|
-
maxTVL: Web3Number.fromWei("0", 18),
|
|
999
|
-
risk: {
|
|
1000
|
-
riskFactor: _riskFactor,
|
|
1001
|
-
netRisk:
|
|
1002
|
-
_riskFactor.reduce((acc, curr) => acc + curr.value * curr.weight, 0) /
|
|
1003
|
-
_riskFactor.reduce((acc, curr) => acc + curr.weight, 0),
|
|
1004
|
-
notARisks: getNoRiskTags(_riskFactor)
|
|
1005
|
-
},
|
|
1006
|
-
additionalInfo: {
|
|
1007
|
-
feeBps: 1000
|
|
1008
|
-
},
|
|
1009
|
-
faqs,
|
|
1010
|
-
contractDetails: [],
|
|
1011
|
-
investmentSteps: []
|
|
1012
|
-
},
|
|
1013
|
-
{
|
|
1014
|
-
name: "Vesu Fusion USDC",
|
|
1015
|
-
description: _description.replace("{{TOKEN}}", "USDC"),
|
|
1016
|
-
address: ContractAddr.from(
|
|
1017
|
-
"0xa858c97e9454f407d1bd7c57472fc8d8d8449a777c822b41d18e387816f29c"
|
|
1018
|
-
),
|
|
1019
|
-
launchBlock: 0,
|
|
1020
|
-
type: "ERC4626",
|
|
1021
|
-
auditUrl: AUDIT_URL,
|
|
1022
|
-
depositTokens: [
|
|
1023
|
-
Global.getDefaultTokens().find((t) => t.symbol === "USDC")!
|
|
1024
|
-
],
|
|
1025
|
-
protocols: [_protocol],
|
|
1026
|
-
maxTVL: Web3Number.fromWei("0", 6),
|
|
1027
|
-
risk: {
|
|
1028
|
-
riskFactor: _riskFactor,
|
|
1029
|
-
netRisk:
|
|
1030
|
-
_riskFactor.reduce((acc, curr) => acc + curr.value * curr.weight, 0) /
|
|
1031
|
-
_riskFactor.reduce((acc, curr) => acc + curr.weight, 0),
|
|
1032
|
-
notARisks: getNoRiskTags(_riskFactor)
|
|
1033
|
-
},
|
|
1034
|
-
additionalInfo: {
|
|
1035
|
-
feeBps: 1000
|
|
1036
|
-
},
|
|
1037
|
-
faqs,
|
|
1038
|
-
contractDetails: [],
|
|
1039
|
-
investmentSteps: []
|
|
1040
|
-
},
|
|
1041
|
-
{
|
|
1042
|
-
name: "Vesu Fusion USDT",
|
|
1043
|
-
description: _description.replace("{{TOKEN}}", "USDT"),
|
|
1044
|
-
address: ContractAddr.from(
|
|
1045
|
-
"0x115e94e722cfc4c77a2f15c4aefb0928c1c0029e5a57570df24c650cb7cec2c"
|
|
1046
|
-
),
|
|
1047
|
-
launchBlock: 0,
|
|
1048
|
-
type: "ERC4626",
|
|
1049
|
-
depositTokens: [
|
|
1050
|
-
Global.getDefaultTokens().find((t) => t.symbol === "USDT")!
|
|
1051
|
-
],
|
|
1052
|
-
auditUrl: AUDIT_URL,
|
|
1053
|
-
protocols: [_protocol],
|
|
1054
|
-
maxTVL: Web3Number.fromWei("0", 6),
|
|
1055
|
-
risk: {
|
|
1056
|
-
riskFactor: _riskFactor,
|
|
1057
|
-
netRisk:
|
|
1058
|
-
_riskFactor.reduce((acc, curr) => acc + curr.value * curr.weight, 0) /
|
|
1059
|
-
_riskFactor.reduce((acc, curr) => acc + curr.weight, 0),
|
|
1060
|
-
notARisks: getNoRiskTags(_riskFactor)
|
|
1061
|
-
},
|
|
1062
|
-
additionalInfo: {
|
|
1063
|
-
feeBps: 1000
|
|
1064
|
-
},
|
|
1065
|
-
faqs,
|
|
1066
|
-
contractDetails: [],
|
|
1067
|
-
investmentSteps: []
|
|
1068
|
-
// }, {
|
|
1069
|
-
// name: 'Vesu Fusion WBTC',
|
|
1070
|
-
// description: _description.replace('{{TOKEN}}', 'WBTC'),
|
|
1071
|
-
// address: ContractAddr.from('0x778007f8136a5b827325d21613803e796bda4d676fbe1e34aeab0b2a2ec027f'),
|
|
1072
|
-
// type: 'ERC4626',
|
|
1073
|
-
// depositTokens: [Global.getDefaultTokens().find(t => t.symbol === 'WBTC')!],
|
|
1074
|
-
// auditUrl: AUDIT_URL,
|
|
1075
|
-
// protocols: [_protocol],
|
|
1076
|
-
// maxTVL: Web3Number.fromWei('0', 8),
|
|
1077
|
-
// risk: {
|
|
1078
|
-
// riskFactor: _riskFactor,
|
|
1079
|
-
// netRisk: _riskFactor.reduce((acc, curr) => acc + curr.value * curr.weight, 0) / _riskFactor.reduce((acc, curr) => acc + curr.weight, 0),
|
|
1080
|
-
// },
|
|
1081
|
-
// additionalInfo: {
|
|
1082
|
-
// feeBps: 1000,
|
|
1083
|
-
// },
|
|
1084
|
-
|
|
1085
|
-
}
|
|
1086
|
-
];
|
|
1161
|
+
[
|
|
1162
|
+
createVesuRebalanceStrategy(
|
|
1163
|
+
'strk',
|
|
1164
|
+
"Vesu Fusion STRK",
|
|
1165
|
+
"STRK",
|
|
1166
|
+
"0x7fb5bcb8525954a60fde4e8fb8220477696ce7117ef264775a1770e23571929"
|
|
1167
|
+
),
|
|
1168
|
+
createVesuRebalanceStrategy(
|
|
1169
|
+
'eth',
|
|
1170
|
+
"Vesu Fusion ETH",
|
|
1171
|
+
"ETH",
|
|
1172
|
+
"0x5eaf5ee75231cecf79921ff8ded4b5ffe96be718bcb3daf206690ad1a9ad0ca"
|
|
1173
|
+
),
|
|
1174
|
+
createVesuRebalanceStrategy(
|
|
1175
|
+
'usdc',
|
|
1176
|
+
"Vesu Fusion USDC.e",
|
|
1177
|
+
"USDC.e",
|
|
1178
|
+
"0xa858c97e9454f407d1bd7c57472fc8d8d8449a777c822b41d18e387816f29c"
|
|
1179
|
+
),
|
|
1180
|
+
createVesuRebalanceStrategy(
|
|
1181
|
+
'usdt',
|
|
1182
|
+
"Vesu Fusion USDT",
|
|
1183
|
+
"USDT",
|
|
1184
|
+
"0x115e94e722cfc4c77a2f15c4aefb0928c1c0029e5a57570df24c650cb7cec2c"
|
|
1185
|
+
)
|
|
1186
|
+
];
|
|
1087
1187
|
|
|
1088
1188
|
// auto assign contract details to each strategy
|
|
1089
1189
|
VesuRebalanceStrategies.forEach((s) => {
|
|
@@ -1092,7 +1192,7 @@ VesuRebalanceStrategies.forEach((s) => {
|
|
|
1092
1192
|
address: s.address,
|
|
1093
1193
|
name: "Vault",
|
|
1094
1194
|
sourceCodeUrl: "https://github.com/strkfarm/strkfarm-contracts/tree/main/src/strategies/vesu_rebalance"
|
|
1095
|
-
},
|
|
1195
|
+
},
|
|
1096
1196
|
...COMMON_CONTRACTS];
|
|
1097
1197
|
// set docs link
|
|
1098
1198
|
s.docs = "https://docs.troves.fi/p/strategies/vesu-fusion-rebalancing-vaults"
|
|
@@ -1115,4 +1215,5 @@ VesuRebalanceStrategies.forEach((s) => {
|
|
|
1115
1215
|
"Monitor and Rebalance funds across multiple Vesu pools to maximize yield",
|
|
1116
1216
|
"Harvest and supply Defi Spring STRK rewards every week (Auto-compound)",
|
|
1117
1217
|
]
|
|
1118
|
-
|
|
1218
|
+
|
|
1219
|
+
});
|