ETH Price: $3,271.76 (+1.07%)

Contract

0x3671aE578E63FdF66ad4F3E12CC0c0d71Ac7510C
 

Overview

ETH Balance

0 ETH

Eth Value

$0.00

Multichain Info

No addresses found
Transaction Hash
Method
Block
From
To

There are no matching entries

Please try again later

View more zero value Internal Transactions in Advanced View mode

Advanced mode:
Loading...
Loading

Contract Source Code Verified (Exact Match)

Contract Name:
ReverseRecords

Compiler Version
v0.7.4+commit.3f05b770

Optimization Enabled:
No with 200 runs

Other Settings:
default evmVersion
File 1 of 5 : ReverseRecords.sol
pragma solidity ^0.7.4;pragma experimental ABIEncoderV2;
import "./Namehash.sol";
import '@ensdomains/ens/contracts/ENS.sol';
import '@ensdomains/ens/contracts/ReverseRegistrar.sol';
import '@ensdomains/resolver/contracts/Resolver.sol';

contract ReverseRecords {
    ENS ens;
    ReverseRegistrar registrar;
    bytes32 private constant ADDR_REVERSE_NODE = 0x91d1777781884d03a6757a803996e38de2a42967fb37eeaca72729271025a9e2;

    /**
     * The `constructor` takes ENS registry address
     */
    constructor(ENS _ens) {
        ens = _ens;
        registrar = ReverseRegistrar(ens.owner(ADDR_REVERSE_NODE));
    }

    /**
     * Read only function to return ens name only if both forward and reverse resolution are set     *
     */
    function getNames(address[] calldata addresses) external view returns (string[] memory r) {
        r = new string[](addresses.length);
        for(uint i = 0; i < addresses.length; i++) {
            bytes32 node = node(addresses[i]);
            address resolverAddress = ens.resolver(node);
            if(resolverAddress != address(0x0)){
                Resolver resolver = Resolver(resolverAddress);
                string memory name = resolver.name(node);
                if(bytes(name).length == 0 ){
                    continue;
                }
                bytes32 namehash = Namehash.namehash(name);
                address forwardResolverAddress = ens.resolver(namehash);
                if(forwardResolverAddress != address(0x0)){
                    Resolver forwardResolver = Resolver(forwardResolverAddress);
                    address forwardAddress = forwardResolver.addr(namehash);
                    if(forwardAddress == addresses[i]){
                        r[i] = name;
                    }
                }
            }
        }
        return r;
    }

    function node(address addr) private pure returns (bytes32) {
        return keccak256(abi.encodePacked(ADDR_REVERSE_NODE, sha3HexAddress(addr)));
    }

    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 5 : Namehash.sol
pragma solidity ^0.7.0;

library Strings {
    struct slice {
        uint _len;
        uint _ptr;
    }
    
    /*
     * @dev Returns a slice containing the entire string.
     * @param self The string to make a slice from.
     * @return A newly allocated slice containing the entire string.
     */
    function toSlice(string memory self) internal pure returns (slice memory) {
        uint ptr;
        assembly {
            ptr := add(self, 0x20)
        }
        return slice(bytes(self).length, ptr);
    }

    /*
     * @dev Returns the keccak-256 hash of the slice.
     * @param self The slice to hash.
     * @return The hash of the slice.
     */
    function keccak(slice memory self) internal pure returns (bytes32 ret) {
        assembly {
            ret := keccak256(mload(add(self, 32)), mload(self))
        }
    }

    /*
     * @dev Returns true if the slice is empty (has a length of 0).
     * @param self The slice to operate on.
     * @return True if the slice is empty, False otherwise.
     */
    function empty(slice memory self) internal pure returns (bool) {
        return self._len == 0;
    }
    
    // Returns the memory address of the first byte after the last occurrence of
    // `needle` in `self`, or the address of `self` if not found.
    function rfindPtr(uint selflen, uint selfptr, uint needlelen, uint needleptr) private pure returns (uint) {
        uint ptr;

        if (needlelen <= selflen) {
            if (needlelen <= 32) {
                bytes32 mask = bytes32(~(2 ** (8 * (32 - needlelen)) - 1));

                bytes32 needledata;
                assembly { needledata := and(mload(needleptr), mask) }

                ptr = selfptr + selflen - needlelen;
                bytes32 ptrdata;
                assembly { ptrdata := and(mload(ptr), mask) }

                while (ptrdata != needledata) {
                    if (ptr <= selfptr)
                        return selfptr;
                    ptr--;
                    assembly { ptrdata := and(mload(ptr), mask) }
                }
                return ptr + needlelen;
            } else {
                // For long needles, use hashing
                bytes32 hash;
                assembly { hash := keccak256(needleptr, needlelen) }
                ptr = selfptr + (selflen - needlelen);
                while (ptr >= selfptr) {
                    bytes32 testHash;
                    assembly { testHash := keccak256(ptr, needlelen) }
                    if (hash == testHash)
                        return ptr + needlelen;
                    ptr -= 1;
                }
            }
        }
        return selfptr;
    }
    
    /*
     * @dev Splits the slice, setting `self` to everything before the last
     *      occurrence of `needle`, and `token` to everything after it. If
     *      `needle` does not occur in `self`, `self` is set to the empty slice,
     *      and `token` is set to the entirety of `self`.
     * @param self The slice to split.
     * @param needle The text to search for in `self`.
     * @param token An output parameter to which the first token is written.
     * @return `token`.
     */
    function rsplit(slice memory self, slice memory needle, slice memory token) internal pure returns (slice memory) {
        uint ptr = rfindPtr(self._len, self._ptr, needle._len, needle._ptr);
        token._ptr = ptr;
        token._len = self._len - (ptr - self._ptr);
        if (ptr == self._ptr) {
            // Not found
            self._len = 0;
        } else {
            self._len -= token._len + needle._len;
        }
        return token;
    }
}

library Namehash {
    using Strings for *;
    
    function namehash(string memory name) pure internal returns(bytes32 hash) {
        hash = bytes32(0);
        Strings.slice memory nameslice = name.toSlice();
        Strings.slice memory delim = ".".toSlice();
        Strings.slice memory token;
        for(nameslice.rsplit(delim, token); !token.empty(); nameslice.rsplit(delim, token)) {
            hash = keccak256(abi.encodePacked(hash, token.keccak()));
        }
        return hash;
    }
}

File 3 of 5 : ENS.sol
pragma solidity ^0.7.0;

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 virtual;
    function setSubnodeRecord(bytes32 node, bytes32 label, address owner, address resolver, uint64 ttl) external virtual;
    function setSubnodeOwner(bytes32 node, bytes32 label, address owner) external virtual returns(bytes32);
    function setResolver(bytes32 node, address resolver) external virtual;
    function setOwner(bytes32 node, address owner) external virtual;
    function setTTL(bytes32 node, uint64 ttl) external virtual;
    function setApprovalForAll(address operator, bool approved) external virtual;
    function owner(bytes32 node) external virtual view returns (address);
    function resolver(bytes32 node) external virtual view returns (address);
    function ttl(bytes32 node) external virtual view returns (uint64);
    function recordExists(bytes32 node) external virtual view returns (bool);
    function isApprovedForAll(address owner, address operator) external virtual view returns (bool);
}

