ETH Price: $3,362.76 (+0.45%)

Token

Alpha Gardeners (AG)
 

Overview

Max Total Supply

8,000,000,000 AG

Holders

864 (0.00%)

Market

Price

$0.00 @ 0.000000 ETH (-0.05%)

Onchain Market Cap

$257,680.00

Circulating Supply Market Cap

$0.00

Other Info

Token Contract (WITH 18 Decimals)

Filtered by Token Holder
Alpha Gardeners: AG Token
Balance
1,400,815.252626520429095056 AG

Value
$45.12 ( ~0.0134175664074286 Eth) [0.0175%]
0xcc8e21f599995d1c8367054841b8af5024ddf01b
Loading...
Loading
Loading...
Loading
Loading...
Loading

OVERVIEW

The all-in-one alpha discord & telegram with a complete toolkit for successful shitcoins and NFTs trading

# Exchange Pair Price  24H Volume % Volume
1
Sushiswap
0XCC8E21F599995D1C8367054841B8AF5024DDF01B-0XC02AAA39B223FE8D0A0E5C4F27EAD9083C756CC2$0.00
0.0000000 Eth
$518.92
15,681,933.889 0XCC8E21F599995D1C8367054841B8AF5024DDF01B
100.0000%

Contract Source Code Verified (Exact Match)

Contract Name:
AG

Compiler Version
v0.8.19+commit.7dd6d404

Optimization Enabled:
Yes with 200 runs

Other Settings:
default evmVersion
File 1 of 4 : AlphaGardeners.sol
/**
 * @title Alpha Gardeners - The Ultimate Degen Trading Toolkit
 *
 *      Join us on Telegram: https://t.me/alphagardeners_lounge
 *      Follow us on Twitter: https://twitter.com/alpha_gardeners
 *
 */
// SPDX-License-Identifier: AGPL-3.0-only
pragma solidity ^0.8.19;

import "./Ownable.sol";
import "./Pausable.sol";
import "./IUniswap.sol";

