diff --git a/contracts/Core/StakeManager.sol b/contracts/Core/StakeManager.sol index b4810bd5..71ba7715 100644 --- a/contracts/Core/StakeManager.sol +++ b/contracts/Core/StakeManager.sol @@ -456,6 +456,10 @@ contract StakeManager is Initializable, StakeStorage, StateManager, Pause, Stake return stakers[stakerId].epochFirstStakedOrLastPenalized; } + function maturitiesLength() external view override returns (uint32) { + return uint32(maturities.length); + } + /// @notice Internal function for setting stake of the staker /// @param _id of the staker /// @param _stake the amount of Razor tokens staked diff --git a/contracts/Core/interface/IStakeManager.sol b/contracts/Core/interface/IStakeManager.sol index b2e29c18..71f5208c 100644 --- a/contracts/Core/interface/IStakeManager.sol +++ b/contracts/Core/interface/IStakeManager.sol @@ -48,4 +48,6 @@ interface IStakeManager { function getStake(uint32 stakerId) external view returns (uint256); function getEpochFirstStakedOrLastPenalized(uint32 stakerId) external view returns (uint32); + + function maturitiesLength() external view returns (uint32); } diff --git a/contracts/Core/parameters/Governance.sol b/contracts/Core/parameters/Governance.sol index 0cbbe343..b63ebf96 100644 --- a/contracts/Core/parameters/Governance.sol +++ b/contracts/Core/parameters/Governance.sol @@ -6,6 +6,7 @@ import "./interfaces/IRewardManagerParams.sol"; import "./interfaces/IStakeManagerParams.sol"; import "./interfaces/IVoteManagerParams.sol"; import "./interfaces/ICollectionManagerParams.sol"; +import "./../interface/IStakeManager.sol"; import "../storage/Constants.sol"; import "./ACL.sol"; @@ -19,6 +20,7 @@ contract Governance is Initializable, ACL, Constants { IStakeManagerParams public stakeManagerParams; IVoteManagerParams public voteManagerParams; ICollectionManagerParams public collectionManagerParams; + IStakeManager public stakeManager; bytes32 public constant GOVERNER_ROLE = 0x704c992d358ec8f6051d88e5bd9f92457afedcbc3e2d110fcd019b5eda48e52e; @@ -37,6 +39,7 @@ contract Governance is Initializable, ACL, Constants { stakeManagerParams = IStakeManagerParams(stakeManagerAddress); voteManagerParams = IVoteManagerParams(voteManagerAddress); collectionManagerParams = ICollectionManagerParams(collectionManagerAddress); + stakeManager = IStakeManager(stakeManagerAddress); } function setPenaltyNotRevealNum(uint16 _penaltyNotRevealNumerator) external initialized onlyRole(GOVERNER_ROLE) { @@ -106,6 +109,7 @@ contract Governance is Initializable, ACL, Constants { } function setMaxAge(uint32 _maxAge) external initialized onlyRole(GOVERNER_ROLE) { + require(_maxAge <= stakeManager.maturitiesLength() * 10000, "Invalid Max Age Update"); emit ParameterChanged(msg.sender, "maxAge", _maxAge, block.timestamp); rewardManagerParams.setMaxAge(_maxAge); } diff --git a/test/Governance.js b/test/Governance.js index ba321d36..deefd9ba 100644 --- a/test/Governance.js +++ b/test/Governance.js @@ -188,6 +188,9 @@ describe('Governance contract Test', async () => { let tx = governance.setMaxCommission(toBigNumber('101')); await assertRevert(tx, 'Invalid Max Commission Update'); + tx = governance.setMaxAge(toBigNumber('1010001')); + await assertRevert(tx, 'Invalid Max Age Update'); + tx = governance.setSlashParams(toBigNumber('5000000'), toBigNumber('4000000'), toBigNumber('3000000')); await assertRevert(tx, 'Slash nums addtion exceeds 10mil');