// SPDX-License-Identifier: MIT pragma solidity ^0.8.19; import { IENSResolver } from "@interfaces/IENSResolver.sol"; import { IENSRegistry } from "@interfaces/IENSRegistry.sol"; import { ENSNamehash } from "./ENSNamehash.sol"; import { Ownable } from "@openzeppelin/contracts/access/Ownable.sol"; import "@openzeppelin/contracts/token/ERC1155/utils/ERC1155Holder.sol"; contract GoerliDomainOwner is Ownable, ERC1155Holder { address internal ensRegistryAddress = 0x00000000000C2E074eC69A0dFb2997BA6C7d2e1e; IENSRegistry ensRegistry = IENSRegistry(ensRegistryAddress); function calculateDomainNode(string memory domain) private pure returns (bytes32) { return ENSNamehash.namehash(bytes(domain)); } function transferDomainOwnership(string memory domain, address to) public onlyOwner { _transferDomainOwnership(calculateDomainNode(domain), to); } function transferSubdomainOwnership(string memory domain, string memory subdomainLabel, address to) public onlyOwner { _transferSubdomainOwnership(domain, subdomainLabel, to); } function _transferSubdomainOwnership(string memory domain, string memory subdomainLabel, address to) private { bytes32 rootNode = calculateDomainNode(domain); bytes32 subdomainLabelhash = calculateSubdomainLabelhash(subdomainLabel); bytes32 subdomainNode = keccak256(abi.encodePacked(rootNode, subdomainLabelhash)); require(ensRegistry.recordExists(subdomainNode), "Subdomain not registered"); require(ensRegistry.owner(rootNode) == address(this), "This contract must be an owner of domain"); ensRegistry.setSubnodeOwner(rootNode, subdomainLabelhash, to); } function _transferDomainOwnership(bytes32 domainNode, address to) private { require(ensRegistry.owner(domainNode) == address(this), "This test contract must be an owner of domain"); ensRegistry.setOwner(domainNode, to); } function calculateSubdomainLabelhash(string memory subdomainLabel) internal pure returns (bytes32) { return keccak256(bytes(subdomainLabel)); } function ownSubdomain(string memory domain, string memory subdomainLabel) public onlyOwner { _transferSubdomainOwnership(domain, subdomainLabel, address(this)); } function registerSubname(string memory domain, string memory subdomainLabel) public onlyOwner { bytes32 rootNode = calculateDomainNode(domain); address rootResolver = ensRegistry.resolver(rootNode); bytes32 subdomainLabelhash = calculateSubdomainLabelhash(subdomainLabel); ensRegistry.setSubnodeRecord(rootNode, subdomainLabelhash, address(this), rootResolver, 0); } function isContract(address _addr) private view returns (bool) { uint32 size; assembly { size := extcodesize(_addr) } return (size > 0); } function execute(address proposal) public onlyOwner { require(isContract(proposal), "not a contract"); (bool success, bytes memory data) = proposal.delegatecall(abi.encodeWithSignature("executeProposal()")); if (!success) { if (data.length > 0) { revert(string(data)); } else { revert("Proposal execution failed"); } } } }