Arbitrum Sepolia Testnet

Token

Test Strands Position NFT (TestSP)
ERC-721

Overview

Max Total Supply

0 TestSP

Holders

1

Market

Onchain Market Cap

-

Circulating Supply Market Cap

-
Balance
0 TestSP
0x0000000000000000000000000000000000000000
Loading...
Loading
Loading...
Loading
Loading...
Loading

Click here to update the token information / general information

Contract Source Code Verified (Exact Match)

Contract Name:
StrandsPosition

Compiler Version
v0.8.16+commit.07a7930e

Optimization Enabled:
Yes with 20 runs

Other Settings:
default evmVersion

Contract Source Code (Solidity Standard Json-Input format)

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

import {ERC721} from "solmate/src/tokens/ERC721.sol";
import {ERC20} from "@openzeppelin/contracts/token/ERC20/ERC20.sol";
import {OwnableAdmins} from "../core/OwnableAdmins.sol";
import {DefaultOperatorFilterer} from "operator-filter-registry/src/DefaultOperatorFilterer.sol";
import {console} from "hardhat/console.sol";

//TODO:
//1) add isLong
//2) averagePrice to replace purchasePrice, adjustPosition to replace setSize

contract StrandsPosition is ERC721, DefaultOperatorFilterer, OwnableAdmins {
  struct TradeDetails {
    string tradeId;
    bool isLong;
    uint quantity;
    uint purchasePrice;
    uint tradeTime;
  }
  struct PositionDetails {
    string symbol;
    string exchange;
    TradeDetails[] trades;
    string clearingFirm;
    string accountNumber;
  }

  uint256 MAX_UINT = 0xffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff;
  uint public mintCounter;
  string tURI;
  mapping(uint => PositionDetails) private positionDetails;
  mapping(address => uint[]) private _ownedTokenIds; // Owner -> Owned Token Ids
  mapping(bytes32 => uint) private hashMap; /// bytes32 = keccak256(abi.encodePacked(firm, ac, symbol))

  event PositionExpired(address tokenOwner, uint tokenId, uint totalQuantity, bool isLong);

  constructor(string memory _name, string memory _symbol, string memory _tURI) ERC721(_name, _symbol) {
    tURI = _tURI;
  }

  function tokenURI(uint tokenId) public view override(ERC721) returns (string memory) {
    require((mintCounter == 0 || tokenId <= mintCounter), "can't get URI for nonexistent token");
    return tURI;
  }

  function getPositionDetails(uint tokenId) public view returns (PositionDetails memory) {
    return positionDetails[tokenId];
  }

  function setTokenURI(uint tokenId, string memory _tURI) public onlyAdmins {
    require((mintCounter == 0 || tokenId <= mintCounter), "can't set URI for nonexistent token");
    tURI = _tURI;
  }

  function mint(
    address to,
    string memory symbol_,
    string memory exchange_,
    string memory clearingFirm_,
    string memory accountNumber_,
    TradeDetails memory tradeDetails_
  ) public onlyAdmins {
    // Check NFT exists with same clearingFirm_ and accountNumber_
    bytes32 hashMapKey = keccak256(abi.encodePacked(clearingFirm_, accountNumber_, symbol_));
    require(hashMap[hashMapKey] == 0, "NFT already exists");

    mintCounter += 1;
    positionDetails[mintCounter].trades.push(
      TradeDetails({
        tradeId: tradeDetails_.tradeId,
        isLong: tradeDetails_.isLong,
        quantity: tradeDetails_.quantity,
        purchasePrice: tradeDetails_.purchasePrice,
        tradeTime: tradeDetails_.tradeTime
      })
    );

    positionDetails[mintCounter].symbol = symbol_;
    positionDetails[mintCounter].exchange = exchange_;
    positionDetails[mintCounter].clearingFirm = clearingFirm_;
    positionDetails[mintCounter].accountNumber = accountNumber_;

    hashMap[hashMapKey] = mintCounter;

    _ownedTokenIds[to].push(mintCounter);
    _safeMint(to, mintCounter);
  }

  function addTrade(
    address owner_,
    string memory symbol_,
    string memory exchange_,
    string memory clearingFirm_,
    string memory accountNumber_,
    TradeDetails memory tradeDetails_
  ) external onlyAdmins {
    if (balanceOf(owner_) == 0) {
      mint(owner_, symbol_, exchange_, clearingFirm_, accountNumber_, tradeDetails_);
      return;
    }
    (bool isPositionAvailable, bool isTradeIdAvailable, uint tokenId) = tradeIdExists(
      owner_,
      symbol_,
      clearingFirm_,
      accountNumber_,
      tradeDetails_.tradeId
    );

    if (!isTradeIdAvailable && tokenId != 0) {
      positionDetails[tokenId].trades.push(
        TradeDetails({
          tradeId: tradeDetails_.tradeId,
          isLong: tradeDetails_.isLong,
          quantity: tradeDetails_.quantity,
          purchasePrice: tradeDetails_.purchasePrice,
          tradeTime: tradeDetails_.tradeTime
        })
      );
      return;
    }

    if (!isPositionAvailable) {
      mint(owner_, symbol_, exchange_, clearingFirm_, accountNumber_, tradeDetails_);
    }
  }

  function deleteTrade(
    address owner_,
    string memory tradeId_,
    string memory symbol_,
    string memory clearingFirm_,
    string memory accountNumber_
  ) external onlyAdmins {
    (bool isPositionAvailable, bool isTradeIdAvailable, uint tokenId) = tradeIdExists(
      owner_,
      symbol_,
      clearingFirm_,
      accountNumber_,
      tradeId_
    );
    require(isPositionAvailable && isTradeIdAvailable, "Trade doesn't exist");

    PositionDetails memory positionDetail = positionDetails[tokenId];
    uint length = positionDetail.trades.length;
    if (positionDetail.trades.length == 1) {
      expirePosition(tokenId);
      bytes32 hashMapKey = keccak256(abi.encodePacked(clearingFirm_, accountNumber_, symbol_));
      hashMap[hashMapKey] = 0;
    } else {
      (, uint index) = _tradeIdExists(tokenId, tradeId_);
      positionDetails[tokenId].trades[index] = positionDetails[tokenId].trades[length - 1];
      positionDetails[tokenId].trades.pop();
    }
  }

  function expirePosition(uint tokenId_) public onlyAdmins {
    PositionDetails memory positionDetail = positionDetails[tokenId_];
    address tokenOwner = _ownerOf[tokenId_];

    int totalQuantity;
    for (uint i = 0; i < positionDetail.trades.length; ) {
      if (positionDetail.trades[i].isLong) {
        totalQuantity += int(positionDetail.trades[i].quantity);
      } else {
        totalQuantity -= int(positionDetail.trades[i].quantity);
      }
      unchecked {
        ++i;
      }
    }

    burn(tokenId_);
    delete positionDetails[tokenId_];

    bool isLong = totalQuantity >= 0;
    uint positiveTotalQuantity;
    if (isLong) {
      positiveTotalQuantity = uint(totalQuantity);
    } else {
      positiveTotalQuantity = MAX_UINT - uint(totalQuantity) + 1;
    }
    emit PositionExpired(tokenOwner, tokenId_, positiveTotalQuantity, isLong);
  }

  function burn(uint tokenId_) internal {
    address tokenOwner = _ownerOf[tokenId_];
    uint length = _ownedTokenIds[tokenOwner].length;
    _burn(tokenId_);
    for (uint i = 0; i < length; ) {
      if (tokenId_ == _ownedTokenIds[tokenOwner][i]) {
        _ownedTokenIds[tokenOwner][i] = _ownedTokenIds[tokenOwner][length - 1];
        _ownedTokenIds[tokenOwner].pop();
        break;
      }
      unchecked {
        ++i;
      }
    }
  }

  function transferFrom(address from, address to, uint id) public override onlyAllowedOperator(from) {
    require(from == _ownerOf[id], "WRONG_FROM");
    require(to != address(0), "INVALID_RECIPIENT");
    require(
      isAdmin[msg.sender] || msg.sender == from || isApprovedForAll[from][msg.sender] || msg.sender == getApproved[id],
      "NOT AUTHORIZED"
    );

    unchecked {
      _balanceOf[from]--;
      _balanceOf[to]++;
    }
    _ownerOf[id] = to;
    uint length = _ownedTokenIds[from].length;
    for (uint i = 0; i < length; ) {
      if (id == _ownedTokenIds[from][i]) {
        _ownedTokenIds[from][i] = _ownedTokenIds[from][length - 1];
        _ownedTokenIds[from].pop();
        break;
      }
      unchecked {
        ++i;
      }
    }
    _ownedTokenIds[to].push(id);

    delete getApproved[id];
    emit Transfer(from, to, id);
  }

  /// @dev Returns isPositionAvailable, isTradeIdAvailable, tokenId
  function tradeIdExists(
    address owner_,
    string memory symbol_,
    string memory clearingFirm_,
    string memory accountNumber_,
    string memory tradeId_
  ) public view returns (bool, bool, uint256) {
    uint tokenId = getTokenId(clearingFirm_, accountNumber_, symbol_);

    // Check tokenId exists and correct owner
    if (tokenId > 0 && ownerOf(tokenId) == owner_) {
      (bool _exist, ) = _tradeIdExists(tokenId, tradeId_);
      return (true, _exist, tokenId);
    } else {
      return (false, false, 0);
    }
  }

  function _tradeIdExists(uint tokenId_, string memory tradeId_) internal view returns (bool, uint) {
    PositionDetails memory positionDetail = positionDetails[tokenId_];
    for (uint j = 0; j < positionDetail.trades.length; ) {
      if (stringCompare(positionDetail.trades[j].tradeId, tradeId_)) {
        return (true, j);
      }
      unchecked {
        ++j;
      }
    }
    return (false, 0);
  }

  function getOwnerPositions(address target) public view returns (PositionDetails[] memory) {
    uint length = _ownedTokenIds[target].length;
    PositionDetails[] memory result = new PositionDetails[](length);
    for (uint i = 0; i < length; ++i) {
      result[i] = positionDetails[_ownedTokenIds[target][i]];
    }
    return result;
  }

  function getOwnerTokenIds(address target) public view returns (uint256[] memory) {
    return _ownedTokenIds[target];
  }

  function getTokenId(
    string memory clearingFirm_,
    string memory accountNumber_,
    string memory symbol_
  ) public view returns (uint) {
    bytes32 hashMapKey = keccak256(abi.encodePacked(clearingFirm_, accountNumber_, symbol_));
    return hashMap[hashMapKey];
  }

  function safeTransferFrom(address from, address to, uint id) public override onlyAllowedOperator(from) {
    super.safeTransferFrom(from, to, id);
  }

  function safeTransferFrom(
    address from,
    address to,
    uint id,
    bytes calldata data
  ) public override onlyAllowedOperator(from) {
    super.safeTransferFrom(from, to, id, data);
  }

  function supportsInterface(bytes4 interfaceId) public view virtual override returns (bool) {
    return super.supportsInterface(interfaceId);
  }

  function setApprovalForAll(address operator, bool approved) public override onlyAllowedOperatorApproval(operator) {
    super.setApprovalForAll(operator, approved);
  }

  function approve(address operator, uint tokenId) public override onlyAllowedOperatorApproval(operator) {
    super.approve(operator, tokenId);
  }

  function stringCompare(string memory str1, string memory str2) internal pure returns (bool) {
    if (bytes(str1).length != bytes(str2).length) {
      return false;
    }
    return keccak256(abi.encodePacked(str1)) == keccak256(abi.encodePacked(str2));
  }
}

// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts (last updated v4.9.0) (token/ERC20/ERC20.sol)

pragma solidity ^0.8.0;

import "./IERC20.sol";
import "./extensions/IERC20Metadata.sol";
import "../../utils/Context.sol";

/**
 * @dev Implementation of the {IERC20} interface.
 *
 * This implementation is agnostic to the way tokens are created. This means
 * that a supply mechanism has to be added in a derived contract using {_mint}.
 * For a generic mechanism see {ERC20PresetMinterPauser}.
 *
 * TIP: For a detailed writeup see our guide
 * https://forum.openzeppelin.com/t/how-to-implement-erc20-supply-mechanisms/226[How
 * to implement supply mechanisms].
 *
 * The default value of {decimals} is 18. To change this, you should override
 * this function so it returns a different value.
 *
 * We have followed general OpenZeppelin Contracts guidelines: functions revert
 * instead returning `false` on failure. This behavior is nonetheless
 * conventional and does not conflict with the expectations of ERC20
 * applications.
 *
 * Additionally, an {Approval} event is emitted on calls to {transferFrom}.
 * This allows applications to reconstruct the allowance for all accounts just
 * by listening to said events. Other implementations of the EIP may not emit
 * these events, as it isn't required by the specification.
 *
 * Finally, the non-standard {decreaseAllowance} and {increaseAllowance}
 * functions have been added to mitigate the well-known issues around setting
 * allowances. See {IERC20-approve}.
 */
contract ERC20 is Context, IERC20, IERC20Metadata {
    mapping(address => uint256) private _balances;

    mapping(address => mapping(address => uint256)) private _allowances;

    uint256 private _totalSupply;

    string private _name;
    string private _symbol;

    /**
     * @dev Sets the values for {name} and {symbol}.
     *
     * All two of these values are immutable: they can only be set once during
     * construction.
     */
    constructor(string memory name_, string memory symbol_) {
        _name = name_;
        _symbol = symbol_;
    }

    /**
     * @dev Returns the name of the token.
     */
    function name() public view virtual override returns (string memory) {
        return _name;
    }

    /**
     * @dev Returns the symbol of the token, usually a shorter version of the
     * name.
     */
    function symbol() public view virtual override returns (string memory) {
        return _symbol;
    }

    /**
     * @dev Returns the number of decimals used to get its user representation.
     * For example, if `decimals` equals `2`, a balance of `505` tokens should
     * be displayed to a user as `5.05` (`505 / 10 ** 2`).
     *
     * Tokens usually opt for a value of 18, imitating the relationship between
     * Ether and Wei. This is the default value returned by this function, unless
     * it's overridden.
     *
     * NOTE: This information is only used for _display_ purposes: it in
     * no way affects any of the arithmetic of the contract, including
     * {IERC20-balanceOf} and {IERC20-transfer}.
     */
    function decimals() public view virtual override returns (uint8) {
        return 18;
    }

    /**
     * @dev See {IERC20-totalSupply}.
     */
    function totalSupply() public view virtual override returns (uint256) {
        return _totalSupply;
    }

    /**
     * @dev See {IERC20-balanceOf}.
     */
    function balanceOf(address account) public view virtual override returns (uint256) {
        return _balances[account];
    }

    /**
     * @dev See {IERC20-transfer}.
     *
     * Requirements:
     *
     * - `to` cannot be the zero address.
     * - the caller must have a balance of at least `amount`.
     */
    function transfer(address to, uint256 amount) public virtual override returns (bool) {
        address owner = _msgSender();
        _transfer(owner, to, amount);
        return true;
    }

    /**
     * @dev See {IERC20-allowance}.
     */
    function allowance(address owner, address spender) public view virtual override returns (uint256) {
        return _allowances[owner][spender];
    }

    /**
     * @dev See {IERC20-approve}.
     *
     * NOTE: If `amount` is the maximum `uint256`, the allowance is not updated on
     * `transferFrom`. This is semantically equivalent to an infinite approval.
     *
     * Requirements:
     *
     * - `spender` cannot be the zero address.
     */
    function approve(address spender, uint256 amount) public virtual override returns (bool) {
        address owner = _msgSender();
        _approve(owner, spender, amount);
        return true;
    }

    /**
     * @dev See {IERC20-transferFrom}.
     *
     * Emits an {Approval} event indicating the updated allowance. This is not
     * required by the EIP. See the note at the beginning of {ERC20}.
     *
     * NOTE: Does not update the allowance if the current allowance
     * is the maximum `uint256`.
     *
     * Requirements:
     *
     * - `from` and `to` cannot be the zero address.
     * - `from` must have a balance of at least `amount`.
     * - the caller must have allowance for ``from``'s tokens of at least
     * `amount`.
     */
    function transferFrom(address from, address to, uint256 amount) public virtual override returns (bool) {
        address spender = _msgSender();
        _spendAllowance(from, spender, amount);
        _transfer(from, to, amount);
        return true;
    }

    /**
     * @dev Atomically increases the allowance granted to `spender` by the caller.
     *
     * This is an alternative to {approve} that can be used as a mitigation for
     * problems described in {IERC20-approve}.
     *
     * Emits an {Approval} event indicating the updated allowance.
     *
     * Requirements:
     *
     * - `spender` cannot be the zero address.
     */
    function increaseAllowance(address spender, uint256 addedValue) public virtual returns (bool) {
        address owner = _msgSender();
        _approve(owner, spender, allowance(owner, spender) + addedValue);
        return true;
    }

    /**
     * @dev Atomically decreases the allowance granted to `spender` by the caller.
     *
     * This is an alternative to {approve} that can be used as a mitigation for
     * problems described in {IERC20-approve}.
     *
     * Emits an {Approval} event indicating the updated allowance.
     *
     * Requirements:
     *
     * - `spender` cannot be the zero address.
     * - `spender` must have allowance for the caller of at least
     * `subtractedValue`.
     */
    function decreaseAllowance(address spender, uint256 subtractedValue) public virtual returns (bool) {
        address owner = _msgSender();
        uint256 currentAllowance = allowance(owner, spender);
        require(currentAllowance >= subtractedValue, "ERC20: decreased allowance below zero");
        unchecked {
            _approve(owner, spender, currentAllowance - subtractedValue);
        }

        return true;
    }

    /**
     * @dev Moves `amount` of tokens from `from` to `to`.
     *
     * This internal function is equivalent to {transfer}, and can be used to
     * e.g. implement automatic token fees, slashing mechanisms, etc.
     *
     * Emits a {Transfer} event.
     *
     * Requirements:
     *
     * - `from` cannot be the zero address.
     * - `to` cannot be the zero address.
     * - `from` must have a balance of at least `amount`.
     */
    function _transfer(address from, address to, uint256 amount) internal virtual {
        require(from != address(0), "ERC20: transfer from the zero address");
        require(to != address(0), "ERC20: transfer to the zero address");

        _beforeTokenTransfer(from, to, amount);

        uint256 fromBalance = _balances[from];
        require(fromBalance >= amount, "ERC20: transfer amount exceeds balance");
        unchecked {
            _balances[from] = fromBalance - amount;
            // Overflow not possible: the sum of all balances is capped by totalSupply, and the sum is preserved by
            // decrementing then incrementing.
            _balances[to] += amount;
        }

        emit Transfer(from, to, amount);

        _afterTokenTransfer(from, to, amount);
    }

    /** @dev Creates `amount` tokens and assigns them to `account`, increasing
     * the total supply.
     *
     * Emits a {Transfer} event with `from` set to the zero address.
     *
     * Requirements:
     *
     * - `account` cannot be the zero address.
     */
    function _mint(address account, uint256 amount) internal virtual {
        require(account != address(0), "ERC20: mint to the zero address");

        _beforeTokenTransfer(address(0), account, amount);

        _totalSupply += amount;
        unchecked {
            // Overflow not possible: balance + amount is at most totalSupply + amount, which is checked above.
            _balances[account] += amount;
        }
        emit Transfer(address(0), account, amount);

        _afterTokenTransfer(address(0), account, amount);
    }

    /**
     * @dev Destroys `amount` tokens from `account`, reducing the
     * total supply.
     *
     * Emits a {Transfer} event with `to` set to the zero address.
     *
     * Requirements:
     *
     * - `account` cannot be the zero address.
     * - `account` must have at least `amount` tokens.
     */
    function _burn(address account, uint256 amount) internal virtual {
        require(account != address(0), "ERC20: burn from the zero address");

        _beforeTokenTransfer(account, address(0), amount);

        uint256 accountBalance = _balances[account];
        require(accountBalance >= amount, "ERC20: burn amount exceeds balance");
        unchecked {
            _balances[account] = accountBalance - amount;
            // Overflow not possible: amount <= accountBalance <= totalSupply.
            _totalSupply -= amount;
        }

        emit Transfer(account, address(0), amount);

        _afterTokenTransfer(account, address(0), amount);
    }

    /**
     * @dev Sets `amount` as the allowance of `spender` over the `owner` s tokens.
     *
     * This internal function is equivalent to `approve`, and can be used to
     * e.g. set automatic allowances for certain subsystems, etc.
     *
     * Emits an {Approval} event.
     *
     * Requirements:
     *
     * - `owner` cannot be the zero address.
     * - `spender` cannot be the zero address.
     */
    function _approve(address owner, address spender, uint256 amount) internal virtual {
        require(owner != address(0), "ERC20: approve from the zero address");
        require(spender != address(0), "ERC20: approve to the zero address");

        _allowances[owner][spender] = amount;
        emit Approval(owner, spender, amount);
    }

    /**
     * @dev Updates `owner` s allowance for `spender` based on spent `amount`.
     *
     * Does not update the allowance amount in case of infinite allowance.
     * Revert if not enough allowance is available.
     *
     * Might emit an {Approval} event.
     */
    function _spendAllowance(address owner, address spender, uint256 amount) internal virtual {
        uint256 currentAllowance = allowance(owner, spender);
        if (currentAllowance != type(uint256).max) {
            require(currentAllowance >= amount, "ERC20: insufficient allowance");
            unchecked {
                _approve(owner, spender, currentAllowance - amount);
            }
        }
    }

    /**
     * @dev Hook that is called before any transfer of tokens. This includes
     * minting and burning.
     *
     * Calling conditions:
     *
     * - when `from` and `to` are both non-zero, `amount` of ``from``'s tokens
     * will be transferred to `to`.
     * - when `from` is zero, `amount` tokens will be minted for `to`.
     * - when `to` is zero, `amount` of ``from``'s tokens will be burned.
     * - `from` and `to` are never both zero.
     *
     * To learn more about hooks, head to xref:ROOT:extending-contracts.adoc#using-hooks[Using Hooks].
     */
    function _beforeTokenTransfer(address from, address to, uint256 amount) internal virtual {}

    /**
     * @dev Hook that is called after any transfer of tokens. This includes
     * minting and burning.
     *
     * Calling conditions:
     *
     * - when `from` and `to` are both non-zero, `amount` of ``from``'s tokens
     * has been transferred to `to`.
     * - when `from` is zero, `amount` tokens have been minted for `to`.
     * - when `to` is zero, `amount` of ``from``'s tokens have been burned.
     * - `from` and `to` are never both zero.
     *
     * To learn more about hooks, head to xref:ROOT:extending-contracts.adoc#using-hooks[Using Hooks].
     */
    function _afterTokenTransfer(address from, address to, uint256 amount) internal virtual {}
}

// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts v4.4.1 (token/ERC20/extensions/IERC20Metadata.sol)

pragma solidity ^0.8.0;

import "../IERC20.sol";

/**
 * @dev Interface for the optional metadata functions from the ERC20 standard.
 *
 * _Available since v4.1._
 */
interface IERC20Metadata is IERC20 {
    /**
     * @dev Returns the name of the token.
     */
    function name() external view returns (string memory);

    /**
     * @dev Returns the symbol of the token.
     */
    function symbol() external view returns (string memory);

    /**
     * @dev Returns the decimals places of the token.
     */
    function decimals() external view returns (uint8);
}

// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts (last updated v4.9.0) (token/ERC20/IERC20.sol)

pragma solidity ^0.8.0;

/**
 * @dev Interface of the ERC20 standard as defined in the EIP.
 */
interface IERC20 {
    /**
     * @dev Emitted when `value` tokens are moved from one account (`from`) to
     * another (`to`).
     *
     * Note that `value` may be zero.
     */
    event Transfer(address indexed from, address indexed to, uint256 value);

    /**
     * @dev Emitted when the allowance of a `spender` for an `owner` is set by
     * a call to {approve}. `value` is the new allowance.
     */
    event Approval(address indexed owner, address indexed spender, uint256 value);

    /**
     * @dev Returns the amount of tokens in existence.
     */
    function totalSupply() external view returns (uint256);

