ETH Price: $2,922.92 (-6.83%)
 

Overview

ETH Balance

0 ETH

Eth Value

$0.00

Token Holdings

Multichain Info

No addresses found
Transaction Hash
Method
Block
From
To
Claim Subnode201047752024-06-16 13:52:47231 days ago1718545967IN
0xf35eB8ac...1a1dd37c3
0 ETH0.000649854.69953268
Claim Subnode200444802024-06-08 3:39:11239 days ago1717817951IN
0xf35eB8ac...1a1dd37c3
0 ETH0.000888946.42857454
Claim Subnode199532282024-05-26 9:42:35252 days ago1716716555IN
0xf35eB8ac...1a1dd37c3
0 ETH0.000497153.59526005
Claim Subnode198354542024-05-09 22:25:47268 days ago1715293547IN
0xf35eB8ac...1a1dd37c3
0 ETH0.000589224.26106437
Claim Subnode197553542024-04-28 17:38:11280 days ago1714325891IN
0xf35eB8ac...1a1dd37c3
0 ETH0.000911546.59200081
Claim Subnode197282312024-04-24 22:32:59283 days ago1713997979IN
0xf35eB8ac...1a1dd37c3
0 ETH0.001141778.25690374
Claim Subnode196914782024-04-19 19:10:47289 days ago1713553847IN
0xf35eB8ac...1a1dd37c3
0 ETH0.001358919.82806277
Claim Subnode196801522024-04-18 5:07:35290 days ago1713416855IN
0xf35eB8ac...1a1dd37c3
0 ETH0.001078897.8021802
Claim Subnode196781382024-04-17 22:21:35290 days ago1713392495IN
0xf35eB8ac...1a1dd37c3
0 ETH0.001310549.47741973
Claim Subnode194319842024-03-14 8:12:47325 days ago1710403967IN
0xf35eB8ac...1a1dd37c3
0 ETH0.0030245352.33038
Claim Subnode192748092024-02-21 8:20:23347 days ago1708503623IN
0xf35eB8ac...1a1dd37c3
0 ETH0.0036349226.28648063
Claim Subnode192129482024-02-12 15:50:47356 days ago1707753047IN
0xf35eB8ac...1a1dd37c3
0 ETH0.0049793944.34961735
Claim Subnode191788922024-02-07 21:08:23361 days ago1707340103IN
0xf35eB8ac...1a1dd37c3
0 ETH0.00562440.67084078
Claim Subnode190477332024-01-20 11:19:11379 days ago1705749551IN
0xf35eB8ac...1a1dd37c3
0 ETH0.0018140213.11956001
Claim Subnode189094442024-01-01 1:51:59398 days ago1704073919IN
0xf35eB8ac...1a1dd37c3
0 ETH0.001252129.05575201
Claim Subnode187563722023-12-10 14:21:47420 days ago1702218107IN
0xf35eB8ac...1a1dd37c3
0 ETH0.0031377222.69095456
Claim Subnode187325442023-12-07 6:10:47423 days ago1701929447IN
0xf35eB8ac...1a1dd37c3
0 ETH0.0045340632.79446027
Claim Subnode187066822023-12-03 15:13:47427 days ago1701616427IN
0xf35eB8ac...1a1dd37c3
0 ETH0.006944550.22025029
Claim Subnode187028272023-12-03 2:14:23427 days ago1701569663IN
0xf35eB8ac...1a1dd37c3
0 ETH0.0040277129.12957569
Claim Subnode186995172023-12-02 15:08:59428 days ago1701529739IN
0xf35eB8ac...1a1dd37c3
0 ETH0.0044146431.9251703
Claim Subnode186947392023-12-01 23:07:35428 days ago1701472055IN
0xf35eB8ac...1a1dd37c3
0 ETH0.0042348630.6250677
Claim Subnode186937662023-12-01 19:51:59429 days ago1701460319IN
0xf35eB8ac...1a1dd37c3
0 ETH0.0052204537.75252095
Claim Subnode186656202023-11-27 21:20:59433 days ago1701120059IN
0xf35eB8ac...1a1dd37c3
0 ETH0.0046544133.6591388
Claim Subnode186368692023-11-23 20:39:11437 days ago1700771951IN
0xf35eB8ac...1a1dd37c3
0 ETH0.0032243623.31749345
Claim Subnode186325772023-11-23 6:15:35437 days ago1700720135IN
0xf35eB8ac...1a1dd37c3
0 ETH0.0042756830.92026019
View all transactions

View more zero value Internal Transactions in Advanced View mode

Advanced mode:
Loading...
Loading

Contract Source Code Verified (Exact Match)

Contract Name:
WanderDomainRegistry

Compiler Version
v0.8.15+commit.e14f2714

Optimization Enabled:
Yes with 1000 runs

Other Settings:
default evmVersion
File 1 of 9 : WanderDomainRegistry.sol
// SPDX-License-Identifier: UNLICENSED
pragma solidity ^0.8.13;

import "openzeppelin-contracts/contracts/token/ERC721/IERC721.sol";
import "openzeppelin-contracts/contracts/token/ERC721/IERC721Receiver.sol";
import "openzeppelin-contracts/contracts/access/Ownable.sol";
import "openzeppelin-contracts/contracts/security/Pausable.sol";
import "ens-contracts/registry/ENS.sol";
import "ens-contracts/ethregistrar/IBaseRegistrar.sol";

