Skip to content
Merged
Show file tree
Hide file tree
Changes from 1 commit
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
5 changes: 4 additions & 1 deletion src/MultiFactor/MultiFactor.sol
Original file line number Diff line number Diff line change
Expand Up @@ -14,6 +14,7 @@ import {
} from "./DataTypes.sol";
import { MultiFactorLib } from "./MultiFactorLib.sol";
import { FlatBytesLib } from "flatbytes/BytesLib.sol";
import { ECDSA } from "solady/utils/ECDSA.sol";

/**
* @title MultiFactor
Expand Down Expand Up @@ -354,7 +355,9 @@ contract MultiFactor is ERC7579ValidatorBase, ERC7484RegistryAdapter {
Validator[] calldata validators = MultiFactorLib.decode(userOp.signature);

// validate the signature
bool isValid = _validateSignatureWithConfig(userOp.sender, validators, userOpHash);
bool isValid = _validateSignatureWithConfig(
userOp.sender, validators, ECDSA.toEthSignedMessageHash(userOpHash)
);

if (isValid) {
// return validation success if the signatures are valid
Expand Down
11 changes: 5 additions & 6 deletions src/OwnableValidator/OwnableValidator.sol
Original file line number Diff line number Diff line change
Expand Up @@ -265,7 +265,9 @@ contract OwnableValidator is ERC7579ValidatorBase {
returns (ValidationData)
{
// validate the signature with the config
bool isValid = _validateSignatureWithConfig(userOp.sender, userOpHash, userOp.signature);
bool isValid = _validateSignatureWithConfig(
userOp.sender, ECDSA.toEthSignedMessageHash(userOpHash), userOp.signature
);

// return the result
if (isValid) {
Expand Down Expand Up @@ -334,9 +336,7 @@ contract OwnableValidator is ERC7579ValidatorBase {
}

// recover the signers from the signatures
address[] memory signers = CheckSignatures.recoverNSignatures(
ECDSA.toEthSignedMessageHash(hash), signature, _threshold
);
address[] memory signers = CheckSignatures.recoverNSignatures(hash, signature, _threshold);

// sort and uniquify the signers to make sure a signer is not reused
signers.sort();
Expand Down Expand Up @@ -381,8 +381,7 @@ contract OwnableValidator is ERC7579ValidatorBase {
}

// recover the signers from the signatures
address[] memory signers =
CheckSignatures.recoverNSignatures(ECDSA.toEthSignedMessageHash(hash), data, _threshold);
address[] memory signers = CheckSignatures.recoverNSignatures(hash, data, _threshold);

// sort and uniquify the signers to make sure a signer is not reused
signers.sort();
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -9,7 +9,7 @@ import {
parseValidationData,
ValidationData
} from "test/utils/ERC4337.sol";
import { signHash } from "test/utils/Signature.sol";
import { signUserOpHash as signHash } from "test/utils/Signature.sol";
import {
MODULE_TYPE_HOOK,
MODULE_TYPE_VALIDATOR
Expand Down
2 changes: 1 addition & 1 deletion test/DeadmanSwitch/unit/concrete/DeadmanSwitch.t.sol
Original file line number Diff line number Diff line change
Expand Up @@ -10,7 +10,7 @@ import {
parseValidationData,
ValidationData
} from "test/utils/ERC4337.sol";
import { signHash } from "test/utils/Signature.sol";
import { signUserOpHash as signHash } from "test/utils/Signature.sol";

contract DeadmanSwitchTest is BaseTest {
/*//////////////////////////////////////////////////////////////////////////
Expand Down
6 changes: 3 additions & 3 deletions test/MultiFactor/integration/concrete/MultiFactor.t.sol
Original file line number Diff line number Diff line change
Expand Up @@ -9,7 +9,7 @@ import {
ValidatorId
} from "src/MultiFactor/MultiFactor.sol";
import { OwnableValidator } from "src/OwnableValidator/OwnableValidator.sol";
import { signHash } from "test/utils/Signature.sol";
import { signUserOpHash, signHash } from "test/utils/Signature.sol";
import { EIP1271_MAGIC_VALUE } from "test/utils/Constants.sol";
import { MODULE_TYPE_VALIDATOR } from "modulekit/accounts/common/interfaces/IERC7579Module.sol";
import { UserOpData } from "modulekit/ModuleKit.sol";
Expand Down Expand Up @@ -204,8 +204,8 @@ contract MultiFactorIntegrationTest is BaseIntegrationTest {
});
Validator[] memory validators = _getValidators();

bytes memory signature1 = signHash(_ownerPks[0], userOpData.userOpHash);
bytes memory signature2 = signHash(_ownerPks[1], userOpData.userOpHash);
bytes memory signature1 = signUserOpHash(_ownerPks[0], userOpData.userOpHash);
bytes memory signature2 = signUserOpHash(_ownerPks[1], userOpData.userOpHash);
bytes memory encodedSig = abi.encodePacked(signature1, signature2);

validators[0].data = encodedSig;
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -3,7 +3,7 @@ pragma solidity ^0.8.23;

