ETH Price: $3,387.30 (-1.73%)
Gas: 1 Gwei

Contract

0x1BfFb5Ce4d1e2aE20b64bc6239D4f7b5133818dF
 

Overview

ETH Balance

0 ETH

Eth Value

$0.00

Token Holdings

Multichain Info

No addresses found
Transaction Hash
Method
Block
From
To
Value
Initialize Min L...192589062024-02-19 2:44:47130 days ago1708310687IN
0x1BfFb5Ce...5133818dF
0 ETH0.0008441418.53466814
Transfer Ownersh...192375822024-02-16 2:46:23133 days ago1708051583IN
0x1BfFb5Ce...5133818dF
0 ETH0.0006481322.62470795
Set Proof Admin192375802024-02-16 2:45:59133 days ago1708051559IN
0x1BfFb5Ce...5133818dF
0 ETH0.0006344721.89037784
Create Token192372852024-02-16 1:46:47134 days ago1708048007IN
0x1BfFb5Ce...5133818dF
0 ETH0.1913835927.54201836
0x60806040192372072024-02-16 1:30:59134 days ago1708047059IN
 Create: ProofReflectionFactory
0 ETH0.1136183120.58058918

Latest 1 internal transaction

Advanced mode:
Parent Transaction Hash Block From To Value
192372852024-02-16 1:46:47134 days ago1708048007
0x1BfFb5Ce...5133818dF
 Contract Creation0 ETH
Loading...
Loading

Contract Source Code Verified (Exact Match)

Contract Name:
ProofReflectionFactory

Compiler Version
v0.8.17+commit.8df45f5f

Optimization Enabled:
Yes with 200 runs

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

import "@openzeppelin/contracts/token/ERC20/extensions/IERC20Metadata.sol";
import "./libraries/Ownable.sol";
import "./libraries/ProofReflectionFactoryFees.sol";
import "./interfaces/ITeamFinanceLocker.sol";
import "./interfaces/ITokenCutter.sol";
import "./interfaces/IUniswapV2Router02.sol";
import "./interfaces/IUniswapV2Factory.sol";
import "./interfaces/IProofReflectionTokenCutter.sol";
import "./tokenCutters/ProofReflectionTokenCutter.sol";

contract ProofReflectionFactory is Ownable {
    struct ProofToken {
        bool status;
        address pair;
        address owner;
        uint256 unlockTime;
        uint256 lockId;
    }

    struct TokenParam {
        string tokenName;
        string tokenSymbol;
        uint256 initialSupply;
        uint256 percentToLP;
        uint256 initialReflectionFee;
        uint256 initialReflectionFeeOnSell;
        uint256 initialLpFee;
        uint256 initialLpFeeOnSell;
        uint256 initialDevFee;
        uint256 initialDevFeeOnSell;
        uint256 unlockTime;
        address devWallet;
        uint256 whitelistPeriod;
        address[] whitelists;
    }

    struct WhitelistAdd_ {
        address [] whitelists;
    }

    mapping(address => ProofToken) public validatedPairs;
    mapping(address => bool) private whitelisted;

    address public proofAdmin;
    address public routerAddress;
    address public lockerAddress;
    address public nftWhitelist;
    address payable public revenueAddress;
    address payable public rewardPoolAddress;
    uint256 private minLiq = 0;

    event TokenCreated(address _address);

    error InsufficientLiquidity();
    error ETHTransferFail();

    constructor(
        address initialRouterAddress,
        address initialLockerAddress,
        address initialRewardPoolAddress,
        address initialRevenueAddress,
        address _nftWhitelist
    ) {
        routerAddress = initialRouterAddress;
        lockerAddress = initialLockerAddress;
        proofAdmin = msg.sender;
        revenueAddress = payable(initialRevenueAddress);
        rewardPoolAddress = payable(initialRewardPoolAddress);
        nftWhitelist = _nftWhitelist;
    }

    function addmoreWhitelist(address tokenAddress, WhitelistAdd_ memory _WhitelistAdd) external {
        _checkTokenStatus(tokenAddress);

        IProofReflectionTokenCutter(tokenAddress).addMoreToWhitelist(IProofReflectionTokenCutter.WhitelistAdd_(_WhitelistAdd.whitelists));
    
    }

    function createToken(TokenParam memory tokenParam_) external payable {
        require(
            tokenParam_.unlockTime >= block.timestamp + 30 days,
            "<30 days"
        );
        if (msg.value < minLiq) {
            revert InsufficientLiquidity();
        }

        ProofReflectionFactoryFees.allFees
            memory fees = ProofReflectionFactoryFees.allFees(
                tokenParam_.initialReflectionFee,
                tokenParam_.initialReflectionFeeOnSell,
                tokenParam_.initialLpFee,
                tokenParam_.initialLpFeeOnSell,
                tokenParam_.initialDevFee,
                tokenParam_.initialDevFeeOnSell
            );

        ProofReflectionTokenCutter newToken = new ProofReflectionTokenCutter();
        Ownable(address(newToken)).transferOwnership(msg.sender);
        IProofReflectionTokenCutter(address(newToken)).setBasicData(
            IProofReflectionTokenCutter.BaseData(
                tokenParam_.tokenName,
                tokenParam_.tokenSymbol,
                tokenParam_.initialSupply,
                tokenParam_.percentToLP,
                tokenParam_.whitelistPeriod,
                msg.sender,
                tokenParam_.devWallet,
                routerAddress,
                proofAdmin,
                tokenParam_.whitelists,
                nftWhitelist
            ),
            fees
        );
        emit TokenCreated(address(newToken));

        if (msg.value != 0) {
            //add liquidity
            newToken.approve(routerAddress, type(uint256).max);
            IUniswapV2Router02 router = IUniswapV2Router02(routerAddress);
            router.addLiquidityETH{value: msg.value}(
                address(newToken),
                newToken.balanceOf(address(this)),
                0,
                0,
                address(this),
                block.timestamp + 111
            );
        }

        // disable trading
        newToken.swapTradingStatus();

        validatedPairs[address(newToken)] = ProofToken(
            false,
            newToken.pair(),
            msg.sender,
            tokenParam_.unlockTime,
            0
        );
    }

    function finalizeToken(address tokenAddress) public payable {
        _checkTokenStatus(tokenAddress);

        address _pair = validatedPairs[tokenAddress].pair;
        uint256 _unlockTime = validatedPairs[tokenAddress].unlockTime;
        IERC20(_pair).approve(lockerAddress, type(uint256).max);

        uint256 lpBalance = IERC20(_pair).balanceOf(address(this));

        uint256 _lockId = ITeamFinanceLocker(lockerAddress).lockToken{
            value: msg.value
        }(_pair, msg.sender, lpBalance, _unlockTime, false, 0x0000000000000000000000000000000000000000);
        validatedPairs[tokenAddress].lockId = _lockId;

        IProofReflectionTokenCutter(tokenAddress).addNFTSnapshot();

        //enable trading
        ITokenCutter(tokenAddress).swapTradingStatus();
        ITokenCutter(tokenAddress).setLaunchedAt();

        validatedPairs[tokenAddress].status = true;
    }

    function cancelToken(address tokenAddress) public {
        _checkTokenStatus(tokenAddress);

        address _pair = validatedPairs[tokenAddress].pair;
        address _owner = validatedPairs[tokenAddress].owner;

        IUniswapV2Router02 router = IUniswapV2Router02(routerAddress);
        IERC20(_pair).approve(routerAddress, type(uint256).max);
        uint256 _lpBalance = IERC20(_pair).balanceOf(address(this));

        // enable transfer and allow router to exceed tx limit to remove liquidity
        ITokenCutter(tokenAddress).cancelToken();
        router.removeLiquidityETH(
            address(tokenAddress),
            _lpBalance,
            0,
            0,
            _owner,
            block.timestamp
        );

        // disable transfer of token
        ITokenCutter(tokenAddress).swapTradingStatus();

        delete validatedPairs[tokenAddress];
    }

    function initializeMinLiq() external onlyOwner {
        require(minLiq == 0, "already executed");
        minLiq = 1 ether;
    }

    function proofRevenueAddress() external view returns (address) {
        return revenueAddress;
    }

    function proofRewardPoolAddress() external view returns (address) {
        return rewardPoolAddress;
    }

    function distributeExcessFunds() external onlyOwner {
        (bool sent, ) = revenueAddress.call{value: address(this).balance / 2}("");
        if (!sent) revert ETHTransferFail();
        (bool sent1, ) = rewardPoolAddress.call{value: address(this).balance}("");
        if (!sent1) revert ETHTransferFail();
    }

    function setWhitelist(address[] memory users, bool[] memory statuses) external onlyOwner {
        uint256 len = users.length;
        require(len == statuses.length, "list mismatch");
        for (uint256 i; i < len; i++) {
            whitelisted[users[i]] = statuses[i];
        }
    }

    function setLockerAddress(address newlockerAddress) external onlyOwner {
        lockerAddress = newlockerAddress;
    }

    function setRouterAddress(address newRouterAddress) external onlyOwner {
        routerAddress = payable(newRouterAddress);
    }

    function setNFTWhitelist(address newNFTWhitelist) external onlyOwner {
        nftWhitelist = newNFTWhitelist;
    }

    function setProofAdmin(address newProofAdmin) external onlyOwner {
        proofAdmin = newProofAdmin;
    }

    function setRevenueAddress(address newRevenueAddress) external onlyOwner {
        revenueAddress = payable(newRevenueAddress);
    }

    function setRewardPoolAddress(
        address newRewardPoolAddress
    ) external onlyOwner {
        rewardPoolAddress = payable(newRewardPoolAddress);
    }

    function _checkTokenStatus(address tokenAddress) internal view {
        require(validatedPairs[tokenAddress].owner == msg.sender, "!owner");
        require(validatedPairs[tokenAddress].status == false, "validated");
    }

    function isWhitelisted(address user) external view returns(bool) {
        return whitelisted[user];
    }

    receive() external payable {}
}

File 2 of 14 : 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 3 of 14 : 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 4 of 14 : 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 5 of 14 : 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 6 of 14 : IProofReflectionTokenCutter.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/ProofReflectionFactoryFees.sol";

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

    struct WhitelistAdd_ {
        address [] whitelists;
    }

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

    function addMoreToWhitelist(
        WhitelistAdd_ memory _WhitelistAdd
    ) external;

    function updateWhitelistPeriod(
        uint256 _whitelistPeriod
    ) external;

    function changeIsTxLimitExempt(
        address user,
        bool value
    ) external;

    function addNFTSnapshot() external;

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

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

interface ITeamFinanceLocker {
    function lockToken(
        address _tokenAddress,
        address _withdrawalAddress,
        uint256 _amount,
        uint256 _unlockTime,
        bool _mintNFT, 
        address referrer
    ) external payable returns (uint256 _id);
}

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

interface ITokenCutter {
    function swapTradingStatus() external;

    function setLaunchedAt() external;

    function cancelToken() external;
}

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

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

File 10 of 14 : 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 11 of 14 : 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 12 of 14 : 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 13 of 14 : ProofReflectionFactoryFees.sol
// SPDX-License-Identifier: None
pragma solidity ^0.8.17;

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

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

import "../interfaces/IERC721A.sol";
import "../libraries/Ownable.sol";
import "../libraries/ProofReflectionFactoryFees.sol";
import "../interfaces/IFACTORY.sol";
import "../interfaces/IUniswapV2Router02.sol";
import "../interfaces/IUniswapV2Factory.sol";
import "../interfaces/IProofReflectionTokenCutter.sol";

