// SPDX-License-Identifier: GPL-2.0-or-later pragma solidity >=0.8.0; import './IElection.sol'; import './IStake.sol'; /// @dev MajorCandidates interface /// @author Alexandas interface IMajorCandidates { /// @dev emit when max major candidates changed /// @param max max major candidates event MaxMajorCandidateUpdated(uint256 max); /// @dev emit when `Election` contract changed /// @param election `Election` contract address event ElectionUpdated(IElection election); /// @dev emit when `Stake` contract updated /// @param stake `Stake` contract event StakeUpdated(IStake stake); /// @dev emit when a candidate insert or update in the sorted list /// @param candidate candidate address /// @param amount candidate votes event UpsetCandidate(address candidate, uint256 amount); /// @dev emit when a candidate removed from the sorted list /// @param candidate candidate address event RemoveCandidate(address candidate); /// @dev insert or update a candidate in the sorted list /// @param candidate candidate address /// @param amount candidate votes /// @param anchor anchor candidate address /// @param maxSlippage maximum rank change value for the candidate from the anchor candidate function upsetCandidateWithAnchor( address candidate, uint256 amount, address anchor, uint256 maxSlippage ) external; /// @dev emit removed a candidate from the sorted list /// @param candidate candidate address function remove(address candidate) external; /// @dev return max major candidates function MAX_MAJOR_CANDIDATES() external view returns(uint256); /// @dev return `Election` contract address function election() external view returns(IElection); /// @dev return `Stake` contract address function stake() external view returns(IStake); /// @dev return whether a candidate is existed in the sorted list /// @param candidate candidate address /// @return whether the candidate is existed in the sorted list function exists(address candidate) external view returns (bool); /// @dev return whether a candidate is a major candidate /// @param candidate candidate address /// @return existed the candidate is a major candidate function isMajor(address candidate) external view returns(bool existed); /// @dev return all major candidates /// @return majors all major candidates function majorCandidateList() external view returns(address[] memory majors); }