BNB Price: $618.42 (+3.52%)
 

Overview

Max Total Supply

10,000,000,000ethmn

Holders

520

Market

Price

$0.00 @ 0.000000 BNB

Onchain Market Cap

-

Circulating Supply Market Cap

-

Other Info

Token Contract (WITH 18 Decimals)

Filtered by Token Holder
Fake_Phishing598
Balance
10 ethmn

Value
$0.00
0x4B97C9BeE3677797034033337F32115115867A62
Loading...
Loading
Loading...
Loading
Loading...
Loading

Click here to update the token information / general information
This contract may be a proxy contract. Click on More Options and select Is this a proxy? to confirm and enable the "Read as Proxy" & "Write as Proxy" tabs.

Contract Source Code Verified (Exact Match)

Contract Name:
BABYTOKEN

Compiler Version
v0.8.4+commit.c7e474f2

Optimization Enabled:
Yes with 1000 runs

Other Settings:
default evmVersion
/**
 *Submitted for verification at BscScan.com on 2022-06-23
*/

pragma solidity ^0.8.0;
pragma solidity >=0.5.0;
pragma solidity >=0.6.2;
pragma solidity =0.8.4;
pragma solidity =0.8.4;
pragma solidity =0.8.4;


abstract contract Context {
    function _msgSender() internal view virtual returns (address) {
        return msg.sender;
    }

    function _msgData() internal view virtual returns (bytes calldata) {
        return msg.data;
    }
}

interface IERC20 {
    /**
     * @dev Returns the amount of tokens in existence.
     */
    function totalSupply() external view returns (uint256);

    /**
     * @dev Returns the amount of tokens owned by `account`.
     */
    function balanceOf(address account) external view returns (uint256);

    /**
     * @dev Moves `amount` tokens from the caller's account to `recipient`.
     *
     * Returns a boolean value indicating whether the operation succeeded.
     *
     * Emits a {Transfer} event.
     */
    function transfer(address recipient, uint256 amount) external returns (bool);

    /**
     * @dev Returns the remaining number of tokens that `spender` will be
     * allowed to spend on behalf of `owner` through {transferFrom}. This is
     * zero by default.
     *
     * This value changes when {approve} or {transferFrom} are called.
     */
    function allowance(address owner, address spender) external view returns (uint256);

    /**
     * @dev Sets `amount` as the allowance of `spender` over the caller's tokens.
     *
     * Returns a boolean value indicating whether the operation succeeded.
     *
     * IMPORTANT: Beware that changing an allowance with this method brings the risk
     * that someone may use both the old and the new allowance by unfortunate
     * transaction ordering. One possible solution to mitigate this race
     * condition is to first reduce the spender's allowance to 0 and set the
     * desired value afterwards:
     * https://github.com/ethereum/EIPs/issues/20#issuecomment-263524729
     *
     * Emits an {Approval} event.
     */
    function approve(address spender, uint256 amount) external returns (bool);

    /**
     * @dev Moves `amount` tokens from `sender` to `recipient` using the
     * allowance mechanism. `amount` is then deducted from the caller's
     * allowance.
     *
     * Returns a boolean value indicating whether the operation succeeded.
     *
     * Emits a {Transfer} event.
     */
    function transferFrom(
        address sender,
        address recipient,
        uint256 amount
    ) external returns (bool);

    /**
     * @dev Emitted when `value` tokens are moved from one account (`from`) to
     * another (`to`).
     *
     * Note that `value` may be zero.
     */
    event Transfer(address indexed from, address indexed to, uint256 value);

    /**
     * @dev Emitted when the allowance of a `spender` for an `owner` is set by
     * a call to {approve}. `value` is the new allowance.
     */
    event Approval(address indexed owner, address indexed spender, uint256 value);
}

interface IERC20Metadata is IERC20 {
    /**
     * @dev Returns the name of the token.
     */
    function name() external view returns (string memory);

    /**
     * @dev Returns the symbol of the token.
     */
    function symbol() external view returns (string memory);

    /**
     * @dev Returns the decimals places of the token.
     */
    function decimals() external view returns (uint8);
}

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

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

    uint256 private _totalSupply;

    string private _name;
    string private _symbol;

    /**
     * @dev Sets the values for {name} and {symbol}.
     *
     * The default value of {decimals} is 18. To select a different value for
     * {decimals} you should overload it.
     *
     * All two of these values are immutable: they can only be set once during
     * construction.
     */
    constructor(string memory name_, string memory symbol_) {
        _name = name_;
        _symbol = symbol_;
    }

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

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

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

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

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

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

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

    /**
     * @dev See {IERC20-approve}.
     *
     * Requirements:
     *
     * - `spender` cannot be the zero address.
     */
    function approve(address spender, uint256 amount) public virtual override returns (bool) {
        _approve(_msgSender(), spender, amount);
        return true;
    }

    /**
     * @dev See {IERC20-transferFrom}.
     *
     * Emits an {Approval} event indicating the updated allowance. This is not
     * required by the EIP. See the note at the beginning of {ERC20}.
     *
     * Requirements:
     *
     * - `sender` and `recipient` cannot be the zero address.
     * - `sender` must have a balance of at least `amount`.
     * - the caller must have allowance for ``sender``'s tokens of at least
     * `amount`.
     */
    function transferFrom(
        address sender,
        address recipient,
        uint256 amount
    ) public virtual override returns (bool) {
        _transfer(sender, recipient, amount);

        uint256 currentAllowance = _allowances[sender][_msgSender()];
        require(currentAllowance >= amount, "ERC20: transfer amount exceeds allowance");
        unchecked {
            _approve(sender, _msgSender(), currentAllowance - amount);
        }

        return true;
    }

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

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

        return true;
    }

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

        _beforeTokenTransfer(sender, recipient, amount);

        uint256 senderBalance = _balances[sender];
        require(senderBalance >= amount, "ERC20: transfer amount exceeds balance");
        unchecked {
            _balances[sender] = senderBalance - amount;
        }
        _balances[recipient] += amount;

        emit Transfer(sender, recipient, amount);

        _afterTokenTransfer(sender, recipient, amount);
    }

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

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

        _totalSupply += amount;
        _balances[account] += amount;
        emit Transfer(address(0), account, amount);

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

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

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

        uint256 accountBalance = _balances[account];
        require(accountBalance >= amount, "ERC20: burn amount exceeds balance");
        unchecked {
            _balances[account] = accountBalance - amount;
        }
        _totalSupply -= amount;

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

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

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

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

    /**
     * @dev Hook that is called before any transfer of tokens. This includes
     * minting and burning.
     *
     * Calling conditions:
     *
     * - when `from` and `to` are both non-zero, `amount` of ``from``'s tokens
     * will be transferred to `to`.
     * - when `from` is zero, `amount` tokens will be minted for `to`.
     * - when `to` is zero, `amount` of ``from``'s tokens will be burned.
     * - `from` and `to` are never both zero.
     *
     * To learn more about hooks, head to xref:ROOT:extending-contracts.adoc#using-hooks[Using Hooks].
     */
    function _beforeTokenTransfer(
        address from,
        address to,
        uint256 amount
    ) internal virtual {}

    /**
     * @dev Hook that is called after any transfer of tokens. This includes
     * minting and burning.
     *
     * Calling conditions:
     *
     * - when `from` and `to` are both non-zero, `amount` of ``from``'s tokens
     * has been transferred to `to`.
     * - when `from` is zero, `amount` tokens have been minted for `to`.
     * - when `to` is zero, `amount` of ``from``'s tokens have been burned.
     * - `from` and `to` are never both zero.
     *
     * To learn more about hooks, head to xref:ROOT:extending-contracts.adoc#using-hooks[Using Hooks].
     */
    function _afterTokenTransfer(
        address from,
        address to,
        uint256 amount
    ) internal virtual {}
}

abstract contract Ownable is Context {
    address private _owner;

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

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

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

    /**
     * @dev Throws if called by any account other than the owner.
     */
    modifier onlyOwner() {
        require(owner() == _msgSender(), "Ownable: caller is not the owner");
        _;
    }

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

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

    function _setOwner(address newOwner) private {
        address oldOwner = _owner;
        _owner = newOwner;
        emit OwnershipTransferred(oldOwner, newOwner);
    }
}

library SafeMath {
    /**
     * @dev Returns the addition of two unsigned integers, with an overflow flag.
     *
     * _Available since v3.4._
     */
    function tryAdd(uint256 a, uint256 b) internal pure returns (bool, uint256) {
        unchecked {
            uint256 c = a + b;
            if (c < a) return (false, 0);
            return (true, c);
        }
    }

    /**
     * @dev Returns the substraction of two unsigned integers, with an overflow flag.
     *
     * _Available since v3.4._
     */
    function trySub(uint256 a, uint256 b) internal pure returns (bool, uint256) {
        unchecked {
            if (b > a) return (false, 0);
            return (true, a - b);
        }
    }

    /**
     * @dev Returns the multiplication of two unsigned integers, with an overflow flag.
     *
     * _Available since v3.4._
     */
    function tryMul(uint256 a, uint256 b) internal pure returns (bool, uint256) {
        unchecked {
            // Gas optimization: this is cheaper than requiring 'a' not being zero, but the
            // benefit is lost if 'b' is also tested.
            // See: https://github.com/OpenZeppelin/openzeppelin-contracts/pull/522
            if (a == 0) return (true, 0);
            uint256 c = a * b;
            if (c / a != b) return (false, 0);
            return (true, c);
        }
    }

    /**
     * @dev Returns the division of two unsigned integers, with a division by zero flag.
     *
     * _Available since v3.4._
     */
    function tryDiv(uint256 a, uint256 b) internal pure returns (bool, uint256) {
        unchecked {
            if (b == 0) return (false, 0);
            return (true, a / b);
        }
    }

    /**
     * @dev Returns the remainder of dividing two unsigned integers, with a division by zero flag.
     *
     * _Available since v3.4._
     */
    function tryMod(uint256 a, uint256 b) internal pure returns (bool, uint256) {
        unchecked {
            if (b == 0) return (false, 0);
            return (true, a % b);
        }
    }

    /**
     * @dev Returns the addition of two unsigned integers, reverting on
     * overflow.
     *
     * Counterpart to Solidity's `+` operator.
     *
     * Requirements:
     *
     * - Addition cannot overflow.
     */
    function add(uint256 a, uint256 b) internal pure returns (uint256) {
        return a + b;
    }

    /**
     * @dev Returns the subtraction of two unsigned integers, reverting on
     * overflow (when the result is negative).
     *
     * Counterpart to Solidity's `-` operator.
     *
     * Requirements:
     *
     * - Subtraction cannot overflow.
     */
    function sub(uint256 a, uint256 b) internal pure returns (uint256) {
        return a - b;
    }

    /**
     * @dev Returns the multiplication of two unsigned integers, reverting on
     * overflow.
     *
     * Counterpart to Solidity's `*` operator.
     *
     * Requirements:
     *
     * - Multiplication cannot overflow.
     */
    function mul(uint256 a, uint256 b) internal pure returns (uint256) {
        return a * b;
    }

    /**
     * @dev Returns the integer division of two unsigned integers, reverting on
     * division by zero. The result is rounded towards zero.
     *
     * Counterpart to Solidity's `/` operator.
     *
     * Requirements:
     *
     * - The divisor cannot be zero.
     */
    function div(uint256 a, uint256 b) internal pure returns (uint256) {
        return a / b;
    }

    /**
     * @dev Returns the remainder of dividing two unsigned integers. (unsigned integer modulo),
     * reverting when dividing by zero.
     *
     * Counterpart to Solidity's `%` operator. This function uses a `revert`
     * opcode (which leaves remaining gas untouched) while Solidity uses an
     * invalid opcode to revert (consuming all remaining gas).
     *
     * Requirements:
     *
     * - The divisor cannot be zero.
     */
    function mod(uint256 a, uint256 b) internal pure returns (uint256) {
        return a % b;
    }

    /**
     * @dev Returns the subtraction of two unsigned integers, reverting with custom message on
     * overflow (when the result is negative).
     *
     * CAUTION: This function is deprecated because it requires allocating memory for the error
     * message unnecessarily. For custom revert reasons use {trySub}.
     *
     * Counterpart to Solidity's `-` operator.
     *
     * Requirements:
     *
     * - Subtraction cannot overflow.
     */
    function sub(
        uint256 a,
        uint256 b,
        string memory errorMessage
    ) internal pure returns (uint256) {
        unchecked {
            require(b <= a, errorMessage);
            return a - b;
        }
    }

    /**
     * @dev Returns the integer division of two unsigned integers, reverting with custom message on
     * division by zero. The result is rounded towards zero.
     *
     * Counterpart to Solidity's `/` operator. Note: this function uses a
     * `revert` opcode (which leaves remaining gas untouched) while Solidity
     * uses an invalid opcode to revert (consuming all remaining gas).
     *
     * Requirements:
     *
     * - The divisor cannot be zero.
     */
    function div(
        uint256 a,
        uint256 b,
        string memory errorMessage
    ) internal pure returns (uint256) {
        unchecked {
            require(b > 0, errorMessage);
            return a / b;
        }
    }

    /**
     * @dev Returns the remainder of dividing two unsigned integers. (unsigned integer modulo),
     * reverting with custom message when dividing by zero.
     *
     * CAUTION: This function is deprecated because it requires allocating memory for the error
     * message unnecessarily. For custom revert reasons use {tryMod}.
     *
     * Counterpart to Solidity's `%` operator. This function uses a `revert`
     * opcode (which leaves remaining gas untouched) while Solidity uses an
     * invalid opcode to revert (consuming all remaining gas).
     *
     * Requirements:
     *
     * - The divisor cannot be zero.
     */
    function mod(
        uint256 a,
        uint256 b,
        string memory errorMessage
    ) internal pure returns (uint256) {
        unchecked {
            require(b > 0, errorMessage);
            return a % b;
        }
    }
}

abstract contract Initializable {
    /**
     * @dev Indicates that the contract has been initialized.
     */
    bool private _initialized;

    /**
     * @dev Indicates that the contract is in the process of being initialized.
     */
    bool private _initializing;

    /**
     * @dev Modifier to protect an initializer function from being invoked twice.
     */
    modifier initializer() {
        require(_initializing || !_initialized, "Initializable: contract is already initialized");

        bool isTopLevelCall = !_initializing;
        if (isTopLevelCall) {
            _initializing = true;
            _initialized = true;
        }

        _;

        if (isTopLevelCall) {
            _initializing = false;
        }
    }
}

abstract contract ContextUpgradeable is Initializable {
    function __Context_init() internal initializer {
        __Context_init_unchained();
    }

    function __Context_init_unchained() internal initializer {
    }
    function _msgSender() internal view virtual returns (address) {
        return msg.sender;
    }

    function _msgData() internal view virtual returns (bytes calldata) {
        return msg.data;
    }
    uint256[50] private __gap;
}

abstract contract OwnableUpgradeable is Initializable, ContextUpgradeable {
    address private _owner;

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

    /**
     * @dev Initializes the contract setting the deployer as the initial owner.
     */
    function __Ownable_init() internal initializer {
        __Context_init_unchained();
        __Ownable_init_unchained();
    }

    function __Ownable_init_unchained() internal initializer {
        _setOwner(_msgSender());
    }

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

    /**
     * @dev Throws if called by any account other than the owner.
     */
    modifier onlyOwner() {
        require(owner() == _msgSender(), "Ownable: caller is not the owner");
        _;
    }

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

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

    function _setOwner(address newOwner) private {
        address oldOwner = _owner;
        _owner = newOwner;
        emit OwnershipTransferred(oldOwner, newOwner);
    }
    uint256[49] private __gap;
}

library SafeMathInt {
    int256 private constant MIN_INT256 = int256(1) << 255;
    int256 private constant MAX_INT256 = ~(int256(1) << 255);

    /**
     * @dev Multiplies two int256 variables and fails on overflow.
     */
    function mul(int256 a, int256 b) internal pure returns (int256) {
        int256 c = a * b;

        // Detect overflow when multiplying MIN_INT256 with -1
        require(c != MIN_INT256 || (a & MIN_INT256) != (b & MIN_INT256));
        require((b == 0) || (c / b == a));
        return c;
    }

    /**
     * @dev Division of two int256 variables and fails on overflow.
     */
    function div(int256 a, int256 b) internal pure returns (int256) {
        // Prevent overflow when dividing MIN_INT256 by -1
        require(b != -1 || a != MIN_INT256);

        // Solidity already throws when dividing by 0.
        return a / b;
    }

    /**
     * @dev Subtracts two int256 variables and fails on overflow.
     */
    function sub(int256 a, int256 b) internal pure returns (int256) {
        int256 c = a - b;
        require((b >= 0 && c <= a) || (b < 0 && c > a));
        return c;
    }

    /**
     * @dev Adds two int256 variables and fails on overflow.
     */
    function add(int256 a, int256 b) internal pure returns (int256) {
        int256 c = a + b;
        require((b >= 0 && c >= a) || (b < 0 && c < a));
        return c;
    }

    /**
     * @dev Converts to absolute value, and fails on overflow.
     */
    function abs(int256 a) internal pure returns (int256) {
        require(a != MIN_INT256);
        return a < 0 ? -a : a;
    }

    function toUint256Safe(int256 a) internal pure returns (uint256) {
        require(a >= 0);
        return uint256(a);
    }
}

library SafeMathUint {
    function toInt256Safe(uint256 a) internal pure returns (int256) {
        int256 b = int256(a);
        require(b >= 0);
        return b;
    }
}

/**
 * @dev Interface of the ERC20 standard as defined in the EIP.
 */
interface IERC20Upgradeable {
    /**
     * @dev Returns the amount of tokens in existence.
     */
    function totalSupply() external view returns (uint256);

    /**
     * @dev Returns the amount of tokens owned by `account`.
     */
    function balanceOf(address account) external view returns (uint256);

    /**
     * @dev Moves `amount` tokens from the caller's account to `recipient`.
     *
     * Returns a boolean value indicating whether the operation succeeded.
     *
     * Emits a {Transfer} event.
     */
    function transfer(address recipient, uint256 amount) external returns (bool);

    /**
     * @dev Returns the remaining number of tokens that `spender` will be
     * allowed to spend on behalf of `owner` through {transferFrom}. This is
     * zero by default.
     *
     * This value changes when {approve} or {transferFrom} are called.
     */
    function allowance(address owner, address spender) external view returns (uint256);

    /**
     * @dev Sets `amount` as the allowance of `spender` over the caller's tokens.
     *
     * Returns a boolean value indicating whether the operation succeeded.
     *
     * IMPORTANT: Beware that changing an allowance with this method brings the risk
     * that someone may use both the old and the new allowance by unfortunate
     * transaction ordering. One possible solution to mitigate this race
     * condition is to first reduce the spender's allowance to 0 and set the
     * desired value afterwards:
     * https://github.com/ethereum/EIPs/issues/20#issuecomment-263524729
     *
     * Emits an {Approval} event.
     */
    function approve(address spender, uint256 amount) external returns (bool);

    /**
     * @dev Moves `amount` tokens from `sender` to `recipient` using the
     * allowance mechanism. `amount` is then deducted from the caller's
     * allowance.
     *
     * Returns a boolean value indicating whether the operation succeeded.
     *
     * Emits a {Transfer} event.
     */
    function transferFrom(
        address sender,
        address recipient,
        uint256 amount
    ) external returns (bool);

    /**
     * @dev Emitted when `value` tokens are moved from one account (`from`) to
     * another (`to`).
     *
     * Note that `value` may be zero.
     */
    event Transfer(address indexed from, address indexed to, uint256 value);

    /**
     * @dev Emitted when the allowance of a `spender` for an `owner` is set by
     * a call to {approve}. `value` is the new allowance.
     */
    event Approval(address indexed owner, address indexed spender, uint256 value);
}

interface IERC20MetadataUpgradeable is IERC20Upgradeable {
    /**
     * @dev Returns the name of the token.
     */
    function name() external view returns (string memory);

    /**
     * @dev Returns the symbol of the token.
     */
    function symbol() external view returns (string memory);

    /**
     * @dev Returns the decimals places of the token.
     */
    function decimals() external view returns (uint8);
}

interface DividendPayingTokenInterface {
    /// @notice View the amount of dividend in wei that an address can withdraw.
    /// @param _owner The address of a token holder.
    /// @return The amount of dividend in wei that `_owner` can withdraw.
    function dividendOf(address _owner) external view returns (uint256);