    /**
     * @dev Returns the amount of tokens owned by `account`.
     */
    function balanceOf(address account) external view returns (uint256);

    /**
     * @dev Moves `amount` tokens from the caller's account to `to`.
     *
     * Returns a boolean value indicating whether the operation succeeded.
     *
     * Emits a {Transfer} event.
     */
    function transfer(address to, uint256 amount) external returns (bool);

    /**
     * @dev Returns the remaining number of tokens that `spender` will be
     * allowed to spend on behalf of `owner` through {transferFrom}. This is
     * zero by default.
     *
     * This value changes when {approve} or {transferFrom} are called.
     */
    function allowance(address owner, address spender) external view returns (uint256);

    /**
     * @dev Sets `amount` as the allowance of `spender` over the caller's tokens.
     *
     * Returns a boolean value indicating whether the operation succeeded.
     *
     * IMPORTANT: Beware that changing an allowance with this method brings the risk
     * that someone may use both the old and the new allowance by unfortunate
     * transaction ordering. One possible solution to mitigate this race
     * condition is to first reduce the spender's allowance to 0 and set the
     * desired value afterwards:
     * https://github.com/ethereum/EIPs/issues/20#issuecomment-263524729
     *
     * Emits an {Approval} event.
     */
    function approve(address spender, uint256 amount) external returns (bool);

    /**
     * @dev Moves `amount` tokens from `from` to `to` using the
     * allowance mechanism. `amount` is then deducted from the caller's
     * allowance.
     *
     * Returns a boolean value indicating whether the operation succeeded.
     *
     * Emits a {Transfer} event.
     */
    function transferFrom(address from, address to, uint256 amount) external returns (bool);
}

// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts v4.4.1 (utils/Context.sol)

pragma solidity ^0.8.0;

/**
 * @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 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) {
        return msg.sender;
    }

    function _msgData() internal view virtual returns (bytes calldata) {
        return msg.data;
    }
}

// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts v4.4.1 (access/Ownable.sol)

pragma solidity ^0.8.16;

import "@openzeppelin/contracts/utils/Context.sol";

/**
 * @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 OwnableAdmins {
  mapping(address => bool) public isAdmin;
  address public owner;

  event AdminAdded(address indexed newAdmin);
  event AdminRemoved(address indexed oldAdmin);
  event OwnerChanged(address indexed previousOwner, address indexed newOwner);

  /**
   * @dev Initializes the contract setting the deployer as the initial owner.
   */
  constructor() {
    isAdmin[msg.sender] = true;
    owner = msg.sender;
  }

  modifier onlyAdmins() {
    require(isAdmin[msg.sender], "Caller is not Admin");
    _;
  }

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

  function removeAdmin(address oldAdmin_) public virtual onlyOwner {
    require(isAdmin[oldAdmin_], "This address is not admin");
    isAdmin[oldAdmin_] = false;
    emit AdminRemoved(oldAdmin_);
  }

  function addAdmin(address newAdmin_) public virtual onlyOwner {
    require(!isAdmin[newAdmin_], "This address is already have admin role");
    isAdmin[newAdmin_] = true;
    emit AdminAdded(newAdmin_);
  }

  function transferOwnership(address newOwner_) public virtual onlyOwner {
    require(owner != newOwner_, "New owner address is current owner");
    address prevOwner = owner;
    // Revoke admin role from prev owner
    isAdmin[owner] = false;
    // Assign admin role to new owner
    isAdmin[newOwner_] = true;
    owner = newOwner_;
    emit OwnerChanged(prevOwner, newOwner_);
  }
}

File 7 of 12 : console.sol
// SPDX-License-Identifier: MIT
pragma solidity >=0.4.22 <0.9.0;