contract AG is Ownable, Pausable {
    /*//////////////////////////////////////////////////////////////
                                 EVENTS
    //////////////////////////////////////////////////////////////*/

    // ERC20 events.
    event Transfer(address indexed from, address indexed to, uint256 amount);
    event Approval(address indexed owner, address indexed spender, uint256 amount);

    // This token specific events.
    event BlacklistStatusUpdated(address wallet, bool isBlacklisted);
    event MarketPairUpdated(address pair, bool isMarketPair);
    event ExcludedFromFeesUpdated(address wallet, bool isExcluded);
    event TaxRecipientUpdated(address recipient);
    event TaxesUpdated(uint256 buyTax, uint256 sellTax, uint256 transferTax);
    event LimitsUpdated(uint256 maxBuy, uint256 maxSell, uint256 maxWallet);
    event NumTokensToSwapUpdated(uint256 amount);
    event ContractSwapEnabledUpdated(bool autoEnabled, bool manualEnabled);

    /*//////////////////////////////////////////////////////////////
                            METADATA STORAGE
    //////////////////////////////////////////////////////////////*/

    string public name;

    string public symbol;

    uint8 public constant decimals = 18;

    /*//////////////////////////////////////////////////////////////
                              ERC20 STORAGE
    //////////////////////////////////////////////////////////////*/

    // No mint or burn means we can just use a constant.
    // Total supply must fit in uint128.
    uint256 public constant totalSupply = 8_000_000_000 * 10**decimals;

    mapping(address => uint256) public balanceOf;

    mapping(address => mapping(address => uint256)) public allowance;

    /*//////////////////////////////////////////////////////////////
                              TOKEN-SPECIFIC
    //////////////////////////////////////////////////////////////*/

    address public taxRecipient;

    uint256 public numTokensToSwap = 2_500_000 * 10**decimals;
    bool public contractSwapEnabled = false;
    bool public manualSwapEnabled = false;
    bool private inSwap;

    IUniswapV2Router02 public uniswapV2Router;
    // IUniswapV2Pair public uniswapV2Pair;
    address private WETH;
    event UniswapRouterUpdated(address newRouter);

    // When accessing the buy tax, we also access buy limit, and the same applies for
    // sell tax and limit. We pack them into a struct to save on gas.
    struct taxAndLimit {
        uint128 tax;
        uint128 limit;
    }

    taxAndLimit public buyTaxAndLimit = taxAndLimit({
        tax: 0,
        limit: uint128(totalSupply)
    });
    taxAndLimit public sellTaxAndLimit = taxAndLimit({
        tax: 0,
        limit: uint128(totalSupply)
    });

    uint256 public transferTax = 0;
    uint256 public maxWallet = totalSupply;

    /// @dev totalSupply * maxTax cannot exceed uint256.
    /// @dev maxTax cannot exceed taxDenominator.
    uint256 private constant maxTax = 1_000; // 10%, same limit applies to all taxes.
    uint256 private constant taxDenominator = 10_000; // 500/10000 = 5%

    // Pack it into a struct instead of individual mappings to save on gas.
    struct walletState {
        bool isBlacklisted;
        bool isMarketPair;
        bool isExcludedFromFees;
    }
    mapping (address => walletState) public _walletState;

    /*//////////////////////////////////////////////////////////////
                            EIP-2612 STORAGE
    //////////////////////////////////////////////////////////////*/

    uint256 internal immutable INITIAL_CHAIN_ID;

    bytes32 internal immutable INITIAL_DOMAIN_SEPARATOR;

    mapping(address => uint256) public nonces;

    /*//////////////////////////////////////////////////////////////
                               CONSTRUCTOR
    //////////////////////////////////////////////////////////////*/

    // Start paused.
    constructor(
        string memory _name,
        string memory _symbol,
        address _taxRecipient,
        address routerAddress
    ) Ownable(msg.sender) Pausable(true) {
        // Require supply to be less than the max uint128 value.
        require(totalSupply < type(uint128).max, "TOTAL_SUPPLY_EXCEEDS_MAX");
        name = _name;
        symbol = _symbol;
        taxRecipient = _taxRecipient;

        // Setup the Uniswap router used for swapping fees.
        uniswapV2Router = IUniswapV2Router02(routerAddress);
        _approve(address(this), routerAddress, type(uint256).max);
        WETH = uniswapV2Router.WETH();

        // Setup for EIP-2612.
        INITIAL_CHAIN_ID = block.chainid;
        INITIAL_DOMAIN_SEPARATOR = computeDomainSeparator();

        // Exclude owner and the contract from fees.
        _walletState[msg.sender] = walletState({
            isBlacklisted: false,
            isMarketPair: false,
            isExcludedFromFees: true
        });
        emit ExcludedFromFeesUpdated(msg.sender, true);
        _walletState[address(this)] = walletState({
            isBlacklisted: false,
            isMarketPair: false,
            isExcludedFromFees: true
        });
        emit ExcludedFromFeesUpdated(address(this), true);

        // Mint the initial supply.
        unchecked {
            balanceOf[msg.sender] += totalSupply;
        }

        emit Transfer(address(0), msg.sender, totalSupply);
    }

    /*//////////////////////////////////////////////////////////////
                               ERC20 LOGIC
    //////////////////////////////////////////////////////////////*/

    function approve(address spender, uint256 amount) public returns (bool) {
        _approve(msg.sender, spender, amount);
        return true;
    }

    function increaseAllowance(address spender, uint256 addedValue) public virtual returns (bool) {
        address owner = msg.sender;
        _approve(owner, spender, allowance[owner][spender] + addedValue);
        return true;
    }

    function decreaseAllowance(address spender, uint256 subtractedValue) public virtual returns (bool) {
        address owner = msg.sender;
        uint256 currentAllowance = allowance[owner][spender];
        require(currentAllowance >= subtractedValue, "ERC20: decreased allowance below zero");
        unchecked {
            _approve(owner, spender, currentAllowance - subtractedValue);
        }

        return true;
    }

    function _approve(
        address owner,
        address spender,
        uint256 amount
    ) internal {
        require(owner != address(0), "ERC20: approve from the zero address");
        require(spender != address(0), "ERC20: approve to the zero address");
        allowance[owner][spender] = amount;
        emit Approval(owner, spender, amount);
    }


    function transfer(address to, uint256 amount) public whenNotPaused returns (bool) {
        _transfer(msg.sender, to, amount);
        return true;
    }

    function transferFrom(
        address from,
        address to,
        uint256 amount
    ) public whenNotPaused returns (bool) {
        uint256 allowed = allowance[from][msg.sender];
        if (allowed != type(uint256).max) {
            require(allowed >= amount, "ERC20: insufficient allowance");
            // Won't overflow since allowed >= amount.
            unchecked {
                allowance[from][msg.sender] = allowed - amount;
            }
        }

        _transfer(from, to, amount);

        return true;
    }

    function _buyTransfer(address to, uint256 amount) internal view returns (uint256) {
        // balanceOf[to]+amount can't exceed uint256 as it can't exceed totalSupply.
        // Taxes are capped at 10k and totalSupply is <= uint(128).max, overflow is impossible.
        unchecked {
            taxAndLimit memory buyConfig = buyTaxAndLimit;
            uint256 fees = (amount * buyConfig.tax) / taxDenominator;

            require(amount <= buyConfig.limit, "transfer exceeds max buy");
            require(balanceOf[to] + amount <= maxWallet, "balance exceeds max wallet");

            return fees;
        }
    }

    function _sellTransfer(uint256 amount) internal view returns (uint256) {
        unchecked {
            taxAndLimit memory sellConfig = sellTaxAndLimit;
            uint256 fees = (amount * sellConfig.tax) / taxDenominator;

            require(amount <= sellConfig.limit, "transfer exceeds max sell");
            // Do not check max wallet as market pairs are allowed to exceed it.

            return fees;
        }
    }

    function _baseTransfer(address to, uint256 amount) internal view returns (uint256) {
        unchecked {
            require(balanceOf[to] + amount <= maxWallet, "balance exceeds max wallet");

            return (amount * transferTax) / taxDenominator;
        }
    }

    function _swapTokens() internal {
        // Only try to swap fees during a sell transaction.
        uint256 numTokens = numTokensToSwap;
        bool overMinTokenBalance = balanceOf[address(this)] >= numTokens;
        if (
            overMinTokenBalance &&
            !inSwap &&
            contractSwapEnabled
        ) {
            // Try to swap the fees and send them to the tax recipient.
            // If this fails, still allow the transfer to go through.
            try this.swapFeesAndSend(numTokens, 0) {} catch {}
        }
    }

    function _calcFees(address to, uint256 amount, bool isBuy, bool isSell) internal view returns (uint256) {
        if(isBuy) {
            return _buyTransfer(to, amount);
        }
        if(isSell) {
            return _sellTransfer(amount);
        }
        return _baseTransfer(to, amount);
    }

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

        uint256 balance = balanceOf[from];
        require(balance >= amount, "ERC20: transfer amount exceeds balance");
        unchecked {
            balanceOf[from] = balance - amount;
        }

        walletState memory fromWalletState = _walletState[from];
        walletState memory toWalletState = _walletState[to];

        // Don't allow blacklisted wallets to receive or send tokens.
        require(!fromWalletState.isBlacklisted && !toWalletState.isBlacklisted, "blacklisted");

        uint256 fees = 0;
        bool takeFee = !fromWalletState.isExcludedFromFees && !toWalletState.isExcludedFromFees;

        // Tax and enforce limits appriopriately.
        if(takeFee) {
            bool isBuy = fromWalletState.isMarketPair;
            bool isSell = toWalletState.isMarketPair;

            fees = _calcFees(to, amount, isBuy, isSell);

            if(isSell && !isBuy) {
                _swapTokens();
            }
        }

        // Add the amount minus fees to the receiver.
        uint256 amountMinusFees;
        // Cannot overflow because the sum of all user
        // balances can't exceed the max uint256 value.
        // fees is less than amount, so it can't overflow.
        unchecked {
            amountMinusFees = amount - fees;
            balanceOf[to] += amountMinusFees;
        }
        emit Transfer(from, to, amountMinusFees);

        // Add any fees collected to the contract.
        if(fees > 0) {
            emit Transfer(from, address(this), fees);
            unchecked {
                balanceOf[address(this)] += fees;
            }
        }
    }

    /*//////////////////////////////////////////////////////////////
                               SWAP LOGIC
    //////////////////////////////////////////////////////////////*/

    modifier lockTheSwap {
        inSwap = true;
        _;
        inSwap = false;
    }

    function swapFeesAndSend(uint256 tokenAmount, uint256 minOut) external lockTheSwap {
        if(msg.sender != address(this)) {
            require(manualSwapEnabled || msg.sender == owner(), "manual swap disabled");
        }

        // generate the uniswap pair path of token -> weth
        address[] memory path = new address[](2);
        path[0] = address(this);
        path[1] = WETH;

        uniswapV2Router.swapExactTokensForETHSupportingFeeOnTransferTokens(
            tokenAmount,
            minOut,
            path,
            taxRecipient, // Send ETH directly to the tax recipient.
            block.timestamp
        );
    }

    /*//////////////////////////////////////////////////////////////
                             OWNER-ONLY
    //////////////////////////////////////////////////////////////*/

    function setBlacklisted(address account, bool value) external onlyOwner {
        require(account != address(this), "cant change contract");
        _walletState[account].isBlacklisted = value;
        emit BlacklistStatusUpdated(account, value);
    }

    function setMarketPair(address account, bool value) external onlyOwner {
        require(account != address(this), "cant change contract");
        _walletState[account].isMarketPair = value;
        emit MarketPairUpdated(account, value);
    }

    function setExcludedFromFees(address account, bool value) external onlyOwner {
        require(account != address(this), "cant change contract");
        _walletState[account].isExcludedFromFees = value;
        emit ExcludedFromFeesUpdated(account, value);
    }

    function setTaxRecipient(address account) external onlyOwner {
        taxRecipient = account;
        emit TaxRecipientUpdated(account);
    }

    function setTaxes(uint256 _buyTax, uint256 _sellTax, uint256 _transferTax) public onlyOwner {
        // Cap any of the taxes to 10% max.
        require(_buyTax <= maxTax, "buy is too high");
        require(_sellTax <= maxTax, "sell is too high");
        require(_transferTax <= maxTax, "transfer is too high");

        buyTaxAndLimit.tax = uint128(_buyTax);
        sellTaxAndLimit.tax = uint128(_sellTax);
        transferTax = _transferTax;

        emit TaxesUpdated(_buyTax, _sellTax, _transferTax);
    }

    // setLimits are in wad of tokens. 1e18 = 1 token.
    function setLimits(uint256 _maxBuyWad, uint256 _maxSellWad, uint256 _maxWalletWad) public onlyOwner {
        require(_maxBuyWad >= 20_000_000, "buy is too low");
        require(_maxSellWad >= 20_000_000, "sell is too low");
        require(_maxWalletWad >= 20_000_000, "wallet is too low");

        buyTaxAndLimit.limit = uint128(_maxBuyWad * 10**decimals);
        sellTaxAndLimit.limit = uint128(_maxSellWad * 10**decimals);
        maxWallet = _maxWalletWad * 10**decimals;

        emit LimitsUpdated(_maxBuyWad * 10**decimals, _maxSellWad * 10**decimals, _maxWalletWad * 10**decimals);
    }

    // setNumTokensToSwap is in wad of tokens. 1e18 = 1 token.
    function setNumTokensToSwap(uint256 amountWad) external onlyOwner {
        require(amountWad > 0, "amount cant be zero");
        numTokensToSwap = amountWad * 10**decimals;

        emit NumTokensToSwapUpdated(amountWad * 10**decimals);
    }

    function setContractSwapEnabled(bool _contractSwapEnabled, bool _manualSwapEnabled) public onlyOwner {
        contractSwapEnabled = _contractSwapEnabled;
        manualSwapEnabled = _manualSwapEnabled;
        emit ContractSwapEnabledUpdated(_contractSwapEnabled, _manualSwapEnabled);
    }

    function Unpause() external onlyOwner {
        _unpause();
    }

    function Pause() external onlyOwner {
        _pause();
    }

    function updateUniswapRouter(address newRouter) external onlyOwner {
        address oldRouterAddress = address(uniswapV2Router);
        require(oldRouterAddress != newRouter, "can't set the same router address");

        uniswapV2Router = IUniswapV2Router02(newRouter);
        WETH = uniswapV2Router.WETH();

        // Approve the new router to spend contract's tokens.
        _approve(address(this), newRouter, type(uint256).max);

        // Reset approval on old router.
        _approve(address(this), oldRouterAddress, 0);

        emit UniswapRouterUpdated(newRouter);
    }

    function openTrading() external onlyOwner {
        // Start with manual swap disabled.
        setContractSwapEnabled(true, false);
        setLimits(
            20_000_000,
            20_000_000,
            60_000_000
        );
        setTaxes(1000, 1000, 0);
        _unpause();
    }

    function skimETH(address to, uint256 amount) external onlyOwner {
        (bool success,) = to.call{value: amount}("");
        require(success, "ETH transfer failed");
    }

    function safeTransfer(address token, address to, uint value) internal {
        // bytes4(keccak256(bytes('transfer(address,uint256)')));
        (bool success, bytes memory data) = token.call(abi.encodeWithSelector(0xa9059cbb, to, value));
        require(success && (data.length == 0 || abi.decode(data, (bool))), 'TRANSFER_FAILED');
    }

    function skimTokens(address tokenAddress, address to, uint256 amount) external onlyOwner {
        safeTransfer(tokenAddress, to, amount);
    }

    /*//////////////////////////////////////////////////////////////
                             PAUSABLE OVERRIDES
    //////////////////////////////////////////////////////////////*/

    // Override the requireNotPaused implementation to allow the owner
    // to interact with the contract while it is paused. This allows the
    // owner to airdrop tokens or add liquidity while in a paused state.
    function _requireNotPaused() internal view override{
        if(paused()) {
            if(tx.origin != owner() && msg.sender != owner()) {
                revert EnforcedPause();
            }
        }
    }

    /*//////////////////////////////////////////////////////////////
                             EIP-2612 LOGIC
    //////////////////////////////////////////////////////////////*/

    function permit(
        address owner,
        address spender,
        uint256 value,
        uint256 deadline,
        uint8 v,
        bytes32 r,
        bytes32 s
    ) public {
        require(deadline >= block.timestamp, "PERMIT_DEADLINE_EXPIRED");

        // Unchecked because the only math done is incrementing
        // the owner's nonce which cannot realistically overflow.
        unchecked {
            address recoveredAddress = ecrecover(
                keccak256(
                    abi.encodePacked(
                        "\x19\x01",
                        DOMAIN_SEPARATOR(),
                        keccak256(
                            abi.encode(
                                keccak256(
                                    "Permit(address owner,address spender,uint256 value,uint256 nonce,uint256 deadline)"
                                ),
                                owner,
                                spender,
                                value,
                                nonces[owner]++,
                                deadline
                            )
                        )
                    )
                ),
                v,
                r,
                s
            );

            require(recoveredAddress != address(0) && recoveredAddress == owner, "INVALID_SIGNER");

            allowance[recoveredAddress][spender] = value;
        }

        emit Approval(owner, spender, value);
    }

    function DOMAIN_SEPARATOR() public view returns (bytes32) {
        return block.chainid == INITIAL_CHAIN_ID ? INITIAL_DOMAIN_SEPARATOR : computeDomainSeparator();
    }

    function computeDomainSeparator() internal view returns (bytes32) {
        return
            keccak256(
                abi.encode(
                    keccak256("EIP712Domain(string name,string version,uint256 chainId,address verifyingContract)"),
                    keccak256(bytes(name)),
                    keccak256("1"),
                    block.chainid,
                    address(this)
                )
            );
    }
}

