@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
@@ -0,0 +1,157 @@
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: 'ynd',
10
+ symbol: 'YND',
11
+ protocol: 'YieldNest',
12
+ protocolDescription:
13
+ 'YieldNest is a next-generation DeFi protocol that offers simple, high-yielding, risk-adjusted restaking and DeFi strategies',
14
+ website: 'https://www.yieldnest.finance/',
15
+ logoUrl: `${STAKE_DAO_ASSETS_BASE_URL}/assets/1/0x7159cc276d7d17ab4b3beb19959e1f39368a45ba.svg`,
16
+ chainId: 1,
17
+ rgb: '181, 154, 107',
18
+ token: tokenWithId('ynd')!,
19
+ sdToken: tokenWithId('sdynd')!,
20
+ rewards: [
21
+ { ...tokenWithId('sdt')!, distribution: 'streamed', origin: 'native.common' },
22
+ { ...tokenWithId('ynd')!, distribution: 'merkl', origin: 'native.common' },
23
+ ],
24
+ delegation: ['sdynd.eth'],
25
+ modules: {
26
+ depositor: '0x8f0e636A19c1677fDF37DA0E3aF602f96DA3352E',
27
+ locker: '0x8396A782cc966661cd818a4DaC19C3E0aA893012',
28
+ veToken: '0x23d2923e15f5cce8a131CB37F0c7BCC5caD15639',
29
+ gauge: '0x26aB50DC99F14405155013ea580Ea2b3dB1801c7',
30
+ accumulator: '0x0000000000000000000000000000000000000000',
31
+ escrow: '0xD666B56EE7786Cc918fDdcEade542d013de0E4F1',
32
+ },
33
+ secondaryMarket: {
34
+ label: 'Curve',
35
+ poolKey: 'factory-stable-ng-464',
36
+ vaultKey: '1-0x147367Ed8966a46769f331a1210C952BabE87b09',
37
+ pool: '0xE5c78cbcf6241f1793caF496f6480B45Fa5BDb46',
38
+ pools: ['0xE5c78cbcf6241f1793caF496f6480B45Fa5BDb46'],
39
+ pegBase: 500000,
40
+ },
41
+ alternativeYields: {
42
+ sdSpectraSpectraStakeDao: {
43
+ label: 'sdYND/YND',
44
+ platform: 'Stake DAO',
45
+ href: '/yield?search=0x147367Ed8966a46769f331a1210C952BabE87b09',
46
+ },
47
+ },
48
+ autoCompounder: {
49
+ aSdToken: '0x3610A0f4a36513d27128e110dB999D6e1e6105D5',
50
+ },
51
+ fees: [
52
+ { label: { key: 'liquidity', variable: 'sdYND/YND' }, value: 10, key: 'liquidityFee' },
53
+ { label: { key: 'treasury' }, value: 5, key: 'daoFee' },
54
+ { label: { key: 'harvesterOn', variable: 'YND' }, value: 0.1, token: 'ynd', key: 'claimerFee' },
55
+ ],
56
+ extensions: {
57
+ coingeckoBaseSlug: 'yieldnest',
58
+ },
59
+ }
60
+
61
+ const yieldnestLocker = async ({ provider, common, prices }: { provider; common; prices }) => {
62
+ const token = locker.token.address
63
+ const sdToken = locker.sdToken.address
64
+
65
+ const gauge = locker.modules.gauge
66
+ const depositor = locker.modules.depositor
67
+ const escrow = locker.modules.escrow!
68
+
69
+ const secondaryMarket = locker.secondaryMarket!
70
+ const rewards = locker.rewards!
71
+
72
+ const pegBase = parseUnits(secondaryMarket?.pegBase?.toString() || '1', 18)
73
+
74
+ const format = (value: bigint) => formatUnits(value, locker.token.decimals)
75
+ const formatRes = (value: any) => format(getRes(value))
76
+
77
+ const calls: Call[] = [
78
+ /*********************************************************************************
79
+ *** Voting Escrow
80
+ *********************************************************************************/
81
+
82
+ // Token locked by the Locker
83
+ { address: depositor, name: 'getLockedBalance' },
84
+ // Total token locked
85
+ { address: token, name: 'balanceOf', params: [escrow] },
86
+ // Total veToken supply
87
+ { address: escrow, name: 'totalLocked' },
88
+
89
+ /*********************************************************************************
90
+ *** Gauge
91
+ *********************************************************************************/
92
+
93
+ // Total sdToken staked
94
+ { address: gauge, name: 'totalSupply' },
95
+ // Gauge working supply
96
+ { address: gauge, name: 'working_supply' },
97
+
98
+ /*********************************************************************************
99
+ *** Token & sdToken
100
+ *********************************************************************************/
101
+
102
+ // Token balance not locked
103
+ { address: token, name: 'balanceOf', params: [depositor] },
104
+ // sdToken in secondary market pool
105
+ { address: sdToken, name: 'balanceOf', params: [secondaryMarket.pool] },
106
+
107
+ /*********************************************************************************
108
+ *** Peg
109
+ *********************************************************************************/
110
+
111
+ // Return amount when swapping {pegBase} sdToken to token -> get_dy(int128,int128,uint256)
112
+ { address: secondaryMarket.pool, name: '0x5e0d443f', params: [One, Zero, pegBase] },
113
+
114
+ /*********************************************************************************
115
+ *** Rewards
116
+ *********************************************************************************/
117
+
118
+ // Streaming status for each reward token
119
+ ...rewards.map((r) => ({ address: gauge, name: 'reward_data', params: [r.address] })),
120
+ ]
121
+
122
+ const [res, yieldnestMerkl] = await Promise.all([
123
+ multicall(provider, calls, lockersMulticallAbi(locker.id, locker.chainId)),
124
+ fetch('https://api.merkl.xyz/v4/opportunities/12447605725077990381').then((res) => res.json()),
125
+ ])
126
+
127
+ const raw = {
128
+ tokenLocked: formatRes(res.shift()),
129
+ veBalanceOfLocker: '0',
130
+ totalTokenLocked: formatRes(res.shift()),
131
+ veTotalSupply: formatRes(res.shift()),
132
+ totalSupplyStaked: formatRes(res.shift()),
133
+ gaugeWorkingSupply: formatRes(res.shift()),
134
+ amountTokenNotLock: formatRes(res.shift()),
135
+ sdTokenInPool: formatRes(res.shift()),
136
+ peg: getRes(res.shift()),
137
+ rewards: rewards.map(() => getRes(res.shift())),
138
+ veTokenRate: '4',
139
+ _workingSupply: '0',
140
+ _veBalanceOfLocker: '0',
141
+ replaceApr: [] as any[],
142
+ }
143
+
144
+ raw.veBalanceOfLocker = raw.tokenLocked
145
+ raw.peg = parsePeg(locker, raw.peg)
146
+ raw._workingSupply = raw.gaugeWorkingSupply
147
+ raw._veBalanceOfLocker = raw.veBalanceOfLocker
148
+
149
+ raw.replaceApr = rewards.map((r) => {
150
+ if (r.distribution === 'merkl') return yieldnestMerkl?.apr || 0
151
+ return undefined
152
+ })
153
+
154
+ return parse({ locker, common, prices, raw })
155
+ }
156
+
157
+ export default yieldnestLocker
@@ -0,0 +1,144 @@
1
+ import { STAKE_DAO_ASSETS_BASE_URL, tokenWithId } from '@stake-dao/constants'
2
+ import { formatUnits } 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: 'zero',
10
+ symbol: 'ZERO',
11
+ protocol: 'ZeroLend',
12
+ protocolDescription: 'ZeroLend is the most efficient and dominant lending market on Linea, zkSync, Blast and Manta.',
13
+ website: 'https://zerolend.xyz/',
14
+ logoUrl: `${STAKE_DAO_ASSETS_BASE_URL}/assets/archive/zero.svg`,
15
+ chainId: 59144,
16
+ rgb: '0, 0, 0',
17
+ token: tokenWithId('zero', 59144)!,
18
+ sdToken: tokenWithId('sdzero', 59144)!,
19
+ rewards: [{ ...tokenWithId('zero', 59144)!, distribution: 'streamed', origin: 'native.zerolend' }],
20
+ delegation: ['sdzero.eth'],
21
+ modules: {
22
+ depositor: '0xC5CCc20f6A4CD65fda979A2E292DBCF2C450C067',
23
+ locker: '0xC0295F271c4fD531d436F55b0ceF4Cc316188046',
24
+ veToken: '0xf374229a18ff691406f99CCBD93e8a3f16B68888',
25
+ gauge: '0xC6973841dC130597dF3Cb8bE2F57440d856FD7C4',
26
+ accumulator: '0xb30807324354379233FC6F7716C0510BbBD88487',
27
+ veNFT: '0x08D5FEA625B1dBf9Bae0b97437303a0374ee02F8',
28
+ },
29
+ secondaryMarket: {
30
+ label: '',
31
+ poolKey: '',
32
+ vaultKey: '',
33
+ pool: '0x0000000000000000000000000000000000000000',
34
+ pools: ['0x0000000000000000000000000000000000000000'],
35
+ pegBase: 10000000,
36
+ },
37
+ fees: [
38
+ {
39
+ label: { key: 'liquidity', variable: 'sdZERO/ZERO' },
40
+ value: 10,
41
+ key: 'liquidityFee',
42
+ },
43
+ {
44
+ label: { key: 'treasury' },
45
+ value: 5,
46
+ key: 'daoFee',
47
+ },
48
+ ],
49
+ extensions: {
50
+ coingeckoBaseSlug: 'zerolend',
51
+ },
52
+ }
53
+
54
+ const zerolendLocker = async ({ provider, common, prices }: { provider; common; prices }) => {
55
+ const token = locker.token.address
56
+ const sdToken = locker.sdToken.address
57
+
58
+ const gauge = locker.modules.gauge
59
+ const depositor = locker.modules.depositor
60
+ const votingEscrow = locker.modules.veToken
61
+ const lockerAddress = locker.modules.locker
62
+ const veNFT = locker.modules.veNFT
63
+
64
+ const secondaryMarket = locker.secondaryMarket!
65
+ const rewards = locker.rewards
66
+
67
+ // const pegBase = parseUnits(secondaryMarket?.pegBase?.toString() || '1', 18)
68
+
69
+ const format = (value: bigint) => formatUnits(value, locker.token.decimals)
70
+ const formatRes = (value: any) => format(getRes(value))
71
+
72
+ const calls: Call[] = [
73
+ /*********************************************************************************
74
+ *** Voting Escrow
75
+ *********************************************************************************/
76
+
77
+ // Token locked by the Locker
78
+ { address: votingEscrow, name: 'getLockedNftDetails', params: [lockerAddress] },
79
+ // veToken Balance of the Locker
80
+ { address: votingEscrow, name: 'balanceOf', params: [lockerAddress] },
81
+ // Total token locked
82
+ { address: token, name: 'balanceOf', params: [veNFT] },
83
+ // Total veToken supply
84
+ { address: votingEscrow, name: 'totalSupply' },
85
+
86
+ /*********************************************************************************
87
+ *** Gauge
88
+ *********************************************************************************/
89
+
90
+ // Total sdToken staked
91
+ { address: gauge, name: 'totalSupply' },
92
+
93
+ /*********************************************************************************
94
+ *** Token & sdToken
95
+ *********************************************************************************/
96
+
97
+ // Token balance not locked
98
+ { address: token, name: 'balanceOf', params: [depositor] },
99
+ // sdToken in secondary market pool
100
+ { address: sdToken, name: 'balanceOf', params: [secondaryMarket.pool] },
101
+
102
+ /*********************************************************************************
103
+ *** Peg
104
+ *********************************************************************************/
105
+
106
+ // Return amount when swapping {pegBase} sdToken to token -> get_dy(int128,int128,uint256)
107
+ // { address: secondaryMarket.pool, name: '0x5e0d443f', params: [One, Zero, pegBase] },
108
+
109
+ /*********************************************************************************
110
+ *** Rewards
111
+ *********************************************************************************/
112
+
113
+ // Streaming status for each reward token
114
+ ...rewards.map((r) => ({ address: gauge, name: 'reward_data', params: [r.address] })),
115
+ ]
116
+
117
+ const res = await multicall(provider, calls, lockersMulticallAbi(locker.id, locker.chainId))
118
+ const raw = {
119
+ tokenLocked: getRes(res.shift()),
120
+ veBalanceOfLocker: formatRes(res.shift()),
121
+ totalTokenLocked: formatRes(res.shift()),
122
+ veTotalSupply: formatRes(res.shift()),
123
+ totalSupplyStaked: formatRes(res.shift()),
124
+ gaugeWorkingSupply: '0',
125
+ amountTokenNotLock: formatRes(res.shift()),
126
+ sdTokenInPool: formatRes(res.shift()),
127
+ // peg: getRes(res.shift()),
128
+ peg: '-',
129
+ rewards: rewards.map(() => getRes(res.shift())),
130
+ veTokenRate: '4',
131
+ _workingSupply: '0',
132
+ _veBalanceOfLocker: '0',
133
+ }
134
+
135
+ raw.tokenLocked = format(raw.tokenLocked[1][0].amount)
136
+ raw.gaugeWorkingSupply = raw.totalSupplyStaked
137
+ raw.peg = parsePeg(locker, raw.peg)
138
+ raw._workingSupply = raw.gaugeWorkingSupply
139
+ raw._veBalanceOfLocker = raw.veBalanceOfLocker
140
+
141
+ return parse({ locker, common, prices, raw })
142
+ }
143
+
144
+ export default zerolendLocker
@@ -0,0 +1,35 @@
1
+ import type { Locker } from './types.js'
2
+
3
+ import { locker as staticAngleLocker } from './protocols/angle.js'
4
+ import { locker as staticBalancerLocker } from './protocols/balancer.js'
5
+ import { locker as staticBlackpoolLocker } from './protocols/blackpool.js'
6
+ import { locker as staticCurveLocker } from './protocols/curve.js'
7
+ import { locker as staticFraxFpisLocker } from './protocols/frax-fpis.js'
8
+ import { locker as staticFraxFxsLocker } from './protocols/frax-fxs.js'
9
+ import { locker as staticFxnLocker } from './protocols/fxn.js'
10
+ import { locker as staticMaverickLocker } from './protocols/maverick.js'
11
+ import { locker as staticPancakeswapLocker } from './protocols/pancakeswap.js'
12
+ import { locker as staticPendleLocker } from './protocols/pendle.js'
13
+ import { locker as staticSpectraLocker } from './protocols/spectra.js'
14
+ import { locker as staticYearnLocker } from './protocols/yearn.js'
15
+ import { locker as staticYieldbasisLocker } from './protocols/yieldbasis.js'
16
+ import { locker as staticYieldnestLocker } from './protocols/yieldnest.js'
17
+ import { locker as staticZerolendLocker } from './protocols/zerolend.js'
18
+
19
+ export const staticLockers: Locker[] = [
20
+ staticAngleLocker,
21
+ staticBalancerLocker,
22
+ staticBlackpoolLocker,
23
+ staticCurveLocker,
24
+ staticFraxFpisLocker,
25
+ staticFraxFxsLocker,
26
+ staticFxnLocker,
27
+ staticMaverickLocker,
28
+ staticPancakeswapLocker,
29
+ staticPendleLocker,
30
+ staticSpectraLocker,
31
+ staticYearnLocker,
32
+ staticYieldbasisLocker,
33
+ staticYieldnestLocker,
34
+ staticZerolendLocker,
35
+ ]
@@ -0,0 +1,112 @@
1
+ import type { Address } from 'viem'
2
+
3
+ // TODO: use common Token type
4
+ type Token = {
5
+ id: string
6
+ name: string
7
+ address: string
8
+ symbol: string
9
+ decimals: number
10
+ chainId: number
11
+ logoURI: string
12
+ tags: string[]
13
+ extensions: {
14
+ underlying?: string
15
+ wrapper?: string
16
+ oftVersion?: number
17
+ coingeckoSlug?: string
18
+ }
19
+ }
20
+
21
+ export interface LockerReward extends Token {
22
+ distribution: 'streamed' | 'distributed' | 'merkl'
23
+ origin: string
24
+ noEarn?: boolean
25
+ isAirdrop?: boolean
26
+ }
27
+
28
+ type LockerModule = {
29
+ depositor: Address
30
+ locker: Address
31
+ veToken: Address
32
+ gauge: Address
33
+ accumulator: Address
34
+ escrow?: Address
35
+ redeem?: Address
36
+ veNFT?: Address
37
+ }
38
+
39
+ export type LockerSecondaryMarket = {
40
+ label: string
41
+ poolKey: string
42
+ vaultKey: string
43
+ pool: Address
44
+ pegBase: number
45
+ pools?: Address[]
46
+ router?: Address
47
+ }
48
+
49
+ type LockerAltYield = {
50
+ [key: string]: {
51
+ label: string
52
+ platform: string
53
+ href: string
54
+ }
55
+ }
56
+
57
+ type LockerFee = {
58
+ key: 'liquidityFee' | 'claimerFee' | 'daoFee' | 'voteFee' | 'lockerFee' | 'bountyFee' | 'sdtFee'
59
+ label: {
60
+ key: 'harvester' | 'harvesterOn' | 'airdrop' | 'liquidity' | 'treasury' | 'treasuryOn' | 'vesdt'
61
+ variable?: string
62
+ }
63
+ value: number
64
+ token?: string
65
+ static?: boolean
66
+ }
67
+
68
+ type LockerSideChain = {
69
+ chainId: number
70
+ locker: Address
71
+ veToken: Address
72
+ depositor: Address
73
+ sdToken: Address
74
+ token: Address
75
+ gauge?: Address
76
+ accumulator?: Address
77
+ rewards?: LockerReward[]
78
+ }
79
+
80
+ export type Locker = {
81
+ id: string
82
+ symbol: string
83
+ protocol: string
84
+ protocolDescription: string
85
+ website: string
86
+ logoUrl: string
87
+ chainId: number
88
+ rgb: string
89
+ token: Token
90
+ sdToken: Token
91
+ rewards: LockerReward[]
92
+ delegation?: string[]
93
+ modules: LockerModule
94
+ secondaryMarket?: LockerSecondaryMarket
95
+ veBoost?: {
96
+ address: Address
97
+ delegator: Address
98
+ }
99
+ voteBooster?: {
100
+ vSdToken: Address
101
+ booster: Address
102
+ }
103
+ autoCompounder?: {
104
+ aSdToken: Address
105
+ }
106
+ alternativeYields?: LockerAltYield
107
+ fees: LockerFee[]
108
+ extensions: {
109
+ coingeckoBaseSlug?: string
110
+ sideChains?: LockerSideChain[]
111
+ }
112
+ }
@@ -1,6 +1,7 @@
1
1
  import { parseUnits, zeroAddress } from 'viem'