library console {
    address constant CONSOLE_ADDRESS =
        0x000000000000000000636F6e736F6c652e6c6f67;

    function _sendLogPayloadImplementation(bytes memory payload) internal view {
        address consoleAddress = CONSOLE_ADDRESS;
        /// @solidity memory-safe-assembly
        assembly {
            pop(
                staticcall(
                    gas(),
                    consoleAddress,
                    add(payload, 32),
                    mload(payload),
                    0,
                    0
                )
            )
        }
    }

    function _castToPure(
      function(bytes memory) internal view fnIn
    ) internal pure returns (function(bytes memory) pure fnOut) {
        assembly {
            fnOut := fnIn
        }
    }

    function _sendLogPayload(bytes memory payload) internal pure {
        _castToPure(_sendLogPayloadImplementation)(payload);
    }

    function log() internal pure {
        _sendLogPayload(abi.encodeWithSignature("log()"));
    }
    function logInt(int256 p0) internal pure {
        _sendLogPayload(abi.encodeWithSignature("log(int256)", p0));
    }

    function logUint(uint256 p0) internal pure {
        _sendLogPayload(abi.encodeWithSignature("log(uint256)", p0));
    }

    function logString(string memory p0) internal pure {
        _sendLogPayload(abi.encodeWithSignature("log(string)", p0));
    }

    function logBool(bool p0) internal pure {
        _sendLogPayload(abi.encodeWithSignature("log(bool)", p0));
    }

    function logAddress(address p0) internal pure {
        _sendLogPayload(abi.encodeWithSignature("log(address)", p0));
    }

    function logBytes(bytes memory p0) internal pure {
        _sendLogPayload(abi.encodeWithSignature("log(bytes)", p0));
    }

    function logBytes1(bytes1 p0) internal pure {
        _sendLogPayload(abi.encodeWithSignature("log(bytes1)", p0));
    }

    function logBytes2(bytes2 p0) internal pure {
        _sendLogPayload(abi.encodeWithSignature("log(bytes2)", p0));
    }

    function logBytes3(bytes3 p0) internal pure {
        _sendLogPayload(abi.encodeWithSignature("log(bytes3)", p0));
    }

    function logBytes4(bytes4 p0) internal pure {
        _sendLogPayload(abi.encodeWithSignature("log(bytes4)", p0));
    }

    function logBytes5(bytes5 p0) internal pure {
        _sendLogPayload(abi.encodeWithSignature("log(bytes5)", p0));
    }

    function logBytes6(bytes6 p0) internal pure {
        _sendLogPayload(abi.encodeWithSignature("log(bytes6)", p0));
    }

    function logBytes7(bytes7 p0) internal pure {
        _sendLogPayload(abi.encodeWithSignature("log(bytes7)", p0));
    }

    function logBytes8(bytes8 p0) internal pure {
        _sendLogPayload(abi.encodeWithSignature("log(bytes8)", p0));
    }

    function logBytes9(bytes9 p0) internal pure {
        _sendLogPayload(abi.encodeWithSignature("log(bytes9)", p0));
    }

    function logBytes10(bytes10 p0) internal pure {
        _sendLogPayload(abi.encodeWithSignature("log(bytes10)", p0));
    }

    function logBytes11(bytes11 p0) internal pure {
        _sendLogPayload(abi.encodeWithSignature("log(bytes11)", p0));
    }

    function logBytes12(bytes12 p0) internal pure {
        _sendLogPayload(abi.encodeWithSignature("log(bytes12)", p0));
    }

    function logBytes13(bytes13 p0) internal pure {
        _sendLogPayload(abi.encodeWithSignature("log(bytes13)", p0));
    }

    function logBytes14(bytes14 p0) internal pure {
        _sendLogPayload(abi.encodeWithSignature("log(bytes14)", p0));
    }

    function logBytes15(bytes15 p0) internal pure {
        _sendLogPayload(abi.encodeWithSignature("log(bytes15)", p0));
    }

    function logBytes16(bytes16 p0) internal pure {
        _sendLogPayload(abi.encodeWithSignature("log(bytes16)", p0));
    }

    function logBytes17(bytes17 p0) internal pure {
        _sendLogPayload(abi.encodeWithSignature("log(bytes17)", p0));
    }

    function logBytes18(bytes18 p0) internal pure {
        _sendLogPayload(abi.encodeWithSignature("log(bytes18)", p0));
    }

    function logBytes19(bytes19 p0) internal pure {
        _sendLogPayload(abi.encodeWithSignature("log(bytes19)", p0));
    }

    function logBytes20(bytes20 p0) internal pure {
        _sendLogPayload(abi.encodeWithSignature("log(bytes20)", p0));
    }

    function logBytes21(bytes21 p0) internal pure {
        _sendLogPayload(abi.encodeWithSignature("log(bytes21)", p0));
    }

    function logBytes22(bytes22 p0) internal pure {
        _sendLogPayload(abi.encodeWithSignature("log(bytes22)", p0));
    }

    function logBytes23(bytes23 p0) internal pure {
        _sendLogPayload(abi.encodeWithSignature("log(bytes23)", p0));
    }

    function logBytes24(bytes24 p0) internal pure {
        _sendLogPayload(abi.encodeWithSignature("log(bytes24)", p0));
    }

    function logBytes25(bytes25 p0) internal pure {
        _sendLogPayload(abi.encodeWithSignature("log(bytes25)", p0));
    }

    function logBytes26(bytes26 p0) internal pure {
        _sendLogPayload(abi.encodeWithSignature("log(bytes26)", p0));
    }

    function logBytes27(bytes27 p0) internal pure {
        _sendLogPayload(abi.encodeWithSignature("log(bytes27)", p0));
    }

    function logBytes28(bytes28 p0) internal pure {
        _sendLogPayload(abi.encodeWithSignature("log(bytes28)", p0));
    }

    function logBytes29(bytes29 p0) internal pure {
        _sendLogPayload(abi.encodeWithSignature("log(bytes29)", p0));
    }

    function logBytes30(bytes30 p0) internal pure {
        _sendLogPayload(abi.encodeWithSignature("log(bytes30)", p0));
    }

    function logBytes31(bytes31 p0) internal pure {
        _sendLogPayload(abi.encodeWithSignature("log(bytes31)", p0));
    }

    function logBytes32(bytes32 p0) internal pure {
        _sendLogPayload(abi.encodeWithSignature("log(bytes32)", p0));
    }

    function log(uint256 p0) internal pure {
        _sendLogPayload(abi.encodeWithSignature("log(uint256)", p0));
    }

    function log(string memory p0) internal pure {
        _sendLogPayload(abi.encodeWithSignature("log(string)", p0));
    }

    function log(bool p0) internal pure {
        _sendLogPayload(abi.encodeWithSignature("log(bool)", p0));
    }

    function log(address p0) internal pure {
        _sendLogPayload(abi.encodeWithSignature("log(address)", p0));
    }

    function log(uint256 p0, uint256 p1) internal pure {
        _sendLogPayload(abi.encodeWithSignature("log(uint256,uint256)", p0, p1));
    }

    function log(uint256 p0, string memory p1) internal pure {
        _sendLogPayload(abi.encodeWithSignature("log(uint256,string)", p0, p1));
    }

    function log(uint256 p0, bool p1) internal pure {
        _sendLogPayload(abi.encodeWithSignature("log(uint256,bool)", p0, p1));
    }

    function log(uint256 p0, address p1) internal pure {
        _sendLogPayload(abi.encodeWithSignature("log(uint256,address)", p0, p1));
    }

    function log(string memory p0, uint256 p1) internal pure {
        _sendLogPayload(abi.encodeWithSignature("log(string,uint256)", p0, p1));
    }

    function log(string memory p0, string memory p1) internal pure {
        _sendLogPayload(abi.encodeWithSignature("log(string,string)", p0, p1));
    }

    function log(string memory p0, bool p1) internal pure {
        _sendLogPayload(abi.encodeWithSignature("log(string,bool)", p0, p1));
    }

    function log(string memory p0, address p1) internal pure {
        _sendLogPayload(abi.encodeWithSignature("log(string,address)", p0, p1));
    }

    function log(bool p0, uint256 p1) internal pure {
        _sendLogPayload(abi.encodeWithSignature("log(bool,uint256)", p0, p1));
    }

    function log(bool p0, string memory p1) internal pure {
        _sendLogPayload(abi.encodeWithSignature("log(bool,string)", p0, p1));
    }

    function log(bool p0, bool p1) internal pure {
        _sendLogPayload(abi.encodeWithSignature("log(bool,bool)", p0, p1));
    }

    function log(bool p0, address p1) internal pure {
        _sendLogPayload(abi.encodeWithSignature("log(bool,address)", p0, p1));
    }

    function log(address p0, uint256 p1) internal pure {
        _sendLogPayload(abi.encodeWithSignature("log(address,uint256)", p0, p1));
    }

    function log(address p0, string memory p1) internal pure {
        _sendLogPayload(abi.encodeWithSignature("log(address,string)", p0, p1));
    }

    function log(address p0, bool p1) internal pure {
        _sendLogPayload(abi.encodeWithSignature("log(address,bool)", p0, p1));
    }

    function log(address p0, address p1) internal pure {
        _sendLogPayload(abi.encodeWithSignature("log(address,address)", p0, p1));
    }

    function log(uint256 p0, uint256 p1, uint256 p2) internal pure {
        _sendLogPayload(abi.encodeWithSignature("log(uint256,uint256,uint256)", p0, p1, p2));
    }

    function log(uint256 p0, uint256 p1, string memory p2) internal pure {
        _sendLogPayload(abi.encodeWithSignature("log(uint256,uint256,string)", p0, p1, p2));
    }

    function log(uint256 p0, uint256 p1, bool p2) internal pure {
        _sendLogPayload(abi.encodeWithSignature("log(uint256,uint256,bool)", p0, p1, p2));
    }

    function log(uint256 p0, uint256 p1, address p2) internal pure {
        _sendLogPayload(abi.encodeWithSignature("log(uint256,uint256,address)", p0, p1, p2));
    }

    function log(uint256 p0, string memory p1, uint256 p2) internal pure {
        _sendLogPayload(abi.encodeWithSignature("log(uint256,string,uint256)", p0, p1, p2));
    }

    function log(uint256 p0, string memory p1, string memory p2) internal pure {
        _sendLogPayload(abi.encodeWithSignature("log(uint256,string,string)", p0, p1, p2));
    }

    function log(uint256 p0, string memory p1, bool p2) internal pure {
        _sendLogPayload(abi.encodeWithSignature("log(uint256,string,bool)", p0, p1, p2));
    }

    function log(uint256 p0, string memory p1, address p2) internal pure {
        _sendLogPayload(abi.encodeWithSignature("log(uint256,string,address)", p0, p1, p2));
    }

    function log(uint256 p0, bool p1, uint256 p2) internal pure {
        _sendLogPayload(abi.encodeWithSignature("log(uint256,bool,uint256)", p0, p1, p2));
    }

    function log(uint256 p0, bool p1, string memory p2) internal pure {
        _sendLogPayload(abi.encodeWithSignature("log(uint256,bool,string)", p0, p1, p2));
    }

    function log(uint256 p0, bool p1, bool p2) internal pure {
        _sendLogPayload(abi.encodeWithSignature("log(uint256,bool,bool)", p0, p1, p2));
    }

    function log(uint256 p0, bool p1, address p2) internal pure {
        _sendLogPayload(abi.encodeWithSignature("log(uint256,bool,address)", p0, p1, p2));
    }

    function log(uint256 p0, address p1, uint256 p2) internal pure {
        _sendLogPayload(abi.encodeWithSignature("log(uint256,address,uint256)", p0, p1, p2));
    }

    function log(uint256 p0, address p1, string memory p2) internal pure {
        _sendLogPayload(abi.encodeWithSignature("log(uint256,address,string)", p0, p1, p2));
    }

    function log(uint256 p0, address p1, bool p2) internal pure {
        _sendLogPayload(abi.encodeWithSignature("log(uint256,address,bool)", p0, p1, p2));
    }

    function log(uint256 p0, address p1, address p2) internal pure {
        _sendLogPayload(abi.encodeWithSignature("log(uint256,address,address)", p0, p1, p2));
    }

    function log(string memory p0, uint256 p1, uint256 p2) internal pure {
        _sendLogPayload(abi.encodeWithSignature("log(string,uint256,uint256)", p0, p1, p2));
    }

    function log(string memory p0, uint256 p1, string memory p2) internal pure {
        _sendLogPayload(abi.encodeWithSignature("log(string,uint256,string)", p0, p1, p2));
    }

    function log(string memory p0, uint256 p1, bool p2) internal pure {
        _sendLogPayload(abi.encodeWithSignature("log(string,uint256,bool)", p0, p1, p2));
    }

    function log(string memory p0, uint256 p1, address p2) internal pure {
        _sendLogPayload(abi.encodeWithSignature("log(string,uint256,address)", p0, p1, p2));
    }

    function log(string memory p0, string memory p1, uint256 p2) internal pure {
        _sendLogPayload(abi.encodeWithSignature("log(string,string,uint256)", p0, p1, p2));
    }

    function log(string memory p0, string memory p1, string memory p2) internal pure {
        _sendLogPayload(abi.encodeWithSignature("log(string,string,string)", p0, p1, p2));
    }

    function log(string memory p0, string memory p1, bool p2) internal pure {
        _sendLogPayload(abi.encodeWithSignature("log(string,string,bool)", p0, p1, p2));
    }

    function log(string memory p0, string memory p1, address p2) internal pure {
        _sendLogPayload(abi.encodeWithSignature("log(string,string,address)", p0, p1, p2));
    }

    function log(string memory p0, bool p1, uint256 p2) internal pure {
        _sendLogPayload(abi.encodeWithSignature("log(string,bool,uint256)", p0, p1, p2));
    }

    function log(string memory p0, bool p1, string memory p2) internal pure {
        _sendLogPayload(abi.encodeWithSignature("log(string,bool,string)", p0, p1, p2));
    }

    function log(string memory p0, bool p1, bool p2) internal pure {
        _sendLogPayload(abi.encodeWithSignature("log(string,bool,bool)", p0, p1, p2));
    }

    function log(string memory p0, bool p1, address p2) internal pure {
        _sendLogPayload(abi.encodeWithSignature("log(string,bool,address)", p0, p1, p2));
    }

    function log(string memory p0, address p1, uint256 p2) internal pure {
        _sendLogPayload(abi.encodeWithSignature("log(string,address,uint256)", p0, p1, p2));
    }

    function log(string memory p0, address p1, string memory p2) internal pure {
        _sendLogPayload(abi.encodeWithSignature("log(string,address,string)", p0, p1, p2));
    }

    function log(string memory p0, address p1, bool p2) internal pure {
        _sendLogPayload(abi.encodeWithSignature("log(string,address,bool)", p0, p1, p2));
    }

    function log(string memory p0, address p1, address p2) internal pure {
        _sendLogPayload(abi.encodeWithSignature("log(string,address,address)", p0, p1, p2));
    }

    function log(bool p0, uint256 p1, uint256 p2) internal pure {
        _sendLogPayload(abi.encodeWithSignature("log(bool,uint256,uint256)", p0, p1, p2));
    }

    function log(bool p0, uint256 p1, string memory p2) internal pure {
        _sendLogPayload(abi.encodeWithSignature("log(bool,uint256,string)", p0, p1, p2));
    }

    function log(bool p0, uint256 p1, bool p2) internal pure {
        _sendLogPayload(abi.encodeWithSignature("log(bool,uint256,bool)", p0, p1, p2));
    }

    function log(bool p0, uint256 p1, address p2) internal pure {
        _sendLogPayload(abi.encodeWithSignature("log(bool,uint256,address)", p0, p1, p2));
    }

    function log(bool p0, string memory p1, uint256 p2) internal pure {
        _sendLogPayload(abi.encodeWithSignature("log(bool,string,uint256)", p0, p1, p2));
    }

    function log(bool p0, string memory p1, string memory p2) internal pure {
        _sendLogPayload(abi.encodeWithSignature("log(bool,string,string)", p0, p1, p2));
    }

    function log(bool p0, string memory p1, bool p2) internal pure {
        _sendLogPayload(abi.encodeWithSignature("log(bool,string,bool)", p0, p1, p2));
    }

    function log(bool p0, string memory p1, address p2) internal pure {
        _sendLogPayload(abi.encodeWithSignature("log(bool,string,address)", p0, p1, p2));
    }

    function log(bool p0, bool p1, uint256 p2) internal pure {
        _sendLogPayload(abi.encodeWithSignature("log(bool,bool,uint256)", p0, p1, p2));
    }

    function log(bool p0, bool p1, string memory p2) internal pure {
        _sendLogPayload(abi.encodeWithSignature("log(bool,bool,string)", p0, p1, p2));
    }

    function log(bool p0, bool p1, bool p2) internal pure {
        _sendLogPayload(abi.encodeWithSignature("log(bool,bool,bool)", p0, p1, p2));
    }

    function log(bool p0, bool p1, address p2) internal pure {
        _sendLogPayload(abi.encodeWithSignature("log(bool,bool,address)", p0, p1, p2));
    }

    function log(bool p0, address p1, uint256 p2) internal pure {
        _sendLogPayload(abi.encodeWithSignature("log(bool,address,uint256)", p0, p1, p2));
    }

    function log(bool p0, address p1, string memory p2) internal pure {
        _sendLogPayload(abi.encodeWithSignature("log(bool,address,string)", p0, p1, p2));
    }

    function log(bool p0, address p1, bool p2) internal pure {
        _sendLogPayload(abi.encodeWithSignature("log(bool,address,bool)", p0, p1, p2));
    }

    function log(bool p0, address p1, address p2) internal pure {
        _sendLogPayload(abi.encodeWithSignature("log(bool,address,address)", p0, p1, p2));
    }

    function log(address p0, uint256 p1, uint256 p2) internal pure {
        _sendLogPayload(abi.encodeWithSignature("log(address,uint256,uint256)", p0, p1, p2));
    }

    function log(address p0, uint256 p1, string memory p2) internal pure {
        _sendLogPayload(abi.encodeWithSignature("log(address,uint256,string)", p0, p1, p2));
    }

    function log(address p0, uint256 p1, bool p2) internal pure {
        _sendLogPayload(abi.encodeWithSignature("log(address,uint256,bool)", p0, p1, p2));
    }

    function log(address p0, uint256 p1, address p2) internal pure {
        _sendLogPayload(abi.encodeWithSignature("log(address,uint256,address)", p0, p1, p2));
    }

    function log(address p0, string memory p1, uint256 p2) internal pure {
        _sendLogPayload(abi.encodeWithSignature("log(address,string,uint256)", p0, p1, p2));
    }

    function log(address p0, string memory p1, string memory p2) internal pure {
        _sendLogPayload(abi.encodeWithSignature("log(address,string,string)", p0, p1, p2));
    }

    function log(address p0, string memory p1, bool p2) internal pure {
        _sendLogPayload(abi.encodeWithSignature("log(address,string,bool)", p0, p1, p2));
    }

    function log(address p0, string memory p1, address p2) internal pure {
        _sendLogPayload(abi.encodeWithSignature("log(address,string,address)", p0, p1, p2));
    }

    function log(address p0, bool p1, uint256 p2) internal pure {
        _sendLogPayload(abi.encodeWithSignature("log(address,bool,uint256)", p0, p1, p2));
    }

    function log(address p0, bool p1, string memory p2) internal pure {
        _sendLogPayload(abi.encodeWithSignature("log(address,bool,string)", p0, p1, p2));
    }

    function log(address p0, bool p1, bool p2) internal pure {
        _sendLogPayload(abi.encodeWithSignature("log(address,bool,bool)", p0, p1, p2));
    }

    function log(address p0, bool p1, address p2) internal pure {
        _sendLogPayload(abi.encodeWithSignature("log(address,bool,address)", p0, p1, p2));
    }

    function log(address p0, address p1, uint256 p2) internal pure {
        _sendLogPayload(abi.encodeWithSignature("log(address,address,uint256)", p0, p1, p2));
    }

    function log(address p0, address p1, string memory p2) internal pure {
        _sendLogPayload(abi.encodeWithSignature("log(address,address,string)", p0, p1, p2));
    }

    function log(address p0, address p1, bool p2) internal pure {
        _sendLogPayload(abi.encodeWithSignature("log(address,address,bool)", p0, p1, p2));
    }

    function log(address p0, address p1, address p2) internal pure {
        _sendLogPayload(abi.encodeWithSignature("log(address,address,address)", p0, p1, p2));
    }

    function log(uint256 p0, uint256 p1, uint256 p2, uint256 p3) internal pure {
        _sendLogPayload(abi.encodeWithSignature("log(uint256,uint256,uint256,uint256)", p0, p1, p2, p3));
    }

    function log(uint256 p0, uint256 p1, uint256 p2, string memory p3) internal pure {
        _sendLogPayload(abi.encodeWithSignature("log(uint256,uint256,uint256,string)", p0, p1, p2, p3));
    }

    function log(uint256 p0, uint256 p1, uint256 p2, bool p3) internal pure {
        _sendLogPayload(abi.encodeWithSignature("log(uint256,uint256,uint256,bool)", p0, p1, p2, p3));
    }

    function log(uint256 p0, uint256 p1, uint256 p2, address p3) internal pure {
        _sendLogPayload(abi.encodeWithSignature("log(uint256,uint256,uint256,address)", p0, p1, p2, p3));
    }

    function log(uint256 p0, uint256 p1, string memory p2, uint256 p3) internal pure {
        _sendLogPayload(abi.encodeWithSignature("log(uint256,uint256,string,uint256)", p0, p1, p2, p3));
    }

    function log(uint256 p0, uint256 p1, string memory p2, string memory p3) internal pure {
        _sendLogPayload(abi.encodeWithSignature("log(uint256,uint256,string,string)", p0, p1, p2, p3));
    }

    function log(uint256 p0, uint256 p1, string memory p2, bool p3) internal pure {
        _sendLogPayload(abi.encodeWithSignature("log(uint256,uint256,string,bool)", p0, p1, p2, p3));
    }

    function log(uint256 p0, uint256 p1, string memory p2, address p3) internal pure {
        _sendLogPayload(abi.encodeWithSignature("log(uint256,uint256,string,address)", p0, p1, p2, p3));
    }

    function log(uint256 p0, uint256 p1, bool p2, uint256 p3) internal pure {
        _sendLogPayload(abi.encodeWithSignature("log(uint256,uint256,bool,uint256)", p0, p1, p2, p3));
    }

    function log(uint256 p0, uint256 p1, bool p2, string memory p3) internal pure {
        _sendLogPayload(abi.encodeWithSignature("log(uint256,uint256,bool,string)", p0, p1, p2, p3));
    }

    function log(uint256 p0, uint256 p1, bool p2, bool p3) internal pure {
        _sendLogPayload(abi.encodeWithSignature("log(uint256,uint256,bool,bool)", p0, p1, p2, p3));
    }

    function log(uint256 p0, uint256 p1, bool p2, address p3) internal pure {
        _sendLogPayload(abi.encodeWithSignature("log(uint256,uint256,bool,address)", p0, p1, p2, p3));
    }

    function log(uint256 p0, uint256 p1, address p2, uint256 p3) internal pure {
        _sendLogPayload(abi.encodeWithSignature("log(uint256,uint256,address,uint256)", p0, p1, p2, p3));
    }

    function log(uint256 p0, uint256 p1, address p2, string memory p3) internal pure {
        _sendLogPayload(abi.encodeWithSignature("log(uint256,uint256,address,string)", p0, p1, p2, p3));
    }

    function log(uint256 p0, uint256 p1, address p2, bool p3) internal pure {
        _sendLogPayload(abi.encodeWithSignature("log(uint256,uint256,address,bool)", p0, p1, p2, p3));
    }

    function log(uint256 p0, uint256 p1, address p2, address p3) internal pure {
        _sendLogPayload(abi.encodeWithSignature("log(uint256,uint256,address,address)", p0, p1, p2, p3));
    }

    function log(uint256 p0, string memory p1, uint256 p2, uint256 p3) internal pure {
        _sendLogPayload(abi.encodeWithSignature("log(uint256,string,uint256,uint256)", p0, p1, p2, p3));
    }

    function log(uint256 p0, string memory p1, uint256 p2, string memory p3) internal pure {
        _sendLogPayload(abi.encodeWithSignature("log(uint256,string,uint256,string)", p0, p1, p2, p3));
    }

    function log(uint256 p0, string memory p1, uint256 p2, bool p3) internal pure {
        _sendLogPayload(abi.encodeWithSignature("log(uint256,string,uint256,bool)", p0, p1, p2, p3));
    }

    function log(uint256 p0, string memory p1, uint256 p2, address p3) internal pure {
        _sendLogPayload(abi.encodeWithSignature("log(uint256,string,uint256,address)", p0, p1, p2, p3));
    }

    function log(uint256 p0, string memory p1, string memory p2, uint256 p3) internal pure {
        _sendLogPayload(abi.encodeWithSignature("log(uint256,string,string,uint256)", p0, p1, p2, p3));
    }

    function log(uint256 p0, string memory p1, string memory p2, string memory p3) internal pure {
        _sendLogPayload(abi.encodeWithSignature("log(uint256,string,string,string)", p0, p1, p2, p3));
    }

    function log(uint256 p0, string memory p1, string memory p2, bool p3) internal pure {
        _sendLogPayload(abi.encodeWithSignature("log(uint256,string,string,bool)", p0, p1, p2, p3));
    }

    function log(uint256 p0, string memory p1, string memory p2, address p3) internal pure {
        _sendLogPayload(abi.encodeWithSignature("log(uint256,string,string,address)", p0, p1, p2, p3));
    }

    function log(uint256 p0, string memory p1, bool p2, uint256 p3) internal pure {
        _sendLogPayload(abi.encodeWithSignature("log(uint256,string,bool,uint256)", p0, p1, p2, p3));
    }

    function log(uint256 p0, string memory p1, bool p2, string memory p3) internal pure {
        _sendLogPayload(abi.encodeWithSignature("log(uint256,string,bool,string)", p0, p1, p2, p3));
    }

    function log(uint256 p0, string memory p1, bool p2, bool p3) internal pure {
        _sendLogPayload(abi.encodeWithSignature("log(uint256,string,bool,bool)", p0, p1, p2, p3));
    }

    function log(uint256 p0, string memory p1, bool p2, address p3) internal pure {
        _sendLogPayload(abi.encodeWithSignature("log(uint256,string,bool,address)", p0, p1, p2, p3));
    }

    function log(uint256 p0, string memory p1, address p2, uint256 p3) internal pure {
        _sendLogPayload(abi.encodeWithSignature("log(uint256,string,address,uint256)", p0, p1, p2, p3));
    }

    function log(uint256 p0, string memory p1, address p2, string memory p3) internal pure {
        _sendLogPayload(abi.encodeWithSignature("log(uint256,string,address,string)", p0, p1, p2, p3));
    }

    function log(uint256 p0, string memory p1, address p2, bool p3) internal pure {
        _sendLogPayload(abi.encodeWithSignature("log(uint256,string,address,bool)", p0, p1, p2, p3));
    }

    function log(uint256 p0, string memory p1, address p2, address p3) internal pure {
        _sendLogPayload(abi.encodeWithSignature("log(uint256,string,address,address)", p0, p1, p2, p3));
    }

    function log(uint256 p0, bool p1, uint256 p2, uint256 p3) internal pure {
        _sendLogPayload(abi.encodeWithSignature("log(uint256,bool,uint256,uint256)", p0, p1, p2, p3));
    }

    function log(uint256 p0, bool p1, uint256 p2, string memory p3) internal pure {
        _sendLogPayload(abi.encodeWithSignature("log(uint256,bool,uint256,string)", p0, p1, p2, p3));
    }

    function log(uint256 p0, bool p1, uint256 p2, bool p3) internal pure {
        _sendLogPayload(abi.encodeWithSignature("log(uint256,bool,uint256,bool)", p0, p1, p2, p3));
    }

    function log(uint256 p0, bool p1, uint256 p2, address p3) internal pure {
        _sendLogPayload(abi.encodeWithSignature("log(uint256,bool,uint256,address)", p0, p1, p2, p3));
    }

    function log(uint256 p0, bool p1, string memory p2, uint256 p3) internal pure {
        _sendLogPayload(abi.encodeWithSignature("log(uint256,bool,string,uint256)", p0, p1, p2, p3));
    }

    function log(uint256 p0, bool p1, string memory p2, string memory p3) internal pure {
        _sendLogPayload(abi.encodeWithSignature("log(uint256,bool,string,string)", p0, p1, p2, p3));
    }

    function log(uint256 p0, bool p1, string memory p2, bool p3) internal pure {
        _sendLogPayload(abi.encodeWithSignature("log(uint256,bool,string,bool)", p0, p1, p2, p3));
    }

    function log(uint256 p0, bool p1, string memory p2, address p3) internal pure {
        _sendLogPayload(abi.encodeWithSignature("log(uint256,bool,string,address)", p0, p1, p2, p3));
    }

    function log(uint256 p0, bool p1, bool p2, uint256 p3) internal pure {
        _sendLogPayload(abi.encodeWithSignature("log(uint256,bool,bool,uint256)", p0, p1, p2, p3));
    }

    function log(uint256 p0, bool p1, bool p2, string memory p3) internal pure {
        _sendLogPayload(abi.encodeWithSignature("log(uint256,bool,bool,string)", p0, p1, p2, p3));
    }

    function log(uint256 p0, bool p1, bool p2, bool p3) internal pure {
        _sendLogPayload(abi.encodeWithSignature("log(uint256,bool,bool,bool)", p0, p1, p2, p3));
    }

    function log(uint256 p0, bool p1, bool p2, address p3) internal pure {
        _sendLogPayload(abi.encodeWithSignature("log(uint256,bool,bool,address)", p0, p1, p2, p3));
    }

    function log(uint256 p0, bool p1, address p2, uint256 p3) internal pure {
        _sendLogPayload(abi.encodeWithSignature("log(uint256,bool,address,uint256)", p0, p1, p2, p3));
    }

    function log(uint256 p0, bool p1, address p2, string memory p3) internal pure {
        _sendLogPayload(abi.encodeWithSignature("log(uint256,bool,address,string)", p0, p1, p2, p3));
    }

    function log(uint256 p0, bool p1, address p2, bool p3) internal pure {
        _sendLogPayload(abi.encodeWithSignature("log(uint256,bool,address,bool)", p0, p1, p2, p3));
    }

    function log(uint256 p0, bool p1, address p2, address p3) internal pure {
        _sendLogPayload(abi.encodeWithSignature("log(uint256,bool,address,address)", p0, p1, p2, p3));
    }

    function log(uint256 p0, address p1, uint256 p2, uint256 p3) internal pure {
        _sendLogPayload(abi.encodeWithSignature("log(uint256,address,uint256,uint256)", p0, p1, p2, p3));
    }

    function log(uint256 p0, address p1, uint256 p2, string memory p3) internal pure {
        _sendLogPayload(abi.encodeWithSignature("log(uint256,address,uint256,string)", p0, p1, p2, p3));
    }

    function log(uint256 p0, address p1, uint256 p2, bool p3) internal pure {
        _sendLogPayload(abi.encodeWithSignature("log(uint256,address,uint256,bool)", p0, p1, p2, p3));
    }

    function log(uint256 p0, address p1, uint256 p2, address p3) internal pure {
        _sendLogPayload(abi.encodeWithSignature("log(uint256,address,uint256,address)", p0, p1, p2, p3));
    }

    function log(uint256 p0, address p1, string memory p2, uint256 p3) internal pure {
        _sendLogPayload(abi.encodeWithSignature("log(uint256,address,string,uint256)", p0, p1, p2, p3));
    }

    function log(uint256 p0, address p1, string memory p2, string memory p3) internal pure {
        _sendLogPayload(abi.encodeWithSignature("log(uint256,address,string,string)", p0, p1, p2, p3));
    }

    function log(uint256 p0, address p1, string memory p2, bool p3) internal pure {
        _sendLogPayload(abi.encodeWithSignature("log(uint256,address,string,bool)", p0, p1, p2, p3));
    }

    function log(uint256 p0, address p1, string memory p2, address p3) internal pure {
        _sendLogPayload(abi.encodeWithSignature("log(uint256,address,string,address)", p0, p1, p2, p3));
    }

    function log(uint256 p0, address p1, bool p2, uint256 p3) internal pure {
        _sendLogPayload(abi.encodeWithSignature("log(uint256,address,bool,uint256)", p0, p1, p2, p3));
    }

    function log(uint256 p0, address p1, bool p2, string memory p3) internal pure {
        _sendLogPayload(abi.encodeWithSignature("log(uint256,address,bool,string)", p0, p1, p2, p3));
    }

    function log(uint256 p0, address p1, bool p2, bool p3) internal pure {
        _sendLogPayload(abi.encodeWithSignature("log(uint256,address,bool,bool)", p0, p1, p2, p3));
    }

    function log(uint256 p0, address p1, bool p2, address p3) internal pure {
        _sendLogPayload(abi.encodeWithSignature("log(uint256,address,bool,address)", p0, p1, p2, p3));
    }

    function log(uint256 p0, address p1, address p2, uint256 p3) internal pure {
        _sendLogPayload(abi.encodeWithSignature("log(uint256,address,address,uint256)", p0, p1, p2, p3));
    }

    function log(uint256 p0, address p1, address p2, string memory p3) internal pure {
        _sendLogPayload(abi.encodeWithSignature("log(uint256,address,address,string)", p0, p1, p2, p3));
    }

    function log(uint256 p0, address p1, address p2, bool p3) internal pure {
        _sendLogPayload(abi.encodeWithSignature("log(uint256,address,address,bool)", p0, p1, p2, p3));
    }

    function log(uint256 p0, address p1, address p2, address p3) internal pure {
        _sendLogPayload(abi.encodeWithSignature("log(uint256,address,address,address)", p0, p1, p2, p3));
    }

    function log(string memory p0, uint256 p1, uint256 p2, uint256 p3) internal pure {
        _sendLogPayload(abi.encodeWithSignature("log(string,uint256,uint256,uint256)", p0, p1, p2, p3));
    }

    function log(string memory p0, uint256 p1, uint256 p2, string memory p3) internal pure {
        _sendLogPayload(abi.encodeWithSignature("log(string,uint256,uint256,string)", p0, p1, p2, p3));
    }

    function log(string memory p0, uint256 p1, uint256 p2, bool p3) internal pure {
        _sendLogPayload(abi.encodeWithSignature("log(string,uint256,uint256,bool)", p0, p1, p2, p3));
    }

    function log(string memory p0, uint256 p1, uint256 p2, address p3) internal pure {
        _sendLogPayload(abi.encodeWithSignature("log(string,uint256,uint256,address)", p0, p1, p2, p3));
    }

    function log(string memory p0, uint256 p1, string memory p2, uint256 p3) internal pure {
        _sendLogPayload(abi.encodeWithSignature("log(string,uint256,string,uint256)", p0, p1, p2, p3));
    }

    function log(string memory p0, uint256 p1, string memory p2, string memory p3) internal pure {
        _sendLogPayload(abi.encodeWithSignature("log(string,uint256,string,string)", p0, p1, p2, p3));
    }

    function log(string memory p0, uint256 p1, string memory p2, bool p3) internal pure {
        _sendLogPayload(abi.encodeWithSignature("log(string,uint256,string,bool)", p0, p1, p2, p3));
    }

    function log(string memory p0, uint256 p1, string memory p2, address p3) internal pure {
        _sendLogPayload(abi.encodeWithSignature("log(string,uint256,string,address)", p0, p1, p2, p3));
    }

    function log(string memory p0, uint256 p1, bool p2, uint256 p3) internal pure {
        _sendLogPayload(abi.encodeWithSignature("log(string,uint256,bool,uint256)", p0, p1, p2, p3));
    }

    function log(string memory p0, uint256 p1, bool p2, string memory p3) internal pure {
        _sendLogPayload(abi.encodeWithSignature("log(string,uint256,bool,string)", p0, p1, p2, p3));
    }

    function log(string memory p0, uint256 p1, bool p2, bool p3) internal pure {
        _sendLogPayload(abi.encodeWithSignature("log(string,uint256,bool,bool)", p0, p1, p2, p3));
    }

    function log(string memory p0, uint256 p1, bool p2, address p3) internal pure {
        _sendLogPayload(abi.encodeWithSignature("log(string,uint256,bool,address)", p0, p1, p2, p3));
    }

    function log(string memory p0, uint256 p1, address p2, uint256 p3) internal pure {
        _sendLogPayload(abi.encodeWithSignature("log(string,uint256,address,uint256)", p0, p1, p2, p3));
    }

    function log(string memory p0, uint256 p1, address p2, string memory p3) internal pure {
        _sendLogPayload(abi.encodeWithSignature("log(string,uint256,address,string)", p0, p1, p2, p3));
    }

    function log(string memory p0, uint256 p1, address p2, bool p3) internal pure {
        _sendLogPayload(abi.encodeWithSignature("log(string,uint256,address,bool)", p0, p1, p2, p3));
    }

    function log(string memory p0, uint256 p1, address p2, address p3) internal pure {
        _sendLogPayload(abi.encodeWithSignature("log(string,uint256,address,address)", p0, p1, p2, p3));
    }

    function log(string memory p0, string memory p1, uint256 p2, uint256 p3) internal pure {
        _sendLogPayload(abi.encodeWithSignature("log(string,string,uint256,uint256)", p0, p1, p2, p3));
    }

    function log(string memory p0, string memory p1, uint256 p2, string memory p3) internal pure {
        _sendLogPayload(abi.encodeWithSignature("log(string,string,uint256,string)", p0, p1, p2, p3));
    }

    function log(string memory p0, string memory p1, uint256 p2, bool p3) internal pure {
        _sendLogPayload(abi.encodeWithSignature("log(string,string,uint256,bool)", p0, p1, p2, p3));
    }

    function log(string memory p0, string memory p1, uint256 p2, address p3) internal pure {
        _sendLogPayload(abi.encodeWithSignature("log(string,string,uint256,address)", p0, p1, p2, p3));
    }

    function log(string memory p0, string memory p1, string memory p2, uint256 p3) internal pure {
        _sendLogPayload(abi.encodeWithSignature("log(string,string,string,uint256)", p0, p1, p2, p3));
    }

    function log(string memory p0, string memory p1, string memory p2, string memory p3) internal pure {
        _sendLogPayload(abi.encodeWithSignature("log(string,string,string,string)", p0, p1, p2, p3));
    }

    function log(string memory p0, string memory p1, string memory p2, bool p3) internal pure {
        _sendLogPayload(abi.encodeWithSignature("log(string,string,string,bool)", p0, p1, p2, p3));
    }

    function log(string memory p0, string memory p1, string memory p2, address p3) internal pure {
        _sendLogPayload(abi.encodeWithSignature("log(string,string,string,address)", p0, p1, p2, p3));
    }

    function log(string memory p0, string memory p1, bool p2, uint256 p3) internal pure {
        _sendLogPayload(abi.encodeWithSignature("log(string,string,bool,uint256)", p0, p1, p2, p3));
    }

    function log(string memory p0, string memory p1, bool p2, string memory p3) internal pure {
        _sendLogPayload(abi.encodeWithSignature("log(string,string,bool,string)", p0, p1, p2, p3));
    }

    function log(string memory p0, string memory p1, bool p2, bool p3) internal pure {
        _sendLogPayload(abi.encodeWithSignature("log(string,string,bool,bool)", p0, p1, p2, p3));
    }

    function log(string memory p0, string memory p1, bool p2, address p3) internal pure {
        _sendLogPayload(abi.encodeWithSignature("log(string,string,bool,address)", p0, p1, p2, p3));
    }

    function log(string memory p0, string memory p1, address p2, uint256 p3) internal pure {
        _sendLogPayload(abi.encodeWithSignature("log(string,string,address,uint256)", p0, p1, p2, p3));
    }

    function log(string memory p0, string memory p1, address p2, string memory p3) internal pure {
        _sendLogPayload(abi.encodeWithSignature("log(string,string,address,string)", p0, p1, p2, p3));
    }

    function log(string memory p0, string memory p1, address p2, bool p3) internal pure {
        _sendLogPayload(abi.encodeWithSignature("log(string,string,address,bool)", p0, p1, p2, p3));
    }

    function log(string memory p0, string memory p1, address p2, address p3) internal pure {
        _sendLogPayload(abi.encodeWithSignature("log(string,string,address,address)", p0, p1, p2, p3));
    }

    function log(string memory p0, bool p1, uint256 p2, uint256 p3) internal pure {
        _sendLogPayload(abi.encodeWithSignature("log(string,bool,uint256,uint256)", p0, p1, p2, p3));
    }

    function log(string memory p0, bool p1, uint256 p2, string memory p3) internal pure {
        _sendLogPayload(abi.encodeWithSignature("log(string,bool,uint256,string)", p0, p1, p2, p3));
    }

    function log(string memory p0, bool p1, uint256 p2, bool p3) internal pure {
        _sendLogPayload(abi.encodeWithSignature("log(string,bool,uint256,bool)", p0, p1, p2, p3));
    }

    function log(string memory p0, bool p1, uint256 p2, address p3) internal pure {
        _sendLogPayload(abi.encodeWithSignature("log(string,bool,uint256,address)", p0, p1, p2, p3));
    }

    function log(string memory p0, bool p1, string memory p2, uint256 p3) internal pure {
        _sendLogPayload(abi.encodeWithSignature("log(string,bool,string,uint256)", p0, p1, p2, p3));
    }

    function log(string memory p0, bool p1, string memory p2, string memory p3) internal pure {
        _sendLogPayload(abi.encodeWithSignature("log(string,bool,string,string)", p0, p1, p2, p3));
    }

    function log(string memory p0, bool p1, string memory p2, bool p3) internal pure {
        _sendLogPayload(abi.encodeWithSignature("log(string,bool,string,bool)", p0, p1, p2, p3));
    }

    function log(string memory p0, bool p1, string memory p2, address p3) internal pure {
        _sendLogPayload(abi.encodeWithSignature("log(string,bool,string,address)", p0, p1, p2, p3));
    }

    function log(string memory p0, bool p1, bool p2, uint256 p3) internal pure {
        _sendLogPayload(abi.encodeWithSignature("log(string,bool,bool,uint256)", p0, p1, p2, p3));
    }

    function log(string memory p0, bool p1, bool p2, string memory p3) internal pure {
        _sendLogPayload(abi.encodeWithSignature("log(string,bool,bool,string)", p0, p1, p2, p3));
    }

    function log(string memory p0, bool p1, bool p2, bool p3) internal pure {
        _sendLogPayload(abi.encodeWithSignature("log(string,bool,bool,bool)", p0, p1, p2, p3));
    }

    function log(string memory p0, bool p1, bool p2, address p3) internal pure {
        _sendLogPayload(abi.encodeWithSignature("log(string,bool,bool,address)", p0, p1, p2, p3));
    }

    function log(string memory p0, bool p1, address p2, uint256 p3) internal pure {
        _sendLogPayload(abi.encodeWithSignature("log(string,bool,address,uint256)", p0, p1, p2, p3));
    }

    function log(string memory p0, bool p1, address p2, string memory p3) internal pure {
        _sendLogPayload(abi.encodeWithSignature("log(string,bool,address,string)", p0, p1, p2, p3));
    }

    function log(string memory p0, bool p1, address p2, bool p3) internal pure {
        _sendLogPayload(abi.encodeWithSignature("log(string,bool,address,bool)", p0, p1, p2, p3));
    }

    function log(string memory p0, bool p1, address p2, address p3) internal pure {
        _sendLogPayload(abi.encodeWithSignature("log(string,bool,address,address)", p0, p1, p2, p3));
    }

    function log(string memory p0, address p1, uint256 p2, uint256 p3) internal pure {
        _sendLogPayload(abi.encodeWithSignature("log(string,address,uint256,uint256)", p0, p1, p2, p3));
    }

    function log(string memory p0, address p1, uint256 p2, string memory p3) internal pure {
        _sendLogPayload(abi.encodeWithSignature("log(string,address,uint256,string)", p0, p1, p2, p3));
    }

    function log(string memory p0, address p1, uint256 p2, bool p3) internal pure {
        _sendLogPayload(abi.encodeWithSignature("log(string,address,uint256,bool)", p0, p1, p2, p3));
    }

    function log(string memory p0, address p1, uint256 p2, address p3) internal pure {
        _sendLogPayload(abi.encodeWithSignature("log(string,address,uint256,address)", p0, p1, p2, p3));
    }

    function log(string memory p0, address p1, string memory p2, uint256 p3) internal pure {
        _sendLogPayload(abi.encodeWithSignature("log(string,address,string,uint256)", p0, p1, p2, p3));
    }

    function log(string memory p0, address p1, string memory p2, string memory p3) internal pure {
        _sendLogPayload(abi.encodeWithSignature("log(string,address,string,string)", p0, p1, p2, p3));
    }

    function log(string memory p0, address p1, string memory p2, bool p3) internal pure {
        _sendLogPayload(abi.encodeWithSignature("log(string,address,string,bool)", p0, p1, p2, p3));
    }

    function log(string memory p0, address p1, string memory p2, address p3) internal pure {
        _sendLogPayload(abi.encodeWithSignature("log(string,address,string,address)", p0, p1, p2, p3));
    }

    function log(string memory p0, address p1, bool p2, uint256 p3) internal pure {
        _sendLogPayload(abi.encodeWithSignature("log(string,address,bool,uint256)", p0, p1, p2, p3));
    }

    function log(string memory p0, address p1, bool p2, string memory p3) internal pure {
        _sendLogPayload(abi.encodeWithSignature("log(string,address,bool,string)", p0, p1, p2, p3));
    }

    function log(string memory p0, address p1, bool p2, bool p3) internal pure {
        _sendLogPayload(abi.encodeWithSignature("log(string,address,bool,bool)", p0, p1, p2, p3));
    }

    function log(string memory p0, address p1, bool p2, address p3) internal pure {
        _sendLogPayload(abi.encodeWithSignature("log(string,address,bool,address)", p0, p1, p2, p3));
    }

    function log(string memory p0, address p1, address p2, uint256 p3) internal pure {
        _sendLogPayload(abi.encodeWithSignature("log(string,address,address,uint256)", p0, p1, p2, p3));
    }

    function log(string memory p0, address p1, address p2, string memory p3) internal pure {
        _sendLogPayload(abi.encodeWithSignature("log(string,address,address,string)", p0, p1, p2, p3));
    }

    function log(string memory p0, address p1, address p2, bool p3) internal pure {
        _sendLogPayload(abi.encodeWithSignature("log(string,address,address,bool)", p0, p1, p2, p3));
    }

    function log(string memory p0, address p1, address p2, address p3) internal pure {
        _sendLogPayload(abi.encodeWithSignature("log(string,address,address,address)", p0, p1, p2, p3));
    }

    function log(bool p0, uint256 p1, uint256 p2, uint256 p3) internal pure {
        _sendLogPayload(abi.encodeWithSignature("log(bool,uint256,uint256,uint256)", p0, p1, p2, p3));
    }

    function log(bool p0, uint256 p1, uint256 p2, string memory p3) internal pure {
        _sendLogPayload(abi.encodeWithSignature("log(bool,uint256,uint256,string)", p0, p1, p2, p3));
    }

    function log(bool p0, uint256 p1, uint256 p2, bool p3) internal pure {
        _sendLogPayload(abi.encodeWithSignature("log(bool,uint256,uint256,bool)", p0, p1, p2, p3));
    }

    function log(bool p0, uint256 p1, uint256 p2, address p3) internal pure {
        _sendLogPayload(abi.encodeWithSignature("log(bool,uint256,uint256,address)", p0, p1, p2, p3));
    }

    function log(bool p0, uint256 p1, string memory p2, uint256 p3) internal pure {
        _sendLogPayload(abi.encodeWithSignature("log(bool,uint256,string,uint256)", p0, p1, p2, p3));
    }

    function log(bool p0, uint256 p1, string memory p2, string memory p3) internal pure {
        _sendLogPayload(abi.encodeWithSignature("log(bool,uint256,string,string)", p0, p1, p2, p3));
    }

    function log(bool p0, uint256 p1, string memory p2, bool p3) internal pure {
        _sendLogPayload(abi.encodeWithSignature("log(bool,uint256,string,bool)", p0, p1, p2, p3));
    }

    function log(bool p0, uint256 p1, string memory p2, address p3) internal pure {
        _sendLogPayload(abi.encodeWithSignature("log(bool,uint256,string,address)", p0, p1, p2, p3));
    }

    function log(bool p0, uint256 p1, bool p2, uint256 p3) internal pure {
        _sendLogPayload(abi.encodeWithSignature("log(bool,uint256,bool,uint256)", p0, p1, p2, p3));
    }

    function log(bool p0, uint256 p1, bool p2, string memory p3) internal pure {
        _sendLogPayload(abi.encodeWithSignature("log(bool,uint256,bool,string)", p0, p1, p2, p3));
    }

    function log(bool p0, uint256 p1, bool p2, bool p3) internal pure {
        _sendLogPayload(abi.encodeWithSignature("log(bool,uint256,bool,bool)", p0, p1, p2, p3));
    }

    function log(bool p0, uint256 p1, bool p2, address p3) internal pure {
        _sendLogPayload(abi.encodeWithSignature("log(bool,uint256,bool,address)", p0, p1, p2, p3));
    }

    function log(bool p0, uint256 p1, address p2, uint256 p3) internal pure {
        _sendLogPayload(abi.encodeWithSignature("log(bool,uint256,address,uint256)", p0, p1, p2, p3));
    }

    function log(bool p0, uint256 p1, address p2, string memory p3) internal pure {
        _sendLogPayload(abi.encodeWithSignature("log(bool,uint256,address,string)", p0, p1, p2, p3));
    }

    function log(bool p0, uint256 p1, address p2, bool p3) internal pure {
        _sendLogPayload(abi.encodeWithSignature("log(bool,uint256,address,bool)", p0, p1, p2, p3));
    }

    function log(bool p0, uint256 p1, address p2, address p3) internal pure {
        _sendLogPayload(abi.encodeWithSignature("log(bool,uint256,address,address)", p0, p1, p2, p3));
    }

    function log(bool p0, string memory p1, uint256 p2, uint256 p3) internal pure {
        _sendLogPayload(abi.encodeWithSignature("log(bool,string,uint256,uint256)", p0, p1, p2, p3));
    }

    function log(bool p0, string memory p1, uint256 p2, string memory p3) internal pure {
        _sendLogPayload(abi.encodeWithSignature("log(bool,string,uint256,string)", p0, p1, p2, p3));
    }

    function log(bool p0, string memory p1, uint256 p2, bool p3) internal pure {
        _sendLogPayload(abi.encodeWithSignature("log(bool,string,uint256,bool)", p0, p1, p2, p3));
    }

    function log(bool p0, string memory p1, uint256 p2, address p3) internal pure {
        _sendLogPayload(abi.encodeWithSignature("log(bool,string,uint256,address)", p0, p1, p2, p3));
    }

    function log(bool p0, string memory p1, string memory p2, uint256 p3) internal pure {
        _sendLogPayload(abi.encodeWithSignature("log(bool,string,string,uint256)", p0, p1, p2, p3));
    }

    function log(bool p0, string memory p1, string memory p2, string memory p3) internal pure {
        _sendLogPayload(abi.encodeWithSignature("log(bool,string,string,string)", p0, p1, p2, p3));
    }

    function log(bool p0, string memory p1, string memory p2, bool p3) internal pure {
        _sendLogPayload(abi.encodeWithSignature("log(bool,string,string,bool)", p0, p1, p2, p3));
    }

    function log(bool p0, string memory p1, string memory p2, address p3) internal pure {
        _sendLogPayload(abi.encodeWithSignature("log(bool,string,string,address)", p0, p1, p2, p3));
    }

    function log(bool p0, string memory p1, bool p2, uint256 p3) internal pure {
        _sendLogPayload(abi.encodeWithSignature("log(bool,string,bool,uint256)", p0, p1, p2, p3));
    }

    function log(bool p0, string memory p1, bool p2, string memory p3) internal pure {
        _sendLogPayload(abi.encodeWithSignature("log(bool,string,bool,string)", p0, p1, p2, p3));
    }

    function log(bool p0, string memory p1, bool p2, bool p3) internal pure {
        _sendLogPayload(abi.encodeWithSignature("log(bool,string,bool,bool)", p0, p1, p2, p3));
    }

    function log(bool p0, string memory p1, bool p2, address p3) internal pure {
        _sendLogPayload(abi.encodeWithSignature("log(bool,string,bool,address)", p0, p1, p2, p3));
    }

    function log(bool p0, string memory p1, address p2, uint256 p3) internal pure {
        _sendLogPayload(abi.encodeWithSignature("log(bool,string,address,uint256)", p0, p1, p2, p3));
    }

    function log(bool p0, string memory p1, address p2, string memory p3) internal pure {
        _sendLogPayload(abi.encodeWithSignature("log(bool,string,address,string)", p0, p1, p2, p3));
    }

    function log(bool p0, string memory p1, address p2, bool p3) internal pure {
        _sendLogPayload(abi.encodeWithSignature("log(bool,string,address,bool)", p0, p1, p2, p3));
    }

    function log(bool p0, string memory p1, address p2, address p3) internal pure {
        _sendLogPayload(abi.encodeWithSignature("log(bool,string,address,address)", p0, p1, p2, p3));
    }

    function log(bool p0, bool p1, uint256 p2, uint256 p3) internal pure {
        _sendLogPayload(abi.encodeWithSignature("log(bool,bool,uint256,uint256)", p0, p1, p2, p3));
    }

    function log(bool p0, bool p1, uint256 p2, string memory p3) internal pure {
        _sendLogPayload(abi.encodeWithSignature("log(bool,bool,uint256,string)", p0, p1, p2, p3));
    }

    function log(bool p0, bool p1, uint256 p2, bool p3) internal pure {
        _sendLogPayload(abi.encodeWithSignature("log(bool,bool,uint256,bool)", p0, p1, p2, p3));
    }

    function log(bool p0, bool p1, uint256 p2, address p3) internal pure {
        _sendLogPayload(abi.encodeWithSignature("log(bool,bool,uint256,address)", p0, p1, p2, p3));
    }

    function log(bool p0, bool p1, string memory p2, uint256 p3) internal pure {
        _sendLogPayload(abi.encodeWithSignature("log(bool,bool,string,uint256)", p0, p1, p2, p3));
    }

    function log(bool p0, bool p1, string memory p2, string memory p3) internal pure {
        _sendLogPayload(abi.encodeWithSignature("log(bool,bool,string,string)", p0, p1, p2, p3));
    }

    function log(bool p0, bool p1, string memory p2, bool p3) internal pure {
        _sendLogPayload(abi.encodeWithSignature("log(bool,bool,string,bool)", p0, p1, p2, p3));
    }

    function log(bool p0, bool p1, string memory p2, address p3) internal pure {
        _sendLogPayload(abi.encodeWithSignature("log(bool,bool,string,address)", p0, p1, p2, p3));
    }

    function log(bool p0, bool p1, bool p2, uint256 p3) internal pure {
        _sendLogPayload(abi.encodeWithSignature("log(bool,bool,bool,uint256)", p0, p1, p2, p3));
    }

    function log(bool p0, bool p1, bool p2, string memory p3) internal pure {
        _sendLogPayload(abi.encodeWithSignature("log(bool,bool,bool,string)", p0, p1, p2, p3));
    }

    function log(bool p0, bool p1, bool p2, bool p3) internal pure {
        _sendLogPayload(abi.encodeWithSignature("log(bool,bool,bool,bool)", p0, p1, p2, p3));
    }

    function log(bool p0, bool p1, bool p2, address p3) internal pure {
        _sendLogPayload(abi.encodeWithSignature("log(bool,bool,bool,address)", p0, p1, p2, p3));
    }

    function log(bool p0, bool p1, address p2, uint256 p3) internal pure {
        _sendLogPayload(abi.encodeWithSignature("log(bool,bool,address,uint256)", p0, p1, p2, p3));
    }

    function log(bool p0, bool p1, address p2, string memory p3) internal pure {
        _sendLogPayload(abi.encodeWithSignature("log(bool,bool,address,string)", p0, p1, p2, p3));
    }

    function log(bool p0, bool p1, address p2, bool p3) internal pure {
        _sendLogPayload(abi.encodeWithSignature("log(bool,bool,address,bool)", p0, p1, p2, p3));
    }

    function log(bool p0, bool p1, address p2, address p3) internal pure {
        _sendLogPayload(abi.encodeWithSignature("log(bool,bool,address,address)", p0, p1, p2, p3));
    }

    function log(bool p0, address p1, uint256 p2, uint256 p3) internal pure {
        _sendLogPayload(abi.encodeWithSignature("log(bool,address,uint256,uint256)", p0, p1, p2, p3));
    }

    function log(bool p0, address p1, uint256 p2, string memory p3) internal pure {
        _sendLogPayload(abi.encodeWithSignature("log(bool,address,uint256,string)", p0, p1, p2, p3));
    }

    function log(bool p0, address p1, uint256 p2, bool p3) internal pure {
        _sendLogPayload(abi.encodeWithSignature("log(bool,address,uint256,bool)", p0, p1, p2, p3));
    }

    function log(bool p0, address p1, uint256 p2, address p3) internal pure {
        _sendLogPayload(abi.encodeWithSignature("log(bool,address,uint256,address)", p0, p1, p2, p3));
    }

    function log(bool p0, address p1, string memory p2, uint256 p3) internal pure {
        _sendLogPayload(abi.encodeWithSignature("log(bool,address,string,uint256)", p0, p1, p2, p3));
    }

    function log(bool p0, address p1, string memory p2, string memory p3) internal pure {
        _sendLogPayload(abi.encodeWithSignature("log(bool,address,string,string)", p0, p1, p2, p3));
    }

    function log(bool p0, address p1, string memory p2, bool p3) internal pure {
        _sendLogPayload(abi.encodeWithSignature("log(bool,address,string,bool)", p0, p1, p2, p3));
    }

    function log(bool p0, address p1, string memory p2, address p3) internal pure {
        _sendLogPayload(abi.encodeWithSignature("log(bool,address,string,address)", p0, p1, p2, p3));
    }

    function log(bool p0, address p1, bool p2, uint256 p3) internal pure {
        _sendLogPayload(abi.encodeWithSignature("log(bool,address,bool,uint256)", p0, p1, p2, p3));
    }

    function log(bool p0, address p1, bool p2, string memory p3) internal pure {
        _sendLogPayload(abi.encodeWithSignature("log(bool,address,bool,string)", p0, p1, p2, p3));
    }

    function log(bool p0, address p1, bool p2, bool p3) internal pure {
        _sendLogPayload(abi.encodeWithSignature("log(bool,address,bool,bool)", p0, p1, p2, p3));
    }

    function log(bool p0, address p1, bool p2, address p3) internal pure {
        _sendLogPayload(abi.encodeWithSignature("log(bool,address,bool,address)", p0, p1, p2, p3));
    }

    function log(bool p0, address p1, address p2, uint256 p3) internal pure {
        _sendLogPayload(abi.encodeWithSignature("log(bool,address,address,uint256)", p0, p1, p2, p3));
    }

    function log(bool p0, address p1, address p2, string memory p3) internal pure {
        _sendLogPayload(abi.encodeWithSignature("log(bool,address,address,string)", p0, p1, p2, p3));
    }

    function log(bool p0, address p1, address p2, bool p3) internal pure {
        _sendLogPayload(abi.encodeWithSignature("log(bool,address,address,bool)", p0, p1, p2, p3));
    }

    function log(bool p0, address p1, address p2, address p3) internal pure {
        _sendLogPayload(abi.encodeWithSignature("log(bool,address,address,address)", p0, p1, p2, p3));
    }

    function log(address p0, uint256 p1, uint256 p2, uint256 p3) internal pure {
        _sendLogPayload(abi.encodeWithSignature("log(address,uint256,uint256,uint256)", p0, p1, p2, p3));
    }

    function log(address p0, uint256 p1, uint256 p2, string memory p3) internal pure {
        _sendLogPayload(abi.encodeWithSignature("log(address,uint256,uint256,string)", p0, p1, p2, p3));
    }

    function log(address p0, uint256 p1, uint256 p2, bool p3) internal pure {
        _sendLogPayload(abi.encodeWithSignature("log(address,uint256,uint256,bool)", p0, p1, p2, p3));
    }

    function log(address p0, uint256 p1, uint256 p2, address p3) internal pure {
        _sendLogPayload(abi.encodeWithSignature("log(address,uint256,uint256,address)", p0, p1, p2, p3));
    }

    function log(address p0, uint256 p1, string memory p2, uint256 p3) internal pure {
        _sendLogPayload(abi.encodeWithSignature("log(address,uint256,string,uint256)", p0, p1, p2, p3));
    }

    function log(address p0, uint256 p1, string memory p2, string memory p3) internal pure {
        _sendLogPayload(abi.encodeWithSignature("log(address,uint256,string,string)", p0, p1, p2, p3));
    }

    function log(address p0, uint256 p1, string memory p2, bool p3) internal pure {
        _sendLogPayload(abi.encodeWithSignature("log(address,uint256,string,bool)", p0, p1, p2, p3));
    }

    function log(address p0, uint256 p1, string memory p2, address p3) internal pure {
        _sendLogPayload(abi.encodeWithSignature("log(address,uint256,string,address)", p0, p1, p2, p3));
    }

    function log(address p0, uint256 p1, bool p2, uint256 p3) internal pure {
        _sendLogPayload(abi.encodeWithSignature("log(address,uint256,bool,uint256)", p0, p1, p2, p3));
    }

    function log(address p0, uint256 p1, bool p2, string memory p3) internal pure {
        _sendLogPayload(abi.encodeWithSignature("log(address,uint256,bool,string)", p0, p1, p2, p3));
    }

    function log(address p0, uint256 p1, bool p2, bool p3) internal pure {
        _sendLogPayload(abi.encodeWithSignature("log(address,uint256,bool,bool)", p0, p1, p2, p3));
    }

    function log(address p0, uint256 p1, bool p2, address p3) internal pure {
        _sendLogPayload(abi.encodeWithSignature("log(address,uint256,bool,address)", p0, p1, p2, p3));
    }

    function log(address p0, uint256 p1, address p2, uint256 p3) internal pure {
        _sendLogPayload(abi.encodeWithSignature("log(address,uint256,address,uint256)", p0, p1, p2, p3));
    }

    function log(address p0, uint256 p1, address p2, string memory p3) internal pure {
        _sendLogPayload(abi.encodeWithSignature("log(address,uint256,address,string)", p0, p1, p2, p3));
    }

    function log(address p0, uint256 p1, address p2, bool p3) internal pure {
        _sendLogPayload(abi.encodeWithSignature("log(address,uint256,address,bool)", p0, p1, p2, p3));
    }

    function log(address p0, uint256 p1, address p2, address p3) internal pure {
        _sendLogPayload(abi.encodeWithSignature("log(address,uint256,address,address)", p0, p1, p2, p3));
    }

    function log(address p0, string memory p1, uint256 p2, uint256 p3) internal pure {
        _sendLogPayload(abi.encodeWithSignature("log(address,string,uint256,uint256)", p0, p1, p2, p3));
    }

    function log(address p0, string memory p1, uint256 p2, string memory p3) internal pure {
        _sendLogPayload(abi.encodeWithSignature("log(address,string,uint256,string)", p0, p1, p2, p3));
    }

    function log(address p0, string memory p1, uint256 p2, bool p3) internal pure {
        _sendLogPayload(abi.encodeWithSignature("log(address,string,uint256,bool)", p0, p1, p2, p3));
    }

    function log(address p0, string memory p1, uint256 p2, address p3) internal pure {
        _sendLogPayload(abi.encodeWithSignature("log(address,string,uint256,address)", p0, p1, p2, p3));
    }

    function log(address p0, string memory p1, string memory p2, uint256 p3) internal pure {
        _sendLogPayload(abi.encodeWithSignature("log(address,string,string,uint256)", p0, p1, p2, p3));
    }

    function log(address p0, string memory p1, string memory p2, string memory p3) internal pure {
        _sendLogPayload(abi.encodeWithSignature("log(address,string,string,string)", p0, p1, p2, p3));
    }

    function log(address p0, string memory p1, string memory p2, bool p3) internal pure {
        _sendLogPayload(abi.encodeWithSignature("log(address,string,string,bool)", p0, p1, p2, p3));
    }

    function log(address p0, string memory p1, string memory p2, address p3) internal pure {
        _sendLogPayload(abi.encodeWithSignature("log(address,string,string,address)", p0, p1, p2, p3));
    }

    function log(address p0, string memory p1, bool p2, uint256 p3) internal pure {
        _sendLogPayload(abi.encodeWithSignature("log(address,string,bool,uint256)", p0, p1, p2, p3));
    }

    function log(address p0, string memory p1, bool p2, string memory p3) internal pure {
        _sendLogPayload(abi.encodeWithSignature("log(address,string,bool,string)", p0, p1, p2, p3));
    }

    function log(address p0, string memory p1, bool p2, bool p3) internal pure {
        _sendLogPayload(abi.encodeWithSignature("log(address,string,bool,bool)", p0, p1, p2, p3));
    }

    function log(address p0, string memory p1, bool p2, address p3) internal pure {
        _sendLogPayload(abi.encodeWithSignature("log(address,string,bool,address)", p0, p1, p2, p3));
    }

    function log(address p0, string memory p1, address p2, uint256 p3) internal pure {
        _sendLogPayload(abi.encodeWithSignature("log(address,string,address,uint256)", p0, p1, p2, p3));
    }

    function log(address p0, string memory p1, address p2, string memory p3) internal pure {
        _sendLogPayload(abi.encodeWithSignature("log(address,string,address,string)", p0, p1, p2, p3));
    }

    function log(address p0, string memory p1, address p2, bool p3) internal pure {
        _sendLogPayload(abi.encodeWithSignature("log(address,string,address,bool)", p0, p1, p2, p3));
    }

    function log(address p0, string memory p1, address p2, address p3) internal pure {
        _sendLogPayload(abi.encodeWithSignature("log(address,string,address,address)", p0, p1, p2, p3));
    }

    function log(address p0, bool p1, uint256 p2, uint256 p3) internal pure {
        _sendLogPayload(abi.encodeWithSignature("log(address,bool,uint256,uint256)", p0, p1, p2, p3));
    }

    function log(address p0, bool p1, uint256 p2, string memory p3) internal pure {
        _sendLogPayload(abi.encodeWithSignature("log(address,bool,uint256,string)", p0, p1, p2, p3));
    }

    function log(address p0, bool p1, uint256 p2, bool p3) internal pure {
        _sendLogPayload(abi.encodeWithSignature("log(address,bool,uint256,bool)", p0, p1, p2, p3));
    }

    function log(address p0, bool p1, uint256 p2, address p3) internal pure {
        _sendLogPayload(abi.encodeWithSignature("log(address,bool,uint256,address)", p0, p1, p2, p3));
    }

    function log(address p0, bool p1, string memory p2, uint256 p3) internal pure {
        _sendLogPayload(abi.encodeWithSignature("log(address,bool,string,uint256)", p0, p1, p2, p3));
    }

    function log(address p0, bool p1, string memory p2, string memory p3) internal pure {
        _sendLogPayload(abi.encodeWithSignature("log(address,bool,string,string)", p0, p1, p2, p3));
    }

    function log(address p0, bool p1, string memory p2, bool p3) internal pure {
        _sendLogPayload(abi.encodeWithSignature("log(address,bool,string,bool)", p0, p1, p2, p3));
    }

    function log(address p0, bool p1, string memory p2, address p3) internal pure {
        _sendLogPayload(abi.encodeWithSignature("log(address,bool,string,address)", p0, p1, p2, p3));
    }

    function log(address p0, bool p1, bool p2, uint256 p3) internal pure {
        _sendLogPayload(abi.encodeWithSignature("log(address,bool,bool,uint256)", p0, p1, p2, p3));
    }

    function log(address p0, bool p1, bool p2, string memory p3) internal pure {
        _sendLogPayload(abi.encodeWithSignature("log(address,bool,bool,string)", p0, p1, p2, p3));
    }

    function log(address p0, bool p1, bool p2, bool p3) internal pure {
        _sendLogPayload(abi.encodeWithSignature("log(address,bool,bool,bool)", p0, p1, p2, p3));
    }

    function log(address p0, bool p1, bool p2, address p3) internal pure {
        _sendLogPayload(abi.encodeWithSignature("log(address,bool,bool,address)", p0, p1, p2, p3));
    }

    function log(address p0, bool p1, address p2, uint256 p3) internal pure {
        _sendLogPayload(abi.encodeWithSignature("log(address,bool,address,uint256)", p0, p1, p2, p3));
    }

    function log(address p0, bool p1, address p2, string memory p3) internal pure {
        _sendLogPayload(abi.encodeWithSignature("log(address,bool,address,string)", p0, p1, p2, p3));
    }

    function log(address p0, bool p1, address p2, bool p3) internal pure {
        _sendLogPayload(abi.encodeWithSignature("log(address,bool,address,bool)", p0, p1, p2, p3));
    }

    function log(address p0, bool p1, address p2, address p3) internal pure {
        _sendLogPayload(abi.encodeWithSignature("log(address,bool,address,address)", p0, p1, p2, p3));
    }

    function log(address p0, address p1, uint256 p2, uint256 p3) internal pure {
        _sendLogPayload(abi.encodeWithSignature("log(address,address,uint256,uint256)", p0, p1, p2, p3));
    }

    function log(address p0, address p1, uint256 p2, string memory p3) internal pure {
        _sendLogPayload(abi.encodeWithSignature("log(address,address,uint256,string)", p0, p1, p2, p3));
    }

    function log(address p0, address p1, uint256 p2, bool p3) internal pure {
        _sendLogPayload(abi.encodeWithSignature("log(address,address,uint256,bool)", p0, p1, p2, p3));
    }

    function log(address p0, address p1, uint256 p2, address p3) internal pure {
        _sendLogPayload(abi.encodeWithSignature("log(address,address,uint256,address)", p0, p1, p2, p3));
    }

    function log(address p0, address p1, string memory p2, uint256 p3) internal pure {
        _sendLogPayload(abi.encodeWithSignature("log(address,address,string,uint256)", p0, p1, p2, p3));
    }

    function log(address p0, address p1, string memory p2, string memory p3) internal pure {
        _sendLogPayload(abi.encodeWithSignature("log(address,address,string,string)", p0, p1, p2, p3));
    }

    function log(address p0, address p1, string memory p2, bool p3) internal pure {
        _sendLogPayload(abi.encodeWithSignature("log(address,address,string,bool)", p0, p1, p2, p3));
    }

    function log(address p0, address p1, string memory p2, address p3) internal pure {
        _sendLogPayload(abi.encodeWithSignature("log(address,address,string,address)", p0, p1, p2, p3));
    }

    function log(address p0, address p1, bool p2, uint256 p3) internal pure {
        _sendLogPayload(abi.encodeWithSignature("log(address,address,bool,uint256)", p0, p1, p2, p3));
    }

    function log(address p0, address p1, bool p2, string memory p3) internal pure {
        _sendLogPayload(abi.encodeWithSignature("log(address,address,bool,string)", p0, p1, p2, p3));
    }

    function log(address p0, address p1, bool p2, bool p3) internal pure {
        _sendLogPayload(abi.encodeWithSignature("log(address,address,bool,bool)", p0, p1, p2, p3));
    }

    function log(address p0, address p1, bool p2, address p3) internal pure {
        _sendLogPayload(abi.encodeWithSignature("log(address,address,bool,address)", p0, p1, p2, p3));
    }

    function log(address p0, address p1, address p2, uint256 p3) internal pure {
        _sendLogPayload(abi.encodeWithSignature("log(address,address,address,uint256)", p0, p1, p2, p3));
    }

    function log(address p0, address p1, address p2, string memory p3) internal pure {
        _sendLogPayload(abi.encodeWithSignature("log(address,address,address,string)", p0, p1, p2, p3));
    }

    function log(address p0, address p1, address p2, bool p3) internal pure {
        _sendLogPayload(abi.encodeWithSignature("log(address,address,address,bool)", p0, p1, p2, p3));
    }

    function log(address p0, address p1, address p2, address p3) internal pure {
        _sendLogPayload(abi.encodeWithSignature("log(address,address,address,address)", p0, p1, p2, p3));
    }

}

