ETH Price: $1,981.27 (+6.21%)
 

Overview

Max Total Supply

1,000,000,000 RITUAL

Holders

29

Transfers

-
0

Market

Onchain Market Cap

-

Circulating Supply Market Cap

-

Other Info

Token Contract (WITH 18 Decimals)

Loading...
Loading
Loading...
Loading
Loading...
Loading

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

Contract Source Code Verified (Exact Match)

Contract Name:
CultsCultToken

Compiler Version
v0.8.29+commit.ab55807c

Optimization Enabled:
Yes with 200 runs

Other Settings:
default evmVersion
File 1 of 1 : ritual.sol
//
//      ___                                   ___           ___                   
//     /  /\        ___           ___        /__/\         /  /\                  
//    /  /::\      /  /\         /  /\       \  \:\       /  /::\                 
//   /  /:/\:\    /  /:/        /  /:/        \  \:\     /  /:/\:\    ___     ___ 
//  /  /:/~/:/   /__/::\       /  /:/     ___  \  \:\   /  /:/~/::\  /__/\   /  /\
// /__/:/ /:/___ \__\/\:\__   /  /::\    /__/\  \__\:\ /__/:/ /:/\:\ \  \:\ /  /:/
// \  \:\/:::::/    \  \:\/\ /__/:/\:\   \  \:\ /  /:/ \  \:\/:/__\/  \  \:\  /:/ 
//  \  \::/~~~~      \__\::/ \__\/  \:\   \  \:\  /:/   \  \::/        \  \:\/:/  
//   \  \:\          /__/:/       \  \:\   \  \:\/:/     \  \:\         \  \::/   
//    \  \:\         \__\/         \__\/    \  \::/       \  \:\         \__\/    
//     \__\/                                 \__\/         \__\/                  
//
// Twitter: @THECULTSRITUAL
// Website: thecult.app
// Telegram: t.me/thecultsritual
// CHOOSE YOUR CULT COIN REFLECTIONS 5% /BUY AND SELL
//                                                                         


// Sources flattened with hardhat v2.22.19 https://hardhat.org

// SPDX-License-Identifier: MIT

// File @openzeppelin/contracts/utils/Context.sol@v4.9.6

// Original license: SPDX_License_Identifier: MIT
// OpenZeppelin Contracts (last updated v4.9.4) (utils/Context.sol)

pragma solidity ^0.8.0;

/**
 * @dev Provides information about the current execution context, including the
 * sender of the transaction and its data. While these are generally available
 * via msg.sender and msg.data, they should not be accessed in such a direct
 * manner, since when dealing with meta-transactions the account sending and
 * paying for execution may not be the actual sender (as far as an application
 * is concerned).
 *
 * This contract is only required for intermediate, library-like contracts.
 */
