ETH Price: $3,288.11 (+1.78%)
 

Overview

ETH Balance

0 ETH

Eth Value

$0.00

Token Holdings

Multichain Info

No addresses found
Transaction Hash
Method
Block
From
To
Buyback216862812025-01-23 9:25:358 days ago1737624335IN
Tokenlon: Rewards Distributor
0 ETH0.000680026.52264203
Buyback216862762025-01-23 9:24:358 days ago1737624275IN
Tokenlon: Rewards Distributor
0 ETH0.000853847.27095003
Buyback216697272025-01-21 1:57:4711 days ago1737424667IN
Tokenlon: Rewards Distributor
0 ETH0.0013635213.16308097
Buyback216218842025-01-14 9:39:5917 days ago1736847599IN
Tokenlon: Rewards Distributor
0 ETH0.000993719.53147616
Buyback216218802025-01-14 9:39:1117 days ago1736847551IN
Tokenlon: Rewards Distributor
0 ETH0.000863737.35514629
Buyback216218762025-01-14 9:38:2317 days ago1736847503IN
Tokenlon: Rewards Distributor
0 ETH0.000647756.25326412
Buyback215709292025-01-07 6:53:4724 days ago1736232827IN
Tokenlon: Rewards Distributor
0 ETH0.000706675.82317209
Buyback215709242025-01-07 6:52:4724 days ago1736232767IN
Tokenlon: Rewards Distributor
0 ETH0.000787125.85075848
Buyback215709182025-01-07 6:51:3524 days ago1736232695IN
Tokenlon: Rewards Distributor
0 ETH0.000716336.18545066
Buyback215148052024-12-30 10:50:5932 days ago1735555859IN
Tokenlon: Rewards Distributor
0 ETH0.000492374.72274447
Buyback215148012024-12-30 10:50:1132 days ago1735555811IN
Tokenlon: Rewards Distributor
0 ETH0.000532994.53868758
Buyback215147982024-12-30 10:49:3532 days ago1735555775IN
Tokenlon: Rewards Distributor
0 ETH0.000434344.40021856
Buyback214644012024-12-23 9:50:2339 days ago1734947423IN
Tokenlon: Rewards Distributor
0 ETH0.001206159.93902217
Buyback214643982024-12-23 9:49:4739 days ago1734947387IN
Tokenlon: Rewards Distributor
0 ETH0.0014842210.08953634
Buyback214643952024-12-23 9:49:1139 days ago1734947351IN
Tokenlon: Rewards Distributor
0 ETH0.0012985511.21167436
Buyback214137752024-12-16 8:06:3546 days ago1734336395IN
Tokenlon: Rewards Distributor
0 ETH0.0012097511.60365213
Buyback214137712024-12-16 8:05:4746 days ago1734336347IN
Tokenlon: Rewards Distributor
0 ETH0.0014604311.23369292
Buyback214137632024-12-16 8:04:1146 days ago1734336251IN
Tokenlon: Rewards Distributor
0 ETH0.001134211.49023732
Buyback213659882024-12-09 15:57:5953 days ago1733759879IN
Tokenlon: Rewards Distributor
0 ETH0.0044903237.00129107
Buyback213659842024-12-09 15:57:1153 days ago1733759831IN
Tokenlon: Rewards Distributor
0 ETH0.0049352336.68416165
Buyback213659792024-12-09 15:56:1153 days ago1733759771IN
Tokenlon: Rewards Distributor
0 ETH0.0043837436.32322482
Buyback213147952024-12-02 12:22:2360 days ago1733142143IN
Tokenlon: Rewards Distributor
0 ETH0.0014226513.64577178
Buyback213147922024-12-02 12:21:4760 days ago1733142107IN
Tokenlon: Rewards Distributor
0 ETH0.0015429313.70671588
Buyback213147802024-12-02 12:19:2360 days ago1733141963IN
Tokenlon: Rewards Distributor
0 ETH0.0013672313.85101415
Buyback212644662024-11-25 11:26:3567 days ago1732533995IN
Tokenlon: Rewards Distributor
0 ETH0.0018641215.36078467
View all transactions

View more zero value Internal Transactions in Advanced View mode

Advanced mode:
Loading...
Loading

Contract Source Code Verified (Exact Match)

Contract Name:
RewardDistributor

Compiler Version
v0.7.4+commit.3f05b770

Optimization Enabled:
Yes with 1000 runs

Other Settings:
default evmVersion, MIT license
File 1 of 12 : RewardDistributor.sol
// SPDX-License-Identifier: MIT
pragma solidity >=0.6.0 <0.8.0;
pragma experimental ABIEncoderV2;

import "@openzeppelin/contracts/math/SafeMath.sol";
import "@openzeppelin/contracts/token/ERC20/IERC20.sol";
import "@openzeppelin/contracts/token/ERC20/SafeERC20.sol";
import "@openzeppelin/contracts/utils/Address.sol";
import "@openzeppelin/contracts/utils/Pausable.sol";
import "../../interfaces/IUniswapRouterV2.sol";
import "../../interfaces/ILon.sol";
import "../Ownable.sol";

contract RewardDistributor is Ownable, Pausable {
    using SafeMath for uint256;
    using SafeERC20 for IERC20;

    // Constants do not have storage slot.
    uint256 private constant MAX_UINT = 2**256 - 1;
    address public immutable LON_TOKEN_ADDR;

    // Below are the variables which consume storage slots.
    uint32 public buybackInterval;
    uint8 public miningFactor;
    uint8 public numStrategyAddr;
    uint8 public numExchangeAddr;

    mapping(address => bool) public isOperator;
    address public treasury;
    address public lonStaking;
    address public miningTreasury;
    address public feeTokenRecipient;

    mapping(uint256 => address) public strategyAddrs;
    mapping(uint256 => address) public exchangeAddrs;
    mapping(address => FeeToken) public feeTokens;

    /* Struct and event declaration */
    struct FeeToken {
        uint8 exchangeIndex;
        uint8 LFactor; // Percentage of fee token reserved for feeTokenRecipient
        uint8 RFactor; // Percentage of buyback-ed lon token for treasury
        uint32 lastTimeBuyback;
        bool enable;
        uint256 minBuy;
        uint256 maxBuy;
        address[] path;
    }

    // Owner events
    
    event SetOperator(address operator, bool enable);
    event SetMiningFactor(uint8 miningFactor);
    event SetTreasury(address treasury);
    event SetLonStaking(address lonStaking);
    event SetMiningTreasury(address miningTreasury);
    event SetFeeTokenRecipient(address feeTokenRecipient);
    // Operator events
    event SetBuybackInterval(uint256 interval);
    event SetStrategy(uint256 index, address strategy);
    event SetExchange(uint256 index, address exchange);
    event EnableFeeToken(address feeToken, bool enable);
    event SetFeeToken(
        address feeToken,
        uint256 exchangeIndex,
        address[] path,
        uint256 LFactor,
        uint256 RFactor,
        uint256 minBuy,
        uint256 maxBuy
    );
    event SetFeeTokenFailure(address feeToken, string reason, bytes lowLevelData);

    event BuyBack(
        address feeToken,
        uint256 feeTokenAmount,
        uint256 swappedLonAmount,
        uint256 LFactor,
        uint256 RFactor,
        uint256 minBuy,
        uint256 maxBuy
    );
    event BuyBackFailure(address feeToken, uint256 feeTokenAmount, string reason, bytes lowLevelData);
    event DistributeLon(uint256 treasuryAmount, uint256 lonStakingAmount);
    event MintLon(uint256 mintedAmount);
    event Recovered(address token, uint256 amount);


    /************************************************************
    *                      Access control                       *
    *************************************************************/
    modifier only_Operator_or_Owner {
        require(_isAuthorized(msg.sender), "only operator or owner can call");
        _;
    }

    modifier only_Owner_or_Operator_or_Self {
        if (msg.sender != address(this)) {
            require(_isAuthorized(msg.sender), "only operator or owner can call");
        }
        _;
    }

    modifier only_EOA {
        require((msg.sender == tx.origin), "only EOA can call");
        _;
    }

    modifier only_EOA_or_Self {
        if (msg.sender != address(this)) {
            require((msg.sender == tx.origin), "only EOA can call");
        }
        _;
    }


    /************************************************************
    *                       Constructor                         *
    *************************************************************/
    constructor(
        address _LON_TOKEN_ADDR,
        address _owner,
        address _operator,
        uint32 _buyBackInterval,
        uint8 _miningFactor,
        address _treasury,
        address _lonStaking,
        address _miningTreasury,
        address _feeTokenRecipient
    ) Ownable(_owner) {
        LON_TOKEN_ADDR = _LON_TOKEN_ADDR;

        isOperator[_operator] = true;

        buybackInterval = _buyBackInterval;

        require(_miningFactor <= 100, "incorrect mining factor");
        miningFactor = _miningFactor;

        require(Address.isContract(_lonStaking), "Lon staking is not a contract");
        treasury = _treasury;
        lonStaking = _lonStaking;
        miningTreasury = _miningTreasury;
        feeTokenRecipient = _feeTokenRecipient;
    }

    /************************************************************
    *                     Getter functions                      *
    *************************************************************/
    function getFeeTokenPath(address _feeTokenAddr) public view returns (address[] memory path) {
        return feeTokens[_feeTokenAddr].path;
    }

    /************************************************************
    *             Management functions for Owner                *
    *************************************************************/
    function pause() external onlyOwner whenNotPaused {
        _pause();
    }

    function unpause() external onlyOwner whenPaused {
        _unpause();
    }

    function setOperator(address _operator, bool _enable) external onlyOwner {
        isOperator[_operator] = _enable;

        emit SetOperator(_operator, _enable);
    }

    function setMiningFactor(uint8 _miningFactor) external onlyOwner {
        require(_miningFactor <= 100, "incorrect mining factor");

        miningFactor = _miningFactor;
        emit SetMiningFactor(_miningFactor);
    }

    function setTreasury(address _treasury) external onlyOwner {
        treasury = _treasury;
        emit SetTreasury(_treasury);
    }

    function setLonStaking(address _lonStaking) external onlyOwner {
        require(Address.isContract(_lonStaking), "Lon staking is not a contract");

        lonStaking = _lonStaking;
        emit SetLonStaking(_lonStaking);
    }

    function setMiningTreasury(address _miningTreasury) external onlyOwner {
        miningTreasury = _miningTreasury;
        emit SetMiningTreasury(_miningTreasury);
    }

    function setFeeTokenRecipient(address _feeTokenRecipient) external onlyOwner {
        feeTokenRecipient = _feeTokenRecipient;
        emit SetFeeTokenRecipient(_feeTokenRecipient);
    }

    /************************************************************
    *           Management functions for Operator               *
    *************************************************************/

    function recoverERC20(address _tokenAddress, uint256 _tokenAmount) external only_Operator_or_Owner {
        IERC20(_tokenAddress).safeTransfer(owner, _tokenAmount);
        emit Recovered(_tokenAddress, _tokenAmount);
    }

    function setBuybackInterval(uint32 _buyBackInterval) external only_Operator_or_Owner {
        require(_buyBackInterval >= 3600, "invalid buyback interval");

        buybackInterval = _buyBackInterval;
        emit SetBuybackInterval(_buyBackInterval);
    }

    function setStrategyAddrs(uint256[] calldata _indexes, address[] calldata _strategyAddrs) external only_Operator_or_Owner {
        require(_indexes.length == _strategyAddrs.length, "input not the same length");

        for (uint256 i = 0; i < _indexes.length; i++) {
            require(Address.isContract(_strategyAddrs[i]), "strategy is not a contract");
            require(_indexes[i] <= numStrategyAddr, "index out of bound");

            strategyAddrs[_indexes[i]] = _strategyAddrs[i];
            if (_indexes[i] == numStrategyAddr) numStrategyAddr++;
            emit SetStrategy(_indexes[i], _strategyAddrs[i]);
        }
    }

    function setExchangeAddrs(uint256[] calldata _indexes, address[] calldata _exchangeAddrs) external only_Operator_or_Owner {
        require(_indexes.length == _exchangeAddrs.length, "input not the same length");

        for (uint256 i = 0; i < _indexes.length; i++) {
            require(Address.isContract(_exchangeAddrs[i]), "exchange is not a contract");
            require(_indexes[i] <= numExchangeAddr, "index out of bound");

            exchangeAddrs[_indexes[i]] = _exchangeAddrs[i];
            if (_indexes[i] == numExchangeAddr) numExchangeAddr++;
            emit SetExchange(_indexes[i], _exchangeAddrs[i]);
        }
    }

    function setFeeToken(
        address _feeTokenAddr,
        uint8 _exchangeIndex,
        address[] calldata _path,
        uint8 _LFactor,
        uint8 _RFactor,
        bool _enable,
        uint256 _minBuy,
        uint256 _maxBuy
    ) external only_Owner_or_Operator_or_Self {
        // Validate fee token inputs
        require(Address.isContract(_feeTokenAddr), "fee token is not a contract");
        require(Address.isContract(exchangeAddrs[_exchangeIndex]), "exchange is not a contract");
        require(_path.length >= 2, "invalid swap path");
        require(_path[_path.length - 1] == LON_TOKEN_ADDR, "output token must be LON");
        require(_LFactor <= 100, "incorrect LFactor");
        require(_RFactor <= 100, "incorrect RFactor");
        require(_minBuy <= _maxBuy, "incorrect minBuy and maxBuy");

        FeeToken storage feeToken = feeTokens[_feeTokenAddr];
        feeToken.exchangeIndex = _exchangeIndex;
        feeToken.path = _path;
        feeToken.LFactor = _LFactor;
        feeToken.RFactor = _RFactor;
        if (feeToken.enable != _enable) {
            feeToken.enable = _enable;
            emit EnableFeeToken(_feeTokenAddr, _enable);
        }
        feeToken.minBuy = _minBuy;
        feeToken.maxBuy = _maxBuy;
        emit SetFeeToken(_feeTokenAddr, _exchangeIndex, _path, _LFactor, _RFactor, _minBuy, _maxBuy);
    }

    function setFeeTokens(
        address[] memory _feeTokenAddr,
        uint8[] memory _exchangeIndex,
        address[][] memory _path,
        uint8[] memory _LFactor,
        uint8[] memory _RFactor,
        bool[] memory _enable,
        uint256[] memory _minBuy,
        uint256[] memory _maxBuy
    ) external only_Operator_or_Owner {
        uint256 inputLength = _feeTokenAddr.length;
        require(
            (_exchangeIndex.length == inputLength) &&
                (_path.length == inputLength) &&
                (_LFactor.length == inputLength) &&
                (_RFactor.length == inputLength) &&
                (_enable.length == inputLength) &&
                (_minBuy.length == inputLength) &&
                (_maxBuy.length == inputLength),
            "input not the same length"
        );

        for (uint256 i = 0; i < inputLength; i++) {
            try
                this.setFeeToken(
                    _feeTokenAddr[i],
                    _exchangeIndex[i],
                    _path[i],
                    _LFactor[i],
                    _RFactor[i],
                    _enable[i],
                    _minBuy[i],
                    _maxBuy[i]
                )
            {
                continue;
            } catch Error(string memory reason) {
                emit SetFeeTokenFailure(_feeTokenAddr[i], reason, bytes(""));
            } catch (bytes memory lowLevelData) {
                emit SetFeeTokenFailure(_feeTokenAddr[i], "", lowLevelData);
            }
        }
    }

    function enableFeeToken(address _feeTokenAddr, bool _enable) external only_Operator_or_Owner {
        FeeToken storage feeToken = feeTokens[_feeTokenAddr];
        if (feeToken.enable != _enable) {
            feeToken.enable = _enable;
            emit EnableFeeToken(_feeTokenAddr, _enable);
        }
    }

    function enableFeeTokens(address[] calldata _feeTokenAddr, bool[] calldata _enable) external only_Operator_or_Owner {
        require(_feeTokenAddr.length == _enable.length, "input not the same length");

        for (uint256 i = 0; i < _feeTokenAddr.length; i++) {
            FeeToken storage feeToken = feeTokens[_feeTokenAddr[i]];
            if (feeToken.enable != _enable[i]) {
                feeToken.enable = _enable[i];
                emit EnableFeeToken(_feeTokenAddr[i], _enable[i]);
            }
        }
    }

    function _isAuthorized(address _account) internal view returns (bool) {
        if ((isOperator[_account]) || (_account == owner)) return true;
        else return false;
    }

    function _validate(
        FeeToken memory _feeToken,
        uint256 _amount
    ) internal view returns (uint256 amountFeeTokenToSwap, uint256 amountFeeTokenToTransfer) {
        require(_amount > 0, "zero fee token amount");
        if (!_isAuthorized(msg.sender)) {
            require(_feeToken.enable, "fee token is not enabled");
        }

        amountFeeTokenToTransfer = _amount.mul(_feeToken.LFactor).div(100);
        amountFeeTokenToSwap = _amount.sub(amountFeeTokenToTransfer);

        if (amountFeeTokenToSwap > 0) {
            require(amountFeeTokenToSwap >= _feeToken.minBuy, "amount less than min buy");
            require(amountFeeTokenToSwap <= _feeToken.maxBuy, "amount greater than max buy");
            require(block.timestamp > uint256(_feeToken.lastTimeBuyback).add(uint256(buybackInterval)), "already a buyback recently");
        }
    }

    function _transferFeeToken(
        address _feeTokenAddr,
        address _transferTo,
        uint256 _totalFeeTokenAmount
    ) internal {
        address strategyAddr;
        uint256 balanceInStrategy;
        uint256 amountToTransferFrom;
        uint256 cumulatedAmount;
        for (uint256 i = 0; i < numStrategyAddr; i++) {
            strategyAddr = strategyAddrs[i];
            balanceInStrategy = IERC20(_feeTokenAddr).balanceOf(strategyAddr);
            if (cumulatedAmount.add(balanceInStrategy) > _totalFeeTokenAmount) {
                amountToTransferFrom = _totalFeeTokenAmount.sub(cumulatedAmount);
            } else {
                amountToTransferFrom = balanceInStrategy;
            }
            if (amountToTransferFrom == 0) continue;
            IERC20(_feeTokenAddr).safeTransferFrom(strategyAddr, _transferTo, amountToTransferFrom);

            cumulatedAmount = cumulatedAmount.add(amountToTransferFrom);
            if (cumulatedAmount == _totalFeeTokenAmount) break;
        }
        require(cumulatedAmount == _totalFeeTokenAmount, "insufficient amount of fee tokens");
    }

    function _swap(
        address _feeTokenAddr,
        address _exchangeAddr,
        address[] memory _path,
        uint256 _amountFeeTokenToSwap,
        uint256 _minLonAmount
    ) internal returns (uint256 swappedLonAmount) {
        // Approve exchange contract
        IERC20(_feeTokenAddr).safeApprove(_exchangeAddr, MAX_UINT);

        // Swap fee token for Lon
        IUniswapRouterV2 router = IUniswapRouterV2(_exchangeAddr);

        uint256[] memory amounts = router.swapExactTokensForTokens(
            _amountFeeTokenToSwap,
            _minLonAmount,  // Minimum amount of Lon expected to receive
            _path,
            address(this),
            block.timestamp + 60
        );
        swappedLonAmount = amounts[_path.length - 1];

        // Clear allowance for exchange contract
        IERC20(_feeTokenAddr).safeApprove(_exchangeAddr, 0);
    }

    function _distributeLon(
        FeeToken memory _feeToken, 
        uint256 swappedLonAmount
    ) internal {
        // To Treasury
        uint256 treasuryAmount = swappedLonAmount.mul(_feeToken.RFactor).div(100);
        if (treasuryAmount > 0) {
            IERC20(LON_TOKEN_ADDR).safeTransfer(treasury, treasuryAmount);
        }

        // To LonStaking
        uint256 lonStakingAmount = swappedLonAmount.sub(treasuryAmount);
        if (lonStakingAmount > 0) {
            IERC20(LON_TOKEN_ADDR).safeTransfer(lonStaking, lonStakingAmount);
        }

        emit DistributeLon(treasuryAmount, lonStakingAmount);
    }

    function _mintLon(uint256 swappedLonAmount) internal {
        // Mint Lon for MiningTreasury
        uint256 mintedAmount = swappedLonAmount.mul(uint256(miningFactor)).div(100);
        if (mintedAmount > 0) {
            ILon(LON_TOKEN_ADDR).mint(miningTreasury, mintedAmount);
            emit MintLon(mintedAmount);
        }
    }

    function _buyback(
        address _feeTokenAddr,
        FeeToken storage _feeToken,
        address _exchangeAddr,
        uint256 _amountFeeTokenToSwap,
        uint256 _minLonAmount
    ) internal {
        if (_amountFeeTokenToSwap > 0) {
            uint256 swappedLonAmount =
                _swap(_feeTokenAddr, _exchangeAddr, _feeToken.path, _amountFeeTokenToSwap, _minLonAmount);

            // Update fee token data
            _feeToken.lastTimeBuyback = uint32(block.timestamp);

            emit BuyBack(
                _feeTokenAddr,
                _amountFeeTokenToSwap,
                swappedLonAmount,
                _feeToken.LFactor,
                _feeToken.RFactor,
                _feeToken.minBuy,
                _feeToken.maxBuy
            );

            _distributeLon(_feeToken, swappedLonAmount);
            _mintLon(swappedLonAmount);
        }
    }

    /************************************************************
    *                   External functions                      *
    *************************************************************/
    function buyback(address _feeTokenAddr, uint256 _amount, uint256 _minLonAmount) external whenNotPaused only_EOA_or_Self {
        FeeToken storage feeToken = feeTokens[_feeTokenAddr];

        // Distribute LON directly without swap
        if (_feeTokenAddr == LON_TOKEN_ADDR) {
            require(feeToken.enable, "fee token is not enabled");
            require(_amount >= feeToken.minBuy, "amount less than min buy");
            uint256 _lonToTreasury = _amount.mul(feeToken.RFactor).div(100);
            uint256 _lonToStaking = _amount.sub(_lonToTreasury);
            _transferFeeToken(LON_TOKEN_ADDR, treasury, _lonToTreasury);
            _transferFeeToken(LON_TOKEN_ADDR, lonStaking, _lonToStaking);
            emit DistributeLon(_lonToTreasury, _lonToStaking);
            _mintLon(_amount);

            // Update lastTimeBuyback
            feeToken.lastTimeBuyback = uint32(block.timestamp);
            return;
        }

        // Validate fee token data and input amount
        (uint256 amountFeeTokenToSwap, uint256 amountFeeTokenToTransfer) = _validate(feeToken, _amount);

        if (amountFeeTokenToSwap == 0) {
            // No need to swap, transfer feeToken directly
            _transferFeeToken(_feeTokenAddr, feeTokenRecipient, amountFeeTokenToTransfer);
        } else {
            // Transfer fee token from strategy contracts to distributor
            _transferFeeToken(_feeTokenAddr, address(this), _amount);

            // Buyback
            _buyback(_feeTokenAddr, feeToken, exchangeAddrs[feeToken.exchangeIndex], amountFeeTokenToSwap, _minLonAmount);

            // Transfer fee token from distributor to feeTokenRecipient
            if (amountFeeTokenToTransfer > 0) {
                IERC20(_feeTokenAddr).safeTransfer(feeTokenRecipient, amountFeeTokenToTransfer);
            }
        }
    }

    function batchBuyback(
        address[] calldata _feeTokenAddr,
        uint256[] calldata _amount,
        uint256[] calldata _minLonAmount
    ) external whenNotPaused only_EOA {
        uint256 inputLength = _feeTokenAddr.length;
        require(
            (_amount.length == inputLength) &&
            (_minLonAmount.length == inputLength),
            "input not the same length"
        );

        for (uint256 i = 0; i < inputLength; i++) {
            try this.buyback(_feeTokenAddr[i], _amount[i], _minLonAmount[i]) {
                continue;
            } catch Error(string memory reason) {
                emit BuyBackFailure(_feeTokenAddr[i], _amount[i], reason, bytes(""));
            } catch (bytes memory lowLevelData) {
                emit BuyBackFailure(_feeTokenAddr[i], _amount[i], "", lowLevelData);
            }
        }
    }
}

