Skip to content

Commit afd714e

Browse files
committed
feat: consistency in hook UDVTs for ValidationDataView
1 parent 42c537d commit afd714e

File tree

9 files changed

+38
-36
lines changed

9 files changed

+38
-36
lines changed

src/account/AccountStorage.sol

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -31,8 +31,8 @@ struct ValidationData {
3131
bool isSignatureValidation;
3232
// Whether or not this validation is allowed to validate ERC-4337 user operations.
3333
bool isUserOpValidation;
34-
// The pre validation hooks for this validation function.
35-
ModuleEntity[] preValidationHooks;
34+
// The validation hooks for this validation function.
35+
HookConfig[] validationHooks;
3636
// Execution hooks to run with this validation function.
3737
EnumerableSet.Bytes32Set executionHooks;
3838
// The set of selectors that may be validated by this validation function.

src/account/ModularAccountView.sol

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -50,7 +50,7 @@ abstract contract ModularAccountView is IModularAccountView {
5050
data.isGlobal = validationData.isGlobal;
5151
data.isSignatureValidation = validationData.isSignatureValidation;
5252
data.isUserOpValidation = validationData.isUserOpValidation;
53-
data.preValidationHooks = validationData.preValidationHooks;
53+
data.validationHooks = validationData.validationHooks;
5454

5555
uint256 execHooksLen = validationData.executionHooks.length();
5656
data.executionHooks = new HookConfig[](execHooksLen);

src/account/ModuleManagerInternals.sol

Lines changed: 6 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -233,10 +233,10 @@ abstract contract ModuleManagerInternals is IModularAccount {
233233
bytes calldata hookData = hooks[i][25:];
234234

235235
if (hookConfig.isValidationHook()) {
236-
_validationData.preValidationHooks.push(hookConfig.moduleEntity());
236+
_validationData.validationHooks.push(hookConfig);
237237

238238
// Avoid collision between reserved index and actual indices
239-
if (_validationData.preValidationHooks.length > MAX_PRE_VALIDATION_HOOKS) {
239+
if (_validationData.validationHooks.length > MAX_PRE_VALIDATION_HOOKS) {
240240
revert PreValidationHookLimitExceeded();
241241
}
242242

@@ -280,16 +280,16 @@ abstract contract ModuleManagerInternals is IModularAccount {
280280
// If any uninstall data is provided, assert it is of the correct length.
281281
if (
282282
hookUninstallDatas.length
283-
!= _validationData.preValidationHooks.length + _validationData.executionHooks.length()
283+
!= _validationData.validationHooks.length + _validationData.executionHooks.length()
284284
) {
285285
revert ArrayLengthMismatch();
286286
}
287287

288288
// Hook uninstall data is provided in the order of pre validation hooks, then execution hooks.
289289
uint256 hookIndex = 0;
290-
for (uint256 i = 0; i < _validationData.preValidationHooks.length; ++i) {
290+
for (uint256 i = 0; i < _validationData.validationHooks.length; ++i) {
291291
bytes calldata hookData = hookUninstallDatas[hookIndex];
292-
(address hookModule,) = ModuleEntityLib.unpack(_validationData.preValidationHooks[i]);
292+
(address hookModule,) = ModuleEntityLib.unpack(_validationData.validationHooks[i].moduleEntity());
293293
onUninstallSuccess = onUninstallSuccess && _onUninstall(hookModule, hookData);
294294
hookIndex++;
295295
}
@@ -304,7 +304,7 @@ abstract contract ModuleManagerInternals is IModularAccount {
304304
}
305305

306306
// Clear all stored hooks
307-
delete _validationData.preValidationHooks;
307+
delete _validationData.validationHooks;
308308

309309
EnumerableSet.Bytes32Set storage executionHooks = _validationData.executionHooks;
310310
uint256 executionHookLen = executionHooks.length();

src/account/ReferenceModularAccount.sol

Lines changed: 12 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -311,11 +311,11 @@ contract ReferenceModularAccount is
311311
ModuleEntity sigValidation = ModuleEntity.wrap(bytes24(signature));
312312
signature = signature[24:];
313313

314-
ModuleEntity[] memory preSignatureValidationHooks =
315-
getAccountStorage().validationData[sigValidation].preValidationHooks;
314+
HookConfig[] memory preSignatureValidationHooks =
315+
getAccountStorage().validationData[sigValidation].validationHooks;
316316

317317
for (uint256 i = 0; i < preSignatureValidationHooks.length; ++i) {
318-
(address hookModule, uint32 hookEntityId) = preSignatureValidationHooks[i].unpack();
318+
(address hookModule, uint32 hookEntityId) = preSignatureValidationHooks[i].moduleEntity().unpack();
319319

320320
bytes memory currentSignatureSegment;
321321

@@ -384,13 +384,13 @@ contract ReferenceModularAccount is
384384
uint256 validationRes;
385385

386386
// Do preUserOpValidation hooks
387-
ModuleEntity[] memory preUserOpValidationHooks =
388-
getAccountStorage().validationData[userOpValidationFunction].preValidationHooks;
387+
HookConfig[] memory preUserOpValidationHooks =
388+
getAccountStorage().validationData[userOpValidationFunction].validationHooks;
389389

390390
for (uint256 i = 0; i < preUserOpValidationHooks.length; ++i) {
391391
(userOp.signature, signature) = signature.advanceSegmentIfAtIndex(uint8(i));
392392

393-
(address module, uint32 entityId) = preUserOpValidationHooks[i].unpack();
393+
(address module, uint32 entityId) = preUserOpValidationHooks[i].moduleEntity().unpack();
394394
uint256 currentValidationRes =
395395
IValidationHookModule(module).preUserOpValidationHook(entityId, userOp, userOpHash);
396396

@@ -424,15 +424,15 @@ contract ReferenceModularAccount is
424424
bytes calldata authorizationData
425425
) internal {
426426
// run all preRuntimeValidation hooks
427-
ModuleEntity[] memory preRuntimeValidationHooks =
428-
getAccountStorage().validationData[runtimeValidationFunction].preValidationHooks;
427+
HookConfig[] memory preRuntimeValidationHooks =
428+
getAccountStorage().validationData[runtimeValidationFunction].validationHooks;
429429

430430
for (uint256 i = 0; i < preRuntimeValidationHooks.length; ++i) {
431431
bytes memory currentAuthSegment;
432432

433433
(currentAuthSegment, authorizationData) = authorizationData.advanceSegmentIfAtIndex(uint8(i));
434434

435-
_doPreRuntimeValidationHook(preRuntimeValidationHooks[i], callData, currentAuthSegment);
435+
_doPreRuntimeValidationHook(preRuntimeValidationHooks[i].moduleEntity(), callData, currentAuthSegment);
436436
}
437437

438438
authorizationData = authorizationData.getFinalSegment();
@@ -569,12 +569,12 @@ contract ReferenceModularAccount is
569569
// Direct call is allowed, run associated execution & validation hooks
570570

571571
// Validation hooks
572-
ModuleEntity[] memory preRuntimeValidationHooks =
573-
_storage.validationData[directCallValidationKey].preValidationHooks;
572+
HookConfig[] memory preRuntimeValidationHooks =
573+
_storage.validationData[directCallValidationKey].validationHooks;
574574

575575
uint256 hookLen = preRuntimeValidationHooks.length;
576576
for (uint256 i = 0; i < hookLen; ++i) {
577-
_doPreRuntimeValidationHook(preRuntimeValidationHooks[i], msg.data, "");
577+
_doPreRuntimeValidationHook(preRuntimeValidationHooks[i].moduleEntity(), msg.data, "");
578578
}
579579

580580
// Execution hooks associated with the validator

src/interfaces/IModularAccountView.sol

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -26,8 +26,8 @@ struct ValidationDataView {
2626
bool isSignatureValidation;
2727
// Whether or not this validation function is a user operation validation function.
2828
bool isUserOpValidation;
29-
// The pre validation hooks for this validation function.
30-
ModuleEntity[] preValidationHooks;
29+
// The validation hooks for this validation function.
30+
HookConfig[] validationHooks;
3131
// Execution hooks to run with this validation function.
3232
HookConfig[] executionHooks;
3333
// The set of selectors that may be validated by this validation function.

standard/ERCs/erc-6900.md

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -245,8 +245,8 @@ struct ValidationDataView {
245245
bool isSignatureValidation;
246246
// Whether or not this validation function is a user operation validation function.
247247
bool isUserOpValidation;
248-
// The pre validation hooks for this validation function.
249-
ModuleEntity[] preValidationHooks;
248+
// The validation hooks for this validation function.
249+
HookConfig[] validationHooks;
250250
// Execution hooks to run with this validation function.
251251
HookConfig[] executionHooks;
252252
// The set of selectors that may be validated by this validation function.

test/account/ModularAccountView.t.sol

Lines changed: 7 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -103,19 +103,19 @@ contract ModularAccountViewTest is CustomValidationTestBase {
103103
assertTrue(data.isGlobal);
104104
assertTrue(data.isSignatureValidation);
105105
assertTrue(data.isUserOpValidation);
106-
assertEq(data.preValidationHooks.length, 2);
106+
assertEq(data.validationHooks.length, 2);
107107
assertEq(
108-
ModuleEntity.unwrap(data.preValidationHooks[0]),
109-
ModuleEntity.unwrap(
110-
ModuleEntityLib.pack(
108+
HookConfig.unwrap(data.validationHooks[0]),
109+
HookConfig.unwrap(
110+
HookConfigLib.packValidationHook(
111111
address(comprehensiveModule), uint32(ComprehensiveModule.EntityId.PRE_VALIDATION_HOOK_1)
112112
)
113113
)
114114
);
115115
assertEq(
116-
ModuleEntity.unwrap(data.preValidationHooks[1]),
117-
ModuleEntity.unwrap(
118-
ModuleEntityLib.pack(
116+
HookConfig.unwrap(data.validationHooks[1]),
117+
HookConfig.unwrap(
118+
HookConfigLib.packValidationHook(
119119
address(comprehensiveModule), uint32(ComprehensiveModule.EntityId.PRE_VALIDATION_HOOK_2)
120120
)
121121
)

test/module/NativeTokenLimitModule.t.sol

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -11,7 +11,7 @@ import {ModuleEntityLib} from "../../src/helpers/ModuleEntityLib.sol";
1111
import {HookConfigLib} from "../../src/helpers/HookConfigLib.sol";
1212
import {ValidationConfigLib} from "../../src/helpers/ValidationConfigLib.sol";
1313
import {ExecutionManifest} from "../../src/interfaces/IExecutionModule.sol";
14-
import {Call, IModularAccount} from "../../src/interfaces/IModularAccount.sol";
14+
import {Call, HookConfig, IModularAccount} from "../../src/interfaces/IModularAccount.sol";
1515
import {NativeTokenLimitModule} from "../../src/modules/NativeTokenLimitModule.sol";
1616
import {MockModule} from "../mocks/MockModule.sol";
1717

@@ -35,8 +35,8 @@ contract NativeTokenLimitModuleTest is AccountTestBase {
3535

3636
vm.deal(address(acct), 10 ether);
3737

38-
ModuleEntity[] memory preValidationHooks = new ModuleEntity[](1);
39-
preValidationHooks[0] = ModuleEntityLib.pack(address(module), 0);
38+
HookConfig[] memory validationHooks = new HookConfig[](1);
39+
validationHooks[0] = HookConfigLib.packValidationHook(address(module), 0);
4040

4141
uint256[] memory spendLimits = new uint256[](1);
4242
spendLimits[0] = spendLimit;

test/utils/AccountTestBase.sol

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -7,8 +7,9 @@ import {MessageHashUtils} from "@openzeppelin/contracts/utils/cryptography/Messa
77

88
import {ReferenceModularAccount} from "../../src/account/ReferenceModularAccount.sol";
99
import {SemiModularAccount} from "../../src/account/SemiModularAccount.sol";
10+
import {HookConfigLib} from "../../src/helpers/HookConfigLib.sol";
1011
import {ModuleEntity, ModuleEntityLib} from "../../src/helpers/ModuleEntityLib.sol";
11-
import {Call, IModularAccount} from "../../src/interfaces/IModularAccount.sol";
12+
import {Call, HookConfig, IModularAccount} from "../../src/interfaces/IModularAccount.sol";
1213
import {SingleSignerValidationModule} from "../../src/modules/validation/SingleSignerValidationModule.sol";
1314

1415
import {OptimizedTest} from "./OptimizedTest.sol";
@@ -20,6 +21,7 @@ import {SingleSignerFactoryFixture} from "../mocks/SingleSignerFactoryFixture.so
2021
/// @dev This contract handles common boilerplate setup for tests using ReferenceModularAccount with
2122
/// SingleSignerValidationModule.
2223
abstract contract AccountTestBase is OptimizedTest {
24+
using HookConfigLib for HookConfig;
2325
using ModuleEntityLib for ModuleEntity;
2426
using MessageHashUtils for bytes32;
2527

0 commit comments

Comments
 (0)