ETH Price: $3,480.93 (+0.93%)
Gas: 5.89 Gwei

Token

BUTCHER (MEAT)
 

Overview

Max Total Supply

1,000,417,232.5 MEAT

Holders

171

Market

Onchain Market Cap

$0.00

Circulating Supply Market Cap

-

Other Info

Token Contract (WITH 18 Decimals)

Balance
1,092 MEAT

Value
$0.00
0x6552d32C1a0563d6bD434C761771341058862f78
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:
Butcher

Compiler Version
v0.8.27+commit.40a35a09

Optimization Enabled:
Yes with 1000 runs

Other Settings:
paris EvmVersion
File 1 of 9 : Butcher.sol
/*
  Will you conquer your hunger or starve to death?
     - Website: https://butcher.money
     - App: https://app.butcher.money
     - Docs: https://docs.butcher.money
     - Telegram: https://t.me/butcher_portal
     - X: https://x.com/butchermoney
*/
pragma solidity ^0.8.0;

import "./interfaces/IERC20.sol";
import "@openzeppelin/contracts/utils/Context.sol";
import "./Observer.sol";
import "./Operator.sol";
import "./interfaces/IEntityManager.sol";
import "./interfaces/IUniswapV2Router.sol";

contract Butcher is Context, IERC20, Operator {
  mapping(address => uint256) private _balances;

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

  uint256 private _totalSupply;

  string private _name;
  string private _symbol;

  bool private swapping;
  bool private swappingEnabled;
  uint256 private swapTokensAtAmount;
  mapping(address => bool) private excludedFromFees;
  event SwapBackSuccess(
    uint256 tokenAmount,
    uint256 ethAmountReceived,
    bool success
  );

  // Fees (in percentage)
  uint256 private chickenSellFee;
  uint256 private cowSellFee;
  uint256 private mooDengSellFee;

  uint256 private buyFee;
  uint256 private sellFee;
  address private MARKETING_WALLET_ADDRESS;
  address private DEV_WALLET_ADDRESS;

  bool public launchMode;
  uint256 launchBlock;

  // DEX Router address
  IUniswapV2Router02 public router;

  // Toggle observer
  bool public toggleObserver;

  // Toggle trading
  bool private canTrade;

  // wallet observer
  Observer public observer;

  // Entity manager
  IEntityManager public _manager;

  receive() external payable {}

  /**
   * @dev Sets the values for {name} and {symbol}.
   *
   * All two of these values are immutable: they can only be set once during
   * construction.
   */
  constructor(
    string memory name_,
    string memory symbol_,
    address router_,
    uint256 _buyFee,
    uint256 _sellFee,
    uint256 _mooDengSellFee,
    uint256 _chickenSellFee,
    uint256 _cowSellFee,
    address _marketingWallet,
    address _devWallet
  ) {
    _name = name_;
    _symbol = symbol_;
    router = IUniswapV2Router02(router_);
    _operators[msg.sender] = true;
    buyFee = _buyFee;
    sellFee = _sellFee;
    MARKETING_WALLET_ADDRESS = _marketingWallet;
    DEV_WALLET_ADDRESS = _devWallet;
    mooDengSellFee = _mooDengSellFee;
    chickenSellFee = _chickenSellFee;
    cowSellFee = _cowSellFee;
    toggleObserver = false;
    canTrade = false;
    launchMode = true;
    swapTokensAtAmount = 2100000000000000000000;
    _mint(msg.sender, 420000000000000000000000);
    _approve(address(this), router_, type(uint256).max);
  }

  function burn(uint256 amount) external {
    _burn(msg.sender, amount);
  }

  // Set DEX Router address
  function setRouter(address _router) external onlyOperator {
    router = IUniswapV2Router02(_router);
  }

  function setObserverEnabled(bool _value) external onlyOperator {
    toggleObserver = _value;
  }

  // Set fee wallet
  function setWallets(
    address _marketingWallet,
    address _devWallet
  ) external onlyOperator {
    MARKETING_WALLET_ADDRESS = _marketingWallet;
    DEV_WALLET_ADDRESS = _devWallet;
  }

  function setCanTrade(bool _value) external onlyOperator {
    canTrade = _value;
    launchBlock = block.number;
    swappingEnabled = true;
  }

  function setExcludedFromFees(
    address _address,
    bool _value
  ) external onlyOperator {
    excludedFromFees[_address] = _value;
  }

  function setRates(uint buyTax, uint sellTax) external onlyOperator {
    require(buyTax <= 5, "Butcher: Buy tax must be less than 5");
    require(sellTax <= 15, "Butcher: Sell tax must be less than 15");
    buyFee = buyTax;
    sellFee = sellTax;
  }

  function getBuyFee() external view returns (uint256) {
    return buyFee;
  }

  function getSellFee() external view returns (uint256) {
    return sellFee;
  }

  function setSwapTokensAtAmount(uint256 _value) external onlyOperator {
    swapTokensAtAmount = _value;
  }

  function setSwappingEnabled(bool _value) external onlyOperator {
    swappingEnabled = _value;
  }

  function rescueTokens(address _token, address _to) external onlyOperator {
    IERC20(_token).transfer(_to, IERC20(_token).balanceOf(address(this)));
  }

  function rescueETH(address _to) external onlyOperator {
    payable(_to).transfer(address(this).balance);
  }

  function setLaunchMode(bool _value) external onlyOperator {
    launchMode = _value;
  }

  // Set entity manager
  function setEntityManager(address _managerAddress) external onlyOperator {
    _manager = IEntityManager(_managerAddress);
  }

  // Set observer
  function setObserver(address _observer) external onlyOperator {
    observer = Observer(_observer);
  }

  // Mint rewards
  function mint(address _to, uint256 _amount) external onlyOperator {
    _mint(_to, _amount);
  }

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

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

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

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

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

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

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

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

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

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

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

    return true;
  }

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

    uint256 fromBalance = _balances[from];
    require(fromBalance >= amount, "ERC20: transfer amount exceeds balance");
    if (
      !_operators[from] &&
      !_operators[to] &&
      to != address(this) &&
      from != address(this)
    ) {
      require(canTrade, "Butcher: Trading is disabled");
      _beforeTokenTransfer(from, to, amount);
      if (toggleObserver) {
        require(
          observer.beforeTokenTransfer(msg.sender, from, to, amount),
          "WalletObserver: Rate limit"
        );
      }
      if (launchMode && buyFee > 5 && sellFee >= 15) {
        uint256 steps = (block.number - launchBlock) / 5;
        if (steps > 0) {
          buyFee -= 5;
          if (sellFee > 15) {
            sellFee -= 5;
          }
        }
        launchBlock = block.number;
      }
      if (
        swappingEnabled && //if this is true
        !swapping && //if this is false
        !observer.isLpToken(from) && //if this is false
        !excludedFromFees[from] && //if this is false
        !excludedFromFees[to] //if this is false
      ) {
        swapping = true;
        swapBack();
        swapping = false;
      }
      bool takeFee = !swapping;

      // if any account belongs to _isExcludedFromFee account then remove the fee
      if (excludedFromFees[from] || excludedFromFees[to]) {
        takeFee = false;
      }
      if (takeFee) {
        // Sell, fee applied
        if (observer.isLpToken(to)) {
          uint256 feeAmount = (amount / 100) * sellFee;
          if (!launchMode) {
            if (_manager.isChickenOwner(from)) {
              feeAmount = (amount / 100) * chickenSellFee;
            } else if (_manager.isCowOwner(from)) {
              feeAmount = (amount / 100) * cowSellFee;
            } else if (_manager.isMooDengOwner(from)) {
              feeAmount = (amount / 100) * mooDengSellFee;
            }
          }
          if (feeAmount > 0) {
            unchecked {
              _balances[from] = fromBalance - amount;
              _balances[address(this)] += feeAmount;
              emit Transfer(from, address(this), feeAmount);
              _balances[to] += amount - feeAmount;
              emit Transfer(from, to, amount - feeAmount);
            }
          } else {
            unchecked {
              _balances[from] = fromBalance - amount;
              _balances[to] += amount;
              emit Transfer(from, to, amount);
            }
          }
        }
        // // Buy, fee applied
        else if (observer.isLpToken(from)) {
          uint256 feeAmount = (amount / 100) * buyFee;
          if (feeAmount > 0) {
            unchecked {
              _balances[from] = fromBalance - amount;
              _balances[address(this)] += feeAmount;
              emit Transfer(from, address(this), feeAmount);
              _balances[to] += amount - feeAmount;
              emit Transfer(from, to, amount - feeAmount);
            }
          } else {
            unchecked {
              _balances[from] = fromBalance - amount;
              _balances[to] += amount;
              emit Transfer(from, to, amount);
            }
          }
        }
        // Classic transfer, no fees.
        else {
          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;
          }
        }
      }
    } else {
      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);
  }

  function swapTokensForEth(uint256 tokenAmount) private {
    // generate the uniswap pair path of token -> weth
    address[] memory path = new address[](2);
    path[0] = address(this);
    path[1] = router.WETH();
    _approve(address(this), address(router), tokenAmount);
    // make the swap
    router.swapExactTokensForETHSupportingFeeOnTransferTokens(
      tokenAmount,
      0, // accept any amount of ETH
      path,
      address(this),
      block.timestamp
    );
  }

  function swapBack() private {
    bool success;
    if (balanceOf(address(this)) == 0) {
      return;
    }
    if (balanceOf(address(this)) >= swapTokensAtAmount) {
      uint256 amountToSwapForETH = swapTokensAtAmount;
      swapTokensForEth(amountToSwapForETH);
      uint256 amountEthToSend = address(this).balance;
      (success, ) = address(MARKETING_WALLET_ADDRESS).call{
        value: amountEthToSend / 2
      }("");
      (success, ) = address(DEV_WALLET_ADDRESS).call{
        value: amountEthToSend / 2
      }("");
      emit SwapBackSuccess(amountToSwapForETH, amountEthToSend, success);
    }
  }

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

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

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

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

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

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

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

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

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

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

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

  /**
   * @dev Updates `owner` s allowance for `spender` based on spent `amount`.
   *
   * Does not update the allowance amount in case of infinite allowance.
   * Revert if not enough allowance is available.
   *
   * Might emit an {Approval} event.
   */
  function _spendAllowance(
    address owner,
    address spender,
    uint256 amount
  ) internal virtual {
    uint256 currentAllowance = allowance(owner, spender);
    if (currentAllowance != type(uint256).max) {
      if (spender != address(_manager)) {
        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 2 of 9 : Initializable.sol
// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts (last updated v5.0.0) (proxy/utils/Initializable.sol)

pragma solidity ^0.8.20;

/**
 * @dev This is a base contract to aid in writing upgradeable contracts, or any kind of contract that will be deployed
 * behind a proxy. Since proxied contracts do not make use of a constructor, it's common to move constructor logic to an
 * external initializer function, usually called `initialize`. It then becomes necessary to protect this initializer
 * function so it can only be called once. The {initializer} modifier provided by this contract will have this effect.
 *
 * The initialization functions use a version number. Once a version number is used, it is consumed and cannot be
 * reused. This mechanism prevents re-execution of each "step" but allows the creation of new initialization steps in
 * case an upgrade adds a module that needs to be initialized.
 *
 * For example:
 *
 * [.hljs-theme-light.nopadding]
 * ```solidity
 * contract MyToken is ERC20Upgradeable {
 *     function initialize() initializer public {
 *         __ERC20_init("MyToken", "MTK");
 *     }
 * }
 *
 * contract MyTokenV2 is MyToken, ERC20PermitUpgradeable {
 *     function initializeV2() reinitializer(2) public {
 *         __ERC20Permit_init("MyToken");
 *     }
 * }
 * ```
 *
 * TIP: To avoid leaving the proxy in an uninitialized state, the initializer function should be called as early as
 * possible by providing the encoded function call as the `_data` argument to {ERC1967Proxy-constructor}.
 *
 * CAUTION: When used with inheritance, manual care must be taken to not invoke a parent initializer twice, or to ensure
 * that all initializers are idempotent. This is not verified automatically as constructors are by Solidity.
 *
 * [CAUTION]
 * ====
 * Avoid leaving a contract uninitialized.
 *
 * An uninitialized contract can be taken over by an attacker. This applies to both a proxy and its implementation
 * contract, which may impact the proxy. To prevent the implementation contract from being used, you should invoke
 * the {_disableInitializers} function in the constructor to automatically lock it when it is deployed:
 *
 * [.hljs-theme-light.nopadding]
 * ```
 * /// @custom:oz-upgrades-unsafe-allow constructor
 * constructor() {
 *     _disableInitializers();
 * }
 * ```
 * ====
 */
abstract contract Initializable {
    /**
     * @dev Storage of the initializable contract.
     *
     * It's implemented on a custom ERC-7201 namespace to reduce the risk of storage collisions
     * when using with upgradeable contracts.
     *
     * @custom:storage-location erc7201:openzeppelin.storage.Initializable
     */
    struct InitializableStorage {
        /**
         * @dev Indicates that the contract has been initialized.
         */
        uint64 _initialized;
        /**
         * @dev Indicates that the contract is in the process of being initialized.
         */
        bool _initializing;
    }

    // keccak256(abi.encode(uint256(keccak256("openzeppelin.storage.Initializable")) - 1)) & ~bytes32(uint256(0xff))
    bytes32 private constant INITIALIZABLE_STORAGE = 0xf0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a00;

    /**
     * @dev The contract is already initialized.
     */
    error InvalidInitialization();

    /**
     * @dev The contract is not initializing.
     */
    error NotInitializing();

    /**
     * @dev Triggered when the contract has been initialized or reinitialized.
     */
    event Initialized(uint64 version);

    /**
     * @dev A modifier that defines a protected initializer function that can be invoked at most once. In its scope,
     * `onlyInitializing` functions can be used to initialize parent contracts.
     *
     * Similar to `reinitializer(1)`, except that in the context of a constructor an `initializer` may be invoked any
     * number of times. This behavior in the constructor can be useful during testing and is not expected to be used in
     * production.
     *
     * Emits an {Initialized} event.
     */
    modifier initializer() {
        // solhint-disable-next-line var-name-mixedcase
        InitializableStorage storage $ = _getInitializableStorage();

        // Cache values to avoid duplicated sloads
        bool isTopLevelCall = !$._initializing;
        uint64 initialized = $._initialized;

        // Allowed calls:
        // - initialSetup: the contract is not in the initializing state and no previous version was
        //                 initialized
        // - construction: the contract is initialized at version 1 (no reininitialization) and the
        //                 current contract is just being deployed
        bool initialSetup = initialized == 0 && isTopLevelCall;
        bool construction = initialized == 1 && address(this).code.length == 0;

        if (!initialSetup && !construction) {
            revert InvalidInitialization();
        }
        $._initialized = 1;
        if (isTopLevelCall) {
            $._initializing = true;
        }
        _;
        if (isTopLevelCall) {
            $._initializing = false;
            emit Initialized(1);
        }
    }

    /**
     * @dev A modifier that defines a protected reinitializer function that can be invoked at most once, and only if the
     * contract hasn't been initialized to a greater version before. In its scope, `onlyInitializing` functions can be
     * used to initialize parent contracts.
     *
     * A reinitializer may be used after the original initialization step. This is essential to configure modules that
     * are added through upgrades and that require initialization.
     *
     * When `version` is 1, this modifier is similar to `initializer`, except that functions marked with `reinitializer`
     * cannot be nested. If one is invoked in the context of another, execution will revert.
     *
     * Note that versions can jump in increments greater than 1; this implies that if multiple reinitializers coexist in
     * a contract, executing them in the right order is up to the developer or operator.
     *
     * WARNING: Setting the version to 2**64 - 1 will prevent any future reinitialization.
     *
     * Emits an {Initialized} event.
     */
    modifier reinitializer(uint64 version) {
        // solhint-disable-next-line var-name-mixedcase
        InitializableStorage storage $ = _getInitializableStorage();

        if ($._initializing || $._initialized >= version) {
            revert InvalidInitialization();
        }
        $._initialized = version;
        $._initializing = true;
        _;
        $._initializing = false;
        emit Initialized(version);
    }

    /**
     * @dev Modifier to protect an initialization function so that it can only be invoked by functions with the
     * {initializer} and {reinitializer} modifiers, directly or indirectly.
     */
    modifier onlyInitializing() {
        _checkInitializing();
        _;
    }

    /**
     * @dev Reverts if the contract is not in an initializing state. See {onlyInitializing}.
     */
    function _checkInitializing() internal view virtual {
        if (!_isInitializing()) {
            revert NotInitializing();
        }
    }

    /**
     * @dev Locks the contract, preventing any future reinitialization. This cannot be part of an initializer call.
     * Calling this in the constructor of a contract will prevent that contract from being initialized or reinitialized
     * to any version. It is recommended to use this to lock implementation contracts that are designed to be called
     * through proxies.
     *
     * Emits an {Initialized} event the first time it is successfully executed.
     */
    function _disableInitializers() internal virtual {
        // solhint-disable-next-line var-name-mixedcase
        InitializableStorage storage $ = _getInitializableStorage();

        if ($._initializing) {
            revert InvalidInitialization();
        }
        if ($._initialized != type(uint64).max) {
            $._initialized = type(uint64).max;
            emit Initialized(type(uint64).max);
        }
    }

    /**
     * @dev Returns the highest version that has been initialized. See {reinitializer}.
     */
    function _getInitializedVersion() internal view returns (uint64) {
        return _getInitializableStorage()._initialized;
    }

    /**
     * @dev Returns `true` if the contract is currently initializing. See {onlyInitializing}.
     */
    function _isInitializing() internal view returns (bool) {
        return _getInitializableStorage()._initializing;
    }

    /**
     * @dev Returns a pointer to the storage namespace.
     */
    // solhint-disable-next-line var-name-mixedcase
    function _getInitializableStorage() private pure returns (InitializableStorage storage $) {
        assembly {
            $.slot := INITIALIZABLE_STORAGE
        }
    }
}

File 3 of 9 : Context.sol
// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts (last updated v5.0.1) (utils/Context.sol)

pragma solidity ^0.8.20;

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

    function _contextSuffixLength() internal view virtual returns (uint256) {
        return 0;
    }
}

File 4 of 9 : IEntityManager.sol
interface IEntityManager {
  function approve(address to, uint256 tokenId) external;

  function balanceOf(address owner) external view returns (uint256);

  function calculateRewards(uint256 _entityId) external view returns (uint256);

  function createEntity(
    uint256 _type,
    string memory _entityName,
    address _referrer
  ) external;

  function decrement(uint256 value) external view returns (uint256);

  function getApproved(uint256 tokenId) external view returns (address);

  function getDailyReward(uint256 _entityId) external view returns (uint256);

  function getEntityIdsOf(
    address account
  ) external view returns (uint256[] memory);

  function getEntityInfo(
    uint256 _entityId
  ) external view returns (string memory, uint256, bool);

  function getEntityName(
    uint256 _entityId
  ) external view returns (string memory);

  function getEntityTypeName(
    uint256 _entityId
  ) external view returns (string memory);

  function getPercentageOf(
    uint256 value,
    uint256 percentage
  ) external view returns (uint256);

  function getTypeImageURI(
    uint256 _entityId
  ) external view returns (string memory);

  function increment(uint256 value) external view returns (uint256);

  function initialize(
    address butcher,
    address rwPool,
    address treasuryWallet
  ) external;

  function int2str(
    uint256 _i
  ) external view returns (string memory _uintAsString);

  function isApprovedForAll(
    address owner,
    address operator
  ) external view returns (bool);

  function isChickenOwner(address _user) external view returns (bool);

  function isCowOwner(address _user) external view returns (bool);

  function isEntityValid(uint256 _entityId) external view returns (bool);

  function isMooDengOwner(address _user) external view returns (bool);

  function name() external view returns (string memory);

  function ownerOf(uint256 tokenId) external view returns (address);

  function printAttributes(
    uint256 _entityId
  ) external view returns (string memory);

  function safeTransferFrom(address from, address to, uint256 tokenId) external;

  function safeTransferFrom(
    address from,
    address to,
    uint256 tokenId,
    bytes memory data
  ) external;

  function setApprovalForAll(address operator, bool approved) external;

  function setEntityType(
    uint256 _type,
    uint256 _price,
    uint256 _rewardPerSecond,
    uint256 _epochTime,
    uint256 _incubationTime,
    string memory _name,
    string memory _imageURI
  ) external;

  function setOperator(address user, bool value) external;

  function setWallets(address treasury, address rewardPool) external;

  function slaughter(uint256 _entityId) external;

  function supportsInterface(bytes4 interfaceId) external view returns (bool);

  function symbol() external view returns (string memory);

  function tokenByIndex(uint256 index) external view returns (uint256);

  function tokenOfOwnerByIndex(
    address owner,
    uint256 index
  ) external view returns (uint256);

  function tokenURI(uint256 tokenId) external view returns (string memory);

  function totalSupply() external view returns (uint256);

  function transferFrom(address from, address to, uint256 tokenId) external;
}

File 5 of 9 : IERC20.sol
pragma solidity >=0.5.0;

interface IERC20 {
  event Approval(address indexed owner, address indexed spender, uint value);
  event Transfer(address indexed from, address indexed to, uint value);

  function name() external view returns (string memory);

  function symbol() external view returns (string memory);

  function decimals() external view returns (uint8);

  function totalSupply() external view returns (uint);

  function balanceOf(address owner) external view returns (uint);

  function allowance(
    address owner,
    address spender
  ) external view returns (uint);

  function approve(address spender, uint value) external returns (bool);

  function transfer(address to, uint value) external returns (bool);

  function transferFrom(
    address from,
    address to,
    uint value
  ) external returns (bool);
}

File 6 of 9 : IUniswapV2Pair.sol
pragma solidity >=0.5.0;

interface IUniswapV2Pair {
  event Approval(address indexed owner, address indexed spender, uint value);
  event Transfer(address indexed from, address indexed to, uint value);

  function name() external pure returns (string memory);

  function symbol() external pure returns (string memory);

  function decimals() external pure returns (uint8);

  function totalSupply() external view returns (uint);

  function balanceOf(address owner) external view returns (uint);

  function allowance(
    address owner,
    address spender
  ) external view returns (uint);

  function approve(address spender, uint value) external returns (bool);

  function transfer(address to, uint value) external returns (bool);

  function transferFrom(
    address from,
    address to,
    uint value
  ) external returns (bool);

  function DOMAIN_SEPARATOR() external view returns (bytes32);

  function PERMIT_TYPEHASH() external pure returns (bytes32);

  function nonces(address owner) external view returns (uint);

  function permit(
    address owner,
    address spender,
    uint value,
    uint deadline,
    uint8 v,
    bytes32 r,
    bytes32 s
  ) external;

  event Mint(address indexed sender, uint amount0, uint amount1);
  event Burn(
    address indexed sender,
    uint amount0,
    uint amount1,
    address indexed to
  );
  event Swap(
    address indexed sender,
    uint amount0In,
    uint amount1In,
    uint amount0Out,
    uint amount1Out,
    address indexed to
  );
  event Sync(uint112 reserve0, uint112 reserve1);

  function MINIMUM_LIQUIDITY() external pure returns (uint);

  function factory() external view returns (address);

  function token0() external view returns (address);

  function token1() external view returns (address);

  function getReserves()
    external
    view
    returns (uint112 reserve0, uint112 reserve1, uint32 blockTimestampLast);

  function price0CumulativeLast() external view returns (uint);

  function price1CumulativeLast() external view returns (uint);

  function kLast() external view returns (uint);

  function mint(address to) external returns (uint liquidity);

  function burn(address to) external returns (uint amount0, uint amount1);

  function swap(
    uint amount0Out,
    uint amount1Out,
    address to,
    bytes calldata data
  ) external;

  function skim(address to) external;

  function sync() external;

  function initialize(address, address) external;
}

File 7 of 9 : IUniswapV2Router.sol
pragma solidity >=0.6.2;

interface IUniswapV2Router01 {
  function factory() external pure returns (address);

  function WETH() external pure returns (address);

  function addLiquidity(
    address tokenA,
    address tokenB,
    uint amountADesired,
    uint amountBDesired,
    uint amountAMin,
    uint amountBMin,
    address to,
    uint deadline
  ) external returns (uint amountA, uint amountB, uint liquidity);

  function addLiquidityETH(
    address token,
    uint amountTokenDesired,
    uint amountTokenMin,
    uint amountETHMin,
    address to,
    uint deadline
  ) external payable returns (uint amountToken, uint amountETH, uint liquidity);

  function removeLiquidity(
    address tokenA,
    address tokenB,
    uint liquidity,
    uint amountAMin,
    uint amountBMin,
    address to,
    uint deadline
  ) external returns (uint amountA, uint amountB);

  function removeLiquidityETH(
    address token,
    uint liquidity,
    uint amountTokenMin,
    uint amountETHMin,
    address to,
    uint deadline
  ) external returns (uint amountToken, uint amountETH);

  function removeLiquidityWithPermit(
    address tokenA,
    address tokenB,
    uint liquidity,
    uint amountAMin,
    uint amountBMin,
    address to,
    uint deadline,
    bool approveMax,
    uint8 v,
    bytes32 r,
    bytes32 s
  ) external returns (uint amountA, uint amountB);

  function removeLiquidityETHWithPermit(
    address token,
    uint liquidity,
    uint amountTokenMin,
    uint amountETHMin,
    address to,
    uint deadline,
    bool approveMax,
    uint8 v,
    bytes32 r,
    bytes32 s
  ) external returns (uint amountToken, uint amountETH);

  function swapExactTokensForTokens(
    uint amountIn,
    uint amountOutMin,
    address[] calldata path,
    address to,
    uint deadline
  ) external returns (uint[] memory amounts);

  function swapTokensForExactTokens(
    uint amountOut,
    uint amountInMax,
    address[] calldata path,
    address to,
    uint deadline
  ) external returns (uint[] memory amounts);

  function swapExactETHForTokens(
    uint amountOutMin,
    address[] calldata path,
    address to,
    uint deadline
  ) external payable returns (uint[] memory amounts);

  function swapTokensForExactETH(
    uint amountOut,
    uint amountInMax,
    address[] calldata path,
    address to,
    uint deadline
  ) external returns (uint[] memory amounts);

  function swapExactTokensForETH(
    uint amountIn,
    uint amountOutMin,
    address[] calldata path,
    address to,
    uint deadline
  ) external returns (uint[] memory amounts);

  function swapETHForExactTokens(
    uint amountOut,
    address[] calldata path,
    address to,
    uint deadline
  ) external payable returns (uint[] memory amounts);

  function quote(
    uint amountA,
    uint reserveA,
    uint reserveB
  ) external pure returns (uint amountB);

  function getAmountOut(
    uint amountIn,
    uint reserveIn,
    uint reserveOut
  ) external pure returns (uint amountOut);

  function getAmountIn(
    uint amountOut,
    uint reserveIn,
    uint reserveOut
  ) external pure returns (uint amountIn);

  function getAmountsOut(
    uint amountIn,
    address[] calldata path
  ) external view returns (uint[] memory amounts);

  function getAmountsIn(
    uint amountOut,
    address[] calldata path
  ) external view returns (uint[] memory amounts);

  function removeLiquidityETHSupportingFeeOnTransferTokens(
    address token,
    uint liquidity,
    uint amountTokenMin,
    uint amountETHMin,
    address to,
    uint deadline
  ) external returns (uint amountETH);

  function removeLiquidityETHWithPermitSupportingFeeOnTransferTokens(
    address token,
    uint liquidity,
    uint amountTokenMin,
    uint amountETHMin,
    address to,
    uint deadline,
    bool approveMax,
    uint8 v,
    bytes32 r,
    bytes32 s
  ) external returns (uint amountETH);

  function swapExactTokensForTokensSupportingFeeOnTransferTokens(
    uint amountIn,
    uint amountOutMin,
    address[] calldata path,
    address to,
    uint deadline
  ) external;

  function swapExactETHForTokensSupportingFeeOnTransferTokens(
    uint amountOutMin,
    address[] calldata path,
    address to,
    uint deadline
  ) external payable;

  function swapExactTokensForETHSupportingFeeOnTransferTokens(
    uint amountIn,
    uint amountOutMin,
    address[] calldata path,
    address to,
    uint deadline
  ) external;
}

interface IUniswapV2Router02 is IUniswapV2Router01 {
  function removeLiquidityETHSupportingFeeOnTransferTokens(
    address token,
    uint liquidity,
    uint amountTokenMin,
    uint amountETHMin,
    address to,
    uint deadline
  ) external returns (uint amountETH);

  function removeLiquidityETHWithPermitSupportingFeeOnTransferTokens(
    address token,
    uint liquidity,
    uint amountTokenMin,
    uint amountETHMin,
    address to,
    uint deadline,
    bool approveMax,
    uint8 v,
    bytes32 r,
    bytes32 s
  ) external returns (uint amountETH);

  function swapExactTokensForTokensSupportingFeeOnTransferTokens(
    uint amountIn,
    uint amountOutMin,
    address[] calldata path,
    address to,
    uint deadline
  ) external;

  function swapExactETHForTokensSupportingFeeOnTransferTokens(
    uint amountOutMin,
    address[] calldata path,
    address to,
    uint deadline
  ) external payable;

  function swapExactTokensForETHSupportingFeeOnTransferTokens(
    uint amountIn,
    uint amountOutMin,
    address[] calldata path,
    address to,
    uint deadline
  ) external;
}

File 8 of 9 : Observer.sol
/*
  Will you conquer your hunger or starve to death?
     - Website: butcher.money
     - App: app.butcher.money
     - Docs: docs.butcher.money
     - Telegram: t.me/butcher_portal
     - X: x.com/butchermoney
*/

pragma solidity ^0.8.0;

import "./interfaces/IUniswapV2Pair.sol";
import "./interfaces/IERC20.sol";
import "@openzeppelin/contracts-upgradeable/proxy/utils/Initializable.sol";

import "./Operator.sol";

contract Observer is Initializable {
  mapping(uint256 => mapping(address => int256)) public _inTokens;
  mapping(uint256 => mapping(address => uint256)) public _outTokens;
  mapping(address => bool) public _isDenied;
  mapping(address => bool) public _isExcludedFromObserver;

  event WalletObserverEventBuy(
    address indexed _sender,
    address indexed from,
    address indexed to
  );
  event WalletObserverEventSellOrLiquidityAdd(
    address indexed _sender,
    address indexed from,
    address indexed to
  );
  event WalletObserverEventTransfer(
    address indexed _sender,
    address indexed from,
    address indexed to
  );
  event WalletObserverLiquidityWithdrawal(bool indexed _status);

  mapping(address => bool) internal _operators;

  modifier onlyOperator() {
    require(_operators[msg.sender] == true, "Not operator");
    _;
  }

  function setOperator(address _user, bool _value) external onlyOperator {
    _operators[_user] = _value;
  }

  modifier onlyToken() {
    require(msg.sender == address(butcherToken), "WalletObserver: Only token");
    _;
  }

  // Current time window
  uint256 private timeframeCurrent;

  IERC20 public butcherToken;
  address[] public lpTokens;
  uint public totalLp;
  address public router;
  address private marketingWallet;
  address private devWallet;

  function changeLp(address _lp, uint index) public onlyOperator {
    if (totalLp == 0 || index > totalLp) {
      lpTokens.push(_lp);
      totalLp++;
    } else lpTokens[index] = _lp;
  }

  function getRegisteredLp(uint index) public view returns (address) {
    return lpTokens[index];
  }

  function isLpToken(address _lp) public view returns (bool) {
    for (uint i = 0; i < lpTokens.length; i++) {
      if (lpTokens[i] == _lp) {
        return true;
      }
    }
    return false;
  }

  function isRouter(address to) public view returns (bool) {
    return router == to;
  }

  function isFeeReceiver(address account) public view returns (bool) {
    return marketingWallet == account || devWallet == account;
  }

  uint256 private maxTokenPerWallet;

  // The TIMEFRAME in seconds
  uint256 private timeframeExpiresAfter;

  // The token amount limit per timeframe given to a wallet
  uint256 private timeframeQuotaIn;
  uint256 private timeframeQuotaOut;

  bool private _decode_771274418637067024507;

  // Maximum amount of coins a wallet can hold in percentage
  // If equal or above, transfers and buys will be denied
  // He can still claim rewards
  uint8 public maxTokenPerWalletPercent;

  mapping(address => uint256) public _lastBuyOf;
  mapping(address => uint256) public _lastSellOf;

  function initialize(
    address token,
    address _router,
    address _marketingWallet,
    address _devWallet,
    uint maxIn,
    uint maxOut,
    uint8 maxWallet
  ) public initializer {
    // __Ownable_init();
    _decode_771274418637067024507 = false;
    _operators[msg.sender] = true;

    // By default set every day
    setTimeframeExpiresAfter(4 hours);

    butcherToken = IERC20(token);
    router = _router;
    marketingWallet = _marketingWallet;
    devWallet = _devWallet;

    // Timeframe buys / transfers to 0.2% of the supply per wallet
    setTimeframeQuotaIn((butcherToken.totalSupply() * maxIn) / 1000);
    setTimeframeQuotaOut((butcherToken.totalSupply() * maxOut) / 1000);

    // Limit token to 2% of the supply per wallet (we don't count rewards)
    setMaxTokenPerWalletPercent(maxWallet);

    excludeFromObserver(msg.sender, true);
  }

  modifier checkTimeframe() {
    uint256 _currentTime = block.timestamp;
    if (_currentTime > timeframeCurrent + timeframeExpiresAfter) {
      timeframeCurrent = _currentTime;
    }
    _;
  }

  modifier isNotDenied(
    address _sender,
    address from,
    address to,
    address txOrigin
  ) {
    // Allow owner to receive tokens from denied addresses
    // Useful in case of refunds
    if (!_operators[txOrigin] && !_operators[to]) {
      require(
        !_isDenied[_sender] &&
          !_isDenied[from] &&
          !_isDenied[to] &&
          !_isDenied[txOrigin],
        "WalletObserverUpgradeable: Denied address"
      );
    }
    _;
  }

  // Temporary
  function isPair(address _sender, address from) internal view returns (bool) {
    return isLpToken(_sender) && isLpToken(from);
  }

  function beforeTokenTransfer(
    address _sender,
    address from,
    address to,
    uint256 amount
  )
    external
    onlyToken
    checkTimeframe
    isNotDenied(_sender, from, to, tx.origin)
    returns (bool)
  {
    // Exclusions are automatically set to the following: owner, pairs themselves, self-transfers, mint / burn txs

    // Do not observe self-transfers
    if (from == to) {
      return true;
    }

    // Do not observe mint / burn
    if (from == address(0) || to == address(0)) {
      return true;
    }

    // Prevent inter-LP transfers
    if (isPair(from, from) && isPair(to, to)) {
      revert(
        "WalletObserverUpgradeable: Cannot directly transfer from one LP to another"
      );
    }

    bool isBuy = false;
    bool isSellOrLiquidityAdd = false;

    if (isPair(_sender, from)) {
      isBuy = true;
      if (!isExcludedFromObserver(to)) {
        _inTokens[timeframeCurrent][to] += int256(amount);
      }
      emit WalletObserverEventBuy(_sender, from, to);
    } else if (isRouter(_sender) && isPair(to, to)) {
      isSellOrLiquidityAdd = true;

      _outTokens[timeframeCurrent][from] += uint256(amount);
      emit WalletObserverEventSellOrLiquidityAdd(_sender, from, to);
    } else {
      if (!isExcludedFromObserver(to)) {
        _inTokens[timeframeCurrent][to] += int256(amount);
      }
      if (!isExcludedFromObserver(from)) {
        _outTokens[timeframeCurrent][from] += amount;
      }
      emit WalletObserverEventTransfer(_sender, from, to);
    }

    // Have a minimum per buy / sell
    //if (isBuy || isSellOrLiquidityAdd) {
    //}
    if (!isExcludedFromObserver(to)) {
      // Revert if the receiving wallet exceed the maximum a wallet can hold
      require(
        getMaxTokenPerWallet() >= butcherToken.balanceOf(to) + amount,
        "WalletObserverUpgradeable: Cannot transfer to this wallet, it would exceed the limit per wallet. [balanceOf > maxTokenPerWallet]"
      );
      int256 remainingTransfersIn = getRemainingTransfersIn(to);
      // Revert if receiving wallet exceed daily limit
      require(
        getRemainingTransfersIn(to) >= 0,
        "WalletObserverUpgradeable: Cannot transfer to this wallet for this timeframe, it would exceed the limit per timeframe. [_inTokens > timeframeLimit]"
      );
    }
    if (!isExcludedFromObserver(from)) {
      int256 remainingTransfersOut = getRemainingTransfersOut(from);
      if (isSellOrLiquidityAdd) {
        _lastSellOf[from] = block.number;
      }
      require(
        getRemainingTransfersOut(from) >= 0,
        "WalletObserverUpgradeable: Cannot sell from this wallet for this timeframe, it would exceed the limit per timeframe. [_outTokens > timeframeLimit]"
      );
    }
    return true;
  }

  function getMaxTokenPerWallet() public view returns (uint256) {
    // 1% - variable
    return (butcherToken.totalSupply() * maxTokenPerWalletPercent) / 100;
  }

  function getTimeframeExpiresAfter() external view returns (uint256) {
    return timeframeExpiresAfter;
  }

  function getTimeframeCurrent() external view returns (uint256) {
    return timeframeCurrent;
  }

  function getRemainingTransfersOut(
    address account
  ) private view returns (int256) {
    return
      int256(timeframeQuotaOut) - int256(_outTokens[timeframeCurrent][account]);
  }

  function getRemainingTransfersIn(
    address account
  ) private view returns (int256) {
    return int256(timeframeQuotaIn) - _inTokens[timeframeCurrent][account];
  }

  function getOverviewOf(
    address account
  ) external view returns (uint256, uint256, uint256, int256, int256) {
    return (
      timeframeCurrent + timeframeExpiresAfter,
      timeframeQuotaIn,
      timeframeQuotaOut,
      getRemainingTransfersIn(account),
      getRemainingTransfersOut(account)
    );
  }

  function isExcludedFromObserver(address account) public view returns (bool) {
    return
      _isExcludedFromObserver[account] ||
      isRouter(account) ||
      isLpToken(account) ||
      isFeeReceiver(account);
  }

  function setMaxTokenPerWalletPercent(
    uint8 _maxTokenPerWalletPercent
  ) public onlyOperator {
    require(
      _maxTokenPerWalletPercent > 0,
      "WalletObserverUpgradeable: Max token per wallet percentage cannot be 0"
    );

    // Modifying this with a lower value won't brick wallets
    // It will just prevent transferring / buys to be made for them
    maxTokenPerWalletPercent = _maxTokenPerWalletPercent;
    require(
      getMaxTokenPerWallet() >= timeframeQuotaIn,
      "WalletObserverUpgradeable: Max token per wallet must be above or equal to timeframeQuotaIn"
    );
  }

  function setTimeframeExpiresAfter(
    uint256 _timeframeExpiresAfter
  ) public onlyOperator {
    require(
      _timeframeExpiresAfter > 0,
      "WalletObserverUpgradeable: Timeframe expiration cannot be 0"
    );
    timeframeExpiresAfter = _timeframeExpiresAfter;
  }

  function setTimeframeQuotaIn(uint256 _timeframeQuotaIn) public onlyOperator {
    require(
      _timeframeQuotaIn > 0,
      "WalletObserverUpgradeable: Timeframe token quota in cannot be 0"
    );
    timeframeQuotaIn = _timeframeQuotaIn;
  }

  function setTimeframeQuotaOut(
    uint256 _timeframeQuotaOut
  ) public onlyOperator {
    require(
      _timeframeQuotaOut > 0,
      "WalletObserverUpgradeable: Timeframe token quota out cannot be 0"
    );
    timeframeQuotaOut = _timeframeQuotaOut;
  }

  function denyMalicious(address account, bool status) external onlyOperator {
    _isDenied[account] = status;
  }

  function excludeFromObserver(
    address account,
    bool status
  ) public onlyOperator {
    _isExcludedFromObserver[account] = status;
  }

  function totalSupply() external view returns (uint256) {
    uint256 _totalSupply = butcherToken.totalSupply();

    // Ignore Treasury wallets
    _totalSupply -= butcherToken.balanceOf(
      0x8884E46A87255Dd90b8F08B245a3aAd108E2AF79 // Multi-sig
    );
    _totalSupply -= butcherToken.balanceOf(
      0x747218E40fF47bE6869d7Ea3BDc74ae879dac7c4 // Marketing
    );
    _totalSupply -= butcherToken.balanceOf(
      0x1acC825C922BBC9c6e4c03ECD929Bc8f73F9e363 // Donations
    );
    _totalSupply -= butcherToken.balanceOf(
      0x070b2b1F138FdEC6D6Cb3c47d8A74D5715c26Abf // Dev
    );
    _totalSupply -= butcherToken.balanceOf(
      0x20e5D2308F560060C7eC1a8454774209D9Bf1F31 // Treasury Invest
    );

    return _totalSupply;
  }
}

File 9 of 9 : Operator.sol
pragma solidity ^0.8.0;

contract Operator {
  mapping(address => bool) internal _operators;

  constructor() {
    _operators[msg.sender] = true;
  }

  modifier onlyOperator() {
    require(_operators[msg.sender] == true, "Not operator");
    _;
  }

  function setOperator(address _user, bool _value) external onlyOperator {
    _operators[_user] = _value;
  }
}

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

Contract Security Audit

Contract ABI

[{"inputs":[{"internalType":"string","name":"name_","type":"string"},{"internalType":"string","name":"symbol_","type":"string"},{"internalType":"address","name":"router_","type":"address"},{"internalType":"uint256","name":"_buyFee","type":"uint256"},{"internalType":"uint256","name":"_sellFee","type":"uint256"},{"internalType":"uint256","name":"_mooDengSellFee","type":"uint256"},{"internalType":"uint256","name":"_chickenSellFee","type":"uint256"},{"internalType":"uint256","name":"_cowSellFee","type":"uint256"},{"internalType":"address","name":"_marketingWallet","type":"address"},{"internalType":"address","name":"_devWallet","type":"address"}],"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":false,"internalType":"uint256","name":"tokenAmount","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"ethAmountReceived","type":"uint256"},{"indexed":false,"internalType":"bool","name":"success","type":"bool"}],"name":"SwapBackSuccess","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":[],"name":"_manager","outputs":[{"internalType":"contract IEntityManager","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"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":[],"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":"getBuyFee","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getSellFee","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"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":[],"name":"launchMode","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_to","type":"address"},{"internalType":"uint256","name":"_amount","type":"uint256"}],"name":"mint","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"name","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"observer","outputs":[{"internalType":"contract Observer","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_to","type":"address"}],"name":"rescueETH","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_token","type":"address"},{"internalType":"address","name":"_to","type":"address"}],"name":"rescueTokens","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"router","outputs":[{"internalType":"contract IUniswapV2Router02","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bool","name":"_value","type":"bool"}],"name":"setCanTrade","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_managerAddress","type":"address"}],"name":"setEntityManager","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_address","type":"address"},{"internalType":"bool","name":"_value","type":"bool"}],"name":"setExcludedFromFees","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bool","name":"_value","type":"bool"}],"name":"setLaunchMode","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_observer","type":"address"}],"name":"setObserver","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bool","name":"_value","type":"bool"}],"name":"setObserverEnabled","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_user","type":"address"},{"internalType":"bool","name":"_value","type":"bool"}],"name":"setOperator","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"buyTax","type":"uint256"},{"internalType":"uint256","name":"sellTax","type":"uint256"}],"name":"setRates","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_router","type":"address"}],"name":"setRouter","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_value","type":"uint256"}],"name":"setSwapTokensAtAmount","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bool","name":"_value","type":"bool"}],"name":"setSwappingEnabled","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_marketingWallet","type":"address"},{"internalType":"address","name":"_devWallet","type":"address"}],"name":"setWallets","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"symbol","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"toggleObserver","outputs":[{"internalType":"bool","name":"","type":"bool"}],"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"},{"stateMutability":"payable","type":"receive"}]

