ETH Price: $3,398.77 (+1.92%)

Token

MemeCalf-NFT (MemeCalf)
 

Overview

Max Total Supply

20,000 MemeCalf

Holders

335

Market

Volume (24H)

N/A

Min Price (24H)

N/A

Max Price (24H)

N/A
Filtered by Token Holder
9x9x9.eth
Balance
1 MemeCalf
0x8c0d2B62F133Db265EC8554282eE60EcA0Fd5a9E
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:
newNFT

Compiler Version
v0.8.0+commit.c7dfd78e

Optimization Enabled:
Yes with 200 runs

Other Settings:
default evmVersion, None license

Contract Source Code (Solidity)

/**
 *Submitted for verification at Etherscan.io on 2021-07-15
*/

// SPDX-License-Identifier: MIT
pragma solidity 0.8.0;

/**
 * @dev ERC-721 non-fungible token standard.
 * See https://github.com/ethereum/EIPs/blob/master/EIPS/eip-721.md.
 */
interface ERC721
{

  /**
   * @dev Emits when ownership of any NFT changes by any mechanism. This event emits when NFTs are
   * created (`from` == 0) and destroyed (`to` == 0). Exception: during contract creation, any
   * number of NFTs may be created and assigned without emitting Transfer. At the time of any
   * transfer, the approved address for that NFT (if any) is reset to none.
   */
  event Transfer(
    address indexed _from,
    address indexed _to,
    uint256 indexed _tokenId
  );

  /**
   * @dev This emits when the approved address for an NFT is changed or reaffirmed. The zero
   * address indicates there is no approved address. When a Transfer event emits, this also
   * indicates that the approved address for that NFT (if any) is reset to none.
   */
  event Approval(
    address indexed _owner,
    address indexed _approved,
    uint256 indexed _tokenId
  );

  /**
   * @dev This emits when an operator is enabled or disabled for an owner. The operator can manage
   * all NFTs of the owner.
   */
  event ApprovalForAll(
    address indexed _owner,
    address indexed _operator,
    bool _approved
  );

  /**
   * @dev Transfers the ownership of an NFT from one address to another address.
   * @notice 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,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 calldata _data
  )
    external;

  /**
   * @dev Transfers the ownership of an NFT from one address to another address.
   * @notice 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;

  /**
   * @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.
   * @notice The caller is responsible to confirm that `_to` is capable of receiving NFTs or else
   * they may be permanently lost.
   * @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;

  /**
   * @dev Set or reaffirm the approved address for an NFT.
   * @notice The zero address indicates there is no approved address. Throws unless `msg.sender` is
   * the current NFT owner, or an authorized operator of the current owner.
   * @param _approved The new approved NFT controller.
   * @param _tokenId The NFT to approve.
   */
  function approve(
    address _approved,
    uint256 _tokenId
  )
    external;

  /**
   * @dev Enables or disables approval for a third party ("operator") to manage all of
   * `msg.sender`'s assets. It also emits the ApprovalForAll event.
   * @notice The contract MUST allow multiple operators per owner.
   * @param _operator Address to add to the set of authorized operators.
   * @param _approved True if the operators is approved, false to revoke approval.
   */
  function setApprovalForAll(
    address _operator,
    bool _approved
  )
    external;

  /**
   * @dev Returns the number of NFTs owned by `_owner`. NFTs assigned to the zero address are
   * considered invalid, and this function throws for queries about the zero address.
   * @param _owner Address for whom to query the balance.
   * @return Balance of _owner.
   */
  function balanceOf(
    address _owner
  )
    external
    view
    returns (uint256);

  /**
   * @dev Returns the address of the owner of the NFT. NFTs assigned to the zero address are
   * considered invalid, and queries about them do throw.
   * @param _tokenId The identifier for an NFT.
   * @return Address of _tokenId owner.
   */
  function ownerOf(
    uint256 _tokenId
  )
    external
    view
    returns (address);

  /**
   * @dev Get the approved address for a single NFT.
   * @notice Throws if `_tokenId` is not a valid NFT.
   * @param _tokenId The NFT to find the approved address for.
   * @return Address that _tokenId is approved for.
   */
  function getApproved(
    uint256 _tokenId
  )
    external
    view
    returns (address);

  /**
   * @dev Returns true if `_operator` is an approved operator for `_owner`, false otherwise.
   * @param _owner The address that owns the NFTs.
   * @param _operator The address that acts on behalf of the owner.
   * @return True if approved for all, false otherwise.
   */
  function isApprovedForAll(
    address _owner,
    address _operator
  )
    external
    view
    returns (bool);

}
/**
 * @dev Optional metadata extension for ERC-721 non-fungible token standard.
 * See https://github.com/ethereum/EIPs/blob/master/EIPS/eip-721.md.
 */
interface ERC721Metadata
{

  /**
   * @dev Returns a descriptive name for a collection of NFTs in this contract.
   * @return _name Representing name.
   */
  function name()
    external
    view
    returns (string memory _name);

  /**
   * @dev Returns a abbreviated name for a collection of NFTs in this contract.
   * @return _symbol Representing symbol.
   */
  function symbol()
    external
    view
    returns (string memory _symbol);

  /**
   * @dev Returns a distinct Uniform Resource Identifier (URI) for a given asset. It Throws if
   * `_tokenId` is not a valid NFT. URIs are defined in RFC3986. The URI may point to a JSON file
   * that conforms to the "ERC721 Metadata JSON Schema".
   * @return URI of _tokenId.
   */
  function tokenURI(uint256 _tokenId)
    external
    view
    returns (string memory);

}
/**
 * @dev Utility library of inline functions on addresses.
 * @notice Based on:
 * https://github.com/OpenZeppelin/openzeppelin-contracts/blob/master/contracts/utils/Address.sol
 * Requires EIP-1052.
 */
library AddressUtils
{

  /**
   * @dev Returns whether the target address is a contract.
   * @param _addr Address to check.
   * @return addressCheck True if _addr is a contract, false if not.
   */
  function isContract(
    address _addr
  )
    internal
    view
    returns (bool addressCheck)
  {
    // This method relies in extcodesize, which returns 0 for contracts in
    // construction, since the code is only stored at the end of the
    // constructor execution.

    // According to EIP-1052, 0x0 is the value returned for not-yet created accounts
    // and 0xc5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a470 is returned
    // for accounts without code, i.e. `keccak256('')`
    bytes32 codehash;
    bytes32 accountHash = 0xc5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a470;
    assembly { codehash := extcodehash(_addr) } // solhint-disable-line
    addressCheck = (codehash != 0x0 && codehash != accountHash);
  }

}
/**
 * @dev A standard for detecting smart contract interfaces. 
 * See: https://eips.ethereum.org/EIPS/eip-165.
 */
interface ERC165
{

  /**
   * @dev Checks if the smart contract includes a specific interface.
   * This function uses less than 30,000 gas.
   * @param _interfaceID The interface identifier, as specified in ERC-165.
   * @return True if _interfaceID is supported, false otherwise.
   */
  function supportsInterface(
    bytes4 _interfaceID
  )
    external
    view
    returns (bool);
    
}
/**
 * @dev ERC-721 interface for accepting safe transfers.
 * See https://github.com/ethereum/EIPs/blob/master/EIPS/eip-721.md.
 */
interface ERC721TokenReceiver
{

  /**
   * @dev Handle the receipt of a NFT. 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.
   * Returns `bytes4(keccak256("onERC721Received(address,address,uint256,bytes)"))` unless throwing.
   * @notice The contract address is always the message sender. A wallet/broker/auction application
   * MUST implement the wallet interface if it will accept safe transfers.
   * @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 Returns `bytes4(keccak256("onERC721Received(address,address,uint256,bytes)"))`.
   */
  function onERC721Received(
    address _operator,
    address _from,
    uint256 _tokenId,
    bytes calldata _data
  )
    external
    returns(bytes4);

}
/**
 * @dev Implementation of standard for detect smart contract interfaces.
 */
contract SupportsInterface is
  ERC165
{

  /**
   * @dev Mapping of supported intefraces. You must not set element 0xffffffff to true.
   */
  mapping(bytes4 => bool) internal supportedInterfaces;

  /**
   * @dev Contract constructor.
   */
  constructor()
  {
    supportedInterfaces[0x01ffc9a7] = true; // ERC165
  }

  /**
   * @dev Function to check which interfaces are suported by this contract.
   * @param _interfaceID Id of the interface.
   * @return True if _interfaceID is supported, false otherwise.
   */
  function supportsInterface(
    bytes4 _interfaceID
  )
    external
    override
    view
    returns (bool)
  {
    return supportedInterfaces[_interfaceID];
  }

}
/**
 * @dev Implementation of ERC-721 non-fungible token standard.
 */
