ETH Price: $2,088.30 (-1.72%)

Contract

0xAa448eFF88B1E752D50b87220B543d79eac15a0E
 

More Info

Private Name Tags

Multichain Info

No addresses found
Transaction Hash
Method
Block
From
To
Withdraw133051492021-09-27 2:15:271628 days ago1632708927IN
0xAa448eFF...9eac15a0E
0 ETH0.0070997762.7
Withdraw133028492021-09-26 17:50:541629 days ago1632678654IN
0xAa448eFF...9eac15a0E
0 ETH0.0031643247
Withdraw133007182021-09-26 9:55:131629 days ago1632650113IN
0xAa448eFF...9eac15a0E
0 ETH0.00630859102
Transfer133007172021-09-26 9:54:301629 days ago1632650070IN
0xAa448eFF...9eac15a0E
153.906891 ETH0.00256477114
Withdraw133007132021-09-26 9:53:161629 days ago1632649996IN
0xAa448eFF...9eac15a0E
0 ETH0.0050880285.8
Transfer133007042021-09-26 9:51:561629 days ago1632649916IN
0xAa448eFF...9eac15a0E
171.569222 ETH0.00256477114
Withdraw133006982021-09-26 9:50:551629 days ago1632649855IN
0xAa448eFF...9eac15a0E
0 ETH0.0062524896
Withdraw133006982021-09-26 9:50:551629 days ago1632649855IN
0xAa448eFF...9eac15a0E
0 ETH0.007579196
Transfer133006932021-09-26 9:49:471629 days ago1632649787IN
0xAa448eFF...9eac15a0E
198.430337 ETH0.0021148194
Withdraw133006922021-09-26 9:48:571629 days ago1632649737IN
0xAa448eFF...9eac15a0E
0 ETH0.00773178101.2
Withdraw133005632021-09-26 9:18:501629 days ago1632647930IN
0xAa448eFF...9eac15a0E
0 ETH0.0057521997
Withdraw132999042021-09-26 6:42:431629 days ago1632638563IN
0xAa448eFF...9eac15a0E
0 ETH0.0054352348
Transfer132991612021-09-26 3:58:261629 days ago1632628706IN
0xAa448eFF...9eac15a0E
168.175375 ETH0.0014623765
Withdraw132989642021-09-26 3:07:411629 days ago1632625661IN
0xAa448eFF...9eac15a0E
0 ETH0.0044211456
Withdraw132939082021-09-25 8:36:141630 days ago1632558974IN
0xAa448eFF...9eac15a0E
0 ETH0.0023642136.3
Withdraw132926682021-09-25 4:00:591630 days ago1632542459IN
0xAa448eFF...9eac15a0E
0 ETH0.0023568335
Withdraw132880052021-09-24 10:37:361631 days ago1632479856IN
0xAa448eFF...9eac15a0E
0 ETH0.0051169276
Withdraw132819262021-09-23 12:13:521632 days ago1632399232IN
0xAa448eFF...9eac15a0E
0 ETH0.0036295153.9
Withdraw132805952021-09-23 7:20:001632 days ago1632381600IN
0xAa448eFF...9eac15a0E
0 ETH0.0045076559
Withdraw132801922021-09-23 5:48:341632 days ago1632376114IN
0xAa448eFF...9eac15a0E
0 ETH0.0055217182
Withdraw132782692021-09-22 22:26:361633 days ago1632349596IN
0xAa448eFF...9eac15a0E
0 ETH0.0067204456.1
Withdraw132737652021-09-22 5:41:171633 days ago1632289277IN
0xAa448eFF...9eac15a0E
0 ETH0.0029211745
Withdraw132687172021-09-21 10:57:401634 days ago1632221860IN
0xAa448eFF...9eac15a0E
0 ETH0.0038659159
Withdraw132680682021-09-21 8:36:031634 days ago1632213363IN
0xAa448eFF...9eac15a0E
0 ETH0.0020592641
Withdraw132676972021-09-21 7:18:061634 days ago1632208686IN
0xAa448eFF...9eac15a0E
0 ETH0.0042590665
View all transactions

Latest 25 internal transactions (View All)

Advanced mode:
Parent Transaction Hash Method Block
From
To
-133199822021-09-29 9:56:461626 days ago1632909406
0xAa448eFF...9eac15a0E
820.3034992 ETH
-133094632021-09-27 18:31:511628 days ago1632767511
0xAa448eFF...9eac15a0E
3.77126268 ETH
-133080632021-09-27 13:34:231628 days ago1632749663
0xAa448eFF...9eac15a0E
19.88316775 ETH
-133068192021-09-27 8:46:551628 days ago1632732415
0xAa448eFF...9eac15a0E
1.42914977 ETH
-133051452021-09-27 2:14:401628 days ago1632708880
0xAa448eFF...9eac15a0E
7.15029142 ETH
-133049152021-09-27 1:20:021629 days ago1632705602
0xAa448eFF...9eac15a0E
0.019944 ETH
-133049012021-09-27 1:16:401629 days ago1632705400
0xAa448eFF...9eac15a0E
2.07648057 ETH
-133048412021-09-27 1:05:291629 days ago1632704729
0xAa448eFF...9eac15a0E
20.44950928 ETH
-133039812021-09-26 21:59:291629 days ago1632693569
0xAa448eFF...9eac15a0E
7.4925 ETH
-133038172021-09-26 21:24:051629 days ago1632691445
0xAa448eFF...9eac15a0E
2.82097395 ETH
-133032602021-09-26 19:14:121629 days ago1632683652
0xAa448eFF...9eac15a0E
1.58286173 ETH
-133030132021-09-26 18:22:541629 days ago1632680574
0xAa448eFF...9eac15a0E
3.996 ETH
-133028462021-09-26 17:50:161629 days ago1632678616
0xAa448eFF...9eac15a0E
6.76319341 ETH
-133028192021-09-26 17:44:361629 days ago1632678276
0xAa448eFF...9eac15a0E
2.37505436 ETH
-133022682021-09-26 15:43:371629 days ago1632671017
0xAa448eFF...9eac15a0E
57.80929213 ETH
-133020422021-09-26 14:58:001629 days ago1632668280
0xAa448eFF...9eac15a0E
35.1648 ETH
-133015172021-09-26 13:00:591629 days ago1632661259
0xAa448eFF...9eac15a0E
24.48740274 ETH
-133012342021-09-26 11:57:441629 days ago1632657464
0xAa448eFF...9eac15a0E
54.05689527 ETH
-133011922021-09-26 11:47:331629 days ago1632656853
0xAa448eFF...9eac15a0E
60.69814084 ETH
-133010742021-09-26 11:17:551629 days ago1632655075
0xAa448eFF...9eac15a0E
24.47774379 ETH
-133006992021-09-26 9:51:091629 days ago1632649869
0xAa448eFF...9eac15a0E
103.3899984 ETH
-133006952021-09-26 9:50:271629 days ago1632649827
0xAa448eFF...9eac15a0E
30.58546804 ETH
-133006952021-09-26 9:50:271629 days ago1632649827
0xAa448eFF...9eac15a0E
67.86315521 ETH
-133006952021-09-26 9:50:271629 days ago1632649827
0xAa448eFF...9eac15a0E
96.91096788 ETH
-133006952021-09-26 9:50:271629 days ago1632649827
0xAa448eFF...9eac15a0E
22.52925737 ETH
View All Internal Transactions
Loading...
Loading
Loading...
Loading
Cross-Chain Transactions

Block Transaction Difficulty Gas Used Reward
View All Blocks Produced

Validator Index Block Amount
View All Withdrawals

Transaction Hash Block Value Eth2 PubKey Valid
View All Deposits
Loading...
Loading

Contract Source Code Verified (Exact Match)

Contract Name:
KyberFprReserveV2

Compiler Version
v0.6.6+commit.6c089d02

Optimization Enabled:
Yes with 1000000 runs

Other Settings:
default evmVersion, MIT license
/**
 *Submitted for verification at Etherscan.io on 2020-10-21
*/

// File: @openzeppelin/contracts/token/ERC20/IERC20.sol

// SPDX-License-Identifier: MIT

pragma solidity ^0.6.0;

/**
 * @dev Interface of the ERC20 standard as defined in the EIP.
 */
interface IERC20 {
    /**
     * @dev Returns the amount of tokens in existence.
     */
    function totalSupply() external view returns (uint256);

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

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

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

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

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

    /**
     * @dev Emitted when `value` tokens are moved from one account (`from`) to
     * another (`to`).
     *
     * Note that `value` may be zero.
     */
    event Transfer(address indexed from, address indexed to, uint256 value);

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

// File: @kyber.network/utils-sc/contracts/IERC20Ext.sol

pragma solidity 0.6.6;



/**
 * @dev Interface extending ERC20 standard to include decimals() as
 *      it is optional in the OpenZeppelin IERC20 interface.
 */
interface IERC20Ext is IERC20 {
    /**
     * @dev This function is required as Kyber requires to interact
     *      with token.decimals() with many of its operations.
     */
    function decimals() external view returns (uint8 digits);
}

// File: contracts/sol6/IKyberReserve.sol

pragma solidity 0.6.6;



interface IKyberReserve {
    function trade(
        IERC20Ext srcToken,
        uint256 srcAmount,
        IERC20Ext destToken,
        address payable destAddress,
        uint256 conversionRate,
        bool validate
    ) external payable returns (bool);

    function getConversionRate(
        IERC20Ext src,
        IERC20Ext dest,
        uint256 srcQty,
        uint256 blockNumber
    ) external view returns (uint256);
}

// File: contracts/sol6/IWeth.sol

pragma solidity 0.6.6;



interface IWeth is IERC20Ext {
    function deposit() external payable;
    function withdraw(uint256 wad) external;
}

// File: contracts/sol6/IKyberSanity.sol

pragma solidity 0.6.6;


interface IKyberSanity {
    function getSanityRate(IERC20Ext src, IERC20Ext dest) external view returns (uint256);
}

// File: contracts/sol6/IConversionRates.sol

pragma solidity 0.6.6;



interface IConversionRates {

    function recordImbalance(
        IERC20Ext token,
        int buyAmount,
        uint256 rateUpdateBlock,
        uint256 currentBlock
    ) external;

    function getRate(
        IERC20Ext token,
        uint256 currentBlockNumber,
        bool buy,
        uint256 qty
    ) external view returns(uint256);
}

// File: @kyber.network/utils-sc/contracts/Utils.sol

pragma solidity 0.6.6;



/**
 * @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 Utils {
    /// Declared constants below to be used in tandem with
    /// getDecimalsConstant(), for gas optimization purposes
    /// which return decimals from a constant list of popular
    /// tokens.
    IERC20Ext internal constant ETH_TOKEN_ADDRESS = IERC20Ext(
        0xEeeeeEeeeEeEeeEeEeEeeEEEeeeeEeeeeeeeEEeE
    );
    IERC20Ext internal constant USDT_TOKEN_ADDRESS = IERC20Ext(
        0xdAC17F958D2ee523a2206206994597C13D831ec7
    );
    IERC20Ext internal constant DAI_TOKEN_ADDRESS = IERC20Ext(
        0x6B175474E89094C44Da98b954EedeAC495271d0F
    );
    IERC20Ext internal constant USDC_TOKEN_ADDRESS = IERC20Ext(
        0xA0b86991c6218b36c1d19D4a2e9Eb0cE3606eB48
    );
    IERC20Ext internal constant WBTC_TOKEN_ADDRESS = IERC20Ext(
        0x2260FAC5E5542a773Aa44fBCfeDf7C193bc2C599
    );
    IERC20Ext internal constant KNC_TOKEN_ADDRESS = IERC20Ext(
        0xdd974D5C2e2928deA5F71b9825b8b646686BD200
    );
    uint256 public constant BPS = 10000; // Basic Price Steps. 1 step = 0.01%
    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 internal constant MAX_ALLOWANCE = uint256(-1); // token.approve inifinite

    mapping(IERC20Ext => uint256) internal decimals;

    /// @dev Sets the decimals of a token to storage if not already set, and returns
    ///      the decimals value of the token. Prefer using this function over
    ///      getDecimals(), to avoid forgetting to set decimals in local storage.
    /// @param token The token type
    /// @return tokenDecimals The decimals of the token
    function getSetDecimals(IERC20Ext token) internal returns (uint256 tokenDecimals) {
        tokenDecimals = getDecimalsConstant(token);
        if (tokenDecimals > 0) return tokenDecimals;

        tokenDecimals = decimals[token];
        if (tokenDecimals == 0) {
            tokenDecimals = token.decimals();
            decimals[token] = tokenDecimals;
        }
    }

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

    /// @dev Get the decimals of a token, read from the constant list, storage,
    ///      or from token.decimals(). Prefer using getSetDecimals when possible.
    /// @param token The token type
    /// @return tokenDecimals The decimals of the token
    function getDecimals(IERC20Ext token) internal view returns (uint256 tokenDecimals) {
        // return token decimals if has constant value
        tokenDecimals = getDecimalsConstant(token);
        if (tokenDecimals > 0) return tokenDecimals;

        // handle case where token decimals is not a declared decimal constant
        tokenDecimals = decimals[token];
        // moreover, very possible that old tokens have decimals 0
        // these tokens will just have higher gas fees.
        return (tokenDecimals > 0) ? tokenDecimals : token.decimals();
    }

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

    function calcSrcAmount(
        IERC20Ext src,
        IERC20Ext 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);
        }
    }

    /// @dev save storage access by declaring token decimal constants
    /// @param token The token type
    /// @return token decimals
    function getDecimalsConstant(IERC20Ext token) internal pure returns (uint256) {
        if (token == ETH_TOKEN_ADDRESS) {
            return ETH_DECIMALS;
        } else if (token == USDT_TOKEN_ADDRESS) {
            return 6;
        } else if (token == DAI_TOKEN_ADDRESS) {
            return 18;
        } else if (token == USDC_TOKEN_ADDRESS) {
            return 6;
        } else if (token == WBTC_TOKEN_ADDRESS) {
            return 8;
        } else if (token == KNC_TOKEN_ADDRESS) {
            return 18;
        } else {
            return 0;
        }
    }

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

// File: @openzeppelin/contracts/math/SafeMath.sol

// SPDX-License-Identifier: MIT

pragma solidity ^0.6.0;

/**
 * @dev Wrappers over Solidity's arithmetic operations with added overflow
 * checks.
 *
 * Arithmetic operations in Solidity wrap on overflow. This can easily result
 * in bugs, because programmers usually assume that an overflow raises an
 * error, which is the standard behavior in high level programming languages.
 * `SafeMath` restores this intuition by reverting the transaction when an
 * operation overflows.
 *
 * Using this library instead of the unchecked operations eliminates an entire
 * class of bugs, so it's recommended to use it always.
 */
library SafeMath {
    /**
     * @dev Returns the addition of two unsigned integers, 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) {
        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;
    }
}

// File: @openzeppelin/contracts/utils/Address.sol

// SPDX-License-Identifier: MIT

pragma solidity ^0.6.2;

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

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

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

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

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

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

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

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

    function _functionCallWithValue(address target, bytes memory data, uint256 weiValue, string memory errorMessage) private returns (bytes memory) {
        require(isContract(target), "Address: call to non-contract");

        // solhint-disable-next-line avoid-low-level-calls
        (bool success, bytes memory returndata) = target.call{ value: weiValue }(data);
        if (success) {
            return returndata;
        } else {
            // Look for revert reason and bubble it up if present
            if (returndata.length > 0) {
                // The easiest way to bubble the revert reason is using memory via assembly

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

// File: @openzeppelin/contracts/token/ERC20/SafeERC20.sol

// SPDX-License-Identifier: MIT

pragma solidity ^0.6.0;




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

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

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

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

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

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

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

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

// File: @kyber.network/utils-sc/contracts/PermissionGroups.sol

pragma solidity 0.6.6;

contract PermissionGroups {
    uint256 internal constant MAX_GROUP_SIZE = 50;

    address public admin;
    address public pendingAdmin;
    mapping(address => bool) internal operators;
    mapping(address => bool) internal alerters;
    address[] internal operatorsGroup;
    address[] internal alertersGroup;

    event AdminClaimed(address newAdmin, address previousAdmin);

    event TransferAdminPending(address pendingAdmin);

    event OperatorAdded(address newOperator, bool isAdd);

    event AlerterAdded(address newAlerter, bool isAdd);

    constructor(address _admin) public {
        require(_admin != address(0), "admin 0");
        admin = _admin;
    }

    modifier onlyAdmin() {
        require(msg.sender == admin, "only admin");
        _;
    }

    modifier onlyOperator() {
        require(operators[msg.sender], "only operator");
        _;
    }

    modifier onlyAlerter() {
        require(alerters[msg.sender], "only alerter");
        _;
    }

    function getOperators() external view returns (address[] memory) {
        return operatorsGroup;
    }

    function getAlerters() external view returns (address[] memory) {
        return alertersGroup;
    }

    /**
     * @dev Allows the current admin to set the pendingAdmin address.
     * @param newAdmin The address to transfer ownership to.
     */
    function transferAdmin(address newAdmin) public onlyAdmin {
        require(newAdmin != address(0), "new admin 0");
        emit TransferAdminPending(newAdmin);
        pendingAdmin = newAdmin;
    }

    /**
     * @dev Allows the current admin to set the admin in one tx. Useful initial deployment.
     * @param newAdmin The address to transfer ownership to.
     */
    function transferAdminQuickly(address newAdmin) public onlyAdmin {
        require(newAdmin != address(0), "admin 0");
        emit TransferAdminPending(newAdmin);
        emit AdminClaimed(newAdmin, admin);
        admin = newAdmin;
    }

    /**
     * @dev Allows the pendingAdmin address to finalize the change admin process.
     */
    function claimAdmin() public {
        require(pendingAdmin == msg.sender, "not pending");
        emit AdminClaimed(pendingAdmin, admin);
        admin = pendingAdmin;
        pendingAdmin = address(0);
    }

    function addAlerter(address newAlerter) public onlyAdmin {
        require(!alerters[newAlerter], "alerter exists"); // prevent duplicates.
        require(alertersGroup.length < MAX_GROUP_SIZE, "max alerters");

        emit AlerterAdded(newAlerter, true);
        alerters[newAlerter] = true;
        alertersGroup.push(newAlerter);
    }

    function removeAlerter(address alerter) public onlyAdmin {
        require(alerters[alerter], "not alerter");
        alerters[alerter] = false;

        for (uint256 i = 0; i < alertersGroup.length; ++i) {
            if (alertersGroup[i] == alerter) {
                alertersGroup[i] = alertersGroup[alertersGroup.length - 1];
                alertersGroup.pop();
                emit AlerterAdded(alerter, false);
                break;
            }
        }
    }

    function addOperator(address newOperator) public onlyAdmin {
        require(!operators[newOperator], "operator exists"); // prevent duplicates.
        require(operatorsGroup.length < MAX_GROUP_SIZE, "max operators");

        emit OperatorAdded(newOperator, true);
        operators[newOperator] = true;
        operatorsGroup.push(newOperator);
    }

    function removeOperator(address operator) public onlyAdmin {
        require(operators[operator], "not operator");
        operators[operator] = false;

        for (uint256 i = 0; i < operatorsGroup.length; ++i) {
            if (operatorsGroup[i] == operator) {
                operatorsGroup[i] = operatorsGroup[operatorsGroup.length - 1];
                operatorsGroup.pop();
                emit OperatorAdded(operator, false);
                break;
            }
        }
    }
}

// File: @kyber.network/utils-sc/contracts/Withdrawable.sol

pragma solidity 0.6.6;




contract Withdrawable is PermissionGroups {
    using SafeERC20 for IERC20Ext;

    event TokenWithdraw(IERC20Ext token, uint256 amount, address sendTo);
    event EtherWithdraw(uint256 amount, address sendTo);

    constructor(address _admin) public PermissionGroups(_admin) {}

    /**
     * @dev Withdraw all IERC20Ext compatible tokens
     * @param token IERC20Ext The address of the token contract
     */
    function withdrawToken(
        IERC20Ext token,
        uint256 amount,
        address sendTo
    ) external onlyAdmin {
        token.safeTransfer(sendTo, amount);
        emit TokenWithdraw(token, amount, sendTo);
    }

    /**
     * @dev Withdraw Ethers
     */
    function withdrawEther(uint256 amount, address payable sendTo) external onlyAdmin {
        (bool success, ) = sendTo.call{value: amount}("");
        require(success, "withdraw failed");
        emit EtherWithdraw(amount, sendTo);
    }
}

// File: contracts/sol6/KyberFprReserveV2.sol

// SPDX-License-Identifier: MIT
pragma solidity 0.6.6;








/// @title KyberFprReserve version 2
/// Allow Reserve to work work with either weth or eth.
/// for working with weth should specify external address to hold weth.
/// Allow Reserve to set maxGasPriceWei to trade with
contract KyberFprReserveV2 is IKyberReserve, Utils, Withdrawable {
    using SafeERC20 for IERC20Ext;
    using SafeMath for uint256;

    mapping(bytes32 => bool) public approvedWithdrawAddresses; // sha3(token,address)=>bool
    mapping(address => address) public tokenWallet;

    struct ConfigData {
        bool tradeEnabled;
        bool doRateValidation; // whether to do rate validation in trade func
        uint128 maxGasPriceWei;
    }

    address public kyberNetwork;
    ConfigData internal configData;

    IConversionRates public conversionRatesContract;
    IKyberSanity public sanityRatesContract;
    IWeth public weth;

    event DepositToken(IERC20Ext indexed token, uint256 amount);
    event TradeExecute(
        address indexed origin,
        IERC20Ext indexed src,
        uint256 srcAmount,
        IERC20Ext indexed destToken,
        uint256 destAmount,
        address payable destAddress
    );
    event TradeEnabled(bool enable);
    event MaxGasPriceUpdated(uint128 newMaxGasPrice);
    event DoRateValidationUpdated(bool doRateValidation);
    event WithdrawAddressApproved(IERC20Ext indexed token, address indexed addr, bool approve);
    event NewTokenWallet(IERC20Ext indexed token, address indexed wallet);
    event WithdrawFunds(IERC20Ext indexed token, uint256 amount, address indexed destination);
    event SetKyberNetworkAddress(address indexed network);
    event SetConversionRateAddress(IConversionRates indexed rate);
    event SetWethAddress(IWeth indexed weth);
    event SetSanityRateAddress(IKyberSanity indexed sanity);

    constructor(
        address _kyberNetwork,
        IConversionRates _ratesContract,
        IWeth _weth,
        uint128 _maxGasPriceWei,
        bool _doRateValidation,
        address _admin
    ) public Withdrawable(_admin) {
        require(_kyberNetwork != address(0), "kyberNetwork 0");
        require(_ratesContract != IConversionRates(0), "ratesContract 0");
        require(_weth != IWeth(0), "weth 0");
        kyberNetwork = _kyberNetwork;
        conversionRatesContract = _ratesContract;
        weth = _weth;
        configData = ConfigData({
            tradeEnabled: true,
            maxGasPriceWei: _maxGasPriceWei,
            doRateValidation: _doRateValidation
        });
    }

    receive() external payable {
        emit DepositToken(ETH_TOKEN_ADDRESS, msg.value);
    }

    function trade(
        IERC20Ext srcToken,
        uint256 srcAmount,
        IERC20Ext destToken,
        address payable destAddress,
        uint256 conversionRate,
        bool /* validate */
    ) external override payable returns (bool) {
        require(msg.sender == kyberNetwork, "wrong sender");
        ConfigData memory data = configData;
        require(data.tradeEnabled, "trade not enable");
        require(tx.gasprice <= uint256(data.maxGasPriceWei), "gas price too high");

        doTrade(
            srcToken,
            srcAmount,
            destToken,
            destAddress,
            conversionRate,
            data.doRateValidation
        );

        return true;
    }

    function enableTrade() external onlyAdmin {
        configData.tradeEnabled = true;
        emit TradeEnabled(true);
    }

    function disableTrade() external onlyAlerter {
        configData.tradeEnabled = false;
        emit TradeEnabled(false);
    }

    function setMaxGasPrice(uint128 newMaxGasPrice) external onlyOperator {
        configData.maxGasPriceWei = newMaxGasPrice;
        emit MaxGasPriceUpdated(newMaxGasPrice);
    }

    function setDoRateValidation(bool _doRateValidation) external onlyAdmin {
        configData.doRateValidation = _doRateValidation;
        emit DoRateValidationUpdated(_doRateValidation);
    }

    function approveWithdrawAddress(
        IERC20Ext token,
        address addr,
        bool approve
    ) external onlyAdmin {
        approvedWithdrawAddresses[keccak256(abi.encodePacked(address(token), addr))] = approve;
        getSetDecimals(token);
        emit WithdrawAddressApproved(token, addr, approve);
    }

    /// @dev allow set tokenWallet[token] back to 0x0 address
    /// @dev in case of using weth from external wallet, must call set token wallet for weth
    ///      tokenWallet for weth must be different from this reserve address
    function setTokenWallet(IERC20Ext token, address wallet) external onlyAdmin {
        tokenWallet[address(token)] = wallet;
        getSetDecimals(token);
        emit NewTokenWallet(token, wallet);
    }

    /// @dev withdraw amount of token to an approved destination
    ///      if reserve is using weth instead of eth, should call withdraw weth
    /// @param token token to withdraw
    /// @param amount amount to withdraw
    /// @param destination address to transfer fund to
    function withdraw(
        IERC20Ext token,
        uint256 amount,
        address destination
    ) external onlyOperator {
        require(
            approvedWithdrawAddresses[keccak256(abi.encodePacked(address(token), destination))],
            "destination is not approved"
        );

        if (token == ETH_TOKEN_ADDRESS) {
            (bool success, ) = destination.call{value: amount}("");
            require(success, "withdraw eth failed");
        } else {
            address wallet = getTokenWallet(token);
            if (wallet == address(this)) {
                token.safeTransfer(destination, amount);
            } else {
                token.safeTransferFrom(wallet, destination, amount);
            }
        }

        emit WithdrawFunds(token, amount, destination);
    }

    function setKyberNetwork(address _newNetwork) external onlyAdmin {
        require(_newNetwork != address(0), "kyberNetwork 0");
        kyberNetwork = _newNetwork;
        emit SetKyberNetworkAddress(_newNetwork);
    }

    function setConversionRate(IConversionRates _newConversionRate) external onlyAdmin {
        require(_newConversionRate != IConversionRates(0), "conversionRates 0");
        conversionRatesContract = _newConversionRate;
        emit SetConversionRateAddress(_newConversionRate);
    }

    /// @dev weth is unlikely to be changed, but added this function to keep the flexibilty
    function setWeth(IWeth _newWeth) external onlyAdmin {
        require(_newWeth != IWeth(0), "weth 0");
        weth = _newWeth;
        emit SetWethAddress(_newWeth);
    }

    /// @dev sanity rate can be set to 0x0 address to disable sanity rate check
    function setSanityRate(IKyberSanity _newSanity) external onlyAdmin {
        sanityRatesContract = _newSanity;
        emit SetSanityRateAddress(_newSanity);
    }

    function getConversionRate(
        IERC20Ext src,
        IERC20Ext dest,
        uint256 srcQty,
        uint256 blockNumber
    ) external override view returns (uint256) {
        ConfigData memory data = configData;
        if (!data.tradeEnabled) return 0;
        if (tx.gasprice > uint256(data.maxGasPriceWei)) return 0;
        if (srcQty == 0) return 0;

        IERC20Ext token;
        bool isBuy;

        if (ETH_TOKEN_ADDRESS == src) {
            isBuy = true;
            token = dest;
        } else if (ETH_TOKEN_ADDRESS == dest) {
            isBuy = false;
            token = src;
        } else {
            return 0; // pair is not listed
        }

        uint256 rate;
        try conversionRatesContract.getRate(token, blockNumber, isBuy, srcQty) returns(uint256 r) {
            rate = r;
        } catch {
            return 0;
        }
        uint256 destQty = calcDestAmount(src, dest, srcQty, rate);

        if (getBalance(dest) < destQty) return 0;

        if (sanityRatesContract != IKyberSanity(0)) {
            uint256 sanityRate = sanityRatesContract.getSanityRate(src, dest);
            if (rate > sanityRate) return 0;
        }

        return rate;
    }

    function isAddressApprovedForWithdrawal(IERC20Ext token, address addr)
        external
        view
        returns (bool)
    {
        return approvedWithdrawAddresses[keccak256(abi.encodePacked(address(token), addr))];
    }

    function tradeEnabled() external view returns (bool) {
        return configData.tradeEnabled;
    }

    function maxGasPriceWei() external view returns (uint128) {
        return configData.maxGasPriceWei;
    }

    function doRateValidation() external view returns (bool) {
        return configData.doRateValidation;
    }

    /// @dev return available balance of a token that reserve can use
    ///      if using weth, call getBalance(eth) will return weth balance
    ///      if using wallet for token, will return min of balance and allowance
    /// @param token token to get available balance that reserve can use
    function getBalance(IERC20Ext token) public view returns (uint256) {
        address wallet = getTokenWallet(token);
        IERC20Ext usingToken;

        if (token == ETH_TOKEN_ADDRESS) {
            if (wallet == address(this)) {
                // reserve should be using eth instead of weth
                return address(this).balance;
            }
            // reserve is using weth instead of eth
            usingToken = weth;
        } else {
            if (wallet == address(this)) {
                // not set token wallet or reserve is the token wallet, no need to check allowance
                return token.balanceOf(address(this));
            }
            usingToken = token;
        }

        uint256 balanceOfWallet = usingToken.balanceOf(wallet);
        uint256 allowanceOfWallet = usingToken.allowance(wallet, address(this));

        return minOf(balanceOfWallet, allowanceOfWallet);
    }

    /// @dev return wallet that holds the token
    ///      if token is ETH, check tokenWallet of WETH instead
    ///      if wallet is 0x0, consider as this reserve address
    function getTokenWallet(IERC20Ext token) public view returns (address wallet) {
        wallet = (token == ETH_TOKEN_ADDRESS)
            ? tokenWallet[address(weth)]
            : tokenWallet[address(token)];
        if (wallet == address(0)) {
            wallet = address(this);
        }
    }

    /// @dev do a trade, re-validate the conversion rate, remove trust assumption with network
    /// @param srcToken Src token
    /// @param srcAmount Amount of src token
    /// @param destToken Destination token
    /// @param destAddress Destination address to send tokens to
    /// @param validateRate re-validate rate or not
    function doTrade(
        IERC20Ext srcToken,
        uint256 srcAmount,
        IERC20Ext destToken,
        address payable destAddress,
        uint256 conversionRate,
        bool validateRate
    ) internal {
        require(conversionRate > 0, "rate is 0");

        bool isBuy = srcToken == ETH_TOKEN_ADDRESS;
        if (isBuy) {
            require(msg.value == srcAmount, "wrong msg value");
        } else {
            require(msg.value == 0, "bad msg value");
        }

        if (validateRate) {
            uint256 rate = conversionRatesContract.getRate(
                isBuy ? destToken : srcToken,
                block.number,
                isBuy,
                srcAmount
            );
            // re-validate conversion rate
            require(rate >= conversionRate, "reserve rate lower then network requested rate");
            if (sanityRatesContract != IKyberSanity(0)) {
                // sanity rate check
                uint256 sanityRate = sanityRatesContract.getSanityRate(srcToken, destToken);
                require(rate <= sanityRate, "rate should not be greater than sanity rate" );
            }
        }

        uint256 destAmount = calcDestAmount(srcToken, destToken, srcAmount, conversionRate);
        require(destAmount > 0, "dest amount is 0");

        address srcTokenWallet = getTokenWallet(srcToken);
        address destTokenWallet = getTokenWallet(destToken);

        if (isBuy) {
            // add to imbalance
            conversionRatesContract.recordImbalance(
                destToken,
                int256(destAmount),
                0,
                block.number
            );
            // if reserve is using weth, convert eth to weth and transfer weth to its' tokenWallet
            if (srcTokenWallet != address(this)) {
                weth.deposit{value: msg.value}();
                IERC20Ext(weth).safeTransfer(srcTokenWallet, msg.value);
            }
            // transfer dest token from tokenWallet to destAddress
            if (destTokenWallet == address(this)) {
                destToken.safeTransfer(destAddress, destAmount);
            } else {
                destToken.safeTransferFrom(destTokenWallet, destAddress, destAmount);
            }
        } else {
            // add to imbalance
            conversionRatesContract.recordImbalance(
                srcToken,
                -1 * int256(srcAmount),
                0,
                block.number
            );
            // collect src token from sender
            srcToken.safeTransferFrom(msg.sender, srcTokenWallet, srcAmount);
            // if reserve is using weth, reserve needs to collect weth from tokenWallet,
            // then convert it to eth
            if (destTokenWallet != address(this)) {
                IERC20Ext(weth).safeTransferFrom(destTokenWallet, address(this), destAmount);
                weth.withdraw(destAmount);
            }
            // transfer eth to destAddress
            (bool success, ) = destAddress.call{value: destAmount}("");
            require(success, "transfer eth from reserve to destAddress failed");
        }

        emit TradeExecute(msg.sender, srcToken, srcAmount, destToken, destAmount, destAddress);
    }
}

Contract Security Audit

Contract ABI

API
[{"inputs":[{"internalType":"address","name":"_kyberNetwork","type":"address"},{"internalType":"contract IConversionRates","name":"_ratesContract","type":"address"},{"internalType":"contract IWeth","name":"_weth","type":"address"},{"internalType":"uint128","name":"_maxGasPriceWei","type":"uint128"},{"internalType":"bool","name":"_doRateValidation","type":"bool"},{"internalType":"address","name":"_admin","type":"address"}],"stateMutability":"nonpayable","type":"constructor"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"newAdmin","type":"address"},{"indexed":false,"internalType":"address","name":"previousAdmin","type":"address"}],"name":"AdminClaimed","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"newAlerter","type":"address"},{"indexed":false,"internalType":"bool","name":"isAdd","type":"bool"}],"name":"AlerterAdded","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"contract IERC20Ext","name":"token","type":"address"},{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"}],"name":"DepositToken","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"bool","name":"doRateValidation","type":"bool"}],"name":"DoRateValidationUpdated","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"},{"indexed":false,"internalType":"address","name":"sendTo","type":"address"}],"name":"EtherWithdraw","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint128","name":"newMaxGasPrice","type":"uint128"}],"name":"MaxGasPriceUpdated","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"contract IERC20Ext","name":"token","type":"address"},{"indexed":true,"internalType":"address","name":"wallet","type":"address"}],"name":"NewTokenWallet","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"newOperator","type":"address"},{"indexed":false,"internalType":"bool","name":"isAdd","type":"bool"}],"name":"OperatorAdded","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"contract IConversionRates","name":"rate","type":"address"}],"name":"SetConversionRateAddress","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"network","type":"address"}],"name":"SetKyberNetworkAddress","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"contract IKyberSanity","name":"sanity","type":"address"}],"name":"SetSanityRateAddress","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"contract IWeth","name":"weth","type":"address"}],"name":"SetWethAddress","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"contract IERC20Ext","name":"token","type":"address"},{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"},{"indexed":false,"internalType":"address","name":"sendTo","type":"address"}],"name":"TokenWithdraw","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"bool","name":"enable","type":"bool"}],"name":"TradeEnabled","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"origin","type":"address"},{"indexed":true,"internalType":"contract IERC20Ext","name":"src","type":"address"},{"indexed":false,"internalType":"uint256","name":"srcAmount","type":"uint256"},{"indexed":true,"internalType":"contract IERC20Ext","name":"destToken","type":"address"},{"indexed":false,"internalType":"uint256","name":"destAmount","type":"uint256"},{"indexed":false,"internalType":"address payable","name":"destAddress","type":"address"}],"name":"TradeExecute","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"pendingAdmin","type":"address"}],"name":"TransferAdminPending","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"contract IERC20Ext","name":"token","type":"address"},{"indexed":true,"internalType":"address","name":"addr","type":"address"},{"indexed":false,"internalType":"bool","name":"approve","type":"bool"}],"name":"WithdrawAddressApproved","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"contract IERC20Ext","name":"token","type":"address"},{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"},{"indexed":true,"internalType":"address","name":"destination","type":"address"}],"name":"WithdrawFunds","type":"event"},{"inputs":[],"name":"BPS","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"newAlerter","type":"address"}],"name":"addAlerter","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"newOperator","type":"address"}],"name":"addOperator","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"admin","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"contract IERC20Ext","name":"token","type":"address"},{"internalType":"address","name":"addr","type":"address"},{"internalType":"bool","name":"approve","type":"bool"}],"name":"approveWithdrawAddress","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"name":"approvedWithdrawAddresses","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"claimAdmin","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"conversionRatesContract","outputs":[{"internalType":"contract IConversionRates","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"disableTrade","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"doRateValidation","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"enableTrade","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"getAlerters","outputs":[{"internalType":"address[]","name":"","type":"address[]"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"contract IERC20Ext","name":"token","type":"address"}],"name":"getBalance","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"contract IERC20Ext","name":"src","type":"address"},{"internalType":"contract IERC20Ext","name":"dest","type":"address"},{"internalType":"uint256","name":"srcQty","type":"uint256"},{"internalType":"uint256","name":"blockNumber","type":"uint256"}],"name":"getConversionRate","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getOperators","outputs":[{"internalType":"address[]","name":"","type":"address[]"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"contract IERC20Ext","name":"token","type":"address"}],"name":"getTokenWallet","outputs":[{"internalType":"address","name":"wallet","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"contract IERC20Ext","name":"token","type":"address"},{"internalType":"address","name":"addr","type":"address"}],"name":"isAddressApprovedForWithdrawal","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"kyberNetwork","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"maxGasPriceWei","outputs":[{"internalType":"uint128","name":"","type":"uint128"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"pendingAdmin","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"alerter","type":"address"}],"name":"removeAlerter","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"operator","type":"address"}],"name":"removeOperator","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"sanityRatesContract","outputs":[{"internalType":"contract IKyberSanity","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"contract IConversionRates","name":"_newConversionRate","type":"address"}],"name":"setConversionRate","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bool","name":"_doRateValidation","type":"bool"}],"name":"setDoRateValidation","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_newNetwork","type":"address"}],"name":"setKyberNetwork","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint128","name":"newMaxGasPrice","type":"uint128"}],"name":"setMaxGasPrice","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"contract IKyberSanity","name":"_newSanity","type":"address"}],"name":"setSanityRate","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"contract IERC20Ext","name":"token","type":"address"},{"internalType":"address","name":"wallet","type":"address"}],"name":"setTokenWallet","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"contract IWeth","name":"_newWeth","type":"address"}],"name":"setWeth","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"tokenWallet","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"contract IERC20Ext","name":"srcToken","type":"address"},{"internalType":"uint256","name":"srcAmount","type":"uint256"},{"internalType":"contract IERC20Ext","name":"destToken","type":"address"},{"internalType":"address payable","name":"destAddress","type":"address"},{"internalType":"uint256","name":"conversionRate","type":"uint256"},{"internalType":"bool","name":"","type":"bool"}],"name":"trade","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"payable","type":"function"},{"inputs":[],"name":"tradeEnabled","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"newAdmin","type":"address"}],"name":"transferAdmin","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"newAdmin","type":"address"}],"name":"transferAdminQuickly","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"weth","outputs":[{"internalType":"contract IWeth","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"contract IERC20Ext","name":"token","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"},{"internalType":"address","name":"destination","type":"address"}],"name":"withdraw","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"amount","type":"uint256"},{"internalType":"address payable","name":"sendTo","type":"address"}],"name":"withdrawEther","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"contract IERC20Ext","name":"token","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"},{"internalType":"address","name":"sendTo","type":"address"}],"name":"withdrawToken","outputs":[],"stateMutability":"nonpayable","type":"function"},{"stateMutability":"payable","type":"receive"}]

60806040523480156200001157600080fd5b5060405162004dc738038062004dc7833981810160405260c08110156200003757600080fd5b508051602082015160408301516060840151608085015160a090950151939492939192909180806001600160a01b038116620000a4576040805162461bcd60e51b8152602060048201526007602482015266061646d696e20360cc1b604482015290519081900360640190fd5b600180546001600160a01b0319166001600160a01b0392831617905587161515905062000109576040805162461bcd60e51b815260206004820152600e60248201526d06b796265724e6574776f726b20360941b604482015290519081900360640190fd5b6001600160a01b03851662000157576040805162461bcd60e51b815260206004820152600f60248201526e07261746573436f6e7472616374203608c1b604482015290519081900360640190fd5b6001600160a01b0384166200019c576040805162461bcd60e51b815260206004820152600660248201526507765746820360d41b604482015290519081900360640190fd5b50600980546001600160a01b03199081166001600160a01b0397881617909155600b8054821695871695909517909455600d80549094169290941691909117909155604080516060810182526001808252931515602082018190526001600160801b039093169101819052600a805460ff191690931761ff0019166101009092029190911762010000600160901b03191662010000909102179055614b8080620002476000396000f3fe6080604052600436106102a35760003560e01c80637acc86781161016e578063b8d1452f116100cb578063d7b7024d1161007f578063f851a44011610064578063f851a44014610aae578063f8b2cb4f14610ac3578063fa30728114610b03576102f4565b8063d7b7024d14610a4a578063ef3881c814610a74576102f4565b8063ce56c454116100b0578063ce56c454146109da578063d5847d3314610a20578063d621e81314610a35576102f4565b8063b8d1452f1461095e578063cac1d6491461099e576102f4565b80639870d7fe11610122578063a80cbac611610107578063a80cbac6146108c9578063ac8a584a14610909578063b78b842d14610949576102f4565b80639870d7fe14610841578063a56bb95b14610881576102f4565b80637cd44272116101535780637cd442721461076b57806380f4da8b146107c157806385d7502514610801576102f4565b80637acc8678146107165780637c423f5414610756576102f4565b8063408ee7fe1161021c57806369328dec116101d05780636cf69811116101b55780636cf698111461066857806375829def146106c157806377f50f9714610701576102f4565b806369328dec146106035780636940030f14610653576102f4565b8063546dc71c11610201578063546dc71c1461054557806354869d201461059757806354a325a6146105c3576102f4565b8063408ee7fe146104f057806347e6924f14610530576102f4565b8063249d39e91161027357806327a099d81161025857806327a099d8146104265780633ccdbb281461048b5780633fc8cef3146104db576102f4565b8063249d39e9146103c157806326782247146103e8576102f4565b806299d386146102f957806301a12fd3146103105780630299c694146103505780631bc7bfec14610379576102f4565b366102f45760408051348152905173eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee917f2d0c0a8842b9944ece1495eb61121621b5e36bd6af3bba0318c695f525aef79f919081900360200190a2005b600080fd5b34801561030557600080fd5b5061030e610b43565b005b34801561031c57600080fd5b5061030e6004803603602081101561033357600080fd5b503573ffffffffffffffffffffffffffffffffffffffff16610c2b565b34801561035c57600080fd5b50610365610f5b565b604080519115158252519081900360200190f35b34801561038557600080fd5b5061030e6004803603604081101561039c57600080fd5b5073ffffffffffffffffffffffffffffffffffffffff81358116916020013516610f69565b3480156103cd57600080fd5b506103d66110aa565b60408051918252519081900360200190f35b3480156103f457600080fd5b506103fd6110b0565b6040805173ffffffffffffffffffffffffffffffffffffffff9092168252519081900360200190f35b34801561043257600080fd5b5061043b6110cc565b60408051602080825283518183015283519192839290830191858101910280838360005b8381101561047757818101518382015260200161045f565b505050509050019250505060405180910390f35b34801561049757600080fd5b5061030e600480360360608110156104ae57600080fd5b5073ffffffffffffffffffffffffffffffffffffffff81358116916020810135916040909101351661113b565b3480156104e757600080fd5b506103fd611244565b3480156104fc57600080fd5b5061030e6004803603602081101561051357600080fd5b503573ffffffffffffffffffffffffffffffffffffffff16611260565b34801561053c57600080fd5b506103fd6114e6565b34801561055157600080fd5b5061030e6004803603606081101561056857600080fd5b5073ffffffffffffffffffffffffffffffffffffffff8135811691602081013590911690604001351515611502565b3480156105a357600080fd5b5061030e600480360360208110156105ba57600080fd5b50351515611678565b3480156105cf57600080fd5b5061030e600480360360208110156105e657600080fd5b503573ffffffffffffffffffffffffffffffffffffffff1661176a565b34801561060f57600080fd5b5061030e6004803603606081101561062657600080fd5b5073ffffffffffffffffffffffffffffffffffffffff8135811691602081013591604090910135166118e1565b34801561065f57600080fd5b5061030e611c23565b610365600480360360c081101561067e57600080fd5b5073ffffffffffffffffffffffffffffffffffffffff8135811691602081013591604082013581169160608101359091169060808101359060a001351515611cff565b3480156106cd57600080fd5b5061030e600480360360208110156106e457600080fd5b503573ffffffffffffffffffffffffffffffffffffffff16611ee8565b34801561070d57600080fd5b5061030e612080565b34801561072257600080fd5b5061030e6004803603602081101561073957600080fd5b503573ffffffffffffffffffffffffffffffffffffffff166121ab565b34801561076257600080fd5b5061043b612398565b34801561077757600080fd5b506103d66004803603608081101561078e57600080fd5b5073ffffffffffffffffffffffffffffffffffffffff813581169160208101359091169060408101359060600135612405565b3480156107cd57600080fd5b5061030e600480360360208110156107e457600080fd5b503573ffffffffffffffffffffffffffffffffffffffff1661270b565b34801561080d57600080fd5b506103fd6004803603602081101561082457600080fd5b503573ffffffffffffffffffffffffffffffffffffffff16612800565b34801561084d57600080fd5b5061030e6004803603602081101561086457600080fd5b503573ffffffffffffffffffffffffffffffffffffffff166128b1565b34801561088d57600080fd5b50610365600480360360408110156108a457600080fd5b5073ffffffffffffffffffffffffffffffffffffffff81358116916020013516612b37565b3480156108d557600080fd5b506103fd600480360360208110156108ec57600080fd5b503573ffffffffffffffffffffffffffffffffffffffff16612ba4565b34801561091557600080fd5b5061030e6004803603602081101561092c57600080fd5b503573ffffffffffffffffffffffffffffffffffffffff16612bcc565b34801561095557600080fd5b506103fd612ef8565b34801561096a57600080fd5b5061030e6004803603602081101561098157600080fd5b503573ffffffffffffffffffffffffffffffffffffffff16612f14565b3480156109aa57600080fd5b5061030e600480360360208110156109c157600080fd5b50356fffffffffffffffffffffffffffffffff1661308b565b3480156109e657600080fd5b5061030e600480360360408110156109fd57600080fd5b508035906020013573ffffffffffffffffffffffffffffffffffffffff16613186565b348015610a2c57600080fd5b506103fd61332e565b348015610a4157600080fd5b5061036561334a565b348015610a5657600080fd5b5061036560048036036020811015610a6d57600080fd5b5035613353565b348015610a8057600080fd5b50610a89613368565b604080516fffffffffffffffffffffffffffffffff9092168252519081900360200190f35b348015610aba57600080fd5b506103fd613386565b348015610acf57600080fd5b506103d660048036036020811015610ae657600080fd5b503573ffffffffffffffffffffffffffffffffffffffff166133a2565b348015610b0f57600080fd5b5061030e60048036036020811015610b2657600080fd5b503573ffffffffffffffffffffffffffffffffffffffff16613657565b60015473ffffffffffffffffffffffffffffffffffffffff163314610bc957604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600a60248201527f6f6e6c792061646d696e00000000000000000000000000000000000000000000604482015290519081900360640190fd5b600a80547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0016600190811790915560408051918252517f7d7f00509dd73ac4449f698ae75ccc797895eff5fa9d446d3df387598a26e7359181900360200190a1565b60015473ffffffffffffffffffffffffffffffffffffffff163314610cb157604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600a60248201527f6f6e6c792061646d696e00000000000000000000000000000000000000000000604482015290519081900360640190fd5b73ffffffffffffffffffffffffffffffffffffffff811660009081526004602052604090205460ff16610d4557604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600b60248201527f6e6f7420616c6572746572000000000000000000000000000000000000000000604482015290519081900360640190fd5b73ffffffffffffffffffffffffffffffffffffffff8116600090815260046020526040812080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff001690555b600654811015610f57578173ffffffffffffffffffffffffffffffffffffffff1660068281548110610dbf57fe5b60009182526020909120015473ffffffffffffffffffffffffffffffffffffffff161415610f4f57600680547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8101908110610e1757fe5b6000918252602090912001546006805473ffffffffffffffffffffffffffffffffffffffff9092169183908110610e4a57fe5b9060005260206000200160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055506006805480610e9d57fe5b6000828152602080822083017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff90810180547fffffffffffffffffffffffff00000000000000000000000000000000000000001690559092019092556040805173ffffffffffffffffffffffffffffffffffffffff861681529182019290925281517f5611bf3e417d124f97bf2c788843ea8bb502b66079fbee02158ef30b172cb762929181900390910190a1610f57565b600101610d91565b5050565b600a54610100900460ff1690565b60015473ffffffffffffffffffffffffffffffffffffffff163314610fef57604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600a60248201527f6f6e6c792061646d696e00000000000000000000000000000000000000000000604482015290519081900360640190fd5b73ffffffffffffffffffffffffffffffffffffffff828116600090815260086020526040902080547fffffffffffffffffffffffff00000000000000000000000000000000000000001691831691909117905561104b826137ce565b508073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff167f81995c7b922889ac0a81e41866106d4046268ea3a9abaae9f9e080a6ce36ee7d60405160405180910390a35050565b61271081565b60025473ffffffffffffffffffffffffffffffffffffffff1681565b6060600580548060200260200160405190810160405280929190818152602001828054801561113157602002820191906000526020600020905b815473ffffffffffffffffffffffffffffffffffffffff168152600190910190602001808311611106575b5050505050905090565b60015473ffffffffffffffffffffffffffffffffffffffff1633146111c157604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600a60248201527f6f6e6c792061646d696e00000000000000000000000000000000000000000000604482015290519081900360640190fd5b6111e873ffffffffffffffffffffffffffffffffffffffff8416828463ffffffff6138b816565b6040805173ffffffffffffffffffffffffffffffffffffffff80861682526020820185905283168183015290517f72cb8a894ddb372ceec3d2a7648d86f17d5a15caae0e986c53109b8a9a9385e69181900360600190a1505050565b600d5473ffffffffffffffffffffffffffffffffffffffff1681565b60015473ffffffffffffffffffffffffffffffffffffffff1633146112e657604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600a60248201527f6f6e6c792061646d696e00000000000000000000000000000000000000000000604482015290519081900360640190fd5b73ffffffffffffffffffffffffffffffffffffffff811660009081526004602052604090205460ff161561137b57604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600e60248201527f616c657274657220657869737473000000000000000000000000000000000000604482015290519081900360640190fd5b6006546032116113ec57604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600c60248201527f6d617820616c6572746572730000000000000000000000000000000000000000604482015290519081900360640190fd5b6040805173ffffffffffffffffffffffffffffffffffffffff831681526001602082015281517f5611bf3e417d124f97bf2c788843ea8bb502b66079fbee02158ef30b172cb762929181900390910190a173ffffffffffffffffffffffffffffffffffffffff16600081815260046020526040812080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff001660019081179091556006805491820181559091527ff652222313e28459528d920b65115c16c04f3efc82aaedc97be59f3f377c0d3f0180547fffffffffffffffffffffffff0000000000000000000000000000000000000000169091179055565b600c5473ffffffffffffffffffffffffffffffffffffffff1681565b60015473ffffffffffffffffffffffffffffffffffffffff16331461158857604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600a60248201527f6f6e6c792061646d696e00000000000000000000000000000000000000000000604482015290519081900360640190fd5b60408051606085811b7fffffffffffffffffffffffffffffffffffffffff0000000000000000000000009081166020808501919091529186901b1660348301528251808303602801815260489092018352815191810191909120600090815260079091522080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0016821515179055611620836137ce565b50604080518215158152905173ffffffffffffffffffffffffffffffffffffffff80851692908616917fd5fd5351efae1f4bb760079da9f0ff9589e2c3e216337ca9d39cdff573b245c49181900360200190a3505050565b60015473ffffffffffffffffffffffffffffffffffffffff1633146116fe57604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600a60248201527f6f6e6c792061646d696e00000000000000000000000000000000000000000000604482015290519081900360640190fd5b600a805482151561010081027fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00ff9092169190911790915560408051918252517f89db626a89e1048b2c196cafdaf6158cfd934276037ba2d562a154b661aaa2e79181900360200190a150565b60015473ffffffffffffffffffffffffffffffffffffffff1633146117f057604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600a60248201527f6f6e6c792061646d696e00000000000000000000000000000000000000000000604482015290519081900360640190fd5b73ffffffffffffffffffffffffffffffffffffffff811661187257604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600e60248201527f6b796265724e6574776f726b2030000000000000000000000000000000000000604482015290519081900360640190fd5b600980547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff83169081179091556040517f379acac7823b50b8ac0626f4b125da7f930be2a6abd7e43d9a75198a8ec00eb890600090a250565b3360009081526003602052604090205460ff1661195f57604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600d60248201527f6f6e6c79206f70657261746f7200000000000000000000000000000000000000604482015290519081900360640190fd5b60408051606085811b7fffffffffffffffffffffffffffffffffffffffff0000000000000000000000009081166020808501919091529185901b166034830152825180830360280181526048909201835281519181019190912060009081526007909152205460ff16611a3357604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601b60248201527f64657374696e6174696f6e206973206e6f7420617070726f7665640000000000604482015290519081900360640190fd5b73ffffffffffffffffffffffffffffffffffffffff831673eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee1415611b385760405160009073ffffffffffffffffffffffffffffffffffffffff83169084908381818185875af1925050503d8060008114611abd576040519150601f19603f3d011682016040523d82523d6000602084013e611ac2565b606091505b5050905080611b3257604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601360248201527f776974686472617720657468206661696c656400000000000000000000000000604482015290519081900360640190fd5b50611bb9565b6000611b4384612800565b905073ffffffffffffffffffffffffffffffffffffffff8116301415611b8f57611b8a73ffffffffffffffffffffffffffffffffffffffff8516838563ffffffff6138b816565b611bb7565b611bb773ffffffffffffffffffffffffffffffffffffffff851682848663ffffffff61394a16565b505b8073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff167fb67719fc33c1f17d31bf3a698690d62066b1e0bae28fcd3c56cf2c015c2863d6846040518082815260200191505060405180910390a3505050565b3360009081526004602052604090205460ff16611ca157604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600c60248201527f6f6e6c7920616c65727465720000000000000000000000000000000000000000604482015290519081900360640190fd5b600a80547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00169055604080516000815290517f7d7f00509dd73ac4449f698ae75ccc797895eff5fa9d446d3df387598a26e7359181900360200190a1565b60095460009073ffffffffffffffffffffffffffffffffffffffff163314611d8857604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600c60248201527f77726f6e672073656e6465720000000000000000000000000000000000000000604482015290519081900360640190fd5b611d90614a78565b5060408051606081018252600a5460ff8082161515808452610100830490911615156020840152620100009091046fffffffffffffffffffffffffffffffff169282019290925290611e4357604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601060248201527f7472616465206e6f7420656e61626c6500000000000000000000000000000000604482015290519081900360640190fd5b80604001516fffffffffffffffffffffffffffffffff163a1115611ec857604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601260248201527f67617320707269636520746f6f20686967680000000000000000000000000000604482015290519081900360640190fd5b611eda888888888886602001516139e5565b506001979650505050505050565b60015473ffffffffffffffffffffffffffffffffffffffff163314611f6e57604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600a60248201527f6f6e6c792061646d696e00000000000000000000000000000000000000000000604482015290519081900360640190fd5b73ffffffffffffffffffffffffffffffffffffffff8116611ff057604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600b60248201527f6e65772061646d696e2030000000000000000000000000000000000000000000604482015290519081900360640190fd5b6040805173ffffffffffffffffffffffffffffffffffffffff8316815290517f3b81caf78fa51ecbc8acb482fd7012a277b428d9b80f9d156e8a54107496cc409181900360200190a1600280547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff92909216919091179055565b60025473ffffffffffffffffffffffffffffffffffffffff16331461210657604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600b60248201527f6e6f742070656e64696e67000000000000000000000000000000000000000000604482015290519081900360640190fd5b6002546001546040805173ffffffffffffffffffffffffffffffffffffffff938416815292909116602083015280517f65da1cfc2c2e81576ad96afb24a581f8e109b7a403b35cbd3243a1c99efdb9ed9281900390910190a160028054600180547fffffffffffffffffffffffff000000000000000000000000000000000000000090811673ffffffffffffffffffffffffffffffffffffffff841617909155169055565b60015473ffffffffffffffffffffffffffffffffffffffff16331461223157604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600a60248201527f6f6e6c792061646d696e00000000000000000000000000000000000000000000604482015290519081900360640190fd5b73ffffffffffffffffffffffffffffffffffffffff81166122b357604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600760248201527f61646d696e203000000000000000000000000000000000000000000000000000604482015290519081900360640190fd5b6040805173ffffffffffffffffffffffffffffffffffffffff8316815290517f3b81caf78fa51ecbc8acb482fd7012a277b428d9b80f9d156e8a54107496cc409181900360200190a16001546040805173ffffffffffffffffffffffffffffffffffffffff8085168252909216602083015280517f65da1cfc2c2e81576ad96afb24a581f8e109b7a403b35cbd3243a1c99efdb9ed9281900390910190a1600180547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff92909216919091179055565b606060068054806020026020016040519081016040528092919081815260200182805480156111315760200282019190600052602060002090815473ffffffffffffffffffffffffffffffffffffffff168152600190910190602001808311611106575050505050905090565b600061240f614a78565b5060408051606081018252600a5460ff8082161515808452610100830490911615156020840152620100009091046fffffffffffffffffffffffffffffffff169282019290925290612465576000915050612703565b80604001516fffffffffffffffffffffffffffffffff163a111561248d576000915050612703565b8361249c576000915050612703565b60008073eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee73ffffffffffffffffffffffffffffffffffffffff891614156124dc57508590506001612525565b73eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee73ffffffffffffffffffffffffffffffffffffffff8816141561251957508690506000612525565b60009350505050612703565b600b54604080517fb8e9c22e00000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff8581166004830152602482018990528415156044830152606482018a90529151600093929092169163b8e9c22e91608480820192602092909190829003018186803b1580156125b257600080fd5b505afa9250505080156125d757506040513d60208110156125d257600080fd5b505160015b6125e8576000945050505050612703565b905060006125f88a8a8a85614303565b9050806126048a6133a2565b101561261857600095505050505050612703565b600c5473ffffffffffffffffffffffffffffffffffffffff16156126fc57600c54604080517fa58092b700000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff8d811660048301528c811660248301529151600093929092169163a58092b791604480820192602092909190829003018186803b1580156126b557600080fd5b505afa1580156126c9573d6000803e3d6000fd5b505050506040513d60208110156126df57600080fd5b50519050808311156126fa5760009650505050505050612703565b505b5093505050505b949350505050565b60015473ffffffffffffffffffffffffffffffffffffffff16331461279157604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600a60248201527f6f6e6c792061646d696e00000000000000000000000000000000000000000000604482015290519081900360640190fd5b600c80547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff83169081179091556040517faa5a0552d43d8d9e7d64c0286bcfceeccb1875e7320c1ac63f71e9894f17716690600090a250565b600073ffffffffffffffffffffffffffffffffffffffff821673eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee146128605773ffffffffffffffffffffffffffffffffffffffff8083166000908152600860205260409020541661288c565b600d5473ffffffffffffffffffffffffffffffffffffffff908116600090815260086020526040902054165b905073ffffffffffffffffffffffffffffffffffffffff81166128ac5750305b919050565b60015473ffffffffffffffffffffffffffffffffffffffff16331461293757604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600a60248201527f6f6e6c792061646d696e00000000000000000000000000000000000000000000604482015290519081900360640190fd5b73ffffffffffffffffffffffffffffffffffffffff811660009081526003602052604090205460ff16156129cc57604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600f60248201527f6f70657261746f72206578697374730000000000000000000000000000000000604482015290519081900360640190fd5b600554603211612a3d57604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600d60248201527f6d6178206f70657261746f727300000000000000000000000000000000000000604482015290519081900360640190fd5b6040805173ffffffffffffffffffffffffffffffffffffffff831681526001602082015281517f091a7a4b85135fdd7e8dbc18b12fabe5cc191ea867aa3c2e1a24a102af61d58b929181900390910190a173ffffffffffffffffffffffffffffffffffffffff16600081815260036020526040812080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff001660019081179091556005805491820181559091527f036b6384b5eca791c62761152d0c79bb0604c104a5fb6f4eb0703f3154bb3db00180547fffffffffffffffffffffffff0000000000000000000000000000000000000000169091179055565b604080517fffffffffffffffffffffffffffffffffffffffff000000000000000000000000606094851b81166020808401919091529390941b9093166034840152805160288185030181526048909301815282519282019290922060009081526007909152205460ff1690565b60086020526000908152604090205473ffffffffffffffffffffffffffffffffffffffff1681565b60015473ffffffffffffffffffffffffffffffffffffffff163314612c5257604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600a60248201527f6f6e6c792061646d696e00000000000000000000000000000000000000000000604482015290519081900360640190fd5b73ffffffffffffffffffffffffffffffffffffffff811660009081526003602052604090205460ff16612ce657604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600c60248201527f6e6f74206f70657261746f720000000000000000000000000000000000000000604482015290519081900360640190fd5b73ffffffffffffffffffffffffffffffffffffffff8116600090815260036020526040812080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff001690555b600554811015610f57578173ffffffffffffffffffffffffffffffffffffffff1660058281548110612d6057fe5b60009182526020909120015473ffffffffffffffffffffffffffffffffffffffff161415612ef057600580547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8101908110612db857fe5b6000918252602090912001546005805473ffffffffffffffffffffffffffffffffffffffff9092169183908110612deb57fe5b9060005260206000200160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055506005805480612e3e57fe5b6000828152602080822083017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff90810180547fffffffffffffffffffffffff00000000000000000000000000000000000000001690559092019092556040805173ffffffffffffffffffffffffffffffffffffffff861681529182019290925281517f091a7a4b85135fdd7e8dbc18b12fabe5cc191ea867aa3c2e1a24a102af61d58b929181900390910190a1610f57565b600101612d32565b60095473ffffffffffffffffffffffffffffffffffffffff1681565b60015473ffffffffffffffffffffffffffffffffffffffff163314612f9a57604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600a60248201527f6f6e6c792061646d696e00000000000000000000000000000000000000000000604482015290519081900360640190fd5b73ffffffffffffffffffffffffffffffffffffffff811661301c57604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600660248201527f7765746820300000000000000000000000000000000000000000000000000000604482015290519081900360640190fd5b600d80547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff83169081179091556040517fff8ab24f675c1eee431de04d5ba93b5d6e1e947359771788c5db3968d10c2e3e90600090a250565b3360009081526003602052604090205460ff1661310957604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600d60248201527f6f6e6c79206f70657261746f7200000000000000000000000000000000000000604482015290519081900360640190fd5b600a80546fffffffffffffffffffffffffffffffff83166201000081027fffffffffffffffffffffffffffff00000000000000000000000000000000ffff9092169190911790915560408051918252517f951ddb0e961044819fc0750a51148b147386ae97b72d9b6763f9b943de116e329181900360200190a150565b60015473ffffffffffffffffffffffffffffffffffffffff16331461320c57604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600a60248201527f6f6e6c792061646d696e00000000000000000000000000000000000000000000604482015290519081900360640190fd5b60405160009073ffffffffffffffffffffffffffffffffffffffff83169084908381818185875af1925050503d8060008114613264576040519150601f19603f3d011682016040523d82523d6000602084013e613269565b606091505b50509050806132d957604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600f60248201527f7769746864726177206661696c65640000000000000000000000000000000000604482015290519081900360640190fd5b6040805184815273ffffffffffffffffffffffffffffffffffffffff8416602082015281517fec47e7ed86c86774d1a72c19f35c639911393fe7c1a34031fdbd260890da90de929181900390910190a1505050565b600b5473ffffffffffffffffffffffffffffffffffffffff1681565b600a5460ff1690565b60076020526000908152604090205460ff1681565b600a546201000090046fffffffffffffffffffffffffffffffff1690565b60015473ffffffffffffffffffffffffffffffffffffffff1681565b6000806133ae83612800565b9050600073ffffffffffffffffffffffffffffffffffffffff841673eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee141561342b5773ffffffffffffffffffffffffffffffffffffffff821630141561340c5747925050506128ac565b50600d5473ffffffffffffffffffffffffffffffffffffffff166134ee565b73ffffffffffffffffffffffffffffffffffffffff82163014156134eb57604080517f70a08231000000000000000000000000000000000000000000000000000000008152306004820152905173ffffffffffffffffffffffffffffffffffffffff8616916370a08231916024808301926020929190829003018186803b1580156134b557600080fd5b505afa1580156134c9573d6000803e3d6000fd5b505050506040513d60208110156134df57600080fd5b505192506128ac915050565b50825b60008173ffffffffffffffffffffffffffffffffffffffff166370a08231846040518263ffffffff1660e01b8152600401808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060206040518083038186803b15801561356d57600080fd5b505afa158015613581573d6000803e3d6000fd5b505050506040513d602081101561359757600080fd5b5051604080517fdd62ed3e00000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff868116600483015230602483015291519293506000929185169163dd62ed3e91604480820192602092909190829003018186803b15801561361557600080fd5b505afa158015613629573d6000803e3d6000fd5b505050506040513d602081101561363f57600080fd5b5051905061364d828261432a565b9695505050505050565b60015473ffffffffffffffffffffffffffffffffffffffff1633146136dd57604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600a60248201527f6f6e6c792061646d696e00000000000000000000000000000000000000000000604482015290519081900360640190fd5b73ffffffffffffffffffffffffffffffffffffffff811661375f57604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601160248201527f636f6e76657273696f6e52617465732030000000000000000000000000000000604482015290519081900360640190fd5b600b80547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff83169081179091556040517f333c220e52469bea5ce17b670353e10868f0c96768325592128e44d06e5b99cc90600090a250565b60006137d982614342565b905080156137e6576128ac565b5073ffffffffffffffffffffffffffffffffffffffff8116600090815260208190526040902054806128ac578173ffffffffffffffffffffffffffffffffffffffff1663313ce5676040518163ffffffff1660e01b815260040160206040518083038186803b15801561385857600080fd5b505afa15801561386c573d6000803e3d6000fd5b505050506040513d602081101561388257600080fd5b505173ffffffffffffffffffffffffffffffffffffffff92909216600090815260208190526040902060ff909216918290555090565b6040805173ffffffffffffffffffffffffffffffffffffffff8416602482015260448082018490528251808303909101815260649091019091526020810180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167fa9059cbb000000000000000000000000000000000000000000000000000000001790526139459084906144a8565b505050565b6040805173ffffffffffffffffffffffffffffffffffffffff80861660248301528416604482015260648082018490528251808303909101815260849091019091526020810180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167f23b872dd000000000000000000000000000000000000000000000000000000001790526139df9085906144a8565b50505050565b60008211613a5457604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600960248201527f7261746520697320300000000000000000000000000000000000000000000000604482015290519081900360640190fd5b73ffffffffffffffffffffffffffffffffffffffff861673eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee148015613afa57853414613af557604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600f60248201527f77726f6e67206d73672076616c75650000000000000000000000000000000000604482015290519081900360640190fd5b613b67565b3415613b6757604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600d60248201527f626164206d73672076616c756500000000000000000000000000000000000000604482015290519081900360640190fd5b8115613dc957600b5460009073ffffffffffffffffffffffffffffffffffffffff1663b8e9c22e83613b995789613b9b565b875b604080517fffffffff0000000000000000000000000000000000000000000000000000000060e085901b16815273ffffffffffffffffffffffffffffffffffffffff90921660048301524360248301528515156044830152606482018b9052516084808301926020929190829003018186803b158015613c1a57600080fd5b505afa158015613c2e573d6000803e3d6000fd5b505050506040513d6020811015613c4457600080fd5b5051905083811015613ca1576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252602e815260200180614ac4602e913960400191505060405180910390fd5b600c5473ffffffffffffffffffffffffffffffffffffffff1615613dc757600c54604080517fa58092b700000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff8b8116600483015289811660248301529151600093929092169163a58092b791604480820192602092909190829003018186803b158015613d3e57600080fd5b505afa158015613d52573d6000803e3d6000fd5b505050506040513d6020811015613d6857600080fd5b5051905080821115613dc5576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252602b815260200180614a99602b913960400191505060405180910390fd5b505b505b6000613dd788878987614303565b905060008111613e4857604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601060248201527f6465737420616d6f756e74206973203000000000000000000000000000000000604482015290519081900360640190fd5b6000613e5389612800565b90506000613e6088612800565b9050831561404957600b54604080517fc6fd210300000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff8b8116600483015260248201879052600060448301819052436064840152925193169263c6fd21039260848084019391929182900301818387803b158015613eee57600080fd5b505af1158015613f02573d6000803e3d6000fd5b5050505073ffffffffffffffffffffffffffffffffffffffff82163014613fd257600d60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663d0e30db0346040518263ffffffff1660e01b81526004016000604051808303818588803b158015613f8d57600080fd5b505af1158015613fa1573d6000803e3d6000fd5b5050600d54613fd2935073ffffffffffffffffffffffffffffffffffffffff1691508490503463ffffffff6138b816565b73ffffffffffffffffffffffffffffffffffffffff811630141561401c5761401773ffffffffffffffffffffffffffffffffffffffff8916888563ffffffff6138b816565b614044565b61404473ffffffffffffffffffffffffffffffffffffffff891682898663ffffffff61394a16565b614298565b600b54604080517fc6fd210300000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff8d8116600483015260008d8103602484015260448301819052436064840152925193169263c6fd21039260848084019391929182900301818387803b1580156140d057600080fd5b505af11580156140e4573d6000803e3d6000fd5b5061410b9250505073ffffffffffffffffffffffffffffffffffffffff8b1633848c61394a565b73ffffffffffffffffffffffffffffffffffffffff811630146141df57600d546141539073ffffffffffffffffffffffffffffffffffffffff1682308663ffffffff61394a16565b600d54604080517f2e1a7d4d00000000000000000000000000000000000000000000000000000000815260048101869052905173ffffffffffffffffffffffffffffffffffffffff90921691632e1a7d4d9160248082019260009290919082900301818387803b1580156141c657600080fd5b505af11580156141da573d6000803e3d6000fd5b505050505b60405160009073ffffffffffffffffffffffffffffffffffffffff89169085908381818185875af1925050503d8060008114614237576040519150601f19603f3d011682016040523d82523d6000602084013e61423c565b606091505b5050905080614296576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252602f815260200180614af2602f913960400191505060405180910390fd5b505b604080518a81526020810185905273ffffffffffffffffffffffffffffffffffffffff898116828401529151828b16928d169133917fea9415385bae08fe9f6dc457b02577166790cde83bb18cc340aac6cb81b824de9181900360600190a450505050505050505050565b60006143218361431287614580565b61431b87614580565b85614646565b95945050505050565b6000818311614339578261433b565b815b9392505050565b600073ffffffffffffffffffffffffffffffffffffffff821673eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee141561437e575060126128ac565b73ffffffffffffffffffffffffffffffffffffffff821673dac17f958d2ee523a2206206994597c13d831ec714156143b8575060066128ac565b73ffffffffffffffffffffffffffffffffffffffff8216736b175474e89094c44da98b954eedeac495271d0f14156143f2575060126128ac565b73ffffffffffffffffffffffffffffffffffffffff821673a0b86991c6218b36c1d19d4a2e9eb0ce3606eb48141561442c575060066128ac565b73ffffffffffffffffffffffffffffffffffffffff8216732260fac5e5542a773aa44fbcfedf7c193bc2c5991415614466575060086128ac565b73ffffffffffffffffffffffffffffffffffffffff821673dd974d5c2e2928dea5f71b9825b8b646686bd20014156144a0575060126128ac565b5060006128ac565b606061450a826040518060400160405280602081526020017f5361666545524332303a206c6f772d6c6576656c2063616c6c206661696c65648152508573ffffffffffffffffffffffffffffffffffffffff1661485e9092919063ffffffff16565b8051909150156139455780806020019051602081101561452957600080fd5b5051613945576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252602a815260200180614b21602a913960400191505060405180910390fd5b600061458b82614342565b90508015614598576128ac565b5073ffffffffffffffffffffffffffffffffffffffff81166000908152602081905260409020548061463e578173ffffffffffffffffffffffffffffffffffffffff1663313ce5676040518163ffffffff1660e01b815260040160206040518083038186803b15801561460a57600080fd5b505afa15801561461e573d6000803e3d6000fd5b505050506040513d602081101561463457600080fd5b505160ff16614640565b805b92915050565b60006b204fce5e3e250261100000008511156146c357604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601060248201527f737263517479203e204d41585f51545900000000000000000000000000000000604482015290519081900360640190fd5b6a084595161401484a00000082111561473d57604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600f60248201527f72617465203e204d41585f524154450000000000000000000000000000000000604482015290519081900360640190fd5b8383106147d257601284840311156147b657604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601860248201527f647374202d20737263203e204d41585f444543494d414c530000000000000000604482015290519081900360640190fd5b670de0b6b3a7640000858302858503600a0a025b049050612703565b6012838503111561484457604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601860248201527f737263202d20647374203e204d41585f444543494d414c530000000000000000604482015290519081900360640190fd5b828403600a0a670de0b6b3a764000002828602816147ca57fe5b60606127038484600085606061487385614a72565b6148de57604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601d60248201527f416464726573733a2063616c6c20746f206e6f6e2d636f6e7472616374000000604482015290519081900360640190fd5b600060608673ffffffffffffffffffffffffffffffffffffffff1685876040518082805190602001908083835b6020831061494857805182527fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0909201916020918201910161490b565b6001836020036101000a03801982511681845116808217855250505050505090500191505060006040518083038185875af1925050503d80600081146149aa576040519150601f19603f3d011682016040523d82523d6000602084013e6149af565b606091505b509150915081156149c35791506127039050565b8051156149d35780518082602001fd5b836040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825283818151815260200191508051906020019080838360005b83811015614a37578181015183820152602001614a1f565b50505050905090810190601f168015614a645780820380516001836020036101000a031916815260200191505b509250505060405180910390fd5b3b151590565b60408051606081018252600080825260208201819052918101919091529056fe726174652073686f756c64206e6f742062652067726561746572207468616e2073616e6974792072617465726573657276652072617465206c6f776572207468656e206e6574776f726b2072657175657374656420726174657472616e73666572206574682066726f6d207265736572766520746f206465737441646472657373206661696c65645361666545524332303a204552433230206f7065726174696f6e20646964206e6f742073756363656564a264697066735822122056da272ef4295da6cec17b0a5d38c2cdcfe95d737676734550a14cdc90e660b464736f6c634300060600330000000000000000000000009cb7bb6d4795a281860b9bfb7b1441361cc9a79400000000000000000000000015a91a091648162a042bced9c9c407835fd779e9000000000000000000000000c02aaa39b223fe8d0a0e5c4f27ead9083c756cc20000000000000000000000000000000000000000000000000000003a35294400000000000000000000000000000000000000000000000000000000000000000100000000000000000000000055cc797743275e9c0c3593e5ccfd94c3abe91106

