Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
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
16 changes: 9 additions & 7 deletions Deploy.toml
Original file line number Diff line number Diff line change
Expand Up @@ -6,11 +6,13 @@ rpcs = [
# "https://opt-mainnet.g.alchemy.com/v2/${ALCHEMY_API_KEY}",
# "https://opt-sepolia.g.alchemy.com/v2/${ALCHEMY_API_KEY}",
# "https://base-mainnet.g.alchemy.com/v2/${ALCHEMY_API_KEY}",
"https://base-sepolia.g.alchemy.com/v2/${ALCHEMY_API_KEY}",
# "https://arb-mainnet.g.alchemy.com/v2/${ALCHEMY_API_KEY}",
# "https://base-sepolia.g.alchemy.com/v2/${ALCHEMY_API_KEY}",
"https://arb-mainnet.g.alchemy.com/v2/${ALCHEMY_API_KEY}",
# "https://arb-sepolia.g.alchemy.com/v2/${ALCHEMY_API_KEY}",
# "https://polygon-mainnet.g.alchemy.com/v2/${ALCHEMY_API_KEY}",
# "https://polygon-amoy.g.alchemy.com/v2/${ALCHEMY_API_KEY}",
# "https://zksync-mainnet.g.alchemy.com/v2/${ALCHEMY_API_KEY}",
# "https://zksync-sepolia.g.alchemy.com/v2/${ALCHEMY_API_KEY}",
# "https://gnosis-mainnet.g.alchemy.com/v2/${ALCHEMY_API_KEY}",
# "https://bnb-mainnet.g.alchemy.com/v2/${ALCHEMY_API_KEY}",
# "https://bnb-testnet.g.alchemy.com/v2/${ALCHEMY_API_KEY}",
Expand All @@ -20,6 +22,8 @@ rpcs = [
# "https://scroll-sepolia.g.alchemy.com/v2/${ALCHEMY_API_KEY}",
# "https://sonic-mainnet.g.alchemy.com/v2/${ALCHEMY_API_KEY}",
# "https://sonic-blaze.g.alchemy.com/v2/${ALCHEMY_API_KEY}",
# "https://soneium-mainnet.g.alchemy.com/v2/${ALCHEMY_API_KEY}",
# "https://soneium-minato.g.alchemy.com/v2/${ALCHEMY_API_KEY}",
# "https://rpc.fuse.io",
# "https://rpc.fusespark.io",
# "https://odyssey.ithaca.xyz",
Expand All @@ -41,8 +45,6 @@ rpcs = [
# "https://network.ambrosus-test.io",
# "https://json-rpc.evm.iotaledger.net",
# "https://json-rpc.evm.testnet.iotaledger.net",
# "https://rpc.soneium.org",
# "https://rpc.minato.soneium.org",
# "https://carrot.megaeth.com/rpc",
# "https://rpc.mantle.xyz",
# "https://rpc.testnet.mantle.xyz",
Expand All @@ -55,9 +57,9 @@ rpcs = [
# "https://zora-sepolia.g.alchemy.com/v2/${ALCHEMY_API_KEY}"
]

[deployments.verifier]
# [deployments.verifier]
# required to enable verification
api_key = "${ETHERSCAN_API_KEY}" # Etherscan API key for verification
# api_key = "${ETHERSCAN_API_KEY}" # Etherscan API key for verification

[deployments.dependencies]

Expand All @@ -69,7 +71,7 @@ salt = "0x00000000000000000000000000000000000000005ceb75763e25a20124b7c69e"
[deployments.singleton.OwnableValidator]
file = "./artifacts/OwnableValidator/OwnableValidator.json"
source_file="./artifacts/OwnableValidator/verify.json"
salt = "0x00000000000000000000000000000000000000009a4cc33019d42602e5f482c4"
salt = "0x00000000000000000000000000000000000000005cff70848341170223ea60eb"

# [deployments.singleton.SocialRecovery]
# file = "./artifacts/SocialRecovery/SocialRecovery.json"
Expand Down
2 changes: 1 addition & 1 deletion artifacts/OwnableValidator/OwnableValidator.json

Large diffs are not rendered by default.

2 changes: 1 addition & 1 deletion artifacts/OwnableValidator/verify.json

Large diffs are not rendered by default.

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