// SPDX-License-Identifier: GPL-2.0-or-later pragma solidity >=0.8.0; import './IElection.sol'; import './IMajorCandidates.sol'; import './ISlasher.sol'; import './IPools.sol'; import './ICandidateRegistry.sol'; /// @dev Stake interface /// @author Alexandas interface IStake is IPools, ICandidateRegistry { /// @dev emit when `Election` contract changed /// @param election `Election` contract address event ElectionUpdated(IElection election); /// @dev emit when `MajorCandidates` contract updated /// @param majorCandidates `MajorCandidates` contract event IMajorCandidatesUpdated(IMajorCandidates majorCandidates); /// @dev emit when `Slasher` contract updated /// @param slasher `Slasher` contract event SlasherUpdated(ISlasher slasher); /// @dev emit when minimum stake updated /// @param amount minimum stake event MinStakeUpdated(uint256 amount); /// @dev emit when stake frozen period updated /// @param period stake frozen period event StakeFrozenPeriodUpdated(uint256 period); /// @dev emit when claim frozen period updated /// @param period claim frozen period event ClaimFrozenPeriodUpdated(uint256 period); /// @dev emit when a candidate upgraded /// @param candidate candidate address /// @param fromGrade from grade /// @param toGrade to grade event Upgrade(address candidate, Types.Grade fromGrade, Types.Grade toGrade); /// @dev emit when a candidate downgraded /// @param candidate candidate address /// @param fromGrade from grade /// @param toGrade to grade event Downgrade(address candidate, Types.Grade fromGrade, Types.Grade toGrade); /// @dev emit when a candidate staked tokens /// @param from token consumer /// @param candidate candidate address /// @param amount token amount event Stake(address from, address candidate, uint256 amount); /// @dev emit when a candidate withdraw tokens /// @param candidate candidate address /// @param to token receiver /// @param amount token amount event Withdrawn(address candidate, address to, uint256 amount); /// @dev emit when a candidate claimed reward /// @param candidate candidate address /// @param to token receiver /// @param pending token amount event Claimed(address candidate, address to, uint256 pending); /// @dev emit when a candidate quit from the protocol /// @param grade candidate grade /// @param candidate candidate address event Quit(Types.Grade grade, address candidate); /// @dev emit when a candidate allocate reward for the voters /// @param candidate candidate address /// @param amount token amount event VoterAllocated(address candidate, uint256 amount); /// @dev emit when the reward for a candidate /// @param candidate candidate address /// @param amount token amount event CandidateAllocated(address candidate, uint256 amount); /// @dev emit when the vote reward coefficient updated /// @param coef vote reward coefficient event VoteRewardCoefUpdated(uint256 coef); /// @dev emit when drafted a slash /// @param candidate candidate address /// @param pendingSlash pending slash amount event DraftSlash(address candidate, uint256 pendingSlash); /// @dev emit when rejected a slash /// @param candidate candidate address /// @param pendingSlash pending slash amount event RejectSlash(address candidate, uint256 pendingSlash); /// @dev emit when executed a slash /// @param candidate candidate address /// @param pendingSlash pending slash amount /// @param beneficiaries slash reward beneficiaries /// @param amounts slash reward amounts /// @param burned burned amount event ExcuteSlash(address candidate, uint256 pendingSlash, address[] beneficiaries, uint256[] amounts, uint256 burned); /// @dev return `Election` contract function election() external view returns(IElection); /// @dev return `MajorCandidates` contract function majorCandidates() external view returns(IMajorCandidates); /// @dev return `Slasher` contract function slasher() external returns(ISlasher); /// @dev candidate stake tokens /// @param amount token amount function stake(uint256 amount) external; /// @dev register a candidate and stake tokens /// @param amount token amount /// @param manifest node manifest function registerAndStake(uint256 amount, string memory manifest) external; /// @dev candidate quit from the protocol /// @param to token receiver function quit(address to) external; /// @dev candidate claim reward from the protocol /// @param to token receiver function claim(address to) external; /// @dev candidate withdraw the tokens and claim reward from the protocol /// @param amount token amount /// @param to token receiver // function withdrawAndClaim(uint256 amount, address to) external; /// @dev return pending reward for a specific candidate /// @param candidate candidate address /// @return pending reward for the candidate function pendingReward(address candidate) external view returns (uint256 pending); /// @dev set voter slash reward coefficient /// @param coef voter reward coefficient function setVoteRewardCoef(uint256 coef) external; /// @dev set allocate the reward to voters from the candidate /// @param candidate candidate address function voterAllocate(address candidate) external; /// @dev return voter reward coefficient for a specific candidate /// @param candidate candidate address /// @return coef voter reward coefficient function voteRewardCoef(address candidate) external view returns (uint256 coef); /// @dev return pending voters allocation for a specific candidate /// @param candidate candidate address /// @return pending pending voters allocation function pendingVoterAllocation(address candidate) external view returns (uint256 pending); /// @dev return pending candidate allocation /// @param candidate candidate address /// @return pending pending candidate allocation function pendingCandidateAllocation(address candidate) external view returns (uint256 pending); /// @dev upgrade a candidate /// @param candidate candidate address function upgrade(address candidate) external; /// @dev downgrade a candidate /// @param candidate candidate address function downgrade(address candidate) external; /// @dev draft a slash for a candidate /// @param candidate candidate address /// @param amount slash amount /// @return pendingSlash real slash amount function draftSlash(address candidate, uint256 amount) external returns(uint256 pendingSlash); /// @dev reject a slash for a candidate /// @param candidate candidate address /// @param pendingSlash real slash amount function rejectSlash(address candidate, uint256 pendingSlash) external; /// @dev executed a slash for a candiate /// @param candidate candidate address /// @param slash slash amount /// @param beneficiaries slash reward beneficiaries /// @param amounts slash reward amounts /// @param burned burned amount function executeSlash( address candidate, uint256 slash, address[] memory beneficiaries, uint256[] memory amounts, uint256 burned ) external; }