ETH Price: $3,792.57 (+6.25%)

Token

reNFT - Genesis Cards ()
 

Overview

Max Total Supply

0

Holders

391

Market

Volume (24H)

N/A

Min Price (24H)

N/A

Max Price (24H)

N/A
0x4a73a4cb2794962cc908068b3ff6b50edd5081b9
Loading...
Loading
Loading...
Loading
Loading...
Loading

OVERVIEW

reNFT is a protocol layer that enables peer to peer renting of ERC-721 and 1155 non-fungible tokens (NFTs). reNFT Genesis Cards are a series of themed collectable cards enabling special utility and incentives on the reNFT platform. You can start lending and renting your NFTs today on dapp....

# Exchange Pair Price  24H Volume % Volume

Contract Source Code Verified (Exact Match)

Contract Name:
NFT

Compiler Version
v0.8.3+commit.8d00100c

Optimization Enabled:
Yes with 100000 runs

Other Settings:
default evmVersion
File 1 of 8 : NFT.sol
// SPDX-License-Identifier: Apache-2.0
pragma solidity 0.8.3;

import "./ERC1155MintBurnPackedBalance.sol";
import "../interfaces/IERC1155Metadata.sol";

contract NFT is ERC1155MintBurnPackedBalance, IERC1155Metadata {

    address public owner;
    string public baseURI;

    constructor(string memory _baseURI) {
        owner = msg.sender;
        baseURI = _baseURI;
    }

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

    function changeOwner(address _newOwner) public onlyOwner {
        owner = _newOwner;
    }

    function changeBaseURI(string memory _newBaseURI) public onlyOwner {
        baseURI = _newBaseURI;
    }

    function mint(address _to, uint256 _id, uint256 _amount) public onlyOwner {
        _mint(_to, _id, _amount, "");
    }

    function batchMint(address _to, uint256[] memory _ids, uint256[] memory _amounts) public onlyOwner {
        _batchMint(_to, _ids, _amounts, "");
    }

    function burn(address _from, uint256 _id, uint256 _amount) public onlyOwner {
        _burn(_from, _id, _amount);
    }

    function batchBurn(address _from, uint256[] memory _ids, uint256[] memory _amounts) public onlyOwner {
        _batchBurn(_from, _ids, _amounts);
    }

    function supportsInterface(bytes4 _interfaceID) public override pure returns (bool) {
        if (_interfaceID == type(IERC1155).interfaceId || _interfaceID == type(IERC1155Metadata).interfaceId) {
            return true;
        }
        return super.supportsInterface(_interfaceID);
    }

    function uri(uint256 _id) external view override returns (string memory) {
        return string(abi.encodePacked(baseURI, uint2str(_id)));
    }

    function uint2str(uint _i) internal pure returns (string memory _uintAsString) {
        if (_i == 0) {
            return "0";
        }
        uint j = _i;
        uint len;
        while (j != 0) {
            len++;
            j /= 10;
        }
        bytes memory bstr = new bytes(len);
        uint k = len;
        while (_i != 0) {
            k = k-1;
            uint8 temp = (48 + uint8(_i - _i / 10 * 10));
            bytes1 b1 = bytes1(temp);
            bstr[k] = b1;
            _i /= 10;
        }
        return string(bstr);
    }
}

File 2 of 8 : ERC1155MintBurnPackedBalance.sol
// SPDX-License-Identifier: Apache-2.0
pragma solidity 0.8.3;

import "./ERC1155PackedBalance.sol";


/**
 * @dev Multi-Fungible Tokens with minting and burning methods. These methods assume
 *      a parent contract to be executed as they are `internal` functions.
 */
contract ERC1155MintBurnPackedBalance is ERC1155PackedBalance {

  /****************************************|
  |            Minting Functions           |
  |_______________________________________*/

  /**
   * @notice Mint _amount of tokens of a given id
   * @param _to      The address to mint tokens to
   * @param _id      Token id to mint
   * @param _amount  The amount to be minted
   * @param _data    Data to pass if receiver is contract
   */
  function _mint(address _to, uint256 _id, uint256 _amount, bytes memory _data)
    internal
  {
    //Add _amount
    _updateIDBalance(_to,   _id, _amount, Operations.Add); // Add amount to recipient

    // Emit event
    emit TransferSingle(msg.sender, address(0x0), _to, _id, _amount);

    // Calling onReceive method if recipient is contract
    _callonERC1155Received(address(0x0), _to, _id, _amount, gasleft(), _data);
  }

  /**
   * @notice Mint tokens for each (_ids[i], _amounts[i]) pair
   * @param _to       The address to mint tokens to
   * @param _ids      Array of ids to mint
   * @param _amounts  Array of amount of tokens to mint per id
   * @param _data    Data to pass if receiver is contract
   */
  function _batchMint(address _to, uint256[] memory _ids, uint256[] memory _amounts, bytes memory _data)
    internal
  {
    require(_ids.length == _amounts.length, "ERC1155MintBurnPackedBalance#_batchMint: INVALID_ARRAYS_LENGTH");

    if (_ids.length > 0) {
      // Load first bin and index where the token ID balance exists
      (uint256 bin, uint256 index) = getIDBinIndex(_ids[0]);

      // Balance for current bin in memory (initialized with first transfer)
      uint256 balTo = _viewUpdateBinValue(balances[_to][bin], index, _amounts[0], Operations.Add);

      // Number of transfer to execute
      uint256 nTransfer = _ids.length;

      // Last bin updated
      uint256 lastBin = bin;

      for (uint256 i = 1; i < nTransfer; i++) {
        (bin, index) = getIDBinIndex(_ids[i]);

        // If new bin
        if (bin != lastBin) {
          // Update storage balance of previous bin
          balances[_to][lastBin] = balTo;
          balTo = balances[_to][bin];

          // Bin will be the most recent bin
          lastBin = bin;
        }

        // Update memory balance
        balTo = _viewUpdateBinValue(balTo, index, _amounts[i], Operations.Add);
      }

      // Update storage of the last bin visited
      balances[_to][bin] = balTo;
    }

    // //Emit event
    emit TransferBatch(msg.sender, address(0x0), _to, _ids, _amounts);

    // Calling onReceive method if recipient is contract
    _callonERC1155BatchReceived(address(0x0), _to, _ids, _amounts, gasleft(), _data);
  }


  /****************************************|
  |            Burning Functions           |
  |_______________________________________*/

  /**
   * @notice Burn _amount of tokens of a given token id
   * @param _from    The address to burn tokens from
   * @param _id      Token id to burn
   * @param _amount  The amount to be burned
   */
  function _burn(address _from, uint256 _id, uint256 _amount)
    internal
  {
    // Substract _amount
    _updateIDBalance(_from, _id, _amount, Operations.Sub);

    // Emit event
    emit TransferSingle(msg.sender, _from, address(0x0), _id, _amount);
  }

  /**
   * @notice Burn tokens of given token id for each (_ids[i], _amounts[i]) pair
   * @dev This batchBurn method does not implement the most efficient way of updating
   *      balances to reduce the potential bug surface as this function is expected to
   *      be less common than transfers. EIP-2200 makes this method significantly
   *      more efficient already for packed balances.
   * @param _from     The address to burn tokens from
   * @param _ids      Array of token ids to burn
   * @param _amounts  Array of the amount to be burned
   */
  function _batchBurn(address _from, uint256[] memory _ids, uint256[] memory _amounts)
    internal
  {
    // Number of burning to execute
    uint256 nBurn = _ids.length;
    require(nBurn == _amounts.length, "ERC1155MintBurnPackedBalance#batchBurn: INVALID_ARRAYS_LENGTH");

    // Executing all burning
    for (uint256 i = 0; i < nBurn; i++) {
      // Update storage balance
      _updateIDBalance(_from,   _ids[i], _amounts[i], Operations.Sub); // Add amount to recipient
    }

    // Emit batch burn event
    emit TransferBatch(msg.sender, _from, address(0x0), _ids, _amounts);
  }
}

File 3 of 8 : IERC1155Metadata.sol
// SPDX-License-Identifier: Apache-2.0
pragma solidity 0.8.3;


interface IERC1155Metadata {

  event URI(string _uri, uint256 indexed _id);

  /****************************************|
  |                Functions               |
  |_______________________________________*/

  /**
   * @notice A distinct Uniform Resource Identifier (URI) for a given token.
   * @dev URIs are defined in RFC 3986.
   *      URIs are assumed to be deterministically generated based on token ID
   *      Token IDs are assumed to be represented in their hex format in URIs
   * @return URI string
   */
  function uri(uint256 _id) external view returns (string memory);
}

File 4 of 8 : ERC1155PackedBalance.sol
// SPDX-License-Identifier: Apache-2.0
pragma solidity 0.8.3;

import "../interfaces/IERC1155TokenReceiver.sol";
import "../interfaces/IERC1155.sol";
import "../utils/Address.sol";
import "../utils/ERC165.sol";


/**
 * @dev Implementation of Multi-Token Standard contract. This implementation of the ERC-1155 standard
 *      utilizes the fact that balances of different token ids can be concatenated within individual
 *      uint256 storage slots. This allows the contract to batch transfer tokens more efficiently at
 *      the cost of limiting the maximum token balance each address can hold. This limit is
 *      2^IDS_BITS_SIZE, which can be adjusted below. In practice, using IDS_BITS_SIZE smaller than 16
 *      did not lead to major efficiency gains.
 */
