@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,174 @@
1
+ import { ONE_WEEK, ONE_YEAR, Zero } from '@stake-dao/constants';
2
+ import { formatUnits, parseUnits } from 'viem';
3
+ import { equalTlc } from '../../utils.js';
4
+ import getBribesRewardsData, {} from '../utils/getBribesRewardsData.js';
5
+ import substractFees from '../utils/substractFees.js';
6
+ export const parseVoteBoosterData = (locker, voteBooster) => {
7
+ const voteBoosterBoost = voteBooster && Number(voteBooster.working) > 0 && Number(voteBooster.staked) > 0
8
+ ? Number(voteBooster.working) / (Number(voteBooster.staked) * 0.4)
9
+ : 1;
10
+ return {
11
+ booster: locker.voteBooster.booster,
12
+ vSdToken: locker.voteBooster.vSdToken,
13
+ balance: voteBooster,
14
+ boost: voteBoosterBoost,
15
+ };
16
+ };
17
+ export const parsePeg = (locker, rawPeg) => {
18
+ if (rawPeg && rawPeg !== '-') {
19
+ const pegBase = parseUnits(locker.secondaryMarket?.pegBase?.toString() || '1', 0);
20
+ return formatUnits(rawPeg / pegBase, 18);
21
+ }
22
+ return '-';
23
+ };
24
+ export const parseAltYields = (locker, common) => {
25
+ const alternativeYields = JSON.parse(JSON.stringify(locker.alternativeYields || {})); // parse and stringify to avoid extensible issue
26
+ try {
27
+ if (common.cvgAprs?.[locker.modules.gauge]) {
28
+ alternativeYields.convergenceSdToken = {
29
+ label: locker.sdToken.symbol,
30
+ platform: 'Convergence',
31
+ href: 'https://app.cvg.finance/',
32
+ apr: common.cvgAprs[locker.modules.gauge].totalApr,
33
+ };
34
+ }
35
+ const spectraAltYield = common.spectraAprs?.find((s) => equalTlc(s.underlying.address, locker.sdToken.address));
36
+ alternativeYields.spectraAsdToken = spectraAltYield
37
+ ? {
38
+ label: spectraAltYield.ibt.symbol,
39
+ platform: 'Spectra',
40
+ href: 'https://app.spectra.finance/pools',
41
+ apr: Math.max(spectraAltYield.pools.map((p) => p.lpApy?.total || 0) || [0]),
42
+ }
43
+ : undefined;
44
+ }
45
+ catch (e) {
46
+ console.error(e);
47
+ }
48
+ return alternativeYields;
49
+ };
50
+ export const parseVeBoostApr = (weeklyRewards, tokenPriceInUsd, totalDelegatedVeBoost) => {
51
+ let amountPerYear = 0;
52
+ try {
53
+ const weeklyRewardsWithoutNull = weeklyRewards
54
+ .filter((r) => r > Zero)
55
+ .map((r) => Number(formatUnits(r, 18)));
56
+ if (weeklyRewardsWithoutNull.length > 0) {
57
+ amountPerYear =
58
+ (weeklyRewardsWithoutNull.reduce((total, x) => (total += x), 0) /
59
+ (weeklyRewardsWithoutNull.length * ONE_WEEK)) *
60
+ ONE_YEAR;
61
+ }
62
+ }
63
+ catch (e) {
64
+ console.error(e);
65
+ amountPerYear = 0;
66
+ }
67
+ const tvl = Number(totalDelegatedVeBoost) * tokenPriceInUsd;
68
+ const apr = tvl > 0 ? ((amountPerYear * tokenPriceInUsd) / tvl) * 100 : 0;
69
+ return apr;
70
+ };
71
+ export const parseSidechains = (locker, raw, prices) => {
72
+ if (locker.extensions.sideChains && raw.sidechains) {
73
+ return locker.extensions.sideChains.map((s, index) => {
74
+ const rewards = s.rewards?.map((reward) => {
75
+ const price = prices.find((p) => equalTlc(p.address, reward.address))?.usdPrice || 0;
76
+ return { token: reward, price };
77
+ }) || [];
78
+ return {
79
+ ...s,
80
+ ...raw.sidechains[index],
81
+ rewards,
82
+ };
83
+ });
84
+ }
85
+ return undefined;
86
+ };
87
+ export const parse = async ({ locker, raw, common, prices }) => {
88
+ const lockerFee = { total: 15 };
89
+ const tokenPrice = prices.find((p) => p.address === locker.token.address);
90
+ const tokenPriceInUsd = tokenPrice ? tokenPrice.usdPrice : 0;
91
+ const sdTokenPriceInUsd = raw.peg !== '-' ? tokenPriceInUsd * Number(raw.peg) : tokenPriceInUsd;
92
+ const tvl = raw.totalSupplyStaked ? Number(raw.totalSupplyStaked) * sdTokenPriceInUsd : 0;
93
+ const veBoostApr = locker.veBoost && raw.veBoost
94
+ ? parseVeBoostApr(raw.veBoost.weeklyRewards, tokenPriceInUsd, Number(raw.veBoost.delegated))
95
+ : 0;
96
+ // Rewards APR
97
+ const rewardsData = raw.rewards.map((rawData, index) => {
98
+ const r = locker.rewards[index];
99
+ const rewardPrice = equalTlc(r.address, locker.sdToken.address)
100
+ ? sdTokenPriceInUsd
101
+ : prices.find((p) => p.address === r.address)?.usdPrice || 0;
102
+ const periodFinish = Number(formatUnits(rawData ? rawData[2] : Zero, 0));
103
+ let streaming = r.distribution === 'streamed' && periodFinish > Math.floor(Date.now() / 1000);
104
+ const rate = rawData ? rawData[3] : Zero;
105
+ const oneYearRate = rate * BigInt(ONE_YEAR);
106
+ let apr = streaming
107
+ ? rewardPrice && tvl > 0
108
+ ? ((Number(formatUnits(oneYearRate, r.decimals)) * rewardPrice) / tvl) * 100
109
+ : 0
110
+ : 0;
111
+ if (raw.replaceApr?.[index]) {
112
+ apr = raw.replaceApr[index];
113
+ streaming = apr > 0;
114
+ }
115
+ // Remove fees from APR
116
+ apr = substractFees(locker.id, apr, lockerFee);
117
+ return {
118
+ token: r,
119
+ price: rewardPrice,
120
+ apr,
121
+ streaming,
122
+ periodFinish,
123
+ rate: formatUnits(rate, 0),
124
+ lastUpdate: rawData ? formatUnits(rawData[4], 0) : '0',
125
+ isAirdrop: r.isAirdrop,
126
+ };
127
+ });
128
+ const data = getBribesRewardsData(locker, common.bribesData, common.veSdtTotalSupply, raw.totalSupplyStaked, raw._veBalanceOfLocker, raw._workingSupply, raw.sdTokenInPool, raw.tokenLocked);
129
+ const bribeMinApr = data.bribeMinApr;
130
+ const bribeMaxApr = data.bribeMaxApr;
131
+ const bribeRewards = data.bribeRewards;
132
+ // Total APR
133
+ const minRewardsAprs = rewardsData.reduce((x, y) => x + y.apr, 0) + bribeMinApr;
134
+ const maxRewardsAprs = rewardsData.reduce((x, y) => x + y.apr, 0) + bribeMaxApr;
135
+ // Streaming status
136
+ const streaming = rewardsData.some((r) => r.streaming);
137
+ const alternativeYields = parseAltYields(locker, common);
138
+ // Sidechains
139
+ const sideChains = parseSidechains(locker, raw, prices);
140
+ return {
141
+ ...locker,
142
+ rewards: rewardsData,
143
+ tokenLocked: raw.tokenLocked,
144
+ veBalanceOfLocker: raw.veBalanceOfLocker,
145
+ totalTokenLocked: raw.totalTokenLocked,
146
+ veTotalSupply: raw.veTotalSupply,
147
+ lockIncentive: raw.lockIncentive || '0',
148
+ gaugeWorkingSupply: raw.gaugeWorkingSupply,
149
+ totalSupplyStaked: raw.totalSupplyStaked,
150
+ amountTokenNotLock: raw.amountTokenNotLock,
151
+ bribeRewards,
152
+ apr: [minRewardsAprs, maxRewardsAprs],
153
+ streaming,
154
+ veTokenRate: raw.veTokenRate,
155
+ tvl,
156
+ peg: raw.peg,
157
+ tokenPriceInUsd,
158
+ sdTokenPriceInUsd,
159
+ alternativeYields,
160
+ extensions: {
161
+ ...locker.extensions,
162
+ sideChains,
163
+ },
164
+ veBoost: locker.veBoost && raw.veBoost
165
+ ? {
166
+ ...locker.veBoost,
167
+ delegated: raw.veBoost.delegated,
168
+ apr: veBoostApr,
169
+ }
170
+ : undefined,
171
+ voteBooster: raw.voteBooster,
172
+ };
173
+ };
174
+ //# sourceMappingURL=parse.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"parse.js","sourceRoot":"","sources":["../../../../src/lockers/fetch/parse.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,136 @@
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 { getRes, multicall } from '../../../utils.js';
5
+ import { parse, parsePeg } from '../parse.js';
6
+ export const locker = {
7
+ id: 'angle',
8
+ symbol: 'ANGLE',
9
+ protocol: 'Angle',
10
+ protocolDescription: 'Angle is a decentralized, capital efficient and over-collateralized stablecoin protocol composed of smart contracts running on open blockchains.',
11
+ website: 'https://angle.money/',
12
+ logoUrl: `${STAKE_DAO_ASSETS_BASE_URL}/assets/archive/angle.svg`,
13
+ chainId: 1,
14
+ rgb: '249, 145, 144',
15
+ token: tokenWithId('angle'),
16
+ sdToken: tokenWithId('sdangle'),
17
+ rewards: [
18
+ { ...tokenWithId('sdt'), distribution: 'streamed', origin: 'sdtEmission' },
19
+ { ...tokenWithId('angle'), distribution: 'streamed', origin: 'stratPerf' },
20
+ { ...tokenWithId('eura'), distribution: 'streamed', origin: 'native.common' },
21
+ { ...tokenWithId('sdangle'), distribution: 'distributed', origin: 'bounties' },
22
+ ],
23
+ delegation: ['sdangle.eth'],
24
+ modules: {
25
+ depositor: '0x0000000000000000000000000000000000000000',
26
+ locker: '0xD13F8C25CceD32cdfA79EB5eD654Ce3e484dCAF5',
27
+ veToken: '0x0C462Dbb9EC8cD1630f1728B2CFD2769d09f0dd5',
28
+ gauge: '0xE55843a90672f7d8218285e51EE8fF8E233F35d5',
29
+ accumulator: '0x8cc02F4f383A11b989708437DbA6BB0628d7eE78',
30
+ redeem: '0x1D8A9c30E4e25033498347c1A054717bd0c4D356',
31
+ },
32
+ secondaryMarket: {
33
+ label: 'Curve',
34
+ poolKey: 'factory-v2-101',
35
+ vaultKey: '',
36
+ pool: '0x48fF31bBbD8Ab553Ebe7cBD84e1eA3dBa8f54957',
37
+ pools: ['0x48fF31bBbD8Ab553Ebe7cBD84e1eA3dBa8f54957'],
38
+ pegBase: 300000,
39
+ },
40
+ fees: [
41
+ {
42
+ label: { key: 'liquidity', variable: 'sdANGLE/ANGLE' },
43
+ value: 10,
44
+ key: 'liquidityFee',
45
+ static: true,
46
+ },
47
+ {
48
+ label: { key: 'treasury' },
49
+ value: 5,
50
+ key: 'daoFee',
51
+ static: true,
52
+ },
53
+ {
54
+ label: { key: 'harvester' },
55
+ value: 0.1,
56
+ key: 'claimerFee',
57
+ static: true,
58
+ },
59
+ ],
60
+ extensions: {
61
+ coingeckoBaseSlug: 'angle',
62
+ },
63
+ };
64
+ const angleLocker = async ({ provider, common, prices }) => {
65
+ const token = locker.token.address;
66
+ const sdToken = locker.sdToken.address;
67
+ const gauge = locker.modules.gauge;
68
+ const depositor = locker.modules.depositor;
69
+ const votingEscrow = locker.modules.veToken;
70
+ const lockerAddress = locker.modules.locker;
71
+ const secondaryMarket = locker.secondaryMarket;
72
+ const rewards = locker.rewards;
73
+ const pegBase = parseUnits(secondaryMarket?.pegBase?.toString() || '1', 18);
74
+ const format = (value) => formatUnits(value, locker.token.decimals);
75
+ const formatRes = (value) => format(getRes(value));
76
+ const calls = [
77
+ /*********************************************************************************
78
+ *** Voting Escrow
79
+ *********************************************************************************/
80
+ // Token locked by the Locker
81
+ { address: votingEscrow, name: 'locked', params: [lockerAddress] },
82
+ // veToken Balance of the Locker
83
+ { address: votingEscrow, name: 'balanceOf', params: [lockerAddress] },
84
+ // Total token locked
85
+ { address: votingEscrow, name: 'supply' },
86
+ // Total veToken supply
87
+ { address: votingEscrow, name: 'totalSupply' },
88
+ /*********************************************************************************
89
+ *** Gauge
90
+ *********************************************************************************/
91
+ // Total sdToken staked
92
+ { address: gauge, name: 'totalSupply' },
93
+ // Gauge working supply
94
+ { address: gauge, name: 'working_supply' },
95
+ /*********************************************************************************
96
+ *** Token & sdToken
97
+ *********************************************************************************/
98
+ // Token balance not locked
99
+ { address: token, name: 'balanceOf', params: [depositor] },
100
+ // sdToken in secondary market pool
101
+ { address: sdToken, name: 'balanceOf', params: [secondaryMarket.pool] },
102
+ /*********************************************************************************
103
+ *** Peg
104
+ *********************************************************************************/
105
+ // Return amount when swapping {pegBase} sdToken to token -> get_dy(int128,int128,uint256)
106
+ { address: secondaryMarket.pool, name: '0x5e0d443f', params: [One, Zero, pegBase] },
107
+ /*********************************************************************************
108
+ *** Rewards
109
+ *********************************************************************************/
110
+ // Streaming status for each reward token
111
+ ...rewards.map((r) => ({ address: gauge, name: 'reward_data', params: [r.address] })),
112
+ ];
113
+ const res = await multicall(provider, calls, lockersMulticallAbi(locker.id, locker.chainId));
114
+ const raw = {
115
+ tokenLocked: getRes(res.shift()),
116
+ veBalanceOfLocker: formatRes(res.shift()),
117
+ totalTokenLocked: formatRes(res.shift()),
118
+ veTotalSupply: formatRes(res.shift()),
119
+ totalSupplyStaked: formatRes(res.shift()),
120
+ gaugeWorkingSupply: formatRes(res.shift()),
121
+ amountTokenNotLock: formatRes(res.shift()),
122
+ sdTokenInPool: formatRes(res.shift()),
123
+ peg: getRes(res.shift()),
124
+ rewards: rewards.map(() => getRes(res.shift())),
125
+ veTokenRate: '4',
126
+ _workingSupply: '0',
127
+ _veBalanceOfLocker: '0',
128
+ };
129
+ raw.tokenLocked = format(raw.tokenLocked[0]);
130
+ raw.peg = parsePeg(locker, raw.peg);
131
+ raw._workingSupply = raw.gaugeWorkingSupply;
132
+ raw._veBalanceOfLocker = raw.veBalanceOfLocker;
133
+ return parse({ locker, common, prices, raw });
134
+ };
135
+ export default angleLocker;
136
+ //# sourceMappingURL=angle.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"angle.js","sourceRoot":"","sources":["../../../../../src/lockers/fetch/protocols/angle.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,172 @@
1
+ import { ONE_WEEK, One, STAKE_DAO_ASSETS_BASE_URL, Zero, contracts, tokenWithId } from '@stake-dao/constants';
2
+ import { range } from 'lodash-es';
3
+ import { formatUnits, parseUnits, zeroAddress } from 'viem';
4
+ import lockersMulticallAbi from '../../../abis/lockersMulticall.js';
5
+ import { getRes, multicall } from '../../../utils.js';
6
+ import { parse, parsePeg } from '../parse.js';
7
+ export const locker = {
8
+ id: 'bal',
9
+ symbol: 'BAL',
10
+ protocol: 'Balancer',
11
+ protocolDescription: 'Balancer is a decentralized automated market maker (AMM) protocol built on Ethereum that represents a flexible building block for programmable liquidity.',
12
+ website: 'https://balancer.fi/',
13
+ logoUrl: `${STAKE_DAO_ASSETS_BASE_URL}/assets/archive/bal.svg`,
14
+ chainId: 1,
15
+ rgb: '9, 31, 59',
16
+ token: tokenWithId('80-bal-20-weth'),
17
+ sdToken: tokenWithId('sdbal'),
18
+ rewards: [
19
+ { ...tokenWithId('sdt'), distribution: 'streamed', origin: 'sdtEmission' },
20
+ { ...tokenWithId('bal'), distribution: 'streamed', origin: 'stratPerf' },
21
+ { ...tokenWithId('usdc'), distribution: 'streamed', origin: 'native.common' },
22
+ { ...tokenWithId('sdbal'), distribution: 'distributed', origin: 'bounties' },
23
+ ],
24
+ delegation: ['sdbal.eth'],
25
+ modules: {
26
+ depositor: '0x3e0d44542972859de3CAdaF856B1a4FD351B4D2E',
27
+ locker: '0xea79d1a83da6db43a85942767c389fe0acf336a5',
28
+ veToken: '0xC128a9954e6c874eA3d62ce62B468bA073093F25',
29
+ gauge: '0x3e8c72655e48591d93e6dfda16823db0ff23d859',
30
+ accumulator: '0x2903DBEC58d193c34708dE22f89fd7A42b6d0Eb0',
31
+ },
32
+ secondaryMarket: {
33
+ label: 'Balancer',
34
+ poolKey: '0x2d011adf89f0576c9b722c28269fcb5d50c2d17900020000000000000000024d',
35
+ vaultKey: '0x2d011adf89f0576c9b722c28269fcb5d50c2d17900020000000000000000024d',
36
+ pool: '0x2d011adf89f0576c9b722c28269fcb5d50c2d17900020000000000000000024d',
37
+ pools: [contracts.balancerVault[1]],
38
+ router: contracts.balancerVault[1],
39
+ pegBase: 1000,
40
+ },
41
+ veBoost: {
42
+ address: '0x2cf8e145Bdfe7c52b49AD9bB3c294a31B2736c59',
43
+ delegator: '0xda9846665Bdb44b0d0CAFFd0d1D4A539932BeBdf',
44
+ },
45
+ alternativeYields: {
46
+ sdBalBalStakeDao: {
47
+ label: 'sdBAL/B-80BAL-20WETH',
48
+ platform: 'Stake DAO',
49
+ href: '/yield',
50
+ },
51
+ },
52
+ fees: [
53
+ {
54
+ label: { key: 'liquidity', variable: 'sdBAL/B-80BAL-20WETH' },
55
+ value: 10,
56
+ key: 'liquidityFee',
57
+ },
58
+ {
59
+ label: { key: 'treasury' },
60
+ value: 5,
61
+ key: 'daoFee',
62
+ },
63
+ {
64
+ label: { key: 'harvesterOn', variable: 'BAL, USDC' },
65
+ value: 0,
66
+ key: 'claimerFee',
67
+ },
68
+ ],
69
+ extensions: {
70
+ coingeckoBaseSlug: 'balancer',
71
+ },
72
+ };
73
+ const balancerLocker = async ({ provider, common, prices }) => {
74
+ const token = locker.token.address;
75
+ const sdToken = locker.sdToken.address;
76
+ const gauge = locker.modules.gauge;
77
+ const depositor = locker.modules.depositor;
78
+ const votingEscrow = locker.modules.veToken;
79
+ const lockerAddress = locker.modules.locker;
80
+ const veBoost = locker.veBoost;
81
+ const secondaryMarket = locker.secondaryMarket;
82
+ const rewards = locker.rewards;
83
+ const now = Math.floor(Date.now() / 1000);
84
+ const lastWeek = Math.floor(now / ONE_WEEK) * ONE_WEEK;
85
+ const pegBase = parseUnits(secondaryMarket?.pegBase?.toString() || '1', 18);
86
+ const format = (value) => formatUnits(value, locker.token.decimals);
87
+ const formatRes = (value) => format(getRes(value));
88
+ const calls = [
89
+ /*********************************************************************************
90
+ *** Voting Escrow
91
+ *********************************************************************************/
92
+ // Token locked by the Locker
93
+ { address: votingEscrow, name: 'locked', params: [lockerAddress] },
94
+ // veToken Balance of the Locker
95
+ { address: votingEscrow, name: 'balanceOf', params: [lockerAddress] },
96
+ // Total token locked
97
+ { address: votingEscrow, name: 'supply' },
98
+ // Total veToken supply
99
+ { address: votingEscrow, name: 'totalSupply' },
100
+ /*********************************************************************************
101
+ *** Gauge
102
+ *********************************************************************************/
103
+ // Total sdToken staked
104
+ { address: gauge, name: 'totalSupply' },
105
+ // Gauge working supply
106
+ { address: gauge, name: 'working_supply' },
107
+ /*********************************************************************************
108
+ *** Token & sdToken
109
+ *********************************************************************************/
110
+ // Token balance not locked
111
+ { address: token, name: 'balanceOf', params: [depositor] },
112
+ // sdToken in secondary market pool
113
+ { address: sdToken, name: 'balanceOf', params: [secondaryMarket.router] },
114
+ /*********************************************************************************
115
+ *** Peg
116
+ *********************************************************************************/
117
+ // Return amount when swapping {pegBase} sdToken to token -> get_dy(int128,int128,uint256)
118
+ {
119
+ address: contracts.balancerVault[1],
120
+ name: 'queryBatchSwap',
121
+ params: [
122
+ Zero,
123
+ [[secondaryMarket.pool, Zero, One, pegBase, '0x']],
124
+ [sdToken, token],
125
+ [zeroAddress, false, zeroAddress, false],
126
+ ],
127
+ },
128
+ /*********************************************************************************
129
+ *** Rewards
130
+ *********************************************************************************/
131
+ // Streaming status for each reward token
132
+ ...rewards.map((r) => ({ address: gauge, name: 'reward_data', params: [r.address] })),
133
+ /*********************************************************************************
134
+ *** veBoost
135
+ *********************************************************************************/
136
+ // Total veBoost delegated through delegator
137
+ { address: veBoost.delegator, name: 'totalSupply' },
138
+ // veBoost 5 last weeks rewards
139
+ ...range(0, 5).map((i) => ({
140
+ address: veBoost.delegator,
141
+ name: 'weeklyRewards',
142
+ params: [token, lastWeek - i * ONE_WEEK],
143
+ })),
144
+ ];
145
+ const res = await multicall(provider, calls, lockersMulticallAbi(locker.id, locker.chainId));
146
+ const raw = {
147
+ tokenLocked: getRes(res.shift()),
148
+ veBalanceOfLocker: formatRes(res.shift()),
149
+ totalTokenLocked: formatRes(res.shift()),
150
+ veTotalSupply: formatRes(res.shift()),
151
+ totalSupplyStaked: formatRes(res.shift()),
152
+ gaugeWorkingSupply: formatRes(res.shift()),
153
+ amountTokenNotLock: formatRes(res.shift()),
154
+ sdTokenInPool: formatRes(res.shift()),
155
+ peg: getRes(res.shift()),
156
+ rewards: rewards.map(() => getRes(res.shift())),
157
+ veBoost: {
158
+ delegated: formatRes(res.shift()),
159
+ weeklyRewards: range(0, 5).map(() => getRes(res.shift())),
160
+ },
161
+ veTokenRate: '4',
162
+ _workingSupply: '0',
163
+ _veBalanceOfLocker: '0',
164
+ };
165
+ raw.tokenLocked = format(raw.tokenLocked[0]);
166
+ raw.peg = parsePeg(locker, raw.peg[1] * BigInt(-1));
167
+ raw._workingSupply = raw.gaugeWorkingSupply;
168
+ raw._veBalanceOfLocker = raw.veBalanceOfLocker;
169
+ return parse({ locker, common, prices, raw });
170
+ };
171
+ export default balancerLocker;
172
+ //# sourceMappingURL=balancer.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"balancer.js","sourceRoot":"","sources":["../../../../../src/lockers/fetch/protocols/balancer.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,130 @@
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 { getRes, multicall } from '../../../utils.js';
5
+ import { parse, parsePeg } from '../parse.js';
6
+ export const locker = {
7
+ id: 'bpt',
8
+ symbol: 'BPT',
9
+ protocol: 'Blackpool',
10
+ protocolDescription: 'Blackpool is a decentralized autonomous organization (DAO) built solely for NFT gaming and trading.',
11
+ website: 'https://blackpool.finance/',
12
+ logoUrl: `${STAKE_DAO_ASSETS_BASE_URL}/assets/archive/bpt.svg`,
13
+ chainId: 1,
14
+ rgb: '0, 0, 0',
15
+ token: tokenWithId('bpt'),
16
+ sdToken: tokenWithId('sdbpt'),
17
+ rewards: [{ ...tokenWithId('weth'), distribution: 'streamed', origin: 'native.common' }],
18
+ delegation: ['sdbpt.eth'],
19
+ modules: {
20
+ depositor: '0x219f7496fbD30e1F21A20613F9372d608A279993',
21
+ locker: '0x0a4dF7809F83e130D8ffa297f03b75318E37B461',
22
+ veToken: '0x19886A88047350482990D4EDd0C1b863646aB921',
23
+ gauge: '0xa291faEEf794df6216f196a63F514B5B22244865',
24
+ accumulator: '0xfAC788261DA6E2aFfCD0e9AB340395378F8CBfBc',
25
+ },
26
+ secondaryMarket: {
27
+ label: 'Curve',
28
+ poolKey: 'factory-v2-177',
29
+ vaultKey: '',
30
+ pool: '0x9d259ca698746586107c234e9e9461d385ca1041',
31
+ pools: ['0x9d259ca698746586107c234e9e9461d385ca1041'],
32
+ pegBase: 5000,
33
+ },
34
+ fees: [
35
+ {
36
+ label: { key: 'liquidity', variable: 'sdBPT/BPT' },
37
+ value: 10,
38
+ key: 'liquidityFee',
39
+ static: true,
40
+ },
41
+ {
42
+ label: { key: 'treasury' },
43
+ value: 5,
44
+ key: 'daoFee',
45
+ static: true,
46
+ },
47
+ {
48
+ label: { key: 'harvester' },
49
+ value: 0.1,
50
+ key: 'claimerFee',
51
+ static: true,
52
+ },
53
+ ],
54
+ extensions: {
55
+ coingeckoBaseSlug: 'blackpool-token',
56
+ },
57
+ };
58
+ const blackpoolLocker = async ({ provider, common, prices }) => {
59
+ const token = locker.token.address;
60
+ const sdToken = locker.sdToken.address;
61
+ const gauge = locker.modules.gauge;
62
+ const depositor = locker.modules.depositor;
63
+ const votingEscrow = locker.modules.veToken;
64
+ const lockerAddress = locker.modules.locker;
65
+ const secondaryMarket = locker.secondaryMarket;
66
+ const rewards = locker.rewards;
67
+ const pegBase = parseUnits(secondaryMarket?.pegBase?.toString() || '1', 18);
68
+ const format = (value) => formatUnits(value, locker.token.decimals);
69
+ const formatRes = (value) => format(getRes(value));
70
+ const calls = [
71
+ /*********************************************************************************
72
+ *** Voting Escrow
73
+ *********************************************************************************/
74
+ // Token locked by the Locker
75
+ { address: votingEscrow, name: 'locked', params: [lockerAddress] },
76
+ // veToken Balance of the Locker
77
+ { address: votingEscrow, name: 'balanceOf', params: [lockerAddress] },
78
+ // Total token locked
79
+ { address: votingEscrow, name: 'supply' },
80
+ // Total veToken supply
81
+ { address: votingEscrow, name: 'totalSupply' },
82
+ /*********************************************************************************
83
+ *** Gauge
84
+ *********************************************************************************/
85
+ // Total sdToken staked
86
+ { address: gauge, name: 'totalSupply' },
87
+ // Gauge working supply
88
+ { address: gauge, name: 'working_supply' },
89
+ /*********************************************************************************
90
+ *** Token & sdToken
91
+ *********************************************************************************/
92
+ // Token balance not locked
93
+ { address: token, name: 'balanceOf', params: [depositor] },
94
+ // sdToken in secondary market pool
95
+ { address: sdToken, name: 'balanceOf', params: [secondaryMarket.pool] },
96
+ /*********************************************************************************
97
+ *** Peg
98
+ *********************************************************************************/
99
+ // Return amount when swapping {pegBase} sdToken to token -> get_dy(int128,int128,uint256)
100
+ { address: secondaryMarket.pool, name: '0x5e0d443f', params: [One, Zero, pegBase] },
101
+ /*********************************************************************************
102
+ *** Rewards
103
+ *********************************************************************************/
104
+ // Streaming status for each reward token
105
+ ...rewards.map((r) => ({ address: gauge, name: 'reward_data', params: [r.address] })),
106
+ ];
107
+ const res = await multicall(provider, calls, lockersMulticallAbi(locker.id, locker.chainId));
108
+ const raw = {
109
+ tokenLocked: getRes(res.shift()),
110
+ veBalanceOfLocker: formatRes(res.shift()),
111
+ totalTokenLocked: formatRes(res.shift()),
112
+ veTotalSupply: formatRes(res.shift()),
113
+ totalSupplyStaked: formatRes(res.shift()),
114
+ gaugeWorkingSupply: formatRes(res.shift()),
115
+ amountTokenNotLock: formatRes(res.shift()),
116
+ sdTokenInPool: formatRes(res.shift()),
117
+ peg: getRes(res.shift()),
118
+ rewards: rewards.map(() => getRes(res.shift())),
119
+ veTokenRate: '4',
120
+ _workingSupply: '0',
121
+ _veBalanceOfLocker: '0',
122
+ };
123
+ raw.tokenLocked = format(raw.tokenLocked[0]);
124
+ raw.peg = parsePeg(locker, raw.peg);
125
+ raw._workingSupply = raw.gaugeWorkingSupply;
126
+ raw._veBalanceOfLocker = raw.veBalanceOfLocker;
127
+ return parse({ locker, common, prices, raw });
128
+ };
129
+ export default blackpoolLocker;
130
+ //# sourceMappingURL=blackpool.js.map