6080604052346105e85761261180380380610019816105ed565b9283398101610140828203126105e85781516001600160401b0381116105e85781610045918401610612565b602083015190916001600160401b0382116105e857610065918401610612565b916100726040820161067d565b9260608201519360808301519260a08101519360c08201519260e0830151946100ab6101206100a4610100870161067d565b950161067d565b336000908152602081905260409020805460ff19166001179055885190986001600160401b0382116104e55760045490600182811c921680156105de575b60208310146104c55781601f84931161056e575b50602090601f8311600114610506576000926104fb575b50508160011b916000199060031b1c1916176004555b8051906001600160401b0382116104e55760055490600182811c921680156104db575b60208310146104c55781601f849311610471575b50602090601f8311600114610409576000926103fe575b50508160011b916000199060031b1c1916176005555b60018060a01b0316968760018060a01b031960115416176011553360005260006020526040600020600160ff19825416179055600c55600d5560018060a01b031660018060a01b0319600e541617600e55600f5492600b55600955600a5561ffff60a01b1960115416601155600160a01b9160018060a01b03169060018060a81b0319161717600f556871d75ab9b92050000060075533156103b9576003546958f03ee118a13e80000081018091116103a35760035533600052600160205260406000206958f03ee118a13e80000081540190556040516958f03ee118a13e800000815260007fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60203393a33015610352578015610302573060005260026020526040600020816000526020526040600020600019905560405160001981527f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560203092a3604051611f7f90816106928239f35b60405162461bcd60e51b815260206004820152602260248201527f45524332303a20617070726f766520746f20746865207a65726f206164647265604482015261737360f01b6064820152608490fd5b60405162461bcd60e51b8152602060048201526024808201527f45524332303a20617070726f76652066726f6d20746865207a65726f206164646044820152637265737360e01b6064820152608490fd5b634e487b7160e01b600052601160045260246000fd5b60405162461bcd60e51b815260206004820152601f60248201527f45524332303a206d696e7420746f20746865207a65726f2061646472657373006044820152606490fd5b015190503880610178565b600560009081528281209350601f198516905b8181106104595750908460019594939210610440575b505050811b0160055561018e565b015160001960f88460031b161c19169055388080610432565b9293602060018192878601518155019501930161041c565b90915060056000526020600020601f840160051c810191602085106104bb575b90601f859493920160051c01905b8181106104ac5750610161565b6000815584935060010161049f565b9091508190610491565b634e487b7160e01b600052602260045260246000fd5b91607f169161014d565b634e487b7160e01b600052604160045260246000fd5b015190503880610114565b600460009081528281209350601f198516905b818110610556575090846001959493921061053d575b505050811b0160045561012a565b015160001960f88460031b161c1916905538808061052f565b92936020600181928786015181550195019301610519565b60046000529091507f8a35acfbc15ff81a39ae7d344fd709f28e8600b4aa8c65c6b64bfe7fe36bd19b601f840160051c810191602085106105d4575b90601f859493920160051c01905b8181106105c557506100fd565b600081558493506001016105b8565b90915081906105aa565b91607f16916100e9565b600080fd5b6040519190601f01601f191682016001600160401b038111838210176104e557604052565b81601f820112156105e8578051906001600160401b0382116104e557610641601f8301601f19166020016105ed565b92828452602083830101116105e85760005b82811061066857505060206000918301015290565b80602080928401015182828701015201610653565b51906001600160a01b03821682036105e85756fe6080604052600436101561001b575b361561001957600080fd5b005b60003560e01c806304824e701461102e57806306fdde0314610f6f578063095ea7b314610f495780630f959bb714610eb157806318160ddd14610e9357806323b872dd14610db8578063289af0d814610d9a5780632f1db31f14610d42578063313ce56714610d265780633950935114610cd357806340c10f1914610bf457806342966c6814610aa75780635431c94e14610958578063558a7297146108ed578063590ffdce1461088257806364ea519e1461082e5780636f077396146107d657806370a082311461079c57806385df8977146107455780638f818b901461072757806394d9c9c7146106d057806395d89b41146105c8578063a457c2d714610509578063a9059cbb146104d8578063ac6af280146103b6578063afa4f3b21461037e578063b37dd69014610358578063c0d7865514610301578063d3f6a1571461028e578063dcf34a6414610268578063dd62ed3e14610210578063eb70e498146101e9578063f0329f6b146101c25763f887ea400361000e57346101bd5760003660031901126101bd5760206001600160a01b0360115416604051908152f35b600080fd5b346101bd5760003660031901126101bd5760206001600160a01b0360135416604051908152f35b346101bd5760003660031901126101bd5760206001600160a01b0360125416604051908152f35b346101bd5760403660031901126101bd5761022961108f565b6001600160a01b036102396110a5565b911660005260026020526001600160a01b03604060002091166000526020526020604060002054604051908152f35b346101bd5760003660031901126101bd57602060ff60115460a01c166040519015158152f35b346101bd5760403660031901126101bd576001600160a01b036102af61108f565b816102b86110a5565b913360005260006020526102d8600160ff60406000205416151514611122565b166001600160a01b0319600e541617600e55166001600160a01b0319600f541617600f55600080f35b346101bd5760203660031901126101bd576001600160a01b0361032261108f565b336000526000602052610341600160ff60406000205416151514611122565b166001600160a01b03196011541617601155600080f35b346101bd5760003660031901126101bd57602060ff600f5460a01c166040519015158152f35b346101bd5760203660031901126101bd573360005260006020526103ae600160ff60406000205416151514611122565b600435600755005b346101bd5760403660031901126101bd57600435602435903360005260006020526103ed600160ff60406000205416151514611122565b6005811161046f57600f821161040557600c55600d55005b608460405162461bcd60e51b815260206004820152602660248201527f427574636865723a2053656c6c20746178206d757374206265206c657373207460448201527f68616e20313500000000000000000000000000000000000000000000000000006064820152fd5b608460405162461bcd60e51b8152602060048201526024808201527f427574636865723a2042757920746178206d757374206265206c65737320746860448201527f616e2035000000000000000000000000000000000000000000000000000000006064820152fd5b346101bd5760403660031901126101bd576104fe6104f461108f565b602435903361132d565b602060405160018152f35b346101bd5760403660031901126101bd5761052261108f565b6024359033600052600260205260406000206001600160a01b0382166000526020526040600020549180831061055e576104fe920390336111e0565b608460405162461bcd60e51b815260206004820152602560248201527f45524332303a2064656372656173656420616c6c6f77616e63652062656c6f7760448201527f207a65726f0000000000000000000000000000000000000000000000000000006064820152fd5b346101bd5760003660031901126101bd5760405160006005548060011c906001811680156106c6575b6020831081146106b25782855290811561068e575060011461062e575b61062a8361061e8185038261116d565b604051918291826110bb565b0390f35b91905060056000527f036b6384b5eca791c62761152d0c79bb0604c104a5fb6f4eb0703f3154bb3db0916000905b8082106106745750909150810160200161061e61060e565b91926001816020925483858801015201910190929161065c565b60ff191660208086019190915291151560051b8401909101915061061e905061060e565b602484634e487b7160e01b81526022600452fd5b91607f16916105f1565b346101bd5760203660031901126101bd576001600160a01b036106f161108f565b336000526000602052610710600160ff60406000205416151514611122565b166001600160a01b03196012541617601255600080f35b346101bd5760003660031901126101bd576020600c54604051908152f35b346101bd5760203660031901126101bd576001600160a01b0361076661108f565b336000526000602052610785600160ff60406000205416151514611122565b166001600160a01b03196013541617601355600080f35b346101bd5760203660031901126101bd576001600160a01b036107bd61108f565b1660005260016020526020604060002054604051908152f35b346101bd5760203660031901126101bd576107ef611104565b33600052600060205261080e600160ff60406000205416151514611122565b60ff60a01b1960ff60a01b600f5492151560a01b16911617600f55600080f35b346101bd5760203660031901126101bd57610847611104565b336000526000602052610866600160ff60406000205416151514611122565b61ff0060065491151560081b169061ff00191617600655600080f35b346101bd5760403660031901126101bd5761001961089e61108f565b6001600160a01b036108ae611113565b913360005260006020526108ce600160ff60406000205416151514611122565b16600052600860205260406000209060ff801983541691151516179055565b346101bd5760403660031901126101bd5761001961090961108f565b6001600160a01b03610919611113565b91336000526000602052610939600160ff60406000205416151514611122565b16600052600060205260406000209060ff801983541691151516179055565b346101bd5760403660031901126101bd5761097161108f565b6001600160a01b036109816110a5565b913360005260006020526109a1600160ff60406000205416151514611122565b1690604051907f70a08231000000000000000000000000000000000000000000000000000000008252306004830152602082602481865afa918215610a6657600092610a72575b5060446001600160a01b039160006020949560405196879586947fa9059cbb00000000000000000000000000000000000000000000000000000000865216600485015260248401525af18015610a6657610a3e57005b6100199060203d602011610a5f575b610a57818361116d565b8101906111c8565b503d610a4d565b6040513d6000823e3d90fd5b91506020823d602011610a9f575b81610a8d6020938361116d565b810103126101bd5790519060446109e8565b3d9150610a80565b346101bd5760203660031901126101bd576004353315610b8a5733600052600160205260406000205490808210610b205780600092338452600160205203604083205580600354036003556040519081527fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60203392a3005b608460405162461bcd60e51b815260206004820152602260248201527f45524332303a206275726e20616d6f756e7420657863656564732062616c616e60448201527f63650000000000000000000000000000000000000000000000000000000000006064820152fd5b608460405162461bcd60e51b815260206004820152602160248201527f45524332303a206275726e2066726f6d20746865207a65726f2061646472657360448201527f73000000000000000000000000000000000000000000000000000000000000006064820152fd5b346101bd5760403660031901126101bd57610c0d61108f565b6001600160a01b0360243591336000526000602052610c38600160ff60406000205416151514611122565b16908115610c8f577fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef602082610c726000946003546111a5565b6003558484526001825260408420818154019055604051908152a3005b606460405162461bcd60e51b815260206004820152601f60248201527f45524332303a206d696e7420746f20746865207a65726f2061646472657373006044820152fd5b346101bd5760403660031901126101bd576104fe610cef61108f565b33600052600260205260406000206001600160a01b038216600052602052610d1f604060002060243590546111a5565b90336111e0565b346101bd5760003660031901126101bd57602060405160128152f35b346101bd5760203660031901126101bd57610d5b611104565b336000526000602052610d7a600160ff60406000205416151514611122565b60ff60a01b1960ff60a01b60115492151560a01b16911617601155600080f35b346101bd5760003660031901126101bd576020600d54604051908152f35b346101bd5760603660031901126101bd57610dd161108f565b610dd96110a5565b604435906001600160a01b038316600052600260205260406000206001600160a01b033316600052602052604060002054926000198403610e1f575b6104fe935061132d565b6001600160a01b03601354163303610e47575b610e42836104fe950333836111e0565b610e15565b82841015610e3257606460405162461bcd60e51b815260206004820152601d60248201527f45524332303a20696e73756666696369656e7420616c6c6f77616e63650000006044820152fd5b346101bd5760003660031901126101bd576020600354604051908152f35b346101bd5760203660031901126101bd57610eca611104565b336000526000602052610ee9600160ff60406000205416151514611122565b7fffffffffffffffffffff00ffffffffffffffffffffffffffffffffffffffffff75ff00000000000000000000000000000000000000000060115492151560a81b169116176011554360105561010061ff00196006541617600655600080f35b346101bd5760403660031901126101bd576104fe610f6561108f565b60243590336111e0565b346101bd5760003660031901126101bd5760405160006004548060011c90600181168015611024575b6020831081146106b25782855290811561068e5750600114610fc45761062a8361061e8185038261116d565b91905060046000527f8a35acfbc15ff81a39ae7d344fd709f28e8600b4aa8c65c6b64bfe7fe36bd19b916000905b80821061100a5750909150810160200161061e61060e565b919260018160209254838588010152019101909291610ff2565b91607f1691610f98565b346101bd5760203660031901126101bd57600080808061104c61108f565b33825281602052611068600160ff604085205416151514611122565b479082908215611085575b6001600160a01b031690f115610a6657005b6108fc9150611073565b600435906001600160a01b03821682036101bd57565b602435906001600160a01b03821682036101bd57565b91909160208152825180602083015260005b8181106110ee575060409293506000838284010152601f8019910116010190565b80602080928701015160408286010152016110cd565b6004359081151582036101bd57565b6024359081151582036101bd57565b1561112957565b606460405162461bcd60e51b815260206004820152600c60248201527f4e6f74206f70657261746f7200000000000000000000000000000000000000006044820152fd5b90601f8019910116810190811067ffffffffffffffff82111761118f57604052565b634e487b7160e01b600052604160045260246000fd5b919082018092116111b257565b634e487b7160e01b600052601160045260246000fd5b908160209103126101bd575180151581036101bd5790565b6001600160a01b03169081156112b1576001600160a01b03169182156112475760207f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925918360005260028252604060002085600052825280604060002055604051908152a3565b608460405162461bcd60e51b815260206004820152602260248201527f45524332303a20617070726f766520746f20746865207a65726f20616464726560448201527f73730000000000000000000000000000000000000000000000000000000000006064820152fd5b608460405162461bcd60e51b8152602060048201526024808201527f45524332303a20617070726f76652066726f6d20746865207a65726f2061646460448201527f72657373000000000000000000000000000000000000000000000000000000006064820152fd5b818102929181159184041417156111b257565b6001600160a01b0316908115611c10576001600160a01b0316908115611ba657806000526001602052604060002054838110611b3c5781600052600060205260ff604060002054161580611b23575b80611b19575b80611b0f575b15611abc5760115460ff8160a81c1615611a785760a01c60ff166119ab575b60ff600f5460a01c168061199f575b80611992575b61193b575b60065460ff8160081c1680611930575b806118d1575b806118b8575b8061189f575b61187d575b5060ff600654161582600052600860205260ff604060002054168015611865575b61185d575b611419575b50505050565b6001600160a01b0360125416604051630f24ca7d60e01b8152846004820152602081602481855afa908115610a665760009161183e575b50156117365750909192606481049161146b600d548461131a565b9260ff600f5460a01c161561152f575b507fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef92602092909182156114fe578190866000526001855203604060002055306000526001835260406000208281540190556040518281528585853093a30384600052600182526040600020818154019055604051908152a35b38808080611413565b81925085600052600184520360406000205584600052600182526040600020818154019055604051908152a36114f5565b90926001600160a01b03601354166040517f022c9a50000000000000000000000000000000000000000000000000000000008152866004820152602081602481855afa908115610a6657600091611717575b50156115c6575050916020916115bb7fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef946009549061131a565b915b9193509161147b565b6040517fe090cad2000000000000000000000000000000000000000000000000000000008152866004820152602081602481855afa908115610a66576000916116f8575b501561164a575050916020916116447fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef94600a549061131a565b916115bd565b936020602494929395604051958680927f53c700880000000000000000000000000000000000000000000000000000000082528a60048301525afa948515610a66577fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef956020956000916116db575b506116c5575b506115bd565b6116d4919350600b549061131a565b91386116bf565b6116f29150863d8811610a5f57610a57818361116d565b386116b9565b611711915060203d602011610a5f57610a57818361116d565b3861160a565b611730915060203d602011610a5f57610a57818361116d565b38611581565b602060249160405192838092630f24ca7d60e01b82528760048301525afa908115610a665760009161181f575b50156117f6576020907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef92939461179f600c546064830461131a565b9182156114fe578190866000526001855203604060002055306000526001835260406000208281540190556040518281528585853093a30384600052600182526040600020818154019055604051908152a36114f5565b8391600052600160205203604060002055600052600160205260406000209081540190556114f5565b611838915060203d602011610a5f57610a57818361116d565b38611763565b611857915060203d602011610a5f57610a57818361116d565b38611450565b50600061140e565b5083600052600860205260ff60406000205416611409565b60ff191660011760065561188f611cba565b60ff1960065416600655386113e8565b5083600052600860205260ff60406000205416156113e3565b5082600052600860205260ff60406000205416156113dd565b50602460206001600160a01b036012541660405192838092630f24ca7d60e01b82528860048301525afa908115610a6657600091611911575b50156113d7565b61192a915060203d602011610a5f57610a57818361116d565b3861190a565b5060ff8116156113d1565b60105443034381116111b25760059004611959575b436010556113c1565b600c5460041981019081116111b257600c55600d54600f811161197d575b50611950565b60041981019081116111b257600d5538611977565b50600f600d5410156113bc565b506005600c54116113b6565b600060206001600160a01b03601254166084604051809481937f37be75a00000000000000000000000000000000000000000000000000000000083523360048401528860248401528960448401528a60648401525af1908115610a6657600091611a59575b506113a757606460405162461bcd60e51b815260206004820152601a60248201527f57616c6c65744f627365727665723a2052617465206c696d69740000000000006044820152fd5b611a72915060203d602011610a5f57610a57818361116d565b38611a10565b606460405162461bcd60e51b815260206004820152601c60248201527f427574636865723a2054726164696e672069732064697361626c6564000000006044820152fd5b838293946020927fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef94600052600184520360406000205584600052600182526040600020818154019055604051908152a3565b5030821415611388565b5030831415611382565b5082600052600060205260ff604060002054161561137c565b608460405162461bcd60e51b815260206004820152602660248201527f45524332303a207472616e7366657220616d6f756e742065786365656473206260448201527f616c616e636500000000000000000000000000000000000000000000000000006064820152fd5b608460405162461bcd60e51b815260206004820152602360248201527f45524332303a207472616e7366657220746f20746865207a65726f206164647260448201527f65737300000000000000000000000000000000000000000000000000000000006064820152fd5b608460405162461bcd60e51b815260206004820152602560248201527f45524332303a207472616e736665722066726f6d20746865207a65726f20616460448201527f64726573730000000000000000000000000000000000000000000000000000006064820152fd5b3d15611cb5573d9067ffffffffffffffff821161118f5760405191611ca9601f8201601f19166020018461116d565b82523d6000602084013e565b606090565b60003081526001602052604081205415611f4657308152600160205260408120549060075480921015611ceb575050565b604051611cf960608261116d565b60028152602081016040368237815115611f32573081526001600160a01b03601154166040517fad5c4648000000000000000000000000000000000000000000000000000000008152602081600481855afa908115611f27578591611ee1575b50835160011015611ecd576001600160a01b03166040840152611d7e908590306111e0565b6001600160a01b036011541690813b15611ec9579183916040519384927f791ac94700000000000000000000000000000000000000000000000000000000845260a484019088600486015285602486015260a060448601525180915260c484019190855b818110611ea4575050508383809230606483015242608483015203925af18015611e9957917fe9f689eb4d290dd3a40869ea626055ee4a55d40f20286208d04ef55f39254cff939181606094611e89575b505047908080806001600160a01b03600e5416818080808960011c80955af150611e5b611c7a565b506001600160a01b03600f54165af190611e73611c7a565b50604051928352602083015215156040820152a1565b611e929161116d565b3881611e33565b6040513d84823e3d90fd5b82516001600160a01b0316845288965087955060209384019390920191600101611de2565b8380fd5b602485634e487b7160e01b81526032600452fd5b90506020813d602011611f1f575b81611efc6020938361116d565b81010312611f1b57516001600160a01b0381168103611f1b5738611d59565b8480fd5b3d9150611eef565b6040513d87823e3d90fd5b602483634e487b7160e01b81526032600452fd5b5056fea26469706673582212200efa7bf30521d42b6d3693e955be5c133c143bec957adf92d22bc24f719a2fd264736f6c634300081b0033000000000000000000000000000000000000000000000000000000000000014000000000000000000000000000000000000000000000000000000000000001800000000000000000000000007a250d5630b4cf539739df2c5dacb4c659f2488d0000000000000000000000000000000000000000000000000000000000000023000000000000000000000000000000000000000000000000000000000000002300000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000005000000000000000000000000000000000000000000000000000000000000000a000000000000000000000000ed896a98765adde9cfb0a0dfed828ae8c8a1ac04000000000000000000000000bd03841cc415fd08514fdfe5b4b29248e96c514a0000000000000000000000000000000000000000000000000000000000000007425554434845520000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000044d45415400000000000000000000000000000000000000000000000000000000

