MATIC Price: $1.01 (-0.39%)
Gas: 56 GWei
 

Overview

MATIC Balance

Polygon PoS Chain LogoPolygon PoS Chain LogoPolygon PoS Chain Logo0 MATIC

MATIC Value

$0.00

Sponsored

Transaction Hash
Method
Block
From
To
Value
Transfer Ownersh...523644112024-01-15 20:06:5473 days ago1705349214IN
0x7d91951D...A7615e79C
0 MATIC0.000870330.40791185
Transfer Ownersh...423277612023-05-05 8:13:26328 days ago1683274406IN
0x7d91951D...A7615e79C
0 MATIC0.00658283230
Initialize348183052022-10-26 9:52:52519 days ago1666777972IN
0x7d91951D...A7615e79C
0 MATIC0.02837688135.82979783
0x60806040348183002022-10-26 9:52:38519 days ago1666777958IN
 Create: OpenNFTsV4
0 MATIC0.24577502130.83258019

Parent Txn Hash Block From To Value
View All Internal Transactions
Loading...
Loading

Contract Source Code Verified (Exact Match)

Contract Name:
OpenNFTsV4

Compiler Version
v0.8.9+commit.e5eed63a

Optimization Enabled:
Yes with 200 runs

Other Settings:
default evmVersion, MIT license

Contract Source Code (Solidity Standard Json-Input format)

File 1 of 15 : OpenNFTsV4.sol
// SPDX-License-Identifier: MIT
//
// Derived from Kredeum NFTs
// https://github.com/Kredeum/kredeum
//
//       ___           ___         ___           ___                    ___           ___                     ___
//      /  /\         /  /\       /  /\         /__/\                  /__/\         /  /\        ___        /  /\
//     /  /::\       /  /::\     /  /:/_        \  \:\                 \  \:\       /  /:/_      /  /\      /  /:/_
//    /  /:/\:\     /  /:/\:\   /  /:/ /\        \  \:\                 \  \:\     /  /:/ /\    /  /:/     /  /:/ /\
//   /  /:/  \:\   /  /:/~/:/  /  /:/ /:/_   _____\__\:\            _____\__\:\   /  /:/ /:/   /  /:/     /  /:/ /::\
//  /__/:/ \__\:\ /__/:/ /:/  /__/:/ /:/ /\ /__/::::::::\          /__/::::::::\ /__/:/ /:/   /  /::\    /__/:/ /:/\:\
//  \  \:\ /  /:/ \  \:\/:/   \  \:\/:/ /:/ \  \:\~~\~~\/          \  \:\~~\~~\/ \  \:\/:/   /__/:/\:\   \  \:\/:/~/:/
//   \  \:\  /:/   \  \::/     \  \::/ /:/   \  \:\  ~~~            \  \:\  ~~~   \  \::/    \__\/  \:\   \  \::/ /:/
//    \  \:\/:/     \  \:\      \  \:\/:/     \  \:\                 \  \:\        \  \:\         \  \:\   \__\/ /:/
//     \  \::/       \  \:\      \  \::/       \  \:\                 \  \:\        \  \:\         \__\/     /__/:/
//      \__\/         \__\/       \__\/         \__\/                  \__\/         \__\/                   \__\/
//
//
//   OpenERC165
//   (supports)
//       |
//       ———————————————————————————————————————————————————
//       |                                    |            |
//   OpenERC721                          OpenERC173  OpenCloneable
//     (NFT)                              (ownable)        |
//       |                                    |            |
//       ——————————————————————————           |            |
//       |                        |           |            |
//  OpenERC721Metadata  OpenERC721Enumerable  |            |
//       |                        |           |            |
//       ———————————————————————————————————————————————————
//       |
//   OpenNFTsV4 —— IOpenNFTsV4
//
pragma solidity ^0.8.9;

import "OpenNFTs/contracts/OpenERC/OpenERC721Metadata.sol";
import "OpenNFTs/contracts/OpenERC/OpenERC721Enumerable.sol";
import "OpenNFTs/contracts/OpenERC/OpenERC173.sol";
import "OpenNFTs/contracts/OpenCloner/OpenCloneable.sol";
import "../interfaces/IOpenNFTsV4.sol";

/// @title OpenNFTs smartcontract
contract OpenNFTsV4 is IOpenNFTsV4, OpenERC721Metadata, OpenERC721Enumerable, OpenERC173, OpenCloneable {
    /// @notice tokenID of next minted NFT
    uint256 public tokenIdNext;

    /// @notice Mint NFT allowed to everyone or only collection owner
    bool public open;

    /// @notice onlyOpenOrOwner, either everybody in open collection,
    /// @notice either only owner in specific collection
    modifier onlyMinter() {
        require(open || (owner() == msg.sender), "Not minter");
        _;
    }

    function mint(string memory tokenURI_) external override(IOpenNFTsV4) returns (uint256 tokenID) {
        tokenID = _mint(msg.sender, tokenURI_);
    }

    function mint(address minter, string memory tokenURI_)
        external
        override(IOpenNFTsV4)
        onlyOwner
        returns (uint256 tokenID)
    {
        tokenID = _mint(minter, tokenURI_);
    }

    /// @notice burn NFT
    /// @param tokenID tokenID of NFT to burn
    function burn(uint256 tokenID) external override(IOpenNFTsV4) onlyTokenOwnerOrApproved(tokenID) {
        _burn(tokenID);
    }

    function initialize(
        string memory name_,
        string memory symbol_,
        address owner_,
        bytes memory params_
    ) public override(OpenCloneable) {
        (bytes memory subparams_, , ) = abi.decode(params_, (bytes, address, uint96));

        (, , , bool[] memory options_) = abi.decode(subparams_, (uint256, address, uint96, bool[]));
        open = options_[0];

        tokenIdNext = 1;

        OpenCloneable._initialize("OpenNFTsV4", 4);
        OpenERC721Metadata._initialize(name_, symbol_);
        OpenERC173._initialize(owner_);
    }

    function supportsInterface(bytes4 interfaceId)
        public
        view
        virtual
        override(OpenERC721Metadata, OpenERC721Enumerable, OpenERC173, OpenCloneable)
        returns (bool)
    {
        return interfaceId == type(IOpenNFTsV4).interfaceId || super.supportsInterface(interfaceId);
    }

    function _mint(address minter, string memory tokenURI) internal returns (uint256 tokenID) {
        tokenID = tokenIdNext++;

        _mint(minter, tokenURI, tokenID);
    }

    function _mint(
        address minter,
        string memory tokenURI,
        uint256 tokenID
    ) internal override(OpenERC721Enumerable, OpenERC721Metadata) {
        super._mint(minter, tokenURI, tokenID);
    }

    function _burn(uint256 tokenID) internal override(OpenERC721Enumerable, OpenERC721Metadata) {
        super._burn(tokenID);
    }

    function _transferFromBefore(
        address from,
        address to,
        uint256 tokenID
    ) internal override(OpenERC721, OpenERC721Enumerable) {
        super._transferFromBefore(from, to, tokenID);
    }
}

File 2 of 15 : OpenCloneable.sol
// SPDX-License-Identifier: MIT
//
// Derived from Kredeum NFTs
// https://github.com/Kredeum/kredeum
//
//       ___           ___         ___           ___              ___           ___                     ___
//      /  /\         /  /\       /  /\         /__/\            /__/\         /  /\        ___        /  /\
//     /  /::\       /  /::\     /  /:/_        \  \:\           \  \:\       /  /:/_      /  /\      /  /:/_
//    /  /:/\:\     /  /:/\:\   /  /:/ /\        \  \:\           \  \:\     /  /:/ /\    /  /:/     /  /:/ /\
//   /  /:/  \:\   /  /:/~/:/  /  /:/ /:/_   _____\__\:\      _____\__\:\   /  /:/ /:/   /  /:/     /  /:/ /::\
//  /__/:/ \__\:\ /__/:/ /:/  /__/:/ /:/ /\ /__/::::::::\    /__/::::::::\ /__/:/ /:/   /  /::\    /__/:/ /:/\:\
//  \  \:\ /  /:/ \  \:\/:/   \  \:\/:/ /:/ \  \:\~~\~~\/    \  \:\~~\~~\/ \  \:\/:/   /__/:/\:\   \  \:\/:/~/:/
//   \  \:\  /:/   \  \::/     \  \::/ /:/   \  \:\  ~~~      \  \:\  ~~~   \  \::/    \__\/  \:\   \  \::/ /:/
//    \  \:\/:/     \  \:\      \  \:\/:/     \  \:\           \  \:\        \  \:\         \  \:\   \__\/ /:/
//     \  \::/       \  \:\      \  \::/       \  \:\           \  \:\        \  \:\         \__\/     /__/:/
//      \__\/         \__\/       \__\/         \__\/            \__\/         \__\/                   \__\/
//
//   OpenERC165
//        |
//  OpenCloneable —— IOpenCloneable
//
pragma solidity 0.8.9;

import "OpenNFTs/contracts/interfaces/IOpenCloneable.sol";
import "OpenNFTs/contracts/OpenERC/OpenERC165.sol";

