ETH Price: $2,803.34 (-5.26%)

Token

Do Not Buy (DNB)

Overview

Max Total Supply

100,000,000 DNB

Holders

7

Market

Price

$0.00 @ 0.000000 ETH

Onchain Market Cap

-

Circulating Supply Market Cap

-

Other Info

Token Contract (WITH 18 Decimals)

Filtered by Token Holder
fruitiloops.linea.eth
Balance
90,063.98604240971721367 DNB

Value
$0.00
0x9d12c7aad8297e042e8cdbae5e12df12f297eef9
Loading...
Loading
Loading...
Loading
Loading...
Loading

Click here to update the token information / general information

Contract Source Code Verified (Exact Match)

Contract Name:
DoNotBuy

Compiler Version
v0.8.26+commit.8a97fa7a

Optimization Enabled:
Yes with 1000 runs

Other Settings:
london EvmVersion
File 1 of 7 : DoNotBuy.sol
// THIS IS A TEST TOKEN, NO NEED BUYING!
// SPDX-License-Identifier: MIT
pragma solidity 0.8.26;

import "@openzeppelin/contracts/security/ReentrancyGuard.sol";
import "@openzeppelin/contracts/token/ERC20/utils/SafeERC20.sol";
import "@openzeppelin/contracts/token/ERC20/IERC20.sol";
import "@openzeppelin/contracts/token/ERC20/extensions/IERC20Metadata.sol";

interface IERC20Extended is IERC20 {
    function circulatingSupply() external view returns (uint256);
    function getOwner() external view returns (address);
}

struct route {
    address from;
    address to;
    bool stable;
}

abstract contract Ownable {
    address internal owner;

    constructor(address _owner) {
        owner = _owner;
    }

    modifier onlyOwner() {
        require(isOwner(msg.sender), "!OWNER");
        _;
    }

    function isOwner(address account) public view returns (bool) {
        return account == owner;
    }

    function transferOwnership(address payable adr) public onlyOwner {
        require(adr != address(0), "Owner cannot be zero address");
        owner = adr;
        emit OwnershipTransferred(adr);
    }

    event OwnershipTransferred(address owner);
}

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

interface IRouter {
    function factory() external pure returns (address);
    function wETH() external pure returns (address);
    function getAmountsOut(uint amountIn, route[] calldata routes) external view returns (uint[] memory amounts);
    function addLiquidityETH(
        address token,
        bool stable,
        uint amountTokenDesired,
        uint amountTokenMin,
        uint amountETHMin,
        address to,
        uint deadline
    ) external payable returns (uint amountToken, uint amountETH, uint liquidity);
    function swapExactETHForTokensSupportingFeeOnTransferTokens(
        uint amountOutMin,
        route[] calldata routes,
        address to,
        uint deadline
    ) external payable;
    function swapExactTokensForETHSupportingFeeOnTransferTokens(
        uint amountIn,
        uint amountOutMin,
        route[] calldata routes,
        address to,
        uint deadline
    ) external;
}

contract DoNotBuy is IERC20Extended, Ownable, ReentrancyGuard {
    using SafeERC20 for IERC20;

    string private constant _name = "Do Not Buy";
    string private constant _symbol = "DNB";
    uint8 private constant _decimals = 18;
    uint256 private constant _totalSupply = 100_000_000 * (10 ** _decimals);
    uint256 private _maxTxAmount = (_totalSupply * 100) / 10_000; // 1%
    uint256 private _maxSellAmount = (_totalSupply * 200) / 10_000; // 2%
    uint256 private _maxWalletToken = (_totalSupply * 200) / 10_000; // 2%

    mapping(address => uint256) private _balances;
    mapping(address => mapping(address => uint256)) private _allowances;
    mapping(address => bool) public isFeeExempt;
    mapping(address => bool) public isDividendExempt;
    mapping(address => bool) private isBot;

    IRouter public router;
    address public pair;
    bool private tradingAllowed = false;

    uint256 private liquidityFee = 200; // 2%
    uint256 private marketingFee = 1800; // 18%
    uint256 private rewardsFee = 7000; // 70%
    uint256 private developmentFee = 1000; // 10%
    uint256 private totalFee = 1000; // 10% for buys
    uint256 private sellFee = 1500; // 15% for sells
    uint256 private transferFee = 200; // 2% for transfers
    uint256 private constant denominator = 10_000;

    bool private swapEnabled = true;
    uint256 private swapTimes;
    bool private swapping;
    uint256 private swapThreshold = (_totalSupply * 100) / 100_000; // 0.1%
    uint256 private _minTokenAmount = (_totalSupply * 10) / 100_000;
    uint256 private queuedTokens; // Tracks tokens from failed swaps
    uint256 private lastRetryAttempt; // For timelock on retrySwap
    uint256 private constant RETRY_TIMELOCK = 1 days;

    modifier lockTheSwap {
        swapping = true;
        _;
        swapping = false;
    }
    modifier onlyAfterTimelock {
        require(block.timestamp >= lastRetryAttempt + RETRY_TIMELOCK, "Timelock active");
        _;
    }

    address public reward; // USDC
    uint8 private rewardDecimals; // USDC decimals (typically 6)
    uint128 public totalShares; // Reduced to uint128 for gas savings
    uint256 public totalDividends;
    uint256 public totalDistributed;
    uint256 internal dividendsPerShare;
    uint256 internal constant dividendsPerShareAccuracyFactor = 10**36;

    mapping(address => uint256) private shareholderClaims;
    struct Share {
        uint256 amount;
        uint256 totalExcluded;
        uint256 totalRealised;
    }
    mapping(address => Share) public shares;
    mapping(address => bool) private isShareholder;

    uint256 public minPeriod = 60 minutes;
    uint256 public minDistribution = 1 * (10**16); // 0.01 USDC
    uint256 public distributorGas = 350_000;

    address internal constant DEAD = 0x000000000000000000000000000000000000dEaD;
    address public development_receiver;
    address public marketing_receiver;
    address public liquidity_receiver;
    uint256 public liquiditySlippageTolerance = 9500; // 95% (5% slippage)

    event SwapEvent(address indexed token, uint256 amountIn, uint256 amountOut, bool success, string reason);
    event LiquidityAdded(uint256 tokenAmount, uint256 ethAmount, uint256 tokenMin, uint256 ethMin);
    event SlippageToleranceUpdated(uint256 newTolerance);
    event ReceiverAddressesUpdated(address developmentReceiver, address marketingReceiver, address liquidityReceiver);
    event RouterUpdated(address routerAddress);
    event RewardUpdated(address usdcAddress);
    event DividendsDistributed(address indexed shareholder, uint256 amount);
    event SwapRetryTriggered(uint256 amount);
    event DistributionProgress(uint256 processed);
    event ETHTransferred(address indexed receiver, uint256 amount);
    event ETHReceived(address indexed sender, uint256 amount);

    constructor(address routerAddress, address usdcAddress) Ownable(msg.sender) {
        require(routerAddress != address(0), "Router cannot be zero address");
        require(usdcAddress != address(0), "USDC cannot be zero address");

        router = IRouter(routerAddress);
        reward = usdcAddress;
        rewardDecimals = 6;
        require(rewardDecimals <= 18, "Invalid reward token decimals");

        development_receiver = 0x0F245A7D374388CD76fC8139Dd900E9B02bF69d7;
        marketing_receiver = 0x27DFbEC90EEa392446f71638b70193c6F558c001;
        liquidity_receiver = 0xd53686b4298Ac78B1d182E95FeAC1A4DD1D780bD;

        isFeeExempt[address(this)] = true;
        isFeeExempt[development_receiver] = true;
        isFeeExempt[liquidity_receiver] = true;
        isFeeExempt[marketing_receiver] = true;
        isFeeExempt[msg.sender] = true;
        isDividendExempt[address(this)] = true;
        isDividendExempt[address(DEAD)] = true;
        isDividendExempt[address(0)] = true;

        _balances[msg.sender] = _totalSupply;
        emit Transfer(address(0), msg.sender, _totalSupply);
    }

    function setReceiverAddresses(
        address _developmentReceiver,
        address _marketingReceiver,
        address _liquidityReceiver
    ) external onlyOwner {
        require(_developmentReceiver != address(0), "Development receiver cannot be zero address");
        require(_marketingReceiver != address(0), "Marketing receiver cannot be zero address");
        require(_liquidityReceiver != address(0), "Liquidity receiver cannot be zero address");
        require(!isContract(_developmentReceiver), "Development receiver cannot be a contract");
        require(!isContract(_marketingReceiver), "Marketing receiver cannot be a contract");
        require(!isContract(_liquidityReceiver), "Liquidity receiver cannot be a contract");

        isFeeExempt[development_receiver] = false;
        isFeeExempt[marketing_receiver] = false;
        isFeeExempt[liquidity_receiver] = false;
        development_receiver = _developmentReceiver;
        marketing_receiver = _marketingReceiver;
        liquidity_receiver = _liquidityReceiver;
        isFeeExempt[development_receiver] = true;
        isFeeExempt[marketing_receiver] = true;
        isFeeExempt[liquidity_receiver] = true;
        emit ReceiverAddressesUpdated(_developmentReceiver, _marketingReceiver, _liquidityReceiver);
    }

    function isContract(address addr) internal view returns (bool) {
        uint256 size;
        assembly {
            size := extcodesize(addr)
        }
        return size > 0;
    }

    function setLiquiditySlippageTolerance(uint256 _tolerance) external onlyOwner {
        require(_tolerance >= 8500 && _tolerance <= 9800, "Tolerance must be between 85% and 98%");
        liquiditySlippageTolerance = _tolerance;
        emit SlippageToleranceUpdated(_tolerance);
    }

    function setRouter(address _routerAddress) external onlyOwner {
        require(_routerAddress != address(0), "Router cannot be zero address");
        router = IRouter(_routerAddress);
        pair = IFactory(router.factory()).getPair(address(this), router.wETH(), false);
        if (pair == address(0)) {
            pair = IFactory(router.factory()).createPair(address(this), router.wETH(), false);
        }
        isDividendExempt[pair] = true;
        emit RouterUpdated(_routerAddress);
    }

    function setReward(address _usdcAddress) external onlyOwner {
        require(_usdcAddress != address(0), "USDC cannot be zero address");
        uint8 usdcDecimals = IERC20Metadata(_usdcAddress).decimals();
        require(usdcDecimals >= 6 && usdcDecimals <= 18, "Reward token decimals must be 6 to 18");
        reward = _usdcAddress;
        rewardDecimals = usdcDecimals;
        emit RewardUpdated(_usdcAddress);
    }

    receive() external payable {
        emit ETHReceived(msg.sender, msg.value);
    }

    // ERC20 standard functions
    function name() public pure returns (string memory) {
        return _name;
    }

    function symbol() public pure returns (string memory) {
        return _symbol;
    }

    function decimals() public pure returns (uint8) {
        return _decimals;
    }

    function getOwner() external view override returns (address) {
        return owner;
    }

    function totalSupply() public pure override returns (uint256) {
        return _totalSupply;
    }

    function balanceOf(address account) public view override returns (uint256) {
        return _balances[account];
    }

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

    function allowance(address owner_, address spender) public view override returns (uint256) {
        return _allowances[owner_][spender];
    }

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

    function circulatingSupply() public view override returns (uint256) {
        return _totalSupply - balanceOf(DEAD) - balanceOf(address(0));
    }

    function startTrading() external onlyOwner {
        require(!tradingAllowed, "Trading is already open");
        tradingAllowed = true;
    }

    function preTxCheck(address sender, uint256 amount) internal view {
        require(amount > 0, "Transfer amount must be greater than zero");
        require(amount <= balanceOf(sender), "Insufficient balance");
    }

    function _transfer(address sender, address recipient, uint256 amount) private {
        preTxCheck(sender, amount);
        checkTradingAllowed(sender, recipient);
        checkMaxWallet(sender, recipient, amount);
        swapbackCounters(sender, recipient);
        checkTxLimit(sender, recipient, amount);
        swapBack(sender, recipient, amount);
        _balances[sender] -= amount;
        uint256 amountReceived = shouldTakeFee(sender, recipient) ? takeFee(sender, recipient, amount) : amount;
        _balances[recipient] += amountReceived;
        emit Transfer(sender, recipient, amountReceived);
        if (!isDividendExempt[sender]) {
            setShare(sender, balanceOf(sender));
        }
        if (!isDividendExempt[recipient]) {
            setShare(recipient, balanceOf(recipient));
        }
        if (shares[recipient].amount > 0) {
            distributeDividend(recipient);
        }
    }

    function setStructure(
        uint256 _liquidity,
        uint256 _marketing,
        uint256 _rewards,
        uint256 _development,
        uint256 _total,
        uint256 _sell,
        uint256 _trans
    ) external onlyOwner {
        require(_liquidity + _marketing + _rewards + _development == denominator, "Fee components must sum to 100%");
        liquidityFee = _liquidity;
        marketingFee = _marketing;
        rewardsFee = _rewards;
        developmentFee = _development;
        totalFee = _total;
        sellFee = _sell;
        transferFee = _trans;
    }

    function setisBot(address _address, bool _enabled) external onlyOwner {
        require(_address != address(pair) && _address != address(router) && _address != address(this), "Ineligible Address");
        isBot[_address] = _enabled;
    }

    function setParameters(uint256 _maxTx, uint256 _maxSell, uint256 _maxWallet) external onlyOwner {
        uint256 newTx = (_totalSupply * _maxTx) / 10_000;
        uint256 newSell = (_totalSupply * _maxSell) / 10_000;
        uint256 newWallet = (_totalSupply * _maxWallet) / 10_000;
        _maxTxAmount = newTx;
        _maxSellAmount = newSell;
        _maxWalletToken = newWallet;
        uint256 limit = _totalSupply * 5 / 1000;
        require(newTx >= limit && newSell >= limit && newWallet >= limit, "Limits cannot be less than 0.5%");
        require(_maxTx <= 500 && _maxSell <= 500 && _maxWallet <= 500, "Limits cannot exceed 5%");
    }

    function checkTradingAllowed(address sender, address recipient) internal view {
        if (!isFeeExempt[sender] && !isFeeExempt[recipient]) {
            require(tradingAllowed, "Trading not allowed");
        }
    }

    function checkMaxWallet(address sender, address recipient, uint256 amount) internal view {
        if (!isFeeExempt[sender] && !isFeeExempt[recipient] && recipient != address(pair) && recipient != address(DEAD)) {
            require((_balances[recipient] + amount) <= _maxWalletToken, "Exceeds maximum wallet amount");
        }
    }

    function swapbackCounters(address sender, address recipient) internal {
        if (recipient == pair && !isFeeExempt[sender]) {
            swapTimes += 1;
        }
    }

    function checkTxLimit(address sender, address recipient, uint256 amount) internal view {
        if (sender != pair) {
            require(amount <= _maxSellAmount || isFeeExempt[sender] || isFeeExempt[recipient], "Sell Limit Exceeded");
        }
        require(amount <= _maxTxAmount || isFeeExempt[sender] || isFeeExempt[recipient], "TX Limit Exceeded");
    }

    function safeTransferETH(address to, uint256 value) internal {
        (bool success, ) = to.call{value: value}("");
        require(success, "ETH transfer failed");
    }

    function swapAndLiquify(uint256 tokens) private lockTheSwap {
        uint256 tokensToAddLiquidityWith = tokens * liquidityFee / denominator;
        uint256 toSwap = tokens - tokensToAddLiquidityWith;
        uint256 initialBalance = address(this).balance;
        swapTokensForETH(toSwap);
        uint256 deltaBalance = address(this).balance - initialBalance;

        uint256 ETHToAddLiquidityWith = deltaBalance * liquidityFee / denominator;
        uint256 marketingAmount = deltaBalance * marketingFee / denominator;
        uint256 rewardsAmount = deltaBalance * rewardsFee / denominator;
        uint256 developmentAmount = deltaBalance * developmentFee / denominator;

        if (ETHToAddLiquidityWith > 0) {
            addLiquidity(tokensToAddLiquidityWith, ETHToAddLiquidityWith);
        }
        if (marketingAmount > 0) {
            safeTransferETH(marketing_receiver, marketingAmount);
            emit ETHTransferred(marketing_receiver, marketingAmount);
        }
        if (developmentAmount > 0) {
            safeTransferETH(development_receiver, developmentAmount);
            emit ETHTransferred(development_receiver, developmentAmount);
        }
        if (rewardsAmount > 0) {
            deposit(rewardsAmount);
        }

        if (address(this).balance > 0) {
            uint256 remainingBalance = address(this).balance;
            uint256 totalNonLiquidityFee = marketingFee + rewardsFee + developmentFee;
            uint256 marketingDust = remainingBalance * marketingFee / totalNonLiquidityFee;
            uint256 rewardsDust = remainingBalance * rewardsFee / totalNonLiquidityFee;
            uint256 developmentDust = remainingBalance - marketingDust - rewardsDust;
            if (marketingDust > 0) {
                safeTransferETH(marketing_receiver, marketingDust);
                emit ETHTransferred(marketing_receiver, marketingDust);
            }
            if (developmentDust > 0) {
                safeTransferETH(development_receiver, developmentDust);
                emit ETHTransferred(development_receiver, developmentDust);
            }
            if (rewardsDust > 0) {
                deposit(rewardsDust);
            }
        }
    }

    function addLiquidity(uint256 tokenAmount, uint256 ETHAmount) private {
        uint256 amountTokenMin = tokenAmount * liquiditySlippageTolerance / 10_000;
        uint256 amountETHMin = ETHAmount * liquiditySlippageTolerance / 10_000;
        _approve(address(this), address(router), tokenAmount);
        router.addLiquidityETH{value: ETHAmount}(
            address(this),
            false, // Assuming non-stable pair
            tokenAmount,
            amountTokenMin,
            amountETHMin,
            liquidity_receiver,
            block.timestamp
        );
        emit LiquidityAdded(tokenAmount, ETHAmount, amountTokenMin, amountETHMin);
    } 
    
    function swapTokensForETH(uint256 tokenAmount) private {
        route[] memory routes = new route[](1);
        routes[0] = route({
            from: address(this),
            to: router.wETH(),
            stable: false
        });
        _approve(address(this), address(router), tokenAmount);
        uint256 amountOutMin = router.getAmountsOut(tokenAmount, routes)[1] * 95 / 100; // 5% slippage
        try router.swapExactTokensForETHSupportingFeeOnTransferTokens(
            tokenAmount,
            amountOutMin,
            routes,
            address(this),
            block.timestamp
        ) {
            emit SwapEvent(address(this), tokenAmount, amountOutMin, true, "ETH swap successful");
        } catch {
            queuedTokens += tokenAmount;
            emit SwapEvent(address(this), tokenAmount, amountOutMin, false, "ETH swap failed");
        }
    }

    function retrySwap(uint256 tokenAmount) external onlyOwner onlyAfterTimelock {
        require(tokenAmount <= queuedTokens, "Insufficient queued tokens");
        queuedTokens -= tokenAmount;
        lastRetryAttempt = block.timestamp;
        swapTokensForETH(tokenAmount);
        emit SwapRetryTriggered(tokenAmount);
    }

    function shouldSwapBack(address sender, address recipient, uint256 amount) internal view returns (bool) {
        bool aboveMin = amount >= _minTokenAmount;
        bool aboveThreshold = balanceOf(address(this)) >= swapThreshold;
        return !swapping && swapEnabled && tradingAllowed && aboveMin && !isFeeExempt[sender] && recipient == pair && swapTimes >= 2 && aboveThreshold;
    }

    function swapBack(address sender, address recipient, uint256 amount) internal {
        if (shouldSwapBack(sender, recipient, amount)) {
            swapAndLiquify(swapThreshold);
            swapTimes = 0;
        }
    }

    function triggerSwap() external onlyOwner nonReentrant {
        require(balanceOf(address(this)) >= swapThreshold, "Insufficient tokens for swap");
        require(swapEnabled, "Swaps are disabled");
        require(tradingAllowed, "Trading is not allowed");
        swapAndLiquify(swapThreshold);
        swapTimes = 0;
    }

    function shouldTakeFee(address sender, address recipient) internal view returns (bool) {
        return !isFeeExempt[sender] && !isFeeExempt[recipient];
    }

    function getTotalFee(address sender, address recipient) internal view returns (uint256) {
        if (isBot[sender] || isBot[recipient]) {
            return denominator - 100;
        }
        if (recipient == pair) {
            return sellFee;
        }
        if (sender == pair) {
            return totalFee;
        }
        return transferFee;
    }

    function takeFee(address sender, address recipient, uint256 amount) internal returns (uint256) {
        uint256 feeAmount = amount * getTotalFee(sender, recipient) / denominator;
        if (feeAmount > 0) {
            _balances[address(this)] += feeAmount;
            emit Transfer(sender, address(this), feeAmount);
        }
        return amount - feeAmount;
    }

    function transferFrom(address sender, address recipient, uint256 amount) public override nonReentrant returns (bool) {
        _transfer(sender, recipient, amount);
        _approve(sender, msg.sender, _allowances[sender][msg.sender] - amount);
        return true;
    }

    function _approve(address owner_, address spender, uint256 amount) private {
        require(owner_ != address(0) && spender != address(0), "Invalid address");
        _allowances[owner_][spender] = amount;
        emit Approval(owner_, spender, amount);
    }

    function setisDividendExempt(address holder, bool exempt) external onlyOwner {
        isDividendExempt[holder] = exempt;
        if (exempt) {
            setShare(holder, 0);
        } else {
            setShare(holder, balanceOf(holder));
        }
    }

    function setShare(address shareholder, uint256 amount) internal {
        bool wasShareholder = isShareholder[shareholder];
        if (amount > 0 && !wasShareholder) {
            isShareholder[shareholder] = true;
        } else if (amount == 0 && wasShareholder) {
            isShareholder[shareholder] = false;
        }
        totalShares = uint128(totalShares - shares[shareholder].amount + amount);
        shares[shareholder].amount = amount;
        shares[shareholder].totalExcluded = getCumulativeDividends(amount);
    }

    function deposit(uint256 amountETH) internal {
        uint256 balanceBefore = IERC20(reward).balanceOf(address(this));
        route[] memory routes = new route[](1);
        routes[0] = route({
            from: router.wETH(),
            to: address(reward),
            stable: false
        });
        uint256 amountOutMin = getMinUSDCOutput(amountETH) * 95 / 100; // 5% slippage
        try router.swapExactETHForTokensSupportingFeeOnTransferTokens{value: amountETH}(
            amountOutMin,
            routes,
            address(this),
            block.timestamp
        ) {
            uint256 amount = IERC20(reward).balanceOf(address(this)) - balanceBefore;
            uint256 adjustedAmount = normalizeTo18Decimals(amount);
            totalDividends += adjustedAmount;
            dividendsPerShare += dividendsPerShareAccuracyFactor * adjustedAmount / totalShares;
            emit SwapEvent(reward, amountETH, amount, true, "USDC swap successful");
        } catch {
            emit SwapEvent(reward, amountETH, amountOutMin, false, "USDC swap failed");
        }
    }

    function normalizeTo18Decimals(uint256 amount) internal view returns (uint256) {
        if (rewardDecimals == 18) return amount;
        return amount * (10**(18 - rewardDecimals));
    }

    function denormalizeFrom18Decimals(uint256 amount) internal view returns (uint256) {
        if (rewardDecimals == 18) return amount;
        return amount / (10**(18 - rewardDecimals));
    }

    function getMinUSDCOutput(uint256 amountETH) internal view returns (uint256) {
        route[] memory routes = new route[](1);
        routes[0] = route({
            from: router.wETH(),
            to: address(reward),
            stable: false
        });
        return router.getAmountsOut(amountETH, routes)[1];
    }

    function distributeDividend(address shareholder) internal {
        if (shares[shareholder].amount == 0) {
            return;
        }
        uint256 amount = getUnpaidEarnings(shareholder);
        if (amount > 0 && IERC20(reward).balanceOf(address(this)) >= denormalizeFrom18Decimals(amount)) {
            uint256 adjustedAmount = denormalizeFrom18Decimals(amount);
            totalDistributed += amount;
            shareholderClaims[shareholder] = block.timestamp;
            shares[shareholder].totalRealised += amount;
            shares[shareholder].totalExcluded = getCumulativeDividends(shares[shareholder].amount);
            IERC20(reward).safeTransfer(shareholder, adjustedAmount);
            emit DividendsDistributed(shareholder, adjustedAmount);
        }
    }

    function claimDividend() external nonReentrant {
        distributeDividend(msg.sender);
    }

    function rescueERC20(address _address, uint256 _amount) external onlyOwner {
        IERC20(_address).safeTransfer(marketing_receiver, _amount);
    }

    function shouldDistribute(address shareholder) internal view returns (bool) {
        return shareholderClaims[shareholder] + minPeriod < block.timestamp && getUnpaidEarnings(shareholder) > minDistribution;
    }

    function totalRewardsDistributed(address _wallet) external view returns (uint256) {
        return shares[_wallet].totalRealised;
    }

    function getUnpaidEarnings(address shareholder) public view returns (uint256) {
        if (shares[shareholder].amount == 0) {
            return 0;
        }
        uint256 shareholderTotalDividends = getCumulativeDividends(shares[shareholder].amount);
        return shareholderTotalDividends > shares[shareholder].totalExcluded ? shareholderTotalDividends - shares[shareholder].totalExcluded : 0;
    }

    function getCumulativeDividends(uint256 share) internal view returns (uint256) {
        return (share * dividendsPerShare) / dividendsPerShareAccuracyFactor;
    }

    function setDistributionCriteria(uint256 _minPeriod, uint256 _minDistribution, uint256 _distributorGas) external onlyOwner {
        require(_distributorGas >= 100_000 && _distributorGas <= 1_000_000, "Distributor gas must be between 100,000 and 1,000,000");
        minPeriod = _minPeriod;
        minDistribution = _minDistribution;
        distributorGas = _distributorGas;
    }

    function setisExempt(address _address, bool _enabled) external onlyOwner {
        isFeeExempt[_address] = _enabled;
    }

    function getFeeStructure() external view returns (uint256 _buyFee, uint256 _sellFee, uint256 _transferFee, uint256[4] memory _distribution) {
        return (totalFee, sellFee, transferFee, [liquidityFee, marketingFee, rewardsFee, developmentFee]);
    }

    function estimateRewards(address holder) external view returns (uint256 usdcAmount) {
        return denormalizeFrom18Decimals(getUnpaidEarnings(holder));
    }

    function getContractStats() external view returns (
        uint256 _totalDividends,
        uint256 _totalDistributed,
        uint256 _totalShares,
        uint256 _queuedTokens
    ) {
        return (totalDividends, totalDistributed, totalShares, queuedTokens);
    }

    function getHolderInfo(address holder) external view returns (
        uint256 _balance,
        uint256 _shares,
        uint256 _unpaidDividends
    ) {
        return (balanceOf(holder), shares[holder].amount, getUnpaidEarnings(holder));
    }

    function getSwapConfig() external view returns (
        bool _swapEnabled,
        uint256 _swapThreshold,
        uint256 _minTokenAmountOut,
        uint256 _swapTimes
    ) {
        return (swapEnabled, swapThreshold, _minTokenAmount, swapTimes);
    }
}

// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts (last updated v4.9.0) (security/ReentrancyGuard.sol)

pragma solidity ^0.8.0;

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

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

    uint256 private _status;

    constructor() {
        _status = _NOT_ENTERED;
    }

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

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

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

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

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

// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts v4.4.1 (token/ERC20/extensions/IERC20Metadata.sol)

pragma solidity ^0.8.0;

import "../IERC20.sol";

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

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

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

// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts (last updated v4.9.0) (token/ERC20/extensions/IERC20Permit.sol)

pragma solidity ^0.8.0;

/**
 * @dev Interface of the ERC20 Permit extension allowing approvals to be made via signatures, as defined in
 * https://eips.ethereum.org/EIPS/eip-2612[EIP-2612].
 *
 * Adds the {permit} method, which can be used to change an account's ERC20 allowance (see {IERC20-allowance}) by
 * presenting a message signed by the account. By not relying on {IERC20-approve}, the token holder account doesn't
 * need to send a transaction, and thus is not required to hold Ether at all.
 */
interface IERC20Permit {
    /**
     * @dev Sets `value` as the allowance of `spender` over ``owner``'s tokens,
     * given ``owner``'s signed approval.
     *
     * IMPORTANT: The same issues {IERC20-approve} has related to transaction
     * ordering also apply here.
     *
     * Emits an {Approval} event.
     *
     * Requirements:
     *
     * - `spender` cannot be the zero address.
     * - `deadline` must be a timestamp in the future.
     * - `v`, `r` and `s` must be a valid `secp256k1` signature from `owner`
     * over the EIP712-formatted function arguments.
     * - the signature must use ``owner``'s current nonce (see {nonces}).
     *
     * For more information on the signature format, see the
     * https://eips.ethereum.org/EIPS/eip-2612#specification[relevant EIP
     * section].
     */
    function permit(
        address owner,
        address spender,
        uint256 value,
        uint256 deadline,
        uint8 v,
        bytes32 r,
        bytes32 s
    ) external;

    /**
     * @dev Returns the current nonce for `owner`. This value must be
     * included whenever a signature is generated for {permit}.
     *
     * Every successful call to {permit} increases ``owner``'s nonce by one. This
     * prevents a signature from being used multiple times.
     */
    function nonces(address owner) external view returns (uint256);

    /**
     * @dev Returns the domain separator used in the encoding of the signature for {permit}, as defined by {EIP712}.
     */
    // solhint-disable-next-line func-name-mixedcase
    function DOMAIN_SEPARATOR() external view returns (bytes32);
}

// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts (last updated v4.9.0) (token/ERC20/IERC20.sol)

pragma solidity ^0.8.0;

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

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

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

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

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

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

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

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

// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts (last updated v4.9.3) (token/ERC20/utils/SafeERC20.sol)

pragma solidity ^0.8.0;

import "../IERC20.sol";
import "../extensions/IERC20Permit.sol";
import "../../../utils/Address.sol";

/**
 * @title SafeERC20
 * @dev Wrappers around ERC20 operations that throw on failure (when the token
 * contract returns false). Tokens that return no value (and instead revert or
 * throw on failure) are also supported, non-reverting calls are assumed to be
 * successful.
 * To use this library you can add a `using SafeERC20 for IERC20;` statement to your contract,
 * which allows you to call the safe operations as `token.safeTransfer(...)`, etc.
 */