abstract contract Context {
    function _msgSender() internal view virtual returns (address) {
        return msg.sender;
    }

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

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


// File @openzeppelin/contracts/access/Ownable.sol@v4.9.6

// Original license: SPDX_License_Identifier: MIT
// OpenZeppelin Contracts (last updated v4.9.0) (access/Ownable.sol)

pragma solidity ^0.8.0;

/**
 * @dev Contract module which provides a basic access control mechanism, where
 * there is an account (an owner) that can be granted exclusive access to
 * specific functions.
 *
 * By default, the owner account will be the one that deploys the contract. This
 * can later be changed with {transferOwnership}.
 *
 * This module is used through inheritance. It will make available the modifier
 * `onlyOwner`, which can be applied to your functions to restrict their use to
 * the owner.
 */
abstract contract Ownable is Context {
    address private _owner;

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

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

    /**
     * @dev Throws if called by any account other than the owner.
     */
    modifier onlyOwner() {
        _checkOwner();
        _;
    }

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

    /**
     * @dev Throws if the sender is not the owner.
     */
    function _checkOwner() internal view virtual {
        require(owner() == _msgSender(), "Ownable: caller is not the owner");
    }

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

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

    /**
     * @dev Transfers ownership of the contract to a new account (`newOwner`).
     * Internal function without access restriction.
     */
    function _transferOwnership(address newOwner) internal virtual {
        address oldOwner = _owner;
        _owner = newOwner;
        emit OwnershipTransferred(oldOwner, newOwner);
    }
}


// File @openzeppelin/contracts/token/ERC20/IERC20.sol@v4.9.6

// Original license: SPDX_License_Identifier: MIT
// OpenZeppelin Contracts (last updated v4.9.0) (token/ERC20/IERC20.sol)

pragma solidity ^0.8.0;

/**
 * @dev Interface of the ERC20 standard as defined in the EIP.
 */
interface IERC20 {
    /**
     * @dev Emitted when `value` tokens are moved from one account (`from`) to
     * another (`to`).
     *
     * Note that `value` may be zero.
     */
    event Transfer(address indexed from, address indexed to, uint256 value);

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

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

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

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

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

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

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


// File @openzeppelin/contracts/token/ERC20/extensions/IERC20Metadata.sol@v4.9.6

// Original license: SPDX_License_Identifier: MIT
// OpenZeppelin Contracts v4.4.1 (token/ERC20/extensions/IERC20Metadata.sol)

pragma solidity ^0.8.0;

/**
 * @dev Interface for the optional metadata functions from the ERC20 standard.
 *
 * _Available since v4.1._
 */
interface IERC20Metadata is IERC20 {
    /**
     * @dev Returns the name of the token.
     */
    function name() external view returns (string memory);

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

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


// File @openzeppelin/contracts/token/ERC20/ERC20.sol@v4.9.6

// Original license: SPDX_License_Identifier: MIT
// OpenZeppelin Contracts (last updated v4.9.0) (token/ERC20/ERC20.sol)

pragma solidity ^0.8.0;



/**
 * @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.openzeppelin.com/t/how-to-implement-erc20-supply-mechanisms/226[How
 * to implement supply mechanisms].
 *
 * The default value of {decimals} is 18. To change this, you should override
 * this function so it returns a different value.
 *
 * We have followed general OpenZeppelin Contracts guidelines: functions revert
 * instead returning `false` on failure. This behavior is nonetheless
 * conventional and does not conflict with the expectations of ERC20
 * applications.
 *
 * Additionally, an {Approval} event is emitted on calls to {transferFrom}.
 * This allows applications to reconstruct the allowance for all accounts just
 * by listening to said events. Other implementations of the EIP may not emit
 * these events, as it isn't required by the specification.
 *
 * Finally, the non-standard {decreaseAllowance} and {increaseAllowance}
 * functions have been added to mitigate the well-known issues around setting
 * allowances. See {IERC20-approve}.
 */
contract ERC20 is Context, IERC20, IERC20Metadata {
    mapping(address => uint256) private _balances;

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

    uint256 private _totalSupply;

    string private _name;
    string private _symbol;

    /**
     * @dev Sets the values for {name} and {symbol}.
     *
     * 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 default value returned by this function, unless
     * it's overridden.
     *
     * NOTE: This information is only used for _display_ purposes: it in
     * no way affects any of the arithmetic of the contract, including
     * {IERC20-balanceOf} and {IERC20-transfer}.
     */
    function decimals() public view virtual override returns (uint8) {
        return 18;
    }

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

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

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

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

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

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

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

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

        return true;
    }

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

        _beforeTokenTransfer(from, to, amount);

        uint256 fromBalance = _balances[from];
        require(fromBalance >= amount, "ERC20: transfer amount exceeds balance");
        unchecked {
            _balances[from] = fromBalance - amount;
            // Overflow not possible: the sum of all balances is capped by totalSupply, and the sum is preserved by
            // decrementing then incrementing.
            _balances[to] += amount;
        }

        emit Transfer(from, to, amount);

        _afterTokenTransfer(from, to, amount);
    }

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

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

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

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

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

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

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

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

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

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

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

    /**
     * @dev Updates `owner` s allowance for `spender` based on spent `amount`.
     *
     * Does not update the allowance amount in case of infinite allowance.
     * Revert if not enough allowance is available.
     *
     * Might emit an {Approval} event.
     */
    function _spendAllowance(address owner, address spender, uint256 amount) internal virtual {
        uint256 currentAllowance = allowance(owner, spender);
        if (currentAllowance != type(uint256).max) {
            require(currentAllowance >= amount, "ERC20: insufficient allowance");
            unchecked {
                _approve(owner, spender, currentAllowance - amount);
            }
        }
    }

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

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


// File @openzeppelin/contracts/security/ReentrancyGuard.sol@v4.9.6

// Original license: SPDX_License_Identifier: MIT
// OpenZeppelin Contracts (last updated v4.9.0) (security/ReentrancyGuard.sol)

pragma solidity ^0.8.0;

/**
 * @dev Contract module that helps prevent reentrant calls to a function.
 *
 * Inheriting from `ReentrancyGuard` will make the {nonReentrant} modifier
 * available, which can be applied to functions to make sure there are no nested
 * (reentrant) calls to them.
 *
 * Note that because there is a single `nonReentrant` guard, functions marked as
 * `nonReentrant` may not call one another. This can be worked around by making
 * those functions `private`, and then adding `external` `nonReentrant` entry
 * points to them.
 *
 * TIP: If you would like to learn more about reentrancy and alternative ways
 * to protect against it, check out our blog post
 * https://blog.openzeppelin.com/reentrancy-after-istanbul/[Reentrancy After Istanbul].
 */
abstract contract ReentrancyGuard {
    // Booleans are more expensive than uint256 or any type that takes up a full
    // word because each write operation emits an extra SLOAD to first read the
    // slot's contents, replace the bits taken up by the boolean, and then write
    // back. This is the compiler's defense against contract upgrades and
    // pointer aliasing, and it cannot be disabled.

    // The values being non-zero value makes deployment a bit more expensive,
    // but in exchange the refund on every call to nonReentrant will be lower in
    // amount. Since refunds are capped to a percentage of the total
    // transaction's gas, it is best to keep them low in cases like this one, to
    // increase the likelihood of the full refund coming into effect.
    uint256 private constant _NOT_ENTERED = 1;
    uint256 private constant _ENTERED = 2;

    uint256 private _status;

    constructor() {
        _status = _NOT_ENTERED;
    }

    /**
     * @dev Prevents a contract from calling itself, directly or indirectly.
     * Calling a `nonReentrant` function from another `nonReentrant`
     * function is not supported. It is possible to prevent this from happening
     * by making the `nonReentrant` function external, and making it call a
     * `private` function that does the actual work.
     */
    modifier nonReentrant() {
        _nonReentrantBefore();
        _;
        _nonReentrantAfter();
    }

    function _nonReentrantBefore() private {
        // On the first call to nonReentrant, _status will be _NOT_ENTERED
        require(_status != _ENTERED, "ReentrancyGuard: reentrant call");

        // Any calls to nonReentrant after this point will fail
        _status = _ENTERED;
    }

    function _nonReentrantAfter() private {
        // By storing the original value once again, a refund is triggered (see
        // https://eips.ethereum.org/EIPS/eip-2200)
        _status = _NOT_ENTERED;
    }

    /**
     * @dev Returns true if the reentrancy guard is currently set to "entered", which indicates there is a
     * `nonReentrant` function in the call stack.
     */
    function _reentrancyGuardEntered() internal view returns (bool) {
        return _status == _ENTERED;
    }
}

// Original license: SPDX_License_Identifier: MIT
pragma solidity ^0.8.9;
// Interface for reflection tokens
interface IReflectionToken is IERC20 {
    function transfer(address to, uint256 amount) external returns (bool);
}

// Minimal Uniswap interfaces
interface IUniswapV2Router {
    function factory() external pure returns (address);
    function WETH() external pure returns (address);
    
    function addLiquidityETH(
        address token,
        uint amountTokenDesired,
        uint amountTokenMin,
        uint amountETHMin,
        address to,
        uint deadline
    ) external payable returns (uint amountToken, uint amountETH, uint liquidity);
    
    function swapExactTokensForETH(
        uint amountIn,
        uint amountOutMin,
        address[] calldata path,
        address to,
        uint deadline
    ) external returns (uint[] memory amounts);
    
    function swapExactETHForTokens(
        uint amountOutMin,
        address[] calldata path,
        address to,
        uint deadline
    ) external payable returns (uint[] memory amounts);
    
    function swapExactTokensForETHSupportingFeeOnTransferTokens(
        uint amountIn,
        uint amountOutMin,
        address[] calldata path,
        address to,
        uint deadline
    ) external;
}

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

interface IUniswapV2Pair {
    function sync() external;
}

contract CultsCultToken is ERC20, Ownable, ReentrancyGuard {
    // Token details
    string private constant _NAME = "THE CULTS CULT";
    string private constant _SYMBOL = "RITUAL";
    uint256 private constant _TOTAL_SUPPLY = 1_000_000_000 * 10**18; // 1 billion tokens
    uint256 private constant _TRANSACTION_FEE_PERCENT = 5; // 5% fee in ETH
    uint256 private constant _DEVELOPER_SHARE = 1; // 1% of total supply
    
    // Reflection token addresses - updated to be set in constructor
    address public immutable MILADY_CULT_COIN;
    address public immutable SPX6900;
    address public immutable MOG_COIN;
    
    // Uniswap interfaces
    IUniswapV2Router public immutable uniswapRouter;
    IUniswapV2Factory public immutable uniswapFactory;
    address private immutable WETH;
    
    // User preferences for reflection token
    mapping(address => address) public reflectionPreference;
    
    // ETH balances accumulated for buying reflection tokens
    uint256 public ethForReflections;
    
    // Reflection token balances for distribution
    mapping(address => uint256) public reflectionBalances;
    
    // Last claim timestamp per user
    mapping(address => uint256) public lastClaimTime;
    
    // Minimum time between claims (24 hours)
    uint256 public constant CLAIM_COOLDOWN = 24 hours;
    
    // Track holders
    address[] public holders;
    mapping(address => bool) public isHolder;
    uint256 public totalHolders;
    
    // Track recent transactions
    struct Transaction {
        address user;
        bool isBuy;
        uint256 amount;
        uint256 timestamp;
    }
    Transaction[] public recentTransactions;
    uint256 public constant MAX_RECENT_TRANSACTIONS = 50;

    // Tax and swap related variables
    uint8 public buyFeePercent = 5;
    uint8 public sellFeePercent = 5;
    bool public feesEnabled = false;
    bool public swapEnabled = false;
    uint256 public minTokensBeforeSwap = 100 * 10**18;
    address public uniswapPair;
    
    // Addresses excluded from fees
    mapping(address => bool) public isExcludedFromFees;
    
    // Prevent reentrancy in swaps
    bool private inSwap;
    modifier lockTheSwap {
        inSwap = true;
        _;
        inSwap = false;
    }

    // Events
    event ReflectionPreferenceSet(address indexed user, address reflectionToken);
    event ReflectionClaimed(address indexed user, address indexed token, uint256 amount);
    event EthCollected(uint256 amount);
    event ReflectionTokensPurchased(address indexed token, uint256 ethSpent, uint256 tokensReceived);
    event HolderAdded(address indexed holder);
    event HolderRemoved(address indexed holder);
    event TransactionRecorded(address indexed user, bool isBuy, uint256 amount, uint256 timestamp);
    event SwapTokensForETH(uint256 tokenAmount, uint256 ethReceived);
    event FeesEnabledUpdated(bool enabled);
    event SwapEnabledUpdated(bool enabled);
    event MinTokensBeforeSwapUpdated(uint256 amount);

    // Receive function to accept ETH
    receive() external payable {
        ethForReflections += msg.value;
        emit EthCollected(msg.value);
    }

    constructor(
        address deployer, 
        address _uniswapRouter,
        address _miladyCultCoin,
        address _spx6900,
        address _mogCoin,
        address _uniswapFactory
    ) ERC20(_NAME, _SYMBOL) {
        require(deployer != address(0), "Invalid deployer address");
        require(_uniswapRouter != address(0), "Invalid router address");
        require(_miladyCultCoin != address(0), "Invalid MILADY_CULT_COIN address");
        require(_spx6900 != address(0), "Invalid SPX6900 address");
        require(_mogCoin != address(0), "Invalid MOG_COIN address");
        require(_uniswapFactory != address(0), "Invalid factory address");
        
        // Set reflection token addresses
        MILADY_CULT_COIN = _miladyCultCoin;
        SPX6900 = _spx6900;
        MOG_COIN = _mogCoin;
        
        // Set up Uniswap
        uniswapRouter = IUniswapV2Router(_uniswapRouter);
        uniswapFactory = IUniswapV2Factory(_uniswapFactory);
        WETH = uniswapRouter.WETH();
        
        // Mint initial supply
        _mint(address(this), _TOTAL_SUPPLY);
        
        // Transfer 1% to deployer
        uint256 developerAmount = (_TOTAL_SUPPLY * _DEVELOPER_SHARE) / 100;
        _transfer(address(this), deployer, developerAmount);
        
        // Exclude owner and this contract from fees
        isExcludedFromFees[owner()] = true;
        isExcludedFromFees[address(this)] = true;
    }
    
    // Override transfer function to apply fees
    function _transfer(
        address from,
        address to,
        uint256 amount
    ) internal override {
        require(from != address(0), "ERC20: transfer from the zero address");
        require(to != address(0), "ERC20: transfer to the zero address");
        require(amount > 0, "Transfer amount must be greater than zero");
        
        // Check if we need to swap tokens for ETH before the transfer
        bool canSwap = 
            !inSwap && 
            swapEnabled && 
            feesEnabled && 
            balanceOf(address(this)) >= minTokensBeforeSwap &&
            from != uniswapPair && 
            to != uniswapPair;
            
        if (canSwap) {
            swapTokensForEth(minTokensBeforeSwap);
        }
        
        // Check if fee should be applied
        bool takeFee = feesEnabled && !isExcludedFromFees[from] && !isExcludedFromFees[to];
        
        // If taking fee, calculate it
        if (takeFee) {
            uint256 feeAmount = 0;
            
            // Apply buy fee when buying from uniswap pair
            if (from == uniswapPair) {
                feeAmount = amount * buyFeePercent / 100;
            } 
            // Apply sell fee when selling to uniswap pair
            else if (to == uniswapPair) {
                feeAmount = amount * sellFeePercent / 100;
            }
            
            if (feeAmount > 0) {
                // Transfer fee to contract for later swap
                super._transfer(from, address(this), feeAmount);
                amount -= feeAmount;
            }
        }
        
        // Transfer remaining amount
        super._transfer(from, to, amount);
        
        // Update holders tracking
        _updateHolders(from);
        _updateHolders(to);
    }
    
    // Buy tokens with ETH - collects fee in ETH
    function buyTokens() external payable nonReentrant {
        require(msg.value > 0, "Must send ETH");
        
        // Calculate fee
        uint256 feeAmount = (msg.value * _TRANSACTION_FEE_PERCENT) / 100;
        uint256 remainingEth = msg.value - feeAmount;
        
        // Add fee to reflection ETH balance
        ethForReflections += feeAmount;
        emit EthCollected(feeAmount);
        
        // Calculate tokens to transfer based on a simple price model
        // For this example, we'll use a fixed price of 1 ETH = 1,000,000 tokens
        uint256 tokenAmount = remainingEth * 1_000_000;
        
        // Transfer tokens to buyer
        require(balanceOf(address(this)) >= tokenAmount, "Not enough tokens in contract");
        _transfer(address(this), msg.sender, tokenAmount);
        
        // Record transaction
        _recordTransaction(msg.sender, true, tokenAmount);
    }
    
    // Sell tokens for ETH - collects fee in ETH
    function sellTokens(uint256 tokenAmount) external nonReentrant {
        require(tokenAmount > 0, "Must sell some tokens");
        require(balanceOf(msg.sender) >= tokenAmount, "Not enough tokens");
        
        // Transfer tokens to contract
        _transfer(msg.sender, address(this), tokenAmount);
        
        // Calculate ETH to return based on the same simple price model
        // 1,000,000 tokens = 1 ETH
        uint256 ethAmount = tokenAmount / 1_000_000;
        
        // Calculate fee
        uint256 feeAmount = (ethAmount * _TRANSACTION_FEE_PERCENT) / 100;
        uint256 remainingEth = ethAmount - feeAmount;
        
        // Add fee to reflection ETH balance
        ethForReflections += feeAmount;
        emit EthCollected(feeAmount);
        
        // Transfer ETH to seller
        (bool success, ) = msg.sender.call{value: remainingEth}("");
        require(success, "ETH transfer failed");
        
        // Record transaction
        _recordTransaction(msg.sender, false, tokenAmount);
    }
    
    // Admin function to convert collected ETH to reflection tokens
    function buyReflectionTokens() external onlyOwner {
        uint256 ethAvailable = ethForReflections;
        require(ethAvailable > 0, "No ETH available");
        
        // Split the ETH equally among the three reflection tokens
        uint256 ethPerToken = ethAvailable / 3;
        
        // Reset the ETH balance before making external calls (reentrancy protection)
        ethForReflections = 0;
        
        // Buy each reflection token
        _buyToken(MILADY_CULT_COIN, ethPerToken);
        _buyToken(SPX6900, ethPerToken);
        _buyToken(MOG_COIN, ethPerToken);
    }
    
    // Helper function to buy a specific reflection token using Uniswap
    function _buyToken(address tokenAddress, uint256 ethAmount) private {
        require(tokenAddress != address(0), "Invalid token");
        require(ethAmount > 0, "No ETH to spend");
        
        // Check if there's a valid Uniswap pair
        address pair = uniswapFactory.getPair(WETH, tokenAddress);
        if (pair == address(0)) {
            // If no pair exists, just return the ETH to the pool
            ethForReflections += ethAmount;
            return;
        }
        
        // Set up the swap path
        address[] memory path = new address[](2);
        path[0] = WETH;
        path[1] = tokenAddress;
        
        // Get initial balance to calculate how many tokens we received
        uint256 initialBalance = IERC20(tokenAddress).balanceOf(address(this));
        
        // Execute the swap, accepting any amount out (we're not worried about slippage for now)
        try uniswapRouter.swapExactETHForTokens{value: ethAmount}(
            0, // accept any amount
            path,
            address(this),
            block.timestamp + 15 minutes
        ) returns (uint[] memory /* amounts */) {
            // Calculate how many tokens we received
            uint256 currentBalance = IERC20(tokenAddress).balanceOf(address(this));
            uint256 tokensReceived = currentBalance - initialBalance;
            
            // Add to reflection balance
            reflectionBalances[tokenAddress] += tokensReceived;
            
            emit ReflectionTokensPurchased(tokenAddress, ethAmount, tokensReceived);
        } catch {
            // If the swap fails, return the ETH to the pool
            ethForReflections += ethAmount;
        }
    }
    
    // Set preferred reflection token
    function setReflectionPreference(address tokenAddress) external {
        require(
            tokenAddress == MILADY_CULT_COIN || 
            tokenAddress == SPX6900 || 
            tokenAddress == MOG_COIN,
            "Invalid reflection token"
        );
        
        reflectionPreference[msg.sender] = tokenAddress;
        emit ReflectionPreferenceSet(msg.sender, tokenAddress);
    }
    
    // Get user's preferred reflection token
    function getUserPreferredToken(address user) public view returns (address) {
        address preferred = reflectionPreference[user];
        
        // Default to Milady if not set
        if (preferred == address(0)) {
            return MILADY_CULT_COIN;
        }
        
        return preferred;
    }
    
    // Calculate reflection amount for a user based on their token holdings
    function calculateReflectionAmount(address user, address token) public view returns (uint256) {
        require(balanceOf(user) > 0, "User has no tokens");
        require(token != address(0), "Invalid token address");
        require(
            token == MILADY_CULT_COIN || 
            token == SPX6900 || 
            token == MOG_COIN,
            "Invalid reflection token"
        );
        
        // Get the balance of the token available for reflections
        uint256 availableReflections = reflectionBalances[token];
        if (availableReflections == 0) {
            return 0; // No reflections available for this token
        }
        
        uint256 userBalance = balanceOf(user);
        uint256 totalCirculating = _TOTAL_SUPPLY - balanceOf(address(this));
        
        // Avoid division by zero
        if (totalCirculating == 0) return 0;
        
        // Calculate the user's percentage of the total supply (with 18 decimals of precision)
        uint256 userPercentage = (userBalance * 1e18) / totalCirculating;
        
        // Calculate the reflection amount based on percentage
        uint256 reflectionAmount = (availableReflections * userPercentage) / 1e18;
        
        return reflectionAmount;
    }
    
    // Claim reflection rewards
    function claimReflections() external nonReentrant {
        require(balanceOf(msg.sender) > 0, "No tokens to claim with");
        
        // Check if the user can claim
        // For first-time claimers (lastClaimTime == 0), they can claim immediately
        // For others, enforce the cooldown period
        if (lastClaimTime[msg.sender] > 0) {
            require(block.timestamp >= lastClaimTime[msg.sender] + CLAIM_COOLDOWN, "Claim cooldown active");
        }
        
        address preferredToken = getUserPreferredToken(msg.sender);
        uint256 amount = calculateReflectionAmount(msg.sender, preferredToken);
        
        require(amount > 0, "No reflections to claim");
        
        // Update reflection balance
        reflectionBalances[preferredToken] -= amount;
        
        // Update last claim time
        lastClaimTime[msg.sender] = block.timestamp;
        
        // Transfer the actual reflection token (not RITUAL tokens)
        bool success = IERC20(preferredToken).transfer(msg.sender, amount);
        require(success, "Reflection transfer failed");
        
        emit ReflectionClaimed(msg.sender, preferredToken, amount);
    }
    
    // Emergency function to recover ETH if needed
    function recoverETH(uint256 amount) external onlyOwner {
        require(amount <= address(this).balance, "Not enough ETH");
        
        (bool success, ) = msg.sender.call{value: amount}("");
        require(success, "ETH transfer failed");
    }
    
    // Emergency function to recover tokens if needed
    function recoverTokens(address token, uint256 amount) external onlyOwner {
        require(token != address(this), "Cannot recover RITUAL tokens");
        
        bool success = IERC20(token).transfer(msg.sender, amount);
        require(success, "Token transfer failed");
    }
    
    // View functions for UI
    function getReflectionBalance(address token) external view returns (uint256) {
        return reflectionBalances[token];
    }
    
    function getNextClaimTime(address user) external view returns (uint256) {
        // First check if user has ever claimed before
        if (lastClaimTime[user] == 0) {
            // For users who have never claimed, ensure they can claim immediately
            // But don't return 0, as that's causing confusion in the frontend
            // Instead, return a timestamp in the past (e.g., 1 hour ago)
            return block.timestamp - 1 hours;
        }
        
        // Calculate when they can next claim
        uint256 nextClaimTime = lastClaimTime[user] + CLAIM_COOLDOWN;
        
        // If the time has already passed, return a timestamp slightly in the past
        // instead of 0, to ensure the frontend handles it correctly
        if (nextClaimTime <= block.timestamp) {
            return block.timestamp - 1 hours; // Return a time in the past, but not 0
        }
        
        // If the cooldown is still active, return the actual next claim time
        return nextClaimTime;
    }
    
    function getClaimCooldown() external pure returns (uint256) {
        return CLAIM_COOLDOWN;
    }

    // Helper function to update holders list
    function _updateHolders(address account) private {
        uint256 balance = balanceOf(account);
        bool wasHolder = isHolder[account];
        bool isCurrentHolder = balance > 0;

        if (!wasHolder && isCurrentHolder) {
            holders.push(account);
            isHolder[account] = true;
            totalHolders++;
            emit HolderAdded(account);
        } else if (wasHolder && !isCurrentHolder) {
            isHolder[account] = false;
            totalHolders--;
            emit HolderRemoved(account);
        }
    }

    // Helper function to record transactions
    function _recordTransaction(address user, bool isBuy, uint256 amount) private {
        if (recentTransactions.length >= MAX_RECENT_TRANSACTIONS) {
            // Remove oldest transaction
            for (uint256 i = 0; i < recentTransactions.length - 1; i++) {
                recentTransactions[i] = recentTransactions[i + 1];
            }
            recentTransactions.pop();
        }
        
        recentTransactions.push(Transaction({
            user: user,
            isBuy: isBuy,
            amount: amount,
            timestamp: block.timestamp
        }));
        
        emit TransactionRecorded(user, isBuy, amount, block.timestamp);
    }

    // View function to get total holders count
    function getHoldersCount() external view returns (uint256) {
        return totalHolders;
    }

    // View function to get recent transactions
    function getRecentTransactions(uint256 count) external view returns (
        address[] memory users,
        bool[] memory isBuys,
        uint256[] memory amounts,
        uint256[] memory timestamps
    ) {
        uint256 length = count > recentTransactions.length ? recentTransactions.length : count;
        
        users = new address[](length);
        isBuys = new bool[](length);
        amounts = new uint256[](length);
        timestamps = new uint256[](length);
        
        for (uint256 i = 0; i < length; i++) {
            Transaction memory txn = recentTransactions[recentTransactions.length - 1 - i];
            users[i] = txn.user;
            isBuys[i] = txn.isBuy;
            amounts[i] = txn.amount;
            timestamps[i] = txn.timestamp;
        }
        
        return (users, isBuys, amounts, timestamps);
    }
    
    // TAX FEATURE FUNCTIONS
    
    // Set the Uniswap pair after liquidity is added
    function setUniswapPair() external onlyOwner {
        require(uniswapPair == address(0), "Uniswap pair already set");
        uniswapPair = uniswapFactory.getPair(address(this), WETH);
        require(uniswapPair != address(0), "Uniswap pair not found");
    }
    
    // Enable/disable fees in case of emergency
    function setFeesEnabled(bool _enabled) external onlyOwner {
        feesEnabled = _enabled;
        emit FeesEnabledUpdated(_enabled);
    }
    
    // Allow owner to enable/disable auto-swap
    function setSwapEnabled(bool _enabled) external onlyOwner {
        swapEnabled = _enabled;
        emit SwapEnabledUpdated(_enabled);
    }
    
    // Update swap settings
    function updateSwapSettings(bool _enabled, uint256 _minTokensBeforeSwap) external onlyOwner {
        swapEnabled = _enabled;
        minTokensBeforeSwap = _minTokensBeforeSwap;
        
        emit SwapEnabledUpdated(_enabled);
        emit MinTokensBeforeSwapUpdated(_minTokensBeforeSwap);
    }
    
    // Update min amount before swap
    function setSwapTokensAtAmount(uint256 _minTokensBeforeSwap) external onlyOwner {
        minTokensBeforeSwap = _minTokensBeforeSwap;
        emit MinTokensBeforeSwapUpdated(_minTokensBeforeSwap);
    }
    
    // Function to exclude from fees
    function excludeFromFees(address account, bool excluded) external onlyOwner {
        isExcludedFromFees[account] = excluded;
    }
    
    // Core of the automatic fee collection
    function swapTokensForEth(uint256 tokenAmount) private lockTheSwap {
        // Generate the Uniswap pair path of token -> WETH
        address[] memory path = new address[](2);
        path[0] = address(this);
        path[1] = WETH;
        
        // Approve Uniswap router to spend tokens
        _approve(address(this), address(uniswapRouter), tokenAmount);
        
        // Initial ETH balance to calculate how much we receive
        uint256 initialEthBalance = address(this).balance;
        
        // Make the swap
        uniswapRouter.swapExactTokensForETHSupportingFeeOnTransferTokens(
            tokenAmount,
            0, // Accept any amount of ETH
            path,
            address(this),
            block.timestamp + 15 minutes
        );
        
        // Calculate ETH received
        uint256 ethReceived = address(this).balance - initialEthBalance;
        
        // Add to ETH for reflections
        ethForReflections += ethReceived;
        
        emit SwapTokensForETH(tokenAmount, ethReceived);
        emit EthCollected(ethReceived);
    }
    
    // Allow manual swap of tokens for ETH (for emergency or testing)
    function manualSwap(uint256 tokenAmount) external onlyOwner {
        require(tokenAmount <= balanceOf(address(this)), "Not enough tokens in contract");
        swapTokensForEth(tokenAmount);
    }
    
    // Force swap all contract tokens to ETH (for emergency or adjustment)
    function forceSwap() external onlyOwner {
        uint256 contractTokenBalance = balanceOf(address(this));
        require(contractTokenBalance > 0, "No tokens in contract");
        swapTokensForEth(contractTokenBalance);
    }
}

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

Contract Security Audit

Contract ABI

API
[{"inputs":[{"internalType":"address","name":"deployer","type":"address"},{"internalType":"address","name":"_uniswapRouter","type":"address"},{"internalType":"address","name":"_miladyCultCoin","type":"address"},{"internalType":"address","name":"_spx6900","type":"address"},{"internalType":"address","name":"_mogCoin","type":"address"},{"internalType":"address","name":"_uniswapFactory","type":"address"}],"stateMutability":"nonpayable","type":"constructor"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"spender","type":"address"},{"indexed":false,"internalType":"uint256","name":"value","type":"uint256"}],"name":"Approval","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"}],"name":"EthCollected","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"bool","name":"enabled","type":"bool"}],"name":"FeesEnabledUpdated","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"holder","type":"address"}],"name":"HolderAdded","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"holder","type":"address"}],"name":"HolderRemoved","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"}],"name":"MinTokensBeforeSwapUpdated","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"previousOwner","type":"address"},{"indexed":true,"internalType":"address","name":"newOwner","type":"address"}],"name":"OwnershipTransferred","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"user","type":"address"},{"indexed":true,"internalType":"address","name":"token","type":"address"},{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"}],"name":"ReflectionClaimed","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"user","type":"address"},{"indexed":false,"internalType":"address","name":"reflectionToken","type":"address"}],"name":"ReflectionPreferenceSet","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"token","type":"address"},{"indexed":false,"internalType":"uint256","name":"ethSpent","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"tokensReceived","type":"uint256"}],"name":"ReflectionTokensPurchased","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"bool","name":"enabled","type":"bool"}],"name":"SwapEnabledUpdated","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"tokenAmount","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"ethReceived","type":"uint256"}],"name":"SwapTokensForETH","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"user","type":"address"},{"indexed":false,"internalType":"bool","name":"isBuy","type":"bool"},{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"timestamp","type":"uint256"}],"name":"TransactionRecorded","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"from","type":"address"},{"indexed":true,"internalType":"address","name":"to","type":"address"},{"indexed":false,"internalType":"uint256","name":"value","type":"uint256"}],"name":"Transfer","type":"event"},{"inputs":[],"name":"CLAIM_COOLDOWN","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"MAX_RECENT_TRANSACTIONS","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"MILADY_CULT_COIN","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"MOG_COIN","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"SPX6900","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":"account","type":"address"}],"name":"balanceOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"buyFeePercent","outputs":[{"internalType":"uint8","name":"","type":"uint8"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"buyReflectionTokens","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"buyTokens","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"address","name":"user","type":"address"},{"internalType":"address","name":"token","type":"address"}],"name":"calculateReflectionAmount","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"claimReflections","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"decimals","outputs":[{"internalType":"uint8","name":"","type":"uint8"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"spender","type":"address"},{"internalType":"uint256","name":"subtractedValue","type":"uint256"}],"name":"decreaseAllowance","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"ethForReflections","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"},{"internalType":"bool","name":"excluded","type":"bool"}],"name":"excludeFromFees","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"feesEnabled","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"forceSwap","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"getClaimCooldown","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"pure","type":"function"},{"inputs":[],"name":"getHoldersCount","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"user","type":"address"}],"name":"getNextClaimTime","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"count","type":"uint256"}],"name":"getRecentTransactions","outputs":[{"internalType":"address[]","name":"users","type":"address[]"},{"internalType":"bool[]","name":"isBuys","type":"bool[]"},{"internalType":"uint256[]","name":"amounts","type":"uint256[]"},{"internalType":"uint256[]","name":"timestamps","type":"uint256[]"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"token","type":"address"}],"name":"getReflectionBalance","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"user","type":"address"}],"name":"getUserPreferredToken","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"holders","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"spender","type":"address"},{"internalType":"uint256","name":"addedValue","type":"uint256"}],"name":"increaseAllowance","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"isExcludedFromFees","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"isHolder","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"lastClaimTime","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenAmount","type":"uint256"}],"name":"manualSwap","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"minTokensBeforeSwap","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"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":"","type":"uint256"}],"name":"recentTransactions","outputs":[{"internalType":"address","name":"user","type":"address"},{"internalType":"bool","name":"isBuy","type":"bool"},{"internalType":"uint256","name":"amount","type":"uint256"},{"internalType":"uint256","name":"timestamp","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"recoverETH","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"token","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"recoverTokens","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"reflectionBalances","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"reflectionPreference","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"sellFeePercent","outputs":[{"internalType":"uint8","name":"","type":"uint8"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenAmount","type":"uint256"}],"name":"sellTokens","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bool","name":"_enabled","type":"bool"}],"name":"setFeesEnabled","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"tokenAddress","type":"address"}],"name":"setReflectionPreference","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bool","name":"_enabled","type":"bool"}],"name":"setSwapEnabled","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_minTokensBeforeSwap","type":"uint256"}],"name":"setSwapTokensAtAmount","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"setUniswapPair","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"swapEnabled","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"symbol","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalHolders","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":"to","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"transfer","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"transferFrom","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"uniswapFactory","outputs":[{"internalType":"contract IUniswapV2Factory","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"uniswapPair","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"uniswapRouter","outputs":[{"internalType":"contract IUniswapV2Router","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bool","name":"_enabled","type":"bool"},{"internalType":"uint256","name":"_minTokensBeforeSwap","type":"uint256"}],"name":"updateSwapSettings","outputs":[],"stateMutability":"nonpayable","type":"function"},{"stateMutability":"payable","type":"receive"}]