File 2 of 12 : SafeMath.sol
// SPDX-License-Identifier: MIT

pragma solidity >=0.6.0 <0.8.0;

/**
 * @dev Wrappers over Solidity's arithmetic operations with added overflow
 * checks.
 *
 * Arithmetic operations in Solidity wrap on overflow. This can easily result
 * in bugs, because programmers usually assume that an overflow raises an
 * error, which is the standard behavior in high level programming languages.
 * `SafeMath` restores this intuition by reverting the transaction when an
 * operation overflows.
 *
 * Using this library instead of the unchecked operations eliminates an entire
 * class of bugs, so it's recommended to use it always.
 */
library SafeMath {
    /**
     * @dev Returns the addition of two unsigned integers, with an overflow flag.
     *
     * _Available since v3.4._
     */
    function tryAdd(uint256 a, uint256 b) internal pure returns (bool, uint256) {
        uint256 c = a + b;
        if (c < a) return (false, 0);
        return (true, c);
    }

    /**
     * @dev Returns the substraction of two unsigned integers, with an overflow flag.
     *
     * _Available since v3.4._
     */
    function trySub(uint256 a, uint256 b) internal pure returns (bool, uint256) {
        if (b > a) return (false, 0);
        return (true, a - b);
    }

    /**
     * @dev Returns the multiplication of two unsigned integers, with an overflow flag.
     *
     * _Available since v3.4._
     */
    function tryMul(uint256 a, uint256 b) internal pure returns (bool, uint256) {
        // Gas optimization: this is cheaper than requiring 'a' not being zero, but the
        // benefit is lost if 'b' is also tested.
        // See: https://github.com/OpenZeppelin/openzeppelin-contracts/pull/522
        if (a == 0) return (true, 0);
        uint256 c = a * b;
        if (c / a != b) return (false, 0);
        return (true, c);
    }

    /**
     * @dev Returns the division of two unsigned integers, with a division by zero flag.
     *
     * _Available since v3.4._
     */
    function tryDiv(uint256 a, uint256 b) internal pure returns (bool, uint256) {
        if (b == 0) return (false, 0);
        return (true, a / b);
    }

    /**
     * @dev Returns the remainder of dividing two unsigned integers, with a division by zero flag.
     *
     * _Available since v3.4._
     */
    function tryMod(uint256 a, uint256 b) internal pure returns (bool, uint256) {
        if (b == 0) return (false, 0);
        return (true, a % b);
    }

    /**
     * @dev Returns the addition of two unsigned integers, reverting on
     * overflow.
     *
     * Counterpart to Solidity's `+` operator.
     *
     * Requirements:
     *
     * - Addition cannot overflow.
     */
    function add(uint256 a, uint256 b) internal pure returns (uint256) {
        uint256 c = a + b;
        require(c >= a, "SafeMath: addition overflow");
        return c;
    }

    /**
     * @dev Returns the subtraction of two unsigned integers, reverting on
     * overflow (when the result is negative).
     *
     * Counterpart to Solidity's `-` operator.
     *
     * Requirements:
     *
     * - Subtraction cannot overflow.
     */
    function sub(uint256 a, uint256 b) internal pure returns (uint256) {
        require(b <= a, "SafeMath: subtraction overflow");
        return a - b;
    }

    /**
     * @dev Returns the multiplication of two unsigned integers, reverting on
     * overflow.
     *
     * Counterpart to Solidity's `*` operator.
     *
     * Requirements:
     *
     * - Multiplication cannot overflow.
     */
    function mul(uint256 a, uint256 b) internal pure returns (uint256) {
        if (a == 0) return 0;
        uint256 c = a * b;
        require(c / a == b, "SafeMath: multiplication overflow");
        return c;
    }

    /**
     * @dev Returns the integer division of two unsigned integers, reverting on
     * division by zero. The result is rounded towards zero.
     *
     * Counterpart to Solidity's `/` operator. Note: this function uses a
     * `revert` opcode (which leaves remaining gas untouched) while Solidity
     * uses an invalid opcode to revert (consuming all remaining gas).
     *
     * Requirements:
     *
     * - The divisor cannot be zero.
     */
    function div(uint256 a, uint256 b) internal pure returns (uint256) {
        require(b > 0, "SafeMath: division by zero");
        return a / b;
    }

    /**
     * @dev Returns the remainder of dividing two unsigned integers. (unsigned integer modulo),
     * reverting when dividing by zero.
     *
     * Counterpart to Solidity's `%` operator. This function uses a `revert`
     * opcode (which leaves remaining gas untouched) while Solidity uses an
     * invalid opcode to revert (consuming all remaining gas).
     *
     * Requirements:
     *
     * - The divisor cannot be zero.
     */
    function mod(uint256 a, uint256 b) internal pure returns (uint256) {
        require(b > 0, "SafeMath: modulo by zero");
        return a % b;
    }

    /**
     * @dev Returns the subtraction of two unsigned integers, reverting with custom message on
     * overflow (when the result is negative).
     *
     * CAUTION: This function is deprecated because it requires allocating memory for the error
     * message unnecessarily. For custom revert reasons use {trySub}.
     *
     * Counterpart to Solidity's `-` operator.
     *
     * Requirements:
     *
     * - Subtraction cannot overflow.
     */
    function sub(uint256 a, uint256 b, string memory errorMessage) internal pure returns (uint256) {
        require(b <= a, errorMessage);
        return a - b;
    }

    /**
     * @dev Returns the integer division of two unsigned integers, reverting with custom message on
     * division by zero. The result is rounded towards zero.
     *
     * CAUTION: This function is deprecated because it requires allocating memory for the error
     * message unnecessarily. For custom revert reasons use {tryDiv}.
     *
     * Counterpart to Solidity's `/` operator. Note: this function uses a
     * `revert` opcode (which leaves remaining gas untouched) while Solidity
     * uses an invalid opcode to revert (consuming all remaining gas).
     *
     * Requirements:
     *
     * - The divisor cannot be zero.
     */
    function div(uint256 a, uint256 b, string memory errorMessage) internal pure returns (uint256) {
        require(b > 0, errorMessage);
        return a / b;
    }

    /**
     * @dev Returns the remainder of dividing two unsigned integers. (unsigned integer modulo),
     * reverting with custom message when dividing by zero.
     *
     * CAUTION: This function is deprecated because it requires allocating memory for the error
     * message unnecessarily. For custom revert reasons use {tryMod}.
     *
     * Counterpart to Solidity's `%` operator. This function uses a `revert`
     * opcode (which leaves remaining gas untouched) while Solidity uses an
     * invalid opcode to revert (consuming all remaining gas).
     *
     * Requirements:
     *
     * - The divisor cannot be zero.
     */
    function mod(uint256 a, uint256 b, string memory errorMessage) internal pure returns (uint256) {
        require(b > 0, errorMessage);
        return a % b;
    }
}

File 3 of 12 : IERC20.sol
// SPDX-License-Identifier: MIT

pragma solidity >=0.6.0 <0.8.0;

/**
 * @dev Interface of the ERC20 standard as defined in the EIP.
 */
interface IERC20 {
    /**
     * @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 `recipient`.
     *
     * Returns a boolean value indicating whether the operation succeeded.
     *
     * Emits a {Transfer} event.
     */
    function transfer(address recipient, 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 `sender` to `recipient` 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 sender, address recipient, uint256 amount) external returns (bool);