contract ProofReflectionTokenCutter is Ownable, IProofReflectionTokenCutter {

    //This token was created with PROOF, and audited by Solidity Finance — https://proofplatform.io/projects
    mapping(address => uint256) private _rOwned;
    mapping(address => uint256) private _tOwned;
    mapping(address => mapping(address => uint256)) private _allowances;
    uint256 private constant MAX = ~uint256(0);

    uint256 private _tTotal;
    uint256 private _rTotal;
    uint256 private _tFeeTotal;
    uint256 public swapThreshold;
    uint256 public whitelistEndTime;
    uint256 public whitelistPeriod;

    string private _name;
    string private _symbol;
    uint8 private constant _decimals = 9;

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

    mapping(address => bool) public userWhitelist;
    IERC721A public nftWhitelist;
    bool public whitelistMode = true;

    mapping(address => bool) public isFeeExempt;
    mapping (address => bool) private _isExcluded;
    mapping(address => bool) public isTxLimitExempt;

    address[] private _excluded;

    uint256 public launchedAt;

    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 private txnCurrentTaxFee = 0;
    uint256 private txnCurrentReflectionFee = 0;
    uint256 private txnCurrentRevenueFee = 0;
    uint256 private txnCurrentDevFee = 0;
    uint256 private txnCurrentLpFee = 0;

    uint256 public revenueFee = 2;
    uint256 public revenueFeeOnSell = 2;
    bool public proofFeeRemoved = false;
    bool public proofFeeReduced = false;

    uint256 accLpFees;
    uint256 accDevFees;
    uint256 accRevenueFees;

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

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

    uint256 public _maxTxAmount;

    error Unauthorized();
    error HighFee();
    error ETHTransferFail();
    error NotLaunched();
    error AlreadyLaunched();
    error NotWhitelisted();
    error HighProofFee();
    error OOBTxLimit();

    constructor() {
        factory = msg.sender;
    }

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

    modifier onlyProofAdmin() {
        if (proofAdmin != _msgSender()) {
            revert Unauthorized();
        }
        _;
    }

    modifier onlyFactory() {
        if (factory != _msgSender()) {
            revert Unauthorized();
        }
        _;
    }

    function setBasicData(
        BaseData memory _baseData,
        ProofReflectionFactoryFees.allFees memory fees
    ) external onlyFactory {
        _name = _baseData.tokenName;
        _symbol = _baseData.tokenSymbol;
        _tTotal += _baseData.initialSupply;
        _rTotal = (MAX - (MAX % _tTotal));
        swapThreshold = (_baseData.initialSupply * 5) / 4000;

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

        _maxTxAmount = (_baseData.initialSupply * 1) / 100;

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

        _allowances[address(this)][address(router)] = MAX;

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

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

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

        _isExcluded[pair] = true;
        _isExcluded[address(this)] = true;

        whitelistPeriod = _baseData.whitelistPeriod;
        reflectionFee = fees.reflectionFee;
        lpFee = fees.lpFee;
        devFee = fees.devFee;

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

        if (fees.devFee + fees.lpFee + fees.reflectionFee == 0) {
            revenueFee = 0;
        } 
        totalFee = fees.devFee + fees.lpFee + revenueFee;

        if (fees.devFeeOnSell + fees.lpFeeOnSell + fees.reflectionFeeOnSell == 0) {
            revenueFeeOnSell = 0;
        }
        totalFeeIfSelling = fees.devFeeOnSell + fees.lpFeeOnSell + revenueFeeOnSell;

        if (IFACTORY(factory).isWhitelisted(_baseData.owner)) {
            if (totalFee + fees.reflectionFee > 12) revert HighFee(); 
            if (totalFeeIfSelling + fees.reflectionFeeOnSell > 17) revert HighFee();
        } else {
            if (totalFee + fees.reflectionFee > 7) revert HighFee();
            if (totalFeeIfSelling + fees.reflectionFeeOnSell > 7) revert HighFee();
        }

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

        _rOwned[address(0)] += _rTotal;

        _transferStandard(address(0), _msgSender(), forLP);
        _transferStandard(address(0), _baseData.owner, forOwner);

        emit Transfer(address(0), _msgSender(), forLP);
        emit Transfer(address(0), _baseData.owner, forOwner);
    }

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

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

    //Factory functions
    function swapTradingStatus() public onlyFactory {
        tradingStatus = !tradingStatus;
    }

    function setLaunchedAt() external onlyFactory {
        if (launchedAt != 0) revert AlreadyLaunched();
        launchedAt = block.timestamp;
        whitelistEndTime = block.timestamp + (60 * whitelistPeriod);
        whitelistMode = true;
    }

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

    function changeFees(
        uint256 initialReflectionFee,
        uint256 initialReflectionFeeOnSell,
        uint256 initialLpFee,
        uint256 initialLpFeeOnSell,
        uint256 initialDevFee,
        uint256 initialDevFeeOnSell
    ) external onlyOwner {
        uint256 _revenueFee;
        uint256 _revenueFeeOnSell;
        if ((block.timestamp > launchedAt + 31 days) && (launchedAt != 0)) {
            _revenueFee = 0;
            _revenueFeeOnSell = 0;
        } else if ((block.timestamp > launchedAt + 1 days) && (launchedAt != 0)) {
            _revenueFee = 1;
            _revenueFeeOnSell = 1;
        } else {
            _revenueFee = 2;
            _revenueFeeOnSell = 2;
        }
        reflectionFee = initialReflectionFee;
        lpFee = initialLpFee;
        devFee = initialDevFee;

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

        if (initialDevFee + initialLpFee + initialReflectionFee == 0) {
            _revenueFee = 0;
        } 
        totalFee = initialDevFee + initialLpFee + _revenueFee;

        if (initialDevFeeOnSell + initialLpFeeOnSell + initialReflectionFeeOnSell == 0) {
            _revenueFeeOnSell = 0;
        }
        totalFeeIfSelling = devFeeOnSell + lpFeeOnSell + _revenueFeeOnSell;

        revenueFee = _revenueFee;
        revenueFeeOnSell = _revenueFeeOnSell;

        if (IFACTORY(factory).isWhitelisted(msg.sender)) {
            if (totalFee + initialReflectionFee > 12) revert HighFee();
            if (totalFeeIfSelling + initialReflectionFeeOnSell > 17) revert HighFee();
        } else {
            if (totalFee + initialReflectionFee > 7) revert HighFee();
            if (totalFeeIfSelling + initialReflectionFeeOnSell > 7) revert HighFee();
        }
    }

    function changeTxLimit(uint256 newLimit) external onlyOwner {
        if (launchedAt == 0) revert NotLaunched();
        if (newLimit < (_tTotal * 5) / 1000) revert OOBTxLimit();	
        if (newLimit > (_tTotal * 3) / 100) revert OOBTxLimit();
        _maxTxAmount = newLimit;
    }

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

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

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

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

    function excludeFromReward(address account) public onlyOwner {
        // require(account != 0x7a250d5630B4cF539739dF2C5dAcb4c659F2488D, 'We can not exclude Uniswap router.');
        require(!_isExcluded[account], "already excluded");
        if(_rOwned[account] > 0) {
            _tOwned[account] = tokenFromReflection(_rOwned[account]);
        }
        _isExcluded[account] = true;
        _excluded.push(account);
    }

    function includeInReward(address account) external onlyOwner {
        require(_isExcluded[account], "already excluded");
        require(account != address(this), "contract must be excluded");
        for (uint256 i = 0; i < _excluded.length; i++) {
            if (_excluded[i] == account) {
                _excluded[i] = _excluded[_excluded.length - 1];
                _tOwned[account] = 0;
                _isExcluded[account] = false;
                _excluded.pop();
                break;
            }
        }
    }

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

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

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

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


    function totalSupply() public view override returns (uint256) {
        return _tTotal;
    }

    function balanceOf(
        address account
    ) public view virtual override returns (uint256) {
        if (_isExcluded[account]) return _tOwned[account];
        return tokenFromReflection(_rOwned[account]);
    }

    function transfer(
        address to,
        uint256 amount
    ) public 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 tokenFromReflection(
        uint256 rAmount
    ) private view returns (uint256) {
        require(
            rAmount <= _rTotal,
            "Amt > totReflctns"
        );
        uint256 currentRate = _getRate();
        return rAmount / currentRate;
    }

    function transferFrom(
        address sender,
        address recipient,
        uint256 amount
    ) public override returns (bool) {
        _transfer(sender, recipient, amount);
        require(
            _allowances[sender][_msgSender()] >= amount,
            "transfAmt>allownce"
        );
        _approve(
            sender,
            _msgSender(),
            _allowances[sender][_msgSender()] - amount
        );
        return true;
    }

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

    function decreaseAllowance(
        address spender,
        uint256 subtractedValue
    ) public virtual returns (bool) {
        address owner = _msgSender();
        uint256 currentAllowance = _allowances[owner][spender];
        require(
            currentAllowance >= subtractedValue,
            "insuff Allownce"
        );
        unchecked {
            _approve(owner, spender, currentAllowance - subtractedValue);
        }

        return true;
    }

    function _transfer(
        address sender,
        address recipient,
        uint256 amount
    ) private {
        require(sender != address(0), "transf frm 0 addr");
        require(recipient != address(0), "transf to 0 addr");
        require(amount > 0, "zero Amt");
        require(
            amount <= _maxTxAmount ||
                (isTxLimitExempt[sender] && isTxLimitExempt[recipient]),
            "Max TX Amount"
        );
        
        if(whitelistMode) {
            if (block.timestamp >= whitelistEndTime ) {
                whitelistMode = false;
            } else {
                if (sender == pair) { //buy
                    if (!isWhitelisted(recipient)) revert NotWhitelisted();
                } else if (recipient == pair) { //sell
                    if (!isWhitelisted(sender)) revert NotWhitelisted();
                } else { //transfer
                    if (!isWhitelisted(sender) || !isWhitelisted(recipient)) revert NotWhitelisted();
                }
            }
        }

        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 = (devFee + lpFee + reflectionFee == 0) ? 0 : 1;
                    revenueFeeOnSell = (devFeeOnSell + lpFeeOnSell + reflectionFeeOnSell == 0) ? 0 : 1;
                    totalFee = devFee + lpFee + revenueFee;
                    totalFeeIfSelling = devFeeOnSell + lpFeeOnSell + revenueFeeOnSell;
                    proofFeeReduced = true;
                }
            } else {
                if (block.timestamp > launchedAt + 31 days) {
                    revenueFee = 0;
                    revenueFeeOnSell = 0;
                    totalFee = devFee + lpFee + revenueFee;
                    totalFeeIfSelling = devFeeOnSell + lpFeeOnSell + revenueFeeOnSell;
                    proofFeeRemoved = true;
                }
            }
        }

        if (
            sender != owner() &&
            recipient != owner() &&
            !isTxLimitExempt[recipient]
        ) {

            if (
                sender == pair &&    //buy
                recipient != address(router) &&
                !isFeeExempt[recipient]
            ) {
                require(tradingStatus, "!trading");
            }
        }

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

        if (isFeeExempt[sender] || isFeeExempt[recipient]) {
            txnCurrentTaxFee = 0;
            txnCurrentReflectionFee = 0;
            txnCurrentRevenueFee = 0;
            txnCurrentDevFee = 0;
            txnCurrentLpFee = 0;
        } else if (recipient == pair) {
            txnCurrentTaxFee = totalFeeIfSelling;
            txnCurrentReflectionFee = reflectionFeeOnSell;
            txnCurrentRevenueFee = revenueFeeOnSell;
            txnCurrentDevFee = devFeeOnSell;
            txnCurrentLpFee = lpFeeOnSell;
        } else if (sender == pair) {
            txnCurrentTaxFee = totalFee;
            txnCurrentReflectionFee = reflectionFee;
            txnCurrentRevenueFee = revenueFee;
            txnCurrentDevFee = devFee;
            txnCurrentLpFee = lpFee;
        } else {
            txnCurrentTaxFee = 0;
            txnCurrentReflectionFee = 0;
            txnCurrentRevenueFee = 0;
            txnCurrentDevFee = 0;
            txnCurrentLpFee = 0;
        }


        _tokenTransfer(sender,recipient,amount);

    }

    function _tokenTransfer(address sender, address recipient, uint256 amount) private {

        
        if (_isExcluded[sender] && !_isExcluded[recipient]) {
            _transferFromExcluded(sender, recipient, amount);
        } else if (!_isExcluded[sender] && _isExcluded[recipient]) {
            _transferToExcluded(sender, recipient, amount);
        } else if (!_isExcluded[sender] && !_isExcluded[recipient]) {
            _transferStandard(sender, recipient, amount);
        } else if (_isExcluded[sender] && _isExcluded[recipient]) {
            _transferBothExcluded(sender, recipient, amount);
        } else {
            _transferStandard(sender, recipient, amount);
        }

    }

    function _transferStandard(
        address sender,
        address recipient,
        uint256 tAmount
    ) private {
        (
            uint256 rAmount,
            uint256 rTransferAmount,
            uint256 rFee,
            uint256 tTransferAmount,
            uint256 tFee,
            uint256 tDev
        ) = _getValues(tAmount);
        _rOwned[sender] = _rOwned[sender] - rAmount;
        _rOwned[recipient] = _rOwned[recipient] + rTransferAmount;
        _takeDev(tDev);
        _reflectFee(rFee, tFee);
        emit Transfer(sender, recipient, tTransferAmount);
    }

    function _transferToExcluded(address sender, address recipient, uint256 tAmount) private {
        (uint256 rAmount, uint256 rTransferAmount, uint256 rFee, uint256 tTransferAmount, uint256 tFee, uint256 tDev) = _getValues(tAmount);
        _rOwned[sender] = _rOwned[sender] - (rAmount);
        _tOwned[recipient] = _tOwned[recipient] + (tTransferAmount);
        _rOwned[recipient] = _rOwned[recipient] + (rTransferAmount);           
        _takeDev(tDev);
        _reflectFee(rFee, tFee);
        emit Transfer(sender, recipient, tTransferAmount);
    }

    function _transferFromExcluded(address sender, address recipient, uint256 tAmount) private {
        (uint256 rAmount, uint256 rTransferAmount, uint256 rFee, uint256 tTransferAmount, uint256 tFee, uint256 tDev) = _getValues(tAmount);
        _tOwned[sender] = _tOwned[sender] - (tAmount);
        _rOwned[sender] = _rOwned[sender] - (rAmount);
        _rOwned[recipient] = _rOwned[recipient] + (rTransferAmount);   
        _takeDev(tDev);
        _reflectFee(rFee, tFee);
        emit Transfer(sender, recipient, tTransferAmount);
    }

    function _transferBothExcluded(address sender, address recipient, uint256 tAmount) private {
        (uint256 rAmount, uint256 rTransferAmount, uint256 rFee, uint256 tTransferAmount, uint256 tFee, uint256 tDev) = _getValues(tAmount);
        _tOwned[sender] = _tOwned[sender] - (tAmount);
        _rOwned[sender] = _rOwned[sender] - (rAmount);
        _tOwned[recipient] = _tOwned[recipient] + (tTransferAmount);
        _rOwned[recipient] = _rOwned[recipient] + (rTransferAmount);        
        _takeDev(tDev);
        _reflectFee(rFee, tFee);
        emit Transfer(sender, recipient, tTransferAmount);
    }


    function _approve(address owner, address spender, uint256 amount) private {
        require(owner != address(0), "apprv from 0 addr");
        require(spender != address(0), "apprv to 0 addr");
        _allowances[owner][spender] = amount;
        emit Approval(owner, spender, amount);
    }

    function _takeDev(uint256 tDev) private {
        uint256 currentRate = _getRate();
        uint256 rDev = tDev * currentRate;
       
        uint256 currDevFee = txnCurrentDevFee;
        uint256 currRevenueFee = txnCurrentRevenueFee;
        uint256 currLpFee = txnCurrentLpFee;
        uint256 currTotal = currDevFee + currRevenueFee + currLpFee;

        _rOwned[address(this)] = _rOwned[address(this)] + rDev;
        if(_isExcluded[address(this)]) {	
            _tOwned[address(this)] = _tOwned[address(this)] + (tDev);
        }
        if (currTotal == 0) return;
        accDevFees += tDev * currDevFee / currTotal;
        accLpFees += tDev * currLpFee / currTotal;
        accRevenueFees += tDev * currRevenueFee / currTotal;
    }

    function _reflectFee(uint256 rFee, uint256 tFee) private {
        _rTotal = _rTotal - rFee;
        _tFeeTotal = _tFeeTotal + tFee;
    }

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

    function _getValues(uint256 tAmount)
        private
        view
        returns (uint256, uint256, uint256, uint256, uint256, uint256)
    {
        (uint256 tTransferAmount, uint256 tFee, uint256 tDev) = _getTValues(
            tAmount,
            txnCurrentReflectionFee,
            txnCurrentTaxFee
        );
        uint256 currentRate = _getRate();
        (uint256 rAmount, uint256 rTransferAmount, uint256 rFee) = _getRValues(
            tAmount,
            tFee,
            tDev,
            currentRate
        );
        return (rAmount, rTransferAmount, rFee, tTransferAmount, tFee, tDev);
    }

    function _getTValues(
        uint256 tAmount,
        uint256 _taxFee,
        uint256 _devFee
    ) private pure returns (uint256, uint256, uint256) {
        uint256 tFee = (tAmount * _taxFee) / 100;
        uint256 tDev = (tAmount * _devFee) / 100;
        uint256 tTransferAmount = tAmount - tFee - tDev;
        return (tTransferAmount, tFee, tDev);
    }

    function _getRate() private view returns(uint256) {
        (uint256 rSupply, uint256 tSupply) = _getCurrentSupply();
        return rSupply / (tSupply);
    }

    function _getCurrentSupply() private view returns(uint256, uint256) {
        uint256 rSupply = _rTotal;
        uint256 tSupply = _tTotal;      
        for (uint256 i = 0; i < _excluded.length; i++) {
            if (_rOwned[_excluded[i]] > rSupply || _tOwned[_excluded[i]] > tSupply) return (_rTotal, _tTotal);
            rSupply = rSupply - (_rOwned[_excluded[i]]);
            tSupply = tSupply - (_tOwned[_excluded[i]]);
        }
        if (rSupply < _rTotal / (_tTotal)) return (_rTotal, _tTotal);
        return (rSupply, tSupply);
    }

    function _getRValues(
        uint256 tAmount,
        uint256 tFee,
        uint256 tDev,
        uint256 currentRate
    ) private pure returns (uint256, uint256, uint256) {
        uint256 rAmount = tAmount * currentRate;
        uint256 rFee = tFee * currentRate;
        uint256 rDev = tDev * currentRate;
        uint256 rTransferAmount = rAmount - rFee - rDev;
        return (rAmount, rTransferAmount, rFee);
    }

    function swapTokensForEth() private lockTheSwap {
        uint256 tokensToLiquify = swapThreshold;

        uint256 lpProportion = accLpFees;
        uint256 devProportion = accDevFees;
        uint256 revenueProportion = accRevenueFees;
        uint256 totalProportion = lpProportion + devProportion + revenueProportion;

        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();

        _approve(address(this), address(router), tokensToLiquify);

        router.swapExactTokensForETHSupportingFeeOnTransferTokens(
            (tokensToLiquify - amountToLiquify),
            0,
            path,
            address(this),
            block.timestamp
        );

        uint256 amountETH = address(this).balance;    
        uint256 amountEthLiquidity = (address(this).balance * amountToLiquify) / (totalProportion - amountToLiquify);

        uint256 amountA;
        if (amountToLiquify > 0) {
            (amountA,,) = router.addLiquidityETH{value: amountEthLiquidity}(
                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 revenueBalance = (amountETHafterLP * revenueProportion) / (devProportion + revenueProportion);
        uint256 devBalance = amountETHafterLP - revenueBalance;

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

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

    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)) - (accLpFees + accDevFees + accRevenueFees));
    }

    receive() external payable {}
}

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

Contract Security Audit

Contract ABI

[{"inputs":[{"internalType":"address","name":"initialRouterAddress","type":"address"},{"internalType":"address","name":"initialLockerAddress","type":"address"},{"internalType":"address","name":"initialRewardPoolAddress","type":"address"},{"internalType":"address","name":"initialRevenueAddress","type":"address"},{"internalType":"address","name":"_nftWhitelist","type":"address"}],"stateMutability":"nonpayable","type":"constructor"},{"inputs":[],"name":"ETHTransferFail","type":"error"},{"inputs":[],"name":"InsufficientLiquidity","type":"error"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"previousOwner","type":"address"},{"indexed":true,"internalType":"address","name":"newOwner","type":"address"}],"name":"OwnershipTransferred","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"_address","type":"address"}],"name":"TokenCreated","type":"event"},{"inputs":[{"internalType":"address","name":"tokenAddress","type":"address"},{"components":[{"internalType":"address[]","name":"whitelists","type":"address[]"}],"internalType":"struct ProofReflectionFactory.WhitelistAdd_","name":"_WhitelistAdd","type":"tuple"}],"name":"addmoreWhitelist","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"tokenAddress","type":"address"}],"name":"cancelToken","outputs":[],"stateMutability":"nonpayable","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":"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"},{"internalType":"uint256","name":"unlockTime","type":"uint256"},{"internalType":"address","name":"devWallet","type":"address"},{"internalType":"uint256","name":"whitelistPeriod","type":"uint256"},{"internalType":"address[]","name":"whitelists","type":"address[]"}],"internalType":"struct ProofReflectionFactory.TokenParam","name":"tokenParam_","type":"tuple"}],"name":"createToken","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[],"name":"distributeExcessFunds","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"tokenAddress","type":"address"}],"name":"finalizeToken","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[],"name":"initializeMinLiq","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"user","type":"address"}],"name":"isWhitelisted","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"lockerAddress","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"nftWhitelist","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"owner","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":"proofRevenueAddress","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"proofRewardPoolAddress","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"revenueAddress","outputs":[{"internalType":"address payable","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"rewardPoolAddress","outputs":[{"internalType":"address payable","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"routerAddress","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"newlockerAddress","type":"address"}],"name":"setLockerAddress","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"newNFTWhitelist","type":"address"}],"name":"setNFTWhitelist","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"newProofAdmin","type":"address"}],"name":"setProofAdmin","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"newRevenueAddress","type":"address"}],"name":"setRevenueAddress","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"newRewardPoolAddress","type":"address"}],"name":"setRewardPoolAddress","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"newRouterAddress","type":"address"}],"name":"setRouterAddress","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address[]","name":"users","type":"address[]"},{"internalType":"bool[]","name":"statuses","type":"bool[]"}],"name":"setWhitelist","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"validatedPairs","outputs":[{"internalType":"bool","name":"status","type":"bool"},{"internalType":"address","name":"pair","type":"address"},{"internalType":"address","name":"owner","type":"address"},{"internalType":"uint256","name":"unlockTime","type":"uint256"},{"internalType":"uint256","name":"lockId","type":"uint256"}],"stateMutability":"view","type":"function"},{"stateMutability":"payable","type":"receive"}]

