ETH Price: $3,612.72 (+0.95%)

Contract

0x90B405a977d12bE79A6f1C8492a7f47D5Eb62bc1
 

Overview

ETH Balance

0 ETH

Eth Value

$0.00

Multichain Info

No addresses found
Transaction Hash
Method
Block
From
To

There are no matching entries

Please try again later

Latest 2 internal transactions

Advanced mode:
Parent Transaction Hash Block From To
192373502024-02-16 1:59:59291 days ago1708048799
0x90B405a9...D5Eb62bc1
 Contract Creation0 ETH
192373502024-02-16 1:59:59291 days ago1708048799  Contract Creation0 ETH
Loading...
Loading

Contract Source Code Verified (Exact Match)

Contract Name:
ProofFactoryTokenCutter

Compiler Version
v0.8.17+commit.8df45f5f

Optimization Enabled:
Yes with 200 runs

Other Settings:
default evmVersion
File 1 of 16 : ProofFactoryTokenCutter.sol
// SPDX-License-Identifier: None
pragma solidity ^0.8.17;

import "../interfaces/IERC721A.sol";
import "../libraries/Ownable.sol";
import "../libraries/ProofFactoryFees.sol";
import "../interfaces/IFACTORY.sol";
import "../interfaces/IDividendDistributor.sol";
import "../interfaces/IUniswapV2Router02.sol";
import "../DividendDistributor.sol";
import "../interfaces/IProofFactoryTokenCutter.sol";

contract ProofFactoryTokenCutter is Ownable, IProofFactoryTokenCutter {

    //This token was created with PROOF, and audited by Solidity Finance — https://proofplatform.io/projects
    IDividendDistributor public dividendDistributor;
    uint256 distributorGas = 50000;

    mapping(address => bool) public userWhitelist;
    IERC721A public nftWhitelist;
    mapping(address => uint256) private _balances;
    mapping(address => mapping(address => uint256)) private _allowances;

    uint256 private _totalSupply;
    uint256 public whitelistEndTime;
    uint256 public whitelistPeriod;
    bool public whitelistMode = true;
    string private _name;
    string private _symbol;

    address constant DEAD = 0x000000000000000000000000000000000000dEaD;
    address constant ZERO = 0x0000000000000000000000000000000000000000;
    address public proofAdmin;

    bool public restrictWhales = true;

    mapping(address => bool) public isFeeExempt;
    mapping(address => bool) public isTxLimitExempt;
    mapping(address => bool) public isDividendExempt;

    uint256 public launchedAt;
    uint256 public revenueFee = 2;
    uint256 public revenueFeeOnSell = 2;

    uint256 public reflectionFee;
    uint256 public lpFee;
    uint256 public devFee;

    uint256 public reflectionFeeOnSell;
    uint256 public lpFeeOnSell;
    uint256 public devFeeOnSell;

    uint256 public totalFee;
    uint256 public totalFeeIfSelling;

    uint256 accLpFees;
    uint256 accDevFees;
    uint256 accRevenueFees;
    uint256 accReflectionFees;

    bool public proofFeeRemoved = false;
    bool public proofFeeReduced = false;

    IUniswapV2Router02 public router;
    address public pair;
    address public factory;
    address payable public devWallet;

    bool inSwapAndLiquify;
    bool public swapAndLiquifyEnabled = true;
    bool public tradingStatus = true;

    uint256 public _maxTxAmount;
    uint256 public _walletMax;
    uint256 public swapThreshold;

    constructor() {
        factory = msg.sender;
    }

    modifier lockTheSwap() {
        inSwapAndLiquify = true;
        _;
        inSwapAndLiquify = false;
    }

    modifier onlyProofAdmin() {
        require(
            proofAdmin == _msgSender(),
            "not the proofAdmin"
        );
        _;
    }

    modifier onlyFactory() {
        require(factory == _msgSender(), "not the factory");
        _;
    }

    function setBasicData(
        BaseData memory _baseData,
        ProofFactoryFees.allFees memory fees
    ) external onlyFactory {
        _name = _baseData.tokenName;
        _symbol = _baseData.tokenSymbol;
        _totalSupply += _baseData.initialSupply;

        //Initial supply
        require(_baseData.percentToLP >= 70, "low lp");
        uint256 forLP = (_baseData.initialSupply * _baseData.percentToLP) / 100; //95%
        uint256 forOwner = _baseData.initialSupply - forLP; //5%

        _balances[msg.sender] += forLP;
        _balances[_baseData.owner] += forOwner;

        emit Transfer(address(0), msg.sender, forLP);
        emit Transfer(address(0), _baseData.owner, forOwner);

        _maxTxAmount = (_baseData.initialSupply * 5) / 1000;
        _walletMax = (_baseData.initialSupply * 1) / 100;
        swapThreshold = (_baseData.initialSupply * 5) / 4000;

        router = IUniswapV2Router02(_baseData.routerAddress);
        pair = IUniswapV2Factory(router.factory()).createPair(
            router.WETH(),
            address(this)
        );

        _allowances[address(this)][address(router)] = type(uint256).max;

        dividendDistributor = new DividendDistributor(
            _baseData.routerAddress,
            _baseData.reflectionToken,
            address(this)
        );

        userWhitelist[address(this)] = true;
        userWhitelist[factory] = true;
        userWhitelist[pair] = true;
        userWhitelist[_baseData.owner] = true;
        userWhitelist[_baseData.initialProofAdmin] = true;
        userWhitelist[_baseData.routerAddress] = true;
        _addWhitelist(_baseData.whitelists);

        nftWhitelist = IERC721A(_baseData.nftWhitelist);

        isFeeExempt[address(this)] = true;
        isFeeExempt[factory] = true;

        isTxLimitExempt[address(this)] = true;
        isTxLimitExempt[_baseData.owner] = true;
        isTxLimitExempt[pair] = true;
        isTxLimitExempt[factory] = true;
        isTxLimitExempt[DEAD] = true;
        isTxLimitExempt[ZERO] = true;

        isDividendExempt[pair] = true;
        isDividendExempt[address(this)] = true;
        isDividendExempt[DEAD] = true;
        isDividendExempt[ZERO] = true;

        whitelistPeriod = _baseData.whitelistPeriod;


        reflectionFee = fees.reflectionFee;
        lpFee = fees.lpFee;
        devFee = fees.devFee;

        reflectionFeeOnSell = fees.reflectionFeeOnSell;
        lpFeeOnSell = fees.lpFeeOnSell;
        devFeeOnSell = fees.devFeeOnSell;

        _calcTotalFee();


        devWallet = payable(_baseData.devWallet);
        proofAdmin = _baseData.initialProofAdmin;
    }

    //proofAdmin functions
    function updateProofAdmin(
        address newAdmin
    ) external virtual onlyProofAdmin {
        proofAdmin = newAdmin;
        userWhitelist[newAdmin] = true;
    }

    function updateWhitelistPeriod(
        uint256 _whitelistPeriod
    ) external onlyProofAdmin {
        whitelistPeriod = _whitelistPeriod;
        whitelistEndTime = launchedAt + (60 * _whitelistPeriod);
        whitelistMode = true;
    }

    //Factory functions
    function updateProofFactory(address newFactory) external onlyFactory {
        userWhitelist[newFactory] = true;
        isTxLimitExempt[newFactory] = true;
        isFeeExempt[newFactory] = true;	
        factory = newFactory;
    }

    function swapTradingStatus() external onlyFactory {
        tradingStatus = !tradingStatus;
    }

    function setLaunchedAt() external onlyFactory {
        require(launchedAt == 0, "already launched");
        launchedAt = block.timestamp;
        whitelistEndTime = block.timestamp + (60 * whitelistPeriod);
        whitelistMode = true;
    }

    function cancelToken() external onlyFactory {
        isFeeExempt[address(router)] = true;
        isTxLimitExempt[address(router)] = true;
        isTxLimitExempt[owner()] = true;
        tradingStatus = true;
        restrictWhales = false;
        swapAndLiquifyEnabled = false;
    }

    //Owner functions
    function changeFees(
        uint256 initialReflectionFee,
        uint256 initialReflectionFeeOnSell,
        uint256 initialLpFee,
        uint256 initialLpFeeOnSell,
        uint256 initialDevFee,
        uint256 initialDevFeeOnSell
    ) external onlyOwner {
        reflectionFee = initialReflectionFee;
        lpFee = initialLpFee;
        devFee = initialDevFee;

        reflectionFeeOnSell = initialReflectionFeeOnSell;
        lpFeeOnSell = initialLpFeeOnSell;
        devFeeOnSell = initialDevFeeOnSell;

        _calcTotalFee();
    }

    function changeTxLimit(uint256 newLimit) external onlyOwner {
        _checkLimit(newLimit);
        _maxTxAmount = newLimit;
    }

    function changeWalletLimit(uint256 newLimit) external onlyOwner {
        _checkLimit(newLimit);
        _walletMax = newLimit;
    }

    function changeRestrictWhales(bool newValue) external onlyOwner {
        restrictWhales = newValue;
    }

    function changeIsFeeExempt(address holder, bool exempt) external onlyOwner {
        isFeeExempt[holder] = exempt;
    }

    function changeIsTxLimitExempt(
        address holder,
        bool exempt
    ) external onlyOwner {
        isTxLimitExempt[holder] = exempt;
    }

    function changeDistributorGas(uint256 _distributorGas) external onlyOwner {
        distributorGas = _distributorGas;
    }

    function changeMinDistSettings(
        uint256 _minPeriod,
        uint256 _minDistLimit
    ) external onlyOwner {
        dividendDistributor.setMinPeriod(_minPeriod);
        dividendDistributor.setMinDistribution(_minDistLimit);
    }

    function setDevWallet(address payable newDevWallet) external onlyOwner {
        devWallet = payable(newDevWallet);
    }


    function changeSwapBackSettings(
        bool enableSwapBack,
        uint256 newSwapBackLimit
    ) external onlyOwner {
        swapAndLiquifyEnabled = enableSwapBack;
        swapThreshold = newSwapBackLimit;
    }

    function setDistributionCriteria(
        uint256 newMinPeriod_,
        uint256 newMinDistribution_
    ) external onlyOwner {
        dividendDistributor.setDistributionCriteria(
            newMinPeriod_,
            newMinDistribution_
        );
    }

    function getCirculatingSupply() external view returns (uint256) {
        return _totalSupply - balanceOf(DEAD) - balanceOf(ZERO);
    }

    function rewardTokenAddress() external view returns(address) {	
        return dividendDistributor.rewardTokenAddress();	
    }

    function isWhitelisted(address user) public view returns (bool) {
        return userWhitelist[user];
    }

    function name() external view virtual override returns (string memory) {
        return _name;
    }

    function symbol() external view virtual override returns (string memory) {
        return _symbol;
    }

    function decimals() external view virtual override returns (uint8) {
        return 9;
    }

    function totalSupply() external view virtual override returns (uint256) {
        return _totalSupply;
    }

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

    function transfer(
        address to,
        uint256 amount
    ) external virtual override returns (bool) {
        address owner = _msgSender();
        _transfer(owner, to, amount);
        return true;
    }

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

    function approve(
        address spender,
        uint256 amount
    ) external virtual override returns (bool) {
        address owner = _msgSender();
        _approve(owner, spender, amount);
        return true;
    }

    function transferFrom(
        address from,
        address to,
        uint256 amount
    ) external virtual override returns (bool) {
        address spender = _msgSender();
        _spendAllowance(from, spender, amount);
        _transfer(from, to, amount);
        return true;
    }

    function increaseAllowance(
        address spender,
        uint256 addedValue
    ) external virtual returns (bool) {
        address owner = _msgSender();
        _approve(owner, spender, _allowances[owner][spender] + addedValue);
        return true;
    }

    function decreaseAllowance(
        address spender,
        uint256 subtractedValue
    ) external virtual returns (bool) {
        address owner = _msgSender();
        uint256 currentAllowance = _allowances[owner][spender];
        require(
            currentAllowance >= subtractedValue,
            "Decreased allowance below zero"
        );
        unchecked {
            _approve(owner, spender, currentAllowance - subtractedValue);
        }

        return true;
    }

    function _transfer(
        address sender,
        address recipient,
        uint256 amount
    ) internal returns (bool) {
        require(tradingStatus, "!trading");
        
        if(whitelistMode) {
            if (block.timestamp >= whitelistEndTime ) {
                whitelistMode = false;
            } else {
                if (sender == pair) { //buy
                    require(isWhitelisted(recipient), "Not whitelisted");
                } else if (recipient == pair) { //sell
                    require(isWhitelisted(sender), "Not whitelisted");
                } else { //transfer
                    require(isWhitelisted(sender) && isWhitelisted(recipient), "Not Whitelisted");
                }
            }
        }

        if (!proofFeeRemoved && launchedAt != 0) { //first 31 days only
            if (!proofFeeReduced) { //case where proofFee is still 2, check if we can reduce
                if (block.timestamp > launchedAt + 86400) {
                    _calcTotalFee();
                }
            } else { //case where proofFee gas been reduced already, check if we can remove
                if (block.timestamp > launchedAt + 31 days) {
                    _calcTotalFee();
                }
            }
        }

        if (inSwapAndLiquify) {
            return _basicTransfer(sender, recipient, amount);
        }

        if (recipient == pair && restrictWhales) {	
            require(	
                amount <= _maxTxAmount ||	
                    (isTxLimitExempt[sender] && isTxLimitExempt[recipient]),	
                "Max TX"	
            );	
        }

        if (!isTxLimitExempt[recipient] && restrictWhales) {
            require(_balances[recipient] + amount <= _walletMax, "wallet");
        }

        if (
            sender != pair &&
            !inSwapAndLiquify &&
            swapAndLiquifyEnabled &&
            (accDevFees + accLpFees + accReflectionFees + accRevenueFees) >= swapThreshold
        ) {
            swapBack();
        }

        _balances[sender] = _balances[sender] - amount;
        uint256 finalAmount = amount;

        if (sender == pair || recipient == pair) {
            finalAmount = !isFeeExempt[sender] && !isFeeExempt[recipient]
                ? takeFee(sender, recipient, amount)
                : amount;
        }

        _balances[recipient] = _balances[recipient] + finalAmount;

        // Dividend tracker
        if (!isDividendExempt[sender]) {	
            try dividendDistributor.setShare(sender, _balances[sender]) {} catch {	
                emit DistributorFail();	
            }	
        }	
        if (!isDividendExempt[recipient]) {	
            try dividendDistributor.setShare(recipient, _balances[recipient]) {} catch {	
                    emit DistributorFail();	
                }	
        }	
        try dividendDistributor.process(distributorGas) {} catch {	
            emit DistributorFail();	
        }

        emit Transfer(sender, recipient, finalAmount);
        return true;
    }

    function _basicTransfer(
        address sender,
        address recipient,
        uint256 amount
    ) internal returns (bool) {
        _balances[sender] = _balances[sender] - amount;
        _balances[recipient] = _balances[recipient] + amount;
        emit Transfer(sender, recipient, amount);
        return true;
    }

    function _approve(
        address owner,
        address spender,
        uint256 amount
    ) internal virtual {
        require(owner != address(0), "Approve from the zero address");
        require(spender != address(0), "Approve to the zero address");

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

    /**
     * @dev Spend `amount` form the allowance of `owner` toward `spender`.
     *
     * Does not update the allowance amount in case of infinite allowance.
     * Revert if not enough allowance is available.
     *
     * Might emit an {Approval} event.
     */
    function _spendAllowance(
        address owner,
        address spender,
        uint256 amount
    ) internal virtual {
        uint256 currentAllowance = allowance(owner, spender);
        if (currentAllowance != type(uint256).max) {
            require(
                currentAllowance >= amount,
                "Insufficient allowance"
            );
            unchecked {
                _approve(owner, spender, currentAllowance - amount);
            }
        }
    }

    function takeFee(
        address sender,
        address recipient,
        uint256 amount
    ) internal returns (uint256) {
        uint256 feeApplicable;
        uint256 _lpApplicable;
        uint256 _devApplicable;
        uint256 _proofApplicable;
        uint256 _reflectionApplicable;
        if (pair == recipient) {
            feeApplicable = totalFeeIfSelling;
            _lpApplicable = lpFeeOnSell;
            _devApplicable = devFeeOnSell;
            _proofApplicable = revenueFeeOnSell;
            _reflectionApplicable = reflectionFeeOnSell;
        } else {
            feeApplicable = totalFee;
            _lpApplicable = lpFee;
            _devApplicable = devFee;
            _proofApplicable = revenueFee;
            _reflectionApplicable = reflectionFee;
        }
        if (feeApplicable == 0) return(amount);
        uint256 feeAmount = (amount * feeApplicable) / 100;

        accLpFees += feeAmount * _lpApplicable / feeApplicable;
        accDevFees += feeAmount * _devApplicable / feeApplicable;
        accRevenueFees += feeAmount * _proofApplicable / feeApplicable;
        accReflectionFees += feeAmount * _reflectionApplicable / feeApplicable;

        _balances[address(this)] = _balances[address(this)] + feeAmount;
        
        emit Transfer(sender, address(this), feeAmount);

        return amount - feeAmount;
    }

    function swapBack() internal lockTheSwap {
        uint256 tokensToLiquify = swapThreshold;

        uint256 lpProportion = accLpFees;
        uint256 devProportion = accDevFees;
        uint256 proofProportion = accRevenueFees;
        uint256 reflectionProportion = accReflectionFees;
        uint256 totalProportion = lpProportion + devProportion + proofProportion + reflectionProportion;

        uint256 lpAmt = tokensToLiquify * lpProportion / totalProportion;

        uint256 amountToLiquify = lpAmt / 2;

        if (tokensToLiquify - amountToLiquify == 0) return;

        address[] memory path = new address[](2);
        path[0] = address(this);
        path[1] = router.WETH();
        router.swapExactTokensForETHSupportingFeeOnTransferTokens(
            (tokensToLiquify - amountToLiquify),
            0,
            path,
            address(this),
            block.timestamp
        );

        uint256 amountA;
        if (amountToLiquify > 0) {
            (amountA,,) = router.addLiquidityETH{value: ((address(this).balance * amountToLiquify) / (totalProportion - amountToLiquify))}(
                address(this),
                amountToLiquify,
                0,
                0,
                0x000000000000000000000000000000000000dEaD,
                block.timestamp
            );
        }
        accLpFees = lpProportion < (lpAmt - (amountToLiquify - amountA)) ? 0 : 
            (lpProportion - (lpAmt - (amountToLiquify - amountA)));

        if (totalProportion - lpProportion == 0) return;
        uint256 amountETHafterLP = address(this).balance;
        uint256 devBalance = amountETHafterLP * devProportion / (devProportion + proofProportion + reflectionProportion);
        uint256 revenueBalance = (amountETHafterLP * proofProportion) / (devProportion + proofProportion + reflectionProportion);
        uint256 amountEthReflection = amountETHafterLP -
            devBalance -
            revenueBalance;

        accDevFees = devProportion < (tokensToLiquify * devProportion / totalProportion) ? 0 : 
            (devProportion - (tokensToLiquify * devProportion / totalProportion));
        accRevenueFees = proofProportion < (tokensToLiquify * proofProportion / totalProportion) ? 0 : 
            (proofProportion - (tokensToLiquify * proofProportion / totalProportion));
        accReflectionFees = reflectionProportion < (tokensToLiquify * reflectionProportion / totalProportion) ? 0 : 
            (reflectionProportion - (tokensToLiquify * reflectionProportion / totalProportion));

        if (amountETHafterLP > 0) {
            if (revenueBalance > 0) {
                uint256 revenueSplit = revenueBalance / 2;
                (bool sent, ) = payable(IFACTORY(factory).proofRevenueAddress()).call{value: revenueSplit}("");
                require(sent);
                (bool sent1, ) = payable(IFACTORY(factory).proofRewardPoolAddress()).call{value: revenueSplit}("");
                require(sent1);
            }
            if (devBalance > 0) {
                (bool sent, ) = devWallet.call{value: devBalance}("");
                require(sent);
            }
        }

        try dividendDistributor.deposit{value: amountEthReflection}() {} catch {
            emit DistributorFail();
        }
    }

    function _checkLimit(uint256 _newLimit) internal view {	
        require(launchedAt != 0, "!launched");	
        require(_newLimit >= (_totalSupply * 5) / 1000, "Min 0.5%");	
        require(_newLimit <= (_totalSupply * 3) / 100, "Max 3%");	
    }

    function _calcTotalFee() internal {
        uint256 _devFee = devFee;
        uint256 _lpFee = lpFee;
        uint256 _reflectionFee = reflectionFee;
        uint256 _devFeeOnSell = devFeeOnSell;
        uint256 _lpFeeOnSell = lpFeeOnSell;
        uint256 _reflectionFeeOnSell = reflectionFeeOnSell;

        if (!proofFeeRemoved && launchedAt != 0) { //first 31 days only
            if (!proofFeeReduced) { //case where proofFee is still 2, check if we can reduce
                if (block.timestamp > launchedAt + 86400) {
                    revenueFee = 1;
                    revenueFeeOnSell = 1;
                    proofFeeReduced = true;
                } else {
                    revenueFee = 2;
                    revenueFeeOnSell = 2;
                }
            } else { //case where it is 1, check if we can remove
                if (block.timestamp > launchedAt + 31 days) {
                    revenueFee = 0;
                    revenueFeeOnSell = 0;
                    proofFeeRemoved = true;
                } else {
                    revenueFee = 1;
                    revenueFeeOnSell = 1;
                }
            }
        }

        if (_devFee + _lpFee + _reflectionFee == 0) {
            revenueFee = 0;
        } 
        totalFee = _devFee + _lpFee + _reflectionFee + revenueFee;

        if (_devFeeOnSell + _lpFeeOnSell + _reflectionFeeOnSell == 0) {
            revenueFeeOnSell = 0;
        }
        totalFeeIfSelling = _devFeeOnSell + _lpFeeOnSell + _reflectionFeeOnSell + revenueFeeOnSell;
        
        if (IFACTORY(factory).isWhitelisted(owner())) {
            require(totalFee <= 12, "high KYC fee");
            require(totalFeeIfSelling <= 17, "high KYC fee");
        } else {
            require(totalFee <= 7, "high fee");
            require(totalFeeIfSelling <= 7, "high fee");
        }
    }

    function _addWhitelist(address[] memory _whitelists) internal {
        uint256 length = _whitelists.length;
        for (uint256 i = 0; i < length; i++) {
            userWhitelist[_whitelists[i]] = true;
        }
    }

    function addMoreToWhitelist(WhitelistAdd_ memory _WhitelistAdd) external onlyFactory {
        _addWhitelist(_WhitelistAdd.whitelists);
    }

    function addNFTSnapshot() external onlyFactory {
        uint256 len = nftWhitelist.totalSupply() + 1;
        for (uint256 i = 1; i < len; ) {
            userWhitelist[nftWhitelist.ownerOf(i)] = true;
            unchecked { ++i; }
        }
    }

    function withdrawAndSync() external onlyOwner {
        _transfer(address(this), msg.sender, balanceOf(address(this)) - (accDevFees + accLpFees + accReflectionFees + accRevenueFees));
    }

    receive() external payable {}
}

File 2 of 16 : IERC20Metadata.sol
// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts v4.4.1 (interfaces/IERC20Metadata.sol)

pragma solidity ^0.8.0;

import "../token/ERC20/extensions/IERC20Metadata.sol";

File 3 of 16 : IERC20Metadata.sol
// 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);
}

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

