Skip to content

Commit cf43884

Browse files
committed
feat: update ValidationDataView with ValidationFlags
1 parent 3062561 commit cf43884

File tree

10 files changed

+68
-67
lines changed

10 files changed

+68
-67
lines changed

package.json

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
{
22
"name": "@erc6900/reference-implementation",
3-
"version": "0.8.0-rc.6",
3+
"version": "0.8.0-rc.7",
44
"devDependencies": {
55
"pnpm": "^8.7.5",
66
"solhint": "^3.6.2"

src/account/AccountStorage.sol

Lines changed: 7 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -3,7 +3,7 @@ pragma solidity ^0.8.20;
33

44
import {EnumerableSet} from "@openzeppelin/contracts/utils/structs/EnumerableSet.sol";
55

6-
import {HookConfig, ModuleEntity} from "../interfaces/IModularAccount.sol";
6+
import {HookConfig, ModuleEntity, ValidationFlags} from "../interfaces/IModularAccount.sol";
77

88
// bytes = keccak256("ERC6900.ReferenceModularAccount.Storage")
99
bytes32 constant _ACCOUNT_STORAGE_SLOT = 0xc531f081ecdb5a90f38c197521797881a6e5c752a7d451780f325a95f8b91f45;
@@ -25,12 +25,12 @@ struct ExecutionStorage {
2525
}
2626

2727
struct ValidationStorage {
28-
// Whether or not this validation can be used as a global validation function.
29-
bool isGlobal;
30-
// Whether or not this validation is allowed to validate ERC-1271 signatures.
31-
bool isSignatureValidation;
32-
// Whether or not this validation is allowed to validate ERC-4337 user operations.
33-
bool isUserOpValidation;
28+
// ValidationFlags layout:
29+
// 0b00000___ // unused
30+
// 0b_____A__ // isGlobal
31+
// 0b______B_ // isSignatureValidation
32+
// 0b_______C // isUserOpValidation
33+
ValidationFlags validationFlags;
3434
// The validation hooks for this validation function.
3535
HookConfig[] validationHooks;
3636
// Execution hooks to run with this validation function.

src/account/ModularAccountView.sol

Lines changed: 1 addition & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -47,9 +47,7 @@ abstract contract ModularAccountView is IModularAccountView {
4747
returns (ValidationDataView memory data)
4848
{
4949
ValidationStorage storage validationStorage = getAccountStorage().validationStorage[validationFunction];
50-
data.isGlobal = validationStorage.isGlobal;
51-
data.isSignatureValidation = validationStorage.isSignatureValidation;
52-
data.isUserOpValidation = validationStorage.isUserOpValidation;
50+
data.validationFlags = validationStorage.validationFlags;
5351
data.validationHooks = validationStorage.validationHooks;
5452

5553
uint256 execHooksLen = validationStorage.executionHooks.length();

src/account/ModuleManagerInternals.sol

Lines changed: 10 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -8,7 +8,13 @@ import {collectReturnData} from "../helpers/CollectReturnData.sol";
88
import {MAX_VALIDATION_ASSOC_HOOKS} from "../helpers/Constants.sol";
99
import {IExecutionHookModule} from "../interfaces/IExecutionHookModule.sol";
1010
import {ExecutionManifest, ManifestExecutionHook} from "../interfaces/IExecutionModule.sol";
11-
import {HookConfig, IModularAccount, ModuleEntity, ValidationConfig} from "../interfaces/IModularAccount.sol";
11+
import {
12+
HookConfig,
13+
IModularAccount,
14+
ModuleEntity,
15+
ValidationConfig,
16+
ValidationFlags
17+
} from "../interfaces/IModularAccount.sol";
1218
import {IModule} from "../interfaces/IModule.sol";
1319
import {IValidationHookModule} from "../interfaces/IValidationHookModule.sol";
1420
import {IValidationModule} from "../interfaces/IValidationModule.sol";
@@ -94,10 +100,7 @@ abstract contract ModuleManagerInternals is IModularAccount {
94100

95101
function _removeValidationFunction(ModuleEntity validationFunction) internal {
96102
ValidationStorage storage _validationStorage = getAccountStorage().validationStorage[validationFunction];
97-
98-
_validationStorage.isGlobal = false;
99-
_validationStorage.isSignatureValidation = false;
100-
_validationStorage.isUserOpValidation = false;
103+
_validationStorage.validationFlags = ValidationFlags.wrap(0);
101104
}
102105

103106
function _addExecHooks(EnumerableSet.Bytes32Set storage hooks, HookConfig hookConfig) internal {
@@ -226,7 +229,7 @@ abstract contract ModuleManagerInternals is IModularAccount {
226229
) internal {
227230
ValidationStorage storage _validationStorage =
228231
getAccountStorage().validationStorage[validationConfig.moduleEntity()];
229-
ModuleEntity moduleEntity = validationConfig.moduleEntity();
232+
(ModuleEntity moduleEntity, ValidationFlags validationFlags) = validationConfig.unpack();
230233

231234
for (uint256 i = 0; i < hooks.length; ++i) {
232235
HookConfig hookConfig = HookConfig.wrap(bytes25(hooks[i][:25]));
@@ -257,9 +260,7 @@ abstract contract ModuleManagerInternals is IModularAccount {
257260
}
258261
}
259262

260-
_validationStorage.isGlobal = validationConfig.isGlobal();
261-
_validationStorage.isSignatureValidation = validationConfig.isSignatureValidation();
262-
_validationStorage.isUserOpValidation = validationConfig.isUserOpValidation();
263+
_validationStorage.validationFlags = validationFlags;
263264

264265
_onInstall(validationConfig.module(), installData, type(IValidationModule).interfaceId);
265266
emit ValidationInstalled(validationConfig.module(), validationConfig.entityId());

src/account/ReferenceModularAccount.sol

Lines changed: 11 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -5,7 +5,6 @@ import {BaseAccount} from "@eth-infinitism/account-abstraction/core/BaseAccount.
55
import {IAccountExecute} from "@eth-infinitism/account-abstraction/interfaces/IAccountExecute.sol";
66
import {IEntryPoint} from "@eth-infinitism/account-abstraction/interfaces/IEntryPoint.sol";
77
import {PackedUserOperation} from "@eth-infinitism/account-abstraction/interfaces/PackedUserOperation.sol";
8-
98
import {IERC1271} from "@openzeppelin/contracts/interfaces/IERC1271.sol";
109
import {UUPSUpgradeable} from "@openzeppelin/contracts/proxy/utils/UUPSUpgradeable.sol";
1110
import {IERC165} from "@openzeppelin/contracts/utils/introspection/IERC165.sol";
@@ -16,7 +15,13 @@ import {DIRECT_CALL_VALIDATION_ENTITY_ID} from "../helpers/Constants.sol";
1615
import {_coalescePreValidation, _coalesceValidation} from "../helpers/ValidationResHelpers.sol";
1716
import {IExecutionHookModule} from "../interfaces/IExecutionHookModule.sol";
1817
import {ExecutionManifest} from "../interfaces/IExecutionModule.sol";
19-
import {Call, IModularAccount, ModuleEntity, ValidationConfig} from "../interfaces/IModularAccount.sol";
18+
import {
19+
Call,
20+
IModularAccount,
21+
ModuleEntity,
22+
ValidationConfig,
23+
ValidationFlags
24+
} from "../interfaces/IModularAccount.sol";
2025
import {IValidationHookModule} from "../interfaces/IValidationHookModule.sol";
2126
import {IValidationModule} from "../interfaces/IValidationModule.sol";
2227
import {HookConfig, HookConfigLib} from "../libraries/HookConfigLib.sol";
@@ -43,7 +48,7 @@ contract ReferenceModularAccount is
4348
{
4449
using EnumerableSet for EnumerableSet.Bytes32Set;
4550
using ModuleEntityLib for ModuleEntity;
46-
using ValidationConfigLib for ValidationConfig;
51+
using ValidationConfigLib for ValidationFlags;
4752
using HookConfigLib for HookConfig;
4853
using SparseCalldataSegmentLib for bytes;
4954

@@ -598,7 +603,7 @@ contract ReferenceModularAccount is
598603

599604
(address module, uint32 entityId) = userOpValidationFunction.unpack();
600605

601-
if (!_storage.validationStorage[userOpValidationFunction].isUserOpValidation) {
606+
if (!_storage.validationStorage[userOpValidationFunction].validationFlags.isUserOpValidation()) {
602607
revert UserOpValidationInvalid(module, entityId);
603608
}
604609

@@ -633,7 +638,7 @@ contract ReferenceModularAccount is
633638
AccountStorage storage _storage = getAccountStorage();
634639

635640
(address module, uint32 entityId) = sigValidation.unpack();
636-
if (!_storage.validationStorage[sigValidation].isSignatureValidation) {
641+
if (!_storage.validationStorage[sigValidation].validationFlags.isSignatureValidation()) {
637642
revert SignatureValidationInvalid(module, entityId);
638643
}
639644

@@ -660,7 +665,7 @@ contract ReferenceModularAccount is
660665
}
661666

662667
function _isValidationGlobal(ModuleEntity validationFunction) internal view virtual returns (bool) {
663-
return getAccountStorage().validationStorage[validationFunction].isGlobal;
668+
return getAccountStorage().validationStorage[validationFunction].validationFlags.isGlobal();
664669
}
665670

666671
function _checkIfValidationAppliesCallData(

src/interfaces/IModularAccount.sol

Lines changed: 4 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -15,10 +15,11 @@ type ValidationConfig is bytes25;
1515
// Layout:
1616
// 0xAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA________________________ // Address
1717
// 0x________________________________________BBBBBBBB________________ // Entity ID
18-
// 0x________________________________________________CC______________ // validation flags
18+
// 0x________________________________________________CC______________ // ValidationFlags
1919
// 0x__________________________________________________00000000000000 // unused
20-
//
21-
// Validation flags layout:
20+
21+
type ValidationFlags is uint8;
22+
// ValidationFlags layout:
2223
// 0b00000___ // unused
2324
// 0b_____A__ // isGlobal
2425
// 0b______B_ // isSignatureValidation

src/interfaces/IModularAccountView.sol

Lines changed: 7 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,7 @@
11
// SPDX-License-Identifier: CC0-1.0
22
pragma solidity ^0.8.20;
33

4-
import {HookConfig, ModuleEntity} from "../interfaces/IModularAccount.sol";
4+
import {HookConfig, ModuleEntity, ValidationFlags} from "../interfaces/IModularAccount.sol";
55

66
/// @dev Represents data associated with a specific function selector.
77
struct ExecutionDataView {
@@ -20,12 +20,12 @@ struct ExecutionDataView {
2020
}
2121

2222
struct ValidationDataView {
23-
// Whether or not this validation function can be used as a global validation function.
24-
bool isGlobal;
25-
// Whether or not this validation function is a signature validator.
26-
bool isSignatureValidation;
27-
// Whether or not this validation function is a user operation validation function.
28-
bool isUserOpValidation;
23+
// ValidationFlags layout:
24+
// 0b00000___ // unused
25+
// 0b_____A__ // isGlobal
26+
// 0b______B_ // isSignatureValidation
27+
// 0b_______C // isUserOpValidation
28+
ValidationFlags validationFlags;
2929
// The validation hooks for this validation function.
3030
HookConfig[] validationHooks;
3131
// Execution hooks to run with this validation function.

src/libraries/ValidationConfigLib.sol

Lines changed: 3 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -1,23 +1,16 @@
11
// SPDX-License-Identifier: GPL-3.0
22
pragma solidity ^0.8.20;
33

4-
import {ModuleEntity, ValidationConfig} from "../interfaces/IModularAccount.sol";
5-
6-
// Validation flags layout:
7-
// 0b00000___ // unused
8-
// 0b_____A__ // isGlobal
9-
// 0b______B_ // isSignatureValidation
10-
// 0b_______C // isUserOpValidation
11-
type ValidationFlags is uint8;
4+
import {ModuleEntity, ValidationConfig, ValidationFlags} from "../interfaces/IModularAccount.sol";
125

136
// Validation config is a packed representation of a validation function and flags for its configuration.
147
// Layout:
158
// 0xAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA________________________ // Address
169
// 0x________________________________________BBBBBBBB________________ // Entity ID
17-
// 0x________________________________________________CC______________ // validation flags
10+
// 0x________________________________________________CC______________ // ValidationFlags
1811
// 0x__________________________________________________00000000000000 // unused
1912

20-
// Validation flags layout:
13+
// ValidationFlags layout:
2114
// 0b00000___ // unused
2215
// 0b_____A__ // isGlobal
2316
// 0b______B_ // isSignatureValidation

standard/ERCs/erc-6900.md

Lines changed: 16 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -97,17 +97,18 @@ type ModuleEntity is bytes24;
9797
9898
/// @dev A packed representation of a validation function and its associated flags.
9999
/// Consists of the following, left-aligned:
100-
/// Module address: 20 bytes
101-
/// Entity ID: 4 bytes
102-
/// Flags: 1 byte
103-
///
104-
/// Validation flags layout:
105-
/// 0b00000___ // unused
106-
/// 0b_____A__ // isGlobal
107-
/// 0b______B_ // isSignatureValidation
108-
/// 0b_______C // isUserOpValidation
100+
/// Module address: 20 bytes
101+
/// Entity ID: 4 bytes
102+
/// ValidationFlags: 1 byte
109103
type ValidationConfig is bytes25;
110104
105+
// ValidationFlags layout:
106+
// 0b00000___ // unused
107+
// 0b_____A__ // isGlobal
108+
// 0b______B_ // isSignatureValidation
109+
// 0b_______C // isUserOpValidation
110+
type ValidationFlags is uint8;
111+
111112
/// @dev A packed representation of a hook function and its associated flags.
112113
/// Consists of the following, left-aligned:
113114
/// Module address: 20 bytes
@@ -239,12 +240,12 @@ struct ExecutionDataView {
239240
}
240241
241242
struct ValidationDataView {
242-
// Whether or not this validation function can be used as a global validation function.
243-
bool isGlobal;
244-
// Whether or not this validation function is a signature validator.
245-
bool isSignatureValidation;
246-
// Whether or not this validation function is a user operation validation function.
247-
bool isUserOpValidation;
243+
// ValidationFlags layout:
244+
// 0b00000___ // unused
245+
// 0b_____A__ // isGlobal
246+
// 0b______B_ // isSignatureValidation
247+
// 0b_______C // isUserOpValidation
248+
ValidationFlags validationFlags;
248249
// The validation hooks for this validation function.
249250
HookConfig[] validationHooks;
250251
// Execution hooks to run with this validation function.

test/account/ModularAccountView.t.sol

Lines changed: 8 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -3,16 +3,18 @@ pragma solidity ^0.8.20;
33

44
import {UUPSUpgradeable} from "@openzeppelin/contracts/proxy/utils/UUPSUpgradeable.sol";
55

6+
import {HookConfig, IModularAccount, ValidationFlags} from "../../src/interfaces/IModularAccount.sol";
7+
import {ExecutionDataView, ValidationDataView} from "../../src/interfaces/IModularAccountView.sol";
68
import {HookConfigLib} from "../../src/libraries/HookConfigLib.sol";
79
import {ModuleEntity, ModuleEntityLib} from "../../src/libraries/ModuleEntityLib.sol";
8-
9-
import {HookConfig, IModularAccount} from "../../src/interfaces/IModularAccount.sol";
10-
import {ExecutionDataView, ValidationDataView} from "../../src/interfaces/IModularAccountView.sol";
10+
import {ValidationConfigLib} from "../../src/libraries/ValidationConfigLib.sol";
1111

1212
import {ComprehensiveModule} from "../mocks/modules/ComprehensiveModule.sol";
1313
import {CustomValidationTestBase} from "../utils/CustomValidationTestBase.sol";
1414

1515
contract ModularAccountViewTest is CustomValidationTestBase {
16+
using ValidationConfigLib for ValidationFlags;
17+
1618
ComprehensiveModule public comprehensiveModule;
1719

1820
event ReceivedCall(bytes msgData, uint256 msgValue);
@@ -100,9 +102,9 @@ contract ModularAccountViewTest is CustomValidationTestBase {
100102
ValidationDataView memory data = account1.getValidationData(comprehensiveModuleValidation);
101103
bytes4[] memory selectors = data.selectors;
102104

103-
assertTrue(data.isGlobal);
104-
assertTrue(data.isSignatureValidation);
105-
assertTrue(data.isUserOpValidation);
105+
assertTrue(data.validationFlags.isGlobal());
106+
assertTrue(data.validationFlags.isSignatureValidation());
107+
assertTrue(data.validationFlags.isUserOpValidation());
106108
assertEq(data.validationHooks.length, 2);
107109
assertEq(
108110
HookConfig.unwrap(data.validationHooks[0]),

0 commit comments

Comments
 (0)