contract WanderDomainRegistry is Ownable, Pausable, IERC721Receiver {
    /// Wanderers token
    IERC721 immutable WANDERERS;

    /// ENS Registry
    ENS immutable REGISTRY;

    /// ENS Registrar (token)
    IBaseRegistrar immutable REGISTRAR;

    /// Public resolver
    address immutable RESOLVER;

    /// ".eth" basenode hash
    bytes32 constant ETH_BASENODE =
        0x93cdeb708b7545dc668eb9280176169d1c33cfd8ed6f04690a0bcc88a93fc4ae;

    struct NodeLabel {
        bytes32 node;
        bytes32 label;
    }

    // Token IDs => registered node/label
    mapping(uint256 => NodeLabel) public tokenSubnode;

    event DomainDeposited(uint256 tokenId);
    event DomainWithdrawn(uint256 tokenId);

    constructor(
        IERC721 _wanderers,
        ENS _registry,
        IBaseRegistrar _registrar,
        address _resolver
    ) {
        WANDERERS = _wanderers;
        REGISTRY = _registry;
        REGISTRAR = _registrar;
        RESOLVER = _resolver;

        _pause();
    }

    modifier isTokenHolder(uint256 tokenId) {
        require(WANDERERS.ownerOf(tokenId) == msg.sender, "not token holder");
        _;
    }

    modifier tokenNotAssignedToSubnode(uint256 tokenId) {
        require(
            tokenSubnode[tokenId].node != 0 && tokenSubnode[tokenId].label != 0,
            "token already has subnode"
        );
        _;
    }

    /// @dev Pause the contract.
    function pause() external onlyOwner whenNotPaused {
        _pause();
    }

    /// @dev Unpause the contract.
    function unpause() external onlyOwner whenPaused {
        _unpause();
    }

    /// @dev Claim a subdomain for a token. May only be called by the token holder. If a subdomain for the given token already exists, it will be cleared.
    /// @param tokenId the Wanderers token ID used for the claim
    /// @param node nodehash of the domain
    /// @param label labelhash of the subdomain
    /// @param _owner new owner of subdomain
    function claimSubnode(
        uint256 tokenId,
        bytes32 node,
        bytes32 label,
        address _owner
    ) external isTokenHolder(tokenId) whenNotPaused {
        bytes32 subnode = keccak256(abi.encodePacked(node, label));

        NodeLabel storage currentNodeLabel = tokenSubnode[tokenId];

        // If the token already has a label, clear it
        if (currentNodeLabel.node != 0 || currentNodeLabel.label != 0) {
            _clearSubnode(currentNodeLabel.node, currentNodeLabel.label);
        }

        // Make sure the subnode to be set does not already exist
        require(
            REGISTRY.owner(subnode) == address(0),
            "subnode already in use"
        );

        // Update current node and label
        currentNodeLabel.node = node;
        currentNodeLabel.label = label;

        // Set subnode owner to new owner
        REGISTRY.setSubnodeRecord(node, label, _owner, RESOLVER, 0);
    }

    function clearSubnode(uint256 tokenId)
        external
        isTokenHolder(tokenId)
        whenNotPaused
    {
        NodeLabel storage currentNodeLabel = tokenSubnode[tokenId];
        currentNodeLabel.node = 0;
        currentNodeLabel.label = 0;
        _clearSubnode(currentNodeLabel.node, currentNodeLabel.label);
    }

    function _clearSubnode(bytes32 node, bytes32 label) internal {
        REGISTRY.setSubnodeRecord(node, label, address(0), address(0), 0);
    }

    /// When administrative controls are enabled, allow the owner to withdraw domains
    function withdrawDomain(uint256 tokenId) external onlyOwner whenPaused {
        emit DomainWithdrawn(tokenId);
        REGISTRAR.safeTransferFrom(address(this), owner(), tokenId);
    }

    /// IERC721Receiver implementation
    /// @dev when administrative controls are enabled, only the owner can deposit new domains.
    function onERC721Received(
        address, /* operator */
        address from,
        uint256 tokenId,
        bytes calldata /* data */
    ) external whenNotPaused returns (bytes4) {
        // Token is a .eth domain
        require(msg.sender == address(REGISTRAR), "not a domain");

        // When administrative controls are enabled, only the owner can deposit new domains
        if (owner() != address(0)) {
            require(from == owner(), "only owner may add domains");
        }

        // Take control of the domain
        REGISTRAR.reclaim(tokenId, address(this));

        emit DomainDeposited(tokenId);
        return IERC721Receiver.onERC721Received.selector;
    }
}

File 2 of 9 : IERC721.sol
// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts (last updated v4.7.0) (token/ERC721/IERC721.sol)

pragma solidity ^0.8.0;

import "../../utils/introspection/IERC165.sol";

/**
 * @dev Required interface of an ERC721 compliant contract.
 */
interface IERC721 is IERC165 {
    /**
     * @dev Emitted when `tokenId` token is transferred from `from` to `to`.
     */
    event Transfer(address indexed from, address indexed to, uint256 indexed tokenId);

    /**
     * @dev Emitted when `owner` enables `approved` to manage the `tokenId` token.
     */
    event Approval(address indexed owner, address indexed approved, uint256 indexed tokenId);

    /**
     * @dev Emitted when `owner` enables or disables (`approved`) `operator` to manage all of its assets.
     */
    event ApprovalForAll(address indexed owner, address indexed operator, bool approved);

