//SPDX-License-Identifier: MIT pragma solidity ^0.8.4; import {INameWrapperUpgrade} from "../INameWrapperUpgrade.sol"; import "../../registry/ENS.sol"; import "../../ethregistrar/IBaseRegistrar.sol"; import {NameCoder} from "../../utils/NameCoder.sol"; contract UpgradedNameWrapperMock is INameWrapperUpgrade { bytes32 private constant ETH_NODE = 0x93cdeb708b7545dc668eb9280176169d1c33cfd8ed6f04690a0bcc88a93fc4ae; ENS public immutable ens; IBaseRegistrar public immutable registrar; constructor(ENS _ens, IBaseRegistrar _registrar) { ens = _ens; registrar = _registrar; } event NameUpgraded( bytes name, address wrappedOwner, uint32 fuses, uint64 expiry, address approved, bytes extraData ); function wrapFromUpgrade( bytes calldata name, address wrappedOwner, uint32 fuses, uint64 expiry, address approved, bytes calldata extraData ) public { (bytes32 labelhash, uint256 offset) = NameCoder.readLabel(name, 0); bytes32 parentNode = NameCoder.namehash(name, offset); bytes32 node = _makeNode(parentNode, labelhash); if (parentNode == ETH_NODE) { address registrant = registrar.ownerOf(uint256(labelhash)); require( msg.sender == registrant && registrar.isApprovedForAll(registrant, address(this)), "No approval for registrar" ); } else { address owner = ens.owner(node); require( msg.sender == owner && ens.isApprovedForAll(owner, address(this)), "No approval for registry" ); } emit NameUpgraded( name, wrappedOwner, fuses, expiry, approved, extraData ); } function _makeNode( bytes32 node, bytes32 labelhash ) private pure returns (bytes32) { return keccak256(abi.encodePacked(node, labelhash)); } }