@stake-dao/reader 0.4.34 → 0.4.36

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 (49) hide show
  1. package/dist/esm/bytecodes/ccipGas.js +11 -0
  2. package/dist/esm/bytecodes/ccipGas.js.map +1 -0
  3. package/dist/esm/bytecodes/votemarket/batchCampaignsRestrictedVotes.js +2 -2
  4. package/dist/esm/bytecodes/votemarket/batchCampaignsRestrictedVotes.js.map +1 -1
  5. package/dist/esm/ccip/fetchCcipFee.js +1 -1
  6. package/dist/esm/ccip/fetchCcipFee.js.map +1 -1
  7. package/dist/esm/ccip/fetchCcipGas.js +37 -0
  8. package/dist/esm/ccip/fetchCcipGas.js.map +1 -0
  9. package/dist/esm/index.js +1 -0
  10. package/dist/esm/index.js.map +1 -1
  11. package/dist/esm/lockers/fetch/index.js +18 -41
  12. package/dist/esm/lockers/fetch/index.js.map +1 -1
  13. package/dist/esm/lockers/utils/getBribesRewardsData.js +1 -0
  14. package/dist/esm/lockers/utils/getBribesRewardsData.js.map +1 -1
  15. package/dist/esm/strategies/pendle/fetch.js +6 -5
  16. package/dist/esm/strategies/pendle/fetch.js.map +1 -1
  17. package/dist/esm/tsconfig.build.tsbuildinfo +1 -1
  18. package/dist/esm/utils.js +17 -2
  19. package/dist/esm/utils.js.map +1 -1
  20. package/dist/esm/votemarket/fetchCampaigns.js +10 -17
  21. package/dist/esm/votemarket/fetchCampaigns.js.map +1 -1
  22. package/dist/types/bytecodes/ccipGas.d.ts +4 -0
  23. package/dist/types/bytecodes/ccipGas.d.ts.map +1 -0
  24. package/dist/types/ccip/fetchCcipFee.d.ts +1 -1
  25. package/dist/types/ccip/fetchCcipGas.d.ts +22 -0
  26. package/dist/types/ccip/fetchCcipGas.d.ts.map +1 -0
  27. package/dist/types/index.d.ts +1 -0
  28. package/dist/types/index.d.ts.map +1 -1
  29. package/dist/types/lockers/fetch/index.d.ts.map +1 -1
  30. package/dist/types/lockers/utils/getBribesRewardsData.d.ts.map +1 -1
  31. package/dist/types/strategies/pendle/fetch.d.ts.map +1 -1
  32. package/dist/types/utils.d.ts +2 -0
  33. package/dist/types/utils.d.ts.map +1 -1
  34. package/dist/types/votemarket/fetchCampaigns.d.ts +1 -2
  35. package/dist/types/votemarket/fetchCampaigns.d.ts.map +1 -1
  36. package/dist/types/votemarket/types.d.ts +1 -0
  37. package/dist/types/votemarket/types.d.ts.map +1 -1
  38. package/package.json +1 -1
  39. package/src/bytecodes/ccipGas.ts +14 -0
  40. package/src/bytecodes/votemarket/batchCampaignsRestrictedVotes.ts +2 -2
  41. package/src/ccip/fetchCcipFee.ts +2 -2
  42. package/src/ccip/fetchCcipGas.ts +68 -0
  43. package/src/index.ts +1 -0
  44. package/src/lockers/fetch/index.ts +26 -53
  45. package/src/lockers/utils/getBribesRewardsData.ts +1 -0
  46. package/src/strategies/pendle/fetch.ts +7 -5
  47. package/src/utils.ts +22 -2
  48. package/src/votemarket/fetchCampaigns.ts +10 -18
  49. package/src/votemarket/types.ts +1 -0
@@ -1,11 +1,11 @@
1
- import { type Locker, ONE_YEAR, Zero, delegationWithId, lockers } from '@stake-dao/constants'
1
+ import { type Locker, ONE_YEAR, RPC, Zero, contract, lockers } from '@stake-dao/constants'
2
2
  import { formatUnits, parseAbi, zeroAddress } from 'viem'
3
- import { fraxtal, mainnet } from 'viem/chains'
3
+ import { mainnet } from 'viem/chains'
4
4
  import lockersMulticallAbi from '../../abis/lockersMulticall.js'
5
5
  import { getSdtInflationData } from '../../index.js'
6
6
  import type { Price } from '../../prices.js'
7
7
  import { handlePromise } from '../../strategies/utils/promise.js'
8
- import { type Call, type MultiChainCall, equalTlc, multicall, multichainMulticall } from '../../utils.js'
8
+ import { type Call, type MultiChainCall, equalTlc, multicall, multichainMulticall, rpcCall } from '../../utils.js'
9
9
  import { extractFees, feeCalls } from '../utils/callsForLockers/feeCalls.js'
