Commit 70c7e4da authored by Maurelian's avatar Maurelian Committed by GitHub

ctb: Add new OwnerRemovalFailed(string) error type to LM (#10538)

* ctb: Update snapshots and semver-lock

* ctb: Add new OwnerRemovalFailed(string) error type to LM
parent b123e13a
...@@ -112,8 +112,8 @@ ...@@ -112,8 +112,8 @@
"sourceCodeHash": "0xea3872d8f196ae3c863363dfa4b57803cb2a24b0c100244d8f861891e901e03f" "sourceCodeHash": "0xea3872d8f196ae3c863363dfa4b57803cb2a24b0c100244d8f861891e901e03f"
}, },
"src/Safe/LivenessModule.sol": { "src/Safe/LivenessModule.sol": {
"initCodeHash": "0x6c3d47fdce3dcd5b8499da08061f3ee4ddd126b726bedec601210667bf73db1d", "initCodeHash": "0xdf37345a47e176266f0ece4c624c7e9c2bd81661675f53cf07706dc44dafad27",
"sourceCodeHash": "0x6bdfa1a9fe8a7bc6e032c2448b911ca3bd55ece0856866042e29a20e270dd0a3" "sourceCodeHash": "0xdf17b5a6c068b2cf8fd24383066f0cc8e4ab0002f2470476beae594ca86879f3"
}, },
"src/cannon/MIPS.sol": { "src/cannon/MIPS.sol": {
"initCodeHash": "0xa5d36fc67170ad87322f358f612695f642757bbf5280800d5d878da21402579a", "initCodeHash": "0xa5d36fc67170ad87322f358f612695f642757bbf5280800d5d878da21402579a",
......
...@@ -200,5 +200,16 @@ ...@@ -200,5 +200,16 @@
], ],
"name": "RemovedOwner", "name": "RemovedOwner",
"type": "event" "type": "event"
},
{
"inputs": [
{
"internalType": "string",
"name": "",
"type": "string"
}
],
"name": "OwnerRemovalFailed",
"type": "error"
} }
] ]
\ No newline at end of file
...@@ -14,6 +14,9 @@ import { ISemver } from "src/universal/ISemver.sol"; ...@@ -14,6 +14,9 @@ import { ISemver } from "src/universal/ISemver.sol";
/// If the number of owners falls below the minimum number of owners, the ownership of the /// If the number of owners falls below the minimum number of owners, the ownership of the
/// safe will be transferred to the fallback owner. /// safe will be transferred to the fallback owner.
contract LivenessModule is ISemver { contract LivenessModule is ISemver {
/// @notice Error message for failed owner removal.
error OwnerRemovalFailed(string);
/// @notice Emitted when an owner is removed due to insufficient liveness /// @notice Emitted when an owner is removed due to insufficient liveness
event RemovedOwner(address indexed owner); event RemovedOwner(address indexed owner);
...@@ -184,15 +187,15 @@ contract LivenessModule is ISemver { ...@@ -184,15 +187,15 @@ contract LivenessModule is ISemver {
/// @param _prevOwner Owner that pointed to the owner to be replaced in the linked list /// @param _prevOwner Owner that pointed to the owner to be replaced in the linked list
/// @param _oldOwner Owner address to be replaced. /// @param _oldOwner Owner address to be replaced.
function _swapToFallbackOwnerSafeCall(address _prevOwner, address _oldOwner) internal { function _swapToFallbackOwnerSafeCall(address _prevOwner, address _oldOwner) internal {
require( (bool success, bytes memory returnData) = SAFE.execTransactionFromModuleReturnData({
SAFE.execTransactionFromModule({ to: address(SAFE),
to: address(SAFE), value: 0,
value: 0, operation: Enum.Operation.Call,
operation: Enum.Operation.Call, data: abi.encodeCall(OwnerManager.swapOwner, (_prevOwner, _oldOwner, FALLBACK_OWNER))
data: abi.encodeCall(OwnerManager.swapOwner, (_prevOwner, _oldOwner, FALLBACK_OWNER)) });
}), if (!success) {
"LivenessModule: failed to swap to fallback owner" revert OwnerRemovalFailed(string(returnData));
); }
emit OwnershipTransferredToFallback(); emit OwnershipTransferredToFallback();
} }
...@@ -201,15 +204,15 @@ contract LivenessModule is ISemver { ...@@ -201,15 +204,15 @@ contract LivenessModule is ISemver {
/// @param _owner Owner address to be removed. /// @param _owner Owner address to be removed.
/// @param _threshold New threshold. /// @param _threshold New threshold.
function _removeOwnerSafeCall(address _prevOwner, address _owner, uint256 _threshold) internal { function _removeOwnerSafeCall(address _prevOwner, address _owner, uint256 _threshold) internal {
require( (bool success, bytes memory returnData) = SAFE.execTransactionFromModuleReturnData({
SAFE.execTransactionFromModule({ to: address(SAFE),
to: address(SAFE), value: 0,
value: 0, operation: Enum.Operation.Call,
operation: Enum.Operation.Call, data: abi.encodeCall(OwnerManager.removeOwner, (_prevOwner, _owner, _threshold))
data: abi.encodeCall(OwnerManager.removeOwner, (_prevOwner, _owner, _threshold)) });
}), if (!success) {
"LivenessModule: failed to remove owner" revert OwnerRemovalFailed(string(returnData));
); }
emit RemovedOwner(_owner); emit RemovedOwner(_owner);
} }
......
...@@ -13,6 +13,8 @@ import { LivenessGuard } from "src/Safe/LivenessGuard.sol"; ...@@ -13,6 +13,8 @@ import { LivenessGuard } from "src/Safe/LivenessGuard.sol";
contract LivenessModule_TestInit is Test, SafeTestTools { contract LivenessModule_TestInit is Test, SafeTestTools {
using SafeTestLib for SafeInstance; using SafeTestLib for SafeInstance;
error OwnerRemovalFailed(string reason);
// LivenessModule events // LivenessModule events
event SignersRecorded(bytes32 indexed txHash, address[] signers); event SignersRecorded(bytes32 indexed txHash, address[] signers);
event RemovedOwner(address indexed owner); event RemovedOwner(address indexed owner);
...@@ -261,10 +263,13 @@ contract LivenessModule_RemoveOwners_TestFail is LivenessModule_TestInit { ...@@ -261,10 +263,13 @@ contract LivenessModule_RemoveOwners_TestFail is LivenessModule_TestInit {
address[] memory prevOwners = new address[](1); address[] memory prevOwners = new address[](1);
address[] memory ownersToRemove = new address[](1); address[] memory ownersToRemove = new address[](1);
ownersToRemove[0] = safeInstance.owners[0]; ownersToRemove[0] = safeInstance.owners[0];
prevOwners[0] = ownersToRemove[0]; // incorrect. // Incorrectly set the previous owner as equal to the owner to remove, which will cause the Safe to revert.
prevOwners[0] = ownersToRemove[0];
_warpPastLivenessInterval(); _warpPastLivenessInterval();
vm.expectRevert("LivenessModule: failed to remove owner"); vm.expectRevert(
abi.encodeWithSelector(OwnerRemovalFailed.selector, (abi.encodeWithSignature("Error(string)", "GS205")))
);
livenessModule.removeOwners(prevOwners, ownersToRemove); livenessModule.removeOwners(prevOwners, ownersToRemove);
} }
...@@ -278,11 +283,13 @@ contract LivenessModule_RemoveOwners_TestFail is LivenessModule_TestInit { ...@@ -278,11 +283,13 @@ contract LivenessModule_RemoveOwners_TestFail is LivenessModule_TestInit {
} }
address[] memory prevOwners = safeInstance.getPrevOwners(ownersToRemove); address[] memory prevOwners = safeInstance.getPrevOwners(ownersToRemove);
// Incorrectly set the final owner to address(0) // Incorrectly set the final owner to address(0), causing the Safe to revert.
ownersToRemove[ownersToRemove.length - 1] = address(0); ownersToRemove[ownersToRemove.length - 1] = address(0);
_warpPastLivenessInterval(); _warpPastLivenessInterval();
vm.expectRevert("LivenessModule: failed to swap to fallback owner"); vm.expectRevert(
abi.encodeWithSelector(OwnerRemovalFailed.selector, (abi.encodeWithSignature("Error(string)", "GS203")))
);
livenessModule.removeOwners(prevOwners, ownersToRemove); livenessModule.removeOwners(prevOwners, ownersToRemove);
} }
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment