ETH Price: $3,323.44 (-3.36%)

Contract

0x9Fb131eFbac23b735d7764AB12F9e52cC68401CA
 

Overview

ETH Balance

60.955409741289961196 ETH

Eth Value

$202,581.76 (@ $3,323.44/ETH)

Multichain Info

No addresses found
Transaction Hash
Method
Block
From
To
Claim Platform F...212638162024-11-25 9:15:5935 hrs ago1732526159IN
Kyber Network: Fee Handler 2
0 ETH0.0005139211.06852341
Claim Platform F...212638142024-11-25 9:15:3535 hrs ago1732526135IN
Kyber Network: Fee Handler 2
0 ETH0.0005113511.01313501
Claim Platform F...212638112024-11-25 9:14:5935 hrs ago1732526099IN
Kyber Network: Fee Handler 2
0 ETH0.000506810.91518637
Claim Reserve Re...140742952022-01-25 10:44:101036 days ago1643107450IN
Kyber Network: Fee Handler 2
0 ETH0.0033132469
Claim Reserve Re...138020642021-12-14 7:58:121078 days ago1639468692IN
Kyber Network: Fee Handler 2
0 ETH0.0032036769
Claim Reserve Re...128221232021-07-14 1:06:201231 days ago1626224780IN
Kyber Network: Fee Handler 2
0 ETH0.0017179137
Claim Reserve Re...126056552021-06-10 8:16:231265 days ago1623312983IN
Kyber Network: Fee Handler 2
0 ETH0.0006035913
Claim Reserve Re...126054032021-06-10 7:25:271265 days ago1623309927IN
Kyber Network: Fee Handler 2
0 ETH0.000439310.00000145
Claim Reserve Re...124726292021-05-20 17:30:111286 days ago1621531811IN
Kyber Network: Fee Handler 2
0 ETH0.00673235145
0x60c06040122631142021-04-18 8:46:251318 days ago1618735585IN
 Create: KatanaFeeHandler
0 ETH0.35186444128

Latest 25 internal transactions (View All)

Advanced mode:
Parent Transaction Hash Block From To
212744732024-11-26 21:00:115 mins ago1732654811
Kyber Network: Fee Handler 2
0.00105974 ETH
212744732024-11-26 21:00:115 mins ago1732654811
Kyber Network: Fee Handler 2
0.00145669 ETH
212740312024-11-26 19:31:351 hr ago1732649495
Kyber Network: Fee Handler 2
0.00079546 ETH
212740312024-11-26 19:31:351 hr ago1732649495
Kyber Network: Fee Handler 2
0.00109342 ETH
212736642024-11-26 18:17:472 hrs ago1732645067
Kyber Network: Fee Handler 2
0.0008023 ETH
212736642024-11-26 18:17:472 hrs ago1732645067
Kyber Network: Fee Handler 2
0.00110282 ETH
212728682024-11-26 15:38:235 hrs ago1732635503
Kyber Network: Fee Handler 2
0.00123382 ETH
212728682024-11-26 15:38:235 hrs ago1732635503
Kyber Network: Fee Handler 2
0.00169598 ETH
212716702024-11-26 11:37:359 hrs ago1732621055
Kyber Network: Fee Handler 2
0.00086976 ETH
212716702024-11-26 11:37:359 hrs ago1732621055
Kyber Network: Fee Handler 2
0.00119554 ETH
212712932024-11-26 10:21:3510 hrs ago1732616495
Kyber Network: Fee Handler 2
0.0004978 ETH
212712932024-11-26 10:21:3510 hrs ago1732616495
Kyber Network: Fee Handler 2
0.00068427 ETH
212699302024-11-26 5:47:2315 hrs ago1732600043
Kyber Network: Fee Handler 2
0.00047323 ETH
212699302024-11-26 5:47:2315 hrs ago1732600043
Kyber Network: Fee Handler 2
0.00065049 ETH
212697032024-11-26 5:01:4716 hrs ago1732597307
Kyber Network: Fee Handler 2
0.00098216 ETH
212697032024-11-26 5:01:4716 hrs ago1732597307
Kyber Network: Fee Handler 2
0.00135005 ETH
212696242024-11-26 4:45:5916 hrs ago1732596359
Kyber Network: Fee Handler 2
0.00066338 ETH
212696242024-11-26 4:45:5916 hrs ago1732596359
Kyber Network: Fee Handler 2
0.00091186 ETH
212693582024-11-26 3:52:3517 hrs ago1732593155
Kyber Network: Fee Handler 2
0.00049865 ETH
212693582024-11-26 3:52:3517 hrs ago1732593155
Kyber Network: Fee Handler 2
0.00068542 ETH
212677932024-11-25 22:37:1122 hrs ago1732574231
Kyber Network: Fee Handler 2
0.00068792 ETH
212677932024-11-25 22:37:1122 hrs ago1732574231
Kyber Network: Fee Handler 2
0.00094559 ETH
212659652024-11-25 16:28:4728 hrs ago1732552127
Kyber Network: Fee Handler 2
0.00086453 ETH
212659652024-11-25 16:28:4728 hrs ago1732552127
Kyber Network: Fee Handler 2
0.00118836 ETH
212658122024-11-25 15:58:1129 hrs ago1732550291
Kyber Network: Fee Handler 2
0.00169496 ETH
View All Internal Transactions
Loading...
Loading

Contract Source Code Verified (Exact Match)

Contract Name:
KatanaFeeHandler

Compiler Version
v0.6.6+commit.6c089d02

Optimization Enabled:
Yes with 1000000 runs

Other Settings:
default evmVersion
File 1 of 11 : KatanaFeeHandler.sol
pragma solidity 0.6.6;

import "../utils/Utils5.sol";
import "../utils/zeppelin/ReentrancyGuard.sol";
import "../utils/zeppelin/SafeMath.sol";
import "../IKyberFeeHandler.sol";
import "../IKyberNetworkProxy.sol";
import "../ISimpleKyberProxy.sol";

import "../mock/reserves/ISanityRate.sol";
import "../mock/dao/IBurnableToken.sol";
import "../mock/dao/DaoOperator.sol";

/**
 * @title IKyberProxy
 *  This interface combines two interfaces.
 *  It is needed since we use one function from each of the interfaces.
 *
 */
interface IKyberProxy is IKyberNetworkProxy, ISimpleKyberProxy {
    // empty block
}

/**
 * @title kyberFeeHandler
 *
 * @dev kyberFeeHandler works tightly with contracts kyberNetwork and kyberDao.
 *   Some events are moved to interface, for easier usage
 * @dev Terminology:
 *   Epoch - Voting campaign time frame in kyberDao.
 *     kyberDao voting campaigns are in the scope of epochs.
 *   BRR - Burn / Reward / Rebate. kyberNetwork fee is used for 3 purposes:
 *     Burning KNC
 *     Reward an address that staked knc in kyberStaking contract. AKA - stakers
 *     Rebate reserves for supporting trades.
 * @dev Code flow:
 *    Per trade on kyberNetwork, it calls handleFees() function which
 *    internally accounts for network & platform fees from the trade. 
 *    Fee distribution:
 *      rewards: send to fee pool
 *      rebates: accumulated per rebate wallet, can be claimed any time.
 *      burn: accumulated in the contract. Burned value and interval limited with safe check using
 *        sanity rate.
 *      Platfrom fee: accumulated per platform wallet, can be claimed any time.
 */
