ETH Price: $3,363.61 (+2.59%)

Evoh: Sushi Frens (Evoh-SUSHI)
 

Overview

TokenID

597

Total Transfers

-

Market

Onchain Market Cap

$0.00

Circulating Supply Market Cap

-
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 0xf883ab97...A015EfD8A
The constructor portion of the code might be different and could alter the actual behaviour of the contract

Contract Name:
EvohClaimable

Compiler Version
v0.8.3+commit.8d00100c

Optimization Enabled:
Yes with 200 runs

Other Settings:
default evmVersion, None license
/**
 *Submitted for verification at Etherscan.io on 2021-07-07
*/

// SPDX-License-Identifier: NONE

pragma solidity 0.8.3;



// Part: ERC721TokenReceiver

/// @dev Note: the ERC-165 identifier for this interface is 0x150b7a02.
interface ERC721TokenReceiver {
    /// @notice Handle the receipt of an NFT
    /// @dev The ERC721 smart contract calls this function on the recipient
    ///  after a `transfer`. This function MAY throw to revert and reject the
    ///  transfer. Return of other than the magic value MUST result in the
    ///  transaction being reverted.
    ///  Note: the contract address is always the message sender.
    /// @param _operator The address which called `safeTransferFrom` function
    /// @param _from The address which previously owned the token
    /// @param _tokenId The NFT identifier which is being transferred
    /// @param _data Additional data with no specified format
    /// @return `bytes4(keccak256("onERC721Received(address,address,uint256,bytes)"))`
    ///         unless throwing
    function onERC721Received(address _operator, address _from, uint256 _tokenId, bytes memory _data) external returns(bytes4);
}

// Part: EvohERC721

contract EvohERC721 {

    string public name;
    string public symbol;
    uint256 public totalSupply;

    mapping(bytes4 => bool) public supportsInterface;

    struct UserData {
        uint256 balance;
        uint256[4] ownership;
    }
    mapping(address => UserData) userData;

    address[1024] tokenOwners;
    address[1024] tokenApprovals;
    mapping(uint256 => string) tokenURIs;

    mapping (address => mapping (address => bool)) private operatorApprovals;

    bytes4 private constant _ERC721_RECEIVED = 0x150b7a02;
    bytes4 private constant _INTERFACE_ID_ERC165 = 0x01ffc9a7;
    bytes4 private constant _INTERFACE_ID_ERC721 = 0x80ac58cd;
    bytes4 private constant _INTERFACE_ID_ERC721_METADATA = 0x5b5e139f;
    bytes4 private constant _INTERFACE_ID_ERC721_ENUMERABLE = 0x780e9d63;

    event Transfer(address indexed _from, address indexed _to, uint256 indexed _tokenId);
    event Approval(address indexed _owner, address indexed _approved, uint256 indexed _tokenId);
    event ApprovalForAll(address indexed _owner, address indexed _operator, bool _approved);

    constructor(string memory _name, string memory _symbol) {
        name = _name;
        symbol = _symbol;
        supportsInterface[_INTERFACE_ID_ERC165] = true;
        supportsInterface[_INTERFACE_ID_ERC721] = true;
        supportsInterface[_INTERFACE_ID_ERC721_METADATA] = true;
        supportsInterface[_INTERFACE_ID_ERC721_ENUMERABLE] = true;
    }

    /// @notice Count all NFTs assigned to an owner
    function balanceOf(address _owner) external view returns (uint256) {
        require(_owner != address(0), "Query for zero address");
        return userData[_owner].balance;
    }

    /// @notice Find the owner of an NFT
    function ownerOf(uint256 tokenId) public view returns (address) {
        if (tokenId < 1024) {
            address owner = tokenOwners[tokenId];
            if (owner != address(0)) return owner;
        }
        revert("Query for nonexistent tokenId");
    }

    function _transfer(address _from, address _to, uint256 _tokenId) internal {
        require(_from != address(0));
        require(_to != address(0));
        address owner = ownerOf(_tokenId);
        if (
            msg.sender == owner ||
            getApproved(_tokenId) == msg.sender ||
            isApprovedForAll(owner, msg.sender)
        ) {
            delete tokenApprovals[_tokenId];
            removeOwnership(_from, _tokenId);
            addOwnership(_to, _tokenId);
            emit Transfer(_from, _to, _tokenId);
            return;
        }
        revert("Caller is not owner nor approved");
    }

    /// @notice Transfers the ownership of an NFT from one address to another address
    /// @dev Throws unless `msg.sender` is the current owner, an authorized
    ///  operator, or the approved address for this NFT. Throws if `_from` is
    ///  not the current owner. Throws if `_to` is the zero address. Throws if
    ///  `_tokenId` is not a valid NFT. When transfer is complete, this function
    ///  checks if `_to` is a smart contract (code size > 0). If so, it calls
    ///  `onERC721Received` on `_to` and throws if the return value is not
    ///  `bytes4(keccak256("onERC721Received(address,address,uint256,bytes)"))`.
    /// @param _from The current owner of the NFT
    /// @param _to The new owner
    /// @param _tokenId The NFT to transfer
    /// @param _data Additional data with no specified format, sent in call to `_to`
    function safeTransferFrom(address _from, address _to, uint256 _tokenId, bytes memory _data) public {
        _transfer(_from, _to, _tokenId);
        require(_checkOnERC721Received(_from, _to, _tokenId, _data), "Transfer to non ERC721 receiver");
    }

    function removeOwnership(address _owner, uint256 _tokenId) internal {
        UserData storage data = userData[_owner];
        data.balance -= 1;
        uint256 idx = _tokenId / 256;
        uint256 bitfield = data.ownership[idx];
        data.ownership[idx] = bitfield & ~(uint256(1) << (_tokenId % 256));
    }

    function addOwnership(address _owner, uint256 _tokenId) internal {
        tokenOwners[_tokenId] = _owner;
        UserData storage data = userData[_owner];
        data.balance += 1;
        uint256 idx = _tokenId / 256;
        uint256 bitfield = data.ownership[idx];
        data.ownership[idx] = bitfield | uint256(1) << (_tokenId % 256);
    }

    /// @notice Transfers the ownership of an NFT from one address to another address
    /// @dev This works identically to the other function with an extra data parameter,
    ///  except this function just sets data to "".
    /// @param _from The current owner of the NFT
    /// @param _to The new owner
    /// @param _tokenId The NFT to transfer
    function safeTransferFrom(address _from, address _to, uint256 _tokenId) external {
        safeTransferFrom(_from, _to, _tokenId, bytes(""));
    }

    /// @notice Transfer ownership of an NFT -- THE CALLER IS RESPONSIBLE
    ///  TO CONFIRM THAT `_to` IS CAPABLE OF RECEIVING NFTS OR ELSE
    ///  THEY MAY BE PERMANENTLY LOST
    /// @dev Throws unless `msg.sender` is the current owner, an authorized
    ///  operator, or the approved address for this NFT. Throws if `_from` is
    ///  not the current owner. Throws if `_to` is the zero address. Throws if
    ///  `_tokenId` is not a valid NFT.
    /// @param _from The current owner of the NFT
    /// @param _to The new owner
    /// @param _tokenId The NFT to transfer
    function transferFrom(address _from, address _to, uint256 _tokenId) external {
        _transfer(_from, _to, _tokenId);
    }

        /// @notice Change or reaffirm the approved address for an NFT
    function approve(address approved, uint256 tokenId) public {
        address owner = ownerOf(tokenId);
        require(msg.sender == owner || isApprovedForAll(owner, msg.sender),
            "Not owner nor approved for all"
        );
        tokenApprovals[tokenId] = approved;
        emit Approval(owner, approved, tokenId);
    }

    /// @notice Get the approved address for a single NFT
    function getApproved(uint256 tokenId) public view returns (address) {
        ownerOf(tokenId);
        return tokenApprovals[tokenId];
    }

    /// @notice Enable or disable approval for a third party ("operator") to manage
    ///         all of `msg.sender`'s assets
    function setApprovalForAll(address operator, bool approved) external {
        operatorApprovals[msg.sender][operator] = approved;
        emit ApprovalForAll(msg.sender, operator, approved);
    }

    /// @notice Query if an address is an authorized operator for another address
    function isApprovedForAll(address owner, address operator) public view returns (bool) {
        return operatorApprovals[owner][operator];
    }

    /// @notice Concatenates tokenId to baseURI and returns the string.
    function tokenURI(uint256 tokenId) public view returns (string memory) {
        ownerOf(tokenId);
        return tokenURIs[tokenId];
    }

    /// @notice Enumerate valid NFTs
    function tokenByIndex(uint256 _index) external view returns (uint256) {
        require(_index < totalSupply, "Index out of bounds");
        return _index;
    }

    /// @notice Enumerate NFTs assigned to an owner
    function tokenOfOwnerByIndex(address _owner, uint256 _index) external view returns (uint256) {
        UserData storage data = userData[_owner];
        require (_index < data.balance, "Index out of bounds");
        uint256 bitfield;
        uint256 count;
        for (uint256 i = 0; i < 1024; i++) {
            uint256 key = i % 256;
            if (key == 0) {
                bitfield = data.ownership[i / 256];
            }
            if ((bitfield >> key) & uint256(1) == 1) {
                if (count == _index) {
                    return i;
                }
                count++;
            }
        }
        revert();
    }

    function _checkOnERC721Received(
        address from,
        address to,
        uint256 tokenId,
        bytes memory _data
    )
        private
        returns (bool)
    {
        uint256 size;
        // solhint-disable-next-line no-inline-assembly
        assembly { size := extcodesize(to) }
        if (size == 0) {
            return true;
        }

        (bool success, bytes memory returnData) = to.call{ value: 0 }(
            abi.encodeWithSelector(
                ERC721TokenReceiver(to).onERC721Received.selector,
                msg.sender,
                from,
                tokenId,
                _data
            )
        );
        require(success, "Transfer to non ERC721 receiver");
        bytes4 returnValue = abi.decode(returnData, (bytes4));
        return (returnValue == _ERC721_RECEIVED);
    }

}