608060405260006009553480156200001657600080fd5b506040516200619038038062006190833981016040819052620000399162000120565b6200004433620000b3565b600480546001600160a01b039687166001600160a01b031991821617909155600580549587169582169590951790945560038054851633179055600780549286169285169290921790915560088054928516928416929092179091556006805491909316911617905562000190565b600080546001600160a01b038381166001600160a01b0319831681178455604051919092169283917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e09190a35050565b80516001600160a01b03811681146200011b57600080fd5b919050565b600080600080600060a086880312156200013957600080fd5b620001448662000103565b9450620001546020870162000103565b9350620001646040870162000103565b9250620001746060870162000103565b9150620001846080870162000103565b90509295509295909350565b615ff080620001a06000396000f3fe608060405260043610620001a55760003560e01c806370a7899111620000e2578063b24cf5d71162000095578063d7e7a9e7116200006c578063d7e7a9e71462000547578063e6a053d01462000567578063f2fde38b146200058c578063f4f1af3a14620005b157600080fd5b8063b24cf5d714620004db578063b410908d1462000500578063c5aa0062146200052257600080fd5b806370a78991146200041f578063715018a6146200044457806373caf536146200045c578063845a51ec14620004815780638da5cb5b14620004a35780639a97b07814620004c357600080fd5b80633690e287116200015857806341cb87fc116200012f57806341cb87fc146200038e57806345338d6314620003b357806359a51c3414620003d8578063653ed5d414620003fa57600080fd5b80633690e28714620002fb5780633af32abf146200031b5780633b99adf7146200036957600080fd5b80630ab16c1914620001b25780630bc337d814620001f15780632dcacf44146200020b5780633268cc5614620002a05780633501a34814620002c25780633675f29b14620002d957600080fd5b36620001ad57005b600080fd5b348015620001bf57600080fd5b50600654620001d4906001600160a01b031681565b6040516001600160a01b0390911681526020015b60405180910390f35b348015620001fe57600080fd5b5062000209620005c8565b005b3480156200021857600080fd5b50620002696200022a3660046200168b565b6001602081905260009182526040909120805491810154600282015460039092015460ff8416936001600160a01b036101009091048116939216919085565b6040805195151586526001600160a01b03948516602087015292909316918401919091526060830152608082015260a001620001e8565b348015620002ad57600080fd5b50600454620001d4906001600160a01b031681565b62000209620002d336600462001845565b62000629565b348015620002e657600080fd5b50600554620001d4906001600160a01b031681565b3480156200030857600080fd5b506007546001600160a01b0316620001d4565b3480156200032857600080fd5b50620003586200033a3660046200168b565b6001600160a01b031660009081526002602052604090205460ff1690565b6040519015158152602001620001e8565b3480156200037657600080fd5b5062000209620003883660046200199b565b62000b80565b3480156200039b57600080fd5b5062000209620003ad3660046200168b565b62000c5d565b348015620003c057600080fd5b5062000209620003d23660046200168b565b62000c89565b348015620003e557600080fd5b50600354620001d4906001600160a01b031681565b3480156200040757600080fd5b5062000209620004193660046200168b565b62000cb5565b3480156200042c57600080fd5b50620002096200043e3660046200168b565b62000f44565b3480156200045157600080fd5b506200020962000f70565b3480156200046957600080fd5b50620002096200047b36600462001a6d565b62000f88565b3480156200048e57600080fd5b50600854620001d4906001600160a01b031681565b348015620004b057600080fd5b506000546001600160a01b0316620001d4565b348015620004d057600080fd5b506200020962001005565b348015620004e857600080fd5b5062000209620004fa3660046200168b565b6200110c565b3480156200050d57600080fd5b50600754620001d4906001600160a01b031681565b3480156200052f57600080fd5b5062000209620005413660046200168b565b62001138565b3480156200055457600080fd5b506008546001600160a01b0316620001d4565b3480156200057457600080fd5b5062000209620005863660046200168b565b62001164565b3480156200059957600080fd5b5062000209620005ab3660046200168b565b62001190565b62000209620005c23660046200168b565b62001200565b620005d2620014fa565b600954156200061b5760405162461bcd60e51b815260206004820152601060248201526f185b1c9958591e48195e1958dd5d195960821b60448201526064015b60405180910390fd5b670de0b6b3a7640000600955565b620006384262278d0062001b26565b8161014001511015620006795760405162461bcd60e51b81526020600482015260086024820152673c3330206461797360c01b604482015260640162000612565b6009543410156200069d5760405163bb55fd2760e01b815260040160405180910390fd5b60006040518060c00160405280836080015181526020018360a0015181526020018360c0015181526020018360e001518152602001836101000151815260200183610120015181525090506000604051620006f89062001655565b604051809103906000f08015801562000715573d6000803e3d6000fd5b5060405163f2fde38b60e01b81523360048201529091506001600160a01b0382169063f2fde38b90602401600060405180830381600087803b1580156200075b57600080fd5b505af115801562000770573d6000803e3d6000fd5b5050604080516101608082018352875182526020808901519083015287830151828401526060808901519083015261018088015160808301523360a08301528701516001600160a01b0390811660c083015260048054821660e084015260035482166101008401526101a08901516101208401526006548216610140840152925163113af4ad60e11b81529086169450632275e95a9350620008159287910162001bd0565b600060405180830381600087803b1580156200083057600080fd5b505af115801562000845573d6000803e3d6000fd5b50506040516001600160a01b03841681527f2e2b3f61b70d2d131b2a807371103cc98d51adcaa5e9a8f9c32658ad8426e74e9250602001905060405180910390a1341562000a0c576004805460405163095ea7b360e01b81526001600160a01b0391821692810192909252600019602483015282169063095ea7b3906044016020604051808303816000875af1158015620008e4573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906200090a919062001d0f565b50600480546040516370a0823160e01b815230928101929092526001600160a01b0390811691829163f305d7199134918691908216906370a0823190602401602060405180830381865afa15801562000967573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906200098d919062001d2f565b600080306200099e42606f62001b26565b6040518863ffffffff1660e01b8152600401620009c19695949392919062001d49565b60606040518083038185885af1158015620009e0573d6000803e3d6000fd5b50505050506040513d601f19601f8201168201806040525081019062000a07919062001d84565b505050505b806001600160a01b031663fbd757536040518163ffffffff1660e01b8152600401600060405180830381600087803b15801562000a4857600080fd5b505af115801562000a5d573d6000803e3d6000fd5b505050506040518060a00160405280600015158152602001826001600160a01b031663a8aa1b316040518163ffffffff1660e01b8152600401602060405180830381865afa15801562000ab4573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019062000ada919062001db3565b6001600160a01b03908116825233602080840191909152610140969096015160408084019190915260006060938401819052948216855260018088529481902084518154988601516001600160a81b0319909916901515610100600160a81b031916179783166101000297909717875583015193860180546001600160a01b03191694909116939093179092559081015160028401556080015160039092019190915550565b62000b8a620014fa565b81518151811462000bce5760405162461bcd60e51b815260206004820152600d60248201526c0d8d2e6e840dad2e6dac2e8c6d609b1b604482015260640162000612565b60005b8181101562000c575782818151811062000bef5762000bef62001dd3565b60200260200101516002600086848151811062000c105762000c1062001dd3565b6020908102919091018101516001600160a01b03168252810191909152604001600020805460ff19169115159190911790558062000c4e8162001de9565b91505062000bd1565b50505050565b62000c67620014fa565b600480546001600160a01b0319166001600160a01b0392909216919091179055565b62000c93620014fa565b600780546001600160a01b0319166001600160a01b0392909216919091179055565b62000cc08162001556565b6001600160a01b03818116600090815260016020819052604091829020805491015460048054935163095ea7b360e01b815293851690840181905260001960248501526101009092048416931691839063095ea7b3906044016020604051808303816000875af115801562000d39573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019062000d5f919062001d0f565b506040516370a0823160e01b81523060048201526000906001600160a01b038516906370a0823190602401602060405180830381865afa15801562000da8573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019062000dce919062001d2f565b9050846001600160a01b031663546a88116040518163ffffffff1660e01b8152600401600060405180830381600087803b15801562000e0c57600080fd5b505af115801562000e21573d6000803e3d6000fd5b5050604051629d473b60e21b81526001600160a01b03851692506302751cec915062000e5d908890859060009081908a90429060040162001d49565b60408051808303816000875af115801562000e7c573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019062000ea2919062001e05565b5050846001600160a01b031663fbd757536040518163ffffffff1660e01b8152600401600060405180830381600087803b15801562000ee057600080fd5b505af115801562000ef5573d6000803e3d6000fd5b5050506001600160a01b039095166000908152600160208190526040822080546001600160a81b031916815590810180546001600160a01b031916905560028101829055600301555050505050565b62000f4e620014fa565b600380546001600160a01b0319166001600160a01b0392909216919091179055565b62000f7a620014fa565b62000f86600062001605565b565b62000f938262001556565b6040805160208101825282518152905163e572967b60e01b81526001600160a01b0384169163e572967b9162000fcd919060040162001e2a565b600060405180830381600087803b15801562000fe857600080fd5b505af115801562000ffd573d6000803e3d6000fd5b505050505050565b6200100f620014fa565b6007546000906001600160a01b03166200102b60024762001e4f565b604051600081818185875af1925050503d806000811462001069576040519150601f19603f3d011682016040523d82523d6000602084013e6200106e565b606091505b505090508062001091576040516301c91b3d60e21b815260040160405180910390fd5b6008546040516000916001600160a01b03169047908381818185875af1925050503d8060008114620010e0576040519150601f19603f3d011682016040523d82523d6000602084013e620010e5565b606091505b505090508062001108576040516301c91b3d60e21b815260040160405180910390fd5b5050565b62001116620014fa565b600880546001600160a01b0319166001600160a01b0392909216919091179055565b62001142620014fa565b600680546001600160a01b0319166001600160a01b0392909216919091179055565b6200116e620014fa565b600580546001600160a01b0319166001600160a01b0392909216919091179055565b6200119a620014fa565b6001600160a01b038116620011f25760405162461bcd60e51b815260206004820152601d60248201527f6e6577206f776e657220697320746865207a65726f2061646472657373000000604482015260640162000612565b620011fd8162001605565b50565b6200120b8162001556565b6001600160a01b03818116600090815260016020526040908190208054600290910154600554925163095ea7b360e01b8152928416600484015260001960248401526101009091049092169190829063095ea7b3906044016020604051808303816000875af115801562001283573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190620012a9919062001d0f565b506040516370a0823160e01b81523060048201526000906001600160a01b038416906370a0823190602401602060405180830381865afa158015620012f2573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019062001318919062001d2f565b600554604051635af06fed60e01b81526001600160a01b038681166004830152336024830152604482018490526064820186905260006084830181905260a4830181905293945090911690635af06fed90349060c40160206040518083038185885af11580156200138d573d6000803e3d6000fd5b50505050506040513d601f19601f82011682018060405250810190620013b4919062001d2f565b6001600160a01b038616600081815260016020526040808220600301849055805163f576f53960e01b81529051939450919263f576f53992600480820193929182900301818387803b1580156200140a57600080fd5b505af11580156200141f573d6000803e3d6000fd5b50505050846001600160a01b031663fbd757536040518163ffffffff1660e01b8152600401600060405180830381600087803b1580156200145f57600080fd5b505af115801562001474573d6000803e3d6000fd5b50505050846001600160a01b03166327193bc46040518163ffffffff1660e01b8152600401600060405180830381600087803b158015620014b457600080fd5b505af1158015620014c9573d6000803e3d6000fd5b5050506001600160a01b039095166000908152600160208190526040909120805460ff191690911790555050505050565b6000546001600160a01b0316331462000f865760405162461bcd60e51b815260206004820152601760248201527f63616c6c6572206973206e6f7420746865206f776e6572000000000000000000604482015260640162000612565b6001600160a01b0381811660009081526001602081905260409091200154163314620015ae5760405162461bcd60e51b815260206004820152600660248201526510b7bbb732b960d11b604482015260640162000612565b6001600160a01b03811660009081526001602052604090205460ff1615620011fd5760405162461bcd60e51b81526020600482015260096024820152681d985b1a59185d195960ba1b604482015260640162000612565b600080546001600160a01b038381166001600160a01b0319831681178455604051919092169283917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e09190a35050565b6141488062001e7383390190565b6001600160a01b0381168114620011fd57600080fd5b8035620016868162001663565b919050565b6000602082840312156200169e57600080fd5b8135620016ab8162001663565b9392505050565b634e487b7160e01b600052604160045260246000fd5b6040516101c0810167ffffffffffffffff81118282101715620016ef57620016ef620016b2565b60405290565b604051601f8201601f1916810167ffffffffffffffff81118282101715620017215762001721620016b2565b604052919050565b600082601f8301126200173b57600080fd5b813567ffffffffffffffff811115620017585762001758620016b2565b6200176d601f8201601f1916602001620016f5565b8181528460208386010111156200178357600080fd5b816020850160208301376000918101602001919091529392505050565b600067ffffffffffffffff821115620017bd57620017bd620016b2565b5060051b60200190565b600082601f830112620017d957600080fd5b81356020620017f2620017ec83620017a0565b620016f5565b82815260059290921b840181019181810190868411156200181257600080fd5b8286015b848110156200183a5780356200182c8162001663565b835291830191830162001816565b509695505050505050565b6000602082840312156200185857600080fd5b813567ffffffffffffffff808211156200187157600080fd5b908301906101c082860312156200188757600080fd5b62001891620016c8565b823582811115620018a157600080fd5b620018af8782860162001729565b825250602083013582811115620018c557600080fd5b620018d38782860162001729565b60208301525060408301356040820152606083013560608201526080830135608082015260a083013560a082015260c083013560c082015260e083013560e08201526101008084013581830152506101208084013581830152506101408084013581830152506101606200194981850162001679565b9082015261018083810135908201526101a080840135838111156200196d57600080fd5b6200197b88828701620017c7565b918301919091525095945050505050565b8015158114620011fd57600080fd5b60008060408385031215620019af57600080fd5b823567ffffffffffffffff80821115620019c857600080fd5b620019d686838701620017c7565b9350602091508185013581811115620019ee57600080fd5b85019050601f8101861362001a0257600080fd5b803562001a13620017ec82620017a0565b81815260059190911b8201830190838101908883111562001a3357600080fd5b928401925b8284101562001a5e57833562001a4e816200198c565b8252928401929084019062001a38565b80955050505050509250929050565b6000806040838503121562001a8157600080fd5b823562001a8e8162001663565b9150602083013567ffffffffffffffff8082111562001aac57600080fd5b908401906020828703121562001ac157600080fd5b60405160208101818110838211171562001adf5762001adf620016b2565b60405282358281111562001af257600080fd5b62001b0088828601620017c7565b8252508093505050509250929050565b634e487b7160e01b600052601160045260246000fd5b8082018082111562001b3c5762001b3c62001b10565b92915050565b6000815180845260005b8181101562001b6a5760208185018101518683018201520162001b4c565b506000602082860101526020601f19601f83011685010191505092915050565b600081518084526020808501945080840160005b8381101562001bc55781516001600160a01b03168752958201959082019060010162001b9e565b509495945050505050565b60e08152600083516101608060e085015262001bf161024085018362001b42565b9150602086015160df1961010081878603018188015262001c13858462001b42565b945060408901519250610120838189015260608a0151935061014084818a015260808b0151868a015260a08b0151955062001c5a6101808a01876001600160a01b03169052565b60c08b01516001600160a01b039081166101a08b015260e08c015181166101c08b0152838c0151166101e08a0152818b015189880385016102008b0152955062001ca5878762001b8a565b9650808b01519550505050505062001cc96102208501826001600160a01b03169052565b509050620016ab6020830184805182526020810151602083015260408101516040830152606081015160608301526080810151608083015260a081015160a08301525050565b60006020828403121562001d2257600080fd5b8151620016ab816200198c565b60006020828403121562001d4257600080fd5b5051919050565b6001600160a01b039687168152602081019590955260408501939093526060840191909152909216608082015260a081019190915260c00190565b60008060006060848603121562001d9a57600080fd5b8351925060208401519150604084015190509250925092565b60006020828403121562001dc657600080fd5b8151620016ab8162001663565b634e487b7160e01b600052603260045260246000fd5b60006001820162001dfe5762001dfe62001b10565b5060010190565b6000806040838503121562001e1957600080fd5b505080516020909101519092909150565b602081526000825160208084015262001e47604084018262001b8a565b949350505050565b60008262001e6d57634e487b7160e01b600052601260045260246000fd5b50049056fe6080604052600e805460ff60a01b1916600160a01b1790556000601c819055601d819055601e819055601f819055602055600260218190556022556023805461ffff19169055602a805461010160a81b61ffff60a81b199091161790553480156200006957600080fd5b5062000075336200008d565b602980546001600160a01b03191633179055620000dd565b600080546001600160a01b038381166001600160a01b0319831681178455604051919092169283917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e09190a35050565b61405b80620000ed6000396000f3fe6080604052600436106103b15760003560e01c80637d1db4a5116101e7578063c45a01551161010d578063e572967b116100a0578063f576f5391161006f578063f576f53914610ab1578063f887ea4014610ac6578063fabe628314610ae6578063fbd7575314610b0657600080fd5b8063e572967b14610a3b578063ebdfd72214610a5b578063f16fd78d14610a71578063f2fde38b14610a9157600080fd5b8063d4fb9a01116100dc578063d4fb9a0114610984578063d741b9c3146109a5578063d920334e146109d5578063dd62ed3e146109f557600080fd5b8063c45a015514610918578063ca987b0e14610938578063cb29813c1461094e578063cc6badb31461096e57600080fd5b80639502c42611610185578063a8aa1b3111610154578063a8aa1b31146108ac578063a9059cbb146108cc578063b48e665e146108ec578063bf56b3711461090257600080fd5b80639502c4261461084157806395d89b4114610857578063a3a2e89e1461086c578063a457c2d71461088c57600080fd5b806388cda873116101c157806388cda873146107b45780638b42507f146107d35780638da5cb5b146108035780638ea5220f1461082157600080fd5b80637d1db4a51461076e578063838420131461078457806383ad79941461079e57600080fd5b80633af32abf116102d757806359a51c341161026a57806370a082311161023957806370a082311461070257806370c757ec14610722578063715018a6146107435780637c0ff2051461075857600080fd5b806359a51c34146106a15780635fef8680146106c15780636827e764146106d6578063704ce43e146106ec57600080fd5b8063497a000a116102a6578063497a000a1461062b5780634a74bb021461064b57806352390c021461066c578063546a88111461068c57600080fd5b80633af32abf146105a55780633dab5269146105c55780633f4218e0146105e5578063461e5d3f1461061557600080fd5b8063220f66961161034f578063313ce5671161031e578063313ce567146105335780633685d4191461054f57806336e4ec641461056f578063395093511461058557600080fd5b8063220f6696146104bd5780632275e95a146104de57806323b872dd146104fe57806327193bc41461051e57600080fd5b80630ab16c191161038b5780630ab16c191461043857806318160ddd146104705780631df4ccfc146104855780631f53ac021461049b57600080fd5b80630445b667146103bd57806306fdde03146103e6578063095ea7b31461040857600080fd5b366103b857005b600080fd5b3480156103c957600080fd5b506103d360075481565b6040519081526020015b60405180910390f35b3480156103f257600080fd5b506103fb610b1b565b6040516103dd919061377f565b34801561041457600080fd5b506104286104233660046137f2565b610bad565b60405190151581526020016103dd565b34801561044457600080fd5b50600e54610458906001600160a01b031681565b6040516001600160a01b0390911681526020016103dd565b34801561047c57600080fd5b506004546103d3565b34801561049157600080fd5b506103d3601a5481565b3480156104a757600080fd5b506104bb6104b636600461381e565b610bc4565b005b3480156104c957600080fd5b50602a5461042890600160a01b900460ff1681565b3480156104ea57600080fd5b506104bb6104f9366004613a1f565b610bee565b34801561050a57600080fd5b50610428610519366004613b62565b6113c8565b34801561052a57600080fd5b506104bb611482565b34801561053f57600080fd5b50604051600981526020016103dd565b34801561055b57600080fd5b506104bb61056a36600461381e565b611501565b34801561057b57600080fd5b506103d360215481565b34801561059157600080fd5b506104286105a03660046137f2565b6116e0565b3480156105b157600080fd5b506104286105c036600461381e565b61171a565b3480156105d157600080fd5b506104bb6105e0366004613bb1565b611738565b3480156105f157600080fd5b5061042861060036600461381e565b600f6020526000908152604090205460ff1681565b34801561062157600080fd5b506103d360225481565b34801561063757600080fd5b506104bb610646366004613bcf565b611762565b34801561065757600080fd5b50602a5461042890600160a81b900460ff1681565b34801561067857600080fd5b506104bb61068736600461381e565b6117c2565b34801561069857600080fd5b506104bb6118e6565b3480156106ad57600080fd5b50600c54610458906001600160a01b031681565b3480156106cd57600080fd5b506104bb61197d565b3480156106e257600080fd5b506103d360165481565b3480156106f857600080fd5b506103d360155481565b34801561070e57600080fd5b506103d361071d36600461381e565b6119c1565b34801561072e57600080fd5b50600e5461042890600160a01b900460ff1681565b34801561074f57600080fd5b506104bb611a20565b34801561076457600080fd5b506103d360185481565b34801561077a57600080fd5b506103d3602b5481565b34801561079057600080fd5b506023546104289060ff1681565b3480156107aa57600080fd5b506103d360145481565b3480156107c057600080fd5b5060235461042890610100900460ff1681565b3480156107df57600080fd5b506104286107ee36600461381e565b60116020526000908152604090205460ff1681565b34801561080f57600080fd5b506000546001600160a01b0316610458565b34801561082d57600080fd5b50602a54610458906001600160a01b031681565b34801561084d57600080fd5b506103d360195481565b34801561086357600080fd5b506103fb611a32565b34801561087857600080fd5b506104bb610887366004613be8565b611a41565b34801561089857600080fd5b506104286108a73660046137f2565b611a74565b3480156108b857600080fd5b50602854610458906001600160a01b031681565b3480156108d857600080fd5b506104286108e73660046137f2565b611af5565b3480156108f857600080fd5b506103d360095481565b34801561090e57600080fd5b506103d360135481565b34801561092457600080fd5b50602954610458906001600160a01b031681565b34801561094457600080fd5b506103d3601b5481565b34801561095a57600080fd5b506104bb610969366004613c21565b611b03565b34801561097a57600080fd5b506103d360175481565b34801561099057600080fd5b50602a5461042890600160b01b900460ff1681565b3480156109b157600080fd5b506104286109c036600461381e565b600d6020526000908152604090205460ff1681565b3480156109e157600080fd5b506104bb6109f0366004613bcf565b611d4f565b348015610a0157600080fd5b506103d3610a10366004613c64565b6001600160a01b03918216600090815260036020908152604080832093909416825291909152205490565b348015610a4757600080fd5b506104bb610a56366004613c92565b611df6565b348015610a6757600080fd5b506103d360085481565b348015610a7d57600080fd5b506104bb610a8c36600461381e565b611e2e565b348015610a9d57600080fd5b506104bb610aac36600461381e565b611e92565b348015610abd57600080fd5b506104bb611ef9565b348015610ad257600080fd5b50602754610458906001600160a01b031681565b348015610af257600080fd5b506104bb610b01366004613be8565b61204d565b348015610b1257600080fd5b506104bb612080565b6060600a8054610b2a90613d15565b80601f0160208091040260200160405190810160405280929190818152602001828054610b5690613d15565b8015610ba35780601f10610b7857610100808354040283529160200191610ba3565b820191906000526020600020905b815481529060010190602001808311610b8657829003601f168201915b5050505050905090565b6000610bba3384846120cb565b5060015b92915050565b610bcc6121be565b602a80546001600160a01b0319166001600160a01b0392909216919091179055565b6029546001600160a01b03163314610c18576040516282b42960e81b815260040160405180910390fd5b8151600a90610c279082613d9d565b506020820151600b90610c3a9082613d9d565b50816040015160046000828254610c519190613e73565b9091555050600454610c6590600019613e9c565b610c7190600019613eb0565b60059081556040830151610fa091610c899190613ec3565b610c939190613eda565b600755606082015160461115610cd95760405162461bcd60e51b815260206004820152600660248201526506c6f77206c760d41b60448201526064015b60405180910390fd5b6000606483606001518460400151610cf19190613ec3565b610cfb9190613eda565b90506000818460400151610d0f9190613eb0565b9050606484604001516001610d249190613ec3565b610d2e9190613eda565b602b5560e0840151602780546001600160a01b0319166001600160a01b0390921691821790556040805163c45a015560e01b8152905163c45a0155916004818101926020929091908290030181865afa158015610d8f573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610db39190613eee565b6001600160a01b031663c9c65396602760009054906101000a90046001600160a01b03166001600160a01b031663ad5c46486040518163ffffffff1660e01b8152600401602060405180830381865afa158015610e14573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610e389190613eee565b6040516001600160e01b031960e084901b1681526001600160a01b0390911660048201523060248201526044016020604051808303816000875af1158015610e84573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610ea89190613eee565b602880546001600160a01b0319166001600160a01b039283161781553060008181526003602090815260408083206027548716845282528083206000199055838352600f8252808320805460ff19908116600190811790925560298054891686528386208054831684179055958552600d90935281842080548416821790559354861683528083208054831685179055935485168252838220805482168417905560a089015185168252838220805482168417905561010089015185168252838220805482168417905560e08901519094168152919091208054909216179055610120840151610f9790612218565b610140840151600e80546001600160a01b0319166001600160a01b03928316179055306000818152601160209081526040808320805460ff19908116600190811790925560a0808c0151881686528386208054831684179055602880548916875284872080548416851790556029548916875284872080548416851790557f97847ee99463795296047093514439c3127772df3715e628aa85601cf854171680548416851790557f4ad3b33220dddc71b994a52d72c06b10862965f7d926534c05c00fb7e819e7b780548416851790555490971685526010845282852080548216831790559484529281902080549094169092179092556080808801516009558651601481905591870151601581905590870151601681905592870151601755606087015160185592860151601955916110d091613e73565b6110da9190613e73565b6000036110e75760006021555b602154836040015184608001516110fe9190613e73565b6111089190613e73565b601a556020830151606084015160a08501516111249190613e73565b61112e9190613e73565b60000361113b5760006022555b60225483606001518460a001516111529190613e73565b61115c9190613e73565b601b5560295460a0850151604051633af32abf60e01b81526001600160a01b039182166004820152911690633af32abf90602401602060405180830381865afa1580156111ad573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906111d19190613f0b565b1561123e578251601a54600c916111e791613e73565b1115611206576040516314041af760e31b815260040160405180910390fd5b60118360200151601b5461121a9190613e73565b1115611239576040516314041af760e31b815260040160405180910390fd5b6112a1565b8251601a5460079161124f91613e73565b111561126e576040516314041af760e31b815260040160405180910390fd5b60078360200151601b546112829190613e73565b11156112a1576040516314041af760e31b815260040160405180910390fd5b60c0840151602a80546001600160a01b039283166001600160a01b031991821617909155610100860151600c8054919093169116179055600554600080805260016020527fa6eef7e35abe7026729641147f7915573c7e97b47efa546f5f6e3230263bcb498054909190611316908490613e73565b90915550611328905060003384612286565b61133860008560a0015183612286565b60405182815233906000907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef9060200160405180910390a38360a001516001600160a01b031660006001600160a01b03167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef836040516113ba91815260200190565b60405180910390a350505050565b60006113d584848461237f565b6001600160a01b038416600090815260036020908152604080832033845290915290205482111561143d5760405162461bcd60e51b81526020600482015260126024820152717472616e7366416d743e616c6c6f776e636560701b6044820152606401610cd0565b6001600160a01b038416600090815260036020908152604080832033808552925290912054611478918691611473908690613eb0565b6120cb565b5060019392505050565b6029546001600160a01b031633146114ac576040516282b42960e81b815260040160405180910390fd5b601354156114cd576040516319f4db0f60e31b815260040160405180910390fd5b426013556009546114df90603c613ec3565b6114e99042613e73565b600855600e805460ff60a01b1916600160a01b179055565b6115096121be565b6001600160a01b03811660009081526010602052604090205460ff166115645760405162461bcd60e51b815260206004820152601060248201526f185b1c9958591e48195e18db1d59195960821b6044820152606401610cd0565b306001600160a01b038216036115bc5760405162461bcd60e51b815260206004820152601960248201527f636f6e7472616374206d757374206265206578636c75646564000000000000006044820152606401610cd0565b60005b6012548110156116dc57816001600160a01b0316601282815481106115e6576115e6613f28565b6000918252602090912001546001600160a01b0316036116ca576012805461161090600190613eb0565b8154811061162057611620613f28565b600091825260209091200154601280546001600160a01b03909216918390811061164c5761164c613f28565b600091825260208083209190910180546001600160a01b0319166001600160a01b039485161790559184168152600282526040808220829055601090925220805460ff1916905560128054806116a4576116a4613f3e565b600082815260209020810160001990810180546001600160a01b03191690550190555050565b806116d481613f54565b9150506115bf565b5050565b3360008181526003602090815260408083206001600160a01b03871684529091528120549091906114789082908690611473908790613e73565b6001600160a01b03166000908152600d602052604090205460ff1690565b6117406121be565b602a8054921515600160a81b0260ff60a81b1990931692909217909155600755565b600c546001600160a01b0316331461178c576040516282b42960e81b815260040160405180910390fd5b600981905561179c81603c613ec3565b6013546117a99190613e73565b60085550600e805460ff60a01b1916600160a01b179055565b6117ca6121be565b6001600160a01b03811660009081526010602052604090205460ff16156118265760405162461bcd60e51b815260206004820152601060248201526f185b1c9958591e48195e18db1d59195960821b6044820152606401610cd0565b6001600160a01b03811660009081526001602052604090205415611880576001600160a01b03811660009081526001602052604090205461186690612972565b6001600160a01b0382166000908152600260205260409020555b6001600160a01b03166000818152601060205260408120805460ff191660019081179091556012805491820181559091527fbb8a6a4669ba250d26cd7a459eca9d215f8307e33aebe50379bc5a3617ec34440180546001600160a01b0319169091179055565b6029546001600160a01b03163314611910576040516282b42960e81b815260040160405180910390fd5b602780546001600160a01b039081166000908152600f602090815260408083208054600160ff19918216811790925595548516845260119092528083208054861683179055825490931682529190208054909216179055602a805461ffff60a81b1916600160b01b179055565b6119856121be565b6119bf303360265460255460245461199d9190613e73565b6119a79190613e73565b6119b0306119c1565b6119ba9190613eb0565b61237f565b565b6001600160a01b03811660009081526010602052604081205460ff16156119fe57506001600160a01b031660009081526002602052604090205490565b6001600160a01b038216600090815260016020526040902054610bbe90612972565b611a286121be565b6119bf60006129d7565b6060600b8054610b2a90613d15565b611a496121be565b6001600160a01b03919091166000908152600f60205260409020805460ff1916911515919091179055565b3360008181526003602090815260408083206001600160a01b038716845290915281205490919083811015611add5760405162461bcd60e51b815260206004820152600f60248201526e696e7375666620416c6c6f776e636560881b6044820152606401610cd0565b611aea82868684036120cb565b506001949350505050565b60003361147881858561237f565b611b0b6121be565b6000806013546228de80611b1f9190613e73565b42118015611b2e575060135415155b15611b3e57506000905080611b74565b601354611b4e9062015180613e73565b42118015611b5d575060135415155b15611b6d57506001905080611b74565b5060029050805b60148890556015869055601684905560178790556018859055601983905587611b9d8786613e73565b611ba79190613e73565b600003611bb357600091505b81611bbe8786613e73565b611bc89190613e73565b601a5586611bd68685613e73565b611be09190613e73565b600003611beb575060005b80601854601954611bfc9190613e73565b611c069190613e73565b601b5560218290556022819055602954604051633af32abf60e01b81523360048201526001600160a01b0390911690633af32abf90602401602060405180830381865afa158015611c5b573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611c7f9190613f0b565b15611ce757600c88601a54611c949190613e73565b1115611cb3576040516314041af760e31b815260040160405180910390fd5b601187601b54611cc39190613e73565b1115611ce2576040516314041af760e31b815260040160405180910390fd5b611d45565b600788601a54611cf79190613e73565b1115611d16576040516314041af760e31b815260040160405180910390fd5b600787601b54611d269190613e73565b1115611d45576040516314041af760e31b815260040160405180910390fd5b5050505050505050565b611d576121be565b601354600003611d7a57604051638dda39df60e01b815260040160405180910390fd5b6103e86004546005611d8c9190613ec3565b611d969190613eda565b811015611db657604051634802451160e01b815260040160405180910390fd5b60646004546003611dc79190613ec3565b611dd19190613eda565b811115611df157604051634802451160e01b815260040160405180910390fd5b602b55565b6029546001600160a01b03163314611e20576040516282b42960e81b815260040160405180910390fd5b8051611e2b90612218565b50565b600c546001600160a01b03163314611e58576040516282b42960e81b815260040160405180910390fd5b600c80546001600160a01b039092166001600160a01b0319909216821790556000908152600d60205260409020805460ff19166001179055565b611e9a6121be565b6001600160a01b038116611ef05760405162461bcd60e51b815260206004820152601d60248201527f6e6577206f776e657220697320746865207a65726f20616464726573730000006044820152606401610cd0565b611e2b816129d7565b6029546001600160a01b03163314611f23576040516282b42960e81b815260040160405180910390fd5b600e54604080516318160ddd60e01b815290516000926001600160a01b0316916318160ddd9160048083019260209291908290030181865afa158015611f6d573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611f919190613f6d565b611f9c906001613e73565b905060015b818110156116dc57600e546040516331a9108f60e11b815260048101839052600191600d916000916001600160a01b031690636352211e90602401602060405180830381865afa158015611ff9573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061201d9190613eee565b6001600160a01b031681526020810191909152604001600020805460ff1916911515919091179055600101611fa1565b6120556121be565b6001600160a01b03919091166000908152601160205260409020805460ff1916911515919091179055565b6029546001600160a01b031633146120aa576040516282b42960e81b815260040160405180910390fd5b602a805460ff60b01b198116600160b01b9182900460ff1615909102179055565b6001600160a01b0383166121155760405162461bcd60e51b815260206004820152601160248201527030b838393b10333937b690181030b2323960791b6044820152606401610cd0565b6001600160a01b03821661215d5760405162461bcd60e51b815260206004820152600f60248201526e30b838393b103a3790181030b2323960891b6044820152606401610cd0565b6001600160a01b0383811660008181526003602090815260408083209487168084529482529182902085905590518481527f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925910160405180910390a3505050565b6000546001600160a01b031633146119bf5760405162461bcd60e51b815260206004820152601760248201527f63616c6c6572206973206e6f7420746865206f776e65720000000000000000006044820152606401610cd0565b805160005b81811015612281576001600d600085848151811061223d5761223d613f28565b6020908102919091018101516001600160a01b03168252810191909152604001600020805460ff19169115159190911790558061227981613f54565b91505061221d565b505050565b60008060008060008061229887612a27565b6001600160a01b038f16600090815260016020526040902054959b509399509197509550935091506122cb908790613eb0565b6001600160a01b03808b1660009081526001602052604080822093909355908a16815220546122fb908690613e73565b6001600160a01b03891660009081526001602052604090205561231d81612a84565b6123278483612bcc565b876001600160a01b0316896001600160a01b03167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef8560405161236c91815260200190565b60405180910390a3505050505050505050565b6001600160a01b0383166123c95760405162461bcd60e51b81526020600482015260116024820152703a3930b739b31033393690181030b2323960791b6044820152606401610cd0565b6001600160a01b0382166124125760405162461bcd60e51b815260206004820152601060248201526f3a3930b739b3103a3790181030b2323960811b6044820152606401610cd0565b6000811161244d5760405162461bcd60e51b81526020600482015260086024820152671e995c9bc8105b5d60c21b6044820152606401610cd0565b602b548111158061249957506001600160a01b03831660009081526011602052604090205460ff16801561249957506001600160a01b03821660009081526011602052604090205460ff165b6124d55760405162461bcd60e51b815260206004820152600d60248201526c13585e08151608105b5bdd5b9d609a1b6044820152606401610cd0565b600e54600160a01b900460ff161561259b57600854421061250257600e805460ff60a01b1916905561259b565b6028546001600160a01b0390811690841603612543576125218261171a565b61253e57604051630b094f2760e31b815260040160405180910390fd5b61259b565b6028546001600160a01b0390811690831603612562576125218361171a565b61256b8361171a565b158061257d575061257b8261171a565b155b1561259b57604051630b094f2760e31b815260040160405180910390fd5b60235460ff161580156125af575060135415155b1561270157602354610100900460ff16612693576013546125d39062015180613e73565b42111561268e576014546015546016546125ed9190613e73565b6125f79190613e73565b15612603576001612606565b60005b60ff1660215560175460185460195461261f9190613e73565b6126299190613e73565b15612635576001612638565b60005b60ff166022556021546015546016546126519190613e73565b61265b9190613e73565b601a556022546018546019546126719190613e73565b61267b9190613e73565b601b556023805461ff0019166101001790555b612701565b6013546126a3906228de80613e73565b421115612701576000602181905560228190556015546016546126c69190613e73565b6126d09190613e73565b601a556022546018546019546126e69190613e73565b6126f09190613e73565b601b556023805460ff191660011790555b6000546001600160a01b0384811691161480159061272d57506000546001600160a01b03838116911614155b801561275257506001600160a01b03821660009081526011602052604090205460ff16155b156127f0576028546001600160a01b03848116911614801561278257506027546001600160a01b03838116911614155b80156127a757506001600160a01b0382166000908152600f602052604090205460ff16155b156127f057602a54600160b01b900460ff166127f05760405162461bcd60e51b81526020600482015260086024820152672174726164696e6760c01b6044820152606401610cd0565b602a54600160a01b900460ff1615801561281857506028546001600160a01b03848116911614155b801561282d5750602a54600160b01b900460ff165b80156128425750602a54600160a81b900460ff165b801561286c575060075460265460255460245461285f9190613e73565b6128699190613e73565b10155b1561287957612879612bf2565b6001600160a01b0383166000908152600f602052604090205460ff16806128b857506001600160a01b0382166000908152600f602052604090205460ff165b156128db576000601c819055601d819055601e819055601f819055602055612967565b6028546001600160a01b039081169083160361291457601b54601c55601754601d55602254601e55601954601f55601854602055612967565b6028546001600160a01b039081169084160361294d57601a54601c55601454601d55602154601e55601654601f55601554602055612967565b6000601c819055601d819055601e819055601f8190556020555b61228183838361323f565b60006005548211156129ba5760405162461bcd60e51b8152602060048201526011602482015270416d74203e20746f745265666c63746e7360781b6044820152606401610cd0565b60006129c461338e565b90506129d08184613eda565b9392505050565b600080546001600160a01b038381166001600160a01b0319831681178455604051919092169283917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e09190a35050565b6000806000806000806000806000612a448a601d54601c546133b1565b9250925092506000612a5461338e565b90506000806000612a678e87878761340f565b919e509c509a509598509396509194505050505091939550919395565b6000612a8e61338e565b90506000612a9c8284613ec3565b601f54601e546020549293509091600081612ab78486613e73565b612ac19190613e73565b30600090815260016020526040902054909150612adf908690613e73565b3060009081526001602090815260408083209390935560109052205460ff1615612b2f5730600090815260026020526040902054612b1e908890613e73565b306000908152600260205260409020555b80600003612b405750505050505050565b80612b4b8589613ec3565b612b559190613eda565b60256000828254612b669190613e73565b90915550819050612b778389613ec3565b612b819190613eda565b60246000828254612b929190613e73565b90915550819050612ba38489613ec3565b612bad9190613eda565b60266000828254612bbe9190613e73565b909155505050505050505050565b81600554612bda9190613eb0565b600555600654612beb908290613e73565b6006555050565b602a805460ff60a01b1916600160a01b179055600754602454602554602654600081612c1e8486613e73565b612c289190613e73565b9050600081612c378688613ec3565b612c419190613eda565b90506000612c50600283613eda565b9050612c5c8188613eb0565b600003612c6f5750505050505050613230565b6040805160028082526060820183526000926020830190803683370190505090503081600081518110612ca457612ca4613f28565b6001600160a01b03928316602091820292909201810191909152602754604080516315ab88c960e31b81529051919093169263ad5c46489260048083019391928290030181865afa158015612cfd573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612d219190613eee565b81600181518110612d3457612d34613f28565b6001600160a01b039283166020918202929092010152602754612d5a913091168a6120cb565b6027546001600160a01b031663791ac947612d75848b613eb0565b60008430426040518663ffffffff1660e01b8152600401612d9a959493929190613f86565b600060405180830381600087803b158015612db457600080fd5b505af1158015612dc8573d6000803e3d6000fd5b5047925060009150612ddc90508487613eb0565b612de68547613ec3565b612df09190613eda565b905060008415612e935760275460405163f305d71960e01b815230600482015260248101879052600060448201819052606482015261dead60848201524260a48201526001600160a01b039091169063f305d71990849060c40160606040518083038185885af1158015612e68573d6000803e3d6000fd5b50505050506040513d601f19601f82011682018060405250810190612e8d9190613ff7565b50909150505b612e9d8186613eb0565b612ea79087613eb0565b8a10612ed057612eb78186613eb0565b612ec19087613eb0565b612ecb908b613eb0565b612ed3565b60005b602455612ee08a88613eb0565b600003612ef7575050505050505050505050613230565b476000612f048a8c613e73565b612f0e8b84613ec3565b612f189190613eda565b90506000612f268284613eb0565b9050898c8f612f359190613ec3565b612f3f9190613eda565b8c10612f6b57898c8f612f529190613ec3565b612f5c9190613eda565b612f66908d613eb0565b612f6e565b60005b602581905550898b8f612f819190613ec3565b612f8b9190613eda565b8b10612fb757898b8f612f9e9190613ec3565b612fa89190613eda565b612fb2908c613eb0565b612fba565b60005b60265585156132215781156131a5576000612fd6600284613eda565b90506000602960009054906101000a90046001600160a01b03166001600160a01b0316633690e2876040518163ffffffff1660e01b8152600401602060405180830381865afa15801561302d573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906130519190613eee565b6001600160a01b03168260405160006040518083038185875af1925050503d806000811461309b576040519150601f19603f3d011682016040523d82523d6000602084013e6130a0565b606091505b50509050806130c2576040516301c91b3d60e21b815260040160405180910390fd5b6029546040805163d7e7a9e760e01b815290516000926001600160a01b03169163d7e7a9e79160048083019260209291908290030181865afa15801561310c573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906131309190613eee565b6001600160a01b03168360405160006040518083038185875af1925050503d806000811461317a576040519150601f19603f3d011682016040523d82523d6000602084013e61317f565b606091505b50509050806131a1576040516301c91b3d60e21b815260040160405180910390fd5b5050505b801561322157602a546040516000916001600160a01b03169083908381818185875af1925050503d80600081146131f8576040519150601f19603f3d011682016040523d82523d6000602084013e6131fd565b606091505b505090508061321f576040516301c91b3d60e21b815260040160405180910390fd5b505b50505050505050505050505050505b602a805460ff60a01b19169055565b6001600160a01b03831660009081526010602052604090205460ff16801561328057506001600160a01b03821660009081526010602052604090205460ff16155b1561329057612281838383613466565b6001600160a01b03831660009081526010602052604090205460ff161580156132d157506001600160a01b03821660009081526010602052604090205460ff165b156132e1576122818383836134db565b6001600160a01b03831660009081526010602052604090205460ff1615801561332357506001600160a01b03821660009081526010602052604090205460ff16155b1561333357612281838383612286565b6001600160a01b03831660009081526010602052604090205460ff16801561337357506001600160a01b03821660009081526010602052604090205460ff165b1561338357612281838383613587565b612281838383612286565b600080600061339b6135fc565b90925090506133aa8183613eda565b9250505090565b600080808060646133c28789613ec3565b6133cc9190613eda565b9050600060646133dc878a613ec3565b6133e69190613eda565b90506000816133f5848b613eb0565b6133ff9190613eb0565b9992985090965090945050505050565b600080808061341e8589613ec3565b9050600061342c8689613ec3565b9050600061343a8789613ec3565b90506000816134498486613eb0565b6134539190613eb0565b939b939a50919850919650505050505050565b60008060008060008061347887612a27565b6001600160a01b038f16600090815260026020526040902054959b509399509197509550935091506134ab908890613eb0565b6001600160a01b038a166000908152600260209081526040808320939093556001905220546122cb908790613eb0565b6000806000806000806134ed87612a27565b6001600160a01b038f16600090815260016020526040902054959b50939950919750955093509150613520908790613eb0565b6001600160a01b03808b16600090815260016020908152604080832094909455918b16815260029091522054613557908490613e73565b6001600160a01b0389166000908152600260209081526040808320939093556001905220546122fb908690613e73565b60008060008060008061359987612a27565b6001600160a01b038f16600090815260026020526040902054959b509399509197509550935091506135cc908890613eb0565b6001600160a01b038a16600090815260026020908152604080832093909355600190522054613520908790613eb0565b6005546004546000918291825b60125481101561374e5782600160006012848154811061362b5761362b613f28565b60009182526020808320909101546001600160a01b031683528201929092526040019020541180613696575081600260006012848154811061366f5761366f613f28565b60009182526020808320909101546001600160a01b03168352820192909252604001902054115b156136ac57600554600454945094505050509091565b60016000601283815481106136c3576136c3613f28565b60009182526020808320909101546001600160a01b031683528201929092526040019020546136f29084613eb0565b9250600260006012838154811061370b5761370b613f28565b60009182526020808320909101546001600160a01b0316835282019290925260400190205461373a9083613eb0565b91508061374681613f54565b915050613609565b5060045460055461375f9190613eda565b821015613776576005546004549350935050509091565b90939092509050565b600060208083528351808285015260005b818110156137ac57858101830151858201604001528201613790565b506000604082860101526040601f19601f8301168501019250505092915050565b6001600160a01b0381168114611e2b57600080fd5b80356137ed816137cd565b919050565b6000806040838503121561380557600080fd5b8235613810816137cd565b946020939093013593505050565b60006020828403121561383057600080fd5b81356129d0816137cd565b634e487b7160e01b600052604160045260246000fd5b604051610160810167ffffffffffffffff811182821017156138755761387561383b565b60405290565b604051601f8201601f1916810167ffffffffffffffff811182821017156138a4576138a461383b565b604052919050565b600082601f8301126138bd57600080fd5b813567ffffffffffffffff8111156138d7576138d761383b565b6138ea601f8201601f191660200161387b565b8181528460208386010111156138ff57600080fd5b816020850160208301376000918101602001919091529392505050565b600082601f83011261392d57600080fd5b8135602067ffffffffffffffff8211156139495761394961383b565b8160051b61395882820161387b565b928352848101820192828101908785111561397257600080fd5b83870192505b8483101561399a57823561398b816137cd565b82529183019190830190613978565b979650505050505050565b600060c082840312156139b757600080fd5b60405160c0810181811067ffffffffffffffff821117156139da576139da61383b565b8060405250809150823581526020830135602082015260408301356040820152606083013560608201526080830135608082015260a083013560a08201525092915050565b60008060e08385031215613a3257600080fd5b823567ffffffffffffffff80821115613a4a57600080fd5b908401906101608287031215613a5f57600080fd5b613a67613851565b823582811115613a7657600080fd5b613a82888286016138ac565b825250602083013582811115613a9757600080fd5b613aa3888286016138ac565b602083015250604083013560408201526060830135606082015260808301356080820152613ad360a084016137e2565b60a0820152613ae460c084016137e2565b60c0820152613af560e084016137e2565b60e0820152610100613b088185016137e2565b908201526101208381013583811115613b2057600080fd5b613b2c8982870161391c565b8284015250506101409150613b428284016137e2565b82820152809450505050613b5984602085016139a5565b90509250929050565b600080600060608486031215613b7757600080fd5b8335613b82816137cd565b92506020840135613b92816137cd565b929592945050506040919091013590565b8015158114611e2b57600080fd5b60008060408385031215613bc457600080fd5b823561381081613ba3565b600060208284031215613be157600080fd5b5035919050565b60008060408385031215613bfb57600080fd5b8235613c06816137cd565b91506020830135613c1681613ba3565b809150509250929050565b60008060008060008060c08789031215613c3a57600080fd5b505084359660208601359650604086013595606081013595506080810135945060a0013592509050565b60008060408385031215613c7757600080fd5b8235613c82816137cd565b91506020830135613c16816137cd565b600060208284031215613ca457600080fd5b813567ffffffffffffffff80821115613cbc57600080fd5b9083019060208286031215613cd057600080fd5b604051602081018181108382111715613ceb57613ceb61383b565b604052823582811115613cfd57600080fd5b613d098782860161391c565b82525095945050505050565b600181811c90821680613d2957607f821691505b602082108103613d4957634e487b7160e01b600052602260045260246000fd5b50919050565b601f82111561228157600081815260208120601f850160051c81016020861015613d765750805b601f850160051c820191505b81811015613d9557828155600101613d82565b505050505050565b815167ffffffffffffffff811115613db757613db761383b565b613dcb81613dc58454613d15565b84613d4f565b602080601f831160018114613e005760008415613de85750858301515b600019600386901b1c1916600185901b178555613d95565b600085815260208120601f198616915b82811015613e2f57888601518255948401946001909101908401613e10565b5085821015613e4d5787850151600019600388901b60f8161c191681555b5050505050600190811b01905550565b634e487b7160e01b600052601160045260246000fd5b80820180821115610bbe57610bbe613e5d565b634e487b7160e01b600052601260045260246000fd5b600082613eab57613eab613e86565b500690565b81810381811115610bbe57610bbe613e5d565b8082028115828204841417610bbe57610bbe613e5d565b600082613ee957613ee9613e86565b500490565b600060208284031215613f0057600080fd5b81516129d0816137cd565b600060208284031215613f1d57600080fd5b81516129d081613ba3565b634e487b7160e01b600052603260045260246000fd5b634e487b7160e01b600052603160045260246000fd5b600060018201613f6657613f66613e5d565b5060010190565b600060208284031215613f7f57600080fd5b5051919050565b600060a082018783526020878185015260a0604085015281875180845260c086019150828901935060005b81811015613fd65784516001600160a01b031683529383019391830191600101613fb1565b50506001600160a01b03969096166060850152505050608001529392505050565b60008060006060848603121561400c57600080fd5b835192506020840151915060408401519050925092509256fea2646970667358221220edaa6dbcaaa0a4fe696e30ed2208162395faf0f2040cd2a19cebb135ea4e952864736f6c63430008110033a264697066735822122097bc6a494ea45db9c2a207fe55c5c40460a0ced6d069615cc01aa2e32fd10fa364736f6c634300081100330000000000000000000000007a250d5630b4cf539739df2c5dacb4c659f2488d000000000000000000000000e2fe530c047f2d85298b07d9333c05737f1435fb000000000000000000000000377e168af6a06075423aede50856de177efaac3e000000000000000000000000e9b4d32f829951a3ce145d2caa84cf66af56ca5e0000000000000000000000002ced5bc349d9241a314d3739f12f5f6f2bda6a68