contract NFToken is
  ERC721,
  SupportsInterface
{
  using AddressUtils for address;

  /**
   * @dev List of revert message codes. Implementing dApp should handle showing the correct message.
   * Based on 0xcert framework error codes.
   */
  string constant ZERO_ADDRESS = "003001";
  string constant NOT_VALID_NFT = "003002";
  string constant NOT_OWNER_OR_OPERATOR = "003003";
  string constant NOT_OWNER_APPROVED_OR_OPERATOR = "003004";
  string constant NOT_ABLE_TO_RECEIVE_NFT = "003005";
  string constant NFT_ALREADY_EXISTS = "003006";
  string constant NOT_OWNER = "003007";
  string constant IS_OWNER = "003008";

  /**
   * @dev Magic value of a smart contract that can receive NFT.
   * Equal to: bytes4(keccak256("onERC721Received(address,address,uint256,bytes)")).
   */
  bytes4 internal constant MAGIC_ON_ERC721_RECEIVED = 0x150b7a02;

  /**
   * @dev A mapping from NFT ID to the address that owns it.
   */
  mapping (uint256 => address) internal idToOwner;

  /**
   * @dev Mapping from NFT ID to approved address.
   */
  mapping (uint256 => address) internal idToApproval;

   /**
   * @dev Mapping from owner address to count of their tokens.
   */
  mapping (address => uint256) private ownerToNFTokenCount;

  /**
   * @dev Mapping from owner address to mapping of operator addresses.
   */
  mapping (address => mapping (address => bool)) internal ownerToOperators;

  /**
   * @dev Guarantees that the msg.sender is an owner or operator of the given NFT.
   * @param _tokenId ID of the NFT to validate.
   */
  modifier canOperate(
    uint256 _tokenId
  )
  {
    address tokenOwner = idToOwner[_tokenId];
    require(
      tokenOwner == msg.sender || ownerToOperators[tokenOwner][msg.sender],
      NOT_OWNER_OR_OPERATOR
    );
    _;
  }

  /**
   * @dev Guarantees that the msg.sender is allowed to transfer NFT.
   * @param _tokenId ID of the NFT to transfer.
   */
  modifier canTransfer(
    uint256 _tokenId
  )
  {
    address tokenOwner = idToOwner[_tokenId];
    require(
      tokenOwner == msg.sender
      || idToApproval[_tokenId] == msg.sender
      || ownerToOperators[tokenOwner][msg.sender],
      NOT_OWNER_APPROVED_OR_OPERATOR
    );
    _;
  }

  /**
   * @dev Guarantees that _tokenId is a valid Token.
   * @param _tokenId ID of the NFT to validate.
   */
  modifier validNFToken(
    uint256 _tokenId
  )
  {
    require(idToOwner[_tokenId] != address(0), NOT_VALID_NFT);
    _;
  }

  /**
   * @dev Contract constructor.
   */
  constructor()
  {
    supportedInterfaces[0x80ac58cd] = true; // ERC721
  }

  /**
   * @dev Transfers the ownership of an NFT from one address to another address. This function can
   * be changed to payable.
   * @notice 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,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 calldata _data
  )
    external
    override
  {
    _safeTransferFrom(_from, _to, _tokenId, _data);
  }

  /**
   * @dev Transfers the ownership of an NFT from one address to another address. This function can
   * be changed to payable.
   * @notice 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
    override
  {
    _safeTransferFrom(_from, _to, _tokenId, "");
  }

  /**
   * @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. This function can be changed to payable.
   * @notice The caller is responsible to confirm that `_to` is capable of receiving NFTs or else
   * they may be permanently lost.
   * @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
    override
    canTransfer(_tokenId)
    validNFToken(_tokenId)
  {
    address tokenOwner = idToOwner[_tokenId];
    require(tokenOwner == _from, NOT_OWNER);
    require(_to != address(0), ZERO_ADDRESS);

    _transfer(_to, _tokenId);
  }

  /**
   * @dev Set or reaffirm the approved address for an NFT. This function can be changed to payable.
   * @notice The zero address indicates there is no approved address. Throws unless `msg.sender` is
   * the current NFT owner, or an authorized operator of the current owner.
   * @param _approved Address to be approved for the given NFT ID.
   * @param _tokenId ID of the token to be approved.
   */
  function approve(
    address _approved,
    uint256 _tokenId
  )
    external
    override
    canOperate(_tokenId)
    validNFToken(_tokenId)
  {
    address tokenOwner = idToOwner[_tokenId];
    require(_approved != tokenOwner, IS_OWNER);

    idToApproval[_tokenId] = _approved;
    emit Approval(tokenOwner, _approved, _tokenId);
  }

  /**
   * @dev Enables or disables approval for a third party ("operator") to manage all of
   * `msg.sender`'s assets. It also emits the ApprovalForAll event.
   * @notice This works even if sender doesn't own any tokens at the time.
   * @param _operator Address to add to the set of authorized operators.
   * @param _approved True if the operators is approved, false to revoke approval.
   */
  function setApprovalForAll(
    address _operator,
    bool _approved
  )
    external
    override
  {
    ownerToOperators[msg.sender][_operator] = _approved;
    emit ApprovalForAll(msg.sender, _operator, _approved);
  }

  /**
   * @dev Returns the number of NFTs owned by `_owner`. NFTs assigned to the zero address are
   * considered invalid, and this function throws for queries about the zero address.
   * @param _owner Address for whom to query the balance.
   * @return Balance of _owner.
   */
  function balanceOf(
    address _owner
  )
    external
    override
    view
    returns (uint256)
  {
    require(_owner != address(0), ZERO_ADDRESS);
    return _getOwnerNFTCount(_owner);
  }

  /**
   * @dev Returns the address of the owner of the NFT. NFTs assigned to the zero address are
   * considered invalid, and queries about them do throw.
   * @param _tokenId The identifier for an NFT.
   * @return _owner Address of _tokenId owner.
   */
  function ownerOf(
    uint256 _tokenId
  )
    external
    override
    view
    returns (address _owner)
  {
    _owner = idToOwner[_tokenId];
    require(_owner != address(0), NOT_VALID_NFT);
  }

  /**
   * @dev Get the approved address for a single NFT.
   * @notice Throws if `_tokenId` is not a valid NFT.
   * @param _tokenId ID of the NFT to query the approval of.
   * @return Address that _tokenId is approved for.
   */
  function getApproved(
    uint256 _tokenId
  )
    external
    override
    view
    validNFToken(_tokenId)
    returns (address)
  {
    return idToApproval[_tokenId];
  }

  /**
   * @dev Checks if `_operator` is an approved operator for `_owner`.
   * @param _owner The address that owns the NFTs.
   * @param _operator The address that acts on behalf of the owner.
   * @return True if approved for all, false otherwise.
   */
  function isApprovedForAll(
    address _owner,
    address _operator
  )
    external
    override
    view
    returns (bool)
  {
    return ownerToOperators[_owner][_operator];
  }

  /**
   * @dev Actually performs the transfer.
   * @notice Does NO checks.
   * @param _to Address of a new owner.
   * @param _tokenId The NFT that is being transferred.
   */
  function _transfer(
    address _to,
    uint256 _tokenId
  )
    internal
  {
    address from = idToOwner[_tokenId];
    _clearApproval(_tokenId);

    _removeNFToken(from, _tokenId);
    _addNFToken(_to, _tokenId);

    emit Transfer(from, _to, _tokenId);
  }

  /**
   * @dev Mints a new NFT.
   * @notice This is an internal function which should be called from user-implemented external
   * mint function. Its purpose is to show and properly initialize data structures when using this
   * implementation.
   * @param _to The address that will own the minted NFT.
   * @param _tokenId of the NFT to be minted by the msg.sender.
   */
  function _mint(
    address _to,
    uint256 _tokenId
  )
    internal
    virtual
  {
    require(_to != address(0), ZERO_ADDRESS);
    require(idToOwner[_tokenId] == address(0), NFT_ALREADY_EXISTS);

    _addNFToken(_to, _tokenId);

    emit Transfer(address(0), _to, _tokenId);
  }

  /**
   * @dev Burns a NFT.
   * @notice This is an internal function which should be called from user-implemented external burn
   * function. Its purpose is to show and properly initialize data structures when using this
   * implementation. Also, note that this burn implementation allows the minter to re-mint a burned
   * NFT.
   * @param _tokenId ID of the NFT to be burned.
   */
  function _burn(
    uint256 _tokenId
  )
    internal
    virtual
    validNFToken(_tokenId)
  {
    address tokenOwner = idToOwner[_tokenId];
    _clearApproval(_tokenId);
    _removeNFToken(tokenOwner, _tokenId);
    emit Transfer(tokenOwner, address(0), _tokenId);
  }

  /**
   * @dev Removes a NFT from owner.
   * @notice Use and override this function with caution. Wrong usage can have serious consequences.
   * @param _from Address from which we want to remove the NFT.
   * @param _tokenId Which NFT we want to remove.
   */
  function _removeNFToken(
    address _from,
    uint256 _tokenId
  )
    internal
    virtual
  {
    require(idToOwner[_tokenId] == _from, NOT_OWNER);
    ownerToNFTokenCount[_from] -= 1;
    delete idToOwner[_tokenId];
  }

  /**
   * @dev Assigns a new NFT to owner.
   * @notice Use and override this function with caution. Wrong usage can have serious consequences.
   * @param _to Address to which we want to add the NFT.
   * @param _tokenId Which NFT we want to add.
   */
  function _addNFToken(
    address _to,
    uint256 _tokenId
  )
    internal
    virtual
  {
    require(idToOwner[_tokenId] == address(0), NFT_ALREADY_EXISTS);

    idToOwner[_tokenId] = _to;
    ownerToNFTokenCount[_to] += 1;
  }

  /**
   * @dev Helper function that gets NFT count of owner. This is needed for overriding in enumerable
   * extension to remove double storage (gas optimization) of owner NFT count.
   * @param _owner Address for whom to query the count.
   * @return Number of _owner NFTs.
   */
  function _getOwnerNFTCount(
    address _owner
  )
    internal
    virtual
    view
    returns (uint256)
  {
    return ownerToNFTokenCount[_owner];
  }

  /**
   * @dev Actually perform the safeTransferFrom.
   * @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
  )
    private
    canTransfer(_tokenId)
    validNFToken(_tokenId)
  {
    address tokenOwner = idToOwner[_tokenId];
    require(tokenOwner == _from, NOT_OWNER);
    require(_to != address(0), ZERO_ADDRESS);

    _transfer(_to, _tokenId);

    if (_to.isContract())
    {
      bytes4 retval = ERC721TokenReceiver(_to).onERC721Received(msg.sender, _from, _tokenId, _data);
      require(retval == MAGIC_ON_ERC721_RECEIVED, NOT_ABLE_TO_RECEIVE_NFT);
    }
  }

  /**
   * @dev Clears the current approval of a given NFT ID.
   * @param _tokenId ID of the NFT to be transferred.
   */
  function _clearApproval(
    uint256 _tokenId
  )
    private
  {
    delete idToApproval[_tokenId];
  }

}
/**
 * @dev Optional metadata implementation for ERC-721 non-fungible token standard.
 */
