ETH Price: $1,979.87 (-4.59%)

Contract

0xcd1E7E0D6E5467F90AAa5Bb08482C1D6510aFc32
 

Overview

ETH Balance

0 ETH

Eth Value

$0.00

Token Holdings

More Info

Private Name Tags

Multichain Info

No addresses found
Transaction Hash
Method
Block
From
To
Enable Trading245213792026-02-23 18:28:1111 days ago1771871291IN
0xcd1E7E0D...6510aFc32
0 ETH0.00004972.10933172
Transfer245213512026-02-23 18:22:3511 days ago1771870955IN
0xcd1E7E0D...6510aFc32
0 ETH0.000021320.12250901
Transfer245213482026-02-23 18:21:5911 days ago1771870919IN
0xcd1E7E0D...6510aFc32
0 ETH0.000022260.12790466
Transfer245213472026-02-23 18:21:4711 days ago1771870907IN
0xcd1E7E0D...6510aFc32
0 ETH0.000023030.13234451
Transfer245213462026-02-23 18:21:3511 days ago1771870895IN
0xcd1E7E0D...6510aFc32
0 ETH0.000022150.13368018
Transfer245213442026-02-23 18:21:1111 days ago1771870871IN
0xcd1E7E0D...6510aFc32
0 ETH0.000022620.12996938
Transfer245213422026-02-23 18:20:4711 days ago1771870847IN
0xcd1E7E0D...6510aFc32
0 ETH0.000024050.13817844
Transfer245213412026-02-23 18:20:3511 days ago1771870835IN
0xcd1E7E0D...6510aFc32
0 ETH0.000023530.13521736
Transfer245213392026-02-23 18:20:1111 days ago1771870811IN
0xcd1E7E0D...6510aFc32
0 ETH0.000024790.14247845
Transfer245213322026-02-23 18:18:4711 days ago1771870727IN
0xcd1E7E0D...6510aFc32
0 ETH0.000024670.1417403
Transfer245213312026-02-23 18:18:3511 days ago1771870715IN
0xcd1E7E0D...6510aFc32
0 ETH0.0000240.13792826
Transfer245213302026-02-23 18:18:2311 days ago1771870703IN
0xcd1E7E0D...6510aFc32
0 ETH0.000024320.13976464
Transfer245213292026-02-23 18:18:1111 days ago1771870691IN
0xcd1E7E0D...6510aFc32
0 ETH0.000023660.13594459
Set Swap Tokens ...245213272026-02-23 18:17:4711 days ago1771870667IN
0xcd1E7E0D...6510aFc32
0 ETH0.000004150.14205323
Approve245213192026-02-23 18:16:1111 days ago1771870571IN
0xcd1E7E0D...6510aFc32
0 ETH0.000147233.1511467
Approve245212992026-02-23 18:12:1111 days ago1771870331IN
0xcd1E7E0D...6510aFc32
0 ETH0.000045860.98167965
Approve245212912026-02-23 18:10:3511 days ago1771870235IN
0xcd1E7E0D...6510aFc32
0 ETH0.000103132.20735599
Approve245212882026-02-23 18:09:5911 days ago1771870199IN
0xcd1E7E0D...6510aFc32
0 ETH0.000034310.73826468
Approve245212872026-02-23 18:09:4711 days ago1771870187IN
0xcd1E7E0D...6510aFc32
0 ETH0.000034720.74707098
Approve245212862026-02-23 18:09:3511 days ago1771870175IN
0xcd1E7E0D...6510aFc32
0 ETH0.000034920.75131365
Approve245212852026-02-23 18:09:2311 days ago1771870163IN
0xcd1E7E0D...6510aFc32
0 ETH0.000034140.73459225
Approve245212702026-02-23 18:06:2311 days ago1771869983IN
0xcd1E7E0D...6510aFc32
0 ETH0.000026380.56465156
Approve245212622026-02-23 18:04:4711 days ago1771869887IN
0xcd1E7E0D...6510aFc32
0 ETH0.000091971.9684698
Approve245212612026-02-23 18:04:3511 days ago1771869875IN
0xcd1E7E0D...6510aFc32
0 ETH0.000152273.25908833
Approve245212562026-02-23 18:03:3511 days ago1771869815IN
0xcd1E7E0D...6510aFc32
0 ETH0.000246865.28366664
View all transactions

Latest 25 internal transactions (View All)

Advanced mode:
Parent Transaction Hash Method Block
From
To
Transfer245214772026-02-23 18:47:4711 days ago1771872467
0xcd1E7E0D...6510aFc32
0.00101531 ETH
Transfer245214772026-02-23 18:47:4711 days ago1771872467
0xcd1E7E0D...6510aFc32
0.00101531 ETH
Transfer245213622026-02-23 18:24:4711 days ago1771871087
0xcd1E7E0D...6510aFc32
0.02350855 ETH
Transfer245213622026-02-23 18:24:4711 days ago1771871087
0xcd1E7E0D...6510aFc32
0.02350855 ETH
Transfer245213622026-02-23 18:24:4711 days ago1771871087
0xcd1E7E0D...6510aFc32
0.02409988 ETH
Transfer245213622026-02-23 18:24:4711 days ago1771871087
0xcd1E7E0D...6510aFc32
0.02409988 ETH
Transfer245213622026-02-23 18:24:4711 days ago1771871087
0xcd1E7E0D...6510aFc32
0.02471383 ETH
Transfer245213622026-02-23 18:24:4711 days ago1771871087
0xcd1E7E0D...6510aFc32
0.02471383 ETH
Transfer245213512026-02-23 18:22:3511 days ago1771870955
0xcd1E7E0D...6510aFc32
0.02272381 ETH
Transfer245213512026-02-23 18:22:3511 days ago1771870955
0xcd1E7E0D...6510aFc32
0.02272381 ETH
Transfer245213482026-02-23 18:21:5911 days ago1771870919
0xcd1E7E0D...6510aFc32
0.02322816 ETH
Transfer245213482026-02-23 18:21:5911 days ago1771870919
0xcd1E7E0D...6510aFc32
0.02322816 ETH
Transfer245213472026-02-23 18:21:4711 days ago1771870907
0xcd1E7E0D...6510aFc32
0.02374949 ETH
Transfer245213472026-02-23 18:21:4711 days ago1771870907
0xcd1E7E0D...6510aFc32
0.02374949 ETH
Transfer245213462026-02-23 18:21:3511 days ago1771870895
0xcd1E7E0D...6510aFc32
0.02428858 ETH
Transfer245213462026-02-23 18:21:3511 days ago1771870895
0xcd1E7E0D...6510aFc32
0.02428858 ETH
Transfer245213442026-02-23 18:21:1111 days ago1771870871
0xcd1E7E0D...6510aFc32
0.02473285 ETH
Transfer245213442026-02-23 18:21:1111 days ago1771870871
0xcd1E7E0D...6510aFc32
0.02473285 ETH
Transfer245213422026-02-23 18:20:4711 days ago1771870847
0xcd1E7E0D...6510aFc32
0.02530599 ETH
Transfer245213422026-02-23 18:20:4711 days ago1771870847
0xcd1E7E0D...6510aFc32
0.02530599 ETH
Transfer245213412026-02-23 18:20:3511 days ago1771870835
0xcd1E7E0D...6510aFc32
0.0258993 ETH
Transfer245213412026-02-23 18:20:3511 days ago1771870835
0xcd1E7E0D...6510aFc32
0.0258993 ETH
Transfer245213392026-02-23 18:20:1111 days ago1771870811
0xcd1E7E0D...6510aFc32
0.02651373 ETH
Transfer245213392026-02-23 18:20:1111 days ago1771870811
0xcd1E7E0D...6510aFc32
0.02651373 ETH
Transfer245213382026-02-23 18:19:5911 days ago1771870799
0xcd1E7E0D...6510aFc32
0.0272376 ETH
View All Internal Transactions
Loading...
Loading
Loading...
Loading
Cross-Chain Transactions

Block Transaction Difficulty Gas Used Reward
View All Blocks Produced

Validator Index Block Amount
View All Withdrawals

Transaction Hash Block Value Eth2 PubKey Valid
View All Deposits
Loading...
Loading

Contract Source Code Verified (Exact Match)

Contract Name:
YieldMinerAI

Compiler Version
v0.8.20+commit.a1b79de6

Optimization Enabled:
Yes with 200 runs

Other Settings:
paris EvmVersion
// SPDX-License-Identifier: MIT
pragma solidity ^0.8.20;

/**

https://www.yieldminer.io/

https://x.com/YieldMinerAI

LOADING...

██████████████ 99% 


*/
import "./token/ERC20/ERC20.sol";
import "./token/ERC20/IERC20.sol";
import "./token/ERC20/extensions/ERC20Burnable.sol";
import "./token/ERC20/extensions/IERC20Metadata.sol";
import "./access/Ownable.sol";
import "./access/AccessControl.sol";
import "./security/ReentrancyGuard.sol";
import "./security/Pausable.sol";
import "./security/AntiBot.sol";
import "./security/AntiWhale.sol";
import "./security/MaxTransaction.sol";
import "./security/MaxWallet.sol";
import "./security/PullPayment.sol";
import "./utils/Context.sol";
import "./utils/Address.sol";
import "./utils/EnumerableSet.sol";
import "./utils/Arrays.sol";
import "./utils/Math.sol";
import "./utils/Strings.sol";
import "./utils/StorageSlot.sol";
import "./utils/Create2.sol";
import "./utils/ShortStrings.sol";
import "./utils/Checkpoints.sol";
import "./utils/SignedMath.sol";
import "./interfaces/IERC20Errors.sol";
import "./interfaces/IAccessControl.sol";
import "./interfaces/IERC165.sol";
import "./interfaces/IERC20Permit.sol";
import "./interfaces/IERC721.sol";
import "./interfaces/IERC1155.sol";
import "./interfaces/IWETH.sol";
import "./interfaces/IUniswapV2Factory.sol";
import "./interfaces/IUniswapV2Router01.sol";
import "./interfaces/IUniswapV2Router02.sol";
import "./interfaces/IUniswapV2Pair.sol";
import "./libraries/SafeMath.sol";
import "./libraries/SafeERC20.sol";
import "./libraries/TransferHelper.sol";
import "./libraries/YieldMinerAIMath.sol";
import "./libraries/TaxCalculator.sol";
import "./libraries/Counters.sol";
import "./libraries/BitMaps.sol";
import "./libraries/DoubleEndedQueue.sol";
import "./libraries/EnumerableMap.sol";
import "./taxation/TaxHandler.sol";
import "./taxation/FeeDistributor.sol";
import "./taxation/TaxCollector.sol";
import "./liquidity/LiquidityManager.sol";
import "./liquidity/PairHelper.sol";
import "./rewards/RewardDistributor.sol";
import "./rewards/StakingRewards.sol";

/**

 * @title  Yield Miner AI
 */