File 2 of 4 : IUniswap.sol
// SPDX-License-Identifier: MIT
pragma solidity ^0.8.19;

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 addLiquidityETH(
        address token,
        uint amountTokenDesired,
        uint amountTokenMin,
        uint amountETHMin,
        address to,
        uint deadline
    ) external payable returns (uint amountToken, uint amountETH, uint liquidity);
    function removeLiquidity(
        address tokenA,
        address tokenB,
        uint liquidity,
        uint amountAMin,
        uint amountBMin,
        address to,
        uint deadline
    ) external returns (uint amountA, uint amountB);
    function removeLiquidityETH(
        address token,
        uint liquidity,
        uint amountTokenMin,
        uint amountETHMin,
        address to,
        uint deadline
    ) external returns (uint amountToken, uint amountETH);
    function removeLiquidityWithPermit(
        address tokenA,
        address tokenB,
        uint liquidity,
        uint amountAMin,
        uint amountBMin,
        address to,
        uint deadline,
        bool approveMax, uint8 v, bytes32 r, bytes32 s
    ) external returns (uint amountA, uint amountB);
    function removeLiquidityETHWithPermit(
        address token,
        uint liquidity,
        uint amountTokenMin,
        uint amountETHMin,
        address to,
        uint deadline,
        bool approveMax, uint8 v, bytes32 r, bytes32 s
    ) external returns (uint amountToken, uint amountETH);
    function swapExactTokensForTokens(
        uint amountIn,
        uint amountOutMin,
        address[] calldata path,
        address to,
        uint deadline
    ) external returns (uint[] memory amounts);
    function swapTokensForExactTokens(
        uint amountOut,
        uint amountInMax,
        address[] calldata path,
        address to,
        uint deadline
    ) external returns (uint[] memory amounts);
    function swapExactETHForTokens(uint amountOutMin, address[] calldata path, address to, uint deadline)
        external
        payable
        returns (uint[] memory amounts);
    function swapTokensForExactETH(uint amountOut, uint amountInMax, address[] calldata path, address to, uint deadline)
        external
        returns (uint[] memory amounts);
    function swapExactTokensForETH(uint amountIn, uint amountOutMin, address[] calldata path, address to, uint deadline)
        external
        returns (uint[] memory amounts);
    function swapETHForExactTokens(uint amountOut, address[] calldata path, address to, uint deadline)
        external
        payable
        returns (uint[] memory amounts);

    function quote(uint amountA, uint reserveA, uint reserveB) external pure returns (uint amountB);
    function getAmountOut(uint amountIn, uint reserveIn, uint reserveOut) external pure returns (uint amountOut);
    function getAmountIn(uint amountOut, uint reserveIn, uint reserveOut) external pure returns (uint amountIn);
    function getAmountsOut(uint amountIn, address[] calldata path) external view returns (uint[] memory amounts);
    function getAmountsIn(uint amountOut, address[] calldata path) external view returns (uint[] memory amounts);
}

interface IUniswapV2Router02 is IUniswapV2Router01 {
    function removeLiquidityETHSupportingFeeOnTransferTokens(
        address token,
        uint liquidity,
        uint amountTokenMin,
        uint amountETHMin,
        address to,
        uint deadline
    ) external returns (uint amountETH);
    function removeLiquidityETHWithPermitSupportingFeeOnTransferTokens(
        address token,
        uint liquidity,
        uint amountTokenMin,
        uint amountETHMin,
        address to,
        uint deadline,
        bool approveMax, uint8 v, bytes32 r, bytes32 s
    ) external returns (uint amountETH);

    function swapExactTokensForTokensSupportingFeeOnTransferTokens(
        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 swapExactTokensForETHSupportingFeeOnTransferTokens(
        uint amountIn,
        uint amountOutMin,
        address[] calldata path,
        address to,
        uint deadline
    ) external;
}

interface IUniswapV2Factory {
    event PairCreated(address indexed token0, address indexed token1, address pair, uint);

    function feeTo() external view returns (address);
    function feeToSetter() external view returns (address);

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

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

    function setFeeTo(address) external;
    function setFeeToSetter(address) external;
}

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

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

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

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

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

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

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

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

    function initialize(address, address) external;
}

File 3 of 4 : Pausable.sol
// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts (last updated v4.7.0) (security/Pausable.sol)

pragma solidity ^0.8.19;

/**
 * @dev Contract module which allows children to implement an emergency stop
 * mechanism that can be triggered by an authorized account.
 *
 * This module is used through inheritance. It will make available the
 * modifiers `whenNotPaused` and `whenPaused`, which can be applied to
 * the functions of your contract. Note that they will not be pausable by
 * simply including this module, only once the modifiers are put in place.
 */
/// @dev edits: pass initial pause state in constructor and removed context dependency.
/// @author OpenZeppelin https://github.com/OpenZeppelin/openzeppelin-contracts/blob/master/contracts/security/Pausable.sol
abstract contract Pausable {
    bool private _paused;

    /**
     * @dev Emitted when the pause is triggered by `account`.
     */
    event Paused(address account);

    /**
     * @dev Emitted when the pause is lifted by `account`.
     */
    event Unpaused(address account);

    /**
     * @dev The operation failed because the contract is paused.
     */
    error EnforcedPause();

    /**
     * @dev The operation failed because the contract is not paused.
     */
    error ExpectedPause();

    /**
     * @dev Initializes the contract in unpaused state.
     */
    constructor(bool initialPaused) {
        _paused = initialPaused;
    }

    /**
     * @dev Modifier to make a function callable only when the contract is not paused.
     *
     * Requirements:
     *
     * - The contract must not be paused.
     */
    modifier whenNotPaused() {
        _requireNotPaused();
        _;
    }

    /**
     * @dev Modifier to make a function callable only when the contract is paused.
     *
     * Requirements:
     *
     * - The contract must be paused.
     */
    modifier whenPaused() {
        _requirePaused();
        _;
    }

    /**
     * @dev Returns true if the contract is paused, and false otherwise.
     */
    function paused() public view virtual returns (bool) {
        return _paused;
    }

    /**
     * @dev Throws if the contract is paused.
     */
    function _requireNotPaused() internal view virtual {
        if (paused()) {
            revert EnforcedPause();
        }
    }

    /**
     * @dev Throws if the contract is not paused.
     */
    function _requirePaused() internal view virtual {
        if (!paused()) {
            revert ExpectedPause();
        }
    }

    /**
     * @dev Triggers stopped state.
     *
     * Requirements:
     *
     * - The contract must not be paused.
     */
    function _pause() internal virtual whenNotPaused {
        _paused = true;
        emit Paused(msg.sender);
    }

    /**
     * @dev Returns to normal state.
     *
     * Requirements:
     *
     * - The contract must be paused.
     */
    function _unpause() internal virtual whenPaused {
        _paused = false;
        emit Unpaused(msg.sender);
    }
}

File 4 of 4 : Ownable.sol
// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts (last updated v4.9.0) (access/Ownable.sol)

pragma solidity ^0.8.19;

/// @dev removed context dependency.
/// @author OpenZeppelin https://github.com/OpenZeppelin/openzeppelin-contracts/blob/master/contracts/access/Ownable.sol
abstract contract Ownable {
    address private _owner;

    /**
     * @dev The caller account is not authorized to perform an operation.
     */
    error OwnableUnauthorizedAccount(address account);

    /**
     * @dev The owner is not a valid owner account. (eg. `address(0)`)
     */
    error OwnableInvalidOwner(address owner);

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

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

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

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

    /**
     * @dev Throws if the sender is not the owner.
     */
    function _checkOwner() internal view virtual {
        if (owner() != msg.sender) {
            revert OwnableUnauthorizedAccount(msg.sender);
        }
    }

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

    /**
     * @dev Transfers ownership of the contract to a new account (`newOwner`).
     * Can only be called by the current owner.
     */
    function transferOwnership(address newOwner) public virtual onlyOwner {
        if (newOwner == address(0)) {
            revert OwnableInvalidOwner(address(0));
        }
        _transferOwnership(newOwner);
    }

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

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

Contract Security Audit

Contract ABI

[{"inputs":[{"internalType":"string","name":"_name","type":"string"},{"internalType":"string","name":"_symbol","type":"string"},{"internalType":"address","name":"_taxRecipient","type":"address"},{"internalType":"address","name":"routerAddress","type":"address"}],"stateMutability":"nonpayable","type":"constructor"},{"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"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"spender","type":"address"},{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"}],"name":"Approval","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"wallet","type":"address"},{"indexed":false,"internalType":"bool","name":"isBlacklisted","type":"bool"}],"name":"BlacklistStatusUpdated","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"bool","name":"autoEnabled","type":"bool"},{"indexed":false,"internalType":"bool","name":"manualEnabled","type":"bool"}],"name":"ContractSwapEnabledUpdated","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"wallet","type":"address"},{"indexed":false,"internalType":"bool","name":"isExcluded","type":"bool"}],"name":"ExcludedFromFeesUpdated","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"maxBuy","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"maxSell","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"maxWallet","type":"uint256"}],"name":"LimitsUpdated","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"pair","type":"address"},{"indexed":false,"internalType":"bool","name":"isMarketPair","type":"bool"}],"name":"MarketPairUpdated","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"}],"name":"NumTokensToSwapUpdated","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":false,"internalType":"address","name":"recipient","type":"address"}],"name":"TaxRecipientUpdated","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"buyTax","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"sellTax","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"transferTax","type":"uint256"}],"name":"TaxesUpdated","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":"amount","type":"uint256"}],"name":"Transfer","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"newRouter","type":"address"}],"name":"UniswapRouterUpdated","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"account","type":"address"}],"name":"Unpaused","type":"event"},{"inputs":[],"name":"DOMAIN_SEPARATOR","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"Pause","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"Unpause","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"_walletState","outputs":[{"internalType":"bool","name":"isBlacklisted","type":"bool"},{"internalType":"bool","name":"isMarketPair","type":"bool"},{"internalType":"bool","name":"isExcludedFromFees","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"},{"internalType":"address","name":"","type":"address"}],"name":"allowance","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"spender","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"approve","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"balanceOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"buyTaxAndLimit","outputs":[{"internalType":"uint128","name":"tax","type":"uint128"},{"internalType":"uint128","name":"limit","type":"uint128"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"contractSwapEnabled","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"decimals","outputs":[{"internalType":"uint8","name":"","type":"uint8"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"spender","type":"address"},{"internalType":"uint256","name":"subtractedValue","type":"uint256"}],"name":"decreaseAllowance","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"spender","type":"address"},{"internalType":"uint256","name":"addedValue","type":"uint256"}],"name":"increaseAllowance","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"manualSwapEnabled","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"maxWallet","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"name","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"nonces","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"numTokensToSwap","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"openTrading","outputs":[],"stateMutability":"nonpayable","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":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"address","name":"spender","type":"address"},{"internalType":"uint256","name":"value","type":"uint256"},{"internalType":"uint256","name":"deadline","type":"uint256"},{"internalType":"uint8","name":"v","type":"uint8"},{"internalType":"bytes32","name":"r","type":"bytes32"},{"internalType":"bytes32","name":"s","type":"bytes32"}],"name":"permit","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"sellTaxAndLimit","outputs":[{"internalType":"uint128","name":"tax","type":"uint128"},{"internalType":"uint128","name":"limit","type":"uint128"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"},{"internalType":"bool","name":"value","type":"bool"}],"name":"setBlacklisted","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bool","name":"_contractSwapEnabled","type":"bool"},{"internalType":"bool","name":"_manualSwapEnabled","type":"bool"}],"name":"setContractSwapEnabled","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"},{"internalType":"bool","name":"value","type":"bool"}],"name":"setExcludedFromFees","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_maxBuyWad","type":"uint256"},{"internalType":"uint256","name":"_maxSellWad","type":"uint256"},{"internalType":"uint256","name":"_maxWalletWad","type":"uint256"}],"name":"setLimits","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"},{"internalType":"bool","name":"value","type":"bool"}],"name":"setMarketPair","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"amountWad","type":"uint256"}],"name":"setNumTokensToSwap","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"setTaxRecipient","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_buyTax","type":"uint256"},{"internalType":"uint256","name":"_sellTax","type":"uint256"},{"internalType":"uint256","name":"_transferTax","type":"uint256"}],"name":"setTaxes","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"skimETH","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"tokenAddress","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"skimTokens","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenAmount","type":"uint256"},{"internalType":"uint256","name":"minOut","type":"uint256"}],"name":"swapFeesAndSend","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"symbol","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"taxRecipient","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"transfer","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"transferFrom","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"transferTax","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"uniswapV2Router","outputs":[{"internalType":"contract IUniswapV2Router02","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"newRouter","type":"address"}],"name":"updateUniswapRouter","outputs":[],"stateMutability":"nonpayable","type":"function"}]