abstract contract OpenCloneable is IOpenCloneable, OpenERC165 {
    bool public initialized;
    string public template;
    uint256 public version;

    function parent() external view override (IOpenCloneable) returns (address parent_) {
        // eip1167 deployed code = 45 bytes = 10 bytes + 20 bytes address + 15 bytes
        // extract bytes 10 to 30: shift 2 bytes (16 bits) then truncate to address 20 bytes (uint160)
        return (address(this).code.length == 45)
            ? address(uint160(uint256(bytes32(address(this).code)) >> 16))
            : address(0);
    }

    function initialize(
        string memory name,
        string memory symbol,
        address owner,
        bytes memory params
    ) public virtual override (IOpenCloneable);

    function supportsInterface(bytes4 interfaceId)
        public
        view
        virtual
        override (OpenERC165)
        returns (bool)
    {
        return interfaceId == type(IOpenCloneable).interfaceId
            || super.supportsInterface(interfaceId);
    }

    function _initialize(string memory template_, uint256 version_) internal {
        require(initialized == false, "Already initialized");
        initialized = true;

        template = template_;
        version = version_;
    }
}

File 3 of 15 : OpenERC165.sol
// SPDX-License-Identifier: MIT
//
// EIP-165: Standard Interface Detection
// https://eips.ethereum.org/EIPS/eip-165
//
// Derived from OpenZeppelin Contracts (utils/introspection/ERC165.sol)
// https://github.com/OpenZeppelin/openzeppelin-contracts/tree/master/contracts/utils/introspection/ERC165.sol
//
//       ___           ___         ___           ___              ___           ___                     ___
//      /  /\         /  /\       /  /\         /__/\            /__/\         /  /\        ___        /  /\
//     /  /::\       /  /::\     /  /:/_        \  \:\           \  \:\       /  /:/_      /  /\      /  /:/_
//    /  /:/\:\     /  /:/\:\   /  /:/ /\        \  \:\           \  \:\     /  /:/ /\    /  /:/     /  /:/ /\
//   /  /:/  \:\   /  /:/~/:/  /  /:/ /:/_   _____\__\:\      _____\__\:\   /  /:/ /:/   /  /:/     /  /:/ /::\
//  /__/:/ \__\:\ /__/:/ /:/  /__/:/ /:/ /\ /__/::::::::\    /__/::::::::\ /__/:/ /:/   /  /::\    /__/:/ /:/\:\
//  \  \:\ /  /:/ \  \:\/:/   \  \:\/:/ /:/ \  \:\~~\~~\/    \  \:\~~\~~\/ \  \:\/:/   /__/:/\:\   \  \:\/:/~/:/
//   \  \:\  /:/   \  \::/     \  \::/ /:/   \  \:\  ~~~      \  \:\  ~~~   \  \::/    \__\/  \:\   \  \::/ /:/
//    \  \:\/:/     \  \:\      \  \:\/:/     \  \:\           \  \:\        \  \:\         \  \:\   \__\/ /:/
//     \  \::/       \  \:\      \  \::/       \  \:\           \  \:\        \  \:\         \__\/     /__/:/
//      \__\/         \__\/       \__\/         \__\/            \__\/         \__\/                   \__\/
//
//  OpenERC165 —— IERC165
//
pragma solidity 0.8.9;

import "OpenNFTs/contracts/interfaces/IERC165.sol";

abstract contract OpenERC165 is IERC165 {
    function supportsInterface(bytes4 interfaceId) public view virtual returns (bool) {
        return interfaceId == 0x01ffc9a7; //  type(IERC165).interfaceId
    }
}

File 4 of 15 : OpenERC173.sol
// SPDX-License-Identifier: MIT
//
// EIP-173: Contract Ownership Standard
// https://eips.ethereum.org/EIPS/eip-173
//
// Derived from OpenZeppelin Contracts (access/Ownable.sol)
// https://github.com/OpenZeppelin/openzeppelin-contracts/tree/master/contracts/access/Ownable.sol
//
//       ___           ___         ___           ___              ___           ___                     ___
//      /  /\         /  /\       /  /\         /__/\            /__/\         /  /\        ___        /  /\
//     /  /::\       /  /::\     /  /:/_        \  \:\           \  \:\       /  /:/_      /  /\      /  /:/_
//    /  /:/\:\     /  /:/\:\   /  /:/ /\        \  \:\           \  \:\     /  /:/ /\    /  /:/     /  /:/ /\
//   /  /:/  \:\   /  /:/~/:/  /  /:/ /:/_   _____\__\:\      _____\__\:\   /  /:/ /:/   /  /:/     /  /:/ /::\
//  /__/:/ \__\:\ /__/:/ /:/  /__/:/ /:/ /\ /__/::::::::\    /__/::::::::\ /__/:/ /:/   /  /::\    /__/:/ /:/\:\
//  \  \:\ /  /:/ \  \:\/:/   \  \:\/:/ /:/ \  \:\~~\~~\/    \  \:\~~\~~\/ \  \:\/:/   /__/:/\:\   \  \:\/:/~/:/
//   \  \:\  /:/   \  \::/     \  \::/ /:/   \  \:\  ~~~      \  \:\  ~~~   \  \::/    \__\/  \:\   \  \::/ /:/
//    \  \:\/:/     \  \:\      \  \:\/:/     \  \:\           \  \:\        \  \:\         \  \:\   \__\/ /:/
//     \  \::/       \  \:\      \  \::/       \  \:\           \  \:\        \  \:\         \__\/     /__/:/
//      \__\/         \__\/       \__\/         \__\/            \__\/         \__\/                   \__\/
//
//  OpenERC165
//       |
//  OpenERC173 —— IERC173
//
pragma solidity 0.8.9;

import "OpenNFTs/contracts/OpenERC/OpenERC165.sol";
import "OpenNFTs/contracts/interfaces/IERC173.sol";

abstract contract OpenERC173 is IERC173, OpenERC165 {
    bool private _openERC173Initialized;
    address private _owner;

    modifier onlyOwner() {
        require(_owner == msg.sender, "Not owner");
        _;
    }

    function transferOwnership(address newOwner) external override (IERC173) onlyOwner {
        _transferOwnership(newOwner);
    }

    function owner() public view override (IERC173) returns (address) {
        return _owner;
    }

    function supportsInterface(bytes4 interfaceId)
        public
        view
        virtual
        override (OpenERC165)
        returns (bool)
    {
        return interfaceId == 0x7f5828d0 || super.supportsInterface(interfaceId);
    }

    function _initialize(address owner_) internal {
        require(_openERC173Initialized == false, "Already initialized");
        _openERC173Initialized = true;

        _transferOwnership(owner_);
    }

    function _transferOwnership(address newOwner) internal {
        address oldOwner = _owner;
        _owner = newOwner;
        emit OwnershipTransferred(oldOwner, newOwner);
    }
}

File 5 of 15 : OpenERC721.sol
// SPDX-License-Identifier: MIT
//
// EIP-721: Non-Fungible Token Standard
// https://eips.ethereum.org/EIPS/eip-721
//
// Derived from OpenZeppelin Contracts (token/ERC721/ERC721.sol)
// https://github.com/OpenZeppelin/openzeppelin-contracts/tree/master/contracts/token/ERC721/ERC721.sol
//
//       ___           ___         ___           ___              ___           ___                     ___
//      /  /\         /  /\       /  /\         /__/\            /__/\         /  /\        ___        /  /\
//     /  /::\       /  /::\     /  /:/_        \  \:\           \  \:\       /  /:/_      /  /\      /  /:/_
//    /  /:/\:\     /  /:/\:\   /  /:/ /\        \  \:\           \  \:\     /  /:/ /\    /  /:/     /  /:/ /\
//   /  /:/  \:\   /  /:/~/:/  /  /:/ /:/_   _____\__\:\      _____\__\:\   /  /:/ /:/   /  /:/     /  /:/ /::\
//  /__/:/ \__\:\ /__/:/ /:/  /__/:/ /:/ /\ /__/::::::::\    /__/::::::::\ /__/:/ /:/   /  /::\    /__/:/ /:/\:\
//  \  \:\ /  /:/ \  \:\/:/   \  \:\/:/ /:/ \  \:\~~\~~\/    \  \:\~~\~~\/ \  \:\/:/   /__/:/\:\   \  \:\/:/~/:/
//   \  \:\  /:/   \  \::/     \  \::/ /:/   \  \:\  ~~~      \  \:\  ~~~   \  \::/    \__\/  \:\   \  \::/ /:/
//    \  \:\/:/     \  \:\      \  \:\/:/     \  \:\           \  \:\        \  \:\         \  \:\   \__\/ /:/
//     \  \::/       \  \:\      \  \::/       \  \:\           \  \:\        \  \:\         \__\/     /__/:/
//      \__\/         \__\/       \__\/         \__\/            \__\/         \__\/                   \__\/
//
//  OpenERC165
//       |
//  OpenERC721 —— IERC721
//
pragma solidity 0.8.9;

import "OpenNFTs/contracts/OpenERC/OpenERC165.sol";
import "OpenNFTs/contracts/interfaces/IERC721.sol";
import "OpenNFTs/contracts/interfaces/IERC721TokenReceiver.sol";