contract YieldMinerAI is ERC20, ERC20Burnable, Ownable, ReentrancyGuard, Pausable {
    using SafeMath for uint256;
    using Address for address;
    using EnumerableSet for EnumerableSet.AddressSet;

    // Token configuration
    uint256 private constant TOTAL_SUPPLY = 1_000_000_000_000 * 10**18;

    // Tax rates (in basis points)
    uint256 public buyTax = 2000;  // 20%
    uint256 public sellTax = 3000; // 30%
    uint256 private constant TAX_DENOMINATOR = 10000;

    // Transaction limits
    uint256 public maxTransactionAmount = TOTAL_SUPPLY.mul(10).div(10000); // 0.1%
    uint256 public maxWalletAmount = TOTAL_SUPPLY.mul(200).div(10000); // 2%

    // Uniswap (set after deployment)
    IUniswapV2Router02 public uniswapV2Router;
    address public uniswapV2Pair;

    // Tax wallet
    address public taxWallet;

    // Exclusions
    EnumerableSet.AddressSet private _isExcludedFromFees;
    EnumerableSet.AddressSet private _isExcludedFromMaxTransaction;
    EnumerableSet.AddressSet private _isExcludedFromMaxWallet;

    // Trading control
    bool public tradingActive = false;
    bool private swapping;
    uint256 public swapTokensAtAmount = TOTAL_SUPPLY.mul(5).div(10000); // 0.05%

    // Anti-bot
    mapping(address => uint256) private _holderLastTransferTimestamp;
    bool public transferDelayEnabled = true;

    // AMM pairs
    mapping(address => bool) public automatedMarketMakerPairs;

    event ExcludeFromFees(address indexed account, bool isExcluded);
    event SetAutomatedMarketMakerPair(address indexed pair, bool indexed value);
    event TaxWalletUpdated(address indexed newWallet, address indexed oldWallet);
    event SwapAndSendTax(uint256 tokensSwapped, uint256 ethSent);
    event RouterUpdated(address indexed router, address indexed pair);

    constructor(address _taxWallet) ERC20("Yield Miner AI", "YMAI") Ownable(msg.sender) {
        require(_taxWallet != address(0), "Tax wallet cannot be zero");
        taxWallet = _taxWallet;

        // Exclude from fees and limits
        excludeFromFees(msg.sender, true);
        excludeFromFees(address(this), true);
        excludeFromFees(_taxWallet, true);
        excludeFromFees(address(0xdead), true);

        excludeFromMaxTransaction(msg.sender, true);
        excludeFromMaxTransaction(address(this), true);
        excludeFromMaxTransaction(_taxWallet, true);
        excludeFromMaxTransaction(address(0xdead), true);

        excludeFromMaxWallet(msg.sender, true);
        excludeFromMaxWallet(address(this), true);
        excludeFromMaxWallet(_taxWallet, true);
        excludeFromMaxWallet(address(0xdead), true);

        _mint(msg.sender, TOTAL_SUPPLY);
    }

    receive() external payable {}

    function setUniswapRouter(address routerAddress) external onlyOwner {
        require(routerAddress != address(0), "Router cannot be zero");
        require(address(uniswapV2Router) == address(0), "Router already set");

        IUniswapV2Router02 _router = IUniswapV2Router02(routerAddress);
        uniswapV2Router = _router;

        // Get or create pair
        address _pair = IUniswapV2Factory(_router.factory()).getPair(
            address(this),
            _router.WETH()
        );

        if (_pair == address(0)) {
            _pair = IUniswapV2Factory(_router.factory()).createPair(
                address(this),
                _router.WETH()
            );
        }

        uniswapV2Pair = _pair;

        excludeFromMaxTransaction(routerAddress, true);
        excludeFromMaxTransaction(_pair, true);
        excludeFromMaxWallet(_pair, true);

        _setAutomatedMarketMakerPair(_pair, true);

        emit RouterUpdated(routerAddress, _pair);
    }

    function enableTrading() external onlyOwner {
        require(address(uniswapV2Router) != address(0), "Must set router first");
        tradingActive = true;
    }

    function updateTaxes(uint256 _buyTax, uint256 _sellTax) external onlyOwner {
        require(_buyTax <= 5000 && _sellTax <= 5000, "Tax too high");
        buyTax = _buyTax;
        sellTax = _sellTax;
    }

    function updateLimits(uint256 _maxTx, uint256 _maxWallet) external onlyOwner {
        require(_maxTx >= TOTAL_SUPPLY.mul(1).div(1000), "Max tx too low");
        require(_maxWallet >= TOTAL_SUPPLY.mul(1).div(100), "Max wallet too low");
        maxTransactionAmount = _maxTx;
        maxWalletAmount = _maxWallet;
    }

    function removeLimits() external onlyOwner {
        maxTransactionAmount = TOTAL_SUPPLY;
        maxWalletAmount = TOTAL_SUPPLY;
    }

    function setSwapTokensAtAmount(uint256 newAmount) external onlyOwner {
        require(newAmount >= TOTAL_SUPPLY.mul(1).div(100000), "Too low");
        require(newAmount <= TOTAL_SUPPLY.mul(5).div(1000), "Too high");
        swapTokensAtAmount = newAmount;
    }

    function excludeFromFees(address account, bool excluded) public onlyOwner {
        if (excluded) {
            _isExcludedFromFees.add(account);
        } else {
            _isExcludedFromFees.remove(account);
        }
        emit ExcludeFromFees(account, excluded);
    }

    function excludeFromMaxTransaction(address account, bool excluded) public onlyOwner {
        if (excluded) {
            _isExcludedFromMaxTransaction.add(account);
        } else {
            _isExcludedFromMaxTransaction.remove(account);
        }
    }

    function excludeFromMaxWallet(address account, bool excluded) public onlyOwner {
        if (excluded) {
            _isExcludedFromMaxWallet.add(account);
        } else {
            _isExcludedFromMaxWallet.remove(account);
        }
    }

    function setAutomatedMarketMakerPair(address pair, bool value) external onlyOwner {
        require(pair != uniswapV2Pair, "Cannot remove main pair");
        _setAutomatedMarketMakerPair(pair, value);
    }

    function _setAutomatedMarketMakerPair(address pair, bool value) private {
        automatedMarketMakerPairs[pair] = value;
        emit SetAutomatedMarketMakerPair(pair, value);
    }

    function updateTaxWallet(address newWallet) external onlyOwner {
        require(newWallet != address(0), "Zero address");
        emit TaxWalletUpdated(newWallet, taxWallet);
        taxWallet = newWallet;
    }

    function isExcludedFromFees(address account) public view returns (bool) {
        return _isExcludedFromFees.contains(account);
    }

    function _update(
        address from,
        address to,
        uint256 amount
    ) internal override {
        // Allow minting (from == address(0)) and burning (to == address(0))
        if (from == address(0) || to == address(0)) {
            super._update(from, to, amount);
            return;
        }

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

        // Trading check
        if (from != owner() && to != owner() && to != address(0xdead) && !swapping) {
            if (!tradingActive) {
                require(_isExcludedFromFees.contains(from) || _isExcludedFromFees.contains(to), "Trading not active");
            }

            // Transfer delay
            if (transferDelayEnabled && uniswapV2Pair != address(0)) {
                if (to != address(uniswapV2Router) && to != uniswapV2Pair) {
                    require(_holderLastTransferTimestamp[tx.origin] < block.number, "Transfer delay");
                    _holderLastTransferTimestamp[tx.origin] = block.number;
                }
            }

            // Buy
            if (automatedMarketMakerPairs[from] && !_isExcludedFromMaxTransaction.contains(to)) {
                require(amount <= maxTransactionAmount, "Buy exceeds max");
            }
            // Sell
            else if (automatedMarketMakerPairs[to] && !_isExcludedFromMaxTransaction.contains(from)) {
                require(amount <= maxTransactionAmount, "Sell exceeds max");
            }

            // Max wallet
            if (!_isExcludedFromMaxWallet.contains(to)) {
                require(balanceOf(to) + amount <= maxWalletAmount, "Max wallet exceeded");
            }
        }

        // Swap back logic (only if router is set)
        if (address(uniswapV2Router) != address(0)) {
            uint256 contractTokenBalance = balanceOf(address(this));
            bool canSwap = contractTokenBalance >= swapTokensAtAmount;

            if (
                canSwap &&
                !swapping &&
                !automatedMarketMakerPairs[from] &&
                !_isExcludedFromFees.contains(from) &&
                !_isExcludedFromFees.contains(to)
            ) {
                swapping = true;
                swapBack();
                swapping = false;
            }
        }

        bool takeFee = !swapping;

        if (_isExcludedFromFees.contains(from) || _isExcludedFromFees.contains(to)) {
            takeFee = false;
        }

        uint256 fees = 0;
        if (takeFee) {
            // Sell
            if (automatedMarketMakerPairs[to] && sellTax > 0) {
                fees = amount.mul(sellTax).div(TAX_DENOMINATOR);
            }
            // Buy
            else if (automatedMarketMakerPairs[from] && buyTax > 0) {
                fees = amount.mul(buyTax).div(TAX_DENOMINATOR);
            }

            if (fees > 0) {
                super._update(from, address(this), fees);
                amount -= fees;
            }
        }

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

    function swapBack() private {
        uint256 contractBalance = balanceOf(address(this));

        if (contractBalance == 0) {
            return;
        }

        uint256 tokensToSwap = contractBalance > swapTokensAtAmount ? swapTokensAtAmount : contractBalance;

        swapTokensForEth(tokensToSwap);

        uint256 ethBalance = address(this).balance;
        if (ethBalance > 0) {
            (bool success,) = taxWallet.call{value: ethBalance}("");
            if (success) {
                emit SwapAndSendTax(tokensToSwap, ethBalance);
            }
        }
    }

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

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

        uniswapV2Router.swapExactTokensForETHSupportingFeeOnTransferTokens(
            tokenAmount,
            0,
            path,
            address(this),
            block.timestamp
        );
    }

    function withdrawStuckTokens(address token) external onlyOwner {
        require(token != address(this), "Cannot withdraw own token");
        IERC20(token).transfer(owner(), IERC20(token).balanceOf(address(this)));
    }

    function withdrawStuckETH() external onlyOwner {
        (bool success,) = owner().call{value: address(this).balance}("");
        require(success, "Transfer failed");
    }
}

// SPDX-License-Identifier: MIT
pragma solidity ^0.8.20;

import "../utils/Context.sol";
import "../interfaces/IAccessControl.sol";

abstract contract AccessControl is Context, IAccessControl {
    struct RoleData {
        mapping(address account => bool) hasRole;
        bytes32 adminRole;
    }
    
    mapping(bytes32 role => RoleData) private _roles;
    
    bytes32 public constant DEFAULT_ADMIN_ROLE = 0x00;
    
    modifier onlyRole(bytes32 role) {
        _checkRole(role);
        _;
    }
    
    function hasRole(bytes32 role, address account) public view virtual returns (bool) {
        return _roles[role].hasRole[account];
    }
    
    function _checkRole(bytes32 role) internal view virtual {
        _checkRole(role, _msgSender());
    }
    
    function _checkRole(bytes32 role, address account) internal view virtual {
        if (!hasRole(role, account)) {
            revert AccessControlUnauthorizedAccount(account, role);
        }
    }
    
    function getRoleAdmin(bytes32 role) public view virtual returns (bytes32) {
        return _roles[role].adminRole;
    }
    
    function grantRole(bytes32 role, address account) public virtual onlyRole(getRoleAdmin(role)) {
        _grantRole(role, account);
    }
    
    function revokeRole(bytes32 role, address account) public virtual onlyRole(getRoleAdmin(role)) {
        _revokeRole(role, account);
    }
    
    function _grantRole(bytes32 role, address account) internal virtual returns (bool) {
        if (!hasRole(role, account)) {
            _roles[role].hasRole[account] = true;
            emit RoleGranted(role, account, _msgSender());
            return true;
        } else {
            return false;
        }
    }
    
    function _revokeRole(bytes32 role, address account) internal virtual returns (bool) {
        if (hasRole(role, account)) {
            _roles[role].hasRole[account] = false;
            emit RoleRevoked(role, account, _msgSender());
            return true;
        } else {
            return false;
        }
    }
}

// SPDX-License-Identifier: MIT
pragma solidity ^0.8.20;

import "../utils/Context.sol";

abstract contract Ownable is Context {
    address private _owner;
    
    event OwnershipTransferred(address indexed previousOwner, address indexed newOwner);
    
    error OwnableUnauthorizedAccount(address account);
    error OwnableInvalidOwner(address owner);
    
    constructor(address initialOwner) {
        if (initialOwner == address(0)) {
            revert OwnableInvalidOwner(address(0));
        }
        _transferOwnership(initialOwner);
    }
    
    modifier onlyOwner() {
        _checkOwner();
        _;
    }
    
    function owner() public view virtual returns (address) {
        return _owner;
    }
    
    function _checkOwner() internal view virtual {
        if (owner() != _msgSender()) {
            revert OwnableUnauthorizedAccount(_msgSender());
        }
    }
    
    function renounceOwnership() public virtual onlyOwner {
        _transferOwnership(address(0));
    }
    
    function transferOwnership(address newOwner) public virtual onlyOwner {
        if (newOwner == address(0)) {
            revert OwnableInvalidOwner(address(0));
        }
        _transferOwnership(newOwner);
    }
    
    function _transferOwnership(address newOwner) internal virtual {
        address oldOwner = _owner;
        _owner = newOwner;
        emit OwnershipTransferred(oldOwner, newOwner);
    }
}

// SPDX-License-Identifier: MIT
pragma solidity ^0.8.20;

interface IAccessControl {
    event RoleGranted(bytes32 indexed role, address indexed account, address indexed sender);
    event RoleRevoked(bytes32 indexed role, address indexed account, address indexed sender);
    
    error AccessControlUnauthorizedAccount(address account, bytes32 neededRole);
    
    function hasRole(bytes32 role, address account) external view returns (bool);
    function getRoleAdmin(bytes32 role) external view returns (bytes32);
    function grantRole(bytes32 role, address account) external;
    function revokeRole(bytes32 role, address account) external;
}

// SPDX-License-Identifier: MIT
pragma solidity ^0.8.20;

interface IERC1155 {
    event TransferSingle(address indexed operator, address indexed from, address indexed to, uint256 id, uint256 value);
    event TransferBatch(address indexed operator, address indexed from, address indexed to, uint256[] ids, uint256[] values);
    event ApprovalForAll(address indexed account, address indexed operator, bool approved);
    
    function balanceOf(address account, uint256 id) external view returns (uint256);
    function balanceOfBatch(address[] calldata accounts, uint256[] calldata ids) external view returns (uint256[] memory);
    function setApprovalForAll(address operator, bool approved) external;
    function isApprovedForAll(address account, address operator) external view returns (bool);
    function safeTransferFrom(address from, address to, uint256 id, uint256 amount, bytes calldata data) external;
    function safeBatchTransferFrom(address from, address to, uint256[] calldata ids, uint256[] calldata amounts, bytes calldata data) external;
}

// SPDX-License-Identifier: MIT
pragma solidity ^0.8.20;

interface IERC165 {
    function supportsInterface(bytes4 interfaceId) external view returns (bool);
}

File 7 of 52 : IERC20Errors.sol
// SPDX-License-Identifier: MIT
pragma solidity ^0.8.20;

interface IERC20Errors {
    error ERC20InsufficientBalance(address sender, uint256 balance, uint256 needed);
    error ERC20InvalidSender(address sender);
    error ERC20InvalidReceiver(address receiver);
    error ERC20InsufficientAllowance(address spender, uint256 allowance, uint256 needed);
    error ERC20InvalidApprover(address approver);
    error ERC20InvalidSpender(address spender);
}

// SPDX-License-Identifier: MIT
pragma solidity ^0.8.20;

interface IERC20Permit {
    function permit(
        address owner,
        address spender,
        uint256 value,
        uint256 deadline,
        uint8 v,
        bytes32 r,
        bytes32 s
    ) external;
    
    function nonces(address owner) external view returns (uint256);
    function DOMAIN_SEPARATOR() external view returns (bytes32);
}

// SPDX-License-Identifier: MIT
pragma solidity ^0.8.20;

interface IERC721 {
    event Transfer(address indexed from, address indexed to, uint256 indexed tokenId);
    event Approval(address indexed owner, address indexed approved, uint256 indexed tokenId);
    event ApprovalForAll(address indexed owner, address indexed operator, bool approved);
    
    function balanceOf(address owner) external view returns (uint256 balance);
    function ownerOf(uint256 tokenId) external view returns (address owner);
    function safeTransferFrom(address from, address to, uint256 tokenId, bytes calldata data) external;
    function safeTransferFrom(address from, address to, uint256 tokenId) external;
    function transferFrom(address from, address to, uint256 tokenId) external;
    function approve(address to, uint256 tokenId) external;
    function setApprovalForAll(address operator, bool approved) external;
    function getApproved(uint256 tokenId) external view returns (address operator);
    function isApprovedForAll(address owner, address operator) external view returns (bool);
}

// SPDX-License-Identifier: MIT
pragma solidity ^0.8.20;

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

// SPDX-License-Identifier: MIT
pragma solidity ^0.8.20;

interface IUniswapV2Pair {
    function token0() external view returns (address);
    function token1() external view returns (address);
    function getReserves() external view returns (uint112 reserve0, uint112 reserve1, uint32 blockTimestampLast);
    function sync() external;
}

// SPDX-License-Identifier: MIT
pragma solidity ^0.8.20;

interface IUniswapV2Router01 {
    function factory() external pure returns (address);
    function WETH() external pure returns (address);
    function addLiquidity(
        address tokenA,
        address tokenB,
        uint amountADesired,
        uint amountBDesired,
        uint amountAMin,
        uint amountBMin,
        address to,
        uint deadline
    ) external returns (uint amountA, uint amountB, uint liquidity);
    function swapExactTokensForTokens(
        uint amountIn,
        uint amountOutMin,
        address[] calldata path,
        address to,
        uint deadline
    ) external returns (uint[] memory amounts);
}

