@stake-dao/reader 0.4.37 → 0.4.39

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.
@@ -71,6 +71,7 @@ export declare const fetchLockers: ({ provider, chainId, prices, withAirdropGrap
71
71
  strategyGauge?: import("@stake-dao/constants").Address;
72
72
  };
73
73
  veBoostTotalSupply: string;
74
+ veBoostApr: number;
74
75
  id: string;
75
76
  order: number;
76
77
  symbol: string;
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../../src/lockers/fetch/index.ts"],"names":[],"mappings":"AAKA,OAAO,KAAK,EAAE,KAAK,EAAE,MAAM,iBAAiB,CAAA;AAK5C,OAA6B,EAAE,KAAK,cAAc,EAAE,MAAM,kCAAkC,CAAA;AAuB5F,UAAU,aAAa;IACrB,QAAQ,EAAE,GAAG,CAAA;IACb,OAAO,EAAE,MAAM,CAAA;IACf,MAAM,EAAE,KAAK,EAAE,CAAA;IACf,gBAAgB,CAAC,EAAE,OAAO,CAAA;CAC3B;AAED,eAAO,MAAM,YAAY,oDAA2D,aAAa;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;EAsRhG,CAAA"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../../src/lockers/fetch/index.ts"],"names":[],"mappings":"AAKA,OAAO,KAAK,EAAE,KAAK,EAAE,MAAM,iBAAiB,CAAA;AAK5C,OAA6B,EAAE,KAAK,cAAc,EAAE,MAAM,kCAAkC,CAAA;AAuB5F,UAAU,aAAa;IACrB,QAAQ,EAAE,GAAG,CAAA;IACb,OAAO,EAAE,MAAM,CAAA;IACf,MAAM,EAAE,KAAK,EAAE,CAAA;IACf,gBAAgB,CAAC,EAAE,OAAO,CAAA;CAC3B;AAED,eAAO,MAAM,YAAY,oDAA2D,aAAa;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;EAgShG,CAAA"}
@@ -1,3 +1,4 @@
1
1
  import { type Locker } from '@stake-dao/constants';
2
2
  export declare const parseBoost: (locker: Locker, chunkedRawLockersData: any) => string;
3
+ export declare const parseVeBoostApr: (provider: any, tokenAddress: string, veBoostDelegator: string, tokenPriceInUsd: number, totalDelegatedVeBoost: number) => Promise<number>;
3
4
  //# sourceMappingURL=parseBoost.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"parseBoost.d.ts","sourceRoot":"","sources":["../../../../src/lockers/fetch/parseBoost.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,KAAK,MAAM,EAAE,MAAM,sBAAsB,CAAA;AAGlD,eAAO,MAAM,UAAU,WAAY,MAAM,yBAAyB,GAAG,WASpE,CAAA"}