    /**
     * @dev Returns the number of tokens in ``owner``'s account.
     */
    function balanceOf(address owner) external view returns (uint256 balance);

    /**
     * @dev Returns the owner of the `tokenId` token.
     *
     * Requirements:
     *
     * - `tokenId` must exist.
     */
    function ownerOf(uint256 tokenId) external view returns (address owner);

    /**
     * @dev Safely transfers `tokenId` token from `from` to `to`.
     *
     * Requirements:
     *
     * - `from` cannot be the zero address.
     * - `to` cannot be the zero address.
     * - `tokenId` token must exist and be owned by `from`.
     * - If the caller is not `from`, it must be approved to move this token by either {approve} or {setApprovalForAll}.
     * - If `to` refers to a smart contract, it must implement {IERC721Receiver-onERC721Received}, which is called upon a safe transfer.
     *
     * Emits a {Transfer} event.
     */
    function safeTransferFrom(
        address from,
        address to,
        uint256 tokenId,
        bytes calldata data
    ) external;

    /**
     * @dev Safely transfers `tokenId` token from `from` to `to`, checking first that contract recipients
     * are aware of the ERC721 protocol to prevent tokens from being forever locked.
     *
     * Requirements:
     *
     * - `from` cannot be the zero address.
     * - `to` cannot be the zero address.
     * - `tokenId` token must exist and be owned by `from`.
     * - If the caller is not `from`, it must have been allowed to move this token by either {approve} or {setApprovalForAll}.
     * - If `to` refers to a smart contract, it must implement {IERC721Receiver-onERC721Received}, which is called upon a safe transfer.
     *
     * Emits a {Transfer} event.
     */
    function safeTransferFrom(
        address from,
        address to,
        uint256 tokenId
    ) external;

    /**
     * @dev Transfers `tokenId` token from `from` to `to`.
     *
     * WARNING: Usage of this method is discouraged, use {safeTransferFrom} whenever possible.
     *
     * Requirements:
     *
     * - `from` cannot be the zero address.
     * - `to` cannot be the zero address.
     * - `tokenId` token must be owned by `from`.
     * - If the caller is not `from`, it must be approved to move this token by either {approve} or {setApprovalForAll}.
     *
     * Emits a {Transfer} event.
     */
    function transferFrom(
        address from,
        address to,
        uint256 tokenId
    ) external;

    /**
     * @dev Gives permission to `to` to transfer `tokenId` token to another account.
     * The approval is cleared when the token is transferred.
     *
     * Only a single account can be approved at a time, so approving the zero address clears previous approvals.
     *
     * Requirements:
     *
     * - The caller must own the token or be an approved operator.
     * - `tokenId` must exist.
     *
     * Emits an {Approval} event.
     */
    function approve(address to, uint256 tokenId) external;

    /**
     * @dev Approve or remove `operator` as an operator for the caller.
     * Operators can call {transferFrom} or {safeTransferFrom} for any token owned by the caller.
     *
     * Requirements:
     *
     * - The `operator` cannot be the caller.
     *
     * Emits an {ApprovalForAll} event.
     */
    function setApprovalForAll(address operator, bool _approved) external;

    /**
     * @dev Returns the account approved for `tokenId` token.
     *
     * Requirements:
     *
     * - `tokenId` must exist.
     */
    function getApproved(uint256 tokenId) external view returns (address operator);

    /**
     * @dev Returns if the `operator` is allowed to manage all of the assets of `owner`.
     *
     * See {setApprovalForAll}
     */
    function isApprovedForAll(address owner, address operator) external view returns (bool);
}

File 3 of 9 : IERC721Receiver.sol
// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts (last updated v4.6.0) (token/ERC721/IERC721Receiver.sol)

pragma solidity ^0.8.0;

/**
 * @title ERC721 token receiver interface
 * @dev Interface for any contract that wants to support safeTransfers
 * from ERC721 asset contracts.
 */
interface IERC721Receiver {
    /**
     * @dev Whenever an {IERC721} `tokenId` token is transferred to this contract via {IERC721-safeTransferFrom}
     * by `operator` from `from`, this function is called.
     *
     * It must return its Solidity selector to confirm the token transfer.
     * If any other value is returned or the interface is not implemented by the recipient, the transfer will be reverted.
     *
     * The selector can be obtained in Solidity with `IERC721Receiver.onERC721Received.selector`.
     */
    function onERC721Received(
        address operator,
        address from,
        uint256 tokenId,
        bytes calldata data
    ) external returns (bytes4);
}

File 4 of 9 : Ownable.sol
// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts (last updated v4.7.0) (access/Ownable.sol)

pragma solidity ^0.8.0;

import "../utils/Context.sol";

/**
 * @dev Contract module which provides a basic access control mechanism, where
 * there is an account (an owner) that can be granted exclusive access to
 * specific functions.
 *
 * By default, the owner account will be the one that deploys the contract. This
 * can later be changed with {transferOwnership}.
 *
 * This module is used through inheritance. It will make available the modifier
 * `onlyOwner`, which can be applied to your functions to restrict their use to
 * the owner.
 */