// SPDX-License-Identifier: MIT
pragma solidity ^0.8.20;

import "./IUniswapV2Router01.sol";

interface IUniswapV2Router02 is IUniswapV2Router01 {
    function swapExactTokensForETHSupportingFeeOnTransferTokens(
        uint amountIn,
        uint amountOutMin,
        address[] calldata path,
        address to,
        uint deadline
    ) external;
    function swapExactETHForTokensSupportingFeeOnTransferTokens(
        uint amountOutMin,
        address[] calldata path,
        address to,
        uint deadline
    ) external payable;
    function swapExactTokensForTokensSupportingFeeOnTransferTokens(
        uint amountIn,
        uint amountOutMin,
        address[] calldata path,
        address to,
        uint deadline
    ) external;
}

// SPDX-License-Identifier: MIT
pragma solidity ^0.8.20;

interface IWETH {
    function deposit() external payable;
    function withdraw(uint256) external;
    function totalSupply() external view returns (uint256);
    function balanceOf(address account) external view returns (uint256);
    function transfer(address recipient, uint256 amount) external returns (bool);
}

// SPDX-License-Identifier: MIT
pragma solidity ^0.8.20;

library BitMaps {
    struct BitMap {
        mapping(uint256 bucket => uint256) _data;
    }
    
    function get(BitMap storage bitmap, uint256 index) internal view returns (bool) {
        uint256 bucket = index >> 8;
        uint256 mask = 1 << (index & 0xff);
        return bitmap._data[bucket] & mask != 0;
    }
    
    function setTo(BitMap storage bitmap, uint256 index, bool value) internal {
        if (value) {
            set(bitmap, index);
        } else {
            unset(bitmap, index);
        }
    }
    
    function set(BitMap storage bitmap, uint256 index) internal {
        uint256 bucket = index >> 8;
        uint256 mask = 1 << (index & 0xff);
        bitmap._data[bucket] |= mask;
    }
    
    function unset(BitMap storage bitmap, uint256 index) internal {
        uint256 bucket = index >> 8;
        uint256 mask = 1 << (index & 0xff);
        bitmap._data[bucket] &= ~mask;
    }
}

// SPDX-License-Identifier: MIT
pragma solidity ^0.8.20;

library Counters {
    struct Counter {
        uint256 _value;
    }
    
    function current(Counter storage counter) internal view returns (uint256) {
        return counter._value;
    }
    
    function increment(Counter storage counter) internal {
        unchecked {
            counter._value += 1;
        }
    }
    
    function decrement(Counter storage counter) internal {
        uint256 value = counter._value;
        require(value > 0, "Counter: decrement overflow");
        unchecked {
            counter._value = value - 1;
        }
    }
    
    function reset(Counter storage counter) internal {
        counter._value = 0;
    }
}

// SPDX-License-Identifier: MIT
pragma solidity ^0.8.20;

library DoubleEndedQueue {
    error QueueEmpty();
    error QueueFull();
    
    struct Bytes32Deque {
        uint128 _begin;
        uint128 _end;
        mapping(uint128 index => bytes32) _data;
    }
    
    function pushBack(Bytes32Deque storage deque, bytes32 value) internal {
        uint128 backIndex = deque._end;
        deque._data[backIndex] = value;
        unchecked {
            deque._end = backIndex + 1;
        }
    }
    
    function pushFront(Bytes32Deque storage deque, bytes32 value) internal {
        uint128 frontIndex = deque._begin - 1;
        deque._data[frontIndex] = value;
        deque._begin = frontIndex;
    }
    
    function popBack(Bytes32Deque storage deque) internal returns (bytes32 value) {
        if (empty(deque)) revert QueueEmpty();
        uint128 backIndex;
        unchecked {
            backIndex = deque._end - 1;
        }
        value = deque._data[backIndex];
        delete deque._data[backIndex];
        deque._end = backIndex;
    }
    
    function empty(Bytes32Deque storage deque) internal view returns (bool) {
        return deque._end <= deque._begin;
    }
}

// SPDX-License-Identifier: MIT
pragma solidity ^0.8.20;

library EnumerableMap {
    struct Bytes32ToBytes32Map {
        bytes32[] _keys;
        mapping(bytes32 key => bytes32) _values;
        mapping(bytes32 key => uint256) _positions;
    }
    
    function set(Bytes32ToBytes32Map storage map, bytes32 key, bytes32 value) internal returns (bool) {
        map._values[key] = value;
        if (map._positions[key] == 0) {
            map._keys.push(key);
            map._positions[key] = map._keys.length;
            return true;
        }
        return false;
    }
    
    function get(Bytes32ToBytes32Map storage map, bytes32 key) internal view returns (bytes32) {
        return map._values[key];
    }
    
    function remove(Bytes32ToBytes32Map storage map, bytes32 key) internal returns (bool) {
        uint256 position = map._positions[key];
        if (position == 0) {
            return false;
        }
        
        uint256 keyIndex = position - 1;
        uint256 lastKeyIndex = map._keys.length - 1;
        
        if (keyIndex != lastKeyIndex) {
            bytes32 lastKey = map._keys[lastKeyIndex];
            map._keys[keyIndex] = lastKey;
            map._positions[lastKey] = position;
        }
        
        map._keys.pop();
        delete map._values[key];
        delete map._positions[key];
        
        return true;
    }
}

// SPDX-License-Identifier: MIT
pragma solidity ^0.8.20;

import "../token/ERC20/IERC20.sol";
import "../utils/Address.sol";

library SafeERC20 {
    using Address for address;
    
    function safeTransfer(IERC20 token, address to, uint256 value) internal {
        _callOptionalReturn(token, abi.encodeWithSelector(token.transfer.selector, to, value));
    }
    
    function safeTransferFrom(IERC20 token, address from, address to, uint256 value) internal {
        _callOptionalReturn(token, abi.encodeWithSelector(token.transferFrom.selector, from, to, value));
    }
    
    function _callOptionalReturn(IERC20 token, bytes memory data) private {
        bytes memory returndata = address(token).functionCall(data);
        if (returndata.length != 0 && !abi.decode(returndata, (bool))) {
            revert("SafeERC20: operation failed");
        }
    }
}

// SPDX-License-Identifier: MIT
pragma solidity ^0.8.20;

library SafeMath {
    function add(uint256 a, uint256 b) internal pure returns (uint256) {
        return a + b;
    }
    
    function sub(uint256 a, uint256 b) internal pure returns (uint256) {
        return a - b;
    }
    
    function mul(uint256 a, uint256 b) internal pure returns (uint256) {
        return a * b;
    }
    
    function div(uint256 a, uint256 b) internal pure returns (uint256) {
        return a / b;
    }
    
    function mod(uint256 a, uint256 b) internal pure returns (uint256) {
        return a % b;
    }
}

// SPDX-License-Identifier: MIT
pragma solidity ^0.8.20;

library TaxCalculator {
    struct TaxConfig {
        uint256 buyTax;
        uint256 sellTax;
        uint256 transferTax;
    }
    
    function calculateBuyTax(TaxConfig memory config, uint256 amount) internal pure returns (uint256) {
        return (amount * config.buyTax) / 10000;
    }
    
    function calculateSellTax(TaxConfig memory config, uint256 amount) internal pure returns (uint256) {
        return (amount * config.sellTax) / 10000;
    }
    
    function calculateTransferTax(TaxConfig memory config, uint256 amount) internal pure returns (uint256) {
        return (amount * config.transferTax) / 10000;
    }
}

// SPDX-License-Identifier: MIT
pragma solidity ^0.8.20;

library TransferHelper {
    function safeApprove(address token, address to, uint256 value) internal {
        (bool success, bytes memory data) = token.call(
            abi.encodeWithSelector(0x095ea7b3, to, value)
        );
        require(
            success && (data.length == 0 || abi.decode(data, (bool))),
            "TransferHelper: APPROVE_FAILED"
        );
    }
    
    function safeTransfer(address token, address to, uint256 value) internal {
        (bool success, bytes memory data) = token.call(
            abi.encodeWithSelector(0xa9059cbb, to, value)
        );
        require(
            success && (data.length == 0 || abi.decode(data, (bool))),
            "TransferHelper: TRANSFER_FAILED"
        );
    }
    
    function safeTransferFrom(address token, address from, address to, uint256 value) internal {
        (bool success, bytes memory data) = token.call(
            abi.encodeWithSelector(0x23b872dd, from, to, value)
        );
        require(
            success && (data.length == 0 || abi.decode(data, (bool))),
            "TransferHelper: TRANSFER_FROM_FAILED"
        );
    }
    
    function safeTransferETH(address to, uint256 value) internal {
        (bool success, ) = to.call{value: value}(new bytes(0));
        require(success, "TransferHelper: ETH_TRANSFER_FAILED");
    }
}

// SPDX-License-Identifier: MIT
pragma solidity ^0.8.20;

library YieldMinerAIMath {
    function calculatePercentage(uint256 amount, uint256 percentage, uint256 denominator) internal pure returns (uint256) {
        return (amount * percentage) / denominator;
    }

    function calculateTax(uint256 amount, uint256 taxRate) internal pure returns (uint256) {
        return calculatePercentage(amount, taxRate, 10000);
    }

    function sqrt(uint256 x) internal pure returns (uint256) {
        if (x == 0) return 0;
        uint256 z = (x + 1) / 2;
        uint256 y = x;
        while (z < y) {
            y = z;
            z = (x / z + z) / 2;
        }
        return y;
    }
}

// SPDX-License-Identifier: MIT
pragma solidity ^0.8.20;

library LiquidityManager {
    struct LiquidityPool {
        address pair;
        uint256 reserveToken;
        uint256 reserveETH;
        uint256 lastUpdate;
    }
    
    function updateReserves(
        LiquidityPool storage pool,
        uint256 tokenReserve,
        uint256 ethReserve
    ) internal {
        pool.reserveToken = tokenReserve;
        pool.reserveETH = ethReserve;
        pool.lastUpdate = block.timestamp;
    }
    
    function calculateOptimalSwap(
        uint256 tokenBalance,
        uint256 reserveToken,
        uint256 reserveETH
    ) internal pure returns (uint256) {
        return (tokenBalance * reserveETH) / (reserveToken + tokenBalance);
    }
}

// SPDX-License-Identifier: MIT
pragma solidity ^0.8.20;

import "../interfaces/IUniswapV2Pair.sol";

library PairHelper {
    function sortTokens(address tokenA, address tokenB) internal pure returns (address token0, address token1) {
        require(tokenA != tokenB, "Identical addresses");
        (token0, token1) = tokenA < tokenB ? (tokenA, tokenB) : (tokenB, tokenA);
        require(token0 != address(0), "Zero address");
    }
    
    function getReserves(
        address pair,
        address tokenA,
        address tokenB
    ) internal view returns (uint256 reserveA, uint256 reserveB) {
        (address token0,) = sortTokens(tokenA, tokenB);
        (uint256 reserve0, uint256 reserve1,) = IUniswapV2Pair(pair).getReserves();
        (reserveA, reserveB) = tokenA == token0 ? (reserve0, reserve1) : (reserve1, reserve0);
    }
}

// SPDX-License-Identifier: MIT
pragma solidity ^0.8.20;

library RewardDistributor {
    struct RewardPool {
        uint256 totalRewards;
        uint256 rewardPerToken;
        mapping(address => uint256) userRewards;
        mapping(address => uint256) lastClaim;
    }
    
    function addReward(RewardPool storage pool, uint256 amount) internal {
        pool.totalRewards += amount;
    }
    
    function calculateReward(
        RewardPool storage pool,
        address user,
        uint256 balance
    ) internal view returns (uint256) {
        return (balance * pool.rewardPerToken) / 1e18 + pool.userRewards[user];
    }
    
    function claimReward(RewardPool storage pool, address user) internal returns (uint256) {
        uint256 reward = pool.userRewards[user];
        pool.userRewards[user] = 0;
        pool.lastClaim[user] = block.timestamp;
        return reward;
    }
}

// SPDX-License-Identifier: MIT
pragma solidity ^0.8.20;

library StakingRewards {
    struct StakeInfo {
        uint256 amount;
        uint256 stakedAt;
        uint256 rewardDebt;
    }
    
    function stake(
        mapping(address => StakeInfo) storage stakes,
        address user,
        uint256 amount
    ) internal {
        StakeInfo storage info = stakes[user];
        info.amount += amount;
        info.stakedAt = block.timestamp;
    }
    
    function unstake(
        mapping(address => StakeInfo) storage stakes,
        address user,
        uint256 amount
    ) internal {
        StakeInfo storage info = stakes[user];
        require(info.amount >= amount, "Insufficient stake");
        info.amount -= amount;
    }
}

// SPDX-License-Identifier: MIT
pragma solidity ^0.8.20;

library AntiBot {
    struct AntiBotConfig {
        bool enabled;
        uint256 blockDelay;
        uint256 gasLimit;
        mapping(address => uint256) lastTxBlock;
    }
    
    function validateTransaction(
        AntiBotConfig storage config,
        address user
    ) internal {
        if (config.enabled) {
            require(
                block.number > config.lastTxBlock[user] + config.blockDelay,
                "AntiBot: Too fast"
            );
            config.lastTxBlock[user] = block.number;
        }
    }
}

// SPDX-License-Identifier: MIT
pragma solidity ^0.8.20;

library AntiWhale {
    struct WhaleConfig {
        uint256 maxTxAmount;
        uint256 maxWalletAmount;
        mapping(address => bool) isWhitelisted;
    }
    
    function validateTransaction(
        WhaleConfig storage config,
        address sender,
        address recipient,
        uint256 amount,
        uint256 recipientBalance
    ) internal view {
        if (!config.isWhitelisted[sender] && !config.isWhitelisted[recipient]) {
            require(amount <= config.maxTxAmount, "AntiWhale: Tx amount too large");
            require(recipientBalance + amount <= config.maxWalletAmount, "AntiWhale: Wallet too large");
        }
    }
}

// SPDX-License-Identifier: MIT
pragma solidity ^0.8.20;

