@stake-dao/reader 0.5.35 → 0.5.37

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 (69) hide show
  1. package/dist/esm/bytecodes/index.js +0 -1
  2. package/dist/esm/bytecodes/index.js.map +1 -1
  3. package/dist/esm/index.js +0 -3
  4. package/dist/esm/index.js.map +1 -1
  5. package/dist/esm/lockers/fetch/index.js +0 -2
  6. package/dist/esm/lockers/fetch/index.js.map +1 -1
  7. package/dist/esm/lockers/fetch/static.js +0 -2
  8. package/dist/esm/lockers/fetch/static.js.map +1 -1
  9. package/dist/esm/strategies/curated/morpho/fetch.js +9 -5
  10. package/dist/esm/strategies/curated/morpho/fetch.js.map +1 -1
  11. package/dist/esm/strategies/curve/fetch/getOnlyboostData.js +9 -7
  12. package/dist/esm/strategies/curve/fetch/getOnlyboostData.js.map +1 -1
  13. package/dist/esm/strategies/utils/boost.js +0 -4
  14. package/dist/esm/strategies/utils/boost.js.map +1 -1
  15. package/dist/esm/strategies/v2/parse.js +1 -1
  16. package/dist/esm/strategies/v2/parse.js.map +1 -1
  17. package/dist/esm/utils.js +0 -1
  18. package/dist/esm/utils.js.map +1 -1
  19. package/dist/esm/votemarket/curve/fetchUserVlCvxClaimable.js +58 -6
  20. package/dist/esm/votemarket/curve/fetchUserVlCvxClaimable.js.map +1 -1
  21. package/dist/types/bytecodes/index.d.ts +0 -1
  22. package/dist/types/bytecodes/index.d.ts.map +1 -1
  23. package/dist/types/index.d.ts +0 -2
  24. package/dist/types/index.d.ts.map +1 -1
  25. package/dist/types/lockers/fetch/index.d.ts +1 -1
  26. package/dist/types/lockers/fetch/index.d.ts.map +1 -1
  27. package/dist/types/lockers/fetch/static.d.ts.map +1 -1
  28. package/dist/types/strategies/curated/morpho/fetch.d.ts.map +1 -1
  29. package/dist/types/strategies/curve/fetch/getOnlyboostData.d.ts +1 -1
  30. package/dist/types/strategies/curve/fetch/getOnlyboostData.d.ts.map +1 -1
  31. package/dist/types/strategies/utils/boost.d.ts.map +1 -1
  32. package/dist/types/utils.d.ts.map +1 -1
  33. package/dist/types/votemarket/curve/fetchUserVlCvxClaimable.d.ts.map +1 -1
  34. package/package.json +2 -2
  35. package/src/bytecodes/index.ts +0 -1
  36. package/src/index.ts +0 -4
  37. package/src/lockers/fetch/index.ts +0 -2
  38. package/src/lockers/fetch/static.ts +0 -2
  39. package/src/strategies/curated/morpho/fetch.ts +9 -6
  40. package/src/strategies/curve/fetch/getOnlyboostData.ts +11 -8
  41. package/src/strategies/utils/boost.ts +0 -6
  42. package/src/strategies/v2/parse.ts +1 -1
  43. package/src/utils.ts +0 -1
  44. package/src/votemarket/curve/fetchUserVlCvxClaimable.ts +67 -6
  45. package/dist/esm/abis/angleVaultsMulticall.js +0 -85
  46. package/dist/esm/abis/angleVaultsMulticall.js.map +0 -1
  47. package/dist/esm/bytecodes/strategies/batches/batchAngleStrats.js +0 -24
  48. package/dist/esm/bytecodes/strategies/batches/batchAngleStrats.js.map +0 -1
  49. package/dist/esm/lockers/fetch/protocols/angle.js +0 -136
  50. package/dist/esm/lockers/fetch/protocols/angle.js.map +0 -1
  51. package/dist/esm/strategies/angle/endpoints.js +0 -3
  52. package/dist/esm/strategies/angle/endpoints.js.map +0 -1
  53. package/dist/esm/strategies/angle/fetch.js +0 -213
  54. package/dist/esm/strategies/angle/fetch.js.map +0 -1
  55. package/dist/types/abis/angleVaultsMulticall.d.ts +0 -42
  56. package/dist/types/abis/angleVaultsMulticall.d.ts.map +0 -1
  57. package/dist/types/bytecodes/strategies/batches/batchAngleStrats.d.ts +0 -4
  58. package/dist/types/bytecodes/strategies/batches/batchAngleStrats.d.ts.map +0 -1
  59. package/dist/types/lockers/fetch/protocols/angle.d.ts +0 -9
  60. package/dist/types/lockers/fetch/protocols/angle.d.ts.map +0 -1
  61. package/dist/types/strategies/angle/endpoints.d.ts +0 -3
  62. package/dist/types/strategies/angle/endpoints.d.ts.map +0 -1
  63. package/dist/types/strategies/angle/fetch.d.ts +0 -22
  64. package/dist/types/strategies/angle/fetch.d.ts.map +0 -1
  65. package/src/abis/angleVaultsMulticall.ts +0 -85
  66. package/src/bytecodes/strategies/batches/batchAngleStrats.ts +0 -26
  67. package/src/lockers/fetch/protocols/angle.ts +0 -157
  68. package/src/strategies/angle/endpoints.ts +0 -2
  69. package/src/strategies/angle/fetch.ts +0 -253