pragma solidity ^0.8.0;

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

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

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

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

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

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

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

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

File 5 of 16 : DividendDistributor.sol
// SPDX-License-Identifier: None
pragma solidity ^0.8.17;

import "@openzeppelin/contracts/token/ERC20/IERC20.sol";
import "./libraries/TokenUtils.sol";
import "./interfaces/IDividendDistributor.sol";
import "./interfaces/IUniswapV2Router02.sol";
import "./interfaces/IUniswapV2Factory.sol";
import "./interfaces/IWETH.sol";

contract DividendDistributor is IDividendDistributor {
    address _token;

    struct Share {
        uint256 amount;
        uint256 totalExcluded;
    }

    IUniswapV2Router02 router;
    IERC20 public RewardToken;

    address[] shareholders;
    mapping(address => uint256) public shareholderIndexes;
    mapping(address => uint256) public shareholderClaims;
    mapping(address => Share) public shares;

    uint256 public totalShares;
    uint256 public totalDividends;
    uint256 public totalDistributed;
    uint256 public dividendsPerShare;
    uint256 public dividendsPerShareAccuracyFactor = 10 ** 36;

    uint256 public minPeriod = 30 minutes;
    uint256 public minDistribution = 1 * (10 ** 18);

    uint256 currentIndex;
    bool initialized;

    modifier onlyToken() {
        require(msg.sender == _token);
        _;
    }

    constructor(address _router, address _reflectionToken, address token) {
        router = IUniswapV2Router02(_router);
        RewardToken = IERC20(_reflectionToken);
        _token = token;
        uint8 rewardTokenDecimals = TokenUtils.expectDecimals(token);
        uint256 fixedPoint = 10 ** rewardTokenDecimals;
        minDistribution = 1 * fixedPoint;
    }

    function setDistributionCriteria(
        uint256 _minPeriod,
        uint256 _minDistribution
    ) external override onlyToken {
        minPeriod = _minPeriod;
        minDistribution = _minDistribution;
    }

    function getShareHolders() external view returns (address[] memory) {
        return shareholders;
    }

    function setMinPeriod(uint256 _minPeriod) external override onlyToken {
        minPeriod = _minPeriod;
    }

    function setMinDistribution(
        uint256 _minDistribution
    ) external override onlyToken {
        minDistribution = _minDistribution;
    }

    function setShare(
        address _shareholder,
        uint256 amount
    ) external override onlyToken {
        Share storage shareholder = shares[_shareholder];
        uint256 shareholderAmount = shareholder.amount;
        if (shareholderAmount > 0) {
            distributeDividend(_shareholder);
        }

        if (amount > 0 && shareholderAmount == 0) {
            addShareholder(_shareholder);
        } else if (amount == 0 && shareholderAmount > 0) {
            removeShareholder(_shareholder);
        }

        totalShares = totalShares - shareholderAmount + amount;
        shareholder.amount = amount;
        shareholder.totalExcluded = getCumulativeDividends(amount);
    }

    function deposit() external payable override onlyToken {
        uint256 balanceBefore = RewardToken.balanceOf(address(this));

        address[] memory path = new address[](2);
        path[0] = router.WETH();
        path[1] = address(RewardToken);

        if (path[0] == path[1]) { //reward token is weth
            IWETH(path[0]).deposit{value: msg.value}();
        } else {
            router.swapExactETHForTokensSupportingFeeOnTransferTokens{
                value: msg.value
            }(0, path, address(this), block.timestamp);
        }
        uint256 amount = RewardToken.balanceOf(address(this)) - balanceBefore;
        totalDividends = totalDividends + amount;
        if (totalShares > 0) {
            dividendsPerShare =
                dividendsPerShare +
                (dividendsPerShareAccuracyFactor * amount) /
                totalShares;
        }
    }

    function process(uint256 gas) external override onlyToken {
        uint256 shareholderCount = shareholders.length;

        if (shareholderCount == 0) {
            return;
        }

        uint256 iterations = 0;
        uint256 gasUsed = 0;
        uint256 gasLeft = gasleft();

        while (gasUsed < gas && iterations < shareholderCount) {
            if (currentIndex >= shareholderCount) {
                currentIndex = 0;
            }

            if (shouldDistribute(shareholders[currentIndex])) {
                distributeDividend(shareholders[currentIndex]);
            }

            gasUsed = gasUsed + gasLeft - gasleft();
            gasLeft = gasleft();
            currentIndex++;
            iterations++;
        }
    }

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

    function distributeDividend(address _shareholder) internal {
        Share storage shareholder = shares[_shareholder];
        if (shareholder.amount == 0) {
            return;
        }

        uint256 amount = getUnpaidEarnings(_shareholder);
        if (amount > 0) {
            totalDistributed = totalDistributed + amount;
            shareholderClaims[_shareholder] = block.timestamp;
            shareholder.totalExcluded = getCumulativeDividends(shareholder.amount);
            RewardToken.transfer(_shareholder, amount);
        }
    }

    function rewardTokenAddress() external view returns(address) {
        return address(RewardToken);
    }

    function claimDividend() external {
        require(shouldDistribute(msg.sender), "Too soon. Need to wait!");
        distributeDividend(msg.sender);
    }

    function getUnpaidEarnings(
        address _shareholder
    ) public view returns (uint256) {
        Share storage shareholder = shares[_shareholder];
        if (shareholder.amount == 0) {
            return 0;
        }

        uint256 shareholderTotalDividends = getCumulativeDividends(shareholder.amount);
        uint256 shareholderTotalExcluded = shareholder.totalExcluded;
        if (shareholderTotalDividends <= shareholderTotalExcluded) {
            return 0;
        }

        return shareholderTotalDividends - shareholderTotalExcluded;
    }

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

    function addShareholder(address shareholder) internal {
        shareholderIndexes[shareholder] = shareholders.length;
        shareholders.push(shareholder);
    }

    function removeShareholder(address shareholder) internal {
        shareholders[shareholderIndexes[shareholder]] = shareholders[
            shareholders.length - 1
        ];
        shareholderIndexes[
            shareholders[shareholders.length - 1]
        ] = shareholderIndexes[shareholder];
        shareholders.pop();
    }
}

File 6 of 16 : IDividendDistributor.sol
// SPDX-License-Identifier: None
pragma solidity ^0.8.17;

interface IDividendDistributor {
    function setDistributionCriteria(
        uint256 _minPeriod,
        uint256 _minDistribution
    ) external;

    function setShare(address shareholder, uint256 amount) external;

    function deposit() external payable;

    function process(uint256 gas) external;

    function setMinPeriod(uint256 _minPeriod) external;

    function setMinDistribution(uint256 _minDistribution) external;

    function rewardTokenAddress() external view returns(address);
}

File 7 of 16 : IERC721A.sol
// SPDX-License-Identifier: MIT
// ERC721A Contracts v4.2.3
// Creator: Chiru Labs

pragma solidity ^0.8.4;

/**
 * @dev Interface of ERC721A.
 */
interface IERC721A {