abstract contract Ownable is Context {
    address private _owner;

    event OwnershipTransferred(address indexed previousOwner, address indexed newOwner);

    /**
     * @dev Initializes the contract setting the deployer as the initial owner.
     */
    constructor() {
        _transferOwnership(_msgSender());
    }

    /**
     * @dev Throws if called by any account other than the owner.
     */
    modifier onlyOwner() {
        _checkOwner();
        _;
    }

    /**
     * @dev Returns the address of the current owner.
     */
    function owner() public view virtual returns (address) {
        return _owner;
    }

    /**
     * @dev Throws if the sender is not the owner.
     */
    function _checkOwner() internal view virtual {
        require(owner() == _msgSender(), "Ownable: caller is not the owner");
    }

    /**
     * @dev Leaves the contract without owner. It will not be possible to call
     * `onlyOwner` functions anymore. Can only be called by the current owner.
     *
     * NOTE: Renouncing ownership will leave the contract without an owner,
     * thereby removing any functionality that is only available to the owner.
     */
    function renounceOwnership() public virtual onlyOwner {
        _transferOwnership(address(0));
    }

    /**
     * @dev Transfers ownership of the contract to a new account (`newOwner`).
     * Can only be called by the current owner.
     */
    function transferOwnership(address newOwner) public virtual onlyOwner {
        require(newOwner != address(0), "Ownable: new owner is the zero address");
        _transferOwnership(newOwner);
    }

    /**
     * @dev Transfers ownership of the contract to a new account (`newOwner`).
     * Internal function without access restriction.
     */
    function _transferOwnership(address newOwner) internal virtual {
        address oldOwner = _owner;
        _owner = newOwner;
        emit OwnershipTransferred(oldOwner, newOwner);
    }
}

File 5 of 9 : Pausable.sol
// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts (last updated v4.7.0) (security/Pausable.sol)

pragma solidity ^0.8.0;

import "../utils/Context.sol";

/**
 * @dev Contract module which allows children to implement an emergency stop
 * mechanism that can be triggered by an authorized account.
 *
 * This module is used through inheritance. It will make available the
 * modifiers `whenNotPaused` and `whenPaused`, which can be applied to
 * the functions of your contract. Note that they will not be pausable by
 * simply including this module, only once the modifiers are put in place.
 */
abstract contract Pausable is Context {
    /**
     * @dev Emitted when the pause is triggered by `account`.
     */
    event Paused(address account);

    /**
     * @dev Emitted when the pause is lifted by `account`.
     */
    event Unpaused(address account);

    bool private _paused;

    /**
     * @dev Initializes the contract in unpaused state.
     */
    constructor() {
        _paused = false;
    }

    /**
     * @dev Modifier to make a function callable only when the contract is not paused.
     *
     * Requirements:
     *
     * - The contract must not be paused.
     */
    modifier whenNotPaused() {
        _requireNotPaused();
        _;
    }

    /**
     * @dev Modifier to make a function callable only when the contract is paused.
     *
     * Requirements:
     *
     * - The contract must be paused.
     */
    modifier whenPaused() {
        _requirePaused();
        _;
    }

    /**
     * @dev Returns true if the contract is paused, and false otherwise.
     */
    function paused() public view virtual returns (bool) {
        return _paused;
    }

    /**
     * @dev Throws if the contract is paused.
     */
    function _requireNotPaused() internal view virtual {
        require(!paused(), "Pausable: paused");
    }

    /**
     * @dev Throws if the contract is not paused.
     */
    function _requirePaused() internal view virtual {
        require(paused(), "Pausable: not paused");
    }

    /**
     * @dev Triggers stopped state.
     *
     * Requirements:
     *
     * - The contract must not be paused.
     */
    function _pause() internal virtual whenNotPaused {
        _paused = true;
        emit Paused(_msgSender());
    }

    /**
     * @dev Returns to normal state.
     *
     * Requirements:
     *
     * - The contract must be paused.
     */
    function _unpause() internal virtual whenPaused {
        _paused = false;
        emit Unpaused(_msgSender());
    }
}

File 6 of 9 : ENS.sol
pragma solidity >=0.8.4;

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 7 of 9 : IBaseRegistrar.sol
import "../registry/ENS.sol";
import "./IBaseRegistrar.sol";
import "@openzeppelin/contracts/token/ERC721/IERC721.sol";

interface IBaseRegistrar is IERC721 {
    event ControllerAdded(address indexed controller);
    event ControllerRemoved(address indexed controller);
    event NameMigrated(
        uint256 indexed id,
        address indexed owner,
        uint256 expires
    );
    event NameRegistered(
        uint256 indexed id,
        address indexed owner,
        uint256 expires
    );
    event NameRenewed(uint256 indexed id, uint256 expires);

    // Authorises a controller, who can register and renew domains.
    function addController(address controller) external;

    // Revoke controller permission for an address.
    function removeController(address controller) external;

    // Set the resolver for the TLD this registrar manages.
    function setResolver(address resolver) external;

    // Returns the expiration timestamp of the specified label hash.
    function nameExpires(uint256 id) external view returns (uint256);

    // Returns true iff the specified name is available for registration.
    function available(uint256 id) external view returns (bool);

    /**
     * @dev Register a name.
     */
    function register(
        uint256 id,
        address owner,
        uint256 duration
    ) external returns (uint256);

    function renew(uint256 id, uint256 duration) external returns (uint256);

    /**
     * @dev Reclaim ownership of a name in ENS, if you own it in the registrar.
     */
    function reclaim(uint256 id, address owner) external;
}

File 8 of 9 : IERC165.sol
// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts v4.4.1 (utils/introspection/IERC165.sol)

pragma solidity ^0.8.0;