File 4 of 5 : ReverseRegistrar.sol
pragma solidity ^0.7.0;

import "./ENS.sol";

abstract contract NameResolver {
    function setName(bytes32 node, string memory name) public virtual;
}

contract ReverseRegistrar {
    // namehash('addr.reverse')
    bytes32 public constant ADDR_REVERSE_NODE = 0x91d1777781884d03a6757a803996e38de2a42967fb37eeaca72729271025a9e2;

    ENS public ens;
    NameResolver public defaultResolver;

    /**
     * @dev Constructor
     * @param ensAddr The address of the ENS registry.
     * @param resolverAddr The address of the default reverse resolver.
     */
    constructor(ENS ensAddr, NameResolver 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 ret 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 5 of 5 : Resolver.sol
pragma solidity >=0.4.25;
pragma experimental ABIEncoderV2;

/**
 * A generic resolver interface which includes all the functions including the ones deprecated
 */
interface Resolver{
    event AddrChanged(bytes32 indexed node, address a);
    event AddressChanged(bytes32 indexed node, uint coinType, bytes newAddress);
    event NameChanged(bytes32 indexed node, string name);
    event ABIChanged(bytes32 indexed node, uint256 indexed contentType);
    event PubkeyChanged(bytes32 indexed node, bytes32 x, bytes32 y);
    event TextChanged(bytes32 indexed node, string indexed indexedKey, string key);
    event ContenthashChanged(bytes32 indexed node, bytes hash);
    /* Deprecated events */
    event ContentChanged(bytes32 indexed node, bytes32 hash);

    function ABI(bytes32 node, uint256 contentTypes) external view returns (uint256, bytes memory);
    function addr(bytes32 node) external view returns (address);
    function addr(bytes32 node, uint coinType) external view returns(bytes memory);
    function contenthash(bytes32 node) external view returns (bytes memory);
    function dnsrr(bytes32 node) external view returns (bytes memory);
    function name(bytes32 node) external view returns (string memory);
    function pubkey(bytes32 node) external view returns (bytes32 x, bytes32 y);
    function text(bytes32 node, string calldata key) external view returns (string memory);
    function interfaceImplementer(bytes32 node, bytes4 interfaceID) external view returns (address);
    function setABI(bytes32 node, uint256 contentType, bytes calldata data) external;
    function setAddr(bytes32 node, address addr) external;
    function setAddr(bytes32 node, uint coinType, bytes calldata a) external;
    function setContenthash(bytes32 node, bytes calldata hash) external;
    function setDnsrr(bytes32 node, bytes calldata data) external;
    function setName(bytes32 node, string calldata _name) external;
    function setPubkey(bytes32 node, bytes32 x, bytes32 y) external;
    function setText(bytes32 node, string calldata key, string calldata value) external;
    function setInterface(bytes32 node, bytes4 interfaceID, address implementer) external;
    function supportsInterface(bytes4 interfaceID) external pure returns (bool);
    function multicall(bytes[] calldata data) external returns(bytes[] memory results);

    /* Deprecated functions */
    function content(bytes32 node) external view returns (bytes32);
    function multihash(bytes32 node) external view returns (bytes memory);
    function setContent(bytes32 node, bytes32 hash) external;
    function setMultihash(bytes32 node, bytes calldata hash) external;
}

Settings
{
  "optimizer": {
    "enabled": false,
    "runs": 200
  },
  "outputSelection": {
    "*": {
      "*": [
        "evm.bytecode",
        "evm.deployedBytecode",
        "abi"
      ]
    }
  },
  "libraries": {}
}

Contract Security Audit

Contract ABI

[{"inputs":[{"internalType":"contract ENS","name":"_ens","type":"address"}],"stateMutability":"nonpayable","type":"constructor"},{"inputs":[{"internalType":"address[]","name":"addresses","type":"address[]"}],"name":"getNames","outputs":[{"internalType":"string[]","name":"r","type":"string[]"}],"stateMutability":"view","type":"function"}]

60806040523480156200001157600080fd5b5060405162000f4e38038062000f4e8339818101604052810190620000379190620001ea565b806000806101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555060008054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166302571be37f91d1777781884d03a6757a803996e38de2a42967fb37eeaca72729271025a9e260001b6040518263ffffffff1660e01b8152600401620000f5919062000227565b60206040518083038186803b1580156200010e57600080fd5b505afa15801562000123573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190620001499190620001be565b600160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050620002ca565b600081519050620001a18162000296565b92915050565b600081519050620001b881620002b0565b92915050565b600060208284031215620001d157600080fd5b6000620001e18482850162000190565b91505092915050565b600060208284031215620001fd57600080fd5b60006200020d84828501620001a7565b91505092915050565b620002218162000258565b82525050565b60006020820190506200023e600083018462000216565b92915050565b6000620002518262000276565b9050919050565b6000819050919050565b60006200026f8262000244565b9050919050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b620002a18162000244565b8114620002ad57600080fd5b50565b620002bb8162000262565b8114620002c757600080fd5b50565b610c7480620002da6000396000f3fe608060405234801561001057600080fd5b506004361061002b5760003560e01c8063cbf8b66c14610030575b600080fd5b61004a6004803603810190610045919061090e565b610060565b6040516100579190610aa8565b60405180910390f35b60608282905067ffffffffffffffff8111801561007c57600080fd5b506040519080825280602002602001820160405280156100b057816020015b606081526020019060019003908161009b5790505b50905060005b838390508110156104805760006100ec8585848181106100d257fe5b90506020020160208101906100e791906108bc565b610487565b905060008060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16630178b8bf836040518263ffffffff1660e01b815260040161014a9190610aca565b60206040518083038186803b15801561016257600080fd5b505afa158015610176573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061019a91906108e5565b9050600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161461047057600081905060608173ffffffffffffffffffffffffffffffffffffffff1663691f3431856040518263ffffffff1660e01b81526004016102109190610aca565b60006040518083038186803b15801561022857600080fd5b505afa15801561023c573d6000803e3d6000fd5b505050506040513d6000823e3d601f19601f820116820180604052508101906102659190610953565b905060008151141561027a5750505050610473565b6000610285826104e4565b905060008060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16630178b8bf836040518263ffffffff1660e01b81526004016102e39190610aca565b60206040518083038186803b1580156102fb57600080fd5b505afa15801561030f573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061033391906108e5565b9050600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161461046b57600081905060008173ffffffffffffffffffffffffffffffffffffffff16633b3b57de856040518263ffffffff1660e01b81526004016103a99190610aca565b60206040518083038186803b1580156103c157600080fd5b505afa1580156103d5573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906103f991906108e5565b90508b8b8a81811061040757fe5b905060200201602081019061041c91906108bc565b73ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16141561046857848a8a8151811061045c57fe5b60200260200101819052505b50505b505050505b50505b80806001019150506100b6565b5092915050565b60007f91d1777781884d03a6757a803996e38de2a42967fb37eeaca72729271025a9e260001b6104b6836105cf565b6040516020016104c7929190610a7c565b604051602081830303815290604052805190602001209050919050565b60008060001b90506104f46107da565b6104fd83610639565b90506105076107da565b6105456040518060400160405280600181526020017f2e00000000000000000000000000000000000000000000000000000000000000815250610639565b905061054f6107da565b6105648282856106679092919063ffffffff16565b505b61056f816106f1565b6105c7578361057d82610701565b60405160200180838152602001828152602001925050506040516020818303038152906040528051906020012093506105c18282856106679092919063ffffffff16565b50610566565b505050919050565b60007f303132333435363738396162636465660000000000000000000000000000000060285b600081111561062b5760018103905081600f85161a815360108404935060018103905081600f85161a81536010840493506105f5565b506028600020915050919050565b6106416107da565b600060208301905060405180604001604052808451815260200182815250915050919050565b61066f6107da565b600061068d8560000151866020015186600001518760200151610712565b9050808360200181815250508460200151810385600001510383600001818152505084602001518114156106cb5760008560000181815250506106e6565b83600001518360000151018560000181815103915081815250505b829150509392505050565b6000808260000151149050919050565b600081516020830151209050919050565b6000808584116107cd576020841161078d57600060018560200360080260020a031960001b905060008185511690508588880103925060008284511690505b81811461077f5787841161076b57879450505050506107d2565b838060019003945050828451169050610751565b8684019450505050506107d2565b60008484209050848703860191505b8582106107cb5760008583209050808214156107bf5785830193505050506107d2565b6001830392505061079c565b505b849150505b949350505050565b604051806040016040528060008152602001600081525090565b60008135905061080381610c27565b92915050565b60008151905061081881610c27565b92915050565b60008083601f84011261083057600080fd5b8235905067ffffffffffffffff81111561084957600080fd5b60208301915083602082028301111561086157600080fd5b9250929050565b600082601f83011261087957600080fd5b815161088c61088782610b16565b610ae5565b915080825260208301602083018583830111156108a857600080fd5b6108b3838284610bd7565b50505092915050565b6000602082840312156108ce57600080fd5b60006108dc848285016107f4565b91505092915050565b6000602082840312156108f757600080fd5b600061090584828501610809565b91505092915050565b6000806020838503121561092157600080fd5b600083013567ffffffffffffffff81111561093b57600080fd5b6109478582860161081e565b92509250509250929050565b60006020828403121561096557600080fd5b600082015167ffffffffffffffff81111561097f57600080fd5b61098b84828501610868565b91505092915050565b60006109a08383610a43565b905092915050565b60006109b382610b56565b6109bd8185610b79565b9350836020820285016109cf85610b46565b8060005b85811015610a0b57848403895281516109ec8582610994565b94506109f783610b6c565b925060208a019950506001810190506109d3565b50829750879550505050505092915050565b610a2681610bad565b82525050565b610a3d610a3882610bad565b610c0a565b82525050565b6000610a4e82610b61565b610a588185610b8a565b9350610a68818560208601610bd7565b610a7181610c16565b840191505092915050565b6000610a888285610a2c565b602082019150610a988284610a2c565b6020820191508190509392505050565b60006020820190508181036000830152610ac281846109a8565b905092915050565b6000602082019050610adf6000830184610a1d565b92915050565b6000604051905081810181811067ffffffffffffffff82111715610b0c57610b0b610c14565b5b8060405250919050565b600067ffffffffffffffff821115610b3157610b30610c14565b5b601f19601f8301169050602081019050919050565b6000819050602082019050919050565b600081519050919050565b600081519050919050565b6000602082019050919050565b600082825260208201905092915050565b600082825260208201905092915050565b6000610ba682610bb7565b9050919050565b6000819050919050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b60005b83811015610bf5578082015181840152602081019050610bda565b83811115610c04576000848401525b50505050565b6000819050919050565bfe5b6000601f19601f8301169050919050565b610c3081610b9b565b8114610c3b57600080fd5b5056fea2646970667358221220ddd50dc3d4f372ab2392b85edf01f0241c9fadb6f7926a5890e40fd6b0ed1dcf64736f6c6343000704003300000000000000000000000000000000000c2e074ec69a0dfb2997ba6c7d2e1e

Deployed Bytecode

0x608060405234801561001057600080fd5b506004361061002b5760003560e01c8063cbf8b66c14610030575b600080fd5b61004a6004803603810190610045919061090e565b610060565b6040516100579190610aa8565b60405180910390f35b60608282905067ffffffffffffffff8111801561007c57600080fd5b506040519080825280602002602001820160405280156100b057816020015b606081526020019060019003908161009b5790505b50905060005b838390508110156104805760006100ec8585848181106100d257fe5b90506020020160208101906100e791906108bc565b610487565b905060008060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16630178b8bf836040518263ffffffff1660e01b815260040161014a9190610aca565b60206040518083038186803b15801561016257600080fd5b505afa158015610176573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061019a91906108e5565b9050600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161461047057600081905060608173ffffffffffffffffffffffffffffffffffffffff1663691f3431856040518263ffffffff1660e01b81526004016102109190610aca565b60006040518083038186803b15801561022857600080fd5b505afa15801561023c573d6000803e3d6000fd5b505050506040513d6000823e3d601f19601f820116820180604052508101906102659190610953565b905060008151141561027a5750505050610473565b6000610285826104e4565b905060008060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16630178b8bf836040518263ffffffff1660e01b81526004016102e39190610aca565b60206040518083038186803b1580156102fb57600080fd5b505afa15801561030f573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061033391906108e5565b9050600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161461046b57600081905060008173ffffffffffffffffffffffffffffffffffffffff16633b3b57de856040518263ffffffff1660e01b81526004016103a99190610aca565b60206040518083038186803b1580156103c157600080fd5b505afa1580156103d5573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906103f991906108e5565b90508b8b8a81811061040757fe5b905060200201602081019061041c91906108bc565b73ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16141561046857848a8a8151811061045c57fe5b60200260200101819052505b50505b505050505b50505b80806001019150506100b6565b5092915050565b60007f91d1777781884d03a6757a803996e38de2a42967fb37eeaca72729271025a9e260001b6104b6836105cf565b6040516020016104c7929190610a7c565b604051602081830303815290604052805190602001209050919050565b60008060001b90506104f46107da565b6104fd83610639565b90506105076107da565b6105456040518060400160405280600181526020017f2e00000000000000000000000000000000000000000000000000000000000000815250610639565b905061054f6107da565b6105648282856106679092919063ffffffff16565b505b61056f816106f1565b6105c7578361057d82610701565b60405160200180838152602001828152602001925050506040516020818303038152906040528051906020012093506105c18282856106679092919063ffffffff16565b50610566565b505050919050565b60007f303132333435363738396162636465660000000000000000000000000000000060285b600081111561062b5760018103905081600f85161a815360108404935060018103905081600f85161a81536010840493506105f5565b506028600020915050919050565b6106416107da565b600060208301905060405180604001604052808451815260200182815250915050919050565b61066f6107da565b600061068d8560000151866020015186600001518760200151610712565b9050808360200181815250508460200151810385600001510383600001818152505084602001518114156106cb5760008560000181815250506106e6565b83600001518360000151018560000181815103915081815250505b829150509392505050565b6000808260000151149050919050565b600081516020830151209050919050565b6000808584116107cd576020841161078d57600060018560200360080260020a031960001b905060008185511690508588880103925060008284511690505b81811461077f5787841161076b57879450505050506107d2565b838060019003945050828451169050610751565b8684019450505050506107d2565b60008484209050848703860191505b8582106107cb5760008583209050808214156107bf5785830193505050506107d2565b6001830392505061079c565b505b849150505b949350505050565b604051806040016040528060008152602001600081525090565b60008135905061080381610c27565b92915050565b60008151905061081881610c27565b92915050565b60008083601f84011261083057600080fd5b8235905067ffffffffffffffff81111561084957600080fd5b60208301915083602082028301111561086157600080fd5b9250929050565b600082601f83011261087957600080fd5b815161088c61088782610b16565b610ae5565b915080825260208301602083018583830111156108a857600080fd5b6108b3838284610bd7565b50505092915050565b6000602082840312156108ce57600080fd5b60006108dc848285016107f4565b91505092915050565b6000602082840312156108f757600080fd5b600061090584828501610809565b91505092915050565b6000806020838503121561092157600080fd5b600083013567ffffffffffffffff81111561093b57600080fd5b6109478582860161081e565b92509250509250929050565b60006020828403121561096557600080fd5b600082015167ffffffffffffffff81111561097f57600080fd5b61098b84828501610868565b91505092915050565b60006109a08383610a43565b905092915050565b60006109b382610b56565b6109bd8185610b79565b9350836020820285016109cf85610b46565b8060005b85811015610a0b57848403895281516109ec8582610994565b94506109f783610b6c565b925060208a019950506001810190506109d3565b50829750879550505050505092915050565b610a2681610bad565b82525050565b610a3d610a3882610bad565b610c0a565b82525050565b6000610a4e82610b61565b610a588185610b8a565b9350610a68818560208601610bd7565b610a7181610c16565b840191505092915050565b6000610a888285610a2c565b602082019150610a988284610a2c565b6020820191508190509392505050565b60006020820190508181036000830152610ac281846109a8565b905092915050565b6000602082019050610adf6000830184610a1d565b92915050565b6000604051905081810181811067ffffffffffffffff82111715610b0c57610b0b610c14565b5b8060405250919050565b600067ffffffffffffffff821115610b3157610b30610c14565b5b601f19601f8301169050602081019050919050565b6000819050602082019050919050565b600081519050919050565b600081519050919050565b6000602082019050919050565b600082825260208201905092915050565b600082825260208201905092915050565b6000610ba682610bb7565b9050919050565b6000819050919050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b60005b83811015610bf5578082015181840152602081019050610bda565b83811115610c04576000848401525b50505050565b6000819050919050565bfe5b6000601f19601f8301169050919050565b610c3081610b9b565b8114610c3b57600080fd5b5056fea2646970667358221220ddd50dc3d4f372ab2392b85edf01f0241c9fadb6f7926a5890e40fd6b0ed1dcf64736f6c63430007040033

Constructor Arguments (ABI-Encoded and is the last bytes of the Contract Creation Code above)

00000000000000000000000000000000000c2e074ec69a0dfb2997ba6c7d2e1e

-----Decoded View---------------
Arg [0] : _ens (address): 0x00000000000C2E074eC69A0dFb2997BA6C7d2e1e

-----Encoded View---------------
1 Constructor Arguments found :
Arg [0] : 00000000000000000000000000000000000c2e074ec69a0dfb2997ba6c7d2e1e


Block Transaction Difficulty Gas Used Reward
View All Blocks Produced

Block Uncle Number Difficulty Gas Used Reward
View All Uncles
Loading...
Loading
Loading...
Loading

Validator Index Block Amount
View All Withdrawals

Transaction Hash Block Value Eth2 PubKey Valid
View All Deposits
Loading...
Loading

A contract address hosts a smart contract, which is a set of code stored on the blockchain that runs when predetermined conditions are met. Learn more about addresses in our Knowledge Base.