From 8f3fa2251418d8d1d70f2797bfd0cb9c965cf709 Mon Sep 17 00:00:00 2001 From: JohnGuilding Date: Fri, 19 Jul 2024 10:43:44 +0100 Subject: [PATCH] L3: cancelRecovery does not revert when no recovery is in process --- src/EmailRecoveryManager.sol | 3 +++ src/interfaces/IEmailRecoveryManager.sol | 1 + test/unit/EmailRecoveryManager/cancelRecovery.t.sol | 13 +++++++------ test/unit/assertErrorSelectors.t.sol | 1 + 4 files changed, 12 insertions(+), 6 deletions(-) diff --git a/src/EmailRecoveryManager.sol b/src/EmailRecoveryManager.sol index 5512fd8..3c1bd6c 100644 --- a/src/EmailRecoveryManager.sol +++ b/src/EmailRecoveryManager.sol @@ -445,6 +445,9 @@ contract EmailRecoveryManager is EmailAccountRecovery, Initializable, IEmailReco * @dev Deletes the current recovery request associated with the caller's account */ function cancelRecovery() external virtual { + if (recoveryRequests[msg.sender].currentWeight == 0) { + revert NoRecoveryInProcess(); + } delete recoveryRequests[msg.sender]; emit RecoveryCancelled(msg.sender); } diff --git a/src/interfaces/IEmailRecoveryManager.sol b/src/interfaces/IEmailRecoveryManager.sol index 3eab8f4..1ae8602 100644 --- a/src/interfaces/IEmailRecoveryManager.sol +++ b/src/interfaces/IEmailRecoveryManager.sol @@ -85,6 +85,7 @@ interface IEmailRecoveryManager { error DelayNotPassed(); error RecoveryRequestExpired(); error InvalidCalldataHash(); + error NoRecoveryInProcess(); error NotRecoveryModule(); /*////////////////////////////////////////////////////////////////////////// diff --git a/test/unit/EmailRecoveryManager/cancelRecovery.t.sol b/test/unit/EmailRecoveryManager/cancelRecovery.t.sol index ad96a8f..8df1224 100644 --- a/test/unit/EmailRecoveryManager/cancelRecovery.t.sol +++ b/test/unit/EmailRecoveryManager/cancelRecovery.t.sol @@ -13,6 +13,12 @@ contract EmailRecoveryManager_cancelRecovery_Test is UnitBase { super.setUp(); } + function test_CancelRecovery_RevertWhen_NoRecoveryInProcess() public { + vm.startPrank(accountAddress); + vm.expectRevert(IEmailRecoveryManager.NoRecoveryInProcess.selector); + emailRecoveryManager.cancelRecovery(); + } + function test_CancelRecovery_CannotCancelWrongRecoveryRequest() public { address otherAddress = address(99); @@ -29,13 +35,8 @@ contract EmailRecoveryManager_cancelRecovery_Test is UnitBase { assertEq(recoveryRequest.calldataHash, ""); vm.startPrank(otherAddress); + vm.expectRevert(IEmailRecoveryManager.NoRecoveryInProcess.selector); emailRecoveryManager.cancelRecovery(); - - recoveryRequest = emailRecoveryManager.getRecoveryRequest(accountAddress); - assertEq(recoveryRequest.executeAfter, 0); - assertEq(recoveryRequest.executeBefore, 0); - assertEq(recoveryRequest.currentWeight, 1); - assertEq(recoveryRequest.calldataHash, ""); } function test_CancelRecovery_PartialRequest_Succeeds() public { diff --git a/test/unit/assertErrorSelectors.t.sol b/test/unit/assertErrorSelectors.t.sol index 769b92b..a864777 100644 --- a/test/unit/assertErrorSelectors.t.sol +++ b/test/unit/assertErrorSelectors.t.sol @@ -48,6 +48,7 @@ contract LogErrorSelectors_Test is Test { assertEq(IEmailRecoveryManager.DelayNotPassed.selector, bytes4(0xc806ff6e)); assertEq(IEmailRecoveryManager.RecoveryRequestExpired.selector, bytes4(0x4c2babb1)); assertEq(IEmailRecoveryManager.InvalidCalldataHash.selector, bytes4(0xf05609de)); + assertEq(IEmailRecoveryManager.NoRecoveryInProcess.selector, bytes4(0x87434f51)); assertEq(IEmailRecoveryManager.NotRecoveryModule.selector, bytes4(0x2f6ef3d6)); }