contract KatanaFeeHandler is Utils5, DaoOperator, ReentrancyGuard, IKyberFeeHandler {
    using SafeMath for uint256;

    uint256 internal constant SANITY_RATE_DIFF_BPS = 1000; // 10%

    struct BRRData {
        uint16 rewardBps;
        uint16 rebateBps;
    }

    struct BRRWei {
        uint256 rewardWei;
        uint256 fullRebateWei;
        uint256 paidRebateWei;
        uint256 burnWei;
    }

    IKyberProxy public kyberProxy;
    address public feePool;
    IERC20 public immutable knc;

    uint256 public immutable burnBlockInterval;
    uint256 public lastBurnBlock;

    BRRData public brrData;

    /// @dev amount of eth to burn for each burn knc call
    uint256 public weiToBurn = 2 ether;

    mapping(address => uint256) public feePerPlatformWallet;
    mapping(address => uint256) public rebatePerWallet;
    // total balance in the contract that is for rebate, reward, platform fee
    uint256 public totalPayoutBalance;
    /// @dev use to get rate of KNC/ETH to check if rate to burn knc is normal
    /// @dev index 0 is currently used contract address, indexes > 0 are older versions
    ISanityRate[] internal sanityRateContract;

    event FeeDistributed(
        IERC20 indexed token,
        address indexed sender,
        address indexed platformWallet,
        uint256 platformFeeWei,
        uint256 rewardWei,
        uint256 rebateWei,
        address[] rebateWallets,
        uint256[] rebatePercentBpsPerWallet,
        uint256 burnAmtWei
    );

    event BRRUpdated(uint256 rewardBps, uint256 rebateBps, uint256 burnBps);

    event FeePoolUpdated(address feePool);

    event RebatePaid(address indexed rebateWallet, IERC20 indexed token, uint256 amount);

    event PlatformFeePaid(address indexed platformWallet, IERC20 indexed token, uint256 amount);

    event KncBurned(uint256 kncTWei, IERC20 indexed token, uint256 amount);

    event EthReceived(uint256 amount);

    event BurnConfigSet(ISanityRate sanityRate, uint256 weiToBurn);

    event DaoOperatorUpdated(address daoOperator);

    event KyberProxyUpdated(IKyberProxy kyberProxy);

    constructor(
        IKyberProxy _kyberProxy,
        IERC20 _knc,
        uint256 _burnBlockInterval,
        address _daoOperator,
        address _feePool,
        uint256 _rewardBps,
        uint256 _rebateBps
    ) public DaoOperator(_daoOperator) {
        require(_kyberProxy != IKyberProxy(0), "kyberNetworkProxy 0");
        require(_knc != IERC20(0), "knc 0");
        require(_burnBlockInterval != 0, "_burnBlockInterval 0");
        require(_feePool != address(0), "feePool 0");

        kyberProxy = _kyberProxy;
        knc = _knc;
        burnBlockInterval = _burnBlockInterval;
        feePool = _feePool;

        // set default brrData
        require(_rewardBps.add(_rebateBps) <= BPS, "Bad BRR values");
        brrData.rewardBps = uint16(_rewardBps);
        brrData.rebateBps = uint16(_rebateBps);
    }

    modifier onlyNonContract {
        require(tx.origin == msg.sender, "only non-contract");
        _;
    }

    receive() external payable {
        emit EthReceived(msg.value);
    }

    function setDaoOperator(address _daoOperator) external onlyDaoOperator {
        require(_daoOperator != address(0), "daoOperator 0");
        daoOperator = _daoOperator;

        emit DaoOperatorUpdated(_daoOperator);
    }

    /// @dev only call by daoOperator
    function setBRRData(
        uint256 _burnBps,
        uint256 _rewardBps,
        uint256 _rebateBps
    ) external onlyDaoOperator {
        require(_burnBps.add(_rewardBps).add(_rebateBps) == BPS, "Bad BRR values");
        brrData.rewardBps = uint16(_rewardBps);
        brrData.rebateBps = uint16(_rebateBps);

        emit BRRUpdated(_rewardBps, _rebateBps, _burnBps);
    }

    function setFeePool(address _feePool) external onlyDaoOperator {
        require(_feePool != address(0), "feePool 0");
        feePool = _feePool;

        emit FeePoolUpdated(_feePool);
    }

    /// @dev handleFees function is called per trade on kyberNetwork
    /// @dev unless the trade is not involving any fees.
    /// @param token Token currency of fees
    /// @param rebateWallets a list of rebate wallets that will get rebate for this trade.
    /// @param rebateBpsPerWallet percentage of rebate for each wallet, out of total rebate.
    /// @param platformWallet Wallet address that will receive the platfrom fee.
    /// @param platformFee Fee amount (in wei) the platfrom wallet is entitled to.
    /// @param networkFee Fee amount (in wei) to be allocated for BRR
    function handleFees(
        IERC20 token,
        address[] calldata rebateWallets,
        uint256[] calldata rebateBpsPerWallet,
        address platformWallet,
        uint256 platformFee,
        uint256 networkFee
    ) external payable override nonReentrant {
        require(token == ETH_TOKEN_ADDRESS, "token not eth");
        require(msg.value == platformFee.add(networkFee), "msg.value != total fees");

        // handle platform fee
        feePerPlatformWallet[platformWallet] = feePerPlatformWallet[platformWallet].add(
            platformFee
        );

        if (networkFee == 0) {
            // only platform fee paid
            totalPayoutBalance = totalPayoutBalance.add(platformFee);
            emit FeeDistributed(
                ETH_TOKEN_ADDRESS,
                msg.sender,
                platformWallet,
                platformFee,
                0,
                0,
                rebateWallets,
                rebateBpsPerWallet,
                0
            );
            return;
        }

        BRRWei memory brrAmounts;

        // Decoding BRR data
        (brrAmounts.rewardWei, brrAmounts.fullRebateWei) = getRRWeiValues(networkFee);
        brrAmounts.paidRebateWei = updateRebateValues(
            brrAmounts.fullRebateWei,
            rebateWallets,
            rebateBpsPerWallet
        );
        brrAmounts.burnWei = networkFee.sub(brrAmounts.rewardWei).sub(brrAmounts.paidRebateWei);
        // update total balance of rebates & platform fee
        totalPayoutBalance = totalPayoutBalance.add(platformFee).add(brrAmounts.paidRebateWei);

        //TODO: transfer reward to fee pool
        (bool success, ) = feePool.call{value: brrAmounts.rewardWei}("");
        require(success, "send fee failed");

        emit FeeDistributed(
            ETH_TOKEN_ADDRESS,
            msg.sender,
            platformWallet,
            platformFee,
            brrAmounts.rewardWei,
            brrAmounts.paidRebateWei,
            rebateWallets,
            rebateBpsPerWallet,
            brrAmounts.burnWei
        );
    }

    /// @dev claim rebate per reserve wallet. called by any address
    /// @param rebateWallet the wallet to claim rebates for. 
    /// @dev Total accumulated rebate sent to this wallet.
    /// @return amountWei amount of rebate claimed
    function claimReserveRebate(address rebateWallet)
        external
        override
        nonReentrant
        returns (uint256 amountWei)
    {
        require(rebatePerWallet[rebateWallet] > 1, "no rebate to claim");
        // Get total amount of rebate accumulated
        amountWei = rebatePerWallet[rebateWallet].sub(1);

        // redundant check, can't happen
        assert(totalPayoutBalance >= amountWei);
        totalPayoutBalance = totalPayoutBalance.sub(amountWei);

        rebatePerWallet[rebateWallet] = 1; // avoid zero to non zero storage cost

        // send rebate to rebate wallet
        (bool success, ) = rebateWallet.call{value: amountWei}("");
        require(success, "rebate transfer failed");

        emit RebatePaid(rebateWallet, ETH_TOKEN_ADDRESS, amountWei);

        return amountWei;
    }

    /// @dev implement so this contract is not marked as abstract
    function claimStakerReward(
        address, /*staker*/
        uint256 /*epoch*/
    ) external override returns (uint256) {
        revert();
    }

    /// @dev claim accumulated fee per platform wallet. Called by any address
    /// @param platformWallet the wallet to claim fee for.
    /// @dev Total accumulated fee sent to this wallet.
    /// @return amountWei amount of fee claimed
    function claimPlatformFee(address platformWallet)
        external
        override
        nonReentrant
        returns (uint256 amountWei)
    {
        require(feePerPlatformWallet[platformWallet] > 1, "no fee to claim");
        // Get total amount of fees accumulated
        amountWei = feePerPlatformWallet[platformWallet].sub(1);

        // redundant check, can't happen
        assert(totalPayoutBalance >= amountWei);
        totalPayoutBalance = totalPayoutBalance.sub(amountWei);

        feePerPlatformWallet[platformWallet] = 1; // avoid zero to non zero storage cost

        (bool success, ) = platformWallet.call{value: amountWei}("");
        require(success, "platform fee transfer failed");

        emit PlatformFeePaid(platformWallet, ETH_TOKEN_ADDRESS, amountWei);
        return amountWei;
    }

    /// @dev Allow to set kyberNetworkProxy address by daoOperator
    /// @param _newProxy new kyberNetworkProxy contract
    function setKyberProxy(IKyberProxy _newProxy) external onlyDaoOperator {
        require(_newProxy != IKyberProxy(0), "kyberNetworkProxy 0");
        if (_newProxy != kyberProxy) {
            kyberProxy = _newProxy;
            emit KyberProxyUpdated(_newProxy);
        }
    }

    /// @dev set knc sanity rate contract and amount wei to burn
    /// @param _sanityRate new sanity rate contract
    /// @param _weiToBurn new amount of wei to burn
    function setBurnConfigParams(ISanityRate _sanityRate, uint256 _weiToBurn)
        external
        onlyDaoOperator
    {
        require(_weiToBurn > 0, "_weiToBurn is 0");

        if (sanityRateContract.length == 0 || (_sanityRate != sanityRateContract[0])) {
            // it is a new sanity rate contract
            if (sanityRateContract.length == 0) {
                sanityRateContract.push(_sanityRate);
            } else {
                sanityRateContract.push(sanityRateContract[0]);
                sanityRateContract[0] = _sanityRate;
            }
        }

        weiToBurn = _weiToBurn;

        emit BurnConfigSet(_sanityRate, _weiToBurn);
    }

    /// @dev Burn knc. The burn amount is limited. Forces block delay between burn calls.
    /// @dev only none ontract can call this function
    /// @return kncBurnAmount amount of knc burned
    function burnKnc() external onlyNonContract returns (uint256 kncBurnAmount) {
        // check if current block > last burn block number + num block interval
        require(block.number > lastBurnBlock + burnBlockInterval, "wait more blocks to burn");

        // update last burn block number
        lastBurnBlock = block.number;

        // Get amount to burn, if greater than weiToBurn, burn only weiToBurn per function call.
        uint256 balance = address(this).balance;

        // redundant check, can't happen
        assert(balance >= totalPayoutBalance);
        uint256 srcAmount = balance.sub(totalPayoutBalance);
        srcAmount = srcAmount > weiToBurn ? weiToBurn : srcAmount;

        // Get rate
        uint256 kyberEthKncRate =
            kyberProxy.getExpectedRateAfterFee(ETH_TOKEN_ADDRESS, knc, srcAmount, 0, "");
        validateEthToKncRateToBurn(kyberEthKncRate);

        // Buy some knc and burn
        kncBurnAmount = kyberProxy.swapEtherToToken{value: srcAmount}(knc, kyberEthKncRate);

        require(IBurnableToken(address(knc)).burn(kncBurnAmount), "knc burn failed");

        emit KncBurned(kncBurnAmount, ETH_TOKEN_ADDRESS, srcAmount);
        return kncBurnAmount;
    }

    /// @notice should be called off chain
    /// @dev returns list of sanity rate contracts
    /// @dev index 0 is currently used contract address, indexes > 0 are older versions
    function getSanityRateContracts() external view returns (ISanityRate[] memory sanityRates) {
        sanityRates = sanityRateContract;
    }

    /// @dev return latest knc/eth rate from sanity rate contract
    function getLatestSanityRate() external view returns (uint256 kncToEthSanityRate) {
        if (sanityRateContract.length > 0 && sanityRateContract[0] != ISanityRate(0)) {
            kncToEthSanityRate = sanityRateContract[0].latestAnswer();
        } else {
            kncToEthSanityRate = 0;
        }
    }

    function readBRRData() external view returns (uint256 rewardBps, uint256 rebateBps) {
        rewardBps = uint256(brrData.rewardBps);
        rebateBps = uint256(brrData.rebateBps);
    }

    function updateRebateValues(
        uint256 rebateWei,
        address[] memory rebateWallets,
        uint256[] memory rebateBpsPerWallet
    ) internal returns (uint256 totalRebatePaidWei) {
        uint256 totalRebateBps;
        uint256 walletRebateWei;

        for (uint256 i = 0; i < rebateWallets.length; i++) {
            require(rebateWallets[i] != address(0), "rebate wallet address 0");

            walletRebateWei = rebateWei.mul(rebateBpsPerWallet[i]).div(BPS);
            rebatePerWallet[rebateWallets[i]] = rebatePerWallet[rebateWallets[i]].add(
                walletRebateWei
            );

            // a few wei could be left out due to rounding down. so count only paid wei
            totalRebatePaidWei = totalRebatePaidWei.add(walletRebateWei);
            totalRebateBps = totalRebateBps.add(rebateBpsPerWallet[i]);
        }
        require(totalRebateBps <= BPS, "totalRebateBps > 100%");
    }

    function getRRWeiValues(uint256 rrAmountWei)
        internal
        view
        returns (uint256 rewardWei, uint256 rebateWei)
    {
        // Decoding BRR data
        uint256 rewardInBps = uint256(brrData.rewardBps);
        uint256 rebateInBps = uint256(brrData.rebateBps);

        rebateWei = rrAmountWei.mul(rebateInBps).div(BPS);
        rewardWei = rrAmountWei.mul(rewardInBps).div(BPS);
    }

    function validateEthToKncRateToBurn(uint256 rateEthToKnc) internal view {
        require(rateEthToKnc <= MAX_RATE, "ethToKnc rate out of bounds");
        require(rateEthToKnc > 0, "ethToKnc rate is 0");
        require(sanityRateContract.length > 0, "no sanity rate contract");
        require(sanityRateContract[0] != ISanityRate(0), "sanity rate is 0x0, burning is blocked");

        // get latest knc/eth rate from sanity contract
        uint256 kncToEthRate = sanityRateContract[0].latestAnswer();
        require(kncToEthRate > 0, "sanity rate is 0");
        require(kncToEthRate <= MAX_RATE, "sanity rate out of bounds");

        uint256 sanityEthToKncRate = PRECISION.mul(PRECISION).div(kncToEthRate);

        // rate shouldn't be SANITY_RATE_DIFF_BPS lower than sanity rate
        require(
            rateEthToKnc.mul(BPS) >= sanityEthToKncRate.mul(BPS.sub(SANITY_RATE_DIFF_BPS)),
            "kyberNetwork eth to knc rate too low"
        );
    }
}