/**
 * @dev Interface of the ERC165 standard, as defined in the
 * https://eips.ethereum.org/EIPS/eip-165[EIP].
 *
 * Implementers can declare support of contract interfaces, which can then be
 * queried by others ({ERC165Checker}).
 *
 * For an implementation, see {ERC165}.
 */
interface IERC165 {
    /**
     * @dev Returns true if this contract implements the interface defined by
     * `interfaceId`. See the corresponding
     * https://eips.ethereum.org/EIPS/eip-165#how-interfaces-are-identified[EIP section]
     * to learn more about how these ids are created.
     *
     * This function call must use less than 30 000 gas.
     */
    function supportsInterface(bytes4 interfaceId) external view returns (bool);
}

File 9 of 9 : Context.sol
// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts v4.4.1 (utils/Context.sol)

pragma solidity ^0.8.0;

/**
 * @dev Provides information about the current execution context, including the
 * sender of the transaction and its data. While these are generally available
 * via msg.sender and msg.data, they should not be accessed in such a direct
 * manner, since when dealing with meta-transactions the account sending and
 * paying for execution may not be the actual sender (as far as an application
 * is concerned).
 *
 * This contract is only required for intermediate, library-like contracts.
 */
abstract contract Context {
    function _msgSender() internal view virtual returns (address) {
        return msg.sender;
    }

    function _msgData() internal view virtual returns (bytes calldata) {
        return msg.data;
    }
}

Settings
{
  "remappings": [
    "@openzeppelin/=lib/openzeppelin-contracts/",
    "ds-test/=lib/forge-std/lib/ds-test/src/",
    "ens-contracts/=lib/ens-contracts/contracts/",
    "forge-std/=lib/forge-std/src/",
    "openzeppelin-contracts/=lib/openzeppelin-contracts/",
    "script/=script/",
    "src/=src/",
    "test/=test/",
    "src/=src/",
    "test/=test/",
    "script/=script/"
  ],
  "optimizer": {
    "enabled": true,
    "runs": 1000
  },
  "metadata": {
    "bytecodeHash": "ipfs"
  },
  "outputSelection": {
    "*": {
      "*": [
        "evm.bytecode",
        "evm.deployedBytecode",
        "devdoc",
        "userdoc",
        "metadata",
        "abi"
      ]
    }
  },
  "evmVersion": "london",
  "libraries": {}
}

Contract Security Audit

Contract ABI