610140604052600f805463ffffffff191661050517905568056bc75e2d6310000060105534801561002e575f5ffd5b5060405161487c38038061487c83398101604081905261004d91610d8c565b6040518060400160405280600e81526020016d1512114810d5531514c810d5531560921b8152506040518060400160405280600681526020016514925515505360d21b81525081600390816100a29190610e8c565b5060046100af8282610e8c565b5050506100c86100c361041360201b60201c565b610417565b60016006556001600160a01b0386166101285760405162461bcd60e51b815260206004820152601860248201527f496e76616c6964206465706c6f7965722061646472657373000000000000000060448201526064015b60405180910390fd5b6001600160a01b03851661017e5760405162461bcd60e51b815260206004820152601660248201527f496e76616c696420726f75746572206164647265737300000000000000000000604482015260640161011f565b6001600160a01b0384166101d45760405162461bcd60e51b815260206004820181905260248201527f496e76616c6964204d494c4144595f43554c545f434f494e2061646472657373604482015260640161011f565b6001600160a01b03831661022a5760405162461bcd60e51b815260206004820152601760248201527f496e76616c696420535058363930302061646472657373000000000000000000604482015260640161011f565b6001600160a01b0382166102805760405162461bcd60e51b815260206004820152601860248201527f496e76616c6964204d4f475f434f494e20616464726573730000000000000000604482015260640161011f565b6001600160a01b0381166102d65760405162461bcd60e51b815260206004820152601760248201527f496e76616c696420666163746f72792061646472657373000000000000000000604482015260640161011f565b6001600160a01b0380851660805283811660a05282811660c05285811660e081905290821661010052604080516315ab88c960e31b8152905163ad5c4648916004808201926020929091908290030181865afa158015610338573d5f5f3e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061035c9190610f46565b6001600160a01b03166101205261037f306b033b2e3c9fd0803ce8000000610468565b5f606461039960016b033b2e3c9fd0803ce8000000610f7a565b6103a39190610f97565b90506103b0308883610512565b600160125f6103c76005546001600160a01b031690565b6001600160a01b0316815260208082019290925260409081015f908120805494151560ff1995861617905530815260129092529020805490911660011790555061108d95505050505050565b3390565b600580546001600160a01b038381166001600160a01b0319831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0905f90a35050565b6001600160a01b0382166104be5760405162461bcd60e51b815260206004820152601f60248201527f45524332303a206d696e7420746f20746865207a65726f206164647265737300604482015260640161011f565b8060025f8282546104cf9190610fb6565b90915550506001600160a01b0382165f81815260208181526040808320805486019055518481525f51602061485c5f395f51905f52910160405180910390a35050565b6001600160a01b0383166105635760405162461bcd60e51b815260206004820152602560248201525f51602061483c5f395f51905f52604482015264647265737360d81b606482015260840161011f565b6001600160a01b0382166105b25760405162461bcd60e51b815260206004820152602360248201525f51602061481c5f395f51905f5260448201526265737360e81b606482015260840161011f565b5f81116106135760405162461bcd60e51b815260206004820152602960248201527f5472616e7366657220616d6f756e74206d7573742062652067726561746572206044820152687468616e207a65726f60b81b606482015260840161011f565b6013545f9060ff161580156106315750600f546301000000900460ff165b80156106455750600f5462010000900460ff165b80156106615750601054305f9081526020819052604090205410155b801561067b57506011546001600160a01b03858116911614155b801561069557506011546001600160a01b03848116911614155b905080156106a9576010546106a9906107c7565b600f545f9062010000900460ff1680156106db57506001600160a01b0385165f9081526012602052604090205460ff16155b80156106ff57506001600160a01b0384165f9081526012602052604090205460ff16155b9050801561079e576011545f906001600160a01b039081169087160361074357600f546064906107329060ff1686610f7a565b61073c9190610f97565b905061077e565b6011546001600160a01b039081169086160361077e57600f5460649061077190610100900460ff1686610f7a565b61077b9190610f97565b90505b801561079c5761078f863083610982565b6107998185610fc9565b93505b505b6107a9858585610982565b6107b285610aed565b6107bb84610aed565b5050505050565b505050565b6013805460ff191660011790556040805160028082526060820183525f9260208301908036833701905050905030815f8151811061080757610807610fdc565b60200260200101906001600160a01b031690816001600160a01b031681525050610120518160018151811061083e5761083e610fdc565b60200260200101906001600160a01b031690816001600160a01b0316815250506108713060e05184610c4e60201b60201c565b60e05147906001600160a01b031663791ac947845f853061089442610384610fb6565b6040518663ffffffff1660e01b81526004016108b4959493929190610ff0565b5f604051808303815f87803b1580156108cb575f5ffd5b505af11580156108dd573d5f5f3e3d5ffd5b505050505f81476108ee9190610fc9565b90508060085f8282546109019190610fb6565b909155505060408051858152602081018390527fdfca204483754b2de4aca26d42e4b04ad9473e0299c6eaccfb4f8f3646ed4490910160405180910390a16040518181527fb4d037e523f2835454ffe8197404c2be38ebd6ef8801f3d366f96ff6a2facc539060200160405180910390a150506013805460ff191690555050565b6001600160a01b0383166109d35760405162461bcd60e51b815260206004820152602560248201525f51602061483c5f395f51905f52604482015264647265737360d81b606482015260840161011f565b6001600160a01b038216610a225760405162461bcd60e51b815260206004820152602360248201525f51602061481c5f395f51905f5260448201526265737360e81b606482015260840161011f565b6001600160a01b0383165f9081526020819052604090205481811015610a995760405162461bcd60e51b815260206004820152602660248201527f45524332303a207472616e7366657220616d6f756e7420657863656564732062604482015265616c616e636560d01b606482015260840161011f565b6001600160a01b038481165f81815260208181526040808320878703905593871680835291849020805487019055925185815290925f51602061485c5f395f51905f52910160405180910390a35b50505050565b6001600160a01b0381165f9081526020818152604080832054600c9092529091205460ff1681151581158015610b205750805b15610bd357600b805460018082019092557f0175b7a638427703f0dbe7bb9bbf987a2551717b34e79f33b5b1008d1fa01db90180546001600160a01b0319166001600160a01b0387169081179091555f908152600c60205260408120805460ff1916909217909155600d805491610b9683611060565b90915550506040516001600160a01b038516907f9894d458cf29e8bc4eb7e591bac54b31dc90125dfa852474419972ab4347dd12905f90a2610ae7565b818015610bde575080155b15610ae7576001600160a01b0384165f908152600c60205260408120805460ff19169055600d805491610c1083611078565b90915550506040516001600160a01b038516907fd9bc583d1445615d8b795b7374f03ff79efa83b6359a91331efd95e4cf023ab6905f90a250505050565b6001600160a01b038316610cb05760405162461bcd60e51b8152602060048201526024808201527f45524332303a20617070726f76652066726f6d20746865207a65726f206164646044820152637265737360e01b606482015260840161011f565b6001600160a01b038216610d115760405162461bcd60e51b815260206004820152602260248201527f45524332303a20617070726f766520746f20746865207a65726f206164647265604482015261737360f01b606482015260840161011f565b6001600160a01b038381165f8181526001602090815260408083209487168084529482529182902085905590518481527f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925910160405180910390a3505050565b80516001600160a01b0381168114610d87575f5ffd5b919050565b5f5f5f5f5f5f60c08789031215610da1575f5ffd5b610daa87610d71565b9550610db860208801610d71565b9450610dc660408801610d71565b9350610dd460608801610d71565b9250610de260808801610d71565b9150610df060a08801610d71565b90509295509295509295565b634e487b7160e01b5f52604160045260245ffd5b600181811c90821680610e2457607f821691505b602082108103610e4257634e487b7160e01b5f52602260045260245ffd5b50919050565b601f8211156107c257805f5260205f20601f840160051c81016020851015610e6d5750805b601f840160051c820191505b818110156107bb575f8155600101610e79565b81516001600160401b03811115610ea557610ea5610dfc565b610eb981610eb38454610e10565b84610e48565b6020601f821160018114610eeb575f8315610ed45750848201515b5f19600385901b1c1916600184901b1784556107bb565b5f84815260208120601f198516915b82811015610f1a5787850151825560209485019460019092019101610efa565b5084821015610f3757868401515f19600387901b60f8161c191681555b50505050600190811b01905550565b5f60208284031215610f56575f5ffd5b610f5f82610d71565b9392505050565b634e487b7160e01b5f52601160045260245ffd5b8082028115828204841417610f9157610f91610f66565b92915050565b5f82610fb157634e487b7160e01b5f52601260045260245ffd5b500490565b80820180821115610f9157610f91610f66565b81810381811115610f9157610f91610f66565b634e487b7160e01b5f52603260045260245ffd5b5f60a0820187835286602084015260a0604084015280865180835260c0850191506020880192505f5b818110156110405783516001600160a01b0316835260209384019390920191600101611019565b50506001600160a01b039590951660608401525050608001529392505050565b5f6001820161107157611071610f66565b5060010190565b5f8161108657611086610f66565b505f190190565b60805160a05160c05160e05161010051610120516136ca6111525f395f8181611f53015281816125ef015281816126d90152612cb401525f81816107aa01528181611f7b015261262101525f8181610720015281816127c001528181612d0c0152612d3c01525f81816105c801528181610ed0015281816118d90152611ae901525f818161067b01528181610ea60152818161189d0152611aad01525f818161044001528181610e7c0152818161186201528181611a7201526120e201526136ca5ff3fe608060405260043610610374575f3560e01c80638da5cb5b116101c8578063c0246668116100fd578063df778d261161009d578063e8e77d2b1161006d578063e8e77d2b14610ace578063f1bd7df814610af9578063f2fde38b14610b0d578063fbaea5c614610b2c575f5ffd5b8063df778d2614610a68578063e01af92c14610a7c578063e0d30d9b14610a9b578063e5d41c6b14610ab9575f5ffd5b8063d0febe4c116100d8578063d0febe4c146109f4578063d3335553146109fc578063d4d7b19a14610a1b578063dd62ed3e14610a49575f5ffd5b8063c02466681461099d578063c816841b146109bc578063cc3fdd4c146109db575f5ffd5b8063a9059cbb11610168578063b10adb0611610143578063b10adb0614610915578063b70143c914610934578063b77cf9c614610953578063bcf8a10e1461097e575f5ffd5b8063a9059cbb146108c2578063aa344072146108e1578063afa4f3b2146108f6575f5ffd5b8063a0a0f945116101a3578063a0a0f9451461081c578063a457c2d714610865578063a64e4f8a14610884578063a901dd92146108a3575f5ffd5b80638da5cb5b146107cc57806393c30c0f146107e957806395d89b4114610808575f5ffd5b80634fbee193116102a95780636ddd17131161024957806373889f4a1161021957806373889f4a1461074257806379cecf461461075657806382262808146107855780638bdb2afa14610799575f5ffd5b80636ddd1713146106bc57806370a08231146106dc578063715018a6146106fb578063735de9f71461070f575f5ffd5b80635621880b116102845780635621880b1461064157806361e7e31e1461065557806363e7a1e41461066a5780636c11bcd31461069d575f5ffd5b80634fbee193146105ea57806353d74fdf14610618578063551c242b1461062d575f5ffd5b806323b872dd1161031457806337c909ec116102ef57806337c909ec1461056357806339509351146105795780633b4914fe14610598578063448728dc146105b7575f5ffd5b806323b872dd146105045780632a11ced014610523578063313ce56714610542575f5ffd5b80630ed585a71161034f5780630ed585a71461042f5780631193dd751461047a5780631682aa49146104ae57806318160ddd146104f0575f5ffd5b8063069c9fae146103b557806306fdde03146103d6578063095ea7b314610400575f5ffd5b366103b1573460085f82825461038a91906130ec565b90915550506040513481525f5160206136755f395f51905f529060200160405180910390a1005b5f5ffd5b3480156103c0575f5ffd5b506103d46103cf366004613113565b610b4b565b005b3480156103e1575f5ffd5b506103ea610c6c565b6040516103f7919061313d565b60405180910390f35b34801561040b575f5ffd5b5061041f61041a366004613113565b610cfc565b60405190151581526020016103f7565b34801561043a575f5ffd5b506104627f000000000000000000000000000000000000000000000000000000000000000081565b6040516001600160a01b0390911681526020016103f7565b348015610485575f5ffd5b50610462610494366004613172565b60076020525f90815260409020546001600160a01b031681565b3480156104b9575f5ffd5b506104e26104c8366004613172565b6001600160a01b03165f9081526009602052604090205490565b6040519081526020016103f7565b3480156104fb575f5ffd5b506002546104e2565b34801561050f575f5ffd5b5061041f61051e36600461318d565b610d15565b34801561052e575f5ffd5b5061046261053d3660046131cb565b610d38565b34801561054d575f5ffd5b5060125b60405160ff90911681526020016103f7565b34801561056e575f5ffd5b506104e26201518081565b348015610584575f5ffd5b5061041f610593366004613113565b610d60565b3480156105a3575f5ffd5b506103d46105b23660046131ef565b610d81565b3480156105c2575f5ffd5b506104627f000000000000000000000000000000000000000000000000000000000000000081565b3480156105f5575f5ffd5b5061041f610604366004613172565b60126020525f908152604090205460ff1681565b348015610623575f5ffd5b506104e2600d5481565b348015610638575f5ffd5b506104e2603281565b34801561064c575f5ffd5b506103d4610e1a565b348015610660575f5ffd5b50620151806104e2565b348015610675575f5ffd5b506104627f000000000000000000000000000000000000000000000000000000000000000081565b3480156106a8575f5ffd5b506103d46106b73660046131cb565b610ef9565b3480156106c7575f5ffd5b50600f5461041f906301000000900460ff1681565b3480156106e7575f5ffd5b506104e26106f6366004613172565b6110b3565b348015610706575f5ffd5b506103d46110cd565b34801561071a575f5ffd5b506104627f000000000000000000000000000000000000000000000000000000000000000081565b34801561074d575f5ffd5b50600d546104e2565b348015610761575f5ffd5b506107756107703660046131cb565b6110e0565b6040516103f7949392919061327e565b348015610790575f5ffd5b506103d4611359565b3480156107a4575f5ffd5b506104627f000000000000000000000000000000000000000000000000000000000000000081565b3480156107d7575f5ffd5b506005546001600160a01b0316610462565b3480156107f4575f5ffd5b506104e2610803366004613172565b6115e1565b348015610813575f5ffd5b506103ea61164d565b348015610827575f5ffd5b5061083b6108363660046131cb565b61165c565b604080516001600160a01b03909516855292151560208501529183015260608201526080016103f7565b348015610870575f5ffd5b5061041f61087f366004613113565b6116a3565b34801561088f575f5ffd5b50600f5461041f9062010000900460ff1681565b3480156108ae575f5ffd5b506103d46108bd366004613300565b61171d565b3480156108cd575f5ffd5b5061041f6108dc366004613113565b61177b565b3480156108ec575f5ffd5b506104e260085481565b348015610901575f5ffd5b506103d46109103660046131cb565b611788565b348015610920575f5ffd5b506104e261092f36600461331b565b6117c5565b34801561093f575f5ffd5b506103d461094e3660046131cb565b611a07565b34801561095e575f5ffd5b506104e261096d366004613172565b600a6020525f908152604090205481565b348015610989575f5ffd5b506103d4610998366004613172565b611a70565b3480156109a8575f5ffd5b506103d46109b7366004613352565b611bc5565b3480156109c7575f5ffd5b50601154610462906001600160a01b031681565b3480156109e6575f5ffd5b50600f546105519060ff1681565b6103d4611bf7565b348015610a07575f5ffd5b506103d4610a163660046131cb565b611d27565b348015610a26575f5ffd5b5061041f610a35366004613172565b600c6020525f908152604090205460ff1681565b348015610a54575f5ffd5b506104e2610a6336600461331b565b611dfb565b348015610a73575f5ffd5b506103d4611e25565b348015610a87575f5ffd5b506103d4610a96366004613300565b611e80565b348015610aa6575f5ffd5b50600f5461055190610100900460ff1681565b348015610ac4575f5ffd5b506104e260105481565b348015610ad9575f5ffd5b506104e2610ae8366004613172565b60096020525f908152604090205481565b348015610b04575f5ffd5b506103d4611ed5565b348015610b18575f5ffd5b506103d4610b27366004613172565b612048565b348015610b37575f5ffd5b50610462610b46366004613172565b6120be565b610b53612107565b306001600160a01b03831603610bb05760405162461bcd60e51b815260206004820152601c60248201527f43616e6e6f74207265636f7665722052495455414c20746f6b656e730000000060448201526064015b60405180910390fd5b60405163a9059cbb60e01b8152336004820152602481018290525f906001600160a01b0384169063a9059cbb906044016020604051808303815f875af1158015610bfc573d5f5f3e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610c20919061337e565b905080610c675760405162461bcd60e51b8152602060048201526015602482015274151bdad95b881d1c985b9cd9995c8819985a5b1959605a1b6044820152606401610ba7565b505050565b606060038054610c7b90613399565b80601f0160208091040260200160405190810160405280929190818152602001828054610ca790613399565b8015610cf25780601f10610cc957610100808354040283529160200191610cf2565b820191905f5260205f20905b815481529060010190602001808311610cd557829003601f168201915b5050505050905090565b5f33610d09818585612161565b60019150505b92915050565b5f33610d22858285612284565b610d2d8585856122fc565b506001949350505050565b600b8181548110610d47575f80fd5b5f918252602090912001546001600160a01b0316905081565b5f33610d09818585610d728383611dfb565b610d7c91906130ec565b612161565b610d89612107565b600f805483151563010000000263ff0000001990911617905560108190556040517f436b6cf978c7b6998fcce43dfe4d37e3a0dc2bb780144a2eb55d7138201e8a1290610ddb90841515815260200190565b60405180910390a16040518181527f5948780118f41f7c4577ae4619d5cbd064057bd8562d9f7b7e60324053375c009060200160405180910390a15050565b610e22612107565b60085480610e655760405162461bcd60e51b815260206004820152601060248201526f4e6f2045544820617661696c61626c6560801b6044820152606401610ba7565b5f610e716003836133d1565b5f6008559050610ea17f000000000000000000000000000000000000000000000000000000000000000082612551565b610ecb7f000000000000000000000000000000000000000000000000000000000000000082612551565b610ef57f000000000000000000000000000000000000000000000000000000000000000082612551565b5050565b610f01612966565b5f8111610f485760405162461bcd60e51b81526020600482015260156024820152744d7573742073656c6c20736f6d6520746f6b656e7360581b6044820152606401610ba7565b80610f52336110b3565b1015610f945760405162461bcd60e51b81526020600482015260116024820152704e6f7420656e6f75676820746f6b656e7360781b6044820152606401610ba7565b610f9f3330836122fc565b5f610fad620f4240836133d1565b90505f6064610fbd6005846133f0565b610fc791906133d1565b90505f610fd48284613407565b90508160085f828254610fe791906130ec565b90915550506040518281525f5160206136755f395f51905f529060200160405180910390a16040515f90339083908381818185875af1925050503d805f811461104b576040519150601f19603f3d011682016040523d82523d5f602084013e611050565b606091505b50509050806110975760405162461bcd60e51b8152602060048201526013602482015272115512081d1c985b9cd9995c8819985a5b1959606a1b6044820152606401610ba7565b6110a2335f876129bf565b505050506110b06001600655565b50565b6001600160a01b03165f9081526020819052604090205490565b6110d5612107565b6110de5f612c01565b565b6060806060805f600e8054905086116110f957856110fd565b600e545b90508067ffffffffffffffff8111156111185761111861341a565b604051908082528060200260200182016040528015611141578160200160208202803683370190505b5094508067ffffffffffffffff81111561115d5761115d61341a565b604051908082528060200260200182016040528015611186578160200160208202803683370190505b5093508067ffffffffffffffff8111156111a2576111a261341a565b6040519080825280602002602001820160405280156111cb578160200160208202803683370190505b5092508067ffffffffffffffff8111156111e7576111e761341a565b604051908082528060200260200182016040528015611210578160200160208202803683370190505b5091505f5b81811015611350575f600e826001600e805490506112339190613407565b61123d9190613407565b8154811061124d5761124d61342e565b5f9182526020918290206040805160808101825260039390930290910180546001600160a01b038116808552600160a01b90910460ff1615159484019490945260018101549183019190915260020154606082015288519092508890849081106112b9576112b961342e565b60200260200101906001600160a01b031690816001600160a01b03168152505080602001518683815181106112f0576112f061342e565b60200260200101901515908115158152505080604001518583815181106113195761131961342e565b602002602001018181525050806060015184838151811061133c5761133c61342e565b602090810291909101015250600101611215565b50509193509193565b611361612966565b5f61136b336110b3565b116113b85760405162461bcd60e51b815260206004820152601760248201527f4e6f20746f6b656e7320746f20636c61696d20776974680000000000000000006044820152606401610ba7565b335f908152600a60205260409020541561143057335f908152600a60205260409020546113e99062015180906130ec565b4210156114305760405162461bcd60e51b8152602060048201526015602482015274436c61696d20636f6f6c646f776e2061637469766560581b6044820152606401610ba7565b5f61143a336120be565b90505f61144733836117c5565b90505f81116114985760405162461bcd60e51b815260206004820152601760248201527f4e6f207265666c656374696f6e7320746f20636c61696d0000000000000000006044820152606401610ba7565b6001600160a01b0382165f90815260096020526040812080548392906114bf908490613407565b9091555050335f818152600a60205260408082204290555163a9059cbb60e01b8152600481019290925260248201839052906001600160a01b0384169063a9059cbb906044016020604051808303815f875af1158015611521573d5f5f3e3d5ffd5b505050506040513d601f19601f82011682018060405250810190611545919061337e565b9050806115945760405162461bcd60e51b815260206004820152601a60248201527f5265666c656374696f6e207472616e73666572206661696c65640000000000006044820152606401610ba7565b6040518281526001600160a01b0384169033907fafaf9b9ee334900dff01987ec85ef7cd3a829bc785bda06b26daa43087d0ff3c9060200160405180910390a35050506110de6001600655565b6001600160a01b0381165f908152600a6020526040812054810361160b57610d0f610e1042613407565b6001600160a01b0382165f908152600a60205260408120546116319062015180906130ec565b9050428111610d0f57611646610e1042613407565b9392505050565b606060048054610c7b90613399565b600e818154811061166b575f80fd5b5f9182526020909120600390910201805460018201546002909201546001600160a01b0382169350600160a01b90910460ff16919084565b5f33816116b08286611dfb565b9050838110156117105760405162461bcd60e51b815260206004820152602560248201527f45524332303a2064656372656173656420616c6c6f77616e63652062656c6f77604482015264207a65726f60d81b6064820152608401610ba7565b610d2d8286868403612161565b611725612107565b600f8054821515620100000262ff0000199091161790556040517fba500994dffbabeeb9e430f03a978d7b975359a20c5bde3a6ccb5a0c454680c89061177090831515815260200190565b60405180910390a150565b5f33610d098185856122fc565b611790612107565b60108190556040518181527f5948780118f41f7c4577ae4619d5cbd064057bd8562d9f7b7e60324053375c0090602001611770565b5f5f6117d0846110b3565b116118125760405162461bcd60e51b81526020600482015260126024820152715573657220686173206e6f20746f6b656e7360701b6044820152606401610ba7565b6001600160a01b0382166118605760405162461bcd60e51b8152602060048201526015602482015274496e76616c696420746f6b656e206164647265737360581b6044820152606401610ba7565b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316826001600160a01b031614806118d157507f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316826001600160a01b0316145b8061190d57507f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316826001600160a01b0316145b6119545760405162461bcd60e51b815260206004820152601860248201527724b73b30b634b2103932b33632b1ba34b7b7103a37b5b2b760411b6044820152606401610ba7565b6001600160a01b0382165f908152600960205260408120549081900361197d575f915050610d0f565b5f611987856110b3565b90505f611993306110b3565b6119a9906b033b2e3c9fd0803ce8000000613407565b9050805f036119bd575f9350505050610d0f565b5f816119d184670de0b6b3a76400006133f0565b6119db91906133d1565b90505f670de0b6b3a76400006119f183876133f0565b6119fb91906133d1565b98975050505050505050565b611a0f612107565b611a18306110b3565b811115611a675760405162461bcd60e51b815260206004820152601d60248201527f4e6f7420656e6f75676820746f6b656e7320696e20636f6e74726163740000006044820152606401610ba7565b6110b081612c52565b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316816001600160a01b03161480611ae157507f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316816001600160a01b0316145b80611b1d57507f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316816001600160a01b0316145b611b645760405162461bcd60e51b815260206004820152601860248201527724b73b30b634b2103932b33632b1ba34b7b7103a37b5b2b760411b6044820152606401610ba7565b335f8181526007602090815260409182902080546001600160a01b0319166001600160a01b03861690811790915591519182527fc996576b47c91b4aac4e0b9fec1e81dc9b4995bcb3fbf6acbc0fc8f8483e3d8d910160405180910390a250565b611bcd612107565b6001600160a01b03919091165f908152601260205260409020805460ff1916911515919091179055565b611bff612966565b5f3411611c3e5760405162461bcd60e51b815260206004820152600d60248201526c09aeae6e840e6cadcc8408aa89609b1b6044820152606401610ba7565b5f6064611c4c6005346133f0565b611c5691906133d1565b90505f611c638234613407565b90508160085f828254611c7691906130ec565b90915550506040518281525f5160206136755f395f51905f529060200160405180910390a15f611ca982620f42406133f0565b905080611cb5306110b3565b1015611d035760405162461bcd60e51b815260206004820152601d60248201527f4e6f7420656e6f75676820746f6b656e7320696e20636f6e74726163740000006044820152606401610ba7565b611d0e3033836122fc565b611d1a336001836129bf565b5050506110de6001600655565b611d2f612107565b47811115611d705760405162461bcd60e51b815260206004820152600e60248201526d09cdee840cadcdeeaced0408aa8960931b6044820152606401610ba7565b6040515f90339083908381818185875af1925050503d805f8114611daf576040519150601f19603f3d011682016040523d82523d5f602084013e611db4565b606091505b5050905080610ef55760405162461bcd60e51b8152602060048201526013602482015272115512081d1c985b9cd9995c8819985a5b1959606a1b6044820152606401610ba7565b6001600160a01b039182165f90815260016020908152604080832093909416825291909152205490565b611e2d612107565b5f611e37306110b3565b90505f8111611a675760405162461bcd60e51b8152602060048201526015602482015274139bc81d1bdad95b9cc81a5b8818dbdb9d1c9858dd605a1b6044820152606401610ba7565b611e88612107565b600f805482151563010000000263ff000000199091161790556040517f436b6cf978c7b6998fcce43dfe4d37e3a0dc2bb780144a2eb55d7138201e8a129061177090831515815260200190565b611edd612107565b6011546001600160a01b031615611f365760405162461bcd60e51b815260206004820152601860248201527f556e6973776170207061697220616c72656164792073657400000000000000006044820152606401610ba7565b60405163e6a4390560e01b81523060048201526001600160a01b037f0000000000000000000000000000000000000000000000000000000000000000811660248301527f0000000000000000000000000000000000000000000000000000000000000000169063e6a4390590604401602060405180830381865afa158015611fc0573d5f5f3e3d5ffd5b505050506040513d601f19601f82011682018060405250810190611fe49190613442565b601180546001600160a01b0319166001600160a01b039290921691821790556110de5760405162461bcd60e51b8152602060048201526016602482015275155b9a5cddd85c081c185a5c881b9bdd08199bdd5b9960521b6044820152606401610ba7565b612050612107565b6001600160a01b0381166120b55760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b6064820152608401610ba7565b6110b081612c01565b6001600160a01b038082165f9081526007602052604081205490911680610d0f57507f000000000000000000000000000000000000000000000000000000000000000092915050565b6005546001600160a01b031633146110de5760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726044820152606401610ba7565b6001600160a01b0383166121c35760405162461bcd60e51b8152602060048201526024808201527f45524332303a20617070726f76652066726f6d20746865207a65726f206164646044820152637265737360e01b6064820152608401610ba7565b6001600160a01b0382166122245760405162461bcd60e51b815260206004820152602260248201527f45524332303a20617070726f766520746f20746865207a65726f206164647265604482015261737360f01b6064820152608401610ba7565b6001600160a01b038381165f8181526001602090815260408083209487168084529482529182902085905590518481527f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925910160405180910390a3505050565b5f61228f8484611dfb565b90505f1981146122f657818110156122e95760405162461bcd60e51b815260206004820152601d60248201527f45524332303a20696e73756666696369656e7420616c6c6f77616e63650000006044820152606401610ba7565b6122f68484848403612161565b50505050565b6001600160a01b0383166123225760405162461bcd60e51b8152600401610ba79061345d565b6001600160a01b0382166123485760405162461bcd60e51b8152600401610ba7906134a2565b5f81116123a95760405162461bcd60e51b815260206004820152602960248201527f5472616e7366657220616d6f756e74206d7573742062652067726561746572206044820152687468616e207a65726f60b81b6064820152608401610ba7565b6013545f9060ff161580156123c75750600f546301000000900460ff165b80156123db5750600f5462010000900460ff165b80156123f157506010546123ee306110b3565b10155b801561240b57506011546001600160a01b03858116911614155b801561242557506011546001600160a01b03848116911614155b9050801561243857612438601054612c52565b600f545f9062010000900460ff16801561246a57506001600160a01b0385165f9081526012602052604090205460ff16155b801561248e57506001600160a01b0384165f9081526012602052604090205460ff16155b9050801561252d576011545f906001600160a01b03908116908716036124d257600f546064906124c19060ff16866133f0565b6124cb91906133d1565b905061250d565b6011546001600160a01b039081169086160361250d57600f5460649061250090610100900460ff16866133f0565b61250a91906133d1565b90505b801561252b5761251e863083612e4c565b6125288185613407565b93505b505b612538858585612e4c565b61254185612f74565b61254a84612f74565b5050505050565b6001600160a01b0382166125975760405162461bcd60e51b815260206004820152600d60248201526c24b73b30b634b2103a37b5b2b760991b6044820152606401610ba7565b5f81116125d85760405162461bcd60e51b815260206004820152600f60248201526e139bc8115512081d1bc81cdc195b99608a1b6044820152606401610ba7565b60405163e6a4390560e01b81526001600160a01b037f00000000000000000000000000000000000000000000000000000000000000008116600483015283811660248301525f917f00000000000000000000000000000000000000000000000000000000000000009091169063e6a4390590604401602060405180830381865afa158015612668573d5f5f3e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061268c9190613442565b90506001600160a01b0381166126b7578160085f8282546126ad91906130ec565b9091555050505050565b6040805160028082526060820183525f926020830190803683370190505090507f0000000000000000000000000000000000000000000000000000000000000000815f8151811061270a5761270a61342e565b60200260200101906001600160a01b031690816001600160a01b031681525050838160018151811061273e5761273e61342e565b6001600160a01b0392831660209182029290920101526040516370a0823160e01b81523060048201525f918616906370a0823190602401602060405180830381865afa158015612790573d5f5f3e3d5ffd5b505050506040513d601f19601f820116820180604052508101906127b491906134e5565b90506001600160a01b037f000000000000000000000000000000000000000000000000000000000000000016637ff36ab5855f85306127f5426103846130ec565b6040518663ffffffff1660e01b815260040161281494939291906134fc565b5f6040518083038185885af19350505050801561285257506040513d5f823e601f3d908101601f1916820160405261284f9190810190613530565b60015b612872578360085f82825461286791906130ec565b9091555061254a9050565b6040516370a0823160e01b81523060048201525f906001600160a01b038816906370a0823190602401602060405180830381865afa1580156128b6573d5f5f3e3d5ffd5b505050506040513d601f19601f820116820180604052508101906128da91906134e5565b90505f6128e78483613407565b6001600160a01b0389165f908152600960205260408120805492935083929091906129139084906130ec565b909155505060408051888152602081018390526001600160a01b038a16917ff7e3692b0e9d160429eb5c709badf3803b4be537aadae639b899b6a7e9003cd3910160405180910390a25050505050505050565b6002600654036129b85760405162461bcd60e51b815260206004820152601f60248201527f5265656e7472616e637947756172643a207265656e7472616e742063616c6c006044820152606401610ba7565b6002600655565b600e54603211612acf575f5b600e546129da90600190613407565b811015612a8e57600e6129ee8260016130ec565b815481106129fe576129fe61342e565b905f5260205f209060030201600e8281548110612a1d57612a1d61342e565b5f9182526020909120825460039092020180546001600160a01b039092166001600160a01b031983168117825583546001600160a81b031990931617600160a01b9283900460ff161515909202919091178155600180830154818301556002928301549290910191909155016129cb565b50600e805480612aa057612aa06135f8565b5f8281526020812060035f199093019283020180546001600160a81b0319168155600181018290556002015590555b604080516080810182526001600160a01b03808616808352851515602084019081528385018681524260608601818152600e80546001810182555f91909152965160039097027fbb7b4a454dc3493923482f07822329ed19e8244eff582cc204f8554c3620c3fd8101805495511515600160a01b026001600160a81b0319909616989097169790971793909317909455517fbb7b4a454dc3493923482f07822329ed19e8244eff582cc204f8554c3620c3fe850155517fbb7b4a454dc3493923482f07822329ed19e8244eff582cc204f8554c3620c3ff90930192909255915190917f7902999c36112fe7c5b61b802e3f46529ff1a813e9e1a85d330bc0dc044dd1d991612bf491869186919092151583526020830191909152604082015260600190565b60405180910390a2505050565b600580546001600160a01b038381166001600160a01b0319831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0905f90a35050565b6013805460ff191660011790556040805160028082526060820183525f9260208301908036833701905050905030815f81518110612c9257612c9261342e565b60200260200101906001600160a01b031690816001600160a01b0316815250507f000000000000000000000000000000000000000000000000000000000000000081600181518110612ce657612ce661342e565b60200260200101906001600160a01b031690816001600160a01b031681525050612d31307f000000000000000000000000000000000000000000000000000000000000000084612161565b476001600160a01b037f00000000000000000000000000000000000000000000000000000000000000001663791ac947845f8530612d71426103846130ec565b6040518663ffffffff1660e01b8152600401612d9195949392919061360c565b5f604051808303815f87803b158015612da8575f5ffd5b505af1158015612dba573d5f5f3e3d5ffd5b505050505f8147612dcb9190613407565b90508060085f828254612dde91906130ec565b909155505060408051858152602081018390527fdfca204483754b2de4aca26d42e4b04ad9473e0299c6eaccfb4f8f3646ed4490910160405180910390a16040518181525f5160206136755f395f51905f529060200160405180910390a150506013805460ff191690555050565b6001600160a01b038316612e725760405162461bcd60e51b8152600401610ba79061345d565b6001600160a01b038216612e985760405162461bcd60e51b8152600401610ba7906134a2565b6001600160a01b0383165f9081526020819052604090205481811015612f0f5760405162461bcd60e51b815260206004820152602660248201527f45524332303a207472616e7366657220616d6f756e7420657863656564732062604482015265616c616e636560d01b6064820152608401610ba7565b6001600160a01b038481165f81815260208181526040808320878703905593871680835291849020805487019055925185815290927fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef910160405180910390a36122f6565b5f612f7e826110b3565b6001600160a01b0383165f908152600c602052604090205490915060ff1681151581158015612faa5750805b1561305d57600b805460018082019092557f0175b7a638427703f0dbe7bb9bbf987a2551717b34e79f33b5b1008d1fa01db90180546001600160a01b0319166001600160a01b0387169081179091555f908152600c60205260408120805460ff1916909217909155600d80549161302083613647565b90915550506040516001600160a01b038516907f9894d458cf29e8bc4eb7e591bac54b31dc90125dfa852474419972ab4347dd12905f90a26122f6565b818015613068575080155b156122f6576001600160a01b0384165f908152600c60205260408120805460ff19169055600d80549161309a8361365f565b90915550506040516001600160a01b038516907fd9bc583d1445615d8b795b7374f03ff79efa83b6359a91331efd95e4cf023ab6905f90a250505050565b634e487b7160e01b5f52601160045260245ffd5b80820180821115610d0f57610d0f6130d8565b6001600160a01b03811681146110b0575f5ffd5b5f5f60408385031215613124575f5ffd5b823561312f816130ff565b946020939093013593505050565b602081525f82518060208401528060208501604085015e5f604082850101526040601f19601f83011684010191505092915050565b5f60208284031215613182575f5ffd5b8135611646816130ff565b5f5f5f6060848603121561319f575f5ffd5b83356131aa816130ff565b925060208401356131ba816130ff565b929592945050506040919091013590565b5f602082840312156131db575f5ffd5b5035919050565b80151581146110b0575f5ffd5b5f5f60408385031215613200575f5ffd5b823561312f816131e2565b5f8151808452602084019350602083015f5b828110156132445781516001600160a01b031686526020958601959091019060010161321d565b5093949350505050565b5f8151808452602084019350602083015f5b82811015613244578151865260209586019590910190600101613260565b608081525f613290608083018761320b565b82810360208401528086518083526020830191506020880192505f5b818110156132cc57835115158352602093840193909201916001016132ac565b505083810360408501526132e0818761324e565b91505082810360608401526132f5818561324e565b979650505050505050565b5f60208284031215613310575f5ffd5b8135611646816131e2565b5f5f6040838503121561332c575f5ffd5b8235613337816130ff565b91506020830135613347816130ff565b809150509250929050565b5f5f60408385031215613363575f5ffd5b823561336e816130ff565b91506020830135613347816131e2565b5f6020828403121561338e575f5ffd5b8151611646816131e2565b600181811c908216806133ad57607f821691505b6020821081036133cb57634e487b7160e01b5f52602260045260245ffd5b50919050565b5f826133eb57634e487b7160e01b5f52601260045260245ffd5b500490565b8082028115828204841417610d0f57610d0f6130d8565b81810381811115610d0f57610d0f6130d8565b634e487b7160e01b5f52604160045260245ffd5b634e487b7160e01b5f52603260045260245ffd5b5f60208284031215613452575f5ffd5b8151611646816130ff565b60208082526025908201527f45524332303a207472616e736665722066726f6d20746865207a65726f206164604082015264647265737360d81b606082015260800190565b60208082526023908201527f45524332303a207472616e7366657220746f20746865207a65726f206164647260408201526265737360e81b606082015260800190565b5f602082840312156134f5575f5ffd5b5051919050565b848152608060208201525f613514608083018661320b565b6001600160a01b03949094166040830152506060015292915050565b5f60208284031215613540575f5ffd5b815167ffffffffffffffff811115613556575f5ffd5b8201601f81018413613566575f5ffd5b805167ffffffffffffffff8111156135805761358061341a565b8060051b604051601f19603f830116810181811067ffffffffffffffff821117156135ad576135ad61341a565b6040529182526020818401810192908101878411156135ca575f5ffd5b6020850194505b838510156135ed578451808252602095860195909350016135d1565b509695505050505050565b634e487b7160e01b5f52603160045260245ffd5b85815284602082015260a060408201525f61362a60a083018661320b565b6001600160a01b0394909416606083015250608001529392505050565b5f60018201613658576136586130d8565b5060010190565b5f8161366d5761366d6130d8565b505f19019056feb4d037e523f2835454ffe8197404c2be38ebd6ef8801f3d366f96ff6a2facc53a26469706673582212209c85190ab7ce81ac1564c613c564fdc4b9f79b74c997f5e1bd07d89056a61ef564736f6c634300081d003345524332303a207472616e7366657220746f20746865207a65726f206164647245524332303a207472616e736665722066726f6d20746865207a65726f206164ddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef000000000000000000000000a79238cfff731efea19e9bca93dee8e678de38850000000000000000000000007a250d5630b4cf539739df2c5dacb4c659f2488d0000000000000000000000000000000000c5dc95539589fbd24be07c6c14eca4000000000000000000000000e0f63a424a4439cbe457d80e4f4b51ad25b2c56c000000000000000000000000aaee1a9723aadb7afa2810263653a34ba2c21c7a0000000000000000000000005c69bee701ef814a2b6a3edd4b1652cb9cc5aa6f