    function totalSupply() external view returns (uint256);


    function ownerOf(uint256 tokenId) external view returns (address owner);

}

File 8 of 16 : IFACTORY.sol
// SPDX-License-Identifier: None
pragma solidity ^0.8.17;

interface IFACTORY {
    function proofRevenueAddress() external view returns (address);

    function proofRewardPoolAddress() external view returns (address);

    function isWhitelisted(address user) external view returns(bool);
}

File 9 of 16 : IProofFactoryTokenCutter.sol
// SPDX-License-Identifier: None
pragma solidity ^0.8.17;

import "@openzeppelin/contracts/token/ERC20/IERC20.sol";
import "@openzeppelin/contracts/token/ERC20/extensions/IERC20Metadata.sol";
import "../libraries/ProofFactoryFees.sol";

interface IProofFactoryTokenCutter is IERC20, IERC20Metadata {
    struct BaseData {
        string tokenName;
        string tokenSymbol;
        uint256 initialSupply;
        uint256 percentToLP;
        uint256 whitelistPeriod;
        address owner;
        address devWallet;
        address reflectionToken;
        address routerAddress;
        address initialProofAdmin;
        address[] whitelists;
        address nftWhitelist;
    }

    struct WhitelistAdd_ {
        address [] whitelists;
    }

    function setBasicData(
        BaseData memory _baseData,
        ProofFactoryFees.allFees memory fees
    ) external;

    function pair() external view returns (address);

    function swapTradingStatus() external;

    function updateProofFactory(address _newFactory) external;

    function addMoreToWhitelist(
        WhitelistAdd_ memory _WhitelistAdd
    ) external;

    function updateWhitelistPeriod(
        uint256 _whitelistPeriod
    ) external;

    function changeIsTxLimitExempt(
        address holder,
        bool exempt
    ) external;

    function addNFTSnapshot() external;

    event DistributorFail();

            function changeFees(
        uint256 initialMainFee,
        uint256 initialMainFeeOnSell,
        uint256 initialLpFee,
        uint256 initialLpFeeOnSell,
        uint256 initialDevFee,
        uint256 initialDevFeeOnSell
    ) external;
}

File 10 of 16 : IUniswapV2Factory.sol
// SPDX-License-Identifier: None
pragma solidity ^0.8.17;

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

File 11 of 16 : IUniswapV2Router02.sol
// SPDX-License-Identifier: None
pragma solidity ^0.8.17;

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

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

    function factory() external pure returns (address);

    function WETH() external pure returns (address);

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

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

File 12 of 16 : IWETH.sol
// SPDX-License-Identifier: None
pragma solidity ^0.8.17;

interface IWETH {
    function deposit() external payable;
    function transfer(address to, uint value) external returns (bool);
    function withdraw(uint) external;
}

File 13 of 16 : Context.sol
// SPDX-License-Identifier: None
pragma solidity ^0.8.17;

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

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

File 14 of 16 : Ownable.sol
// SPDX-License-Identifier: None
pragma solidity ^0.8.17;

import "./Context.sol";

abstract contract Ownable is Context {
    address private _owner;

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

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

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

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

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

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

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

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

File 15 of 16 : ProofFactoryFees.sol
// SPDX-License-Identifier: None
pragma solidity ^0.8.17;

library ProofFactoryFees {
    struct allFees {
        uint256 reflectionFee;
        uint256 reflectionFeeOnSell;
        uint256 lpFee;
        uint256 lpFeeOnSell;
        uint256 devFee;
        uint256 devFeeOnSell;
    }
}

File 16 of 16 : TokenUtils.sol
// SPDX-License-Identifier: GPL-3.0-or-later
pragma solidity ^0.8.17;

import "@openzeppelin/contracts/interfaces/IERC20Metadata.sol";

/// @title  TokenUtils
library TokenUtils  {
    /// @dev A safe function to get the decimals of an ERC20 token.
    ///
    /// @dev Reverts with a {CallFailed} error if execution of the query fails or returns an unexpected value.
    ///
    /// @param token The target token.
    ///
    /// @return The amount of decimals of the token.
    function expectDecimals(address token) internal view returns (uint8) {
        (bool success, bytes memory data) = token.staticcall(
            abi.encodeWithSelector(IERC20Metadata.decimals.selector)
        );

        require (success, "invalid");

        return abi.decode(data, (uint8));
    }   
}

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

Contract Security Audit

Contract ABI

[{"inputs":[],"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":[],"name":"DistributorFail","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"previousOwner","type":"address"},{"indexed":true,"internalType":"address","name":"newOwner","type":"address"}],"name":"OwnershipTransferred","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"from","type":"address"},{"indexed":true,"internalType":"address","name":"to","type":"address"},{"indexed":false,"internalType":"uint256","name":"value","type":"uint256"}],"name":"Transfer","type":"event"},{"inputs":[],"name":"_maxTxAmount","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"_walletMax","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"components":[{"internalType":"address[]","name":"whitelists","type":"address[]"}],"internalType":"struct IProofFactoryTokenCutter.WhitelistAdd_","name":"_WhitelistAdd","type":"tuple"}],"name":"addMoreToWhitelist","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"addNFTSnapshot","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"address","name":"spender","type":"address"}],"name":"allowance","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"spender","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"approve","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"balanceOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"cancelToken","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_distributorGas","type":"uint256"}],"name":"changeDistributorGas","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"initialReflectionFee","type":"uint256"},{"internalType":"uint256","name":"initialReflectionFeeOnSell","type":"uint256"},{"internalType":"uint256","name":"initialLpFee","type":"uint256"},{"internalType":"uint256","name":"initialLpFeeOnSell","type":"uint256"},{"internalType":"uint256","name":"initialDevFee","type":"uint256"},{"internalType":"uint256","name":"initialDevFeeOnSell","type":"uint256"}],"name":"changeFees","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"holder","type":"address"},{"internalType":"bool","name":"exempt","type":"bool"}],"name":"changeIsFeeExempt","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"holder","type":"address"},{"internalType":"bool","name":"exempt","type":"bool"}],"name":"changeIsTxLimitExempt","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_minPeriod","type":"uint256"},{"internalType":"uint256","name":"_minDistLimit","type":"uint256"}],"name":"changeMinDistSettings","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bool","name":"newValue","type":"bool"}],"name":"changeRestrictWhales","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bool","name":"enableSwapBack","type":"bool"},{"internalType":"uint256","name":"newSwapBackLimit","type":"uint256"}],"name":"changeSwapBackSettings","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"newLimit","type":"uint256"}],"name":"changeTxLimit","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"newLimit","type":"uint256"}],"name":"changeWalletLimit","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"decimals","outputs":[{"internalType":"uint8","name":"","type":"uint8"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"spender","type":"address"},{"internalType":"uint256","name":"subtractedValue","type":"uint256"}],"name":"decreaseAllowance","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"devFee","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"devFeeOnSell","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"devWallet","outputs":[{"internalType":"address payable","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"dividendDistributor","outputs":[{"internalType":"contract IDividendDistributor","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"factory","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getCirculatingSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"spender","type":"address"},{"internalType":"uint256","name":"addedValue","type":"uint256"}],"name":"increaseAllowance","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"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":"","type":"address"}],"name":"isTxLimitExempt","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"user","type":"address"}],"name":"isWhitelisted","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"launchedAt","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"lpFee","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"lpFeeOnSell","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"name","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"nftWhitelist","outputs":[{"internalType":"contract IERC721A","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"pair","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"proofAdmin","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"proofFeeReduced","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"proofFeeRemoved","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"reflectionFee","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"reflectionFeeOnSell","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"restrictWhales","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"revenueFee","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"revenueFeeOnSell","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"rewardTokenAddress","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"router","outputs":[{"internalType":"contract IUniswapV2Router02","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"components":[{"internalType":"string","name":"tokenName","type":"string"},{"internalType":"string","name":"tokenSymbol","type":"string"},{"internalType":"uint256","name":"initialSupply","type":"uint256"},{"internalType":"uint256","name":"percentToLP","type":"uint256"},{"internalType":"uint256","name":"whitelistPeriod","type":"uint256"},{"internalType":"address","name":"owner","type":"address"},{"internalType":"address","name":"devWallet","type":"address"},{"internalType":"address","name":"reflectionToken","type":"address"},{"internalType":"address","name":"routerAddress","type":"address"},{"internalType":"address","name":"initialProofAdmin","type":"address"},{"internalType":"address[]","name":"whitelists","type":"address[]"},{"internalType":"address","name":"nftWhitelist","type":"address"}],"internalType":"struct IProofFactoryTokenCutter.BaseData","name":"_baseData","type":"tuple"},{"components":[{"internalType":"uint256","name":"reflectionFee","type":"uint256"},{"internalType":"uint256","name":"reflectionFeeOnSell","type":"uint256"},{"internalType":"uint256","name":"lpFee","type":"uint256"},{"internalType":"uint256","name":"lpFeeOnSell","type":"uint256"},{"internalType":"uint256","name":"devFee","type":"uint256"},{"internalType":"uint256","name":"devFeeOnSell","type":"uint256"}],"internalType":"struct ProofFactoryFees.allFees","name":"fees","type":"tuple"}],"name":"setBasicData","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address payable","name":"newDevWallet","type":"address"}],"name":"setDevWallet","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"newMinPeriod_","type":"uint256"},{"internalType":"uint256","name":"newMinDistribution_","type":"uint256"}],"name":"setDistributionCriteria","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"setLaunchedAt","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"swapAndLiquifyEnabled","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"swapThreshold","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"swapTradingStatus","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"symbol","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalFee","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalFeeIfSelling","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"tradingStatus","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"transfer","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"transferFrom","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"newAdmin","type":"address"}],"name":"updateProofAdmin","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"newFactory","type":"address"}],"name":"updateProofFactory","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_whitelistPeriod","type":"uint256"}],"name":"updateWhitelistPeriod","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"userWhitelist","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"whitelistEndTime","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"whitelistMode","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"whitelistPeriod","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"withdrawAndSync","outputs":[],"stateMutability":"nonpayable","type":"function"},{"stateMutability":"payable","type":"receive"}]