abstract contract OpenERC721 is IERC721, OpenERC165 {
    // Mapping from token ID to owner address
    mapping(uint256 => address) private _owners;

    // Mapping owner address to token count
    mapping(address => uint256) private _balances;

    // Mapping from token ID to approved address
    mapping(uint256 => address) private _tokenApprovals;

    // Mapping from owner to operator approvals
    mapping(address => mapping(address => bool)) private _operatorApprovals;

    modifier onlyTokenOwnerOrApproved(uint256 tokenID) {
        require(_isOwnerOrApproved(msg.sender, tokenID), "Not token owner nor approved");
        _;
    }

    modifier existsToken(uint256 tokenID) {
        require(_owners[tokenID] != address(0), "Invalid token ID");
        _;
    }

    function transferFrom(address from, address to, uint256 tokenID)
        external
        payable
        override (IERC721)
    {
        _transferFrom(from, to, tokenID);
    }

    function safeTransferFrom(address from, address to, uint256 tokenID, bytes memory data)
        external
        payable
        override (IERC721)
    {
        _safeTransferFrom(from, to, tokenID, data);
    }

    function approve(address spender, uint256 tokenID) public override (IERC721) {
        require(_isOwnerOrOperator(msg.sender, tokenID), "Not token owner nor operator");

        _tokenApprovals[tokenID] = spender;
        emit Approval(ownerOf(tokenID), spender, tokenID);
    }

    function setApprovalForAll(address operator, bool approved) public override (IERC721) {
        _operatorApprovals[msg.sender][operator] = approved;
        emit ApprovalForAll(msg.sender, operator, approved);
    }

    function safeTransferFrom(address from, address to, uint256 tokenID)
        public
        payable
        override (IERC721)
    {
        _safeTransferFrom(from, to, tokenID, "");
    }

    function supportsInterface(bytes4 interfaceId)
        public
        view
        virtual
        override (OpenERC165)
        returns (bool)
    {
        return interfaceId == 0x80ac58cd // = type(IERC721).interfaceId
            || super.supportsInterface(interfaceId);
    }

    function balanceOf(address owner) public view override (IERC721) returns (uint256) {
        require(owner != address(0), "Invalid zero address");
        return _balances[owner];
    }

    function ownerOf(uint256 tokenID)
        public
        view
        override (IERC721)
        existsToken(tokenID)
        returns (address)
    {
        return _owners[tokenID];
    }

    function getApproved(uint256 tokenID)
        public
        view
        override (IERC721)
        existsToken(tokenID)
        returns (address)
    {
        return _tokenApprovals[tokenID];
    }

    function isApprovedForAll(address owner, address operator)
        public
        view
        override (IERC721)
        returns (bool)
    {
        return _operatorApprovals[owner][operator];
    }

    function _mint(address to, string memory, uint256 tokenID) internal virtual {
        require(to != address(0), "Mint to zero address");
        require(_owners[tokenID] == address(0), "Token already minted");

        _balances[to] += 1;
        _owners[tokenID] = to;

        emit Transfer(address(0), to, tokenID);
        require(_isERC721Receiver(address(0), to, tokenID, ""), "Not ERC721Received");
    }

    function _burn(uint256 tokenID) internal virtual {
        address owner = ownerOf(tokenID);
        require(owner != address(0), "Invalid token ID");

        assert(_balances[owner] > 0);

        _balances[owner] -= 1;
        delete _tokenApprovals[tokenID];
        delete _owners[tokenID];

        emit Transfer(owner, address(0), tokenID);
    }

    function _transferFromBefore(address from, address to, uint256 tokenID) internal virtual {}

    function _isOwnerOrOperator(address spender, uint256 tokenID)
        internal
        view
        virtual
        returns (bool ownerOrOperator)
    {
        address tokenOwner = ownerOf(tokenID);
        ownerOrOperator = (tokenOwner == spender || isApprovedForAll(tokenOwner, spender));
    }

    function _safeTransferFrom(address from, address to, uint256 tokenID, bytes memory data)
        private
    {
        _transferFrom(from, to, tokenID);

        require(_isERC721Receiver(from, to, tokenID, data), "Not ERC721Receiver");
    }

    function _transferFrom(address from, address to, uint256 tokenID)
        private
        onlyTokenOwnerOrApproved(tokenID)
    {
        require(from != address(0), "Transfer from zero address");
        require(to != address(0), "Transfer to zero address");
        require(from == ownerOf(tokenID), "From not owner");

        _transferFromBefore(from, to, tokenID);

        delete _tokenApprovals[tokenID];

        if (from != to) {
            _balances[from] -= 1;
            _balances[to] += 1;
            _owners[tokenID] = to;
        }

        emit Transfer(from, to, tokenID);
    }

    function _isERC721Receiver(address from, address to, uint256 tokenID, bytes memory data)
        private
        returns (bool)
    {
        return to.code.length == 0
            || IERC721TokenReceiver(to).onERC721Received(msg.sender, from, tokenID, data)
                == IERC721TokenReceiver.onERC721Received.selector;
    }

    function _isOwnerOrApproved(address spender, uint256 tokenID)
        private
        view
        returns (bool ownerOrApproved)
    {
        ownerOrApproved =
            (_isOwnerOrOperator(spender, tokenID) || (getApproved(tokenID) == spender));
    }
}

File 6 of 15 : OpenERC721Enumerable.sol
// SPDX-License-Identifier: MIT
//
// EIP-721: Non-Fungible Token Standard
// https://eips.ethereum.org/EIPS/eip-721
//
// Derived from OpenZeppelin Contracts (token/ERC721/extensions/ERC721Enumerable.sol)
// https://github.com/OpenZeppelin/openzeppelin-contracts/tree/master/...
// ...contracts/token/ERC721/extensions/ERC721Enumerable.sol
//
//       ___           ___         ___           ___              ___           ___                     ___
//      /  /\         /  /\       /  /\         /__/\            /__/\         /  /\        ___        /  /\
//     /  /::\       /  /::\     /  /:/_        \  \:\           \  \:\       /  /:/_      /  /\      /  /:/_
//    /  /:/\:\     /  /:/\:\   /  /:/ /\        \  \:\           \  \:\     /  /:/ /\    /  /:/     /  /:/ /\
//   /  /:/  \:\   /  /:/~/:/  /  /:/ /:/_   _____\__\:\      _____\__\:\   /  /:/ /:/   /  /:/     /  /:/ /::\
//  /__/:/ \__\:\ /__/:/ /:/  /__/:/ /:/ /\ /__/::::::::\    /__/::::::::\ /__/:/ /:/   /  /::\    /__/:/ /:/\:\
//  \  \:\ /  /:/ \  \:\/:/   \  \:\/:/ /:/ \  \:\~~\~~\/    \  \:\~~\~~\/ \  \:\/:/   /__/:/\:\   \  \:\/:/~/:/
//   \  \:\  /:/   \  \::/     \  \::/ /:/   \  \:\  ~~~      \  \:\  ~~~   \  \::/    \__\/  \:\   \  \::/ /:/
//    \  \:\/:/     \  \:\      \  \:\/:/     \  \:\           \  \:\        \  \:\         \  \:\   \__\/ /:/
//     \  \::/       \  \:\      \  \::/       \  \:\           \  \:\        \  \:\         \__\/     /__/:/
//      \__\/         \__\/       \__\/         \__\/            \__\/         \__\/                   \__\/
//
//      OpenERC165
//           |
//      OpenERC721
//           |
//  OpenERC721Enumerable —— IERC721Enumerable
//
pragma solidity 0.8.9;

import "OpenNFTs/contracts/OpenERC/OpenERC721.sol";
import "OpenNFTs/contracts/interfaces/IERC721Enumerable.sol";

abstract contract OpenERC721Enumerable is IERC721Enumerable, OpenERC721 {
    // Array of all tokens ID
    uint256[] private _allTokens;

    // Mapping from owner to list of token IDs owned
    // mapping(address => mapping(uint256 => uint256)) private _ownedTokens;
    mapping(address => uint256[]) private _ownedTokens;

    // Mapping from token ID to owned index
    mapping(uint256 => uint256) private _ownedTokensIndex;

    // Mapping from token ID to all index
    mapping(uint256 => uint256) private _allTokensIndex;

    function tokenOfOwnerByIndex(address owner, uint256 index)
        external
        view
        override (IERC721Enumerable)
        returns (uint256)
    {
        require(index < OpenERC721.balanceOf(owner), "Invalid index!");
        return _ownedTokens[owner][index];
    }

    function totalSupply() external view override (IERC721Enumerable) returns (uint256) {
        return _allTokens.length;
    }

    function tokenByIndex(uint256 index)
        external
        view
        override (IERC721Enumerable)
        returns (uint256)
    {
        require(index < _allTokens.length, "Invalid index!");
        return _allTokens[index];
    }

    function supportsInterface(bytes4 interfaceId)
        public
        view
        virtual
        override (OpenERC721)
        returns (bool)
    {
        return interfaceId == 0x780e9d63 || super.supportsInterface(interfaceId);
    }

    function _mint(address to, string memory tokenURI, uint256 tokenID)
        internal
        virtual
        override (OpenERC721)
    {
        _addOwnedToken(to, tokenID);

        _allTokensIndex[tokenID] = _allTokens.length;
        _allTokens.push(tokenID);

        super._mint(to, tokenURI, tokenID);
    }

    function _burn(uint256 tokenID) internal virtual override (OpenERC721) {
        address from = ownerOf(tokenID);

        _removeOwnedToken(from, tokenID);

        uint256 allBurnIndex = _allTokensIndex[tokenID];
        uint256 allLastIndex = _allTokens.length - 1;
        uint256 allLastTokenId = _allTokens[allLastIndex];

        _allTokensIndex[allLastTokenId] = allBurnIndex;
        delete _allTokensIndex[tokenID];

        _allTokens[allBurnIndex] = allLastTokenId;
        _allTokens.pop();

        super._burn(tokenID);
    }

    function _transferFromBefore(address from, address to, uint256 tokenID)
        internal
        virtual
        override (OpenERC721)
    {
        _removeOwnedToken(from, tokenID);
        _addOwnedToken(to, tokenID);

        super._transferFromBefore(from, to, tokenID);
    }

    function _addOwnedToken(address owner, uint256 tokenID) private {
        _ownedTokensIndex[tokenID] = _ownedTokens[owner].length;
        _ownedTokens[owner].push(tokenID);
    }

    function _removeOwnedToken(address owner, uint256 tokenID) private {
        uint256 burnIndex = _ownedTokensIndex[tokenID];
        uint256 lastIndex = OpenERC721.balanceOf(owner) - 1;

        if (burnIndex != lastIndex) {
            uint256 lastTokenId = _ownedTokens[owner][lastIndex];
            _ownedTokens[owner][burnIndex] = lastTokenId;
            _ownedTokensIndex[lastTokenId] = burnIndex;
        }

        delete _ownedTokensIndex[tokenID];
        _ownedTokens[owner].pop();
    }
}