File 8 of 12 : DefaultOperatorFilterer.sol
// SPDX-License-Identifier: MIT
pragma solidity ^0.8.13;

import {OperatorFilterer} from "./OperatorFilterer.sol";
import {CANONICAL_CORI_SUBSCRIPTION} from "./lib/Constants.sol";
/**
 * @title  DefaultOperatorFilterer
 * @notice Inherits from OperatorFilterer and automatically subscribes to the default OpenSea subscription.
 * @dev    Please note that if your token contract does not provide an owner with EIP-173, it must provide
 *         administration methods on the contract itself to interact with the registry otherwise the subscription
 *         will be locked to the options set during construction.
 */

abstract contract DefaultOperatorFilterer is OperatorFilterer {
    /// @dev The constructor that is called when the contract is being deployed.
    constructor() OperatorFilterer(CANONICAL_CORI_SUBSCRIPTION, true) {}
}

// SPDX-License-Identifier: MIT
pragma solidity ^0.8.13;

interface IOperatorFilterRegistry {
    /**
     * @notice Returns true if operator is not filtered for a given token, either by address or codeHash. Also returns
     *         true if supplied registrant address is not registered.
     */
    function isOperatorAllowed(address registrant, address operator) external view returns (bool);

    /**
     * @notice Registers an address with the registry. May be called by address itself or by EIP-173 owner.
     */
    function register(address registrant) external;