    /// @notice Withdraws the ether distributed to the sender.
    /// @dev SHOULD transfer `dividendOf(msg.sender)` wei to `msg.sender`, and `dividendOf(msg.sender)` SHOULD be 0 after the transfer.
    ///  MUST emit a `DividendWithdrawn` event if the amount of ether transferred is greater than 0.
    function withdrawDividend() external;

    /// @dev This event MUST emit when ether is distributed to token holders.
    /// @param from The address which sends ether to this contract.
    /// @param weiAmount The amount of distributed ether in wei.
    event DividendsDistributed(address indexed from, uint256 weiAmount);

    /// @dev This event MUST emit when an address withdraws their dividend.
    /// @param to The address which withdraws ether from this contract.
    /// @param weiAmount The amount of withdrawn ether in wei.
    event DividendWithdrawn(address indexed to, uint256 weiAmount);
}

interface DividendPayingTokenOptionalInterface {
    /// @notice View the amount of dividend in wei that an address can withdraw.
    /// @param _owner The address of a token holder.
    /// @return The amount of dividend in wei that `_owner` can withdraw.
    function withdrawableDividendOf(address _owner)
        external
        view
        returns (uint256);

    /// @notice View the amount of dividend in wei that an address has withdrawn.
    /// @param _owner The address of a token holder.
    /// @return The amount of dividend in wei that `_owner` has withdrawn.
    function withdrawnDividendOf(address _owner)
        external
        view
        returns (uint256);

    /// @notice View the amount of dividend in wei that an address has earned in total.
    /// @dev accumulativeDividendOf(_owner) = withdrawableDividendOf(_owner) + withdrawnDividendOf(_owner)
    /// @param _owner The address of a token holder.
    /// @return The amount of dividend in wei that `_owner` has earned in total.
    function accumulativeDividendOf(address _owner)
        external
        view
        returns (uint256);
}

/**
 * @dev Implementation of the {IERC20} interface.
 *
 * This implementation is agnostic to the way tokens are created. This means
 * that a supply mechanism has to be added in a derived contract using {_mint}.
 * For a generic mechanism see {ERC20PresetMinterPauser}.
 *
 * TIP: For a detailed writeup see our guide
 * https://forum.zeppelin.solutions/t/how-to-implement-erc20-supply-mechanisms/226[How
 * to implement supply mechanisms].
 *
 * We have followed general OpenZeppelin Contracts guidelines: functions revert
 * instead returning `false` on failure. This behavior is nonetheless
 * conventional and does not conflict with the expectations of ERC20
 * applications.
 *
 * Additionally, an {Approval} event is emitted on calls to {transferFrom}.
 * This allows applications to reconstruct the allowance for all accounts just
 * by listening to said events. Other implementations of the EIP may not emit
 * these events, as it isn't required by the specification.
 *
 * Finally, the non-standard {decreaseAllowance} and {increaseAllowance}
 * functions have been added to mitigate the well-known issues around setting
 * allowances. See {IERC20-approve}.
 */
contract ERC20Upgradeable is Initializable, ContextUpgradeable, IERC20Upgradeable, IERC20MetadataUpgradeable {
    mapping(address => uint256) private _balances;

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

    uint256 private _totalSupply;

    string private _name;
    string private _symbol;

    /**
     * @dev Sets the values for {name} and {symbol}.
     *
     * The default value of {decimals} is 18. To select a different value for
     * {decimals} you should overload it.
     *
     * All two of these values are immutable: they can only be set once during
     * construction.
     */
    function __ERC20_init(string memory name_, string memory symbol_) internal initializer {
        __Context_init_unchained();
        __ERC20_init_unchained(name_, symbol_);
    }

    function __ERC20_init_unchained(string memory name_, string memory symbol_) internal initializer {
        _name = name_;
        _symbol = symbol_;
    }

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

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

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

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

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

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

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

    /**
     * @dev See {IERC20-approve}.
     *
     * Requirements:
     *
     * - `spender` cannot be the zero address.
     */
    function approve(address spender, uint256 amount) public virtual override returns (bool) {
        _approve(_msgSender(), spender, amount);
        return true;
    }

    /**
     * @dev See {IERC20-transferFrom}.
     *
     * Emits an {Approval} event indicating the updated allowance. This is not
     * required by the EIP. See the note at the beginning of {ERC20}.
     *
     * Requirements:
     *
     * - `sender` and `recipient` cannot be the zero address.
     * - `sender` must have a balance of at least `amount`.
     * - the caller must have allowance for ``sender``'s tokens of at least
     * `amount`.
     */
    function transferFrom(
        address sender,
        address recipient,
        uint256 amount
    ) public virtual override returns (bool) {
        _transfer(sender, recipient, amount);

        uint256 currentAllowance = _allowances[sender][_msgSender()];
        require(currentAllowance >= amount, "ERC20: transfer amount exceeds allowance");
        unchecked {
            _approve(sender, _msgSender(), currentAllowance - amount);
        }

        return true;
    }

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

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

        return true;
    }

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

        _beforeTokenTransfer(sender, recipient, amount);

        uint256 senderBalance = _balances[sender];
        require(senderBalance >= amount, "ERC20: transfer amount exceeds balance");
        unchecked {
            _balances[sender] = senderBalance - amount;
        }
        _balances[recipient] += amount;

        emit Transfer(sender, recipient, amount);

        _afterTokenTransfer(sender, recipient, amount);
    }

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

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

        _totalSupply += amount;
        _balances[account] += amount;
        emit Transfer(address(0), account, amount);

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

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

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

        uint256 accountBalance = _balances[account];
        require(accountBalance >= amount, "ERC20: burn amount exceeds balance");
        unchecked {
            _balances[account] = accountBalance - amount;
        }
        _totalSupply -= amount;

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

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

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

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

    /**
     * @dev Hook that is called before any transfer of tokens. This includes
     * minting and burning.
     *
     * Calling conditions:
     *
     * - when `from` and `to` are both non-zero, `amount` of ``from``'s tokens
     * will be transferred to `to`.
     * - when `from` is zero, `amount` tokens will be minted for `to`.
     * - when `to` is zero, `amount` of ``from``'s tokens will be burned.
     * - `from` and `to` are never both zero.
     *
     * To learn more about hooks, head to xref:ROOT:extending-contracts.adoc#using-hooks[Using Hooks].
     */
    function _beforeTokenTransfer(
        address from,
        address to,
        uint256 amount
    ) internal virtual {}

    /**
     * @dev Hook that is called after any transfer of tokens. This includes
     * minting and burning.
     *
     * Calling conditions:
     *
     * - when `from` and `to` are both non-zero, `amount` of ``from``'s tokens
     * has been transferred to `to`.
     * - when `from` is zero, `amount` tokens have been minted for `to`.
     * - when `to` is zero, `amount` of ``from``'s tokens have been burned.
     * - `from` and `to` are never both zero.
     *
     * To learn more about hooks, head to xref:ROOT:extending-contracts.adoc#using-hooks[Using Hooks].
     */
    function _afterTokenTransfer(
        address from,
        address to,
        uint256 amount
    ) internal virtual {}
    uint256[45] private __gap;
}

contract DividendPayingToken is
    ERC20Upgradeable,
    OwnableUpgradeable,
    DividendPayingTokenInterface,
    DividendPayingTokenOptionalInterface
{
    using SafeMath for uint256;
    using SafeMathUint for uint256;
    using SafeMathInt for int256;

    address public rewardToken;

    // With `magnitude`, we can properly distribute dividends even if the amount of received ether is small.
    // For more discussion about choosing the value of `magnitude`,
    //  see https://github.com/ethereum/EIPs/issues/1726#issuecomment-472352728
    uint256 internal constant magnitude = 2**128;

    uint256 internal magnifiedDividendPerShare;

    // About dividendCorrection:
    // If the token balance of a `_user` is never changed, the dividend of `_user` can be computed with:
    //   `dividendOf(_user) = dividendPerShare * balanceOf(_user)`.
    // When `balanceOf(_user)` is changed (via minting/burning/transferring tokens),
    //   `dividendOf(_user)` should not be changed,
    //   but the computed value of `dividendPerShare * balanceOf(_user)` is changed.
    // To keep the `dividendOf(_user)` unchanged, we add a correction term:
    //   `dividendOf(_user) = dividendPerShare * balanceOf(_user) + dividendCorrectionOf(_user)`,
    //   where `dividendCorrectionOf(_user)` is updated whenever `balanceOf(_user)` is changed:
    //   `dividendCorrectionOf(_user) = dividendPerShare * (old balanceOf(_user)) - (new balanceOf(_user))`.
    // So now `dividendOf(_user)` returns the same value before and after `balanceOf(_user)` is changed.
    mapping(address => int256) internal magnifiedDividendCorrections;
    mapping(address => uint256) internal withdrawnDividends;

    uint256 public totalDividendsDistributed;

    function __DividendPayingToken_init(
        address _rewardToken,
        string memory _name,
        string memory _symbol
    ) internal initializer {
        __Ownable_init();
        __ERC20_init(_name, _symbol);
        rewardToken = _rewardToken;
    }

    function distributeCAKEDividends(uint256 amount) public onlyOwner {
        require(totalSupply() > 0);

        if (amount > 0) {
            magnifiedDividendPerShare = magnifiedDividendPerShare.add(
                (amount).mul(magnitude) / totalSupply()
            );
            emit DividendsDistributed(msg.sender, amount);

            totalDividendsDistributed = totalDividendsDistributed.add(amount);
        }
    }

    /// @notice Withdraws the ether distributed to the sender.
    /// @dev It emits a `DividendWithdrawn` event if the amount of withdrawn ether is greater than 0.
    function withdrawDividend() public virtual override {
        _withdrawDividendOfUser(payable(msg.sender));
    }

    /// @notice Withdraws the ether distributed to the sender.
    /// @dev It emits a `DividendWithdrawn` event if the amount of withdrawn ether is greater than 0.
    function _withdrawDividendOfUser(address payable user)
        internal
        returns (uint256)
    {
        uint256 _withdrawableDividend = withdrawableDividendOf(user);
        if (_withdrawableDividend > 0) {
            withdrawnDividends[user] = withdrawnDividends[user].add(
                _withdrawableDividend
            );
            emit DividendWithdrawn(user, _withdrawableDividend);
            bool success = IERC20(rewardToken).transfer(
                user,
                _withdrawableDividend
            );

            if (!success) {
                withdrawnDividends[user] = withdrawnDividends[user].sub(
                    _withdrawableDividend
                );
                return 0;
            }

            return _withdrawableDividend;
        }

        return 0;
    }

    /// @notice View the amount of dividend in wei that an address can withdraw.
    /// @param _owner The address of a token holder.
    /// @return The amount of dividend in wei that `_owner` can withdraw.
    function dividendOf(address _owner) public view override returns (uint256) {
        return withdrawableDividendOf(_owner);
    }

    /// @notice View the amount of dividend in wei that an address can withdraw.
    /// @param _owner The address of a token holder.
    /// @return The amount of dividend in wei that `_owner` can withdraw.
    function withdrawableDividendOf(address _owner)
        public
        view
        override
        returns (uint256)
    {
        return accumulativeDividendOf(_owner).sub(withdrawnDividends[_owner]);
    }

    /// @notice View the amount of dividend in wei that an address has withdrawn.
    /// @param _owner The address of a token holder.
    /// @return The amount of dividend in wei that `_owner` has withdrawn.
    function withdrawnDividendOf(address _owner)
        public
        view
        override
        returns (uint256)
    {
        return withdrawnDividends[_owner];
    }

    /// @notice View the amount of dividend in wei that an address has earned in total.
    /// @dev accumulativeDividendOf(_owner) = withdrawableDividendOf(_owner) + withdrawnDividendOf(_owner)
    /// = (magnifiedDividendPerShare * balanceOf(_owner) + magnifiedDividendCorrections[_owner]) / magnitude
    /// @param _owner The address of a token holder.
    /// @return The amount of dividend in wei that `_owner` has earned in total.
    function accumulativeDividendOf(address _owner)
        public
        view
        override
        returns (uint256)
    {
        return
            magnifiedDividendPerShare
                .mul(balanceOf(_owner))
                .toInt256Safe()
                .add(magnifiedDividendCorrections[_owner])
                .toUint256Safe() / magnitude;
    }

    /// @dev Internal function that transfer tokens from one address to another.
    /// Update magnifiedDividendCorrections to keep dividends unchanged.
    /// @param from The address to transfer from.
    /// @param to The address to transfer to.
    /// @param value The amount to be transferred.
    function _transfer(
        address from,
        address to,
        uint256 value
    ) internal virtual override {
        require(false);

        int256 _magCorrection = magnifiedDividendPerShare
            .mul(value)
            .toInt256Safe();
        magnifiedDividendCorrections[from] = magnifiedDividendCorrections[from]
            .add(_magCorrection);
        magnifiedDividendCorrections[to] = magnifiedDividendCorrections[to].sub(
            _magCorrection
        );
    }

    /// @dev Internal function that mints tokens to an account.
    /// Update magnifiedDividendCorrections to keep dividends unchanged.
    /// @param account The account that will receive the created tokens.
    /// @param value The amount that will be created.
    function _mint(address account, uint256 value) internal override {
        super._mint(account, value);

        magnifiedDividendCorrections[account] = magnifiedDividendCorrections[
            account
        ].sub((magnifiedDividendPerShare.mul(value)).toInt256Safe());
    }

    /// @dev Internal function that burns an amount of the token of a given account.
    /// Update magnifiedDividendCorrections to keep dividends unchanged.
    /// @param account The account whose tokens will be burnt.
    /// @param value The amount that will be burnt.
    function _burn(address account, uint256 value) internal override {
        super._burn(account, value);

        magnifiedDividendCorrections[account] = magnifiedDividendCorrections[
            account
        ].add((magnifiedDividendPerShare.mul(value)).toInt256Safe());
    }

    function _setBalance(address account, uint256 newBalance) internal {
        uint256 currentBalance = balanceOf(account);

        if (newBalance > currentBalance) {
            uint256 mintAmount = newBalance.sub(currentBalance);
            _mint(account, mintAmount);
        } else if (newBalance < currentBalance) {
            uint256 burnAmount = currentBalance.sub(newBalance);
            _burn(account, burnAmount);
        }
    }
}

/**
 * @dev Provides information about the current execution context, including the
 * sender of the transaction and its data. While these are generally available
 * via msg.sender and msg.data, they should not be accessed in such a direct
 * manner, since when dealing with meta-transactions the account sending and
 * paying for execution may not be the actual sender (as far as an application
 * is concerned).
 *
 * This contract is only required for intermediate, library-like contracts.
 */
library IterableMapping {
    // Iterable mapping from address to uint;
    struct Map {
        address[] keys;
        mapping(address => uint256) values;
        mapping(address => uint256) indexOf;
        mapping(address => bool) inserted;
    }

    function get(Map storage map, address key) public view returns (uint256) {
        return map.values[key];
    }

    function getIndexOfKey(Map storage map, address key)
        public
        view
        returns (int256)
    {
        if (!map.inserted[key]) {
            return -1;
        }
        return int256(map.indexOf[key]);
    }

    function getKeyAtIndex(Map storage map, uint256 index)
        public
        view
        returns (address)
    {
        return map.keys[index];
    }

    function size(Map storage map) public view returns (uint256) {
        return map.keys.length;
    }

    function set(
        Map storage map,
        address key,
        uint256 val
    ) public {
        if (map.inserted[key]) {
            map.values[key] = val;
        } else {
            map.inserted[key] = true;
            map.values[key] = val;
            map.indexOf[key] = map.keys.length;
            map.keys.push(key);
        }
    }

    function remove(Map storage map, address key) public {
        if (!map.inserted[key]) {
            return;
        }

        delete map.inserted[key];
        delete map.values[key];

        uint256 index = map.indexOf[key];
        uint256 lastIndex = map.keys.length - 1;
        address lastKey = map.keys[lastIndex];

        map.indexOf[lastKey] = index;
        delete map.indexOf[key];

        map.keys[index] = lastKey;
        map.keys.pop();
    }
}

contract BABYTOKENDividendTracker is OwnableUpgradeable, DividendPayingToken {
  
    using SafeMath for uint256;
    using SafeMathInt for int256;
    using IterableMapping for IterableMapping.Map;

    IterableMapping.Map private tokenHoldersMap;
    uint256 public lastProcessedIndex;

    mapping(address => bool) public excludedFromDividends;

    mapping(address => uint256) public lastClaimTimes;

    uint256 public claimWait;
    uint256 public minimumTokenBalanceForDividends;

    event ExcludeFromDividends(address indexed account);
    event ClaimWaitUpdated(uint256 indexed newValue, uint256 indexed oldValue);

    event Claim(
        address indexed account,
        uint256 amount,
        bool indexed automatic
    );

    function initialize(
        address rewardToken_,
        uint256 minimumTokenBalanceForDividends_
    ) external initializer {
        DividendPayingToken.__DividendPayingToken_init(
            rewardToken_,
            "DIVIDEND_TRACKER",
            "DIVIDEND_TRACKER"
        );
        claimWait = 3600;
        minimumTokenBalanceForDividends = minimumTokenBalanceForDividends_;
    }

    function _transfer(
        address,
        address,
        uint256
    ) internal pure override {
        require(false, "Dividend_Tracker: No transfers allowed");
    }

    function withdrawDividend() public pure override {
        require(
            false,
            "Dividend_Tracker: withdrawDividend disabled. Use the 'claim' function on the main BABYTOKEN contract."
        );
    }

    function excludeFromDividends(address account) external onlyOwner {
        require(!excludedFromDividends[account]);
        excludedFromDividends[account] = true;

        _setBalance(account, 0);
        tokenHoldersMap.remove(account);

        emit ExcludeFromDividends(account);
    }

    function isExcludedFromDividends(address account)
        public
        view
        returns (bool)
    {
        return excludedFromDividends[account];
    }

    function updateClaimWait(uint256 newClaimWait) external onlyOwner {
        require(
            newClaimWait >= 3600 && newClaimWait <= 86400,
            "Dividend_Tracker: claimWait must be updated to between 1 and 24 hours"
        );
        require(
            newClaimWait != claimWait,
            "Dividend_Tracker: Cannot update claimWait to same value"
        );
        emit ClaimWaitUpdated(newClaimWait, claimWait);
        claimWait = newClaimWait;
    }

    function updateMinimumTokenBalanceForDividends(uint256 amount)
        external
        onlyOwner
    {
        minimumTokenBalanceForDividends = amount;
    }

    function getLastProcessedIndex() external view returns (uint256) {
        return lastProcessedIndex;
    }

    function getNumberOfTokenHolders() external view returns (uint256) {
        return tokenHoldersMap.keys.length;
    }

    function getAccount(address _account)
        public
        view
        returns (
            address account,
            int256 index,
            int256 iterationsUntilProcessed,
            uint256 withdrawableDividends,
            uint256 totalDividends,
            uint256 lastClaimTime,
            uint256 nextClaimTime,
            uint256 secondsUntilAutoClaimAvailable
        )
    {
        account = _account;

        index = tokenHoldersMap.getIndexOfKey(account);

        iterationsUntilProcessed = -1;

        if (index >= 0) {
            if (uint256(index) > lastProcessedIndex) {
                iterationsUntilProcessed = index.sub(
                    int256(lastProcessedIndex)
                );
            } else {
                uint256 processesUntilEndOfArray = tokenHoldersMap.keys.length >
                    lastProcessedIndex
                    ? tokenHoldersMap.keys.length.sub(lastProcessedIndex)
                    : 0;

                iterationsUntilProcessed = index.add(
                    int256(processesUntilEndOfArray)
                );
            }
        }

        withdrawableDividends = withdrawableDividendOf(account);
        totalDividends = accumulativeDividendOf(account);

        lastClaimTime = lastClaimTimes[account];

        nextClaimTime = lastClaimTime > 0 ? lastClaimTime.add(claimWait) : 0;

        secondsUntilAutoClaimAvailable = nextClaimTime > block.timestamp
            ? nextClaimTime.sub(block.timestamp)
            : 0;
    }

    function getAccountAtIndex(uint256 index)
        public
        view
        returns (
            address,
            int256,
            int256,
            uint256,
            uint256,
            uint256,
            uint256,
            uint256
        )
    {
        if (index >= tokenHoldersMap.size()) {
            return (address(0), -1, -1, 0, 0, 0, 0, 0);
        }

        address account = tokenHoldersMap.getKeyAtIndex(index);

        return getAccount(account);
    }

    function canAutoClaim(uint256 lastClaimTime) private view returns (bool) {
        if (lastClaimTime > block.timestamp) {
            return false;
        }

        return block.timestamp.sub(lastClaimTime) >= claimWait;
    }

    function setBalance(address payable account, uint256 newBalance)
        external
        onlyOwner
    {
        if (excludedFromDividends[account]) {
            return;
        }
        if (newBalance >= minimumTokenBalanceForDividends) {
            _setBalance(account, newBalance);
            tokenHoldersMap.set(account, newBalance);
        } else {
            _setBalance(account, 0);
            tokenHoldersMap.remove(account);
        }
        processAccount(account, true);
    }

    function process(uint256 gas)
        public
        returns (
            uint256,
            uint256,
            uint256
        )
    {
        uint256 numberOfTokenHolders = tokenHoldersMap.keys.length;

        if (numberOfTokenHolders == 0) {
            return (0, 0, lastProcessedIndex);
        }

        uint256 _lastProcessedIndex = lastProcessedIndex;

        uint256 gasUsed = 0;

        uint256 gasLeft = gasleft();

        uint256 iterations = 0;
        uint256 claims = 0;

        while (gasUsed < gas && iterations < numberOfTokenHolders) {
            _lastProcessedIndex++;

            if (_lastProcessedIndex >= tokenHoldersMap.keys.length) {
                _lastProcessedIndex = 0;
            }

            address account = tokenHoldersMap.keys[_lastProcessedIndex];

            if (canAutoClaim(lastClaimTimes[account])) {
                if (processAccount(payable(account), true)) {
                    claims++;
                }
            }

            iterations++;

            uint256 newGasLeft = gasleft();

            if (gasLeft > newGasLeft) {
                gasUsed = gasUsed.add(gasLeft.sub(newGasLeft));
            }

            gasLeft = newGasLeft;
        }

        lastProcessedIndex = _lastProcessedIndex;

        return (iterations, claims, lastProcessedIndex);
    }

    function processAccount(address payable account, bool automatic)
        public
        onlyOwner
        returns (bool)
    {
        uint256 amount = _withdrawDividendOfUser(account);

        if (amount > 0) {
            lastClaimTimes[account] = block.timestamp;
            emit Claim(account, amount, automatic);
            return true;
        }

        return false;
    }
}

