Skip to content

Commit 3ad5172

Browse files
committed
feat: add bytes calldata param to pass arbitrary data to resolvers
1 parent 6f5e84a commit 3ad5172

11 files changed

+75
-36
lines changed

src/IRegistry.sol

+13-3
Original file line numberDiff line numberDiff line change
@@ -236,12 +236,14 @@ interface IRegistry is IERC7484 {
236236
* @param metadata The metadata to be stored on the registry.
237237
* This field is optional, and might be used by the module developer to store additional
238238
* information about the module or facilitate business logic with the Resolver stub
239+
* @param resolverContext bytes that will be passed to the resolver contract
239240
*/
240241
function deployModule(
241242
bytes32 salt,
242243
ResolverUID resolverUID,
243244
bytes calldata initCode,
244-
bytes calldata metadata
245+
bytes calldata metadata,
246+
bytes calldata resolverContext
245247
)
246248
external
247249
payable
@@ -260,7 +262,8 @@ interface IRegistry is IERC7484 {
260262
address factory,
261263
bytes calldata callOnFactory,
262264
bytes calldata metadata,
263-
ResolverUID resolverUID
265+
ResolverUID resolverUID,
266+
bytes calldata resolverContext
264267
)
265268
external
266269
payable
@@ -278,8 +281,15 @@ interface IRegistry is IERC7484 {
278281
* @param metadata The metadata to be stored on the registry.
279282
* This field is optional, and might be used by the module developer to store additional
280283
* information about the module or facilitate business logic with the Resolver stub
284+
* @param resolverContext bytes that will be passed to the resolver contract
281285
*/
282-
function registerModule(ResolverUID resolverUID, address moduleAddress, bytes calldata metadata) external;
286+
function registerModule(
287+
ResolverUID resolverUID,
288+
address moduleAddress,
289+
bytes calldata metadata,
290+
bytes calldata resolverContext
291+
)
292+
external;
283293

284294
/**
285295
* in conjunction with the deployModule() function, this function let's you

src/core/ModuleManager.sol

+27-6
Original file line numberDiff line numberDiff line change
@@ -41,7 +41,8 @@ abstract contract ModuleManager is IRegistry, ResolverManager {
4141
bytes32 salt,
4242
ResolverUID resolverUID,
4343
bytes calldata initCode,
44-
bytes calldata metadata
44+
bytes calldata metadata,
45+
bytes calldata resolverContext
4546
)
4647
external
4748
payable
@@ -56,7 +57,11 @@ abstract contract ModuleManager is IRegistry, ResolverManager {
5657
ModuleRecord memory record =
5758
_storeModuleRecord({ moduleAddress: moduleAddress, sender: msg.sender, resolverUID: resolverUID, metadata: metadata });
5859

59-
record.requireExternalResolverOnModuleRegistration({ moduleAddress: moduleAddress, $resolver: $resolver });
60+
record.requireExternalResolverOnModuleRegistration({
61+
moduleAddress: moduleAddress,
62+
$resolver: $resolver,
63+
resolverContext: resolverContext
64+
});
6065
}
6166

6267
/**
@@ -69,7 +74,14 @@ abstract contract ModuleManager is IRegistry, ResolverManager {
6974
/**
7075
* @inheritdoc IRegistry
7176
*/
72-
function registerModule(ResolverUID resolverUID, address moduleAddress, bytes calldata metadata) external {
77+
function registerModule(
78+
ResolverUID resolverUID,
79+
address moduleAddress,
80+
bytes calldata metadata,
81+
bytes calldata resolverContext
82+
)
83+
external
84+
{
7385
ResolverRecord storage $resolver = $resolvers[resolverUID];
7486

7587
// ensure that non-zero resolverUID was provided
@@ -83,7 +95,11 @@ abstract contract ModuleManager is IRegistry, ResolverManager {
8395
});
8496

8597
// resolve module registration
86-
record.requireExternalResolverOnModuleRegistration({ moduleAddress: moduleAddress, $resolver: $resolver });
98+
record.requireExternalResolverOnModuleRegistration({
99+
moduleAddress: moduleAddress,
100+
$resolver: $resolver,
101+
resolverContext: resolverContext
102+
});
87103
}
88104

89105
/**
@@ -93,7 +109,8 @@ abstract contract ModuleManager is IRegistry, ResolverManager {
93109
address factory,
94110
bytes calldata callOnFactory,
95111
bytes calldata metadata,
96-
ResolverUID resolverUID
112+
ResolverUID resolverUID,
113+
bytes calldata resolverContext
97114
)
98115
external
99116
payable
@@ -118,7 +135,11 @@ abstract contract ModuleManager is IRegistry, ResolverManager {
118135
metadata: metadata
119136
});
120137

121-
record.requireExternalResolverOnModuleRegistration({ moduleAddress: moduleAddress, $resolver: $resolver });
138+
record.requireExternalResolverOnModuleRegistration({
139+
moduleAddress: moduleAddress,
140+
$resolver: $resolver,
141+
resolverContext: resolverContext
142+
});
122143
}
123144

124145
/**

src/external/IExternalResolver.sol

+2-1
Original file line numberDiff line numberDiff line change
@@ -44,7 +44,8 @@ interface IExternalResolver is IERC165 {
4444
function resolveModuleRegistration(
4545
address sender,
4646
address moduleAddress,
47-
ModuleRecord calldata record
47+
ModuleRecord calldata record,
48+
bytes calldata resolverContext
4849
)
4950
external
5051
payable

src/external/examples/TokenizedResolver.sol

+2-1
Original file line numberDiff line numberDiff line change
@@ -25,7 +25,8 @@ contract TokenizedResolver is ResolverBase {
2525
function resolveModuleRegistration(
2626
address sender,
2727
address moduleAddress,
28-
ModuleRecord calldata record
28+
ModuleRecord calldata record,
29+
bytes calldata resolverContext
2930
)
3031
external
3132
payable

src/lib/StubLib.sol

+8-3
Original file line numberDiff line numberDiff line change
@@ -146,16 +146,21 @@ library StubLib {
146146
function requireExternalResolverOnModuleRegistration(
147147
ModuleRecord memory moduleRecord,
148148
address moduleAddress,
149-
ResolverRecord storage $resolver
149+
ResolverRecord storage $resolver,
150+
bytes calldata resolverContext
150151
)
151152
internal
152153
{
153154
IExternalResolver resolverContract = $resolver.resolver;
154155

155156
if (
156157
address(resolverContract) != ZERO_ADDRESS
157-
&& resolverContract.resolveModuleRegistration({ sender: msg.sender, moduleAddress: moduleAddress, record: moduleRecord })
158-
== false
158+
&& resolverContract.resolveModuleRegistration({
159+
sender: msg.sender,
160+
moduleAddress: moduleAddress,
161+
record: moduleRecord,
162+
resolverContext: resolverContext
163+
}) == false
159164
) {
160165
revert IRegistry.ExternalError_ModuleRegistration();
161166
}

test/Attestation.t.sol

+2-2
Original file line numberDiff line numberDiff line change
@@ -32,7 +32,7 @@ contract AttestationTest is BaseTest {
3232

3333
function test_WhenAttestingWithNoAttestationData() public prankWithAccount(attester1) {
3434
address module = address(new MockModule());
35-
registry.registerModule(defaultResolverUID, module, "");
35+
registry.registerModule(defaultResolverUID, module, "", "");
3636
uint32[] memory types = new uint32[](1);
3737
AttestationRequest memory request = mockAttestation(module, uint48(block.timestamp + 1), "", types);
3838
// It should store.
@@ -154,7 +154,7 @@ contract AttestationTest is BaseTest {
154154

155155
function test_WhenReAttestingToARevokedAttestation() public prankWithAccount(attester1) {
156156
address module = address(new MockModule());
157-
registry.registerModule(defaultResolverUID, module, "");
157+
registry.registerModule(defaultResolverUID, module, "", "");
158158
uint32[] memory types = new uint32[](1);
159159
AttestationRequest memory request = mockAttestation(module, uint48(block.timestamp + 1), "", types);
160160
// It should store.

test/Base.t.sol

+3-3
Original file line numberDiff line numberDiff line change
@@ -94,11 +94,11 @@ contract BaseTest is Test {
9494
defaultSchemaUID = registry.registerSchema(defaultSchema, IExternalSchemaValidator(address(schemaValidatorTrue)));
9595

9696
vm.prank(moduleDev1.addr);
97-
registry.registerModule(defaultResolverUID, address(module1), "");
97+
registry.registerModule(defaultResolverUID, address(module1), "", "");
9898
vm.prank(moduleDev2.addr);
99-
registry.registerModule(defaultResolverUID, address(module2), "");
99+
registry.registerModule(defaultResolverUID, address(module2), "", "");
100100
vm.prank(moduleDev1.addr);
101-
registry.registerModule(differentResolverUID, address(module3), "");
101+
registry.registerModule(differentResolverUID, address(module3), "", "");
102102

103103
AttestationRequest memory req = AttestationRequest({
104104
moduleAddr: address(module1),

test/Factory.t.sol

+1-1
Original file line numberDiff line numberDiff line change
@@ -25,7 +25,7 @@ contract FactoryTest is BaseTest {
2525
vm.startPrank(address(0x05a40beAF368EB6b2bc5665901a885C044C19346));
2626
address moduleAddr = registry.calcModuleAddress(salt, type(MockModuleFoo).creationCode);
2727

28-
address deployedAddr = registry.deployModule(salt, defaultResolverUID, type(MockModuleFoo).creationCode, "");
28+
address deployedAddr = registry.deployModule(salt, defaultResolverUID, type(MockModuleFoo).creationCode, "", "");
2929
vm.stopPrank();
3030
assertTrue(moduleAddr == deployedAddr);
3131
}

test/ModuleRegistration.t.sol

+13-13
Original file line numberDiff line numberDiff line change
@@ -22,7 +22,7 @@ contract ModuleRegistrationTest is BaseTest {
2222

2323
bytes memory bytecode = type(MockModule).creationCode;
2424

25-
address moduleAddr = registry.deployModule(salt, defaultResolverUID, bytecode, "");
25+
address moduleAddr = registry.deployModule(salt, defaultResolverUID, bytecode, "", "");
2626
ModuleRecord memory record = registry.findModule(moduleAddr);
2727
assertTrue(record.resolverUID == defaultResolverUID);
2828
}
@@ -33,7 +33,7 @@ contract ModuleRegistrationTest is BaseTest {
3333
bytes memory bytecode = type(MockModuleWithArgs).creationCode;
3434
bytes memory initCode = abi.encodePacked(bytecode, abi.encode(313_131));
3535

36-
address moduleAddr = registry.deployModule(salt, defaultResolverUID, initCode, "");
36+
address moduleAddr = registry.deployModule(salt, defaultResolverUID, initCode, "", "");
3737

3838
address moduleAddrCalc = registry.calcModuleAddress(salt, initCode);
3939
assertTrue(moduleAddr == moduleAddrCalc);
@@ -44,35 +44,35 @@ contract ModuleRegistrationTest is BaseTest {
4444
// It should revert.
4545
ResolverUID invalidUID = ResolverUID.wrap(hex"00");
4646
vm.expectRevert(abi.encodeWithSelector(IRegistry.InvalidResolver.selector, address(0)));
47-
registry.registerModule(invalidUID, address(newModule), "");
47+
registry.registerModule(invalidUID, address(newModule), "", "");
4848

4949
invalidUID = ResolverUID.wrap("1");
5050
vm.expectRevert(abi.encodeWithSelector(IRegistry.InvalidResolver.selector, address(0)));
51-
registry.registerModule(invalidUID, address(newModule), "");
51+
registry.registerModule(invalidUID, address(newModule), "", "");
5252
}
5353

5454
function test_WhenRegisteringAModuleOnAValidResolverUID() external prankWithAccount(moduleDev1) {
5555
// It should register.
5656

5757
MockModule newModule = new MockModule();
58-
registry.registerModule(defaultResolverUID, address(newModule), "");
58+
registry.registerModule(defaultResolverUID, address(newModule), "", "");
5959
}
6060

6161
function test_WhenRegisteringAModuleOnAInValidResolverUID() external prankWithAccount(moduleDev1) {
6262
// It should revert
6363

6464
MockModule newModule = new MockModule();
6565
vm.expectRevert(abi.encodeWithSelector(IRegistry.InvalidResolver.selector, address(0)));
66-
registry.registerModule(ResolverUID.wrap(bytes32("foobar")), address(newModule), "");
66+
registry.registerModule(ResolverUID.wrap(bytes32("foobar")), address(newModule), "", "");
6767
}
6868

6969
function test_WhenRegisteringTwoModulesWithTheSameBytecode() external prankWithAccount(moduleDev1) {
7070
MockModule newModule = new MockModule();
7171
// It should revert.
72-
registry.registerModule(defaultResolverUID, address(newModule), "");
72+
registry.registerModule(defaultResolverUID, address(newModule), "", "");
7373

7474
vm.expectRevert(abi.encodeWithSelector(IRegistry.AlreadyRegistered.selector, address(newModule)));
75-
registry.registerModule(defaultResolverUID, address(newModule), "");
75+
registry.registerModule(defaultResolverUID, address(newModule), "", "");
7676
}
7777

7878
function test_WhenRegisteringViaFactory() public {
@@ -82,25 +82,25 @@ contract ModuleRegistrationTest is BaseTest {
8282

8383
factory.setReturnAddress(address(0));
8484
vm.expectRevert();
85-
registry.deployViaFactory(address(factory), abi.encodeCall(factory.deployFn, ()), "", defaultResolverUID);
85+
registry.deployViaFactory(address(factory), abi.encodeCall(factory.deployFn, ()), "", defaultResolverUID, "");
8686

8787
factory.setReturnAddress(address(1));
8888
vm.expectRevert();
8989

90-
registry.deployViaFactory(address(factory), abi.encodeCall(factory.deployFn, ()), "", defaultResolverUID);
90+
registry.deployViaFactory(address(factory), abi.encodeCall(factory.deployFn, ()), "", defaultResolverUID, "");
9191

9292
MockModule newModule = new MockModule();
9393
factory.setReturnAddress(address(newModule));
94-
registry.deployViaFactory(address(factory), abi.encodeCall(factory.deployFn, ()), "", defaultResolverUID);
94+
registry.deployViaFactory(address(factory), abi.encodeCall(factory.deployFn, ()), "", defaultResolverUID, "");
9595
}
9696

9797
function test_WhenUsingInvalidFactory() public {
9898
vm.expectRevert();
99-
registry.deployViaFactory(address(0), "", "", defaultResolverUID);
99+
registry.deployViaFactory(address(0), "", "", defaultResolverUID, "");
100100
}
101101

102102
function test_WhenUsingRegistryASFactory() public {
103103
vm.expectRevert();
104-
registry.deployViaFactory(address(registry), "", "", defaultResolverUID);
104+
registry.deployViaFactory(address(registry), "", "", defaultResolverUID, "");
105105
}
106106
}

test/invariance/Handler.t.sol

+2-2
Original file line numberDiff line numberDiff line change
@@ -66,7 +66,7 @@ contract Handler is CommonBase, StdCheats, StdUtils {
6666
vm.etch(moduleAddr, bytecode);
6767
ResolverUID uid = _pickRandomResolverUID(randomResolverNr);
6868

69-
REGISTRY.registerModule(uid, moduleAddr, metadata);
69+
REGISTRY.registerModule(uid, moduleAddr, metadata, "");
7070
}
7171

7272
function _pickTypes() private pure returns (ModuleType[] memory ret) {
@@ -117,6 +117,6 @@ contract Handler is CommonBase, StdCheats, StdUtils {
117117
function handle_registerModuleWithFactory(uint256 randomResolverNr, bytes calldata bytecode, uint256 value) external {
118118
vm.deal(address(this), value);
119119
ResolverUID uid = _pickRandomResolverUID(randomResolverNr);
120-
REGISTRY.deployViaFactory{ value: value }(address(FACTORY), abi.encodeCall(MockFactory.deploy, (bytecode)), "", uid);
120+
REGISTRY.deployViaFactory{ value: value }(address(FACTORY), abi.encodeCall(MockFactory.deploy, (bytecode)), "", uid, "");
121121
}
122122
}

test/mocks/MockResolver.sol

+2-1
Original file line numberDiff line numberDiff line change
@@ -49,7 +49,8 @@ contract MockResolver is IExternalResolver {
4949
function resolveModuleRegistration(
5050
address sender,
5151
address moduleRecord,
52-
ModuleRecord calldata record
52+
ModuleRecord calldata record,
53+
bytes calldata resolverContext
5354
)
5455
external
5556
payable

0 commit comments

Comments
 (0)