ETH Price: $3,102.98 (-0.02%)

Token

CondoMiniNeighborhood (CMi)
 

Overview

Max Total Supply

3,727 CMi

Holders

1,020

Market

Volume (24H)

N/A

Min Price (24H)

N/A

Max Price (24H)

N/A
Filtered by Token Holder
azima.eth
Balance
2 CMi
0x9d156bc7c8768294510A4A41883d5A4EB15b15E3
Loading...
Loading
Loading...
Loading
Loading...
Loading

OVERVIEW

A next-generation NFT pushing the boundaries of what is possible in web3. CondoMini is a 5-in-1 customizable blockchain art drop by the internationally renowned artist @joseki.

# Exchange Pair Price  24H Volume % Volume

Contract Source Code Verified (Exact Match)

Contract Name:
Streets

Compiler Version
v0.8.9+commit.e5eed63a

Optimization Enabled:
Yes with 200 runs

Other Settings:
default evmVersion
File 1 of 8 : Streets.sol
// SPDX-License-Identifier: AGPL-3.0
// ©2022 Ponderware Ltd

pragma solidity ^0.8.9;

import "@openzeppelin/contracts/utils/introspection/IERC165.sol";
import "@openzeppelin/contracts/token/ERC721/IERC721.sol";
import "@openzeppelin/contracts/token/ERC721/IERC721Receiver.sol";
import "@openzeppelin/contracts/token/ERC721/extensions/IERC721Enumerable.sol";
import "@openzeppelin/contracts/token/ERC721/extensions/IERC721Metadata.sol";
import "@openzeppelin/contracts/access/Ownable.sol";

interface ICondos {
    function assembleRandomStreet(uint256 seed) external returns (uint16[5] memory ids);
    function breakupStreet(address to, uint256[] calldata ids) external;
    function assembleStreet(address from, uint256[] calldata ids) external;
}

interface IMetadata {
    function condosAddress() external pure returns (address contractAddress);
    function streetMetadata(uint256 tokenId) external view returns (string memory);
    function revealed() external pure returns (bool isRevealed);
    function CONDOS_IPFS_CID() external pure returns (string memory condosIPFS);
    function BACKGROUNDS_IPFS_CID() external pure returns (string memory backgroundsIPFS);
    function STREETS_PREREVEAL_URI() external pure returns (string memory streetsURI);
    function IPFS_URI_Prefix() external pure returns (string memory prefixURI);
    function totalBackgrounds() external pure returns (uint16 numBackgrounds);
}

interface IMoonCatSVGS {
    function uint2str(uint value) external pure returns (string memory);
}

interface IReverseResolver {
    function claim(address owner) external returns (bytes32);
}

interface IERC20 {
    function balanceOf(address account) external view returns (uint256);
    function transfer(address recipient, uint256 amount) external returns (bool);
}


/*
 * @title CondoMini Streets
 * @author Ponderware Ltd
 * @dev CondoMini Neighborhood ERC-721 NFT
 */
contract Streets is Ownable, IERC721Enumerable, IERC721Metadata {
    ICondos public Condos;
    IMetadata public Metadata;

    uint256 public price = 0.01 ether;
    bool public paused = true;

    string public name = "CondoMiniNeighborhood";
    string public symbol = "CMi";

    address[4000] private Owners;
    mapping(address => uint256[]) internal TokensByOwner;
    uint16[4000] internal OwnerTokenIndex;

    // 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;

    uint256 public mintsAvailable = 4000;
    uint256 public totalSupply = 0;

    bool public onlyFriends = true;
    mapping(address => bool) private Friends;

    address private immutable publisher;

    struct Street {
        uint16[5] condos;
        uint16 background;
        bytes20 name;
    }

    Street[4000] directory;
    uint16[] availableIds;

    constructor(address metadataAddress, address publisherAddress) {
        publisher = publisherAddress;
        Metadata = IMetadata(metadataAddress);
        Condos = ICondos(Metadata.condosAddress());
    }

    /* Modifiers */
    modifier whenNotPaused() {
        require(paused == false, "Paused");
        _;
    }

    modifier notContracts() {
        require(tx.origin == msg.sender, "Contracts not allowed");
        _;
    }

    /* Administration */
    function pause() public onlyOwner {
        paused = true;
    }

    function unpause() public onlyOwner {
        paused = false;
    }

    function openPublicMint() public onlyOwner {
        onlyFriends = false;
    }

    function refreshCondosAdress() public onlyOwner {
        Condos = ICondos(Metadata.condosAddress());
    }

    function addFriends(address[] calldata friendAddresses) public onlyOwner {
        for (uint i = 0; i < friendAddresses.length; i++) {
            Friends[friendAddresses[i]] = true;
        }
    }

    function setPrice(uint256 priceWei) public onlyOwner {
        price = priceWei;
    }

    function clearName(uint256 tokenId) public onlyOwner {
        require(tokenExists(tokenId), "Nonexistent Token");
        directory[tokenId].name = 0;
    }

    function withdraw() public {
        require(msg.sender == owner() || msg.sender == publisher, "Unauthorized");
        uint256 publisherShare = (address(this).balance * 40) / 100;
        payable(publisher).transfer(publisherShare);
        payable(owner()).transfer(address(this).balance);
    }

    function isFriend(address friendAddress) public view returns (bool) {
        return Friends[friendAddress] == true;
    }

    function _handleMintStreet(address recipient) internal returns (uint256 tokenId) {
        require(mintsAvailable > 0, "Insufficient supply available");

        uint256 seed = uint256(keccak256(abi.encodePacked(recipient, blockhash(block.number - 1))));

        uint16[5] memory ids = Condos.assembleRandomStreet(seed);

        tokenId = _mint(recipient);

        uint16 backgroundId = uint16(uint256(keccak256(abi.encodePacked(tokenId, seed))) % Metadata.totalBackgrounds());

        directory[tokenId] = Street(ids, backgroundId, "");

        mintsAvailable--;
    }

    function premintRandomStreets(address recipient, uint256 quantity) public onlyOwner {
        for (uint256 i = 0; i < quantity; i++) {
            _handleMintStreet(recipient);
        }
    }

    function mintRandomStreet(address recipient) public payable whenNotPaused notContracts returns (uint256 id) {
        require(onlyFriends == false || Friends[msg.sender] == true, "Public minting not open");

        uint256 cost = price * 5;
        require(msg.value >= cost, "Insufficient Funds");

        id = _handleMintStreet(recipient);
    }

    function mintRandomStreets(address recipient, uint256 quantity) public payable whenNotPaused notContracts {
        require(onlyFriends == false || Friends[msg.sender] == true, "Public minting not open");

        uint256 cost = price * 5 * quantity;
        require(msg.value >= cost, "Insufficient Funds");

        for (uint256 i = 0; i < quantity; i++) {
            _handleMintStreet(recipient);
        }
    }

    function assembleStreet(uint256[] memory ids, uint16 backgroundId, bytes20 streetName) public whenNotPaused notContracts returns (uint256 tokenId) {
        require(Metadata.revealed(), "The metadata has not yet revealed");
        require(ids.length == 5, "Requires 5 Condos");
        require(backgroundId < Metadata.totalBackgrounds(), "Invalid background id");
        Condos.assembleStreet(msg.sender, ids);

        tokenId = _mint(msg.sender);

        uint16[5] memory newStreet;
        newStreet[0] = uint16(ids[0]);
        newStreet[1] = uint16(ids[1]);
        newStreet[2] = uint16(ids[2]);
        newStreet[3] = uint16(ids[3]);
        newStreet[4] = uint16(ids[4]);

        directory[tokenId] = Street(newStreet, backgroundId, streetName);
    }

    function breakupStreet(uint256 tokenId) public whenNotPaused notContracts {
        require(Metadata.revealed(), "The metadata has not yet revealed");
        require(_isApprovedOrOwner(msg.sender, tokenId), "ERC721: caller is not token owner nor approved");

        Street storage street = directory[tokenId];
        uint256[] memory condoIds = new uint256[](5);
        condoIds[0] = street.condos[0];
        condoIds[1] = street.condos[1];
        condoIds[2] = street.condos[2];
        condoIds[3] = street.condos[3];
        condoIds[4] = street.condos[4];

        Condos.breakupStreet(msg.sender, condoIds);
        _burn(tokenId);
        delete directory[tokenId];
    }

    function breakupStreets(uint256[] calldata tokenIds) public {
        require(Metadata.revealed(), "The metadata has not yet revealed");

        for (uint i = 0; i < tokenIds.length; i++) {
            breakupStreet(tokenIds[i]);
        }
    }

    function getStreetCondos(uint256 tokenId) public view returns (uint16[5] memory ids) {
        require(tokenExists(tokenId), "Nonexistent Token");
        Street storage street = directory[tokenId];
        ids = street.condos;
    }

    /* Minting Helpers */

    function _mint(address to) internal returns (uint256 tokenId) {
        if (availableIds.length > 0) {
            tokenId = availableIds[availableIds.length - 1];
            availableIds.pop();
        } else {
            tokenId = totalSupply;
        }
        TokensByOwner[to].push(tokenId);
        OwnerTokenIndex[tokenId] = uint16(TokensByOwner[to].length);
        Owners[tokenId] = to;
        totalSupply++;
        emit Transfer(address(0), to, tokenId);
    }

    function _burn(uint256 tokenId) internal {
        _approve(address(0), tokenId);
        address from = Owners[tokenId];
        uint16 valueIndex = OwnerTokenIndex[tokenId];
        uint256 toDeleteIndex = valueIndex - 1;
        uint256 lastIndex = TokensByOwner[from].length - 1;
        if (lastIndex != toDeleteIndex) {
            uint256 lastTokenId = TokensByOwner[from][lastIndex];
            TokensByOwner[from][toDeleteIndex] = lastTokenId;
            OwnerTokenIndex[lastTokenId] = valueIndex;
        }
        TokensByOwner[from].pop();
        Owners[tokenId] = address(0);

        totalSupply--;
        availableIds.push(uint16(tokenId));

        emit Transfer(from, address(0), tokenId);
    }

    /* ERC-721 Metadata */

    function tokenURI(uint256 tokenId) public view returns (string memory) {
        require(tokenExists(tokenId), "ERC721Metadata: URI query for nonexistent token");
        if (Metadata.revealed()) {
            return Metadata.streetMetadata(tokenId);
        } else {
            // Show unrevealed json
            return Metadata.STREETS_PREREVEAL_URI();
        }
    }

    function tokenImage(uint256 tokenId) public view returns (string memory) {
        require(tokenExists(tokenId), "Nonexistent Token");
        if (Metadata.revealed()) {
            return assembleSVG(directory[tokenId].condos, directory[tokenId].background);
        } else {
            // Show no image
            return "";
        }
    }

    function getStreetData(uint256 tokenId) public view returns (uint16[5] memory condoIds, uint16 background, bytes20 name) {
        require(tokenExists(tokenId), "Nonexistent Token");
        Street storage street = directory[tokenId];
        condoIds = street.condos;
        background = street.background;
        name = street.name;
    }

    /* ERC-721 Enumerable */

    function tokenByIndex(uint256 tokenId) public view returns (uint256) {
        require(tokenExists(tokenId), "Nonexistent Token");
        return tokenId;
    }

    function tokenOfOwnerByIndex(address owner, uint256 index) public view returns (uint256) {
        require(index < balanceOf(owner), "ERC721Enumerable: owner index out of bounds");
        return TokensByOwner[owner][index];
    }

    /* ERC 721 */

    function tokenExists(uint256 tokenId) public view returns (bool) {
        return Owners[tokenId] != address(0);
    }

    function ownerOf(uint256 tokenId) public view returns (address) {
        require(tokenExists(tokenId), "ERC721: Nonexistent token");
        return Owners[tokenId];
    }

    function balanceOf(address owner) public view returns (uint256) {
        return TokensByOwner[owner].length;
    }

    function supportsInterface(bytes4 interfaceId) public pure returns (bool) {
        return
            interfaceId == type(IERC165).interfaceId ||
            interfaceId == type(IERC721).interfaceId ||
            interfaceId == type(IERC721Metadata).interfaceId ||
            interfaceId == type(IERC721Enumerable).interfaceId;
    }

    function _approve(address to, uint256 tokenId) internal {
        TokenApprovals[tokenId] = to;
        emit Approval(ownerOf(tokenId), to, tokenId);
    }

    function approve(address to, uint256 tokenId) public {
        address owner = ownerOf(tokenId);
        require(to != owner, "ERC721: approval to current owner");

        require(
            msg.sender == owner || isApprovedForAll(owner, msg.sender),
            "ERC721: approve caller is not owner nor approved for all"
        );
        _approve(to, tokenId);
    }

    function getApproved(uint256 tokenId) public view returns (address) {
        require(tokenExists(tokenId), "ERC721: approved query for nonexistent token");
        return TokenApprovals[tokenId];
    }

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

    function setApprovalForAll(address operator, bool approved) external virtual {
        require(msg.sender != operator, "ERC721: approve to caller");
        OperatorApprovals[msg.sender][operator] = approved;
        emit ApprovalForAll(msg.sender, operator, approved);
    }

    function isContract(address account) internal view returns (bool) {
        uint256 size;
        assembly {
            size := extcodesize(account)
        }
        return size > 0;
    }

    function _checkOnERC721Received(address from, address to, uint256 tokenId, bytes memory _data) private returns (bool) {
        if (isContract(to)) {
            try IERC721Receiver(to).onERC721Received(msg.sender, from, tokenId, _data) returns (bytes4 retval) {
                return retval == IERC721Receiver.onERC721Received.selector;
            } catch (bytes memory reason) {
                if (reason.length == 0) {
                    revert("ERC721: transfer to non ERC721Receiver implementer");
                } else {
                    assembly {
                        revert(add(32, reason), mload(reason))
                    }
                }
            }
        } else {
            return true;
        }
    }

    function _transfer(address from, address to, uint256 tokenId) private whenNotPaused {
        require(ownerOf(tokenId) == from, "ERC721: transfer of token that is not own");
        require(to != address(0), "ERC721: transfer to the zero address");
        // Clear approvals from the previous owner
        _approve(address(0), tokenId);

        uint16 valueIndex = OwnerTokenIndex[tokenId];
        uint256 toDeleteIndex = valueIndex - 1;
        uint256 lastIndex = TokensByOwner[from].length - 1;
        if (lastIndex != toDeleteIndex) {
            uint256 lastTokenId = TokensByOwner[from][lastIndex];
            TokensByOwner[from][toDeleteIndex] = lastTokenId;
            OwnerTokenIndex[lastTokenId] = valueIndex;
        }
        TokensByOwner[from].pop();

        TokensByOwner[to].push(tokenId);
        OwnerTokenIndex[tokenId] = uint16(TokensByOwner[to].length);

        Owners[tokenId] = to;
        emit Transfer(from, to, tokenId);
    }

    function _isApprovedOrOwner(address spender, uint256 tokenId) internal view returns (bool) {
        require(tokenExists(tokenId), "ERC721: operator query for nonexistent token");
        address owner = ownerOf(tokenId);
        return (spender == owner || getApproved(tokenId) == spender || isApprovedForAll(owner, spender));
    }

    function transferFrom(address from, address to, uint256 tokenId) public {
        require(_isApprovedOrOwner(msg.sender, tokenId), "ERC721: transfer caller is not owner nor approved");

        _transfer(from, to, tokenId);
    }

    function safeTransferFrom(address from, address to, uint256 tokenId) public {
        safeTransferFrom(from, to, tokenId, "");
    }

    function safeTransferFrom(address from, address to, uint256 tokenId, bytes memory _data) public {
        require(_isApprovedOrOwner(msg.sender, tokenId), "ERC721: transfer caller is not owner nor approved");
        _safeTransfer(from, to, tokenId, _data);
    }

    function _safeTransfer(address from, address to, uint256 tokenId, bytes memory _data) private {
        _transfer(from, to, tokenId);
        require(_checkOnERC721Received(from, to, tokenId, _data), "ERC721: transfer to non ERC721Receiver implementer");
    }

    /**
     * @dev Claim ENS reverse-resolver rights for this contract.
     * https://docs.ens.domains/contract-api-reference/reverseregistrar#claim-address
     */
    function setReverseResolver(address registrar) public onlyOwner {
        IReverseResolver(registrar).claim(msg.sender);
    }

    /**
     * @dev Rescue ERC20 assets sent directly to this contract.
     */
    function withdrawForeignERC20(address tokenContract) public onlyOwner {
        IERC20 token = IERC20(tokenContract);
        token.transfer(msg.sender, token.balanceOf(address(this)));
    }

    /**
     * @dev Rescue ERC721 assets sent directly to this contract.
     */
    function withdrawForeignERC721(address tokenContract, uint256 tokenId) public virtual onlyOwner {
        IERC721(tokenContract).safeTransferFrom(address(this), msg.sender, tokenId);
    }

    /* SVG Assembly */

    IMoonCatSVGS MoonCatSVGS = IMoonCatSVGS(0xB39C61fe6281324A23e079464f7E697F8Ba6968f);

    /**
     * @dev Assemble one png layer of the SVG composite
     */
    function svgLayer(uint16 condoId, uint16 posX) internal view returns (bytes memory) {
        return
            abi.encodePacked(
                '<image x="',
                MoonCatSVGS.uint2str(posX),
                '" y="104" width="385" height="385" href="',
                Metadata.IPFS_URI_Prefix(),
                Metadata.CONDOS_IPFS_CID(),
                "/",
                MoonCatSVGS.uint2str(condoId),
                '.png" />'
            );
    }

    /**
     * @dev Assemble the full SVG image for a street
     */
    function assembleSVG(uint16[5] memory condoIds, uint16 background) internal view returns (string memory) {
        bytes memory svg = '<svg xmlns="http://www.w3.org/2000/svg" preserveAspectRatio="xMidYMid meet" viewBox="0 0 1500 500" width="1500" height="500">';

        svg = abi.encodePacked(
            svg,
            '<image x="0" y="0" width="1500" height="500" href="',
            Metadata.IPFS_URI_Prefix(),
            Metadata.BACKGROUNDS_IPFS_CID(),
            "/",
            MoonCatSVGS.uint2str(background),
            '.jpg" />'
        );

        uint16 posX = 0;

        for (uint i = 0; i < 5; i++) {
            svg = abi.encodePacked(svg, svgLayer(condoIds[i], posX));
            posX = posX + 279;
        }

        return string(abi.encodePacked(svg, "</svg>"));
    }
}