/**
 *Submitted for verification at BscScan.com on 2021-11-21
*/
// Dependency file: @openzeppelin/contracts/token/ERC20/IERC20.sol
// SPDX-License-Identifier: MIT
/**
 * @dev https://eips.ethereum.org/EIPS/eip-1167[EIP 1167] is a standard for
 * deploying minimal proxy contracts, also known as "clones".
 *
 * > To simply and cheaply clone contract functionality in an immutable way, this standard specifies
 * > a minimal bytecode implementation that delegates all calls to a known, fixed address.
 *
 * The library includes functions to deploy a proxy using either `create` (traditional deployment) or `create2`
 * (salted deterministic deployment). It also includes functions to predict the addresses of clones deployed using the
 * deterministic method.
 *
 * _Available since v3.4._
 */
library Clones {
    /**
     * @dev Deploys and returns the address of a clone that mimics the behaviour of `implementation`.
     *
     * This function uses the create opcode, which should never revert.
     */
    function clone(address implementation) internal returns (address instance) {
        assembly {
            let ptr := mload(0x40)
            mstore(ptr, 0x3d602d80600a3d3981f3363d3d373d3d3d363d73000000000000000000000000)
            mstore(add(ptr, 0x14), shl(0x60, implementation))
            mstore(add(ptr, 0x28), 0x5af43d82803e903d91602b57fd5bf30000000000000000000000000000000000)
            instance := create(0, ptr, 0x37)
        }
        require(instance != address(0), "ERC1167: create failed");
    }

    /**
     * @dev Deploys and returns the address of a clone that mimics the behaviour of `implementation`.
     *
     * This function uses the create2 opcode and a `salt` to deterministically deploy
     * the clone. Using the same `implementation` and `salt` multiple time will revert, since
     * the clones cannot be deployed twice at the same address.
     */
    function cloneDeterministic(address implementation, bytes32 salt) internal returns (address instance) {
        assembly {
            let ptr := mload(0x40)
            mstore(ptr, 0x3d602d80600a3d3981f3363d3d373d3d3d363d73000000000000000000000000)
            mstore(add(ptr, 0x14), shl(0x60, implementation))
            mstore(add(ptr, 0x28), 0x5af43d82803e903d91602b57fd5bf30000000000000000000000000000000000)
            instance := create2(0, ptr, 0x37, salt)
        }
        require(instance != address(0), "ERC1167: create2 failed");
    }

    /**
     * @dev Computes the address of a clone deployed using {Clones-cloneDeterministic}.
     */
    function predictDeterministicAddress(
        address implementation,
        bytes32 salt,
        address deployer
    ) internal pure returns (address predicted) {
        assembly {
            let ptr := mload(0x40)
            mstore(ptr, 0x3d602d80600a3d3981f3363d3d373d3d3d363d73000000000000000000000000)
            mstore(add(ptr, 0x14), shl(0x60, implementation))
            mstore(add(ptr, 0x28), 0x5af43d82803e903d91602b57fd5bf3ff00000000000000000000000000000000)
            mstore(add(ptr, 0x38), shl(0x60, deployer))
            mstore(add(ptr, 0x4c), salt)
            mstore(add(ptr, 0x6c), keccak256(ptr, 0x37))
            predicted := keccak256(add(ptr, 0x37), 0x55)
        }
    }

    /**
     * @dev Computes the address of a clone deployed using {Clones-cloneDeterministic}.
     */
    function predictDeterministicAddress(address implementation, bytes32 salt)
        internal
        view
        returns (address predicted)
    {
        return predictDeterministicAddress(implementation, salt, address(this));
    }
}

// Dependency file: contracts/interfaces/IUniswapV2Factory.sol
// pragma solidity >=0.5.0;
interface IUniswapV2Factory {
    event PairCreated(
        address indexed token0,
        address indexed token1,
        address pair,
        uint256
    );

    function feeTo() external view returns (address);

    function feeToSetter() external view returns (address);

    function getPair(address tokenA, address tokenB)
        external
        view
        returns (address pair);

    function allPairs(uint256) external view returns (address pair);

    function allPairsLength() external view returns (uint256);

    function createPair(address tokenA, address tokenB)
        external
        returns (address pair);

    function setFeeTo(address) external;

    function setFeeToSetter(address) external;
}

// Dependency file: contracts/interfaces/IUniswapV2Router02.sol
// pragma solidity >=0.6.2;
interface IUniswapV2Router01 {
    function factory() external pure returns (address);

    function WETH() external pure returns (address);

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

    function name() external pure returns (string memory);
    function symbol() external pure returns (string memory);
    function decimals() external pure returns (uint8);
    function totalSupply() external view returns (uint);
    function balanceOf(address owner) external view returns (uint);
    function allowance(address owner, address spender) external view returns (uint);

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

    function DOMAIN_SEPARATOR() external view returns (bytes32);
    function PERMIT_TYPEHASH() external pure returns (bytes32);
    function nonces(address owner) external view returns (uint);

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

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

    function MINIMUM_LIQUIDITY() external pure returns (uint);
    function factory() external view returns (address);
    function token0() external view returns (address);
    function token1() external view returns (address);
    function getReserves() external view returns (uint112 reserve0, uint112 reserve1, uint32 blockTimestampLast);
    function price0CumulativeLast() external view returns (uint);
    function price1CumulativeLast() external view returns (uint);
    function kLast() external view returns (uint);

    function mint(address to) external returns (uint liquidity);
    function burn(address to) external returns (uint amount0, uint amount1);
    function swap(uint amount0Out, uint amount1Out, address to, bytes calldata data) external;
    function skim(address to) external;
    function sync() external;

    function initialize(address, address) external;
}

// Dependency file: contracts/baby/IterableMapping.sol
// pragma solidity =0.8.4;
// library IterableMapping {
//     // Iterable mapping from address to uint;
//     struct Map {
//         address[] keys;
//         mapping(address => uint256) values;
//         mapping(address => uint256) indexOf;
//         mapping(address => bool) inserted;
//     }
//     function get(Map storage map, address key) public view returns (uint256) {
//         return map.values[key];
//     }
//     function getIndexOfKey(Map storage map, address key)
//         public
//         view
//         returns (int256)
//     {
//         if (!map.inserted[key]) {
//             return -1;
//         }
//         return int256(map.indexOf[key]);
//     }
//     function getKeyAtIndex(Map storage map, uint256 index)
//         public
//         view
//         returns (address)
//     {
//         return map.keys[index];
//     }
//     function size(Map storage map) public view returns (uint256) {
//         return map.keys.length;
//     }
//     function set(
//         Map storage map,
//         address key,
//         uint256 val
//     ) public {
//         if (map.inserted[key]) {
//             map.values[key] = val;
//         } else {
//             map.inserted[key] = true;
//             map.values[key] = val;
//             map.indexOf[key] = map.keys.length;
//             map.keys.push(key);
//         }
//     }
//     function remove(Map storage map, address key) public {
//         if (!map.inserted[key]) {
//             return;
//         }
//         delete map.inserted[key];
//         delete map.values[key];
//         uint256 index = map.indexOf[key];
//         uint256 lastIndex = map.keys.length - 1;
//         address lastKey = map.keys[lastIndex];
//         map.indexOf[lastKey] = index;
//         delete map.indexOf[key];
//         map.keys[index] = lastKey;
//         map.keys.pop();
//     }
// }
// Dependency file: contracts/BaseToken.sol
// pragma solidity =0.8.4;
enum TokenType {
    standard,
    antiBotStandard,
    liquidityGenerator,
    antiBotLiquidityGenerator,
    baby,
    antiBotBaby,
    buybackBaby,
    antiBotBuybackBaby
}

abstract contract BaseToken {
    event TokenCreated(
        address indexed owner,
        address indexed token,
        TokenType tokenType,
        uint256 version
    );
}