contract ERC1155PackedBalance is IERC1155, ERC165 {
  using Address for address;

  /***********************************|
  |        Variables and Events       |
  |__________________________________*/

  // onReceive function signatures
  bytes4 constant internal ERC1155_RECEIVED_VALUE = 0xf23a6e61;
  bytes4 constant internal ERC1155_BATCH_RECEIVED_VALUE = 0xbc197c81;

  // Constants regarding bin sizes for balance packing
  // IDS_BITS_SIZE **MUST** be a power of 2 (e.g. 2, 4, 8, 16, 32, 64, 128)
  uint256 internal constant IDS_BITS_SIZE   = 32;                  // Max balance amount in bits per token ID
  uint256 internal constant IDS_PER_UINT256 = 256 / IDS_BITS_SIZE; // Number of ids per uint256

  // Operations for _updateIDBalance
  enum Operations { Add, Sub }

  // Token IDs balances ; balances[address][id] => balance (using array instead of mapping for efficiency)
  mapping (address => mapping(uint256 => uint256)) internal balances;

  // Operators
  mapping (address => mapping(address => bool)) internal operators;


  /***********************************|
  |     Public Transfer Functions     |
  |__________________________________*/

  /**
   * @notice Transfers amount amount of an _id from the _from address to the _to address specified
   * @param _from    Source address
   * @param _to      Target address
   * @param _id      ID of the token type
   * @param _amount  Transfered amount
   * @param _data    Additional data with no specified format, sent in call to `_to`
   */
  function safeTransferFrom(address _from, address _to, uint256 _id, uint256 _amount, bytes memory _data)
    public override
  {
    // Requirements
    require((msg.sender == _from) || isApprovedForAll(_from, msg.sender), "ERC1155PackedBalance#safeTransferFrom: INVALID_OPERATOR");
    require(_to != address(0),"ERC1155PackedBalance#safeTransferFrom: INVALID_RECIPIENT");
    // require(_amount <= balances);  Not necessary since checked with _viewUpdateBinValue() checks

    _safeTransferFrom(_from, _to, _id, _amount);
    _callonERC1155Received(_from, _to, _id, _amount, gasleft(), _data);
  }

  /**
   * @notice Send multiple types of Tokens from the _from address to the _to address (with safety call)
   * @dev Arrays should be sorted so that all ids in a same storage slot are adjacent (more efficient)
   * @param _from     Source addresses
   * @param _to       Target addresses
   * @param _ids      IDs of each token type
   * @param _amounts  Transfer amounts per token type
   * @param _data     Additional data with no specified format, sent in call to `_to`
   */
  function safeBatchTransferFrom(address _from, address _to, uint256[] memory _ids, uint256[] memory _amounts, bytes memory _data)
    public override
  {
    // Requirements
    require((msg.sender == _from) || isApprovedForAll(_from, msg.sender), "ERC1155PackedBalance#safeBatchTransferFrom: INVALID_OPERATOR");
    require(_to != address(0),"ERC1155PackedBalance#safeBatchTransferFrom: INVALID_RECIPIENT");

    _safeBatchTransferFrom(_from, _to, _ids, _amounts);
    _callonERC1155BatchReceived(_from, _to, _ids, _amounts, gasleft(), _data);
  }


  /***********************************|
  |    Internal Transfer Functions    |
  |__________________________________*/

  /**
   * @notice Transfers amount amount of an _id from the _from address to the _to address specified
   * @param _from    Source address
   * @param _to      Target address
   * @param _id      ID of the token type
   * @param _amount  Transfered amount
   */
  function _safeTransferFrom(address _from, address _to, uint256 _id, uint256 _amount)
    internal
  {
    //Update balances
    _updateIDBalance(_from, _id, _amount, Operations.Sub); // Subtract amount from sender
    _updateIDBalance(_to,   _id, _amount, Operations.Add); // Add amount to recipient

    // Emit event
    emit TransferSingle(msg.sender, _from, _to, _id, _amount);
  }

  /**
   * @notice Verifies if receiver is contract and if so, calls (_to).onERC1155Received(...)
   */
  function _callonERC1155Received(address _from, address _to, uint256 _id, uint256 _amount, uint256 _gasLimit, bytes memory _data)
    internal
  {
    // Check if recipient is contract
    if (_to.isContract()) {
      bytes4 retval = IERC1155TokenReceiver(_to).onERC1155Received{gas:_gasLimit}(msg.sender, _from, _id, _amount, _data);
      require(retval == ERC1155_RECEIVED_VALUE, "ERC1155PackedBalance#_callonERC1155Received: INVALID_ON_RECEIVE_MESSAGE");
    }
  }

  /**
   * @notice Send multiple types of Tokens from the _from address to the _to address (with safety call)
   * @dev Arrays should be sorted so that all ids in a same storage slot are adjacent (more efficient)
   * @param _from     Source addresses
   * @param _to       Target addresses
   * @param _ids      IDs of each token type
   * @param _amounts  Transfer amounts per token type
   */
  function _safeBatchTransferFrom(address _from, address _to, uint256[] memory _ids, uint256[] memory _amounts)
    internal
  {
    uint256 nTransfer = _ids.length; // Number of transfer to execute
    require(nTransfer == _amounts.length, "ERC1155PackedBalance#_safeBatchTransferFrom: INVALID_ARRAYS_LENGTH");

    if (_from != _to && nTransfer > 0) {
      // Load first bin and index where the token ID balance exists
      (uint256 bin, uint256 index) = getIDBinIndex(_ids[0]);

      // Balance for current bin in memory (initialized with first transfer)
      uint256 balFrom = _viewUpdateBinValue(balances[_from][bin], index, _amounts[0], Operations.Sub);
      uint256 balTo = _viewUpdateBinValue(balances[_to][bin], index, _amounts[0], Operations.Add);

      // Last bin updated
      uint256 lastBin = bin;

      for (uint256 i = 1; i < nTransfer; i++) {
        (bin, index) = getIDBinIndex(_ids[i]);

        // If new bin
        if (bin != lastBin) {
          // Update storage balance of previous bin
          balances[_from][lastBin] = balFrom;
          balances[_to][lastBin] = balTo;

          balFrom = balances[_from][bin];
          balTo = balances[_to][bin];

          // Bin will be the most recent bin
          lastBin = bin;
        }

        // Update memory balance
        balFrom = _viewUpdateBinValue(balFrom, index, _amounts[i], Operations.Sub);
        balTo = _viewUpdateBinValue(balTo, index, _amounts[i], Operations.Add);
      }

      // Update storage of the last bin visited
      balances[_from][bin] = balFrom;
      balances[_to][bin] = balTo;

    // If transfer to self, just make sure all amounts are valid
    } else {
      for (uint256 i = 0; i < nTransfer; i++) {
        require(balanceOf(_from, _ids[i]) >= _amounts[i], "ERC1155PackedBalance#_safeBatchTransferFrom: UNDERFLOW");
      }
    }

    // Emit event
    emit TransferBatch(msg.sender, _from, _to, _ids, _amounts);
  }

  /**
   * @notice Verifies if receiver is contract and if so, calls (_to).onERC1155BatchReceived(...)
   */
  function _callonERC1155BatchReceived(address _from, address _to, uint256[] memory _ids, uint256[] memory _amounts, uint256 _gasLimit, bytes memory _data)
    internal
  {
    // Pass data if recipient is contract
    if (_to.isContract()) {
      bytes4 retval = IERC1155TokenReceiver(_to).onERC1155BatchReceived{gas: _gasLimit}(msg.sender, _from, _ids, _amounts, _data);
      require(retval == ERC1155_BATCH_RECEIVED_VALUE, "ERC1155PackedBalance#_callonERC1155BatchReceived: INVALID_ON_RECEIVE_MESSAGE");
    }
  }


  /***********************************|
  |         Operator Functions        |
  |__________________________________*/

  /**
   * @notice Enable or disable approval for a third party ("operator") to manage all of caller's tokens
   * @param _operator  Address to add to the set of authorized operators
   * @param _approved  True if the operator is approved, false to revoke approval
   */
  function setApprovalForAll(address _operator, bool _approved)
    external override
  {
    // Update operator status
    operators[msg.sender][_operator] = _approved;
    emit ApprovalForAll(msg.sender, _operator, _approved);
  }

  /**
   * @notice Queries the approval status of an operator for a given owner
   * @param _owner     The owner of the Tokens
   * @param _operator  Address of authorized operator
   * @return isOperator True if the operator is approved, false if not
   */
  function isApprovedForAll(address _owner, address _operator)
    public override view returns (bool isOperator)
  {
    return operators[_owner][_operator];
  }


  /***********************************|
  |     Public Balance Functions      |
  |__________________________________*/

  /**
   * @notice Get the balance of an account's Tokens
   * @param _owner  The address of the token holder
   * @param _id     ID of the Token
   * @return The _owner's balance of the Token type requested
   */
  function balanceOf(address _owner, uint256 _id)
    public override view returns (uint256)
  {
    uint256 bin;
    uint256 index;

    //Get bin and index of _id
    (bin, index) = getIDBinIndex(_id);
    return getValueInBin(balances[_owner][bin], index);
  }

  /**
   * @notice Get the balance of multiple account/token pairs
   * @param _owners The addresses of the token holders (sorted owners will lead to less gas usage)
   * @param _ids    ID of the Tokens (sorted ids will lead to less gas usage
   * @return The _owner's balance of the Token types requested (i.e. balance for each (owner, id) pair)
    */
  function balanceOfBatch(address[] memory _owners, uint256[] memory _ids)
    public override view returns (uint256[] memory)
  {
    uint256 n_owners = _owners.length;
    require(n_owners == _ids.length, "ERC1155PackedBalance#balanceOfBatch: INVALID_ARRAY_LENGTH");

    // First values
    (uint256 bin, uint256 index) = getIDBinIndex(_ids[0]);
    uint256 balance_bin = balances[_owners[0]][bin];
    uint256 last_bin = bin;

    // Initialization
    uint256[] memory batchBalances = new uint256[](n_owners);
    batchBalances[0] = getValueInBin(balance_bin, index);

    // Iterate over each owner and token ID
    for (uint256 i = 1; i < n_owners; i++) {
      (bin, index) = getIDBinIndex(_ids[i]);

      // SLOAD if bin changed for the same owner or if owner changed
      if (bin != last_bin || _owners[i-1] != _owners[i]) {
        balance_bin = balances[_owners[i]][bin];
        last_bin = bin;
      }

      batchBalances[i] = getValueInBin(balance_bin, index);
    }

    return batchBalances;
  }


  /***********************************|
  |      Packed Balance Functions     |
  |__________________________________*/

  /**
   * @notice Update the balance of a id for a given address
   * @param _address    Address to update id balance
   * @param _id         Id to update balance of
   * @param _amount     Amount to update the id balance
   * @param _operation  Which operation to conduct :
   *   Operations.Add: Add _amount to id balance
   *   Operations.Sub: Substract _amount from id balance
   */
  function _updateIDBalance(address _address, uint256 _id, uint256 _amount, Operations _operation)
    internal
  {
    uint256 bin;
    uint256 index;

    // Get bin and index of _id
    (bin, index) = getIDBinIndex(_id);

    // Update balance
    balances[_address][bin] = _viewUpdateBinValue(balances[_address][bin], index, _amount, _operation);
  }

  /**
   * @notice Update a value in _binValues
   * @param _binValues  Uint256 containing values of size IDS_BITS_SIZE (the token balances)
   * @param _index      Index of the value in the provided bin
   * @param _amount     Amount to update the id balance
   * @param _operation  Which operation to conduct :
   *   Operations.Add: Add _amount to value in _binValues at _index
   *   Operations.Sub: Substract _amount from value in _binValues at _index
   */
  function _viewUpdateBinValue(uint256 _binValues, uint256 _index, uint256 _amount, Operations _operation)
    internal pure returns (uint256 newBinValues)
  {
    uint256 shift = IDS_BITS_SIZE * _index;
    uint256 mask = (uint256(1) << IDS_BITS_SIZE) - 1;

    if (_operation == Operations.Add) {
      newBinValues = _binValues + (_amount << shift);
      require(newBinValues >= _binValues, "ERC1155PackedBalance#_viewUpdateBinValue: OVERFLOW");
      require(
        ((_binValues >> shift) & mask) + _amount < 2**IDS_BITS_SIZE, // Checks that no other id changed
        "ERC1155PackedBalance#_viewUpdateBinValue: OVERFLOW"
      );

    } else if (_operation == Operations.Sub) {
      newBinValues = _binValues - (_amount << shift);
      require(newBinValues <= _binValues, "ERC1155PackedBalance#_viewUpdateBinValue: UNDERFLOW");
      require(
        ((_binValues >> shift) & mask) >= _amount, // Checks that no other id changed
        "ERC1155PackedBalance#_viewUpdateBinValue: UNDERFLOW"
      );

    } else {
      revert("ERC1155PackedBalance#_viewUpdateBinValue: INVALID_BIN_WRITE_OPERATION"); // Bad operation
    }

    return newBinValues;
  }

  /**
  * @notice Return the bin number and index within that bin where ID is
  * @param _id  Token id
  * @return bin index (Bin number, ID"s index within that bin)
  */
  function getIDBinIndex(uint256 _id)
    public pure returns (uint256 bin, uint256 index)
  {
    bin = _id / IDS_PER_UINT256;
    index = _id % IDS_PER_UINT256;
    return (bin, index);
  }

  /**
   * @notice Return amount in _binValues at position _index
   * @param _binValues  uint256 containing the balances of IDS_PER_UINT256 ids
   * @param _index      Index at which to retrieve amount
   * @return amount at given _index in _bin
   */
  function getValueInBin(uint256 _binValues, uint256 _index)
    public pure returns (uint256)
  {
    // require(_index < IDS_PER_UINT256) is not required since getIDBinIndex ensures `_index < IDS_PER_UINT256`

    // Mask to retrieve data for a given binData
    uint256 mask = (uint256(1) << IDS_BITS_SIZE) - 1;

    // Shift amount
    uint256 rightShift = IDS_BITS_SIZE * _index;
    return (_binValues >> rightShift) & mask;
  }


  /***********************************|
  |          ERC165 Functions         |
  |__________________________________*/

  /**
   * @notice Query if a contract implements an interface
   * @param _interfaceID  The interface identifier, as specified in ERC-165
   * @return `true` if the contract implements `_interfaceID` and
   */
  function supportsInterface(bytes4 _interfaceID) public override virtual pure returns (bool) {
    if (_interfaceID == type(IERC1155).interfaceId) {
      return true;
    }
    return super.supportsInterface(_interfaceID);
  }
}