    /**
     * @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);
}

File 4 of 12 : SafeERC20.sol
// SPDX-License-Identifier: MIT

pragma solidity >=0.6.0 <0.8.0;

import "./IERC20.sol";
import "../../math/SafeMath.sol";
import "../../utils/Address.sol";

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

    function safeTransfer(IERC20 token, address to, uint256 value) internal {
        _callOptionalReturn(token, abi.encodeWithSelector(token.transfer.selector, to, value));
    }

    function safeTransferFrom(IERC20 token, address from, address to, uint256 value) internal {
        _callOptionalReturn(token, abi.encodeWithSelector(token.transferFrom.selector, from, to, value));
    }

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

    function safeIncreaseAllowance(IERC20 token, address spender, uint256 value) internal {
        uint256 newAllowance = token.allowance(address(this), spender).add(value);
        _callOptionalReturn(token, abi.encodeWithSelector(token.approve.selector, spender, newAllowance));
    }

    function safeDecreaseAllowance(IERC20 token, address spender, uint256 value) internal {
        uint256 newAllowance = token.allowance(address(this), spender).sub(value, "SafeERC20: decreased allowance below zero");
        _callOptionalReturn(token, abi.encodeWithSelector(token.approve.selector, spender, newAllowance));
    }

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

        bytes memory returndata = address(token).functionCall(data, "SafeERC20: low-level call failed");
        if (returndata.length > 0) { // Return data is optional
            // solhint-disable-next-line max-line-length
            require(abi.decode(returndata, (bool)), "SafeERC20: ERC20 operation did not succeed");
        }
    }
}

File 5 of 12 : Address.sol
// SPDX-License-Identifier: MIT

pragma solidity >=0.6.2 <0.8.0;

/**
 * @dev Collection of functions related to the address type
 */
library Address {
    /**
     * @dev Returns true if `account` is a contract.
     *
     * [IMPORTANT]
     * ====
     * It is unsafe to assume that an address for which this function returns
     * false is an externally-owned account (EOA) and not a contract.
     *
     * Among others, `isContract` will return false for the following
     * types of addresses:
     *
     *  - an externally-owned account
     *  - a contract in construction
     *  - an address where a contract will be created
     *  - an address where a contract lived, but was destroyed
     * ====
     */
    function isContract(address account) internal view returns (bool) {
        // This method relies on extcodesize, which returns 0 for contracts in
        // construction, since the code is only stored at the end of the
        // constructor execution.

        uint256 size;
        // solhint-disable-next-line no-inline-assembly
        assembly { size := extcodesize(account) }
        return size > 0;
    }

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

        // solhint-disable-next-line avoid-low-level-calls, avoid-call-value
        (bool success, ) = recipient.call{ value: amount }("");
        require(success, "Address: unable to send value, recipient may have reverted");
    }

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

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

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

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

        // solhint-disable-next-line avoid-low-level-calls
        (bool success, bytes memory returndata) = target.call{ value: value }(data);
        return _verifyCallResult(success, returndata, errorMessage);
    }

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

    /**
     * @dev Same as {xref-Address-functionCall-address-bytes-string-}[`functionCall`],
     * but performing a static call.
     *
     * _Available since v3.3._
     */
    function functionStaticCall(address target, bytes memory data, string memory errorMessage) internal view returns (bytes memory) {
        require(isContract(target), "Address: static call to non-contract");

        // solhint-disable-next-line avoid-low-level-calls
        (bool success, bytes memory returndata) = target.staticcall(data);
        return _verifyCallResult(success, returndata, errorMessage);
    }

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

    /**
     * @dev Same as {xref-Address-functionCall-address-bytes-string-}[`functionCall`],
     * but performing a delegate call.
     *
     * _Available since v3.4._
     */
    function functionDelegateCall(address target, bytes memory data, string memory errorMessage) internal returns (bytes memory) {
        require(isContract(target), "Address: delegate call to non-contract");

        // solhint-disable-next-line avoid-low-level-calls
        (bool success, bytes memory returndata) = target.delegatecall(data);
        return _verifyCallResult(success, returndata, errorMessage);
    }

    function _verifyCallResult(bool success, bytes memory returndata, string memory errorMessage) private pure returns(bytes memory) {
        if (success) {
            return returndata;
        } else {
            // Look for revert reason and bubble it up if present
            if (returndata.length > 0) {
                // The easiest way to bubble the revert reason is using memory via assembly

                // solhint-disable-next-line no-inline-assembly
                assembly {
                    let returndata_size := mload(returndata)
                    revert(add(32, returndata), returndata_size)
                }
            } else {
                revert(errorMessage);
            }
        }
    }
}

File 6 of 12 : Context.sol
// SPDX-License-Identifier: MIT

pragma solidity >=0.6.0 <0.8.0;

/*
 * @dev Provides information about the current execution context, including the
 * sender of the transaction and its data. While these are generally available
 * via msg.sender and msg.data, they should not be accessed in such a direct
 * manner, since when dealing with GSN meta-transactions the account sending and
 * paying for execution may not be the actual sender (as far as an application
 * is concerned).
 *
 * This contract is only required for intermediate, library-like contracts.
 */
abstract contract Context {
    function _msgSender() internal view virtual returns (address payable) {
        return msg.sender;
    }

    function _msgData() internal view virtual returns (bytes memory) {
        this; // silence state mutability warning without generating bytecode - see https://github.com/ethereum/solidity/issues/2691
        return msg.data;
    }
}

File 7 of 12 : Pausable.sol
// SPDX-License-Identifier: MIT

pragma solidity >=0.6.0 <0.8.0;

import "./Context.sol";

/**
 * @dev Contract module which allows children to implement an emergency stop
 * mechanism that can be triggered by an authorized account.
 *
 * This module is used through inheritance. It will make available the
 * modifiers `whenNotPaused` and `whenPaused`, which can be applied to
 * the functions of your contract. Note that they will not be pausable by
 * simply including this module, only once the modifiers are put in place.
 */
