From 63440043124e33e61cdd3e90f22bc730b4016768 Mon Sep 17 00:00:00 2001 From: taek Date: Tue, 24 Feb 2026 12:46:30 +0900 Subject: [PATCH] fix: add install-time input validation with require-customError pattern --- src/policies/CallerPolicy.sol | 7 +++++-- src/signers/ECDSASigner.sol | 4 ++-- src/signers/WeightedECDSASigner.sol | 2 ++ src/validators/ECDSAValidator.sol | 4 ++-- 4 files changed, 11 insertions(+), 6 deletions(-) diff --git a/src/policies/CallerPolicy.sol b/src/policies/CallerPolicy.sol index c10e734..c418e4a 100644 --- a/src/policies/CallerPolicy.sol +++ b/src/policies/CallerPolicy.sol @@ -28,6 +28,9 @@ import { * If you need to validate who signed, use a signer module instead. */ contract CallerPolicy is PolicyBase, IStatelessValidatorWithSender { + error EmptyCallers(); + error ZeroAddressCaller(); + mapping(bytes32 id => mapping(address => Status)) public status; /// @notice Maps policy ID => requesting protocol => wallet => whether protocol is allowed mapping(bytes32 id => mapping(address caller => mapping(address wallet => bool))) public allowedCaller; @@ -84,9 +87,9 @@ contract CallerPolicy is PolicyBase, IStatelessValidatorWithSender { function _policyOninstall(bytes32 id, bytes calldata _data) internal override { require(status[id][msg.sender] == Status.NA, "Already installed"); address[] memory callers = abi.decode(_data, (address[])); - require(callers.length > 0, "Empty callers array"); + require(callers.length > 0, EmptyCallers()); for (uint256 i = 0; i < callers.length; i++) { - require(callers[i] != address(0), "Zero address caller"); + require(callers[i] != address(0), ZeroAddressCaller()); allowedCaller[id][callers[i]][msg.sender] = true; } status[id][msg.sender] = Status.Live; diff --git a/src/signers/ECDSASigner.sol b/src/signers/ECDSASigner.sol index 7193480..0d606d9 100644 --- a/src/signers/ECDSASigner.sol +++ b/src/signers/ECDSASigner.sol @@ -62,9 +62,9 @@ contract ECDSASigner is SignerBase, IStatelessValidator, IStatelessValidatorWith function _signerOninstall(bytes32 id, bytes calldata _data) internal override { require(signer[id][msg.sender] == address(0), "Already installed"); - if (_data.length != 20) revert InvalidDataLength(); + require(_data.length == 20, InvalidDataLength()); address signerAddr = address(bytes20(_data[0:20])); - if (signerAddr == address(0)) revert ZeroAddressSigner(); + require(signerAddr != address(0), ZeroAddressSigner()); signer[id][msg.sender] = signerAddr; } diff --git a/src/signers/WeightedECDSASigner.sol b/src/signers/WeightedECDSASigner.sol index b4852e8..c9733fa 100644 --- a/src/signers/WeightedECDSASigner.sol +++ b/src/signers/WeightedECDSASigner.sol @@ -36,6 +36,7 @@ contract WeightedECDSASigner is EIP712, SignerBase, IStatelessValidator, IStatel keccak256("Proposal(address account,bytes32 id,bytes callData,uint256 nonce)"); error ZeroWeightSigner(); + error ThresholdExceedsTotalWeight(); mapping(bytes32 id => mapping(address kernel => WeightedECDSASignerStorage)) public weightedStorage; mapping(address guardian => mapping(bytes32 id => mapping(address kernel => GuardianStorage))) public guardian; @@ -69,6 +70,7 @@ contract WeightedECDSASigner is EIP712, SignerBase, IStatelessValidator, IStatel weightedStorage[id][msg.sender].totalWeight += _weights[i]; emit GuardianAdded(_guardians[i], msg.sender, _weights[i]); } + require(_threshold <= weightedStorage[id][msg.sender].totalWeight, ThresholdExceedsTotalWeight()); weightedStorage[id][msg.sender].threshold = _threshold; } diff --git a/src/validators/ECDSAValidator.sol b/src/validators/ECDSAValidator.sol index c2f8547..b01172f 100644 --- a/src/validators/ECDSAValidator.sol +++ b/src/validators/ECDSAValidator.sol @@ -35,9 +35,9 @@ contract ECDSAValidator is IValidator, IHook, IStatelessValidator, IStatelessVal function onInstall(bytes calldata _data) external payable override { if (_isInitialized(msg.sender)) revert AlreadyInitialized(msg.sender); - if (_data.length != 20) revert InvalidDataLength(); + require(_data.length == 20, InvalidDataLength()); address owner = address(bytes20(_data[0:20])); - if (owner == address(0)) revert ZeroAddressOwner(); + require(owner != address(0), ZeroAddressOwner()); ecdsaValidatorStorage[msg.sender].owner = owner; emit OwnerRegistered(msg.sender, owner); }