contract NFTokenMetadata is
  NFToken,
  ERC721Metadata
{

  /**
   * @dev A descriptive name for a collection of NFTs.
   */
  string internal nftName;

  /**
   * @dev An abbreviated name for NFTokens.
   */
  string internal nftSymbol;

  /**
   * @dev Mapping from NFT ID to metadata uri.
   */
  mapping (uint256 => string) internal idToUri;

  /**
   * @dev Contract constructor.
   * @notice When implementing this contract don't forget to set nftName and nftSymbol.
   */
  constructor()
  {
    supportedInterfaces[0x5b5e139f] = true; // ERC721Metadata
  }

  /**
   * @dev Returns a descriptive name for a collection of NFTokens.
   * @return _name Representing name.
   */
  function name()
    external
    override
    view
    returns (string memory _name)
  {
    _name = nftName;
  }

  /**
   * @dev Returns an abbreviated name for NFTokens.
   * @return _symbol Representing symbol.
   */
  function symbol()
    external
    override
    view
    returns (string memory _symbol)
  {
    _symbol = nftSymbol;
  }

  /**
   * @dev A distinct URI (RFC 3986) for a given NFT.
   * @param _tokenId Id for which we want uri.
   * @return URI of _tokenId.
   */
  function tokenURI(
    uint256 _tokenId
  )
    external
    override
    view
    validNFToken(_tokenId)
    returns (string memory)
  {
    return idToUri[_tokenId];
  }

  /**
   * @dev Burns a NFT.
   * @notice This is an internal function which should be called from user-implemented external
   * burn function. Its purpose is to show and properly initialize data structures when using this
   * implementation. Also, note that this burn implementation allows the minter to re-mint a burned
   * NFT.
   * @param _tokenId ID of the NFT to be burned.
   */
  function _burn(
    uint256 _tokenId
  )
    internal
    override
    virtual
  {
    super._burn(_tokenId);

    delete idToUri[_tokenId];
  }

  /**
   * @dev Set a distinct URI (RFC 3986) for a given NFT ID.
   * @notice This is an internal function which should be called from user-implemented external
   * function. Its purpose is to show and properly initialize data structures when using this
   * implementation.
   * @param _tokenId Id for which we want URI.
   * @param _uri String representing RFC 3986 URI.
   */
  function _setTokenUri(
    uint256 _tokenId,
    string memory _uri
  )
    internal
    validNFToken(_tokenId)
  {
    idToUri[_tokenId] = _uri;
  }

}
/**
 * @dev The contract has an owner address, and provides basic authorization control whitch
 * simplifies the implementation of user permissions. This contract is based on the source code at:
 * https://github.com/OpenZeppelin/openzeppelin-solidity/blob/master/contracts/ownership/Ownable.sol
 */
contract Ownable
{

  /**
   * @dev Error constants.
   */
  string public constant NOT_CURRENT_OWNER = "018001";
  string public constant CANNOT_TRANSFER_TO_ZERO_ADDRESS = "018002";

  /**
   * @dev Current owner address.
   */
  address public owner;

  /**
   * @dev An event which is triggered when the owner is changed.
   * @param previousOwner The address of the previous owner.
   * @param newOwner The address of the new owner.
   */
  event OwnershipTransferred(
    address indexed previousOwner,
    address indexed newOwner
  );

  /**
   * @dev The constructor sets the original `owner` of the contract to the sender account.
   */
  constructor()
  {
    owner = msg.sender;
  }

  /**
   * @dev Throws if called by any account other than the owner.
   */
  modifier onlyOwner()
  {
    require(msg.sender == owner, NOT_CURRENT_OWNER);
    _;
  }

  /**
   * @dev Allows the current owner to transfer control of the contract to a newOwner.
   * @param _newOwner The address to transfer ownership to.
   */
  function transferOwnership(
    address _newOwner
  )
    public
    onlyOwner
  {
    require(_newOwner != address(0), CANNOT_TRANSFER_TO_ZERO_ADDRESS);
    emit OwnershipTransferred(owner, _newOwner);
    owner = _newOwner;
  }

}

contract newNFT is NFTokenMetadata, Ownable {

  uint internal numTokens = 20000;
  constructor() {
    nftName = "MemeCalf-NFT";
    nftSymbol = "MemeCalf";
  }

  function mint(address _to, uint256 _tokenId, string calldata _uri) external onlyOwner {
    super._mint(_to, _tokenId);
    super._setTokenUri(_tokenId, _uri);
  }
  function totalSupply() public view returns (uint256) {
    return numTokens;
  }

}

Contract Security Audit

Contract ABI

[{"inputs":[],"stateMutability":"nonpayable","type":"constructor"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"_owner","type":"address"},{"indexed":true,"internalType":"address","name":"_approved","type":"address"},{"indexed":true,"internalType":"uint256","name":"_tokenId","type":"uint256"}],"name":"Approval","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"_owner","type":"address"},{"indexed":true,"internalType":"address","name":"_operator","type":"address"},{"indexed":false,"internalType":"bool","name":"_approved","type":"bool"}],"name":"ApprovalForAll","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"previousOwner","type":"address"},{"indexed":true,"internalType":"address","name":"newOwner","type":"address"}],"name":"OwnershipTransferred","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"_from","type":"address"},{"indexed":true,"internalType":"address","name":"_to","type":"address"},{"indexed":true,"internalType":"uint256","name":"_tokenId","type":"uint256"}],"name":"Transfer","type":"event"},{"inputs":[],"name":"CANNOT_TRANSFER_TO_ZERO_ADDRESS","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"NOT_CURRENT_OWNER","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","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":"_tokenId","type":"uint256"}],"name":"getApproved","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_owner","type":"address"},{"internalType":"address","name":"_operator","type":"address"}],"name":"isApprovedForAll","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_to","type":"address"},{"internalType":"uint256","name":"_tokenId","type":"uint256"},{"internalType":"string","name":"_uri","type":"string"}],"name":"mint","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"name","outputs":[{"internalType":"string","name":"_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":"_owner","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":[{"internalType":"bytes4","name":"_interfaceID","type":"bytes4"}],"name":"supportsInterface","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"symbol","outputs":[{"internalType":"string","name":"_symbol","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_tokenId","type":"uint256"}],"name":"tokenURI","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_from","type":"address"},{"internalType":"address","name":"_to","type":"address"},{"internalType":"uint256","name":"_tokenId","type":"uint256"}],"name":"transferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"}]

