@@ -9,6 +9,8 @@ import { ComptrollerExtensionInterface } from "../compound/ComptrollerInterface.
99import { ERC20 } from "@openzeppelin/contracts/token/ERC20/ERC20.sol " ;
1010
1111import { Ownable2StepUpgradeable } from "@openzeppelin-contracts-upgradeable/contracts/access/Ownable2StepUpgradeable.sol " ;
12+ import { veIONSecondExtension } from "./veIONSecondExtension.sol " ;
13+ import { Voter } from "./Voter.sol " ;
1214
1315contract VoterLens is Initializable , Ownable2StepUpgradeable {
1416 struct BribeInfo {
@@ -17,6 +19,13 @@ contract VoterLens is Initializable, Ownable2StepUpgradeable {
1719 address bribeBorrow;
1820 }
1921
22+ struct MarketVoteInfo {
23+ address market;
24+ IVoter.MarketSide side;
25+ uint256 votes;
26+ uint256 votesValueInEth;
27+ }
28+
2029 struct IncentiveInfo {
2130 address market;
2231 address bribeSupply;
@@ -33,6 +42,7 @@ contract VoterLens is Initializable, Ownable2StepUpgradeable {
3342 PoolDirectory poolDirectory;
3443 IMasterPriceOracle mpo;
3544 uint256 constant PRECISION = 1e18 ;
45+ address veIONAddress;
3646
3747 function initialize (address _voter , PoolDirectory _poolDirectory ) public initializer {
3848 voter = _voter;
@@ -133,19 +143,129 @@ contract VoterLens is Initializable, Ownable2StepUpgradeable {
133143 }
134144 }
135145
146+ struct UserBribes {
147+ uint256 tokenId;
148+ address market;
149+ address bribe;
150+ address reward;
151+ uint256 earned;
152+ }
153+
154+ struct UserBribeVars {
155+ uint256 [] userTokens;
156+ address [] lpTokens;
157+ uint256 count;
158+ IVoter.VoteDetails voteDetails;
159+ address rewardAccumulator;
160+ address bribeRewards;
161+ uint256 bribesLength;
162+ address reward;
163+ uint256 rewardEarned;
164+ }
165+
166+ function getUserBribeRewards (address _user ) external view returns (UserBribes[] memory _userBribes ) {
167+ UserBribeVars memory vars;
168+ vars.userTokens = veIONSecondExtension (veIONAddress).getOwnedTokenIds (_user);
169+ vars.lpTokens = Voter (voter).getAllLpRewardTokens ();
170+ vars.count = 0 ;
171+
172+ for (uint256 i = 0 ; i < vars.userTokens.length ; i++ ) {
173+ for (uint256 j = 0 ; j < vars.lpTokens.length ; j++ ) {
174+ vars.voteDetails = IVoterView (voter).getVoteDetails (vars.userTokens[i], vars.lpTokens[j]);
175+ for (uint256 k; k < vars.voteDetails.marketVotes.length ; k++ ) {
176+ vars.rewardAccumulator = IVoterView (voter).marketToRewardAccumulators (
177+ vars.voteDetails.marketVotes[k],
178+ vars.voteDetails.marketVoteSides[k]
179+ );
180+ vars.bribeRewards = IVoterView (voter).rewardAccumulatorToBribe (vars.rewardAccumulator);
181+ vars.bribesLength = IBribeRewardsView (vars.bribeRewards).rewardsListLength ();
182+ for (uint256 x; x < vars.bribesLength; x++ ) {
183+ vars.reward = IBribeRewardsView (vars.bribeRewards).rewards (x);
184+ vars.rewardEarned = IBribeRewardsView (vars.bribeRewards).earned (vars.reward, vars.userTokens[i]);
185+ if (vars.rewardEarned != 0 ) vars.count++ ;
186+ }
187+ }
188+ }
189+ }
190+
191+ _userBribes = new UserBribes [](vars.count);
192+ vars.count = 0 ;
193+ for (uint256 i = 0 ; i < vars.userTokens.length ; i++ ) {
194+ for (uint256 j = 0 ; j < vars.lpTokens.length ; j++ ) {
195+ vars.voteDetails = IVoterView (voter).getVoteDetails (vars.userTokens[i], vars.lpTokens[j]);
196+ for (uint256 k; k < vars.voteDetails.marketVotes.length ; k++ ) {
197+ vars.rewardAccumulator = IVoterView (voter).marketToRewardAccumulators (
198+ vars.voteDetails.marketVotes[k],
199+ vars.voteDetails.marketVoteSides[k]
200+ );
201+ vars.bribeRewards = IVoterView (voter).rewardAccumulatorToBribe (vars.rewardAccumulator);
202+ vars.bribesLength = IBribeRewardsView (vars.bribeRewards).rewardsListLength ();
203+ for (uint256 x; x < vars.bribesLength; x++ ) {
204+ vars.reward = IBribeRewardsView (vars.bribeRewards).rewards (x);
205+ vars.rewardEarned = IBribeRewardsView (vars.bribeRewards).earned (vars.reward, vars.userTokens[i]);
206+ if (vars.rewardEarned != 0 ) {
207+ _userBribes[vars.count].tokenId = vars.userTokens[i];
208+ _userBribes[vars.count].market = vars.voteDetails.marketVotes[k];
209+ _userBribes[vars.count].bribe = vars.bribeRewards;
210+ _userBribes[vars.count].reward = vars.reward;
211+ _userBribes[vars.count].earned = vars.rewardEarned;
212+
213+ vars.count++ ;
214+ }
215+ }
216+ }
217+ }
218+ }
219+ }
220+
221+ function getAllMarketVotes (address lp ) public view returns (MarketVoteInfo[] memory _marketVoteInfo ) {
222+ uint256 marketsLength = IVoter (voter).marketsLength ();
223+ _marketVoteInfo = new MarketVoteInfo [](marketsLength);
224+ for (uint256 i; i < marketsLength; i++ ) {
225+ IVoter.Market memory _market = IVoterView (voter).markets (i);
226+ _marketVoteInfo[i].market = _market.marketAddress;
227+ _marketVoteInfo[i].side = _market.side;
228+ _marketVoteInfo[i].votes = IVoterView (voter).weights (_market.marketAddress, _market.side, lp);
229+
230+ _marketVoteInfo[i].votesValueInEth =
231+ (_marketVoteInfo[i].votes * 10 ** (18 - ERC20 (lp).decimals ()) * mpo.price (lp)) /
232+ PRECISION;
233+ }
234+ }
235+
236+ function getTotalMarketVotes () external view returns (uint256 _total ) {
237+ address [] memory lpTokens = IVoter (voter).getAllLpRewardTokens ();
238+ for (uint256 i = 0 ; i < lpTokens.length ; i++ ) {
239+ MarketVoteInfo[] memory marketVotes = getAllMarketVotes (lpTokens[i]);
240+ for (uint256 j = 0 ; j < marketVotes.length ; j++ ) {
241+ _total += marketVotes[j].votesValueInEth;
242+ }
243+ }
244+ }
245+
136246 function setMasterPriceOracle (address _masterPriceOracle ) external onlyOwner {
137247 mpo = IMasterPriceOracle (_masterPriceOracle);
138248 }
249+
250+ function setVeIONAddress (address _veIONAddress ) external onlyOwner {
251+ veIONAddress = _veIONAddress;
252+ }
139253}
140254
141255interface IVoterView {
142256 function rewardAccumulatorToBribe (address rewardAccumulator ) external view returns (address );
143257 function marketToRewardAccumulators (address market , IVoter.MarketSide marketSide ) external view returns (address );
258+ function marketVote (uint256 tokenId , address lpAsset ) external view returns (address [] memory );
259+ function marketVoteSide (uint256 tokenId , address lpAsset ) external view returns (IVoter.MarketSide[] memory );
260+ function getVoteDetails (uint256 _tokenId , address _lpAsset ) external view returns (IVoter.VoteDetails memory );
261+ function markets (uint256 index ) external view returns (IVoter.Market memory );
262+ function weights (address market , IVoter.MarketSide marketSide , address lp ) external view returns (uint256 );
144263}
145264
146265interface IBribeRewardsView {
147266 function rewards (uint256 index ) external view returns (address );
148267 function rewardsListLength () external view returns (uint256 );
268+ function earned (address token , uint256 tokenId ) external view returns (uint256 );
149269}
150270
151271interface IMasterPriceOracle {
0 commit comments