abstract contract Pausable is Context {
    /**
     * @dev Emitted when the pause is triggered by `account`.
     */
    event Paused(address account);

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

    bool private _paused;

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

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

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

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

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

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

File 8 of 12 : Ownable.sol
// SPDX-License-Identifier: MIT
pragma solidity >=0.6.0 <0.8.0;

abstract contract Ownable {
    address public owner;
    address public nominatedOwner;

    constructor(address _owner) {
        owner = _owner;
    }

    function acceptOwnership() external {
        require(msg.sender == nominatedOwner, "not nominated");
        emit OwnerChanged(owner, nominatedOwner);

        owner = nominatedOwner;
        nominatedOwner = address(0);
    }

    function renounceOwnership() external onlyOwner {
        emit OwnerChanged(owner, address(0));
        owner = address(0);
    }

    function nominateNewOwner(address newOwner) external onlyOwner {
        nominatedOwner = newOwner;
        emit OwnerNominated(newOwner);
    }

    modifier onlyOwner {
        require(msg.sender == owner, "not owner");
        _;
    }

    event OwnerNominated(address indexed newOwner);
    event OwnerChanged(address indexed oldOwner, address indexed newOwner);
}

File 9 of 12 : IEIP2612.sol
// SPDX-License-Identifier: MIT
pragma solidity >=0.6.0 <0.8.0;

import "@openzeppelin/contracts/token/ERC20/IERC20.sol";

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

File 10 of 12 : IEmergency.sol
// SPDX-License-Identifier: MIT
pragma solidity >=0.6.0 <0.8.0;

import "@openzeppelin/contracts/token/ERC20/IERC20.sol";

interface IEmergency {
    function emergencyWithdraw(IERC20 token) external ;
}

File 11 of 12 : ILon.sol
// SPDX-License-Identifier: MIT
pragma solidity >=0.6.0 <0.8.0;

import "./IEmergency.sol";
import "./IEIP2612.sol";

interface ILon is IEmergency, IEIP2612 {
  function cap() external view returns(uint256);

  function mint(address to, uint256 amount) external; 

  function burn(uint256 amount) external;
}

File 12 of 12 : IUniswapRouterV2.sol
// SPDX-License-Identifier: MIT
pragma solidity >=0.5.0 <0.8.0;

interface IUniswapRouterV2 {
    function swapExactTokensForTokens(
        uint256 amountIn,
        uint256 amountOutMin,
        address[] calldata path,
        address to,
        uint256 deadline
    ) external returns (uint256[] memory amounts);

    function getAmountsOut(uint256 amountIn, address[] calldata path)
        external
        view
        returns (uint256[] memory amounts);

    function getAmountsIn(uint256 amountOut, address[] calldata path)
        external
        view
        returns (uint256[] memory amounts);

    function swapETHForExactTokens(
        uint256 amountOut,
        address[] calldata path,
        address to,
        uint256 deadline
    ) external payable returns (uint256[] memory amounts);

    function swapExactETHForTokens(
        uint256 amountOutMin,
        address[] calldata path,
        address to,
        uint256 deadline
    ) external payable returns (uint256[] memory amounts);
}

Settings
{
  "evmVersion": "istanbul",
  "libraries": {},
  "metadata": {
    "bytecodeHash": "ipfs",
    "useLiteralContent": true
  },
  "optimizer": {
    "enabled": true,
    "runs": 1000
  },
  "remappings": [],
  "outputSelection": {
    "*": {
      "*": [
        "evm.bytecode",
        "evm.deployedBytecode",
        "abi"
      ]
    }
  }
}

Contract Security Audit

Contract ABI

[{"inputs":[{"internalType":"address","name":"_LON_TOKEN_ADDR","type":"address"},{"internalType":"address","name":"_owner","type":"address"},{"internalType":"address","name":"_operator","type":"address"},{"internalType":"uint32","name":"_buyBackInterval","type":"uint32"},{"internalType":"uint8","name":"_miningFactor","type":"uint8"},{"internalType":"address","name":"_treasury","type":"address"},{"internalType":"address","name":"_lonStaking","type":"address"},{"internalType":"address","name":"_miningTreasury","type":"address"},{"internalType":"address","name":"_feeTokenRecipient","type":"address"}],"stateMutability":"nonpayable","type":"constructor"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"feeToken","type":"address"},{"indexed":false,"internalType":"uint256","name":"feeTokenAmount","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"swappedLonAmount","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"LFactor","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"RFactor","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"minBuy","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"maxBuy","type":"uint256"}],"name":"BuyBack","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"feeToken","type":"address"},{"indexed":false,"internalType":"uint256","name":"feeTokenAmount","type":"uint256"},{"indexed":false,"internalType":"string","name":"reason","type":"string"},{"indexed":false,"internalType":"bytes","name":"lowLevelData","type":"bytes"}],"name":"BuyBackFailure","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"treasuryAmount","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"lonStakingAmount","type":"uint256"}],"name":"DistributeLon","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"feeToken","type":"address"},{"indexed":false,"internalType":"bool","name":"enable","type":"bool"}],"name":"EnableFeeToken","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"mintedAmount","type":"uint256"}],"name":"MintLon","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"oldOwner","type":"address"},{"indexed":true,"internalType":"address","name":"newOwner","type":"address"}],"name":"OwnerChanged","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"newOwner","type":"address"}],"name":"OwnerNominated","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"account","type":"address"}],"name":"Paused","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"token","type":"address"},{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"}],"name":"Recovered","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"interval","type":"uint256"}],"name":"SetBuybackInterval","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"index","type":"uint256"},{"indexed":false,"internalType":"address","name":"exchange","type":"address"}],"name":"SetExchange","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"feeToken","type":"address"},{"indexed":false,"internalType":"uint256","name":"exchangeIndex","type":"uint256"},{"indexed":false,"internalType":"address[]","name":"path","type":"address[]"},{"indexed":false,"internalType":"uint256","name":"LFactor","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"RFactor","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"minBuy","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"maxBuy","type":"uint256"}],"name":"SetFeeToken","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"feeToken","type":"address"},{"indexed":false,"internalType":"string","name":"reason","type":"string"},{"indexed":false,"internalType":"bytes","name":"lowLevelData","type":"bytes"}],"name":"SetFeeTokenFailure","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"feeTokenRecipient","type":"address"}],"name":"SetFeeTokenRecipient","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"lonStaking","type":"address"}],"name":"SetLonStaking","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint8","name":"miningFactor","type":"uint8"}],"name":"SetMiningFactor","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"miningTreasury","type":"address"}],"name":"SetMiningTreasury","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"operator","type":"address"},{"indexed":false,"internalType":"bool","name":"enable","type":"bool"}],"name":"SetOperator","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"index","type":"uint256"},{"indexed":false,"internalType":"address","name":"strategy","type":"address"}],"name":"SetStrategy","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"treasury","type":"address"}],"name":"SetTreasury","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"account","type":"address"}],"name":"Unpaused","type":"event"},{"inputs":[],"name":"LON_TOKEN_ADDR","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"acceptOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address[]","name":"_feeTokenAddr","type":"address[]"},{"internalType":"uint256[]","name":"_amount","type":"uint256[]"},{"internalType":"uint256[]","name":"_minLonAmount","type":"uint256[]"}],"name":"batchBuyback","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_feeTokenAddr","type":"address"},{"internalType":"uint256","name":"_amount","type":"uint256"},{"internalType":"uint256","name":"_minLonAmount","type":"uint256"}],"name":"buyback","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"buybackInterval","outputs":[{"internalType":"uint32","name":"","type":"uint32"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_feeTokenAddr","type":"address"},{"internalType":"bool","name":"_enable","type":"bool"}],"name":"enableFeeToken","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address[]","name":"_feeTokenAddr","type":"address[]"},{"internalType":"bool[]","name":"_enable","type":"bool[]"}],"name":"enableFeeTokens","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"exchangeAddrs","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"feeTokenRecipient","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"feeTokens","outputs":[{"internalType":"uint8","name":"exchangeIndex","type":"uint8"},{"internalType":"uint8","name":"LFactor","type":"uint8"},{"internalType":"uint8","name":"RFactor","type":"uint8"},{"internalType":"uint32","name":"lastTimeBuyback","type":"uint32"},{"internalType":"bool","name":"enable","type":"bool"},{"internalType":"uint256","name":"minBuy","type":"uint256"},{"internalType":"uint256","name":"maxBuy","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_feeTokenAddr","type":"address"}],"name":"getFeeTokenPath","outputs":[{"internalType":"address[]","name":"path","type":"address[]"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"isOperator","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"lonStaking","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"miningFactor","outputs":[{"internalType":"uint8","name":"","type":"uint8"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"miningTreasury","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"newOwner","type":"address"}],"name":"nominateNewOwner","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"nominatedOwner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"numExchangeAddr","outputs":[{"internalType":"uint8","name":"","type":"uint8"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"numStrategyAddr","outputs":[{"internalType":"uint8","name":"","type":"uint8"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"pause","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"paused","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_tokenAddress","type":"address"},{"internalType":"uint256","name":"_tokenAmount","type":"uint256"}],"name":"recoverERC20","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint32","name":"_buyBackInterval","type":"uint32"}],"name":"setBuybackInterval","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256[]","name":"_indexes","type":"uint256[]"},{"internalType":"address[]","name":"_exchangeAddrs","type":"address[]"}],"name":"setExchangeAddrs","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_feeTokenAddr","type":"address"},{"internalType":"uint8","name":"_exchangeIndex","type":"uint8"},{"internalType":"address[]","name":"_path","type":"address[]"},{"internalType":"uint8","name":"_LFactor","type":"uint8"},{"internalType":"uint8","name":"_RFactor","type":"uint8"},{"internalType":"bool","name":"_enable","type":"bool"},{"internalType":"uint256","name":"_minBuy","type":"uint256"},{"internalType":"uint256","name":"_maxBuy","type":"uint256"}],"name":"setFeeToken","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_feeTokenRecipient","type":"address"}],"name":"setFeeTokenRecipient","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address[]","name":"_feeTokenAddr","type":"address[]"},{"internalType":"uint8[]","name":"_exchangeIndex","type":"uint8[]"},{"internalType":"address[][]","name":"_path","type":"address[][]"},{"internalType":"uint8[]","name":"_LFactor","type":"uint8[]"},{"internalType":"uint8[]","name":"_RFactor","type":"uint8[]"},{"internalType":"bool[]","name":"_enable","type":"bool[]"},{"internalType":"uint256[]","name":"_minBuy","type":"uint256[]"},{"internalType":"uint256[]","name":"_maxBuy","type":"uint256[]"}],"name":"setFeeTokens","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_lonStaking","type":"address"}],"name":"setLonStaking","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint8","name":"_miningFactor","type":"uint8"}],"name":"setMiningFactor","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_miningTreasury","type":"address"}],"name":"setMiningTreasury","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_operator","type":"address"},{"internalType":"bool","name":"_enable","type":"bool"}],"name":"setOperator","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256[]","name":"_indexes","type":"uint256[]"},{"internalType":"address[]","name":"_strategyAddrs","type":"address[]"}],"name":"setStrategyAddrs","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_treasury","type":"address"}],"name":"setTreasury","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"strategyAddrs","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"treasury","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"unpause","outputs":[],"stateMutability":"nonpayable","type":"function"}]

60a06040523480156200001157600080fd5b506040516200452d3803806200452d8339810160408190526200003491620001a1565b600080546001600160a01b0319166001600160a01b038a81169190911782556001805460ff60a01b1916815560608c901b6001600160601b031916608052908916825260026020526040909120805460ff191682179055805463ffffffff60a81b1916600160a81b63ffffffff891602179055606460ff86161115620000d75760405162461bcd60e51b8152600401620000ce906200026b565b60405180910390fd5b6001805460ff60c81b1916600160c81b60ff88160217905562000106836200017f602090811b6200210217901c565b620001255760405162461bcd60e51b8152600401620000ce90620002a2565b600380546001600160a01b039586166001600160a01b031991821617909155600480549486169482169490941790935560058054928516928416929092179091556006805491909316911617905550620002d99350505050565b803b15155b919050565b80516001600160a01b03811681146200018457600080fd5b60008060008060008060008060006101208a8c031215620001c0578485fd5b620001cb8a62000189565b9850620001db60208b0162000189565b9750620001eb60408b0162000189565b965060608a015163ffffffff8116811462000204578586fd5b60808b015190965060ff811681146200021b578586fd5b94506200022b60a08b0162000189565b93506200023b60c08b0162000189565b92506200024b60e08b0162000189565b91506200025c6101008b0162000189565b90509295985092959850929598565b60208082526017908201527f696e636f7272656374206d696e696e6720666163746f72000000000000000000604082015260600190565b6020808252601d908201527f4c6f6e207374616b696e67206973206e6f74206120636f6e7472616374000000604082015260600190565b60805160601c6142136200031a60003980610a6c5280610c155280610cc75280610cff528061197f52806124d95280612b615280612baf52506142136000f3fe608060405234801561001057600080fd5b50600436106102925760003560e01c80638980f11f11610160578063b54f8a92116100d8578063dc95c9101161008c578063f0f4426011610071578063f0f44260146104df578063f4789e7e146104f2578063fb4151401461050557610292565b8063dc95c910146104b9578063f008088d146104cc57610292565b8063d145e82b116100bd578063d145e82b1461047e578063d8bad99a14610491578063db750cb1146104a657610292565b8063b54f8a9214610458578063b8a0258d1461046b57610292565b8063a2d3c7e61161012f578063a647c9b111610114578063a647c9b114610435578063a81c53151461043d578063b08710d71461045057610292565b8063a2d3c7e61461041a578063a474ac501461042257610292565b80638980f11f146103ef5780638da5cb5b146104025780639e6531401461040a578063a06a48e11461041257610292565b80635c975abb1161020e5780636d70f7ae116101c257806379ba5097116101a757806379ba5097146103bf5780637e200546146103c75780638456cb59146103e757610292565b80636d70f7ae146103a4578063715018a6146103b757610292565b8063643481af116101f3578063643481af1461036b5780636671ce1f1461037e5780636cde15881461039157610292565b80635c975abb1461034e57806361d027b31461036357610292565b806353116c381161026557806354a7965d1161024a57806354a7965d1461031e578063558a72971461032657806357c698ed1461033957610292565b806353116c38146102f657806353a47bb71461030957610292565b80631627540c1461029757806316605a0d146102ac5780631bac19cc146102db5780633f4ba83a146102ee575b600080fd5b6102aa6102a536600461330d565b610518565b005b6102bf6102ba36600461330d565b6105ad565b6040516102d29796959493929190614006565b60405180910390f35b6102aa6102e936600461345c565b6105fd565b6102aa61081e565b6102aa61030436600461345c565b6108cc565b610311610a5b565b6040516102d2919061383f565b610311610a6a565b6102aa610334366004613327565b610a8e565b610341610b3b565b6040516102d29190613ff8565b610356610b4b565b6040516102d29190613ac9565b610311610b5c565b61031161037936600461373c565b610b6b565b6102aa61038c366004613382565b610b86565b6102aa61039f3660046134c5565b610ef4565b6103566103b236600461330d565b611178565b6102aa61118d565b6102aa611222565b6103da6103d536600461330d565b6112e5565b6040516102d29190613ab6565b6102aa61135f565b6102aa6103fd366004613359565b6113ff565b61031161146f565b61034161147e565b61031161148e565b61031161149d565b6102aa61043036600461355b565b6114ac565b61034161174f565b6102aa61044b36600461376c565b61175f565b61031161181d565b6102aa61046636600461330d565b61182c565b6102aa6104793660046133b4565b6118c2565b61031161048c36600461373c565b611b78565b610499611b93565b6040516102d29190613fe7565b6102aa6104b436600461345c565b611ba6565b6102aa6104c7366004613790565b611d9d565b6102aa6104da36600461330d565b611e6f565b6102aa6104ed36600461330d565b611f05565b6102aa61050036600461330d565b611f9b565b6102aa610513366004613327565b612056565b6000546001600160a01b03163314610563576040805162461bcd60e51b81526020600482015260096024820152683737ba1037bbb732b960b91b604482015290519081900360640190fd5b600180546001600160a01b0319166001600160a01b0383169081179091556040517f906a1c6bd7e3091ea86693dd029a831c19049ce77f1dce2ce0bab1cacbabce2290600090a250565b60096020526000908152604090208054600182015460029092015460ff80831693610100840482169362010000810483169363ffffffff630100000083041693600160381b909204909116919087565b61060633612108565b61062b5760405162461bcd60e51b815260040161062290613d57565b60405180910390fd5b82811461064a5760405162461bcd60e51b815260040161062290613b68565b60005b838110156108175761067e83838381811061066457fe5b9050602002016020810190610679919061330d565b612102565b61069a5760405162461bcd60e51b815260040161062290613d8e565b600154600160d81b900460ff168585838181106106b357fe5b9050602002013511156106d85760405162461bcd60e51b815260040161062290613dc5565b8282828181106106e457fe5b90506020020160208101906106f9919061330d565b6008600087878581811061070957fe5b6020908102929092013583525081019190915260400160002080546001600160a01b0319166001600160a01b0392909216919091179055600154600160d81b900460ff1685858381811061075957fe5b9050602002013514156107a4576001805460ff600160d81b80830482168401909116027fffffffff00ffffffffffffffffffffffffffffffffffffffffffffffffffffff9091161790555b7f87dfda767db80601457eaecfea13c08d2bbd8610572aac5773b637874eb11e268585838181106107d157fe5b905060200201358484848181106107e457fe5b90506020020160208101906107f9919061330d565b604051610807929190613f86565b60405180910390a160010161064d565b5050505050565b6000546001600160a01b03163314610869576040805162461bcd60e51b81526020600482015260096024820152683737ba1037bbb732b960b91b604482015290519081900360640190fd5b610871610b4b565b6108c2576040805162461bcd60e51b815260206004820152601460248201527f5061757361626c653a206e6f7420706175736564000000000000000000000000604482015290519081900360640190fd5b6108ca612151565b565b6108d533612108565b6108f15760405162461bcd60e51b815260040161062290613d57565b8281146109105760405162461bcd60e51b815260040161062290613b68565b60005b838110156108175760006009600087878581811061092d57fe5b9050602002016020810190610942919061330d565b6001600160a01b03166001600160a01b03168152602001908152602001600020905083838381811061097057fe5b90506020020160208101906109859190613722565b815460ff600160381b90910416151590151514610a52578383838181106109a857fe5b90506020020160208101906109bd9190613722565b8154901515600160381b0267ff00000000000000199091161781557f30f43b8e82d7d6b9dd6abd01752a4ab90b5a01c59e43fc1e87f7447e71d92038868684818110610a0557fe5b9050602002016020810190610a1a919061330d565b858585818110610a2657fe5b9050602002016020810190610a3b9190613722565b604051610a49929190613853565b60405180910390a15b50600101610913565b6001546001600160a01b031681565b7f000000000000000000000000000000000000000000000000000000000000000081565b6000546001600160a01b03163314610ad9576040805162461bcd60e51b81526020600482015260096024820152683737ba1037bbb732b960b91b604482015290519081900360640190fd5b6001600160a01b03821660009081526002602052604090819020805460ff1916831515179055517f1618a22a3b00b9ac70fd5a82f1f5cdd8cb272bd0f1b740ddf7c26ab05881dd5b90610b2f9084908490613853565b60405180910390a15050565b600154600160d01b900460ff1681565b600154600160a01b900460ff165b90565b6003546001600160a01b031681565b6007602052600090815260409020546001600160a01b031681565b610b8e610b4b565b15610bd3576040805162461bcd60e51b815260206004820152601060248201526f14185d5cd8589b194e881c185d5cd95960821b604482015290519081900360640190fd5b333014610bf957333214610bf95760405162461bcd60e51b815260040161062290613dfc565b6001600160a01b038084166000818152600960205260409020917f0000000000000000000000000000000000000000000000000000000000000000161415610d93578054600160381b900460ff16610c635760405162461bcd60e51b815260040161062290613f46565b8060010154831015610c875760405162461bcd60e51b815260040161062290613ce9565b8054600090610cad90606490610ca790879062010000900460ff166121fd565b9061225f565b90506000610cbb85836122c6565b600354909150610cf6907f0000000000000000000000000000000000000000000000000000000000000000906001600160a01b031684612323565b600454610d2e907f0000000000000000000000000000000000000000000000000000000000000000906001600160a01b031683612323565b7fd4d626561e9dc8e892258af0fcfd4baf2b993f9bd93126e36642fe7ee81b1c2a8282604051610d5f929190613f9d565b60405180910390a1610d708561247c565b5050805466ffffffff000000191663010000004263ffffffff1602179055610eef565b604080516101008082018352835460ff8082168452918104821660208085019190915262010000820483168486015263ffffffff63010000008304166060850152600160381b90910490911615156080830152600184015460a0830152600284015460c08301526003840180548451818402810184019095528085526000948594610e6a949093889360e086019392830182828015610e5b57602002820191906000526020600020905b81546001600160a01b03168152600190910190602001808311610e3d575b50505050508152505086612579565b915091508160001415610e9457600654610e8f9087906001600160a01b031683612323565b610eeb565b610e9f863087612323565b825460ff16600090815260086020526040902054610ecb90879085906001600160a01b03168588612690565b8015610eeb57600654610eeb906001600160a01b03888116911683612857565b5050505b505050565b610efc610b4b565b15610f41576040805162461bcd60e51b815260206004820152601060248201526f14185d5cd8589b194e881c185d5cd95960821b604482015290519081900360640190fd5b333214610f605760405162461bcd60e51b815260040161062290613dfc565b848381148015610f6f57508181145b610f8b5760405162461bcd60e51b815260040161062290613b68565b60005b8181101561116e5730636671ce1f898984818110610fa857fe5b9050602002016020810190610fbd919061330d565b888885818110610fc957fe5b90506020020135878786818110610fdc57fe5b905060200201356040518463ffffffff1660e01b81526004016110019392919061396c565b600060405180830381600087803b15801561101b57600080fd5b505af192505050801561102c575060015b61116657611038614091565b8061104357506110c7565b7fc252bba88361f08cc26717a3864d409a6674d02c9749694be276bf009ce040a289898481811061107057fe5b9050602002016020810190611085919061330d565b88888581811061109157fe5b9050602002013583604051806020016040528060008152506040516110b994939291906138f4565b60405180910390a150611166565b3d8080156110f1576040519150601f19603f3d011682016040523d82523d6000602084013e6110f6565b606091505b507fc252bba88361f08cc26717a3864d409a6674d02c9749694be276bf009ce040a289898481811061112457fe5b9050602002016020810190611139919061330d565b88888581811061114557fe5b905060200201358360405161115c9392919061392e565b60405180910390a1505b600101610f8e565b5050505050505050565b60026020526000908152604090205460ff1681565b6000546001600160a01b031633146111d8576040805162461bcd60e51b81526020600482015260096024820152683737ba1037bbb732b960b91b604482015290519081900360640190fd5b600080546040516001600160a01b03909116907fb532073b38c83145e3e5135377a08bf9aab55bc0fd7c1179cd4fb995d2a5159c908390a3600080546001600160a01b0319169055565b6001546001600160a01b03163314611281576040805162461bcd60e51b815260206004820152600d60248201527f6e6f74206e6f6d696e6174656400000000000000000000000000000000000000604482015290519081900360640190fd5b600154600080546040516001600160a01b0393841693909116917fb532073b38c83145e3e5135377a08bf9aab55bc0fd7c1179cd4fb995d2a5159c91a360018054600080546001600160a01b03199081166001600160a01b03841617909155169055565b6001600160a01b03811660009081526009602090815260409182902060030180548351818402810184019094528084526060939283018282801561135257602002820191906000526020600020905b81546001600160a01b03168152600190910190602001808311611334575b505050505090505b919050565b6000546001600160a01b031633146113aa576040805162461bcd60e51b81526020600482015260096024820152683737ba1037bbb732b960b91b604482015290519081900360640190fd5b6113b2610b4b565b156113f7576040805162461bcd60e51b815260206004820152601060248201526f14185d5cd8589b194e881c185d5cd95960821b604482015290519081900360640190fd5b6108ca6128c2565b61140833612108565b6114245760405162461bcd60e51b815260040161062290613d57565b60005461143e906001600160a01b03848116911683612857565b7f8c1256b8896378cd5044f80c202f9772b9d77dc85c8a6eb51967210b09bfaa288282604051610b2f9291906138db565b6000546001600160a01b031681565b600154600160c81b900460ff1681565b6004546001600160a01b031681565b6006546001600160a01b031681565b6114b533612108565b6114d15760405162461bcd60e51b815260040161062290613d57565b87518751811480156114e35750808751145b80156114ef5750808651145b80156114fb5750808551145b80156115075750808451145b80156115135750808351145b801561151f5750808251145b61153b5760405162461bcd60e51b815260040161062290613b68565b60005b8181101561174357306001600160a01b031663b8a0258d8b838151811061156157fe5b60200260200101518b848151811061157557fe5b60200260200101518b858151811061158957fe5b60200260200101518b868151811061159d57fe5b60200260200101518b87815181106115b157fe5b60200260200101518b88815181106115c557fe5b60200260200101518b89815181106115d957fe5b60200260200101518b8a815181106115ed57fe5b60200260200101516040518963ffffffff1660e01b8152600401611618989796959493929190613a58565b600060405180830381600087803b15801561163257600080fd5b505af1925050508015611643575060015b61173b5761164f614091565b8061165a57506116bd565b7f5d257873bd31a4ef901eefe446bbea52231cc81112ba4c61b319ca53268127728b838151811061168757fe5b602002602001015182604051806020016040528060008152506040516116af9392919061386e565b60405180910390a15061173b565b3d8080156116e7576040519150601f19603f3d011682016040523d82523d6000602084013e6116ec565b606091505b507f5d257873bd31a4ef901eefe446bbea52231cc81112ba4c61b319ca53268127728b838151811061171a57fe5b6020026020010151826040516117319291906138ac565b60405180910390a1505b60010161153e565b50505050505050505050565b600154600160d81b900460ff1681565b61176833612108565b6117845760405162461bcd60e51b815260040161062290613d57565b610e108163ffffffff1610156117ac5760405162461bcd60e51b815260040161062290613e33565b600180547fffffffffffffff00000000ffffffffffffffffffffffffffffffffffffffffff16600160a81b63ffffffff8416021790556040517f890e290c975ea254132a694596f86edbf9e7e7a8e3090438b754382c6b8cefbb90611812908390613fe7565b60405180910390a150565b6005546001600160a01b031681565b6000546001600160a01b03163314611877576040805162461bcd60e51b81526020600482015260096024820152683737ba1037bbb732b960b91b604482015290519081900360640190fd5b600580546001600160a01b0319166001600160a01b0383161790556040517f9e442e9b890aa8c119c011ea97d6e82df7d1a781c1575d17a565d266a87dae129061181290839061383f565b3330146118ee576118d233612108565b6118ee5760405162461bcd60e51b815260040161062290613d57565b6118f789612102565b6119135760405162461bcd60e51b815260040161062290613ea1565b60ff8816600090815260086020526040902054611938906001600160a01b0316612102565b6119545760405162461bcd60e51b815260040161062290613d8e565b60028610156119755760405162461bcd60e51b815260040161062290613c7b565b6001600160a01b037f000000000000000000000000000000000000000000000000000000000000000016878760001981018181106119af57fe5b90506020020160208101906119c4919061330d565b6001600160a01b0316146119ea5760405162461bcd60e51b815260040161062290613ed8565b60648560ff161115611a0e5760405162461bcd60e51b815260040161062290613ad4565b60648460ff161115611a325760405162461bcd60e51b815260040161062290613c0d565b80821115611a525760405162461bcd60e51b815260040161062290613e6a565b6001600160a01b0389166000908152600960205260409020805460ff191660ff8a16178155611a85600382018989613026565b50805461ff00191661010060ff888116919091029190911762ff00001916620100008783160217808355851515600160381b909104909116151514611b1857805467ff000000000000001916600160381b851515021781556040517f30f43b8e82d7d6b9dd6abd01752a4ab90b5a01c59e43fc1e87f7447e71d9203890611b0f908c908790613853565b60405180910390a15b60018101839055600281018290556040517faf033f69586a5a11b9fb76f72a3ff2e0afdf7e308c5a9ddf56cfb4322bec99fa90611b64908c908c908c908c908c908c908b908b906139cb565b60405180910390a150505050505050505050565b6008602052600090815260409020546001600160a01b031681565b600154600160a81b900463ffffffff1681565b611baf33612108565b611bcb5760405162461bcd60e51b815260040161062290613d57565b828114611bea5760405162461bcd60e51b815260040161062290613b68565b60005b8381101561081757611c0483838381811061066457fe5b611c205760405162461bcd60e51b815260040161062290613c44565b600154600160d01b900460ff16858583818110611c3957fe5b905060200201351115611c5e5760405162461bcd60e51b815260040161062290613dc5565b828282818110611c6a57fe5b9050602002016020810190611c7f919061330d565b60076000878785818110611c8f57fe5b6020908102929092013583525081019190915260400160002080546001600160a01b0319166001600160a01b0392909216919091179055600154600160d01b900460ff16858583818110611cdf57fe5b905060200201351415611d2a576001805460ff600160d01b80830482168401909116027fffffffffff00ffffffffffffffffffffffffffffffffffffffffffffffffffff9091161790555b7f761ab005d4d857f7788e11162cbb52f82eacefb02e69470d644666a42b98f2cc858583818110611d5757fe5b90506020020135848484818110611d6a57fe5b9050602002016020810190611d7f919061330d565b604051611d8d929190613f86565b60405180910390a1600101611bed565b6000546001600160a01b03163314611de8576040805162461bcd60e51b81526020600482015260096024820152683737ba1037bbb732b960b91b604482015290519081900360640190fd5b60648160ff161115611e0c5760405162461bcd60e51b815260040161062290613b9f565b600180547fffffffffffff00ffffffffffffffffffffffffffffffffffffffffffffffffff16600160c81b60ff8416021790556040517fc57aba0dc6ec236e9a847d56685af5c3cad259c777f01dcde885bd423d2eee2490611812908390613ff8565b6000546001600160a01b03163314611eba576040805162461bcd60e51b81526020600482015260096024820152683737ba1037bbb732b960b91b604482015290519081900360640190fd5b600680546001600160a01b0319166001600160a01b0383161790556040517fe8430e1d6b6253a12ff526a2557c17dd74a5536493a74c061695de45dfae6e239061181290839061383f565b6000546001600160a01b03163314611f50576040805162461bcd60e51b81526020600482015260096024820152683737ba1037bbb732b960b91b604482015290519081900360640190fd5b600380546001600160a01b0319166001600160a01b0383161790556040517fcb7ef3e545f5cdb893f5c568ba710fe08f336375a2d9fd66e161033f8fc09ef39061181290839061383f565b6000546001600160a01b03163314611fe6576040805162461bcd60e51b81526020600482015260096024820152683737ba1037bbb732b960b91b604482015290519081900360640190fd5b611fef81612102565b61200b5760405162461bcd60e51b815260040161062290613d20565b600480546001600160a01b0319166001600160a01b0383161790556040517f02c05fb73e764eb909fe065f194dfc51499ac7177131a2aeb25da09b5df907349061181290839061383f565b61205f33612108565b61207b5760405162461bcd60e51b815260040161062290613d57565b6001600160a01b0382166000908152600960205260409020805460ff600160381b90910416151582151514610eef57805467ff000000000000001916600160381b831515021781556040517f30f43b8e82d7d6b9dd6abd01752a4ab90b5a01c59e43fc1e87f7447e71d92038906120f59085908590613853565b60405180910390a1505050565b3b151590565b6001600160a01b03811660009081526002602052604081205460ff168061213c57506000546001600160a01b038381169116145b156121495750600161135a565b50600061135a565b612159610b4b565b6121aa576040805162461bcd60e51b815260206004820152601460248201527f5061757361626c653a206e6f7420706175736564000000000000000000000000604482015290519081900360640190fd5b6001805460ff60a01b191690557f5db9ee0a495bf2e6ff9c91a7834c1ba4fdd244a5e8aa4e537bd38aeae4b073aa6121e0612947565b604080516001600160a01b039092168252519081900360200190a1565b60008261220c57506000612259565b8282028284828161221957fe5b04146122565760405162461bcd60e51b815260040180806020018281038252602181526020018061415d6021913960400191505060405180910390fd5b90505b92915050565b60008082116122b5576040805162461bcd60e51b815260206004820152601a60248201527f536166654d6174683a206469766973696f6e206279207a65726f000000000000604482015290519081900360640190fd5b8183816122be57fe5b049392505050565b60008282111561231d576040805162461bcd60e51b815260206004820152601e60248201527f536166654d6174683a207375627472616374696f6e206f766572666c6f770000604482015290519081900360640190fd5b50900390565b60008060008060005b600154600160d01b900460ff1681101561245357600081815260076020526040908190205490517f70a082310000000000000000000000000000000000000000000000000000000081526001600160a01b039182169650908916906370a082319061239b90889060040161383f565b60206040518083038186803b1580156123b357600080fd5b505afa1580156123c7573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906123eb9190613754565b9350856123f8838661294b565b111561240f5761240886836122c6565b9250612413565b8392505b8261241d5761244b565b6124326001600160a01b0389168689866129a5565b61243c828461294b565b91508582141561244b57612453565b60010161232c565b508481146124735760405162461bcd60e51b815260040161062290613b0b565b50505050505050565b60015460009061249e90606490610ca7908590600160c81b900460ff166121fd565b90508015612575576005546040517f40c10f190000000000000000000000000000000000000000000000000000000081526001600160a01b037f00000000000000000000000000000000000000000000000000000000000000008116926340c10f199261251492919091169085906004016138db565b600060405180830381600087803b15801561252e57600080fd5b505af1158015612542573d6000803e3d6000fd5b505050507f384910d170ac9ee2eab04d4c079ef744239a826a800eeb568f1d367d3eb7147581604051610b2f9190613f7d565b5050565b6000806000831161259c5760405162461bcd60e51b815260040161062290613cb2565b6125a533612108565b6125ca5783608001516125ca5760405162461bcd60e51b815260040161062290613f46565b6125e96064610ca7866020015160ff16866121fd90919063ffffffff16565b90506125f583826122c6565b91508115612689578360a001518210156126215760405162461bcd60e51b815260040161062290613ce9565b8360c001518211156126455760405162461bcd60e51b815260040161062290613bd6565b600154606085015161266b9163ffffffff91821691600160a81b90910481169061294b16565b42116126895760405162461bcd60e51b815260040161062290613f0f565b9250929050565b81156108175760006127018685876003018054806020026020016040519081016040528092919081815260200182805480156126f557602002820191906000526020600020905b81546001600160a01b031681526001909101906020018083116126d7575b50505050508686612a1e565b855466ffffffff000000191663010000004263ffffffff160217808755600187015460028801546040519394507f147a11a26edd23cd74d00e505c95b4c392991dcf6eeb9dc8457f1947b02099a393612774938b9389938893610100840460ff908116946201000090041692919061398d565b60405180910390a1604080516101008082018352875460ff8082168452918104821660208085019190915262010000820483168486015263ffffffff63010000008304166060850152600160381b90910490911615156080830152600188015460a0830152600288015460c083015260038801805484518184028101840190955280855261284e948a9360e086019391929083018282801561283f57602002820191906000526020600020905b81546001600160a01b03168152600190910190602001808311612821575b50505050508152505082612b27565b610eeb8161247c565b604080516001600160a01b038416602482015260448082018490528251808303909101815260649091019091526020810180516001600160e01b03167fa9059cbb00000000000000000000000000000000000000000000000000000000179052610eef908490612c17565b6128ca610b4b565b1561290f576040805162461bcd60e51b815260206004820152601060248201526f14185d5cd8589b194e881c185d5cd95960821b604482015290519081900360640190fd5b6001805460ff60a01b1916600160a01b1790557f62e78cea01bee320cd4e420270b5ea74000d11b0c9f74754ebdbfc544b05a2586121e05b3390565b600082820183811015612256576040805162461bcd60e51b815260206004820152601b60248201527f536166654d6174683a206164646974696f6e206f766572666c6f770000000000604482015290519081900360640190fd5b604080516001600160a01b0380861660248301528416604482015260648082018490528251808303909101815260849091019091526020810180516001600160e01b03167f23b872dd00000000000000000000000000000000000000000000000000000000179052612a18908590612c17565b50505050565b6000612a366001600160a01b03871686600019612cc8565b6040517f38ed173900000000000000000000000000000000000000000000000000000000815285906060906001600160a01b038316906338ed173990612a8b90889088908b903090603c420190600401613fab565b600060405180830381600087803b158015612aa557600080fd5b505af1158015612ab9573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f19168201604052612ae19190810190613692565b905080600187510381518110612af357fe5b60200260200101519250612b1c8760008a6001600160a01b0316612cc89092919063ffffffff16565b505095945050505050565b6000612b486064610ca7856040015160ff16856121fd90919063ffffffff16565b90508015612b8a57600354612b8a906001600160a01b037f00000000000000000000000000000000000000000000000000000000000000008116911683612857565b6000612b9683836122c6565b90508015612bd857600454612bd8906001600160a01b037f00000000000000000000000000000000000000000000000000000000000000008116911683612857565b7fd4d626561e9dc8e892258af0fcfd4baf2b993f9bd93126e36642fe7ee81b1c2a8282604051612c09929190613f9d565b60405180910390a150505050565b6060612c6c826040518060400160405280602081526020017f5361666545524332303a206c6f772d6c6576656c2063616c6c206661696c6564815250856001600160a01b0316612e0d9092919063ffffffff16565b805190915015610eef57808060200190516020811015612c8b57600080fd5b5051610eef5760405162461bcd60e51b815260040180806020018281038252602a81526020018061417e602a913960400191505060405180910390fd5b801580612d675750604080517fdd62ed3e0000000000000000000000000000000000000000000000000000000081523060048201526001600160a01b03848116602483015291519185169163dd62ed3e91604480820192602092909190829003018186803b158015612d3957600080fd5b505afa158015612d4d573d6000803e3d6000fd5b505050506040513d6020811015612d6357600080fd5b5051155b612da25760405162461bcd60e51b81526004018080602001828103825260368152602001806141a86036913960400191505060405180910390fd5b604080516001600160a01b038416602482015260448082018490528251808303909101815260649091019091526020810180516001600160e01b03167f095ea7b300000000000000000000000000000000000000000000000000000000179052610eef908490612c17565b6060612e1c8484600085612e26565b90505b9392505050565b606082471015612e675760405162461bcd60e51b81526004018080602001828103825260268152602001806141376026913960400191505060405180910390fd5b612e7085612102565b612ec1576040805162461bcd60e51b815260206004820152601d60248201527f416464726573733a2063616c6c20746f206e6f6e2d636f6e7472616374000000604482015290519081900360640190fd5b60006060866001600160a01b031685876040518082805190602001908083835b60208310612f005780518252601f199092019160209182019101612ee1565b6001836020036101000a03801982511681845116808217855250505050505090500191505060006040518083038185875af1925050503d8060008114612f62576040519150601f19603f3d011682016040523d82523d6000602084013e612f67565b606091505b5091509150612f77828286612f82565b979650505050505050565b60608315612f91575081612e1f565b825115612fa15782518084602001fd5b8160405162461bcd60e51b81526004018080602001828103825283818151815260200191508051906020019080838360005b83811015612feb578181015183820152602001612fd3565b50505050905090810190601f1680156130185780820380516001836020036101000a031916815260200191505b509250505060405180910390fd5b828054828255906000526020600020908101928215613079579160200282015b828111156130795781546001600160a01b0319166001600160a01b03843516178255602090920191600190910190613046565b50613085929150613089565b5090565b5b80821115613085576000815560010161308a565b80356001600160a01b038116811461135a57600080fd5b60008083601f8401126130c6578182fd5b50813567ffffffffffffffff8111156130dd578182fd5b602083019150836020808302850101111561268957600080fd5b600082601f830112613107578081fd5b813561311a6131158261406d565b614049565b81815291506020808301908481018184028601820187101561313b57600080fd5b60005b848110156131615761314f8261309e565b8452928201929082019060010161313e565b505050505092915050565b600082601f83011261317c578081fd5b813561318a6131158261406d565b818152915060208083019084810160005b84811015613161576131b2888484358a01016130f7565b8452928201929082019060010161319b565b600082601f8301126131d4578081fd5b81356131e26131158261406d565b81815291506020808301908481018184028601820187101561320357600080fd5b60005b8481101561316157613217826132ec565b84529282019290820190600101613206565b600082601f830112613239578081fd5b81356132476131158261406d565b81815291506020808301908481018184028601820187101561326857600080fd5b60005b848110156131615781358452928201929082019060010161326b565b600082601f830112613297578081fd5b81356132a56131158261406d565b8181529150602080830190848101818402860182018710156132c657600080fd5b60005b84811015613161576132da826132fc565b845292820192908201906001016132c9565b8035801515811461135a57600080fd5b803560ff8116811461135a57600080fd5b60006020828403121561331e578081fd5b612e1f8261309e565b60008060408385031215613339578081fd5b6133428361309e565b9150613350602084016132ec565b90509250929050565b6000806040838503121561336b578182fd5b6133748361309e565b946020939093013593505050565b600080600060608486031215613396578081fd5b61339f8461309e565b95602085013595506040909401359392505050565b60008060008060008060008060006101008a8c0312156133d2578485fd5b6133db8a61309e565b98506133e960208b016132fc565b975060408a013567ffffffffffffffff811115613404578586fd5b6134108c828d016130b5565b9098509650613423905060608b016132fc565b945061343160808b016132fc565b935061343f60a08b016132ec565b925060c08a0135915060e08a013590509295985092959850929598565b60008060008060408587031215613471578182fd5b843567ffffffffffffffff80821115613488578384fd5b613494888389016130b5565b909650945060208701359150808211156134ac578384fd5b506134b9878288016130b5565b95989497509550505050565b600080600080600080606087890312156134dd578384fd5b863567ffffffffffffffff808211156134f4578586fd5b6135008a838b016130b5565b90985096506020890135915080821115613518578586fd5b6135248a838b016130b5565b9096509450604089013591508082111561353c578384fd5b5061354989828a016130b5565b979a9699509497509295939492505050565b600080600080600080600080610100898b031215613577578182fd5b883567ffffffffffffffff8082111561358e578384fd5b61359a8c838d016130f7565b995060208b01359150808211156135af578384fd5b6135bb8c838d01613287565b985060408b01359150808211156135d0578384fd5b6135dc8c838d0161316c565b975060608b01359150808211156135f1578384fd5b6135fd8c838d01613287565b965060808b0135915080821115613612578384fd5b61361e8c838d01613287565b955060a08b0135915080821115613633578384fd5b61363f8c838d016131c4565b945060c08b0135915080821115613654578384fd5b6136608c838d01613229565b935060e08b0135915080821115613675578283fd5b506136828b828c01613229565b9150509295985092959890939650565b600060208083850312156136a4578182fd5b825167ffffffffffffffff8111156136ba578283fd5b8301601f810185136136ca578283fd5b80516136d86131158261406d565b81815283810190838501858402850186018910156136f4578687fd5b8694505b838510156137165780518352600194909401939185019185016136f8565b50979650505050505050565b600060208284031215613733578081fd5b612e1f826132ec565b60006020828403121561374d578081fd5b5035919050565b600060208284031215613765578081fd5b5051919050565b60006020828403121561377d578081fd5b813563ffffffff81168114612256578182fd5b6000602082840312156137a1578081fd5b612e1f826132fc565b6000815180845260208085019450808401835b838110156137e25781516001600160a01b0316875295820195908201906001016137bd565b509495945050505050565b60008151808452815b81811015613812576020818501810151868301820152016137f6565b818111156138235782602083870101525b50601f01601f19169290920160200192915050565b60ff169052565b6001600160a01b0391909116815260200190565b6001600160a01b039290921682521515602082015260400190565b60006001600160a01b03851682526060602083015261389060608301856137ed565b82810360408401526138a281856137ed565b9695505050505050565b60006001600160a01b03841682526060602083015280606083015260806040830152612e1c60808301846137ed565b6001600160a01b03929092168252602082015260400190565b60006001600160a01b03861682528460208301526080604083015261391c60808301856137ed565b8281036060840152612f7781856137ed565b60006001600160a01b03851682528360208301526080604083015280608083015260a0606083015261396360a08301846137ed565b95945050505050565b6001600160a01b039390931683526020830191909152604082015260600190565b6001600160a01b039790971687526020870195909552604086019390935260ff918216606086015216608084015260a083015260c082015260e00190565b600060e082016001600160a01b03808c168452602060ff8c168186015260e06040860152828a8452610100860190508b9350845b8b811015613a245783613a118661309e565b16825293820193908201906001016139ff565b508094505050505060ff86166060830152613a426080830186613838565b60a082019390935260c001529695505050505050565b60006101006001600160a01b038b16835260ff8a166020840152806040840152613a848184018a6137aa565b60ff98891660608501529690971660808301525092151560a084015260c083019190915260e090910152949350505050565b600060208252612e1f60208301846137aa565b901515815260200190565b60208082526011908201527f696e636f7272656374204c466163746f72000000000000000000000000000000604082015260600190565b60208082526021908201527f696e73756666696369656e7420616d6f756e74206f662066656520746f6b656e60408201527f7300000000000000000000000000000000000000000000000000000000000000606082015260800190565b60208082526019908201527f696e707574206e6f74207468652073616d65206c656e67746800000000000000604082015260600190565b60208082526017908201527f696e636f7272656374206d696e696e6720666163746f72000000000000000000604082015260600190565b6020808252601b908201527f616d6f756e742067726561746572207468616e206d6178206275790000000000604082015260600190565b60208082526011908201527f696e636f72726563742052466163746f72000000000000000000000000000000604082015260600190565b6020808252601a908201527f7374726174656779206973206e6f74206120636f6e7472616374000000000000604082015260600190565b60208082526011908201527f696e76616c696420737761702070617468000000000000000000000000000000604082015260600190565b60208082526015908201527f7a65726f2066656520746f6b656e20616d6f756e740000000000000000000000604082015260600190565b60208082526018908201527f616d6f756e74206c657373207468616e206d696e206275790000000000000000604082015260600190565b6020808252601d908201527f4c6f6e207374616b696e67206973206e6f74206120636f6e7472616374000000604082015260600190565b6020808252601f908201527f6f6e6c79206f70657261746f72206f72206f776e65722063616e2063616c6c00604082015260600190565b6020808252601a908201527f65786368616e6765206973206e6f74206120636f6e7472616374000000000000604082015260600190565b60208082526012908201527f696e646578206f7574206f6620626f756e640000000000000000000000000000604082015260600190565b60208082526011908201527f6f6e6c7920454f412063616e2063616c6c000000000000000000000000000000604082015260600190565b60208082526018908201527f696e76616c6964206275796261636b20696e74657276616c0000000000000000604082015260600190565b6020808252601b908201527f696e636f7272656374206d696e42757920616e64206d61784275790000000000604082015260600190565b6020808252601b908201527f66656520746f6b656e206973206e6f74206120636f6e74726163740000000000604082015260600190565b60208082526018908201527f6f757470757420746f6b656e206d757374206265204c4f4e0000000000000000604082015260600190565b6020808252601a908201527f616c72656164792061206275796261636b20726563656e746c79000000000000604082015260600190565b60208082526018908201527f66656520746f6b656e206973206e6f7420656e61626c65640000000000000000604082015260600190565b90815260200190565b9182526001600160a01b0316602082015260400190565b918252602082015260400190565b600086825285602083015260a06040830152613fca60a08301866137aa565b6001600160a01b0394909416606083015250608001529392505050565b63ffffffff91909116815260200190565b60ff91909116815260200190565b60ff9788168152958716602087015293909516604085015263ffffffff9190911660608401521515608083015260a082019290925260c081019190915260e00190565b60405181810167ffffffffffffffff8111828210171561406557fe5b604052919050565b600067ffffffffffffffff82111561408157fe5b5060209081020190565b60e01c90565b600060443d10156140a157610b59565b600481823e6308c379a06140b5825161408b565b146140bf57610b59565b6040513d600319016004823e80513d67ffffffffffffffff81602484011181841117156140ef5750505050610b59565b828401925082519150808211156141095750505050610b59565b503d8301602082840101111561412157505050610b59565b601f01601f191681016020016040529150509056fe416464726573733a20696e73756666696369656e742062616c616e636520666f722063616c6c536166654d6174683a206d756c7469706c69636174696f6e206f766572666c6f775361666545524332303a204552433230206f7065726174696f6e20646964206e6f7420737563636565645361666545524332303a20617070726f76652066726f6d206e6f6e2d7a65726f20746f206e6f6e2d7a65726f20616c6c6f77616e6365a2646970667358221220df65c620b4337ce81a1d64f7e205d494eef6b29f0f118968d5a17f2aa214af9464736f6c634300070400330000000000000000000000000000000000095413afc295d19edeb1ad7b71c9520000000000000000000000009afc226dc049b99342ad6774eeb08bfa2f874465000000000000000000000000def3a34689fb7506e75b581c6cde664c9560ca110000000000000000000000000000000000000000000000000000000000015180000000000000000000000000000000000000000000000000000000000000006400000000000000000000000074c3ca9431c009dc35587591dc90780078174f8a000000000000000000000000f88506b0f1d30056b9e5580668d5875b9cd30f23000000000000000000000000292a6921efc261070a0d5c96911c102cbf1045e400000000000000000000000074c3ca9431c009dc35587591dc90780078174f8a

Deployed Bytecode

0x608060405234801561001057600080fd5b50600436106102925760003560e01c80638980f11f11610160578063b54f8a92116100d8578063dc95c9101161008c578063f0f4426011610071578063f0f44260146104df578063f4789e7e146104f2578063fb4151401461050557610292565b8063dc95c910146104b9578063f008088d146104cc57610292565b8063d145e82b116100bd578063d145e82b1461047e578063d8bad99a14610491578063db750cb1146104a657610292565b8063b54f8a9214610458578063b8a0258d1461046b57610292565b8063a2d3c7e61161012f578063a647c9b111610114578063a647c9b114610435578063a81c53151461043d578063b08710d71461045057610292565b8063a2d3c7e61461041a578063a474ac501461042257610292565b80638980f11f146103ef5780638da5cb5b146104025780639e6531401461040a578063a06a48e11461041257610292565b80635c975abb1161020e5780636d70f7ae116101c257806379ba5097116101a757806379ba5097146103bf5780637e200546146103c75780638456cb59146103e757610292565b80636d70f7ae146103a4578063715018a6146103b757610292565b8063643481af116101f3578063643481af1461036b5780636671ce1f1461037e5780636cde15881461039157610292565b80635c975abb1461034e57806361d027b31461036357610292565b806353116c381161026557806354a7965d1161024a57806354a7965d1461031e578063558a72971461032657806357c698ed1461033957610292565b806353116c38146102f657806353a47bb71461030957610292565b80631627540c1461029757806316605a0d146102ac5780631bac19cc146102db5780633f4ba83a146102ee575b600080fd5b6102aa6102a536600461330d565b610518565b005b6102bf6102ba36600461330d565b6105ad565b6040516102d29796959493929190614006565b60405180910390f35b6102aa6102e936600461345c565b6105fd565b6102aa61081e565b6102aa61030436600461345c565b6108cc565b610311610a5b565b6040516102d2919061383f565b610311610a6a565b6102aa610334366004613327565b610a8e565b610341610b3b565b6040516102d29190613ff8565b610356610b4b565b6040516102d29190613ac9565b610311610b5c565b61031161037936600461373c565b610b6b565b6102aa61038c366004613382565b610b86565b6102aa61039f3660046134c5565b610ef4565b6103566103b236600461330d565b611178565b6102aa61118d565b6102aa611222565b6103da6103d536600461330d565b6112e5565b6040516102d29190613ab6565b6102aa61135f565b6102aa6103fd366004613359565b6113ff565b61031161146f565b61034161147e565b61031161148e565b61031161149d565b6102aa61043036600461355b565b6114ac565b61034161174f565b6102aa61044b36600461376c565b61175f565b61031161181d565b6102aa61046636600461330d565b61182c565b6102aa6104793660046133b4565b6118c2565b61031161048c36600461373c565b611b78565b610499611b93565b6040516102d29190613fe7565b6102aa6104b436600461345c565b611ba6565b6102aa6104c7366004613790565b611d9d565b6102aa6104da36600461330d565b611e6f565b6102aa6104ed36600461330d565b611f05565b6102aa61050036600461330d565b611f9b565b6102aa610513366004613327565b612056565b6000546001600160a01b03163314610563576040805162461bcd60e51b81526020600482015260096024820152683737ba1037bbb732b960b91b604482015290519081900360640190fd5b600180546001600160a01b0319166001600160a01b0383169081179091556040517f906a1c6bd7e3091ea86693dd029a831c19049ce77f1dce2ce0bab1cacbabce2290600090a250565b60096020526000908152604090208054600182015460029092015460ff80831693610100840482169362010000810483169363ffffffff630100000083041693600160381b909204909116919087565b61060633612108565b61062b5760405162461bcd60e51b815260040161062290613d57565b60405180910390fd5b82811461064a5760405162461bcd60e51b815260040161062290613b68565b60005b838110156108175761067e83838381811061066457fe5b9050602002016020810190610679919061330d565b612102565b61069a5760405162461bcd60e51b815260040161062290613d8e565b600154600160d81b900460ff168585838181106106b357fe5b9050602002013511156106d85760405162461bcd60e51b815260040161062290613dc5565b8282828181106106e457fe5b90506020020160208101906106f9919061330d565b6008600087878581811061070957fe5b6020908102929092013583525081019190915260400160002080546001600160a01b0319166001600160a01b0392909216919091179055600154600160d81b900460ff1685858381811061075957fe5b9050602002013514156107a4576001805460ff600160d81b80830482168401909116027fffffffff00ffffffffffffffffffffffffffffffffffffffffffffffffffffff9091161790555b7f87dfda767db80601457eaecfea13c08d2bbd8610572aac5773b637874eb11e268585838181106107d157fe5b905060200201358484848181106107e457fe5b90506020020160208101906107f9919061330d565b604051610807929190613f86565b60405180910390a160010161064d565b5050505050565b6000546001600160a01b03163314610869576040805162461bcd60e51b81526020600482015260096024820152683737ba1037bbb732b960b91b604482015290519081900360640190fd5b610871610b4b565b6108c2576040805162461bcd60e51b815260206004820152601460248201527f5061757361626c653a206e6f7420706175736564000000000000000000000000604482015290519081900360640190fd5b6108ca612151565b565b6108d533612108565b6108f15760405162461bcd60e51b815260040161062290613d57565b8281146109105760405162461bcd60e51b815260040161062290613b68565b60005b838110156108175760006009600087878581811061092d57fe5b9050602002016020810190610942919061330d565b6001600160a01b03166001600160a01b03168152602001908152602001600020905083838381811061097057fe5b90506020020160208101906109859190613722565b815460ff600160381b90910416151590151514610a52578383838181106109a857fe5b90506020020160208101906109bd9190613722565b8154901515600160381b0267ff00000000000000199091161781557f30f43b8e82d7d6b9dd6abd01752a4ab90b5a01c59e43fc1e87f7447e71d92038868684818110610a0557fe5b9050602002016020810190610a1a919061330d565b858585818110610a2657fe5b9050602002016020810190610a3b9190613722565b604051610a49929190613853565b60405180910390a15b50600101610913565b6001546001600160a01b031681565b7f0000000000000000000000000000000000095413afc295d19edeb1ad7b71c95281565b6000546001600160a01b03163314610ad9576040805162461bcd60e51b81526020600482015260096024820152683737ba1037bbb732b960b91b604482015290519081900360640190fd5b6001600160a01b03821660009081526002602052604090819020805460ff1916831515179055517f1618a22a3b00b9ac70fd5a82f1f5cdd8cb272bd0f1b740ddf7c26ab05881dd5b90610b2f9084908490613853565b60405180910390a15050565b600154600160d01b900460ff1681565b600154600160a01b900460ff165b90565b6003546001600160a01b031681565b6007602052600090815260409020546001600160a01b031681565b610b8e610b4b565b15610bd3576040805162461bcd60e51b815260206004820152601060248201526f14185d5cd8589b194e881c185d5cd95960821b604482015290519081900360640190fd5b333014610bf957333214610bf95760405162461bcd60e51b815260040161062290613dfc565b6001600160a01b038084166000818152600960205260409020917f0000000000000000000000000000000000095413afc295d19edeb1ad7b71c952161415610d93578054600160381b900460ff16610c635760405162461bcd60e51b815260040161062290613f46565b8060010154831015610c875760405162461bcd60e51b815260040161062290613ce9565b8054600090610cad90606490610ca790879062010000900460ff166121fd565b9061225f565b90506000610cbb85836122c6565b600354909150610cf6907f0000000000000000000000000000000000095413afc295d19edeb1ad7b71c952906001600160a01b031684612323565b600454610d2e907f0000000000000000000000000000000000095413afc295d19edeb1ad7b71c952906001600160a01b031683612323565b7fd4d626561e9dc8e892258af0fcfd4baf2b993f9bd93126e36642fe7ee81b1c2a8282604051610d5f929190613f9d565b60405180910390a1610d708561247c565b5050805466ffffffff000000191663010000004263ffffffff1602179055610eef565b604080516101008082018352835460ff8082168452918104821660208085019190915262010000820483168486015263ffffffff63010000008304166060850152600160381b90910490911615156080830152600184015460a0830152600284015460c08301526003840180548451818402810184019095528085526000948594610e6a949093889360e086019392830182828015610e5b57602002820191906000526020600020905b81546001600160a01b03168152600190910190602001808311610e3d575b50505050508152505086612579565b915091508160001415610e9457600654610e8f9087906001600160a01b031683612323565b610eeb565b610e9f863087612323565b825460ff16600090815260086020526040902054610ecb90879085906001600160a01b03168588612690565b8015610eeb57600654610eeb906001600160a01b03888116911683612857565b5050505b505050565b610efc610b4b565b15610f41576040805162461bcd60e51b815260206004820152601060248201526f14185d5cd8589b194e881c185d5cd95960821b604482015290519081900360640190fd5b333214610f605760405162461bcd60e51b815260040161062290613dfc565b848381148015610f6f57508181145b610f8b5760405162461bcd60e51b815260040161062290613b68565b60005b8181101561116e5730636671ce1f898984818110610fa857fe5b9050602002016020810190610fbd919061330d565b888885818110610fc957fe5b90506020020135878786818110610fdc57fe5b905060200201356040518463ffffffff1660e01b81526004016110019392919061396c565b600060405180830381600087803b15801561101b57600080fd5b505af192505050801561102c575060015b61116657611038614091565b8061104357506110c7565b7fc252bba88361f08cc26717a3864d409a6674d02c9749694be276bf009ce040a289898481811061107057fe5b9050602002016020810190611085919061330d565b88888581811061109157fe5b9050602002013583604051806020016040528060008152506040516110b994939291906138f4565b60405180910390a150611166565b3d8080156110f1576040519150601f19603f3d011682016040523d82523d6000602084013e6110f6565b606091505b507fc252bba88361f08cc26717a3864d409a6674d02c9749694be276bf009ce040a289898481811061112457fe5b9050602002016020810190611139919061330d565b88888581811061114557fe5b905060200201358360405161115c9392919061392e565b60405180910390a1505b600101610f8e565b5050505050505050565b60026020526000908152604090205460ff1681565b6000546001600160a01b031633146111d8576040805162461bcd60e51b81526020600482015260096024820152683737ba1037bbb732b960b91b604482015290519081900360640190fd5b600080546040516001600160a01b03909116907fb532073b38c83145e3e5135377a08bf9aab55bc0fd7c1179cd4fb995d2a5159c908390a3600080546001600160a01b0319169055565b6001546001600160a01b03163314611281576040805162461bcd60e51b815260206004820152600d60248201527f6e6f74206e6f6d696e6174656400000000000000000000000000000000000000604482015290519081900360640190fd5b600154600080546040516001600160a01b0393841693909116917fb532073b38c83145e3e5135377a08bf9aab55bc0fd7c1179cd4fb995d2a5159c91a360018054600080546001600160a01b03199081166001600160a01b03841617909155169055565b6001600160a01b03811660009081526009602090815260409182902060030180548351818402810184019094528084526060939283018282801561135257602002820191906000526020600020905b81546001600160a01b03168152600190910190602001808311611334575b505050505090505b919050565b6000546001600160a01b031633146113aa576040805162461bcd60e51b81526020600482015260096024820152683737ba1037bbb732b960b91b604482015290519081900360640190fd5b6113b2610b4b565b156113f7576040805162461bcd60e51b815260206004820152601060248201526f14185d5cd8589b194e881c185d5cd95960821b604482015290519081900360640190fd5b6108ca6128c2565b61140833612108565b6114245760405162461bcd60e51b815260040161062290613d57565b60005461143e906001600160a01b03848116911683612857565b7f8c1256b8896378cd5044f80c202f9772b9d77dc85c8a6eb51967210b09bfaa288282604051610b2f9291906138db565b6000546001600160a01b031681565b600154600160c81b900460ff1681565b6004546001600160a01b031681565b6006546001600160a01b031681565b6114b533612108565b6114d15760405162461bcd60e51b815260040161062290613d57565b87518751811480156114e35750808751145b80156114ef5750808651145b80156114fb5750808551145b80156115075750808451145b80156115135750808351145b801561151f5750808251145b61153b5760405162461bcd60e51b815260040161062290613b68565b60005b8181101561174357306001600160a01b031663b8a0258d8b838151811061156157fe5b60200260200101518b848151811061157557fe5b60200260200101518b858151811061158957fe5b60200260200101518b868151811061159d57fe5b60200260200101518b87815181106115b157fe5b60200260200101518b88815181106115c557fe5b60200260200101518b89815181106115d957fe5b60200260200101518b8a815181106115ed57fe5b60200260200101516040518963ffffffff1660e01b8152600401611618989796959493929190613a58565b600060405180830381600087803b15801561163257600080fd5b505af1925050508015611643575060015b61173b5761164f614091565b8061165a57506116bd565b7f5d257873bd31a4ef901eefe446bbea52231cc81112ba4c61b319ca53268127728b838151811061168757fe5b602002602001015182604051806020016040528060008152506040516116af9392919061386e565b60405180910390a15061173b565b3d8080156116e7576040519150601f19603f3d011682016040523d82523d6000602084013e6116ec565b606091505b507f5d257873bd31a4ef901eefe446bbea52231cc81112ba4c61b319ca53268127728b838151811061171a57fe5b6020026020010151826040516117319291906138ac565b60405180910390a1505b60010161153e565b50505050505050505050565b600154600160d81b900460ff1681565b61176833612108565b6117845760405162461bcd60e51b815260040161062290613d57565b610e108163ffffffff1610156117ac5760405162461bcd60e51b815260040161062290613e33565b600180547fffffffffffffff00000000ffffffffffffffffffffffffffffffffffffffffff16600160a81b63ffffffff8416021790556040517f890e290c975ea254132a694596f86edbf9e7e7a8e3090438b754382c6b8cefbb90611812908390613fe7565b60405180910390a150565b6005546001600160a01b031681565b6000546001600160a01b03163314611877576040805162461bcd60e51b81526020600482015260096024820152683737ba1037bbb732b960b91b604482015290519081900360640190fd5b600580546001600160a01b0319166001600160a01b0383161790556040517f9e442e9b890aa8c119c011ea97d6e82df7d1a781c1575d17a565d266a87dae129061181290839061383f565b3330146118ee576118d233612108565b6118ee5760405162461bcd60e51b815260040161062290613d57565b6118f789612102565b6119135760405162461bcd60e51b815260040161062290613ea1565b60ff8816600090815260086020526040902054611938906001600160a01b0316612102565b6119545760405162461bcd60e51b815260040161062290613d8e565b60028610156119755760405162461bcd60e51b815260040161062290613c7b565b6001600160a01b037f0000000000000000000000000000000000095413afc295d19edeb1ad7b71c95216878760001981018181106119af57fe5b90506020020160208101906119c4919061330d565b6001600160a01b0316146119ea5760405162461bcd60e51b815260040161062290613ed8565b60648560ff161115611a0e5760405162461bcd60e51b815260040161062290613ad4565b60648460ff161115611a325760405162461bcd60e51b815260040161062290613c0d565b80821115611a525760405162461bcd60e51b815260040161062290613e6a565b6001600160a01b0389166000908152600960205260409020805460ff191660ff8a16178155611a85600382018989613026565b50805461ff00191661010060ff888116919091029190911762ff00001916620100008783160217808355851515600160381b909104909116151514611b1857805467ff000000000000001916600160381b851515021781556040517f30f43b8e82d7d6b9dd6abd01752a4ab90b5a01c59e43fc1e87f7447e71d9203890611b0f908c908790613853565b60405180910390a15b60018101839055600281018290556040517faf033f69586a5a11b9fb76f72a3ff2e0afdf7e308c5a9ddf56cfb4322bec99fa90611b64908c908c908c908c908c908c908b908b906139cb565b60405180910390a150505050505050505050565b6008602052600090815260409020546001600160a01b031681565b600154600160a81b900463ffffffff1681565b611baf33612108565b611bcb5760405162461bcd60e51b815260040161062290613d57565b828114611bea5760405162461bcd60e51b815260040161062290613b68565b60005b8381101561081757611c0483838381811061066457fe5b611c205760405162461bcd60e51b815260040161062290613c44565b600154600160d01b900460ff16858583818110611c3957fe5b905060200201351115611c5e5760405162461bcd60e51b815260040161062290613dc5565b828282818110611c6a57fe5b9050602002016020810190611c7f919061330d565b60076000878785818110611c8f57fe5b6020908102929092013583525081019190915260400160002080546001600160a01b0319166001600160a01b0392909216919091179055600154600160d01b900460ff16858583818110611cdf57fe5b905060200201351415611d2a576001805460ff600160d01b80830482168401909116027fffffffffff00ffffffffffffffffffffffffffffffffffffffffffffffffffff9091161790555b7f761ab005d4d857f7788e11162cbb52f82eacefb02e69470d644666a42b98f2cc858583818110611d5757fe5b90506020020135848484818110611d6a57fe5b9050602002016020810190611d7f919061330d565b604051611d8d929190613f86565b60405180910390a1600101611bed565b6000546001600160a01b03163314611de8576040805162461bcd60e51b81526020600482015260096024820152683737ba1037bbb732b960b91b604482015290519081900360640190fd5b60648160ff161115611e0c5760405162461bcd60e51b815260040161062290613b9f565b600180547fffffffffffff00ffffffffffffffffffffffffffffffffffffffffffffffffff16600160c81b60ff8416021790556040517fc57aba0dc6ec236e9a847d56685af5c3cad259c777f01dcde885bd423d2eee2490611812908390613ff8565b6000546001600160a01b03163314611eba576040805162461bcd60e51b81526020600482015260096024820152683737ba1037bbb732b960b91b604482015290519081900360640190fd5b600680546001600160a01b0319166001600160a01b0383161790556040517fe8430e1d6b6253a12ff526a2557c17dd74a5536493a74c061695de45dfae6e239061181290839061383f565b6000546001600160a01b03163314611f50576040805162461bcd60e51b81526020600482015260096024820152683737ba1037bbb732b960b91b604482015290519081900360640190fd5b600380546001600160a01b0319166001600160a01b0383161790556040517fcb7ef3e545f5cdb893f5c568ba710fe08f336375a2d9fd66e161033f8fc09ef39061181290839061383f565b6000546001600160a01b03163314611fe6576040805162461bcd60e51b81526020600482015260096024820152683737ba1037bbb732b960b91b604482015290519081900360640190fd5b611fef81612102565b61200b5760405162461bcd60e51b815260040161062290613d20565b600480546001600160a01b0319166001600160a01b0383161790556040517f02c05fb73e764eb909fe065f194dfc51499ac7177131a2aeb25da09b5df907349061181290839061383f565b61205f33612108565b61207b5760405162461bcd60e51b815260040161062290613d57565b6001600160a01b0382166000908152600960205260409020805460ff600160381b90910416151582151514610eef57805467ff000000000000001916600160381b831515021781556040517f30f43b8e82d7d6b9dd6abd01752a4ab90b5a01c59e43fc1e87f7447e71d92038906120f59085908590613853565b60405180910390a1505050565b3b151590565b6001600160a01b03811660009081526002602052604081205460ff168061213c57506000546001600160a01b038381169116145b156121495750600161135a565b50600061135a565b612159610b4b565b6121aa576040805162461bcd60e51b815260206004820152601460248201527f5061757361626c653a206e6f7420706175736564000000000000000000000000604482015290519081900360640190fd5b6001805460ff60a01b191690557f5db9ee0a495bf2e6ff9c91a7834c1ba4fdd244a5e8aa4e537bd38aeae4b073aa6121e0612947565b604080516001600160a01b039092168252519081900360200190a1565b60008261220c57506000612259565b8282028284828161221957fe5b04146122565760405162461bcd60e51b815260040180806020018281038252602181526020018061415d6021913960400191505060405180910390fd5b90505b92915050565b60008082116122b5576040805162461bcd60e51b815260206004820152601a60248201527f536166654d6174683a206469766973696f6e206279207a65726f000000000000604482015290519081900360640190fd5b8183816122be57fe5b049392505050565b60008282111561231d576040805162461bcd60e51b815260206004820152601e60248201527f536166654d6174683a207375627472616374696f6e206f766572666c6f770000604482015290519081900360640190fd5b50900390565b60008060008060005b600154600160d01b900460ff1681101561245357600081815260076020526040908190205490517f70a082310000000000000000000000000000000000000000000000000000000081526001600160a01b039182169650908916906370a082319061239b90889060040161383f565b60206040518083038186803b1580156123b357600080fd5b505afa1580156123c7573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906123eb9190613754565b9350856123f8838661294b565b111561240f5761240886836122c6565b9250612413565b8392505b8261241d5761244b565b6124326001600160a01b0389168689866129a5565b61243c828461294b565b91508582141561244b57612453565b60010161232c565b508481146124735760405162461bcd60e51b815260040161062290613b0b565b50505050505050565b60015460009061249e90606490610ca7908590600160c81b900460ff166121fd565b90508015612575576005546040517f40c10f190000000000000000000000000000000000000000000000000000000081526001600160a01b037f0000000000000000000000000000000000095413afc295d19edeb1ad7b71c9528116926340c10f199261251492919091169085906004016138db565b600060405180830381600087803b15801561252e57600080fd5b505af1158015612542573d6000803e3d6000fd5b505050507f384910d170ac9ee2eab04d4c079ef744239a826a800eeb568f1d367d3eb7147581604051610b2f9190613f7d565b5050565b6000806000831161259c5760405162461bcd60e51b815260040161062290613cb2565b6125a533612108565b6125ca5783608001516125ca5760405162461bcd60e51b815260040161062290613f46565b6125e96064610ca7866020015160ff16866121fd90919063ffffffff16565b90506125f583826122c6565b91508115612689578360a001518210156126215760405162461bcd60e51b815260040161062290613ce9565b8360c001518211156126455760405162461bcd60e51b815260040161062290613bd6565b600154606085015161266b9163ffffffff91821691600160a81b90910481169061294b16565b42116126895760405162461bcd60e51b815260040161062290613f0f565b9250929050565b81156108175760006127018685876003018054806020026020016040519081016040528092919081815260200182805480156126f557602002820191906000526020600020905b81546001600160a01b031681526001909101906020018083116126d7575b50505050508686612a1e565b855466ffffffff000000191663010000004263ffffffff160217808755600187015460028801546040519394507f147a11a26edd23cd74d00e505c95b4c392991dcf6eeb9dc8457f1947b02099a393612774938b9389938893610100840460ff908116946201000090041692919061398d565b60405180910390a1604080516101008082018352875460ff8082168452918104821660208085019190915262010000820483168486015263ffffffff63010000008304166060850152600160381b90910490911615156080830152600188015460a0830152600288015460c083015260038801805484518184028101840190955280855261284e948a9360e086019391929083018282801561283f57602002820191906000526020600020905b81546001600160a01b03168152600190910190602001808311612821575b50505050508152505082612b27565b610eeb8161247c565b604080516001600160a01b038416602482015260448082018490528251808303909101815260649091019091526020810180516001600160e01b03167fa9059cbb00000000000000000000000000000000000000000000000000000000179052610eef908490612c17565b6128ca610b4b565b1561290f576040805162461bcd60e51b815260206004820152601060248201526f14185d5cd8589b194e881c185d5cd95960821b604482015290519081900360640190fd5b6001805460ff60a01b1916600160a01b1790557f62e78cea01bee320cd4e420270b5ea74000d11b0c9f74754ebdbfc544b05a2586121e05b3390565b600082820183811015612256576040805162461bcd60e51b815260206004820152601b60248201527f536166654d6174683a206164646974696f6e206f766572666c6f770000000000604482015290519081900360640190fd5b604080516001600160a01b0380861660248301528416604482015260648082018490528251808303909101815260849091019091526020810180516001600160e01b03167f23b872dd00000000000000000000000000000000000000000000000000000000179052612a18908590612c17565b50505050565b6000612a366001600160a01b03871686600019612cc8565b6040517f38ed173900000000000000000000000000000000000000000000000000000000815285906060906001600160a01b038316906338ed173990612a8b90889088908b903090603c420190600401613fab565b600060405180830381600087803b158015612aa557600080fd5b505af1158015612ab9573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f19168201604052612ae19190810190613692565b905080600187510381518110612af357fe5b60200260200101519250612b1c8760008a6001600160a01b0316612cc89092919063ffffffff16565b505095945050505050565b6000612b486064610ca7856040015160ff16856121fd90919063ffffffff16565b90508015612b8a57600354612b8a906001600160a01b037f0000000000000000000000000000000000095413afc295d19edeb1ad7b71c9528116911683612857565b6000612b9683836122c6565b90508015612bd857600454612bd8906001600160a01b037f0000000000000000000000000000000000095413afc295d19edeb1ad7b71c9528116911683612857565b7fd4d626561e9dc8e892258af0fcfd4baf2b993f9bd93126e36642fe7ee81b1c2a8282604051612c09929190613f9d565b60405180910390a150505050565b6060612c6c826040518060400160405280602081526020017f5361666545524332303a206c6f772d6c6576656c2063616c6c206661696c6564815250856001600160a01b0316612e0d9092919063ffffffff16565b805190915015610eef57808060200190516020811015612c8b57600080fd5b5051610eef5760405162461bcd60e51b815260040180806020018281038252602a81526020018061417e602a913960400191505060405180910390fd5b801580612d675750604080517fdd62ed3e0000000000000000000000000000000000000000000000000000000081523060048201526001600160a01b03848116602483015291519185169163dd62ed3e91604480820192602092909190829003018186803b158015612d3957600080fd5b505afa158015612d4d573d6000803e3d6000fd5b505050506040513d6020811015612d6357600080fd5b5051155b612da25760405162461bcd60e51b81526004018080602001828103825260368152602001806141a86036913960400191505060405180910390fd5b604080516001600160a01b038416602482015260448082018490528251808303909101815260649091019091526020810180516001600160e01b03167f095ea7b300000000000000000000000000000000000000000000000000000000179052610eef908490612c17565b6060612e1c8484600085612e26565b90505b9392505050565b606082471015612e675760405162461bcd60e51b81526004018080602001828103825260268152602001806141376026913960400191505060405180910390fd5b612e7085612102565b612ec1576040805162461bcd60e51b815260206004820152601d60248201527f416464726573733a2063616c6c20746f206e6f6e2d636f6e7472616374000000604482015290519081900360640190fd5b60006060866001600160a01b031685876040518082805190602001908083835b60208310612f005780518252601f199092019160209182019101612ee1565b6001836020036101000a03801982511681845116808217855250505050505090500191505060006040518083038185875af1925050503d8060008114612f62576040519150601f19603f3d011682016040523d82523d6000602084013e612f67565b606091505b5091509150612f77828286612f82565b979650505050505050565b60608315612f91575081612e1f565b825115612fa15782518084602001fd5b8160405162461bcd60e51b81526004018080602001828103825283818151815260200191508051906020019080838360005b83811015612feb578181015183820152602001612fd3565b50505050905090810190601f1680156130185780820380516001836020036101000a031916815260200191505b509250505060405180910390fd5b828054828255906000526020600020908101928215613079579160200282015b828111156130795781546001600160a01b0319166001600160a01b03843516178255602090920191600190910190613046565b50613085929150613089565b5090565b5b80821115613085576000815560010161308a565b80356001600160a01b038116811461135a57600080fd5b60008083601f8401126130c6578182fd5b50813567ffffffffffffffff8111156130dd578182fd5b602083019150836020808302850101111561268957600080fd5b600082601f830112613107578081fd5b813561311a6131158261406d565b614049565b81815291506020808301908481018184028601820187101561313b57600080fd5b60005b848110156131615761314f8261309e565b8452928201929082019060010161313e565b505050505092915050565b600082601f83011261317c578081fd5b813561318a6131158261406d565b818152915060208083019084810160005b84811015613161576131b2888484358a01016130f7565b8452928201929082019060010161319b565b600082601f8301126131d4578081fd5b81356131e26131158261406d565b81815291506020808301908481018184028601820187101561320357600080fd5b60005b8481101561316157613217826132ec565b84529282019290820190600101613206565b600082601f830112613239578081fd5b81356132476131158261406d565b81815291506020808301908481018184028601820187101561326857600080fd5b60005b848110156131615781358452928201929082019060010161326b565b600082601f830112613297578081fd5b81356132a56131158261406d565b8181529150602080830190848101818402860182018710156132c657600080fd5b60005b84811015613161576132da826132fc565b845292820192908201906001016132c9565b8035801515811461135a57600080fd5b803560ff8116811461135a57600080fd5b60006020828403121561331e578081fd5b612e1f8261309e565b60008060408385031215613339578081fd5b6133428361309e565b9150613350602084016132ec565b90509250929050565b6000806040838503121561336b578182fd5b6133748361309e565b946020939093013593505050565b600080600060608486031215613396578081fd5b61339f8461309e565b95602085013595506040909401359392505050565b60008060008060008060008060006101008a8c0312156133d2578485fd5b6133db8a61309e565b98506133e960208b016132fc565b975060408a013567ffffffffffffffff811115613404578586fd5b6134108c828d016130b5565b9098509650613423905060608b016132fc565b945061343160808b016132fc565b935061343f60a08b016132ec565b925060c08a0135915060e08a013590509295985092959850929598565b60008060008060408587031215613471578182fd5b843567ffffffffffffffff80821115613488578384fd5b613494888389016130b5565b909650945060208701359150808211156134ac578384fd5b506134b9878288016130b5565b95989497509550505050565b600080600080600080606087890312156134dd578384fd5b863567ffffffffffffffff808211156134f4578586fd5b6135008a838b016130b5565b90985096506020890135915080821115613518578586fd5b6135248a838b016130b5565b9096509450604089013591508082111561353c578384fd5b5061354989828a016130b5565b979a9699509497509295939492505050565b600080600080600080600080610100898b031215613577578182fd5b883567ffffffffffffffff8082111561358e578384fd5b61359a8c838d016130f7565b995060208b01359150808211156135af578384fd5b6135bb8c838d01613287565b985060408b01359150808211156135d0578384fd5b6135dc8c838d0161316c565b975060608b01359150808211156135f1578384fd5b6135fd8c838d01613287565b965060808b0135915080821115613612578384fd5b61361e8c838d01613287565b955060a08b0135915080821115613633578384fd5b61363f8c838d016131c4565b945060c08b0135915080821115613654578384fd5b6136608c838d01613229565b935060e08b0135915080821115613675578283fd5b506136828b828c01613229565b9150509295985092959890939650565b600060208083850312156136a4578182fd5b825167ffffffffffffffff8111156136ba578283fd5b8301601f810185136136ca578283fd5b80516136d86131158261406d565b81815283810190838501858402850186018910156136f4578687fd5b8694505b838510156137165780518352600194909401939185019185016136f8565b50979650505050505050565b600060208284031215613733578081fd5b612e1f826132ec565b60006020828403121561374d578081fd5b5035919050565b600060208284031215613765578081fd5b5051919050565b60006020828403121561377d578081fd5b813563ffffffff81168114612256578182fd5b6000602082840312156137a1578081fd5b612e1f826132fc565b6000815180845260208085019450808401835b838110156137e25781516001600160a01b0316875295820195908201906001016137bd565b509495945050505050565b60008151808452815b81811015613812576020818501810151868301820152016137f6565b818111156138235782602083870101525b50601f01601f19169290920160200192915050565b60ff169052565b6001600160a01b0391909116815260200190565b6001600160a01b039290921682521515602082015260400190565b60006001600160a01b03851682526060602083015261389060608301856137ed565b82810360408401526138a281856137ed565b9695505050505050565b60006001600160a01b03841682526060602083015280606083015260806040830152612e1c60808301846137ed565b6001600160a01b03929092168252602082015260400190565b60006001600160a01b03861682528460208301526080604083015261391c60808301856137ed565b8281036060840152612f7781856137ed565b60006001600160a01b03851682528360208301526080604083015280608083015260a0606083015261396360a08301846137ed565b95945050505050565b6001600160a01b039390931683526020830191909152604082015260600190565b6001600160a01b039790971687526020870195909552604086019390935260ff918216606086015216608084015260a083015260c082015260e00190565b600060e082016001600160a01b03808c168452602060ff8c168186015260e06040860152828a8452610100860190508b9350845b8b811015613a245783613a118661309e565b16825293820193908201906001016139ff565b508094505050505060ff86166060830152613a426080830186613838565b60a082019390935260c001529695505050505050565b60006101006001600160a01b038b16835260ff8a166020840152806040840152613a848184018a6137aa565b60ff98891660608501529690971660808301525092151560a084015260c083019190915260e090910152949350505050565b600060208252612e1f60208301846137aa565b901515815260200190565b60208082526011908201527f696e636f7272656374204c466163746f72000000000000000000000000000000604082015260600190565b60208082526021908201527f696e73756666696369656e7420616d6f756e74206f662066656520746f6b656e60408201527f7300000000000000000000000000000000000000000000000000000000000000606082015260800190565b60208082526019908201527f696e707574206e6f74207468652073616d65206c656e67746800000000000000604082015260600190565b60208082526017908201527f696e636f7272656374206d696e696e6720666163746f72000000000000000000604082015260600190565b6020808252601b908201527f616d6f756e742067726561746572207468616e206d6178206275790000000000604082015260600190565b60208082526011908201527f696e636f72726563742052466163746f72000000000000000000000000000000604082015260600190565b6020808252601a908201527f7374726174656779206973206e6f74206120636f6e7472616374000000000000604082015260600190565b60208082526011908201527f696e76616c696420737761702070617468000000000000000000000000000000604082015260600190565b60208082526015908201527f7a65726f2066656520746f6b656e20616d6f756e740000000000000000000000604082015260600190565b60208082526018908201527f616d6f756e74206c657373207468616e206d696e206275790000000000000000604082015260600190565b6020808252601d908201527f4c6f6e207374616b696e67206973206e6f74206120636f6e7472616374000000604082015260600190565b6020808252601f908201527f6f6e6c79206f70657261746f72206f72206f776e65722063616e2063616c6c00604082015260600190565b6020808252601a908201527f65786368616e6765206973206e6f74206120636f6e7472616374000000000000604082015260600190565b60208082526012908201527f696e646578206f7574206f6620626f756e640000000000000000000000000000604082015260600190565b60208082526011908201527f6f6e6c7920454f412063616e2063616c6c000000000000000000000000000000604082015260600190565b60208082526018908201527f696e76616c6964206275796261636b20696e74657276616c0000000000000000604082015260600190565b6020808252601b908201527f696e636f7272656374206d696e42757920616e64206d61784275790000000000604082015260600190565b6020808252601b908201527f66656520746f6b656e206973206e6f74206120636f6e74726163740000000000604082015260600190565b60208082526018908201527f6f757470757420746f6b656e206d757374206265204c4f4e0000000000000000604082015260600190565b6020808252601a908201527f616c72656164792061206275796261636b20726563656e746c79000000000000604082015260600190565b60208082526018908201527f66656520746f6b656e206973206e6f7420656e61626c65640000000000000000604082015260600190565b90815260200190565b9182526001600160a01b0316602082015260400190565b918252602082015260400190565b600086825285602083015260a06040830152613fca60a08301866137aa565b6001600160a01b0394909416606083015250608001529392505050565b63ffffffff91909116815260200190565b60ff91909116815260200190565b60ff9788168152958716602087015293909516604085015263ffffffff9190911660608401521515608083015260a082019290925260c081019190915260e00190565b60405181810167ffffffffffffffff8111828210171561406557fe5b604052919050565b600067ffffffffffffffff82111561408157fe5b5060209081020190565b60e01c90565b600060443d10156140a157610b59565b600481823e6308c379a06140b5825161408b565b146140bf57610b59565b6040513d600319016004823e80513d67ffffffffffffffff81602484011181841117156140ef5750505050610b59565b828401925082519150808211156141095750505050610b59565b503d8301602082840101111561412157505050610b59565b601f01601f191681016020016040529150509056fe416464726573733a20696e73756666696369656e742062616c616e636520666f722063616c6c536166654d6174683a206d756c7469706c69636174696f6e206f766572666c6f775361666545524332303a204552433230206f7065726174696f6e20646964206e6f7420737563636565645361666545524332303a20617070726f76652066726f6d206e6f6e2d7a65726f20746f206e6f6e2d7a65726f20616c6c6f77616e6365a2646970667358221220df65c620b4337ce81a1d64f7e205d494eef6b29f0f118968d5a17f2aa214af9464736f6c63430007040033

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

0000000000000000000000000000000000095413afc295d19edeb1ad7b71c9520000000000000000000000009afc226dc049b99342ad6774eeb08bfa2f874465000000000000000000000000def3a34689fb7506e75b581c6cde664c9560ca110000000000000000000000000000000000000000000000000000000000015180000000000000000000000000000000000000000000000000000000000000006400000000000000000000000074c3ca9431c009dc35587591dc90780078174f8a000000000000000000000000f88506b0f1d30056b9e5580668d5875b9cd30f23000000000000000000000000292a6921efc261070a0d5c96911c102cbf1045e400000000000000000000000074c3ca9431c009dc35587591dc90780078174f8a

-----Decoded View---------------
Arg [0] : _LON_TOKEN_ADDR (address): 0x0000000000095413afC295d19EDeb1Ad7B71c952
Arg [1] : _owner (address): 0x9aFc226Dc049B99342Ad6774Eeb08BfA2F874465
Arg [2] : _operator (address): 0xDEF3a34689fb7506E75b581C6cdE664C9560Ca11
Arg [3] : _buyBackInterval (uint32): 86400
Arg [4] : _miningFactor (uint8): 100
Arg [5] : _treasury (address): 0x74C3cA9431C009dC35587591Dc90780078174f8a
Arg [6] : _lonStaking (address): 0xf88506B0F1d30056B9e5580668D5875b9cd30F23
Arg [7] : _miningTreasury (address): 0x292a6921Efc261070a0d5C96911c102cBF1045E4
Arg [8] : _feeTokenRecipient (address): 0x74C3cA9431C009dC35587591Dc90780078174f8a

-----Encoded View---------------
9 Constructor Arguments found :
Arg [0] : 0000000000000000000000000000000000095413afc295d19edeb1ad7b71c952
Arg [1] : 0000000000000000000000009afc226dc049b99342ad6774eeb08bfa2f874465
Arg [2] : 000000000000000000000000def3a34689fb7506e75b581c6cde664c9560ca11
Arg [3] : 0000000000000000000000000000000000000000000000000000000000015180
Arg [4] : 0000000000000000000000000000000000000000000000000000000000000064
Arg [5] : 00000000000000000000000074c3ca9431c009dc35587591dc90780078174f8a
Arg [6] : 000000000000000000000000f88506b0f1d30056b9e5580668d5875b9cd30f23
Arg [7] : 000000000000000000000000292a6921efc261070a0d5c96911c102cbf1045e4
Arg [8] : 00000000000000000000000074c3ca9431c009dc35587591dc90780078174f8a


Block Transaction Difficulty Gas Used Reward
View All Blocks Produced

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

Validator Index Block Amount
View All Withdrawals

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

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