File 5 of 8 : IERC1155TokenReceiver.sol
// SPDX-License-Identifier: Apache-2.0
pragma solidity 0.8.3;

/**
 * @dev ERC-1155 interface for accepting safe transfers.
 */
interface IERC1155TokenReceiver {

  /**
   * @notice Handle the receipt of a single ERC1155 token type
   * @dev An ERC1155-compliant smart contract MUST call this function on the token recipient contract, at the end of a `safeTransferFrom` after the balance has been updated
   * This function MAY throw to revert and reject the transfer
   * Return of other amount than the magic value MUST result in the transaction being reverted
   * Note: The token contract address is always the message sender
   * @param _operator  The address which called the `safeTransferFrom` function
   * @param _from      The address which previously owned the token
   * @param _id        The id of the token being transferred
   * @param _amount    The amount of tokens being transferred
   * @param _data      Additional data with no specified format
   * @return           `bytes4(keccak256("onERC1155Received(address,address,uint256,uint256,bytes)"))`
   */
  function onERC1155Received(address _operator, address _from, uint256 _id, uint256 _amount, bytes calldata _data) external returns(bytes4);

  /**
   * @notice Handle the receipt of multiple ERC1155 token types
   * @dev An ERC1155-compliant smart contract MUST call this function on the token recipient contract, at the end of a `safeBatchTransferFrom` after the balances have been updated
   * This function MAY throw to revert and reject the transfer
   * Return of other amount than the magic value WILL result in the transaction being reverted
   * Note: The token contract address is always the message sender
   * @param _operator  The address which called the `safeBatchTransferFrom` function
   * @param _from      The address which previously owned the token
   * @param _ids       An array containing ids of each token being transferred
   * @param _amounts   An array containing amounts of each token being transferred
   * @param _data      Additional data with no specified format
   * @return           `bytes4(keccak256("onERC1155BatchReceived(address,address,uint256[],uint256[],bytes)"))`
   */
  function onERC1155BatchReceived(address _operator, address _from, uint256[] calldata _ids, uint256[] calldata _amounts, bytes calldata _data) external returns(bytes4);
}

File 6 of 8 : IERC1155.sol
// SPDX-License-Identifier: Apache-2.0
pragma solidity 0.8.3;


interface IERC1155 {

  /****************************************|
  |                 Events                 |
  |_______________________________________*/

  /**
   * @dev Either TransferSingle or TransferBatch MUST emit when tokens are transferred, including zero amount transfers as well as minting or burning
   *   Operator MUST be msg.sender
   *   When minting/creating tokens, the `_from` field MUST be set to `0x0`
   *   When burning/destroying tokens, the `_to` field MUST be set to `0x0`
   *   The total amount transferred from address 0x0 minus the total amount transferred to 0x0 may be used by clients and exchanges to be added to the "circulating supply" for a given token ID
   *   To broadcast the existence of a token ID with no initial balance, the contract SHOULD emit the TransferSingle event from `0x0` to `0x0`, with the token creator as `_operator`, and a `_amount` of 0
   */
  event TransferSingle(address indexed _operator, address indexed _from, address indexed _to, uint256 _id, uint256 _amount);

  /**
   * @dev Either TransferSingle or TransferBatch MUST emit when tokens are transferred, including zero amount transfers as well as minting or burning
   *   Operator MUST be msg.sender
   *   When minting/creating tokens, the `_from` field MUST be set to `0x0`
   *   When burning/destroying tokens, the `_to` field MUST be set to `0x0`
   *   The total amount transferred from address 0x0 minus the total amount transferred to 0x0 may be used by clients and exchanges to be added to the "circulating supply" for a given token ID
   *   To broadcast the existence of multiple token IDs with no initial balance, this SHOULD emit the TransferBatch event from `0x0` to `0x0`, with the token creator as `_operator`, and a `_amount` of 0
   */
  event TransferBatch(address indexed _operator, address indexed _from, address indexed _to, uint256[] _ids, uint256[] _amounts);

  /**
   * @dev MUST emit when an approval is updated
   */
  event ApprovalForAll(address indexed _owner, address indexed _operator, bool _approved);


  /****************************************|
  |                Functions               |
  |_______________________________________*/

  /**
    * @notice Transfers amount of an _id from the _from address to the _to address specified
    * @dev MUST emit TransferSingle event on success
    * Caller must be approved to manage the _from account's tokens (see isApprovedForAll)
    * MUST throw if `_to` is the zero address
    * MUST throw if balance of sender for token `_id` is lower than the `_amount` sent
    * MUST throw on any other error
    * When transfer is complete, this function MUST check if `_to` is a smart contract (code size > 0). If so, it MUST call `onERC1155Received` on `_to` and revert if the return amount is not `bytes4(keccak256("onERC1155Received(address,address,uint256,uint256,bytes)"))`
    * @param _from    Source address
    * @param _to      Target address
    * @param _id      ID of the token type
    * @param _amount  Transfered amount
    * @param _data    Additional data with no specified format, sent in call to `_to`
    */
  function safeTransferFrom(address _from, address _to, uint256 _id, uint256 _amount, bytes calldata _data) external;

  /**
    * @notice Send multiple types of Tokens from the _from address to the _to address (with safety call)
    * @dev MUST emit TransferBatch event on success
    * Caller must be approved to manage the _from account's tokens (see isApprovedForAll)
    * MUST throw if `_to` is the zero address
    * MUST throw if length of `_ids` is not the same as length of `_amounts`
    * MUST throw if any of the balance of sender for token `_ids` is lower than the respective `_amounts` sent
    * MUST throw on any other error
    * When transfer is complete, this function MUST check if `_to` is a smart contract (code size > 0). If so, it MUST call `onERC1155BatchReceived` on `_to` and revert if the return amount is not `bytes4(keccak256("onERC1155BatchReceived(address,address,uint256[],uint256[],bytes)"))`
    * Transfers and events MUST occur in the array order they were submitted (_ids[0] before _ids[1], etc)
    * @param _from     Source addresses
    * @param _to       Target addresses
    * @param _ids      IDs of each token type
    * @param _amounts  Transfer amounts per token type
    * @param _data     Additional data with no specified format, sent in call to `_to`
  */
  function safeBatchTransferFrom(address _from, address _to, uint256[] calldata _ids, uint256[] calldata _amounts, bytes calldata _data) external;

  /**
   * @notice Get the balance of an account's Tokens
   * @param _owner  The address of the token holder
   * @param _id     ID of the Token
   * @return        The _owner's balance of the Token type requested
   */
  function balanceOf(address _owner, uint256 _id) external view returns (uint256);

  /**
   * @notice Get the balance of multiple account/token pairs
   * @param _owners The addresses of the token holders
   * @param _ids    ID of the Tokens
   * @return        The _owner's balance of the Token types requested (i.e. balance for each (owner, id) pair)
   */
  function balanceOfBatch(address[] calldata _owners, uint256[] calldata _ids) external view returns (uint256[] memory);

  /**
   * @notice Enable or disable approval for a third party ("operator") to manage all of caller's tokens
   * @dev MUST emit the ApprovalForAll event on success
   * @param _operator  Address to add to the set of authorized operators
   * @param _approved  True if the operator is approved, false to revoke approval
   */
  function setApprovalForAll(address _operator, bool _approved) external;