File 2 of 11 : Utils5.sol
pragma solidity 0.6.6;

import "../IERC20.sol";


/**
 * @title Kyber utility file
 * mostly shared constants and rate calculation helpers
 * inherited by most of kyber contracts.
 * previous utils implementations are for previous solidity versions.
 */
contract Utils5 {
    IERC20 internal constant ETH_TOKEN_ADDRESS = IERC20(
        0xEeeeeEeeeEeEeeEeEeEeeEEEeeeeEeeeeeeeEEeE
    );
    uint256 internal constant PRECISION = (10**18);
    uint256 internal constant MAX_QTY = (10**28); // 10B tokens
    uint256 internal constant MAX_RATE = (PRECISION * 10**7); // up to 10M tokens per eth
    uint256 internal constant MAX_DECIMALS = 18;
    uint256 internal constant ETH_DECIMALS = 18;
    uint256 constant BPS = 10000; // Basic Price Steps. 1 step = 0.01%
    uint256 internal constant MAX_ALLOWANCE = uint256(-1); // token.approve inifinite

    mapping(IERC20 => uint256) internal decimals;

    function getUpdateDecimals(IERC20 token) internal returns (uint256) {
        if (token == ETH_TOKEN_ADDRESS) return ETH_DECIMALS; // save storage access
        uint256 tokenDecimals = decimals[token];
        // moreover, very possible that old tokens have decimals 0
        // these tokens will just have higher gas fees.
        if (tokenDecimals == 0) {
            tokenDecimals = token.decimals();
            decimals[token] = tokenDecimals;
        }

        return tokenDecimals;
    }

    function setDecimals(IERC20 token) internal {
        if (decimals[token] != 0) return; //already set

        if (token == ETH_TOKEN_ADDRESS) {
            decimals[token] = ETH_DECIMALS;
        } else {
            decimals[token] = token.decimals();
        }
    }

    /// @dev get the balance of a user.
    /// @param token The token type
    /// @return The balance
    function getBalance(IERC20 token, address user) internal view returns (uint256) {
        if (token == ETH_TOKEN_ADDRESS) {
            return user.balance;
        } else {
            return token.balanceOf(user);
        }
    }

    function getDecimals(IERC20 token) internal view returns (uint256) {
        if (token == ETH_TOKEN_ADDRESS) return ETH_DECIMALS; // save storage access
        uint256 tokenDecimals = decimals[token];
        // moreover, very possible that old tokens have decimals 0
        // these tokens will just have higher gas fees.
        if (tokenDecimals == 0) return token.decimals();

        return tokenDecimals;
    }

    function calcDestAmount(
        IERC20 src,
        IERC20 dest,
        uint256 srcAmount,
        uint256 rate
    ) internal view returns (uint256) {
        return calcDstQty(srcAmount, getDecimals(src), getDecimals(dest), rate);
    }

    function calcSrcAmount(
        IERC20 src,
        IERC20 dest,
        uint256 destAmount,
        uint256 rate
    ) internal view returns (uint256) {
        return calcSrcQty(destAmount, getDecimals(src), getDecimals(dest), rate);
    }

    function calcDstQty(
        uint256 srcQty,
        uint256 srcDecimals,
        uint256 dstDecimals,
        uint256 rate
    ) internal pure returns (uint256) {
        require(srcQty <= MAX_QTY, "srcQty > MAX_QTY");
        require(rate <= MAX_RATE, "rate > MAX_RATE");

        if (dstDecimals >= srcDecimals) {
            require((dstDecimals - srcDecimals) <= MAX_DECIMALS, "dst - src > MAX_DECIMALS");
            return (srcQty * rate * (10**(dstDecimals - srcDecimals))) / PRECISION;
        } else {
            require((srcDecimals - dstDecimals) <= MAX_DECIMALS, "src - dst > MAX_DECIMALS");
            return (srcQty * rate) / (PRECISION * (10**(srcDecimals - dstDecimals)));
        }
    }

    function calcSrcQty(
        uint256 dstQty,
        uint256 srcDecimals,
        uint256 dstDecimals,
        uint256 rate
    ) internal pure returns (uint256) {
        require(dstQty <= MAX_QTY, "dstQty > MAX_QTY");
        require(rate <= MAX_RATE, "rate > MAX_RATE");

        //source quantity is rounded up. to avoid dest quantity being too low.
        uint256 numerator;
        uint256 denominator;
        if (srcDecimals >= dstDecimals) {
            require((srcDecimals - dstDecimals) <= MAX_DECIMALS, "src - dst > MAX_DECIMALS");
            numerator = (PRECISION * dstQty * (10**(srcDecimals - dstDecimals)));
            denominator = rate;
        } else {
            require((dstDecimals - srcDecimals) <= MAX_DECIMALS, "dst - src > MAX_DECIMALS");
            numerator = (PRECISION * dstQty);
            denominator = (rate * (10**(dstDecimals - srcDecimals)));
        }
        return (numerator + denominator - 1) / denominator; //avoid rounding down errors
    }

    function calcRateFromQty(
        uint256 srcAmount,
        uint256 destAmount,
        uint256 srcDecimals,
        uint256 dstDecimals
    ) internal pure returns (uint256) {
        require(srcAmount <= MAX_QTY, "srcAmount > MAX_QTY");
        require(destAmount <= MAX_QTY, "destAmount > MAX_QTY");

        if (dstDecimals >= srcDecimals) {
            require((dstDecimals - srcDecimals) <= MAX_DECIMALS, "dst - src > MAX_DECIMALS");
            return ((destAmount * PRECISION) / ((10**(dstDecimals - srcDecimals)) * srcAmount));
        } else {
            require((srcDecimals - dstDecimals) <= MAX_DECIMALS, "src - dst > MAX_DECIMALS");
            return ((destAmount * PRECISION * (10**(srcDecimals - dstDecimals))) / srcAmount);
        }
    }

    function minOf(uint256 x, uint256 y) internal pure returns (uint256) {
        return x > y ? y : x;
    }
}

File 3 of 11 : ReentrancyGuard.sol
pragma solidity 0.6.6;

/**
 * @dev Contract module that helps prevent reentrant calls to a function.
 *
 * Inheriting from `ReentrancyGuard` will make the {nonReentrant} modifier
 * available, which can be applied to functions to make sure there are no nested
 * (reentrant) calls to them.
 *
 * Note that because there is a single `nonReentrant` guard, functions marked as
 * `nonReentrant` may not call one another. This can be worked around by making
 * those functions `private`, and then adding `external` `nonReentrant` entry
 * points to them.
 *
 * TIP: If you would like to learn more about reentrancy and alternative ways
 * to protect against it, check out our blog post
 * https://blog.openzeppelin.com/reentrancy-after-istanbul/[Reentrancy After Istanbul].
 */
contract ReentrancyGuard {
    bool private _notEntered;

    constructor () internal {
        // Storing an initial non-zero value makes deployment a bit more
        // expensive, but in exchange the refund on every call to nonReentrant
        // will be lower in amount. Since refunds are capped to a percetange of
        // the total transaction's gas, it is best to keep them low in cases
        // like this one, to increase the likelihood of the full refund coming
        // into effect.
        _notEntered = true;
    }

    /**
     * @dev Prevents a contract from calling itself, directly or indirectly.
     * Calling a `nonReentrant` function from another `nonReentrant`
     * function is not supported. It is possible to prevent this from happening
     * by making the `nonReentrant` function external, and make it call a
     * `private` function that does the actual work.
     */
    modifier nonReentrant() {
        // On the first call to nonReentrant, _notEntered will be true
        require(_notEntered, "ReentrancyGuard: reentrant call");

        // Any calls to nonReentrant after this point will fail
        _notEntered = false;

        _;

        // By storing the original value once again, a refund is triggered (see
        // https://eips.ethereum.org/EIPS/eip-2200)
        _notEntered = true;
    }
}

File 4 of 11 : SafeMath.sol
pragma solidity 0.6.6;

/**
 * @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, 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) {
        return sub(a, b, "SafeMath: subtraction overflow");
    }

    /**
     * @dev Returns the subtraction of two unsigned integers, reverting with custom message on
     * overflow (when the result is negative).
     *
     * 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);
        uint256 c = a - b;

        return c;
    }

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

        uint256 c = a * b;
        require(c / a == b, "SafeMath: multiplication overflow");

        return c;
    }

    /**
     * @dev Returns the integer division of two unsigned integers. Reverts 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) {
        return div(a, b, "SafeMath: division by zero");
    }

    /**
     * @dev Returns the integer division of two unsigned integers. Reverts with custom message 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, string memory errorMessage) internal pure returns (uint256) {
        // Solidity only automatically asserts when dividing by 0
        require(b > 0, errorMessage);
        uint256 c = a / b;
        // assert(a == b * c + a % b); // There is no case in which this doesn't hold

        return c;
    }

    /**
     * @dev Returns the remainder of dividing two unsigned integers. (unsigned integer modulo),
     * Reverts 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) {
        return mod(a, b, "SafeMath: modulo by zero");
    }

    /**
     * @dev Returns the remainder of dividing two unsigned integers. (unsigned integer modulo),
     * Reverts with custom message 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, string memory errorMessage) internal pure returns (uint256) {
        require(b != 0, errorMessage);
        return a % b;
    }

    /**
     * @dev Returns the smallest of two numbers.
     */
    function min(uint256 a, uint256 b) internal pure returns (uint256) {
        return a < b ? a : b;
    }
}

File 5 of 11 : IKyberFeeHandler.sol
pragma solidity 0.6.6;

import "./IERC20.sol";


interface IKyberFeeHandler {
    event RewardPaid(address indexed staker, uint256 indexed epoch, IERC20 indexed token, uint256 amount);
    event RebatePaid(address indexed rebateWallet, IERC20 indexed token, uint256 amount);
    event PlatformFeePaid(address indexed platformWallet, IERC20 indexed token, uint256 amount);
    event KncBurned(uint256 kncTWei, IERC20 indexed token, uint256 amount);

    function handleFees(
        IERC20 token,
        address[] calldata eligibleWallets,
        uint256[] calldata rebatePercentages,
        address platformWallet,
        uint256 platformFee,
        uint256 networkFee
    ) external payable;

    function claimReserveRebate(address rebateWallet) external returns (uint256);

    function claimPlatformFee(address platformWallet) external returns (uint256);

    function claimStakerReward(
        address staker,
        uint256 epoch
    ) external returns(uint amount);
}

File 6 of 11 : IKyberNetworkProxy.sol
pragma solidity 0.6.6;

import "./IERC20.sol";


interface IKyberNetworkProxy {

    event ExecuteTrade(
        address indexed trader,
        IERC20 src,
        IERC20 dest,
        address destAddress,
        uint256 actualSrcAmount,
        uint256 actualDestAmount,
        address platformWallet,
        uint256 platformFeeBps
    );

    /// @notice backward compatible
    function tradeWithHint(
        ERC20 src,
        uint256 srcAmount,
        ERC20 dest,
        address payable destAddress,
        uint256 maxDestAmount,
        uint256 minConversionRate,
        address payable walletId,
        bytes calldata hint
    ) external payable returns (uint256);

