@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.
Files changed (191) hide show
  1. package/dist/esm/batches/buildYearnStrats.js +39 -0
  2. package/dist/esm/batches/buildYearnStrats.js.map +1 -0
  3. package/dist/esm/batches/curveStrats.js +4 -6
  4. package/dist/esm/batches/curveStrats.js.map +1 -1
  5. package/dist/esm/batches/fetchYearnGauges.js +76 -0
  6. package/dist/esm/batches/fetchYearnGauges.js.map +1 -0
  7. package/dist/esm/batches/index.js +2 -0
  8. package/dist/esm/batches/index.js.map +1 -1
  9. package/dist/esm/index.js +2 -0
  10. package/dist/esm/index.js.map +1 -1
  11. package/dist/esm/lockers/abis/MulticallLockers.json +591 -0
  12. package/dist/esm/lockers/fetch/index.js +306 -0
  13. package/dist/esm/lockers/fetch/index.js.map +1 -0
  14. package/dist/esm/lockers/utils/cakeLockerAirdrop.js +46 -0
  15. package/dist/esm/lockers/utils/cakeLockerAirdrop.js.map +1 -0
  16. package/dist/esm/lockers/utils/callsForLockers/depositorCalls.js +20 -0
  17. package/dist/esm/lockers/utils/callsForLockers/depositorCalls.js.map +1 -0
  18. package/dist/esm/lockers/utils/callsForLockers/feeCalls.js +94 -0
  19. package/dist/esm/lockers/utils/callsForLockers/feeCalls.js.map +1 -0
  20. package/dist/esm/lockers/utils/callsForLockers/gaugeCalls.js +6 -0
  21. package/dist/esm/lockers/utils/callsForLockers/gaugeCalls.js.map +1 -0
  22. package/dist/esm/lockers/utils/callsForLockers/gaugeControllerCalls.js +8 -0
  23. package/dist/esm/lockers/utils/callsForLockers/gaugeControllerCalls.js.map +1 -0
  24. package/dist/esm/lockers/utils/callsForLockers/index.js +29 -0
  25. package/dist/esm/lockers/utils/callsForLockers/index.js.map +1 -0
  26. package/dist/esm/lockers/utils/callsForLockers/pegCalls.js +38 -0
  27. package/dist/esm/lockers/utils/callsForLockers/pegCalls.js.map +1 -0
  28. package/dist/esm/lockers/utils/callsForLockers/veCalls.js +26 -0
  29. package/dist/esm/lockers/utils/callsForLockers/veCalls.js.map +1 -0
  30. package/dist/esm/lockers/utils/callsForLockers/veSdtCalls.js +14 -0
  31. package/dist/esm/lockers/utils/callsForLockers/veSdtCalls.js.map +1 -0
  32. package/dist/esm/lockers/utils/endpoints.js +23 -0
  33. package/dist/esm/lockers/utils/endpoints.js.map +1 -0
  34. package/dist/esm/lockers/utils/getBribesRewardsData.js +46 -0
  35. package/dist/esm/lockers/utils/getBribesRewardsData.js.map +1 -0
  36. package/dist/esm/lockers/utils/getCherriesLeaderBoard.js +22 -0
  37. package/dist/esm/lockers/utils/getCherriesLeaderBoard.js.map +1 -0
  38. package/dist/esm/lockers/utils/getFees.js +30 -0
  39. package/dist/esm/lockers/utils/getFees.js.map +1 -0
  40. package/dist/esm/lockers/utils/getHttpCalls.js +44 -0
  41. package/dist/esm/lockers/utils/getHttpCalls.js.map +1 -0
  42. package/dist/esm/lockers/utils/getSdtInflationData.js +38 -0
  43. package/dist/esm/lockers/utils/getSdtInflationData.js.map +1 -0
  44. package/dist/esm/lockers/utils/index.js +157 -0
  45. package/dist/esm/lockers/utils/index.js.map +1 -0
  46. package/dist/esm/lockers/utils/substractFees.js +22 -0
  47. package/dist/esm/lockers/utils/substractFees.js.map +1 -0
  48. package/dist/esm/strategies/curve/build.js +10 -7
  49. package/dist/esm/strategies/curve/build.js.map +1 -1
  50. package/dist/esm/strategies/curve/fetch/getStratsWithApr.js +1 -1
  51. package/dist/esm/strategies/curve/fetch/getStratsWithApr.js.map +1 -1
  52. package/dist/esm/strategies/curve/fetch/index.js +4 -17
  53. package/dist/esm/strategies/curve/fetch/index.js.map +1 -1
  54. package/dist/esm/strategies/curve/httpCalls.js +3 -1
  55. package/dist/esm/strategies/curve/httpCalls.js.map +1 -1
  56. package/dist/esm/strategies/utils/abis/MulticallYearnStratsAbi.json +107 -0
  57. package/dist/esm/strategies/{curve/fetch → utils}/getAprBreakdown.js +17 -7
  58. package/dist/esm/strategies/utils/getAprBreakdown.js.map +1 -0
  59. package/dist/esm/strategies/utils/index.js +1 -0
  60. package/dist/esm/strategies/utils/index.js.map +1 -1
  61. package/dist/esm/strategies/utils/sdt.js +17 -0
  62. package/dist/esm/strategies/utils/sdt.js.map +1 -1
  63. package/dist/esm/strategies/yearn/build.js +97 -0
  64. package/dist/esm/strategies/yearn/build.js.map +1 -0
  65. package/dist/esm/strategies/yearn/fetch/computeYearnApr.js +28 -0
  66. package/dist/esm/strategies/yearn/fetch/computeYearnApr.js.map +1 -0
  67. package/dist/esm/strategies/yearn/fetch/fetchAllYearnGauges.js +61 -0
  68. package/dist/esm/strategies/yearn/fetch/fetchAllYearnGauges.js.map +1 -0
  69. package/dist/esm/strategies/yearn/fetch/index.js +169 -0
  70. package/dist/esm/strategies/yearn/fetch/index.js.map +1 -0
  71. package/dist/esm/tsconfig.build.tsbuildinfo +1 -1
  72. package/dist/esm/utils.js +33 -1
  73. package/dist/esm/utils.js.map +1 -1
  74. package/dist/types/batches/buildYearnStrats.d.ts +4 -0
  75. package/dist/types/batches/buildYearnStrats.d.ts.map +1 -0
  76. package/dist/types/batches/curveStrats.d.ts.map +1 -1
  77. package/dist/types/batches/fetchYearnGauges.d.ts +4 -0
  78. package/dist/types/batches/fetchYearnGauges.d.ts.map +1 -0
  79. package/dist/types/batches/index.d.ts +2 -0
  80. package/dist/types/batches/index.d.ts.map +1 -1
  81. package/dist/types/index.d.ts +2 -0
  82. package/dist/types/index.d.ts.map +1 -1
  83. package/dist/types/lockers/fetch/index.d.ts +11 -0
  84. package/dist/types/lockers/fetch/index.d.ts.map +1 -0
  85. package/dist/types/lockers/utils/cakeLockerAirdrop.d.ts +8 -0
  86. package/dist/types/lockers/utils/cakeLockerAirdrop.d.ts.map +1 -0
  87. package/dist/types/lockers/utils/callsForLockers/depositorCalls.d.ts +3 -0
  88. package/dist/types/lockers/utils/callsForLockers/depositorCalls.d.ts.map +1 -0
  89. package/dist/types/lockers/utils/callsForLockers/feeCalls.d.ts +11 -0
  90. package/dist/types/lockers/utils/callsForLockers/feeCalls.d.ts.map +1 -0
  91. package/dist/types/lockers/utils/callsForLockers/gaugeCalls.d.ts +6 -0
  92. package/dist/types/lockers/utils/callsForLockers/gaugeCalls.d.ts.map +1 -0
  93. package/dist/types/lockers/utils/callsForLockers/gaugeControllerCalls.d.ts +11 -0
  94. package/dist/types/lockers/utils/callsForLockers/gaugeControllerCalls.d.ts.map +1 -0
  95. package/dist/types/lockers/utils/callsForLockers/index.d.ts +3 -0
  96. package/dist/types/lockers/utils/callsForLockers/index.d.ts.map +1 -0
  97. package/dist/types/lockers/utils/callsForLockers/pegCalls.d.ts +15 -0
  98. package/dist/types/lockers/utils/callsForLockers/pegCalls.d.ts.map +1 -0
  99. package/dist/types/lockers/utils/callsForLockers/veCalls.d.ts +3 -0
  100. package/dist/types/lockers/utils/callsForLockers/veCalls.d.ts.map +1 -0
  101. package/dist/types/lockers/utils/callsForLockers/veSdtCalls.d.ts +11 -0
  102. package/dist/types/lockers/utils/callsForLockers/veSdtCalls.d.ts.map +1 -0
  103. package/dist/types/lockers/utils/endpoints.d.ts +3 -0
  104. package/dist/types/lockers/utils/endpoints.d.ts.map +1 -0
  105. package/dist/types/lockers/utils/getBribesRewardsData.d.ts +18 -0
  106. package/dist/types/lockers/utils/getBribesRewardsData.d.ts.map +1 -0
  107. package/dist/types/lockers/utils/getCherriesLeaderBoard.d.ts +2 -0
  108. package/dist/types/lockers/utils/getCherriesLeaderBoard.d.ts.map +1 -0
  109. package/dist/types/lockers/utils/getFees.d.ts +4 -0
  110. package/dist/types/lockers/utils/getFees.d.ts.map +1 -0
  111. package/dist/types/lockers/utils/getHttpCalls.d.ts +11 -0
  112. package/dist/types/lockers/utils/getHttpCalls.d.ts.map +1 -0
  113. package/dist/types/lockers/utils/getSdtInflationData.d.ts +8 -0
  114. package/dist/types/lockers/utils/getSdtInflationData.d.ts.map +1 -0
  115. package/dist/types/lockers/utils/index.d.ts +30 -0
  116. package/dist/types/lockers/utils/index.d.ts.map +1 -0
  117. package/dist/types/lockers/utils/substractFees.d.ts +3 -0
  118. package/dist/types/lockers/utils/substractFees.d.ts.map +1 -0
  119. package/dist/types/prices.d.ts.map +1 -1
  120. package/dist/types/strategies/curve/build.d.ts +2 -31
  121. package/dist/types/strategies/curve/build.d.ts.map +1 -1
  122. package/dist/types/strategies/curve/endpoints.d.ts +2 -2
  123. package/dist/types/strategies/curve/fetch/curveApiData/getGaugesFromRegistry.d.ts.map +1 -1
  124. package/dist/types/strategies/curve/fetch/curveApiData/getGaugesWeights.d.ts.map +1 -1
  125. package/dist/types/strategies/curve/fetch/index.d.ts +2 -7
  126. package/dist/types/strategies/curve/fetch/index.d.ts.map +1 -1
  127. package/dist/types/strategies/curve/httpCalls.d.ts.map +1 -1
  128. package/dist/types/strategies/types.d.ts +49 -6
  129. package/dist/types/strategies/types.d.ts.map +1 -1
  130. package/dist/types/strategies/utils/getAprBreakdown.d.ts +15 -0
  131. package/dist/types/strategies/utils/getAprBreakdown.d.ts.map +1 -0
  132. package/dist/types/strategies/utils/index.d.ts +1 -0
  133. package/dist/types/strategies/utils/index.d.ts.map +1 -1
  134. package/dist/types/strategies/utils/promise.d.ts.map +1 -1
  135. package/dist/types/strategies/utils/sdt.d.ts +1 -0
  136. package/dist/types/strategies/utils/sdt.d.ts.map +1 -1
  137. package/dist/types/strategies/yearn/build.d.ts +8 -0
  138. package/dist/types/strategies/yearn/build.d.ts.map +1 -0
  139. package/dist/types/strategies/yearn/fetch/computeYearnApr.d.ts +9 -0
  140. package/dist/types/strategies/yearn/fetch/computeYearnApr.d.ts.map +1 -0
  141. package/dist/types/strategies/yearn/fetch/fetchAllYearnGauges.d.ts +2 -0
  142. package/dist/types/strategies/yearn/fetch/fetchAllYearnGauges.d.ts.map +1 -0
  143. package/dist/types/strategies/yearn/fetch/index.d.ts +5 -0
  144. package/dist/types/strategies/yearn/fetch/index.d.ts.map +1 -0
  145. package/dist/types/utils.d.ts +5 -0
  146. package/dist/types/utils.d.ts.map +1 -1
  147. package/package.json +3 -2
  148. package/src/batches/buildYearnStrats.ts +41 -0
  149. package/src/batches/curveStrats.ts +4 -6
  150. package/src/batches/fetchYearnGauges.ts +78 -0
  151. package/src/batches/index.ts +2 -0
  152. package/src/index.ts +2 -0
  153. package/src/lockers/fetch/index.ts +407 -0
  154. package/src/lockers/utils/cakeLockerAirdrop.ts +73 -0
  155. package/src/lockers/utils/callsForLockers/depositorCalls.ts +25 -0
  156. package/src/lockers/utils/callsForLockers/feeCalls.ts +118 -0
  157. package/src/lockers/utils/callsForLockers/gaugeCalls.ts +6 -0
  158. package/src/lockers/utils/callsForLockers/gaugeControllerCalls.ts +8 -0
  159. package/src/lockers/utils/callsForLockers/index.ts +44 -0
  160. package/src/lockers/utils/callsForLockers/pegCalls.ts +40 -0
  161. package/src/lockers/utils/callsForLockers/veCalls.ts +31 -0
  162. package/src/lockers/utils/callsForLockers/veSdtCalls.ts +15 -0
  163. package/src/lockers/utils/endpoints.ts +24 -0
  164. package/src/lockers/utils/getBribesRewardsData.ts +64 -0
  165. package/src/lockers/utils/getCherriesLeaderBoard.ts +34 -0
  166. package/src/lockers/utils/getFees.ts +34 -0
  167. package/src/lockers/utils/getHttpCalls.ts +55 -0
  168. package/src/lockers/utils/getSdtInflationData.ts +54 -0
  169. package/src/lockers/utils/index.ts +200 -0
  170. package/src/lockers/utils/substractFees.ts +26 -0
  171. package/src/strategies/curve/build.ts +49 -44
  172. package/src/strategies/curve/fetch/getStratsWithApr.ts +1 -1
  173. package/src/strategies/curve/fetch/index.ts +12 -22
  174. package/src/strategies/curve/httpCalls.ts +3 -1
  175. package/src/strategies/types.ts +52 -6
  176. package/src/strategies/{curve/fetch → utils}/getAprBreakdown.ts +25 -8
  177. package/src/strategies/utils/index.ts +1 -0
  178. package/src/strategies/utils/sdt.ts +24 -0
  179. package/src/strategies/yearn/build.ts +156 -0
  180. package/src/strategies/yearn/fetch/computeYearnApr.ts +47 -0
  181. package/src/strategies/yearn/fetch/fetchAllYearnGauges.ts +78 -0
  182. package/src/strategies/yearn/fetch/index.ts +225 -0
  183. package/src/utils.ts +43 -1
  184. package/dist/esm/strategies/curve/fetch/getAprBreakdown.js.map +0 -1
  185. package/dist/esm/strategies/curve/fetch/types.js +0 -2
  186. package/dist/esm/strategies/curve/fetch/types.js.map +0 -1
  187. package/dist/types/strategies/curve/fetch/getAprBreakdown.d.ts +0 -17
  188. package/dist/types/strategies/curve/fetch/getAprBreakdown.d.ts.map +0 -1
  189. package/dist/types/strategies/curve/fetch/types.d.ts +0 -11
  190. package/dist/types/strategies/curve/fetch/types.d.ts.map +0 -1
  191. 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.map((data) => {
24
- const lpToken = data.lpToken
25
- const curveApiData = externalApisResult.find((el) => equalTlc(el.lp, lpToken))
26
-
27
- if (curveApiData) {
28
- const isMetapool = curveApiData.isMetapool
29
- const isLending = curveApiData.isLending
30
-
31
- const coins: string[] = curveApiData.coins.map((c) => c.coinAddress)
32
-
33
- let underlyingCoins: string[] = []
34
- if (isMetapool || isLending) {
35
- underlyingCoins = curveApiData.underlyingCoins
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
- const gaugeAddress = curveApiData.gauge?.address || undefined
39
-
40
- for (const coin of coins) tokensToFetch.push(coin)
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: curveApiData.poolType,
50
- key: `${curveApiData.poolType}-${curveApiData.id}`,
51
- isMetapool,
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, SdtApr } from '../../types.js'
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, computeSdtApr } from '../../utils/sdt.js'
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(chainId, strats, apisData)
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: StratGlobalData = {
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
- let sdtApr: SdtApr = {
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, cvxApr, sdtApr)
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 ? arbitrumHttpResponses[2].data.poolList : undefined
81
+ const arbitrumCurveSubgraph = arbitrumHttpResponses[2].success
82
+ ? arbitrumHttpResponses[2].data.poolList
83
+ : undefined
82
84
 
83
85
  return {
84
86
  explorerData: arbiscanData,
@@ -65,7 +65,7 @@ export type Fees = {
65
65
 
66
66
  export type VaultFees = {
67
67
  keeper: number
68
- accumulated: number
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: boolean
98
- isLending: boolean
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: 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 '../../../utils.js'
2
- import type { RewardsData } from '../../types.js'
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 = (strat: any, rewardsData: RewardsData[], boost: number, cvxApr: number, sdtApr: any) => {
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]! + currentAprBreakdown.reduce((total: number, curr) => total + curr.value[0]!, 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.value[0] || -1 > 0),
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.value[0] > 0),
112
+ ].filter((r) => r?.value[0] > 0 || false),
96
113
  },
97
114
  }
98
115
  }
@@ -1,6 +1,7 @@
1
1
  import { parseEther } from 'viem'
2
2
 
3
3
  export const Zero = BigInt(0)
4
+ export const One = BigInt(1)
4
5
  export const OneEther = parseEther('1')
5
6
 
6
7
  export * from './boost.js'
@@ -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
+ }