  /**
   * @notice Queries the approval status of an operator for a given owner
   * @param _owner     The owner of the Tokens
   * @param _operator  Address of authorized operator
   * @return isOperator True if the operator is approved, false if not
   */
  function isApprovedForAll(address _owner, address _operator) external view returns (bool isOperator);
}

File 7 of 8 : Address.sol
// SPDX-License-Identifier: UNLICENSED
pragma solidity 0.8.3;


/**
 * Utility library of inline functions on addresses
 */
library Address {

  // Default hash for EOA accounts returned by extcodehash
  bytes32 constant internal ACCOUNT_HASH = 0xc5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a470;

  /**
   * Returns whether the target address is a contract
   * @dev This function will return false if invoked during the constructor of a contract.
   * @param _address address of the account to check
   * @return Whether the target address is a contract
   */
  function isContract(address _address) internal view returns (bool) {
    bytes32 codehash;

    // Currently there is no better way to check if there is a contract in an address
    // than to check the size of the code at that address or if it has a non-zero code hash or account hash
    assembly { codehash := extcodehash(_address) }
    return (codehash != 0x0 && codehash != ACCOUNT_HASH);
  }
}

File 8 of 8 : ERC165.sol
// SPDX-License-Identifier: UNLICENSED
pragma solidity 0.8.3;

abstract contract ERC165 {
  /**
   * @notice Query if a contract implements an interface
   * @param _interfaceID The interface identifier, as specified in ERC-165
   * @return `true` if the contract implements `_interfaceID`
   */
  function supportsInterface(bytes4 _interfaceID) virtual public pure returns (bool) {
    return _interfaceID == this.supportsInterface.selector;
  }
}

Settings
{
  "optimizer": {
    "enabled": true,
    "runs": 100000,
    "details": {
      "yul": true,
      "constantOptimizer": false
    }
  },
  "outputSelection": {
    "*": {
      "*": [
        "evm.bytecode",
        "evm.deployedBytecode",
        "abi"
      ]
    }
  },
  "metadata": {
    "useLiteralContent": true
  },
  "libraries": {}
}

Contract Security Audit

Contract ABI

[{"inputs":[{"internalType":"string","name":"_baseURI","type":"string"}],"stateMutability":"nonpayable","type":"constructor"},{"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":"_operator","type":"address"},{"indexed":true,"internalType":"address","name":"_from","type":"address"},{"indexed":true,"internalType":"address","name":"_to","type":"address"},{"indexed":false,"internalType":"uint256[]","name":"_ids","type":"uint256[]"},{"indexed":false,"internalType":"uint256[]","name":"_amounts","type":"uint256[]"}],"name":"TransferBatch","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"_operator","type":"address"},{"indexed":true,"internalType":"address","name":"_from","type":"address"},{"indexed":true,"internalType":"address","name":"_to","type":"address"},{"indexed":false,"internalType":"uint256","name":"_id","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"_amount","type":"uint256"}],"name":"TransferSingle","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"string","name":"_uri","type":"string"},{"indexed":true,"internalType":"uint256","name":"_id","type":"uint256"}],"name":"URI","type":"event"},{"inputs":[{"internalType":"address","name":"_owner","type":"address"},{"internalType":"uint256","name":"_id","type":"uint256"}],"name":"balanceOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address[]","name":"_owners","type":"address[]"},{"internalType":"uint256[]","name":"_ids","type":"uint256[]"}],"name":"balanceOfBatch","outputs":[{"internalType":"uint256[]","name":"","type":"uint256[]"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"baseURI","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_from","type":"address"},{"internalType":"uint256[]","name":"_ids","type":"uint256[]"},{"internalType":"uint256[]","name":"_amounts","type":"uint256[]"}],"name":"batchBurn","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_to","type":"address"},{"internalType":"uint256[]","name":"_ids","type":"uint256[]"},{"internalType":"uint256[]","name":"_amounts","type":"uint256[]"}],"name":"batchMint","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_from","type":"address"},{"internalType":"uint256","name":"_id","type":"uint256"},{"internalType":"uint256","name":"_amount","type":"uint256"}],"name":"burn","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string","name":"_newBaseURI","type":"string"}],"name":"changeBaseURI","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_newOwner","type":"address"}],"name":"changeOwner","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_id","type":"uint256"}],"name":"getIDBinIndex","outputs":[{"internalType":"uint256","name":"bin","type":"uint256"},{"internalType":"uint256","name":"index","type":"uint256"}],"stateMutability":"pure","type":"function"},{"inputs":[{"internalType":"uint256","name":"_binValues","type":"uint256"},{"internalType":"uint256","name":"_index","type":"uint256"}],"name":"getValueInBin","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"pure","type":"function"},{"inputs":[{"internalType":"address","name":"_owner","type":"address"},{"internalType":"address","name":"_operator","type":"address"}],"name":"isApprovedForAll","outputs":[{"internalType":"bool","name":"isOperator","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_to","type":"address"},{"internalType":"uint256","name":"_id","type":"uint256"},{"internalType":"uint256","name":"_amount","type":"uint256"}],"name":"mint","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_from","type":"address"},{"internalType":"address","name":"_to","type":"address"},{"internalType":"uint256[]","name":"_ids","type":"uint256[]"},{"internalType":"uint256[]","name":"_amounts","type":"uint256[]"},{"internalType":"bytes","name":"_data","type":"bytes"}],"name":"safeBatchTransferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_from","type":"address"},{"internalType":"address","name":"_to","type":"address"},{"internalType":"uint256","name":"_id","type":"uint256"},{"internalType":"uint256","name":"_amount","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":"pure","type":"function"},{"inputs":[{"internalType":"uint256","name":"_id","type":"uint256"}],"name":"uri","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"}]

