@stake-dao/reader 0.1.0 → 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 (210) 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/curveApiData/abi.js +1 -1
  51. package/dist/esm/strategies/curve/fetch/curveApiData/abi.js.map +1 -1
  52. package/dist/esm/strategies/curve/fetch/curveApiData/bytecode.js +3 -3
  53. package/dist/esm/strategies/curve/fetch/curveApiData/bytecode.js.map +1 -1
  54. package/dist/esm/strategies/curve/fetch/curveApiData/config.js +1 -1
  55. package/dist/esm/strategies/curve/fetch/curveApiData/getCurveApiData.js +3 -6
  56. package/dist/esm/strategies/curve/fetch/curveApiData/getCurveApiData.js.map +1 -1
  57. package/dist/esm/strategies/curve/fetch/curveApiData/getGaugesWeights.js +1 -0
  58. package/dist/esm/strategies/curve/fetch/curveApiData/getGaugesWeights.js.map +1 -1
  59. package/dist/esm/strategies/curve/fetch/getStratsWithApr.js +26 -58
  60. package/dist/esm/strategies/curve/fetch/getStratsWithApr.js.map +1 -1
  61. package/dist/esm/strategies/curve/fetch/index.js +7 -23
  62. package/dist/esm/strategies/curve/fetch/index.js.map +1 -1
  63. package/dist/esm/strategies/curve/httpCalls.js +8 -24
  64. package/dist/esm/strategies/curve/httpCalls.js.map +1 -1
  65. package/dist/esm/strategies/utils/abis/MulticallYearnStratsAbi.json +107 -0
  66. package/dist/esm/strategies/{curve/fetch → utils}/getAprBreakdown.js +18 -8
  67. package/dist/esm/strategies/utils/getAprBreakdown.js.map +1 -0
  68. package/dist/esm/strategies/utils/index.js +1 -0
  69. package/dist/esm/strategies/utils/index.js.map +1 -1
  70. package/dist/esm/strategies/utils/sdt.js +17 -0
  71. package/dist/esm/strategies/utils/sdt.js.map +1 -1
  72. package/dist/esm/strategies/yearn/build.js +97 -0
  73. package/dist/esm/strategies/yearn/build.js.map +1 -0
  74. package/dist/esm/strategies/yearn/fetch/computeYearnApr.js +28 -0
  75. package/dist/esm/strategies/yearn/fetch/computeYearnApr.js.map +1 -0
  76. package/dist/esm/strategies/yearn/fetch/fetchAllYearnGauges.js +61 -0
  77. package/dist/esm/strategies/yearn/fetch/fetchAllYearnGauges.js.map +1 -0
  78. package/dist/esm/strategies/yearn/fetch/index.js +169 -0
  79. package/dist/esm/strategies/yearn/fetch/index.js.map +1 -0
  80. package/dist/esm/tsconfig.build.tsbuildinfo +1 -1
  81. package/dist/esm/utils.js +33 -1
  82. package/dist/esm/utils.js.map +1 -1
  83. package/dist/types/batches/buildYearnStrats.d.ts +4 -0
  84. package/dist/types/batches/buildYearnStrats.d.ts.map +1 -0
  85. package/dist/types/batches/curveStrats.d.ts.map +1 -1
  86. package/dist/types/batches/fetchYearnGauges.d.ts +4 -0
  87. package/dist/types/batches/fetchYearnGauges.d.ts.map +1 -0
  88. package/dist/types/batches/index.d.ts +2 -0
  89. package/dist/types/batches/index.d.ts.map +1 -1
  90. package/dist/types/index.d.ts +2 -0
  91. package/dist/types/index.d.ts.map +1 -1
  92. package/dist/types/lockers/fetch/index.d.ts +11 -0
  93. package/dist/types/lockers/fetch/index.d.ts.map +1 -0
  94. package/dist/types/lockers/utils/cakeLockerAirdrop.d.ts +8 -0
  95. package/dist/types/lockers/utils/cakeLockerAirdrop.d.ts.map +1 -0
  96. package/dist/types/lockers/utils/callsForLockers/depositorCalls.d.ts +3 -0
  97. package/dist/types/lockers/utils/callsForLockers/depositorCalls.d.ts.map +1 -0
  98. package/dist/types/lockers/utils/callsForLockers/feeCalls.d.ts +11 -0
  99. package/dist/types/lockers/utils/callsForLockers/feeCalls.d.ts.map +1 -0
  100. package/dist/types/lockers/utils/callsForLockers/gaugeCalls.d.ts +6 -0
  101. package/dist/types/lockers/utils/callsForLockers/gaugeCalls.d.ts.map +1 -0
  102. package/dist/types/lockers/utils/callsForLockers/gaugeControllerCalls.d.ts +11 -0
  103. package/dist/types/lockers/utils/callsForLockers/gaugeControllerCalls.d.ts.map +1 -0
  104. package/dist/types/lockers/utils/callsForLockers/index.d.ts +3 -0
  105. package/dist/types/lockers/utils/callsForLockers/index.d.ts.map +1 -0
  106. package/dist/types/lockers/utils/callsForLockers/pegCalls.d.ts +15 -0
  107. package/dist/types/lockers/utils/callsForLockers/pegCalls.d.ts.map +1 -0
  108. package/dist/types/lockers/utils/callsForLockers/veCalls.d.ts +3 -0
  109. package/dist/types/lockers/utils/callsForLockers/veCalls.d.ts.map +1 -0
  110. package/dist/types/lockers/utils/callsForLockers/veSdtCalls.d.ts +11 -0
  111. package/dist/types/lockers/utils/callsForLockers/veSdtCalls.d.ts.map +1 -0
  112. package/dist/types/lockers/utils/endpoints.d.ts +3 -0
  113. package/dist/types/lockers/utils/endpoints.d.ts.map +1 -0
  114. package/dist/types/lockers/utils/getBribesRewardsData.d.ts +18 -0
  115. package/dist/types/lockers/utils/getBribesRewardsData.d.ts.map +1 -0
  116. package/dist/types/lockers/utils/getCherriesLeaderBoard.d.ts +2 -0
  117. package/dist/types/lockers/utils/getCherriesLeaderBoard.d.ts.map +1 -0
  118. package/dist/types/lockers/utils/getFees.d.ts +4 -0
  119. package/dist/types/lockers/utils/getFees.d.ts.map +1 -0
  120. package/dist/types/lockers/utils/getHttpCalls.d.ts +11 -0
  121. package/dist/types/lockers/utils/getHttpCalls.d.ts.map +1 -0
  122. package/dist/types/lockers/utils/getSdtInflationData.d.ts +8 -0
  123. package/dist/types/lockers/utils/getSdtInflationData.d.ts.map +1 -0
  124. package/dist/types/lockers/utils/index.d.ts +30 -0
  125. package/dist/types/lockers/utils/index.d.ts.map +1 -0
  126. package/dist/types/lockers/utils/substractFees.d.ts +3 -0
  127. package/dist/types/lockers/utils/substractFees.d.ts.map +1 -0
  128. package/dist/types/strategies/curve/build.d.ts +2 -31
  129. package/dist/types/strategies/curve/build.d.ts.map +1 -1
  130. package/dist/types/strategies/curve/fetch/curveApiData/abi.d.ts.map +1 -1
  131. package/dist/types/strategies/curve/fetch/curveApiData/bytecode.d.ts +1 -1
  132. package/dist/types/strategies/curve/fetch/curveApiData/bytecode.d.ts.map +1 -1
  133. package/dist/types/strategies/curve/fetch/curveApiData/config.d.ts +1 -1
  134. package/dist/types/strategies/curve/fetch/curveApiData/getCurveApiData.d.ts.map +1 -1
  135. package/dist/types/strategies/curve/fetch/curveApiData/getGaugesWeights.d.ts +1 -0
  136. package/dist/types/strategies/curve/fetch/curveApiData/getGaugesWeights.d.ts.map +1 -1
  137. package/dist/types/strategies/curve/fetch/getStratsWithApr.d.ts +0 -4
  138. package/dist/types/strategies/curve/fetch/getStratsWithApr.d.ts.map +1 -1
  139. package/dist/types/strategies/curve/fetch/index.d.ts +2 -7
  140. package/dist/types/strategies/curve/fetch/index.d.ts.map +1 -1
  141. package/dist/types/strategies/curve/httpCalls.d.ts +3 -6
  142. package/dist/types/strategies/curve/httpCalls.d.ts.map +1 -1
  143. package/dist/types/strategies/types.d.ts +49 -6
  144. package/dist/types/strategies/types.d.ts.map +1 -1
  145. package/dist/types/strategies/utils/getAprBreakdown.d.ts +15 -0
  146. package/dist/types/strategies/utils/getAprBreakdown.d.ts.map +1 -0
  147. package/dist/types/strategies/utils/index.d.ts +1 -0
  148. package/dist/types/strategies/utils/index.d.ts.map +1 -1
  149. package/dist/types/strategies/utils/sdt.d.ts +1 -0
  150. package/dist/types/strategies/utils/sdt.d.ts.map +1 -1
  151. package/dist/types/strategies/yearn/build.d.ts +8 -0
  152. package/dist/types/strategies/yearn/build.d.ts.map +1 -0
  153. package/dist/types/strategies/yearn/fetch/computeYearnApr.d.ts +9 -0
  154. package/dist/types/strategies/yearn/fetch/computeYearnApr.d.ts.map +1 -0
  155. package/dist/types/strategies/yearn/fetch/fetchAllYearnGauges.d.ts +2 -0
  156. package/dist/types/strategies/yearn/fetch/fetchAllYearnGauges.d.ts.map +1 -0
  157. package/dist/types/strategies/yearn/fetch/index.d.ts +5 -0
  158. package/dist/types/strategies/yearn/fetch/index.d.ts.map +1 -0
  159. package/dist/types/utils.d.ts +5 -0
  160. package/dist/types/utils.d.ts.map +1 -1
  161. package/package.json +4 -3
  162. package/src/batches/buildYearnStrats.ts +41 -0
  163. package/src/batches/curveStrats.ts +4 -6
  164. package/src/batches/fetchYearnGauges.ts +78 -0
  165. package/src/batches/index.ts +2 -0
  166. package/src/index.ts +2 -0
  167. package/src/lockers/fetch/index.ts +407 -0
  168. package/src/lockers/utils/cakeLockerAirdrop.ts +73 -0
  169. package/src/lockers/utils/callsForLockers/depositorCalls.ts +25 -0
  170. package/src/lockers/utils/callsForLockers/feeCalls.ts +118 -0
  171. package/src/lockers/utils/callsForLockers/gaugeCalls.ts +6 -0
  172. package/src/lockers/utils/callsForLockers/gaugeControllerCalls.ts +8 -0
  173. package/src/lockers/utils/callsForLockers/index.ts +44 -0
  174. package/src/lockers/utils/callsForLockers/pegCalls.ts +40 -0
  175. package/src/lockers/utils/callsForLockers/veCalls.ts +31 -0
  176. package/src/lockers/utils/callsForLockers/veSdtCalls.ts +15 -0
  177. package/src/lockers/utils/endpoints.ts +24 -0
  178. package/src/lockers/utils/getBribesRewardsData.ts +64 -0
  179. package/src/lockers/utils/getCherriesLeaderBoard.ts +34 -0
  180. package/src/lockers/utils/getFees.ts +34 -0
  181. package/src/lockers/utils/getHttpCalls.ts +55 -0
  182. package/src/lockers/utils/getSdtInflationData.ts +54 -0
  183. package/src/lockers/utils/index.ts +200 -0
  184. package/src/lockers/utils/substractFees.ts +26 -0
  185. package/src/strategies/curve/build.ts +49 -44
  186. package/src/strategies/curve/fetch/curveApiData/abi.ts +1 -1
  187. package/src/strategies/curve/fetch/curveApiData/bytecode.ts +3 -3
  188. package/src/strategies/curve/fetch/curveApiData/config.ts +1 -1
  189. package/src/strategies/curve/fetch/curveApiData/getCurveApiData.ts +2 -2
  190. package/src/strategies/curve/fetch/curveApiData/getGaugesWeights.ts +2 -0
  191. package/src/strategies/curve/fetch/getStratsWithApr.ts +27 -81
  192. package/src/strategies/curve/fetch/index.ts +10 -29
  193. package/src/strategies/curve/httpCalls.ts +8 -24
  194. package/src/strategies/types.ts +52 -6
  195. package/src/strategies/{curve/fetch → utils}/getAprBreakdown.ts +26 -9
  196. package/src/strategies/utils/index.ts +1 -0
  197. package/src/strategies/utils/sdt.ts +24 -0
  198. package/src/strategies/yearn/build.ts +156 -0
  199. package/src/strategies/yearn/fetch/computeYearnApr.ts +47 -0
  200. package/src/strategies/yearn/fetch/fetchAllYearnGauges.ts +78 -0
  201. package/src/strategies/yearn/fetch/index.ts +225 -0
  202. package/src/utils.ts +43 -1
  203. package/dist/esm/strategies/curve/fetch/getAprBreakdown.js.map +0 -1
  204. package/dist/esm/strategies/curve/fetch/types.js +0 -2
  205. package/dist/esm/strategies/curve/fetch/types.js.map +0 -1
  206. package/dist/types/strategies/curve/fetch/getAprBreakdown.d.ts +0 -17
  207. package/dist/types/strategies/curve/fetch/getAprBreakdown.d.ts.map +0 -1
  208. package/dist/types/strategies/curve/fetch/types.d.ts +0 -11
  209. package/dist/types/strategies/curve/fetch/types.d.ts.map +0 -1
  210. package/src/strategies/curve/fetch/types.ts +0 -11