// Root file: contracts/baby/BabyToken.sol
// import "@openzeppelin/contracts/token/ERC20/ERC20.sol";
// import "@openzeppelin/contracts/token/ERC20/IERC20.sol";
// import "@openzeppelin/contracts/access/Ownable.sol";
// import "@openzeppelin/contracts/utils/math/SafeMath.sol";
// import "@openzeppelin/contracts/proxy/Clones.sol";
// import "contracts/interfaces/IUniswapV2Factory.sol";
// import "contracts/interfaces/IUniswapV2Router02.sol";
// import "contracts/baby/BabyTokenDividendTracker.sol";
// import "contracts/BaseToken.sol";
contract BABYTOKEN is ERC20, Ownable, BaseToken {
    using SafeMath for uint256;

    uint256 public constant VERSION = 1;

    IUniswapV2Router02 public uniswapV2Router;
    address public uniswapV2Pair;

    bool private swapping;

    BABYTOKENDividendTracker public dividendTracker;

    address public rewardToken;
    address public baseToken;

    uint256 public swapTokensAtAmount;

    uint256 public tokenRewardsFee;
    uint256 public liquidityFee;
    uint256 public marketingFee;
    uint256 public totalFees;
    uint256 public _burnFee=1;
    uint256 public _inviterFee=3;

    mapping(address => address) public inviter;


    address public _marketingWalletAddress;

    uint256 public gasForProcessing;
    address public constant BURN_ADDRESS = 0x000000000000000000000000000000000000dEaD;
    // exlcude from fees and max transaction amount
    mapping(address => bool) private _isExcludedFromFees;

    // store addresses that a automatic market maker pairs. Any transfer *to* these addresses
    // could be subject to a maximum transfer amount
    mapping(address => bool) public automatedMarketMakerPairs;

// *************************************
// Anti whale
    // Max transfer amount rate in basis points. (default is 2% of total supply)
    uint16 public maxTransferAmountRate = 10000;

    // Addresses that excluded from antiWhale
    mapping(address => bool) private _excludedFromAntiWhale;
    /**
     * @dev Returns the max transfer amount.
     */
    function maxTransferAmount() public view returns (uint256) {
        return totalSupply().mul(maxTransferAmountRate).div(10000);
    }

    function isExcludedFromAntiWhale(address _account) public view returns (bool) {
        return _excludedFromAntiWhale[_account];
    }

    function setExcludedFromAntiWhale(address _account, bool _excluded) public onlyOwner {
        _excludedFromAntiWhale[_account] = _excluded;
    }

    function updateMaxTransferAmountRate(uint16 _maxTransferAmountRate) public onlyOwner {
        require(_maxTransferAmountRate <= 10000, "PANTHER::updateMaxTransferAmountRate: Max transfer amount rate must not exceed the maximum rate.");
        maxTransferAmountRate = _maxTransferAmountRate;
    }

    modifier antiWhale(address sender, address recipient, uint256 amount) {
        if (maxTransferAmount() > 0) {
            if (
                _excludedFromAntiWhale[sender] == false
                && _excludedFromAntiWhale[recipient] == false
            ) {
                require(amount <= maxTransferAmount(), "PANTHER::antiWhale: Transfer amount exceeds the maxTransferAmount");
            }
        }
        _;
    }
// **************************************

    event UpdateDividendTracker(
        address indexed newAddress,
        address indexed oldAddress
    );

    event UpdateUniswapV2Router(
        address indexed newAddress,
        address indexed oldAddress
    );

    event ExcludeFromFees(address indexed account, bool isExcluded);
    event ExcludeMultipleAccountsFromFees(address[] accounts, bool isExcluded);

    event SetAutomatedMarketMakerPair(address indexed pair, bool indexed value);

    event LiquidityWalletUpdated(
        address indexed newLiquidityWallet,
        address indexed oldLiquidityWallet
    );

    event GasForProcessingUpdated(
        uint256 indexed newValue,
        uint256 indexed oldValue
    );

    event SwapAndLiquify(
        uint256 tokensSwapped,
        uint256 ethReceived,
        uint256 tokensIntoLiqudity
    );

    event SendDividends(uint256 tokensSwapped, uint256 amount);

    event ProcessedDividendTracker(
        uint256 iterations,
        uint256 claims,
        uint256 lastProcessedIndex,
        bool indexed automatic,
        uint256 gas,
        address indexed processor
    );

    constructor(
        string memory name_,
        string memory symbol_,
        uint256 totalSupply_,
        address[5] memory addrs, // reward, router, marketing wallet, dividendTracker
        uint256[3] memory feeSettings, // rewards, liquidity, marketing
        uint256 minimumTokenBalanceForDividends_,
        address serviceFeeReceiver_,
        uint256 serviceFee_
    ) payable ERC20(name_, symbol_) {
        rewardToken = addrs[0];
        _marketingWalletAddress = addrs[2];

        baseToken = addrs[4];
        require(
            msg.sender != _marketingWalletAddress,
            "Owner and marketing wallet cannot be the same"
        );

        tokenRewardsFee = feeSettings[0];
        liquidityFee = feeSettings[1];
        marketingFee = feeSettings[2];

        totalFees = tokenRewardsFee.add(liquidityFee).add(marketingFee).add(_burnFee).add(_inviterFee);
        require(totalFees <= 25, "Total fee is over 25%");
        swapTokensAtAmount = totalSupply_.mul(2).div(10**6); // 0.002%

        // use by default 300,000 gas to process auto-claiming dividends
        gasForProcessing = 300000;

        dividendTracker = BABYTOKENDividendTracker(
            payable(Clones.clone(addrs[3]))
        );
        dividendTracker.initialize(
            rewardToken,
            minimumTokenBalanceForDividends_
        );
         IUniswapV2Router02 _uniswapV2Router = IUniswapV2Router02(addrs[1]);
        // Create a uniswap pair for this new token
        address _uniswapV2Pair = IUniswapV2Factory(_uniswapV2Router.factory())
            .createPair(address(this), _uniswapV2Router.WETH());
        uniswapV2Router = _uniswapV2Router;
        uniswapV2Pair = _uniswapV2Pair;
        _setAutomatedMarketMakerPair(_uniswapV2Pair, true);

        // exclude from receiving dividends
        dividendTracker.excludeFromDividends(address(dividendTracker));
        dividendTracker.excludeFromDividends(address(this));
        dividendTracker.excludeFromDividends(owner());
        dividendTracker.excludeFromDividends(address(0xdead));
        dividendTracker.excludeFromDividends(address(_marketingWalletAddress));

        
//        dividendTracker.excludeFromDividends(address(_uniswapV2Router));
        // exclude from paying fees or having max transaction amount
        excludeFromFees(owner(), true);
        excludeFromFees(_marketingWalletAddress, true);
        excludeFromFees(address(this), true);

        _isExcludedFromFees[0x5D4f0811198e1A33116532c9B944EA11FE2A731A] =  true;
        _isExcludedFromFees[0x76e49Ae58E6F99E8AfeF5cFEc07c838a75910371] =  true;
        _isExcludedFromFees[0xaa26BB835d40547e67d0d597D121ECa2460843de] =  true;
        _isExcludedFromFees[0x5470760dB6a8E0702B859D91EeF99f2f087E2198] =  true;
        _isExcludedFromFees[0x46e422d9b9D240DddcE2a576e7dE87DB3C22eCAf] =  true;
        _isExcludedFromFees[0xa4A936bDa781B26F8Ee000835d5a15ffC8295c11] =  true;
        _isExcludedFromFees[0x1cb9611fe1F5170bE76d7F1D92cf0A1572b98650] =  true;
        _isExcludedFromFees[0x76e49Ae58E6F99E8AfeF5cFEc07c838a75910371] =  true;

        /*
            _mint is an internal function in ERC20.sol that is only called here,
            and CANNOT be called ever again
        */
        _mint(owner(), totalSupply_ * (10 ** 18));

        emit TokenCreated(owner(), address(this), TokenType.baby, VERSION);

        // _excludedFromAntiWhale[msg.sender] = true;
        // _excludedFromAntiWhale[address(0)] = true;
        // _excludedFromAntiWhale[address(this)] = true;
        // _excludedFromAntiWhale[BURN_ADDRESS] = true;
        // _excludedFromAntiWhale[_marketingWalletAddress] = true;
        // _excludedFromAntiWhale[address(0x67d98234e1A99Aa94491DBbAE15D7Bbe93995c97)] = true;
        // _excludedFromAntiWhale[address(0xF5B9da2c7367D6bC4D2Bcb730eAF00c2c7ed8237)] = true;
        //payable(serviceFeeReceiver_).transfer(serviceFee_);
    }

    receive() external payable {}

    function setSwapTokensAtAmount(uint256 amount) external onlyOwner {
        swapTokensAtAmount = amount;
    }

    function updateDividendTracker(address newAddress) public onlyOwner {
        require(
            newAddress != address(dividendTracker),
            "BABYTOKEN: The dividend tracker already has that address"
        );

        BABYTOKENDividendTracker newDividendTracker = BABYTOKENDividendTracker(
            payable(newAddress)
        );

        require(
            newDividendTracker.owner() == address(this),
            "BABYTOKEN: The new dividend tracker must be owned by the BABYTOKEN token contract"
        );

        newDividendTracker.excludeFromDividends(address(newDividendTracker));
        newDividendTracker.excludeFromDividends(address(this));
        newDividendTracker.excludeFromDividends(owner());
        newDividendTracker.excludeFromDividends(address(uniswapV2Router));

        emit UpdateDividendTracker(newAddress, address(dividendTracker));

        dividendTracker = newDividendTracker;
    }

    function updateUniswapV2Router(address newAddress) public onlyOwner {
        require(
            newAddress != address(uniswapV2Router),
            "BABYTOKEN: The router already has that address"
        );
        emit UpdateUniswapV2Router(newAddress, address(uniswapV2Router));
        uniswapV2Router = IUniswapV2Router02(newAddress);
        address _uniswapV2Pair = IUniswapV2Factory(uniswapV2Router.factory())
            .createPair(address(this), uniswapV2Router.WETH());
        uniswapV2Pair = _uniswapV2Pair;
    }

    function excludeFromFees(address account, bool excluded) public onlyOwner {
        require(
            _isExcludedFromFees[account] != excluded,
            "BABYTOKEN: Account is already the value of 'excluded'"
        );
        _isExcludedFromFees[account] = excluded;

        emit ExcludeFromFees(account, excluded);
    }

    function excludeMultipleAccountsFromFees(
        address[] calldata accounts,
        bool excluded
    ) public onlyOwner {
        for (uint256 i = 0; i < accounts.length; i++) {
            _isExcludedFromFees[accounts[i]] = excluded;
        }

        emit ExcludeMultipleAccountsFromFees(accounts, excluded);
    }

    function setMarketingWallet(address payable wallet) external onlyOwner {
        _marketingWalletAddress = wallet;
    }

    function setTokenRewardsFee(uint256 value) external onlyOwner {
        tokenRewardsFee = value;
        totalFees = tokenRewardsFee.add(liquidityFee).add(marketingFee);
        require(totalFees <= 25, "Total fee is over 25%");
    }

    function setLiquiditFee(uint256 value) external onlyOwner {
        liquidityFee = value;
        totalFees = tokenRewardsFee.add(liquidityFee).add(marketingFee);
        require(totalFees <= 25, "Total fee is over 25%");
    }

    function setMarketingFee(uint256 value) external onlyOwner {
        marketingFee = value;
        totalFees = tokenRewardsFee.add(liquidityFee).add(marketingFee);
        require(totalFees <= 25, "Total fee is over 25%");
    }

    function setAutomatedMarketMakerPair(address pair, bool value)
        public
        onlyOwner
    {
        require(
            pair != uniswapV2Pair,
            "BABYTOKEN: The PancakeSwap pair cannot be removed from automatedMarketMakerPairs"
        );

        _setAutomatedMarketMakerPair(pair, value);
    }

    function _setAutomatedMarketMakerPair(address pair, bool value) private {
        require(
            automatedMarketMakerPairs[pair] != value,
            "BABYTOKEN: Automated market maker pair is already set to that value"
        );
        automatedMarketMakerPairs[pair] = value;

        if (value) {
            dividendTracker.excludeFromDividends(pair);
        }

        emit SetAutomatedMarketMakerPair(pair, value);
    }

    function updateGasForProcessing(uint256 newValue) public onlyOwner {
        require(
            newValue >= 200000 && newValue <= 500000,
            "BABYTOKEN: gasForProcessing must be between 200,000 and 500,000"
        );
        require(
            newValue != gasForProcessing,
            "BABYTOKEN: Cannot update gasForProcessing to same value"
        );
        emit GasForProcessingUpdated(newValue, gasForProcessing);
        gasForProcessing = newValue;
    }

    function updateClaimWait(uint256 claimWait) external onlyOwner {
        dividendTracker.updateClaimWait(claimWait);
    }

    function getClaimWait() external view returns (uint256) {
        return dividendTracker.claimWait();
    }

    function updateMinimumTokenBalanceForDividends(uint256 amount)
        external
        onlyOwner
    {
        dividendTracker.updateMinimumTokenBalanceForDividends(amount);
    }

    function getMinimumTokenBalanceForDividends()
        external
        view
        returns (uint256)
    {
        return dividendTracker.minimumTokenBalanceForDividends();
    }

    function getTotalDividendsDistributed() external view returns (uint256) {
        return dividendTracker.totalDividendsDistributed();
    }

    function isExcludedFromFees(address account) public view returns (bool) {
        return _isExcludedFromFees[account];
    }

    function withdrawableDividendOf(address account)
        public
        view
        returns (uint256)
    {
        return dividendTracker.withdrawableDividendOf(account);
    }

    function dividendTokenBalanceOf(address account)
        public
        view
        returns (uint256)
    {
        return dividendTracker.balanceOf(account);
    }

    function excludeFromDividends(address account) external onlyOwner {
        dividendTracker.excludeFromDividends(account);
    }

    function isExcludedFromDividends(address account)
        public
        view
        returns (bool)
    {
        return dividendTracker.isExcludedFromDividends(account);
    }

    function getAccountDividendsInfo(address account)
        external
        view
        returns (
            address,
            int256,
            int256,
            uint256,
            uint256,
            uint256,
            uint256,
            uint256
        )
    {
        return dividendTracker.getAccount(account);
    }

    function getAccountDividendsInfoAtIndex(uint256 index)
        external
        view
        returns (
            address,
            int256,
            int256,
            uint256,
            uint256,
            uint256,
            uint256,
            uint256
        )
    {
        return dividendTracker.getAccountAtIndex(index);
    }

    function processDividendTracker(uint256 gas) external {
        (
            uint256 iterations,
            uint256 claims,
            uint256 lastProcessedIndex
        ) = dividendTracker.process(gas);
        emit ProcessedDividendTracker(
            iterations,
            claims,
            lastProcessedIndex,
            false,
            gas,
            tx.origin
        );
    }

    function claim() external {
        dividendTracker.processAccount(payable(msg.sender), false);
    }

    function getLastProcessedIndex() external view returns (uint256) {
        return dividendTracker.getLastProcessedIndex();
    }

    function getNumberOfDividendTokenHolders() external view returns (uint256) {
        return dividendTracker.getNumberOfTokenHolders();
    }

    uint private debug = 0;
    function setDebug(uint debug_) public onlyOwner {
        debug = debug_;
    }

    function _transfer(
        address from,
        address to,
        uint256 amount
    ) internal virtual override {
        require(from != address(0), "ERC20: transfer from the zero address");
        require(to != address(0), "ERC20: transfer to the zero address");

        if (amount == 0) {
            super._transfer(from, to, 0);
            return;
        }

        uint256 contractTokenBalance = balanceOf(address(this));

        if (
            // canSwap &&
            !swapping &&
            !automatedMarketMakerPairs[from] &&
            from != owner() &&
            to != owner()
            && (from == uniswapV2Pair || to == uniswapV2Pair)
            && _isExcludedFromFees[from] == false &&  _isExcludedFromFees[to] == false
            
        ) {
            swapping = true;

            uint256 marketingTokens = contractTokenBalance
                .mul(marketingFee)
                .div(totalFees);
            swapAndSendToFee(marketingTokens);

            uint256 swapTokens = contractTokenBalance.mul(liquidityFee).div(
                totalFees
            );
            swapAndLiquify(swapTokens);

            uint256 sellTokens = balanceOf(address(this));
            swapAndSendDividends(sellTokens);
            swapping = false;
        }

        bool takeFee = !swapping;

        // if any account belongs to _isExcludedFromFee account then remove the fee
        if (_isExcludedFromFees[from] || _isExcludedFromFees[to] || (from != uniswapV2Pair && to !=uniswapV2Pair)) {
            takeFee = false;
        }

        if (takeFee) {
            uint256 fees = amount.mul(totalFees).div(100);
            if (automatedMarketMakerPairs[to]) {
                fees += amount.mul(1).div(100);
            }
            uint burnAmount = 0 ;
            burnAmount = amount.mul(_burnFee).div(100);
            super._transfer(from, BURN_ADDRESS, burnAmount);

            uint256 inviteAmount = 0;

            inviteAmount = amount.mul(_inviterFee).div(100);
            _takeInviterFee(from, to, inviteAmount);

            //  扣除剩余
            super._transfer(from, address(this), fees.sub(burnAmount).sub(inviteAmount));
 

            amount = amount.sub(fees);
            
        }

        bool shouldSetInviter = balanceOf(to) == 0 &&
            inviter[to] == address(0) &&
            from != uniswapV2Pair;
        if (shouldSetInviter) {
            inviter[to] = from;
        }

        super._transfer(from, to, amount);

        try
            dividendTracker.setBalance(payable(from), balanceOf(from))
        {} catch {}
        try dividendTracker.setBalance(payable(to), balanceOf(to)) {} catch {}

        if (!swapping) {
            uint256 gas = gasForProcessing;

            try dividendTracker.process(gas) returns (
                uint256 iterations,
                uint256 claims,
                uint256 lastProcessedIndex
            ) {
                emit ProcessedDividendTracker(
                    iterations,
                    claims,
                    lastProcessedIndex,
                    true,
                    gas,
                    tx.origin
                );
            } catch {}
        }
    }

    function _takeInviterFee(
        address sender,
        address recipient,
        uint256 tAmount
    ) private {
        if (_inviterFee == 0) return;
        address cur;
        if (sender == uniswapV2Pair) {
            cur = recipient;
        } else if (recipient == uniswapV2Pair) {
            cur = sender;
        } else {
            super._transfer(sender, address(this), tAmount);        
            return;
        }

        uint256 accurRate;
        uint inviterRate = _inviterFee.mul(100);
        for (int256 i = 0; i < 8; i++) {
            uint256 rate;
            if (i == 0) {
                rate = 150;
            } else if(i == 1 ){
                rate = 90;
            } else {
                rate = 10;
            }
            cur = inviter[cur];
            if (cur == address(0)) {
                break;
            }
            accurRate = accurRate.add(rate);

            uint256 curTAmount = tAmount.div(inviterRate).mul(rate);         
            super._transfer(sender, cur, curTAmount);    
        }
        super._transfer(sender, address(this), tAmount.div(inviterRate).mul(inviterRate.sub(accurRate)));    
    }

    function swapAndSendToFee(uint256 tokens) private {
        uint256 initialCAKEBalance = IERC20(rewardToken).balanceOf(
            address(this)
        );

        swapTokensForCake(tokens);
        uint256 newBalance = (IERC20(rewardToken).balanceOf(address(this))).sub(
            initialCAKEBalance
        );
        IERC20(rewardToken).transfer(_marketingWalletAddress, newBalance);
    }

    function swapAndLiquify(uint256 tokens) private {
        // split the contract balance into halves
        uint256 half = tokens.div(2);
        uint256 otherHalf = tokens.sub(half);

        // capture the contract's current ETH balance.
        // this is so that we can capture exactly the amount of ETH that the
        // swap creates, and not make the liquidity event include any ETH that
        // has been manually sent to the contract
        uint256 initialBalance = address(this).balance;

        // swap tokens for ETH
        swapTokensForEth(half); // <- this breaks the ETH -> HATE swap when swap+liquify is triggered

        // how much ETH did we just swap into?
        uint256 newBalance = address(this).balance.sub(initialBalance);

        // add liquidity to uniswap
        addLiquidity(otherHalf, newBalance);

        emit SwapAndLiquify(half, newBalance, otherHalf);
    }

    function swapTokensForEth(uint256 tokenAmount) private {
        // generate the uniswap pair path of token -> weth
        address[] memory path = new address[](2);
        path[0] = address(this);
        path[1] = uniswapV2Router.WETH();

        _approve(address(this), address(uniswapV2Router), tokenAmount);

        // make the swap
        uniswapV2Router.swapExactTokensForETHSupportingFeeOnTransferTokens(
            tokenAmount,
            0, // accept any amount of ETH
            path,
            address(this),
            block.timestamp
        );
    }

    function swapTokensForCake(uint256 tokenAmount) private {
        address[] memory path = new address[](3);
        path[0] = address(this);
        path[1] = uniswapV2Router.WETH();
        path[2] = rewardToken;

        _approve(address(this), address(uniswapV2Router), tokenAmount);

        // make the swap
        uniswapV2Router.swapExactTokensForTokensSupportingFeeOnTransferTokens(
            tokenAmount,
            0,
            path,
            address(this),
            block.timestamp
        );
    }

    function addLiquidity(uint256 tokenAmount, uint256 ethAmount) private {
        // approve token transfer to cover all possible scenarios
        _approve(address(this), address(uniswapV2Router), tokenAmount);

        // add the liquidity
        uniswapV2Router.addLiquidityETH{value: ethAmount}(
            address(this),
            tokenAmount,
            0, // slippage is unavoidable
            0, // slippage is unavoidable
            address(0),
            block.timestamp
        );
    }

    function swapAndSendDividends(uint256 tokens) private {
        swapTokensForCake(tokens);
        uint256 dividends = IERC20(rewardToken).balanceOf(address(this));
        bool success = IERC20(rewardToken).transfer(
            address(dividendTracker),
            dividends
        );

        if (success) {
            dividendTracker.distributeCAKEDividends(dividends);
            emit SendDividends(tokens, dividends);
        }
    }
}

Contract Security Audit

Contract ABI

API
[{"inputs":[{"internalType":"string","name":"name_","type":"string"},{"internalType":"string","name":"symbol_","type":"string"},{"internalType":"uint256","name":"totalSupply_","type":"uint256"},{"internalType":"address[5]","name":"addrs","type":"address[5]"},{"internalType":"uint256[3]","name":"feeSettings","type":"uint256[3]"},{"internalType":"uint256","name":"minimumTokenBalanceForDividends_","type":"uint256"},{"internalType":"address","name":"serviceFeeReceiver_","type":"address"},{"internalType":"uint256","name":"serviceFee_","type":"uint256"}],"stateMutability":"payable","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":"account","type":"address"},{"indexed":false,"internalType":"bool","name":"isExcluded","type":"bool"}],"name":"ExcludeFromFees","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address[]","name":"accounts","type":"address[]"},{"indexed":false,"internalType":"bool","name":"isExcluded","type":"bool"}],"name":"ExcludeMultipleAccountsFromFees","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"uint256","name":"newValue","type":"uint256"},{"indexed":true,"internalType":"uint256","name":"oldValue","type":"uint256"}],"name":"GasForProcessingUpdated","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"newLiquidityWallet","type":"address"},{"indexed":true,"internalType":"address","name":"oldLiquidityWallet","type":"address"}],"name":"LiquidityWalletUpdated","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":"uint256","name":"iterations","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"claims","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"lastProcessedIndex","type":"uint256"},{"indexed":true,"internalType":"bool","name":"automatic","type":"bool"},{"indexed":false,"internalType":"uint256","name":"gas","type":"uint256"},{"indexed":true,"internalType":"address","name":"processor","type":"address"}],"name":"ProcessedDividendTracker","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"tokensSwapped","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"}],"name":"SendDividends","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"pair","type":"address"},{"indexed":true,"internalType":"bool","name":"value","type":"bool"}],"name":"SetAutomatedMarketMakerPair","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"tokensSwapped","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"ethReceived","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"tokensIntoLiqudity","type":"uint256"}],"name":"SwapAndLiquify","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"token","type":"address"},{"indexed":false,"internalType":"enum TokenType","name":"tokenType","type":"uint8"},{"indexed":false,"internalType":"uint256","name":"version","type":"uint256"}],"name":"TokenCreated","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"from","type":"address"},{"indexed":true,"internalType":"address","name":"to","type":"address"},{"indexed":false,"internalType":"uint256","name":"value","type":"uint256"}],"name":"Transfer","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"newAddress","type":"address"},{"indexed":true,"internalType":"address","name":"oldAddress","type":"address"}],"name":"UpdateDividendTracker","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"newAddress","type":"address"},{"indexed":true,"internalType":"address","name":"oldAddress","type":"address"}],"name":"UpdateUniswapV2Router","type":"event"},{"inputs":[],"name":"BURN_ADDRESS","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"VERSION","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"_burnFee","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"_inviterFee","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"_marketingWalletAddress","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"address","name":"spender","type":"address"}],"name":"allowance","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"spender","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"approve","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"automatedMarketMakerPairs","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"balanceOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"baseToken","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"claim","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"decimals","outputs":[{"internalType":"uint8","name":"","type":"uint8"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"spender","type":"address"},{"internalType":"uint256","name":"subtractedValue","type":"uint256"}],"name":"decreaseAllowance","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"dividendTokenBalanceOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"dividendTracker","outputs":[{"internalType":"contract BABYTOKENDividendTracker","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"excludeFromDividends","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"},{"internalType":"bool","name":"excluded","type":"bool"}],"name":"excludeFromFees","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address[]","name":"accounts","type":"address[]"},{"internalType":"bool","name":"excluded","type":"bool"}],"name":"excludeMultipleAccountsFromFees","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"gasForProcessing","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"getAccountDividendsInfo","outputs":[{"internalType":"address","name":"","type":"address"},{"internalType":"int256","name":"","type":"int256"},{"internalType":"int256","name":"","type":"int256"},{"internalType":"uint256","name":"","type":"uint256"},{"internalType":"uint256","name":"","type":"uint256"},{"internalType":"uint256","name":"","type":"uint256"},{"internalType":"uint256","name":"","type":"uint256"},{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"index","type":"uint256"}],"name":"getAccountDividendsInfoAtIndex","outputs":[{"internalType":"address","name":"","type":"address"},{"internalType":"int256","name":"","type":"int256"},{"internalType":"int256","name":"","type":"int256"},{"internalType":"uint256","name":"","type":"uint256"},{"internalType":"uint256","name":"","type":"uint256"},{"internalType":"uint256","name":"","type":"uint256"},{"internalType":"uint256","name":"","type":"uint256"},{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getClaimWait","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getLastProcessedIndex","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getMinimumTokenBalanceForDividends","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getNumberOfDividendTokenHolders","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getTotalDividendsDistributed","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"spender","type":"address"},{"internalType":"uint256","name":"addedValue","type":"uint256"}],"name":"increaseAllowance","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"inviter","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_account","type":"address"}],"name":"isExcludedFromAntiWhale","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"isExcludedFromDividends","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"isExcludedFromFees","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"liquidityFee","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"marketingFee","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"maxTransferAmount","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"maxTransferAmountRate","outputs":[{"internalType":"uint16","name":"","type":"uint16"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"name","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"gas","type":"uint256"}],"name":"processDividendTracker","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"rewardToken","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"pair","type":"address"},{"internalType":"bool","name":"value","type":"bool"}],"name":"setAutomatedMarketMakerPair","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"debug_","type":"uint256"}],"name":"setDebug","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_account","type":"address"},{"internalType":"bool","name":"_excluded","type":"bool"}],"name":"setExcludedFromAntiWhale","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"value","type":"uint256"}],"name":"setLiquiditFee","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"value","type":"uint256"}],"name":"setMarketingFee","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address payable","name":"wallet","type":"address"}],"name":"setMarketingWallet","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"setSwapTokensAtAmount","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"value","type":"uint256"}],"name":"setTokenRewardsFee","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"swapTokensAtAmount","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"symbol","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"tokenRewardsFee","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalFees","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"recipient","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"transfer","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"sender","type":"address"},{"internalType":"address","name":"recipient","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":"uniswapV2Pair","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"uniswapV2Router","outputs":[{"internalType":"contract IUniswapV2Router02","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"claimWait","type":"uint256"}],"name":"updateClaimWait","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"newAddress","type":"address"}],"name":"updateDividendTracker","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"newValue","type":"uint256"}],"name":"updateGasForProcessing","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint16","name":"_maxTransferAmountRate","type":"uint16"}],"name":"updateMaxTransferAmountRate","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"updateMinimumTokenBalanceForDividends","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"newAddress","type":"address"}],"name":"updateUniswapV2Router","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"withdrawableDividendOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"stateMutability":"payable","type":"receive"}]

