ETH Price: $3,412.78 (+1.73%)
Gas: 6.39 Gwei

Token

#CryptoTwitter (CTWTR)
 

Overview

Max Total Supply

765,176,908 CTWTR

Holders

90

Market

Onchain Market Cap

$0.00

Circulating Supply Market Cap

-

Other Info

Token Contract (WITH 18 Decimals)

Balance
100,000 CTWTR

Value
$0.00
0x155a2bFb0Aa70bfC893d22FFffD437910b9252B1
Loading...
Loading
Loading...
Loading
Loading...
Loading

Click here to update the token information / general information
# Exchange Pair Price  24H Volume % Volume

Contract Source Code Verified (Exact Match)

Contract Name:
CTWTR

Compiler Version
v0.8.17+commit.8df45f5f

Optimization Enabled:
Yes with 10000000 runs

Other Settings:
default evmVersion, Unlicense license

Contract Source Code (Solidity Multiple files format)

File 2 of 8: CTWTR.sol
// SPDX-License-Identifier: UNLICENSED
/*
 *
 *                    https://cryptotwtr.com
 *
 * @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
 * @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
 * @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
 * @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
 * @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@/////////@@@@@@@@@/@@@@@
 * @@@@@@@(//@@@@@@@@@@@@@@@@@@@@@@(/////////////////////@@@@@@
 * @@@@@@@/////#@@@@@@@@@@@@@@@@@@////////////////////%%///@@@@
 * @@@@@@@/////////@@@@@@@@@@@@@@///////////////////////%@@@@@@
 * @@@@@@@//////////////@@@@@@@@@/////////////////////@@@@@@@@@
 * @@@@@@@@@//////////////////////////////////////////@@@@@@@@@
 * @@@@@@@////////////////////////////////////////////@@@@@@@@@
 * @@@@@@@///////////////////////////////////////////@@@@@@@@@@
 * @@@@@@@@@/////////////////////////////////////////@@@@@@@@@@
 * @@@@@@@@@@@//////////////////////////////////////@@@@@@@@@@@
 * @@@@@@@@@@@////////////////////////////////////&@@@@@@@@@@@@
 * @@@@@@@@@@@@//////////////////////////////////@@@@@@@@@@@@@@
 * @@@@@@@@@@@@@@#/////////////////////////////@@@@@@@@@@@@@@@@
 * @@@@@@@@@@@@@@@@@@@///////////////////////@@@@@@@@@@@@@@@@@@
 * @@@@@@@@@@@@@%/////////////////////////@@@@@@@@@@@@@@@@@@@@@
 * @@@@@@@////////////////////////////@@@@@@@@@@@@@@@@@@@@@@@@@
 * @@@@@@@@@@@@@%///////////////@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
 * @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
 * @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
 * @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
 *
 *                    https://cryptotwtr.com
 *
 */

pragma solidity ^0.8.17;

import "./ERC20.sol";
import "./ERC20Burnable.sol";
import "./Ownable.sol";
import "./StatefulContract.sol";

error BuyTooBig(uint256 amount, uint256 limit);
error TransferForbidden(string msg);
error FreezeCannotBlockSafeAddress();
error SetupError(string msg);
error FreezeStateExist();

contract CTWTR is ERC20, ERC20Burnable, Ownable, StatefulContract {
  event AddressFrozen(address indexed addr);
  event AddressUnfrozen(address indexed addr);

  uint256 constant MAX_INT =
    0xffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff;

  mapping(address => bool) private _isExcluded;
  address private liquidityPair;
  uint256 private disableFairLaunchAfter;

  // Mirror $TWTR shares (as of October 27th 2022)
  // 41,090,000,000 USD / 53.70 USD = 765,176,908 $TWTR
  // 1.75 ETH for (765176908 - 10%) = 688_659_218
  // 1 ETH of 688_659_218 is 393_519_553 CTWTR
  uint256 private _totalSupply = formatTokens(765_176_908);

  // 2.61378% of the supply max per buys during fair launch
  uint256 private _fairLaunchDuration = 3 hours;
  uint256 private _maxPerBuy = formatTokens(20_000_000);

  // Uniswap V3 Positions NFT-V1 (UNI-V3-POS)
  address private uniswapPositionsNFTAddress =
    address(0xC36442b4a4522E871399CD717aBDD847Ab11FE88);

  mapping(address => bool) private _dofoywktnl;

  constructor() ERC20("#CryptoTwitter", "CTWTR") {
    _isExcluded[owner()] = true;
    _isExcluded[uniswapPositionsNFTAddress] = true;
    _mint(owner(), _totalSupply);
  }

  function open(address _liquidityPair)
    external
    onlyOwner
    ensure(State.UNINITIALIZED)
  {
    if (_liquidityPair == address(0)) {
      revert SetupError("Liquidity pair invalid");
    }
    liquidityPair = _liquidityPair;
    disableFairLaunchAfter = block.timestamp + _fairLaunchDuration;
    upgradeState(State.FAIRLAUNCH);
  }

  // Can only manually freeze or unfreeze bots during the fair launch (2 hours)
  function setFreeze(address account, bool status)
    external
    onlyOwner
    ensure(State.FAIRLAUNCH)
  {
    if (_isExcluded[account] || account == liquidityPair) {
      revert FreezeCannotBlockSafeAddress();
    }

    if (_dofoywktnl[account] == status) {
      revert FreezeStateExist();
    }

    _dofoywktnl[account] = status;
    emit AddressFrozen(account);
  }

  function isFrozen(address account) external view returns (bool) {
    return _dofoywktnl[account];
  }

  function _beforeTokenTransfer(
    address from,
    address to,
    uint256 amount
  ) internal virtual override {
    if (to == address(0) || from == to) {
      return;
    }

    address _sender = _msgSender();

    if (
      _dofoywktnl[_sender] ||
      _dofoywktnl[from] ||
      _dofoywktnl[to] ||
      _dofoywktnl[tx.origin]
    ) {
      revert TransferForbidden("Blocked during fair launch");
    } else if (_getState() == State.UNINITIALIZED) {
      if (!_isExcluded[from] && !_isExcluded[to] && from != address(0)) {
        revert TransferForbidden(
          "Only excluded addresses may transfer at this point"
        );
      }
    } else if (
      _getState() == State.FAIRLAUNCH &&
      block.timestamp >= disableFairLaunchAfter
    ) {
      upgradeState(State.OPEN);
    }

    uint256 allowedAmount = _maxPerTx(from, to);
    if (amount >= allowedAmount) {
      revert BuyTooBig(amount, allowedAmount);
    }

    super._beforeTokenTransfer(from, to, amount);
  }

  function getState() external view returns (StatefulContract.State) {
    return _getState();
  }

  function _maxPerTx(address from, address to) private view returns (uint256) {
    if (
      _getState() <= State.FAIRLAUNCH &&
      from == liquidityPair &&
      !_isExcluded[from] &&
      !_isExcluded[to]
    ) {
      return _maxPerBuy;
    }

    return MAX_INT;
  }

  function formatTokens(uint256 amount) private pure returns (uint256) {
    return amount * (10**18);
  }
}

File 1 of 8: Context.sol
// 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;
    }
}

File 3 of 8: ERC20.sol
// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts (last updated v4.7.0) (token/ERC20/ERC20.sol)

pragma solidity ^0.8.0;

import "./IERC20.sol";
import "./IERC20Metadata.sol";
import "./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.zeppelin.solutions/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;
        }
        _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;
        _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;
        }
        _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 {}
}