    function tradeWithHintAndFee(
        IERC20 src,
        uint256 srcAmount,
        IERC20 dest,
        address payable destAddress,
        uint256 maxDestAmount,
        uint256 minConversionRate,
        address payable platformWallet,
        uint256 platformFeeBps,
        bytes calldata hint
    ) external payable returns (uint256 destAmount);

    function trade(
        IERC20 src,
        uint256 srcAmount,
        IERC20 dest,
        address payable destAddress,
        uint256 maxDestAmount,
        uint256 minConversionRate,
        address payable platformWallet
    ) external payable returns (uint256);

    /// @notice backward compatible
    /// @notice Rate units (10 ** 18) => destQty (twei) / srcQty (twei) * 10 ** 18
    function getExpectedRate(
        ERC20 src,
        ERC20 dest,
        uint256 srcQty
    ) external view returns (uint256 expectedRate, uint256 worstRate);

    function getExpectedRateAfterFee(
        IERC20 src,
        IERC20 dest,
        uint256 srcQty,
        uint256 platformFeeBps,
        bytes calldata hint
    ) external view returns (uint256 expectedRate);
}

File 7 of 11 : ISimpleKyberProxy.sol
pragma solidity 0.6.6;

import "./IERC20.sol";


/*
 * @title simple Kyber Network proxy interface
 * add convenient functions to help with kyber proxy API
 */
interface ISimpleKyberProxy {
    function swapTokenToEther(
        IERC20 token,
        uint256 srcAmount,
        uint256 minConversionRate
    ) external returns (uint256 destAmount);

    function swapEtherToToken(IERC20 token, uint256 minConversionRate)
        external
        payable
        returns (uint256 destAmount);

    function swapTokenToToken(
        IERC20 src,
        uint256 srcAmount,
        IERC20 dest,
        uint256 minConversionRate
    ) external returns (uint256 destAmount);
}

File 8 of 11 : ISanityRate.sol
pragma solidity 0.6.6;


/// @title Sanity Rate check to prevent burning knc with too expensive or cheap price
/// @dev Using ChainLink as the provider for current knc/eth price
interface ISanityRate {
    // return latest rate of knc/eth
    function latestAnswer() external view returns (uint256);
}

File 9 of 11 : IBurnableToken.sol
pragma solidity 0.6.6;


interface IBurnableToken {
    function burn(uint256 _value) external returns (bool);
}

File 10 of 11 : DaoOperator.sol
pragma solidity 0.6.6;


contract DaoOperator {
    address public daoOperator;

    constructor(address _daoOperator) public {
        require(_daoOperator != address(0), "daoOperator is 0");
        daoOperator = _daoOperator;
    }

    modifier onlyDaoOperator() {
        require(msg.sender == daoOperator, "only daoOperator");
        _;
    }
}

File 11 of 11 : IERC20.sol
pragma solidity 0.6.6;


interface IERC20 {
    event Approval(address indexed _owner, address indexed _spender, uint256 _value);

    function approve(address _spender, uint256 _value) external returns (bool success);

    function transfer(address _to, uint256 _value) external returns (bool success);

    function transferFrom(
        address _from,
        address _to,
        uint256 _value
    ) external returns (bool success);

    function allowance(address _owner, address _spender) external view returns (uint256 remaining);

    function balanceOf(address _owner) external view returns (uint256 balance);

    function decimals() external view returns (uint8 digits);

    function totalSupply() external view returns (uint256 supply);
}


// to support backward compatible contract name -- so function signature remains same
abstract contract ERC20 is IERC20 {

}

Settings
{
  "optimizer": {
    "enabled": true,
    "runs": 1000000
  },
  "outputSelection": {
    "*": {
      "*": [
        "evm.bytecode",
        "evm.deployedBytecode",
        "abi"
      ]
    }
  },
  "libraries": {}
}

Contract Security Audit

Contract ABI