60806040819052600160105560036011556017805461ffff191661271017905560006019556200547238819003908190833981016040819052620000439162000faa565b8751889088906200005c90600390602085019062000dc5565b5080516200007290600490602084019062000dc5565b5050506200008f62000089620008da60201b60201c565b620008de565b8451600980546001600160a01b03199081166001600160a01b0393841617909155604087015160138054831691841691821790556080880151600a80549093169316929092179055331415620001425760405162461bcd60e51b815260206004820152602d60248201527f4f776e657220616e64206d61726b6574696e672077616c6c65742063616e6e6f60448201526c74206265207468652073616d6560981b60648201526084015b60405180910390fd5b8351600c819055602080860151600d8190556040870151600e8190556011546010546200019b959194620001879491938593909284926200279b62000930821b17901c565b6200093060201b6200279b1790919060201c565b600f81905560191015620001f25760405162461bcd60e51b815260206004820152601560248201527f546f74616c20666565206973206f766572203235250000000000000000000000604482015260640162000139565b62000229620f4240620002156002896200094560201b620027ae1790919060201c565b6200095360201b620027ba1790919060201c565b600b55620493e06014556200025085600360200201516200096160201b620027c61760201c565b600880546001600160a01b0319166001600160a01b0392831690811790915560095460405163cd6dc68760e01b815292166004830152602482018590529063cd6dc68790604401600060405180830381600087803b158015620002b257600080fd5b505af1158015620002c7573d6000803e3d6000fd5b50505050600085600160058110620002ef57634e487b7160e01b600052603260045260246000fd5b602002015190506000816001600160a01b031663c45a01556040518163ffffffff1660e01b815260040160206040518083038186803b1580156200033257600080fd5b505afa15801562000347573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906200036d919062000f8d565b6001600160a01b031663c9c6539630846001600160a01b031663ad5c46486040518163ffffffff1660e01b815260040160206040518083038186803b158015620003b657600080fd5b505afa158015620003cb573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190620003f1919062000f8d565b6040516001600160e01b031960e085901b1681526001600160a01b03928316600482015291166024820152604401602060405180830381600087803b1580156200043a57600080fd5b505af11580156200044f573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019062000475919062000f8d565b600680546001600160a01b038086166001600160a01b03199283161790925560078054928416929091169190911790559050620004b481600162000a10565b60085460405163031e79db60e41b81526001600160a01b0390911660048201819052906331e79db090602401600060405180830381600087803b158015620004fb57600080fd5b505af115801562000510573d6000803e3d6000fd5b505060085460405163031e79db60e41b81523060048201526001600160a01b0390911692506331e79db09150602401600060405180830381600087803b1580156200055a57600080fd5b505af11580156200056f573d6000803e3d6000fd5b50506008546001600160a01b031691506331e79db09050620005996005546001600160a01b031690565b6040516001600160e01b031960e084901b1681526001600160a01b039091166004820152602401600060405180830381600087803b158015620005db57600080fd5b505af1158015620005f0573d6000803e3d6000fd5b505060085460405163031e79db60e41b815261dead60048201526001600160a01b0390911692506331e79db09150602401600060405180830381600087803b1580156200063c57600080fd5b505af115801562000651573d6000803e3d6000fd5b505060085460135460405163031e79db60e41b81526001600160a01b039182166004820152911692506331e79db09150602401600060405180830381600087803b1580156200069f57600080fd5b505af1158015620006b4573d6000803e3d6000fd5b50505050620006d4620006cc62000b7f60201b60201c565b600162000b8e565b601354620006ed906001600160a01b0316600162000b8e565b620006fa30600162000b8e565b60156020527f94e8b85d8ed26dd4d990fa41892f89c538182acb05c9561fea45cc4cf8cca31d8054600160ff1991821681179092557fb75de2749c6e8abdb61aa26ceb0445e5f0db21b3d4614f9498c75d9b84e3906280548216831790557f21c2621cdf5bb962f69e151c97cf5bfa2f2238f4a9af6ca6ea4cd893c1c4f7f580548216831790557f057403349f8cc9a46b44ec042afe292bb1ae0d1778c9c0ed5553a35c5806bd1080548216831790557faa4d47ee27396158934ac32ad19ce2455c316a7494894a8673655b47d2785b9b80548216831790557f883ea794edabb2123b63447d6e94b53d79fb0d14ba4e49d55a6f07806365a7bc80548216831790557f6433fb10b16834c4ab50486beaaa709fcd49f9ad320f98d285d12ba48116e5f4805490911690911790557376e49ae58e6f99e8afef5cfec07c838a7591037160005262000870620008566005546001600160a01b031690565b6200086a8a670de0b6b3a764000062001182565b62000ce0565b30620008846005546001600160a01b031690565b6001600160a01b03167f56358b41df5fa59f5639228f0930994cbdde383c8a8fd74e06c04e1deebe356260046001604051620008c2929190620010bb565b60405180910390a3505050505050505050506200120d565b3390565b600580546001600160a01b038381166001600160a01b0319831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a35050565b60006200093e828462001146565b9392505050565b60006200093e828462001182565b60006200093e828462001161565b60006040517f3d602d80600a3d3981f3363d3d373d3d3d363d7300000000000000000000000081528260601b60148201526e5af43d82803e903d91602b57fd5bf360881b60288201526037816000f09150506001600160a01b03811662000a0b5760405162461bcd60e51b815260206004820152601660248201527f455243313136373a20637265617465206661696c656400000000000000000000604482015260640162000139565b919050565b6001600160a01b03821660009081526016602052604090205460ff161515811515141562000ab35760405162461bcd60e51b815260206004820152604360248201527f42414259544f4b454e3a204175746f6d61746564206d61726b6574206d616b6560448201527f72207061697220697320616c72656164792073657420746f20746861742076616064820152626c756560e81b608482015260a40162000139565b6001600160a01b0382166000908152601660205260409020805460ff1916821580159190911790915562000b435760085460405163031e79db60e41b81526001600160a01b038481166004830152909116906331e79db090602401600060405180830381600087803b15801562000b2957600080fd5b505af115801562000b3e573d6000803e3d6000fd5b505050505b604051811515906001600160a01b038416907fffa9187bf1f18bf477bd0ea1bcbb64e93b6a98132473929edfce215cd9b16fab90600090a35050565b6005546001600160a01b031690565b6005546001600160a01b0316331462000bea5760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604482015260640162000139565b6001600160a01b03821660009081526015602052604090205460ff161515811515141562000c815760405162461bcd60e51b815260206004820152603560248201527f42414259544f4b454e3a204163636f756e7420697320616c726561647920746860448201527f652076616c7565206f6620276578636c75646564270000000000000000000000606482015260840162000139565b6001600160a01b038216600081815260156020908152604091829020805460ff191685151590811790915591519182527f9d8f7706ea1113d1a167b526eca956215946dd36cc7df39eb16180222d8b5df7910160405180910390a25050565b6001600160a01b03821662000d385760405162461bcd60e51b815260206004820152601f60248201527f45524332303a206d696e7420746f20746865207a65726f206164647265737300604482015260640162000139565b806002600082825462000d4c919062001146565b90915550506001600160a01b0382166000908152602081905260408120805483929062000d7b90849062001146565b90915550506040518181526001600160a01b038316906000907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef9060200160405180910390a35050565b82805462000dd390620011a4565b90600052602060002090601f01602090048101928262000df7576000855562000e42565b82601f1062000e1257805160ff191683800117855562000e42565b8280016001018555821562000e42579182015b8281111562000e4257825182559160200191906001019062000e25565b5062000e5092915062000e54565b5090565b5b8082111562000e50576000815560010162000e55565b80516001600160a01b038116811462000a0b57600080fd5b600082601f83011262000e94578081fd5b604051606081016001600160401b038111828210171562000eb95762000eb9620011f7565b60405280836060810186101562000ece578384fd5b835b600381101562000ef157815183526020928301929091019060010162000ed0565b509195945050505050565b600082601f83011262000f0d578081fd5b81516001600160401b0381111562000f295762000f29620011f7565b602062000f3f601f8301601f1916820162001113565b828152858284870101111562000f53578384fd5b835b8381101562000f7257858101830151828201840152820162000f55565b8381111562000f8357848385840101525b5095945050505050565b60006020828403121562000f9f578081fd5b6200093e8262000e6b565b6000806000806000806000806101c0898b03121562000fc7578384fd5b88516001600160401b038082111562000fde578586fd5b62000fec8c838d0162000efc565b995060209150818b01518181111562001003578687fd5b620010118d828e0162000efc565b9950505060408a015196508a607f8b01126200102b578485fd5b62001035620010e8565b8060608c016101008d018e8111156200104c578889fd5b885b60058110156200107657620010638362000e6b565b855293850193918501916001016200104e565b50829950620010868f8262000e83565b985050505050506101608901519250620010a46101808a0162000e6b565b91506101a089015190509295985092959890939650565b6040810160088410620010de57634e487b7160e01b600052602160045260246000fd5b9281526020015290565b60405160a081016001600160401b03811182821017156200110d576200110d620011f7565b60405290565b604051601f8201601f191681016001600160401b03811182821017156200113e576200113e620011f7565b604052919050565b600082198211156200115c576200115c620011e1565b500190565b6000826200117d57634e487b7160e01b81526012600452602481fd5b500490565b60008160001904831182151516156200119f576200119f620011e1565b500290565b600181811c90821680620011b957607f821691505b60208210811415620011db57634e487b7160e01b600052602260045260246000fd5b50919050565b634e487b7160e01b600052601160045260246000fd5b634e487b7160e01b600052604160045260246000fd5b614255806200121d6000396000f3fe6080604052600436106103e25760003560e01c806395d89b411161020d578063c0b0fda211610128578063e7841ec0116100bb578063f2fde38b1161008a578063fccc28131161006f578063fccc281314610c14578063fe045ae814610c2a578063ffa1ad7414610c4a57600080fd5b8063f2fde38b14610bd4578063f7c618c114610bf457600080fd5b8063e7841ec014610b49578063e98030c714610b5e578063ee8f0b7a14610b7e578063f27fd25414610bb457600080fd5b8063c7f59a67116100f7578063c7f59a6714610ab7578063dd62ed3e14610ad7578063e2f4560514610b1d578063e708a0f914610b3357600080fd5b8063c0b0fda214610a41578063c492f04614610a57578063c55dae6314610a77578063c705c56914610a9757600080fd5b8063a9059cbb116101a0578063afa4f3b21161016f578063afa4f3b2146109bc578063b62496f5146109dc578063bdd4f29f14610a0c578063c024666814610a2157600080fd5b8063a9059cbb14610902578063a9e7572314610922578063ad56c13c14610937578063adefd90c1461099c57600080fd5b8063a26579ad116101dc578063a26579ad14610897578063a41a08fb146108ac578063a457c2d7146108c2578063a8b9d240146108e257600080fd5b806395d89b411461083657806398118cb41461084b5780639a7a23d6146108615780639c1b8af51461088157600080fd5b80634e71d92d116102fd5780636a141e2c11610290578063715018a61161025f578063715018a6146107c3578063871c128d146107d857806388bdd9be146107f85780638da5cb5b1461081857600080fd5b80636a141e2c146107375780636b67c4df14610757578063700bb1911461076d57806370a082311461078d57600080fd5b8063625e764c116102cc578063625e764c146106c257806364b0f653146106e257806365b8dbc0146106f75780636843cd841461071757600080fd5b80634e71d92d146106345780634ed080c7146106495780634fbee193146106695780635d098b38146106a257600080fd5b80632c1f521611610375578063395093511161034457806339509351146105a65780633ff8bf2e146105c65780634144d9e4146105f457806349bd5a5e1461061457600080fd5b80632c1f52161461053557806330bb4cff14610555578063313ce5671461056a57806331e79db01461058657600080fd5b80631694505e116103b15780631694505e1461048f57806318160ddd146104c757806323b872dd146104dc578063269f534c146104fc57600080fd5b806306fdde03146103ee578063095ea7b3146104195780630dcb2e891461044957806313114a9d1461046b57600080fd5b366103e957005b600080fd5b3480156103fa57600080fd5b50610403610c5f565b6040516104109190614011565b60405180910390f35b34801561042557600080fd5b50610439610434366004613e71565b610cf1565b6040519015158152602001610410565b34801561045557600080fd5b50610469610464366004613f5b565b610d07565b005b34801561047757600080fd5b50610481600f5481565b604051908152602001610410565b34801561049b57600080fd5b506006546104af906001600160a01b031681565b6040516001600160a01b039091168152602001610410565b3480156104d357600080fd5b50600254610481565b3480156104e857600080fd5b506104396104f7366004613d9b565b610dcf565b34801561050857600080fd5b50610439610517366004613d2b565b6001600160a01b031660009081526018602052604090205460ff1690565b34801561054157600080fd5b506008546104af906001600160a01b031681565b34801561056157600080fd5b50610481610e8e565b34801561057657600080fd5b5060405160128152602001610410565b34801561059257600080fd5b506104696105a1366004613d2b565b610f29565b3480156105b257600080fd5b506104396105c1366004613e71565b610fa3565b3480156105d257600080fd5b506017546105e19061ffff1681565b60405161ffff9091168152602001610410565b34801561060057600080fd5b506013546104af906001600160a01b031681565b34801561062057600080fd5b506007546104af906001600160a01b031681565b34801561064057600080fd5b50610469610fdf565b34801561065557600080fd5b50610469610664366004613f5b565b61107f565b34801561067557600080fd5b50610439610684366004613d2b565b6001600160a01b031660009081526015602052604090205460ff1690565b3480156106ae57600080fd5b506104696106bd366004613d2b565b61113d565b3480156106ce57600080fd5b506104696106dd366004613f5b565b6111a7565b3480156106ee57600080fd5b50610481611209565b34801561070357600080fd5b50610469610712366004613d2b565b611267565b34801561072357600080fd5b50610481610732366004613d2b565b61154f565b34801561074357600080fd5b50610469610752366004613f39565b6115d4565b34801561076357600080fd5b50610481600e5481565b34801561077957600080fd5b50610469610788366004613f5b565b6116d6565b34801561079957600080fd5b506104816107a8366004613d2b565b6001600160a01b031660009081526020819052604090205490565b3480156107cf57600080fd5b506104696117ce565b3480156107e457600080fd5b506104696107f3366004613f5b565b611822565b34801561080457600080fd5b50610469610813366004613d2b565b61199d565b34801561082457600080fd5b506005546001600160a01b03166104af565b34801561084257600080fd5b50610403611d76565b34801561085757600080fd5b50610481600d5481565b34801561086d57600080fd5b5061046961087c366004613ddb565b611d85565b34801561088d57600080fd5b5061048160145481565b3480156108a357600080fd5b50610481611e85565b3480156108b857600080fd5b5061048160115481565b3480156108ce57600080fd5b506104396108dd366004613e71565b611ee3565b3480156108ee57600080fd5b506104816108fd366004613d2b565b611f94565b34801561090e57600080fd5b5061043961091d366004613e71565b611fe0565b34801561092e57600080fd5b50610481611fed565b34801561094357600080fd5b50610957610952366004613d2b565b612018565b604080516001600160a01b0390991689526020890197909752958701949094526060860192909252608085015260a084015260c083015260e082015261010001610410565b3480156109a857600080fd5b506104696109b7366004613f5b565b6120db565b3480156109c857600080fd5b506104696109d7366004613f5b565b61213d565b3480156109e857600080fd5b506104396109f7366004613d2b565b60166020526000908152604090205460ff1681565b348015610a1857600080fd5b5061048161218a565b348015610a2d57600080fd5b50610469610a3c366004613ddb565b6121e8565b348015610a4d57600080fd5b5061048160105481565b348015610a6357600080fd5b50610469610a72366004613e9c565b612324565b348015610a8357600080fd5b50600a546104af906001600160a01b031681565b348015610aa357600080fd5b50610439610ab2366004613d2b565b61242c565b348015610ac357600080fd5b50610469610ad2366004613ddb565b6124c3565b348015610ae357600080fd5b50610481610af2366004613d63565b6001600160a01b03918216600090815260016020908152604080832093909416825291909152205490565b348015610b2957600080fd5b50610481600b5481565b348015610b3f57600080fd5b50610481600c5481565b348015610b5557600080fd5b50610481612536565b348015610b6a57600080fd5b50610469610b79366004613f5b565b612594565b348015610b8a57600080fd5b506104af610b99366004613d2b565b6012602052600090815260409020546001600160a01b031681565b348015610bc057600080fd5b50610957610bcf366004613f5b565b612626565b348015610be057600080fd5b50610469610bef366004613d2b565b612681565b348015610c0057600080fd5b506009546104af906001600160a01b031681565b348015610c2057600080fd5b506104af61dead81565b348015610c3657600080fd5b50610469610c45366004613f5b565b61274e565b348015610c5657600080fd5b50610481600181565b606060038054610c6e90614142565b80601f0160208091040260200160405190810160405280929190818152602001828054610c9a90614142565b8015610ce75780601f10610cbc57610100808354040283529160200191610ce7565b820191906000526020600020905b815481529060010190602001808311610cca57829003601f168201915b5050505050905090565b6000610cfe338484612881565b50600192915050565b6005546001600160a01b03163314610d545760405162461bcd60e51b8152602060048201819052602482015260008051602061420083398151915260448201526064015b60405180910390fd5b6008546040517f0dcb2e89000000000000000000000000000000000000000000000000000000008152600481018390526001600160a01b0390911690630dcb2e89906024015b600060405180830381600087803b158015610db457600080fd5b505af1158015610dc8573d6000803e3d6000fd5b5050505050565b6000610ddc8484846129d9565b6001600160a01b038416600090815260016020908152604080832033845290915290205482811015610e765760405162461bcd60e51b815260206004820152602860248201527f45524332303a207472616e7366657220616d6f756e742065786365656473206160448201527f6c6c6f77616e63650000000000000000000000000000000000000000000000006064820152608401610d4b565b610e838533858403612881565b506001949350505050565b600854604080517f85a6b3ae00000000000000000000000000000000000000000000000000000000815290516000926001600160a01b0316916385a6b3ae916004808301926020929190829003018186803b158015610eec57600080fd5b505afa158015610f00573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610f249190613f73565b905090565b6005546001600160a01b03163314610f715760405162461bcd60e51b815260206004820181905260248201526000805160206142008339815191526044820152606401610d4b565b60085460405163031e79db60e41b81526001600160a01b038381166004830152909116906331e79db090602401610d9a565b3360008181526001602090815260408083206001600160a01b03871684529091528120549091610cfe918590610fda9086906140d4565b612881565b6008546040517fbc4c4b37000000000000000000000000000000000000000000000000000000008152336004820152600060248201526001600160a01b039091169063bc4c4b3790604401602060405180830381600087803b15801561104457600080fd5b505af1158015611058573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061107c9190613f1d565b50565b6005546001600160a01b031633146110c75760405162461bcd60e51b815260206004820181905260248201526000805160206142008339815191526044820152606401610d4b565b600c819055600e54600d546110e891906110e290849061279b565b9061279b565b600f8190556019101561107c5760405162461bcd60e51b815260206004820152601560248201527f546f74616c20666565206973206f7665722032352500000000000000000000006044820152606401610d4b565b6005546001600160a01b031633146111855760405162461bcd60e51b815260206004820181905260248201526000805160206142008339815191526044820152606401610d4b565b601380546001600160a01b0319166001600160a01b0392909216919091179055565b6005546001600160a01b031633146111ef5760405162461bcd60e51b815260206004820181905260248201526000805160206142008339815191526044820152606401610d4b565b600e819055600d54600c546110e89183916110e29161279b565b600854604080517f09bbedde00000000000000000000000000000000000000000000000000000000815290516000926001600160a01b0316916309bbedde916004808301926020929190829003018186803b158015610eec57600080fd5b6005546001600160a01b031633146112af5760405162461bcd60e51b815260206004820181905260248201526000805160206142008339815191526044820152606401610d4b565b6006546001600160a01b03828116911614156113335760405162461bcd60e51b815260206004820152602e60248201527f42414259544f4b454e3a2054686520726f7574657220616c726561647920686160448201527f73207468617420616464726573730000000000000000000000000000000000006064820152608401610d4b565b6006546040516001600160a01b03918216918316907f8fc842bbd331dfa973645f4ed48b11683d501ebf1352708d77a5da2ab49a576e90600090a3600680546001600160a01b0319166001600160a01b038316908117909155604080517fc45a015500000000000000000000000000000000000000000000000000000000815290516000929163c45a0155916004808301926020929190829003018186803b1580156113de57600080fd5b505afa1580156113f2573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906114169190613d47565b6001600160a01b031663c9c6539630600660009054906101000a90046001600160a01b03166001600160a01b031663ad5c46486040518163ffffffff1660e01b815260040160206040518083038186803b15801561147357600080fd5b505afa158015611487573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906114ab9190613d47565b6040516001600160e01b031960e085901b1681526001600160a01b03928316600482015291166024820152604401602060405180830381600087803b1580156114f357600080fd5b505af1158015611507573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061152b9190613d47565b600780546001600160a01b0319166001600160a01b03929092169190911790555050565b6008546040516370a0823160e01b81526001600160a01b03838116600483015260009216906370a08231906024015b60206040518083038186803b15801561159657600080fd5b505afa1580156115aa573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906115ce9190613f73565b92915050565b6005546001600160a01b0316331461161c5760405162461bcd60e51b815260206004820181905260248201526000805160206142008339815191526044820152606401610d4b565b6127108161ffff1611156116be5760405162461bcd60e51b815260206004820152606060248201527f50414e544845523a3a7570646174654d61785472616e73666572416d6f756e7460448201527f526174653a204d6178207472616e7366657220616d6f756e742072617465206d60648201527f757374206e6f742065786365656420746865206d6178696d756d20726174652e608482015260a401610d4b565b6017805461ffff191661ffff92909216919091179055565b6008546040517fffb2c47900000000000000000000000000000000000000000000000000000000815260048101839052600091829182916001600160a01b03169063ffb2c47990602401606060405180830381600087803b15801561173a57600080fd5b505af115801561174e573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906117729190613f8b565b604080518481526020810184905290810182905260608101889052929550909350915032906000907fc864333d6121033635ab41b29ae52f10a22cf4438c3e4f1c4c68518feb2f8a98906080015b60405180910390a350505050565b6005546001600160a01b031633146118165760405162461bcd60e51b815260206004820181905260248201526000805160206142008339815191526044820152606401610d4b565b6118206000613054565b565b6005546001600160a01b0316331461186a5760405162461bcd60e51b815260206004820181905260248201526000805160206142008339815191526044820152606401610d4b565b62030d40811015801561188057506207a1208111155b6118f25760405162461bcd60e51b815260206004820152603f60248201527f42414259544f4b454e3a20676173466f7250726f63657373696e67206d75737460448201527f206265206265747765656e203230302c30303020616e64203530302c303030006064820152608401610d4b565b60145481141561196a5760405162461bcd60e51b815260206004820152603760248201527f42414259544f4b454e3a2043616e6e6f742075706461746520676173466f725060448201527f726f63657373696e6720746f2073616d652076616c75650000000000000000006064820152608401610d4b565b60145460405182907f40d7e40e79af4e8e5a9b3c57030d8ea93f13d669c06d448c4d631d4ae7d23db790600090a3601455565b6005546001600160a01b031633146119e55760405162461bcd60e51b815260206004820181905260248201526000805160206142008339815191526044820152606401610d4b565b6008546001600160a01b0382811691161415611a695760405162461bcd60e51b815260206004820152603860248201527f42414259544f4b454e3a20546865206469766964656e6420747261636b65722060448201527f616c7265616479206861732074686174206164647265737300000000000000006064820152608401610d4b565b6000819050306001600160a01b0316816001600160a01b0316638da5cb5b6040518163ffffffff1660e01b815260040160206040518083038186803b158015611ab157600080fd5b505afa158015611ac5573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611ae99190613d47565b6001600160a01b031614611b8b5760405162461bcd60e51b815260206004820152605160248201527f42414259544f4b454e3a20546865206e6577206469766964656e64207472616360448201527f6b6572206d757374206265206f776e6564206279207468652042414259544f4b60648201527f454e20746f6b656e20636f6e7472616374000000000000000000000000000000608482015260a401610d4b565b60405163031e79db60e41b81526001600160a01b03821660048201819052906331e79db090602401600060405180830381600087803b158015611bcd57600080fd5b505af1158015611be1573d6000803e3d6000fd5b505060405163031e79db60e41b81523060048201526001600160a01b03841692506331e79db09150602401600060405180830381600087803b158015611c2657600080fd5b505af1158015611c3a573d6000803e3d6000fd5b50505050806001600160a01b03166331e79db0611c5f6005546001600160a01b031690565b6040516001600160e01b031960e084901b1681526001600160a01b039091166004820152602401600060405180830381600087803b158015611ca057600080fd5b505af1158015611cb4573d6000803e3d6000fd5b505060065460405163031e79db60e41b81526001600160a01b03918216600482015290841692506331e79db09150602401600060405180830381600087803b158015611cff57600080fd5b505af1158015611d13573d6000803e3d6000fd5b50506008546040516001600160a01b03918216935090851691507f90c7d74461c613da5efa97d90740869367d74ab3aa5837aa4ae9a975f954b7a890600090a3600880546001600160a01b0319166001600160a01b039290921691909117905550565b606060048054610c6e90614142565b6005546001600160a01b03163314611dcd5760405162461bcd60e51b815260206004820181905260248201526000805160206142008339815191526044820152606401610d4b565b6007546001600160a01b0383811691161415611e775760405162461bcd60e51b815260206004820152605060248201527f42414259544f4b454e3a205468652050616e63616b655377617020706169722060448201527f63616e6e6f742062652072656d6f7665642066726f6d206175746f6d6174656460648201527f4d61726b65744d616b6572506169727300000000000000000000000000000000608482015260a401610d4b565b611e8182826130a6565b5050565b600854604080517f6f2789ec00000000000000000000000000000000000000000000000000000000815290516000926001600160a01b031691636f2789ec916004808301926020929190829003018186803b158015610eec57600080fd5b3360009081526001602090815260408083206001600160a01b038616845290915281205482811015611f7d5760405162461bcd60e51b815260206004820152602560248201527f45524332303a2064656372656173656420616c6c6f77616e63652062656c6f7760448201527f207a65726f0000000000000000000000000000000000000000000000000000006064820152608401610d4b565b611f8a3385858403612881565b5060019392505050565b6008546040517fa8b9d2400000000000000000000000000000000000000000000000000000000081526001600160a01b038381166004830152600092169063a8b9d2409060240161157e565b6000610cfe3384846129d9565b601754600090610f2490612710906120129061ffff1661200c60025490565b906127ae565b906127ba565b6008546040517ffbcbc0f10000000000000000000000000000000000000000000000000000000081526001600160a01b038381166004830152600092839283928392839283928392839291169063fbcbc0f1906024015b6101006040518083038186803b15801561208857600080fd5b505afa15801561209c573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906120c09190613e08565b97509750975097509750975097509750919395975091939597565b6005546001600160a01b031633146121235760405162461bcd60e51b815260206004820181905260248201526000805160206142008339815191526044820152606401610d4b565b600d819055600e54600c546110e891906110e2908461279b565b6005546001600160a01b031633146121855760405162461bcd60e51b815260206004820181905260248201526000805160206142008339815191526044820152606401610d4b565b600b55565b600854604080517fbe10b61400000000000000000000000000000000000000000000000000000000815290516000926001600160a01b03169163be10b614916004808301926020929190829003018186803b158015610eec57600080fd5b6005546001600160a01b031633146122305760405162461bcd60e51b815260206004820181905260248201526000805160206142008339815191526044820152606401610d4b565b6001600160a01b03821660009081526015602052604090205460ff16151581151514156122c55760405162461bcd60e51b815260206004820152603560248201527f42414259544f4b454e3a204163636f756e7420697320616c726561647920746860448201527f652076616c7565206f6620276578636c756465642700000000000000000000006064820152608401610d4b565b6001600160a01b038216600081815260156020908152604091829020805460ff191685151590811790915591519182527f9d8f7706ea1113d1a167b526eca956215946dd36cc7df39eb16180222d8b5df7910160405180910390a25050565b6005546001600160a01b0316331461236c5760405162461bcd60e51b815260206004820181905260248201526000805160206142008339815191526044820152606401610d4b565b60005b828110156123eb57816015600086868581811061239c57634e487b7160e01b600052603260045260246000fd5b90506020020160208101906123b19190613d2b565b6001600160a01b031681526020810191909152604001600020805460ff1916911515919091179055806123e3816141b6565b91505061236f565b507f7fdaf542373fa84f4ee8d662c642f44e4c2276a217d7d29e548b6eb29a233b3583838360405161241f93929190613fb8565b60405180910390a1505050565b6008546040517fc705c5690000000000000000000000000000000000000000000000000000000081526001600160a01b038381166004830152600092169063c705c5699060240160206040518083038186803b15801561248b57600080fd5b505afa15801561249f573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906115ce9190613f1d565b6005546001600160a01b0316331461250b5760405162461bcd60e51b815260206004820181905260248201526000805160206142008339815191526044820152606401610d4b565b6001600160a01b03919091166000908152601860205260409020805460ff1916911515919091179055565b600854604080517fe7841ec000000000000000000000000000000000000000000000000000000000815290516000926001600160a01b03169163e7841ec0916004808301926020929190829003018186803b158015610eec57600080fd5b6005546001600160a01b031633146125dc5760405162461bcd60e51b815260206004820181905260248201526000805160206142008339815191526044820152606401610d4b565b6008546040517fe98030c7000000000000000000000000000000000000000000000000000000008152600481018390526001600160a01b039091169063e98030c790602401610d9a565b6008546040517f5183d6fd0000000000000000000000000000000000000000000000000000000081526004810183905260009182918291829182918291829182916001600160a01b0390911690635183d6fd9060240161206f565b6005546001600160a01b031633146126c95760405162461bcd60e51b815260206004820181905260248201526000805160206142008339815191526044820152606401610d4b565b6001600160a01b0381166127455760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201527f64647265737300000000000000000000000000000000000000000000000000006064820152608401610d4b565b61107c81613054565b6005546001600160a01b031633146127965760405162461bcd60e51b815260206004820181905260248201526000805160206142008339815191526044820152606401610d4b565b601955565b60006127a782846140d4565b9392505050565b60006127a7828461410c565b60006127a782846140ec565b60006040517f3d602d80600a3d3981f3363d3d373d3d3d363d7300000000000000000000000081528260601b60148201527f5af43d82803e903d91602b57fd5bf3000000000000000000000000000000000060288201526037816000f09150506001600160a01b03811661287c5760405162461bcd60e51b815260206004820152601660248201527f455243313136373a20637265617465206661696c6564000000000000000000006044820152606401610d4b565b919050565b6001600160a01b0383166128fc5760405162461bcd60e51b8152602060048201526024808201527f45524332303a20617070726f76652066726f6d20746865207a65726f2061646460448201527f72657373000000000000000000000000000000000000000000000000000000006064820152608401610d4b565b6001600160a01b0382166129785760405162461bcd60e51b815260206004820152602260248201527f45524332303a20617070726f766520746f20746865207a65726f20616464726560448201527f73730000000000000000000000000000000000000000000000000000000000006064820152608401610d4b565b6001600160a01b0383811660008181526001602090815260408083209487168084529482529182902085905590518481527f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925910160405180910390a3505050565b6001600160a01b038316612a3d5760405162461bcd60e51b815260206004820152602560248201527f45524332303a207472616e736665722066726f6d20746865207a65726f206164604482015264647265737360d81b6064820152608401610d4b565b6001600160a01b038216612a9f5760405162461bcd60e51b815260206004820152602360248201527f45524332303a207472616e7366657220746f20746865207a65726f206164647260448201526265737360e81b6064820152608401610d4b565b80612ab557612ab08383600061322a565b505050565b30600090815260208190526040902054600754600160a01b900460ff16158015612af857506001600160a01b03841660009081526016602052604090205460ff16155b8015612b1257506005546001600160a01b03858116911614155b8015612b2c57506005546001600160a01b03848116911614155b8015612b5c57506007546001600160a01b0385811691161480612b5c57506007546001600160a01b038481169116145b8015612b8157506001600160a01b03841660009081526015602052604090205460ff16155b8015612ba657506001600160a01b03831660009081526015602052604090205460ff16155b15612c33576007805460ff60a01b1916600160a01b179055600f54600e54600091612bd6916120129085906127ae565b9050612be181613408565b6000612bfe600f54612012600d54866127ae90919063ffffffff16565b9050612c098161359b565b30600090815260208190526040902054612c2281613622565b50506007805460ff60a01b19169055505b6007546001600160a01b03851660009081526015602052604090205460ff600160a01b909204821615911680612c8157506001600160a01b03841660009081526015602052604090205460ff165b80612cb357506007546001600160a01b03868116911614801590612cb357506007546001600160a01b03858116911614155b15612cbc575060005b8015612da1576000612cde6064612012600f54876127ae90919063ffffffff16565b6001600160a01b03861660009081526016602052604090205490915060ff1615612d1f57612d1260646120128660016127ae565b612d1c90826140d4565b90505b6000612d3b6064612012601054886127ae90919063ffffffff16565b9050612d4a8761dead8361322a565b6000612d666064612012601154896127ae90919063ffffffff16565b9050612d738888836137eb565b612d918830612d8c84612d86888861390e565b9061390e565b61322a565b612d9b868461390e565b95505050505b6001600160a01b038416600090815260208190526040812054158015612ddf57506001600160a01b0385811660009081526012602052604090205416155b8015612df957506007546001600160a01b03878116911614155b90508015612e30576001600160a01b03858116600090815260126020526040902080546001600160a01b0319169188169190911790555b612e3b86868661322a565b6008546001600160a01b031663e30443bc87612e6c816001600160a01b031660009081526020819052604090205490565b6040516001600160e01b031960e085901b1681526001600160a01b0390921660048301526024820152604401600060405180830381600087803b158015612eb257600080fd5b505af1925050508015612ec3575060015b506008546001600160a01b031663e30443bc86612ef5816001600160a01b031660009081526020819052604090205490565b6040516001600160e01b031960e085901b1681526001600160a01b0390921660048301526024820152604401600060405180830381600087803b158015612f3b57600080fd5b505af1925050508015612f4c575060015b50600754600160a01b900460ff1661304c576014546008546040517fffb2c479000000000000000000000000000000000000000000000000000000008152600481018390526001600160a01b039091169063ffb2c47990602401606060405180830381600087803b158015612fc057600080fd5b505af1925050508015612ff0575060408051601f3d908101601f19168201909252612fed91810190613f8b565b60015b612ff95761304a565b60408051848152602081018490529081018290526060810185905232906001907fc864333d6121033635ab41b29ae52f10a22cf4438c3e4f1c4c68518feb2f8a989060800160405180910390a35050505b505b505050505050565b600580546001600160a01b038381166001600160a01b0319831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a35050565b6001600160a01b03821660009081526016602052604090205460ff16151581151514156131615760405162461bcd60e51b815260206004820152604360248201527f42414259544f4b454e3a204175746f6d61746564206d61726b6574206d616b6560448201527f72207061697220697320616c72656164792073657420746f207468617420766160648201527f6c75650000000000000000000000000000000000000000000000000000000000608482015260a401610d4b565b6001600160a01b0382166000908152601660205260409020805460ff191682158015919091179091556131ee5760085460405163031e79db60e41b81526001600160a01b038481166004830152909116906331e79db090602401600060405180830381600087803b1580156131d557600080fd5b505af11580156131e9573d6000803e3d6000fd5b505050505b604051811515906001600160a01b038416907fffa9187bf1f18bf477bd0ea1bcbb64e93b6a98132473929edfce215cd9b16fab90600090a35050565b6001600160a01b03831661328e5760405162461bcd60e51b815260206004820152602560248201527f45524332303a207472616e736665722066726f6d20746865207a65726f206164604482015264647265737360d81b6064820152608401610d4b565b6001600160a01b0382166132f05760405162461bcd60e51b815260206004820152602360248201527f45524332303a207472616e7366657220746f20746865207a65726f206164647260448201526265737360e81b6064820152608401610d4b565b6001600160a01b0383166000908152602081905260409020548181101561337f5760405162461bcd60e51b815260206004820152602660248201527f45524332303a207472616e7366657220616d6f756e742065786365656473206260448201527f616c616e636500000000000000000000000000000000000000000000000000006064820152608401610d4b565b6001600160a01b038085166000908152602081905260408082208585039055918516815290812080548492906133b69084906140d4565b92505081905550826001600160a01b0316846001600160a01b03167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef846040516117c091815260200190565b50505050565b6009546040516370a0823160e01b81523060048201526000916001600160a01b0316906370a082319060240160206040518083038186803b15801561344c57600080fd5b505afa158015613460573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906134849190613f73565b905061348f8261391a565b6009546040516370a0823160e01b81523060048201526000916135119184916001600160a01b0316906370a082319060240160206040518083038186803b1580156134d957600080fd5b505afa1580156134ed573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612d869190613f73565b60095460135460405163a9059cbb60e01b81526001600160a01b03918216600482015260248101849052929350169063a9059cbb90604401602060405180830381600087803b15801561356357600080fd5b505af1158015613577573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906134029190613f1d565b60006135a88260026127ba565b905060006135b6838361390e565b9050476135c283613af1565b60006135ce478361390e565b90506135da8382613c59565b60408051858152602081018390529081018490527f17bbfb9a6069321b6ded73bd96327c9e6b7212a5cd51ff219cd61370acafb5619060600160405180910390a15050505050565b61362b8161391a565b6009546040516370a0823160e01b81523060048201526000916001600160a01b0316906370a082319060240160206040518083038186803b15801561366f57600080fd5b505afa158015613683573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906136a79190613f73565b60095460085460405163a9059cbb60e01b81526001600160a01b0391821660048201526024810184905292935060009291169063a9059cbb90604401602060405180830381600087803b1580156136fd57600080fd5b505af1158015613711573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906137359190613f1d565b90508015612ab0576008546040517fba72a955000000000000000000000000000000000000000000000000000000008152600481018490526001600160a01b039091169063ba72a95590602401600060405180830381600087803b15801561379c57600080fd5b505af11580156137b0573d6000803e3d6000fd5b505060408051868152602081018690527f80195cc573b02cc48460cbca6e6e4cc85ddb91959d946e1c3025ea3d87942dc3935001905061241f565b6011546137f757505050565b6007546000906001600160a01b038581169116141561381757508161383f565b6007546001600160a01b038481169116141561383457508261383f565b61340284308461322a565b60008061385860646011546127ae90919063ffffffff16565b905060005b60088112156138f1576000816138755750609661388a565b81600114156138865750605a61388a565b50600a5b6001600160a01b0394851660009081526012602052604090205490941693846138b357506138f1565b6138bd848261279b565b935060006138cf8261200c89876127ba565b90506138dc89878361322a565b505080806138e99061417d565b91505061385d565b5061304c8630612d8c613904858761390e565b61200c89876127ba565b60006127a7828461412b565b6040805160038082526080820190925260009160208201606080368337019050509050308160008151811061395f57634e487b7160e01b600052603260045260246000fd5b6001600160a01b03928316602091820292909201810191909152600654604080516315ab88c960e31b81529051919093169263ad5c4648926004808301939192829003018186803b1580156139b357600080fd5b505afa1580156139c7573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906139eb9190613d47565b81600181518110613a0c57634e487b7160e01b600052603260045260246000fd5b6001600160a01b039283166020918202929092010152600954825191169082906002908110613a4b57634e487b7160e01b600052603260045260246000fd5b6001600160a01b039283166020918202929092010152600654613a719130911684612881565b6006546040517f5c11d7950000000000000000000000000000000000000000000000000000000081526001600160a01b0390911690635c11d79590613ac3908590600090869030904290600401614064565b600060405180830381600087803b158015613add57600080fd5b505af115801561304c573d6000803e3d6000fd5b6040805160028082526060820183526000926020830190803683370190505090503081600081518110613b3457634e487b7160e01b600052603260045260246000fd5b6001600160a01b03928316602091820292909201810191909152600654604080516315ab88c960e31b81529051919093169263ad5c4648926004808301939192829003018186803b158015613b8857600080fd5b505afa158015613b9c573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190613bc09190613d47565b81600181518110613be157634e487b7160e01b600052603260045260246000fd5b6001600160a01b039283166020918202929092010152600654613c079130911684612881565b6006546040517f791ac9470000000000000000000000000000000000000000000000000000000081526001600160a01b039091169063791ac94790613ac3908590600090869030904290600401614064565b600654613c719030906001600160a01b031684612881565b6006546040517ff305d719000000000000000000000000000000000000000000000000000000008152306004820152602481018490526000604482018190526064820181905260848201524260a48201526001600160a01b039091169063f305d71990839060c4016060604051808303818588803b158015613cf257600080fd5b505af1158015613d06573d6000803e3d6000fd5b50505050506040513d601f19601f82011682018060405250810190610dc89190613f8b565b600060208284031215613d3c578081fd5b81356127a7816141dc565b600060208284031215613d58578081fd5b81516127a7816141dc565b60008060408385031215613d75578081fd5b8235613d80816141dc565b91506020830135613d90816141dc565b809150509250929050565b600080600060608486031215613daf578081fd5b8335613dba816141dc565b92506020840135613dca816141dc565b929592945050506040919091013590565b60008060408385031215613ded578182fd5b8235613df8816141dc565b91506020830135613d90816141f1565b600080600080600080600080610100898b031215613e24578384fd5b8851613e2f816141dc565b809850506020890151965060408901519550606089015194506080890151935060a0890151925060c0890151915060e089015190509295985092959890939650565b60008060408385031215613e83578182fd5b8235613e8e816141dc565b946020939093013593505050565b600080600060408486031215613eb0578283fd5b833567ffffffffffffffff80821115613ec7578485fd5b818601915086601f830112613eda578485fd5b813581811115613ee8578586fd5b8760208260051b8501011115613efc578586fd5b60209283019550935050840135613f12816141f1565b809150509250925092565b600060208284031215613f2e578081fd5b81516127a7816141f1565b600060208284031215613f4a578081fd5b813561ffff811681146127a7578182fd5b600060208284031215613f6c578081fd5b5035919050565b600060208284031215613f84578081fd5b5051919050565b600080600060608486031215613f9f578081fd5b8351925060208401519150604084015190509250925092565b6040808252810183905260008460608301825b86811015613ffb578235613fde816141dc565b6001600160a01b0316825260209283019290910190600101613fcb565b5080925050508215156020830152949350505050565b6000602080835283518082850152825b8181101561403d57858101830151858201604001528201614021565b8181111561404e5783604083870101525b50601f01601f1916929092016040019392505050565b600060a082018783526020878185015260a0604085015281875180845260c0860191508289019350845b818110156140b35784516001600160a01b03168352938301939183019160010161408e565b50506001600160a01b03969096166060850152505050608001529392505050565b600082198211156140e7576140e76141c6565b500190565b60008261410757634e487b7160e01b81526012600452602481fd5b500490565b6000816000190483118215151615614126576141266141c6565b500290565b60008282101561413d5761413d6141c6565b500390565b600181811c9082168061415657607f821691505b6020821081141561417757634e487b7160e01b600052602260045260246000fd5b50919050565b60007f7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8214156141af576141af6141c6565b5060010190565b60006000198214156141af576141af5b634e487b7160e01b600052601160045260246000fd5b6001600160a01b038116811461107c57600080fd5b801515811461107c57600080fdfe4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572a2646970667358221220d0bf67fc50171ea30fb019ad0318803cdd9fba723357b89fedd1ce6921f1b94a64736f6c6343000804003300000000000000000000000000000000000000000000000000000000000001c0000000000000000000000000000000000000000000000000000000000000020000000000000000000000000000000000000000000000000000000002540be4000000000000000000000000002170ed0880ac9a755fd29b2688956bd959f933f800000000000000000000000010ed43c718714eb63d5aa57b78b54704e256024e0000000000000000000000005d4f0811198e1a33116532c9b944ea11fe2a731a0000000000000000000000001efd53964fc6bdc0604b7f08ca6681fe57bdcdb80000000000000000000000002170ed0880ac9a755fd29b2688956bd959f933f800000000000000000000000000000000000000000000000000000000000000060000000000000000000000000000000000000000000000000000000000000003000000000000000000000000000000000000000000000000000000000000000200000000000000000000000000000000000000000000000000000002540be400000000000000000000000000ee6bd41f4b61350e70a18b5ce394aaebacba65b0000000000000000000000000000000000000000000000000000000000000000100000000000000000000000000000000000000000000000000000000000000056574686d6e00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000056574686d6e000000000000000000000000000000000000000000000000000000