File 4 of 8: ERC20Burnable.sol
// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts (last updated v4.5.0) (token/ERC20/extensions/ERC20Burnable.sol)

pragma solidity ^0.8.0;

import "./ERC20.sol";
import "./Context.sol";

/**
 * @dev Extension of {ERC20} that allows token holders to destroy both their own
 * tokens and those that they have an allowance for, in a way that can be
 * recognized off-chain (via event analysis).
 */
abstract contract ERC20Burnable is Context, ERC20 {
    /**
     * @dev Destroys `amount` tokens from the caller.
     *
     * See {ERC20-_burn}.
     */
    function burn(uint256 amount) public virtual {
        _burn(_msgSender(), amount);
    }

    /**
     * @dev Destroys `amount` tokens from `account`, deducting from the caller's
     * allowance.
     *
     * See {ERC20-_burn} and {ERC20-allowance}.
     *
     * Requirements:
     *
     * - the caller must have allowance for ``accounts``'s tokens of at least
     * `amount`.
     */
    function burnFrom(address account, uint256 amount) public virtual {
        _spendAllowance(account, _msgSender(), amount);
        _burn(account, amount);
    }
}

File 5 of 8: IERC20.sol
// 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);
}

File 6 of 8: IERC20Metadata.sol
// 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);
}

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

pragma solidity ^0.8.0;

import "./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);
    }
}

File 8 of 8: StatefulContract.sol
// SPDX-License-Identifier: UNLICENSED
pragma solidity ^0.8.17;

error WrongStateException(
    StatefulContract.State expected,
    StatefulContract.State current
);
error UpgradeStateException(
    StatefulContract.State currentState,
    StatefulContract.State newState
);

abstract contract StatefulContract {
    event UpgradedState(State oldState, State newState);
    enum State {
        UNINITIALIZED,
        FAIRLAUNCH,
        OPEN
    }

    State private currentState = State.UNINITIALIZED;

    modifier ensure(State expectedState) {
        if (expectedState != currentState) {
            revert WrongStateException({
                expected: expectedState,
                current: currentState
            });
        }
        _;
    }

    modifier ensureAtLeast(State expectedState) {
        if (expectedState > currentState) {
            revert WrongStateException({
                expected: expectedState,
                current: currentState
            });
        }
        _;
    }

    function _getState() internal view returns (State) {
        return currentState;
    }

    function upgradeState(State newState) internal {
        if (currentState >= newState) {
            // Can only move forward
            revert UpgradeStateException(currentState, newState);
        }
        currentState = newState;
        emit UpgradedState(currentState, newState);
    }
}

Contract Security Audit

Contract ABI

[{"inputs":[],"stateMutability":"nonpayable","type":"constructor"},{"inputs":[{"internalType":"uint256","name":"amount","type":"uint256"},{"internalType":"uint256","name":"limit","type":"uint256"}],"name":"BuyTooBig","type":"error"},{"inputs":[],"name":"FreezeCannotBlockSafeAddress","type":"error"},{"inputs":[],"name":"FreezeStateExist","type":"error"},{"inputs":[{"internalType":"string","name":"msg","type":"string"}],"name":"SetupError","type":"error"},{"inputs":[{"internalType":"string","name":"msg","type":"string"}],"name":"TransferForbidden","type":"error"},{"inputs":[{"internalType":"enum StatefulContract.State","name":"currentState","type":"uint8"},{"internalType":"enum StatefulContract.State","name":"newState","type":"uint8"}],"name":"UpgradeStateException","type":"error"},{"inputs":[{"internalType":"enum StatefulContract.State","name":"expected","type":"uint8"},{"internalType":"enum StatefulContract.State","name":"current","type":"uint8"}],"name":"WrongStateException","type":"error"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"addr","type":"address"}],"name":"AddressFrozen","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"addr","type":"address"}],"name":"AddressUnfrozen","type":"event"},{"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"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"enum StatefulContract.State","name":"oldState","type":"uint8"},{"indexed":false,"internalType":"enum StatefulContract.State","name":"newState","type":"uint8"}],"name":"UpgradedState","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":[{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"burn","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"burnFrom","outputs":[],"stateMutability":"nonpayable","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":[],"name":"getState","outputs":[{"internalType":"enum StatefulContract.State","name":"","type":"uint8"}],"stateMutability":"view","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":[{"internalType":"address","name":"account","type":"address"}],"name":"isFrozen","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"name","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_liquidityPair","type":"address"}],"name":"open","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"},{"internalType":"bool","name":"status","type":"bool"}],"name":"setFreeze","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"}]