Deployed Bytecode

0x608060405260043610610374575f3560e01c80638da5cb5b116101c8578063c0246668116100fd578063df778d261161009d578063e8e77d2b1161006d578063e8e77d2b14610ace578063f1bd7df814610af9578063f2fde38b14610b0d578063fbaea5c614610b2c575f5ffd5b8063df778d2614610a68578063e01af92c14610a7c578063e0d30d9b14610a9b578063e5d41c6b14610ab9575f5ffd5b8063d0febe4c116100d8578063d0febe4c146109f4578063d3335553146109fc578063d4d7b19a14610a1b578063dd62ed3e14610a49575f5ffd5b8063c02466681461099d578063c816841b146109bc578063cc3fdd4c146109db575f5ffd5b8063a9059cbb11610168578063b10adb0611610143578063b10adb0614610915578063b70143c914610934578063b77cf9c614610953578063bcf8a10e1461097e575f5ffd5b8063a9059cbb146108c2578063aa344072146108e1578063afa4f3b2146108f6575f5ffd5b8063a0a0f945116101a3578063a0a0f9451461081c578063a457c2d714610865578063a64e4f8a14610884578063a901dd92146108a3575f5ffd5b80638da5cb5b146107cc57806393c30c0f146107e957806395d89b4114610808575f5ffd5b80634fbee193116102a95780636ddd17131161024957806373889f4a1161021957806373889f4a1461074257806379cecf461461075657806382262808146107855780638bdb2afa14610799575f5ffd5b80636ddd1713146106bc57806370a08231146106dc578063715018a6146106fb578063735de9f71461070f575f5ffd5b80635621880b116102845780635621880b1461064157806361e7e31e1461065557806363e7a1e41461066a5780636c11bcd31461069d575f5ffd5b80634fbee193146105ea57806353d74fdf14610618578063551c242b1461062d575f5ffd5b806323b872dd1161031457806337c909ec116102ef57806337c909ec1461056357806339509351146105795780633b4914fe14610598578063448728dc146105b7575f5ffd5b806323b872dd146105045780632a11ced014610523578063313ce56714610542575f5ffd5b80630ed585a71161034f5780630ed585a71461042f5780631193dd751461047a5780631682aa49146104ae57806318160ddd146104f0575f5ffd5b8063069c9fae146103b557806306fdde03146103d6578063095ea7b314610400575f5ffd5b366103b1573460085f82825461038a91906130ec565b90915550506040513481525f5160206136755f395f51905f529060200160405180910390a1005b5f5ffd5b3480156103c0575f5ffd5b506103d46103cf366004613113565b610b4b565b005b3480156103e1575f5ffd5b506103ea610c6c565b6040516103f7919061313d565b60405180910390f35b34801561040b575f5ffd5b5061041f61041a366004613113565b610cfc565b60405190151581526020016103f7565b34801561043a575f5ffd5b506104627f0000000000000000000000000000000000c5dc95539589fbd24be07c6c14eca481565b6040516001600160a01b0390911681526020016103f7565b348015610485575f5ffd5b50610462610494366004613172565b60076020525f90815260409020546001600160a01b031681565b3480156104b9575f5ffd5b506104e26104c8366004613172565b6001600160a01b03165f9081526009602052604090205490565b6040519081526020016103f7565b3480156104fb575f5ffd5b506002546104e2565b34801561050f575f5ffd5b5061041f61051e36600461318d565b610d15565b34801561052e575f5ffd5b5061046261053d3660046131cb565b610d38565b34801561054d575f5ffd5b5060125b60405160ff90911681526020016103f7565b34801561056e575f5ffd5b506104e26201518081565b348015610584575f5ffd5b5061041f610593366004613113565b610d60565b3480156105a3575f5ffd5b506103d46105b23660046131ef565b610d81565b3480156105c2575f5ffd5b506104627f000000000000000000000000aaee1a9723aadb7afa2810263653a34ba2c21c7a81565b3480156105f5575f5ffd5b5061041f610604366004613172565b60126020525f908152604090205460ff1681565b348015610623575f5ffd5b506104e2600d5481565b348015610638575f5ffd5b506104e2603281565b34801561064c575f5ffd5b506103d4610e1a565b348015610660575f5ffd5b50620151806104e2565b348015610675575f5ffd5b506104627f000000000000000000000000e0f63a424a4439cbe457d80e4f4b51ad25b2c56c81565b3480156106a8575f5ffd5b506103d46106b73660046131cb565b610ef9565b3480156106c7575f5ffd5b50600f5461041f906301000000900460ff1681565b3480156106e7575f5ffd5b506104e26106f6366004613172565b6110b3565b348015610706575f5ffd5b506103d46110cd565b34801561071a575f5ffd5b506104627f0000000000000000000000007a250d5630b4cf539739df2c5dacb4c659f2488d81565b34801561074d575f5ffd5b50600d546104e2565b348015610761575f5ffd5b506107756107703660046131cb565b6110e0565b6040516103f7949392919061327e565b348015610790575f5ffd5b506103d4611359565b3480156107a4575f5ffd5b506104627f0000000000000000000000005c69bee701ef814a2b6a3edd4b1652cb9cc5aa6f81565b3480156107d7575f5ffd5b506005546001600160a01b0316610462565b3480156107f4575f5ffd5b506104e2610803366004613172565b6115e1565b348015610813575f5ffd5b506103ea61164d565b348015610827575f5ffd5b5061083b6108363660046131cb565b61165c565b604080516001600160a01b03909516855292151560208501529183015260608201526080016103f7565b348015610870575f5ffd5b5061041f61087f366004613113565b6116a3565b34801561088f575f5ffd5b50600f5461041f9062010000900460ff1681565b3480156108ae575f5ffd5b506103d46108bd366004613300565b61171d565b3480156108cd575f5ffd5b5061041f6108dc366004613113565b61177b565b3480156108ec575f5ffd5b506104e260085481565b348015610901575f5ffd5b506103d46109103660046131cb565b611788565b348015610920575f5ffd5b506104e261092f36600461331b565b6117c5565b34801561093f575f5ffd5b506103d461094e3660046131cb565b611a07565b34801561095e575f5ffd5b506104e261096d366004613172565b600a6020525f908152604090205481565b348015610989575f5ffd5b506103d4610998366004613172565b611a70565b3480156109a8575f5ffd5b506103d46109b7366004613352565b611bc5565b3480156109c7575f5ffd5b50601154610462906001600160a01b031681565b3480156109e6575f5ffd5b50600f546105519060ff1681565b6103d4611bf7565b348015610a07575f5ffd5b506103d4610a163660046131cb565b611d27565b348015610a26575f5ffd5b5061041f610a35366004613172565b600c6020525f908152604090205460ff1681565b348015610a54575f5ffd5b506104e2610a6336600461331b565b611dfb565b348015610a73575f5ffd5b506103d4611e25565b348015610a87575f5ffd5b506103d4610a96366004613300565b611e80565b348015610aa6575f5ffd5b50600f5461055190610100900460ff1681565b348015610ac4575f5ffd5b506104e260105481565b348015610ad9575f5ffd5b506104e2610ae8366004613172565b60096020525f908152604090205481565b348015610b04575f5ffd5b506103d4611ed5565b348015610b18575f5ffd5b506103d4610b27366004613172565b612048565b348015610b37575f5ffd5b50610462610b46366004613172565b6120be565b610b53612107565b306001600160a01b03831603610bb05760405162461bcd60e51b815260206004820152601c60248201527f43616e6e6f74207265636f7665722052495455414c20746f6b656e730000000060448201526064015b60405180910390fd5b60405163a9059cbb60e01b8152336004820152602481018290525f906001600160a01b0384169063a9059cbb906044016020604051808303815f875af1158015610bfc573d5f5f3e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610c20919061337e565b905080610c675760405162461bcd60e51b8152602060048201526015602482015274151bdad95b881d1c985b9cd9995c8819985a5b1959605a1b6044820152606401610ba7565b505050565b606060038054610c7b90613399565b80601f0160208091040260200160405190810160405280929190818152602001828054610ca790613399565b8015610cf25780601f10610cc957610100808354040283529160200191610cf2565b820191905f5260205f20905b815481529060010190602001808311610cd557829003601f168201915b5050505050905090565b5f33610d09818585612161565b60019150505b92915050565b5f33610d22858285612284565b610d2d8585856122fc565b506001949350505050565b600b8181548110610d47575f80fd5b5f918252602090912001546001600160a01b0316905081565b5f33610d09818585610d728383611dfb565b610d7c91906130ec565b612161565b610d89612107565b600f805483151563010000000263ff0000001990911617905560108190556040517f436b6cf978c7b6998fcce43dfe4d37e3a0dc2bb780144a2eb55d7138201e8a1290610ddb90841515815260200190565b60405180910390a16040518181527f5948780118f41f7c4577ae4619d5cbd064057bd8562d9f7b7e60324053375c009060200160405180910390a15050565b610e22612107565b60085480610e655760405162461bcd60e51b815260206004820152601060248201526f4e6f2045544820617661696c61626c6560801b6044820152606401610ba7565b5f610e716003836133d1565b5f6008559050610ea17f0000000000000000000000000000000000c5dc95539589fbd24be07c6c14eca482612551565b610ecb7f000000000000000000000000e0f63a424a4439cbe457d80e4f4b51ad25b2c56c82612551565b610ef57f000000000000000000000000aaee1a9723aadb7afa2810263653a34ba2c21c7a82612551565b5050565b610f01612966565b5f8111610f485760405162461bcd60e51b81526020600482015260156024820152744d7573742073656c6c20736f6d6520746f6b656e7360581b6044820152606401610ba7565b80610f52336110b3565b1015610f945760405162461bcd60e51b81526020600482015260116024820152704e6f7420656e6f75676820746f6b656e7360781b6044820152606401610ba7565b610f9f3330836122fc565b5f610fad620f4240836133d1565b90505f6064610fbd6005846133f0565b610fc791906133d1565b90505f610fd48284613407565b90508160085f828254610fe791906130ec565b90915550506040518281525f5160206136755f395f51905f529060200160405180910390a16040515f90339083908381818185875af1925050503d805f811461104b576040519150601f19603f3d011682016040523d82523d5f602084013e611050565b606091505b50509050806110975760405162461bcd60e51b8152602060048201526013602482015272115512081d1c985b9cd9995c8819985a5b1959606a1b6044820152606401610ba7565b6110a2335f876129bf565b505050506110b06001600655565b50565b6001600160a01b03165f9081526020819052604090205490565b6110d5612107565b6110de5f612c01565b565b6060806060805f600e8054905086116110f957856110fd565b600e545b90508067ffffffffffffffff8111156111185761111861341a565b604051908082528060200260200182016040528015611141578160200160208202803683370190505b5094508067ffffffffffffffff81111561115d5761115d61341a565b604051908082528060200260200182016040528015611186578160200160208202803683370190505b5093508067ffffffffffffffff8111156111a2576111a261341a565b6040519080825280602002602001820160405280156111cb578160200160208202803683370190505b5092508067ffffffffffffffff8111156111e7576111e761341a565b604051908082528060200260200182016040528015611210578160200160208202803683370190505b5091505f5b81811015611350575f600e826001600e805490506112339190613407565b61123d9190613407565b8154811061124d5761124d61342e565b5f9182526020918290206040805160808101825260039390930290910180546001600160a01b038116808552600160a01b90910460ff1615159484019490945260018101549183019190915260020154606082015288519092508890849081106112b9576112b961342e565b60200260200101906001600160a01b031690816001600160a01b03168152505080602001518683815181106112f0576112f061342e565b60200260200101901515908115158152505080604001518583815181106113195761131961342e565b602002602001018181525050806060015184838151811061133c5761133c61342e565b602090810291909101015250600101611215565b50509193509193565b611361612966565b5f61136b336110b3565b116113b85760405162461bcd60e51b815260206004820152601760248201527f4e6f20746f6b656e7320746f20636c61696d20776974680000000000000000006044820152606401610ba7565b335f908152600a60205260409020541561143057335f908152600a60205260409020546113e99062015180906130ec565b4210156114305760405162461bcd60e51b8152602060048201526015602482015274436c61696d20636f6f6c646f776e2061637469766560581b6044820152606401610ba7565b5f61143a336120be565b90505f61144733836117c5565b90505f81116114985760405162461bcd60e51b815260206004820152601760248201527f4e6f207265666c656374696f6e7320746f20636c61696d0000000000000000006044820152606401610ba7565b6001600160a01b0382165f90815260096020526040812080548392906114bf908490613407565b9091555050335f818152600a60205260408082204290555163a9059cbb60e01b8152600481019290925260248201839052906001600160a01b0384169063a9059cbb906044016020604051808303815f875af1158015611521573d5f5f3e3d5ffd5b505050506040513d601f19601f82011682018060405250810190611545919061337e565b9050806115945760405162461bcd60e51b815260206004820152601a60248201527f5265666c656374696f6e207472616e73666572206661696c65640000000000006044820152606401610ba7565b6040518281526001600160a01b0384169033907fafaf9b9ee334900dff01987ec85ef7cd3a829bc785bda06b26daa43087d0ff3c9060200160405180910390a35050506110de6001600655565b6001600160a01b0381165f908152600a6020526040812054810361160b57610d0f610e1042613407565b6001600160a01b0382165f908152600a60205260408120546116319062015180906130ec565b9050428111610d0f57611646610e1042613407565b9392505050565b606060048054610c7b90613399565b600e818154811061166b575f80fd5b5f9182526020909120600390910201805460018201546002909201546001600160a01b0382169350600160a01b90910460ff16919084565b5f33816116b08286611dfb565b9050838110156117105760405162461bcd60e51b815260206004820152602560248201527f45524332303a2064656372656173656420616c6c6f77616e63652062656c6f77604482015264207a65726f60d81b6064820152608401610ba7565b610d2d8286868403612161565b611725612107565b600f8054821515620100000262ff0000199091161790556040517fba500994dffbabeeb9e430f03a978d7b975359a20c5bde3a6ccb5a0c454680c89061177090831515815260200190565b60405180910390a150565b5f33610d098185856122fc565b611790612107565b60108190556040518181527f5948780118f41f7c4577ae4619d5cbd064057bd8562d9f7b7e60324053375c0090602001611770565b5f5f6117d0846110b3565b116118125760405162461bcd60e51b81526020600482015260126024820152715573657220686173206e6f20746f6b656e7360701b6044820152606401610ba7565b6001600160a01b0382166118605760405162461bcd60e51b8152602060048201526015602482015274496e76616c696420746f6b656e206164647265737360581b6044820152606401610ba7565b7f0000000000000000000000000000000000c5dc95539589fbd24be07c6c14eca46001600160a01b0316826001600160a01b031614806118d157507f000000000000000000000000e0f63a424a4439cbe457d80e4f4b51ad25b2c56c6001600160a01b0316826001600160a01b0316145b8061190d57507f000000000000000000000000aaee1a9723aadb7afa2810263653a34ba2c21c7a6001600160a01b0316826001600160a01b0316145b6119545760405162461bcd60e51b815260206004820152601860248201527724b73b30b634b2103932b33632b1ba34b7b7103a37b5b2b760411b6044820152606401610ba7565b6001600160a01b0382165f908152600960205260408120549081900361197d575f915050610d0f565b5f611987856110b3565b90505f611993306110b3565b6119a9906b033b2e3c9fd0803ce8000000613407565b9050805f036119bd575f9350505050610d0f565b5f816119d184670de0b6b3a76400006133f0565b6119db91906133d1565b90505f670de0b6b3a76400006119f183876133f0565b6119fb91906133d1565b98975050505050505050565b611a0f612107565b611a18306110b3565b811115611a675760405162461bcd60e51b815260206004820152601d60248201527f4e6f7420656e6f75676820746f6b656e7320696e20636f6e74726163740000006044820152606401610ba7565b6110b081612c52565b7f0000000000000000000000000000000000c5dc95539589fbd24be07c6c14eca46001600160a01b0316816001600160a01b03161480611ae157507f000000000000000000000000e0f63a424a4439cbe457d80e4f4b51ad25b2c56c6001600160a01b0316816001600160a01b0316145b80611b1d57507f000000000000000000000000aaee1a9723aadb7afa2810263653a34ba2c21c7a6001600160a01b0316816001600160a01b0316145b611b645760405162461bcd60e51b815260206004820152601860248201527724b73b30b634b2103932b33632b1ba34b7b7103a37b5b2b760411b6044820152606401610ba7565b335f8181526007602090815260409182902080546001600160a01b0319166001600160a01b03861690811790915591519182527fc996576b47c91b4aac4e0b9fec1e81dc9b4995bcb3fbf6acbc0fc8f8483e3d8d910160405180910390a250565b611bcd612107565b6001600160a01b03919091165f908152601260205260409020805460ff1916911515919091179055565b611bff612966565b5f3411611c3e5760405162461bcd60e51b815260206004820152600d60248201526c09aeae6e840e6cadcc8408aa89609b1b6044820152606401610ba7565b5f6064611c4c6005346133f0565b611c5691906133d1565b90505f611c638234613407565b90508160085f828254611c7691906130ec565b90915550506040518281525f5160206136755f395f51905f529060200160405180910390a15f611ca982620f42406133f0565b905080611cb5306110b3565b1015611d035760405162461bcd60e51b815260206004820152601d60248201527f4e6f7420656e6f75676820746f6b656e7320696e20636f6e74726163740000006044820152606401610ba7565b611d0e3033836122fc565b611d1a336001836129bf565b5050506110de6001600655565b611d2f612107565b47811115611d705760405162461bcd60e51b815260206004820152600e60248201526d09cdee840cadcdeeaced0408aa8960931b6044820152606401610ba7565b6040515f90339083908381818185875af1925050503d805f8114611daf576040519150601f19603f3d011682016040523d82523d5f602084013e611db4565b606091505b5050905080610ef55760405162461bcd60e51b8152602060048201526013602482015272115512081d1c985b9cd9995c8819985a5b1959606a1b6044820152606401610ba7565b6001600160a01b039182165f90815260016020908152604080832093909416825291909152205490565b611e2d612107565b5f611e37306110b3565b90505f8111611a675760405162461bcd60e51b8152602060048201526015602482015274139bc81d1bdad95b9cc81a5b8818dbdb9d1c9858dd605a1b6044820152606401610ba7565b611e88612107565b600f805482151563010000000263ff000000199091161790556040517f436b6cf978c7b6998fcce43dfe4d37e3a0dc2bb780144a2eb55d7138201e8a129061177090831515815260200190565b611edd612107565b6011546001600160a01b031615611f365760405162461bcd60e51b815260206004820152601860248201527f556e6973776170207061697220616c72656164792073657400000000000000006044820152606401610ba7565b60405163e6a4390560e01b81523060048201526001600160a01b037f000000000000000000000000c02aaa39b223fe8d0a0e5c4f27ead9083c756cc2811660248301527f0000000000000000000000005c69bee701ef814a2b6a3edd4b1652cb9cc5aa6f169063e6a4390590604401602060405180830381865afa158015611fc0573d5f5f3e3d5ffd5b505050506040513d601f19601f82011682018060405250810190611fe49190613442565b601180546001600160a01b0319166001600160a01b039290921691821790556110de5760405162461bcd60e51b8152602060048201526016602482015275155b9a5cddd85c081c185a5c881b9bdd08199bdd5b9960521b6044820152606401610ba7565b612050612107565b6001600160a01b0381166120b55760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b6064820152608401610ba7565b6110b081612c01565b6001600160a01b038082165f9081526007602052604081205490911680610d0f57507f0000000000000000000000000000000000c5dc95539589fbd24be07c6c14eca492915050565b6005546001600160a01b031633146110de5760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726044820152606401610ba7565b6001600160a01b0383166121c35760405162461bcd60e51b8152602060048201526024808201527f45524332303a20617070726f76652066726f6d20746865207a65726f206164646044820152637265737360e01b6064820152608401610ba7565b6001600160a01b0382166122245760405162461bcd60e51b815260206004820152602260248201527f45524332303a20617070726f766520746f20746865207a65726f206164647265604482015261737360f01b6064820152608401610ba7565b6001600160a01b038381165f8181526001602090815260408083209487168084529482529182902085905590518481527f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925910160405180910390a3505050565b5f61228f8484611dfb565b90505f1981146122f657818110156122e95760405162461bcd60e51b815260206004820152601d60248201527f45524332303a20696e73756666696369656e7420616c6c6f77616e63650000006044820152606401610ba7565b6122f68484848403612161565b50505050565b6001600160a01b0383166123225760405162461bcd60e51b8152600401610ba79061345d565b6001600160a01b0382166123485760405162461bcd60e51b8152600401610ba7906134a2565b5f81116123a95760405162461bcd60e51b815260206004820152602960248201527f5472616e7366657220616d6f756e74206d7573742062652067726561746572206044820152687468616e207a65726f60b81b6064820152608401610ba7565b6013545f9060ff161580156123c75750600f546301000000900460ff165b80156123db5750600f5462010000900460ff165b80156123f157506010546123ee306110b3565b10155b801561240b57506011546001600160a01b03858116911614155b801561242557506011546001600160a01b03848116911614155b9050801561243857612438601054612c52565b600f545f9062010000900460ff16801561246a57506001600160a01b0385165f9081526012602052604090205460ff16155b801561248e57506001600160a01b0384165f9081526012602052604090205460ff16155b9050801561252d576011545f906001600160a01b03908116908716036124d257600f546064906124c19060ff16866133f0565b6124cb91906133d1565b905061250d565b6011546001600160a01b039081169086160361250d57600f5460649061250090610100900460ff16866133f0565b61250a91906133d1565b90505b801561252b5761251e863083612e4c565b6125288185613407565b93505b505b612538858585612e4c565b61254185612f74565b61254a84612f74565b5050505050565b6001600160a01b0382166125975760405162461bcd60e51b815260206004820152600d60248201526c24b73b30b634b2103a37b5b2b760991b6044820152606401610ba7565b5f81116125d85760405162461bcd60e51b815260206004820152600f60248201526e139bc8115512081d1bc81cdc195b99608a1b6044820152606401610ba7565b60405163e6a4390560e01b81526001600160a01b037f000000000000000000000000c02aaa39b223fe8d0a0e5c4f27ead9083c756cc28116600483015283811660248301525f917f0000000000000000000000005c69bee701ef814a2b6a3edd4b1652cb9cc5aa6f9091169063e6a4390590604401602060405180830381865afa158015612668573d5f5f3e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061268c9190613442565b90506001600160a01b0381166126b7578160085f8282546126ad91906130ec565b9091555050505050565b6040805160028082526060820183525f926020830190803683370190505090507f000000000000000000000000c02aaa39b223fe8d0a0e5c4f27ead9083c756cc2815f8151811061270a5761270a61342e565b60200260200101906001600160a01b031690816001600160a01b031681525050838160018151811061273e5761273e61342e565b6001600160a01b0392831660209182029290920101526040516370a0823160e01b81523060048201525f918616906370a0823190602401602060405180830381865afa158015612790573d5f5f3e3d5ffd5b505050506040513d601f19601f820116820180604052508101906127b491906134e5565b90506001600160a01b037f0000000000000000000000007a250d5630b4cf539739df2c5dacb4c659f2488d16637ff36ab5855f85306127f5426103846130ec565b6040518663ffffffff1660e01b815260040161281494939291906134fc565b5f6040518083038185885af19350505050801561285257506040513d5f823e601f3d908101601f1916820160405261284f9190810190613530565b60015b612872578360085f82825461286791906130ec565b9091555061254a9050565b6040516370a0823160e01b81523060048201525f906001600160a01b038816906370a0823190602401602060405180830381865afa1580156128b6573d5f5f3e3d5ffd5b505050506040513d601f19601f820116820180604052508101906128da91906134e5565b90505f6128e78483613407565b6001600160a01b0389165f908152600960205260408120805492935083929091906129139084906130ec565b909155505060408051888152602081018390526001600160a01b038a16917ff7e3692b0e9d160429eb5c709badf3803b4be537aadae639b899b6a7e9003cd3910160405180910390a25050505050505050565b6002600654036129b85760405162461bcd60e51b815260206004820152601f60248201527f5265656e7472616e637947756172643a207265656e7472616e742063616c6c006044820152606401610ba7565b6002600655565b600e54603211612acf575f5b600e546129da90600190613407565b811015612a8e57600e6129ee8260016130ec565b815481106129fe576129fe61342e565b905f5260205f209060030201600e8281548110612a1d57612a1d61342e565b5f9182526020909120825460039092020180546001600160a01b039092166001600160a01b031983168117825583546001600160a81b031990931617600160a01b9283900460ff161515909202919091178155600180830154818301556002928301549290910191909155016129cb565b50600e805480612aa057612aa06135f8565b5f8281526020812060035f199093019283020180546001600160a81b0319168155600181018290556002015590555b604080516080810182526001600160a01b03808616808352851515602084019081528385018681524260608601818152600e80546001810182555f91909152965160039097027fbb7b4a454dc3493923482f07822329ed19e8244eff582cc204f8554c3620c3fd8101805495511515600160a01b026001600160a81b0319909616989097169790971793909317909455517fbb7b4a454dc3493923482f07822329ed19e8244eff582cc204f8554c3620c3fe850155517fbb7b4a454dc3493923482f07822329ed19e8244eff582cc204f8554c3620c3ff90930192909255915190917f7902999c36112fe7c5b61b802e3f46529ff1a813e9e1a85d330bc0dc044dd1d991612bf491869186919092151583526020830191909152604082015260600190565b60405180910390a2505050565b600580546001600160a01b038381166001600160a01b0319831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0905f90a35050565b6013805460ff191660011790556040805160028082526060820183525f9260208301908036833701905050905030815f81518110612c9257612c9261342e565b60200260200101906001600160a01b031690816001600160a01b0316815250507f000000000000000000000000c02aaa39b223fe8d0a0e5c4f27ead9083c756cc281600181518110612ce657612ce661342e565b60200260200101906001600160a01b031690816001600160a01b031681525050612d31307f0000000000000000000000007a250d5630b4cf539739df2c5dacb4c659f2488d84612161565b476001600160a01b037f0000000000000000000000007a250d5630b4cf539739df2c5dacb4c659f2488d1663791ac947845f8530612d71426103846130ec565b6040518663ffffffff1660e01b8152600401612d9195949392919061360c565b5f604051808303815f87803b158015612da8575f5ffd5b505af1158015612dba573d5f5f3e3d5ffd5b505050505f8147612dcb9190613407565b90508060085f828254612dde91906130ec565b909155505060408051858152602081018390527fdfca204483754b2de4aca26d42e4b04ad9473e0299c6eaccfb4f8f3646ed4490910160405180910390a16040518181525f5160206136755f395f51905f529060200160405180910390a150506013805460ff191690555050565b6001600160a01b038316612e725760405162461bcd60e51b8152600401610ba79061345d565b6001600160a01b038216612e985760405162461bcd60e51b8152600401610ba7906134a2565b6001600160a01b0383165f9081526020819052604090205481811015612f0f5760405162461bcd60e51b815260206004820152602660248201527f45524332303a207472616e7366657220616d6f756e7420657863656564732062604482015265616c616e636560d01b6064820152608401610ba7565b6001600160a01b038481165f81815260208181526040808320878703905593871680835291849020805487019055925185815290927fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef910160405180910390a36122f6565b5f612f7e826110b3565b6001600160a01b0383165f908152600c602052604090205490915060ff1681151581158015612faa5750805b1561305d57600b805460018082019092557f0175b7a638427703f0dbe7bb9bbf987a2551717b34e79f33b5b1008d1fa01db90180546001600160a01b0319166001600160a01b0387169081179091555f908152600c60205260408120805460ff1916909217909155600d80549161302083613647565b90915550506040516001600160a01b038516907f9894d458cf29e8bc4eb7e591bac54b31dc90125dfa852474419972ab4347dd12905f90a26122f6565b818015613068575080155b156122f6576001600160a01b0384165f908152600c60205260408120805460ff19169055600d80549161309a8361365f565b90915550506040516001600160a01b038516907fd9bc583d1445615d8b795b7374f03ff79efa83b6359a91331efd95e4cf023ab6905f90a250505050565b634e487b7160e01b5f52601160045260245ffd5b80820180821115610d0f57610d0f6130d8565b6001600160a01b03811681146110b0575f5ffd5b5f5f60408385031215613124575f5ffd5b823561312f816130ff565b946020939093013593505050565b602081525f82518060208401528060208501604085015e5f604082850101526040601f19601f83011684010191505092915050565b5f60208284031215613182575f5ffd5b8135611646816130ff565b5f5f5f6060848603121561319f575f5ffd5b83356131aa816130ff565b925060208401356131ba816130ff565b929592945050506040919091013590565b5f602082840312156131db575f5ffd5b5035919050565b80151581146110b0575f5ffd5b5f5f60408385031215613200575f5ffd5b823561312f816131e2565b5f8151808452602084019350602083015f5b828110156132445781516001600160a01b031686526020958601959091019060010161321d565b5093949350505050565b5f8151808452602084019350602083015f5b82811015613244578151865260209586019590910190600101613260565b608081525f613290608083018761320b565b82810360208401528086518083526020830191506020880192505f5b818110156132cc57835115158352602093840193909201916001016132ac565b505083810360408501526132e0818761324e565b91505082810360608401526132f5818561324e565b979650505050505050565b5f60208284031215613310575f5ffd5b8135611646816131e2565b5f5f6040838503121561332c575f5ffd5b8235613337816130ff565b91506020830135613347816130ff565b809150509250929050565b5f5f60408385031215613363575f5ffd5b823561336e816130ff565b91506020830135613347816131e2565b5f6020828403121561338e575f5ffd5b8151611646816131e2565b600181811c908216806133ad57607f821691505b6020821081036133cb57634e487b7160e01b5f52602260045260245ffd5b50919050565b5f826133eb57634e487b7160e01b5f52601260045260245ffd5b500490565b8082028115828204841417610d0f57610d0f6130d8565b81810381811115610d0f57610d0f6130d8565b634e487b7160e01b5f52604160045260245ffd5b634e487b7160e01b5f52603260045260245ffd5b5f60208284031215613452575f5ffd5b8151611646816130ff565b60208082526025908201527f45524332303a207472616e736665722066726f6d20746865207a65726f206164604082015264647265737360d81b606082015260800190565b60208082526023908201527f45524332303a207472616e7366657220746f20746865207a65726f206164647260408201526265737360e81b606082015260800190565b5f602082840312156134f5575f5ffd5b5051919050565b848152608060208201525f613514608083018661320b565b6001600160a01b03949094166040830152506060015292915050565b5f60208284031215613540575f5ffd5b815167ffffffffffffffff811115613556575f5ffd5b8201601f81018413613566575f5ffd5b805167ffffffffffffffff8111156135805761358061341a565b8060051b604051601f19603f830116810181811067ffffffffffffffff821117156135ad576135ad61341a565b6040529182526020818401810192908101878411156135ca575f5ffd5b6020850194505b838510156135ed578451808252602095860195909350016135d1565b509695505050505050565b634e487b7160e01b5f52603160045260245ffd5b85815284602082015260a060408201525f61362a60a083018661320b565b6001600160a01b0394909416606083015250608001529392505050565b5f60018201613658576136586130d8565b5060010190565b5f8161366d5761366d6130d8565b505f19019056feb4d037e523f2835454ffe8197404c2be38ebd6ef8801f3d366f96ff6a2facc53a26469706673582212209c85190ab7ce81ac1564c613c564fdc4b9f79b74c997f5e1bd07d89056a61ef564736f6c634300081d0033

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