library SafeERC20 {
    using Address for address;

    /**
     * @dev Transfer `value` amount of `token` from the calling contract to `to`. If `token` returns no value,
     * non-reverting calls are assumed to be successful.
     */
    function safeTransfer(IERC20 token, address to, uint256 value) internal {
        _callOptionalReturn(token, abi.encodeWithSelector(token.transfer.selector, to, value));
    }

    /**
     * @dev Transfer `value` amount of `token` from `from` to `to`, spending the approval given by `from` to the
     * calling contract. If `token` returns no value, non-reverting calls are assumed to be successful.
     */
    function safeTransferFrom(IERC20 token, address from, address to, uint256 value) internal {
        _callOptionalReturn(token, abi.encodeWithSelector(token.transferFrom.selector, from, to, value));
    }

    /**
     * @dev Deprecated. This function has issues similar to the ones found in
     * {IERC20-approve}, and its usage is discouraged.
     *
     * Whenever possible, use {safeIncreaseAllowance} and
     * {safeDecreaseAllowance} instead.
     */
    function safeApprove(IERC20 token, address spender, uint256 value) internal {
        // safeApprove should only be called when setting an initial allowance,
        // or when resetting it to zero. To increase and decrease it, use
        // 'safeIncreaseAllowance' and 'safeDecreaseAllowance'
        require(
            (value == 0) || (token.allowance(address(this), spender) == 0),
            "SafeERC20: approve from non-zero to non-zero allowance"
        );
        _callOptionalReturn(token, abi.encodeWithSelector(token.approve.selector, spender, value));
    }

    /**
     * @dev Increase the calling contract's allowance toward `spender` by `value`. If `token` returns no value,
     * non-reverting calls are assumed to be successful.
     */
    function safeIncreaseAllowance(IERC20 token, address spender, uint256 value) internal {
        uint256 oldAllowance = token.allowance(address(this), spender);
        _callOptionalReturn(token, abi.encodeWithSelector(token.approve.selector, spender, oldAllowance + value));
    }

    /**
     * @dev Decrease the calling contract's allowance toward `spender` by `value`. If `token` returns no value,
     * non-reverting calls are assumed to be successful.
     */
    function safeDecreaseAllowance(IERC20 token, address spender, uint256 value) internal {
        unchecked {
            uint256 oldAllowance = token.allowance(address(this), spender);
            require(oldAllowance >= value, "SafeERC20: decreased allowance below zero");
            _callOptionalReturn(token, abi.encodeWithSelector(token.approve.selector, spender, oldAllowance - value));
        }
    }

    /**
     * @dev Set the calling contract's allowance toward `spender` to `value`. If `token` returns no value,
     * non-reverting calls are assumed to be successful. Meant to be used with tokens that require the approval
     * to be set to zero before setting it to a non-zero value, such as USDT.
     */
    function forceApprove(IERC20 token, address spender, uint256 value) internal {
        bytes memory approvalCall = abi.encodeWithSelector(token.approve.selector, spender, value);

        if (!_callOptionalReturnBool(token, approvalCall)) {
            _callOptionalReturn(token, abi.encodeWithSelector(token.approve.selector, spender, 0));
            _callOptionalReturn(token, approvalCall);
        }
    }

    /**
     * @dev Use a ERC-2612 signature to set the `owner` approval toward `spender` on `token`.
     * Revert on invalid signature.
     */
    function safePermit(
        IERC20Permit token,
        address owner,
        address spender,
        uint256 value,
        uint256 deadline,
        uint8 v,
        bytes32 r,
        bytes32 s
    ) internal {
        uint256 nonceBefore = token.nonces(owner);
        token.permit(owner, spender, value, deadline, v, r, s);
        uint256 nonceAfter = token.nonces(owner);
        require(nonceAfter == nonceBefore + 1, "SafeERC20: permit did not succeed");
    }

    /**
     * @dev Imitates a Solidity high-level call (i.e. a regular function call to a contract), relaxing the requirement
     * on the return value: the return value is optional (but if data is returned, it must not be false).
     * @param token The token targeted by the call.
     * @param data The call data (encoded using abi.encode or one of its variants).
     */
    function _callOptionalReturn(IERC20 token, bytes memory data) private {
        // We need to perform a low level call here, to bypass Solidity's return data size checking mechanism, since
        // we're implementing it ourselves. We use {Address-functionCall} to perform this call, which verifies that
        // the target address contains contract code and also asserts for success in the low-level call.

        bytes memory returndata = address(token).functionCall(data, "SafeERC20: low-level call failed");
        require(returndata.length == 0 || abi.decode(returndata, (bool)), "SafeERC20: ERC20 operation did not succeed");
    }

    /**
     * @dev Imitates a Solidity high-level call (i.e. a regular function call to a contract), relaxing the requirement
     * on the return value: the return value is optional (but if data is returned, it must not be false).
     * @param token The token targeted by the call.
     * @param data The call data (encoded using abi.encode or one of its variants).
     *
     * This is a variant of {_callOptionalReturn} that silents catches all reverts and returns a bool instead.
     */
    function _callOptionalReturnBool(IERC20 token, bytes memory data) private returns (bool) {
        // We need to perform a low level call here, to bypass Solidity's return data size checking mechanism, since
        // we're implementing it ourselves. We cannot use {Address-functionCall} here since this should return false
        // and not revert is the subcall reverts.

        (bool success, bytes memory returndata) = address(token).call(data);
        return
            success && (returndata.length == 0 || abi.decode(returndata, (bool))) && Address.isContract(address(token));
    }
}

// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts (last updated v4.9.0) (utils/Address.sol)

pragma solidity ^0.8.1;

/**
 * @dev Collection of functions related to the address type
 */
library Address {
    /**
     * @dev Returns true if `account` is a contract.
     *
     * [IMPORTANT]
     * ====
     * It is unsafe to assume that an address for which this function returns
     * false is an externally-owned account (EOA) and not a contract.
     *
     * Among others, `isContract` will return false for the following
     * types of addresses:
     *
     *  - an externally-owned account
     *  - a contract in construction
     *  - an address where a contract will be created
     *  - an address where a contract lived, but was destroyed
     *
     * Furthermore, `isContract` will also return true if the target contract within
     * the same transaction is already scheduled for destruction by `SELFDESTRUCT`,
     * which only has an effect at the end of a transaction.
     * ====
     *
     * [IMPORTANT]
     * ====
     * You shouldn't rely on `isContract` to protect against flash loan attacks!
     *
     * Preventing calls from contracts is highly discouraged. It breaks composability, breaks support for smart wallets
     * like Gnosis Safe, and does not provide security since it can be circumvented by calling from a contract
     * constructor.
     * ====
     */
    function isContract(address account) internal view returns (bool) {
        // This method relies on extcodesize/address.code.length, which returns 0
        // for contracts in construction, since the code is only stored at the end
        // of the constructor execution.

        return account.code.length > 0;
    }

    /**
     * @dev Replacement for Solidity's `transfer`: sends `amount` wei to
     * `recipient`, forwarding all available gas and reverting on errors.
     *
     * https://eips.ethereum.org/EIPS/eip-1884[EIP1884] increases the gas cost
     * of certain opcodes, possibly making contracts go over the 2300 gas limit
     * imposed by `transfer`, making them unable to receive funds via
     * `transfer`. {sendValue} removes this limitation.
     *
     * https://consensys.net/diligence/blog/2019/09/stop-using-soliditys-transfer-now/[Learn more].
     *
     * IMPORTANT: because control is transferred to `recipient`, care must be
     * taken to not create reentrancy vulnerabilities. Consider using
     * {ReentrancyGuard} or the
     * https://solidity.readthedocs.io/en/v0.8.0/security-considerations.html#use-the-checks-effects-interactions-pattern[checks-effects-interactions pattern].
     */
    function sendValue(address payable recipient, uint256 amount) internal {
        require(address(this).balance >= amount, "Address: insufficient balance");

        (bool success, ) = recipient.call{value: amount}("");
        require(success, "Address: unable to send value, recipient may have reverted");
    }

    /**
     * @dev Performs a Solidity function call using a low level `call`. A
     * plain `call` is an unsafe replacement for a function call: use this
     * function instead.
     *
     * If `target` reverts with a revert reason, it is bubbled up by this
     * function (like regular Solidity function calls).
     *
     * Returns the raw returned data. To convert to the expected return value,
     * use https://solidity.readthedocs.io/en/latest/units-and-global-variables.html?highlight=abi.decode#abi-encoding-and-decoding-functions[`abi.decode`].
     *
     * Requirements:
     *
     * - `target` must be a contract.
     * - calling `target` with `data` must not revert.
     *
     * _Available since v3.1._
     */
    function functionCall(address target, bytes memory data) internal returns (bytes memory) {
        return functionCallWithValue(target, data, 0, "Address: low-level call failed");
    }

    /**
     * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], but with
     * `errorMessage` as a fallback revert reason when `target` reverts.
     *
     * _Available since v3.1._
     */
    function functionCall(
        address target,
        bytes memory data,
        string memory errorMessage
    ) internal returns (bytes memory) {
        return functionCallWithValue(target, data, 0, errorMessage);
    }

    /**
     * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`],
     * but also transferring `value` wei to `target`.
     *
     * Requirements:
     *
     * - the calling contract must have an ETH balance of at least `value`.
     * - the called Solidity function must be `payable`.
     *
     * _Available since v3.1._
     */
    function functionCallWithValue(address target, bytes memory data, uint256 value) internal returns (bytes memory) {
        return functionCallWithValue(target, data, value, "Address: low-level call with value failed");
    }

    /**
     * @dev Same as {xref-Address-functionCallWithValue-address-bytes-uint256-}[`functionCallWithValue`], but
     * with `errorMessage` as a fallback revert reason when `target` reverts.
     *
     * _Available since v3.1._
     */
    function functionCallWithValue(
        address target,
        bytes memory data,
        uint256 value,
        string memory errorMessage
    ) internal returns (bytes memory) {
        require(address(this).balance >= value, "Address: insufficient balance for call");
        (bool success, bytes memory returndata) = target.call{value: value}(data);
        return verifyCallResultFromTarget(target, success, returndata, errorMessage);
    }

    /**
     * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`],
     * but performing a static call.
     *
     * _Available since v3.3._
     */
    function functionStaticCall(address target, bytes memory data) internal view returns (bytes memory) {
        return functionStaticCall(target, data, "Address: low-level static call failed");
    }

    /**
     * @dev Same as {xref-Address-functionCall-address-bytes-string-}[`functionCall`],
     * but performing a static call.
     *
     * _Available since v3.3._
     */
    function functionStaticCall(
        address target,
        bytes memory data,
        string memory errorMessage
    ) internal view returns (bytes memory) {
        (bool success, bytes memory returndata) = target.staticcall(data);
        return verifyCallResultFromTarget(target, success, returndata, errorMessage);
    }

    /**
     * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`],
     * but performing a delegate call.
     *
     * _Available since v3.4._
     */
    function functionDelegateCall(address target, bytes memory data) internal returns (bytes memory) {
        return functionDelegateCall(target, data, "Address: low-level delegate call failed");
    }

    /**
     * @dev Same as {xref-Address-functionCall-address-bytes-string-}[`functionCall`],
     * but performing a delegate call.
     *
     * _Available since v3.4._
     */
    function functionDelegateCall(
        address target,
        bytes memory data,
        string memory errorMessage
    ) internal returns (bytes memory) {
        (bool success, bytes memory returndata) = target.delegatecall(data);
        return verifyCallResultFromTarget(target, success, returndata, errorMessage);
    }

    /**
     * @dev Tool to verify that a low level call to smart-contract was successful, and revert (either by bubbling
     * the revert reason or using the provided one) in case of unsuccessful call or if target was not a contract.
     *
     * _Available since v4.8._
     */
    function verifyCallResultFromTarget(
        address target,
        bool success,
        bytes memory returndata,
        string memory errorMessage
    ) internal view returns (bytes memory) {
        if (success) {
            if (returndata.length == 0) {
                // only check isContract if the call was successful and the return data is empty
                // otherwise we already know that it was a contract
                require(isContract(target), "Address: call to non-contract");
            }
            return returndata;
        } else {
            _revert(returndata, errorMessage);
        }
    }

    /**
     * @dev Tool to verify that a low level call was successful, and revert if it wasn't, either by bubbling the
     * revert reason or using the provided one.
     *
     * _Available since v4.3._
     */
    function verifyCallResult(
        bool success,
        bytes memory returndata,
        string memory errorMessage
    ) internal pure returns (bytes memory) {
        if (success) {
            return returndata;
        } else {
            _revert(returndata, errorMessage);
        }
    }

    function _revert(bytes memory returndata, string memory errorMessage) private pure {
        // Look for revert reason and bubble it up if present
        if (returndata.length > 0) {
            // The easiest way to bubble the revert reason is using memory via assembly
            /// @solidity memory-safe-assembly
            assembly {
                let returndata_size := mload(returndata)
                revert(add(32, returndata), returndata_size)
            }
        } else {
            revert(errorMessage);
        }
    }
}

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

Contract Security Audit

Contract ABI

API
[{"inputs":[{"internalType":"address","name":"routerAddress","type":"address"},{"internalType":"address","name":"usdcAddress","type":"address"}],"stateMutability":"nonpayable","type":"constructor"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"spender","type":"address"},{"indexed":false,"internalType":"uint256","name":"value","type":"uint256"}],"name":"Approval","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"processed","type":"uint256"}],"name":"DistributionProgress","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"shareholder","type":"address"},{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"}],"name":"DividendsDistributed","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"sender","type":"address"},{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"}],"name":"ETHReceived","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"receiver","type":"address"},{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"}],"name":"ETHTransferred","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"tokenAmount","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"ethAmount","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"tokenMin","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"ethMin","type":"uint256"}],"name":"LiquidityAdded","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"owner","type":"address"}],"name":"OwnershipTransferred","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"developmentReceiver","type":"address"},{"indexed":false,"internalType":"address","name":"marketingReceiver","type":"address"},{"indexed":false,"internalType":"address","name":"liquidityReceiver","type":"address"}],"name":"ReceiverAddressesUpdated","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"usdcAddress","type":"address"}],"name":"RewardUpdated","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"routerAddress","type":"address"}],"name":"RouterUpdated","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"newTolerance","type":"uint256"}],"name":"SlippageToleranceUpdated","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"token","type":"address"},{"indexed":false,"internalType":"uint256","name":"amountIn","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"amountOut","type":"uint256"},{"indexed":false,"internalType":"bool","name":"success","type":"bool"},{"indexed":false,"internalType":"string","name":"reason","type":"string"}],"name":"SwapEvent","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"}],"name":"SwapRetryTriggered","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"from","type":"address"},{"indexed":true,"internalType":"address","name":"to","type":"address"},{"indexed":false,"internalType":"uint256","name":"value","type":"uint256"}],"name":"Transfer","type":"event"},{"inputs":[{"internalType":"address","name":"owner_","type":"address"},{"internalType":"address","name":"spender","type":"address"}],"name":"allowance","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"spender","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"approve","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"balanceOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"circulatingSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"claimDividend","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"decimals","outputs":[{"internalType":"uint8","name":"","type":"uint8"}],"stateMutability":"pure","type":"function"},{"inputs":[],"name":"development_receiver","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"distributorGas","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"holder","type":"address"}],"name":"estimateRewards","outputs":[{"internalType":"uint256","name":"usdcAmount","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getContractStats","outputs":[{"internalType":"uint256","name":"_totalDividends","type":"uint256"},{"internalType":"uint256","name":"_totalDistributed","type":"uint256"},{"internalType":"uint256","name":"_totalShares","type":"uint256"},{"internalType":"uint256","name":"_queuedTokens","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getFeeStructure","outputs":[{"internalType":"uint256","name":"_buyFee","type":"uint256"},{"internalType":"uint256","name":"_sellFee","type":"uint256"},{"internalType":"uint256","name":"_transferFee","type":"uint256"},{"internalType":"uint256[4]","name":"_distribution","type":"uint256[4]"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"holder","type":"address"}],"name":"getHolderInfo","outputs":[{"internalType":"uint256","name":"_balance","type":"uint256"},{"internalType":"uint256","name":"_shares","type":"uint256"},{"internalType":"uint256","name":"_unpaidDividends","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getOwner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getSwapConfig","outputs":[{"internalType":"bool","name":"_swapEnabled","type":"bool"},{"internalType":"uint256","name":"_swapThreshold","type":"uint256"},{"internalType":"uint256","name":"_minTokenAmountOut","type":"uint256"},{"internalType":"uint256","name":"_swapTimes","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"shareholder","type":"address"}],"name":"getUnpaidEarnings","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"isDividendExempt","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"isFeeExempt","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"isOwner","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"liquiditySlippageTolerance","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"liquidity_receiver","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"marketing_receiver","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"minDistribution","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"minPeriod","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"name","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"pure","type":"function"},{"inputs":[],"name":"pair","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_address","type":"address"},{"internalType":"uint256","name":"_amount","type":"uint256"}],"name":"rescueERC20","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenAmount","type":"uint256"}],"name":"retrySwap","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"reward","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"router","outputs":[{"internalType":"contract IRouter","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_minPeriod","type":"uint256"},{"internalType":"uint256","name":"_minDistribution","type":"uint256"},{"internalType":"uint256","name":"_distributorGas","type":"uint256"}],"name":"setDistributionCriteria","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_tolerance","type":"uint256"}],"name":"setLiquiditySlippageTolerance","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_maxTx","type":"uint256"},{"internalType":"uint256","name":"_maxSell","type":"uint256"},{"internalType":"uint256","name":"_maxWallet","type":"uint256"}],"name":"setParameters","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_developmentReceiver","type":"address"},{"internalType":"address","name":"_marketingReceiver","type":"address"},{"internalType":"address","name":"_liquidityReceiver","type":"address"}],"name":"setReceiverAddresses","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_usdcAddress","type":"address"}],"name":"setReward","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_routerAddress","type":"address"}],"name":"setRouter","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_liquidity","type":"uint256"},{"internalType":"uint256","name":"_marketing","type":"uint256"},{"internalType":"uint256","name":"_rewards","type":"uint256"},{"internalType":"uint256","name":"_development","type":"uint256"},{"internalType":"uint256","name":"_total","type":"uint256"},{"internalType":"uint256","name":"_sell","type":"uint256"},{"internalType":"uint256","name":"_trans","type":"uint256"}],"name":"setStructure","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_address","type":"address"},{"internalType":"bool","name":"_enabled","type":"bool"}],"name":"setisBot","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"holder","type":"address"},{"internalType":"bool","name":"exempt","type":"bool"}],"name":"setisDividendExempt","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_address","type":"address"},{"internalType":"bool","name":"_enabled","type":"bool"}],"name":"setisExempt","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"shares","outputs":[{"internalType":"uint256","name":"amount","type":"uint256"},{"internalType":"uint256","name":"totalExcluded","type":"uint256"},{"internalType":"uint256","name":"totalRealised","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"startTrading","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"symbol","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"pure","type":"function"},{"inputs":[],"name":"totalDistributed","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalDividends","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_wallet","type":"address"}],"name":"totalRewardsDistributed","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalShares","outputs":[{"internalType":"uint128","name":"","type":"uint128"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"pure","type":"function"},{"inputs":[{"internalType":"address","name":"recipient","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"transfer","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"sender","type":"address"},{"internalType":"address","name":"recipient","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"transferFrom","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address payable","name":"adr","type":"address"}],"name":"transferOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"triggerSwap","outputs":[],"stateMutability":"nonpayable","type":"function"},{"stateMutability":"payable","type":"receive"}]