60c0604052620000126012600a620007aa565b6200002190622625a0620007c2565b6006556007805461ffff191690556040805180820190915260008152602081016200004f6012600a620007aa565b62000060906401dcd65000620007c2565b6001600160801b0390811690915281516020928301518216600160801b029116176009556040805180820190915260008152908101620000a36012600a620007aa565b620000b4906401dcd65000620007c2565b6001600160801b0390811690915281516020909201518116600160801b02911617600a9081556000600b55620000ed90601290620007aa565b620000fe906401dcd65000620007c2565b600c553480156200010e57600080fd5b50604051620031d7380380620031d78339810160408190526200013191620008be565b6001336200013f8162000481565b5060008054911515600160a01b0260ff60a01b199092169190911790556001600160801b03620001726012600a620007aa565b62000183906401dcd65000620007c2565b10620001d65760405162461bcd60e51b815260206004820152601860248201527f544f54414c5f535550504c595f455843454544535f4d4158000000000000000060448201526064015b60405180910390fd5b6001620001e48582620009dc565b506002620001f38482620009dc565b50600580546001600160a01b0319166001600160a01b0384811691909117909155600780546301000000600160b81b031916630100000092841692909202919091179055620002463082600019620004d1565b600760039054906101000a90046001600160a01b03166001600160a01b031663ad5c46486040518163ffffffff1660e01b8152600401602060405180830381865afa1580156200029a573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190620002c0919062000aa8565b600880546001600160a01b0319166001600160a01b039290921691909117905546608052620002ee620005f9565b60a0526040805160608101825260008082526020808301828152600184860181815233808652600d85529487902095518654935191511515620100000262ff0000199215156101000261ff00199215159290921661ffff19909516949094171716919091179093558351918252810191909152600080516020620031b7833981519152910160405180910390a16040805160608101825260008082526020808301828152600184860181815230808652600d85529487902095518654935191511515620100000262ff0000199215156101000261ff00199215159290921661ffff19909516949094171716919091179093558351918252810191909152600080516020620031b7833981519152910160405180910390a133600081815260036020526040812080546b19d971e4fe8401e7400000000190557fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef620004556012600a620007aa565b62000466906401dcd65000620007c2565b60405190815260200160405180910390a35050505062000b44565b600080546001600160a01b038381166001600160a01b0319831681178455604051919092169283917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e09190a35050565b6001600160a01b038316620005355760405162461bcd60e51b8152602060048201526024808201527f45524332303a20617070726f76652066726f6d20746865207a65726f206164646044820152637265737360e01b6064820152608401620001cd565b6001600160a01b038216620005985760405162461bcd60e51b815260206004820152602260248201527f45524332303a20617070726f766520746f20746865207a65726f206164647265604482015261737360f01b6064820152608401620001cd565b6001600160a01b0383811660008181526004602090815260408083209487168084529482529182902085905590518481527f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925910160405180910390a3505050565b60007f8b73c3c69bb8fe3d512ecc4cf759cc79239f7b179b0ffacaa9a75d522b39400f60016040516200062d919062000ac6565b6040805191829003822060208301939093528101919091527fc89efdaa54c0f20c7adf612882df0950f5a951637e0307cdcb4c672f298b8bc660608201524660808201523060a082015260c00160405160208183030381529060405280519060200120905090565b634e487b7160e01b600052601160045260246000fd5b600181815b80851115620006ec578160001904821115620006d057620006d062000695565b80851615620006de57918102915b93841c9390800290620006b0565b509250929050565b6000826200070557506001620007a4565b816200071457506000620007a4565b81600181146200072d5760028114620007385762000758565b6001915050620007a4565b60ff8411156200074c576200074c62000695565b50506001821b620007a4565b5060208310610133831016604e8410600b84101617156200077d575081810a620007a4565b620007898383620006ab565b8060001904821115620007a057620007a062000695565b0290505b92915050565b6000620007bb60ff841683620006f4565b9392505050565b8082028115828204841417620007a457620007a462000695565b634e487b7160e01b600052604160045260246000fd5b600082601f8301126200080457600080fd5b81516001600160401b0380821115620008215762000821620007dc565b604051601f8301601f19908116603f011681019082821181831017156200084c576200084c620007dc565b816040528381526020925086838588010111156200086957600080fd5b600091505b838210156200088d57858201830151818301840152908201906200086e565b600093810190920192909252949350505050565b80516001600160a01b0381168114620008b957600080fd5b919050565b60008060008060808587031215620008d557600080fd5b84516001600160401b0380821115620008ed57600080fd5b620008fb88838901620007f2565b955060208701519150808211156200091257600080fd5b506200092187828801620007f2565b9350506200093260408601620008a1565b91506200094260608601620008a1565b905092959194509250565b600181811c908216806200096257607f821691505b6020821081036200098357634e487b7160e01b600052602260045260246000fd5b50919050565b601f821115620009d757600081815260208120601f850160051c81016020861015620009b25750805b601f850160051c820191505b81811015620009d357828155600101620009be565b5050505b505050565b81516001600160401b03811115620009f857620009f8620007dc565b62000a108162000a0984546200094d565b8462000989565b602080601f83116001811462000a48576000841562000a2f5750858301515b600019600386901b1c1916600185901b178555620009d3565b600085815260208120601f198616915b8281101562000a795788860151825594840194600190910190840162000a58565b508582101562000a985787850151600019600388901b60f8161c191681555b5050505050600190811b01905550565b60006020828403121562000abb57600080fd5b620007bb82620008a1565b600080835462000ad6816200094d565b6001828116801562000af1576001811462000b075762000b38565b60ff198416875282151583028701945062000b38565b8760005260208060002060005b8581101562000b2f5781548a82015290840190820162000b14565b50505082870194505b50929695505050505050565b60805160a05161264d62000b6a6000396000610a7c01526000610a47015261264d6000f3fe608060405234801561001057600080fd5b50600436106102695760003560e01c80638124f7ac11610151578063c9567bf9116100c3578063dd62ed3e11610087578063dd62ed3e146105a7578063e13e5c2d146105d2578063e9dae5ed146105e5578063f2fde38b146105f8578063f8b45b051461060b578063fdb78c0e1461061457600080fd5b8063c9567bf91461051d578063d01dd6d214610525578063d505accf14610538578063d53cd5661461054b578063d683804e1461058957600080fd5b8063a457c2d711610115578063a457c2d7146104ab578063a9059cbb146104be578063ae0295e2146104d1578063b359303a146104e4578063bfc2fc35146104f7578063c16dd4a41461050a57600080fd5b80638124f7ac146104645780638da5cb5b1461046d578063908bb2ae1461047e57806395d89b411461049157806398fbb9061461049957600080fd5b80633644e515116101ea57806370a08231116101ae57806370a08231146103ee578063715018a61461040e578063737ea06e146104165780637805862f1461042957806378e3079e146104315780637ecebe001461044457600080fd5b80633644e515146103a657806339509351146103ae578063590ffdce146103c15780635c975abb146103d45780636985a022146103e657600080fd5b80631694505e116102315780631694505e1461032c57806318160ddd1461035e578063189ae5f21461036657806323b872dd14610379578063313ce5671461038c57600080fd5b806301a6c43b1461026e57806306fdde031461028a578063095ea7b31461029f5780630f569dad146102c2578063143373a0146102d7575b600080fd5b61027760065481565b6040519081526020015b60405180910390f35b610292610621565b60405161028191906120a7565b6102b26102ad3660046120ef565b6106af565b6040519015158152602001610281565b6102d56102d036600461211b565b6106c6565b005b61030d6102e5366004612134565b600d6020526000908152604090205460ff808216916101008104821691620100009091041683565b6040805193151584529115156020840152151590820152606001610281565b60075461034690630100000090046001600160a01b031681565b6040516001600160a01b039091168152602001610281565b61027761077e565b6102d5610374366004612151565b61079c565b6102b261038736600461217d565b61097d565b610394601281565b60405160ff9091168152602001610281565b610277610a43565b6102b26103bc3660046120ef565b610a9e565b6102d56103cf3660046121cc565b610ae7565b600054600160a01b900460ff166102b2565b6102d5610b85565b6102776103fc366004612134565b60036020526000908152604090205481565b6102d5610b97565b600554610346906001600160a01b031681565b6102d5610ba9565b6102d561043f366004612134565b610bb9565b610277610452366004612134565b600e6020526000908152604090205481565b610277600b5481565b6000546001600160a01b0316610346565b6102d561048c366004612134565b610c0f565b610292610d97565b6007546102b290610100900460ff1681565b6102b26104b93660046120ef565b610da4565b6102b26104cc3660046120ef565b610e36565b6102d56104df3660046120ef565b610e4b565b6102d56104f2366004612205565b610ef1565b6102d5610505366004612227565b611067565b6102d56105183660046121cc565b6110cb565b6102d561115f565b6102d56105333660046121cc565b611194565b6102d5610546366004612245565b611220565b600954610569906001600160801b0380821691600160801b90041682565b604080516001600160801b03938416815292909116602083015201610281565b600a54610569906001600160801b0380821691600160801b90041682565b6102776105b53660046122bc565b600460209081526000928352604080842090915290825290205481565b6102d56105e036600461217d565b611464565b6102d56105f3366004612151565b611477565b6102d5610606366004612134565b6115cd565b610277600c5481565b6007546102b29060ff1681565b6001805461062e906122ea565b80601f016020809104026020016040519081016040528092919081815260200182805461065a906122ea565b80156106a75780601f1061067c576101008083540402835291602001916106a7565b820191906000526020600020905b81548152906001019060200180831161068a57829003601f168201915b505050505081565b60006106bc33848461160b565b5060015b92915050565b6106ce61172f565b600081116107195760405162461bcd60e51b8152602060048201526013602482015272616d6f756e742063616e74206265207a65726f60681b60448201526064015b60405180910390fd5b6107256012600a61241e565b61072f908261242d565b6006557f4e3e41dc675aea3fcba9c02c7825641a2888e42a4b888399511f5276ca84b81861075f6012600a61241e565b610769908361242d565b6040519081526020015b60405180910390a150565b61078a6012600a61241e565b610799906401dcd6500061242d565b81565b6107a461172f565b6301312d008310156107e95760405162461bcd60e51b815260206004820152600e60248201526d62757920697320746f6f206c6f7760901b6044820152606401610710565b6301312d0082101561082f5760405162461bcd60e51b815260206004820152600f60248201526e73656c6c20697320746f6f206c6f7760881b6044820152606401610710565b6301312d008110156108775760405162461bcd60e51b815260206004820152601160248201527077616c6c657420697320746f6f206c6f7760781b6044820152606401610710565b6108836012600a61241e565b61088d908461242d565b600980546001600160801b03928316600160801b0292169190911790556108b66012600a61241e565b6108c0908361242d565b600a80546001600160801b03928316600160801b0292169190911781556108e99060129061241e565b6108f3908261242d565b600c557faa2ef8ba434f2f6bdaad3fcc2d5c35f02b08a47173c94877259407614bc46b556109236012600a61241e565b61092d908561242d565b6109396012600a61241e565b610943908561242d565b61094f6012600a61241e565b610959908561242d565b604080519384526020840192909252908201526060015b60405180910390a1505050565b600061098761176b565b6001600160a01b03841660009081526004602090815260408083203384529091529020546000198114610a2d5782811015610a045760405162461bcd60e51b815260206004820152601d60248201527f45524332303a20696e73756666696369656e7420616c6c6f77616e63650000006044820152606401610710565b6001600160a01b0385166000908152600460209081526040808320338452909152902083820390555b610a388585856117c1565b506001949350505050565b60007f00000000000000000000000000000000000000000000000000000000000000004614610a7957610a74611af1565b905090565b507f000000000000000000000000000000000000000000000000000000000000000090565b3360008181526004602090815260408083206001600160a01b0387168452909152812054909190610add9082908690610ad8908790612444565b61160b565b5060019392505050565b610aef61172f565b306001600160a01b03831603610b175760405162461bcd60e51b815260040161071090612457565b6001600160a01b0382166000818152600d6020908152604091829020805462ff0000191662010000861515908102919091179091558251938452908301527fe4cbcfb1a60e2c589f335f74c6c57b0be57eb6c50eb56442d8a67735dba70cad91015b60405180910390a15050565b610b8d61172f565b610b95611b8b565b565b610b9f61172f565b610b956000611bdc565b610bb161172f565b610b95611c2c565b610bc161172f565b600580546001600160a01b0319166001600160a01b0383169081179091556040519081527fcb5639215577b3eba6150c2a74d8de8ea5885c176e29e2e66a7551cc15b7a7cf90602001610773565b610c1761172f565b6007546001600160a01b03630100000090910481169082168103610c875760405162461bcd60e51b815260206004820152602160248201527f63616e277420736574207468652073616d6520726f75746572206164647265736044820152607360f81b6064820152608401610710565b81600760036101000a8154816001600160a01b0302191690836001600160a01b03160217905550600760039054906101000a90046001600160a01b03166001600160a01b031663ad5c46486040518163ffffffff1660e01b8152600401602060405180830381865afa158015610d01573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610d259190612485565b600880546001600160a01b0319166001600160a01b0392909216919091179055610d52308360001961160b565b610d5e3082600061160b565b6040516001600160a01b03831681527f455a5e52b7c01aa52d717db42e17b6610b0c2c96560c85b7e5adcdd254bfc17c90602001610b79565b6002805461062e906122ea565b3360008181526004602090815260408083206001600160a01b038716845290915281205490919083811015610e295760405162461bcd60e51b815260206004820152602560248201527f45524332303a2064656372656173656420616c6c6f77616e63652062656c6f77604482015264207a65726f60d81b6064820152608401610710565b610a38828686840361160b565b6000610e4061176b565b6106bc3384846117c1565b610e5361172f565b6000826001600160a01b03168260405160006040518083038185875af1925050503d8060008114610ea0576040519150601f19603f3d011682016040523d82523d6000602084013e610ea5565b606091505b5050905080610eec5760405162461bcd60e51b8152602060048201526013602482015272115512081d1c985b9cd9995c8819985a5b1959606a1b6044820152606401610710565b505050565b6007805462ff0000191662010000179055333014610f6c57600754610100900460ff1680610f2957506000546001600160a01b031633145b610f6c5760405162461bcd60e51b81526020600482015260146024820152731b585b9d585b081cddd85c08191a5cd8589b195960621b6044820152606401610710565b6040805160028082526060820183526000926020830190803683370190505090503081600081518110610fa157610fa16124a2565b6001600160a01b039283166020918202929092010152600854825191169082906001908110610fd257610fd26124a2565b6001600160a01b03928316602091820292909201015260075460055460405163791ac94760e01b8152630100000090920483169263791ac94792611024928892889288929091169042906004016124b8565b600060405180830381600087803b15801561103e57600080fd5b505af1158015611052573d6000803e3d6000fd5b50506007805462ff0000191690555050505050565b61106f61172f565b60078054821515610100810261ff001986151590811661ffff1990941693909317179092556040805191825260208201929092527fe170718435bb78d34d60ff2ad1c1fb4275ec0f1914bbcba82e7d67847b3279229101610b79565b6110d361172f565b306001600160a01b038316036110fb5760405162461bcd60e51b815260040161071090612457565b6001600160a01b0382166000818152600d6020908152604091829020805461ff001916610100861515908102919091179091558251938452908301527f160ff69a72bc70f3e792a86c87d27070e421562197f032d96bcab11c5010222e9101610b79565b61116761172f565b61117360016000611067565b6111866301312d0080630393870061079c565b610bb16103e8806000611477565b61119c61172f565b306001600160a01b038316036111c45760405162461bcd60e51b815260040161071090612457565b6001600160a01b0382166000818152600d6020908152604091829020805460ff19168515159081179091558251938452908301527f92d364d140f902817e5eaa71cedfe20bae2a3c66a2725cee3d9a51d73f052fb69101610b79565b428410156112705760405162461bcd60e51b815260206004820152601760248201527f5045524d49545f444541444c494e455f455850495245440000000000000000006044820152606401610710565b6000600161127c610a43565b6001600160a01b038a81166000818152600e602090815260409182902080546001810190915582517f6e71edae12b1b97f4d1f60370fef10105fa2faae0126114a169c64845d6126c98184015280840194909452938d166060840152608083018c905260a083019390935260c08083018b90528151808403909101815260e08301909152805192019190912061190160f01b6101008301526101028201929092526101228101919091526101420160408051601f198184030181528282528051602091820120600084529083018083525260ff871690820152606081018590526080810184905260a0016020604051602081039080840390855afa158015611388573d6000803e3d6000fd5b5050604051601f1901519150506001600160a01b038116158015906113be5750876001600160a01b0316816001600160a01b0316145b6113fb5760405162461bcd60e51b815260206004820152600e60248201526d24a72b20a624a22fa9a4a3a722a960911b6044820152606401610710565b6001600160a01b0390811660009081526004602090815260408083208a8516808552908352928190208990555188815291928a16917f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925910160405180910390a350505050505050565b61146c61172f565b610eec838383611c71565b61147f61172f565b6103e88311156114c35760405162461bcd60e51b815260206004820152600f60248201526e0c4eaf240d2e640e8dede40d0d2ced608b1b6044820152606401610710565b6103e88211156115085760405162461bcd60e51b815260206004820152601060248201526f0e6cad8d840d2e640e8dede40d0d2ced60831b6044820152606401610710565b6103e88111156115515760405162461bcd60e51b81526020600482015260146024820152730e8e4c2dce6cccae440d2e640e8dede40d0d2ced60631b6044820152606401610710565b600980546001600160801b038581166fffffffffffffffffffffffffffffffff1992831617909255600a805492851692909116919091179055600b81905560408051848152602081018490529081018290527fbf599f0b0b785a611d748a0dfabee402e180323c72c9ed973e5cc29d23c992d890606001610970565b6115d561172f565b6001600160a01b0381166115ff57604051631e4fbdf760e01b815260006004820152602401610710565b61160881611bdc565b50565b6001600160a01b03831661166d5760405162461bcd60e51b8152602060048201526024808201527f45524332303a20617070726f76652066726f6d20746865207a65726f206164646044820152637265737360e01b6064820152608401610710565b6001600160a01b0382166116ce5760405162461bcd60e51b815260206004820152602260248201527f45524332303a20617070726f766520746f20746865207a65726f206164647265604482015261737360f01b6064820152608401610710565b6001600160a01b0383811660008181526004602090815260408083209487168084529482529182902085905590518481527f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925910160405180910390a3505050565b336117426000546001600160a01b031690565b6001600160a01b031614610b955760405163118cdaa760e01b8152336004820152602401610710565b600054600160a01b900460ff1615610b95576000546001600160a01b031632148015906117a357506000546001600160a01b03163314155b15610b955760405163d93c066560e01b815260040160405180910390fd5b6001600160a01b0383166118255760405162461bcd60e51b815260206004820152602560248201527f45524332303a207472616e736665722066726f6d20746865207a65726f206164604482015264647265737360d81b6064820152608401610710565b6001600160a01b0382166118875760405162461bcd60e51b815260206004820152602360248201527f45524332303a207472616e7366657220746f20746865207a65726f206164647260448201526265737360e81b6064820152608401610710565b6001600160a01b038316600090815260036020526040902054818110156118ff5760405162461bcd60e51b815260206004820152602660248201527f45524332303a207472616e7366657220616d6f756e7420657863656564732062604482015265616c616e636560d01b6064820152608401610710565b6001600160a01b0380851660009081526003602090815260408083208686039055600d808352818420825160608082018552915460ff80821615158352610100808304821615158489015262010000928390048216151584880152988c1688529386529584902084519283018552548084161515835296870483161515948201949094529390940490931615159282019290925281511580156119a157508051155b6119db5760405162461bcd60e51b815260206004820152600b60248201526a189b1858dadb1a5cdd195960aa1b6044820152606401610710565b60008083604001511580156119f257508260400151155b90508015611a2d5760208085015190840151611a1089898484611d7e565b9350808015611a1d575081155b15611a2a57611a2a611dbb565b50505b6001600160a01b038781166000818152600360209081526040918290208054878c03908101909155915182815291938c16917fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef910160405180910390a38215611ae65760405183815230906001600160a01b038b16907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef9060200160405180910390a33060009081526003602052604090208054840190555b505050505050505050565b60007f8b73c3c69bb8fe3d512ecc4cf759cc79239f7b179b0ffacaa9a75d522b39400f6001604051611b239190612529565b6040805191829003822060208301939093528101919091527fc89efdaa54c0f20c7adf612882df0950f5a951637e0307cdcb4c672f298b8bc660608201524660808201523060a082015260c00160405160208183030381529060405280519060200120905090565b611b9361176b565b6000805460ff60a01b1916600160a01b1790556040513381527f62e78cea01bee320cd4e420270b5ea74000d11b0c9f74754ebdbfc544b05a258906020015b60405180910390a1565b600080546001600160a01b038381166001600160a01b0319831681178455604051919092169283917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e09190a35050565b611c34611e4e565b6000805460ff60a01b191690556040513381527f5db9ee0a495bf2e6ff9c91a7834c1ba4fdd244a5e8aa4e537bd38aeae4b073aa90602001611bd2565b604080516001600160a01b038481166024830152604480830185905283518084039091018152606490920183526020820180516001600160e01b031663a9059cbb60e01b1790529151600092839290871691611ccd91906125c8565b6000604051808303816000865af19150503d8060008114611d0a576040519150601f19603f3d011682016040523d82523d6000602084013e611d0f565b606091505b5091509150818015611d39575080511580611d39575080806020019051810190611d3991906125e4565b611d775760405162461bcd60e51b815260206004820152600f60248201526e1514905394d1915497d19052531151608a1b6044820152606401610710565b5050505050565b60008215611d9757611d908585611e78565b9050611db3565b8115611da657611d9084611f6a565b611db08585611ff7565b90505b949350505050565b6006543060009081526003602052604090205481118015908190611de8575060075462010000900460ff16155b8015611df6575060075460ff165b15611e4a576040516359ac981d60e11b81526004810183905260006024820152309063b359303a90604401600060405180830381600087803b158015611e3b57600080fd5b505af1925050508015610eec57505b5050565b600054600160a01b900460ff16610b9557604051638dfc202b60e01b815260040160405180910390fd5b604080518082019091526009546001600160801b03808216808452600160801b9092041660208301819052600092916127109085020490841115611efe5760405162461bcd60e51b815260206004820152601860248201527f7472616e736665722065786365656473206d61782062757900000000000000006044820152606401610710565b600c546001600160a01b03861660009081526003602052604090205485011115611db35760405162461bcd60e51b815260206004820152601a60248201527f62616c616e63652065786365656473206d61782077616c6c65740000000000006044820152606401610710565b60408051808201909152600a546001600160801b03808216808452600160801b9092041660208301819052600092916127109085020490841115611ff05760405162461bcd60e51b815260206004820152601960248201527f7472616e736665722065786365656473206d61782073656c6c000000000000006044820152606401610710565b9392505050565b600c546001600160a01b038316600090815260036020526040812054909190830111156120665760405162461bcd60e51b815260206004820152601a60248201527f62616c616e63652065786365656473206d61782077616c6c65740000000000006044820152606401610710565b612710600b5483028161207b5761207b612601565b049392505050565b60005b8381101561209e578181015183820152602001612086565b50506000910152565b60208152600082518060208401526120c6816040850160208701612083565b601f01601f19169190910160400192915050565b6001600160a01b038116811461160857600080fd5b6000806040838503121561210257600080fd5b823561210d816120da565b946020939093013593505050565b60006020828403121561212d57600080fd5b5035919050565b60006020828403121561214657600080fd5b8135611ff0816120da565b60008060006060848603121561216657600080fd5b505081359360208301359350604090920135919050565b60008060006060848603121561219257600080fd5b833561219d816120da565b925060208401356121ad816120da565b929592945050506040919091013590565b801515811461160857600080fd5b600080604083850312156121df57600080fd5b82356121ea816120da565b915060208301356121fa816121be565b809150509250929050565b6000806040838503121561221857600080fd5b50508035926020909101359150565b6000806040838503121561223a57600080fd5b82356121ea816121be565b600080600080600080600060e0888a03121561226057600080fd5b873561226b816120da565b9650602088013561227b816120da565b95506040880135945060608801359350608088013560ff8116811461229f57600080fd5b9699959850939692959460a0840135945060c09093013592915050565b600080604083850312156122cf57600080fd5b82356122da816120da565b915060208301356121fa816120da565b600181811c908216806122fe57607f821691505b60208210810361231e57634e487b7160e01b600052602260045260246000fd5b50919050565b634e487b7160e01b600052601160045260246000fd5b600181815b8085111561237557816000190482111561235b5761235b612324565b8085161561236857918102915b93841c939080029061233f565b509250929050565b60008261238c575060016106c0565b81612399575060006106c0565b81600181146123af57600281146123b9576123d5565b60019150506106c0565b60ff8411156123ca576123ca612324565b50506001821b6106c0565b5060208310610133831016604e8410600b84101617156123f8575081810a6106c0565b612402838361233a565b806000190482111561241657612416612324565b029392505050565b6000611ff060ff84168361237d565b80820281158282048414176106c0576106c0612324565b808201808211156106c0576106c0612324565b60208082526014908201527318d85b9d0818da185b99d94818dbdb9d1c9858dd60621b604082015260600190565b60006020828403121561249757600080fd5b8151611ff0816120da565b634e487b7160e01b600052603260045260246000fd5b600060a082018783526020878185015260a0604085015281875180845260c086019150828901935060005b818110156125085784516001600160a01b0316835293830193918301916001016124e3565b50506001600160a01b03969096166060850152505050608001529392505050565b600080835481600182811c91508083168061254557607f831692505b6020808410820361256457634e487b7160e01b86526022600452602486fd5b818015612578576001811461258d576125ba565b60ff19861689528415158502890196506125ba565b60008a81526020902060005b868110156125b25781548b820152908501908301612599565b505084890196505b509498975050505050505050565b600082516125da818460208701612083565b9190910192915050565b6000602082840312156125f657600080fd5b8151611ff0816121be565b634e487b7160e01b600052601260045260246000fdfea26469706673582212202039dc0aa00140d747566f0c55dee0454c86fd9d2e68382f0621e6e281a613bc64736f6c63430008130033e4cbcfb1a60e2c589f335f74c6c57b0be57eb6c50eb56442d8a67735dba70cad000000000000000000000000000000000000000000000000000000000000008000000000000000000000000000000000000000000000000000000000000000c0000000000000000000000000fe73dba49b8531c639dcddee764dcaf49d91066b0000000000000000000000007a250d5630b4cf539739df2c5dacb4c659f2488d000000000000000000000000000000000000000000000000000000000000000f416c7068612047617264656e657273000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000024147000000000000000000000000000000000000000000000000000000000000

