Skip to content

Commit b147ced

Browse files
Add configurable reverse node to ReverseRegistrar (#85)
1 parent 39d8539 commit b147ced

File tree

4 files changed

+21
-19
lines changed

4 files changed

+21
-19
lines changed

script/deploy/DeployReverseRegistrar.s.sol

+4-3
Original file line numberDiff line numberDiff line change
@@ -18,14 +18,15 @@ contract DeployReverseRegistrar is Script {
1818

1919
ReverseRegistrar revRegstrar = new ReverseRegistrar(
2020
Registry(ensAddress),
21-
deployerAddress // deployer as owner
21+
deployerAddress, // deployer as owner
22+
BASE_REVERSE_NODE
2223
);
2324

2425
// establish the reverse registrar as the owner of the 'addr.reverse' node
2526
bytes32 reverseLabel = keccak256("reverse");
26-
bytes32 addrLabel = keccak256("addr");
27+
bytes32 baseReverseLabel = keccak256("80002105");
2728
registry.setSubnodeOwner(0x0, reverseLabel, deployerAddress);
28-
registry.setSubnodeOwner(REVERSE_NODE, addrLabel, address(revRegstrar));
29+
registry.setSubnodeOwner(REVERSE_NODE, baseReverseLabel, address(revRegstrar));
2930

3031
console.log(address(revRegstrar));
3132

src/L2/ReverseRegistrar.sol

+12-9
Original file line numberDiff line numberDiff line change
@@ -5,16 +5,15 @@ import {ENS} from "ens-contracts/registry/ENS.sol";
55
import {NameResolver} from "ens-contracts/resolvers/profiles/NameResolver.sol";
66
import {Ownable} from "solady/auth/Ownable.sol";
77

8-
import {BASE_REVERSE_NODE} from "src/util/Constants.sol";
98
import {Sha3} from "src/lib/Sha3.sol";
109

1110
/// @title Reverse Registrar
1211
///
1312
/// @notice Registrar which allows registrants to establish a name as their "primary" record for reverse resolution.
1413
/// Inspired by ENS's ReverseRegistrar implementation:
1514
/// https://github.com/ensdomains/ens-contracts/blob/staging/contracts/reverseRegistrar/ReverseRegistrar.sol
16-
/// Writes records to the base-specific reverse node, compliant with ENSIP-19
17-
/// https://docs.ens.domains/ensip/19
15+
/// Writes records to the network-specific reverse node set on construction via `reverseNode`.
16+
/// Compliant with ENSIP-19: https://docs.ens.domains/ensip/19
1817
///
1918
/// @author Coinbase (https://github.com/base-org/usernames)
2019
/// @author ENS (https://github.com/ensdomains/ens-contracts)
@@ -26,6 +25,9 @@ contract ReverseRegistrar is Ownable {
2625
/// @notice The Registry contract.
2726
ENS public immutable registry;
2827

28+
/// @notice The reverse node this registrar manages.
29+
bytes32 public immutable reverseNode;
30+
2931
/// @notice Permissioned controller contracts.
3032
mapping(address controller => bool approved) public controllers;
3133

@@ -97,9 +99,10 @@ contract ReverseRegistrar is Ownable {
9799
///
98100
/// @param registry_ The ENS registry, will be stored as `registry`.
99101
/// @param owner_ The permissioned address initialized as the `owner` in the `Ownable` context.
100-
constructor(ENS registry_, address owner_) {
102+
constructor(ENS registry_, address owner_, bytes32 reverseNode_) {
101103
_initializeOwner(owner_);
102104
registry = registry_;
105+
reverseNode = reverseNode_;
103106
}
104107

105108
/// @notice Allows the owner to change the address of the default resolver.
@@ -111,7 +114,7 @@ contract ReverseRegistrar is Ownable {
111114
function setDefaultResolver(address resolver) public onlyOwner {
112115
if (address(resolver) == address(0)) revert NoZeroAddress();
113116
defaultResolver = NameResolver(resolver);
114-
registry.setResolver(BASE_REVERSE_NODE, resolver);
117+
registry.setResolver(reverseNode, resolver);
115118
emit DefaultResolverChanged(defaultResolver);
116119
}
117120

@@ -150,9 +153,9 @@ contract ReverseRegistrar is Ownable {
150153
returns (bytes32)
151154
{
152155
bytes32 labelHash = Sha3.hexAddress(addr);
153-
bytes32 baseReverseNode = keccak256(abi.encodePacked(BASE_REVERSE_NODE, labelHash));
156+
bytes32 baseReverseNode = keccak256(abi.encodePacked(reverseNode, labelHash));
154157
emit BaseReverseClaimed(addr, baseReverseNode);
155-
registry.setSubnodeRecord(BASE_REVERSE_NODE, labelHash, owner, resolver, 0);
158+
registry.setSubnodeRecord(reverseNode, labelHash, owner, resolver, 0);
156159
return baseReverseNode;
157160
}
158161

@@ -202,8 +205,8 @@ contract ReverseRegistrar is Ownable {
202205
/// @param addr The address to hash.
203206
///
204207
/// @return The base-specific reverse node hash.
205-
function node(address addr) public pure returns (bytes32) {
206-
return keccak256(abi.encodePacked(BASE_REVERSE_NODE, Sha3.hexAddress(addr)));
208+
function node(address addr) public view returns (bytes32) {
209+
return keccak256(abi.encodePacked(reverseNode, Sha3.hexAddress(addr)));
207210
}
208211

209212
/// @notice Allows this contract to check if msg.sender is the `Ownable:owner()` for `addr`.

test/IntegrationTest.t.sol

+3-5
Original file line numberDiff line numberDiff line change
@@ -22,7 +22,7 @@ import {
2222
ETH_NODE,
2323
BASE_ETH_NODE,
2424
REVERSE_NODE,
25-
ADDR_REVERSE_NODE,
25+
BASE_REVERSE_NODE,
2626
GRACE_PERIOD,
2727
BASE_ETH_NAME
2828
} from "src/util/Constants.sol";
@@ -59,7 +59,7 @@ contract IntegrationTest is Test {
5959
payments = makeAddr("payments");
6060

6161
registry = new Registry(owner);
62-
reverseRegistrar = new ReverseRegistrar(registry, owner);
62+
reverseRegistrar = new ReverseRegistrar(registry, owner, BASE_REVERSE_NODE);
6363

6464
uint256[] memory rentPrices = new uint256[](6);
6565
rentPrices[0] = 317_097_919_837;
@@ -107,10 +107,8 @@ contract IntegrationTest is Test {
107107
registry.setSubnodeOwner(ROOT_NODE, ETH_LABEL, owner);
108108
registry.setSubnodeOwner(ETH_NODE, BASE_LABEL, address(baseRegistrar));
109109

110-
// establish addr.reverse namespace and assign ownership of addr.reverse to the reverse registrar
111-
registry.setSubnodeOwner(ROOT_NODE, REVERSE_LABEL, owner);
112-
registry.setSubnodeOwner(REVERSE_NODE, ADDR_LABEL, address(reverseRegistrar));
113110
// establish 80002105.reverse namespace and assign ownership to the reverse registrar
111+
registry.setSubnodeOwner(ROOT_NODE, REVERSE_LABEL, owner);
114112
registry.setSubnodeOwner(REVERSE_NODE, keccak256("80002105"), address(reverseRegistrar));
115113
vm.stopPrank();
116114
}

test/ReverseRegistrar/ReverseRegistrarBase.t.sol

+2-2
Original file line numberDiff line numberDiff line change
@@ -5,7 +5,7 @@ import {Test} from "forge-std/Test.sol";
55
import {ReverseRegistrar} from "src/L2/ReverseRegistrar.sol";
66
import {Registry} from "src/L2/Registry.sol";
77
import {ENS} from "ens-contracts/registry/ENS.sol";
8-
import {ETH_NODE, REVERSE_NODE} from "src/util/Constants.sol";
8+
import {ETH_NODE, REVERSE_NODE, BASE_REVERSE_NODE} from "src/util/Constants.sol";
99

1010
contract ReverseRegistrarBase is Test {
1111
address public owner = makeAddr("owner");
@@ -17,7 +17,7 @@ contract ReverseRegistrarBase is Test {
1717

1818
function setUp() public {
1919
registry = new Registry(owner);
20-
reverse = new ReverseRegistrar(ENS(address(registry)), owner);
20+
reverse = new ReverseRegistrar(ENS(address(registry)), owner, BASE_REVERSE_NODE);
2121
vm.prank(owner);
2222
reverse.setControllerApproval(controller, true);
2323
_registrySetup();

0 commit comments

Comments
 (0)