ETH Price: $3,899.62 (-0.36%)

Token

FrankenMonsters (FM)
 

Overview

Max Total Supply

10,010 FM

Holders

4,763

Market

Volume (24H)

N/A

Min Price (24H)

N/A

Max Price (24H)

N/A
Balance
1 FM
0xdb91c0698aa2df02030b2dce58c322f4d29bed07
Loading...
Loading
Loading...
Loading
Loading...
Loading

Click here to update the token information / general information
# Exchange Pair Price  24H Volume % Volume

Similar Match Source Code
This contract matches the deployed Bytecode of the Source Code for Contract 0x17D2b92A...fA1C423b4
The constructor portion of the code might be different and could alter the actual behaviour of the contract

Contract Name:
FrankenMonsters

Compiler Version
v0.8.17+commit.8df45f5f

Optimization Enabled:
Yes with 200 runs

Other Settings:
default evmVersion
File 1 of 6 : FrankenMonsters.sol
// SPDX-License-Identifier: MIT

/**
 ______ _____            _   _ _  ________ _   _ __  __  ____  _   _  _____ _______ ______ _____   _____ 
|  ____|  __ \     /\   | \ | | |/ /  ____| \ | |  \/  |/ __ \| \ | |/ ____|__   __|  ____|  __ \ / ____|
| |__  | |__) |   /  \  |  \| | ' /| |__  |  \| | \  / | |  | |  \| | (___    | |  | |__  | |__) | (___  
|  __| |  _  /   / /\ \ | . ` |  < |  __| | . ` | |\/| | |  | | . ` |\___ \   | |  |  __| |  _  / \___ \ 
| |    | | \ \  / ____ \| |\  | . \| |____| |\  | |  | | |__| | |\  |____) |  | |  | |____| | \ \ ____) |
|_|    |_|  \_\/_/    \_\_| \_|_|\_\______|_| \_|_|  |_|\____/|_| \_|_____/   |_|  |______|_|  \_\_____/ 
                                                                                                         
 */

pragma solidity ^0.8.17;

import { ERC721 } from "solmate/src/tokens/ERC721.sol";
import { Owned } from 'solmate/src/auth/Owned.sol';
import { LibString } from 'solmate/src/utils/LibString.sol';
import { IFrankenPunks } from "./IFrankenPunks.sol";
import "./FrankenMonstersErrors.sol";

/**
 * @title FrankenMonsters contract
 * @author New Fundamentals, LLC
 *
 * @notice 10,000 NFT collection to support the original 10,000 NFT collection of 3D FrankenPunks
 */
contract FrankenMonsters is ERC721, Owned {
    using LibString for uint256;

    event SetContractURI(string contractURI);
    event SetBaseURI(string baseTokenURI);
    event SetIsRevealed(bool isRevealed);
    event SetRoyaltyInfo(address royaltyRecipient, uint256 royaltyAmountNumerator);
    event SetFrankenPunksContractAddress(address frankenPunksContractAddress);
    event Withdrew(uint256 balance);

    bytes4 private constant INTERFACE_ID_ERC2981 = 0x2a55205a;
    uint16 public constant STARTING_INDEX = 10000;
    uint8 public constant LEGENDARY_SUPPLY = 10;
    uint16 public constant MAX_SUPPLY = 10000 + LEGENDARY_SUPPLY;
    uint64 private constant ROYALTY_AMOUNT_DENOMINATOR = 1e18;
    
    bool internal _isRevealed;

    uint16 internal _totalSupply;

    string internal _contractURI;
    string internal _baseTokenURI;

    address internal _royaltyRecipient;
    uint256 internal _royaltyAmountNumerator;

    address internal _frankenPunksContractAddress;

    /**
     * @param baseTokenURI A string you want the token URI to be set to, will be used as placeholder URI until reveal
     * @param frankenPunksContractAddress The contract address to access FrankenPunks ownership from
     */
    constructor(
        string memory baseTokenURI,
        address frankenPunksContractAddress
    ) ERC721("FrankenMonsters", "FM") Owned(msg.sender) {
        _baseTokenURI = baseTokenURI;
        _frankenPunksContractAddress = frankenPunksContractAddress;
    }

    /**
     * @dev Define all interfaces this contract supports. Make sure to always leave the super call at the end.
     * 
     * @notice Check support for a specific interface.
     * 
     * @param interfaceId An interface ID in byte4 to check support for.
     * 
     * @return isSupported A boolean defining support for the interface ID.
     */
    function supportsInterface(bytes4 interfaceId) public view virtual override returns (bool) {
        return (
            interfaceId == INTERFACE_ID_ERC2981 ||
            super.supportsInterface(interfaceId)
        );
    }

    /**
     * @notice Get the contract's metadata.
     * 
     * @return contractURI A string that defines the contract's URI to obtain the contract's metadata.
     */
    function contractURI() external view returns (string memory) {
        return _contractURI;
    }

    /**
     * @notice Get the total current supply of tokens.
     * 
     * @return totalSupply A number of the current supply of tokens within this contract.
     */
    function totalSupply() external view returns (uint16) {
        return _totalSupply;
    }

    /**
     * @notice Get a token's metadata
     * 
     * @param tokenId The ID of the token you wish to get's metadata
     * 
     * @return tokenURI A string that defines the token's URI to obtain the token's metadata.
     */
    function tokenURI(uint256 tokenId) public view override returns (string memory) {
        if (_ownerOf[tokenId] == address(0)) {
            revert NonExistentToken(tokenId);
        }

        string memory baseURI = _baseTokenURI;

        if (!_isRevealed) {
            return baseURI;
        }

        return string(abi.encodePacked(baseURI, tokenId.toString(), ".json"));
    }

    /**
     * @dev Adapted from Nanopass: https://etherscan.io/address/0xf54cc94f1f2f5de012b6aa51f1e7ebdc43ef5afc#code
     * 
     * @notice Query tokens owned by an address, in a given range.
     *
     * @param owner An address you wish to query for.
     * @param startIndex The starting index of the range you wish to query through.
     * @param endIndex The ending index of the range you wish to query through.
     * 
     * @return tokenIds An array of token IDs within the range provided, that the address owns.
     */
    function tokensOfOwner(address owner, uint16 startIndex, uint16 endIndex) external view returns(uint16[] memory) {
        return _findTokensOfOwner(owner, startIndex, endIndex);
    }

    /**
     * @dev Adapted from Nanopass: https://etherscan.io/address/0xf54cc94f1f2f5de012b6aa51f1e7ebdc43ef5afc#code
     * 
     * @notice Query all tokens owned by an address.
     *
     * @param owner An address you wish to query for.
     * 
     * @return tokenIds An array of token IDs that the address owns.
     */
    function walletOfOwner(address owner) external view returns(uint16[] memory) {
        return _findTokensOfOwner(owner, _getMinTokenID(), _getMaxTokenID() + 1);
    }

    /**
     * @notice Implements ERC-2981 royalty info interface.
     * 
     * @param salePrice The sale price of the token.
     * 
     * @return royaltyInfo The royalty info consisting of (the address to pay, the amount to be paid).
     */
    function royaltyInfo(uint256 /* tokenId */, uint256 salePrice) external view returns (address, uint256) {
        return (_royaltyRecipient, salePrice * _royaltyAmountNumerator / ROYALTY_AMOUNT_DENOMINATOR);
    }

    /**
     * @notice Allows contract owner to set the contract URI. This is used to set metadata for thid-parties.
     * 
     * @param newContractURI A string you want the contract URI to be set to.
     */
    function setContractURI(string calldata newContractURI) external onlyOwner {
        _contractURI = newContractURI;
        emit SetContractURI(newContractURI);
    }

    /**
     * @notice Allows contract owner to set the base token URI. This is used in #tokenURI after reveal to compute the final URI of a token.
     * 
     * @param baseTokenURI A string you want the base token URI to be set to.
     */
    function setBaseURI(string calldata baseTokenURI) external onlyOwner {
        _baseTokenURI = baseTokenURI;
        emit SetBaseURI(baseTokenURI);
    }

    /**
     * @notice Allows contract owner to set if the tokens are revealed or not.
     * 
     * @param isRevealed A boolean value used to set if the contract should reveal the tokens or not.
     * @param baseTokenURI A string you want the base token URI to be set to.
     */
    function setIsRevealed(bool isRevealed, string calldata baseTokenURI) external onlyOwner {
        _baseTokenURI = baseTokenURI;
        _isRevealed = isRevealed;
        emit SetBaseURI(baseTokenURI);
        emit SetIsRevealed(isRevealed);
    }

    /**
     * @notice Allows contract owner to set royalty information.
     * 
     * @param royaltyRecipient An address to a wallet or contract who should get paid the royalties.
     * @param royaltyAmountNumerator A uint256 number used to calculate royalty amount.
     */
    function setRoyaltyInfo(address royaltyRecipient, uint256 royaltyAmountNumerator) external onlyOwner {
        _royaltyRecipient = royaltyRecipient;
        _royaltyAmountNumerator = royaltyAmountNumerator;
        emit SetRoyaltyInfo(royaltyRecipient, royaltyAmountNumerator);
    }

    /**
     * @notice Allows contract owner to set the FrankenPunks contrat address
     * 
     * @param frankenPunksContractAddress The FrankenPunks contract address
     */
    function setFrankenPunksContractAddress(address frankenPunksContractAddress) external onlyOwner {
        _frankenPunksContractAddress = frankenPunksContractAddress;
        emit SetFrankenPunksContractAddress(frankenPunksContractAddress);
    }

    /**
     * @notice Allows the contract owner to mint tokens and to airdrop all tokens to existing FrankenPunks holders.
     * 
     * @param numberToMint The number of tokens to mint
     * @param airdropEnabled A flag used to enable aidrops to FrankenPunks holders
     */
    function mintTokens(uint16 numberToMint, bool airdropEnabled) external onlyOwner {
        if (_totalSupply == MAX_SUPPLY) {
            revert AllTokensMinted();
        }

        if (numberToMint == 0) {
            revert MintZeroQuantity();
        }

        if (_totalSupply + numberToMint > MAX_SUPPLY) {
            revert  MintOverMaxSupply(numberToMint, MAX_SUPPLY - _totalSupply);   
        }

        IFrankenPunks frankenPunks = IFrankenPunks(_frankenPunksContractAddress);

        for (uint16 i = _totalSupply; i < _totalSupply + numberToMint; i++) {
            uint16 tokenId = STARTING_INDEX + i;
            address receiver = msg.sender;

            if (i < MAX_SUPPLY - LEGENDARY_SUPPLY && airdropEnabled) {
                try frankenPunks.ownerOf(i) returns (address frankenPunksOwner) {
                    receiver = frankenPunksOwner;
                } catch (bytes memory) {}
            }

            _mint(receiver, tokenId);
        }

        _totalSupply = _totalSupply + numberToMint;
    }

    /**
     * @notice Allows the contract owner to withdraw the balance of the contract.
     */
    function withdraw() external onlyOwner {
        uint256 balance = address(this).balance;
        payable(msg.sender).transfer(balance);
        emit Withdrew(balance);
    }

    /**
     * @dev We don't intend on external folks sending payments to this contract.
     * 
     * @notice Allow the contract to receive a transaction.
     */
    receive() external payable {}

    /**
     * @dev Takes an address and an index range and looks to return all owned token IDs.
     * 
     * @param owner An address you wish to query for.
     * @param startIndex The starting index of the range you wish to query through.
     * @param endIndex The ending index of the range you wish to query through.
     * 
     * @return tokenIds An array of token IDs within the range provided, that the address owns.
     */
    function _findTokensOfOwner(address owner, uint16 startIndex, uint16 endIndex) internal view returns(uint16[] memory) {
        if (_totalSupply == 0) {
            revert SearchNotPossible();
        }

        uint256 maxTokenID = _getMaxTokenID();

        if (endIndex < startIndex || startIndex > maxTokenID || endIndex > maxTokenID + 1) {
            revert SearchOutOfRange(startIndex, endIndex, _getMinTokenID(), maxTokenID);
        }

        uint256 tokenCount = balanceOf(owner);
        uint256 rangeCount = endIndex - startIndex;
        uint256 maxArraySize = rangeCount < tokenCount ? rangeCount : tokenCount;
        uint256 ownerIndex = 0;

        uint16[] memory ownerTokens = new uint16[](maxArraySize);
        
        for (uint16 tokenId = startIndex; tokenId < endIndex; tokenId++) {
            if (ownerIndex == maxArraySize) break;

            if (ownerOf(tokenId) == owner) {
                ownerTokens[ownerIndex] = tokenId;
                ownerIndex++;
            }
        }

        return ownerTokens;
    }

    /**
     * @dev Returns the smallest token ID.
     * 
     * @return minTokenId The smallest token ID.
     */
    function _getMinTokenID() internal view returns(uint16) {
        if (_totalSupply == 0) {
            return 0;
        }

        return STARTING_INDEX;
    }

    /**
     * @dev Returns the largest token ID.
     * 
     * @return minTokenId The largest token ID.
     */
    function _getMaxTokenID() internal view returns(uint16) {
        if (_totalSupply == 0) {
            return 0;
        }

        return STARTING_INDEX + _totalSupply - 1;
    }
}