File 2 of 8 : 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 3 of 8 : 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 4 of 8 : 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 5 of 8 : IERC721Enumerable.sol
// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts (last updated v4.5.0) (token/ERC721/extensions/IERC721Enumerable.sol)

pragma solidity ^0.8.0;

import "../IERC721.sol";

/**
 * @title ERC-721 Non-Fungible Token Standard, optional enumeration extension
 * @dev See https://eips.ethereum.org/EIPS/eip-721
 */
interface IERC721Enumerable is IERC721 {
    /**
     * @dev Returns the total amount of tokens stored by the contract.
     */
    function totalSupply() external view returns (uint256);

    /**
     * @dev Returns a token ID owned by `owner` at a given `index` of its token list.
     * Use along with {balanceOf} to enumerate all of ``owner``'s tokens.
     */
    function tokenOfOwnerByIndex(address owner, uint256 index) external view returns (uint256);

    /**
     * @dev Returns a token ID at a given `index` of all the tokens stored by the contract.
     * Use along with {totalSupply} to enumerate all tokens.
     */
    function tokenByIndex(uint256 index) external view returns (uint256);
}

File 6 of 8 : IERC721Metadata.sol
// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts v4.4.1 (token/ERC721/extensions/IERC721Metadata.sol)

pragma solidity ^0.8.0;

import "../IERC721.sol";

/**
 * @title ERC-721 Non-Fungible Token Standard, optional metadata extension
 * @dev See https://eips.ethereum.org/EIPS/eip-721
 */
interface IERC721Metadata is IERC721 {
    /**
     * @dev Returns the token collection name.
     */
    function name() external view returns (string memory);

    /**
     * @dev Returns the token collection symbol.
     */
    function symbol() external view returns (string memory);

    /**
     * @dev Returns the Uniform Resource Identifier (URI) for `tokenId` token.
     */
    function tokenURI(uint256 tokenId) external view returns (string memory);
}

File 7 of 8 : 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 8 of 8 : 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
{
  "optimizer": {
    "enabled": true,
    "runs": 200
  },
  "outputSelection": {
    "*": {
      "*": [
        "evm.bytecode",
        "evm.deployedBytecode",
        "devdoc",
        "userdoc",
        "metadata",
        "abi"
      ]
    }
  },
  "libraries": {}
}

Contract Security Audit

Contract ABI

[{"inputs":[{"internalType":"address","name":"metadataAddress","type":"address"},{"internalType":"address","name":"publisherAddress","type":"address"}],"stateMutability":"nonpayable","type":"constructor"},{"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":[],"name":"Condos","outputs":[{"internalType":"contract ICondos","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"Metadata","outputs":[{"internalType":"contract IMetadata","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address[]","name":"friendAddresses","type":"address[]"}],"name":"addFriends","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"approve","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256[]","name":"ids","type":"uint256[]"},{"internalType":"uint16","name":"backgroundId","type":"uint16"},{"internalType":"bytes20","name":"streetName","type":"bytes20"}],"name":"assembleStreet","outputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"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":"breakupStreet","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256[]","name":"tokenIds","type":"uint256[]"}],"name":"breakupStreets","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"clearName","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":"uint256","name":"tokenId","type":"uint256"}],"name":"getStreetCondos","outputs":[{"internalType":"uint16[5]","name":"ids","type":"uint16[5]"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"getStreetData","outputs":[{"internalType":"uint16[5]","name":"condoIds","type":"uint16[5]"},{"internalType":"uint16","name":"background","type":"uint16"},{"internalType":"bytes20","name":"name","type":"bytes20"}],"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":"friendAddress","type":"address"}],"name":"isFriend","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"recipient","type":"address"}],"name":"mintRandomStreet","outputs":[{"internalType":"uint256","name":"id","type":"uint256"}],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"address","name":"recipient","type":"address"},{"internalType":"uint256","name":"quantity","type":"uint256"}],"name":"mintRandomStreets","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[],"name":"mintsAvailable","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"name","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"onlyFriends","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"openPublicMint","outputs":[],"stateMutability":"nonpayable","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":"pause","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"paused","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"recipient","type":"address"},{"internalType":"uint256","name":"quantity","type":"uint256"}],"name":"premintRandomStreets","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"price","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"refreshCondosAdress","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","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":"nonpayable","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":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"operator","type":"address"},{"internalType":"bool","name":"approved","type":"bool"}],"name":"setApprovalForAll","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"priceWei","type":"uint256"}],"name":"setPrice","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"registrar","type":"address"}],"name":"setReverseResolver","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes4","name":"interfaceId","type":"bytes4"}],"name":"supportsInterface","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"pure","type":"function"},{"inputs":[],"name":"symbol","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"tokenByIndex","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"tokenExists","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"tokenImage","outputs":[{"internalType":"string","name":"","type":"string"}],"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":"nonpayable","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":[],"name":"withdraw","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"tokenContract","type":"address"}],"name":"withdrawForeignERC20","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"tokenContract","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"withdrawForeignERC721","outputs":[],"stateMutability":"nonpayable","type":"function"}]

