ETH Price: $2,664.74 (+2.36%)

Token

Fuck Around and Find Out (FAFOWTF)
 

Overview

Max Total Supply

69,420,000 FAFOWTF

Holders

64

Market

Onchain Market Cap

$0.00

Circulating Supply Market Cap

-

Other Info

Token Contract (WITH 18 Decimals)

Filtered by Token Holder
cuzzo.eth
Balance
0 FAFOWTF

Value
$0.00
0x98DFC214ae80C403b5B5282e98a6D8A5Ce0d396b
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:
FafoERC

Compiler Version
v0.8.24+commit.e11b9ed9

Optimization Enabled:
Yes with 200 runs

Other Settings:
cancun EvmVersion, MIT license
File 1 of 11 : FafoERC.sol
/*

  Fuck Around and Find Out

  Old dev Fucked Around so the community took control to make him Find Out
  
  X: https://twitter.com/TokenFAFO
  Telegram: https://t.me/FAFOETHPORTAL

*/

// SPDX-License-Identifier: MIT

pragma solidity 0.8.24;

import "./CF_Common.sol";
import "./CF_Ownable.sol";
import "./CF_ERC20.sol";
import "./CF_Recoverable.sol";
import "./CF_Whitelist.sol";
import "./CF_MaxBalance.sol";
import "./CF_Taxable.sol";
import "./CF_DEXRouterV2.sol";