608080604052346100b75760008054336001600160a01b0319808316821784559290916001600160a01b0316907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e09080a361c3506002908155600a805460ff19166001179055600d805460ff60a01b1916600160a01b17905560128190556013556020805461ffff191690556023805461ffff60a81b191661010160a81b1790556022805490911633179055614b0690816100bd8239f35b600080fdfe60808060405260043610156200001f575b5036156200001d57600080fd5b005b600090813560e01c9081630445b66714620022a25750806306fdde0314620021ff578063095ea7b314620021d25780630ab16c1914620021a7578063125f9e33146200212c57806316d9962b146200210557806318160ddd14620020e55780631df4ccfc14620020c55780631f53ac02146200207b57806323b872dd1462001fba57806327193bc41462001f1a5780632b112e491462001eca5780632d48e8961462001e58578063313ce5671462001e3a57806336e4ec641462001e1a578063395093511462001dc15780633af32abf146200095c5780633dab52691462001d735780633f4218e01462001d305780634355855a1462001ced57806344de2e4c1462001cc5578063461e5d3f1462001ca5578063497a000a1462001c2e5780634a74bb021462001c06578063546a88111462001b6457806359a51c341462001b395780635fef86801462001ac757806364d817fa1462001a39578063653598921462000fe75780636827e7641462000fc7578063704ce43e1462000fa757806370a082311462000f6a57806370c757ec1462000f45578063715018a61462000ee75780637c0ff2051462000ec75780637d1db4a51462000ea75780637db1342c1462000e75578063807c2d9c1462000e55578063838420131462000e3157806383ad79941462000e1157806388cda8731462000dea5780638b42507f1462000da75780638da5cb5b1462000d7e5780638ea5220f1462000d535780639502c4261462000d3357806395d89b411462000c51578063a3a2e89e1462000bf6578063a457c2d71462000b4d578063a8aa1b311462000b22578063a9059cbb1462000ae9578063b48e665e1462000ac9578063bad3ea6a1462000a9e578063bf56b3711462000a7e578063c45a01551462000a53578063ca987b0e1462000a33578063cb29813c14620009e7578063cc6badb314620009c7578063d4fb9a01146200099f578063d741b9c3146200095c578063d920334e146200092a578063dd62ed3e14620008d5578063e4cbd6b314620007f5578063e572967b1462000746578063e66b1d1e14620006fe578063ebdfd72214620006de578063f16fd78d1462000678578063f2fde38b14620005ba578063f576f5391462000457578063f887ea40146200042a578063fabe628314620003cc5763fbd7575303620000105734620003c95780600319360112620003c957620003a560018060a01b03602254163314620024fa565b6023805460ff60b01b19811660b091821c60ff161590911b60ff60b01b1617905580f35b80fd5b5034620003c9576040366003190112620003c95762000427620003ee6200230b565b620003f86200237a565b9062000403620024a0565b60018060a01b03168352600f602052604083209060ff801983541691151516179055565b80f35b5034620003c95780600319360112620003c9576020805460405160109190911c6001600160a01b03168152f35b5034620003c95780600319360112620003c9576022546001600160a01b0390620004859082163314620024fa565b806004541660405180916318160ddd60e01b825281600460209384935afa918215620005af57849262000576575b506001928383018093116200056257835b838110620004d0578580f35b602490838360045416604051938480926331a9108f60e11b82528560048301525afa918215620005575786928491899162000523575b501687526003845260408720805460ff19168317905501620004c4565b620005489150863d88116200054f575b6200053f81836200239e565b810190620025dd565b3862000506565b503d62000533565b6040513d89823e3d90fd5b634e487b7160e01b85526011600452602485fd5b9080925081813d8311620005a7575b6200059181836200239e565b81010312620005a357519038620004b3565b8380fd5b503d62000585565b6040513d86823e3d90fd5b5034620003c9576020366003190112620003c957620005d86200230b565b620005e2620024a0565b6001600160a01b039081169081156200063357600054826001600160601b0360a01b821617600055167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0600080a380f35b60405162461bcd60e51b815260206004820152601d60248201527f6e6577206f776e657220697320746865207a65726f20616464726573730000006044820152606490fd5b5034620003c9576020366003190112620003c957620006966200230b565b600d54906001600160a01b0390620006b28284163314620025fe565b1680916001600160601b0360a01b1617600d558152600360205260408120600160ff1982541617905580f35b5034620003c95780600319360112620003c9576020600854604051908152f35b5034620003c9576020366003190112620003c9576200071c6200236a565b62000726620024a0565b600d805460ff60a01b191691151560a01b60ff60a01b1691909117905580f35b5034620003c957600319602036820112620007f157600435906001600160401b0390818311620005a3576020908336030112620007ed57604051906020820182811082821117620007d7576040528260040135908111620005a35762000427926004620007b7923692010162002429565b8152620007d060018060a01b03602254163314620024fa565b51620039bf565b634e487b7160e01b600052604160045260246000fd5b8280fd5b5080fd5b5034620003c95780620008083662002353565b9062000813620024a0565b6001546001600160a01b039190821690813b15620008d157849160248392604051948593849263f821076960e01b845260048401525af1908115620005af578491620008b9575b50506001541690813b15620008b5578291602483926040519485938492635117196160e01b845260048401525af18015620008aa57620008975750f35b620008a2906200238a565b620003c95780f35b6040513d84823e3d90fd5b5050fd5b620008c4906200238a565b620008b55782386200085a565b8480fd5b5034620003c9576040366003190112620003c957620008f36200230b565b6040620008ff62002327565b9260018060a01b03809316815260066020522091166000526020526020604060002054604051908152f35b5034620003c9576020366003190112620003c9576004356200094b620024a0565b620009568162003603565b60245580f35b5034620003c9576020366003190112620003c95760209060ff906040906001600160a01b036200098b6200230b565b168152600384522054166040519015158152f35b5034620003c95780600319360112620003c957602060ff60235460b01c166040519015158152f35b5034620003c95780600319360112620003c9576020601754604051908152f35b5034620003c95760c0366003190112620003c95762000a05620024a0565b60043560145560443560155560843560165560243560175560643560185560a4356019556200042762003750565b5034620003c95780600319360112620003c9576020601b54604051908152f35b5034620003c95780600319360112620003c9576022546040516001600160a01b039091168152602090f35b5034620003c95780600319360112620003c9576020601154604051908152f35b5034620003c95780600319360112620003c9576001546040516001600160a01b039091168152602090f35b5034620003c95780600319360112620003c9576020600954604051908152f35b5034620003c9576040366003190112620003c95762000b1662000b0b6200230b565b60243590336200267f565b50602060405160018152f35b5034620003c95780600319360112620003c9576021546040516001600160a01b039091168152602090f35b5034620003c9576040366003190112620003c95762000b6b6200230b565b60406024359233815260066020522060018060a01b0382166000526020526040600020549180831062000bb15762000ba69203903362002d2d565b602060405160018152f35b60405162461bcd60e51b815260206004820152601e60248201527f44656372656173656420616c6c6f77616e63652062656c6f77207a65726f00006044820152606490fd5b5034620003c9576040366003190112620003c9576200042762000c186200230b565b62000c226200237a565b9062000c2d620024a0565b60018060a01b03168352600e602052604083209060ff801983541691151516179055565b5034620003c95780600319360112620003c9576040519080600c5462000c778162002539565b8085529160019180831690811562000d06575060011462000cb7575b62000cb38562000ca6818703826200239e565b60405191829182620022c0565b0390f35b9250600c835260008051602062004a518339815191525b82841062000ced57505050810160200162000ca68262000cb362000c93565b8054602085870181019190915290930192810162000cce565b86955062000cb39693506020925062000ca694915060ff191682840152151560051b820101929362000c93565b5034620003c95780600319360112620003c9576020601954604051908152f35b5034620003c95780600319360112620003c9576023546040516001600160a01b039091168152602090f35b5034620003c95780600319360112620003c957546040516001600160a01b039091168152602090f35b5034620003c9576020366003190112620003c95760209060ff906040906001600160a01b0362000dd66200230b565b168152600f84522054166040519015158152f35b5034620003c95780600319360112620003c957602060ff815460081c166040519015158152f35b5034620003c95780600319360112620003c9576020601454604051908152f35b5034620003c95780600319360112620003c957602060ff8154166040519015158152f35b5034620003c95780600319360112620003c9576020602554604051908152f35b5034620003c9576020366003190112620003c95760043562000e96620024a0565b62000ea18162003603565b60255580f35b5034620003c95780600319360112620003c9576020602454604051908152f35b5034620003c95780600319360112620003c9576020601854604051908152f35b5034620003c95780600319360112620003c95762000f04620024a0565b600080546001600160a01b0319811682556001600160a01b03167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e08280a380f35b5034620003c95780600319360112620003c957602060ff600a54166040519015158152f35b5034620003c9576020366003190112620003c9576020906040906001600160a01b0362000f966200230b565b168152600583522054604051908152f35b5034620003c95780600319360112620003c9576020601554604051908152f35b5034620003c95780600319360112620003c9576020601654604051908152f35b5034620003c9576003199060e036830112620003c9576001600160401b0360043511620003c957610180809260043536030112620003c9576040519182018281106001600160401b03821117620007d757604052600435600401356001600160401b038111620007f15762001064906004369181350101620023dc565b8252602460043501356001600160401b038111620007f1576200108f906004369181350101620023dc565b6020830152600435604481013560408401526064810135606084015260848101356080840152620010c39060a4016200233e565b60a0830152620010d860c4600435016200233e565b60c0830152620010ed60e4600435016200233e565b60e083015262001103610104600435016200233e565b6101008301526200111a610124600435016200233e565b6101208301526001600160401b03610144600435013511620003c9576200114d3660048035610144810135010162002429565b61014083015262001164610164600435016200233e565b61016083015260c0366023190112620003c9576040519060c082018281106001600160401b03821117620007d757604052602435825260443560208301526064356040830152608435606083015260a435608083015260c43560a0830152620011d960018060a01b03602254163314620024fa565b82519283516001600160401b03811162001a2557620011fa600b5462002539565b601f8111620019b6575b50602094601f82116001146200194057948394958293949262001934575b50508160011b916000199060031b1c191617600b555b60208101519283516001600160401b03811162001920576200125c600c5462002539565b601f8111620018b1575b506020601f82116001146200183857849582939495926200182c575b50508160011b916000199060031b1c191617600c555b620012aa604083015160075462002576565b6007556046606083015110620017fe576064620012d160408401516060850151906200259a565b0483620012e3826040860151620025cf565b91338252600560205260408220620012fd82825462002576565b905560a08501516001600160a01b0316825260056020526040822080546200132790859062002576565b905560405190815260008051602062004a7183398151915290828260203393a360a08501516040519384526001600160a01b031692602090a36040820151600581029080820460051490151715620017ea576103e89004602455604082015180800460011481151715620017ea5760649004602555604082015180600581020460051481151715620017ea57610fa0600591909102046026556101008201516020805462010000600160b01b031916601092831b62010000600160b01b03161780825560405163c45a015560e01b815286939092908390600490829085901c6001600160a01b03165afa9081156200175e576004928492620017c3575b506040516315ab88c960e31b815292602091849190829060101c6001600160a01b03165afa9182156200175e576020926044918591620017a1575b506040516364e329cb60e11b81526001600160a01b0391821660048201523060248201529485938492165af1908115620005af5784916200177d575b50602180546001600160a01b0319166001600160a01b03928316179055308452600660209081526040808620825460101c84166000908152925290819020600019905561010084015160e085015191519291821691166001600160401b03611022840190811190841117620017695761102262003a2f8439611022830190815260208101919091523060408201528190036060019084f09081156200175e57600180546001600160a01b0319166001600160a01b0393841617815530855260036020526040808620805460ff19908116841790915560225485168752818720805482168417905560215485168752818720805482168417905560a086810151861688528288208054831685179055610120870151861688528288208054831685179055610100870151909516875290862080549091169091179055610140830151620015e790620039bf565b61016083015160048054600180861b600019019384166001600160601b03871b9092169190911790915530808752600e60209081526040808920805460ff1990811686179091556022805487168b52828b208054831687179055848b52600f8452828b208054831687179055888a015187168b52828b2080548316871790556021805488168c52838c208054841688179055905487168b52828b20805483168717905561dead808c52838c2080548416881790558b8052838c20805484168817905590549096168a5260108352818a208054821686179055928952808920805484168517905593885283882080548316841790558780528388208054909216909217905560808086015160095583516014559183015160155590820151601655810151601755606081015160185501516019556200172462003750565b60c0810151602380546001600160a01b03199081166001600160a01b039384161790915561012090920151600d8054909316911617905580f35b6040513d85823e3d90fd5b634e487b7160e01b86526041600452602486fd5b6200179a915060203d6020116200054f576200053f81836200239e565b386200149b565b620017bc9150843d86116200054f576200053f81836200239e565b386200145f565b6020919250620017e290823d84116200054f576200053f81836200239e565b919062001424565b634e487b7160e01b84526011600452602484fd5b60405162461bcd60e51b815260206004820152600660248201526506c6f77206c760d41b6044820152606490fd5b01519050388062001282565b600c855260008051602062004a5183398151915290855b601f198416811062001898575060019394959683601f198116106200187e575b505050811b01600c5562001298565b015160001960f88460031b161c191690553880806200186f565b9091602060018192858b0151815501930191016200184f565b600c8552601f820160051c60008051602062004a51833981519152016020831062001909575b601f820160051c60008051602062004a51833981519152018110620018fd575062001266565b858155600101620018d7565b5060008051602062004a51833981519152620018d7565b634e487b7160e01b84526041600452602484fd5b01519050388062001222565b600b8452601f1982169560008051602062004a9183398151915291855b8881106200199d5750836001959697981062001983575b505050811b01600b5562001238565b015160001960f88460031b161c1916905538808062001974565b919260206001819286850151815501940192016200195d565b600b8452601f820160051c60008051602062004a91833981519152016020831062001a0e575b601f820160051c60008051602062004a9183398151915201811062001a02575062001204565b848155600101620019dc565b5060008051602062004a91833981519152620019dc565b634e487b7160e01b83526041600452602483fd5b5034620003c9576020366003190112620003c95762001a576200230b565b6022546001600160a01b03919062001a739083163314620024fa565b1680825260036020526040822060ff1990600182825416179055600f60205260408320600182825416179055600e602052600160408420918254161790556001600160601b0360a01b602254161760225580f35b5034620003c95780600319360112620003c95762001ae4620024a0565b308152600560205262001b3562001b2d604083205462001b2662001b1c62001b12601d54601c549062002576565b601f549062002576565b601e549062002576565b90620025cf565b33306200267f565b5080f35b5034620003c95780600319360112620003c957600d546040516001600160a01b039091168152602090f35b5034620003c95780600319360112620003c9576022546001600160a01b039062001b929082163314620024fa565b8060205460101c168252600e602052604082209060ff19916001838254161790558060205460101c168352600f6020526040832060018382541617905582541682526001604083209182541617905560235460ff60a01b19600d5416600d55600160b01b9061ffff60a81b19161760235580f35b5034620003c95780600319360112620003c957602060ff60235460a81c166040519015158152f35b5034620003c9576020366003190112620003c95760043562001c5c60018060a01b03600d54163314620025fe565b8060095560115481603c0291603c83040362001c91579062001c7e9162002576565b600855600160ff19600a541617600a5580f35b634e487b7160e01b83526011600452602483fd5b5034620003c95780600319360112620003c9576020601354604051908152f35b5034620003c95780600319360112620003c957602060ff600d5460a01c166040519015158152f35b5034620003c9576020366003190112620003c95760209060ff906040906001600160a01b0362001d1c6200230b565b168152601084522054166040519015158152f35b5034620003c9576020366003190112620003c95760209060ff906040906001600160a01b0362001d5f6200230b565b168152600e84522054166040519015158152f35b5034620003c9576040366003190112620003c95762001d916200236a565b62001d9b620024a0565b6023805460ff60a81b191691151560a81b60ff60a81b1691909117905560243560265580f35b5034620003c9576040366003190112620003c95762000ba690604062001de66200230b565b9133815260066020522060018060a01b03821660005260205262001e1260243560406000205462002576565b903362002d2d565b5034620003c95780600319360112620003c9576020601254604051908152f35b5034620003c95780600319360112620003c957602060405160098152f35b5034620003c9578062001e6b3662002353565b62001e78929192620024a0565b6001546001600160a01b031692833b15620007ed576044908360405195869485936316a4744b60e11b8552600485015260248401525af18015620008aa5762001ebf575080f35b62000427906200238a565b5034620003c95780600319360112620003c95762001f12602091604062001f0160075461dead8452600586528284205490620025cf565b9180805260058552205490620025cf565b604051908152f35b5034620003c95780600319360112620003c95762001f4460018060a01b03602254163314620024fa565b60115462001f82574260115560095480603c0290603c82040362001f6e5762001c7e904262002576565b634e487b7160e01b82526011600452602482fd5b60405162461bcd60e51b815260206004820152601060248201526f185b1c9958591e481b185d5b98da195960821b6044820152606490fd5b5034620003c9576060366003190112620003c95762001fd86200230b565b9062001fe362002327565b60406044359260018060a01b0385168152600660205281812033825260205220549260001984036200201c575b62000b1693506200267f565b8284106200203d57620020378362000b169503338362002d2d565b62002010565b60405162461bcd60e51b8152602060048201526016602482015275496e73756666696369656e7420616c6c6f77616e636560501b6044820152606490fd5b5034620003c9576020366003190112620003c9576004356001600160a01b03811690819003620007f157620020af620024a0565b6001600160601b0360a01b602354161760235580f35b5034620003c95780600319360112620003c9576020601a54604051908152f35b5034620003c95780600319360112620003c9576020600754604051908152f35b5034620003c9576020366003190112620003c95762002123620024a0565b60043560025580f35b5034620003c95780600319360112620003c95760015460405163125f9e3360e01b8152906001600160a01b03906020908390600490829085165afa9182156200175e576020939262002183575b5060405191168152f35b6200219f919250833d81116200054f576200053f81836200239e565b903862002179565b5034620003c95780600319360112620003c9576004546040516001600160a01b039091168152602090f35b5034620003c9576040366003190112620003c95762000ba6620021f46200230b565b602435903362002d2d565b5034620003c95780600319360112620003c9576040519080600b54620022258162002539565b8085529160019180831690811562000d065750600114620022535762000cb38562000ca6818703826200239e565b9250600b835260008051602062004a918339815191525b8284106200228957505050810160200162000ca68262000cb362000c93565b805460208587018101919091529093019281016200226a565b905034620007f15781600319360112620007f1576020906026548152f35b6020808252825181830181905290939260005b828110620022f657505060409293506000838284010152601f8019910116010190565b818101860151848201604001528501620022d3565b600435906001600160a01b03821682036200232257565b600080fd5b602435906001600160a01b03821682036200232257565b35906001600160a01b03821682036200232257565b604090600319011262002322576004359060243590565b6004359081151582036200232257565b6024359081151582036200232257565b6001600160401b038111620007d757604052565b90601f801991011681019081106001600160401b03821117620007d757604052565b6001600160401b038111620007d757601f01601f191660200190565b81601f820112156200232257803590620023f682620023c0565b926200240660405194856200239e565b828452602083830101116200232257816000926020809301838601378301015290565b9080601f8301121562002322578135906001600160401b038211620007d7578160051b6040519360209362002461858401876200239e565b8552838086019282010192831162002322578301905b82821062002486575050505090565b83809162002494846200233e565b81520191019062002477565b6000546001600160a01b03163303620024b557565b60405162461bcd60e51b815260206004820152601760248201527f63616c6c6572206973206e6f7420746865206f776e65720000000000000000006044820152606490fd5b156200250257565b60405162461bcd60e51b815260206004820152600f60248201526e6e6f742074686520666163746f727960881b6044820152606490fd5b90600182811c921680156200256b575b60208310146200255557565b634e487b7160e01b600052602260045260246000fd5b91607f169162002549565b919082018092116200258457565b634e487b7160e01b600052601160045260246000fd5b818102929181159184041417156200258457565b8115620025b9570490565b634e487b7160e01b600052601260045260246000fd5b919082039182116200258457565b908160209103126200232257516001600160a01b0381168103620023225790565b156200260657565b60405162461bcd60e51b81526020600482015260126024820152713737ba103a343290383937b7b320b236b4b760711b6044820152606490fd5b156200264857565b60405162461bcd60e51b815260206004820152600f60248201526e139bdd081dda1a5d195b1a5cdd1959608a1b6044820152606490fd5b6023805460009460ff9492909160b01c85161562002cfd57600a5485811662002c1d575b50602092858454818116158062002c11575b62002ba0575b50825460a01c1662002b2e576021549697966001600160a01b0380831697918116968a9391928989148062002b1f575b62002aa4575b898552600f88526040958787838189205416158062002a95575b62002a3b575b5050848316998a14158062002a2c575b8062002a1e575b80620029f9575b620029d0575b508885526005918289526200274e8888882054620025cf565b8a8752838a5287872055878560215416808c14908115620029c5575b506200297e575b508a865282895262002787888888205462002576565b8b8752838a52878720558986526010895281878720541615620028e1575b50898552601088528585205416156200284f575b50506001541660025490803b15620007ed57602483928551948593849263ffb2c47960e01b845260048401525af1908162002833575b509660008051602062004a7183398151915294959697156000146200282c578060008051602062004ab183398151915291a15b51908152a3600190565b5062002822565b6200283f89916200238a565b6200284b5738620027ef565b8780fd5b82600154169087528484205491813b15620008d1578551630a5b654b60e11b81526001600160a01b039190911660048201526024810192909252839081908390604490829084905af19182620028c9575b5050620028c35760008051602062004ab18339815191528280a15b3880620027b9565b620028bb565b620028d4906200238a565b620007ed578238620028a0565b90919293948560015416848a528782205490803b15620007ed578851630a5b654b60e11b81526001600160a01b0394909416600485015260248401919091528290604490829084905af1908162002960575b508b94939291906200295a5760008051602062004ab18339815191528580a15b38620027a5565b62002953565b62002972909c91959493929c6200238a565b9a909192933862002933565b909750600e89528187872054161580620029b4575b15620029ae57620029a690848962002e1a565b963862002771565b620029a6565b508a86528187872054161562002993565b90508c14386200276a565b805460ff60a01b19908116600160a01b178255620029ed62002fb9565b81541690553862002735565b5062002a1362001b1c62001b12601d54601c549062002576565b60265411156200272f565b5081815460a81c1662002728565b5081815460a01c161562002721565b62002a5192939495969760058c52205462002576565b6025541062002a6857908b94939291878762002711565b855162461bcd60e51b81526004810189905260066024820152651dd85b1b195d60d21b6044820152606490fd5b5083600d5460a01c166200270b565b9091929350602454861180159062002af6575b1562002ac857908a939291620026f1565b60405162461bcd60e51b815260048101889052600660248201526509ac2f040a8b60d31b6044820152606490fd5b508382168b52600f87528060408c205416801562002ab75750888b528060408c20541662002ab7565b5080600d5460a01c16620026eb565b6001600160a01b0394851680885260058552604088205490965060008051602062004a7183398151915295925062002b68908490620025cf565b8688526005855260408820551694858152604062002b8a838284205462002576565b91878152600585522055604051908152a3600190565b60081c1662002bee5760115462015180810180911162002bda57421162002bca575b8538620026bb565b62002bd462003750565b62002bc2565b634e487b7160e01b88526011600452602488fd5b6011546228de80810180911162002bda5742111562002bc25762002bd462003750565b506011541515620026b5565b600854421062002c365760ff1916600a555b38620026a3565b506021546001600160a01b039085821690821681810362002c7357505083168652600360205262002c6d8560408820541662002640565b62002c2f565b9091851690810362002c9857508652600360205262002c6d8560408820541662002640565b908752600360205285604088205416908162002cec575b5062002c6d5760405162461bcd60e51b815260206004820152600f60248201526e139bdd0815da1a5d195b1a5cdd1959608a1b6044820152606490fd5b875250604086205485163862002caf565b60405162461bcd60e51b81526020600482015260086024820152672174726164696e6760c01b6044820152606490fd5b6001600160a01b0390811691821562002dd5571691821562002d905760207f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925918360005260068252604060002085600052825280604060002055604051908152a3565b60405162461bcd60e51b815260206004820152601b60248201527f417070726f766520746f20746865207a65726f206164647265737300000000006044820152606490fd5b60405162461bcd60e51b815260206004820152601d60248201527f417070726f76652066726f6d20746865207a65726f20616464726573730000006044820152606490fd5b6021546001600160a01b039283169083160362002f6b57601b54916018549260195460135490601754915b831562002f61578380928162002e5c818c6200259a565b606490049962002e6d908b6200259a565b9062002e7991620025ae565b601c549062002e889162002576565b601c5562002e9790896200259a565b9062002ea391620025ae565b601d549062002eb29162002576565b601d5562002ec190876200259a565b9062002ecd91620025ae565b601e549062002edc9162002576565b601e5562002eeb90856200259a565b9062002ef791620025ae565b601f549062002f069162002576565b601f55306000526005602052826040600020549062002f259162002576565b3060005260056020526040600020556040519083825230921690602060008051602062004a7183398151915291a362002f5e91620025cf565b90565b5050505050505090565b601a549160155492601654601254906014549162002e45565b3d1562002fb4573d9062002f9882620023c0565b9162002fa860405193846200239e565b82523d6000602084013e565b606090565b602654600090601c54601d5491601e54601f5462002fe88162002fe28462002fe2898962002576565b62002576565b93620030008562002ffa83876200259a565b620025ae565b90620030108260011c86620025cf565b15620035f957604051606081018181106001600160401b03821117620035e557604052600281526040366020830137805115620035d15730602082015260018060a01b0360205460101c166040516315ab88c960e31b8152602081600481855afa908115620035c6578b91620035a2575b508251600110156200358e576001600160a01b03166040830152620030ab600185901c88620025cf565b91813b156200358a57918a9160405193849263791ac94760e01b845260a4840190600485015284602485015260a060448501528151809152602060c48501920190855b81811062003564575050508383809230606483015242608483015203925af1801562003543576200354e575b50878260011c62003473575b9182620031466200313f6200315c958460011c620025cf565b83620025cf565b8310156200344e575050875b601c5585620025cf565b156200344657859347916200318e6200317688856200259a565b620031878362002fe2888c62002576565b90620025ae565b94620031b06200319f86866200259a565b620031878462002fe2898d62002576565b94620031c886620031c28988620025cf565b620025cf565b98620031da8562002ffa83866200259a565b8110156200342a5750875b601d55620031f98462002ffa83856200259a565b8110156200340e5750865b601e55620032188362002ffa84846200259a565b821015620033f357505050835b601f556200329d575b50506001546001600160a01b03169050803b15620007ed57828091600460405180958193630d0e30db60e41b83525af1918262003285575b505062003282578060008051602062004ab183398151915291a1565b50565b62003290906200238a565b620007f157813862003266565b80620032e1575b5080620032b3575b806200322e565b602354829182918291906001600160a01b03165af1620032d262002f84565b5015620007f1578138620032ac565b90915060011c6004602060018060a01b036022541660405192838092633690e28760e01b82525afa908115620033c457858084819482948391620033cf575b506001600160a01b03165af16200333662002f84565b5015620005a35760225460405163d7e7a9e760e01b815290602090829060049082906001600160a01b03165afa908115620033c457858093819382938391620033a0575b506001600160a01b03165af16200339062002f84565b5015620007ed57829038620032a4565b620033bd915060203d6020116200054f576200053f81836200239e565b386200337a565b6040513d87823e3d90fd5b620033ec915060203d6020116200054f576200053f81836200239e565b3862003320565b620034089262002ffa8362001b26936200259a565b62003225565b8062001b268562002ffa6200342494866200259a565b62003204565b8062001b268662002ffa6200344094876200259a565b620031e5565b505050505050565b8162001b2662003466926200346d9460011c620025cf565b82620025cf565b62003152565b5060205460101c6001600160a01b0316916060620034a96200349a600184901c476200259a565b620031878460011c8b620025cf565b9360c48b604051968793849263f305d71960e01b84523060048501528760011c6024850152806044850152606484015261dead60848401524260a48401525af180156200354357899062003501575b90925062003126565b5090916060813d82116200353a575b816200351f606093836200239e565b810103126200353657906200315c929151620034f8565b8880fd5b3d915062003510565b6040513d8b823e3d90fd5b6200355c909891986200238a565b96386200311a565b82516001600160a01b031684528f965087955060209384019390920191600101620030ee565b8a80fd5b634e487b7160e01b8b52603260045260248bfd5b620035bf915060203d6020116200054f576200053f81836200239e565b3862003081565b6040513d8d823e3d90fd5b634e487b7160e01b89526032600452602489fd5b634e487b7160e01b8a52604160045260248afd5b5050505050505050565b60115415620036ab576007546005810281159082810460051482171562002584576103e8900483106200367b57600382029182046003141715620025845760649004106200364d57565b60405162461bcd60e51b81526020600482015260066024820152654d617820332560d01b6044820152606490fd5b60405162461bcd60e51b81526020600482015260086024820152674d696e20302e352560c01b6044820152606490fd5b60405162461bcd60e51b8152602060048201526009602482015268085b185d5b98da195960ba1b6044820152606490fd5b15620036e457565b60405162461bcd60e51b8152602060048201526008602482015267686967682066656560c01b6044820152606490fd5b156200371c57565b60405162461bcd60e51b815260206004820152600c60248201526b68696768204b59432066656560a01b6044820152606490fd5b60165460155460145490601954916018549060175492602095865460ff81161580620039b3575b620038d0575b5092620037c2620037b88462002fe28588620037ac620037ee9b9962002fe262002fe29a620037e49d62002576565b15620038c55762002576565b6012549062002576565b9586601a55620037d88462002fe2848462002576565b15620038ba5762002576565b6013549062002576565b9182601b5560018060a01b03806022541682600092835416602460405180948193633af32abf60e01b835260048301525afa928315620008aa57829362003878575b5050506000146200385b57620038599162003851600c601193111562003714565b111562003714565b565b620038599162003870600780931115620036dc565b1115620036dc565b9080929350813d8311620038b2575b6200389381836200239e565b81010312620007f15751908115158203620003c9575038808062003830565b503d62003887565b600060135562002576565b600060125562002576565b909492939060081c60ff166200395057601154916201518083018093116200258457620037b8620037e49562002fe2620037c293620037ee9962002fe29742116000146200394057600160128190556013558c5461ff001916610100178d555b959850955050949650506200377d565b6002601255600260135562003930565b601154916228de8083018093116200258457620037b8620037e49562002fe2620037c293620037ee9962002fe2974211600014620039a357600060128190556013558c5460ff19166001178d5562003930565b6001601255600160135562003930565b50601154151562003777565b80519060005b828110620039d257505050565b815181101562003a18576003602060018060a01b03818460051b8601015116600052526040600020600160ff1982541617905560001981146200258457600101620039c5565b634e487b7160e01b600052603260045260246000fdfe608060409080825234620001df57606081620010228038038091620000258285620001e4565b833981010312620001df576200003b816200021e565b6020906200005884620000508486016200021e565b94016200021e565b6ec097ce7bc90715b34b9f1000000000600b55610708600c55670de0b6b3a7640000600d55600180546001600160a01b03199081166001600160a01b03948516179091556002805482169584169590951790945560008054909416918116919091178355835163313ce56760e01b838201908152600482526001600160401b03929180870184811182821017620001cb5787525185928392905afa3d15620001c1573d918211620001ad578451916200011b601f8201601f1916850184620001e4565b82523d848484013e5b156200017f5781818051810103126200017b5701519060ff82168092036200017857604d8211620001645750600a0a600d5551610dee9081620002348239f35b634e487b7160e01b81526011600452602490fd5b80fd5b8280fd5b835162461bcd60e51b81526004810183905260076024820152661a5b9d985b1a5960ca1b6044820152606490fd5b634e487b7160e01b84526041600452602484fd5b6060915062000124565b634e487b7160e01b87526041600452602487fd5b600080fd5b601f909101601f19168101906001600160401b038211908210176200020857604052565b634e487b7160e01b600052604160045260246000fd5b51906001600160a01b0382168203620001df5756fe608060408181526004918236101561001657600080fd5b600092833560e01c91826311ce023d146109d757508163125f9e331461018957816314b6ca96146107aa57816328fd31981461077d5781632d48e8961461074d5781633a98ef391461072e5781634fab0ae81461070f57816351171961146106e457816366817df5146106ac5781638477d9f314610613578163997664d7146105f4578163ce7c2ac2146105b2578163d0e30db014610298578163d4fda1f214610262578163e2d2e21914610243578163efca2eed14610224578163f0fc6bca146101b2578163f1e9f1e514610189578163f82107691461015e578163ffb2c4791461012d575063ffd49c841461010c57600080fd5b34610129578160031936011261012957602090600c549051908152f35b5080fd5b8390346101295760203660031901126101295781546001600160a01b031633036101295761015b9035610b6e565b80f35b8390346101295760203660031901126101295781546001600160a01b031633036101295735600c5580f35b50503461012957816003193601126101295760025490516001600160a01b039091168152602090f35b919050346102205782600319360112610220576101ce33610c3c565b156101dd578261015b33610c80565b906020606492519162461bcd60e51b8352820152601760248201527f546f6f20736f6f6e2e204e65656420746f2077616974210000000000000000006044820152fd5b8280fd5b5050346101295781600319360112610129576020906009549051908152f35b505034610129578160031936011261012957602090600a549051908152f35b9050346102205760203660031901126102205760209282916001600160a01b0361028a6109f3565b168252845220549051908152f35b919050826003193601126102205782546001600160a01b039190821633036105ae578160025416908051916370a0823160e01b9384845230868501526020918285602481845afa9485156105a4578895610571575b508351906060820182811067ffffffffffffffff82111761055e5785526002825284368584013782600154169085516315ab88c960e31b815285818b81865afa908115610554578b9161051a575b508461034685610ac2565b9116905261035383610ae5565b52888361035f84610ac2565b51168461036b85610ae5565b51160361049657505061037e8291610ac2565b51169087823b15610493578088938651998a8092630d0e30db60e41b825234905af197881561048757849596979861046a575b50506024905b600254169685519788938492835230908301525afa9182156104615750849161042c575b506103e69250610a92565b6103f281600854610ab5565b6008556007549081610402578280f35b61041d61042392610418600a5493600b54610af5565b610b08565b90610ab5565b600a5538808280f35b905082813d831161045a575b6104428183610a70565b81010312610455576103e69151386103db565b600080fd5b503d610438565b513d86823e3d90fd5b61047691929450610a46565b61048357829187386103b1565b8680fd5b508451903d90823e3d90fd5b80fd5b9091829894959697983b15610129576104d0928751808095819463b6f9de9560e01b8352868a840152608060248401526084830190610a09565b306044830152426064830152039134905af18015610510576104f8575b5090602483926103b7565b83929197610507602492610a46565b979192506104ed565b85513d8a823e3d90fd5b90508581813d831161054d575b6105318183610a70565b8101031261054957518481168103610549573861033b565b8a80fd5b503d610527565b87513d8d823e3d90fd5b634e487b7160e01b8a526041895260248afd5b9094508281813d831161059d575b6105898183610a70565b81010312610599575193386102ed565b8780fd5b503d61057f565b84513d8a823e3d90fd5b8380fd5b505034610129576020366003190112610129579081906001600160a01b036105d86109f3565b1681526006602052206001815491015482519182526020820152f35b5050346101295781600319360112610129576020906008549051908152f35b50503461012957816003193601126101295780519081809360035490818552602080950191600382527fc2575a0e9e593c00f959f8c92f12db2869c3395a3b0502d05e2516446f71f85b915b8682821061068c5785906106888861067984890385610a70565b51928284938452830190610a09565b0390f35b83546001600160a01b03168552889550909301926001928301920161065f565b5050346101295760203660031901126101295760209181906001600160a01b036106d46109f3565b1681526005845220549051908152f35b8390346101295760203660031901126101295781546001600160a01b031633036101295735600d5580f35b505034610129578160031936011261012957602090600d549051908152f35b5050346101295781600319360112610129576020906007549051908152f35b91905034610220573660031901126101295781546001600160a01b031633036101295735600c55602435600d5580f35b505034610129576020366003190112610129576020906107a361079e6109f3565b610d69565b9051908152f35b919050346102205780600319360112610220576107c56109f3565b8354602435926001600160a01b039291831633036109d3578282169485875260066020528187209586549485158015806109c5575b881591821590816109bd575b50156108b657505050600354928391895282602052882055680100000000000000008210156108a35750926108858161088061089d95610878610894966108548a6001809c01600355610b28565b90919082549060031b9160018060a01b039283811b93849216901b16911916179055565b600754610a92565b610ab5565b600755808555600a5490610af5565b600b5490610b08565b91015580f35b634e487b7160e01b875260419052602486fd5b91955091929190816109b5575b506108e3575b505050506108948261088560019461088061089d95610878565b600392835492600019938481019081116109a2578661090461091e92610b28565b905490881b1c16828c5284602052610854848d2054610b28565b895281602052808920549084548481019081116109a25761093f8791610b28565b905490871b1c168a5282602052892055825490811561098f57509461088061089d956108949583956108859560019a019161097983610b28565b9091825491841b1b1916905555955050946108c9565b634e487b7160e01b895260319052602488fd5b634e487b7160e01b8b526011845260248bfd5b9050386108c3565b905038610806565b6109ce87610c80565b6107fa565b8580fd5b849034610129578160031936011261012957602090600b548152f35b600435906001600160a01b038216820361045557565b90815180825260208080930193019160005b828110610a29575050505090565b83516001600160a01b031685529381019392810192600101610a1b565b67ffffffffffffffff8111610a5a57604052565b634e487b7160e01b600052604160045260246000fd5b90601f8019910116810190811067ffffffffffffffff821117610a5a57604052565b91908203918211610a9f57565b634e487b7160e01b600052601160045260246000fd5b91908201809211610a9f57565b805115610acf5760200190565b634e487b7160e01b600052603260045260246000fd5b805160011015610acf5760400190565b81810292918115918404141715610a9f57565b8115610b12570490565b634e487b7160e01b600052601260045260246000fd5b600354811015610acf5760036000527fc2575a0e9e593c00f959f8c92f12db2869c3395a3b0502d05e2516446f71f85b0190600090565b6000198114610a9f5760010190565b906003908154908115610c365792916000908180955a5b86881080610c2d575b15610c2357610be1610bda610bf592600e9a898c541015610c1b575b8b54610bce610bb882610b28565b90546001600160a01b0392918c1b1c8216610c3c565b610bfc575b5050610ab5565b5a90610a92565b945a98610bee8154610b5f565b9055610b5f565b9396610b85565b610c08610c1492610b28565b9054908b1b1c16610c80565b3880610bd3565b868c55610baa565b5095505050505050565b50858510610b8e565b92505050565b6001600160a01b038116600090815260056020526040902054600c54610c6191610ab5565b4210159081610c6e575090565b610c789150610d69565b600d54111590565b60018060a01b039081811690600092828452602091600683526040852090815415610cb557610cae90610d69565b9081610cbd575b505050505050565b8392604491610cce84600954610ab5565b600955868852600585524260408920556001610cf16108948354600a5490610af5565b910155600254169486604051968794859363a9059cbb60e01b8552600485015260248401525af18015610d5e57610d2b575b808080610cb5565b81813d8311610d57575b610d3f8183610a70565b81010312610129575180151503610493578080610d23565b503d610d35565b6040513d85823e3d90fd5b6001600160a01b0316600090815260066020526040902080548015610db157610d9a610894600192600a5490610af5565b91015480821115610db157610dae91610a92565b90565b505060009056fea2646970667358221220ddaa082a3bd187e0a7b02a8bf23ad3421782d8bbc0b2c7af395dc025b2e3e24064736f6c63430008110033df6966c971051c3d54ec59162606531493a51404a002842f56009d7e5cf4a8c7ddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef0175b7a638427703f0dbe7bb9bbf987a2551717b34e79f33b5b1008d1fa01db9d491e240ecd34d50a8e73bc9d6e4edd4580d0daf50f4cea2ae5d0a527615281ca2646970667358221220f804dd19086415858621c0307228dbdcebf2aafb6234707076c84113eec7960664736f6c63430008110033

