Skip to content

Commit 63f1b56

Browse files
authored
v0.5.1 (#223)
2 parents 620a28f + 8134c49 commit 63f1b56

File tree

67 files changed

+4884
-1305
lines changed

Some content is hidden

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

67 files changed

+4884
-1305
lines changed

.gitignore

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -12,3 +12,4 @@ refs/
1212
.vscode
1313
remix-compiler.config.js
1414
foundry
15+
.npmrc

contracts/interfaces/staking/ICandidateStaking.sol

Lines changed: 7 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -7,8 +7,8 @@ import "./IRewardPool.sol";
77
interface ICandidateStaking is IRewardPool {
88
/// @dev Emitted when the minimum staking amount for being a validator is updated.
99
event MinValidatorStakingAmountUpdated(uint256 threshold);
10-
/// @dev Emitted when the max commission rate is updated.
11-
event MaxCommissionRateUpdated(uint256 maxRate);
10+
/// @dev Emitted when the commission rate range is updated.
11+
event CommissionRateRangeUpdated(uint256 minRate, uint256 maxRate);
1212

1313
/// @dev Emitted when the pool admin staked for themself.
1414
event Staked(address indexed consensuAddr, uint256 amount);
@@ -57,9 +57,9 @@ interface ICandidateStaking is IRewardPool {
5757
function minValidatorStakingAmount() external view returns (uint256);
5858

5959
/**
60-
* @dev Returns the max commission rate that the candidate can set.
60+
* @dev Returns the commission rate range that the candidate can set.
6161
*/
62-
function maxCommissionRate() external view returns (uint256);
62+
function getCommissionRateRange() external view returns (uint256 _minRange, uint256 _maxRange);
6363

6464
/**
6565
* @dev Sets the minimum threshold for being a validator candidate.
@@ -73,15 +73,15 @@ interface ICandidateStaking is IRewardPool {
7373
function setMinValidatorStakingAmount(uint256) external;
7474

7575
/**
76-
* @dev Sets the max commission rate that a candidate can set.
76+
* @dev Sets the commission rate range that a candidate can set.
7777
*
7878
* Requirements:
7979
* - The method caller is admin.
8080
*
81-
* Emits the `MaxCommissionRateUpdated` event.
81+
* Emits the `CommissionRateRangeUpdated` event.
8282
*
8383
*/
84-
function setMaxCommissionRate(uint256 _maxRate) external;
84+
function setCommissionRateRange(uint256 _minRate, uint256 _maxRate) external;
8585

8686
/**
8787
* @dev Proposes a candidate to become a validator.

contracts/ronin/Maintenance.sol

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -98,9 +98,9 @@ contract Maintenance is IMaintenance, HasValidatorContract, Initializable {
9898
"Maintenance: start block is out of offset"
9999
);
100100
require(_startedAtBlock < _endedAtBlock, "Maintenance: start block must be less than end block");
101-
uint256 _blockPeriod = _endedAtBlock - _startedAtBlock;
101+
uint256 _maintenanceElapsed = _endedAtBlock - _startedAtBlock + 1;
102102
require(
103-
_blockPeriod.inRange(minMaintenanceDurationInBlock, maxMaintenanceDurationInBlock),
103+
_maintenanceElapsed.inRange(minMaintenanceDurationInBlock, maxMaintenanceDurationInBlock),
104104
"Maintenance: invalid maintenance duration"
105105
);
106106
require(_validator.epochEndingAt(_startedAtBlock - 1), "Maintenance: start block is not at the start of an epoch");

contracts/ronin/gateway/PauseEnforcer.sol

Lines changed: 0 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -87,17 +87,6 @@ contract PauseEnforcer is AccessControlEnumerable {
8787
emit EmergencyUnpaused(msg.sender);
8888
}
8989

90-
/**
91-
* @dev Helper function to reset emergency status.
92-
*/
93-
function resetEmergency() external {
94-
require(
95-
hasRole(DEFAULT_ADMIN_ROLE, msg.sender) || hasRole(SENTRY_ROLE, msg.sender),
96-
"PauseEnforcer: Unauthorized reset"
97-
);
98-
emergency = false;
99-
}
100-
10190
/**
10291
* @dev Setter for `target`.
10392
*

contracts/ronin/staking/CandidateStaking.sol

Lines changed: 13 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -14,12 +14,14 @@ abstract contract CandidateStaking is BaseStaking, ICandidateStaking, GlobalConf
1414

1515
/// @dev The max commission rate that the validator can set (in range of [0;100_00] means [0-100%])
1616
uint256 internal _maxCommissionRate;
17+
/// @dev The min commission rate that the validator can set (in range of [0;100_00] means [0-100%])
18+
uint256 internal _minCommissionRate;
1719

1820
/**
1921
* @dev This empty reserved space is put in place to allow future versions to add new
2022
* variables without shifting down storage in the inheritance chain.
2123
*/
22-
uint256[49] ______gap;
24+
uint256[48] ______gap;
2325

2426
/**
2527
* @inheritdoc ICandidateStaking
@@ -31,8 +33,8 @@ abstract contract CandidateStaking is BaseStaking, ICandidateStaking, GlobalConf
3133
/**
3234
* @inheritdoc ICandidateStaking
3335
*/
34-
function maxCommissionRate() external view override returns (uint256) {
35-
return _maxCommissionRate;
36+
function getCommissionRateRange() external view override returns (uint256, uint256) {
37+
return (_minCommissionRate, _maxCommissionRate);
3638
}
3739

3840
/**
@@ -45,8 +47,8 @@ abstract contract CandidateStaking is BaseStaking, ICandidateStaking, GlobalConf
4547
/**
4648
* @inheritdoc ICandidateStaking
4749
*/
48-
function setMaxCommissionRate(uint256 _maxRate) external override onlyAdmin {
49-
_setMaxCommissionRate(_maxRate);
50+
function setCommissionRateRange(uint256 _minRate, uint256 _maxRate) external override onlyAdmin {
51+
_setCommissionRateRange(_minRate, _maxRate);
5052
}
5153

5254
/**
@@ -60,7 +62,7 @@ abstract contract CandidateStaking is BaseStaking, ICandidateStaking, GlobalConf
6062
uint256 _commissionRate
6163
) external payable override nonReentrant {
6264
if (isAdminOfActivePool(msg.sender)) revert ErrAdminOfAnyActivePoolForbidden(msg.sender);
63-
if (_commissionRate > _maxCommissionRate) revert ErrInvalidCommissionRate();
65+
if (_commissionRate > _maxCommissionRate || _commissionRate < _minCommissionRate) revert ErrInvalidCommissionRate();
6466

6567
uint256 _amount = msg.value;
6668
address payable _poolAdmin = payable(msg.sender);
@@ -91,7 +93,7 @@ abstract contract CandidateStaking is BaseStaking, ICandidateStaking, GlobalConf
9193
uint256 _effectiveDaysOnwards,
9294
uint256 _commissionRate
9395
) external override poolIsActive(_consensusAddr) onlyPoolAdmin(_stakingPool[_consensusAddr], msg.sender) {
94-
if (_commissionRate > _maxCommissionRate) revert ErrInvalidCommissionRate();
96+
if (_commissionRate > _maxCommissionRate || _commissionRate < _minCommissionRate) revert ErrInvalidCommissionRate();
9597
_validatorContract.execRequestUpdateCommissionRate(_consensusAddr, _effectiveDaysOnwards, _commissionRate);
9698
}
9799

@@ -192,8 +194,6 @@ abstract contract CandidateStaking is BaseStaking, ICandidateStaking, GlobalConf
192194
if (!_unsafeSendRON(_poolAdmin, 0)) revert ErrCannotInitTransferRON(_poolAdmin, "pool admin");
193195
if (!_unsafeSendRON(_treasuryAddr, 0)) revert ErrCannotInitTransferRON(_treasuryAddr, "treasury");
194196
if (_amount < _minValidatorStakingAmount) revert ErrInsufficientStakingAmount();
195-
if (_commissionRate > _maxCommissionRate) revert ErrInvalidCommissionRate();
196-
197197
if (_poolAdmin != _candidateAdmin || _candidateAdmin != _treasuryAddr) revert ErrThreeInteractionAddrsNotEqual();
198198

199199
address[] memory _diffAddrs = new address[](3);
@@ -269,9 +269,10 @@ abstract contract CandidateStaking is BaseStaking, ICandidateStaking, GlobalConf
269269
* Emits the `MaxCommissionRateUpdated` event.
270270
*
271271
*/
272-
function _setMaxCommissionRate(uint256 _maxRate) internal {
273-
if (_maxRate > _MAX_PERCENTAGE) revert ErrInvalidCommissionRate();
272+
function _setCommissionRateRange(uint256 _minRate, uint256 _maxRate) internal {
273+
if (_maxRate > _MAX_PERCENTAGE || _minRate > _maxRate) revert ErrInvalidCommissionRate();
274274
_maxCommissionRate = _maxRate;
275-
emit MaxCommissionRateUpdated(_maxRate);
275+
_minCommissionRate = _minRate;
276+
emit CommissionRateRangeUpdated(_minRate, _maxRate);
276277
}
277278
}

contracts/ronin/staking/DelegatorStaking.sol

Lines changed: 6 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -150,9 +150,12 @@ abstract contract DelegatorStaking is BaseStaking, IDelegatorStaking {
150150
) private notPoolAdmin(_pool, _delegator) {
151151
if (_amount == 0) revert ErrUndelegateZeroAmount();
152152
if (_pool.delegatingAmount[_delegator] < _amount) revert ErrInsufficientDelegatingAmount();
153-
if (_pool.lastDelegatingTimestamp[_delegator] + _cooldownSecsToUndelegate >= block.timestamp) {
154-
revert ErrUndelegateTooEarly();
155-
}
153+
154+
if (
155+
_validatorContract.isValidatorCandidate(_pool.addr) &&
156+
_validatorContract.getCandidateInfo(_pool.addr).revokingTimestamp == 0 && // if candidate is not on renunciation
157+
_pool.lastDelegatingTimestamp[_delegator] + _cooldownSecsToUndelegate >= block.timestamp // delegator is still in cooldown
158+
) revert ErrUndelegateTooEarly();
156159

157160
_changeDelegatingAmount(
158161
_pool,

contracts/ronin/staking/Staking.sol

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -30,7 +30,7 @@ contract Staking is IStaking, CandidateStaking, DelegatorStaking, Initializable
3030
) external initializer {
3131
_setValidatorContract(__validatorContract);
3232
_setMinValidatorStakingAmount(__minValidatorStakingAmount);
33-
_setMaxCommissionRate(__maxCommissionRate);
33+
_setCommissionRateRange(0, __maxCommissionRate);
3434
_setCooldownSecsToUndelegate(__cooldownSecsToUndelegate);
3535
_setWaitingSecsToRevoke(__waitingSecsToRevoke);
3636
}

contracts/ronin/validator/CoinbaseExecution.sol

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -80,8 +80,8 @@ abstract contract CoinbaseExecution is
8080
}
8181

8282
_reward -= _cutOffReward;
83-
uint256 _maxRate = _stakingContract.maxCommissionRate();
84-
uint256 _rate = Math.min(_candidateInfo[msg.sender].commissionRate, _maxRate);
83+
(uint256 _minRate, uint256 _maxRate) = _stakingContract.getCommissionRateRange();
84+
uint256 _rate = Math.max(Math.min(_candidateInfo[msg.sender].commissionRate, _maxRate), _minRate);
8585
uint256 _miningAmount = (_rate * _reward) / _MAX_PERCENTAGE;
8686
_miningReward[msg.sender] += _miningAmount;
8787

deployments/ronin-mainnet/MaintenanceLogic.json

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

deployments/ronin-mainnet/RoninGatewayPauseEnforcer.json

Lines changed: 31 additions & 41 deletions
Large diffs are not rendered by default.

0 commit comments

Comments
 (0)