contract FafoERC is CF_Common, CF_Ownable, CF_ERC20, CF_Recoverable, CF_Whitelist, CF_MaxBalance, CF_Taxable, CF_DEXRouterV2 {
  constructor() {
    _name = unicode"Fuck Around and Find Out";
    _symbol = unicode"FAFOWTF";
    _decimals = 18;
    _totalSupply = 69420000000000000000000000; // 69,420,000 FAFOWTF
    _transferOwnership(0x0413846c7b2D64af7466ED6D2Ba4C434C2C04C8F);
    _transferInitialSupply(0x0413846c7b2D64af7466ED6D2Ba4C434C2C04C8F, 100000); // 100%
    _setDEXRouterV2(0x7a250d5630B4cF539739dF2C5dAcb4c659F2488D, 0x0413846c7b2D64af7466ED6D2Ba4C434C2C04C8F);
    _setEarlyPenaltyTime(180); // 3min
    _setTaxToken(0xC02aaA39b223FE8D0A0e5C4F27eAD9083C756Cc2);
    _autoSwapEnabled = true;
    _setAutoSwapPercent(50, 250); // 0.05% -> 0.25% of total supply
    _setAutoAddLiquidityPercent(100, 100000); // 0.1% -> 100% of total supply

    _setTaxBeneficiary(0, 0x8881d9869aC7C7840971cAac043D7f4D144Abd10, [ uint24(0), uint24(0), uint24(0) ], [ uint24(3000), uint24(3000), uint24(3000) ]); // ChainFactory Anti-Sniper revenue (10%)
    _setTaxBeneficiary(1, 0x0413846c7b2D64af7466ED6D2Ba4C434C2C04C8F, [ uint24(0), uint24(1000), uint24(1000) ], [ uint24(30000), uint24(30000), uint24(30000) ]);
    _initialWhitelist([ 0x0413846c7b2D64af7466ED6D2Ba4C434C2C04C8F ]);
    _setMaxBalancePercent(5000); // 5% of total supply

    _initialized = true;
  }

  function _transfer(address from, address to, uint256 amount) internal virtual override {
    if (!_distributing && !_swapping && (from != _dex.pair && from != _dex.router)) {
      _autoSwap(false);
      _autoTaxDistribute();
    }

    if (amount > 0 && !_whitelisted[from] && !_whitelisted[to] && from != address(this) && to != address(this) && to != _dex.router) {
      require((from != _dex.pair && to != _dex.pair) || ((from == _dex.pair || to == _dex.pair) && _tradingEnabled > 0), "Trading disabled");

      unchecked {
        require(_maxBalanceAmount == 0 || to == address(this) || (to == _dex.pair || to == _dex.router) || _balance[to] + amount <= _maxBalanceAmount, "Exceeds maxBalance");

        if (!_suspendTaxes && !_distributing && !_swapping) {
          uint256 appliedTax;
          uint8 taxType;

          if (from == _dex.pair || to == _dex.pair) { taxType = from == _dex.pair ? 1 : 2; }

          address _account = taxType == 1 ? to : from;

          if (_tradingEnabled + _earlyPenaltyTime >= _timestamp() && !_holder[_account].penalty) { _holder[_account].penalty = true; }

          for (uint8 i; i < 6; i++) {
            uint256 percent = uint256(taxType > 0 ? (taxType == 1 ? (_holder[_account].penalty ? _taxBeneficiary[i].penalty[1] : _taxBeneficiary[i].percent[1]) : (_holder[_account].penalty ? _taxBeneficiary[i].penalty[2] : _taxBeneficiary[i].percent[2])) : (_holder[_account].penalty ? _taxBeneficiary[i].penalty[0] : _taxBeneficiary[i].percent[0]));

            if (percent == 0) { continue; }

            uint256 taxAmount = _percentage(amount, percent);

            super._transfer(from, address(this), taxAmount);

            if (_taxBeneficiary[i].account == _dex.pair) {
              _amountForLiquidity += taxAmount;
            } else {
              _taxBeneficiary[i].unclaimed += taxAmount;
              _amountForTaxDistribution += taxAmount;
              _totalTaxUnclaimed += taxAmount;
            }

            appliedTax += taxAmount;
          }

          if (appliedTax > 0) {
            _totalTaxCollected += appliedTax;

            amount -= appliedTax;
          }
        }
      }
    }

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

  function _transferInitialSupply(address account, uint24 percent) private {
    require(!_initialized);

    uint256 amount = _percentage(_totalSupply, uint256(percent));

    _balance[account] = amount;

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

  /// @notice Returns a list specifying the renounce status of each feature
  function renounced() external view returns (bool Whitelist, bool MaxBalance, bool DEXRouterV2, bool Taxable) {
    return (_renounced.Whitelist, _renounced.MaxBalance, _renounced.DEXRouterV2, _renounced.Taxable);
  }

  /// @notice Returns basic information about this Smart-Contract
  function info() external view returns (string memory name, string memory symbol, uint8 decimals, address owner, uint256 totalSupply, string memory version) {
    return (_name, _symbol, _decimals, _owner, _totalSupply, _version);
  }

  receive() external payable { }
  fallback() external payable { }
}

/*
   ________          _       ______           __                  
  / ____/ /_  ____ _(_)___  / ____/___ ______/ /_____  _______  __
 / /   / __ \/ __ `/ / __ \/ /_  / __ `/ ___/ __/ __ \/ ___/ / / /
/ /___/ / / / /_/ / / / / / __/ / /_/ / /__/ /_/ /_/ / /  / /_/ / 
\____/_/ /_/\__,_/_/_/ /_/_/    \__,_/\___/\__/\____/_/   \__, /  
                                                         /____/   

  Smart-Contract generated by ChainFactory.app

  By using this Smart-Contract generated by ChainFactory.app, you
  acknowledge and agree that ChainFactory shall not be liable for
  any damages arising from the use of this Smart-Contract,
  including but not limited to any damages resulting from any
  malicious or illegal use of the Smart-Contract by any third
  party or by the owner.

  The owner of the Smart-Contract generated by ChainFactory.app
  agrees not to misuse the Smart-Contract, including but not
  limited to:

  - Using the Smart-Contract to engage in any illegal or
    fraudulent activity, including but not limited to scams,
    theft, or money laundering.

  - Using the Smart-Contract in any manner that could cause harm
    to others, including but not limited to disrupting financial
    markets or causing financial loss to others.

  - Using the Smart-Contract to infringe upon the intellectual
    property rights of others, including but not limited to
    copyright, trademark, or patent infringement.

  The owner of the Smart-Contract generated by ChainFactory.app
  acknowledges that any misuse of the Smart-Contract may result in
  legal action, and agrees to indemnify and hold harmless
  ChainFactory from any and all claims, damages, or expenses
  arising from any such misuse.

*/

File 2 of 11 : IDEXV2.sol
// SPDX-License-Identifier: MIT

pragma solidity 0.8.24;

interface IDEXRouterV2 {
  function factory() external pure returns (address);
  function WETH() external pure returns (address);
  function addLiquidityETH(address token, uint256 amountTokenDesired, uint256 amountTokenMin, uint256 amountETHMin, address to, uint256 deadline) external payable returns (uint256 amountToken, uint256 amountETH, uint256 liquidity);
  function swapExactTokensForETHSupportingFeeOnTransferTokens(uint256 amountIn, uint256 amountOutMin, address[] calldata path, address to, uint256 deadline) external;
  function swapExactTokensForTokensSupportingFeeOnTransferTokens(uint256 amountIn, uint256 amountOutMin, address[] calldata path, address to, uint256 deadline) external;
}

interface IDEXFactoryV2 {
  function createPair(address tokenA, address tokenB) external returns (address pair);
  function getPair(address tokenA, address tokenB) external returns (address pair);
}

File 3 of 11 : IERC20.sol
// SPDX-License-Identifier: MIT

pragma solidity 0.8.24;

interface IERC20 {
  function balanceOf(address account) external view returns (uint256);
  function transfer(address to, uint256 amount) external returns (bool);
  function approve(address spender, uint256 amount) external returns (bool);
}

File 4 of 11 : CF_ERC20.sol
// SPDX-License-Identifier: MIT

pragma solidity 0.8.24;

import "./CF_Common.sol";

abstract contract CF_ERC20 is CF_Common {
  string internal _name;
  string internal _symbol;

  event Transfer(address indexed from, address indexed to, uint256 value);
  event Approval(address indexed owner, address indexed spender, uint256 value);

  function name() external view returns (string memory) {
    return _name;
  }

  function symbol() external view returns (string memory) {
    return _symbol;
  }

  function decimals() external view returns (uint8) {
    return _decimals;
  }

  function totalSupply() external view returns (uint256) {
    return _totalSupply;
  }

  function balanceOf(address account) external view returns (uint256) {
    return _balance[account];
  }

  function allowance(address owner, address spender) public view returns (uint256) {
    return _allowance[owner][spender];
  }

  function approve(address spender, uint256 amount) external returns (bool) {
    _approve(msg.sender, spender, amount);

    return true;
  }

  function transfer(address to, uint256 amount) external returns (bool) {
    _transfer(msg.sender, to, amount);

    return true;
  }

  function transferFrom(address from, address to, uint256 amount) external returns (bool) {
    _spendAllowance(from, msg.sender, amount);
    _transfer(from, to, amount);

    return true;
  }

  function increaseAllowance(address spender, uint256 addedValue) external returns (bool) {
    unchecked {
      _approve(msg.sender, spender, allowance(msg.sender, spender) + addedValue);
    }

    return true;
  }

  function decreaseAllowance(address spender, uint256 subtractedValue) external returns (bool) {
    uint256 currentAllowance = allowance(msg.sender, spender);

    require(currentAllowance >= subtractedValue, "Negative allowance");

    unchecked {
      _approve(msg.sender, spender, currentAllowance - subtractedValue);
    }

    return true;
  }

  function _approve(address owner, address spender, uint256 amount) internal {
    _allowance[owner][spender] = amount;

    emit Approval(owner, spender, amount);
  }

  function _spendAllowance(address owner, address spender, uint256 amount) internal {
    uint256 currentAllowance = allowance(owner, spender);

    require(currentAllowance >= amount, "Insufficient allowance");

    unchecked {
      _approve(owner, spender, currentAllowance - amount);
    }
  }

  function _transfer(address from, address to, uint256 amount) internal virtual {
    require(from != address(0) && to != address(0), "Transfer from/to zero address");
    require(_balance[from] >= amount, "Exceeds balance");

    if (amount > 0) {
      unchecked {
        _balance[from] -= amount;
        _balance[to] += amount;
      }
    }

    emit Transfer(from, to, amount);
  }
}

File 5 of 11 : CF_Common.sol
// SPDX-License-Identifier: MIT

pragma solidity 0.8.24;

import "./IDEXV2.sol";
import "./IERC20.sol";

abstract contract CF_Common {
  string internal constant _version = "1.0.2";

  mapping(address => uint256) internal _balance;
  mapping(address => mapping(address => uint256)) internal _allowance;
  mapping(address => bool) internal _whitelisted;
  mapping(address => holderAccount) internal _holder;
  mapping(uint8 => taxBeneficiary) internal _taxBeneficiary;
  mapping(address => uint256) internal _tokensForTaxDistribution;

  address[] internal _holders;

  bool internal _autoSwapEnabled;
  bool internal _swapping;
  bool internal _suspendTaxes;
  bool internal _distributing;
  bool internal immutable _initialized;

  uint8 internal immutable _decimals;
  uint24 internal constant _denominator = 1000;
  uint24 internal _maxBalancePercent;
  uint24 internal _totalTxTax;
  uint24 internal _totalBuyTax;
  uint24 internal _totalSellTax;
  uint24 internal _totalPenaltyTxTax;
  uint24 internal _totalPenaltyBuyTax;
  uint24 internal _totalPenaltySellTax;
  uint24 internal _minAutoSwapPercent;
  uint24 internal _maxAutoSwapPercent;
  uint24 internal _minAutoAddLiquidityPercent;
  uint24 internal _maxAutoAddLiquidityPercent;
  uint32 internal _lastTaxDistribution;
  uint32 internal _tradingEnabled;
  uint32 internal _lastSwap;
  uint32 internal _earlyPenaltyTime;
  uint256 internal _totalSupply;
  uint256 internal _maxBalanceAmount;
  uint256 internal _minAutoSwapAmount;
  uint256 internal _maxAutoSwapAmount;
  uint256 internal _minAutoAddLiquidityAmount;
  uint256 internal _maxAutoAddLiquidityAmount;
  uint256 internal _amountForLiquidity;
  uint256 internal _ethForLiquidity;
  uint256 internal _totalTaxCollected;
  uint256 internal _totalTaxUnclaimed;
  uint256 internal _amountForTaxDistribution;
  uint256 internal _amountSwappedForTaxDistribution;
  uint256 internal _ethForTaxDistribution;

  struct Renounced {
    bool Whitelist;
    bool MaxBalance;
    bool Taxable;
    bool DEXRouterV2;
  }

  struct holderAccount {
    bool exists;
    bool penalty;
  }

  struct taxBeneficiary {
    bool exists;
    address account;
    uint24[3] percent; // 0: tx, 1: buy, 2: sell
    uint24[3] penalty;
    uint256 unclaimed;
  }

  struct DEXRouterV2 {
    address router;
    address pair;
    address WETH;
    address receiver;
  }

  Renounced internal _renounced;
  IERC20 internal _taxToken;
  DEXRouterV2 internal _dex;

  function _percentage(uint256 amount, uint256 bps) internal pure returns (uint256) {
    unchecked {
      return (amount * bps) / (100 * uint256(_denominator));
    }
  }

  function _timestamp() internal view returns (uint32) {
    unchecked {
      return uint32(block.timestamp % 2**32);
    }
  }

  function denominator() external pure returns (uint24) {
    return _denominator;
  }

  function version() external pure returns (string memory) {
    return _version;
  }
}

File 6 of 11 : CF_Ownable.sol
// SPDX-License-Identifier: MIT

import "./CF_Common.sol";

pragma solidity 0.8.24;

abstract contract CF_Ownable is CF_Common {
  address internal _owner;

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

  modifier onlyOwner() {
    require(_owner == msg.sender, "Unauthorized");

    _;
  }

  function owner() external view returns (address) {
    return _owner;
  }

  function renounceOwnership() external onlyOwner {
    _renounced.Whitelist = true;
    _renounced.MaxBalance = true;
    _renounced.Taxable = true;
    _renounced.DEXRouterV2 = true;

    _transferOwnership(address(0));
  }

  function transferOwnership(address newOwner) external onlyOwner {
    require(newOwner != address(0));

    _transferOwnership(newOwner);
  }

  function _transferOwnership(address newOwner) internal {
    address oldOwner = _owner;
    _owner = newOwner;

    emit OwnershipTransferred(oldOwner, newOwner);
  }
}

File 7 of 11 : CF_Taxable.sol
// SPDX-License-Identifier: MIT

pragma solidity 0.8.24;

import "./CF_Common.sol";
import "./CF_Ownable.sol";
import "./CF_ERC20.sol";

abstract contract CF_Taxable is CF_Common, CF_Ownable, CF_ERC20 {
  event SetTaxBeneficiary(uint8 slot, address account, uint24[3] percent, uint24[3] penalty);
  event SetEarlyPenaltyTime(uint32 time);
  event TaxDistributed(uint256 amount);
  event RenouncedTaxable();

  struct taxBeneficiaryView {
    address account;
    uint24[3] percent;
    uint24[3] penalty;
    uint256 unclaimed;
  }

  modifier lockDistributing {
    _distributing = true;
    _;
    _distributing = false;
  }

  /// @notice Permanently renounce and prevent the owner from being able to update the tax features
  /// @dev Existing settings will continue to be effective
  function renounceTaxable() external onlyOwner {
    _renounced.Taxable = true;

    emit RenouncedTaxable();
  }

  /// @notice Total amount of taxes collected so far
  function totalTaxCollected() external view returns (uint256) {
    return _totalTaxCollected;
  }
  /// @notice Tax applied per transfer
  /// @dev Taking in consideration your wallet address
  function txTax() external view returns (uint24) {
    return txTax(msg.sender);
  }

  /// @notice Tax applied per transfer
  /// @param from Sender address
  function txTax(address from) public view returns (uint24) {
    unchecked {
      return from == address(this) || _whitelisted[from] || from == _dex.pair ? 0 : (_holder[from].penalty || _tradingEnabled + _earlyPenaltyTime >= _timestamp() ? _totalPenaltyTxTax : _totalTxTax);
    }
  }

  /// @notice Tax applied for buying
  /// @dev Taking in consideration your wallet address
  function buyTax() external view returns (uint24) {
    return buyTax(msg.sender);
  }

  /// @notice Tax applied for buying
  /// @param from Buyer's address
  function buyTax(address from) public view returns (uint24) {
    if (_suspendTaxes) { return 0; }

    unchecked {
      return from == address(this) || _whitelisted[from] || from == _dex.pair ? 0 : (_holder[from].penalty || _tradingEnabled + _earlyPenaltyTime >= _timestamp() ? _totalPenaltyBuyTax : _totalBuyTax);
    }
  }
  /// @notice Tax applied for selling
  /// @dev Taking in consideration your wallet address
  function sellTax() external view returns (uint24) {
    return sellTax(msg.sender);
  }

  /// @notice Tax applied for selling
  /// @param to Seller's address
  function sellTax(address to) public view returns (uint24) {
    if (_suspendTaxes) { return 0; }

    unchecked {
      return to == address(this) || _whitelisted[to] || to == _dex.pair || to == _dex.router ? 0 : (_holder[to].penalty || _tradingEnabled + _earlyPenaltyTime >= _timestamp() ? _totalPenaltySellTax : _totalSellTax);
    }
  }

  /// @notice List of all tax beneficiaries and their assigned percentage, according to type of transfer
  /// @custom:return `list[].account` Beneficiary address
  /// @custom:return `list[].percent[3]` Index 0 is for tx tax, 1 is for buy tax, 2 is for sell tax, multiplied by denominator
  /// @custom:return `list[].penalty[3]` Index 0 is for tx penalty, 1 is for buy penalty, 2 is for sell penalty, multiplied by denominator
  function listTaxBeneficiaries() external view returns (taxBeneficiaryView[] memory list) {
    list = new taxBeneficiaryView[](6);

    unchecked {
      for (uint8 i; i < 6; i++) { list[i] = taxBeneficiaryView(_taxBeneficiary[i].account, _taxBeneficiary[i].percent, _taxBeneficiary[i].penalty, _taxBeneficiary[i].unclaimed); }
    }
  }

  /// @notice Sets a tax beneficiary
  /// @dev Maximum of 5 wallets can be assigned
  /// @dev Slot 0 is reserved for ChainFactory revenue
  /// @param slot Slot number (1 to 5)
  /// @param account Beneficiary address
  /// @param percent[3] Index 0 is for tx tax, 1 is for buy tax, 2 is for sell tax, multiplied by denominator
  /// @param penalty[3] Index 0 is for tx penalty, 1 is for buy penalty, 2 is for sell penalty, multiplied by denominator
  function setTaxBeneficiary(uint8 slot, address account, uint24[3] memory percent, uint24[3] memory penalty) external onlyOwner {
    require(!_renounced.Taxable);
    require(slot >= 1 && slot <= 5, "Reserved");

    _setTaxBeneficiary(slot, account, percent, penalty);
  }

  function _setTaxBeneficiary(uint8 slot, address account, uint24[3] memory percent, uint24[3] memory penalty) internal {
    require(slot <= 5);
    require(account != address(this) && account != address(0xdEaD) && account != address(0));

    taxBeneficiary storage taxBeneficiarySlot = _taxBeneficiary[slot];

    unchecked {
      _totalTxTax += percent[0] - taxBeneficiarySlot.percent[0];
      _totalBuyTax += percent[1] - taxBeneficiarySlot.percent[1];
      _totalSellTax += percent[2] - taxBeneficiarySlot.percent[2];
      _totalPenaltyTxTax += penalty[0] - taxBeneficiarySlot.penalty[0];
      _totalPenaltyBuyTax += penalty[1] - taxBeneficiarySlot.penalty[1];
      _totalPenaltySellTax += penalty[2] - taxBeneficiarySlot.penalty[2];

      require(_totalTxTax <= 25 * _denominator && ((_totalBuyTax <= 25 * _denominator && _totalSellTax <= 25 * _denominator) && (_totalBuyTax + _totalSellTax <= 25 * _denominator)), "High Tax");
      require(_totalPenaltyTxTax <= 90 * _denominator && _totalPenaltyBuyTax <= 90 * _denominator && _totalPenaltySellTax <= 90 * _denominator, "Invalid Penalty");

      taxBeneficiarySlot.account = account;
      taxBeneficiarySlot.percent = percent;

      if (_initialized && slot > 0) { _setTaxBeneficiary(0, _taxBeneficiary[0].account, [ uint24(0), uint24(0), uint24(0) ], [ _taxBeneficiary[0].penalty[0] + uint24((penalty[0] * 10 / 100) - (taxBeneficiarySlot.penalty[0] * 10 / 100)), _taxBeneficiary[0].penalty[1] + uint24((penalty[1] * 10 / 100) - (taxBeneficiarySlot.penalty[1] * 10 / 100)), _taxBeneficiary[0].penalty[2] + uint24((penalty[2] * 10 / 100) - (taxBeneficiarySlot.penalty[2] * 10 / 100)) ]); }

      taxBeneficiarySlot.penalty = penalty;
    }

    if (!taxBeneficiarySlot.exists) { taxBeneficiarySlot.exists = true; }

    emit SetTaxBeneficiary(slot, account, percent, penalty);
  }

  /// @notice Triggers the tax distribution
  /// @dev Will only be executed if there is no ongoing swap or tax distribution
  function autoTaxDistribute() external {
    require(msg.sender == _owner || _whitelisted[msg.sender], "Unauthorized");
    require(!_swapping && !_distributing);

    _autoTaxDistribute();
  }

  function _autoTaxDistribute() internal lockDistributing {
    if (_totalTaxUnclaimed == 0) { return; }

    unchecked {
      uint256 distributedTaxes;

      for (uint8 i; i < 6; i++) {
        taxBeneficiary storage taxBeneficiarySlot = _taxBeneficiary[i];
        address account = taxBeneficiarySlot.account;

        if (taxBeneficiarySlot.unclaimed == 0 || account == _dex.pair) { continue; }

        uint256 unclaimed = _percentage(address(_taxToken) == address(this) ? _amountForTaxDistribution : _amountSwappedForTaxDistribution, (100 * uint256(_denominator) * taxBeneficiarySlot.unclaimed) / _totalTaxUnclaimed);
        uint256 _distributedTaxes = _distribute(account, unclaimed);

        if (_distributedTaxes > 0) {
          taxBeneficiarySlot.unclaimed -= _distributedTaxes;
          distributedTaxes += _distributedTaxes;
        }
      }

      _lastTaxDistribution = _timestamp();

      if (distributedTaxes > 0) {
        _totalTaxUnclaimed -= distributedTaxes;

        emit TaxDistributed(distributedTaxes);
      }
    }
  }

  function _distribute(address account, uint256 unclaimed) private returns (uint256) {
    if (unclaimed == 0) { return 0; }

    unchecked {
      if (address(_taxToken) == address(this)) {
        if (_maxBalanceAmount > 0 && _balance[account] + unclaimed > _maxBalanceAmount && !_whitelisted[account]) {
          unclaimed = _maxBalanceAmount > _balance[account] ? _maxBalanceAmount - _balance[account] : 0;

          if (unclaimed == 0) { return 0; }
        }

        super._transfer(address(this), account, unclaimed);

        _amountForTaxDistribution -= unclaimed;
      } else {
        uint256 percent = (100 * uint256(_denominator) * unclaimed) / _amountSwappedForTaxDistribution;
        uint256 amount;

        if (address(_taxToken) == _dex.WETH) {
          amount = _percentage(_ethForTaxDistribution, percent);

          (bool success, ) = payable(account).call{ value: amount, gas: 30000 }("");

          if (!success) { return 0; }

          _ethForTaxDistribution -= amount;
        } else {
          amount = _percentage(_tokensForTaxDistribution[address(_taxToken)], percent);

          try _taxToken.transfer(account, amount) { _tokensForTaxDistribution[address(_taxToken)] -= amount; } catch { return 0; }
        }

        _amountSwappedForTaxDistribution -= unclaimed;
      }
    }

    return unclaimed;
  }

  /// @notice Suspend or reinstate tax collection
  /// @dev Also applies to early penalties
  /// @param status True to suspend, False to reinstate existent taxes
  function suspendTaxes(bool status) external onlyOwner {
    require(!_renounced.Taxable);

    _suspendTaxes = status;
  }

  /// @notice Checks if tax collection is currently suspended
  function taxesSuspended() external view returns (bool) {
    return _suspendTaxes;
  }

  /// @notice Removes the penalty status of a wallet
  /// @param account Address to depenalize
  function removePenalty(address account) external onlyOwner {
    require(!_renounced.Taxable);

    _holder[account].penalty = false;
  }

  /// @notice Check if a wallet is penalized due to an early transaction
  /// @param account Address to check
  function isPenalized(address account) external view returns (bool) {
    return _holder[account].penalty;
  }

  /// @notice Returns the period of time during which early buyers will be penalized from the time trading was enabled
  function getEarlyPenaltyTime() external view returns (uint32) {
    return _earlyPenaltyTime;
  }

  /// @notice Defines the period of time during which early buyers will be penalized from the time trading was enabled
  /// @dev Must be less or equal to 1 hour
  /// @param time Time, in seconds
  function setEarlyPenaltyTime(uint32 time) external onlyOwner {
    require(!_renounced.Taxable);
    require(time <= 600);

    _setEarlyPenaltyTime(time);
  }

  function _setEarlyPenaltyTime(uint32 time) internal {
    _earlyPenaltyTime = time;

    emit SetEarlyPenaltyTime(time);
  }
}

File 8 of 11 : CF_Whitelist.sol
// SPDX-License-Identifier: MIT

pragma solidity 0.8.24;

import "./CF_Common.sol";
import "./CF_Ownable.sol";

abstract contract CF_Whitelist is CF_Common, CF_Ownable {
  event Whitelisted(address indexed account, bool status);
  event RenouncedWhitelist();

  /// @notice Permanently renounce and prevent the owner from being able to update the whitelist
  /// @dev Existing entries will continue to be effective
  function renounceWhitelist() external onlyOwner {
    _renounced.Whitelist = true;

    emit RenouncedWhitelist();
  }

  /// @notice Check if an address is whitelisted
  /// @param account Address to check
  function isWhitelisted(address account) external view returns (bool) {
    return _whitelisted[account];
  }

  /// @notice Add or remove an address from the whitelist
  /// @param status True for adding, False for removing
  function whitelist(address account, bool status) public onlyOwner {
    _whitelist(account, status);
  }

  function _whitelist(address account, bool status) internal {
    require(!_renounced.Whitelist);
    require(account != address(0));
    require(account != _dex.router && account != _dex.pair, "DEX router and pair are privileged");


    _whitelisted[account] = status;

    emit Whitelisted(account, status);
  }

  /// @notice Add or remove multiple addresses from the whitelist
  /// @param status True for adding, False for removing
  function whitelist(address[] calldata accounts, bool status) external onlyOwner {
    unchecked {
      uint256 cnt = accounts.length;

      for (uint256 i; i < cnt; i++) { _whitelist(accounts[i], status); }
    }
  }

  function _initialWhitelist(address[1] memory accounts) internal {
    require(!_initialized);

    unchecked {
      for (uint256 i; i < 1; i++) { _whitelist(accounts[i], true); }
    }
  }
}

File 9 of 11 : CF_MaxBalance.sol
// SPDX-License-Identifier: MIT

pragma solidity 0.8.24;

import "./CF_Common.sol";
import "./CF_Ownable.sol";

abstract contract CF_MaxBalance is CF_Common, CF_Ownable {
  event SetMaxBalancePercent(uint24 percent);
  event RenouncedMaxBalance();

  /// @notice Permanently renounce and prevent the owner from being able to update the max. balance
  /// @dev Existing settings will continue to be effective
  function renounceMaxBalance() external onlyOwner {
    _renounced.MaxBalance = true;

    emit RenouncedMaxBalance();
  }

  /// @notice Percentage of the max. balance per wallet, depending on total supply
  function getMaxBalancePercent() external view returns (uint24) {
    return _maxBalancePercent;
  }

  /// @notice Set the max. percentage of a wallet balance, depending on total supply
  /// @param percent Desired percentage, multiplied by denominator (min. 0.1% of total supply, 0 to disable)
  function setMaxBalancePercent(uint24 percent) external onlyOwner {
    require(!_renounced.MaxBalance);

    unchecked {
      require(percent == 0 || (percent >= 100 && percent <= 100 * _denominator));
    }

    _setMaxBalancePercent(percent);

    emit SetMaxBalancePercent(percent);
  }

  function _setMaxBalancePercent(uint24 percent) internal {
    _maxBalancePercent = percent;
    _maxBalanceAmount = percent > 0 ? _percentage(_totalSupply, uint256(percent)) : 0;

    if (!_initialized) { emit SetMaxBalancePercent(percent); }
  }
}

File 10 of 11 : CF_DEXRouterV2.sol
// SPDX-License-Identifier: MIT

pragma solidity 0.8.24;

import "./CF_Common.sol";
import "./CF_Ownable.sol";
import "./CF_ERC20.sol";

abstract contract CF_DEXRouterV2 is CF_Common, CF_Ownable, CF_ERC20 {
  event AddedLiquidity(uint256 tokenAmount, uint256 ethAmount, uint256 liquidity);
  event SwappedTokensForNative(uint256 tokenAmount, uint256 ethAmount);
  event SwappedTokensForTokens(address token, uint256 token0Amount, uint256 token1Amount);
  event SetDEXRouterV2(address indexed router, address indexed pair, address receiver);
  event TradingEnabled();
  event RenouncedDEXRouterV2();

  modifier lockSwapping {
    _swapping = true;
    _;
    _swapping = false;
  }

  /// @notice Permanently renounce and prevent the owner from being able to update the DEX features
  /// @dev Existing settings will continue to be effective
  function renounceDEXRouterV2() external onlyOwner {
    _renounced.DEXRouterV2 = true;

    emit RenouncedDEXRouterV2();
  }

  function _setDEXRouterV2(address router, address receiver) internal returns (address) {
    require(router != address(0));

    if (_dex.router != router) {
      IDEXRouterV2 _router = IDEXRouterV2(router);
      IDEXFactoryV2 factory = IDEXFactoryV2(_router.factory());
      address WETH = _router.WETH();
      address pair = factory.getPair(address(this), WETH);

      if (pair == address(0)) { pair = factory.createPair(address(this), WETH); }

      _dex = DEXRouterV2(router, pair, WETH, receiver);
    }

    if (receiver != _dex.receiver) { _dex.receiver = receiver; }

    emit SetDEXRouterV2(router, _dex.pair, receiver);

    return _dex.pair;
  }

  /// @notice Returns the DEX router currently in use
  function getDEXRouterV2() external view returns (address) {
    return _dex.router;
  }

  /// @notice Returns the trading pair
  function getDEXPairV2() external view returns (address) {
    return _dex.pair;
  }

  /// @notice Returns address of the LP tokens receiver
  function getLPTokensReceiver() external view returns (address) {
    return _dex.receiver;
  }

  /// @notice Checks whether the token can be traded through the assigned DEX
  function isTradingEnabled() external view returns (bool) {
    return _tradingEnabled > 0;
  }

  /// @notice Checks the status of the auto-swapping feature
  function isAutoSwapEnabled() external view returns (bool) {
    return _autoSwapEnabled;
  }

  /// @notice Returns the percentage range of the total supply over which the auto-swap will operate when accumulating taxes in the contract balance
  function getAutoSwapPercent() external view returns (uint24 min, uint24 max) {
    return (_minAutoSwapPercent, _maxAutoSwapPercent);
  }

  /// @notice Sets the percentage range of the total supply over which the auto-swap will operate when accumulating taxes in the contract balance
  /// @param min Desired min. percentage to trigger the auto-swap, multiplied by denominator (0.001% to 1% of total supply)
  /// @param max Desired max. percentage to limit the auto-swap, multiplied by denominator (0.001% to 1% of total supply)
  function setAutoSwapPercent(uint24 min, uint24 max) external onlyOwner {
    require(!_renounced.DEXRouterV2);
    require(min >= 1 && min <= 1000, "0.001% to 1%");
    require(max >= min && max <= 1000, "0.001% to 1%");

    _setAutoSwapPercent(min, max);
  }

  function _setAutoSwapPercent(uint24 min, uint24 max) internal {
    _minAutoSwapPercent = min;
    _maxAutoSwapPercent = max;
    _minAutoSwapAmount = _percentage(_totalSupply, uint256(min));
    _maxAutoSwapAmount = _percentage(_totalSupply, uint256(max));
  }

  /// @notice Enables or disables the auto-swap function
  /// @param status True to enable, False to disable
  function enableAutoSwap(bool status) external onlyOwner {
    require(!_renounced.DEXRouterV2);
    require(!status || _dex.router != address(0), "No DEX");

    _autoSwapEnabled = status;
  }

  /// @notice Swaps the assigned amount to inject liquidity and prepare collected taxes for its distribution
  /// @dev Will only be executed if there is no ongoing swap or tax distribution and the min. threshold has been reached
  function autoSwap() external {
    require(_autoSwapEnabled && !_swapping && !_distributing);

    _autoSwap(false);
  }

  /// @notice Swaps the assigned amount to inject liquidity and prepare collected taxes for its distribution
  /// @dev Will only be executed if there is no ongoing swap or tax distribution and the min. threshold has been reached unless forced
  /// @param force Ignore the min. and max. threshold amount
  function autoSwap(bool force) external {
    require(msg.sender == _owner || _whitelisted[msg.sender], "Unauthorized");
    require((force || _autoSwapEnabled) && !_swapping && !_distributing);

    _autoSwap(force);
  }

  function _autoSwap(bool force) internal lockSwapping {
    if (!force && !_autoSwapEnabled) { return; }

    unchecked {
      uint256 amountForLiquidityToSwap = _amountForLiquidity > 0 ? _amountForLiquidity / 2 : 0;
      uint256 amountForTaxDistributionToSwap = (address(_taxToken) == _dex.WETH ? _amountForTaxDistribution : 0);
      uint256 amountToSwap = amountForTaxDistributionToSwap + amountForLiquidityToSwap;

      if (!force && amountToSwap > _maxAutoSwapAmount) {
        amountForLiquidityToSwap = amountForLiquidityToSwap > 0 ? _percentage(_maxAutoSwapAmount, (100 * uint256(_denominator) * amountForLiquidityToSwap) / amountToSwap) : 0;
        amountForTaxDistributionToSwap = amountForTaxDistributionToSwap > 0 ? _percentage(_maxAutoSwapAmount, (100 * uint256(_denominator) * amountForTaxDistributionToSwap) / amountToSwap) : 0;
        amountToSwap = amountForTaxDistributionToSwap + amountForLiquidityToSwap;
      }

      if ((force || amountToSwap >= _minAutoSwapAmount) && _balance[address(this)] >= amountToSwap + amountForLiquidityToSwap) {
        uint256 ethBalance = address(this).balance;
        address[] memory pathToSwapExactTokensForNative = new address[](2);
        pathToSwapExactTokensForNative[0] = address(this);
        pathToSwapExactTokensForNative[1] = _dex.WETH;

        _approve(address(this), _dex.router, amountToSwap);

        try IDEXRouterV2(_dex.router).swapExactTokensForETHSupportingFeeOnTransferTokens(amountToSwap, 0, pathToSwapExactTokensForNative, address(this), block.timestamp) {
          if (_amountForLiquidity > 0) { _amountForLiquidity -= amountForLiquidityToSwap; }

          uint256 ethAmount = address(this).balance - ethBalance;

          emit SwappedTokensForNative(amountToSwap, ethAmount);

          if (ethAmount > 0) {
            _ethForLiquidity += _percentage(ethAmount, (100 * uint256(_denominator) * amountForLiquidityToSwap) / amountToSwap);

            if (address(_taxToken) == _dex.WETH) {
              _ethForTaxDistribution += _percentage(ethAmount, (100 * uint256(_denominator) * amountForTaxDistributionToSwap) / amountToSwap);
              _amountSwappedForTaxDistribution += amountForTaxDistributionToSwap;
              _amountForTaxDistribution -= amountForTaxDistributionToSwap;
            }
          }
        } catch {
          _approve(address(this), _dex.router, 0);
        }
      }

      if (address(_taxToken) != address(this) && address(_taxToken) != _dex.WETH) {
        amountForTaxDistributionToSwap = _amountForTaxDistribution;

        if (!force && amountForTaxDistributionToSwap > _maxAutoSwapAmount) { amountForTaxDistributionToSwap = _maxAutoSwapAmount; }

        if ((force || amountForTaxDistributionToSwap >= _minAutoSwapAmount) && _balance[address(this)] >= amountForTaxDistributionToSwap) {
          uint256 tokenAmount = _swapTokensForTokens(_taxToken, amountForTaxDistributionToSwap);

          if (tokenAmount > 0) {
            _tokensForTaxDistribution[address(_taxToken)] += tokenAmount;
            _amountSwappedForTaxDistribution += amountForTaxDistributionToSwap;
            _amountForTaxDistribution -= amountForTaxDistributionToSwap;
          }
        }
      }
    }

    _addLiquidity(force);
    _lastSwap = _timestamp();
  }

  function _swapTokensForTokens(IERC20 token, uint256 amount) private returns (uint256 tokenAmount) {
    uint256 tokenBalance = token.balanceOf(address(this));
    address[] memory pathToSwapExactTokensForTokens = new address[](3);
    pathToSwapExactTokensForTokens[0] = address(this);
    pathToSwapExactTokensForTokens[1] = _dex.WETH;
    pathToSwapExactTokensForTokens[2] = address(token);

    _approve(address(this), _dex.router, amount);

    try IDEXRouterV2(_dex.router).swapExactTokensForTokensSupportingFeeOnTransferTokens(amount, 0, pathToSwapExactTokensForTokens, address(this), block.timestamp) {
      tokenAmount = token.balanceOf(address(this)) - tokenBalance;

      emit SwappedTokensForTokens(address(token), amount, tokenAmount);
    } catch {
      _approve(address(this), _dex.router, 0);
    }
  }

  function _addLiquidity(bool force) private {
    if (!force && (_amountForLiquidity < _minAutoAddLiquidityAmount || _ethForLiquidity == 0)) { return; }

    unchecked {
      uint256 amountForLiquidityToAdd = !force && _amountForLiquidity > _maxAutoAddLiquidityAmount ? _maxAutoAddLiquidityAmount : _amountForLiquidity;
      uint256 ethForLiquidityToAdd = !force && _amountForLiquidity > _maxAutoAddLiquidityAmount ? _percentage(_ethForLiquidity, 100 * uint256(_denominator) * (_maxAutoAddLiquidityAmount / _amountForLiquidity)) : _ethForLiquidity;

      _approve(address(this), _dex.router, amountForLiquidityToAdd);

      try IDEXRouterV2(_dex.router).addLiquidityETH{ value: ethForLiquidityToAdd }(address(this), amountForLiquidityToAdd, 0, 0, _dex.receiver, block.timestamp) returns (uint256 amountToken, uint256 amountETH, uint256 liquidity) {
        emit AddedLiquidity(amountToken, amountETH, liquidity);

        _amountForLiquidity -= amountForLiquidityToAdd;
        _ethForLiquidity -= ethForLiquidityToAdd;
      } catch {
        _approve(address(this), _dex.router, 0);
      }
    }
  }

  /// @notice Returns the percentage range of the total supply over which the auto add liquidity will operate when accumulating taxes in the contract balance
  /// @dev Applies only if a Tax Beneficiary is the liquidity pool
  function getAutoAddLiquidityPercent() external view returns (uint24 min, uint24 max) {
    return (_minAutoAddLiquidityPercent, _maxAutoAddLiquidityPercent);
  }

  /// @notice Sets the percentage range of the total supply over which the auto add liquidity will operate when accumulating taxes in the contract balance
  /// @param min Desired min. percentage to trigger the auto add liquidity, multiplied by denominator (0.01% to 100% of total supply)
  /// @param max Desired max. percentage to limit the auto add liquidity, multiplied by denominator (0.01% to 100% of total supply)
  function setAutoAddLiquidityPercent(uint24 min, uint24 max) external onlyOwner {
    require(!_renounced.DEXRouterV2);
    require(min >= 10 && min <= 100 * _denominator, "0.01% to 100%");
    require(max >= min && max <= 100 * _denominator, "0.01% to 100%");

    _setAutoAddLiquidityPercent(min, max);
  }

  function _setAutoAddLiquidityPercent(uint24 min, uint24 max) internal {
    _minAutoAddLiquidityPercent = min;
    _maxAutoAddLiquidityPercent = max;
    _minAutoAddLiquidityAmount = _percentage(_totalSupply, uint256(min));
    _maxAutoAddLiquidityAmount = _percentage(_totalSupply, uint256(max));
  }

  /// @notice Returns the token for tax distribution
  function getTaxToken() external view returns (address) {
    return address(_taxToken);
  }

  function _setTaxToken(address token) internal {
    require((!_initialized && token == address(0)) || token == address(this) || token == _dex.WETH || IDEXFactoryV2(IDEXRouterV2(_dex.router).factory()).getPair(_dex.WETH, token) != address(0), "No Pair");

    _taxToken = IERC20(token == address(0) ? address(this) : token);
  }

  /// @notice Enables the trading capability via the DEX set up
  /// @dev Once enabled, it cannot be reverted
  function enableTrading() external onlyOwner {
    require(!_renounced.DEXRouterV2);
    require(_tradingEnabled == 0, "Already enabled");

    _tradingEnabled = _timestamp();

    emit TradingEnabled();
  }
}

File 11 of 11 : CF_Recoverable.sol
// SPDX-License-Identifier: MIT

pragma solidity 0.8.24;

import "./CF_Common.sol";
import "./CF_Ownable.sol";

abstract contract CF_Recoverable is CF_Common, CF_Ownable {
  /// @notice Recovers a misplaced amount of an ERC-20 token sitting in the contract balance
  /// @dev Beware of scam tokens!
  /// @dev Note that if the token of this contract is specified, amounts allocated for tax distribution and liquidity are reserved
  /// @param token Address of the ERC-20 token
  /// @param to Recipient
  /// @param amount Amount to be transferred
  function recoverERC20(address token, address to, uint256 amount) external onlyOwner {
    unchecked {
      uint256 balance = IERC20(token).balanceOf(address(this));
      uint256 allocated = token == address(this) ? _amountForTaxDistribution + _amountForLiquidity : (address(_taxToken) == token ? _tokensForTaxDistribution[address(_taxToken)] : 0);

      require(balance - (allocated >= balance ? balance : allocated) >= amount, "Exceeds balance");
    }

    IERC20(token).transfer(to, amount);
  }

  /// @notice Recovers a misplaced amount of native tokens sitting in the contract balance
  /// @dev Note that if the reflection token is the wrapped native, amounts allocated for tax distribution and/or liquidity are reserved
  /// @param to Recipient
  /// @param amount Amount of native tokens to be transferred
  function recoverNative(address payable to, uint256 amount) external onlyOwner {
    unchecked {
      uint256 balance = address(this).balance;
      uint256 allocated = address(_taxToken) == _dex.WETH ? _ethForTaxDistribution : 0;

      require(balance - (allocated >= balance ? balance : allocated) >= amount, "Exceeds balance");
    }

    (bool success, ) = to.call{ value: amount }("");

    require(success);
  }
}

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

Contract Security Audit

Contract ABI

[{"inputs":[],"stateMutability":"nonpayable","type":"constructor"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"tokenAmount","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"ethAmount","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"liquidity","type":"uint256"}],"name":"AddedLiquidity","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"spender","type":"address"},{"indexed":false,"internalType":"uint256","name":"value","type":"uint256"}],"name":"Approval","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"previousOwner","type":"address"},{"indexed":true,"internalType":"address","name":"newOwner","type":"address"}],"name":"OwnershipTransferred","type":"event"},{"anonymous":false,"inputs":[],"name":"RenouncedDEXRouterV2","type":"event"},{"anonymous":false,"inputs":[],"name":"RenouncedMaxBalance","type":"event"},{"anonymous":false,"inputs":[],"name":"RenouncedTaxable","type":"event"},{"anonymous":false,"inputs":[],"name":"RenouncedWhitelist","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"router","type":"address"},{"indexed":true,"internalType":"address","name":"pair","type":"address"},{"indexed":false,"internalType":"address","name":"receiver","type":"address"}],"name":"SetDEXRouterV2","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint32","name":"time","type":"uint32"}],"name":"SetEarlyPenaltyTime","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint24","name":"percent","type":"uint24"}],"name":"SetMaxBalancePercent","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint8","name":"slot","type":"uint8"},{"indexed":false,"internalType":"address","name":"account","type":"address"},{"indexed":false,"internalType":"uint24[3]","name":"percent","type":"uint24[3]"},{"indexed":false,"internalType":"uint24[3]","name":"penalty","type":"uint24[3]"}],"name":"SetTaxBeneficiary","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"tokenAmount","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"ethAmount","type":"uint256"}],"name":"SwappedTokensForNative","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"token","type":"address"},{"indexed":false,"internalType":"uint256","name":"token0Amount","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"token1Amount","type":"uint256"}],"name":"SwappedTokensForTokens","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"}],"name":"TaxDistributed","type":"event"},{"anonymous":false,"inputs":[],"name":"TradingEnabled","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"from","type":"address"},{"indexed":true,"internalType":"address","name":"to","type":"address"},{"indexed":false,"internalType":"uint256","name":"value","type":"uint256"}],"name":"Transfer","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"account","type":"address"},{"indexed":false,"internalType":"bool","name":"status","type":"bool"}],"name":"Whitelisted","type":"event"},{"stateMutability":"payable","type":"fallback"},{"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":[],"name":"autoSwap","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bool","name":"force","type":"bool"}],"name":"autoSwap","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"autoTaxDistribute","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"balanceOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"buyTax","outputs":[{"internalType":"uint24","name":"","type":"uint24"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"}],"name":"buyTax","outputs":[{"internalType":"uint24","name":"","type":"uint24"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"decimals","outputs":[{"internalType":"uint8","name":"","type":"uint8"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"spender","type":"address"},{"internalType":"uint256","name":"subtractedValue","type":"uint256"}],"name":"decreaseAllowance","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"denominator","outputs":[{"internalType":"uint24","name":"","type":"uint24"}],"stateMutability":"pure","type":"function"},{"inputs":[{"internalType":"bool","name":"status","type":"bool"}],"name":"enableAutoSwap","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"enableTrading","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"getAutoAddLiquidityPercent","outputs":[{"internalType":"uint24","name":"min","type":"uint24"},{"internalType":"uint24","name":"max","type":"uint24"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getAutoSwapPercent","outputs":[{"internalType":"uint24","name":"min","type":"uint24"},{"internalType":"uint24","name":"max","type":"uint24"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getDEXPairV2","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getDEXRouterV2","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getEarlyPenaltyTime","outputs":[{"internalType":"uint32","name":"","type":"uint32"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getLPTokensReceiver","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getMaxBalancePercent","outputs":[{"internalType":"uint24","name":"","type":"uint24"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getTaxToken","outputs":[{"internalType":"address","name":"","type":"address"}],"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":"info","outputs":[{"internalType":"string","name":"name","type":"string"},{"internalType":"string","name":"symbol","type":"string"},{"internalType":"uint8","name":"decimals","type":"uint8"},{"internalType":"address","name":"owner","type":"address"},{"internalType":"uint256","name":"totalSupply","type":"uint256"},{"internalType":"string","name":"version","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"isAutoSwapEnabled","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"isPenalized","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"isTradingEnabled","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"isWhitelisted","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"listTaxBeneficiaries","outputs":[{"components":[{"internalType":"address","name":"account","type":"address"},{"internalType":"uint24[3]","name":"percent","type":"uint24[3]"},{"internalType":"uint24[3]","name":"penalty","type":"uint24[3]"},{"internalType":"uint256","name":"unclaimed","type":"uint256"}],"internalType":"struct CF_Taxable.taxBeneficiaryView[]","name":"list","type":"tuple[]"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"name","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"token","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"recoverERC20","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address payable","name":"to","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"recoverNative","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"removePenalty","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"renounceDEXRouterV2","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"renounceMaxBalance","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"renounceTaxable","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"renounceWhitelist","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"renounced","outputs":[{"internalType":"bool","name":"Whitelist","type":"bool"},{"internalType":"bool","name":"MaxBalance","type":"bool"},{"internalType":"bool","name":"DEXRouterV2","type":"bool"},{"internalType":"bool","name":"Taxable","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"to","type":"address"}],"name":"sellTax","outputs":[{"internalType":"uint24","name":"","type":"uint24"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"sellTax","outputs":[{"internalType":"uint24","name":"","type":"uint24"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint24","name":"min","type":"uint24"},{"internalType":"uint24","name":"max","type":"uint24"}],"name":"setAutoAddLiquidityPercent","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint24","name":"min","type":"uint24"},{"internalType":"uint24","name":"max","type":"uint24"}],"name":"setAutoSwapPercent","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint32","name":"time","type":"uint32"}],"name":"setEarlyPenaltyTime","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint24","name":"percent","type":"uint24"}],"name":"setMaxBalancePercent","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint8","name":"slot","type":"uint8"},{"internalType":"address","name":"account","type":"address"},{"internalType":"uint24[3]","name":"percent","type":"uint24[3]"},{"internalType":"uint24[3]","name":"penalty","type":"uint24[3]"}],"name":"setTaxBeneficiary","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bool","name":"status","type":"bool"}],"name":"suspendTaxes","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"symbol","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"taxesSuspended","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalTaxCollected","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"transfer","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"transferFrom","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"txTax","outputs":[{"internalType":"uint24","name":"","type":"uint24"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"}],"name":"txTax","outputs":[{"internalType":"uint24","name":"","type":"uint24"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"version","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"pure","type":"function"},{"inputs":[{"internalType":"address[]","name":"accounts","type":"address[]"},{"internalType":"bool","name":"status","type":"bool"}],"name":"whitelist","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"},{"internalType":"bool","name":"status","type":"bool"}],"name":"whitelist","outputs":[],"stateMutability":"nonpayable","type":"function"},{"stateMutability":"payable","type":"receive"}]

60c060405234801562000010575f80fd5b5060408051808201909152601881527f4675636b2041726f756e6420616e642046696e64204f757400000000000000006020820152601d90620000549082620010eb565b506040805180820190915260078152662320a327abaa2360c91b6020820152601e90620000829082620010eb565b50601260a0526a396c41bd9e54ada3800000600955620000b05f80516020620054d683398151915262000294565b620000cd5f80516020620054d6833981519152620186a0620002e5565b620000fb737a250d5630b4cf539739df2c5dacb4c659f2488d5f80516020620054d683398151915262000362565b506200010860b462000653565b6200012773c02aaa39b223fe8d0a0e5c4f27ead9083c756cc2620006ae565b6007805460ff65ffffffffffff60c81b0119167cfa00003200000000000000000000000000000000000000000000000001179055600954620186a060328202819004600b5560fa90910204600c556008805465ffffffffffff1916650186a0000064179055600954620186a060648202819004600d5590810204600e5560408051606080820183525f808352602080840182905283850182905284519283018552610bb880845290830181905293820193909352620001fd9291738881d9869ac7c7840971caac043d7f4d144abd109162000863565b60408051606080820183525f82526103e8602080840182905283850191909152835191820184526175308083529082018190529281019290925262000255916001915f80516020620054d68339815191529162000863565b60408051602081019091525f80516020620054d683398151915281526200027c9062000db6565b6200028961138862000e02565b60016080526200127e565b601c80546001600160a01b038381166001600160a01b0319831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0905f90a35050565b60805115620002f2575f80fd5b5f6200030c6009548362ffffff1662000e8760201b60201c565b6001600160a01b0384165f8181526020818152604080832085905551848152939450919290917fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef910160405180910390a3505050565b5f6001600160a01b03831662000376575f80fd5b6018546001600160a01b03848116911614620005c7575f8390505f816001600160a01b031663c45a01556040518163ffffffff1660e01b8152600401602060405180830381865afa158015620003ce573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190620003f49190620011b7565b90505f826001600160a01b031663ad5c46486040518163ffffffff1660e01b8152600401602060405180830381865afa15801562000434573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906200045a9190620011b7565b60405163e6a4390560e01b81523060048201526001600160a01b0380831660248301529192505f9184169063e6a43905906044016020604051808303815f875af1158015620004ab573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190620004d19190620011b7565b90506001600160a01b03811662000557576040516364e329cb60e11b81523060048201526001600160a01b03838116602483015284169063c9c65396906044016020604051808303815f875af11580156200052e573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190620005549190620011b7565b90505b604080516080810182526001600160a01b03808a168083529381166020830181905294811692820183905288166060909101819052601880546001600160a01b03199081169094179055601980548416909417909355601a805483169091179055601b8054909116909117905550505b601b546001600160a01b03838116911614620005f957601b80546001600160a01b0319166001600160a01b0384161790555b6019546040516001600160a01b038481168252918216918516907fd0cdc441c8110da5df2f4a64e1cee8a6794d8016c982757bb5d8971cde6b6bf39060200160405180910390a3506019546001600160a01b031692915050565b6008805463ffffffff60901b1916600160901b63ffffffff8416908102919091179091556040519081527f703cced883e2faf6a2d5c676ef2f9dd7cfafa0acecee468ece9314ecf462ba91906020015b60405180910390a150565b608051158015620006c657506001600160a01b038116155b80620006da57506001600160a01b03811630145b80620006f35750601a546001600160a01b038281169116145b80620007eb57506018546040805163c45a015560e01b815290515f926001600160a01b03169163c45a01559160048083019260209291908290030181865afa15801562000742573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190620007689190620011b7565b601a5460405163e6a4390560e01b81526001600160a01b039182166004820152848216602482015291169063e6a43905906044016020604051808303815f875af1158015620007b9573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190620007df9190620011b7565b6001600160a01b031614155b620008275760405162461bcd60e51b81526020600482015260076024820152662737902830b4b960c91b60448201526064015b60405180910390fd5b6001600160a01b038116156200083e578062000840565b305b601780546001600160a01b0319166001600160a01b039290921691909117905550565b60058460ff16111562000874575f80fd5b6001600160a01b03831630148015906200089957506001600160a01b03831661dead14155b8015620008ae57506001600160a01b03831615155b620008b7575f80fd5b60ff84165f9081526004602090815260409182902060018101805486516007805467010000000000000080820462ffffff908116958116909403949094018316840262ffffff60381b198216811780845586548c8a01516a0100000000000000000000928390048716630100000092839004881690910301861690910265ffffffffffff60381b1990931662ffffff60501b19909216919091179190911780835594548a890151600160681b808804861666010000000000009384900487169092039190910185160262ffffff60681b19871681178085556002890180548d51600160801b938490048916918916900301871690910265ffffffffffff60681b1990981662ffffff60801b1990921691909117969096178084558654988b0151600160981b808304871694909a048616900392909201841690970262ffffff60981b19821681178084559554988a015165ffffffffffff60981b1990921662ffffff60b01b1990911617969097048216909603600160b01b938490048216018116909202939093179384905590926161a8929004161180159062000ac757506007546161a86a010000000000000000000090910462ffffff161180159062000a9057506007546161a8600160681b90910462ffffff1611155b801562000ac757506007546161a86a0100000000000000000000820462ffffff908116600160681b90930481169290920190911611155b62000b005760405162461bcd60e51b8152602060048201526008602482015267090d2ced040a8c2f60c31b60448201526064016200081e565b60075462015f90600160801b90910462ffffff161180159062000b35575060075462015f90600160981b90910462ffffff1611155b801562000b54575060075462015f90600160b01b90910462ffffff1611155b62000b945760405162461bcd60e51b815260206004820152600f60248201526e496e76616c69642050656e616c747960881b60448201526064016200081e565b8054610100600160a81b0319166101006001600160a01b0386160217815562000bc36001820184600362000f98565b50608051801562000bd657505f8560ff16115b1562000d48575f808052600460209081527f17ef568e3e12ab5b9c7254a8d58478811de00f9e6eb34345acd53bf8fd09d3ec5460408051606080820183528582529381018590528082018590528151938401909152600285015462000d4894936101009093046001600160a01b031692908190606490600a62ffffff9182160216046064895f6020020151600a0262ffffff168162000c795762000c79620011fa565b5f808052600460208181525f80516020620054b68339815191525462ffffff8082169690950496909603949094018316865260028c01548d850151928052908452630100000094859004831660649582048416600a9081028516879004938102851687900493909303018316938601939093526040808d01519501946601000000000000909304821681028216849004939202165f805260046020525f80516020620054b68339815191525462ffffff6601000000000000909104811692909104929092030116905262000863565b62000d596002820183600362000f98565b50805460ff1662000d7057805460ff191660011781555b7f30034b3ad500b0a06492ddcfbb1eedee788dff84a77d76d5c3658ab517cec51a8585858560405162000da794939291906200123d565b60405180910390a15050505050565b6080511562000dc3575f80fd5b5f5b600181101562000dfe5762000df582826001811062000de85762000de8620011e6565b6020020151600162000e91565b60010162000dc5565b5050565b6007805462ffffff60201b191664010000000062ffffff84169081029190911790915562000e31575f62000e43565b600954620186a062ffffff8316909102045b600a5560805162000e845760405162ffffff821681527fd03edfeea801807308f0e9302e347c8a12ad32508cae5bce26e9e2a3654158c990602001620006a3565b50565b620186a091020490565b60165460ff161562000ea1575f80fd5b6001600160a01b03821662000eb4575f80fd5b6018546001600160a01b0383811691161480159062000ee157506019546001600160a01b03838116911614155b62000f3a5760405162461bcd60e51b815260206004820152602260248201527f44455820726f7574657220616e642070616972206172652070726976696c6567604482015261195960f21b60648201526084016200081e565b6001600160a01b0382165f81815260026020908152604091829020805460ff191685151590811790915591519182527fa54714518c5d275fdcd3d2a461e4858e4e8cb04fb93cd0bca9d6d34115f26440910160405180910390a25050565b60018301918390821562001025579160200282015f5b8382111562000ff257835183826101000a81548162ffffff021916908362ffffff160217905550926020019260030160208160020104928301926001030262000fae565b8015620010235782816101000a81549062ffffff021916905560030160208160020104928301926001030262000ff2565b505b506200103392915062001037565b5090565b5b8082111562001033575f815560010162001038565b634e487b7160e01b5f52604160045260245ffd5b600181811c908216806200107657607f821691505b6020821081036200109557634e487b7160e01b5f52602260045260245ffd5b50919050565b601f821115620010e657805f5260205f20601f840160051c81016020851015620010c25750805b601f840160051c820191505b81811015620010e3575f8155600101620010ce565b50505b505050565b81516001600160401b038111156200110757620011076200104d565b6200111f8162001118845462001061565b846200109b565b602080601f83116001811462001155575f84156200113d5750858301515b5f19600386901b1c1916600185901b178555620011af565b5f85815260208120601f198616915b82811015620011855788860151825594840194600190910190840162001164565b5085821015620011a357878501515f19600388901b60f8161c191681555b505060018460011b0185555b505050505050565b5f60208284031215620011c8575f80fd5b81516001600160a01b0381168114620011df575f80fd5b9392505050565b634e487b7160e01b5f52603260045260245ffd5b634e487b7160e01b5f52601260045260245ffd5b805f5b60038110156200123757815162ffffff1684526020938401939091019060010162001211565b50505050565b60ff851681526001600160a01b038416602082015261010081016200126660408301856200120e565b6200127560a08301846200120e565b95945050505050565b60805160a051614208620012ae5f395f81816104e40152610f8801525f818161240d0152612cc101526142085ff3fe60806040526004361061035f575f3560e01c806377004851116101c3578063b81a0145116100f5578063d6a018eb11610099578063f2fde38b1161006b578063f2fde38b14610a75578063f3dc4f4814610a94578063f59c370814610ad0578063f7de0e5714610aef57005b8063d6a018eb14610a04578063d8454a8214610a23578063dd62ed3e14610a37578063f2cda82e14610a5657005b8063c77e006d116100d2578063c77e006d14610975578063c78fe0d414610989578063cc1776d31461099d578063d232c220146109b157005b8063b81a01451461091c578063be5e49b214610939578063c29215831461095857005b806395d89b4111610167578063a457c2d711610139578063a457c2d7146108a0578063a4d8971a146108bf578063a5596b4f146108de578063a9059cbb146108fd57005b806395d89b411461084057806396ce07951461085457806397a26b9e146108685780639c5ef8d71461088c57005b80638bf1acff116101a05780638bf1acff146107d15780638d8350ca146107e55780638da5cb5b1461080457806395101f901461082157005b806377004851146107955780638324c3b9146107a95780638a8c523c146107bd57005b806339137f8b1161029c57806354fd4d50116102405780636f05be97116102125780636f05be971461070b57806370a082311461072c578063715018a61461076057806375de14961461077457005b806354fd4d501461065d5780635a0d4f881461068a5780635b90fe66146106bb5780635f641758146106ec57005b80633ed8a169116102795780633ed8a169146105e057806344b691ff146105ff5780634b7d9db41461061e5780634f7041a51461063557005b806339137f8b14610576578063395093511461058a5780633af32abf146105a957005b8063186488a8116103035780632984207a116102e05780632984207a146104b2578063313ce567146104d157806332acf3de1461050e578063370158ea1461055057005b8063186488a81461045557806323b872dd146104745780632623e9751461049357005b806307e9652c1161033c57806307e9652c146103dc578063095ea7b3146103f95780631171bda91461041857806318160ddd1461043757005b806301b38af514610368578063064a59d01461038757806306fdde03146103bb57005b3661036657005b005b348015610373575f80fd5b50610366610382366004613b7f565b610b0c565b348015610392575f80fd5b50600854600160501b900463ffffffff1615155b60405190151581526020015b60405180910390f35b3480156103c6575f80fd5b506103cf610b89565b6040516103b29190613c41565b3480156103e7575f80fd5b5060075462010000900460ff166103a6565b348015610404575f80fd5b506103a6610413366004613c6e565b610c19565b348015610423575f80fd5b50610366610432366004613c98565b610c2f565b348015610442575f80fd5b506009545b6040519081526020016103b2565b348015610460575f80fd5b5061036661046f366004613d6b565b610dc1565b34801561047f575f80fd5b506103a661048e366004613c98565b610e5b565b34801561049e575f80fd5b506103666104ad366004613dc8565b610e7c565b3480156104bd575f80fd5b506103666104cc366004613de3565b610f1b565b3480156104dc575f80fd5b5060405160ff7f00000000000000000000000000000000000000000000000000000000000000001681526020016103b2565b348015610519575f80fd5b5060075462ffffff600160c81b8204811691600160e01b9004165b6040805162ffffff9384168152929091166020830152016103b2565b34801561055b575f80fd5b50610564610f7a565b6040516103b296959493929190613e06565b348015610581575f80fd5b50610366611105565b348015610595575f80fd5b506103a66105a4366004613c6e565b611166565b3480156105b4575f80fd5b506103a66105c3366004613e6a565b6001600160a01b03165f9081526002602052604090205460ff1690565b3480156105eb575f80fd5b506103666105fa366004613e85565b61117d565b34801561060a575f80fd5b50610366610619366004613e9e565b611233565b348015610629575f80fd5b5060075460ff166103a6565b348015610640575f80fd5b5061064961137f565b60405162ffffff90911681526020016103b2565b348015610668575f80fd5b50604080518082019091526005815264189718171960d91b60208201526103cf565b348015610695575f80fd5b506017546001600160a01b03165b6040516001600160a01b0390911681526020016103b2565b3480156106c6575f80fd5b50600854600160901b900463ffffffff1660405163ffffffff90911681526020016103b2565b3480156106f7575f80fd5b50610649610706366004613e6a565b61138e565b348015610716575f80fd5b5061071f611489565b6040516103b29190613ef6565b348015610737575f80fd5b50610447610746366004613e6a565b6001600160a01b03165f9081526020819052604090205490565b34801561076b575f80fd5b5061036661161a565b34801561077f575f80fd5b50600754640100000000900462ffffff16610649565b3480156107a0575f80fd5b50610366611662565b3480156107b4575f80fd5b506103666116a3565b3480156107c8575f80fd5b50610366611708565b3480156107dc575f80fd5b506106496117df565b3480156107f0575f80fd5b506106496107ff366004613e6a565b6117e5565b34801561080f575f80fd5b50601c546001600160a01b03166106a3565b34801561082c575f80fd5b5061064961083b366004613e6a565b6118a8565b34801561084b575f80fd5b506103cf611984565b34801561085f575f80fd5b506103e8610649565b348015610873575f80fd5b5060085462ffffff808216916301000000900416610534565b348015610897575f80fd5b50610366611993565b3480156108ab575f80fd5b506103a66108ba366004613c6e565b611a08565b3480156108ca575f80fd5b506103666108d9366004613dc8565b611a68565b3480156108e9575f80fd5b506103666108f8366004613dc8565b611af4565b348015610908575f80fd5b506103a6610917366004613c6e565b611b4f565b348015610927575f80fd5b50601b546001600160a01b03166106a3565b348015610944575f80fd5b50610366610953366004613e6a565b611b5b565b348015610963575f80fd5b506019546001600160a01b03166106a3565b348015610980575f80fd5b50610366611bbb565b348015610994575f80fd5b50610366611c1e565b3480156109a8575f80fd5b50610649611c85565b3480156109bc575f80fd5b506016546040805160ff8084161515825261010084048116151560208301526301000000840481161515928201929092526201000090920416151560608201526080016103b2565b348015610a0f575f80fd5b50610366610a1e366004613e9e565b611c8f565b348015610a2e575f80fd5b50601154610447565b348015610a42575f80fd5b50610447610a51366004613f75565b611de6565b348015610a61575f80fd5b50610366610a70366004613c6e565b611e10565b348015610a80575f80fd5b50610366610a8f366004613e6a565b611ef5565b348015610a9f575f80fd5b506103a6610aae366004613e6a565b6001600160a01b03165f90815260036020526040902054610100900460ff1690565b348015610adb575f80fd5b50610366610aea366004613fac565b611f3a565b348015610afa575f80fd5b506018546001600160a01b03166106a3565b601c546001600160a01b03163314610b3f5760405162461bcd60e51b8152600401610b3690613fd8565b60405180910390fd5b815f5b81811015610b8257610b7a858583818110610b5f57610b5f613ffe565b9050602002016020810190610b749190613e6a565b84611f6a565b600101610b42565b5050505050565b6060601d8054610b9890614012565b80601f0160208091040260200160405190810160405280929190818152602001828054610bc490614012565b8015610c0f5780601f10610be657610100808354040283529160200191610c0f565b820191905f5260205f20905b815481529060010190602001808311610bf257829003601f168201915b5050505050905090565b5f610c2533848461206c565b5060015b92915050565b601c546001600160a01b03163314610c595760405162461bcd60e51b8152600401610b3690613fd8565b6040516370a0823160e01b81523060048201525f906001600160a01b038516906370a0823190602401602060405180830381865afa158015610c9d573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610cc19190614044565b90505f6001600160a01b0385163014610d0e576017546001600160a01b03868116911614610cef575f610d16565b6017546001600160a01b03165f90815260056020526040902054610d16565b600f54601354015b90508282821015610d275781610d29565b825b83031015610d495760405162461bcd60e51b8152600401610b369061405b565b505060405163a9059cbb60e01b81526001600160a01b0383811660048301526024820183905284169063a9059cbb906044016020604051808303815f875af1158015610d97573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610dbb9190614084565b50505050565b601c546001600160a01b03163314610deb5760405162461bcd60e51b8152600401610b3690613fd8565b60165462010000900460ff1615610e00575f80fd5b60018460ff1610158015610e18575060058460ff1611155b610e4f5760405162461bcd60e51b815260206004820152600860248201526714995cd95c9d995960c21b6044820152606401610b36565b610dbb848484846120cd565b5f610e6784338461262d565b610e72848484612690565b5060019392505050565b601c546001600160a01b03163314610ea65760405162461bcd60e51b8152600401610b3690613fd8565b6016546301000000900460ff1615610ebc575f80fd5b801580610ed357506018546001600160a01b031615155b610f085760405162461bcd60e51b815260206004820152600660248201526509cde40888ab60d31b6044820152606401610b36565b6007805460ff1916911515919091179055565b601c546001600160a01b03163314610f455760405162461bcd60e51b8152600401610b3690613fd8565b60165462010000900460ff1615610f5a575f80fd5b6102588163ffffffff161115610f6e575f80fd5b610f7781612c24565b50565b6060805f805f6060601d601e7f0000000000000000000000000000000000000000000000000000000000000000601c5f9054906101000a90046001600160a01b031660095460405180604001604052806005815260200164189718171960d91b815250858054610fe990614012565b80601f016020809104026020016040519081016040528092919081815260200182805461101590614012565b80156110605780601f1061103757610100808354040283529160200191611060565b820191905f5260205f20905b81548152906001019060200180831161104357829003601f168201915b5050505050955084805461107390614012565b80601f016020809104026020016040519081016040528092919081815260200182805461109f90614012565b80156110ea5780601f106110c1576101008083540402835291602001916110ea565b820191905f5260205f20905b8154815290600101906020018083116110cd57829003601f168201915b50505050509450955095509550955095509550909192939495565b601c546001600160a01b0316331461112f5760405162461bcd60e51b8152600401610b3690613fd8565b6016805460ff191660011790556040517f951371dba26ef6174e32c5005af266bb9a0405124df206f136f85716d9c96093905f90a1565b5f610c253384846111773388611de6565b0161206c565b601c546001600160a01b031633146111a75760405162461bcd60e51b8152600401610b3690613fd8565b601654610100900460ff16156111bb575f80fd5b62ffffff811615806111e6575060648162ffffff16101580156111e65750620186a062ffffff821611155b6111ee575f80fd5b6111f781612c78565b60405162ffffff821681527fd03edfeea801807308f0e9302e347c8a12ad32508cae5bce26e9e2a3654158c9906020015b60405180910390a150565b601c546001600160a01b0316331461125d5760405162461bcd60e51b8152600401610b3690613fd8565b6016546301000000900460ff1615611273575f80fd5b60018262ffffff161015801561129057506103e88262ffffff1611155b6112cb5760405162461bcd60e51b815260206004820152600c60248201526b302e3030312520746f20312560a01b6044820152606401610b36565b8162ffffff168162ffffff16101580156112ec57506103e88162ffffff1611155b6113275760405162461bcd60e51b815260206004820152600c60248201526b302e3030312520746f20312560a01b6044820152606401610b36565b6007805465ffffffffffff60c81b1916600160c81b62ffffff80861691820262ffffff60e01b191692909217600160e01b92851692830217909255600954620186a0928102839004600b550204600c555050565b5050565b5f611389336118a8565b905090565b6007545f9062010000900460ff16156113a857505f919050565b6001600160a01b0382163014806113d657506001600160a01b0382165f9081526002602052604090205460ff165b806113ee57506019546001600160a01b038381169116145b8061140657506018546001600160a01b038381169116145b611482576001600160a01b0382165f90815260036020526040902054610100900460ff1680611456575060085463ffffffff428116600160901b83048216600160501b9093048216929092011610155b61146e57600754600160681b900462ffffff16610c29565b600754600160b01b900462ffffff16610c29565b5f92915050565b60408051600680825260e08201909252606091816020015b6114a9613a71565b8152602001906001900390816114a15790505090505f5b60068160ff161015611616576040805160808101825260ff83165f81815260046020818152858320805461010090046001600160a01b03168652938352908152845160608101958690529394908501939260010191600391908390855b82829054906101000a900462ffffff1662ffffff168152602001906003019060208260020104928301926001038202915080841161151d579050505050918352505060ff83165f9081526004602090815260409182902082516060810190935292019160020160038282826020028201915f905b82829054906101000a900462ffffff1662ffffff16815260200190600301906020826002010492830192600103820291508084116115915750505092845250505060ff83165f818152600460209081526040909120600301549201919091528351849190811061160357611603613ffe565b60209081029190910101526001016114c0565b5090565b601c546001600160a01b031633146116445760405162461bcd60e51b8152600401610b3690613fd8565b6016805463ffffffff191663010101011790556116605f612d19565b565b60075460ff16801561167c5750600754610100900460ff16155b801561169257506007546301000000900460ff16155b61169a575f80fd5b6116605f612d6a565b601c546001600160a01b031633146116cd5760405162461bcd60e51b8152600401610b3690613fd8565b6016805462ff00001916620100001790556040517fb18b29d65a3b95dc80df0b9528f12b8592bd02395ca19228958e8b7cdf3ddd2b905f90a1565b601c546001600160a01b031633146117325760405162461bcd60e51b8152600401610b3690613fd8565b6016546301000000900460ff1615611748575f80fd5b600854600160501b900463ffffffff16156117975760405162461bcd60e51b815260206004820152600f60248201526e105b1c9958591e48195b98589b1959608a1b6044820152606401610b36565b6008805463ffffffff60501b1916600160501b63ffffffff4216021790556040517f799663458a5ef2936f7fa0c99b3336c69c25890f82974f04e811e5bb359186c7905f90a1565b5f611389335b5f6001600160a01b03821630148061181457506001600160a01b0382165f9081526002602052604090205460ff165b8061182c57506019546001600160a01b038381169116145b611482576001600160a01b0382165f90815260036020526040902054610100900460ff168061187c575060085463ffffffff428116600160901b83048216600160501b9093048216929092011610155b61189457600754600160381b900462ffffff16610c29565b600754600160801b900462ffffff16610c29565b6007545f9062010000900460ff16156118c257505f919050565b6001600160a01b0382163014806118f057506001600160a01b0382165f9081526002602052604090205460ff165b8061190857506019546001600160a01b038381169116145b611482576001600160a01b0382165f90815260036020526040902054610100900460ff1680611958575060085463ffffffff428116600160901b83048216600160501b9093048216929092011610155b61197057600754600160501b900462ffffff16610c29565b600754600160981b900462ffffff16610c29565b6060601e8054610b9890614012565b601c546001600160a01b03163314806119ba5750335f9081526002602052604090205460ff165b6119d65760405162461bcd60e51b8152600401610b3690613fd8565b600754610100900460ff161580156119f857506007546301000000900460ff16155b611a00575f80fd5b611660613164565b5f80611a143385611de6565b905082811015611a5b5760405162461bcd60e51b81526020600482015260126024820152714e6567617469766520616c6c6f77616e636560701b6044820152606401610b36565b610e72338585840361206c565b601c546001600160a01b0316331480611a8f5750335f9081526002602052604090205460ff165b611aab5760405162461bcd60e51b8152600401610b3690613fd8565b8080611ab9575060075460ff165b8015611acd5750600754610100900460ff16155b8015611ae357506007546301000000900460ff16155b611aeb575f80fd5b610f7781612d6a565b601c546001600160a01b03163314611b1e5760405162461bcd60e51b8152600401610b3690613fd8565b60165462010000900460ff1615611b33575f80fd5b60078054911515620100000262ff000019909216919091179055565b5f610c25338484612690565b601c546001600160a01b03163314611b855760405162461bcd60e51b8152600401610b3690613fd8565b60165462010000900460ff1615611b9a575f80fd5b6001600160a01b03165f908152600360205260409020805461ff0019169055565b601c546001600160a01b03163314611be55760405162461bcd60e51b8152600401610b3690613fd8565b6016805461ff0019166101001790556040517f6754c879eecdc6d0fbd95c51f8e377373a9f6be654462f792774fe3740e317ee905f90a1565b601c546001600160a01b03163314611c485760405162461bcd60e51b8152600401610b3690613fd8565b6016805463ff000000191663010000001790556040517ff7f7205ed48f7a35df9b5857667bdee0189d5d7cd80588f217a82641c3b4d08c905f90a1565b5f6113893361138e565b601c546001600160a01b03163314611cb95760405162461bcd60e51b8152600401610b3690613fd8565b6016546301000000900460ff1615611ccf575f80fd5b600a8262ffffff1610158015611cfb5750611ced6103e860646140b3565b62ffffff168262ffffff1611155b611d375760405162461bcd60e51b815260206004820152600d60248201526c302e30312520746f203130302560981b6044820152606401610b36565b8162ffffff168162ffffff1610158015611d675750611d596103e860646140b3565b62ffffff168162ffffff1611155b611da35760405162461bcd60e51b815260206004820152600d60248201526c302e30312520746f203130302560981b6044820152606401610b36565b61137b82826008805462ffffff9283166301000000810265ffffffffffff1990921694909316938417179055600954620186a0928102839004600d550204600e55565b6001600160a01b039182165f90815260016020908152604080832093909416825291909152205490565b601c546001600160a01b03163314611e3a5760405162461bcd60e51b8152600401610b3690613fd8565b601a5460175447915f916001600160a01b03908116911614611e5c575f611e60565b6015545b90508282821015611e715781611e73565b825b83031015611e935760405162461bcd60e51b8152600401610b369061405b565b50505f826001600160a01b0316826040515f6040518083038185875af1925050503d805f8114611ede576040519150601f19603f3d011682016040523d82523d5f602084013e611ee3565b606091505b5050905080611ef0575f80fd5b505050565b601c546001600160a01b03163314611f1f5760405162461bcd60e51b8152600401610b3690613fd8565b6001600160a01b038116611f31575f80fd5b610f7781612d19565b601c546001600160a01b03163314611f645760405162461bcd60e51b8152600401610b3690613fd8565b61137b82825b60165460ff1615611f79575f80fd5b6001600160a01b038216611f8b575f80fd5b6018546001600160a01b03838116911614801590611fb757506019546001600160a01b03838116911614155b61200e5760405162461bcd60e51b815260206004820152602260248201527f44455820726f7574657220616e642070616972206172652070726976696c6567604482015261195960f21b6064820152608401610b36565b6001600160a01b0382165f81815260026020908152604091829020805460ff191685151590811790915591519182527fa54714518c5d275fdcd3d2a461e4858e4e8cb04fb93cd0bca9d6d34115f26440910160405180910390a25050565b6001600160a01b038381165f8181526001602090815260408083209487168084529482529182902085905590518481527f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92591015b60405180910390a3505050565b60058460ff1611156120dd575f80fd5b6001600160a01b038316301480159061210157506001600160a01b03831661dead14155b801561211557506001600160a01b03831615155b61211d575f80fd5b60ff84165f90815260046020908152604091829020600181018054865160078054600160381b80820462ffffff908116958116909403949094018316840269ffffff00000000000000198216811780845586548c8a0151600160501b92839004871663010000009283900488169091030186169091026cffffffffffff000000000000001990931662ffffff60501b19909216919091179190911780835594548a890151600160681b8088048616600160301b9384900487169092039190910185160262ffffff60681b19871681178085556002890180548d51600160801b938490048916918916900301871690910265ffffffffffff60681b1990981662ffffff60801b1990921691909117969096178084558654988b0151600160981b808304871694909a048616900392909201841690970262ffffff60981b19821681178084559554988a015165ffffffffffff60981b1990921662ffffff60b01b1990911617969097048216909603600160b01b938490048216018116909202939093179384905590926161a8929004161180159061231657506007546161a8600160501b90910462ffffff16118015906122e757506007546161a8600160681b90910462ffffff1611155b801561231657506007546161a8600160501b820462ffffff908116600160681b90930481169290920190911611155b61234d5760405162461bcd60e51b8152602060048201526008602482015267090d2ced040a8c2f60c31b6044820152606401610b36565b60075462015f90600160801b90910462ffffff1611801590612381575060075462015f90600160981b90910462ffffff1611155b801561239f575060075462015f90600160b01b90910462ffffff1611155b6123dd5760405162461bcd60e51b815260206004820152600f60248201526e496e76616c69642050656e616c747960881b6044820152606401610b36565b8054610100600160a81b0319166101006001600160a01b0386160217815561240a60018201846003613aac565b507f0000000000000000000000000000000000000000000000000000000000000000801561243a57505f8560ff16115b156125c4575f808052600460209081527f17ef568e3e12ab5b9c7254a8d58478811de00f9e6eb34345acd53bf8fd09d3ec546040805160608082018352858252938101859052808201859052815193840190915260028501546125c494936101009093046001600160a01b031692908190606490600a62ffffff9182160216046064895f6020020151600a0262ffffff16816124d8576124d86140d2565b5f808052600460208181527f17ef568e3e12ab5b9c7254a8d58478811de00f9e6eb34345acd53bf8fd09d3ee5462ffffff8082169690950496909603949094018316865260028c01548d850151928052908452630100000094859004831660649582048416600a9081028516879004938102851687900493909303018316938601939093526040808d0151950194600160301b909304821681028216849004939202165f805260046020527f17ef568e3e12ab5b9c7254a8d58478811de00f9e6eb34345acd53bf8fd09d3ee5462ffffff600160301b90910481169290910492909203011690526120cd565b6125d360028201836003613aac565b50805460ff166125e957805460ff191660011781555b7f30034b3ad500b0a06492ddcfbb1eedee788dff84a77d76d5c3658ab517cec51a8585858560405161261e94939291906140e6565b60405180910390a15050505050565b5f6126388484611de6565b9050818110156126835760405162461bcd60e51b8152602060048201526016602482015275496e73756666696369656e7420616c6c6f77616e636560501b6044820152606401610b36565b610dbb848484840361206c565b6007546301000000900460ff161580156126b25750600754610100900460ff16155b80156126e557506019546001600160a01b038481169116148015906126e557506018546001600160a01b03848116911614155b156126fb576126f35f612d6a565b6126fb613164565b5f8111801561272257506001600160a01b0383165f9081526002602052604090205460ff16155b801561274657506001600160a01b0382165f9081526002602052604090205460ff16155b801561275b57506001600160a01b0383163014155b801561277057506001600160a01b0382163014155b801561278a57506018546001600160a01b03838116911614155b15612c19576019546001600160a01b038481169116148015906127bb57506019546001600160a01b03838116911614155b8061280457506019546001600160a01b03848116911614806127ea57506019546001600160a01b038381169116145b80156128045750600854600160501b900463ffffffff1615155b6128435760405162461bcd60e51b815260206004820152601060248201526f151c98591a5b99c8191a5cd8589b195960821b6044820152606401610b36565b600a54158061285a57506001600160a01b03821630145b8061288957506019546001600160a01b038381169116148061288957506018546001600160a01b038381169116145b806128af5750600a546001600160a01b0383165f90815260208190526040902054820111155b6128f05760405162461bcd60e51b815260206004820152601260248201527145786365656473206d617842616c616e636560701b6044820152606401610b36565b60075462010000900460ff1615801561291357506007546301000000900460ff16155b80156129275750600754610100900460ff16155b15612c19576019545f9081906001600160a01b038681169116148061295957506019546001600160a01b038581169116145b15612980576019546001600160a01b0386811691161461297a57600261297d565b60015b90505b5f8160ff166001146129925785612994565b845b60085490915063ffffffff428116600160901b83048216600160501b90930482169290920116108015906129e557506001600160a01b0381165f90815260036020526040902054610100900460ff16155b15612a0f576001600160a01b0381165f908152600360205260409020805461ff0019166101001790555b5f5b60068160ff161015612c00575f808460ff1611612a9c576001600160a01b0383165f90815260036020526040902054610100900460ff16612a825760ff82165f908152600460205260408120600101905b600a91828204019190066003029054906101000a900462ffffff16612b64565b60ff82165f90815260046020526040812060020190612a62565b8360ff16600114612b02576001600160a01b0383165f90815260036020526040902054610100900460ff16612ae65760ff82165f9081526004602052604090206001016002612a62565b60ff82165f908152600460205260409020600290810190612a62565b6001600160a01b0383165f90815260036020526040902054610100900460ff16612b425760ff82165f908152600460205260409020600190810190612a62565b60ff82165f908152600460205260409020600201546301000000900462ffffff165b62ffffff169050805f03612b785750612bf8565b620186a086820204612b8b8930836132c1565b60195460ff84165f908152600460205260409020546001600160a01b0391821661010090910490911603612bc657600f805482019055612bf1565b60ff83165f908152600460205260409020600301805482019055601380548201905560128054820190555b9490940193505b600101612a11565b508215612c1557601180548401905592829003925b5050505b611ef08383836132c1565b6008805463ffffffff60901b1916600160901b63ffffffff8416908102919091179091556040519081527f703cced883e2faf6a2d5c676ef2f9dd7cfafa0acecee468ece9314ecf462ba9190602001611228565b6007805466ffffff00000000191664010000000062ffffff841690810291909117909155612ca6575f612cbc565b612cbc6009548262ffffff16620186a091020490565b600a557f0000000000000000000000000000000000000000000000000000000000000000610f775760405162ffffff821681527fd03edfeea801807308f0e9302e347c8a12ad32508cae5bce26e9e2a3654158c990602001611228565b601c80546001600160a01b038381166001600160a01b0319831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0905f90a35050565b6007805461ff00191661010017905580158015612d8a575060075460ff16155b613156575f80600f5411612d9e575f612db2565b6002600f5481612db057612db06140d2565b045b601a546017549192505f916001600160a01b03908116911614612dd5575f612dd9565b6013545b905081810183158015612ded5750600c5481115b15612e56575f8311612dff575f612e25565b600c54612e259082620186a0860281612e1a57612e1a6140d2565b04620186a091020490565b92505f8211612e34575f612e4f565b600c54612e4f9082620186a0850281612e1a57612e1a6140d2565b9150508181015b8380612e645750600b548110155b8015612e805750305f9081526020819052604090205481840111155b1561305b5760408051600280825260608201835247925f92919060208301908036833701905050905030815f81518110612ebc57612ebc613ffe565b6001600160a01b039283166020918202929092010152601a54825191169082906001908110612eed57612eed613ffe565b6001600160a01b039283166020918202929092010152601854612f13913091168561206c565b60185460405163791ac94760e01b81526001600160a01b039091169063791ac94790612f4b9086905f90869030904290600401614123565b5f604051808303815f87803b158015612f62575f80fd5b505af1925050508015612f73575060015b612f9457601854612f8f9030906001600160a01b03165f61206c565b613058565b600f5415612fa657600f805486900390555b604080518481524784900360208201819052917f9029ea20319a59447bd88162928acbbbe0955dead46655370929b794e46e8d96910160405180910390a18015613056576130028185620186a0890281612e1a57612e1a6140d2565b601080549091019055601a546017546001600160a01b039182169116036130565761303b8185620186a0880281612e1a57612e1a6140d2565b60158054909101905560148054860190556013805486900390555b505b50505b6017546001600160a01b031630148015906130875750601a546017546001600160a01b03908116911614155b1561312b576013549150831580156130a05750600c5482115b156130ab57600c5491505b83806130b95750600b548210155b80156130d35750305f908152602081905260409020548211155b1561312b576017545f906130f0906001600160a01b0316846133dc565b90508015613129576017546001600160a01b03165f90815260056020526040902080548201905560148054840190556013805484900390555b505b50505061313781613653565b6008805463ffffffff60701b19164263ffffffff16600160701b021790555b506007805461ff0019169055565b6007805463ff00000019166301000000179055601254156132b2575f805b60068160ff16101561324b5760ff81165f908152600460205260409020805460038201546101009091046001600160a01b03169015806131cf57506019546001600160a01b038281169116145b156131db575050613243565b6017545f90613219906001600160a01b031630146131fb576014546131ff565b6013545b6012546003860154620186a00281612e1a57612e1a6140d2565b90505f61322683836137ff565b9050801561323e576003840180548290039055948501945b505050505b600101613182565b506008805469ffffffff0000000000001916600160301b63ffffffff42160217905580156132b0576012805482900390556040518181527fbb245b3c380b63918dc25ab2cc2e4b6939c4d58ffd95ea052b685a031e1ad2979060200160405180910390a15b505b6007805463ff00000019169055565b6001600160a01b038316158015906132e157506001600160a01b03821615155b61332d5760405162461bcd60e51b815260206004820152601d60248201527f5472616e736665722066726f6d2f746f207a65726f20616464726573730000006044820152606401610b36565b6001600160a01b0383165f908152602081905260409020548111156133645760405162461bcd60e51b8152600401610b369061405b565b8015613397576001600160a01b038084165f90815260208190526040808220805485900390559184168152208054820190555b816001600160a01b0316836001600160a01b03167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef836040516120c091815260200190565b6040516370a0823160e01b81523060048201525f9081906001600160a01b038516906370a0823190602401602060405180830381865afa158015613422573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906134469190614044565b604080516003808252608082019092529192505f91906020820160608036833701905050905030815f8151811061347f5761347f613ffe565b6001600160a01b039283166020918202929092010152601a548251911690829060019081106134b0576134b0613ffe565b60200260200101906001600160a01b031690816001600160a01b03168152505084816002815181106134e4576134e4613ffe565b6001600160a01b03928316602091820292909201015260185461350a913091168661206c565b601854604051635c11d79560e01b81526001600160a01b0390911690635c11d795906135429087905f90869030904290600401614123565b5f604051808303815f87803b158015613559575f80fd5b505af192505050801561356a575060015b61358b576018546135869030906001600160a01b03165f61206c565b61364b565b6040516370a0823160e01b815230600482015282906001600160a01b038716906370a0823190602401602060405180830381865afa1580156135cf573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906135f39190614044565b6135fd9190614194565b604080516001600160a01b0388168152602081018790529081018290529093507fa82a03c1e8613c6192a82386fbb3690070528b0dd8bcae8a5c82d9ef937d7f769060600160405180910390a15b505092915050565b8015801561366e5750600d54600f54108061366e5750601054155b156136765750565b5f811580156136885750600e54600f54115b61369457600f54613698565b600e545b90505f821580156136ac5750600e54600f54115b6136b8576010546136e1565b6136e1601054600f54600e54816136d1576136d16140d2565b04620186a002620186a091020490565b6018549091506136fc9030906001600160a01b03168461206c565b601854601b5460405163f305d71960e01b8152306004820152602481018590525f6044820181905260648201526001600160a01b0391821660848201524260a482015291169063f305d71990839060c40160606040518083038185885af193505050508015613788575060408051601f3d908101601f19168201909252613785918101906141a7565b60015b6137a457601854611ef09030906001600160a01b03165f61206c565b60408051848152602081018490529081018290527f947eb7d5785b0534dc368370fd3574434082455556a747116a88abea1ec6ceba9060600160405180910390a15050600f8054849003905550601080548290039055505050565b5f815f0361380e57505f610c29565b601754306001600160a01b03909116036138e2575f600a5411801561384d5750600a546001600160a01b0384165f908152602081905260409020548301115b801561387157506001600160a01b0383165f9081526002602052604090205460ff16155b156138c9576001600160a01b0383165f90815260208190526040902054600a541161389c575f6138b9565b6001600160a01b0383165f90815260208190526040902054600a54035b9150815f036138c957505f610c29565b6138d43084846132c1565b601380548390039055613a6b565b6014545f90620186a08402816138fa576138fa6140d2565b601a546017549290910492505f916001600160a01b0391821691160361399d57601554620186a09083020490505f856001600160a01b031682617530906040515f60405180830381858888f193505050503d805f8114613975576040519150601f19603f3d011682016040523d82523d5f602084013e61397a565b606091505b505090508061398e575f9350505050610c29565b50601580548290039055613a5f565b6017546001600160a01b03165f90815260056020526040902054620186a09083020460175460405163a9059cbb60e01b81526001600160a01b0388811660048301526024820184905292935091169063a9059cbb906044016020604051808303815f875af1925050508015613a2f575060408051601f3d908101601f19168201909252613a2c91810190614084565b60015b613a3d575f92505050610c29565b506017546001600160a01b03165f908152600560205260409020805482900390555b50506014805483900390555b50919050565b60405180608001604052805f6001600160a01b03168152602001613a93613b40565b8152602001613aa0613b40565b81526020015f81525090565b600183019183908215613b34579160200282015f5b83821115613b0357835183826101000a81548162ffffff021916908362ffffff1602179055509260200192600301602081600201049283019260010302613ac1565b8015613b325782816101000a81549062ffffff0219169055600301602081600201049283019260010302613b03565b505b50611616929150613b5e565b60405180606001604052806003906020820280368337509192915050565b5b80821115611616575f8155600101613b5f565b8015158114610f77575f80fd5b5f805f60408486031215613b91575f80fd5b833567ffffffffffffffff80821115613ba8575f80fd5b818601915086601f830112613bbb575f80fd5b813581811115613bc9575f80fd5b8760208260051b8501011115613bdd575f80fd5b60209283019550935050840135613bf381613b72565b809150509250925092565b5f81518084525f5b81811015613c2257602081850181015186830182015201613c06565b505f602082860101526020601f19601f83011685010191505092915050565b602081525f613c536020830184613bfe565b9392505050565b6001600160a01b0381168114610f77575f80fd5b5f8060408385031215613c7f575f80fd5b8235613c8a81613c5a565b946020939093013593505050565b5f805f60608486031215613caa575f80fd5b8335613cb581613c5a565b92506020840135613cc581613c5a565b929592945050506040919091013590565b803562ffffff81168114613ce8575f80fd5b919050565b5f82601f830112613cfc575f80fd5b6040516060810181811067ffffffffffffffff82111715613d2b57634e487b7160e01b5f52604160045260245ffd5b604052806060840185811115613d3f575f80fd5b845b81811015613d6057613d5281613cd6565b835260209283019201613d41565b509195945050505050565b5f805f806101008587031215613d7f575f80fd5b843560ff81168114613d8f575f80fd5b93506020850135613d9f81613c5a565b9250613dae8660408701613ced565b9150613dbd8660a08701613ced565b905092959194509250565b5f60208284031215613dd8575f80fd5b8135613c5381613b72565b5f60208284031215613df3575f80fd5b813563ffffffff81168114613c53575f80fd5b60c081525f613e1860c0830189613bfe565b8281036020840152613e2a8189613bfe565b60ff881660408501526001600160a01b03871660608501526080840186905283810360a08501529050613e5d8185613bfe565b9998505050505050505050565b5f60208284031215613e7a575f80fd5b8135613c5381613c5a565b5f60208284031215613e95575f80fd5b613c5382613cd6565b5f8060408385031215613eaf575f80fd5b613eb883613cd6565b9150613ec660208401613cd6565b90509250929050565b805f5b6003811015610dbb57815162ffffff16845260209384019390910190600101613ed2565b602080825282518282018190525f919060409081850190868401855b82811015613f6857815180516001600160a01b0316855286810151613f3988870182613ecf565b5085810151613f4b6080870182613ecf565b506060015160e08501526101009093019290850190600101613f12565b5091979650505050505050565b5f8060408385031215613f86575f80fd5b8235613f9181613c5a565b91506020830135613fa181613c5a565b809150509250929050565b5f8060408385031215613fbd575f80fd5b8235613fc881613c5a565b91506020830135613fa181613b72565b6020808252600c908201526b155b985d5d1a1bdc9a5e995960a21b604082015260600190565b634e487b7160e01b5f52603260045260245ffd5b600181811c9082168061402657607f821691505b602082108103613a6b57634e487b7160e01b5f52602260045260245ffd5b5f60208284031215614054575f80fd5b5051919050565b6020808252600f908201526e457863656564732062616c616e636560881b604082015260600190565b5f60208284031215614094575f80fd5b8151613c5381613b72565b634e487b7160e01b5f52601160045260245ffd5b62ffffff81811683821602808216919082811461364b5761364b61409f565b634e487b7160e01b5f52601260045260245ffd5b60ff851681526001600160a01b0384166020820152610100810161410d6040830185613ecf565b61411a60a0830184613ecf565b95945050505050565b5f60a08201878352602087602085015260a0604085015281875180845260c0860191506020890193505f5b818110156141735784516001600160a01b03168352938301939183019160010161414e565b50506001600160a01b03969096166060850152505050608001529392505050565b81810381811115610c2957610c2961409f565b5f805f606084860312156141b9575f80fd5b835192506020840151915060408401519050925092509256fea2646970667358221220ca2b472b0eedbfdb6259c9bfc400a742d46629330c063028a9fafc4b846bc75f64736f6c6343000818003317ef568e3e12ab5b9c7254a8d58478811de00f9e6eb34345acd53bf8fd09d3ee0000000000000000000000000413846c7b2d64af7466ed6d2ba4c434c2c04c8f

Deployed Bytecode

0x60806040526004361061035f575f3560e01c806377004851116101c3578063b81a0145116100f5578063d6a018eb11610099578063f2fde38b1161006b578063f2fde38b14610a75578063f3dc4f4814610a94578063f59c370814610ad0578063f7de0e5714610aef57005b8063d6a018eb14610a04578063d8454a8214610a23578063dd62ed3e14610a37578063f2cda82e14610a5657005b8063c77e006d116100d2578063c77e006d14610975578063c78fe0d414610989578063cc1776d31461099d578063d232c220146109b157005b8063b81a01451461091c578063be5e49b214610939578063c29215831461095857005b806395d89b4111610167578063a457c2d711610139578063a457c2d7146108a0578063a4d8971a146108bf578063a5596b4f146108de578063a9059cbb146108fd57005b806395d89b411461084057806396ce07951461085457806397a26b9e146108685780639c5ef8d71461088c57005b80638bf1acff116101a05780638bf1acff146107d15780638d8350ca146107e55780638da5cb5b1461080457806395101f901461082157005b806377004851146107955780638324c3b9146107a95780638a8c523c146107bd57005b806339137f8b1161029c57806354fd4d50116102405780636f05be97116102125780636f05be971461070b57806370a082311461072c578063715018a61461076057806375de14961461077457005b806354fd4d501461065d5780635a0d4f881461068a5780635b90fe66146106bb5780635f641758146106ec57005b80633ed8a169116102795780633ed8a169146105e057806344b691ff146105ff5780634b7d9db41461061e5780634f7041a51461063557005b806339137f8b14610576578063395093511461058a5780633af32abf146105a957005b8063186488a8116103035780632984207a116102e05780632984207a146104b2578063313ce567146104d157806332acf3de1461050e578063370158ea1461055057005b8063186488a81461045557806323b872dd146104745780632623e9751461049357005b806307e9652c1161033c57806307e9652c146103dc578063095ea7b3146103f95780631171bda91461041857806318160ddd1461043757005b806301b38af514610368578063064a59d01461038757806306fdde03146103bb57005b3661036657005b005b348015610373575f80fd5b50610366610382366004613b7f565b610b0c565b348015610392575f80fd5b50600854600160501b900463ffffffff1615155b60405190151581526020015b60405180910390f35b3480156103c6575f80fd5b506103cf610b89565b6040516103b29190613c41565b3480156103e7575f80fd5b5060075462010000900460ff166103a6565b348015610404575f80fd5b506103a6610413366004613c6e565b610c19565b348015610423575f80fd5b50610366610432366004613c98565b610c2f565b348015610442575f80fd5b506009545b6040519081526020016103b2565b348015610460575f80fd5b5061036661046f366004613d6b565b610dc1565b34801561047f575f80fd5b506103a661048e366004613c98565b610e5b565b34801561049e575f80fd5b506103666104ad366004613dc8565b610e7c565b3480156104bd575f80fd5b506103666104cc366004613de3565b610f1b565b3480156104dc575f80fd5b5060405160ff7f00000000000000000000000000000000000000000000000000000000000000121681526020016103b2565b348015610519575f80fd5b5060075462ffffff600160c81b8204811691600160e01b9004165b6040805162ffffff9384168152929091166020830152016103b2565b34801561055b575f80fd5b50610564610f7a565b6040516103b296959493929190613e06565b348015610581575f80fd5b50610366611105565b348015610595575f80fd5b506103a66105a4366004613c6e565b611166565b3480156105b4575f80fd5b506103a66105c3366004613e6a565b6001600160a01b03165f9081526002602052604090205460ff1690565b3480156105eb575f80fd5b506103666105fa366004613e85565b61117d565b34801561060a575f80fd5b50610366610619366004613e9e565b611233565b348015610629575f80fd5b5060075460ff166103a6565b348015610640575f80fd5b5061064961137f565b60405162ffffff90911681526020016103b2565b348015610668575f80fd5b50604080518082019091526005815264189718171960d91b60208201526103cf565b348015610695575f80fd5b506017546001600160a01b03165b6040516001600160a01b0390911681526020016103b2565b3480156106c6575f80fd5b50600854600160901b900463ffffffff1660405163ffffffff90911681526020016103b2565b3480156106f7575f80fd5b50610649610706366004613e6a565b61138e565b348015610716575f80fd5b5061071f611489565b6040516103b29190613ef6565b348015610737575f80fd5b50610447610746366004613e6a565b6001600160a01b03165f9081526020819052604090205490565b34801561076b575f80fd5b5061036661161a565b34801561077f575f80fd5b50600754640100000000900462ffffff16610649565b3480156107a0575f80fd5b50610366611662565b3480156107b4575f80fd5b506103666116a3565b3480156107c8575f80fd5b50610366611708565b3480156107dc575f80fd5b506106496117df565b3480156107f0575f80fd5b506106496107ff366004613e6a565b6117e5565b34801561080f575f80fd5b50601c546001600160a01b03166106a3565b34801561082c575f80fd5b5061064961083b366004613e6a565b6118a8565b34801561084b575f80fd5b506103cf611984565b34801561085f575f80fd5b506103e8610649565b348015610873575f80fd5b5060085462ffffff808216916301000000900416610534565b348015610897575f80fd5b50610366611993565b3480156108ab575f80fd5b506103a66108ba366004613c6e565b611a08565b3480156108ca575f80fd5b506103666108d9366004613dc8565b611a68565b3480156108e9575f80fd5b506103666108f8366004613dc8565b611af4565b348015610908575f80fd5b506103a6610917366004613c6e565b611b4f565b348015610927575f80fd5b50601b546001600160a01b03166106a3565b348015610944575f80fd5b50610366610953366004613e6a565b611b5b565b348015610963575f80fd5b506019546001600160a01b03166106a3565b348015610980575f80fd5b50610366611bbb565b348015610994575f80fd5b50610366611c1e565b3480156109a8575f80fd5b50610649611c85565b3480156109bc575f80fd5b506016546040805160ff8084161515825261010084048116151560208301526301000000840481161515928201929092526201000090920416151560608201526080016103b2565b348015610a0f575f80fd5b50610366610a1e366004613e9e565b611c8f565b348015610a2e575f80fd5b50601154610447565b348015610a42575f80fd5b50610447610a51366004613f75565b611de6565b348015610a61575f80fd5b50610366610a70366004613c6e565b611e10565b348015610a80575f80fd5b50610366610a8f366004613e6a565b611ef5565b348015610a9f575f80fd5b506103a6610aae366004613e6a565b6001600160a01b03165f90815260036020526040902054610100900460ff1690565b348015610adb575f80fd5b50610366610aea366004613fac565b611f3a565b348015610afa575f80fd5b506018546001600160a01b03166106a3565b601c546001600160a01b03163314610b3f5760405162461bcd60e51b8152600401610b3690613fd8565b60405180910390fd5b815f5b81811015610b8257610b7a858583818110610b5f57610b5f613ffe565b9050602002016020810190610b749190613e6a565b84611f6a565b600101610b42565b5050505050565b6060601d8054610b9890614012565b80601f0160208091040260200160405190810160405280929190818152602001828054610bc490614012565b8015610c0f5780601f10610be657610100808354040283529160200191610c0f565b820191905f5260205f20905b815481529060010190602001808311610bf257829003601f168201915b5050505050905090565b5f610c2533848461206c565b5060015b92915050565b601c546001600160a01b03163314610c595760405162461bcd60e51b8152600401610b3690613fd8565b6040516370a0823160e01b81523060048201525f906001600160a01b038516906370a0823190602401602060405180830381865afa158015610c9d573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610cc19190614044565b90505f6001600160a01b0385163014610d0e576017546001600160a01b03868116911614610cef575f610d16565b6017546001600160a01b03165f90815260056020526040902054610d16565b600f54601354015b90508282821015610d275781610d29565b825b83031015610d495760405162461bcd60e51b8152600401610b369061405b565b505060405163a9059cbb60e01b81526001600160a01b0383811660048301526024820183905284169063a9059cbb906044016020604051808303815f875af1158015610d97573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610dbb9190614084565b50505050565b601c546001600160a01b03163314610deb5760405162461bcd60e51b8152600401610b3690613fd8565b60165462010000900460ff1615610e00575f80fd5b60018460ff1610158015610e18575060058460ff1611155b610e4f5760405162461bcd60e51b815260206004820152600860248201526714995cd95c9d995960c21b6044820152606401610b36565b610dbb848484846120cd565b5f610e6784338461262d565b610e72848484612690565b5060019392505050565b601c546001600160a01b03163314610ea65760405162461bcd60e51b8152600401610b3690613fd8565b6016546301000000900460ff1615610ebc575f80fd5b801580610ed357506018546001600160a01b031615155b610f085760405162461bcd60e51b815260206004820152600660248201526509cde40888ab60d31b6044820152606401610b36565b6007805460ff1916911515919091179055565b601c546001600160a01b03163314610f455760405162461bcd60e51b8152600401610b3690613fd8565b60165462010000900460ff1615610f5a575f80fd5b6102588163ffffffff161115610f6e575f80fd5b610f7781612c24565b50565b6060805f805f6060601d601e7f0000000000000000000000000000000000000000000000000000000000000012601c5f9054906101000a90046001600160a01b031660095460405180604001604052806005815260200164189718171960d91b815250858054610fe990614012565b80601f016020809104026020016040519081016040528092919081815260200182805461101590614012565b80156110605780601f1061103757610100808354040283529160200191611060565b820191905f5260205f20905b81548152906001019060200180831161104357829003601f168201915b5050505050955084805461107390614012565b80601f016020809104026020016040519081016040528092919081815260200182805461109f90614012565b80156110ea5780601f106110c1576101008083540402835291602001916110ea565b820191905f5260205f20905b8154815290600101906020018083116110cd57829003601f168201915b50505050509450955095509550955095509550909192939495565b601c546001600160a01b0316331461112f5760405162461bcd60e51b8152600401610b3690613fd8565b6016805460ff191660011790556040517f951371dba26ef6174e32c5005af266bb9a0405124df206f136f85716d9c96093905f90a1565b5f610c253384846111773388611de6565b0161206c565b601c546001600160a01b031633146111a75760405162461bcd60e51b8152600401610b3690613fd8565b601654610100900460ff16156111bb575f80fd5b62ffffff811615806111e6575060648162ffffff16101580156111e65750620186a062ffffff821611155b6111ee575f80fd5b6111f781612c78565b60405162ffffff821681527fd03edfeea801807308f0e9302e347c8a12ad32508cae5bce26e9e2a3654158c9906020015b60405180910390a150565b601c546001600160a01b0316331461125d5760405162461bcd60e51b8152600401610b3690613fd8565b6016546301000000900460ff1615611273575f80fd5b60018262ffffff161015801561129057506103e88262ffffff1611155b6112cb5760405162461bcd60e51b815260206004820152600c60248201526b302e3030312520746f20312560a01b6044820152606401610b36565b8162ffffff168162ffffff16101580156112ec57506103e88162ffffff1611155b6113275760405162461bcd60e51b815260206004820152600c60248201526b302e3030312520746f20312560a01b6044820152606401610b36565b6007805465ffffffffffff60c81b1916600160c81b62ffffff80861691820262ffffff60e01b191692909217600160e01b92851692830217909255600954620186a0928102839004600b550204600c555050565b5050565b5f611389336118a8565b905090565b6007545f9062010000900460ff16156113a857505f919050565b6001600160a01b0382163014806113d657506001600160a01b0382165f9081526002602052604090205460ff165b806113ee57506019546001600160a01b038381169116145b8061140657506018546001600160a01b038381169116145b611482576001600160a01b0382165f90815260036020526040902054610100900460ff1680611456575060085463ffffffff428116600160901b83048216600160501b9093048216929092011610155b61146e57600754600160681b900462ffffff16610c29565b600754600160b01b900462ffffff16610c29565b5f92915050565b60408051600680825260e08201909252606091816020015b6114a9613a71565b8152602001906001900390816114a15790505090505f5b60068160ff161015611616576040805160808101825260ff83165f81815260046020818152858320805461010090046001600160a01b03168652938352908152845160608101958690529394908501939260010191600391908390855b82829054906101000a900462ffffff1662ffffff168152602001906003019060208260020104928301926001038202915080841161151d579050505050918352505060ff83165f9081526004602090815260409182902082516060810190935292019160020160038282826020028201915f905b82829054906101000a900462ffffff1662ffffff16815260200190600301906020826002010492830192600103820291508084116115915750505092845250505060ff83165f818152600460209081526040909120600301549201919091528351849190811061160357611603613ffe565b60209081029190910101526001016114c0565b5090565b601c546001600160a01b031633146116445760405162461bcd60e51b8152600401610b3690613fd8565b6016805463ffffffff191663010101011790556116605f612d19565b565b60075460ff16801561167c5750600754610100900460ff16155b801561169257506007546301000000900460ff16155b61169a575f80fd5b6116605f612d6a565b601c546001600160a01b031633146116cd5760405162461bcd60e51b8152600401610b3690613fd8565b6016805462ff00001916620100001790556040517fb18b29d65a3b95dc80df0b9528f12b8592bd02395ca19228958e8b7cdf3ddd2b905f90a1565b601c546001600160a01b031633146117325760405162461bcd60e51b8152600401610b3690613fd8565b6016546301000000900460ff1615611748575f80fd5b600854600160501b900463ffffffff16156117975760405162461bcd60e51b815260206004820152600f60248201526e105b1c9958591e48195b98589b1959608a1b6044820152606401610b36565b6008805463ffffffff60501b1916600160501b63ffffffff4216021790556040517f799663458a5ef2936f7fa0c99b3336c69c25890f82974f04e811e5bb359186c7905f90a1565b5f611389335b5f6001600160a01b03821630148061181457506001600160a01b0382165f9081526002602052604090205460ff165b8061182c57506019546001600160a01b038381169116145b611482576001600160a01b0382165f90815260036020526040902054610100900460ff168061187c575060085463ffffffff428116600160901b83048216600160501b9093048216929092011610155b61189457600754600160381b900462ffffff16610c29565b600754600160801b900462ffffff16610c29565b6007545f9062010000900460ff16156118c257505f919050565b6001600160a01b0382163014806118f057506001600160a01b0382165f9081526002602052604090205460ff165b8061190857506019546001600160a01b038381169116145b611482576001600160a01b0382165f90815260036020526040902054610100900460ff1680611958575060085463ffffffff428116600160901b83048216600160501b9093048216929092011610155b61197057600754600160501b900462ffffff16610c29565b600754600160981b900462ffffff16610c29565b6060601e8054610b9890614012565b601c546001600160a01b03163314806119ba5750335f9081526002602052604090205460ff165b6119d65760405162461bcd60e51b8152600401610b3690613fd8565b600754610100900460ff161580156119f857506007546301000000900460ff16155b611a00575f80fd5b611660613164565b5f80611a143385611de6565b905082811015611a5b5760405162461bcd60e51b81526020600482015260126024820152714e6567617469766520616c6c6f77616e636560701b6044820152606401610b36565b610e72338585840361206c565b601c546001600160a01b0316331480611a8f5750335f9081526002602052604090205460ff165b611aab5760405162461bcd60e51b8152600401610b3690613fd8565b8080611ab9575060075460ff165b8015611acd5750600754610100900460ff16155b8015611ae357506007546301000000900460ff16155b611aeb575f80fd5b610f7781612d6a565b601c546001600160a01b03163314611b1e5760405162461bcd60e51b8152600401610b3690613fd8565b60165462010000900460ff1615611b33575f80fd5b60078054911515620100000262ff000019909216919091179055565b5f610c25338484612690565b601c546001600160a01b03163314611b855760405162461bcd60e51b8152600401610b3690613fd8565b60165462010000900460ff1615611b9a575f80fd5b6001600160a01b03165f908152600360205260409020805461ff0019169055565b601c546001600160a01b03163314611be55760405162461bcd60e51b8152600401610b3690613fd8565b6016805461ff0019166101001790556040517f6754c879eecdc6d0fbd95c51f8e377373a9f6be654462f792774fe3740e317ee905f90a1565b601c546001600160a01b03163314611c485760405162461bcd60e51b8152600401610b3690613fd8565b6016805463ff000000191663010000001790556040517ff7f7205ed48f7a35df9b5857667bdee0189d5d7cd80588f217a82641c3b4d08c905f90a1565b5f6113893361138e565b601c546001600160a01b03163314611cb95760405162461bcd60e51b8152600401610b3690613fd8565b6016546301000000900460ff1615611ccf575f80fd5b600a8262ffffff1610158015611cfb5750611ced6103e860646140b3565b62ffffff168262ffffff1611155b611d375760405162461bcd60e51b815260206004820152600d60248201526c302e30312520746f203130302560981b6044820152606401610b36565b8162ffffff168162ffffff1610158015611d675750611d596103e860646140b3565b62ffffff168162ffffff1611155b611da35760405162461bcd60e51b815260206004820152600d60248201526c302e30312520746f203130302560981b6044820152606401610b36565b61137b82826008805462ffffff9283166301000000810265ffffffffffff1990921694909316938417179055600954620186a0928102839004600d550204600e55565b6001600160a01b039182165f90815260016020908152604080832093909416825291909152205490565b601c546001600160a01b03163314611e3a5760405162461bcd60e51b8152600401610b3690613fd8565b601a5460175447915f916001600160a01b03908116911614611e5c575f611e60565b6015545b90508282821015611e715781611e73565b825b83031015611e935760405162461bcd60e51b8152600401610b369061405b565b50505f826001600160a01b0316826040515f6040518083038185875af1925050503d805f8114611ede576040519150601f19603f3d011682016040523d82523d5f602084013e611ee3565b606091505b5050905080611ef0575f80fd5b505050565b601c546001600160a01b03163314611f1f5760405162461bcd60e51b8152600401610b3690613fd8565b6001600160a01b038116611f31575f80fd5b610f7781612d19565b601c546001600160a01b03163314611f645760405162461bcd60e51b8152600401610b3690613fd8565b61137b82825b60165460ff1615611f79575f80fd5b6001600160a01b038216611f8b575f80fd5b6018546001600160a01b03838116911614801590611fb757506019546001600160a01b03838116911614155b61200e5760405162461bcd60e51b815260206004820152602260248201527f44455820726f7574657220616e642070616972206172652070726976696c6567604482015261195960f21b6064820152608401610b36565b6001600160a01b0382165f81815260026020908152604091829020805460ff191685151590811790915591519182527fa54714518c5d275fdcd3d2a461e4858e4e8cb04fb93cd0bca9d6d34115f26440910160405180910390a25050565b6001600160a01b038381165f8181526001602090815260408083209487168084529482529182902085905590518481527f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92591015b60405180910390a3505050565b60058460ff1611156120dd575f80fd5b6001600160a01b038316301480159061210157506001600160a01b03831661dead14155b801561211557506001600160a01b03831615155b61211d575f80fd5b60ff84165f90815260046020908152604091829020600181018054865160078054600160381b80820462ffffff908116958116909403949094018316840269ffffff00000000000000198216811780845586548c8a0151600160501b92839004871663010000009283900488169091030186169091026cffffffffffff000000000000001990931662ffffff60501b19909216919091179190911780835594548a890151600160681b8088048616600160301b9384900487169092039190910185160262ffffff60681b19871681178085556002890180548d51600160801b938490048916918916900301871690910265ffffffffffff60681b1990981662ffffff60801b1990921691909117969096178084558654988b0151600160981b808304871694909a048616900392909201841690970262ffffff60981b19821681178084559554988a015165ffffffffffff60981b1990921662ffffff60b01b1990911617969097048216909603600160b01b938490048216018116909202939093179384905590926161a8929004161180159061231657506007546161a8600160501b90910462ffffff16118015906122e757506007546161a8600160681b90910462ffffff1611155b801561231657506007546161a8600160501b820462ffffff908116600160681b90930481169290920190911611155b61234d5760405162461bcd60e51b8152602060048201526008602482015267090d2ced040a8c2f60c31b6044820152606401610b36565b60075462015f90600160801b90910462ffffff1611801590612381575060075462015f90600160981b90910462ffffff1611155b801561239f575060075462015f90600160b01b90910462ffffff1611155b6123dd5760405162461bcd60e51b815260206004820152600f60248201526e496e76616c69642050656e616c747960881b6044820152606401610b36565b8054610100600160a81b0319166101006001600160a01b0386160217815561240a60018201846003613aac565b507f0000000000000000000000000000000000000000000000000000000000000001801561243a57505f8560ff16115b156125c4575f808052600460209081527f17ef568e3e12ab5b9c7254a8d58478811de00f9e6eb34345acd53bf8fd09d3ec546040805160608082018352858252938101859052808201859052815193840190915260028501546125c494936101009093046001600160a01b031692908190606490600a62ffffff9182160216046064895f6020020151600a0262ffffff16816124d8576124d86140d2565b5f808052600460208181527f17ef568e3e12ab5b9c7254a8d58478811de00f9e6eb34345acd53bf8fd09d3ee5462ffffff8082169690950496909603949094018316865260028c01548d850151928052908452630100000094859004831660649582048416600a9081028516879004938102851687900493909303018316938601939093526040808d0151950194600160301b909304821681028216849004939202165f805260046020527f17ef568e3e12ab5b9c7254a8d58478811de00f9e6eb34345acd53bf8fd09d3ee5462ffffff600160301b90910481169290910492909203011690526120cd565b6125d360028201836003613aac565b50805460ff166125e957805460ff191660011781555b7f30034b3ad500b0a06492ddcfbb1eedee788dff84a77d76d5c3658ab517cec51a8585858560405161261e94939291906140e6565b60405180910390a15050505050565b5f6126388484611de6565b9050818110156126835760405162461bcd60e51b8152602060048201526016602482015275496e73756666696369656e7420616c6c6f77616e636560501b6044820152606401610b36565b610dbb848484840361206c565b6007546301000000900460ff161580156126b25750600754610100900460ff16155b80156126e557506019546001600160a01b038481169116148015906126e557506018546001600160a01b03848116911614155b156126fb576126f35f612d6a565b6126fb613164565b5f8111801561272257506001600160a01b0383165f9081526002602052604090205460ff16155b801561274657506001600160a01b0382165f9081526002602052604090205460ff16155b801561275b57506001600160a01b0383163014155b801561277057506001600160a01b0382163014155b801561278a57506018546001600160a01b03838116911614155b15612c19576019546001600160a01b038481169116148015906127bb57506019546001600160a01b03838116911614155b8061280457506019546001600160a01b03848116911614806127ea57506019546001600160a01b038381169116145b80156128045750600854600160501b900463ffffffff1615155b6128435760405162461bcd60e51b815260206004820152601060248201526f151c98591a5b99c8191a5cd8589b195960821b6044820152606401610b36565b600a54158061285a57506001600160a01b03821630145b8061288957506019546001600160a01b038381169116148061288957506018546001600160a01b038381169116145b806128af5750600a546001600160a01b0383165f90815260208190526040902054820111155b6128f05760405162461bcd60e51b815260206004820152601260248201527145786365656473206d617842616c616e636560701b6044820152606401610b36565b60075462010000900460ff1615801561291357506007546301000000900460ff16155b80156129275750600754610100900460ff16155b15612c19576019545f9081906001600160a01b038681169116148061295957506019546001600160a01b038581169116145b15612980576019546001600160a01b0386811691161461297a57600261297d565b60015b90505b5f8160ff166001146129925785612994565b845b60085490915063ffffffff428116600160901b83048216600160501b90930482169290920116108015906129e557506001600160a01b0381165f90815260036020526040902054610100900460ff16155b15612a0f576001600160a01b0381165f908152600360205260409020805461ff0019166101001790555b5f5b60068160ff161015612c00575f808460ff1611612a9c576001600160a01b0383165f90815260036020526040902054610100900460ff16612a825760ff82165f908152600460205260408120600101905b600a91828204019190066003029054906101000a900462ffffff16612b64565b60ff82165f90815260046020526040812060020190612a62565b8360ff16600114612b02576001600160a01b0383165f90815260036020526040902054610100900460ff16612ae65760ff82165f9081526004602052604090206001016002612a62565b60ff82165f908152600460205260409020600290810190612a62565b6001600160a01b0383165f90815260036020526040902054610100900460ff16612b425760ff82165f908152600460205260409020600190810190612a62565b60ff82165f908152600460205260409020600201546301000000900462ffffff165b62ffffff169050805f03612b785750612bf8565b620186a086820204612b8b8930836132c1565b60195460ff84165f908152600460205260409020546001600160a01b0391821661010090910490911603612bc657600f805482019055612bf1565b60ff83165f908152600460205260409020600301805482019055601380548201905560128054820190555b9490940193505b600101612a11565b508215612c1557601180548401905592829003925b5050505b611ef08383836132c1565b6008805463ffffffff60901b1916600160901b63ffffffff8416908102919091179091556040519081527f703cced883e2faf6a2d5c676ef2f9dd7cfafa0acecee468ece9314ecf462ba9190602001611228565b6007805466ffffff00000000191664010000000062ffffff841690810291909117909155612ca6575f612cbc565b612cbc6009548262ffffff16620186a091020490565b600a557f0000000000000000000000000000000000000000000000000000000000000001610f775760405162ffffff821681527fd03edfeea801807308f0e9302e347c8a12ad32508cae5bce26e9e2a3654158c990602001611228565b601c80546001600160a01b038381166001600160a01b0319831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0905f90a35050565b6007805461ff00191661010017905580158015612d8a575060075460ff16155b613156575f80600f5411612d9e575f612db2565b6002600f5481612db057612db06140d2565b045b601a546017549192505f916001600160a01b03908116911614612dd5575f612dd9565b6013545b905081810183158015612ded5750600c5481115b15612e56575f8311612dff575f612e25565b600c54612e259082620186a0860281612e1a57612e1a6140d2565b04620186a091020490565b92505f8211612e34575f612e4f565b600c54612e4f9082620186a0850281612e1a57612e1a6140d2565b9150508181015b8380612e645750600b548110155b8015612e805750305f9081526020819052604090205481840111155b1561305b5760408051600280825260608201835247925f92919060208301908036833701905050905030815f81518110612ebc57612ebc613ffe565b6001600160a01b039283166020918202929092010152601a54825191169082906001908110612eed57612eed613ffe565b6001600160a01b039283166020918202929092010152601854612f13913091168561206c565b60185460405163791ac94760e01b81526001600160a01b039091169063791ac94790612f4b9086905f90869030904290600401614123565b5f604051808303815f87803b158015612f62575f80fd5b505af1925050508015612f73575060015b612f9457601854612f8f9030906001600160a01b03165f61206c565b613058565b600f5415612fa657600f805486900390555b604080518481524784900360208201819052917f9029ea20319a59447bd88162928acbbbe0955dead46655370929b794e46e8d96910160405180910390a18015613056576130028185620186a0890281612e1a57612e1a6140d2565b601080549091019055601a546017546001600160a01b039182169116036130565761303b8185620186a0880281612e1a57612e1a6140d2565b60158054909101905560148054860190556013805486900390555b505b50505b6017546001600160a01b031630148015906130875750601a546017546001600160a01b03908116911614155b1561312b576013549150831580156130a05750600c5482115b156130ab57600c5491505b83806130b95750600b548210155b80156130d35750305f908152602081905260409020548211155b1561312b576017545f906130f0906001600160a01b0316846133dc565b90508015613129576017546001600160a01b03165f90815260056020526040902080548201905560148054840190556013805484900390555b505b50505061313781613653565b6008805463ffffffff60701b19164263ffffffff16600160701b021790555b506007805461ff0019169055565b6007805463ff00000019166301000000179055601254156132b2575f805b60068160ff16101561324b5760ff81165f908152600460205260409020805460038201546101009091046001600160a01b03169015806131cf57506019546001600160a01b038281169116145b156131db575050613243565b6017545f90613219906001600160a01b031630146131fb576014546131ff565b6013545b6012546003860154620186a00281612e1a57612e1a6140d2565b90505f61322683836137ff565b9050801561323e576003840180548290039055948501945b505050505b600101613182565b506008805469ffffffff0000000000001916600160301b63ffffffff42160217905580156132b0576012805482900390556040518181527fbb245b3c380b63918dc25ab2cc2e4b6939c4d58ffd95ea052b685a031e1ad2979060200160405180910390a15b505b6007805463ff00000019169055565b6001600160a01b038316158015906132e157506001600160a01b03821615155b61332d5760405162461bcd60e51b815260206004820152601d60248201527f5472616e736665722066726f6d2f746f207a65726f20616464726573730000006044820152606401610b36565b6001600160a01b0383165f908152602081905260409020548111156133645760405162461bcd60e51b8152600401610b369061405b565b8015613397576001600160a01b038084165f90815260208190526040808220805485900390559184168152208054820190555b816001600160a01b0316836001600160a01b03167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef836040516120c091815260200190565b6040516370a0823160e01b81523060048201525f9081906001600160a01b038516906370a0823190602401602060405180830381865afa158015613422573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906134469190614044565b604080516003808252608082019092529192505f91906020820160608036833701905050905030815f8151811061347f5761347f613ffe565b6001600160a01b039283166020918202929092010152601a548251911690829060019081106134b0576134b0613ffe565b60200260200101906001600160a01b031690816001600160a01b03168152505084816002815181106134e4576134e4613ffe565b6001600160a01b03928316602091820292909201015260185461350a913091168661206c565b601854604051635c11d79560e01b81526001600160a01b0390911690635c11d795906135429087905f90869030904290600401614123565b5f604051808303815f87803b158015613559575f80fd5b505af192505050801561356a575060015b61358b576018546135869030906001600160a01b03165f61206c565b61364b565b6040516370a0823160e01b815230600482015282906001600160a01b038716906370a0823190602401602060405180830381865afa1580156135cf573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906135f39190614044565b6135fd9190614194565b604080516001600160a01b0388168152602081018790529081018290529093507fa82a03c1e8613c6192a82386fbb3690070528b0dd8bcae8a5c82d9ef937d7f769060600160405180910390a15b505092915050565b8015801561366e5750600d54600f54108061366e5750601054155b156136765750565b5f811580156136885750600e54600f54115b61369457600f54613698565b600e545b90505f821580156136ac5750600e54600f54115b6136b8576010546136e1565b6136e1601054600f54600e54816136d1576136d16140d2565b04620186a002620186a091020490565b6018549091506136fc9030906001600160a01b03168461206c565b601854601b5460405163f305d71960e01b8152306004820152602481018590525f6044820181905260648201526001600160a01b0391821660848201524260a482015291169063f305d71990839060c40160606040518083038185885af193505050508015613788575060408051601f3d908101601f19168201909252613785918101906141a7565b60015b6137a457601854611ef09030906001600160a01b03165f61206c565b60408051848152602081018490529081018290527f947eb7d5785b0534dc368370fd3574434082455556a747116a88abea1ec6ceba9060600160405180910390a15050600f8054849003905550601080548290039055505050565b5f815f0361380e57505f610c29565b601754306001600160a01b03909116036138e2575f600a5411801561384d5750600a546001600160a01b0384165f908152602081905260409020548301115b801561387157506001600160a01b0383165f9081526002602052604090205460ff16155b156138c9576001600160a01b0383165f90815260208190526040902054600a541161389c575f6138b9565b6001600160a01b0383165f90815260208190526040902054600a54035b9150815f036138c957505f610c29565b6138d43084846132c1565b601380548390039055613a6b565b6014545f90620186a08402816138fa576138fa6140d2565b601a546017549290910492505f916001600160a01b0391821691160361399d57601554620186a09083020490505f856001600160a01b031682617530906040515f60405180830381858888f193505050503d805f8114613975576040519150601f19603f3d011682016040523d82523d5f602084013e61397a565b606091505b505090508061398e575f9350505050610c29565b50601580548290039055613a5f565b6017546001600160a01b03165f90815260056020526040902054620186a09083020460175460405163a9059cbb60e01b81526001600160a01b0388811660048301526024820184905292935091169063a9059cbb906044016020604051808303815f875af1925050508015613a2f575060408051601f3d908101601f19168201909252613a2c91810190614084565b60015b613a3d575f92505050610c29565b506017546001600160a01b03165f908152600560205260409020805482900390555b50506014805483900390555b50919050565b60405180608001604052805f6001600160a01b03168152602001613a93613b40565b8152602001613aa0613b40565b81526020015f81525090565b600183019183908215613b34579160200282015f5b83821115613b0357835183826101000a81548162ffffff021916908362ffffff1602179055509260200192600301602081600201049283019260010302613ac1565b8015613b325782816101000a81549062ffffff0219169055600301602081600201049283019260010302613b03565b505b50611616929150613b5e565b60405180606001604052806003906020820280368337509192915050565b5b80821115611616575f8155600101613b5f565b8015158114610f77575f80fd5b5f805f60408486031215613b91575f80fd5b833567ffffffffffffffff80821115613ba8575f80fd5b818601915086601f830112613bbb575f80fd5b813581811115613bc9575f80fd5b8760208260051b8501011115613bdd575f80fd5b60209283019550935050840135613bf381613b72565b809150509250925092565b5f81518084525f5b81811015613c2257602081850181015186830182015201613c06565b505f602082860101526020601f19601f83011685010191505092915050565b602081525f613c536020830184613bfe565b9392505050565b6001600160a01b0381168114610f77575f80fd5b5f8060408385031215613c7f575f80fd5b8235613c8a81613c5a565b946020939093013593505050565b5f805f60608486031215613caa575f80fd5b8335613cb581613c5a565b92506020840135613cc581613c5a565b929592945050506040919091013590565b803562ffffff81168114613ce8575f80fd5b919050565b5f82601f830112613cfc575f80fd5b6040516060810181811067ffffffffffffffff82111715613d2b57634e487b7160e01b5f52604160045260245ffd5b604052806060840185811115613d3f575f80fd5b845b81811015613d6057613d5281613cd6565b835260209283019201613d41565b509195945050505050565b5f805f806101008587031215613d7f575f80fd5b843560ff81168114613d8f575f80fd5b93506020850135613d9f81613c5a565b9250613dae8660408701613ced565b9150613dbd8660a08701613ced565b905092959194509250565b5f60208284031215613dd8575f80fd5b8135613c5381613b72565b5f60208284031215613df3575f80fd5b813563ffffffff81168114613c53575f80fd5b60c081525f613e1860c0830189613bfe565b8281036020840152613e2a8189613bfe565b60ff881660408501526001600160a01b03871660608501526080840186905283810360a08501529050613e5d8185613bfe565b9998505050505050505050565b5f60208284031215613e7a575f80fd5b8135613c5381613c5a565b5f60208284031215613e95575f80fd5b613c5382613cd6565b5f8060408385031215613eaf575f80fd5b613eb883613cd6565b9150613ec660208401613cd6565b90509250929050565b805f5b6003811015610dbb57815162ffffff16845260209384019390910190600101613ed2565b602080825282518282018190525f919060409081850190868401855b82811015613f6857815180516001600160a01b0316855286810151613f3988870182613ecf565b5085810151613f4b6080870182613ecf565b506060015160e08501526101009093019290850190600101613f12565b5091979650505050505050565b5f8060408385031215613f86575f80fd5b8235613f9181613c5a565b91506020830135613fa181613c5a565b809150509250929050565b5f8060408385031215613fbd575f80fd5b8235613fc881613c5a565b91506020830135613fa181613b72565b6020808252600c908201526b155b985d5d1a1bdc9a5e995960a21b604082015260600190565b634e487b7160e01b5f52603260045260245ffd5b600181811c9082168061402657607f821691505b602082108103613a6b57634e487b7160e01b5f52602260045260245ffd5b5f60208284031215614054575f80fd5b5051919050565b6020808252600f908201526e457863656564732062616c616e636560881b604082015260600190565b5f60208284031215614094575f80fd5b8151613c5381613b72565b634e487b7160e01b5f52601160045260245ffd5b62ffffff81811683821602808216919082811461364b5761364b61409f565b634e487b7160e01b5f52601260045260245ffd5b60ff851681526001600160a01b0384166020820152610100810161410d6040830185613ecf565b61411a60a0830184613ecf565b95945050505050565b5f60a08201878352602087602085015260a0604085015281875180845260c0860191506020890193505f5b818110156141735784516001600160a01b03168352938301939183019160010161414e565b50506001600160a01b03969096166060850152505050608001529392505050565b81810381811115610c2957610c2961409f565b5f805f606084860312156141b9575f80fd5b835192506020840151915060408401519050925092509256fea2646970667358221220ca2b472b0eedbfdb6259c9bfc400a742d46629330c063028a9fafc4b846bc75f64736f6c63430008180033

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.