File 7 of 15 : OpenERC721Metadata.sol
// SPDX-License-Identifier: MIT
//
// EIP-721: Non-Fungible Token Standard
// https://eips.ethereum.org/EIPS/eip-721
//
// Derived from OpenZeppelin Contracts (token/ERC721/ERC721.sol)
// https://github.com/OpenZeppelin/openzeppelin-contracts/tree/master/contracts/token/ERC721/ERC721.sol
//
//       ___           ___         ___           ___              ___           ___                     ___
//      /  /\         /  /\       /  /\         /__/\            /__/\         /  /\        ___        /  /\
//     /  /::\       /  /::\     /  /:/_        \  \:\           \  \:\       /  /:/_      /  /\      /  /:/_
//    /  /:/\:\     /  /:/\:\   /  /:/ /\        \  \:\           \  \:\     /  /:/ /\    /  /:/     /  /:/ /\
//   /  /:/  \:\   /  /:/~/:/  /  /:/ /:/_   _____\__\:\      _____\__\:\   /  /:/ /:/   /  /:/     /  /:/ /::\
//  /__/:/ \__\:\ /__/:/ /:/  /__/:/ /:/ /\ /__/::::::::\    /__/::::::::\ /__/:/ /:/   /  /::\    /__/:/ /:/\:\
//  \  \:\ /  /:/ \  \:\/:/   \  \:\/:/ /:/ \  \:\~~\~~\/    \  \:\~~\~~\/ \  \:\/:/   /__/:/\:\   \  \:\/:/~/:/
//   \  \:\  /:/   \  \::/     \  \::/ /:/   \  \:\  ~~~      \  \:\  ~~~   \  \::/    \__\/  \:\   \  \::/ /:/
//    \  \:\/:/     \  \:\      \  \:\/:/     \  \:\           \  \:\        \  \:\         \  \:\   \__\/ /:/
//     \  \::/       \  \:\      \  \::/       \  \:\           \  \:\        \  \:\         \__\/     /__/:/
//      \__\/         \__\/       \__\/         \__\/            \__\/         \__\/                   \__\/
//
//     OpenERC165
//          |
//     OpenERC721
//          |
//  OpenERC721Metadata —— IERC721Metadata
//
pragma solidity 0.8.9;

import "OpenNFTs/contracts/OpenERC/OpenERC721.sol";
import "OpenNFTs/contracts/interfaces/IERC721Metadata.sol";

abstract contract OpenERC721Metadata is IERC721Metadata, OpenERC721 {
    bool private _openERC721MetadataInitialized;
    string private _name;
    string private _symbol;
    mapping(uint256 => string) private _tokenURIs;

    function name() external view virtual override (IERC721Metadata) returns (string memory) {
        return _name;
    }

    function symbol() external view virtual override (IERC721Metadata) returns (string memory) {
        return _symbol;
    }

    function tokenURI(uint256 tokenID)
        external
        view
        virtual
        override (IERC721Metadata)
        existsToken(tokenID)
        returns (string memory)
    {
        return _tokenURIs[tokenID];
    }

    function supportsInterface(bytes4 interfaceId)
        public
        view
        virtual
        override (OpenERC721)
        returns (bool)
    {
        return interfaceId == 0x5b5e139f || super.supportsInterface(interfaceId);
    }

    function _initialize(string memory name_, string memory symbol_) internal {
        require(_openERC721MetadataInitialized == false, "Already initialized");
        _openERC721MetadataInitialized = true;

        _name = name_;
        _symbol = symbol_;
    }

    function _mint(address to, string memory newTokenURI, uint256 tokenID)
        internal
        virtual
        override (OpenERC721)
    {
        _tokenURIs[tokenID] = newTokenURI;

        super._mint(to, newTokenURI, tokenID);
    }

    function _burn(uint256 tokenID) internal virtual override (OpenERC721) {
        delete _tokenURIs[tokenID];

        super._burn(tokenID);
    }
}

File 8 of 15 : IERC165.sol
// SPDX-License-Identifier: MIT
pragma solidity 0.8.9;

interface IERC165 {
    function supportsInterface(bytes4 interfaceId) external view returns (bool);
}

File 9 of 15 : IERC173.sol
// SPDX-License-Identifier: MIT
pragma solidity 0.8.9;

interface IERC173 {
    event OwnershipTransferred(address indexed previousOwner, address indexed newOwner);

    function transferOwnership(address newOwner) external;

    function owner() external view returns (address currentOwner);
}

File 10 of 15 : IERC721.sol
// SPDX-License-Identifier: MIT
pragma solidity 0.8.9;

interface IERC721 {
    event Transfer(address indexed from, address indexed to, uint256 indexed tokenId);
    event Approval(address indexed owner, address indexed approved, uint256 indexed tokenId);
    event ApprovalForAll(address indexed owner, address indexed operator, bool approved);

    function safeTransferFrom(address from, address to, uint256 tokenId, bytes calldata data)
        external
        payable;

    function safeTransferFrom(address from, address to, uint256 tokenId) external payable;

    function transferFrom(address from, address to, uint256 tokenId) external payable;

    function approve(address to, uint256 tokenId) external;

    function setApprovalForAll(address operator, bool approved) external;

    function balanceOf(address owner) external view returns (uint256 balance);

    function ownerOf(uint256 tokenId) external view returns (address owner);

    function getApproved(uint256 tokenId) external view returns (address operator);

    function isApprovedForAll(address owner, address operator) external view returns (bool);
}

File 11 of 15 : IERC721Enumerable.sol
// SPDX-License-Identifier: MIT
pragma solidity 0.8.9;

interface IERC721Enumerable {
    function totalSupply() external view returns (uint256);

    function tokenOfOwnerByIndex(address owner, uint256 index) external view returns (uint256);

    function tokenByIndex(uint256 index) external view returns (uint256);
}

File 12 of 15 : IERC721Metadata.sol
// SPDX-License-Identifier: MIT
pragma solidity 0.8.9;

interface IERC721Metadata {
    function name() external view returns (string memory);

    function symbol() external view returns (string memory);

    function tokenURI(uint256 tokenId) external view returns (string memory);
}

File 13 of 15 : IERC721TokenReceiver.sol
// SPDX-License-Identifier: MIT
pragma solidity 0.8.9;

interface IERC721TokenReceiver {
    function onERC721Received(address operator, address from, uint256 tokenId, bytes calldata data)
        external
        returns (bytes4);
}

File 14 of 15 : IOpenCloneable.sol
// SPDX-License-Identifier: MIT
pragma solidity 0.8.9;

interface IOpenCloneable {
    function initialize(
        string memory name,
        string memory symbol,
        address owner,
        bytes memory params
    ) external;

    function initialized() external view returns (bool);

    function template() external view returns (string memory);

    function version() external view returns (uint256);

    function parent() external view returns (address);
}

File 15 of 15 : IOpenNFTsV4.sol
// SPDX-License-Identifier: MIT
pragma solidity 0.8.9;

interface IOpenNFTsV4 {
    function mint(string memory tokenURI) external returns (uint256 tokenID);

    function mint(address minter, string memory tokenURI) external returns (uint256 tokenID);

    function burn(uint256 tokenID) external;

    function open() external view returns (bool);
}

Settings
{
  "evmVersion": "london",
  "libraries": {},
  "metadata": {
    "bytecodeHash": "ipfs",
    "useLiteralContent": true
  },
  "optimizer": {
    "enabled": true,
    "runs": 200
  },
  "remappings": [],
  "outputSelection": {
    "*": {
      "*": [
        "evm.bytecode",
        "evm.deployedBytecode",
        "devdoc",
        "userdoc",
        "metadata",
        "abi"
      ]
    }
  }
}

Contract Security Audit

Contract ABI