Deployed Bytecode

0x608060405260043610620001a55760003560e01c806370a7899111620000e2578063b24cf5d71162000095578063d7e7a9e7116200006c578063d7e7a9e71462000547578063e6a053d01462000567578063f2fde38b146200058c578063f4f1af3a14620005b157600080fd5b8063b24cf5d714620004db578063b410908d1462000500578063c5aa0062146200052257600080fd5b806370a78991146200041f578063715018a6146200044457806373caf536146200045c578063845a51ec14620004815780638da5cb5b14620004a35780639a97b07814620004c357600080fd5b80633690e287116200015857806341cb87fc116200012f57806341cb87fc146200038e57806345338d6314620003b357806359a51c3414620003d8578063653ed5d414620003fa57600080fd5b80633690e28714620002fb5780633af32abf146200031b5780633b99adf7146200036957600080fd5b80630ab16c1914620001b25780630bc337d814620001f15780632dcacf44146200020b5780633268cc5614620002a05780633501a34814620002c25780633675f29b14620002d957600080fd5b36620001ad57005b600080fd5b348015620001bf57600080fd5b50600654620001d4906001600160a01b031681565b6040516001600160a01b0390911681526020015b60405180910390f35b348015620001fe57600080fd5b5062000209620005c8565b005b3480156200021857600080fd5b50620002696200022a3660046200168b565b6001602081905260009182526040909120805491810154600282015460039092015460ff8416936001600160a01b036101009091048116939216919085565b6040805195151586526001600160a01b03948516602087015292909316918401919091526060830152608082015260a001620001e8565b348015620002ad57600080fd5b50600454620001d4906001600160a01b031681565b62000209620002d336600462001845565b62000629565b348015620002e657600080fd5b50600554620001d4906001600160a01b031681565b3480156200030857600080fd5b506007546001600160a01b0316620001d4565b3480156200032857600080fd5b50620003586200033a3660046200168b565b6001600160a01b031660009081526002602052604090205460ff1690565b6040519015158152602001620001e8565b3480156200037657600080fd5b5062000209620003883660046200199b565b62000b80565b3480156200039b57600080fd5b5062000209620003ad3660046200168b565b62000c5d565b348015620003c057600080fd5b5062000209620003d23660046200168b565b62000c89565b348015620003e557600080fd5b50600354620001d4906001600160a01b031681565b3480156200040757600080fd5b5062000209620004193660046200168b565b62000cb5565b3480156200042c57600080fd5b50620002096200043e3660046200168b565b62000f44565b3480156200045157600080fd5b506200020962000f70565b3480156200046957600080fd5b50620002096200047b36600462001a6d565b62000f88565b3480156200048e57600080fd5b50600854620001d4906001600160a01b031681565b348015620004b057600080fd5b506000546001600160a01b0316620001d4565b348015620004d057600080fd5b506200020962001005565b348015620004e857600080fd5b5062000209620004fa3660046200168b565b6200110c565b3480156200050d57600080fd5b50600754620001d4906001600160a01b031681565b3480156200052f57600080fd5b5062000209620005413660046200168b565b62001138565b3480156200055457600080fd5b506008546001600160a01b0316620001d4565b3480156200057457600080fd5b5062000209620005863660046200168b565b62001164565b3480156200059957600080fd5b5062000209620005ab3660046200168b565b62001190565b62000209620005c23660046200168b565b62001200565b620005d2620014fa565b600954156200061b5760405162461bcd60e51b815260206004820152601060248201526f185b1c9958591e48195e1958dd5d195960821b60448201526064015b60405180910390fd5b670de0b6b3a7640000600955565b620006384262278d0062001b26565b8161014001511015620006795760405162461bcd60e51b81526020600482015260086024820152673c3330206461797360c01b604482015260640162000612565b6009543410156200069d5760405163bb55fd2760e01b815260040160405180910390fd5b60006040518060c00160405280836080015181526020018360a0015181526020018360c0015181526020018360e001518152602001836101000151815260200183610120015181525090506000604051620006f89062001655565b604051809103906000f08015801562000715573d6000803e3d6000fd5b5060405163f2fde38b60e01b81523360048201529091506001600160a01b0382169063f2fde38b90602401600060405180830381600087803b1580156200075b57600080fd5b505af115801562000770573d6000803e3d6000fd5b5050604080516101608082018352875182526020808901519083015287830151828401526060808901519083015261018088015160808301523360a08301528701516001600160a01b0390811660c083015260048054821660e084015260035482166101008401526101a08901516101208401526006548216610140840152925163113af4ad60e11b81529086169450632275e95a9350620008159287910162001bd0565b600060405180830381600087803b1580156200083057600080fd5b505af115801562000845573d6000803e3d6000fd5b50506040516001600160a01b03841681527f2e2b3f61b70d2d131b2a807371103cc98d51adcaa5e9a8f9c32658ad8426e74e9250602001905060405180910390a1341562000a0c576004805460405163095ea7b360e01b81526001600160a01b0391821692810192909252600019602483015282169063095ea7b3906044016020604051808303816000875af1158015620008e4573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906200090a919062001d0f565b50600480546040516370a0823160e01b815230928101929092526001600160a01b0390811691829163f305d7199134918691908216906370a0823190602401602060405180830381865afa15801562000967573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906200098d919062001d2f565b600080306200099e42606f62001b26565b6040518863ffffffff1660e01b8152600401620009c19695949392919062001d49565b60606040518083038185885af1158015620009e0573d6000803e3d6000fd5b50505050506040513d601f19601f8201168201806040525081019062000a07919062001d84565b505050505b806001600160a01b031663fbd757536040518163ffffffff1660e01b8152600401600060405180830381600087803b15801562000a4857600080fd5b505af115801562000a5d573d6000803e3d6000fd5b505050506040518060a00160405280600015158152602001826001600160a01b031663a8aa1b316040518163ffffffff1660e01b8152600401602060405180830381865afa15801562000ab4573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019062000ada919062001db3565b6001600160a01b03908116825233602080840191909152610140969096015160408084019190915260006060938401819052948216855260018088529481902084518154988601516001600160a81b0319909916901515610100600160a81b031916179783166101000297909717875583015193860180546001600160a01b03191694909116939093179092559081015160028401556080015160039092019190915550565b62000b8a620014fa565b81518151811462000bce5760405162461bcd60e51b815260206004820152600d60248201526c0d8d2e6e840dad2e6dac2e8c6d609b1b604482015260640162000612565b60005b8181101562000c575782818151811062000bef5762000bef62001dd3565b60200260200101516002600086848151811062000c105762000c1062001dd3565b6020908102919091018101516001600160a01b03168252810191909152604001600020805460ff19169115159190911790558062000c4e8162001de9565b91505062000bd1565b50505050565b62000c67620014fa565b600480546001600160a01b0319166001600160a01b0392909216919091179055565b62000c93620014fa565b600780546001600160a01b0319166001600160a01b0392909216919091179055565b62000cc08162001556565b6001600160a01b03818116600090815260016020819052604091829020805491015460048054935163095ea7b360e01b815293851690840181905260001960248501526101009092048416931691839063095ea7b3906044016020604051808303816000875af115801562000d39573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019062000d5f919062001d0f565b506040516370a0823160e01b81523060048201526000906001600160a01b038516906370a0823190602401602060405180830381865afa15801562000da8573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019062000dce919062001d2f565b9050846001600160a01b031663546a88116040518163ffffffff1660e01b8152600401600060405180830381600087803b15801562000e0c57600080fd5b505af115801562000e21573d6000803e3d6000fd5b5050604051629d473b60e21b81526001600160a01b03851692506302751cec915062000e5d908890859060009081908a90429060040162001d49565b60408051808303816000875af115801562000e7c573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019062000ea2919062001e05565b5050846001600160a01b031663fbd757536040518163ffffffff1660e01b8152600401600060405180830381600087803b15801562000ee057600080fd5b505af115801562000ef5573d6000803e3d6000fd5b5050506001600160a01b039095166000908152600160208190526040822080546001600160a81b031916815590810180546001600160a01b031916905560028101829055600301555050505050565b62000f4e620014fa565b600380546001600160a01b0319166001600160a01b0392909216919091179055565b62000f7a620014fa565b62000f86600062001605565b565b62000f938262001556565b6040805160208101825282518152905163e572967b60e01b81526001600160a01b0384169163e572967b9162000fcd919060040162001e2a565b600060405180830381600087803b15801562000fe857600080fd5b505af115801562000ffd573d6000803e3d6000fd5b505050505050565b6200100f620014fa565b6007546000906001600160a01b03166200102b60024762001e4f565b604051600081818185875af1925050503d806000811462001069576040519150601f19603f3d011682016040523d82523d6000602084013e6200106e565b606091505b505090508062001091576040516301c91b3d60e21b815260040160405180910390fd5b6008546040516000916001600160a01b03169047908381818185875af1925050503d8060008114620010e0576040519150601f19603f3d011682016040523d82523d6000602084013e620010e5565b606091505b505090508062001108576040516301c91b3d60e21b815260040160405180910390fd5b5050565b62001116620014fa565b600880546001600160a01b0319166001600160a01b0392909216919091179055565b62001142620014fa565b600680546001600160a01b0319166001600160a01b0392909216919091179055565b6200116e620014fa565b600580546001600160a01b0319166001600160a01b0392909216919091179055565b6200119a620014fa565b6001600160a01b038116620011f25760405162461bcd60e51b815260206004820152601d60248201527f6e6577206f776e657220697320746865207a65726f2061646472657373000000604482015260640162000612565b620011fd8162001605565b50565b6200120b8162001556565b6001600160a01b03818116600090815260016020526040908190208054600290910154600554925163095ea7b360e01b8152928416600484015260001960248401526101009091049092169190829063095ea7b3906044016020604051808303816000875af115801562001283573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190620012a9919062001d0f565b506040516370a0823160e01b81523060048201526000906001600160a01b038416906370a0823190602401602060405180830381865afa158015620012f2573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019062001318919062001d2f565b600554604051635af06fed60e01b81526001600160a01b038681166004830152336024830152604482018490526064820186905260006084830181905260a4830181905293945090911690635af06fed90349060c40160206040518083038185885af11580156200138d573d6000803e3d6000fd5b50505050506040513d601f19601f82011682018060405250810190620013b4919062001d2f565b6001600160a01b038616600081815260016020526040808220600301849055805163f576f53960e01b81529051939450919263f576f53992600480820193929182900301818387803b1580156200140a57600080fd5b505af11580156200141f573d6000803e3d6000fd5b50505050846001600160a01b031663fbd757536040518163ffffffff1660e01b8152600401600060405180830381600087803b1580156200145f57600080fd5b505af115801562001474573d6000803e3d6000fd5b50505050846001600160a01b03166327193bc46040518163ffffffff1660e01b8152600401600060405180830381600087803b158015620014b457600080fd5b505af1158015620014c9573d6000803e3d6000fd5b5050506001600160a01b039095166000908152600160208190526040909120805460ff191690911790555050505050565b6000546001600160a01b0316331462000f865760405162461bcd60e51b815260206004820152601760248201527f63616c6c6572206973206e6f7420746865206f776e6572000000000000000000604482015260640162000612565b6001600160a01b0381811660009081526001602081905260409091200154163314620015ae5760405162461bcd60e51b815260206004820152600660248201526510b7bbb732b960d11b604482015260640162000612565b6001600160a01b03811660009081526001602052604090205460ff1615620011fd5760405162461bcd60e51b81526020600482015260096024820152681d985b1a59185d195960ba1b604482015260640162000612565b600080546001600160a01b038381166001600160a01b0319831681178455604051919092169283917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e09190a35050565b6141488062001e7383390190565b6001600160a01b0381168114620011fd57600080fd5b8035620016868162001663565b919050565b6000602082840312156200169e57600080fd5b8135620016ab8162001663565b9392505050565b634e487b7160e01b600052604160045260246000fd5b6040516101c0810167ffffffffffffffff81118282101715620016ef57620016ef620016b2565b60405290565b604051601f8201601f1916810167ffffffffffffffff81118282101715620017215762001721620016b2565b604052919050565b600082601f8301126200173b57600080fd5b813567ffffffffffffffff811115620017585762001758620016b2565b6200176d601f8201601f1916602001620016f5565b8181528460208386010111156200178357600080fd5b816020850160208301376000918101602001919091529392505050565b600067ffffffffffffffff821115620017bd57620017bd620016b2565b5060051b60200190565b600082601f830112620017d957600080fd5b81356020620017f2620017ec83620017a0565b620016f5565b82815260059290921b840181019181810190868411156200181257600080fd5b8286015b848110156200183a5780356200182c8162001663565b835291830191830162001816565b509695505050505050565b6000602082840312156200185857600080fd5b813567ffffffffffffffff808211156200187157600080fd5b908301906101c082860312156200188757600080fd5b62001891620016c8565b823582811115620018a157600080fd5b620018af8782860162001729565b825250602083013582811115620018c557600080fd5b620018d38782860162001729565b60208301525060408301356040820152606083013560608201526080830135608082015260a083013560a082015260c083013560c082015260e083013560e08201526101008084013581830152506101208084013581830152506101408084013581830152506101606200194981850162001679565b9082015261018083810135908201526101a080840135838111156200196d57600080fd5b6200197b88828701620017c7565b918301919091525095945050505050565b8015158114620011fd57600080fd5b60008060408385031215620019af57600080fd5b823567ffffffffffffffff80821115620019c857600080fd5b620019d686838701620017c7565b9350602091508185013581811115620019ee57600080fd5b85019050601f8101861362001a0257600080fd5b803562001a13620017ec82620017a0565b81815260059190911b8201830190838101908883111562001a3357600080fd5b928401925b8284101562001a5e57833562001a4e816200198c565b8252928401929084019062001a38565b80955050505050509250929050565b6000806040838503121562001a8157600080fd5b823562001a8e8162001663565b9150602083013567ffffffffffffffff8082111562001aac57600080fd5b908401906020828703121562001ac157600080fd5b60405160208101818110838211171562001adf5762001adf620016b2565b60405282358281111562001af257600080fd5b62001b0088828601620017c7565b8252508093505050509250929050565b634e487b7160e01b600052601160045260246000fd5b8082018082111562001b3c5762001b3c62001b10565b92915050565b6000815180845260005b8181101562001b6a5760208185018101518683018201520162001b4c565b506000602082860101526020601f19601f83011685010191505092915050565b600081518084526020808501945080840160005b8381101562001bc55781516001600160a01b03168752958201959082019060010162001b9e565b509495945050505050565b60e08152600083516101608060e085015262001bf161024085018362001b42565b9150602086015160df1961010081878603018188015262001c13858462001b42565b945060408901519250610120838189015260608a0151935061014084818a015260808b0151868a015260a08b0151955062001c5a6101808a01876001600160a01b03169052565b60c08b01516001600160a01b039081166101a08b015260e08c015181166101c08b0152838c0151166101e08a0152818b015189880385016102008b0152955062001ca5878762001b8a565b9650808b01519550505050505062001cc96102208501826001600160a01b03169052565b509050620016ab6020830184805182526020810151602083015260408101516040830152606081015160608301526080810151608083015260a081015160a08301525050565b60006020828403121562001d2257600080fd5b8151620016ab816200198c565b60006020828403121562001d4257600080fd5b5051919050565b6001600160a01b039687168152602081019590955260408501939093526060840191909152909216608082015260a081019190915260c00190565b60008060006060848603121562001d9a57600080fd5b8351925060208401519150604084015190509250925092565b60006020828403121562001dc657600080fd5b8151620016ab8162001663565b634e487b7160e01b600052603260045260246000fd5b60006001820162001dfe5762001dfe62001b10565b5060010190565b6000806040838503121562001e1957600080fd5b505080516020909101519092909150565b602081526000825160208084015262001e47604084018262001b8a565b949350505050565b60008262001e6d57634e487b7160e01b600052601260045260246000fd5b50049056fe6080604052600e805460ff60a01b1916600160a01b1790556000601c819055601d819055601e819055601f819055602055600260218190556022556023805461ffff19169055602a805461010160a81b61ffff60a81b199091161790553480156200006957600080fd5b5062000075336200008d565b602980546001600160a01b03191633179055620000dd565b600080546001600160a01b038381166001600160a01b0319831681178455604051919092169283917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e09190a35050565b61405b80620000ed6000396000f3fe6080604052600436106103b15760003560e01c80637d1db4a5116101e7578063c45a01551161010d578063e572967b116100a0578063f576f5391161006f578063f576f53914610ab1578063f887ea4014610ac6578063fabe628314610ae6578063fbd7575314610b0657600080fd5b8063e572967b14610a3b578063ebdfd72214610a5b578063f16fd78d14610a71578063f2fde38b14610a9157600080fd5b8063d4fb9a01116100dc578063d4fb9a0114610984578063d741b9c3146109a5578063d920334e146109d5578063dd62ed3e146109f557600080fd5b8063c45a015514610918578063ca987b0e14610938578063cb29813c1461094e578063cc6badb31461096e57600080fd5b80639502c42611610185578063a8aa1b3111610154578063a8aa1b31146108ac578063a9059cbb146108cc578063b48e665e146108ec578063bf56b3711461090257600080fd5b80639502c4261461084157806395d89b4114610857578063a3a2e89e1461086c578063a457c2d71461088c57600080fd5b806388cda873116101c157806388cda873146107b45780638b42507f146107d35780638da5cb5b146108035780638ea5220f1461082157600080fd5b80637d1db4a51461076e578063838420131461078457806383ad79941461079e57600080fd5b80633af32abf116102d757806359a51c341161026a57806370a082311161023957806370a082311461070257806370c757ec14610722578063715018a6146107435780637c0ff2051461075857600080fd5b806359a51c34146106a15780635fef8680146106c15780636827e764146106d6578063704ce43e146106ec57600080fd5b8063497a000a116102a6578063497a000a1461062b5780634a74bb021461064b57806352390c021461066c578063546a88111461068c57600080fd5b80633af32abf146105a55780633dab5269146105c55780633f4218e0146105e5578063461e5d3f1461061557600080fd5b8063220f66961161034f578063313ce5671161031e578063313ce567146105335780633685d4191461054f57806336e4ec641461056f578063395093511461058557600080fd5b8063220f6696146104bd5780632275e95a146104de57806323b872dd146104fe57806327193bc41461051e57600080fd5b80630ab16c191161038b5780630ab16c191461043857806318160ddd146104705780631df4ccfc146104855780631f53ac021461049b57600080fd5b80630445b667146103bd57806306fdde03146103e6578063095ea7b31461040857600080fd5b366103b857005b600080fd5b3480156103c957600080fd5b506103d360075481565b6040519081526020015b60405180910390f35b3480156103f257600080fd5b506103fb610b1b565b6040516103dd919061377f565b34801561041457600080fd5b506104286104233660046137f2565b610bad565b60405190151581526020016103dd565b34801561044457600080fd5b50600e54610458906001600160a01b031681565b6040516001600160a01b0390911681526020016103dd565b34801561047c57600080fd5b506004546103d3565b34801561049157600080fd5b506103d3601a5481565b3480156104a757600080fd5b506104bb6104b636600461381e565b610bc4565b005b3480156104c957600080fd5b50602a5461042890600160a01b900460ff1681565b3480156104ea57600080fd5b506104bb6104f9366004613a1f565b610bee565b34801561050a57600080fd5b50610428610519366004613b62565b6113c8565b34801561052a57600080fd5b506104bb611482565b34801561053f57600080fd5b50604051600981526020016103dd565b34801561055b57600080fd5b506104bb61056a36600461381e565b611501565b34801561057b57600080fd5b506103d360215481565b34801561059157600080fd5b506104286105a03660046137f2565b6116e0565b3480156105b157600080fd5b506104286105c036600461381e565b61171a565b3480156105d157600080fd5b506104bb6105e0366004613bb1565b611738565b3480156105f157600080fd5b5061042861060036600461381e565b600f6020526000908152604090205460ff1681565b34801561062157600080fd5b506103d360225481565b34801561063757600080fd5b506104bb610646366004613bcf565b611762565b34801561065757600080fd5b50602a5461042890600160a81b900460ff1681565b34801561067857600080fd5b506104bb61068736600461381e565b6117c2565b34801561069857600080fd5b506104bb6118e6565b3480156106ad57600080fd5b50600c54610458906001600160a01b031681565b3480156106cd57600080fd5b506104bb61197d565b3480156106e257600080fd5b506103d360165481565b3480156106f857600080fd5b506103d360155481565b34801561070e57600080fd5b506103d361071d36600461381e565b6119c1565b34801561072e57600080fd5b50600e5461042890600160a01b900460ff1681565b34801561074f57600080fd5b506104bb611a20565b34801561076457600080fd5b506103d360185481565b34801561077a57600080fd5b506103d3602b5481565b34801561079057600080fd5b506023546104289060ff1681565b3480156107aa57600080fd5b506103d360145481565b3480156107c057600080fd5b5060235461042890610100900460ff1681565b3480156107df57600080fd5b506104286107ee36600461381e565b60116020526000908152604090205460ff1681565b34801561080f57600080fd5b506000546001600160a01b0316610458565b34801561082d57600080fd5b50602a54610458906001600160a01b031681565b34801561084d57600080fd5b506103d360195481565b34801561086357600080fd5b506103fb611a32565b34801561087857600080fd5b506104bb610887366004613be8565b611a41565b34801561089857600080fd5b506104286108a73660046137f2565b611a74565b3480156108b857600080fd5b50602854610458906001600160a01b031681565b3480156108d857600080fd5b506104286108e73660046137f2565b611af5565b3480156108f857600080fd5b506103d360095481565b34801561090e57600080fd5b506103d360135481565b34801561092457600080fd5b50602954610458906001600160a01b031681565b34801561094457600080fd5b506103d3601b5481565b34801561095a57600080fd5b506104bb610969366004613c21565b611b03565b34801561097a57600080fd5b506103d360175481565b34801561099057600080fd5b50602a5461042890600160b01b900460ff1681565b3480156109b157600080fd5b506104286109c036600461381e565b600d6020526000908152604090205460ff1681565b3480156109e157600080fd5b506104bb6109f0366004613bcf565b611d4f565b348015610a0157600080fd5b506103d3610a10366004613c64565b6001600160a01b03918216600090815260036020908152604080832093909416825291909152205490565b348015610a4757600080fd5b506104bb610a56366004613c92565b611df6565b348015610a6757600080fd5b506103d360085481565b348015610a7d57600080fd5b506104bb610a8c36600461381e565b611e2e565b348015610a9d57600080fd5b506104bb610aac36600461381e565b611e92565b348015610abd57600080fd5b506104bb611ef9565b348015610ad257600080fd5b50602754610458906001600160a01b031681565b348015610af257600080fd5b506104bb610b01366004613be8565b61204d565b348015610b1257600080fd5b506104bb612080565b6060600a8054610b2a90613d15565b80601f0160208091040260200160405190810160405280929190818152602001828054610b5690613d15565b8015610ba35780601f10610b7857610100808354040283529160200191610ba3565b820191906000526020600020905b815481529060010190602001808311610b8657829003601f168201915b5050505050905090565b6000610bba3384846120cb565b5060015b92915050565b610bcc6121be565b602a80546001600160a01b0319166001600160a01b0392909216919091179055565b6029546001600160a01b03163314610c18576040516282b42960e81b815260040160405180910390fd5b8151600a90610c279082613d9d565b506020820151600b90610c3a9082613d9d565b50816040015160046000828254610c519190613e73565b9091555050600454610c6590600019613e9c565b610c7190600019613eb0565b60059081556040830151610fa091610c899190613ec3565b610c939190613eda565b600755606082015160461115610cd95760405162461bcd60e51b815260206004820152600660248201526506c6f77206c760d41b60448201526064015b60405180910390fd5b6000606483606001518460400151610cf19190613ec3565b610cfb9190613eda565b90506000818460400151610d0f9190613eb0565b9050606484604001516001610d249190613ec3565b610d2e9190613eda565b602b5560e0840151602780546001600160a01b0319166001600160a01b0390921691821790556040805163c45a015560e01b8152905163c45a0155916004818101926020929091908290030181865afa158015610d8f573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610db39190613eee565b6001600160a01b031663c9c65396602760009054906101000a90046001600160a01b03166001600160a01b031663ad5c46486040518163ffffffff1660e01b8152600401602060405180830381865afa158015610e14573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610e389190613eee565b6040516001600160e01b031960e084901b1681526001600160a01b0390911660048201523060248201526044016020604051808303816000875af1158015610e84573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610ea89190613eee565b602880546001600160a01b0319166001600160a01b039283161781553060008181526003602090815260408083206027548716845282528083206000199055838352600f8252808320805460ff19908116600190811790925560298054891686528386208054831684179055958552600d90935281842080548416821790559354861683528083208054831685179055935485168252838220805482168417905560a089015185168252838220805482168417905561010089015185168252838220805482168417905560e08901519094168152919091208054909216179055610120840151610f9790612218565b610140840151600e80546001600160a01b0319166001600160a01b03928316179055306000818152601160209081526040808320805460ff19908116600190811790925560a0808c0151881686528386208054831684179055602880548916875284872080548416851790556029548916875284872080548416851790557f97847ee99463795296047093514439c3127772df3715e628aa85601cf854171680548416851790557f4ad3b33220dddc71b994a52d72c06b10862965f7d926534c05c00fb7e819e7b780548416851790555490971685526010845282852080548216831790559484529281902080549094169092179092556080808801516009558651601481905591870151601581905590870151601681905592870151601755606087015160185592860151601955916110d091613e73565b6110da9190613e73565b6000036110e75760006021555b602154836040015184608001516110fe9190613e73565b6111089190613e73565b601a556020830151606084015160a08501516111249190613e73565b61112e9190613e73565b60000361113b5760006022555b60225483606001518460a001516111529190613e73565b61115c9190613e73565b601b5560295460a0850151604051633af32abf60e01b81526001600160a01b039182166004820152911690633af32abf90602401602060405180830381865afa1580156111ad573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906111d19190613f0b565b1561123e578251601a54600c916111e791613e73565b1115611206576040516314041af760e31b815260040160405180910390fd5b60118360200151601b5461121a9190613e73565b1115611239576040516314041af760e31b815260040160405180910390fd5b6112a1565b8251601a5460079161124f91613e73565b111561126e576040516314041af760e31b815260040160405180910390fd5b60078360200151601b546112829190613e73565b11156112a1576040516314041af760e31b815260040160405180910390fd5b60c0840151602a80546001600160a01b039283166001600160a01b031991821617909155610100860151600c8054919093169116179055600554600080805260016020527fa6eef7e35abe7026729641147f7915573c7e97b47efa546f5f6e3230263bcb498054909190611316908490613e73565b90915550611328905060003384612286565b61133860008560a0015183612286565b60405182815233906000907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef9060200160405180910390a38360a001516001600160a01b031660006001600160a01b03167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef836040516113ba91815260200190565b60405180910390a350505050565b60006113d584848461237f565b6001600160a01b038416600090815260036020908152604080832033845290915290205482111561143d5760405162461bcd60e51b81526020600482015260126024820152717472616e7366416d743e616c6c6f776e636560701b6044820152606401610cd0565b6001600160a01b038416600090815260036020908152604080832033808552925290912054611478918691611473908690613eb0565b6120cb565b5060019392505050565b6029546001600160a01b031633146114ac576040516282b42960e81b815260040160405180910390fd5b601354156114cd576040516319f4db0f60e31b815260040160405180910390fd5b426013556009546114df90603c613ec3565b6114e99042613e73565b600855600e805460ff60a01b1916600160a01b179055565b6115096121be565b6001600160a01b03811660009081526010602052604090205460ff166115645760405162461bcd60e51b815260206004820152601060248201526f185b1c9958591e48195e18db1d59195960821b6044820152606401610cd0565b306001600160a01b038216036115bc5760405162461bcd60e51b815260206004820152601960248201527f636f6e7472616374206d757374206265206578636c75646564000000000000006044820152606401610cd0565b60005b6012548110156116dc57816001600160a01b0316601282815481106115e6576115e6613f28565b6000918252602090912001546001600160a01b0316036116ca576012805461161090600190613eb0565b8154811061162057611620613f28565b600091825260209091200154601280546001600160a01b03909216918390811061164c5761164c613f28565b600091825260208083209190910180546001600160a01b0319166001600160a01b039485161790559184168152600282526040808220829055601090925220805460ff1916905560128054806116a4576116a4613f3e565b600082815260209020810160001990810180546001600160a01b03191690550190555050565b806116d481613f54565b9150506115bf565b5050565b3360008181526003602090815260408083206001600160a01b03871684529091528120549091906114789082908690611473908790613e73565b6001600160a01b03166000908152600d602052604090205460ff1690565b6117406121be565b602a8054921515600160a81b0260ff60a81b1990931692909217909155600755565b600c546001600160a01b0316331461178c576040516282b42960e81b815260040160405180910390fd5b600981905561179c81603c613ec3565b6013546117a99190613e73565b60085550600e805460ff60a01b1916600160a01b179055565b6117ca6121be565b6001600160a01b03811660009081526010602052604090205460ff16156118265760405162461bcd60e51b815260206004820152601060248201526f185b1c9958591e48195e18db1d59195960821b6044820152606401610cd0565b6001600160a01b03811660009081526001602052604090205415611880576001600160a01b03811660009081526001602052604090205461186690612972565b6001600160a01b0382166000908152600260205260409020555b6001600160a01b03166000818152601060205260408120805460ff191660019081179091556012805491820181559091527fbb8a6a4669ba250d26cd7a459eca9d215f8307e33aebe50379bc5a3617ec34440180546001600160a01b0319169091179055565b6029546001600160a01b03163314611910576040516282b42960e81b815260040160405180910390fd5b602780546001600160a01b039081166000908152600f602090815260408083208054600160ff19918216811790925595548516845260119092528083208054861683179055825490931682529190208054909216179055602a805461ffff60a81b1916600160b01b179055565b6119856121be565b6119bf303360265460255460245461199d9190613e73565b6119a79190613e73565b6119b0306119c1565b6119ba9190613eb0565b61237f565b565b6001600160a01b03811660009081526010602052604081205460ff16156119fe57506001600160a01b031660009081526002602052604090205490565b6001600160a01b038216600090815260016020526040902054610bbe90612972565b611a286121be565b6119bf60006129d7565b6060600b8054610b2a90613d15565b611a496121be565b6001600160a01b03919091166000908152600f60205260409020805460ff1916911515919091179055565b3360008181526003602090815260408083206001600160a01b038716845290915281205490919083811015611add5760405162461bcd60e51b815260206004820152600f60248201526e696e7375666620416c6c6f776e636560881b6044820152606401610cd0565b611aea82868684036120cb565b506001949350505050565b60003361147881858561237f565b611b0b6121be565b6000806013546228de80611b1f9190613e73565b42118015611b2e575060135415155b15611b3e57506000905080611b74565b601354611b4e9062015180613e73565b42118015611b5d575060135415155b15611b6d57506001905080611b74565b5060029050805b60148890556015869055601684905560178790556018859055601983905587611b9d8786613e73565b611ba79190613e73565b600003611bb357600091505b81611bbe8786613e73565b611bc89190613e73565b601a5586611bd68685613e73565b611be09190613e73565b600003611beb575060005b80601854601954611bfc9190613e73565b611c069190613e73565b601b5560218290556022819055602954604051633af32abf60e01b81523360048201526001600160a01b0390911690633af32abf90602401602060405180830381865afa158015611c5b573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611c7f9190613f0b565b15611ce757600c88601a54611c949190613e73565b1115611cb3576040516314041af760e31b815260040160405180910390fd5b601187601b54611cc39190613e73565b1115611ce2576040516314041af760e31b815260040160405180910390fd5b611d45565b600788601a54611cf79190613e73565b1115611d16576040516314041af760e31b815260040160405180910390fd5b600787601b54611d269190613e73565b1115611d45576040516314041af760e31b815260040160405180910390fd5b5050505050505050565b611d576121be565b601354600003611d7a57604051638dda39df60e01b815260040160405180910390fd5b6103e86004546005611d8c9190613ec3565b611d969190613eda565b811015611db657604051634802451160e01b815260040160405180910390fd5b60646004546003611dc79190613ec3565b611dd19190613eda565b811115611df157604051634802451160e01b815260040160405180910390fd5b602b55565b6029546001600160a01b03163314611e20576040516282b42960e81b815260040160405180910390fd5b8051611e2b90612218565b50565b600c546001600160a01b03163314611e58576040516282b42960e81b815260040160405180910390fd5b600c80546001600160a01b039092166001600160a01b0319909216821790556000908152600d60205260409020805460ff19166001179055565b611e9a6121be565b6001600160a01b038116611ef05760405162461bcd60e51b815260206004820152601d60248201527f6e6577206f776e657220697320746865207a65726f20616464726573730000006044820152606401610cd0565b611e2b816129d7565b6029546001600160a01b03163314611f23576040516282b42960e81b815260040160405180910390fd5b600e54604080516318160ddd60e01b815290516000926001600160a01b0316916318160ddd9160048083019260209291908290030181865afa158015611f6d573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611f919190613f6d565b611f9c906001613e73565b905060015b818110156116dc57600e546040516331a9108f60e11b815260048101839052600191600d916000916001600160a01b031690636352211e90602401602060405180830381865afa158015611ff9573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061201d9190613eee565b6001600160a01b031681526020810191909152604001600020805460ff1916911515919091179055600101611fa1565b6120556121be565b6001600160a01b03919091166000908152601160205260409020805460ff1916911515919091179055565b6029546001600160a01b031633146120aa576040516282b42960e81b815260040160405180910390fd5b602a805460ff60b01b198116600160b01b9182900460ff1615909102179055565b6001600160a01b0383166121155760405162461bcd60e51b815260206004820152601160248201527030b838393b10333937b690181030b2323960791b6044820152606401610cd0565b6001600160a01b03821661215d5760405162461bcd60e51b815260206004820152600f60248201526e30b838393b103a3790181030b2323960891b6044820152606401610cd0565b6001600160a01b0383811660008181526003602090815260408083209487168084529482529182902085905590518481527f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925910160405180910390a3505050565b6000546001600160a01b031633146119bf5760405162461bcd60e51b815260206004820152601760248201527f63616c6c6572206973206e6f7420746865206f776e65720000000000000000006044820152606401610cd0565b805160005b81811015612281576001600d600085848151811061223d5761223d613f28565b6020908102919091018101516001600160a01b03168252810191909152604001600020805460ff19169115159190911790558061227981613f54565b91505061221d565b505050565b60008060008060008061229887612a27565b6001600160a01b038f16600090815260016020526040902054959b509399509197509550935091506122cb908790613eb0565b6001600160a01b03808b1660009081526001602052604080822093909355908a16815220546122fb908690613e73565b6001600160a01b03891660009081526001602052604090205561231d81612a84565b6123278483612bcc565b876001600160a01b0316896001600160a01b03167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef8560405161236c91815260200190565b60405180910390a3505050505050505050565b6001600160a01b0383166123c95760405162461bcd60e51b81526020600482015260116024820152703a3930b739b31033393690181030b2323960791b6044820152606401610cd0565b6001600160a01b0382166124125760405162461bcd60e51b815260206004820152601060248201526f3a3930b739b3103a3790181030b2323960811b6044820152606401610cd0565b6000811161244d5760405162461bcd60e51b81526020600482015260086024820152671e995c9bc8105b5d60c21b6044820152606401610cd0565b602b548111158061249957506001600160a01b03831660009081526011602052604090205460ff16801561249957506001600160a01b03821660009081526011602052604090205460ff165b6124d55760405162461bcd60e51b815260206004820152600d60248201526c13585e08151608105b5bdd5b9d609a1b6044820152606401610cd0565b600e54600160a01b900460ff161561259b57600854421061250257600e805460ff60a01b1916905561259b565b6028546001600160a01b0390811690841603612543576125218261171a565b61253e57604051630b094f2760e31b815260040160405180910390fd5b61259b565b6028546001600160a01b0390811690831603612562576125218361171a565b61256b8361171a565b158061257d575061257b8261171a565b155b1561259b57604051630b094f2760e31b815260040160405180910390fd5b60235460ff161580156125af575060135415155b1561270157602354610100900460ff16612693576013546125d39062015180613e73565b42111561268e576014546015546016546125ed9190613e73565b6125f79190613e73565b15612603576001612606565b60005b60ff1660215560175460185460195461261f9190613e73565b6126299190613e73565b15612635576001612638565b60005b60ff166022556021546015546016546126519190613e73565b61265b9190613e73565b601a556022546018546019546126719190613e73565b61267b9190613e73565b601b556023805461ff0019166101001790555b612701565b6013546126a3906228de80613e73565b421115612701576000602181905560228190556015546016546126c69190613e73565b6126d09190613e73565b601a556022546018546019546126e69190613e73565b6126f09190613e73565b601b556023805460ff191660011790555b6000546001600160a01b0384811691161480159061272d57506000546001600160a01b03838116911614155b801561275257506001600160a01b03821660009081526011602052604090205460ff16155b156127f0576028546001600160a01b03848116911614801561278257506027546001600160a01b03838116911614155b80156127a757506001600160a01b0382166000908152600f602052604090205460ff16155b156127f057602a54600160b01b900460ff166127f05760405162461bcd60e51b81526020600482015260086024820152672174726164696e6760c01b6044820152606401610cd0565b602a54600160a01b900460ff1615801561281857506028546001600160a01b03848116911614155b801561282d5750602a54600160b01b900460ff165b80156128425750602a54600160a81b900460ff165b801561286c575060075460265460255460245461285f9190613e73565b6128699190613e73565b10155b1561287957612879612bf2565b6001600160a01b0383166000908152600f602052604090205460ff16806128b857506001600160a01b0382166000908152600f602052604090205460ff165b156128db576000601c819055601d819055601e819055601f819055602055612967565b6028546001600160a01b039081169083160361291457601b54601c55601754601d55602254601e55601954601f55601854602055612967565b6028546001600160a01b039081169084160361294d57601a54601c55601454601d55602154601e55601654601f55601554602055612967565b6000601c819055601d819055601e819055601f8190556020555b61228183838361323f565b60006005548211156129ba5760405162461bcd60e51b8152602060048201526011602482015270416d74203e20746f745265666c63746e7360781b6044820152606401610cd0565b60006129c461338e565b90506129d08184613eda565b9392505050565b600080546001600160a01b038381166001600160a01b0319831681178455604051919092169283917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e09190a35050565b6000806000806000806000806000612a448a601d54601c546133b1565b9250925092506000612a5461338e565b90506000806000612a678e87878761340f565b919e509c509a509598509396509194505050505091939550919395565b6000612a8e61338e565b90506000612a9c8284613ec3565b601f54601e546020549293509091600081612ab78486613e73565b612ac19190613e73565b30600090815260016020526040902054909150612adf908690613e73565b3060009081526001602090815260408083209390935560109052205460ff1615612b2f5730600090815260026020526040902054612b1e908890613e73565b306000908152600260205260409020555b80600003612b405750505050505050565b80612b4b8589613ec3565b612b559190613eda565b60256000828254612b669190613e73565b90915550819050612b778389613ec3565b612b819190613eda565b60246000828254612b929190613e73565b90915550819050612ba38489613ec3565b612bad9190613eda565b60266000828254612bbe9190613e73565b909155505050505050505050565b81600554612bda9190613eb0565b600555600654612beb908290613e73565b6006555050565b602a805460ff60a01b1916600160a01b179055600754602454602554602654600081612c1e8486613e73565b612c289190613e73565b9050600081612c378688613ec3565b612c419190613eda565b90506000612c50600283613eda565b9050612c5c8188613eb0565b600003612c6f5750505050505050613230565b6040805160028082526060820183526000926020830190803683370190505090503081600081518110612ca457612ca4613f28565b6001600160a01b03928316602091820292909201810191909152602754604080516315ab88c960e31b81529051919093169263ad5c46489260048083019391928290030181865afa158015612cfd573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612d219190613eee565b81600181518110612d3457612d34613f28565b6001600160a01b039283166020918202929092010152602754612d5a913091168a6120cb565b6027546001600160a01b031663791ac947612d75848b613eb0565b60008430426040518663ffffffff1660e01b8152600401612d9a959493929190613f86565b600060405180830381600087803b158015612db457600080fd5b505af1158015612dc8573d6000803e3d6000fd5b5047925060009150612ddc90508487613eb0565b612de68547613ec3565b612df09190613eda565b905060008415612e935760275460405163f305d71960e01b815230600482015260248101879052600060448201819052606482015261dead60848201524260a48201526001600160a01b039091169063f305d71990849060c40160606040518083038185885af1158015612e68573d6000803e3d6000fd5b50505050506040513d601f19601f82011682018060405250810190612e8d9190613ff7565b50909150505b612e9d8186613eb0565b612ea79087613eb0565b8a10612ed057612eb78186613eb0565b612ec19087613eb0565b612ecb908b613eb0565b612ed3565b60005b602455612ee08a88613eb0565b600003612ef7575050505050505050505050613230565b476000612f048a8c613e73565b612f0e8b84613ec3565b612f189190613eda565b90506000612f268284613eb0565b9050898c8f612f359190613ec3565b612f3f9190613eda565b8c10612f6b57898c8f612f529190613ec3565b612f5c9190613eda565b612f66908d613eb0565b612f6e565b60005b602581905550898b8f612f819190613ec3565b612f8b9190613eda565b8b10612fb757898b8f612f9e9190613ec3565b612fa89190613eda565b612fb2908c613eb0565b612fba565b60005b60265585156132215781156131a5576000612fd6600284613eda565b90506000602960009054906101000a90046001600160a01b03166001600160a01b0316633690e2876040518163ffffffff1660e01b8152600401602060405180830381865afa15801561302d573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906130519190613eee565b6001600160a01b03168260405160006040518083038185875af1925050503d806000811461309b576040519150601f19603f3d011682016040523d82523d6000602084013e6130a0565b606091505b50509050806130c2576040516301c91b3d60e21b815260040160405180910390fd5b6029546040805163d7e7a9e760e01b815290516000926001600160a01b03169163d7e7a9e79160048083019260209291908290030181865afa15801561310c573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906131309190613eee565b6001600160a01b03168360405160006040518083038185875af1925050503d806000811461317a576040519150601f19603f3d011682016040523d82523d6000602084013e61317f565b606091505b50509050806131a1576040516301c91b3d60e21b815260040160405180910390fd5b5050505b801561322157602a546040516000916001600160a01b03169083908381818185875af1925050503d80600081146131f8576040519150601f19603f3d011682016040523d82523d6000602084013e6131fd565b606091505b505090508061321f576040516301c91b3d60e21b815260040160405180910390fd5b505b50505050505050505050505050505b602a805460ff60a01b19169055565b6001600160a01b03831660009081526010602052604090205460ff16801561328057506001600160a01b03821660009081526010602052604090205460ff16155b1561329057612281838383613466565b6001600160a01b03831660009081526010602052604090205460ff161580156132d157506001600160a01b03821660009081526010602052604090205460ff165b156132e1576122818383836134db565b6001600160a01b03831660009081526010602052604090205460ff1615801561332357506001600160a01b03821660009081526010602052604090205460ff16155b1561333357612281838383612286565b6001600160a01b03831660009081526010602052604090205460ff16801561337357506001600160a01b03821660009081526010602052604090205460ff165b1561338357612281838383613587565b612281838383612286565b600080600061339b6135fc565b90925090506133aa8183613eda565b9250505090565b600080808060646133c28789613ec3565b6133cc9190613eda565b9050600060646133dc878a613ec3565b6133e69190613eda565b90506000816133f5848b613eb0565b6133ff9190613eb0565b9992985090965090945050505050565b600080808061341e8589613ec3565b9050600061342c8689613ec3565b9050600061343a8789613ec3565b90506000816134498486613eb0565b6134539190613eb0565b939b939a50919850919650505050505050565b60008060008060008061347887612a27565b6001600160a01b038f16600090815260026020526040902054959b509399509197509550935091506134ab908890613eb0565b6001600160a01b038a166000908152600260209081526040808320939093556001905220546122cb908790613eb0565b6000806000806000806134ed87612a27565b6001600160a01b038f16600090815260016020526040902054959b50939950919750955093509150613520908790613eb0565b6001600160a01b03808b16600090815260016020908152604080832094909455918b16815260029091522054613557908490613e73565b6001600160a01b0389166000908152600260209081526040808320939093556001905220546122fb908690613e73565b60008060008060008061359987612a27565b6001600160a01b038f16600090815260026020526040902054959b509399509197509550935091506135cc908890613eb0565b6001600160a01b038a16600090815260026020908152604080832093909355600190522054613520908790613eb0565b6005546004546000918291825b60125481101561374e5782600160006012848154811061362b5761362b613f28565b60009182526020808320909101546001600160a01b031683528201929092526040019020541180613696575081600260006012848154811061366f5761366f613f28565b60009182526020808320909101546001600160a01b03168352820192909252604001902054115b156136ac57600554600454945094505050509091565b60016000601283815481106136c3576136c3613f28565b60009182526020808320909101546001600160a01b031683528201929092526040019020546136f29084613eb0565b9250600260006012838154811061370b5761370b613f28565b60009182526020808320909101546001600160a01b0316835282019290925260400190205461373a9083613eb0565b91508061374681613f54565b915050613609565b5060045460055461375f9190613eda565b821015613776576005546004549350935050509091565b90939092509050565b600060208083528351808285015260005b818110156137ac57858101830151858201604001528201613790565b506000604082860101526040601f19601f8301168501019250505092915050565b6001600160a01b0381168114611e2b57600080fd5b80356137ed816137cd565b919050565b6000806040838503121561380557600080fd5b8235613810816137cd565b946020939093013593505050565b60006020828403121561383057600080fd5b81356129d0816137cd565b634e487b7160e01b600052604160045260246000fd5b604051610160810167ffffffffffffffff811182821017156138755761387561383b565b60405290565b604051601f8201601f1916810167ffffffffffffffff811182821017156138a4576138a461383b565b604052919050565b600082601f8301126138bd57600080fd5b813567ffffffffffffffff8111156138d7576138d761383b565b6138ea601f8201601f191660200161387b565b8181528460208386010111156138ff57600080fd5b816020850160208301376000918101602001919091529392505050565b600082601f83011261392d57600080fd5b8135602067ffffffffffffffff8211156139495761394961383b565b8160051b61395882820161387b565b928352848101820192828101908785111561397257600080fd5b83870192505b8483101561399a57823561398b816137cd565b82529183019190830190613978565b979650505050505050565b600060c082840312156139b757600080fd5b60405160c0810181811067ffffffffffffffff821117156139da576139da61383b565b8060405250809150823581526020830135602082015260408301356040820152606083013560608201526080830135608082015260a083013560a08201525092915050565b60008060e08385031215613a3257600080fd5b823567ffffffffffffffff80821115613a4a57600080fd5b908401906101608287031215613a5f57600080fd5b613a67613851565b823582811115613a7657600080fd5b613a82888286016138ac565b825250602083013582811115613a9757600080fd5b613aa3888286016138ac565b602083015250604083013560408201526060830135606082015260808301356080820152613ad360a084016137e2565b60a0820152613ae460c084016137e2565b60c0820152613af560e084016137e2565b60e0820152610100613b088185016137e2565b908201526101208381013583811115613b2057600080fd5b613b2c8982870161391c565b8284015250506101409150613b428284016137e2565b82820152809450505050613b5984602085016139a5565b90509250929050565b600080600060608486031215613b7757600080fd5b8335613b82816137cd565b92506020840135613b92816137cd565b929592945050506040919091013590565b8015158114611e2b57600080fd5b60008060408385031215613bc457600080fd5b823561381081613ba3565b600060208284031215613be157600080fd5b5035919050565b60008060408385031215613bfb57600080fd5b8235613c06816137cd565b91506020830135613c1681613ba3565b809150509250929050565b60008060008060008060c08789031215613c3a57600080fd5b505084359660208601359650604086013595606081013595506080810135945060a0013592509050565b60008060408385031215613c7757600080fd5b8235613c82816137cd565b91506020830135613c16816137cd565b600060208284031215613ca457600080fd5b813567ffffffffffffffff80821115613cbc57600080fd5b9083019060208286031215613cd057600080fd5b604051602081018181108382111715613ceb57613ceb61383b565b604052823582811115613cfd57600080fd5b613d098782860161391c565b82525095945050505050565b600181811c90821680613d2957607f821691505b602082108103613d4957634e487b7160e01b600052602260045260246000fd5b50919050565b601f82111561228157600081815260208120601f850160051c81016020861015613d765750805b601f850160051c820191505b81811015613d9557828155600101613d82565b505050505050565b815167ffffffffffffffff811115613db757613db761383b565b613dcb81613dc58454613d15565b84613d4f565b602080601f831160018114613e005760008415613de85750858301515b600019600386901b1c1916600185901b178555613d95565b600085815260208120601f198616915b82811015613e2f57888601518255948401946001909101908401613e10565b5085821015613e4d5787850151600019600388901b60f8161c191681555b5050505050600190811b01905550565b634e487b7160e01b600052601160045260246000fd5b80820180821115610bbe57610bbe613e5d565b634e487b7160e01b600052601260045260246000fd5b600082613eab57613eab613e86565b500690565b81810381811115610bbe57610bbe613e5d565b8082028115828204841417610bbe57610bbe613e5d565b600082613ee957613ee9613e86565b500490565b600060208284031215613f0057600080fd5b81516129d0816137cd565b600060208284031215613f1d57600080fd5b81516129d081613ba3565b634e487b7160e01b600052603260045260246000fd5b634e487b7160e01b600052603160045260246000fd5b600060018201613f6657613f66613e5d565b5060010190565b600060208284031215613f7f57600080fd5b5051919050565b600060a082018783526020878185015260a0604085015281875180845260c086019150828901935060005b81811015613fd65784516001600160a01b031683529383019391830191600101613fb1565b50506001600160a01b03969096166060850152505050608001529392505050565b60008060006060848603121561400c57600080fd5b835192506020840151915060408401519050925092509256fea2646970667358221220edaa6dbcaaa0a4fe696e30ed2208162395faf0f2040cd2a19cebb135ea4e952864736f6c63430008110033a264697066735822122097bc6a494ea45db9c2a207fe55c5c40460a0ced6d069615cc01aa2e32fd10fa364736f6c63430008110033

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