// File: Claimable.sol

contract EvohClaimable is EvohERC721 {

    uint256 public maxTotalSupply;
    bytes32 public hashRoot;
    address public owner;
    uint256 public startTime;

    struct ClaimData {
        bytes32 root;
        uint256 count;
        uint256 limit;
        mapping(address => bool) claimed;
    }

    ClaimData[] public claimData;

    constructor(
        string memory _name,
        string memory _symbol,
        bytes32 _hashRoot,
        uint256 _maxTotalSupply,
        uint256 _startTime
    )
        EvohERC721(_name, _symbol)
    {
        owner = msg.sender;
        hashRoot = _hashRoot;
        maxTotalSupply = _maxTotalSupply;
        startTime = _startTime;
    }

    function addClaimRoots(bytes32[] calldata _merkleRoots, uint256[] calldata _claimLimits) external {
        require(msg.sender == owner);
        for (uint256 i = 0; i < _merkleRoots.length; i++) {
            ClaimData storage data = claimData.push();
            data.root = _merkleRoots[i];
            data.limit = _claimLimits[i];
        }
    }

    function isClaimed(uint256 _claimIndex, address _account) public view returns (bool) {
        return claimData[_claimIndex].claimed[_account];
    }

    /**
        @notice Claim an NFT using an eligible account
        @param _claimIndex Index of the claim hash to validate `_claimProof` against
        @param _claimProof Proof to validate against the claim root
     */
    function claim(
        uint256 _claimIndex,
        bytes32[] calldata _claimProof
    )
        external
    {
        require(block.timestamp >= startTime, "Cannot claim before start time");
        uint256 claimed = totalSupply;
        require(maxTotalSupply > claimed, "All NFTs claimed");

        // Verify the claim
        bytes32 node = keccak256(abi.encodePacked(msg.sender));
        ClaimData storage data = claimData[_claimIndex];

        require(_claimIndex < claimData.length, "Invalid merkleIndex");
        require(data.count < data.limit, "All NFTs claimed in this airdrop");
        require(!data.claimed[msg.sender], "User has claimed in this airdrop");
        require(verify(_claimProof, data.root, node), "Invalid claim proof");

        // Mark as claimed, write the hash and send the token.
        data.count++;
        data.claimed[msg.sender] = true;

        addOwnership(msg.sender, claimed);
        emit Transfer(address(0), msg.sender, claimed);
        totalSupply = claimed + 1;
    }

     /**
        @notice Submit NFT hashes on-chain.
        @param _indexes Indexes of the hashes being added.
        @param _hashes IPFS hashes being added.
        @param _proofs Proofs for the IPFS hashes. These are checked against `hashRoot`.
     */
    function submitHashes(
        uint256[] calldata _indexes,
        string[] calldata _hashes,
        bytes32[][] calldata _proofs
    ) external {
        require(_indexes.length == _proofs.length);
        bytes32 root = hashRoot;
        for (uint256 i = 0; i < _indexes.length; i++) {
            bytes32 node = keccak256(abi.encodePacked(_indexes[i], _hashes[i]));
            require(verify(_proofs[i], root, node), "Invalid hash proof");
            tokenURIs[_indexes[i]] = _hashes[i];
        }
    }

    function verify(
        bytes32[] calldata proof,
        bytes32 root,
        bytes32 leaf
    )
        internal
        pure
        returns (bool)
    {
        bytes32 computedHash = leaf;

        for (uint256 i = 0; i < proof.length; i++) {
            bytes32 proofElement = proof[i];

            if (computedHash <= proofElement) {
                // Hash(current computed hash + current element of the proof)
                computedHash = keccak256(abi.encodePacked(computedHash, proofElement));
            } else {
                // Hash(current element of the proof + current computed hash)
                computedHash = keccak256(abi.encodePacked(proofElement, computedHash));
            }
        }

        // Check if the computed hash (root) is equal to the provided root
        return computedHash == root;
    }

}