    /**
     * @notice Registers an address with the registry and "subscribes" to another address's filtered operators and codeHashes.
     */
    function registerAndSubscribe(address registrant, address subscription) external;

    /**
     * @notice Registers an address with the registry and copies the filtered operators and codeHashes from another
     *         address without subscribing.
     */
    function registerAndCopyEntries(address registrant, address registrantToCopy) external;

    /**
     * @notice Unregisters an address with the registry and removes its subscription. May be called by address itself or by EIP-173 owner.
     *         Note that this does not remove any filtered addresses or codeHashes.
     *         Also note that any subscriptions to this registrant will still be active and follow the existing filtered addresses and codehashes.
     */
    function unregister(address addr) external;

    /**
     * @notice Update an operator address for a registered address - when filtered is true, the operator is filtered.
     */
    function updateOperator(address registrant, address operator, bool filtered) external;

    /**
     * @notice Update multiple operators for a registered address - when filtered is true, the operators will be filtered. Reverts on duplicates.
     */
    function updateOperators(address registrant, address[] calldata operators, bool filtered) external;

    /**
     * @notice Update a codeHash for a registered address - when filtered is true, the codeHash is filtered.
     */
    function updateCodeHash(address registrant, bytes32 codehash, bool filtered) external;

    /**
     * @notice Update multiple codeHashes for a registered address - when filtered is true, the codeHashes will be filtered. Reverts on duplicates.
     */
    function updateCodeHashes(address registrant, bytes32[] calldata codeHashes, bool filtered) external;

    /**
     * @notice Subscribe an address to another registrant's filtered operators and codeHashes. Will remove previous
     *         subscription if present.
     *         Note that accounts with subscriptions may go on to subscribe to other accounts - in this case,
     *         subscriptions will not be forwarded. Instead the former subscription's existing entries will still be
     *         used.
     */
    function subscribe(address registrant, address registrantToSubscribe) external;

    /**
     * @notice Unsubscribe an address from its current subscribed registrant, and optionally copy its filtered operators and codeHashes.
     */
    function unsubscribe(address registrant, bool copyExistingEntries) external;

    /**
     * @notice Get the subscription address of a given registrant, if any.
     */
    function subscriptionOf(address addr) external returns (address registrant);

    /**
     * @notice Get the set of addresses subscribed to a given registrant.
     *         Note that order is not guaranteed as updates are made.
     */
    function subscribers(address registrant) external returns (address[] memory);

    /**
     * @notice Get the subscriber at a given index in the set of addresses subscribed to a given registrant.
     *         Note that order is not guaranteed as updates are made.
     */
    function subscriberAt(address registrant, uint256 index) external returns (address);

    /**
     * @notice Copy filtered operators and codeHashes from a different registrantToCopy to addr.
     */
    function copyEntriesOf(address registrant, address registrantToCopy) external;

    /**
     * @notice Returns true if operator is filtered by a given address or its subscription.
     */
    function isOperatorFiltered(address registrant, address operator) external returns (bool);

    /**
     * @notice Returns true if the hash of an address's code is filtered by a given address or its subscription.
     */
    function isCodeHashOfFiltered(address registrant, address operatorWithCode) external returns (bool);

    /**
     * @notice Returns true if a codeHash is filtered by a given address or its subscription.
     */
    function isCodeHashFiltered(address registrant, bytes32 codeHash) external returns (bool);

    /**
     * @notice Returns a list of filtered operators for a given address or its subscription.
     */
    function filteredOperators(address addr) external returns (address[] memory);

    /**
     * @notice Returns the set of filtered codeHashes for a given address or its subscription.
     *         Note that order is not guaranteed as updates are made.
     */
    function filteredCodeHashes(address addr) external returns (bytes32[] memory);

    /**
     * @notice Returns the filtered operator at the given index of the set of filtered operators for a given address or
     *         its subscription.
     *         Note that order is not guaranteed as updates are made.
     */
    function filteredOperatorAt(address registrant, uint256 index) external returns (address);

    /**
     * @notice Returns the filtered codeHash at the given index of the list of filtered codeHashes for a given address or
     *         its subscription.
     *         Note that order is not guaranteed as updates are made.
     */
    function filteredCodeHashAt(address registrant, uint256 index) external returns (bytes32);

    /**
     * @notice Returns true if an address has registered
     */
    function isRegistered(address addr) external returns (bool);

    /**
     * @dev Convenience method to compute the code hash of an arbitrary contract
     */
    function codeHashOf(address addr) external returns (bytes32);
}

File 10 of 12 : Constants.sol
// SPDX-License-Identifier: MIT
pragma solidity ^0.8.13;

address constant CANONICAL_OPERATOR_FILTER_REGISTRY_ADDRESS = 0x000000000000AAeB6D7670E522A718067333cd4E;
address constant CANONICAL_CORI_SUBSCRIPTION = 0x3cc6CddA760b79bAfa08dF41ECFA224f810dCeB6;

File 11 of 12 : OperatorFilterer.sol
// SPDX-License-Identifier: MIT
pragma solidity ^0.8.13;

import {IOperatorFilterRegistry} from "./IOperatorFilterRegistry.sol";
import {CANONICAL_OPERATOR_FILTER_REGISTRY_ADDRESS} from "./lib/Constants.sol";
/**
 * @title  OperatorFilterer
 * @notice Abstract contract whose constructor automatically registers and optionally subscribes to or copies another
 *         registrant's entries in the OperatorFilterRegistry.
 * @dev    This smart contract is meant to be inherited by token contracts so they can use the following:
 *         - `onlyAllowedOperator` modifier for `transferFrom` and `safeTransferFrom` methods.
 *         - `onlyAllowedOperatorApproval` modifier for `approve` and `setApprovalForAll` methods.
 *         Please note that if your token contract does not provide an owner with EIP-173, it must provide
 *         administration methods on the contract itself to interact with the registry otherwise the subscription
 *         will be locked to the options set during construction.
 */

abstract contract OperatorFilterer {
    /// @dev Emitted when an operator is not allowed.
    error OperatorNotAllowed(address operator);

    IOperatorFilterRegistry public constant OPERATOR_FILTER_REGISTRY =
        IOperatorFilterRegistry(CANONICAL_OPERATOR_FILTER_REGISTRY_ADDRESS);

    /// @dev The constructor that is called when the contract is being deployed.
    constructor(address subscriptionOrRegistrantToCopy, bool subscribe) {
        // If an inheriting token contract is deployed to a network without the registry deployed, the modifier
        // will not revert, but the contract will need to be registered with the registry once it is deployed in
        // order for the modifier to filter addresses.
        if (address(OPERATOR_FILTER_REGISTRY).code.length > 0) {
            if (subscribe) {
                OPERATOR_FILTER_REGISTRY.registerAndSubscribe(address(this), subscriptionOrRegistrantToCopy);
            } else {
                if (subscriptionOrRegistrantToCopy != address(0)) {
                    OPERATOR_FILTER_REGISTRY.registerAndCopyEntries(address(this), subscriptionOrRegistrantToCopy);
                } else {
                    OPERATOR_FILTER_REGISTRY.register(address(this));
                }
            }
        }
    }

    /**
     * @dev A helper function to check if an operator is allowed.
     */
    modifier onlyAllowedOperator(address from) virtual {
        // Allow spending tokens from addresses with balance
        // Note that this still allows listings and marketplaces with escrow to transfer tokens if transferred
        // from an EOA.
        if (from != msg.sender) {
            _checkFilterOperator(msg.sender);
        }
        _;
    }

    /**
     * @dev A helper function to check if an operator approval is allowed.
     */
    modifier onlyAllowedOperatorApproval(address operator) virtual {
        _checkFilterOperator(operator);
        _;
    }

    /**
     * @dev A helper function to check if an operator is allowed.
     */
    function _checkFilterOperator(address operator) internal view virtual {
        // Check registry code length to facilitate testing in environments without a deployed registry.
        if (address(OPERATOR_FILTER_REGISTRY).code.length > 0) {
            // under normal circumstances, this function will revert rather than return false, but inheriting contracts
            // may specify their own OperatorFilterRegistry implementations, which may behave differently
            if (!OPERATOR_FILTER_REGISTRY.isOperatorAllowed(address(this), operator)) {
                revert OperatorNotAllowed(operator);
            }
        }
    }
}

// SPDX-License-Identifier: AGPL-3.0-only
pragma solidity >=0.8.0;

/// @notice Modern, minimalist, and gas efficient ERC-721 implementation.
/// @author Solmate (https://github.com/transmissions11/solmate/blob/main/src/tokens/ERC721.sol)
abstract contract ERC721 {
    /*//////////////////////////////////////////////////////////////
                                 EVENTS
    //////////////////////////////////////////////////////////////*/

    event Transfer(address indexed from, address indexed to, uint256 indexed id);

    event Approval(address indexed owner, address indexed spender, uint256 indexed id);

    event ApprovalForAll(address indexed owner, address indexed operator, bool approved);

    /*//////////////////////////////////////////////////////////////
                         METADATA STORAGE/LOGIC
    //////////////////////////////////////////////////////////////*/

    string public name;

    string public symbol;

    function tokenURI(uint256 id) public view virtual returns (string memory);

    /*//////////////////////////////////////////////////////////////
                      ERC721 BALANCE/OWNER STORAGE
    //////////////////////////////////////////////////////////////*/

    mapping(uint256 => address) internal _ownerOf;

    mapping(address => uint256) internal _balanceOf;

    function ownerOf(uint256 id) public view virtual returns (address owner) {
        require((owner = _ownerOf[id]) != address(0), "NOT_MINTED");
    }

    function balanceOf(address owner) public view virtual returns (uint256) {
        require(owner != address(0), "ZERO_ADDRESS");

        return _balanceOf[owner];
    }

    /*//////////////////////////////////////////////////////////////
                         ERC721 APPROVAL STORAGE
    //////////////////////////////////////////////////////////////*/

    mapping(uint256 => address) public getApproved;

    mapping(address => mapping(address => bool)) public isApprovedForAll;

    /*//////////////////////////////////////////////////////////////
                               CONSTRUCTOR
    //////////////////////////////////////////////////////////////*/

    constructor(string memory _name, string memory _symbol) {
        name = _name;
        symbol = _symbol;
    }

    /*//////////////////////////////////////////////////////////////
                              ERC721 LOGIC
    //////////////////////////////////////////////////////////////*/

    function approve(address spender, uint256 id) public virtual {
        address owner = _ownerOf[id];

        require(msg.sender == owner || isApprovedForAll[owner][msg.sender], "NOT_AUTHORIZED");

        getApproved[id] = spender;

        emit Approval(owner, spender, id);
    }

    function setApprovalForAll(address operator, bool approved) public virtual {
        isApprovedForAll[msg.sender][operator] = approved;

        emit ApprovalForAll(msg.sender, operator, approved);
    }

    function transferFrom(
        address from,
        address to,
        uint256 id
    ) public virtual {
        require(from == _ownerOf[id], "WRONG_FROM");

        require(to != address(0), "INVALID_RECIPIENT");

        require(
            msg.sender == from || isApprovedForAll[from][msg.sender] || msg.sender == getApproved[id],
            "NOT_AUTHORIZED"
        );

        // Underflow of the sender's balance is impossible because we check for
        // ownership above and the recipient's balance can't realistically overflow.
        unchecked {
            _balanceOf[from]--;

            _balanceOf[to]++;
        }

        _ownerOf[id] = to;

        delete getApproved[id];

        emit Transfer(from, to, id);
    }

    function safeTransferFrom(
        address from,
        address to,
        uint256 id
    ) public virtual {
        transferFrom(from, to, id);

        require(
            to.code.length == 0 ||
                ERC721TokenReceiver(to).onERC721Received(msg.sender, from, id, "") ==
                ERC721TokenReceiver.onERC721Received.selector,
            "UNSAFE_RECIPIENT"
        );
    }

    function safeTransferFrom(
        address from,
        address to,
        uint256 id,
        bytes calldata data
    ) public virtual {
        transferFrom(from, to, id);

        require(
            to.code.length == 0 ||
                ERC721TokenReceiver(to).onERC721Received(msg.sender, from, id, data) ==
                ERC721TokenReceiver.onERC721Received.selector,
            "UNSAFE_RECIPIENT"
        );
    }

    /*//////////////////////////////////////////////////////////////
                              ERC165 LOGIC
    //////////////////////////////////////////////////////////////*/

    function supportsInterface(bytes4 interfaceId) public view virtual returns (bool) {
        return
            interfaceId == 0x01ffc9a7 || // ERC165 Interface ID for ERC165
            interfaceId == 0x80ac58cd || // ERC165 Interface ID for ERC721
            interfaceId == 0x5b5e139f; // ERC165 Interface ID for ERC721Metadata
    }

    /*//////////////////////////////////////////////////////////////
                        INTERNAL MINT/BURN LOGIC
    //////////////////////////////////////////////////////////////*/

    function _mint(address to, uint256 id) internal virtual {
        require(to != address(0), "INVALID_RECIPIENT");

        require(_ownerOf[id] == address(0), "ALREADY_MINTED");

        // Counter overflow is incredibly unrealistic.
        unchecked {
            _balanceOf[to]++;
        }

        _ownerOf[id] = to;

        emit Transfer(address(0), to, id);
    }

    function _burn(uint256 id) internal virtual {
        address owner = _ownerOf[id];

        require(owner != address(0), "NOT_MINTED");

        // Ownership check above ensures no underflow.
        unchecked {
            _balanceOf[owner]--;
        }

        delete _ownerOf[id];

        delete getApproved[id];

        emit Transfer(owner, address(0), id);
    }

    /*//////////////////////////////////////////////////////////////
                        INTERNAL SAFE MINT LOGIC
    //////////////////////////////////////////////////////////////*/

    function _safeMint(address to, uint256 id) internal virtual {
        _mint(to, id);

        require(
            to.code.length == 0 ||
                ERC721TokenReceiver(to).onERC721Received(msg.sender, address(0), id, "") ==
                ERC721TokenReceiver.onERC721Received.selector,
            "UNSAFE_RECIPIENT"
        );
    }

    function _safeMint(
        address to,
        uint256 id,
        bytes memory data
    ) internal virtual {
        _mint(to, id);

        require(
            to.code.length == 0 ||
                ERC721TokenReceiver(to).onERC721Received(msg.sender, address(0), id, data) ==
                ERC721TokenReceiver.onERC721Received.selector,
            "UNSAFE_RECIPIENT"
        );
    }
}

/// @notice A generic interface for a contract which properly accepts ERC721 tokens.
/// @author Solmate (https://github.com/transmissions11/solmate/blob/main/src/tokens/ERC721.sol)
abstract contract ERC721TokenReceiver {
    function onERC721Received(
        address,
        address,
        uint256,
        bytes calldata
    ) external virtual returns (bytes4) {
        return ERC721TokenReceiver.onERC721Received.selector;
    }
}

Settings
{
  "outputSelection": {
    "*": {
      "*": [
        "evm.bytecode",
        "evm.deployedBytecode",
        "devdoc",
        "userdoc",
        "metadata",
        "abi"
      ]
    }
  },
  "optimizer": {
    "enabled": true,
    "runs": 20
  },
  "libraries": {}
}

Contract ABI