Deployed Bytecode

0x6080604052600436106102a35760003560e01c80637acc86781161016e578063b8d1452f116100cb578063d7b7024d1161007f578063f851a44011610064578063f851a44014610aae578063f8b2cb4f14610ac3578063fa30728114610b03576102f4565b8063d7b7024d14610a4a578063ef3881c814610a74576102f4565b8063ce56c454116100b0578063ce56c454146109da578063d5847d3314610a20578063d621e81314610a35576102f4565b8063b8d1452f1461095e578063cac1d6491461099e576102f4565b80639870d7fe11610122578063a80cbac611610107578063a80cbac6146108c9578063ac8a584a14610909578063b78b842d14610949576102f4565b80639870d7fe14610841578063a56bb95b14610881576102f4565b80637cd44272116101535780637cd442721461076b57806380f4da8b146107c157806385d7502514610801576102f4565b80637acc8678146107165780637c423f5414610756576102f4565b8063408ee7fe1161021c57806369328dec116101d05780636cf69811116101b55780636cf698111461066857806375829def146106c157806377f50f9714610701576102f4565b806369328dec146106035780636940030f14610653576102f4565b8063546dc71c11610201578063546dc71c1461054557806354869d201461059757806354a325a6146105c3576102f4565b8063408ee7fe146104f057806347e6924f14610530576102f4565b8063249d39e91161027357806327a099d81161025857806327a099d8146104265780633ccdbb281461048b5780633fc8cef3146104db576102f4565b8063249d39e9146103c157806326782247146103e8576102f4565b806299d386146102f957806301a12fd3146103105780630299c694146103505780631bc7bfec14610379576102f4565b366102f45760408051348152905173eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee917f2d0c0a8842b9944ece1495eb61121621b5e36bd6af3bba0318c695f525aef79f919081900360200190a2005b600080fd5b34801561030557600080fd5b5061030e610b43565b005b34801561031c57600080fd5b5061030e6004803603602081101561033357600080fd5b503573ffffffffffffffffffffffffffffffffffffffff16610c2b565b34801561035c57600080fd5b50610365610f5b565b604080519115158252519081900360200190f35b34801561038557600080fd5b5061030e6004803603604081101561039c57600080fd5b5073ffffffffffffffffffffffffffffffffffffffff81358116916020013516610f69565b3480156103cd57600080fd5b506103d66110aa565b60408051918252519081900360200190f35b3480156103f457600080fd5b506103fd6110b0565b6040805173ffffffffffffffffffffffffffffffffffffffff9092168252519081900360200190f35b34801561043257600080fd5b5061043b6110cc565b60408051602080825283518183015283519192839290830191858101910280838360005b8381101561047757818101518382015260200161045f565b505050509050019250505060405180910390f35b34801561049757600080fd5b5061030e600480360360608110156104ae57600080fd5b5073ffffffffffffffffffffffffffffffffffffffff81358116916020810135916040909101351661113b565b3480156104e757600080fd5b506103fd611244565b3480156104fc57600080fd5b5061030e6004803603602081101561051357600080fd5b503573ffffffffffffffffffffffffffffffffffffffff16611260565b34801561053c57600080fd5b506103fd6114e6565b34801561055157600080fd5b5061030e6004803603606081101561056857600080fd5b5073ffffffffffffffffffffffffffffffffffffffff8135811691602081013590911690604001351515611502565b3480156105a357600080fd5b5061030e600480360360208110156105ba57600080fd5b50351515611678565b3480156105cf57600080fd5b5061030e600480360360208110156105e657600080fd5b503573ffffffffffffffffffffffffffffffffffffffff1661176a565b34801561060f57600080fd5b5061030e6004803603606081101561062657600080fd5b5073ffffffffffffffffffffffffffffffffffffffff8135811691602081013591604090910135166118e1565b34801561065f57600080fd5b5061030e611c23565b610365600480360360c081101561067e57600080fd5b5073ffffffffffffffffffffffffffffffffffffffff8135811691602081013591604082013581169160608101359091169060808101359060a001351515611cff565b3480156106cd57600080fd5b5061030e600480360360208110156106e457600080fd5b503573ffffffffffffffffffffffffffffffffffffffff16611ee8565b34801561070d57600080fd5b5061030e612080565b34801561072257600080fd5b5061030e6004803603602081101561073957600080fd5b503573ffffffffffffffffffffffffffffffffffffffff166121ab565b34801561076257600080fd5b5061043b612398565b34801561077757600080fd5b506103d66004803603608081101561078e57600080fd5b5073ffffffffffffffffffffffffffffffffffffffff813581169160208101359091169060408101359060600135612405565b3480156107cd57600080fd5b5061030e600480360360208110156107e457600080fd5b503573ffffffffffffffffffffffffffffffffffffffff1661270b565b34801561080d57600080fd5b506103fd6004803603602081101561082457600080fd5b503573ffffffffffffffffffffffffffffffffffffffff16612800565b34801561084d57600080fd5b5061030e6004803603602081101561086457600080fd5b503573ffffffffffffffffffffffffffffffffffffffff166128b1565b34801561088d57600080fd5b50610365600480360360408110156108a457600080fd5b5073ffffffffffffffffffffffffffffffffffffffff81358116916020013516612b37565b3480156108d557600080fd5b506103fd600480360360208110156108ec57600080fd5b503573ffffffffffffffffffffffffffffffffffffffff16612ba4565b34801561091557600080fd5b5061030e6004803603602081101561092c57600080fd5b503573ffffffffffffffffffffffffffffffffffffffff16612bcc565b34801561095557600080fd5b506103fd612ef8565b34801561096a57600080fd5b5061030e6004803603602081101561098157600080fd5b503573ffffffffffffffffffffffffffffffffffffffff16612f14565b3480156109aa57600080fd5b5061030e600480360360208110156109c157600080fd5b50356fffffffffffffffffffffffffffffffff1661308b565b3480156109e657600080fd5b5061030e600480360360408110156109fd57600080fd5b508035906020013573ffffffffffffffffffffffffffffffffffffffff16613186565b348015610a2c57600080fd5b506103fd61332e565b348015610a4157600080fd5b5061036561334a565b348015610a5657600080fd5b5061036560048036036020811015610a6d57600080fd5b5035613353565b348015610a8057600080fd5b50610a89613368565b604080516fffffffffffffffffffffffffffffffff9092168252519081900360200190f35b348015610aba57600080fd5b506103fd613386565b348015610acf57600080fd5b506103d660048036036020811015610ae657600080fd5b503573ffffffffffffffffffffffffffffffffffffffff166133a2565b348015610b0f57600080fd5b5061030e60048036036020811015610b2657600080fd5b503573ffffffffffffffffffffffffffffffffffffffff16613657565b60015473ffffffffffffffffffffffffffffffffffffffff163314610bc957604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600a60248201527f6f6e6c792061646d696e00000000000000000000000000000000000000000000604482015290519081900360640190fd5b600a80547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0016600190811790915560408051918252517f7d7f00509dd73ac4449f698ae75ccc797895eff5fa9d446d3df387598a26e7359181900360200190a1565b60015473ffffffffffffffffffffffffffffffffffffffff163314610cb157604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600a60248201527f6f6e6c792061646d696e00000000000000000000000000000000000000000000604482015290519081900360640190fd5b73ffffffffffffffffffffffffffffffffffffffff811660009081526004602052604090205460ff16610d4557604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600b60248201527f6e6f7420616c6572746572000000000000000000000000000000000000000000604482015290519081900360640190fd5b73ffffffffffffffffffffffffffffffffffffffff8116600090815260046020526040812080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff001690555b600654811015610f57578173ffffffffffffffffffffffffffffffffffffffff1660068281548110610dbf57fe5b60009182526020909120015473ffffffffffffffffffffffffffffffffffffffff161415610f4f57600680547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8101908110610e1757fe5b6000918252602090912001546006805473ffffffffffffffffffffffffffffffffffffffff9092169183908110610e4a57fe5b9060005260206000200160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055506006805480610e9d57fe5b6000828152602080822083017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff90810180547fffffffffffffffffffffffff00000000000000000000000000000000000000001690559092019092556040805173ffffffffffffffffffffffffffffffffffffffff861681529182019290925281517f5611bf3e417d124f97bf2c788843ea8bb502b66079fbee02158ef30b172cb762929181900390910190a1610f57565b600101610d91565b5050565b600a54610100900460ff1690565b60015473ffffffffffffffffffffffffffffffffffffffff163314610fef57604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600a60248201527f6f6e6c792061646d696e00000000000000000000000000000000000000000000604482015290519081900360640190fd5b73ffffffffffffffffffffffffffffffffffffffff828116600090815260086020526040902080547fffffffffffffffffffffffff00000000000000000000000000000000000000001691831691909117905561104b826137ce565b508073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff167f81995c7b922889ac0a81e41866106d4046268ea3a9abaae9f9e080a6ce36ee7d60405160405180910390a35050565b61271081565b60025473ffffffffffffffffffffffffffffffffffffffff1681565b6060600580548060200260200160405190810160405280929190818152602001828054801561113157602002820191906000526020600020905b815473ffffffffffffffffffffffffffffffffffffffff168152600190910190602001808311611106575b5050505050905090565b60015473ffffffffffffffffffffffffffffffffffffffff1633146111c157604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600a60248201527f6f6e6c792061646d696e00000000000000000000000000000000000000000000604482015290519081900360640190fd5b6111e873ffffffffffffffffffffffffffffffffffffffff8416828463ffffffff6138b816565b6040805173ffffffffffffffffffffffffffffffffffffffff80861682526020820185905283168183015290517f72cb8a894ddb372ceec3d2a7648d86f17d5a15caae0e986c53109b8a9a9385e69181900360600190a1505050565b600d5473ffffffffffffffffffffffffffffffffffffffff1681565b60015473ffffffffffffffffffffffffffffffffffffffff1633146112e657604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600a60248201527f6f6e6c792061646d696e00000000000000000000000000000000000000000000604482015290519081900360640190fd5b73ffffffffffffffffffffffffffffffffffffffff811660009081526004602052604090205460ff161561137b57604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600e60248201527f616c657274657220657869737473000000000000000000000000000000000000604482015290519081900360640190fd5b6006546032116113ec57604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600c60248201527f6d617820616c6572746572730000000000000000000000000000000000000000604482015290519081900360640190fd5b6040805173ffffffffffffffffffffffffffffffffffffffff831681526001602082015281517f5611bf3e417d124f97bf2c788843ea8bb502b66079fbee02158ef30b172cb762929181900390910190a173ffffffffffffffffffffffffffffffffffffffff16600081815260046020526040812080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff001660019081179091556006805491820181559091527ff652222313e28459528d920b65115c16c04f3efc82aaedc97be59f3f377c0d3f0180547fffffffffffffffffffffffff0000000000000000000000000000000000000000169091179055565b600c5473ffffffffffffffffffffffffffffffffffffffff1681565b60015473ffffffffffffffffffffffffffffffffffffffff16331461158857604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600a60248201527f6f6e6c792061646d696e00000000000000000000000000000000000000000000604482015290519081900360640190fd5b60408051606085811b7fffffffffffffffffffffffffffffffffffffffff0000000000000000000000009081166020808501919091529186901b1660348301528251808303602801815260489092018352815191810191909120600090815260079091522080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0016821515179055611620836137ce565b50604080518215158152905173ffffffffffffffffffffffffffffffffffffffff80851692908616917fd5fd5351efae1f4bb760079da9f0ff9589e2c3e216337ca9d39cdff573b245c49181900360200190a3505050565b60015473ffffffffffffffffffffffffffffffffffffffff1633146116fe57604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600a60248201527f6f6e6c792061646d696e00000000000000000000000000000000000000000000604482015290519081900360640190fd5b600a805482151561010081027fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00ff9092169190911790915560408051918252517f89db626a89e1048b2c196cafdaf6158cfd934276037ba2d562a154b661aaa2e79181900360200190a150565b60015473ffffffffffffffffffffffffffffffffffffffff1633146117f057604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600a60248201527f6f6e6c792061646d696e00000000000000000000000000000000000000000000604482015290519081900360640190fd5b73ffffffffffffffffffffffffffffffffffffffff811661187257604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600e60248201527f6b796265724e6574776f726b2030000000000000000000000000000000000000604482015290519081900360640190fd5b600980547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff83169081179091556040517f379acac7823b50b8ac0626f4b125da7f930be2a6abd7e43d9a75198a8ec00eb890600090a250565b3360009081526003602052604090205460ff1661195f57604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600d60248201527f6f6e6c79206f70657261746f7200000000000000000000000000000000000000604482015290519081900360640190fd5b60408051606085811b7fffffffffffffffffffffffffffffffffffffffff0000000000000000000000009081166020808501919091529185901b166034830152825180830360280181526048909201835281519181019190912060009081526007909152205460ff16611a3357604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601b60248201527f64657374696e6174696f6e206973206e6f7420617070726f7665640000000000604482015290519081900360640190fd5b73ffffffffffffffffffffffffffffffffffffffff831673eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee1415611b385760405160009073ffffffffffffffffffffffffffffffffffffffff83169084908381818185875af1925050503d8060008114611abd576040519150601f19603f3d011682016040523d82523d6000602084013e611ac2565b606091505b5050905080611b3257604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601360248201527f776974686472617720657468206661696c656400000000000000000000000000604482015290519081900360640190fd5b50611bb9565b6000611b4384612800565b905073ffffffffffffffffffffffffffffffffffffffff8116301415611b8f57611b8a73ffffffffffffffffffffffffffffffffffffffff8516838563ffffffff6138b816565b611bb7565b611bb773ffffffffffffffffffffffffffffffffffffffff851682848663ffffffff61394a16565b505b8073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff167fb67719fc33c1f17d31bf3a698690d62066b1e0bae28fcd3c56cf2c015c2863d6846040518082815260200191505060405180910390a3505050565b3360009081526004602052604090205460ff16611ca157604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600c60248201527f6f6e6c7920616c65727465720000000000000000000000000000000000000000604482015290519081900360640190fd5b600a80547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00169055604080516000815290517f7d7f00509dd73ac4449f698ae75ccc797895eff5fa9d446d3df387598a26e7359181900360200190a1565b60095460009073ffffffffffffffffffffffffffffffffffffffff163314611d8857604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600c60248201527f77726f6e672073656e6465720000000000000000000000000000000000000000604482015290519081900360640190fd5b611d90614a78565b5060408051606081018252600a5460ff8082161515808452610100830490911615156020840152620100009091046fffffffffffffffffffffffffffffffff169282019290925290611e4357604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601060248201527f7472616465206e6f7420656e61626c6500000000000000000000000000000000604482015290519081900360640190fd5b80604001516fffffffffffffffffffffffffffffffff163a1115611ec857604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601260248201527f67617320707269636520746f6f20686967680000000000000000000000000000604482015290519081900360640190fd5b611eda888888888886602001516139e5565b506001979650505050505050565b60015473ffffffffffffffffffffffffffffffffffffffff163314611f6e57604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600a60248201527f6f6e6c792061646d696e00000000000000000000000000000000000000000000604482015290519081900360640190fd5b73ffffffffffffffffffffffffffffffffffffffff8116611ff057604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600b60248201527f6e65772061646d696e2030000000000000000000000000000000000000000000604482015290519081900360640190fd5b6040805173ffffffffffffffffffffffffffffffffffffffff8316815290517f3b81caf78fa51ecbc8acb482fd7012a277b428d9b80f9d156e8a54107496cc409181900360200190a1600280547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff92909216919091179055565b60025473ffffffffffffffffffffffffffffffffffffffff16331461210657604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600b60248201527f6e6f742070656e64696e67000000000000000000000000000000000000000000604482015290519081900360640190fd5b6002546001546040805173ffffffffffffffffffffffffffffffffffffffff938416815292909116602083015280517f65da1cfc2c2e81576ad96afb24a581f8e109b7a403b35cbd3243a1c99efdb9ed9281900390910190a160028054600180547fffffffffffffffffffffffff000000000000000000000000000000000000000090811673ffffffffffffffffffffffffffffffffffffffff841617909155169055565b60015473ffffffffffffffffffffffffffffffffffffffff16331461223157604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600a60248201527f6f6e6c792061646d696e00000000000000000000000000000000000000000000604482015290519081900360640190fd5b73ffffffffffffffffffffffffffffffffffffffff81166122b357604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600760248201527f61646d696e203000000000000000000000000000000000000000000000000000604482015290519081900360640190fd5b6040805173ffffffffffffffffffffffffffffffffffffffff8316815290517f3b81caf78fa51ecbc8acb482fd7012a277b428d9b80f9d156e8a54107496cc409181900360200190a16001546040805173ffffffffffffffffffffffffffffffffffffffff8085168252909216602083015280517f65da1cfc2c2e81576ad96afb24a581f8e109b7a403b35cbd3243a1c99efdb9ed9281900390910190a1600180547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff92909216919091179055565b606060068054806020026020016040519081016040528092919081815260200182805480156111315760200282019190600052602060002090815473ffffffffffffffffffffffffffffffffffffffff168152600190910190602001808311611106575050505050905090565b600061240f614a78565b5060408051606081018252600a5460ff8082161515808452610100830490911615156020840152620100009091046fffffffffffffffffffffffffffffffff169282019290925290612465576000915050612703565b80604001516fffffffffffffffffffffffffffffffff163a111561248d576000915050612703565b8361249c576000915050612703565b60008073eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee73ffffffffffffffffffffffffffffffffffffffff891614156124dc57508590506001612525565b73eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee73ffffffffffffffffffffffffffffffffffffffff8816141561251957508690506000612525565b60009350505050612703565b600b54604080517fb8e9c22e00000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff8581166004830152602482018990528415156044830152606482018a90529151600093929092169163b8e9c22e91608480820192602092909190829003018186803b1580156125b257600080fd5b505afa9250505080156125d757506040513d60208110156125d257600080fd5b505160015b6125e8576000945050505050612703565b905060006125f88a8a8a85614303565b9050806126048a6133a2565b101561261857600095505050505050612703565b600c5473ffffffffffffffffffffffffffffffffffffffff16156126fc57600c54604080517fa58092b700000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff8d811660048301528c811660248301529151600093929092169163a58092b791604480820192602092909190829003018186803b1580156126b557600080fd5b505afa1580156126c9573d6000803e3d6000fd5b505050506040513d60208110156126df57600080fd5b50519050808311156126fa5760009650505050505050612703565b505b5093505050505b949350505050565b60015473ffffffffffffffffffffffffffffffffffffffff16331461279157604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600a60248201527f6f6e6c792061646d696e00000000000000000000000000000000000000000000604482015290519081900360640190fd5b600c80547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff83169081179091556040517faa5a0552d43d8d9e7d64c0286bcfceeccb1875e7320c1ac63f71e9894f17716690600090a250565b600073ffffffffffffffffffffffffffffffffffffffff821673eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee146128605773ffffffffffffffffffffffffffffffffffffffff8083166000908152600860205260409020541661288c565b600d5473ffffffffffffffffffffffffffffffffffffffff908116600090815260086020526040902054165b905073ffffffffffffffffffffffffffffffffffffffff81166128ac5750305b919050565b60015473ffffffffffffffffffffffffffffffffffffffff16331461293757604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600a60248201527f6f6e6c792061646d696e00000000000000000000000000000000000000000000604482015290519081900360640190fd5b73ffffffffffffffffffffffffffffffffffffffff811660009081526003602052604090205460ff16156129cc57604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600f60248201527f6f70657261746f72206578697374730000000000000000000000000000000000604482015290519081900360640190fd5b600554603211612a3d57604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600d60248201527f6d6178206f70657261746f727300000000000000000000000000000000000000604482015290519081900360640190fd5b6040805173ffffffffffffffffffffffffffffffffffffffff831681526001602082015281517f091a7a4b85135fdd7e8dbc18b12fabe5cc191ea867aa3c2e1a24a102af61d58b929181900390910190a173ffffffffffffffffffffffffffffffffffffffff16600081815260036020526040812080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff001660019081179091556005805491820181559091527f036b6384b5eca791c62761152d0c79bb0604c104a5fb6f4eb0703f3154bb3db00180547fffffffffffffffffffffffff0000000000000000000000000000000000000000169091179055565b604080517fffffffffffffffffffffffffffffffffffffffff000000000000000000000000606094851b81166020808401919091529390941b9093166034840152805160288185030181526048909301815282519282019290922060009081526007909152205460ff1690565b60086020526000908152604090205473ffffffffffffffffffffffffffffffffffffffff1681565b60015473ffffffffffffffffffffffffffffffffffffffff163314612c5257604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600a60248201527f6f6e6c792061646d696e00000000000000000000000000000000000000000000604482015290519081900360640190fd5b73ffffffffffffffffffffffffffffffffffffffff811660009081526003602052604090205460ff16612ce657604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600c60248201527f6e6f74206f70657261746f720000000000000000000000000000000000000000604482015290519081900360640190fd5b73ffffffffffffffffffffffffffffffffffffffff8116600090815260036020526040812080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff001690555b600554811015610f57578173ffffffffffffffffffffffffffffffffffffffff1660058281548110612d6057fe5b60009182526020909120015473ffffffffffffffffffffffffffffffffffffffff161415612ef057600580547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8101908110612db857fe5b6000918252602090912001546005805473ffffffffffffffffffffffffffffffffffffffff9092169183908110612deb57fe5b9060005260206000200160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055506005805480612e3e57fe5b6000828152602080822083017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff90810180547fffffffffffffffffffffffff00000000000000000000000000000000000000001690559092019092556040805173ffffffffffffffffffffffffffffffffffffffff861681529182019290925281517f091a7a4b85135fdd7e8dbc18b12fabe5cc191ea867aa3c2e1a24a102af61d58b929181900390910190a1610f57565b600101612d32565b60095473ffffffffffffffffffffffffffffffffffffffff1681565b60015473ffffffffffffffffffffffffffffffffffffffff163314612f9a57604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600a60248201527f6f6e6c792061646d696e00000000000000000000000000000000000000000000604482015290519081900360640190fd5b73ffffffffffffffffffffffffffffffffffffffff811661301c57604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600660248201527f7765746820300000000000000000000000000000000000000000000000000000604482015290519081900360640190fd5b600d80547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff83169081179091556040517fff8ab24f675c1eee431de04d5ba93b5d6e1e947359771788c5db3968d10c2e3e90600090a250565b3360009081526003602052604090205460ff1661310957604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600d60248201527f6f6e6c79206f70657261746f7200000000000000000000000000000000000000604482015290519081900360640190fd5b600a80546fffffffffffffffffffffffffffffffff83166201000081027fffffffffffffffffffffffffffff00000000000000000000000000000000ffff9092169190911790915560408051918252517f951ddb0e961044819fc0750a51148b147386ae97b72d9b6763f9b943de116e329181900360200190a150565b60015473ffffffffffffffffffffffffffffffffffffffff16331461320c57604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600a60248201527f6f6e6c792061646d696e00000000000000000000000000000000000000000000604482015290519081900360640190fd5b60405160009073ffffffffffffffffffffffffffffffffffffffff83169084908381818185875af1925050503d8060008114613264576040519150601f19603f3d011682016040523d82523d6000602084013e613269565b606091505b50509050806132d957604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600f60248201527f7769746864726177206661696c65640000000000000000000000000000000000604482015290519081900360640190fd5b6040805184815273ffffffffffffffffffffffffffffffffffffffff8416602082015281517fec47e7ed86c86774d1a72c19f35c639911393fe7c1a34031fdbd260890da90de929181900390910190a1505050565b600b5473ffffffffffffffffffffffffffffffffffffffff1681565b600a5460ff1690565b60076020526000908152604090205460ff1681565b600a546201000090046fffffffffffffffffffffffffffffffff1690565b60015473ffffffffffffffffffffffffffffffffffffffff1681565b6000806133ae83612800565b9050600073ffffffffffffffffffffffffffffffffffffffff841673eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee141561342b5773ffffffffffffffffffffffffffffffffffffffff821630141561340c5747925050506128ac565b50600d5473ffffffffffffffffffffffffffffffffffffffff166134ee565b73ffffffffffffffffffffffffffffffffffffffff82163014156134eb57604080517f70a08231000000000000000000000000000000000000000000000000000000008152306004820152905173ffffffffffffffffffffffffffffffffffffffff8616916370a08231916024808301926020929190829003018186803b1580156134b557600080fd5b505afa1580156134c9573d6000803e3d6000fd5b505050506040513d60208110156134df57600080fd5b505192506128ac915050565b50825b60008173ffffffffffffffffffffffffffffffffffffffff166370a08231846040518263ffffffff1660e01b8152600401808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060206040518083038186803b15801561356d57600080fd5b505afa158015613581573d6000803e3d6000fd5b505050506040513d602081101561359757600080fd5b5051604080517fdd62ed3e00000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff868116600483015230602483015291519293506000929185169163dd62ed3e91604480820192602092909190829003018186803b15801561361557600080fd5b505afa158015613629573d6000803e3d6000fd5b505050506040513d602081101561363f57600080fd5b5051905061364d828261432a565b9695505050505050565b60015473ffffffffffffffffffffffffffffffffffffffff1633146136dd57604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600a60248201527f6f6e6c792061646d696e00000000000000000000000000000000000000000000604482015290519081900360640190fd5b73ffffffffffffffffffffffffffffffffffffffff811661375f57604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601160248201527f636f6e76657273696f6e52617465732030000000000000000000000000000000604482015290519081900360640190fd5b600b80547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff83169081179091556040517f333c220e52469bea5ce17b670353e10868f0c96768325592128e44d06e5b99cc90600090a250565b60006137d982614342565b905080156137e6576128ac565b5073ffffffffffffffffffffffffffffffffffffffff8116600090815260208190526040902054806128ac578173ffffffffffffffffffffffffffffffffffffffff1663313ce5676040518163ffffffff1660e01b815260040160206040518083038186803b15801561385857600080fd5b505afa15801561386c573d6000803e3d6000fd5b505050506040513d602081101561388257600080fd5b505173ffffffffffffffffffffffffffffffffffffffff92909216600090815260208190526040902060ff909216918290555090565b6040805173ffffffffffffffffffffffffffffffffffffffff8416602482015260448082018490528251808303909101815260649091019091526020810180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167fa9059cbb000000000000000000000000000000000000000000000000000000001790526139459084906144a8565b505050565b6040805173ffffffffffffffffffffffffffffffffffffffff80861660248301528416604482015260648082018490528251808303909101815260849091019091526020810180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167f23b872dd000000000000000000000000000000000000000000000000000000001790526139df9085906144a8565b50505050565b60008211613a5457604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600960248201527f7261746520697320300000000000000000000000000000000000000000000000604482015290519081900360640190fd5b73ffffffffffffffffffffffffffffffffffffffff861673eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee148015613afa57853414613af557604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600f60248201527f77726f6e67206d73672076616c75650000000000000000000000000000000000604482015290519081900360640190fd5b613b67565b3415613b6757604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600d60248201527f626164206d73672076616c756500000000000000000000000000000000000000604482015290519081900360640190fd5b8115613dc957600b5460009073ffffffffffffffffffffffffffffffffffffffff1663b8e9c22e83613b995789613b9b565b875b604080517fffffffff0000000000000000000000000000000000000000000000000000000060e085901b16815273ffffffffffffffffffffffffffffffffffffffff90921660048301524360248301528515156044830152606482018b9052516084808301926020929190829003018186803b158015613c1a57600080fd5b505afa158015613c2e573d6000803e3d6000fd5b505050506040513d6020811015613c4457600080fd5b5051905083811015613ca1576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252602e815260200180614ac4602e913960400191505060405180910390fd5b600c5473ffffffffffffffffffffffffffffffffffffffff1615613dc757600c54604080517fa58092b700000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff8b8116600483015289811660248301529151600093929092169163a58092b791604480820192602092909190829003018186803b158015613d3e57600080fd5b505afa158015613d52573d6000803e3d6000fd5b505050506040513d6020811015613d6857600080fd5b5051905080821115613dc5576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252602b815260200180614a99602b913960400191505060405180910390fd5b505b505b6000613dd788878987614303565b905060008111613e4857604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601060248201527f6465737420616d6f756e74206973203000000000000000000000000000000000604482015290519081900360640190fd5b6000613e5389612800565b90506000613e6088612800565b9050831561404957600b54604080517fc6fd210300000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff8b8116600483015260248201879052600060448301819052436064840152925193169263c6fd21039260848084019391929182900301818387803b158015613eee57600080fd5b505af1158015613f02573d6000803e3d6000fd5b5050505073ffffffffffffffffffffffffffffffffffffffff82163014613fd257600d60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663d0e30db0346040518263ffffffff1660e01b81526004016000604051808303818588803b158015613f8d57600080fd5b505af1158015613fa1573d6000803e3d6000fd5b5050600d54613fd2935073ffffffffffffffffffffffffffffffffffffffff1691508490503463ffffffff6138b816565b73ffffffffffffffffffffffffffffffffffffffff811630141561401c5761401773ffffffffffffffffffffffffffffffffffffffff8916888563ffffffff6138b816565b614044565b61404473ffffffffffffffffffffffffffffffffffffffff891682898663ffffffff61394a16565b614298565b600b54604080517fc6fd210300000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff8d8116600483015260008d8103602484015260448301819052436064840152925193169263c6fd21039260848084019391929182900301818387803b1580156140d057600080fd5b505af11580156140e4573d6000803e3d6000fd5b5061410b9250505073ffffffffffffffffffffffffffffffffffffffff8b1633848c61394a565b73ffffffffffffffffffffffffffffffffffffffff811630146141df57600d546141539073ffffffffffffffffffffffffffffffffffffffff1682308663ffffffff61394a16565b600d54604080517f2e1a7d4d00000000000000000000000000000000000000000000000000000000815260048101869052905173ffffffffffffffffffffffffffffffffffffffff90921691632e1a7d4d9160248082019260009290919082900301818387803b1580156141c657600080fd5b505af11580156141da573d6000803e3d6000fd5b505050505b60405160009073ffffffffffffffffffffffffffffffffffffffff89169085908381818185875af1925050503d8060008114614237576040519150601f19603f3d011682016040523d82523d6000602084013e61423c565b606091505b5050905080614296576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252602f815260200180614af2602f913960400191505060405180910390fd5b505b604080518a81526020810185905273ffffffffffffffffffffffffffffffffffffffff898116828401529151828b16928d169133917fea9415385bae08fe9f6dc457b02577166790cde83bb18cc340aac6cb81b824de9181900360600190a450505050505050505050565b60006143218361431287614580565b61431b87614580565b85614646565b95945050505050565b6000818311614339578261433b565b815b9392505050565b600073ffffffffffffffffffffffffffffffffffffffff821673eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee141561437e575060126128ac565b73ffffffffffffffffffffffffffffffffffffffff821673dac17f958d2ee523a2206206994597c13d831ec714156143b8575060066128ac565b73ffffffffffffffffffffffffffffffffffffffff8216736b175474e89094c44da98b954eedeac495271d0f14156143f2575060126128ac565b73ffffffffffffffffffffffffffffffffffffffff821673a0b86991c6218b36c1d19d4a2e9eb0ce3606eb48141561442c575060066128ac565b73ffffffffffffffffffffffffffffffffffffffff8216732260fac5e5542a773aa44fbcfedf7c193bc2c5991415614466575060086128ac565b73ffffffffffffffffffffffffffffffffffffffff821673dd974d5c2e2928dea5f71b9825b8b646686bd20014156144a0575060126128ac565b5060006128ac565b606061450a826040518060400160405280602081526020017f5361666545524332303a206c6f772d6c6576656c2063616c6c206661696c65648152508573ffffffffffffffffffffffffffffffffffffffff1661485e9092919063ffffffff16565b8051909150156139455780806020019051602081101561452957600080fd5b5051613945576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252602a815260200180614b21602a913960400191505060405180910390fd5b600061458b82614342565b90508015614598576128ac565b5073ffffffffffffffffffffffffffffffffffffffff81166000908152602081905260409020548061463e578173ffffffffffffffffffffffffffffffffffffffff1663313ce5676040518163ffffffff1660e01b815260040160206040518083038186803b15801561460a57600080fd5b505afa15801561461e573d6000803e3d6000fd5b505050506040513d602081101561463457600080fd5b505160ff16614640565b805b92915050565b60006b204fce5e3e250261100000008511156146c357604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601060248201527f737263517479203e204d41585f51545900000000000000000000000000000000604482015290519081900360640190fd5b6a084595161401484a00000082111561473d57604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600f60248201527f72617465203e204d41585f524154450000000000000000000000000000000000604482015290519081900360640190fd5b8383106147d257601284840311156147b657604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601860248201527f647374202d20737263203e204d41585f444543494d414c530000000000000000604482015290519081900360640190fd5b670de0b6b3a7640000858302858503600a0a025b049050612703565b6012838503111561484457604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601860248201527f737263202d20647374203e204d41585f444543494d414c530000000000000000604482015290519081900360640190fd5b828403600a0a670de0b6b3a764000002828602816147ca57fe5b60606127038484600085606061487385614a72565b6148de57604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601d60248201527f416464726573733a2063616c6c20746f206e6f6e2d636f6e7472616374000000604482015290519081900360640190fd5b600060608673ffffffffffffffffffffffffffffffffffffffff1685876040518082805190602001908083835b6020831061494857805182527fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0909201916020918201910161490b565b6001836020036101000a03801982511681845116808217855250505050505090500191505060006040518083038185875af1925050503d80600081146149aa576040519150601f19603f3d011682016040523d82523d6000602084013e6149af565b606091505b509150915081156149c35791506127039050565b8051156149d35780518082602001fd5b836040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825283818151815260200191508051906020019080838360005b83811015614a37578181015183820152602001614a1f565b50505050905090810190601f168015614a645780820380516001836020036101000a031916815260200191505b509250505060405180910390fd5b3b151590565b60408051606081018252600080825260208201819052918101919091529056fe726174652073686f756c64206e6f742062652067726561746572207468616e2073616e6974792072617465726573657276652072617465206c6f776572207468656e206e6574776f726b2072657175657374656420726174657472616e73666572206574682066726f6d207265736572766520746f206465737441646472657373206661696c65645361666545524332303a204552433230206f7065726174696f6e20646964206e6f742073756363656564a264697066735822122056da272ef4295da6cec17b0a5d38c2cdcfe95d737676734550a14cdc90e660b464736f6c63430006060033

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

