diff --git a/contracts/validator-manager/PoSValidatorManager.sol b/contracts/validator-manager/PoSValidatorManager.sol index 7a783b3e9..a8e825272 100644 --- a/contracts/validator-manager/PoSValidatorManager.sol +++ b/contracts/validator-manager/PoSValidatorManager.sol @@ -405,15 +405,19 @@ abstract contract PoSValidatorManager is /** * @notice See {ACP99Manager-completeValidatorRemoval}. */ - function completeValidatorRemoval(uint32 messageIndex) + function completeValidatorRemoval(bytes32 validationID, uint32 messageIndex) public nonReentrant returns (bytes32) { PoSValidatorManagerStorage storage $ = _getPoSValidatorManagerStorage(); - bytes32 validationID = $._manager.completeValidatorRemoval(messageIndex); Validator memory validator = $._manager.getValidator(validationID); + // Check if the validator has been already been removed from the validator manager. + if (validator.status != ValidatorStatus.Completed && validator.status != ValidatorStatus.Invalidated) { + $._manager.completeValidatorRemoval(messageIndex); + validator = $._manager.getValidator(validationID); + } // Return now if this was originally a PoA validator that was later migrated to this PoS manager, // or the validator was part of the initial validator set. diff --git a/contracts/validator-manager/ValidatorManager.sol b/contracts/validator-manager/ValidatorManager.sol index 0a351f71f..bcb033430 100644 --- a/contracts/validator-manager/ValidatorManager.sol +++ b/contracts/validator-manager/ValidatorManager.sol @@ -555,7 +555,6 @@ contract ValidatorManager is Initializable, ContextUpgradeable, ACP99Manager { public virtual override - onlyAdmin returns (bytes32) { ValidatorManagerStorage storage $ = _getValidatorManagerStorage();