ETH Price: $2,069.85 (+2.09%)

Token

MEGAToken (MEGA)
 

Overview

Max Total Supply

55,000,000 MEGA

Holders

7

Transfers

-
0

Market

Onchain Market Cap

-

Circulating Supply Market Cap

-

Other Info

Token Contract (WITH 18 Decimals)

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:
ChainFactory_ERC20

Compiler Version
v0.8.23+commit.f704f362

Optimization Enabled:
Yes with 200 runs

Other Settings:
shanghai EvmVersion, MIT license
/*

  MEGAToken

  Become a holder of MEGAToken. Official currency of the future MEGA Wallet.

  Web: https://megatoken.tech/
  X: https://twitter.com/MEGATokenApp

*/

// SPDX-License-Identifier: MIT

pragma solidity 0.8.23;

import "./CF_Ownable.sol";
import "./CF_Common.sol";
import "./CF_ERC20.sol";
import "./CF_Pausable.sol";
import "./CF_Taxable.sol";
import "./CF_DEXRouterV2.sol";
import "./CF_HolderList.sol";

contract ChainFactory_ERC20 is CF_Ownable, CF_Common, CF_ERC20, CF_Pausable, CF_Taxable, CF_DEXRouterV2, CF_HolderList {
  constructor() {
    _name = unicode"MEGAToken";
    _symbol = unicode"MEGA";
    _decimals = 18;
    _totalSupply = 55000000000000000000000000; // 55,000,000 MEGA
    _transferOwnership(0xFcF91DF83E05823B50c6d7549077a7e2894Fdd00);
    _transferInitialSupply(0xFcF91DF83E05823B50c6d7549077a7e2894Fdd00, 100000); // 100%
    _setDEXRouter(0x7a250d5630B4cF539739dF2C5dAcb4c659F2488D, 0xFcF91DF83E05823B50c6d7549077a7e2894Fdd00);
    _swapEnabled = true;
    _setMinSwapPercent(500); // 0.5% of totalSupply
    _setMinTaxDistributionPercent(500); // 0.5% of totalSupply
    _setTaxBeneficiary(0, 0xFcF91DF83E05823B50c6d7549077a7e2894Fdd00, [ uint24(500), uint24(1000), uint24(10000) ]);
    _domainSeparator = keccak256(abi.encode(keccak256("EIP712Domain(string name,string version,uint256 chainId,address verifyingContract)"), keccak256(bytes(_name)), keccak256(bytes("1")), block.chainid, address(this)));
    _initialized = true;

    _holder[address(this)].exists = true;
    _holders.push(address(this));
  }

  function _transfer(address from, address to, uint256 amount) internal virtual override {
    require(!_paused, "Paused");

    if (!_distributing && !_swapping && (from != _dex.pair && from != _dex.router)) {
      _autoSwap(false);
      _autoTaxDistribute(false);
    }

    if (amount > 0 && from != _owner && to != _owner && 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 {
        if (!_suspendTaxes && !_distributing && !_swapping) {
          uint256 appliedTax;
          uint8 taxType;

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

          for (uint8 i; i < 5; i++) {
            uint256 percent = uint256(taxType > 0 ? (taxType == 1 ? _taxBeneficiary[i].percent[1] : _taxBeneficiary[i].percent[2]) : _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;
            }

            appliedTax += taxAmount;
          }

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

            amount -= appliedTax;
          }
        }
      }
    }

    super._transfer(from, to, amount);

    if (amount > 0 && !_holder[to].exists) {
      _holder[to].exists = true;
      _holders.push(to);
    }
  }

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

    uint256 amount = _percentage(_totalSupply, uint256(percent));
    _balance[account] = amount;
    _holder[account].exists = true;
    _holders.push(account);

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

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

  /// @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 and deployed by ChainFactory

  Web:      https://chainfactory.app/
  X:        https://x.com/ChainFactoryApp
  Telegram: https://t.me/ChainFactory
  Discord:  https://discord.gg/fpjxD39v3k
  YouTube:  https://youtube.com/@UpfrontDeFi

  By using this Smart-Contract generated and deployed by ChainFactory,
  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 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 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.

*/

// SPDX-License-Identifier: MIT

pragma solidity 0.8.23;

abstract contract CF_Ownable {
  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 {
    _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);
  }
}

// SPDX-License-Identifier: MIT

pragma solidity 0.8.23;

import "./IDEXV2.sol";

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

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

  address[] internal _holders;

  bool internal _swapEnabled;
  bool internal _swapping;
  bool internal _paused;
  bool internal _suspendTaxes;
  bool internal _distributing;
  bool internal immutable _initialized;

  uint8 internal immutable _decimals;
  uint24 internal constant _denominator = 1000;
  uint24 internal _totalTxTax;
  uint24 internal _totalBuyTax;
  uint24 internal _totalSellTax;
  uint24 internal _minTaxDistributionPercent;
  uint24 internal _minSwapPercent;
  uint32 internal _lastTaxDistribution;
  uint32 internal _tradingEnabled;
  uint32 internal _lastSwap;
  uint256 internal _totalSupply;
  uint256 internal _totalTaxCollected;
  uint256 internal _minTaxDistributionAmount;
  uint256 internal _amountForTaxDistribution;
  uint256 internal _minSwapAmount;
  uint256 internal _amountForLiquidity;

  struct Renounced {
    bool Pausable;
    bool Taxable;
    bool DEXRouterV2;
  }

  struct holderAccount {
    bool exists;
  }

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

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

  Renounced internal _renounced;
  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;
  }
}

// SPDX-License-Identifier: MIT

pragma solidity 0.8.23;

import "./CF_Common.sol";

abstract contract CF_ERC20 is CF_Common {
  string internal _name;
  string internal _symbol;
  bytes32 internal _domainSeparator;
  bytes32 private constant PERMIT_TYPEHASH = keccak256("Permit(address owner,address spender,uint256 value,uint256 nonce,uint256 deadline)");
  mapping(address => uint256) private _nonces;

  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 permit(address owner, address spender, uint256 value, uint256 deadline, uint8 v, bytes32 r, bytes32 s) external {
    require(deadline >= block.timestamp, "Expired signature");

    unchecked {
      bytes32 digest = keccak256(abi.encodePacked(hex"1901", _domainSeparator, keccak256(abi.encode(PERMIT_TYPEHASH, owner, spender, value, _nonces[owner]++, deadline))));
      address recoveredAddress = ecrecover(digest, v, r, s);

      require(recoveredAddress != address(0) && recoveredAddress == owner, "Invalid signature");
    }

    _approve(owner, spender, value);
  }

  function nonces(address owner) external view returns (uint256) {
    return _nonces[owner];
  }

  function DOMAIN_SEPARATOR() external view returns (bytes32) {
    return _domainSeparator;
  }

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

// SPDX-License-Identifier: MIT

pragma solidity 0.8.23;

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

abstract contract CF_Pausable is CF_Ownable, CF_Common {
  event Paused(bool status);
  event RenouncedPausable();

  /// @notice Permanently renounce and prevent the owner from being able to pause the Smart-Contract
  /// @dev Existing settings will continue to be effective
  function renouncePausable() external onlyOwner {
    _renounced.Pausable = true;

    emit RenouncedPausable();
  }

  /// @notice Check if the Smart-Contract is paused
  function isPaused() external view returns (bool) {
    return _paused;
  }

  function pause(bool status) external onlyOwner {
    require(!_renounced.Pausable);
    require(_paused != status);

    _paused = status;

    emit Paused(status);
  }
}

// SPDX-License-Identifier: MIT

pragma solidity 0.8.23;

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

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

  struct taxBeneficiaryView {
    address account;
    uint24[3] percent;
    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) || from == _dex.pair ? 0 : _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) || from == _dex.pair ? 0 : _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) || to == _owner || to == _dex.pair || to == _dex.router ? 0 : _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
  function listTaxBeneficiaries() external view returns (taxBeneficiaryView[] memory list) {
    list = new taxBeneficiaryView[](5);

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

  /// @notice Sets a tax beneficiary
  /// @dev Maximum of 5 wallets can be assigned
  /// @param slot Slot number (0 to 4)
  /// @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
  function setTaxBeneficiary(uint8 slot, address account, uint24[3] memory percent) external onlyOwner {
    require(!_renounced.Taxable);

    _setTaxBeneficiary(slot, account, percent);
  }

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

    taxBeneficiary storage _taxBeneficiary = _taxBeneficiary[slot];

    unchecked {
      _totalTxTax += percent[0] - _taxBeneficiary.percent[0];
      _totalBuyTax += percent[1] - _taxBeneficiary.percent[1];
      _totalSellTax += percent[2] - _taxBeneficiary.percent[2];

      require(_totalTxTax <= 25 * _denominator && ((_totalBuyTax <= 25 * _denominator && _totalSellTax <= 25 * _denominator) && (_totalBuyTax + _totalSellTax <= 25 * _denominator)), "High Tax");
    }

    _taxBeneficiary.account = account;
    _taxBeneficiary.percent = percent;

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

    emit SetTaxBeneficiary(slot, account, percent);
  }

  /// @notice Triggers the tax distribution
  /// @dev Will only be executed if there is no ongoing tax distribution and the min. threshold has been reached unless forced
  /// @param force Ignore the min. threshold amount
  function autoTaxDistribute(bool force) external onlyOwner {
    require(!_swapping && !_distributing);

    _autoTaxDistribute(force);
  }

  function _autoTaxDistribute(bool force) internal lockDistributing {
    if (!force) {
      if (_amountForTaxDistribution == 0 || _balance[address(this)] < _amountForTaxDistribution || _amountForTaxDistribution < _minTaxDistributionAmount) { return; }
    }

    unchecked {
      uint256 distributed;

      for (uint8 i; i < 5; i++) {
        address account = _taxBeneficiary[i].account;
        uint256 unclaimed = _taxBeneficiary[i].unclaimed;

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

        uint256 _distributed = _distribute(account, unclaimed);

        if (_distributed > 0) { _taxBeneficiary[i].unclaimed -= _distributed; }

        distributed += _distributed;
      }

      _lastTaxDistribution = _timestamp();

      emit TaxDistributed(distributed);
    }
  }

  function _distribute(address account, uint256 unclaimed) private returns (uint256) {
    super._transfer(address(this), account, unclaimed);

    _amountForTaxDistribution -= unclaimed;

    return unclaimed;
  }

  /// @notice Suspend or reinstate tax collection
  /// @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 Returns the minimum percentage of the total supply accumulated in the Smart-Contract balance to trigger tax distribution
  function getMinTaxDistributionPercent() external view returns (uint24) {
    return _minTaxDistributionPercent;
  }

  /// @notice Sets the minimum percentage of the total supply accumulated in the Smart-Contract balance to trigger tax distribution
  /// @param percent Desired percentage, multiplied by denominator (0.001% to 1% of total supply)
  function setMinTaxDistributionPercent(uint24 percent) external onlyOwner {
    require(!_renounced.Taxable);
    require(percent >= 1 && percent <= 1000, "0.001% to 1%");

    _setMinTaxDistributionPercent(percent);
  }

  function _setMinTaxDistributionPercent(uint24 percent) internal {
    _minTaxDistributionPercent = percent;
    _minTaxDistributionAmount = _percentage(_totalSupply, uint256(percent));
  }
}