Deployed Bytecode

0x6080604052600436101561001b575b361561001957600080fd5b005b60003560e01c806304824e701461102e57806306fdde0314610f6f578063095ea7b314610f495780630f959bb714610eb157806318160ddd14610e9357806323b872dd14610db8578063289af0d814610d9a5780632f1db31f14610d42578063313ce56714610d265780633950935114610cd357806340c10f1914610bf457806342966c6814610aa75780635431c94e14610958578063558a7297146108ed578063590ffdce1461088257806364ea519e1461082e5780636f077396146107d657806370a082311461079c57806385df8977146107455780638f818b901461072757806394d9c9c7146106d057806395d89b41146105c8578063a457c2d714610509578063a9059cbb146104d8578063ac6af280146103b6578063afa4f3b21461037e578063b37dd69014610358578063c0d7865514610301578063d3f6a1571461028e578063dcf34a6414610268578063dd62ed3e14610210578063eb70e498146101e9578063f0329f6b146101c25763f887ea400361000e57346101bd5760003660031901126101bd5760206001600160a01b0360115416604051908152f35b600080fd5b346101bd5760003660031901126101bd5760206001600160a01b0360135416604051908152f35b346101bd5760003660031901126101bd5760206001600160a01b0360125416604051908152f35b346101bd5760403660031901126101bd5761022961108f565b6001600160a01b036102396110a5565b911660005260026020526001600160a01b03604060002091166000526020526020604060002054604051908152f35b346101bd5760003660031901126101bd57602060ff60115460a01c166040519015158152f35b346101bd5760403660031901126101bd576001600160a01b036102af61108f565b816102b86110a5565b913360005260006020526102d8600160ff60406000205416151514611122565b166001600160a01b0319600e541617600e55166001600160a01b0319600f541617600f55600080f35b346101bd5760203660031901126101bd576001600160a01b0361032261108f565b336000526000602052610341600160ff60406000205416151514611122565b166001600160a01b03196011541617601155600080f35b346101bd5760003660031901126101bd57602060ff600f5460a01c166040519015158152f35b346101bd5760203660031901126101bd573360005260006020526103ae600160ff60406000205416151514611122565b600435600755005b346101bd5760403660031901126101bd57600435602435903360005260006020526103ed600160ff60406000205416151514611122565b6005811161046f57600f821161040557600c55600d55005b608460405162461bcd60e51b815260206004820152602660248201527f427574636865723a2053656c6c20746178206d757374206265206c657373207460448201527f68616e20313500000000000000000000000000000000000000000000000000006064820152fd5b608460405162461bcd60e51b8152602060048201526024808201527f427574636865723a2042757920746178206d757374206265206c65737320746860448201527f616e2035000000000000000000000000000000000000000000000000000000006064820152fd5b346101bd5760403660031901126101bd576104fe6104f461108f565b602435903361132d565b602060405160018152f35b346101bd5760403660031901126101bd5761052261108f565b6024359033600052600260205260406000206001600160a01b0382166000526020526040600020549180831061055e576104fe920390336111e0565b608460405162461bcd60e51b815260206004820152602560248201527f45524332303a2064656372656173656420616c6c6f77616e63652062656c6f7760448201527f207a65726f0000000000000000000000000000000000000000000000000000006064820152fd5b346101bd5760003660031901126101bd5760405160006005548060011c906001811680156106c6575b6020831081146106b25782855290811561068e575060011461062e575b61062a8361061e8185038261116d565b604051918291826110bb565b0390f35b91905060056000527f036b6384b5eca791c62761152d0c79bb0604c104a5fb6f4eb0703f3154bb3db0916000905b8082106106745750909150810160200161061e61060e565b91926001816020925483858801015201910190929161065c565b60ff191660208086019190915291151560051b8401909101915061061e905061060e565b602484634e487b7160e01b81526022600452fd5b91607f16916105f1565b346101bd5760203660031901126101bd576001600160a01b036106f161108f565b336000526000602052610710600160ff60406000205416151514611122565b166001600160a01b03196012541617601255600080f35b346101bd5760003660031901126101bd576020600c54604051908152f35b346101bd5760203660031901126101bd576001600160a01b0361076661108f565b336000526000602052610785600160ff60406000205416151514611122565b166001600160a01b03196013541617601355600080f35b346101bd5760203660031901126101bd576001600160a01b036107bd61108f565b1660005260016020526020604060002054604051908152f35b346101bd5760203660031901126101bd576107ef611104565b33600052600060205261080e600160ff60406000205416151514611122565b60ff60a01b1960ff60a01b600f5492151560a01b16911617600f55600080f35b346101bd5760203660031901126101bd57610847611104565b336000526000602052610866600160ff60406000205416151514611122565b61ff0060065491151560081b169061ff00191617600655600080f35b346101bd5760403660031901126101bd5761001961089e61108f565b6001600160a01b036108ae611113565b913360005260006020526108ce600160ff60406000205416151514611122565b16600052600860205260406000209060ff801983541691151516179055565b346101bd5760403660031901126101bd5761001961090961108f565b6001600160a01b03610919611113565b91336000526000602052610939600160ff60406000205416151514611122565b16600052600060205260406000209060ff801983541691151516179055565b346101bd5760403660031901126101bd5761097161108f565b6001600160a01b036109816110a5565b913360005260006020526109a1600160ff60406000205416151514611122565b1690604051907f70a08231000000000000000000000000000000000000000000000000000000008252306004830152602082602481865afa918215610a6657600092610a72575b5060446001600160a01b039160006020949560405196879586947fa9059cbb00000000000000000000000000000000000000000000000000000000865216600485015260248401525af18015610a6657610a3e57005b6100199060203d602011610a5f575b610a57818361116d565b8101906111c8565b503d610a4d565b6040513d6000823e3d90fd5b91506020823d602011610a9f575b81610a8d6020938361116d565b810103126101bd5790519060446109e8565b3d9150610a80565b346101bd5760203660031901126101bd576004353315610b8a5733600052600160205260406000205490808210610b205780600092338452600160205203604083205580600354036003556040519081527fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60203392a3005b608460405162461bcd60e51b815260206004820152602260248201527f45524332303a206275726e20616d6f756e7420657863656564732062616c616e60448201527f63650000000000000000000000000000000000000000000000000000000000006064820152fd5b608460405162461bcd60e51b815260206004820152602160248201527f45524332303a206275726e2066726f6d20746865207a65726f2061646472657360448201527f73000000000000000000000000000000000000000000000000000000000000006064820152fd5b346101bd5760403660031901126101bd57610c0d61108f565b6001600160a01b0360243591336000526000602052610c38600160ff60406000205416151514611122565b16908115610c8f577fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef602082610c726000946003546111a5565b6003558484526001825260408420818154019055604051908152a3005b606460405162461bcd60e51b815260206004820152601f60248201527f45524332303a206d696e7420746f20746865207a65726f2061646472657373006044820152fd5b346101bd5760403660031901126101bd576104fe610cef61108f565b33600052600260205260406000206001600160a01b038216600052602052610d1f604060002060243590546111a5565b90336111e0565b346101bd5760003660031901126101bd57602060405160128152f35b346101bd5760203660031901126101bd57610d5b611104565b336000526000602052610d7a600160ff60406000205416151514611122565b60ff60a01b1960ff60a01b60115492151560a01b16911617601155600080f35b346101bd5760003660031901126101bd576020600d54604051908152f35b346101bd5760603660031901126101bd57610dd161108f565b610dd96110a5565b604435906001600160a01b038316600052600260205260406000206001600160a01b033316600052602052604060002054926000198403610e1f575b6104fe935061132d565b6001600160a01b03601354163303610e47575b610e42836104fe950333836111e0565b610e15565b82841015610e3257606460405162461bcd60e51b815260206004820152601d60248201527f45524332303a20696e73756666696369656e7420616c6c6f77616e63650000006044820152fd5b346101bd5760003660031901126101bd576020600354604051908152f35b346101bd5760203660031901126101bd57610eca611104565b336000526000602052610ee9600160ff60406000205416151514611122565b7fffffffffffffffffffff00ffffffffffffffffffffffffffffffffffffffffff75ff00000000000000000000000000000000000000000060115492151560a81b169116176011554360105561010061ff00196006541617600655600080f35b346101bd5760403660031901126101bd576104fe610f6561108f565b60243590336111e0565b346101bd5760003660031901126101bd5760405160006004548060011c90600181168015611024575b6020831081146106b25782855290811561068e5750600114610fc45761062a8361061e8185038261116d565b91905060046000527f8a35acfbc15ff81a39ae7d344fd709f28e8600b4aa8c65c6b64bfe7fe36bd19b916000905b80821061100a5750909150810160200161061e61060e565b919260018160209254838588010152019101909291610ff2565b91607f1691610f98565b346101bd5760203660031901126101bd57600080808061104c61108f565b33825281602052611068600160ff604085205416151514611122565b479082908215611085575b6001600160a01b031690f115610a6657005b6108fc9150611073565b600435906001600160a01b03821682036101bd57565b602435906001600160a01b03821682036101bd57565b91909160208152825180602083015260005b8181106110ee575060409293506000838284010152601f8019910116010190565b80602080928701015160408286010152016110cd565b6004359081151582036101bd57565b6024359081151582036101bd57565b1561112957565b606460405162461bcd60e51b815260206004820152600c60248201527f4e6f74206f70657261746f7200000000000000000000000000000000000000006044820152fd5b90601f8019910116810190811067ffffffffffffffff82111761118f57604052565b634e487b7160e01b600052604160045260246000fd5b919082018092116111b257565b634e487b7160e01b600052601160045260246000fd5b908160209103126101bd575180151581036101bd5790565b6001600160a01b03169081156112b1576001600160a01b03169182156112475760207f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925918360005260028252604060002085600052825280604060002055604051908152a3565b608460405162461bcd60e51b815260206004820152602260248201527f45524332303a20617070726f766520746f20746865207a65726f20616464726560448201527f73730000000000000000000000000000000000000000000000000000000000006064820152fd5b608460405162461bcd60e51b8152602060048201526024808201527f45524332303a20617070726f76652066726f6d20746865207a65726f2061646460448201527f72657373000000000000000000000000000000000000000000000000000000006064820152fd5b818102929181159184041417156111b257565b6001600160a01b0316908115611c10576001600160a01b0316908115611ba657806000526001602052604060002054838110611b3c5781600052600060205260ff604060002054161580611b23575b80611b19575b80611b0f575b15611abc5760115460ff8160a81c1615611a785760a01c60ff166119ab575b60ff600f5460a01c168061199f575b80611992575b61193b575b60065460ff8160081c1680611930575b806118d1575b806118b8575b8061189f575b61187d575b5060ff600654161582600052600860205260ff604060002054168015611865575b61185d575b611419575b50505050565b6001600160a01b0360125416604051630f24ca7d60e01b8152846004820152602081602481855afa908115610a665760009161183e575b50156117365750909192606481049161146b600d548461131a565b9260ff600f5460a01c161561152f575b507fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef92602092909182156114fe578190866000526001855203604060002055306000526001835260406000208281540190556040518281528585853093a30384600052600182526040600020818154019055604051908152a35b38808080611413565b81925085600052600184520360406000205584600052600182526040600020818154019055604051908152a36114f5565b90926001600160a01b03601354166040517f022c9a50000000000000000000000000000000000000000000000000000000008152866004820152602081602481855afa908115610a6657600091611717575b50156115c6575050916020916115bb7fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef946009549061131a565b915b9193509161147b565b6040517fe090cad2000000000000000000000000000000000000000000000000000000008152866004820152602081602481855afa908115610a66576000916116f8575b501561164a575050916020916116447fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef94600a549061131a565b916115bd565b936020602494929395604051958680927f53c700880000000000000000000000000000000000000000000000000000000082528a60048301525afa948515610a66577fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef956020956000916116db575b506116c5575b506115bd565b6116d4919350600b549061131a565b91386116bf565b6116f29150863d8811610a5f57610a57818361116d565b386116b9565b611711915060203d602011610a5f57610a57818361116d565b3861160a565b611730915060203d602011610a5f57610a57818361116d565b38611581565b602060249160405192838092630f24ca7d60e01b82528760048301525afa908115610a665760009161181f575b50156117f6576020907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef92939461179f600c546064830461131a565b9182156114fe578190866000526001855203604060002055306000526001835260406000208281540190556040518281528585853093a30384600052600182526040600020818154019055604051908152a36114f5565b8391600052600160205203604060002055600052600160205260406000209081540190556114f5565b611838915060203d602011610a5f57610a57818361116d565b38611763565b611857915060203d602011610a5f57610a57818361116d565b38611450565b50600061140e565b5083600052600860205260ff60406000205416611409565b60ff191660011760065561188f611cba565b60ff1960065416600655386113e8565b5083600052600860205260ff60406000205416156113e3565b5082600052600860205260ff60406000205416156113dd565b50602460206001600160a01b036012541660405192838092630f24ca7d60e01b82528860048301525afa908115610a6657600091611911575b50156113d7565b61192a915060203d602011610a5f57610a57818361116d565b3861190a565b5060ff8116156113d1565b60105443034381116111b25760059004611959575b436010556113c1565b600c5460041981019081116111b257600c55600d54600f811161197d575b50611950565b60041981019081116111b257600d5538611977565b50600f600d5410156113bc565b506005600c54116113b6565b600060206001600160a01b03601254166084604051809481937f37be75a00000000000000000000000000000000000000000000000000000000083523360048401528860248401528960448401528a60648401525af1908115610a6657600091611a59575b506113a757606460405162461bcd60e51b815260206004820152601a60248201527f57616c6c65744f627365727665723a2052617465206c696d69740000000000006044820152fd5b611a72915060203d602011610a5f57610a57818361116d565b38611a10565b606460405162461bcd60e51b815260206004820152601c60248201527f427574636865723a2054726164696e672069732064697361626c6564000000006044820152fd5b838293946020927fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef94600052600184520360406000205584600052600182526040600020818154019055604051908152a3565b5030821415611388565b5030831415611382565b5082600052600060205260ff604060002054161561137c565b608460405162461bcd60e51b815260206004820152602660248201527f45524332303a207472616e7366657220616d6f756e742065786365656473206260448201527f616c616e636500000000000000000000000000000000000000000000000000006064820152fd5b608460405162461bcd60e51b815260206004820152602360248201527f45524332303a207472616e7366657220746f20746865207a65726f206164647260448201527f65737300000000000000000000000000000000000000000000000000000000006064820152fd5b608460405162461bcd60e51b815260206004820152602560248201527f45524332303a207472616e736665722066726f6d20746865207a65726f20616460448201527f64726573730000000000000000000000000000000000000000000000000000006064820152fd5b3d15611cb5573d9067ffffffffffffffff821161118f5760405191611ca9601f8201601f19166020018461116d565b82523d6000602084013e565b606090565b60003081526001602052604081205415611f4657308152600160205260408120549060075480921015611ceb575050565b604051611cf960608261116d565b60028152602081016040368237815115611f32573081526001600160a01b03601154166040517fad5c4648000000000000000000000000000000000000000000000000000000008152602081600481855afa908115611f27578591611ee1575b50835160011015611ecd576001600160a01b03166040840152611d7e908590306111e0565b6001600160a01b036011541690813b15611ec9579183916040519384927f791ac94700000000000000000000000000000000000000000000000000000000845260a484019088600486015285602486015260a060448601525180915260c484019190855b818110611ea4575050508383809230606483015242608483015203925af18015611e9957917fe9f689eb4d290dd3a40869ea626055ee4a55d40f20286208d04ef55f39254cff939181606094611e89575b505047908080806001600160a01b03600e5416818080808960011c80955af150611e5b611c7a565b506001600160a01b03600f54165af190611e73611c7a565b50604051928352602083015215156040820152a1565b611e929161116d565b3881611e33565b6040513d84823e3d90fd5b82516001600160a01b0316845288965087955060209384019390920191600101611de2565b8380fd5b602485634e487b7160e01b81526032600452fd5b90506020813d602011611f1f575b81611efc6020938361116d565b81010312611f1b57516001600160a01b0381168103611f1b5738611d59565b8480fd5b3d9150611eef565b6040513d87823e3d90fd5b602483634e487b7160e01b81526032600452fd5b5056fea26469706673582212200efa7bf30521d42b6d3693e955be5c133c143bec957adf92d22bc24f719a2fd264736f6c634300081b0033

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