[{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"approved","type":"address"},{"indexed":true,"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"Approval","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"operator","type":"address"},{"indexed":false,"internalType":"bool","name":"approved","type":"bool"}],"name":"ApprovalForAll","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":true,"internalType":"address","name":"from","type":"address"},{"indexed":true,"internalType":"address","name":"to","type":"address"},{"indexed":true,"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"Transfer","type":"event"},{"inputs":[{"internalType":"address","name":"spender","type":"address"},{"internalType":"uint256","name":"tokenID","type":"uint256"}],"name":"approve","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"}],"name":"balanceOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenID","type":"uint256"}],"name":"burn","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenID","type":"uint256"}],"name":"getApproved","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"string","name":"name_","type":"string"},{"internalType":"string","name":"symbol_","type":"string"},{"internalType":"address","name":"owner_","type":"address"},{"internalType":"bytes","name":"params_","type":"bytes"}],"name":"initialize","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"initialized","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"address","name":"operator","type":"address"}],"name":"isApprovedForAll","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"minter","type":"address"},{"internalType":"string","name":"tokenURI_","type":"string"}],"name":"mint","outputs":[{"internalType":"uint256","name":"tokenID","type":"uint256"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string","name":"tokenURI_","type":"string"}],"name":"mint","outputs":[{"internalType":"uint256","name":"tokenID","type":"uint256"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"name","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"open","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenID","type":"uint256"}],"name":"ownerOf","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"parent","outputs":[{"internalType":"address","name":"parent_","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenID","type":"uint256"}],"name":"safeTransferFrom","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenID","type":"uint256"},{"internalType":"bytes","name":"data","type":"bytes"}],"name":"safeTransferFrom","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"address","name":"operator","type":"address"},{"internalType":"bool","name":"approved","type":"bool"}],"name":"setApprovalForAll","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes4","name":"interfaceId","type":"bytes4"}],"name":"supportsInterface","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"symbol","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"template","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"index","type":"uint256"}],"name":"tokenByIndex","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"tokenIdNext","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"uint256","name":"index","type":"uint256"}],"name":"tokenOfOwnerByIndex","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenID","type":"uint256"}],"name":"tokenURI","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenID","type":"uint256"}],"name":"transferFrom","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"address","name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"version","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"}]