60806040523480156200001157600080fd5b50604051620035f3380380620035f3833981016040819052620000349162000121565b600280547fffffffffffffffffffffffff000000000000000000000000000000000000000016331790558051620000739060039060208401906200007b565b505062000269565b828054620000899062000216565b90600052602060002090601f016020900481019282620000ad5760008555620000f8565b82601f10620000c857805160ff1916838001178555620000f8565b82800160010185558215620000f8579182015b82811115620000f8578251825591602001919060010190620000db565b50620001069291506200010a565b5090565b5b808211156200010657600081556001016200010b565b6000602080838503121562000134578182fd5b825167ffffffffffffffff808211156200014c578384fd5b818501915085601f83011262000160578384fd5b81518181111562000175576200017562000253565b604051601f82017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0908116603f01168101908382118183101715620001be57620001be62000253565b816040528281528886848701011115620001d6578687fd5b8693505b82841015620001f95784840186015181850187015292850192620001da565b828411156200020a57868684830101525b98975050505050505050565b600181811c908216806200022b57607f821691505b602082108114156200024d57634e487b7160e01b600052602260045260246000fd5b50919050565b634e487b7160e01b600052604160045260246000fd5b61337a80620002796000396000f3fe608060405234801561001057600080fd5b50600436106101355760003560e01c80638da5cb5b116100b2578063e985e9c511610081578063f242432a11610066578063f242432a14610308578063f5298aca1461031b578063f6eb127a1461032e57610135565b8063e985e9c5146102ac578063eaec5f81146102f557610135565b80638da5cb5b14610219578063a22cb4651461025e578063a6f9dae114610271578063db90e83c1461028457610135565b8063156e29f61161010957806339a0c6f9116100ee57806339a0c6f9146101de5780634e1273f4146101f15780636c0360eb1461021157610135565b8063156e29f6146101b85780632eb2c2d6146101cb57610135565b8062fdd58e1461013a57806301ffc9a7146101605780630ca83480146101835780630e89341c14610198575b600080fd5b61014d610148366004612b1a565b610341565b6040519081526020015b60405180910390f35b61017361016e366004612c36565b610396565b6040519015158152602001610157565b610196610191366004612a6f565b610447565b005b6101ab6101a6366004612cbc565b6104ed565b6040516101579190612f5c565b6101966101c6366004612b43565b610521565b6101966101d9366004612966565b6105bd565b6101966101ec366004612c6e565b610761565b6102046101ff366004612b75565b6107f9565b6040516101579190612f24565b6101ab610c52565b6002546102399073ffffffffffffffffffffffffffffffffffffffff1681565b60405173ffffffffffffffffffffffffffffffffffffffff9091168152602001610157565b61019661026c366004612ae0565b610ce0565b61019661027f36600461291a565b610d77565b610297610292366004612cbc565b610e3f565b60408051928352602083019190915201610157565b6101736102ba366004612934565b73ffffffffffffffffffffffffffffffffffffffff918216600090815260016020908152604080832093909416825291909152205460ff1690565b61014d610303366004612cd4565b610e79565b610196610316366004612a0c565b610ea7565b610196610329366004612b43565b611044565b61019661033c366004612a6f565b6110d0565b600080600061034f84610e3f565b73ffffffffffffffffffffffffffffffffffffffff8716600090815260208181526040808320858452909152902054919350915061038d9082610e79565b95945050505050565b60007fffffffff0000000000000000000000000000000000000000000000000000000082167fd9b67a2600000000000000000000000000000000000000000000000000000000148061042957507fffffffff0000000000000000000000000000000000000000000000000000000082167f0e89341c00000000000000000000000000000000000000000000000000000000145b1561043657506001610442565b61043f8261115c565b90505b919050565b60025473ffffffffffffffffffffffffffffffffffffffff1633146104cd576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600b60248201527f6e6f7420616c6c6f77656400000000000000000000000000000000000000000060448201526064015b60405180910390fd5b6104e8838383604051806020016040528060008152506111fa565b505050565b606060036104fa8361150c565b60405160200161050b929190612d95565b6040516020818303038152906040529050919050565b60025473ffffffffffffffffffffffffffffffffffffffff1633146105a2576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600b60248201527f6e6f7420616c6c6f77656400000000000000000000000000000000000000000060448201526064016104c4565b6104e8838383604051806020016040528060008152506116b8565b3373ffffffffffffffffffffffffffffffffffffffff86161480610611575073ffffffffffffffffffffffffffffffffffffffff8516600090815260016020908152604080832033845290915290205460ff165b61069d576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603c60248201527f455243313135355061636b656442616c616e636523736166654261746368547260448201527f616e7366657246726f6d3a20494e56414c49445f4f50455241544f520000000060648201526084016104c4565b73ffffffffffffffffffffffffffffffffffffffff8416610740576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603d60248201527f455243313135355061636b656442616c616e636523736166654261746368547260448201527f616e7366657246726f6d3a20494e56414c49445f524543495049454e5400000060648201526084016104c4565b61074c8585858561172a565b61075a858585855a86611cb6565b5050505050565b60025473ffffffffffffffffffffffffffffffffffffffff1633146107e2576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600b60248201527f6e6f7420616c6c6f77656400000000000000000000000000000000000000000060448201526064016104c4565b80516107f5906003906020840190612759565b5050565b8151815160609190811461088f576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603960248201527f455243313135355061636b656442616c616e63652362616c616e63654f66426160448201527f7463683a20494e56414c49445f41525241595f4c454e4754480000000000000060648201526084016104c4565b6000806108dc856000815181106108cf577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b6020026020010151610e3f565b9150915060008060008860008151811061091f577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b602002602001015173ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000848152602001908152602001600020549050600083905060008567ffffffffffffffff8111156109bc577f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b6040519080825280602002602001820160405280156109e5578160200160208202803683370190505b5090506109f28385610e79565b81600081518110610a2c577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b602090810291909101015260015b86811015610c4557610a7e8982815181106108cf577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b90965094508286141580610b4a5750898181518110610ac6577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b602002602001015173ffffffffffffffffffffffffffffffffffffffff168a600183610af291906131a2565b81518110610b29577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b602002602001015173ffffffffffffffffffffffffffffffffffffffff1614155b15610be5576000808b8381518110610b8b577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b602002602001015173ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008781526020019081526020016000205493508592505b610bef8486610e79565b828281518110610c28577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b602090810291909101015280610c3d81613239565b915050610a3a565b5098975050505050505050565b60038054610c5f906131e5565b80601f0160208091040260200160405190810160405280929190818152602001828054610c8b906131e5565b8015610cd85780601f10610cad57610100808354040283529160200191610cd8565b820191906000526020600020905b815481529060010190602001808311610cbb57829003601f168201915b505050505081565b33600081815260016020908152604080832073ffffffffffffffffffffffffffffffffffffffff87168085529083529281902080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff001686151590811790915590519081529192917f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31910160405180910390a35050565b60025473ffffffffffffffffffffffffffffffffffffffff163314610df8576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600b60248201527f6e6f7420616c6c6f77656400000000000000000000000000000000000000000060448201526064016104c4565b600280547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff92909216919091179055565b600080610e4f602061010061301f565b610e59908461301f565b9150610e68602061010061301f565b610e729084613272565b9050915091565b600080610e8c60016401000000006131a2565b90506000610e9b846020613165565b9490941c169392505050565b3373ffffffffffffffffffffffffffffffffffffffff86161480610efb575073ffffffffffffffffffffffffffffffffffffffff8516600090815260016020908152604080832033845290915290205460ff165b610f87576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603760248201527f455243313135355061636b656442616c616e636523736166655472616e73666560448201527f7246726f6d3a20494e56414c49445f4f50455241544f5200000000000000000060648201526084016104c4565b73ffffffffffffffffffffffffffffffffffffffff841661102a576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603860248201527f455243313135355061636b656442616c616e636523736166655472616e73666560448201527f7246726f6d3a20494e56414c49445f524543495049454e54000000000000000060648201526084016104c4565b61103685858585611e74565b61075a858585855a86611eed565b60025473ffffffffffffffffffffffffffffffffffffffff1633146110c5576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600b60248201527f6e6f7420616c6c6f77656400000000000000000000000000000000000000000060448201526064016104c4565b6104e88383836120a1565b60025473ffffffffffffffffffffffffffffffffffffffff163314611151576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600b60248201527f6e6f7420616c6c6f77656400000000000000000000000000000000000000000060448201526064016104c4565b6104e8838383612109565b60007fffffffff0000000000000000000000000000000000000000000000000000000082167fd9b67a260000000000000000000000000000000000000000000000000000000014156111b057506001610442565b7f01ffc9a7000000000000000000000000000000000000000000000000000000007fffffffff0000000000000000000000000000000000000000000000000000000083161461043f565b815183511461128b576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603e60248201527f455243313135354d696e744275726e5061636b656442616c616e6365235f626160448201527f7463684d696e743a20494e56414c49445f4152524159535f4c454e475448000060648201526084016104c4565b825115611478576000806112d2856000815181106108cf577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b73ffffffffffffffffffffffffffffffffffffffff88166000908152602081815260408083208584529091528120548751939550919350916113579190849088908590611348577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b602002602001015160006122bd565b86519091508360015b8281101561143f576113a48982815181106108cf577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b90965094508186146113ed5773ffffffffffffffffffffffffffffffffffffffff8a16600090815260208181526040808320948352939052828120949094558584529220549184905b61142b84868a8481518110611348577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b93508061143781613239565b915050611360565b50505073ffffffffffffffffffffffffffffffffffffffff87166000908152602081815260408083209583529490529290922091909155505b8373ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff167f4a39dc06d4c0dbc64b70af90fd698a233a518aa5d07e595d983b8c0526c8f7fb86866040516114ef929190612f37565b60405180910390a461150660008585855a86611cb6565b50505050565b60608161154d575060408051808201909152600181527f30000000000000000000000000000000000000000000000000000000000000006020820152610442565b8160005b8115611577578061156181613239565b91506115709050600a8361301f565b9150611551565b60008167ffffffffffffffff8111156115b9577f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b6040519080825280601f01601f1916602001820160405280156115e3576020820181803683370190505b509050815b85156116af576115f96001826131a2565b90506000611608600a8861301f565b61161390600a613165565b61161d90886131a2565b611628906030612ffa565b905060008160f81b90508084848151811061166c577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a9053506116a6600a8961301f565b975050506115e8565b50949350505050565b6116c58484846000612698565b604080518481526020810184905273ffffffffffffffffffffffffffffffffffffffff86169160009133917fc3d58168c5ae7397731d063d5bbf3d657854427343f4c083240f7aacaa2d0f62910160405180910390a461150660008585855a86611eed565b8151815181146117e2576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152604260248201527f455243313135355061636b656442616c616e6365235f7361666542617463685460448201527f72616e7366657246726f6d3a20494e56414c49445f4152524159535f4c454e4760648201527f5448000000000000000000000000000000000000000000000000000000000000608482015260a4016104c4565b8373ffffffffffffffffffffffffffffffffffffffff168573ffffffffffffffffffffffffffffffffffffffff161415801561181e5750600081115b15611af957600080611863856000815181106108cf577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b73ffffffffffffffffffffffffffffffffffffffff89166000908152602081815260408083208584529091528120548751939550919350916118e891908490889085906118d9577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b602002602001015160016122bd565b73ffffffffffffffffffffffffffffffffffffffff88166000908152602081815260408083208784529091528120548751929350909161195c9190859089908590611348577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b90508360015b86811015611aa7576119a68982815181106108cf577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b9096509450818614611a155773ffffffffffffffffffffffffffffffffffffffff8b811660009081526020818152604080832086845280835281842098909855928d16825281815282822094825284815282822095909555878152948452808520549290935291909220549084905b611a5384868a84815181106118d9577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b9350611a9383868a8481518110611348577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b925080611a9f81613239565b915050611962565b505073ffffffffffffffffffffffffffffffffffffffff808a16600090815260208181526040808320888452825280832095909555918a16815280825283812095815294905292209190915550611c31565b60005b81811015611c2f57828181518110611b3d577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b6020026020010151611b8f87868481518110611b82577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b6020026020010151610341565b1015611c1d576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603660248201527f455243313135355061636b656442616c616e6365235f7361666542617463685460448201527f72616e7366657246726f6d3a20554e444552464c4f570000000000000000000060648201526084016104c4565b80611c2781613239565b915050611afc565b505b8373ffffffffffffffffffffffffffffffffffffffff168573ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff167f4a39dc06d4c0dbc64b70af90fd698a233a518aa5d07e595d983b8c0526c8f7fb8686604051611ca7929190612f37565b60405180910390a45050505050565b611cd58573ffffffffffffffffffffffffffffffffffffffff1661271f565b15611e6c5760008573ffffffffffffffffffffffffffffffffffffffff1663bc197c8184338a8989886040518763ffffffff1660e01b8152600401611d1e959493929190612e69565b602060405180830381600088803b158015611d3857600080fd5b5087f1158015611d4c573d6000803e3d6000fd5b50505050506040513d601f19601f82011682018060405250810190611d719190612c52565b90507fffffffff0000000000000000000000000000000000000000000000000000000081167fbc197c810000000000000000000000000000000000000000000000000000000014611e6a576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152604c60248201527f455243313135355061636b656442616c616e6365235f63616c6c6f6e4552433160448201527f313535426174636852656365697665643a20494e56414c49445f4f4e5f52454360648201527f454956455f4d4553534147450000000000000000000000000000000000000000608482015260a4016104c4565b505b505050505050565b611e818483836001612698565b611e8e8383836000612698565b604080518381526020810183905273ffffffffffffffffffffffffffffffffffffffff808616929087169133917fc3d58168c5ae7397731d063d5bbf3d657854427343f4c083240f7aacaa2d0f6291015b60405180910390a450505050565b611f0c8573ffffffffffffffffffffffffffffffffffffffff1661271f565b15611e6c5760008573ffffffffffffffffffffffffffffffffffffffff1663f23a6e6184338a8989886040518763ffffffff1660e01b8152600401611f55959493929190612ed4565b602060405180830381600088803b158015611f6f57600080fd5b5087f1158015611f83573d6000803e3d6000fd5b50505050506040513d601f19601f82011682018060405250810190611fa89190612c52565b90507fffffffff0000000000000000000000000000000000000000000000000000000081167ff23a6e610000000000000000000000000000000000000000000000000000000014611e6a576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152604760248201527f455243313135355061636b656442616c616e6365235f63616c6c6f6e4552433160448201527f31353552656365697665643a20494e56414c49445f4f4e5f524543454956455f60648201527f4d45535341474500000000000000000000000000000000000000000000000000608482015260a4016104c4565b6120ae8383836001612698565b604080518381526020810183905260009173ffffffffffffffffffffffffffffffffffffffff86169133917fc3d58168c5ae7397731d063d5bbf3d657854427343f4c083240f7aacaa2d0f62910160405180910390a4505050565b81518151811461219b576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603d60248201527f455243313135354d696e744275726e5061636b656442616c616e63652362617460448201527f63684275726e3a20494e56414c49445f4152524159535f4c454e47544800000060648201526084016104c4565b60005b8181101561224557612233858583815181106121e3577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b6020026020010151858481518110612224577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b60200260200101516001612698565b8061223d81613239565b91505061219e565b50600073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff167f4a39dc06d4c0dbc64b70af90fd698a233a518aa5d07e595d983b8c0526c8f7fb8686604051611edf929190612f37565b6000806122cb856020613165565b905060006122df60016401000000006131a2565b9050600084600181111561231c577f4e487b7100000000000000000000000000000000000000000000000000000000600052602160045260246000fd5b141561246c5761232e85831b88612fe2565b9250868310156123c0576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603260248201527f455243313135355061636b656442616c616e6365235f7669657755706461746560448201527f42696e56616c75653a204f564552464c4f57000000000000000000000000000060648201526084016104c4565b6123cc60206002613079565b6123da8689851c8416612fe2565b10612467576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603260248201527f455243313135355061636b656442616c616e6365235f7669657755706461746560448201527f42696e56616c75653a204f564552464c4f57000000000000000000000000000060648201526084016104c4565b61268e565b60018460018111156124a7577f4e487b7100000000000000000000000000000000000000000000000000000000600052602160045260246000fd5b14156125e0576124b985831b886131a2565b92508683111561254b576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603360248201527f455243313135355061636b656442616c616e6365235f7669657755706461746560448201527f42696e56616c75653a20554e444552464c4f570000000000000000000000000060648201526084016104c4565b84818389901c161015612467576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603360248201527f455243313135355061636b656442616c616e6365235f7669657755706461746560448201527f42696e56616c75653a20554e444552464c4f570000000000000000000000000060648201526084016104c4565b6040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152604560248201527f455243313135355061636b656442616c616e6365235f7669657755706461746560448201527f42696e56616c75653a20494e56414c49445f42494e5f57524954455f4f50455260648201527f4154494f4e000000000000000000000000000000000000000000000000000000608482015260a4016104c4565b5050949350505050565b6000806126a485610e3f565b73ffffffffffffffffffffffffffffffffffffffff881660009081526020818152604080832085845290915290205491935091506126e4908286866122bd565b73ffffffffffffffffffffffffffffffffffffffff909616600090815260208181526040808320948352939052919091209490945550505050565b6000813f801580159061275257507fc5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a4708114155b9392505050565b828054612765906131e5565b90600052602060002090601f01602090048101928261278757600085556127cd565b82601f106127a057805160ff19168380011785556127cd565b828001600101855582156127cd579182015b828111156127cd5782518255916020019190600101906127b2565b506127d99291506127dd565b5090565b5b808211156127d957600081556001016127de565b600067ffffffffffffffff83111561280c5761280c6132e4565b61283d60207fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0601f86011601612f6f565b905082815283838301111561285157600080fd5b828260208301376000602084830101529392505050565b803573ffffffffffffffffffffffffffffffffffffffff8116811461044257600080fd5b600082601f83011261289c578081fd5b813560206128b16128ac83612fbe565b612f6f565b80838252828201915082860187848660051b89010111156128d0578586fd5b855b858110156128ee578135845292840192908401906001016128d2565b5090979650505050505050565b600082601f83011261290b578081fd5b612752838335602085016127f2565b60006020828403121561292b578081fd5b61275282612868565b60008060408385031215612946578081fd5b61294f83612868565b915061295d60208401612868565b90509250929050565b600080600080600060a0868803121561297d578081fd5b61298686612868565b945061299460208701612868565b9350604086013567ffffffffffffffff808211156129b0578283fd5b6129bc89838a0161288c565b945060608801359150808211156129d1578283fd5b6129dd89838a0161288c565b935060808801359150808211156129f2578283fd5b506129ff888289016128fb565b9150509295509295909350565b600080600080600060a08688031215612a23578081fd5b612a2c86612868565b9450612a3a60208701612868565b93506040860135925060608601359150608086013567ffffffffffffffff811115612a63578182fd5b6129ff888289016128fb565b600080600060608486031215612a83578283fd5b612a8c84612868565b9250602084013567ffffffffffffffff80821115612aa8578384fd5b612ab48783880161288c565b93506040860135915080821115612ac9578283fd5b50612ad68682870161288c565b9150509250925092565b60008060408385031215612af2578182fd5b612afb83612868565b915060208301358015158114612b0f578182fd5b809150509250929050565b60008060408385031215612b2c578182fd5b612b3583612868565b946020939093013593505050565b600080600060608486031215612b57578081fd5b612b6084612868565b95602085013595506040909401359392505050565b60008060408385031215612b87578182fd5b823567ffffffffffffffff80821115612b9e578384fd5b818501915085601f830112612bb1578384fd5b81356020612bc16128ac83612fbe565b8083825282820191508286018a848660051b8901011115612be0578889fd5b8896505b84871015612c0957612bf581612868565b835260019690960195918301918301612be4565b5096505086013592505080821115612c1f578283fd5b50612c2c8582860161288c565b9150509250929050565b600060208284031215612c47578081fd5b813561275281613313565b600060208284031215612c63578081fd5b815161275281613313565b600060208284031215612c7f578081fd5b813567ffffffffffffffff811115612c95578182fd5b8201601f81018413612ca5578182fd5b612cb4848235602084016127f2565b949350505050565b600060208284031215612ccd578081fd5b5035919050565b60008060408385031215612ce6578182fd5b50508035926020909101359150565b6000815180845260208085019450808401835b83811015612d2457815187529582019590820190600101612d08565b509495945050505050565b60008151808452612d478160208601602086016131b9565b601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0169290920160200192915050565b60008151612d8b8185602086016131b9565b9290920192915050565b600080845482600182811c915080831680612db157607f831692505b6020808410821415612dea577f4e487b710000000000000000000000000000000000000000000000000000000087526022600452602487fd5b818015612dfe5760018114612e2d57612e59565b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00861689528489019650612e59565b60008b815260209020885b86811015612e515781548b820152908501908301612e38565b505084890196505b50505050505061038d8185612d79565b600073ffffffffffffffffffffffffffffffffffffffff808816835280871660208401525060a06040830152612ea260a0830186612cf5565b8281036060840152612eb48186612cf5565b90508281036080840152612ec88185612d2f565b98975050505050505050565b600073ffffffffffffffffffffffffffffffffffffffff808816835280871660208401525084604083015283606083015260a06080830152612f1960a0830184612d2f565b979650505050505050565b6000602082526127526020830184612cf5565b600060408252612f4a6040830185612cf5565b828103602084015261038d8185612cf5565b6000602082526127526020830184612d2f565b604051601f82017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe016810167ffffffffffffffff81118282101715612fb657612fb66132e4565b604052919050565b600067ffffffffffffffff821115612fd857612fd86132e4565b5060051b60200190565b60008219821115612ff557612ff5613286565b500190565b600060ff821660ff84168060ff0382111561301757613017613286565b019392505050565b60008261302e5761302e6132b5565b500490565b80825b60018086116130455750613070565b81870482111561305757613057613286565b8086161561306457918102915b9490941c938002613036565b94509492505050565b60006127527fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff84846000826130b057506001612752565b816130bd57506000612752565b81600181146130d357600281146130dd5761310a565b6001915050612752565b60ff8411156130ee576130ee613286565b6001841b91508482111561310457613104613286565b50612752565b5060208310610133831016604e8410600b841016171561313d575081810a8381111561313857613138613286565b612752565b61314a8484846001613033565b80860482111561315c5761315c613286565b02949350505050565b6000817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff048311821515161561319d5761319d613286565b500290565b6000828210156131b4576131b4613286565b500390565b60005b838110156131d45781810151838201526020016131bc565b838111156115065750506000910152565b600181811c908216806131f957607f821691505b60208210811415613233577f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b50919050565b60007fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff82141561326b5761326b613286565b5060010190565b600082613281576132816132b5565b500690565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b7fffffffff000000000000000000000000000000000000000000000000000000008116811461334157600080fd5b5056fea2646970667358221220ce6a36360efef742b47fa037fc5bf88afb7a3e2a79d84aca3265c27e7a4e942d64736f6c634300080300330000000000000000000000000000000000000000000000000000000000000020000000000000000000000000000000000000000000000000000000000000004268747470733a2f2f75732d63656e7472616c312d72656e66742d6e6674732d6d6574612e636c6f756466756e6374696f6e732e6e65742f6765744d6574613f69643d000000000000000000000000000000000000000000000000000000000000