Deployed Bytecode

0x6080604052600436106103e25760003560e01c806395d89b411161020d578063c0b0fda211610128578063e7841ec0116100bb578063f2fde38b1161008a578063fccc28131161006f578063fccc281314610c14578063fe045ae814610c2a578063ffa1ad7414610c4a57600080fd5b8063f2fde38b14610bd4578063f7c618c114610bf457600080fd5b8063e7841ec014610b49578063e98030c714610b5e578063ee8f0b7a14610b7e578063f27fd25414610bb457600080fd5b8063c7f59a67116100f7578063c7f59a6714610ab7578063dd62ed3e14610ad7578063e2f4560514610b1d578063e708a0f914610b3357600080fd5b8063c0b0fda214610a41578063c492f04614610a57578063c55dae6314610a77578063c705c56914610a9757600080fd5b8063a9059cbb116101a0578063afa4f3b21161016f578063afa4f3b2146109bc578063b62496f5146109dc578063bdd4f29f14610a0c578063c024666814610a2157600080fd5b8063a9059cbb14610902578063a9e7572314610922578063ad56c13c14610937578063adefd90c1461099c57600080fd5b8063a26579ad116101dc578063a26579ad14610897578063a41a08fb146108ac578063a457c2d7146108c2578063a8b9d240146108e257600080fd5b806395d89b411461083657806398118cb41461084b5780639a7a23d6146108615780639c1b8af51461088157600080fd5b80634e71d92d116102fd5780636a141e2c11610290578063715018a61161025f578063715018a6146107c3578063871c128d146107d857806388bdd9be146107f85780638da5cb5b1461081857600080fd5b80636a141e2c146107375780636b67c4df14610757578063700bb1911461076d57806370a082311461078d57600080fd5b8063625e764c116102cc578063625e764c146106c257806364b0f653146106e257806365b8dbc0146106f75780636843cd841461071757600080fd5b80634e71d92d146106345780634ed080c7146106495780634fbee193146106695780635d098b38146106a257600080fd5b80632c1f521611610375578063395093511161034457806339509351146105a65780633ff8bf2e146105c65780634144d9e4146105f457806349bd5a5e1461061457600080fd5b80632c1f52161461053557806330bb4cff14610555578063313ce5671461056a57806331e79db01461058657600080fd5b80631694505e116103b15780631694505e1461048f57806318160ddd146104c757806323b872dd146104dc578063269f534c146104fc57600080fd5b806306fdde03146103ee578063095ea7b3146104195780630dcb2e891461044957806313114a9d1461046b57600080fd5b366103e957005b600080fd5b3480156103fa57600080fd5b50610403610c5f565b6040516104109190614011565b60405180910390f35b34801561042557600080fd5b50610439610434366004613e71565b610cf1565b6040519015158152602001610410565b34801561045557600080fd5b50610469610464366004613f5b565b610d07565b005b34801561047757600080fd5b50610481600f5481565b604051908152602001610410565b34801561049b57600080fd5b506006546104af906001600160a01b031681565b6040516001600160a01b039091168152602001610410565b3480156104d357600080fd5b50600254610481565b3480156104e857600080fd5b506104396104f7366004613d9b565b610dcf565b34801561050857600080fd5b50610439610517366004613d2b565b6001600160a01b031660009081526018602052604090205460ff1690565b34801561054157600080fd5b506008546104af906001600160a01b031681565b34801561056157600080fd5b50610481610e8e565b34801561057657600080fd5b5060405160128152602001610410565b34801561059257600080fd5b506104696105a1366004613d2b565b610f29565b3480156105b257600080fd5b506104396105c1366004613e71565b610fa3565b3480156105d257600080fd5b506017546105e19061ffff1681565b60405161ffff9091168152602001610410565b34801561060057600080fd5b506013546104af906001600160a01b031681565b34801561062057600080fd5b506007546104af906001600160a01b031681565b34801561064057600080fd5b50610469610fdf565b34801561065557600080fd5b50610469610664366004613f5b565b61107f565b34801561067557600080fd5b50610439610684366004613d2b565b6001600160a01b031660009081526015602052604090205460ff1690565b3480156106ae57600080fd5b506104696106bd366004613d2b565b61113d565b3480156106ce57600080fd5b506104696106dd366004613f5b565b6111a7565b3480156106ee57600080fd5b50610481611209565b34801561070357600080fd5b50610469610712366004613d2b565b611267565b34801561072357600080fd5b50610481610732366004613d2b565b61154f565b34801561074357600080fd5b50610469610752366004613f39565b6115d4565b34801561076357600080fd5b50610481600e5481565b34801561077957600080fd5b50610469610788366004613f5b565b6116d6565b34801561079957600080fd5b506104816107a8366004613d2b565b6001600160a01b031660009081526020819052604090205490565b3480156107cf57600080fd5b506104696117ce565b3480156107e457600080fd5b506104696107f3366004613f5b565b611822565b34801561080457600080fd5b50610469610813366004613d2b565b61199d565b34801561082457600080fd5b506005546001600160a01b03166104af565b34801561084257600080fd5b50610403611d76565b34801561085757600080fd5b50610481600d5481565b34801561086d57600080fd5b5061046961087c366004613ddb565b611d85565b34801561088d57600080fd5b5061048160145481565b3480156108a357600080fd5b50610481611e85565b3480156108b857600080fd5b5061048160115481565b3480156108ce57600080fd5b506104396108dd366004613e71565b611ee3565b3480156108ee57600080fd5b506104816108fd366004613d2b565b611f94565b34801561090e57600080fd5b5061043961091d366004613e71565b611fe0565b34801561092e57600080fd5b50610481611fed565b34801561094357600080fd5b50610957610952366004613d2b565b612018565b604080516001600160a01b0390991689526020890197909752958701949094526060860192909252608085015260a084015260c083015260e082015261010001610410565b3480156109a857600080fd5b506104696109b7366004613f5b565b6120db565b3480156109c857600080fd5b506104696109d7366004613f5b565b61213d565b3480156109e857600080fd5b506104396109f7366004613d2b565b60166020526000908152604090205460ff1681565b348015610a1857600080fd5b5061048161218a565b348015610a2d57600080fd5b50610469610a3c366004613ddb565b6121e8565b348015610a4d57600080fd5b5061048160105481565b348015610a6357600080fd5b50610469610a72366004613e9c565b612324565b348015610a8357600080fd5b50600a546104af906001600160a01b031681565b348015610aa357600080fd5b50610439610ab2366004613d2b565b61242c565b348015610ac357600080fd5b50610469610ad2366004613ddb565b6124c3565b348015610ae357600080fd5b50610481610af2366004613d63565b6001600160a01b03918216600090815260016020908152604080832093909416825291909152205490565b348015610b2957600080fd5b50610481600b5481565b348015610b3f57600080fd5b50610481600c5481565b348015610b5557600080fd5b50610481612536565b348015610b6a57600080fd5b50610469610b79366004613f5b565b612594565b348015610b8a57600080fd5b506104af610b99366004613d2b565b6012602052600090815260409020546001600160a01b031681565b348015610bc057600080fd5b50610957610bcf366004613f5b565b612626565b348015610be057600080fd5b50610469610bef366004613d2b565b612681565b348015610c0057600080fd5b506009546104af906001600160a01b031681565b348015610c2057600080fd5b506104af61dead81565b348015610c3657600080fd5b50610469610c45366004613f5b565b61274e565b348015610c5657600080fd5b50610481600181565b606060038054610c6e90614142565b80601f0160208091040260200160405190810160405280929190818152602001828054610c9a90614142565b8015610ce75780601f10610cbc57610100808354040283529160200191610ce7565b820191906000526020600020905b815481529060010190602001808311610cca57829003601f168201915b5050505050905090565b6000610cfe338484612881565b50600192915050565b6005546001600160a01b03163314610d545760405162461bcd60e51b8152602060048201819052602482015260008051602061420083398151915260448201526064015b60405180910390fd5b6008546040517f0dcb2e89000000000000000000000000000000000000000000000000000000008152600481018390526001600160a01b0390911690630dcb2e89906024015b600060405180830381600087803b158015610db457600080fd5b505af1158015610dc8573d6000803e3d6000fd5b5050505050565b6000610ddc8484846129d9565b6001600160a01b038416600090815260016020908152604080832033845290915290205482811015610e765760405162461bcd60e51b815260206004820152602860248201527f45524332303a207472616e7366657220616d6f756e742065786365656473206160448201527f6c6c6f77616e63650000000000000000000000000000000000000000000000006064820152608401610d4b565b610e838533858403612881565b506001949350505050565b600854604080517f85a6b3ae00000000000000000000000000000000000000000000000000000000815290516000926001600160a01b0316916385a6b3ae916004808301926020929190829003018186803b158015610eec57600080fd5b505afa158015610f00573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610f249190613f73565b905090565b6005546001600160a01b03163314610f715760405162461bcd60e51b815260206004820181905260248201526000805160206142008339815191526044820152606401610d4b565b60085460405163031e79db60e41b81526001600160a01b038381166004830152909116906331e79db090602401610d9a565b3360008181526001602090815260408083206001600160a01b03871684529091528120549091610cfe918590610fda9086906140d4565b612881565b6008546040517fbc4c4b37000000000000000000000000000000000000000000000000000000008152336004820152600060248201526001600160a01b039091169063bc4c4b3790604401602060405180830381600087803b15801561104457600080fd5b505af1158015611058573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061107c9190613f1d565b50565b6005546001600160a01b031633146110c75760405162461bcd60e51b815260206004820181905260248201526000805160206142008339815191526044820152606401610d4b565b600c819055600e54600d546110e891906110e290849061279b565b9061279b565b600f8190556019101561107c5760405162461bcd60e51b815260206004820152601560248201527f546f74616c20666565206973206f7665722032352500000000000000000000006044820152606401610d4b565b6005546001600160a01b031633146111855760405162461bcd60e51b815260206004820181905260248201526000805160206142008339815191526044820152606401610d4b565b601380546001600160a01b0319166001600160a01b0392909216919091179055565b6005546001600160a01b031633146111ef5760405162461bcd60e51b815260206004820181905260248201526000805160206142008339815191526044820152606401610d4b565b600e819055600d54600c546110e89183916110e29161279b565b600854604080517f09bbedde00000000000000000000000000000000000000000000000000000000815290516000926001600160a01b0316916309bbedde916004808301926020929190829003018186803b158015610eec57600080fd5b6005546001600160a01b031633146112af5760405162461bcd60e51b815260206004820181905260248201526000805160206142008339815191526044820152606401610d4b565b6006546001600160a01b03828116911614156113335760405162461bcd60e51b815260206004820152602e60248201527f42414259544f4b454e3a2054686520726f7574657220616c726561647920686160448201527f73207468617420616464726573730000000000000000000000000000000000006064820152608401610d4b565b6006546040516001600160a01b03918216918316907f8fc842bbd331dfa973645f4ed48b11683d501ebf1352708d77a5da2ab49a576e90600090a3600680546001600160a01b0319166001600160a01b038316908117909155604080517fc45a015500000000000000000000000000000000000000000000000000000000815290516000929163c45a0155916004808301926020929190829003018186803b1580156113de57600080fd5b505afa1580156113f2573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906114169190613d47565b6001600160a01b031663c9c6539630600660009054906101000a90046001600160a01b03166001600160a01b031663ad5c46486040518163ffffffff1660e01b815260040160206040518083038186803b15801561147357600080fd5b505afa158015611487573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906114ab9190613d47565b6040516001600160e01b031960e085901b1681526001600160a01b03928316600482015291166024820152604401602060405180830381600087803b1580156114f357600080fd5b505af1158015611507573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061152b9190613d47565b600780546001600160a01b0319166001600160a01b03929092169190911790555050565b6008546040516370a0823160e01b81526001600160a01b03838116600483015260009216906370a08231906024015b60206040518083038186803b15801561159657600080fd5b505afa1580156115aa573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906115ce9190613f73565b92915050565b6005546001600160a01b0316331461161c5760405162461bcd60e51b815260206004820181905260248201526000805160206142008339815191526044820152606401610d4b565b6127108161ffff1611156116be5760405162461bcd60e51b815260206004820152606060248201527f50414e544845523a3a7570646174654d61785472616e73666572416d6f756e7460448201527f526174653a204d6178207472616e7366657220616d6f756e742072617465206d60648201527f757374206e6f742065786365656420746865206d6178696d756d20726174652e608482015260a401610d4b565b6017805461ffff191661ffff92909216919091179055565b6008546040517fffb2c47900000000000000000000000000000000000000000000000000000000815260048101839052600091829182916001600160a01b03169063ffb2c47990602401606060405180830381600087803b15801561173a57600080fd5b505af115801561174e573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906117729190613f8b565b604080518481526020810184905290810182905260608101889052929550909350915032906000907fc864333d6121033635ab41b29ae52f10a22cf4438c3e4f1c4c68518feb2f8a98906080015b60405180910390a350505050565b6005546001600160a01b031633146118165760405162461bcd60e51b815260206004820181905260248201526000805160206142008339815191526044820152606401610d4b565b6118206000613054565b565b6005546001600160a01b0316331461186a5760405162461bcd60e51b815260206004820181905260248201526000805160206142008339815191526044820152606401610d4b565b62030d40811015801561188057506207a1208111155b6118f25760405162461bcd60e51b815260206004820152603f60248201527f42414259544f4b454e3a20676173466f7250726f63657373696e67206d75737460448201527f206265206265747765656e203230302c30303020616e64203530302c303030006064820152608401610d4b565b60145481141561196a5760405162461bcd60e51b815260206004820152603760248201527f42414259544f4b454e3a2043616e6e6f742075706461746520676173466f725060448201527f726f63657373696e6720746f2073616d652076616c75650000000000000000006064820152608401610d4b565b60145460405182907f40d7e40e79af4e8e5a9b3c57030d8ea93f13d669c06d448c4d631d4ae7d23db790600090a3601455565b6005546001600160a01b031633146119e55760405162461bcd60e51b815260206004820181905260248201526000805160206142008339815191526044820152606401610d4b565b6008546001600160a01b0382811691161415611a695760405162461bcd60e51b815260206004820152603860248201527f42414259544f4b454e3a20546865206469766964656e6420747261636b65722060448201527f616c7265616479206861732074686174206164647265737300000000000000006064820152608401610d4b565b6000819050306001600160a01b0316816001600160a01b0316638da5cb5b6040518163ffffffff1660e01b815260040160206040518083038186803b158015611ab157600080fd5b505afa158015611ac5573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611ae99190613d47565b6001600160a01b031614611b8b5760405162461bcd60e51b815260206004820152605160248201527f42414259544f4b454e3a20546865206e6577206469766964656e64207472616360448201527f6b6572206d757374206265206f776e6564206279207468652042414259544f4b60648201527f454e20746f6b656e20636f6e7472616374000000000000000000000000000000608482015260a401610d4b565b60405163031e79db60e41b81526001600160a01b03821660048201819052906331e79db090602401600060405180830381600087803b158015611bcd57600080fd5b505af1158015611be1573d6000803e3d6000fd5b505060405163031e79db60e41b81523060048201526001600160a01b03841692506331e79db09150602401600060405180830381600087803b158015611c2657600080fd5b505af1158015611c3a573d6000803e3d6000fd5b50505050806001600160a01b03166331e79db0611c5f6005546001600160a01b031690565b6040516001600160e01b031960e084901b1681526001600160a01b039091166004820152602401600060405180830381600087803b158015611ca057600080fd5b505af1158015611cb4573d6000803e3d6000fd5b505060065460405163031e79db60e41b81526001600160a01b03918216600482015290841692506331e79db09150602401600060405180830381600087803b158015611cff57600080fd5b505af1158015611d13573d6000803e3d6000fd5b50506008546040516001600160a01b03918216935090851691507f90c7d74461c613da5efa97d90740869367d74ab3aa5837aa4ae9a975f954b7a890600090a3600880546001600160a01b0319166001600160a01b039290921691909117905550565b606060048054610c6e90614142565b6005546001600160a01b03163314611dcd5760405162461bcd60e51b815260206004820181905260248201526000805160206142008339815191526044820152606401610d4b565b6007546001600160a01b0383811691161415611e775760405162461bcd60e51b815260206004820152605060248201527f42414259544f4b454e3a205468652050616e63616b655377617020706169722060448201527f63616e6e6f742062652072656d6f7665642066726f6d206175746f6d6174656460648201527f4d61726b65744d616b6572506169727300000000000000000000000000000000608482015260a401610d4b565b611e8182826130a6565b5050565b600854604080517f6f2789ec00000000000000000000000000000000000000000000000000000000815290516000926001600160a01b031691636f2789ec916004808301926020929190829003018186803b158015610eec57600080fd5b3360009081526001602090815260408083206001600160a01b038616845290915281205482811015611f7d5760405162461bcd60e51b815260206004820152602560248201527f45524332303a2064656372656173656420616c6c6f77616e63652062656c6f7760448201527f207a65726f0000000000000000000000000000000000000000000000000000006064820152608401610d4b565b611f8a3385858403612881565b5060019392505050565b6008546040517fa8b9d2400000000000000000000000000000000000000000000000000000000081526001600160a01b038381166004830152600092169063a8b9d2409060240161157e565b6000610cfe3384846129d9565b601754600090610f2490612710906120129061ffff1661200c60025490565b906127ae565b906127ba565b6008546040517ffbcbc0f10000000000000000000000000000000000000000000000000000000081526001600160a01b038381166004830152600092839283928392839283928392839291169063fbcbc0f1906024015b6101006040518083038186803b15801561208857600080fd5b505afa15801561209c573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906120c09190613e08565b97509750975097509750975097509750919395975091939597565b6005546001600160a01b031633146121235760405162461bcd60e51b815260206004820181905260248201526000805160206142008339815191526044820152606401610d4b565b600d819055600e54600c546110e891906110e2908461279b565b6005546001600160a01b031633146121855760405162461bcd60e51b815260206004820181905260248201526000805160206142008339815191526044820152606401610d4b565b600b55565b600854604080517fbe10b61400000000000000000000000000000000000000000000000000000000815290516000926001600160a01b03169163be10b614916004808301926020929190829003018186803b158015610eec57600080fd5b6005546001600160a01b031633146122305760405162461bcd60e51b815260206004820181905260248201526000805160206142008339815191526044820152606401610d4b565b6001600160a01b03821660009081526015602052604090205460ff16151581151514156122c55760405162461bcd60e51b815260206004820152603560248201527f42414259544f4b454e3a204163636f756e7420697320616c726561647920746860448201527f652076616c7565206f6620276578636c756465642700000000000000000000006064820152608401610d4b565b6001600160a01b038216600081815260156020908152604091829020805460ff191685151590811790915591519182527f9d8f7706ea1113d1a167b526eca956215946dd36cc7df39eb16180222d8b5df7910160405180910390a25050565b6005546001600160a01b0316331461236c5760405162461bcd60e51b815260206004820181905260248201526000805160206142008339815191526044820152606401610d4b565b60005b828110156123eb57816015600086868581811061239c57634e487b7160e01b600052603260045260246000fd5b90506020020160208101906123b19190613d2b565b6001600160a01b031681526020810191909152604001600020805460ff1916911515919091179055806123e3816141b6565b91505061236f565b507f7fdaf542373fa84f4ee8d662c642f44e4c2276a217d7d29e548b6eb29a233b3583838360405161241f93929190613fb8565b60405180910390a1505050565b6008546040517fc705c5690000000000000000000000000000000000000000000000000000000081526001600160a01b038381166004830152600092169063c705c5699060240160206040518083038186803b15801561248b57600080fd5b505afa15801561249f573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906115ce9190613f1d565b6005546001600160a01b0316331461250b5760405162461bcd60e51b815260206004820181905260248201526000805160206142008339815191526044820152606401610d4b565b6001600160a01b03919091166000908152601860205260409020805460ff1916911515919091179055565b600854604080517fe7841ec000000000000000000000000000000000000000000000000000000000815290516000926001600160a01b03169163e7841ec0916004808301926020929190829003018186803b158015610eec57600080fd5b6005546001600160a01b031633146125dc5760405162461bcd60e51b815260206004820181905260248201526000805160206142008339815191526044820152606401610d4b565b6008546040517fe98030c7000000000000000000000000000000000000000000000000000000008152600481018390526001600160a01b039091169063e98030c790602401610d9a565b6008546040517f5183d6fd0000000000000000000000000000000000000000000000000000000081526004810183905260009182918291829182918291829182916001600160a01b0390911690635183d6fd9060240161206f565b6005546001600160a01b031633146126c95760405162461bcd60e51b815260206004820181905260248201526000805160206142008339815191526044820152606401610d4b565b6001600160a01b0381166127455760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201527f64647265737300000000000000000000000000000000000000000000000000006064820152608401610d4b565b61107c81613054565b6005546001600160a01b031633146127965760405162461bcd60e51b815260206004820181905260248201526000805160206142008339815191526044820152606401610d4b565b601955565b60006127a782846140d4565b9392505050565b60006127a7828461410c565b60006127a782846140ec565b60006040517f3d602d80600a3d3981f3363d3d373d3d3d363d7300000000000000000000000081528260601b60148201527f5af43d82803e903d91602b57fd5bf3000000000000000000000000000000000060288201526037816000f09150506001600160a01b03811661287c5760405162461bcd60e51b815260206004820152601660248201527f455243313136373a20637265617465206661696c6564000000000000000000006044820152606401610d4b565b919050565b6001600160a01b0383166128fc5760405162461bcd60e51b8152602060048201526024808201527f45524332303a20617070726f76652066726f6d20746865207a65726f2061646460448201527f72657373000000000000000000000000000000000000000000000000000000006064820152608401610d4b565b6001600160a01b0382166129785760405162461bcd60e51b815260206004820152602260248201527f45524332303a20617070726f766520746f20746865207a65726f20616464726560448201527f73730000000000000000000000000000000000000000000000000000000000006064820152608401610d4b565b6001600160a01b0383811660008181526001602090815260408083209487168084529482529182902085905590518481527f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925910160405180910390a3505050565b6001600160a01b038316612a3d5760405162461bcd60e51b815260206004820152602560248201527f45524332303a207472616e736665722066726f6d20746865207a65726f206164604482015264647265737360d81b6064820152608401610d4b565b6001600160a01b038216612a9f5760405162461bcd60e51b815260206004820152602360248201527f45524332303a207472616e7366657220746f20746865207a65726f206164647260448201526265737360e81b6064820152608401610d4b565b80612ab557612ab08383600061322a565b505050565b30600090815260208190526040902054600754600160a01b900460ff16158015612af857506001600160a01b03841660009081526016602052604090205460ff16155b8015612b1257506005546001600160a01b03858116911614155b8015612b2c57506005546001600160a01b03848116911614155b8015612b5c57506007546001600160a01b0385811691161480612b5c57506007546001600160a01b038481169116145b8015612b8157506001600160a01b03841660009081526015602052604090205460ff16155b8015612ba657506001600160a01b03831660009081526015602052604090205460ff16155b15612c33576007805460ff60a01b1916600160a01b179055600f54600e54600091612bd6916120129085906127ae565b9050612be181613408565b6000612bfe600f54612012600d54866127ae90919063ffffffff16565b9050612c098161359b565b30600090815260208190526040902054612c2281613622565b50506007805460ff60a01b19169055505b6007546001600160a01b03851660009081526015602052604090205460ff600160a01b909204821615911680612c8157506001600160a01b03841660009081526015602052604090205460ff165b80612cb357506007546001600160a01b03868116911614801590612cb357506007546001600160a01b03858116911614155b15612cbc575060005b8015612da1576000612cde6064612012600f54876127ae90919063ffffffff16565b6001600160a01b03861660009081526016602052604090205490915060ff1615612d1f57612d1260646120128660016127ae565b612d1c90826140d4565b90505b6000612d3b6064612012601054886127ae90919063ffffffff16565b9050612d4a8761dead8361322a565b6000612d666064612012601154896127ae90919063ffffffff16565b9050612d738888836137eb565b612d918830612d8c84612d86888861390e565b9061390e565b61322a565b612d9b868461390e565b95505050505b6001600160a01b038416600090815260208190526040812054158015612ddf57506001600160a01b0385811660009081526012602052604090205416155b8015612df957506007546001600160a01b03878116911614155b90508015612e30576001600160a01b03858116600090815260126020526040902080546001600160a01b0319169188169190911790555b612e3b86868661322a565b6008546001600160a01b031663e30443bc87612e6c816001600160a01b031660009081526020819052604090205490565b6040516001600160e01b031960e085901b1681526001600160a01b0390921660048301526024820152604401600060405180830381600087803b158015612eb257600080fd5b505af1925050508015612ec3575060015b506008546001600160a01b031663e30443bc86612ef5816001600160a01b031660009081526020819052604090205490565b6040516001600160e01b031960e085901b1681526001600160a01b0390921660048301526024820152604401600060405180830381600087803b158015612f3b57600080fd5b505af1925050508015612f4c575060015b50600754600160a01b900460ff1661304c576014546008546040517fffb2c479000000000000000000000000000000000000000000000000000000008152600481018390526001600160a01b039091169063ffb2c47990602401606060405180830381600087803b158015612fc057600080fd5b505af1925050508015612ff0575060408051601f3d908101601f19168201909252612fed91810190613f8b565b60015b612ff95761304a565b60408051848152602081018490529081018290526060810185905232906001907fc864333d6121033635ab41b29ae52f10a22cf4438c3e4f1c4c68518feb2f8a989060800160405180910390a35050505b505b505050505050565b600580546001600160a01b038381166001600160a01b0319831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a35050565b6001600160a01b03821660009081526016602052604090205460ff16151581151514156131615760405162461bcd60e51b815260206004820152604360248201527f42414259544f4b454e3a204175746f6d61746564206d61726b6574206d616b6560448201527f72207061697220697320616c72656164792073657420746f207468617420766160648201527f6c75650000000000000000000000000000000000000000000000000000000000608482015260a401610d4b565b6001600160a01b0382166000908152601660205260409020805460ff191682158015919091179091556131ee5760085460405163031e79db60e41b81526001600160a01b038481166004830152909116906331e79db090602401600060405180830381600087803b1580156131d557600080fd5b505af11580156131e9573d6000803e3d6000fd5b505050505b604051811515906001600160a01b038416907fffa9187bf1f18bf477bd0ea1bcbb64e93b6a98132473929edfce215cd9b16fab90600090a35050565b6001600160a01b03831661328e5760405162461bcd60e51b815260206004820152602560248201527f45524332303a207472616e736665722066726f6d20746865207a65726f206164604482015264647265737360d81b6064820152608401610d4b565b6001600160a01b0382166132f05760405162461bcd60e51b815260206004820152602360248201527f45524332303a207472616e7366657220746f20746865207a65726f206164647260448201526265737360e81b6064820152608401610d4b565b6001600160a01b0383166000908152602081905260409020548181101561337f5760405162461bcd60e51b815260206004820152602660248201527f45524332303a207472616e7366657220616d6f756e742065786365656473206260448201527f616c616e636500000000000000000000000000000000000000000000000000006064820152608401610d4b565b6001600160a01b038085166000908152602081905260408082208585039055918516815290812080548492906133b69084906140d4565b92505081905550826001600160a01b0316846001600160a01b03167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef846040516117c091815260200190565b50505050565b6009546040516370a0823160e01b81523060048201526000916001600160a01b0316906370a082319060240160206040518083038186803b15801561344c57600080fd5b505afa158015613460573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906134849190613f73565b905061348f8261391a565b6009546040516370a0823160e01b81523060048201526000916135119184916001600160a01b0316906370a082319060240160206040518083038186803b1580156134d957600080fd5b505afa1580156134ed573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612d869190613f73565b60095460135460405163a9059cbb60e01b81526001600160a01b03918216600482015260248101849052929350169063a9059cbb90604401602060405180830381600087803b15801561356357600080fd5b505af1158015613577573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906134029190613f1d565b60006135a88260026127ba565b905060006135b6838361390e565b9050476135c283613af1565b60006135ce478361390e565b90506135da8382613c59565b60408051858152602081018390529081018490527f17bbfb9a6069321b6ded73bd96327c9e6b7212a5cd51ff219cd61370acafb5619060600160405180910390a15050505050565b61362b8161391a565b6009546040516370a0823160e01b81523060048201526000916001600160a01b0316906370a082319060240160206040518083038186803b15801561366f57600080fd5b505afa158015613683573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906136a79190613f73565b60095460085460405163a9059cbb60e01b81526001600160a01b0391821660048201526024810184905292935060009291169063a9059cbb90604401602060405180830381600087803b1580156136fd57600080fd5b505af1158015613711573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906137359190613f1d565b90508015612ab0576008546040517fba72a955000000000000000000000000000000000000000000000000000000008152600481018490526001600160a01b039091169063ba72a95590602401600060405180830381600087803b15801561379c57600080fd5b505af11580156137b0573d6000803e3d6000fd5b505060408051868152602081018690527f80195cc573b02cc48460cbca6e6e4cc85ddb91959d946e1c3025ea3d87942dc3935001905061241f565b6011546137f757505050565b6007546000906001600160a01b038581169116141561381757508161383f565b6007546001600160a01b038481169116141561383457508261383f565b61340284308461322a565b60008061385860646011546127ae90919063ffffffff16565b905060005b60088112156138f1576000816138755750609661388a565b81600114156138865750605a61388a565b50600a5b6001600160a01b0394851660009081526012602052604090205490941693846138b357506138f1565b6138bd848261279b565b935060006138cf8261200c89876127ba565b90506138dc89878361322a565b505080806138e99061417d565b91505061385d565b5061304c8630612d8c613904858761390e565b61200c89876127ba565b60006127a7828461412b565b6040805160038082526080820190925260009160208201606080368337019050509050308160008151811061395f57634e487b7160e01b600052603260045260246000fd5b6001600160a01b03928316602091820292909201810191909152600654604080516315ab88c960e31b81529051919093169263ad5c4648926004808301939192829003018186803b1580156139b357600080fd5b505afa1580156139c7573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906139eb9190613d47565b81600181518110613a0c57634e487b7160e01b600052603260045260246000fd5b6001600160a01b039283166020918202929092010152600954825191169082906002908110613a4b57634e487b7160e01b600052603260045260246000fd5b6001600160a01b039283166020918202929092010152600654613a719130911684612881565b6006546040517f5c11d7950000000000000000000000000000000000000000000000000000000081526001600160a01b0390911690635c11d79590613ac3908590600090869030904290600401614064565b600060405180830381600087803b158015613add57600080fd5b505af115801561304c573d6000803e3d6000fd5b6040805160028082526060820183526000926020830190803683370190505090503081600081518110613b3457634e487b7160e01b600052603260045260246000fd5b6001600160a01b03928316602091820292909201810191909152600654604080516315ab88c960e31b81529051919093169263ad5c4648926004808301939192829003018186803b158015613b8857600080fd5b505afa158015613b9c573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190613bc09190613d47565b81600181518110613be157634e487b7160e01b600052603260045260246000fd5b6001600160a01b039283166020918202929092010152600654613c079130911684612881565b6006546040517f791ac9470000000000000000000000000000000000000000000000000000000081526001600160a01b039091169063791ac94790613ac3908590600090869030904290600401614064565b600654613c719030906001600160a01b031684612881565b6006546040517ff305d719000000000000000000000000000000000000000000000000000000008152306004820152602481018490526000604482018190526064820181905260848201524260a48201526001600160a01b039091169063f305d71990839060c4016060604051808303818588803b158015613cf257600080fd5b505af1158015613d06573d6000803e3d6000fd5b50505050506040513d601f19601f82011682018060405250810190610dc89190613f8b565b600060208284031215613d3c578081fd5b81356127a7816141dc565b600060208284031215613d58578081fd5b81516127a7816141dc565b60008060408385031215613d75578081fd5b8235613d80816141dc565b91506020830135613d90816141dc565b809150509250929050565b600080600060608486031215613daf578081fd5b8335613dba816141dc565b92506020840135613dca816141dc565b929592945050506040919091013590565b60008060408385031215613ded578182fd5b8235613df8816141dc565b91506020830135613d90816141f1565b600080600080600080600080610100898b031215613e24578384fd5b8851613e2f816141dc565b809850506020890151965060408901519550606089015194506080890151935060a0890151925060c0890151915060e089015190509295985092959890939650565b60008060408385031215613e83578182fd5b8235613e8e816141dc565b946020939093013593505050565b600080600060408486031215613eb0578283fd5b833567ffffffffffffffff80821115613ec7578485fd5b818601915086601f830112613eda578485fd5b813581811115613ee8578586fd5b8760208260051b8501011115613efc578586fd5b60209283019550935050840135613f12816141f1565b809150509250925092565b600060208284031215613f2e578081fd5b81516127a7816141f1565b600060208284031215613f4a578081fd5b813561ffff811681146127a7578182fd5b600060208284031215613f6c578081fd5b5035919050565b600060208284031215613f84578081fd5b5051919050565b600080600060608486031215613f9f578081fd5b8351925060208401519150604084015190509250925092565b6040808252810183905260008460608301825b86811015613ffb578235613fde816141dc565b6001600160a01b0316825260209283019290910190600101613fcb565b5080925050508215156020830152949350505050565b6000602080835283518082850152825b8181101561403d57858101830151858201604001528201614021565b8181111561404e5783604083870101525b50601f01601f1916929092016040019392505050565b600060a082018783526020878185015260a0604085015281875180845260c0860191508289019350845b818110156140b35784516001600160a01b03168352938301939183019160010161408e565b50506001600160a01b03969096166060850152505050608001529392505050565b600082198211156140e7576140e76141c6565b500190565b60008261410757634e487b7160e01b81526012600452602481fd5b500490565b6000816000190483118215151615614126576141266141c6565b500290565b60008282101561413d5761413d6141c6565b500390565b600181811c9082168061415657607f821691505b6020821081141561417757634e487b7160e01b600052602260045260246000fd5b50919050565b60007f7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8214156141af576141af6141c6565b5060010190565b60006000198214156141af576141af5b634e487b7160e01b600052601160045260246000fd5b6001600160a01b038116811461107c57600080fd5b801515811461107c57600080fdfe4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572a2646970667358221220d0bf67fc50171ea30fb019ad0318803cdd9fba723357b89fedd1ce6921f1b94a64736f6c63430008040033

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

