ETH Price: $3,124.64 (+2.25%)
Gas: 7 Gwei

Token

Evoh: Llama Frens (Evoh-CRV)
 

Overview

Max Total Supply

1,024 Evoh-CRV

Holders

707

Market

Volume (24H)

N/A

Min Price (24H)

N/A

Max Price (24H)

N/A

Other Info

Balance
9 Evoh-CRV
0x94a468fcb53a043bf5cd95ef21892e02c71134be
Loading...
Loading
Loading...
Loading
Loading...
Loading

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

Contract Source Code Verified (Exact Match)

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

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

00000000000000000000000000000000000000000000000000000000000000a000000000000000000000000000000000000000000000000000000000000000e03e2e1311030af1d6fc0fcb2ffb3f7504c5e252f9b3fbc25c3a4663dee876efc200000000000000000000000000000000000000000000000000000000000004000000000000000000000000000000000000000000000000000000000060e704e0000000000000000000000000000000000000000000000000000000000000001145766f683a204c6c616d61204672656e73000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000845766f682d435256000000000000000000000000000000000000000000000000

-----Decoded View---------------
Arg [0] : _name (string): Evoh: Llama Frens
Arg [1] : _symbol (string): Evoh-CRV
Arg [2] : _hashRoot (bytes32): 0x3e2e1311030af1d6fc0fcb2ffb3f7504c5e252f9b3fbc25c3a4663dee876efc2
Arg [3] : _maxTotalSupply (uint256): 1024
Arg [4] : _startTime (uint256): 1625752800

-----Encoded View---------------
9 Constructor Arguments found :
Arg [0] : 00000000000000000000000000000000000000000000000000000000000000a0
Arg [1] : 00000000000000000000000000000000000000000000000000000000000000e0
Arg [2] : 3e2e1311030af1d6fc0fcb2ffb3f7504c5e252f9b3fbc25c3a4663dee876efc2
Arg [3] : 0000000000000000000000000000000000000000000000000000000000000400
Arg [4] : 0000000000000000000000000000000000000000000000000000000060e704e0
Arg [5] : 0000000000000000000000000000000000000000000000000000000000000011
Arg [6] : 45766f683a204c6c616d61204672656e73000000000000000000000000000000
Arg [7] : 0000000000000000000000000000000000000000000000000000000000000008
Arg [8] : 45766f682d435256000000000000000000000000000000000000000000000000


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.