// SPDX-License-Identifier: GPL-2.0-or-later pragma solidity >=0.8.0; import './IRewarder.sol'; import './IStake.sol'; import './IMajorCandidates.sol'; import './IERC20.sol'; /// @dev Election contract interface /// @author Alexandas interface IElection { /// @dev emit when ERC20 token address updated /// @param token ERC20 token address event TokenUpdated(IERC20 token); /// @dev emit when `Rewarder` contract updated /// @param rewarder `Rewarder` contract event RewarderUpdated(IRewarder rewarder); /// @dev emit when `Stake` contract updated /// @param stake `Stake` contract event StakeUpdated(IStake stake); /// @dev emit when `MajorCandidates` contract updated /// @param majorCandidates `MajorCandidates` contract event MajorCandidatesUpdated(IMajorCandidates majorCandidates); /// @dev emit when vote frozen period updated /// @param period vote frozen period event VoteFrozenPeriodUpdated(uint256 period); /// @dev emit when shares updated for a specific candidate /// @param candidate candidate address event ShareUpdated(address candidate); /// @dev emit when voter voted for a candidate /// @param candidate candidate address /// @param voter voter address /// @param amount token amount event Vote(address candidate, address voter, uint256 amount); /// @dev emit when voter claimed the reward /// @param candidate candidate address /// @param voter voter address /// @param to receiver address /// @param amount reward amount event Claimed(address candidate, address voter, address to, uint256 amount); /// @dev emit when voter withdrawn the votes /// @param candidate candidate address /// @param voter voter address /// @param to receiver address /// @param amount reward amount event Withdrawn(address candidate, address voter, address to, uint256 amount); /// @dev voter vote a specific candidate /// @param candidate candidate address /// @param voter voter address /// @param amount reward amount /// @param anchor anchor candidate address /// @param maxSlippage maximum rank change value for the candidate from the anchor candidate function vote( address candidate, address voter, uint256 amount, address anchor, uint256 maxSlippage ) external; /// @dev voter claim reward for a specific candidate /// @param candidate candidate address /// @param to receiver address function claim(address candidate, address to) external; /// @dev voter withdraw reward for a specific candidate /// @param candidate candidate address /// @param amount reward amount /// @param to receiver address /// @param anchor anchor candidate address /// @param maxSlippage maximum rank change value for the candidate from the anchor candidate function withdraw( address candidate, uint256 amount, address to, address anchor, uint256 maxSlippage ) external; /// @dev voter withdraw votes and claim reward for a specific candidate /// @param candidate candidate address /// @param amount reward amount /// @param to receiver address /// @param anchor anchor candidate address /// @param maxSlippage maximum rank change value for the candidate from the anchor candidate function withdrawAndClaim( address candidate, uint256 amount, address to, address anchor, uint256 maxSlippage ) external; /// @dev candidate allocate reward for the voters /// @param candidate candidate address /// @param amount reward amount function onAllocate(address candidate, uint256 amount) external; /// @dev return ERC20 token address function token() external view returns(IERC20); /// @dev return `Rewarder` contract address function rewarder() external view returns(IRewarder); /// @dev return `Stake` contract address function stake() external view returns(IStake); /// @dev return `MajorCandidates` contract address function majorCandidates() external view returns(IMajorCandidates); /// @dev return precision for shares function ACC_PRECISION() external view returns(uint256); /// @dev return votes for a specific candidate /// @param candidate candidate address /// @return votes for a specific candidate function voteSupply(address candidate) external view returns(uint256); /// @dev pending reward for a voter given a candidate /// @param candidate candidate address /// @param voter voter address /// @return pending pending reward function pendingReward(address candidate, address voter) external view returns (uint256 pending); }