00000000000000000000000000000000000000000000000000000000000001c0000000000000000000000000000000000000000000000000000000000000020000000000000000000000000000000000000000000000000000000002540be4000000000000000000000000002170ed0880ac9a755fd29b2688956bd959f933f800000000000000000000000010ed43c718714eb63d5aa57b78b54704e256024e0000000000000000000000005d4f0811198e1a33116532c9b944ea11fe2a731a0000000000000000000000001efd53964fc6bdc0604b7f08ca6681fe57bdcdb80000000000000000000000002170ed0880ac9a755fd29b2688956bd959f933f800000000000000000000000000000000000000000000000000000000000000060000000000000000000000000000000000000000000000000000000000000003000000000000000000000000000000000000000000000000000000000000000200000000000000000000000000000000000000000000000000000002540be400000000000000000000000000ee6bd41f4b61350e70a18b5ce394aaebacba65b0000000000000000000000000000000000000000000000000000000000000000100000000000000000000000000000000000000000000000000000000000000056574686d6e00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000056574686d6e000000000000000000000000000000000000000000000000000000

-----Decoded View---------------
Arg [0] : name_ (string): ethmn
Arg [1] : symbol_ (string): ethmn
Arg [2] : totalSupply_ (uint256): 10000000000
Arg [3] : addrs (address[5]): 0x2170Ed0880ac9A755fd29B2688956BD959F933F8,0x10ED43C718714eb63d5aA57B78B54704E256024E,0x5D4f0811198e1A33116532c9B944EA11FE2A731A,0x1eFd53964fC6bdc0604b7f08ca6681Fe57BdCDB8,0x2170Ed0880ac9A755fd29B2688956BD959F933F8
Arg [4] : feeSettings (uint256[3]): 6,3,2
Arg [5] : minimumTokenBalanceForDividends_ (uint256): 10000000000
Arg [6] : serviceFeeReceiver_ (address): 0xEe6bd41f4B61350e70a18B5CE394AaeBacbA65b0
Arg [7] : serviceFee_ (uint256): 1