Contract Security Audit

Contract ABI

[{"inputs":[{"internalType":"string","name":"_name","type":"string"},{"internalType":"string","name":"_symbol","type":"string"},{"internalType":"bytes32","name":"_hashRoot","type":"bytes32"},{"internalType":"uint256","name":"_maxTotalSupply","type":"uint256"},{"internalType":"uint256","name":"_startTime","type":"uint256"}],"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":"_from","type":"address"},{"indexed":true,"internalType":"address","name":"_to","type":"address"},{"indexed":true,"internalType":"uint256","name":"_tokenId","type":"uint256"}],"name":"Transfer","type":"event"},{"inputs":[{"internalType":"bytes32[]","name":"_merkleRoots","type":"bytes32[]"},{"internalType":"uint256[]","name":"_claimLimits","type":"uint256[]"}],"name":"addClaimRoots","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"approved","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"approve","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_owner","type":"address"}],"name":"balanceOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_claimIndex","type":"uint256"},{"internalType":"bytes32[]","name":"_claimProof","type":"bytes32[]"}],"name":"claim","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"claimData","outputs":[{"internalType":"bytes32","name":"root","type":"bytes32"},{"internalType":"uint256","name":"count","type":"uint256"},{"internalType":"uint256","name":"limit","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"getApproved","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"hashRoot","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"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":"uint256","name":"_claimIndex","type":"uint256"},{"internalType":"address","name":"_account","type":"address"}],"name":"isClaimed","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"maxTotalSupply","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":"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":[{"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":[],"name":"startTime","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256[]","name":"_indexes","type":"uint256[]"},{"internalType":"string[]","name":"_hashes","type":"string[]"},{"internalType":"bytes32[][]","name":"_proofs","type":"bytes32[][]"}],"name":"submitHashes","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes4","name":"","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":"_index","type":"uint256"}],"name":"tokenByIndex","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_owner","type":"address"},{"internalType":"uint256","name":"_index","type":"uint256"}],"name":"tokenOfOwnerByIndex","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"tokenURI","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_from","type":"address"},{"internalType":"address","name":"_to","type":"address"},{"internalType":"uint256","name":"_tokenId","type":"uint256"}],"name":"transferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"}]

