@stake-dao/reader 0.5.13 → 0.5.15

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 (65) hide show
  1. package/dist/esm/index.js +15 -0
  2. package/dist/esm/index.js.map +1 -1
  3. package/dist/esm/lockers/fetch/protocols/balancer.js +2 -0
  4. package/dist/esm/lockers/fetch/protocols/balancer.js.map +1 -1
  5. package/dist/esm/lockers/fetch/protocols/blackpool.js +2 -0
  6. package/dist/esm/lockers/fetch/protocols/blackpool.js.map +1 -1
  7. package/dist/esm/lockers/fetch/protocols/curve.js +2 -0
  8. package/dist/esm/lockers/fetch/protocols/curve.js.map +1 -1
  9. package/dist/esm/lockers/fetch/protocols/frax-fxs.js +2 -0
  10. package/dist/esm/lockers/fetch/protocols/frax-fxs.js.map +1 -1
  11. package/dist/esm/lockers/fetch/protocols/fxn.js +2 -0
  12. package/dist/esm/lockers/fetch/protocols/fxn.js.map +1 -1
  13. package/dist/esm/lockers/fetch/protocols/maverick.js +2 -0
  14. package/dist/esm/lockers/fetch/protocols/maverick.js.map +1 -1
  15. package/dist/esm/lockers/fetch/protocols/pendle.js +2 -0
  16. package/dist/esm/lockers/fetch/protocols/pendle.js.map +1 -1
  17. package/dist/esm/lockers/fetch/protocols/spectra.js +2 -0
  18. package/dist/esm/lockers/fetch/protocols/spectra.js.map +1 -1
  19. package/dist/esm/lockers/fetch/protocols/yearn.js +2 -0
  20. package/dist/esm/lockers/fetch/protocols/yearn.js.map +1 -1
  21. package/dist/esm/lockers/fetch/protocols/yieldbasis.js +9 -1
  22. package/dist/esm/lockers/fetch/protocols/yieldbasis.js.map +1 -1
  23. package/dist/esm/lockers/fetch/protocols/yieldnest.js +2 -0
  24. package/dist/esm/lockers/fetch/protocols/yieldnest.js.map +1 -1
  25. package/dist/esm/lockers/fetch/protocols/zerolend.js +2 -0
  26. package/dist/esm/lockers/fetch/protocols/zerolend.js.map +1 -1
  27. package/dist/esm/prices.js +1 -1
  28. package/dist/esm/prices.js.map +1 -1
  29. package/dist/esm/strategies/v2/parse.js +192 -183
  30. package/dist/esm/strategies/v2/parse.js.map +1 -1
  31. package/dist/types/index.d.ts +15 -0
  32. package/dist/types/index.d.ts.map +1 -1
  33. package/dist/types/lockers/fetch/protocols/balancer.d.ts.map +1 -1
  34. package/dist/types/lockers/fetch/protocols/blackpool.d.ts.map +1 -1
  35. package/dist/types/lockers/fetch/protocols/curve.d.ts.map +1 -1
  36. package/dist/types/lockers/fetch/protocols/frax-fxs.d.ts.map +1 -1
  37. package/dist/types/lockers/fetch/protocols/fxn.d.ts.map +1 -1
  38. package/dist/types/lockers/fetch/protocols/maverick.d.ts.map +1 -1
  39. package/dist/types/lockers/fetch/protocols/pendle.d.ts.map +1 -1
  40. package/dist/types/lockers/fetch/protocols/spectra.d.ts.map +1 -1
  41. package/dist/types/lockers/fetch/protocols/yearn.d.ts.map +1 -1
  42. package/dist/types/lockers/fetch/protocols/yieldbasis.d.ts.map +1 -1
  43. package/dist/types/lockers/fetch/protocols/yieldnest.d.ts.map +1 -1
  44. package/dist/types/lockers/fetch/protocols/zerolend.d.ts.map +1 -1
  45. package/dist/types/lockers/fetch/types.d.ts +2 -0
  46. package/dist/types/lockers/fetch/types.d.ts.map +1 -1
  47. package/dist/types/strategies/v2/parse.d.ts +1 -51
  48. package/dist/types/strategies/v2/parse.d.ts.map +1 -1
  49. package/package.json +2 -2
  50. package/src/index.ts +16 -0
  51. package/src/lockers/fetch/protocols/balancer.ts +2 -0
  52. package/src/lockers/fetch/protocols/blackpool.ts +2 -0
  53. package/src/lockers/fetch/protocols/curve.ts +2 -0
  54. package/src/lockers/fetch/protocols/frax-fxs.ts +2 -0
  55. package/src/lockers/fetch/protocols/fxn.ts +2 -0
  56. package/src/lockers/fetch/protocols/maverick.ts +2 -0
  57. package/src/lockers/fetch/protocols/pendle.ts +2 -0
  58. package/src/lockers/fetch/protocols/spectra.ts +2 -0
  59. package/src/lockers/fetch/protocols/yearn.ts +2 -0
  60. package/src/lockers/fetch/protocols/yieldbasis.ts +9 -1
  61. package/src/lockers/fetch/protocols/yieldnest.ts +2 -0
  62. package/src/lockers/fetch/protocols/zerolend.ts +2 -0
  63. package/src/lockers/fetch/types.ts +2 -0
  64. package/src/prices.ts +1 -1
  65. package/src/strategies/v2/parse.ts +232 -219