0000000000000000000000007a250d5630b4cf539739df2c5dacb4c659f2488d000000000000000000000000e2fe530c047f2d85298b07d9333c05737f1435fb000000000000000000000000377e168af6a06075423aede50856de177efaac3e000000000000000000000000e9b4d32f829951a3ce145d2caa84cf66af56ca5e0000000000000000000000002ced5bc349d9241a314d3739f12f5f6f2bda6a68

-----Decoded View---------------
Arg [0] : initialRouterAddress (address): 0x7a250d5630B4cF539739dF2C5dAcb4c659F2488D
Arg [1] : initialLockerAddress (address): 0xE2fE530C047f2d85298b07D9333C05737f1435fB
Arg [2] : initialRewardPoolAddress (address): 0x377E168aF6A06075423AEDe50856dE177EfaAc3E
Arg [3] : initialRevenueAddress (address): 0xe9b4d32f829951a3Ce145D2CaA84Cf66af56CA5e
Arg [4] : _nftWhitelist (address): 0x2cED5bc349D9241a314d3739f12f5f6f2BDA6A68

-----Encoded View---------------
5 Constructor Arguments found :
Arg [0] : 0000000000000000000000007a250d5630b4cf539739df2c5dacb4c659f2488d
Arg [1] : 000000000000000000000000e2fe530c047f2d85298b07d9333c05737f1435fb
Arg [2] : 000000000000000000000000377e168af6a06075423aede50856de177efaac3e
Arg [3] : 000000000000000000000000e9b4d32f829951a3ce145d2caa84cf66af56ca5e
Arg [4] : 0000000000000000000000002ced5bc349d9241a314d3739f12f5f6f2bda6a68


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  ]
[ 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.