60806040523480156200001157600080fd5b5060405162001ef038038062001ef08339810160408190526200003491620002a8565b8451859085906200004d9060009060208501906200014f565b508051620000639060019060208401906200014f565b50506003602052507f28b0ef64f7e82d3b26f3fd404bd0151552f792965f39c29ae82c0a78df67af9c805460ff1990811660019081179092557f41a75b24256f422320613da5706c374a0a7eea8e8d418281bda8820c6b34435680548216831790557fcca39824a677cee72cd3539fc56c0e5a676a28b60617ea00a9d38305722c8b64805482168317905563780e9d6360e01b6000527f785e4d925c4778965a1107f0c202069d496d641ab5dd08a13bd2b783950e105f8054909116909117905561080980546001600160a01b03191633179055610808929092556108075561080a55506200037d9050565b8280546200015d906200032a565b90600052602060002090601f016020900481019282620001815760008555620001cc565b82601f106200019c57805160ff1916838001178555620001cc565b82800160010185558215620001cc579182015b82811115620001cc578251825591602001919060010190620001af565b50620001da929150620001de565b5090565b5b80821115620001da5760008155600101620001df565b600082601f83011262000206578081fd5b81516001600160401b038082111562000223576200022362000367565b604051601f8301601f19908116603f011681019082821181831017156200024e576200024e62000367565b816040528381526020925086838588010111156200026a578485fd5b8491505b838210156200028d57858201830151818301840152908201906200026e565b838211156200029e57848385830101525b9695505050505050565b600080600080600060a08688031215620002c0578081fd5b85516001600160401b0380821115620002d7578283fd5b620002e589838a01620001f5565b96506020880151915080821115620002fb578283fd5b506200030a88828901620001f5565b60408801516060890151608090990151979a919950979695509350505050565b600181811c908216806200033f57607f821691505b602082108114156200036157634e487b7160e01b600052602260045260246000fd5b50919050565b634e487b7160e01b600052604160045260246000fd5b611b63806200038d6000396000f3fe608060405234801561001057600080fd5b50600436106101735760003560e01c806354ef224b116100de578063a22cb46511610097578063c6f0308c11610071578063c6f0308c14610327578063c87b56dd14610355578063d2ef079514610368578063e985e9c51461037b57610173565b8063a22cb465146102f7578063b29a31051461030a578063b88d4fde1461031457610173565b806354ef224b146102985780636352211e146102ab57806370a08231146102be57806378e97925146102d15780638da5cb5b146102db57806395d89b41146102ef57610173565b806323b872dd1161013057806323b872dd1461022f5780632ab4d052146102425780632f52ebb71461024c5780632f745c591461025f57806342842e0e146102725780634f6ccce71461028557610173565b806301ffc9a71461017857806306fdde03146101b0578063081812fc146101c5578063095ea7b3146101f057806318160ddd1461020557806319e41c7e1461021c575b600080fd5b61019b6101863660046117fe565b60036020526000908152604090205460ff1681565b60405190151581526020015b60405180910390f35b6101b861038e565b6040516101a79190611959565b6101d86101d3366004611836565b61041c565b6040516001600160a01b0390911681526020016101a7565b6102036101fe3660046116d6565b61045e565b005b61020e60025481565b6040519081526020016101a7565b61020361022a366004611768565b61054f565b61020361023d36600461158c565b610704565b61020e6108075481565b61020361025a366004611870565b610714565b61020e61026d3660046116d6565b6109f4565b61020361028036600461158c565b610afa565b61020e610293366004611836565b610b15565b6102036102a63660046116ff565b610b62565b6101d86102b9366004611836565b610c30565b61020e6102cc366004611539565b610cc4565b61020e61080a5481565b610809546101d8906001600160a01b031681565b6101b8610d31565b61020361030536600461169c565b610d3e565b61020e6108085481565b6102036103223660046115c7565b610dab565b61033a610335366004611836565b610e14565b604080519384526020840192909252908201526060016101a7565b6101b8610363366004611836565b610e48565b61019b61037636600461184e565b610ef3565b61019b61038936600461155a565b610f4b565b6000805461039b90611a68565b80601f01602080910402602001604051908101604052809291908181526020018280546103c790611a68565b80156104145780601f106103e957610100808354040283529160200191610414565b820191906000526020600020905b8154815290600101906020018083116103f757829003601f168201915b505050505081565b600061042782610c30565b5061040582610400811061044b57634e487b7160e01b600052603260045260246000fd5b01546001600160a01b031690505b919050565b600061046982610c30565b9050336001600160a01b038216148061048757506104878133610f4b565b6104d85760405162461bcd60e51b815260206004820152601e60248201527f4e6f74206f776e6572206e6f7220617070726f76656420666f7220616c6c000060448201526064015b60405180910390fd5b826104058361040081106104fc57634e487b7160e01b600052603260045260246000fd5b0180546001600160a01b0319166001600160a01b03928316179055604051839185811691908416907f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92590600090a4505050565b84811461055b57600080fd5b6108085460005b868110156106fa57600088888381811061058c57634e487b7160e01b600052603260045260246000fd5b905060200201358787848181106105b357634e487b7160e01b600052603260045260246000fd5b90506020028101906105c591906119b4565b6040516020016105d793929190611902565b60405160208183030381529060405280519060200120905061062b85858481811061061257634e487b7160e01b600052603260045260246000fd5b9050602002810190610624919061196c565b8584610f7a565b61066c5760405162461bcd60e51b815260206004820152601260248201527124b73b30b634b2103430b9b410383937b7b360711b60448201526064016104cf565b86868381811061068c57634e487b7160e01b600052603260045260246000fd5b905060200281019061069e91906119b4565b61080560008c8c878181106106c357634e487b7160e01b600052603260045260246000fd5b90506020020135815260200190815260200160002091906106e5929190611448565b505080806106f290611aa3565b915050610562565b5050505050505050565b61070f838383611038565b505050565b61080a544210156107675760405162461bcd60e51b815260206004820152601e60248201527f43616e6e6f7420636c61696d206265666f72652073746172742074696d65000060448201526064016104cf565b6002546108075481106107af5760405162461bcd60e51b815260206004820152601060248201526f105b1b081391951cc818db185a5b595960821b60448201526064016104cf565b6040516bffffffffffffffffffffffff193360601b166020820152600090603401604051602081830303815290604052805190602001209050600061080b868154811061080c57634e487b7160e01b600052603260045260246000fd5b9060005260206000209060040201905061080b8054905086106108675760405162461bcd60e51b8152602060048201526013602482015272092dcecc2d8d2c840dacae4d6d8ca92dcc8caf606b1b60448201526064016104cf565b80600201548160010154106108be5760405162461bcd60e51b815260206004820181905260248201527f416c6c204e46547320636c61696d656420696e20746869732061697264726f7060448201526064016104cf565b33600090815260038201602052604090205460ff16156109205760405162461bcd60e51b815260206004820181905260248201527f557365722068617320636c61696d656420696e20746869732061697264726f7060448201526064016104cf565b6109308585836000015485610f7a565b6109725760405162461bcd60e51b815260206004820152601360248201527224b73b30b634b21031b630b4b690383937b7b360691b60448201526064016104cf565b60018101805490600061098483611aa3565b90915550503360008181526003830160205260409020805460ff191660011790556109af908461117c565b604051839033906000907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef908290a46109e98360016119f9565b600255505050505050565b6001600160a01b038216600090815260046020526040812080548310610a525760405162461bcd60e51b8152602060048201526013602482015272496e646578206f7574206f6620626f756e647360681b60448201526064016104cf565b60008060005b610400811015610aee576000610a7061010083611abe565b905080610aaa5760018501610a8761010084611a11565b60048110610aa557634e487b7160e01b600052603260045260246000fd5b015493505b60018185901c1660011415610adb5786831415610acd57509350610af492505050565b82610ad781611aa3565b9350505b5080610ae681611aa3565b915050610a58565b50600080fd5b92915050565b61070f83838360405180602001604052806000815250610dab565b60006002548210610b5e5760405162461bcd60e51b8152602060048201526013602482015272496e646578206f7574206f6620626f756e647360681b60448201526064016104cf565b5090565b610809546001600160a01b03163314610b7a57600080fd5b60005b83811015610c295761080b80546001810182556000919091526004027f49269584b067be73383c276ccddb229298ef6883c3f229e0e1f150dc5ed2f9f801858583818110610bdb57634e487b7160e01b600052603260045260246000fd5b6020029190910135825550838383818110610c0657634e487b7160e01b600052603260045260246000fd5b905060200201358160020181905550508080610c2190611aa3565b915050610b7d565b5050505050565b6000610400821015610c7c5760006005836104008110610c6057634e487b7160e01b600052603260045260246000fd5b01546001600160a01b031690508015610c7a579050610459565b505b60405162461bcd60e51b815260206004820152601d60248201527f517565727920666f72206e6f6e6578697374656e7420746f6b656e496400000060448201526064016104cf565b60006001600160a01b038216610d155760405162461bcd60e51b8152602060048201526016602482015275517565727920666f72207a65726f206164647265737360501b60448201526064016104cf565b506001600160a01b031660009081526004602052604090205490565b6001805461039b90611a68565b336000818152610806602090815260408083206001600160a01b03871680855290835292819020805460ff191686151590811790915590519081529192917f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31910160405180910390a35050565b610db6848484611038565b610dc28484848461125c565b610e0e5760405162461bcd60e51b815260206004820152601f60248201527f5472616e7366657220746f206e6f6e204552433732312072656365697665720060448201526064016104cf565b50505050565b61080b8181548110610e2557600080fd5b600091825260209091206004909102018054600182015460029092015490925083565b6060610e5382610c30565b506000828152610805602052604090208054610e6e90611a68565b80601f0160208091040260200160405190810160405280929190818152602001828054610e9a90611a68565b8015610ee75780601f10610ebc57610100808354040283529160200191610ee7565b820191906000526020600020905b815481529060010190602001808311610eca57829003601f168201915b50505050509050919050565b600061080b8381548110610f1757634e487b7160e01b600052603260045260246000fd5b600091825260208083206001600160a01b03861684526003600490930201919091019052604090205460ff16905092915050565b6001600160a01b0391821660009081526108066020908152604080832093909416825291909152205460ff1690565b600081815b8581101561102a576000878783818110610fa957634e487b7160e01b600052603260045260246000fd5b905060200201359050808311610fea576040805160208101859052908101829052606001604051602081830303815290604052805190602001209250611017565b60408051602081018390529081018490526060016040516020818303038152906040528051906020012092505b508061102281611aa3565b915050610f7f565b50831490505b949350505050565b6001600160a01b03831661104b57600080fd5b6001600160a01b03821661105e57600080fd5b600061106982610c30565b9050336001600160a01b03821614806110925750336110878361041c565b6001600160a01b0316145b806110a257506110a28133610f4b565b15611134576104058261040081106110ca57634e487b7160e01b600052603260045260246000fd5b0180546001600160a01b03191690556110e384836113a6565b6110ed838361117c565b81836001600160a01b0316856001600160a01b03167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a45061070f565b60405162461bcd60e51b815260206004820181905260248201527f43616c6c6572206973206e6f74206f776e6572206e6f7220617070726f76656460448201526064016104cf565b81600582610400811061119f57634e487b7160e01b600052603260045260246000fd5b0180546001600160a01b0319166001600160a01b0392831617905582166000908152600460205260408120805490916001918391906111df9084906119f9565b90915550600090506111f361010084611a11565b9050600082600101826004811061121a57634e487b7160e01b600052603260045260246000fd5b0154905061122a61010085611abe565b6001901b811783600101836004811061125357634e487b7160e01b600052603260045260246000fd5b01555050505050565b6000833b8061126f576001915050611030565b600080866001600160a01b0316600063150b7a0260e01b338b8a8a60405160240161129d949392919061191c565b60408051601f198184030181529181526020820180516001600160e01b03166001600160e01b03199094169390931790925290516112db91906118e6565b60006040518083038185875af1925050503d8060008114611318576040519150601f19603f3d011682016040523d82523d6000602084013e61131d565b606091505b50915091508161136f5760405162461bcd60e51b815260206004820152601f60248201527f5472616e7366657220746f206e6f6e204552433732312072656365697665720060448201526064016104cf565b600081806020019051810190611385919061181a565b6001600160e01b031916630a85bd0160e11b14945050505050949350505050565b6001600160a01b0382166000908152600460205260408120805490916001918391906113d3908490611a25565b90915550600090506113e761010084611a11565b9050600082600101826004811061140e57634e487b7160e01b600052603260045260246000fd5b0154905061141e61010085611abe565b6001901b19811683600101836004811061125357634e487b7160e01b600052603260045260246000fd5b82805461145490611a68565b90600052602060002090601f01602090048101928261147657600085556114bc565b82601f1061148f5782800160ff198235161785556114bc565b828001600101855582156114bc579182015b828111156114bc5782358255916020019190600101906114a1565b50610b5e9291505b80821115610b5e57600081556001016114c4565b80356001600160a01b038116811461045957600080fd5b60008083601f840112611500578081fd5b50813567ffffffffffffffff811115611517578182fd5b6020830191508360208260051b850101111561153257600080fd5b9250929050565b60006020828403121561154a578081fd5b611553826114d8565b9392505050565b6000806040838503121561156c578081fd5b611575836114d8565b9150611583602084016114d8565b90509250929050565b6000806000606084860312156115a0578081fd5b6115a9846114d8565b92506115b7602085016114d8565b9150604084013590509250925092565b600080600080608085870312156115dc578081fd5b6115e5856114d8565b93506115f3602086016114d8565b925060408501359150606085013567ffffffffffffffff80821115611616578283fd5b818701915087601f830112611629578283fd5b81358181111561163b5761163b611afe565b604051601f8201601f19908116603f0116810190838211818310171561166357611663611afe565b816040528281528a602084870101111561167b578586fd5b82602086016020830137918201602001949094529598949750929550505050565b600080604083850312156116ae578182fd5b6116b7836114d8565b9150602083013580151581146116cb578182fd5b809150509250929050565b600080604083850312156116e8578182fd5b6116f1836114d8565b946020939093013593505050565b60008060008060408587031215611714578384fd5b843567ffffffffffffffff8082111561172b578586fd5b611737888389016114ef565b9096509450602087013591508082111561174f578384fd5b5061175c878288016114ef565b95989497509550505050565b60008060008060008060608789031215611780578182fd5b863567ffffffffffffffff80821115611797578384fd5b6117a38a838b016114ef565b909850965060208901359150808211156117bb578384fd5b6117c78a838b016114ef565b909650945060408901359150808211156117df578384fd5b506117ec89828a016114ef565b979a9699509497509295939492505050565b60006020828403121561180f578081fd5b813561155381611b14565b60006020828403121561182b578081fd5b815161155381611b14565b600060208284031215611847578081fd5b5035919050565b60008060408385031215611860578182fd5b82359150611583602084016114d8565b600080600060408486031215611884578081fd5b83359250602084013567ffffffffffffffff8111156118a1578182fd5b6118ad868287016114ef565b9497909650939450505050565b600081518084526118d2816020860160208601611a3c565b601f01601f19169290920160200192915050565b600082516118f8818460208701611a3c565b9190910192915050565b600084825282846020840137910160200190815292915050565b6001600160a01b038581168252841660208201526040810183905260806060820181905260009061194f908301846118ba565b9695505050505050565b60006020825261155360208301846118ba565b6000808335601e19843603018112611982578283fd5b83018035915067ffffffffffffffff82111561199c578283fd5b6020019150600581901b360382131561153257600080fd5b6000808335601e198436030181126119ca578182fd5b83018035915067ffffffffffffffff8211156119e4578283fd5b60200191503681900382131561153257600080fd5b60008219821115611a0c57611a0c611ad2565b500190565b600082611a2057611a20611ae8565b500490565b600082821015611a3757611a37611ad2565b500390565b60005b83811015611a57578181015183820152602001611a3f565b83811115610e0e5750506000910152565b600181811c90821680611a7c57607f821691505b60208210811415611a9d57634e487b7160e01b600052602260045260246000fd5b50919050565b6000600019821415611ab757611ab7611ad2565b5060010190565b600082611acd57611acd611ae8565b500690565b634e487b7160e01b600052601160045260246000fd5b634e487b7160e01b600052601260045260246000fd5b634e487b7160e01b600052604160045260246000fd5b6001600160e01b031981168114611b2a57600080fd5b5056fea2646970667358221220c9e02a5e461939ae5097cac77464dd08d9eb2ac85a1c2d20c6e0e5381859ddbd64736f6c6343000803003300000000000000000000000000000000000000000000000000000000000000a000000000000000000000000000000000000000000000000000000000000000e03e2e1311030af1d6fc0fcb2ffb3f7504c5e252f9b3fbc25c3a4663dee876efc200000000000000000000000000000000000000000000000000000000000004000000000000000000000000000000000000000000000000000000000060e704e0000000000000000000000000000000000000000000000000000000000000001145766f683a204c6c616d61204672656e73000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000845766f682d435256000000000000000000000000000000000000000000000000