662386f26fc100006003556004805460ff1916600117905560e0604052601560a08190527f436f6e646f4d696e694e65696768626f72686f6f64000000000000000000000060c090815262000058916005919062000212565b5060408051808201909152600380825262434d6960e81b6020909201918252620000859160069162000212565b50610fa06110a45560006110a5556110a6805460ff19166001179055612fe980546001600160a01b03191673b39c61fe6281324a23e079464f7e697f8ba6968f179055348015620000d557600080fd5b50604051620045d5380380620045d5833981016040819052620000f891620002d5565b6200010333620001c2565b6001600160a01b03818116608052600280546001600160a01b031916918416918217905560408051630617da5f60e41b8152905163617da5f091600480820192602092909190829003018186803b1580156200015e57600080fd5b505afa15801562000173573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906200019991906200030d565b600180546001600160a01b0319166001600160a01b0392909216919091179055506200036f9050565b600080546001600160a01b038381166001600160a01b0319831681178455604051919092169283917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e09190a35050565b828054620002209062000332565b90600052602060002090601f0160209004810192826200024457600085556200028f565b82601f106200025f57805160ff19168380011785556200028f565b828001600101855582156200028f579182015b828111156200028f57825182559160200191906001019062000272565b506200029d929150620002a1565b5090565b5b808211156200029d5760008155600101620002a2565b80516001600160a01b0381168114620002d057600080fd5b919050565b60008060408385031215620002e957600080fd5b620002f483620002b8565b91506200030460208401620002b8565b90509250929050565b6000602082840312156200032057600080fd5b6200032b82620002b8565b9392505050565b600181811c908216806200034757607f821691505b602082108114156200036957634e487b7160e01b600052602260045260246000fd5b50919050565b6080516142436200039260003960008181610eac0152610f3201526142436000f3fe6080604052600436106102875760003560e01c80636352211e1161015a578063a22cb465116100c1578063c87b56dd1161007a578063c87b56dd146107a7578063cf348425146107c7578063d9bcf10e146107e7578063e985e9c514610816578063efcb119514610836578063f2fde38b1461084d57600080fd5b8063a22cb465146106da578063a5e818ff146106fa578063a5eb6ff214610727578063a702283c14610747578063a81158c714610767578063b88d4fde1461078757600080fd5b80638456cb59116101135780638456cb591461063c5780638da5cb5b1461065157806391b7f5ed1461066f57806395d89b411461068f578063a00d7c2a146106a4578063a035b1fe146106c457600080fd5b80636352211e1461055157806368125a1b1461057157806369dbadb3146105b05780636e7ced0f146105d057806370a08231146105f0578063715018a61461062757600080fd5b80632f745c59116101fe5780634d263502116101b75780634d263502146104a45780634f6ccce7146104c457806358f1699d146104e457806358ff6917146105045780635c471995146105175780635c975abb1461053757600080fd5b80632f745c591461040a5780633ccfd60b1461042a5780633f4ba83a1461043f57806341718b381461045457806342842e0e1461046f57806345f7e06e1461048f57600080fd5b8063095ea7b311610250578063095ea7b31461035d57806309f4f97b1461037d5780630ce06b681461039257806318160ddd146103b25780632342408d146103d757806323b872dd146103ea57600080fd5b8062923f9e1461028c57806301ffc9a7146102c157806306fdde03146102e15780630790dfa914610303578063081812fc14610325575b600080fd5b34801561029857600080fd5b506102ac6102a73660046135e8565b61086d565b60405190151581526020015b60405180910390f35b3480156102cd57600080fd5b506102ac6102dc366004613617565b610897565b3480156102ed57600080fd5b506102f6610904565b6040516102b8919061368c565b34801561030f57600080fd5b5061032361031e3660046136b4565b610992565b005b34801561033157600080fd5b506103456103403660046135e8565b6109c6565b6040516001600160a01b0390911681526020016102b8565b34801561036957600080fd5b506103236103783660046136b4565b610a54565b34801561038957600080fd5b50610323610b65565b34801561039e57600080fd5b506103236103ad3660046136b4565b610c15565b3480156103be57600080fd5b506103c96110a55481565b6040519081526020016102b8565b6103c96103e53660046136e0565b610c87565b3480156103f657600080fd5b506103236104053660046136fd565b610da2565b34801561041657600080fd5b506103c96104253660046136b4565b610dd3565b34801561043657600080fd5b50610323610e8d565b34801561044b57600080fd5b50610323610fba565b34801561046057600080fd5b506110a6546102ac9060ff1681565b34801561047b57600080fd5b5061032361048a3660046136fd565b610fce565b34801561049b57600080fd5b50610323610fe9565b3480156104b057600080fd5b506103c96104bf3660046137bd565b610ffe565b3480156104d057600080fd5b506103c96104df3660046135e8565b611446565b3480156104f057600080fd5b506103236104ff3660046135e8565b611471565b6103236105123660046136b4565b6117a9565b34801561052357600080fd5b506103236105323660046136e0565b6118e9565b34801561054357600080fd5b506004546102ac9060ff1681565b34801561055d57600080fd5b5061034561056c3660046135e8565b6119f2565b34801561057d57600080fd5b506102ac61058c3660046136e0565b6001600160a01b031660009081526110a7602052604090205460ff16151560011490565b3480156105bc57600080fd5b506103236105cb3660046138d1565b611a6e565b3480156105dc57600080fd5b506103236105eb3660046135e8565b611b4e565b3480156105fc57600080fd5b506103c961060b3660046136e0565b6001600160a01b03166000908152610fa7602052604090205490565b34801561063357600080fd5b50610323611bba565b34801561064857600080fd5b50610323611bce565b34801561065d57600080fd5b506000546001600160a01b0316610345565b34801561067b57600080fd5b5061032361068a3660046135e8565b611be5565b34801561069b57600080fd5b506102f6611bf2565b3480156106b057600080fd5b506103236106bf3660046138d1565b611bff565b3480156106d057600080fd5b506103c960035481565b3480156106e657600080fd5b506103236106f5366004613921565b611c7a565b34801561070657600080fd5b5061071a6107153660046135e8565b611d40565b6040516102b89190613981565b34801561073357600080fd5b50600254610345906001600160a01b031681565b34801561075357600080fd5b50600154610345906001600160a01b031681565b34801561077357600080fd5b506103236107823660046136e0565b611deb565b34801561079357600080fd5b506103236107a23660046139b7565b611e6c565b3480156107b357600080fd5b506102f66107c23660046135e8565b611e9e565b3480156107d357600080fd5b506102f66107e23660046135e8565b61206b565b3480156107f357600080fd5b506108076108023660046135e8565b6121cb565b6040516102b893929190613a66565b34801561082257600080fd5b506102ac610831366004613a96565b612293565b34801561084257600080fd5b506103c96110a45481565b34801561085957600080fd5b506103236108683660046136e0565b6122c2565b600080600783610fa0811061088457610884613ac4565b01546001600160a01b0316141592915050565b60006001600160e01b031982166301ffc9a760e01b14806108c857506001600160e01b031982166380ac58cd60e01b145b806108e357506001600160e01b03198216635b5e139f60e01b145b806108fe57506001600160e01b0319821663780e9d6360e01b145b92915050565b6005805461091190613ada565b80601f016020809104026020016040519081016040528092919081815260200182805461093d90613ada565b801561098a5780601f1061095f5761010080835404028352916020019161098a565b820191906000526020600020905b81548152906001019060200180831161096d57829003601f168201915b505050505081565b61099a61233b565b60005b818110156109c1576109ae83612395565b50806109b981613b2b565b91505061099d565b505050565b60006109d18261086d565b610a375760405162461bcd60e51b815260206004820152602c60248201527f4552433732313a20617070726f76656420717565727920666f72206e6f6e657860448201526b34b9ba32b73a103a37b5b2b760a11b60648201526084015b60405180910390fd5b5060009081526110a260205260409020546001600160a01b031690565b6000610a5f826119f2565b9050806001600160a01b0316836001600160a01b03161415610acd5760405162461bcd60e51b815260206004820152602160248201527f4552433732313a20617070726f76616c20746f2063757272656e74206f776e656044820152603960f91b6064820152608401610a2e565b336001600160a01b0382161480610ae95750610ae98133612293565b610b5b5760405162461bcd60e51b815260206004820152603860248201527f4552433732313a20617070726f76652063616c6c6572206973206e6f74206f7760448201527f6e6572206e6f7220617070726f76656420666f7220616c6c00000000000000006064820152608401610a2e565b6109c18383612640565b610b6d61233b565b600260009054906101000a90046001600160a01b03166001600160a01b031663617da5f06040518163ffffffff1660e01b815260040160206040518083038186803b158015610bbb57600080fd5b505afa158015610bcf573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610bf39190613b46565b600180546001600160a01b0319166001600160a01b0392909216919091179055565b610c1d61233b565b604051632142170760e11b8152306004820152336024820152604481018290526001600160a01b038316906342842e0e90606401600060405180830381600087803b158015610c6b57600080fd5b505af1158015610c7f573d6000803e3d6000fd5b505050505050565b60045460009060ff1615610cad5760405162461bcd60e51b8152600401610a2e90613b63565b323314610ccc5760405162461bcd60e51b8152600401610a2e90613b83565b6110a65460ff161580610cf457503360009081526110a7602052604090205460ff1615156001145b610d3a5760405162461bcd60e51b8152602060048201526017602482015276283ab13634b19036b4b73a34b733903737ba1037b832b760491b6044820152606401610a2e565b60006003546005610d4b9190613bb2565b905080341015610d925760405162461bcd60e51b8152602060048201526012602482015271496e73756666696369656e742046756e647360701b6044820152606401610a2e565b610d9b83612395565b9392505050565b610dac33826126af565b610dc85760405162461bcd60e51b8152600401610a2e90613bd1565b6109c1838383612779565b6001600160a01b0382166000908152610fa760205260408120548210610e4f5760405162461bcd60e51b815260206004820152602b60248201527f455243373231456e756d657261626c653a206f776e657220696e646578206f7560448201526a74206f6620626f756e647360a81b6064820152608401610a2e565b6001600160a01b0383166000908152610fa760205260409020805483908110610e7a57610e7a613ac4565b9060005260206000200154905092915050565b6000546001600160a01b0316331480610ece5750336001600160a01b037f000000000000000000000000000000000000000000000000000000000000000016145b610f095760405162461bcd60e51b815260206004820152600c60248201526b155b985d5d1a1bdc9a5e995960a21b6044820152606401610a2e565b60006064610f18476028613bb2565b610f229190613c38565b6040519091506001600160a01b037f0000000000000000000000000000000000000000000000000000000000000000169082156108fc029083906000818181858888f19350505050158015610f7b573d6000803e3d6000fd5b50600080546040516001600160a01b03909116914780156108fc02929091818181858888f19350505050158015610fb6573d6000803e3d6000fd5b5050565b610fc261233b565b6004805460ff19169055565b6109c183838360405180602001604052806000815250611e6c565b610ff161233b565b6110a6805460ff19169055565b60045460009060ff16156110245760405162461bcd60e51b8152600401610a2e90613b63565b3233146110435760405162461bcd60e51b8152600401610a2e90613b83565b600260009054906101000a90046001600160a01b03166001600160a01b031663518302276040518163ffffffff1660e01b815260040160206040518083038186803b15801561109157600080fd5b505afa1580156110a5573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906110c99190613c4c565b6110e55760405162461bcd60e51b8152600401610a2e90613c69565b835160051461112a5760405162461bcd60e51b81526020600482015260116024820152705265717569726573203520436f6e646f7360781b6044820152606401610a2e565b600260009054906101000a90046001600160a01b03166001600160a01b031663a373f7616040518163ffffffff1660e01b815260040160206040518083038186803b15801561117857600080fd5b505afa15801561118c573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906111b09190613caa565b61ffff168361ffff16106111fe5760405162461bcd60e51b8152602060048201526015602482015274125b9d985b1a5908189858dad9dc9bdd5b99081a59605a1b6044820152606401610a2e565b60015460405163321556a360e11b81526001600160a01b039091169063642aad46906112309033908890600401613cc7565b600060405180830381600087803b15801561124a57600080fd5b505af115801561125e573d6000803e3d6000fd5b5050505061126b33612ace565b9050611275613528565b8460008151811061128857611288613ac4565b6020026020010151816000600581106112a3576112a3613ac4565b61ffff90921660209290920201528451859060019081106112c6576112c6613ac4565b6020026020010151816001600581106112e1576112e1613ac4565b61ffff909216602092909202015284518590600290811061130457611304613ac4565b60200260200101518160026005811061131f5761131f613ac4565b61ffff909216602092909202015284518590600390811061134257611342613ac4565b60200260200101518160036005811061135d5761135d613ac4565b61ffff909216602092909202015284518590600490811061138057611380613ac4565b60200260200101518160046005811061139b5761139b613ac4565b602002019061ffff16908161ffff168152505060405180606001604052808281526020018561ffff168152602001846001600160601b0319168152506110a883610fa081106113ec576113ec613ac4565b60020201600082015181600001906005611407929190613546565b5060208201516001909101805460409093015160601c62010000026001600160b01b031990931661ffff90921691909117919091179055509392505050565b60006114518261086d565b61146d5760405162461bcd60e51b8152600401610a2e90613d1d565b5090565b60045460ff16156114945760405162461bcd60e51b8152600401610a2e90613b63565b3233146114b35760405162461bcd60e51b8152600401610a2e90613b83565b600260009054906101000a90046001600160a01b03166001600160a01b031663518302276040518163ffffffff1660e01b815260040160206040518083038186803b15801561150157600080fd5b505afa158015611515573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906115399190613c4c565b6115555760405162461bcd60e51b8152600401610a2e90613c69565b61155f33826126af565b6115c25760405162461bcd60e51b815260206004820152602e60248201527f4552433732313a2063616c6c6572206973206e6f7420746f6b656e206f776e6560448201526d1c881b9bdc88185c1c1c9bdd995960921b6064820152608401610a2e565b60006110a882610fa081106115d9576115d9613ac4565b6002020190506000600560405190808252806020026020018201604052801561160c578160200160208202803683370190505b508254815191925061ffff1690829060009061162a5761162a613ac4565b6020908102919091010152815481516201000090910461ffff16908290600190811061165857611658613ac4565b60209081029190910101528154815164010000000090910461ffff16908290600290811061168857611688613ac4565b602090810291909101015281548151660100000000000090910461ffff1690829060039081106116ba576116ba613ac4565b6020908102919091010152815481516801000000000000000090910461ffff1690829060049081106116ee576116ee613ac4565b6020908102919091010152600154604051637a65e4e160e11b81526001600160a01b039091169063f4cbc9c29061172b9033908590600401613cc7565b600060405180830381600087803b15801561174557600080fd5b505af1158015611759573d6000803e3d6000fd5b5050505061176683612c62565b6110a883610fa0811061177b5761177b613ac4565b600202016000808201600061179291905060009055565b5060010180546001600160b01b0319169055505050565b60045460ff16156117cc5760405162461bcd60e51b8152600401610a2e90613b63565b3233146117eb5760405162461bcd60e51b8152600401610a2e90613b83565b6110a65460ff16158061181357503360009081526110a7602052604090205460ff1615156001145b6118595760405162461bcd60e51b8152602060048201526017602482015276283ab13634b19036b4b73a34b733903737ba1037b832b760491b6044820152606401610a2e565b600081600354600561186b9190613bb2565b6118759190613bb2565b9050803410156118bc5760405162461bcd60e51b8152602060048201526012602482015271496e73756666696369656e742046756e647360701b6044820152606401610a2e565b60005b828110156118e3576118d084612395565b50806118db81613b2b565b9150506118bf565b50505050565b6118f161233b565b6040516370a0823160e01b815230600482015281906001600160a01b0382169063a9059cbb90339083906370a082319060240160206040518083038186803b15801561193c57600080fd5b505afa158015611950573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906119749190613d48565b6040516001600160e01b031960e085901b1681526001600160a01b0390921660048301526024820152604401602060405180830381600087803b1580156119ba57600080fd5b505af11580156119ce573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906109c19190613c4c565b60006119fd8261086d565b611a495760405162461bcd60e51b815260206004820152601960248201527f4552433732313a204e6f6e6578697374656e7420746f6b656e000000000000006044820152606401610a2e565b600782610fa08110611a5d57611a5d613ac4565b01546001600160a01b031692915050565b600260009054906101000a90046001600160a01b03166001600160a01b031663518302276040518163ffffffff1660e01b815260040160206040518083038186803b158015611abc57600080fd5b505afa158015611ad0573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611af49190613c4c565b611b105760405162461bcd60e51b8152600401610a2e90613c69565b60005b818110156109c157611b3c838383818110611b3057611b30613ac4565b90506020020135611471565b80611b4681613b2b565b915050611b13565b611b5661233b565b611b5f8161086d565b611b7b5760405162461bcd60e51b8152600401610a2e90613d1d565b60006110a882610fa08110611b9257611b92613ac4565b6002020160010160026101000a8154816001600160a01b03021916908360601c021790555050565b611bc261233b565b611bcc6000612ee2565b565b611bd661233b565b6004805460ff19166001179055565b611bed61233b565b600355565b6006805461091190613ada565b611c0761233b565b60005b818110156109c15760016110a76000858585818110611c2b57611c2b613ac4565b9050602002016020810190611c4091906136e0565b6001600160a01b031681526020810191909152604001600020805460ff191691151591909117905580611c7281613b2b565b915050611c0a565b336001600160a01b0383161415611cd35760405162461bcd60e51b815260206004820152601960248201527f4552433732313a20617070726f766520746f2063616c6c6572000000000000006044820152606401610a2e565b3360008181526110a3602090815260408083206001600160a01b03871680855290835292819020805460ff191686151590811790915590519081529192917f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31910160405180910390a35050565b611d48613528565b611d518261086d565b611d6d5760405162461bcd60e51b8152600401610a2e90613d1d565b60006110a883610fa08110611d8457611d84613ac4565b6040805160a0810191829052600292909202929092019250908290600590826000855b82829054906101000a900461ffff1661ffff1681526020019060020190602082600101049283019260010382029150808411611da757509498975050505050505050565b611df361233b565b604051630f41a04d60e11b81523360048201526001600160a01b03821690631e83409a90602401602060405180830381600087803b158015611e3457600080fd5b505af1158015611e48573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610fb69190613d48565b611e7633836126af565b611e925760405162461bcd60e51b8152600401610a2e90613bd1565b6118e384848484612f32565b6060611ea98261086d565b611f0d5760405162461bcd60e51b815260206004820152602f60248201527f4552433732314d657461646174613a2055524920717565727920666f72206e6f60448201526e3732bc34b9ba32b73a103a37b5b2b760891b6064820152608401610a2e565b600260009054906101000a90046001600160a01b03166001600160a01b031663518302276040518163ffffffff1660e01b815260040160206040518083038186803b158015611f5b57600080fd5b505afa158015611f6f573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611f939190613c4c565b1561201857600254604051637d2fbae360e11b8152600481018490526001600160a01b039091169063fa5f75c69060240160006040518083038186803b158015611fdc57600080fd5b505afa158015611ff0573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f191682016040526108fe9190810190613d61565b600260009054906101000a90046001600160a01b03166001600160a01b0316630d7150a76040518163ffffffff1660e01b815260040160006040518083038186803b158015611fdc57600080fd5b919050565b60606120768261086d565b6120925760405162461bcd60e51b8152600401610a2e90613d1d565b600260009054906101000a90046001600160a01b03166001600160a01b031663518302276040518163ffffffff1660e01b815260040160206040518083038186803b1580156120e057600080fd5b505afa1580156120f4573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906121189190613c4c565b156121b7576108fe6110a883610fa0811061213557612135613ac4565b6040805160a08101918290529260029290920290910190600590826000855b82829054906101000a900461ffff1661ffff168152602001906002019060208260010104928301926001038202915080841161215457905050505050506110a884610fa081106121a6576121a6613ac4565b600202016001015461ffff16612f65565b505060408051602081019091526000815290565b6121d3613528565b6000806121df8461086d565b6121fb5760405162461bcd60e51b8152600401610a2e90613d1d565b60006110a885610fa0811061221257612212613ac4565b6040805160a0810191829052600292909202929092019250908290600590826000855b82829054906101000a900461ffff1661ffff1681526020019060020190602082600101049283019260010382029150808411612235579050505050600190930154919761ffff831697506201000090920460601b9550909350505050565b6001600160a01b0391821660009081526110a36020908152604080832093909416825291909152205460ff1690565b6122ca61233b565b6001600160a01b03811661232f5760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b6064820152608401610a2e565b61233881612ee2565b50565b6000546001600160a01b03163314611bcc5760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726044820152606401610a2e565b6000806110a454116123e95760405162461bcd60e51b815260206004820152601d60248201527f496e73756666696369656e7420737570706c7920617661696c61626c650000006044820152606401610a2e565b6000826123f7600143613dd8565b60405160609290921b6bffffffffffffffffffffffff1916602083015240603482015260540160408051808303601f1901815290829052805160209091012060015463481330b760e01b8352600483018290529092506000916001600160a01b039091169063481330b79060240160a060405180830381600087803b15801561247f57600080fd5b505af1158015612493573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906124b79190613def565b90506124c284612ace565b92506000600260009054906101000a90046001600160a01b03166001600160a01b031663a373f7616040518163ffffffff1660e01b815260040160206040518083038186803b15801561251457600080fd5b505afa158015612528573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061254c9190613caa565b61ffff16848460405160200161256c929190918252602082015260400190565b6040516020818303038152906040528051906020012060001c61258f9190613e76565b905060405180606001604052808381526020018261ffff16815260200160006001600160601b0319168152506110a885610fa081106125d0576125d0613ac4565b600202016000820151816000019060056125eb929190613546565b5060208201516001909101805460409093015160601c62010000026001600160b01b031990931661ffff909216919091179190911790556110a4805490600061263383613e8a565b9190505550505050919050565b60008181526110a26020526040902080546001600160a01b0319166001600160a01b0384169081179091558190612676826119f2565b6001600160a01b03167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a45050565b60006126ba8261086d565b61271b5760405162461bcd60e51b815260206004820152602c60248201527f4552433732313a206f70657261746f7220717565727920666f72206e6f6e657860448201526b34b9ba32b73a103a37b5b2b760a11b6064820152608401610a2e565b6000612726836119f2565b9050806001600160a01b0316846001600160a01b031614806127615750836001600160a01b0316612756846109c6565b6001600160a01b0316145b8061277157506127718185612293565b949350505050565b60045460ff161561279c5760405162461bcd60e51b8152600401610a2e90613b63565b826001600160a01b03166127af826119f2565b6001600160a01b0316146128175760405162461bcd60e51b815260206004820152602960248201527f4552433732313a207472616e73666572206f6620746f6b656e2074686174206960448201526839903737ba1037bbb760b91b6064820152608401610a2e565b6001600160a01b0382166128795760405162461bcd60e51b8152602060048201526024808201527f4552433732313a207472616e7366657220746f20746865207a65726f206164646044820152637265737360e01b6064820152608401610a2e565b612884600082612640565b6000610fa882610fa0811061289b5761289b613ac4565b601091828204019190066002029054906101000a900461ffff16905060006001826128c69190613ea1565b6001600160a01b0386166000908152610fa7602052604081205461ffff929092169250906128f690600190613dd8565b90508181146129b8576001600160a01b0386166000908152610fa76020526040812080548390811061292a5761292a613ac4565b9060005260206000200154905080610fa76000896001600160a01b03166001600160a01b03168152602001908152602001600020848154811061296f5761296f613ac4565b60009182526020909120015583610fa882610fa0811061299157612991613ac4565b601091828204019190066002026101000a81548161ffff021916908361ffff160217905550505b6001600160a01b0386166000908152610fa7602052604090208054806129e0576129e0613ec4565b6000828152602080822083016000199081018390559092019092556001600160a01b038716808352610fa7825260408320805460018101825581855292842090920187905590915254610fa885610fa08110612a3e57612a3e613ac4565b601091828204019190066002026101000a81548161ffff021916908361ffff16021790555084600785610fa08110612a7857612a78613ac4565b0180546001600160a01b0319166001600160a01b03928316179055604051859187811691908916907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef90600090a4505050505050565b612fe85460009015612b6857612fe88054612aeb90600190613dd8565b81548110612afb57612afb613ac4565b90600052602060002090601091828204019190066002029054906101000a900461ffff1661ffff169050612fe8805480612b3757612b37613ec4565b600082815260209020601060001990920191820401805461ffff6002600f8516026101000a02191690559055612b6e565b506110a5545b6001600160a01b0382166000818152610fa7602090815260408220805460018101825581845291832090910184905591905254610fa882610fa08110612bb657612bb6613ac4565b601091828204019190066002026101000a81548161ffff021916908361ffff16021790555081600782610fa08110612bf057612bf0613ac4565b0180546001600160a01b0319166001600160a01b03929092169190911790556110a58054906000612c2083613b2b565b909155505060405181906001600160a01b038416906000907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef908290a4919050565b612c6d600082612640565b6000600782610fa08110612c8357612c83613ac4565b01546001600160a01b031690506000610fa883610fa08110612ca757612ca7613ac4565b601091828204019190066002029054906101000a900461ffff1690506000600182612cd29190613ea1565b6001600160a01b0384166000908152610fa7602052604081205461ffff92909216925090612d0290600190613dd8565b9050818114612dc4576001600160a01b0384166000908152610fa760205260408120805483908110612d3657612d36613ac4565b9060005260206000200154905080610fa76000876001600160a01b03166001600160a01b031681526020019081526020016000208481548110612d7b57612d7b613ac4565b60009182526020909120015583610fa882610fa08110612d9d57612d9d613ac4565b601091828204019190066002026101000a81548161ffff021916908361ffff160217905550505b6001600160a01b0384166000908152610fa760205260409020805480612dec57612dec613ec4565b600190038181906000526020600020016000905590556000600786610fa08110612e1857612e18613ac4565b0180546001600160a01b0319166001600160a01b03929092169190911790556110a58054906000612e4883613e8a565b9091555050612fe8805460018101825560009182527fceffcf2d717e78747c18cbe919cfd22e3742ee7a6f52159cc37196fd9d57936460108204018054600f9092166002026101000a61ffff81810219909316928916029190911790556040518691906001600160a01b038716907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef908390a45050505050565b600080546001600160a01b038381166001600160a01b0319831681178455604051919092169283917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e09190a35050565b612f3d848484612779565b612f49848484846131dd565b6118e35760405162461bcd60e51b8152600401610a2e90613eda565b606060006040518060a00160405280607d8152602001614191607d9139905080600260009054906101000a90046001600160a01b03166001600160a01b0316632f8e9f426040518163ffffffff1660e01b815260040160006040518083038186803b158015612fd357600080fd5b505afa158015612fe7573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f1916820160405261300f9190810190613d61565b600260009054906101000a90046001600160a01b03166001600160a01b03166310b844636040518163ffffffff1660e01b815260040160006040518083038186803b15801561305d57600080fd5b505afa158015613071573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f191682016040526130999190810190613d61565b612fe954604051637bb7ca8760e11b815261ffff881660048201526001600160a01b039091169063f76f950e9060240160006040518083038186803b1580156130e157600080fd5b505afa1580156130f5573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f1916820160405261311d9190810190613d61565b6040516020016131309493929190613f2c565b60405160208183030381529060405290506000805b60058110156131b2578261316f87836005811061316457613164613ac4565b6020020151846132e1565b604051602001613180929190613ff0565b60408051601f19818403018152919052925061319e8261011761401f565b9150806131aa81613b2b565b915050613145565b50816040516020016131c4919061403c565b6040516020818303038152906040529250505092915050565b6000833b156132d657604051630a85bd0160e11b81526001600160a01b0385169063150b7a0290613218903390899088908890600401614066565b602060405180830381600087803b15801561323257600080fd5b505af1925050508015613262575060408051601f3d908101601f1916820190925261325f918101906140a3565b60015b6132bc573d808015613290576040519150601f19603f3d011682016040523d82523d6000602084013e613295565b606091505b5080516132b45760405162461bcd60e51b8152600401610a2e90613eda565b805181602001fd5b6001600160e01b031916630a85bd0160e11b149050612771565b506001949350505050565b612fe954604051637bb7ca8760e11b815261ffff831660048201526060916001600160a01b03169063f76f950e9060240160006040518083038186803b15801561332a57600080fd5b505afa15801561333e573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f191682016040526133669190810190613d61565b600260009054906101000a90046001600160a01b03166001600160a01b0316632f8e9f426040518163ffffffff1660e01b815260040160006040518083038186803b1580156133b457600080fd5b505afa1580156133c8573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f191682016040526133f09190810190613d61565b600260009054906101000a90046001600160a01b03166001600160a01b0316635057ca946040518163ffffffff1660e01b815260040160006040518083038186803b15801561343e57600080fd5b505afa158015613452573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f1916820160405261347a9190810190613d61565b612fe954604051637bb7ca8760e11b815261ffff881660048201526001600160a01b039091169063f76f950e9060240160006040518083038186803b1580156134c257600080fd5b505afa1580156134d6573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f191682016040526134fe9190810190613d61565b60405160200161351194939291906140c0565b604051602081830303815290604052905092915050565b6040518060a001604052806005906020820280368337509192915050565b6001830191839082156135cc5791602002820160005b8382111561359c57835183826101000a81548161ffff021916908361ffff160217905550926020019260020160208160010104928301926001030261355c565b80156135ca5782816101000a81549061ffff021916905560020160208160010104928301926001030261359c565b505b5061146d9291505b8082111561146d57600081556001016135d4565b6000602082840312156135fa57600080fd5b5035919050565b6001600160e01b03198116811461233857600080fd5b60006020828403121561362957600080fd5b8135610d9b81613601565b60005b8381101561364f578181015183820152602001613637565b838111156118e35750506000910152565b60008151808452613678816020860160208601613634565b601f01601f19169290920160200192915050565b602081526000610d9b6020830184613660565b6001600160a01b038116811461233857600080fd5b600080604083850312156136c757600080fd5b82356136d28161369f565b946020939093013593505050565b6000602082840312156136f257600080fd5b8135610d9b8161369f565b60008060006060848603121561371257600080fd5b833561371d8161369f565b9250602084013561372d8161369f565b929592945050506040919091013590565b634e487b7160e01b600052604160045260246000fd5b604051601f8201601f1916810167ffffffffffffffff8111828210171561377d5761377d61373e565b604052919050565b61ffff8116811461233857600080fd5b803561206681613785565b80356bffffffffffffffffffffffff198116811461206657600080fd5b6000806000606084860312156137d257600080fd5b833567ffffffffffffffff808211156137ea57600080fd5b818601915086601f8301126137fe57600080fd5b81356020828211156138125761381261373e565b8160051b9250613823818401613754565b828152928401810192818101908a85111561383d57600080fd5b948201945b8486101561385b57853582529482019490820190613842565b975061386a9050888201613795565b95505050505061387c604085016137a0565b90509250925092565b60008083601f84011261389757600080fd5b50813567ffffffffffffffff8111156138af57600080fd5b6020830191508360208260051b85010111156138ca57600080fd5b9250929050565b600080602083850312156138e457600080fd5b823567ffffffffffffffff8111156138fb57600080fd5b61390785828601613885565b90969095509350505050565b801515811461233857600080fd5b6000806040838503121561393457600080fd5b823561393f8161369f565b9150602083013561394f81613913565b809150509250929050565b8060005b60058110156118e357815161ffff1684526020938401939091019060010161395e565b60a081016108fe828461395a565b600067ffffffffffffffff8211156139a9576139a961373e565b50601f01601f191660200190565b600080600080608085870312156139cd57600080fd5b84356139d88161369f565b935060208501356139e88161369f565b925060408501359150606085013567ffffffffffffffff811115613a0b57600080fd5b8501601f81018713613a1c57600080fd5b8035613a2f613a2a8261398f565b613754565b818152886020838501011115613a4457600080fd5b8160208401602083013760006020838301015280935050505092959194509250565b60e08101613a74828661395a565b61ffff841660a08301526001600160601b0319831660c0830152949350505050565b60008060408385031215613aa957600080fd5b8235613ab48161369f565b9150602083013561394f8161369f565b634e487b7160e01b600052603260045260246000fd5b600181811c90821680613aee57607f821691505b60208210811415613b0f57634e487b7160e01b600052602260045260246000fd5b50919050565b634e487b7160e01b600052601160045260246000fd5b6000600019821415613b3f57613b3f613b15565b5060010190565b600060208284031215613b5857600080fd5b8151610d9b8161369f565b60208082526006908201526514185d5cd95960d21b604082015260600190565b60208082526015908201527410dbdb9d1c9858dd1cc81b9bdd08185b1b1bddd959605a1b604082015260600190565b6000816000190483118215151615613bcc57613bcc613b15565b500290565b60208082526031908201527f4552433732313a207472616e736665722063616c6c6572206973206e6f74206f6040820152701ddb995c881b9bdc88185c1c1c9bdd9959607a1b606082015260800190565b634e487b7160e01b600052601260045260246000fd5b600082613c4757613c47613c22565b500490565b600060208284031215613c5e57600080fd5b8151610d9b81613913565b60208082526021908201527f546865206d6574616461746120686173206e6f74207965742072657665616c656040820152601960fa1b606082015260800190565b600060208284031215613cbc57600080fd5b8151610d9b81613785565b6001600160a01b038316815260406020808301829052835191830182905260009184820191906060850190845b81811015613d1057845183529383019391830191600101613cf4565b5090979650505050505050565b6020808252601190820152702737b732bc34b9ba32b73a102a37b5b2b760791b604082015260600190565b600060208284031215613d5a57600080fd5b5051919050565b600060208284031215613d7357600080fd5b815167ffffffffffffffff811115613d8a57600080fd5b8201601f81018413613d9b57600080fd5b8051613da9613a2a8261398f565b818152856020838501011115613dbe57600080fd5b613dcf826020830160208601613634565b95945050505050565b600082821015613dea57613dea613b15565b500390565b600060a08284031215613e0157600080fd5b82601f830112613e1057600080fd5b60405160a0810181811067ffffffffffffffff82111715613e3357613e3361373e565b6040528060a0840185811115613e4857600080fd5b845b81811015613e6b578051613e5d81613785565b835260209283019201613e4a565b509195945050505050565b600082613e8557613e85613c22565b500690565b600081613e9957613e99613b15565b506000190190565b600061ffff83811690831681811015613ebc57613ebc613b15565b039392505050565b634e487b7160e01b600052603160045260246000fd5b60208082526032908201527f4552433732313a207472616e7366657220746f206e6f6e20455243373231526560408201527131b2b4bb32b91034b6b83632b6b2b73a32b960711b606082015260800190565b60008551613f3e818460208a01613634565b80830190507f3c696d61676520783d22302220793d2230222077696474683d223135303022208152723432b4b3b43a1e911a98181110343932b31e9160691b60208201528551613f95816033840160208a01613634565b8551910190613fab816033840160208901613634565b602f60f81b603392909101918201528351613fcd816034840160208801613634565b67173538339110179f60c11b60349290910191820152603c019695505050505050565b60008351614002818460208801613634565b835190830190614016818360208801613634565b01949350505050565b600061ffff80831681851680830382111561401657614016613b15565b6000825161404e818460208701613634565b651e17b9bb339f60d11b920191825250600601919050565b6001600160a01b038581168252841660208201526040810183905260806060820181905260009061409990830184613660565b9695505050505050565b6000602082840312156140b557600080fd5b8151610d9b81613601565b691e34b6b0b3b2903c1e9160b11b815284516000906140e681600a850160208a01613634565b7f2220793d22313034222077696474683d2233383522206865696768743d223338600a91840191820152681a9110343932b31e9160b91b602a8201528551614135816033840160208a01613634565b855191019061414b816033840160208901613634565b602f60f81b60339290910191820152835161416d816034840160208801613634565b67173837339110179f60c11b60349290910191820152603c01969550505050505056fe3c73766720786d6c6e733d22687474703a2f2f7777772e77332e6f72672f323030302f73766722207072657365727665417370656374526174696f3d22784d6964594d6964206d656574222076696577426f783d22302030203135303020353030222077696474683d223135303022206865696768743d22353030223ea264697066735822122016490d5dc10b8c017545bcf8245a05ac3577e8335eeddb4ec01d39c3a29a6e2964736f6c6343000809003300000000000000000000000017f04c54798bf104ecc5caa31a2041e55aa0683b0000000000000000000000003ee7fc9065f3efe3b6ab1894845e41146cb77385