60806040526127106100136012600a6105bb565b610021906305f5e1006105d1565b61002c9060646105d1565b61003691906105e8565b6002556127106100486012600a6105bb565b610056906305f5e1006105d1565b6100619060c86105d1565b61006b91906105e8565b60035561271061007d6012600a6105bb565b61008b906305f5e1006105d1565b6100969060c86105d1565b6100a091906105e8565b600455600b805460ff60a01b1916905560c8600c819055610708600d55611b58600e556103e8600f8190556010556105dc60115560129081556013805460ff19166001179055620186a0906100f690600a6105bb565b610104906305f5e1006105d1565b61010f9060646105d1565b61011991906105e8565b601655620186a061012c6012600a6105bb565b61013a906305f5e1006105d1565b61014590600a6105d1565b61014f91906105e8565b601755610e10602255662386f26fc100006023556205573060245561251c60285534801561017c57600080fd5b50604051614f1c380380614f1c83398101604081905261019b91610626565b600080546001600160a01b03191633179055600180556001600160a01b03821661020c5760405162461bcd60e51b815260206004820152601d60248201527f526f757465722063616e6e6f74206265207a65726f206164647265737300000060448201526064015b60405180910390fd5b6001600160a01b0381166102625760405162461bcd60e51b815260206004820152601b60248201527f555344432063616e6e6f74206265207a65726f206164647265737300000000006044820152606401610203565b600a80546001600160a01b0319166001600160a01b0384811691909117909155601a80549183166001600160a81b031990921691909117600360a11b1790819055601260ff600160a01b9092049190911611156103015760405162461bcd60e51b815260206004820152601d60248201527f496e76616c69642072657761726420746f6b656e20646563696d616c730000006044820152606401610203565b602580546001600160a01b0319908116730f245a7d374388cd76fc8139dd900e9b02bf69d71782556026805482167327dfbec90eea392446f71638b70193c6f558c0011781556027805490921673d53686b4298ac78b1d182e95feac1a4dd1d780bd178255306000818152600760209081526040808320805460ff19908116600190811790925597546001600160a01b03908116855282852080548a168317905596548716845281842080548916821790559454909516825284822080548716851790553382528482208054871685179055918152600890915291822080548416821790557f046fee3d77c34a6c5e10c3be6dc4b132c30449dbf4f0bc07684896dd0933429980548416821790559080527f5eff886ea0ce6ca488a3d6e336d6c0f75f46d19b42c06ce5ee98e42c96d256c780549092161790556104476012600a6105bb565b610455906305f5e1006105d1565b33600081815260056020526040812092909255907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef6104966012600a6105bb565b6104a4906305f5e1006105d1565b60405190815260200160405180910390a35050610659565b634e487b7160e01b600052601160045260246000fd5b6001815b600184111561050d578085048111156104f1576104f16104bc565b60018416156104ff57908102905b60019390931c9280026104d6565b935093915050565b600082610524575060016105b5565b81610531575060006105b5565b816001811461054757600281146105515761056d565b60019150506105b5565b60ff841115610562576105626104bc565b50506001821b6105b5565b5060208310610133831016604e8410600b8410161715610590575081810a6105b5565b61059d60001984846104d2565b80600019048211156105b1576105b16104bc565b0290505b92915050565b60006105ca60ff841683610515565b9392505050565b80820281158282048414176105b5576105b56104bc565b60008261060557634e487b7160e01b600052601260045260246000fd5b500490565b80516001600160a01b038116811461062157600080fd5b919050565b6000806040838503121561063957600080fd5b6106428361060a565b91506106506020840161060a565b90509250929050565b6148b4806106686000396000f3fe6080604052600436106103385760003560e01c806380ca04aa116101b0578063ca89b899116100ec578063e87655cf11610095578063f0fc6bca1161006f578063f0fc6bca14610ac0578063f2fde38b14610ad5578063f887ea4014610af5578063ffd49c8414610b1557600080fd5b8063e87655cf14610a6a578063ef43b02b14610a8a578063efca2eed14610aaa57600080fd5b8063dd62ed3e116100c6578063dd62ed3e146109b6578063dfe6b5d6146109fc578063e5932c4014610a4a57600080fd5b8063ca89b8991461091e578063ce7c2ac214610956578063d9a319b01461099157600080fd5b806395d89b4111610159578063a8aa1b3111610133578063a8aa1b311461089e578063a9059cbb146108be578063b0da0354146108de578063c0d78655146108fe57600080fd5b806395d89b41146108225780639679cf6814610868578063997664d71461088857600080fd5b80638cd4426d1161018a5780638cd4426d146107d85780638f937cc4146107f85780639358928b1461080d57600080fd5b806380ca04aa14610784578063893d20e81461079a5780638c41180e146107b857600080fd5b8063313ce5671161027f57806348ff2b8b116102285780635f7bcd70116102025780635f7bcd70146106f857806360e719621461071857806370a082311461072e5780638082bd7c1461076457600080fd5b806348ff2b8b146106875780634fab0ae8146106a757806354e4067a146106bd57600080fd5b80633f4218e0116102595780633f4218e014610607578063420bbf20146106375780634355855a1461065757600080fd5b8063313ce5671461058157806334c5d2ce1461059d5780633a98ef39146105bd57600080fd5b806318160ddd116102e157806328fd3198116102bb57806328fd31981461051d578063293230b81461053d5780632f54bf6e1461055257600080fd5b806318160ddd146104a2578063228cb733146104c557806323b872dd146104fd57600080fd5b8063095ea7b311610312578063095ea7b3146104135780630b2ce411146104435780630ca61cb11461048257600080fd5b80630139e2e914610379578063044019301461039b57806306fdde03146103bb57600080fd5b366103745760405134815233907fbfe611b001dfcd411432f7bf0d79b82b4b2ee81511edac123a3403c357fb972a9060200160405180910390a2005b600080fd5b34801561038557600080fd5b506103996103943660046141d1565b610b2b565b005b3480156103a757600080fd5b506103996103b636600461421c565b610ee3565b3480156103c757600080fd5b5060408051808201909152600a81527f446f204e6f74204275790000000000000000000000000000000000000000000060208201525b60405161040a919061428c565b60405180910390f35b34801561041f57600080fd5b5061043361042e3660046142bf565b610fb6565b604051901515815260200161040a565b34801561044f57600080fd5b506013546016546017546014546040805160ff90951615158552602085019390935291830152606082015260800161040a565b34801561048e57600080fd5b5061039961049d3660046142eb565b610fcd565b3480156104ae57600080fd5b506104b76110a6565b60405190815260200161040a565b3480156104d157600080fd5b50601a546104e5906001600160a01b031681565b6040516001600160a01b03909116815260200161040a565b34801561050957600080fd5b50610433610518366004614317565b6110c7565b34801561052957600080fd5b506104b7610538366004614358565b61112a565b34801561054957600080fd5b506103996111c1565b34801561055e57600080fd5b5061043361056d366004614358565b6000546001600160a01b0391821691161490565b34801561058d57600080fd5b506040516012815260200161040a565b3480156105a957600080fd5b506103996105b83660046142eb565b61128e565b3480156105c957600080fd5b50601b546105e6906fffffffffffffffffffffffffffffffff1681565b6040516fffffffffffffffffffffffffffffffff909116815260200161040a565b34801561061357600080fd5b50610433610622366004614358565b60076020526000908152604090205460ff1681565b34801561064357600080fd5b506025546104e5906001600160a01b031681565b34801561066357600080fd5b50610433610672366004614358565b60086020526000908152604090205460ff1681565b34801561069357600080fd5b506103996106a2366004614383565b611497565b3480156106b357600080fd5b506104b760235481565b3480156106c957600080fd5b506106dd6106d8366004614358565b611505565b6040805193845260208401929092529082015260600161040a565b34801561070457600080fd5b506026546104e5906001600160a01b031681565b34801561072457600080fd5b506104b760245481565b34801561073a57600080fd5b506104b7610749366004614358565b6001600160a01b031660009081526005602052604090205490565b34801561077057600080fd5b5061039961077f3660046143bc565b611557565b34801561079057600080fd5b506104b760285481565b3480156107a657600080fd5b506000546001600160a01b03166104e5565b3480156107c457600080fd5b506103996107d3366004614383565b61165c565b3480156107e457600080fd5b506103996107f33660046142bf565b611757565b34801561080457600080fd5b506103996117b8565b34801561081957600080fd5b506104b761192a565b34801561082e57600080fd5b5060408051808201909152600381527f444e42000000000000000000000000000000000000000000000000000000000060208201526103fd565b34801561087457600080fd5b506104b7610883366004614358565b6119ac565b34801561089457600080fd5b506104b7601c5481565b3480156108aa57600080fd5b50600b546104e5906001600160a01b031681565b3480156108ca57600080fd5b506104336108d93660046142bf565b6119bf565b3480156108ea57600080fd5b506103996108f93660046143bc565b6119e0565b34801561090a57600080fd5b50610399610919366004614358565b611b29565b34801561092a57600080fd5b506104b7610939366004614358565b6001600160a01b0316600090815260208052604090206002015490565b34801561096257600080fd5b506106dd610971366004614358565b602080526000908152604090208054600182015460029092015490919083565b34801561099d57600080fd5b506109a6611fa1565b60405161040a94939291906143d5565b3480156109c257600080fd5b506104b76109d136600461441d565b6001600160a01b03918216600090815260066020908152604080832093909416825291909152205490565b348015610a0857600080fd5b50601c54601d54601b546018546fffffffffffffffffffffffffffffffff9091169060408051948552602085019390935291830152606082015260800161040a565b348015610a5657600080fd5b50610399610a65366004614358565b611feb565b348015610a7657600080fd5b506027546104e5906001600160a01b031681565b348015610a9657600080fd5b50610399610aa5366004614383565b6121ed565b348015610ab657600080fd5b506104b7601d5481565b348015610acc57600080fd5b50610399612290565b348015610ae157600080fd5b50610399610af0366004614358565b6122aa565b348015610b0157600080fd5b50600a546104e5906001600160a01b031681565b348015610b2157600080fd5b506104b760225481565b6000546001600160a01b03163314610b735760405162461bcd60e51b815260206004820152600660248201526510a7aba722a960d11b60448201526064015b60405180910390fd5b6001600160a01b038316610bef5760405162461bcd60e51b815260206004820152602b60248201527f446576656c6f706d656e742072656365697665722063616e6e6f74206265207a60448201527f65726f20616464726573730000000000000000000000000000000000000000006064820152608401610b6a565b6001600160a01b038216610c575760405162461bcd60e51b815260206004820152602960248201527f4d61726b6574696e672072656365697665722063616e6e6f74206265207a65726044820152686f206164647265737360b81b6064820152608401610b6a565b6001600160a01b038116610cbf5760405162461bcd60e51b815260206004820152602960248201527f4c69717569646974792072656365697665722063616e6e6f74206265207a65726044820152686f206164647265737360b81b6064820152608401610b6a565b823b15610d345760405162461bcd60e51b815260206004820152602960248201527f446576656c6f706d656e742072656365697665722063616e6e6f74206265206160448201527f20636f6e747261637400000000000000000000000000000000000000000000006064820152608401610b6a565b813b15610d935760405162461bcd60e51b815260206004820152602760248201527f4d61726b6574696e672072656365697665722063616e6e6f74206265206120636044820152661bdb9d1c9858dd60ca1b6064820152608401610b6a565b803b15610df25760405162461bcd60e51b815260206004820152602760248201527f4c69717569646974792072656365697665722063616e6e6f74206265206120636044820152661bdb9d1c9858dd60ca1b6064820152608401610b6a565b602580546001600160a01b039081166000908152600760209081526040808320805460ff199081169091556026805486168552828520805483169055602780548716865283862080548416905587548b88166001600160a01b0319918216811790995582548b89169082168117845582548b8a169216821783558988528588208054861660019081179091559354891688528588208054861685179055915490971686529483902080549092161790558051948552908401919091528201527fba7b08a2d1f196acb0a0bd201d9610825aba37da7a810c986f8d239deb39bb499060600160405180910390a1505050565b6000546001600160a01b03163314610f265760405162461bcd60e51b815260206004820152600660248201526510a7aba722a960d11b6044820152606401610b6a565b6127108486610f35898b614461565b610f3f9190614461565b610f499190614461565b14610f965760405162461bcd60e51b815260206004820152601f60248201527f46656520636f6d706f6e656e7473206d7573742073756d20746f2031303025006044820152606401610b6a565b600c96909655600d94909455600e92909255600f55601055601155601255565b6000610fc3338484612391565b5060015b92915050565b6000546001600160a01b031633146110105760405162461bcd60e51b815260206004820152600660248201526510a7aba722a960d11b6044820152606401610b6a565b620186a081101580156110265750620f42408111155b6110985760405162461bcd60e51b815260206004820152603560248201527f4469737472696275746f7220676173206d757374206265206265747765656e2060448201527f3130302c30303020616e6420312c3030302c30303000000000000000000000006064820152608401610b6a565b602292909255602355602455565b60006110b46012600a61455b565b6110c2906305f5e10061456a565b905090565b60006110d161245e565b6110dc8484846124b7565b6001600160a01b038416600090815260066020908152604080832033808552925290912054611117918691611112908690614581565b612391565b50600161112360018055565b9392505050565b6001600160a01b0381166000908152602080526040812054810361115057506000919050565b6001600160a01b038216600090815260208052604081205461117190612678565b6001600160a01b0384166000908152602080526040902060010154909150811161119c576000611123565b6001600160a01b03831660009081526020805260409020600101546111239082614581565b6000546001600160a01b031633146112045760405162461bcd60e51b815260206004820152600660248201526510a7aba722a960d11b6044820152606401610b6a565b600b54600160a01b900460ff161561125e5760405162461bcd60e51b815260206004820152601760248201527f54726164696e6720697320616c7265616479206f70656e0000000000000000006044820152606401610b6a565b600b80547fffffffffffffffffffffff00ffffffffffffffffffffffffffffffffffffffff16600160a01b179055565b6000546001600160a01b031633146112d15760405162461bcd60e51b815260206004820152600660248201526510a7aba722a960d11b6044820152606401610b6a565b6000612710846112e36012600a61455b565b6112f1906305f5e10061456a565b6112fb919061456a565b6113059190614594565b90506000612710846113196012600a61455b565b611327906305f5e10061456a565b611331919061456a565b61133b9190614594565b905060006127108461134f6012600a61455b565b61135d906305f5e10061456a565b611367919061456a565b6113719190614594565b600284905560038390556004819055905060006103e86113936012600a61455b565b6113a1906305f5e10061456a565b6113ac90600561456a565b6113b69190614594565b90508084101580156113c85750808310155b80156113d45750808210155b6114205760405162461bcd60e51b815260206004820152601f60248201527f4c696d6974732063616e6e6f74206265206c657373207468616e20302e3525006044820152606401610b6a565b6101f4871115801561143457506101f48611155b801561144257506101f48511155b61148e5760405162461bcd60e51b815260206004820152601760248201527f4c696d6974732063616e6e6f74206578636565642035250000000000000000006044820152606401610b6a565b50505050505050565b6000546001600160a01b031633146114da5760405162461bcd60e51b815260206004820152600660248201526510a7aba722a960d11b6044820152606401610b6a565b6001600160a01b03919091166000908152600760205260409020805460ff1916911515919091179055565b6000806000611529846001600160a01b031660009081526005602052604090205490565b6001600160a01b038516600090815260208052604090205461154a8661112a565b9250925092509193909250565b6000546001600160a01b0316331461159a5760405162461bcd60e51b815260206004820152600660248201526510a7aba722a960d11b6044820152606401610b6a565b61213481101580156115ae57506126488111155b6116205760405162461bcd60e51b815260206004820152602560248201527f546f6c6572616e6365206d757374206265206265747765656e2038352520616e60448201527f64203938250000000000000000000000000000000000000000000000000000006064820152608401610b6a565b60288190556040518181527fa3370f7fc7573d713f27ae89ba2f193d4b43991622ff969b0475e2f911aacf1a906020015b60405180910390a150565b6000546001600160a01b0316331461169f5760405162461bcd60e51b815260206004820152600660248201526510a7aba722a960d11b6044820152606401610b6a565b600b546001600160a01b038381169116148015906116cb5750600a546001600160a01b03838116911614155b80156116e057506001600160a01b0382163014155b61172c5760405162461bcd60e51b815260206004820152601260248201527f496e656c696769626c65204164647265737300000000000000000000000000006044820152606401610b6a565b6001600160a01b03919091166000908152600960205260409020805460ff1916911515919091179055565b6000546001600160a01b0316331461179a5760405162461bcd60e51b815260206004820152600660248201526510a7aba722a960d11b6044820152606401610b6a565b6026546117b4906001600160a01b038481169116836126a2565b5050565b6000546001600160a01b031633146117fb5760405162461bcd60e51b815260206004820152600660248201526510a7aba722a960d11b6044820152606401610b6a565b61180361245e565b6016543060009081526005602052604090205410156118645760405162461bcd60e51b815260206004820152601c60248201527f496e73756666696369656e7420746f6b656e7320666f722073776170000000006044820152606401610b6a565b60135460ff166118b65760405162461bcd60e51b815260206004820152601260248201527f5377617073206172652064697361626c656400000000000000000000000000006044820152606401610b6a565b600b54600160a01b900460ff1661190f5760405162461bcd60e51b815260206004820152601660248201527f54726164696e67206973206e6f7420616c6c6f776564000000000000000000006044820152606401610b6a565b61191a601654612727565b600060145561192860018055565b565b60056020527f05b8ccbb9d4d8fb16ea74ce3c29a41f1b461fbdaff4714a0d9a8eb05499746bc5461dead60009081527f7d509c07f0d4edcc2dd1b53aae68677132eb562dcba78e36381b63ccaf66e6ba5490919061198a6012600a61455b565b611998906305f5e10061456a565b6119a29190614581565b6110c29190614581565b6000610fc76119ba8361112a565b612a3a565b60006119c961245e565b6119d43384846124b7565b506001610fc760018055565b6000546001600160a01b03163314611a235760405162461bcd60e51b815260206004820152600660248201526510a7aba722a960d11b6044820152606401610b6a565b62015180601954611a349190614461565b421015611a835760405162461bcd60e51b815260206004820152600f60248201527f54696d656c6f636b2061637469766500000000000000000000000000000000006044820152606401610b6a565b601854811115611ad55760405162461bcd60e51b815260206004820152601a60248201527f496e73756666696369656e742071756575656420746f6b656e730000000000006044820152606401610b6a565b8060186000828254611ae79190614581565b909155505042601955611af981612a82565b6040518181527f6924e9f9ebc276076b8eb31c8760e5cd894457abd81cc2a134fa8c90a2a64c9f90602001611651565b6000546001600160a01b03163314611b6c5760405162461bcd60e51b815260206004820152600660248201526510a7aba722a960d11b6044820152606401610b6a565b6001600160a01b038116611bc25760405162461bcd60e51b815260206004820152601d60248201527f526f757465722063616e6e6f74206265207a65726f20616464726573730000006044820152606401610b6a565b600a80546001600160a01b0319166001600160a01b038316908117909155604080517fc45a0155000000000000000000000000000000000000000000000000000000008152905163c45a0155916004808201926020929091908290030181865afa158015611c34573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611c5891906145b6565b6001600160a01b0316636801cc3030600a60009054906101000a90046001600160a01b03166001600160a01b031663f24286216040518163ffffffff1660e01b8152600401602060405180830381865afa158015611cba573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611cde91906145b6565b6040517fffffffff0000000000000000000000000000000000000000000000000000000060e085901b1681526001600160a01b0392831660048201529116602482015260006044820152606401602060405180830381865afa158015611d48573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611d6c91906145b6565b600b80546001600160a01b0319166001600160a01b03929092169182179055611f3d57600a60009054906101000a90046001600160a01b03166001600160a01b031663c45a01556040518163ffffffff1660e01b8152600401602060405180830381865afa158015611de2573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611e0691906145b6565b6001600160a01b03166382dfdce430600a60009054906101000a90046001600160a01b03166001600160a01b031663f24286216040518163ffffffff1660e01b8152600401602060405180830381865afa158015611e68573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611e8c91906145b6565b6040517fffffffff0000000000000000000000000000000000000000000000000000000060e085901b1681526001600160a01b03928316600482015291166024820152600060448201526064016020604051808303816000875af1158015611ef8573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611f1c91906145b6565b600b80546001600160a01b0319166001600160a01b03929092169190911790555b600b546001600160a01b031660009081526008602052604090819020805460ff19166001179055517f7aed1d3e8155a07ccf395e44ea3109a0e2d6c9b29bbbe9f142d9790596f4dc80906116519083906001600160a01b0391909116815260200190565b6000806000611fae61419b565b505060105460115460125460408051608081018252600c548152600d546020820152600e5491810191909152600f54606082015292959194509250565b6000546001600160a01b0316331461202e5760405162461bcd60e51b815260206004820152600660248201526510a7aba722a960d11b6044820152606401610b6a565b6001600160a01b0381166120845760405162461bcd60e51b815260206004820152601b60248201527f555344432063616e6e6f74206265207a65726f206164647265737300000000006044820152606401610b6a565b6000816001600160a01b031663313ce5676040518163ffffffff1660e01b8152600401602060405180830381865afa1580156120c4573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906120e891906145d3565b905060068160ff1610158015612102575060128160ff1611155b6121745760405162461bcd60e51b815260206004820152602560248201527f52657761726420746f6b656e20646563696d616c73206d75737420626520362060448201527f746f2031380000000000000000000000000000000000000000000000000000006064820152608401610b6a565b601a80546001600160a01b0384167fffffffffffffffffffffff0000000000000000000000000000000000000000009091168117600160a01b60ff851602179091556040519081527ff0f334a92951c3f240a6d627261c6a075ab711edba3ce91573923831cbe4d4d19060200160405180910390a15050565b6000546001600160a01b031633146122305760405162461bcd60e51b815260206004820152600660248201526510a7aba722a960d11b6044820152606401610b6a565b6001600160a01b0382166000908152600860205260409020805460ff19168215801591909117909155612268576117b4826000612dcd565b6117b48261228b846001600160a01b031660009081526005602052604090205490565b612dcd565b61229861245e565b6122a133612f1d565b61192860018055565b6000546001600160a01b031633146122ed5760405162461bcd60e51b815260206004820152600660248201526510a7aba722a960d11b6044820152606401610b6a565b6001600160a01b0381166123435760405162461bcd60e51b815260206004820152601c60248201527f4f776e65722063616e6e6f74206265207a65726f2061646472657373000000006044820152606401610b6a565b600080546001600160a01b0319166001600160a01b0383169081179091556040519081527f04dba622d284ed0014ee4b9a6a68386be1a4c08a4913ae272de89199cc68616390602001611651565b6001600160a01b038316158015906123b157506001600160a01b03821615155b6123fd5760405162461bcd60e51b815260206004820152600f60248201527f496e76616c6964206164647265737300000000000000000000000000000000006044820152606401610b6a565b6001600160a01b0383811660008181526006602090815260408083209487168084529482529182902085905590518481527f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925910160405180910390a3505050565b6002600154036124b05760405162461bcd60e51b815260206004820152601f60248201527f5265656e7472616e637947756172643a207265656e7472616e742063616c6c006044820152606401610b6a565b6002600155565b6124c183826130bc565b6124cb838361319a565b6124d683838361323a565b6124e08383613327565b6124eb83838361337e565b6124f68383836134c3565b6001600160a01b0383166000908152600560205260408120805483929061251e908490614581565b909155506000905061253084846134e8565b61253a5781612545565b61254584848461352e565b6001600160a01b038416600090815260056020526040812080549293508392909190612572908490614461565b92505081905550826001600160a01b0316846001600160a01b03167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef836040516125be91815260200190565b60405180910390a36001600160a01b03841660009081526008602052604090205460ff16612609576126098461228b866001600160a01b031660009081526005602052604090205490565b6001600160a01b03831660009081526008602052604090205460ff1661264c5761264c8361228b856001600160a01b031660009081526005602052604090205490565b6001600160a01b0383166000908152602080526040902054156126725761267283612f1d565b50505050565b60006ec097ce7bc90715b34b9f1000000000601e5483612698919061456a565b610fc79190614594565b604080516001600160a01b038416602482015260448082018490528251808303909101815260649091019091526020810180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167fa9059cbb000000000000000000000000000000000000000000000000000000001790526127229084906135d2565b505050565b6015805460ff19166001179055600c5460009061271090612748908461456a565b6127529190614594565b905060006127608284614581565b90504761276c82612a82565b60006127788247614581565b90506000612710600c548361278d919061456a565b6127979190614594565b90506000612710600d54846127ac919061456a565b6127b69190614594565b90506000612710600e54856127cb919061456a565b6127d59190614594565b90506000612710600f54866127ea919061456a565b6127f49190614594565b905083156128065761280688856136ba565b821561286557602654612822906001600160a01b031684613817565b6026546040518481526001600160a01b03909116907f1445764fe3fdfc2a9812ff42e9b65c2e7896d5162851f78f7d4a5578f7346ff19060200160405180910390a25b80156128c457602554612881906001600160a01b031682613817565b6025546040518281526001600160a01b03909116907f1445764fe3fdfc2a9812ff42e9b65c2e7896d5162851f78f7d4a5578f7346ff19060200160405180910390a25b81156128d3576128d3826138ba565b4715612a255760004790506000600f54600e54600d546128f39190614461565b6128fd9190614461565b9050600081600d5484612910919061456a565b61291a9190614594565b9050600082600e548561292d919061456a565b6129379190614594565b90506000816129468487614581565b6129509190614581565b905082156129b15760265461296e906001600160a01b031684613817565b6026546040518481526001600160a01b03909116907f1445764fe3fdfc2a9812ff42e9b65c2e7896d5162851f78f7d4a5578f7346ff19060200160405180910390a25b8015612a10576025546129cd906001600160a01b031682613817565b6025546040518281526001600160a01b03909116907f1445764fe3fdfc2a9812ff42e9b65c2e7896d5162851f78f7d4a5578f7346ff19060200160405180910390a25b8115612a1f57612a1f826138ba565b50505050505b50506015805460ff1916905550505050505050565b601a54600090600160a01b900460ff16601203612a55575090565b601a54612a6d90600160a01b900460ff1660126145f6565b612a7890600a61455b565b610fc79083614594565b604080516001808252818301909252600091816020015b6040805160608101825260008082526020808301829052928201528252600019909201910181612a9957505060408051606081018252308152600a54825163f242862160e01b8152925193945090926020808501936001600160a01b039093169263f242862192600480830193928290030181865afa158015612b20573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612b4491906145b6565b6001600160a01b031681526020016000151581525081600081518110612b6c57612b6c614625565b6020908102919091010152600a54612b8f9030906001600160a01b031684612391565b600a546040516326207f2d60e21b81526000916064916001600160a01b0390911690639881fcb490612bc790879087906004016146a7565b600060405180830381865afa158015612be4573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f19168201604052612c0c91908101906146c0565b600181518110612c1e57612c1e614625565b6020026020010151605f612c32919061456a565b612c3c9190614594565b600a546040517f7af728c80000000000000000000000000000000000000000000000000000000081529192506001600160a01b031690637af728c890612c8e908690859087903090429060040161478d565b600060405180830381600087803b158015612ca857600080fd5b505af1925050508015612cb9575060015b612d55578260186000828254612ccf9190614461565b90915550506040805184815260208101839052600091810191909152608060608201819052600f908201527f4554482073776170206661696c6564000000000000000000000000000000000060a082015230907f8dffceb9e84cdc844f283400ee18bc0b28fd2855ce67c2c49e3c0cb9ab1bf4fa9060c0015b60405180910390a2505050565b60408051848152602081018390526001918101919091526080606082018190526013908201527f4554482073776170207375636365737366756c0000000000000000000000000060a082015230907f8dffceb9e84cdc844f283400ee18bc0b28fd2855ce67c2c49e3c0cb9ab1bf4fa9060c001612d48565b6001600160a01b03821660009081526021602052604090205460ff168115801590612df6575080155b15612e23576001600160a01b0383166000908152602160205260409020805460ff19166001179055612e54565b81158015612e2e5750805b15612e54576001600160a01b0383166000908152602160205260409020805460ff191690555b6001600160a01b0383166000908152602080526040902054601b548391612e8c916fffffffffffffffffffffffffffffffff16614581565b612e969190614461565b601b80547fffffffffffffffffffffffffffffffff00000000000000000000000000000000166fffffffffffffffffffffffffffffffff929092169190911790556001600160a01b03831660009081526020805260409020829055612efa82612678565b6001600160a01b0390931660009081526020805260409020600101929092555050565b6001600160a01b03811660009081526020805260408120549003612f3e5750565b6000612f498261112a565b9050600081118015612fce5750612f5f81612a3a565b601a546040516370a0823160e01b81523060048201526001600160a01b03909116906370a0823190602401602060405180830381865afa158015612fa7573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612fcb91906147c9565b10155b156117b4576000612fde82612a3a565b905081601d6000828254612ff29190614461565b90915550506001600160a01b0383166000908152601f602090815260408083204290559080528120600201805484929061302d908490614461565b90915550506001600160a01b038316600090815260208052604090205461305390612678565b6001600160a01b038085166000908152602080526040902060010191909155601a54613081911684836126a2565b826001600160a01b03167fa493a9229478c3fcd73f66d2cdeb7f94fd0f341da924d1054236d7845411651182604051612d4891815260200190565b600081116131325760405162461bcd60e51b815260206004820152602960248201527f5472616e7366657220616d6f756e74206d75737420626520677265617465722060448201527f7468616e207a65726f00000000000000000000000000000000000000000000006064820152608401610b6a565b6001600160a01b0382166000908152600560205260409020548111156117b45760405162461bcd60e51b815260206004820152601460248201527f496e73756666696369656e742062616c616e63650000000000000000000000006044820152606401610b6a565b6001600160a01b03821660009081526007602052604090205460ff161580156131dc57506001600160a01b03811660009081526007602052604090205460ff16155b156117b457600b54600160a01b900460ff166117b45760405162461bcd60e51b815260206004820152601360248201527f54726164696e67206e6f7420616c6c6f776564000000000000000000000000006044820152606401610b6a565b6001600160a01b03831660009081526007602052604090205460ff1615801561327c57506001600160a01b03821660009081526007602052604090205460ff16155b80156132965750600b546001600160a01b03838116911614155b80156132ad57506001600160a01b03821661dead14155b15612722576004546001600160a01b0383166000908152600560205260409020546132d9908390614461565b11156127225760405162461bcd60e51b815260206004820152601d60248201527f45786365656473206d6178696d756d2077616c6c657420616d6f756e740000006044820152606401610b6a565b600b546001600160a01b03828116911614801561335d57506001600160a01b03821660009081526007602052604090205460ff16155b156117b4576001601460008282546133759190614461565b90915550505050565b600b546001600160a01b0384811691161461342b57600354811115806133bc57506001600160a01b03831660009081526007602052604090205460ff165b806133df57506001600160a01b03821660009081526007602052604090205460ff165b61342b5760405162461bcd60e51b815260206004820152601360248201527f53656c6c204c696d6974204578636565646564000000000000000000000000006044820152606401610b6a565b6002548111158061345457506001600160a01b03831660009081526007602052604090205460ff165b8061347757506001600160a01b03821660009081526007602052604090205460ff165b6127225760405162461bcd60e51b815260206004820152601160248201527f5458204c696d69742045786365656465640000000000000000000000000000006044820152606401610b6a565b6134ce838383613cc8565b15612722576134de601654612727565b6000601455505050565b6001600160a01b03821660009081526007602052604081205460ff161580156111235750506001600160a01b031660009081526007602052604090205460ff1615919050565b60008061271061353e8686613d7a565b613548908561456a565b6135529190614594565b905080156135bf573060009081526005602052604081208054839290613579908490614461565b909155505060405181815230906001600160a01b038716907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef9060200160405180910390a35b6135c98184614581565b95945050505050565b6000613627826040518060400160405280602081526020017f5361666545524332303a206c6f772d6c6576656c2063616c6c206661696c6564815250856001600160a01b0316613e1a9092919063ffffffff16565b905080516000148061364857508080602001905181019061364891906147e2565b6127225760405162461bcd60e51b815260206004820152602a60248201527f5361666545524332303a204552433230206f7065726174696f6e20646964206e60448201527f6f742073756363656564000000000000000000000000000000000000000000006064820152608401610b6a565b6000612710602854846136cd919061456a565b6136d79190614594565b90506000612710602854846136ec919061456a565b6136f69190614594565b600a549091506137119030906001600160a01b031686612391565b600a546027546040517fb7e0d4c0000000000000000000000000000000000000000000000000000000008152306004820152600060248201526044810187905260648101859052608481018490526001600160a01b0391821660a48201524260c482015291169063b7e0d4c090859060e40160606040518083038185885af11580156137a1573d6000803e3d6000fd5b50505050506040513d601f19601f820116820180604052508101906137c691906147ff565b50506040805186815260208101869052908101849052606081018390527f59af97c63758a02bfe06cf264fb416eba51db5020c6b61c1604d2fa1afafed61915060800160405180910390a150505050565b6000826001600160a01b03168260405160006040518083038185875af1925050503d8060008114613864576040519150601f19603f3d011682016040523d82523d6000602084013e613869565b606091505b50509050806127225760405162461bcd60e51b815260206004820152601360248201527f455448207472616e73666572206661696c6564000000000000000000000000006044820152606401610b6a565b601a546040516370a0823160e01b81523060048201526000916001600160a01b0316906370a0823190602401602060405180830381865afa158015613903573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061392791906147c9565b60408051600180825281830190925291925060009190816020015b60408051606081018252600080825260208083018290529282015282526000199092019101816139425750506040805160608101808352600a5463f242862160e01b90915291519293509182916001600160a01b03169063f2428621906064808501916020918187030181865afa1580156139c1573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906139e591906145b6565b6001600160a01b039081168252601a54166020820152600060409091018190528251839190613a1657613a16614625565b602002602001018190525060006064613a2e85613e31565b613a3990605f61456a565b613a439190614594565b600a546040517f76c727510000000000000000000000000000000000000000000000000000000081529192506001600160a01b0316906376c72751908690613a9590859087903090429060040161482d565b6000604051808303818588803b158015613aae57600080fd5b505af193505050508015613ac0575060015b613b4d57601a5460408051868152602081018490526000818301526080606082018190526010908201527f555344432073776170206661696c65640000000000000000000000000000000060a082015290516001600160a01b03909216917f8dffceb9e84cdc844f283400ee18bc0b28fd2855ce67c2c49e3c0cb9ab1bf4fa9181900360c00190a2612672565b601a546040516370a0823160e01b815230600482015260009185916001600160a01b03909116906370a0823190602401602060405180830381865afa158015613b9a573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190613bbe91906147c9565b613bc89190614581565b90506000613bd582613fc3565b905080601c6000828254613be99190614461565b9091555050601b546fffffffffffffffffffffffffffffffff16613c1c826ec097ce7bc90715b34b9f100000000061456a565b613c269190614594565b601e6000828254613c379190614461565b9091555050601a5460408051888152602081018590526001818301526080606082018190526014908201527f555344432073776170207375636365737366756c00000000000000000000000060a082015290516001600160a01b03909216917f8dffceb9e84cdc844f283400ee18bc0b28fd2855ce67c2c49e3c0cb9ab1bf4fa9181900360c00190a2505050505050565b6017546016543060009081526005602052604081205460155491938510159211159060ff16158015613cfc575060135460ff165b8015613d115750600b54600160a01b900460ff165b8015613d1a5750815b8015613d3f57506001600160a01b03861660009081526007602052604090205460ff16155b8015613d585750600b546001600160a01b038681169116145b8015613d675750600260145410155b8015613d705750805b9695505050505050565b6001600160a01b03821660009081526009602052604081205460ff1680613db957506001600160a01b03821660009081526009602052604090205460ff165b15613dd257613dcb6064612710614581565b9050610fc7565b600b546001600160a01b0390811690831603613df15750601154610fc7565b600b546001600160a01b0390811690841603613e105750601054610fc7565b5060125492915050565b6060613e29848460008561400b565b949350505050565b604080516001808252818301909252600091829190816020015b6040805160608101825260008082526020808301829052928201528252600019909201910181613e4b5750506040805160608101808352600a5463f242862160e01b90915291519293509182916001600160a01b03169063f2428621906064808501916020918187030181865afa158015613eca573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190613eee91906145b6565b6001600160a01b039081168252601a54166020820152600060409091018190528251839190613f1f57613f1f614625565b6020908102919091010152600a546040516326207f2d60e21b81526001600160a01b0390911690639881fcb490613f5c90869085906004016146a7565b600060405180830381865afa158015613f79573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f19168201604052613fa191908101906146c0565b600181518110613fb357613fb3614625565b6020026020010151915050919050565b601a54600090600160a01b900460ff16601203613fde575090565b601a54613ff690600160a01b900460ff1660126145f6565b61400190600a61455b565b610fc7908361456a565b6060824710156140835760405162461bcd60e51b815260206004820152602660248201527f416464726573733a20696e73756666696369656e742062616c616e636520666f60448201527f722063616c6c00000000000000000000000000000000000000000000000000006064820152608401610b6a565b600080866001600160a01b0316858760405161409f9190614862565b60006040518083038185875af1925050503d80600081146140dc576040519150601f19603f3d011682016040523d82523d6000602084013e6140e1565b606091505b50915091506140f2878383876140fd565b979650505050505050565b6060831561416c578251600003614165576001600160a01b0385163b6141655760405162461bcd60e51b815260206004820152601d60248201527f416464726573733a2063616c6c20746f206e6f6e2d636f6e74726163740000006044820152606401610b6a565b5081613e29565b613e2983838151156141815781518083602001fd5b8060405162461bcd60e51b8152600401610b6a919061428c565b60405180608001604052806004906020820280368337509192915050565b6001600160a01b03811681146141ce57600080fd5b50565b6000806000606084860312156141e657600080fd5b83356141f1816141b9565b92506020840135614201816141b9565b91506040840135614211816141b9565b809150509250925092565b600080600080600080600060e0888a03121561423757600080fd5b505085359760208701359750604087013596606081013596506080810135955060a0810135945060c0013592509050565b60005b8381101561428357818101518382015260200161426b565b50506000910152565b60208152600082518060208401526142ab816040850160208701614268565b601f01601f19169190910160400192915050565b600080604083850312156142d257600080fd5b82356142dd816141b9565b946020939093013593505050565b60008060006060848603121561430057600080fd5b505081359360208301359350604090920135919050565b60008060006060848603121561432c57600080fd5b8335614337816141b9565b92506020840135614347816141b9565b929592945050506040919091013590565b60006020828403121561436a57600080fd5b8135611123816141b9565b80151581146141ce57600080fd5b6000806040838503121561439657600080fd5b82356143a1816141b9565b915060208301356143b181614375565b809150509250929050565b6000602082840312156143ce57600080fd5b5035919050565b848152602081018490526040810183905260e08101606082018360005b60048110156144115781518352602092830192909101906001016143f2565b50505095945050505050565b6000806040838503121561443057600080fd5b823561443b816141b9565b915060208301356143b1816141b9565b634e487b7160e01b600052601160045260246000fd5b80820180821115610fc757610fc761444b565b6001815b60018411156144af578085048111156144935761449361444b565b60018416156144a157908102905b60019390931c928002614478565b935093915050565b6000826144c657506001610fc7565b816144d357506000610fc7565b81600181146144e957600281146144f35761450f565b6001915050610fc7565b60ff8411156145045761450461444b565b50506001821b610fc7565b5060208310610133831016604e8410600b8410161715614532575081810a610fc7565b61453f6000198484614474565b80600019048211156145535761455361444b565b029392505050565b600061112360ff8416836144b7565b8082028115828204841417610fc757610fc761444b565b81810381811115610fc757610fc761444b565b6000826145b157634e487b7160e01b600052601260045260246000fd5b500490565b6000602082840312156145c857600080fd5b8151611123816141b9565b6000602082840312156145e557600080fd5b815160ff8116811461112357600080fd5b60ff8281168282160390811115610fc757610fc761444b565b634e487b7160e01b600052604160045260246000fd5b634e487b7160e01b600052603260045260246000fd5b600081518084526020840193506020830160005b8281101561469d5781516001600160a01b0381511687526001600160a01b0360208201511660208801526040810151151560408801525060608601955060208201915060018101905061464f565b5093949350505050565b828152604060208201526000613e29604083018461463b565b6000602082840312156146d257600080fd5b815167ffffffffffffffff8111156146e957600080fd5b8201601f810184136146fa57600080fd5b805167ffffffffffffffff8111156147145761471461460f565b8060051b604051601f19603f830116810181811067ffffffffffffffff821117156147415761474161460f565b60405291825260208184018101929081018784111561475f57600080fd5b6020850194505b8385101561478257845180825260209586019590935001614766565b509695505050505050565b85815284602082015260a0604082015260006147ac60a083018661463b565b6001600160a01b0394909416606083015250608001529392505050565b6000602082840312156147db57600080fd5b5051919050565b6000602082840312156147f457600080fd5b815161112381614375565b60008060006060848603121561481457600080fd5b5050815160208301516040909301519094929350919050565b848152608060208201526000614846608083018661463b565b6001600160a01b03949094166040830152506060015292915050565b60008251614874818460208701614268565b919091019291505056fea264697066735822122038c6ca74b9c57a597062fdd15505c5fc84279a3591eefcd934f1c1e1e82f038264736f6c634300081a0033000000000000000000000000610d2f07b7edc67565160f587f37636194c34e74000000000000000000000000176211869ca2b568f2a7d4ee941e073a821ee1ff