2
2
 
3
- import { type LockerSecondaryMarket, One, Zero, contracts } from '@stake-dao/constants'
3
+ import { One, Zero, contracts } from '@stake-dao/constants'
4
+ import type { LockerSecondaryMarket } from '../../fetch/types.js'
4
5
 
5
6
  const pegCalls = (secondaryMarket: LockerSecondaryMarket | undefined, sdToken: string, token: string) => {
6
7
  const secondaryMarketLabel = secondaryMarket?.label || ''
@@ -1,9 +1,11 @@
1
+ import { One, Zero } from '@stake-dao/constants'
1
2
  import { parseUnits } from 'viem'
2
-
3
- import { One, Zero, delegationWithId, lockerWithAutovoter } from '@stake-dao/constants'
4
-
5
3
  import { calculateAllData } from './index.js'
6
4
 
5
+ export const lockerWithAutovoter = (id: string) => {
6
+ return ['crv', 'bal', 'fxn', 'pendle'].includes(id)
7
+ }
8
+
7
9
  export type TBribesRewards = {
8
10
  bribeMinApr: number
9
11
  bribeMaxApr: number
@@ -25,14 +27,13 @@ const getBribesRewardsData = (
25
27
  tokenLocked: any,
26
28
  ): { bribeMinApr: number; bribeMaxApr: number; bribeRewards: TBribesRewards | undefined } => {
27
29
  const bribesAverageApr = [
28
- { id: 'crv', value: bribesData?.[delegationWithId('crv')!] / 100 || 0 },
29
- { id: 'bal', value: bribesData?.[delegationWithId('bal')!] / 100 || 0 },
30
- { id: 'fxs', value: bribesData?.[delegationWithId('fxs')!] / 100 || 0 }, // 1 FXS = 4 veFXS
31
- { id: 'angle', value: bribesData?.[delegationWithId('angle')!] / 100 || 0 },
32
- { id: 'cake', value: bribesData?.[delegationWithId('cake')!] / 100 || 0 },
33
- { id: 'pendle', value: bribesData?.[delegationWithId('pendle')!] / 100 || 0 },
34
- { id: 'fxn', value: bribesData?.[delegationWithId('fxn')!] / 100 || 0 },
35
- { id: 'spectra', value: bribesData?.[delegationWithId('spectra')!] / 100 || 0 },
30
+ { id: 'crv', value: bribesData?.['sdcrv.eth'] / 100 || 0 },
31
+ { id: 'bal', value: bribesData?.['sdbal.eth'] / 100 || 0 },
32
+ { id: 'fxs', value: bribesData?.['sdfxs.eth'] / 100 || 0 }, // 1 FXS = 4 veFXS
33
+ { id: 'cake', value: bribesData?.['sdcake.eth'] / 100 || 0 },
34
+ { id: 'pendle', value: bribesData?.['sdpendle.eth'] / 100 || 0 },
35
+ { id: 'fxn', value: bribesData?.['sdfxn.eth'] / 100 || 0 },
36
+ { id: 'spectra', value: bribesData?.['sdspectra.eth'] / 100 || 0 },
36
37
  ]
37
38
 
38
39
  const llVotingPower = lockerWithAutovoter(locker.id)
@@ -1,7 +1,6 @@
1
1
  const substractFees = (lockerId: string, maxApr: number, lockerFee: any): number => {
2
2
  switch (lockerId) {
3
- case 'ynd':
4
- case 'apw': {
3
+ case 'ynd': {
5
4
  const totalFee = lockerFee
6
5
  ? Object.keys(lockerFee).reduce(
7
6
  (total, key) => (key !== 'lockerId' ? total + Number(lockerFee[key]) : total),
@@ -1,4 +1,4 @@
1
- import { Zero } from '@stake-dao/constants'
1
+ import { ONE_YEAR, Zero } from '@stake-dao/constants'
2
2
  import { formatUnits, parseEther } from 'viem'
3
3
  import { projectWorkingBalance } from '../../../utils.js'
4
4
  import type { OnlyBoostData } from '../../types.js'
@@ -14,6 +14,8 @@ const getOnlyboostData = (
14
14
  workingBalance: bigint,
15
15
  baseTotalSupply: bigint,
16
16
  lpPriceInUsd: number,
17
+ maxApr: number,
18
+ baseRewardPrice: number,
17
19
  ): OnlyBoostData => {
18
20
  const active = data.active
19
21
  const convexImpl = data.convexImpl
@@ -33,6 +35,13 @@ const getOnlyboostData = (
33
35
  const stakeDaoBoost = getBoost('curve', strategyHoldings, workingBalance)
34
36
  const convexBoost = getBoost('curve', data.convexStrategyHoldings, data.convexWorkingBalance)
35
37
 
38
+ let convexApr =
39
+ ((Number(formatUnits(data.convexRewardRate * BigInt(ONE_YEAR), 18)) * baseRewardPrice) /
40
+ (convexTvl > 0 ? convexTvl : 1)) *
41
+ 100
42
+ convexApr = convexApr > maxApr ? maxApr : convexApr
43
+ const convexRealBoost = (convexApr / maxApr) * 2.5
44
+
36
45
  const stakeDaoWorkingBalanceShare = formatUnits(workingBalance, 0)
37
46
  const convexWorkingBalanceShare =
38
47
  data.convexStrategyHoldings > Zero && data.convexWorkingBalance > Zero
@@ -69,7 +78,7 @@ const getOnlyboostData = (
69
78
  const stakeDaoOptBoost = getBoost('curve', stakeDaoOptStrategyHoldings, stakeDaoOptWorkingBalance)
70
79
  const convexOptBoost = getBoost('curve', convexOptStrategyHoldings, convexOptWorkingBalance)
71
80
 
72
- const boost = Number(totalSupply) > 0 ? stakeDaoBoost * stakeDaoShare + convexBoost * convexShare : 2.5
81
+ const boost = Number(totalSupply) > 0 ? stakeDaoBoost * stakeDaoShare + convexRealBoost * convexShare : 2.5
73
82
  const optimalBoost =
74
83
  Number(totalSupply) > 0 ? stakeDaoOptBoost * stakeDaoOptShare + convexOptBoost * convexOptShare : 2.5
75
84
 
@@ -103,6 +103,8 @@ export const fetchCurve = async ({
103
103
  v.workingBalance,
104
104
  v.totalSupply,
105
105
  strat.lpPriceInUsd,
106
+ 0,
107
+ 0,
106
108
  )
107
109
  totalSupply = onlyboost.totalSupply
108
110
  boost = onlyboost.boost
@@ -100,6 +100,13 @@ export const parseV2Strats = (global: any, rawStrats: any[], extra: any) => {
100
100
 
101
101
  const useVeBoost = s.chainId === mainnet.id && s.gauge?.address !== '0xd8b712d29381748dB89c36BCa0138d7c75866ddF' // MIM/3crv
102
102
 
103
+ const baseReward = rewards.find(
104
+ (r) => r.yieldType === 'STAKING_REWARDS' && equalTlc(r.token.address, baseTokens.curve[s.chainId]),
105
+ )
106
+ const baseRewardPrice =
107
+ extra.baseRewardsPrices.find((r) => equalTlc(r.address, baseTokens.curve[s.chainId]))?.usdPrice || 0
108
+ const maxApr = baseReward?.apr || 0
109
+
103
110
  const onlyboost = getOnlyboostData(
104
111
  {
105
112
  active: s.sidecar !== zeroAddress,
@@ -109,6 +116,7 @@ export const parseV2Strats = (global: any, rawStrats: any[], extra: any) => {
109
116
  stakeDaoSupply,
110
117
  convexStrategyHoldings: BigInt(metadata.convexTotalSupply || '0'),
111
118
  convexWorkingBalance: BigInt(metadata.workingBalanceConvex || '0'),
119
+ convexRewardRate: BigInt(metadata.convexRewardRate || '0'),
112
120
  convexOptSupply,
113
121
  stakeDaoOptSupply,
114
122
  claimableData: [],
@@ -121,13 +129,11 @@ export const parseV2Strats = (global: any, rawStrats: any[], extra: any) => {
121
129
  BigInt(metadata.workingBalance || '0'),
122
130
  totalSupply,
123
131
  lpPriceInUsd,
132
+ maxApr,
133
+ baseRewardPrice,
124
134
  )
125
135
 
126
136
  const boost = onlyboost.boost
127
- const baseReward = rewards.find(
128
- (r) => r.yieldType === 'STAKING_REWARDS' && equalTlc(r.token.address, baseTokens.curve[s.chainId]),
129
- )
130
- const maxApr = baseReward?.apr || 0
131
137
  const baseRewardApr = (maxApr / 2.5) * boost * ((100 - V2_FEES) / 100)
132
138
 
133
139
  let baseRewardAdded = false
@@ -179,7 +185,7 @@ export const parseV2Strats = (global: any, rawStrats: any[], extra: any) => {
179
185
  underlyingCoins: [],
180
186
  lpPriceInUsd,
181
187
  streaming: true,
182
- tvl: Number(s.totalSupplyUSD),
188
+ tvl: Number(s.totalSupplyUSD) > 10000000000 ? 0 : Number(s.totalSupplyUSD),
183
189
  apr: {
184
190
  boost,
185
191
  current: { total: aprTotal, details: aprDetails },
package/src/utils.ts CHANGED
@@ -318,3 +318,8 @@ export const multichainMulticall = async (calls: MultiChainCall[], abi: readonly
318
318
  }
319
319
 
320
320
  export const concatBytecode = (contract: string, args: string): string => contract.concat(args.slice(2))
321
+
322
+ export const getRes = (raw: any) => {
323
+ if (raw.status === 'failure') throw Error(raw.error)
324
+ return raw.result
325
+ }
@@ -1,36 +0,0 @@
1
- import { ONE_WEEK, ONE_YEAR, Zero } from '@stake-dao/constants';
2
- import { range } from 'lodash-es';
3
- import { formatUnits } from 'viem';
4
- export const parseBoost = (locker, chunkedRawLockersData) => {
5
- let boost = '0';
6
- if (locker.veBoost && locker.id === 'crv') {
7
- boost = formatUnits(chunkedRawLockersData[16].result, locker.token.decimals);
8
- }
9
- else if (locker.veBoost) {
10
- boost = formatUnits(chunkedRawLockersData[12].result, locker.token.decimals);
11
- }
12
- return boost;
13
- };
14
- export const parseVeBoostApr = (lockerId, tokenPriceInUsd, totalDelegatedVeBoost, chunkedRawLockersData) => {
15
- const startIndex = lockerId === 'crv' ? 17 : 13;
16
- let amountPerYear = 0;
17
- try {
18
- const rawWeeklyRewards = range(startIndex, startIndex + 5).map((i) => chunkedRawLockersData[i]);
19
- const weeklyRewardsWithoutNull = rawWeeklyRewards
20
- .filter((el) => el.status === 'success' && el.result && typeof el.result === 'bigint' && el.result > Zero)
21
- .map((el) => Number(formatUnits(el.result, 18)));
22
- if (weeklyRewardsWithoutNull.length > 0) {
23
- amountPerYear =
24
- (weeklyRewardsWithoutNull.reduce((total, x) => (total += x)) / (weeklyRewardsWithoutNull.length * ONE_WEEK)) *
25
- ONE_YEAR;
26
- }
27
- }
28
- catch (e) {
29
- console.error(e);
30
- amountPerYear = 0;
31
- }
32
- const tvl = totalDelegatedVeBoost * tokenPriceInUsd;
33
- const apr = tvl > 0 ? ((amountPerYear * tokenPriceInUsd) / tvl) * 100 : 0;
34
- return apr;
35
- };
36
- //# sourceMappingURL=parseBoost.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"parseBoost.js","sourceRoot":"","sources":["../../../../src/lockers/fetch/parseBoost.ts"],"names":[],"mappings":"AAAA,OAAO,EAAe,QAAQ,EAAE,QAAQ,EAAE,IAAI,EAAE,MAAM,sBAAsB,CAAA;AAC5E,OAAO,EAAE,KAAK,EAAE,MAAM,WAAW,CAAA;AACjC,OAAO,EAAE,WAAW,EAAE,MAAM,MAAM,CAAA;AAElC,MAAM,CAAC,MAAM,UAAU,GAAG,CAAC,MAAc,EAAE,qBAA0B,EAAE,EAAE;IACvE,IAAI,KAAK,GAAG,GAAG,CAAA;IACf,IAAI,MAAM,CAAC,OAAO,IAAI,MAAM,CAAC,EAAE,KAAK,KAAK,EAAE,CAAC;QAC1C,KAAK,GAAG,WAAW,CAAC,qBAAqB,CAAC,EAAE,CAAC,CAAC,MAAM,EAAE,MAAM,CAAC,KAAK,CAAC,QAAQ,CAAC,CAAA;IAC9E,CAAC;SAAM,IAAI,MAAM,CAAC,OAAO,EAAE,CAAC;QAC1B,KAAK,GAAG,WAAW,CAAC,qBAAqB,CAAC,EAAE,CAAC,CAAC,MAAM,EAAE,MAAM,CAAC,KAAK,CAAC,QAAQ,CAAC,CAAA;IAC9E,CAAC;IAED,OAAO,KAAK,CAAA;AACd,CAAC,CAAA;AAED,MAAM,CAAC,MAAM,eAAe,GAAG,CAC7B,QAAgB,EAChB,eAAuB,EACvB,qBAA6B,EAC7B,qBAA0B,EAC1B,EAAE;IACF,MAAM,UAAU,GAAG,QAAQ,KAAK,KAAK,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,CAAA;IAC/C,IAAI,aAAa,GAAG,CAAC,CAAA;IAErB,IAAI,CAAC;QACH,MAAM,gBAAgB,GAAG,KAAK,CAAC,UAAU,EAAE,UAAU,GAAG,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,qBAAqB,CAAC,CAAC,CAAC,CAAC,CAAA;QAE/F,MAAM,wBAAwB,GAAG,gBAAgB;aAC9C,MAAM,CAAC,CAAC,EAAE,EAAE,EAAE,CAAC,EAAE,CAAC,MAAM,KAAK,SAAS,IAAI,EAAE,CAAC,MAAM,IAAI,OAAO,EAAE,CAAC,MAAM,KAAK,QAAQ,IAAI,EAAE,CAAC,MAAM,GAAG,IAAI,CAAC;aACzG,GAAG,CAAC,CAAC,EAAE,EAAE,EAAE,CAAC,MAAM,CAAC,WAAW,CAAC,EAAE,CAAC,MAAgB,EAAE,EAAE,CAAC,CAAC,CAAC,CAAA;QAE5D,IAAI,wBAAwB,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;YACxC,aAAa;gBACX,CAAC,wBAAwB,CAAC,MAAM,CAAC,CAAC,KAAK,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC,KAAK,IAAI,CAAC,CAAC,CAAC,GAAG,CAAC,wBAAwB,CAAC,MAAM,GAAG,QAAQ,CAAC,CAAC;oBAC5G,QAAQ,CAAA;QACZ,CAAC;IACH,CAAC;IAAC,OAAO,CAAC,EAAE,CAAC;QACX,OAAO,CAAC,KAAK,CAAC,CAAC,CAAC,CAAA;QAChB,aAAa,GAAG,CAAC,CAAA;IACnB,CAAC;IAED,MAAM,GAAG,GAAG,qBAAqB,GAAG,eAAe,CAAA;IACnD,MAAM,GAAG,GAAG,GAAG,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,aAAa,GAAG,eAAe,CAAC,GAAG,GAAG,CAAC,GAAG,GAAG,CAAC,CAAC,CAAC,CAAC,CAAA;IAEzE,OAAO,GAAG,CAAA;AACZ,CAAC,CAAA"}
@@ -1,18 +0,0 @@
1
- import {} from '@stake-dao/constants';
2
- import { formatUnits, parseUnits, zeroAddress } from 'viem';
3
- export const parsePeg = (locker, chunkedRawLockersData) => {
4
- const rawPeg = locker.secondaryMarket?.pool !== zeroAddress
5
- ? chunkedRawLockersData[locker.voteBooster ? 15 : 11].result
6
- : undefined;
7
- let parsedPeg = rawPeg;
8
- switch (locker.id) {
9
- case 'bal':
10
- parsedPeg = rawPeg[1] * BigInt(-1);
11
- break;
12
- }
13
- const peg = rawPeg && parsedPeg
14
- ? formatUnits(parsedPeg / parseUnits(locker.secondaryMarket?.pegBase?.toString() || '1', 0), 18)
15
- : '-';
16
- return peg;
17
- };
18
- //# sourceMappingURL=parsePeg.js.map