@@ -1,12 +1,30 @@
1
- import { formatUnits, parseAbi } from 'viem'
1
+ import { STRAT_FEES } from '@stake-dao/constants'
2
+ import { mainnet } from 'viem/chains'
3
+ import { equalTlc } from '../../../utils.js'
4
+
5
+ const getConvexPool = (apisData: any, chainId: number, isLending: boolean, stratLpAddress: string) => {
6
+ if (chainId === mainnet.id) {
7
+ if (isLending) {
8
+ return apisData.convexLendingVaults.find((pool: any) => equalTlc(pool.address, stratLpAddress))
9
+ }
10
+ return apisData.convexPools.find((pool: any) => equalTlc(pool.lpTokenAddress, stratLpAddress))
11
+ }
12
+ return undefined
13
+ }
2
14
 
3
- import { ONE_YEAR, STRAT_FEES, contract, tokenWithId } from '@stake-dao/constants'
4
- import { equalTlc, multicall } from '../../../utils.js'
15
+ const getName = (s: any) => {
16
+ if (s.isLending) {
17
+ return s.coins[0].symbol
18
+ }
19
+ return (s.isMetapool ? s.underlyingCoins : s.coins)
20
+ .reduce((res: string, current: any) => `${res}/${current.symbol}`, '')
21
+ .slice(1)
22
+ }
5
23
 