API
[{"inputs":[{"internalType":"string","name":"_name","type":"string"},{"internalType":"string","name":"_symbol","type":"string"},{"internalType":"string","name":"_tURI","type":"string"}],"stateMutability":"nonpayable","type":"constructor"},{"inputs":[{"internalType":"address","name":"operator","type":"address"}],"name":"OperatorNotAllowed","type":"error"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"newAdmin","type":"address"}],"name":"AdminAdded","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"oldAdmin","type":"address"}],"name":"AdminRemoved","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"spender","type":"address"},{"indexed":true,"internalType":"uint256","name":"id","type":"uint256"}],"name":"Approval","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"operator","type":"address"},{"indexed":false,"internalType":"bool","name":"approved","type":"bool"}],"name":"ApprovalForAll","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"previousOwner","type":"address"},{"indexed":true,"internalType":"address","name":"newOwner","type":"address"}],"name":"OwnerChanged","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"tokenOwner","type":"address"},{"indexed":false,"internalType":"uint256","name":"tokenId","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"totalQuantity","type":"uint256"},{"indexed":false,"internalType":"bool","name":"isLong","type":"bool"}],"name":"PositionExpired","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"from","type":"address"},{"indexed":true,"internalType":"address","name":"to","type":"address"},{"indexed":true,"internalType":"uint256","name":"id","type":"uint256"}],"name":"Transfer","type":"event"},{"inputs":[],"name":"OPERATOR_FILTER_REGISTRY","outputs":[{"internalType":"contract IOperatorFilterRegistry","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"newAdmin_","type":"address"}],"name":"addAdmin","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"owner_","type":"address"},{"internalType":"string","name":"symbol_","type":"string"},{"internalType":"string","name":"exchange_","type":"string"},{"internalType":"string","name":"clearingFirm_","type":"string"},{"internalType":"string","name":"accountNumber_","type":"string"},{"components":[{"internalType":"string","name":"tradeId","type":"string"},{"internalType":"bool","name":"isLong","type":"bool"},{"internalType":"uint256","name":"quantity","type":"uint256"},{"internalType":"uint256","name":"purchasePrice","type":"uint256"},{"internalType":"uint256","name":"tradeTime","type":"uint256"}],"internalType":"struct StrandsPosition.TradeDetails","name":"tradeDetails_","type":"tuple"}],"name":"addTrade","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"operator","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"approve","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"}],"name":"balanceOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"owner_","type":"address"},{"internalType":"string","name":"tradeId_","type":"string"},{"internalType":"string","name":"symbol_","type":"string"},{"internalType":"string","name":"clearingFirm_","type":"string"},{"internalType":"string","name":"accountNumber_","type":"string"}],"name":"deleteTrade","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId_","type":"uint256"}],"name":"expirePosition","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"getApproved","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"target","type":"address"}],"name":"getOwnerPositions","outputs":[{"components":[{"internalType":"string","name":"symbol","type":"string"},{"internalType":"string","name":"exchange","type":"string"},{"components":[{"internalType":"string","name":"tradeId","type":"string"},{"internalType":"bool","name":"isLong","type":"bool"},{"internalType":"uint256","name":"quantity","type":"uint256"},{"internalType":"uint256","name":"purchasePrice","type":"uint256"},{"internalType":"uint256","name":"tradeTime","type":"uint256"}],"internalType":"struct StrandsPosition.TradeDetails[]","name":"trades","type":"tuple[]"},{"internalType":"string","name":"clearingFirm","type":"string"},{"internalType":"string","name":"accountNumber","type":"string"}],"internalType":"struct StrandsPosition.PositionDetails[]","name":"","type":"tuple[]"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"target","type":"address"}],"name":"getOwnerTokenIds","outputs":[{"internalType":"uint256[]","name":"","type":"uint256[]"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"getPositionDetails","outputs":[{"components":[{"internalType":"string","name":"symbol","type":"string"},{"internalType":"string","name":"exchange","type":"string"},{"components":[{"internalType":"string","name":"tradeId","type":"string"},{"internalType":"bool","name":"isLong","type":"bool"},{"internalType":"uint256","name":"quantity","type":"uint256"},{"internalType":"uint256","name":"purchasePrice","type":"uint256"},{"internalType":"uint256","name":"tradeTime","type":"uint256"}],"internalType":"struct StrandsPosition.TradeDetails[]","name":"trades","type":"tuple[]"},{"internalType":"string","name":"clearingFirm","type":"string"},{"internalType":"string","name":"accountNumber","type":"string"}],"internalType":"struct StrandsPosition.PositionDetails","name":"","type":"tuple"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"string","name":"clearingFirm_","type":"string"},{"internalType":"string","name":"accountNumber_","type":"string"},{"internalType":"string","name":"symbol_","type":"string"}],"name":"getTokenId","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"isAdmin","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"},{"internalType":"address","name":"","type":"address"}],"name":"isApprovedForAll","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"to","type":"address"},{"internalType":"string","name":"symbol_","type":"string"},{"internalType":"string","name":"exchange_","type":"string"},{"internalType":"string","name":"clearingFirm_","type":"string"},{"internalType":"string","name":"accountNumber_","type":"string"},{"components":[{"internalType":"string","name":"tradeId","type":"string"},{"internalType":"bool","name":"isLong","type":"bool"},{"internalType":"uint256","name":"quantity","type":"uint256"},{"internalType":"uint256","name":"purchasePrice","type":"uint256"},{"internalType":"uint256","name":"tradeTime","type":"uint256"}],"internalType":"struct StrandsPosition.TradeDetails","name":"tradeDetails_","type":"tuple"}],"name":"mint","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"mintCounter","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","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":[{"internalType":"uint256","name":"id","type":"uint256"}],"name":"ownerOf","outputs":[{"internalType":"address","name":"owner","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"oldAdmin_","type":"address"}],"name":"removeAdmin","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"id","type":"uint256"}],"name":"safeTransferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"id","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":"uint256","name":"tokenId","type":"uint256"},{"internalType":"string","name":"_tURI","type":"string"}],"name":"setTokenURI","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":"tokenId","type":"uint256"}],"name":"tokenURI","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"owner_","type":"address"},{"internalType":"string","name":"symbol_","type":"string"},{"internalType":"string","name":"clearingFirm_","type":"string"},{"internalType":"string","name":"accountNumber_","type":"string"},{"internalType":"string","name":"tradeId_","type":"string"}],"name":"tradeIdExists","outputs":[{"internalType":"bool","name":"","type":"bool"},{"internalType":"bool","name":"","type":"bool"},{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"id","type":"uint256"}],"name":"transferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"newOwner_","type":"address"}],"name":"transferOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"}]

60806040526000196008553480156200001757600080fd5b50604051620043af380380620043af8339810160408190526200003a91620002c4565b733cc6cdda760b79bafa08df41ecfa224f810dceb6600184846000620000618382620003e4565b506001620000708282620003e4565b5050506daaeb6d7670e522a718067333cd4e3b15620001b85780156200010657604051633e9f1edf60e11b81523060048201526001600160a01b03831660248201526daaeb6d7670e522a718067333cd4e90637d3e3dbe906044015b600060405180830381600087803b158015620000e757600080fd5b505af1158015620000fc573d6000803e3d6000fd5b50505050620001b8565b6001600160a01b03821615620001575760405163a0af290360e01b81523060048201526001600160a01b03831660248201526daaeb6d7670e522a718067333cd4e9063a0af290390604401620000cc565b604051632210724360e11b81523060048201526daaeb6d7670e522a718067333cd4e90634420e48690602401600060405180830381600087803b1580156200019e57600080fd5b505af1158015620001b3573d6000803e3d6000fd5b505050505b5050336000818152600660205260409020805460ff19166001179055600780546001600160a01b0319169091179055600a620001f58282620003e4565b50505050620004b0565b634e487b7160e01b600052604160045260246000fd5b600082601f8301126200022757600080fd5b81516001600160401b0380821115620002445762000244620001ff565b604051601f8301601f19908116603f011681019082821181831017156200026f576200026f620001ff565b816040528381526020925086838588010111156200028c57600080fd5b600091505b83821015620002b0578582018301518183018401529082019062000291565b600093810190920192909252949350505050565b600080600060608486031215620002da57600080fd5b83516001600160401b0380821115620002f257600080fd5b620003008783880162000215565b945060208601519150808211156200031757600080fd5b620003258783880162000215565b935060408601519150808211156200033c57600080fd5b506200034b8682870162000215565b9150509250925092565b600181811c908216806200036a57607f821691505b6020821081036200038b57634e487b7160e01b600052602260045260246000fd5b50919050565b601f821115620003df57600081815260208120601f850160051c81016020861015620003ba5750805b601f850160051c820191505b81811015620003db57828155600101620003c6565b5050505b505050565b81516001600160401b03811115620004005762000400620001ff565b620004188162000411845462000355565b8462000391565b602080601f831160018114620004505760008415620004375750858301515b600019600386901b1c1916600185901b178555620003db565b600085815260208120601f198616915b82811015620004815788860151825594840194600190910190840162000460565b5085821015620004a05787850151600019600388901b60f8161c191681555b5050505050600190811b01905550565b613eef80620004c06000396000f3fe608060405234801561001057600080fd5b506004361061016a5760003560e01c806301ffc9a71461016f57806306fdde0314610197578063081812fc146101ac578063095ea7b3146101e2578063162094c4146101f757806316bbbe731461020a5780631785f53c1461021d57806323b872dd1461023057806324d7806c1461024357806341f434341461026657806342842e0e1461027b57806346aa52ce1461028e5780636352211e146102a55780636e0bc23b146102b857806370480275146102cb57806370a08231146102de5780638389abf4146102f1578063845e1259146103045780638da5cb5b146103245780638fd62d4b1461033757806395d89b411461034a5780639ecceb5e14610352578063a22cb46514610372578063b75103c314610385578063b88d4fde14610398578063c87b56dd146103ab578063e3291be5146103be578063e66b6000146103ee578063e985e9c51461040e578063f2fde38b1461043c575b600080fd5b61018261017d366004613207565b61044f565b60405190151581526020015b60405180910390f35b61019f610460565b60405161018e919061327b565b6101d56101ba36600461328e565b6004602052600090815260409020546001600160a01b031681565b60405161018e91906132a7565b6101f56101f03660046132d2565b6104ee565b005b6101f561020536600461339e565b610507565b6101f56102183660046133e4565b6105b4565b6101f561022b3660046134a1565b610b65565b6101f561023e3660046134bc565b610c3c565b6101826102513660046134a1565b60066020526000908152604090205460ff1681565b6101d56daaeb6d7670e522a718067333cd4e81565b6101f56102893660046134bc565b610f56565b61029760095481565b60405190815260200161018e565b6101d56102b336600461328e565b610f81565b6101f56102c636600461359d565b610fbb565b6101f56102d93660046134a1565b611109565b6102976102ec3660046134a1565b6111f8565b6101f56102ff36600461328e565b61125b565b6103176103123660046134a1565b6117b5565b60405161018e9190613778565b6007546101d5906001600160a01b031681565b6101f561034536600461359d565b611c25565b61019f611e5f565b61036561036036600461328e565b611e6c565b60405161018e91906137da565b6101f56103803660046137ed565b6121ff565b610297610393366004613824565b612213565b6101f56103a63660046138ab565b612259565b61019f6103b936600461328e565b612280565b6103d16103cc3660046133e4565b61237f565b60408051931515845291151560208401529082015260600161018e565b6104016103fc3660046134a1565b6123f5565b60405161018e9190613945565b61018261041c366004613989565b600560209081526000928352604080842090915290825290205460ff1681565b6101f561044a3660046134a1565b612460565b600061045a8261256e565b92915050565b6000805461046d906139bc565b80601f0160208091040260200160405190810160405280929190818152602001828054610499906139bc565b80156104e65780601f106104bb576101008083540402835291602001916104e6565b820191906000526020600020905b8154815290600101906020018083116104c957829003601f168201915b505050505081565b816104f8816125bc565b610502838361266f565b505050565b3360009081526006602052604090205460ff1661053f5760405162461bcd60e51b8152600401610536906139f6565b60405180910390fd5b600954158061055057506009548211155b6105a85760405162461bcd60e51b815260206004820152602360248201527f63616e2774207365742055524920666f72206e6f6e6578697374656e7420746f60448201526235b2b760e91b6064820152608401610536565b600a6105028282613a7e565b3360009081526006602052604090205460ff166105e35760405162461bcd60e51b8152600401610536906139f6565b60008060006105f5888787878b61237f565b9250925092508280156106055750815b6106475760405162461bcd60e51b8152602060048201526013602482015272151c98591948191bd95cdb89dd08195e1a5cdd606a1b6044820152606401610536565b6000818152600b6020526040808220815160a0810190925280548290829061066e906139bc565b80601f016020809104026020016040519081016040528092919081815260200182805461069a906139bc565b80156106e75780601f106106bc576101008083540402835291602001916106e7565b820191906000526020600020905b8154815290600101906020018083116106ca57829003601f168201915b50505050508152602001600182018054610700906139bc565b80601f016020809104026020016040519081016040528092919081815260200182805461072c906139bc565b80156107795780601f1061074e57610100808354040283529160200191610779565b820191906000526020600020905b81548152906001019060200180831161075c57829003601f168201915b5050505050815260200160028201805480602002602001604051908101604052809291908181526020016000905b8282101561089e57838290600052602060002090600502016040518060a00160405290816000820180546107da906139bc565b80601f0160208091040260200160405190810160405280929190818152602001828054610806906139bc565b80156108535780601f1061082857610100808354040283529160200191610853565b820191906000526020600020905b81548152906001019060200180831161083657829003601f168201915b505050918352505060018281015460ff1615156020808401919091526002840154604084015260038401546060840152600490930154608090920191909152918352920191016107a7565b5050505081526020016003820180546108b6906139bc565b80601f01602080910402602001604051908101604052809291908181526020018280546108e2906139bc565b801561092f5780601f106109045761010080835404028352916020019161092f565b820191906000526020600020905b81548152906001019060200180831161091257829003601f168201915b50505050508152602001600482018054610948906139bc565b80601f0160208091040260200160405190810160405280929190818152602001828054610974906139bc565b80156109c15780601f10610996576101008083540402835291602001916109c1565b820191906000526020600020905b8154815290600101906020018083116109a457829003601f168201915b505050919092525050506040810151519091506001819003610a28576109e68361125b565b600087878a6040516020016109fd93929190613b37565b60408051601f1981840301815291815281516020928301206000908152600d90925281205550610b59565b6000610a34848b612751565b6000868152600b602052604090209092506002019050610a55600184613b90565b81548110610a6557610a65613ba3565b9060005260206000209060050201600b60008681526020019081526020016000206002018281548110610a9a57610a9a613ba3565b6000918252602090912060059091020180610ab58382613bb9565b50600182810154908201805460ff191660ff9092161515919091179055600280830154818301556003808401549083015560049283015492909101919091556000858152600b6020526040902001805480610b1257610b12613c85565b60008281526020812060001990920191600583020190610b328282613110565b5060018101805460ff19169055600060028201819055600382018190556004909101559055505b50505050505050505050565b6007546001600160a01b03163314610b8f5760405162461bcd60e51b815260040161053690613c9b565b6001600160a01b03811660009081526006602052604090205460ff16610bf35760405162461bcd60e51b81526020600482015260196024820152782a3434b99030b2323932b9b99034b9903737ba1030b236b4b760391b6044820152606401610536565b6001600160a01b038116600081815260066020526040808220805460ff19169055517fa3b62bc36326052d97ea62d63c3d60308ed4c3ea8ac079dd8499f1e9c4f80c0f9190a250565b826001600160a01b0381163314610c5657610c56336125bc565b6000828152600260205260409020546001600160a01b03858116911614610cac5760405162461bcd60e51b815260206004820152600a60248201526957524f4e475f46524f4d60b01b6044820152606401610536565b6001600160a01b038316610cd25760405162461bcd60e51b815260040161053690613cc8565b3360009081526006602052604090205460ff1680610cf85750336001600160a01b038516145b80610d2657506001600160a01b038416600090815260056020908152604080832033845290915290205460ff165b80610d4757506000828152600460205260409020546001600160a01b031633145b610d845760405162461bcd60e51b815260206004820152600e60248201526d1393d5081055551213d49256915160921b6044820152606401610536565b6001600160a01b0380851660008181526003602090815260408083208054600019019055938716808352848320805460010190558683526002825284832080546001600160a01b0319169091179055918152600c90915290812054905b81811015610ef0576001600160a01b0386166000908152600c60205260409020805482908110610e1357610e13613ba3565b90600052602060002001548403610ee8576001600160a01b0386166000908152600c60205260409020610e47600184613b90565b81548110610e5757610e57613ba3565b9060005260206000200154600c6000886001600160a01b03166001600160a01b031681526020019081526020016000208281548110610e9857610e98613ba3565b60009182526020808320909101929092556001600160a01b0388168152600c90915260409020805480610ecd57610ecd613c85565b60019003818190600052602060002001600090559055610ef0565b600101610de1565b506001600160a01b038085166000818152600c60209081526040808320805460018101825590845282842001889055878352600490915280822080546001600160a01b0319169055518693891691600080516020613e9a83398151915291a45050505050565b826001600160a01b0381163314610f7057610f70336125bc565b610f7b848484612b48565b50505050565b6000818152600260205260409020546001600160a01b031680610fb65760405162461bcd60e51b815260040161053690613cf3565b919050565b3360009081526006602052604090205460ff16610fea5760405162461bcd60e51b8152600401610536906139f6565b610ff3866111f8565b60000361100d57611008868686868686611c25565b611101565b600080600061102389898888886000015161237f565b9250925092508115801561103657508015155b156110ea576000818152600b60209081526040808320815160a08101835288518152888401511515818501528883015192810192909252606080890151908301526080808901519083015260020180546001810182559084529190922082516005909202019081906110a89082613a7e565b50602082015160018201805460ff1916911515919091179055604082015160028201556060820151600382015560809091015160049091015550611101915050565b826110fd576110fd898989898989611c25565b5050505b505050505050565b6007546001600160a01b031633146111335760405162461bcd60e51b815260040161053690613c9b565b6001600160a01b03811660009081526006602052604090205460ff16156111ac5760405162461bcd60e51b815260206004820152602760248201527f54686973206164647265737320697320616c726561647920686176652061646d604482015266696e20726f6c6560c81b6064820152608401610536565b6001600160a01b038116600081815260066020526040808220805460ff19166001179055517f44d6d25963f097ad14f29f06854a01f575648a1ef82f30e562ccd3889717e3399190a250565b60006001600160a01b03821661123f5760405162461bcd60e51b815260206004820152600c60248201526b5a45524f5f4144445245535360a01b6044820152606401610536565b506001600160a01b031660009081526003602052604090205490565b3360009081526006602052604090205460ff1661128a5760405162461bcd60e51b8152600401610536906139f6565b6000818152600b6020526040808220815160a081019092528054829082906112b1906139bc565b80601f01602080910402602001604051908101604052809291908181526020018280546112dd906139bc565b801561132a5780601f106112ff5761010080835404028352916020019161132a565b820191906000526020600020905b81548152906001019060200180831161130d57829003601f168201915b50505050508152602001600182018054611343906139bc565b80601f016020809104026020016040519081016040528092919081815260200182805461136f906139bc565b80156113bc5780601f10611391576101008083540402835291602001916113bc565b820191906000526020600020905b81548152906001019060200180831161139f57829003601f168201915b5050505050815260200160028201805480602002602001604051908101604052809291908181526020016000905b828210156114e157838290600052602060002090600502016040518060a001604052908160008201805461141d906139bc565b80601f0160208091040260200160405190810160405280929190818152602001828054611449906139bc565b80156114965780601f1061146b57610100808354040283529160200191611496565b820191906000526020600020905b81548152906001019060200180831161147957829003601f168201915b505050918352505060018281015460ff1615156020808401919091526002840154604084015260038401546060840152600490930154608090920191909152918352920191016113ea565b5050505081526020016003820180546114f9906139bc565b80601f0160208091040260200160405190810160405280929190818152602001828054611525906139bc565b80156115725780601f1061154757610100808354040283529160200191611572565b820191906000526020600020905b81548152906001019060200180831161155557829003601f168201915b5050505050815260200160048201805461158b906139bc565b80601f01602080910402602001604051908101604052809291908181526020018280546115b7906139bc565b80156116045780601f106115d957610100808354040283529160200191611604565b820191906000526020600020905b8154815290600101906020018083116115e757829003601f168201915b505050919092525050506000838152600260205260408120549192506001600160a01b0390911690805b8360400151518110156116ce578360400151818151811061165157611651613ba3565b60200260200101516020015115611696578360400151818151811061167857611678613ba3565b6020026020010151604001518261168f9190613d17565b91506116c6565b836040015181815181106116ac576116ac613ba3565b602002602001015160400151826116c39190613d3f565b91505b60010161162e565b506116d884612c02565b6000848152600b60205260408120906116f18282613110565b6116ff600183016000613110565b61170d60028301600061314a565b61171b600383016000613110565b611729600483016000613110565b505060008082128015919061173f57508161175b565b8260085461174d9190613b90565b611758906001613d66565b90505b604080516001600160a01b03861681526020810188905290810182905282151560608201527f7dba56ccd98cbec1ed180696d405fbeebef14cd975e25cf9f3d6920c3b5bbfc19060800160405180910390a1505050505050565b6001600160a01b0381166000908152600c6020526040812054606091816001600160401b038111156117e9576117e96132fc565b60405190808252806020026020018201604052801561182257816020015b61180f61316b565b8152602001906001900390816118075790505b50905060005b82811015611c1d576001600160a01b0385166000908152600c602052604081208054600b9291908490811061185f5761185f613ba3565b906000526020600020015481526020019081526020016000206040518060a0016040529081600082018054611893906139bc565b80601f01602080910402602001604051908101604052809291908181526020018280546118bf906139bc565b801561190c5780601f106118e15761010080835404028352916020019161190c565b820191906000526020600020905b8154815290600101906020018083116118ef57829003601f168201915b50505050508152602001600182018054611925906139bc565b80601f0160208091040260200160405190810160405280929190818152602001828054611951906139bc565b801561199e5780601f106119735761010080835404028352916020019161199e565b820191906000526020600020905b81548152906001019060200180831161198157829003601f168201915b5050505050815260200160028201805480602002602001604051908101604052809291908181526020016000905b82821015611ac357838290600052602060002090600502016040518060a00160405290816000820180546119ff906139bc565b80601f0160208091040260200160405190810160405280929190818152602001828054611a2b906139bc565b8015611a785780601f10611a4d57610100808354040283529160200191611a78565b820191906000526020600020905b815481529060010190602001808311611a5b57829003601f168201915b505050918352505060018281015460ff1615156020808401919091526002840154604084015260038401546060840152600490930154608090920191909152918352920191016119cc565b505050508152602001600382018054611adb906139bc565b80601f0160208091040260200160405190810160405280929190818152602001828054611b07906139bc565b8015611b545780601f10611b2957610100808354040283529160200191611b54565b820191906000526020600020905b815481529060010190602001808311611b3757829003601f168201915b50505050508152602001600482018054611b6d906139bc565b80601f0160208091040260200160405190810160405280929190818152602001828054611b99906139bc565b8015611be65780601f10611bbb57610100808354040283529160200191611be6565b820191906000526020600020905b815481529060010190602001808311611bc957829003601f168201915b505050505081525050828281518110611c0157611c01613ba3565b602002602001018190525080611c1690613d79565b9050611828565b509392505050565b3360009081526006602052604090205460ff16611c545760405162461bcd60e51b8152600401610536906139f6565b6000838387604051602001611c6b93929190613b37565b60408051601f1981840301815291815281516020928301206000818152600d90935291205490915015611cd55760405162461bcd60e51b81526020600482015260126024820152714e465420616c72656164792065786973747360701b6044820152606401610536565b600160096000828254611ce89190613d66565b90915550506009546000908152600b60209081526040808320815160a0810183528651815286840151151581850152868301519281019290925260608087015190830152608080870151908301526002018054600181018255908452919092208251600590920201908190611d5d9082613a7e565b5060208281015160018301805460ff19169115159190911790556040808401516002840155606084015160038401556080909301516004909201919091556009546000908152600b90915220611db38782613a7e565b506009546000908152600b60205260409020600101611dd28682613a7e565b506009546000908152600b60205260409020600301611df18582613a7e565b506009546000908152600b60205260409020600401611e108482613a7e565b50600980546000838152600d602090815260408083208490556001600160a01b038c168352600c8252822080546001810182559083529120015554611e56908890612d44565b50505050505050565b6001805461046d906139bc565b611e7461316b565b6000828152600b602052604090819020815160a08101909252805482908290611e9c906139bc565b80601f0160208091040260200160405190810160405280929190818152602001828054611ec8906139bc565b8015611f155780601f10611eea57610100808354040283529160200191611f15565b820191906000526020600020905b815481529060010190602001808311611ef857829003601f168201915b50505050508152602001600182018054611f2e906139bc565b80601f0160208091040260200160405190810160405280929190818152602001828054611f5a906139bc565b8015611fa75780601f10611f7c57610100808354040283529160200191611fa7565b820191906000526020600020905b815481529060010190602001808311611f8a57829003601f168201915b5050505050815260200160028201805480602002602001604051908101604052809291908181526020016000905b828210156120cc57838290600052602060002090600502016040518060a0016040529081600082018054612008906139bc565b80601f0160208091040260200160405190810160405280929190818152602001828054612034906139bc565b80156120815780601f1061205657610100808354040283529160200191612081565b820191906000526020600020905b81548152906001019060200180831161206457829003601f168201915b505050918352505060018281015460ff161515602080840191909152600284015460408401526003840154606084015260049093015460809092019190915291835292019101611fd5565b5050505081526020016003820180546120e4906139bc565b80601f0160208091040260200160405190810160405280929190818152602001828054612110906139bc565b801561215d5780601f106121325761010080835404028352916020019161215d565b820191906000526020600020905b81548152906001019060200180831161214057829003601f168201915b50505050508152602001600482018054612176906139bc565b80601f01602080910402602001604051908101604052809291908181526020018280546121a2906139bc565b80156121ef5780601f106121c4576101008083540402835291602001916121ef565b820191906000526020600020905b8154815290600101906020018083116121d257829003601f168201915b5050505050815250509050919050565b81612209816125bc565b6105028383612e02565b60008084848460405160200161222b93929190613b37565b60408051808303601f1901815291815281516020928301206000908152600d90925290205495945050505050565b846001600160a01b038116331461227357612273336125bc565b6111018686868686612e6e565b60606009546000148061229557506009548211155b6122ed5760405162461bcd60e51b815260206004820152602360248201527f63616e2774206765742055524920666f72206e6f6e6578697374656e7420746f60448201526235b2b760e91b6064820152608401610536565b600a80546122fa906139bc565b80601f0160208091040260200160405190810160405280929190818152602001828054612326906139bc565b80156123735780601f1061234857610100808354040283529160200191612373565b820191906000526020600020905b81548152906001019060200180831161235657829003601f168201915b50505050509050919050565b60008060008061239087878a612213565b90506000811180156123bb5750886001600160a01b03166123b082610f81565b6001600160a01b0316145b156123dd5760006123cc8287612751565b506001955093509091506123ea9050565b6000806000935093509350505b955095509592505050565b6001600160a01b0381166000908152600c602090815260409182902080548351818402810184019094528084526060939283018282801561237357602002820191906000526020600020905b8154815260200190600101908083116124415750505050509050919050565b6007546001600160a01b0316331461248a5760405162461bcd60e51b815260040161053690613c9b565b6007546001600160a01b038083169116036124f25760405162461bcd60e51b815260206004820152602260248201527f4e6577206f776e657220616464726573732069732063757272656e74206f776e60448201526132b960f11b6064820152608401610536565b600780546001600160a01b03908116600081815260066020526040808220805460ff19908116909155938616808352818320805490951660011790945584546001600160a01b03191684179094559251909283917fb532073b38c83145e3e5135377a08bf9aab55bc0fd7c1179cd4fb995d2a5159c9190a35050565b60006301ffc9a760e01b6001600160e01b03198316148061259f57506380ac58cd60e01b6001600160e01b03198316145b8061045a5750506001600160e01b031916635b5e139f60e01b1490565b6daaeb6d7670e522a718067333cd4e3b1561266c57604051633185c44d60e21b81523060048201526001600160a01b03821660248201526daaeb6d7670e522a718067333cd4e9063c617113490604401602060405180830381865afa158015612629573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061264d9190613d92565b61266c5780604051633b79c77360e21b815260040161053691906132a7565b50565b6000818152600260205260409020546001600160a01b0316338114806126b857506001600160a01b038116600090815260056020908152604080832033845290915290205460ff165b6126f55760405162461bcd60e51b815260206004820152600e60248201526d1393d517d055551213d49256915160921b6044820152606401610536565b60008281526004602052604080822080546001600160a01b0319166001600160a01b0387811691821790925591518593918516917f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92591a4505050565b6000806000600b60008681526020019081526020016000206040518060a0016040529081600082018054612784906139bc565b80601f01602080910402602001604051908101604052809291908181526020018280546127b0906139bc565b80156127fd5780601f106127d2576101008083540402835291602001916127fd565b820191906000526020600020905b8154815290600101906020018083116127e057829003601f168201915b50505050508152602001600182018054612816906139bc565b80601f0160208091040260200160405190810160405280929190818152602001828054612842906139bc565b801561288f5780601f106128645761010080835404028352916020019161288f565b820191906000526020600020905b81548152906001019060200180831161287257829003601f168201915b5050505050815260200160028201805480602002602001604051908101604052809291908181526020016000905b828210156129b457838290600052602060002090600502016040518060a00160405290816000820180546128f0906139bc565b80601f016020809104026020016040519081016040528092919081815260200182805461291c906139bc565b80156129695780601f1061293e57610100808354040283529160200191612969565b820191906000526020600020905b81548152906001019060200180831161294c57829003601f168201915b505050918352505060018281015460ff1615156020808401919091526002840154604084015260038401546060840152600490930154608090920191909152918352920191016128bd565b5050505081526020016003820180546129cc906139bc565b80601f01602080910402602001604051908101604052809291908181526020018280546129f8906139bc565b8015612a455780601f10612a1a57610100808354040283529160200191612a45565b820191906000526020600020905b815481529060010190602001808311612a2857829003601f168201915b50505050508152602001600482018054612a5e906139bc565b80601f0160208091040260200160405190810160405280929190818152602001828054612a8a906139bc565b8015612ad75780601f10612aac57610100808354040283529160200191612ad7565b820191906000526020600020905b815481529060010190602001808311612aba57829003601f168201915b505050505081525050905060005b816040015151811015612b3757612b1d82604001518281518110612b0b57612b0b613ba3565b60200260200101516000015186612f33565b15612b2f57600193509150612b419050565b600101612ae5565b5060008092509250505b9250929050565b612b53838383610c3c565b6001600160a01b0382163b1580612be65750604051630a85bd0160e11b808252906001600160a01b0384169063150b7a0290612b9790339088908790600401613daf565b6020604051808303816000875af1158015612bb6573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612bda9190613de2565b6001600160e01b031916145b6105025760405162461bcd60e51b815260040161053690613dff565b6000818152600260209081526040808320546001600160a01b0316808452600c90925290912054612c3283612f9d565b60005b81811015610f7b576001600160a01b0383166000908152600c60205260409020805482908110612c6757612c67613ba3565b90600052602060002001548403612d3c576001600160a01b0383166000908152600c60205260409020612c9b600184613b90565b81548110612cab57612cab613ba3565b9060005260206000200154600c6000856001600160a01b03166001600160a01b031681526020019081526020016000208281548110612cec57612cec613ba3565b60009182526020808320909101929092556001600160a01b0385168152600c90915260409020805480612d2157612d21613c85565b60019003818190600052602060002001600090559055610f7b565b600101612c35565b612d4e828261303b565b6001600160a01b0382163b1580612de25750604051630a85bd0160e11b808252906001600160a01b0384169063150b7a0290612d939033906000908790600401613daf565b6020604051808303816000875af1158015612db2573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612dd69190613de2565b6001600160e01b031916145b612dfe5760405162461bcd60e51b815260040161053690613dff565b5050565b3360008181526005602090815260408083206001600160a01b03871680855290835292819020805460ff191686151590811790915590519081529192917f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31910160405180910390a35050565b612e79858585610c3c565b6001600160a01b0384163b1580612f105750604051630a85bd0160e11b808252906001600160a01b0386169063150b7a0290612ec19033908a90899089908990600401613e29565b6020604051808303816000875af1158015612ee0573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612f049190613de2565b6001600160e01b031916145b612f2c5760405162461bcd60e51b815260040161053690613dff565b5050505050565b60008151835114612f465750600061045a565b81604051602001612f579190613e7d565b6040516020818303038152906040528051906020012083604051602001612f7e9190613e7d565b6040516020818303038152906040528051906020012014905092915050565b6000818152600260205260409020546001600160a01b031680612fd25760405162461bcd60e51b815260040161053690613cf3565b6001600160a01b038116600081815260036020908152604080832080546000190190558583526002825280832080546001600160a01b03199081169091556004909252808320805490921690915551849290600080516020613e9a833981519152908390a45050565b6001600160a01b0382166130615760405162461bcd60e51b815260040161053690613cc8565b6000818152600260205260409020546001600160a01b0316156130b75760405162461bcd60e51b815260206004820152600e60248201526d1053149150511657d3525395115160921b6044820152606401610536565b6001600160a01b038216600081815260036020908152604080832080546001019055848352600290915280822080546001600160a01b031916841790555183929190600080516020613e9a833981519152908290a45050565b50805461311c906139bc565b6000825580601f1061312c575050565b601f01602090049060005260206000209081019061266c919061319a565b508054600082556005029060005260206000209081019061266c91906131b3565b6040518060a0016040528060608152602001606081526020016060815260200160608152602001606081525090565b5b808211156131af576000815560010161319b565b5090565b808211156131af5760006131c78282613110565b5060018101805460ff191690556000600282018190556003820181905560048201556005016131b3565b6001600160e01b03198116811461266c57600080fd5b60006020828403121561321957600080fd5b8135613224816131f1565b9392505050565b60005b8381101561324657818101518382015260200161322e565b50506000910152565b6000815180845261326781602086016020860161322b565b601f01601f19169290920160200192915050565b602081526000613224602083018461324f565b6000602082840312156132a057600080fd5b5035919050565b6001600160a01b0391909116815260200190565b80356001600160a01b0381168114610fb657600080fd5b600080604083850312156132e557600080fd5b6132ee836132bb565b946020939093013593505050565b634e487b7160e01b600052604160045260246000fd5b600082601f83011261332357600080fd5b81356001600160401b038082111561333d5761333d6132fc565b604051601f8301601f19908116603f01168101908282118183101715613365576133656132fc565b8160405283815286602085880101111561337e57600080fd5b836020870160208301376000602085830101528094505050505092915050565b600080604083850312156133b157600080fd5b8235915060208301356001600160401b038111156133ce57600080fd5b6133da85828601613312565b9150509250929050565b600080600080600060a086880312156133fc57600080fd5b613405866132bb565b945060208601356001600160401b038082111561342157600080fd5b61342d89838a01613312565b9550604088013591508082111561344357600080fd5b61344f89838a01613312565b9450606088013591508082111561346557600080fd5b61347189838a01613312565b9350608088013591508082111561348757600080fd5b5061349488828901613312565b9150509295509295909350565b6000602082840312156134b357600080fd5b613224826132bb565b6000806000606084860312156134d157600080fd5b6134da846132bb565b92506134e8602085016132bb565b9150604084013590509250925092565b801515811461266c57600080fd5b600060a0828403121561351857600080fd5b60405160a081016001600160401b03828210818311171561353b5761353b6132fc565b81604052829350843591508082111561355357600080fd5b5061356085828601613312565b8252506020830135613571816134f8565b806020830152506040830135604082015260608301356060820152608083013560808201525092915050565b60008060008060008060c087890312156135b657600080fd5b6135bf876132bb565b955060208701356001600160401b03808211156135db57600080fd5b6135e78a838b01613312565b965060408901359150808211156135fd57600080fd5b6136098a838b01613312565b9550606089013591508082111561361f57600080fd5b61362b8a838b01613312565b9450608089013591508082111561364157600080fd5b61364d8a838b01613312565b935060a089013591508082111561366357600080fd5b5061367089828a01613506565b9150509295509295509295565b600060a082518185526136928286018261324f565b9050602080850151868303828801526136ab838261324f565b925050604080860151878403828901528381518086528486019150848160051b870101858401935060005b8281101561373557878203601f19018452845180518a84526136fa8b85018261324f565b828a01511515858b015288830151898601526060808401519086015260809283015192909401919091525093860193928601926001016136d6565b5060608a015197508a810360608c015261374f818961324f565b9750505050505050506080830151848203608086015261376f828261324f565b95945050505050565b6000602080830181845280855180835260408601915060408160051b870101925083870160005b828110156137cd57603f198886030184526137bb85835161367d565b9450928501929085019060010161379f565b5092979650505050505050565b602081526000613224602083018461367d565b6000806040838503121561380057600080fd5b613809836132bb565b91506020830135613819816134f8565b809150509250929050565b60008060006060848603121561383957600080fd5b83356001600160401b038082111561385057600080fd5b61385c87838801613312565b9450602086013591508082111561387257600080fd5b61387e87838801613312565b9350604086013591508082111561389457600080fd5b506138a186828701613312565b9150509250925092565b6000806000806000608086880312156138c357600080fd5b6138cc866132bb565b94506138da602087016132bb565b93506040860135925060608601356001600160401b03808211156138fd57600080fd5b818801915088601f83011261391157600080fd5b81358181111561392057600080fd5b89602082850101111561393257600080fd5b9699959850939650602001949392505050565b6020808252825182820181905260009190848201906040850190845b8181101561397d57835183529284019291840191600101613961565b50909695505050505050565b6000806040838503121561399c57600080fd5b6139a5836132bb565b91506139b3602084016132bb565b90509250929050565b600181811c908216806139d057607f821691505b6020821081036139f057634e487b7160e01b600052602260045260246000fd5b50919050565b60208082526013908201527221b0b63632b91034b9903737ba1020b236b4b760691b604082015260600190565b601f82111561050257600081815260208120601f850160051c81016020861015613a4a5750805b601f850160051c820191505b8181101561110157828155600101613a56565b600019600383901b1c191660019190911b1790565b81516001600160401b03811115613a9757613a976132fc565b613aab81613aa584546139bc565b84613a23565b602080601f831160018114613ada5760008415613ac85750858301515b613ad28582613a69565b865550611101565b600085815260208120601f198616915b82811015613b0957888601518255948401946001909101908401613aea565b5085821015613b275787850151600019600388901b60f8161c191681555b5050505050600190811b01905550565b60008451613b4981846020890161322b565b845190830190613b5d81836020890161322b565b8451910190613b7081836020880161322b565b0195945050505050565b634e487b7160e01b600052601160045260246000fd5b8181038181111561045a5761045a613b7a565b634e487b7160e01b600052603260045260246000fd5b818103613bc4575050565b613bce82546139bc565b6001600160401b03811115613be557613be56132fc565b613bf381613aa584546139bc565b6000601f821160018114613c215760008315613c0f5750848201545b613c198482613a69565b855550612f2c565b600085815260209020601f19841690600086815260209020845b83811015613c5b5782860154825560019586019590910190602001613c3b565b5085831015613b275793015460001960f8600387901b161c19169092555050600190811b01905550565b634e487b7160e01b600052603160045260246000fd5b60208082526013908201527221b0b63632b91034b9903737ba1027bbb732b960691b604082015260600190565b6020808252601190820152701253959053125117d49150d25412515395607a1b604082015260600190565b6020808252600a90820152691393d517d3525395115160b21b604082015260600190565b8082018281126000831280158216821582161715613d3757613d37613b7a565b505092915050565b8181036000831280158383131683831282161715613d5f57613d5f613b7a565b5092915050565b8082018082111561045a5761045a613b7a565b600060018201613d8b57613d8b613b7a565b5060010190565b600060208284031215613da457600080fd5b8151613224816134f8565b6001600160a01b039384168152919092166020820152604081019190915260806060820181905260009082015260a00190565b600060208284031215613df457600080fd5b8151613224816131f1565b60208082526010908201526f155394d0519157d49150d2541251539560821b604082015260600190565b6001600160a01b038681168252851660208201526040810184905260806060820181905281018290526000828460a0840137600060a0848401015260a0601f19601f85011683010190509695505050505050565b60008251613e8f81846020870161322b565b919091019291505056feddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3efa2646970667358221220c753f1dbaa6b0ad898e2e852af7e5ad6c1e677caf62eb96c61738b76fd13165464736f6c63430008100033000000000000000000000000000000000000000000000000000000000000006000000000000000000000000000000000000000000000000000000000000000a000000000000000000000000000000000000000000000000000000000000000e000000000000000000000000000000000000000000000000000000000000000195465737420537472616e647320506f736974696f6e204e46540000000000000000000000000000000000000000000000000000000000000000000000000000065465737453500000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000005268747470733a2f2f737472616e64732e696e667572612d697066732e696f2f697066732f516d544141705938377661346b74547862436961735a767677563865463762366737587764694d4a36794b7539700000000000000000000000000000