10
10
  import callsForLockers from '../utils/callsForLockers/index.js'
11
11
  import getBribesRewardsData, { type TBribesRewards } from '../utils/getBribesRewardsData.js'
@@ -73,7 +73,7 @@ export const fetchLockers = async ({ provider, chainId, prices, withAirdropGraph
73
73
  lockersFeeCalls.push(...feeCalls(locker.id, locker.modules.accumulator))
74
74
  }
75
75
 
76
- const [rawLockersData, rawLockersSideChainData, rawLockersRewardsData] = await handlePromise(
76
+ const [rawLockersData, rawLockersSideChainData, rawLockersRewardsData, rawVeSdtTotalSupply] = await handlePromise(
77
77
  [
78
78
  multicall(provider, lockersCalls.concat(lockersFeeCalls), lockersMulticallAbi),
79
79
  multichainMulticall(lockersSideChainsCalls, lockersMulticallAbi),
@@ -84,6 +84,7 @@ export const fetchLockers = async ({ provider, chainId, prices, withAirdropGraph
84
84
  'function reward_data(address) external view returns (address,address,uint256,uint256,uint256,uint256)',
85
85
  ]),
86
86
  ),
87
+ rpcCall(RPC[mainnet.id], [{ to: contract('veSdt', mainnet.id), data: '0x18160ddd' }]),
87
88
  ],
88
89
  'lockerMulticalls',
89
90
  )
@@ -91,6 +92,7 @@ export const fetchLockers = async ({ provider, chainId, prices, withAirdropGraph
91
92
  const lockersFees = extractFees(chainLockers, rawLockersData)
92
93
 
93
94
  const sdtInflationData = chainId === mainnet.id ? await getSdtInflationData(provider) : undefined
95
+ const veSdtTotalSupply = BigInt(rawVeSdtTotalSupply[0].result)
94
96
 
95
97
  const lockerData = chainLockers.map(async (locker) => {
96
98
  const lockerCallsLength = callsForLockers(
@@ -135,7 +137,7 @@ export const fetchLockers = async ({ provider, chainId, prices, withAirdropGraph
135
137
  ? formatUnits(chunkedRawLockersData[7].result, locker.token.decimals)
136
138
  : '0'
137
139
  const amountTokenNotLock = formatUnits(chunkedRawLockersData[8].result, locker.token.decimals)
138
- const veSdtTotalSupply = chainId === mainnet.id ? chunkedRawLockersData[9].result : '0'
140
+ // const veSdtTotalSupply = chainId === mainnet.id ? chunkedRawLockersData[9].result : '0'
139
141
 
140
142
  const voteBooster = parseVoteBoosterData(locker, chunkedRawLockersData)
141
143
  const peg = parsePeg(locker, chunkedRawLockersData)
@@ -209,57 +211,28 @@ export const fetchLockers = async ({ provider, chainId, prices, withAirdropGraph
209
211
  }
210
212
  })
211
213
 
212
- let bribeMinApr = 0
213
- let bribeMaxApr = 0
214
- let bribeRewards: TBribesRewards | undefined = undefined
214
+ let _workingSupply = chainId === mainnet.id ? gaugeWorkingSupply : totalSupplyStaked
215
+ let _veSdtTotalSupply = veSdtTotalSupply
216
+ let _veBalanceOfLocker = veBalanceOfLocker
215
217
 
216
- if (chainId === mainnet.id || chainId === fraxtal.id) {
217
- let _workingSupply = gaugeWorkingSupply
218
- let _veSdtTotalSupply = veSdtTotalSupply
219
- let _veBalanceOfLocker = veBalanceOfLocker
220
-
221
- if (locker.id === 'fxs') {
222
- _workingSupply = httpCalls.sdfxsWorkingData.working_supply.toString()
223
- _veSdtTotalSupply = BigInt(httpCalls.sdfxsWorkingData.veSDT_total_supply)
224
- _veBalanceOfLocker = (httpCalls.sdfxsWorkingData.veBalance * 4).toString()
225
- }
218
+ if (locker.id === 'fxs') {
219
+ _workingSupply = httpCalls.sdfxsWorkingData.working_supply.toString()
220
+ _veSdtTotalSupply = BigInt(httpCalls.sdfxsWorkingData.veSDT_total_supply)
221
+ _veBalanceOfLocker = (httpCalls.sdfxsWorkingData.veBalance * 4).toString()
222
+ }
226
223
 
227
- const data = getBribesRewardsData(
228
- locker,
229
- httpCalls.bribesData,
230
- _veSdtTotalSupply,
231
- totalSupplyStaked,
232
- _veBalanceOfLocker,
233
- _workingSupply,
234
- )
235
-
236
- bribeMinApr = data.bribeMinApr
237
- bribeMaxApr = data.bribeMaxApr
238
- bribeRewards = data.bribeRewards
239
- } else if (locker.id === 'cake') {
240
- let _veBalanceOfLocker = Number(veBalanceOfLocker)
241
-
242
- // Add sidechain veBalance
243
- if (sideChains && sideChains.length > 0) {
244
- _veBalanceOfLocker +=
245
- sideChains?.reduce((acc: number, sideChain) => acc + Number(sideChain.veBalanceOfLocker), 0) || 0
246
- }
224
+ const data = getBribesRewardsData(
225
+ locker,
226
+ httpCalls.bribesData,
227
+ _veSdtTotalSupply,
228
+ totalSupplyStaked,
229
+ _veBalanceOfLocker,
230
+ _workingSupply,
231
+ )
247
232
 
248
- const apr =
249
- (httpCalls.bribesData?.[delegationWithId(locker.id)!] || 0) * (_veBalanceOfLocker / Number(totalSupplyStaked))
250
-
251
- bribeMinApr = apr
252
- bribeMaxApr = apr
253
- bribeRewards = {
254
- bribeMinApr: apr,
255
- bribeMaxApr: apr,
256
- bribeAverageApr: apr,
257
- minBoost: '0',
258
- maxBoost: '0',
259
- hideBoostTab: true,
260
- token: `sd${locker.id}`,
261
- }
262
- }
233
+ const bribeMinApr: number = data.bribeMinApr
234
+ const bribeMaxApr: number = data.bribeMaxApr
235
+ const bribeRewards: TBribesRewards | undefined = data.bribeRewards
263
236
 
264
237
  // Total APR
265
238
  const minRewardsAprs = rewardsData.reduce((x, y) => x + y.apr, 0) + bribeMinApr
@@ -27,6 +27,7 @@ const getBribesRewardsData = (
27
27
  { id: 'bal', value: bribesData?.[delegationWithId('bal')!] / 100 || 0 },
28
28
  { id: 'fxs', value: bribesData?.[delegationWithId('fxs')!] / 100 || 0 }, // 1 FXS = 4 veFXS
29
29
  { id: 'angle', value: bribesData?.[delegationWithId('angle')!] / 100 || 0 },
30
+ { id: 'cake', value: bribesData?.[delegationWithId('cake')!] / 100 || 0 },
30
31
  { id: 'pendle', value: bribesData?.[delegationWithId('pendle')!] / 100 || 0 },
31
32
  { id: 'fxn', value: bribesData?.[delegationWithId('fxn')!] / 100 || 0 },
32
33
  ]
@@ -180,12 +180,14 @@ export const fetchPendle = async ({ prices, provider, rpc, explorerApiKey, explo
180
180
  if (pendleStratApiData.underlyingRewardApy > 0) {
181
181
  const extraApiData = pendleApiExtraData.find((el) => equalTlc(el.address, s.lpToken.address))
182
182
  extraRewards = extraApiData.underlyingRewardApyBreakdown.map((r) => {
183
- const nonBoostedApr = (r.absoluteApy * (100 - STRAT_FEES)) / 2.5
183
+ // const nonBoostedApr = (r.absoluteApy * (100 - STRAT_FEES)) / 2.5
184
+ const nonBoostedApr =
185
+ r.absoluteApy * 100 * (extraApiData.totalSy / (extraApiData.totalSy + extraApiData.totalPt))
184
186
  return {
185
- address: r.address,
186
- name: r.name,
187
- symbol: r.symbol,
188
- decimals: r.decimals,
187
+ address: r.asset.address,
188
+ name: r.asset.name,
189
+ symbol: r.asset.symbol,
190
+ decimals: r.asset.decimals,
189
191
  apy: nonBoostedApr * boost,
190
192
  }
191
193
  })
package/src/utils.ts CHANGED
@@ -140,16 +140,34 @@ export const ethGetTxsReceipts = async (rpc: string, txHashes: string[]) => {
140
140
  return request
141
141
  }
142
142
 
143
+ export const ethEstimateGas = async (rpc: string, from: string, to: string, data: string) => {
144
+ const request = (
145
+ await fetch(rpc, {
146
+ method: 'POST',
147
+ headers: { 'Content-Type': 'application/json' },
148
+ body: JSON.stringify({
149
+ id: 0,
150
+ jsonrpc: '2.0',
151
+ method: 'eth_estimateGas',
152
+ params: [{ from, to, data }],
153
+ }),
154
+ })
155
+ ).json()
156
+
157
+ return request
158
+ }
159
+
143
160
  export interface BatchJsonRpcArgs {
144
161
  rpc: string
145
162
  calls: string[]
146
163
  outputTypeAbi: any | any[]
147
164
  parse?: boolean
165
+ raw?: boolean
148
166
  callsKey: string
149
167
  }
150
168
 
151
169
  export const batchJsonRpc = async (args: BatchJsonRpcArgs) => {
152
- const { rpc, calls, outputTypeAbi, parse = true, callsKey } = args
170
+ const { rpc, calls, outputTypeAbi, parse = true, raw = false, callsKey } = args
153
171
 
154
172
  if (calls.length > 0) {
155
173
  const rpcRequests = await (
@@ -173,7 +191,9 @@ export const batchJsonRpc = async (args: BatchJsonRpcArgs) => {
173
191
  const status = isError ? 'error' : 'fulfilled'
174
192
  const value = isError
175
193
  ? `${callsKey} call index ${index}: code ${res.error.code}\n${res.error.message}`
176
- : decodeAbiParameters(parse ? (parseAbiParameters(abi) as any) : abi, res.result)
194
+ : raw
195
+ ? [res.result]
196
+ : decodeAbiParameters(parse ? (parseAbiParameters(abi) as any) : abi, res.result)
177
197
 
178
198
  if (isError) {
179
199
  console.error(value)
@@ -25,7 +25,6 @@ export const CLOSE_WINDOW_LENGTH = 4 // weeks
25
25
  interface FetchCampaignsProps {
26
26
  platform: string
27
27
  gaugeController: string
28
- veToken: string
29
28
  chainId: number
30
29
  rpcs: { [chainId: number]: string }
31
30
  etherscanApiKey?: string
@@ -93,10 +92,16 @@ const updateEpoch = ({
93
92
  return campaign
94
93
  }
95
94
 
95
+ const formatPeriod = (rawPeriod: any, decimals: number) => ({
96
+ rewardPerPeriod: formatUnits(rawPeriod.rewardPerPeriod, decimals),
97
+ rewardPerVote: formatUnits(rawPeriod.rewardPerVote, decimals),
98
+ leftover: formatUnits(rawPeriod.leftover, decimals),
99
+ updated: rawPeriod.updated,
100
+ })
101
+
96
102
  export const fetchCampaigns = async ({
97
103
  platform,
98
104
  gaugeController,
99
- veToken,
100
105
  chainId,
101
106
  rpcs,
102
107
  etherscanApiKey,
@@ -171,7 +176,6 @@ export const fetchCampaigns = async ({
171
176
  .map((rc) => [rc.campaign.chainId, rc.id, rc.campaign.gauge, rc.addresses])
172
177
  const callsRestrictedVotesChunks = chunk(callsRestrictedVotes, CAMPAIGNS_CHUNK_SIZE).map((restrictedVoteChunk) => {
173
178
  const inputData = encodeAbiParameters(parseAbiParameters(batchCampaignsRestrictedVotes.inputType[1]!) as any, [
174
- veToken,
175
179
  gaugeController,
176
180
  restrictedVoteChunk,
177
181
  ])
@@ -333,21 +337,9 @@ export const fetchCampaigns = async ({
333
337
  addresses: rc.addresses,
334
338
  isWhitelist: rc.isWhitelistOnly,
335
339
  isBlacklist: !rc.isWhitelistOnly && rc.addresses.length > 0,
336
- previousPeriod: rawPreviousPeriod
337
- ? {
338
- rewardPerPeriod: formatUnits(rawPreviousPeriod.rewardPerPeriod, decimals),
339
- rewardPerVote: formatUnits(rawPreviousPeriod.rewardPerVote, decimals),
340
- leftover: formatUnits(rawPreviousPeriod.leftover, decimals),
341
- updated: rawPreviousPeriod.updated,
342
- }
343
- : undefined,
344
- currentPeriod: {
345
- rewardPerPeriod: formatUnits(rawCurrentPeriod.rewardPerPeriod, decimals),
346
- rewardPerVote: formatUnits(rawCurrentPeriod.rewardPerVote, decimals),
347
- leftover: formatUnits(rawCurrentPeriod.leftover, decimals),
348
- updated: rawCurrentPeriod.updated,
349
- },
350
- periods: rc.periods,
340
+ previousPeriod: rawPreviousPeriod ? formatPeriod(rawPreviousPeriod, decimals) : undefined,
341
+ currentPeriod: formatPeriod(rawCurrentPeriod, decimals),
342
+ periods: rc.periods.map((rawP) => formatPeriod(rawP, decimals)),
351
343
  status: {
352
344
  voteOpen: endTimestamp - ONE_WEEK > currentTimestamp,
353
345
  voteClosed: currentTimestamp > endTimestamp - ONE_WEEK,
@@ -42,6 +42,7 @@ export type Campaign = {
42
42
  previousPeriod: Period
43
43
  currentPeriod: Period
44
44
  periodLeft: number
45
+ periods: Period[]
45
46
  status: {
46
47
  voteOpen: boolean
47
48
  voteClosed: boolean