0000000000000000000000009cb7bb6d4795a281860b9bfb7b1441361cc9a79400000000000000000000000015a91a091648162a042bced9c9c407835fd779e9000000000000000000000000c02aaa39b223fe8d0a0e5c4f27ead9083c756cc20000000000000000000000000000000000000000000000000000003a35294400000000000000000000000000000000000000000000000000000000000000000100000000000000000000000055cc797743275e9c0c3593e5ccfd94c3abe91106

-----Decoded View---------------
Arg [0] : _kyberNetwork (address): 0x9CB7bB6D4795A281860b9Bfb7B1441361Cc9A794
Arg [1] : _ratesContract (address): 0x15a91A091648162a042bCEd9C9C407835fd779e9
Arg [2] : _weth (address): 0xC02aaA39b223FE8D0A0e5C4F27eAD9083C756Cc2
Arg [3] : _maxGasPriceWei (uint128): 250000000000
Arg [4] : _doRateValidation (bool): True
Arg [5] : _admin (address): 0x55CC797743275e9c0c3593E5cCfD94c3ABe91106

-----Encoded View---------------
6 Constructor Arguments found :
Arg [0] : 0000000000000000000000009cb7bb6d4795a281860b9bfb7b1441361cc9a794
Arg [1] : 00000000000000000000000015a91a091648162a042bced9c9c407835fd779e9
Arg [2] : 000000000000000000000000c02aaa39b223fe8d0a0e5c4f27ead9083c756cc2
Arg [3] : 0000000000000000000000000000000000000000000000000000003a35294400
Arg [4] : 0000000000000000000000000000000000000000000000000000000000000001
Arg [5] : 00000000000000000000000055cc797743275e9c0c3593e5ccfd94c3abe91106