@@ -38,237 +38,250 @@ const baseTokens = {
38
38
  },
39
39
  }
40
40
 
41
+ const protocols = {
42
+ '0xc715e373': 'curve',
43
+ }
44
+
45
+ const SUPPORTED_PROTOCOLS = Object.keys(protocols)
46
+
41
47
  export const parseV2Strats = (global: any, rawStrats: any[], extra: any) => {
42
48
  try {
43
- return rawStrats.map((s) => {
44
- const isLending = s.asset.name.startsWith('Llamalend')
45
-
46
- const lpToken = parseAsset(s.asset)
47
- const coins = s.asset.components.map((c) => parseAsset(c.childAsset))
48
-
49
- let name = coins.map((c) => c.symbol).join('/')
50
- if (name.length > 26 || lpToken?.name?.startsWith('CrossCurve')) name = lpToken.symbol
51
- if (isLending) name = s.asset.name
52
-
53
- const lpPriceInUsd =
54
- Number(s.gauge.totalSupply) > 0
55
- ? Number(s.gauge.totalSupplyUSD) / Number(formatUnits(BigInt(s.gauge.totalSupply || '0'), 18))
56
- : 0
57
-
58
- const compoundedYieldKey = isLending ? 'LENDING_INTEREST' : 'TRADING_FEES'
59
- const tradingApy = (s.gauge.aprDetails.find((el) => el.yieldType === compoundedYieldKey)?.aprUSD || 0) * 100
60
- const otherRewards = s.gauge.aprDetails.filter((el) => el.yieldType !== compoundedYieldKey && el.asset)
61
- const merklRewards = (extra?.merklApi || [])
62
- .filter((r) => equalTlc(r.explorerAddress, lpToken?.address))
63
- .map((r) => ({
64
- token: parseAsset(r.rewardsRecord.breakdowns[0]?.token),
65
- aprInToken: r.apr / r.rewardsRecord.breakdowns[0]?.token.price || 1,
66
- apr: r.apr,
67
- streaming: true,
68
- periodFinish: 2000000000,
69
- yieldType: 'OFFCHAIN',
70
- }))
71
-
72
- // Compute rewards from the hook incentive (Votemarket)
73
- const hookIncentivesPrices = extra?.hookIncentivesPrices || []
74
- const gaugeUsd = Number(s.gauge.totalSupplyUSD)
75
-
76
- const incentivesByToken = (extra?.hookIncentives || [])
77
- .filter((r) => equalTlc(r.vault, s.address))
78
- .reduce((acc, r) => {
79
- const rewardAddress = r.reward
80
- const price = hookIncentivesPrices.find((p) => equalTlc(rewardAddress, p.address))?.usdPrice || 0
81
-
82
- const amountToken = Number.parseFloat(formatUnits(r.amount, r.rewardDecimals))
83
- const duration = Number.parseInt(r.end) - Number.parseInt(r.start)
84
-
85
- if (duration <= 0) return acc
86
-
87
- const tokensPerSecond = amountToken / duration
88
- const yearlyTokens = tokensPerSecond * ONE_YEAR
89
- const yearlyRewardsUsd = yearlyTokens * price
90
-
91
- if (!acc[rewardAddress]) {
92
- acc[rewardAddress] = {
93
- meta: r,
94
- price: price,
95
- totalYearlyUsd: 0,
96
- maxPeriodFinish: Number.parseInt(r.end),
49
+ const res: any[] = []
50
+
51
+ for (const s of rawStrats) {
52
+ if (SUPPORTED_PROTOCOLS.includes(s.protocolId)) {
53
+ const protocol = protocols[s.protocolId]
54
+ const isLending = s.asset.name.startsWith('Llamalend')
55
+
56
+ const lpToken = parseAsset(s.asset)
57
+ const coins = s.asset.components.map((c) => parseAsset(c.childAsset))
58
+
59
+ let name = coins.map((c) => c.symbol).join('/')
60
+ if (name.length > 26 || lpToken?.name?.startsWith('CrossCurve')) name = lpToken.symbol
61
+ if (isLending) name = s.asset.name
62
+
63
+ const lpPriceInUsd =
64
+ Number(s.gauge.totalSupply) > 0
65
+ ? Number(s.gauge.totalSupplyUSD) / Number(formatUnits(BigInt(s.gauge.totalSupply || '0'), 18))
66
+ : 0
67
+
68
+ const compoundedYieldKey = isLending ? 'LENDING_INTEREST' : 'TRADING_FEES'
69
+ const tradingApy = (s.gauge.aprDetails.find((el) => el.yieldType === compoundedYieldKey)?.aprUSD || 0) * 100
70
+ const otherRewards = s.gauge.aprDetails.filter((el) => el.yieldType !== compoundedYieldKey && el.asset)
71
+ const merklRewards = (extra?.merklApi || [])
72
+ .filter((r) => equalTlc(r.explorerAddress, lpToken?.address))
73
+ .map((r) => ({
74
+ token: parseAsset(r.rewardsRecord.breakdowns[0]?.token),
75
+ aprInToken: r.apr / r.rewardsRecord.breakdowns[0]?.token.price || 1,
76
+ apr: r.apr,
77
+ streaming: true,
78
+ periodFinish: 2000000000,
79
+ yieldType: 'OFFCHAIN',
80
+ }))
81
+
82
+ // Compute rewards from the hook incentive (Votemarket)
83
+ const hookIncentivesPrices = extra?.hookIncentivesPrices || []
84
+ const gaugeUsd = Number(s.gauge.totalSupplyUSD)
85
+
86
+ const incentivesByToken = (extra?.hookIncentives || [])
87
+ .filter((r) => equalTlc(r.vault, s.address))
88
+ .reduce((acc, r) => {
89
+ const rewardAddress = r.reward
90
+ const price = hookIncentivesPrices.find((p) => equalTlc(rewardAddress, p.address))?.usdPrice || 0
91
+
92
+ const amountToken = Number.parseFloat(formatUnits(r.amount, r.rewardDecimals))
93
+ const duration = Number.parseInt(r.end) - Number.parseInt(r.start)
94
+
95
+ if (duration <= 0) return acc
96
+
97
+ const tokensPerSecond = amountToken / duration
98
+ const yearlyTokens = tokensPerSecond * ONE_YEAR
99
+ const yearlyRewardsUsd = yearlyTokens * price
100
+
101
+ if (!acc[rewardAddress]) {
102
+ acc[rewardAddress] = {
103
+ meta: r,
104
+ price: price,
105
+ totalYearlyUsd: 0,
106
+ maxPeriodFinish: Number.parseInt(r.end),
107
+ }
97
108
  }
98
- }
99
109
 
100
- acc[rewardAddress].totalYearlyUsd += yearlyRewardsUsd
101
- acc[rewardAddress].maxPeriodFinish = Math.max(acc[rewardAddress].maxPeriodFinish, Number.parseInt(r.end))
102
-
103
- return acc
104
- }, {})
105
-
106
- const hookIncentives = Object.values(incentivesByToken).map((group: any) => {
107
- const { meta, price, totalYearlyUsd, maxPeriodFinish } = group
110
+ acc[rewardAddress].totalYearlyUsd += yearlyRewardsUsd
111
+ acc[rewardAddress].maxPeriodFinish = Math.max(acc[rewardAddress].maxPeriodFinish, Number.parseInt(r.end))
112
+
113
+ return acc
114
+ }, {})
115
+
116
+ const hookIncentives = Object.values(incentivesByToken).map((group: any) => {
117
+ const { meta, price, totalYearlyUsd, maxPeriodFinish } = group
118
+
119
+ const apr = gaugeUsd > 0 ? (totalYearlyUsd / gaugeUsd) * 100 : 0
120
+
121
+ return {
122
+ token: parseAsset({
123
+ id: meta.id.toString(),
124
+ name: meta.rewardSymbol,
125
+ symbol: meta.rewardSymbol,
126
+ address: meta.reward,
127
+ decimals: meta.rewardDecimals,
128
+ }),
129
+ aprInToken: price > 0 ? apr / price : 0,
130
+ apr,
131
+ streaming: true,
132
+ periodFinish: maxPeriodFinish,
133
+ yieldType: 'VOTEMARKET',
134
+ }
135
+ })
108
136
 
109
- const apr = gaugeUsd > 0 ? (totalYearlyUsd / gaugeUsd) * 100 : 0
137
+ const rewards = otherRewards
138
+ .map((r) => ({
139
+ token: parseAsset(r.asset),
140
+ aprInToken: r.apr,
141
+ apr: Number(r.aprUSD) * 100,
142
+ streaming: true,
143
+ periodFinish: 2000000000,
144
+ yieldType: r.yieldType,
145
+ }))
146
+ .concat(merklRewards)
147
+ .concat(hookIncentives)
148
+ .sort((a, b) => {
149
+ if (a.token.address === baseTokens[protocol][s.chainId]) return -1
150
+ if (b.token.address === baseTokens[protocol][s.chainId]) return 1
151
+ return 0
152
+ })
110
153
 
111
- return {
112
- token: parseAsset({
113
- id: meta.id.toString(),
114
- name: meta.rewardSymbol,
115
- symbol: meta.rewardSymbol,
116
- address: meta.reward,
117
- decimals: meta.rewardDecimals,
118
- }),
119
- aprInToken: price > 0 ? apr / price : 0,
120
- apr,
121
- streaming: true,
122
- periodFinish: maxPeriodFinish,
123
- yieldType: 'VOTEMARKET',
154
+ const metadata: any = {}
155
+ for (const m of s.gauge.metadata) metadata[m.key] = m.value
156
+
157
+ // Current
158
+ const totalSupply = BigInt(s.totalSupply)
159
+ const convexSupply = BigInt(s.sidecarBalance)
160
+ const stakeDaoSupply = totalSupply - convexSupply
161
+
162
+ // Optimal
163
+ const stakeDaoOptSupply =
164
+ totalSupply > BigInt(metadata.optimalDepositBalance || '0')
165
+ ? BigInt(metadata.optimalDepositBalance || '0')
166
+ : totalSupply
167
+ const convexOptSupply = totalSupply - stakeDaoOptSupply
168
+
169
+ const useVeBoost = s.chainId === mainnet.id && s.gauge?.address !== '0xd8b712d29381748dB89c36BCa0138d7c75866ddF' // MIM/3crv
170
+
171
+ const baseReward = rewards.find(
172
+ (r) => r.yieldType === 'STAKING_REWARDS' && equalTlc(r.token.address, baseTokens[protocol][s.chainId]),
173
+ )
174
+ const baseRewardPrice =
175
+ extra.baseRewardsPrices.find((r) => equalTlc(r.address, baseTokens[protocol][s.chainId]))?.usdPrice || 0
176
+ const maxApr = baseReward?.apr || 0
177
+
178
+ const onlyboost = getOnlyboostData(
179
+ {
180
+ active: s.sidecar !== zeroAddress,
181
+ convexImpl: s.sidecar,
182
+ totalSupply,
183
+ convexSupply,
184
+ stakeDaoSupply,
185
+ convexStrategyHoldings: BigInt(metadata.convexTotalSupply || '0'),
186
+ convexWorkingBalance: BigInt(metadata.workingBalanceConvex || '0'),
187
+ convexRewardRate: BigInt(metadata.convexRewardRate || '0'),
188
+ convexOptSupply,
189
+ stakeDaoOptSupply,
190
+ claimableData: [],
191
+ },
192
+ s.chainId,
193
+ global[useVeBoost ? 'stakeDaoVeBoost' : 'stakeDaoVeBalance'],
194
+ global[useVeBoost ? 'convexVeBoost' : 'convexVeBalance'],
195
+ global.veCrvTotalSupply,
196
+ BigInt(s.gauge.totalSupply),
197
+ stakeDaoSupply,
198
+ BigInt(metadata.workingBalance || '0'),
199
+ totalSupply,
200
+ lpPriceInUsd,
201
+ maxApr,
202
+ baseRewardPrice,
203
+ )
204
+
205
+ const boost = onlyboost.boost
206
+ const baseRewardApr = (maxApr / 2.5) * boost * ((100 - V2_FEES) / 100)
207
+
208
+ let baseRewardAdded = false
209
+ const aprDetails = [{ label: isLending ? 'Lending' : 'Trading Fees (APY)', value: [tradingApy] }]
210
+
211
+ for (const r of rewards) {
212
+ if (
213
+ baseReward &&
214
+ r.yieldType === 'STAKING_REWARDS' &&
215
+ r.token.symbol === baseReward.token.symbol &&
216
+ !baseRewardAdded
217
+ ) {
218
+ aprDetails.push({
219
+ label: `${r.token.symbol} APR (incl. ${withTwoDec(boost)}x boost)`,
220
+ value: [baseRewardApr || 0],
221
+ })
222
+
223
+ baseRewardAdded = true
224
+ } else {
225
+ const label =
226
+ r.yieldType === 'VOTEMARKET'
227
+ ? `${r.token.symbol} APR (Extra Rewards from Votemarket)`
228
+ : `${r.token.symbol} APR`
229
+ aprDetails.push({ label, value: [r.apr || 0] })
230
+ }
124
231
  }
125
- })
126
232
 
127
- const rewards = otherRewards
128
- .map((r) => ({
129
- token: parseAsset(r.asset),
130
- aprInToken: r.apr,
131
- apr: Number(r.aprUSD) * 100,
233
+ let aprTotal = aprDetails.reduce((total, x) => {
234
+ for (const v of x.value) total += v
235
+ return total
236
+ }, 0)
237
+ if (aprTotal > 1e18) aprTotal = 2727
238
+
239
+ res.push({
240
+ key: s.id,
241
+ tokensFilter: getTokenTypes({ isLending, coins }),
242
+ isLending,
243
+ name,
244
+ type: 'factory-stable-ng',
245
+ version: 2,
246
+ protocol,
247
+ chainId: s.chainId,
248
+ vault: s.address,
249
+ lpToken,
250
+ gaugeAddress: s.gauge.address,
251
+ gauge: {
252
+ address: s.gauge.address,
253
+ totalSupply: s.gauge.totalSupply,
254
+ totalSupplyUsd: s.gauge.totalSupplyUSD,
255
+ extraRewards: [],
256
+ },
257
+ coins,
258
+ underlyingCoins: [],
259
+ lpPriceInUsd,
132
260
  streaming: true,
133
- periodFinish: 2000000000,
134
- yieldType: r.yieldType,
135
- }))
136
- .concat(merklRewards)
137
- .concat(hookIncentives)
138
- .sort((a, b) => {
139
- if (a.token.address === baseTokens.curve[s.chainId]) return -1
140
- if (b.token.address === baseTokens.curve[s.chainId]) return 1
141
- return 0
261
+ tvl: Number(s.totalSupplyUSD) > 10000000000 ? 0 : Number(s.totalSupplyUSD),
262
+ apr: {
263
+ boost,
264
+ current: { total: aprTotal, details: aprDetails },
265
+ },
266
+ rewards,
267
+ tradingApy,
268
+ minApr: maxApr / 2.5,
269
+ maxApr,
270
+ totalSupply: s.totalSupply,
271
+ workingBalance: metadata?.workingBalance || '0',
272
+ onlyboost,
273
+ convexPool:
274
+ metadata.pid && metadata.convexBaseRewardPool
275
+ ? {
276
+ id: Number(metadata.pid),
277
+ crvRewards: metadata.convexBaseRewardPool,
278
+ }
279
+ : undefined,
142
280
  })
143
-
144
- const metadata: any = {}
145
- for (const m of s.gauge.metadata) metadata[m.key] = m.value
146
-
147
- // Current
148
- const totalSupply = BigInt(s.totalSupply)
149
- const convexSupply = BigInt(s.sidecarBalance)
150
- const stakeDaoSupply = totalSupply - convexSupply
151
-
152
- // Optimal
153
- const stakeDaoOptSupply =
154
- totalSupply > BigInt(metadata.optimalDepositBalance || '0')
155
- ? BigInt(metadata.optimalDepositBalance || '0')
156
- : totalSupply
157
- const convexOptSupply = totalSupply - stakeDaoOptSupply
158
-
159
- const useVeBoost = s.chainId === mainnet.id && s.gauge?.address !== '0xd8b712d29381748dB89c36BCa0138d7c75866ddF' // MIM/3crv
160
-
161
- const baseReward = rewards.find(
162
- (r) => r.yieldType === 'STAKING_REWARDS' && equalTlc(r.token.address, baseTokens.curve[s.chainId]),
163
- )
164
- const baseRewardPrice =
165
- extra.baseRewardsPrices.find((r) => equalTlc(r.address, baseTokens.curve[s.chainId]))?.usdPrice || 0
166
- const maxApr = baseReward?.apr || 0
167
-
168
- const onlyboost = getOnlyboostData(
169
- {
170
- active: s.sidecar !== zeroAddress,
171
- convexImpl: s.sidecar,
172
- totalSupply,
173
- convexSupply,
174
- stakeDaoSupply,
175
- convexStrategyHoldings: BigInt(metadata.convexTotalSupply || '0'),
176
- convexWorkingBalance: BigInt(metadata.workingBalanceConvex || '0'),
177
- convexRewardRate: BigInt(metadata.convexRewardRate || '0'),
178
- convexOptSupply,
179
- stakeDaoOptSupply,
180
- claimableData: [],
181
- },
182
- s.chainId,
183
- global[useVeBoost ? 'stakeDaoVeBoost' : 'stakeDaoVeBalance'],
184
- global[useVeBoost ? 'convexVeBoost' : 'convexVeBalance'],
185
- global.veCrvTotalSupply,
186
- BigInt(s.gauge.totalSupply),
187
- stakeDaoSupply,
188
- BigInt(metadata.workingBalance || '0'),
189
- totalSupply,
190
- lpPriceInUsd,
191
- maxApr,
192
- baseRewardPrice,
193
- )
194
-
195
- const boost = onlyboost.boost
196
- const baseRewardApr = (maxApr / 2.5) * boost * ((100 - V2_FEES) / 100)
197
-
198
- let baseRewardAdded = false
199
- const aprDetails = [{ label: isLending ? 'Lending' : 'Trading Fees (APY)', value: [tradingApy] }]
200
-
201
- for (const r of rewards) {
202
- if (
203
- baseReward &&
204
- r.yieldType === 'STAKING_REWARDS' &&
205
- r.token.symbol === baseReward.token.symbol &&
206
- !baseRewardAdded
207
- ) {
208
- aprDetails.push({
209
- label: `${r.token.symbol} APR (incl. ${withTwoDec(boost)}x boost)`,
210
- value: [baseRewardApr || 0],
211
- })
212
-
213
- baseRewardAdded = true
214
- } else {
215
- const label =
216
- r.yieldType === 'VOTEMARKET'
217
- ? `${r.token.symbol} APR (Extra Rewards from Votemarket)`
218
- : `${r.token.symbol} APR`
219
- aprDetails.push({ label, value: [r.apr || 0] })
220
- }
221
281
  }
282
+ }
222
283
 
223
- let aprTotal = aprDetails.reduce((total, x) => {
224
- for (const v of x.value) total += v
225
- return total
226
- }, 0)
227
- if (aprTotal > 1e18) aprTotal = 2727
228
-
229
- return {
230
- key: s.id,
231
- tokensFilter: getTokenTypes({ isLending, coins }),
232
- isLending,
233
- name,
234
- type: 'factory-stable-ng',
235
- version: 2,
236
- protocol: 'curve',
237
- chainId: s.chainId,
238
- vault: s.address,
239
- lpToken,
240
- gaugeAddress: s.gauge.address,
241
- gauge: {
242
- address: s.gauge.address,
243
- totalSupply: s.gauge.totalSupply,
244
- totalSupplyUsd: s.gauge.totalSupplyUSD,
245
- extraRewards: [],
246
- },
247
- coins,
248
- underlyingCoins: [],
249
- lpPriceInUsd,
250
- streaming: true,
251
- tvl: Number(s.totalSupplyUSD) > 10000000000 ? 0 : Number(s.totalSupplyUSD),
252
- apr: {
253
- boost,
254
- current: { total: aprTotal, details: aprDetails },
255
- },
256
- rewards,
257
- tradingApy,
258
- minApr: maxApr / 2.5,
259
- maxApr,
260
- totalSupply: s.totalSupply,
261
- workingBalance: metadata?.workingBalance || '0',
262
- onlyboost,
263
- convexPool:
264
- metadata.pid && metadata.convexBaseRewardPool
265
- ? {
266
- id: Number(metadata.pid),
267
- crvRewards: metadata.convexBaseRewardPool,
268
- }
269
- : undefined,
270
- }
271
- })
284
+ return res
272
285
  } catch (e) {
273
286
  console.error(e)
274
287
  return []