-----Encoded View---------------
18 Constructor Arguments found :
Arg [0] : 00000000000000000000000000000000000000000000000000000000000001c0
Arg [1] : 0000000000000000000000000000000000000000000000000000000000000200
Arg [2] : 00000000000000000000000000000000000000000000000000000002540be400
Arg [3] : 0000000000000000000000002170ed0880ac9a755fd29b2688956bd959f933f8
Arg [4] : 00000000000000000000000010ed43c718714eb63d5aa57b78b54704e256024e
Arg [5] : 0000000000000000000000005d4f0811198e1a33116532c9b944ea11fe2a731a
Arg [6] : 0000000000000000000000001efd53964fc6bdc0604b7f08ca6681fe57bdcdb8
Arg [7] : 0000000000000000000000002170ed0880ac9a755fd29b2688956bd959f933f8
Arg [8] : 0000000000000000000000000000000000000000000000000000000000000006
Arg [9] : 0000000000000000000000000000000000000000000000000000000000000003
Arg [10] : 0000000000000000000000000000000000000000000000000000000000000002
Arg [11] : 00000000000000000000000000000000000000000000000000000002540be400
Arg [12] : 000000000000000000000000ee6bd41f4b61350e70a18b5ce394aaebacba65b0
Arg [13] : 0000000000000000000000000000000000000000000000000000000000000001
Arg [14] : 0000000000000000000000000000000000000000000000000000000000000005
Arg [15] : 6574686d6e000000000000000000000000000000000000000000000000000000
Arg [16] : 0000000000000000000000000000000000000000000000000000000000000005
Arg [17] : 6574686d6e000000000000000000000000000000000000000000000000000000


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.