[{"inputs":[{"internalType":"contract IERC721","name":"_wanderers","type":"address"},{"internalType":"contract ENS","name":"_registry","type":"address"},{"internalType":"contract IBaseRegistrar","name":"_registrar","type":"address"},{"internalType":"address","name":"_resolver","type":"address"}],"stateMutability":"nonpayable","type":"constructor"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"DomainDeposited","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"DomainWithdrawn","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"previousOwner","type":"address"},{"indexed":true,"internalType":"address","name":"newOwner","type":"address"}],"name":"OwnershipTransferred","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"account","type":"address"}],"name":"Paused","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"account","type":"address"}],"name":"Unpaused","type":"event"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"},{"internalType":"bytes32","name":"node","type":"bytes32"},{"internalType":"bytes32","name":"label","type":"bytes32"},{"internalType":"address","name":"_owner","type":"address"}],"name":"claimSubnode","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"clearSubnode","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"},{"internalType":"address","name":"from","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"},{"internalType":"bytes","name":"","type":"bytes"}],"name":"onERC721Received","outputs":[{"internalType":"bytes4","name":"","type":"bytes4"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"pause","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"paused","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"tokenSubnode","outputs":[{"internalType":"bytes32","name":"node","type":"bytes32"},{"internalType":"bytes32","name":"label","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"unpause","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"withdrawDomain","outputs":[],"stateMutability":"nonpayable","type":"function"}]

6101006040523480156200001257600080fd5b506040516200107c3803806200107c8339810160408190526200003591620001a7565b620000403362000080565b6000805460ff60a01b191690556001600160a01b0380851660805283811660a05282811660c052811660e05262000076620000d0565b505050506200020f565b600080546001600160a01b038381166001600160a01b0319831681178455604051919092169283917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e09190a35050565b620000da62000133565b6000805460ff60a01b1916600160a01b1790557f62e78cea01bee320cd4e420270b5ea74000d11b0c9f74754ebdbfc544b05a258620001163390565b6040516001600160a01b03909116815260200160405180910390a1565b62000147600054600160a01b900460ff1690565b156200018c5760405162461bcd60e51b815260206004820152601060248201526f14185d5cd8589b194e881c185d5cd95960821b604482015260640160405180910390fd5b565b6001600160a01b0381168114620001a457600080fd5b50565b60008060008060808587031215620001be57600080fd5b8451620001cb816200018e565b6020860151909450620001de816200018e565b6040860151909350620001f1816200018e565b606086015190925062000204816200018e565b939692955090935050565b60805160a05160c05160e051610e106200026c600039600061067b0152600081816102060152818161031b015261077e015260008181610583015281816106aa0152610b7801526000818161041f01526108f20152610e106000f3fe608060405234801561001057600080fd5b50600436106100c95760003560e01c8063715018a6116100815780638da5cb5b1161005b5780638da5cb5b146101b0578063f2fde38b146101cb578063fee425f8146101de57600080fd5b8063715018a61461018d5780638456cb591461019557806385c97aa11461019d57600080fd5b8063557e1391116100b2578063557e1391146101215780635c975abb1461015d5780636becaa401461017a57600080fd5b8063150b7a02146100ce5780633f4ba83a14610117575b600080fd5b6100e16100dc366004610ca0565b6101f1565b6040517fffffffff0000000000000000000000000000000000000000000000000000000090911681526020015b60405180910390f35b61011f6103e3565b005b61014861012f366004610d3f565b6001602081905260009182526040909120805491015482565b6040805192835260208301919091520161010e565b600054600160a01b900460ff16604051901515815260200161010e565b61011f610188366004610d58565b6103fd565b61011f61070f565b61011f610721565b61011f6101ab366004610d3f565b610739565b6000546040516001600160a01b03909116815260200161010e565b61011f6101d9366004610d99565b610840565b61011f6101ec366004610d3f565b6108d0565b60006101fb6109e4565b336001600160a01b037f000000000000000000000000000000000000000000000000000000000000000016146102785760405162461bcd60e51b815260206004820152600c60248201527f6e6f74206120646f6d61696e000000000000000000000000000000000000000060448201526064015b60405180910390fd5b6000546001600160a01b0316156102e6576000546001600160a01b038681169116146102e65760405162461bcd60e51b815260206004820152601a60248201527f6f6e6c79206f776e6572206d61792061646420646f6d61696e73000000000000604482015260640161026f565b6040517f28ed4f6c000000000000000000000000000000000000000000000000000000008152600481018590523060248201527f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316906328ed4f6c90604401600060405180830381600087803b15801561036757600080fd5b505af115801561037b573d6000803e3d6000fd5b505050507f654196dca222d5e94bf44785bb8c73bb3e1cf4d58ae1764f45f52675bbd01232846040516103b091815260200190565b60405180910390a1507f150b7a020000000000000000000000000000000000000000000000000000000095945050505050565b6103eb610a3e565b6103f3610a98565b6103fb610af1565b565b6040516331a9108f60e11b815260048101859052849033906001600160a01b037f00000000000000000000000000000000000000000000000000000000000000001690636352211e90602401602060405180830381865afa158015610466573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061048a9190610dbd565b6001600160a01b0316146104e05760405162461bcd60e51b815260206004820152601060248201527f6e6f7420746f6b656e20686f6c64657200000000000000000000000000000000604482015260640161026f565b6104e86109e4565b604080516020808201879052818301869052825180830384018152606090920183528151918101919091206000888152600190925291902080541515806105325750600181015415155b156105495761054981600001548260010154610b46565b6040517f02571be3000000000000000000000000000000000000000000000000000000008152600481018390526000906001600160a01b037f000000000000000000000000000000000000000000000000000000000000000016906302571be390602401602060405180830381865afa1580156105ca573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906105ee9190610dbd565b6001600160a01b0316146106445760405162461bcd60e51b815260206004820152601660248201527f7375626e6f646520616c726561647920696e2075736500000000000000000000604482015260640161026f565b858155600181018590556040516305ef2c7f60e41b815260048101879052602481018690526001600160a01b0385811660448301527f000000000000000000000000000000000000000000000000000000000000000081166064830152600060848301527f00000000000000000000000000000000000000000000000000000000000000001690635ef2c7f09060a401600060405180830381600087803b1580156106ee57600080fd5b505af1158015610702573d6000803e3d6000fd5b5050505050505050505050565b610717610a3e565b6103fb6000610be0565b610729610a3e565b6107316109e4565b6103fb610c48565b610741610a3e565b610749610a98565b6040518181527f993b4ca774598049875309a7e031d205e7eaccece6e988f5bf31e2193a833ae99060200160405180910390a17f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03166342842e0e306107be6000546001600160a01b031690565b6040517fffffffff0000000000000000000000000000000000000000000000000000000060e085901b1681526001600160a01b0392831660048201529116602482015260448101849052606401600060405180830381600087803b15801561082557600080fd5b505af1158015610839573d6000803e3d6000fd5b5050505050565b610848610a3e565b6001600160a01b0381166108c45760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201527f6464726573730000000000000000000000000000000000000000000000000000606482015260840161026f565b6108cd81610be0565b50565b6040516331a9108f60e11b815260048101829052819033906001600160a01b037f00000000000000000000000000000000000000000000000000000000000000001690636352211e90602401602060405180830381865afa158015610939573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061095d9190610dbd565b6001600160a01b0316146109b35760405162461bcd60e51b815260206004820152601060248201527f6e6f7420746f6b656e20686f6c64657200000000000000000000000000000000604482015260640161026f565b6109bb6109e4565b60008281526001602081905260408220828155908101829055906109df9080610b46565b505050565b600054600160a01b900460ff16156103fb5760405162461bcd60e51b815260206004820152601060248201527f5061757361626c653a2070617573656400000000000000000000000000000000604482015260640161026f565b6000546001600160a01b031633146103fb5760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604482015260640161026f565b600054600160a01b900460ff166103fb5760405162461bcd60e51b815260206004820152601460248201527f5061757361626c653a206e6f7420706175736564000000000000000000000000604482015260640161026f565b610af9610a98565b6000805460ff60a01b191690557f5db9ee0a495bf2e6ff9c91a7834c1ba4fdd244a5e8aa4e537bd38aeae4b073aa335b6040516001600160a01b03909116815260200160405180910390a1565b6040516305ef2c7f60e41b815260048101839052602481018290526000604482018190526064820181905260848201527f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031690635ef2c7f09060a401600060405180830381600087803b158015610bc457600080fd5b505af1158015610bd8573d6000803e3d6000fd5b505050505050565b600080546001600160a01b038381167fffffffffffffffffffffffff0000000000000000000000000000000000000000831681178455604051919092169283917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e09190a35050565b610c506109e4565b6000805460ff60a01b1916600160a01b1790557f62e78cea01bee320cd4e420270b5ea74000d11b0c9f74754ebdbfc544b05a258610b293390565b6001600160a01b03811681146108cd57600080fd5b600080600080600060808688031215610cb857600080fd5b8535610cc381610c8b565b94506020860135610cd381610c8b565b935060408601359250606086013567ffffffffffffffff80821115610cf757600080fd5b818801915088601f830112610d0b57600080fd5b813581811115610d1a57600080fd5b896020828501011115610d2c57600080fd5b9699959850939650602001949392505050565b600060208284031215610d5157600080fd5b5035919050565b60008060008060808587031215610d6e57600080fd5b8435935060208501359250604085013591506060850135610d8e81610c8b565b939692955090935050565b600060208284031215610dab57600080fd5b8135610db681610c8b565b9392505050565b600060208284031215610dcf57600080fd5b8151610db681610c8b56fea2646970667358221220ca7d62322c0a13abd3cadccb398d34bdc80353ec3383d79c050bbba76f81294264736f6c634300080f00330000000000000000000000008184a482a5038b124d933b779e0ea6e0fb72f54e00000000000000000000000000000000000c2e074ec69a0dfb2997ba6c7d2e1e00000000000000000000000057f1887a8bf19b14fc0df6fd9b2acc9af147ea850000000000000000000000004976fb03c32e5b8cfe2b6ccb31c09ba78ebaba41

Deployed Bytecode

0x608060405234801561001057600080fd5b50600436106100c95760003560e01c8063715018a6116100815780638da5cb5b1161005b5780638da5cb5b146101b0578063f2fde38b146101cb578063fee425f8146101de57600080fd5b8063715018a61461018d5780638456cb591461019557806385c97aa11461019d57600080fd5b8063557e1391116100b2578063557e1391146101215780635c975abb1461015d5780636becaa401461017a57600080fd5b8063150b7a02146100ce5780633f4ba83a14610117575b600080fd5b6100e16100dc366004610ca0565b6101f1565b6040517fffffffff0000000000000000000000000000000000000000000000000000000090911681526020015b60405180910390f35b61011f6103e3565b005b61014861012f366004610d3f565b6001602081905260009182526040909120805491015482565b6040805192835260208301919091520161010e565b600054600160a01b900460ff16604051901515815260200161010e565b61011f610188366004610d58565b6103fd565b61011f61070f565b61011f610721565b61011f6101ab366004610d3f565b610739565b6000546040516001600160a01b03909116815260200161010e565b61011f6101d9366004610d99565b610840565b61011f6101ec366004610d3f565b6108d0565b60006101fb6109e4565b336001600160a01b037f00000000000000000000000057f1887a8bf19b14fc0df6fd9b2acc9af147ea8516146102785760405162461bcd60e51b815260206004820152600c60248201527f6e6f74206120646f6d61696e000000000000000000000000000000000000000060448201526064015b60405180910390fd5b6000546001600160a01b0316156102e6576000546001600160a01b038681169116146102e65760405162461bcd60e51b815260206004820152601a60248201527f6f6e6c79206f776e6572206d61792061646420646f6d61696e73000000000000604482015260640161026f565b6040517f28ed4f6c000000000000000000000000000000000000000000000000000000008152600481018590523060248201527f00000000000000000000000057f1887a8bf19b14fc0df6fd9b2acc9af147ea856001600160a01b0316906328ed4f6c90604401600060405180830381600087803b15801561036757600080fd5b505af115801561037b573d6000803e3d6000fd5b505050507f654196dca222d5e94bf44785bb8c73bb3e1cf4d58ae1764f45f52675bbd01232846040516103b091815260200190565b60405180910390a1507f150b7a020000000000000000000000000000000000000000000000000000000095945050505050565b6103eb610a3e565b6103f3610a98565b6103fb610af1565b565b6040516331a9108f60e11b815260048101859052849033906001600160a01b037f0000000000000000000000008184a482a5038b124d933b779e0ea6e0fb72f54e1690636352211e90602401602060405180830381865afa158015610466573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061048a9190610dbd565b6001600160a01b0316146104e05760405162461bcd60e51b815260206004820152601060248201527f6e6f7420746f6b656e20686f6c64657200000000000000000000000000000000604482015260640161026f565b6104e86109e4565b604080516020808201879052818301869052825180830384018152606090920183528151918101919091206000888152600190925291902080541515806105325750600181015415155b156105495761054981600001548260010154610b46565b6040517f02571be3000000000000000000000000000000000000000000000000000000008152600481018390526000906001600160a01b037f00000000000000000000000000000000000c2e074ec69a0dfb2997ba6c7d2e1e16906302571be390602401602060405180830381865afa1580156105ca573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906105ee9190610dbd565b6001600160a01b0316146106445760405162461bcd60e51b815260206004820152601660248201527f7375626e6f646520616c726561647920696e2075736500000000000000000000604482015260640161026f565b858155600181018590556040516305ef2c7f60e41b815260048101879052602481018690526001600160a01b0385811660448301527f0000000000000000000000004976fb03c32e5b8cfe2b6ccb31c09ba78ebaba4181166064830152600060848301527f00000000000000000000000000000000000c2e074ec69a0dfb2997ba6c7d2e1e1690635ef2c7f09060a401600060405180830381600087803b1580156106ee57600080fd5b505af1158015610702573d6000803e3d6000fd5b5050505050505050505050565b610717610a3e565b6103fb6000610be0565b610729610a3e565b6107316109e4565b6103fb610c48565b610741610a3e565b610749610a98565b6040518181527f993b4ca774598049875309a7e031d205e7eaccece6e988f5bf31e2193a833ae99060200160405180910390a17f00000000000000000000000057f1887a8bf19b14fc0df6fd9b2acc9af147ea856001600160a01b03166342842e0e306107be6000546001600160a01b031690565b6040517fffffffff0000000000000000000000000000000000000000000000000000000060e085901b1681526001600160a01b0392831660048201529116602482015260448101849052606401600060405180830381600087803b15801561082557600080fd5b505af1158015610839573d6000803e3d6000fd5b5050505050565b610848610a3e565b6001600160a01b0381166108c45760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201527f6464726573730000000000000000000000000000000000000000000000000000606482015260840161026f565b6108cd81610be0565b50565b6040516331a9108f60e11b815260048101829052819033906001600160a01b037f0000000000000000000000008184a482a5038b124d933b779e0ea6e0fb72f54e1690636352211e90602401602060405180830381865afa158015610939573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061095d9190610dbd565b6001600160a01b0316146109b35760405162461bcd60e51b815260206004820152601060248201527f6e6f7420746f6b656e20686f6c64657200000000000000000000000000000000604482015260640161026f565b6109bb6109e4565b60008281526001602081905260408220828155908101829055906109df9080610b46565b505050565b600054600160a01b900460ff16156103fb5760405162461bcd60e51b815260206004820152601060248201527f5061757361626c653a2070617573656400000000000000000000000000000000604482015260640161026f565b6000546001600160a01b031633146103fb5760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604482015260640161026f565b600054600160a01b900460ff166103fb5760405162461bcd60e51b815260206004820152601460248201527f5061757361626c653a206e6f7420706175736564000000000000000000000000604482015260640161026f565b610af9610a98565b6000805460ff60a01b191690557f5db9ee0a495bf2e6ff9c91a7834c1ba4fdd244a5e8aa4e537bd38aeae4b073aa335b6040516001600160a01b03909116815260200160405180910390a1565b6040516305ef2c7f60e41b815260048101839052602481018290526000604482018190526064820181905260848201527f00000000000000000000000000000000000c2e074ec69a0dfb2997ba6c7d2e1e6001600160a01b031690635ef2c7f09060a401600060405180830381600087803b158015610bc457600080fd5b505af1158015610bd8573d6000803e3d6000fd5b505050505050565b600080546001600160a01b038381167fffffffffffffffffffffffff0000000000000000000000000000000000000000831681178455604051919092169283917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e09190a35050565b610c506109e4565b6000805460ff60a01b1916600160a01b1790557f62e78cea01bee320cd4e420270b5ea74000d11b0c9f74754ebdbfc544b05a258610b293390565b6001600160a01b03811681146108cd57600080fd5b600080600080600060808688031215610cb857600080fd5b8535610cc381610c8b565b94506020860135610cd381610c8b565b935060408601359250606086013567ffffffffffffffff80821115610cf757600080fd5b818801915088601f830112610d0b57600080fd5b813581811115610d1a57600080fd5b896020828501011115610d2c57600080fd5b9699959850939650602001949392505050565b600060208284031215610d5157600080fd5b5035919050565b60008060008060808587031215610d6e57600080fd5b8435935060208501359250604085013591506060850135610d8e81610c8b565b939692955090935050565b600060208284031215610dab57600080fd5b8135610db681610c8b565b9392505050565b600060208284031215610dcf57600080fd5b8151610db681610c8b56fea2646970667358221220ca7d62322c0a13abd3cadccb398d34bdc80353ec3383d79c050bbba76f81294264736f6c634300080f0033

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

0000000000000000000000008184a482a5038b124d933b779e0ea6e0fb72f54e00000000000000000000000000000000000c2e074ec69a0dfb2997ba6c7d2e1e00000000000000000000000057f1887a8bf19b14fc0df6fd9b2acc9af147ea850000000000000000000000004976fb03c32e5b8cfe2b6ccb31c09ba78ebaba41

-----Decoded View---------------
Arg [0] : _wanderers (address): 0x8184a482A5038B124d933B779E0Ea6e0fb72F54E
Arg [1] : _registry (address): 0x00000000000C2E074eC69A0dFb2997BA6C7d2e1e
Arg [2] : _registrar (address): 0x57f1887a8BF19b14fC0dF6Fd9B2acc9Af147eA85
Arg [3] : _resolver (address): 0x4976fb03C32e5B8cfe2b6cCB31c09Ba78EBaBa41

-----Encoded View---------------
4 Constructor Arguments found :
Arg [0] : 0000000000000000000000008184a482a5038b124d933b779e0ea6e0fb72f54e
Arg [1] : 00000000000000000000000000000000000c2e074ec69a0dfb2997ba6c7d2e1e
Arg [2] : 00000000000000000000000057f1887a8bf19b14fc0df6fd9b2acc9af147ea85
Arg [3] : 0000000000000000000000004976fb03c32e5b8cfe2b6ccb31c09ba78ebaba41


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
[ Download: CSV Export  ]

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.