From d59b4cbaf25d626b7dd23ce8f1956033dcfcc8d0 Mon Sep 17 00:00:00 2001 From: adnpark Date: Tue, 7 May 2024 19:51:29 +0900 Subject: [PATCH] feat: add dummy signature verification to multi chain signer --- ...tiSignatureSigner.sol => MultiChainSigner.sol} | 15 ++++++++++++--- 1 file changed, 12 insertions(+), 3 deletions(-) rename src/signer/{MultiSignatureSigner.sol => MultiChainSigner.sol} (83%) diff --git a/src/signer/MultiSignatureSigner.sol b/src/signer/MultiChainSigner.sol similarity index 83% rename from src/signer/MultiSignatureSigner.sol rename to src/signer/MultiChainSigner.sol index fe21f10..49c8c69 100644 --- a/src/signer/MultiSignatureSigner.sol +++ b/src/signer/MultiChainSigner.sol @@ -20,7 +20,9 @@ struct ECDSAValidatorStorage { address owner; } -contract MultiSignatureECDSASigner is SignerBase { +bytes constant DUMMY_ECDSA_SIG = hex"fffffffffffffffffffffffffffffff0000000000000000000000000000000007aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa1c"; + +contract MultiChainSigner is SignerBase { mapping(address => uint256) public usedIds; mapping(bytes32 id => mapping(address wallet => address)) public signer; @@ -70,8 +72,15 @@ contract MultiSignatureECDSASigner is SignerBase { } bytes memory ecdsaSig = sig[0:65]; bytes32 merkleRoot = bytes32(sig[65:97]); - bytes32[] memory proof = abi.decode(sig[97:], (bytes32[])); - require(MerkleProofLib.verify(proof, merkleRoot, userOpHash), "hash is not in proof"); + // if the signature is a dummy signature, then use dummyUserOpHash instead of real userOpHash + if (keccak256(ecdsaSig) == keccak256(DUMMY_ECDSA_SIG)) { + (bytes32 dummyUserOpHash, bytes32[] memory proof) = abi.decode(sig[97:], (bytes32, bytes32[])); + require(MerkleProofLib.verify(proof, merkleRoot, dummyUserOpHash), "hash is not in proof"); + // otherwise, use real userOpHash + } else { + bytes32[] memory proof = abi.decode(sig[97:], (bytes32[])); + require(MerkleProofLib.verify(proof, merkleRoot, userOpHash), "hash is not in proof"); + } // simple ecdsa verification if (owner == ECDSA.recover(merkleRoot, ecdsaSig)) { return SIG_VALIDATION_SUCCESS_UINT;