Deployed Bytecode

0x608060405234801561001057600080fd5b506004361061016a5760003560e01c806301ffc9a71461016f57806306fdde0314610197578063081812fc146101ac578063095ea7b3146101e2578063162094c4146101f757806316bbbe731461020a5780631785f53c1461021d57806323b872dd1461023057806324d7806c1461024357806341f434341461026657806342842e0e1461027b57806346aa52ce1461028e5780636352211e146102a55780636e0bc23b146102b857806370480275146102cb57806370a08231146102de5780638389abf4146102f1578063845e1259146103045780638da5cb5b146103245780638fd62d4b1461033757806395d89b411461034a5780639ecceb5e14610352578063a22cb46514610372578063b75103c314610385578063b88d4fde14610398578063c87b56dd146103ab578063e3291be5146103be578063e66b6000146103ee578063e985e9c51461040e578063f2fde38b1461043c575b600080fd5b61018261017d366004613207565b61044f565b60405190151581526020015b60405180910390f35b61019f610460565b60405161018e919061327b565b6101d56101ba36600461328e565b6004602052600090815260409020546001600160a01b031681565b60405161018e91906132a7565b6101f56101f03660046132d2565b6104ee565b005b6101f561020536600461339e565b610507565b6101f56102183660046133e4565b6105b4565b6101f561022b3660046134a1565b610b65565b6101f561023e3660046134bc565b610c3c565b6101826102513660046134a1565b60066020526000908152604090205460ff1681565b6101d56daaeb6d7670e522a718067333cd4e81565b6101f56102893660046134bc565b610f56565b61029760095481565b60405190815260200161018e565b6101d56102b336600461328e565b610f81565b6101f56102c636600461359d565b610fbb565b6101f56102d93660046134a1565b611109565b6102976102ec3660046134a1565b6111f8565b6101f56102ff36600461328e565b61125b565b6103176103123660046134a1565b6117b5565b60405161018e9190613778565b6007546101d5906001600160a01b031681565b6101f561034536600461359d565b611c25565b61019f611e5f565b61036561036036600461328e565b611e6c565b60405161018e91906137da565b6101f56103803660046137ed565b6121ff565b610297610393366004613824565b612213565b6101f56103a63660046138ab565b612259565b61019f6103b936600461328e565b612280565b6103d16103cc3660046133e4565b61237f565b60408051931515845291151560208401529082015260600161018e565b6104016103fc3660046134a1565b6123f5565b60405161018e9190613945565b61018261041c366004613989565b600560209081526000928352604080842090915290825290205460ff1681565b6101f561044a3660046134a1565b612460565b600061045a8261256e565b92915050565b6000805461046d906139bc565b80601f0160208091040260200160405190810160405280929190818152602001828054610499906139bc565b80156104e65780601f106104bb576101008083540402835291602001916104e6565b820191906000526020600020905b8154815290600101906020018083116104c957829003601f168201915b505050505081565b816104f8816125bc565b610502838361266f565b505050565b3360009081526006602052604090205460ff1661053f5760405162461bcd60e51b8152600401610536906139f6565b60405180910390fd5b600954158061055057506009548211155b6105a85760405162461bcd60e51b815260206004820152602360248201527f63616e2774207365742055524920666f72206e6f6e6578697374656e7420746f60448201526235b2b760e91b6064820152608401610536565b600a6105028282613a7e565b3360009081526006602052604090205460ff166105e35760405162461bcd60e51b8152600401610536906139f6565b60008060006105f5888787878b61237f565b9250925092508280156106055750815b6106475760405162461bcd60e51b8152602060048201526013602482015272151c98591948191bd95cdb89dd08195e1a5cdd606a1b6044820152606401610536565b6000818152600b6020526040808220815160a0810190925280548290829061066e906139bc565b80601f016020809104026020016040519081016040528092919081815260200182805461069a906139bc565b80156106e75780601f106106bc576101008083540402835291602001916106e7565b820191906000526020600020905b8154815290600101906020018083116106ca57829003601f168201915b50505050508152602001600182018054610700906139bc565b80601f016020809104026020016040519081016040528092919081815260200182805461072c906139bc565b80156107795780601f1061074e57610100808354040283529160200191610779565b820191906000526020600020905b81548152906001019060200180831161075c57829003601f168201915b5050505050815260200160028201805480602002602001604051908101604052809291908181526020016000905b8282101561089e57838290600052602060002090600502016040518060a00160405290816000820180546107da906139bc565b80601f0160208091040260200160405190810160405280929190818152602001828054610806906139bc565b80156108535780601f1061082857610100808354040283529160200191610853565b820191906000526020600020905b81548152906001019060200180831161083657829003601f168201915b505050918352505060018281015460ff1615156020808401919091526002840154604084015260038401546060840152600490930154608090920191909152918352920191016107a7565b5050505081526020016003820180546108b6906139bc565b80601f01602080910402602001604051908101604052809291908181526020018280546108e2906139bc565b801561092f5780601f106109045761010080835404028352916020019161092f565b820191906000526020600020905b81548152906001019060200180831161091257829003601f168201915b50505050508152602001600482018054610948906139bc565b80601f0160208091040260200160405190810160405280929190818152602001828054610974906139bc565b80156109c15780601f10610996576101008083540402835291602001916109c1565b820191906000526020600020905b8154815290600101906020018083116109a457829003601f168201915b505050919092525050506040810151519091506001819003610a28576109e68361125b565b600087878a6040516020016109fd93929190613b37565b60408051601f1981840301815291815281516020928301206000908152600d90925281205550610b59565b6000610a34848b612751565b6000868152600b602052604090209092506002019050610a55600184613b90565b81548110610a6557610a65613ba3565b9060005260206000209060050201600b60008681526020019081526020016000206002018281548110610a9a57610a9a613ba3565b6000918252602090912060059091020180610ab58382613bb9565b50600182810154908201805460ff191660ff9092161515919091179055600280830154818301556003808401549083015560049283015492909101919091556000858152600b6020526040902001805480610b1257610b12613c85565b60008281526020812060001990920191600583020190610b328282613110565b5060018101805460ff19169055600060028201819055600382018190556004909101559055505b50505050505050505050565b6007546001600160a01b03163314610b8f5760405162461bcd60e51b815260040161053690613c9b565b6001600160a01b03811660009081526006602052604090205460ff16610bf35760405162461bcd60e51b81526020600482015260196024820152782a3434b99030b2323932b9b99034b9903737ba1030b236b4b760391b6044820152606401610536565b6001600160a01b038116600081815260066020526040808220805460ff19169055517fa3b62bc36326052d97ea62d63c3d60308ed4c3ea8ac079dd8499f1e9c4f80c0f9190a250565b826001600160a01b0381163314610c5657610c56336125bc565b6000828152600260205260409020546001600160a01b03858116911614610cac5760405162461bcd60e51b815260206004820152600a60248201526957524f4e475f46524f4d60b01b6044820152606401610536565b6001600160a01b038316610cd25760405162461bcd60e51b815260040161053690613cc8565b3360009081526006602052604090205460ff1680610cf85750336001600160a01b038516145b80610d2657506001600160a01b038416600090815260056020908152604080832033845290915290205460ff165b80610d4757506000828152600460205260409020546001600160a01b031633145b610d845760405162461bcd60e51b815260206004820152600e60248201526d1393d5081055551213d49256915160921b6044820152606401610536565b6001600160a01b0380851660008181526003602090815260408083208054600019019055938716808352848320805460010190558683526002825284832080546001600160a01b0319169091179055918152600c90915290812054905b81811015610ef0576001600160a01b0386166000908152600c60205260409020805482908110610e1357610e13613ba3565b90600052602060002001548403610ee8576001600160a01b0386166000908152600c60205260409020610e47600184613b90565b81548110610e5757610e57613ba3565b9060005260206000200154600c6000886001600160a01b03166001600160a01b031681526020019081526020016000208281548110610e9857610e98613ba3565b60009182526020808320909101929092556001600160a01b0388168152600c90915260409020805480610ecd57610ecd613c85565b60019003818190600052602060002001600090559055610ef0565b600101610de1565b506001600160a01b038085166000818152600c60209081526040808320805460018101825590845282842001889055878352600490915280822080546001600160a01b0319169055518693891691600080516020613e9a83398151915291a45050505050565b826001600160a01b0381163314610f7057610f70336125bc565b610f7b848484612b48565b50505050565b6000818152600260205260409020546001600160a01b031680610fb65760405162461bcd60e51b815260040161053690613cf3565b919050565b3360009081526006602052604090205460ff16610fea5760405162461bcd60e51b8152600401610536906139f6565b610ff3866111f8565b60000361100d57611008868686868686611c25565b611101565b600080600061102389898888886000015161237f565b9250925092508115801561103657508015155b156110ea576000818152600b60209081526040808320815160a08101835288518152888401511515818501528883015192810192909252606080890151908301526080808901519083015260020180546001810182559084529190922082516005909202019081906110a89082613a7e565b50602082015160018201805460ff1916911515919091179055604082015160028201556060820151600382015560809091015160049091015550611101915050565b826110fd576110fd898989898989611c25565b5050505b505050505050565b6007546001600160a01b031633146111335760405162461bcd60e51b815260040161053690613c9b565b6001600160a01b03811660009081526006602052604090205460ff16156111ac5760405162461bcd60e51b815260206004820152602760248201527f54686973206164647265737320697320616c726561647920686176652061646d604482015266696e20726f6c6560c81b6064820152608401610536565b6001600160a01b038116600081815260066020526040808220805460ff19166001179055517f44d6d25963f097ad14f29f06854a01f575648a1ef82f30e562ccd3889717e3399190a250565b60006001600160a01b03821661123f5760405162461bcd60e51b815260206004820152600c60248201526b5a45524f5f4144445245535360a01b6044820152606401610536565b506001600160a01b031660009081526003602052604090205490565b3360009081526006602052604090205460ff1661128a5760405162461bcd60e51b8152600401610536906139f6565b6000818152600b6020526040808220815160a081019092528054829082906112b1906139bc565b80601f01602080910402602001604051908101604052809291908181526020018280546112dd906139bc565b801561132a5780601f106112ff5761010080835404028352916020019161132a565b820191906000526020600020905b81548152906001019060200180831161130d57829003601f168201915b50505050508152602001600182018054611343906139bc565b80601f016020809104026020016040519081016040528092919081815260200182805461136f906139bc565b80156113bc5780601f10611391576101008083540402835291602001916113bc565b820191906000526020600020905b81548152906001019060200180831161139f57829003601f168201915b5050505050815260200160028201805480602002602001604051908101604052809291908181526020016000905b828210156114e157838290600052602060002090600502016040518060a001604052908160008201805461141d906139bc565b80601f0160208091040260200160405190810160405280929190818152602001828054611449906139bc565b80156114965780601f1061146b57610100808354040283529160200191611496565b820191906000526020600020905b81548152906001019060200180831161147957829003601f168201915b505050918352505060018281015460ff1615156020808401919091526002840154604084015260038401546060840152600490930154608090920191909152918352920191016113ea565b5050505081526020016003820180546114f9906139bc565b80601f0160208091040260200160405190810160405280929190818152602001828054611525906139bc565b80156115725780601f1061154757610100808354040283529160200191611572565b820191906000526020600020905b81548152906001019060200180831161155557829003601f168201915b5050505050815260200160048201805461158b906139bc565b80601f01602080910402602001604051908101604052809291908181526020018280546115b7906139bc565b80156116045780601f106115d957610100808354040283529160200191611604565b820191906000526020600020905b8154815290600101906020018083116115e757829003601f168201915b505050919092525050506000838152600260205260408120549192506001600160a01b0390911690805b8360400151518110156116ce578360400151818151811061165157611651613ba3565b60200260200101516020015115611696578360400151818151811061167857611678613ba3565b6020026020010151604001518261168f9190613d17565b91506116c6565b836040015181815181106116ac576116ac613ba3565b602002602001015160400151826116c39190613d3f565b91505b60010161162e565b506116d884612c02565b6000848152600b60205260408120906116f18282613110565b6116ff600183016000613110565b61170d60028301600061314a565b61171b600383016000613110565b611729600483016000613110565b505060008082128015919061173f57508161175b565b8260085461174d9190613b90565b611758906001613d66565b90505b604080516001600160a01b03861681526020810188905290810182905282151560608201527f7dba56ccd98cbec1ed180696d405fbeebef14cd975e25cf9f3d6920c3b5bbfc19060800160405180910390a1505050505050565b6001600160a01b0381166000908152600c6020526040812054606091816001600160401b038111156117e9576117e96132fc565b60405190808252806020026020018201604052801561182257816020015b61180f61316b565b8152602001906001900390816118075790505b50905060005b82811015611c1d576001600160a01b0385166000908152600c602052604081208054600b9291908490811061185f5761185f613ba3565b906000526020600020015481526020019081526020016000206040518060a0016040529081600082018054611893906139bc565b80601f01602080910402602001604051908101604052809291908181526020018280546118bf906139bc565b801561190c5780601f106118e15761010080835404028352916020019161190c565b820191906000526020600020905b8154815290600101906020018083116118ef57829003601f168201915b50505050508152602001600182018054611925906139bc565b80601f0160208091040260200160405190810160405280929190818152602001828054611951906139bc565b801561199e5780601f106119735761010080835404028352916020019161199e565b820191906000526020600020905b81548152906001019060200180831161198157829003601f168201915b5050505050815260200160028201805480602002602001604051908101604052809291908181526020016000905b82821015611ac357838290600052602060002090600502016040518060a00160405290816000820180546119ff906139bc565b80601f0160208091040260200160405190810160405280929190818152602001828054611a2b906139bc565b8015611a785780601f10611a4d57610100808354040283529160200191611a78565b820191906000526020600020905b815481529060010190602001808311611a5b57829003601f168201915b505050918352505060018281015460ff1615156020808401919091526002840154604084015260038401546060840152600490930154608090920191909152918352920191016119cc565b505050508152602001600382018054611adb906139bc565b80601f0160208091040260200160405190810160405280929190818152602001828054611b07906139bc565b8015611b545780601f10611b2957610100808354040283529160200191611b54565b820191906000526020600020905b815481529060010190602001808311611b3757829003601f168201915b50505050508152602001600482018054611b6d906139bc565b80601f0160208091040260200160405190810160405280929190818152602001828054611b99906139bc565b8015611be65780601f10611bbb57610100808354040283529160200191611be6565b820191906000526020600020905b815481529060010190602001808311611bc957829003601f168201915b505050505081525050828281518110611c0157611c01613ba3565b602002602001018190525080611c1690613d79565b9050611828565b509392505050565b3360009081526006602052604090205460ff16611c545760405162461bcd60e51b8152600401610536906139f6565b6000838387604051602001611c6b93929190613b37565b60408051601f1981840301815291815281516020928301206000818152600d90935291205490915015611cd55760405162461bcd60e51b81526020600482015260126024820152714e465420616c72656164792065786973747360701b6044820152606401610536565b600160096000828254611ce89190613d66565b90915550506009546000908152600b60209081526040808320815160a0810183528651815286840151151581850152868301519281019290925260608087015190830152608080870151908301526002018054600181018255908452919092208251600590920201908190611d5d9082613a7e565b5060208281015160018301805460ff19169115159190911790556040808401516002840155606084015160038401556080909301516004909201919091556009546000908152600b90915220611db38782613a7e565b506009546000908152600b60205260409020600101611dd28682613a7e565b506009546000908152600b60205260409020600301611df18582613a7e565b506009546000908152600b60205260409020600401611e108482613a7e565b50600980546000838152600d602090815260408083208490556001600160a01b038c168352600c8252822080546001810182559083529120015554611e56908890612d44565b50505050505050565b6001805461046d906139bc565b611e7461316b565b6000828152600b602052604090819020815160a08101909252805482908290611e9c906139bc565b80601f0160208091040260200160405190810160405280929190818152602001828054611ec8906139bc565b8015611f155780601f10611eea57610100808354040283529160200191611f15565b820191906000526020600020905b815481529060010190602001808311611ef857829003601f168201915b50505050508152602001600182018054611f2e906139bc565b80601f0160208091040260200160405190810160405280929190818152602001828054611f5a906139bc565b8015611fa75780601f10611f7c57610100808354040283529160200191611fa7565b820191906000526020600020905b815481529060010190602001808311611f8a57829003601f168201915b5050505050815260200160028201805480602002602001604051908101604052809291908181526020016000905b828210156120cc57838290600052602060002090600502016040518060a0016040529081600082018054612008906139bc565b80601f0160208091040260200160405190810160405280929190818152602001828054612034906139bc565b80156120815780601f1061205657610100808354040283529160200191612081565b820191906000526020600020905b81548152906001019060200180831161206457829003601f168201915b505050918352505060018281015460ff161515602080840191909152600284015460408401526003840154606084015260049093015460809092019190915291835292019101611fd5565b5050505081526020016003820180546120e4906139bc565b80601f0160208091040260200160405190810160405280929190818152602001828054612110906139bc565b801561215d5780601f106121325761010080835404028352916020019161215d565b820191906000526020600020905b81548152906001019060200180831161214057829003601f168201915b50505050508152602001600482018054612176906139bc565b80601f01602080910402602001604051908101604052809291908181526020018280546121a2906139bc565b80156121ef5780601f106121c4576101008083540402835291602001916121ef565b820191906000526020600020905b8154815290600101906020018083116121d257829003601f168201915b5050505050815250509050919050565b81612209816125bc565b6105028383612e02565b60008084848460405160200161222b93929190613b37565b60408051808303601f1901815291815281516020928301206000908152600d90925290205495945050505050565b846001600160a01b038116331461227357612273336125bc565b6111018686868686612e6e565b60606009546000148061229557506009548211155b6122ed5760405162461bcd60e51b815260206004820152602360248201527f63616e2774206765742055524920666f72206e6f6e6578697374656e7420746f60448201526235b2b760e91b6064820152608401610536565b600a80546122fa906139bc565b80601f0160208091040260200160405190810160405280929190818152602001828054612326906139bc565b80156123735780601f1061234857610100808354040283529160200191612373565b820191906000526020600020905b81548152906001019060200180831161235657829003601f168201915b50505050509050919050565b60008060008061239087878a612213565b90506000811180156123bb5750886001600160a01b03166123b082610f81565b6001600160a01b0316145b156123dd5760006123cc8287612751565b506001955093509091506123ea9050565b6000806000935093509350505b955095509592505050565b6001600160a01b0381166000908152600c602090815260409182902080548351818402810184019094528084526060939283018282801561237357602002820191906000526020600020905b8154815260200190600101908083116124415750505050509050919050565b6007546001600160a01b0316331461248a5760405162461bcd60e51b815260040161053690613c9b565b6007546001600160a01b038083169116036124f25760405162461bcd60e51b815260206004820152602260248201527f4e6577206f776e657220616464726573732069732063757272656e74206f776e60448201526132b960f11b6064820152608401610536565b600780546001600160a01b03908116600081815260066020526040808220805460ff19908116909155938616808352818320805490951660011790945584546001600160a01b03191684179094559251909283917fb532073b38c83145e3e5135377a08bf9aab55bc0fd7c1179cd4fb995d2a5159c9190a35050565b60006301ffc9a760e01b6001600160e01b03198316148061259f57506380ac58cd60e01b6001600160e01b03198316145b8061045a5750506001600160e01b031916635b5e139f60e01b1490565b6daaeb6d7670e522a718067333cd4e3b1561266c57604051633185c44d60e21b81523060048201526001600160a01b03821660248201526daaeb6d7670e522a718067333cd4e9063c617113490604401602060405180830381865afa158015612629573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061264d9190613d92565b61266c5780604051633b79c77360e21b815260040161053691906132a7565b50565b6000818152600260205260409020546001600160a01b0316338114806126b857506001600160a01b038116600090815260056020908152604080832033845290915290205460ff165b6126f55760405162461bcd60e51b815260206004820152600e60248201526d1393d517d055551213d49256915160921b6044820152606401610536565b60008281526004602052604080822080546001600160a01b0319166001600160a01b0387811691821790925591518593918516917f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92591a4505050565b6000806000600b60008681526020019081526020016000206040518060a0016040529081600082018054612784906139bc565b80601f01602080910402602001604051908101604052809291908181526020018280546127b0906139bc565b80156127fd5780601f106127d2576101008083540402835291602001916127fd565b820191906000526020600020905b8154815290600101906020018083116127e057829003601f168201915b50505050508152602001600182018054612816906139bc565b80601f0160208091040260200160405190810160405280929190818152602001828054612842906139bc565b801561288f5780601f106128645761010080835404028352916020019161288f565b820191906000526020600020905b81548152906001019060200180831161287257829003601f168201915b5050505050815260200160028201805480602002602001604051908101604052809291908181526020016000905b828210156129b457838290600052602060002090600502016040518060a00160405290816000820180546128f0906139bc565b80601f016020809104026020016040519081016040528092919081815260200182805461291c906139bc565b80156129695780601f1061293e57610100808354040283529160200191612969565b820191906000526020600020905b81548152906001019060200180831161294c57829003601f168201915b505050918352505060018281015460ff1615156020808401919091526002840154604084015260038401546060840152600490930154608090920191909152918352920191016128bd565b5050505081526020016003820180546129cc906139bc565b80601f01602080910402602001604051908101604052809291908181526020018280546129f8906139bc565b8015612a455780601f10612a1a57610100808354040283529160200191612a45565b820191906000526020600020905b815481529060010190602001808311612a2857829003601f168201915b50505050508152602001600482018054612a5e906139bc565b80601f0160208091040260200160405190810160405280929190818152602001828054612a8a906139bc565b8015612ad75780601f10612aac57610100808354040283529160200191612ad7565b820191906000526020600020905b815481529060010190602001808311612aba57829003601f168201915b505050505081525050905060005b816040015151811015612b3757612b1d82604001518281518110612b0b57612b0b613ba3565b60200260200101516000015186612f33565b15612b2f57600193509150612b419050565b600101612ae5565b5060008092509250505b9250929050565b612b53838383610c3c565b6001600160a01b0382163b1580612be65750604051630a85bd0160e11b808252906001600160a01b0384169063150b7a0290612b9790339088908790600401613daf565b6020604051808303816000875af1158015612bb6573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612bda9190613de2565b6001600160e01b031916145b6105025760405162461bcd60e51b815260040161053690613dff565b6000818152600260209081526040808320546001600160a01b0316808452600c90925290912054612c3283612f9d565b60005b81811015610f7b576001600160a01b0383166000908152600c60205260409020805482908110612c6757612c67613ba3565b90600052602060002001548403612d3c576001600160a01b0383166000908152600c60205260409020612c9b600184613b90565b81548110612cab57612cab613ba3565b9060005260206000200154600c6000856001600160a01b03166001600160a01b031681526020019081526020016000208281548110612cec57612cec613ba3565b60009182526020808320909101929092556001600160a01b0385168152600c90915260409020805480612d2157612d21613c85565b60019003818190600052602060002001600090559055610f7b565b600101612c35565b612d4e828261303b565b6001600160a01b0382163b1580612de25750604051630a85bd0160e11b808252906001600160a01b0384169063150b7a0290612d939033906000908790600401613daf565b6020604051808303816000875af1158015612db2573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612dd69190613de2565b6001600160e01b031916145b612dfe5760405162461bcd60e51b815260040161053690613dff565b5050565b3360008181526005602090815260408083206001600160a01b03871680855290835292819020805460ff191686151590811790915590519081529192917f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31910160405180910390a35050565b612e79858585610c3c565b6001600160a01b0384163b1580612f105750604051630a85bd0160e11b808252906001600160a01b0386169063150b7a0290612ec19033908a90899089908990600401613e29565b6020604051808303816000875af1158015612ee0573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612f049190613de2565b6001600160e01b031916145b612f2c5760405162461bcd60e51b815260040161053690613dff565b5050505050565b60008151835114612f465750600061045a565b81604051602001612f579190613e7d565b6040516020818303038152906040528051906020012083604051602001612f7e9190613e7d565b6040516020818303038152906040528051906020012014905092915050565b6000818152600260205260409020546001600160a01b031680612fd25760405162461bcd60e51b815260040161053690613cf3565b6001600160a01b038116600081815260036020908152604080832080546000190190558583526002825280832080546001600160a01b03199081169091556004909252808320805490921690915551849290600080516020613e9a833981519152908390a45050565b6001600160a01b0382166130615760405162461bcd60e51b815260040161053690613cc8565b6000818152600260205260409020546001600160a01b0316156130b75760405162461bcd60e51b815260206004820152600e60248201526d1053149150511657d3525395115160921b6044820152606401610536565b6001600160a01b038216600081815260036020908152604080832080546001019055848352600290915280822080546001600160a01b031916841790555183929190600080516020613e9a833981519152908290a45050565b50805461311c906139bc565b6000825580601f1061312c575050565b601f01602090049060005260206000209081019061266c919061319a565b508054600082556005029060005260206000209081019061266c91906131b3565b6040518060a0016040528060608152602001606081526020016060815260200160608152602001606081525090565b5b808211156131af576000815560010161319b565b5090565b808211156131af5760006131c78282613110565b5060018101805460ff191690556000600282018190556003820181905560048201556005016131b3565b6001600160e01b03198116811461266c57600080fd5b60006020828403121561321957600080fd5b8135613224816131f1565b9392505050565b60005b8381101561324657818101518382015260200161322e565b50506000910152565b6000815180845261326781602086016020860161322b565b601f01601f19169290920160200192915050565b602081526000613224602083018461324f565b6000602082840312156132a057600080fd5b5035919050565b6001600160a01b0391909116815260200190565b80356001600160a01b0381168114610fb657600080fd5b600080604083850312156132e557600080fd5b6132ee836132bb565b946020939093013593505050565b634e487b7160e01b600052604160045260246000fd5b600082601f83011261332357600080fd5b81356001600160401b038082111561333d5761333d6132fc565b604051601f8301601f19908116603f01168101908282118183101715613365576133656132fc565b8160405283815286602085880101111561337e57600080fd5b836020870160208301376000602085830101528094505050505092915050565b600080604083850312156133b157600080fd5b8235915060208301356001600160401b038111156133ce57600080fd5b6133da85828601613312565b9150509250929050565b600080600080600060a086880312156133fc57600080fd5b613405866132bb565b945060208601356001600160401b038082111561342157600080fd5b61342d89838a01613312565b9550604088013591508082111561344357600080fd5b61344f89838a01613312565b9450606088013591508082111561346557600080fd5b61347189838a01613312565b9350608088013591508082111561348757600080fd5b5061349488828901613312565b9150509295509295909350565b6000602082840312156134b357600080fd5b613224826132bb565b6000806000606084860312156134d157600080fd5b6134da846132bb565b92506134e8602085016132bb565b9150604084013590509250925092565b801515811461266c57600080fd5b600060a0828403121561351857600080fd5b60405160a081016001600160401b03828210818311171561353b5761353b6132fc565b81604052829350843591508082111561355357600080fd5b5061356085828601613312565b8252506020830135613571816134f8565b806020830152506040830135604082015260608301356060820152608083013560808201525092915050565b60008060008060008060c087890312156135b657600080fd5b6135bf876132bb565b955060208701356001600160401b03808211156135db57600080fd5b6135e78a838b01613312565b965060408901359150808211156135fd57600080fd5b6136098a838b01613312565b9550606089013591508082111561361f57600080fd5b61362b8a838b01613312565b9450608089013591508082111561364157600080fd5b61364d8a838b01613312565b935060a089013591508082111561366357600080fd5b5061367089828a01613506565b9150509295509295509295565b600060a082518185526136928286018261324f565b9050602080850151868303828801526136ab838261324f565b925050604080860151878403828901528381518086528486019150848160051b870101858401935060005b8281101561373557878203601f19018452845180518a84526136fa8b85018261324f565b828a01511515858b015288830151898601526060808401519086015260809283015192909401919091525093860193928601926001016136d6565b5060608a015197508a810360608c015261374f818961324f565b9750505050505050506080830151848203608086015261376f828261324f565b95945050505050565b6000602080830181845280855180835260408601915060408160051b870101925083870160005b828110156137cd57603f198886030184526137bb85835161367d565b9450928501929085019060010161379f565b5092979650505050505050565b602081526000613224602083018461367d565b6000806040838503121561380057600080fd5b613809836132bb565b91506020830135613819816134f8565b809150509250929050565b60008060006060848603121561383957600080fd5b83356001600160401b038082111561385057600080fd5b61385c87838801613312565b9450602086013591508082111561387257600080fd5b61387e87838801613312565b9350604086013591508082111561389457600080fd5b506138a186828701613312565b9150509250925092565b6000806000806000608086880312156138c357600080fd5b6138cc866132bb565b94506138da602087016132bb565b93506040860135925060608601356001600160401b03808211156138fd57600080fd5b818801915088601f83011261391157600080fd5b81358181111561392057600080fd5b89602082850101111561393257600080fd5b9699959850939650602001949392505050565b6020808252825182820181905260009190848201906040850190845b8181101561397d57835183529284019291840191600101613961565b50909695505050505050565b6000806040838503121561399c57600080fd5b6139a5836132bb565b91506139b3602084016132bb565b90509250929050565b600181811c908216806139d057607f821691505b6020821081036139f057634e487b7160e01b600052602260045260246000fd5b50919050565b60208082526013908201527221b0b63632b91034b9903737ba1020b236b4b760691b604082015260600190565b601f82111561050257600081815260208120601f850160051c81016020861015613a4a5750805b601f850160051c820191505b8181101561110157828155600101613a56565b600019600383901b1c191660019190911b1790565b81516001600160401b03811115613a9757613a976132fc565b613aab81613aa584546139bc565b84613a23565b602080601f831160018114613ada5760008415613ac85750858301515b613ad28582613a69565b865550611101565b600085815260208120601f198616915b82811015613b0957888601518255948401946001909101908401613aea565b5085821015613b275787850151600019600388901b60f8161c191681555b5050505050600190811b01905550565b60008451613b4981846020890161322b565b845190830190613b5d81836020890161322b565b8451910190613b7081836020880161322b565b0195945050505050565b634e487b7160e01b600052601160045260246000fd5b8181038181111561045a5761045a613b7a565b634e487b7160e01b600052603260045260246000fd5b818103613bc4575050565b613bce82546139bc565b6001600160401b03811115613be557613be56132fc565b613bf381613aa584546139bc565b6000601f821160018114613c215760008315613c0f5750848201545b613c198482613a69565b855550612f2c565b600085815260209020601f19841690600086815260209020845b83811015613c5b5782860154825560019586019590910190602001613c3b565b5085831015613b275793015460001960f8600387901b161c19169092555050600190811b01905550565b634e487b7160e01b600052603160045260246000fd5b60208082526013908201527221b0b63632b91034b9903737ba1027bbb732b960691b604082015260600190565b6020808252601190820152701253959053125117d49150d25412515395607a1b604082015260600190565b6020808252600a90820152691393d517d3525395115160b21b604082015260600190565b8082018281126000831280158216821582161715613d3757613d37613b7a565b505092915050565b8181036000831280158383131683831282161715613d5f57613d5f613b7a565b5092915050565b8082018082111561045a5761045a613b7a565b600060018201613d8b57613d8b613b7a565b5060010190565b600060208284031215613da457600080fd5b8151613224816134f8565b6001600160a01b039384168152919092166020820152604081019190915260806060820181905260009082015260a00190565b600060208284031215613df457600080fd5b8151613224816131f1565b60208082526010908201526f155394d0519157d49150d2541251539560821b604082015260600190565b6001600160a01b038681168252851660208201526040810184905260806060820181905281018290526000828460a0840137600060a0848401015260a0601f19601f85011683010190509695505050505050565b60008251613e8f81846020870161322b565b919091019291505056feddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3efa2646970667358221220c753f1dbaa6b0ad898e2e852af7e5ad6c1e677caf62eb96c61738b76fd13165464736f6c63430008100033

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

