Skip to content

Commit

Permalink
test(feat): add test case for recovering account with invalid signature
Browse files Browse the repository at this point in the history
  • Loading branch information
jpgonzalezra committed May 20, 2024
1 parent 6281531 commit 722befd
Show file tree
Hide file tree
Showing 2 changed files with 24 additions and 9 deletions.
19 changes: 11 additions & 8 deletions src/SimpleGuardianModule.sol
Original file line number Diff line number Diff line change
Expand Up @@ -2,7 +2,7 @@
pragma solidity ^0.8.25;

import { ECDSA } from "@openzeppelin/contracts/utils/cryptography/ECDSA.sol";
import { console2 } from "forge-std/src/console2.sol";
// import { console2 } from "forge-std/src/console2.sol";

abstract contract SimpleGuardianModule {
using ECDSA for bytes32;
Expand All @@ -13,6 +13,9 @@ abstract contract SimpleGuardianModule {
event NonceConsumed(address indexed owner, uint256 idx);
event GuardianUpdated(address indexed previousGuardian, address indexed newGuardian);

error InvalidGuardian(address guardian);
error InvalidGuardianSignature();

address public guardian;
mapping(address => uint256) private _nonces;

Expand Down Expand Up @@ -46,10 +49,10 @@ abstract contract SimpleGuardianModule {
}

function _updateGuardian(address newGuardian) internal {
require(
newGuardian != address(0) && guardian != newGuardian && newGuardian != address(this),
"Invalid guardian address"
);
if (newGuardian == address(0) || guardian == newGuardian || newGuardian == address(this)) {
revert InvalidGuardian(newGuardian);
}

address oldGuardian = guardian;
guardian = newGuardian;
emit GuardianUpdated(oldGuardian, newGuardian);
Expand All @@ -65,10 +68,10 @@ abstract contract SimpleGuardianModule {
bytes32 digest = _hashTypedDataV4(structHash);

address recoveredAddress = digest.recover(signature);
console2.log(guardian);


require(recoveredAddress == guardian, "Invalid guardian signature");
if (recoveredAddress != guardian) {
revert InvalidGuardianSignature();
}

_transferOwnership(newOwner);
}
Expand Down
14 changes: 13 additions & 1 deletion test/SimplePlusAccount.t.sol
Original file line number Diff line number Diff line change
Expand Up @@ -167,11 +167,23 @@ contract SimplePlusAccountTest is AccountTest {
EOA_PRIVATE_KEY,
address(account)
);

_executeOperation(op);
assertEq(account.owner(), newOwner);
}

function testRecoverAccountRevertsWithInvalidSignature() public {
uint256 nonce = account.getNonce(eoaAddress);

bytes32 structHash = keccak256(abi.encode(account._RECOVER_TYPEHASH(), eoaAddress, guardianAddress, nonce));
bytes32 digest = MessageHashUtils.toTypedDataHash(domainSeparator(address(account)), structHash);

bytes memory signature = sign(EOA_PRIVATE_KEY, digest);

vm.expectRevert(abi.encodeWithSelector(SimpleGuardianModule.InvalidGuardianSignature.selector));
account.recoverAccount(guardianAddress, nonce, signature);
}

function _transferOwnership(address currentOwner, address newOwner) internal {
vm.prank(currentOwner);
vm.expectEmit(true, true, false, false);
Expand Down

0 comments on commit 722befd

Please sign in to comment.