@stake-dao/reader 0.4.111 → 0.5.0

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 (193) hide show
  1. package/dist/esm/abis/lockersMulticall.js +30 -2
  2. package/dist/esm/abis/lockersMulticall.js.map +1 -1
  3. package/dist/esm/index.js +2 -1
  4. package/dist/esm/index.js.map +1 -1
  5. package/dist/esm/lockers/fetch/index.js +53 -224
  6. package/dist/esm/lockers/fetch/index.js.map +1 -1
  7. package/dist/esm/lockers/fetch/parse.js +174 -0
  8. package/dist/esm/lockers/fetch/parse.js.map +1 -0
  9. package/dist/esm/lockers/fetch/protocols/angle.js +136 -0
  10. package/dist/esm/lockers/fetch/protocols/angle.js.map +1 -0
  11. package/dist/esm/lockers/fetch/protocols/balancer.js +172 -0
  12. package/dist/esm/lockers/fetch/protocols/balancer.js.map +1 -0
  13. package/dist/esm/lockers/fetch/protocols/blackpool.js +130 -0
  14. package/dist/esm/lockers/fetch/protocols/blackpool.js.map +1 -0
  15. package/dist/esm/lockers/fetch/protocols/curve.js +204 -0
  16. package/dist/esm/lockers/fetch/protocols/curve.js.map +1 -0
  17. package/dist/esm/lockers/fetch/protocols/frax-fpis.js +121 -0
  18. package/dist/esm/lockers/fetch/protocols/frax-fpis.js.map +1 -0
  19. package/dist/esm/lockers/fetch/protocols/frax-fxs.js +169 -0
  20. package/dist/esm/lockers/fetch/protocols/frax-fxs.js.map +1 -0
  21. package/dist/esm/lockers/fetch/protocols/fxn.js +131 -0
  22. package/dist/esm/lockers/fetch/protocols/fxn.js.map +1 -0
  23. package/dist/esm/lockers/fetch/protocols/maverick.js +172 -0
  24. package/dist/esm/lockers/fetch/protocols/maverick.js.map +1 -0
  25. package/dist/esm/lockers/fetch/protocols/pancakeswap.js +128 -0
  26. package/dist/esm/lockers/fetch/protocols/pancakeswap.js.map +1 -0
  27. package/dist/esm/lockers/fetch/protocols/pendle.js +144 -0
  28. package/dist/esm/lockers/fetch/protocols/pendle.js.map +1 -0
  29. package/dist/esm/lockers/fetch/protocols/spectra.js +133 -0
  30. package/dist/esm/lockers/fetch/protocols/spectra.js.map +1 -0
  31. package/dist/esm/lockers/fetch/protocols/yearn.js +138 -0
  32. package/dist/esm/lockers/fetch/protocols/yearn.js.map +1 -0
  33. package/dist/esm/lockers/fetch/protocols/yieldbasis.js +131 -0
  34. package/dist/esm/lockers/fetch/protocols/yieldbasis.js.map +1 -0
  35. package/dist/esm/lockers/fetch/protocols/yieldnest.js +135 -0
  36. package/dist/esm/lockers/fetch/protocols/yieldnest.js.map +1 -0
  37. package/dist/esm/lockers/fetch/protocols/zerolend.js +124 -0
  38. package/dist/esm/lockers/fetch/protocols/zerolend.js.map +1 -0
  39. package/dist/esm/lockers/fetch/static.js +33 -0
  40. package/dist/esm/lockers/fetch/static.js.map +1 -0
  41. package/dist/esm/lockers/fetch/types.js +2 -0
  42. package/dist/esm/lockers/fetch/types.js.map +1 -0
  43. package/dist/esm/lockers/utils/callsForLockers/pegCalls.js.map +1 -1
  44. package/dist/esm/lockers/utils/getBribesRewardsData.js +11 -9
  45. package/dist/esm/lockers/utils/getBribesRewardsData.js.map +1 -1
  46. package/dist/esm/lockers/utils/substractFees.js +1 -2
  47. package/dist/esm/lockers/utils/substractFees.js.map +1 -1
  48. package/dist/esm/strategies/curve/fetch/getOnlyboostData.js +8 -3
  49. package/dist/esm/strategies/curve/fetch/getOnlyboostData.js.map +1 -1
  50. package/dist/esm/strategies/curve/fetch/index.js +1 -1
  51. package/dist/esm/strategies/curve/fetch/index.js.map +1 -1
  52. package/dist/esm/strategies/v2/parse.js +6 -4
  53. package/dist/esm/strategies/v2/parse.js.map +1 -1
  54. package/dist/esm/utils.js +5 -0
  55. package/dist/esm/utils.js.map +1 -1
  56. package/dist/types/abis/lockersMulticall.d.ts +1 -1
  57. package/dist/types/abis/lockersMulticall.d.ts.map +1 -1
  58. package/dist/types/index.d.ts +2 -1
  59. package/dist/types/index.d.ts.map +1 -1
  60. package/dist/types/lockers/fetch/index.d.ts +5 -99
  61. package/dist/types/lockers/fetch/index.d.ts.map +1 -1
  62. package/dist/types/lockers/fetch/parse.d.ts +52 -0
  63. package/dist/types/lockers/fetch/parse.d.ts.map +1 -0
  64. package/dist/types/lockers/fetch/protocols/angle.d.ts +9 -0
  65. package/dist/types/lockers/fetch/protocols/angle.d.ts.map +1 -0
  66. package/dist/types/lockers/fetch/protocols/balancer.d.ts +9 -0
  67. package/dist/types/lockers/fetch/protocols/balancer.d.ts.map +1 -0
  68. package/dist/types/lockers/fetch/protocols/blackpool.d.ts +9 -0
  69. package/dist/types/lockers/fetch/protocols/blackpool.d.ts.map +1 -0
  70. package/dist/types/lockers/fetch/protocols/curve.d.ts +9 -0
  71. package/dist/types/lockers/fetch/protocols/curve.d.ts.map +1 -0
  72. package/dist/types/lockers/fetch/protocols/frax-fpis.d.ts +9 -0
  73. package/dist/types/lockers/fetch/protocols/frax-fpis.d.ts.map +1 -0
  74. package/dist/types/lockers/fetch/protocols/frax-fxs.d.ts +9 -0
  75. package/dist/types/lockers/fetch/protocols/frax-fxs.d.ts.map +1 -0
  76. package/dist/types/lockers/fetch/protocols/fxn.d.ts +9 -0
  77. package/dist/types/lockers/fetch/protocols/fxn.d.ts.map +1 -0
  78. package/dist/types/lockers/fetch/protocols/maverick.d.ts +9 -0
  79. package/dist/types/lockers/fetch/protocols/maverick.d.ts.map +1 -0
  80. package/dist/types/lockers/fetch/protocols/pancakeswap.d.ts +9 -0
  81. package/dist/types/lockers/fetch/protocols/pancakeswap.d.ts.map +1 -0
  82. package/dist/types/lockers/fetch/protocols/pendle.d.ts +9 -0
  83. package/dist/types/lockers/fetch/protocols/pendle.d.ts.map +1 -0
  84. package/dist/types/lockers/fetch/protocols/spectra.d.ts +9 -0
  85. package/dist/types/lockers/fetch/protocols/spectra.d.ts.map +1 -0
  86. package/dist/types/lockers/fetch/protocols/yearn.d.ts +9 -0
  87. package/dist/types/lockers/fetch/protocols/yearn.d.ts.map +1 -0
  88. package/dist/types/lockers/fetch/protocols/yieldbasis.d.ts +9 -0
  89. package/dist/types/lockers/fetch/protocols/yieldbasis.d.ts.map +1 -0
  90. package/dist/types/lockers/fetch/protocols/yieldnest.d.ts +9 -0
  91. package/dist/types/lockers/fetch/protocols/yieldnest.d.ts.map +1 -0
  92. package/dist/types/lockers/fetch/protocols/zerolend.d.ts +9 -0
  93. package/dist/types/lockers/fetch/protocols/zerolend.d.ts.map +1 -0
  94. package/dist/types/lockers/fetch/static.d.ts +3 -0
  95. package/dist/types/lockers/fetch/static.d.ts.map +1 -0
  96. package/dist/types/lockers/fetch/types.d.ts +105 -0
  97. package/dist/types/lockers/fetch/types.d.ts.map +1 -0
  98. package/dist/types/lockers/utils/callsForLockers/pegCalls.d.ts +1 -1
  99. package/dist/types/lockers/utils/callsForLockers/pegCalls.d.ts.map +1 -1
  100. package/dist/types/lockers/utils/getBribesRewardsData.d.ts +1 -0
  101. package/dist/types/lockers/utils/getBribesRewardsData.d.ts.map +1 -1
  102. package/dist/types/lockers/utils/substractFees.d.ts.map +1 -1
  103. package/dist/types/strategies/curve/fetch/getOnlyboostData.d.ts +1 -1
  104. package/dist/types/strategies/curve/fetch/getOnlyboostData.d.ts.map +1 -1
  105. package/dist/types/strategies/curve/fetch/index.d.ts.map +1 -1
  106. package/dist/types/strategies/stakeDao/fetch.d.ts +1 -1
  107. package/dist/types/strategies/v2/parse.d.ts.map +1 -1
  108. package/dist/types/utils.d.ts +1 -0
  109. package/dist/types/utils.d.ts.map +1 -1
  110. package/package.json +2 -2
  111. package/src/abis/lockersMulticall.ts +30 -2
  112. package/src/index.ts +2 -1
  113. package/src/lockers/fetch/index.ts +65 -329
  114. package/src/lockers/fetch/parse.ts +258 -0
  115. package/src/lockers/fetch/protocols/angle.ts +157 -0
  116. package/src/lockers/fetch/protocols/balancer.ts +195 -0
  117. package/src/lockers/fetch/protocols/blackpool.ts +151 -0
  118. package/src/lockers/fetch/protocols/curve.ts +229 -0
  119. package/src/lockers/fetch/protocols/frax-fpis.ts +139 -0
  120. package/src/lockers/fetch/protocols/frax-fxs.ts +193 -0
  121. package/src/lockers/fetch/protocols/fxn.ts +152 -0
  122. package/src/lockers/fetch/protocols/maverick.ts +193 -0
  123. package/src/lockers/fetch/protocols/pancakeswap.ts +149 -0
  124. package/src/lockers/fetch/protocols/pendle.ts +165 -0
  125. package/src/lockers/fetch/protocols/spectra.ts +154 -0
  126. package/src/lockers/fetch/protocols/yearn.ts +159 -0
  127. package/src/lockers/fetch/protocols/yieldbasis.ts +152 -0
  128. package/src/lockers/fetch/protocols/yieldnest.ts +157 -0
  129. package/src/lockers/fetch/protocols/zerolend.ts +144 -0
  130. package/src/lockers/fetch/static.ts +35 -0
  131. package/src/lockers/fetch/types.ts +112 -0
  132. package/src/lockers/utils/callsForLockers/pegCalls.ts +2 -1
  133. package/src/lockers/utils/getBribesRewardsData.ts +12 -11
  134. package/src/lockers/utils/substractFees.ts +1 -2
  135. package/src/strategies/curve/fetch/getOnlyboostData.ts +11 -2
  136. package/src/strategies/curve/fetch/index.ts +2 -0
  137. package/src/strategies/v2/parse.ts +11 -5
  138. package/src/utils.ts +5 -0
  139. package/dist/esm/lockers/fetch/parseBoost.js +0 -36
  140. package/dist/esm/lockers/fetch/parseBoost.js.map +0 -1
  141. package/dist/esm/lockers/fetch/parsePeg.js +0 -18
  142. package/dist/esm/lockers/fetch/parsePeg.js.map +0 -1
  143. package/dist/esm/lockers/fetch/parseVoteBoosterData.js +0 -28
  144. package/dist/esm/lockers/fetch/parseVoteBoosterData.js.map +0 -1
  145. package/dist/esm/lockers/utils/callsForLockers/depositorCalls.js +0 -24
  146. package/dist/esm/lockers/utils/callsForLockers/depositorCalls.js.map +0 -1
  147. package/dist/esm/lockers/utils/callsForLockers/feeCalls.js +0 -97
  148. package/dist/esm/lockers/utils/callsForLockers/feeCalls.js.map +0 -1
  149. package/dist/esm/lockers/utils/callsForLockers/gaugeCalls.js +0 -9
  150. package/dist/esm/lockers/utils/callsForLockers/gaugeCalls.js.map +0 -1
  151. package/dist/esm/lockers/utils/callsForLockers/index.js +0 -34
  152. package/dist/esm/lockers/utils/callsForLockers/index.js.map +0 -1
  153. package/dist/esm/lockers/utils/callsForLockers/veBoosts.js +0 -17
  154. package/dist/esm/lockers/utils/callsForLockers/veBoosts.js.map +0 -1
  155. package/dist/esm/lockers/utils/callsForLockers/veCalls.js +0 -33
  156. package/dist/esm/lockers/utils/callsForLockers/veCalls.js.map +0 -1
  157. package/dist/esm/lockers/utils/callsForLockers/veSdtCalls.js +0 -14
  158. package/dist/esm/lockers/utils/callsForLockers/veSdtCalls.js.map +0 -1
  159. package/dist/esm/lockers/utils/getFees.js +0 -27
  160. package/dist/esm/lockers/utils/getFees.js.map +0 -1
  161. package/dist/types/lockers/fetch/parseBoost.d.ts +0 -4
  162. package/dist/types/lockers/fetch/parseBoost.d.ts.map +0 -1
  163. package/dist/types/lockers/fetch/parsePeg.d.ts +0 -3
  164. package/dist/types/lockers/fetch/parsePeg.d.ts.map +0 -1
  165. package/dist/types/lockers/fetch/parseVoteBoosterData.d.ts +0 -13
  166. package/dist/types/lockers/fetch/parseVoteBoosterData.d.ts.map +0 -1
  167. package/dist/types/lockers/utils/callsForLockers/depositorCalls.d.ts +0 -4
  168. package/dist/types/lockers/utils/callsForLockers/depositorCalls.d.ts.map +0 -1
  169. package/dist/types/lockers/utils/callsForLockers/feeCalls.d.ts +0 -13
  170. package/dist/types/lockers/utils/callsForLockers/feeCalls.d.ts.map +0 -1
  171. package/dist/types/lockers/utils/callsForLockers/gaugeCalls.d.ts +0 -6
  172. package/dist/types/lockers/utils/callsForLockers/gaugeCalls.d.ts.map +0 -1
  173. package/dist/types/lockers/utils/callsForLockers/index.d.ts +0 -8
  174. package/dist/types/lockers/utils/callsForLockers/index.d.ts.map +0 -1
  175. package/dist/types/lockers/utils/callsForLockers/veBoosts.d.ts +0 -7
  176. package/dist/types/lockers/utils/callsForLockers/veBoosts.d.ts.map +0 -1
  177. package/dist/types/lockers/utils/callsForLockers/veCalls.d.ts +0 -4
  178. package/dist/types/lockers/utils/callsForLockers/veCalls.d.ts.map +0 -1
  179. package/dist/types/lockers/utils/callsForLockers/veSdtCalls.d.ts +0 -11
  180. package/dist/types/lockers/utils/callsForLockers/veSdtCalls.d.ts.map +0 -1
  181. package/dist/types/lockers/utils/getFees.d.ts +0 -4
  182. package/dist/types/lockers/utils/getFees.d.ts.map +0 -1
  183. package/src/lockers/fetch/parseBoost.ts +0 -46
  184. package/src/lockers/fetch/parsePeg.ts +0 -22
  185. package/src/lockers/fetch/parseVoteBoosterData.ts +0 -34
  186. package/src/lockers/utils/callsForLockers/depositorCalls.ts +0 -30
  187. package/src/lockers/utils/callsForLockers/feeCalls.ts +0 -124
  188. package/src/lockers/utils/callsForLockers/gaugeCalls.ts +0 -10
  189. package/src/lockers/utils/callsForLockers/index.ts +0 -51
  190. package/src/lockers/utils/callsForLockers/veBoosts.ts +0 -28
  191. package/src/lockers/utils/callsForLockers/veCalls.ts +0 -44
  192. package/src/lockers/utils/callsForLockers/veSdtCalls.ts +0 -15
  193. package/src/lockers/utils/getFees.ts +0 -31