6
24
  export const getCurveStratsWithApr = (chainId: number, curveStrats: any[], apisData: any) => {
7
25
  const curveStratsDataCalls: any[] = []
8
26
 
9
- const strats = curveStrats.filter((s) => s.key && s.chainId === chainId && !s.isLending)
27
+ const strats = curveStrats.filter((s) => s.key && s.chainId === chainId)
10
28
 
11
29
  const curveStratsWithApr = strats.map((s) => {
12
30
  const curveApiData = apisData.curveApiData.find((el) => equalTlc(el.lp, s.lpToken.address))
@@ -18,12 +36,7 @@ export const getCurveStratsWithApr = (chainId: number, curveStrats: any[], apisD
18
36
  apr: extra.apr,
19
37
  }))
20
38
  : []
21
- const convexPool =
22
- s.chainId === 1
23
- ? apisData.convexPools.find(
24
- (pool: any) => pool.lpTokenAddress.toLowerCase() === s.lpToken.address.toLowerCase(),
25
- )
26
- : undefined
39
+ const convexPool = getConvexPool(apisData, s.chainId, s.isLending, s.lpToken.address)
27
40
 
28
41
  curveStratsDataCalls.push({
29
42
  vault: s.vault,
@@ -34,9 +47,10 @@ export const getCurveStratsWithApr = (chainId: number, curveStrats: any[], apisD
34
47
 
35
48
  return {
36
49
  ...s,
37
- name: (s.isMetapool ? s.underlyingCoins : s.coins)
38
- .reduce((res: string, current: any) => `${res}/${current.symbol}`, '')
39
- .slice(1),
50
+ name: getName(s),
51
+ // TODO LENDING
52
+ // subname: curveApiData?.assets ? `${curveApiData.assets.collateral.symbol} collateral` : '',
53
+ // tradingApy: curveApiData?.rates ? curveApiData.rates.lendApyPcent : 0,
40
54
  tradingApy: subgraphData?.latestWeeklyApy || 0,
41
55
  gaugesProjectedApr,
42
56
  minApr: curveApiData?.crvApr ? curveApiData.crvApr[0] * ((100 - STRAT_FEES) / 100) : 0,
@@ -48,71 +62,3 @@ export const getCurveStratsWithApr = (chainId: number, curveStrats: any[], apisD
48
62
 
49
63
  return { curveStratsWithApr, curveStratsDataCalls }
50
64
  }
51
-
52
- export const getCurveLendingWithApr = async (provider: any, chainId: number, curveStrats: any[], apisData: any) => {
53
- const curveLendingDataCalls: any[] = []
54
-
55
- const strats = curveStrats.filter((s) => s.key && s.chainId === chainId && s.isLending)
56
-
57
- const gaugesData = await multicall(
58
- provider,
59
- strats.flatMap((s) => [
60
- { address: s.gaugeAddress, name: 'inflation_rate' },
61
- { address: s.gaugeAddress, name: 'working_supply' },
62
- { address: contract('curveGaugeController', chainId), name: 'gauge_relative_weight', params: [s.gaugeAddress] },
63
- ]),
64
- parseAbi([
65
- 'function inflation_rate() external view returns (uint256)',
66
- 'function working_supply() external view returns (uint256)',
67
- 'function gauge_relative_weight(address gauge) external view returns (uint256)',
68
- ]),
69
- )
70
-
71
- const triCrvPool = apisData.curveApiData.find((el) => equalTlc(el.lp, '0x4eBdF703948ddCEA3B11f675B4D1Fba9d2414A14'))
72
- const triCrvPoolCrvData = triCrvPool.coins.find((c) => equalTlc(c.coinAddress, tokenWithId('crv')?.address as string))
73
- const crvPriceInUsd = triCrvPoolCrvData.usdBalance / Number(triCrvPoolCrvData.balance)
74
-
75
- const curveLendingWithApr = strats.map((s) => {
76
- const curveApiData = apisData.curveApiData.find((el) => equalTlc(el.lp, s.lpToken.address))
77
-
78
- const convexPool =
79
- s.chainId === 1
80
- ? apisData.convexLendingVaults.find(
81
- (pool: any) => pool.address.toLowerCase() === s.lpToken.address.toLowerCase(),
82
- )
83
- : undefined
84
- const lpPriceInUsd = curveApiData?.lpPriceInUsd || 0
85
-
86
- curveLendingDataCalls.push({
87
- vault: s.vault,
88
- token: s.lpToken.address,
89
- liquidityGauge: s.gaugeAddress,
90
- sdtLiquidityGauge: s.sdGauge,
91
- })
92
-
93
- const inflationRate = Number(formatUnits(gaugesData.shift().result as any as bigint, 18))
94
- const workingSupply = Number(formatUnits(gaugesData.shift().result as any as bigint, 18))
95
- const gaugeRelativeWeight = Number(formatUnits(gaugesData.shift().result as any as bigint, 18))
96
-
97
- const crvBaseApr =
98
- ((((inflationRate * gaugeRelativeWeight * ONE_YEAR) / workingSupply) * 0.4 * crvPriceInUsd) / lpPriceInUsd) * 100
99
-
100
- const gaugesProjectedApr = undefined
101
- const minApr = crvBaseApr * ((100 - STRAT_FEES) / 100)
102
- const maxApr = crvBaseApr * 2.5 * ((100 - STRAT_FEES) / 100)
103
-
104
- return {
105
- ...s,
106
- name: s.coins[0].symbol,
107
- // subname: curveApiData?.assets ? `${curveApiData.assets.collateral.symbol} collateral` : '',
108
- // tradingApy: curveApiData?.rates ? curveApiData.rates.lendApyPcent : 0,
109
- gaugesProjectedApr,
110
- minApr,
111
- maxApr,
112
- lpPriceInUsd,
113
- convexPool: convexPool ? convexPool.convexPoolData : undefined,
114
- }
115
- })
116
-
117
- return { curveLendingWithApr, curveLendingDataCalls }
118
- }
@@ -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
- import { getCurveLendingWithApr, getCurveStratsWithApr } from './getStratsWithApr.js'
18
- import type { StratGlobalData } from './types.js'
17
+ import { getCurveStratsWithApr } from './getStratsWithApr.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,20 +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, curveStratsDataCalls } = getCurveStratsWithApr(chainId, strats, apisData)
43
- const { curveLendingWithApr, curveLendingDataCalls } = await getCurveLendingWithApr(
44
- provider,
41
+ const { curveStratsWithApr: stratsWithApr, curveStratsDataCalls: stratsDataCalls } = getCurveStratsWithApr(
45
42
  chainId,
46
43
  strats,
47
44
  apisData,
48
45
  )
49
46
 
50
- const stratsWithApr = [...curveStratsWithApr, ...curveLendingWithApr]
51
- const stratsDataCalls = [...curveStratsDataCalls, ...curveLendingDataCalls]
52
-
53
47
  const decodedPromise = await getOnChainSdCurveData(chainId, rpc, stratsDataCalls)
54
48
 
55
- const global: StratGlobalData = {
49
+ const global: CurveGlobalData = {
56
50
  totalGaugeWeights: '0',
57
51
  nextEffectiveTimestamp: '0',
58
52
  cvxTotalSupply: '0',
@@ -148,7 +142,7 @@ export const fetchCurve = async (
148
142
  return {
149
143
  token: rewardToken,
150
144
  price: rewardPrice ? rewardPrice.usdPrice : 0,
151
- apr: rewardApr,
145
+ apr: rewardApr * 100,
152
146
  streaming,
153
147
  periodFinish,
154
148
  rate: formatUnits(r.rate, 0),
@@ -162,19 +156,7 @@ export const fetchCurve = async (
162
156
  }
163
157
  })
164
158
 
165
- let sdtApr: SdtApr = {
166
- sdtUserApr: 0,
167
- sdtFuturUserApr: 0,
168
- sdtMinApr: 0,
169
- sdtFuturMinApr: 0,
170
- sdtMaxApr: 0,
171
- sdtFuturMaxApr: 0,
172
- sdtBoost: 1,
173
- }
174
- const sdtRewards = rewardsData.find((r) => r.token.symbol === 'SDT')
175
- if (sdtRewards) {
176
- sdtApr = computeSdtApr(sdtEmissionData, sdtRewards, undefined, sdGauge, strat.lpPriceInUsd)
177
- }
159
+ const sdtApr = getSdtApr(rewardsData, sdtEmissionData, sdGauge, strat.lpPriceInUsd, undefined)
178
160
 
179
161
  let convexCrvProjectedApr = 0
180
162
  let cvxApr = 0
@@ -193,7 +175,7 @@ export const fetchCurve = async (
193
175
  : 0
194
176
  }
195
177
 
196
- const apr = getAprBreakdown(strat, rewardsData, boost, cvxApr, sdtApr)
178
+ const apr = getAprBreakdown(strat, rewardsData, boost, sdtApr, cvxApr)
197
179
 
198
180
  return {
199
181
  ...strat,
@@ -225,7 +207,6 @@ export const fetchCurve = async (
225
207
  totalSupply,
226
208
  strategyHoldings: formatUnits(v.strategyHoldings, 0),
227
209
  workingBalance: formatUnits(v.workingBalance, 0),
228
- workingSupplyStaked: formatUnits(v.workingSupplyStaked, 0),
229
210
  sdGauge,
230
211
  vaultFees:
231
212
  chainId === mainnet.id
@@ -66,12 +66,9 @@ export const getCurveHttpCalls = async (
66
66
  FACTORY_EXPLORER_EVENTS(explorerApiKey, explorer, contract('curveVaultFactory', chainId), lastBlockNumber),
67
67
  )
68
68
  ).json(),
69
- // Curve Apis
70
- (await fetch(`${CURVE_API_URL}/getPools/arbitrum/factory`)).json(),
71
- (await fetch(`${CURVE_API_URL}/getPools/arbitrum/main`)).json(),
72
- (await fetch(`${CURVE_API_URL}/getPools/arbitrum/crypto`)).json(),
73
- (await fetch(`${CURVE_API_URL}/getPools/arbitrum/factory-stable-ng`)).json(),
74
- (await fetch(`${CURVE_API_URL}/getPools/arbitrum/factory-tricrypto`)).json(),
69
+ // Curve Data (replace APIs calls)
70
+ fetchCurveBase(rpc, chainId, gaugesWeights.gauges),
71
+ // Curve Trading Apy API
75
72
  (await fetch(`${CURVE_API_URL}/getSubgraphData/arbitrum`)).json(),
76
73
  ]
77
74
 
@@ -80,30 +77,17 @@ export const getCurveHttpCalls = async (
80
77
  )
81
78
 
82
79
  const arbiscanData = arbitrumHttpResponses[0]
83
- const arbitrumCurveFactory = arbitrumHttpResponses[1].success ? arbitrumHttpResponses[1].data.poolData : undefined
84
- const arbitrumCurveMain = arbitrumHttpResponses[2].success ? arbitrumHttpResponses[2].data.poolData : undefined
85
- const arbitrumCurveCrypto = arbitrumHttpResponses[3].success ? arbitrumHttpResponses[3].data.poolData : undefined
86
- const arbitrumCurveFactoryStableNg = arbitrumHttpResponses[4].success
87
- ? arbitrumHttpResponses[4].data.poolData
88
- : undefined
89
- const arbitrumCurveFactoryTriCrypto = arbitrumHttpResponses[5].success
90
- ? arbitrumHttpResponses[5].data.poolData
91
- : undefined
92
- const arbitrumCurveSubgraph = arbitrumHttpResponses[6].success
93
- ? arbitrumHttpResponses[6].data.poolList
80
+ const arbitrumCurveData = arbitrumHttpResponses[1]
81
+ const arbitrumCurveSubgraph = arbitrumHttpResponses[2].success
82
+ ? arbitrumHttpResponses[2].data.poolList
94
83
  : undefined
95
84
 
96
85
  return {
97
86
  explorerData: arbiscanData,
98
87
  curveSubgraphData: arbitrumCurveSubgraph,
99
88
  convexPools: [],
100
- curveApiData: [
101
- { type: 'factory-tricrypto', value: arbitrumCurveFactoryTriCrypto },
102
- { type: 'factory', value: arbitrumCurveFactory },
103
- { type: 'main', value: arbitrumCurveMain },
104
- { type: 'crypto', value: arbitrumCurveCrypto },
105
- { type: 'factory-stable-ng', value: arbitrumCurveFactoryStableNg },
106
- ],
89
+ convexLendingVaults: [],
90
+ curveApiData: arbitrumCurveData,
107
91
  }
108
92
  }
109
93
  }
@@ -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,9 +21,16 @@ 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
- const value = r.token.symbol === 'SDT' ? [sdtApr.sdtMinApr, sdtApr.sdtMaxApr] : [r.apr * 100]
33
+ const value = r.token.symbol === 'SDT' ? [sdtApr.sdtMinApr, sdtApr.sdtMaxApr] : [r.apr]
21
34
 
22
35
  return {
23
36
  label: getBreakdownLabel(strat, r, false, boost, sdtApr),
@@ -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
+ }