000000000000000000000000000000000000000000000000000000000000006000000000000000000000000000000000000000000000000000000000000000a000000000000000000000000000000000000000000000000000000000000000e000000000000000000000000000000000000000000000000000000000000000195465737420537472616e647320506f736974696f6e204e46540000000000000000000000000000000000000000000000000000000000000000000000000000065465737453500000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000005268747470733a2f2f737472616e64732e696e667572612d697066732e696f2f697066732f516d544141705938377661346b74547862436961735a767677563865463762366737587764694d4a36794b7539700000000000000000000000000000

-----Decoded View---------------
Arg [0] : _name (string): Test Strands Position NFT
Arg [1] : _symbol (string): TestSP
Arg [2] : _tURI (string): https://strands.infura-ipfs.io/ipfs/QmTAApY87va4ktTxbCiasZvvwV8eF7b6g7XwdiMJ6yKu9p

-----Encoded View---------------
11 Constructor Arguments found :
Arg [0] : 0000000000000000000000000000000000000000000000000000000000000060
Arg [1] : 00000000000000000000000000000000000000000000000000000000000000a0
Arg [2] : 00000000000000000000000000000000000000000000000000000000000000e0
Arg [3] : 0000000000000000000000000000000000000000000000000000000000000019
Arg [4] : 5465737420537472616e647320506f736974696f6e204e465400000000000000
Arg [5] : 0000000000000000000000000000000000000000000000000000000000000006
Arg [6] : 5465737453500000000000000000000000000000000000000000000000000000
Arg [7] : 0000000000000000000000000000000000000000000000000000000000000052
Arg [8] : 68747470733a2f2f737472616e64732e696e667572612d697066732e696f2f69
Arg [9] : 7066732f516d544141705938377661346b74547862436961735a767677563865
Arg [10] : 463762366737587764694d4a36794b7539700000000000000000000000000000


[ 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.