Skip to content

Commit 39d8539

Browse files
Fix resolve method on L1Resolver (#84)
* Fix method on L1Resolver * Use public RPC for forking * Lint * Fix typos in natspec * Remove inline comment in function args
1 parent 38c44ee commit 39d8539

File tree

2 files changed

+68
-1
lines changed

2 files changed

+68
-1
lines changed

src/L1/L1Resolver.sol

+23-1
Original file line numberDiff line numberDiff line change
@@ -164,7 +164,7 @@ contract L1Resolver is IExtendedResolver, ERC165, Ownable {
164164
function resolve(bytes calldata name, bytes calldata data) external view override returns (bytes memory) {
165165
// Check for base.eth resolution, and resolve return early if so
166166
if (keccak256(BASE_ETH_NAME) == keccak256(name)) {
167-
return IExtendedResolver(rootResolver).resolve(name, data);
167+
return _resolve(name, data);
168168
}
169169

170170
bytes memory callData = abi.encodeWithSelector(IExtendedResolver.resolve.selector, name, data);
@@ -207,6 +207,28 @@ contract L1Resolver is IExtendedResolver, ERC165, Ownable {
207207
|| ERC165(rootResolver).supportsInterface(interfaceID);
208208
}
209209

210+
/// @notice Internal method for completing `resolve` intended for the `rootResolver`.
211+
///
212+
/// @dev The `PublicResolver` located at `rootResolver` does not implement the `resolve(bytes,bytes)` method.
213+
/// This method completes the resolution request by staticcalling `rootResolver` with the resolve request.
214+
/// Implementation matches the ENS `ExtendedResolver:resolve(bytes,bytes)` method with the exception that it `staticcall`s the
215+
/// the `rootResolver` instead of `address(this)`.
216+
///
217+
/// @param data The ABI encoded data for the underlying resolution function (Eg, addr(bytes32), text(bytes32,string), etc).
218+
///
219+
/// @return The return data, ABI encoded identically to the underlying function.
220+
function _resolve(bytes memory, bytes memory data) internal view returns (bytes memory) {
221+
(bool success, bytes memory result) = rootResolver.staticcall(data);
222+
if (success) {
223+
return result;
224+
} else {
225+
// Revert with the reason provided by the call
226+
assembly {
227+
revert(add(result, 0x20), mload(result))
228+
}
229+
}
230+
}
231+
210232
/// @notice Generic handler for requests to the `rootResolver`
211233
///
212234
/// @dev Inspired by the passthrough logic of proxy contracts, but leveraging `call` instead of `delegatecall`
+45
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,45 @@
1+
//SPDX-License-Identifier: MIT
2+
pragma solidity ^0.8.23;
3+
4+
import {Test, console} from "forge-std/Test.sol";
5+
import {L1Resolver} from "src/L1/L1Resolver.sol";
6+
import {ENS} from "ens-contracts/registry/ENS.sol";
7+
import {IExtendedResolver} from "ens-contracts/resolvers/profiles/IExtendedResolver.sol";
8+
import "src/util/Constants.sol";
9+
import "ens-contracts/resolvers/profiles/IAddrResolver.sol";
10+
11+
contract L1ResolverMainnet is Test {
12+
address signer = 0x14536667Cd30e52C0b458BaACcB9faDA7046E056;
13+
ENS public ens = ENS(0x00000000000C2E074eC69A0dFb2997BA6C7d2e1e);
14+
address rootResolver = 0x4976fb03C32e5B8cfe2b6cCB31c09Ba78EBaBa41;
15+
address addrRoot;
16+
address l1resolver;
17+
18+
string constant URL = "TEST_URL";
19+
20+
function setUp() public {
21+
uint256 forkId = vm.createFork("https://eth.llamarpc.com");
22+
vm.selectFork(forkId);
23+
24+
address[] memory signers = new address[](1);
25+
signers[0] = signer;
26+
l1resolver = address(new L1Resolver(URL, signers, signer, rootResolver));
27+
28+
vm.startPrank(signer);
29+
ens.setResolver(BASE_ETH_NODE, l1resolver);
30+
assertEq(ens.resolver(BASE_ETH_NODE), l1resolver);
31+
addrRoot = IAddrResolver(rootResolver).addr(BASE_ETH_NODE);
32+
}
33+
34+
function test_resolves_addr() public view {
35+
address resolvedAddress = IAddrResolver(l1resolver).addr(BASE_ETH_NODE);
36+
assertEq(resolvedAddress, addrRoot);
37+
}
38+
39+
function test_resolves_resolve() public view {
40+
bytes memory data = abi.encodeWithSelector(IAddrResolver.addr.selector, BASE_ETH_NODE);
41+
bytes memory response = IExtendedResolver(l1resolver).resolve(BASE_ETH_NAME, data);
42+
(address resolvedAddress) = abi.decode(response, (address));
43+
assertEq(resolvedAddress, addrRoot);
44+
}
45+
}

0 commit comments

Comments
 (0)