Deployed Bytecode

0x608060405234801561001057600080fd5b50600436106101355760003560e01c80638da5cb5b116100b2578063e985e9c511610081578063f242432a11610066578063f242432a14610308578063f5298aca1461031b578063f6eb127a1461032e57610135565b8063e985e9c5146102ac578063eaec5f81146102f557610135565b80638da5cb5b14610219578063a22cb4651461025e578063a6f9dae114610271578063db90e83c1461028457610135565b8063156e29f61161010957806339a0c6f9116100ee57806339a0c6f9146101de5780634e1273f4146101f15780636c0360eb1461021157610135565b8063156e29f6146101b85780632eb2c2d6146101cb57610135565b8062fdd58e1461013a57806301ffc9a7146101605780630ca83480146101835780630e89341c14610198575b600080fd5b61014d610148366004612b1a565b610341565b6040519081526020015b60405180910390f35b61017361016e366004612c36565b610396565b6040519015158152602001610157565b610196610191366004612a6f565b610447565b005b6101ab6101a6366004612cbc565b6104ed565b6040516101579190612f5c565b6101966101c6366004612b43565b610521565b6101966101d9366004612966565b6105bd565b6101966101ec366004612c6e565b610761565b6102046101ff366004612b75565b6107f9565b6040516101579190612f24565b6101ab610c52565b6002546102399073ffffffffffffffffffffffffffffffffffffffff1681565b60405173ffffffffffffffffffffffffffffffffffffffff9091168152602001610157565b61019661026c366004612ae0565b610ce0565b61019661027f36600461291a565b610d77565b610297610292366004612cbc565b610e3f565b60408051928352602083019190915201610157565b6101736102ba366004612934565b73ffffffffffffffffffffffffffffffffffffffff918216600090815260016020908152604080832093909416825291909152205460ff1690565b61014d610303366004612cd4565b610e79565b610196610316366004612a0c565b610ea7565b610196610329366004612b43565b611044565b61019661033c366004612a6f565b6110d0565b600080600061034f84610e3f565b73ffffffffffffffffffffffffffffffffffffffff8716600090815260208181526040808320858452909152902054919350915061038d9082610e79565b95945050505050565b60007fffffffff0000000000000000000000000000000000000000000000000000000082167fd9b67a2600000000000000000000000000000000000000000000000000000000148061042957507fffffffff0000000000000000000000000000000000000000000000000000000082167f0e89341c00000000000000000000000000000000000000000000000000000000145b1561043657506001610442565b61043f8261115c565b90505b919050565b60025473ffffffffffffffffffffffffffffffffffffffff1633146104cd576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600b60248201527f6e6f7420616c6c6f77656400000000000000000000000000000000000000000060448201526064015b60405180910390fd5b6104e8838383604051806020016040528060008152506111fa565b505050565b606060036104fa8361150c565b60405160200161050b929190612d95565b6040516020818303038152906040529050919050565b60025473ffffffffffffffffffffffffffffffffffffffff1633146105a2576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600b60248201527f6e6f7420616c6c6f77656400000000000000000000000000000000000000000060448201526064016104c4565b6104e8838383604051806020016040528060008152506116b8565b3373ffffffffffffffffffffffffffffffffffffffff86161480610611575073ffffffffffffffffffffffffffffffffffffffff8516600090815260016020908152604080832033845290915290205460ff165b61069d576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603c60248201527f455243313135355061636b656442616c616e636523736166654261746368547260448201527f616e7366657246726f6d3a20494e56414c49445f4f50455241544f520000000060648201526084016104c4565b73ffffffffffffffffffffffffffffffffffffffff8416610740576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603d60248201527f455243313135355061636b656442616c616e636523736166654261746368547260448201527f616e7366657246726f6d3a20494e56414c49445f524543495049454e5400000060648201526084016104c4565b61074c8585858561172a565b61075a858585855a86611cb6565b5050505050565b60025473ffffffffffffffffffffffffffffffffffffffff1633146107e2576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600b60248201527f6e6f7420616c6c6f77656400000000000000000000000000000000000000000060448201526064016104c4565b80516107f5906003906020840190612759565b5050565b8151815160609190811461088f576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603960248201527f455243313135355061636b656442616c616e63652362616c616e63654f66426160448201527f7463683a20494e56414c49445f41525241595f4c454e4754480000000000000060648201526084016104c4565b6000806108dc856000815181106108cf577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b6020026020010151610e3f565b9150915060008060008860008151811061091f577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b602002602001015173ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000848152602001908152602001600020549050600083905060008567ffffffffffffffff8111156109bc577f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b6040519080825280602002602001820160405280156109e5578160200160208202803683370190505b5090506109f28385610e79565b81600081518110610a2c577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b602090810291909101015260015b86811015610c4557610a7e8982815181106108cf577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b90965094508286141580610b4a5750898181518110610ac6577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b602002602001015173ffffffffffffffffffffffffffffffffffffffff168a600183610af291906131a2565b81518110610b29577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b602002602001015173ffffffffffffffffffffffffffffffffffffffff1614155b15610be5576000808b8381518110610b8b577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b602002602001015173ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008781526020019081526020016000205493508592505b610bef8486610e79565b828281518110610c28577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b602090810291909101015280610c3d81613239565b915050610a3a565b5098975050505050505050565b60038054610c5f906131e5565b80601f0160208091040260200160405190810160405280929190818152602001828054610c8b906131e5565b8015610cd85780601f10610cad57610100808354040283529160200191610cd8565b820191906000526020600020905b815481529060010190602001808311610cbb57829003601f168201915b505050505081565b33600081815260016020908152604080832073ffffffffffffffffffffffffffffffffffffffff87168085529083529281902080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff001686151590811790915590519081529192917f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31910160405180910390a35050565b60025473ffffffffffffffffffffffffffffffffffffffff163314610df8576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600b60248201527f6e6f7420616c6c6f77656400000000000000000000000000000000000000000060448201526064016104c4565b600280547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff92909216919091179055565b600080610e4f602061010061301f565b610e59908461301f565b9150610e68602061010061301f565b610e729084613272565b9050915091565b600080610e8c60016401000000006131a2565b90506000610e9b846020613165565b9490941c169392505050565b3373ffffffffffffffffffffffffffffffffffffffff86161480610efb575073ffffffffffffffffffffffffffffffffffffffff8516600090815260016020908152604080832033845290915290205460ff165b610f87576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603760248201527f455243313135355061636b656442616c616e636523736166655472616e73666560448201527f7246726f6d3a20494e56414c49445f4f50455241544f5200000000000000000060648201526084016104c4565b73ffffffffffffffffffffffffffffffffffffffff841661102a576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603860248201527f455243313135355061636b656442616c616e636523736166655472616e73666560448201527f7246726f6d3a20494e56414c49445f524543495049454e54000000000000000060648201526084016104c4565b61103685858585611e74565b61075a858585855a86611eed565b60025473ffffffffffffffffffffffffffffffffffffffff1633146110c5576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600b60248201527f6e6f7420616c6c6f77656400000000000000000000000000000000000000000060448201526064016104c4565b6104e88383836120a1565b60025473ffffffffffffffffffffffffffffffffffffffff163314611151576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600b60248201527f6e6f7420616c6c6f77656400000000000000000000000000000000000000000060448201526064016104c4565b6104e8838383612109565b60007fffffffff0000000000000000000000000000000000000000000000000000000082167fd9b67a260000000000000000000000000000000000000000000000000000000014156111b057506001610442565b7f01ffc9a7000000000000000000000000000000000000000000000000000000007fffffffff0000000000000000000000000000000000000000000000000000000083161461043f565b815183511461128b576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603e60248201527f455243313135354d696e744275726e5061636b656442616c616e6365235f626160448201527f7463684d696e743a20494e56414c49445f4152524159535f4c454e475448000060648201526084016104c4565b825115611478576000806112d2856000815181106108cf577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b73ffffffffffffffffffffffffffffffffffffffff88166000908152602081815260408083208584529091528120548751939550919350916113579190849088908590611348577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b602002602001015160006122bd565b86519091508360015b8281101561143f576113a48982815181106108cf577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b90965094508186146113ed5773ffffffffffffffffffffffffffffffffffffffff8a16600090815260208181526040808320948352939052828120949094558584529220549184905b61142b84868a8481518110611348577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b93508061143781613239565b915050611360565b50505073ffffffffffffffffffffffffffffffffffffffff87166000908152602081815260408083209583529490529290922091909155505b8373ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff167f4a39dc06d4c0dbc64b70af90fd698a233a518aa5d07e595d983b8c0526c8f7fb86866040516114ef929190612f37565b60405180910390a461150660008585855a86611cb6565b50505050565b60608161154d575060408051808201909152600181527f30000000000000000000000000000000000000000000000000000000000000006020820152610442565b8160005b8115611577578061156181613239565b91506115709050600a8361301f565b9150611551565b60008167ffffffffffffffff8111156115b9577f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b6040519080825280601f01601f1916602001820160405280156115e3576020820181803683370190505b509050815b85156116af576115f96001826131a2565b90506000611608600a8861301f565b61161390600a613165565b61161d90886131a2565b611628906030612ffa565b905060008160f81b90508084848151811061166c577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a9053506116a6600a8961301f565b975050506115e8565b50949350505050565b6116c58484846000612698565b604080518481526020810184905273ffffffffffffffffffffffffffffffffffffffff86169160009133917fc3d58168c5ae7397731d063d5bbf3d657854427343f4c083240f7aacaa2d0f62910160405180910390a461150660008585855a86611eed565b8151815181146117e2576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152604260248201527f455243313135355061636b656442616c616e6365235f7361666542617463685460448201527f72616e7366657246726f6d3a20494e56414c49445f4152524159535f4c454e4760648201527f5448000000000000000000000000000000000000000000000000000000000000608482015260a4016104c4565b8373ffffffffffffffffffffffffffffffffffffffff168573ffffffffffffffffffffffffffffffffffffffff161415801561181e5750600081115b15611af957600080611863856000815181106108cf577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b73ffffffffffffffffffffffffffffffffffffffff89166000908152602081815260408083208584529091528120548751939550919350916118e891908490889085906118d9577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b602002602001015160016122bd565b73ffffffffffffffffffffffffffffffffffffffff88166000908152602081815260408083208784529091528120548751929350909161195c9190859089908590611348577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b90508360015b86811015611aa7576119a68982815181106108cf577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b9096509450818614611a155773ffffffffffffffffffffffffffffffffffffffff8b811660009081526020818152604080832086845280835281842098909855928d16825281815282822094825284815282822095909555878152948452808520549290935291909220549084905b611a5384868a84815181106118d9577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b9350611a9383868a8481518110611348577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b925080611a9f81613239565b915050611962565b505073ffffffffffffffffffffffffffffffffffffffff808a16600090815260208181526040808320888452825280832095909555918a16815280825283812095815294905292209190915550611c31565b60005b81811015611c2f57828181518110611b3d577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b6020026020010151611b8f87868481518110611b82577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b6020026020010151610341565b1015611c1d576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603660248201527f455243313135355061636b656442616c616e6365235f7361666542617463685460448201527f72616e7366657246726f6d3a20554e444552464c4f570000000000000000000060648201526084016104c4565b80611c2781613239565b915050611afc565b505b8373ffffffffffffffffffffffffffffffffffffffff168573ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff167f4a39dc06d4c0dbc64b70af90fd698a233a518aa5d07e595d983b8c0526c8f7fb8686604051611ca7929190612f37565b60405180910390a45050505050565b611cd58573ffffffffffffffffffffffffffffffffffffffff1661271f565b15611e6c5760008573ffffffffffffffffffffffffffffffffffffffff1663bc197c8184338a8989886040518763ffffffff1660e01b8152600401611d1e959493929190612e69565b602060405180830381600088803b158015611d3857600080fd5b5087f1158015611d4c573d6000803e3d6000fd5b50505050506040513d601f19601f82011682018060405250810190611d719190612c52565b90507fffffffff0000000000000000000000000000000000000000000000000000000081167fbc197c810000000000000000000000000000000000000000000000000000000014611e6a576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152604c60248201527f455243313135355061636b656442616c616e6365235f63616c6c6f6e4552433160448201527f313535426174636852656365697665643a20494e56414c49445f4f4e5f52454360648201527f454956455f4d4553534147450000000000000000000000000000000000000000608482015260a4016104c4565b505b505050505050565b611e818483836001612698565b611e8e8383836000612698565b604080518381526020810183905273ffffffffffffffffffffffffffffffffffffffff808616929087169133917fc3d58168c5ae7397731d063d5bbf3d657854427343f4c083240f7aacaa2d0f6291015b60405180910390a450505050565b611f0c8573ffffffffffffffffffffffffffffffffffffffff1661271f565b15611e6c5760008573ffffffffffffffffffffffffffffffffffffffff1663f23a6e6184338a8989886040518763ffffffff1660e01b8152600401611f55959493929190612ed4565b602060405180830381600088803b158015611f6f57600080fd5b5087f1158015611f83573d6000803e3d6000fd5b50505050506040513d601f19601f82011682018060405250810190611fa89190612c52565b90507fffffffff0000000000000000000000000000000000000000000000000000000081167ff23a6e610000000000000000000000000000000000000000000000000000000014611e6a576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152604760248201527f455243313135355061636b656442616c616e6365235f63616c6c6f6e4552433160448201527f31353552656365697665643a20494e56414c49445f4f4e5f524543454956455f60648201527f4d45535341474500000000000000000000000000000000000000000000000000608482015260a4016104c4565b6120ae8383836001612698565b604080518381526020810183905260009173ffffffffffffffffffffffffffffffffffffffff86169133917fc3d58168c5ae7397731d063d5bbf3d657854427343f4c083240f7aacaa2d0f62910160405180910390a4505050565b81518151811461219b576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603d60248201527f455243313135354d696e744275726e5061636b656442616c616e63652362617460448201527f63684275726e3a20494e56414c49445f4152524159535f4c454e47544800000060648201526084016104c4565b60005b8181101561224557612233858583815181106121e3577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b6020026020010151858481518110612224577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b60200260200101516001612698565b8061223d81613239565b91505061219e565b50600073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff167f4a39dc06d4c0dbc64b70af90fd698a233a518aa5d07e595d983b8c0526c8f7fb8686604051611edf929190612f37565b6000806122cb856020613165565b905060006122df60016401000000006131a2565b9050600084600181111561231c577f4e487b7100000000000000000000000000000000000000000000000000000000600052602160045260246000fd5b141561246c5761232e85831b88612fe2565b9250868310156123c0576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603260248201527f455243313135355061636b656442616c616e6365235f7669657755706461746560448201527f42696e56616c75653a204f564552464c4f57000000000000000000000000000060648201526084016104c4565b6123cc60206002613079565b6123da8689851c8416612fe2565b10612467576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603260248201527f455243313135355061636b656442616c616e6365235f7669657755706461746560448201527f42696e56616c75653a204f564552464c4f57000000000000000000000000000060648201526084016104c4565b61268e565b60018460018111156124a7577f4e487b7100000000000000000000000000000000000000000000000000000000600052602160045260246000fd5b14156125e0576124b985831b886131a2565b92508683111561254b576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603360248201527f455243313135355061636b656442616c616e6365235f7669657755706461746560448201527f42696e56616c75653a20554e444552464c4f570000000000000000000000000060648201526084016104c4565b84818389901c161015612467576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603360248201527f455243313135355061636b656442616c616e6365235f7669657755706461746560448201527f42696e56616c75653a20554e444552464c4f570000000000000000000000000060648201526084016104c4565b6040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152604560248201527f455243313135355061636b656442616c616e6365235f7669657755706461746560448201527f42696e56616c75653a20494e56414c49445f42494e5f57524954455f4f50455260648201527f4154494f4e000000000000000000000000000000000000000000000000000000608482015260a4016104c4565b5050949350505050565b6000806126a485610e3f565b73ffffffffffffffffffffffffffffffffffffffff881660009081526020818152604080832085845290915290205491935091506126e4908286866122bd565b73ffffffffffffffffffffffffffffffffffffffff909616600090815260208181526040808320948352939052919091209490945550505050565b6000813f801580159061275257507fc5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a4708114155b9392505050565b828054612765906131e5565b90600052602060002090601f01602090048101928261278757600085556127cd565b82601f106127a057805160ff19168380011785556127cd565b828001600101855582156127cd579182015b828111156127cd5782518255916020019190600101906127b2565b506127d99291506127dd565b5090565b5b808211156127d957600081556001016127de565b600067ffffffffffffffff83111561280c5761280c6132e4565b61283d60207fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0601f86011601612f6f565b905082815283838301111561285157600080fd5b828260208301376000602084830101529392505050565b803573ffffffffffffffffffffffffffffffffffffffff8116811461044257600080fd5b600082601f83011261289c578081fd5b813560206128b16128ac83612fbe565b612f6f565b80838252828201915082860187848660051b89010111156128d0578586fd5b855b858110156128ee578135845292840192908401906001016128d2565b5090979650505050505050565b600082601f83011261290b578081fd5b612752838335602085016127f2565b60006020828403121561292b578081fd5b61275282612868565b60008060408385031215612946578081fd5b61294f83612868565b915061295d60208401612868565b90509250929050565b600080600080600060a0868803121561297d578081fd5b61298686612868565b945061299460208701612868565b9350604086013567ffffffffffffffff808211156129b0578283fd5b6129bc89838a0161288c565b945060608801359150808211156129d1578283fd5b6129dd89838a0161288c565b935060808801359150808211156129f2578283fd5b506129ff888289016128fb565b9150509295509295909350565b600080600080600060a08688031215612a23578081fd5b612a2c86612868565b9450612a3a60208701612868565b93506040860135925060608601359150608086013567ffffffffffffffff811115612a63578182fd5b6129ff888289016128fb565b600080600060608486031215612a83578283fd5b612a8c84612868565b9250602084013567ffffffffffffffff80821115612aa8578384fd5b612ab48783880161288c565b93506040860135915080821115612ac9578283fd5b50612ad68682870161288c565b9150509250925092565b60008060408385031215612af2578182fd5b612afb83612868565b915060208301358015158114612b0f578182fd5b809150509250929050565b60008060408385031215612b2c578182fd5b612b3583612868565b946020939093013593505050565b600080600060608486031215612b57578081fd5b612b6084612868565b95602085013595506040909401359392505050565b60008060408385031215612b87578182fd5b823567ffffffffffffffff80821115612b9e578384fd5b818501915085601f830112612bb1578384fd5b81356020612bc16128ac83612fbe565b8083825282820191508286018a848660051b8901011115612be0578889fd5b8896505b84871015612c0957612bf581612868565b835260019690960195918301918301612be4565b5096505086013592505080821115612c1f578283fd5b50612c2c8582860161288c565b9150509250929050565b600060208284031215612c47578081fd5b813561275281613313565b600060208284031215612c63578081fd5b815161275281613313565b600060208284031215612c7f578081fd5b813567ffffffffffffffff811115612c95578182fd5b8201601f81018413612ca5578182fd5b612cb4848235602084016127f2565b949350505050565b600060208284031215612ccd578081fd5b5035919050565b60008060408385031215612ce6578182fd5b50508035926020909101359150565b6000815180845260208085019450808401835b83811015612d2457815187529582019590820190600101612d08565b509495945050505050565b60008151808452612d478160208601602086016131b9565b601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0169290920160200192915050565b60008151612d8b8185602086016131b9565b9290920192915050565b600080845482600182811c915080831680612db157607f831692505b6020808410821415612dea577f4e487b710000000000000000000000000000000000000000000000000000000087526022600452602487fd5b818015612dfe5760018114612e2d57612e59565b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00861689528489019650612e59565b60008b815260209020885b86811015612e515781548b820152908501908301612e38565b505084890196505b50505050505061038d8185612d79565b600073ffffffffffffffffffffffffffffffffffffffff808816835280871660208401525060a06040830152612ea260a0830186612cf5565b8281036060840152612eb48186612cf5565b90508281036080840152612ec88185612d2f565b98975050505050505050565b600073ffffffffffffffffffffffffffffffffffffffff808816835280871660208401525084604083015283606083015260a06080830152612f1960a0830184612d2f565b979650505050505050565b6000602082526127526020830184612cf5565b600060408252612f4a6040830185612cf5565b828103602084015261038d8185612cf5565b6000602082526127526020830184612d2f565b604051601f82017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe016810167ffffffffffffffff81118282101715612fb657612fb66132e4565b604052919050565b600067ffffffffffffffff821115612fd857612fd86132e4565b5060051b60200190565b60008219821115612ff557612ff5613286565b500190565b600060ff821660ff84168060ff0382111561301757613017613286565b019392505050565b60008261302e5761302e6132b5565b500490565b80825b60018086116130455750613070565b81870482111561305757613057613286565b8086161561306457918102915b9490941c938002613036565b94509492505050565b60006127527fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff84846000826130b057506001612752565b816130bd57506000612752565b81600181146130d357600281146130dd5761310a565b6001915050612752565b60ff8411156130ee576130ee613286565b6001841b91508482111561310457613104613286565b50612752565b5060208310610133831016604e8410600b841016171561313d575081810a8381111561313857613138613286565b612752565b61314a8484846001613033565b80860482111561315c5761315c613286565b02949350505050565b6000817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff048311821515161561319d5761319d613286565b500290565b6000828210156131b4576131b4613286565b500390565b60005b838110156131d45781810151838201526020016131bc565b838111156115065750506000910152565b600181811c908216806131f957607f821691505b60208210811415613233577f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b50919050565b60007fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff82141561326b5761326b613286565b5060010190565b600082613281576132816132b5565b500690565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b7fffffffff000000000000000000000000000000000000000000000000000000008116811461334157600080fd5b5056fea2646970667358221220ce6a36360efef742b47fa037fc5bf88afb7a3e2a79d84aca3265c27e7a4e942d64736f6c63430008030033

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

0000000000000000000000000000000000000000000000000000000000000020000000000000000000000000000000000000000000000000000000000000004268747470733a2f2f75732d63656e7472616c312d72656e66742d6e6674732d6d6574612e636c6f756466756e6374696f6e732e6e65742f6765744d6574613f69643d000000000000000000000000000000000000000000000000000000000000

-----Decoded View---------------
Arg [0] : _baseURI (string): https://us-central1-renft-nfts-meta.cloudfunctions.net/getMeta?id=

-----Encoded View---------------
5 Constructor Arguments found :
Arg [0] : 0000000000000000000000000000000000000000000000000000000000000020
Arg [1] : 0000000000000000000000000000000000000000000000000000000000000042
Arg [2] : 68747470733a2f2f75732d63656e7472616c312d72656e66742d6e6674732d6d
Arg [3] : 6574612e636c6f756466756e6374696f6e732e6e65742f6765744d6574613f69
Arg [4] : 643d000000000000000000000000000000000000000000000000000000000000


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.