6080604052614e206009553480156200001757600080fd5b50600060208181527f67be87c3ff9960ca1e9cfac5cab2ff4747269cf9ed20c9b7306235ac35a491c5805460ff1990811660019081179092557ff7815fccbf112960a73756e185887fedcb9fc64ca0a16cc5923b7960ed7808008054821683179055635b5e139f60e01b9093527f9562381dfbc2d8b8b66e765249f330164b73e329e5f01670660643571d1974df805490931617909155600880546001600160a01b0319163317905560408051808201909152600c8082526b13595b5950d85b198b53919560a21b91909201908152620000f591600591906200012e565b506040805180820190915260088082526726b2b6b2a1b0b63360c11b602090920191825262000127916006916200012e565b5062000211565b8280546200013c90620001d4565b90600052602060002090601f016020900481019282620001605760008555620001ab565b82601f106200017b57805160ff1916838001178555620001ab565b82800160010185558215620001ab579182015b82811115620001ab5782518255916020019190600101906200018e565b50620001b9929150620001bd565b5090565b5b80821115620001b95760008155600101620001be565b600281046001821680620001e957607f821691505b602082108114156200020b57634e487b7160e01b600052602260045260246000fd5b50919050565b61169180620002216000396000f3fe608060405234801561001057600080fd5b50600436106101215760003560e01c8063860d248a116100ad578063c87b56dd11610071578063c87b56dd14610238578063d3fc98641461024b578063e985e9c51461025e578063f2fde38b14610271578063f3fe3bc31461028457610121565b8063860d248a146101fa5780638da5cb5b1461020257806395d89b411461020a578063a22cb46514610212578063b88d4fde1461022557610121565b806318160ddd116100f457806318160ddd1461019957806323b872dd146101ae57806342842e0e146101c15780636352211e146101d457806370a08231146101e757610121565b806301ffc9a71461012657806306fdde031461014f578063081812fc14610164578063095ea7b314610184575b600080fd5b6101396101343660046114b5565b61028c565b60405161014691906115a1565b60405180910390f35b6101576102af565b60405161014691906115ac565b6101776101723660046114ed565b610341565b6040516101469190611550565b610197610192366004611434565b6103c3565b005b6101a1610565565b60405161014691906115bf565b6101976101bc366004611352565b61056b565b6101976101cf366004611352565b610726565b6101776101e23660046114ed565b610746565b6101a16101f53660046112ff565b61079e565b6101576107f5565b610177610817565b610157610826565b6101976102203660046113fa565b610835565b61019761023336600461138d565b6108a4565b6101576102463660046114ed565b6108ed565b61019761025936600461145d565b6109e8565b61013961026c366004611320565b610a82565b61019761027f3660046112ff565b610ab0565b610157610b9b565b6001600160e01b0319811660009081526020819052604090205460ff165b919050565b6060600580546102be906115f7565b80601f01602080910402602001604051908101604052809291908181526020018280546102ea906115f7565b80156103375780601f1061030c57610100808354040283529160200191610337565b820191906000526020600020905b81548152906001019060200180831161031a57829003601f168201915b5050505050905090565b6000818152600160209081526040808320548151808301909252600682526518181998181960d11b9282019290925283916001600160a01b03166103a15760405162461bcd60e51b815260040161039891906115ac565b60405180910390fd5b506000838152600260205260409020546001600160a01b031691505b50919050565b60008181526001602052604090205481906001600160a01b03163381148061040e57506001600160a01b038116600090815260046020908152604080832033845290915290205460ff165b6040518060400160405280600681526020016530303330303360d01b8152509061044b5760405162461bcd60e51b815260040161039891906115ac565b50600083815260016020908152604091829020548251808401909352600683526518181998181960d11b918301919091528491906001600160a01b03166104a55760405162461bcd60e51b815260040161039891906115ac565b50600084815260016020908152604091829020548251808401909352600683526506060666060760d31b918301919091526001600160a01b03908116919087168214156105055760405162461bcd60e51b815260040161039891906115ac565b5060008581526002602052604080822080546001600160a01b0319166001600160a01b038a811691821790925591518893918516917f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92591a4505050505050565b60095490565b60008181526001602052604090205481906001600160a01b0316338114806105a957506000828152600260205260409020546001600160a01b031633145b806105d757506001600160a01b038116600090815260046020908152604080832033845290915290205460ff165b604051806040016040528060068152602001650c0c0ccc0c0d60d21b815250906106145760405162461bcd60e51b815260040161039891906115ac565b50600083815260016020908152604091829020548251808401909352600683526518181998181960d11b918301919091528491906001600160a01b031661066e5760405162461bcd60e51b815260040161039891906115ac565b50600084815260016020908152604091829020548251808401909352600683526530303330303760d01b918301919091526001600160a01b039081169190881682146106cd5760405162461bcd60e51b815260040161039891906115ac565b5060408051808201909152600681526530303330303160d01b60208201526001600160a01b0387166107125760405162461bcd60e51b815260040161039891906115ac565b5061071d8686610bbd565b50505050505050565b61074183838360405180602001604052806000815250610c38565b505050565b600081815260016020908152604091829020548251808401909352600683526518181998181960d11b918301919091526001600160a01b031690816103bd5760405162461bcd60e51b815260040161039891906115ac565b60408051808201909152600681526530303330303160d01b60208201526000906001600160a01b0383166107e55760405162461bcd60e51b815260040161039891906115ac565b506107ef82610ee6565b92915050565b6040518060400160405280600681526020016518189c18181960d11b81525081565b6008546001600160a01b031681565b6060600680546102be906115f7565b3360008181526004602090815260408083206001600160a01b038716808552925291829020805460ff191685151517905590519091907f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31906108989085906115a1565b60405180910390a35050565b6108e685858585858080601f016020809104026020016040519081016040528093929190818152602001838380828437600092019190915250610c3892505050565b5050505050565b600081815260016020908152604091829020548251808401909352600683526518181998181960d11b9183019190915260609183916001600160a01b03166109485760405162461bcd60e51b815260040161039891906115ac565b5060008381526007602052604090208054610962906115f7565b80601f016020809104026020016040519081016040528092919081815260200182805461098e906115f7565b80156109db5780601f106109b0576101008083540402835291602001916109db565b820191906000526020600020905b8154815290600101906020018083116109be57829003601f168201915b5050505050915050919050565b60085460408051808201909152600681526530313830303160d01b6020820152906001600160a01b03163314610a315760405162461bcd60e51b815260040161039891906115ac565b50610a3c8484610f01565b610a7c8383838080601f016020809104026020016040519081016040528093929190818152602001838380828437600092019190915250610fe492505050565b50505050565b6001600160a01b03918216600090815260046020908152604080832093909416825291909152205460ff1690565b60085460408051808201909152600681526530313830303160d01b6020820152906001600160a01b03163314610af95760405162461bcd60e51b815260040161039891906115ac565b5060408051808201909152600681526518189c18181960d11b60208201526001600160a01b038216610b3e5760405162461bcd60e51b815260040161039891906115ac565b506008546040516001600160a01b038084169216907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a3600880546001600160a01b0319166001600160a01b0392909216919091179055565b6040518060400160405280600681526020016530313830303160d01b81525081565b6000818152600160205260409020546001600160a01b0316610bde8261105d565b610be8818361107b565b610bf28383611124565b81836001600160a01b0316826001600160a01b03167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a4505050565b60008281526001602052604090205482906001600160a01b031633811480610c7657506000828152600260205260409020546001600160a01b031633145b80610ca457506001600160a01b038116600090815260046020908152604080832033845290915290205460ff165b604051806040016040528060068152602001650c0c0ccc0c0d60d21b81525090610ce15760405162461bcd60e51b815260040161039891906115ac565b50600084815260016020908152604091829020548251808401909352600683526518181998181960d11b918301919091528591906001600160a01b0316610d3b5760405162461bcd60e51b815260040161039891906115ac565b50600085815260016020908152604091829020548251808401909352600683526530303330303760d01b918301919091526001600160a01b03908116919089168214610d9a5760405162461bcd60e51b815260040161039891906115ac565b5060408051808201909152600681526530303330303160d01b60208201526001600160a01b038816610ddf5760405162461bcd60e51b815260040161039891906115ac565b50610dea8787610bbd565b610dfc876001600160a01b03166111cc565b15610edc57604051630a85bd0160e11b81526000906001600160a01b0389169063150b7a0290610e369033908d908c908c90600401611564565b602060405180830381600087803b158015610e5057600080fd5b505af1158015610e64573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610e8891906114d1565b60408051808201909152600681526530303330303560d01b60208201529091506001600160e01b03198216630a85bd0160e11b14610ed95760405162461bcd60e51b815260040161039891906115ac565b50505b5050505050505050565b6001600160a01b031660009081526003602052604090205490565b60408051808201909152600681526530303330303160d01b60208201526001600160a01b038316610f455760405162461bcd60e51b815260040161039891906115ac565b50600081815260016020908152604091829020548251808401909352600683526518181998181b60d11b918301919091526001600160a01b031615610f9d5760405162461bcd60e51b815260040161039891906115ac565b50610fa88282611124565b60405181906001600160a01b038416906000907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef908290a45050565b600082815260016020908152604091829020548251808401909352600683526518181998181960d11b918301919091528391906001600160a01b031661103d5760405162461bcd60e51b815260040161039891906115ac565b5060008381526007602090815260409091208351610a7c92850190611208565b600090815260026020526040902080546001600160a01b0319169055565b600081815260016020908152604091829020548251808401909352600683526530303330303760d01b918301919091526001600160a01b038481169116146110d65760405162461bcd60e51b815260040161039891906115ac565b506001600160a01b03821660009081526003602052604081208054600192906111009084906115e0565b9091555050600090815260016020526040902080546001600160a01b031916905550565b600081815260016020908152604091829020548251808401909352600683526518181998181b60d11b918301919091526001600160a01b03161561117b5760405162461bcd60e51b815260040161039891906115ac565b50600081815260016020818152604080842080546001600160a01b0319166001600160a01b0388169081179091558452600390915282208054919290916111c39084906115c8565b90915550505050565b6000813f7fc5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a47081158015906112005750808214155b949350505050565b828054611214906115f7565b90600052602060002090601f016020900481019282611236576000855561127c565b82601f1061124f57805160ff191683800117855561127c565b8280016001018555821561127c579182015b8281111561127c578251825591602001919060010190611261565b5061128892915061128c565b5090565b5b80821115611288576000815560010161128d565b80356001600160a01b03811681146102aa57600080fd5b60008083601f8401126112c9578182fd5b50813567ffffffffffffffff8111156112e0578182fd5b6020830191508360208285010111156112f857600080fd5b9250929050565b600060208284031215611310578081fd5b611319826112a1565b9392505050565b60008060408385031215611332578081fd5b61133b836112a1565b9150611349602084016112a1565b90509250929050565b600080600060608486031215611366578081fd5b61136f846112a1565b925061137d602085016112a1565b9150604084013590509250925092565b6000806000806000608086880312156113a4578081fd5b6113ad866112a1565b94506113bb602087016112a1565b935060408601359250606086013567ffffffffffffffff8111156113dd578182fd5b6113e9888289016112b8565b969995985093965092949392505050565b6000806040838503121561140c578182fd5b611415836112a1565b915060208301358015158114611429578182fd5b809150509250929050565b60008060408385031215611446578182fd5b61144f836112a1565b946020939093013593505050565b60008060008060608587031215611472578384fd5b61147b856112a1565b935060208501359250604085013567ffffffffffffffff81111561149d578283fd5b6114a9878288016112b8565b95989497509550505050565b6000602082840312156114c6578081fd5b813561131981611642565b6000602082840312156114e2578081fd5b815161131981611642565b6000602082840312156114fe578081fd5b5035919050565b60008151808452815b8181101561152a5760208185018101518683018201520161150e565b8181111561153b5782602083870101525b50601f01601f19169290920160200192915050565b6001600160a01b0391909116815260200190565b6001600160a01b038581168252841660208201526040810183905260806060820181905260009061159790830184611505565b9695505050505050565b901515815260200190565b6000602082526113196020830184611505565b90815260200190565b600082198211156115db576115db61162c565b500190565b6000828210156115f2576115f261162c565b500390565b60028104600182168061160b57607f821691505b602082108114156103bd57634e487b7160e01b600052602260045260246000fd5b634e487b7160e01b600052601160045260246000fd5b6001600160e01b03198116811461165857600080fd5b5056fea26469706673582212202913b6dfcee6c2bc4b85b4645fe0fd00e31765f4dc327ff86d171d978cdda86e64736f6c63430008000033

