@stake-dao/reader 0.4.112 → 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 +5 -3
  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 +10 -4
  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,151 @@
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: 'bpt',
10
+ symbol: 'BPT',
11
+ protocol: 'Blackpool',
12
+ protocolDescription:
13
+ 'Blackpool is a decentralized autonomous organization (DAO) built solely for NFT gaming and trading.',
14
+ website: 'https://blackpool.finance/',
15
+ logoUrl: `${STAKE_DAO_ASSETS_BASE_URL}/assets/archive/bpt.svg`,
16
+ chainId: 1,
17
+ rgb: '0, 0, 0',
18
+ token: tokenWithId('bpt')!,
19
+ sdToken: tokenWithId('sdbpt')!,
20
+ rewards: [{ ...tokenWithId('weth')!, distribution: 'streamed', origin: 'native.common' }],
21
+ delegation: ['sdbpt.eth'],
22
+ modules: {
23
+ depositor: '0x219f7496fbD30e1F21A20613F9372d608A279993',
24
+ locker: '0x0a4dF7809F83e130D8ffa297f03b75318E37B461',
25
+ veToken: '0x19886A88047350482990D4EDd0C1b863646aB921',
26
+ gauge: '0xa291faEEf794df6216f196a63F514B5B22244865',
27
+ accumulator: '0xfAC788261DA6E2aFfCD0e9AB340395378F8CBfBc',
28
+ },
29
+ secondaryMarket: {
30
+ label: 'Curve',
31
+ poolKey: 'factory-v2-177',
32
+ vaultKey: '',
33
+ pool: '0x9d259ca698746586107c234e9e9461d385ca1041',
34
+ pools: ['0x9d259ca698746586107c234e9e9461d385ca1041'],
35
+ pegBase: 5000,
36
+ },
37
+ fees: [
38
+ {
39
+ label: { key: 'liquidity', variable: 'sdBPT/BPT' },
40
+ value: 10,
41
+ key: 'liquidityFee',
42
+ static: true,
43
+ },
44
+ {
45
+ label: { key: 'treasury' },
46
+ value: 5,
47
+ key: 'daoFee',
48
+ static: true,
49
+ },
50
+ {
51
+ label: { key: 'harvester' },
52
+ value: 0.1,
53
+ key: 'claimerFee',
54
+ static: true,
55
+ },
56
+ ],
57
+ extensions: {
58
+ coingeckoBaseSlug: 'blackpool-token',
59
+ },
60
+ }
61
+
62
+ const blackpoolLocker = async ({ provider, common, prices }: { provider; common; prices }) => {
63
+ const token = locker.token.address
64
+ const sdToken = locker.sdToken.address
65
+
66
+ const gauge = locker.modules.gauge
67
+ const depositor = locker.modules.depositor
68
+ const votingEscrow = locker.modules.veToken
69
+ const lockerAddress = locker.modules.locker
70
+
71
+ const secondaryMarket = locker.secondaryMarket!
72
+ const rewards = locker.rewards
73
+
74
+ const pegBase = parseUnits(secondaryMarket?.pegBase?.toString() || '1', 18)
75
+
76
+ const format = (value: bigint) => formatUnits(value, locker.token.decimals)
77
+ const formatRes = (value: any) => format(getRes(value))
78
+
79
+ const calls: Call[] = [
80
+ /*********************************************************************************
81
+ *** Voting Escrow
82
+ *********************************************************************************/
83
+
84
+ // Token locked by the Locker
85
+ { address: votingEscrow, name: 'locked', params: [lockerAddress] },
86
+ // veToken Balance of the Locker
87
+ { address: votingEscrow, name: 'balanceOf', params: [lockerAddress] },
88
+ // Total token locked
89
+ { address: votingEscrow, name: 'supply' },
90
+ // Total veToken supply
91
+ { address: votingEscrow, name: 'totalSupply' },
92
+
93
+ /*********************************************************************************
94
+ *** Gauge
95
+ *********************************************************************************/
96
+
97
+ // Total sdToken staked
98
+ { address: gauge, name: 'totalSupply' },
99
+ // Gauge working supply
100
+ { address: gauge, name: 'working_supply' },
101
+
102
+ /*********************************************************************************
103
+ *** Token & sdToken
104
+ *********************************************************************************/
105
+
106
+ // Token balance not locked
107
+ { address: token, name: 'balanceOf', params: [depositor] },
108
+ // sdToken in secondary market pool
109
+ { address: sdToken, name: 'balanceOf', params: [secondaryMarket.pool] },
110
+
111
+ /*********************************************************************************
112
+ *** Peg
113
+ *********************************************************************************/
114
+
115
+ // Return amount when swapping {pegBase} sdToken to token -> get_dy(int128,int128,uint256)
116
+ { address: secondaryMarket.pool, name: '0x5e0d443f', params: [One, Zero, pegBase] },
117
+
118
+ /*********************************************************************************
119
+ *** Rewards
120
+ *********************************************************************************/
121
+
122
+ // Streaming status for each reward token
123
+ ...rewards.map((r) => ({ address: gauge, name: 'reward_data', params: [r.address] })),
124
+ ]
125
+
126
+ const res = await multicall(provider, calls, lockersMulticallAbi(locker.id, locker.chainId))
127
+ const raw = {
128
+ tokenLocked: getRes(res.shift()),
129
+ veBalanceOfLocker: formatRes(res.shift()),
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
+ }
142
+
143
+ raw.tokenLocked = format(raw.tokenLocked[0])
144
+ raw.peg = parsePeg(locker, raw.peg)
145
+ raw._workingSupply = raw.gaugeWorkingSupply
146
+ raw._veBalanceOfLocker = raw.veBalanceOfLocker
147
+
148
+ return parse({ locker, common, prices, raw })
149
+ }
150
+
151
+ export default blackpoolLocker
@@ -0,0 +1,229 @@
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 } from 'viem'
4
+ import lockersMulticallAbi from '../../../abis/lockersMulticall.js'
5
+ import { type Call, getRes, multicall } from '../../../utils.js'
6
+ import { parse, parsePeg, parseVoteBoosterData } from '../parse.js'
7
+ import type { Locker } from '../types.js'
8
+
9
+ export const locker: Locker = {
10
+ id: 'crv',
11
+ symbol: 'CRV',
12
+ protocol: 'Curve',
13
+ protocolDescription:
14
+ 'Curve is a decentralized exchange (DEX) focused on efficient stablecoin trading by using liquidity pools.',
15
+ website: 'https://curve.finance/',
16
+ logoUrl: `${STAKE_DAO_ASSETS_BASE_URL}/assets/archive/crv.svg`,
17
+ chainId: 1,
18
+ rgb: '234, 151, 53',
19
+ token: tokenWithId('crv')!,
20
+ sdToken: tokenWithId('sdcrv')!,
21
+ rewards: [
22
+ { ...tokenWithId('sdt')!, distribution: 'streamed', origin: 'sdtEmission' },
23
+ { ...tokenWithId('3crv')!, distribution: 'streamed', origin: 'native.curve' },
24
+ { ...tokenWithId('crv')!, distribution: 'streamed', origin: 'stratPerf' },
25
+ { ...tokenWithId('crvusd')!, distribution: 'streamed', origin: 'native.curve' },
26
+ { ...tokenWithId('sdcrv')!, distribution: 'distributed', origin: 'bounties' },
27
+ ],
28
+ delegation: ['sdcrv.eth', 'sdcrv-gov.eth'],
29
+ modules: {
30
+ depositor: '0xa50CB9dFFcc740EE6b6f2D4B3CBc3a876b28c335',
31
+ locker: '0x52f541764E6e90eeBc5c21Ff570De0e2D63766B6',
32
+ veToken: '0x5f3b5DfEb7B28CDbD7FAba78963EE202a494e2A2',
33
+ gauge: '0x7f50786A0b15723D741727882ee99a0BF34e3466',
34
+ accumulator: '0x11F78501e6b0cbc5DE4c7e6BBabaACdb973eb4Cd',
35
+ },
36
+ secondaryMarket: {
37
+ label: 'Curve',
38
+ poolKey: 'factory-v2-300',
39
+ vaultKey: '1-0x32c1Cd7c991A1F40f5aF5701CDc7a6A95F900CD4',
40
+ pool: '0xCA0253A98D16e9C1e3614caFDA19318EE69772D0',
41
+ pools: ['0xf7b55c3732ad8b2c2da7c24f30a69f55c54fb717', '0xca0253a98d16e9c1e3614cafda19318ee69772d0'],
42
+ pegBase: 10000,
43
+ },
44
+ veBoost: {
45
+ address: '0xD37A6aa3d8460Bd2b6536d608103D880695A23CD',
46
+ delegator: '0xe1F9C8ebBC80A013cAf0940fdD1A8554d763b9cf',
47
+ },
48
+ voteBooster: {
49
+ vSdToken: '0xE079ac07463ff375Ce48E8A9D76211C10696F3B8',
50
+ booster: '0x38d10708Ce535361F178f55E68DF7E85aCc66270',
51
+ },
52
+ autoCompounder: {
53
+ aSdToken: '0x43E54C2E7b3e294De3A155785F52AB49d87B9922',
54
+ },
55
+ alternativeYields: {
56
+ aSdCrvConcentrator: {
57
+ label: 'asdCRV',
58
+ platform: 'Concentrator',
59
+ href: 'https://concentrator.aladdin.club/',
60
+ },
61
+ sdCrvCrvConcentrator: {
62
+ label: 'sdCRV/CRV',
63
+ platform: 'Concentrator',
64
+ href: 'https://concentrator.aladdin.club/',
65
+ },
66
+ sdCrvCrvStakeDao: {
67
+ label: 'sdCRV/CRV',
68
+ platform: 'Stake DAO',
69
+ href: '/yield?search=0x32c1Cd7c991A1F40f5aF5701CDc7a6A95F900CD4',
70
+ },
71
+ spectraAsdToken: {
72
+ label: 'asdCRV',
73
+ platform: 'Spectra',
74
+ href: 'https://app.spectra.finance/pools#mainnet/0xc63dff67fe1b63004ab6c773022ba06847c11335',
75
+ },
76
+ },
77
+ fees: [
78
+ {
79
+ label: { key: 'liquidity', variable: 'sdCRV/CRV' },
80
+ value: 10,
81
+ key: 'liquidityFee',
82
+ },
83
+ {
84
+ label: { key: 'treasury' },
85
+ value: 5,
86
+ key: 'daoFee',
87
+ },
88
+ {
89
+ label: { key: 'harvesterOn', variable: '3CRV, CRV, crvUSD' },
90
+ value: 0.1,
91
+ token: 'crv',
92
+ key: 'claimerFee',
93
+ },
94
+ ],
95
+ extensions: {
96
+ coingeckoBaseSlug: 'curve-dao-token',
97
+ },
98
+ }
99
+
100
+ const curveLocker = async ({ provider, common, prices }: { provider; common; prices }) => {
101
+ const token = locker.token.address
102
+ const sdToken = locker.sdToken.address
103
+
104
+ const gauge = locker.modules.gauge
105
+ const depositor = locker.modules.depositor
106
+ const votingEscrow = locker.modules.veToken
107
+ const lockerAddress = locker.modules.locker
108
+
109
+ const veBoost = locker.veBoost!
110
+ const secondaryMarket = locker.secondaryMarket!
111
+ const rewards = locker.rewards
112
+
113
+ const now = Math.floor(Date.now() / 1000)
114
+ const lastWeek = Math.floor(now / ONE_WEEK) * ONE_WEEK
115
+ const pegBase = parseUnits(secondaryMarket?.pegBase?.toString() || '1', 18)
116
+
117
+ const format = (value: bigint) => formatUnits(value, locker.token.decimals)
118
+ const formatRes = (value: any) => format(getRes(value))
119
+
120
+ const calls: Call[] = [
121
+ /*********************************************************************************
122
+ *** Voting Escrow
123
+ *********************************************************************************/
124
+
125
+ // Token locked by the Locker
126
+ { address: votingEscrow, name: 'locked', params: [lockerAddress] },
127
+ // veToken Balance of the Locker
128
+ { address: votingEscrow, name: 'balanceOf', params: [lockerAddress] },
129
+ // Total token locked
130
+ { address: votingEscrow, name: 'supply' },
131
+ // Total veToken supply
132
+ { address: votingEscrow, name: 'totalSupply' },
133
+
134
+ /*********************************************************************************
135
+ *** Gauge
136
+ *********************************************************************************/
137
+
138
+ // Total sdToken staked
139
+ { address: gauge, name: 'totalSupply' },
140
+ // Gauge working supply
141
+ { address: gauge, name: 'working_supply' },
142
+
143
+ /*********************************************************************************
144
+ *** Token & sdToken
145
+ *********************************************************************************/
146
+
147
+ // Token balance not locked
148
+ { address: token, name: 'balanceOf', params: [depositor] },
149
+ // sdToken in secondary market pool
150
+ { address: sdToken, name: 'balanceOf', params: [secondaryMarket.pool] },
151
+
152
+ /*********************************************************************************
153
+ *** Peg
154
+ *********************************************************************************/
155
+
156
+ // Return amount when swapping {pegBase} sdToken to token -> get_dy(int128,int128,uint256)
157
+ { address: secondaryMarket.pool, name: '0x5e0d443f', params: [One, Zero, pegBase] },
158
+
159
+ /*********************************************************************************
160
+ *** Rewards
161
+ *********************************************************************************/
162
+
163
+ // Streaming status for each reward token
164
+ ...rewards.map((r) => ({ address: gauge, name: 'reward_data', params: [r.address] })),
165
+
166
+ /*********************************************************************************
167
+ *** veBoost
168
+ *********************************************************************************/
169
+
170
+ // Total veBoost delegated through delegator
171
+ { address: veBoost.delegator, name: 'totalSupply' },
172
+ // veBoost 5 last weeks rewards
173
+ ...range(0, 5).map((i) => ({
174
+ address: veBoost.delegator,
175
+ name: 'weeklyRewards',
176
+ params: [token, lastWeek - i * ONE_WEEK],
177
+ })),
178
+
179
+ /*********************************************************************************
180
+ *** Vote Booster (vsdToken)
181
+ *********************************************************************************/
182
+
183
+ // Token balance in Vote Booster contract
184
+ { address: token, name: 'balanceOf', params: [contracts.voteBoosterStrategy![1]] },
185
+ // sdToken balance in Vote Booster contract
186
+ { address: sdToken, name: 'balanceOf', params: [contracts.voteBoosterStrategy![1]] },
187
+ // Staked sdToken balance in Vote Booster contract
188
+ { address: gauge, name: 'balanceOf', params: [contracts.voteBoosterStrategy![1]] },
189
+ // Working balances of the Vote Booster contract
190
+ { address: gauge, name: 'working_balances', params: [contracts.voteBoosterStrategy![1]] },
191
+ ]
192
+
193
+ const res = await multicall(provider, calls, lockersMulticallAbi(locker.id, locker.chainId))
194
+ const raw = {
195
+ tokenLocked: getRes(res.shift()),
196
+ veBalanceOfLocker: formatRes(res.shift()),
197
+ totalTokenLocked: formatRes(res.shift()),
198
+ veTotalSupply: formatRes(res.shift()),
199
+ totalSupplyStaked: formatRes(res.shift()),
200
+ gaugeWorkingSupply: formatRes(res.shift()),
201
+ amountTokenNotLock: formatRes(res.shift()),
202
+ sdTokenInPool: formatRes(res.shift()),
203
+ peg: getRes(res.shift()),
204
+ rewards: rewards.map(() => getRes(res.shift())),
205
+ veBoost: {
206
+ delegated: formatRes(res.shift()),
207
+ weeklyRewards: range(0, 5).map(() => getRes(res.shift())),
208
+ },
209
+ voteBooster: {
210
+ token: formatRes(res.shift()),
211
+ sdToken: formatRes(res.shift()),
212
+ staked: formatRes(res.shift()),
213
+ working: formatRes(res.shift()),
214
+ },
215
+ veTokenRate: '4',
216
+ _workingSupply: '0',
217
+ _veBalanceOfLocker: '0',
218
+ }
219
+
220
+ raw.tokenLocked = format(raw.tokenLocked[0])
221
+ raw.voteBooster = parseVoteBoosterData(locker, raw.voteBooster) as any
222
+ raw.peg = parsePeg(locker, raw.peg)
223
+ raw._workingSupply = raw.gaugeWorkingSupply
224
+ raw._veBalanceOfLocker = raw.veBalanceOfLocker
225
+
226
+ return parse({ locker, common, prices, raw })
227
+ }
228
+
229
+ export default curveLocker
@@ -0,0 +1,139 @@
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: 'fpis',
10
+ symbol: 'FPIS',
11
+ protocol: 'Frax',
12
+ protocolDescription:
13
+ 'FPI is the first stablecoin pegged to a basket of real-world consumer items as defined by the US CPI-U average.',
14
+ website: 'https://frax.finance/',
15
+ logoUrl: `${STAKE_DAO_ASSETS_BASE_URL}/assets/archive/fpis.svg`,
16
+ chainId: 1,
17
+ rgb: '0, 0, 0',
18
+ token: tokenWithId('fpis')!,
19
+ sdToken: tokenWithId('sdfpis')!,
20
+ rewards: [{ ...tokenWithId('fpis')!, distribution: 'streamed', origin: 'native.common' }],
21
+ modules: {
22
+ depositor: '0x0000000000000000000000000000000000000000',
23
+ locker: '0x1ce5181124c33Abc281BF0F07eF4fB8573556aA5',
24
+ veToken: '0x574C154C83432B0A45BA3ad2429C3fA242eD7359',
25
+ gauge: '0xE58101D3848E12dAD6d7B5981dC11411bb267D2f',
26
+ accumulator: '0x644a15E85Aa4A56Afe1461e7ff4F75D733B26322',
27
+ redeem: '0x3e88f78D4e961366117EBC015e1EE8944EfbC574',
28
+ },
29
+ secondaryMarket: {
30
+ label: 'Curve',
31
+ poolKey: 'factory-v2-288',
32
+ vaultKey: '',
33
+ pool: '0x06c21b5d004604250a7f9639c4a3c28e73742261',
34
+ pools: ['0x06c21b5d004604250a7f9639c4a3c28e73742261'],
35
+ pegBase: 500,
36
+ },
37
+ fees: [
38
+ {
39
+ label: { key: 'liquidity', variable: 'sdFPIS/FPIS' },
40
+ value: 10,
41
+ key: 'liquidityFee',
42
+ },
43
+ {
44
+ label: { key: 'treasury' },
45
+ value: 5,
46
+ key: 'daoFee',
47
+ },
48
+ {
49
+ label: { key: 'harvester' },
50
+ value: 0.1,
51
+ key: 'claimerFee',
52
+ },
53
+ ],
54
+ extensions: {
55
+ coingeckoBaseSlug: 'frax-price-index-share',
56
+ },
57
+ }
58
+
59
+ const fraxFpisLocker = async ({ provider, common, prices }: { provider; common; prices }) => {
60
+ const token = locker.token.address
61
+ const sdToken = locker.sdToken.address
62
+
63
+ const gauge = locker.modules.gauge
64
+ const depositor = locker.modules.depositor
65
+ const votingEscrow = locker.modules.veToken
66
+ const lockerAddress = locker.modules.locker
67
+
68
+ const secondaryMarket = locker.secondaryMarket!
69
+ const rewards = locker.rewards
70
+
71
+ const format = (value: bigint) => formatUnits(value, locker.token.decimals)
72
+ const formatRes = (value: any) => format(getRes(value))
73
+
74
+ const calls: Call[] = [
75
+ /*********************************************************************************
76
+ *** Voting Escrow
77
+ *********************************************************************************/
78
+
79
+ // Token locked by the Locker
80
+ { address: votingEscrow, name: 'locked', params: [lockerAddress] },
81
+ // veToken Balance of the Locker
82
+ { address: votingEscrow, name: 'balanceOf', params: [lockerAddress] },
83
+ // Total token locked
84
+ { address: votingEscrow, name: 'supply' },
85
+ // Total veToken supply
86
+ { address: votingEscrow, name: 'totalSupply' },
87
+
88
+ /*********************************************************************************
89
+ *** Gauge
90
+ *********************************************************************************/
91
+
92
+ // Total sdToken staked
93
+ { address: gauge, name: 'totalSupply' },
94
+ // Gauge working supply
95
+ { address: gauge, name: 'working_supply' },
96
+
97
+ /*********************************************************************************
98
+ *** Token & sdToken
99
+ *********************************************************************************/
100
+
101
+ // Token balance not locked
102
+ { address: token, name: 'balanceOf', params: [depositor] },
103
+ // sdToken in secondary market pool
104
+ { address: sdToken, name: 'balanceOf', params: [secondaryMarket.pool] },
105
+
106
+ /*********************************************************************************
107
+ *** Rewards
108
+ *********************************************************************************/
109
+
110
+ // Streaming status for each reward token
111
+ ...rewards.map((r) => ({ address: gauge, name: 'reward_data', params: [r.address] })),
112
+ ]
113
+
114
+ const res = await multicall(provider, calls, lockersMulticallAbi(locker.id, locker.chainId))
115
+ const raw = {
116
+ tokenLocked: getRes(res.shift()),
117
+ veBalanceOfLocker: formatRes(res.shift()),
118
+ totalTokenLocked: formatRes(res.shift()),
119
+ veTotalSupply: formatRes(res.shift()),
120
+ totalSupplyStaked: formatRes(res.shift()),
121
+ gaugeWorkingSupply: formatRes(res.shift()),
122
+ amountTokenNotLock: formatRes(res.shift()),
123
+ sdTokenInPool: formatRes(res.shift()),
124
+ peg: '-',
125
+ rewards: rewards.map(() => getRes(res.shift())),
126
+ veTokenRate: '4',
127
+ _workingSupply: '0',
128
+ _veBalanceOfLocker: '0',
129
+ }
130
+
131
+ raw.tokenLocked = format(raw.tokenLocked[0])
132
+ raw.peg = parsePeg(locker, raw.peg)
133
+ raw._workingSupply = raw.gaugeWorkingSupply
134
+ raw._veBalanceOfLocker = raw.veBalanceOfLocker
135
+
136
+ return parse({ locker, common, prices, raw })
137
+ }
138
+
139
+ export default fraxFpisLocker