@stake-dao/reader 0.4.97 → 0.4.99

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 +1 -0
  2. package/dist/esm/index.js.map +1 -1
  3. package/dist/esm/number.js +64 -16
  4. package/dist/esm/number.js.map +1 -1
  5. package/dist/esm/strategies/angle/fetch.js +2 -0
  6. package/dist/esm/strategies/angle/fetch.js.map +1 -1
  7. package/dist/esm/strategies/balancer/fetch.js +2 -0
  8. package/dist/esm/strategies/balancer/fetch.js.map +1 -1
  9. package/dist/esm/strategies/curve/fetch/getOnlyboostData.js +6 -0
  10. package/dist/esm/strategies/curve/fetch/getOnlyboostData.js.map +1 -1
  11. package/dist/esm/strategies/curve/fetch/index.js +7 -10
  12. package/dist/esm/strategies/curve/fetch/index.js.map +1 -1
  13. package/dist/esm/strategies/curve/httpCalls.js +31 -35
  14. package/dist/esm/strategies/curve/httpCalls.js.map +1 -1
  15. package/dist/esm/strategies/passive/fetch.js +2 -0
  16. package/dist/esm/strategies/passive/fetch.js.map +1 -1
  17. package/dist/esm/strategies/pendle/fetch.js +2 -0
  18. package/dist/esm/strategies/pendle/fetch.js.map +1 -1
  19. package/dist/esm/strategies/utils/getTokenTypes.js +30 -0
  20. package/dist/esm/strategies/utils/getTokenTypes.js.map +1 -0
  21. package/dist/esm/strategies/v2/parse.js +176 -0
  22. package/dist/esm/strategies/v2/parse.js.map +1 -0
  23. package/dist/esm/strategies/yearn/fetch/index.js +2 -0
  24. package/dist/esm/strategies/yearn/fetch/index.js.map +1 -1
  25. package/dist/esm/votemarket/curve/fetchSnapshotUserData.js +2 -0
  26. package/dist/esm/votemarket/curve/fetchSnapshotUserData.js.map +1 -1
  27. package/dist/types/index.d.ts +1 -0
  28. package/dist/types/index.d.ts.map +1 -1
  29. package/dist/types/number.d.ts +17 -2
  30. package/dist/types/number.d.ts.map +1 -1
  31. package/dist/types/strategies/angle/fetch.d.ts.map +1 -1
  32. package/dist/types/strategies/balancer/fetch.d.ts.map +1 -1
  33. package/dist/types/strategies/curve/fetch/getOnlyboostData.d.ts.map +1 -1
  34. package/dist/types/strategies/curve/fetch/index.d.ts +1 -2
  35. package/dist/types/strategies/curve/fetch/index.d.ts.map +1 -1
  36. package/dist/types/strategies/curve/httpCalls.d.ts +2 -2
  37. package/dist/types/strategies/curve/httpCalls.d.ts.map +1 -1
  38. package/dist/types/strategies/passive/fetch.d.ts +3 -0
  39. package/dist/types/strategies/passive/fetch.d.ts.map +1 -1
  40. package/dist/types/strategies/pendle/fetch.d.ts +1 -0
  41. package/dist/types/strategies/pendle/fetch.d.ts.map +1 -1
  42. package/dist/types/strategies/types.d.ts +2 -0
  43. package/dist/types/strategies/types.d.ts.map +1 -1
  44. package/dist/types/strategies/utils/getTokenTypes.d.ts +3 -0
  45. package/dist/types/strategies/utils/getTokenTypes.d.ts.map +1 -0
  46. package/dist/types/strategies/v2/parse.d.ts +52 -0
  47. package/dist/types/strategies/v2/parse.d.ts.map +1 -0
  48. package/dist/types/strategies/yearn/fetch/index.d.ts.map +1 -1
  49. package/dist/types/votemarket/curve/fetchSnapshotUserData.d.ts.map +1 -1
  50. package/package.json +3 -3
  51. package/src/index.ts +1 -0
  52. package/src/number.ts +77 -19
  53. package/src/strategies/angle/fetch.ts +2 -0
  54. package/src/strategies/balancer/fetch.ts +2 -0
  55. package/src/strategies/curve/fetch/getOnlyboostData.ts +7 -0
  56. package/src/strategies/curve/fetch/index.ts +6 -15
  57. package/src/strategies/curve/httpCalls.ts +31 -48
  58. package/src/strategies/passive/fetch.ts +2 -0
  59. package/src/strategies/pendle/fetch.ts +2 -0
  60. package/src/strategies/types.ts +2 -0
  61. package/src/strategies/utils/getTokenTypes.ts +35 -0
  62. package/src/strategies/v2/parse.ts +199 -0
  63. package/src/strategies/yearn/fetch/index.ts +2 -0
  64. package/src/votemarket/curve/fetchSnapshotUserData.ts +2 -0
  65. package/dist/esm/tsconfig.build.tsbuildinfo +0 -1