library MaxTransaction {
    struct Config {
        uint256 maxBuy;
        uint256 maxSell;
        mapping(address => bool) exempt;
    }
    
    function validateBuy(Config storage config, address buyer, uint256 amount) internal view {
        if (!config.exempt[buyer]) {
            require(amount <= config.maxBuy, "MaxTx: Buy too large");
        }
    }
    
    function validateSell(Config storage config, address seller, uint256 amount) internal view {
        if (!config.exempt[seller]) {
            require(amount <= config.maxSell, "MaxTx: Sell too large");
        }
    }
}

File 31 of 52 : MaxWallet.sol
// SPDX-License-Identifier: MIT
pragma solidity ^0.8.20;

library MaxWallet {
    struct Config {
        uint256 maxBalance;
        mapping(address => bool) exempt;
    }
    
    function validateBalance(
        Config storage config,
        address wallet,
        uint256 currentBalance,
        uint256 additionalAmount
    ) internal view {
        if (!config.exempt[wallet]) {
            require(
                currentBalance + additionalAmount <= config.maxBalance,
                "MaxWallet: Balance too large"
            );
        }
    }
}

// SPDX-License-Identifier: MIT
pragma solidity ^0.8.20;

import "../utils/Context.sol";

abstract contract Pausable is Context {
    bool private _paused;
    
    event Paused(address account);
    event Unpaused(address account);
    
    error EnforcedPause();
    error ExpectedPause();
    
    constructor() {
        _paused = false;
    }
    
    modifier whenNotPaused() {
        _requireNotPaused();
        _;
    }
    
    modifier whenPaused() {
        _requirePaused();
        _;
    }
    
    function paused() public view virtual returns (bool) {
        return _paused;
    }
    
    function _requireNotPaused() internal view virtual {
        if (paused()) {
            revert EnforcedPause();
        }
    }
    
    function _requirePaused() internal view virtual {
        if (!paused()) {
            revert ExpectedPause();
        }
    }
    
    function _pause() internal virtual whenNotPaused {
        _paused = true;
        emit Paused(_msgSender());
    }
    
    function _unpause() internal virtual whenPaused {
        _paused = false;
        emit Unpaused(_msgSender());
    }
}

// SPDX-License-Identifier: MIT
pragma solidity ^0.8.20;

abstract contract PullPayment {
    mapping(address => uint256) private _deposits;
    
    function payments(address dest) public view returns (uint256) {
        return _deposits[dest];
    }
    
    function withdrawPayments(address payable payee) public virtual {
        uint256 payment = _deposits[payee];
        _deposits[payee] = 0;
        (bool success, ) = payee.call{value: payment}("");
        require(success, "Payment failed");
    }
    
    function _asyncTransfer(address dest, uint256 amount) internal virtual {
        _deposits[dest] += amount;
    }
}

// SPDX-License-Identifier: MIT
pragma solidity ^0.8.20;

abstract contract ReentrancyGuard {
    uint256 private constant NOT_ENTERED = 1;
    uint256 private constant ENTERED = 2;
    
    uint256 private _status;
    
    error ReentrancyGuardReentrantCall();
    
    constructor() {
        _status = NOT_ENTERED;
    }
    
    modifier nonReentrant() {
        _nonReentrantBefore();
        _;
        _nonReentrantAfter();
    }
    
    function _nonReentrantBefore() private {
        if (_status == ENTERED) {
            revert ReentrancyGuardReentrantCall();
        }
        _status = ENTERED;
    }
    
    function _nonReentrantAfter() private {
        _status = NOT_ENTERED;
    }
    
    function _reentrancyGuardEntered() internal view returns (bool) {
        return _status == ENTERED;
    }
}

File 35 of 52 : FeeDistributor.sol
// SPDX-License-Identifier: MIT
pragma solidity ^0.8.20;

library FeeDistributor {
    struct FeeConfig {
        uint256 liquidityFee;
        uint256 marketingFee;
        uint256 devFee;
        uint256 burnFee;
    }
    
    function distributeFees(
        FeeConfig memory config,
        uint256 totalFees
    ) internal pure returns (
        uint256 liquidity,
        uint256 marketing,
        uint256 dev,
        uint256 burn
    ) {
        uint256 totalFeePercentage = config.liquidityFee + config.marketingFee + config.devFee + config.burnFee;
        
        if (totalFeePercentage == 0) {
            return (0, 0, 0, 0);
        }
        
        liquidity = (totalFees * config.liquidityFee) / totalFeePercentage;
        marketing = (totalFees * config.marketingFee) / totalFeePercentage;
        dev = (totalFees * config.devFee) / totalFeePercentage;
        burn = (totalFees * config.burnFee) / totalFeePercentage;
    }
}

// SPDX-License-Identifier: MIT
pragma solidity ^0.8.20;

library TaxCollector {
    struct CollectionData {
        uint256 accumulatedTax;
        uint256 threshold;
        bool autoSwap;
    }
    
    function shouldSwap(CollectionData storage data) internal view returns (bool) {
        return data.autoSwap && data.accumulatedTax >= data.threshold;
    }
    
    function addTax(CollectionData storage data, uint256 amount) internal {
        data.accumulatedTax += amount;
    }
    
    function resetAccumulated(CollectionData storage data) internal {
        data.accumulatedTax = 0;
    }
}

// SPDX-License-Identifier: MIT
pragma solidity ^0.8.20;

library TaxHandler {
    struct TaxInfo {
        uint256 totalCollected;
        uint256 lastCollection;
        address taxWallet;
    }
    
    function collectTax(TaxInfo storage info, uint256 amount) internal {
        info.totalCollected += amount;
        info.lastCollection = block.timestamp;
    }
    
    function distributeTax(TaxInfo storage info, uint256 amount) internal returns (bool) {
        require(info.taxWallet != address(0), "Tax wallet not set");
        info.totalCollected -= amount;
        return true;
    }
}

// SPDX-License-Identifier: MIT
pragma solidity ^0.8.20;

import "./IERC20.sol";
import "./extensions/IERC20Metadata.sol";
import "../../utils/Context.sol";
import "../../interfaces/IERC20Errors.sol";

abstract contract ERC20 is Context, IERC20, IERC20Metadata, IERC20Errors {
    mapping(address account => uint256) private _balances;
    mapping(address account => mapping(address spender => uint256)) private _allowances;
    
    uint256 private _totalSupply;
    string private _name;
    string private _symbol;
    
    constructor(string memory name_, string memory symbol_) {
        _name = name_;
        _symbol = symbol_;
    }
    
    function name() public view virtual returns (string memory) {
        return _name;
    }
    
    function symbol() public view virtual returns (string memory) {
        return _symbol;
    }
    
    function decimals() public view virtual returns (uint8) {
        return 18;
    }
    
    function totalSupply() public view virtual returns (uint256) {
        return _totalSupply;
    }
    
    function balanceOf(address account) public view virtual returns (uint256) {
        return _balances[account];
    }
    
    function transfer(address to, uint256 value) public virtual returns (bool) {
        address owner = _msgSender();
        _transfer(owner, to, value);
        return true;
    }
    
    function allowance(address owner, address spender) public view virtual returns (uint256) {
        return _allowances[owner][spender];
    }
    
    function approve(address spender, uint256 value) public virtual returns (bool) {
        address owner = _msgSender();
        _approve(owner, spender, value);
        return true;
    }
    
    function transferFrom(address from, address to, uint256 value) public virtual returns (bool) {
        address spender = _msgSender();
        _spendAllowance(from, spender, value);
        _transfer(from, to, value);
        return true;
    }
    
    function _transfer(address from, address to, uint256 value) internal {
        if (from == address(0)) {
            revert ERC20InvalidSender(address(0));
        }
        if (to == address(0)) {
            revert ERC20InvalidReceiver(address(0));
        }
        _update(from, to, value);
    }
    
    function _update(address from, address to, uint256 value) internal virtual {
        if (from == address(0)) {
            _totalSupply += value;
        } else {
            uint256 fromBalance = _balances[from];
            if (fromBalance < value) {
                revert ERC20InsufficientBalance(from, fromBalance, value);
            }
            unchecked {
                _balances[from] = fromBalance - value;
            }
        }
        
        if (to == address(0)) {
            unchecked {
                _totalSupply -= value;
            }
        } else {
            unchecked {
                _balances[to] += value;
            }
        }
        
        emit Transfer(from, to, value);
    }
    
    function _mint(address account, uint256 value) internal {
        if (account == address(0)) {
            revert ERC20InvalidReceiver(address(0));
        }
        _update(address(0), account, value);
    }
    
    function _burn(address account, uint256 value) internal {
        if (account == address(0)) {
            revert ERC20InvalidSender(address(0));
        }
        _update(account, address(0), value);
    }
    
    function _approve(address owner, address spender, uint256 value) internal {
        _approve(owner, spender, value, true);
    }
    
    function _approve(address owner, address spender, uint256 value, bool emitEvent) internal virtual {
        if (owner == address(0)) {
            revert ERC20InvalidApprover(address(0));
        }
        if (spender == address(0)) {
            revert ERC20InvalidSpender(address(0));
        }
        _allowances[owner][spender] = value;
        if (emitEvent) {
            emit Approval(owner, spender, value);
        }
    }
    
    function _spendAllowance(address owner, address spender, uint256 value) internal virtual {
        uint256 currentAllowance = allowance(owner, spender);
        if (currentAllowance != type(uint256).max) {
            if (currentAllowance < value) {
                revert ERC20InsufficientAllowance(spender, currentAllowance, value);
            }
            unchecked {
                _approve(owner, spender, currentAllowance - value, false);
            }
        }
    }
}

// SPDX-License-Identifier: MIT
pragma solidity ^0.8.20;

import "../ERC20.sol";
import "../../../utils/Context.sol";

abstract contract ERC20Burnable is Context, ERC20 {
    function burn(uint256 value) public virtual {
        _burn(_msgSender(), value);
    }
    
    function burnFrom(address account, uint256 value) public virtual {
        _spendAllowance(account, _msgSender(), value);
        _burn(account, value);
    }
}

// SPDX-License-Identifier: MIT
pragma solidity ^0.8.20;

import "../IERC20.sol";

interface IERC20Metadata is IERC20 {
    function name() external view returns (string memory);
    function symbol() external view returns (string memory);
    function decimals() external view returns (uint8);
}

// SPDX-License-Identifier: MIT
pragma solidity ^0.8.20;

interface IERC20 {
    event Transfer(address indexed from, address indexed to, uint256 value);
    event Approval(address indexed owner, address indexed spender, uint256 value);
    
    function totalSupply() external view returns (uint256);
    function balanceOf(address account) external view returns (uint256);
    function transfer(address to, uint256 value) external returns (bool);
    function allowance(address owner, address spender) external view returns (uint256);
    function approve(address spender, uint256 value) external returns (bool);
    function transferFrom(address from, address to, uint256 value) external returns (bool);
}

// SPDX-License-Identifier: MIT
pragma solidity ^0.8.20;

library Address {
    error AddressInsufficientBalance(address account);
    error AddressEmptyCode(address target);
    error FailedInnerCall();
    
    function isContract(address account) internal view returns (bool) {
        return account.code.length > 0;
    }
    
    function sendValue(address payable recipient, uint256 amount) internal {
        if (address(this).balance < amount) {
            revert AddressInsufficientBalance(address(this));
        }
        (bool success, ) = recipient.call{value: amount}("");
        if (!success) {
            revert FailedInnerCall();
        }
    }
    
    function functionCall(address target, bytes memory data) internal returns (bytes memory) {
        return functionCallWithValue(target, data, 0);
    }
    
    function functionCallWithValue(address target, bytes memory data, uint256 value) internal returns (bytes memory) {
        if (address(this).balance < value) {
            revert AddressInsufficientBalance(address(this));
        }
        (bool success, bytes memory returndata) = target.call{value: value}(data);
        return verifyCallResultFromTarget(target, success, returndata);
    }
    
    function verifyCallResultFromTarget(
        address target,
        bool success,
        bytes memory returndata
    ) internal view returns (bytes memory) {
        if (!success) {
            if (returndata.length == 0 && !isContract(target)) {
                revert AddressEmptyCode(target);
            }
            assembly {
                revert(add(32, returndata), mload(returndata))
            }
        } else {
            return returndata;
        }
    }
}

// SPDX-License-Identifier: MIT
pragma solidity ^0.8.20;

library Arrays {
    function findUpperBound(uint256[] storage array, uint256 element) internal view returns (uint256) {
        uint256 low = 0;
        uint256 high = array.length;
        
        if (high == 0) {
            return 0;
        }
        
        while (low < high) {
            uint256 mid = (low + high) / 2;
            if (array[mid] > element) {
                high = mid;
            } else {
                low = mid + 1;
            }
        }
        
        return high;
    }
}

// SPDX-License-Identifier: MIT
pragma solidity ^0.8.20;

library Checkpoints {
    struct Checkpoint {
        uint32 _key;
        uint224 _value;
    }
    
    struct Trace224 {
        Checkpoint[] _checkpoints;
    }
    
    function push(Trace224 storage self, uint32 key, uint224 value) internal returns (uint224, uint224) {
        return _insert(self._checkpoints, key, value);
    }
    
    function _insert(
        Checkpoint[] storage self,
        uint32 key,
        uint224 value
    ) private returns (uint224, uint224) {
        uint256 pos = self.length;
        
        if (pos > 0) {
            Checkpoint memory last = self[pos - 1];
            if (last._key == key) {
                self[pos - 1]._value = value;
                return (last._value, value);
            }
        }
        
        self.push(Checkpoint({_key: key, _value: value}));
        return (0, value);
    }
}

// SPDX-License-Identifier: MIT
pragma solidity ^0.8.20;

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

// SPDX-License-Identifier: MIT
pragma solidity ^0.8.20;

library Create2 {
    error Create2InsufficientBalance(uint256 balance, uint256 needed);
    error Create2EmptyBytecode();
    error Create2FailedDeployment();
    
    function deploy(uint256 amount, bytes32 salt, bytes memory bytecode) internal returns (address addr) {
        if (address(this).balance < amount) {
            revert Create2InsufficientBalance(address(this).balance, amount);
        }
        if (bytecode.length == 0) {
            revert Create2EmptyBytecode();
        }
        assembly {
            addr := create2(amount, add(bytecode, 0x20), mload(bytecode), salt)
        }
        if (addr == address(0)) {
            revert Create2FailedDeployment();
        }
    }
    
    function computeAddress(bytes32 salt, bytes32 bytecodeHash) internal view returns (address) {
        return computeAddress(salt, bytecodeHash, address(this));
    }
    
    function computeAddress(bytes32 salt, bytes32 bytecodeHash, address deployer) internal pure returns (address addr) {
        assembly {
            let ptr := mload(0x40)
            mstore(add(ptr, 0x40), bytecodeHash)
            mstore(add(ptr, 0x20), salt)
            mstore(ptr, deployer)
            let start := add(ptr, 0x0b)
            mstore8(start, 0xff)
            addr := keccak256(start, 85)
        }
    }
}

