Contract 0x3b5f8b1c2752634197f3ba77e770229f67f1fa35

Contract Overview

Balance:
0 FTM
Txn Hash Method
Block
From
To
Value [Txn Fee]
0x758b51106c8f5cf00878081b6a571c2b1c0a5e696e0f9514914e02b601bf60640x6080604098673272022-07-25 14:44:0371 days 5 hrs ago0x97ea4a24535b5b52c3e15912071f469ac2ebcfb7 IN  Contract Creation0 FTM0.002006862491
[ Download CSV Export 
Latest 1 internal transaction
Parent Txn Hash Block From To Value
0x758b51106c8f5cf00878081b6a571c2b1c0a5e696e0f9514914e02b601bf606498673272022-07-25 14:44:0371 days 5 hrs ago 0x97ea4a24535b5b52c3e15912071f469ac2ebcfb7  Contract Creation0 FTM
[ Download CSV Export 
Loading

Similar Match Source Code
Note: This contract matches the deployed ByteCode of the Source Code for Contract 0x7e4F7003ad337aa1017012c2ea18962dc3e226A6

Contract Name:
FantomArtTradablePrivate

Compiler Version
v0.6.12+commit.27d51765

Optimization Enabled:
Yes with 200 runs

Other Settings:
default evmVersion, GNU GPLv3 license

Contract Source Code (Solidity)

/**
 *Submitted for verification at FtmScan.com on 2021-10-13
*/

pragma solidity 0.6.12;


// SPDX-License-Identifier: MIT
/*
 * @dev Provides information about the current execution context, including the
 * sender of the transaction and its data. While these are generally available
 * via msg.sender and msg.data, they should not be accessed in such a direct
 * manner, since when dealing with GSN meta-transactions the account sending and
 * paying for execution may not be the actual sender (as far as an application
 * is concerned).
 *
 * This contract is only required for intermediate, library-like contracts.
 */
abstract contract Context {
    function _msgSender() internal view virtual returns (address payable) {
        return msg.sender;
    }

    function _msgData() internal view virtual returns (bytes memory) {
        this; // silence state mutability warning without generating bytecode - see https://github.com/ethereum/solidity/issues/2691
        return msg.data;
    }
}

/**
 * @dev Contract module which provides a basic access control mechanism, where
 * there is an account (an owner) that can be granted exclusive access to
 * specific functions.
 *
 * By default, the owner account will be the one that deploys the contract. This
 * can later be changed with {transferOwnership}.
 *
 * This module is used through inheritance. It will make available the modifier
 * `onlyOwner`, which can be applied to your functions to restrict their use to
 * the owner.
 */
abstract contract Ownable is Context {
    address private _owner;

    event OwnershipTransferred(address indexed previousOwner, address indexed newOwner);

    /**
     * @dev Initializes the contract setting the deployer as the initial owner.
     */
    constructor () internal {
        address msgSender = _msgSender();
        _owner = msgSender;
        emit OwnershipTransferred(address(0), msgSender);
    }

    /**
     * @dev Returns the address of the current owner.
     */
    function owner() public view virtual returns (address) {
        return _owner;
    }

    /**
     * @dev Throws if called by any account other than the owner.
     */
    modifier onlyOwner() {
        require(owner() == _msgSender(), "Ownable: caller is not the owner");
        _;
    }

    /**
     * @dev Leaves the contract without owner. It will not be possible to call
     * `onlyOwner` functions anymore. Can only be called by the current owner.
     *
     * NOTE: Renouncing ownership will leave the contract without an owner,
     * thereby removing any functionality that is only available to the owner.
     */
    function renounceOwnership() public virtual onlyOwner {
        emit OwnershipTransferred(_owner, address(0));
        _owner = address(0);
    }

    /**
     * @dev Transfers ownership of the contract to a new account (`newOwner`).
     * Can only be called by the current owner.
     */
    function transferOwnership(address newOwner) public virtual onlyOwner {
        require(newOwner != address(0), "Ownable: new owner is the zero address");
        emit OwnershipTransferred(_owner, newOwner);
        _owner = newOwner;
    }
}

/**
 * @title ERC165
 * @dev https://github.com/ethereum/EIPs/blob/master/EIPS/eip-165.md
 */
interface IERC165 {

    /**
     * @notice Query if a contract implements an interface
     * @dev Interface identification is specified in ERC-165. This function
     * uses less than 30,000 gas
     * @param _interfaceId The interface identifier, as specified in ERC-165
     */
    function supportsInterface(bytes4 _interfaceId)
    external
    view
    returns (bool);
}

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

  /**
   * @notice Indicates whether a contract implements the `ERC1155TokenReceiver` functions and so can accept ERC1155 token types.
   * @param  interfaceID The ERC-165 interface ID that is queried for support.s
   * @dev This function MUST return true if it implements the ERC1155TokenReceiver interface and ERC-165 interface.
   *      This function MUST NOT consume more than 5,000 gas.
   * @return Wheter ERC-165 or ERC1155TokenReceiver interfaces are supported.
   */
  function supportsInterface(bytes4 interfaceID) external view returns (bool);

}

/**
 * @dev Collection of functions related to the address type
 */
library Address {
    /**
     * @dev Returns true if `account` is a contract.
     *
     * [IMPORTANT]
     * ====
     * It is unsafe to assume that an address for which this function returns
     * false is an externally-owned account (EOA) and not a contract.
     *
     * Among others, `isContract` will return false for the following
     * types of addresses:
     *
     *  - an externally-owned account
     *  - a contract in construction
     *  - an address where a contract will be created
     *  - an address where a contract lived, but was destroyed
     * ====
     */
    function isContract(address account) internal view returns (bool) {
        // This method relies on extcodesize, which returns 0 for contracts in
        // construction, since the code is only stored at the end of the
        // constructor execution.

        uint256 size;
        // solhint-disable-next-line no-inline-assembly
        assembly { size := extcodesize(account) }
        return size > 0;
    }

    /**
     * @dev Replacement for Solidity's `transfer`: sends `amount` wei to
     * `recipient`, forwarding all available gas and reverting on errors.
     *
     * https://eips.ethereum.org/EIPS/eip-1884[EIP1884] increases the gas cost
     * of certain opcodes, possibly making contracts go over the 2300 gas limit
     * imposed by `transfer`, making them unable to receive funds via
     * `transfer`. {sendValue} removes this limitation.
     *
     * https://diligence.consensys.net/posts/2019/09/stop-using-soliditys-transfer-now/[Learn more].
     *
     * IMPORTANT: because control is transferred to `recipient`, care must be
     * taken to not create reentrancy vulnerabilities. Consider using
     * {ReentrancyGuard} or the
     * https://solidity.readthedocs.io/en/v0.5.11/security-considerations.html#use-the-checks-effects-interactions-pattern[checks-effects-interactions pattern].
     */
    function sendValue(address payable recipient, uint256 amount) internal {
        require(address(this).balance >= amount, "Address: insufficient balance");

        // solhint-disable-next-line avoid-low-level-calls, avoid-call-value
        (bool success, ) = recipient.call{ value: amount }("");
        require(success, "Address: unable to send value, recipient may have reverted");
    }

    /**
     * @dev Performs a Solidity function call using a low level `call`. A
     * plain`call` is an unsafe replacement for a function call: use this
     * function instead.
     *
     * If `target` reverts with a revert reason, it is bubbled up by this
     * function (like regular Solidity function calls).
     *
     * Returns the raw returned data. To convert to the expected return value,
     * use https://solidity.readthedocs.io/en/latest/units-and-global-variables.html?highlight=abi.decode#abi-encoding-and-decoding-functions[`abi.decode`].
     *
     * Requirements:
     *
     * - `target` must be a contract.
     * - calling `target` with `data` must not revert.
     *
     * _Available since v3.1._
     */
    function functionCall(address target, bytes memory data) internal returns (bytes memory) {
      return functionCall(target, data, "Address: low-level call failed");
    }

    /**
     * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], but with
     * `errorMessage` as a fallback revert reason when `target` reverts.
     *
     * _Available since v3.1._
     */
    function functionCall(address target, bytes memory data, string memory errorMessage) internal returns (bytes memory) {
        return functionCallWithValue(target, data, 0, errorMessage);
    }

    /**
     * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`],
     * but also transferring `value` wei to `target`.
     *
     * Requirements:
     *
     * - the calling contract must have an ETH balance of at least `value`.
     * - the called Solidity function must be `payable`.
     *
     * _Available since v3.1._
     */
    function functionCallWithValue(address target, bytes memory data, uint256 value) internal returns (bytes memory) {
        return functionCallWithValue(target, data, value, "Address: low-level call with value failed");
    }

    /**
     * @dev Same as {xref-Address-functionCallWithValue-address-bytes-uint256-}[`functionCallWithValue`], but
     * with `errorMessage` as a fallback revert reason when `target` reverts.
     *
     * _Available since v3.1._
     */
    function functionCallWithValue(address target, bytes memory data, uint256 value, string memory errorMessage) internal returns (bytes memory) {
        require(address(this).balance >= value, "Address: insufficient balance for call");
        require(isContract(target), "Address: call to non-contract");

        // solhint-disable-next-line avoid-low-level-calls
        (bool success, bytes memory returndata) = target.call{ value: value }(data);
        return _verifyCallResult(success, returndata, errorMessage);
    }

    /**
     * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`],
     * but performing a static call.
     *
     * _Available since v3.3._
     */
    function functionStaticCall(address target, bytes memory data) internal view returns (bytes memory) {
        return functionStaticCall(target, data, "Address: low-level static call failed");
    }

    /**
     * @dev Same as {xref-Address-functionCall-address-bytes-string-}[`functionCall`],
     * but performing a static call.
     *
     * _Available since v3.3._
     */
    function functionStaticCall(address target, bytes memory data, string memory errorMessage) internal view returns (bytes memory) {
        require(isContract(target), "Address: static call to non-contract");

        // solhint-disable-next-line avoid-low-level-calls
        (bool success, bytes memory returndata) = target.staticcall(data);
        return _verifyCallResult(success, returndata, errorMessage);
    }

    /**
     * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`],
     * but performing a delegate call.
     *
     * _Available since v3.4._
     */
    function functionDelegateCall(address target, bytes memory data) internal returns (bytes memory) {
        return functionDelegateCall(target, data, "Address: low-level delegate call failed");
    }

    /**
     * @dev Same as {xref-Address-functionCall-address-bytes-string-}[`functionCall`],
     * but performing a delegate call.
     *
     * _Available since v3.4._
     */
    function functionDelegateCall(address target, bytes memory data, string memory errorMessage) internal returns (bytes memory) {
        require(isContract(target), "Address: delegate call to non-contract");

        // solhint-disable-next-line avoid-low-level-calls
        (bool success, bytes memory returndata) = target.delegatecall(data);
        return _verifyCallResult(success, returndata, errorMessage);
    }

    function _verifyCallResult(bool success, bytes memory returndata, string memory errorMessage) private pure returns(bytes memory) {
        if (success) {
            return returndata;
        } else {
            // Look for revert reason and bubble it up if present
            if (returndata.length > 0) {
                // The easiest way to bubble the revert reason is using memory via assembly

                // solhint-disable-next-line no-inline-assembly
                assembly {
                    let returndata_size := mload(returndata)
                    revert(add(32, returndata), returndata_size)
                }
            } else {
                revert(errorMessage);
            }
        }
    }
}

/**
 * @dev Wrappers over Solidity's arithmetic operations with added overflow
 * checks.
 *
 * Arithmetic operations in Solidity wrap on overflow. This can easily result
 * in bugs, because programmers usually assume that an overflow raises an
 * error, which is the standard behavior in high level programming languages.
 * `SafeMath` restores this intuition by reverting the transaction when an
 * operation overflows.
 *
 * Using this library instead of the unchecked operations eliminates an entire
 * class of bugs, so it's recommended to use it always.
 */
library SafeMath {
    /**
     * @dev Returns the addition of two unsigned integers, reverting on
     * overflow.
     *
     * Counterpart to Solidity's `+` operator.
     *
     * Requirements:
     * - Addition cannot overflow.
     */
    function add(uint256 a, uint256 b) internal pure returns (uint256) {
        uint256 c = a + b;
        require(c >= a, "SafeMath: addition overflow");

        return c;
    }

    /**
     * @dev Returns the subtraction of two unsigned integers, reverting on
     * overflow (when the result is negative).
     *
     * Counterpart to Solidity's `-` operator.
     *
     * Requirements:
     * - Subtraction cannot overflow.
     */
    function sub(uint256 a, uint256 b) internal pure returns (uint256) {
        return sub(a, b, "SafeMath: subtraction overflow");
    }

    /**
     * @dev Returns the subtraction of two unsigned integers, reverting with custom message on
     * overflow (when the result is negative).
     *
     * Counterpart to Solidity's `-` operator.
     *
     * Requirements:
     * - Subtraction cannot overflow.
     */
    function sub(uint256 a, uint256 b, string memory errorMessage) internal pure returns (uint256) {
        require(b <= a, errorMessage);
        uint256 c = a - b;

        return c;
    }

    /**
     * @dev Returns the multiplication of two unsigned integers, reverting on
     * overflow.
     *
     * Counterpart to Solidity's `*` operator.
     *
     * Requirements:
     * - Multiplication cannot overflow.
     */
    function mul(uint256 a, uint256 b) internal pure returns (uint256) {
        // Gas optimization: this is cheaper than requiring 'a' not being zero, but the
        // benefit is lost if 'b' is also tested.
        // See: https://github.com/OpenZeppelin/openzeppelin-contracts/pull/522
        if (a == 0) {
            return 0;
        }

        uint256 c = a * b;
        require(c / a == b, "SafeMath: multiplication overflow");

        return c;
    }

    /**
     * @dev Returns the integer division of two unsigned integers. Reverts on
     * division by zero. The result is rounded towards zero.
     *
     * Counterpart to Solidity's `/` operator. Note: this function uses a
     * `revert` opcode (which leaves remaining gas untouched) while Solidity
     * uses an invalid opcode to revert (consuming all remaining gas).
     *
     * Requirements:
     * - The divisor cannot be zero.
     */
    function div(uint256 a, uint256 b) internal pure returns (uint256) {
        return div(a, b, "SafeMath: division by zero");
    }

    /**
     * @dev Returns the integer division of two unsigned integers. Reverts with custom message on
     * division by zero. The result is rounded towards zero.
     *
     * Counterpart to Solidity's `/` operator. Note: this function uses a
     * `revert` opcode (which leaves remaining gas untouched) while Solidity
     * uses an invalid opcode to revert (consuming all remaining gas).
     *
     * Requirements:
     * - The divisor cannot be zero.
     */
    function div(uint256 a, uint256 b, string memory errorMessage) internal pure returns (uint256) {
        // Solidity only automatically asserts when dividing by 0
        require(b > 0, errorMessage);
        uint256 c = a / b;
        // assert(a == b * c + a % b); // There is no case in which this doesn't hold

        return c;
    }

    /**
     * @dev Returns the remainder of dividing two unsigned integers. (unsigned integer modulo),
     * Reverts when dividing by zero.
     *
     * Counterpart to Solidity's `%` operator. This function uses a `revert`
     * opcode (which leaves remaining gas untouched) while Solidity uses an
     * invalid opcode to revert (consuming all remaining gas).
     *
     * Requirements:
     * - The divisor cannot be zero.
     */
    function mod(uint256 a, uint256 b) internal pure returns (uint256) {
        return mod(a, b, "SafeMath: modulo by zero");
    }

    /**
     * @dev Returns the remainder of dividing two unsigned integers. (unsigned integer modulo),
     * Reverts with custom message when dividing by zero.
     *
     * Counterpart to Solidity's `%` operator. This function uses a `revert`
     * opcode (which leaves remaining gas untouched) while Solidity uses an
     * invalid opcode to revert (consuming all remaining gas).
     *
     * Requirements:
     * - The divisor cannot be zero.
     */
    function mod(uint256 a, uint256 b, string memory errorMessage) internal pure returns (uint256) {
        require(b != 0, errorMessage);
        return a % b;
    }
}

/**
 * @dev Implementation of Multi-Token Standard contract
 */
contract ERC1155 is IERC165 {
  using SafeMath for uint256;
  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;

  // Objects balances
  mapping (address => mapping(uint256 => uint256)) internal balances;

  // Operator Functions
  mapping (address => mapping(address => bool)) internal operators;

  // Events
  event TransferSingle(address indexed _operator, address indexed _from, address indexed _to, uint256 _id, uint256 _amount);
  event TransferBatch(address indexed _operator, address indexed _from, address indexed _to, uint256[] _ids, uint256[] _amounts);
  event ApprovalForAll(address indexed _owner, address indexed _operator, bool _approved);
  event URI(string _uri, uint256 indexed _id);


  /***********************************|
  |     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
  {
    require((msg.sender == _from) || isApprovedForAll(_from, msg.sender), "ERC1155#safeTransferFrom: INVALID_OPERATOR");
    require(_to != address(0),"ERC1155#safeTransferFrom: INVALID_RECIPIENT");
    // require(_amount >= balances[_from][_id]) is not necessary since checked with safemath operations

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

  /**
   * @notice Send multiple types of Tokens from the _from address to the _to address (with safety call)
   * @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
  {
    // Requirements
    require((msg.sender == _from) || isApprovedForAll(_from, msg.sender), "ERC1155#safeBatchTransferFrom: INVALID_OPERATOR");
    require(_to != address(0), "ERC1155#safeBatchTransferFrom: INVALID_RECIPIENT");

    _safeBatchTransferFrom(_from, _to, _ids, _amounts);
    _callonERC1155BatchReceived(_from, _to, _ids, _amounts, _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
    balances[_from][_id] = balances[_from][_id].sub(_amount); // Subtract amount
    balances[_to][_id] = balances[_to][_id].add(_amount);     // Add amount

    // 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, bytes memory _data)
    internal
  {
    // Check if recipient is contract
    if (_to.isContract()) {
      bytes4 retval = IERC1155TokenReceiver(_to).onERC1155Received(msg.sender, _from, _id, _amount, _data);
      require(retval == ERC1155_RECEIVED_VALUE, "ERC1155#_callonERC1155Received: INVALID_ON_RECEIVE_MESSAGE");
    }
  }

  /**
   * @notice Send multiple types of Tokens from the _from address to the _to address (with safety call)
   * @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
  {
    require(_ids.length == _amounts.length, "ERC1155#_safeBatchTransferFrom: INVALID_ARRAYS_LENGTH");

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

    // Executing all transfers
    for (uint256 i = 0; i < nTransfer; i++) {
      // Update storage balance of previous bin
      balances[_from][_ids[i]] = balances[_from][_ids[i]].sub(_amounts[i]);
      balances[_to][_ids[i]] = balances[_to][_ids[i]].add(_amounts[i]);
    }

    // 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, bytes memory _data)
    internal
  {
    // Pass data if recipient is contract
    if (_to.isContract()) {
      bytes4 retval = IERC1155TokenReceiver(_to).onERC1155BatchReceived(msg.sender, _from, _ids, _amounts, _data);
      require(retval == ERC1155_BATCH_RECEIVED_VALUE, "ERC1155#_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
  {
    // 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 Bool of approved for all
   */
  function isApprovedForAll(address _owner, address _operator)
    public view virtual returns (bool isOperator)
  {
    return operators[_owner][_operator];
  }


  /***********************************|
  |         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 view returns (uint256)
  {
    return balances[_owner][_id];
  }

  /**
   * @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[] memory _owners, uint256[] memory _ids)
    public view returns (uint256[] memory)
  {
    require(_owners.length == _ids.length, "ERC1155#balanceOfBatch: INVALID_ARRAY_LENGTH");

    // Variables
    uint256[] memory batchBalances = new uint256[](_owners.length);

    // Iterate over each owner and token ID
    for (uint256 i = 0; i < _owners.length; i++) {
      batchBalances[i] = balances[_owners[i]][_ids[i]];
    }

    return batchBalances;
  }


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

  /**
   * INTERFACE_SIGNATURE_ERC165 = bytes4(keccak256("supportsInterface(bytes4)"));
   */
  bytes4 constant private INTERFACE_SIGNATURE_ERC165 = 0x01ffc9a7;

  /**
   * INTERFACE_SIGNATURE_ERC1155 =
   * bytes4(keccak256("safeTransferFrom(address,address,uint256,uint256,bytes)")) ^
   * bytes4(keccak256("safeBatchTransferFrom(address,address,uint256[],uint256[],bytes)")) ^
   * bytes4(keccak256("balanceOf(address,uint256)")) ^
   * bytes4(keccak256("balanceOfBatch(address[],uint256[])")) ^
   * bytes4(keccak256("setApprovalForAll(address,bool)")) ^
   * bytes4(keccak256("isApprovedForAll(address,address)"));
   */
  bytes4 constant private INTERFACE_SIGNATURE_ERC1155 = 0xd9b67a26;

  /**
   * @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) external view override returns (bool) {
    if (_interfaceID == INTERFACE_SIGNATURE_ERC165 ||
        _interfaceID == INTERFACE_SIGNATURE_ERC1155) {
      return true;
    }
    return false;
  }

}

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


  /****************************************|
  |            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
    balances[_to][_id] = balances[_to][_id].add(_amount);

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

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

  /**
   * @notice Mint tokens for each ids in _ids
   * @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, "ERC1155MintBurn#batchMint: INVALID_ARRAYS_LENGTH");

    // Number of mints to execute
    uint256 nMint = _ids.length;

     // Executing all minting
    for (uint256 i = 0; i < nMint; i++) {
      // Update storage balance
      balances[_to][_ids[i]] = balances[_to][_ids[i]].add(_amounts[i]);
    }

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

    // Calling onReceive method if recipient is contract
    _callonERC1155BatchReceived(address(0x0), _to, _ids, _amounts, _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
    balances[_from][_id] = balances[_from][_id].sub(_amount);

    // 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
   * @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
  {
    require(_ids.length == _amounts.length, "ERC1155MintBurn#batchBurn: INVALID_ARRAYS_LENGTH");

    // Number of mints to execute
    uint256 nBurn = _ids.length;

     // Executing all minting
    for (uint256 i = 0; i < nBurn; i++) {
      // Update storage balance
      balances[_from][_ids[i]] = balances[_from][_ids[i]].sub(_amounts[i]);
    }

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

}

/**
 * @notice Contract that handles metadata related methods.
 * @dev Methods assume a deterministic generation of URI based on token IDs.
 *      Methods also assume that URI uses hex representation of token IDs.
 */
contract ERC1155Metadata {

  // URI's default URI prefix
  string internal baseMetadataURI;
  event URI(string _uri, uint256 indexed _id);


  /***********************************|
  |     Metadata Public Function s    |
  |__________________________________*/

  /**
   * @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) public view virtual returns (string memory) {
    return string(abi.encodePacked(baseMetadataURI, _uint2str(_id), ".json"));
  }


  /***********************************|
  |    Metadata Internal Functions    |
  |__________________________________*/

  /**
   * @notice Will emit default URI log event for corresponding token _id
   * @param _tokenIDs Array of IDs of tokens to log default URI
   */
  function _logURIs(uint256[] memory _tokenIDs) internal {
    string memory baseURL = baseMetadataURI;
    string memory tokenURI;

    for (uint256 i = 0; i < _tokenIDs.length; i++) {
      tokenURI = string(abi.encodePacked(baseURL, _uint2str(_tokenIDs[i]), ".json"));
      emit URI(tokenURI, _tokenIDs[i]);
    }
  }

  /**
   * @notice Will emit a specific URI log event for corresponding token
   * @param _tokenIDs IDs of the token corresponding to the _uris logged
   * @param _URIs    The URIs of the specified _tokenIDs
   */
  function _logURIs(uint256[] memory _tokenIDs, string[] memory _URIs) internal {
    require(_tokenIDs.length == _URIs.length, "ERC1155Metadata#_logURIs: INVALID_ARRAYS_LENGTH");
    for (uint256 i = 0; i < _tokenIDs.length; i++) {
      emit URI(_URIs[i], _tokenIDs[i]);
    }
  }

  /**
   * @notice Will update the base URL of token's URI
   * @param _newBaseMetadataURI New base URL of token's URI
   */
  function _setBaseMetadataURI(string memory _newBaseMetadataURI) internal {
    baseMetadataURI = _newBaseMetadataURI;
  }


  /***********************************|
  |    Utility Internal Functions     |
  |__________________________________*/

  /**
   * @notice Convert uint256 to string
   * @param _i Unsigned integer to convert to string
   */
  function _uint2str(uint256 _i) internal pure returns (string memory _uintAsString) {
    if (_i == 0) {
      return "0";
    }

    uint256 j = _i;
    uint256 ii = _i;
    uint256 len;

    // Get number of bytes
    while (j != 0) {
      len++;
      j /= 10;
    }

    bytes memory bstr = new bytes(len);
    uint256 k = len - 1;

    // Get each individual ASCII
    while (ii != 0) {
      bstr[k--] = byte(uint8(48 + ii % 10));
      ii /= 10;
    }

    // Convert to string
    return string(bstr);
  }

}

contract OwnableDelegateProxy {}

contract ProxyRegistry {
    mapping(address => OwnableDelegateProxy) public proxies;
}

/**
 * @title FantomArtTradablePrivate
 * FantomArtTradablePrivate - ERC1155 contract that whitelists an operator address, 
 * has mint functionality, and supports useful standards from OpenZeppelin,
  like _exists(), name(), symbol(), and totalSupply()
 */
contract FantomArtTradablePrivate is
    ERC1155,
    ERC1155MintBurn,
    ERC1155Metadata,
    Ownable
{
    uint256 private _currentTokenID = 0;

    // Optional mapping for token URIs
    mapping(uint256 => string) private _tokenURIs;

    mapping(uint256 => address) public creators;
    mapping(uint256 => uint256) public tokenSupply;

    // Contract name
    string public name;
    // Contract symbol
    string public symbol;
    // Platform fee
    uint256 public platformFee;
    // Platform fee receipient
    address payable public feeReceipient;
    // Fantom Marketplace contract
    address marketplace;
    // Fantom Bundle Marketplace contract
    address bundleMarketplace;

    constructor(
        string memory _name,
        string memory _symbol,
        uint256 _platformFee,
        address payable _feeReceipient,
        address _marketplace,
        address _bundleMarketplace
    ) public {
        name = _name;
        symbol = _symbol;
        platformFee = _platformFee;
        feeReceipient = _feeReceipient;
        marketplace = _marketplace;
        bundleMarketplace = _bundleMarketplace;
    }

    function uri(uint256 _id) public view override returns (string memory) {
        require(_exists(_id), "ERC721Tradable#uri: NONEXISTENT_TOKEN");
        return _tokenURIs[_id];
    }

    /**
     * @dev Returns the total quantity for a token ID
     * @param _id uint256 ID of the token to query
     * @return amount of token in existence
     */
    function totalSupply(uint256 _id) public view returns (uint256) {
        return tokenSupply[_id];
    }

    /**
     * @dev Creates a new token type and assigns _supply to an address
     * @param _to owner address of the new token
     * @param _supply Optional amount to supply the first owner
     * @param _uri Optional URI for this token type
     */
    function mint(
        address _to,
        uint256 _supply,
        string calldata _uri
    ) external payable onlyOwner {
        require(msg.value >= platformFee, "Insufficient funds to mint.");

        uint256 _id = _getNextTokenID();
        _incrementTokenTypeId();

        creators[_id] = msg.sender;
        _setTokenURI(_id, _uri);

        if (bytes(_uri).length > 0) {
            emit URI(_uri, _id);
        }

        _mint(_to, _id, _supply, bytes(""));
        tokenSupply[_id] = _supply;

        // Send FTM fee to fee recipient
        (bool success, ) = feeReceipient.call{value: msg.value}("");
        require(success, "Transfer failed");
    }

    function getCurrentTokenID() public view returns (uint256) {
        return _currentTokenID;
    }

    /**
     * Override isApprovedForAll to whitelist Fantom contracts to enable gas-less listings.
     */
    function isApprovedForAll(address _owner, address _operator)
        public
        view
        override
        returns (bool isOperator)
    {
        // Whitelist Fantom marketplace, bundle marketplace contracts for easy trading.
        if (marketplace == _operator || bundleMarketplace == _operator) {
            return true;
        }

        return ERC1155.isApprovedForAll(_owner, _operator);
    }

    /**
     * @dev Returns whether the specified token exists by checking to see if it has a creator
     * @param _id uint256 ID of the token to query the existence of
     * @return bool whether the token exists
     */
    function _exists(uint256 _id) public view returns (bool) {
        return creators[_id] != address(0);
    }

    /**
     * @dev calculates the next token ID based on value of _currentTokenID
     * @return uint256 for the next token ID
     */
    function _getNextTokenID() private view returns (uint256) {
        return _currentTokenID.add(1);
    }

    /**
     * @dev increments the value of _currentTokenID
     */
    function _incrementTokenTypeId() private {
        _currentTokenID++;
    }

    /**
     * @dev Internal function to set the token URI for a given token.
     * Reverts if the token ID does not exist.
     * @param _id uint256 ID of the token to set its URI
     * @param _uri string URI to assign
     */
    function _setTokenURI(uint256 _id, string memory _uri) internal {
        require(_exists(_id), "_setTokenURI: Token should exist");
        _tokenURIs[_id] = _uri;
    }
}

contract FantomArtFactoryPrivate is Ownable {
    /// @dev Events of the contract
    event ContractCreated(address creator, address nft);
    event ContractDisabled(address caller, address nft);

    /// @notice Fantom marketplace contract address;
    address public marketplace;

    /// @notice Fantom bundle marketplace contract address;
    address public bundleMarketplace;

    /// @notice NFT mint fee
    uint256 public mintFee;

    /// @notice Platform fee for deploying new NFT contract
    uint256 public platformFee;

    /// @notice Platform fee recipient
    address payable public feeRecipient;

    /// @notice NFT Address => Bool
    mapping(address => bool) public exists;

    bytes4 private constant INTERFACE_ID_ERC1155 = 0xd9b67a26;

    /// @notice Contract constructor
    constructor(
        address _marketplace,
        address _bundleMarketplace,
        uint256 _mintFee,
        address payable _feeRecipient,
        uint256 _platformFee
    ) public {
        marketplace = _marketplace;
        bundleMarketplace = _bundleMarketplace;
        mintFee = _mintFee;
        feeRecipient = _feeRecipient;
        platformFee = _platformFee;
    }

    /**
    @notice Update marketplace contract
    @dev Only admin
    @param _marketplace address the marketplace contract address to set
    */
    function updateMarketplace(address _marketplace) external onlyOwner {
        marketplace = _marketplace;
    }

    /**
    @notice Update bundle marketplace contract
    @dev Only admin
    @param _bundleMarketplace address the bundle marketplace contract address to set
    */
    function updateBundleMarketplace(address _bundleMarketplace)
        external
        onlyOwner
    {
        bundleMarketplace = _bundleMarketplace;
    }

    /**
    @notice Update mint fee
    @dev Only admin
    @param _mintFee uint256 the platform fee to set
    */
    function updateMintFee(uint256 _mintFee) external onlyOwner {
        mintFee = _mintFee;
    }

    /**
    @notice Update platform fee
    @dev Only admin
    @param _platformFee uint256 the platform fee to set
    */
    function updatePlatformFee(uint256 _platformFee) external onlyOwner {
        platformFee = _platformFee;
    }

    /**
     @notice Method for updating platform fee address
     @dev Only admin
     @param _feeRecipient payable address the address to sends the funds to
     */
    function updateFeeRecipient(address payable _feeRecipient)
        external
        onlyOwner
    {
        feeRecipient = _feeRecipient;
    }

    /// @notice Method for deploy new FantomArtTradablePrivate contract
    /// @param _name Name of NFT contract
    /// @param _symbol Symbol of NFT contract
    function createNFTContract(string memory _name, string memory _symbol)
        external
        payable
        returns (address)
    {
        require(msg.value >= platformFee, "Insufficient funds.");
        (bool success,) = feeRecipient.call{value: msg.value}("");
        require(success, "Transfer failed");

        FantomArtTradablePrivate nft = new FantomArtTradablePrivate(
            _name,
            _symbol,
            mintFee,
            feeRecipient,
            marketplace,
            bundleMarketplace
        );
        exists[address(nft)] = true;
        nft.transferOwnership(_msgSender());
        emit ContractCreated(_msgSender(), address(nft));
        return address(nft);
    }

    /// @notice Method for registering existing FantomArtTradable contract
    /// @param  tokenContractAddress Address of NFT contract
    function registerTokenContract(address tokenContractAddress)
        external
        onlyOwner
    {
        require(!exists[tokenContractAddress], "Art contract already registered");
        require(IERC165(tokenContractAddress).supportsInterface(INTERFACE_ID_ERC1155), "Not an ERC1155 contract");
        exists[tokenContractAddress] = true;
        emit ContractCreated(_msgSender(), tokenContractAddress);
    }

    /// @notice Method for disabling existing FantomArtTradable contract
    /// @param  tokenContractAddress Address of NFT contract
    function disableTokenContract(address tokenContractAddress)
        external
        onlyOwner
    {
        require(exists[tokenContractAddress], "Art contract is not registered");
        exists[tokenContractAddress] = false;
        emit ContractDisabled(_msgSender(), tokenContractAddress);
    }
}

Contract Security Audit

Contract ABI

[{"inputs":[{"internalType":"string","name":"_name","type":"string"},{"internalType":"string","name":"_symbol","type":"string"},{"internalType":"uint256","name":"_platformFee","type":"uint256"},{"internalType":"address payable","name":"_feeReceipient","type":"address"},{"internalType":"address","name":"_marketplace","type":"address"},{"internalType":"address","name":"_bundleMarketplace","type":"address"}],"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":"previousOwner","type":"address"},{"indexed":true,"internalType":"address","name":"newOwner","type":"address"}],"name":"OwnershipTransferred","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":"uint256","name":"_id","type":"uint256"}],"name":"_exists","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"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":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"creators","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"feeReceipient","outputs":[{"internalType":"address payable","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getCurrentTokenID","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_owner","type":"address"},{"internalType":"address","name":"_operator","type":"address"}],"name":"isApprovedForAll","outputs":[{"internalType":"bool","name":"isOperator","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_to","type":"address"},{"internalType":"uint256","name":"_supply","type":"uint256"},{"internalType":"string","name":"_uri","type":"string"}],"name":"mint","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[],"name":"name","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"platformFee","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","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":"view","type":"function"},{"inputs":[],"name":"symbol","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"tokenSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_id","type":"uint256"}],"name":"totalSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_id","type":"uint256"}],"name":"uri","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"}]

608060405260006004553480156200001657600080fd5b50604051620022bf380380620022bf833981810160405260c08110156200003c57600080fd5b81019080805160405193929190846401000000008211156200005d57600080fd5b9083019060208201858111156200007357600080fd5b82516401000000008111828201881017156200008e57600080fd5b82525081516020918201929091019080838360005b83811015620000bd578181015183820152602001620000a3565b50505050905090810190601f168015620000eb5780820380516001836020036101000a031916815260200191505b50604052602001805160405193929190846401000000008211156200010f57600080fd5b9083019060208201858111156200012557600080fd5b82516401000000008111828201881017156200014057600080fd5b82525081516020918201929091019080838360005b838110156200016f57818101518382015260200162000155565b50505050905090810190601f1680156200019d5780820380516001836020036101000a031916815260200191505b506040908152602082015190820151606083015160809093015191945092506000620001c86200028e565b600380546001600160a01b0319166001600160a01b038316908117909155604051919250906000907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0908290a35085516200022b90600890602089019062000292565b5084516200024190600990602088019062000292565b50600a93909355600b80546001600160a01b03199081166001600160a01b0394851617909155600c8054821692841692909217909155600d805490911691909216179055506200032e9050565b3390565b828054600181600116156101000203166002900490600052602060002090601f016020900481019282601f10620002d557805160ff191683800117855562000305565b8280016001018555821562000305579182015b8281111562000305578251825591602001919060010190620002e8565b506200031392915062000317565b5090565b5b8082111562000313576000815560010162000318565b611f81806200033e6000396000f3fe6080604052600436106101295760003560e01c80638da5cb5b116100ab578063cd53d08e1161006f578063cd53d08e146106ee578063d3fc986414610718578063e985e9c51461079b578063f242432a146107d6578063f2fde38b146108ac578063f8e76cc0146108df57610129565b80638da5cb5b1461064a57806395d89b411461065f578063a22cb46514610674578063bd85b039146106af578063c4a6d0d2146106d957610129565b80632693ebf2116100f25780632693ebf21461028a5780632eb2c2d6146102b45780633740ebb3146104845780634e1273f4146104b5578063715018a61461063557610129565b8062fdd58e1461012e57806301ffc9a71461017957806306fdde03146101c15780630e89341c1461024b57806326232a2e14610275575b600080fd5b34801561013a57600080fd5b506101676004803603604081101561015157600080fd5b506001600160a01b038135169060200135610909565b60408051918252519081900360200190f35b34801561018557600080fd5b506101ad6004803603602081101561019c57600080fd5b50356001600160e01b031916610932565b604080519115158252519081900360200190f35b3480156101cd57600080fd5b506101d6610979565b6040805160208082528351818301528351919283929083019185019080838360005b838110156102105781810151838201526020016101f8565b50505050905090810190601f16801561023d5780820380516001836020036101000a031916815260200191505b509250505060405180910390f35b34801561025757600080fd5b506101d66004803603602081101561026e57600080fd5b5035610a07565b34801561028157600080fd5b50610167610aec565b34801561029657600080fd5b50610167600480360360208110156102ad57600080fd5b5035610af2565b3480156102c057600080fd5b50610482600480360360a08110156102d757600080fd5b6001600160a01b038235811692602081013590911691810190606081016040820135600160201b81111561030a57600080fd5b82018360208201111561031c57600080fd5b803590602001918460208302840111600160201b8311171561033d57600080fd5b9190808060200260200160405190810160405280939291908181526020018383602002808284376000920191909152509295949360208101935035915050600160201b81111561038c57600080fd5b82018360208201111561039e57600080fd5b803590602001918460208302840111600160201b831117156103bf57600080fd5b9190808060200260200160405190810160405280939291908181526020018383602002808284376000920191909152509295949360208101935035915050600160201b81111561040e57600080fd5b82018360208201111561042057600080fd5b803590602001918460018302840111600160201b8311171561044157600080fd5b91908080601f016020809104026020016040519081016040528093929190818152602001838380828437600092019190915250929550610b04945050505050565b005b34801561049057600080fd5b50610499610bc0565b604080516001600160a01b039092168252519081900360200190f35b3480156104c157600080fd5b506105e5600480360360408110156104d857600080fd5b810190602081018135600160201b8111156104f257600080fd5b82018360208201111561050457600080fd5b803590602001918460208302840111600160201b8311171561052557600080fd5b9190808060200260200160405190810160405280939291908181526020018383602002808284376000920191909152509295949360208101935035915050600160201b81111561057457600080fd5b82018360208201111561058657600080fd5b803590602001918460208302840111600160201b831117156105a757600080fd5b919080806020026020016040519081016040528093929190818152602001838360200280828437600092019190915250929550610bcf945050505050565b60408051602080825283518183015283519192839290830191858101910280838360005b83811015610621578181015183820152602001610609565b505050509050019250505060405180910390f35b34801561064157600080fd5b50610482610ce7565b34801561065657600080fd5b50610499610da5565b34801561066b57600080fd5b506101d6610db4565b34801561068057600080fd5b506104826004803603604081101561069757600080fd5b506001600160a01b0381351690602001351515610e0f565b3480156106bb57600080fd5b50610167600480360360208110156106d257600080fd5b5035610e7d565b3480156106e557600080fd5b50610167610e8f565b3480156106fa57600080fd5b506104996004803603602081101561071157600080fd5b5035610e95565b6104826004803603606081101561072e57600080fd5b6001600160a01b0382351691602081013591810190606081016040820135600160201b81111561075d57600080fd5b82018360208201111561076f57600080fd5b803590602001918460018302840111600160201b8311171561079057600080fd5b509092509050610eb0565b3480156107a757600080fd5b506101ad600480360360408110156107be57600080fd5b506001600160a01b0381358116916020013516611121565b3480156107e257600080fd5b50610482600480360360a08110156107f957600080fd5b6001600160a01b03823581169260208101359091169160408201359160608101359181019060a081016080820135600160201b81111561083857600080fd5b82018360208201111561084a57600080fd5b803590602001918460018302840111600160201b8311171561086b57600080fd5b91908080601f01602080910402602001604051908101604052809392919081815260200183838082843760009201919091525092955061116b945050505050565b3480156108b857600080fd5b50610482600480360360208110156108cf57600080fd5b50356001600160a01b0316611220565b3480156108eb57600080fd5b506101ad6004803603602081101561090257600080fd5b5035611335565b6001600160a01b0382166000908152602081815260408083208484529091529020545b92915050565b60006001600160e01b031982166301ffc9a760e01b148061096357506001600160e01b03198216636cdb3d1360e11b145b1561097057506001610974565b5060005b919050565b6008805460408051602060026001851615610100026000190190941693909304601f810184900484028201840190925281815292918301828280156109ff5780601f106109d4576101008083540402835291602001916109ff565b820191906000526020600020905b8154815290600101906020018083116109e257829003601f168201915b505050505081565b6060610a1282611335565b610a4d5760405162461bcd60e51b8152600401808060200182810382526025815260200180611e536025913960400191505060405180910390fd5b60008281526005602090815260409182902080548351601f600260001961010060018616150201909316929092049182018490048402810184019094528084529091830182828015610ae05780601f10610ab557610100808354040283529160200191610ae0565b820191906000526020600020905b815481529060010190602001808311610ac357829003601f168201915b50505050509050919050565b600a5481565b60076020526000908152604090205481565b336001600160a01b0386161480610b205750610b208533611121565b610b5b5760405162461bcd60e51b815260040180806020018281038252602f815260200180611ea4602f913960400191505060405180910390fd5b6001600160a01b038416610ba05760405162461bcd60e51b8152600401808060200182810382526030815260200180611e236030913960400191505060405180910390fd5b610bac85858585611352565b610bb985858585856115fd565b5050505050565b600b546001600160a01b031681565b60608151835114610c115760405162461bcd60e51b815260040180806020018281038252602c815260200180611e78602c913960400191505060405180910390fd5b6060835167ffffffffffffffff81118015610c2b57600080fd5b50604051908082528060200260200182016040528015610c55578160200160208202803683370190505b50905060005b8451811015610cdf57600080868381518110610c7357fe5b60200260200101516001600160a01b03166001600160a01b031681526020019081526020016000206000858381518110610ca957fe5b6020026020010151815260200190815260200160002054828281518110610ccc57fe5b6020908102919091010152600101610c5b565b509392505050565b610cef6117e9565b6001600160a01b0316610d00610da5565b6001600160a01b031614610d5b576040805162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604482015290519081900360640190fd5b6003546040516000916001600160a01b0316907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0908390a3600380546001600160a01b0319169055565b6003546001600160a01b031690565b6009805460408051602060026001851615610100026000190190941693909304601f810184900484028201840190925281815292918301828280156109ff5780601f106109d4576101008083540402835291602001916109ff565b3360008181526001602090815260408083206001600160a01b03871680855290835292819020805460ff1916861515908117909155815190815290519293927f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31929181900390910190a35050565b60009081526007602052604090205490565b60045490565b6006602052600090815260409020546001600160a01b031681565b610eb86117e9565b6001600160a01b0316610ec9610da5565b6001600160a01b031614610f24576040805162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604482015290519081900360640190fd5b600a54341015610f7b576040805162461bcd60e51b815260206004820152601b60248201527f496e73756666696369656e742066756e647320746f206d696e742e0000000000604482015290519081900360640190fd5b6000610f856117ed565b9050610f8f611803565b60008181526006602090815260409182902080546001600160a01b031916331790558151601f8501829004820281018201909252838252610fec918391869086908190840183828082843760009201919091525061180e92505050565b811561105457807f6bb7ff708619ba0610cba295a58592e0451dee2622938c8755667688daf3529b848460405180806020018281038252848482818152602001925080828437600083820152604051601f909101601f19169092018290039550909350505050a25b61106f8582866040518060200160405280600081525061188c565b600081815260076020526040808220869055600b5490516001600160a01b039091169034908381818185875af1925050503d80600081146110cc576040519150601f19603f3d011682016040523d82523d6000602084013e6110d1565b606091505b5050905080611119576040805162461bcd60e51b815260206004820152600f60248201526e151c985b9cd9995c8819985a5b1959608a1b604482015290519081900360640190fd5b505050505050565b600c546000906001600160a01b038381169116148061114d5750600d546001600160a01b038381169116145b1561115a5750600161092c565b611164838361192c565b9392505050565b336001600160a01b038616148061118757506111878533611121565b6111c25760405162461bcd60e51b815260040180806020018281038252602a815260200180611dc4602a913960400191505060405180910390fd5b6001600160a01b0384166112075760405162461bcd60e51b815260040180806020018281038252602b815260200180611d73602b913960400191505060405180910390fd5b6112138585858561195a565b610bb98585858585611a36565b6112286117e9565b6001600160a01b0316611239610da5565b6001600160a01b031614611294576040805162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604482015290519081900360640190fd5b6001600160a01b0381166112d95760405162461bcd60e51b8152600401808060200182810382526026815260200180611d9e6026913960400191505060405180910390fd5b6003546040516001600160a01b038084169216907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a3600380546001600160a01b0319166001600160a01b0392909216919091179055565b6000908152600660205260409020546001600160a01b0316151590565b80518251146113925760405162461bcd60e51b8152600401808060200182810382526035815260200180611dee6035913960400191505060405180910390fd5b815160005b8181101561151c5761140d8382815181106113ae57fe5b6020026020010151600080896001600160a01b03166001600160a01b0316815260200190815260200160002060008785815181106113e857fe5b6020026020010151815260200190815260200160002054611ba690919063ffffffff16565b600080886001600160a01b03166001600160a01b03168152602001908152602001600020600086848151811061143f57fe5b60200260200101518152602001908152602001600020819055506114c783828151811061146857fe5b6020026020010151600080886001600160a01b03166001600160a01b0316815260200190815260200160002060008785815181106114a257fe5b6020026020010151815260200190815260200160002054611be890919063ffffffff16565b600080876001600160a01b03166001600160a01b0316815260200190815260200160002060008684815181106114f957fe5b602090810291909101810151825281019190915260400160002055600101611397565b50836001600160a01b0316856001600160a01b0316336001600160a01b03167f4a39dc06d4c0dbc64b70af90fd698a233a518aa5d07e595d983b8c0526c8f7fb8686604051808060200180602001838103835285818151815260200191508051906020019060200280838360005b838110156115a257818101518382015260200161158a565b50505050905001838103825284818151815260200191508051906020019060200280838360005b838110156115e15781810151838201526020016115c9565b5050505090500194505050505060405180910390a45050505050565b61160f846001600160a01b0316611c42565b15610bb9576000846001600160a01b031663bc197c8133888787876040518663ffffffff1660e01b815260040180866001600160a01b03168152602001856001600160a01b03168152602001806020018060200180602001848103845287818151815260200191508051906020019060200280838360005b8381101561169f578181015183820152602001611687565b50505050905001848103835286818151815260200191508051906020019060200280838360005b838110156116de5781810151838201526020016116c6565b50505050905001848103825285818151815260200191508051906020019080838360005b8381101561171a578181015183820152602001611702565b50505050905090810190601f1680156117475780820380516001836020036101000a031916815260200191505b5098505050505050505050602060405180830381600087803b15801561176c57600080fd5b505af1158015611780573d6000803e3d6000fd5b505050506040513d602081101561179657600080fd5b505190506001600160e01b0319811663bc197c8160e01b146111195760405162461bcd60e51b815260040180806020018281038252603f815260200180611ed3603f913960400191505060405180910390fd5b3390565b6004546000906117fe906001611be8565b905090565b600480546001019055565b61181782611335565b611868576040805162461bcd60e51b815260206004820181905260248201527f5f736574546f6b656e5552493a20546f6b656e2073686f756c64206578697374604482015290519081900360640190fd5b6000828152600560209081526040909120825161188792840190611cdf565b505050565b6001600160a01b0384166000908152602081815260408083208684529091529020546118b89083611be8565b6001600160a01b038516600081815260208181526040808320888452825280832094909455835187815290810186905283519293919233927fc3d58168c5ae7397731d063d5bbf3d657854427343f4c083240f7aacaa2d0f62928290030190a4611926600085858585611a36565b50505050565b6001600160a01b03918216600090815260016020908152604080832093909416825291909152205460ff1690565b6001600160a01b0384166000908152602081815260408083208584529091529020546119869082611ba6565b6001600160a01b03808616600090815260208181526040808320878452825280832094909455918616815280825282812085825290915220546119c99082611be8565b6001600160a01b03808516600081815260208181526040808320888452825291829020949094558051868152938401859052805191939288169233927fc3d58168c5ae7397731d063d5bbf3d657854427343f4c083240f7aacaa2d0f62929181900390910190a450505050565b611a48846001600160a01b0316611c42565b15610bb9576000846001600160a01b031663f23a6e6133888787876040518663ffffffff1660e01b815260040180866001600160a01b03168152602001856001600160a01b0316815260200184815260200183815260200180602001828103825283818151815260200191508051906020019080838360005b83811015611ad9578181015183820152602001611ac1565b50505050905090810190601f168015611b065780820380516001836020036101000a031916815260200191505b509650505050505050602060405180830381600087803b158015611b2957600080fd5b505af1158015611b3d573d6000803e3d6000fd5b505050506040513d6020811015611b5357600080fd5b505190506001600160e01b0319811663f23a6e6160e01b146111195760405162461bcd60e51b815260040180806020018281038252603a815260200180611f12603a913960400191505060405180910390fd5b600061116483836040518060400160405280601e81526020017f536166654d6174683a207375627472616374696f6e206f766572666c6f770000815250611c48565b600082820183811015611164576040805162461bcd60e51b815260206004820152601b60248201527f536166654d6174683a206164646974696f6e206f766572666c6f770000000000604482015290519081900360640190fd5b3b151590565b60008184841115611cd75760405162461bcd60e51b81526004018080602001828103825283818151815260200191508051906020019080838360005b83811015611c9c578181015183820152602001611c84565b50505050905090810190601f168015611cc95780820380516001836020036101000a031916815260200191505b509250505060405180910390fd5b505050900390565b828054600181600116156101000203166002900490600052602060002090601f016020900481019282601f10611d2057805160ff1916838001178555611d4d565b82800160010185558215611d4d579182015b82811115611d4d578251825591602001919060010190611d32565b50611d59929150611d5d565b5090565b5b80821115611d595760008155600101611d5e56fe4552433131353523736166655472616e7366657246726f6d3a20494e56414c49445f524543495049454e544f776e61626c653a206e6577206f776e657220697320746865207a65726f20616464726573734552433131353523736166655472616e7366657246726f6d3a20494e56414c49445f4f50455241544f5245524331313535235f7361666542617463685472616e7366657246726f6d3a20494e56414c49445f4152524159535f4c454e47544845524331313535237361666542617463685472616e7366657246726f6d3a20494e56414c49445f524543495049454e544552433732315472616461626c65237572693a204e4f4e4558495354454e545f544f4b454e455243313135352362616c616e63654f6642617463683a20494e56414c49445f41525241595f4c454e47544845524331313535237361666542617463685472616e7366657246726f6d3a20494e56414c49445f4f50455241544f5245524331313535235f63616c6c6f6e45524331313535426174636852656365697665643a20494e56414c49445f4f4e5f524543454956455f4d45535341474545524331313535235f63616c6c6f6e4552433131353552656365697665643a20494e56414c49445f4f4e5f524543454956455f4d455353414745a2646970667358221220b4547c7754cf0b20e18843406e1663c11e710716641fec86d9d1443bc64a150364736f6c634300060c003300000000000000000000000000000000000000000000000000000000000000c00000000000000000000000000000000000000000000000000000000000000100000000000000000000000000000000000000000000000001158e460913d0000000000000000000000000000048f7572cfbc4f246600cf816c668271034d81f8f000000000000000000000000c6a29afa00b668de4a11897b627f3011842a89480000000000000000000000009c3682631cf77ad54461e434819c444d427ce429000000000000000000000000000000000000000000000000000000000000000946616e746f6d417274000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000044641525400000000000000000000000000000000000000000000000000000000

Deployed ByteCode Sourcemap

36395:4434:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;27127:127;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;27127:127:0;;-1:-1:-1;;;;;27127:127:0;;;;;;:::i;:::-;;;;;;;;;;;;;;;;29102:249;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;29102:249:0;-1:-1:-1;;;;;;29102:249:0;;:::i;:::-;;;;;;;;;;;;;;;;;;36776:18;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;37578:185;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;37578:185:0;;:::i;36873:26::-;;;;;;;;;;;;;:::i;36699:46::-;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;36699:46:0;;:::i;22307:511::-;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;22307:511:0;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;22307:511:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;22307:511:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;22307:511:0;;;;;;;;-1:-1:-1;22307:511:0;;-1:-1:-1;;;;;22307:511:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;22307:511:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;22307:511:0;;;;;;;;-1:-1:-1;22307:511:0;;-1:-1:-1;;;;;22307:511:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;22307:511:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;22307:511:0;;-1:-1:-1;22307:511:0;;-1:-1:-1;;;;;22307:511:0:i;:::-;;36938:36;;;;;;;;;;;;;:::i;:::-;;;;-1:-1:-1;;;;;36938:36:0;;;;;;;;;;;;;;27542:500;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;27542:500:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;27542:500:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;27542:500:0;;;;;;;;-1:-1:-1;27542:500:0;;-1:-1:-1;;;;;27542:500:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;27542:500:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;27542:500:0;;-1:-1:-1;27542:500:0;;-1:-1:-1;;;;;27542:500:0:i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;2627:148;;;;;;;;;;;;;:::i;1976:87::-;;;;;;;;;;;;;:::i;36825:20::-;;;;;;;;;;;;;:::i;26136:227::-;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;26136:227:0;;-1:-1:-1;;;;;26136:227:0;;;;;;;;:::i;37941:106::-;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;37941:106:0;;:::i;39013:100::-;;;;;;;;;;;;;:::i;36649:43::-;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;36649:43:0;;:::i;38313:692::-;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;38313:692:0;;;;;;;;;;;;;;;;;-1:-1:-1;;;38313:692:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;38313:692:0;;;;;;;;;;-1:-1:-1;38313:692:0;;-1:-1:-1;38313:692:0;-1:-1:-1;38313:692:0;:::i;39232:421::-;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;;39232:421:0;;;;;;;;;;:::i;21369:545::-;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;21369:545:0;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;21369:545:0;;;;;;-1:-1:-1;;;21369:545:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;21369:545:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;21369:545:0;;-1:-1:-1;21369:545:0;;-1:-1:-1;;;;;21369:545:0:i;2930:244::-;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;2930:244:0;-1:-1:-1;;;;;2930:244:0;;:::i;39889:110::-;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;39889:110:0;;:::i;27127:127::-;-1:-1:-1;;;;;27227:16:0;;27201:7;27227:16;;;;;;;;;;;:21;;;;;;;;;27127:127;;;;;:::o;29102:249::-;29182:4;-1:-1:-1;;;;;;;;;29199:42:0;;;;:98;;-1:-1:-1;;;;;;;;;;29254:43:0;;;29199:98;29195:132;;;-1:-1:-1;29315:4:0;29308:11;;29195:132;-1:-1:-1;29340:5:0;29102:249;;;;:::o;36776:18::-;;;;;;;;;;;;;;;-1:-1:-1;;36776:18:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;37578:185::-;37634:13;37668:12;37676:3;37668:7;:12::i;:::-;37660:62;;;;-1:-1:-1;;;37660:62:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;37740:15;;;;:10;:15;;;;;;;;;37733:22;;;;;;;;;;;-1:-1:-1;;37733:22:0;;;;;;;;;;;;;;;;;;;;;;;;;;;37740:15;;37733:22;;37740:15;37733:22;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;37578:185;;;:::o;36873:26::-;;;;:::o;36699:46::-;;;;;;;;;;;;;:::o;22307:511::-;-1:-1:-1;;;;;22488:19:0;;:10;:19;;22487:60;;;22512:35;22529:5;22536:10;22512:16;:35::i;:::-;22479:120;;;;-1:-1:-1;;;22479:120:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;22614:17:0;;22606:78;;;;-1:-1:-1;;;22606:78:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;22693:50;22716:5;22723:3;22728:4;22734:8;22693:22;:50::i;:::-;22750:62;22778:5;22785:3;22790:4;22796:8;22806:5;22750:27;:62::i;:::-;22307:511;;;;;:::o;36938:36::-;;;-1:-1:-1;;;;;36938:36:0;;:::o;27542:500::-;27641:16;27695:4;:11;27677:7;:14;:29;27669:86;;;;-1:-1:-1;;;27669:86:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;27782:30;27829:7;:14;27815:29;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;27815:29:0;;27782:62;;27903:9;27898:110;27922:7;:14;27918:1;:18;27898:110;;;27971:8;:20;27980:7;27988:1;27980:10;;;;;;;;;;;;;;-1:-1:-1;;;;;27971:20:0;-1:-1:-1;;;;;27971:20:0;;;;;;;;;;;;:29;27992:4;27997:1;27992:7;;;;;;;;;;;;;;27971:29;;;;;;;;;;;;27952:13;27966:1;27952:16;;;;;;;;;;;;;;;;;:48;27938:3;;27898:110;;;-1:-1:-1;28023:13:0;27542:500;-1:-1:-1;;;27542:500:0:o;2627:148::-;2207:12;:10;:12::i;:::-;-1:-1:-1;;;;;2196:23:0;:7;:5;:7::i;:::-;-1:-1:-1;;;;;2196:23:0;;2188:68;;;;;-1:-1:-1;;;2188:68:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;2718:6:::1;::::0;2697:40:::1;::::0;2734:1:::1;::::0;-1:-1:-1;;;;;2718:6:0::1;::::0;2697:40:::1;::::0;2734:1;;2697:40:::1;2748:6;:19:::0;;-1:-1:-1;;;;;;2748:19:0::1;::::0;;2627:148::o;1976:87::-;2049:6;;-1:-1:-1;;;;;2049:6:0;;1976:87::o;36825:20::-;;;;;;;;;;;;;;;-1:-1:-1;;36825:20:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;26136:227;26263:10;26253:21;;;;:9;:21;;;;;;;;-1:-1:-1;;;;;26253:32:0;;;;;;;;;;;;:44;;-1:-1:-1;;26253:44:0;;;;;;;;;;26309:48;;;;;;;26253:32;;26263:10;26309:48;;;;;;;;;;;26136:227;;:::o;37941:106::-;37996:7;38023:16;;;:11;:16;;;;;;;37941:106::o;39013:100::-;39090:15;;39013:100;:::o;36649:43::-;;;;;;;;;;;;-1:-1:-1;;;;;36649:43:0;;:::o;38313:692::-;2207:12;:10;:12::i;:::-;-1:-1:-1;;;;;2196:23:0;:7;:5;:7::i;:::-;-1:-1:-1;;;;;2196:23:0;;2188:68;;;;;-1:-1:-1;;;2188:68:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;38472:11:::1;;38459:9;:24;;38451:64;;;::::0;;-1:-1:-1;;;38451:64:0;;::::1;;::::0;::::1;::::0;::::1;::::0;;;;::::1;::::0;;;;;;;;;;;;;::::1;;38528:11;38542:17;:15;:17::i;:::-;38528:31;;38570:23;:21;:23::i;:::-;38606:13;::::0;;;:8:::1;:13;::::0;;;;;;;;:26;;-1:-1:-1;;;;;;38606:26:0::1;38622:10;38606:26;::::0;;38643:23;;::::1;::::0;::::1;::::0;;::::1;::::0;::::1;::::0;;;;;;;;;;::::1;::::0;38606:13;;38661:4;;38643:23;;;;;::::1;38661:4:::0;38643:23;;38661:4;38643:23;::::1;;::::0;::::1;::::0;;;;-1:-1:-1;38643:12:0::1;::::0;-1:-1:-1;;;38643:23:0:i:1;:::-;38683:22:::0;;38679:74:::1;;38737:3;38727:14;38731:4;;38727:14;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;;::::1;::::0;::::1;::::0;::::1;::::0;;::::1;-1:-1:-1::0;;38727:14:0::1;::::0;;::::1;::::0;;::::1;::::0;-1:-1:-1;38727:14:0;;-1:-1:-1;;;;38727:14:0::1;38679:74;38765:35;38771:3;38776;38781:7;38790:9;;;;;;;;;;;::::0;38765:5:::1;:35::i;:::-;38811:16;::::0;;;:11:::1;:16;::::0;;;;;:26;;;38911:13:::1;::::0;:40;;-1:-1:-1;;;;;38911:13:0;;::::1;::::0;38937:9:::1;::::0;38811:16;38911:40;38811:16;38911:40;38937:9;38911:13;:40:::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;38892:59;;;38970:7;38962:35;;;::::0;;-1:-1:-1;;;38962:35:0;;::::1;;::::0;::::1;::::0;::::1;::::0;;;;-1:-1:-1;;;38962:35:0;;;;;;;;;;;;;::::1;;2267:1;;38313:692:::0;;;;:::o;39232:421::-;39485:11;;39359:15;;-1:-1:-1;;;;;39485:24:0;;;:11;;:24;;:58;;-1:-1:-1;39513:17:0;;-1:-1:-1;;;;;39513:30:0;;;:17;;:30;39485:58;39481:102;;;-1:-1:-1;39567:4:0;39560:11;;39481:102;39602:43;39627:6;39635:9;39602:24;:43::i;:::-;39595:50;39232:421;-1:-1:-1;;;39232:421:0:o;21369:545::-;-1:-1:-1;;;;;21504:19:0;;:10;:19;;21503:60;;;21528:35;21545:5;21552:10;21528:16;:35::i;:::-;21495:115;;;;-1:-1:-1;;;21495:115:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;21625:17:0;;21617:72;;;;-1:-1:-1;;;21617:72:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;21803:43;21821:5;21828:3;21833;21838:7;21803:17;:43::i;:::-;21853:55;21876:5;21883:3;21888;21893:7;21902:5;21853:22;:55::i;2930:244::-;2207:12;:10;:12::i;:::-;-1:-1:-1;;;;;2196:23:0;:7;:5;:7::i;:::-;-1:-1:-1;;;;;2196:23:0;;2188:68;;;;;-1:-1:-1;;;2188:68:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;3019:22:0;::::1;3011:73;;;;-1:-1:-1::0;;;3011:73:0::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;3121:6;::::0;3100:38:::1;::::0;-1:-1:-1;;;;;3100:38:0;;::::1;::::0;3121:6:::1;::::0;3100:38:::1;::::0;3121:6:::1;::::0;3100:38:::1;3149:6;:17:::0;;-1:-1:-1;;;;;;3149:17:0::1;-1:-1:-1::0;;;;;3149:17:0;;;::::1;::::0;;;::::1;::::0;;2930:244::o;39889:110::-;39940:4;39964:13;;;:8;:13;;;;;;-1:-1:-1;;;;;39964:13:0;:27;;;39889:110::o;24446:687::-;24603:8;:15;24588:4;:11;:30;24580:96;;;;-1:-1:-1;;;24580:96:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;24743:11;;24723:17;24795:247;24819:9;24815:1;:13;24795:247;;;24920:41;24949:8;24958:1;24949:11;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;24920:15:0;;:8;:15;;;;;;;;;;24936:7;;24949:11;;24920:15;;24936:4;;24941:1;;24936:7;;;;;;;;;;;;24920:24;;;;;;;;;;;;:28;;:41;;;;:::i;:::-;-1:-1:-1;;;;;24893:15:0;;:8;:15;;;;;;;;;;24909:7;;24893:15;;:8;24909:4;;24914:1;;24909:7;;;;;;;;;;;;24893:24;;;;;;;;;;;:68;;;;24995:39;25022:8;25031:1;25022:11;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;24995:13:0;;:8;:13;;;;;;;;;;25009:7;;25022:11;;24995:13;;25009:4;;25014:1;;25009:7;;;;;;;;;;;;24995:22;;;;;;;;;;;;:26;;:39;;;;:::i;:::-;-1:-1:-1;;;;;24970:13:0;;:8;:13;;;;;;;;;;24984:7;;24970:13;;:8;24984:4;;24989:1;;24984:7;;;;;;;;;;;;;;;;;24970:22;;;;;;;;;;-1:-1:-1;24970:22:0;:64;24830:3;;24795:247;;;-1:-1:-1;25074:53:0;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;25074:53:0;;;;;;;;25088:10;;25074:53;;25112:4;;25118:8;;25074:53;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;24446:687;;;;;:::o;25251:476::-;25457:16;-1:-1:-1;;;;;25457:14:0;;;:16::i;:::-;25453:269;;;25484:13;25522:3;-1:-1:-1;;;;;25500:49:0;;25550:10;25562:5;25569:4;25575:8;25585:5;25500:91;;;;;;;;;;;;;-1:-1:-1;;;;;25500:91:0;;;;;;-1:-1:-1;;;;;25500:91:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;25500:91:0;;-1:-1:-1;;;;;;;;;;25608:38:0;;;25600:114;;;;-1:-1:-1;;;25600:114:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;605:106;693:10;605:106;:::o;40147:::-;40223:15;;40196:7;;40223:22;;40243:1;40223:19;:22::i;:::-;40216:29;;40147:106;:::o;40332:77::-;40384:15;:17;;;;;;40332:77::o;40653:173::-;40736:12;40744:3;40736:7;:12::i;:::-;40728:57;;;;;-1:-1:-1;;;40728:57:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;40796:15;;;;:10;:15;;;;;;;;:22;;;;;;;;:::i;:::-;;40653:173;;:::o;29977:401::-;-1:-1:-1;;;;;30120:13:0;;:8;:13;;;;;;;;;;;:18;;;;;;;;;:31;;30143:7;30120:22;:31::i;:::-;-1:-1:-1;;;;;30099:13:0;;:8;:13;;;;;;;;;;;:18;;;;;;;;:52;;;;30184:59;;;;;;;;;;;;;30099:13;;:8;;30199:10;;30184:59;;;;;;;;30310:62;30341:3;30347;30352;30357:7;30366:5;30310:22;:62::i;:::-;29977:401;;;;:::o;26611:163::-;-1:-1:-1;;;;;26740:17:0;;;26706:15;26740:17;;;-1:-1:-1;26740:17:0;;;;;;;;:28;;;;;;;;;;;;;;;26611:163::o;23222:376::-;-1:-1:-1;;;;;23378:15:0;;:8;:15;;;;;;;;;;;:20;;;;;;;;;:33;;23403:7;23378:24;:33::i;:::-;-1:-1:-1;;;;;23355:15:0;;;:8;:15;;;;;;;;;;;:20;;;;;;;;:56;;;;23458:13;;;;;;;;;;;:18;;;;;;;;:31;;23481:7;23458:22;:31::i;:::-;-1:-1:-1;;;;;23437:13:0;;;:8;:13;;;;;;;;;;;:18;;;;;;;;;:52;;;;23540;;;;;;;;;;;;;23437:13;;23540:52;;;;23555:10;;23540:52;;;;;;;;;;;23222:376;;;;:::o;23711:429::-;23888:16;-1:-1:-1;;;;;23888:14:0;;;:16::i;:::-;23884:251;;;23931:84;;-1:-1:-1;;;23931:84:0;;23976:10;23931:84;;;;;;-1:-1:-1;;;;;23931:84:0;;;;;;;;;;;;;;;;;;;-1:-1:-1;23931:84:0;;;;;;;;;;;;;;23915:13;;23931:44;;;;;;23976:10;;23988:5;;23995:3;;24000:7;;24009:5;;23931:84;;;;;;;;;;;;;;;23915:13;23931:84;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;23931:84:0;;-1:-1:-1;;;;;;;;;;24032:32:0;;;24024:103;;;;-1:-1:-1;;;24024:103:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;15802:136;15860:7;15887:43;15891:1;15894;15887:43;;;;;;;;;;;;;;;;;:3;:43::i;15346:181::-;15404:7;15436:5;;;15460:6;;;;15452:46;;;;;-1:-1:-1;;;15452:46:0;;;;;;;;;;;;;;;;;;;;;;;;;;;7255:422;7622:20;7661:8;;;7255:422::o;16233:192::-;16319:7;16355:12;16347:6;;;;16339:29;;;;-1:-1:-1;;;16339:29:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;16391:5:0;;;16233:192::o;-1:-1:-1:-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;:::o;:::-;;;;;;;;;;;;;;

Swarm Source

ipfs://b4547c7754cf0b20e18843406e1663c11e710716641fec86d9d1443bc64a1503
Block Transaction Gas Used Reward
Age Block Fee Address BC Fee Address Voting Power Jailed Incoming
Validator ID :
0 FTM

Amount Staked
0

Amount Delegated
0

Staking Total
0

Staking Start Epoch
0

Staking Start Time
0

Proof of Importance
0

Origination Score
0

Validation Score
0

Active
0

Online
0

Downtime
0 s
Address Amount claimed Rewards Created On Epoch Created On
Block Uncle Number Difficulty Gas Used Reward
Loading