Deployed Bytecode

0x608060405234801561001057600080fd5b50600436106102695760003560e01c80638124f7ac11610151578063c9567bf9116100c3578063dd62ed3e11610087578063dd62ed3e146105a7578063e13e5c2d146105d2578063e9dae5ed146105e5578063f2fde38b146105f8578063f8b45b051461060b578063fdb78c0e1461061457600080fd5b8063c9567bf91461051d578063d01dd6d214610525578063d505accf14610538578063d53cd5661461054b578063d683804e1461058957600080fd5b8063a457c2d711610115578063a457c2d7146104ab578063a9059cbb146104be578063ae0295e2146104d1578063b359303a146104e4578063bfc2fc35146104f7578063c16dd4a41461050a57600080fd5b80638124f7ac146104645780638da5cb5b1461046d578063908bb2ae1461047e57806395d89b411461049157806398fbb9061461049957600080fd5b80633644e515116101ea57806370a08231116101ae57806370a08231146103ee578063715018a61461040e578063737ea06e146104165780637805862f1461042957806378e3079e146104315780637ecebe001461044457600080fd5b80633644e515146103a657806339509351146103ae578063590ffdce146103c15780635c975abb146103d45780636985a022146103e657600080fd5b80631694505e116102315780631694505e1461032c57806318160ddd1461035e578063189ae5f21461036657806323b872dd14610379578063313ce5671461038c57600080fd5b806301a6c43b1461026e57806306fdde031461028a578063095ea7b31461029f5780630f569dad146102c2578063143373a0146102d7575b600080fd5b61027760065481565b6040519081526020015b60405180910390f35b610292610621565b60405161028191906120a7565b6102b26102ad3660046120ef565b6106af565b6040519015158152602001610281565b6102d56102d036600461211b565b6106c6565b005b61030d6102e5366004612134565b600d6020526000908152604090205460ff808216916101008104821691620100009091041683565b6040805193151584529115156020840152151590820152606001610281565b60075461034690630100000090046001600160a01b031681565b6040516001600160a01b039091168152602001610281565b61027761077e565b6102d5610374366004612151565b61079c565b6102b261038736600461217d565b61097d565b610394601281565b60405160ff9091168152602001610281565b610277610a43565b6102b26103bc3660046120ef565b610a9e565b6102d56103cf3660046121cc565b610ae7565b600054600160a01b900460ff166102b2565b6102d5610b85565b6102776103fc366004612134565b60036020526000908152604090205481565b6102d5610b97565b600554610346906001600160a01b031681565b6102d5610ba9565b6102d561043f366004612134565b610bb9565b610277610452366004612134565b600e6020526000908152604090205481565b610277600b5481565b6000546001600160a01b0316610346565b6102d561048c366004612134565b610c0f565b610292610d97565b6007546102b290610100900460ff1681565b6102b26104b93660046120ef565b610da4565b6102b26104cc3660046120ef565b610e36565b6102d56104df3660046120ef565b610e4b565b6102d56104f2366004612205565b610ef1565b6102d5610505366004612227565b611067565b6102d56105183660046121cc565b6110cb565b6102d561115f565b6102d56105333660046121cc565b611194565b6102d5610546366004612245565b611220565b600954610569906001600160801b0380821691600160801b90041682565b604080516001600160801b03938416815292909116602083015201610281565b600a54610569906001600160801b0380821691600160801b90041682565b6102776105b53660046122bc565b600460209081526000928352604080842090915290825290205481565b6102d56105e036600461217d565b611464565b6102d56105f3366004612151565b611477565b6102d5610606366004612134565b6115cd565b610277600c5481565b6007546102b29060ff1681565b6001805461062e906122ea565b80601f016020809104026020016040519081016040528092919081815260200182805461065a906122ea565b80156106a75780601f1061067c576101008083540402835291602001916106a7565b820191906000526020600020905b81548152906001019060200180831161068a57829003601f168201915b505050505081565b60006106bc33848461160b565b5060015b92915050565b6106ce61172f565b600081116107195760405162461bcd60e51b8152602060048201526013602482015272616d6f756e742063616e74206265207a65726f60681b60448201526064015b60405180910390fd5b6107256012600a61241e565b61072f908261242d565b6006557f4e3e41dc675aea3fcba9c02c7825641a2888e42a4b888399511f5276ca84b81861075f6012600a61241e565b610769908361242d565b6040519081526020015b60405180910390a150565b61078a6012600a61241e565b610799906401dcd6500061242d565b81565b6107a461172f565b6301312d008310156107e95760405162461bcd60e51b815260206004820152600e60248201526d62757920697320746f6f206c6f7760901b6044820152606401610710565b6301312d0082101561082f5760405162461bcd60e51b815260206004820152600f60248201526e73656c6c20697320746f6f206c6f7760881b6044820152606401610710565b6301312d008110156108775760405162461bcd60e51b815260206004820152601160248201527077616c6c657420697320746f6f206c6f7760781b6044820152606401610710565b6108836012600a61241e565b61088d908461242d565b600980546001600160801b03928316600160801b0292169190911790556108b66012600a61241e565b6108c0908361242d565b600a80546001600160801b03928316600160801b0292169190911781556108e99060129061241e565b6108f3908261242d565b600c557faa2ef8ba434f2f6bdaad3fcc2d5c35f02b08a47173c94877259407614bc46b556109236012600a61241e565b61092d908561242d565b6109396012600a61241e565b610943908561242d565b61094f6012600a61241e565b610959908561242d565b604080519384526020840192909252908201526060015b60405180910390a1505050565b600061098761176b565b6001600160a01b03841660009081526004602090815260408083203384529091529020546000198114610a2d5782811015610a045760405162461bcd60e51b815260206004820152601d60248201527f45524332303a20696e73756666696369656e7420616c6c6f77616e63650000006044820152606401610710565b6001600160a01b0385166000908152600460209081526040808320338452909152902083820390555b610a388585856117c1565b506001949350505050565b60007f00000000000000000000000000000000000000000000000000000000000000014614610a7957610a74611af1565b905090565b507f6d15047ff1fd1818681becc886f55fb2a9e2f6691f605534eddd8cf7d3741b5c90565b3360008181526004602090815260408083206001600160a01b0387168452909152812054909190610add9082908690610ad8908790612444565b61160b565b5060019392505050565b610aef61172f565b306001600160a01b03831603610b175760405162461bcd60e51b815260040161071090612457565b6001600160a01b0382166000818152600d6020908152604091829020805462ff0000191662010000861515908102919091179091558251938452908301527fe4cbcfb1a60e2c589f335f74c6c57b0be57eb6c50eb56442d8a67735dba70cad91015b60405180910390a15050565b610b8d61172f565b610b95611b8b565b565b610b9f61172f565b610b956000611bdc565b610bb161172f565b610b95611c2c565b610bc161172f565b600580546001600160a01b0319166001600160a01b0383169081179091556040519081527fcb5639215577b3eba6150c2a74d8de8ea5885c176e29e2e66a7551cc15b7a7cf90602001610773565b610c1761172f565b6007546001600160a01b03630100000090910481169082168103610c875760405162461bcd60e51b815260206004820152602160248201527f63616e277420736574207468652073616d6520726f75746572206164647265736044820152607360f81b6064820152608401610710565b81600760036101000a8154816001600160a01b0302191690836001600160a01b03160217905550600760039054906101000a90046001600160a01b03166001600160a01b031663ad5c46486040518163ffffffff1660e01b8152600401602060405180830381865afa158015610d01573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610d259190612485565b600880546001600160a01b0319166001600160a01b0392909216919091179055610d52308360001961160b565b610d5e3082600061160b565b6040516001600160a01b03831681527f455a5e52b7c01aa52d717db42e17b6610b0c2c96560c85b7e5adcdd254bfc17c90602001610b79565b6002805461062e906122ea565b3360008181526004602090815260408083206001600160a01b038716845290915281205490919083811015610e295760405162461bcd60e51b815260206004820152602560248201527f45524332303a2064656372656173656420616c6c6f77616e63652062656c6f77604482015264207a65726f60d81b6064820152608401610710565b610a38828686840361160b565b6000610e4061176b565b6106bc3384846117c1565b610e5361172f565b6000826001600160a01b03168260405160006040518083038185875af1925050503d8060008114610ea0576040519150601f19603f3d011682016040523d82523d6000602084013e610ea5565b606091505b5050905080610eec5760405162461bcd60e51b8152602060048201526013602482015272115512081d1c985b9cd9995c8819985a5b1959606a1b6044820152606401610710565b505050565b6007805462ff0000191662010000179055333014610f6c57600754610100900460ff1680610f2957506000546001600160a01b031633145b610f6c5760405162461bcd60e51b81526020600482015260146024820152731b585b9d585b081cddd85c08191a5cd8589b195960621b6044820152606401610710565b6040805160028082526060820183526000926020830190803683370190505090503081600081518110610fa157610fa16124a2565b6001600160a01b039283166020918202929092010152600854825191169082906001908110610fd257610fd26124a2565b6001600160a01b03928316602091820292909201015260075460055460405163791ac94760e01b8152630100000090920483169263791ac94792611024928892889288929091169042906004016124b8565b600060405180830381600087803b15801561103e57600080fd5b505af1158015611052573d6000803e3d6000fd5b50506007805462ff0000191690555050505050565b61106f61172f565b60078054821515610100810261ff001986151590811661ffff1990941693909317179092556040805191825260208201929092527fe170718435bb78d34d60ff2ad1c1fb4275ec0f1914bbcba82e7d67847b3279229101610b79565b6110d361172f565b306001600160a01b038316036110fb5760405162461bcd60e51b815260040161071090612457565b6001600160a01b0382166000818152600d6020908152604091829020805461ff001916610100861515908102919091179091558251938452908301527f160ff69a72bc70f3e792a86c87d27070e421562197f032d96bcab11c5010222e9101610b79565b61116761172f565b61117360016000611067565b6111866301312d0080630393870061079c565b610bb16103e8806000611477565b61119c61172f565b306001600160a01b038316036111c45760405162461bcd60e51b815260040161071090612457565b6001600160a01b0382166000818152600d6020908152604091829020805460ff19168515159081179091558251938452908301527f92d364d140f902817e5eaa71cedfe20bae2a3c66a2725cee3d9a51d73f052fb69101610b79565b428410156112705760405162461bcd60e51b815260206004820152601760248201527f5045524d49545f444541444c494e455f455850495245440000000000000000006044820152606401610710565b6000600161127c610a43565b6001600160a01b038a81166000818152600e602090815260409182902080546001810190915582517f6e71edae12b1b97f4d1f60370fef10105fa2faae0126114a169c64845d6126c98184015280840194909452938d166060840152608083018c905260a083019390935260c08083018b90528151808403909101815260e08301909152805192019190912061190160f01b6101008301526101028201929092526101228101919091526101420160408051601f198184030181528282528051602091820120600084529083018083525260ff871690820152606081018590526080810184905260a0016020604051602081039080840390855afa158015611388573d6000803e3d6000fd5b5050604051601f1901519150506001600160a01b038116158015906113be5750876001600160a01b0316816001600160a01b0316145b6113fb5760405162461bcd60e51b815260206004820152600e60248201526d24a72b20a624a22fa9a4a3a722a960911b6044820152606401610710565b6001600160a01b0390811660009081526004602090815260408083208a8516808552908352928190208990555188815291928a16917f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925910160405180910390a350505050505050565b61146c61172f565b610eec838383611c71565b61147f61172f565b6103e88311156114c35760405162461bcd60e51b815260206004820152600f60248201526e0c4eaf240d2e640e8dede40d0d2ced608b1b6044820152606401610710565b6103e88211156115085760405162461bcd60e51b815260206004820152601060248201526f0e6cad8d840d2e640e8dede40d0d2ced60831b6044820152606401610710565b6103e88111156115515760405162461bcd60e51b81526020600482015260146024820152730e8e4c2dce6cccae440d2e640e8dede40d0d2ced60631b6044820152606401610710565b600980546001600160801b038581166fffffffffffffffffffffffffffffffff1992831617909255600a805492851692909116919091179055600b81905560408051848152602081018490529081018290527fbf599f0b0b785a611d748a0dfabee402e180323c72c9ed973e5cc29d23c992d890606001610970565b6115d561172f565b6001600160a01b0381166115ff57604051631e4fbdf760e01b815260006004820152602401610710565b61160881611bdc565b50565b6001600160a01b03831661166d5760405162461bcd60e51b8152602060048201526024808201527f45524332303a20617070726f76652066726f6d20746865207a65726f206164646044820152637265737360e01b6064820152608401610710565b6001600160a01b0382166116ce5760405162461bcd60e51b815260206004820152602260248201527f45524332303a20617070726f766520746f20746865207a65726f206164647265604482015261737360f01b6064820152608401610710565b6001600160a01b0383811660008181526004602090815260408083209487168084529482529182902085905590518481527f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925910160405180910390a3505050565b336117426000546001600160a01b031690565b6001600160a01b031614610b955760405163118cdaa760e01b8152336004820152602401610710565b600054600160a01b900460ff1615610b95576000546001600160a01b031632148015906117a357506000546001600160a01b03163314155b15610b955760405163d93c066560e01b815260040160405180910390fd5b6001600160a01b0383166118255760405162461bcd60e51b815260206004820152602560248201527f45524332303a207472616e736665722066726f6d20746865207a65726f206164604482015264647265737360d81b6064820152608401610710565b6001600160a01b0382166118875760405162461bcd60e51b815260206004820152602360248201527f45524332303a207472616e7366657220746f20746865207a65726f206164647260448201526265737360e81b6064820152608401610710565b6001600160a01b038316600090815260036020526040902054818110156118ff5760405162461bcd60e51b815260206004820152602660248201527f45524332303a207472616e7366657220616d6f756e7420657863656564732062604482015265616c616e636560d01b6064820152608401610710565b6001600160a01b0380851660009081526003602090815260408083208686039055600d808352818420825160608082018552915460ff80821615158352610100808304821615158489015262010000928390048216151584880152988c1688529386529584902084519283018552548084161515835296870483161515948201949094529390940490931615159282019290925281511580156119a157508051155b6119db5760405162461bcd60e51b815260206004820152600b60248201526a189b1858dadb1a5cdd195960aa1b6044820152606401610710565b60008083604001511580156119f257508260400151155b90508015611a2d5760208085015190840151611a1089898484611d7e565b9350808015611a1d575081155b15611a2a57611a2a611dbb565b50505b6001600160a01b038781166000818152600360209081526040918290208054878c03908101909155915182815291938c16917fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef910160405180910390a38215611ae65760405183815230906001600160a01b038b16907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef9060200160405180910390a33060009081526003602052604090208054840190555b505050505050505050565b60007f8b73c3c69bb8fe3d512ecc4cf759cc79239f7b179b0ffacaa9a75d522b39400f6001604051611b239190612529565b6040805191829003822060208301939093528101919091527fc89efdaa54c0f20c7adf612882df0950f5a951637e0307cdcb4c672f298b8bc660608201524660808201523060a082015260c00160405160208183030381529060405280519060200120905090565b611b9361176b565b6000805460ff60a01b1916600160a01b1790556040513381527f62e78cea01bee320cd4e420270b5ea74000d11b0c9f74754ebdbfc544b05a258906020015b60405180910390a1565b600080546001600160a01b038381166001600160a01b0319831681178455604051919092169283917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e09190a35050565b611c34611e4e565b6000805460ff60a01b191690556040513381527f5db9ee0a495bf2e6ff9c91a7834c1ba4fdd244a5e8aa4e537bd38aeae4b073aa90602001611bd2565b604080516001600160a01b038481166024830152604480830185905283518084039091018152606490920183526020820180516001600160e01b031663a9059cbb60e01b1790529151600092839290871691611ccd91906125c8565b6000604051808303816000865af19150503d8060008114611d0a576040519150601f19603f3d011682016040523d82523d6000602084013e611d0f565b606091505b5091509150818015611d39575080511580611d39575080806020019051810190611d3991906125e4565b611d775760405162461bcd60e51b815260206004820152600f60248201526e1514905394d1915497d19052531151608a1b6044820152606401610710565b5050505050565b60008215611d9757611d908585611e78565b9050611db3565b8115611da657611d9084611f6a565b611db08585611ff7565b90505b949350505050565b6006543060009081526003602052604090205481118015908190611de8575060075462010000900460ff16155b8015611df6575060075460ff165b15611e4a576040516359ac981d60e11b81526004810183905260006024820152309063b359303a90604401600060405180830381600087803b158015611e3b57600080fd5b505af1925050508015610eec57505b5050565b600054600160a01b900460ff16610b9557604051638dfc202b60e01b815260040160405180910390fd5b604080518082019091526009546001600160801b03808216808452600160801b9092041660208301819052600092916127109085020490841115611efe5760405162461bcd60e51b815260206004820152601860248201527f7472616e736665722065786365656473206d61782062757900000000000000006044820152606401610710565b600c546001600160a01b03861660009081526003602052604090205485011115611db35760405162461bcd60e51b815260206004820152601a60248201527f62616c616e63652065786365656473206d61782077616c6c65740000000000006044820152606401610710565b60408051808201909152600a546001600160801b03808216808452600160801b9092041660208301819052600092916127109085020490841115611ff05760405162461bcd60e51b815260206004820152601960248201527f7472616e736665722065786365656473206d61782073656c6c000000000000006044820152606401610710565b9392505050565b600c546001600160a01b038316600090815260036020526040812054909190830111156120665760405162461bcd60e51b815260206004820152601a60248201527f62616c616e63652065786365656473206d61782077616c6c65740000000000006044820152606401610710565b612710600b5483028161207b5761207b612601565b049392505050565b60005b8381101561209e578181015183820152602001612086565b50506000910152565b60208152600082518060208401526120c6816040850160208701612083565b601f01601f19169190910160400192915050565b6001600160a01b038116811461160857600080fd5b6000806040838503121561210257600080fd5b823561210d816120da565b946020939093013593505050565b60006020828403121561212d57600080fd5b5035919050565b60006020828403121561214657600080fd5b8135611ff0816120da565b60008060006060848603121561216657600080fd5b505081359360208301359350604090920135919050565b60008060006060848603121561219257600080fd5b833561219d816120da565b925060208401356121ad816120da565b929592945050506040919091013590565b801515811461160857600080fd5b600080604083850312156121df57600080fd5b82356121ea816120da565b915060208301356121fa816121be565b809150509250929050565b6000806040838503121561221857600080fd5b50508035926020909101359150565b6000806040838503121561223a57600080fd5b82356121ea816121be565b600080600080600080600060e0888a03121561226057600080fd5b873561226b816120da565b9650602088013561227b816120da565b95506040880135945060608801359350608088013560ff8116811461229f57600080fd5b9699959850939692959460a0840135945060c09093013592915050565b600080604083850312156122cf57600080fd5b82356122da816120da565b915060208301356121fa816120da565b600181811c908216806122fe57607f821691505b60208210810361231e57634e487b7160e01b600052602260045260246000fd5b50919050565b634e487b7160e01b600052601160045260246000fd5b600181815b8085111561237557816000190482111561235b5761235b612324565b8085161561236857918102915b93841c939080029061233f565b509250929050565b60008261238c575060016106c0565b81612399575060006106c0565b81600181146123af57600281146123b9576123d5565b60019150506106c0565b60ff8411156123ca576123ca612324565b50506001821b6106c0565b5060208310610133831016604e8410600b84101617156123f8575081810a6106c0565b612402838361233a565b806000190482111561241657612416612324565b029392505050565b6000611ff060ff84168361237d565b80820281158282048414176106c0576106c0612324565b808201808211156106c0576106c0612324565b60208082526014908201527318d85b9d0818da185b99d94818dbdb9d1c9858dd60621b604082015260600190565b60006020828403121561249757600080fd5b8151611ff0816120da565b634e487b7160e01b600052603260045260246000fd5b600060a082018783526020878185015260a0604085015281875180845260c086019150828901935060005b818110156125085784516001600160a01b0316835293830193918301916001016124e3565b50506001600160a01b03969096166060850152505050608001529392505050565b600080835481600182811c91508083168061254557607f831692505b6020808410820361256457634e487b7160e01b86526022600452602486fd5b818015612578576001811461258d576125ba565b60ff19861689528415158502890196506125ba565b60008a81526020902060005b868110156125b25781548b820152908501908301612599565b505084890196505b509498975050505050505050565b600082516125da818460208701612083565b9190910192915050565b6000602082840312156125f657600080fd5b8151611ff0816121be565b634e487b7160e01b600052601260045260246000fdfea26469706673582212202039dc0aa00140d747566f0c55dee0454c86fd9d2e68382f0621e6e281a613bc64736f6c63430008130033

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