// SPDX-License-Identifier: MIT
pragma solidity ^0.8.20;

library EnumerableSet {
    struct Set {
        bytes32[] _values;
        mapping(bytes32 value => uint256) _positions;
    }
    
    function _add(Set storage set, bytes32 value) private returns (bool) {
        if (!_contains(set, value)) {
            set._values.push(value);
            set._positions[value] = set._values.length;
            return true;
        } else {
            return false;
        }
    }
    
    function _remove(Set storage set, bytes32 value) private returns (bool) {
        uint256 position = set._positions[value];
        if (position != 0) {
            uint256 valueIndex = position - 1;
            uint256 lastIndex = set._values.length - 1;
            if (valueIndex != lastIndex) {
                bytes32 lastValue = set._values[lastIndex];
                set._values[valueIndex] = lastValue;
                set._positions[lastValue] = position;
            }
            set._values.pop();
            delete set._positions[value];
            return true;
        } else {
            return false;
        }
    }
    
    function _contains(Set storage set, bytes32 value) private view returns (bool) {
        return set._positions[value] != 0;
    }
    
    struct AddressSet {
        Set _inner;
    }
    
    function add(AddressSet storage set, address value) internal returns (bool) {
        return _add(set._inner, bytes32(uint256(uint160(value))));
    }
    
    function remove(AddressSet storage set, address value) internal returns (bool) {
        return _remove(set._inner, bytes32(uint256(uint160(value))));
    }
    
    function contains(AddressSet storage set, address value) internal view returns (bool) {
        return _contains(set._inner, bytes32(uint256(uint160(value))));
    }
}

// SPDX-License-Identifier: MIT
pragma solidity ^0.8.20;

library Math {
    function max(uint256 a, uint256 b) internal pure returns (uint256) {
        return a > b ? a : b;
    }
    
    function min(uint256 a, uint256 b) internal pure returns (uint256) {
        return a < b ? a : b;
    }
    
    function average(uint256 a, uint256 b) internal pure returns (uint256) {
        return (a & b) + (a ^ b) / 2;
    }
}

// SPDX-License-Identifier: MIT
pragma solidity ^0.8.20;

library ShortStrings {
    error StringTooLong(string str);
    error InvalidShortString();
    
    function toShortString(string memory str) internal pure returns (bytes32) {
        bytes memory bstr = bytes(str);
        if (bstr.length > 31) {
            revert StringTooLong(str);
        }
        return bytes32(uint256(bytes32(bstr)) | bstr.length);
    }
    
    function toString(bytes32 shortString) internal pure returns (string memory) {
        uint256 len = uint256(shortString) & 0xFF;
        if (len > 31) {
            revert InvalidShortString();
        }
        bytes memory result = new bytes(len);
        for (uint256 i = 0; i < len; i++) {
            result[i] = shortString[i];
        }
        return string(result);
    }
}

// SPDX-License-Identifier: MIT
pragma solidity ^0.8.20;

library SignedMath {
    function max(int256 a, int256 b) internal pure returns (int256) {
        return a > b ? a : b;
    }
    
    function min(int256 a, int256 b) internal pure returns (int256) {
        return a < b ? a : b;
    }
    
    function average(int256 a, int256 b) internal pure returns (int256) {
        int256 x = (a & b) + ((a ^ b) >> 1);
        return x + (int256(uint256(x) >> 255) & (a ^ b));
    }
    
    function abs(int256 n) internal pure returns (uint256) {
        unchecked {
            return uint256(n >= 0 ? n : -n);
        }
    }
}

// SPDX-License-Identifier: MIT
pragma solidity ^0.8.20;

library StorageSlot {
    struct AddressSlot {
        address value;
    }
    
    struct BooleanSlot {
        bool value;
    }
    
    struct Bytes32Slot {
        bytes32 value;
    }
    
    struct Uint256Slot {
        uint256 value;
    }
    
    function getAddressSlot(bytes32 slot) internal pure returns (AddressSlot storage r) {
        assembly {
            r.slot := slot
        }
    }
    
    function getBooleanSlot(bytes32 slot) internal pure returns (BooleanSlot storage r) {
        assembly {
            r.slot := slot
        }
    }
}

// SPDX-License-Identifier: MIT
pragma solidity ^0.8.20;

library Strings {
    function toString(uint256 value) internal pure returns (string memory) {
        if (value == 0) {
            return "0";
        }
        uint256 temp = value;
        uint256 digits;
        while (temp != 0) {
            digits++;
            temp /= 10;
        }
        bytes memory buffer = new bytes(digits);
        while (value != 0) {
            digits -= 1;
            buffer[digits] = bytes1(uint8(48 + uint256(value % 10)));
            value /= 10;
        }
        return string(buffer);
    }
}

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

Contract Security Audit

Contract ABI

API
[{"inputs":[{"internalType":"address","name":"_taxWallet","type":"address"}],"stateMutability":"nonpayable","type":"constructor"},{"inputs":[{"internalType":"address","name":"spender","type":"address"},{"internalType":"uint256","name":"allowance","type":"uint256"},{"internalType":"uint256","name":"needed","type":"uint256"}],"name":"ERC20InsufficientAllowance","type":"error"},{"inputs":[{"internalType":"address","name":"sender","type":"address"},{"internalType":"uint256","name":"balance","type":"uint256"},{"internalType":"uint256","name":"needed","type":"uint256"}],"name":"ERC20InsufficientBalance","type":"error"},{"inputs":[{"internalType":"address","name":"approver","type":"address"}],"name":"ERC20InvalidApprover","type":"error"},{"inputs":[{"internalType":"address","name":"receiver","type":"address"}],"name":"ERC20InvalidReceiver","type":"error"},{"inputs":[{"internalType":"address","name":"sender","type":"address"}],"name":"ERC20InvalidSender","type":"error"},{"inputs":[{"internalType":"address","name":"spender","type":"address"}],"name":"ERC20InvalidSpender","type":"error"},{"inputs":[],"name":"EnforcedPause","type":"error"},{"inputs":[],"name":"ExpectedPause","type":"error"},{"inputs":[{"internalType":"address","name":"owner","type":"address"}],"name":"OwnableInvalidOwner","type":"error"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"OwnableUnauthorizedAccount","type":"error"},{"inputs":[],"name":"ReentrancyGuardReentrantCall","type":"error"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"spender","type":"address"},{"indexed":false,"internalType":"uint256","name":"value","type":"uint256"}],"name":"Approval","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"account","type":"address"},{"indexed":false,"internalType":"bool","name":"isExcluded","type":"bool"}],"name":"ExcludeFromFees","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"previousOwner","type":"address"},{"indexed":true,"internalType":"address","name":"newOwner","type":"address"}],"name":"OwnershipTransferred","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"account","type":"address"}],"name":"Paused","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"router","type":"address"},{"indexed":true,"internalType":"address","name":"pair","type":"address"}],"name":"RouterUpdated","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"pair","type":"address"},{"indexed":true,"internalType":"bool","name":"value","type":"bool"}],"name":"SetAutomatedMarketMakerPair","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"tokensSwapped","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"ethSent","type":"uint256"}],"name":"SwapAndSendTax","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"newWallet","type":"address"},{"indexed":true,"internalType":"address","name":"oldWallet","type":"address"}],"name":"TaxWalletUpdated","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"from","type":"address"},{"indexed":true,"internalType":"address","name":"to","type":"address"},{"indexed":false,"internalType":"uint256","name":"value","type":"uint256"}],"name":"Transfer","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"account","type":"address"}],"name":"Unpaused","type":"event"},{"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":"value","type":"uint256"}],"name":"approve","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"automatedMarketMakerPairs","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"balanceOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"value","type":"uint256"}],"name":"burn","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"},{"internalType":"uint256","name":"value","type":"uint256"}],"name":"burnFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"buyTax","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"decimals","outputs":[{"internalType":"uint8","name":"","type":"uint8"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"enableTrading","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"},{"internalType":"bool","name":"excluded","type":"bool"}],"name":"excludeFromFees","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"},{"internalType":"bool","name":"excluded","type":"bool"}],"name":"excludeFromMaxTransaction","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"},{"internalType":"bool","name":"excluded","type":"bool"}],"name":"excludeFromMaxWallet","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"isExcludedFromFees","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"maxTransactionAmount","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"maxWalletAmount","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":[],"name":"paused","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"removeLimits","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"sellTax","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"pair","type":"address"},{"internalType":"bool","name":"value","type":"bool"}],"name":"setAutomatedMarketMakerPair","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"newAmount","type":"uint256"}],"name":"setSwapTokensAtAmount","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"routerAddress","type":"address"}],"name":"setUniswapRouter","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"swapTokensAtAmount","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"symbol","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"taxWallet","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"tradingActive","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"value","type":"uint256"}],"name":"transfer","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"transferDelayEnabled","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"value","type":"uint256"}],"name":"transferFrom","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"uniswapV2Pair","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"uniswapV2Router","outputs":[{"internalType":"contract IUniswapV2Router02","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_maxTx","type":"uint256"},{"internalType":"uint256","name":"_maxWallet","type":"uint256"}],"name":"updateLimits","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"newWallet","type":"address"}],"name":"updateTaxWallet","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_buyTax","type":"uint256"},{"internalType":"uint256","name":"_sellTax","type":"uint256"}],"name":"updateTaxes","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"withdrawStuckETH","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"token","type":"address"}],"name":"withdrawStuckTokens","outputs":[],"stateMutability":"nonpayable","type":"function"},{"stateMutability":"payable","type":"receive"}]

