ETH Price: $2,290.05 (-3.49%)

BiFi Position (POSITION)
 

Overview

TokenID

77

Total Transfers

-

Market

Onchain Market Cap

$0.00

Circulating Supply Market Cap

-
Loading...
Loading
Loading...
Loading
Loading...
Loading

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

Contract Source Code Verified (Exact Match)

Contract Name:
ERC721

Compiler Version
v0.8.0+commit.c7dfd78e

Optimization Enabled:
Yes with 1000 runs

Other Settings:
default evmVersion, MIT license

Contract Source Code (Solidity)

/**
 *Submitted for verification at Etherscan.io on 2021-06-23
*/

// File: contracts/nft/erc721.sol
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 IERC721
{

  /**
   * @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);

}

// File: contracts/nft/erc721-token-receiver.sol
pragma solidity 0.8.0;

/**
 * @dev ERC-721 interface for accepting safe transfers.
 * See https://github.com/ethereum/EIPs/blob/master/EIPS/eip-721.md.
 */
interface IERC721TokenReceiver
{

  /**
   * @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);

}

// File: contracts/nft/erc165.sol
pragma solidity 0.8.0;

/**
 * @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);
    
}

// File: contracts/nft/supports-interface.sol
pragma solidity 0.8.0;


/**
 * @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];
  }

}

// File: contracts/nft/address-utils.sol
pragma solidity 0.8.0;

/**
 * @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);
  }

}

// File: contracts/nft/nf-token.sol
pragma solidity 0.8.0;

/**
 * @dev Implementation of ERC-721 non-fungible token standard.
 */
contract NFToken is
  IERC721,
  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 = IERC721TokenReceiver(_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];
  }

}

// File: contracts/nft/erc721-enumerable.sol
pragma solidity 0.8.0;

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

  /**
   * @dev Returns a count of valid NFTs tracked by this contract, where each one of them has an
   * assigned and queryable owner not equal to the zero address.
   * @return Total supply of NFTs.
   */
  function totalSupply()
    external
    view
    returns (uint256);

  /**
   * @dev Returns the token identifier for the `_index`th NFT. Sort order is not specified.
   * @param _index A counter less than `totalSupply()`.
   * @return Token id.
   */
  function tokenByIndex(
    uint256 _index
  )
    external
    view
    returns (uint256);


  function mint(
    address _to,
    uint256 _tokenId
  ) external;

  /**
   * @dev Returns the token identifier for the `_index`th NFT assigned to `_owner`. Sort order is
   * not specified. It throws if `_index` >= `balanceOf(_owner)` or if `_owner` is the zero address,
   * representing invalid NFTs.
   * @param _owner An address where we are interested in NFTs owned by them.
   * @param _index A counter less than `balanceOf(_owner)`.
   * @return Token id.
   */
  function tokenOfOwnerByIndex(
    address _owner,
    uint256 _index
  )
    external
    view
    returns (uint256);

}

// File: contracts/nft/erc721-metadata.sol
pragma solidity 0.8.0;

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

  /**
   * @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);

}

// File: contracts/nft/nf-token-enumerable.sol
// SPDX-License-Identifier: MIT
pragma solidity 0.8.0;

/**
 * @dev Optional enumeration implementation for ERC-721 non-fungible token standard.
 */