@@ -1,157 +0,0 @@
1
- import { One, STAKE_DAO_ASSETS_BASE_URL, Zero, tokenWithId } from '@stake-dao/constants'
2
- import { formatUnits, parseUnits } from 'viem'
3
- import lockersMulticallAbi from '../../../abis/lockersMulticall.js'
4
- import { type Call, getRes, multicall } from '../../../utils.js'
5
- import { parse, parsePeg } from '../parse.js'
6
- import type { Locker } from '../types.js'
7
-
8
- export const locker: Locker = {
9
- id: 'angle',
10
- symbol: 'ANGLE',
11
- protocol: 'Angle',
12
- protocolDescription:
13
- 'Angle is a decentralized, capital efficient and over-collateralized stablecoin protocol composed of smart contracts running on open blockchains.',
14
- website: 'https://angle.money/',
15
- logoUrl: `${STAKE_DAO_ASSETS_BASE_URL}/assets/archive/angle.svg`,
16
- chainId: 1,
17
- rgb: '249, 145, 144',
18
- token: tokenWithId('angle')!,
19
- sdToken: tokenWithId('sdangle')!,
20
- rewards: [
21
- { ...tokenWithId('sdt')!, distribution: 'streamed', origin: 'sdtEmission' },
22
- { ...tokenWithId('angle')!, distribution: 'streamed', origin: 'stratPerf' },
23
- { ...tokenWithId('eura')!, distribution: 'streamed', origin: 'native.common' },
24
- { ...tokenWithId('sdangle')!, distribution: 'distributed', origin: 'bounties' },
25
- ],
26
- delegation: ['sdangle.eth'],
27
- modules: {
28
- depositor: '0x0000000000000000000000000000000000000000',
29
- locker: '0xD13F8C25CceD32cdfA79EB5eD654Ce3e484dCAF5',
30
- veToken: '0x0C462Dbb9EC8cD1630f1728B2CFD2769d09f0dd5',
31
- gauge: '0xE55843a90672f7d8218285e51EE8fF8E233F35d5',
32
- accumulator: '0x8cc02F4f383A11b989708437DbA6BB0628d7eE78',
33
- redeem: '0x1D8A9c30E4e25033498347c1A054717bd0c4D356',
34
- },
35
- secondaryMarket: {
36
- label: 'Curve',
37
- poolKey: 'factory-v2-101',
38
- vaultKey: '',
39
- pool: '0x48fF31bBbD8Ab553Ebe7cBD84e1eA3dBa8f54957',
40
- pools: ['0x48fF31bBbD8Ab553Ebe7cBD84e1eA3dBa8f54957'],
41
- pegBase: 300000,
42
- },
43
- fees: [
44
- {
45
- label: { key: 'liquidity', variable: 'sdANGLE/ANGLE' },
46
- value: 10,
47
- key: 'liquidityFee',
48
- static: true,
49
- },
50
- {
51
- label: { key: 'treasury' },
52
- value: 5,
53
- key: 'daoFee',
54
- static: true,
55
- },
56
- {
57
- label: { key: 'harvester' },
58
- value: 0.1,
59
- key: 'claimerFee',
60
- static: true,
61
- },
62
- ],
63
- extensions: {
64
- coingeckoBaseSlug: 'angle',
65
- },
66
- }
67
-
68
- const angleLocker = async ({ provider, common, prices }: { provider; common; prices }) => {
69
- const token = locker.token.address
70
- const sdToken = locker.sdToken.address
71
-
72
- const gauge = locker.modules.gauge
73
- const depositor = locker.modules.depositor
74
- const votingEscrow = locker.modules.veToken
75
- const lockerAddress = locker.modules.locker
76
-
77
- const secondaryMarket = locker.secondaryMarket!
78
- const rewards = locker.rewards
79
-
80
- const pegBase = parseUnits(secondaryMarket?.pegBase?.toString() || '1', 18)
81
-
82
- const format = (value: bigint) => formatUnits(value, locker.token.decimals)
83
- const formatRes = (value: any) => format(getRes(value))
84
-
85
- const calls: Call[] = [
86
- /*********************************************************************************
87
- *** Voting Escrow
88
- *********************************************************************************/
89
-
90
- // Token locked by the Locker
91
- { address: votingEscrow, name: 'locked', params: [lockerAddress] },
92
- // veToken Balance of the Locker
93
- { address: votingEscrow, name: 'balanceOf', params: [lockerAddress] },
94
- // Total token locked
95
- { address: votingEscrow, name: 'supply' },
96
- // Total veToken supply
97
- { address: votingEscrow, name: 'totalSupply' },
98
-
99
- /*********************************************************************************
100
- *** Gauge
101
- *********************************************************************************/
102
-
103
- // Total sdToken staked
104
- { address: gauge, name: 'totalSupply' },
105
- // Gauge working supply
106
- { address: gauge, name: 'working_supply' },
107
-
108
- /*********************************************************************************
109
- *** Token & sdToken
110
- *********************************************************************************/
111
-
112
- // Token balance not locked
113
- { address: token, name: 'balanceOf', params: [depositor] },
114
- // sdToken in secondary market pool
115
- { address: sdToken, name: 'balanceOf', params: [secondaryMarket.pool] },
116
-
117
- /*********************************************************************************
118
- *** Peg
119
- *********************************************************************************/
120
-
121
- // Return amount when swapping {pegBase} sdToken to token -> get_dy(int128,int128,uint256)
122
- { address: secondaryMarket.pool, name: '0x5e0d443f', params: [One, Zero, pegBase] },
123
-
124
- /*********************************************************************************
125
- *** Rewards
126
- *********************************************************************************/
127
-
128
- // Streaming status for each reward token
129
- ...rewards.map((r) => ({ address: gauge, name: 'reward_data', params: [r.address] })),
130
- ]
131
-
132
- const res = await multicall(provider, calls, lockersMulticallAbi(locker.id, locker.chainId))
133
- const raw = {
134
- tokenLocked: getRes(res.shift()),
135
- veBalanceOfLocker: formatRes(res.shift()),
136
- totalTokenLocked: formatRes(res.shift()),
137
- veTotalSupply: formatRes(res.shift()),
138
- totalSupplyStaked: formatRes(res.shift()),
139
- gaugeWorkingSupply: formatRes(res.shift()),
140
- amountTokenNotLock: formatRes(res.shift()),
141
- sdTokenInPool: formatRes(res.shift()),
142
- peg: getRes(res.shift()),
143
- rewards: rewards.map(() => getRes(res.shift())),
144
- veTokenRate: '4',
145
- _workingSupply: '0',
146
- _veBalanceOfLocker: '0',
147
- }
148
-
149
- raw.tokenLocked = format(raw.tokenLocked[0])
150
- raw.peg = parsePeg(locker, raw.peg)
151
- raw._workingSupply = raw.gaugeWorkingSupply
152
- raw._veBalanceOfLocker = raw.veBalanceOfLocker
153
-
154
- return parse({ locker, common, prices, raw })
155
- }
156
-
157
- export default angleLocker
@@ -1,2 +0,0 @@
1
- export const ANGLE_APR_URL = 'https://api.angle.money/v1/apr'
2
- export const ANGLE_PRICE_URL = 'https://api.angle.money/v1/prices'
@@ -1,253 +0,0 @@
1
- import { STRAT_FEES, Zero, angleStrats, contracts } from '@stake-dao/constants'
2
- import { chunk, uniq } from 'lodash-es'
3
- import { encodeAbiParameters, formatUnits, parseAbiParameters } from 'viem'
4
- import { mainnet } from 'viem/chains'
5
- import multicallAngleVaultsAbi from '../../abis/angleVaultsMulticall.js'
6
- import { batchAngleStrats } from '../../bytecodes/index.js'
7
- import { type Price, getPricesFromLlama } from '../../prices.js'
8
- import { batchJsonRpc, equalTlc, multicall } from '../../utils.js'
9
- import type { RewardsData, SdtApr } from '../types.js'
10
- import { getAprBreakdown } from '../utils/getAprBreakdown.js'
11
- import getTokenTypes from '../utils/getTokenTypes.js'
12
- import { ANGLE_APR_URL, ANGLE_PRICE_URL } from './endpoints.js'
13
-
14
- interface TFetchAngle {
15
- prices: Price[]
16
- provider: any
17
- rpc: string
18
- chainId: number
19
- }
20
-
21
- export const fetchAngle = async ({ prices, provider, rpc, chainId }: TFetchAngle) => {
22
- const stratsDataCalls: { vault: string; token: string; sdtLiquidityGauge: string }[] = []
23
- const balancesCalls: { address: string; name: string }[] = []
24
- const dataCalls: { address: string; name: string }[] = []
25
-
26
- const strats = angleStrats.strats[chainId].filter((s) => s.chainId === chainId)
27
-
28
- const tokensToFetch: any = []
29
-
30
- for (const s of strats) {
31
- tokensToFetch.push(...s.underlyingCoins)
32
- if (s.lpToken.symbol !== 'SLP') {
33
- balancesCalls.push(
34
- ...[
35
- {
36
- address: s.lpToken.address,
37
- name: s.key.includes('gamma') ? 'getTotalAmounts' : 'getUnderlyingBalances',
38
- },
39
- {
40
- address: s.lpToken.address,
41
- name: 'totalSupply',
42
- },
43
- ],
44
- )
45
- }
46
- dataCalls.push(
47
- ...[
48
- { address: s.vault, name: 'totalSupply' },
49
- { address: s.rewards[0].gauge, name: 'totalSupply' },
50
- { address: s.rewards[0].gauge, name: 'working_supply' },
51
- ],
52
- )
53
- }
54
-
55
- const httpCalls = [
56
- // Angle APR
57
- (await fetch(ANGLE_APR_URL)).json(),
58
- // Angle Prices
59
- (await fetch(ANGLE_PRICE_URL)).json(),
60
- // Defillama prices
61
- await getPricesFromLlama(uniq(tokensToFetch), chainId),
62
- ]
63
-
64
- const httpResponses = await Promise.all(httpCalls)
65
-
66
- const rawBalances: any = await multicall(provider, balancesCalls, multicallAngleVaultsAbi)
67
- const rawData: any = await multicall(provider, dataCalls, multicallAngleVaultsAbi)
68
-
69
- const angleAprData = httpResponses[0]
70
- const anglePriceData = httpResponses[1]
71
- const defillamaPrices = httpResponses[2]
72
-
73
- let rawPriceIndex = 0
74
- const stratsWithApy = strats.map((s) => {
75
- const aprData = angleAprData[s.aprApiKey]
76
- let priceData = anglePriceData.find((d) => d.token === s.aprApiKey)
77
-
78
- if (!priceData) {
79
- const token0 = s.underlyingCoins[0]
80
- const token1 = s.underlyingCoins[1]
81
- const token0Price = defillamaPrices.find((p) => p.symbol === token0.symbol)
82
- const token1Price = defillamaPrices.find((p) => p.symbol === token1.symbol)
83
- const token0AmountUsd =
84
- Number(formatUnits(rawBalances[rawPriceIndex].result[0], token0.decimals)) * token0Price.usdPrice
85
- const token1AmountUsd =
86
- Number(formatUnits(rawBalances[rawPriceIndex].result[1], token1.decimals)) * token1Price.usdPrice
87
- const totalLp = Number(formatUnits(rawBalances[rawPriceIndex + 1].result, 18))
88
- const lpPriceInUsd = (token0AmountUsd + token1AmountUsd) / totalLp
89
-
90
- priceData = { rate: lpPriceInUsd }
91
-
92
- rawPriceIndex += 2
93
- }
94
-
95
- let maxApr = 0
96
- let tradingApy = 0
97
-
98
- if (aprData?.details && aprData.value && aprData.address) {
99
- tradingApy = aprData.details.fees ? aprData.details.fees : 0
100
- const aprDetailsKeys = Object.keys(aprData.details)
101
- const indexOfApy = aprDetailsKeys.map((k) => k.includes(s.lpToken.address.toLowerCase())).indexOf(true)
102
- maxApr =
103
- indexOfApy > 0
104
- ? aprData.details[aprDetailsKeys[indexOfApy]!]
105
- : aprData.details.max
106
- ? aprData.details.max
107
- : aprData.value - tradingApy
108
- }
109
-
110
- if (s.key === 'angle-sushi-eura-angle') {
111
- stratsDataCalls.push({
112
- vault: s.vault,
113
- token: s.lpToken.address,
114
- sdtLiquidityGauge: s.gaugeAddress,
115
- })
116
- }
117
-
118
- return {
119
- ...s,
120
- tradingApy,
121
- minApr: (maxApr * ((100 - STRAT_FEES) / 100)) / 2.5,
122
- maxApr: maxApr * ((100 - STRAT_FEES) / 100),
123
- lpPriceInUsd: priceData ? priceData.rate : 1,
124
- }
125
- })
126
-
127
- const inputArgsChunks = chunk(stratsDataCalls, 20)
128
- const angleCalls = inputArgsChunks.map((inputArgs) => {
129
- const inputData = encodeAbiParameters(parseAbiParameters(batchAngleStrats.inputType[chainId]!) as any, [
130
- contracts.sdGaugeController![chainId],
131
- inputArgs,
132
- ])
133
- return batchAngleStrats.bytecode[chainId]!.concat(inputData.slice(2))
134
- })
135
-
136
- const rawAngleData = await batchJsonRpc({
137
- rpc,
138
- calls: angleCalls,
139
- outputTypeAbi: batchAngleStrats.outputTypeHr[chainId],
140
- callsKey: `strategies/angle/fetch.ts: rawAngleData - chainId ${chainId} - rpc ${rpc}`,
141
- })
142
-
143
- let offchainDataIndex = 0
144
- const parsedStrats = stratsWithApy.map((s) => {
145
- let fetchedData: any
146
-
147
- if (s.offchain) {
148
- fetchedData = {
149
- totalSupply: rawData[offchainDataIndex].result,
150
- sdGaugeTotalSupply: rawData[offchainDataIndex + 1].result,
151
- sdWorkingSupply: chainId === mainnet.id ? rawData[offchainDataIndex + 2].result : Zero,
152
- accumulatedFees: Zero,
153
- keeperFee: Zero,
154
- }
155
- } else {
156
- fetchedData = rawAngleData.shift()
157
- }
158
-
159
- offchainDataIndex += 3
160
-
161
- const rewardsData: RewardsData[] = s.rewards.map((r: any) => {
162
- const rewardToken = {
163
- symbol: r.symbol,
164
- name: r.name,
165
- decimals: r.decimals,
166
- address: r.address,
167
- }
168
- const rewardPrice = prices.find((p: any) => equalTlc(p.address, rewardToken.address))
169
-
170
- return {
171
- token: rewardToken,
172
- price: rewardPrice ? rewardPrice.usdPrice : 0,
173
- apr: 0,
174
- streaming: false,
175
- periodFinish: 0,
176
- rate: '0',
177
- lastUpdate: '0',
178
- claimablePendingRewards: '0',
179
- }
180
- })
181
-
182
- const boost = 2.5
183
- const sdtApr: SdtApr = {
184
- sdtUserApr: 0,
185
- sdtFuturUserApr: 0,
186
- sdtMinApr: 0,
187
- sdtFuturMinApr: 0,
188
- sdtMaxApr: 0,
189
- sdtFuturMaxApr: 0,
190
- sdtBoost: 1,
191
- }
192
- const apr = getAprBreakdown(s, rewardsData, boost, sdtApr)
193
-
194
- const totalSupply = formatUnits(fetchedData.totalSupply, 0)
195
- const lpPriceInUsd = s.lpPriceInUsd
196
- const tvl = lpPriceInUsd * Number(formatUnits(BigInt(fetchedData.totalSupply), 18))
197
-
198
- const sdGauge = {
199
- address: s.gaugeAddress,
200
- totalSupply: formatUnits(fetchedData.sdGaugeTotalSupply, 0),
201
- relativeWeight: '0',
202
- weight: '0',
203
- futureWeight: '0',
204
- workingSupply: '0',
205
- }
206
-
207
- return {
208
- key: s.key,
209
- name: s.name,
210
- tokensFilter: getTokenTypes(s),
211
- protocol: s.protocol,
212
- chainId: s.chainId,
213
- vault: s.vault,
214
- lpToken: s.lpToken,
215
- gaugeAddress: s.gaugeAddress,
216
- coins: s.coins,
217
- sdGauge,
218
- lpPriceInUsd,
219
- streaming: rewardsData.some((r) => Number(r.periodFinish) > Math.floor(Date.now() / 1000)),
220
- tvl,
221
- apr: {
222
- boost,
223
- ...apr,
224
- },
225
- rewards: rewardsData,
226
- // Base APR data
227
- tradingApy: s.tradingApy,
228
- minApr: s.minApr,
229
- maxApr: s.maxApr,
230
- // Raw data
231
- totalSupply,
232
- // Gas optimised
233
- vaultFees: {
234
- keeper: Number(fetchedData.keeperFee) / 100,
235
- accumulated: formatUnits(fetchedData.accumulatedFees, 0),
236
- },
237
- }
238
- })
239
-
240
- return {
241
- global: {
242
- fees: {
243
- veSdt: 5,
244
- perf: 2,
245
- accumulator: 8,
246
- claimer: 0.5,
247
- },
248
- },
249
- deployed: parsedStrats,
250
- notDeployed: [],
251
- fetched: true,
252
- }
253
- }