000000000000000000000000000000000000000000000000000000000000014000000000000000000000000000000000000000000000000000000000000001800000000000000000000000007a250d5630b4cf539739df2c5dacb4c659f2488d0000000000000000000000000000000000000000000000000000000000000023000000000000000000000000000000000000000000000000000000000000002300000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000005000000000000000000000000000000000000000000000000000000000000000a000000000000000000000000ed896a98765adde9cfb0a0dfed828ae8c8a1ac04000000000000000000000000bd03841cc415fd08514fdfe5b4b29248e96c514a0000000000000000000000000000000000000000000000000000000000000007425554434845520000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000044d45415400000000000000000000000000000000000000000000000000000000

-----Decoded View---------------
Arg [0] : name_ (string): BUTCHER
Arg [1] : symbol_ (string): MEAT
Arg [2] : router_ (address): 0x7a250d5630B4cF539739dF2C5dAcb4c659F2488D
Arg [3] : _buyFee (uint256): 35
Arg [4] : _sellFee (uint256): 35
Arg [5] : _mooDengSellFee (uint256): 0
Arg [6] : _chickenSellFee (uint256): 5
Arg [7] : _cowSellFee (uint256): 10
Arg [8] : _marketingWallet (address): 0xEd896a98765aDDe9cFB0A0dfED828AE8C8A1aC04
Arg [9] : _devWallet (address): 0xbD03841cC415fd08514Fdfe5b4B29248e96c514a

-----Encoded View---------------
14 Constructor Arguments found :
Arg [0] : 0000000000000000000000000000000000000000000000000000000000000140
Arg [1] : 0000000000000000000000000000000000000000000000000000000000000180
Arg [2] : 0000000000000000000000007a250d5630b4cf539739df2c5dacb4c659f2488d
Arg [3] : 0000000000000000000000000000000000000000000000000000000000000023
Arg [4] : 0000000000000000000000000000000000000000000000000000000000000023
Arg [5] : 0000000000000000000000000000000000000000000000000000000000000000
Arg [6] : 0000000000000000000000000000000000000000000000000000000000000005
Arg [7] : 000000000000000000000000000000000000000000000000000000000000000a
Arg [8] : 000000000000000000000000ed896a98765adde9cfb0a0dfed828ae8c8a1ac04
Arg [9] : 000000000000000000000000bd03841cc415fd08514fdfe5b4b29248e96c514a
Arg [10] : 0000000000000000000000000000000000000000000000000000000000000007
Arg [11] : 4255544348455200000000000000000000000000000000000000000000000000
Arg [12] : 0000000000000000000000000000000000000000000000000000000000000004
Arg [13] : 4d45415400000000000000000000000000000000000000000000000000000000


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.