Deployed Bytecode

0x608060405234801561001057600080fd5b50600436106101735760003560e01c806354ef224b116100de578063a22cb46511610097578063c6f0308c11610071578063c6f0308c14610327578063c87b56dd14610355578063d2ef079514610368578063e985e9c51461037b57610173565b8063a22cb465146102f7578063b29a31051461030a578063b88d4fde1461031457610173565b806354ef224b146102985780636352211e146102ab57806370a08231146102be57806378e97925146102d15780638da5cb5b146102db57806395d89b41146102ef57610173565b806323b872dd1161013057806323b872dd1461022f5780632ab4d052146102425780632f52ebb71461024c5780632f745c591461025f57806342842e0e146102725780634f6ccce71461028557610173565b806301ffc9a71461017857806306fdde03146101b0578063081812fc146101c5578063095ea7b3146101f057806318160ddd1461020557806319e41c7e1461021c575b600080fd5b61019b6101863660046117fe565b60036020526000908152604090205460ff1681565b60405190151581526020015b60405180910390f35b6101b861038e565b6040516101a79190611959565b6101d86101d3366004611836565b61041c565b6040516001600160a01b0390911681526020016101a7565b6102036101fe3660046116d6565b61045e565b005b61020e60025481565b6040519081526020016101a7565b61020361022a366004611768565b61054f565b61020361023d36600461158c565b610704565b61020e6108075481565b61020361025a366004611870565b610714565b61020e61026d3660046116d6565b6109f4565b61020361028036600461158c565b610afa565b61020e610293366004611836565b610b15565b6102036102a63660046116ff565b610b62565b6101d86102b9366004611836565b610c30565b61020e6102cc366004611539565b610cc4565b61020e61080a5481565b610809546101d8906001600160a01b031681565b6101b8610d31565b61020361030536600461169c565b610d3e565b61020e6108085481565b6102036103223660046115c7565b610dab565b61033a610335366004611836565b610e14565b604080519384526020840192909252908201526060016101a7565b6101b8610363366004611836565b610e48565b61019b61037636600461184e565b610ef3565b61019b61038936600461155a565b610f4b565b6000805461039b90611a68565b80601f01602080910402602001604051908101604052809291908181526020018280546103c790611a68565b80156104145780601f106103e957610100808354040283529160200191610414565b820191906000526020600020905b8154815290600101906020018083116103f757829003601f168201915b505050505081565b600061042782610c30565b5061040582610400811061044b57634e487b7160e01b600052603260045260246000fd5b01546001600160a01b031690505b919050565b600061046982610c30565b9050336001600160a01b038216148061048757506104878133610f4b565b6104d85760405162461bcd60e51b815260206004820152601e60248201527f4e6f74206f776e6572206e6f7220617070726f76656420666f7220616c6c000060448201526064015b60405180910390fd5b826104058361040081106104fc57634e487b7160e01b600052603260045260246000fd5b0180546001600160a01b0319166001600160a01b03928316179055604051839185811691908416907f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92590600090a4505050565b84811461055b57600080fd5b6108085460005b868110156106fa57600088888381811061058c57634e487b7160e01b600052603260045260246000fd5b905060200201358787848181106105b357634e487b7160e01b600052603260045260246000fd5b90506020028101906105c591906119b4565b6040516020016105d793929190611902565b60405160208183030381529060405280519060200120905061062b85858481811061061257634e487b7160e01b600052603260045260246000fd5b9050602002810190610624919061196c565b8584610f7a565b61066c5760405162461bcd60e51b815260206004820152601260248201527124b73b30b634b2103430b9b410383937b7b360711b60448201526064016104cf565b86868381811061068c57634e487b7160e01b600052603260045260246000fd5b905060200281019061069e91906119b4565b61080560008c8c878181106106c357634e487b7160e01b600052603260045260246000fd5b90506020020135815260200190815260200160002091906106e5929190611448565b505080806106f290611aa3565b915050610562565b5050505050505050565b61070f838383611038565b505050565b61080a544210156107675760405162461bcd60e51b815260206004820152601e60248201527f43616e6e6f7420636c61696d206265666f72652073746172742074696d65000060448201526064016104cf565b6002546108075481106107af5760405162461bcd60e51b815260206004820152601060248201526f105b1b081391951cc818db185a5b595960821b60448201526064016104cf565b6040516bffffffffffffffffffffffff193360601b166020820152600090603401604051602081830303815290604052805190602001209050600061080b868154811061080c57634e487b7160e01b600052603260045260246000fd5b9060005260206000209060040201905061080b8054905086106108675760405162461bcd60e51b8152602060048201526013602482015272092dcecc2d8d2c840dacae4d6d8ca92dcc8caf606b1b60448201526064016104cf565b80600201548160010154106108be5760405162461bcd60e51b815260206004820181905260248201527f416c6c204e46547320636c61696d656420696e20746869732061697264726f7060448201526064016104cf565b33600090815260038201602052604090205460ff16156109205760405162461bcd60e51b815260206004820181905260248201527f557365722068617320636c61696d656420696e20746869732061697264726f7060448201526064016104cf565b6109308585836000015485610f7a565b6109725760405162461bcd60e51b815260206004820152601360248201527224b73b30b634b21031b630b4b690383937b7b360691b60448201526064016104cf565b60018101805490600061098483611aa3565b90915550503360008181526003830160205260409020805460ff191660011790556109af908461117c565b604051839033906000907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef908290a46109e98360016119f9565b600255505050505050565b6001600160a01b038216600090815260046020526040812080548310610a525760405162461bcd60e51b8152602060048201526013602482015272496e646578206f7574206f6620626f756e647360681b60448201526064016104cf565b60008060005b610400811015610aee576000610a7061010083611abe565b905080610aaa5760018501610a8761010084611a11565b60048110610aa557634e487b7160e01b600052603260045260246000fd5b015493505b60018185901c1660011415610adb5786831415610acd57509350610af492505050565b82610ad781611aa3565b9350505b5080610ae681611aa3565b915050610a58565b50600080fd5b92915050565b61070f83838360405180602001604052806000815250610dab565b60006002548210610b5e5760405162461bcd60e51b8152602060048201526013602482015272496e646578206f7574206f6620626f756e647360681b60448201526064016104cf565b5090565b610809546001600160a01b03163314610b7a57600080fd5b60005b83811015610c295761080b80546001810182556000919091526004027f49269584b067be73383c276ccddb229298ef6883c3f229e0e1f150dc5ed2f9f801858583818110610bdb57634e487b7160e01b600052603260045260246000fd5b6020029190910135825550838383818110610c0657634e487b7160e01b600052603260045260246000fd5b905060200201358160020181905550508080610c2190611aa3565b915050610b7d565b5050505050565b6000610400821015610c7c5760006005836104008110610c6057634e487b7160e01b600052603260045260246000fd5b01546001600160a01b031690508015610c7a579050610459565b505b60405162461bcd60e51b815260206004820152601d60248201527f517565727920666f72206e6f6e6578697374656e7420746f6b656e496400000060448201526064016104cf565b60006001600160a01b038216610d155760405162461bcd60e51b8152602060048201526016602482015275517565727920666f72207a65726f206164647265737360501b60448201526064016104cf565b506001600160a01b031660009081526004602052604090205490565b6001805461039b90611a68565b336000818152610806602090815260408083206001600160a01b03871680855290835292819020805460ff191686151590811790915590519081529192917f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31910160405180910390a35050565b610db6848484611038565b610dc28484848461125c565b610e0e5760405162461bcd60e51b815260206004820152601f60248201527f5472616e7366657220746f206e6f6e204552433732312072656365697665720060448201526064016104cf565b50505050565b61080b8181548110610e2557600080fd5b600091825260209091206004909102018054600182015460029092015490925083565b6060610e5382610c30565b506000828152610805602052604090208054610e6e90611a68565b80601f0160208091040260200160405190810160405280929190818152602001828054610e9a90611a68565b8015610ee75780601f10610ebc57610100808354040283529160200191610ee7565b820191906000526020600020905b815481529060010190602001808311610eca57829003601f168201915b50505050509050919050565b600061080b8381548110610f1757634e487b7160e01b600052603260045260246000fd5b600091825260208083206001600160a01b03861684526003600490930201919091019052604090205460ff16905092915050565b6001600160a01b0391821660009081526108066020908152604080832093909416825291909152205460ff1690565b600081815b8581101561102a576000878783818110610fa957634e487b7160e01b600052603260045260246000fd5b905060200201359050808311610fea576040805160208101859052908101829052606001604051602081830303815290604052805190602001209250611017565b60408051602081018390529081018490526060016040516020818303038152906040528051906020012092505b508061102281611aa3565b915050610f7f565b50831490505b949350505050565b6001600160a01b03831661104b57600080fd5b6001600160a01b03821661105e57600080fd5b600061106982610c30565b9050336001600160a01b03821614806110925750336110878361041c565b6001600160a01b0316145b806110a257506110a28133610f4b565b15611134576104058261040081106110ca57634e487b7160e01b600052603260045260246000fd5b0180546001600160a01b03191690556110e384836113a6565b6110ed838361117c565b81836001600160a01b0316856001600160a01b03167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a45061070f565b60405162461bcd60e51b815260206004820181905260248201527f43616c6c6572206973206e6f74206f776e6572206e6f7220617070726f76656460448201526064016104cf565b81600582610400811061119f57634e487b7160e01b600052603260045260246000fd5b0180546001600160a01b0319166001600160a01b0392831617905582166000908152600460205260408120805490916001918391906111df9084906119f9565b90915550600090506111f361010084611a11565b9050600082600101826004811061121a57634e487b7160e01b600052603260045260246000fd5b0154905061122a61010085611abe565b6001901b811783600101836004811061125357634e487b7160e01b600052603260045260246000fd5b01555050505050565b6000833b8061126f576001915050611030565b600080866001600160a01b0316600063150b7a0260e01b338b8a8a60405160240161129d949392919061191c565b60408051601f198184030181529181526020820180516001600160e01b03166001600160e01b03199094169390931790925290516112db91906118e6565b60006040518083038185875af1925050503d8060008114611318576040519150601f19603f3d011682016040523d82523d6000602084013e61131d565b606091505b50915091508161136f5760405162461bcd60e51b815260206004820152601f60248201527f5472616e7366657220746f206e6f6e204552433732312072656365697665720060448201526064016104cf565b600081806020019051810190611385919061181a565b6001600160e01b031916630a85bd0160e11b14945050505050949350505050565b6001600160a01b0382166000908152600460205260408120805490916001918391906113d3908490611a25565b90915550600090506113e761010084611a11565b9050600082600101826004811061140e57634e487b7160e01b600052603260045260246000fd5b0154905061141e61010085611abe565b6001901b19811683600101836004811061125357634e487b7160e01b600052603260045260246000fd5b82805461145490611a68565b90600052602060002090601f01602090048101928261147657600085556114bc565b82601f1061148f5782800160ff198235161785556114bc565b828001600101855582156114bc579182015b828111156114bc5782358255916020019190600101906114a1565b50610b5e9291505b80821115610b5e57600081556001016114c4565b80356001600160a01b038116811461045957600080fd5b60008083601f840112611500578081fd5b50813567ffffffffffffffff811115611517578182fd5b6020830191508360208260051b850101111561153257600080fd5b9250929050565b60006020828403121561154a578081fd5b611553826114d8565b9392505050565b6000806040838503121561156c578081fd5b611575836114d8565b9150611583602084016114d8565b90509250929050565b6000806000606084860312156115a0578081fd5b6115a9846114d8565b92506115b7602085016114d8565b9150604084013590509250925092565b600080600080608085870312156115dc578081fd5b6115e5856114d8565b93506115f3602086016114d8565b925060408501359150606085013567ffffffffffffffff80821115611616578283fd5b818701915087601f830112611629578283fd5b81358181111561163b5761163b611afe565b604051601f8201601f19908116603f0116810190838211818310171561166357611663611afe565b816040528281528a602084870101111561167b578586fd5b82602086016020830137918201602001949094529598949750929550505050565b600080604083850312156116ae578182fd5b6116b7836114d8565b9150602083013580151581146116cb578182fd5b809150509250929050565b600080604083850312156116e8578182fd5b6116f1836114d8565b946020939093013593505050565b60008060008060408587031215611714578384fd5b843567ffffffffffffffff8082111561172b578586fd5b611737888389016114ef565b9096509450602087013591508082111561174f578384fd5b5061175c878288016114ef565b95989497509550505050565b60008060008060008060608789031215611780578182fd5b863567ffffffffffffffff80821115611797578384fd5b6117a38a838b016114ef565b909850965060208901359150808211156117bb578384fd5b6117c78a838b016114ef565b909650945060408901359150808211156117df578384fd5b506117ec89828a016114ef565b979a9699509497509295939492505050565b60006020828403121561180f578081fd5b813561155381611b14565b60006020828403121561182b578081fd5b815161155381611b14565b600060208284031215611847578081fd5b5035919050565b60008060408385031215611860578182fd5b82359150611583602084016114d8565b600080600060408486031215611884578081fd5b83359250602084013567ffffffffffffffff8111156118a1578182fd5b6118ad868287016114ef565b9497909650939450505050565b600081518084526118d2816020860160208601611a3c565b601f01601f19169290920160200192915050565b600082516118f8818460208701611a3c565b9190910192915050565b600084825282846020840137910160200190815292915050565b6001600160a01b038581168252841660208201526040810183905260806060820181905260009061194f908301846118ba565b9695505050505050565b60006020825261155360208301846118ba565b6000808335601e19843603018112611982578283fd5b83018035915067ffffffffffffffff82111561199c578283fd5b6020019150600581901b360382131561153257600080fd5b6000808335601e198436030181126119ca578182fd5b83018035915067ffffffffffffffff8211156119e4578283fd5b60200191503681900382131561153257600080fd5b60008219821115611a0c57611a0c611ad2565b500190565b600082611a2057611a20611ae8565b500490565b600082821015611a3757611a37611ad2565b500390565b60005b83811015611a57578181015183820152602001611a3f565b83811115610e0e5750506000910152565b600181811c90821680611a7c57607f821691505b60208210811415611a9d57634e487b7160e01b600052602260045260246000fd5b50919050565b6000600019821415611ab757611ab7611ad2565b5060010190565b600082611acd57611acd611ae8565b500690565b634e487b7160e01b600052601160045260246000fd5b634e487b7160e01b600052601260045260246000fd5b634e487b7160e01b600052604160045260246000fd5b6001600160e01b031981168114611b2a57600080fd5b5056fea2646970667358221220c9e02a5e461939ae5097cac77464dd08d9eb2ac85a1c2d20c6e0e5381859ddbd64736f6c63430008030033

Loading...
Loading
Loading...
Loading
[ 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.