contract ERC721 is
  NFToken,
  IERC721Enumerable,
  IERC721Metadata
{

  modifier onlyFactory {
    require( (factoryAddr == msg.sender) || (owner == msg.sender), "onlyFactory");
    _;
  }

  modifier onlyOwner {
    require(owner == msg.sender, "onlyOwner");
    _;
  }

  /**
   * @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 List of revert message codes. Implementing dApp should handle showing the correct message.
   * Based on 0xcert framework error codes.
   */
  string constant INVALID_INDEX = "005007";

  /**
   * @dev Array of all NFT IDs.
   */
  uint256[] internal tokens;

  address public factoryAddr;
  address public owner;
  /**
   * @dev Mapping from token ID to its index in global tokens array.
   */
  mapping(uint256 => uint256) internal idToIndex;

  /**
   * @dev Mapping from owner to list of owned NFT IDs.
   */
  mapping(address => uint256[]) internal ownerToIds;

  /**
   * @dev Mapping from NFT ID to its index in the owner tokens list.
   */
  mapping(uint256 => uint256) internal idToOwnerIndex;

  /**
   * @dev Contract constructor.
   */
  constructor(string memory _nftName, string memory _nftSymbol)
  {
    supportedInterfaces[0x780e9d63] = true; // ERC721Enumerable
    nftName = _nftName;
    nftSymbol = _nftSymbol;
    owner = msg.sender;
  }

  function setFactoryAddr(address _factoryAddr) external onlyOwner returns (bool) {
    factoryAddr = _factoryAddr;
    return true;
  }

  function getFactoryAddr() external view returns (address) {
    return factoryAddr;
  }

  /**
   * @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 Returns the count of all existing NFTokens.
   * @return Total supply of NFTs.
   */
  function totalSupply()
    external
    override
    view
    returns (uint256)
  {
    return tokens.length;
  }

  /**
   * @dev Returns NFT ID by its index.
   * @param _index A counter less than `totalSupply()`.
   * @return Token id.
   */
  function tokenByIndex(
    uint256 _index
  )
    external
    override
    view
    returns (uint256)
  {
    require(_index < tokens.length, INVALID_INDEX);
    return tokens[_index];
  }

  /**
   * @dev returns the n-th NFT ID from a list of owner's tokens.
   * @param _owner Token owner's address.
   * @param _index Index number representing n-th token in owner's list of tokens.
   * @return Token id.
   */
  function tokenOfOwnerByIndex(
    address _owner,
    uint256 _index
  )
    external
    override
    view
    returns (uint256)
  {
    require(_index < ownerToIds[_owner].length, INVALID_INDEX);
    return ownerToIds[_owner][_index];
  }

  function mint(
    address _to,
    uint256 _tokenId
  )
    external onlyFactory override
  {
    _mint(_to, _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 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
    override
    virtual
  {
    super._mint(_to, _tokenId);
    tokens.push(_tokenId);
    idToIndex[_tokenId] = tokens.length - 1;
  }

  /**
   * @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);

    uint256 tokenIndex = idToIndex[_tokenId];
    uint256 lastTokenIndex = tokens.length - 1;
    uint256 lastToken = tokens[lastTokenIndex];

    tokens[tokenIndex] = lastToken;

    tokens.pop();
    // This wastes gas if you are burning the last token but saves a little gas if you are not.
    idToIndex[lastToken] = tokenIndex;
    idToIndex[_tokenId] = 0;
  }

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

    uint256 tokenToRemoveIndex = idToOwnerIndex[_tokenId];
    uint256 lastTokenIndex = ownerToIds[_from].length - 1;

    if (lastTokenIndex != tokenToRemoveIndex)
    {
      uint256 lastToken = ownerToIds[_from][lastTokenIndex];
      ownerToIds[_from][tokenToRemoveIndex] = lastToken;
      idToOwnerIndex[lastToken] = tokenToRemoveIndex;
    }

    ownerToIds[_from].pop();
  }

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

    ownerToIds[_to].push(_tokenId);
    idToOwnerIndex[_tokenId] = ownerToIds[_to].length - 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
    override
    virtual
    view
    returns (uint256)
  {
    return ownerToIds[_owner].length;
  }
}

Contract Security Audit

Contract ABI

[{"inputs":[{"internalType":"string","name":"_nftName","type":"string"},{"internalType":"string","name":"_nftSymbol","type":"string"}],"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":"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":[],"name":"factoryAddr","outputs":[{"internalType":"address","name":"","type":"address"}],"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":"getFactoryAddr","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"}],"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":"address","name":"_factoryAddr","type":"address"}],"name":"setFactoryAddr","outputs":[{"internalType":"bool","name":"","type":"bool"}],"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":"_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"}]

60806040523480156200001157600080fd5b5060405162001b0f38038062001b0f83398101604081905262000034916200025f565b600060208181527f67be87c3ff9960ca1e9cfac5cab2ff4747269cf9ed20c9b7306235ac35a491c58054600160ff1991821681179092557ff7815fccbf112960a73756e185887fedcb9fc64ca0a16cc5923b7960ed780800805482168317905563780e9d6360e01b9093527f77b7bbe0e49b76487c9476b5db3354cf5270619d0037ccb899c2a4c4a75b43188054909316179091558251620000dd91600591908501906200010e565b508051620000f39060069060208401906200010e565b5050600a80546001600160a01b031916331790555062000319565b8280546200011c90620002c6565b90600052602060002090601f0160209004810192826200014057600085556200018b565b82601f106200015b57805160ff19168380011785556200018b565b828001600101855582156200018b579182015b828111156200018b5782518255916020019190600101906200016e565b50620001999291506200019d565b5090565b5b808211156200019957600081556001016200019e565b600082601f830112620001c5578081fd5b81516001600160401b0380821115620001e257620001e262000303565b6040516020601f8401601f19168201810183811183821017156200020a576200020a62000303565b604052838252858401810187101562000221578485fd5b8492505b8383101562000244578583018101518284018201529182019162000225565b838311156200025557848185840101525b5095945050505050565b6000806040838503121562000272578182fd5b82516001600160401b038082111562000289578384fd5b6200029786838701620001b4565b93506020850151915080821115620002ad578283fd5b50620002bc85828601620001b4565b9150509250929050565b600281046001821680620002db57607f821691505b60208210811415620002fd57634e487b7160e01b600052602260045260246000fd5b50919050565b634e487b7160e01b600052604160045260246000fd5b6117e680620003296000396000f3fe608060405234801561001057600080fd5b50600436106101775760003560e01c806342842e0e116100d857806395d89b411161008c578063b88d4fde11610066578063b88d4fde146102cf578063c87b56dd146102e2578063e985e9c5146102f557610177565b806395d89b41146102ac578063963671be146102b4578063a22cb465146102bc57610177565b80636352211e116100bd5780636352211e1461027e57806370a08231146102915780638da5cb5b146102a457610177565b806342842e0e146102585780634f6ccce71461026b57610177565b806318160ddd1161012f5780632b8174c2116101145780632b8174c21461022a5780632f745c591461023257806340c10f191461024557610177565b806318160ddd1461020257806323b872dd1461021757610177565b8063081812fc11610160578063081812fc146101ba578063095ea7b3146101da5780630b5a01fa146101ef57610177565b806301ffc9a71461017c57806306fdde03146101a5575b600080fd5b61018f61018a3660046115a7565b610308565b60405161019c9190611692565b60405180910390f35b6101ad610343565b60405161019c919061169d565b6101cd6101c83660046115df565b6103d5565b60405161019c9190611642565b6101ed6101e836600461157e565b610457565b005b61018f6101fd366004611420565b610627565b61020a610679565b60405161019c919061171e565b6101ed610225366004611473565b61067f565b6101cd61083a565b61020a61024036600461157e565b610849565b6101ed61025336600461157e565b6108ee565b6101ed610266366004611473565b61093b565b61020a6102793660046115df565b61095b565b6101cd61028c3660046115df565b6109d1565b61020a61029f366004611420565b610a29565b6101cd610a80565b6101ad610a8f565b6101cd610a9e565b6101ed6102ca366004611544565b610aad565b6101ed6102dd3660046114ae565b610b1c565b6101ad6102f03660046115df565b610b65565b61018f610303366004611441565b610c60565b7fffffffff00000000000000000000000000000000000000000000000000000000811660009081526020819052604090205460ff165b919050565b6060600580546103529061174a565b80601f016020809104026020016040519081016040528092919081815260200182805461037e9061174a565b80156103cb5780601f106103a0576101008083540402835291602001916103cb565b820191906000526020600020905b8154815290600101906020018083116103ae57829003601f168201915b5050505050905090565b6000818152600160209081526040808320548151808301909252600682526518181998181960d11b9282019290925283916001600160a01b03166104355760405162461bcd60e51b815260040161042c919061169d565b60405180910390fd5b506000838152600260205260409020546001600160a01b031691505b50919050565b60008181526001602052604090205481906001600160a01b0316338114806104a257506001600160a01b038116600090815260046020908152604080832033845290915290205460ff165b6040518060400160405280600681526020017f3030333030330000000000000000000000000000000000000000000000000000815250906104f65760405162461bcd60e51b815260040161042c919061169d565b50600083815260016020908152604091829020548251808401909352600683526518181998181960d11b918301919091528491906001600160a01b03166105505760405162461bcd60e51b815260040161042c919061169d565b50600084815260016020908152604091829020548251808401909352600683527f3030333030380000000000000000000000000000000000000000000000000000918301919091526001600160a01b03908116919087168214156105c75760405162461bcd60e51b815260040161042c919061169d565b5060008581526002602052604080822080546001600160a01b0319166001600160a01b038a811691821790925591518893918516917f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92591a4505050505050565b600a546000906001600160a01b031633146106545760405162461bcd60e51b815260040161042c906116e7565b50600980546001600160a01b0383166001600160a01b03199091161790556001919050565b60085490565b60008181526001602052604090205481906001600160a01b0316338114806106bd57506000828152600260205260409020546001600160a01b031633145b806106eb57506001600160a01b038116600090815260046020908152604080832033845290915290205460ff165b604051806040016040528060068152602001650c0c0ccc0c0d60d21b815250906107285760405162461bcd60e51b815260040161042c919061169d565b50600083815260016020908152604091829020548251808401909352600683526518181998181960d11b918301919091528491906001600160a01b03166107825760405162461bcd60e51b815260040161042c919061169d565b50600084815260016020908152604091829020548251808401909352600683526530303330303760d01b918301919091526001600160a01b039081169190881682146107e15760405162461bcd60e51b815260040161042c919061169d565b5060408051808201909152600681526530303330303160d01b60208201526001600160a01b0387166108265760405162461bcd60e51b815260040161042c919061169d565b506108318686610c8e565b50505050505050565b6009546001600160a01b031690565b6001600160a01b0382166000908152600c60209081526040808320548151808301909252600682526530303530303760d01b928201929092529083106108a25760405162461bcd60e51b815260040161042c919061169d565b506001600160a01b0383166000908152600c602052604090208054839081106108db57634e487b7160e01b600052603260045260246000fd5b9060005260206000200154905092915050565b6009546001600160a01b03163314806109115750600a546001600160a01b031633145b61092d5760405162461bcd60e51b815260040161042c906116b0565b6109378282610d09565b5050565b61095683838360405180602001604052806000815250610d69565b505050565b60085460408051808201909152600681526530303530303760d01b6020820152600091831061099d5760405162461bcd60e51b815260040161042c919061169d565b50600882815481106109bf57634e487b7160e01b600052603260045260246000fd5b90600052602060002001549050919050565b600081815260016020908152604091829020548251808401909352600683526518181998181960d11b918301919091526001600160a01b031690816104515760405162461bcd60e51b815260040161042c919061169d565b60408051808201909152600681526530303330303160d01b60208201526000906001600160a01b038316610a705760405162461bcd60e51b815260040161042c919061169d565b50610a7a82611046565b92915050565b600a546001600160a01b031681565b6060600680546103529061174a565b6009546001600160a01b031681565b3360008181526004602090815260408083206001600160a01b038716808552925291829020805460ff191685151517905590519091907f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c3190610b10908590611692565b60405180910390a35050565b610b5e85858585858080601f016020809104026020016040519081016040528093929190818152602001838380828437600092019190915250610d6992505050565b5050505050565b600081815260016020908152604091829020548251808401909352600683526518181998181960d11b9183019190915260609183916001600160a01b0316610bc05760405162461bcd60e51b815260040161042c919061169d565b5060008381526007602052604090208054610bda9061174a565b80601f0160208091040260200160405190810160405280929190818152602001828054610c069061174a565b8015610c535780601f10610c2857610100808354040283529160200191610c53565b820191906000526020600020905b815481529060010190602001808311610c3657829003601f168201915b5050505050915050919050565b6001600160a01b03918216600090815260046020908152604080832093909416825291909152205460ff1690565b6000818152600160205260409020546001600160a01b0316610caf82611061565b610cb9818361107f565b610cc38383611226565b81836001600160a01b0316826001600160a01b03167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a4505050565b610d1382826112ea565b600880546001818101835560008390527ff3f7a9fe364faab93b216da50a3214154f22a0a2b415b23a84c8169e8b636ee39091018390559054610d569190611727565b6000918252600b60205260409091205550565b60008281526001602052604090205482906001600160a01b031633811480610da757506000828152600260205260409020546001600160a01b031633145b80610dd557506001600160a01b038116600090815260046020908152604080832033845290915290205460ff165b604051806040016040528060068152602001650c0c0ccc0c0d60d21b81525090610e125760405162461bcd60e51b815260040161042c919061169d565b50600084815260016020908152604091829020548251808401909352600683526518181998181960d11b918301919091528591906001600160a01b0316610e6c5760405162461bcd60e51b815260040161042c919061169d565b50600085815260016020908152604091829020548251808401909352600683526530303330303760d01b918301919091526001600160a01b03908116919089168214610ecb5760405162461bcd60e51b815260040161042c919061169d565b5060408051808201909152600681526530303330303160d01b60208201526001600160a01b038816610f105760405162461bcd60e51b815260040161042c919061169d565b50610f1b8787610c8e565b610f2d876001600160a01b03166113cd565b1561103c57604051630a85bd0160e11b81526000906001600160a01b0389169063150b7a0290610f679033908d908c908c90600401611656565b602060405180830381600087803b158015610f8157600080fd5b505af1158015610f95573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610fb991906115c3565b60408051808201909152600681527f303033303035000000000000000000000000000000000000000000000000000060208201529091507fffffffff000000000000000000000000000000000000000000000000000000008216630a85bd0160e11b146110395760405162461bcd60e51b815260040161042c919061169d565b50505b5050505050505050565b6001600160a01b03166000908152600c602052604090205490565b600090815260026020526040902080546001600160a01b0319169055565b600081815260016020908152604091829020548251808401909352600683526530303330303760d01b918301919091526001600160a01b038481169116146110da5760405162461bcd60e51b815260040161042c919061169d565b50600081815260016020818152604080842080546001600160a01b0319169055600d8252808420546001600160a01b0387168552600c90925283205490929161112291611727565b90508181146111d5576001600160a01b0384166000908152600c6020526040812080548390811061116357634e487b7160e01b600052603260045260246000fd5b9060005260206000200154905080600c6000876001600160a01b03166001600160a01b0316815260200190815260200160002084815481106111b557634e487b7160e01b600052603260045260246000fd5b6000918252602080832090910192909255918252600d9052604090208290555b6001600160a01b0384166000908152600c6020526040902080548061120a57634e487b7160e01b600052603160045260246000fd5b6001900381819060005260206000200160009055905550505050565b600081815260016020908152604091829020548251808401909352600683526518181998181b60d11b918301919091526001600160a01b03161561127d5760405162461bcd60e51b815260040161042c919061169d565b50600081815260016020818152604080842080546001600160a01b0319166001600160a01b038816908117909155808552600c83529084208054808501825581865292852090920185905590925290546112d79190611727565b6000918252600d60205260409091205550565b60408051808201909152600681526530303330303160d01b60208201526001600160a01b03831661132e5760405162461bcd60e51b815260040161042c919061169d565b50600081815260016020908152604091829020548251808401909352600683526518181998181b60d11b918301919091526001600160a01b0316156113865760405162461bcd60e51b815260040161042c919061169d565b506113918282611226565b60405181906001600160a01b038416906000907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef908290a45050565b6000813f7fc5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a47081158015906114015750808214155b949350505050565b80356001600160a01b038116811461033e57600080fd5b600060208284031215611431578081fd5b61143a82611409565b9392505050565b60008060408385031215611453578081fd5b61145c83611409565b915061146a60208401611409565b90509250929050565b600080600060608486031215611487578081fd5b61149084611409565b925061149e60208501611409565b9150604084013590509250925092565b6000806000806000608086880312156114c5578081fd5b6114ce86611409565b94506114dc60208701611409565b935060408601359250606086013567ffffffffffffffff808211156114ff578283fd5b818801915088601f830112611512578283fd5b813581811115611520578384fd5b896020828501011115611531578384fd5b9699959850939650602001949392505050565b60008060408385031215611556578182fd5b61155f83611409565b915060208301358015158114611573578182fd5b809150509250929050565b60008060408385031215611590578182fd5b61159983611409565b946020939093013593505050565b6000602082840312156115b8578081fd5b813561143a8161177f565b6000602082840312156115d4578081fd5b815161143a8161177f565b6000602082840312156115f0578081fd5b5035919050565b60008151808452815b8181101561161c57602081850181015186830182015201611600565b8181111561162d5782602083870101525b50601f01601f19169290920160200192915050565b6001600160a01b0391909116815260200190565b60006001600160a01b0380871683528086166020840152508360408301526080606083015261168860808301846115f7565b9695505050505050565b901515815260200190565b60006020825261143a60208301846115f7565b6020808252600b908201527f6f6e6c79466163746f7279000000000000000000000000000000000000000000604082015260600190565b60208082526009908201527f6f6e6c794f776e65720000000000000000000000000000000000000000000000604082015260600190565b90815260200190565b60008282101561174557634e487b7160e01b81526011600452602481fd5b500390565b60028104600182168061175e57607f821691505b6020821081141561045157634e487b7160e01b600052602260045260246000fd5b7fffffffff00000000000000000000000000000000000000000000000000000000811681146117ad57600080fd5b5056fea26469706673582212205dad40e1dc5618cf81ee8cec935f28910cdacf52a7b3be5331e1251ab929c05864736f6c6343000800003300000000000000000000000000000000000000000000000000000000000000400000000000000000000000000000000000000000000000000000000000000080000000000000000000000000000000000000000000000000000000000000000d4269466920506f736974696f6e000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000008504f534954494f4e000000000000000000000000000000000000000000000000

Deployed Bytecode

0x608060405234801561001057600080fd5b50600436106101775760003560e01c806342842e0e116100d857806395d89b411161008c578063b88d4fde11610066578063b88d4fde146102cf578063c87b56dd146102e2578063e985e9c5146102f557610177565b806395d89b41146102ac578063963671be146102b4578063a22cb465146102bc57610177565b80636352211e116100bd5780636352211e1461027e57806370a08231146102915780638da5cb5b146102a457610177565b806342842e0e146102585780634f6ccce71461026b57610177565b806318160ddd1161012f5780632b8174c2116101145780632b8174c21461022a5780632f745c591461023257806340c10f191461024557610177565b806318160ddd1461020257806323b872dd1461021757610177565b8063081812fc11610160578063081812fc146101ba578063095ea7b3146101da5780630b5a01fa146101ef57610177565b806301ffc9a71461017c57806306fdde03146101a5575b600080fd5b61018f61018a3660046115a7565b610308565b60405161019c9190611692565b60405180910390f35b6101ad610343565b60405161019c919061169d565b6101cd6101c83660046115df565b6103d5565b60405161019c9190611642565b6101ed6101e836600461157e565b610457565b005b61018f6101fd366004611420565b610627565b61020a610679565b60405161019c919061171e565b6101ed610225366004611473565b61067f565b6101cd61083a565b61020a61024036600461157e565b610849565b6101ed61025336600461157e565b6108ee565b6101ed610266366004611473565b61093b565b61020a6102793660046115df565b61095b565b6101cd61028c3660046115df565b6109d1565b61020a61029f366004611420565b610a29565b6101cd610a80565b6101ad610a8f565b6101cd610a9e565b6101ed6102ca366004611544565b610aad565b6101ed6102dd3660046114ae565b610b1c565b6101ad6102f03660046115df565b610b65565b61018f610303366004611441565b610c60565b7fffffffff00000000000000000000000000000000000000000000000000000000811660009081526020819052604090205460ff165b919050565b6060600580546103529061174a565b80601f016020809104026020016040519081016040528092919081815260200182805461037e9061174a565b80156103cb5780601f106103a0576101008083540402835291602001916103cb565b820191906000526020600020905b8154815290600101906020018083116103ae57829003601f168201915b5050505050905090565b6000818152600160209081526040808320548151808301909252600682526518181998181960d11b9282019290925283916001600160a01b03166104355760405162461bcd60e51b815260040161042c919061169d565b60405180910390fd5b506000838152600260205260409020546001600160a01b031691505b50919050565b60008181526001602052604090205481906001600160a01b0316338114806104a257506001600160a01b038116600090815260046020908152604080832033845290915290205460ff165b6040518060400160405280600681526020017f3030333030330000000000000000000000000000000000000000000000000000815250906104f65760405162461bcd60e51b815260040161042c919061169d565b50600083815260016020908152604091829020548251808401909352600683526518181998181960d11b918301919091528491906001600160a01b03166105505760405162461bcd60e51b815260040161042c919061169d565b50600084815260016020908152604091829020548251808401909352600683527f3030333030380000000000000000000000000000000000000000000000000000918301919091526001600160a01b03908116919087168214156105c75760405162461bcd60e51b815260040161042c919061169d565b5060008581526002602052604080822080546001600160a01b0319166001600160a01b038a811691821790925591518893918516917f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92591a4505050505050565b600a546000906001600160a01b031633146106545760405162461bcd60e51b815260040161042c906116e7565b50600980546001600160a01b0383166001600160a01b03199091161790556001919050565b60085490565b60008181526001602052604090205481906001600160a01b0316338114806106bd57506000828152600260205260409020546001600160a01b031633145b806106eb57506001600160a01b038116600090815260046020908152604080832033845290915290205460ff165b604051806040016040528060068152602001650c0c0ccc0c0d60d21b815250906107285760405162461bcd60e51b815260040161042c919061169d565b50600083815260016020908152604091829020548251808401909352600683526518181998181960d11b918301919091528491906001600160a01b03166107825760405162461bcd60e51b815260040161042c919061169d565b50600084815260016020908152604091829020548251808401909352600683526530303330303760d01b918301919091526001600160a01b039081169190881682146107e15760405162461bcd60e51b815260040161042c919061169d565b5060408051808201909152600681526530303330303160d01b60208201526001600160a01b0387166108265760405162461bcd60e51b815260040161042c919061169d565b506108318686610c8e565b50505050505050565b6009546001600160a01b031690565b6001600160a01b0382166000908152600c60209081526040808320548151808301909252600682526530303530303760d01b928201929092529083106108a25760405162461bcd60e51b815260040161042c919061169d565b506001600160a01b0383166000908152600c602052604090208054839081106108db57634e487b7160e01b600052603260045260246000fd5b9060005260206000200154905092915050565b6009546001600160a01b03163314806109115750600a546001600160a01b031633145b61092d5760405162461bcd60e51b815260040161042c906116b0565b6109378282610d09565b5050565b61095683838360405180602001604052806000815250610d69565b505050565b60085460408051808201909152600681526530303530303760d01b6020820152600091831061099d5760405162461bcd60e51b815260040161042c919061169d565b50600882815481106109bf57634e487b7160e01b600052603260045260246000fd5b90600052602060002001549050919050565b600081815260016020908152604091829020548251808401909352600683526518181998181960d11b918301919091526001600160a01b031690816104515760405162461bcd60e51b815260040161042c919061169d565b60408051808201909152600681526530303330303160d01b60208201526000906001600160a01b038316610a705760405162461bcd60e51b815260040161042c919061169d565b50610a7a82611046565b92915050565b600a546001600160a01b031681565b6060600680546103529061174a565b6009546001600160a01b031681565b3360008181526004602090815260408083206001600160a01b038716808552925291829020805460ff191685151517905590519091907f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c3190610b10908590611692565b60405180910390a35050565b610b5e85858585858080601f016020809104026020016040519081016040528093929190818152602001838380828437600092019190915250610d6992505050565b5050505050565b600081815260016020908152604091829020548251808401909352600683526518181998181960d11b9183019190915260609183916001600160a01b0316610bc05760405162461bcd60e51b815260040161042c919061169d565b5060008381526007602052604090208054610bda9061174a565b80601f0160208091040260200160405190810160405280929190818152602001828054610c069061174a565b8015610c535780601f10610c2857610100808354040283529160200191610c53565b820191906000526020600020905b815481529060010190602001808311610c3657829003601f168201915b5050505050915050919050565b6001600160a01b03918216600090815260046020908152604080832093909416825291909152205460ff1690565b6000818152600160205260409020546001600160a01b0316610caf82611061565b610cb9818361107f565b610cc38383611226565b81836001600160a01b0316826001600160a01b03167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a4505050565b610d1382826112ea565b600880546001818101835560008390527ff3f7a9fe364faab93b216da50a3214154f22a0a2b415b23a84c8169e8b636ee39091018390559054610d569190611727565b6000918252600b60205260409091205550565b60008281526001602052604090205482906001600160a01b031633811480610da757506000828152600260205260409020546001600160a01b031633145b80610dd557506001600160a01b038116600090815260046020908152604080832033845290915290205460ff165b604051806040016040528060068152602001650c0c0ccc0c0d60d21b81525090610e125760405162461bcd60e51b815260040161042c919061169d565b50600084815260016020908152604091829020548251808401909352600683526518181998181960d11b918301919091528591906001600160a01b0316610e6c5760405162461bcd60e51b815260040161042c919061169d565b50600085815260016020908152604091829020548251808401909352600683526530303330303760d01b918301919091526001600160a01b03908116919089168214610ecb5760405162461bcd60e51b815260040161042c919061169d565b5060408051808201909152600681526530303330303160d01b60208201526001600160a01b038816610f105760405162461bcd60e51b815260040161042c919061169d565b50610f1b8787610c8e565b610f2d876001600160a01b03166113cd565b1561103c57604051630a85bd0160e11b81526000906001600160a01b0389169063150b7a0290610f679033908d908c908c90600401611656565b602060405180830381600087803b158015610f8157600080fd5b505af1158015610f95573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610fb991906115c3565b60408051808201909152600681527f303033303035000000000000000000000000000000000000000000000000000060208201529091507fffffffff000000000000000000000000000000000000000000000000000000008216630a85bd0160e11b146110395760405162461bcd60e51b815260040161042c919061169d565b50505b5050505050505050565b6001600160a01b03166000908152600c602052604090205490565b600090815260026020526040902080546001600160a01b0319169055565b600081815260016020908152604091829020548251808401909352600683526530303330303760d01b918301919091526001600160a01b038481169116146110da5760405162461bcd60e51b815260040161042c919061169d565b50600081815260016020818152604080842080546001600160a01b0319169055600d8252808420546001600160a01b0387168552600c90925283205490929161112291611727565b90508181146111d5576001600160a01b0384166000908152600c6020526040812080548390811061116357634e487b7160e01b600052603260045260246000fd5b9060005260206000200154905080600c6000876001600160a01b03166001600160a01b0316815260200190815260200160002084815481106111b557634e487b7160e01b600052603260045260246000fd5b6000918252602080832090910192909255918252600d9052604090208290555b6001600160a01b0384166000908152600c6020526040902080548061120a57634e487b7160e01b600052603160045260246000fd5b6001900381819060005260206000200160009055905550505050565b600081815260016020908152604091829020548251808401909352600683526518181998181b60d11b918301919091526001600160a01b03161561127d5760405162461bcd60e51b815260040161042c919061169d565b50600081815260016020818152604080842080546001600160a01b0319166001600160a01b038816908117909155808552600c83529084208054808501825581865292852090920185905590925290546112d79190611727565b6000918252600d60205260409091205550565b60408051808201909152600681526530303330303160d01b60208201526001600160a01b03831661132e5760405162461bcd60e51b815260040161042c919061169d565b50600081815260016020908152604091829020548251808401909352600683526518181998181b60d11b918301919091526001600160a01b0316156113865760405162461bcd60e51b815260040161042c919061169d565b506113918282611226565b60405181906001600160a01b038416906000907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef908290a45050565b6000813f7fc5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a47081158015906114015750808214155b949350505050565b80356001600160a01b038116811461033e57600080fd5b600060208284031215611431578081fd5b61143a82611409565b9392505050565b60008060408385031215611453578081fd5b61145c83611409565b915061146a60208401611409565b90509250929050565b600080600060608486031215611487578081fd5b61149084611409565b925061149e60208501611409565b9150604084013590509250925092565b6000806000806000608086880312156114c5578081fd5b6114ce86611409565b94506114dc60208701611409565b935060408601359250606086013567ffffffffffffffff808211156114ff578283fd5b818801915088601f830112611512578283fd5b813581811115611520578384fd5b896020828501011115611531578384fd5b9699959850939650602001949392505050565b60008060408385031215611556578182fd5b61155f83611409565b915060208301358015158114611573578182fd5b809150509250929050565b60008060408385031215611590578182fd5b61159983611409565b946020939093013593505050565b6000602082840312156115b8578081fd5b813561143a8161177f565b6000602082840312156115d4578081fd5b815161143a8161177f565b6000602082840312156115f0578081fd5b5035919050565b60008151808452815b8181101561161c57602081850181015186830182015201611600565b8181111561162d5782602083870101525b50601f01601f19169290920160200192915050565b6001600160a01b0391909116815260200190565b60006001600160a01b0380871683528086166020840152508360408301526080606083015261168860808301846115f7565b9695505050505050565b901515815260200190565b60006020825261143a60208301846115f7565b6020808252600b908201527f6f6e6c79466163746f7279000000000000000000000000000000000000000000604082015260600190565b60208082526009908201527f6f6e6c794f776e65720000000000000000000000000000000000000000000000604082015260600190565b90815260200190565b60008282101561174557634e487b7160e01b81526011600452602481fd5b500390565b60028104600182168061175e57607f821691505b6020821081141561045157634e487b7160e01b600052602260045260246000fd5b7fffffffff00000000000000000000000000000000000000000000000000000000811681146117ad57600080fd5b5056fea26469706673582212205dad40e1dc5618cf81ee8cec935f28910cdacf52a7b3be5331e1251ab929c05864736f6c63430008000033

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

00000000000000000000000000000000000000000000000000000000000000400000000000000000000000000000000000000000000000000000000000000080000000000000000000000000000000000000000000000000000000000000000d4269466920506f736974696f6e000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000008504f534954494f4e000000000000000000000000000000000000000000000000

-----Decoded View---------------
Arg [0] : _nftName (string): BiFi Position
Arg [1] : _nftSymbol (string): POSITION

-----Encoded View---------------
6 Constructor Arguments found :
Arg [0] : 0000000000000000000000000000000000000000000000000000000000000040
Arg [1] : 0000000000000000000000000000000000000000000000000000000000000080
Arg [2] : 000000000000000000000000000000000000000000000000000000000000000d
Arg [3] : 4269466920506f736974696f6e00000000000000000000000000000000000000
Arg [4] : 0000000000000000000000000000000000000000000000000000000000000008
Arg [5] : 504f534954494f4e000000000000000000000000000000000000000000000000


Deployed Bytecode Sourcemap

25861:7865:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;8520:172;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;27832:120;;;:::i;:::-;;;;;;;:::i;18014:183::-;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;15799:352::-;;;;;;:::i;:::-;;:::i;:::-;;27473:137;;;;;;:::i;:::-;;:::i;28641:120::-;;;:::i;:::-;;;;;;;:::i;15025:353::-;;;;;;:::i;:::-;;:::i;27616:89::-;;;:::i;29338:251::-;;;;;;:::i;:::-;;:::i;29595:131::-;;;;;;:::i;:::-;;:::i;14270:179::-;;;;;;:::i;:::-;;:::i;28902:199::-;;;;;;:::i;:::-;;:::i;17562:208::-;;;;;;:::i;:::-;;:::i;17088:204::-;;;;;;:::i;:::-;;:::i;26775:20::-;;;:::i;28068:128::-;;;:::i;26744:26::-;;;:::i;16562:232::-;;;;;;:::i;:::-;;:::i;13651:209::-;;;;;;:::i;:::-;;:::i;28349:181::-;;;;;;:::i;:::-;;:::i;18466:192::-;;;;;;:::i;:::-;;:::i;8520:172::-;8653:33;;;8630:4;8653:33;;;;;;;;;;;;;8520:172;;;;:::o;27832:120::-;27900:19;27939:7;27931:15;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;27832:120;:::o;18014:183::-;18143:7;12583:19;;;:9;:19;;;;;;;;;12618:13;;;;;;;;;;;-1:-1:-1;;;12618:13:0;;;;;;;18119:8;;-1:-1:-1;;;;;12583:19:0;12575:57;;;;-1:-1:-1;;;12575:57:0;;;;;;;;:::i;:::-;;;;;;;;;-1:-1:-1;18169:22:0::1;::::0;;;:12:::1;:22;::::0;;;;;-1:-1:-1;;;;;18169:22:0::1;::::0;-1:-1:-1;12639:1:0::1;18014:183:::0;;;;:::o;15799:352::-;11767:18;11788:19;;;:9;:19;;;;;;15912:8;;-1:-1:-1;;;;;11788:19:0;11844:10;11830:24;;;:68;;-1:-1:-1;;;;;;11858:28:0;;;;;;:16;:28;;;;;;;;11887:10;11858:40;;;;;;;;;;11830:68;11907:21;;;;;;;;;;;;;;;;;11814:121;;;;;-1:-1:-1;;;11814:121:0;;;;;;;;:::i;:::-;-1:-1:-1;12614:1:0::1;12583:19:::0;;;:9:::1;:19;::::0;;;;;;;;;12618:13;;;;::::1;::::0;;;::::1;::::0;;-1:-1:-1;;;12618:13:0;;::::1;::::0;;;;15940:8;;12618:13;-1:-1:-1;;;;;12583:19:0::1;12575:57;;;;-1:-1:-1::0;;;12575:57:0::1;;;;;;;;:::i;:::-;-1:-1:-1::0;15960:18:0::2;15981:19:::0;;;:9:::2;:19;::::0;;;;;;;;;16040:8;;;;::::2;::::0;;;::::2;::::0;;::::2;::::0;;::::2;::::0;;;;-1:-1:-1;;;;;15981:19:0;;::::2;::::0;16040:8;16015:23;::::2;::::0;::::2;;16007:42;;;;-1:-1:-1::0;;;16007:42:0::2;;;;;;;;:::i;:::-;-1:-1:-1::0;16058:22:0::2;::::0;;;:12:::2;:22;::::0;;;;;:34;;-1:-1:-1;;;;;;16058:34:0::2;-1:-1:-1::0;;;;;16058:34:0;;::::2;::::0;;::::2;::::0;;;16104:41;;16058:22;;16104:41;;::::2;::::0;::::2;::::0;::::2;12639:1;11942::::1;15799:352:::0;;;;:::o;27473:137::-;26100:5;;27547:4;;-1:-1:-1;;;;;26100:5:0;26109:10;26100:19;26092:41;;;;-1:-1:-1;;;26092:41:0;;;;;;;:::i;:::-;-1:-1:-1;27560:11:0::1;:26:::0;;-1:-1:-1;;;;;27560:26:0;::::1;-1:-1:-1::0;;;;;;27560:26:0;;::::1;;::::0;;;27473:137;;;:::o;28641:120::-;28742:6;:13;28641:120;:::o;15025:353::-;12147:18;12168:19;;;:9;:19;;;;;;15158:8;;-1:-1:-1;;;;;12168:19:0;12224:10;12210:24;;;:71;;-1:-1:-1;12245:22:0;;;;:12;:22;;;;;;-1:-1:-1;;;;;12245:22:0;12271:10;12245:36;12210:71;:122;;;-1:-1:-1;;;;;;12292:28:0;;;;;;:16;:28;;;;;;;;12321:10;12292:40;;;;;;;;;;12210:122;12341:30;;;;;;;;;;;;;-1:-1:-1;;;12341:30:0;;;12194:184;;;;;-1:-1:-1;;;12194:184:0;;;;;;;;:::i;:::-;-1:-1:-1;12614:1:0::1;12583:19:::0;;;:9:::1;:19;::::0;;;;;;;;;12618:13;;;;::::1;::::0;;;::::1;::::0;;-1:-1:-1;;;12618:13:0;;::::1;::::0;;;;15186:8;;12618:13;-1:-1:-1;;;;;12583:19:0::1;12575:57;;;;-1:-1:-1::0;;;12575:57:0::1;;;;;;;;:::i;:::-;-1:-1:-1::0;15206:18:0::2;15227:19:::0;;;:9:::2;:19;::::0;;;;;;;;;15282:9;;;;::::2;::::0;;;::::2;::::0;;-1:-1:-1;;;15282:9:0;;::::2;::::0;;;;-1:-1:-1;;;;;15227:19:0;;::::2;::::0;15282:9;15261:19;::::2;::::0;::::2;15253:39;;;;-1:-1:-1::0;;;15253:39:0::2;;;;;;;;:::i;:::-;-1:-1:-1::0;15326:12:0::2;::::0;;;;::::2;::::0;;;::::2;::::0;;-1:-1:-1;;;15326:12:0::2;::::0;::::2;::::0;-1:-1:-1;;;;;15307:17:0;::::2;15299:40;;;;-1:-1:-1::0;;;15299:40:0::2;;;;;;;;:::i;:::-;;15348:24;15358:3;15363:8;15348:9;:24::i;:::-;12639:1;12385::::1;15025:353:::0;;;;;:::o;27616:89::-;27688:11;;-1:-1:-1;;;;;27688:11:0;27616:89;:::o;29338:251::-;-1:-1:-1;;;;;29502:18:0;;29466:7;29502:18;;;:10;:18;;;;;;;;:25;29529:13;;;;;;;;;;;-1:-1:-1;;;29529:13:0;;;;;;;;29493:34;;29485:58;;;;-1:-1:-1;;;29485:58:0;;;;;;;;:::i;:::-;-1:-1:-1;;;;;;29557:18:0;;;;;;:10;:18;;;;;:26;;29576:6;;29557:26;;;;-1:-1:-1;;;29557:26:0;;;;;;;;;;;;;;;;;29550:33;;29338:251;;;;:::o;29595:131::-;25979:11;;-1:-1:-1;;;;;25979:11:0;25994:10;25979:25;;25978:52;;-1:-1:-1;26010:5:0;;-1:-1:-1;;;;;26010:5:0;26019:10;26010:19;25978:52;25969:77;;;;-1:-1:-1;;;25969:77:0;;;;;;;:::i;:::-;29700:20:::1;29706:3;29711:8;29700:5;:20::i;:::-;29595:131:::0;;:::o;14270:179::-;14400:43;14418:5;14425:3;14430:8;14400:43;;;;;;;;;;;;:17;:43::i;:::-;14270:179;;;:::o;28902:199::-;29038:6;:13;29053;;;;;;;;;;;;-1:-1:-1;;;29053:13:0;;;;29002:7;;29029:22;;29021:46;;;;-1:-1:-1;;;29021:46:0;;;;;;;;:::i;:::-;;29081:6;29088;29081:14;;;;;;-1:-1:-1;;;29081:14:0;;;;;;;;;;;;;;;;;29074:21;;28902:199;;;:::o;17562:208::-;17659:14;17694:19;;;:9;:19;;;;;;;;;;17750:13;;;;;;;;;;;-1:-1:-1;;;17750:13:0;;;;;;;-1:-1:-1;;;;;17694:19:0;;17728:20;17720:44;;;;-1:-1:-1;;;17720:44:0;;;;;;;;:::i;17088:204::-;17234:12;;;;;;;;;;;;-1:-1:-1;;;17234:12:0;;;;17185:7;;-1:-1:-1;;;;;17212:20:0;;17204:43;;;;-1:-1:-1;;;17204:43:0;;;;;;;;:::i;:::-;;17261:25;17279:6;17261:17;:25::i;:::-;17254:32;17088:204;-1:-1:-1;;17088:204:0:o;26775:20::-;;;-1:-1:-1;;;;;26775:20:0;;:::o;28068:128::-;28138:21;28181:9;28171:19;;;;;:::i;26744:26::-;;;-1:-1:-1;;;;;26744:26:0;;:::o;16562:232::-;16694:10;16677:28;;;;:16;:28;;;;;;;;-1:-1:-1;;;;;16677:39:0;;;;;;;;;;;:51;;-1:-1:-1;;16677:51:0;;;;;;;16740:48;;16677:39;;16694:10;16740:48;;;;16677:51;;16740:48;:::i;:::-;;;;;;;;16562:232;;:::o;13651:209::-;13808:46;13826:5;13833:3;13838:8;13848:5;;13808:46;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;13808:17:0;;-1:-1:-1;;;13808:46:0:i;:::-;13651:209;;;;;:::o;28349:181::-;12614:1;12583:19;;;:9;:19;;;;;;;;;;12618:13;;;;;;;;;;;-1:-1:-1;;;12618:13:0;;;;;;;28475;;28451:8;;-1:-1:-1;;;;;12583:19:0;12575:57;;;;-1:-1:-1;;;12575:57:0;;;;;;;;:::i;:::-;-1:-1:-1;28507:17:0::1;::::0;;;:7:::1;:17;::::0;;;;28500:24;;::::1;::::0;::::1;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;28349:181:::0;;;;:::o;18466:192::-;-1:-1:-1;;;;;18617:24:0;;;18594:4;18617:24;;;:16;:24;;;;;;;;:35;;;;;;;;;;;;;;;18466:192::o;18849:275::-;18938:12;18953:19;;;:9;:19;;;;;;-1:-1:-1;;;;;18953:19:0;18979:24;18963:8;18979:14;:24::i;:::-;19012:30;19027:4;19033:8;19012:14;:30::i;:::-;19049:26;19061:3;19066:8;19049:11;:26::i;:::-;19109:8;19104:3;-1:-1:-1;;;;;19089:29:0;19098:4;-1:-1:-1;;;;;19089:29:0;;;;;;;;;;;18849:275;;;:::o;30669:218::-;30781:26;30793:3;30798:8;30781:11;:26::i;:::-;30814:6;:21;;;;;;;;-1:-1:-1;30814:21:0;;;;;;;;;;30864:13;;:17;;30814:21;30864:17;:::i;:::-;30842:19;;;;:9;:19;;;;;;:39;-1:-1:-1;30669:218:0:o;22252:591::-;12147:18;12168:19;;;:9;:19;;;;;;22400:8;;-1:-1:-1;;;;;12168:19:0;12224:10;12210:24;;;:71;;-1:-1:-1;12245:22:0;;;;:12;:22;;;;;;-1:-1:-1;;;;;12245:22:0;12271:10;12245:36;12210:71;:122;;;-1:-1:-1;;;;;;12292:28:0;;;;;;:16;:28;;;;;;;;12321:10;12292:40;;;;;;;;;;12210:122;12341:30;;;;;;;;;;;;;-1:-1:-1;;;12341:30:0;;;12194:184;;;;;-1:-1:-1;;;12194:184:0;;;;;;;;:::i;:::-;-1:-1:-1;12614:1:0::1;12583:19:::0;;;:9:::1;:19;::::0;;;;;;;;;12618:13;;;;::::1;::::0;;;::::1;::::0;;-1:-1:-1;;;12618:13:0;;::::1;::::0;;;;22428:8;;12618:13;-1:-1:-1;;;;;12583:19:0::1;12575:57;;;;-1:-1:-1::0;;;12575:57:0::1;;;;;;;;:::i;:::-;-1:-1:-1::0;22448:18:0::2;22469:19:::0;;;:9:::2;:19;::::0;;;;;;;;;22524:9;;;;::::2;::::0;;;::::2;::::0;;-1:-1:-1;;;22524:9:0;;::::2;::::0;;;;-1:-1:-1;;;;;22469:19:0;;::::2;::::0;22524:9;22503:19;::::2;::::0;::::2;22495:39;;;;-1:-1:-1::0;;;22495:39:0::2;;;;;;;;:::i;:::-;-1:-1:-1::0;22568:12:0::2;::::0;;;;::::2;::::0;;;::::2;::::0;;-1:-1:-1;;;22568:12:0::2;::::0;::::2;::::0;-1:-1:-1;;;;;22549:17:0;::::2;22541:40;;;;-1:-1:-1::0;;;22541:40:0::2;;;;;;;;:::i;:::-;;22590:24;22600:3;22605:8;22590:9;:24::i;:::-;22627:16;:3;-1:-1:-1::0;;;;;22627:14:0::2;;:16::i;:::-;22623:215;;;22675:78;::::0;-1:-1:-1;;;22675:78:0;;22659:13:::2;::::0;-1:-1:-1;;;;;22675:42:0;::::2;::::0;::::2;::::0;:78:::2;::::0;22718:10:::2;::::0;22730:5;;22737:8;;22747:5;;22675:78:::2;;;:::i;:::-;;;;;;;;;;;;;;;;;;::::0;::::2;;;;;;;;;;;;::::0;::::2;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;22806:23;::::0;;;;::::2;::::0;;;::::2;::::0;;::::2;;::::0;::::2;::::0;22659:94;;-1:-1:-1;22770:34:0;;::::2;-1:-1:-1::0;;;22770:34:0::2;22762:68;;;;-1:-1:-1::0;;;22762:68:0::2;;;;;;;;:::i;:::-;;22623:215;;12639:1;12385::::1;22252:591:::0;;;;;;:::o;33548:175::-;-1:-1:-1;;;;;33692:18:0;33666:7;33692:18;;;:10;:18;;;;;:25;;33548:175::o;22976:110::-;23058:22;;;;:12;:22;;;;;23051:29;;-1:-1:-1;;;;;;23051:29:0;;;22976:110::o;32064:602::-;32195:19;;;;:9;:19;;;;;;;;;;32225:9;;;;;;;;;;;-1:-1:-1;;;32225:9:0;;;;;;;-1:-1:-1;;;;;32195:28:0;;;:19;;:28;32187:48;;;;-1:-1:-1;;;32187:48:0;;;;;;;;:::i;:::-;-1:-1:-1;32249:19:0;;;;:9;:19;;;;;;;;32242:26;;-1:-1:-1;;;;;;32242:26:0;;;32306:14;:24;;;;;;-1:-1:-1;;;;;32362:17:0;;;;:10;:17;;;;;:24;32306;;32249:19;32362:28;;;:::i;:::-;32337:53;;32421:18;32403:14;:36;32399:230;;-1:-1:-1;;;;;32475:17:0;;32455;32475;;;:10;:17;;;;;:33;;32493:14;;32475:33;;;;-1:-1:-1;;;32475:33:0;;;;;;;;;;;;;;;;;32455:53;;32557:9;32517:10;:17;32528:5;-1:-1:-1;;;;;32517:17:0;-1:-1:-1;;;;;32517:17:0;;;;;;;;;;;;32535:18;32517:37;;;;;;-1:-1:-1;;;32517:37:0;;;;;;;;;;;;;;;;;;;;:49;;;;32575:25;;;:14;:25;;;;;:46;;;32399:230;-1:-1:-1;;;;;32637:17:0;;;;;;:10;:17;;;;;:23;;;;;-1:-1:-1;;;32637:23:0;;;;;;;;;;;;;;;;;;;;;;;;;;32064:602;;;;:::o;32937:317::-;33094:1;33063:19;;;:9;:19;;;;;;;;;;33098:18;;;;;;;;;;;-1:-1:-1;;;33098:18:0;;;;;;;-1:-1:-1;;;;;33063:19:0;:33;33055:62;;;;-1:-1:-1;;;33055:62:0;;;;;;;;:::i;:::-;-1:-1:-1;33124:19:0;;;;:9;:19;;;;;;;;:25;;-1:-1:-1;;;;;;33124:25:0;-1:-1:-1;;;;;33124:25:0;;;;;;;;33158:15;;;:10;:15;;;;;:30;;;;;;;;;;;;;;;;;;;33222:15;;;:22;;:26;;33124:9;33222:26;:::i;:::-;33195:24;;;;:14;:24;;;;;;:53;-1:-1:-1;32937:317:0:o;19515:297::-;19640:12;;;;;;;;;;;;-1:-1:-1;;;19640:12:0;;;;-1:-1:-1;;;;;19621:17:0;;19613:40;;;;-1:-1:-1;;;19613:40:0;;;;;;;;:::i;:::-;-1:-1:-1;19699:1:0;19668:19;;;:9;:19;;;;;;;;;;19703:18;;;;;;;;;;;-1:-1:-1;;;19703:18:0;;;;;;;-1:-1:-1;;;;;19668:19:0;:33;19660:62;;;;-1:-1:-1;;;19660:62:0;;;;;;;;:::i;:::-;;19731:26;19743:3;19748:8;19731:11;:26::i;:::-;19771:35;;19797:8;;-1:-1:-1;;;;;19771:35:0;;;19788:1;;19771:35;;19788:1;;19771:35;19515:297;;:::o;9193:780::-;9276:17;9858:18;;9762:66;9924:15;;;;;:42;;;9955:11;9943:8;:23;;9924:42;9908:59;9193:780;-1:-1:-1;;;;9193:780:0:o;14:198:1:-;84:20;;-1:-1:-1;;;;;133:54:1;;123:65;;113:2;;202:1;199;192:12;217:198;;329:2;317:9;308:7;304:23;300:32;297:2;;;350:6;342;335:22;297:2;378:31;399:9;378:31;:::i;:::-;368:41;287:128;-1:-1:-1;;;287:128:1:o;420:274::-;;;549:2;537:9;528:7;524:23;520:32;517:2;;;570:6;562;555:22;517:2;598:31;619:9;598:31;:::i;:::-;588:41;;648:40;684:2;673:9;669:18;648:40;:::i;:::-;638:50;;507:187;;;;;:::o;699:342::-;;;;845:2;833:9;824:7;820:23;816:32;813:2;;;866:6;858;851:22;813:2;894:31;915:9;894:31;:::i;:::-;884:41;;944:40;980:2;969:9;965:18;944:40;:::i;:::-;934:50;;1031:2;1020:9;1016:18;1003:32;993:42;;803:238;;;;;:::o;1046:862::-;;;;;;1228:3;1216:9;1207:7;1203:23;1199:33;1196:2;;;1250:6;1242;1235:22;1196:2;1278:31;1299:9;1278:31;:::i;:::-;1268:41;;1328:40;1364:2;1353:9;1349:18;1328:40;:::i;:::-;1318:50;;1415:2;1404:9;1400:18;1387:32;1377:42;;1470:2;1459:9;1455:18;1442:32;1493:18;1534:2;1526:6;1523:14;1520:2;;;1555:6;1547;1540:22;1520:2;1598:6;1587:9;1583:22;1573:32;;1643:7;1636:4;1632:2;1628:13;1624:27;1614:2;;1670:6;1662;1655:22;1614:2;1715;1702:16;1741:2;1733:6;1730:14;1727:2;;;1762:6;1754;1747:22;1727:2;1812:7;1807:2;1798:6;1794:2;1790:15;1786:24;1783:37;1780:2;;;1838:6;1830;1823:22;1780:2;1186:722;;;;-1:-1:-1;1186:722:1;;-1:-1:-1;1874:2:1;1866:11;;1896:6;1186:722;-1:-1:-1;;;1186:722:1:o;1913:369::-;;;2039:2;2027:9;2018:7;2014:23;2010:32;2007:2;;;2060:6;2052;2045:22;2007:2;2088:31;2109:9;2088:31;:::i;:::-;2078:41;;2169:2;2158:9;2154:18;2141:32;2216:5;2209:13;2202:21;2195:5;2192:32;2182:2;;2243:6;2235;2228:22;2182:2;2271:5;2261:15;;;1997:285;;;;;:::o;2287:266::-;;;2416:2;2404:9;2395:7;2391:23;2387:32;2384:2;;;2437:6;2429;2422:22;2384:2;2465:31;2486:9;2465:31;:::i;:::-;2455:41;2543:2;2528:18;;;;2515:32;;-1:-1:-1;;;2374:179:1:o;2558:257::-;;2669:2;2657:9;2648:7;2644:23;2640:32;2637:2;;;2690:6;2682;2675:22;2637:2;2734:9;2721:23;2753:32;2779:5;2753:32;:::i;2820:261::-;;2942:2;2930:9;2921:7;2917:23;2913:32;2910:2;;;2963:6;2955;2948:22;2910:2;3000:9;2994:16;3019:32;3045:5;3019:32;:::i;3086:190::-;;3198:2;3186:9;3177:7;3173:23;3169:32;3166:2;;;3219:6;3211;3204:22;3166:2;-1:-1:-1;3247:23:1;;3156:120;-1:-1:-1;3156:120:1:o;3281:477::-;;3362:5;3356:12;3389:6;3384:3;3377:19;3414:3;3426:162;3440:6;3437:1;3434:13;3426:162;;;3502:4;3558:13;;;3554:22;;3548:29;3530:11;;;3526:20;;3519:59;3455:12;3426:162;;;3606:6;3603:1;3600:13;3597:2;;;3672:3;3665:4;3656:6;3651:3;3647:16;3643:27;3636:40;3597:2;-1:-1:-1;3740:2:1;3719:15;-1:-1:-1;;3715:29:1;3706:39;;;;3747:4;3702:50;;3332:426;-1:-1:-1;;3332:426:1:o;3763:226::-;-1:-1:-1;;;;;3927:55:1;;;;3909:74;;3897:2;3882:18;;3864:125::o;3994:513::-;;-1:-1:-1;;;;;4298:2:1;4290:6;4286:15;4275:9;4268:34;4350:2;4342:6;4338:15;4333:2;4322:9;4318:18;4311:43;;4390:6;4385:2;4374:9;4370:18;4363:34;4433:3;4428:2;4417:9;4413:18;4406:31;4454:47;4496:3;4485:9;4481:19;4473:6;4454:47;:::i;:::-;4446:55;4197:310;-1:-1:-1;;;;;;4197:310:1:o;4512:187::-;4677:14;;4670:22;4652:41;;4640:2;4625:18;;4607:92::o;4704:221::-;;4853:2;4842:9;4835:21;4873:46;4915:2;4904:9;4900:18;4892:6;4873:46;:::i;4930:335::-;5132:2;5114:21;;;5171:2;5151:18;;;5144:30;5210:13;5205:2;5190:18;;5183:41;5256:2;5241:18;;5104:161::o;5270:332::-;5472:2;5454:21;;;5511:1;5491:18;;;5484:29;5549:11;5544:2;5529:18;;5522:39;5593:2;5578:18;;5444:158::o;5607:177::-;5753:25;;;5741:2;5726:18;;5708:76::o;5789:285::-;;5857:1;5854;5851:8;5848:2;;;-1:-1:-1;;;5889:4:1;5882:91;5996:4;5993:1;5986:15;6027:4;6021;6014:18;5848:2;-1:-1:-1;6059:9:1;;5838:236::o;6079:437::-;6164:1;6154:12;;6211:1;6201:12;;;6222:2;;6276:4;6268:6;6264:17;6254:27;;6222:2;6329;6321:6;6318:14;6298:18;6295:38;6292:2;;;-1:-1:-1;;;6363:1:1;6356:88;6467:4;6464:1;6457:15;6495:4;6492:1;6485:15;6521:179;6608:66;6601:5;6597:78;6590:5;6587:89;6577:2;;6690:1;6687;6680:12;6577:2;6567:133;:::o

Swarm Source

ipfs://5dad40e1dc5618cf81ee8cec935f28910cdacf52a7b3be5331e1251ab929c058
Loading...
Loading
Loading...
Loading
[ Download: CSV Export  ]

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