import { BaseIntegrationTest, ModuleKitHelpers } from "test/BaseIntegration.t.sol";
import { OwnableValidator } from "src/OwnableValidator/OwnableValidator.sol";
import { signHash } from "test/utils/Signature.sol";
import { signHash, signUserOpHash } from "test/utils/Signature.sol";
import { EIP1271_MAGIC_VALUE } from "test/utils/Constants.sol";
import { MODULE_TYPE_VALIDATOR } from "modulekit/accounts/common/interfaces/IERC7579Module.sol";
import { UserOpData } from "modulekit/ModuleKit.sol";
Expand Down Expand Up @@ -172,8 +172,8 @@ contract OwnableValidatorIntegrationTest is BaseIntegrationTest {
callData: "",
txValidator: address(validator)
});
bytes memory signature1 = signHash(_ownerPks[0], userOpData.userOpHash);
bytes memory signature2 = signHash(_ownerPks[1], userOpData.userOpHash);
bytes memory signature1 = signUserOpHash(_ownerPks[0], userOpData.userOpHash);
bytes memory signature2 = signUserOpHash(_ownerPks[1], userOpData.userOpHash);
userOpData.userOp.signature = abi.encodePacked(signature1, signature2);
userOpData.execUserOps();

Expand Down
6 changes: 3 additions & 3 deletions test/OwnableValidator/unit/concrete/OwnableValidator.t.sol
Original file line number Diff line number Diff line change
Expand Up @@ -9,7 +9,7 @@ import {
} from "src/OwnableValidator/OwnableValidator.sol";
import { IModule as IERC7579Module } from "modulekit/accounts/common/interfaces/IERC7579Module.sol";
import { PackedUserOperation, getEmptyUserOperation } from "test/utils/ERC4337.sol";
import { signHash } from "test/utils/Signature.sol";
import { signHash, signUserOpHash } from "test/utils/Signature.sol";
import { EIP1271_MAGIC_VALUE } from "test/utils/Constants.sol";
import { LibSort } from "solady/utils/LibSort.sol";

Expand Down Expand Up @@ -433,8 +433,8 @@ contract OwnableValidatorTest is BaseTest {
userOp.sender = address(this);
bytes32 userOpHash = bytes32(keccak256("userOpHash"));

bytes memory signature1 = signHash(_ownerPks[0], userOpHash);
bytes memory signature2 = signHash(_ownerPks[1], userOpHash);
bytes memory signature1 = signUserOpHash(_ownerPks[0], userOpHash);
bytes memory signature2 = signUserOpHash(_ownerPks[1], userOpHash);
userOp.signature = abi.encodePacked(signature1, signature2);

uint256 validationData =
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -6,7 +6,7 @@ import { SocialRecovery, ERC7579ValidatorBase } from "src/SocialRecovery/SocialR
import { IERC7579Account } from "modulekit/accounts/common/interfaces/IERC7579Account.sol";
import { IModule as IERC7579Module } from "modulekit/accounts/common/interfaces/IERC7579Module.sol";
import { PackedUserOperation, getEmptyUserOperation } from "test/utils/ERC4337.sol";
import { signHash } from "test/utils/Signature.sol";
import { signUserOpHash as signHash } from "test/utils/Signature.sol";
import { ModeLib } from "modulekit/accounts/common/lib/ModeLib.sol";
import { ExecutionLib, Execution } from "modulekit/accounts/erc7579/lib/ExecutionLib.sol";
import { MODULE_TYPE_VALIDATOR } from "modulekit/accounts/common/interfaces/IERC7579Module.sol";
Expand Down
2 changes: 1 addition & 1 deletion test/SocialRecovery/unit/concrete/SocialRecovery.t.sol
Original file line number Diff line number Diff line change
Expand Up @@ -6,7 +6,7 @@ import { SocialRecovery, ERC7579ValidatorBase } from "src/SocialRecovery/SocialR
import { IERC7579Account } from "modulekit/accounts/common/interfaces/IERC7579Account.sol";
import { IModule as IERC7579Module } from "modulekit/accounts/common/interfaces/IERC7579Module.sol";
import { PackedUserOperation, getEmptyUserOperation } from "test/utils/ERC4337.sol";
import { signHash } from "test/utils/Signature.sol";
import { signUserOpHash as signHash } from "test/utils/Signature.sol";
import { ModeLib } from "modulekit/accounts/common/lib/ModeLib.sol";
import { ExecutionLib, Execution } from "modulekit/accounts/erc7579/lib/ExecutionLib.sol";
import { MockAccount } from "test/mocks/MockAccount.sol";
Expand Down
10 changes: 10 additions & 0 deletions test/utils/Signature.sol
Original file line number Diff line number Diff line change
Expand Up @@ -7,6 +7,16 @@ import { Vm } from "forge-std/Vm.sol";
address constant VM_ADDR = 0x7109709ECfa91a80626fF3989D68f67F5b1DD12D;

function signHash(uint256 privKey, bytes32 digest) returns (bytes memory) {
(uint8 v, bytes32 r, bytes32 s) = Vm(VM_ADDR).sign(privKey, digest);

// Sanity checks
address signer = ecrecover(digest, v, r, s);
require(signer == Vm(VM_ADDR).addr(privKey), "Invalid signature");

return abi.encodePacked(r, s, v);
}

function signUserOpHash(uint256 privKey, bytes32 digest) returns (bytes memory) {
(uint8 v, bytes32 r, bytes32 s) =
Vm(VM_ADDR).sign(privKey, ECDSA.toEthSignedMessageHash(digest));

Expand Down
Loading