60806040526107d0600855610bb860095562000038612710620000316c0c9f2c9cd04674edea40000000600a620002b2565b90620002c9565b600a556200005c612710620000316c0c9f2c9cd04674edea4000000060c8620002b2565b600b556015805460ff191690556200008a612710620000316c0c9f2c9cd04674edea400000006005620002b2565b6016556018805460ff19166001179055348015620000a757600080fd5b50604051620035bd380380620035bd833981016040819052620000ca9162000fbe565b336040518060400160405280600e81526020016d5969656c64204d696e657220414960901b81525060405180604001604052806004815260200163594d414960e01b81525081600390816200012091906200108c565b5060046200012f82826200108c565b5050506001600160a01b0381166200016257604051631e4fbdf760e01b8152600060048201526024015b60405180910390fd5b6200016d81620002d7565b5060016006556007805460ff191690556001600160a01b038116620001d55760405162461bcd60e51b815260206004820152601960248201527f5461782077616c6c65742063616e6e6f74206265207a65726f00000000000000604482015260640162000159565b600e80546001600160a01b0319166001600160a01b038316179055620001fd33600162000329565b6200020a30600162000329565b6200021781600162000329565b6200022661dead600162000329565b62000233336001620003a7565b62000240306001620003a7565b6200024d816001620003a7565b6200025c61dead6001620003a7565b62000269336001620003db565b62000276306001620003db565b62000283816001620003db565b6200029261dead6001620003db565b620002ab336c0c9f2c9cd04674edea4000000062000406565b5062001276565b6000620002c082846200116e565b90505b92915050565b6000620002c0828462001188565b600580546001600160a01b038381166001600160a01b0319831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a35050565b6200033362000440565b80156200034e5762000347600f8362000471565b506200035d565b6200035b600f8362000488565b505b816001600160a01b03167f9d8f7706ea1113d1a167b526eca956215946dd36cc7df39eb16180222d8b5df7826040516200039b911515815260200190565b60405180910390a25050565b620003b162000440565b8015620003ca57620003c560118362000471565b505050565b620003c560118362000488565b5050565b620003e562000440565b8015620003f957620003c560138362000471565b620003c560138362000488565b6001600160a01b038216620004325760405163ec442f0560e01b81526000600482015260240162000159565b620003d7600083836200049f565b6005546001600160a01b031633146200046f5760405163118cdaa760e01b815233600482015260240162000159565b565b6000620002c0836001600160a01b038416620009de565b6000620002c0836001600160a01b03841662000a30565b6001600160a01b0383161580620004bd57506001600160a01b038216155b15620004d057620003c583838362000b34565b80600003620004e757620003c58383600062000b34565b6005546001600160a01b038481169116148015906200051457506005546001600160a01b03838116911614155b80156200052c57506001600160a01b03821661dead14155b8015620005415750601554610100900460ff16155b15620008075760155460ff16620005b6576200055f600f8462000c67565b8062000573575062000573600f8362000c67565b620005b65760405162461bcd60e51b815260206004820152601260248201527154726164696e67206e6f742061637469766560701b604482015260640162000159565b60185460ff168015620005d35750600d546001600160a01b031615155b156200067057600c546001600160a01b03838116911614801590620006065750600d546001600160a01b03838116911614155b1562000670573260009081526017602052604090205443116200065d5760405162461bcd60e51b815260206004820152600e60248201526d5472616e736665722064656c617960901b604482015260640162000159565b3260009081526017602052604090204390555b6001600160a01b03831660009081526019602052604090205460ff168015620006a35750620006a160118362000c67565b155b15620006f557600a54811115620006ef5760405162461bcd60e51b815260206004820152600f60248201526e084eaf240caf0c6cacac8e640dac2f608b1b604482015260640162000159565b62000775565b6001600160a01b03821660009081526019602052604090205460ff1680156200072857506200072660118462000c67565b155b156200077557600a54811115620007755760405162461bcd60e51b815260206004820152601060248201526f0a6cad8d840caf0c6cacac8e640dac2f60831b604482015260640162000159565b6200078260138362000c67565b6200080757600b5481620007ab846001600160a01b031660009081526020819052604090205490565b620007b79190620011ab565b1115620008075760405162461bcd60e51b815260206004820152601360248201527f4d61782077616c6c657420657863656564656400000000000000000000000000604482015260640162000159565b600c546001600160a01b031615620008c8573060009081526020819052604090205460165481108015908190620008465750601554610100900460ff16155b80156200086c57506001600160a01b03851660009081526019602052604090205460ff16155b801562000883575062000881600f8662000c67565b155b80156200089a575062000898600f8562000c67565b155b15620008c5576015805461ff001916610100179055620008b962000c8a565b6015805461ff00191690555b50505b601554610100900460ff1615620008e1600f8562000c67565b80620008f55750620008f5600f8462000c67565b15620008ff575060005b60008115620009ca576001600160a01b03841660009081526019602052604090205460ff1680156200093357506000600954115b156200095a5760095462000952906127109062000031908690620002b2565b9050620009a7565b6001600160a01b03851660009081526019602052604090205460ff1680156200098557506000600854115b15620009a757600854620009a4906127109062000031908690620002b2565b90505b8015620009ca57620009bb85308362000b34565b620009c78184620011c1565b92505b620009d785858562000b34565b5050505050565b600081815260018301602052604081205462000a2757508154600181810184556000848152602080822090930184905584548482528286019093526040902091909155620002c3565b506000620002c3565b6000818152600183016020526040812054801562000b2957600062000a57600183620011c1565b855490915060009062000a6d90600190620011c1565b905080821462000ad957600086600001828154811062000a915762000a91620011d7565b906000526020600020015490508087600001848154811062000ab75762000ab7620011d7565b6000918252602080832090910192909255918252600188019052604090208390555b855486908062000aed5762000aed620011ed565b600190038181906000526020600020016000905590558560010160008681526020019081526020016000206000905560019350505050620002c3565b6000915050620002c3565b6001600160a01b03831662000b6357806002600082825462000b579190620011ab565b9091555062000bd79050565b6001600160a01b0383166000908152602081905260409020548181101562000bb85760405163391434e360e21b81526001600160a01b0385166004820152602481018290526044810183905260640162000159565b6001600160a01b03841660009081526020819052604090209082900390555b6001600160a01b03821662000bf55760028054829003905562000c14565b6001600160a01b03821660009081526020819052604090208054820190555b816001600160a01b0316836001600160a01b03167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef8360405162000c5a91815260200190565b60405180910390a3505050565b6001600160a01b03811660009081526001830160205260408120541515620002c0565b306000908152602081905260408120549081900362000ca65750565b6000601654821162000cb9578162000cbd565b6016545b905062000cca8162000d71565b478015620003c557600e546040516000916001600160a01b03169083908381818185875af1925050503d806000811462000d21576040519150601f19603f3d011682016040523d82523d6000602084013e62000d26565b606091505b50509050801562000d6b5760408051848152602081018490527f20c67c84c631769d26a34799f5602bae0c3e7f5d298a6609a3e0e7da5cbe6529910160405180910390a15b50505050565b604080516002808252606082018352600092602083019080368337019050509050308160008151811062000da95762000da9620011d7565b6001600160a01b03928316602091820292909201810191909152600c54604080516315ab88c960e31b81529051919093169263ad5c46489260048083019391928290030181865afa15801562000e03573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019062000e29919062000fbe565b8160018151811062000e3f5762000e3f620011d7565b6001600160a01b039283166020918202929092010152600c5462000e67913091168462000eda565b600c5460405163791ac94760e01b81526001600160a01b039091169063791ac9479062000ea290859060009086903090429060040162001203565b600060405180830381600087803b15801562000ebd57600080fd5b505af115801562000ed2573d6000803e3d6000fd5b505050505050565b620003c583838360016001600160a01b03841662000f0f5760405163e602df0560e01b81526000600482015260240162000159565b6001600160a01b03831662000f3b57604051634a1406b160e11b81526000600482015260240162000159565b6001600160a01b038085166000908152600160209081526040808320938716835292905220829055801562000d6b57826001600160a01b0316846001600160a01b03167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b9258460405162000fb091815260200190565b60405180910390a350505050565b60006020828403121562000fd157600080fd5b81516001600160a01b038116811462000fe957600080fd5b9392505050565b634e487b7160e01b600052604160045260246000fd5b600181811c908216806200101b57607f821691505b6020821081036200103c57634e487b7160e01b600052602260045260246000fd5b50919050565b601f821115620003c557600081815260208120601f850160051c810160208610156200106b5750805b601f850160051c820191505b8181101562000ed25782815560010162001077565b81516001600160401b03811115620010a857620010a862000ff0565b620010c081620010b9845462001006565b8462001042565b602080601f831160018114620010f85760008415620010df5750858301515b600019600386901b1c1916600185901b17855562000ed2565b600085815260208120601f198616915b82811015620011295788860151825594840194600190910190840162001108565b5085821015620011485787850151600019600388901b60f8161c191681555b5050505050600190811b01905550565b634e487b7160e01b600052601160045260246000fd5b8082028115828204841417620002c357620002c362001158565b600082620011a657634e487b7160e01b600052601260045260246000fd5b500490565b80820180821115620002c357620002c362001158565b81810381811115620002c357620002c362001158565b634e487b7160e01b600052603260045260246000fd5b634e487b7160e01b600052603160045260246000fd5b600060a082018783526020878185015260a0604085015281875180845260c086019150828901935060005b81811015620012555784516001600160a01b0316835293830193918301916001016200122e565b50506001600160a01b03969096166060850152505050608001529392505050565b61233780620012866000396000f3fe60806040526004361061023f5760003560e01c80638da5cb5b1161012e578063c0246668116100ab578063d2fcc0011161006f578063d2fcc00114610697578063dd62ed3e146106b7578063e2f45605146106fd578063f2fde38b14610713578063f5648a4f1461073357600080fd5b8063c024666814610611578063c876d0b914610631578063c8c8ebe41461064b578063cb96372814610661578063cc1776d31461068157600080fd5b8063aa4bde28116100f2578063aa4bde2814610571578063afa4f3b214610587578063b62496f5146105a7578063bbc0c742146105d7578063bea9849e146105f157600080fd5b80638da5cb5b146104de57806395d89b41146104fc5780639a7a23d614610511578063a2240e1914610531578063a9059cbb1461055157600080fd5b80634f7041a5116101bc57806374c9f6031161018057806374c9f60314610454578063751039fc146104745780637571336a1461048957806379cc6790146104a95780638a8c523c146104c957600080fd5b80634f7041a5146103bb5780634fbee193146103d15780635c975abb146103f157806370a0823114610409578063715018a61461043f57600080fd5b806323b872dd1161020357806323b872dd1461031f5780632dc0562d1461033f578063313ce5671461035f57806342966c681461037b57806349bd5a5e1461039b57600080fd5b806306fdde031461024b578063095ea7b3146102765780631006ee0c146102a65780631694505e146102c857806318160ddd1461030057600080fd5b3661024657005b600080fd5b34801561025757600080fd5b50610260610748565b60405161026d9190611fc5565b60405180910390f35b34801561028257600080fd5b50610296610291366004612028565b6107da565b604051901515815260200161026d565b3480156102b257600080fd5b506102c66102c1366004612054565b6107f4565b005b3480156102d457600080fd5b50600c546102e8906001600160a01b031681565b6040516001600160a01b03909116815260200161026d565b34801561030c57600080fd5b506002545b60405190815260200161026d565b34801561032b57600080fd5b5061029661033a366004612076565b61085b565b34801561034b57600080fd5b50600e546102e8906001600160a01b031681565b34801561036b57600080fd5b506040516012815260200161026d565b34801561038757600080fd5b506102c66103963660046120b7565b61087f565b3480156103a757600080fd5b50600d546102e8906001600160a01b031681565b3480156103c757600080fd5b5061031160085481565b3480156103dd57600080fd5b506102966103ec3660046120d0565b61088c565b3480156103fd57600080fd5b5060075460ff16610296565b34801561041557600080fd5b506103116104243660046120d0565b6001600160a01b031660009081526020819052604090205490565b34801561044b57600080fd5b506102c6610899565b34801561046057600080fd5b506102c661046f3660046120d0565b6108ad565b34801561048057600080fd5b506102c6610957565b34801561049557600080fd5b506102c66104a43660046120fb565b610977565b3480156104b557600080fd5b506102c66104c4366004612028565b6109a4565b3480156104d557600080fd5b506102c66109b9565b3480156104ea57600080fd5b506005546001600160a01b03166102e8565b34801561050857600080fd5b50610260610a20565b34801561051d57600080fd5b506102c661052c3660046120fb565b610a2f565b34801561053d57600080fd5b506102c661054c366004612054565b610a9f565b34801561055d57600080fd5b5061029661056c366004612028565b610b77565b34801561057d57600080fd5b50610311600b5481565b34801561059357600080fd5b506102c66105a23660046120b7565b610b85565b3480156105b357600080fd5b506102966105c23660046120d0565b60196020526000908152604090205460ff1681565b3480156105e357600080fd5b506015546102969060ff1681565b3480156105fd57600080fd5b506102c661060c3660046120d0565b610c42565b34801561061d57600080fd5b506102c661062c3660046120fb565b61102d565b34801561063d57600080fd5b506018546102969060ff1681565b34801561065757600080fd5b50610311600a5481565b34801561066d57600080fd5b506102c661067c3660046120d0565b6110a2565b34801561068d57600080fd5b5061031160095481565b3480156106a357600080fd5b506102c66106b23660046120fb565b6111fa565b3480156106c357600080fd5b506103116106d2366004612134565b6001600160a01b03918216600090815260016020908152604080832093909416825291909152205490565b34801561070957600080fd5b5061031160165481565b34801561071f57600080fd5b506102c661072e3660046120d0565b61121e565b34801561073f57600080fd5b506102c6611259565b60606003805461075790612162565b80601f016020809104026020016040519081016040528092919081815260200182805461078390612162565b80156107d05780601f106107a5576101008083540402835291602001916107d0565b820191906000526020600020905b8154815290600101906020018083116107b357829003601f168201915b5050505050905090565b6000336107e8818585611307565b60019150505b92915050565b6107fc611314565b611388821115801561081057506113888111155b6108505760405162461bcd60e51b815260206004820152600c60248201526b0a8c2f040e8dede40d0d2ced60a31b60448201526064015b60405180910390fd5b600891909155600955565b600033610869858285611341565b6108748585856113bf565b506001949350505050565b610889338261141e565b50565b60006107ee600f83611454565b6108a1611314565b6108ab6000611479565b565b6108b5611314565b6001600160a01b0381166108fa5760405162461bcd60e51b815260206004820152600c60248201526b5a65726f206164647265737360a01b6044820152606401610847565b600e546040516001600160a01b03918216918316907f849a2ad8ad386f1e9897e9e0a62d16771c675e4740986a16fb31bd8e1dde9c9790600090a3600e80546001600160a01b0319166001600160a01b0392909216919091179055565b61095f611314565b6c0c9f2c9cd04674edea40000000600a819055600b55565b61097f611314565b8015610995576109906011836114cb565b505050565b6109906011836114e0565b5050565b6109af823383611341565b6109a0828261141e565b6109c1611314565b600c546001600160a01b0316610a115760405162461bcd60e51b8152602060048201526015602482015274135d5cdd081cd95d081c9bdd5d195c88199a5c9cdd605a1b6044820152606401610847565b6015805460ff19166001179055565b60606004805461075790612162565b610a37611314565b600d546001600160a01b0390811690831603610a955760405162461bcd60e51b815260206004820152601760248201527f43616e6e6f742072656d6f7665206d61696e20706169720000000000000000006044820152606401610847565b6109a082826114f5565b610aa7611314565b610acb6103e8610ac56c0c9f2c9cd04674edea400000006001611549565b90611555565b821015610b0b5760405162461bcd60e51b815260206004820152600e60248201526d4d617820747820746f6f206c6f7760901b6044820152606401610847565b610b286064610ac56c0c9f2c9cd04674edea400000006001611549565b811015610b6c5760405162461bcd60e51b81526020600482015260126024820152714d61782077616c6c657420746f6f206c6f7760701b6044820152606401610847565b600a91909155600b55565b6000336107e88185856113bf565b610b8d611314565b610bac620186a0610ac56c0c9f2c9cd04674edea400000006001611549565b811015610be55760405162461bcd60e51b8152602060048201526007602482015266546f6f206c6f7760c81b6044820152606401610847565b610c036103e8610ac56c0c9f2c9cd04674edea400000006005611549565b811115610c3d5760405162461bcd60e51b81526020600482015260086024820152670a8dede40d0d2ced60c31b6044820152606401610847565b601655565b610c4a611314565b6001600160a01b038116610c985760405162461bcd60e51b8152602060048201526015602482015274526f757465722063616e6e6f74206265207a65726f60581b6044820152606401610847565b600c546001600160a01b031615610ce65760405162461bcd60e51b8152602060048201526012602482015271149bdd5d195c88185b1c9958591e481cd95d60721b6044820152606401610847565b600c80546001600160a01b0319166001600160a01b0383169081179091556040805163c45a015560e01b815290518392600092909163c45a0155916004808201926020929091908290030181865afa158015610d46573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610d6a919061219c565b6001600160a01b031663e6a4390530846001600160a01b031663ad5c46486040518163ffffffff1660e01b8152600401602060405180830381865afa158015610db7573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610ddb919061219c565b6040516001600160e01b031960e085901b1681526001600160a01b03928316600482015291166024820152604401602060405180830381865afa158015610e26573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610e4a919061219c565b90506001600160a01b038116610fa157816001600160a01b031663c45a01556040518163ffffffff1660e01b8152600401602060405180830381865afa158015610e98573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610ebc919061219c565b6001600160a01b031663c9c6539630846001600160a01b031663ad5c46486040518163ffffffff1660e01b8152600401602060405180830381865afa158015610f09573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610f2d919061219c565b6040516001600160e01b031960e085901b1681526001600160a01b039283166004820152911660248201526044016020604051808303816000875af1158015610f7a573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610f9e919061219c565b90505b600d80546001600160a01b0319166001600160a01b038316179055610fc7836001610977565b610fd2816001610977565b610fdd8160016111fa565b610fe88160016114f5565b806001600160a01b0316836001600160a01b03167f02dc5c233404867c793b749c6d644beb2277536d18a7e7974d3f238e4c6f168460405160405180910390a3505050565b611035611314565b801561104c57611046600f836114cb565b50611059565b611057600f836114e0565b505b816001600160a01b03167f9d8f7706ea1113d1a167b526eca956215946dd36cc7df39eb16180222d8b5df782604051611096911515815260200190565b60405180910390a25050565b6110aa611314565b306001600160a01b038216036111025760405162461bcd60e51b815260206004820152601960248201527f43616e6e6f74207769746864726177206f776e20746f6b656e000000000000006044820152606401610847565b806001600160a01b031663a9059cbb6111236005546001600160a01b031690565b6040516370a0823160e01b81523060048201526001600160a01b038516906370a0823190602401602060405180830381865afa158015611167573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061118b91906121b9565b6040516001600160e01b031960e085901b1681526001600160a01b03909216600483015260248201526044016020604051808303816000875af11580156111d6573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906109a091906121d2565b611202611314565b8015611213576109906013836114cb565b6109906013836114e0565b611226611314565b6001600160a01b03811661125057604051631e4fbdf760e01b815260006004820152602401610847565b61088981611479565b611261611314565b60006112756005546001600160a01b031690565b6001600160a01b03164760405160006040518083038185875af1925050503d80600081146112bf576040519150601f19603f3d011682016040523d82523d6000602084013e6112c4565b606091505b50509050806108895760405162461bcd60e51b815260206004820152600f60248201526e151c985b9cd9995c8819985a5b1959608a1b6044820152606401610847565b6109908383836001611561565b6005546001600160a01b031633146108ab5760405163118cdaa760e01b8152336004820152602401610847565b6001600160a01b0383811660009081526001602090815260408083209386168352929052205460001981146113b957818110156113aa57604051637dc7a0d960e11b81526001600160a01b03841660048201526024810182905260448101839052606401610847565b6113b984848484036000611561565b50505050565b6001600160a01b0383166113e957604051634b637e8f60e11b815260006004820152602401610847565b6001600160a01b0382166114135760405163ec442f0560e01b815260006004820152602401610847565b610990838383611636565b6001600160a01b03821661144857604051634b637e8f60e11b815260006004820152602401610847565b6109a082600083611636565b6001600160a01b038116600090815260018301602052604081205415155b9392505050565b600580546001600160a01b038381166001600160a01b0319831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a35050565b6000611472836001600160a01b038416611b22565b6000611472836001600160a01b038416611b71565b6001600160a01b038216600081815260196020526040808220805460ff191685151590811790915590519092917fffa9187bf1f18bf477bd0ea1bcbb64e93b6a98132473929edfce215cd9b16fab91a35050565b60006114728284612205565b6000611472828461221c565b6001600160a01b03841661158b5760405163e602df0560e01b815260006004820152602401610847565b6001600160a01b0383166115b557604051634a1406b160e11b815260006004820152602401610847565b6001600160a01b03808516600090815260016020908152604080832093871683529290522082905580156113b957826001600160a01b0316846001600160a01b03167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b9258460405161162891815260200190565b60405180910390a350505050565b6001600160a01b038316158061165357506001600160a01b038216155b1561166357610990838383611c64565b806000036116775761099083836000611c64565b6005546001600160a01b038481169116148015906116a357506005546001600160a01b03838116911614155b80156116ba57506001600160a01b03821661dead14155b80156116ce5750601554610100900460ff16155b156119665760155460ff1661173a576116e8600f84611454565b806116f957506116f9600f83611454565b61173a5760405162461bcd60e51b815260206004820152601260248201527154726164696e67206e6f742061637469766560701b6044820152606401610847565b60185460ff1680156117565750600d546001600160a01b031615155b156117ee57600c546001600160a01b038381169116148015906117875750600d546001600160a01b03838116911614155b156117ee573260009081526017602052604090205443116117db5760405162461bcd60e51b815260206004820152600e60248201526d5472616e736665722064656c617960901b6044820152606401610847565b3260009081526017602052604090204390555b6001600160a01b03831660009081526019602052604090205460ff16801561181e575061181c601183611454565b155b1561186c57600a548111156118675760405162461bcd60e51b815260206004820152600f60248201526e084eaf240caf0c6cacac8e640dac2f608b1b6044820152606401610847565b6118e6565b6001600160a01b03821660009081526019602052604090205460ff16801561189c575061189a601184611454565b155b156118e657600a548111156118e65760405162461bcd60e51b815260206004820152601060248201526f0a6cad8d840caf0c6cacac8e640dac2f60831b6044820152606401610847565b6118f1601383611454565b61196657600b5481611918846001600160a01b031660009081526020819052604090205490565b611922919061223e565b11156119665760405162461bcd60e51b815260206004820152601360248201527213585e081dd85b1b195d08195e18d959591959606a1b6044820152606401610847565b600c546001600160a01b031615611a1b5730600090815260208190526040902054601654811080159081906119a35750601554610100900460ff16155b80156119c857506001600160a01b03851660009081526019602052604090205460ff16155b80156119dc57506119da600f86611454565b155b80156119f057506119ee600f85611454565b155b15611a18576015805461ff001916610100179055611a0c611d8e565b6015805461ff00191690555b50505b601554610100900460ff1615611a32600f85611454565b80611a435750611a43600f84611454565b15611a4c575060005b60008115611b10576001600160a01b03841660009081526019602052604090205460ff168015611a7e57506000600954115b15611aa557611a9e612710610ac56009548661154990919063ffffffff16565b9050611af2565b6001600160a01b03851660009081526019602052604090205460ff168015611acf57506000600854115b15611af257611aef612710610ac56008548661154990919063ffffffff16565b90505b8015611b1057611b03853083611c64565b611b0d8184612251565b92505b611b1b858585611c64565b5050505050565b6000818152600183016020526040812054611b69575081546001818101845560008481526020808220909301849055845484825282860190935260409020919091556107ee565b5060006107ee565b60008181526001830160205260408120548015611c5a576000611b95600183612251565b8554909150600090611ba990600190612251565b9050808214611c0e576000866000018281548110611bc957611bc9612264565b9060005260206000200154905080876000018481548110611bec57611bec612264565b6000918252602080832090910192909255918252600188019052604090208390555b8554869080611c1f57611c1f61227a565b6001900381819060005260206000200160009055905585600101600086815260200190815260200160002060009055600193505050506107ee565b60009150506107ee565b6001600160a01b038316611c8f578060026000828254611c84919061223e565b90915550611d019050565b6001600160a01b03831660009081526020819052604090205481811015611ce25760405163391434e360e21b81526001600160a01b03851660048201526024810182905260448101839052606401610847565b6001600160a01b03841660009081526020819052604090209082900390555b6001600160a01b038216611d1d57600280548290039055611d3c565b6001600160a01b03821660009081526020819052604090208054820190555b816001600160a01b0316836001600160a01b03167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef83604051611d8191815260200190565b60405180910390a3505050565b3060009081526020819052604081205490819003611da95750565b60006016548211611dba5781611dbe565b6016545b9050611dc981611e6b565b47801561099057600e546040516000916001600160a01b03169083908381818185875af1925050503d8060008114611e1d576040519150601f19603f3d011682016040523d82523d6000602084013e611e22565b606091505b5050905080156113b95760408051848152602081018490527f20c67c84c631769d26a34799f5602bae0c3e7f5d298a6609a3e0e7da5cbe6529910160405180910390a150505050565b6040805160028082526060820183526000926020830190803683370190505090503081600081518110611ea057611ea0612264565b6001600160a01b03928316602091820292909201810191909152600c54604080516315ab88c960e31b81529051919093169263ad5c46489260048083019391928290030181865afa158015611ef9573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611f1d919061219c565b81600181518110611f3057611f30612264565b6001600160a01b039283166020918202929092010152600c54611f569130911684611307565b600c5460405163791ac94760e01b81526001600160a01b039091169063791ac94790611f8f908590600090869030904290600401612290565b600060405180830381600087803b158015611fa957600080fd5b505af1158015611fbd573d6000803e3d6000fd5b505050505050565b600060208083528351808285015260005b81811015611ff257858101830151858201604001528201611fd6565b506000604082860101526040601f19601f8301168501019250505092915050565b6001600160a01b038116811461088957600080fd5b6000806040838503121561203b57600080fd5b823561204681612013565b946020939093013593505050565b6000806040838503121561206757600080fd5b50508035926020909101359150565b60008060006060848603121561208b57600080fd5b833561209681612013565b925060208401356120a681612013565b929592945050506040919091013590565b6000602082840312156120c957600080fd5b5035919050565b6000602082840312156120e257600080fd5b813561147281612013565b801515811461088957600080fd5b6000806040838503121561210e57600080fd5b823561211981612013565b91506020830135612129816120ed565b809150509250929050565b6000806040838503121561214757600080fd5b823561215281612013565b9150602083013561212981612013565b600181811c9082168061217657607f821691505b60208210810361219657634e487b7160e01b600052602260045260246000fd5b50919050565b6000602082840312156121ae57600080fd5b815161147281612013565b6000602082840312156121cb57600080fd5b5051919050565b6000602082840312156121e457600080fd5b8151611472816120ed565b634e487b7160e01b600052601160045260246000fd5b80820281158282048414176107ee576107ee6121ef565b60008261223957634e487b7160e01b600052601260045260246000fd5b500490565b808201808211156107ee576107ee6121ef565b818103818111156107ee576107ee6121ef565b634e487b7160e01b600052603260045260246000fd5b634e487b7160e01b600052603160045260246000fd5b600060a082018783526020878185015260a0604085015281875180845260c086019150828901935060005b818110156122e05784516001600160a01b0316835293830193918301916001016122bb565b50506001600160a01b0396909616606085015250505060800152939250505056fea2646970667358221220fd9dbed2000792751f6b5691aa1f63cb501258907c2ef1a3747d66f05946ee1964736f6c634300081400330000000000000000000000002fa273464df2cf399b5b458fcb7a6fc0637fd869

