@stake-dao/reader 0.5.36 → 0.5.38
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.
- package/dist/esm/bytecodes/index.js +0 -1
- package/dist/esm/bytecodes/index.js.map +1 -1
- package/dist/esm/index.js +0 -3
- package/dist/esm/index.js.map +1 -1
- package/dist/esm/lockers/fetch/index.js +3 -5
- package/dist/esm/lockers/fetch/index.js.map +1 -1
- package/dist/esm/lockers/fetch/static.js +0 -2
- package/dist/esm/lockers/fetch/static.js.map +1 -1
- package/dist/esm/strategies/utils/boost.js +0 -4
- package/dist/esm/strategies/utils/boost.js.map +1 -1
- package/dist/esm/utils.js +0 -1
- package/dist/esm/utils.js.map +1 -1
- package/dist/esm/votemarket/curve/fetchUserVlCvxClaimable.js +58 -6
- package/dist/esm/votemarket/curve/fetchUserVlCvxClaimable.js.map +1 -1
- package/dist/esm/votemarket/fetchCampaigns/processRawCampaigns.js +1 -0
- package/dist/esm/votemarket/fetchCampaigns/processRawCampaigns.js.map +1 -1
- package/dist/types/bytecodes/index.d.ts +0 -1
- package/dist/types/bytecodes/index.d.ts.map +1 -1
- package/dist/types/index.d.ts +0 -2
- package/dist/types/index.d.ts.map +1 -1
- package/dist/types/lockers/fetch/index.d.ts +5 -2
- package/dist/types/lockers/fetch/index.d.ts.map +1 -1
- package/dist/types/lockers/fetch/static.d.ts.map +1 -1
- package/dist/types/strategies/utils/boost.d.ts.map +1 -1
- package/dist/types/utils.d.ts.map +1 -1
- package/dist/types/votemarket/curve/fetchUserVlCvxClaimable.d.ts.map +1 -1
- package/dist/types/votemarket/fetchCampaigns/processRawCampaigns.d.ts.map +1 -1
- package/dist/types/votemarket/types.d.ts +2 -0
- package/dist/types/votemarket/types.d.ts.map +1 -1
- package/package.json +2 -2
- package/src/bytecodes/index.ts +0 -1
- package/src/index.ts +0 -4
- package/src/lockers/fetch/index.ts +4 -5
- package/src/lockers/fetch/static.ts +0 -2
- package/src/strategies/utils/boost.ts +0 -6
- package/src/utils.ts +0 -1
- package/src/votemarket/curve/fetchUserVlCvxClaimable.ts +67 -6
- package/src/votemarket/fetchCampaigns/processRawCampaigns.ts +1 -0
- package/src/votemarket/types.ts +2 -0
- package/dist/esm/abis/angleVaultsMulticall.js +0 -85
- package/dist/esm/abis/angleVaultsMulticall.js.map +0 -1
- package/dist/esm/bytecodes/strategies/batches/batchAngleStrats.js +0 -24
- package/dist/esm/bytecodes/strategies/batches/batchAngleStrats.js.map +0 -1
- package/dist/esm/lockers/fetch/protocols/angle.js +0 -136
- package/dist/esm/lockers/fetch/protocols/angle.js.map +0 -1
- package/dist/esm/strategies/angle/endpoints.js +0 -3
- package/dist/esm/strategies/angle/endpoints.js.map +0 -1
- package/dist/esm/strategies/angle/fetch.js +0 -213
- package/dist/esm/strategies/angle/fetch.js.map +0 -1
- package/dist/types/abis/angleVaultsMulticall.d.ts +0 -42
- package/dist/types/abis/angleVaultsMulticall.d.ts.map +0 -1
- package/dist/types/bytecodes/strategies/batches/batchAngleStrats.d.ts +0 -4
- package/dist/types/bytecodes/strategies/batches/batchAngleStrats.d.ts.map +0 -1
- package/dist/types/lockers/fetch/protocols/angle.d.ts +0 -9
- package/dist/types/lockers/fetch/protocols/angle.d.ts.map +0 -1
- package/dist/types/strategies/angle/endpoints.d.ts +0 -3
- package/dist/types/strategies/angle/endpoints.d.ts.map +0 -1
- package/dist/types/strategies/angle/fetch.d.ts +0 -22
- package/dist/types/strategies/angle/fetch.d.ts.map +0 -1
- package/src/abis/angleVaultsMulticall.ts +0 -85
- package/src/bytecodes/strategies/batches/batchAngleStrats.ts +0 -26
- package/src/lockers/fetch/protocols/angle.ts +0 -157
- package/src/strategies/angle/endpoints.ts +0 -2
- package/src/strategies/angle/fetch.ts +0 -253
|
@@ -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
|
-
}
|