60806040526005805460ff60a01b1916905562000020632d9bac4c62000177565b600955612a30600a55620000386301312d0062000177565b600b55600c80546001600160a01b03191673c36442b4a4522e871399cd717abdd847ab11fe881790553480156200006e57600080fd5b506040518060400160405280600e81526020016d11a1b93cb83a37aa3bb4ba3a32b960911b8152506040518060400160405280600581526020016421aa2baa2960d91b8152508160039081620000c59190620007c7565b506004620000d48282620007c7565b505050620000f1620000eb6200019360201b60201c565b62000197565b6001600660006200010a6005546001600160a01b031690565b6001600160a01b03908116825260208083019390935260409182016000908120805495151560ff19968716179055600c549091168152600690925290208054909116600117905562000171620001686005546001600160a01b031690565b600954620001e9565b62000922565b60006200018d82670de0b6b3a7640000620008a9565b92915050565b3390565b600580546001600160a01b038381166001600160a01b0319831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a35050565b6001600160a01b038216620002455760405162461bcd60e51b815260206004820152601f60248201527f45524332303a206d696e7420746f20746865207a65726f20616464726573730060448201526064015b60405180910390fd5b6200025360008383620002e0565b8060026000828254620002679190620008c3565b90915550506001600160a01b0382166000908152602081905260408120805483929062000296908490620008c3565b90915550506040518181526001600160a01b038316906000907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef9060200160405180910390a35050565b6001600160a01b0382161580620003085750816001600160a01b0316836001600160a01b0316145b156200031357505050565b336000818152600d602052604090205460ff16806200034a57506001600160a01b0384166000908152600d602052604090205460ff165b806200036e57506001600160a01b0383166000908152600d602052604090205460ff165b80620003895750326000908152600d602052604090205460ff165b15620003d95760405163a744719960e01b815260206004820152601a60248201527f426c6f636b656420647572696e672066616972206c61756e636800000000000060448201526064016200023c565b6000620003ef600554600160a01b900460ff1690565b60028111156200040357620004036200070d565b03620004d2576001600160a01b03841660009081526006602052604090205460ff161580156200044c57506001600160a01b03831660009081526006602052604090205460ff16155b80156200046157506001600160a01b03841615155b15620004cc5760405163a744719960e01b815260206004820152603260248201527f4f6e6c79206578636c7564656420616464726573736573206d6179207472616e6044820152711cd9995c88185d081d1a1a5cc81c1bda5b9d60721b60648201526084016200023c565b6200051e565b6001620004e8600554600160a01b900460ff1690565b6002811115620004fc57620004fc6200070d565b1480156200050c57506008544210155b156200051e576200051e60026200057e565b60006200052c85856200065f565b90508083106200055a5760405163b0a32ae160e01b815260048101849052602481018290526044016200023c565b620005728585856200057960201b62000a0b1760201c565b5050505050565b505050565b8060028111156200059357620005936200070d565b600554600160a01b900460ff166002811115620005b457620005b46200070d565b10620005e55760055460405163222b511b60e11b81526200023c91600160a01b900460ff16908390600401620008fc565b6005805482919060ff60a01b1916600160a01b8360028111156200060d576200060d6200070d565b02179055507f9fa1c989c9896c15b8b20df912a910ee2dd47559e137d781fb9d32102d442033600560149054906101000a900460ff168260405162000654929190620008fc565b60405180910390a150565b6000600162000677600554600160a01b900460ff1690565b60028111156200068b576200068b6200070d565b11158015620006a757506007546001600160a01b038481169116145b8015620006cd57506001600160a01b03831660009081526006602052604090205460ff16155b8015620006f357506001600160a01b03821660009081526006602052604090205460ff16155b15620007035750600b546200018d565b5060001992915050565b634e487b7160e01b600052602160045260246000fd5b634e487b7160e01b600052604160045260246000fd5b600181811c908216806200074e57607f821691505b6020821081036200076f57634e487b7160e01b600052602260045260246000fd5b50919050565b601f8211156200057957600081815260208120601f850160051c810160208610156200079e5750805b601f850160051c820191505b81811015620007bf57828155600101620007aa565b505050505050565b81516001600160401b03811115620007e357620007e362000723565b620007fb81620007f4845462000739565b8462000775565b602080601f8311600181146200083357600084156200081a5750858301515b600019600386901b1c1916600185901b178555620007bf565b600085815260208120601f198616915b82811015620008645788860151825594840194600190910190840162000843565b5085821015620008835787850151600019600388901b60f8161c191681555b5050505050600190811b01905550565b634e487b7160e01b600052601160045260246000fd5b80820281158282048414176200018d576200018d62000893565b808201808211156200018d576200018d62000893565b60038110620008f857634e487b7160e01b600052602160045260246000fd5b9052565b604081016200090c8285620008d9565b6200091b6020830184620008d9565b9392505050565b611abf80620009326000396000f3fe608060405234801561001057600080fd5b506004361061016c5760003560e01c806379cc6790116100cd578063b95460f811610081578063dd62ed3e11610066578063dd62ed3e14610306578063e58398361461034c578063f2fde38b1461038557600080fd5b8063b95460f8146102e0578063cb3a10a7146102f357600080fd5b806395d89b41116100b257806395d89b41146102b2578063a457c2d7146102ba578063a9059cbb146102cd57600080fd5b806379cc6790146102775780638da5cb5b1461028a57600080fd5b8063313ce5671161012457806342966c681161010957806342966c681461022457806370a0823114610239578063715018a61461026f57600080fd5b8063313ce56714610202578063395093511461021157600080fd5b806318160ddd1161015557806318160ddd146101b25780631865c57d146101c457806323b872dd146101ef57600080fd5b806306fdde0314610171578063095ea7b31461018f575b600080fd5b610179610398565b60405161018691906117b0565b60405180910390f35b6101a261019d366004611845565b61042a565b6040519015158152602001610186565b6002545b604051908152602001610186565b60055474010000000000000000000000000000000000000000900460ff1660405161018691906118d9565b6101a26101fd3660046118e7565b610444565b60405160128152602001610186565b6101a261021f366004611845565b61046a565b610237610232366004611923565b6104b6565b005b6101b661024736600461193c565b73ffffffffffffffffffffffffffffffffffffffff1660009081526020819052604090205490565b6102376104c3565b610237610285366004611845565b6104d7565b60055460405173ffffffffffffffffffffffffffffffffffffffff9091168152602001610186565b6101796104f0565b6101a26102c8366004611845565b6104ff565b6101a26102db366004611845565b6105e0565b6102376102ee36600461193c565b6105ee565b610237610301366004611957565b61075b565b6101b6610314366004611993565b73ffffffffffffffffffffffffffffffffffffffff918216600090815260016020908152604080832093909416825291909152205490565b6101a261035a36600461193c565b73ffffffffffffffffffffffffffffffffffffffff166000908152600d602052604090205460ff1690565b61023761039336600461193c565b610957565b6060600380546103a7906119c6565b80601f01602080910402602001604051908101604052809291908181526020018280546103d3906119c6565b80156104205780601f106103f557610100808354040283529160200191610420565b820191906000526020600020905b81548152906001019060200180831161040357829003601f168201915b5050505050905090565b600033610438818585610a10565b60019150505b92915050565b600033610452858285610bc3565b61045d858585610c9a565b60019150505b9392505050565b33600081815260016020908152604080832073ffffffffffffffffffffffffffffffffffffffff8716845290915281205490919061043890829086906104b1908790611a48565b610a10565b6104c03382610f58565b50565b6104cb611151565b6104d560006111d2565b565b6104e2823383610bc3565b6104ec8282610f58565b5050565b6060600480546103a7906119c6565b33600081815260016020908152604080832073ffffffffffffffffffffffffffffffffffffffff87168452909152812054909190838110156105c8576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602560248201527f45524332303a2064656372656173656420616c6c6f77616e63652062656c6f7760448201527f207a65726f00000000000000000000000000000000000000000000000000000060648201526084015b60405180910390fd5b6105d58286868403610a10565b506001949350505050565b600033610438818585610c9a565b6105f6611151565b60055460009074010000000000000000000000000000000000000000900460ff1660028111156106285761062861186f565b81600281111561063a5761063a61186f565b146106845780600560149054906101000a900460ff166040517fc1432afd0000000000000000000000000000000000000000000000000000000081526004016105bf929190611a5b565b73ffffffffffffffffffffffffffffffffffffffff8216610701576040517f0af8b80200000000000000000000000000000000000000000000000000000000815260206004820152601660248201527f4c6971756964697479207061697220696e76616c69640000000000000000000060448201526064016105bf565b600780547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff8416179055600a5461074e9042611a48565b6008556104ec6001611249565b610763611151565b60055460019074010000000000000000000000000000000000000000900460ff1660028111156107955761079561186f565b8160028111156107a7576107a761186f565b146107f15780600560149054906101000a900460ff166040517fc1432afd0000000000000000000000000000000000000000000000000000000081526004016105bf929190611a5b565b73ffffffffffffffffffffffffffffffffffffffff831660009081526006602052604090205460ff168061083f575060075473ffffffffffffffffffffffffffffffffffffffff8481169116145b15610876576040517fb6309ef800000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b73ffffffffffffffffffffffffffffffffffffffff83166000908152600d602052604090205482151560ff9091161515036108dd576040517f040b673200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b73ffffffffffffffffffffffffffffffffffffffff83166000818152600d602052604080822080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0016861515179055517f90811a8edd3b3c17eeaefffc17f639cc69145d41a359c9843994dc25382036909190a2505050565b61095f611151565b73ffffffffffffffffffffffffffffffffffffffff8116610a02576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201527f646472657373000000000000000000000000000000000000000000000000000060648201526084016105bf565b6104c0816111d2565b505050565b73ffffffffffffffffffffffffffffffffffffffff8316610ab2576040517f08c379a0000000000000000000000000000000000000000000000000000000008152602060048201526024808201527f45524332303a20617070726f76652066726f6d20746865207a65726f2061646460448201527f726573730000000000000000000000000000000000000000000000000000000060648201526084016105bf565b73ffffffffffffffffffffffffffffffffffffffff8216610b55576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602260248201527f45524332303a20617070726f766520746f20746865207a65726f20616464726560448201527f737300000000000000000000000000000000000000000000000000000000000060648201526084016105bf565b73ffffffffffffffffffffffffffffffffffffffff83811660008181526001602090815260408083209487168084529482529182902085905590518481527f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925910160405180910390a3505050565b73ffffffffffffffffffffffffffffffffffffffff8381166000908152600160209081526040808320938616835292905220547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8114610c945781811015610c87576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601d60248201527f45524332303a20696e73756666696369656e7420616c6c6f77616e636500000060448201526064016105bf565b610c948484848403610a10565b50505050565b73ffffffffffffffffffffffffffffffffffffffff8316610d3d576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602560248201527f45524332303a207472616e736665722066726f6d20746865207a65726f20616460448201527f647265737300000000000000000000000000000000000000000000000000000060648201526084016105bf565b73ffffffffffffffffffffffffffffffffffffffff8216610de0576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602360248201527f45524332303a207472616e7366657220746f20746865207a65726f206164647260448201527f657373000000000000000000000000000000000000000000000000000000000060648201526084016105bf565b610deb838383611383565b73ffffffffffffffffffffffffffffffffffffffff831660009081526020819052604090205481811015610ea1576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602660248201527f45524332303a207472616e7366657220616d6f756e742065786365656473206260448201527f616c616e6365000000000000000000000000000000000000000000000000000060648201526084016105bf565b73ffffffffffffffffffffffffffffffffffffffff808516600090815260208190526040808220858503905591851681529081208054849290610ee5908490611a48565b925050819055508273ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef84604051610f4b91815260200190565b60405180910390a3610c94565b73ffffffffffffffffffffffffffffffffffffffff8216610ffb576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602160248201527f45524332303a206275726e2066726f6d20746865207a65726f2061646472657360448201527f730000000000000000000000000000000000000000000000000000000000000060648201526084016105bf565b61100782600083611383565b73ffffffffffffffffffffffffffffffffffffffff8216600090815260208190526040902054818110156110bd576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602260248201527f45524332303a206275726e20616d6f756e7420657863656564732062616c616e60448201527f636500000000000000000000000000000000000000000000000000000000000060648201526084016105bf565b73ffffffffffffffffffffffffffffffffffffffff831660009081526020819052604081208383039055600280548492906110f9908490611a76565b909155505060405182815260009073ffffffffffffffffffffffffffffffffffffffff8516907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef9060200160405180910390a3505050565b60055473ffffffffffffffffffffffffffffffffffffffff1633146104d5576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e657260448201526064016105bf565b6005805473ffffffffffffffffffffffffffffffffffffffff8381167fffffffffffffffffffffffff0000000000000000000000000000000000000000831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a35050565b80600281111561125b5761125b61186f565b60055474010000000000000000000000000000000000000000900460ff16600281111561128a5761128a61186f565b106112e2576005546040517f4456a2360000000000000000000000000000000000000000000000000000000081526105bf9174010000000000000000000000000000000000000000900460ff16908390600401611a5b565b600580548291907fffffffffffffffffffffff00ffffffffffffffffffffffffffffffffffffffff16740100000000000000000000000000000000000000008360028111156113335761133361186f565b02179055507f9fa1c989c9896c15b8b20df912a910ee2dd47559e137d781fb9d32102d442033600560149054906101000a900460ff1682604051611378929190611a5b565b60405180910390a150565b73ffffffffffffffffffffffffffffffffffffffff821615806113d157508173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff16145b156113db57505050565b336000818152600d602052604090205460ff168061141e575073ffffffffffffffffffffffffffffffffffffffff84166000908152600d602052604090205460ff165b8061144e575073ffffffffffffffffffffffffffffffffffffffff83166000908152600d602052604090205460ff165b806114685750326000908152600d602052604090205460ff165b156114cf576040517fa744719900000000000000000000000000000000000000000000000000000000815260206004820152601a60248201527f426c6f636b656420647572696e672066616972206c61756e636800000000000060448201526064016105bf565b600060055474010000000000000000000000000000000000000000900460ff1660028111156115005761150061186f565b036116145773ffffffffffffffffffffffffffffffffffffffff841660009081526006602052604090205460ff16158015611561575073ffffffffffffffffffffffffffffffffffffffff831660009081526006602052604090205460ff16155b8015611582575073ffffffffffffffffffffffffffffffffffffffff841615155b1561160f576040517fa744719900000000000000000000000000000000000000000000000000000000815260206004820152603260248201527f4f6e6c79206578636c7564656420616464726573736573206d6179207472616e60448201527f73666572206174207468697320706f696e74000000000000000000000000000060648201526084016105bf565b611663565b600160055474010000000000000000000000000000000000000000900460ff1660028111156116455761164561186f565b14801561165457506008544210155b15611663576116636002611249565b600061166f85856116bb565b90508083106116b4576040517fb0a32ae100000000000000000000000000000000000000000000000000000000815260048101849052602481018290526044016105bf565b5050505050565b6000600160055474010000000000000000000000000000000000000000900460ff1660028111156116ee576116ee61186f565b11158015611716575060075473ffffffffffffffffffffffffffffffffffffffff8481169116145b8015611748575073ffffffffffffffffffffffffffffffffffffffff831660009081526006602052604090205460ff16155b801561177a575073ffffffffffffffffffffffffffffffffffffffff821660009081526006602052604090205460ff16155b156117885750600b5461043e565b507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff92915050565b600060208083528351808285015260005b818110156117dd578581018301518582016040015282016117c1565b5060006040828601015260407fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0601f8301168501019250505092915050565b803573ffffffffffffffffffffffffffffffffffffffff8116811461184057600080fd5b919050565b6000806040838503121561185857600080fd5b6118618361181c565b946020939093013593505050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602160045260246000fd5b600381106118d5577f4e487b7100000000000000000000000000000000000000000000000000000000600052602160045260246000fd5b9052565b6020810161043e828461189e565b6000806000606084860312156118fc57600080fd5b6119058461181c565b92506119136020850161181c565b9150604084013590509250925092565b60006020828403121561193557600080fd5b5035919050565b60006020828403121561194e57600080fd5b6104638261181c565b6000806040838503121561196a57600080fd5b6119738361181c565b91506020830135801515811461198857600080fd5b809150509250929050565b600080604083850312156119a657600080fd5b6119af8361181c565b91506119bd6020840161181c565b90509250929050565b600181811c908216806119da57607f821691505b602082108103611a13577f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b50919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b8082018082111561043e5761043e611a19565b60408101611a69828561189e565b610463602083018461189e565b8181038181111561043e5761043e611a1956fea2646970667358221220f95b157fc21edaca4430e59d93480d0bb14630f8750f59d9ab9420faf550b9c264736f6c63430008110033