Deployed Bytecode

0x6080604052600436106103385760003560e01c806380ca04aa116101b0578063ca89b899116100ec578063e87655cf11610095578063f0fc6bca1161006f578063f0fc6bca14610ac0578063f2fde38b14610ad5578063f887ea4014610af5578063ffd49c8414610b1557600080fd5b8063e87655cf14610a6a578063ef43b02b14610a8a578063efca2eed14610aaa57600080fd5b8063dd62ed3e116100c6578063dd62ed3e146109b6578063dfe6b5d6146109fc578063e5932c4014610a4a57600080fd5b8063ca89b8991461091e578063ce7c2ac214610956578063d9a319b01461099157600080fd5b806395d89b4111610159578063a8aa1b3111610133578063a8aa1b311461089e578063a9059cbb146108be578063b0da0354146108de578063c0d78655146108fe57600080fd5b806395d89b41146108225780639679cf6814610868578063997664d71461088857600080fd5b80638cd4426d1161018a5780638cd4426d146107d85780638f937cc4146107f85780639358928b1461080d57600080fd5b806380ca04aa14610784578063893d20e81461079a5780638c41180e146107b857600080fd5b8063313ce5671161027f57806348ff2b8b116102285780635f7bcd70116102025780635f7bcd70146106f857806360e719621461071857806370a082311461072e5780638082bd7c1461076457600080fd5b806348ff2b8b146106875780634fab0ae8146106a757806354e4067a146106bd57600080fd5b80633f4218e0116102595780633f4218e014610607578063420bbf20146106375780634355855a1461065757600080fd5b8063313ce5671461058157806334c5d2ce1461059d5780633a98ef39146105bd57600080fd5b806318160ddd116102e157806328fd3198116102bb57806328fd31981461051d578063293230b81461053d5780632f54bf6e1461055257600080fd5b806318160ddd146104a2578063228cb733146104c557806323b872dd146104fd57600080fd5b8063095ea7b311610312578063095ea7b3146104135780630b2ce411146104435780630ca61cb11461048257600080fd5b80630139e2e914610379578063044019301461039b57806306fdde03146103bb57600080fd5b366103745760405134815233907fbfe611b001dfcd411432f7bf0d79b82b4b2ee81511edac123a3403c357fb972a9060200160405180910390a2005b600080fd5b34801561038557600080fd5b506103996103943660046141d1565b610b2b565b005b3480156103a757600080fd5b506103996103b636600461421c565b610ee3565b3480156103c757600080fd5b5060408051808201909152600a81527f446f204e6f74204275790000000000000000000000000000000000000000000060208201525b60405161040a919061428c565b60405180910390f35b34801561041f57600080fd5b5061043361042e3660046142bf565b610fb6565b604051901515815260200161040a565b34801561044f57600080fd5b506013546016546017546014546040805160ff90951615158552602085019390935291830152606082015260800161040a565b34801561048e57600080fd5b5061039961049d3660046142eb565b610fcd565b3480156104ae57600080fd5b506104b76110a6565b60405190815260200161040a565b3480156104d157600080fd5b50601a546104e5906001600160a01b031681565b6040516001600160a01b03909116815260200161040a565b34801561050957600080fd5b50610433610518366004614317565b6110c7565b34801561052957600080fd5b506104b7610538366004614358565b61112a565b34801561054957600080fd5b506103996111c1565b34801561055e57600080fd5b5061043361056d366004614358565b6000546001600160a01b0391821691161490565b34801561058d57600080fd5b506040516012815260200161040a565b3480156105a957600080fd5b506103996105b83660046142eb565b61128e565b3480156105c957600080fd5b50601b546105e6906fffffffffffffffffffffffffffffffff1681565b6040516fffffffffffffffffffffffffffffffff909116815260200161040a565b34801561061357600080fd5b50610433610622366004614358565b60076020526000908152604090205460ff1681565b34801561064357600080fd5b506025546104e5906001600160a01b031681565b34801561066357600080fd5b50610433610672366004614358565b60086020526000908152604090205460ff1681565b34801561069357600080fd5b506103996106a2366004614383565b611497565b3480156106b357600080fd5b506104b760235481565b3480156106c957600080fd5b506106dd6106d8366004614358565b611505565b6040805193845260208401929092529082015260600161040a565b34801561070457600080fd5b506026546104e5906001600160a01b031681565b34801561072457600080fd5b506104b760245481565b34801561073a57600080fd5b506104b7610749366004614358565b6001600160a01b031660009081526005602052604090205490565b34801561077057600080fd5b5061039961077f3660046143bc565b611557565b34801561079057600080fd5b506104b760285481565b3480156107a657600080fd5b506000546001600160a01b03166104e5565b3480156107c457600080fd5b506103996107d3366004614383565b61165c565b3480156107e457600080fd5b506103996107f33660046142bf565b611757565b34801561080457600080fd5b506103996117b8565b34801561081957600080fd5b506104b761192a565b34801561082e57600080fd5b5060408051808201909152600381527f444e42000000000000000000000000000000000000000000000000000000000060208201526103fd565b34801561087457600080fd5b506104b7610883366004614358565b6119ac565b34801561089457600080fd5b506104b7601c5481565b3480156108aa57600080fd5b50600b546104e5906001600160a01b031681565b3480156108ca57600080fd5b506104336108d93660046142bf565b6119bf565b3480156108ea57600080fd5b506103996108f93660046143bc565b6119e0565b34801561090a57600080fd5b50610399610919366004614358565b611b29565b34801561092a57600080fd5b506104b7610939366004614358565b6001600160a01b0316600090815260208052604090206002015490565b34801561096257600080fd5b506106dd610971366004614358565b602080526000908152604090208054600182015460029092015490919083565b34801561099d57600080fd5b506109a6611fa1565b60405161040a94939291906143d5565b3480156109c257600080fd5b506104b76109d136600461441d565b6001600160a01b03918216600090815260066020908152604080832093909416825291909152205490565b348015610a0857600080fd5b50601c54601d54601b546018546fffffffffffffffffffffffffffffffff9091169060408051948552602085019390935291830152606082015260800161040a565b348015610a5657600080fd5b50610399610a65366004614358565b611feb565b348015610a7657600080fd5b506027546104e5906001600160a01b031681565b348015610a9657600080fd5b50610399610aa5366004614383565b6121ed565b348015610ab657600080fd5b506104b7601d5481565b348015610acc57600080fd5b50610399612290565b348015610ae157600080fd5b50610399610af0366004614358565b6122aa565b348015610b0157600080fd5b50600a546104e5906001600160a01b031681565b348015610b2157600080fd5b506104b760225481565b6000546001600160a01b03163314610b735760405162461bcd60e51b815260206004820152600660248201526510a7aba722a960d11b60448201526064015b60405180910390fd5b6001600160a01b038316610bef5760405162461bcd60e51b815260206004820152602b60248201527f446576656c6f706d656e742072656365697665722063616e6e6f74206265207a60448201527f65726f20616464726573730000000000000000000000000000000000000000006064820152608401610b6a565b6001600160a01b038216610c575760405162461bcd60e51b815260206004820152602960248201527f4d61726b6574696e672072656365697665722063616e6e6f74206265207a65726044820152686f206164647265737360b81b6064820152608401610b6a565b6001600160a01b038116610cbf5760405162461bcd60e51b815260206004820152602960248201527f4c69717569646974792072656365697665722063616e6e6f74206265207a65726044820152686f206164647265737360b81b6064820152608401610b6a565b823b15610d345760405162461bcd60e51b815260206004820152602960248201527f446576656c6f706d656e742072656365697665722063616e6e6f74206265206160448201527f20636f6e747261637400000000000000000000000000000000000000000000006064820152608401610b6a565b813b15610d935760405162461bcd60e51b815260206004820152602760248201527f4d61726b6574696e672072656365697665722063616e6e6f74206265206120636044820152661bdb9d1c9858dd60ca1b6064820152608401610b6a565b803b15610df25760405162461bcd60e51b815260206004820152602760248201527f4c69717569646974792072656365697665722063616e6e6f74206265206120636044820152661bdb9d1c9858dd60ca1b6064820152608401610b6a565b602580546001600160a01b039081166000908152600760209081526040808320805460ff199081169091556026805486168552828520805483169055602780548716865283862080548416905587548b88166001600160a01b0319918216811790995582548b89169082168117845582548b8a169216821783558988528588208054861660019081179091559354891688528588208054861685179055915490971686529483902080549092161790558051948552908401919091528201527fba7b08a2d1f196acb0a0bd201d9610825aba37da7a810c986f8d239deb39bb499060600160405180910390a1505050565b6000546001600160a01b03163314610f265760405162461bcd60e51b815260206004820152600660248201526510a7aba722a960d11b6044820152606401610b6a565b6127108486610f35898b614461565b610f3f9190614461565b610f499190614461565b14610f965760405162461bcd60e51b815260206004820152601f60248201527f46656520636f6d706f6e656e7473206d7573742073756d20746f2031303025006044820152606401610b6a565b600c96909655600d94909455600e92909255600f55601055601155601255565b6000610fc3338484612391565b5060015b92915050565b6000546001600160a01b031633146110105760405162461bcd60e51b815260206004820152600660248201526510a7aba722a960d11b6044820152606401610b6a565b620186a081101580156110265750620f42408111155b6110985760405162461bcd60e51b815260206004820152603560248201527f4469737472696275746f7220676173206d757374206265206265747765656e2060448201527f3130302c30303020616e6420312c3030302c30303000000000000000000000006064820152608401610b6a565b602292909255602355602455565b60006110b46012600a61455b565b6110c2906305f5e10061456a565b905090565b60006110d161245e565b6110dc8484846124b7565b6001600160a01b038416600090815260066020908152604080832033808552925290912054611117918691611112908690614581565b612391565b50600161112360018055565b9392505050565b6001600160a01b0381166000908152602080526040812054810361115057506000919050565b6001600160a01b038216600090815260208052604081205461117190612678565b6001600160a01b0384166000908152602080526040902060010154909150811161119c576000611123565b6001600160a01b03831660009081526020805260409020600101546111239082614581565b6000546001600160a01b031633146112045760405162461bcd60e51b815260206004820152600660248201526510a7aba722a960d11b6044820152606401610b6a565b600b54600160a01b900460ff161561125e5760405162461bcd60e51b815260206004820152601760248201527f54726164696e6720697320616c7265616479206f70656e0000000000000000006044820152606401610b6a565b600b80547fffffffffffffffffffffff00ffffffffffffffffffffffffffffffffffffffff16600160a01b179055565b6000546001600160a01b031633146112d15760405162461bcd60e51b815260206004820152600660248201526510a7aba722a960d11b6044820152606401610b6a565b6000612710846112e36012600a61455b565b6112f1906305f5e10061456a565b6112fb919061456a565b6113059190614594565b90506000612710846113196012600a61455b565b611327906305f5e10061456a565b611331919061456a565b61133b9190614594565b905060006127108461134f6012600a61455b565b61135d906305f5e10061456a565b611367919061456a565b6113719190614594565b600284905560038390556004819055905060006103e86113936012600a61455b565b6113a1906305f5e10061456a565b6113ac90600561456a565b6113b69190614594565b90508084101580156113c85750808310155b80156113d45750808210155b6114205760405162461bcd60e51b815260206004820152601f60248201527f4c696d6974732063616e6e6f74206265206c657373207468616e20302e3525006044820152606401610b6a565b6101f4871115801561143457506101f48611155b801561144257506101f48511155b61148e5760405162461bcd60e51b815260206004820152601760248201527f4c696d6974732063616e6e6f74206578636565642035250000000000000000006044820152606401610b6a565b50505050505050565b6000546001600160a01b031633146114da5760405162461bcd60e51b815260206004820152600660248201526510a7aba722a960d11b6044820152606401610b6a565b6001600160a01b03919091166000908152600760205260409020805460ff1916911515919091179055565b6000806000611529846001600160a01b031660009081526005602052604090205490565b6001600160a01b038516600090815260208052604090205461154a8661112a565b9250925092509193909250565b6000546001600160a01b0316331461159a5760405162461bcd60e51b815260206004820152600660248201526510a7aba722a960d11b6044820152606401610b6a565b61213481101580156115ae57506126488111155b6116205760405162461bcd60e51b815260206004820152602560248201527f546f6c6572616e6365206d757374206265206265747765656e2038352520616e60448201527f64203938250000000000000000000000000000000000000000000000000000006064820152608401610b6a565b60288190556040518181527fa3370f7fc7573d713f27ae89ba2f193d4b43991622ff969b0475e2f911aacf1a906020015b60405180910390a150565b6000546001600160a01b0316331461169f5760405162461bcd60e51b815260206004820152600660248201526510a7aba722a960d11b6044820152606401610b6a565b600b546001600160a01b038381169116148015906116cb5750600a546001600160a01b03838116911614155b80156116e057506001600160a01b0382163014155b61172c5760405162461bcd60e51b815260206004820152601260248201527f496e656c696769626c65204164647265737300000000000000000000000000006044820152606401610b6a565b6001600160a01b03919091166000908152600960205260409020805460ff1916911515919091179055565b6000546001600160a01b0316331461179a5760405162461bcd60e51b815260206004820152600660248201526510a7aba722a960d11b6044820152606401610b6a565b6026546117b4906001600160a01b038481169116836126a2565b5050565b6000546001600160a01b031633146117fb5760405162461bcd60e51b815260206004820152600660248201526510a7aba722a960d11b6044820152606401610b6a565b61180361245e565b6016543060009081526005602052604090205410156118645760405162461bcd60e51b815260206004820152601c60248201527f496e73756666696369656e7420746f6b656e7320666f722073776170000000006044820152606401610b6a565b60135460ff166118b65760405162461bcd60e51b815260206004820152601260248201527f5377617073206172652064697361626c656400000000000000000000000000006044820152606401610b6a565b600b54600160a01b900460ff1661190f5760405162461bcd60e51b815260206004820152601660248201527f54726164696e67206973206e6f7420616c6c6f776564000000000000000000006044820152606401610b6a565b61191a601654612727565b600060145561192860018055565b565b60056020527f05b8ccbb9d4d8fb16ea74ce3c29a41f1b461fbdaff4714a0d9a8eb05499746bc5461dead60009081527f7d509c07f0d4edcc2dd1b53aae68677132eb562dcba78e36381b63ccaf66e6ba5490919061198a6012600a61455b565b611998906305f5e10061456a565b6119a29190614581565b6110c29190614581565b6000610fc76119ba8361112a565b612a3a565b60006119c961245e565b6119d43384846124b7565b506001610fc760018055565b6000546001600160a01b03163314611a235760405162461bcd60e51b815260206004820152600660248201526510a7aba722a960d11b6044820152606401610b6a565b62015180601954611a349190614461565b421015611a835760405162461bcd60e51b815260206004820152600f60248201527f54696d656c6f636b2061637469766500000000000000000000000000000000006044820152606401610b6a565b601854811115611ad55760405162461bcd60e51b815260206004820152601a60248201527f496e73756666696369656e742071756575656420746f6b656e730000000000006044820152606401610b6a565b8060186000828254611ae79190614581565b909155505042601955611af981612a82565b6040518181527f6924e9f9ebc276076b8eb31c8760e5cd894457abd81cc2a134fa8c90a2a64c9f90602001611651565b6000546001600160a01b03163314611b6c5760405162461bcd60e51b815260206004820152600660248201526510a7aba722a960d11b6044820152606401610b6a565b6001600160a01b038116611bc25760405162461bcd60e51b815260206004820152601d60248201527f526f757465722063616e6e6f74206265207a65726f20616464726573730000006044820152606401610b6a565b600a80546001600160a01b0319166001600160a01b038316908117909155604080517fc45a0155000000000000000000000000000000000000000000000000000000008152905163c45a0155916004808201926020929091908290030181865afa158015611c34573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611c5891906145b6565b6001600160a01b0316636801cc3030600a60009054906101000a90046001600160a01b03166001600160a01b031663f24286216040518163ffffffff1660e01b8152600401602060405180830381865afa158015611cba573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611cde91906145b6565b6040517fffffffff0000000000000000000000000000000000000000000000000000000060e085901b1681526001600160a01b0392831660048201529116602482015260006044820152606401602060405180830381865afa158015611d48573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611d6c91906145b6565b600b80546001600160a01b0319166001600160a01b03929092169182179055611f3d57600a60009054906101000a90046001600160a01b03166001600160a01b031663c45a01556040518163ffffffff1660e01b8152600401602060405180830381865afa158015611de2573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611e0691906145b6565b6001600160a01b03166382dfdce430600a60009054906101000a90046001600160a01b03166001600160a01b031663f24286216040518163ffffffff1660e01b8152600401602060405180830381865afa158015611e68573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611e8c91906145b6565b6040517fffffffff0000000000000000000000000000000000000000000000000000000060e085901b1681526001600160a01b03928316600482015291166024820152600060448201526064016020604051808303816000875af1158015611ef8573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611f1c91906145b6565b600b80546001600160a01b0319166001600160a01b03929092169190911790555b600b546001600160a01b031660009081526008602052604090819020805460ff19166001179055517f7aed1d3e8155a07ccf395e44ea3109a0e2d6c9b29bbbe9f142d9790596f4dc80906116519083906001600160a01b0391909116815260200190565b6000806000611fae61419b565b505060105460115460125460408051608081018252600c548152600d546020820152600e5491810191909152600f54606082015292959194509250565b6000546001600160a01b0316331461202e5760405162461bcd60e51b815260206004820152600660248201526510a7aba722a960d11b6044820152606401610b6a565b6001600160a01b0381166120845760405162461bcd60e51b815260206004820152601b60248201527f555344432063616e6e6f74206265207a65726f206164647265737300000000006044820152606401610b6a565b6000816001600160a01b031663313ce5676040518163ffffffff1660e01b8152600401602060405180830381865afa1580156120c4573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906120e891906145d3565b905060068160ff1610158015612102575060128160ff1611155b6121745760405162461bcd60e51b815260206004820152602560248201527f52657761726420746f6b656e20646563696d616c73206d75737420626520362060448201527f746f2031380000000000000000000000000000000000000000000000000000006064820152608401610b6a565b601a80546001600160a01b0384167fffffffffffffffffffffff0000000000000000000000000000000000000000009091168117600160a01b60ff851602179091556040519081527ff0f334a92951c3f240a6d627261c6a075ab711edba3ce91573923831cbe4d4d19060200160405180910390a15050565b6000546001600160a01b031633146122305760405162461bcd60e51b815260206004820152600660248201526510a7aba722a960d11b6044820152606401610b6a565b6001600160a01b0382166000908152600860205260409020805460ff19168215801591909117909155612268576117b4826000612dcd565b6117b48261228b846001600160a01b031660009081526005602052604090205490565b612dcd565b61229861245e565b6122a133612f1d565b61192860018055565b6000546001600160a01b031633146122ed5760405162461bcd60e51b815260206004820152600660248201526510a7aba722a960d11b6044820152606401610b6a565b6001600160a01b0381166123435760405162461bcd60e51b815260206004820152601c60248201527f4f776e65722063616e6e6f74206265207a65726f2061646472657373000000006044820152606401610b6a565b600080546001600160a01b0319166001600160a01b0383169081179091556040519081527f04dba622d284ed0014ee4b9a6a68386be1a4c08a4913ae272de89199cc68616390602001611651565b6001600160a01b038316158015906123b157506001600160a01b03821615155b6123fd5760405162461bcd60e51b815260206004820152600f60248201527f496e76616c6964206164647265737300000000000000000000000000000000006044820152606401610b6a565b6001600160a01b0383811660008181526006602090815260408083209487168084529482529182902085905590518481527f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925910160405180910390a3505050565b6002600154036124b05760405162461bcd60e51b815260206004820152601f60248201527f5265656e7472616e637947756172643a207265656e7472616e742063616c6c006044820152606401610b6a565b6002600155565b6124c183826130bc565b6124cb838361319a565b6124d683838361323a565b6124e08383613327565b6124eb83838361337e565b6124f68383836134c3565b6001600160a01b0383166000908152600560205260408120805483929061251e908490614581565b909155506000905061253084846134e8565b61253a5781612545565b61254584848461352e565b6001600160a01b038416600090815260056020526040812080549293508392909190612572908490614461565b92505081905550826001600160a01b0316846001600160a01b03167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef836040516125be91815260200190565b60405180910390a36001600160a01b03841660009081526008602052604090205460ff16612609576126098461228b866001600160a01b031660009081526005602052604090205490565b6001600160a01b03831660009081526008602052604090205460ff1661264c5761264c8361228b856001600160a01b031660009081526005602052604090205490565b6001600160a01b0383166000908152602080526040902054156126725761267283612f1d565b50505050565b60006ec097ce7bc90715b34b9f1000000000601e5483612698919061456a565b610fc79190614594565b604080516001600160a01b038416602482015260448082018490528251808303909101815260649091019091526020810180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167fa9059cbb000000000000000000000000000000000000000000000000000000001790526127229084906135d2565b505050565b6015805460ff19166001179055600c5460009061271090612748908461456a565b6127529190614594565b905060006127608284614581565b90504761276c82612a82565b60006127788247614581565b90506000612710600c548361278d919061456a565b6127979190614594565b90506000612710600d54846127ac919061456a565b6127b69190614594565b90506000612710600e54856127cb919061456a565b6127d59190614594565b90506000612710600f54866127ea919061456a565b6127f49190614594565b905083156128065761280688856136ba565b821561286557602654612822906001600160a01b031684613817565b6026546040518481526001600160a01b03909116907f1445764fe3fdfc2a9812ff42e9b65c2e7896d5162851f78f7d4a5578f7346ff19060200160405180910390a25b80156128c457602554612881906001600160a01b031682613817565b6025546040518281526001600160a01b03909116907f1445764fe3fdfc2a9812ff42e9b65c2e7896d5162851f78f7d4a5578f7346ff19060200160405180910390a25b81156128d3576128d3826138ba565b4715612a255760004790506000600f54600e54600d546128f39190614461565b6128fd9190614461565b9050600081600d5484612910919061456a565b61291a9190614594565b9050600082600e548561292d919061456a565b6129379190614594565b90506000816129468487614581565b6129509190614581565b905082156129b15760265461296e906001600160a01b031684613817565b6026546040518481526001600160a01b03909116907f1445764fe3fdfc2a9812ff42e9b65c2e7896d5162851f78f7d4a5578f7346ff19060200160405180910390a25b8015612a10576025546129cd906001600160a01b031682613817565b6025546040518281526001600160a01b03909116907f1445764fe3fdfc2a9812ff42e9b65c2e7896d5162851f78f7d4a5578f7346ff19060200160405180910390a25b8115612a1f57612a1f826138ba565b50505050505b50506015805460ff1916905550505050505050565b601a54600090600160a01b900460ff16601203612a55575090565b601a54612a6d90600160a01b900460ff1660126145f6565b612a7890600a61455b565b610fc79083614594565b604080516001808252818301909252600091816020015b6040805160608101825260008082526020808301829052928201528252600019909201910181612a9957505060408051606081018252308152600a54825163f242862160e01b8152925193945090926020808501936001600160a01b039093169263f242862192600480830193928290030181865afa158015612b20573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612b4491906145b6565b6001600160a01b031681526020016000151581525081600081518110612b6c57612b6c614625565b6020908102919091010152600a54612b8f9030906001600160a01b031684612391565b600a546040516326207f2d60e21b81526000916064916001600160a01b0390911690639881fcb490612bc790879087906004016146a7565b600060405180830381865afa158015612be4573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f19168201604052612c0c91908101906146c0565b600181518110612c1e57612c1e614625565b6020026020010151605f612c32919061456a565b612c3c9190614594565b600a546040517f7af728c80000000000000000000000000000000000000000000000000000000081529192506001600160a01b031690637af728c890612c8e908690859087903090429060040161478d565b600060405180830381600087803b158015612ca857600080fd5b505af1925050508015612cb9575060015b612d55578260186000828254612ccf9190614461565b90915550506040805184815260208101839052600091810191909152608060608201819052600f908201527f4554482073776170206661696c6564000000000000000000000000000000000060a082015230907f8dffceb9e84cdc844f283400ee18bc0b28fd2855ce67c2c49e3c0cb9ab1bf4fa9060c0015b60405180910390a2505050565b60408051848152602081018390526001918101919091526080606082018190526013908201527f4554482073776170207375636365737366756c0000000000000000000000000060a082015230907f8dffceb9e84cdc844f283400ee18bc0b28fd2855ce67c2c49e3c0cb9ab1bf4fa9060c001612d48565b6001600160a01b03821660009081526021602052604090205460ff168115801590612df6575080155b15612e23576001600160a01b0383166000908152602160205260409020805460ff19166001179055612e54565b81158015612e2e5750805b15612e54576001600160a01b0383166000908152602160205260409020805460ff191690555b6001600160a01b0383166000908152602080526040902054601b548391612e8c916fffffffffffffffffffffffffffffffff16614581565b612e969190614461565b601b80547fffffffffffffffffffffffffffffffff00000000000000000000000000000000166fffffffffffffffffffffffffffffffff929092169190911790556001600160a01b03831660009081526020805260409020829055612efa82612678565b6001600160a01b0390931660009081526020805260409020600101929092555050565b6001600160a01b03811660009081526020805260408120549003612f3e5750565b6000612f498261112a565b9050600081118015612fce5750612f5f81612a3a565b601a546040516370a0823160e01b81523060048201526001600160a01b03909116906370a0823190602401602060405180830381865afa158015612fa7573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612fcb91906147c9565b10155b156117b4576000612fde82612a3a565b905081601d6000828254612ff29190614461565b90915550506001600160a01b0383166000908152601f602090815260408083204290559080528120600201805484929061302d908490614461565b90915550506001600160a01b038316600090815260208052604090205461305390612678565b6001600160a01b038085166000908152602080526040902060010191909155601a54613081911684836126a2565b826001600160a01b03167fa493a9229478c3fcd73f66d2cdeb7f94fd0f341da924d1054236d7845411651182604051612d4891815260200190565b600081116131325760405162461bcd60e51b815260206004820152602960248201527f5472616e7366657220616d6f756e74206d75737420626520677265617465722060448201527f7468616e207a65726f00000000000000000000000000000000000000000000006064820152608401610b6a565b6001600160a01b0382166000908152600560205260409020548111156117b45760405162461bcd60e51b815260206004820152601460248201527f496e73756666696369656e742062616c616e63650000000000000000000000006044820152606401610b6a565b6001600160a01b03821660009081526007602052604090205460ff161580156131dc57506001600160a01b03811660009081526007602052604090205460ff16155b156117b457600b54600160a01b900460ff166117b45760405162461bcd60e51b815260206004820152601360248201527f54726164696e67206e6f7420616c6c6f776564000000000000000000000000006044820152606401610b6a565b6001600160a01b03831660009081526007602052604090205460ff1615801561327c57506001600160a01b03821660009081526007602052604090205460ff16155b80156132965750600b546001600160a01b03838116911614155b80156132ad57506001600160a01b03821661dead14155b15612722576004546001600160a01b0383166000908152600560205260409020546132d9908390614461565b11156127225760405162461bcd60e51b815260206004820152601d60248201527f45786365656473206d6178696d756d2077616c6c657420616d6f756e740000006044820152606401610b6a565b600b546001600160a01b03828116911614801561335d57506001600160a01b03821660009081526007602052604090205460ff16155b156117b4576001601460008282546133759190614461565b90915550505050565b600b546001600160a01b0384811691161461342b57600354811115806133bc57506001600160a01b03831660009081526007602052604090205460ff165b806133df57506001600160a01b03821660009081526007602052604090205460ff165b61342b5760405162461bcd60e51b815260206004820152601360248201527f53656c6c204c696d6974204578636565646564000000000000000000000000006044820152606401610b6a565b6002548111158061345457506001600160a01b03831660009081526007602052604090205460ff165b8061347757506001600160a01b03821660009081526007602052604090205460ff165b6127225760405162461bcd60e51b815260206004820152601160248201527f5458204c696d69742045786365656465640000000000000000000000000000006044820152606401610b6a565b6134ce838383613cc8565b15612722576134de601654612727565b6000601455505050565b6001600160a01b03821660009081526007602052604081205460ff161580156111235750506001600160a01b031660009081526007602052604090205460ff1615919050565b60008061271061353e8686613d7a565b613548908561456a565b6135529190614594565b905080156135bf573060009081526005602052604081208054839290613579908490614461565b909155505060405181815230906001600160a01b038716907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef9060200160405180910390a35b6135c98184614581565b95945050505050565b6000613627826040518060400160405280602081526020017f5361666545524332303a206c6f772d6c6576656c2063616c6c206661696c6564815250856001600160a01b0316613e1a9092919063ffffffff16565b905080516000148061364857508080602001905181019061364891906147e2565b6127225760405162461bcd60e51b815260206004820152602a60248201527f5361666545524332303a204552433230206f7065726174696f6e20646964206e60448201527f6f742073756363656564000000000000000000000000000000000000000000006064820152608401610b6a565b6000612710602854846136cd919061456a565b6136d79190614594565b90506000612710602854846136ec919061456a565b6136f69190614594565b600a549091506137119030906001600160a01b031686612391565b600a546027546040517fb7e0d4c0000000000000000000000000000000000000000000000000000000008152306004820152600060248201526044810187905260648101859052608481018490526001600160a01b0391821660a48201524260c482015291169063b7e0d4c090859060e40160606040518083038185885af11580156137a1573d6000803e3d6000fd5b50505050506040513d601f19601f820116820180604052508101906137c691906147ff565b50506040805186815260208101869052908101849052606081018390527f59af97c63758a02bfe06cf264fb416eba51db5020c6b61c1604d2fa1afafed61915060800160405180910390a150505050565b6000826001600160a01b03168260405160006040518083038185875af1925050503d8060008114613864576040519150601f19603f3d011682016040523d82523d6000602084013e613869565b606091505b50509050806127225760405162461bcd60e51b815260206004820152601360248201527f455448207472616e73666572206661696c6564000000000000000000000000006044820152606401610b6a565b601a546040516370a0823160e01b81523060048201526000916001600160a01b0316906370a0823190602401602060405180830381865afa158015613903573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061392791906147c9565b60408051600180825281830190925291925060009190816020015b60408051606081018252600080825260208083018290529282015282526000199092019101816139425750506040805160608101808352600a5463f242862160e01b90915291519293509182916001600160a01b03169063f2428621906064808501916020918187030181865afa1580156139c1573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906139e591906145b6565b6001600160a01b039081168252601a54166020820152600060409091018190528251839190613a1657613a16614625565b602002602001018190525060006064613a2e85613e31565b613a3990605f61456a565b613a439190614594565b600a546040517f76c727510000000000000000000000000000000000000000000000000000000081529192506001600160a01b0316906376c72751908690613a9590859087903090429060040161482d565b6000604051808303818588803b158015613aae57600080fd5b505af193505050508015613ac0575060015b613b4d57601a5460408051868152602081018490526000818301526080606082018190526010908201527f555344432073776170206661696c65640000000000000000000000000000000060a082015290516001600160a01b03909216917f8dffceb9e84cdc844f283400ee18bc0b28fd2855ce67c2c49e3c0cb9ab1bf4fa9181900360c00190a2612672565b601a546040516370a0823160e01b815230600482015260009185916001600160a01b03909116906370a0823190602401602060405180830381865afa158015613b9a573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190613bbe91906147c9565b613bc89190614581565b90506000613bd582613fc3565b905080601c6000828254613be99190614461565b9091555050601b546fffffffffffffffffffffffffffffffff16613c1c826ec097ce7bc90715b34b9f100000000061456a565b613c269190614594565b601e6000828254613c379190614461565b9091555050601a5460408051888152602081018590526001818301526080606082018190526014908201527f555344432073776170207375636365737366756c00000000000000000000000060a082015290516001600160a01b03909216917f8dffceb9e84cdc844f283400ee18bc0b28fd2855ce67c2c49e3c0cb9ab1bf4fa9181900360c00190a2505050505050565b6017546016543060009081526005602052604081205460155491938510159211159060ff16158015613cfc575060135460ff165b8015613d115750600b54600160a01b900460ff165b8015613d1a5750815b8015613d3f57506001600160a01b03861660009081526007602052604090205460ff16155b8015613d585750600b546001600160a01b038681169116145b8015613d675750600260145410155b8015613d705750805b9695505050505050565b6001600160a01b03821660009081526009602052604081205460ff1680613db957506001600160a01b03821660009081526009602052604090205460ff165b15613dd257613dcb6064612710614581565b9050610fc7565b600b546001600160a01b0390811690831603613df15750601154610fc7565b600b546001600160a01b0390811690841603613e105750601054610fc7565b5060125492915050565b6060613e29848460008561400b565b949350505050565b604080516001808252818301909252600091829190816020015b6040805160608101825260008082526020808301829052928201528252600019909201910181613e4b5750506040805160608101808352600a5463f242862160e01b90915291519293509182916001600160a01b03169063f2428621906064808501916020918187030181865afa158015613eca573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190613eee91906145b6565b6001600160a01b039081168252601a54166020820152600060409091018190528251839190613f1f57613f1f614625565b6020908102919091010152600a546040516326207f2d60e21b81526001600160a01b0390911690639881fcb490613f5c90869085906004016146a7565b600060405180830381865afa158015613f79573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f19168201604052613fa191908101906146c0565b600181518110613fb357613fb3614625565b6020026020010151915050919050565b601a54600090600160a01b900460ff16601203613fde575090565b601a54613ff690600160a01b900460ff1660126145f6565b61400190600a61455b565b610fc7908361456a565b6060824710156140835760405162461bcd60e51b815260206004820152602660248201527f416464726573733a20696e73756666696369656e742062616c616e636520666f60448201527f722063616c6c00000000000000000000000000000000000000000000000000006064820152608401610b6a565b600080866001600160a01b0316858760405161409f9190614862565b60006040518083038185875af1925050503d80600081146140dc576040519150601f19603f3d011682016040523d82523d6000602084013e6140e1565b606091505b50915091506140f2878383876140fd565b979650505050505050565b6060831561416c578251600003614165576001600160a01b0385163b6141655760405162461bcd60e51b815260206004820152601d60248201527f416464726573733a2063616c6c20746f206e6f6e2d636f6e74726163740000006044820152606401610b6a565b5081613e29565b613e2983838151156141815781518083602001fd5b8060405162461bcd60e51b8152600401610b6a919061428c565b60405180608001604052806004906020820280368337509192915050565b6001600160a01b03811681146141ce57600080fd5b50565b6000806000606084860312156141e657600080fd5b83356141f1816141b9565b92506020840135614201816141b9565b91506040840135614211816141b9565b809150509250925092565b600080600080600080600060e0888a03121561423757600080fd5b505085359760208701359750604087013596606081013596506080810135955060a0810135945060c0013592509050565b60005b8381101561428357818101518382015260200161426b565b50506000910152565b60208152600082518060208401526142ab816040850160208701614268565b601f01601f19169190910160400192915050565b600080604083850312156142d257600080fd5b82356142dd816141b9565b946020939093013593505050565b60008060006060848603121561430057600080fd5b505081359360208301359350604090920135919050565b60008060006060848603121561432c57600080fd5b8335614337816141b9565b92506020840135614347816141b9565b929592945050506040919091013590565b60006020828403121561436a57600080fd5b8135611123816141b9565b80151581146141ce57600080fd5b6000806040838503121561439657600080fd5b82356143a1816141b9565b915060208301356143b181614375565b809150509250929050565b6000602082840312156143ce57600080fd5b5035919050565b848152602081018490526040810183905260e08101606082018360005b60048110156144115781518352602092830192909101906001016143f2565b50505095945050505050565b6000806040838503121561443057600080fd5b823561443b816141b9565b915060208301356143b1816141b9565b634e487b7160e01b600052601160045260246000fd5b80820180821115610fc757610fc761444b565b6001815b60018411156144af578085048111156144935761449361444b565b60018416156144a157908102905b60019390931c928002614478565b935093915050565b6000826144c657506001610fc7565b816144d357506000610fc7565b81600181146144e957600281146144f35761450f565b6001915050610fc7565b60ff8411156145045761450461444b565b50506001821b610fc7565b5060208310610133831016604e8410600b8410161715614532575081810a610fc7565b61453f6000198484614474565b80600019048211156145535761455361444b565b029392505050565b600061112360ff8416836144b7565b8082028115828204841417610fc757610fc761444b565b81810381811115610fc757610fc761444b565b6000826145b157634e487b7160e01b600052601260045260246000fd5b500490565b6000602082840312156145c857600080fd5b8151611123816141b9565b6000602082840312156145e557600080fd5b815160ff8116811461112357600080fd5b60ff8281168282160390811115610fc757610fc761444b565b634e487b7160e01b600052604160045260246000fd5b634e487b7160e01b600052603260045260246000fd5b600081518084526020840193506020830160005b8281101561469d5781516001600160a01b0381511687526001600160a01b0360208201511660208801526040810151151560408801525060608601955060208201915060018101905061464f565b5093949350505050565b828152604060208201526000613e29604083018461463b565b6000602082840312156146d257600080fd5b815167ffffffffffffffff8111156146e957600080fd5b8201601f810184136146fa57600080fd5b805167ffffffffffffffff8111156147145761471461460f565b8060051b604051601f19603f830116810181811067ffffffffffffffff821117156147415761474161460f565b60405291825260208184018101929081018784111561475f57600080fd5b6020850194505b8385101561478257845180825260209586019590935001614766565b509695505050505050565b85815284602082015260a0604082015260006147ac60a083018661463b565b6001600160a01b0394909416606083015250608001529392505050565b6000602082840312156147db57600080fd5b5051919050565b6000602082840312156147f457600080fd5b815161112381614375565b60008060006060848603121561481457600080fd5b5050815160208301516040909301519094929350919050565b848152608060208201526000614846608083018661463b565b6001600160a01b03949094166040830152506060015292915050565b60008251614874818460208701614268565b919091019291505056fea264697066735822122038c6ca74b9c57a597062fdd15505c5fc84279a3591eefcd934f1c1e1e82f038264736f6c634300081a0033

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

000000000000000000000000610d2f07b7edc67565160f587f37636194c34e74000000000000000000000000176211869ca2b568f2a7d4ee941e073a821ee1ff

-----Decoded View---------------
Arg [0] : routerAddress (address): 0x610D2f07b7EdC67565160F587F37636194C34E74
Arg [1] : usdcAddress (address): 0x176211869cA2b568f2A7D4EE941E073a821EE1ff

-----Encoded View---------------
2 Constructor Arguments found :
Arg [0] : 000000000000000000000000610d2f07b7edc67565160f587f37636194c34e74
Arg [1] : 000000000000000000000000176211869ca2b568f2a7d4ee941e073a821ee1ff


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.