@@ -0,0 +1,199 @@
1
+ import { getOnlyboostData } from '@stake-dao/reader'
2
+ import { formatUnits, zeroAddress } from 'viem'
3
+ import { arbitrum, base, fraxtal, mainnet, optimism, sonic } from 'viem/chains'
4
+ import { withTwoDec } from '../../number.js'
5
+ import { equalTlc } from '../../utils.js'
6
+ import getTokenTypes from '../utils/getTokenTypes.js'
7
+
8
+ const V2_FEES = 17
9
+
10
+ const parseAsset = (asset) => ({
11
+ id: asset.id,
12
+ name: asset.name,
13
+ symbol: asset.symbol,
14
+ address: asset.address,
15
+ decimals: asset.decimals,
16
+ })
17
+
18
+ const baseTokens = {
19
+ curve: {
20
+ [mainnet.id]: '0xD533a949740bb3306d119CC777fa900bA034cd52',
21
+ [sonic.id]: '0x5Af79133999f7908953E94b7A5CF367740Ebee35',
22
+ [fraxtal.id]: '0x331B9182088e2A7d6D3Fe4742AbA1fB231aEcc56',
23
+ [arbitrum.id]: '0x11cDb42B0EB46D95f990BeDD4695A6e3fA034978',
24
+ [base.id]: '0x8Ee73c484A26e0A5df2Ee2a4960B789967dd0415',
25
+ [optimism.id]: '0x0994206dfE8De6Ec6920FF4D779B0d950605Fb53',
26
+ },
27
+ balancer: {
28
+ [mainnet.id]: '0xba100000625a3754423978a60c9317c58a424e3D',
29
+ },
30
+ yearn: {
31
+ [mainnet.id]: '0x41252E8691e964f7DE35156B68493bAb6797a275',
32
+ },
33
+ pendle: {
34
+ [mainnet.id]: '0x808507121B80c02388fAd14726482e061B8da827',
35
+ },
36
+ }
37
+
38
+ export const parseV2Strats = (global: any, rawStrats: any[], extra: any) => {
39
+ try {
40
+ return rawStrats.map((s) => {
41
+ const isLending = s.asset.name.startsWith('Llamalend')
42
+
43
+ const lpToken = parseAsset(s.asset)
44
+ const coins = s.asset.components.map((c) => parseAsset(c.childAsset))
45
+
46
+ let name = coins.map((c) => c.symbol).join('/')
47
+ if (name.length > 26 || lpToken?.name?.startsWith('CrossCurve')) name = lpToken.symbol
48
+ if (isLending) name = s.asset.name
49
+
50
+ const lpPriceInUsd =
51
+ Number(s.gauge.totalSupply) > 0
52
+ ? Number(s.gauge.totalSupplyUSD) / Number(formatUnits(BigInt(s.gauge.totalSupply || '0'), 18))
53
+ : 0
54
+
55
+ const compoundedYieldKey = isLending ? 'LENDING_INTEREST' : 'TRADING_FEES'
56
+ const tradingApy = (s.gauge.aprDetails.find((el) => el.yieldType === compoundedYieldKey)?.aprUSD || 0) * 100
57
+ const otherRewards = s.gauge.aprDetails.filter((el) => el.yieldType !== compoundedYieldKey && el.asset)
58
+ const merklRewards = (extra?.merklApi || [])
59
+ .filter((r) => equalTlc(r.explorerAddress, lpToken?.address))
60
+ .map((r) => ({
61
+ token: parseAsset(r.rewardsRecord.breakdowns[0]?.token),
62
+ aprInToken: r.apr / r.rewardsRecord.breakdowns[0]?.token.price || 1,
63
+ apr: r.apr,
64
+ streaming: true,
65
+ periodFinish: 2000000000,
66
+ yieldType: 'OFFCHAIN',
67
+ }))
68
+
69
+ const rewards = otherRewards
70
+ .map((r) => ({
71
+ token: parseAsset(r.asset),
72
+ aprInToken: r.apr,
73
+ apr: Number(r.aprUSD) * 100,
74
+ streaming: true,
75
+ periodFinish: 2000000000,
76
+ yieldType: r.yieldType,
77
+ }))
78
+ .concat(merklRewards)
79
+ .sort((a, b) => {
80
+ if (a.token.address === baseTokens.curve[s.chainId]) return -1
81
+ if (b.token.address === baseTokens.curve[s.chainId]) return 1
82
+ return 0
83
+ })
84
+
85
+ const metadata: any = {}
86
+ for (const m of s.gauge.metadata) metadata[m.key] = m.value
87
+
88
+ // Current
89
+ const totalSupply = BigInt(s.totalSupply)
90
+ const convexSupply = BigInt(s.sidecarBalance)
91
+ const stakeDaoSupply = totalSupply - convexSupply
92
+
93
+ // Optimal
94
+ const stakeDaoOptSupply =
95
+ totalSupply > BigInt(metadata.optimalDepositBalance || '0')
96
+ ? BigInt(metadata.optimalDepositBalance || '0')
97
+ : totalSupply
98
+ const convexOptSupply = totalSupply - stakeDaoOptSupply
99
+
100
+ const useVeBoost = s.chainId === mainnet.id && s.gauge?.address !== '0xd8b712d29381748dB89c36BCa0138d7c75866ddF' // MIM/3crv
101
+
102
+ const onlyboost = getOnlyboostData(
103
+ {
104
+ active: s.sidecar !== zeroAddress,
105
+ convexImpl: s.sidecar,
106
+ totalSupply,
107
+ convexSupply,
108
+ stakeDaoSupply,
109
+ convexStrategyHoldings: BigInt(metadata.convexTotalSupply || '0'),
110
+ convexWorkingBalance: BigInt(metadata.workingBalanceConvex || '0'),
111
+ convexOptSupply,
112
+ stakeDaoOptSupply,
113
+ claimableData: [],
114
+ },
115
+ global[useVeBoost ? 'stakeDaoVeBoost' : 'stakeDaoVeBalance'],
116
+ global[useVeBoost ? 'convexVeBoost' : 'convexVeBalance'],
117
+ global.veCrvTotalSupply,
118
+ BigInt(s.gauge.totalSupply),
119
+ stakeDaoSupply,
120
+ BigInt(metadata.workingBalance || '0'),
121
+ totalSupply,
122
+ lpPriceInUsd,
123
+ )
124
+
125
+ const boost = onlyboost.boost
126
+ const baseReward = rewards[0]
127
+ const maxApr = baseReward?.apr || 0
128
+ const baseRewardApr = (maxApr / 2.5) * boost * ((100 - V2_FEES) / 100)
129
+
130
+ let baseRewardAdded = false
131
+ const aprDetails = [{ label: isLending ? 'Lending' : 'Trading Fees (APY)', value: [tradingApy] }]
132
+
133
+ for (const r of rewards) {
134
+ if (baseReward && r.token.symbol === baseReward.token.symbol && !baseRewardAdded) {
135
+ aprDetails.push({
136
+ label: `${r.token.symbol} APR (incl. ${withTwoDec(boost)}x boost)`,
137
+ value: [baseRewardApr || 0],
138
+ })
139
+
140
+ baseRewardAdded = true
141
+ } else {
142
+ aprDetails.push({ label: `${r.token.symbol} APR`, value: [r.apr || 0] })
143
+ }
144
+ }
145
+
146
+ let aprTotal = aprDetails.reduce((total, x) => {
147
+ for (const v of x.value) total += v
148
+ return total
149
+ }, 0)
150
+ if (aprTotal > 1e18) aprTotal = 2727
151
+
152
+ return {
153
+ key: s.id,
154
+ tokensFilter: getTokenTypes({ isLending, coins }),
155
+ isLending,
156
+ name,
157
+ type: 'factory-stable-ng',
158
+ version: 2,
159
+ protocol: 'curve',
160
+ chainId: s.chainId,
161
+ vault: s.address,
162
+ lpToken,
163
+ gaugeAddress: s.gauge.address,
164
+ gauge: {
165
+ address: s.gauge.address,
166
+ totalSupply: s.gauge.totalSupply,
167
+ totalSupplyUsd: s.gauge.totalSupplyUSD,
168
+ extraRewards: [],
169
+ },
170
+ coins,
171
+ underlyingCoins: [],
172
+ lpPriceInUsd,
173
+ streaming: true,
174
+ tvl: Number(s.totalSupplyUSD),
175
+ apr: {
176
+ boost,
177
+ current: { total: aprTotal, details: aprDetails },
178
+ },
179
+ rewards,
180
+ tradingApy,
181
+ minApr: maxApr / 2.5,
182
+ maxApr,
183
+ totalSupply: s.totalSupply,
184
+ workingBalance: metadata?.workingBalance || '0',
185
+ onlyboost,
186
+ convexPool:
187
+ metadata.pid && metadata.convexBaseRewardPool
188
+ ? {
189
+ id: Number(metadata.pid),
190
+ crvRewards: metadata.convexBaseRewardPool,
191
+ }
192
+ : undefined,
193
+ }
194
+ })
195
+ } catch (e) {
196
+ console.error(e)
197
+ return []
198
+ }
199
+ }
@@ -14,6 +14,7 @@ import type { Price } from '../../../prices.js'
14
14
  import { getLogsFromEtherscan } from '../../../utils/etherscan.js'
15
15
  import type { RewardsData, SdtApr, StrategyData, ValidChainId } from '../../types.js'
16
16
  import { getAprBreakdown } from '../../utils/getAprBreakdown.js'
17
+ import getTokenTypes from '../../utils/getTokenTypes.js'
17
18
  import { decodeNewFactoryEvent } from '../../utils/index.js'
18
19
  import { fetchAllYearnGauges } from './fetchAllYearnGauges.js'
19
20
 
@@ -209,6 +210,7 @@ export const fetchYearn = async ({
209
210
  return {
210
211
  key: s.key,
211
212
  type: s.type,
213
+ tokensFilter: getTokenTypes(s),
212
214
  protocol: s.protocol,
213
215
  chainId,
214
216
  vault: s.vault,
@@ -94,6 +94,8 @@ export const getStakeDaoSnapshotSpace = (protocolId: string): string | undefined
94
94
  return 'sdfxn.eth'
95
95
  case 'balancer':
96
96
  return 'sdbal.eth'
97
+ case 'pendle':
98
+ return 'sdpendle.eth'
97
99
  default:
98
100
  return undefined
99
101
  }