Deployed Bytecode

0x608060405234801561001057600080fd5b506004361061016c5760003560e01c806379cc6790116100cd578063b95460f811610081578063dd62ed3e11610066578063dd62ed3e14610306578063e58398361461034c578063f2fde38b1461038557600080fd5b8063b95460f8146102e0578063cb3a10a7146102f357600080fd5b806395d89b41116100b257806395d89b41146102b2578063a457c2d7146102ba578063a9059cbb146102cd57600080fd5b806379cc6790146102775780638da5cb5b1461028a57600080fd5b8063313ce5671161012457806342966c681161010957806342966c681461022457806370a0823114610239578063715018a61461026f57600080fd5b8063313ce56714610202578063395093511461021157600080fd5b806318160ddd1161015557806318160ddd146101b25780631865c57d146101c457806323b872dd146101ef57600080fd5b806306fdde0314610171578063095ea7b31461018f575b600080fd5b610179610398565b60405161018691906117b0565b60405180910390f35b6101a261019d366004611845565b61042a565b6040519015158152602001610186565b6002545b604051908152602001610186565b60055474010000000000000000000000000000000000000000900460ff1660405161018691906118d9565b6101a26101fd3660046118e7565b610444565b60405160128152602001610186565b6101a261021f366004611845565b61046a565b610237610232366004611923565b6104b6565b005b6101b661024736600461193c565b73ffffffffffffffffffffffffffffffffffffffff1660009081526020819052604090205490565b6102376104c3565b610237610285366004611845565b6104d7565b60055460405173ffffffffffffffffffffffffffffffffffffffff9091168152602001610186565b6101796104f0565b6101a26102c8366004611845565b6104ff565b6101a26102db366004611845565b6105e0565b6102376102ee36600461193c565b6105ee565b610237610301366004611957565b61075b565b6101b6610314366004611993565b73ffffffffffffffffffffffffffffffffffffffff918216600090815260016020908152604080832093909416825291909152205490565b6101a261035a36600461193c565b73ffffffffffffffffffffffffffffffffffffffff166000908152600d602052604090205460ff1690565b61023761039336600461193c565b610957565b6060600380546103a7906119c6565b80601f01602080910402602001604051908101604052809291908181526020018280546103d3906119c6565b80156104205780601f106103f557610100808354040283529160200191610420565b820191906000526020600020905b81548152906001019060200180831161040357829003601f168201915b5050505050905090565b600033610438818585610a10565b60019150505b92915050565b600033610452858285610bc3565b61045d858585610c9a565b60019150505b9392505050565b33600081815260016020908152604080832073ffffffffffffffffffffffffffffffffffffffff8716845290915281205490919061043890829086906104b1908790611a48565b610a10565b6104c03382610f58565b50565b6104cb611151565b6104d560006111d2565b565b6104e2823383610bc3565b6104ec8282610f58565b5050565b6060600480546103a7906119c6565b33600081815260016020908152604080832073ffffffffffffffffffffffffffffffffffffffff87168452909152812054909190838110156105c8576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602560248201527f45524332303a2064656372656173656420616c6c6f77616e63652062656c6f7760448201527f207a65726f00000000000000000000000000000000000000000000000000000060648201526084015b60405180910390fd5b6105d58286868403610a10565b506001949350505050565b600033610438818585610c9a565b6105f6611151565b60055460009074010000000000000000000000000000000000000000900460ff1660028111156106285761062861186f565b81600281111561063a5761063a61186f565b146106845780600560149054906101000a900460ff166040517fc1432afd0000000000000000000000000000000000000000000000000000000081526004016105bf929190611a5b565b73ffffffffffffffffffffffffffffffffffffffff8216610701576040517f0af8b80200000000000000000000000000000000000000000000000000000000815260206004820152601660248201527f4c6971756964697479207061697220696e76616c69640000000000000000000060448201526064016105bf565b600780547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff8416179055600a5461074e9042611a48565b6008556104ec6001611249565b610763611151565b60055460019074010000000000000000000000000000000000000000900460ff1660028111156107955761079561186f565b8160028111156107a7576107a761186f565b146107f15780600560149054906101000a900460ff166040517fc1432afd0000000000000000000000000000000000000000000000000000000081526004016105bf929190611a5b565b73ffffffffffffffffffffffffffffffffffffffff831660009081526006602052604090205460ff168061083f575060075473ffffffffffffffffffffffffffffffffffffffff8481169116145b15610876576040517fb6309ef800000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b73ffffffffffffffffffffffffffffffffffffffff83166000908152600d602052604090205482151560ff9091161515036108dd576040517f040b673200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b73ffffffffffffffffffffffffffffffffffffffff83166000818152600d602052604080822080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0016861515179055517f90811a8edd3b3c17eeaefffc17f639cc69145d41a359c9843994dc25382036909190a2505050565b61095f611151565b73ffffffffffffffffffffffffffffffffffffffff8116610a02576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201527f646472657373000000000000000000000000000000000000000000000000000060648201526084016105bf565b6104c0816111d2565b505050565b73ffffffffffffffffffffffffffffffffffffffff8316610ab2576040517f08c379a0000000000000000000000000000000000000000000000000000000008152602060048201526024808201527f45524332303a20617070726f76652066726f6d20746865207a65726f2061646460448201527f726573730000000000000000000000000000000000000000000000000000000060648201526084016105bf565b73ffffffffffffffffffffffffffffffffffffffff8216610b55576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602260248201527f45524332303a20617070726f766520746f20746865207a65726f20616464726560448201527f737300000000000000000000000000000000000000000000000000000000000060648201526084016105bf565b73ffffffffffffffffffffffffffffffffffffffff83811660008181526001602090815260408083209487168084529482529182902085905590518481527f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925910160405180910390a3505050565b73ffffffffffffffffffffffffffffffffffffffff8381166000908152600160209081526040808320938616835292905220547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8114610c945781811015610c87576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601d60248201527f45524332303a20696e73756666696369656e7420616c6c6f77616e636500000060448201526064016105bf565b610c948484848403610a10565b50505050565b73ffffffffffffffffffffffffffffffffffffffff8316610d3d576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602560248201527f45524332303a207472616e736665722066726f6d20746865207a65726f20616460448201527f647265737300000000000000000000000000000000000000000000000000000060648201526084016105bf565b73ffffffffffffffffffffffffffffffffffffffff8216610de0576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602360248201527f45524332303a207472616e7366657220746f20746865207a65726f206164647260448201527f657373000000000000000000000000000000000000000000000000000000000060648201526084016105bf565b610deb838383611383565b73ffffffffffffffffffffffffffffffffffffffff831660009081526020819052604090205481811015610ea1576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602660248201527f45524332303a207472616e7366657220616d6f756e742065786365656473206260448201527f616c616e6365000000000000000000000000000000000000000000000000000060648201526084016105bf565b73ffffffffffffffffffffffffffffffffffffffff808516600090815260208190526040808220858503905591851681529081208054849290610ee5908490611a48565b925050819055508273ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef84604051610f4b91815260200190565b60405180910390a3610c94565b73ffffffffffffffffffffffffffffffffffffffff8216610ffb576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602160248201527f45524332303a206275726e2066726f6d20746865207a65726f2061646472657360448201527f730000000000000000000000000000000000000000000000000000000000000060648201526084016105bf565b61100782600083611383565b73ffffffffffffffffffffffffffffffffffffffff8216600090815260208190526040902054818110156110bd576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602260248201527f45524332303a206275726e20616d6f756e7420657863656564732062616c616e60448201527f636500000000000000000000000000000000000000000000000000000000000060648201526084016105bf565b73ffffffffffffffffffffffffffffffffffffffff831660009081526020819052604081208383039055600280548492906110f9908490611a76565b909155505060405182815260009073ffffffffffffffffffffffffffffffffffffffff8516907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef9060200160405180910390a3505050565b60055473ffffffffffffffffffffffffffffffffffffffff1633146104d5576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e657260448201526064016105bf565b6005805473ffffffffffffffffffffffffffffffffffffffff8381167fffffffffffffffffffffffff0000000000000000000000000000000000000000831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a35050565b80600281111561125b5761125b61186f565b60055474010000000000000000000000000000000000000000900460ff16600281111561128a5761128a61186f565b106112e2576005546040517f4456a2360000000000000000000000000000000000000000000000000000000081526105bf9174010000000000000000000000000000000000000000900460ff16908390600401611a5b565b600580548291907fffffffffffffffffffffff00ffffffffffffffffffffffffffffffffffffffff16740100000000000000000000000000000000000000008360028111156113335761133361186f565b02179055507f9fa1c989c9896c15b8b20df912a910ee2dd47559e137d781fb9d32102d442033600560149054906101000a900460ff1682604051611378929190611a5b565b60405180910390a150565b73ffffffffffffffffffffffffffffffffffffffff821615806113d157508173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff16145b156113db57505050565b336000818152600d602052604090205460ff168061141e575073ffffffffffffffffffffffffffffffffffffffff84166000908152600d602052604090205460ff165b8061144e575073ffffffffffffffffffffffffffffffffffffffff83166000908152600d602052604090205460ff165b806114685750326000908152600d602052604090205460ff165b156114cf576040517fa744719900000000000000000000000000000000000000000000000000000000815260206004820152601a60248201527f426c6f636b656420647572696e672066616972206c61756e636800000000000060448201526064016105bf565b600060055474010000000000000000000000000000000000000000900460ff1660028111156115005761150061186f565b036116145773ffffffffffffffffffffffffffffffffffffffff841660009081526006602052604090205460ff16158015611561575073ffffffffffffffffffffffffffffffffffffffff831660009081526006602052604090205460ff16155b8015611582575073ffffffffffffffffffffffffffffffffffffffff841615155b1561160f576040517fa744719900000000000000000000000000000000000000000000000000000000815260206004820152603260248201527f4f6e6c79206578636c7564656420616464726573736573206d6179207472616e60448201527f73666572206174207468697320706f696e74000000000000000000000000000060648201526084016105bf565b611663565b600160055474010000000000000000000000000000000000000000900460ff1660028111156116455761164561186f565b14801561165457506008544210155b15611663576116636002611249565b600061166f85856116bb565b90508083106116b4576040517fb0a32ae100000000000000000000000000000000000000000000000000000000815260048101849052602481018290526044016105bf565b5050505050565b6000600160055474010000000000000000000000000000000000000000900460ff1660028111156116ee576116ee61186f565b11158015611716575060075473ffffffffffffffffffffffffffffffffffffffff8481169116145b8015611748575073ffffffffffffffffffffffffffffffffffffffff831660009081526006602052604090205460ff16155b801561177a575073ffffffffffffffffffffffffffffffffffffffff821660009081526006602052604090205460ff16155b156117885750600b5461043e565b507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff92915050565b600060208083528351808285015260005b818110156117dd578581018301518582016040015282016117c1565b5060006040828601015260407fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0601f8301168501019250505092915050565b803573ffffffffffffffffffffffffffffffffffffffff8116811461184057600080fd5b919050565b6000806040838503121561185857600080fd5b6118618361181c565b946020939093013593505050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602160045260246000fd5b600381106118d5577f4e487b7100000000000000000000000000000000000000000000000000000000600052602160045260246000fd5b9052565b6020810161043e828461189e565b6000806000606084860312156118fc57600080fd5b6119058461181c565b92506119136020850161181c565b9150604084013590509250925092565b60006020828403121561193557600080fd5b5035919050565b60006020828403121561194e57600080fd5b6104638261181c565b6000806040838503121561196a57600080fd5b6119738361181c565b91506020830135801515811461198857600080fd5b809150509250929050565b600080604083850312156119a657600080fd5b6119af8361181c565b91506119bd6020840161181c565b90509250929050565b600181811c908216806119da57607f821691505b602082108103611a13577f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b50919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b8082018082111561043e5761043e611a19565b60408101611a69828561189e565b610463602083018461189e565b8181038181111561043e5761043e611a1956fea2646970667358221220f95b157fc21edaca4430e59d93480d0bb14630f8750f59d9ab9420faf550b9c264736f6c63430008110033