608060405234801561001057600080fd5b50612107806100206000396000f3fe6080604052600436106101b75760003560e01c80636352211e116100ec578063b88d4fde1161008a578063d85d3d2711610064578063d85d3d2714610494578063e985e9c5146104b4578063f2fde38b146104fd578063fcfff16f1461051d57600080fd5b8063b88d4fde14610441578063c87b56dd14610454578063d0def5211461047457600080fd5b80638bbf58b3116100c65780638bbf58b3146103d35780638da5cb5b146103e957806395d89b411461040c578063a22cb4651461042157600080fd5b80636352211e1461037e5780636f2ddd931461039e57806370a08231146103b357600080fd5b806323b872dd1161015957806342966c681161013357806342966c68146103135780634f6ccce71461033357806354fd4d501461035357806360f96a8f1461036957600080fd5b806323b872dd146102cd5780632f745c59146102e057806342842e0e1461030057600080fd5b8063095ea7b311610195578063095ea7b31461024b578063158ef93e1461026d57806318160ddd1461028e5780631eb40e21146102ad57600080fd5b806301ffc9a7146101bc57806306fdde03146101f1578063081812fc14610213575b600080fd5b3480156101c857600080fd5b506101dc6101d736600461198d565b610537565b60405190151581526020015b60405180910390f35b3480156101fd57600080fd5b50610206610562565b6040516101e89190611a02565b34801561021f57600080fd5b5061023361022e366004611a15565b6105f4565b6040516001600160a01b0390911681526020016101e8565b34801561025757600080fd5b5061026b610266366004611a43565b610654565b005b34801561027957600080fd5b50600c546101dc90600160a81b900460ff1681565b34801561029a57600080fd5b506008545b6040519081526020016101e8565b3480156102b957600080fd5b5061026b6102c8366004611b34565b610718565b61026b6102db366004611bd1565b6107d1565b3480156102ec57600080fd5b5061029f6102fb366004611a43565b6107e1565b61026b61030e366004611bd1565b610868565b34801561031f57600080fd5b5061026b61032e366004611a15565b610883565b34801561033f57600080fd5b5061029f61034e366004611a15565b6108e7565b34801561035f57600080fd5b5061029f600e5481565b34801561037557600080fd5b50610233610951565b34801561038a57600080fd5b50610233610399366004611a15565b61099a565b3480156103aa57600080fd5b506102066109ed565b3480156103bf57600080fd5b5061029f6103ce366004611c12565b610a7b565b3480156103df57600080fd5b5061029f600f5481565b3480156103f557600080fd5b50600c5461010090046001600160a01b0316610233565b34801561041857600080fd5b50610206610ae6565b34801561042d57600080fd5b5061026b61043c366004611c3d565b610af5565b61026b61044f366004611c76565b610b61565b34801561046057600080fd5b5061020661046f366004611a15565b610b73565b34801561048057600080fd5b5061029f61048f366004611cd6565b610c4b565b3480156104a057600080fd5b5061029f6104af366004611d26565b610caa565b3480156104c057600080fd5b506101dc6104cf366004611d5b565b6001600160a01b03918216600090815260036020908152604080832093909416825291909152205460ff1690565b34801561050957600080fd5b5061026b610518366004611c12565b610cb6565b34801561052957600080fd5b506010546101dc9060ff1681565b60006001600160e01b0319821663b6ea550160e01b148061055c575061055c82610d0d565b92915050565b60606005805461057190611d89565b80601f016020809104026020016040519081016040528092919081815260200182805461059d90611d89565b80156105ea5780601f106105bf576101008083540402835291602001916105ea565b820191906000526020600020905b8154815290600101906020018083116105cd57829003601f168201915b5050505050905090565b60008181526020819052604081205482906001600160a01b03166106335760405162461bcd60e51b815260040161062a90611dbe565b60405180910390fd5b6000838152600260205260409020546001600160a01b031691505b50919050565b61065e3382610d32565b6106aa5760405162461bcd60e51b815260206004820152601c60248201527f4e6f7420746f6b656e206f776e6572206e6f72206f70657261746f7200000000604482015260640161062a565b600081815260026020526040902080546001600160a01b0319166001600160a01b03841690811790915581906106df8261099a565b6001600160a01b03167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a45050565b60008180602001905181019061072e9190611e09565b505090506000818060200190518101906107489190611ea5565b93505050508060008151811061076057610760611f84565b6020026020010151601060006101000a81548160ff0219169083151502179055506001600f819055506107b66040518060400160405280600a81526020016913dc195b9391951cd58d60b21b8152506004610d8d565b6107c08686610de4565b6107c984610e3b565b505050505050565b6107dc838383610e74565b505050565b60006107ec83610a7b565b821061082b5760405162461bcd60e51b815260206004820152600e60248201526d496e76616c696420696e6465782160901b604482015260640161062a565b6001600160a01b038316600090815260096020526040902080548390811061085557610855611f84565b9060005260206000200154905092915050565b6107dc838383604051806020016040528060008152506110da565b8061088e3382611132565b6108da5760405162461bcd60e51b815260206004820152601c60248201527f4e6f7420746f6b656e206f776e6572206e6f7220617070726f76656400000000604482015260640161062a565b6108e382611168565b5050565b600854600090821061092c5760405162461bcd60e51b815260206004820152600e60248201526d496e76616c696420696e6465782160901b604482015260640161062a565b6008828154811061093f5761093f611f84565b90600052602060002001549050919050565b6000602d303b146109625750600090565b6010306001600160a01b0316803b806020016040519081016040528181526000908060200190933c61099390611f9a565b901c905090565b60008181526020819052604081205482906001600160a01b03166109d05760405162461bcd60e51b815260040161062a90611dbe565b50506000908152602081905260409020546001600160a01b031690565b600d80546109fa90611d89565b80601f0160208091040260200160405190810160405280929190818152602001828054610a2690611d89565b8015610a735780601f10610a4857610100808354040283529160200191610a73565b820191906000526020600020905b815481529060010190602001808311610a5657829003601f168201915b505050505081565b60006001600160a01b038216610aca5760405162461bcd60e51b8152602060048201526014602482015273496e76616c6964207a65726f206164647265737360601b604482015260640161062a565b506001600160a01b031660009081526001602052604090205490565b60606006805461057190611d89565b3360008181526003602090815260408083206001600160a01b03871680855290835292819020805460ff191686151590811790915590519081529192917f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31910160405180910390a35050565b610b6d848484846110da565b50505050565b60008181526020819052604090205460609082906001600160a01b0316610bac5760405162461bcd60e51b815260040161062a90611dbe565b60008381526007602052604090208054610bc590611d89565b80601f0160208091040260200160405190810160405280929190818152602001828054610bf190611d89565b8015610c3e5780601f10610c1357610100808354040283529160200191610c3e565b820191906000526020600020905b815481529060010190602001808311610c2157829003601f168201915b5050505050915050919050565b600c5460009061010090046001600160a01b03163314610c995760405162461bcd60e51b81526020600482015260096024820152682737ba1037bbb732b960b91b604482015260640161062a565b610ca38383611171565b9392505050565b600061055c3383611171565b600c5461010090046001600160a01b03163314610d015760405162461bcd60e51b81526020600482015260096024820152682737ba1037bbb732b960b91b604482015260640161062a565b610d0a81611193565b50565b60006001600160e01b031982166350130d5360e01b148061055c575061055c826111ed565b600080610d3e8361099a565b9050836001600160a01b0316816001600160a01b03161480610d8557506001600160a01b0380821660009081526003602090815260408083209388168352929052205460ff165b949350505050565b600c54600160a81b900460ff1615610db75760405162461bcd60e51b815260040161062a90611fbe565b600c805460ff60a81b1916600160a81b1790558151610ddd90600d9060208501906118a8565b50600e5550565b60045460ff1615610e075760405162461bcd60e51b815260040161062a90611fbe565b6004805460ff191660011790558151610e279060059060208501906118a8565b5080516107dc9060069060208401906118a8565b600c5460ff1615610e5e5760405162461bcd60e51b815260040161062a90611fbe565b600c805460ff19166001179055610d0a81611193565b80610e7f3382611132565b610ecb5760405162461bcd60e51b815260206004820152601c60248201527f4e6f7420746f6b656e206f776e6572206e6f7220617070726f76656400000000604482015260640161062a565b6001600160a01b038416610f215760405162461bcd60e51b815260206004820152601a60248201527f5472616e736665722066726f6d207a65726f2061646472657373000000000000604482015260640161062a565b6001600160a01b038316610f775760405162461bcd60e51b815260206004820152601860248201527f5472616e7366657220746f207a65726f20616464726573730000000000000000604482015260640161062a565b610f808261099a565b6001600160a01b0316846001600160a01b031614610fd15760405162461bcd60e51b815260206004820152600e60248201526d233937b6903737ba1037bbb732b960911b604482015260640161062a565b610fdc848484611212565b600082815260026020526040902080546001600160a01b03191690556001600160a01b0384811690841614611093576001600160a01b03841660009081526001602081905260408220805491929091611036908490612001565b90915550506001600160a01b03831660009081526001602081905260408220805491929091611066908490612018565b9091555050600082815260208190526040902080546001600160a01b0319166001600160a01b0385161790555b81836001600160a01b0316856001600160a01b03167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a450505050565b6110e5848484610e74565b6110f18484848461121d565b610b6d5760405162461bcd60e51b81526020600482015260126024820152712737ba1022a9219b9918a932b1b2b4bb32b960711b604482015260640161062a565b600061113e8383610d32565b80610ca35750826001600160a01b0316611157836105f4565b6001600160a01b0316149392505050565b610d0a816112cc565b600f80546000918261118283612030565b91905055905061055c83838361139e565b600c80546001600160a01b03838116610100818102610100600160a81b031985161790945560405193909204169182907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a35050565b60006307f5828d60e41b6001600160e01b03198316148061055c575061055c826113a9565b6107dc8383836113ce565b60006001600160a01b0384163b15806112c35750604051630a85bd0160e11b808252906001600160a01b0386169063150b7a02906112659033908a908990899060040161204b565b602060405180830381600087803b15801561127f57600080fd5b505af1158015611293573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906112b79190612088565b6001600160e01b031916145b95945050505050565b60006112d78261099a565b90506112e381836113e2565b6000828152600b602052604081205460085490919061130490600190612001565b905060006008828154811061131b5761131b611f84565b6000918252602080832090910154808352600b90915260408083208690558783528220919091556008805491925082918590811061135b5761135b611f84565b6000918252602090912001556008805480611378576113786120a5565b60019003818190600052602060002001600090559055611397856114f0565b5050505050565b6107dc838383611510565b600063780e9d6360e01b6001600160e01b03198316148061055c575061055c82611569565b6113d883826113e2565b6107dc828261158e565b6000818152600a60205260408120549060016113fd85610a7b565b6114079190612001565b905080821461149e576001600160a01b038416600090815260096020526040812080548390811061143a5761143a611f84565b906000526020600020015490508060096000876001600160a01b03166001600160a01b03168152602001908152602001600020848154811061147e5761147e611f84565b6000918252602080832090910192909255918252600a9052604090208290555b6000838152600a602090815260408083208390556001600160a01b0387168352600990915290208054806114d4576114d46120a5565b6001900381819060005260206000200160009055905550505050565b60008181526007602052604081206115079161192c565b610d0a816115cc565b61151a838261158e565b600880546000838152600b60205260408120829055600182018355919091527ff3f7a9fe364faab93b216da50a3214154f22a0a2b415b23a84c8169e8b636ee3018190556107dc8383836116bd565b6000635b5e139f60e01b6001600160e01b03198316148061055c575061055c826116e8565b6001600160a01b0390911660009081526009602081815260408084208054868652600a84529185208290559282526001810183559183529091200155565b60006115d78261099a565b90506001600160a01b0381166115ff5760405162461bcd60e51b815260040161062a90611dbe565b6001600160a01b038116600090815260016020526040902054611624576116246120bb565b6001600160a01b0381166000908152600160208190526040822080549192909161164f908490612001565b9091555050600082815260026020908152604080832080546001600160a01b0319908116909155918390528083208054909216909155518391906001600160a01b038416907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef908390a45050565b600081815260076020908152604090912083516116dc928501906118a8565b506107dc83838361171d565b60006380ac58cd60e01b6001600160e01b03198316148061055c57506001600160e01b031982166301ffc9a760e01b1461055c565b6001600160a01b03831661176a5760405162461bcd60e51b81526020600482015260146024820152734d696e7420746f207a65726f206164647265737360601b604482015260640161062a565b6000818152602081905260409020546001600160a01b0316156117c65760405162461bcd60e51b8152602060048201526014602482015273151bdad95b88185b1c9958591e481b5a5b9d195960621b604482015260640161062a565b6001600160a01b038316600090815260016020819052604082208054919290916117f1908490612018565b909155505060008181526020819052604080822080546001600160a01b0319166001600160a01b03871690811790915590518392907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef908290a4611867600084836040518060200160405280600081525061121d565b6107dc5760405162461bcd60e51b8152602060048201526012602482015271139bdd08115490cdcc8c549958d95a5d995960721b604482015260640161062a565b8280546118b490611d89565b90600052602060002090601f0160209004810192826118d6576000855561191c565b82601f106118ef57805160ff191683800117855561191c565b8280016001018555821561191c579182015b8281111561191c578251825591602001919060010190611901565b50611928929150611962565b5090565b50805461193890611d89565b6000825580601f10611948575050565b601f016020900490600052602060002090810190610d0a91905b5b808211156119285760008155600101611963565b6001600160e01b031981168114610d0a57600080fd5b60006020828403121561199f57600080fd5b8135610ca381611977565b60005b838110156119c55781810151838201526020016119ad565b83811115610b6d5750506000910152565b600081518084526119ee8160208601602086016119aa565b601f01601f19169290920160200192915050565b602081526000610ca360208301846119d6565b600060208284031215611a2757600080fd5b5035919050565b6001600160a01b0381168114610d0a57600080fd5b60008060408385031215611a5657600080fd5b8235611a6181611a2e565b946020939093013593505050565b634e487b7160e01b600052604160045260246000fd5b604051601f8201601f1916810167ffffffffffffffff81118282101715611aae57611aae611a6f565b604052919050565b600067ffffffffffffffff821115611ad057611ad0611a6f565b50601f01601f191660200190565b600082601f830112611aef57600080fd5b8135611b02611afd82611ab6565b611a85565b818152846020838601011115611b1757600080fd5b816020850160208301376000918101602001919091529392505050565b60008060008060808587031215611b4a57600080fd5b843567ffffffffffffffff80821115611b6257600080fd5b611b6e88838901611ade565b95506020870135915080821115611b8457600080fd5b611b9088838901611ade565b945060408701359150611ba282611a2e565b90925060608601359080821115611bb857600080fd5b50611bc587828801611ade565b91505092959194509250565b600080600060608486031215611be657600080fd5b8335611bf181611a2e565b92506020840135611c0181611a2e565b929592945050506040919091013590565b600060208284031215611c2457600080fd5b8135610ca381611a2e565b8015158114610d0a57600080fd5b60008060408385031215611c5057600080fd5b8235611c5b81611a2e565b91506020830135611c6b81611c2f565b809150509250929050565b60008060008060808587031215611c8c57600080fd5b8435611c9781611a2e565b93506020850135611ca781611a2e565b925060408501359150606085013567ffffffffffffffff811115611cca57600080fd5b611bc587828801611ade565b60008060408385031215611ce957600080fd5b8235611cf481611a2e565b9150602083013567ffffffffffffffff811115611d1057600080fd5b611d1c85828601611ade565b9150509250929050565b600060208284031215611d3857600080fd5b813567ffffffffffffffff811115611d4f57600080fd5b610d8584828501611ade565b60008060408385031215611d6e57600080fd5b8235611d7981611a2e565b91506020830135611c6b81611a2e565b600181811c90821680611d9d57607f821691505b6020821081141561064e57634e487b7160e01b600052602260045260246000fd5b60208082526010908201526f125b9d985b1a59081d1bdad95b88125160821b604082015260600190565b80516bffffffffffffffffffffffff81168114611e0457600080fd5b919050565b600080600060608486031215611e1e57600080fd5b835167ffffffffffffffff811115611e3557600080fd5b8401601f81018613611e4657600080fd5b8051611e54611afd82611ab6565b818152876020838501011115611e6957600080fd5b611e7a8260208301602086016119aa565b8095505050506020840151611e8e81611a2e565b9150611e9c60408501611de8565b90509250925092565b60008060008060808587031215611ebb57600080fd5b84519350602080860151611ece81611a2e565b9350611edc60408701611de8565b9250606086015167ffffffffffffffff80821115611ef957600080fd5b818801915088601f830112611f0d57600080fd5b815181811115611f1f57611f1f611a6f565b8060051b9150611f30848301611a85565b818152918301840191848101908b841115611f4a57600080fd5b938501935b83851015611f745784519250611f6483611c2f565b8282529385019390850190611f4f565b989b979a50959850505050505050565b634e487b7160e01b600052603260045260246000fd5b8051602080830151919081101561064e5760001960209190910360031b1b16919050565b602080825260139082015272105b1c9958591e481a5b9a5d1a585b1a5e9959606a1b604082015260600190565b634e487b7160e01b600052601160045260246000fd5b60008282101561201357612013611feb565b500390565b6000821982111561202b5761202b611feb565b500190565b600060001982141561204457612044611feb565b5060010190565b6001600160a01b038581168252841660208201526040810183905260806060820181905260009061207e908301846119d6565b9695505050505050565b60006020828403121561209a57600080fd5b8151610ca381611977565b634e487b7160e01b600052603160045260246000fd5b634e487b7160e01b600052600160045260246000fdfea26469706673582212200f15a8cb97434c5de5fe4bf96a9247db71c1a670d48b0831dc0211aec772ab2964736f6c63430008090033

