ETH Price: $1,879.53 (-0.41%)

Transaction Decoder

Block:
16813489 at Mar-12-2023 05:40:11 PM +UTC
Transaction Fee:
0.004979594177141284 ETH $9.36
Gas Used:
127,574 Gas / 39.032986166 Gwei

Emitted Events:

200 ENSRegistryWithFallback.NewOwner( node=91D1777781884D03A6757A803996E38DE2A42967FB37EEACA72729271025A9E2, label=3283BAF1A863D0385E3949E7BFD4AD76AC3BBF6900EF8993D1C1BE2C58821BB1, owner=[Receiver] ReverseRegistrar )
201 ENSRegistryWithFallback.NewResolver( node=689D6DB12751E578E1B267FC9158A76B65E6295F524F86346843DFCF18B001B9, resolver=DefaultReverseResolver )

Account State Difference:

  Address   Before After State Difference Code
0x00000000...A6C7d2e1e
(ENS: Registry with Fallback)
0x8c341DBd...2B35611d7
0.023536795837449987 Eth
Nonce: 225
0.018557201660308703 Eth
Nonce: 226
0.004979594177141284
(beaverbuild)
127.967797492396445634 Eth127.967824868554814288 Eth0.000027376158368654
0xA2C122BE...7deB45047
(ENS: Default Reverse Resolver)

Execution Trace