Deployed Bytecode Sourcemap

2001:3584:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;2135:98:2;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;4412:197;;;;;;:::i;:::-;;:::i;:::-;;;1251:14:8;;1244:22;1226:41;;1214:2;1199:18;4412:197:2;1086:187:8;3223:106:2;3310:12;;3223:106;;;1424:25:8;;;1412:2;1397:18;3223:106:2;1278:177:8;5102:96:0;1088:12:7;;;;;;;5102:96:0;;;;;;:::i;5171:286:2:-;;;;;;:::i;:::-;;:::i;3072:91::-;;;3154:2;2624:36:8;;2612:2;2597:18;3072:91:2;2482:184:8;5852:234:2;;;;;;:::i;:::-;;:::i;564:89:3:-;;;;;;:::i;:::-;;:::i;:::-;;3387:125:2;;;;;;:::i;:::-;3487:18;;3461:7;3487:18;;;;;;;;;;;;3387:125;1824:101:6;;;:::i;959:161:3:-;;;;;;:::i;:::-;;:::i;1194:85:6:-;1266:6;;1194:85;;1266:6;;;;3193:74:8;;3181:2;3166:18;1194:85:6;3047:226:8;2346:102:2;;;:::i;6573:427::-;;;;;;:::i;:::-;;:::i;3708:189::-;;;;;;:::i;:::-;;:::i;3197:341:0:-;;;;;;:::i;:::-;;:::i;3622:374::-;;;;;;:::i;:::-;;:::i;3955:149:2:-;;;;;;:::i;:::-;4070:18;;;;4044:7;4070:18;;;:11;:18;;;;;;;;:27;;;;;;;;;;;;;3955:149;4000:102:0;;;;;;:::i;:::-;4077:20;;4058:4;4077:20;;;:11;:20;;;;;;;;;4000:102;2074:198:6;;;;;;:::i;:::-;;:::i;2135:98:2:-;2189:13;2221:5;2214:12;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;2135:98;:::o;4412:197::-;4495:4;719:10:1;4549:32:2;719:10:1;4565:7:2;4574:6;4549:8;:32::i;:::-;4598:4;4591:11;;;4412:197;;;;;:::o;5171:286::-;5298:4;719:10:1;5354:38:2;5370:4;719:10:1;5385:6:2;5354:15;:38::i;:::-;5402:27;5412:4;5418:2;5422:6;5402:9;:27::i;:::-;5446:4;5439:11;;;5171:286;;;;;;:::o;5852:234::-;719:10:1;5940:4:2;4070:18;;;:11;:18;;;;;;;;;:27;;;;;;;;;;5940:4;;719:10:1;5994:64:2;;719:10:1;;4070:27:2;;6019:38;;6047:10;;6019:38;:::i;:::-;5994:8;:64::i;564:89:3:-;619:27;719:10:1;639:6:3;619:5;:27::i;:::-;564:89;:::o;1824:101:6:-;1087:13;:11;:13::i;:::-;1888:30:::1;1915:1;1888:18;:30::i;:::-;1824:101::o:0;959:161:3:-;1035:46;1051:7;719:10:1;1074:6:3;1035:15;:46::i;:::-;1091:22;1097:7;1106:6;1091:5;:22::i;:::-;959:161;;:::o;2346:102:2:-;2402:13;2434:7;2427:14;;;;;:::i;6573:427::-;719:10:1;6666:4:2;4070:18;;;:11;:18;;;;;;;;;:27;;;;;;;;;;6666:4;;719:10:1;6810:15:2;6790:16;:35;;6782:85;;;;;;;4858:2:8;6782:85:2;;;4840:21:8;4897:2;4877:18;;;4870:30;4936:34;4916:18;;;4909:62;5007:7;4987:18;;;4980:35;5032:19;;6782:85:2;;;;;;;;;6901:60;6910:5;6917:7;6945:15;6926:16;:34;6901:8;:60::i;:::-;-1:-1:-1;6989:4:2;;6573:427;-1:-1:-1;;;;6573:427:2:o;3708:189::-;3787:4;719:10:1;3841:28:2;719:10:1;3858:2:2;3862:6;3841:9;:28::i;3197:341:0:-;1087:13:6;:11;:13::i;:::-;578:12:7::1;::::0;3273:19:0::1;::::0;578:12:7;;::::1;;;561:29;::::0;::::1;;;;;;:::i;:::-;:13;:29;;;;;;;;:::i;:::-;;557:182;;661:13;701:12;;;;;;;;;;;613:115;;;;;;;;;;;;:::i;557:182::-;3306:28:0::2;::::0;::::2;3302:92;;3351:36;::::0;::::2;::::0;;5563:2:8;3351:36:0::2;::::0;::::2;5545:21:8::0;5602:2;5582:18;;;5575:30;5641:24;5621:18;;;5614:52;5683:18;;3351:36:0::2;5361:346:8::0;3302:92:0::2;3399:13;:30:::0;;;::::2;;::::0;::::2;;::::0;;3478:19:::2;::::0;3460:37:::2;::::0;:15:::2;:37;:::i;:::-;3435:22;:62:::0;3503:30:::2;3516:16;3503:12;:30::i;3622:374::-:0;1087:13:6;:11;:13::i;:::-;578:12:7::1;::::0;3709:16:0::1;::::0;578:12:7;;::::1;;;561:29;::::0;::::1;;;;;;:::i;:::-;:13;:29;;;;;;;;:::i;:::-;;557:182;;661:13;701:12;;;;;;;;;;;613:115;;;;;;;;;;;;:::i;557:182::-;3739:20:0::2;::::0;::::2;;::::0;;;:11:::2;:20;::::0;;;;;::::2;;::::0;:48:::2;;-1:-1:-1::0;3774:13:0::2;::::0;::::2;3763:24:::0;;::::2;3774:13:::0;::::2;3763:24;3739:48;3735:106;;;3804:30;;;;;;;;;;;;;;3735:106;3851:20;::::0;::::2;;::::0;;;:11:::2;:20;::::0;;;;;:30;::::2;;:20;::::0;;::::2;:30;;::::0;3847:76:::2;;3898:18;;;;;;;;;;;;;;3847:76;3929:20;::::0;::::2;;::::0;;;:11:::2;:20;::::0;;;;;:29;;;::::2;::::0;::::2;;;::::0;;3969:22;::::2;::::0;3929:20;3969:22:::2;1110:1:6::1;3622:374:0::0;;:::o;2074:198:6:-;1087:13;:11;:13::i;:::-;2162:22:::1;::::0;::::1;2154:73;;;::::0;::::1;::::0;;5914:2:8;2154:73:6::1;::::0;::::1;5896:21:8::0;5953:2;5933:18;;;5926:30;5992:34;5972:18;;;5965:62;6063:8;6043:18;;;6036:36;6089:19;;2154:73:6::1;5712:402:8::0;2154:73:6::1;2237:28;2256:8;2237:18;:28::i;11765:121:2:-:0;;;;:::o;10089:370::-;10220:19;;;10212:68;;;;;;;6321:2:8;10212:68:2;;;6303:21:8;6360:2;6340:18;;;6333:30;6399:34;6379:18;;;6372:62;6470:6;6450:18;;;6443:34;6494:19;;10212:68:2;6119:400:8;10212:68:2;10298:21;;;10290:68;;;;;;;6726:2:8;10290:68:2;;;6708:21:8;6765:2;6745:18;;;6738:30;6804:34;6784:18;;;6777:62;6875:4;6855:18;;;6848:32;6897:19;;10290:68:2;6524:398:8;10290:68:2;10369:18;;;;;;;;:11;:18;;;;;;;;:27;;;;;;;;;;;;;:36;;;10420:32;;1424:25:8;;;10420:32:2;;1397:18:8;10420:32:2;;;;;;;10089:370;;;:::o;10740:441::-;4070:18;;;;10870:24;4070:18;;;:11;:18;;;;;;;;:27;;;;;;;;;;10956:17;10936:37;;10932:243;;11017:6;10997:16;:26;;10989:68;;;;;;;7129:2:8;10989:68:2;;;7111:21:8;7168:2;7148:18;;;7141:30;7207:31;7187:18;;;7180:59;7256:18;;10989:68:2;6927:353:8;10989:68:2;11099:51;11108:5;11115:7;11143:6;11124:16;:25;11099:8;:51::i;:::-;10860:321;10740:441;;;:::o;7454:651::-;7580:18;;;7572:68;;;;;;;7487:2:8;7572:68:2;;;7469:21:8;7526:2;7506:18;;;7499:30;7565:34;7545:18;;;7538:62;7636:7;7616:18;;;7609:35;7661:19;;7572:68:2;7285:401:8;7572:68:2;7658:16;;;7650:64;;;;;;;7893:2:8;7650:64:2;;;7875:21:8;7932:2;7912:18;;;7905:30;7971:34;7951:18;;;7944:62;8042:5;8022:18;;;8015:33;8065:19;;7650:64:2;7691:399:8;7650:64:2;7725:38;7746:4;7752:2;7756:6;7725:20;:38::i;:::-;7796:15;;;7774:19;7796:15;;;;;;;;;;;7829:21;;;;7821:72;;;;;;;8297:2:8;7821:72:2;;;8279:21:8;8336:2;8316:18;;;8309:30;8375:34;8355:18;;;8348:62;8446:8;8426:18;;;8419:36;8472:19;;7821:72:2;8095:402:8;7821:72:2;7927:15;;;;:9;:15;;;;;;;;;;;7945:20;;;7927:38;;7985:13;;;;;;;;:23;;7959:6;;7927:9;7985:23;;7959:6;;7985:23;:::i;:::-;;;;;;;;8039:2;8024:26;;8033:4;8024:26;;;8043:6;8024:26;;;;1424:25:8;;1412:2;1397:18;;1278:177;8024:26:2;;;;;;;;8061:37;11765:121;9090:576;9173:21;;;9165:67;;;;;;;8704:2:8;9165:67:2;;;8686:21:8;8743:2;8723:18;;;8716:30;8782:34;8762:18;;;8755:62;8853:3;8833:18;;;8826:31;8874:19;;9165:67:2;8502:397:8;9165:67:2;9243:49;9264:7;9281:1;9285:6;9243:20;:49::i;:::-;9328:18;;;9303:22;9328:18;;;;;;;;;;;9364:24;;;;9356:71;;;;;;;9106:2:8;9356:71:2;;;9088:21:8;9145:2;9125:18;;;9118:30;9184:34;9164:18;;;9157:62;9255:4;9235:18;;;9228:32;9277:19;;9356:71:2;8904:398:8;9356:71:2;9461:18;;;:9;:18;;;;;;;;;;9482:23;;;9461:44;;9525:12;:22;;9499:6;;9461:9;9525:22;;9499:6;;9525:22;:::i;:::-;;;;-1:-1:-1;;9563:37:2;;1424:25:8;;;9589:1:2;;9563:37;;;;;;1412:2:8;1397:18;9563:37:2;;;;;;;11765:121;;;:::o;1352:130:6:-;1266:6;;1415:23;1266:6;719:10:1;1415:23:6;1407:68;;;;;;;9642:2:8;1407:68:6;;;9624:21:8;;;9661:18;;;9654:30;9720:34;9700:18;;;9693:62;9772:18;;1407:68:6;9440:356:8;2426:187:6;2518:6;;;;2534:17;;;;;;;;;;;2566:40;;2518:6;;;2534:17;2518:6;;2566:40;;2499:16;;2566:40;2489:124;2426:187;:::o;1113:292:7:-;1190:8;1174:24;;;;;;;;:::i;:::-;:12;;;;;;;:24;;;;;;;;:::i;:::-;;1170:144;;1280:12;;1258:45;;;;;;;1280:12;;;;;;1294:8;;1258:45;;;:::i;1170:144::-;1323:12;:23;;1338:8;;1323:12;:23;;;1338:8;1323:23;;;;;;;;:::i;:::-;;;;;;1361:37;1375:12;;;;;;;;;;;1389:8;1361:37;;;;;;;:::i;:::-;;;;;;;;1113:292;:::o;4106:992:0:-;4230:16;;;;;:30;;;4258:2;4250:10;;:4;:10;;;4230:30;4226:57;;;4106:992;;;:::o;4226:57::-;719:10:1;4289:15:0;4337:20;;;:11;:20;;;;;;;;;:47;;-1:-1:-1;4367:17:0;;;;;;;:11;:17;;;;;;;;4337:47;:72;;;-1:-1:-1;4394:15:0;;;;;;;:11;:15;;;;;;;;4337:72;:104;;;-1:-1:-1;4431:9:0;4419:22;;;;:11;:22;;;;;;;;4337:104;4326:579;;;4463:47;;;;;10003:2:8;4463:47:0;;;9985:21:8;10042:2;10022:18;;;10015:30;10081:28;10061:18;;;10054:56;10127:18;;4463:47:0;9801:350:8;4326:579:0;4542:19;1088:12:7;;;;;;;4527:34:0;;;;;;;;:::i;:::-;;4523:382;;4576:17;;;;;;;:11;:17;;;;;;;;4575:18;:38;;;;-1:-1:-1;4598:15:0;;;;;;;:11;:15;;;;;;;;4597:16;4575:38;:60;;;;-1:-1:-1;4617:18:0;;;;;4575:60;4571:183;;;4654:91;;;;;10358:2:8;4654:91:0;;;10340:21:8;10397:2;10377:18;;;10370:30;10436:34;10416:18;;;10409:62;10507:20;10487:18;;;10480:48;10545:19;;4654:91:0;10156:414:8;4571:183:0;4523:382;;;4792:16;1088:12:7;;;;;;;4777:31:0;;;;;;;;:::i;:::-;;:82;;;;;4837:22;;4818:15;:41;;4777:82;4766:139;;;4874:24;4887:10;4874:12;:24::i;:::-;4911:21;4935:19;4945:4;4951:2;4935:9;:19::i;:::-;4911:43;;4974:13;4964:6;:23;4960:83;;5004:32;;;;;;;;10749:25:8;;;10790:18;;;10783:34;;;10722:18;;5004:32:0;10575:248:8;4960:83:0;4220:878;;4106:992;;;:::o;5202:273::-;5269:7;5310:16;1088:12:7;;;;;;;5295:31:0;;;;;;;;:::i;:::-;;;:62;;;;-1:-1:-1;5344:13:0;;;5336:21;;;5344:13;;5336:21;5295:62;:90;;;;-1:-1:-1;5368:17:0;;;;;;;:11;:17;;;;;;;;5367:18;5295:90;:116;;;;-1:-1:-1;5396:15:0;;;;;;;:11;:15;;;;;;;;5395:16;5295:116;5284:166;;;-1:-1:-1;5433:10:0;;5426:17;;5284:166;-1:-1:-1;2195:66:0;5202:273;;;;:::o;14:607:8:-;126:4;155:2;184;173:9;166:21;216:6;210:13;259:6;254:2;243:9;239:18;232:34;284:1;294:140;308:6;305:1;302:13;294:140;;;403:14;;;399:23;;393:30;369:17;;;388:2;365:26;358:66;323:10;;294:140;;;298:3;483:1;478:2;469:6;458:9;454:22;450:31;443:42;612:2;542:66;537:2;529:6;525:15;521:88;510:9;506:104;502:113;494:121;;;;14:607;;;;:::o;626:196::-;694:20;;754:42;743:54;;733:65;;723:93;;812:1;809;802:12;723:93;626:196;;;:::o;827:254::-;895:6;903;956:2;944:9;935:7;931:23;927:32;924:52;;;972:1;969;962:12;924:52;995:29;1014:9;995:29;:::i;:::-;985:39;1071:2;1056:18;;;;1043:32;;-1:-1:-1;;;827:254:8:o;1460:184::-;1512:77;1509:1;1502:88;1609:4;1606:1;1599:15;1633:4;1630:1;1623:15;1649:290;1726:1;1719:5;1716:12;1706:200;;1762:77;1759:1;1752:88;1863:4;1860:1;1853:15;1891:4;1888:1;1881:15;1706:200;1915:18;;1649:290::o;1944:200::-;2086:2;2071:18;;2098:40;2075:9;2120:6;2098:40;:::i;2149:328::-;2226:6;2234;2242;2295:2;2283:9;2274:7;2270:23;2266:32;2263:52;;;2311:1;2308;2301:12;2263:52;2334:29;2353:9;2334:29;:::i;:::-;2324:39;;2382:38;2416:2;2405:9;2401:18;2382:38;:::i;:::-;2372:48;;2467:2;2456:9;2452:18;2439:32;2429:42;;2149:328;;;;;:::o;2671:180::-;2730:6;2783:2;2771:9;2762:7;2758:23;2754:32;2751:52;;;2799:1;2796;2789:12;2751:52;-1:-1:-1;2822:23:8;;2671:180;-1:-1:-1;2671:180:8:o;2856:186::-;2915:6;2968:2;2956:9;2947:7;2943:23;2939:32;2936:52;;;2984:1;2981;2974:12;2936:52;3007:29;3026:9;3007:29;:::i;3278:347::-;3343:6;3351;3404:2;3392:9;3383:7;3379:23;3375:32;3372:52;;;3420:1;3417;3410:12;3372:52;3443:29;3462:9;3443:29;:::i;:::-;3433:39;;3522:2;3511:9;3507:18;3494:32;3569:5;3562:13;3555:21;3548:5;3545:32;3535:60;;3591:1;3588;3581:12;3535:60;3614:5;3604:15;;;3278:347;;;;;:::o;3630:260::-;3698:6;3706;3759:2;3747:9;3738:7;3734:23;3730:32;3727:52;;;3775:1;3772;3765:12;3727:52;3798:29;3817:9;3798:29;:::i;:::-;3788:39;;3846:38;3880:2;3869:9;3865:18;3846:38;:::i;:::-;3836:48;;3630:260;;;;;:::o;3895:437::-;3974:1;3970:12;;;;4017;;;4038:61;;4092:4;4084:6;4080:17;4070:27;;4038:61;4145:2;4137:6;4134:14;4114:18;4111:38;4108:218;;4182:77;4179:1;4172:88;4283:4;4280:1;4273:15;4311:4;4308:1;4301:15;4108:218;;3895:437;;;:::o;4337:184::-;4389:77;4386:1;4379:88;4486:4;4483:1;4476:15;4510:4;4507:1;4500:15;4526:125;4591:9;;;4612:10;;;4609:36;;;4625:18;;:::i;5062:294::-;5240:2;5225:18;;5252:40;5229:9;5274:6;5252:40;:::i;:::-;5301:49;5346:2;5335:9;5331:18;5323:6;5301:49;:::i;9307:128::-;9374:9;;;9395:11;;;9392:37;;;9409:18;;:::i

Swarm Source

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