11// SPDX-License-Identifier: MIT
22pragma solidity >= 0.8.13 ;
33
4- import {RegistryUtils} from "@ens/contracts/universalResolver/RegistryUtils.sol " ;
54import {NameCoder} from "@ens/contracts/utils/NameCoder.sol " ;
65import {INameWrapper, PARENT_CANNOT_CONTROL} from "@ens/contracts/wrapper/INameWrapper.sol " ;
76import {VerifiableFactory} from "@ensdomains/verifiable-factory/VerifiableFactory.sol " ;
@@ -21,7 +20,6 @@ import {IRegistryMetadata} from "../../common/registry/interfaces/IRegistryMetad
2120import {IStandardRegistry} from "../../common/registry/interfaces/IStandardRegistry.sol " ;
2221import {RegistryRolesLib} from "../../common/registry/libraries/RegistryRolesLib.sol " ;
2322import {PermissionedRegistry} from "../../common/registry/PermissionedRegistry.sol " ;
24- import {LibLabel} from "../../common/utils/LibLabel.sol " ;
2523import {LockedNamesLib} from "../migration/libraries/LockedNamesLib.sol " ;
2624import {ParentNotMigrated, LabelNotMigrated} from "../migration/MigrationErrors.sol " ;
2725
@@ -54,6 +52,8 @@ contract MigratedWrappedNameRegistry is
5452
5553 IPermissionedRegistry public immutable ETH_REGISTRY;
5654
55+ address public immutable FALLBACK_RESOLVER;
56+
5757 ////////////////////////////////////////////////////////////////////////
5858 // Storage
5959 ////////////////////////////////////////////////////////////////////////
@@ -76,11 +76,13 @@ contract MigratedWrappedNameRegistry is
7676 VerifiableFactory factory ,
7777 IRegistryDatastore datastore ,
7878 IHCAFactoryBasic hcaFactory ,
79- IRegistryMetadata metadataProvider
79+ IRegistryMetadata metadataProvider ,
80+ address fallbackResolver
8081 ) PermissionedRegistry (datastore, hcaFactory, metadataProvider, _msgSender (), 0 ) {
8182 NAME_WRAPPER = nameWrapper;
8283 ETH_REGISTRY = ethRegistry;
8384 FACTORY = factory;
85+ FALLBACK_RESOLVER = fallbackResolver;
8486 // Prevents initialization on the implementation contract
8587 _disableInitializers ();
8688 }
@@ -171,36 +173,20 @@ contract MigratedWrappedNameRegistry is
171173 return this .onERC1155BatchReceived.selector ;
172174 }
173175
174- function getResolver (string calldata label ) external view override returns (address ) {
175- uint256 canonicalId = LibLabel.labelToCanonicalId (label);
176- IRegistryDatastore.Entry memory entry = this .getEntry (canonicalId);
177- uint64 expires = entry.expiry;
178-
179- // Use fallback resolver for unregistered names
180- if (expires == 0 ) {
181- // Construct complete domain name for registry lookup
182- bytes memory dnsEncodedName = abi.encodePacked (
183- bytes1 (uint8 (bytes (label).length )),
184- label,
185- parentDnsEncodedName
186- );
187-
188- // Retrieve resolver from legacy registry system
189- (address resolverAddress , , ) = RegistryUtils.findResolver (
190- NAME_WRAPPER.ens (),
191- dnsEncodedName,
192- 0
193- );
194- return resolverAddress;
195- }
196-
197- // Return no resolver for expired names
198- if (expires <= block .timestamp ) {
199- return address (0 );
176+ /// @inheritdoc PermissionedRegistry
177+ /// @dev Restore the latest resolver to `FALLBACK_RESOLVER` upon visiting migratable children.
178+ function getResolver (
179+ string calldata label
180+ ) public view override (PermissionedRegistry) returns (address ) {
181+ bytes32 node = NameCoder.namehash (
182+ NameCoder.namehash (parentDnsEncodedName, 0 ),
183+ keccak256 (bytes (label))
184+ );
185+ (address owner , uint32 fuses , ) = NAME_WRAPPER.getData (uint256 (node));
186+ if (owner != address (this ) && (fuses & PARENT_CANNOT_CONTROL) != 0 ) {
187+ return FALLBACK_RESOLVER;
200188 }
201-
202- // Return the configured resolver for registered names
203- return entry.resolver;
189+ return super .getResolver (label);
204190 }
205191
206192 ////////////////////////////////////////////////////////////////////////
0 commit comments