Deployed Bytecode

0x608060405234801561001057600080fd5b50600436106101215760003560e01c8063860d248a116100ad578063c87b56dd11610071578063c87b56dd14610238578063d3fc98641461024b578063e985e9c51461025e578063f2fde38b14610271578063f3fe3bc31461028457610121565b8063860d248a146101fa5780638da5cb5b1461020257806395d89b411461020a578063a22cb46514610212578063b88d4fde1461022557610121565b806318160ddd116100f457806318160ddd1461019957806323b872dd146101ae57806342842e0e146101c15780636352211e146101d457806370a08231146101e757610121565b806301ffc9a71461012657806306fdde031461014f578063081812fc14610164578063095ea7b314610184575b600080fd5b6101396101343660046114b5565b61028c565b60405161014691906115a1565b60405180910390f35b6101576102af565b60405161014691906115ac565b6101776101723660046114ed565b610341565b6040516101469190611550565b610197610192366004611434565b6103c3565b005b6101a1610565565b60405161014691906115bf565b6101976101bc366004611352565b61056b565b6101976101cf366004611352565b610726565b6101776101e23660046114ed565b610746565b6101a16101f53660046112ff565b61079e565b6101576107f5565b610177610817565b610157610826565b6101976102203660046113fa565b610835565b61019761023336600461138d565b6108a4565b6101576102463660046114ed565b6108ed565b61019761025936600461145d565b6109e8565b61013961026c366004611320565b610a82565b61019761027f3660046112ff565b610ab0565b610157610b9b565b6001600160e01b0319811660009081526020819052604090205460ff165b919050565b6060600580546102be906115f7565b80601f01602080910402602001604051908101604052809291908181526020018280546102ea906115f7565b80156103375780601f1061030c57610100808354040283529160200191610337565b820191906000526020600020905b81548152906001019060200180831161031a57829003601f168201915b5050505050905090565b6000818152600160209081526040808320548151808301909252600682526518181998181960d11b9282019290925283916001600160a01b03166103a15760405162461bcd60e51b815260040161039891906115ac565b60405180910390fd5b506000838152600260205260409020546001600160a01b031691505b50919050565b60008181526001602052604090205481906001600160a01b03163381148061040e57506001600160a01b038116600090815260046020908152604080832033845290915290205460ff165b6040518060400160405280600681526020016530303330303360d01b8152509061044b5760405162461bcd60e51b815260040161039891906115ac565b50600083815260016020908152604091829020548251808401909352600683526518181998181960d11b918301919091528491906001600160a01b03166104a55760405162461bcd60e51b815260040161039891906115ac565b50600084815260016020908152604091829020548251808401909352600683526506060666060760d31b918301919091526001600160a01b03908116919087168214156105055760405162461bcd60e51b815260040161039891906115ac565b5060008581526002602052604080822080546001600160a01b0319166001600160a01b038a811691821790925591518893918516917f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92591a4505050505050565b60095490565b60008181526001602052604090205481906001600160a01b0316338114806105a957506000828152600260205260409020546001600160a01b031633145b806105d757506001600160a01b038116600090815260046020908152604080832033845290915290205460ff165b604051806040016040528060068152602001650c0c0ccc0c0d60d21b815250906106145760405162461bcd60e51b815260040161039891906115ac565b50600083815260016020908152604091829020548251808401909352600683526518181998181960d11b918301919091528491906001600160a01b031661066e5760405162461bcd60e51b815260040161039891906115ac565b50600084815260016020908152604091829020548251808401909352600683526530303330303760d01b918301919091526001600160a01b039081169190881682146106cd5760405162461bcd60e51b815260040161039891906115ac565b5060408051808201909152600681526530303330303160d01b60208201526001600160a01b0387166107125760405162461bcd60e51b815260040161039891906115ac565b5061071d8686610bbd565b50505050505050565b61074183838360405180602001604052806000815250610c38565b505050565b600081815260016020908152604091829020548251808401909352600683526518181998181960d11b918301919091526001600160a01b031690816103bd5760405162461bcd60e51b815260040161039891906115ac565b60408051808201909152600681526530303330303160d01b60208201526000906001600160a01b0383166107e55760405162461bcd60e51b815260040161039891906115ac565b506107ef82610ee6565b92915050565b6040518060400160405280600681526020016518189c18181960d11b81525081565b6008546001600160a01b031681565b6060600680546102be906115f7565b3360008181526004602090815260408083206001600160a01b038716808552925291829020805460ff191685151517905590519091907f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31906108989085906115a1565b60405180910390a35050565b6108e685858585858080601f016020809104026020016040519081016040528093929190818152602001838380828437600092019190915250610c3892505050565b5050505050565b600081815260016020908152604091829020548251808401909352600683526518181998181960d11b9183019190915260609183916001600160a01b03166109485760405162461bcd60e51b815260040161039891906115ac565b5060008381526007602052604090208054610962906115f7565b80601f016020809104026020016040519081016040528092919081815260200182805461098e906115f7565b80156109db5780601f106109b0576101008083540402835291602001916109db565b820191906000526020600020905b8154815290600101906020018083116109be57829003601f168201915b5050505050915050919050565b60085460408051808201909152600681526530313830303160d01b6020820152906001600160a01b03163314610a315760405162461bcd60e51b815260040161039891906115ac565b50610a3c8484610f01565b610a7c8383838080601f016020809104026020016040519081016040528093929190818152602001838380828437600092019190915250610fe492505050565b50505050565b6001600160a01b03918216600090815260046020908152604080832093909416825291909152205460ff1690565b60085460408051808201909152600681526530313830303160d01b6020820152906001600160a01b03163314610af95760405162461bcd60e51b815260040161039891906115ac565b5060408051808201909152600681526518189c18181960d11b60208201526001600160a01b038216610b3e5760405162461bcd60e51b815260040161039891906115ac565b506008546040516001600160a01b038084169216907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a3600880546001600160a01b0319166001600160a01b0392909216919091179055565b6040518060400160405280600681526020016530313830303160d01b81525081565b6000818152600160205260409020546001600160a01b0316610bde8261105d565b610be8818361107b565b610bf28383611124565b81836001600160a01b0316826001600160a01b03167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a4505050565b60008281526001602052604090205482906001600160a01b031633811480610c7657506000828152600260205260409020546001600160a01b031633145b80610ca457506001600160a01b038116600090815260046020908152604080832033845290915290205460ff165b604051806040016040528060068152602001650c0c0ccc0c0d60d21b81525090610ce15760405162461bcd60e51b815260040161039891906115ac565b50600084815260016020908152604091829020548251808401909352600683526518181998181960d11b918301919091528591906001600160a01b0316610d3b5760405162461bcd60e51b815260040161039891906115ac565b50600085815260016020908152604091829020548251808401909352600683526530303330303760d01b918301919091526001600160a01b03908116919089168214610d9a5760405162461bcd60e51b815260040161039891906115ac565b5060408051808201909152600681526530303330303160d01b60208201526001600160a01b038816610ddf5760405162461bcd60e51b815260040161039891906115ac565b50610dea8787610bbd565b610dfc876001600160a01b03166111cc565b15610edc57604051630a85bd0160e11b81526000906001600160a01b0389169063150b7a0290610e369033908d908c908c90600401611564565b602060405180830381600087803b158015610e5057600080fd5b505af1158015610e64573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610e8891906114d1565b60408051808201909152600681526530303330303560d01b60208201529091506001600160e01b03198216630a85bd0160e11b14610ed95760405162461bcd60e51b815260040161039891906115ac565b50505b5050505050505050565b6001600160a01b031660009081526003602052604090205490565b60408051808201909152600681526530303330303160d01b60208201526001600160a01b038316610f455760405162461bcd60e51b815260040161039891906115ac565b50600081815260016020908152604091829020548251808401909352600683526518181998181b60d11b918301919091526001600160a01b031615610f9d5760405162461bcd60e51b815260040161039891906115ac565b50610fa88282611124565b60405181906001600160a01b038416906000907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef908290a45050565b600082815260016020908152604091829020548251808401909352600683526518181998181960d11b918301919091528391906001600160a01b031661103d5760405162461bcd60e51b815260040161039891906115ac565b5060008381526007602090815260409091208351610a7c92850190611208565b600090815260026020526040902080546001600160a01b0319169055565b600081815260016020908152604091829020548251808401909352600683526530303330303760d01b918301919091526001600160a01b038481169116146110d65760405162461bcd60e51b815260040161039891906115ac565b506001600160a01b03821660009081526003602052604081208054600192906111009084906115e0565b9091555050600090815260016020526040902080546001600160a01b031916905550565b600081815260016020908152604091829020548251808401909352600683526518181998181b60d11b918301919091526001600160a01b03161561117b5760405162461bcd60e51b815260040161039891906115ac565b50600081815260016020818152604080842080546001600160a01b0319166001600160a01b0388169081179091558452600390915282208054919290916111c39084906115c8565b90915550505050565b6000813f7fc5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a47081158015906112005750808214155b949350505050565b828054611214906115f7565b90600052602060002090601f016020900481019282611236576000855561127c565b82601f1061124f57805160ff191683800117855561127c565b8280016001018555821561127c579182015b8281111561127c578251825591602001919060010190611261565b5061128892915061128c565b5090565b5b80821115611288576000815560010161128d565b80356001600160a01b03811681146102aa57600080fd5b60008083601f8401126112c9578182fd5b50813567ffffffffffffffff8111156112e0578182fd5b6020830191508360208285010111156112f857600080fd5b9250929050565b600060208284031215611310578081fd5b611319826112a1565b9392505050565b60008060408385031215611332578081fd5b61133b836112a1565b9150611349602084016112a1565b90509250929050565b600080600060608486031215611366578081fd5b61136f846112a1565b925061137d602085016112a1565b9150604084013590509250925092565b6000806000806000608086880312156113a4578081fd5b6113ad866112a1565b94506113bb602087016112a1565b935060408601359250606086013567ffffffffffffffff8111156113dd578182fd5b6113e9888289016112b8565b969995985093965092949392505050565b6000806040838503121561140c578182fd5b611415836112a1565b915060208301358015158114611429578182fd5b809150509250929050565b60008060408385031215611446578182fd5b61144f836112a1565b946020939093013593505050565b60008060008060608587031215611472578384fd5b61147b856112a1565b935060208501359250604085013567ffffffffffffffff81111561149d578283fd5b6114a9878288016112b8565b95989497509550505050565b6000602082840312156114c6578081fd5b813561131981611642565b6000602082840312156114e2578081fd5b815161131981611642565b6000602082840312156114fe578081fd5b5035919050565b60008151808452815b8181101561152a5760208185018101518683018201520161150e565b8181111561153b5782602083870101525b50601f01601f19169290920160200192915050565b6001600160a01b0391909116815260200190565b6001600160a01b038581168252841660208201526040810183905260806060820181905260009061159790830184611505565b9695505050505050565b901515815260200190565b6000602082526113196020830184611505565b90815260200190565b600082198211156115db576115db61162c565b500190565b6000828210156115f2576115f261162c565b500390565b60028104600182168061160b57607f821691505b602082108114156103bd57634e487b7160e01b600052602260045260246000fd5b634e487b7160e01b600052601160045260246000fd5b6001600160e01b03198116811461165857600080fd5b5056fea26469706673582212202913b6dfcee6c2bc4b85b4645fe0fd00e31765f4dc327ff86d171d978cdda86e64736f6c63430008000033

