diff --git a/contracts/rewards/GenericMultiRewardsVault.sol b/contracts/rewards/GenericMultiRewardsVault.sol index 4ec702f..bf51824 100644 --- a/contracts/rewards/GenericMultiRewardsVault.sol +++ b/contracts/rewards/GenericMultiRewardsVault.sol @@ -112,6 +112,7 @@ contract GenericMultiRewardsVault is ERC4626, Ownable { mapping(IERC20 rewardToken => RewardInfo rewardInfo) public rewardInfos; mapping(IERC20 rewardToken => address distributor) public distributorInfo; mapping(IERC20 rewardToken => uint256 excessRewards) public leftoverRewards; + mapping(IERC20 rewardToken => bool isBlocked) public isRewardTokenBlocked; mapping(address user => mapping(IERC20 rewardToken => uint256 rewardIndex)) public userIndex; // {qRewardTok} mapping(address user => mapping(IERC20 rewardToken => uint256 accruedRewards)) public accruedRewards; // {qRewardTok} @@ -135,6 +136,9 @@ contract GenericMultiRewardsVault is ERC4626, Ownable { if (asset() == address(rewardToken)) { revert Errors.RewardTokenCanNotBeStakingToken(); } + if (isRewardTokenBlocked[rewardToken]) { + revert Errors.RewardTokenBlocked(rewardToken); + } RewardInfo memory rewards = rewardInfos[rewardToken]; if (rewards.lastUpdatedTimestamp > 0) { @@ -183,6 +187,9 @@ contract GenericMultiRewardsVault is ERC4626, Ownable { if (rewards.lastUpdatedTimestamp == 0) { revert Errors.InvalidRewardToken(rewardToken); } + if (isRewardTokenBlocked[rewardToken]) { + revert Errors.RewardTokenAlreadyBlocked(rewardToken); + } if (_accrue) { _accrueRewards(rewardToken, _accrueStatic(rewards)); } @@ -190,6 +197,7 @@ contract GenericMultiRewardsVault is ERC4626, Ownable { delete rewardInfos[rewardToken]; delete distributorInfo[rewardToken]; delete leftoverRewards[rewardToken]; + isRewardTokenBlocked[rewardToken] = true; uint256 totalRewardTokens = rewardTokens.length; diff --git a/contracts/rewards/definitions.sol b/contracts/rewards/definitions.sol index 0eebc08..c883bb6 100644 --- a/contracts/rewards/definitions.sol +++ b/contracts/rewards/definitions.sol @@ -15,13 +15,13 @@ struct RewardInfo { } abstract contract Errors { - // Reward Token Management - error InvalidRewardToken(IERC20 rewardToken); - // Reward Management + error InvalidRewardToken(IERC20 rewardToken); + error RewardTokenAlreadyBlocked(IERC20 rewardToken); error RewardTokenAlreadyExist(IERC20 rewardToken); error RewardTokenDoesNotExist(IERC20 rewardToken); error RewardTokenCanNotBeStakingToken(); + error RewardTokenBlocked(IERC20 rewardToken); error ZeroAmount(); error RewardsAreDynamic(IERC20 rewardToken); error ZeroRewardsSpeed();