Deployed Bytecode

0x60806040526004361061023f5760003560e01c80638da5cb5b1161012e578063c0246668116100ab578063d2fcc0011161006f578063d2fcc00114610697578063dd62ed3e146106b7578063e2f45605146106fd578063f2fde38b14610713578063f5648a4f1461073357600080fd5b8063c024666814610611578063c876d0b914610631578063c8c8ebe41461064b578063cb96372814610661578063cc1776d31461068157600080fd5b8063aa4bde28116100f2578063aa4bde2814610571578063afa4f3b214610587578063b62496f5146105a7578063bbc0c742146105d7578063bea9849e146105f157600080fd5b80638da5cb5b146104de57806395d89b41146104fc5780639a7a23d614610511578063a2240e1914610531578063a9059cbb1461055157600080fd5b80634f7041a5116101bc57806374c9f6031161018057806374c9f60314610454578063751039fc146104745780637571336a1461048957806379cc6790146104a95780638a8c523c146104c957600080fd5b80634f7041a5146103bb5780634fbee193146103d15780635c975abb146103f157806370a0823114610409578063715018a61461043f57600080fd5b806323b872dd1161020357806323b872dd1461031f5780632dc0562d1461033f578063313ce5671461035f57806342966c681461037b57806349bd5a5e1461039b57600080fd5b806306fdde031461024b578063095ea7b3146102765780631006ee0c146102a65780631694505e146102c857806318160ddd1461030057600080fd5b3661024657005b600080fd5b34801561025757600080fd5b50610260610748565b60405161026d9190611fc5565b60405180910390f35b34801561028257600080fd5b50610296610291366004612028565b6107da565b604051901515815260200161026d565b3480156102b257600080fd5b506102c66102c1366004612054565b6107f4565b005b3480156102d457600080fd5b50600c546102e8906001600160a01b031681565b6040516001600160a01b03909116815260200161026d565b34801561030c57600080fd5b506002545b60405190815260200161026d565b34801561032b57600080fd5b5061029661033a366004612076565b61085b565b34801561034b57600080fd5b50600e546102e8906001600160a01b031681565b34801561036b57600080fd5b506040516012815260200161026d565b34801561038757600080fd5b506102c66103963660046120b7565b61087f565b3480156103a757600080fd5b50600d546102e8906001600160a01b031681565b3480156103c757600080fd5b5061031160085481565b3480156103dd57600080fd5b506102966103ec3660046120d0565b61088c565b3480156103fd57600080fd5b5060075460ff16610296565b34801561041557600080fd5b506103116104243660046120d0565b6001600160a01b031660009081526020819052604090205490565b34801561044b57600080fd5b506102c6610899565b34801561046057600080fd5b506102c661046f3660046120d0565b6108ad565b34801561048057600080fd5b506102c6610957565b34801561049557600080fd5b506102c66104a43660046120fb565b610977565b3480156104b557600080fd5b506102c66104c4366004612028565b6109a4565b3480156104d557600080fd5b506102c66109b9565b3480156104ea57600080fd5b506005546001600160a01b03166102e8565b34801561050857600080fd5b50610260610a20565b34801561051d57600080fd5b506102c661052c3660046120fb565b610a2f565b34801561053d57600080fd5b506102c661054c366004612054565b610a9f565b34801561055d57600080fd5b5061029661056c366004612028565b610b77565b34801561057d57600080fd5b50610311600b5481565b34801561059357600080fd5b506102c66105a23660046120b7565b610b85565b3480156105b357600080fd5b506102966105c23660046120d0565b60196020526000908152604090205460ff1681565b3480156105e357600080fd5b506015546102969060ff1681565b3480156105fd57600080fd5b506102c661060c3660046120d0565b610c42565b34801561061d57600080fd5b506102c661062c3660046120fb565b61102d565b34801561063d57600080fd5b506018546102969060ff1681565b34801561065757600080fd5b50610311600a5481565b34801561066d57600080fd5b506102c661067c3660046120d0565b6110a2565b34801561068d57600080fd5b5061031160095481565b3480156106a357600080fd5b506102c66106b23660046120fb565b6111fa565b3480156106c357600080fd5b506103116106d2366004612134565b6001600160a01b03918216600090815260016020908152604080832093909416825291909152205490565b34801561070957600080fd5b5061031160165481565b34801561071f57600080fd5b506102c661072e3660046120d0565b61121e565b34801561073f57600080fd5b506102c6611259565b60606003805461075790612162565b80601f016020809104026020016040519081016040528092919081815260200182805461078390612162565b80156107d05780601f106107a5576101008083540402835291602001916107d0565b820191906000526020600020905b8154815290600101906020018083116107b357829003601f168201915b5050505050905090565b6000336107e8818585611307565b60019150505b92915050565b6107fc611314565b611388821115801561081057506113888111155b6108505760405162461bcd60e51b815260206004820152600c60248201526b0a8c2f040e8dede40d0d2ced60a31b60448201526064015b60405180910390fd5b600891909155600955565b600033610869858285611341565b6108748585856113bf565b506001949350505050565b610889338261141e565b50565b60006107ee600f83611454565b6108a1611314565b6108ab6000611479565b565b6108b5611314565b6001600160a01b0381166108fa5760405162461bcd60e51b815260206004820152600c60248201526b5a65726f206164647265737360a01b6044820152606401610847565b600e546040516001600160a01b03918216918316907f849a2ad8ad386f1e9897e9e0a62d16771c675e4740986a16fb31bd8e1dde9c9790600090a3600e80546001600160a01b0319166001600160a01b0392909216919091179055565b61095f611314565b6c0c9f2c9cd04674edea40000000600a819055600b55565b61097f611314565b8015610995576109906011836114cb565b505050565b6109906011836114e0565b5050565b6109af823383611341565b6109a0828261141e565b6109c1611314565b600c546001600160a01b0316610a115760405162461bcd60e51b8152602060048201526015602482015274135d5cdd081cd95d081c9bdd5d195c88199a5c9cdd605a1b6044820152606401610847565b6015805460ff19166001179055565b60606004805461075790612162565b610a37611314565b600d546001600160a01b0390811690831603610a955760405162461bcd60e51b815260206004820152601760248201527f43616e6e6f742072656d6f7665206d61696e20706169720000000000000000006044820152606401610847565b6109a082826114f5565b610aa7611314565b610acb6103e8610ac56c0c9f2c9cd04674edea400000006001611549565b90611555565b821015610b0b5760405162461bcd60e51b815260206004820152600e60248201526d4d617820747820746f6f206c6f7760901b6044820152606401610847565b610b286064610ac56c0c9f2c9cd04674edea400000006001611549565b811015610b6c5760405162461bcd60e51b81526020600482015260126024820152714d61782077616c6c657420746f6f206c6f7760701b6044820152606401610847565b600a91909155600b55565b6000336107e88185856113bf565b610b8d611314565b610bac620186a0610ac56c0c9f2c9cd04674edea400000006001611549565b811015610be55760405162461bcd60e51b8152602060048201526007602482015266546f6f206c6f7760c81b6044820152606401610847565b610c036103e8610ac56c0c9f2c9cd04674edea400000006005611549565b811115610c3d5760405162461bcd60e51b81526020600482015260086024820152670a8dede40d0d2ced60c31b6044820152606401610847565b601655565b610c4a611314565b6001600160a01b038116610c985760405162461bcd60e51b8152602060048201526015602482015274526f757465722063616e6e6f74206265207a65726f60581b6044820152606401610847565b600c546001600160a01b031615610ce65760405162461bcd60e51b8152602060048201526012602482015271149bdd5d195c88185b1c9958591e481cd95d60721b6044820152606401610847565b600c80546001600160a01b0319166001600160a01b0383169081179091556040805163c45a015560e01b815290518392600092909163c45a0155916004808201926020929091908290030181865afa158015610d46573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610d6a919061219c565b6001600160a01b031663e6a4390530846001600160a01b031663ad5c46486040518163ffffffff1660e01b8152600401602060405180830381865afa158015610db7573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610ddb919061219c565b6040516001600160e01b031960e085901b1681526001600160a01b03928316600482015291166024820152604401602060405180830381865afa158015610e26573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610e4a919061219c565b90506001600160a01b038116610fa157816001600160a01b031663c45a01556040518163ffffffff1660e01b8152600401602060405180830381865afa158015610e98573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610ebc919061219c565b6001600160a01b031663c9c6539630846001600160a01b031663ad5c46486040518163ffffffff1660e01b8152600401602060405180830381865afa158015610f09573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610f2d919061219c565b6040516001600160e01b031960e085901b1681526001600160a01b039283166004820152911660248201526044016020604051808303816000875af1158015610f7a573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610f9e919061219c565b90505b600d80546001600160a01b0319166001600160a01b038316179055610fc7836001610977565b610fd2816001610977565b610fdd8160016111fa565b610fe88160016114f5565b806001600160a01b0316836001600160a01b03167f02dc5c233404867c793b749c6d644beb2277536d18a7e7974d3f238e4c6f168460405160405180910390a3505050565b611035611314565b801561104c57611046600f836114cb565b50611059565b611057600f836114e0565b505b816001600160a01b03167f9d8f7706ea1113d1a167b526eca956215946dd36cc7df39eb16180222d8b5df782604051611096911515815260200190565b60405180910390a25050565b6110aa611314565b306001600160a01b038216036111025760405162461bcd60e51b815260206004820152601960248201527f43616e6e6f74207769746864726177206f776e20746f6b656e000000000000006044820152606401610847565b806001600160a01b031663a9059cbb6111236005546001600160a01b031690565b6040516370a0823160e01b81523060048201526001600160a01b038516906370a0823190602401602060405180830381865afa158015611167573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061118b91906121b9565b6040516001600160e01b031960e085901b1681526001600160a01b03909216600483015260248201526044016020604051808303816000875af11580156111d6573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906109a091906121d2565b611202611314565b8015611213576109906013836114cb565b6109906013836114e0565b611226611314565b6001600160a01b03811661125057604051631e4fbdf760e01b815260006004820152602401610847565b61088981611479565b611261611314565b60006112756005546001600160a01b031690565b6001600160a01b03164760405160006040518083038185875af1925050503d80600081146112bf576040519150601f19603f3d011682016040523d82523d6000602084013e6112c4565b606091505b50509050806108895760405162461bcd60e51b815260206004820152600f60248201526e151c985b9cd9995c8819985a5b1959608a1b6044820152606401610847565b6109908383836001611561565b6005546001600160a01b031633146108ab5760405163118cdaa760e01b8152336004820152602401610847565b6001600160a01b0383811660009081526001602090815260408083209386168352929052205460001981146113b957818110156113aa57604051637dc7a0d960e11b81526001600160a01b03841660048201526024810182905260448101839052606401610847565b6113b984848484036000611561565b50505050565b6001600160a01b0383166113e957604051634b637e8f60e11b815260006004820152602401610847565b6001600160a01b0382166114135760405163ec442f0560e01b815260006004820152602401610847565b610990838383611636565b6001600160a01b03821661144857604051634b637e8f60e11b815260006004820152602401610847565b6109a082600083611636565b6001600160a01b038116600090815260018301602052604081205415155b9392505050565b600580546001600160a01b038381166001600160a01b0319831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a35050565b6000611472836001600160a01b038416611b22565b6000611472836001600160a01b038416611b71565b6001600160a01b038216600081815260196020526040808220805460ff191685151590811790915590519092917fffa9187bf1f18bf477bd0ea1bcbb64e93b6a98132473929edfce215cd9b16fab91a35050565b60006114728284612205565b6000611472828461221c565b6001600160a01b03841661158b5760405163e602df0560e01b815260006004820152602401610847565b6001600160a01b0383166115b557604051634a1406b160e11b815260006004820152602401610847565b6001600160a01b03808516600090815260016020908152604080832093871683529290522082905580156113b957826001600160a01b0316846001600160a01b03167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b9258460405161162891815260200190565b60405180910390a350505050565b6001600160a01b038316158061165357506001600160a01b038216155b1561166357610990838383611c64565b806000036116775761099083836000611c64565b6005546001600160a01b038481169116148015906116a357506005546001600160a01b03838116911614155b80156116ba57506001600160a01b03821661dead14155b80156116ce5750601554610100900460ff16155b156119665760155460ff1661173a576116e8600f84611454565b806116f957506116f9600f83611454565b61173a5760405162461bcd60e51b815260206004820152601260248201527154726164696e67206e6f742061637469766560701b6044820152606401610847565b60185460ff1680156117565750600d546001600160a01b031615155b156117ee57600c546001600160a01b038381169116148015906117875750600d546001600160a01b03838116911614155b156117ee573260009081526017602052604090205443116117db5760405162461bcd60e51b815260206004820152600e60248201526d5472616e736665722064656c617960901b6044820152606401610847565b3260009081526017602052604090204390555b6001600160a01b03831660009081526019602052604090205460ff16801561181e575061181c601183611454565b155b1561186c57600a548111156118675760405162461bcd60e51b815260206004820152600f60248201526e084eaf240caf0c6cacac8e640dac2f608b1b6044820152606401610847565b6118e6565b6001600160a01b03821660009081526019602052604090205460ff16801561189c575061189a601184611454565b155b156118e657600a548111156118e65760405162461bcd60e51b815260206004820152601060248201526f0a6cad8d840caf0c6cacac8e640dac2f60831b6044820152606401610847565b6118f1601383611454565b61196657600b5481611918846001600160a01b031660009081526020819052604090205490565b611922919061223e565b11156119665760405162461bcd60e51b815260206004820152601360248201527213585e081dd85b1b195d08195e18d959591959606a1b6044820152606401610847565b600c546001600160a01b031615611a1b5730600090815260208190526040902054601654811080159081906119a35750601554610100900460ff16155b80156119c857506001600160a01b03851660009081526019602052604090205460ff16155b80156119dc57506119da600f86611454565b155b80156119f057506119ee600f85611454565b155b15611a18576015805461ff001916610100179055611a0c611d8e565b6015805461ff00191690555b50505b601554610100900460ff1615611a32600f85611454565b80611a435750611a43600f84611454565b15611a4c575060005b60008115611b10576001600160a01b03841660009081526019602052604090205460ff168015611a7e57506000600954115b15611aa557611a9e612710610ac56009548661154990919063ffffffff16565b9050611af2565b6001600160a01b03851660009081526019602052604090205460ff168015611acf57506000600854115b15611af257611aef612710610ac56008548661154990919063ffffffff16565b90505b8015611b1057611b03853083611c64565b611b0d8184612251565b92505b611b1b858585611c64565b5050505050565b6000818152600183016020526040812054611b69575081546001818101845560008481526020808220909301849055845484825282860190935260409020919091556107ee565b5060006107ee565b60008181526001830160205260408120548015611c5a576000611b95600183612251565b8554909150600090611ba990600190612251565b9050808214611c0e576000866000018281548110611bc957611bc9612264565b9060005260206000200154905080876000018481548110611bec57611bec612264565b6000918252602080832090910192909255918252600188019052604090208390555b8554869080611c1f57611c1f61227a565b6001900381819060005260206000200160009055905585600101600086815260200190815260200160002060009055600193505050506107ee565b60009150506107ee565b6001600160a01b038316611c8f578060026000828254611c84919061223e565b90915550611d019050565b6001600160a01b03831660009081526020819052604090205481811015611ce25760405163391434e360e21b81526001600160a01b03851660048201526024810182905260448101839052606401610847565b6001600160a01b03841660009081526020819052604090209082900390555b6001600160a01b038216611d1d57600280548290039055611d3c565b6001600160a01b03821660009081526020819052604090208054820190555b816001600160a01b0316836001600160a01b03167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef83604051611d8191815260200190565b60405180910390a3505050565b3060009081526020819052604081205490819003611da95750565b60006016548211611dba5781611dbe565b6016545b9050611dc981611e6b565b47801561099057600e546040516000916001600160a01b03169083908381818185875af1925050503d8060008114611e1d576040519150601f19603f3d011682016040523d82523d6000602084013e611e22565b606091505b5050905080156113b95760408051848152602081018490527f20c67c84c631769d26a34799f5602bae0c3e7f5d298a6609a3e0e7da5cbe6529910160405180910390a150505050565b6040805160028082526060820183526000926020830190803683370190505090503081600081518110611ea057611ea0612264565b6001600160a01b03928316602091820292909201810191909152600c54604080516315ab88c960e31b81529051919093169263ad5c46489260048083019391928290030181865afa158015611ef9573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611f1d919061219c565b81600181518110611f3057611f30612264565b6001600160a01b039283166020918202929092010152600c54611f569130911684611307565b600c5460405163791ac94760e01b81526001600160a01b039091169063791ac94790611f8f908590600090869030904290600401612290565b600060405180830381600087803b158015611fa957600080fd5b505af1158015611fbd573d6000803e3d6000fd5b505050505050565b600060208083528351808285015260005b81811015611ff257858101830151858201604001528201611fd6565b506000604082860101526040601f19601f8301168501019250505092915050565b6001600160a01b038116811461088957600080fd5b6000806040838503121561203b57600080fd5b823561204681612013565b946020939093013593505050565b6000806040838503121561206757600080fd5b50508035926020909101359150565b60008060006060848603121561208b57600080fd5b833561209681612013565b925060208401356120a681612013565b929592945050506040919091013590565b6000602082840312156120c957600080fd5b5035919050565b6000602082840312156120e257600080fd5b813561147281612013565b801515811461088957600080fd5b6000806040838503121561210e57600080fd5b823561211981612013565b91506020830135612129816120ed565b809150509250929050565b6000806040838503121561214757600080fd5b823561215281612013565b9150602083013561212981612013565b600181811c9082168061217657607f821691505b60208210810361219657634e487b7160e01b600052602260045260246000fd5b50919050565b6000602082840312156121ae57600080fd5b815161147281612013565b6000602082840312156121cb57600080fd5b5051919050565b6000602082840312156121e457600080fd5b8151611472816120ed565b634e487b7160e01b600052601160045260246000fd5b80820281158282048414176107ee576107ee6121ef565b60008261223957634e487b7160e01b600052601260045260246000fd5b500490565b808201808211156107ee576107ee6121ef565b818103818111156107ee576107ee6121ef565b634e487b7160e01b600052603260045260246000fd5b634e487b7160e01b600052603160045260246000fd5b600060a082018783526020878185015260a0604085015281875180845260c086019150828901935060005b818110156122e05784516001600160a01b0316835293830193918301916001016122bb565b50506001600160a01b0396909616606085015250505060800152939250505056fea2646970667358221220fd9dbed2000792751f6b5691aa1f63cb501258907c2ef1a3747d66f05946ee1964736f6c63430008140033

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

0000000000000000000000002fa273464df2cf399b5b458fcb7a6fc0637fd869

-----Decoded View---------------
Arg [0] : _taxWallet (address): 0x2FA273464Df2Cf399b5B458fcB7a6Fc0637FD869

-----Encoded View---------------
1 Constructor Arguments found :
Arg [0] : 0000000000000000000000002fa273464df2cf399b5b458fcb7a6fc0637fd869


Block Uncle Number Difficulty Gas Used Reward
View All Uncles
Loading...
Loading
Loading...
Loading
Loading...
Loading
[ Download: CSV Export  ]
[ Download: CSV Export  ]

A contract address hosts a smart contract, which is a set of code stored on the blockchain that runs when predetermined conditions are met. Learn more about addresses in our Knowledge Base.