File 2 of 6 : IFrankenPunks.sol
// SPDX-License-Identifier: MIT

pragma solidity ^0.8.17;

interface IFrankenPunks {
    function ownerOf(uint256 tokenId) external view returns(address);
    function balanceOf(address owner) external view returns(uint256);
}

File 3 of 6 : FrankenMonstersErrors.sol
// SPDX-License-Identifier: MIT

pragma solidity ^0.8.17;

error NonExistentToken(uint256 tokenId);
error MintZeroQuantity();
error MintOverMaxSupply(uint16 numberToMint, uint16 remainingSupply);
error AllTokensMinted();
error SearchNotPossible();
error SearchOutOfRange(uint16 startIndex, uint16 endIndex, uint16 minTokenIndex, uint256 maxTokenIndex);

File 4 of 6 : ERC721.sol
// SPDX-License-Identifier: AGPL-3.0-only
pragma solidity >=0.8.0;

/// @notice Modern, minimalist, and gas efficient ERC-721 implementation.
/// @author Solmate (https://github.com/transmissions11/solmate/blob/main/src/tokens/ERC721.sol)
abstract contract ERC721 {
    /*//////////////////////////////////////////////////////////////
                                 EVENTS
    //////////////////////////////////////////////////////////////*/

    event Transfer(address indexed from, address indexed to, uint256 indexed id);

    event Approval(address indexed owner, address indexed spender, uint256 indexed id);

    event ApprovalForAll(address indexed owner, address indexed operator, bool approved);

    /*//////////////////////////////////////////////////////////////
                         METADATA STORAGE/LOGIC
    //////////////////////////////////////////////////////////////*/

    string public name;

    string public symbol;

    function tokenURI(uint256 id) public view virtual returns (string memory);

    /*//////////////////////////////////////////////////////////////
                      ERC721 BALANCE/OWNER STORAGE
    //////////////////////////////////////////////////////////////*/

    mapping(uint256 => address) internal _ownerOf;

    mapping(address => uint256) internal _balanceOf;

    function ownerOf(uint256 id) public view virtual returns (address owner) {
        require((owner = _ownerOf[id]) != address(0), "NOT_MINTED");
    }

    function balanceOf(address owner) public view virtual returns (uint256) {
        require(owner != address(0), "ZERO_ADDRESS");

        return _balanceOf[owner];
    }

    /*//////////////////////////////////////////////////////////////
                         ERC721 APPROVAL STORAGE
    //////////////////////////////////////////////////////////////*/

    mapping(uint256 => address) public getApproved;

    mapping(address => mapping(address => bool)) public isApprovedForAll;

    /*//////////////////////////////////////////////////////////////
                               CONSTRUCTOR
    //////////////////////////////////////////////////////////////*/

    constructor(string memory _name, string memory _symbol) {
        name = _name;
        symbol = _symbol;
    }

    /*//////////////////////////////////////////////////////////////
                              ERC721 LOGIC
    //////////////////////////////////////////////////////////////*/

    function approve(address spender, uint256 id) public virtual {
        address owner = _ownerOf[id];

        require(msg.sender == owner || isApprovedForAll[owner][msg.sender], "NOT_AUTHORIZED");

        getApproved[id] = spender;

        emit Approval(owner, spender, id);
    }

    function setApprovalForAll(address operator, bool approved) public virtual {
        isApprovedForAll[msg.sender][operator] = approved;

        emit ApprovalForAll(msg.sender, operator, approved);
    }

    function transferFrom(
        address from,
        address to,
        uint256 id
    ) public virtual {
        require(from == _ownerOf[id], "WRONG_FROM");

        require(to != address(0), "INVALID_RECIPIENT");

        require(
            msg.sender == from || isApprovedForAll[from][msg.sender] || msg.sender == getApproved[id],
            "NOT_AUTHORIZED"
        );

        // Underflow of the sender's balance is impossible because we check for
        // ownership above and the recipient's balance can't realistically overflow.
        unchecked {
            _balanceOf[from]--;

            _balanceOf[to]++;
        }

        _ownerOf[id] = to;

        delete getApproved[id];

        emit Transfer(from, to, id);
    }

    function safeTransferFrom(
        address from,
        address to,
        uint256 id
    ) public virtual {
        transferFrom(from, to, id);

        require(
            to.code.length == 0 ||
                ERC721TokenReceiver(to).onERC721Received(msg.sender, from, id, "") ==
                ERC721TokenReceiver.onERC721Received.selector,
            "UNSAFE_RECIPIENT"
        );
    }

    function safeTransferFrom(
        address from,
        address to,
        uint256 id,
        bytes calldata data
    ) public virtual {
        transferFrom(from, to, id);

        require(
            to.code.length == 0 ||
                ERC721TokenReceiver(to).onERC721Received(msg.sender, from, id, data) ==
                ERC721TokenReceiver.onERC721Received.selector,
            "UNSAFE_RECIPIENT"
        );
    }

    /*//////////////////////////////////////////////////////////////
                              ERC165 LOGIC
    //////////////////////////////////////////////////////////////*/

    function supportsInterface(bytes4 interfaceId) public view virtual returns (bool) {
        return
            interfaceId == 0x01ffc9a7 || // ERC165 Interface ID for ERC165
            interfaceId == 0x80ac58cd || // ERC165 Interface ID for ERC721
            interfaceId == 0x5b5e139f; // ERC165 Interface ID for ERC721Metadata
    }

    /*//////////////////////////////////////////////////////////////
                        INTERNAL MINT/BURN LOGIC
    //////////////////////////////////////////////////////////////*/

    function _mint(address to, uint256 id) internal virtual {
        require(to != address(0), "INVALID_RECIPIENT");

        require(_ownerOf[id] == address(0), "ALREADY_MINTED");

        // Counter overflow is incredibly unrealistic.
        unchecked {
            _balanceOf[to]++;
        }

        _ownerOf[id] = to;

        emit Transfer(address(0), to, id);
    }

    function _burn(uint256 id) internal virtual {
        address owner = _ownerOf[id];

        require(owner != address(0), "NOT_MINTED");

        // Ownership check above ensures no underflow.
        unchecked {
            _balanceOf[owner]--;
        }

        delete _ownerOf[id];

        delete getApproved[id];

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

    /*//////////////////////////////////////////////////////////////
                        INTERNAL SAFE MINT LOGIC
    //////////////////////////////////////////////////////////////*/

    function _safeMint(address to, uint256 id) internal virtual {
        _mint(to, id);

        require(
            to.code.length == 0 ||
                ERC721TokenReceiver(to).onERC721Received(msg.sender, address(0), id, "") ==
                ERC721TokenReceiver.onERC721Received.selector,
            "UNSAFE_RECIPIENT"
        );
    }

    function _safeMint(
        address to,
        uint256 id,
        bytes memory data
    ) internal virtual {
        _mint(to, id);

        require(
            to.code.length == 0 ||
                ERC721TokenReceiver(to).onERC721Received(msg.sender, address(0), id, data) ==
                ERC721TokenReceiver.onERC721Received.selector,
            "UNSAFE_RECIPIENT"
        );
    }
}

/// @notice A generic interface for a contract which properly accepts ERC721 tokens.
/// @author Solmate (https://github.com/transmissions11/solmate/blob/main/src/tokens/ERC721.sol)
abstract contract ERC721TokenReceiver {
    function onERC721Received(
        address,
        address,
        uint256,
        bytes calldata
    ) external virtual returns (bytes4) {
        return ERC721TokenReceiver.onERC721Received.selector;
    }
}

File 5 of 6 : Owned.sol
// SPDX-License-Identifier: AGPL-3.0-only
pragma solidity >=0.8.0;

/// @notice Simple single owner authorization mixin.
/// @author Solmate (https://github.com/transmissions11/solmate/blob/main/src/auth/Owned.sol)
abstract contract Owned {
    /*//////////////////////////////////////////////////////////////
                                 EVENTS
    //////////////////////////////////////////////////////////////*/

    event OwnerUpdated(address indexed user, address indexed newOwner);

    /*//////////////////////////////////////////////////////////////
                            OWNERSHIP STORAGE
    //////////////////////////////////////////////////////////////*/

    address public owner;

    modifier onlyOwner() virtual {
        require(msg.sender == owner, "UNAUTHORIZED");

        _;
    }

    /*//////////////////////////////////////////////////////////////
                               CONSTRUCTOR
    //////////////////////////////////////////////////////////////*/

    constructor(address _owner) {
        owner = _owner;

        emit OwnerUpdated(address(0), _owner);
    }

    /*//////////////////////////////////////////////////////////////
                             OWNERSHIP LOGIC
    //////////////////////////////////////////////////////////////*/

    function setOwner(address newOwner) public virtual onlyOwner {
        owner = newOwner;

        emit OwnerUpdated(msg.sender, newOwner);
    }
}

File 6 of 6 : LibString.sol
// SPDX-License-Identifier: MIT
pragma solidity >=0.8.0;

/// @notice Efficient library for creating string representations of integers.
/// @author Solmate (https://github.com/Rari-Capital/solmate/blob/main/src/utils/LibString.sol)
library LibString {
    function toString(uint256 value) internal pure returns (string memory str) {
        assembly {
            // The maximum value of a uint256 contains 78 digits (1 byte per digit), but we allocate 160 bytes
            // to keep the free memory pointer word aligned. We'll need 1 word for the length, 1 word for the
            // trailing zeros padding, and 3 other words for a max of 78 digits. In total: 5 * 32 = 160 bytes.
            let newFreeMemoryPointer := add(mload(0x40), 160)

            // Update the free memory pointer to avoid overriding our string.
            mstore(0x40, newFreeMemoryPointer)

            // Assign str to the end of the zone of newly allocated memory.
            str := sub(newFreeMemoryPointer, 32)

            // Clean the last word of memory it may not be overwritten.
            mstore(str, 0)

            // Cache the end of the memory to calculate the length later.
            let end := str

            // We write the string from rightmost digit to leftmost digit.
            // The following is essentially a do-while loop that also handles the zero case.
            // prettier-ignore
            for { let temp := value } 1 {} {
                // Move the pointer 1 byte to the left.
                str := sub(str, 1)

                // Write the character to the pointer.
                // The ASCII index of the '0' character is 48.
                mstore8(str, add(48, mod(temp, 10)))

                // Keep dividing temp until zero.
                temp := div(temp, 10)

                 // prettier-ignore
                if iszero(temp) { break }
            }

            // Compute and cache the final total length of the string.
            let length := sub(end, str)

            // Move the pointer 32 bytes leftwards to make room for the length.
            str := sub(str, 32)

            // Store the string's length at the start of memory allocated for our string.
            mstore(str, length)
        }
    }
}

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

Contract Security Audit

Contract ABI

[{"inputs":[{"internalType":"string","name":"baseTokenURI","type":"string"},{"internalType":"address","name":"frankenPunksContractAddress","type":"address"}],"stateMutability":"nonpayable","type":"constructor"},{"inputs":[],"name":"AllTokensMinted","type":"error"},{"inputs":[{"internalType":"uint16","name":"numberToMint","type":"uint16"},{"internalType":"uint16","name":"remainingSupply","type":"uint16"}],"name":"MintOverMaxSupply","type":"error"},{"inputs":[],"name":"MintZeroQuantity","type":"error"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"NonExistentToken","type":"error"},{"inputs":[],"name":"SearchNotPossible","type":"error"},{"inputs":[{"internalType":"uint16","name":"startIndex","type":"uint16"},{"internalType":"uint16","name":"endIndex","type":"uint16"},{"internalType":"uint16","name":"minTokenIndex","type":"uint16"},{"internalType":"uint256","name":"maxTokenIndex","type":"uint256"}],"name":"SearchOutOfRange","type":"error"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"spender","type":"address"},{"indexed":true,"internalType":"uint256","name":"id","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":"user","type":"address"},{"indexed":true,"internalType":"address","name":"newOwner","type":"address"}],"name":"OwnerUpdated","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"string","name":"baseTokenURI","type":"string"}],"name":"SetBaseURI","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"string","name":"contractURI","type":"string"}],"name":"SetContractURI","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"frankenPunksContractAddress","type":"address"}],"name":"SetFrankenPunksContractAddress","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"bool","name":"isRevealed","type":"bool"}],"name":"SetIsRevealed","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"royaltyRecipient","type":"address"},{"indexed":false,"internalType":"uint256","name":"royaltyAmountNumerator","type":"uint256"}],"name":"SetRoyaltyInfo","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":"id","type":"uint256"}],"name":"Transfer","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"balance","type":"uint256"}],"name":"Withdrew","type":"event"},{"inputs":[],"name":"LEGENDARY_SUPPLY","outputs":[{"internalType":"uint8","name":"","type":"uint8"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"MAX_SUPPLY","outputs":[{"internalType":"uint16","name":"","type":"uint16"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"STARTING_INDEX","outputs":[{"internalType":"uint16","name":"","type":"uint16"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"spender","type":"address"},{"internalType":"uint256","name":"id","type":"uint256"}],"name":"approve","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"}],"name":"balanceOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"contractURI","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"getApproved","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"},{"internalType":"address","name":"","type":"address"}],"name":"isApprovedForAll","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint16","name":"numberToMint","type":"uint16"},{"internalType":"bool","name":"airdropEnabled","type":"bool"}],"name":"mintTokens","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"name","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"id","type":"uint256"}],"name":"ownerOf","outputs":[{"internalType":"address","name":"owner","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"},{"internalType":"uint256","name":"salePrice","type":"uint256"}],"name":"royaltyInfo","outputs":[{"internalType":"address","name":"","type":"address"},{"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":"id","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":"id","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":"string","name":"baseTokenURI","type":"string"}],"name":"setBaseURI","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string","name":"newContractURI","type":"string"}],"name":"setContractURI","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"frankenPunksContractAddress","type":"address"}],"name":"setFrankenPunksContractAddress","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bool","name":"isRevealed","type":"bool"},{"internalType":"string","name":"baseTokenURI","type":"string"}],"name":"setIsRevealed","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"newOwner","type":"address"}],"name":"setOwner","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"royaltyRecipient","type":"address"},{"internalType":"uint256","name":"royaltyAmountNumerator","type":"uint256"}],"name":"setRoyaltyInfo","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes4","name":"interfaceId","type":"bytes4"}],"name":"supportsInterface","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"symbol","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"tokenURI","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"uint16","name":"startIndex","type":"uint16"},{"internalType":"uint16","name":"endIndex","type":"uint16"}],"name":"tokensOfOwner","outputs":[{"internalType":"uint16[]","name":"","type":"uint16[]"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalSupply","outputs":[{"internalType":"uint16","name":"","type":"uint16"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"id","type":"uint256"}],"name":"transferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"}],"name":"walletOfOwner","outputs":[{"internalType":"uint16[]","name":"","type":"uint16[]"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"withdraw","outputs":[],"stateMutability":"nonpayable","type":"function"},{"stateMutability":"payable","type":"receive"}]

60806040523480156200001157600080fd5b506040516200240138038062002401833981016040819052620000349162000150565b336040518060400160405280600f81526020016e4672616e6b656e4d6f6e737465727360881b81525060405180604001604052806002815260200161464d60f01b8152508160009081620000899190620002c7565b506001620000988282620002c7565b5050600680546001600160a01b0319166001600160a01b0384169081179091556040519091506000907f8292fce18fa69edf4db7b94ea2e58241df0ae57f97e0a6c9b29067028bf92d76908290a3506008620000f58382620002c7565b50600b80546001600160a01b0319166001600160a01b03929092169190911790555062000393565b634e487b7160e01b600052604160045260246000fd5b80516001600160a01b03811681146200014b57600080fd5b919050565b600080604083850312156200016457600080fd5b82516001600160401b03808211156200017c57600080fd5b818501915085601f8301126200019157600080fd5b815181811115620001a657620001a66200011d565b604051601f8201601f19908116603f01168101908382118183101715620001d157620001d16200011d565b81604052828152602093508884848701011115620001ee57600080fd5b600091505b82821015620002125784820184015181830185015290830190620001f3565b60008484830101528096505050506200022d81860162000133565b925050509250929050565b600181811c908216806200024d57607f821691505b6020821081036200026e57634e487b7160e01b600052602260045260246000fd5b50919050565b601f821115620002c257600081815260208120601f850160051c810160208610156200029d5750805b601f850160051c820191505b81811015620002be57828155600101620002a9565b5050505b505050565b81516001600160401b03811115620002e357620002e36200011d565b620002fb81620002f4845462000238565b8462000274565b602080601f8311600181146200033357600084156200031a5750858301515b600019600386901b1c1916600185901b178555620002be565b600085815260208120601f198616915b82811015620003645788860151825594840194600190910190840162000343565b5085821015620003835787850151600019600388901b60f8161c191681555b5050505050600190811b01905550565b61205e80620003a36000396000f3fe6080604052600436106101d15760003560e01c80636ab65915116100f7578063a32deb8711610095578063e2e784d511610064578063e2e784d514610593578063e8a3d485146105b3578063e985e9c5146105c8578063f7de95e41461060357600080fd5b8063a32deb8714610513578063b88d4fde14610533578063c0ec0a8114610553578063c87b56dd1461057357600080fd5b8063938e3d7b116100d1578063938e3d7b1461049e5780639498d7eb146104be57806395d89b41146104de578063a22cb465146104f357600080fd5b80636ab659151461042957806370a08231146104505780638da5cb5b1461047e57600080fd5b806323b872dd1161016f57806342842e0e1161013e57806342842e0e1461039c578063438b6300146103bc57806355f804b3146103e95780636352211e1461040957600080fd5b806323b872dd146103135780632a55205a1461033357806332cb6b0c146103725780633ccfd60b1461038757600080fd5b8063095ea7b3116101ab578063095ea7b3146102825780630eaef989146102a457806313af4035146102c457806318160ddd146102e457600080fd5b806301ffc9a7146101dd57806306fdde0314610212578063081812fc1461023457600080fd5b366101d857005b600080fd5b3480156101e957600080fd5b506101fd6101f83660046118e8565b610619565b60405190151581526020015b60405180910390f35b34801561021e57600080fd5b50610227610644565b6040516102099190611930565b34801561024057600080fd5b5061026a61024f366004611963565b6004602052600090815260409020546001600160a01b031681565b6040516001600160a01b039091168152602001610209565b34801561028e57600080fd5b506102a261029d366004611991565b6106d2565b005b3480156102b057600080fd5b506102a26102bf3660046119bd565b6107b9565b3480156102d057600080fd5b506102a26102df3660046119bd565b610838565b3480156102f057600080fd5b50600654600160a81b900461ffff165b60405161ffff9091168152602001610209565b34801561031f57600080fd5b506102a261032e3660046119da565b6108ae565b34801561033f57600080fd5b5061035361034e366004611a1b565b610a75565b604080516001600160a01b039093168352602083019190915201610209565b34801561037e57600080fd5b50610300610ab6565b34801561039357600080fd5b506102a2610ac6565b3480156103a857600080fd5b506102a26103b73660046119da565b610b50565b3480156103c857600080fd5b506103dc6103d73660046119bd565b610c48565b6040516102099190611a3d565b3480156103f557600080fd5b506102a2610404366004611ac7565b610c6e565b34801561041557600080fd5b5061026a610424366004611963565b610ce3565b34801561043557600080fd5b5061043e600a81565b60405160ff9091168152602001610209565b34801561045c57600080fd5b5061047061046b3660046119bd565b610d3a565b604051908152602001610209565b34801561048a57600080fd5b5060065461026a906001600160a01b031681565b3480156104aa57600080fd5b506102a26104b9366004611ac7565b610d9d565b3480156104ca57600080fd5b506102a26104d9366004611b19565b610e06565b3480156104ea57600080fd5b50610227610ec9565b3480156104ff57600080fd5b506102a261050e366004611b6c565b610ed6565b34801561051f57600080fd5b506102a261052e366004611bb3565b610f42565b34801561053f57600080fd5b506102a261054e366004611bcf565b6111d9565b34801561055f57600080fd5b506103dc61056e366004611c42565b6112c1565b34801561057f57600080fd5b5061022761058e366004611963565b6112d6565b34801561059f57600080fd5b506102a26105ae366004611991565b6113ec565b3480156105bf57600080fd5b5061022761146f565b3480156105d457600080fd5b506101fd6105e3366004611c87565b600560209081526000928352604080842090915290825290205460ff1681565b34801561060f57600080fd5b5061030061271081565b60006001600160e01b0319821663152a902d60e11b148061063e575061063e82611501565b92915050565b6000805461065190611cc0565b80601f016020809104026020016040519081016040528092919081815260200182805461067d90611cc0565b80156106ca5780601f1061069f576101008083540402835291602001916106ca565b820191906000526020600020905b8154815290600101906020018083116106ad57829003601f168201915b505050505081565b6000818152600260205260409020546001600160a01b03163381148061071b57506001600160a01b038116600090815260056020908152604080832033845290915290205460ff165b61075d5760405162461bcd60e51b815260206004820152600e60248201526d1393d517d055551213d49256915160921b60448201526064015b60405180910390fd5b60008281526004602052604080822080546001600160a01b0319166001600160a01b0387811691821790925591518593918516917f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92591a4505050565b6006546001600160a01b031633146107e35760405162461bcd60e51b815260040161075490611cfa565b600b80546001600160a01b0319166001600160a01b0383169081179091556040519081527f14b0885b935ef84d2182c33a0fc2314230e46e8eeb3a47951e9ad117a52fcf7a906020015b60405180910390a150565b6006546001600160a01b031633146108625760405162461bcd60e51b815260040161075490611cfa565b600680546001600160a01b0319166001600160a01b03831690811790915560405133907f8292fce18fa69edf4db7b94ea2e58241df0ae57f97e0a6c9b29067028bf92d7690600090a350565b6000818152600260205260409020546001600160a01b038481169116146109045760405162461bcd60e51b815260206004820152600a60248201526957524f4e475f46524f4d60b01b6044820152606401610754565b6001600160a01b03821661094e5760405162461bcd60e51b81526020600482015260116024820152701253959053125117d49150d25412515395607a1b6044820152606401610754565b336001600160a01b038416148061098857506001600160a01b038316600090815260056020908152604080832033845290915290205460ff165b806109a957506000818152600460205260409020546001600160a01b031633145b6109e65760405162461bcd60e51b815260206004820152600e60248201526d1393d517d055551213d49256915160921b6044820152606401610754565b6001600160a01b0380841660008181526003602090815260408083208054600019019055938616808352848320805460010190558583526002825284832080546001600160a01b03199081168317909155600490925284832080549092169091559251849392917fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef91a4505050565b600954600a5460009182916001600160a01b0390911690670de0b6b3a764000090610aa09086611d36565b610aaa9190611d4d565b915091505b9250929050565b610ac3600a612710611d6f565b81565b6006546001600160a01b03163314610af05760405162461bcd60e51b815260040161075490611cfa565b6040514790339082156108fc029083906000818181858888f19350505050158015610b1f573d6000803e3d6000fd5b506040518181527fb6b476da71cea8275cac6b1720c04966afaff5e637472cedb6cbd32c43a232519060200161082d565b610b5b8383836108ae565b6001600160a01b0382163b1580610c045750604051630a85bd0160e11b8082523360048301526001600160a01b03858116602484015260448301849052608060648401526000608484015290919084169063150b7a029060a4016020604051808303816000875af1158015610bd4573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610bf89190611d91565b6001600160e01b031916145b610c435760405162461bcd60e51b815260206004820152601060248201526f155394d0519157d49150d2541251539560821b6044820152606401610754565b505050565b606061063e82610c5661154f565b610c5e611573565b610c69906001611d6f565b6115bc565b6006546001600160a01b03163314610c985760405162461bcd60e51b815260040161075490611cfa565b6008610ca5828483611e12565b507f23c8c9488efebfd474e85a7956de6f39b17c7ab88502d42a623db2d8e382bbaa8282604051610cd7929190611efb565b60405180910390a15050565b6000818152600260205260409020546001600160a01b031680610d355760405162461bcd60e51b815260206004820152600a6024820152691393d517d3525395115160b21b6044820152606401610754565b919050565b60006001600160a01b038216610d815760405162461bcd60e51b815260206004820152600c60248201526b5a45524f5f4144445245535360a01b6044820152606401610754565b506001600160a01b031660009081526003602052604090205490565b6006546001600160a01b03163314610dc75760405162461bcd60e51b815260040161075490611cfa565b6007610dd4828483611e12565b507f5ca9f750836b0b7efdace104f07b5c9f0df0650c0fd24f5163e99044ae36ea528282604051610cd7929190611efb565b6006546001600160a01b03163314610e305760405162461bcd60e51b815260040161075490611cfa565b6008610e3d828483611e12565b506006805460ff60a01b1916600160a01b851515021790556040517f23c8c9488efebfd474e85a7956de6f39b17c7ab88502d42a623db2d8e382bbaa90610e879084908490611efb565b60405180910390a160405183151581527f40dcfa5db899ec74bc8371886cd6b7550aa92fd52a425b9c498a839183f2886c9060200160405180910390a1505050565b6001805461065190611cc0565b3360008181526005602090815260408083206001600160a01b03871680855290835292819020805460ff191686151590811790915590519081529192917f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31910160405180910390a35050565b6006546001600160a01b03163314610f6c5760405162461bcd60e51b815260040161075490611cfa565b610f79600a612710611d6f565b60065461ffff918216600160a81b90910490911603610fab57604051634db085a760e01b815260040160405180910390fd5b8161ffff16600003610fd05760405163b562e8dd60e01b815260040160405180910390fd5b610fdd600a612710611d6f565b60065461ffff91821691610ffb918591600160a81b90910416611d6f565b61ffff161115611053576006548290600160a81b900461ffff16611022600a612710611d6f565b61102c9190611f0f565b604051633ba9a5c760e11b815261ffff928316600482015291166024820152604401610754565b600b546006546001600160a01b0390911690600160a81b900461ffff165b60065461108a908590600160a81b900461ffff16611d6f565b61ffff168161ffff16101561119e5760006110a782612710611d6f565b905033600a6110b881612710611d6f565b6110c29190611f0f565b61ffff168361ffff161080156110d55750845b1561117b576040516331a9108f60e11b815261ffff841660048201526001600160a01b03851690636352211e90602401602060405180830381865afa92505050801561113e575060408051601f3d908101601f1916820190925261113b91810190611f2a565b60015b611178573d80801561116c576040519150601f19603f3d011682016040523d82523d6000602084013e611171565b606091505b505061117b565b90505b611189818361ffff16611780565b5050808061119690611f47565b915050611071565b506006546111b8908490600160a81b900461ffff16611d6f565b600660156101000a81548161ffff021916908361ffff160217905550505050565b6111e48585856108ae565b6001600160a01b0384163b158061127b5750604051630a85bd0160e11b808252906001600160a01b0386169063150b7a029061122c9033908a90899089908990600401611f68565b6020604051808303816000875af115801561124b573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061126f9190611d91565b6001600160e01b031916145b6112ba5760405162461bcd60e51b815260206004820152601060248201526f155394d0519157d49150d2541251539560821b6044820152606401610754565b5050505050565b60606112ce8484846115bc565b949350505050565b6000818152600260205260409020546060906001600160a01b0316611311576040516338077a2b60e01b815260048101839052602401610754565b60006008805461132090611cc0565b80601f016020809104026020016040519081016040528092919081815260200182805461134c90611cc0565b80156113995780601f1061136e57610100808354040283529160200191611399565b820191906000526020600020905b81548152906001019060200180831161137c57829003601f168201915b50505050509050600660149054906101000a900460ff166113ba5792915050565b806113c48461188b565b6040516020016113d5929190611fa7565b604051602081830303815290604052915050919050565b6006546001600160a01b031633146114165760405162461bcd60e51b815260040161075490611cfa565b600980546001600160a01b0319166001600160a01b038416908117909155600a82905560408051918252602082018390527fff26d16febb506bdb66324138b1086facb8bd304fc773e610e0aa1593b7a07469101610cd7565b60606007805461147e90611cc0565b80601f01602080910402602001604051908101604052809291908181526020018280546114aa90611cc0565b80156114f75780601f106114cc576101008083540402835291602001916114f7565b820191906000526020600020905b8154815290600101906020018083116114da57829003601f168201915b5050505050905090565b60006301ffc9a760e01b6001600160e01b03198316148061153257506380ac58cd60e01b6001600160e01b03198316145b8061063e5750506001600160e01b031916635b5e139f60e01b1490565b600654600090600160a81b900461ffff16810361156c5750600090565b5061271090565b600654600090600160a81b900461ffff1681036115905750600090565b6006546001906115ad90600160a81b900461ffff16612710611d6f565b6115b79190611f0f565b905090565b600654606090600160a81b900461ffff166000036115ed576040516339e60cb560e11b815260040160405180910390fd5b60006115f7611573565b61ffff1690508361ffff168361ffff1610806116165750808461ffff16115b8061162e5750611627816001611fe6565b8361ffff16115b1561167457838361163d61154f565b604051636ec9d20b60e11b815261ffff93841660048201529183166024830152909116604482015260648101829052608401610754565b600061167f86610d3a565b9050600061168d8686611f0f565b61ffff16905060008282106116a257826116a4565b815b90506000808267ffffffffffffffff8111156116c2576116c2611dae565b6040519080825280602002602001820160405280156116eb578160200160208202803683370190505b509050885b8861ffff168161ffff16101561177257828414611772578a6001600160a01b031661171e8261ffff16610ce3565b6001600160a01b031603611760578082848151811061173f5761173f611ff9565b61ffff909216602092830291909101909101528261175c8161200f565b9350505b8061176a81611f47565b9150506116f0565b509998505050505050505050565b6001600160a01b0382166117ca5760405162461bcd60e51b81526020600482015260116024820152701253959053125117d49150d25412515395607a1b6044820152606401610754565b6000818152600260205260409020546001600160a01b0316156118205760405162461bcd60e51b815260206004820152600e60248201526d1053149150511657d3525395115160921b6044820152606401610754565b6001600160a01b038216600081815260036020908152604080832080546001019055848352600290915280822080546001600160a01b0319168417905551839291907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef908290a45050565b606060a06040510180604052602081039150506000815280825b600183039250600a81066030018353600a9004806118a55750819003601f19909101908152919050565b6001600160e01b0319811681146118e557600080fd5b50565b6000602082840312156118fa57600080fd5b8135611905816118cf565b9392505050565b60005b8381101561192757818101518382015260200161190f565b50506000910152565b602081526000825180602084015261194f81604085016020870161190c565b601f01601f19169190910160400192915050565b60006020828403121561197557600080fd5b5035919050565b6001600160a01b03811681146118e557600080fd5b600080604083850312156119a457600080fd5b82356119af8161197c565b946020939093013593505050565b6000602082840312156119cf57600080fd5b81356119058161197c565b6000806000606084860312156119ef57600080fd5b83356119fa8161197c565b92506020840135611a0a8161197c565b929592945050506040919091013590565b60008060408385031215611a2e57600080fd5b50508035926020909101359150565b6020808252825182820181905260009190848201906040850190845b81811015611a7957835161ffff1683529284019291840191600101611a59565b50909695505050505050565b60008083601f840112611a9757600080fd5b50813567ffffffffffffffff811115611aaf57600080fd5b602083019150836020828501011115610aaf57600080fd5b60008060208385031215611ada57600080fd5b823567ffffffffffffffff811115611af157600080fd5b611afd85828601611a85565b90969095509350505050565b80358015158114610d3557600080fd5b600080600060408486031215611b2e57600080fd5b611b3784611b09565b9250602084013567ffffffffffffffff811115611b5357600080fd5b611b5f86828701611a85565b9497909650939450505050565b60008060408385031215611b7f57600080fd5b8235611b8a8161197c565b9150611b9860208401611b09565b90509250929050565b803561ffff81168114610d3557600080fd5b60008060408385031215611bc657600080fd5b611b8a83611ba1565b600080600080600060808688031215611be757600080fd5b8535611bf28161197c565b94506020860135611c028161197c565b935060408601359250606086013567ffffffffffffffff811115611c2557600080fd5b611c3188828901611a85565b969995985093965092949392505050565b600080600060608486031215611c5757600080fd5b8335611c628161197c565b9250611c7060208501611ba1565b9150611c7e60408501611ba1565b90509250925092565b60008060408385031215611c9a57600080fd5b8235611ca58161197c565b91506020830135611cb58161197c565b809150509250929050565b600181811c90821680611cd457607f821691505b602082108103611cf457634e487b7160e01b600052602260045260246000fd5b50919050565b6020808252600c908201526b15539055551213d49256915160a21b604082015260600190565b634e487b7160e01b600052601160045260246000fd5b808202811582820484141761063e5761063e611d20565b600082611d6a57634e487b7160e01b600052601260045260246000fd5b500490565b61ffff818116838216019080821115611d8a57611d8a611d20565b5092915050565b600060208284031215611da357600080fd5b8151611905816118cf565b634e487b7160e01b600052604160045260246000fd5b601f821115610c4357600081815260208120601f850160051c81016020861015611deb5750805b601f850160051c820191505b81811015611e0a57828155600101611df7565b505050505050565b67ffffffffffffffff831115611e2a57611e2a611dae565b611e3e83611e388354611cc0565b83611dc4565b6000601f841160018114611e725760008515611e5a5750838201355b600019600387901b1c1916600186901b1783556112ba565b600083815260209020601f19861690835b82811015611ea35786850135825560209485019460019092019101611e83565b5086821015611ec05760001960f88860031b161c19848701351681555b505060018560011b0183555050505050565b81835281816020850137506000828201602090810191909152601f909101601f19169091010190565b6020815260006112ce602083018486611ed2565b61ffff828116828216039080821115611d8a57611d8a611d20565b600060208284031215611f3c57600080fd5b81516119058161197c565b600061ffff808316818103611f5e57611f5e611d20565b6001019392505050565b6001600160a01b0386811682528516602082015260408101849052608060608201819052600090611f9c9083018486611ed2565b979650505050505050565b60008351611fb981846020880161190c565b835190830190611fcd81836020880161190c565b64173539b7b760d91b9101908152600501949350505050565b8082018082111561063e5761063e611d20565b634e487b7160e01b600052603260045260246000fd5b60006001820161202157612021611d20565b506001019056fea2646970667358221220757fbd23f4656184118761fe2da05d881d9d4aa2a3416d95a10c322a165856c364736f6c6343000811003300000000000000000000000000000000000000000000000000000000000000400000000000000000000000001fec856e25f757fed06eb90548b0224e91095738000000000000000000000000000000000000000000000000000000000000005068747470733a2f2f676174657761792e70696e6174612e636c6f75642f697066732f516d64764535557a773848396d50745776646a327a62516b473871715139326d4d51453537364a5479763770416a00000000000000000000000000000000

Deployed Bytecode

0x6080604052600436106101d15760003560e01c80636ab65915116100f7578063a32deb8711610095578063e2e784d511610064578063e2e784d514610593578063e8a3d485146105b3578063e985e9c5146105c8578063f7de95e41461060357600080fd5b8063a32deb8714610513578063b88d4fde14610533578063c0ec0a8114610553578063c87b56dd1461057357600080fd5b8063938e3d7b116100d1578063938e3d7b1461049e5780639498d7eb146104be57806395d89b41146104de578063a22cb465146104f357600080fd5b80636ab659151461042957806370a08231146104505780638da5cb5b1461047e57600080fd5b806323b872dd1161016f57806342842e0e1161013e57806342842e0e1461039c578063438b6300146103bc57806355f804b3146103e95780636352211e1461040957600080fd5b806323b872dd146103135780632a55205a1461033357806332cb6b0c146103725780633ccfd60b1461038757600080fd5b8063095ea7b3116101ab578063095ea7b3146102825780630eaef989146102a457806313af4035146102c457806318160ddd146102e457600080fd5b806301ffc9a7146101dd57806306fdde0314610212578063081812fc1461023457600080fd5b366101d857005b600080fd5b3480156101e957600080fd5b506101fd6101f83660046118e8565b610619565b60405190151581526020015b60405180910390f35b34801561021e57600080fd5b50610227610644565b6040516102099190611930565b34801561024057600080fd5b5061026a61024f366004611963565b6004602052600090815260409020546001600160a01b031681565b6040516001600160a01b039091168152602001610209565b34801561028e57600080fd5b506102a261029d366004611991565b6106d2565b005b3480156102b057600080fd5b506102a26102bf3660046119bd565b6107b9565b3480156102d057600080fd5b506102a26102df3660046119bd565b610838565b3480156102f057600080fd5b50600654600160a81b900461ffff165b60405161ffff9091168152602001610209565b34801561031f57600080fd5b506102a261032e3660046119da565b6108ae565b34801561033f57600080fd5b5061035361034e366004611a1b565b610a75565b604080516001600160a01b039093168352602083019190915201610209565b34801561037e57600080fd5b50610300610ab6565b34801561039357600080fd5b506102a2610ac6565b3480156103a857600080fd5b506102a26103b73660046119da565b610b50565b3480156103c857600080fd5b506103dc6103d73660046119bd565b610c48565b6040516102099190611a3d565b3480156103f557600080fd5b506102a2610404366004611ac7565b610c6e565b34801561041557600080fd5b5061026a610424366004611963565b610ce3565b34801561043557600080fd5b5061043e600a81565b60405160ff9091168152602001610209565b34801561045c57600080fd5b5061047061046b3660046119bd565b610d3a565b604051908152602001610209565b34801561048a57600080fd5b5060065461026a906001600160a01b031681565b3480156104aa57600080fd5b506102a26104b9366004611ac7565b610d9d565b3480156104ca57600080fd5b506102a26104d9366004611b19565b610e06565b3480156104ea57600080fd5b50610227610ec9565b3480156104ff57600080fd5b506102a261050e366004611b6c565b610ed6565b34801561051f57600080fd5b506102a261052e366004611bb3565b610f42565b34801561053f57600080fd5b506102a261054e366004611bcf565b6111d9565b34801561055f57600080fd5b506103dc61056e366004611c42565b6112c1565b34801561057f57600080fd5b5061022761058e366004611963565b6112d6565b34801561059f57600080fd5b506102a26105ae366004611991565b6113ec565b3480156105bf57600080fd5b5061022761146f565b3480156105d457600080fd5b506101fd6105e3366004611c87565b600560209081526000928352604080842090915290825290205460ff1681565b34801561060f57600080fd5b5061030061271081565b60006001600160e01b0319821663152a902d60e11b148061063e575061063e82611501565b92915050565b6000805461065190611cc0565b80601f016020809104026020016040519081016040528092919081815260200182805461067d90611cc0565b80156106ca5780601f1061069f576101008083540402835291602001916106ca565b820191906000526020600020905b8154815290600101906020018083116106ad57829003601f168201915b505050505081565b6000818152600260205260409020546001600160a01b03163381148061071b57506001600160a01b038116600090815260056020908152604080832033845290915290205460ff165b61075d5760405162461bcd60e51b815260206004820152600e60248201526d1393d517d055551213d49256915160921b60448201526064015b60405180910390fd5b60008281526004602052604080822080546001600160a01b0319166001600160a01b0387811691821790925591518593918516917f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92591a4505050565b6006546001600160a01b031633146107e35760405162461bcd60e51b815260040161075490611cfa565b600b80546001600160a01b0319166001600160a01b0383169081179091556040519081527f14b0885b935ef84d2182c33a0fc2314230e46e8eeb3a47951e9ad117a52fcf7a906020015b60405180910390a150565b6006546001600160a01b031633146108625760405162461bcd60e51b815260040161075490611cfa565b600680546001600160a01b0319166001600160a01b03831690811790915560405133907f8292fce18fa69edf4db7b94ea2e58241df0ae57f97e0a6c9b29067028bf92d7690600090a350565b6000818152600260205260409020546001600160a01b038481169116146109045760405162461bcd60e51b815260206004820152600a60248201526957524f4e475f46524f4d60b01b6044820152606401610754565b6001600160a01b03821661094e5760405162461bcd60e51b81526020600482015260116024820152701253959053125117d49150d25412515395607a1b6044820152606401610754565b336001600160a01b038416148061098857506001600160a01b038316600090815260056020908152604080832033845290915290205460ff165b806109a957506000818152600460205260409020546001600160a01b031633145b6109e65760405162461bcd60e51b815260206004820152600e60248201526d1393d517d055551213d49256915160921b6044820152606401610754565b6001600160a01b0380841660008181526003602090815260408083208054600019019055938616808352848320805460010190558583526002825284832080546001600160a01b03199081168317909155600490925284832080549092169091559251849392917fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef91a4505050565b600954600a5460009182916001600160a01b0390911690670de0b6b3a764000090610aa09086611d36565b610aaa9190611d4d565b915091505b9250929050565b610ac3600a612710611d6f565b81565b6006546001600160a01b03163314610af05760405162461bcd60e51b815260040161075490611cfa565b6040514790339082156108fc029083906000818181858888f19350505050158015610b1f573d6000803e3d6000fd5b506040518181527fb6b476da71cea8275cac6b1720c04966afaff5e637472cedb6cbd32c43a232519060200161082d565b610b5b8383836108ae565b6001600160a01b0382163b1580610c045750604051630a85bd0160e11b8082523360048301526001600160a01b03858116602484015260448301849052608060648401526000608484015290919084169063150b7a029060a4016020604051808303816000875af1158015610bd4573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610bf89190611d91565b6001600160e01b031916145b610c435760405162461bcd60e51b815260206004820152601060248201526f155394d0519157d49150d2541251539560821b6044820152606401610754565b505050565b606061063e82610c5661154f565b610c5e611573565b610c69906001611d6f565b6115bc565b6006546001600160a01b03163314610c985760405162461bcd60e51b815260040161075490611cfa565b6008610ca5828483611e12565b507f23c8c9488efebfd474e85a7956de6f39b17c7ab88502d42a623db2d8e382bbaa8282604051610cd7929190611efb565b60405180910390a15050565b6000818152600260205260409020546001600160a01b031680610d355760405162461bcd60e51b815260206004820152600a6024820152691393d517d3525395115160b21b6044820152606401610754565b919050565b60006001600160a01b038216610d815760405162461bcd60e51b815260206004820152600c60248201526b5a45524f5f4144445245535360a01b6044820152606401610754565b506001600160a01b031660009081526003602052604090205490565b6006546001600160a01b03163314610dc75760405162461bcd60e51b815260040161075490611cfa565b6007610dd4828483611e12565b507f5ca9f750836b0b7efdace104f07b5c9f0df0650c0fd24f5163e99044ae36ea528282604051610cd7929190611efb565b6006546001600160a01b03163314610e305760405162461bcd60e51b815260040161075490611cfa565b6008610e3d828483611e12565b506006805460ff60a01b1916600160a01b851515021790556040517f23c8c9488efebfd474e85a7956de6f39b17c7ab88502d42a623db2d8e382bbaa90610e879084908490611efb565b60405180910390a160405183151581527f40dcfa5db899ec74bc8371886cd6b7550aa92fd52a425b9c498a839183f2886c9060200160405180910390a1505050565b6001805461065190611cc0565b3360008181526005602090815260408083206001600160a01b03871680855290835292819020805460ff191686151590811790915590519081529192917f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31910160405180910390a35050565b6006546001600160a01b03163314610f6c5760405162461bcd60e51b815260040161075490611cfa565b610f79600a612710611d6f565b60065461ffff918216600160a81b90910490911603610fab57604051634db085a760e01b815260040160405180910390fd5b8161ffff16600003610fd05760405163b562e8dd60e01b815260040160405180910390fd5b610fdd600a612710611d6f565b60065461ffff91821691610ffb918591600160a81b90910416611d6f565b61ffff161115611053576006548290600160a81b900461ffff16611022600a612710611d6f565b61102c9190611f0f565b604051633ba9a5c760e11b815261ffff928316600482015291166024820152604401610754565b600b546006546001600160a01b0390911690600160a81b900461ffff165b60065461108a908590600160a81b900461ffff16611d6f565b61ffff168161ffff16101561119e5760006110a782612710611d6f565b905033600a6110b881612710611d6f565b6110c29190611f0f565b61ffff168361ffff161080156110d55750845b1561117b576040516331a9108f60e11b815261ffff841660048201526001600160a01b03851690636352211e90602401602060405180830381865afa92505050801561113e575060408051601f3d908101601f1916820190925261113b91810190611f2a565b60015b611178573d80801561116c576040519150601f19603f3d011682016040523d82523d6000602084013e611171565b606091505b505061117b565b90505b611189818361ffff16611780565b5050808061119690611f47565b915050611071565b506006546111b8908490600160a81b900461ffff16611d6f565b600660156101000a81548161ffff021916908361ffff160217905550505050565b6111e48585856108ae565b6001600160a01b0384163b158061127b5750604051630a85bd0160e11b808252906001600160a01b0386169063150b7a029061122c9033908a90899089908990600401611f68565b6020604051808303816000875af115801561124b573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061126f9190611d91565b6001600160e01b031916145b6112ba5760405162461bcd60e51b815260206004820152601060248201526f155394d0519157d49150d2541251539560821b6044820152606401610754565b5050505050565b60606112ce8484846115bc565b949350505050565b6000818152600260205260409020546060906001600160a01b0316611311576040516338077a2b60e01b815260048101839052602401610754565b60006008805461132090611cc0565b80601f016020809104026020016040519081016040528092919081815260200182805461134c90611cc0565b80156113995780601f1061136e57610100808354040283529160200191611399565b820191906000526020600020905b81548152906001019060200180831161137c57829003601f168201915b50505050509050600660149054906101000a900460ff166113ba5792915050565b806113c48461188b565b6040516020016113d5929190611fa7565b604051602081830303815290604052915050919050565b6006546001600160a01b031633146114165760405162461bcd60e51b815260040161075490611cfa565b600980546001600160a01b0319166001600160a01b038416908117909155600a82905560408051918252602082018390527fff26d16febb506bdb66324138b1086facb8bd304fc773e610e0aa1593b7a07469101610cd7565b60606007805461147e90611cc0565b80601f01602080910402602001604051908101604052809291908181526020018280546114aa90611cc0565b80156114f75780601f106114cc576101008083540402835291602001916114f7565b820191906000526020600020905b8154815290600101906020018083116114da57829003601f168201915b5050505050905090565b60006301ffc9a760e01b6001600160e01b03198316148061153257506380ac58cd60e01b6001600160e01b03198316145b8061063e5750506001600160e01b031916635b5e139f60e01b1490565b600654600090600160a81b900461ffff16810361156c5750600090565b5061271090565b600654600090600160a81b900461ffff1681036115905750600090565b6006546001906115ad90600160a81b900461ffff16612710611d6f565b6115b79190611f0f565b905090565b600654606090600160a81b900461ffff166000036115ed576040516339e60cb560e11b815260040160405180910390fd5b60006115f7611573565b61ffff1690508361ffff168361ffff1610806116165750808461ffff16115b8061162e5750611627816001611fe6565b8361ffff16115b1561167457838361163d61154f565b604051636ec9d20b60e11b815261ffff93841660048201529183166024830152909116604482015260648101829052608401610754565b600061167f86610d3a565b9050600061168d8686611f0f565b61ffff16905060008282106116a257826116a4565b815b90506000808267ffffffffffffffff8111156116c2576116c2611dae565b6040519080825280602002602001820160405280156116eb578160200160208202803683370190505b509050885b8861ffff168161ffff16101561177257828414611772578a6001600160a01b031661171e8261ffff16610ce3565b6001600160a01b031603611760578082848151811061173f5761173f611ff9565b61ffff909216602092830291909101909101528261175c8161200f565b9350505b8061176a81611f47565b9150506116f0565b509998505050505050505050565b6001600160a01b0382166117ca5760405162461bcd60e51b81526020600482015260116024820152701253959053125117d49150d25412515395607a1b6044820152606401610754565b6000818152600260205260409020546001600160a01b0316156118205760405162461bcd60e51b815260206004820152600e60248201526d1053149150511657d3525395115160921b6044820152606401610754565b6001600160a01b038216600081815260036020908152604080832080546001019055848352600290915280822080546001600160a01b0319168417905551839291907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef908290a45050565b606060a06040510180604052602081039150506000815280825b600183039250600a81066030018353600a9004806118a55750819003601f19909101908152919050565b6001600160e01b0319811681146118e557600080fd5b50565b6000602082840312156118fa57600080fd5b8135611905816118cf565b9392505050565b60005b8381101561192757818101518382015260200161190f565b50506000910152565b602081526000825180602084015261194f81604085016020870161190c565b601f01601f19169190910160400192915050565b60006020828403121561197557600080fd5b5035919050565b6001600160a01b03811681146118e557600080fd5b600080604083850312156119a457600080fd5b82356119af8161197c565b946020939093013593505050565b6000602082840312156119cf57600080fd5b81356119058161197c565b6000806000606084860312156119ef57600080fd5b83356119fa8161197c565b92506020840135611a0a8161197c565b929592945050506040919091013590565b60008060408385031215611a2e57600080fd5b50508035926020909101359150565b6020808252825182820181905260009190848201906040850190845b81811015611a7957835161ffff1683529284019291840191600101611a59565b50909695505050505050565b60008083601f840112611a9757600080fd5b50813567ffffffffffffffff811115611aaf57600080fd5b602083019150836020828501011115610aaf57600080fd5b60008060208385031215611ada57600080fd5b823567ffffffffffffffff811115611af157600080fd5b611afd85828601611a85565b90969095509350505050565b80358015158114610d3557600080fd5b600080600060408486031215611b2e57600080fd5b611b3784611b09565b9250602084013567ffffffffffffffff811115611b5357600080fd5b611b5f86828701611a85565b9497909650939450505050565b60008060408385031215611b7f57600080fd5b8235611b8a8161197c565b9150611b9860208401611b09565b90509250929050565b803561ffff81168114610d3557600080fd5b60008060408385031215611bc657600080fd5b611b8a83611ba1565b600080600080600060808688031215611be757600080fd5b8535611bf28161197c565b94506020860135611c028161197c565b935060408601359250606086013567ffffffffffffffff811115611c2557600080fd5b611c3188828901611a85565b969995985093965092949392505050565b600080600060608486031215611c5757600080fd5b8335611c628161197c565b9250611c7060208501611ba1565b9150611c7e60408501611ba1565b90509250925092565b60008060408385031215611c9a57600080fd5b8235611ca58161197c565b91506020830135611cb58161197c565b809150509250929050565b600181811c90821680611cd457607f821691505b602082108103611cf457634e487b7160e01b600052602260045260246000fd5b50919050565b6020808252600c908201526b15539055551213d49256915160a21b604082015260600190565b634e487b7160e01b600052601160045260246000fd5b808202811582820484141761063e5761063e611d20565b600082611d6a57634e487b7160e01b600052601260045260246000fd5b500490565b61ffff818116838216019080821115611d8a57611d8a611d20565b5092915050565b600060208284031215611da357600080fd5b8151611905816118cf565b634e487b7160e01b600052604160045260246000fd5b601f821115610c4357600081815260208120601f850160051c81016020861015611deb5750805b601f850160051c820191505b81811015611e0a57828155600101611df7565b505050505050565b67ffffffffffffffff831115611e2a57611e2a611dae565b611e3e83611e388354611cc0565b83611dc4565b6000601f841160018114611e725760008515611e5a5750838201355b600019600387901b1c1916600186901b1783556112ba565b600083815260209020601f19861690835b82811015611ea35786850135825560209485019460019092019101611e83565b5086821015611ec05760001960f88860031b161c19848701351681555b505060018560011b0183555050505050565b81835281816020850137506000828201602090810191909152601f909101601f19169091010190565b6020815260006112ce602083018486611ed2565b61ffff828116828216039080821115611d8a57611d8a611d20565b600060208284031215611f3c57600080fd5b81516119058161197c565b600061ffff808316818103611f5e57611f5e611d20565b6001019392505050565b6001600160a01b0386811682528516602082015260408101849052608060608201819052600090611f9c9083018486611ed2565b979650505050505050565b60008351611fb981846020880161190c565b835190830190611fcd81836020880161190c565b64173539b7b760d91b9101908152600501949350505050565b8082018082111561063e5761063e611d20565b634e487b7160e01b600052603260045260246000fd5b60006001820161202157612021611d20565b506001019056fea2646970667358221220757fbd23f4656184118761fe2da05d881d9d4aa2a3416d95a10c322a165856c364736f6c63430008110033

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.