Deployed Bytecode

0x6080604052600436106102875760003560e01c80636352211e1161015a578063a22cb465116100c1578063c87b56dd1161007a578063c87b56dd146107a7578063cf348425146107c7578063d9bcf10e146107e7578063e985e9c514610816578063efcb119514610836578063f2fde38b1461084d57600080fd5b8063a22cb465146106da578063a5e818ff146106fa578063a5eb6ff214610727578063a702283c14610747578063a81158c714610767578063b88d4fde1461078757600080fd5b80638456cb59116101135780638456cb591461063c5780638da5cb5b1461065157806391b7f5ed1461066f57806395d89b411461068f578063a00d7c2a146106a4578063a035b1fe146106c457600080fd5b80636352211e1461055157806368125a1b1461057157806369dbadb3146105b05780636e7ced0f146105d057806370a08231146105f0578063715018a61461062757600080fd5b80632f745c59116101fe5780634d263502116101b75780634d263502146104a45780634f6ccce7146104c457806358f1699d146104e457806358ff6917146105045780635c471995146105175780635c975abb1461053757600080fd5b80632f745c591461040a5780633ccfd60b1461042a5780633f4ba83a1461043f57806341718b381461045457806342842e0e1461046f57806345f7e06e1461048f57600080fd5b8063095ea7b311610250578063095ea7b31461035d57806309f4f97b1461037d5780630ce06b681461039257806318160ddd146103b25780632342408d146103d757806323b872dd146103ea57600080fd5b8062923f9e1461028c57806301ffc9a7146102c157806306fdde03146102e15780630790dfa914610303578063081812fc14610325575b600080fd5b34801561029857600080fd5b506102ac6102a73660046135e8565b61086d565b60405190151581526020015b60405180910390f35b3480156102cd57600080fd5b506102ac6102dc366004613617565b610897565b3480156102ed57600080fd5b506102f6610904565b6040516102b8919061368c565b34801561030f57600080fd5b5061032361031e3660046136b4565b610992565b005b34801561033157600080fd5b506103456103403660046135e8565b6109c6565b6040516001600160a01b0390911681526020016102b8565b34801561036957600080fd5b506103236103783660046136b4565b610a54565b34801561038957600080fd5b50610323610b65565b34801561039e57600080fd5b506103236103ad3660046136b4565b610c15565b3480156103be57600080fd5b506103c96110a55481565b6040519081526020016102b8565b6103c96103e53660046136e0565b610c87565b3480156103f657600080fd5b506103236104053660046136fd565b610da2565b34801561041657600080fd5b506103c96104253660046136b4565b610dd3565b34801561043657600080fd5b50610323610e8d565b34801561044b57600080fd5b50610323610fba565b34801561046057600080fd5b506110a6546102ac9060ff1681565b34801561047b57600080fd5b5061032361048a3660046136fd565b610fce565b34801561049b57600080fd5b50610323610fe9565b3480156104b057600080fd5b506103c96104bf3660046137bd565b610ffe565b3480156104d057600080fd5b506103c96104df3660046135e8565b611446565b3480156104f057600080fd5b506103236104ff3660046135e8565b611471565b6103236105123660046136b4565b6117a9565b34801561052357600080fd5b506103236105323660046136e0565b6118e9565b34801561054357600080fd5b506004546102ac9060ff1681565b34801561055d57600080fd5b5061034561056c3660046135e8565b6119f2565b34801561057d57600080fd5b506102ac61058c3660046136e0565b6001600160a01b031660009081526110a7602052604090205460ff16151560011490565b3480156105bc57600080fd5b506103236105cb3660046138d1565b611a6e565b3480156105dc57600080fd5b506103236105eb3660046135e8565b611b4e565b3480156105fc57600080fd5b506103c961060b3660046136e0565b6001600160a01b03166000908152610fa7602052604090205490565b34801561063357600080fd5b50610323611bba565b34801561064857600080fd5b50610323611bce565b34801561065d57600080fd5b506000546001600160a01b0316610345565b34801561067b57600080fd5b5061032361068a3660046135e8565b611be5565b34801561069b57600080fd5b506102f6611bf2565b3480156106b057600080fd5b506103236106bf3660046138d1565b611bff565b3480156106d057600080fd5b506103c960035481565b3480156106e657600080fd5b506103236106f5366004613921565b611c7a565b34801561070657600080fd5b5061071a6107153660046135e8565b611d40565b6040516102b89190613981565b34801561073357600080fd5b50600254610345906001600160a01b031681565b34801561075357600080fd5b50600154610345906001600160a01b031681565b34801561077357600080fd5b506103236107823660046136e0565b611deb565b34801561079357600080fd5b506103236107a23660046139b7565b611e6c565b3480156107b357600080fd5b506102f66107c23660046135e8565b611e9e565b3480156107d357600080fd5b506102f66107e23660046135e8565b61206b565b3480156107f357600080fd5b506108076108023660046135e8565b6121cb565b6040516102b893929190613a66565b34801561082257600080fd5b506102ac610831366004613a96565b612293565b34801561084257600080fd5b506103c96110a45481565b34801561085957600080fd5b506103236108683660046136e0565b6122c2565b600080600783610fa0811061088457610884613ac4565b01546001600160a01b0316141592915050565b60006001600160e01b031982166301ffc9a760e01b14806108c857506001600160e01b031982166380ac58cd60e01b145b806108e357506001600160e01b03198216635b5e139f60e01b145b806108fe57506001600160e01b0319821663780e9d6360e01b145b92915050565b6005805461091190613ada565b80601f016020809104026020016040519081016040528092919081815260200182805461093d90613ada565b801561098a5780601f1061095f5761010080835404028352916020019161098a565b820191906000526020600020905b81548152906001019060200180831161096d57829003601f168201915b505050505081565b61099a61233b565b60005b818110156109c1576109ae83612395565b50806109b981613b2b565b91505061099d565b505050565b60006109d18261086d565b610a375760405162461bcd60e51b815260206004820152602c60248201527f4552433732313a20617070726f76656420717565727920666f72206e6f6e657860448201526b34b9ba32b73a103a37b5b2b760a11b60648201526084015b60405180910390fd5b5060009081526110a260205260409020546001600160a01b031690565b6000610a5f826119f2565b9050806001600160a01b0316836001600160a01b03161415610acd5760405162461bcd60e51b815260206004820152602160248201527f4552433732313a20617070726f76616c20746f2063757272656e74206f776e656044820152603960f91b6064820152608401610a2e565b336001600160a01b0382161480610ae95750610ae98133612293565b610b5b5760405162461bcd60e51b815260206004820152603860248201527f4552433732313a20617070726f76652063616c6c6572206973206e6f74206f7760448201527f6e6572206e6f7220617070726f76656420666f7220616c6c00000000000000006064820152608401610a2e565b6109c18383612640565b610b6d61233b565b600260009054906101000a90046001600160a01b03166001600160a01b031663617da5f06040518163ffffffff1660e01b815260040160206040518083038186803b158015610bbb57600080fd5b505afa158015610bcf573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610bf39190613b46565b600180546001600160a01b0319166001600160a01b0392909216919091179055565b610c1d61233b565b604051632142170760e11b8152306004820152336024820152604481018290526001600160a01b038316906342842e0e90606401600060405180830381600087803b158015610c6b57600080fd5b505af1158015610c7f573d6000803e3d6000fd5b505050505050565b60045460009060ff1615610cad5760405162461bcd60e51b8152600401610a2e90613b63565b323314610ccc5760405162461bcd60e51b8152600401610a2e90613b83565b6110a65460ff161580610cf457503360009081526110a7602052604090205460ff1615156001145b610d3a5760405162461bcd60e51b8152602060048201526017602482015276283ab13634b19036b4b73a34b733903737ba1037b832b760491b6044820152606401610a2e565b60006003546005610d4b9190613bb2565b905080341015610d925760405162461bcd60e51b8152602060048201526012602482015271496e73756666696369656e742046756e647360701b6044820152606401610a2e565b610d9b83612395565b9392505050565b610dac33826126af565b610dc85760405162461bcd60e51b8152600401610a2e90613bd1565b6109c1838383612779565b6001600160a01b0382166000908152610fa760205260408120548210610e4f5760405162461bcd60e51b815260206004820152602b60248201527f455243373231456e756d657261626c653a206f776e657220696e646578206f7560448201526a74206f6620626f756e647360a81b6064820152608401610a2e565b6001600160a01b0383166000908152610fa760205260409020805483908110610e7a57610e7a613ac4565b9060005260206000200154905092915050565b6000546001600160a01b0316331480610ece5750336001600160a01b037f0000000000000000000000003ee7fc9065f3efe3b6ab1894845e41146cb7738516145b610f095760405162461bcd60e51b815260206004820152600c60248201526b155b985d5d1a1bdc9a5e995960a21b6044820152606401610a2e565b60006064610f18476028613bb2565b610f229190613c38565b6040519091506001600160a01b037f0000000000000000000000003ee7fc9065f3efe3b6ab1894845e41146cb77385169082156108fc029083906000818181858888f19350505050158015610f7b573d6000803e3d6000fd5b50600080546040516001600160a01b03909116914780156108fc02929091818181858888f19350505050158015610fb6573d6000803e3d6000fd5b5050565b610fc261233b565b6004805460ff19169055565b6109c183838360405180602001604052806000815250611e6c565b610ff161233b565b6110a6805460ff19169055565b60045460009060ff16156110245760405162461bcd60e51b8152600401610a2e90613b63565b3233146110435760405162461bcd60e51b8152600401610a2e90613b83565b600260009054906101000a90046001600160a01b03166001600160a01b031663518302276040518163ffffffff1660e01b815260040160206040518083038186803b15801561109157600080fd5b505afa1580156110a5573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906110c99190613c4c565b6110e55760405162461bcd60e51b8152600401610a2e90613c69565b835160051461112a5760405162461bcd60e51b81526020600482015260116024820152705265717569726573203520436f6e646f7360781b6044820152606401610a2e565b600260009054906101000a90046001600160a01b03166001600160a01b031663a373f7616040518163ffffffff1660e01b815260040160206040518083038186803b15801561117857600080fd5b505afa15801561118c573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906111b09190613caa565b61ffff168361ffff16106111fe5760405162461bcd60e51b8152602060048201526015602482015274125b9d985b1a5908189858dad9dc9bdd5b99081a59605a1b6044820152606401610a2e565b60015460405163321556a360e11b81526001600160a01b039091169063642aad46906112309033908890600401613cc7565b600060405180830381600087803b15801561124a57600080fd5b505af115801561125e573d6000803e3d6000fd5b5050505061126b33612ace565b9050611275613528565b8460008151811061128857611288613ac4565b6020026020010151816000600581106112a3576112a3613ac4565b61ffff90921660209290920201528451859060019081106112c6576112c6613ac4565b6020026020010151816001600581106112e1576112e1613ac4565b61ffff909216602092909202015284518590600290811061130457611304613ac4565b60200260200101518160026005811061131f5761131f613ac4565b61ffff909216602092909202015284518590600390811061134257611342613ac4565b60200260200101518160036005811061135d5761135d613ac4565b61ffff909216602092909202015284518590600490811061138057611380613ac4565b60200260200101518160046005811061139b5761139b613ac4565b602002019061ffff16908161ffff168152505060405180606001604052808281526020018561ffff168152602001846001600160601b0319168152506110a883610fa081106113ec576113ec613ac4565b60020201600082015181600001906005611407929190613546565b5060208201516001909101805460409093015160601c62010000026001600160b01b031990931661ffff90921691909117919091179055509392505050565b60006114518261086d565b61146d5760405162461bcd60e51b8152600401610a2e90613d1d565b5090565b60045460ff16156114945760405162461bcd60e51b8152600401610a2e90613b63565b3233146114b35760405162461bcd60e51b8152600401610a2e90613b83565b600260009054906101000a90046001600160a01b03166001600160a01b031663518302276040518163ffffffff1660e01b815260040160206040518083038186803b15801561150157600080fd5b505afa158015611515573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906115399190613c4c565b6115555760405162461bcd60e51b8152600401610a2e90613c69565b61155f33826126af565b6115c25760405162461bcd60e51b815260206004820152602e60248201527f4552433732313a2063616c6c6572206973206e6f7420746f6b656e206f776e6560448201526d1c881b9bdc88185c1c1c9bdd995960921b6064820152608401610a2e565b60006110a882610fa081106115d9576115d9613ac4565b6002020190506000600560405190808252806020026020018201604052801561160c578160200160208202803683370190505b508254815191925061ffff1690829060009061162a5761162a613ac4565b6020908102919091010152815481516201000090910461ffff16908290600190811061165857611658613ac4565b60209081029190910101528154815164010000000090910461ffff16908290600290811061168857611688613ac4565b602090810291909101015281548151660100000000000090910461ffff1690829060039081106116ba576116ba613ac4565b6020908102919091010152815481516801000000000000000090910461ffff1690829060049081106116ee576116ee613ac4565b6020908102919091010152600154604051637a65e4e160e11b81526001600160a01b039091169063f4cbc9c29061172b9033908590600401613cc7565b600060405180830381600087803b15801561174557600080fd5b505af1158015611759573d6000803e3d6000fd5b5050505061176683612c62565b6110a883610fa0811061177b5761177b613ac4565b600202016000808201600061179291905060009055565b5060010180546001600160b01b0319169055505050565b60045460ff16156117cc5760405162461bcd60e51b8152600401610a2e90613b63565b3233146117eb5760405162461bcd60e51b8152600401610a2e90613b83565b6110a65460ff16158061181357503360009081526110a7602052604090205460ff1615156001145b6118595760405162461bcd60e51b8152602060048201526017602482015276283ab13634b19036b4b73a34b733903737ba1037b832b760491b6044820152606401610a2e565b600081600354600561186b9190613bb2565b6118759190613bb2565b9050803410156118bc5760405162461bcd60e51b8152602060048201526012602482015271496e73756666696369656e742046756e647360701b6044820152606401610a2e565b60005b828110156118e3576118d084612395565b50806118db81613b2b565b9150506118bf565b50505050565b6118f161233b565b6040516370a0823160e01b815230600482015281906001600160a01b0382169063a9059cbb90339083906370a082319060240160206040518083038186803b15801561193c57600080fd5b505afa158015611950573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906119749190613d48565b6040516001600160e01b031960e085901b1681526001600160a01b0390921660048301526024820152604401602060405180830381600087803b1580156119ba57600080fd5b505af11580156119ce573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906109c19190613c4c565b60006119fd8261086d565b611a495760405162461bcd60e51b815260206004820152601960248201527f4552433732313a204e6f6e6578697374656e7420746f6b656e000000000000006044820152606401610a2e565b600782610fa08110611a5d57611a5d613ac4565b01546001600160a01b031692915050565b600260009054906101000a90046001600160a01b03166001600160a01b031663518302276040518163ffffffff1660e01b815260040160206040518083038186803b158015611abc57600080fd5b505afa158015611ad0573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611af49190613c4c565b611b105760405162461bcd60e51b8152600401610a2e90613c69565b60005b818110156109c157611b3c838383818110611b3057611b30613ac4565b90506020020135611471565b80611b4681613b2b565b915050611b13565b611b5661233b565b611b5f8161086d565b611b7b5760405162461bcd60e51b8152600401610a2e90613d1d565b60006110a882610fa08110611b9257611b92613ac4565b6002020160010160026101000a8154816001600160a01b03021916908360601c021790555050565b611bc261233b565b611bcc6000612ee2565b565b611bd661233b565b6004805460ff19166001179055565b611bed61233b565b600355565b6006805461091190613ada565b611c0761233b565b60005b818110156109c15760016110a76000858585818110611c2b57611c2b613ac4565b9050602002016020810190611c4091906136e0565b6001600160a01b031681526020810191909152604001600020805460ff191691151591909117905580611c7281613b2b565b915050611c0a565b336001600160a01b0383161415611cd35760405162461bcd60e51b815260206004820152601960248201527f4552433732313a20617070726f766520746f2063616c6c6572000000000000006044820152606401610a2e565b3360008181526110a3602090815260408083206001600160a01b03871680855290835292819020805460ff191686151590811790915590519081529192917f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31910160405180910390a35050565b611d48613528565b611d518261086d565b611d6d5760405162461bcd60e51b8152600401610a2e90613d1d565b60006110a883610fa08110611d8457611d84613ac4565b6040805160a0810191829052600292909202929092019250908290600590826000855b82829054906101000a900461ffff1661ffff1681526020019060020190602082600101049283019260010382029150808411611da757509498975050505050505050565b611df361233b565b604051630f41a04d60e11b81523360048201526001600160a01b03821690631e83409a90602401602060405180830381600087803b158015611e3457600080fd5b505af1158015611e48573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610fb69190613d48565b611e7633836126af565b611e925760405162461bcd60e51b8152600401610a2e90613bd1565b6118e384848484612f32565b6060611ea98261086d565b611f0d5760405162461bcd60e51b815260206004820152602f60248201527f4552433732314d657461646174613a2055524920717565727920666f72206e6f60448201526e3732bc34b9ba32b73a103a37b5b2b760891b6064820152608401610a2e565b600260009054906101000a90046001600160a01b03166001600160a01b031663518302276040518163ffffffff1660e01b815260040160206040518083038186803b158015611f5b57600080fd5b505afa158015611f6f573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611f939190613c4c565b1561201857600254604051637d2fbae360e11b8152600481018490526001600160a01b039091169063fa5f75c69060240160006040518083038186803b158015611fdc57600080fd5b505afa158015611ff0573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f191682016040526108fe9190810190613d61565b600260009054906101000a90046001600160a01b03166001600160a01b0316630d7150a76040518163ffffffff1660e01b815260040160006040518083038186803b158015611fdc57600080fd5b919050565b60606120768261086d565b6120925760405162461bcd60e51b8152600401610a2e90613d1d565b600260009054906101000a90046001600160a01b03166001600160a01b031663518302276040518163ffffffff1660e01b815260040160206040518083038186803b1580156120e057600080fd5b505afa1580156120f4573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906121189190613c4c565b156121b7576108fe6110a883610fa0811061213557612135613ac4565b6040805160a08101918290529260029290920290910190600590826000855b82829054906101000a900461ffff1661ffff168152602001906002019060208260010104928301926001038202915080841161215457905050505050506110a884610fa081106121a6576121a6613ac4565b600202016001015461ffff16612f65565b505060408051602081019091526000815290565b6121d3613528565b6000806121df8461086d565b6121fb5760405162461bcd60e51b8152600401610a2e90613d1d565b60006110a885610fa0811061221257612212613ac4565b6040805160a0810191829052600292909202929092019250908290600590826000855b82829054906101000a900461ffff1661ffff1681526020019060020190602082600101049283019260010382029150808411612235579050505050600190930154919761ffff831697506201000090920460601b9550909350505050565b6001600160a01b0391821660009081526110a36020908152604080832093909416825291909152205460ff1690565b6122ca61233b565b6001600160a01b03811661232f5760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b6064820152608401610a2e565b61233881612ee2565b50565b6000546001600160a01b03163314611bcc5760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726044820152606401610a2e565b6000806110a454116123e95760405162461bcd60e51b815260206004820152601d60248201527f496e73756666696369656e7420737570706c7920617661696c61626c650000006044820152606401610a2e565b6000826123f7600143613dd8565b60405160609290921b6bffffffffffffffffffffffff1916602083015240603482015260540160408051808303601f1901815290829052805160209091012060015463481330b760e01b8352600483018290529092506000916001600160a01b039091169063481330b79060240160a060405180830381600087803b15801561247f57600080fd5b505af1158015612493573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906124b79190613def565b90506124c284612ace565b92506000600260009054906101000a90046001600160a01b03166001600160a01b031663a373f7616040518163ffffffff1660e01b815260040160206040518083038186803b15801561251457600080fd5b505afa158015612528573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061254c9190613caa565b61ffff16848460405160200161256c929190918252602082015260400190565b6040516020818303038152906040528051906020012060001c61258f9190613e76565b905060405180606001604052808381526020018261ffff16815260200160006001600160601b0319168152506110a885610fa081106125d0576125d0613ac4565b600202016000820151816000019060056125eb929190613546565b5060208201516001909101805460409093015160601c62010000026001600160b01b031990931661ffff909216919091179190911790556110a4805490600061263383613e8a565b9190505550505050919050565b60008181526110a26020526040902080546001600160a01b0319166001600160a01b0384169081179091558190612676826119f2565b6001600160a01b03167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a45050565b60006126ba8261086d565b61271b5760405162461bcd60e51b815260206004820152602c60248201527f4552433732313a206f70657261746f7220717565727920666f72206e6f6e657860448201526b34b9ba32b73a103a37b5b2b760a11b6064820152608401610a2e565b6000612726836119f2565b9050806001600160a01b0316846001600160a01b031614806127615750836001600160a01b0316612756846109c6565b6001600160a01b0316145b8061277157506127718185612293565b949350505050565b60045460ff161561279c5760405162461bcd60e51b8152600401610a2e90613b63565b826001600160a01b03166127af826119f2565b6001600160a01b0316146128175760405162461bcd60e51b815260206004820152602960248201527f4552433732313a207472616e73666572206f6620746f6b656e2074686174206960448201526839903737ba1037bbb760b91b6064820152608401610a2e565b6001600160a01b0382166128795760405162461bcd60e51b8152602060048201526024808201527f4552433732313a207472616e7366657220746f20746865207a65726f206164646044820152637265737360e01b6064820152608401610a2e565b612884600082612640565b6000610fa882610fa0811061289b5761289b613ac4565b601091828204019190066002029054906101000a900461ffff16905060006001826128c69190613ea1565b6001600160a01b0386166000908152610fa7602052604081205461ffff929092169250906128f690600190613dd8565b90508181146129b8576001600160a01b0386166000908152610fa76020526040812080548390811061292a5761292a613ac4565b9060005260206000200154905080610fa76000896001600160a01b03166001600160a01b03168152602001908152602001600020848154811061296f5761296f613ac4565b60009182526020909120015583610fa882610fa0811061299157612991613ac4565b601091828204019190066002026101000a81548161ffff021916908361ffff160217905550505b6001600160a01b0386166000908152610fa7602052604090208054806129e0576129e0613ec4565b6000828152602080822083016000199081018390559092019092556001600160a01b038716808352610fa7825260408320805460018101825581855292842090920187905590915254610fa885610fa08110612a3e57612a3e613ac4565b601091828204019190066002026101000a81548161ffff021916908361ffff16021790555084600785610fa08110612a7857612a78613ac4565b0180546001600160a01b0319166001600160a01b03928316179055604051859187811691908916907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef90600090a4505050505050565b612fe85460009015612b6857612fe88054612aeb90600190613dd8565b81548110612afb57612afb613ac4565b90600052602060002090601091828204019190066002029054906101000a900461ffff1661ffff169050612fe8805480612b3757612b37613ec4565b600082815260209020601060001990920191820401805461ffff6002600f8516026101000a02191690559055612b6e565b506110a5545b6001600160a01b0382166000818152610fa7602090815260408220805460018101825581845291832090910184905591905254610fa882610fa08110612bb657612bb6613ac4565b601091828204019190066002026101000a81548161ffff021916908361ffff16021790555081600782610fa08110612bf057612bf0613ac4565b0180546001600160a01b0319166001600160a01b03929092169190911790556110a58054906000612c2083613b2b565b909155505060405181906001600160a01b038416906000907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef908290a4919050565b612c6d600082612640565b6000600782610fa08110612c8357612c83613ac4565b01546001600160a01b031690506000610fa883610fa08110612ca757612ca7613ac4565b601091828204019190066002029054906101000a900461ffff1690506000600182612cd29190613ea1565b6001600160a01b0384166000908152610fa7602052604081205461ffff92909216925090612d0290600190613dd8565b9050818114612dc4576001600160a01b0384166000908152610fa760205260408120805483908110612d3657612d36613ac4565b9060005260206000200154905080610fa76000876001600160a01b03166001600160a01b031681526020019081526020016000208481548110612d7b57612d7b613ac4565b60009182526020909120015583610fa882610fa08110612d9d57612d9d613ac4565b601091828204019190066002026101000a81548161ffff021916908361ffff160217905550505b6001600160a01b0384166000908152610fa760205260409020805480612dec57612dec613ec4565b600190038181906000526020600020016000905590556000600786610fa08110612e1857612e18613ac4565b0180546001600160a01b0319166001600160a01b03929092169190911790556110a58054906000612e4883613e8a565b9091555050612fe8805460018101825560009182527fceffcf2d717e78747c18cbe919cfd22e3742ee7a6f52159cc37196fd9d57936460108204018054600f9092166002026101000a61ffff81810219909316928916029190911790556040518691906001600160a01b038716907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef908390a45050505050565b600080546001600160a01b038381166001600160a01b0319831681178455604051919092169283917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e09190a35050565b612f3d848484612779565b612f49848484846131dd565b6118e35760405162461bcd60e51b8152600401610a2e90613eda565b606060006040518060a00160405280607d8152602001614191607d9139905080600260009054906101000a90046001600160a01b03166001600160a01b0316632f8e9f426040518163ffffffff1660e01b815260040160006040518083038186803b158015612fd357600080fd5b505afa158015612fe7573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f1916820160405261300f9190810190613d61565b600260009054906101000a90046001600160a01b03166001600160a01b03166310b844636040518163ffffffff1660e01b815260040160006040518083038186803b15801561305d57600080fd5b505afa158015613071573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f191682016040526130999190810190613d61565b612fe954604051637bb7ca8760e11b815261ffff881660048201526001600160a01b039091169063f76f950e9060240160006040518083038186803b1580156130e157600080fd5b505afa1580156130f5573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f1916820160405261311d9190810190613d61565b6040516020016131309493929190613f2c565b60405160208183030381529060405290506000805b60058110156131b2578261316f87836005811061316457613164613ac4565b6020020151846132e1565b604051602001613180929190613ff0565b60408051601f19818403018152919052925061319e8261011761401f565b9150806131aa81613b2b565b915050613145565b50816040516020016131c4919061403c565b6040516020818303038152906040529250505092915050565b6000833b156132d657604051630a85bd0160e11b81526001600160a01b0385169063150b7a0290613218903390899088908890600401614066565b602060405180830381600087803b15801561323257600080fd5b505af1925050508015613262575060408051601f3d908101601f1916820190925261325f918101906140a3565b60015b6132bc573d808015613290576040519150601f19603f3d011682016040523d82523d6000602084013e613295565b606091505b5080516132b45760405162461bcd60e51b8152600401610a2e90613eda565b805181602001fd5b6001600160e01b031916630a85bd0160e11b149050612771565b506001949350505050565b612fe954604051637bb7ca8760e11b815261ffff831660048201526060916001600160a01b03169063f76f950e9060240160006040518083038186803b15801561332a57600080fd5b505afa15801561333e573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f191682016040526133669190810190613d61565b600260009054906101000a90046001600160a01b03166001600160a01b0316632f8e9f426040518163ffffffff1660e01b815260040160006040518083038186803b1580156133b457600080fd5b505afa1580156133c8573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f191682016040526133f09190810190613d61565b600260009054906101000a90046001600160a01b03166001600160a01b0316635057ca946040518163ffffffff1660e01b815260040160006040518083038186803b15801561343e57600080fd5b505afa158015613452573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f1916820160405261347a9190810190613d61565b612fe954604051637bb7ca8760e11b815261ffff881660048201526001600160a01b039091169063f76f950e9060240160006040518083038186803b1580156134c257600080fd5b505afa1580156134d6573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f191682016040526134fe9190810190613d61565b60405160200161351194939291906140c0565b604051602081830303815290604052905092915050565b6040518060a001604052806005906020820280368337509192915050565b6001830191839082156135cc5791602002820160005b8382111561359c57835183826101000a81548161ffff021916908361ffff160217905550926020019260020160208160010104928301926001030261355c565b80156135ca5782816101000a81549061ffff021916905560020160208160010104928301926001030261359c565b505b5061146d9291505b8082111561146d57600081556001016135d4565b6000602082840312156135fa57600080fd5b5035919050565b6001600160e01b03198116811461233857600080fd5b60006020828403121561362957600080fd5b8135610d9b81613601565b60005b8381101561364f578181015183820152602001613637565b838111156118e35750506000910152565b60008151808452613678816020860160208601613634565b601f01601f19169290920160200192915050565b602081526000610d9b6020830184613660565b6001600160a01b038116811461233857600080fd5b600080604083850312156136c757600080fd5b82356136d28161369f565b946020939093013593505050565b6000602082840312156136f257600080fd5b8135610d9b8161369f565b60008060006060848603121561371257600080fd5b833561371d8161369f565b9250602084013561372d8161369f565b929592945050506040919091013590565b634e487b7160e01b600052604160045260246000fd5b604051601f8201601f1916810167ffffffffffffffff8111828210171561377d5761377d61373e565b604052919050565b61ffff8116811461233857600080fd5b803561206681613785565b80356bffffffffffffffffffffffff198116811461206657600080fd5b6000806000606084860312156137d257600080fd5b833567ffffffffffffffff808211156137ea57600080fd5b818601915086601f8301126137fe57600080fd5b81356020828211156138125761381261373e565b8160051b9250613823818401613754565b828152928401810192818101908a85111561383d57600080fd5b948201945b8486101561385b57853582529482019490820190613842565b975061386a9050888201613795565b95505050505061387c604085016137a0565b90509250925092565b60008083601f84011261389757600080fd5b50813567ffffffffffffffff8111156138af57600080fd5b6020830191508360208260051b85010111156138ca57600080fd5b9250929050565b600080602083850312156138e457600080fd5b823567ffffffffffffffff8111156138fb57600080fd5b61390785828601613885565b90969095509350505050565b801515811461233857600080fd5b6000806040838503121561393457600080fd5b823561393f8161369f565b9150602083013561394f81613913565b809150509250929050565b8060005b60058110156118e357815161ffff1684526020938401939091019060010161395e565b60a081016108fe828461395a565b600067ffffffffffffffff8211156139a9576139a961373e565b50601f01601f191660200190565b600080600080608085870312156139cd57600080fd5b84356139d88161369f565b935060208501356139e88161369f565b925060408501359150606085013567ffffffffffffffff811115613a0b57600080fd5b8501601f81018713613a1c57600080fd5b8035613a2f613a2a8261398f565b613754565b818152886020838501011115613a4457600080fd5b8160208401602083013760006020838301015280935050505092959194509250565b60e08101613a74828661395a565b61ffff841660a08301526001600160601b0319831660c0830152949350505050565b60008060408385031215613aa957600080fd5b8235613ab48161369f565b9150602083013561394f8161369f565b634e487b7160e01b600052603260045260246000fd5b600181811c90821680613aee57607f821691505b60208210811415613b0f57634e487b7160e01b600052602260045260246000fd5b50919050565b634e487b7160e01b600052601160045260246000fd5b6000600019821415613b3f57613b3f613b15565b5060010190565b600060208284031215613b5857600080fd5b8151610d9b8161369f565b60208082526006908201526514185d5cd95960d21b604082015260600190565b60208082526015908201527410dbdb9d1c9858dd1cc81b9bdd08185b1b1bddd959605a1b604082015260600190565b6000816000190483118215151615613bcc57613bcc613b15565b500290565b60208082526031908201527f4552433732313a207472616e736665722063616c6c6572206973206e6f74206f6040820152701ddb995c881b9bdc88185c1c1c9bdd9959607a1b606082015260800190565b634e487b7160e01b600052601260045260246000fd5b600082613c4757613c47613c22565b500490565b600060208284031215613c5e57600080fd5b8151610d9b81613913565b60208082526021908201527f546865206d6574616461746120686173206e6f74207965742072657665616c656040820152601960fa1b606082015260800190565b600060208284031215613cbc57600080fd5b8151610d9b81613785565b6001600160a01b038316815260406020808301829052835191830182905260009184820191906060850190845b81811015613d1057845183529383019391830191600101613cf4565b5090979650505050505050565b6020808252601190820152702737b732bc34b9ba32b73a102a37b5b2b760791b604082015260600190565b600060208284031215613d5a57600080fd5b5051919050565b600060208284031215613d7357600080fd5b815167ffffffffffffffff811115613d8a57600080fd5b8201601f81018413613d9b57600080fd5b8051613da9613a2a8261398f565b818152856020838501011115613dbe57600080fd5b613dcf826020830160208601613634565b95945050505050565b600082821015613dea57613dea613b15565b500390565b600060a08284031215613e0157600080fd5b82601f830112613e1057600080fd5b60405160a0810181811067ffffffffffffffff82111715613e3357613e3361373e565b6040528060a0840185811115613e4857600080fd5b845b81811015613e6b578051613e5d81613785565b835260209283019201613e4a565b509195945050505050565b600082613e8557613e85613c22565b500690565b600081613e9957613e99613b15565b506000190190565b600061ffff83811690831681811015613ebc57613ebc613b15565b039392505050565b634e487b7160e01b600052603160045260246000fd5b60208082526032908201527f4552433732313a207472616e7366657220746f206e6f6e20455243373231526560408201527131b2b4bb32b91034b6b83632b6b2b73a32b960711b606082015260800190565b60008551613f3e818460208a01613634565b80830190507f3c696d61676520783d22302220793d2230222077696474683d223135303022208152723432b4b3b43a1e911a98181110343932b31e9160691b60208201528551613f95816033840160208a01613634565b8551910190613fab816033840160208901613634565b602f60f81b603392909101918201528351613fcd816034840160208801613634565b67173538339110179f60c11b60349290910191820152603c019695505050505050565b60008351614002818460208801613634565b835190830190614016818360208801613634565b01949350505050565b600061ffff80831681851680830382111561401657614016613b15565b6000825161404e818460208701613634565b651e17b9bb339f60d11b920191825250600601919050565b6001600160a01b038581168252841660208201526040810183905260806060820181905260009061409990830184613660565b9695505050505050565b6000602082840312156140b557600080fd5b8151610d9b81613601565b691e34b6b0b3b2903c1e9160b11b815284516000906140e681600a850160208a01613634565b7f2220793d22313034222077696474683d2233383522206865696768743d223338600a91840191820152681a9110343932b31e9160b91b602a8201528551614135816033840160208a01613634565b855191019061414b816033840160208901613634565b602f60f81b60339290910191820152835161416d816034840160208801613634565b67173837339110179f60c11b60349290910191820152603c01969550505050505056fe3c73766720786d6c6e733d22687474703a2f2f7777772e77332e6f72672f323030302f73766722207072657365727665417370656374526174696f3d22784d6964594d6964206d656574222076696577426f783d22302030203135303020353030222077696474683d223135303022206865696768743d22353030223ea264697066735822122016490d5dc10b8c017545bcf8245a05ac3577e8335eeddb4ec01d39c3a29a6e2964736f6c63430008090033

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

00000000000000000000000017f04c54798bf104ecc5caa31a2041e55aa0683b0000000000000000000000003ee7fc9065f3efe3b6ab1894845e41146cb77385

-----Decoded View---------------
Arg [0] : metadataAddress (address): 0x17f04C54798bF104ECC5CAa31A2041E55aa0683b
Arg [1] : publisherAddress (address): 0x3EE7fC9065F3Efe3B6Ab1894845E41146CB77385

-----Encoded View---------------
2 Constructor Arguments found :
Arg [0] : 00000000000000000000000017f04c54798bf104ecc5caa31a2041e55aa0683b
Arg [1] : 0000000000000000000000003ee7fc9065f3efe3b6ab1894845e41146cb77385


Loading...
Loading
Loading...
Loading
[ Download: CSV Export  ]
[ Download: CSV Export  ]

A token is a representation of an on-chain or off-chain asset. The token page shows information such as price, total supply, holders, transfers and social links. Learn more about this page in our Knowledge Base.