From 96e66537d8d4859b813495107c3017afe119a662 Mon Sep 17 00:00:00 2001 From: Aleksandr Kuperman Date: Sat, 21 Feb 2026 10:19:53 +0000 Subject: [PATCH 1/2] refactor: unstake by any account if rewards are zero --- contracts/interfaces/IStaking.sol | 4 ++++ contracts/l2/ExternalStakingDistributor.sol | 8 ++++++-- scripts/deployment/globals_gnosis_mainnet.json | 3 ++- 3 files changed, 12 insertions(+), 3 deletions(-) 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); } diff --git a/scripts/deployment/globals_gnosis_mainnet.json b/scripts/deployment/globals_gnosis_mainnet.json index fd9775e..92def1e 100644 --- a/scripts/deployment/globals_gnosis_mainnet.json +++ b/scripts/deployment/globals_gnosis_mainnet.json @@ -55,5 +55,6 @@ "multisigGuardAddress": "0xA26CfDC0e84A04444b6a468c1d1F7191D19541E6", "multisigGuardProxyAddress": "0xBD645cf2D4F04A1c12B97fe2a8b4A09EF50F1896", "gnosisDepositProcessorL1Address": "0xeB7613bfbb40fab1DA73DC0b1c16Ec13639C305B", - "gnosisStakingProcessorL2Address": "0xDAE0B11e5bF81216283cB95d30039fA3D650eFE3" + "gnosisStakingProcessorL2Address": "0xDAE0B11e5bF81216283cB95d30039fA3D650eFE3", + "guardAddress": "0x860FFb692cE3b4f2fd24aEe9bcc82357F863f88e" } From 7009294a925d143ddfc512d577c0b15c10385fd1 Mon Sep 17 00:00:00 2001 From: Aleksandr Kuperman Date: Sat, 21 Feb 2026 10:22:48 +0000 Subject: [PATCH 2/2] chore: script --- scripts/deployment/globals_gnosis_mainnet.json | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/scripts/deployment/globals_gnosis_mainnet.json b/scripts/deployment/globals_gnosis_mainnet.json index 92def1e..fd9775e 100644 --- a/scripts/deployment/globals_gnosis_mainnet.json +++ b/scripts/deployment/globals_gnosis_mainnet.json @@ -55,6 +55,5 @@ "multisigGuardAddress": "0xA26CfDC0e84A04444b6a468c1d1F7191D19541E6", "multisigGuardProxyAddress": "0xBD645cf2D4F04A1c12B97fe2a8b4A09EF50F1896", "gnosisDepositProcessorL1Address": "0xeB7613bfbb40fab1DA73DC0b1c16Ec13639C305B", - "gnosisStakingProcessorL2Address": "0xDAE0B11e5bF81216283cB95d30039fA3D650eFE3", - "guardAddress": "0x860FFb692cE3b4f2fd24aEe9bcc82357F863f88e" + "gnosisStakingProcessorL2Address": "0xDAE0B11e5bF81216283cB95d30039fA3D650eFE3" }