From 6eb400bf66091826b2abc98307ad6d860b0f3a0e Mon Sep 17 00:00:00 2001 From: adnpark Date: Thu, 25 Jan 2024 14:09:06 +0900 Subject: [PATCH 1/3] feat: implement validateSignature of WeightedECDSAValidator --- src/validator/WeightedECDSAValidator.sol | 25 +++++++++++++++++++++++- 1 file changed, 24 insertions(+), 1 deletion(-) diff --git a/src/validator/WeightedECDSAValidator.sol b/src/validator/WeightedECDSAValidator.sol index a3b7a537..1f8bdaa1 100644 --- a/src/validator/WeightedECDSAValidator.sol +++ b/src/validator/WeightedECDSAValidator.sol @@ -238,7 +238,30 @@ contract WeightedECDSAValidator is EIP712, IKernelValidator { return false; } - function validateSignature(bytes32, bytes calldata) external pure returns (ValidationData) { + function validateSignature(bytes32 hash, bytes calldata signature) external view returns (ValidationData) { + WeightedECDSAValidatorStorage storage strg = weightedStorage[msg.sender]; + if (strg.threshold == 0) { + return SIG_VALIDATION_FAILED; + } + + uint256 totalWeight = strg.totalWeight; + uint256 sigCount = signature.length / 65; + if (sigCount == 0) { + return SIG_VALIDATION_FAILED; + } + address signer; + for (uint256 i = 0; i < sigCount; i++) { + signer = ECDSA.recover( + _hashTypedData( + keccak256(abi.encode(keccak256("Approve(bytes32 callDataAndNonceHash)"), hash)) + ), + signature[i * 65:(i + 1) * 65] + ); + totalWeight += guardian[signer][msg.sender].weight; + if (totalWeight >= strg.threshold) { + return packValidationData(ValidAfter.wrap(0), ValidUntil.wrap(0)); + } + } return SIG_VALIDATION_FAILED; } } From 8e686e555cc70bfc705f8c7222d002821207414e Mon Sep 17 00:00:00 2001 From: adnpark Date: Fri, 26 Jan 2024 09:03:53 +0900 Subject: [PATCH 2/3] fix: init totalWeight as 0 in validateSignature --- src/validator/WeightedECDSAValidator.sol | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/validator/WeightedECDSAValidator.sol b/src/validator/WeightedECDSAValidator.sol index 1f8bdaa1..dd32b1b9 100644 --- a/src/validator/WeightedECDSAValidator.sol +++ b/src/validator/WeightedECDSAValidator.sol @@ -244,11 +244,11 @@ contract WeightedECDSAValidator is EIP712, IKernelValidator { return SIG_VALIDATION_FAILED; } - uint256 totalWeight = strg.totalWeight; uint256 sigCount = signature.length / 65; if (sigCount == 0) { return SIG_VALIDATION_FAILED; } + uint256 totalWeight = 0; address signer; for (uint256 i = 0; i < sigCount; i++) { signer = ECDSA.recover( From eb1cee1624ad1d48d4d0d4bbd356ac49809da6a4 Mon Sep 17 00:00:00 2001 From: Derek Chiang Date: Thu, 25 Jan 2024 21:37:54 -0500 Subject: [PATCH 3/3] Fix validSignature for WeightedECDSAValidator --- src/validator/WeightedECDSAValidator.sol | 7 +------ 1 file changed, 1 insertion(+), 6 deletions(-) diff --git a/src/validator/WeightedECDSAValidator.sol b/src/validator/WeightedECDSAValidator.sol index dd32b1b9..4e30867d 100644 --- a/src/validator/WeightedECDSAValidator.sol +++ b/src/validator/WeightedECDSAValidator.sol @@ -251,12 +251,7 @@ contract WeightedECDSAValidator is EIP712, IKernelValidator { uint256 totalWeight = 0; address signer; for (uint256 i = 0; i < sigCount; i++) { - signer = ECDSA.recover( - _hashTypedData( - keccak256(abi.encode(keccak256("Approve(bytes32 callDataAndNonceHash)"), hash)) - ), - signature[i * 65:(i + 1) * 65] - ); + signer = ECDSA.recover(hash, signature[i * 65:(i + 1) * 65]); totalWeight += guardian[signer][msg.sender].weight; if (totalWeight >= strg.threshold) { return packValidationData(ValidAfter.wrap(0), ValidUntil.wrap(0));