000000000000000000000000a79238cfff731efea19e9bca93dee8e678de38850000000000000000000000007a250d5630b4cf539739df2c5dacb4c659f2488d0000000000000000000000000000000000c5dc95539589fbd24be07c6c14eca4000000000000000000000000e0f63a424a4439cbe457d80e4f4b51ad25b2c56c000000000000000000000000aaee1a9723aadb7afa2810263653a34ba2c21c7a0000000000000000000000005c69bee701ef814a2b6a3edd4b1652cb9cc5aa6f

-----Decoded View---------------
Arg [0] : deployer (address): 0xa79238CFFf731EFeA19E9bCa93DeE8E678De3885
Arg [1] : _uniswapRouter (address): 0x7a250d5630B4cF539739dF2C5dAcb4c659F2488D
Arg [2] : _miladyCultCoin (address): 0x0000000000c5dc95539589fbD24BE07c6C14eCa4
Arg [3] : _spx6900 (address): 0xE0f63A424a4439cBE457D80E4f4b51aD25b2c56C
Arg [4] : _mogCoin (address): 0xaaeE1A9723aaDB7afA2810263653A34bA2C21C7a
Arg [5] : _uniswapFactory (address): 0x5C69bEe701ef814a2B6a3EDD4B1652CB9cc5aA6f

-----Encoded View---------------
6 Constructor Arguments found :
Arg [0] : 000000000000000000000000a79238cfff731efea19e9bca93dee8e678de3885
Arg [1] : 0000000000000000000000007a250d5630b4cf539739df2c5dacb4c659f2488d
Arg [2] : 0000000000000000000000000000000000c5dc95539589fbd24be07c6c14eca4
Arg [3] : 000000000000000000000000e0f63a424a4439cbe457d80e4f4b51ad25b2c56c
Arg [4] : 000000000000000000000000aaee1a9723aadb7afa2810263653a34ba2c21c7a
Arg [5] : 0000000000000000000000005c69bee701ef814a2b6a3edd4b1652cb9cc5aa6f


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.