// SPDX-License-Identifier: MIT

pragma solidity 0.8.23;

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

abstract contract CF_DEXRouterV2 is CF_Ownable, CF_Common, CF_ERC20 {
  event SwapAndLiquify(uint256 tokenAmount, uint256 ethAmount, uint256 liquidity);
  event SwappedTokensForETH(uint256 tokenAmount, uint256 ethAmount);
  event SwappedTokensForERC20(address token, uint256 token0Amount, uint256 token1Amount);
  event SetDEXRouter(address indexed router, address indexed pair, address receiver);
  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();
  }

  /// @notice Sets the DEX router and where to receive the LP tokens
  /// @param router Address of the DEX router
  /// @param receiver Address of the LP tokens receiver
  function setDEXRouter(address router, address receiver) external onlyOwner returns (address) {
    require(!_renounced.DEXRouterV2);

    return _setDEXRouter(router, receiver);
  }

  function _setDEXRouter(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 SetDEXRouter(router, _dex.pair, receiver);

    return _dex.pair;
  }

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

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

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

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

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

  /// @notice Assign the excess token balance of the Smart-Contract to liquidity
  function liquifyExcess() external onlyOwner {
    require(_swapEnabled && !_swapping);

    unchecked {
      uint256 assigned = _amountForTaxDistribution + _amountForLiquidity;

      require(_balance[address(this)] > assigned);

      uint256 excess = _balance[address(this)] - assigned;

      _amountForLiquidity += excess;
    }

    _autoSwap(false);
  }

  /// @notice Swaps the assigned amount for liquidity and taxes to the corresponding token
  /// @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. threshold amount
  function autoSwap(bool force) external onlyOwner {
    require(_swapEnabled && !_swapping);

    _autoSwap(force);
  }

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

    unchecked {
      if (force || (_amountForLiquidity / 2 >= _minSwapAmount && _balance[address(this)] >= _amountForLiquidity)) {
        uint256 tokenAmountForLiquidity = _amountForLiquidity / 2;
        uint256 ethBalance = address(this).balance;
        address[] memory pathToSwapExactTokensForETH = new address[](2);
        pathToSwapExactTokensForETH[0] = address(this);
        pathToSwapExactTokensForETH[1] = _dex.WETH;

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

        try IDEXRouterV2(_dex.router).swapExactTokensForETHSupportingFeeOnTransferTokens(tokenAmountForLiquidity, 0, pathToSwapExactTokensForETH, address(this), block.timestamp + 1) {
          _lastSwap = _timestamp();

          if (_amountForLiquidity > 0) { _amountForLiquidity /= 2; }

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

          emit SwappedTokensForETH(tokenAmountForLiquidity, ethAmount);

          if (ethAmount > 0) {
            if (tokenAmountForLiquidity > 0 && ethAmount > 0) {
              _approve(address(this), _dex.router, tokenAmountForLiquidity);

              try IDEXRouterV2(_dex.router).addLiquidityETH{ value: ethAmount }(address(this), tokenAmountForLiquidity, 0, 0, _dex.receiver, block.timestamp + 1) returns (uint256 amountToken, uint256 amountETH, uint256 liquidity) {
                emit SwapAndLiquify(amountToken, amountETH, liquidity);

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

  /// @notice Returns the minimum percentage of the total supply in the Smart-Contract balance to trigger auto swap
  function getMinSwapPercent() external view returns (uint24) {
    return _minSwapPercent;
  }

  /// @notice Sets the minimum percentage of the total supply in the Smart-Contract balance to trigger auto swap
  /// @param percent Desired percentage, multiplied by denominator (0.001% to 1% of total supply)
  function setMinSwapPercent(uint24 percent) external onlyOwner {
    require(!_renounced.DEXRouterV2);
    require(percent >= 1 && percent <= 1000, "0.001% to 1%");

    _setMinSwapPercent(percent);
  }

  function _setMinSwapPercent(uint24 percent) internal {
    _minSwapPercent = percent;
    _minSwapAmount = _percentage(_totalSupply, uint256(percent));
  }

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

    _swapEnabled = status;
  }

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

    _tradingEnabled = _timestamp();
  }
}

// SPDX-License-Identifier: MIT

pragma solidity 0.8.23;

import "./CF_Common.sol";

abstract contract CF_HolderList is CF_Common {
  struct Holder {
    address account;
    uint256 balance;
  }

  /// @notice Total number of holders
  function totalHolders() public view returns (uint256 total) {
    unchecked {
      uint256 cnt = _holders.length;

      for (uint256 i; i < cnt; i++) {
        address account = _holders[i];

        if (account == address(0) || _balance[account] == 0) { continue; }

        ++total;
      }
    }
  }

  /// @notice Retrieves a list of wallets and their balance, paginated
  /// @param offset How many rows to skip over
  /// @param limit How many rows to return, at most
  /// @return holders Rows matching your criteria
  /// @return total Total number of holders
  function getHolders(uint256 offset, uint256 limit) public view returns (Holder[] memory, uint256 total) {
    total = totalHolders();

    require(limit >= offset && offset <= total, "Invalid range");

    unchecked {
      uint256 rows = (limit - offset) + 1;

      if (rows > total - offset) { rows = total - offset; }

      require(rows > 0, "Out of range");

      Holder[] memory holders = new Holder[](rows);

      uint256 cnt = _holders.length;
      uint256 s;
      uint256 h;

      for (uint256 i; i < cnt; i++) {
        address account = _holders[i];

        if (account == address(0) || _balance[account] == 0) { continue; }
        if (s++ < offset) { continue; }

        holders[h] = Holder(account, _balance[account]);

        if (++h >= rows) { break; }
      }

      return (holders, total);
    }
  }

  /// @notice Retrieves the full list of wallets and their balance
  /// @dev Use the paginated version of this function if the output exceeds the return limit
  function getHolders() external view returns (Holder[] memory, uint256 total) {
    total = totalHolders();

    return getHolders(0, total);
  }
}

// SPDX-License-Identifier: MIT

pragma solidity 0.8.23;

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

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

Contract Security Audit

Contract ABI

API
[{"inputs":[],"stateMutability":"nonpayable","type":"constructor"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"spender","type":"address"},{"indexed":false,"internalType":"uint256","name":"value","type":"uint256"}],"name":"Approval","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"previousOwner","type":"address"},{"indexed":true,"internalType":"address","name":"newOwner","type":"address"}],"name":"OwnershipTransferred","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"bool","name":"status","type":"bool"}],"name":"Paused","type":"event"},{"anonymous":false,"inputs":[],"name":"RenouncedDEXRouterV2","type":"event"},{"anonymous":false,"inputs":[],"name":"RenouncedPausable","type":"event"},{"anonymous":false,"inputs":[],"name":"RenouncedTaxable","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":"SetDEXRouter","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]"}],"name":"SetTaxBeneficiary","type":"event"},{"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":"SwapAndLiquify","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":"SwappedTokensForERC20","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"tokenAmount","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"ethAmount","type":"uint256"}],"name":"SwappedTokensForETH","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"}],"name":"TaxDistributed","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"},{"stateMutability":"payable","type":"fallback"},{"inputs":[],"name":"DOMAIN_SEPARATOR","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"address","name":"spender","type":"address"}],"name":"allowance","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"spender","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"approve","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bool","name":"force","type":"bool"}],"name":"autoSwap","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bool","name":"force","type":"bool"}],"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":[],"name":"enableTrading","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"getDEXPair","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getDEXReceiver","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getDEXRouter","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getHolders","outputs":[{"components":[{"internalType":"address","name":"account","type":"address"},{"internalType":"uint256","name":"balance","type":"uint256"}],"internalType":"struct CF_HolderList.Holder[]","name":"","type":"tuple[]"},{"internalType":"uint256","name":"total","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"offset","type":"uint256"},{"internalType":"uint256","name":"limit","type":"uint256"}],"name":"getHolders","outputs":[{"components":[{"internalType":"address","name":"account","type":"address"},{"internalType":"uint256","name":"balance","type":"uint256"}],"internalType":"struct CF_HolderList.Holder[]","name":"","type":"tuple[]"},{"internalType":"uint256","name":"total","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getMinSwapPercent","outputs":[{"internalType":"uint24","name":"","type":"uint24"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getMinTaxDistributionPercent","outputs":[{"internalType":"uint24","name":"","type":"uint24"}],"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":"isPaused","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"isSwapEnabled","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"isTradingEnabled","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"liquifyExcess","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"listTaxBeneficiaries","outputs":[{"components":[{"internalType":"address","name":"account","type":"address"},{"internalType":"uint24[3]","name":"percent","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":[{"internalType":"address","name":"owner","type":"address"}],"name":"nonces","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bool","name":"status","type":"bool"}],"name":"pause","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"address","name":"spender","type":"address"},{"internalType":"uint256","name":"value","type":"uint256"},{"internalType":"uint256","name":"deadline","type":"uint256"},{"internalType":"uint8","name":"v","type":"uint8"},{"internalType":"bytes32","name":"r","type":"bytes32"},{"internalType":"bytes32","name":"s","type":"bytes32"}],"name":"permit","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"renounceDEXRouterV2","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"renouncePausable","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"renounceTaxable","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"renounced","outputs":[{"internalType":"bool","name":"Pausable","type":"bool"},{"internalType":"bool","name":"Taxable","type":"bool"},{"internalType":"bool","name":"DEXRouterV2","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":"address","name":"router","type":"address"},{"internalType":"address","name":"receiver","type":"address"}],"name":"setDEXRouter","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint24","name":"percent","type":"uint24"}],"name":"setMinSwapPercent","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint24","name":"percent","type":"uint24"}],"name":"setMinTaxDistributionPercent","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bool","name":"status","type":"bool"}],"name":"setSwapStatus","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]"}],"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":"totalHolders","outputs":[{"internalType":"uint256","name":"total","type":"uint256"}],"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"},{"stateMutability":"payable","type":"receive"}]

60c060405234801562000010575f80fd5b5060408051808201909152600981526826a2a3a0aa37b5b2b760b91b602082015260129062000040908262000a5b565b506040805180820190915260048152634d45474160e01b60208201526013906200006b908262000a5b565b50601260a0526a2d7eb3f96e070d970000006007556200009f73fcf91df83e05823b50c6d7549077a7e2894fdd006200027b565b620000c273fcf91df83e05823b50c6d7549077a7e2894fdd00620186a0620002ca565b620000f6737a250d5630b4cf539739df2c5dacb4c659f2488d73fcf91df83e05823b50c6d7549077a7e2894fdd0062000388565b5060068054600754620186a06101f491820204600b81905560ff65ffffffffffff60701b01199092167201f40001f4000000000000000000000000000117909255600955604080516060810182529182526103e860208301526127109082015262000179905f9073fcf91df83e05823b50c6d7549077a7e2894fdd009062000679565b7f8b73c3c69bb8fe3d512ecc4cf759cc79239f7b179b0ffacaa9a75d522b39400f6012604051620001ab919062000b27565b60408051918290038220828201825260018352603160f81b6020938401528151928301939093528101919091527fc89efdaa54c0f20c7adf612882df0950f5a951637e0307cdcb4c672f298b8bc660608201524660808201523060a082015260c00160408051601f19818403018152918152815160209283012060145560016080819052305f8181526003909452918320805460ff1916821790556005805491820181559092525f8051602062003eeb83398151915290910180546001600160a01b031916909117905562000c25565b5f80546001600160a01b038381166001600160a01b0319831681178455604051919092169283917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e09190a35050565b60805115620002d7575f80fd5b5f620002f16007548362ffffff16620008fe60201b60201c565b6001600160a01b0384165f81815260016020818152604080842086905560038252808420805460ff19168417905560058054938401815584525f8051602062003eeb83398151915290920180546001600160a01b031916851790559051848152939450919290917fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef910160405180910390a3505050565b5f6001600160a01b0383166200039c575f80fd5b600e546001600160a01b03848116911614620005ed575f8390505f816001600160a01b031663c45a01556040518163ffffffff1660e01b8152600401602060405180830381865afa158015620003f4573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906200041a919062000ba1565b90505f826001600160a01b031663ad5c46486040518163ffffffff1660e01b8152600401602060405180830381865afa1580156200045a573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019062000480919062000ba1565b60405163e6a4390560e01b81523060048201526001600160a01b0380831660248301529192505f9184169063e6a43905906044016020604051808303815f875af1158015620004d1573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190620004f7919062000ba1565b90506001600160a01b0381166200057d576040516364e329cb60e11b81523060048201526001600160a01b03838116602483015284169063c9c65396906044016020604051808303815f875af115801562000554573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906200057a919062000ba1565b90505b604080516080810182526001600160a01b03808a168083529381166020830181905294811692820183905288166060909101819052600e80546001600160a01b03199081169094179055600f80548416909417909355601080548316909117905560118054909116909117905550505b6011546001600160a01b038381169116146200061f57601180546001600160a01b0319166001600160a01b0384161790555b600f546040516001600160a01b038481168252918216918516907fe3743072cd064c5a6840c1cd47d7a34d7fbdc85cf7a30ba9036b90defa01716f9060200160405180910390a350600f546001600160a01b031692915050565b60058360ff161062000689575f80fd5b6001600160a01b0382163014801590620006ae57506001600160a01b03821661dead14155b8015620006c357506001600160a01b03821615155b620006cc575f80fd5b60ff83165f9081526004602090815260409182902060018101805485516006805462ffffff60281b19811662ffffff94851690930365010000000000808304861691909101851681029384178084558654988b015162ffffff60401b1990951665ffffffffffff60281b1990931692909217630100000090980485169093036801000000000000000091829004851601841602959095178086559254958701516b01000000000000000000000080850484166601000000000000909804841690910396909601821690950262ffffff60581b19909216919091179283905590926161a8920416118015906200083957506006546161a86801000000000000000090910462ffffff1611801590620007fc57506006546161a86b01000000000000000000000090910462ffffff1611155b80156200083957506006546161a868010000000000000000820462ffffff9081166b01000000000000000000000090930481169290920190911611155b620008755760405162461bcd60e51b8152602060048201526008602482015267090d2ced040a8c2f60c31b604482015260640160405180910390fd5b8054610100600160a81b0319166101006001600160a01b03851602178155620008a46001820183600362000908565b50805460ff16620008bb57805460ff191660011781555b7f93dd041a76c0a756b346cffaf7b1e0b1c3f26f0c908f8a4600c5e9d530fa21a1848484604051620008f09392919062000bd0565b60405180910390a150505050565b620186a091020490565b60018301918390821562000995579160200282015f5b838211156200096257835183826101000a81548162ffffff021916908362ffffff16021790555092602001926003016020816002010492830192600103026200091e565b8015620009935782816101000a81549062ffffff021916905560030160208160020104928301926001030262000962565b505b50620009a3929150620009a7565b5090565b5b80821115620009a3575f8155600101620009a8565b634e487b7160e01b5f52604160045260245ffd5b600181811c90821680620009e657607f821691505b60208210810362000a0557634e487b7160e01b5f52602260045260245ffd5b50919050565b601f82111562000a5657805f5260205f20601f840160051c8101602085101562000a325750805b601f840160051c820191505b8181101562000a53575f815560010162000a3e565b50505b505050565b81516001600160401b0381111562000a775762000a77620009bd565b62000a8f8162000a888454620009d1565b8462000a0b565b602080601f83116001811462000ac5575f841562000aad5750858301515b5f19600386901b1c1916600185901b17855562000b1f565b5f85815260208120601f198616915b8281101562000af55788860151825594840194600190910190840162000ad4565b508582101562000b1357878501515f19600388901b60f8161c191681555b505060018460011b0185555b505050505050565b5f80835462000b3681620009d1565b6001828116801562000b51576001811462000b675762000b95565b60ff198416875282151583028701945062000b95565b875f526020805f205f5b8581101562000b8c5781548a82015290840190820162000b71565b50505082870194505b50929695505050505050565b5f6020828403121562000bb2575f80fd5b81516001600160a01b038116811462000bc9575f80fd5b9392505050565b60ff841681526001600160a01b03831660208083019190915260a082019060408301845f5b600381101562000c1957815162ffffff168352918301919083019060010162000bf5565b50505050949350505050565b60805160a0516132a062000c4b5f395f81816104a50152610d3901525f50506132a05ff3fe608060405260043610610326575f3560e01c8063715018a6116101ad578063a9059cbb116100ea578063d505accf1161008e578063dd62ed3e1161006b578063dd62ed3e1461097c578063e2745ef21461099b578063f2fde38b146109af578063f4db9698146109ce57005b8063d505accf1461092a578063d551160914610949578063d8454a821461096857005b8063c78fe0d4116100c7578063c78fe0d4146108a1578063cc1776d3146108b5578063d1ace710146108c9578063d232c220146108e857005b8063a9059cbb14610846578063b187bd2614610865578063b56980711461088257005b80638da5cb5b1161015157806396ce07951161012e57806396ce0795146107d5578063a457c2d7146107e9578063a4d8971a14610808578063a5596b4f1461082757005b80638da5cb5b1461078657806395101f90146107a257806395d89b41146107c157005b80638324c3b91161018a5780638324c3b91461072b5780638a8c523c1461073f5780638bf1acff146107535780638d8350ca1461076757005b8063715018a6146106c45780637b1ab0d2146106d85780637ecebe00146106f757005b8063351a964d1161027b57806353d74fdf1161021f5780635fe8e7cc116101fc5780635fe8e7cc1461062e5780636bdb5ad1146106505780636f05be971461066f57806370a082311461069057005b806353d74fdf146105ce57806354fd4d50146105e25780635f6417581461060f57005b8063370158ea11610258578063370158ea14610558578063395093511461057e5780634f7041a51461059d5780635117cdee146105b157005b8063351a964d1461050e57806335ed71a8146105255780633644e5151461054457005b8063095ea7b3116102e257806323b872dd116102bf57806323b872dd14610473578063313ce5671461049257806332633967146104cf57806333d48a7d146104ee57005b8063095ea7b31461042257806315ad87221461044157806318160ddd1461045557005b806302329a291461032f5780630588b1a51461034e578063064a59d01461038357806306fdde03146103b257806307e9652c146103d357806309523308146103f157005b3661032d57005b005b34801561033a575f80fd5b5061032d610349366004612cc5565b6109eb565b348015610359575f80fd5b50600654600160701b900462ffffff165b60405162ffffff90911681526020015b60405180910390f35b34801561038e575f80fd5b50600654600160c01b900463ffffffff1615155b604051901515815260200161037a565b3480156103bd575f80fd5b506103c6610aa0565b60405161037a9190612d27565b3480156103de575f80fd5b506006546301000000900460ff166103a2565b3480156103fc575f80fd5b50600e546001600160a01b03165b6040516001600160a01b03909116815260200161037a565b34801561042d575f80fd5b506103a261043c366004612d4d565b610b30565b34801561044c575f80fd5b5061032d610b46565b348015610460575f80fd5b506007545b60405190815260200161037a565b34801561047e575f80fd5b506103a261048d366004612d77565b610ba6565b34801561049d575f80fd5b5060405160ff7f000000000000000000000000000000000000000000000000000000000000000016815260200161037a565b3480156104da575f80fd5b5061032d6104e9366004612dcc565b610bc7565b3480156104f9575f80fd5b50600654600160881b900462ffffff1661036a565b348015610519575f80fd5b5060065460ff166103a2565b348015610530575f80fd5b5061032d61053f366004612cc5565b610c8e565b34801561054f575f80fd5b50601454610465565b348015610563575f80fd5b5061056c610d2b565b60405161037a96959493929190612de5565b348015610589575f80fd5b506103a2610598366004612d4d565b610eb4565b3480156105a8575f80fd5b5061036a610ecb565b3480156105bc575f80fd5b50600f546001600160a01b031661040a565b3480156105d9575f80fd5b50610465610eda565b3480156105ed575f80fd5b506040805180820190915260058152640312e302e360dc1b60208201526103c6565b34801561061a575f80fd5b5061036a610629366004612e49565b610f55565b348015610639575f80fd5b50610642610fe2565b60405161037a929190612e64565b34801561065b575f80fd5b5061032d61066a366004612dcc565b611001565b34801561067a575f80fd5b506106836110c6565b60405161037a9190612eec565b34801561069b575f80fd5b506104656106aa366004612e49565b6001600160a01b03165f9081526001602052604090205490565b3480156106cf575f80fd5b5061032d6111e3565b3480156106e3575f80fd5b5061040a6106f2366004612f57565b611217565b348015610702575f80fd5b50610465610711366004612e49565b6001600160a01b03165f9081526015602052604090205490565b348015610736575f80fd5b5061032d611267565b34801561074a575f80fd5b5061032d6112c9565b34801561075e575f80fd5b5061036a611376565b348015610772575f80fd5b5061036a610781366004612e49565b61137c565b348015610791575f80fd5b505f546001600160a01b031661040a565b3480156107ad575f80fd5b5061036a6107bc366004612e49565b6113bb565b3480156107cc575f80fd5b506103c6611412565b3480156107e0575f80fd5b506103e861036a565b3480156107f4575f80fd5b506103a2610803366004612d4d565b611421565b348015610813575f80fd5b5061032d610822366004612cc5565b611481565b348015610832575f80fd5b5061032d610841366004612cc5565b6114d5565b348015610851575f80fd5b506103a2610860366004612d4d565b611530565b348015610870575f80fd5b5060065462010000900460ff166103a2565b34801561088d575f80fd5b5061064261089c366004612f8e565b61153c565b3480156108ac575f80fd5b5061032d611739565b3480156108c0575f80fd5b5061036a61179d565b3480156108d4575f80fd5b5061032d6108e3366004612cc5565b6117a7565b3480156108f3575f80fd5b50600d546040805160ff8084161515825261010084048116151560208301526201000090930490921615159082015260600161037a565b348015610935575f80fd5b5061032d610944366004612fbe565b611804565b348015610954575f80fd5b5061032d61096336600461303b565b6119ec565b348015610973575f80fd5b50600854610465565b348015610987575f80fd5b50610465610996366004612f57565b611a39565b3480156109a6575f80fd5b5061032d611a63565b3480156109ba575f80fd5b5061032d6109c9366004612e49565b611af6565b3480156109d9575f80fd5b506011546001600160a01b031661040a565b5f546001600160a01b03163314610a1d5760405162461bcd60e51b8152600401610a14906130e0565b60405180910390fd5b600d5460ff1615610a2c575f80fd5b801515600660029054906101000a900460ff16151503610a4a575f80fd5b60068054821515620100000262ff0000199091161790556040517f0e2fb031ee032dc02d8011dc50b816eb450cf856abd8261680dac74f72165bd290610a9590831515815260200190565b60405180910390a150565b606060128054610aaf90613106565b80601f0160208091040260200160405190810160405280929190818152602001828054610adb90613106565b8015610b265780601f10610afd57610100808354040283529160200191610b26565b820191905f5260205f20905b815481529060010190602001808311610b0957829003601f168201915b5050505050905090565b5f610b3c338484611b3a565b5060015b92915050565b5f546001600160a01b03163314610b6f5760405162461bcd60e51b8152600401610a14906130e0565b600d805460ff191660011790556040517fbac59158523e697197ebd95013205b34c0b416747a935fb50262c337e26ce59a905f90a1565b5f610bb2843384611b9b565b610bbd848484611c04565b5060019392505050565b5f546001600160a01b03163314610bf05760405162461bcd60e51b8152600401610a14906130e0565b600d54610100900460ff1615610c04575f80fd5b60018162ffffff1610158015610c2157506103e88162ffffff1611155b610c5c5760405162461bcd60e51b815260206004820152600c60248201526b302e3030312520746f20312560a01b6044820152606401610a14565b6006805462ffffff60701b1916600160701b62ffffff93909316928302179055600754620186a0910204600955565b50565b5f546001600160a01b03163314610cb75760405162461bcd60e51b8152600401610a14906130e0565b600d5462010000900460ff1615610ccc575f80fd5b801580610ce35750600e546001600160a01b031615155b610d185760405162461bcd60e51b815260206004820152600660248201526509cde40888ab60d31b6044820152606401610a14565b6006805460ff1916911515919091179055565b6060805f805f6060601260137f00000000000000000000000000000000000000000000000000000000000000005f8054906101000a90046001600160a01b0316600754604051806040016040528060058152602001640312e302e360dc1b815250858054610d9890613106565b80601f0160208091040260200160405190810160405280929190818152602001828054610dc490613106565b8015610e0f5780601f10610de657610100808354040283529160200191610e0f565b820191905f5260205f20905b815481529060010190602001808311610df257829003601f168201915b50505050509550848054610e2290613106565b80601f0160208091040260200160405190810160405280929190818152602001828054610e4e90613106565b8015610e995780601f10610e7057610100808354040283529160200191610e99565b820191905f5260205f20905b815481529060010190602001808311610e7c57829003601f168201915b50505050509450955095509550955095509550909192939495565b5f610b3c338484610ec53388611a39565b01611b3a565b5f610ed5336113bb565b905090565b6005545f90815b81811015610f50575f60058281548110610efd57610efd61313e565b5f918252602090912001546001600160a01b03169050801580610f3557506001600160a01b0381165f90815260016020526040902054155b15610f405750610f48565b836001019350505b600101610ee1565b505090565b6006545f906301000000900460ff1615610f7057505f919050565b6001600160a01b038216301480610f9357505f546001600160a01b038381169116145b80610fab5750600f546001600160a01b038381169116145b80610fc35750600e546001600160a01b038381169116145b610fdb57600654600160581b900462ffffff16610b40565b5f92915050565b60605f610fed610eda565b9050610ff95f8261153c565b915091509091565b5f546001600160a01b0316331461102a5760405162461bcd60e51b8152600401610a14906130e0565b600d5462010000900460ff161561103f575f80fd5b60018162ffffff161015801561105c57506103e88162ffffff1611155b6110975760405162461bcd60e51b815260206004820152600c60248201526b302e3030312520746f20312560a01b6044820152606401610a14565b6006805462ffffff60881b1916600160881b62ffffff93909316928302179055600754620186a0910204600b55565b60408051600580825260c08201909252606091816020015b6110e6612bd1565b8152602001906001900390816110de5790505090505f5b60058160ff1610156111df57604080516060808201835260ff84165f81815260046020818152868320805461010090046001600160a01b031687529383529081528551938401958690529394938501936001909201916003918390855b82829054906101000a900462ffffff1662ffffff168152602001906003019060208260020104928301926001038202915080841161115a5750505092845250505060ff83165f81815260046020908152604090912060020154920191909152835184919081106111cc576111cc61313e565b60209081029190910101526001016110fd565b5090565b5f546001600160a01b0316331461120c5760405162461bcd60e51b8152600401610a14906130e0565b6112155f612058565b565b5f80546001600160a01b031633146112415760405162461bcd60e51b8152600401610a14906130e0565b600d5462010000900460ff1615611256575f80fd5b61126083836120a7565b9392505050565b5f546001600160a01b031633146112905760405162461bcd60e51b8152600401610a14906130e0565b600d805461ff0019166101001790556040517fb18b29d65a3b95dc80df0b9528f12b8592bd02395ca19228958e8b7cdf3ddd2b905f90a1565b5f546001600160a01b031633146112f25760405162461bcd60e51b8152600401610a14906130e0565b600d5462010000900460ff1615611307575f80fd5b600654600160c01b900463ffffffff16156113565760405162461bcd60e51b815260206004820152600f60248201526e105b1c9958591e48195b98589b1959608a1b6044820152606401610a14565b6006805463ffffffff60c01b19164263ffffffff16600160c01b02179055565b5f610ed5335b5f6001600160a01b0382163014806113a15750600f546001600160a01b038381169116145b610fdb5760065465010000000000900462ffffff16610b40565b6006545f906301000000900460ff16156113d657505f919050565b6001600160a01b0382163014806113fa5750600f546001600160a01b038381169116145b610fdb57600654600160401b900462ffffff16610b40565b606060138054610aaf90613106565b5f8061142d3385611a39565b9050828110156114745760405162461bcd60e51b81526020600482015260126024820152714e6567617469766520616c6c6f77616e636560701b6044820152606401610a14565b610bbd3385858403611b3a565b5f546001600160a01b031633146114aa5760405162461bcd60e51b8152600401610a14906130e0565b60065460ff1680156114c45750600654610100900460ff16155b6114cc575f80fd5b610c8b81612388565b5f546001600160a01b031633146114fe5760405162461bcd60e51b8152600401610a14906130e0565b600d54610100900460ff1615611512575f80fd5b6006805491151563010000000263ff00000019909216919091179055565b5f610b3c338484611c04565b60605f611547610eda565b90508383101580156115595750808411155b6115955760405162461bcd60e51b815260206004820152600d60248201526c496e76616c69642072616e676560981b6044820152606401610a14565b6001848403018482038111156115aa57508381035b5f81116115e85760405162461bcd60e51b815260206004820152600c60248201526b4f7574206f662072616e676560a01b6044820152606401610a14565b5f8167ffffffffffffffff81111561160257611602613027565b60405190808252806020026020018201604052801561164657816020015b604080518082019091525f80825260208201528152602001906001900390816116205790505b506005549091505f80805b8381101561172a575f6005828154811061166d5761166d61313e565b5f918252602090912001546001600160a01b031690508015806116a557506001600160a01b0381165f90815260016020526040902054155b156116b05750611722565b60018401938b11156116c25750611722565b6040805180820182526001600160a01b0383168082525f90815260016020908152929020549181019190915286518790859081106117025761170261313e565b6020026020010181905250868360010193508310611720575061172a565b505b600101611651565b50929550505050509250929050565b5f546001600160a01b031633146117625760405162461bcd60e51b8152600401610a14906130e0565b600d805462ff00001916620100001790556040517ff7f7205ed48f7a35df9b5857667bdee0189d5d7cd80588f217a82641c3b4d08c905f90a1565b5f610ed533610f55565b5f546001600160a01b031633146117d05760405162461bcd60e51b8152600401610a14906130e0565b600654610100900460ff161580156117f35750600654640100000000900460ff16155b6117fb575f80fd5b610c8b816126c8565b428410156118485760405162461bcd60e51b815260206004820152601160248201527045787069726564207369676e617475726560781b6044820152606401610a14565b6014546001600160a01b038881165f8181526015602090815260408083208054600180820190925582517f6e71edae12b1b97f4d1f60370fef10105fa2faae0126114a169c64845d6126c98186015280840196909652958d166060860152608085018c905260a085019590955260c08085018b90528151808603909101815260e08501825280519083012061190160f01b6101008601526101028501969096526101228085019690965280518085039096018652610142840180825286519683019690962095839052610162840180825286905260ff89166101828501526101a284018890526101c28401879052519193926101e280820193601f1981019281900390910190855afa158015611960573d5f803e3d5ffd5b5050604051601f1901519150506001600160a01b038116158015906119965750886001600160a01b0316816001600160a01b0316145b6119d65760405162461bcd60e51b8152602060048201526011602482015270496e76616c6964207369676e617475726560781b6044820152606401610a14565b50506119e3878787611b3a565b50505050505050565b5f546001600160a01b03163314611a155760405162461bcd60e51b8152600401610a14906130e0565b600d54610100900460ff1615611a29575f80fd5b611a34838383612815565b505050565b6001600160a01b039182165f90815260026020908152604080832093909416825291909152205490565b5f546001600160a01b03163314611a8c5760405162461bcd60e51b8152600401610a14906130e0565b60065460ff168015611aa65750600654610100900460ff16155b611aae575f80fd5b600c54600a54305f908152600160205260409020549101908110611ad0575f80fd5b305f90815260016020526040812054600c80549390910390920190915561121590612388565b5f546001600160a01b03163314611b1f5760405162461bcd60e51b8152600401610a14906130e0565b6001600160a01b038116611b31575f80fd5b610c8b81612058565b6001600160a01b038381165f8181526002602090815260408083209487168084529482529182902085905590518481527f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92591015b60405180910390a3505050565b5f611ba68484611a39565b905081811015611bf15760405162461bcd60e51b8152602060048201526016602482015275496e73756666696369656e7420616c6c6f77616e636560501b6044820152606401610a14565b611bfe8484848403611b3a565b50505050565b60065462010000900460ff1615611c465760405162461bcd60e51b815260206004820152600660248201526514185d5cd95960d21b6044820152606401610a14565b600654640100000000900460ff16158015611c695750600654610100900460ff16155b8015611c9c5750600f546001600160a01b03848116911614801590611c9c5750600e546001600160a01b03848116911614155b15611cb357611caa5f612388565b611cb35f6126c8565b5f81118015611ccf57505f546001600160a01b03848116911614155b8015611ce857505f546001600160a01b03838116911614155b8015611cfd57506001600160a01b0383163014155b8015611d1257506001600160a01b0382163014155b8015611d2c5750600e546001600160a01b03838116911614155b15611fba57600f546001600160a01b03848116911614801590611d5d5750600f546001600160a01b03838116911614155b80611da65750600f546001600160a01b0384811691161480611d8c5750600f546001600160a01b038381169116145b8015611da65750600654600160c01b900463ffffffff1615155b611de55760405162461bcd60e51b815260206004820152601060248201526f151c98591a5b99c8191a5cd8589b195960821b6044820152606401610a14565b6006546301000000900460ff16158015611e0a5750600654640100000000900460ff16155b8015611e1e5750600654610100900460ff16155b15611fba57600f545f9081906001600160a01b0386811691161480611e505750600f546001600160a01b038581169116145b15611e7757600f546001600160a01b03868116911614611e71576002611e74565b60015b90505b5f5b60058160ff161015611fa2575f808360ff1611611ec65760ff82165f908152600460205260408120600101905b600a91828204019190066003029054906101000a900462ffffff16611f0e565b8260ff16600114611eec5760ff82165f9081526004602052604090206001016002611ea6565b60ff82165f908152600460205260409020600101546301000000900462ffffff165b62ffffff169050805f03611f225750611f9a565b620186a085820204611f35883083612a6b565b600f5460ff84165f908152600460205260409020546001600160a01b0391821661010090910490911603611f7057600c805482019055611f93565b60ff83165f908152600460205260409020600201805482019055600a8054820190555b9390930192505b600101611e79565b508115611fb757600880548301905591819003915b50505b611fc5838383612a6b565b5f81118015611fec57506001600160a01b0382165f9081526003602052604090205460ff16155b15611a3457506001600160a01b03165f818152600360205260408120805460ff191660019081179091556005805491820181559091527f036b6384b5eca791c62761152d0c79bb0604c104a5fb6f4eb0703f3154bb3db00180546001600160a01b031916909117905550565b5f80546001600160a01b038381166001600160a01b0319831681178455604051919092169283917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e09190a35050565b5f6001600160a01b0383166120ba575f80fd5b600e546001600160a01b038481169116146122fd575f8390505f816001600160a01b031663c45a01556040518163ffffffff1660e01b8152600401602060405180830381865afa158015612110573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906121349190613152565b90505f826001600160a01b031663ad5c46486040518163ffffffff1660e01b8152600401602060405180830381865afa158015612173573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906121979190613152565b60405163e6a4390560e01b81523060048201526001600160a01b0380831660248301529192505f9184169063e6a43905906044016020604051808303815f875af11580156121e7573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061220b9190613152565b90506001600160a01b03811661228d576040516364e329cb60e11b81523060048201526001600160a01b03838116602483015284169063c9c65396906044016020604051808303815f875af1158015612266573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061228a9190613152565b90505b604080516080810182526001600160a01b03808a168083529381166020830181905294811692820183905288166060909101819052600e80546001600160a01b03199081169094179055600f80548416909417909355601080548316909117905560118054909116909117905550505b6011546001600160a01b0383811691161461232e57601180546001600160a01b0319166001600160a01b0384161790555b600f546040516001600160a01b038481168252918216918516907fe3743072cd064c5a6840c1cd47d7a34d7fbdc85cf7a30ba9036b90defa01716f9060200160405180910390a350600f546001600160a01b031692915050565b6006805461ff001981166101001790915560ff16156126ba5780806123dc5750600b546002600c54816123bd576123bd61316d565b04101580156123dc5750600c54305f9081526001602052604090205410155b156126ba575f6002600c54816123f4576123f461316d565b60408051600280825260608201835293909204935047925f929160208301908036833701905050905030815f815181106124305761243061313e565b6001600160a01b0392831660209182029290920101526010548251911690829060019081106124615761246161313e565b6001600160a01b039283166020918202929092010152600e546124879130911685611b3a565b600e5460405163791ac94760e01b81526001600160a01b039091169063791ac947906124c29086905f90869030904260010190600401613181565b5f604051808303815f87803b1580156124d9575f80fd5b505af19250505080156124ea575060015b61250b57600e546125069030906001600160a01b03165f611b3a565b6126b6565b600680546001600160e01b0316600160e01b63ffffffff421602179055600c541561254c576002600c5f828254816125455761254561316d565b0490915550505b604080518481524784900360208201819052917f054301190fdd9cbc2629a04d617cd2c664ec09eb96f277e80bfde32405ea3e14910160405180910390a180156126b4575f8411801561259e57505f81115b156126b457600e546125bb9030906001600160a01b031686611b3a565b600e5460115460405163f305d71960e01b8152306004820152602481018790525f6044820181905260648201526001600160a01b0391821660848201526001420160a482015291169063f305d71990839060c40160606040518083038185885af19350505050801561264a575060408051601f3d908101601f19168201909252612647918101906131f2565b60015b61266b57600e546126669030906001600160a01b03165f611b3a565b6126b4565b60408051848152602081018490529081018290527f17bbfb9a6069321b6ded73bd96327c9e6b7212a5cd51ff219cd61370acafb5619060600160405180910390a150505f600c55505b505b5050505b506006805461ff0019169055565b6006805464ff0000000019166401000000001790558061271357600a5415806127005750600a54305f90815260016020526040902054105b8061270e5750600954600a54105b612804575b5f805b60058160ff1610156127b05760ff81165f90815260046020526040902080546002909101546101009091046001600160a01b0316908015806127655750600f546001600160a01b038381169116145b156127715750506127a8565b5f61277c8383612ba8565b905080156127a05760ff84165f908152600460205260409020600201805482900390555b939093019250505b600101612716565b506006805463ffffffff60a01b1916600160a01b63ffffffff4216021790556040805182815290517fbb245b3c380b63918dc25ab2cc2e4b6939c4d58ffd95ea052b685a031e1ad2979181900360200190a1505b506006805464ff0000000019169055565b60058360ff1610612824575f80fd5b6001600160a01b038216301480159061284857506001600160a01b03821661dead14155b801561285c57506001600160a01b03821615155b612864575f80fd5b60ff83165f9081526004602090815260409182902060018101805485516006805467ffffff000000000019811662ffffff94851690930365010000000000808304861691909101851681029384178084558654988b01516affffff0000000000000000199095166affffffffffff0000000000199093169290921763010000009098048516909303600160401b9182900485160184160295909517808655925495870151600160581b80850484166601000000000000909804841690910396909601821690950262ffffff60581b19909216919091179283905590926161a8920416118015906129b057506006546161a8600160401b90910462ffffff161180159061298157506006546161a8600160581b90910462ffffff1611155b80156129b057506006546161a8600160401b820462ffffff908116600160581b90930481169290920190911611155b6129e75760405162461bcd60e51b8152602060048201526008602482015267090d2ced040a8c2f60c31b6044820152606401610a14565b8054610100600160a81b0319166101006001600160a01b03851602178155612a1460018201836003612bff565b50805460ff16612a2a57805460ff191660011781555b7f93dd041a76c0a756b346cffaf7b1e0b1c3f26f0c908f8a4600c5e9d530fa21a1848484604051612a5d9392919061321d565b60405180910390a150505050565b6001600160a01b03831615801590612a8b57506001600160a01b03821615155b612ad75760405162461bcd60e51b815260206004820152601d60248201527f5472616e736665722066726f6d2f746f207a65726f20616464726573730000006044820152606401610a14565b6001600160a01b0383165f90815260016020526040902054811115612b305760405162461bcd60e51b815260206004820152600f60248201526e457863656564732062616c616e636560881b6044820152606401610a14565b8015612b63576001600160a01b038084165f90815260016020526040808220805485900390559184168152208054820190555b816001600160a01b0316836001600160a01b03167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef83604051611b8e91815260200190565b5f612bb4308484612a6b565b81600a5f828254612bc5919061324b565b90915550919392505050565b60405180606001604052805f6001600160a01b03168152602001612bf3612c93565b81526020015f81525090565b600183019183908215612c87579160200282015f5b83821115612c5657835183826101000a81548162ffffff021916908362ffffff1602179055509260200192600301602081600201049283019260010302612c14565b8015612c855782816101000a81549062ffffff0219169055600301602081600201049283019260010302612c56565b505b506111df929150612cb1565b60405180606001604052806003906020820280368337509192915050565b5b808211156111df575f8155600101612cb2565b5f60208284031215612cd5575f80fd5b81358015158114611260575f80fd5b5f81518084525f5b81811015612d0857602081850181015186830182015201612cec565b505f602082860101526020601f19601f83011685010191505092915050565b602081525f6112606020830184612ce4565b6001600160a01b0381168114610c8b575f80fd5b5f8060408385031215612d5e575f80fd5b8235612d6981612d39565b946020939093013593505050565b5f805f60608486031215612d89575f80fd5b8335612d9481612d39565b92506020840135612da481612d39565b929592945050506040919091013590565b803562ffffff81168114612dc7575f80fd5b919050565b5f60208284031215612ddc575f80fd5b61126082612db5565b60c081525f612df760c0830189612ce4565b8281036020840152612e098189612ce4565b60ff881660408501526001600160a01b03871660608501526080840186905283810360a08501529050612e3c8185612ce4565b9998505050505050505050565b5f60208284031215612e59575f80fd5b813561126081612d39565b604080825283518282018190525f91906020906060850190828801855b82811015612eaf57815180516001600160a01b03168552850151858501529285019290840190600101612e81565b5050508093505050508260208301529392505050565b805f5b6003811015611bfe57815162ffffff16845260209384019390910190600101612ec8565b602080825282518282018190525f919060409081850190868401855b82811015612f4a57815180516001600160a01b0316855286810151612f2f88870182612ec5565b50850151608085015260a09093019290850190600101612f08565b5091979650505050505050565b5f8060408385031215612f68575f80fd5b8235612f7381612d39565b91506020830135612f8381612d39565b809150509250929050565b5f8060408385031215612f9f575f80fd5b50508035926020909101359150565b803560ff81168114612dc7575f80fd5b5f805f805f805f60e0888a031215612fd4575f80fd5b8735612fdf81612d39565b96506020880135612fef81612d39565b9550604088013594506060880135935061300b60808901612fae565b925060a0880135915060c0880135905092959891949750929550565b634e487b7160e01b5f52604160045260245ffd5b5f805f60a0848603121561304d575f80fd5b61305684612fae565b925060208085013561306781612d39565b9250605f85018613613077575f80fd5b6040516060810181811067ffffffffffffffff8211171561309a5761309a613027565b6040528060a08701888111156130ae575f80fd5b604088015b818110156130d1576130c481612db5565b83529184019184016130b3565b50505080925050509250925092565b6020808252600c908201526b155b985d5d1a1bdc9a5e995960a21b604082015260600190565b600181811c9082168061311a57607f821691505b60208210810361313857634e487b7160e01b5f52602260045260245ffd5b50919050565b634e487b7160e01b5f52603260045260245ffd5b5f60208284031215613162575f80fd5b815161126081612d39565b634e487b7160e01b5f52601260045260245ffd5b5f60a08201878352602087602085015260a0604085015281875180845260c0860191506020890193505f5b818110156131d15784516001600160a01b0316835293830193918301916001016131ac565b50506001600160a01b03969096166060850152505050608001529392505050565b5f805f60608486031215613204575f80fd5b8351925060208401519150604084015190509250925092565b60ff841681526001600160a01b038316602082015260a081016132436040830184612ec5565b949350505050565b81810381811115610b4057634e487b7160e01b5f52601160045260245ffdfea2646970667358221220644d37236bd965e8d457ee9c09677b6b5dc7968576f7ba0d6e0ea22517c7c46364736f6c63430008170033036b6384b5eca791c62761152d0c79bb0604c104a5fb6f4eb0703f3154bb3db0

Deployed Bytecode

0x608060405260043610610326575f3560e01c8063715018a6116101ad578063a9059cbb116100ea578063d505accf1161008e578063dd62ed3e1161006b578063dd62ed3e1461097c578063e2745ef21461099b578063f2fde38b146109af578063f4db9698146109ce57005b8063d505accf1461092a578063d551160914610949578063d8454a821461096857005b8063c78fe0d4116100c7578063c78fe0d4146108a1578063cc1776d3146108b5578063d1ace710146108c9578063d232c220146108e857005b8063a9059cbb14610846578063b187bd2614610865578063b56980711461088257005b80638da5cb5b1161015157806396ce07951161012e57806396ce0795146107d5578063a457c2d7146107e9578063a4d8971a14610808578063a5596b4f1461082757005b80638da5cb5b1461078657806395101f90146107a257806395d89b41146107c157005b80638324c3b91161018a5780638324c3b91461072b5780638a8c523c1461073f5780638bf1acff146107535780638d8350ca1461076757005b8063715018a6146106c45780637b1ab0d2146106d85780637ecebe00146106f757005b8063351a964d1161027b57806353d74fdf1161021f5780635fe8e7cc116101fc5780635fe8e7cc1461062e5780636bdb5ad1146106505780636f05be971461066f57806370a082311461069057005b806353d74fdf146105ce57806354fd4d50146105e25780635f6417581461060f57005b8063370158ea11610258578063370158ea14610558578063395093511461057e5780634f7041a51461059d5780635117cdee146105b157005b8063351a964d1461050e57806335ed71a8146105255780633644e5151461054457005b8063095ea7b3116102e257806323b872dd116102bf57806323b872dd14610473578063313ce5671461049257806332633967146104cf57806333d48a7d146104ee57005b8063095ea7b31461042257806315ad87221461044157806318160ddd1461045557005b806302329a291461032f5780630588b1a51461034e578063064a59d01461038357806306fdde03146103b257806307e9652c146103d357806309523308146103f157005b3661032d57005b005b34801561033a575f80fd5b5061032d610349366004612cc5565b6109eb565b348015610359575f80fd5b50600654600160701b900462ffffff165b60405162ffffff90911681526020015b60405180910390f35b34801561038e575f80fd5b50600654600160c01b900463ffffffff1615155b604051901515815260200161037a565b3480156103bd575f80fd5b506103c6610aa0565b60405161037a9190612d27565b3480156103de575f80fd5b506006546301000000900460ff166103a2565b3480156103fc575f80fd5b50600e546001600160a01b03165b6040516001600160a01b03909116815260200161037a565b34801561042d575f80fd5b506103a261043c366004612d4d565b610b30565b34801561044c575f80fd5b5061032d610b46565b348015610460575f80fd5b506007545b60405190815260200161037a565b34801561047e575f80fd5b506103a261048d366004612d77565b610ba6565b34801561049d575f80fd5b5060405160ff7f000000000000000000000000000000000000000000000000000000000000001216815260200161037a565b3480156104da575f80fd5b5061032d6104e9366004612dcc565b610bc7565b3480156104f9575f80fd5b50600654600160881b900462ffffff1661036a565b348015610519575f80fd5b5060065460ff166103a2565b348015610530575f80fd5b5061032d61053f366004612cc5565b610c8e565b34801561054f575f80fd5b50601454610465565b348015610563575f80fd5b5061056c610d2b565b60405161037a96959493929190612de5565b348015610589575f80fd5b506103a2610598366004612d4d565b610eb4565b3480156105a8575f80fd5b5061036a610ecb565b3480156105bc575f80fd5b50600f546001600160a01b031661040a565b3480156105d9575f80fd5b50610465610eda565b3480156105ed575f80fd5b506040805180820190915260058152640312e302e360dc1b60208201526103c6565b34801561061a575f80fd5b5061036a610629366004612e49565b610f55565b348015610639575f80fd5b50610642610fe2565b60405161037a929190612e64565b34801561065b575f80fd5b5061032d61066a366004612dcc565b611001565b34801561067a575f80fd5b506106836110c6565b60405161037a9190612eec565b34801561069b575f80fd5b506104656106aa366004612e49565b6001600160a01b03165f9081526001602052604090205490565b3480156106cf575f80fd5b5061032d6111e3565b3480156106e3575f80fd5b5061040a6106f2366004612f57565b611217565b348015610702575f80fd5b50610465610711366004612e49565b6001600160a01b03165f9081526015602052604090205490565b348015610736575f80fd5b5061032d611267565b34801561074a575f80fd5b5061032d6112c9565b34801561075e575f80fd5b5061036a611376565b348015610772575f80fd5b5061036a610781366004612e49565b61137c565b348015610791575f80fd5b505f546001600160a01b031661040a565b3480156107ad575f80fd5b5061036a6107bc366004612e49565b6113bb565b3480156107cc575f80fd5b506103c6611412565b3480156107e0575f80fd5b506103e861036a565b3480156107f4575f80fd5b506103a2610803366004612d4d565b611421565b348015610813575f80fd5b5061032d610822366004612cc5565b611481565b348015610832575f80fd5b5061032d610841366004612cc5565b6114d5565b348015610851575f80fd5b506103a2610860366004612d4d565b611530565b348015610870575f80fd5b5060065462010000900460ff166103a2565b34801561088d575f80fd5b5061064261089c366004612f8e565b61153c565b3480156108ac575f80fd5b5061032d611739565b3480156108c0575f80fd5b5061036a61179d565b3480156108d4575f80fd5b5061032d6108e3366004612cc5565b6117a7565b3480156108f3575f80fd5b50600d546040805160ff8084161515825261010084048116151560208301526201000090930490921615159082015260600161037a565b348015610935575f80fd5b5061032d610944366004612fbe565b611804565b348015610954575f80fd5b5061032d61096336600461303b565b6119ec565b348015610973575f80fd5b50600854610465565b348015610987575f80fd5b50610465610996366004612f57565b611a39565b3480156109a6575f80fd5b5061032d611a63565b3480156109ba575f80fd5b5061032d6109c9366004612e49565b611af6565b3480156109d9575f80fd5b506011546001600160a01b031661040a565b5f546001600160a01b03163314610a1d5760405162461bcd60e51b8152600401610a14906130e0565b60405180910390fd5b600d5460ff1615610a2c575f80fd5b801515600660029054906101000a900460ff16151503610a4a575f80fd5b60068054821515620100000262ff0000199091161790556040517f0e2fb031ee032dc02d8011dc50b816eb450cf856abd8261680dac74f72165bd290610a9590831515815260200190565b60405180910390a150565b606060128054610aaf90613106565b80601f0160208091040260200160405190810160405280929190818152602001828054610adb90613106565b8015610b265780601f10610afd57610100808354040283529160200191610b26565b820191905f5260205f20905b815481529060010190602001808311610b0957829003601f168201915b5050505050905090565b5f610b3c338484611b3a565b5060015b92915050565b5f546001600160a01b03163314610b6f5760405162461bcd60e51b8152600401610a14906130e0565b600d805460ff191660011790556040517fbac59158523e697197ebd95013205b34c0b416747a935fb50262c337e26ce59a905f90a1565b5f610bb2843384611b9b565b610bbd848484611c04565b5060019392505050565b5f546001600160a01b03163314610bf05760405162461bcd60e51b8152600401610a14906130e0565b600d54610100900460ff1615610c04575f80fd5b60018162ffffff1610158015610c2157506103e88162ffffff1611155b610c5c5760405162461bcd60e51b815260206004820152600c60248201526b302e3030312520746f20312560a01b6044820152606401610a14565b6006805462ffffff60701b1916600160701b62ffffff93909316928302179055600754620186a0910204600955565b50565b5f546001600160a01b03163314610cb75760405162461bcd60e51b8152600401610a14906130e0565b600d5462010000900460ff1615610ccc575f80fd5b801580610ce35750600e546001600160a01b031615155b610d185760405162461bcd60e51b815260206004820152600660248201526509cde40888ab60d31b6044820152606401610a14565b6006805460ff1916911515919091179055565b6060805f805f6060601260137f00000000000000000000000000000000000000000000000000000000000000125f8054906101000a90046001600160a01b0316600754604051806040016040528060058152602001640312e302e360dc1b815250858054610d9890613106565b80601f0160208091040260200160405190810160405280929190818152602001828054610dc490613106565b8015610e0f5780601f10610de657610100808354040283529160200191610e0f565b820191905f5260205f20905b815481529060010190602001808311610df257829003601f168201915b50505050509550848054610e2290613106565b80601f0160208091040260200160405190810160405280929190818152602001828054610e4e90613106565b8015610e995780601f10610e7057610100808354040283529160200191610e99565b820191905f5260205f20905b815481529060010190602001808311610e7c57829003601f168201915b50505050509450955095509550955095509550909192939495565b5f610b3c338484610ec53388611a39565b01611b3a565b5f610ed5336113bb565b905090565b6005545f90815b81811015610f50575f60058281548110610efd57610efd61313e565b5f918252602090912001546001600160a01b03169050801580610f3557506001600160a01b0381165f90815260016020526040902054155b15610f405750610f48565b836001019350505b600101610ee1565b505090565b6006545f906301000000900460ff1615610f7057505f919050565b6001600160a01b038216301480610f9357505f546001600160a01b038381169116145b80610fab5750600f546001600160a01b038381169116145b80610fc35750600e546001600160a01b038381169116145b610fdb57600654600160581b900462ffffff16610b40565b5f92915050565b60605f610fed610eda565b9050610ff95f8261153c565b915091509091565b5f546001600160a01b0316331461102a5760405162461bcd60e51b8152600401610a14906130e0565b600d5462010000900460ff161561103f575f80fd5b60018162ffffff161015801561105c57506103e88162ffffff1611155b6110975760405162461bcd60e51b815260206004820152600c60248201526b302e3030312520746f20312560a01b6044820152606401610a14565b6006805462ffffff60881b1916600160881b62ffffff93909316928302179055600754620186a0910204600b55565b60408051600580825260c08201909252606091816020015b6110e6612bd1565b8152602001906001900390816110de5790505090505f5b60058160ff1610156111df57604080516060808201835260ff84165f81815260046020818152868320805461010090046001600160a01b031687529383529081528551938401958690529394938501936001909201916003918390855b82829054906101000a900462ffffff1662ffffff168152602001906003019060208260020104928301926001038202915080841161115a5750505092845250505060ff83165f81815260046020908152604090912060020154920191909152835184919081106111cc576111cc61313e565b60209081029190910101526001016110fd565b5090565b5f546001600160a01b0316331461120c5760405162461bcd60e51b8152600401610a14906130e0565b6112155f612058565b565b5f80546001600160a01b031633146112415760405162461bcd60e51b8152600401610a14906130e0565b600d5462010000900460ff1615611256575f80fd5b61126083836120a7565b9392505050565b5f546001600160a01b031633146112905760405162461bcd60e51b8152600401610a14906130e0565b600d805461ff0019166101001790556040517fb18b29d65a3b95dc80df0b9528f12b8592bd02395ca19228958e8b7cdf3ddd2b905f90a1565b5f546001600160a01b031633146112f25760405162461bcd60e51b8152600401610a14906130e0565b600d5462010000900460ff1615611307575f80fd5b600654600160c01b900463ffffffff16156113565760405162461bcd60e51b815260206004820152600f60248201526e105b1c9958591e48195b98589b1959608a1b6044820152606401610a14565b6006805463ffffffff60c01b19164263ffffffff16600160c01b02179055565b5f610ed5335b5f6001600160a01b0382163014806113a15750600f546001600160a01b038381169116145b610fdb5760065465010000000000900462ffffff16610b40565b6006545f906301000000900460ff16156113d657505f919050565b6001600160a01b0382163014806113fa5750600f546001600160a01b038381169116145b610fdb57600654600160401b900462ffffff16610b40565b606060138054610aaf90613106565b5f8061142d3385611a39565b9050828110156114745760405162461bcd60e51b81526020600482015260126024820152714e6567617469766520616c6c6f77616e636560701b6044820152606401610a14565b610bbd3385858403611b3a565b5f546001600160a01b031633146114aa5760405162461bcd60e51b8152600401610a14906130e0565b60065460ff1680156114c45750600654610100900460ff16155b6114cc575f80fd5b610c8b81612388565b5f546001600160a01b031633146114fe5760405162461bcd60e51b8152600401610a14906130e0565b600d54610100900460ff1615611512575f80fd5b6006805491151563010000000263ff00000019909216919091179055565b5f610b3c338484611c04565b60605f611547610eda565b90508383101580156115595750808411155b6115955760405162461bcd60e51b815260206004820152600d60248201526c496e76616c69642072616e676560981b6044820152606401610a14565b6001848403018482038111156115aa57508381035b5f81116115e85760405162461bcd60e51b815260206004820152600c60248201526b4f7574206f662072616e676560a01b6044820152606401610a14565b5f8167ffffffffffffffff81111561160257611602613027565b60405190808252806020026020018201604052801561164657816020015b604080518082019091525f80825260208201528152602001906001900390816116205790505b506005549091505f80805b8381101561172a575f6005828154811061166d5761166d61313e565b5f918252602090912001546001600160a01b031690508015806116a557506001600160a01b0381165f90815260016020526040902054155b156116b05750611722565b60018401938b11156116c25750611722565b6040805180820182526001600160a01b0383168082525f90815260016020908152929020549181019190915286518790859081106117025761170261313e565b6020026020010181905250868360010193508310611720575061172a565b505b600101611651565b50929550505050509250929050565b5f546001600160a01b031633146117625760405162461bcd60e51b8152600401610a14906130e0565b600d805462ff00001916620100001790556040517ff7f7205ed48f7a35df9b5857667bdee0189d5d7cd80588f217a82641c3b4d08c905f90a1565b5f610ed533610f55565b5f546001600160a01b031633146117d05760405162461bcd60e51b8152600401610a14906130e0565b600654610100900460ff161580156117f35750600654640100000000900460ff16155b6117fb575f80fd5b610c8b816126c8565b428410156118485760405162461bcd60e51b815260206004820152601160248201527045787069726564207369676e617475726560781b6044820152606401610a14565b6014546001600160a01b038881165f8181526015602090815260408083208054600180820190925582517f6e71edae12b1b97f4d1f60370fef10105fa2faae0126114a169c64845d6126c98186015280840196909652958d166060860152608085018c905260a085019590955260c08085018b90528151808603909101815260e08501825280519083012061190160f01b6101008601526101028501969096526101228085019690965280518085039096018652610142840180825286519683019690962095839052610162840180825286905260ff89166101828501526101a284018890526101c28401879052519193926101e280820193601f1981019281900390910190855afa158015611960573d5f803e3d5ffd5b5050604051601f1901519150506001600160a01b038116158015906119965750886001600160a01b0316816001600160a01b0316145b6119d65760405162461bcd60e51b8152602060048201526011602482015270496e76616c6964207369676e617475726560781b6044820152606401610a14565b50506119e3878787611b3a565b50505050505050565b5f546001600160a01b03163314611a155760405162461bcd60e51b8152600401610a14906130e0565b600d54610100900460ff1615611a29575f80fd5b611a34838383612815565b505050565b6001600160a01b039182165f90815260026020908152604080832093909416825291909152205490565b5f546001600160a01b03163314611a8c5760405162461bcd60e51b8152600401610a14906130e0565b60065460ff168015611aa65750600654610100900460ff16155b611aae575f80fd5b600c54600a54305f908152600160205260409020549101908110611ad0575f80fd5b305f90815260016020526040812054600c80549390910390920190915561121590612388565b5f546001600160a01b03163314611b1f5760405162461bcd60e51b8152600401610a14906130e0565b6001600160a01b038116611b31575f80fd5b610c8b81612058565b6001600160a01b038381165f8181526002602090815260408083209487168084529482529182902085905590518481527f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92591015b60405180910390a3505050565b5f611ba68484611a39565b905081811015611bf15760405162461bcd60e51b8152602060048201526016602482015275496e73756666696369656e7420616c6c6f77616e636560501b6044820152606401610a14565b611bfe8484848403611b3a565b50505050565b60065462010000900460ff1615611c465760405162461bcd60e51b815260206004820152600660248201526514185d5cd95960d21b6044820152606401610a14565b600654640100000000900460ff16158015611c695750600654610100900460ff16155b8015611c9c5750600f546001600160a01b03848116911614801590611c9c5750600e546001600160a01b03848116911614155b15611cb357611caa5f612388565b611cb35f6126c8565b5f81118015611ccf57505f546001600160a01b03848116911614155b8015611ce857505f546001600160a01b03838116911614155b8015611cfd57506001600160a01b0383163014155b8015611d1257506001600160a01b0382163014155b8015611d2c5750600e546001600160a01b03838116911614155b15611fba57600f546001600160a01b03848116911614801590611d5d5750600f546001600160a01b03838116911614155b80611da65750600f546001600160a01b0384811691161480611d8c5750600f546001600160a01b038381169116145b8015611da65750600654600160c01b900463ffffffff1615155b611de55760405162461bcd60e51b815260206004820152601060248201526f151c98591a5b99c8191a5cd8589b195960821b6044820152606401610a14565b6006546301000000900460ff16158015611e0a5750600654640100000000900460ff16155b8015611e1e5750600654610100900460ff16155b15611fba57600f545f9081906001600160a01b0386811691161480611e505750600f546001600160a01b038581169116145b15611e7757600f546001600160a01b03868116911614611e71576002611e74565b60015b90505b5f5b60058160ff161015611fa2575f808360ff1611611ec65760ff82165f908152600460205260408120600101905b600a91828204019190066003029054906101000a900462ffffff16611f0e565b8260ff16600114611eec5760ff82165f9081526004602052604090206001016002611ea6565b60ff82165f908152600460205260409020600101546301000000900462ffffff165b62ffffff169050805f03611f225750611f9a565b620186a085820204611f35883083612a6b565b600f5460ff84165f908152600460205260409020546001600160a01b0391821661010090910490911603611f7057600c805482019055611f93565b60ff83165f908152600460205260409020600201805482019055600a8054820190555b9390930192505b600101611e79565b508115611fb757600880548301905591819003915b50505b611fc5838383612a6b565b5f81118015611fec57506001600160a01b0382165f9081526003602052604090205460ff16155b15611a3457506001600160a01b03165f818152600360205260408120805460ff191660019081179091556005805491820181559091527f036b6384b5eca791c62761152d0c79bb0604c104a5fb6f4eb0703f3154bb3db00180546001600160a01b031916909117905550565b5f80546001600160a01b038381166001600160a01b0319831681178455604051919092169283917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e09190a35050565b5f6001600160a01b0383166120ba575f80fd5b600e546001600160a01b038481169116146122fd575f8390505f816001600160a01b031663c45a01556040518163ffffffff1660e01b8152600401602060405180830381865afa158015612110573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906121349190613152565b90505f826001600160a01b031663ad5c46486040518163ffffffff1660e01b8152600401602060405180830381865afa158015612173573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906121979190613152565b60405163e6a4390560e01b81523060048201526001600160a01b0380831660248301529192505f9184169063e6a43905906044016020604051808303815f875af11580156121e7573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061220b9190613152565b90506001600160a01b03811661228d576040516364e329cb60e11b81523060048201526001600160a01b03838116602483015284169063c9c65396906044016020604051808303815f875af1158015612266573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061228a9190613152565b90505b604080516080810182526001600160a01b03808a168083529381166020830181905294811692820183905288166060909101819052600e80546001600160a01b03199081169094179055600f80548416909417909355601080548316909117905560118054909116909117905550505b6011546001600160a01b0383811691161461232e57601180546001600160a01b0319166001600160a01b0384161790555b600f546040516001600160a01b038481168252918216918516907fe3743072cd064c5a6840c1cd47d7a34d7fbdc85cf7a30ba9036b90defa01716f9060200160405180910390a350600f546001600160a01b031692915050565b6006805461ff001981166101001790915560ff16156126ba5780806123dc5750600b546002600c54816123bd576123bd61316d565b04101580156123dc5750600c54305f9081526001602052604090205410155b156126ba575f6002600c54816123f4576123f461316d565b60408051600280825260608201835293909204935047925f929160208301908036833701905050905030815f815181106124305761243061313e565b6001600160a01b0392831660209182029290920101526010548251911690829060019081106124615761246161313e565b6001600160a01b039283166020918202929092010152600e546124879130911685611b3a565b600e5460405163791ac94760e01b81526001600160a01b039091169063791ac947906124c29086905f90869030904260010190600401613181565b5f604051808303815f87803b1580156124d9575f80fd5b505af19250505080156124ea575060015b61250b57600e546125069030906001600160a01b03165f611b3a565b6126b6565b600680546001600160e01b0316600160e01b63ffffffff421602179055600c541561254c576002600c5f828254816125455761254561316d565b0490915550505b604080518481524784900360208201819052917f054301190fdd9cbc2629a04d617cd2c664ec09eb96f277e80bfde32405ea3e14910160405180910390a180156126b4575f8411801561259e57505f81115b156126b457600e546125bb9030906001600160a01b031686611b3a565b600e5460115460405163f305d71960e01b8152306004820152602481018790525f6044820181905260648201526001600160a01b0391821660848201526001420160a482015291169063f305d71990839060c40160606040518083038185885af19350505050801561264a575060408051601f3d908101601f19168201909252612647918101906131f2565b60015b61266b57600e546126669030906001600160a01b03165f611b3a565b6126b4565b60408051848152602081018490529081018290527f17bbfb9a6069321b6ded73bd96327c9e6b7212a5cd51ff219cd61370acafb5619060600160405180910390a150505f600c55505b505b5050505b506006805461ff0019169055565b6006805464ff0000000019166401000000001790558061271357600a5415806127005750600a54305f90815260016020526040902054105b8061270e5750600954600a54105b612804575b5f805b60058160ff1610156127b05760ff81165f90815260046020526040902080546002909101546101009091046001600160a01b0316908015806127655750600f546001600160a01b038381169116145b156127715750506127a8565b5f61277c8383612ba8565b905080156127a05760ff84165f908152600460205260409020600201805482900390555b939093019250505b600101612716565b506006805463ffffffff60a01b1916600160a01b63ffffffff4216021790556040805182815290517fbb245b3c380b63918dc25ab2cc2e4b6939c4d58ffd95ea052b685a031e1ad2979181900360200190a1505b506006805464ff0000000019169055565b60058360ff1610612824575f80fd5b6001600160a01b038216301480159061284857506001600160a01b03821661dead14155b801561285c57506001600160a01b03821615155b612864575f80fd5b60ff83165f9081526004602090815260409182902060018101805485516006805467ffffff000000000019811662ffffff94851690930365010000000000808304861691909101851681029384178084558654988b01516affffff0000000000000000199095166affffffffffff0000000000199093169290921763010000009098048516909303600160401b9182900485160184160295909517808655925495870151600160581b80850484166601000000000000909804841690910396909601821690950262ffffff60581b19909216919091179283905590926161a8920416118015906129b057506006546161a8600160401b90910462ffffff161180159061298157506006546161a8600160581b90910462ffffff1611155b80156129b057506006546161a8600160401b820462ffffff908116600160581b90930481169290920190911611155b6129e75760405162461bcd60e51b8152602060048201526008602482015267090d2ced040a8c2f60c31b6044820152606401610a14565b8054610100600160a81b0319166101006001600160a01b03851602178155612a1460018201836003612bff565b50805460ff16612a2a57805460ff191660011781555b7f93dd041a76c0a756b346cffaf7b1e0b1c3f26f0c908f8a4600c5e9d530fa21a1848484604051612a5d9392919061321d565b60405180910390a150505050565b6001600160a01b03831615801590612a8b57506001600160a01b03821615155b612ad75760405162461bcd60e51b815260206004820152601d60248201527f5472616e736665722066726f6d2f746f207a65726f20616464726573730000006044820152606401610a14565b6001600160a01b0383165f90815260016020526040902054811115612b305760405162461bcd60e51b815260206004820152600f60248201526e457863656564732062616c616e636560881b6044820152606401610a14565b8015612b63576001600160a01b038084165f90815260016020526040808220805485900390559184168152208054820190555b816001600160a01b0316836001600160a01b03167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef83604051611b8e91815260200190565b5f612bb4308484612a6b565b81600a5f828254612bc5919061324b565b90915550919392505050565b60405180606001604052805f6001600160a01b03168152602001612bf3612c93565b81526020015f81525090565b600183019183908215612c87579160200282015f5b83821115612c5657835183826101000a81548162ffffff021916908362ffffff1602179055509260200192600301602081600201049283019260010302612c14565b8015612c855782816101000a81549062ffffff0219169055600301602081600201049283019260010302612c56565b505b506111df929150612cb1565b60405180606001604052806003906020820280368337509192915050565b5b808211156111df575f8155600101612cb2565b5f60208284031215612cd5575f80fd5b81358015158114611260575f80fd5b5f81518084525f5b81811015612d0857602081850181015186830182015201612cec565b505f602082860101526020601f19601f83011685010191505092915050565b602081525f6112606020830184612ce4565b6001600160a01b0381168114610c8b575f80fd5b5f8060408385031215612d5e575f80fd5b8235612d6981612d39565b946020939093013593505050565b5f805f60608486031215612d89575f80fd5b8335612d9481612d39565b92506020840135612da481612d39565b929592945050506040919091013590565b803562ffffff81168114612dc7575f80fd5b919050565b5f60208284031215612ddc575f80fd5b61126082612db5565b60c081525f612df760c0830189612ce4565b8281036020840152612e098189612ce4565b60ff881660408501526001600160a01b03871660608501526080840186905283810360a08501529050612e3c8185612ce4565b9998505050505050505050565b5f60208284031215612e59575f80fd5b813561126081612d39565b604080825283518282018190525f91906020906060850190828801855b82811015612eaf57815180516001600160a01b03168552850151858501529285019290840190600101612e81565b5050508093505050508260208301529392505050565b805f5b6003811015611bfe57815162ffffff16845260209384019390910190600101612ec8565b602080825282518282018190525f919060409081850190868401855b82811015612f4a57815180516001600160a01b0316855286810151612f2f88870182612ec5565b50850151608085015260a09093019290850190600101612f08565b5091979650505050505050565b5f8060408385031215612f68575f80fd5b8235612f7381612d39565b91506020830135612f8381612d39565b809150509250929050565b5f8060408385031215612f9f575f80fd5b50508035926020909101359150565b803560ff81168114612dc7575f80fd5b5f805f805f805f60e0888a031215612fd4575f80fd5b8735612fdf81612d39565b96506020880135612fef81612d39565b9550604088013594506060880135935061300b60808901612fae565b925060a0880135915060c0880135905092959891949750929550565b634e487b7160e01b5f52604160045260245ffd5b5f805f60a0848603121561304d575f80fd5b61305684612fae565b925060208085013561306781612d39565b9250605f85018613613077575f80fd5b6040516060810181811067ffffffffffffffff8211171561309a5761309a613027565b6040528060a08701888111156130ae575f80fd5b604088015b818110156130d1576130c481612db5565b83529184019184016130b3565b50505080925050509250925092565b6020808252600c908201526b155b985d5d1a1bdc9a5e995960a21b604082015260600190565b600181811c9082168061311a57607f821691505b60208210810361313857634e487b7160e01b5f52602260045260245ffd5b50919050565b634e487b7160e01b5f52603260045260245ffd5b5f60208284031215613162575f80fd5b815161126081612d39565b634e487b7160e01b5f52601260045260245ffd5b5f60a08201878352602087602085015260a0604085015281875180845260c0860191506020890193505f5b818110156131d15784516001600160a01b0316835293830193918301916001016131ac565b50506001600160a01b03969096166060850152505050608001529392505050565b5f805f60608486031215613204575f80fd5b8351925060208401519150604084015190509250925092565b60ff841681526001600160a01b038316602082015260a081016132436040830184612ec5565b949350505050565b81810381811115610b4057634e487b7160e01b5f52601160045260245ffdfea2646970667358221220644d37236bd965e8d457ee9c09677b6b5dc7968576f7ba0d6e0ea22517c7c46364736f6c63430008170033

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.