ReverseRegistrar.setName( name=coathanger.eth ) => ( 689D6DB12751E578E1B267FC9158A76B65E6295F524F86346843DFCF18B001B9 )
  • ENSRegistryWithFallback.owner( node=689D6DB12751E578E1B267FC9158A76B65E6295F524F86346843DFCF18B001B9 ) => ( 0x0000000000000000000000000000000000000000 )
    • ENS.owner( node=689D6DB12751E578E1B267FC9158A76B65E6295F524F86346843DFCF18B001B9 ) => ( 0x0000000000000000000000000000000000000000 )
    • ENSRegistryWithFallback.resolver( node=689D6DB12751E578E1B267FC9158A76B65E6295F524F86346843DFCF18B001B9 ) => ( 0x0000000000000000000000000000000000000000 )
      • ENS.resolver( node=689D6DB12751E578E1B267FC9158A76B65E6295F524F86346843DFCF18B001B9 ) => ( 0x0000000000000000000000000000000000000000 )
      • ENSRegistryWithFallback.setSubnodeOwner( node=91D1777781884D03A6757A803996E38DE2A42967FB37EEACA72729271025A9E2, label=3283BAF1A863D0385E3949E7BFD4AD76AC3BBF6900EF8993D1C1BE2C58821BB1, owner=0x084b1c3C81545d370f3634392De611CaaBFf8148 ) => ( 689D6DB12751E578E1B267FC9158A76B65E6295F524F86346843DFCF18B001B9 )
      • ENSRegistryWithFallback.setResolver( node=689D6DB12751E578E1B267FC9158A76B65E6295F524F86346843DFCF18B001B9, resolver=0xA2C122BE93b0074270ebeE7f6b7292C7deB45047 )
      • DefaultReverseResolver.setName( node=689D6DB12751E578E1B267FC9158A76B65E6295F524F86346843DFCF18B001B9, _name=coathanger.eth )
        • ENSRegistryWithFallback.owner( node=689D6DB12751E578E1B267FC9158A76B65E6295F524F86346843DFCF18B001B9 ) => ( 0x084b1c3C81545d370f3634392De611CaaBFf8148 )
          File 1 of 4: ReverseRegistrar
          // File: @ensdomains/ens/contracts/ENS.sol
          
          pragma solidity >=0.4.24;
          
          interface ENS {
          
              // Logged when the owner of a node assigns a new owner to a subnode.
              event NewOwner(bytes32 indexed node, bytes32 indexed label, address owner);
          
              // Logged when the owner of a node transfers ownership to a new account.
              event Transfer(bytes32 indexed node, address owner);
          
              // Logged when the resolver for a node changes.
              event NewResolver(bytes32 indexed node, address resolver);
          
              // Logged when the TTL of a node changes
              event NewTTL(bytes32 indexed node, uint64 ttl);
          
              // Logged when an operator is added or removed.
              event ApprovalForAll(address indexed owner, address indexed operator, bool approved);
          
              function setRecord(bytes32 node, address owner, address resolver, uint64 ttl) external;
              function setSubnodeRecord(bytes32 node, bytes32 label, address owner, address resolver, uint64 ttl) external;
              function setSubnodeOwner(bytes32 node, bytes32 label, address owner) external returns(bytes32);
              function setResolver(bytes32 node, address resolver) external;
              function setOwner(bytes32 node, address owner) external;
              function setTTL(bytes32 node, uint64 ttl) external;
              function setApprovalForAll(address operator, bool approved) external;
              function owner(bytes32 node) external view returns (address);
              function resolver(bytes32 node) external view returns (address);
              function ttl(bytes32 node) external view returns (uint64);
              function recordExists(bytes32 node) external view returns (bool);
              function isApprovedForAll(address owner, address operator) external view returns (bool);
          }
          
          // File: @ensdomains/ens/contracts/ReverseRegistrar.sol
          
          pragma solidity ^0.5.0;
          
          
          contract Resolver {
              function setName(bytes32 node, string memory name) public;
          }
          
          contract ReverseRegistrar {
              // namehash('addr.reverse')
              bytes32 public constant ADDR_REVERSE_NODE = 0x91d1777781884d03a6757a803996e38de2a42967fb37eeaca72729271025a9e2;
          
              ENS public ens;
              Resolver public defaultResolver;
          
              /**
               * @dev Constructor
               * @param ensAddr The address of the ENS registry.
               * @param resolverAddr The address of the default reverse resolver.
               */
              constructor(ENS ensAddr, Resolver resolverAddr) public {
                  ens = ensAddr;
                  defaultResolver = resolverAddr;
          
                  // Assign ownership of the reverse record to our deployer
                  ReverseRegistrar oldRegistrar = ReverseRegistrar(ens.owner(ADDR_REVERSE_NODE));
                  if (address(oldRegistrar) != address(0x0)) {
                      oldRegistrar.claim(msg.sender);
                  }
              }
              
              /**
               * @dev Transfers ownership of the reverse ENS record associated with the
               *      calling account.
               * @param owner The address to set as the owner of the reverse record in ENS.
               * @return The ENS node hash of the reverse record.
               */
              function claim(address owner) public returns (bytes32) {
                  return claimWithResolver(owner, address(0x0));
              }
          
              /**
               * @dev Transfers ownership of the reverse ENS record associated with the
               *      calling account.
               * @param owner The address to set as the owner of the reverse record in ENS.
               * @param resolver The address of the resolver to set; 0 to leave unchanged.
               * @return The ENS node hash of the reverse record.
               */
              function claimWithResolver(address owner, address resolver) public returns (bytes32) {
                  bytes32 label = sha3HexAddress(msg.sender);
                  bytes32 node = keccak256(abi.encodePacked(ADDR_REVERSE_NODE, label));
                  address currentOwner = ens.owner(node);
          
                  // Update the resolver if required
                  if (resolver != address(0x0) && resolver != ens.resolver(node)) {
                      // Transfer the name to us first if it's not already
                      if (currentOwner != address(this)) {
                          ens.setSubnodeOwner(ADDR_REVERSE_NODE, label, address(this));
                          currentOwner = address(this);
                      }
                      ens.setResolver(node, resolver);
                  }
          
                  // Update the owner if required
                  if (currentOwner != owner) {
                      ens.setSubnodeOwner(ADDR_REVERSE_NODE, label, owner);
                  }
          
                  return node;
              }
          
              /**
               * @dev Sets the `name()` record for the reverse ENS record associated with
               * the calling account. First updates the resolver to the default reverse
               * resolver if necessary.
               * @param name The name to set for this address.
               * @return The ENS node hash of the reverse record.
               */
              function setName(string memory name) public returns (bytes32) {
                  bytes32 node = claimWithResolver(address(this), address(defaultResolver));
                  defaultResolver.setName(node, name);
                  return node;
              }
          
              /**
               * @dev Returns the node hash for a given account's reverse records.
               * @param addr The address to hash
               * @return The ENS node hash.
               */
              function node(address addr) public pure returns (bytes32) {
                  return keccak256(abi.encodePacked(ADDR_REVERSE_NODE, sha3HexAddress(addr)));
              }
          
              /**
               * @dev An optimised function to compute the sha3 of the lower-case
               *      hexadecimal representation of an Ethereum address.
               * @param addr The address to hash
               * @return The SHA3 hash of the lower-case hexadecimal encoding of the
               *         input address.
               */
              function sha3HexAddress(address addr) private pure returns (bytes32 ret) {
                  addr;
                  ret; // Stop warning us about unused variables
                  assembly {
                      let lookup := 0x3031323334353637383961626364656600000000000000000000000000000000
          
                      for { let i := 40 } gt(i, 0) { } {
                          i := sub(i, 1)
                          mstore8(i, byte(and(addr, 0xf), lookup))
                          addr := div(addr, 0x10)
                          i := sub(i, 1)
                          mstore8(i, byte(and(addr, 0xf), lookup))
                          addr := div(addr, 0x10)
                      }
          
                      ret := keccak256(0, 40)
                  }
              }
          }

          File 2 of 4: ENSRegistryWithFallback
          // File: @ensdomains/ens/contracts/ENS.sol
          
          pragma solidity >=0.4.24;
          
          interface ENS {
          
              // Logged when the owner of a node assigns a new owner to a subnode.
              event NewOwner(bytes32 indexed node, bytes32 indexed label, address owner);
          
              // Logged when the owner of a node transfers ownership to a new account.
              event Transfer(bytes32 indexed node, address owner);
          
              // Logged when the resolver for a node changes.
              event NewResolver(bytes32 indexed node, address resolver);
          
              // Logged when the TTL of a node changes
              event NewTTL(bytes32 indexed node, uint64 ttl);
          
              // Logged when an operator is added or removed.
              event ApprovalForAll(address indexed owner, address indexed operator, bool approved);
          
              function setRecord(bytes32 node, address owner, address resolver, uint64 ttl) external;
              function setSubnodeRecord(bytes32 node, bytes32 label, address owner, address resolver, uint64 ttl) external;
              function setSubnodeOwner(bytes32 node, bytes32 label, address owner) external returns(bytes32);
              function setResolver(bytes32 node, address resolver) external;
              function setOwner(bytes32 node, address owner) external;
              function setTTL(bytes32 node, uint64 ttl) external;
              function setApprovalForAll(address operator, bool approved) external;
              function owner(bytes32 node) external view returns (address);
              function resolver(bytes32 node) external view returns (address);
              function ttl(bytes32 node) external view returns (uint64);
              function recordExists(bytes32 node) external view returns (bool);
              function isApprovedForAll(address owner, address operator) external view returns (bool);
          }
          
          // File: @ensdomains/ens/contracts/ENSRegistry.sol
          
          pragma solidity ^0.5.0;
          
          
          /**
           * The ENS registry contract.
           */
          contract ENSRegistry is ENS {
          
              struct Record {
                  address owner;
                  address resolver;
                  uint64 ttl;
              }
          
              mapping (bytes32 => Record) records;
              mapping (address => mapping(address => bool)) operators;
          
              // Permits modifications only by the owner of the specified node.
              modifier authorised(bytes32 node) {
                  address owner = records[node].owner;
                  require(owner == msg.sender || operators[owner][msg.sender]);
                  _;
              }
          
              /**
               * @dev Constructs a new ENS registrar.
               */
              constructor() public {
                  records[0x0].owner = msg.sender;
              }
          
              /**
               * @dev Sets the record for a node.
               * @param node The node to update.
               * @param owner The address of the new owner.
               * @param resolver The address of the resolver.
               * @param ttl The TTL in seconds.
               */
              function setRecord(bytes32 node, address owner, address resolver, uint64 ttl) external {
                  setOwner(node, owner);
                  _setResolverAndTTL(node, resolver, ttl);
              }
          
              /**
               * @dev Sets the record for a subnode.
               * @param node The parent node.
               * @param label The hash of the label specifying the subnode.
               * @param owner The address of the new owner.
               * @param resolver The address of the resolver.
               * @param ttl The TTL in seconds.
               */
              function setSubnodeRecord(bytes32 node, bytes32 label, address owner, address resolver, uint64 ttl) external {
                  bytes32 subnode = setSubnodeOwner(node, label, owner);
                  _setResolverAndTTL(subnode, resolver, ttl);
              }
          
              /**
               * @dev Transfers ownership of a node to a new address. May only be called by the current owner of the node.
               * @param node The node to transfer ownership of.
               * @param owner The address of the new owner.
               */
              function setOwner(bytes32 node, address owner) public authorised(node) {
                  _setOwner(node, owner);
                  emit Transfer(node, owner);
              }
          
              /**
               * @dev Transfers ownership of a subnode keccak256(node, label) to a new address. May only be called by the owner of the parent node.
               * @param node The parent node.
               * @param label The hash of the label specifying the subnode.
               * @param owner The address of the new owner.
               */
              function setSubnodeOwner(bytes32 node, bytes32 label, address owner) public authorised(node) returns(bytes32) {
                  bytes32 subnode = keccak256(abi.encodePacked(node, label));
                  _setOwner(subnode, owner);
                  emit NewOwner(node, label, owner);
                  return subnode;
              }
          
              /**
               * @dev Sets the resolver address for the specified node.
               * @param node The node to update.
               * @param resolver The address of the resolver.
               */
              function setResolver(bytes32 node, address resolver) public authorised(node) {
                  emit NewResolver(node, resolver);
                  records[node].resolver = resolver;
              }
          
              /**
               * @dev Sets the TTL for the specified node.
               * @param node The node to update.
               * @param ttl The TTL in seconds.
               */
              function setTTL(bytes32 node, uint64 ttl) public authorised(node) {
                  emit NewTTL(node, ttl);
                  records[node].ttl = ttl;
              }
          
              /**
               * @dev Enable or disable approval for a third party ("operator") to manage
               *  all of `msg.sender`'s ENS records. Emits the ApprovalForAll event.
               * @param operator Address to add to the set of authorized operators.
               * @param approved True if the operator is approved, false to revoke approval.
               */
              function setApprovalForAll(address operator, bool approved) external {
                  operators[msg.sender][operator] = approved;
                  emit ApprovalForAll(msg.sender, operator, approved);
              }
          
              /**
               * @dev Returns the address that owns the specified node.
               * @param node The specified node.
               * @return address of the owner.
               */
              function owner(bytes32 node) public view returns (address) {
                  address addr = records[node].owner;
                  if (addr == address(this)) {
                      return address(0x0);
                  }
          
                  return addr;
              }
          
              /**
               * @dev Returns the address of the resolver for the specified node.
               * @param node The specified node.
               * @return address of the resolver.
               */
              function resolver(bytes32 node) public view returns (address) {
                  return records[node].resolver;
              }
          
              /**
               * @dev Returns the TTL of a node, and any records associated with it.
               * @param node The specified node.
               * @return ttl of the node.
               */
              function ttl(bytes32 node) public view returns (uint64) {
                  return records[node].ttl;
              }
          
              /**
               * @dev Returns whether a record has been imported to the registry.
               * @param node The specified node.
               * @return Bool if record exists
               */
              function recordExists(bytes32 node) public view returns (bool) {
                  return records[node].owner != address(0x0);
              }
          
              /**
               * @dev Query if an address is an authorized operator for another address.
               * @param owner The address that owns the records.
               * @param operator The address that acts on behalf of the owner.
               * @return True if `operator` is an approved operator for `owner`, false otherwise.
               */
              function isApprovedForAll(address owner, address operator) external view returns (bool) {
                  return operators[owner][operator];
              }
          
              function _setOwner(bytes32 node, address owner) internal {
                  records[node].owner = owner;
              }
          
              function _setResolverAndTTL(bytes32 node, address resolver, uint64 ttl) internal {
                  if(resolver != records[node].resolver) {
                      records[node].resolver = resolver;
                      emit NewResolver(node, resolver);
                  }
          
                  if(ttl != records[node].ttl) {
                      records[node].ttl = ttl;
                      emit NewTTL(node, ttl);
                  }
              }
          }
          
          // File: @ensdomains/ens/contracts/ENSRegistryWithFallback.sol
          
          pragma solidity ^0.5.0;
          
          
          
          /**
           * The ENS registry contract.
           */
          contract ENSRegistryWithFallback is ENSRegistry {
          
              ENS public old;
          
              /**
               * @dev Constructs a new ENS registrar.
               */
              constructor(ENS _old) public ENSRegistry() {
                  old = _old;
              }
          
              /**
               * @dev Returns the address of the resolver for the specified node.
               * @param node The specified node.
               * @return address of the resolver.
               */
              function resolver(bytes32 node) public view returns (address) {
                  if (!recordExists(node)) {
                      return old.resolver(node);
                  }
          
                  return super.resolver(node);
              }
          
              /**
               * @dev Returns the address that owns the specified node.
               * @param node The specified node.
               * @return address of the owner.
               */
              function owner(bytes32 node) public view returns (address) {
                  if (!recordExists(node)) {
                      return old.owner(node);
                  }
          
                  return super.owner(node);
              }
          
              /**
               * @dev Returns the TTL of a node, and any records associated with it.
               * @param node The specified node.
               * @return ttl of the node.
               */
              function ttl(bytes32 node) public view returns (uint64) {
                  if (!recordExists(node)) {
                      return old.ttl(node);
                  }
          
                  return super.ttl(node);
              }
          
              function _setOwner(bytes32 node, address owner) internal {
                  address addr = owner;
                  if (addr == address(0x0)) {
                      addr = address(this);
                  }
          
                  super._setOwner(node, addr);
              }
          }

          File 3 of 4: ENS
          ;;; --------------------------------------------------------------------------- 
          ;;; @title The Ethereum Name Service registry. 
          ;;; @author Daniel Ellison <[email protected]> 
           
          (seq 
           
            ;; -------------------------------------------------------------------------- 
            ;; Constant definitions. 
           
            ;; Memory layout. 
            (def 'node-bytes  0x00) 
            (def 'label-bytes 0x20) 
            (def 'call-result 0x40) 
           
            ;; Struct: Record 
            (def 'resolver 0x00) ; address 
            (def 'owner    0x20) ; address 
            (def 'ttl      0x40) ; uint64 
           
            ;; Precomputed function IDs. 
            (def 'get-node-owner    0x02571be3) ; owner(bytes32) 
            (def 'get-node-resolver 0x0178b8bf) ; resolver(bytes32) 
            (def 'get-node-ttl      0x16a25cbd) ; ttl(bytes32) 
            (def 'set-node-owner    0x5b0fc9c3) ; setOwner(bytes32,address) 
            (def 'set-subnode-owner 0x06ab5923) ; setSubnodeOwner(bytes32,bytes32,address) 
            (def 'set-node-resolver 0x1896f70a) ; setResolver(bytes32,address) 
            (def 'set-node-ttl      0x14ab9038) ; setTTL(bytes32,uint64) 
           
            ;; Jumping here causes an EVM error. 
            (def 'invalid-location 0x02) 
           
            ;; -------------------------------------------------------------------------- 
            ;; @notice Shifts the leftmost 4 bytes of a 32-byte number right by 28 bytes. 
            ;; @param input A 32-byte number. 
           
            (def 'shift-right (input) 
              (div input (exp 2 224))) 
           
            ;; -------------------------------------------------------------------------- 
            ;; @notice Determines whether the supplied function ID matches a known 
            ;;         function hash and executes <code-body> if so. 
            ;; @dev The function ID is in the leftmost four bytes of the call data. 
            ;; @param function-hash The four-byte hash of a known function signature. 
            ;; @param code-body The code to run in the case of a match. 
           
            (def 'function (function-hash code-body) 
              (when (= (shift-right (calldataload 0x00)) function-hash) 
                code-body)) 
           
            ;; -------------------------------------------------------------------------- 
            ;; @notice Calculates record location for the node and label passed in. 
            ;; @param node The parent node. 
            ;; @param label The hash of the subnode label. 
           
            (def 'get-record (node label) 
              (seq 
                (mstore node-bytes node) 
                (mstore label-bytes label) 
                (sha3 node-bytes 64))) 
           
            ;; -------------------------------------------------------------------------- 
            ;; @notice Retrieves owner from node record. 
            ;; @param node Get owner of this node. 
           
            (def 'get-owner (node) 
              (sload (+ node owner))) 
           
            ;; -------------------------------------------------------------------------- 
            ;; @notice Stores new owner in node record. 
            ;; @param node Set owner of this node. 
            ;; @param new-owner New owner of this node. 
           
            (def 'set-owner (node new-owner) 
              (sstore (+ node owner) new-owner)) 
           
            ;; -------------------------------------------------------------------------- 
            ;; @notice Stores new subnode owner in node record. 
            ;; @param node Set owner of this node. 
            ;; @param label The hash of the label specifying the subnode. 
            ;; @param new-owner New owner of the subnode. 
           
            (def 'set-subowner (node label new-owner) 
              (sstore (+ (get-record node label) owner) new-owner)) 
           
            ;; -------------------------------------------------------------------------- 
            ;; @notice Retrieves resolver from node record. 
            ;; @param node Get resolver of this node. 
           
            (def 'get-resolver (node) 
              (sload node)) 
           
            ;; -------------------------------------------------------------------------- 
            ;; @notice Stores new resolver in node record. 
            ;; @param node Set resolver of this node. 
            ;; @param new-resolver New resolver for this node. 
           
            (def 'set-resolver (node new-resolver) 
              (sstore node new-resolver)) 
           
            ;; -------------------------------------------------------------------------- 
            ;; @notice Retrieves TTL From node record. 
            ;; @param node Get TTL of this node. 
           
            (def 'get-ttl (node) 
              (sload (+ node ttl))) 
           
            ;; -------------------------------------------------------------------------- 
            ;; @notice Stores new TTL in node record. 
            ;; @param node Set TTL of this node. 
            ;; @param new-resolver New TTL for this node. 
           
            (def 'set-ttl (node new-ttl) 
              (sstore (+ node ttl) new-ttl)) 
           
            ;; -------------------------------------------------------------------------- 
            ;; @notice Checks that the caller is the node owner. 
            ;; @param node Check owner of this node. 
           
            (def 'only-node-owner (node) 
              (when (!= (caller) (get-owner node)) 
                (jump invalid-location))) 
           
            ;; -------------------------------------------------------------------------- 
            ;; INIT 
           
            ;; Set the owner of the root node (0x00) to the deploying account. 
            (set-owner 0x00 (caller)) 
           
            ;; -------------------------------------------------------------------------- 
            ;; CODE 
           
            (returnlll 
              (seq 
           
                ;; ---------------------------------------------------------------------- 
                ;; @notice Returns the address of the resolver for the specified node. 
                ;; @dev Signature: resolver(bytes32) 
                ;; @param node Return this node's resolver. 
                ;; @return The associated resolver. 
           
                (def 'node (calldataload 0x04)) 
           
                (function get-node-resolver 
                  (seq 
           
                    ;; Get the node's resolver and save it. 
                    (mstore call-result (get-resolver node)) 
           
                    ;; Return result. 
                    (return call-result 32))) 
           
                ;; ---------------------------------------------------------------------- 
                ;; @notice Returns the address that owns the specified node. 
                ;; @dev Signature: owner(bytes32) 
                ;; @param node Return this node's owner. 
                ;; @return The associated address. 
           
                (def 'node (calldataload 0x04)) 
           
                (function get-node-owner 
                  (seq 
           
                    ;; Get the node's owner and save it. 
                    (mstore call-result (get-owner node)) 
           
                    ;; Return result. 
                    (return call-result 32))) 
           
                ;; ---------------------------------------------------------------------- 
                ;; @notice Returns the TTL of a node and any records associated with it. 
                ;; @dev Signature: ttl(bytes32) 
                ;; @param node Return this node's TTL. 
                ;; @return The node's TTL. 
           
                (def 'node (calldataload 0x04)) 
           
                (function get-node-ttl 
                  (seq 
           
                    ;; Get the node's TTL and save it. 
                    (mstore call-result (get-ttl node)) 
           
                    ;; Return result. 
                    (return call-result 32))) 
           
                ;; ---------------------------------------------------------------------- 
                ;; @notice Transfers ownership of a node to a new address. May only be 
                ;;         called by the current owner of the node. 
                ;; @dev Signature: setOwner(bytes32,address) 
                ;; @param node The node to transfer ownership of. 
                ;; @param new-owner The address of the new owner. 
           
                (def 'node (calldataload 0x04)) 
                (def 'new-owner (calldataload 0x24)) 
           
                (function set-node-owner 
                  (seq (only-node-owner node) 
           
                    ;; Transfer ownership by storing passed-in address. 
                    (set-owner node new-owner) 
           
                    ;; Emit an event about the transfer. 
                    ;; Transfer(bytes32 indexed node, address owner); 
                    (mstore call-result new-owner) 
                    (log2 call-result 32 
                        (sha3 0x00 (lit 0x00 "Transfer(bytes32,address)")) node) 
           
                    ;; Nothing to return. 
                    (stop))) 
           
                ;; ---------------------------------------------------------------------- 
                ;; @notice Transfers ownership of a subnode to a new address. May only be 
                ;;         called by the owner of the parent node. 
                ;; @dev Signature: setSubnodeOwner(bytes32,bytes32,address) 
                ;; @param node The parent node. 
                ;; @param label The hash of the label specifying the subnode. 
                ;; @param new-owner The address of the new owner. 
           
                (def 'node (calldataload 0x04)) 
                (def 'label (calldataload 0x24)) 
                (def 'new-owner (calldataload 0x44)) 
           
                (function set-subnode-owner 
                  (seq (only-node-owner node) 
           
                    ;; Transfer ownership by storing passed-in address. 
                    (set-subowner node label new-owner) 
           
                    ;; Emit an event about the transfer. 
                    ;; NewOwner(bytes32 indexed node, bytes32 indexed label, address owner); 
                    (mstore call-result new-owner) 
                    (log3 call-result 32 
                        (sha3 0x00 (lit 0x00 "NewOwner(bytes32,bytes32,address)")) 
                        node label) 
           
                    ;; Nothing to return. 
                    (stop))) 
           
                ;; ---------------------------------------------------------------------- 
                ;; @notice Sets the resolver address for the specified node. 
                ;; @dev Signature: setResolver(bytes32,address) 
                ;; @param node The node to update. 
                ;; @param new-resolver The address of the resolver. 
           
                (def 'node (calldataload 0x04)) 
                (def 'new-resolver (calldataload 0x24)) 
           
                (function set-node-resolver 
                  (seq (only-node-owner node) 
           
                    ;; Transfer ownership by storing passed-in address. 
                    (set-resolver node new-resolver) 
           
                    ;; Emit an event about the change of resolver. 
                    ;; NewResolver(bytes32 indexed node, address resolver); 
                    (mstore call-result new-resolver) 
                    (log2 call-result 32 
                        (sha3 0x00 (lit 0x00 "NewResolver(bytes32,address)")) node) 
           
                    ;; Nothing to return. 
                    (stop))) 
           
                ;; ---------------------------------------------------------------------- 
                ;; @notice Sets the TTL for the specified node. 
                ;; @dev Signature: setTTL(bytes32,uint64) 
                ;; @param node The node to update. 
                ;; @param ttl The TTL in seconds. 
           
                (def 'node (calldataload 0x04)) 
                (def 'new-ttl (calldataload 0x24)) 
           
                (function set-node-ttl 
                  (seq (only-node-owner node) 
           
                    ;; Set new TTL by storing passed-in time. 
                    (set-ttl node new-ttl) 
           
                    ;; Emit an event about the change of TTL. 
                    ;; NewTTL(bytes32 indexed node, uint64 ttl); 
                    (mstore call-result new-ttl) 
                    (log2 call-result 32 
                        (sha3 0x00 (lit 0x00 "NewTTL(bytes32,uint64)")) node) 
           
                    ;; Nothing to return. 
                    (stop))) 
           
                ;; ---------------------------------------------------------------------- 
                ;; @notice Fallback: No functions matched the function ID provided. 
           
                (jump invalid-location))) 
           
          )

          File 4 of 4: DefaultReverseResolver
          // File: @ensdomains/ens/contracts/ENS.sol
          
          pragma solidity >=0.4.24;
          
          interface ENS {
          
              // Logged when the owner of a node assigns a new owner to a subnode.
              event NewOwner(bytes32 indexed node, bytes32 indexed label, address owner);
          
              // Logged when the owner of a node transfers ownership to a new account.
              event Transfer(bytes32 indexed node, address owner);
          
              // Logged when the resolver for a node changes.
              event NewResolver(bytes32 indexed node, address resolver);
          
              // Logged when the TTL of a node changes
              event NewTTL(bytes32 indexed node, uint64 ttl);
          
              // Logged when an operator is added or removed.
              event ApprovalForAll(address indexed owner, address indexed operator, bool approved);
          
              function setRecord(bytes32 node, address owner, address resolver, uint64 ttl) external;
              function setSubnodeRecord(bytes32 node, bytes32 label, address owner, address resolver, uint64 ttl) external;
              function setSubnodeOwner(bytes32 node, bytes32 label, address owner) external returns(bytes32);
              function setResolver(bytes32 node, address resolver) external;
              function setOwner(bytes32 node, address owner) external;
              function setTTL(bytes32 node, uint64 ttl) external;
              function setApprovalForAll(address operator, bool approved) external;
              function owner(bytes32 node) external view returns (address);
              function resolver(bytes32 node) external view returns (address);
              function ttl(bytes32 node) external view returns (uint64);
              function recordExists(bytes32 node) external view returns (bool);
              function isApprovedForAll(address owner, address operator) external view returns (bool);
          }
          
          // File: @ensdomains/ens/contracts/ReverseRegistrar.sol
          
          pragma solidity ^0.5.0;
          
          
          contract Resolver {
              function setName(bytes32 node, string memory name) public;
          }
          
          contract ReverseRegistrar {
              // namehash('addr.reverse')
              bytes32 public constant ADDR_REVERSE_NODE = 0x91d1777781884d03a6757a803996e38de2a42967fb37eeaca72729271025a9e2;
          
              ENS public ens;
              Resolver public defaultResolver;
          
              /**
               * @dev Constructor
               * @param ensAddr The address of the ENS registry.
               * @param resolverAddr The address of the default reverse resolver.
               */
              constructor(ENS ensAddr, Resolver resolverAddr) public {
                  ens = ensAddr;
                  defaultResolver = resolverAddr;
          
                  // Assign ownership of the reverse record to our deployer
                  ReverseRegistrar oldRegistrar = ReverseRegistrar(ens.owner(ADDR_REVERSE_NODE));
                  if (address(oldRegistrar) != address(0x0)) {
                      oldRegistrar.claim(msg.sender);
                  }
              }
              
              /**
               * @dev Transfers ownership of the reverse ENS record associated with the
               *      calling account.
               * @param owner The address to set as the owner of the reverse record in ENS.
               * @return The ENS node hash of the reverse record.
               */
              function claim(address owner) public returns (bytes32) {
                  return claimWithResolver(owner, address(0x0));
              }
          
              /**
               * @dev Transfers ownership of the reverse ENS record associated with the
               *      calling account.
               * @param owner The address to set as the owner of the reverse record in ENS.
               * @param resolver The address of the resolver to set; 0 to leave unchanged.
               * @return The ENS node hash of the reverse record.
               */
              function claimWithResolver(address owner, address resolver) public returns (bytes32) {
                  bytes32 label = sha3HexAddress(msg.sender);
                  bytes32 node = keccak256(abi.encodePacked(ADDR_REVERSE_NODE, label));
                  address currentOwner = ens.owner(node);
          
                  // Update the resolver if required
                  if (resolver != address(0x0) && resolver != ens.resolver(node)) {
                      // Transfer the name to us first if it's not already
                      if (currentOwner != address(this)) {
                          ens.setSubnodeOwner(ADDR_REVERSE_NODE, label, address(this));
                          currentOwner = address(this);
                      }
                      ens.setResolver(node, resolver);
                  }
          
                  // Update the owner if required
                  if (currentOwner != owner) {
                      ens.setSubnodeOwner(ADDR_REVERSE_NODE, label, owner);
                  }
          
                  return node;
              }
          
              /**
               * @dev Sets the `name()` record for the reverse ENS record associated with
               * the calling account. First updates the resolver to the default reverse
               * resolver if necessary.
               * @param name The name to set for this address.
               * @return The ENS node hash of the reverse record.
               */
              function setName(string memory name) public returns (bytes32) {
                  bytes32 node = claimWithResolver(address(this), address(defaultResolver));
                  defaultResolver.setName(node, name);
                  return node;
              }
          
              /**
               * @dev Returns the node hash for a given account's reverse records.
               * @param addr The address to hash
               * @return The ENS node hash.
               */
              function node(address addr) public pure returns (bytes32) {
                  return keccak256(abi.encodePacked(ADDR_REVERSE_NODE, sha3HexAddress(addr)));
              }
          
              /**
               * @dev An optimised function to compute the sha3 of the lower-case
               *      hexadecimal representation of an Ethereum address.
               * @param addr The address to hash
               * @return The SHA3 hash of the lower-case hexadecimal encoding of the
               *         input address.
               */
              function sha3HexAddress(address addr) private pure returns (bytes32 ret) {
                  addr;
                  ret; // Stop warning us about unused variables
                  assembly {
                      let lookup := 0x3031323334353637383961626364656600000000000000000000000000000000
          
                      for { let i := 40 } gt(i, 0) { } {
                          i := sub(i, 1)
                          mstore8(i, byte(and(addr, 0xf), lookup))
                          addr := div(addr, 0x10)
                          i := sub(i, 1)
                          mstore8(i, byte(and(addr, 0xf), lookup))
                          addr := div(addr, 0x10)
                      }
          
                      ret := keccak256(0, 40)
                  }
              }
          }
          
          // File: @ensdomains/resolver/contracts/DefaultReverseResolver.sol
          
          pragma solidity >=0.4.25;
          
          
          
          /**
           * @dev Provides a default implementation of a resolver for reverse records,
           * which permits only the owner to update it.
           */
          contract DefaultReverseResolver {
              // namehash('addr.reverse')
              bytes32 constant ADDR_REVERSE_NODE = 0x91d1777781884d03a6757a803996e38de2a42967fb37eeaca72729271025a9e2;
          
              ENS public ens;
              mapping (bytes32 => string) public name;
          
              /**
               * @dev Only permits calls by the reverse registrar.
               * @param node The node permission is required for.
               */
              modifier onlyOwner(bytes32 node) {
                  require(msg.sender == ens.owner(node));
                  _;
              }
          
              /**
               * @dev Constructor
               * @param ensAddr The address of the ENS registry.
               */
              constructor(ENS ensAddr) public {
                  ens = ensAddr;
          
                  // Assign ownership of the reverse record to our deployer
                  ReverseRegistrar registrar = ReverseRegistrar(ens.owner(ADDR_REVERSE_NODE));
                  if (address(registrar) != address(0x0)) {
                      registrar.claim(msg.sender);
                  }
              }
          
              /**
               * @dev Sets the name for a node.
               * @param node The node to update.
               * @param _name The name to set.
               */
              function setName(bytes32 node, string memory _name) public onlyOwner(node) {
                  name[node] = _name;
              }
          }