Deployed Bytecode

0x60808060405260043610156200001f575b5036156200001d57600080fd5b005b600090813560e01c9081630445b66714620022a25750806306fdde0314620021ff578063095ea7b314620021d25780630ab16c1914620021a7578063125f9e33146200212c57806316d9962b146200210557806318160ddd14620020e55780631df4ccfc14620020c55780631f53ac02146200207b57806323b872dd1462001fba57806327193bc41462001f1a5780632b112e491462001eca5780632d48e8961462001e58578063313ce5671462001e3a57806336e4ec641462001e1a578063395093511462001dc15780633af32abf146200095c5780633dab52691462001d735780633f4218e01462001d305780634355855a1462001ced57806344de2e4c1462001cc5578063461e5d3f1462001ca5578063497a000a1462001c2e5780634a74bb021462001c06578063546a88111462001b6457806359a51c341462001b395780635fef86801462001ac757806364d817fa1462001a39578063653598921462000fe75780636827e7641462000fc7578063704ce43e1462000fa757806370a082311462000f6a57806370c757ec1462000f45578063715018a61462000ee75780637c0ff2051462000ec75780637d1db4a51462000ea75780637db1342c1462000e75578063807c2d9c1462000e55578063838420131462000e3157806383ad79941462000e1157806388cda8731462000dea5780638b42507f1462000da75780638da5cb5b1462000d7e5780638ea5220f1462000d535780639502c4261462000d3357806395d89b411462000c51578063a3a2e89e1462000bf6578063a457c2d71462000b4d578063a8aa1b311462000b22578063a9059cbb1462000ae9578063b48e665e1462000ac9578063bad3ea6a1462000a9e578063bf56b3711462000a7e578063c45a01551462000a53578063ca987b0e1462000a33578063cb29813c14620009e7578063cc6badb314620009c7578063d4fb9a01146200099f578063d741b9c3146200095c578063d920334e146200092a578063dd62ed3e14620008d5578063e4cbd6b314620007f5578063e572967b1462000746578063e66b1d1e14620006fe578063ebdfd72214620006de578063f16fd78d1462000678578063f2fde38b14620005ba578063f576f5391462000457578063f887ea40146200042a578063fabe628314620003cc5763fbd7575303620000105734620003c95780600319360112620003c957620003a560018060a01b03602254163314620024fa565b6023805460ff60b01b19811660b091821c60ff161590911b60ff60b01b1617905580f35b80fd5b5034620003c9576040366003190112620003c95762000427620003ee6200230b565b620003f86200237a565b9062000403620024a0565b60018060a01b03168352600f602052604083209060ff801983541691151516179055565b80f35b5034620003c95780600319360112620003c9576020805460405160109190911c6001600160a01b03168152f35b5034620003c95780600319360112620003c9576022546001600160a01b0390620004859082163314620024fa565b806004541660405180916318160ddd60e01b825281600460209384935afa918215620005af57849262000576575b506001928383018093116200056257835b838110620004d0578580f35b602490838360045416604051938480926331a9108f60e11b82528560048301525afa918215620005575786928491899162000523575b501687526003845260408720805460ff19168317905501620004c4565b620005489150863d88116200054f575b6200053f81836200239e565b810190620025dd565b3862000506565b503d62000533565b6040513d89823e3d90fd5b634e487b7160e01b85526011600452602485fd5b9080925081813d8311620005a7575b6200059181836200239e565b81010312620005a357519038620004b3565b8380fd5b503d62000585565b6040513d86823e3d90fd5b5034620003c9576020366003190112620003c957620005d86200230b565b620005e2620024a0565b6001600160a01b039081169081156200063357600054826001600160601b0360a01b821617600055167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0600080a380f35b60405162461bcd60e51b815260206004820152601d60248201527f6e6577206f776e657220697320746865207a65726f20616464726573730000006044820152606490fd5b5034620003c9576020366003190112620003c957620006966200230b565b600d54906001600160a01b0390620006b28284163314620025fe565b1680916001600160601b0360a01b1617600d558152600360205260408120600160ff1982541617905580f35b5034620003c95780600319360112620003c9576020600854604051908152f35b5034620003c9576020366003190112620003c9576200071c6200236a565b62000726620024a0565b600d805460ff60a01b191691151560a01b60ff60a01b1691909117905580f35b5034620003c957600319602036820112620007f157600435906001600160401b0390818311620005a3576020908336030112620007ed57604051906020820182811082821117620007d7576040528260040135908111620005a35762000427926004620007b7923692010162002429565b8152620007d060018060a01b03602254163314620024fa565b51620039bf565b634e487b7160e01b600052604160045260246000fd5b8280fd5b5080fd5b5034620003c95780620008083662002353565b9062000813620024a0565b6001546001600160a01b039190821690813b15620008d157849160248392604051948593849263f821076960e01b845260048401525af1908115620005af578491620008b9575b50506001541690813b15620008b5578291602483926040519485938492635117196160e01b845260048401525af18015620008aa57620008975750f35b620008a2906200238a565b620003c95780f35b6040513d84823e3d90fd5b5050fd5b620008c4906200238a565b620008b55782386200085a565b8480fd5b5034620003c9576040366003190112620003c957620008f36200230b565b6040620008ff62002327565b9260018060a01b03809316815260066020522091166000526020526020604060002054604051908152f35b5034620003c9576020366003190112620003c9576004356200094b620024a0565b620009568162003603565b60245580f35b5034620003c9576020366003190112620003c95760209060ff906040906001600160a01b036200098b6200230b565b168152600384522054166040519015158152f35b5034620003c95780600319360112620003c957602060ff60235460b01c166040519015158152f35b5034620003c95780600319360112620003c9576020601754604051908152f35b5034620003c95760c0366003190112620003c95762000a05620024a0565b60043560145560443560155560843560165560243560175560643560185560a4356019556200042762003750565b5034620003c95780600319360112620003c9576020601b54604051908152f35b5034620003c95780600319360112620003c9576022546040516001600160a01b039091168152602090f35b5034620003c95780600319360112620003c9576020601154604051908152f35b5034620003c95780600319360112620003c9576001546040516001600160a01b039091168152602090f35b5034620003c95780600319360112620003c9576020600954604051908152f35b5034620003c9576040366003190112620003c95762000b1662000b0b6200230b565b60243590336200267f565b50602060405160018152f35b5034620003c95780600319360112620003c9576021546040516001600160a01b039091168152602090f35b5034620003c9576040366003190112620003c95762000b6b6200230b565b60406024359233815260066020522060018060a01b0382166000526020526040600020549180831062000bb15762000ba69203903362002d2d565b602060405160018152f35b60405162461bcd60e51b815260206004820152601e60248201527f44656372656173656420616c6c6f77616e63652062656c6f77207a65726f00006044820152606490fd5b5034620003c9576040366003190112620003c9576200042762000c186200230b565b62000c226200237a565b9062000c2d620024a0565b60018060a01b03168352600e602052604083209060ff801983541691151516179055565b5034620003c95780600319360112620003c9576040519080600c5462000c778162002539565b8085529160019180831690811562000d06575060011462000cb7575b62000cb38562000ca6818703826200239e565b60405191829182620022c0565b0390f35b9250600c835260008051602062004a518339815191525b82841062000ced57505050810160200162000ca68262000cb362000c93565b8054602085870181019190915290930192810162000cce565b86955062000cb39693506020925062000ca694915060ff191682840152151560051b820101929362000c93565b5034620003c95780600319360112620003c9576020601954604051908152f35b5034620003c95780600319360112620003c9576023546040516001600160a01b039091168152602090f35b5034620003c95780600319360112620003c957546040516001600160a01b039091168152602090f35b5034620003c9576020366003190112620003c95760209060ff906040906001600160a01b0362000dd66200230b565b168152600f84522054166040519015158152f35b5034620003c95780600319360112620003c957602060ff815460081c166040519015158152f35b5034620003c95780600319360112620003c9576020601454604051908152f35b5034620003c95780600319360112620003c957602060ff8154166040519015158152f35b5034620003c95780600319360112620003c9576020602554604051908152f35b5034620003c9576020366003190112620003c95760043562000e96620024a0565b62000ea18162003603565b60255580f35b5034620003c95780600319360112620003c9576020602454604051908152f35b5034620003c95780600319360112620003c9576020601854604051908152f35b5034620003c95780600319360112620003c95762000f04620024a0565b600080546001600160a01b0319811682556001600160a01b03167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e08280a380f35b5034620003c95780600319360112620003c957602060ff600a54166040519015158152f35b5034620003c9576020366003190112620003c9576020906040906001600160a01b0362000f966200230b565b168152600583522054604051908152f35b5034620003c95780600319360112620003c9576020601554604051908152f35b5034620003c95780600319360112620003c9576020601654604051908152f35b5034620003c9576003199060e036830112620003c9576001600160401b0360043511620003c957610180809260043536030112620003c9576040519182018281106001600160401b03821117620007d757604052600435600401356001600160401b038111620007f15762001064906004369181350101620023dc565b8252602460043501356001600160401b038111620007f1576200108f906004369181350101620023dc565b6020830152600435604481013560408401526064810135606084015260848101356080840152620010c39060a4016200233e565b60a0830152620010d860c4600435016200233e565b60c0830152620010ed60e4600435016200233e565b60e083015262001103610104600435016200233e565b6101008301526200111a610124600435016200233e565b6101208301526001600160401b03610144600435013511620003c9576200114d3660048035610144810135010162002429565b61014083015262001164610164600435016200233e565b61016083015260c0366023190112620003c9576040519060c082018281106001600160401b03821117620007d757604052602435825260443560208301526064356040830152608435606083015260a435608083015260c43560a0830152620011d960018060a01b03602254163314620024fa565b82519283516001600160401b03811162001a2557620011fa600b5462002539565b601f8111620019b6575b50602094601f82116001146200194057948394958293949262001934575b50508160011b916000199060031b1c191617600b555b60208101519283516001600160401b03811162001920576200125c600c5462002539565b601f8111620018b1575b506020601f82116001146200183857849582939495926200182c575b50508160011b916000199060031b1c191617600c555b620012aa604083015160075462002576565b6007556046606083015110620017fe576064620012d160408401516060850151906200259a565b0483620012e3826040860151620025cf565b91338252600560205260408220620012fd82825462002576565b905560a08501516001600160a01b0316825260056020526040822080546200132790859062002576565b905560405190815260008051602062004a7183398151915290828260203393a360a08501516040519384526001600160a01b031692602090a36040820151600581029080820460051490151715620017ea576103e89004602455604082015180800460011481151715620017ea5760649004602555604082015180600581020460051481151715620017ea57610fa0600591909102046026556101008201516020805462010000600160b01b031916601092831b62010000600160b01b03161780825560405163c45a015560e01b815286939092908390600490829085901c6001600160a01b03165afa9081156200175e576004928492620017c3575b506040516315ab88c960e31b815292602091849190829060101c6001600160a01b03165afa9182156200175e576020926044918591620017a1575b506040516364e329cb60e11b81526001600160a01b0391821660048201523060248201529485938492165af1908115620005af5784916200177d575b50602180546001600160a01b0319166001600160a01b03928316179055308452600660209081526040808620825460101c84166000908152925290819020600019905561010084015160e085015191519291821691166001600160401b03611022840190811190841117620017695761102262003a2f8439611022830190815260208101919091523060408201528190036060019084f09081156200175e57600180546001600160a01b0319166001600160a01b0393841617815530855260036020526040808620805460ff19908116841790915560225485168752818720805482168417905560215485168752818720805482168417905560a086810151861688528288208054831685179055610120870151861688528288208054831685179055610100870151909516875290862080549091169091179055610140830151620015e790620039bf565b61016083015160048054600180861b600019019384166001600160601b03871b9092169190911790915530808752600e60209081526040808920805460ff1990811686179091556022805487168b52828b208054831687179055848b52600f8452828b208054831687179055888a015187168b52828b2080548316871790556021805488168c52838c208054841688179055905487168b52828b20805483168717905561dead808c52838c2080548416881790558b8052838c20805484168817905590549096168a5260108352818a208054821686179055928952808920805484168517905593885283882080548316841790558780528388208054909216909217905560808086015160095583516014559183015160155590820151601655810151601755606081015160185501516019556200172462003750565b60c0810151602380546001600160a01b03199081166001600160a01b039384161790915561012090920151600d8054909316911617905580f35b6040513d85823e3d90fd5b634e487b7160e01b86526041600452602486fd5b6200179a915060203d6020116200054f576200053f81836200239e565b386200149b565b620017bc9150843d86116200054f576200053f81836200239e565b386200145f565b6020919250620017e290823d84116200054f576200053f81836200239e565b919062001424565b634e487b7160e01b84526011600452602484fd5b60405162461bcd60e51b815260206004820152600660248201526506c6f77206c760d41b6044820152606490fd5b01519050388062001282565b600c855260008051602062004a5183398151915290855b601f198416811062001898575060019394959683601f198116106200187e575b505050811b01600c5562001298565b015160001960f88460031b161c191690553880806200186f565b9091602060018192858b0151815501930191016200184f565b600c8552601f820160051c60008051602062004a51833981519152016020831062001909575b601f820160051c60008051602062004a51833981519152018110620018fd575062001266565b858155600101620018d7565b5060008051602062004a51833981519152620018d7565b634e487b7160e01b84526041600452602484fd5b01519050388062001222565b600b8452601f1982169560008051602062004a9183398151915291855b8881106200199d5750836001959697981062001983575b505050811b01600b5562001238565b015160001960f88460031b161c1916905538808062001974565b919260206001819286850151815501940192016200195d565b600b8452601f820160051c60008051602062004a91833981519152016020831062001a0e575b601f820160051c60008051602062004a9183398151915201811062001a02575062001204565b848155600101620019dc565b5060008051602062004a91833981519152620019dc565b634e487b7160e01b83526041600452602483fd5b5034620003c9576020366003190112620003c95762001a576200230b565b6022546001600160a01b03919062001a739083163314620024fa565b1680825260036020526040822060ff1990600182825416179055600f60205260408320600182825416179055600e602052600160408420918254161790556001600160601b0360a01b602254161760225580f35b5034620003c95780600319360112620003c95762001ae4620024a0565b308152600560205262001b3562001b2d604083205462001b2662001b1c62001b12601d54601c549062002576565b601f549062002576565b601e549062002576565b90620025cf565b33306200267f565b5080f35b5034620003c95780600319360112620003c957600d546040516001600160a01b039091168152602090f35b5034620003c95780600319360112620003c9576022546001600160a01b039062001b929082163314620024fa565b8060205460101c168252600e602052604082209060ff19916001838254161790558060205460101c168352600f6020526040832060018382541617905582541682526001604083209182541617905560235460ff60a01b19600d5416600d55600160b01b9061ffff60a81b19161760235580f35b5034620003c95780600319360112620003c957602060ff60235460a81c166040519015158152f35b5034620003c9576020366003190112620003c95760043562001c5c60018060a01b03600d54163314620025fe565b8060095560115481603c0291603c83040362001c91579062001c7e9162002576565b600855600160ff19600a541617600a5580f35b634e487b7160e01b83526011600452602483fd5b5034620003c95780600319360112620003c9576020601354604051908152f35b5034620003c95780600319360112620003c957602060ff600d5460a01c166040519015158152f35b5034620003c9576020366003190112620003c95760209060ff906040906001600160a01b0362001d1c6200230b565b168152601084522054166040519015158152f35b5034620003c9576020366003190112620003c95760209060ff906040906001600160a01b0362001d5f6200230b565b168152600e84522054166040519015158152f35b5034620003c9576040366003190112620003c95762001d916200236a565b62001d9b620024a0565b6023805460ff60a81b191691151560a81b60ff60a81b1691909117905560243560265580f35b5034620003c9576040366003190112620003c95762000ba690604062001de66200230b565b9133815260066020522060018060a01b03821660005260205262001e1260243560406000205462002576565b903362002d2d565b5034620003c95780600319360112620003c9576020601254604051908152f35b5034620003c95780600319360112620003c957602060405160098152f35b5034620003c9578062001e6b3662002353565b62001e78929192620024a0565b6001546001600160a01b031692833b15620007ed576044908360405195869485936316a4744b60e11b8552600485015260248401525af18015620008aa5762001ebf575080f35b62000427906200238a565b5034620003c95780600319360112620003c95762001f12602091604062001f0160075461dead8452600586528284205490620025cf565b9180805260058552205490620025cf565b604051908152f35b5034620003c95780600319360112620003c95762001f4460018060a01b03602254163314620024fa565b60115462001f82574260115560095480603c0290603c82040362001f6e5762001c7e904262002576565b634e487b7160e01b82526011600452602482fd5b60405162461bcd60e51b815260206004820152601060248201526f185b1c9958591e481b185d5b98da195960821b6044820152606490fd5b5034620003c9576060366003190112620003c95762001fd86200230b565b9062001fe362002327565b60406044359260018060a01b0385168152600660205281812033825260205220549260001984036200201c575b62000b1693506200267f565b8284106200203d57620020378362000b169503338362002d2d565b62002010565b60405162461bcd60e51b8152602060048201526016602482015275496e73756666696369656e7420616c6c6f77616e636560501b6044820152606490fd5b5034620003c9576020366003190112620003c9576004356001600160a01b03811690819003620007f157620020af620024a0565b6001600160601b0360a01b602354161760235580f35b5034620003c95780600319360112620003c9576020601a54604051908152f35b5034620003c95780600319360112620003c9576020600754604051908152f35b5034620003c9576020366003190112620003c95762002123620024a0565b60043560025580f35b5034620003c95780600319360112620003c95760015460405163125f9e3360e01b8152906001600160a01b03906020908390600490829085165afa9182156200175e576020939262002183575b5060405191168152f35b6200219f919250833d81116200054f576200053f81836200239e565b903862002179565b5034620003c95780600319360112620003c9576004546040516001600160a01b039091168152602090f35b5034620003c9576040366003190112620003c95762000ba6620021f46200230b565b602435903362002d2d565b5034620003c95780600319360112620003c9576040519080600b54620022258162002539565b8085529160019180831690811562000d065750600114620022535762000cb38562000ca6818703826200239e565b9250600b835260008051602062004a918339815191525b8284106200228957505050810160200162000ca68262000cb362000c93565b805460208587018101919091529093019281016200226a565b905034620007f15781600319360112620007f1576020906026548152f35b6020808252825181830181905290939260005b828110620022f657505060409293506000838284010152601f8019910116010190565b818101860151848201604001528501620022d3565b600435906001600160a01b03821682036200232257565b600080fd5b602435906001600160a01b03821682036200232257565b35906001600160a01b03821682036200232257565b604090600319011262002322576004359060243590565b6004359081151582036200232257565b6024359081151582036200232257565b6001600160401b038111620007d757604052565b90601f801991011681019081106001600160401b03821117620007d757604052565b6001600160401b038111620007d757601f01601f191660200190565b81601f820112156200232257803590620023f682620023c0565b926200240660405194856200239e565b828452602083830101116200232257816000926020809301838601378301015290565b9080601f8301121562002322578135906001600160401b038211620007d7578160051b6040519360209362002461858401876200239e565b8552838086019282010192831162002322578301905b82821062002486575050505090565b83809162002494846200233e565b81520191019062002477565b6000546001600160a01b03163303620024b557565b60405162461bcd60e51b815260206004820152601760248201527f63616c6c6572206973206e6f7420746865206f776e65720000000000000000006044820152606490fd5b156200250257565b60405162461bcd60e51b815260206004820152600f60248201526e6e6f742074686520666163746f727960881b6044820152606490fd5b90600182811c921680156200256b575b60208310146200255557565b634e487b7160e01b600052602260045260246000fd5b91607f169162002549565b919082018092116200258457565b634e487b7160e01b600052601160045260246000fd5b818102929181159184041417156200258457565b8115620025b9570490565b634e487b7160e01b600052601260045260246000fd5b919082039182116200258457565b908160209103126200232257516001600160a01b0381168103620023225790565b156200260657565b60405162461bcd60e51b81526020600482015260126024820152713737ba103a343290383937b7b320b236b4b760711b6044820152606490fd5b156200264857565b60405162461bcd60e51b815260206004820152600f60248201526e139bdd081dda1a5d195b1a5cdd1959608a1b6044820152606490fd5b6023805460009460ff9492909160b01c85161562002cfd57600a5485811662002c1d575b50602092858454818116158062002c11575b62002ba0575b50825460a01c1662002b2e576021549697966001600160a01b0380831697918116968a9391928989148062002b1f575b62002aa4575b898552600f88526040958787838189205416158062002a95575b62002a3b575b5050848316998a14158062002a2c575b8062002a1e575b80620029f9575b620029d0575b508885526005918289526200274e8888882054620025cf565b8a8752838a5287872055878560215416808c14908115620029c5575b506200297e575b508a865282895262002787888888205462002576565b8b8752838a52878720558986526010895281878720541615620028e1575b50898552601088528585205416156200284f575b50506001541660025490803b15620007ed57602483928551948593849263ffb2c47960e01b845260048401525af1908162002833575b509660008051602062004a7183398151915294959697156000146200282c578060008051602062004ab183398151915291a15b51908152a3600190565b5062002822565b6200283f89916200238a565b6200284b5738620027ef565b8780fd5b82600154169087528484205491813b15620008d1578551630a5b654b60e11b81526001600160a01b039190911660048201526024810192909252839081908390604490829084905af19182620028c9575b5050620028c35760008051602062004ab18339815191528280a15b3880620027b9565b620028bb565b620028d4906200238a565b620007ed578238620028a0565b90919293948560015416848a528782205490803b15620007ed578851630a5b654b60e11b81526001600160a01b0394909416600485015260248401919091528290604490829084905af1908162002960575b508b94939291906200295a5760008051602062004ab18339815191528580a15b38620027a5565b62002953565b62002972909c91959493929c6200238a565b9a909192933862002933565b909750600e89528187872054161580620029b4575b15620029ae57620029a690848962002e1a565b963862002771565b620029a6565b508a86528187872054161562002993565b90508c14386200276a565b805460ff60a01b19908116600160a01b178255620029ed62002fb9565b81541690553862002735565b5062002a1362001b1c62001b12601d54601c549062002576565b60265411156200272f565b5081815460a81c1662002728565b5081815460a01c161562002721565b62002a5192939495969760058c52205462002576565b6025541062002a6857908b94939291878762002711565b855162461bcd60e51b81526004810189905260066024820152651dd85b1b195d60d21b6044820152606490fd5b5083600d5460a01c166200270b565b9091929350602454861180159062002af6575b1562002ac857908a939291620026f1565b60405162461bcd60e51b815260048101889052600660248201526509ac2f040a8b60d31b6044820152606490fd5b508382168b52600f87528060408c205416801562002ab75750888b528060408c20541662002ab7565b5080600d5460a01c16620026eb565b6001600160a01b0394851680885260058552604088205490965060008051602062004a7183398151915295925062002b68908490620025cf565b8688526005855260408820551694858152604062002b8a838284205462002576565b91878152600585522055604051908152a3600190565b60081c1662002bee5760115462015180810180911162002bda57421162002bca575b8538620026bb565b62002bd462003750565b62002bc2565b634e487b7160e01b88526011600452602488fd5b6011546228de80810180911162002bda5742111562002bc25762002bd462003750565b506011541515620026b5565b600854421062002c365760ff1916600a555b38620026a3565b506021546001600160a01b039085821690821681810362002c7357505083168652600360205262002c6d8560408820541662002640565b62002c2f565b9091851690810362002c9857508652600360205262002c6d8560408820541662002640565b908752600360205285604088205416908162002cec575b5062002c6d5760405162461bcd60e51b815260206004820152600f60248201526e139bdd0815da1a5d195b1a5cdd1959608a1b6044820152606490fd5b875250604086205485163862002caf565b60405162461bcd60e51b81526020600482015260086024820152672174726164696e6760c01b6044820152606490fd5b6001600160a01b0390811691821562002dd5571691821562002d905760207f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925918360005260068252604060002085600052825280604060002055604051908152a3565b60405162461bcd60e51b815260206004820152601b60248201527f417070726f766520746f20746865207a65726f206164647265737300000000006044820152606490fd5b60405162461bcd60e51b815260206004820152601d60248201527f417070726f76652066726f6d20746865207a65726f20616464726573730000006044820152606490fd5b6021546001600160a01b039283169083160362002f6b57601b54916018549260195460135490601754915b831562002f61578380928162002e5c818c6200259a565b606490049962002e6d908b6200259a565b9062002e7991620025ae565b601c549062002e889162002576565b601c5562002e9790896200259a565b9062002ea391620025ae565b601d549062002eb29162002576565b601d5562002ec190876200259a565b9062002ecd91620025ae565b601e549062002edc9162002576565b601e5562002eeb90856200259a565b9062002ef791620025ae565b601f549062002f069162002576565b601f55306000526005602052826040600020549062002f259162002576565b3060005260056020526040600020556040519083825230921690602060008051602062004a7183398151915291a362002f5e91620025cf565b90565b5050505050505090565b601a549160155492601654601254906014549162002e45565b3d1562002fb4573d9062002f9882620023c0565b9162002fa860405193846200239e565b82523d6000602084013e565b606090565b602654600090601c54601d5491601e54601f5462002fe88162002fe28462002fe2898962002576565b62002576565b93620030008562002ffa83876200259a565b620025ae565b90620030108260011c86620025cf565b15620035f957604051606081018181106001600160401b03821117620035e557604052600281526040366020830137805115620035d15730602082015260018060a01b0360205460101c166040516315ab88c960e31b8152602081600481855afa908115620035c6578b91620035a2575b508251600110156200358e576001600160a01b03166040830152620030ab600185901c88620025cf565b91813b156200358a57918a9160405193849263791ac94760e01b845260a4840190600485015284602485015260a060448501528151809152602060c48501920190855b81811062003564575050508383809230606483015242608483015203925af1801562003543576200354e575b50878260011c62003473575b9182620031466200313f6200315c958460011c620025cf565b83620025cf565b8310156200344e575050875b601c5585620025cf565b156200344657859347916200318e6200317688856200259a565b620031878362002fe2888c62002576565b90620025ae565b94620031b06200319f86866200259a565b620031878462002fe2898d62002576565b94620031c886620031c28988620025cf565b620025cf565b98620031da8562002ffa83866200259a565b8110156200342a5750875b601d55620031f98462002ffa83856200259a565b8110156200340e5750865b601e55620032188362002ffa84846200259a565b821015620033f357505050835b601f556200329d575b50506001546001600160a01b03169050803b15620007ed57828091600460405180958193630d0e30db60e41b83525af1918262003285575b505062003282578060008051602062004ab183398151915291a1565b50565b62003290906200238a565b620007f157813862003266565b80620032e1575b5080620032b3575b806200322e565b602354829182918291906001600160a01b03165af1620032d262002f84565b5015620007f1578138620032ac565b90915060011c6004602060018060a01b036022541660405192838092633690e28760e01b82525afa908115620033c457858084819482948391620033cf575b506001600160a01b03165af16200333662002f84565b5015620005a35760225460405163d7e7a9e760e01b815290602090829060049082906001600160a01b03165afa908115620033c457858093819382938391620033a0575b506001600160a01b03165af16200339062002f84565b5015620007ed57829038620032a4565b620033bd915060203d6020116200054f576200053f81836200239e565b386200337a565b6040513d87823e3d90fd5b620033ec915060203d6020116200054f576200053f81836200239e565b3862003320565b620034089262002ffa8362001b26936200259a565b62003225565b8062001b268562002ffa6200342494866200259a565b62003204565b8062001b268662002ffa6200344094876200259a565b620031e5565b505050505050565b8162001b2662003466926200346d9460011c620025cf565b82620025cf565b62003152565b5060205460101c6001600160a01b0316916060620034a96200349a600184901c476200259a565b620031878460011c8b620025cf565b9360c48b604051968793849263f305d71960e01b84523060048501528760011c6024850152806044850152606484015261dead60848401524260a48401525af180156200354357899062003501575b90925062003126565b5090916060813d82116200353a575b816200351f606093836200239e565b810103126200353657906200315c929151620034f8565b8880fd5b3d915062003510565b6040513d8b823e3d90fd5b6200355c909891986200238a565b96386200311a565b82516001600160a01b031684528f965087955060209384019390920191600101620030ee565b8a80fd5b634e487b7160e01b8b52603260045260248bfd5b620035bf915060203d6020116200054f576200053f81836200239e565b3862003081565b6040513d8d823e3d90fd5b634e487b7160e01b89526032600452602489fd5b634e487b7160e01b8a52604160045260248afd5b5050505050505050565b60115415620036ab576007546005810281159082810460051482171562002584576103e8900483106200367b57600382029182046003141715620025845760649004106200364d57565b60405162461bcd60e51b81526020600482015260066024820152654d617820332560d01b6044820152606490fd5b60405162461bcd60e51b81526020600482015260086024820152674d696e20302e352560c01b6044820152606490fd5b60405162461bcd60e51b8152602060048201526009602482015268085b185d5b98da195960ba1b6044820152606490fd5b15620036e457565b60405162461bcd60e51b8152602060048201526008602482015267686967682066656560c01b6044820152606490fd5b156200371c57565b60405162461bcd60e51b815260206004820152600c60248201526b68696768204b59432066656560a01b6044820152606490fd5b60165460155460145490601954916018549060175492602095865460ff81161580620039b3575b620038d0575b5092620037c2620037b88462002fe28588620037ac620037ee9b9962002fe262002fe29a620037e49d62002576565b15620038c55762002576565b6012549062002576565b9586601a55620037d88462002fe2848462002576565b15620038ba5762002576565b6013549062002576565b9182601b5560018060a01b03806022541682600092835416602460405180948193633af32abf60e01b835260048301525afa928315620008aa57829362003878575b5050506000146200385b57620038599162003851600c601193111562003714565b111562003714565b565b620038599162003870600780931115620036dc565b1115620036dc565b9080929350813d8311620038b2575b6200389381836200239e565b81010312620007f15751908115158203620003c9575038808062003830565b503d62003887565b600060135562002576565b600060125562002576565b909492939060081c60ff166200395057601154916201518083018093116200258457620037b8620037e49562002fe2620037c293620037ee9962002fe29742116000146200394057600160128190556013558c5461ff001916610100178d555b959850955050949650506200377d565b6002601255600260135562003930565b601154916228de8083018093116200258457620037b8620037e49562002fe2620037c293620037ee9962002fe2974211600014620039a357600060128190556013558c5460ff19166001178d5562003930565b6001601255600160135562003930565b50601154151562003777565b80519060005b828110620039d257505050565b815181101562003a18576003602060018060a01b03818460051b8601015116600052526040600020600160ff1982541617905560001981146200258457600101620039c5565b634e487b7160e01b600052603260045260246000fdfe608060409080825234620001df57606081620010228038038091620000258285620001e4565b833981010312620001df576200003b816200021e565b6020906200005884620000508486016200021e565b94016200021e565b6ec097ce7bc90715b34b9f1000000000600b55610708600c55670de0b6b3a7640000600d55600180546001600160a01b03199081166001600160a01b03948516179091556002805482169584169590951790945560008054909416918116919091178355835163313ce56760e01b838201908152600482526001600160401b03929180870184811182821017620001cb5787525185928392905afa3d15620001c1573d918211620001ad578451916200011b601f8201601f1916850184620001e4565b82523d848484013e5b156200017f5781818051810103126200017b5701519060ff82168092036200017857604d8211620001645750600a0a600d5551610dee9081620002348239f35b634e487b7160e01b81526011600452602490fd5b80fd5b8280fd5b835162461bcd60e51b81526004810183905260076024820152661a5b9d985b1a5960ca1b6044820152606490fd5b634e487b7160e01b84526041600452602484fd5b6060915062000124565b634e487b7160e01b87526041600452602487fd5b600080fd5b601f909101601f19168101906001600160401b038211908210176200020857604052565b634e487b7160e01b600052604160045260246000fd5b51906001600160a01b0382168203620001df5756fe608060408181526004918236101561001657600080fd5b600092833560e01c91826311ce023d146109d757508163125f9e331461018957816314b6ca96146107aa57816328fd31981461077d5781632d48e8961461074d5781633a98ef391461072e5781634fab0ae81461070f57816351171961146106e457816366817df5146106ac5781638477d9f314610613578163997664d7146105f4578163ce7c2ac2146105b2578163d0e30db014610298578163d4fda1f214610262578163e2d2e21914610243578163efca2eed14610224578163f0fc6bca146101b2578163f1e9f1e514610189578163f82107691461015e578163ffb2c4791461012d575063ffd49c841461010c57600080fd5b34610129578160031936011261012957602090600c549051908152f35b5080fd5b8390346101295760203660031901126101295781546001600160a01b031633036101295761015b9035610b6e565b80f35b8390346101295760203660031901126101295781546001600160a01b031633036101295735600c5580f35b50503461012957816003193601126101295760025490516001600160a01b039091168152602090f35b919050346102205782600319360112610220576101ce33610c3c565b156101dd578261015b33610c80565b906020606492519162461bcd60e51b8352820152601760248201527f546f6f20736f6f6e2e204e65656420746f2077616974210000000000000000006044820152fd5b8280fd5b5050346101295781600319360112610129576020906009549051908152f35b505034610129578160031936011261012957602090600a549051908152f35b9050346102205760203660031901126102205760209282916001600160a01b0361028a6109f3565b168252845220549051908152f35b919050826003193601126102205782546001600160a01b039190821633036105ae578160025416908051916370a0823160e01b9384845230868501526020918285602481845afa9485156105a4578895610571575b508351906060820182811067ffffffffffffffff82111761055e5785526002825284368584013782600154169085516315ab88c960e31b815285818b81865afa908115610554578b9161051a575b508461034685610ac2565b9116905261035383610ae5565b52888361035f84610ac2565b51168461036b85610ae5565b51160361049657505061037e8291610ac2565b51169087823b15610493578088938651998a8092630d0e30db60e41b825234905af197881561048757849596979861046a575b50506024905b600254169685519788938492835230908301525afa9182156104615750849161042c575b506103e69250610a92565b6103f281600854610ab5565b6008556007549081610402578280f35b61041d61042392610418600a5493600b54610af5565b610b08565b90610ab5565b600a5538808280f35b905082813d831161045a575b6104428183610a70565b81010312610455576103e69151386103db565b600080fd5b503d610438565b513d86823e3d90fd5b61047691929450610a46565b61048357829187386103b1565b8680fd5b508451903d90823e3d90fd5b80fd5b9091829894959697983b15610129576104d0928751808095819463b6f9de9560e01b8352868a840152608060248401526084830190610a09565b306044830152426064830152039134905af18015610510576104f8575b5090602483926103b7565b83929197610507602492610a46565b979192506104ed565b85513d8a823e3d90fd5b90508581813d831161054d575b6105318183610a70565b8101031261054957518481168103610549573861033b565b8a80fd5b503d610527565b87513d8d823e3d90fd5b634e487b7160e01b8a526041895260248afd5b9094508281813d831161059d575b6105898183610a70565b81010312610599575193386102ed565b8780fd5b503d61057f565b84513d8a823e3d90fd5b8380fd5b505034610129576020366003190112610129579081906001600160a01b036105d86109f3565b1681526006602052206001815491015482519182526020820152f35b5050346101295781600319360112610129576020906008549051908152f35b50503461012957816003193601126101295780519081809360035490818552602080950191600382527fc2575a0e9e593c00f959f8c92f12db2869c3395a3b0502d05e2516446f71f85b915b8682821061068c5785906106888861067984890385610a70565b51928284938452830190610a09565b0390f35b83546001600160a01b03168552889550909301926001928301920161065f565b5050346101295760203660031901126101295760209181906001600160a01b036106d46109f3565b1681526005845220549051908152f35b8390346101295760203660031901126101295781546001600160a01b031633036101295735600d5580f35b505034610129578160031936011261012957602090600d549051908152f35b5050346101295781600319360112610129576020906007549051908152f35b91905034610220573660031901126101295781546001600160a01b031633036101295735600c55602435600d5580f35b505034610129576020366003190112610129576020906107a361079e6109f3565b610d69565b9051908152f35b919050346102205780600319360112610220576107c56109f3565b8354602435926001600160a01b039291831633036109d3578282169485875260066020528187209586549485158015806109c5575b881591821590816109bd575b50156108b657505050600354928391895282602052882055680100000000000000008210156108a35750926108858161088061089d95610878610894966108548a6001809c01600355610b28565b90919082549060031b9160018060a01b039283811b93849216901b16911916179055565b600754610a92565b610ab5565b600755808555600a5490610af5565b600b5490610b08565b91015580f35b634e487b7160e01b875260419052602486fd5b91955091929190816109b5575b506108e3575b505050506108948261088560019461088061089d95610878565b600392835492600019938481019081116109a2578661090461091e92610b28565b905490881b1c16828c5284602052610854848d2054610b28565b895281602052808920549084548481019081116109a25761093f8791610b28565b905490871b1c168a5282602052892055825490811561098f57509461088061089d956108949583956108859560019a019161097983610b28565b9091825491841b1b1916905555955050946108c9565b634e487b7160e01b895260319052602488fd5b634e487b7160e01b8b526011845260248bfd5b9050386108c3565b905038610806565b6109ce87610c80565b6107fa565b8580fd5b849034610129578160031936011261012957602090600b548152f35b600435906001600160a01b038216820361045557565b90815180825260208080930193019160005b828110610a29575050505090565b83516001600160a01b031685529381019392810192600101610a1b565b67ffffffffffffffff8111610a5a57604052565b634e487b7160e01b600052604160045260246000fd5b90601f8019910116810190811067ffffffffffffffff821117610a5a57604052565b91908203918211610a9f57565b634e487b7160e01b600052601160045260246000fd5b91908201809211610a9f57565b805115610acf5760200190565b634e487b7160e01b600052603260045260246000fd5b805160011015610acf5760400190565b81810292918115918404141715610a9f57565b8115610b12570490565b634e487b7160e01b600052601260045260246000fd5b600354811015610acf5760036000527fc2575a0e9e593c00f959f8c92f12db2869c3395a3b0502d05e2516446f71f85b0190600090565b6000198114610a9f5760010190565b906003908154908115610c365792916000908180955a5b86881080610c2d575b15610c2357610be1610bda610bf592600e9a898c541015610c1b575b8b54610bce610bb882610b28565b90546001600160a01b0392918c1b1c8216610c3c565b610bfc575b5050610ab5565b5a90610a92565b945a98610bee8154610b5f565b9055610b5f565b9396610b85565b610c08610c1492610b28565b9054908b1b1c16610c80565b3880610bd3565b868c55610baa565b5095505050505050565b50858510610b8e565b92505050565b6001600160a01b038116600090815260056020526040902054600c54610c6191610ab5565b4210159081610c6e575090565b610c789150610d69565b600d54111590565b60018060a01b039081811690600092828452602091600683526040852090815415610cb557610cae90610d69565b9081610cbd575b505050505050565b8392604491610cce84600954610ab5565b600955868852600585524260408920556001610cf16108948354600a5490610af5565b910155600254169486604051968794859363a9059cbb60e01b8552600485015260248401525af18015610d5e57610d2b575b808080610cb5565b81813d8311610d57575b610d3f8183610a70565b81010312610129575180151503610493578080610d23565b503d610d35565b6040513d85823e3d90fd5b6001600160a01b0316600090815260066020526040902080548015610db157610d9a610894600192600a5490610af5565b91015480821115610db157610dae91610a92565b90565b505060009056fea2646970667358221220ddaa082a3bd187e0a7b02a8bf23ad3421782d8bbc0b2c7af395dc025b2e3e24064736f6c63430008110033df6966c971051c3d54ec59162606531493a51404a002842f56009d7e5cf4a8c7ddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef0175b7a638427703f0dbe7bb9bbf987a2551717b34e79f33b5b1008d1fa01db9d491e240ecd34d50a8e73bc9d6e4edd4580d0daf50f4cea2ae5d0a527615281ca2646970667358221220f804dd19086415858621c0307228dbdcebf2aafb6234707076c84113eec7960664736f6c63430008110033

Block Transaction Difficulty Gas Used Reward
View All Blocks Produced

Block Uncle Number Difficulty Gas Used Reward
View All Uncles
Loading...
Loading
Loading...
Loading

Validator Index Block Amount
View All Withdrawals

Transaction Hash Block Value Eth2 PubKey Valid
View All Deposits
Loading...
Loading
[ Download: CSV Export  ]

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