diff --git a/contracts/extension/Staking1155.sol b/contracts/extension/Staking1155.sol index 385b31721..661ba0f1f 100644 --- a/contracts/extension/Staking1155.sol +++ b/contracts/extension/Staking1155.sol @@ -110,6 +110,8 @@ abstract contract Staking1155 is ReentrancyGuard, IStaking1155 { StakingCondition memory condition = _nextConditionId == 0 ? defaultCondition[nextDefaultConditionId - 1] : stakingConditions[_tokenId][_nextConditionId - 1]; + require(_timeUnit != condition.timeUnit, "Time-unit unchanged."); + _setStakingCondition(_tokenId, _timeUnit, condition.rewardsPerUnitTime); emit UpdatedTimeUnit(_tokenId, condition.timeUnit, _timeUnit); @@ -134,6 +136,8 @@ abstract contract Staking1155 is ReentrancyGuard, IStaking1155 { StakingCondition memory condition = _nextConditionId == 0 ? defaultCondition[nextDefaultConditionId - 1] : stakingConditions[_tokenId][_nextConditionId - 1]; + require(_rewardsPerUnitTime != condition.rewardsPerUnitTime, "Reward unchanged."); + _setStakingCondition(_tokenId, condition.timeUnit, _rewardsPerUnitTime); emit UpdatedRewardsPerUnitTime(_tokenId, condition.rewardsPerUnitTime, _rewardsPerUnitTime); @@ -153,6 +157,8 @@ abstract contract Staking1155 is ReentrancyGuard, IStaking1155 { } StakingCondition memory _defaultCondition = defaultCondition[nextDefaultConditionId - 1]; + require(_defaultTimeUnit != _defaultCondition.timeUnit, "Default time-unit unchanged."); + _setDefaultStakingCondition(_defaultTimeUnit, _defaultCondition.rewardsPerUnitTime); emit UpdatedDefaultTimeUnit(_defaultCondition.timeUnit, _defaultTimeUnit); @@ -172,6 +178,8 @@ abstract contract Staking1155 is ReentrancyGuard, IStaking1155 { } StakingCondition memory _defaultCondition = defaultCondition[nextDefaultConditionId - 1]; + require(_defaultRewardsPerUnitTime != _defaultCondition.rewardsPerUnitTime, "Default reward unchanged."); + _setDefaultStakingCondition(_defaultCondition.timeUnit, _defaultRewardsPerUnitTime); emit UpdatedDefaultRewardsPerUnitTime(_defaultCondition.rewardsPerUnitTime, _defaultRewardsPerUnitTime); diff --git a/contracts/extension/Staking1155Upgradeable.sol b/contracts/extension/Staking1155Upgradeable.sol index a0fc25a38..f546ee549 100644 --- a/contracts/extension/Staking1155Upgradeable.sol +++ b/contracts/extension/Staking1155Upgradeable.sol @@ -112,6 +112,8 @@ abstract contract Staking1155Upgradeable is ReentrancyGuardUpgradeable, IStaking StakingCondition memory condition = _nextConditionId == 0 ? defaultCondition[nextDefaultConditionId - 1] : stakingConditions[_tokenId][_nextConditionId - 1]; + require(_timeUnit != condition.timeUnit, "Time-unit unchanged."); + _setStakingCondition(_tokenId, _timeUnit, condition.rewardsPerUnitTime); emit UpdatedTimeUnit(_tokenId, condition.timeUnit, _timeUnit); @@ -136,6 +138,8 @@ abstract contract Staking1155Upgradeable is ReentrancyGuardUpgradeable, IStaking StakingCondition memory condition = _nextConditionId == 0 ? defaultCondition[nextDefaultConditionId - 1] : stakingConditions[_tokenId][_nextConditionId - 1]; + require(_rewardsPerUnitTime != condition.rewardsPerUnitTime, "Reward unchanged."); + _setStakingCondition(_tokenId, condition.timeUnit, _rewardsPerUnitTime); emit UpdatedRewardsPerUnitTime(_tokenId, condition.rewardsPerUnitTime, _rewardsPerUnitTime); @@ -155,6 +159,8 @@ abstract contract Staking1155Upgradeable is ReentrancyGuardUpgradeable, IStaking } StakingCondition memory _defaultCondition = defaultCondition[nextDefaultConditionId - 1]; + require(_defaultTimeUnit != _defaultCondition.timeUnit, "Default time-unit unchanged."); + _setDefaultStakingCondition(_defaultTimeUnit, _defaultCondition.rewardsPerUnitTime); emit UpdatedDefaultTimeUnit(_defaultCondition.timeUnit, _defaultTimeUnit); @@ -174,6 +180,8 @@ abstract contract Staking1155Upgradeable is ReentrancyGuardUpgradeable, IStaking } StakingCondition memory _defaultCondition = defaultCondition[nextDefaultConditionId - 1]; + require(_defaultRewardsPerUnitTime != _defaultCondition.rewardsPerUnitTime, "Default reward unchanged."); + _setDefaultStakingCondition(_defaultCondition.timeUnit, _defaultRewardsPerUnitTime); emit UpdatedDefaultRewardsPerUnitTime(_defaultCondition.rewardsPerUnitTime, _defaultRewardsPerUnitTime); diff --git a/contracts/extension/Staking20.sol b/contracts/extension/Staking20.sol index abbf51b6d..4b38e49a1 100644 --- a/contracts/extension/Staking20.sol +++ b/contracts/extension/Staking20.sol @@ -101,6 +101,8 @@ abstract contract Staking20 is ReentrancyGuard, IStaking20 { } StakingCondition memory condition = stakingConditions[nextConditionId - 1]; + require(_timeUnit != condition.timeUnit, "Time-unit unchanged."); + _setStakingCondition(_timeUnit, condition.rewardRatioNumerator, condition.rewardRatioDenominator); emit UpdatedTimeUnit(condition.timeUnit, _timeUnit); @@ -123,6 +125,10 @@ abstract contract Staking20 is ReentrancyGuard, IStaking20 { } StakingCondition memory condition = stakingConditions[nextConditionId - 1]; + require( + _numerator != condition.rewardRatioNumerator || _denominator != condition.rewardRatioDenominator, + "Reward ratio unchanged." + ); _setStakingCondition(condition.timeUnit, _numerator, _denominator); emit UpdatedRewardRatio( diff --git a/contracts/extension/Staking20Upgradeable.sol b/contracts/extension/Staking20Upgradeable.sol index d88d574dd..b1b8bbb09 100644 --- a/contracts/extension/Staking20Upgradeable.sol +++ b/contracts/extension/Staking20Upgradeable.sol @@ -103,6 +103,8 @@ abstract contract Staking20Upgradeable is ReentrancyGuardUpgradeable, IStaking20 } StakingCondition memory condition = stakingConditions[nextConditionId - 1]; + require(_timeUnit != condition.timeUnit, "Time-unit unchanged."); + _setStakingCondition(_timeUnit, condition.rewardRatioNumerator, condition.rewardRatioDenominator); emit UpdatedTimeUnit(condition.timeUnit, _timeUnit); @@ -125,6 +127,10 @@ abstract contract Staking20Upgradeable is ReentrancyGuardUpgradeable, IStaking20 } StakingCondition memory condition = stakingConditions[nextConditionId - 1]; + require( + _numerator != condition.rewardRatioNumerator || _denominator != condition.rewardRatioDenominator, + "Reward ratio unchanged." + ); _setStakingCondition(condition.timeUnit, _numerator, _denominator); emit UpdatedRewardRatio( diff --git a/contracts/extension/Staking721.sol b/contracts/extension/Staking721.sol index 729c711e3..e7a8bcc3f 100644 --- a/contracts/extension/Staking721.sol +++ b/contracts/extension/Staking721.sol @@ -99,6 +99,8 @@ abstract contract Staking721 is ReentrancyGuard, IStaking721 { } StakingCondition memory condition = stakingConditions[nextConditionId - 1]; + require(_timeUnit != condition.timeUnit, "Time-unit unchanged."); + _setStakingCondition(_timeUnit, condition.rewardsPerUnitTime); emit UpdatedTimeUnit(condition.timeUnit, _timeUnit); @@ -119,6 +121,8 @@ abstract contract Staking721 is ReentrancyGuard, IStaking721 { } StakingCondition memory condition = stakingConditions[nextConditionId - 1]; + require(_rewardsPerUnitTime != condition.rewardsPerUnitTime, "Reward unchanged."); + _setStakingCondition(condition.timeUnit, _rewardsPerUnitTime); emit UpdatedRewardsPerUnitTime(condition.rewardsPerUnitTime, _rewardsPerUnitTime); diff --git a/contracts/extension/Staking721Upgradeable.sol b/contracts/extension/Staking721Upgradeable.sol index 41304c452..0cc7899ea 100644 --- a/contracts/extension/Staking721Upgradeable.sol +++ b/contracts/extension/Staking721Upgradeable.sol @@ -101,6 +101,8 @@ abstract contract Staking721Upgradeable is ReentrancyGuardUpgradeable, IStaking7 } StakingCondition memory condition = stakingConditions[nextConditionId - 1]; + require(_timeUnit != condition.timeUnit, "Time-unit unchanged."); + _setStakingCondition(_timeUnit, condition.rewardsPerUnitTime); emit UpdatedTimeUnit(condition.timeUnit, _timeUnit); @@ -121,6 +123,8 @@ abstract contract Staking721Upgradeable is ReentrancyGuardUpgradeable, IStaking7 } StakingCondition memory condition = stakingConditions[nextConditionId - 1]; + require(_rewardsPerUnitTime != condition.rewardsPerUnitTime, "Reward unchanged."); + _setStakingCondition(condition.timeUnit, _rewardsPerUnitTime); emit UpdatedRewardsPerUnitTime(condition.rewardsPerUnitTime, _rewardsPerUnitTime); diff --git a/src/test/staking/EditionStake.t.sol b/src/test/staking/EditionStake.t.sol index 91a332d65..3c8a36512 100644 --- a/src/test/staking/EditionStake.t.sol +++ b/src/test/staking/EditionStake.t.sol @@ -1079,7 +1079,7 @@ contract Macro_EditionStakeTest is BaseTest { stakeContract.withdraw(2, tokenAmount); // timeUnit can't be changed back to a nonzero value - newTimeUnit = 60; + newTimeUnit = 40; // vm.expectRevert(stdError.divisionError); vm.prank(deployer); stakeContract.setDefaultTimeUnit(newTimeUnit); diff --git a/src/test/staking/NFTStake.t.sol b/src/test/staking/NFTStake.t.sol index 802896194..15c808e01 100644 --- a/src/test/staking/NFTStake.t.sol +++ b/src/test/staking/NFTStake.t.sol @@ -287,7 +287,7 @@ contract NFTStakeTest is BaseTest { assertEq(timeUnit, stakeContract.getTimeUnit()); // set new value and check - uint256 newTimeUnit = 1 minutes; + uint256 newTimeUnit = 2 minutes; vm.prank(deployer); stakeContract.setTimeUnit(newTimeUnit); assertEq(newTimeUnit, stakeContract.getTimeUnit());