diff --git a/contracts/interfaces/IStaking.sol b/contracts/interfaces/IStaking.sol index c759298..9b6aad6 100644 --- a/contracts/interfaces/IStaking.sol +++ b/contracts/interfaces/IStaking.sol @@ -50,4 +50,8 @@ interface IStaking { /// @param serviceId. /// @return stakingState Staking state of the service. function getStakingState(uint256 serviceId) external view returns (StakingState stakingState); + + /// @dev Gets available rewards. + /// @return Available rewards amount. + function availableRewards() external view returns (uint256); } diff --git a/contracts/l2/ExternalStakingDistributor.sol b/contracts/l2/ExternalStakingDistributor.sol index 0823a6b..9fd2ec1 100644 --- a/contracts/l2/ExternalStakingDistributor.sol +++ b/contracts/l2/ExternalStakingDistributor.sol @@ -680,8 +680,12 @@ contract ExternalStakingDistributor is Implementation, ERC721TokenReceiver { } _locked = 2; - // Check for access: whitelisted managing agent or owner - if (!mapManagingAgents[msg.sender] && msg.sender != owner) { + // Get staking proxy available rewards amount + uint256 availableRewards = IStaking(stakingProxy).availableRewards(); + + // Check for zero rewards balance and access: whitelisted managing agent or owner + // msg.sender does not matter if rewards are no longer available + if (availableRewards > 0 && !mapManagingAgents[msg.sender] && msg.sender != owner) { revert UnauthorizedAccount(msg.sender); }