From 00e60be6bf77d5f0a1f64b1522aedcd2efc6b457 Mon Sep 17 00:00:00 2001 From: Kresh Date: Mon, 6 Jan 2025 12:36:36 +0400 Subject: [PATCH] fix: statemind - Insufficient conditions when checking event for a slash in FullRestakeResetHook --- .../FullRestakeResetHook.sol | 8 +-- .../NetworkRestakeResetHook.sol | 8 +-- .../OperatorSpecificResetHook.sol | 8 +-- .../FullRestakeResetHook.t.sol | 59 +++++++++++++++++ .../NetworkRestakeResetHook.t.sol | 65 +++++++++++++++++++ .../OperatorSpecificResetHook.t.sol | 51 +++++++++++++++ 6 files changed, 184 insertions(+), 15 deletions(-) diff --git a/src/contracts/fullRestakeDelegator/FullRestakeResetHook.sol b/src/contracts/fullRestakeDelegator/FullRestakeResetHook.sol index 1a2cf5c..92afeb5 100644 --- a/src/contracts/fullRestakeDelegator/FullRestakeResetHook.sol +++ b/src/contracts/fullRestakeDelegator/FullRestakeResetHook.sol @@ -62,17 +62,15 @@ contract FullRestakeResetHook is IFullRestakeResetHook { _slashings[vault][subnetwork][operator].setup(SLASH_COUNT); } - if (IFullRestakeDelegator(msg.sender).operatorNetworkLimit(subnetwork, operator) == 0) { - return; - } - _slashings[vault][subnetwork][operator].push(bytes32(uint256(Time.timestamp()))); if ( _slashings[vault][subnetwork][operator].count() == SLASH_COUNT && Time.timestamp() - uint256(_slashings[vault][subnetwork][operator].last(SLASH_COUNT - 1)) <= PERIOD ) { - IFullRestakeDelegator(msg.sender).setOperatorNetworkLimit(subnetwork, operator, 0); + if (IFullRestakeDelegator(msg.sender).operatorNetworkLimit(subnetwork, operator) != 0) { + IFullRestakeDelegator(msg.sender).setOperatorNetworkLimit(subnetwork, operator, 0); + } _slashings[vault][subnetwork][operator].clear(); } } diff --git a/src/contracts/networkRestakeDelegator/NetworkRestakeResetHook.sol b/src/contracts/networkRestakeDelegator/NetworkRestakeResetHook.sol index 6c601ec..199a864 100644 --- a/src/contracts/networkRestakeDelegator/NetworkRestakeResetHook.sol +++ b/src/contracts/networkRestakeDelegator/NetworkRestakeResetHook.sol @@ -62,17 +62,15 @@ contract NetworkRestakeResetHook is INetworkRestakeResetHook { _slashings[vault][subnetwork][operator].setup(SLASH_COUNT); } - if (INetworkRestakeDelegator(msg.sender).operatorNetworkShares(subnetwork, operator) == 0) { - return; - } - _slashings[vault][subnetwork][operator].push(bytes32(uint256(Time.timestamp()))); if ( _slashings[vault][subnetwork][operator].count() == SLASH_COUNT && Time.timestamp() - uint256(_slashings[vault][subnetwork][operator].last(SLASH_COUNT - 1)) <= PERIOD ) { - INetworkRestakeDelegator(msg.sender).setOperatorNetworkShares(subnetwork, operator, 0); + if (INetworkRestakeDelegator(msg.sender).operatorNetworkShares(subnetwork, operator) != 0) { + INetworkRestakeDelegator(msg.sender).setOperatorNetworkShares(subnetwork, operator, 0); + } _slashings[vault][subnetwork][operator].clear(); } } diff --git a/src/contracts/operatorSpecificDelegator/OperatorSpecificResetHook.sol b/src/contracts/operatorSpecificDelegator/OperatorSpecificResetHook.sol index b5957fa..3738c9f 100644 --- a/src/contracts/operatorSpecificDelegator/OperatorSpecificResetHook.sol +++ b/src/contracts/operatorSpecificDelegator/OperatorSpecificResetHook.sol @@ -60,17 +60,15 @@ contract OperatorSpecificResetHook is IOperatorSpecificResetHook { _slashings[vault][subnetwork].setup(SLASH_COUNT); } - if (IOperatorSpecificDelegator(msg.sender).networkLimit(subnetwork) == 0) { - return; - } - _slashings[vault][subnetwork].push(bytes32(uint256(Time.timestamp()))); if ( _slashings[vault][subnetwork].count() == SLASH_COUNT && Time.timestamp() - uint256(_slashings[vault][subnetwork].last(SLASH_COUNT - 1)) <= PERIOD ) { - IOperatorSpecificDelegator(msg.sender).setNetworkLimit(subnetwork, 0); + if (IOperatorSpecificDelegator(msg.sender).networkLimit(subnetwork) != 0) { + IOperatorSpecificDelegator(msg.sender).setNetworkLimit(subnetwork, 0); + } _slashings[vault][subnetwork].clear(); } } diff --git a/test/fullRestakeDelegator/FullRestakeResetHook.t.sol b/test/fullRestakeDelegator/FullRestakeResetHook.t.sol index b5fcb43..1313bf9 100644 --- a/test/fullRestakeDelegator/FullRestakeResetHook.t.sol +++ b/test/fullRestakeDelegator/FullRestakeResetHook.t.sol @@ -115,6 +115,65 @@ contract FullRestakeResetHookTest is POCBaseTest { blockTimestamp = blockTimestamp + 3 days; vm.warp(blockTimestamp); + _setOperatorNetworkLimit(delegator2, alice, network, alice, 0); + + _slash(slasher2, alice, network, alice, slashAmount1, uint48(blockTimestamp - 1), ""); + + assertEq(delegator2.networkLimit(network.subnetwork(0)), type(uint256).max); + assertEq(delegator2.operatorNetworkLimit(network.subnetwork(0), alice), 0); + + _setOperatorNetworkLimit(delegator2, alice, network, alice, operatorNetworkLimit1); + + assertEq(delegator2.networkLimit(network.subnetwork(0)), type(uint256).max); + assertEq(delegator2.operatorNetworkLimit(network.subnetwork(0), alice), operatorNetworkLimit1); + + blockTimestamp = blockTimestamp + 1; + vm.warp(blockTimestamp); + + _slash(slasher2, alice, network, alice, slashAmount1, uint48(blockTimestamp - 1), ""); + + assertEq(delegator2.networkLimit(network.subnetwork(0)), type(uint256).max); + assertEq(delegator2.operatorNetworkLimit(network.subnetwork(0), alice), operatorNetworkLimit1); + + blockTimestamp = blockTimestamp + 7 days; + vm.warp(blockTimestamp); + + _slash(slasher2, alice, network, alice, slashAmount1, uint48(blockTimestamp - 1), ""); + + assertEq(delegator2.networkLimit(network.subnetwork(0)), type(uint256).max); + assertEq(delegator2.operatorNetworkLimit(network.subnetwork(0), alice), operatorNetworkLimit1); + + blockTimestamp = blockTimestamp + 3 days; + vm.warp(blockTimestamp); + + _slash(slasher2, alice, network, alice, slashAmount1, uint48(blockTimestamp - 1), ""); + + assertEq(delegator2.networkLimit(network.subnetwork(0)), type(uint256).max); + assertEq(delegator2.operatorNetworkLimit(network.subnetwork(0), alice), operatorNetworkLimit1); + + blockTimestamp = blockTimestamp + 5 days; + vm.warp(blockTimestamp); + + _slash(slasher2, alice, network, alice, slashAmount1, uint48(blockTimestamp - 1), ""); + + assertEq(delegator2.networkLimit(network.subnetwork(0)), type(uint256).max); + assertEq(delegator2.operatorNetworkLimit(network.subnetwork(0), alice), operatorNetworkLimit1); + + blockTimestamp = blockTimestamp + 3 days; + vm.warp(blockTimestamp); + + _setOperatorNetworkLimit(delegator2, alice, network, alice, 0); + + _slash(slasher2, alice, network, alice, slashAmount1, uint48(blockTimestamp - 1), ""); + + _setOperatorNetworkLimit(delegator2, alice, network, alice, operatorNetworkLimit1); + + assertEq(delegator2.networkLimit(network.subnetwork(0)), type(uint256).max); + assertEq(delegator2.operatorNetworkLimit(network.subnetwork(0), alice), operatorNetworkLimit1); + + blockTimestamp = blockTimestamp + 3 days; + vm.warp(blockTimestamp); + _slash(slasher2, alice, network, alice, slashAmount1, uint48(blockTimestamp - 1), ""); assertEq(delegator2.networkLimit(network.subnetwork(0)), type(uint256).max); diff --git a/test/networkRestakeDelegator/NetworkRestakeResetHook.t.sol b/test/networkRestakeDelegator/NetworkRestakeResetHook.t.sol index 51f59d2..27cca98 100644 --- a/test/networkRestakeDelegator/NetworkRestakeResetHook.t.sol +++ b/test/networkRestakeDelegator/NetworkRestakeResetHook.t.sol @@ -121,6 +121,71 @@ contract NetworkRestakeResetHookTest is POCBaseTest { blockTimestamp = blockTimestamp + 3 days; vm.warp(blockTimestamp); + _setOperatorNetworkShares(delegator1, alice, network, alice, 0); + _slash(slasher1, alice, network, alice, slashAmount1, uint48(blockTimestamp - 1), ""); + + assertEq(delegator1.networkLimit(network.subnetwork(0)), type(uint256).max); + assertEq(delegator1.totalOperatorNetworkShares(network.subnetwork(0)), 0); + assertEq(delegator1.operatorNetworkShares(network.subnetwork(0), alice), 0); + + _setOperatorNetworkShares(delegator1, alice, network, alice, operatorNetworkShares1); + + assertEq(delegator1.networkLimit(network.subnetwork(0)), type(uint256).max); + assertEq(delegator1.totalOperatorNetworkShares(network.subnetwork(0)), operatorNetworkShares1); + assertEq(delegator1.operatorNetworkShares(network.subnetwork(0), alice), operatorNetworkShares1); + + blockTimestamp = blockTimestamp + 1; + vm.warp(blockTimestamp); + + _slash(slasher1, alice, network, alice, slashAmount1, uint48(blockTimestamp - 1), ""); + + assertEq(delegator1.networkLimit(network.subnetwork(0)), type(uint256).max); + assertEq(delegator1.totalOperatorNetworkShares(network.subnetwork(0)), operatorNetworkShares1); + assertEq(delegator1.operatorNetworkShares(network.subnetwork(0), alice), operatorNetworkShares1); + + blockTimestamp = blockTimestamp + 7 days; + vm.warp(blockTimestamp); + + _slash(slasher1, alice, network, alice, slashAmount1, uint48(blockTimestamp - 1), ""); + + assertEq(delegator1.networkLimit(network.subnetwork(0)), type(uint256).max); + assertEq(delegator1.totalOperatorNetworkShares(network.subnetwork(0)), operatorNetworkShares1); + assertEq(delegator1.operatorNetworkShares(network.subnetwork(0), alice), operatorNetworkShares1); + + blockTimestamp = blockTimestamp + 3 days; + vm.warp(blockTimestamp); + + _slash(slasher1, alice, network, alice, slashAmount1, uint48(blockTimestamp - 1), ""); + + assertEq(delegator1.networkLimit(network.subnetwork(0)), type(uint256).max); + assertEq(delegator1.totalOperatorNetworkShares(network.subnetwork(0)), operatorNetworkShares1); + assertEq(delegator1.operatorNetworkShares(network.subnetwork(0), alice), operatorNetworkShares1); + + blockTimestamp = blockTimestamp + 5 days; + vm.warp(blockTimestamp); + + _slash(slasher1, alice, network, alice, slashAmount1, uint48(blockTimestamp - 1), ""); + + assertEq(delegator1.networkLimit(network.subnetwork(0)), type(uint256).max); + assertEq(delegator1.totalOperatorNetworkShares(network.subnetwork(0)), operatorNetworkShares1); + assertEq(delegator1.operatorNetworkShares(network.subnetwork(0), alice), operatorNetworkShares1); + + blockTimestamp = blockTimestamp + 3 days; + vm.warp(blockTimestamp); + + _setOperatorNetworkShares(delegator1, alice, network, alice, 0); + + _slash(slasher1, alice, network, alice, slashAmount1, uint48(blockTimestamp - 1), ""); + + _setOperatorNetworkShares(delegator1, alice, network, alice, operatorNetworkShares1); + + assertEq(delegator1.networkLimit(network.subnetwork(0)), type(uint256).max); + assertEq(delegator1.totalOperatorNetworkShares(network.subnetwork(0)), operatorNetworkShares1); + assertEq(delegator1.operatorNetworkShares(network.subnetwork(0), alice), operatorNetworkShares1); + + blockTimestamp = blockTimestamp + 3 days; + vm.warp(blockTimestamp); + _slash(slasher1, alice, network, alice, slashAmount1, uint48(blockTimestamp - 1), ""); assertEq(delegator1.networkLimit(network.subnetwork(0)), type(uint256).max); diff --git a/test/operatorSpecificDelegator/OperatorSpecificResetHook.t.sol b/test/operatorSpecificDelegator/OperatorSpecificResetHook.t.sol index 3b5e192..2587f5f 100644 --- a/test/operatorSpecificDelegator/OperatorSpecificResetHook.t.sol +++ b/test/operatorSpecificDelegator/OperatorSpecificResetHook.t.sol @@ -147,6 +147,57 @@ contract OperatorSpecificResetHookTest is POCBaseTest { blockTimestamp = blockTimestamp + 3 days; vm.warp(blockTimestamp); + _setNetworkLimitOperator(delegator0, alice, network, 0); + _slash(slasher0, alice, network, alice, slashAmount1, uint48(blockTimestamp - 1), ""); + + assertEq(delegator0.networkLimit(network.subnetwork(0)), 0); + + _setNetworkLimitOperator(delegator0, alice, network, operatorNetworkLimit1); + + assertEq(delegator0.networkLimit(network.subnetwork(0)), operatorNetworkLimit1); + + blockTimestamp = blockTimestamp + 1; + vm.warp(blockTimestamp); + + _slash(slasher0, alice, network, alice, slashAmount1, uint48(blockTimestamp - 1), ""); + + assertEq(delegator0.networkLimit(network.subnetwork(0)), operatorNetworkLimit1); + + blockTimestamp = blockTimestamp + 7 days; + vm.warp(blockTimestamp); + + _slash(slasher0, alice, network, alice, slashAmount1, uint48(blockTimestamp - 1), ""); + + assertEq(delegator0.networkLimit(network.subnetwork(0)), operatorNetworkLimit1); + + blockTimestamp = blockTimestamp + 3 days; + vm.warp(blockTimestamp); + + _slash(slasher0, alice, network, alice, slashAmount1, uint48(blockTimestamp - 1), ""); + + assertEq(delegator0.networkLimit(network.subnetwork(0)), operatorNetworkLimit1); + + blockTimestamp = blockTimestamp + 5 days; + vm.warp(blockTimestamp); + + _slash(slasher0, alice, network, alice, slashAmount1, uint48(blockTimestamp - 1), ""); + + assertEq(delegator0.networkLimit(network.subnetwork(0)), operatorNetworkLimit1); + + blockTimestamp = blockTimestamp + 3 days; + vm.warp(blockTimestamp); + + _setNetworkLimitOperator(delegator0, alice, network, 0); + + _slash(slasher0, alice, network, alice, slashAmount1, uint48(blockTimestamp - 1), ""); + + _setNetworkLimitOperator(delegator0, alice, network, operatorNetworkLimit1); + + assertEq(delegator0.networkLimit(network.subnetwork(0)), operatorNetworkLimit1); + + blockTimestamp = blockTimestamp + 3 days; + vm.warp(blockTimestamp); + _slash(slasher0, alice, network, alice, slashAmount1, uint48(blockTimestamp - 1), ""); assertEq(delegator0.networkLimit(network.subnetwork(0)), 0);