From d75e18e3824465c7bf611cf667015edd845be860 Mon Sep 17 00:00:00 2001 From: leekt Date: Fri, 27 Oct 2023 23:05:30 +0900 Subject: [PATCH 1/2] stash --- src/executor/RecoveryAction.sol | 2 +- src/validator/WeightedECDSAValidator.sol | 5 +++-- 2 files changed, 4 insertions(+), 3 deletions(-) diff --git a/src/executor/RecoveryAction.sol b/src/executor/RecoveryAction.sol index d224ed77..cc043117 100644 --- a/src/executor/RecoveryAction.sol +++ b/src/executor/RecoveryAction.sol @@ -1,6 +1,6 @@ pragma solidity ^0.8.0; -import "src/interfaces/IValidator.sol"; +import "src/interfaces/IKernelValidator.sol"; contract RecoveryAction { function doRecovery(address _validator, bytes calldata _data) external { diff --git a/src/validator/WeightedECDSAValidator.sol b/src/validator/WeightedECDSAValidator.sol index 109b82b6..0f1d9de2 100644 --- a/src/validator/WeightedECDSAValidator.sol +++ b/src/validator/WeightedECDSAValidator.sol @@ -1,10 +1,11 @@ pragma solidity ^0.8.0; import "src/common/Types.sol"; -import {UserOperation} from "account-abstraction/interfaces/UserOperation.sol"; +import {UserOperation} from "I4337/interfaces/UserOperation.sol"; import {ECDSA} from "solady/utils/ECDSA.sol"; import {EIP712} from "solady/utils/EIP712.sol"; -import {IKernelValidator} from "src/interfaces/IValidator.sol"; +import {IKernelValidator} from "src/interfaces/IKernelValidator.sol"; +import {SIG_VALIDATION_FAILED} from "src/common/Constants.sol"; struct WeightedECDSAValidatorStorage { uint24 totalWeight; From 828938933b84981751e01463980e65da9e90d055 Mon Sep 17 00:00:00 2001 From: leekt Date: Fri, 27 Oct 2023 23:32:41 +0900 Subject: [PATCH 2/2] fix:sessionkey param validation --- .../validator/SessionKeyValidator.t.sol | 32 +++++++++++++++---- 1 file changed, 25 insertions(+), 7 deletions(-) diff --git a/test/foundry/validator/SessionKeyValidator.t.sol b/test/foundry/validator/SessionKeyValidator.t.sol index 14c07f18..1683e5a4 100644 --- a/test/foundry/validator/SessionKeyValidator.t.sol +++ b/test/foundry/validator/SessionKeyValidator.t.sol @@ -51,12 +51,12 @@ contract SessionKeyValidatorTest is KernelECDSATest { ParamRule[] memory paramRules = new ParamRule[](2); paramRules[0] = ParamRule({ offset: 0, - condition: ParamCondition.EQUAL, + condition: ParamCondition(i % 6), param: bytes32(uint256(100)) }); paramRules[1] = ParamRule({ offset: 32, - condition: ParamCondition.NOT_EQUAL, + condition: ParamCondition((i+1) % 6), param: bytes32(uint256(100)) }); permissions[i] = Permission({ @@ -78,11 +78,29 @@ contract SessionKeyValidatorTest is KernelECDSATest { } } + function _generateParam(ParamCondition condition, bool correct) internal pure returns(uint256 param) { + if(condition == ParamCondition.EQUAL) { + param = correct ? 100 : 101; + } else if(condition == ParamCondition.GREATER_THAN) { + param = correct ? 101 : 100; + } else if(condition == ParamCondition.LESS_THAN) { + param = correct ? 99 : 100; + } else if(condition == ParamCondition.NOT_EQUAL) { + param = correct ? 101 : 100; + } else if(condition == ParamCondition.GREATER_THAN_OR_EQUAL) { + param = correct ? 100 : 99; + } else if(condition == ParamCondition.LESS_THAN_OR_EQUAL) { + param = correct ? 100 : 101; + } + } + function _buildUserOp( Permission[] memory permissions, SessionData memory sessionData, uint256 indexToUse, - uint8 usingPaymasterMode + uint8 usingPaymasterMode, + bool param1Faulty, + bool param2Faulty ) internal view returns (UserOperation memory op) { op = entryPoint.fillUserOp( address(kernel), @@ -92,8 +110,8 @@ contract SessionKeyValidatorTest is KernelECDSATest { 0, abi.encodeWithSelector( permissions[indexToUse].sig, - 1, // since EQ - 1 // since NOT_EQ + _generateParam(ParamCondition(indexToUse%6), !param1Faulty), // since EQ + _generateParam(ParamCondition((indexToUse+1)%6), !param2Faulty) // since NOT_EQ ), Operation.Call ) @@ -170,7 +188,7 @@ contract SessionKeyValidatorTest is KernelECDSATest { vm.assume(config.validAfter < type(uint32).max && config.interval < type(uint32).max && config.runs < type(uint32).max); config.paymasterMode = config.paymasterMode % 3; config.usingPaymasterMode = config.usingPaymasterMode % 3; - bool shouldFail = (config.usingPaymasterMode < config.paymasterMode) || (1000 < config.validAfter) || config.faultySig; + bool shouldFail = (config.usingPaymasterMode < config.paymasterMode) || (1000 < config.validAfter) || config.faultySig || config.param1Faulty || config.param2Faulty; config.runs = config.runs % 10; config.earlyRun = config.runs == 0 ? 0 : config.earlyRun % config.runs; if(config.interval == 0 || config.validAfter == 0) { @@ -194,7 +212,7 @@ contract SessionKeyValidatorTest is KernelECDSATest { nonce: uint256(lastNonce) + 1//lastNonce + 1 }); // now encode data to op - UserOperation memory op = _buildUserOp(permissions, sessionData, config.indexToUse, config.usingPaymasterMode); + UserOperation memory op = _buildUserOp(permissions, sessionData, config.indexToUse, config.usingPaymasterMode, config.param1Faulty, config.param2Faulty); op.signature = bytes.concat( op.signature, abi.encodePacked(