[{"inputs":[{"internalType":"contract IKyberProxy","name":"_kyberProxy","type":"address"},{"internalType":"contract IERC20","name":"_knc","type":"address"},{"internalType":"uint256","name":"_burnBlockInterval","type":"uint256"},{"internalType":"address","name":"_daoOperator","type":"address"},{"internalType":"address","name":"_feePool","type":"address"},{"internalType":"uint256","name":"_rewardBps","type":"uint256"},{"internalType":"uint256","name":"_rebateBps","type":"uint256"}],"stateMutability":"nonpayable","type":"constructor"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"rewardBps","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"rebateBps","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"burnBps","type":"uint256"}],"name":"BRRUpdated","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"contract ISanityRate","name":"sanityRate","type":"address"},{"indexed":false,"internalType":"uint256","name":"weiToBurn","type":"uint256"}],"name":"BurnConfigSet","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"daoOperator","type":"address"}],"name":"DaoOperatorUpdated","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"}],"name":"EthReceived","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"contract IERC20","name":"token","type":"address"},{"indexed":true,"internalType":"address","name":"sender","type":"address"},{"indexed":true,"internalType":"address","name":"platformWallet","type":"address"},{"indexed":false,"internalType":"uint256","name":"platformFeeWei","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"rewardWei","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"rebateWei","type":"uint256"},{"indexed":false,"internalType":"address[]","name":"rebateWallets","type":"address[]"},{"indexed":false,"internalType":"uint256[]","name":"rebatePercentBpsPerWallet","type":"uint256[]"},{"indexed":false,"internalType":"uint256","name":"burnAmtWei","type":"uint256"}],"name":"FeeDistributed","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"feePool","type":"address"}],"name":"FeePoolUpdated","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"kncTWei","type":"uint256"},{"indexed":true,"internalType":"contract IERC20","name":"token","type":"address"},{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"}],"name":"KncBurned","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"contract IKyberProxy","name":"kyberProxy","type":"address"}],"name":"KyberProxyUpdated","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"platformWallet","type":"address"},{"indexed":true,"internalType":"contract IERC20","name":"token","type":"address"},{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"}],"name":"PlatformFeePaid","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"rebateWallet","type":"address"},{"indexed":true,"internalType":"contract IERC20","name":"token","type":"address"},{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"}],"name":"RebatePaid","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"staker","type":"address"},{"indexed":true,"internalType":"uint256","name":"epoch","type":"uint256"},{"indexed":true,"internalType":"contract IERC20","name":"token","type":"address"},{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"}],"name":"RewardPaid","type":"event"},{"inputs":[],"name":"brrData","outputs":[{"internalType":"uint16","name":"rewardBps","type":"uint16"},{"internalType":"uint16","name":"rebateBps","type":"uint16"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"burnBlockInterval","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"burnKnc","outputs":[{"internalType":"uint256","name":"kncBurnAmount","type":"uint256"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"platformWallet","type":"address"}],"name":"claimPlatformFee","outputs":[{"internalType":"uint256","name":"amountWei","type":"uint256"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"rebateWallet","type":"address"}],"name":"claimReserveRebate","outputs":[{"internalType":"uint256","name":"amountWei","type":"uint256"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"},{"internalType":"uint256","name":"","type":"uint256"}],"name":"claimStakerReward","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"daoOperator","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"feePerPlatformWallet","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"feePool","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getLatestSanityRate","outputs":[{"internalType":"uint256","name":"kncToEthSanityRate","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getSanityRateContracts","outputs":[{"internalType":"contract ISanityRate[]","name":"sanityRates","type":"address[]"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"contract IERC20","name":"token","type":"address"},{"internalType":"address[]","name":"rebateWallets","type":"address[]"},{"internalType":"uint256[]","name":"rebateBpsPerWallet","type":"uint256[]"},{"internalType":"address","name":"platformWallet","type":"address"},{"internalType":"uint256","name":"platformFee","type":"uint256"},{"internalType":"uint256","name":"networkFee","type":"uint256"}],"name":"handleFees","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[],"name":"knc","outputs":[{"internalType":"contract IERC20","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"kyberProxy","outputs":[{"internalType":"contract IKyberProxy","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"lastBurnBlock","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"readBRRData","outputs":[{"internalType":"uint256","name":"rewardBps","type":"uint256"},{"internalType":"uint256","name":"rebateBps","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"rebatePerWallet","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_burnBps","type":"uint256"},{"internalType":"uint256","name":"_rewardBps","type":"uint256"},{"internalType":"uint256","name":"_rebateBps","type":"uint256"}],"name":"setBRRData","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"contract ISanityRate","name":"_sanityRate","type":"address"},{"internalType":"uint256","name":"_weiToBurn","type":"uint256"}],"name":"setBurnConfigParams","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_daoOperator","type":"address"}],"name":"setDaoOperator","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_feePool","type":"address"}],"name":"setFeePool","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"contract IKyberProxy","name":"_newProxy","type":"address"}],"name":"setKyberProxy","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"totalPayoutBalance","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"weiToBurn","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"stateMutability":"payable","type":"receive"}]

60c0604052671bc16d674ec800006006553480156200001d57600080fd5b506040516200327738038062003277833981810160405260e08110156200004357600080fd5b508051602082015160408301516060840151608085015160a086015160c0909601519495939492939192909190836001600160a01b038116620000c0576040805162461bcd60e51b815260206004820152601060248201526f064616f4f70657261746f7220697320360841b604482015290519081900360640190fd5b60018054600160a01b6001600160a01b03199091166001600160a01b039384161760ff60a01b191617905587166200013f576040805162461bcd60e51b815260206004820152601360248201527f6b796265724e6574776f726b50726f7879203000000000000000000000000000604482015290519081900360640190fd5b6001600160a01b03861662000183576040805162461bcd60e51b815260206004820152600560248201526406b6e6320360dc1b604482015290519081900360640190fd5b84620001d6576040805162461bcd60e51b815260206004820152601460248201527f5f6275726e426c6f636b496e74657276616c2030000000000000000000000000604482015290519081900360640190fd5b6001600160a01b0383166200021e576040805162461bcd60e51b81526020600482015260096024820152680666565506f6f6c20360bc1b604482015290519081900360640190fd5b600280546001600160a01b03199081166001600160a01b038a811691909117909255606088901b6001600160601b03191660805260a087905260038054909116918516919091179055612710620002828383620002fb602090811b6200249417901c565b1115620002c7576040805162461bcd60e51b815260206004820152600e60248201526d426164204252522076616c75657360901b604482015290519081900360640190fd5b6005805461ffff928316620100000263ffff0000199490931661ffff199091161792909216179055506200035d9350505050565b60008282018381101562000356576040805162461bcd60e51b815260206004820152601b60248201527f536166654d6174683a206164646974696f6e206f766572666c6f770000000000604482015290519081900360640190fd5b9392505050565b60805160601c60a051612edf620003986000398061133d528061188f5250806114665280611553528061162752806124565250612edf6000f3fe60806040526004361061018f5760003560e01c806394427da9116100d6578063b7c5ab411161007f578063c6c3f3f911610059578063c6c3f3f9146106bf578063e61387e0146106ff578063f0eeed8114610714576101c9565b8063b7c5ab4114610569578063c01bdf041461066a578063c03e798c146106aa576101c9565b8063a840874f116100b0578063a840874f1461052a578063ae2e933b1461053f578063b45782c714610554576101c9565b806394427da91461049f5780639907672a146104d5578063a636a8a214610515576101c9565b806364354d6511610138578063770ba56111610112578063770ba5611461041e57806380feeef31461044c5780638c9bc20814610461576101c9565b806364354d651461033357806366ab3fe614610373578063692bdfd5146103d8576101c9565b80632e4da25c116101695780632e4da25c1461027757806353fa2eb7146102ad578063579d6b74146102f3576101c9565b806303339513146101ce57806312efe8341461022057806319db222814610235576101c9565b366101c9576040805134815290517f353bcaaf167a6add95a753d39727e3d3beb865129a69a10ed774b0b8996714039181900360200190a1005b600080fd5b3480156101da57600080fd5b5061020e600480360360208110156101f157600080fd5b503573ffffffffffffffffffffffffffffffffffffffff16610729565b60408051918252519081900360200190f35b34801561022c57600080fd5b5061020e61073b565b34801561024157600080fd5b506102756004803603602081101561025857600080fd5b503573ffffffffffffffffffffffffffffffffffffffff16610741565b005b34801561028357600080fd5b5061028c6108c2565b6040805161ffff938416815291909216602082015281519081900390910190f35b3480156102b957600080fd5b5061020e600480360360408110156102d057600080fd5b5073ffffffffffffffffffffffffffffffffffffffff81351690602001356108d6565b3480156102ff57600080fd5b5061020e6004803603602081101561031657600080fd5b503573ffffffffffffffffffffffffffffffffffffffff166108dd565b34801561033f57600080fd5b506102756004803603602081101561035657600080fd5b503573ffffffffffffffffffffffffffffffffffffffff166108ef565b34801561037f57600080fd5b50610388610a70565b60408051602080825283518183015283519192839290830191858101910280838360005b838110156103c45781810151838201526020016103ac565b505050509050019250505060405180910390f35b3480156103e457600080fd5b50610275600480360360408110156103fb57600080fd5b5073ffffffffffffffffffffffffffffffffffffffff8135169060200135610adf565b34801561042a57600080fd5b50610433610db7565b6040805192835260208301919091528051918290030190f35b34801561045857600080fd5b5061020e610dcc565b34801561046d57600080fd5b50610476610dd2565b6040805173ffffffffffffffffffffffffffffffffffffffff9092168252519081900360200190f35b3480156104ab57600080fd5b50610275600480360360608110156104c257600080fd5b5080359060208101359060400135610dee565b3480156104e157600080fd5b5061020e600480360360208110156104f857600080fd5b503573ffffffffffffffffffffffffffffffffffffffff16610fa7565b34801561052157600080fd5b5061020e6112cb565b34801561053657600080fd5b5061020e61175c565b34801561054b57600080fd5b50610476611871565b34801561056057600080fd5b5061020e61188d565b610275600480360360c081101561057f57600080fd5b73ffffffffffffffffffffffffffffffffffffffff82351691908101906040810160208201356401000000008111156105b757600080fd5b8201836020820111156105c957600080fd5b803590602001918460208302840111640100000000831117156105eb57600080fd5b91939092909160208101903564010000000081111561060957600080fd5b82018360208201111561061b57600080fd5b8035906020019184602083028401116401000000008311171561063d57600080fd5b919350915073ffffffffffffffffffffffffffffffffffffffff81351690602081013590604001356118b1565b34801561067657600080fd5b5061020e6004803603602081101561068d57600080fd5b503573ffffffffffffffffffffffffffffffffffffffff16611f86565b3480156106b657600080fd5b5061020e6122aa565b3480156106cb57600080fd5b50610275600480360360208110156106e257600080fd5b503573ffffffffffffffffffffffffffffffffffffffff166122b0565b34801561070b57600080fd5b50610476612454565b34801561072057600080fd5b50610476612478565b60076020526000908152604090205481565b60095481565b60015473ffffffffffffffffffffffffffffffffffffffff1633146107c757604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601060248201527f6f6e6c792064616f4f70657261746f7200000000000000000000000000000000604482015290519081900360640190fd5b73ffffffffffffffffffffffffffffffffffffffff811661084957604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600960248201527f666565506f6f6c20300000000000000000000000000000000000000000000000604482015290519081900360640190fd5b6003805473ffffffffffffffffffffffffffffffffffffffff83167fffffffffffffffffffffffff0000000000000000000000000000000000000000909116811790915560408051918252517f6d1d088acfe4f30d6014f6f693c61c16258f9784a6ed8439b2c59213eecb62959181900360200190a150565b60055461ffff808216916201000090041682565b6000806000fd5b60086020526000908152604090205481565b60015473ffffffffffffffffffffffffffffffffffffffff16331461097557604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601060248201527f6f6e6c792064616f4f70657261746f7200000000000000000000000000000000604482015290519081900360640190fd5b73ffffffffffffffffffffffffffffffffffffffff81166109f757604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600d60248201527f64616f4f70657261746f72203000000000000000000000000000000000000000604482015290519081900360640190fd5b6001805473ffffffffffffffffffffffffffffffffffffffff83167fffffffffffffffffffffffff0000000000000000000000000000000000000000909116811790915560408051918252517fadf9b628cb2a4e665382961f42205fce0577c0bb2c0e31ef9f87f4a35033c6919181900360200190a150565b6060600a805480602002602001604051908101604052809291908181526020018280548015610ad557602002820191906000526020600020905b815473ffffffffffffffffffffffffffffffffffffffff168152600190910190602001808311610aaa575b5050505050905090565b60015473ffffffffffffffffffffffffffffffffffffffff163314610b6557604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601060248201527f6f6e6c792064616f4f70657261746f7200000000000000000000000000000000604482015290519081900360640190fd5b60008111610bd457604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600f60248201527f5f776569546f4275726e20697320300000000000000000000000000000000000604482015290519081900360640190fd5b600a541580610c155750600a600081548110610bec57fe5b60009182526020909120015473ffffffffffffffffffffffffffffffffffffffff838116911614155b15610d5d57600a54610c9657600a80546001810182556000919091527fc65a7bb8d6351c1cf70c95a316cc6a92839c986682d98bc35f958f4883f9d2a80180547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff8416179055610d5d565b600a80600081548110610ca557fe5b6000918252602080832090910154835460018101855593835290822090920180547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff90931692909217909155600a8054849290610d1457fe5b9060005260206000200160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055505b60068190556040805173ffffffffffffffffffffffffffffffffffffffff841681526020810183905281517fe40f97f23269c4682610e9b2522d6d4272ee56f115906d71fcb3da82a860f755929181900390910190a15050565b60055461ffff80821692620100009092041690565b60065481565b60015473ffffffffffffffffffffffffffffffffffffffff1681565b60015473ffffffffffffffffffffffffffffffffffffffff163314610e7457604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601060248201527f6f6e6c792064616f4f70657261746f7200000000000000000000000000000000604482015290519081900360640190fd5b612710610e9782610e8b868663ffffffff61249416565b9063ffffffff61249416565b14610f0357604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600e60248201527f426164204252522076616c756573000000000000000000000000000000000000604482015290519081900360640190fd5b6005805461ffff83811662010000027fffffffffffffffffffffffffffffffffffffffffffffffffffffffff0000ffff9186167fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00009093169290921716179055604080518381526020810183905280820185905290517f7806a23da6d7c83c8caf5e3fc8ec22c30900a5fcf10e266ac158ad3c9e3384c49181900360600190a1505050565b60015460009074010000000000000000000000000000000000000000900460ff1661103357604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601f60248201527f5265656e7472616e637947756172643a207265656e7472616e742063616c6c00604482015290519081900360640190fd5b600180547fffffffffffffffffffffff00ffffffffffffffffffffffffffffffffffffffff16815573ffffffffffffffffffffffffffffffffffffffff8316600090815260076020526040902054116110ed57604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600f60248201527f6e6f2066656520746f20636c61696d0000000000000000000000000000000000604482015290519081900360640190fd5b73ffffffffffffffffffffffffffffffffffffffff821660009081526007602052604090205461112490600163ffffffff61251116565b905080600954101561113257fe5b600954611145908263ffffffff61251116565b60095573ffffffffffffffffffffffffffffffffffffffff8216600081815260076020526040808220600190555190919083908381818185875af1925050503d80600081146111b0576040519150601f19603f3d011682016040523d82523d6000602084013e6111b5565b606091505b505090508061122557604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601c60248201527f706c6174666f726d20666565207472616e73666572206661696c656400000000604482015290519081900360640190fd5b60408051838152905173eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee9173ffffffffffffffffffffffffffffffffffffffff8616917febe3db09f5650582b4782506e0d272262129183570e55fcf8768dd6e91f8c0f69181900360200190a350600180547fffffffffffffffffffffff00ffffffffffffffffffffffffffffffffffffffff1674010000000000000000000000000000000000000000179055919050565b600032331461133b57604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601160248201527f6f6e6c79206e6f6e2d636f6e7472616374000000000000000000000000000000604482015290519081900360640190fd5b7f00000000000000000000000000000000000000000000000000000000000000006004540143116113cd57604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601860248201527f77616974206d6f726520626c6f636b7320746f206275726e0000000000000000604482015290519081900360640190fd5b4360045560095447908110156113df57fe5b60006113f66009548361251190919063ffffffff16565b90506006548111611407578061140b565b6006545b600254604080517f418436bc00000000000000000000000000000000000000000000000000000000815273eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee600482015273ffffffffffffffffffffffffffffffffffffffff7f0000000000000000000000000000000000000000000000000000000000000000811660248301526044820185905260006064830181905260a0608484015260a4830181905292519495509193919092169163418436bc9160e4808301926020929190829003018186803b1580156114db57600080fd5b505afa1580156114ef573d6000803e3d6000fd5b505050506040513d602081101561150557600080fd5b5051905061151281612553565b600254604080517f7a2a045600000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff7f0000000000000000000000000000000000000000000000000000000000000000811660048301526024820185905291519190921691637a2a045691859160448082019260209290919082900301818588803b1580156115b057600080fd5b505af11580156115c4573d6000803e3d6000fd5b50505050506040513d60208110156115db57600080fd5b5051604080517f42966c6800000000000000000000000000000000000000000000000000000000815260048101839052905191955073ffffffffffffffffffffffffffffffffffffffff7f000000000000000000000000000000000000000000000000000000000000000016916342966c68916024808201926020929091908290030181600087803b15801561167057600080fd5b505af1158015611684573d6000803e3d6000fd5b505050506040513d602081101561169a57600080fd5b505161170757604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600f60248201527f6b6e63206275726e206661696c65640000000000000000000000000000000000604482015290519081900360640190fd5b6040805185815260208101849052815173eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee927fa0fcef56e2b45fcbeb91d5e629ef6b2b6e982d0768f02d1232610315cd23ea10928290030190a25050505b90565b600a54600090158015906117b65750600073ffffffffffffffffffffffffffffffffffffffff16600a60008154811061179157fe5b60009182526020909120015473ffffffffffffffffffffffffffffffffffffffff1614155b1561186b57600a6000815481106117c957fe5b60009182526020918290200154604080517f50d25bcd000000000000000000000000000000000000000000000000000000008152905173ffffffffffffffffffffffffffffffffffffffff909216926350d25bcd92600480840193829003018186803b15801561183857600080fd5b505afa15801561184c573d6000803e3d6000fd5b505050506040513d602081101561186257600080fd5b50519050611759565b50600090565b60035473ffffffffffffffffffffffffffffffffffffffff1681565b7f000000000000000000000000000000000000000000000000000000000000000081565b60015474010000000000000000000000000000000000000000900460ff1661193a57604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601f60248201527f5265656e7472616e637947756172643a207265656e7472616e742063616c6c00604482015290519081900360640190fd5b600180547fffffffffffffffffffffff00ffffffffffffffffffffffffffffffffffffffff16905573ffffffffffffffffffffffffffffffffffffffff881673eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee146119fa57604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600d60248201527f746f6b656e206e6f742065746800000000000000000000000000000000000000604482015290519081900360640190fd5b611a0a828263ffffffff61249416565b3414611a7757604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601760248201527f6d73672e76616c756520213d20746f74616c2066656573000000000000000000604482015290519081900360640190fd5b73ffffffffffffffffffffffffffffffffffffffff8316600090815260076020526040902054611aad908363ffffffff61249416565b73ffffffffffffffffffffffffffffffffffffffff841660009081526007602052604090205580611c4057600954611aeb908363ffffffff61249416565b6009819055508273ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1673eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee73ffffffffffffffffffffffffffffffffffffffff167fc207a63c18c4070ce1e33e5fcc02efb09ac984caa6a2046e2b1d2811723846f1856000808d8d8d8d60006040518089815260200188815260200187815260200180602001806020018481526020018381038352888882818152602001925060200280828437600083820152601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0169091018481038352868152602090810191508790870280828437600083820152604051601f9091017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0169092018290039c50909a5050505050505050505050a4611f3d565b611c48612e16565b611c518261299a565b6020808401829052918352604080518a840281810185019092528a8152611cc69390918c918c91829185019084908082843760009201919091525050604080516020808d0282810182019093528c82529093508c92508b9182918501908490808284376000920191909152506129e792505050565b604082018190528151611cf19190611ce590859063ffffffff61251116565b9063ffffffff61251116565b60608201526040810151600954611d139190610e8b908663ffffffff61249416565b600955600354815160405160009273ffffffffffffffffffffffffffffffffffffffff1691908381818185875af1925050503d8060008114611d71576040519150601f19603f3d011682016040523d82523d6000602084013e611d76565b606091505b5050905080611de657604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600f60248201527f73656e6420666565206661696c65640000000000000000000000000000000000604482015290519081900360640190fd5b8473ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1673eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee73ffffffffffffffffffffffffffffffffffffffff167fc207a63c18c4070ce1e33e5fcc02efb09ac984caa6a2046e2b1d2811723846f187866000015187604001518f8f8f8f8c606001516040518089815260200188815260200187815260200180602001806020018481526020018381038352888882818152602001925060200280828437600083820152601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0169091018481038352868152602090810191508790870280828437600083820152604051601f9091017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0169092018290039c50909a5050505050505050505050a450505b5050600180547fffffffffffffffffffffff00ffffffffffffffffffffffffffffffffffffffff1674010000000000000000000000000000000000000000179055505050505050565b60015460009074010000000000000000000000000000000000000000900460ff1661201257604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601f60248201527f5265656e7472616e637947756172643a207265656e7472616e742063616c6c00604482015290519081900360640190fd5b600180547fffffffffffffffffffffff00ffffffffffffffffffffffffffffffffffffffff16815573ffffffffffffffffffffffffffffffffffffffff8316600090815260086020526040902054116120cc57604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601260248201527f6e6f2072656261746520746f20636c61696d0000000000000000000000000000604482015290519081900360640190fd5b73ffffffffffffffffffffffffffffffffffffffff821660009081526008602052604090205461210390600163ffffffff61251116565b905080600954101561211157fe5b600954612124908263ffffffff61251116565b60095573ffffffffffffffffffffffffffffffffffffffff8216600081815260086020526040808220600190555190919083908381818185875af1925050503d806000811461218f576040519150601f19603f3d011682016040523d82523d6000602084013e612194565b606091505b505090508061220457604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601660248201527f726562617465207472616e73666572206661696c656400000000000000000000604482015290519081900360640190fd5b60408051838152905173eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee9173ffffffffffffffffffffffffffffffffffffffff8616917fb5ec5e03662403108373ab6431d3e834cb1011fca164541aef315fc7dea7b3b69181900360200190a350600180547fffffffffffffffffffffff00ffffffffffffffffffffffffffffffffffffffff1674010000000000000000000000000000000000000000179055919050565b60045481565b60015473ffffffffffffffffffffffffffffffffffffffff16331461233657604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601060248201527f6f6e6c792064616f4f70657261746f7200000000000000000000000000000000604482015290519081900360640190fd5b73ffffffffffffffffffffffffffffffffffffffff81166123b857604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601360248201527f6b796265724e6574776f726b50726f7879203000000000000000000000000000604482015290519081900360640190fd5b60025473ffffffffffffffffffffffffffffffffffffffff828116911614612451576002805473ffffffffffffffffffffffffffffffffffffffff83167fffffffffffffffffffffffff0000000000000000000000000000000000000000909116811790915560408051918252517f8457f9bd0d13488a6c265af376d291f3c6bd2311d9e8dee5671d4169ca6e0ae09181900360200190a15b50565b7f000000000000000000000000000000000000000000000000000000000000000081565b60025473ffffffffffffffffffffffffffffffffffffffff1681565b60008282018381101561250857604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601b60248201527f536166654d6174683a206164646974696f6e206f766572666c6f770000000000604482015290519081900360640190fd5b90505b92915050565b600061250883836040518060400160405280601e81526020017f536166654d6174683a207375627472616374696f6e206f766572666c6f770000815250612c36565b6a084595161401484a0000008111156125cd57604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601b60248201527f657468546f4b6e632072617465206f7574206f6620626f756e64730000000000604482015290519081900360640190fd5b6000811161263c57604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601260248201527f657468546f4b6e63207261746520697320300000000000000000000000000000604482015290519081900360640190fd5b600a546126aa57604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601760248201527f6e6f2073616e697479207261746520636f6e7472616374000000000000000000604482015290519081900360640190fd5b600073ffffffffffffffffffffffffffffffffffffffff16600a6000815481106126d057fe5b60009182526020909120015473ffffffffffffffffffffffffffffffffffffffff161415612749576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401808060200182810382526026815260200180612e846026913960400191505060405180910390fd5b6000600a60008154811061275957fe5b60009182526020918290200154604080517f50d25bcd000000000000000000000000000000000000000000000000000000008152905173ffffffffffffffffffffffffffffffffffffffff909216926350d25bcd92600480840193829003018186803b1580156127c857600080fd5b505afa1580156127dc573d6000803e3d6000fd5b505050506040513d60208110156127f257600080fd5b505190508061286257604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601060248201527f73616e6974792072617465206973203000000000000000000000000000000000604482015290519081900360640190fd5b6a084595161401484a0000008111156128dc57604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601960248201527f73616e6974792072617465206f7574206f6620626f756e647300000000000000604482015290519081900360640190fd5b6000612906826128fa670de0b6b3a76400008063ffffffff612ce716565b9063ffffffff612d5a16565b905061292c61291f6127106103e863ffffffff61251116565b829063ffffffff612ce716565b61293e8461271063ffffffff612ce716565b1015612995576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401808060200182810382526024815260200180612e3f6024913960400191505060405180910390fd5b505050565b600554600090819061ffff80821691620100009004166129c66127106128fa878463ffffffff612ce716565b92506129de6127106128fa878563ffffffff612ce716565b93505050915091565b60008080805b8551811015612bbb57600073ffffffffffffffffffffffffffffffffffffffff16868281518110612a1a57fe5b602002602001015173ffffffffffffffffffffffffffffffffffffffff161415612aa557604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601760248201527f7265626174652077616c6c657420616464726573732030000000000000000000604482015290519081900360640190fd5b612ad16127106128fa878481518110612aba57fe5b60200260200101518a612ce790919063ffffffff16565b9150612b388260086000898581518110612ae757fe5b602002602001015173ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205461249490919063ffffffff16565b60086000888481518110612b4857fe5b60209081029190910181015173ffffffffffffffffffffffffffffffffffffffff16825281019190915260400160002055612b89848363ffffffff61249416565b9350612bb1858281518110612b9a57fe5b60200260200101518461249490919063ffffffff16565b92506001016129ed565b50612710821115612c2d57604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601560248201527f746f74616c526562617465427073203e20313030250000000000000000000000604482015290519081900360640190fd5b50509392505050565b60008184841115612cdf576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825283818151815260200191508051906020019080838360005b83811015612ca4578181015183820152602001612c8c565b50505050905090810190601f168015612cd15780820380516001836020036101000a031916815260200191505b509250505060405180910390fd5b505050900390565b600082612cf65750600061250b565b82820282848281612d0357fe5b0414612508576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401808060200182810382526021815260200180612e636021913960400191505060405180910390fd5b600061250883836040518060400160405280601a81526020017f536166654d6174683a206469766973696f6e206279207a65726f00000000000081525060008183612e00576040517f08c379a0000000000000000000000000000000000000000000000000000000008152602060048201818152835160248401528351909283926044909101919085019080838360008315612ca4578181015183820152602001612c8c565b506000838581612e0c57fe5b0495945050505050565b604051806080016040528060008152602001600081526020016000815260200160008152509056fe6b796265724e6574776f726b2065746820746f206b6e63207261746520746f6f206c6f77536166654d6174683a206d756c7469706c69636174696f6e206f766572666c6f7773616e6974792072617465206973203078302c206275726e696e6720697320626c6f636b6564a26469706673582212206c2983954afdb0c49f4334d3280313d0999ea1b6fc5b40734cf6bae62e7f52ef64736f6c634300060600330000000000000000000000009aab3f75489902f3a48495025729a0af77d4b11e000000000000000000000000defa4e8a7bcba345f687a2f1456f5edd9ce97202000000000000000000000000000000000000000000000000000000000000001e000000000000000000000000e6a7338cba0a1070adfb22c071152996054547130000000000000000000000000e590bb5f02a0c38888bffb45dee050b8fb60bda0000000000000000000000000000000000000000000000000000000000001c6b0000000000000000000000000000000000000000000000000000000000000900

Deployed Bytecode

0x60806040526004361061018f5760003560e01c806394427da9116100d6578063b7c5ab411161007f578063c6c3f3f911610059578063c6c3f3f9146106bf578063e61387e0146106ff578063f0eeed8114610714576101c9565b8063b7c5ab4114610569578063c01bdf041461066a578063c03e798c146106aa576101c9565b8063a840874f116100b0578063a840874f1461052a578063ae2e933b1461053f578063b45782c714610554576101c9565b806394427da91461049f5780639907672a146104d5578063a636a8a214610515576101c9565b806364354d6511610138578063770ba56111610112578063770ba5611461041e57806380feeef31461044c5780638c9bc20814610461576101c9565b806364354d651461033357806366ab3fe614610373578063692bdfd5146103d8576101c9565b80632e4da25c116101695780632e4da25c1461027757806353fa2eb7146102ad578063579d6b74146102f3576101c9565b806303339513146101ce57806312efe8341461022057806319db222814610235576101c9565b366101c9576040805134815290517f353bcaaf167a6add95a753d39727e3d3beb865129a69a10ed774b0b8996714039181900360200190a1005b600080fd5b3480156101da57600080fd5b5061020e600480360360208110156101f157600080fd5b503573ffffffffffffffffffffffffffffffffffffffff16610729565b60408051918252519081900360200190f35b34801561022c57600080fd5b5061020e61073b565b34801561024157600080fd5b506102756004803603602081101561025857600080fd5b503573ffffffffffffffffffffffffffffffffffffffff16610741565b005b34801561028357600080fd5b5061028c6108c2565b6040805161ffff938416815291909216602082015281519081900390910190f35b3480156102b957600080fd5b5061020e600480360360408110156102d057600080fd5b5073ffffffffffffffffffffffffffffffffffffffff81351690602001356108d6565b3480156102ff57600080fd5b5061020e6004803603602081101561031657600080fd5b503573ffffffffffffffffffffffffffffffffffffffff166108dd565b34801561033f57600080fd5b506102756004803603602081101561035657600080fd5b503573ffffffffffffffffffffffffffffffffffffffff166108ef565b34801561037f57600080fd5b50610388610a70565b60408051602080825283518183015283519192839290830191858101910280838360005b838110156103c45781810151838201526020016103ac565b505050509050019250505060405180910390f35b3480156103e457600080fd5b50610275600480360360408110156103fb57600080fd5b5073ffffffffffffffffffffffffffffffffffffffff8135169060200135610adf565b34801561042a57600080fd5b50610433610db7565b6040805192835260208301919091528051918290030190f35b34801561045857600080fd5b5061020e610dcc565b34801561046d57600080fd5b50610476610dd2565b6040805173ffffffffffffffffffffffffffffffffffffffff9092168252519081900360200190f35b3480156104ab57600080fd5b50610275600480360360608110156104c257600080fd5b5080359060208101359060400135610dee565b3480156104e157600080fd5b5061020e600480360360208110156104f857600080fd5b503573ffffffffffffffffffffffffffffffffffffffff16610fa7565b34801561052157600080fd5b5061020e6112cb565b34801561053657600080fd5b5061020e61175c565b34801561054b57600080fd5b50610476611871565b34801561056057600080fd5b5061020e61188d565b610275600480360360c081101561057f57600080fd5b73ffffffffffffffffffffffffffffffffffffffff82351691908101906040810160208201356401000000008111156105b757600080fd5b8201836020820111156105c957600080fd5b803590602001918460208302840111640100000000831117156105eb57600080fd5b91939092909160208101903564010000000081111561060957600080fd5b82018360208201111561061b57600080fd5b8035906020019184602083028401116401000000008311171561063d57600080fd5b919350915073ffffffffffffffffffffffffffffffffffffffff81351690602081013590604001356118b1565b34801561067657600080fd5b5061020e6004803603602081101561068d57600080fd5b503573ffffffffffffffffffffffffffffffffffffffff16611f86565b3480156106b657600080fd5b5061020e6122aa565b3480156106cb57600080fd5b50610275600480360360208110156106e257600080fd5b503573ffffffffffffffffffffffffffffffffffffffff166122b0565b34801561070b57600080fd5b50610476612454565b34801561072057600080fd5b50610476612478565b60076020526000908152604090205481565b60095481565b60015473ffffffffffffffffffffffffffffffffffffffff1633146107c757604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601060248201527f6f6e6c792064616f4f70657261746f7200000000000000000000000000000000604482015290519081900360640190fd5b73ffffffffffffffffffffffffffffffffffffffff811661084957604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600960248201527f666565506f6f6c20300000000000000000000000000000000000000000000000604482015290519081900360640190fd5b6003805473ffffffffffffffffffffffffffffffffffffffff83167fffffffffffffffffffffffff0000000000000000000000000000000000000000909116811790915560408051918252517f6d1d088acfe4f30d6014f6f693c61c16258f9784a6ed8439b2c59213eecb62959181900360200190a150565b60055461ffff808216916201000090041682565b6000806000fd5b60086020526000908152604090205481565b60015473ffffffffffffffffffffffffffffffffffffffff16331461097557604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601060248201527f6f6e6c792064616f4f70657261746f7200000000000000000000000000000000604482015290519081900360640190fd5b73ffffffffffffffffffffffffffffffffffffffff81166109f757604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600d60248201527f64616f4f70657261746f72203000000000000000000000000000000000000000604482015290519081900360640190fd5b6001805473ffffffffffffffffffffffffffffffffffffffff83167fffffffffffffffffffffffff0000000000000000000000000000000000000000909116811790915560408051918252517fadf9b628cb2a4e665382961f42205fce0577c0bb2c0e31ef9f87f4a35033c6919181900360200190a150565b6060600a805480602002602001604051908101604052809291908181526020018280548015610ad557602002820191906000526020600020905b815473ffffffffffffffffffffffffffffffffffffffff168152600190910190602001808311610aaa575b5050505050905090565b60015473ffffffffffffffffffffffffffffffffffffffff163314610b6557604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601060248201527f6f6e6c792064616f4f70657261746f7200000000000000000000000000000000604482015290519081900360640190fd5b60008111610bd457604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600f60248201527f5f776569546f4275726e20697320300000000000000000000000000000000000604482015290519081900360640190fd5b600a541580610c155750600a600081548110610bec57fe5b60009182526020909120015473ffffffffffffffffffffffffffffffffffffffff838116911614155b15610d5d57600a54610c9657600a80546001810182556000919091527fc65a7bb8d6351c1cf70c95a316cc6a92839c986682d98bc35f958f4883f9d2a80180547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff8416179055610d5d565b600a80600081548110610ca557fe5b6000918252602080832090910154835460018101855593835290822090920180547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff90931692909217909155600a8054849290610d1457fe5b9060005260206000200160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055505b60068190556040805173ffffffffffffffffffffffffffffffffffffffff841681526020810183905281517fe40f97f23269c4682610e9b2522d6d4272ee56f115906d71fcb3da82a860f755929181900390910190a15050565b60055461ffff80821692620100009092041690565b60065481565b60015473ffffffffffffffffffffffffffffffffffffffff1681565b60015473ffffffffffffffffffffffffffffffffffffffff163314610e7457604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601060248201527f6f6e6c792064616f4f70657261746f7200000000000000000000000000000000604482015290519081900360640190fd5b612710610e9782610e8b868663ffffffff61249416565b9063ffffffff61249416565b14610f0357604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600e60248201527f426164204252522076616c756573000000000000000000000000000000000000604482015290519081900360640190fd5b6005805461ffff83811662010000027fffffffffffffffffffffffffffffffffffffffffffffffffffffffff0000ffff9186167fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00009093169290921716179055604080518381526020810183905280820185905290517f7806a23da6d7c83c8caf5e3fc8ec22c30900a5fcf10e266ac158ad3c9e3384c49181900360600190a1505050565b60015460009074010000000000000000000000000000000000000000900460ff1661103357604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601f60248201527f5265656e7472616e637947756172643a207265656e7472616e742063616c6c00604482015290519081900360640190fd5b600180547fffffffffffffffffffffff00ffffffffffffffffffffffffffffffffffffffff16815573ffffffffffffffffffffffffffffffffffffffff8316600090815260076020526040902054116110ed57604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600f60248201527f6e6f2066656520746f20636c61696d0000000000000000000000000000000000604482015290519081900360640190fd5b73ffffffffffffffffffffffffffffffffffffffff821660009081526007602052604090205461112490600163ffffffff61251116565b905080600954101561113257fe5b600954611145908263ffffffff61251116565b60095573ffffffffffffffffffffffffffffffffffffffff8216600081815260076020526040808220600190555190919083908381818185875af1925050503d80600081146111b0576040519150601f19603f3d011682016040523d82523d6000602084013e6111b5565b606091505b505090508061122557604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601c60248201527f706c6174666f726d20666565207472616e73666572206661696c656400000000604482015290519081900360640190fd5b60408051838152905173eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee9173ffffffffffffffffffffffffffffffffffffffff8616917febe3db09f5650582b4782506e0d272262129183570e55fcf8768dd6e91f8c0f69181900360200190a350600180547fffffffffffffffffffffff00ffffffffffffffffffffffffffffffffffffffff1674010000000000000000000000000000000000000000179055919050565b600032331461133b57604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601160248201527f6f6e6c79206e6f6e2d636f6e7472616374000000000000000000000000000000604482015290519081900360640190fd5b7f000000000000000000000000000000000000000000000000000000000000001e6004540143116113cd57604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601860248201527f77616974206d6f726520626c6f636b7320746f206275726e0000000000000000604482015290519081900360640190fd5b4360045560095447908110156113df57fe5b60006113f66009548361251190919063ffffffff16565b90506006548111611407578061140b565b6006545b600254604080517f418436bc00000000000000000000000000000000000000000000000000000000815273eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee600482015273ffffffffffffffffffffffffffffffffffffffff7f000000000000000000000000defa4e8a7bcba345f687a2f1456f5edd9ce97202811660248301526044820185905260006064830181905260a0608484015260a4830181905292519495509193919092169163418436bc9160e4808301926020929190829003018186803b1580156114db57600080fd5b505afa1580156114ef573d6000803e3d6000fd5b505050506040513d602081101561150557600080fd5b5051905061151281612553565b600254604080517f7a2a045600000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff7f000000000000000000000000defa4e8a7bcba345f687a2f1456f5edd9ce97202811660048301526024820185905291519190921691637a2a045691859160448082019260209290919082900301818588803b1580156115b057600080fd5b505af11580156115c4573d6000803e3d6000fd5b50505050506040513d60208110156115db57600080fd5b5051604080517f42966c6800000000000000000000000000000000000000000000000000000000815260048101839052905191955073ffffffffffffffffffffffffffffffffffffffff7f000000000000000000000000defa4e8a7bcba345f687a2f1456f5edd9ce9720216916342966c68916024808201926020929091908290030181600087803b15801561167057600080fd5b505af1158015611684573d6000803e3d6000fd5b505050506040513d602081101561169a57600080fd5b505161170757604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600f60248201527f6b6e63206275726e206661696c65640000000000000000000000000000000000604482015290519081900360640190fd5b6040805185815260208101849052815173eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee927fa0fcef56e2b45fcbeb91d5e629ef6b2b6e982d0768f02d1232610315cd23ea10928290030190a25050505b90565b600a54600090158015906117b65750600073ffffffffffffffffffffffffffffffffffffffff16600a60008154811061179157fe5b60009182526020909120015473ffffffffffffffffffffffffffffffffffffffff1614155b1561186b57600a6000815481106117c957fe5b60009182526020918290200154604080517f50d25bcd000000000000000000000000000000000000000000000000000000008152905173ffffffffffffffffffffffffffffffffffffffff909216926350d25bcd92600480840193829003018186803b15801561183857600080fd5b505afa15801561184c573d6000803e3d6000fd5b505050506040513d602081101561186257600080fd5b50519050611759565b50600090565b60035473ffffffffffffffffffffffffffffffffffffffff1681565b7f000000000000000000000000000000000000000000000000000000000000001e81565b60015474010000000000000000000000000000000000000000900460ff1661193a57604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601f60248201527f5265656e7472616e637947756172643a207265656e7472616e742063616c6c00604482015290519081900360640190fd5b600180547fffffffffffffffffffffff00ffffffffffffffffffffffffffffffffffffffff16905573ffffffffffffffffffffffffffffffffffffffff881673eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee146119fa57604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600d60248201527f746f6b656e206e6f742065746800000000000000000000000000000000000000604482015290519081900360640190fd5b611a0a828263ffffffff61249416565b3414611a7757604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601760248201527f6d73672e76616c756520213d20746f74616c2066656573000000000000000000604482015290519081900360640190fd5b73ffffffffffffffffffffffffffffffffffffffff8316600090815260076020526040902054611aad908363ffffffff61249416565b73ffffffffffffffffffffffffffffffffffffffff841660009081526007602052604090205580611c4057600954611aeb908363ffffffff61249416565b6009819055508273ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1673eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee73ffffffffffffffffffffffffffffffffffffffff167fc207a63c18c4070ce1e33e5fcc02efb09ac984caa6a2046e2b1d2811723846f1856000808d8d8d8d60006040518089815260200188815260200187815260200180602001806020018481526020018381038352888882818152602001925060200280828437600083820152601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0169091018481038352868152602090810191508790870280828437600083820152604051601f9091017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0169092018290039c50909a5050505050505050505050a4611f3d565b611c48612e16565b611c518261299a565b6020808401829052918352604080518a840281810185019092528a8152611cc69390918c918c91829185019084908082843760009201919091525050604080516020808d0282810182019093528c82529093508c92508b9182918501908490808284376000920191909152506129e792505050565b604082018190528151611cf19190611ce590859063ffffffff61251116565b9063ffffffff61251116565b60608201526040810151600954611d139190610e8b908663ffffffff61249416565b600955600354815160405160009273ffffffffffffffffffffffffffffffffffffffff1691908381818185875af1925050503d8060008114611d71576040519150601f19603f3d011682016040523d82523d6000602084013e611d76565b606091505b5050905080611de657604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600f60248201527f73656e6420666565206661696c65640000000000000000000000000000000000604482015290519081900360640190fd5b8473ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1673eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee73ffffffffffffffffffffffffffffffffffffffff167fc207a63c18c4070ce1e33e5fcc02efb09ac984caa6a2046e2b1d2811723846f187866000015187604001518f8f8f8f8c606001516040518089815260200188815260200187815260200180602001806020018481526020018381038352888882818152602001925060200280828437600083820152601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0169091018481038352868152602090810191508790870280828437600083820152604051601f9091017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0169092018290039c50909a5050505050505050505050a450505b5050600180547fffffffffffffffffffffff00ffffffffffffffffffffffffffffffffffffffff1674010000000000000000000000000000000000000000179055505050505050565b60015460009074010000000000000000000000000000000000000000900460ff1661201257604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601f60248201527f5265656e7472616e637947756172643a207265656e7472616e742063616c6c00604482015290519081900360640190fd5b600180547fffffffffffffffffffffff00ffffffffffffffffffffffffffffffffffffffff16815573ffffffffffffffffffffffffffffffffffffffff8316600090815260086020526040902054116120cc57604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601260248201527f6e6f2072656261746520746f20636c61696d0000000000000000000000000000604482015290519081900360640190fd5b73ffffffffffffffffffffffffffffffffffffffff821660009081526008602052604090205461210390600163ffffffff61251116565b905080600954101561211157fe5b600954612124908263ffffffff61251116565b60095573ffffffffffffffffffffffffffffffffffffffff8216600081815260086020526040808220600190555190919083908381818185875af1925050503d806000811461218f576040519150601f19603f3d011682016040523d82523d6000602084013e612194565b606091505b505090508061220457604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601660248201527f726562617465207472616e73666572206661696c656400000000000000000000604482015290519081900360640190fd5b60408051838152905173eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee9173ffffffffffffffffffffffffffffffffffffffff8616917fb5ec5e03662403108373ab6431d3e834cb1011fca164541aef315fc7dea7b3b69181900360200190a350600180547fffffffffffffffffffffff00ffffffffffffffffffffffffffffffffffffffff1674010000000000000000000000000000000000000000179055919050565b60045481565b60015473ffffffffffffffffffffffffffffffffffffffff16331461233657604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601060248201527f6f6e6c792064616f4f70657261746f7200000000000000000000000000000000604482015290519081900360640190fd5b73ffffffffffffffffffffffffffffffffffffffff81166123b857604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601360248201527f6b796265724e6574776f726b50726f7879203000000000000000000000000000604482015290519081900360640190fd5b60025473ffffffffffffffffffffffffffffffffffffffff828116911614612451576002805473ffffffffffffffffffffffffffffffffffffffff83167fffffffffffffffffffffffff0000000000000000000000000000000000000000909116811790915560408051918252517f8457f9bd0d13488a6c265af376d291f3c6bd2311d9e8dee5671d4169ca6e0ae09181900360200190a15b50565b7f000000000000000000000000defa4e8a7bcba345f687a2f1456f5edd9ce9720281565b60025473ffffffffffffffffffffffffffffffffffffffff1681565b60008282018381101561250857604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601b60248201527f536166654d6174683a206164646974696f6e206f766572666c6f770000000000604482015290519081900360640190fd5b90505b92915050565b600061250883836040518060400160405280601e81526020017f536166654d6174683a207375627472616374696f6e206f766572666c6f770000815250612c36565b6a084595161401484a0000008111156125cd57604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601b60248201527f657468546f4b6e632072617465206f7574206f6620626f756e64730000000000604482015290519081900360640190fd5b6000811161263c57604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601260248201527f657468546f4b6e63207261746520697320300000000000000000000000000000604482015290519081900360640190fd5b600a546126aa57604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601760248201527f6e6f2073616e697479207261746520636f6e7472616374000000000000000000604482015290519081900360640190fd5b600073ffffffffffffffffffffffffffffffffffffffff16600a6000815481106126d057fe5b60009182526020909120015473ffffffffffffffffffffffffffffffffffffffff161415612749576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401808060200182810382526026815260200180612e846026913960400191505060405180910390fd5b6000600a60008154811061275957fe5b60009182526020918290200154604080517f50d25bcd000000000000000000000000000000000000000000000000000000008152905173ffffffffffffffffffffffffffffffffffffffff909216926350d25bcd92600480840193829003018186803b1580156127c857600080fd5b505afa1580156127dc573d6000803e3d6000fd5b505050506040513d60208110156127f257600080fd5b505190508061286257604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601060248201527f73616e6974792072617465206973203000000000000000000000000000000000604482015290519081900360640190fd5b6a084595161401484a0000008111156128dc57604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601960248201527f73616e6974792072617465206f7574206f6620626f756e647300000000000000604482015290519081900360640190fd5b6000612906826128fa670de0b6b3a76400008063ffffffff612ce716565b9063ffffffff612d5a16565b905061292c61291f6127106103e863ffffffff61251116565b829063ffffffff612ce716565b61293e8461271063ffffffff612ce716565b1015612995576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401808060200182810382526024815260200180612e3f6024913960400191505060405180910390fd5b505050565b600554600090819061ffff80821691620100009004166129c66127106128fa878463ffffffff612ce716565b92506129de6127106128fa878563ffffffff612ce716565b93505050915091565b60008080805b8551811015612bbb57600073ffffffffffffffffffffffffffffffffffffffff16868281518110612a1a57fe5b602002602001015173ffffffffffffffffffffffffffffffffffffffff161415612aa557604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601760248201527f7265626174652077616c6c657420616464726573732030000000000000000000604482015290519081900360640190fd5b612ad16127106128fa878481518110612aba57fe5b60200260200101518a612ce790919063ffffffff16565b9150612b388260086000898581518110612ae757fe5b602002602001015173ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205461249490919063ffffffff16565b60086000888481518110612b4857fe5b60209081029190910181015173ffffffffffffffffffffffffffffffffffffffff16825281019190915260400160002055612b89848363ffffffff61249416565b9350612bb1858281518110612b9a57fe5b60200260200101518461249490919063ffffffff16565b92506001016129ed565b50612710821115612c2d57604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601560248201527f746f74616c526562617465427073203e20313030250000000000000000000000604482015290519081900360640190fd5b50509392505050565b60008184841115612cdf576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825283818151815260200191508051906020019080838360005b83811015612ca4578181015183820152602001612c8c565b50505050905090810190601f168015612cd15780820380516001836020036101000a031916815260200191505b509250505060405180910390fd5b505050900390565b600082612cf65750600061250b565b82820282848281612d0357fe5b0414612508576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401808060200182810382526021815260200180612e636021913960400191505060405180910390fd5b600061250883836040518060400160405280601a81526020017f536166654d6174683a206469766973696f6e206279207a65726f00000000000081525060008183612e00576040517f08c379a0000000000000000000000000000000000000000000000000000000008152602060048201818152835160248401528351909283926044909101919085019080838360008315612ca4578181015183820152602001612c8c565b506000838581612e0c57fe5b0495945050505050565b604051806080016040528060008152602001600081526020016000815260200160008152509056fe6b796265724e6574776f726b2065746820746f206b6e63207261746520746f6f206c6f77536166654d6174683a206d756c7469706c69636174696f6e206f766572666c6f7773616e6974792072617465206973203078302c206275726e696e6720697320626c6f636b6564a26469706673582212206c2983954afdb0c49f4334d3280313d0999ea1b6fc5b40734cf6bae62e7f52ef64736f6c63430006060033

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

0000000000000000000000009aab3f75489902f3a48495025729a0af77d4b11e000000000000000000000000defa4e8a7bcba345f687a2f1456f5edd9ce97202000000000000000000000000000000000000000000000000000000000000001e000000000000000000000000e6a7338cba0a1070adfb22c071152996054547130000000000000000000000000e590bb5f02a0c38888bffb45dee050b8fb60bda0000000000000000000000000000000000000000000000000000000000001c6b0000000000000000000000000000000000000000000000000000000000000900

-----Decoded View---------------
Arg [0] : _kyberProxy (address): 0x9AAb3f75489902f3a48495025729a0AF77d4b11e
Arg [1] : _knc (address): 0xdeFA4e8a7bcBA345F687a2f1456F5Edd9CE97202
Arg [2] : _burnBlockInterval (uint256): 30
Arg [3] : _daoOperator (address): 0xE6A7338cba0A1070AdfB22c07115299605454713
Arg [4] : _feePool (address): 0x0E590bB5F02A0c38888bFFb45DeE050b8fB60Bda
Arg [5] : _rewardBps (uint256): 7275
Arg [6] : _rebateBps (uint256): 2304

-----Encoded View---------------
7 Constructor Arguments found :
Arg [0] : 0000000000000000000000009aab3f75489902f3a48495025729a0af77d4b11e
Arg [1] : 000000000000000000000000defa4e8a7bcba345f687a2f1456f5edd9ce97202
Arg [2] : 000000000000000000000000000000000000000000000000000000000000001e
Arg [3] : 000000000000000000000000e6a7338cba0a1070adfb22c07115299605454713
Arg [4] : 0000000000000000000000000e590bb5f02a0c38888bffb45dee050b8fb60bda
Arg [5] : 0000000000000000000000000000000000000000000000000000000000001c6b
Arg [6] : 0000000000000000000000000000000000000000000000000000000000000900


Block Transaction Difficulty Gas Used Reward
View All Blocks Produced

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

Validator Index Block Amount
View All Withdrawals

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

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