Skip to content

Commit e53e306

Browse files
authored
Merge pull request #1078 from ionicprotocol/development
merge
2 parents 08853c4 + 24ac441 commit e53e306

108 files changed

Lines changed: 67326 additions & 82 deletions

File tree

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

packages/contracts/chainDeploy/mainnets/lisk.ts

Lines changed: 16 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,8 @@
11
import { lisk } from "@ionicprotocol/chains";
22

33
import { ChainDeployConfig, deployChainlinkOracle } from "../helpers";
4-
import { Address } from "viem";
4+
import { Address, formatEther, Hash, Hex, zeroAddress, parseEther } from "viem";
5+
56
import { HardhatRuntimeEnvironment } from "hardhat/types";
67
import { assetSymbols, ChainlinkSpecificParams, OracleTypes } from "@ionicprotocol/types";
78
import { addUnderlyingsToMpo } from "../helpers/oracles/utils";
@@ -26,7 +27,20 @@ export const deployConfig: ChainDeployConfig = {
2627
uniswapV3Quoter: lisk.chainAddresses.UNISWAP_V3?.QUOTER_V2 as Address
2728
},
2829
wtoken: lisk.chainAddresses.W_TOKEN as Address,
29-
nativeTokenUsdChainlinkFeed: lisk.chainAddresses.W_TOKEN_USD_CHAINLINK_PRICE_FEED as Address
30+
nativeTokenUsdChainlinkFeed: lisk.chainAddresses.W_TOKEN_USD_CHAINLINK_PRICE_FEED as Address,
31+
veION: {
32+
lpTokens: ["0x076d0CD6228B042aA28E1E6A0894Cf6C97abc23b"],
33+
lpStakingStrategies: ["VeloAeroStakingStrategy"],
34+
lpStakingWalletImplementations: ["VeloAeroStakingWallet"],
35+
lpExternalStakingContracts: ["0x6BFF62258b7BD76F79B4F0818cDDF3628A2fFA58"],
36+
lpTokenWhitelistStatuses: [true],
37+
lpTokenTypes: [0],
38+
minimumLockAmounts: [parseEther("0.01")],
39+
minimumLockDuration: 6 * 30 * 24 * 60 * 60,
40+
maxEarlyWithdrawFee: parseEther("0.8"),
41+
maxVotingNum: 20
42+
},
43+
ION: "0x3f608A49a3ab475dA7fBb167C1Be6b7a45cD7013"
3044
};
3145

3246
export const deploy = async ({

packages/contracts/contracts/test/DevTesting.t.sol

Lines changed: 425 additions & 8 deletions
Large diffs are not rendered by default.

packages/contracts/contracts/veION/VoterLens.sol

Lines changed: 120 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -9,6 +9,8 @@ import { ComptrollerExtensionInterface } from "../compound/ComptrollerInterface.
99
import { ERC20 } from "@openzeppelin/contracts/token/ERC20/ERC20.sol";
1010

1111
import { Ownable2StepUpgradeable } from "@openzeppelin-contracts-upgradeable/contracts/access/Ownable2StepUpgradeable.sol";
12+
import { veIONSecondExtension } from "./veIONSecondExtension.sol";
13+
import { Voter } from "./Voter.sol";
1214

1315
contract 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

141255
interface 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

146265
interface 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

151271
interface IMasterPriceOracle {

packages/contracts/deploy/21-deploy-veion.ts

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -67,8 +67,8 @@ const func: DeployFunction = async ({ viem, getNamedAccounts, deployments, getCh
6767
methodName: "initialize",
6868
args: [addressesProvider.address]
6969
}
70-
}
71-
// owner: deployer
70+
},
71+
owner: deployer
7272
}
7373
});
7474
if (veION.transactionHash) await publicClient.waitForTransactionReceipt({ hash: veION.transactionHash as Hash });

packages/contracts/deploy/22-deploy-voter.ts

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -285,6 +285,14 @@ const func: DeployFunction = async ({ viem, getNamedAccounts, deployments, getCh
285285
} catch (error) {
286286
console.error("Error setting max voting number:", error);
287287
}
288+
289+
try {
290+
const txHash = await voterLens.write.setVeIONAddress([veION.address], { from: deployer });
291+
await publicClient.waitForTransactionReceipt({ hash: txHash });
292+
console.log(`Successfully set ve to ${veION.address}`);
293+
} catch (error) {
294+
console.error("Error setting max voting number:", error);
295+
}
288296
};
289297

290298
func.tags = ["prod", "veion", "voter"];

packages/contracts/deployments/base/VoterLens.json

Lines changed: 115 additions & 9 deletions
Large diffs are not rendered by default.

packages/contracts/deployments/base/VoterLens_Implementation.json

Lines changed: 143 additions & 22 deletions
Large diffs are not rendered by default.

0 commit comments

Comments
 (0)