@@ -1,4 +1,4 @@
1
- const lockersMulticallAbi = (chainId = 1) => [
1
+ const lockersMulticallAbi = (lockerId = '', chainId = 1) => [
2
2
  {
3
3
  inputs: [{ internalType: 'address', name: 'account', type: 'address' }],
4
4
  name: 'balanceOf',
@@ -6,6 +6,13 @@ const lockersMulticallAbi = (chainId = 1) => [
6
6
  stateMutability: 'view',
7
7
  type: 'function',
8
8
  },
9
+ {
10
+ inputs: [{ internalType: 'address', name: 'account', type: 'address' }],
11
+ name: 'getVotes',
12
+ outputs: [{ internalType: 'uint256', name: '', type: 'uint256' }],
13
+ stateMutability: 'view',
14
+ type: 'function',
15
+ },
9
16
  {
10
17
  inputs: [],
11
18
  name: 'totalSupply',
@@ -13,6 +20,13 @@ const lockersMulticallAbi = (chainId = 1) => [
13
20
  stateMutability: 'view',
14
21
  type: 'function',
15
22
  },
23
+ {
24
+ inputs: [],
25
+ name: 'totalVotes',
26
+ outputs: [{ internalType: 'uint256', name: '', type: 'uint256' }],
27
+ stateMutability: 'view',
28
+ type: 'function',
29
+ },
16
30
  {
17
31
  name: 'locked',
18
32
  outputs: [
@@ -37,6 +51,20 @@ const lockersMulticallAbi = (chainId = 1) => [
37
51
  stateMutability: 'view',
38
52
  type: 'function',
39
53
  },
54
+ {
55
+ stateMutability: 'view',
56
+ type: 'function',
57
+ name: 'reward_data',
58
+ inputs: [{ name: 'arg0', type: 'address' }],
59
+ outputs: [
60
+ { name: 'token', type: 'address' },
61
+ { name: 'distributor', type: 'address' },
62
+ { name: 'period_finish', type: 'uint256' },
63
+ { name: 'rate', type: 'uint256' },
64
+ { name: 'last_update', type: 'uint256' },
65
+ { name: 'integral', type: 'uint256' },
66
+ ],
67
+ },
40
68
  {
41
69
  name: 'getLockedNftDetails',
42
70
  outputs: [
@@ -335,7 +363,7 @@ const lockersMulticallAbi = (chainId = 1) => [
335
363
  stateMutability: 'view',
336
364
  type: 'function',
337
365
  },
338
- [8453, 59144].includes(chainId)
366
+ ['crv'].includes(lockerId) || [8453, 59144].includes(chainId)
339
367
  ? {
340
368
  inputs: [],
341
369
  name: 'getFeeSplit',
package/src/index.ts CHANGED
@@ -18,9 +18,10 @@ export { fetchSdt } from './sdt/fetch.js'
18
18
  /// --- LOCKERS
19
19
  ////////////////////////////////////////////////////////////////
20
20
  export { fetchLockers } from './lockers/fetch/index.js'
21
+ export { staticLockers } from './lockers/fetch/static.js'
21
22
  export { getVeNFTUser } from './lockers/utils/getVeNFTUser.js'
22
23
  export { default as pegCalls } from './lockers/utils/callsForLockers/pegCalls.js'
23
- export { parsePeg } from './lockers/fetch/parsePeg.js'
24
+ export { lockerWithAutovoter } from './lockers/utils/getBribesRewardsData.js'
24
25
 
25
26
  ////////////////////////////////////////////////////////////////
26
27
  /// --- STATEGIES
@@ -1,339 +1,75 @@
1
- import { type Locker, ONE_YEAR, RPC, Zero, contract, lockers } from '@stake-dao/constants'
2
- import { formatUnits, parseAbi, zeroAddress } from 'viem'
3
- import { mainnet } from 'viem/chains'
4
- import lockersMulticallAbi from '../../abis/lockersMulticall.js'
5
- import { getSdtInflationData } from '../../index.js'
1
+ import { RPC, contract } from '@stake-dao/constants'
2
+ import { formatUnits } from 'viem'
3
+ import { base, bsc, fraxtal, linea, mainnet } from 'viem/chains'
4
+ import { GH_STAKE_DAO_BOUNTIES_REPORT } from '../../endpoints.js'
5
+ import { getSdtInflationData, rpcCall } from '../../index.js'
6
6
  import type { Price } from '../../prices.js'
7
- import { handlePromise } from '../../strategies/utils/promise.js'
8
- import { type Call, type MultiChainCall, equalTlc, multicall, multichainMulticall, rpcCall } from '../../utils.js'
9
- import { extractFees, feeCalls } from '../utils/callsForLockers/feeCalls.js'
10
- import callsForLockers from '../utils/callsForLockers/index.js'
11
- import getBribesRewardsData, { type TBribesRewards } from '../utils/getBribesRewardsData.js'
12
- import getFees from '../utils/getFees.js'
13
- import getHttpCalls from '../utils/getHttpCalls.js'
14
- import { lockedAmountCallSideChain } from '../utils/index.js'
15
- import substractFees from '../utils/substractFees.js'
16
- import { parseBoost, parseVeBoostApr } from './parseBoost.js'
17
- import { parsePeg } from './parsePeg.js'
18
- import { parseVoteBoosterData } from './parseVoteBoosterData.js'
19
-
20
- const callsForRewards = (gauge: string, rewards: any[]) =>
21
- rewards.map((r) => ({ address: gauge, name: 'reward_data', params: [r.address] }))
22
-
23
- const callsForLockersSideChains = (lockerId: any, sideChains: any[]) => {
24
- return sideChains.reduce((acc, value) => {
25
- return acc.concat([
26
- lockedAmountCallSideChain(lockerId, value.veToken, value.locker, value.chainId),
27
- { address: value.veToken, name: 'balanceOf', params: [value.locker], chainId: value.chainId },
28
- { address: value.veToken, name: 'totalSupply', chainId: value.chainId },
29
- ])
30
- }, [])
31
- }
7
+ import angleLocker from './protocols/angle.js'
8
+ import balancerLocker from './protocols/balancer.js'
9
+ import blackpoolLocker from './protocols/blackpool.js'
10
+ import curveLocker from './protocols/curve.js'
11
+ import fraxFpisLocker from './protocols/frax-fpis.js'
12
+ import fraxFxsLocker from './protocols/frax-fxs.js'
13
+ import fxnLocker from './protocols/fxn.js'
14
+ import maverickLocker from './protocols/maverick.js'
15
+ import pancakeswapLocker from './protocols/pancakeswap.js'
16
+ import pendleLocker from './protocols/pendle.js'
17
+ import spectraLocker from './protocols/spectra.js'
18
+ import yearnLocker from './protocols/yearn.js'
19
+ import yieldbasisLocker from './protocols/yieldbasis.js'
20
+ import yieldnestLocker from './protocols/yieldnest.js'
21
+ import zerolendLocker from './protocols/zerolend.js'
32
22
 
33
23
  interface TFetchLockers {
34
- provider: any
35
- chainId: number
24
+ provider: { [chainId: number]: any }
36
25
  prices: Price[]
37
26
  }
38
27
 
39
- export const fetchLockers = async ({ provider, chainId, prices }: TFetchLockers) => {
40
- const chainLockers: Locker[] = lockers.filter((l) => l.chainId === chainId)
41
-
42
- const httpCalls = await getHttpCalls(chainId)
43
-
44
- const lockersCalls: Call[] = []
45
- const lockersRewardsCalls: Call[] = []
46
- const lockersFeeCalls: Call[] = []
47
- const lockersSideChainsCalls: MultiChainCall[] = []
48
-
49
- for (const locker of chainLockers) {
50
- lockersCalls.push(
51
- ...callsForLockers(
52
- locker.id,
53
- locker.token.address,
54
- locker.sdToken.address,
55
- locker.modules.veToken,
56
- locker.modules.depositor,
57
- locker.modules.gauge,
58
- locker.modules.locker,
59
- locker.secondaryMarket,
60
- locker.voteBooster,
61
- locker.veBoost,
62
- locker.modules.veNFT,
63
- ),
64
- )
65
- lockersRewardsCalls.push(...callsForRewards(locker.modules.gauge, locker.rewards))
66
- if (locker.extensions.sideChains) {
67
- lockersSideChainsCalls.push(...callsForLockersSideChains(locker.id, locker.extensions.sideChains))
68
- }
69
-
70
- // Add fee calls into another array
71
- // We will concat it with #lockersRewardsCalls to do only one multicall, the concat will push all fee calls at the end
72
- lockersFeeCalls.push(...feeCalls(locker.id, locker.modules.accumulator))
73
- }
74
-
75
- const [rawLockersData, rawLockersSideChainData, rawLockersRewardsData, rawVeSdtTotalSupply] = await handlePromise(
76
- [
77
- multicall(provider, lockersCalls.concat(lockersFeeCalls), lockersMulticallAbi(chainId)),
78
- multichainMulticall(lockersSideChainsCalls, lockersMulticallAbi()),
79
- multicall(
80
- provider,
81
- lockersRewardsCalls,
82
- parseAbi([
83
- 'function reward_data(address) external view returns (address,address,uint256,uint256,uint256,uint256)',
84
- ]),
85
- ),
86
- rpcCall(RPC[mainnet.id], [{ to: contract('veSdt', mainnet.id), data: '0x18160ddd' }]),
87
- ],
88
- 'lockerMulticalls',
89
- )
90
-
91
- const lockersFees = extractFees(chainLockers, rawLockersData)
92
-
93
- const sdtInflationData = chainId === mainnet.id ? await getSdtInflationData(provider) : undefined
94
- const veSdtTotalSupply = BigInt(rawVeSdtTotalSupply[0].result)
95
-
96
- const lockerData = chainLockers.map(async (locker) => {
97
- const lockerCallsLength = callsForLockers(
98
- locker.id,
99
- locker.token.address,
100
- locker.sdToken.address,
101
- locker.modules.veToken,
102
- locker.modules.depositor,
103
- locker.modules.gauge,
104
- locker.modules.locker,
105
- locker.secondaryMarket,
106
- locker.voteBooster,
107
- locker.veBoost,
108
- locker.modules.veNFT,
109
- ).length
110
- const chunkedRawLockersData = rawLockersData.splice(0, lockerCallsLength)
111
-
112
- const lockerFee = lockersFees.find((l) => l.lockerId === locker.id)
113
- const fees = getFees(locker, lockerFee)
114
-
115
- const tokenLocked = formatUnits(
116
- chunkedRawLockersData[0].result[1]?.[0]
117
- ? chunkedRawLockersData[0].result[1][0].amount
118
- : chunkedRawLockersData[0].result[0]
119
- ? chunkedRawLockersData[0].result[0]
120
- : chunkedRawLockersData[0].result,
121
- locker.token.decimals,
122
- )
123
- const veBalanceOfLocker =
124
- locker.id === 'spectra' || locker.id === 'ynd'
125
- ? tokenLocked // Spectra has permanent lock mecanism, which means veBalance = token locked
126
- : formatUnits(chunkedRawLockersData[1].result, locker.token.decimals)
127
- const totalTokenLocked = formatUnits(chunkedRawLockersData[2].result, locker.token.decimals)
128
- const veTotalSupply = formatUnits(chunkedRawLockersData[3].result, locker.token.decimals)
129
- const lockIncentive = formatUnits(chunkedRawLockersData[4].result ? chunkedRawLockersData[4].result : Zero, 0)
130
- const incentiveAmountInToken = formatUnits(
131
- chunkedRawLockersData[5].result ? chunkedRawLockersData[5].result : Zero,
132
- locker.token.decimals,
133
- )
134
-
135
- const totalSupplyStaked =
136
- locker.modules.gauge !== zeroAddress ? formatUnits(chunkedRawLockersData[6].result, locker.token.decimals) : '0'
137
- const gaugeWorkingSupply =
138
- locker.chainId === mainnet.id && locker.modules.gauge !== zeroAddress
139
- ? formatUnits(chunkedRawLockersData[7].result, locker.token.decimals)
140
- : '0'
141
- const amountTokenNotLock = formatUnits(chunkedRawLockersData[8].result, locker.token.decimals)
142
- const sdTokenInPool = formatUnits(chunkedRawLockersData[9].result, locker.token.decimals)
143
- const voteBooster = parseVoteBoosterData(locker, chunkedRawLockersData)
144
- const peg = parsePeg(locker, chunkedRawLockersData)
145
-
146
- const veTokenRate =
147
- locker.id === 'mav' ? formatUnits(chunkedRawLockersData[12].result[0], locker.token.decimals) : '4'
148
-
149
- const sideChains = locker.extensions.sideChains?.map((sideChain) => {
150
- const rewards =
151
- sideChain.rewards?.map((reward) => {
152
- const price = prices.find((p) => equalTlc(p.address, reward.address))?.usdPrice || 0
153
- return {
154
- token: reward,
155
- price,
156
- }
157
- }) || []
158
-
159
- const tokenLocked = rawLockersSideChainData[sideChain.chainId].shift().result
160
- return {
161
- ...sideChain,
162
- tokenLocked: formatUnits(
163
- ['mav', 'fxs'].includes(locker.id) ? tokenLocked[0] : tokenLocked,
164
- locker.token.decimals,
165
- ),
166
- veBalanceOfLocker: formatUnits(
167
- rawLockersSideChainData[sideChain.chainId].shift().result,
168
- locker.token.decimals,
169
- ),
170
- veTotalSupply: formatUnits(rawLockersSideChainData[sideChain.chainId].shift().result, locker.token.decimals),
171
- rewards,
172
- }
173
- })
174
-
175
- const tokenPrice = prices.find((p) => p.address === locker.token.address)
176
- const tokenPriceInUsd = tokenPrice ? tokenPrice.usdPrice : 0
177
- const sdTokenPriceInUsd = peg !== '-' ? tokenPriceInUsd * Number(peg) : tokenPriceInUsd
178
-
179
- const tvl = totalSupplyStaked ? Number(totalSupplyStaked) * sdTokenPriceInUsd : 0
180
-
181
- const veBoostTotalSupply = parseBoost(locker, chunkedRawLockersData)
182
- const veBoostApr = locker.veBoost
183
- ? parseVeBoostApr(locker.id, tokenPriceInUsd, Number(veBoostTotalSupply), chunkedRawLockersData)
184
- : 0
185
-
186
- // Rewards APR
187
- const rewardsData = locker.rewards.map((r) => {
188
- const rawData = rawLockersRewardsData.shift().result
189
- const rewardPrice = equalTlc(r.address, locker.sdToken.address)
190
- ? sdTokenPriceInUsd
191
- : prices.find((p) => p.address === r.address)?.usdPrice || 0
192
-
193
- const periodFinish = Number(formatUnits(rawData ? rawData[2] : Zero, 0))
194
- let streaming = r.distribution === 'streamed' && periodFinish > Math.floor(Date.now() / 1000)
195
-
196
- const rate = rawData ? rawData[3] : Zero
197
- const oneYearRate = rate * BigInt(ONE_YEAR)
198
-
199
- let apr = streaming
200
- ? rewardPrice && tvl > 0
201
- ? ((Number(formatUnits(oneYearRate, r.decimals)) * rewardPrice) / tvl) * 100
202
- : 0
203
- : 0
204
-
205
- if (r.distribution === 'merkl') {
206
- if (locker.id === 'ynd') {
207
- apr = httpCalls.yieldnestMerkl?.apr || 0
208
- streaming = apr > 0
209
- }
210
- }
211
-
212
- // Remove fees from APR
213
- apr = substractFees(locker.id, apr, lockerFee)
214
-
215
- return {
216
- token: r,
217
- price: rewardPrice,
218
- apr,
219
- streaming,
220
- periodFinish,
221
- rate: formatUnits(rate, 0),
222
- lastUpdate: rawData ? formatUnits(rawData[4], 0) : '0',
223
- isAirdrop: r.isAirdrop,
224
- }
225
- })
226
-
227
- let _workingSupply = chainId === mainnet.id ? gaugeWorkingSupply : totalSupplyStaked
228
- let _veSdtTotalSupply = veSdtTotalSupply
229
- let _veBalanceOfLocker = veBalanceOfLocker
230
-
231
- if (locker.id === 'fxs') {
232
- _workingSupply = httpCalls.sdfxsWorkingData.working_supply.toString()
233
- _veSdtTotalSupply = BigInt(httpCalls.sdfxsWorkingData.veSDT_total_supply)
234
- _veBalanceOfLocker = (httpCalls.sdfxsWorkingData.veBalance * 4).toString()
235
- } else if (locker.id === 'cake') {
236
- _workingSupply = httpCalls.sdcakeData.working_supply.toString()
237
- _veBalanceOfLocker = httpCalls.sdcakeData.total_user_votes.toString()
238
- } else if (locker.id === 'spectra') {
239
- _workingSupply = httpCalls.sdspectraData.working_supply.toString()
240
- }
241
-
242
- const data = getBribesRewardsData(
243
- locker,
244
- httpCalls.bribesData,
245
- _veSdtTotalSupply,
246
- totalSupplyStaked,
247
- _veBalanceOfLocker,
248
- _workingSupply,
249
- sdTokenInPool,
250
- tokenLocked,
251
- )
252
-
253
- const bribeMinApr: number = data.bribeMinApr
254
- const bribeMaxApr: number = data.bribeMaxApr
255
- const bribeRewards: TBribesRewards | undefined = data.bribeRewards
256
-
257
- // Total APR
258
- const minRewardsAprs = rewardsData.reduce((x, y) => x + y.apr, 0) + bribeMinApr
259
- const maxRewardsAprs = rewardsData.reduce((x, y) => x + y.apr, 0) + bribeMaxApr
260
-
261
- // Streaming status
262
- const streaming = rewardsData.some((r) => r.streaming)
263
- const alternativeYields = JSON.parse(JSON.stringify(locker.alternativeYields || {})) // parse and stringify to avoid extensible issue
264
- if (httpCalls.cvgAprs?.[locker.modules.gauge]) {
265
- alternativeYields.convergenceSdToken = {
266
- label: locker.sdToken.symbol,
267
- platform: 'Convergence',
268
- href: 'https://app.cvg.finance/',
269
- apr: httpCalls.cvgAprs[locker.modules.gauge].totalApr,
270
- }
271
- }
272
-
273
- if (locker.id === 'crv') {
274
- alternativeYields.aSdCrvSpectra = {
275
- label: 'asdCRV',
276
- platform: 'Spectra',
277
- href: 'https://app.spectra.finance/pools#mainnet/0xc63dff67fe1b63004ab6c773022ba06847c11335',
278
- apr: Math.max(
279
- ...(httpCalls.spectraAprs
280
- ?.find((r) => r.underlying.address.toLowerCase() === locker.sdToken.address.toLowerCase())
281
- ?.pools.map((p) => p.lpApy?.boostedTotal || 0) || [0]),
282
- ),
283
- }
284
- }
285
-
286
- if (locker.extensions.strategyGauge && httpCalls.cvgAprs?.[locker.extensions.strategyGauge]) {
287
- alternativeYields[`convergence${locker.sdToken.symbol}Pool`] = {
288
- label: `${locker.sdToken.symbol}/${locker.token.symbol}`,
289
- platform: 'Convergence',
290
- href: 'https://app.cvg.finance/',
291
- apr: locker.extensions.strategyGauge ? httpCalls.cvgAprs[locker.extensions.strategyGauge].totalApr : 0,
292
- }
293
- }
294
-
295
- return {
296
- ...locker,
297
- rewards: rewardsData,
298
- fees,
299
- tokenLocked: tokenLocked,
300
- veBalanceOfLocker: veBalanceOfLocker,
301
- totalTokenLocked: totalTokenLocked,
302
- veTotalSupply: veTotalSupply,
303
- lockIncentive: lockIncentive,
304
- incentiveAmountInToken: incentiveAmountInToken,
305
- gaugeWorkingSupply: gaugeWorkingSupply,
306
- totalSupplyStaked: totalSupplyStaked,
307
- amountTokenNotLock: amountTokenNotLock,
308
- bribeRewards,
309
- apr: [minRewardsAprs, maxRewardsAprs],
310
- streaming,
311
- veTokenRate,
312
- tvl,
313
- peg,
314
- tokenPriceInUsd,
315
- sdTokenPriceInUsd,
316
- voteBooster,
317
- alternativeYields,
318
- extensions: {
319
- ...locker.extensions,
320
- sideChains,
321
- },
322
- veBoostTotalSupply,
323
- veBoostApr,
324
- }
325
- })
28
+ export const fetchLockers = async ({ provider, prices }: TFetchLockers) => {
29
+ const [sdtInflationData, bribesData, veSdtTotalSupply, cvgAprs, spectraAprs] = await Promise.all([
30
+ // SDT Inflation Data
31
+ getSdtInflationData(provider[mainnet.id]),
32
+ // Bounties APR
33
+ fetch(`${GH_STAKE_DAO_BOUNTIES_REPORT}/main/delegationsAPRs.json`).then((res) => res.json()),
34
+ // veSDT total supply
35
+ rpcCall(RPC[mainnet.id], [{ to: contract('veSdt', mainnet.id), data: '0x18160ddd' }]).then((res) =>
36
+ BigInt(res[0].result),
37
+ ),
38
+ // Alternatives Yields
39
+ fetch('https://api.cvg.finance//stake-dao/aprs').then((res) => res.json()),
40
+ fetch('https://app.spectra.finance/api/v1/mainnet/pools').then((res) => res.json()),
41
+ ])
42
+
43
+ const common = { bribesData, veSdtTotalSupply, cvgAprs, spectraAprs }
44
+
45
+ // Order is set here
46
+ const parsed = await Promise.all([
47
+ curveLocker({ provider: provider[mainnet.id], common, prices }),
48
+ yieldbasisLocker({ provider: provider[mainnet.id], common, prices }),
49
+ pendleLocker({ provider: provider[mainnet.id], common, prices }),
50
+ fxnLocker({ provider: provider[mainnet.id], common, prices }),
51
+ yearnLocker({ provider: provider[mainnet.id], common, prices }),
52
+ yieldnestLocker({ provider: provider[mainnet.id], common, prices }),
53
+ balancerLocker({ provider: provider[mainnet.id], common, prices }),
54
+ spectraLocker({ provider: provider[base.id], common, prices }),
55
+ fraxFxsLocker({ provider: provider[fraxtal.id], common, prices }),
56
+ zerolendLocker({ provider: provider[linea.id], common, prices }),
57
+ maverickLocker({ provider: provider[mainnet.id], common, prices }),
58
+ blackpoolLocker({ provider: provider[mainnet.id], common, prices }),
59
+ fraxFpisLocker({ provider: provider[mainnet.id], common, prices }),
60
+ angleLocker({ provider: provider[mainnet.id], common, prices }),
61
+ pancakeswapLocker({ provider: provider[bsc.id], common, prices }),
62
+ ])
326
63
 
327
64
  return {
328
- parsed: await Promise.all(lockerData),
329
- sdt:
330
- chainId === mainnet.id && sdtInflationData
331
- ? {
332
- lockersSdtPerBlock: formatUnits(sdtInflationData.lockersSdtPerBlock, 18),
333
- lockersSdtPerSecond: formatUnits(sdtInflationData.lockersSdtPerSecond, 18),
334
- stratsSdtPerBlock: formatUnits(sdtInflationData.stratsSdtPerBlock, 18),
335
- stratsSdtPerSecond: formatUnits(sdtInflationData.stratsSdtPerSecond, 18),
336
- }
337
- : undefined,
65
+ parsed,
66
+ sdt: sdtInflationData
67
+ ? {
68
+ lockersSdtPerBlock: formatUnits(sdtInflationData.lockersSdtPerBlock, 18),
69
+ lockersSdtPerSecond: formatUnits(sdtInflationData.lockersSdtPerSecond, 18),
70
+ stratsSdtPerBlock: formatUnits(sdtInflationData.stratsSdtPerBlock, 18),
71
+ stratsSdtPerSecond: formatUnits(sdtInflationData.stratsSdtPerSecond, 18),
72
+ }
73
+ : undefined,
338
74
  }
339
75
  }