Deployed Bytecode

0x6080604052600436106101b75760003560e01c80636352211e116100ec578063b88d4fde1161008a578063d85d3d2711610064578063d85d3d2714610494578063e985e9c5146104b4578063f2fde38b146104fd578063fcfff16f1461051d57600080fd5b8063b88d4fde14610441578063c87b56dd14610454578063d0def5211461047457600080fd5b80638bbf58b3116100c65780638bbf58b3146103d35780638da5cb5b146103e957806395d89b411461040c578063a22cb4651461042157600080fd5b80636352211e1461037e5780636f2ddd931461039e57806370a08231146103b357600080fd5b806323b872dd1161015957806342966c681161013357806342966c68146103135780634f6ccce71461033357806354fd4d501461035357806360f96a8f1461036957600080fd5b806323b872dd146102cd5780632f745c59146102e057806342842e0e1461030057600080fd5b8063095ea7b311610195578063095ea7b31461024b578063158ef93e1461026d57806318160ddd1461028e5780631eb40e21146102ad57600080fd5b806301ffc9a7146101bc57806306fdde03146101f1578063081812fc14610213575b600080fd5b3480156101c857600080fd5b506101dc6101d736600461198d565b610537565b60405190151581526020015b60405180910390f35b3480156101fd57600080fd5b50610206610562565b6040516101e89190611a02565b34801561021f57600080fd5b5061023361022e366004611a15565b6105f4565b6040516001600160a01b0390911681526020016101e8565b34801561025757600080fd5b5061026b610266366004611a43565b610654565b005b34801561027957600080fd5b50600c546101dc90600160a81b900460ff1681565b34801561029a57600080fd5b506008545b6040519081526020016101e8565b3480156102b957600080fd5b5061026b6102c8366004611b34565b610718565b61026b6102db366004611bd1565b6107d1565b3480156102ec57600080fd5b5061029f6102fb366004611a43565b6107e1565b61026b61030e366004611bd1565b610868565b34801561031f57600080fd5b5061026b61032e366004611a15565b610883565b34801561033f57600080fd5b5061029f61034e366004611a15565b6108e7565b34801561035f57600080fd5b5061029f600e5481565b34801561037557600080fd5b50610233610951565b34801561038a57600080fd5b50610233610399366004611a15565b61099a565b3480156103aa57600080fd5b506102066109ed565b3480156103bf57600080fd5b5061029f6103ce366004611c12565b610a7b565b3480156103df57600080fd5b5061029f600f5481565b3480156103f557600080fd5b50600c5461010090046001600160a01b0316610233565b34801561041857600080fd5b50610206610ae6565b34801561042d57600080fd5b5061026b61043c366004611c3d565b610af5565b61026b61044f366004611c76565b610b61565b34801561046057600080fd5b5061020661046f366004611a15565b610b73565b34801561048057600080fd5b5061029f61048f366004611cd6565b610c4b565b3480156104a057600080fd5b5061029f6104af366004611d26565b610caa565b3480156104c057600080fd5b506101dc6104cf366004611d5b565b6001600160a01b03918216600090815260036020908152604080832093909416825291909152205460ff1690565b34801561050957600080fd5b5061026b610518366004611c12565b610cb6565b34801561052957600080fd5b506010546101dc9060ff1681565b60006001600160e01b0319821663b6ea550160e01b148061055c575061055c82610d0d565b92915050565b60606005805461057190611d89565b80601f016020809104026020016040519081016040528092919081815260200182805461059d90611d89565b80156105ea5780601f106105bf576101008083540402835291602001916105ea565b820191906000526020600020905b8154815290600101906020018083116105cd57829003601f168201915b5050505050905090565b60008181526020819052604081205482906001600160a01b03166106335760405162461bcd60e51b815260040161062a90611dbe565b60405180910390fd5b6000838152600260205260409020546001600160a01b031691505b50919050565b61065e3382610d32565b6106aa5760405162461bcd60e51b815260206004820152601c60248201527f4e6f7420746f6b656e206f776e6572206e6f72206f70657261746f7200000000604482015260640161062a565b600081815260026020526040902080546001600160a01b0319166001600160a01b03841690811790915581906106df8261099a565b6001600160a01b03167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a45050565b60008180602001905181019061072e9190611e09565b505090506000818060200190518101906107489190611ea5565b93505050508060008151811061076057610760611f84565b6020026020010151601060006101000a81548160ff0219169083151502179055506001600f819055506107b66040518060400160405280600a81526020016913dc195b9391951cd58d60b21b8152506004610d8d565b6107c08686610de4565b6107c984610e3b565b505050505050565b6107dc838383610e74565b505050565b60006107ec83610a7b565b821061082b5760405162461bcd60e51b815260206004820152600e60248201526d496e76616c696420696e6465782160901b604482015260640161062a565b6001600160a01b038316600090815260096020526040902080548390811061085557610855611f84565b9060005260206000200154905092915050565b6107dc838383604051806020016040528060008152506110da565b8061088e3382611132565b6108da5760405162461bcd60e51b815260206004820152601c60248201527f4e6f7420746f6b656e206f776e6572206e6f7220617070726f76656400000000604482015260640161062a565b6108e382611168565b5050565b600854600090821061092c5760405162461bcd60e51b815260206004820152600e60248201526d496e76616c696420696e6465782160901b604482015260640161062a565b6008828154811061093f5761093f611f84565b90600052602060002001549050919050565b6000602d303b146109625750600090565b6010306001600160a01b0316803b806020016040519081016040528181526000908060200190933c61099390611f9a565b901c905090565b60008181526020819052604081205482906001600160a01b03166109d05760405162461bcd60e51b815260040161062a90611dbe565b50506000908152602081905260409020546001600160a01b031690565b600d80546109fa90611d89565b80601f0160208091040260200160405190810160405280929190818152602001828054610a2690611d89565b8015610a735780601f10610a4857610100808354040283529160200191610a73565b820191906000526020600020905b815481529060010190602001808311610a5657829003601f168201915b505050505081565b60006001600160a01b038216610aca5760405162461bcd60e51b8152602060048201526014602482015273496e76616c6964207a65726f206164647265737360601b604482015260640161062a565b506001600160a01b031660009081526001602052604090205490565b60606006805461057190611d89565b3360008181526003602090815260408083206001600160a01b03871680855290835292819020805460ff191686151590811790915590519081529192917f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31910160405180910390a35050565b610b6d848484846110da565b50505050565b60008181526020819052604090205460609082906001600160a01b0316610bac5760405162461bcd60e51b815260040161062a90611dbe565b60008381526007602052604090208054610bc590611d89565b80601f0160208091040260200160405190810160405280929190818152602001828054610bf190611d89565b8015610c3e5780601f10610c1357610100808354040283529160200191610c3e565b820191906000526020600020905b815481529060010190602001808311610c2157829003601f168201915b5050505050915050919050565b600c5460009061010090046001600160a01b03163314610c995760405162461bcd60e51b81526020600482015260096024820152682737ba1037bbb732b960b91b604482015260640161062a565b610ca38383611171565b9392505050565b600061055c3383611171565b600c5461010090046001600160a01b03163314610d015760405162461bcd60e51b81526020600482015260096024820152682737ba1037bbb732b960b91b604482015260640161062a565b610d0a81611193565b50565b60006001600160e01b031982166350130d5360e01b148061055c575061055c826111ed565b600080610d3e8361099a565b9050836001600160a01b0316816001600160a01b03161480610d8557506001600160a01b0380821660009081526003602090815260408083209388168352929052205460ff165b949350505050565b600c54600160a81b900460ff1615610db75760405162461bcd60e51b815260040161062a90611fbe565b600c805460ff60a81b1916600160a81b1790558151610ddd90600d9060208501906118a8565b50600e5550565b60045460ff1615610e075760405162461bcd60e51b815260040161062a90611fbe565b6004805460ff191660011790558151610e279060059060208501906118a8565b5080516107dc9060069060208401906118a8565b600c5460ff1615610e5e5760405162461bcd60e51b815260040161062a90611fbe565b600c805460ff19166001179055610d0a81611193565b80610e7f3382611132565b610ecb5760405162461bcd60e51b815260206004820152601c60248201527f4e6f7420746f6b656e206f776e6572206e6f7220617070726f76656400000000604482015260640161062a565b6001600160a01b038416610f215760405162461bcd60e51b815260206004820152601a60248201527f5472616e736665722066726f6d207a65726f2061646472657373000000000000604482015260640161062a565b6001600160a01b038316610f775760405162461bcd60e51b815260206004820152601860248201527f5472616e7366657220746f207a65726f20616464726573730000000000000000604482015260640161062a565b610f808261099a565b6001600160a01b0316846001600160a01b031614610fd15760405162461bcd60e51b815260206004820152600e60248201526d233937b6903737ba1037bbb732b960911b604482015260640161062a565b610fdc848484611212565b600082815260026020526040902080546001600160a01b03191690556001600160a01b0384811690841614611093576001600160a01b03841660009081526001602081905260408220805491929091611036908490612001565b90915550506001600160a01b03831660009081526001602081905260408220805491929091611066908490612018565b9091555050600082815260208190526040902080546001600160a01b0319166001600160a01b0385161790555b81836001600160a01b0316856001600160a01b03167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a450505050565b6110e5848484610e74565b6110f18484848461121d565b610b6d5760405162461bcd60e51b81526020600482015260126024820152712737ba1022a9219b9918a932b1b2b4bb32b960711b604482015260640161062a565b600061113e8383610d32565b80610ca35750826001600160a01b0316611157836105f4565b6001600160a01b0316149392505050565b610d0a816112cc565b600f80546000918261118283612030565b91905055905061055c83838361139e565b600c80546001600160a01b03838116610100818102610100600160a81b031985161790945560405193909204169182907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a35050565b60006307f5828d60e41b6001600160e01b03198316148061055c575061055c826113a9565b6107dc8383836113ce565b60006001600160a01b0384163b15806112c35750604051630a85bd0160e11b808252906001600160a01b0386169063150b7a02906112659033908a908990899060040161204b565b602060405180830381600087803b15801561127f57600080fd5b505af1158015611293573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906112b79190612088565b6001600160e01b031916145b95945050505050565b60006112d78261099a565b90506112e381836113e2565b6000828152600b602052604081205460085490919061130490600190612001565b905060006008828154811061131b5761131b611f84565b6000918252602080832090910154808352600b90915260408083208690558783528220919091556008805491925082918590811061135b5761135b611f84565b6000918252602090912001556008805480611378576113786120a5565b60019003818190600052602060002001600090559055611397856114f0565b5050505050565b6107dc838383611510565b600063780e9d6360e01b6001600160e01b03198316148061055c575061055c82611569565b6113d883826113e2565b6107dc828261158e565b6000818152600a60205260408120549060016113fd85610a7b565b6114079190612001565b905080821461149e576001600160a01b038416600090815260096020526040812080548390811061143a5761143a611f84565b906000526020600020015490508060096000876001600160a01b03166001600160a01b03168152602001908152602001600020848154811061147e5761147e611f84565b6000918252602080832090910192909255918252600a9052604090208290555b6000838152600a602090815260408083208390556001600160a01b0387168352600990915290208054806114d4576114d46120a5565b6001900381819060005260206000200160009055905550505050565b60008181526007602052604081206115079161192c565b610d0a816115cc565b61151a838261158e565b600880546000838152600b60205260408120829055600182018355919091527ff3f7a9fe364faab93b216da50a3214154f22a0a2b415b23a84c8169e8b636ee3018190556107dc8383836116bd565b6000635b5e139f60e01b6001600160e01b03198316148061055c575061055c826116e8565b6001600160a01b0390911660009081526009602081815260408084208054868652600a84529185208290559282526001810183559183529091200155565b60006115d78261099a565b90506001600160a01b0381166115ff5760405162461bcd60e51b815260040161062a90611dbe565b6001600160a01b038116600090815260016020526040902054611624576116246120bb565b6001600160a01b0381166000908152600160208190526040822080549192909161164f908490612001565b9091555050600082815260026020908152604080832080546001600160a01b0319908116909155918390528083208054909216909155518391906001600160a01b038416907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef908390a45050565b600081815260076020908152604090912083516116dc928501906118a8565b506107dc83838361171d565b60006380ac58cd60e01b6001600160e01b03198316148061055c57506001600160e01b031982166301ffc9a760e01b1461055c565b6001600160a01b03831661176a5760405162461bcd60e51b81526020600482015260146024820152734d696e7420746f207a65726f206164647265737360601b604482015260640161062a565b6000818152602081905260409020546001600160a01b0316156117c65760405162461bcd60e51b8152602060048201526014602482015273151bdad95b88185b1c9958591e481b5a5b9d195960621b604482015260640161062a565b6001600160a01b038316600090815260016020819052604082208054919290916117f1908490612018565b909155505060008181526020819052604080822080546001600160a01b0319166001600160a01b03871690811790915590518392907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef908290a4611867600084836040518060200160405280600081525061121d565b6107dc5760405162461bcd60e51b8152602060048201526012602482015271139bdd08115490cdcc8c549958d95a5d995960721b604482015260640161062a565b8280546118b490611d89565b90600052602060002090601f0160209004810192826118d6576000855561191c565b82601f106118ef57805160ff191683800117855561191c565b8280016001018555821561191c579182015b8281111561191c578251825591602001919060010190611901565b50611928929150611962565b5090565b50805461193890611d89565b6000825580601f10611948575050565b601f016020900490600052602060002090810190610d0a91905b5b808211156119285760008155600101611963565b6001600160e01b031981168114610d0a57600080fd5b60006020828403121561199f57600080fd5b8135610ca381611977565b60005b838110156119c55781810151838201526020016119ad565b83811115610b6d5750506000910152565b600081518084526119ee8160208601602086016119aa565b601f01601f19169290920160200192915050565b602081526000610ca360208301846119d6565b600060208284031215611a2757600080fd5b5035919050565b6001600160a01b0381168114610d0a57600080fd5b60008060408385031215611a5657600080fd5b8235611a6181611a2e565b946020939093013593505050565b634e487b7160e01b600052604160045260246000fd5b604051601f8201601f1916810167ffffffffffffffff81118282101715611aae57611aae611a6f565b604052919050565b600067ffffffffffffffff821115611ad057611ad0611a6f565b50601f01601f191660200190565b600082601f830112611aef57600080fd5b8135611b02611afd82611ab6565b611a85565b818152846020838601011115611b1757600080fd5b816020850160208301376000918101602001919091529392505050565b60008060008060808587031215611b4a57600080fd5b843567ffffffffffffffff80821115611b6257600080fd5b611b6e88838901611ade565b95506020870135915080821115611b8457600080fd5b611b9088838901611ade565b945060408701359150611ba282611a2e565b90925060608601359080821115611bb857600080fd5b50611bc587828801611ade565b91505092959194509250565b600080600060608486031215611be657600080fd5b8335611bf181611a2e565b92506020840135611c0181611a2e565b929592945050506040919091013590565b600060208284031215611c2457600080fd5b8135610ca381611a2e565b8015158114610d0a57600080fd5b60008060408385031215611c5057600080fd5b8235611c5b81611a2e565b91506020830135611c6b81611c2f565b809150509250929050565b60008060008060808587031215611c8c57600080fd5b8435611c9781611a2e565b93506020850135611ca781611a2e565b925060408501359150606085013567ffffffffffffffff811115611cca57600080fd5b611bc587828801611ade565b60008060408385031215611ce957600080fd5b8235611cf481611a2e565b9150602083013567ffffffffffffffff811115611d1057600080fd5b611d1c85828601611ade565b9150509250929050565b600060208284031215611d3857600080fd5b813567ffffffffffffffff811115611d4f57600080fd5b610d8584828501611ade565b60008060408385031215611d6e57600080fd5b8235611d7981611a2e565b91506020830135611c6b81611a2e565b600181811c90821680611d9d57607f821691505b6020821081141561064e57634e487b7160e01b600052602260045260246000fd5b60208082526010908201526f125b9d985b1a59081d1bdad95b88125160821b604082015260600190565b80516bffffffffffffffffffffffff81168114611e0457600080fd5b919050565b600080600060608486031215611e1e57600080fd5b835167ffffffffffffffff811115611e3557600080fd5b8401601f81018613611e4657600080fd5b8051611e54611afd82611ab6565b818152876020838501011115611e6957600080fd5b611e7a8260208301602086016119aa565b8095505050506020840151611e8e81611a2e565b9150611e9c60408501611de8565b90509250925092565b60008060008060808587031215611ebb57600080fd5b84519350602080860151611ece81611a2e565b9350611edc60408701611de8565b9250606086015167ffffffffffffffff80821115611ef957600080fd5b818801915088601f830112611f0d57600080fd5b815181811115611f1f57611f1f611a6f565b8060051b9150611f30848301611a85565b818152918301840191848101908b841115611f4a57600080fd5b938501935b83851015611f745784519250611f6483611c2f565b8282529385019390850190611f4f565b989b979a50959850505050505050565b634e487b7160e01b600052603260045260246000fd5b8051602080830151919081101561064e5760001960209190910360031b1b16919050565b602080825260139082015272105b1c9958591e481a5b9a5d1a585b1a5e9959606a1b604082015260600190565b634e487b7160e01b600052601160045260246000fd5b60008282101561201357612013611feb565b500390565b6000821982111561202b5761202b611feb565b500190565b600060001982141561204457612044611feb565b5060010190565b6001600160a01b038581168252841660208201526040810183905260806060820181905260009061207e908301846119d6565b9695505050505050565b60006020828403121561209a57600080fd5b8151610ca381611977565b634e487b7160e01b600052603160045260246000fd5b634e487b7160e01b600052600160045260246000fdfea26469706673582212200f15a8cb97434c5de5fe4bf96a9247db71c1a670d48b0831dc0211aec772ab2964736f6c63430008090033

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

Txn Hash Block Value Eth2 PubKey Valid
View All Deposits
[ 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.