000000000000000000000000000000000000000000000000000000000000008000000000000000000000000000000000000000000000000000000000000000c0000000000000000000000000fe73dba49b8531c639dcddee764dcaf49d91066b0000000000000000000000007a250d5630b4cf539739df2c5dacb4c659f2488d000000000000000000000000000000000000000000000000000000000000000f416c7068612047617264656e657273000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000024147000000000000000000000000000000000000000000000000000000000000

-----Decoded View---------------
Arg [0] : _name (string): Alpha Gardeners
Arg [1] : _symbol (string): AG
Arg [2] : _taxRecipient (address): 0xFE73DBa49b8531C639DCDdeE764dcaf49D91066B
Arg [3] : routerAddress (address): 0x7a250d5630B4cF539739dF2C5dAcb4c659F2488D

-----Encoded View---------------
8 Constructor Arguments found :
Arg [0] : 0000000000000000000000000000000000000000000000000000000000000080
Arg [1] : 00000000000000000000000000000000000000000000000000000000000000c0
Arg [2] : 000000000000000000000000fe73dba49b8531c639dcddee764dcaf49d91066b
Arg [3] : 0000000000000000000000007a250d5630b4cf539739df2c5dacb4c659f2488d
Arg [4] : 000000000000000000000000000000000000000000000000000000000000000f
Arg [5] : 416c7068612047617264656e6572730000000000000000000000000000000000
Arg [6] : 0000000000000000000000000000000000000000000000000000000000000002
Arg [7] : 4147000000000000000000000000000000000000000000000000000000000000


Loading...
Loading
Loading...
Loading
[ Download: CSV Export  ]
[ Download: CSV Export  ]

A token is a representation of an on-chain or off-chain asset. The token page shows information such as price, total supply, holders, transfers and social links. Learn more about this page in our Knowledge Base.