@stake-dao/reader 0.1.1 → 0.1.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/esm/batches/buildYearnStrats.js +39 -0
- package/dist/esm/batches/buildYearnStrats.js.map +1 -0
- package/dist/esm/batches/curveStrats.js +4 -6
- package/dist/esm/batches/curveStrats.js.map +1 -1
- package/dist/esm/batches/fetchYearnGauges.js +76 -0
- package/dist/esm/batches/fetchYearnGauges.js.map +1 -0
- package/dist/esm/batches/index.js +2 -0
- package/dist/esm/batches/index.js.map +1 -1
- package/dist/esm/index.js +2 -0
- package/dist/esm/index.js.map +1 -1
- package/dist/esm/lockers/abis/MulticallLockers.json +591 -0
- package/dist/esm/lockers/fetch/index.js +306 -0
- package/dist/esm/lockers/fetch/index.js.map +1 -0
- package/dist/esm/lockers/utils/cakeLockerAirdrop.js +46 -0
- package/dist/esm/lockers/utils/cakeLockerAirdrop.js.map +1 -0
- package/dist/esm/lockers/utils/callsForLockers/depositorCalls.js +20 -0
- package/dist/esm/lockers/utils/callsForLockers/depositorCalls.js.map +1 -0
- package/dist/esm/lockers/utils/callsForLockers/feeCalls.js +94 -0
- package/dist/esm/lockers/utils/callsForLockers/feeCalls.js.map +1 -0
- package/dist/esm/lockers/utils/callsForLockers/gaugeCalls.js +6 -0
- package/dist/esm/lockers/utils/callsForLockers/gaugeCalls.js.map +1 -0
- package/dist/esm/lockers/utils/callsForLockers/gaugeControllerCalls.js +8 -0
- package/dist/esm/lockers/utils/callsForLockers/gaugeControllerCalls.js.map +1 -0
- package/dist/esm/lockers/utils/callsForLockers/index.js +29 -0
- package/dist/esm/lockers/utils/callsForLockers/index.js.map +1 -0
- package/dist/esm/lockers/utils/callsForLockers/pegCalls.js +38 -0
- package/dist/esm/lockers/utils/callsForLockers/pegCalls.js.map +1 -0
- package/dist/esm/lockers/utils/callsForLockers/veCalls.js +26 -0
- package/dist/esm/lockers/utils/callsForLockers/veCalls.js.map +1 -0
- package/dist/esm/lockers/utils/callsForLockers/veSdtCalls.js +14 -0
- package/dist/esm/lockers/utils/callsForLockers/veSdtCalls.js.map +1 -0
- package/dist/esm/lockers/utils/endpoints.js +23 -0
- package/dist/esm/lockers/utils/endpoints.js.map +1 -0
- package/dist/esm/lockers/utils/getBribesRewardsData.js +46 -0
- package/dist/esm/lockers/utils/getBribesRewardsData.js.map +1 -0
- package/dist/esm/lockers/utils/getCherriesLeaderBoard.js +22 -0
- package/dist/esm/lockers/utils/getCherriesLeaderBoard.js.map +1 -0
- package/dist/esm/lockers/utils/getFees.js +30 -0
- package/dist/esm/lockers/utils/getFees.js.map +1 -0
- package/dist/esm/lockers/utils/getHttpCalls.js +44 -0
- package/dist/esm/lockers/utils/getHttpCalls.js.map +1 -0
- package/dist/esm/lockers/utils/getSdtInflationData.js +38 -0
- package/dist/esm/lockers/utils/getSdtInflationData.js.map +1 -0
- package/dist/esm/lockers/utils/index.js +157 -0
- package/dist/esm/lockers/utils/index.js.map +1 -0
- package/dist/esm/lockers/utils/substractFees.js +22 -0
- package/dist/esm/lockers/utils/substractFees.js.map +1 -0
- package/dist/esm/strategies/curve/build.js +10 -7
- package/dist/esm/strategies/curve/build.js.map +1 -1
- package/dist/esm/strategies/curve/fetch/getStratsWithApr.js +1 -1
- package/dist/esm/strategies/curve/fetch/getStratsWithApr.js.map +1 -1
- package/dist/esm/strategies/curve/fetch/index.js +4 -17
- package/dist/esm/strategies/curve/fetch/index.js.map +1 -1
- package/dist/esm/strategies/curve/httpCalls.js +3 -1
- package/dist/esm/strategies/curve/httpCalls.js.map +1 -1
- package/dist/esm/strategies/utils/abis/MulticallYearnStratsAbi.json +107 -0
- package/dist/esm/strategies/{curve/fetch → utils}/getAprBreakdown.js +17 -7
- package/dist/esm/strategies/utils/getAprBreakdown.js.map +1 -0
- package/dist/esm/strategies/utils/index.js +1 -0
- package/dist/esm/strategies/utils/index.js.map +1 -1
- package/dist/esm/strategies/utils/sdt.js +17 -0
- package/dist/esm/strategies/utils/sdt.js.map +1 -1
- package/dist/esm/strategies/yearn/build.js +97 -0
- package/dist/esm/strategies/yearn/build.js.map +1 -0
- package/dist/esm/strategies/yearn/fetch/computeYearnApr.js +28 -0
- package/dist/esm/strategies/yearn/fetch/computeYearnApr.js.map +1 -0
- package/dist/esm/strategies/yearn/fetch/fetchAllYearnGauges.js +61 -0
- package/dist/esm/strategies/yearn/fetch/fetchAllYearnGauges.js.map +1 -0
- package/dist/esm/strategies/yearn/fetch/index.js +169 -0
- package/dist/esm/strategies/yearn/fetch/index.js.map +1 -0
- package/dist/esm/tsconfig.build.tsbuildinfo +1 -1
- package/dist/esm/utils.js +33 -1
- package/dist/esm/utils.js.map +1 -1
- package/dist/types/batches/buildYearnStrats.d.ts +4 -0
- package/dist/types/batches/buildYearnStrats.d.ts.map +1 -0
- package/dist/types/batches/curveStrats.d.ts.map +1 -1
- package/dist/types/batches/fetchYearnGauges.d.ts +4 -0
- package/dist/types/batches/fetchYearnGauges.d.ts.map +1 -0
- package/dist/types/batches/index.d.ts +2 -0
- package/dist/types/batches/index.d.ts.map +1 -1
- package/dist/types/index.d.ts +2 -0
- package/dist/types/index.d.ts.map +1 -1
- package/dist/types/lockers/fetch/index.d.ts +11 -0
- package/dist/types/lockers/fetch/index.d.ts.map +1 -0
- package/dist/types/lockers/utils/cakeLockerAirdrop.d.ts +8 -0
- package/dist/types/lockers/utils/cakeLockerAirdrop.d.ts.map +1 -0
- package/dist/types/lockers/utils/callsForLockers/depositorCalls.d.ts +3 -0
- package/dist/types/lockers/utils/callsForLockers/depositorCalls.d.ts.map +1 -0
- package/dist/types/lockers/utils/callsForLockers/feeCalls.d.ts +11 -0
- package/dist/types/lockers/utils/callsForLockers/feeCalls.d.ts.map +1 -0
- package/dist/types/lockers/utils/callsForLockers/gaugeCalls.d.ts +6 -0
- package/dist/types/lockers/utils/callsForLockers/gaugeCalls.d.ts.map +1 -0
- package/dist/types/lockers/utils/callsForLockers/gaugeControllerCalls.d.ts +11 -0
- package/dist/types/lockers/utils/callsForLockers/gaugeControllerCalls.d.ts.map +1 -0
- package/dist/types/lockers/utils/callsForLockers/index.d.ts +3 -0
- package/dist/types/lockers/utils/callsForLockers/index.d.ts.map +1 -0
- package/dist/types/lockers/utils/callsForLockers/pegCalls.d.ts +15 -0
- package/dist/types/lockers/utils/callsForLockers/pegCalls.d.ts.map +1 -0
- package/dist/types/lockers/utils/callsForLockers/veCalls.d.ts +3 -0
- package/dist/types/lockers/utils/callsForLockers/veCalls.d.ts.map +1 -0
- package/dist/types/lockers/utils/callsForLockers/veSdtCalls.d.ts +11 -0
- package/dist/types/lockers/utils/callsForLockers/veSdtCalls.d.ts.map +1 -0
- package/dist/types/lockers/utils/endpoints.d.ts +3 -0
- package/dist/types/lockers/utils/endpoints.d.ts.map +1 -0
- package/dist/types/lockers/utils/getBribesRewardsData.d.ts +18 -0
- package/dist/types/lockers/utils/getBribesRewardsData.d.ts.map +1 -0
- package/dist/types/lockers/utils/getCherriesLeaderBoard.d.ts +2 -0
- package/dist/types/lockers/utils/getCherriesLeaderBoard.d.ts.map +1 -0
- package/dist/types/lockers/utils/getFees.d.ts +4 -0
- package/dist/types/lockers/utils/getFees.d.ts.map +1 -0
- package/dist/types/lockers/utils/getHttpCalls.d.ts +11 -0
- package/dist/types/lockers/utils/getHttpCalls.d.ts.map +1 -0
- package/dist/types/lockers/utils/getSdtInflationData.d.ts +8 -0
- package/dist/types/lockers/utils/getSdtInflationData.d.ts.map +1 -0
- package/dist/types/lockers/utils/index.d.ts +30 -0
- package/dist/types/lockers/utils/index.d.ts.map +1 -0
- package/dist/types/lockers/utils/substractFees.d.ts +3 -0
- package/dist/types/lockers/utils/substractFees.d.ts.map +1 -0
- package/dist/types/prices.d.ts.map +1 -1
- package/dist/types/strategies/curve/build.d.ts +2 -31
- package/dist/types/strategies/curve/build.d.ts.map +1 -1
- package/dist/types/strategies/curve/endpoints.d.ts +2 -2
- package/dist/types/strategies/curve/fetch/curveApiData/getGaugesFromRegistry.d.ts.map +1 -1
- package/dist/types/strategies/curve/fetch/curveApiData/getGaugesWeights.d.ts.map +1 -1
- package/dist/types/strategies/curve/fetch/index.d.ts +2 -7
- package/dist/types/strategies/curve/fetch/index.d.ts.map +1 -1
- package/dist/types/strategies/curve/httpCalls.d.ts.map +1 -1
- package/dist/types/strategies/types.d.ts +49 -6
- package/dist/types/strategies/types.d.ts.map +1 -1
- package/dist/types/strategies/utils/getAprBreakdown.d.ts +15 -0
- package/dist/types/strategies/utils/getAprBreakdown.d.ts.map +1 -0
- package/dist/types/strategies/utils/index.d.ts +1 -0
- package/dist/types/strategies/utils/index.d.ts.map +1 -1
- package/dist/types/strategies/utils/promise.d.ts.map +1 -1
- package/dist/types/strategies/utils/sdt.d.ts +1 -0
- package/dist/types/strategies/utils/sdt.d.ts.map +1 -1
- package/dist/types/strategies/yearn/build.d.ts +8 -0
- package/dist/types/strategies/yearn/build.d.ts.map +1 -0
- package/dist/types/strategies/yearn/fetch/computeYearnApr.d.ts +9 -0
- package/dist/types/strategies/yearn/fetch/computeYearnApr.d.ts.map +1 -0
- package/dist/types/strategies/yearn/fetch/fetchAllYearnGauges.d.ts +2 -0
- package/dist/types/strategies/yearn/fetch/fetchAllYearnGauges.d.ts.map +1 -0
- package/dist/types/strategies/yearn/fetch/index.d.ts +5 -0
- package/dist/types/strategies/yearn/fetch/index.d.ts.map +1 -0
- package/dist/types/utils.d.ts +5 -0
- package/dist/types/utils.d.ts.map +1 -1
- package/package.json +3 -2
- package/src/batches/buildYearnStrats.ts +41 -0
- package/src/batches/curveStrats.ts +4 -6
- package/src/batches/fetchYearnGauges.ts +78 -0
- package/src/batches/index.ts +2 -0
- package/src/index.ts +2 -0
- package/src/lockers/fetch/index.ts +407 -0
- package/src/lockers/utils/cakeLockerAirdrop.ts +73 -0
- package/src/lockers/utils/callsForLockers/depositorCalls.ts +25 -0
- package/src/lockers/utils/callsForLockers/feeCalls.ts +118 -0
- package/src/lockers/utils/callsForLockers/gaugeCalls.ts +6 -0
- package/src/lockers/utils/callsForLockers/gaugeControllerCalls.ts +8 -0
- package/src/lockers/utils/callsForLockers/index.ts +44 -0
- package/src/lockers/utils/callsForLockers/pegCalls.ts +40 -0
- package/src/lockers/utils/callsForLockers/veCalls.ts +31 -0
- package/src/lockers/utils/callsForLockers/veSdtCalls.ts +15 -0
- package/src/lockers/utils/endpoints.ts +24 -0
- package/src/lockers/utils/getBribesRewardsData.ts +64 -0
- package/src/lockers/utils/getCherriesLeaderBoard.ts +34 -0
- package/src/lockers/utils/getFees.ts +34 -0
- package/src/lockers/utils/getHttpCalls.ts +55 -0
- package/src/lockers/utils/getSdtInflationData.ts +54 -0
- package/src/lockers/utils/index.ts +200 -0
- package/src/lockers/utils/substractFees.ts +26 -0
- package/src/strategies/curve/build.ts +49 -44
- package/src/strategies/curve/fetch/getStratsWithApr.ts +1 -1
- package/src/strategies/curve/fetch/index.ts +12 -22
- package/src/strategies/curve/httpCalls.ts +3 -1
- package/src/strategies/types.ts +52 -6
- package/src/strategies/{curve/fetch → utils}/getAprBreakdown.ts +25 -8
- package/src/strategies/utils/index.ts +1 -0
- package/src/strategies/utils/sdt.ts +24 -0
- package/src/strategies/yearn/build.ts +156 -0
- package/src/strategies/yearn/fetch/computeYearnApr.ts +47 -0
- package/src/strategies/yearn/fetch/fetchAllYearnGauges.ts +78 -0
- package/src/strategies/yearn/fetch/index.ts +225 -0
- package/src/utils.ts +43 -1
- package/dist/esm/strategies/curve/fetch/getAprBreakdown.js.map +0 -1
- package/dist/esm/strategies/curve/fetch/types.js +0 -2
- package/dist/esm/strategies/curve/fetch/types.js.map +0 -1
- package/dist/types/strategies/curve/fetch/getAprBreakdown.d.ts +0 -17
- package/dist/types/strategies/curve/fetch/getAprBreakdown.d.ts.map +0 -1
- package/dist/types/strategies/curve/fetch/types.d.ts +0 -11
- package/dist/types/strategies/curve/fetch/types.d.ts.map +0 -1
- package/src/strategies/curve/fetch/types.ts +0 -11
|
@@ -5,6 +5,7 @@ import { contract, tokens } from '@stake-dao/constants'
|
|
|
5
5
|
import type { FetchedToken, Token } from '@stake-dao/constants'
|
|
6
6
|
import { batchSdtGaugeRewards, batchTokenData } from '../../batches/index.js'
|
|
7
7
|
import { equalTlc, getTokenInfo } from '../../utils.js'
|
|
8
|
+
import type { BuiltStrat } from '../types.js'
|
|
8
9
|
|
|
9
10
|
interface VaultAndLp {
|
|
10
11
|
vault: string
|
|
@@ -16,60 +17,64 @@ export const buildCurveStrategies = async (
|
|
|
16
17
|
stratsList: VaultAndLp[],
|
|
17
18
|
chainId: number,
|
|
18
19
|
externalApisResult: any[],
|
|
19
|
-
) => {
|
|
20
|
+
): Promise<BuiltStrat[]> => {
|
|
20
21
|
const tokensToFetch: string[] = []
|
|
21
22
|
const gaugesToFetch: string[] = []
|
|
22
23
|
|
|
23
|
-
const strats = stratsList
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
24
|
+
const strats = stratsList
|
|
25
|
+
.map((data, index) => {
|
|
26
|
+
const lpToken = data.lpToken
|
|
27
|
+
const curveApiData = externalApisResult.find((el) => equalTlc(el.lp, lpToken))
|
|
28
|
+
|
|
29
|
+
if (curveApiData) {
|
|
30
|
+
const isMetapool = curveApiData.isMetapool
|
|
31
|
+
const isLending = curveApiData.isLending
|
|
32
|
+
|
|
33
|
+
const coins: string[] = curveApiData.coins.map((c) => c.coinAddress)
|
|
34
|
+
|
|
35
|
+
let underlyingCoins: string[] = []
|
|
36
|
+
if (isMetapool || isLending) {
|
|
37
|
+
underlyingCoins = curveApiData.underlyingCoins
|
|
38
|
+
}
|
|
39
|
+
|
|
40
|
+
const gaugeAddress = curveApiData.gauge?.address || undefined
|
|
41
|
+
|
|
42
|
+
for (const coin of coins) tokensToFetch.push(coin)
|
|
43
|
+
for (const uCoin of underlyingCoins) tokensToFetch.push(uCoin)
|
|
44
|
+
tokensToFetch.push(lpToken)
|
|
45
|
+
|
|
46
|
+
if (typeof gaugeAddress === 'undefined') {
|
|
47
|
+
gaugesToFetch.push(data.vault)
|
|
48
|
+
}
|
|
49
|
+
|
|
50
|
+
return {
|
|
51
|
+
type: curveApiData.poolType,
|
|
52
|
+
key: `${curveApiData.poolType}-${curveApiData.id}`,
|
|
53
|
+
isMetapool,
|
|
54
|
+
isLending,
|
|
55
|
+
coins,
|
|
56
|
+
vault: data.vault,
|
|
57
|
+
lpToken,
|
|
58
|
+
gaugeAddress,
|
|
59
|
+
underlyingCoins,
|
|
60
|
+
}
|
|
36
61
|
}
|
|
37
62
|
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
for (const uCoin of underlyingCoins) tokensToFetch.push(uCoin)
|
|
42
|
-
tokensToFetch.push(lpToken)
|
|
43
|
-
|
|
44
|
-
if (typeof gaugeAddress === 'undefined') {
|
|
45
|
-
gaugesToFetch.push(data.vault)
|
|
46
|
-
}
|
|
63
|
+
console.error(`-- Error building curve strat at index ${index}: Not found in API data`)
|
|
64
|
+
console.error(` Vault: ${data.vault}`)
|
|
65
|
+
console.error(` LP Token: ${data.lpToken}`)
|
|
47
66
|
|
|
48
67
|
return {
|
|
49
|
-
type:
|
|
50
|
-
key:
|
|
51
|
-
|
|
52
|
-
isLending,
|
|
53
|
-
coins,
|
|
68
|
+
type: 'error',
|
|
69
|
+
key: 'error',
|
|
70
|
+
coins: [],
|
|
54
71
|
vault: data.vault,
|
|
55
72
|
lpToken,
|
|
56
|
-
gaugeAddress,
|
|
57
|
-
underlyingCoins,
|
|
73
|
+
gaugeAddress: 'error',
|
|
74
|
+
underlyingCoins: [],
|
|
58
75
|
}
|
|
59
|
-
}
|
|
60
|
-
|
|
61
|
-
return {
|
|
62
|
-
type: undefined,
|
|
63
|
-
key: undefined,
|
|
64
|
-
isMetapool: undefined,
|
|
65
|
-
isLending: undefined,
|
|
66
|
-
coins: [],
|
|
67
|
-
vault: data.vault,
|
|
68
|
-
lpToken,
|
|
69
|
-
gaugeAddress: undefined,
|
|
70
|
-
underlyingCoins: [],
|
|
71
|
-
}
|
|
72
|
-
})
|
|
76
|
+
})
|
|
77
|
+
.filter((s) => s.type !== 'error')
|
|
73
78
|
|
|
74
79
|
// Fetch tokens infos
|
|
75
80
|
const inputArgsChunks = chunk(
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
import { STRAT_FEES } from '@stake-dao/constants'
|
|
2
|
-
import { equalTlc } from '../../../utils.js'
|
|
3
2
|
import { mainnet } from 'viem/chains'
|
|
3
|
+
import { equalTlc } from '../../../utils.js'
|
|
4
4
|
|
|
5
5
|
const getConvexPool = (apisData: any, chainId: number, isLending: boolean, stratLpAddress: string) => {
|
|
6
6
|
if (chainId === mainnet.id) {
|
|
@@ -2,20 +2,19 @@ import { formatUnits } from 'viem'
|
|
|
2
2
|
|
|
3
3
|
import { ONE_YEAR, curveStrats, mainnet, tokenWithId } from '@stake-dao/constants'
|
|
4
4
|
import { equalTlc } from '../../../utils.js'
|
|
5
|
-
import type { OnlyBoostData, RewardsData,
|
|
5
|
+
import type { CurveGlobalData, OnlyBoostData, RewardsData, StrategyData } from '../../types.js'
|
|
6
6
|
import { getBoost } from '../../utils/boost.js'
|
|
7
7
|
import decodeEtherscanFactoryEvent, { decodeNewFactoryEvent } from '../../utils/decodeEtherscanFactoryEvent.js'
|
|
8
|
+
import { getAprBreakdown } from '../../utils/getAprBreakdown.js'
|
|
8
9
|
import { OneEther, Zero } from '../../utils/index.js'
|
|
9
|
-
import { type SdtEmissionData,
|
|
10
|
+
import { type SdtEmissionData, getSdtApr } from '../../utils/sdt.js'
|
|
10
11
|
import { buildCurveStrategies } from '../build.js'
|
|
11
12
|
import { getCurveHttpCalls } from '../httpCalls.js'
|
|
12
13
|
import { getOnChainSdCurveData } from '../onChainCalls.js'
|
|
13
14
|
import type { GaugesWeightsData } from './curveApiData/getGaugesWeights.js'
|
|
14
|
-
import { getAprBreakdown } from './getAprBreakdown.js'
|
|
15
15
|
import { getCvxApr } from './getCvxApr.js'
|
|
16
16
|
import getOnlyboostData from './getOnlyboostData.js'
|
|
17
17
|
import { getCurveStratsWithApr } from './getStratsWithApr.js'
|
|
18
|
-
import type { StratGlobalData } from './types.js'
|
|
19
18
|
|
|
20
19
|
export const fetchCurve = async (
|
|
21
20
|
prices: any, // TODO Type
|
|
@@ -27,7 +26,7 @@ export const fetchCurve = async (
|
|
|
27
26
|
lastBlockNumber: number,
|
|
28
27
|
sdtEmissionData: SdtEmissionData,
|
|
29
28
|
gaugesWeights: GaugesWeightsData,
|
|
30
|
-
) => {
|
|
29
|
+
): Promise<StrategyData> => {
|
|
31
30
|
const apisData = await getCurveHttpCalls(explorerApiKey, explorer, rpc, chainId, lastBlockNumber, gaugesWeights)
|
|
32
31
|
|
|
33
32
|
const newVaultAndLp =
|
|
@@ -39,11 +38,15 @@ export const fetchCurve = async (
|
|
|
39
38
|
|
|
40
39
|
const strats: any[] = await buildCurveStrategies(provider, allVaultAndLp, chainId, apisData.curveApiData)
|
|
41
40
|
|
|
42
|
-
const { curveStratsWithApr: stratsWithApr, curveStratsDataCalls: stratsDataCalls } = getCurveStratsWithApr(
|
|
41
|
+
const { curveStratsWithApr: stratsWithApr, curveStratsDataCalls: stratsDataCalls } = getCurveStratsWithApr(
|
|
42
|
+
chainId,
|
|
43
|
+
strats,
|
|
44
|
+
apisData,
|
|
45
|
+
)
|
|
43
46
|
|
|
44
47
|
const decodedPromise = await getOnChainSdCurveData(chainId, rpc, stratsDataCalls)
|
|
45
48
|
|
|
46
|
-
const global:
|
|
49
|
+
const global: CurveGlobalData = {
|
|
47
50
|
totalGaugeWeights: '0',
|
|
48
51
|
nextEffectiveTimestamp: '0',
|
|
49
52
|
cvxTotalSupply: '0',
|
|
@@ -153,19 +156,7 @@ export const fetchCurve = async (
|
|
|
153
156
|
}
|
|
154
157
|
})
|
|
155
158
|
|
|
156
|
-
|
|
157
|
-
sdtUserApr: 0,
|
|
158
|
-
sdtFuturUserApr: 0,
|
|
159
|
-
sdtMinApr: 0,
|
|
160
|
-
sdtFuturMinApr: 0,
|
|
161
|
-
sdtMaxApr: 0,
|
|
162
|
-
sdtFuturMaxApr: 0,
|
|
163
|
-
sdtBoost: 1,
|
|
164
|
-
}
|
|
165
|
-
const sdtRewards = rewardsData.find((r) => r.token.symbol === 'SDT')
|
|
166
|
-
if (sdtRewards) {
|
|
167
|
-
sdtApr = computeSdtApr(sdtEmissionData, sdtRewards, undefined, sdGauge, strat.lpPriceInUsd)
|
|
168
|
-
}
|
|
159
|
+
const sdtApr = getSdtApr(rewardsData, sdtEmissionData, sdGauge, strat.lpPriceInUsd, undefined)
|
|
169
160
|
|
|
170
161
|
let convexCrvProjectedApr = 0
|
|
171
162
|
let cvxApr = 0
|
|
@@ -184,7 +175,7 @@ export const fetchCurve = async (
|
|
|
184
175
|
: 0
|
|
185
176
|
}
|
|
186
177
|
|
|
187
|
-
const apr = getAprBreakdown(strat, rewardsData, boost,
|
|
178
|
+
const apr = getAprBreakdown(strat, rewardsData, boost, sdtApr, cvxApr)
|
|
188
179
|
|
|
189
180
|
return {
|
|
190
181
|
...strat,
|
|
@@ -216,7 +207,6 @@ export const fetchCurve = async (
|
|
|
216
207
|
totalSupply,
|
|
217
208
|
strategyHoldings: formatUnits(v.strategyHoldings, 0),
|
|
218
209
|
workingBalance: formatUnits(v.workingBalance, 0),
|
|
219
|
-
workingSupplyStaked: formatUnits(v.workingSupplyStaked, 0),
|
|
220
210
|
sdGauge,
|
|
221
211
|
vaultFees:
|
|
222
212
|
chainId === mainnet.id
|
|
@@ -78,7 +78,9 @@ export const getCurveHttpCalls = async (
|
|
|
78
78
|
|
|
79
79
|
const arbiscanData = arbitrumHttpResponses[0]
|
|
80
80
|
const arbitrumCurveData = arbitrumHttpResponses[1]
|
|
81
|
-
const arbitrumCurveSubgraph = arbitrumHttpResponses[2].success
|
|
81
|
+
const arbitrumCurveSubgraph = arbitrumHttpResponses[2].success
|
|
82
|
+
? arbitrumHttpResponses[2].data.poolList
|
|
83
|
+
: undefined
|
|
82
84
|
|
|
83
85
|
return {
|
|
84
86
|
explorerData: arbiscanData,
|
package/src/strategies/types.ts
CHANGED
|
@@ -65,7 +65,7 @@ export type Fees = {
|
|
|
65
65
|
|
|
66
66
|
export type VaultFees = {
|
|
67
67
|
keeper: number
|
|
68
|
-
accumulated:
|
|
68
|
+
accumulated: string
|
|
69
69
|
}
|
|
70
70
|
|
|
71
71
|
export type SdtApr = {
|
|
@@ -94,15 +94,18 @@ export type Strategy = {
|
|
|
94
94
|
type: string
|
|
95
95
|
protocol: string
|
|
96
96
|
chainId: number
|
|
97
|
-
isMetapool
|
|
98
|
-
isLending
|
|
97
|
+
isMetapool?: boolean
|
|
98
|
+
isLending?: boolean
|
|
99
99
|
vault: string
|
|
100
100
|
lpToken: Coin
|
|
101
101
|
gaugeAddress: string
|
|
102
|
+
gaugeToken?: Coin & { version: number }
|
|
102
103
|
coins: Coin[]
|
|
103
104
|
underlyingCoins?: Coin[]
|
|
104
105
|
rewards: RewardsData[]
|
|
105
106
|
name: string
|
|
107
|
+
tradingApy: number
|
|
108
|
+
underlyingApy?: number
|
|
106
109
|
minApr: number
|
|
107
110
|
maxApr: number
|
|
108
111
|
lpPriceInUsd: number
|
|
@@ -120,18 +123,61 @@ export type Strategy = {
|
|
|
120
123
|
boost: number
|
|
121
124
|
current: AprDetail
|
|
122
125
|
projected: AprDetail
|
|
123
|
-
onlyboost
|
|
126
|
+
onlyboost?: {
|
|
124
127
|
convex: OnlyBoostAprDetail
|
|
125
128
|
optimal: OnlyBoostAprDetail
|
|
126
129
|
}
|
|
127
130
|
}
|
|
128
|
-
sdtApr
|
|
131
|
+
sdtApr?: SdtApr
|
|
129
132
|
vaultHoldings: string
|
|
130
133
|
totalSupply: string
|
|
131
134
|
strategyHoldings: string
|
|
132
135
|
workingBalance: string
|
|
133
|
-
workingSupplyStaked: string
|
|
134
136
|
sdGauge: SdGauge
|
|
135
137
|
vaultFees: VaultFees
|
|
136
138
|
onlyboost?: OnlyBoostData | { active: boolean }
|
|
137
139
|
}
|
|
140
|
+
|
|
141
|
+
// GLOBAL DATA TYPE
|
|
142
|
+
|
|
143
|
+
export type CurveGlobalData = {
|
|
144
|
+
totalGaugeWeights: string
|
|
145
|
+
nextEffectiveTimestamp: string
|
|
146
|
+
cvxTotalSupply: string
|
|
147
|
+
veCrvTotalSupply: string
|
|
148
|
+
stakeDaoVeBoost: string
|
|
149
|
+
convexVeBoost: string
|
|
150
|
+
fees: Fees
|
|
151
|
+
}
|
|
152
|
+
|
|
153
|
+
export type YearnGlobalData = {
|
|
154
|
+
totalGaugeWeights: string
|
|
155
|
+
fees: Fees
|
|
156
|
+
}
|
|
157
|
+
|
|
158
|
+
export type Global = CurveGlobalData | YearnGlobalData
|
|
159
|
+
|
|
160
|
+
export type StrategyData = {
|
|
161
|
+
global?: Global
|
|
162
|
+
deployed: Strategy[]
|
|
163
|
+
notDeployed: any
|
|
164
|
+
fetched: boolean
|
|
165
|
+
}
|
|
166
|
+
|
|
167
|
+
export type BuiltStrat = {
|
|
168
|
+
key: string
|
|
169
|
+
type: string
|
|
170
|
+
protocol: string
|
|
171
|
+
chainId: number
|
|
172
|
+
isMetapool?: boolean
|
|
173
|
+
isLending?: boolean
|
|
174
|
+
vault: string
|
|
175
|
+
lpToken: Coin
|
|
176
|
+
gaugeAddress: string
|
|
177
|
+
gaugeToken?: Coin & { version: number }
|
|
178
|
+
coins: Coin[]
|
|
179
|
+
underlyingCoins?: Coin[]
|
|
180
|
+
sdGauge: string
|
|
181
|
+
rewards: Coin[]
|
|
182
|
+
underlyingReward?: Coin
|
|
183
|
+
}
|
|
@@ -1,12 +1,18 @@
|
|
|
1
|
-
import { getBreakdownLabel, isProtocolToken } from '
|
|
2
|
-
import type { RewardsData } from '
|
|
1
|
+
import { getBreakdownLabel, isProtocolToken } from '../../utils.js'
|
|
2
|
+
import type { RewardsData } from '../types.js'
|
|
3
3
|
|
|
4
4
|
type Breakdown = {
|
|
5
5
|
label: string
|
|
6
6
|
value: number[]
|
|
7
7
|
}
|
|
8
8
|
|
|
9
|
-
export const getAprBreakdown = (
|
|
9
|
+
export const getAprBreakdown = (
|
|
10
|
+
strat: any,
|
|
11
|
+
rewardsData: RewardsData[],
|
|
12
|
+
boost: number,
|
|
13
|
+
sdtApr: any,
|
|
14
|
+
cvxApr: number = 0,
|
|
15
|
+
) => {
|
|
10
16
|
// Base Rewards
|
|
11
17
|
// Trading Fees for LP
|
|
12
18
|
// Supply APY for lending
|
|
@@ -15,6 +21,13 @@ export const getAprBreakdown = (strat: any, rewardsData: RewardsData[], boost: n
|
|
|
15
21
|
value: [strat?.tradingApy || 0],
|
|
16
22
|
}
|
|
17
23
|
|
|
24
|
+
const underlyingReward = strat.underlyingReward
|
|
25
|
+
? {
|
|
26
|
+
label: `Underlying Yield (${strat.underlyingReward.symbol})`,
|
|
27
|
+
value: [strat.underlyingReward.apy],
|
|
28
|
+
}
|
|
29
|
+
: { label: '', value: [0] }
|
|
30
|
+
|
|
18
31
|
// Current streaming APRs from the Stake DAO gauge
|
|
19
32
|
const currentAprBreakdown: Breakdown[] = rewardsData.map((r) => {
|
|
20
33
|
const value = r.token.symbol === 'SDT' ? [sdtApr.sdtMinApr, sdtApr.sdtMaxApr] : [r.apr]
|
|
@@ -25,10 +38,10 @@ export const getAprBreakdown = (strat: any, rewardsData: RewardsData[], boost: n
|
|
|
25
38
|
}
|
|
26
39
|
})
|
|
27
40
|
|
|
28
|
-
// Projected CRV APR
|
|
41
|
+
// Projected Protocol Token (CRV, dYFI, CAKE, ...) APR
|
|
29
42
|
const projectedCrvApr = strat ? boost * strat.minApr : 0
|
|
30
43
|
|
|
31
|
-
// Projected CVX APR
|
|
44
|
+
// Projected CVX APR - for Onlyboost Convex only
|
|
32
45
|
const projectedCvxApr = { label: 'CVX APR', value: [cvxApr] }
|
|
33
46
|
|
|
34
47
|
// Format SDT and CRV rewards APR for breakdown
|
|
@@ -64,11 +77,14 @@ export const getAprBreakdown = (strat: any, rewardsData: RewardsData[], boost: n
|
|
|
64
77
|
|
|
65
78
|
// Compute total current APR
|
|
66
79
|
const currentTotal =
|
|
67
|
-
baseReward.value[0]! +
|
|
80
|
+
baseReward.value[0]! +
|
|
81
|
+
underlyingReward.value[0] +
|
|
82
|
+
currentAprBreakdown.reduce((total: number, curr) => total + curr.value[0]!, 0)
|
|
68
83
|
|
|
69
84
|
// Compute total projected APR
|
|
70
85
|
const projectedTotal =
|
|
71
86
|
baseReward.value[0]! +
|
|
87
|
+
underlyingReward.value[0] +
|
|
72
88
|
projectedAprBreakdown.reduce((total: number, curr) => total + curr.value[0]!, 0) +
|
|
73
89
|
cvxApr +
|
|
74
90
|
(strat.gaugesProjectedApr ? strat.gaugesProjectedApr.reduce((total: number, y: any) => total + y.apr, 0) : 0) +
|
|
@@ -77,12 +93,13 @@ export const getAprBreakdown = (strat: any, rewardsData: RewardsData[], boost: n
|
|
|
77
93
|
return {
|
|
78
94
|
current: {
|
|
79
95
|
total: currentTotal,
|
|
80
|
-
details: [baseReward, ...currentAprBreakdown].filter((r) => r
|
|
96
|
+
details: [baseReward, underlyingReward, ...currentAprBreakdown].filter((r) => r?.value[0] > 0 || false),
|
|
81
97
|
},
|
|
82
98
|
projected: {
|
|
83
99
|
total: projectedTotal,
|
|
84
100
|
details: [
|
|
85
101
|
baseReward,
|
|
102
|
+
underlyingReward,
|
|
86
103
|
...projectedAprBreakdown,
|
|
87
104
|
...(strat?.gaugesProjectedApr
|
|
88
105
|
? strat.gaugesProjectedApr.map((r: any) => ({
|
|
@@ -92,7 +109,7 @@ export const getAprBreakdown = (strat: any, rewardsData: RewardsData[], boost: n
|
|
|
92
109
|
: []),
|
|
93
110
|
...extraTokensAprBreakdown,
|
|
94
111
|
projectedCvxApr,
|
|
95
|
-
].filter((r) => r
|
|
112
|
+
].filter((r) => r?.value[0] > 0 || false),
|
|
96
113
|
},
|
|
97
114
|
}
|
|
98
115
|
}
|
|
@@ -204,3 +204,27 @@ export const computeSdtApr = (
|
|
|
204
204
|
sdtBoost: sdtRangeApr?.sdtBoost || 1,
|
|
205
205
|
}
|
|
206
206
|
}
|
|
207
|
+
|
|
208
|
+
export const getSdtApr = (
|
|
209
|
+
rewardsData: any, // TODO Type
|
|
210
|
+
sdtEmissionData: SdtEmissionData,
|
|
211
|
+
sdGauge: any,
|
|
212
|
+
lpPriceInUsd: number,
|
|
213
|
+
userData: any,
|
|
214
|
+
): SdtApr => {
|
|
215
|
+
let sdtApr: SdtApr = {
|
|
216
|
+
sdtUserApr: 0,
|
|
217
|
+
sdtFuturUserApr: 0,
|
|
218
|
+
sdtMinApr: 0,
|
|
219
|
+
sdtFuturMinApr: 0,
|
|
220
|
+
sdtMaxApr: 0,
|
|
221
|
+
sdtFuturMaxApr: 0,
|
|
222
|
+
sdtBoost: 1,
|
|
223
|
+
}
|
|
224
|
+
const sdtRewards = rewardsData.find((r) => r.token.symbol === 'SDT')
|
|
225
|
+
if (sdtRewards) {
|
|
226
|
+
sdtApr = computeSdtApr(sdtEmissionData, sdtRewards, userData, sdGauge, lpPriceInUsd)
|
|
227
|
+
}
|
|
228
|
+
|
|
229
|
+
return sdtApr
|
|
230
|
+
}
|
|
@@ -0,0 +1,156 @@
|
|
|
1
|
+
import { chunk, remove, uniq } from 'lodash-es'
|
|
2
|
+
import { decodeAbiParameters, encodeAbiParameters, parseAbiParameters } from 'viem'
|
|
3
|
+
|
|
4
|
+
import { contracts, tokens } from '@stake-dao/constants'
|
|
5
|
+
import type { FetchedToken, Token } from '@stake-dao/constants'
|
|
6
|
+
import { batchSdtGaugeRewards, batchTokenData, buildYearnStrats } from '../../batches/index.js'
|
|
7
|
+
import { equalTlc, getTokenInfo } from '../../utils.js'
|
|
8
|
+
import type { BuiltStrat } from '../types.js'
|
|
9
|
+
|
|
10
|
+
interface VaultAndLp {
|
|
11
|
+
vault: string
|
|
12
|
+
lpToken: string
|
|
13
|
+
}
|
|
14
|
+
|
|
15
|
+
export const buildYearnStrategies = async (
|
|
16
|
+
provider: any,
|
|
17
|
+
stratsList: VaultAndLp[],
|
|
18
|
+
chainId: number,
|
|
19
|
+
): Promise<BuiltStrat[]> => {
|
|
20
|
+
const tokensToFetch: string[] = []
|
|
21
|
+
|
|
22
|
+
const inputArgsChunks = chunk(stratsList, 30)
|
|
23
|
+
const stratsPromise = await Promise.allSettled(
|
|
24
|
+
inputArgsChunks.map(async (inputArgs) => {
|
|
25
|
+
const inputData = encodeAbiParameters(parseAbiParameters(buildYearnStrats.inputType![chainId]!) as any, [
|
|
26
|
+
contracts.yearnGaugeFactory![chainId],
|
|
27
|
+
inputArgs,
|
|
28
|
+
])
|
|
29
|
+
const contractCreationCode = buildYearnStrats.bytecode![chainId]!.concat(inputData.slice(2))
|
|
30
|
+
const returnedData = await provider.call({
|
|
31
|
+
data: contractCreationCode,
|
|
32
|
+
})
|
|
33
|
+
return decodeAbiParameters(buildYearnStrats.outputType![chainId]! as any, returnedData.data)
|
|
34
|
+
}),
|
|
35
|
+
)
|
|
36
|
+
const fetchedStrats = stratsPromise.flatMap((d) => (d.status === 'fulfilled' ? d.value[0].yearnStrats : [])).flat()
|
|
37
|
+
|
|
38
|
+
const strats = stratsList.map((data, index) => {
|
|
39
|
+
const vault = data.vault
|
|
40
|
+
const lpToken = data.lpToken
|
|
41
|
+
const gaugeAddress = fetchedStrats[index].gauge
|
|
42
|
+
const sdGauge = fetchedStrats[index].sdGauge
|
|
43
|
+
|
|
44
|
+
const coins = fetchedStrats[index].coins
|
|
45
|
+
const rewards = fetchedStrats[index].rewardsTokens
|
|
46
|
+
const underlyingReward = fetchedStrats[index].underlyingReward
|
|
47
|
+
const gaugeVersion = Number(fetchedStrats[index].gaugeVersion)
|
|
48
|
+
|
|
49
|
+
for (const c of coins) tokensToFetch.push(c)
|
|
50
|
+
for (const c of rewards) tokensToFetch.push(c)
|
|
51
|
+
tokensToFetch.push(lpToken)
|
|
52
|
+
tokensToFetch.push(gaugeAddress)
|
|
53
|
+
tokensToFetch.push(underlyingReward)
|
|
54
|
+
|
|
55
|
+
return {
|
|
56
|
+
key: vault,
|
|
57
|
+
vault,
|
|
58
|
+
gaugeAddress,
|
|
59
|
+
sdGauge,
|
|
60
|
+
lpToken,
|
|
61
|
+
coins,
|
|
62
|
+
rewards,
|
|
63
|
+
underlyingReward,
|
|
64
|
+
gaugeVersion,
|
|
65
|
+
}
|
|
66
|
+
})
|
|
67
|
+
|
|
68
|
+
// Fetch tokens infos
|
|
69
|
+
const tokensInputArgsChunks = chunk(
|
|
70
|
+
remove(uniq(tokensToFetch), (t) => !tokens.find((token: Token) => token.address === t)),
|
|
71
|
+
40,
|
|
72
|
+
)
|
|
73
|
+
const decodedPromise = await Promise.allSettled(
|
|
74
|
+
tokensInputArgsChunks.map(async (inputArgs) => {
|
|
75
|
+
const inputData = encodeAbiParameters(parseAbiParameters(batchTokenData.inputType[chainId] || []) as any, [
|
|
76
|
+
inputArgs,
|
|
77
|
+
])
|
|
78
|
+
const contractCreationCode = batchTokenData.bytecode[chainId]?.concat(inputData.slice(2))
|
|
79
|
+
const returnedData = await provider.call({
|
|
80
|
+
data: contractCreationCode,
|
|
81
|
+
})
|
|
82
|
+
return decodeAbiParameters(
|
|
83
|
+
parseAbiParameters(batchTokenData.outputTypeHr[chainId] || []) as any,
|
|
84
|
+
returnedData.data,
|
|
85
|
+
)
|
|
86
|
+
}),
|
|
87
|
+
)
|
|
88
|
+
|
|
89
|
+
const fetchedTokenData = decodedPromise.flatMap((d) => (d.status === 'fulfilled' ? d.value : [])).flat()
|
|
90
|
+
|
|
91
|
+
// Fetch Sdt Gauge rewards tokens infos
|
|
92
|
+
const sdtGaugeInputArgsChunks = chunk(
|
|
93
|
+
stratsList.map((data) => data.vault),
|
|
94
|
+
30,
|
|
95
|
+
)
|
|
96
|
+
const sdtGaugedecodedPromise = await Promise.allSettled(
|
|
97
|
+
sdtGaugeInputArgsChunks.map(async (inputArgs) => {
|
|
98
|
+
const inputData = encodeAbiParameters(parseAbiParameters(batchSdtGaugeRewards.inputType[chainId] || []) as any, [
|
|
99
|
+
inputArgs,
|
|
100
|
+
])
|
|
101
|
+
const contractCreationCode = batchSdtGaugeRewards.bytecode[chainId]?.concat(inputData.slice(2))
|
|
102
|
+
const returnedData = await provider.call({
|
|
103
|
+
data: contractCreationCode,
|
|
104
|
+
})
|
|
105
|
+
return decodeAbiParameters(
|
|
106
|
+
parseAbiParameters(batchSdtGaugeRewards.outputTypeHr[chainId] || []) as any,
|
|
107
|
+
returnedData.data,
|
|
108
|
+
)
|
|
109
|
+
}),
|
|
110
|
+
)
|
|
111
|
+
const fetchedSdtGaugeData = sdtGaugedecodedPromise.flatMap((d) => (d.status === 'fulfilled' ? d.value : [])).flat()
|
|
112
|
+
|
|
113
|
+
const stratsData = strats.map((s, index) => {
|
|
114
|
+
const coinsData = s.coins.map((c) =>
|
|
115
|
+
getTokenInfo(
|
|
116
|
+
fetchedTokenData.find((t) => equalTlc(t.tokenAddress, c)),
|
|
117
|
+
c,
|
|
118
|
+
chainId,
|
|
119
|
+
),
|
|
120
|
+
)
|
|
121
|
+
const stakeTokenData = getTokenInfo(
|
|
122
|
+
fetchedTokenData.find((t) => equalTlc(t.tokenAddress, s.lpToken)),
|
|
123
|
+
s.lpToken,
|
|
124
|
+
chainId,
|
|
125
|
+
)
|
|
126
|
+
const gaugeTokenData = getTokenInfo(
|
|
127
|
+
fetchedTokenData.find((t) => equalTlc(t.tokenAddress, s.gaugeAddress)),
|
|
128
|
+
s.gaugeAddress,
|
|
129
|
+
chainId,
|
|
130
|
+
)
|
|
131
|
+
const underlyingRewardData = getTokenInfo(
|
|
132
|
+
fetchedTokenData.find((t) => equalTlc(t.tokenAddress, s.underlyingReward)),
|
|
133
|
+
s.underlyingReward,
|
|
134
|
+
chainId,
|
|
135
|
+
)
|
|
136
|
+
|
|
137
|
+
return {
|
|
138
|
+
key: s.key,
|
|
139
|
+
type: 'veyfi-gauge',
|
|
140
|
+
protocol: 'yearn',
|
|
141
|
+
chainId: chainId,
|
|
142
|
+
vault: s.vault,
|
|
143
|
+
gaugeAddress: s.gaugeAddress,
|
|
144
|
+
lpToken: stakeTokenData,
|
|
145
|
+
gaugeToken: { ...gaugeTokenData, version: s.gaugeVersion },
|
|
146
|
+
coins: coinsData,
|
|
147
|
+
sdGauge: fetchedSdtGaugeData[index]?.gauge || undefined,
|
|
148
|
+
rewards: fetchedSdtGaugeData[index]?.rewards.map((tokenInfo: FetchedToken) =>
|
|
149
|
+
getTokenInfo(tokenInfo, tokenInfo.tokenAddress, chainId),
|
|
150
|
+
),
|
|
151
|
+
underlyingReward: underlyingRewardData,
|
|
152
|
+
}
|
|
153
|
+
})
|
|
154
|
+
|
|
155
|
+
return stratsData
|
|
156
|
+
}
|
|
@@ -0,0 +1,47 @@
|
|
|
1
|
+
import { formatUnits } from 'viem'
|
|
2
|
+
|
|
3
|
+
import { ONE_YEAR, STRAT_FEES } from '@stake-dao/constants'
|
|
4
|
+
|
|
5
|
+
export const computeYearnApr = (args: {
|
|
6
|
+
rawTotalAssets: bigint
|
|
7
|
+
rawRewardRate: bigint
|
|
8
|
+
rawPricePerShare: bigint
|
|
9
|
+
dYfiPrice: number
|
|
10
|
+
strat: any
|
|
11
|
+
yearnApiData: any
|
|
12
|
+
}) => {
|
|
13
|
+
const { rawTotalAssets, rawRewardRate, rawPricePerShare, dYfiPrice, strat, yearnApiData } = args
|
|
14
|
+
|
|
15
|
+
const yearnStratApiData = yearnApiData.find(
|
|
16
|
+
(element) => element.address.toLowerCase() === strat.lpToken.address.toLowerCase(),
|
|
17
|
+
)
|
|
18
|
+
|
|
19
|
+
const underlyingAprLpPriceInUsd = yearnStratApiData ? yearnStratApiData.tvl.price : 0
|
|
20
|
+
const lpPriceInUsd = underlyingAprLpPriceInUsd * Number(formatUnits(rawPricePerShare, strat.lpToken.decimals))
|
|
21
|
+
|
|
22
|
+
const vaultMonthlyApr = yearnStratApiData ? yearnStratApiData.apr.points.monthAgo : 0
|
|
23
|
+
const vaultWeeklyApr = yearnStratApiData ? yearnStratApiData.apr.points.weekAgo : 0
|
|
24
|
+
const underlyingApr = (vaultMonthlyApr === 0 ? vaultWeeklyApr : vaultMonthlyApr) * 100
|
|
25
|
+
|
|
26
|
+
const totalAssets = Number(formatUnits(rawTotalAssets, strat.gaugeToken.decimals))
|
|
27
|
+
|
|
28
|
+
const rewardScale = (strat.gaugeToken.version === 2 ? 36 : 18) + (18 - strat.lpToken.decimals)
|
|
29
|
+
const rewardRate = Number(formatUnits(rawRewardRate, rewardScale))
|
|
30
|
+
|
|
31
|
+
const maxApr =
|
|
32
|
+
lpPriceInUsd > 0 && rewardRate > 0 && totalAssets > 0
|
|
33
|
+
? (rewardRate * dYfiPrice * ONE_YEAR) / totalAssets / lpPriceInUsd
|
|
34
|
+
: 0
|
|
35
|
+
const minApr = maxApr / 10
|
|
36
|
+
|
|
37
|
+
const coins = strat.underlyingCoins && strat.underlyingCoins.length > 0 ? strat.underlyingCoins : strat.coins
|
|
38
|
+
|
|
39
|
+
return {
|
|
40
|
+
...strat,
|
|
41
|
+
name: coins.reduce((res: string, current) => `${res}/${current.symbol}`, '').slice(1),
|
|
42
|
+
lpPriceInUsd,
|
|
43
|
+
underlyingApr,
|
|
44
|
+
minApr: minApr * (100 - STRAT_FEES),
|
|
45
|
+
maxApr: maxApr * (100 - STRAT_FEES),
|
|
46
|
+
}
|
|
47
|
+
}
|