Deployed Bytecode Sourcemap

33169:14057:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;35560:42;;;35592:9;35560:42;;;;5263;;35560;;;;;;;;;;33169:14057;;12:1:-1;9;2:12;36352:125:0;;5:9:-1;2:2;;;27:1;24;17:12;2:2;36352:125:0;;;:::i;:::-;;30404:482;;5:9:-1;2:2;;;27:1;24;17:12;2:2;30404:482:0;;;;;;15:2:-1;10:3;7:11;4:2;;;31:1;28;21:12;4:2;-1:-1;30404:482:0;;;;:::i;41702:110::-;;5:9:-1;2:2;;;27:1;24;17:12;2:2;41702:110:0;;;:::i;:::-;;;;;;;;;;;;;;;;;;37588:208;;5:9:-1;2:2;;;27:1;24;17:12;2:2;37588:208:0;;;;;;15:2:-1;10:3;7:11;4:2;;;31:1;28;21:12;4:2;-1:-1;37588:208:0;;;;;;;;;;;:::i;5942:35::-;;5:9:-1;2:2;;;27:1;24;17:12;2:2;5942:35:0;;;:::i;:::-;;;;;;;;;;;;;;;;27810:27;;5:9:-1;2:2;;;27:1;24;17:12;2:2;27810:27:0;;;:::i;:::-;;;;;;;;;;;;;;;;;;;28715:105;;5:9:-1;2:2;;;27:1;24;17:12;2:2;28715:105:0;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;8:100:-1;33:3;30:1;27:10;8:100;;;90:11;;;84:18;71:11;;;64:39;52:2;45:10;8:100;;;12:14;28715:105:0;;;;;;;;;;;;;;;;;32291:230;;5:9:-1;2:2;;;27:1;24;17:12;2:2;32291:230:0;;;;;;15:2:-1;10:3;7:11;4:2;;;31:1;28;21:12;4:2;-1:-1;32291:230:0;;;;;;;;;;;;;;;;;;:::i;33807:17::-;;5:9:-1;2:2;;;27:1;24;17:12;2:2;33807:17:0;;;:::i;30049:347::-;;5:9:-1;2:2;;;27:1;24;17:12;2:2;30049:347:0;;;;;;15:2:-1;10:3;7:11;4:2;;;31:1;28;21:12;4:2;-1:-1;30049:347:0;;;;:::i;33761:39::-;;5:9:-1;2:2;;;27:1;24;17:12;2:2;33761:39:0;;;:::i;37016:328::-;;5:9:-1;2:2;;;27:1;24;17:12;2:2;37016:328:0;;;;;;15:2:-1;10:3;7:11;4:2;;;31:1;28;21:12;4:2;-1:-1;37016:328:0;;;;;;;;;;;;;;;;;;;;:::i;36812:196::-;;5:9:-1;2:2;;;27:1;24;17:12;2:2;36812:196:0;;;;;;15:2:-1;10:3;7:11;4:2;;;31:1;28;21:12;4:2;-1:-1;36812:196:0;;;;:::i;38922:224::-;;5:9:-1;2:2;;;27:1;24;17:12;2:2;38922:224:0;;;;;;15:2:-1;10:3;7:11;4:2;;;31:1;28;21:12;4:2;-1:-1;38922:224:0;;;;:::i;38089:825::-;;5:9:-1;2:2;;;27:1;24;17:12;2:2;38089:825:0;;;;;;15:2:-1;10:3;7:11;4:2;;;31:1;28;21:12;4:2;-1:-1;38089:825:0;;;;;;;;;;;;;;;;;;:::i;36485:130::-;;5:9:-1;2:2;;;27:1;24;17:12;2:2;36485:130:0;;;:::i;35618:726::-;;;;;;15:3:-1;10;7:12;4:2;;;32:1;29;22:12;4:2;-1:-1;35618:726:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;29090:203::-;;5:9:-1;2:2;;;27:1;24;17:12;2:2;29090:203:0;;;;;;15:2:-1;10:3;7:11;4:2;;;31:1;28;21:12;4:2;-1:-1;29090:203:0;;;;:::i;29827:214::-;;5:9:-1;2:2;;;27:1;24;17:12;2:2;29827:214:0;;;:::i;29474:244::-;;5:9:-1;2:2;;;27:1;24;17:12;2:2;29474:244:0;;;;;;15:2:-1;10:3;7:11;4:2;;;31:1;28;21:12;4:2;-1:-1;29474:244:0;;;;:::i;28828:103::-;;5:9:-1;2:2;;;27:1;24;17:12;2:2;28828:103:0;;;:::i;39982:1243::-;;5:9:-1;2:2;;;27:1;24;17:12;2:2;39982:1243:0;;;;;;15:3:-1;10;7:12;4:2;;;32:1;29;22:12;4:2;-1:-1;39982:1243:0;;;;;;;;;;;;;;;;;;;;;;;:::i;39808:166::-;;5:9:-1;2:2;;;27:1;24;17:12;2:2;39808:166:0;;;;;;15:2:-1;10:3;7:11;4:2;;;31:1;28;21:12;4:2;-1:-1;39808:166:0;;;;:::i;43251:304::-;;5:9:-1;2:2;;;27:1;24;17:12;2:2;43251:304:0;;;;;;15:2:-1;10:3;7:11;4:2;;;31:1;28;21:12;4:2;-1:-1;43251:304:0;;;;:::i;30894:360::-;;5:9:-1;2:2;;;27:1;24;17:12;2:2;30894:360:0;;;;;;15:2:-1;10:3;7:11;4:2;;;31:1;28;21:12;4:2;-1:-1;30894:360:0;;;;:::i;41233:234::-;;5:9:-1;2:2;;;27:1;24;17:12;2:2;41233:234:0;;;;;;15:2:-1;10:3;7:11;4:2;;;31:1;28;21:12;4:2;-1:-1;41233:234:0;;;;;;;;;;;:::i;33405:46::-;;5:9:-1;2:2;;;27:1;24;17:12;2:2;33405:46:0;;;;;;15:2:-1;10:3;7:11;4:2;;;31:1;28;21:12;4:2;-1:-1;33405:46:0;;;;:::i;31262:498::-;;5:9:-1;2:2;;;27:1;24;17:12;2:2;31262:498:0;;;;;;15:2:-1;10:3;7:11;4:2;;;31:1;28;21:12;4:2;-1:-1;31262:498:0;;;;:::i;33634:27::-;;5:9:-1;2:2;;;27:1;24;17:12;2:2;33634:27:0;;;:::i;39543:176::-;;5:9:-1;2:2;;;27:1;24;17:12;2:2;39543:176:0;;;;;;15:2:-1;10:3;7:11;4:2;;;31:1;28;21:12;4:2;-1:-1;39543:176:0;;;;:::i;36623:181::-;;5:9:-1;2:2;;;27:1;24;17:12;2:2;36623:181:0;;;;;;15:2:-1;10:3;7:11;4:2;;;31:1;28;21:12;4:2;-1:-1;36623:181:0;;;;:::i;32576:241::-;;5:9:-1;2:2;;;27:1;24;17:12;2:2;32576:241:0;;;;;;15:2:-1;10:3;7:11;4:2;;;31:1;28;21:12;4:2;-1:-1;32576:241:0;;;;;;;;;:::i;33707:47::-;;5:9:-1;2:2;;;27:1;24;17:12;2:2;33707:47:0;;;:::i;41475:102::-;;5:9:-1;2:2;;;27:1;24;17:12;2:2;41475:102:0;;;:::i;33312:57::-;;5:9:-1;2:2;;;27:1;24;17:12;2:2;33312:57:0;;;;;;15:2:-1;10:3;7:11;4:2;;;31:1;28;21:12;4:2;-1:-1;33312:57:0;;:::i;41585:109::-;;5:9:-1;2:2;;;27:1;24;17:12;2:2;41585:109:0;;;:::i;:::-;;;;;;;;;;;;;;;;;;;27783:20;;5:9:-1;2:2;;;27:1;24;17:12;2:2;27783:20:0;;;:::i;42122:942::-;;5:9:-1;2:2;;;27:1;24;17:12;2:2;42122:942:0;;;;;;15:2:-1;10:3;7:11;4:2;;;31:1;28;21:12;4:2;-1:-1;42122:942:0;;;;:::i;39154:288::-;;5:9:-1;2:2;;;27:1;24;17:12;2:2;39154:288:0;;;;;;15:2:-1;10:3;7:11;4:2;;;31:1;28;21:12;4:2;-1:-1;39154:288:0;;;;:::i;36352:125::-;28450:5;;;;28436:10;:19;28428:42;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;36405:10:::1;:30:::0;;;::::1;36431:4;36405:30:::0;;::::1;::::0;;;36451:18:::1;::::0;;;;;;::::1;::::0;;;;::::1;::::0;;::::1;36352:125::o:0;30404:482::-;28450:5;;;;28436:10;:19;28428:42;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;30480:17:::1;::::0;::::1;;::::0;;;:8:::1;:17;::::0;;;;;::::1;;30472:41;;;::::0;;::::1;::::0;;::::1;;::::0;::::1;::::0;::::1;::::0;;;;::::1;::::0;;;;;;;;;;;;;::::1;;30524:17;::::0;::::1;30544:5;30524:17:::0;;;:8:::1;:17;::::0;;;;:25;;;::::1;::::0;;30562:317:::1;30586:13;:20:::0;30582:24;::::1;30562:317;;;30652:7;30632:27;;:13;30646:1;30632:16;;;;;;;;;::::0;;;::::1;::::0;;;::::1;::::0;::::1;;:27;30628:240;;;30699:13;30713:20:::0;;:24;;;;30699:39;::::1;;;;;;::::0;;;::::1;::::0;;;::::1;::::0;30680:13:::1;:16:::0;;30699:39:::1;::::0;;::::1;::::0;30694:1;;30680:16;::::1;;;;;;;;;;;;;:58;;;;;;;;;;;;;;;;;;30757:13;:19;;;;;;;;::::0;;;::::1;::::0;;;;;;;;;;;;::::1;::::0;;;;;;;;30800:28:::1;::::0;;30757:19:::1;30800:28:::0;::::1;::::0;;;;::::1;::::0;;;;;;::::1;::::0;;;;;;;;;::::1;30847:5;;30628:240;30608:3;;30562:317;;;;30404:482:::0;:::o;41702:110::-;41777:10;:27;;;;;;;41702:110::o;37588:208::-;28450:5;;;;28436:10;:19;28428:42;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;37675:27:::1;::::0;;::::1;;::::0;;;:11:::1;:27;::::0;;;;:36;;;::::1;::::0;;::::1;::::0;;;::::1;::::0;;37722:21:::1;37675:27:::0;37722:14:::1;:21::i;:::-;;37781:6;37759:29;;37774:5;37759:29;;;;;;;;;;;;37588:208:::0;;:::o;5942:35::-;5972:5;5942:35;:::o;27810:27::-;;;;;;:::o;28715:105::-;28762:16;28798:14;28791:21;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;28715:105;:::o;32291:230::-;28450:5;;;;28436:10;:19;28428:42;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;32427:34:::1;:18;::::0;::::1;32446:6:::0;32454;32427:34:::1;:18;:34;:::i;:::-;32477:36;::::0;;::::1;::::0;;::::1;::::0;;::::1;::::0;::::1;::::0;;;;::::1;::::0;;;;;;::::1;::::0;;;;;;;::::1;32291:230:::0;;;:::o;33807:17::-;;;;;;:::o;30049:347::-;28450:5;;;;28436:10;:19;28428:42;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;30126:20:::1;::::0;::::1;;::::0;;;:8:::1;:20;::::0;;;;;::::1;;30125:21;30117:48;;;::::0;;::::1;::::0;;::::1;;::::0;::::1;::::0;::::1;::::0;;;;::::1;::::0;;;;;;;;;;;;;::::1;;30207:13;:20:::0;27772:2:::1;-1:-1:-1::0;30199:62:0::1;;;::::0;;::::1;::::0;;::::1;;::::0;::::1;::::0;::::1;::::0;;;;::::1;::::0;;;;;;;;;;;;;::::1;;30279:30;::::0;;::::1;::::0;::::1;::::0;;30304:4:::1;30279:30;::::0;::::1;::::0;;;::::1;::::0;;;;;;;;;::::1;30320:20;;;::::0;;;:8:::1;:20;::::0;;;;:27;;;::::1;30343:4;30320:27:::0;;::::1;::::0;;;30358:13:::1;27:10:-1::0;;23:18;;::::1;45:23:::0;;30358:30:0;;;;::::1;::::0;;;::::1;::::0;;::::1;::::0;;30049:347::o;33761:39::-;;;;;;:::o;37016:328::-;28450:5;;;;28436:10;:19;28428:42;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;37193:38:::1;::::0;;::::1;::::0;;;;;;;::::1;::::0;;::::1;::::0;;;;;;;;;;;;;;;26:21:-1;;;22:32;;6:49;;37193:38:0;;;;;;37183:49;;;;::::1;::::0;;;;-1:-1:-1;37157:76:0;;;:25:::1;:76:::0;;;;:86;;;::::1;::::0;::::1;;;::::0;;37254:21:::1;37193:38:::0;37254:14:::1;:21::i;:::-;-1:-1:-1::0;37291:45:0::1;::::0;;;::::1;;::::0;;;;::::1;::::0;;::::1;::::0;;;::::1;::::0;::::1;::::0;;;;::::1;::::0;;::::1;37016:328:::0;;;:::o;36812:196::-;28450:5;;;;28436:10;:19;28428:42;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;36895:10:::1;:47:::0;;;::::1;;;::::0;::::1;::::0;;;::::1;::::0;;;::::1;::::0;;;36958:42:::1;::::0;;;;;;::::1;::::0;;;;::::1;::::0;;::::1;36812:196:::0;:::o;38922:224::-;28450:5;;;;28436:10;:19;28428:42;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;39006:25:::1;::::0;::::1;38998:52;;;::::0;;::::1;::::0;;::::1;;::::0;::::1;::::0;::::1;::::0;;;;::::1;::::0;;;;;;;;;;;;;::::1;;39061:12;:26:::0;;;::::1;;::::0;::::1;::::0;;::::1;::::0;;;39103:35:::1;::::0;::::1;::::0;-1:-1:-1;;39103:35:0::1;38922:224:::0;:::o;38089:825::-;28551:10;28541:21;;;;:9;:21;;;;;;;;28533:47;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;38286:45:::1;::::0;;::::1;::::0;;;;;;;::::1;::::0;;::::1;::::0;;;;;;;;;;;;;;;26:21:-1;;;22:32;;6:49;;38286:45:0;;;;;;38276:56;;;;::::1;::::0;;;;-1:-1:-1;38250:83:0;;;:25:::1;:83:::0;;;;;::::1;;38228:160;;;::::0;;::::1;::::0;;::::1;;::::0;::::1;::::0;::::1;::::0;;;;::::1;::::0;;;;;;;;;;;;;::::1;;38405:26;::::0;::::1;5263:42;38405:26;38401:447;;;38467:35;::::0;38449:12:::1;::::0;38467:16:::1;::::0;::::1;::::0;38491:6;;38449:12;38467:35;38449:12;38467:35;38491:6;38467:16;:35:::1;;;;;;;12:1:-1;19;14:27;;;;67:4;61:11;56:16;;134:4;130:9;123:4;105:16;101:27;97:43;94:1;90:51;84:4;77:65;157:16;154:1;147:27;211:16;208:1;201:4;198:1;194:12;179:49;5:228;;14:27;32:4;27:9;;5:228;;38448:54:0;;;38525:7;38517:39;;;::::0;;::::1;::::0;;::::1;;::::0;::::1;::::0;::::1;::::0;;;;::::1;::::0;;;;;;;;;;;;;::::1;;38401:447;;;;38589:14;38606:21;38621:5;38606:14;:21::i;:::-;38589:38:::0;-1:-1:-1;38646:23:0::1;::::0;::::1;38664:4;38646:23;38642:195;;;38690:39;:18;::::0;::::1;38709:11:::0;38722:6;38690:39:::1;:18;:39;:::i;:::-;38642:195;;;38770:51;:22;::::0;::::1;38793:6:::0;38801:11;38814:6;38770:51:::1;:22;:51;:::i;:::-;38401:447;;38894:11;38865:41;;38879:5;38865:41;;;38886:6;38865:41;;;;;;;;;;;;;;;;;;38089:825:::0;;;:::o;36485:130::-;28659:10;28650:20;;;;:8;:20;;;;;;;;28642:45;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;36541:10:::1;:31:::0;;;::::1;::::0;;36588:19:::1;::::0;;36567:5:::1;36588:19:::0;;;;::::1;::::0;;;;::::1;::::0;;::::1;36485:130::o:0;35618:726::-;35902:12;;35863:4;;35902:12;;35888:10;:26;35880:51;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;35942:22;;:::i;:::-;-1:-1:-1;35942:35:0;;;;;;;;35967:10;35942:35;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;35988:46;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;36076:4;:19;;;36068:28;;36053:11;:43;;36045:74;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;36132:180;36154:8;36177:9;36201;36225:11;36251:14;36280:4;:21;;;36132:7;:180::i;:::-;-1:-1:-1;36332:4:0;;35618:726;-1:-1:-1;;;;;;;35618:726:0:o;29090:203::-;28450:5;;;;28436:10;:19;28428:42;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;29167:22:::1;::::0;::::1;29159:46;;;::::0;;::::1;::::0;;::::1;;::::0;::::1;::::0;::::1;::::0;;;;::::1;::::0;;;;;;;;;;;;;::::1;;29221:30;::::0;;::::1;::::0;::::1;::::0;;;;::::1;::::0;;;;::::1;::::0;;::::1;29262:12;:23:::0;;;::::1;;::::0;;;::::1;::::0;;;::::1;::::0;;29090:203::o;29827:214::-;29875:12;;:26;:12;29891:10;29875:26;29867:50;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;29946:12;;;29960:5;29933:33;;;29946:12;;;;29933:33;;29960:5;;;;29933:33;;;;;;;;;;;;;;;;29985:12;;;;29977:20;;;;;;29985:12;;;29977:20;;;;30008:25;;;29827:214::o;29474:244::-;28450:5;;;;28436:10;:19;28428:42;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;29558:22:::1;::::0;::::1;29550:42;;;::::0;;::::1;::::0;;::::1;;::::0;::::1;::::0;::::1;::::0;;;;::::1;::::0;;;;;;;;;;;;;::::1;;29608:30;::::0;;::::1;::::0;::::1;::::0;;;;::::1;::::0;;;;::::1;::::0;;::::1;29677:5;::::0;29654:29:::1;::::0;;29677:5:::1;29654:29:::0;;::::1;::::0;;29677:5;;::::1;29654:29;::::0;::::1;::::0;;;::::1;::::0;;;;;;;;::::1;29694:5;:16:::0;;;::::1;;::::0;;;::::1;::::0;;;::::1;::::0;;29474:244::o;28828:103::-;28874:16;28910:13;28903:20;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;28828:103;:::o;39982:1243::-;40152:7;40172:22;;:::i;:::-;-1:-1:-1;40172:35:0;;;;;;;;40197:10;40172:35;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;40218:32;;40249:1;40242:8;;;;;40218:32;40287:4;:19;;;40279:28;;40265:11;:42;40261:56;;;40316:1;40309:8;;;;;40261:56;40332:11;40328:25;;40352:1;40345:8;;;;;40328:25;40366:15;;5263:42;40419:24;;;;40415:262;;;-1:-1:-1;40495:4:0;;-1:-1:-1;40468:4:0;40415:262;;;5263:42;40521:25;;;;40517:160;;;-1:-1:-1;40599:3:0;;-1:-1:-1;40571:5:0;40517:160;;;40642:1;40635:8;;;;;;;40517:160;40716:23;;:66;;;;;;:23;:66;;;;;;;;;;;;;;;;;;;;;;;;;;;;40689:12;;40716:23;;;;;:31;;:66;;;;;;;;;;;;;;;:23;:66;;;2:2:-1;;;;27:1;24;17:12;2:2;40716:66:0;;;;;;;;;;;;;;;15:2:-1;10:3;7:11;4:2;;;31:1;28;21:12;4:2;-1:-1;40716:66:0;;;40712:167;;40866:1;40859:8;;;;;;;;40712:167;40824:1;-1:-1:-1;40889:15:0;40907:39;40922:3;40927:4;40933:6;40941:4;40907:14;:39::i;:::-;40889:57;;40982:7;40963:16;40974:4;40963:10;:16::i;:::-;:26;40959:40;;;40998:1;40991:8;;;;;;;;;40959:40;41016:19;;:38;:19;:38;41012:182;;41092:19;;:44;;;;;;:19;:44;;;;;;;;;;;;;;;;41071:18;;41092:19;;;;;:33;;:44;;;;;;;;;;;;;;;:19;:44;;;2:2:-1;;;;27:1;24;17:12;2:2;41092:44:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;41092:44:0;;;;;;;15:2:-1;10:3;7:11;4:2;;;31:1;28;21:12;4:2;-1:-1;41092:44:0;;-1:-1:-1;41155:17:0;;;41151:31;;;41181:1;41174:8;;;;;;;;;;41151:31;41012:182;;-1:-1:-1;41213:4:0;-1:-1:-1;;;;39982:1243:0;;;;;;;:::o;39808:166::-;28450:5;;;;28436:10;:19;28428:42;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;39886:19:::1;:32:::0;;;::::1;;::::0;::::1;::::0;;::::1;::::0;;;39934::::1;::::0;::::1;::::0;-1:-1:-1;;39934:32:0::1;39808:166:::0;:::o;43251:304::-;43313:14;43350:26;;;5263:42;43350:26;43349:113;;43435:27;;;;;;;;:11;:27;;;;;;;43349:113;;;43413:4;;;;;;43393:26;;;;:11;:26;;;;;;;43349:113;43340:122;-1:-1:-1;43477:20:0;;;43473:75;;-1:-1:-1;43531:4:0;43473:75;43251:304;;;:::o;30894:360::-;28450:5;;;;28436:10;:19;28428:42;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;30973:22:::1;::::0;::::1;;::::0;;;:9:::1;:22;::::0;;;;;::::1;;30972:23;30964:51;;;::::0;;::::1;::::0;;::::1;;::::0;::::1;::::0;::::1;::::0;;;;::::1;::::0;;;;;;;;;;;;;::::1;;31057:14;:21:::0;27772:2:::1;-1:-1:-1::0;31049:64:0::1;;;::::0;;::::1;::::0;;::::1;;::::0;::::1;::::0;::::1;::::0;;;;::::1;::::0;;;;;;;;;;;;;::::1;;31131:32;::::0;;::::1;::::0;::::1;::::0;;31158:4:::1;31131:32;::::0;::::1;::::0;;;::::1;::::0;;;;;;;;;::::1;31174:22;;;::::0;;;:9:::1;:22;::::0;;;;:29;;;::::1;31199:4;31174:29:::0;;::::1;::::0;;;31214:14:::1;27:10:-1::0;;23:18;;::::1;45:23:::0;;31214:32:0;;;;::::1;::::0;;;::::1;::::0;;::::1;::::0;;30894:360::o;41233:234::-;41419:38;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;22:32:-1;26:21;;;22:32;6:49;;41419:38:0;;;;;;41409:49;;;;;;;;;-1:-1:-1;41383:76:0;;;:25;:76;;;;;;;;41233:234::o;33405:46::-;;;;;;;;;;;;;;;:::o;31262:498::-;28450:5;;;;28436:10;:19;28428:42;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;31340:19:::1;::::0;::::1;;::::0;;;:9:::1;:19;::::0;;;;;::::1;;31332:44;;;::::0;;::::1;::::0;;::::1;;::::0;::::1;::::0;::::1;::::0;;;;::::1;::::0;;;;;;;;;;;;;::::1;;31387:19;::::0;::::1;31409:5;31387:19:::0;;;:9:::1;:19;::::0;;;;:27;;;::::1;::::0;;31427:326:::1;31451:14;:21:::0;31447:25;::::1;31427:326;;;31519:8;31498:29;;:14;31513:1;31498:17;;;;;;;;;::::0;;;::::1;::::0;;;::::1;::::0;::::1;;:29;31494:248;;;31568:14;31583:21:::0;;:25;;;;31568:41;::::1;;;;;;::::0;;;::::1;::::0;;;::::1;::::0;31548:14:::1;:17:::0;;31568:41:::1;::::0;;::::1;::::0;31563:1;;31548:17;::::1;;;;;;;;;;;;;:61;;;;;;;;;;;;;;;;;;31628:14;:20;;;;;;;;::::0;;;::::1;::::0;;;;;;;;;;;;::::1;::::0;;;;;;;;31672:30:::1;::::0;;31628:20:::1;31672:30:::0;::::1;::::0;;;;::::1;::::0;;;;;;::::1;::::0;;;;;;;;;::::1;31721:5;;31494:248;31474:3;;31427:326;;33634:27:::0;;;;;;:::o;39543:176::-;28450:5;;;;28436:10;:19;28428:42;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;39614:20:::1;::::0;::::1;39606:39;;;::::0;;::::1;::::0;;::::1;;::::0;::::1;::::0;::::1;::::0;;;;::::1;::::0;;;;;;;;;;;;;::::1;;39656:4;:15:::0;;;::::1;;::::0;::::1;::::0;;::::1;::::0;;;39687:24:::1;::::0;::::1;::::0;-1:-1:-1;;39687:24:0::1;39543:176:::0;:::o;36623:181::-;28551:10;28541:21;;;;:9;:21;;;;;;;;28533:47;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;36704:10:::1;:42:::0;;::::1;::::0;::::1;::::0;;::::1;::::0;;;::::1;::::0;;;::::1;::::0;;;36762:34:::1;::::0;;;;;;::::1;::::0;;;;::::1;::::0;;::::1;36623:181:::0;:::o;32576:241::-;28450:5;;;;28436:10;:19;28428:42;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;32688:30:::1;::::0;32670:12:::1;::::0;32688:11:::1;::::0;::::1;::::0;32707:6;;32670:12;32688:30;32670:12;32688:30;32707:6;32688:11;:30:::1;;;;;;;12:1:-1;19;14:27;;;;67:4;61:11;56:16;;134:4;130:9;123:4;105:16;101:27;97:43;94:1;90:51;84:4;77:65;157:16;154:1;147:27;211:16;208:1;201:4;198:1;194:12;179:49;5:228;;14:27;32:4;27:9;;5:228;;32669:49:0;;;32737:7;32729:35;;;::::0;;::::1;::::0;;::::1;;::::0;::::1;::::0;::::1;::::0;;;;::::1;::::0;;;;;;;;;;;;;::::1;;32780:29;::::0;;;;;::::1;::::0;::::1;;::::0;::::1;::::0;;;::::1;::::0;;;;;;;;;::::1;28481:1;32576:241:::0;;:::o;33707:47::-;;;;;;:::o;41475:102::-;41546:10;:23;;;41475:102;:::o;33312:57::-;;;;;;;;;;;;;;;:::o;41585:109::-;41661:10;:25;;;;;;;41585:109::o;27783:20::-;;;;;;:::o;42122:942::-;42180:7;42200:14;42217:21;42232:5;42217:14;:21::i;:::-;42200:38;-1:-1:-1;42249:20:0;42286:26;;;5263:42;42286:26;42282:565;;;42333:23;;;42351:4;42333:23;42329:156;;;42448:21;42441:28;;;;;;42329:156;-1:-1:-1;42565:4:0;;;;42282:565;;;42606:23;;;42624:4;42606:23;42602:201;;;42757:30;;;;;;42781:4;42757:30;;;;;;:15;;;;;;:30;;;;;;;;;;;;;;:15;:30;;;2:2:-1;;;;27:1;24;17:12;2:2;42757:30:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;42757:30:0;;;;;;;15:2:-1;10:3;7:11;4:2;;;31:1;28;21:12;4:2;-1:-1;42757:30:0;;-1:-1:-1;42750:37:0;;-1:-1:-1;;42750:37:0;42602:201;-1:-1:-1;42830:5:0;42282:565;42859:23;42885:10;:20;;;42906:6;42885:28;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;5:9:-1;2:2;;;27:1;24;17:12;2:2;42885:28:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;42885:28:0;;;;;;;15:2:-1;10:3;7:11;4:2;;;31:1;28;21:12;4:2;-1:-1;42885:28:0;42952:43;;;;;;:20;:43;;;;;;;42989:4;42952:43;;;;;;42885:28;;-1:-1:-1;42924:25:0;;42952:20;;;;;;:43;;;;;42885:28;;42952:43;;;;;;;;:20;:43;;;2:2:-1;;;;27:1;24;17:12;2:2;42952:43:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;42952:43:0;;;;;;;15:2:-1;10:3;7:11;4:2;;;31:1;28;21:12;4:2;-1:-1;42952:43:0;;-1:-1:-1;43015:41:0;43021:15;42952:43;43015:5;:41::i;:::-;43008:48;42122:942;-1:-1:-1;;;;;;42122:942:0:o;39154:288::-;28450:5;;;;28436:10;:19;28428:42;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;39256:41:::1;::::0;::::1;39248:71;;;::::0;;::::1;::::0;;::::1;;::::0;::::1;::::0;::::1;::::0;;;;::::1;::::0;;;;;;;;;;;;;::::1;;39330:23;:44:::0;;;::::1;;::::0;::::1;::::0;;::::1;::::0;;;39390::::1;::::0;::::1;::::0;-1:-1:-1;;39390:44:0::1;39154:288:::0;:::o;6817:380::-;6876:21;6926:26;6946:5;6926:19;:26::i;:::-;6910:42;-1:-1:-1;6967:17:0;;6963:43;;6986:20;;6963:43;-1:-1:-1;7035:15:0;;;:8;:15;;;;;;;;;;;7065:18;7061:129;;7116:5;:14;;;:16;;;;;;;;;;;;;;;;;;;;;;5:9:-1;2:2;;;27:1;24;17:12;2:2;7116:16:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;7116:16:0;;;;;;;15:2:-1;10:3;7:11;4:2;;;31:1;28;21:12;4:2;-1:-1;7116:16:0;7147:15;;;;;:8;:15;;;7116:16;7147:15;;;;;;7100:32;;;;7147:31;;;;-1:-1:-1;7100:32:0;6817:380::o;24530:177::-;24640:58;;;;;;;;;;;;;;;;;;;26:21:-1;;;22:32;;;6:49;;24640:58:0;;;;;;;;25:18:-1;;61:17;;24640:58:0;182:15:-1;24663:23:0;179:29:-1;160:49;;24613:86:0;;24633:5;;24613:19;:86::i;:::-;24530:177;;;:::o;24715:205::-;24843:68;;;;;;;;;;;;;;;;;;;;;;;;;;26:21:-1;;;22:32;;;6:49;;24843:68:0;;;;;;;;25:18:-1;;61:17;;24843:68:0;182:15:-1;24866:27:0;179:29:-1;160:49;;24816:96:0;;24836:5;;24816:19;:96::i;:::-;24715:205;;;;:::o;43903:3320::-;44158:1;44141:14;:18;44133:40;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;44199:29;;;5263:42;44199:29;44239:161;;;;44286:9;44273;:22;44265:50;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;44239:161;;;44356:9;:14;44348:40;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;44416:12;44412:676;;;44460:23;;44445:12;;44460:23;;:31;44510:5;:28;;44530:8;44510:28;;;44518:9;44510:28;44460:176;;;;;;;;;;;;;;;;;;;44557:12;44460:176;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;2:2:-1;;;;27:1;24;17:12;2:2;44460:176:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;44460:176:0;;;;;;;15:2:-1;10:3;7:11;4:2;;;31:1;28;21:12;4:2;-1:-1;44460:176:0;;-1:-1:-1;44703:22:0;;;;44695:81;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;44795:19;;:38;:19;:38;44791:286;;44913:19;;:54;;;;;;:19;:54;;;;;;;;;;;;;;;;44892:18;;44913:19;;;;;:33;;:54;;;;;;;;;;;;;;;:19;:54;;;2:2:-1;;;;27:1;24;17:12;2:2;44913:54:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;44913:54:0;;;;;;;15:2:-1;10:3;7:11;4:2;;;31:1;28;21:12;4:2;-1:-1;44913:54:0;;-1:-1:-1;44994:18:0;;;;44986:75;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;44791:286;;44412:676;;45100:18;45121:62;45136:8;45146:9;45157;45168:14;45121;:62::i;:::-;45100:83;;45215:1;45202:10;:14;45194:43;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;45250:22;45275:24;45290:8;45275:14;:24::i;:::-;45250:49;;45310:23;45336:25;45351:9;45336:14;:25::i;:::-;45310:51;;45378:5;45374:1743;;;45433:23;;:170;;;;;;:23;:170;;;;;;;;;;;;;:23;:170;;;;;;45576:12;45433:170;;;;;;:23;;;:39;;:170;;;;;:23;;:170;;;;;;:23;;:170;;;2:2:-1;;;;27:1;24;17:12;2:2;45433:170:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;-1:-1;;;;45722:31:0;;;45748:4;45722:31;45718:178;;45774:4;;;;;;;;;;;:12;;;45794:9;45774:32;;;;;;;;;;;;;;;;;;;;;;;5:9:-1;2:2;;;27:1;24;17:12;2:2;45774:32:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;-1:-1;;45835:4:0;;45825:55;;-1:-1:-1;45835:4:0;;;-1:-1:-1;45854:14:0;;-1:-1:-1;45870:9:0;45825:55;:28;:55;:::i;:::-;45982:32;;;46009:4;45982:32;45978:229;;;46035:47;:22;;;46058:11;46071:10;46035:47;:22;:47;:::i;:::-;45978:229;;;46123:68;:26;;;46150:15;46167:11;46180:10;46123:68;:26;:68;:::i;:::-;45374:1743;;;46272:23;;:173;;;;;;:23;:173;;;;;;;:23;46357:22;;;46272:173;;;;;;;;;;46418:12;46272:173;;;;;;:23;;;:39;;:173;;;;;:23;;:173;;;;;;:23;;:173;;;2:2:-1;;;;27:1;24;17:12;2:2;46272:173:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;-1:-1;46506:64:0;;-1:-1:-1;;;46506:25:0;;;46532:10;46544:14;46560:9;46506:25;:64::i;:::-;46718:32;;;46745:4;46718:32;46714:193;;46781:4;;46771:76;;46781:4;;46804:15;46829:4;46836:10;46771:76;:32;:76;:::i;:::-;46866:4;;:25;;;;;;;;;;;;;;:4;;;;;:13;;:25;;;;;:4;;:25;;;;;;;;:4;;:25;;;2:2:-1;;;;27:1;24;17:12;2:2;46866:25:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;46866:25:0;;;;46714:193;46984:39;;46966:12;;46984:16;;;;47008:10;;46966:12;46984:39;46966:12;46984:39;47008:10;46984:16;:39;;;;;;;12:1:-1;19;14:27;;;;67:4;61:11;56:16;;134:4;130:9;123:4;105:16;101:27;97:43;94:1;90:51;84:4;77:65;157:16;154:1;147:27;211:16;208:1;201:4;198:1;194:12;179:49;5:228;;14:27;32:4;27:9;;5:228;;46965:58:0;;;47046:7;47038:67;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;45374:1743;;47134:81;;;;;;;;;;;;;;;;;;;;;;;;;;;;;47147:10;;47134:81;;;;;;;;;43903:3320;;;;;;;;;;:::o;8441:253::-;8595:7;8622:64;8633:9;8644:16;8656:3;8644:11;:16::i;:::-;8662:17;8674:4;8662:11;:17::i;:::-;8681:4;8622:10;:64::i;:::-;8615:71;8441:253;-1:-1:-1;;;;;8441:253:0:o;12232:108::-;12292:7;12323:1;12319;:5;:13;;12331:1;12319:13;;;12327:1;12319:13;12312:20;12232:108;-1:-1:-1;;;12232:108:0:o;11639:585::-;11708:7;11732:26;;;5263:42;11732:26;11728:489;;;-1:-1:-1;6321:2:0;11775:19;;11728:489;11816:27;;;5388:42;11816:27;11812:405;;;-1:-1:-1;11867:1:0;11860:8;;11812:405;11890:26;;;5512:42;11890:26;11886:331;;;-1:-1:-1;11940:2:0;11933:9;;11886:331;11964:27;;;5637:42;11964:27;11960:257;;;-1:-1:-1;12015:1:0;12008:8;;11960:257;12038:27;;;5762:42;12038:27;12034:183;;;-1:-1:-1;12089:1:0;12082:8;;12034:183;12112:26;;;5886:42;12112:26;12108:109;;;-1:-1:-1;12162:2:0;12155:9;;12108:109;-1:-1:-1;12204:1:0;12197:8;;26835:761;27259:23;27285:69;27313:4;27285:69;;;;;;;;;;;;;;;;;27293:5;27285:27;;;;:69;;;;;:::i;:::-;27369:17;;27259:95;;-1:-1:-1;27369:21:0;27365:224;;27511:10;27500:30;;;;;15:2:-1;10:3;7:11;4:2;;;31:1;28;21:12;4:2;-1:-1;27500:30:0;27492:85;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;7857:576;7918:21;8024:26;8044:5;8024:19;:26::i;:::-;8008:42;-1:-1:-1;8065:17:0;;8061:43;;8084:20;;8061:43;-1:-1:-1;8213:15:0;;;:8;:15;;;;;;;;;;;8372:17;8371:54;;8409:5;:14;;;:16;;;;;;;;;;;;;;;;;;;;;;5:9:-1;2:2;;;27:1;24;17:12;2:2;8409:16:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;8409:16:0;;;;;;;15:2:-1;10:3;7:11;4:2;;;31:1;28;21:12;4:2;-1:-1;8409:16:0;8371:54;;;;;8393:13;8371:54;8364:61;7857:576;-1:-1:-1;;7857:576:0:o;8964:723::-;9122:7;6111:6;9150;:17;;9142:46;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;6177:17;9207:16;;;9199:44;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;9275:11;9260;:26;9256:424;;6271:2;9326:11;9312;:25;9311:43;;9303:80;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;6060:6;9406:13;;;9428:25;;;9423:2;:31;9406:49;9405:63;;9398:70;;;;9256:424;6271:2;9524:11;9510;:25;9509:43;;9501:80;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;9654:11;9640;:25;9635:2;:31;6060:6;9622:45;9613:4;9604:6;:13;9603:65;;;;21478:196;21581:12;21613:53;21636:6;21644:4;21650:1;21653:12;22985;23018:18;23029:6;23018:10;:18::i;:::-;23010:60;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;23144:12;23158:23;23185:6;:11;;23205:8;23216:4;23185:36;;;;;;;;;;;;;36:153:-1;66:2;61:3;58:11;36:153;;176:10;;164:23;;139:12;;;;;98:2;89:12;;;;114;36:153;;;274:1;267:3;263:2;259:12;254:3;250:22;246:30;315:4;311:9;305:3;299:10;295:26;356:4;350:3;344:10;340:21;389:7;380;377:20;372:3;365:33;3:399;;;23185:36:0;;;;;;;;;;;;;;;;;;;;;;;;;12:1:-1;19;14:27;;;;67:4;61:11;56:16;;134:4;130:9;123:4;105:16;101:27;97:43;94:1;90:51;84:4;77:65;157:16;154:1;147:27;211:16;208:1;201:4;198:1;194:12;179:49;5:228;;14:27;32:4;27:9;;5:228;;23143:78:0;;;;23236:7;23232:595;;;23267:10;-1:-1:-1;23260:17:0;;-1:-1:-1;23260:17:0;23232:595;23381:17;;:21;23377:439;;23644:10;23638:17;23705:15;23692:10;23688:2;23684:19;23677:44;23592:148;23787:12;23780:20;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;23:1:-1;8:100;33:3;30:1;27:10;8:100;;;90:11;;;84:18;71:11;;;64:39;52:2;45:10;8:100;;;12:14;23780:20:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;18560:422;18927:20;18966:8;;;18560:422::o;33169:14057::-;;;;;;;;;-1:-1:-1;33169:14057:0;;;;;;;;;;;;;;;;;:::o

Swarm Source

ipfs://56da272ef4295da6cec17b0a5d38c2cdcfe95d737676734550a14cdc90e660b4

Block Uncle Number Difficulty Gas Used Reward
View All Uncles
Loading...
Loading
Loading...
Loading
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.