1
+ {"version":3,"file":"parseBoost.d.ts","sourceRoot":"","sources":["../../../../src/lockers/fetch/parseBoost.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,KAAK,MAAM,EAA4B,MAAM,sBAAsB,CAAA;AAK5E,eAAO,MAAM,UAAU,WAAY,MAAM,yBAAyB,GAAG,WASpE,CAAA;AAED,eAAO,MAAM,eAAe,aAChB,GAAG,gBACC,MAAM,oBACF,MAAM,mBACP,MAAM,yBACA,MAAM,oBAqC9B,CAAA"}
package/package.json CHANGED
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "name": "@stake-dao/reader",
3
3
  "description": "",
4
- "version": "0.4.37",
4
+ "version": "0.4.39",
5
5
  "license": "AGPL-3.0-only",
6
6
  "repository": {
7
7
  "type": "git",
@@ -36,7 +36,7 @@
36
36
  "graphql-request": "^6.0.0",
37
37
  "lodash-es": "^4.17.21",
38
38
  "viem": "^2.9.31",
39
- "@stake-dao/constants": "0.4.18"
39
+ "@stake-dao/constants": "0.4.19"
40
40
  },
41
41
  "devDependencies": {
42
42
  "@types/lodash-es": "^4.17.12"
@@ -14,7 +14,7 @@ import getFees from '../utils/getFees.js'
14
14
  import getHttpCalls from '../utils/getHttpCalls.js'
15
15
  import { lockedAmountCallSideChain } from '../utils/index.js'
16
16
  import substractFees from '../utils/substractFees.js'
17
- import { parseBoost } from './parseBoost.js'
17
+ import { parseBoost, parseVeBoostApr } from './parseBoost.js'
18
18
  import { parsePeg } from './parsePeg.js'
19
19
  import { parseVoteBoosterData } from './parseVoteBoosterData.js'
20
20
 
@@ -145,8 +145,6 @@ export const fetchLockers = async ({ provider, chainId, prices, withAirdropGraph
145
145
  const veTokenRate =
146
146
  locker.id === 'mav' ? formatUnits(chunkedRawLockersData[11].result[0], locker.token.decimals) : '4'
147
147
 
148
- const veBoostTotalSupply = parseBoost(locker, chunkedRawLockersData)
149
-
150
148
  const sideChains = locker.extensions.sideChains?.map((sideChain) => {
151
149
  const rewards =
152
150
  sideChain.rewards?.map((reward) => {
@@ -179,6 +177,17 @@ export const fetchLockers = async ({ provider, chainId, prices, withAirdropGraph
179
177
 
180
178
  const tvl = totalSupplyStaked ? Number(totalSupplyStaked) * sdTokenPriceInUsd : 0
181
179
 
180
+ const veBoostTotalSupply = parseBoost(locker, chunkedRawLockersData)
181
+ const veBoostApr = locker.veBoost
182
+ ? await parseVeBoostApr(
183
+ provider,
184
+ locker.token.address,
185
+ locker.veBoost.delegator,
186
+ tokenPriceInUsd,
187
+ Number(veBoostTotalSupply),
188
+ )
189
+ : 0
190
+
182
191
  // Rewards APR
183
192
  const rewardsData = locker.rewards.map((r) => {
184
193
  const rawData = rawLockersRewardsData.shift().result
@@ -301,6 +310,7 @@ export const fetchLockers = async ({ provider, chainId, prices, withAirdropGraph
301
310
  ...(locker.id === 'cake' ? { airdropGraph } : {}),
302
311
  },
303
312
  veBoostTotalSupply,
313
+ veBoostApr,
304
314
  }
305
315
  })
306
316
 
@@ -1,5 +1,7 @@
1
- import { type Locker } from '@stake-dao/constants'
2
- import { formatUnits } from 'viem'
1
+ import { type Locker, ONE_WEEK, ONE_YEAR, Zero } from '@stake-dao/constants'
2
+ import { range } from 'lodash-es'
3
+ import { formatUnits, parseAbi } from 'viem'
4
+ import { multicall } from '../../utils.js'
3
5
 
4
6
  export const parseBoost = (locker: Locker, chunkedRawLockersData: any) => {
5
7
  let boost = '0'
@@ -11,3 +13,47 @@ export const parseBoost = (locker: Locker, chunkedRawLockersData: any) => {
11
13
 
12
14
  return boost
13
15
  }
16
+
17
+ export const parseVeBoostApr = async (
18
+ provider: any,
19
+ tokenAddress: string,
20
+ veBoostDelegator: string,
21
+ tokenPriceInUsd: number,
22
+ totalDelegatedVeBoost: number,
23
+ ) => {
24
+ let amountPerYear = 0
25
+
26
+ const now = Math.floor(Date.now() / 1000)
27
+ const lastWeek = Math.floor(now / ONE_WEEK) * ONE_WEEK
28
+ const lastFiveWeeks = range(0, 5).map((i) => lastWeek - i * ONE_WEEK)
29
+
30
+ try {
31
+ const rawWeeklyRewards = await multicall(
32
+ provider,
33
+ lastFiveWeeks.map((weekTimestamp) => ({
34
+ address: veBoostDelegator,
35
+ name: 'weeklyRewards',
36
+ params: [tokenAddress, weekTimestamp],
37
+ })),
38
+ parseAbi(['function weeklyRewards(address token, uint256 weekTimestamp) external view returns (uint256)']),
39
+ )
40
+
41
+ const weeklyRewardsWithoutNull = rawWeeklyRewards
42
+ .filter((el) => el.status === 'success' && el.result && typeof el.result === 'bigint' && el.result > Zero)
43
+ .map((el) => Number(formatUnits(el.result as bigint, 18)))
44
+
45
+ if (weeklyRewardsWithoutNull.length > 0) {
46
+ amountPerYear =
47
+ (weeklyRewardsWithoutNull.reduce((total, x) => (total += x)) / (weeklyRewardsWithoutNull.length * ONE_WEEK)) *
48
+ ONE_YEAR
49
+ }
50
+ } catch (e) {
51
+ console.error(e)
52
+ amountPerYear = 0
53
+ }
54
+
55
+ const tvl = totalDelegatedVeBoost * tokenPriceInUsd
56
+ const apr = tvl > 0 ? ((amountPerYear * tokenPriceInUsd) / tvl) * 100 : 0
57
+
58
+ return apr
59
+ }