ETH Price: $2,285.15 (-4.03%)

Token

Dual World Fusion (DWF)
 

Overview

Max Total Supply

1,400 DWF

Holders

18

Market

Volume (24H)

N/A

Min Price (24H)

N/A

Max Price (24H)

N/A

Other Info

Balance
1 DWF
0xa0b02368c71305cf8878e112ad5dc6e6bb4fb808
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:
DualWorldFusion

Compiler Version
v0.8.6+commit.11564f7e

Optimization Enabled:
Yes with 200 runs

Other Settings:
default evmVersion, MIT license

Contract Source Code (Solidity)

/**
 *Submitted for verification at Etherscan.io on 2021-11-16
*/

// File: https://github.com/0xcert/ethereum-erc721/src/contracts/ownership/ownable.sol


pragma solidity ^0.8.0;

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

}

// File: https://github.com/0xcert/ethereum-erc721/src/contracts/tokens/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 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);

}

// File: https://github.com/0xcert/ethereum-erc721/src/contracts/utils/address-utils.sol


pragma solidity ^0.8.0;

/**
 * @notice Based on:
 * https://github.com/OpenZeppelin/openzeppelin-contracts/blob/master/contracts/utils/Address.sol
 * Requires EIP-1052.
 * @dev Utility library of inline functions on addresses.
 */
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: https://github.com/0xcert/ethereum-erc721/src/contracts/utils/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: https://github.com/0xcert/ethereum-erc721/src/contracts/utils/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: https://github.com/0xcert/ethereum-erc721/src/contracts/tokens/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 ERC721TokenReceiver
{

  /**
   * @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.
   * @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.
   * @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: https://github.com/0xcert/ethereum-erc721/src/contracts/tokens/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 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
  );

  /**
   * @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)"))`.
   * @dev Transfers the ownership of an NFT from one address to another address. This function can
   * be changed to payable.
   * @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;

  /**
   * @notice This works identically to the other function with an extra data parameter, except this
   * function just sets data to ""
   * @dev Transfers the ownership of an NFT from one address to another address. This function can
   * be changed to payable.
   * @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;

  /**
   * @notice The caller is responsible to confirm that `_to` is capable of receiving NFTs or else
   * they may be permanently lost.
   * @dev Throws unless `msg.sender` is the current owner, an authorized operator, or the approved
   * address for this NFT. Throws if `_from` is not the current owner. Throws if `_to` is the zero
   * address. Throws if `_tokenId` is not a valid NFT.  This function can be changed to payable.
   * @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;

  /**
   * @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.
   * @dev Set or reaffirm the approved address for an NFT. This function can be changed to payable.
   * @param _tokenId The NFT to approve.
   */
  function approve(
    address _approved,
    uint256 _tokenId
  )
    external;

  /**
   * @notice The contract MUST allow multiple operators per owner.
   * @dev Enables or disables approval for a third party ("operator") to manage all of
   * `msg.sender`'s assets. It also emits the ApprovalForAll event.
   * @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.
   * @notice Count all NFTs assigned to an owner.
   * @param _owner Address for whom to query the balance.
   * @return Balance of _owner.
   */
  function balanceOf(
    address _owner
  )
    external
    view
    returns (uint256);

  /**
   * @notice Find the owner of an NFT.
   * @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);

  /**
   * @notice Throws if `_tokenId` is not a valid NFT.
   * @dev Get the approved address for a single 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);

  /**
   * @notice Query if an address is an authorized operator for another 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: https://github.com/0xcert/ethereum-erc721/src/contracts/tokens/nf-token.sol


pragma solidity ^0.8.0;





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

  /**
   * @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)"))`.
   * @dev Transfers the ownership of an NFT from one address to another address. This function can
   * be changed to payable.
   * @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);
  }

  /**
   * @notice This works identically to the other function with an extra data parameter, except this
   * function just sets data to "".
   * @dev Transfers the ownership of an NFT from one address to another address. This function can
   * be changed to payable.
   * @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, "");
  }

  /**
   * @notice The caller is responsible to confirm that `_to` is capable of receiving NFTs or else
   * they may be permanently lost.
   * @dev Throws unless `msg.sender` is the current owner, an authorized operator, or the approved
   * address for this NFT. Throws if `_from` is not the current owner. Throws if `_to` is the zero
   * address. Throws if `_tokenId` is not a valid NFT. This function can be changed to payable.
   * @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);
  }

  /**
   * @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.
   * @dev Set or reaffirm the approved address for an NFT. This function can be changed to payable.
   * @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);
  }

  /**
   * @notice This works even if sender doesn't own any tokens at the time.
   * @dev Enables or disables approval for a third party ("operator") to manage all of
   * `msg.sender`'s assets. It also emits the ApprovalForAll event.
   * @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);
  }

  /**
   * @notice Throws if `_tokenId` is not a valid NFT.
   * @dev Get the approved address for a single 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];
  }

  /**
   * @notice Does NO checks.
   * @dev Actually performs the transfer.
   * @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);
  }

  /**
   * @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.
   * @dev Mints a new NFT.
   * @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);
  }

  /**
   * @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.
   * @dev Burns a 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);
  }

  /**
   * @notice Use and override this function with caution. Wrong usage can have serious consequences.
   * @dev Removes a NFT from owner.
   * @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];
  }

  /**
   * @notice Use and override this function with caution. Wrong usage can have serious consequences.
   * @dev Assigns a new NFT to owner.
   * @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];
  }

}

// File: https://github.com/0xcert/ethereum-erc721/src/contracts/tokens/nf-token-metadata.sol


pragma solidity ^0.8.0;



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

  /**
   * @notice When implementing this contract don't forget to set nftName and nftSymbol.
   * @dev Contract constructor.
   */
  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 _tokenURI(_tokenId);
  }

  /**
   * @notice This is an internal function that can be overriden if you want to implement a different
   * way to generate token URI.
   * @param _tokenId Id for which we want uri.
   * @return URI of _tokenId.
   */
  function _tokenURI(
    uint256 _tokenId
  )
    internal
    virtual
    view
    returns (string memory)
  {
    return idToUri[_tokenId];
  }

  /**
   * @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.
   * @dev Burns a NFT.
   * @param _tokenId ID of the NFT to be burned.
   */
  function _burn(
    uint256 _tokenId
  )
    internal
    override
    virtual
  {
    super._burn(_tokenId);

    delete idToUri[_tokenId];
  }

  /**
   * @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.
   * @dev Set a distinct URI (RFC 3986) for a given NFT ID.
   * @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;
  }

}

// File: DualWorldFusion.sol



pragma solidity 0.8.6;



contract DualWorldFusion is NFTokenMetadata, Ownable {
    uint256 count = 0;
    uint256 teamRemaining = 100;
    uint256 publicRemaining = 1300;
    uint256 maxSupply = 1400;
    uint256 cost = 0.25 ether;

    constructor() {
        nftName = "Dual World Fusion";
        nftSymbol = "DWF";
    }

    function withdraw() external payable onlyOwner {
        (bool success, ) = payable(msg.sender).call{value: address(this).balance}("");
        require(success);
    }
    
    function totalSupply() external view returns (uint256) {
        return maxSupply;
    }
    
    function getCount() external view returns (uint256) {
        return count;
    }

    function mintNFT(address _to, string memory _tokenURI, uint256 _count) external payable returns (uint256) {
        require(count < maxSupply, "Only 1400 NFTs can be minted");
        require(count == _count - 1, "Incorrect count");
        
        if (msg.sender == owner) {
            require(teamRemaining > 0, "Only 100 NFTs can be minted for the team");
            
            teamRemaining--;
        } else {
            require(msg.value >= cost, "Not enough ETH sent; 0.25 ETH is required per mint");
            require(publicRemaining > 0, "Only 1300 NFTs can be minted for the public");
            
            publicRemaining--;
        }
        
        count++;
            
        super._mint(_to, count);
        super._setTokenUri(count, _tokenURI);

        return count;
    }
}

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":[],"name":"getCount","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"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":"string","name":"_tokenURI","type":"string"},{"internalType":"uint256","name":"_count","type":"uint256"}],"name":"mintNFT","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"payable","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"},{"inputs":[],"name":"withdraw","outputs":[],"stateMutability":"payable","type":"function"}]

608060405260006009556064600a55610514600b55610578600c556703782dace9d90000600d553480156200003357600080fd5b50600060208181527f67be87c3ff9960ca1e9cfac5cab2ff4747269cf9ed20c9b7306235ac35a491c5805460ff1990811660019081179092557ff7815fccbf112960a73756e185887fedcb9fc64ca0a16cc5923b7960ed7808008054821683179055635b5e139f60e01b9093527f9562381dfbc2d8b8b66e765249f330164b73e329e5f01670660643571d1974df805490931617909155600880546001600160a01b0319163317905560408051808201909152601180825270223ab0b6102bb7b9363210233ab9b4b7b760791b919092019081526200011691600591906200014a565b5060408051808201909152600380825262222ba360e91b602090920191825262000143916006916200014a565b506200022d565b8280546200015890620001f0565b90600052602060002090601f0160209004810192826200017c5760008555620001c7565b82601f106200019757805160ff1916838001178555620001c7565b82800160010185558215620001c7579182015b82811115620001c7578251825591602001919060010190620001aa565b50620001d5929150620001d9565b5090565b5b80821115620001d55760008155600101620001da565b600181811c908216806200020557607f821691505b602082108114156200022757634e487b7160e01b600052602260045260246000fd5b50919050565b611a5f806200023d6000396000f3fe60806040526004361061012a5760003560e01c806370a08231116100ab578063a87d942c1161006f578063a87d942c1461033f578063b88d4fde14610354578063c87b56dd14610374578063e985e9c514610394578063f2fde38b146103dd578063f3fe3bc3146103fd57600080fd5b806370a0823114610298578063860d248a146102b85780638da5cb5b146102ea57806395d89b411461030a578063a22cb4651461031f57600080fd5b806318160ddd116100f257806318160ddd1461021b57806323b872dd146102305780633ccfd60b1461025057806342842e0e146102585780636352211e1461027857600080fd5b806301ffc9a71461012f57806306fdde031461017e578063081812fc146101a057806308598df0146101d8578063095ea7b3146101f9575b600080fd5b34801561013b57600080fd5b5061016961014a366004611861565b6001600160e01b03191660009081526020819052604090205460ff1690565b60405190151581526020015b60405180910390f35b34801561018a57600080fd5b5061019361042f565b604051610175919061193e565b3480156101ac57600080fd5b506101c06101bb36600461189b565b6104c1565b6040516001600160a01b039091168152602001610175565b6101eb6101e636600461176c565b610543565b604051908152602001610175565b34801561020557600080fd5b50610219610214366004611837565b610796565b005b34801561022757600080fd5b50600c546101eb565b34801561023c57600080fd5b5061021961024b366004611659565b610938565b610219610af3565b34801561026457600080fd5b50610219610273366004611659565b610b95565b34801561028457600080fd5b506101c061029336600461189b565b610bb5565b3480156102a457600080fd5b506101eb6102b336600461160b565b610c0d565b3480156102c457600080fd5b506101936040518060400160405280600681526020016518189c18181960d11b81525081565b3480156102f657600080fd5b506008546101c0906001600160a01b031681565b34801561031657600080fd5b50610193610c71565b34801561032b57600080fd5b5061021961033a366004611730565b610c80565b34801561034b57600080fd5b506009546101eb565b34801561036057600080fd5b5061021961036f366004611695565b610cec565b34801561038057600080fd5b5061019361038f36600461189b565b610d35565b3480156103a057600080fd5b506101696103af366004611626565b6001600160a01b03918216600090815260046020908152604080832093909416825291909152205460ff1690565b3480156103e957600080fd5b506102196103f836600461160b565b610da1565b34801561040957600080fd5b506101936040518060400160405280600681526020016530313830303160d01b81525081565b60606005805461043e90611997565b80601f016020809104026020016040519081016040528092919081815260200182805461046a90611997565b80156104b75780601f1061048c576101008083540402835291602001916104b7565b820191906000526020600020905b81548152906001019060200180831161049a57829003601f168201915b5050505050905090565b6000818152600160209081526040808320548151808301909252600682526518181998181960d11b9282019290925283916001600160a01b03166105215760405162461bcd60e51b8152600401610518919061193e565b60405180910390fd5b506000838152600260205260409020546001600160a01b031691505b50919050565b6000600c54600954106105985760405162461bcd60e51b815260206004820152601c60248201527f4f6e6c792031343030204e4654732063616e206265206d696e746564000000006044820152606401610518565b6105a3600183611969565b600954146105e55760405162461bcd60e51b815260206004820152600f60248201526e125b98dbdc9c9958dd0818dbdd5b9d608a1b6044820152606401610518565b6008546001600160a01b0316331415610675576000600a541161065b5760405162461bcd60e51b815260206004820152602860248201527f4f6e6c7920313030204e4654732063616e206265206d696e74656420666f7220604482015267746865207465616d60c01b6064820152608401610518565b600a805490600061066b83611980565b919050555061075e565b600d543410156106e25760405162461bcd60e51b815260206004820152603260248201527f4e6f7420656e6f756768204554482073656e743b20302e323520455448206973604482015271081c995c5d5a5c9959081c195c881b5a5b9d60721b6064820152608401610518565b6000600b54116107485760405162461bcd60e51b815260206004820152602b60248201527f4f6e6c792031333030204e4654732063616e206265206d696e74656420666f7260448201526a20746865207075626c696360a81b6064820152608401610518565b600b805490600061075883611980565b91905055505b6009805490600061076e836119cc565b919050555061077f84600954610e8c565b61078b60095484610f6f565b506009549392505050565b60008181526001602052604090205481906001600160a01b0316338114806107e157506001600160a01b038116600090815260046020908152604080832033845290915290205460ff165b6040518060400160405280600681526020016530303330303360d01b8152509061081e5760405162461bcd60e51b8152600401610518919061193e565b50600083815260016020908152604091829020548251808401909352600683526518181998181960d11b918301919091528491906001600160a01b03166108785760405162461bcd60e51b8152600401610518919061193e565b50600084815260016020908152604091829020548251808401909352600683526506060666060760d31b918301919091526001600160a01b03908116919087168214156108d85760405162461bcd60e51b8152600401610518919061193e565b5060008581526002602052604080822080546001600160a01b0319166001600160a01b038a811691821790925591518893918516917f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92591a4505050505050565b60008181526001602052604090205481906001600160a01b03163381148061097657506000828152600260205260409020546001600160a01b031633145b806109a457506001600160a01b038116600090815260046020908152604080832033845290915290205460ff165b604051806040016040528060068152602001650c0c0ccc0c0d60d21b815250906109e15760405162461bcd60e51b8152600401610518919061193e565b50600083815260016020908152604091829020548251808401909352600683526518181998181960d11b918301919091528491906001600160a01b0316610a3b5760405162461bcd60e51b8152600401610518919061193e565b50600084815260016020908152604091829020548251808401909352600683526530303330303760d01b918301919091526001600160a01b03908116919088168214610a9a5760405162461bcd60e51b8152600401610518919061193e565b5060408051808201909152600681526530303330303160d01b60208201526001600160a01b038716610adf5760405162461bcd60e51b8152600401610518919061193e565b50610aea8686610fee565b50505050505050565b60085460408051808201909152600681526530313830303160d01b6020820152906001600160a01b03163314610b3c5760405162461bcd60e51b8152600401610518919061193e565b50604051600090339047908381818185875af1925050503d8060008114610b7f576040519150601f19603f3d011682016040523d82523d6000602084013e610b84565b606091505b5050905080610b9257600080fd5b50565b610bb083838360405180602001604052806000815250611079565b505050565b600081815260016020908152604091829020548251808401909352600683526518181998181960d11b918301919091526001600160a01b0316908161053d5760405162461bcd60e51b8152600401610518919061193e565b60408051808201909152600681526530303330303160d01b60208201526000906001600160a01b038316610c545760405162461bcd60e51b8152600401610518919061193e565b50506001600160a01b031660009081526003602052604090205490565b60606006805461043e90611997565b3360008181526004602090815260408083206001600160a01b03871680855290835292819020805460ff191686151590811790915590519081529192917f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31910160405180910390a35050565b610d2e85858585858080601f01602080910402602001604051908101604052809392919081815260200183838082843760009201919091525061107992505050565b5050505050565b600081815260016020908152604091829020548251808401909352600683526518181998181960d11b9183019190915260609183916001600160a01b0316610d905760405162461bcd60e51b8152600401610518919061193e565b50610d9a83611327565b9392505050565b60085460408051808201909152600681526530313830303160d01b6020820152906001600160a01b03163314610dea5760405162461bcd60e51b8152600401610518919061193e565b5060408051808201909152600681526518189c18181960d11b60208201526001600160a01b038216610e2f5760405162461bcd60e51b8152600401610518919061193e565b506008546040516001600160a01b038084169216907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a3600880546001600160a01b0319166001600160a01b0392909216919091179055565b60408051808201909152600681526530303330303160d01b60208201526001600160a01b038316610ed05760405162461bcd60e51b8152600401610518919061193e565b50600081815260016020908152604091829020548251808401909352600683526518181998181b60d11b918301919091526001600160a01b031615610f285760405162461bcd60e51b8152600401610518919061193e565b50610f3382826113c9565b60405181906001600160a01b038416906000907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef908290a45050565b600082815260016020908152604091829020548251808401909352600683526518181998181960d11b918301919091528391906001600160a01b0316610fc85760405162461bcd60e51b8152600401610518919061193e565b5060008381526007602090815260409091208351610fe892850190611556565b50505050565b600081815260016020908152604080832054600290925290912080546001600160a01b03191690556001600160a01b03166110298183611471565b61103383836113c9565b81836001600160a01b0316826001600160a01b03167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a4505050565b60008281526001602052604090205482906001600160a01b0316338114806110b757506000828152600260205260409020546001600160a01b031633145b806110e557506001600160a01b038116600090815260046020908152604080832033845290915290205460ff165b604051806040016040528060068152602001650c0c0ccc0c0d60d21b815250906111225760405162461bcd60e51b8152600401610518919061193e565b50600084815260016020908152604091829020548251808401909352600683526518181998181960d11b918301919091528591906001600160a01b031661117c5760405162461bcd60e51b8152600401610518919061193e565b50600085815260016020908152604091829020548251808401909352600683526530303330303760d01b918301919091526001600160a01b039081169190891682146111db5760405162461bcd60e51b8152600401610518919061193e565b5060408051808201909152600681526530303330303160d01b60208201526001600160a01b0388166112205760405162461bcd60e51b8152600401610518919061193e565b5061122b8787610fee565b61123d876001600160a01b031661151a565b1561131d57604051630a85bd0160e11b81526000906001600160a01b0389169063150b7a02906112779033908d908c908c90600401611901565b602060405180830381600087803b15801561129157600080fd5b505af11580156112a5573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906112c9919061187e565b60408051808201909152600681526530303330303560d01b60208201529091506001600160e01b03198216630a85bd0160e11b1461131a5760405162461bcd60e51b8152600401610518919061193e565b50505b5050505050505050565b600081815260076020526040902080546060919061134490611997565b80601f016020809104026020016040519081016040528092919081815260200182805461137090611997565b80156113bd5780601f10611392576101008083540402835291602001916113bd565b820191906000526020600020905b8154815290600101906020018083116113a057829003601f168201915b50505050509050919050565b600081815260016020908152604091829020548251808401909352600683526518181998181b60d11b918301919091526001600160a01b0316156114205760405162461bcd60e51b8152600401610518919061193e565b50600081815260016020818152604080842080546001600160a01b0319166001600160a01b038816908117909155845260039091528220805491929091611468908490611951565b90915550505050565b600081815260016020908152604091829020548251808401909352600683526530303330303760d01b918301919091526001600160a01b038481169116146114cc5760405162461bcd60e51b8152600401610518919061193e565b506001600160a01b03821660009081526003602052604081208054600192906114f6908490611969565b9091555050600090815260016020526040902080546001600160a01b031916905550565b6000813f7fc5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a470811580159061154e5750808214155b949350505050565b82805461156290611997565b90600052602060002090601f01602090048101928261158457600085556115ca565b82601f1061159d57805160ff19168380011785556115ca565b828001600101855582156115ca579182015b828111156115ca5782518255916020019190600101906115af565b506115d69291506115da565b5090565b5b808211156115d657600081556001016115db565b80356001600160a01b038116811461160657600080fd5b919050565b60006020828403121561161d57600080fd5b610d9a826115ef565b6000806040838503121561163957600080fd5b611642836115ef565b9150611650602084016115ef565b90509250929050565b60008060006060848603121561166e57600080fd5b611677846115ef565b9250611685602085016115ef565b9150604084013590509250925092565b6000806000806000608086880312156116ad57600080fd5b6116b6866115ef565b94506116c4602087016115ef565b935060408601359250606086013567ffffffffffffffff808211156116e857600080fd5b818801915088601f8301126116fc57600080fd5b81358181111561170b57600080fd5b89602082850101111561171d57600080fd5b9699959850939650602001949392505050565b6000806040838503121561174357600080fd5b61174c836115ef565b91506020830135801515811461176157600080fd5b809150509250929050565b60008060006060848603121561178157600080fd5b61178a846115ef565b9250602084013567ffffffffffffffff808211156117a757600080fd5b818601915086601f8301126117bb57600080fd5b8135818111156117cd576117cd6119fd565b604051601f8201601f19908116603f011681019083821181831017156117f5576117f56119fd565b8160405282815289602084870101111561180e57600080fd5b826020860160208301376000602084830101528096505050505050604084013590509250925092565b6000806040838503121561184a57600080fd5b611853836115ef565b946020939093013593505050565b60006020828403121561187357600080fd5b8135610d9a81611a13565b60006020828403121561189057600080fd5b8151610d9a81611a13565b6000602082840312156118ad57600080fd5b5035919050565b6000815180845260005b818110156118da576020818501810151868301820152016118be565b818111156118ec576000602083870101525b50601f01601f19169290920160200192915050565b6001600160a01b0385811682528416602082015260408101839052608060608201819052600090611934908301846118b4565b9695505050505050565b602081526000610d9a60208301846118b4565b60008219821115611964576119646119e7565b500190565b60008282101561197b5761197b6119e7565b500390565b60008161198f5761198f6119e7565b506000190190565b600181811c908216806119ab57607f821691505b6020821081141561053d57634e487b7160e01b600052602260045260246000fd5b60006000198214156119e0576119e06119e7565b5060010190565b634e487b7160e01b600052601160045260246000fd5b634e487b7160e01b600052604160045260246000fd5b6001600160e01b031981168114610b9257600080fdfea2646970667358221220e3775b0c4af457c11fa5f362f049bc0a234dcd8f0cfc821866307d43f097559064736f6c63430008060033

Deployed Bytecode

0x60806040526004361061012a5760003560e01c806370a08231116100ab578063a87d942c1161006f578063a87d942c1461033f578063b88d4fde14610354578063c87b56dd14610374578063e985e9c514610394578063f2fde38b146103dd578063f3fe3bc3146103fd57600080fd5b806370a0823114610298578063860d248a146102b85780638da5cb5b146102ea57806395d89b411461030a578063a22cb4651461031f57600080fd5b806318160ddd116100f257806318160ddd1461021b57806323b872dd146102305780633ccfd60b1461025057806342842e0e146102585780636352211e1461027857600080fd5b806301ffc9a71461012f57806306fdde031461017e578063081812fc146101a057806308598df0146101d8578063095ea7b3146101f9575b600080fd5b34801561013b57600080fd5b5061016961014a366004611861565b6001600160e01b03191660009081526020819052604090205460ff1690565b60405190151581526020015b60405180910390f35b34801561018a57600080fd5b5061019361042f565b604051610175919061193e565b3480156101ac57600080fd5b506101c06101bb36600461189b565b6104c1565b6040516001600160a01b039091168152602001610175565b6101eb6101e636600461176c565b610543565b604051908152602001610175565b34801561020557600080fd5b50610219610214366004611837565b610796565b005b34801561022757600080fd5b50600c546101eb565b34801561023c57600080fd5b5061021961024b366004611659565b610938565b610219610af3565b34801561026457600080fd5b50610219610273366004611659565b610b95565b34801561028457600080fd5b506101c061029336600461189b565b610bb5565b3480156102a457600080fd5b506101eb6102b336600461160b565b610c0d565b3480156102c457600080fd5b506101936040518060400160405280600681526020016518189c18181960d11b81525081565b3480156102f657600080fd5b506008546101c0906001600160a01b031681565b34801561031657600080fd5b50610193610c71565b34801561032b57600080fd5b5061021961033a366004611730565b610c80565b34801561034b57600080fd5b506009546101eb565b34801561036057600080fd5b5061021961036f366004611695565b610cec565b34801561038057600080fd5b5061019361038f36600461189b565b610d35565b3480156103a057600080fd5b506101696103af366004611626565b6001600160a01b03918216600090815260046020908152604080832093909416825291909152205460ff1690565b3480156103e957600080fd5b506102196103f836600461160b565b610da1565b34801561040957600080fd5b506101936040518060400160405280600681526020016530313830303160d01b81525081565b60606005805461043e90611997565b80601f016020809104026020016040519081016040528092919081815260200182805461046a90611997565b80156104b75780601f1061048c576101008083540402835291602001916104b7565b820191906000526020600020905b81548152906001019060200180831161049a57829003601f168201915b5050505050905090565b6000818152600160209081526040808320548151808301909252600682526518181998181960d11b9282019290925283916001600160a01b03166105215760405162461bcd60e51b8152600401610518919061193e565b60405180910390fd5b506000838152600260205260409020546001600160a01b031691505b50919050565b6000600c54600954106105985760405162461bcd60e51b815260206004820152601c60248201527f4f6e6c792031343030204e4654732063616e206265206d696e746564000000006044820152606401610518565b6105a3600183611969565b600954146105e55760405162461bcd60e51b815260206004820152600f60248201526e125b98dbdc9c9958dd0818dbdd5b9d608a1b6044820152606401610518565b6008546001600160a01b0316331415610675576000600a541161065b5760405162461bcd60e51b815260206004820152602860248201527f4f6e6c7920313030204e4654732063616e206265206d696e74656420666f7220604482015267746865207465616d60c01b6064820152608401610518565b600a805490600061066b83611980565b919050555061075e565b600d543410156106e25760405162461bcd60e51b815260206004820152603260248201527f4e6f7420656e6f756768204554482073656e743b20302e323520455448206973604482015271081c995c5d5a5c9959081c195c881b5a5b9d60721b6064820152608401610518565b6000600b54116107485760405162461bcd60e51b815260206004820152602b60248201527f4f6e6c792031333030204e4654732063616e206265206d696e74656420666f7260448201526a20746865207075626c696360a81b6064820152608401610518565b600b805490600061075883611980565b91905055505b6009805490600061076e836119cc565b919050555061077f84600954610e8c565b61078b60095484610f6f565b506009549392505050565b60008181526001602052604090205481906001600160a01b0316338114806107e157506001600160a01b038116600090815260046020908152604080832033845290915290205460ff165b6040518060400160405280600681526020016530303330303360d01b8152509061081e5760405162461bcd60e51b8152600401610518919061193e565b50600083815260016020908152604091829020548251808401909352600683526518181998181960d11b918301919091528491906001600160a01b03166108785760405162461bcd60e51b8152600401610518919061193e565b50600084815260016020908152604091829020548251808401909352600683526506060666060760d31b918301919091526001600160a01b03908116919087168214156108d85760405162461bcd60e51b8152600401610518919061193e565b5060008581526002602052604080822080546001600160a01b0319166001600160a01b038a811691821790925591518893918516917f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92591a4505050505050565b60008181526001602052604090205481906001600160a01b03163381148061097657506000828152600260205260409020546001600160a01b031633145b806109a457506001600160a01b038116600090815260046020908152604080832033845290915290205460ff165b604051806040016040528060068152602001650c0c0ccc0c0d60d21b815250906109e15760405162461bcd60e51b8152600401610518919061193e565b50600083815260016020908152604091829020548251808401909352600683526518181998181960d11b918301919091528491906001600160a01b0316610a3b5760405162461bcd60e51b8152600401610518919061193e565b50600084815260016020908152604091829020548251808401909352600683526530303330303760d01b918301919091526001600160a01b03908116919088168214610a9a5760405162461bcd60e51b8152600401610518919061193e565b5060408051808201909152600681526530303330303160d01b60208201526001600160a01b038716610adf5760405162461bcd60e51b8152600401610518919061193e565b50610aea8686610fee565b50505050505050565b60085460408051808201909152600681526530313830303160d01b6020820152906001600160a01b03163314610b3c5760405162461bcd60e51b8152600401610518919061193e565b50604051600090339047908381818185875af1925050503d8060008114610b7f576040519150601f19603f3d011682016040523d82523d6000602084013e610b84565b606091505b5050905080610b9257600080fd5b50565b610bb083838360405180602001604052806000815250611079565b505050565b600081815260016020908152604091829020548251808401909352600683526518181998181960d11b918301919091526001600160a01b0316908161053d5760405162461bcd60e51b8152600401610518919061193e565b60408051808201909152600681526530303330303160d01b60208201526000906001600160a01b038316610c545760405162461bcd60e51b8152600401610518919061193e565b50506001600160a01b031660009081526003602052604090205490565b60606006805461043e90611997565b3360008181526004602090815260408083206001600160a01b03871680855290835292819020805460ff191686151590811790915590519081529192917f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31910160405180910390a35050565b610d2e85858585858080601f01602080910402602001604051908101604052809392919081815260200183838082843760009201919091525061107992505050565b5050505050565b600081815260016020908152604091829020548251808401909352600683526518181998181960d11b9183019190915260609183916001600160a01b0316610d905760405162461bcd60e51b8152600401610518919061193e565b50610d9a83611327565b9392505050565b60085460408051808201909152600681526530313830303160d01b6020820152906001600160a01b03163314610dea5760405162461bcd60e51b8152600401610518919061193e565b5060408051808201909152600681526518189c18181960d11b60208201526001600160a01b038216610e2f5760405162461bcd60e51b8152600401610518919061193e565b506008546040516001600160a01b038084169216907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a3600880546001600160a01b0319166001600160a01b0392909216919091179055565b60408051808201909152600681526530303330303160d01b60208201526001600160a01b038316610ed05760405162461bcd60e51b8152600401610518919061193e565b50600081815260016020908152604091829020548251808401909352600683526518181998181b60d11b918301919091526001600160a01b031615610f285760405162461bcd60e51b8152600401610518919061193e565b50610f3382826113c9565b60405181906001600160a01b038416906000907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef908290a45050565b600082815260016020908152604091829020548251808401909352600683526518181998181960d11b918301919091528391906001600160a01b0316610fc85760405162461bcd60e51b8152600401610518919061193e565b5060008381526007602090815260409091208351610fe892850190611556565b50505050565b600081815260016020908152604080832054600290925290912080546001600160a01b03191690556001600160a01b03166110298183611471565b61103383836113c9565b81836001600160a01b0316826001600160a01b03167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a4505050565b60008281526001602052604090205482906001600160a01b0316338114806110b757506000828152600260205260409020546001600160a01b031633145b806110e557506001600160a01b038116600090815260046020908152604080832033845290915290205460ff165b604051806040016040528060068152602001650c0c0ccc0c0d60d21b815250906111225760405162461bcd60e51b8152600401610518919061193e565b50600084815260016020908152604091829020548251808401909352600683526518181998181960d11b918301919091528591906001600160a01b031661117c5760405162461bcd60e51b8152600401610518919061193e565b50600085815260016020908152604091829020548251808401909352600683526530303330303760d01b918301919091526001600160a01b039081169190891682146111db5760405162461bcd60e51b8152600401610518919061193e565b5060408051808201909152600681526530303330303160d01b60208201526001600160a01b0388166112205760405162461bcd60e51b8152600401610518919061193e565b5061122b8787610fee565b61123d876001600160a01b031661151a565b1561131d57604051630a85bd0160e11b81526000906001600160a01b0389169063150b7a02906112779033908d908c908c90600401611901565b602060405180830381600087803b15801561129157600080fd5b505af11580156112a5573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906112c9919061187e565b60408051808201909152600681526530303330303560d01b60208201529091506001600160e01b03198216630a85bd0160e11b1461131a5760405162461bcd60e51b8152600401610518919061193e565b50505b5050505050505050565b600081815260076020526040902080546060919061134490611997565b80601f016020809104026020016040519081016040528092919081815260200182805461137090611997565b80156113bd5780601f10611392576101008083540402835291602001916113bd565b820191906000526020600020905b8154815290600101906020018083116113a057829003601f168201915b50505050509050919050565b600081815260016020908152604091829020548251808401909352600683526518181998181b60d11b918301919091526001600160a01b0316156114205760405162461bcd60e51b8152600401610518919061193e565b50600081815260016020818152604080842080546001600160a01b0319166001600160a01b038816908117909155845260039091528220805491929091611468908490611951565b90915550505050565b600081815260016020908152604091829020548251808401909352600683526530303330303760d01b918301919091526001600160a01b038481169116146114cc5760405162461bcd60e51b8152600401610518919061193e565b506001600160a01b03821660009081526003602052604081208054600192906114f6908490611969565b9091555050600090815260016020526040902080546001600160a01b031916905550565b6000813f7fc5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a470811580159061154e5750808214155b949350505050565b82805461156290611997565b90600052602060002090601f01602090048101928261158457600085556115ca565b82601f1061159d57805160ff19168380011785556115ca565b828001600101855582156115ca579182015b828111156115ca5782518255916020019190600101906115af565b506115d69291506115da565b5090565b5b808211156115d657600081556001016115db565b80356001600160a01b038116811461160657600080fd5b919050565b60006020828403121561161d57600080fd5b610d9a826115ef565b6000806040838503121561163957600080fd5b611642836115ef565b9150611650602084016115ef565b90509250929050565b60008060006060848603121561166e57600080fd5b611677846115ef565b9250611685602085016115ef565b9150604084013590509250925092565b6000806000806000608086880312156116ad57600080fd5b6116b6866115ef565b94506116c4602087016115ef565b935060408601359250606086013567ffffffffffffffff808211156116e857600080fd5b818801915088601f8301126116fc57600080fd5b81358181111561170b57600080fd5b89602082850101111561171d57600080fd5b9699959850939650602001949392505050565b6000806040838503121561174357600080fd5b61174c836115ef565b91506020830135801515811461176157600080fd5b809150509250929050565b60008060006060848603121561178157600080fd5b61178a846115ef565b9250602084013567ffffffffffffffff808211156117a757600080fd5b818601915086601f8301126117bb57600080fd5b8135818111156117cd576117cd6119fd565b604051601f8201601f19908116603f011681019083821181831017156117f5576117f56119fd565b8160405282815289602084870101111561180e57600080fd5b826020860160208301376000602084830101528096505050505050604084013590509250925092565b6000806040838503121561184a57600080fd5b611853836115ef565b946020939093013593505050565b60006020828403121561187357600080fd5b8135610d9a81611a13565b60006020828403121561189057600080fd5b8151610d9a81611a13565b6000602082840312156118ad57600080fd5b5035919050565b6000815180845260005b818110156118da576020818501810151868301820152016118be565b818111156118ec576000602083870101525b50601f01601f19169290920160200192915050565b6001600160a01b0385811682528416602082015260408101839052608060608201819052600090611934908301846118b4565b9695505050505050565b602081526000610d9a60208301846118b4565b60008219821115611964576119646119e7565b500190565b60008282101561197b5761197b6119e7565b500390565b60008161198f5761198f6119e7565b506000190190565b600181811c908216806119ab57607f821691505b6020821081141561053d57634e487b7160e01b600052602260045260246000fd5b60006000198214156119e0576119e06119e7565b5060010190565b634e487b7160e01b600052601160045260246000fd5b634e487b7160e01b600052604160045260246000fd5b6001600160e01b031981168114610b9257600080fdfea2646970667358221220e3775b0c4af457c11fa5f362f049bc0a234dcd8f0cfc821866307d43f097559064736f6c63430008060033

Deployed Bytecode Sourcemap

29870:1520:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;5629:172;;;;;;;;;;-1:-1:-1;5629:172:0;;;;;:::i;:::-;-1:-1:-1;;;;;;5762:33:0;5739:4;5762:33;;;;;;;;;;;;;;5629:172;;;;5715:14:1;;5708:22;5690:41;;5678:2;5663:18;5629:172:0;;;;;;;;27599:120;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;21578:183::-;;;;;;;;;;-1:-1:-1;21578:183:0;;;;;:::i;:::-;;:::i;:::-;;;-1:-1:-1;;;;;5013:32:1;;;4995:51;;4983:2;4968:18;21578:183:0;4950:102:1;30563:824:0;;;;;;:::i;:::-;;:::i;:::-;;;8053:25:1;;;8041:2;8026:18;30563:824:0;8008:76:1;19363:352:0;;;;;;;;;;-1:-1:-1;19363:352:0;;;;;:::i;:::-;;:::i;:::-;;30370:90;;;;;;;;;;-1:-1:-1;30443:9:0;;30370:90;;18589:353;;;;;;;;;;-1:-1:-1;18589:353:0;;;;;:::i;:::-;;:::i;30188:170::-;;;:::i;17834:179::-;;;;;;;;;;-1:-1:-1;17834:179:0;;;;;:::i;:::-;;:::i;21126:208::-;;;;;;;;;;-1:-1:-1;21126:208:0;;;;;:::i;:::-;;:::i;20652:204::-;;;;;;;;;;-1:-1:-1;20652:204:0;;;;;:::i;:::-;;:::i;547:65::-;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;547:65:0;;;;;667:20;;;;;;;;;;-1:-1:-1;667:20:0;;;;-1:-1:-1;;;;;667:20:0;;;27835:128;;;;;;;;;;;;;:::i;20126:232::-;;;;;;;;;;-1:-1:-1;20126:232:0;;;;;:::i;:::-;;:::i;30472:83::-;;;;;;;;;;-1:-1:-1;30542:5:0;;30472:83;;17214:209;;;;;;;;;;-1:-1:-1;17214:209:0;;;;;:::i;:::-;;:::i;28116:183::-;;;;;;;;;;-1:-1:-1;28116:183:0;;;;;:::i;:::-;;:::i;22030:192::-;;;;;;;;;;-1:-1:-1;22030:192:0;;;;;:::i;:::-;-1:-1:-1;;;;;22181:24:0;;;22158:4;22181:24;;;:16;:24;;;;;;;;:35;;;;;;;;;;;;;;;22030:192;1492:238;;;;;;;;;;-1:-1:-1;1492:238:0;;;;;:::i;:::-;;:::i;491:51::-;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;491:51:0;;;;;27599:120;27667:19;27706:7;27698:15;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;27599:120;:::o;21578:183::-;21707:7;16146:19;;;:9;:19;;;;;;;;;16181:13;;;;;;;;;;;-1:-1:-1;;;16181:13:0;;;;;;;21683:8;;-1:-1:-1;;;;;16146:19:0;16138:57;;;;-1:-1:-1;;;16138:57:0;;;;;;;;:::i;:::-;;;;;;;;;-1:-1:-1;21733:22:0::1;::::0;;;:12:::1;:22;::::0;;;;;-1:-1:-1;;;;;21733:22:0::1;::::0;-1:-1:-1;16202:1:0::1;21578:183:::0;;;;:::o;30563:824::-;30660:7;30696:9;;30688:5;;:17;30680:58;;;;-1:-1:-1;;;30680:58:0;;7752:2:1;30680:58:0;;;7734:21:1;7791:2;7771:18;;;7764:30;7830;7810:18;;;7803:58;7878:18;;30680:58:0;7724:178:1;30680:58:0;30766:10;30775:1;30766:6;:10;:::i;:::-;30757:5;;:19;30749:47;;;;-1:-1:-1;;;30749:47:0;;6989:2:1;30749:47:0;;;6971:21:1;7028:2;7008:18;;;7001:30;-1:-1:-1;;;7047:18:1;;;7040:45;7102:18;;30749:47:0;6961:165:1;30749:47:0;30835:5;;-1:-1:-1;;;;;30835:5:0;30821:10;:19;30817:415;;;30881:1;30865:13;;:17;30857:70;;;;-1:-1:-1;;;30857:70:0;;6168:2:1;30857:70:0;;;6150:21:1;6207:2;6187:18;;;6180:30;6246:34;6226:18;;;6219:62;-1:-1:-1;;;6297:18:1;;;6290:38;6345:19;;30857:70:0;6140:230:1;30857:70:0;30956:13;:15;;;:13;:15;;;:::i;:::-;;;;;;30817:415;;;31025:4;;31012:9;:17;;31004:80;;;;-1:-1:-1;;;31004:80:0;;7333:2:1;31004:80:0;;;7315:21:1;7372:2;7352:18;;;7345:30;7411:34;7391:18;;;7384:62;-1:-1:-1;;;7462:18:1;;;7455:48;7520:19;;31004:80:0;7305:240:1;31004:80:0;31125:1;31107:15;;:19;31099:75;;;;-1:-1:-1;;;31099:75:0;;6577:2:1;31099:75:0;;;6559:21:1;6616:2;6596:18;;;6589:30;6655:34;6635:18;;;6628:62;-1:-1:-1;;;6706:18:1;;;6699:41;6757:19;;31099:75:0;6549:233:1;31099:75:0;31203:15;:17;;;:15;:17;;;:::i;:::-;;;;;;30817:415;31252:5;:7;;;:5;:7;;;:::i;:::-;;;;;;31284:23;31296:3;31301:5;;31284:11;:23::i;:::-;31318:36;31337:5;;31344:9;31318:18;:36::i;:::-;-1:-1:-1;31374:5:0;;30563:824;;;;;:::o;19363:352::-;15330:18;15351:19;;;:9;:19;;;;;;19476:8;;-1:-1:-1;;;;;15351:19:0;15407:10;15393:24;;;:68;;-1:-1:-1;;;;;;15421:28:0;;;;;;:16;:28;;;;;;;;15450:10;15421:40;;;;;;;;;;15393:68;15470:21;;;;;;;;;;;;;-1:-1:-1;;;15470:21:0;;;15377:121;;;;;-1:-1:-1;;;15377:121:0;;;;;;;;:::i;:::-;-1:-1:-1;16177:1:0::1;16146:19:::0;;;:9:::1;:19;::::0;;;;;;;;;16181:13;;;;::::1;::::0;;;::::1;::::0;;-1:-1:-1;;;16181:13:0;;::::1;::::0;;;;19504:8;;16181:13;-1:-1:-1;;;;;16146:19:0::1;16138:57;;;;-1:-1:-1::0;;;16138:57:0::1;;;;;;;;:::i;:::-;-1:-1:-1::0;19524:18:0::2;19545:19:::0;;;:9:::2;:19;::::0;;;;;;;;;19604:8;;;;::::2;::::0;;;::::2;::::0;;-1:-1:-1;;;19604:8:0;;::::2;::::0;;;;-1:-1:-1;;;;;19545:19:0;;::::2;::::0;19604:8;19579:23;::::2;::::0;::::2;;19571:42;;;;-1:-1:-1::0;;;19571:42:0::2;;;;;;;;:::i;:::-;-1:-1:-1::0;19622:22:0::2;::::0;;;:12:::2;:22;::::0;;;;;:34;;-1:-1:-1;;;;;;19622:34:0::2;-1:-1:-1::0;;;;;19622:34:0;;::::2;::::0;;::::2;::::0;;;19668:41;;19622:22;;19668:41;;::::2;::::0;::::2;::::0;::::2;19517:198;15505:1:::1;15323:189:::0;19363:352;;;:::o;18589:353::-;15710:18;15731:19;;;:9;:19;;;;;;18722:8;;-1:-1:-1;;;;;15731:19:0;15787:10;15773:24;;;:71;;-1:-1:-1;15808:22:0;;;;:12;:22;;;;;;-1:-1:-1;;;;;15808:22:0;15834:10;15808:36;15773:71;:122;;;-1:-1:-1;;;;;;15855:28:0;;;;;;:16;:28;;;;;;;;15884:10;15855:40;;;;;;;;;;15773:122;15904:30;;;;;;;;;;;;;-1:-1:-1;;;15904:30:0;;;15757:184;;;;;-1:-1:-1;;;15757:184:0;;;;;;;;:::i;:::-;-1:-1:-1;16177:1:0::1;16146:19:::0;;;:9:::1;:19;::::0;;;;;;;;;16181:13;;;;::::1;::::0;;;::::1;::::0;;-1:-1:-1;;;16181:13:0;;::::1;::::0;;;;18750:8;;16181:13;-1:-1:-1;;;;;16146:19:0::1;16138:57;;;;-1:-1:-1::0;;;16138:57:0::1;;;;;;;;:::i;:::-;-1:-1:-1::0;18770:18:0::2;18791:19:::0;;;:9:::2;:19;::::0;;;;;;;;;18846:9;;;;::::2;::::0;;;::::2;::::0;;-1:-1:-1;;;18846:9:0;;::::2;::::0;;;;-1:-1:-1;;;;;18791:19:0;;::::2;::::0;18846:9;18825:19;::::2;::::0;::::2;18817:39;;;;-1:-1:-1::0;;;18817:39:0::2;;;;;;;;:::i;:::-;-1:-1:-1::0;18890:12:0::2;::::0;;;;::::2;::::0;;;::::2;::::0;;-1:-1:-1;;;18890:12:0::2;::::0;::::2;::::0;-1:-1:-1;;;;;18871:17:0;::::2;18863:40;;;;-1:-1:-1::0;;;18863:40:0::2;;;;;;;;:::i;:::-;;18912:24;18922:3;18927:8;18912:9;:24::i;:::-;18763:179;15948:1:::1;15703:252:::0;18589:353;;;;:::o;30188:170::-;1285:5;;1292:17;;;;;;;;;;;;-1:-1:-1;;;1292:17:0;;;;;-1:-1:-1;;;;;1285:5:0;1271:10;:19;1263:47;;;;-1:-1:-1;;;1263:47:0;;;;;;;;:::i;:::-;-1:-1:-1;30265:58:0::1;::::0;30247:12:::1;::::0;30273:10:::1;::::0;30297:21:::1;::::0;30247:12;30265:58;30247:12;30265:58;30297:21;30273:10;30265:58:::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;30246:77;;;30342:7;30334:16;;;::::0;::::1;;30235:123;30188:170::o:0;17834:179::-;17964:43;17982:5;17989:3;17994:8;17964:43;;;;;;;;;;;;:17;:43::i;:::-;17834:179;;;:::o;21126:208::-;21223:14;21258:19;;;:9;:19;;;;;;;;;;21314:13;;;;;;;;;;;-1:-1:-1;;;21314:13:0;;;;;;;-1:-1:-1;;;;;21258:19:0;;21292:20;21284:44;;;;-1:-1:-1;;;21284:44:0;;;;;;;;:::i;20652:204::-;20798:12;;;;;;;;;;;;-1:-1:-1;;;20798:12:0;;;;20749:7;;-1:-1:-1;;;;;20776:20:0;;20768:43;;;;-1:-1:-1;;;20768:43:0;;;;;;;;:::i;:::-;-1:-1:-1;;;;;;;25504:27:0;25478:7;25504:27;;;:19;:27;;;;;;;20652:204::o;27835:128::-;27905:21;27948:9;27938:19;;;;;:::i;20126:232::-;20258:10;20241:28;;;;:16;:28;;;;;;;;-1:-1:-1;;;;;20241:39:0;;;;;;;;;;;;:51;;-1:-1:-1;;20241:51:0;;;;;;;;;;20304:48;;5690:41:1;;;20241:39:0;;20258:10;20304:48;;5663:18:1;20304:48:0;;;;;;;20126:232;;:::o;17214:209::-;17371:46;17389:5;17396:3;17401:8;17411:5;;17371:46;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;17371:17:0;;-1:-1:-1;;;17371:46:0:i;:::-;17214:209;;;;;:::o;28116:183::-;16177:1;16146:19;;;:9;:19;;;;;;;;;;16181:13;;;;;;;;;;;-1:-1:-1;;;16181:13:0;;;;;;;28242;;28218:8;;-1:-1:-1;;;;;16146:19:0;16138:57;;;;-1:-1:-1;;;16138:57:0;;;;;;;;:::i;:::-;;28274:19:::1;28284:8;28274:9;:19::i;:::-;28267:26:::0;28116:183;-1:-1:-1;;;28116:183:0:o;1492:238::-;1285:5;;1292:17;;;;;;;;;;;;-1:-1:-1;;;1292:17:0;;;;;-1:-1:-1;;;;;1285:5:0;1271:10;:19;1263:47;;;;-1:-1:-1;;;1263:47:0;;;;;;;;:::i;:::-;-1:-1:-1;1618:31:0::1;::::0;;;;::::1;::::0;;;::::1;::::0;;-1:-1:-1;;;1618:31:0::1;::::0;::::1;::::0;-1:-1:-1;;;;;1593:23:0;::::1;1585:65;;;;-1:-1:-1::0;;;1585:65:0::1;;;;;;;;:::i;:::-;-1:-1:-1::0;1683:5:0::1;::::0;1662:38:::1;::::0;-1:-1:-1;;;;;1662:38:0;;::::1;::::0;1683:5:::1;::::0;1662:38:::1;::::0;1683:5:::1;::::0;1662:38:::1;1707:5;:17:::0;;-1:-1:-1;;;;;;1707:17:0::1;-1:-1:-1::0;;;;;1707:17:0;;;::::1;::::0;;;::::1;::::0;;1492:238::o;23079:297::-;23204:12;;;;;;;;;;;;-1:-1:-1;;;23204:12:0;;;;-1:-1:-1;;;;;23185:17:0;;23177:40;;;;-1:-1:-1;;;23177:40:0;;;;;;;;:::i;:::-;-1:-1:-1;23263:1:0;23232:19;;;:9;:19;;;;;;;;;;23267:18;;;;;;;;;;;-1:-1:-1;;;23267:18:0;;;;;;;-1:-1:-1;;;;;23232:19:0;:33;23224:62;;;;-1:-1:-1;;;23224:62:0;;;;;;;;:::i;:::-;;23295:26;23307:3;23312:8;23295:11;:26::i;:::-;23335:35;;23361:8;;-1:-1:-1;;;;;23335:35:0;;;23352:1;;23335:35;;23352:1;;23335:35;23079:297;;:::o;29638:157::-;16177:1;16146:19;;;:9;:19;;;;;;;;;;16181:13;;;;;;;;;;;-1:-1:-1;;;16181:13:0;;;;;;;29745:8;;16181:13;-1:-1:-1;;;;;16146:19:0;16138:57;;;;-1:-1:-1;;;16138:57:0;;;;;;;;:::i;:::-;-1:-1:-1;29765:17:0::1;::::0;;;:7:::1;:17;::::0;;;;;;;:24;;::::1;::::0;;::::1;::::0;::::1;:::i;:::-;;29638:157:::0;;;:::o;22413:275::-;22502:12;22517:19;;;:9;:19;;;;;;;;;26620:12;:22;;;;;;26613:29;;-1:-1:-1;;;;;;26613:29:0;;;-1:-1:-1;;;;;22517:19:0;22576:30;22591:4;22597:8;22576:14;:30::i;:::-;22613:26;22625:3;22630:8;22613:11;:26::i;:::-;22673:8;22668:3;-1:-1:-1;;;;;22653:29:0;22662:4;-1:-1:-1;;;;;22653:29:0;;;;;;;;;;;22495:193;22413:275;;:::o;25815:590::-;15710:18;15731:19;;;:9;:19;;;;;;25963:8;;-1:-1:-1;;;;;15731:19:0;15787:10;15773:24;;;:71;;-1:-1:-1;15808:22:0;;;;:12;:22;;;;;;-1:-1:-1;;;;;15808:22:0;15834:10;15808:36;15773:71;:122;;;-1:-1:-1;;;;;;15855:28:0;;;;;;:16;:28;;;;;;;;15884:10;15855:40;;;;;;;;;;15773:122;15904:30;;;;;;;;;;;;;-1:-1:-1;;;15904:30:0;;;15757:184;;;;;-1:-1:-1;;;15757:184:0;;;;;;;;:::i;:::-;-1:-1:-1;16177:1:0::1;16146:19:::0;;;:9:::1;:19;::::0;;;;;;;;;16181:13;;;;::::1;::::0;;;::::1;::::0;;-1:-1:-1;;;16181:13:0;;::::1;::::0;;;;25991:8;;16181:13;-1:-1:-1;;;;;16146:19:0::1;16138:57;;;;-1:-1:-1::0;;;16138:57:0::1;;;;;;;;:::i;:::-;-1:-1:-1::0;26011:18:0::2;26032:19:::0;;;:9:::2;:19;::::0;;;;;;;;;26087:9;;;;::::2;::::0;;;::::2;::::0;;-1:-1:-1;;;26087:9:0;;::::2;::::0;;;;-1:-1:-1;;;;;26032:19:0;;::::2;::::0;26087:9;26066:19;::::2;::::0;::::2;26058:39;;;;-1:-1:-1::0;;;26058:39:0::2;;;;;;;;:::i;:::-;-1:-1:-1::0;26131:12:0::2;::::0;;;;::::2;::::0;;;::::2;::::0;;-1:-1:-1;;;26131:12:0::2;::::0;::::2;::::0;-1:-1:-1;;;;;26112:17:0;::::2;26104:40;;;;-1:-1:-1::0;;;26104:40:0::2;;;;;;;;:::i;:::-;;26153:24;26163:3;26168:8;26153:9;:24::i;:::-;26190:16;:3;-1:-1:-1::0;;;;;26190:14:0::2;;:16::i;:::-;26186:214;;;26238:77;::::0;-1:-1:-1;;;26238:77:0;;26222:13:::2;::::0;-1:-1:-1;;;;;26238:41:0;::::2;::::0;::::2;::::0;:77:::2;::::0;26280:10:::2;::::0;26292:5;;26299:8;;26309:5;;26238:77:::2;;;:::i;:::-;;;;;;;;;;;;;;;;;;::::0;::::2;;;;;;;;;;;;::::0;::::2;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;26368:23;::::0;;;;::::2;::::0;;;::::2;::::0;;-1:-1:-1;;;26368:23:0::2;::::0;::::2;::::0;26222:93;;-1:-1:-1;;;;;;;26332:34:0;::::2;-1:-1:-1::0;;;26332:34:0::2;26324:68;;;;-1:-1:-1::0;;;26324:68:0::2;;;;;;;;:::i;:::-;;26213:187;26186:214;26004:401;15948:1:::1;15703:252:::0;25815:590;;;;;:::o;28533:153::-;28663:17;;;;:7;:17;;;;;28656:24;;28631:13;;28663:17;28656:24;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;28533:153;;;:::o;24837:242::-;24980:1;24949:19;;;:9;:19;;;;;;;;;;24984:18;;;;;;;;;;;-1:-1:-1;;;24984:18:0;;;;;;;-1:-1:-1;;;;;24949:19:0;:33;24941:62;;;;-1:-1:-1;;;24941:62:0;;;;;;;;:::i;:::-;-1:-1:-1;25012:19:0;;;;:9;:19;;;;;;;;:25;;-1:-1:-1;;;;;;25012:25:0;-1:-1:-1;;;;;25012:25:0;;;;;;;;25044:24;;:19;:24;;;;;:29;;25012:9;;25044:24;;:29;;25012:9;;25044:29;:::i;:::-;;;;-1:-1:-1;;;;24837:242:0:o;24336:234::-;24453:19;;;;:9;:19;;;;;;;;;;24483:9;;;;;;;;;;;-1:-1:-1;;;24483:9:0;;;;;;;-1:-1:-1;;;;;24453:28:0;;;:19;;:28;24445:48;;;;-1:-1:-1;;;24445:48:0;;;;;;;;:::i;:::-;-1:-1:-1;;;;;;24500:26:0;;;;;;:19;:26;;;;;:31;;24530:1;;24500:26;:31;;24530:1;;24500:31;:::i;:::-;;;;-1:-1:-1;;24545:19:0;;;;:9;:19;;;;;24538:26;;-1:-1:-1;;;;;;24538:26:0;;;-1:-1:-1;24336:234:0:o;3433:780::-;3516:17;4098:18;;4002:66;4164:15;;;;;:42;;;4195:11;4183:8;:23;;4164:42;4148:59;3433:780;-1:-1:-1;;;;3433:780:0:o;-1:-1:-1:-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;:::o;:::-;;;;;;;;;;;;;;;14:173:1;82:20;;-1:-1:-1;;;;;131:31:1;;121:42;;111:2;;177:1;174;167:12;111:2;63:124;;;:::o;192:186::-;251:6;304:2;292:9;283:7;279:23;275:32;272:2;;;320:1;317;310:12;272:2;343:29;362:9;343:29;:::i;383:260::-;451:6;459;512:2;500:9;491:7;487:23;483:32;480:2;;;528:1;525;518:12;480:2;551:29;570:9;551:29;:::i;:::-;541:39;;599:38;633:2;622:9;618:18;599:38;:::i;:::-;589:48;;470:173;;;;;:::o;648:328::-;725:6;733;741;794:2;782:9;773:7;769:23;765:32;762:2;;;810:1;807;800:12;762:2;833:29;852:9;833:29;:::i;:::-;823:39;;881:38;915:2;904:9;900:18;881:38;:::i;:::-;871:48;;966:2;955:9;951:18;938:32;928:42;;752:224;;;;;:::o;981:808::-;1078:6;1086;1094;1102;1110;1163:3;1151:9;1142:7;1138:23;1134:33;1131:2;;;1180:1;1177;1170:12;1131:2;1203:29;1222:9;1203:29;:::i;:::-;1193:39;;1251:38;1285:2;1274:9;1270:18;1251:38;:::i;:::-;1241:48;;1336:2;1325:9;1321:18;1308:32;1298:42;;1391:2;1380:9;1376:18;1363:32;1414:18;1455:2;1447:6;1444:14;1441:2;;;1471:1;1468;1461:12;1441:2;1509:6;1498:9;1494:22;1484:32;;1554:7;1547:4;1543:2;1539:13;1535:27;1525:2;;1576:1;1573;1566:12;1525:2;1616;1603:16;1642:2;1634:6;1631:14;1628:2;;;1658:1;1655;1648:12;1628:2;1703:7;1698:2;1689:6;1685:2;1681:15;1677:24;1674:37;1671:2;;;1724:1;1721;1714:12;1671:2;1121:668;;;;-1:-1:-1;1121:668:1;;-1:-1:-1;1755:2:1;1747:11;;1777:6;1121:668;-1:-1:-1;;;1121:668:1:o;1794:347::-;1859:6;1867;1920:2;1908:9;1899:7;1895:23;1891:32;1888:2;;;1936:1;1933;1926:12;1888:2;1959:29;1978:9;1959:29;:::i;:::-;1949:39;;2038:2;2027:9;2023:18;2010:32;2085:5;2078:13;2071:21;2064:5;2061:32;2051:2;;2107:1;2104;2097:12;2051:2;2130:5;2120:15;;;1878:263;;;;;:::o;2146:1064::-;2233:6;2241;2249;2302:2;2290:9;2281:7;2277:23;2273:32;2270:2;;;2318:1;2315;2308:12;2270:2;2341:29;2360:9;2341:29;:::i;:::-;2331:39;;2421:2;2410:9;2406:18;2393:32;2444:18;2485:2;2477:6;2474:14;2471:2;;;2501:1;2498;2491:12;2471:2;2539:6;2528:9;2524:22;2514:32;;2584:7;2577:4;2573:2;2569:13;2565:27;2555:2;;2606:1;2603;2596:12;2555:2;2642;2629:16;2664:2;2660;2657:10;2654:2;;;2670:18;;:::i;:::-;2745:2;2739:9;2713:2;2799:13;;-1:-1:-1;;2795:22:1;;;2819:2;2791:31;2787:40;2775:53;;;2843:18;;;2863:22;;;2840:46;2837:2;;;2889:18;;:::i;:::-;2929:10;2925:2;2918:22;2964:2;2956:6;2949:18;3004:7;2999:2;2994;2990;2986:11;2982:20;2979:33;2976:2;;;3025:1;3022;3015:12;2976:2;3081;3076;3072;3068:11;3063:2;3055:6;3051:15;3038:46;3126:1;3121:2;3116;3108:6;3104:15;3100:24;3093:35;3147:6;3137:16;;;;;;;3200:2;3189:9;3185:18;3172:32;3162:42;;2260:950;;;;;:::o;3215:254::-;3283:6;3291;3344:2;3332:9;3323:7;3319:23;3315:32;3312:2;;;3360:1;3357;3350:12;3312:2;3383:29;3402:9;3383:29;:::i;:::-;3373:39;3459:2;3444:18;;;;3431:32;;-1:-1:-1;;;3302:167:1:o;3474:245::-;3532:6;3585:2;3573:9;3564:7;3560:23;3556:32;3553:2;;;3601:1;3598;3591:12;3553:2;3640:9;3627:23;3659:30;3683:5;3659:30;:::i;3724:249::-;3793:6;3846:2;3834:9;3825:7;3821:23;3817:32;3814:2;;;3862:1;3859;3852:12;3814:2;3894:9;3888:16;3913:30;3937:5;3913:30;:::i;3978:180::-;4037:6;4090:2;4078:9;4069:7;4065:23;4061:32;4058:2;;;4106:1;4103;4096:12;4058:2;-1:-1:-1;4129:23:1;;4048:110;-1:-1:-1;4048:110:1:o;4163:471::-;4204:3;4242:5;4236:12;4269:6;4264:3;4257:19;4294:1;4304:162;4318:6;4315:1;4312:13;4304:162;;;4380:4;4436:13;;;4432:22;;4426:29;4408:11;;;4404:20;;4397:59;4333:12;4304:162;;;4484:6;4481:1;4478:13;4475:2;;;4550:1;4543:4;4534:6;4529:3;4525:16;4521:27;4514:38;4475:2;-1:-1:-1;4616:2:1;4595:15;-1:-1:-1;;4591:29:1;4582:39;;;;4623:4;4578:50;;4212:422;-1:-1:-1;;4212:422:1:o;5057:488::-;-1:-1:-1;;;;;5326:15:1;;;5308:34;;5378:15;;5373:2;5358:18;;5351:43;5425:2;5410:18;;5403:34;;;5473:3;5468:2;5453:18;;5446:31;;;5251:4;;5494:45;;5519:19;;5511:6;5494:45;:::i;:::-;5486:53;5260:285;-1:-1:-1;;;;;;5260:285:1:o;5742:219::-;5891:2;5880:9;5873:21;5854:4;5911:44;5951:2;5940:9;5936:18;5928:6;5911:44;:::i;8089:128::-;8129:3;8160:1;8156:6;8153:1;8150:13;8147:2;;;8166:18;;:::i;:::-;-1:-1:-1;8202:9:1;;8137:80::o;8222:125::-;8262:4;8290:1;8287;8284:8;8281:2;;;8295:18;;:::i;:::-;-1:-1:-1;8332:9:1;;8271:76::o;8352:136::-;8391:3;8419:5;8409:2;;8428:18;;:::i;:::-;-1:-1:-1;;;8464:18:1;;8399:89::o;8493:380::-;8572:1;8568:12;;;;8615;;;8636:2;;8690:4;8682:6;8678:17;8668:27;;8636:2;8743;8735:6;8732:14;8712:18;8709:38;8706:2;;;8789:10;8784:3;8780:20;8777:1;8770:31;8824:4;8821:1;8814:15;8852:4;8849:1;8842:15;8878:135;8917:3;-1:-1:-1;;8938:17:1;;8935:2;;;8958:18;;:::i;:::-;-1:-1:-1;9005:1:1;8994:13;;8925:88::o;9018:127::-;9079:10;9074:3;9070:20;9067:1;9060:31;9110:4;9107:1;9100:15;9134:4;9131:1;9124:15;9150:127;9211:10;9206:3;9202:20;9199:1;9192:31;9242:4;9239:1;9232:15;9266:4;9263:1;9256:15;9282:131;-1:-1:-1;;;;;;9356:32:1;;9346:43;;9336:2;;9403:1;9400;9393:12

Swarm Source

ipfs://e3775b0c4af457c11fa5f362f049bc0a234dcd8f0cfc821866307d43f0975590
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.