Deployed Bytecode Sourcemap

28002:430:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;10532:172;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;24568:120;;;:::i;:::-;;;;;;;:::i;18679:183::-;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;16464:352::-;;;;;;:::i;:::-;;:::i;:::-;;28345:82;;;:::i;:::-;;;;;;;:::i;15690:353::-;;;;;;:::i;:::-;;:::i;14935:179::-;;;;;;:::i;:::-;;:::i;18227:208::-;;;;;;:::i;:::-;;:::i;17753:204::-;;;;;;:::i;:::-;;:::i;26810:65::-;;;:::i;26930:20::-;;;:::i;24804:128::-;;;:::i;17227:232::-;;;;;;:::i;:::-;;:::i;14316:209::-;;;;;;:::i;:::-;;:::i;25085:181::-;;;;;;:::i;:::-;;:::i;28175:166::-;;;;;;:::i;:::-;;:::i;19131:192::-;;;;;;:::i;:::-;;:::i;27755:238::-;;;;;;:::i;:::-;;:::i;26754:51::-;;;:::i;10532:172::-;-1:-1:-1;;;;;;10665:33:0;;10642:4;10665:33;;;;;;;;;;;;;10532:172;;;;:::o;24568:120::-;24636:19;24675:7;24667:15;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;24568:120;:::o;18679:183::-;18808:7;13248:19;;;:9;:19;;;;;;;;;13283:13;;;;;;;;;;;-1:-1:-1;;;13283:13:0;;;;;;;18784:8;;-1:-1:-1;;;;;13248:19:0;13240:57;;;;-1:-1:-1;;;13240:57:0;;;;;;;;:::i;:::-;;;;;;;;;-1:-1:-1;18834:22:0::1;::::0;;;:12:::1;:22;::::0;;;;;-1:-1:-1;;;;;18834:22:0::1;::::0;-1:-1:-1;13304:1:0::1;18679:183:::0;;;;:::o;16464:352::-;12432:18;12453:19;;;:9;:19;;;;;;16577:8;;-1:-1:-1;;;;;12453:19:0;12509:10;12495:24;;;:68;;-1:-1:-1;;;;;;12523:28:0;;;;;;:16;:28;;;;;;;;12552:10;12523:40;;;;;;;;;;12495:68;12572:21;;;;;;;;;;;;;-1:-1:-1;;;12572:21:0;;;12479:121;;;;;-1:-1:-1;;;12479:121:0;;;;;;;;:::i;:::-;-1:-1:-1;13279:1:0::1;13248:19:::0;;;:9:::1;:19;::::0;;;;;;;;;13283:13;;;;::::1;::::0;;;::::1;::::0;;-1:-1:-1;;;13283:13:0;;::::1;::::0;;;;16605:8;;13283:13;-1:-1:-1;;;;;13248:19:0::1;13240:57;;;;-1:-1:-1::0;;;13240:57:0::1;;;;;;;;:::i;:::-;-1:-1:-1::0;16625:18:0::2;16646:19:::0;;;:9:::2;:19;::::0;;;;;;;;;16705:8;;;;::::2;::::0;;;::::2;::::0;;-1:-1:-1;;;16705:8:0;;::::2;::::0;;;;-1:-1:-1;;;;;16646:19:0;;::::2;::::0;16705:8;16680:23;::::2;::::0;::::2;;16672:42;;;;-1:-1:-1::0;;;16672:42:0::2;;;;;;;;:::i;:::-;-1:-1:-1::0;16723:22:0::2;::::0;;;:12:::2;:22;::::0;;;;;:34;;-1:-1:-1;;;;;;16723:34:0::2;-1:-1:-1::0;;;;;16723:34:0;;::::2;::::0;;::::2;::::0;;;16769:41;;16723:22;;16769:41;;::::2;::::0;::::2;::::0;::::2;13304:1;12607::::1;16464:352:::0;;;;:::o;28345:82::-;28412:9;;28345:82;:::o;15690:353::-;12812:18;12833:19;;;:9;:19;;;;;;15823:8;;-1:-1:-1;;;;;12833:19:0;12889:10;12875:24;;;:71;;-1:-1:-1;12910:22:0;;;;:12;:22;;;;;;-1:-1:-1;;;;;12910:22:0;12936:10;12910:36;12875:71;:122;;;-1:-1:-1;;;;;;12957:28:0;;;;;;:16;:28;;;;;;;;12986:10;12957:40;;;;;;;;;;12875:122;13006:30;;;;;;;;;;;;;-1:-1:-1;;;13006:30:0;;;12859:184;;;;;-1:-1:-1;;;12859:184:0;;;;;;;;:::i;:::-;-1:-1:-1;13279:1:0::1;13248:19:::0;;;:9:::1;:19;::::0;;;;;;;;;13283:13;;;;::::1;::::0;;;::::1;::::0;;-1:-1:-1;;;13283:13:0;;::::1;::::0;;;;15851:8;;13283:13;-1:-1:-1;;;;;13248:19:0::1;13240:57;;;;-1:-1:-1::0;;;13240:57:0::1;;;;;;;;:::i;:::-;-1:-1:-1::0;15871:18:0::2;15892:19:::0;;;:9:::2;:19;::::0;;;;;;;;;15947:9;;;;::::2;::::0;;;::::2;::::0;;-1:-1:-1;;;15947:9:0;;::::2;::::0;;;;-1:-1:-1;;;;;15892:19:0;;::::2;::::0;15947:9;15926:19;::::2;::::0;::::2;15918:39;;;;-1:-1:-1::0;;;15918:39:0::2;;;;;;;;:::i;:::-;-1:-1:-1::0;15991:12:0::2;::::0;;;;::::2;::::0;;;::::2;::::0;;-1:-1:-1;;;15991:12:0::2;::::0;::::2;::::0;-1:-1:-1;;;;;15972:17:0;::::2;15964:40;;;;-1:-1:-1::0;;;15964:40:0::2;;;;;;;;:::i;:::-;;16013:24;16023:3;16028:8;16013:9;:24::i;:::-;13304:1;13050::::1;15690:353:::0;;;;;:::o;14935:179::-;15065:43;15083:5;15090:3;15095:8;15065:43;;;;;;;;;;;;:17;:43::i;:::-;14935:179;;;:::o;18227:208::-;18324:14;18359:19;;;:9;:19;;;;;;;;;;18415:13;;;;;;;;;;;-1:-1:-1;;;18415:13:0;;;;;;;-1:-1:-1;;;;;18359:19:0;;18393:20;18385:44;;;;-1:-1:-1;;;18385:44:0;;;;;;;;:::i;17753:204::-;17899:12;;;;;;;;;;;;-1:-1:-1;;;17899:12:0;;;;17850:7;;-1:-1:-1;;;;;17877:20:0;;17869:43;;;;-1:-1:-1;;;17869:43:0;;;;;;;;:::i;:::-;;17926:25;17944:6;17926:17;:25::i;:::-;17919:32;17753:204;-1:-1:-1;;17753:204:0:o;26810:65::-;;;;;;;;;;;;;;-1:-1:-1;;;26810:65:0;;;;:::o;26930:20::-;;;-1:-1:-1;;;;;26930:20:0;;:::o;24804:128::-;24874:21;24917:9;24907:19;;;;;:::i;17227:232::-;17359:10;17342:28;;;;:16;:28;;;;;;;;-1:-1:-1;;;;;17342:39:0;;;;;;;;;;;:51;;-1:-1:-1;;17342:51:0;;;;;;;17405:48;;17342:39;;17359:10;17405:48;;;;17342:51;;17405:48;:::i;:::-;;;;;;;;17227:232;;:::o;14316:209::-;14473:46;14491:5;14498:3;14503:8;14513:5;;14473:46;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;14473:17:0;;-1:-1:-1;;;14473:46:0:i;:::-;14316:209;;;;;:::o;25085:181::-;13279:1;13248:19;;;:9;:19;;;;;;;;;;13283:13;;;;;;;;;;;-1:-1:-1;;;13283:13:0;;;;;;;25211;;25187:8;;-1:-1:-1;;;;;13248:19:0;13240:57;;;;-1:-1:-1;;;13240:57:0;;;;;;;;:::i;:::-;-1:-1:-1;25243:17:0::1;::::0;;;:7:::1;:17;::::0;;;;25236:24;;::::1;::::0;::::1;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;25085:181:::0;;;;:::o;28175:166::-;27548:5;;27555:17;;;;;;;;;;;;-1:-1:-1;;;27555:17:0;;;;;-1:-1:-1;;;;;27548:5:0;27534:10;:19;27526:47;;;;-1:-1:-1;;;27526:47:0;;;;;;;;:::i;:::-;;28268:26:::1;28280:3;28285:8;28268:11;:26::i;:::-;28301:34;28320:8;28330:4;;28301:34;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;::::0;;;;-1:-1:-1;28301:18:0::1;::::0;-1:-1:-1;;;28301:34:0:i:1;:::-;28175:166:::0;;;;:::o;19131:192::-;-1:-1:-1;;;;;19282:24:0;;;19259:4;19282:24;;;:16;:24;;;;;;;;:35;;;;;;;;;;;;;;;19131:192::o;27755:238::-;27548:5;;27555:17;;;;;;;;;;;;-1:-1:-1;;;27555:17:0;;;;;-1:-1:-1;;;;;27548:5:0;27534:10;:19;27526:47;;;;-1:-1:-1;;;27526:47:0;;;;;;;;:::i;:::-;-1:-1:-1;27881:31:0::1;::::0;;;;::::1;::::0;;;::::1;::::0;;-1:-1:-1;;;27881:31:0::1;::::0;::::1;::::0;-1:-1:-1;;;;;27856:23:0;::::1;27848:65;;;;-1:-1:-1::0;;;27848:65:0::1;;;;;;;;:::i;:::-;-1:-1:-1::0;27946:5:0::1;::::0;27925:38:::1;::::0;-1:-1:-1;;;;;27925:38:0;;::::1;::::0;27946:5:::1;::::0;27925:38:::1;::::0;27946:5:::1;::::0;27925:38:::1;27970:5;:17:::0;;-1:-1:-1;;;;;;27970:17:0::1;-1:-1:-1::0;;;;;27970:17:0;;;::::1;::::0;;;::::1;::::0;;27755:238::o;26754:51::-;;;;;;;;;;;;;;-1:-1:-1;;;26754:51:0;;;;:::o;19514:275::-;19603:12;19618:19;;;:9;:19;;;;;;-1:-1:-1;;;;;19618:19:0;19644:24;19628:8;19644:14;:24::i;:::-;19677:30;19692:4;19698:8;19677:14;:30::i;:::-;19714:26;19726:3;19731:8;19714:11;:26::i;:::-;19774:8;19769:3;-1:-1:-1;;;;;19754:29:0;19763:4;-1:-1:-1;;;;;19754:29:0;;;;;;;;;;;19514:275;;;:::o;22916:590::-;12812:18;12833:19;;;:9;:19;;;;;;23064:8;;-1:-1:-1;;;;;12833:19:0;12889:10;12875:24;;;:71;;-1:-1:-1;12910:22:0;;;;:12;:22;;;;;;-1:-1:-1;;;;;12910:22:0;12936:10;12910:36;12875:71;:122;;;-1:-1:-1;;;;;;12957:28:0;;;;;;:16;:28;;;;;;;;12986:10;12957:40;;;;;;;;;;12875:122;13006:30;;;;;;;;;;;;;-1:-1:-1;;;13006:30:0;;;12859:184;;;;;-1:-1:-1;;;12859:184:0;;;;;;;;:::i;:::-;-1:-1:-1;13279:1:0::1;13248:19:::0;;;:9:::1;:19;::::0;;;;;;;;;13283:13;;;;::::1;::::0;;;::::1;::::0;;-1:-1:-1;;;13283:13:0;;::::1;::::0;;;;23092:8;;13283:13;-1:-1:-1;;;;;13248:19:0::1;13240:57;;;;-1:-1:-1::0;;;13240:57:0::1;;;;;;;;:::i;:::-;-1:-1:-1::0;23112:18:0::2;23133:19:::0;;;:9:::2;:19;::::0;;;;;;;;;23188:9;;;;::::2;::::0;;;::::2;::::0;;-1:-1:-1;;;23188:9:0;;::::2;::::0;;;;-1:-1:-1;;;;;23133:19:0;;::::2;::::0;23188:9;23167:19;::::2;::::0;::::2;23159:39;;;;-1:-1:-1::0;;;23159:39:0::2;;;;;;;;:::i;:::-;-1:-1:-1::0;23232:12:0::2;::::0;;;;::::2;::::0;;;::::2;::::0;;-1:-1:-1;;;23232:12:0::2;::::0;::::2;::::0;-1:-1:-1;;;;;23213:17:0;::::2;23205:40;;;;-1:-1:-1::0;;;23205:40:0::2;;;;;;;;:::i;:::-;;23254:24;23264:3;23269:8;23254:9;:24::i;:::-;23291:16;:3;-1:-1:-1::0;;;;;23291:14:0::2;;:16::i;:::-;23287:214;;;23339:77;::::0;-1:-1:-1;;;23339:77:0;;23323:13:::2;::::0;-1:-1:-1;;;;;23339:41:0;::::2;::::0;::::2;::::0;:77:::2;::::0;23381:10:::2;::::0;23393:5;;23400:8;;23410:5;;23339:77:::2;;;:::i;:::-;;;;;;;;;;;;;;;;;;::::0;::::2;;;;;;;;;;;;::::0;::::2;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;23469:23;::::0;;;;::::2;::::0;;;::::2;::::0;;-1:-1:-1;;;23469:23:0::2;::::0;::::2;::::0;23323:93;;-1:-1:-1;;;;;;;23433:34:0;::::2;-1:-1:-1::0;;;23433:34:0::2;23425:68;;;;-1:-1:-1::0;;;23425:68:0::2;;;;;;;;:::i;:::-;;23287:214;;13304:1;13050::::1;22916:590:::0;;;;;;:::o;22475:163::-;-1:-1:-1;;;;;22605:27:0;22579:7;22605:27;;;:19;:27;;;;;;;22475:163::o;20180:297::-;20305:12;;;;;;;;;;;;-1:-1:-1;;;20305:12:0;;;;-1:-1:-1;;;;;20286:17:0;;20278:40;;;;-1:-1:-1;;;20278:40:0;;;;;;;;:::i;:::-;-1:-1:-1;20364:1:0;20333:19;;;:9;:19;;;;;;;;;;20368:18;;;;;;;;;;;-1:-1:-1;;;20368:18:0;;;;;;;-1:-1:-1;;;;;20333:19:0;:33;20325:62;;;;-1:-1:-1;;;20325:62:0;;;;;;;;:::i;:::-;;20396:26;20408:3;20413:8;20396:11;:26::i;:::-;20436:35;;20462:8;;-1:-1:-1;;;;;20436:35:0;;;20453:1;;20436:35;;20453:1;;20436:35;20180:297;;:::o;26218:157::-;13279:1;13248:19;;;:9;:19;;;;;;;;;;13283:13;;;;;;;;;;;-1:-1:-1;;;13283:13:0;;;;;;;26325:8;;13283:13;-1:-1:-1;;;;;13248:19:0;13240:57;;;;-1:-1:-1;;;13240:57:0;;;;;;;;:::i;:::-;-1:-1:-1;26345:17:0::1;::::0;;;:7:::1;:17;::::0;;;;;;;:24;;::::1;::::0;;::::1;::::0;::::1;:::i;23639:110::-:0;23721:22;;;;:12;:22;;;;;23714:29;;-1:-1:-1;;;;;;23714:29:0;;;23639:110::o;21437:234::-;21554:19;;;;:9;:19;;;;;;;;;;21584:9;;;;;;;;;;;-1:-1:-1;;;21584:9:0;;;;;;;-1:-1:-1;;;;;21554:28:0;;;:19;;:28;21546:48;;;;-1:-1:-1;;;21546:48:0;;;;;;;;:::i;:::-;-1:-1:-1;;;;;;21601:26:0;;;;;;:19;:26;;;;;:31;;21631:1;;21601:26;:31;;21631:1;;21601:31;:::i;:::-;;;;-1:-1:-1;;21646:19:0;;;;:9;:19;;;;;21639:26;;-1:-1:-1;;;;;;21639:26:0;;;-1:-1:-1;21437:234:0:o;21938:242::-;22081:1;22050:19;;;:9;:19;;;;;;;;;;22085:18;;;;;;;;;;;-1:-1:-1;;;22085:18:0;;;;;;;-1:-1:-1;;;;;22050:19:0;:33;22042:62;;;;-1:-1:-1;;;22042:62:0;;;;;;;;:::i;:::-;-1:-1:-1;22113:19:0;;;;:9;:19;;;;;;;;:25;;-1:-1:-1;;;;;;22113:25:0;-1:-1:-1;;;;;22113:25:0;;;;;;;;22145:24;;:19;:24;;;;;:29;;22113:9;;22145:24;;:29;;22113:9;;22145:29;:::i;:::-;;;;-1:-1:-1;;;;21938:242:0:o;7303:780::-;7386:17;7968:18;;7872:66;8034:15;;;;;:42;;;8065:11;8053:8;:23;;8034:42;8018:59;7303:780;-1:-1:-1;;;;7303:780:0:o;-1:-1:-1:-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;:::o;:::-;;;;;;;;;;;;;;;14:175:1;84:20;;-1:-1:-1;;;;;133:31:1;;123:42;;113:2;;179:1;176;169:12;194:377;;;311:3;304:4;296:6;292:17;288:27;278:2;;336:8;326;319:26;278:2;-1:-1:-1;366:20:1;;409:18;398:30;;395:2;;;448:8;438;431:26;395:2;492:4;484:6;480:17;468:29;;544:3;537:4;528:6;520;516:19;512:30;509:39;506:2;;;561:1;558;551:12;506:2;268:303;;;;;:::o;576:198::-;;688:2;676:9;667:7;663:23;659:32;656:2;;;709:6;701;694:22;656:2;737:31;758:9;737:31;:::i;:::-;727:41;646:128;-1:-1:-1;;;646:128:1:o;779:274::-;;;908:2;896:9;887:7;883:23;879:32;876:2;;;929:6;921;914:22;876:2;957:31;978:9;957:31;:::i;:::-;947:41;;1007:40;1043:2;1032:9;1028:18;1007:40;:::i;:::-;997:50;;866:187;;;;;:::o;1058:342::-;;;;1204:2;1192:9;1183:7;1179:23;1175:32;1172:2;;;1225:6;1217;1210:22;1172:2;1253:31;1274:9;1253:31;:::i;:::-;1243:41;;1303:40;1339:2;1328:9;1324:18;1303:40;:::i;:::-;1293:50;;1390:2;1379:9;1375:18;1362:32;1352:42;;1162:238;;;;;:::o;1405:652::-;;;;;;1587:3;1575:9;1566:7;1562:23;1558:33;1555:2;;;1609:6;1601;1594:22;1555:2;1637:31;1658:9;1637:31;:::i;:::-;1627:41;;1687:40;1723:2;1712:9;1708:18;1687:40;:::i;:::-;1677:50;;1774:2;1763:9;1759:18;1746:32;1736:42;;1829:2;1818:9;1814:18;1801:32;1856:18;1848:6;1845:30;1842:2;;;1893:6;1885;1878:22;1842:2;1937:60;1989:7;1980:6;1969:9;1965:22;1937:60;:::i;:::-;1545:512;;;;-1:-1:-1;1545:512:1;;-1:-1:-1;2016:8:1;;1911:86;1545:512;-1:-1:-1;;;1545:512:1:o;2062:369::-;;;2188:2;2176:9;2167:7;2163:23;2159:32;2156:2;;;2209:6;2201;2194:22;2156:2;2237:31;2258:9;2237:31;:::i;:::-;2227:41;;2318:2;2307:9;2303:18;2290:32;2365:5;2358:13;2351:21;2344:5;2341:32;2331:2;;2392:6;2384;2377:22;2331:2;2420:5;2410:15;;;2146:285;;;;;:::o;2436:266::-;;;2565:2;2553:9;2544:7;2540:23;2536:32;2533:2;;;2586:6;2578;2571:22;2533:2;2614:31;2635:9;2614:31;:::i;:::-;2604:41;2692:2;2677:18;;;;2664:32;;-1:-1:-1;;;2523:179:1:o;2707:576::-;;;;;2873:2;2861:9;2852:7;2848:23;2844:32;2841:2;;;2894:6;2886;2879:22;2841:2;2922:31;2943:9;2922:31;:::i;:::-;2912:41;;3000:2;2989:9;2985:18;2972:32;2962:42;;3055:2;3044:9;3040:18;3027:32;3082:18;3074:6;3071:30;3068:2;;;3119:6;3111;3104:22;3068:2;3163:60;3215:7;3206:6;3195:9;3191:22;3163:60;:::i;:::-;2831:452;;;;-1:-1:-1;3242:8:1;-1:-1:-1;;;;2831:452:1:o;3288:257::-;;3399:2;3387:9;3378:7;3374:23;3370:32;3367:2;;;3420:6;3412;3405:22;3367:2;3464:9;3451:23;3483:32;3509:5;3483:32;:::i;3550:261::-;;3672:2;3660:9;3651:7;3647:23;3643:32;3640:2;;;3693:6;3685;3678:22;3640:2;3730:9;3724:16;3749:32;3775:5;3749:32;:::i;3816:190::-;;3928:2;3916:9;3907:7;3903:23;3899:32;3896:2;;;3949:6;3941;3934:22;3896:2;-1:-1:-1;3977:23:1;;3886:120;-1:-1:-1;3886:120:1:o;4011:477::-;;4092:5;4086:12;4119:6;4114:3;4107:19;4144:3;4156:162;4170:6;4167:1;4164:13;4156:162;;;4232:4;4288:13;;;4284:22;;4278:29;4260:11;;;4256:20;;4249:59;4185:12;4156:162;;;4336:6;4333:1;4330:13;4327:2;;;4402:3;4395:4;4386:6;4381:3;4377:16;4373:27;4366:40;4327:2;-1:-1:-1;4470:2:1;4449:15;-1:-1:-1;;4445:29:1;4436:39;;;;4477:4;4432:50;;4062:426;-1:-1:-1;;4062:426:1:o;4493:203::-;-1:-1:-1;;;;;4657:32:1;;;;4639:51;;4627:2;4612:18;;4594:102::o;4701:490::-;-1:-1:-1;;;;;4970:15:1;;;4952:34;;5022:15;;5017:2;5002:18;;4995:43;5069:2;5054:18;;5047:34;;;5117:3;5112:2;5097:18;;5090:31;;;4701:490;;5138:47;;5165:19;;5157:6;5138:47;:::i;:::-;5130:55;4904:287;-1:-1:-1;;;;;;4904:287:1:o;5196:187::-;5361:14;;5354:22;5336:41;;5324:2;5309:18;;5291:92::o;5388:221::-;;5537:2;5526:9;5519:21;5557:46;5599:2;5588:9;5584:18;5576:6;5557:46;:::i;5614:177::-;5760:25;;;5748:2;5733:18;;5715:76::o;5796:128::-;;5867:1;5863:6;5860:1;5857:13;5854:2;;;5873:18;;:::i;:::-;-1:-1:-1;5909:9:1;;5844:80::o;5929:125::-;;5997:1;5994;5991:8;5988:2;;;6002:18;;:::i;:::-;-1:-1:-1;6039:9:1;;5978:76::o;6059:380::-;6144:1;6134:12;;6191:1;6181:12;;;6202:2;;6256:4;6248:6;6244:17;6234:27;;6202:2;6309;6301:6;6298:14;6278:18;6275:38;6272:2;;;6355:10;6350:3;6346:20;6343:1;6336:31;6390:4;6387:1;6380:15;6418:4;6415:1;6408:15;6444:127;6505:10;6500:3;6496:20;6493:1;6486:31;6536:4;6533:1;6526:15;6560:4;6557:1;6550:15;6576:133;-1:-1:-1;;;;;;6652:32:1;;6642:43;;6632:2;;6699:1;6696;6689:12;6632:2;6622:87;:::o

Swarm Source

ipfs://2913b6dfcee6c2bc4b85b4645fe0fd00e31765f4dc327ff86d171d978cdda86e
Loading...
Loading
Loading...
Loading
[ Download: CSV Export  ]
[ Download: CSV Export  ]

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