ETH Price: $3,360.12 (-3.31%)

Contract

0x31E085Afd48a1d6e51Cc193153d625e8f0514C7F
 

Overview

ETH Balance

4.641166851134036009 ETH

Eth Value

$15,594.87 (@ $3,360.12/ETH)

Multichain Info

1 address found via
Transaction Hash
Method
Block
From
To
Set Internal Inv...90767612019-12-09 9:46:121844 days ago1575884772IN
Kyber: Reserve Uniswap
0 ETH0.000163065
Set Internal Inv...90767582019-12-09 9:45:361844 days ago1575884736IN
Kyber: Reserve Uniswap
0 ETH0.000163065
Add Operator90547962019-12-05 12:06:311848 days ago1575547591IN
Kyber: Reserve Uniswap
0 ETH0.00014462
Transfer Admin90546962019-12-05 11:41:391848 days ago1575546099IN
Kyber: Reserve Uniswap
0 ETH0.000091092
Add Operator90546962019-12-05 11:41:391848 days ago1575546099IN
Kyber: Reserve Uniswap
0 ETH0.00014462
Add Operator90546952019-12-05 11:41:371848 days ago1575546097IN
Kyber: Reserve Uniswap
0 ETH0.00014462
Add Operator90546952019-12-05 11:41:371848 days ago1575546097IN
Kyber: Reserve Uniswap
0 ETH0.00014462
Add Operator90546952019-12-05 11:41:371848 days ago1575546097IN
Kyber: Reserve Uniswap
0 ETH0.000048392
Add Operator90545332019-12-05 10:50:321848 days ago1575543032IN
Kyber: Reserve Uniswap
0 ETH0.000048392
Add Operator90545332019-12-05 10:50:321848 days ago1575543032IN
Kyber: Reserve Uniswap
0 ETH0.000048392
Add Operator90545332019-12-05 10:50:321848 days ago1575543032IN
Kyber: Reserve Uniswap
0 ETH0.000048392
Add Operator90545332019-12-05 10:50:321848 days ago1575543032IN
Kyber: Reserve Uniswap
0 ETH0.000048392
Add Operator90545332019-12-05 10:50:321848 days ago1575543032IN
Kyber: Reserve Uniswap
0 ETH0.00017462
Set Fee90545332019-12-05 10:50:321848 days ago1575543032IN
Kyber: Reserve Uniswap
0 ETH0.000056822

Latest 25 internal transactions (View All)

Advanced mode:
Parent Transaction Hash Block
From
To
126237902021-06-13 3:41:381292 days ago1623555698
Kyber: Reserve Uniswap
0.06667863 ETH
126237902021-06-13 3:41:381292 days ago1623555698
Kyber: Reserve Uniswap
0.06667863 ETH
117302132021-01-26 8:27:401430 days ago1611649660
Kyber: Reserve Uniswap
92.45634076 ETH
117302132021-01-26 8:27:401430 days ago1611649660
Kyber: Reserve Uniswap
92.45634076 ETH
117295652021-01-26 5:53:541430 days ago1611640434
Kyber: Reserve Uniswap
7.54051666 ETH
117295652021-01-26 5:53:541430 days ago1611640434
Kyber: Reserve Uniswap
7.54051666 ETH
113555812020-11-29 19:45:371487 days ago1606679137
Kyber: Reserve Uniswap
0.19214242 ETH
113555812020-11-29 19:45:371487 days ago1606679137
Kyber: Reserve Uniswap
0.19214242 ETH
112690082020-11-16 12:55:281500 days ago1605531328
Kyber: Reserve Uniswap
0.24202072 ETH
112690082020-11-16 12:55:281500 days ago1605531328
Kyber: Reserve Uniswap
0.24202072 ETH
112587252020-11-14 22:57:321502 days ago1605394652
Kyber: Reserve Uniswap
0.24202072 ETH
112587252020-11-14 22:57:321502 days ago1605394652
Kyber: Reserve Uniswap
0.24202072 ETH
112587252020-11-14 22:57:321502 days ago1605394652
Kyber: Reserve Uniswap
0.24202072 ETH
112587252020-11-14 22:57:321502 days ago1605394652
Kyber: Reserve Uniswap
0.24202072 ETH
111091272020-10-22 23:48:271525 days ago1603410507
Kyber: Reserve Uniswap
0.14418565 ETH
111091272020-10-22 23:48:271525 days ago1603410507
Kyber: Reserve Uniswap
0.14418565 ETH
110697732020-10-16 22:51:061531 days ago1602888666
Kyber: Reserve Uniswap
0.19099897 ETH
110697732020-10-16 22:51:061531 days ago1602888666
Kyber: Reserve Uniswap
0.19099897 ETH
109731662020-10-01 23:29:161546 days ago1601594956
Kyber: Reserve Uniswap
0.24387409 ETH
109731662020-10-01 23:29:161546 days ago1601594956
Kyber: Reserve Uniswap
0.24387409 ETH
109720522020-10-01 19:17:261546 days ago1601579846
Kyber: Reserve Uniswap
0.31854203 ETH
109720522020-10-01 19:17:261546 days ago1601579846
Kyber: Reserve Uniswap
0.31854203 ETH
109692672020-10-01 9:07:451547 days ago1601543265
Kyber: Reserve Uniswap
0.26509176 ETH
109692672020-10-01 9:07:451547 days ago1601543265
Kyber: Reserve Uniswap
0.26509176 ETH
109684912020-10-01 6:10:081547 days ago1601532608
Kyber: Reserve Uniswap
0.00025 ETH
View All Internal Transactions
Loading...
Loading

Contract Source Code Verified (Exact Match)

Contract Name:
KyberUniswapReserve

Compiler Version
v0.4.18+commit.9cf6e910

Optimization Enabled:
Yes with 200 runs

Other Settings:
default evmVersion, MIT license

Contract Source Code (Solidity)

/**
 *Submitted for verification at Etherscan.io on 2019-12-05
*/

// File: contracts/ERC20Interface.sol

pragma solidity 0.4.18;


// https://github.com/ethereum/EIPs/issues/20
interface ERC20 {
    function totalSupply() public view returns (uint supply);
    function balanceOf(address _owner) public view returns (uint balance);
    function transfer(address _to, uint _value) public returns (bool success);
    function transferFrom(address _from, address _to, uint _value) public returns (bool success);
    function approve(address _spender, uint _value) public returns (bool success);
    function allowance(address _owner, address _spender) public view returns (uint remaining);
    function decimals() public view returns(uint digits);
    event Approval(address indexed _owner, address indexed _spender, uint _value);
}

// File: contracts/PermissionGroups.sol

pragma solidity 0.4.18;


contract PermissionGroups {

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

    function PermissionGroups() public {
        admin = msg.sender;
    }

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

    modifier onlyOperator() {
        require(operators[msg.sender]);
        _;
    }

    modifier onlyAlerter() {
        require(alerters[msg.sender]);
        _;
    }

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

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

    event TransferAdminPending(address pendingAdmin);

    /**
     * @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));
        TransferAdminPending(pendingAdmin);
        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));
        TransferAdminPending(newAdmin);
        AdminClaimed(newAdmin, admin);
        admin = newAdmin;
    }

    event AdminClaimed( address newAdmin, address previousAdmin);

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

    event AlerterAdded (address newAlerter, bool isAdd);

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

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

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

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

    event OperatorAdded(address newOperator, bool isAdd);

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

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

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

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

// File: contracts/Withdrawable.sol

pragma solidity 0.4.18;




/**
 * @title Contracts that should be able to recover tokens or ethers
 * @author Ilan Doron
 * @dev This allows to recover any tokens or Ethers received in a contract.
 * This will prevent any accidental loss of tokens.
 */
contract Withdrawable is PermissionGroups {

    event TokenWithdraw(ERC20 token, uint amount, address sendTo);

    /**
     * @dev Withdraw all ERC20 compatible tokens
     * @param token ERC20 The address of the token contract
     */
    function withdrawToken(ERC20 token, uint amount, address sendTo) external onlyAdmin {
        require(token.transfer(sendTo, amount));
        TokenWithdraw(token, amount, sendTo);
    }

    event EtherWithdraw(uint amount, address sendTo);

    /**
     * @dev Withdraw Ethers
     */
    function withdrawEther(uint amount, address sendTo) external onlyAdmin {
        sendTo.transfer(amount);
        EtherWithdraw(amount, sendTo);
    }
}

// File: contracts/KyberReserveInterface.sol

pragma solidity 0.4.18;


/// @title Kyber Reserve contract
interface KyberReserveInterface {

    function trade(
        ERC20 srcToken,
        uint srcAmount,
        ERC20 destToken,
        address destAddress,
        uint conversionRate,
        bool validate
    )
        public
        payable
        returns(bool);

    function getConversionRate(ERC20 src, ERC20 dest, uint srcQty, uint blockNumber) public view returns(uint);
}

// File: contracts/Utils.sol

pragma solidity 0.4.18;



/// @title Kyber constants contract
contract Utils {

    ERC20 constant internal ETH_TOKEN_ADDRESS = ERC20(0x00eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee);
    uint  constant internal PRECISION = (10**18);
    uint  constant internal MAX_QTY   = (10**28); // 10B tokens
    uint  constant internal MAX_RATE  = (PRECISION * 10**6); // up to 1M tokens per ETH
    uint  constant internal MAX_DECIMALS = 18;
    uint  constant internal ETH_DECIMALS = 18;
    mapping(address=>uint) internal decimals;

    function setDecimals(ERC20 token) internal {
        if (token == ETH_TOKEN_ADDRESS) decimals[token] = ETH_DECIMALS;
        else decimals[token] = token.decimals();
    }

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

        return tokenDecimals;
    }

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

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

    function calcSrcQty(uint dstQty, uint srcDecimals, uint dstDecimals, uint rate) internal pure returns(uint) {
        require(dstQty <= MAX_QTY);
        require(rate <= MAX_RATE);
        
        //source quantity is rounded up. to avoid dest quantity being too low.
        uint numerator;
        uint denominator;
        if (srcDecimals >= dstDecimals) {
            require((srcDecimals - dstDecimals) <= MAX_DECIMALS);
            numerator = (PRECISION * dstQty * (10**(srcDecimals - dstDecimals)));
            denominator = rate;
        } else {
            require((dstDecimals - srcDecimals) <= MAX_DECIMALS);
            numerator = (PRECISION * dstQty);
            denominator = (rate * (10**(dstDecimals - srcDecimals)));
        }
        return (numerator + denominator - 1) / denominator; //avoid rounding down errors
    }
}

// File: contracts/Utils2.sol

pragma solidity 0.4.18;



contract Utils2 is Utils {

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

    function getDecimalsSafe(ERC20 token) internal returns(uint) {

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

        return decimals[token];
    }

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

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

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

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

// File: contracts/reserves/bridgeReserves/uniswap/KyberUniswapReserve.sol

pragma solidity 0.4.18;





interface UniswapExchange {
    function ethToTokenSwapInput(
        uint256 min_tokens,
        uint256 deadline
    )
        external
        payable
        returns (uint256  tokens_bought);

    function tokenToEthSwapInput(
        uint256 tokens_sold,
        uint256 min_eth,
        uint256 deadline
    )
        external
        returns (uint256  eth_bought);

    function getEthToTokenInputPrice(
        uint256 eth_sold
    )
        external
        view
        returns (uint256 tokens_bought);

    function getTokenToEthInputPrice(
        uint256 tokens_sold
    )
        external
        view
        returns (uint256 eth_bought);
}


interface UniswapFactory {
    function getExchange(address token) external view returns (address exchange);
}


/*
 * A reserve that connects to Uniswap.
 *
 * This reserve makes use of an internal inventory for locally filling orders
 * using the reserve's inventory when certain conditions are met.
 * Conditions are:
 * - After trading the inventory will remain within defined limits.
 * - Uniswap prices do not display internal arbitrage.
 * - Uniswap ask and bid prices meet minimum spread requirements.
 *
 * An additional premium may be added to the converted price for optional
 * promotions.
 */
contract KyberUniswapReserve is KyberReserveInterface, Withdrawable, Utils2 {
    // Parts per 10000
    uint public constant DEFAULT_FEE_BPS = 25;

    UniswapFactory public uniswapFactory;
    address public kyberNetwork;

    uint public feeBps = DEFAULT_FEE_BPS;

    // Uniswap exchange contract for every listed token
    // token -> exchange
    mapping (address => address) public tokenExchange;

    // Internal inventory balance limits
    // token -> limit
    mapping (address => uint) public internalInventoryMin;
    mapping (address => uint) public internalInventoryMax;

    // Minimum spread in BPS required for using internal inventory
    // token -> limit
    mapping (address => uint) public internalActivationMinSpreadBps;

    // Premium BPS added to internal price (making it better).
    // token -> limit
    mapping (address => uint) public internalPricePremiumBps;

    bool public tradeEnabled = true;

    /**
        Constructor
    */
    function KyberUniswapReserve(
        UniswapFactory _uniswapFactory,
        address _admin,
        address _kyberNetwork
    )
        public
    {
        require(address(_uniswapFactory) != 0);
        require(_admin != 0);
        require(_kyberNetwork != 0);

        uniswapFactory = _uniswapFactory;
        admin = _admin;
        kyberNetwork = _kyberNetwork;
    }

    function() public payable {
        // anyone can deposit ether
    }

    /**
        Returns dest quantity / source quantity.
        Last bit of the rate indicates whether to use internal inventory:
          0 - use uniswap
          1 - use internal inventory
    */
    function getConversionRate(
        ERC20 src,
        ERC20 dest,
        uint srcQty,
        uint blockNumber
    )
        public
        view
        returns(uint)
    {
        // This makes the UNUSED warning go away.
        blockNumber;
        if (!isValidTokens(src, dest)) return 0;
        if (!tradeEnabled) return 0;
        if (srcQty == 0) return 0;

        ERC20 token;
        if (src == ETH_TOKEN_ADDRESS) {
            token = dest;
        } else if (dest == ETH_TOKEN_ADDRESS) {
            token = src;
        } else {
            // Should never arrive here - isValidTokens requires one side to be ETH
            revert();
        }

        uint convertedQuantity;
        uint rateSrcDest;
        uint rateDestSrc;
        (convertedQuantity, rateSrcDest) = calcUniswapConversion(src, dest, srcQty);

        if (convertedQuantity == 0) return 0;

        (, rateDestSrc) = calcUniswapConversion(dest, src, convertedQuantity);

        uint quantityWithPremium = addPremium(token, convertedQuantity);

        bool useInternalInventory = shouldUseInternalInventory(
            src, /* srcToken */
            srcQty, /* srcAmount */
            dest, /* destToken */
            quantityWithPremium, /* destAmount */
            rateSrcDest, /* rateSrcDest */
            rateDestSrc /* rateDestSrc */
        );

        uint rate;
        if (useInternalInventory) {
            // If using internal inventory add premium to converted quantity
            rate = calcRateFromQty(
                srcQty, /* srcAmount */
                quantityWithPremium, /* destAmount */
                getDecimals(src), /* srcDecimals */
                getDecimals(dest) /* dstDecimals */
            );
        } else {
            // Use rate calculated from uniswap quantities after fees
            rate = rateSrcDest;
        }
        return applyInternalInventoryHintToRate(rate, useInternalInventory);
    }

    function applyInternalInventoryHintToRate(
        uint rate,
        bool useInternalInventory
    )
        internal
        pure
        returns(uint)
    {
        return rate % 2 == (useInternalInventory ? 1 : 0)
            ? rate
            : rate - 1;
    }


    event TradeExecute(
        address indexed sender,
        address src,
        uint srcAmount,
        address destToken,
        uint destAmount,
        address destAddress,
        bool useInternalInventory
    );

    /**
      conversionRate: expected conversion rate should be >= this value.
     */
    function trade(
        ERC20 srcToken,
        uint srcAmount,
        ERC20 destToken,
        address destAddress,
        uint conversionRate,
        bool validate
    )
        public
        payable
        returns(bool)
    {
        require(tradeEnabled);
        require(msg.sender == kyberNetwork);
        require(isValidTokens(srcToken, destToken));

        if (validate) {
            require(conversionRate > 0);
            if (srcToken == ETH_TOKEN_ADDRESS)
                require(msg.value == srcAmount);
            else
                require(msg.value == 0);
        }

        // Making sure srcAmount has been transfered to the reserve.
        // If srcToken is ETH the value has already been transfered by calling
        // the function.
        if (srcToken != ETH_TOKEN_ADDRESS)
            require(srcToken.transferFrom(msg.sender, address(this), srcAmount));

        uint expectedDestAmount = calcDestAmount(
            srcToken, /* src */
            destToken, /* dest */
            srcAmount, /* srcAmount */
            conversionRate /* rate */
        );

        bool useInternalInventory = conversionRate % 2 == 1;

        uint destAmount;
        UniswapExchange exchange;
        if (srcToken == ETH_TOKEN_ADDRESS) {
            if (!useInternalInventory) {
                // Deduct fees (in ETH) before converting
                uint quantity = deductFee(srcAmount);
                exchange = UniswapExchange(tokenExchange[address(destToken)]);
                destAmount = exchange.ethToTokenSwapInput.value(quantity)(
                    1, /* min_tokens: uniswap requires it to be > 0 */
                    2 ** 255 /* deadline */
                );
                require(destAmount >= expectedDestAmount);
            }

            // Transfer user-expected dest amount
            require(destToken.transfer(destAddress, expectedDestAmount));
        } else {
            if (!useInternalInventory) {
                exchange = UniswapExchange(tokenExchange[address(srcToken)]);
                destAmount = exchange.tokenToEthSwapInput(
                    srcAmount,
                    1, /* min_eth: uniswap requires it to be > 0 */
                    2 ** 255 /* deadline */
                );
                // Deduct fees (in ETH) after converting
                destAmount = deductFee(destAmount);
                require(destAmount >= expectedDestAmount);
            }

            // Transfer user-expected dest amount
            destAddress.transfer(expectedDestAmount);
        }

        TradeExecute(
            msg.sender, /* sender */
            srcToken, /* src */
            srcAmount, /* srcAmount */
            destToken, /* destToken */
            expectedDestAmount, /* destAmount */
            destAddress, /* destAddress */
            useInternalInventory /* useInternalInventory */
        );
        return true;
    }

    event FeeUpdated(
        uint bps
    );

    function setFee(
        uint bps
    )
        public
        onlyAdmin
    {
        require(bps <= 10000);

        feeBps = bps;

        FeeUpdated(bps);
    }

    event InternalActivationConfigUpdated(
        ERC20 token,
        uint minSpreadBps,
        uint premiumBps
    );

    function setInternalActivationConfig(
        ERC20 token,
        uint minSpreadBps,
        uint premiumBps
    )
        public
        onlyAdmin
    {
        require(tokenExchange[address(token)] != address(0));
        require(minSpreadBps <= 1000); // min spread <= 10%
        require(premiumBps <= 500); // premium <= 5%

        internalActivationMinSpreadBps[address(token)] = minSpreadBps;
        internalPricePremiumBps[address(token)] = premiumBps;

        InternalActivationConfigUpdated(token, minSpreadBps, premiumBps);
    }

    event InternalInventoryLimitsUpdated(
        ERC20 token,
        uint minBalance,
        uint maxBalance
    );

    function setInternalInventoryLimits(
        ERC20 token,
        uint minBalance,
        uint maxBalance
    )
        public
        onlyOperator
    {
        require(tokenExchange[address(token)] != address(0));

        internalInventoryMin[address(token)] = minBalance;
        internalInventoryMax[address(token)] = maxBalance;

        InternalInventoryLimitsUpdated(token, minBalance, maxBalance);
    }

    event TokenListed(
        ERC20 token,
        UniswapExchange exchange
    );

    function listToken(ERC20 token)
        public
        onlyAdmin
    {
        require(address(token) != 0);

        UniswapExchange uniswapExchange = UniswapExchange(
            uniswapFactory.getExchange(token)
        );
        tokenExchange[address(token)] = address(uniswapExchange);
        setDecimals(token);

        require(token.approve(uniswapExchange, 2 ** 255));

        // internal inventory disabled by default
        internalInventoryMin[address(token)] = 2 ** 255;
        internalInventoryMax[address(token)] = 0;
        internalActivationMinSpreadBps[address(token)] = 0;
        internalPricePremiumBps[address(token)] = 0;

        TokenListed(token, uniswapExchange);
    }

    event TokenDelisted(ERC20 token);

    function delistToken(ERC20 token)
        public
        onlyAdmin
    {
        require(tokenExchange[address(token)] != address(0));

        delete tokenExchange[address(token)];
        delete internalInventoryMin[address(token)];
        delete internalInventoryMax[address(token)];
        delete internalActivationMinSpreadBps[address(token)];
        delete internalPricePremiumBps[address(token)];

        TokenDelisted(token);
    }

    function isValidTokens(
        ERC20 src,
        ERC20 dest
    )
        public
        view
        returns(bool)
    {
        return (
            (
                src == ETH_TOKEN_ADDRESS &&
                tokenExchange[address(dest)] != address(0)
            ) ||
            (
                tokenExchange[address(src)] != address(0) &&
                dest == ETH_TOKEN_ADDRESS
            )
        );
    }

    event TradeEnabled(
        bool enable
    );

    function enableTrade()
        public
        onlyAdmin
        returns(bool)
    {
        tradeEnabled = true;
        TradeEnabled(true);
        return true;
    }

    function disableTrade()
        public
        onlyAlerter
        returns(bool)
    {
        tradeEnabled = false;
        TradeEnabled(false);
        return true;
    }

    event KyberNetworkSet(
        address kyberNetwork
    );

    function setKyberNetwork(
        address _kyberNetwork
    )
        public
        onlyAdmin
    {
        require(_kyberNetwork != 0);
        kyberNetwork = _kyberNetwork;
        KyberNetworkSet(kyberNetwork);
    }

    /*
     * Uses amounts and rates to check if the reserve's internal inventory can
     * be used directly.
     *
     * rateEthToToken and rateTokenToEth are in kyber rate format meaning
     * rate as numerator and 1e18 as denominator.
     */
    function shouldUseInternalInventory(
        ERC20 srcToken,
        uint srcAmount,
        ERC20 destToken,
        uint destAmount,
        uint rateSrcDest,
        uint rateDestSrc
    )
        public
        view
        returns(bool)
    {
        require(srcAmount < MAX_QTY);
        require(destAmount < MAX_QTY);

        // Check for internal inventory balance limitations
        ERC20 token;
        if (srcToken == ETH_TOKEN_ADDRESS) {
            token = destToken;
            uint tokenBalance = token.balanceOf(this);
            if (
                tokenBalance < destAmount ||
                tokenBalance - destAmount < internalInventoryMin[token]
            ) {
                return false;
            }
        } else {
            token = srcToken;
            if (this.balance < destAmount) return false;
            if (token.balanceOf(this) + srcAmount > internalInventoryMax[token]) {
                return false;
            }
        }

        uint normalizedDestSrc = 10 ** 36 / rateDestSrc;

        // Check for arbitrage
        if (rateSrcDest > normalizedDestSrc) return false;

        uint activationSpread = internalActivationMinSpreadBps[token];
        uint spread = uint(calculateSpreadBps(normalizedDestSrc, rateSrcDest));
        return spread >= activationSpread;
    }

    /*
     * Spread calculation is (ask - bid) / ((ask + bid) / 2).
     * We multiply by 10000 to get result in BPS.
     *
     * Note: if askRate > bidRate result will be negative indicating
     * internal arbitrage.
     */
    function calculateSpreadBps(
        uint _askRate,
        uint _bidRate
    )
        public
        pure
        returns(int)
    {
        int askRate = int(_askRate);
        int bidRate = int(_bidRate);
        return 10000 * 2 * (askRate - bidRate) / (askRate + bidRate);
    }

    function deductFee(
        uint amount
    )
        public
        view
        returns(uint)
    {
        return amount * (10000 - feeBps) / 10000;
    }

    function addPremium(
        ERC20 token,
        uint amount
    )
        public
        view
        returns(uint)
    {
        require(amount <= MAX_QTY);
        return amount * (10000 + internalPricePremiumBps[token]) / 10000;
    }

    function calcUniswapConversion(
        ERC20 src,
        ERC20 dest,
        uint srcQty
    )
        internal
        view
        returns(uint destQty, uint rate)
    {
        UniswapExchange exchange;
        if (src == ETH_TOKEN_ADDRESS) {
            exchange = UniswapExchange(tokenExchange[address(dest)]);

            uint amountLessFee = deductFee(srcQty);
            if (amountLessFee == 0) return (0, 0);

            destQty = exchange.getEthToTokenInputPrice(
                amountLessFee
            );
        } else {
            exchange = UniswapExchange(tokenExchange[address(src)]);
            destQty = deductFee(
                exchange.getTokenToEthInputPrice(srcQty)
            );
        }

        rate = calcRateFromQty(
            srcQty, /* srcAmount */
            destQty, /* destAmount */
            getDecimals(src), /* srcDecimals */
            getDecimals(dest) /* dstDecimals */
        );
    }
}

Contract Security Audit

Contract ABI

[{"constant":false,"inputs":[],"name":"enableTrade","outputs":[{"name":"","type":"bool"}],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"name":"alerter","type":"address"}],"name":"removeAlerter","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[{"name":"","type":"address"}],"name":"tokenExchange","outputs":[{"name":"","type":"address"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"name":"","type":"address"}],"name":"internalPricePremiumBps","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"name":"token","type":"address"}],"name":"listToken","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[],"name":"feeBps","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"pendingAdmin","outputs":[{"name":"","type":"address"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"getOperators","outputs":[{"name":"","type":"address[]"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"DEFAULT_FEE_BPS","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"name":"token","type":"address"},{"name":"amount","type":"uint256"}],"name":"addPremium","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"name":"token","type":"address"},{"name":"amount","type":"uint256"},{"name":"sendTo","type":"address"}],"name":"withdrawToken","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"name":"newAlerter","type":"address"}],"name":"addAlerter","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[{"name":"","type":"address"}],"name":"internalInventoryMin","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"name":"_kyberNetwork","type":"address"}],"name":"setKyberNetwork","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[{"name":"srcToken","type":"address"},{"name":"srcAmount","type":"uint256"},{"name":"destToken","type":"address"},{"name":"destAmount","type":"uint256"},{"name":"rateSrcDest","type":"uint256"},{"name":"rateDestSrc","type":"uint256"}],"name":"shouldUseInternalInventory","outputs":[{"name":"","type":"bool"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[],"name":"disableTrade","outputs":[{"name":"","type":"bool"}],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"name":"bps","type":"uint256"}],"name":"setFee","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"name":"srcToken","type":"address"},{"name":"srcAmount","type":"uint256"},{"name":"destToken","type":"address"},{"name":"destAddress","type":"address"},{"name":"conversionRate","type":"uint256"},{"name":"validate","type":"bool"}],"name":"trade","outputs":[{"name":"","type":"bool"}],"payable":true,"stateMutability":"payable","type":"function"},{"constant":false,"inputs":[{"name":"newAdmin","type":"address"}],"name":"transferAdmin","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[],"name":"claimAdmin","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"name":"newAdmin","type":"address"}],"name":"transferAdminQuickly","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[{"name":"src","type":"address"},{"name":"dest","type":"address"}],"name":"isValidTokens","outputs":[{"name":"","type":"bool"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"name":"token","type":"address"},{"name":"minSpreadBps","type":"uint256"},{"name":"premiumBps","type":"uint256"}],"name":"setInternalActivationConfig","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[],"name":"getAlerters","outputs":[{"name":"","type":"address[]"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"name":"src","type":"address"},{"name":"dest","type":"address"},{"name":"srcQty","type":"uint256"},{"name":"blockNumber","type":"uint256"}],"name":"getConversionRate","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"uniswapFactory","outputs":[{"name":"","type":"address"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"name":"newOperator","type":"address"}],"name":"addOperator","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[{"name":"","type":"address"}],"name":"internalInventoryMax","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"name":"token","type":"address"},{"name":"minBalance","type":"uint256"},{"name":"maxBalance","type":"uint256"}],"name":"setInternalInventoryLimits","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[{"name":"amount","type":"uint256"}],"name":"deductFee","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"name":"token","type":"address"}],"name":"delistToken","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"name":"operator","type":"address"}],"name":"removeOperator","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[],"name":"kyberNetwork","outputs":[{"name":"","type":"address"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"name":"_askRate","type":"uint256"},{"name":"_bidRate","type":"uint256"}],"name":"calculateSpreadBps","outputs":[{"name":"","type":"int256"}],"payable":false,"stateMutability":"pure","type":"function"},{"constant":true,"inputs":[{"name":"","type":"address"}],"name":"internalActivationMinSpreadBps","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"name":"amount","type":"uint256"},{"name":"sendTo","type":"address"}],"name":"withdrawEther","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[{"name":"token","type":"address"},{"name":"user","type":"address"}],"name":"getBalance","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"tradeEnabled","outputs":[{"name":"","type":"bool"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"admin","outputs":[{"name":"","type":"address"}],"payable":false,"stateMutability":"view","type":"function"},{"inputs":[{"name":"_uniswapFactory","type":"address"},{"name":"_admin","type":"address"},{"name":"_kyberNetwork","type":"address"}],"payable":false,"stateMutability":"nonpayable","type":"constructor"},{"payable":true,"stateMutability":"payable","type":"fallback"},{"anonymous":false,"inputs":[{"indexed":true,"name":"sender","type":"address"},{"indexed":false,"name":"src","type":"address"},{"indexed":false,"name":"srcAmount","type":"uint256"},{"indexed":false,"name":"destToken","type":"address"},{"indexed":false,"name":"destAmount","type":"uint256"},{"indexed":false,"name":"destAddress","type":"address"},{"indexed":false,"name":"useInternalInventory","type":"bool"}],"name":"TradeExecute","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"name":"bps","type":"uint256"}],"name":"FeeUpdated","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"name":"token","type":"address"},{"indexed":false,"name":"minSpreadBps","type":"uint256"},{"indexed":false,"name":"premiumBps","type":"uint256"}],"name":"InternalActivationConfigUpdated","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"name":"token","type":"address"},{"indexed":false,"name":"minBalance","type":"uint256"},{"indexed":false,"name":"maxBalance","type":"uint256"}],"name":"InternalInventoryLimitsUpdated","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"name":"token","type":"address"},{"indexed":false,"name":"exchange","type":"address"}],"name":"TokenListed","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"name":"token","type":"address"}],"name":"TokenDelisted","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"name":"enable","type":"bool"}],"name":"TradeEnabled","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"name":"kyberNetwork","type":"address"}],"name":"KyberNetworkSet","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"name":"token","type":"address"},{"indexed":false,"name":"amount","type":"uint256"},{"indexed":false,"name":"sendTo","type":"address"}],"name":"TokenWithdraw","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"name":"amount","type":"uint256"},{"indexed":false,"name":"sendTo","type":"address"}],"name":"EtherWithdraw","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"name":"pendingAdmin","type":"address"}],"name":"TransferAdminPending","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"name":"newAdmin","type":"address"},{"indexed":false,"name":"previousAdmin","type":"address"}],"name":"AdminClaimed","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"name":"newAlerter","type":"address"},{"indexed":false,"name":"isAdd","type":"bool"}],"name":"AlerterAdded","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"name":"newOperator","type":"address"},{"indexed":false,"name":"isAdd","type":"bool"}],"name":"OperatorAdded","type":"event"}]

60606040526019600955600f805460ff19166001179055341561002157600080fd5b60405160608061261583398101604052808051919060200180519190602001805160008054600160a060020a03191633600160a060020a039081169190911790915590925084161515905061007557600080fd5b600160a060020a038216151561008a57600080fd5b600160a060020a038116151561009f57600080fd5b60078054600160a060020a03948516600160a060020a03199182161790915560008054938516938216939093179092556008805491909316911617905561252a806100eb6000396000f3006060604052600436106101c85763ffffffff60e060020a60003504166299d38681146101ca57806301a12fd3146101f15780630dd94b96146102105780631db950781461024b5780631fc1e25f1461027c57806324a9d8531461029b57806326782247146102ae57806327a099d8146102c157806333d8262c146103275780633a6e7d391461033a5780633ccdbb281461035c578063408ee7fe1461038557806348caa206146103a457806354a325a6146103c35780635a65d4c9146103e25780636940030f1461041457806369fe0e2d146104275780636cf698111461043d57806375829def1461046957806377f50f97146104885780637acc86781461049b5780637be98598146104ba5780637bec03aa146104df5780637c423f54146105045780637cd44272146105175780638bdb2afa146105425780639870d7fe14610555578063998614cb146105745780639b9a33ff14610593578063a9afaaaf146105b8578063abffc9ac146105ce578063ac8a584a146105ed578063b78b842d1461060c578063bc91970a1461061f578063c3e0d71214610638578063ce56c45414610657578063d4fac45d14610679578063d621e8131461069e578063f851a440146106b1575b005b34156101d557600080fd5b6101dd6106c4565b604051901515815260200160405180910390f35b34156101fc57600080fd5b6101c8600160a060020a036004351661072c565b341561021b57600080fd5b61022f600160a060020a036004351661089c565b604051600160a060020a03909116815260200160405180910390f35b341561025657600080fd5b61026a600160a060020a03600435166108b7565b60405190815260200160405180910390f35b341561028757600080fd5b6101c8600160a060020a03600435166108c9565b34156102a657600080fd5b61026a610abb565b34156102b957600080fd5b61022f610ac1565b34156102cc57600080fd5b6102d4610ad0565b60405160208082528190810183818151815260200191508051906020019060200280838360005b838110156103135780820151838201526020016102fb565b505050509050019250505060405180910390f35b341561033257600080fd5b61026a610b38565b341561034557600080fd5b61026a600160a060020a0360043516602435610b3d565b341561036757600080fd5b6101c8600160a060020a036004358116906024359060443516610b82565b341561039057600080fd5b6101c8600160a060020a0360043516610c79565b34156103af57600080fd5b61026a600160a060020a0360043516610d75565b34156103ce57600080fd5b6101c8600160a060020a0360043516610d87565b34156103ed57600080fd5b6101dd600160a060020a03600435811690602435906044351660643560843560a435610e19565b341561041f57600080fd5b6101dd61103d565b341561043257600080fd5b6101c86004356110aa565b6101dd600160a060020a03600435811690602435906044358116906064351660843560a435151561110f565b341561047457600080fd5b6101c8600160a060020a0360043516611537565b341561049357600080fd5b6101c86115d2565b34156104a657600080fd5b6101c8600160a060020a036004351661166c565b34156104c557600080fd5b6101dd600160a060020a036004358116906024351661174e565b34156104ea57600080fd5b6101c8600160a060020a03600435166024356044356117db565b341561050f57600080fd5b6102d46118c4565b341561052257600080fd5b61026a600160a060020a036004358116906024351660443560643561192a565b341561054d57600080fd5b61022f611a5a565b341561056057600080fd5b6101c8600160a060020a0360043516611a69565b341561057f57600080fd5b61026a600160a060020a0360043516611b39565b341561059e57600080fd5b6101c8600160a060020a0360043516602435604435611b4b565b34156105c357600080fd5b61026a600435611c22565b34156105d957600080fd5b6101c8600160a060020a0360043516611c33565b34156105f857600080fd5b6101c8600160a060020a0360043516611d07565b341561061757600080fd5b61022f611e73565b341561062a57600080fd5b61026a600435602435611e82565b341561064357600080fd5b61026a600160a060020a0360043516611ea3565b341561066257600080fd5b6101c8600435600160a060020a0360243516611eb5565b341561068457600080fd5b61026a600160a060020a0360043581169060243516611f48565b34156106a957600080fd5b6101dd611ff3565b34156106bc57600080fd5b61022f611ffc565b6000805433600160a060020a039081169116146106e057600080fd5b600f805460ff191660019081179091557f7d7f00509dd73ac4449f698ae75ccc797895eff5fa9d446d3df387598a26e73590604051901515815260200160405180910390a15060015b90565b6000805433600160a060020a0390811691161461074857600080fd5b600160a060020a03821660009081526003602052604090205460ff16151561076f57600080fd5b50600160a060020a0381166000908152600360205260408120805460ff191690555b6005548110156108985781600160a060020a03166005828154811015156107b457fe5b600091825260209091200154600160a060020a03161415610890576005805460001981019081106107e157fe5b60009182526020909120015460058054600160a060020a03909216918390811061080757fe5b60009182526020909120018054600160a060020a031916600160a060020a03929092169190911790556005805490610843906000198301612485565b507f5611bf3e417d124f97bf2c788843ea8bb502b66079fbee02158ef30b172cb762826000604051600160a060020a039092168252151560208201526040908101905180910390a1610898565b600101610791565b5050565b600a60205260009081526040902054600160a060020a031681565b600e6020526000908152604090205481565b6000805433600160a060020a039081169116146108e557600080fd5b600160a060020a03821615156108fa57600080fd5b600754600160a060020a03166306f2bf628360006040516020015260405160e060020a63ffffffff8416028152600160a060020a039091166004820152602401602060405180830381600087803b151561095357600080fd5b6102c65a03f1151561096457600080fd5b5050506040518051600160a060020a038481166000908152600a602052604090208054600160a060020a03191691831691909117905591506109a790508261200b565b81600160a060020a031663095ea7b38260ff60020a60006040516020015260405160e060020a63ffffffff8516028152600160a060020a0390921660048301526024820152604401602060405180830381600087803b1515610a0857600080fd5b6102c65a03f11515610a1957600080fd5b505050604051805190501515610a2e57600080fd5b600160a060020a0382166000908152600b6020908152604080832060ff60020a9055600c8252808320839055600d8252808320839055600e909152808220919091557f99d2b755eb38920131acb332adf086ea38d15009f223c21f3aa978d6ab234786908390839051600160a060020a039283168152911660208201526040908101905180910390a15050565b60095481565b600154600160a060020a031681565b610ad86124ae565b6004805480602002602001604051908101604052809291908181526020018280548015610b2e57602002820191906000526020600020905b8154600160a060020a03168152600190910190602001808311610b10575b5050505050905090565b601981565b60006b204fce5e3e25026110000000821115610b5857600080fd5b50600160a060020a0382166000908152600e60205260409020546127109081018202045b92915050565b60005433600160a060020a03908116911614610b9d57600080fd5b82600160a060020a031663a9059cbb828460006040516020015260405160e060020a63ffffffff8516028152600160a060020a0390921660048301526024820152604401602060405180830381600087803b1515610bfa57600080fd5b6102c65a03f11515610c0b57600080fd5b505050604051805190501515610c2057600080fd5b7f72cb8a894ddb372ceec3d2a7648d86f17d5a15caae0e986c53109b8a9a9385e6838383604051600160a060020a03938416815260208101929092529091166040808301919091526060909101905180910390a1505050565b60005433600160a060020a03908116911614610c9457600080fd5b600160a060020a03811660009081526003602052604090205460ff1615610cba57600080fd5b60055460329010610cca57600080fd5b7f5611bf3e417d124f97bf2c788843ea8bb502b66079fbee02158ef30b172cb762816001604051600160a060020a039092168252151560208201526040908101905180910390a1600160a060020a0381166000908152600360205260409020805460ff191660019081179091556005805490918101610d498382612485565b5060009182526020909120018054600160a060020a031916600160a060020a0392909216919091179055565b600b6020526000908152604090205481565b60005433600160a060020a03908116911614610da257600080fd5b600160a060020a0381161515610db757600080fd5b60088054600160a060020a031916600160a060020a0383811691909117918290557f38622430bb6defd4452b087e8d0b4a6d1c4d35c179c2d7d875d4abb272b9d88b9116604051600160a060020a03909116815260200160405180910390a150565b600080808080806b204fce5e3e250261100000008b10610e3857600080fd5b6b204fce5e3e250261100000008910610e5057600080fd5b600160a060020a038c166000805160206124df8339815191521415610f1f5789945084600160a060020a03166370a082313060006040516020015260405160e060020a63ffffffff8416028152600160a060020a039091166004820152602401602060405180830381600087803b1515610ec957600080fd5b6102c65a03f11515610eda57600080fd5b505050604051805194505088841080610f0c5750600160a060020a0385166000908152600b6020526040902054898503105b15610f1a576000955061102e565b610fd2565b8b94508830600160a060020a0316311015610f3d576000955061102e565b600160a060020a0385166000818152600c602052604080822054928e9290916370a08231913091516020015260405160e060020a63ffffffff8416028152600160a060020a039091166004820152602401602060405180830381600087803b1515610fa757600080fd5b6102c65a03f11515610fb857600080fd5b50505060405180519050011115610fd2576000955061102e565b866ec097ce7bc90715b34b9f1000000000811515610fec57fe5b04925082881115611000576000955061102e565b600160a060020a0385166000908152600d602052604090205491506110258389611e82565b90508181101595505b50505050509695505050505050565b600160a060020a03331660009081526003602052604081205460ff16151561106457600080fd5b600f805460ff191690557f7d7f00509dd73ac4449f698ae75ccc797895eff5fa9d446d3df387598a26e7356000604051901515815260200160405180910390a150600190565b60005433600160a060020a039081169116146110c557600080fd5b6127108111156110d457600080fd5b60098190557f8c4d35e54a3f2ef1134138fd8ea3daee6a3c89e10d2665996babdf70261e2c768160405190815260200160405180910390a150565b600f546000908190819081908190819060ff16151561112d57600080fd5b60085433600160a060020a0390811691161461114857600080fd5b6111528c8b61174e565b151561115d57600080fd5b86156111ab576000881161117057600080fd5b600160a060020a038c166000805160206124df83398151915214156111a057348b1461119b57600080fd5b6111ab565b34156111ab57600080fd5b600160a060020a038c166000805160206124df83398151915214611259578b600160a060020a03166323b872dd33308e60006040516020015260405160e060020a63ffffffff8616028152600160a060020a0393841660048201529190921660248201526044810191909152606401602060405180830381600087803b151561123357600080fd5b6102c65a03f1151561124457600080fd5b50505060405180519050151561125957600080fd5b6112658c8b8d8b6120c8565b9450600160028906149350600160a060020a038c166000805160206124df83398151915214156113c75783151561133f5761129f8b611c22565b600160a060020a03808c166000908152600a6020526040808220549092169450919250839163f39b5b9b91849160019160ff60020a9190516020015260405160e060020a63ffffffff8616028152600481019290925260248201526044016020604051808303818588803b151561131557600080fd5b6125ee5a03f1151561132657600080fd5b5050505060405180519350508483101561133f57600080fd5b89600160a060020a031663a9059cbb8a8760006040516020015260405160e060020a63ffffffff8516028152600160a060020a0390921660048301526024820152604401602060405180830381600087803b151561139c57600080fd5b6102c65a03f115156113ad57600080fd5b5050506040518051905015156113c257600080fd5b6114af565b83151561147e57600160a060020a03808d166000908152600a602052604080822054909216935083916395e3c50b918e9160019160ff60020a91516020015260405160e060020a63ffffffff8616028152600481019390935260248301919091526044820152606401602060405180830381600087803b151561144957600080fd5b6102c65a03f1151561145a57600080fd5b50505060405180519050925061146f83611c22565b92508483101561147e57600080fd5b600160a060020a03891685156108fc0286604051600060405180830381858888f1935050505015156114af57600080fd5b33600160a060020a03167f3e5691bfb48667c037c1014f0b320bbf4095c37ad5cd1f0b2573366756f54ac68d8d8d898e8a604051600160a060020a039687168152602081019590955292851660408086019190915260608501929092529093166080830152151560a082015260c001905180910390a25060019b9a5050505050505050505050565b60005433600160a060020a0390811691161461155257600080fd5b600160a060020a038116151561156757600080fd5b6001547f3b81caf78fa51ecbc8acb482fd7012a277b428d9b80f9d156e8a54107496cc4090600160a060020a0316604051600160a060020a03909116815260200160405180910390a160018054600160a060020a031916600160a060020a0392909216919091179055565b60015433600160a060020a039081169116146115ed57600080fd5b6001546000547f65da1cfc2c2e81576ad96afb24a581f8e109b7a403b35cbd3243a1c99efdb9ed91600160a060020a039081169116604051600160a060020a039283168152911660208201526040908101905180910390a16001805460008054600160a060020a0319908116600160a060020a03841617909155169055565b60005433600160a060020a0390811691161461168757600080fd5b600160a060020a038116151561169c57600080fd5b7f3b81caf78fa51ecbc8acb482fd7012a277b428d9b80f9d156e8a54107496cc4081604051600160a060020a03909116815260200160405180910390a16000547f65da1cfc2c2e81576ad96afb24a581f8e109b7a403b35cbd3243a1c99efdb9ed908290600160a060020a0316604051600160a060020a039283168152911660208201526040908101905180910390a160008054600160a060020a031916600160a060020a0392909216919091179055565b6000600160a060020a0383166000805160206124df83398151915214801561178f5750600160a060020a038281166000908152600a60205260409020541615155b806117d45750600160a060020a038381166000908152600a602052604090205416158015906117d45750600160a060020a0382166000805160206124df833981519152145b9392505050565b60005433600160a060020a039081169116146117f657600080fd5b600160a060020a038381166000908152600a602052604090205416151561181c57600080fd5b6103e882111561182b57600080fd5b6101f481111561183a57600080fd5b600160a060020a0383166000908152600d60209081526040808320859055600e909152908190208290557ff32eb6e759557a6efda6830142e2357097b173bc01c7a45d4f409fd9ce87387b90849084908490518084600160a060020a0316600160a060020a03168152602001838152602001828152602001935050505060405180910390a1505050565b6118cc6124ae565b6005805480602002602001604051908101604052809291908181526020018280548015610b2e57602002820191906000526020600020908154600160a060020a03168152600190910190602001808311610b10575050505050905090565b6000806000806000806000806119408c8c61174e565b151561194f5760009750611a4b565b600f5460ff1615156119645760009750611a4b565b8915156119745760009750611a4b565b600160a060020a038c166000805160206124df833981519152141561199b578a96506119c7565b600160a060020a038b166000805160206124df83398151915214156119c2578b96506119c7565b600080fd5b6119d28c8c8c6120f1565b90965094508515156119e75760009750611a4b565b6119f28b8d886120f1565b9450611a0090508787610b3d565b9250611a108c8b8d868989610e19565b91508115611a3b57611a348a84611a268f612272565b611a2f8f612272565b612330565b9050611a3e565b50835b611a4881836123cb565b97505b50505050505050949350505050565b600754600160a060020a031681565b60005433600160a060020a03908116911614611a8457600080fd5b600160a060020a03811660009081526002602052604090205460ff1615611aaa57600080fd5b60045460329010611aba57600080fd5b7f091a7a4b85135fdd7e8dbc18b12fabe5cc191ea867aa3c2e1a24a102af61d58b816001604051600160a060020a039092168252151560208201526040908101905180910390a1600160a060020a0381166000908152600260205260409020805460ff191660019081179091556004805490918101610d498382612485565b600c6020526000908152604090205481565b600160a060020a03331660009081526002602052604090205460ff161515611b7257600080fd5b600160a060020a038381166000908152600a6020526040902054161515611b9857600080fd5b600160a060020a0383166000908152600b60209081526040808320859055600c909152908190208290557f5421c19be109a988c30678d84f56dd237868f8147ba05c20a6b78726e8f5d8ca90849084908490518084600160a060020a0316600160a060020a03168152602001838152602001828152602001935050505060405180910390a1505050565b600954612710908103919091020490565b60005433600160a060020a03908116911614611c4e57600080fd5b600160a060020a038181166000908152600a6020526040902054161515611c7457600080fd5b600160a060020a0381166000908152600a602090815260408083208054600160a060020a0319169055600b8252808320839055600c8252808320839055600d8252808320839055600e909152808220919091557f6621c4efc5efa31320394260425b7d14cbb9d7e3754b2c98c04af66b1cbf315b90829051600160a060020a03909116815260200160405180910390a150565b6000805433600160a060020a03908116911614611d2357600080fd5b600160a060020a03821660009081526002602052604090205460ff161515611d4a57600080fd5b50600160a060020a0381166000908152600260205260408120805460ff191690555b6004548110156108985781600160a060020a0316600482815481101515611d8f57fe5b600091825260209091200154600160a060020a03161415611e6b57600480546000198101908110611dbc57fe5b60009182526020909120015460048054600160a060020a039092169183908110611de257fe5b60009182526020909120018054600160a060020a031916600160a060020a0392909216919091179055600480546000190190611e1e9082612485565b507f091a7a4b85135fdd7e8dbc18b12fabe5cc191ea867aa3c2e1a24a102af61d58b826000604051600160a060020a039092168252151560208201526040908101905180910390a1610898565b600101611d6c565b600854600160a060020a031681565b60008282808201614e2082840302811515611e9957fe5b0595945050505050565b600d6020526000908152604090205481565b60005433600160a060020a03908116911614611ed057600080fd5b600160a060020a03811682156108fc0283604051600060405180830381858888f193505050501515611f0157600080fd5b7fec47e7ed86c86774d1a72c19f35c639911393fe7c1a34031fdbd260890da90de8282604051918252600160a060020a031660208201526040908101905180910390a15050565b6000600160a060020a0383166000805160206124df8339815191521415611f7a5750600160a060020a03811631610b7c565b82600160a060020a03166370a082318360006040516020015260405160e060020a63ffffffff8416028152600160a060020a039091166004820152602401602060405180830381600087803b1515611fd157600080fd5b6102c65a03f11515611fe257600080fd5b505050604051805190509050610b7c565b600f5460ff1681565b600054600160a060020a031681565b600160a060020a0381166000805160206124df833981519152141561204b57600160a060020a0381166000908152600660205260409020601290556120c5565b80600160a060020a031663313ce5676000604051602001526040518163ffffffff1660e060020a028152600401602060405180830381600087803b151561209157600080fd5b6102c65a03f115156120a257600080fd5b5050506040518051600160a060020a038316600090815260066020526040902055505b50565b60006120e6836120d787612272565b6120e087612272565b856123f8565b90505b949350505050565b6000808080600160a060020a0387166000805160206124df83398151915214156121c157600160a060020a038087166000908152600a602052604090205416915061213b85611c22565b90508015156121505760009350839250612268565b81600160a060020a031663cd7724c38260006040516020015260405160e060020a63ffffffff84160281526004810191909152602401602060405180830381600087803b151561219f57600080fd5b6102c65a03f115156121b057600080fd5b50505060405180519050935061224e565b600160a060020a038088166000908152600a602052604080822054909216935061224b9184916395b68fe791899190516020015260405160e060020a63ffffffff84160281526004810191909152602401602060405180830381600087803b151561222b57600080fd5b6102c65a03f1151561223c57600080fd5b50505060405180519050611c22565b93505b612265858561225c8a612272565b611a2f8a612272565b92505b5050935093915050565b600080600160a060020a0383166000805160206124df833981519152141561229d576012915061232a565b50600160a060020a0382166000908152600660205260409020548015156123265782600160a060020a031663313ce5676000604051602001526040518163ffffffff1660e060020a028152600401602060405180830381600087803b151561230457600080fd5b6102c65a03f1151561231557600080fd5b50505060405180519050915061232a565b8091505b50919050565b60006b204fce5e3e2502611000000085111561234b57600080fd5b6b204fce5e3e2502611000000084111561236457600080fd5b82821061239f576012838303111561237b57600080fd5b84838303600a0a02670de0b6b3a7640000850281151561239757fe5b0490506120e9565b601282840311156123af57600080fd5b84828403600a0a670de0b6b3a764000086020281151561239757fe5b6000816123d95760006123dc565b60015b60ff1660028406146123f157600183036117d4565b5090919050565b60006b204fce5e3e2502611000000085111561241357600080fd5b69d3c21bcecceda100000082111561242a57600080fd5b838310612459576012848403111561244157600080fd5b670de0b6b3a7640000858302858503600a0a02612397565b6012838503111561246957600080fd5b828403600a0a670de0b6b3a76400000282860281151561239757fe5b8154818355818115116124a9576000838152602090206124a99181019083016124c0565b505050565b60206040519081016040526000815290565b61072991905b808211156124da57600081556001016124c6565b50905600000000000000000000000000eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeea165627a7a72305820386ed32aa526e4d140c16534352a5b06e0a13e482f8bd08a73fa6107f882dd060029000000000000000000000000c0a47dfe034b400b47bdad5fecda2621de6c4d950000000000000000000000008fda86efcbf7480984b6b6adf9bf7105837fb62e00000000000000000000000065bf64ff5f51272f729bdcd7acfb00677ced86cd

Deployed Bytecode

0x6060604052600436106101c85763ffffffff60e060020a60003504166299d38681146101ca57806301a12fd3146101f15780630dd94b96146102105780631db950781461024b5780631fc1e25f1461027c57806324a9d8531461029b57806326782247146102ae57806327a099d8146102c157806333d8262c146103275780633a6e7d391461033a5780633ccdbb281461035c578063408ee7fe1461038557806348caa206146103a457806354a325a6146103c35780635a65d4c9146103e25780636940030f1461041457806369fe0e2d146104275780636cf698111461043d57806375829def1461046957806377f50f97146104885780637acc86781461049b5780637be98598146104ba5780637bec03aa146104df5780637c423f54146105045780637cd44272146105175780638bdb2afa146105425780639870d7fe14610555578063998614cb146105745780639b9a33ff14610593578063a9afaaaf146105b8578063abffc9ac146105ce578063ac8a584a146105ed578063b78b842d1461060c578063bc91970a1461061f578063c3e0d71214610638578063ce56c45414610657578063d4fac45d14610679578063d621e8131461069e578063f851a440146106b1575b005b34156101d557600080fd5b6101dd6106c4565b604051901515815260200160405180910390f35b34156101fc57600080fd5b6101c8600160a060020a036004351661072c565b341561021b57600080fd5b61022f600160a060020a036004351661089c565b604051600160a060020a03909116815260200160405180910390f35b341561025657600080fd5b61026a600160a060020a03600435166108b7565b60405190815260200160405180910390f35b341561028757600080fd5b6101c8600160a060020a03600435166108c9565b34156102a657600080fd5b61026a610abb565b34156102b957600080fd5b61022f610ac1565b34156102cc57600080fd5b6102d4610ad0565b60405160208082528190810183818151815260200191508051906020019060200280838360005b838110156103135780820151838201526020016102fb565b505050509050019250505060405180910390f35b341561033257600080fd5b61026a610b38565b341561034557600080fd5b61026a600160a060020a0360043516602435610b3d565b341561036757600080fd5b6101c8600160a060020a036004358116906024359060443516610b82565b341561039057600080fd5b6101c8600160a060020a0360043516610c79565b34156103af57600080fd5b61026a600160a060020a0360043516610d75565b34156103ce57600080fd5b6101c8600160a060020a0360043516610d87565b34156103ed57600080fd5b6101dd600160a060020a03600435811690602435906044351660643560843560a435610e19565b341561041f57600080fd5b6101dd61103d565b341561043257600080fd5b6101c86004356110aa565b6101dd600160a060020a03600435811690602435906044358116906064351660843560a435151561110f565b341561047457600080fd5b6101c8600160a060020a0360043516611537565b341561049357600080fd5b6101c86115d2565b34156104a657600080fd5b6101c8600160a060020a036004351661166c565b34156104c557600080fd5b6101dd600160a060020a036004358116906024351661174e565b34156104ea57600080fd5b6101c8600160a060020a03600435166024356044356117db565b341561050f57600080fd5b6102d46118c4565b341561052257600080fd5b61026a600160a060020a036004358116906024351660443560643561192a565b341561054d57600080fd5b61022f611a5a565b341561056057600080fd5b6101c8600160a060020a0360043516611a69565b341561057f57600080fd5b61026a600160a060020a0360043516611b39565b341561059e57600080fd5b6101c8600160a060020a0360043516602435604435611b4b565b34156105c357600080fd5b61026a600435611c22565b34156105d957600080fd5b6101c8600160a060020a0360043516611c33565b34156105f857600080fd5b6101c8600160a060020a0360043516611d07565b341561061757600080fd5b61022f611e73565b341561062a57600080fd5b61026a600435602435611e82565b341561064357600080fd5b61026a600160a060020a0360043516611ea3565b341561066257600080fd5b6101c8600435600160a060020a0360243516611eb5565b341561068457600080fd5b61026a600160a060020a0360043581169060243516611f48565b34156106a957600080fd5b6101dd611ff3565b34156106bc57600080fd5b61022f611ffc565b6000805433600160a060020a039081169116146106e057600080fd5b600f805460ff191660019081179091557f7d7f00509dd73ac4449f698ae75ccc797895eff5fa9d446d3df387598a26e73590604051901515815260200160405180910390a15060015b90565b6000805433600160a060020a0390811691161461074857600080fd5b600160a060020a03821660009081526003602052604090205460ff16151561076f57600080fd5b50600160a060020a0381166000908152600360205260408120805460ff191690555b6005548110156108985781600160a060020a03166005828154811015156107b457fe5b600091825260209091200154600160a060020a03161415610890576005805460001981019081106107e157fe5b60009182526020909120015460058054600160a060020a03909216918390811061080757fe5b60009182526020909120018054600160a060020a031916600160a060020a03929092169190911790556005805490610843906000198301612485565b507f5611bf3e417d124f97bf2c788843ea8bb502b66079fbee02158ef30b172cb762826000604051600160a060020a039092168252151560208201526040908101905180910390a1610898565b600101610791565b5050565b600a60205260009081526040902054600160a060020a031681565b600e6020526000908152604090205481565b6000805433600160a060020a039081169116146108e557600080fd5b600160a060020a03821615156108fa57600080fd5b600754600160a060020a03166306f2bf628360006040516020015260405160e060020a63ffffffff8416028152600160a060020a039091166004820152602401602060405180830381600087803b151561095357600080fd5b6102c65a03f1151561096457600080fd5b5050506040518051600160a060020a038481166000908152600a602052604090208054600160a060020a03191691831691909117905591506109a790508261200b565b81600160a060020a031663095ea7b38260ff60020a60006040516020015260405160e060020a63ffffffff8516028152600160a060020a0390921660048301526024820152604401602060405180830381600087803b1515610a0857600080fd5b6102c65a03f11515610a1957600080fd5b505050604051805190501515610a2e57600080fd5b600160a060020a0382166000908152600b6020908152604080832060ff60020a9055600c8252808320839055600d8252808320839055600e909152808220919091557f99d2b755eb38920131acb332adf086ea38d15009f223c21f3aa978d6ab234786908390839051600160a060020a039283168152911660208201526040908101905180910390a15050565b60095481565b600154600160a060020a031681565b610ad86124ae565b6004805480602002602001604051908101604052809291908181526020018280548015610b2e57602002820191906000526020600020905b8154600160a060020a03168152600190910190602001808311610b10575b5050505050905090565b601981565b60006b204fce5e3e25026110000000821115610b5857600080fd5b50600160a060020a0382166000908152600e60205260409020546127109081018202045b92915050565b60005433600160a060020a03908116911614610b9d57600080fd5b82600160a060020a031663a9059cbb828460006040516020015260405160e060020a63ffffffff8516028152600160a060020a0390921660048301526024820152604401602060405180830381600087803b1515610bfa57600080fd5b6102c65a03f11515610c0b57600080fd5b505050604051805190501515610c2057600080fd5b7f72cb8a894ddb372ceec3d2a7648d86f17d5a15caae0e986c53109b8a9a9385e6838383604051600160a060020a03938416815260208101929092529091166040808301919091526060909101905180910390a1505050565b60005433600160a060020a03908116911614610c9457600080fd5b600160a060020a03811660009081526003602052604090205460ff1615610cba57600080fd5b60055460329010610cca57600080fd5b7f5611bf3e417d124f97bf2c788843ea8bb502b66079fbee02158ef30b172cb762816001604051600160a060020a039092168252151560208201526040908101905180910390a1600160a060020a0381166000908152600360205260409020805460ff191660019081179091556005805490918101610d498382612485565b5060009182526020909120018054600160a060020a031916600160a060020a0392909216919091179055565b600b6020526000908152604090205481565b60005433600160a060020a03908116911614610da257600080fd5b600160a060020a0381161515610db757600080fd5b60088054600160a060020a031916600160a060020a0383811691909117918290557f38622430bb6defd4452b087e8d0b4a6d1c4d35c179c2d7d875d4abb272b9d88b9116604051600160a060020a03909116815260200160405180910390a150565b600080808080806b204fce5e3e250261100000008b10610e3857600080fd5b6b204fce5e3e250261100000008910610e5057600080fd5b600160a060020a038c166000805160206124df8339815191521415610f1f5789945084600160a060020a03166370a082313060006040516020015260405160e060020a63ffffffff8416028152600160a060020a039091166004820152602401602060405180830381600087803b1515610ec957600080fd5b6102c65a03f11515610eda57600080fd5b505050604051805194505088841080610f0c5750600160a060020a0385166000908152600b6020526040902054898503105b15610f1a576000955061102e565b610fd2565b8b94508830600160a060020a0316311015610f3d576000955061102e565b600160a060020a0385166000818152600c602052604080822054928e9290916370a08231913091516020015260405160e060020a63ffffffff8416028152600160a060020a039091166004820152602401602060405180830381600087803b1515610fa757600080fd5b6102c65a03f11515610fb857600080fd5b50505060405180519050011115610fd2576000955061102e565b866ec097ce7bc90715b34b9f1000000000811515610fec57fe5b04925082881115611000576000955061102e565b600160a060020a0385166000908152600d602052604090205491506110258389611e82565b90508181101595505b50505050509695505050505050565b600160a060020a03331660009081526003602052604081205460ff16151561106457600080fd5b600f805460ff191690557f7d7f00509dd73ac4449f698ae75ccc797895eff5fa9d446d3df387598a26e7356000604051901515815260200160405180910390a150600190565b60005433600160a060020a039081169116146110c557600080fd5b6127108111156110d457600080fd5b60098190557f8c4d35e54a3f2ef1134138fd8ea3daee6a3c89e10d2665996babdf70261e2c768160405190815260200160405180910390a150565b600f546000908190819081908190819060ff16151561112d57600080fd5b60085433600160a060020a0390811691161461114857600080fd5b6111528c8b61174e565b151561115d57600080fd5b86156111ab576000881161117057600080fd5b600160a060020a038c166000805160206124df83398151915214156111a057348b1461119b57600080fd5b6111ab565b34156111ab57600080fd5b600160a060020a038c166000805160206124df83398151915214611259578b600160a060020a03166323b872dd33308e60006040516020015260405160e060020a63ffffffff8616028152600160a060020a0393841660048201529190921660248201526044810191909152606401602060405180830381600087803b151561123357600080fd5b6102c65a03f1151561124457600080fd5b50505060405180519050151561125957600080fd5b6112658c8b8d8b6120c8565b9450600160028906149350600160a060020a038c166000805160206124df83398151915214156113c75783151561133f5761129f8b611c22565b600160a060020a03808c166000908152600a6020526040808220549092169450919250839163f39b5b9b91849160019160ff60020a9190516020015260405160e060020a63ffffffff8616028152600481019290925260248201526044016020604051808303818588803b151561131557600080fd5b6125ee5a03f1151561132657600080fd5b5050505060405180519350508483101561133f57600080fd5b89600160a060020a031663a9059cbb8a8760006040516020015260405160e060020a63ffffffff8516028152600160a060020a0390921660048301526024820152604401602060405180830381600087803b151561139c57600080fd5b6102c65a03f115156113ad57600080fd5b5050506040518051905015156113c257600080fd5b6114af565b83151561147e57600160a060020a03808d166000908152600a602052604080822054909216935083916395e3c50b918e9160019160ff60020a91516020015260405160e060020a63ffffffff8616028152600481019390935260248301919091526044820152606401602060405180830381600087803b151561144957600080fd5b6102c65a03f1151561145a57600080fd5b50505060405180519050925061146f83611c22565b92508483101561147e57600080fd5b600160a060020a03891685156108fc0286604051600060405180830381858888f1935050505015156114af57600080fd5b33600160a060020a03167f3e5691bfb48667c037c1014f0b320bbf4095c37ad5cd1f0b2573366756f54ac68d8d8d898e8a604051600160a060020a039687168152602081019590955292851660408086019190915260608501929092529093166080830152151560a082015260c001905180910390a25060019b9a5050505050505050505050565b60005433600160a060020a0390811691161461155257600080fd5b600160a060020a038116151561156757600080fd5b6001547f3b81caf78fa51ecbc8acb482fd7012a277b428d9b80f9d156e8a54107496cc4090600160a060020a0316604051600160a060020a03909116815260200160405180910390a160018054600160a060020a031916600160a060020a0392909216919091179055565b60015433600160a060020a039081169116146115ed57600080fd5b6001546000547f65da1cfc2c2e81576ad96afb24a581f8e109b7a403b35cbd3243a1c99efdb9ed91600160a060020a039081169116604051600160a060020a039283168152911660208201526040908101905180910390a16001805460008054600160a060020a0319908116600160a060020a03841617909155169055565b60005433600160a060020a0390811691161461168757600080fd5b600160a060020a038116151561169c57600080fd5b7f3b81caf78fa51ecbc8acb482fd7012a277b428d9b80f9d156e8a54107496cc4081604051600160a060020a03909116815260200160405180910390a16000547f65da1cfc2c2e81576ad96afb24a581f8e109b7a403b35cbd3243a1c99efdb9ed908290600160a060020a0316604051600160a060020a039283168152911660208201526040908101905180910390a160008054600160a060020a031916600160a060020a0392909216919091179055565b6000600160a060020a0383166000805160206124df83398151915214801561178f5750600160a060020a038281166000908152600a60205260409020541615155b806117d45750600160a060020a038381166000908152600a602052604090205416158015906117d45750600160a060020a0382166000805160206124df833981519152145b9392505050565b60005433600160a060020a039081169116146117f657600080fd5b600160a060020a038381166000908152600a602052604090205416151561181c57600080fd5b6103e882111561182b57600080fd5b6101f481111561183a57600080fd5b600160a060020a0383166000908152600d60209081526040808320859055600e909152908190208290557ff32eb6e759557a6efda6830142e2357097b173bc01c7a45d4f409fd9ce87387b90849084908490518084600160a060020a0316600160a060020a03168152602001838152602001828152602001935050505060405180910390a1505050565b6118cc6124ae565b6005805480602002602001604051908101604052809291908181526020018280548015610b2e57602002820191906000526020600020908154600160a060020a03168152600190910190602001808311610b10575050505050905090565b6000806000806000806000806119408c8c61174e565b151561194f5760009750611a4b565b600f5460ff1615156119645760009750611a4b565b8915156119745760009750611a4b565b600160a060020a038c166000805160206124df833981519152141561199b578a96506119c7565b600160a060020a038b166000805160206124df83398151915214156119c2578b96506119c7565b600080fd5b6119d28c8c8c6120f1565b90965094508515156119e75760009750611a4b565b6119f28b8d886120f1565b9450611a0090508787610b3d565b9250611a108c8b8d868989610e19565b91508115611a3b57611a348a84611a268f612272565b611a2f8f612272565b612330565b9050611a3e565b50835b611a4881836123cb565b97505b50505050505050949350505050565b600754600160a060020a031681565b60005433600160a060020a03908116911614611a8457600080fd5b600160a060020a03811660009081526002602052604090205460ff1615611aaa57600080fd5b60045460329010611aba57600080fd5b7f091a7a4b85135fdd7e8dbc18b12fabe5cc191ea867aa3c2e1a24a102af61d58b816001604051600160a060020a039092168252151560208201526040908101905180910390a1600160a060020a0381166000908152600260205260409020805460ff191660019081179091556004805490918101610d498382612485565b600c6020526000908152604090205481565b600160a060020a03331660009081526002602052604090205460ff161515611b7257600080fd5b600160a060020a038381166000908152600a6020526040902054161515611b9857600080fd5b600160a060020a0383166000908152600b60209081526040808320859055600c909152908190208290557f5421c19be109a988c30678d84f56dd237868f8147ba05c20a6b78726e8f5d8ca90849084908490518084600160a060020a0316600160a060020a03168152602001838152602001828152602001935050505060405180910390a1505050565b600954612710908103919091020490565b60005433600160a060020a03908116911614611c4e57600080fd5b600160a060020a038181166000908152600a6020526040902054161515611c7457600080fd5b600160a060020a0381166000908152600a602090815260408083208054600160a060020a0319169055600b8252808320839055600c8252808320839055600d8252808320839055600e909152808220919091557f6621c4efc5efa31320394260425b7d14cbb9d7e3754b2c98c04af66b1cbf315b90829051600160a060020a03909116815260200160405180910390a150565b6000805433600160a060020a03908116911614611d2357600080fd5b600160a060020a03821660009081526002602052604090205460ff161515611d4a57600080fd5b50600160a060020a0381166000908152600260205260408120805460ff191690555b6004548110156108985781600160a060020a0316600482815481101515611d8f57fe5b600091825260209091200154600160a060020a03161415611e6b57600480546000198101908110611dbc57fe5b60009182526020909120015460048054600160a060020a039092169183908110611de257fe5b60009182526020909120018054600160a060020a031916600160a060020a0392909216919091179055600480546000190190611e1e9082612485565b507f091a7a4b85135fdd7e8dbc18b12fabe5cc191ea867aa3c2e1a24a102af61d58b826000604051600160a060020a039092168252151560208201526040908101905180910390a1610898565b600101611d6c565b600854600160a060020a031681565b60008282808201614e2082840302811515611e9957fe5b0595945050505050565b600d6020526000908152604090205481565b60005433600160a060020a03908116911614611ed057600080fd5b600160a060020a03811682156108fc0283604051600060405180830381858888f193505050501515611f0157600080fd5b7fec47e7ed86c86774d1a72c19f35c639911393fe7c1a34031fdbd260890da90de8282604051918252600160a060020a031660208201526040908101905180910390a15050565b6000600160a060020a0383166000805160206124df8339815191521415611f7a5750600160a060020a03811631610b7c565b82600160a060020a03166370a082318360006040516020015260405160e060020a63ffffffff8416028152600160a060020a039091166004820152602401602060405180830381600087803b1515611fd157600080fd5b6102c65a03f11515611fe257600080fd5b505050604051805190509050610b7c565b600f5460ff1681565b600054600160a060020a031681565b600160a060020a0381166000805160206124df833981519152141561204b57600160a060020a0381166000908152600660205260409020601290556120c5565b80600160a060020a031663313ce5676000604051602001526040518163ffffffff1660e060020a028152600401602060405180830381600087803b151561209157600080fd5b6102c65a03f115156120a257600080fd5b5050506040518051600160a060020a038316600090815260066020526040902055505b50565b60006120e6836120d787612272565b6120e087612272565b856123f8565b90505b949350505050565b6000808080600160a060020a0387166000805160206124df83398151915214156121c157600160a060020a038087166000908152600a602052604090205416915061213b85611c22565b90508015156121505760009350839250612268565b81600160a060020a031663cd7724c38260006040516020015260405160e060020a63ffffffff84160281526004810191909152602401602060405180830381600087803b151561219f57600080fd5b6102c65a03f115156121b057600080fd5b50505060405180519050935061224e565b600160a060020a038088166000908152600a602052604080822054909216935061224b9184916395b68fe791899190516020015260405160e060020a63ffffffff84160281526004810191909152602401602060405180830381600087803b151561222b57600080fd5b6102c65a03f1151561223c57600080fd5b50505060405180519050611c22565b93505b612265858561225c8a612272565b611a2f8a612272565b92505b5050935093915050565b600080600160a060020a0383166000805160206124df833981519152141561229d576012915061232a565b50600160a060020a0382166000908152600660205260409020548015156123265782600160a060020a031663313ce5676000604051602001526040518163ffffffff1660e060020a028152600401602060405180830381600087803b151561230457600080fd5b6102c65a03f1151561231557600080fd5b50505060405180519050915061232a565b8091505b50919050565b60006b204fce5e3e2502611000000085111561234b57600080fd5b6b204fce5e3e2502611000000084111561236457600080fd5b82821061239f576012838303111561237b57600080fd5b84838303600a0a02670de0b6b3a7640000850281151561239757fe5b0490506120e9565b601282840311156123af57600080fd5b84828403600a0a670de0b6b3a764000086020281151561239757fe5b6000816123d95760006123dc565b60015b60ff1660028406146123f157600183036117d4565b5090919050565b60006b204fce5e3e2502611000000085111561241357600080fd5b69d3c21bcecceda100000082111561242a57600080fd5b838310612459576012848403111561244157600080fd5b670de0b6b3a7640000858302858503600a0a02612397565b6012838503111561246957600080fd5b828403600a0a670de0b6b3a76400000282860281151561239757fe5b8154818355818115116124a9576000838152602090206124a99181019083016124c0565b505050565b60206040519081016040526000815290565b61072991905b808211156124da57600081556001016124c6565b50905600000000000000000000000000eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeea165627a7a72305820386ed32aa526e4d140c16534352a5b06e0a13e482f8bd08a73fa6107f882dd060029

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

000000000000000000000000c0a47dfe034b400b47bdad5fecda2621de6c4d950000000000000000000000008fda86efcbf7480984b6b6adf9bf7105837fb62e00000000000000000000000065bf64ff5f51272f729bdcd7acfb00677ced86cd

-----Decoded View---------------
Arg [0] : _uniswapFactory (address): 0xc0a47dFe034B400B47bDaD5FecDa2621de6c4d95
Arg [1] : _admin (address): 0x8fDa86efcBf7480984b6B6AdF9Bf7105837Fb62e
Arg [2] : _kyberNetwork (address): 0x65bF64Ff5f51272f729BDcD7AcFB00677ced86Cd

-----Encoded View---------------
3 Constructor Arguments found :
Arg [0] : 000000000000000000000000c0a47dfe034b400b47bdad5fecda2621de6c4d95
Arg [1] : 0000000000000000000000008fda86efcbf7480984b6b6adf9bf7105837fb62e
Arg [2] : 00000000000000000000000065bf64ff5f51272f729bdcd7acfb00677ced86cd


Deployed Bytecode Sourcemap

11941:14886:0:-;;;;;;;;;-1:-1:-1;;;11941:14886:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;22573:175;;;;;;;;;;;;;;;;;;;;;;;;;;;;;3292:463;;;;;;;;;;-1:-1:-1;;;;;3292:463:0;;;;;12305:49;;;;;;;;;;-1:-1:-1;;;;;12305:49:0;;;;;;;;-1:-1:-1;;;;;12305:49:0;;;;;;;;;;;;;;12800:56;;;;;;;;;;-1:-1:-1;;;;;12800:56:0;;;;;;;;;;;;;;;;;;;;20833:723;;;;;;;;;;-1:-1:-1;;;;;20833:723:0;;;;;12177:36;;;;;;;;;;;;916:27;;;;;;;;;;;;1527:98;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;23:1:-1;8:100;33:3;30:1;27:2;8:100;;;99:1;94:3;90;84:5;71:3;;;64:6;52:2;45:3;8:100;;;12:14;3:109;;;;;;;;;;;;;;;;;12048:41:0;;;;;;;;;;;;25591:249;;;;;;;;;;-1:-1:-1;;;;;25591:249:0;;;;;;;5193:189;;;;;;;;;;-1:-1:-1;;;;;5193:189:0;;;;;;;;;;;;;2976:308;;;;;;;;;;-1:-1:-1;;;;;2976:308:0;;;;;12428:53;;;;;;;;;;-1:-1:-1;;;;;12428:53:0;;;;;23012:229;;;;;;;;;;-1:-1:-1;;;;;23012:229:0;;;;;23506:1364;;;;;;;;;;-1:-1:-1;;;;;23506:1364:0;;;;;;;;;;;;;;;;;;;22756:180;;;;;;;;;;;;19302:175;;;;;;;;;;;;;;16245:2998;;-1:-1:-1;;;;;16245:2998:0;;;;;;;;;;;;;;;;;;;;;;;;1945:187;;;;;;;;;;-1:-1:-1;;;;;1945:187:0;;;;;2714:194;;;;;;;;;;;;2313:223;;;;;;;;;;-1:-1:-1;;;;;2313:223:0;;;;;22069:440;;;;;;;;;;-1:-1:-1;;;;;22069:440:0;;;;;;;;;;19614:560;;;;;;;;;;-1:-1:-1;;;;;19614:560:0;;;;;;;;;1633:96;;;;;;;;;;;;13627:1998;;;;;;;;;;-1:-1:-1;;;;;13627:1998:0;;;;;;;;;;;;;;12098:36;;;;;;;;;;;;3824:319;;;;;;;;;;-1:-1:-1;;;;;3824:319:0;;;;;12488:53;;;;;;;;;;-1:-1:-1;;;;;12488:53:0;;;;;20308:427;;;;;;;;;;-1:-1:-1;;;;;20308:427:0;;;;;;;;;25418:165;;;;;;;;;;;;;;21605:456;;;;;;;;;;-1:-1:-1;;;;;21605:456:0;;;;;4151:481;;;;;;;;;;-1:-1:-1;;;;;4151:481:0;;;;;12141:27;;;;;;;;;;;;25115:295;;;;;;;;;;;;;;;;12641:63;;;;;;;;;;-1:-1:-1;;;;;12641:63:0;;;;;5494:153;;;;;;;;;;;;-1:-1:-1;;;;;5494:153:0;;;;;9062:213;;;;;;;;;;-1:-1:-1;;;;;9062:213:0;;;;;;;;;;12865:31;;;;;;;;;;;;889:20;;;;;;;;;;;;22573:175;22648:4;1309:5;;1295:10;-1:-1:-1;;;;;1295:19:0;;;1309:5;;1295:19;1287:28;;;;;;22670:12;:19;;-1:-1:-1;;22670:19:0;22685:4;22670:19;;;;;;22700:18;;;;;;;;;;;;;;;;;;-1:-1:-1;22736:4:0;1326:1;22573:175;:::o;3292:463::-;3441:6;1309:5;;1295:10;-1:-1:-1;;;;;1295:19:0;;;1309:5;;1295:19;1287:28;;;;;;-1:-1:-1;;;;;3369:17:0;;;;;;:8;:17;;;;;;;;3361:26;;;;;;;;-1:-1:-1;;;;;;3398:17:0;;3418:5;3398:17;;;:8;:17;;;;;:25;;-1:-1:-1;;3398:25:0;;;3436:312;3457:13;:20;3453:24;;3436:312;;;3523:7;-1:-1:-1;;;;;3503:27:0;:13;3517:1;3503:16;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;3503:16:0;:27;3499:238;;;3570:13;3584:20;;-1:-1:-1;;3584:24:0;;;3570:39;;;;;;;;;;;;;;;;3551:13;:16;;-1:-1:-1;;;;;3570:39:0;;;;3565:1;;3551:16;;;;;;;;;;;;;;;:58;;-1:-1:-1;;;;;;3551:58:0;-1:-1:-1;;;;;3551:58:0;;;;;;;;;;3628:13;:22;;;;;-1:-1:-1;;3628:22:0;;;:::i;:::-;;3669:28;3682:7;3691:5;3669:28;;-1:-1:-1;;;;;3669:28:0;;;;;;;;;;;;;;;;;;;;;;3716:5;;3499:238;3479:3;;3436:312;;;3292:463;;:::o;12305:49::-;;;;;;;;;;;;-1:-1:-1;;;;;12305:49:0;;:::o;12800:56::-;;;;;;;;;;;;;:::o;20833:723::-;20957:31;1309:5;;1295:10;-1:-1:-1;;;;;1295:19:0;;;1309:5;;1295:19;1287:28;;;;;;-1:-1:-1;;;;;20924:19:0;;;;20916:28;;;;;;21021:14;;-1:-1:-1;;;;;21021:14:0;:26;21048:5;21021:14;:33;;;;;;;-1:-1:-1;;;21021:33:0;;;;;;-1:-1:-1;;;;;21021:33:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;21076:29:0;;;;;;;:13;:29;;;;;:56;;-1:-1:-1;;;;;;21076:56:0;;;;;;;;;;;-1:-1:-1;21143:18:0;;-1:-1:-1;21076:29:0;21143:11;:18::i;:::-;21182:5;-1:-1:-1;;;;;21182:13:0;;21196:15;-1:-1:-1;;;21182:40:0;;;;;;;;-1:-1:-1;;;21182:40:0;;;;;;-1:-1:-1;;;;;21182:40:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;21174:49;;;;;;;;-1:-1:-1;;;;;21287:36:0;;;;;;:20;:36;;;;;;;;-1:-1:-1;;;21287:47:0;;21345:20;:36;;;;;:40;;;21396:30;:46;;;;;:50;;;21457:23;:39;;;;;;:43;;;;21513:35;;21316:5;;21532:15;;21513:35;-1:-1:-1;;;;;21513:35:0;;;;;;;;;;;;;;;;;;;;;;20833:723;;:::o;12177:36::-;;;;:::o;916:27::-;;;-1:-1:-1;;;;;916:27:0;;:::o;1527:98::-;1574:9;;:::i;:::-;1603:14;1596:21;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;1596:21:0;;;;;;;;;;;;;;;;;;;;;;;1527:98;:::o;12048:41::-;12087:2;12048:41;:::o;25591:249::-;25709:4;6481:6;25739:17;;;25731:26;;;;;;-1:-1:-1;;;;;;25793:30:0;;;;;;:23;:30;;;;;;25827:5;25785:38;;;25775:49;;:57;25591:249;;;;;:::o;5193:189::-;1309:5;;1295:10;-1:-1:-1;;;;;1295:19:0;;;1309:5;;1295:19;1287:28;;;;;;5296:5;-1:-1:-1;;;;;5296:14:0;;5311:6;5319;5296:30;;;;;;;;-1:-1:-1;;;5296:30:0;;;;;;-1:-1:-1;;;;;5296:30:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;5288:39;;;;;;;;5338:36;5352:5;5359:6;5367;5338:36;;-1:-1:-1;;;;;5338:36:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;5193:189;;;:::o;2976:308::-;1309:5;;1295:10;-1:-1:-1;;;;;1295:19:0;;;1309:5;;1295:19;1287:28;;;;;;-1:-1:-1;;;;;3053:20:0;;;;;;:8;:20;;;;;;;;3052:21;3044:30;;;;;;3116:13;:20;1164:2;3116:37;;3108:46;;;;;;3167:30;3180:10;3192:4;3167:30;;-1:-1:-1;;;;;3167:30:0;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;3208:20:0;;;;;;:8;:20;;;;;:27;;-1:-1:-1;;3208:27:0;3231:4;3208:27;;;;;;3246:13;:30;;:13;;:30;;;:13;:30;;:::i;:::-;-1:-1:-1;3246:30:0;;;;;;;;;;;-1:-1:-1;;;;;;3246:30:0;-1:-1:-1;;;;;3246:30:0;;;;;;;;;;2976:308::o;12428:53::-;;;;;;;;;;;;;:::o;23012:229::-;1309:5;;1295:10;-1:-1:-1;;;;;1295:19:0;;;1309:5;;1295:19;1287:28;;;;;;-1:-1:-1;;;;;23135:18:0;;;;23127:27;;;;;;23165:12;:28;;-1:-1:-1;;;;;;23165:28:0;-1:-1:-1;;;;;23165:28:0;;;;;;;;;;;23204:29;;23220:12;23204:29;;-1:-1:-1;;;;;23204:29:0;;;;;;;;;;;;;;23012:229;:::o;23506:1364::-;23752:4;;;;;;6481:6;23782:19;;23774:28;;;;;;6481:6;23821:20;;23813:29;;;;;;-1:-1:-1;;;;;23942:29:0;;-1:-1:-1;;;;;;;;;;;23942:29:0;23938:572;;;23996:9;23988:17;;24040:5;-1:-1:-1;;;;;24040:15:0;;24056:4;24040:21;;;;;;;;-1:-1:-1;;;24040:21:0;;;;;;-1:-1:-1;;;;;24040:21:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;24098:25:0;;;;:101;;-1:-1:-1;;;;;;24172:27:0;;;;;;:20;:27;;;;;;24144:25;;;:55;24098:101;24076:186;;;24241:5;24234:12;;;;24076:186;23938:572;;;24302:8;24294:16;;24344:10;24329:4;-1:-1:-1;;;;;24329:12:0;;:25;24325:43;;;24363:5;24356:12;;;;24325:43;-1:-1:-1;;;;;24423:27:0;;;;;;:20;:27;;;;;;;;24411:9;;24423:27;;24387:15;;24403:4;;24387:21;;;;;;-1:-1:-1;;;24387:21:0;;;;;;-1:-1:-1;;;;;24387:21:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:33;:63;24383:116;;;24478:5;24471:12;;;;24383:116;24558:11;24547:8;:22;;;;;;;;24522:47;;24632:17;24618:11;:31;24614:49;;;24658:5;24651:12;;;;24614:49;-1:-1:-1;;;;;24700:37:0;;;;;;:30;:37;;;;;;;-1:-1:-1;24767:50:0;24786:17;24805:11;24767:18;:50::i;:::-;24748:70;;24846:16;24836:6;:26;;24829:33;;23506:1364;;;;;;;;;;;;;;:::o;22756:180::-;-1:-1:-1;;;;;1487:10:0;1478:20;22834:4;1478:20;;;:8;:20;;;;;;;;1470:29;;;;;;;;22856:12;:20;;-1:-1:-1;;22856:20:0;;;22887:19;22871:5;22887:19;;;;;;;;;;;;;;;;-1:-1:-1;22924:4:0;22756:180;:::o;19302:175::-;1309:5;;1295:10;-1:-1:-1;;;;;1295:19:0;;;1309:5;;1295:19;1287:28;;;;;;19410:5;19403:12;;;19395:21;;;;;;19429:6;:12;;;19454:15;19438:3;19454:15;;;;;;;;;;;;;;19302:175;:::o;16245:2998::-;16507:12;;16477:4;;;;;;;;;;;;16507:12;;16499:21;;;;;;;;16553:12;;16539:10;-1:-1:-1;;;;;16539:26:0;;;16553:12;;16539:26;16531:35;;;;;;16585:34;16599:8;16609:9;16585:13;:34::i;:::-;16577:43;;;;;;;;16637:8;16633:226;;;16687:1;16670:18;;16662:27;;;;;;-1:-1:-1;;;;;16708:29:0;;-1:-1:-1;;;;;;;;;;;16708:29:0;16704:143;;;16764:9;:22;;16756:31;;;;;;16704:143;;;16832:9;:14;16824:23;;;;;;-1:-1:-1;;;;;17051:29:0;;-1:-1:-1;;;;;;;;;;;17051:29:0;17047:116;;17103:8;-1:-1:-1;;;;;17103:21:0;;17125:10;17145:4;17152:9;17103:59;;;;;;;;-1:-1:-1;;;17103:59:0;;;;;;-1:-1:-1;;;;;17103:59:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;17095:68;;;;;;;;17202:173;17231:8;17264:9;17299;17339:14;17202;:173::i;:::-;17176:199;-1:-1:-1;17438:1:0;17433;17416:18;;:23;;-1:-1:-1;;;;;;17517:29:0;;-1:-1:-1;;;;;;;;;;;17517:29:0;17513:1358;;;17568:20;17567:21;17563:510;;;17684:20;17694:9;17684;:20::i;:::-;-1:-1:-1;;;;;17750:33:0;;;;;;;:13;:33;;;;;;;;;;;-1:-1:-1;17668:36:0;;-1:-1:-1;17750:33:0;;17816:28;;17668:36;;17750:33;;-1:-1:-1;;;17955:8:0;17750:33;17816:181;;;;;;-1:-1:-1;;;17816:181:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;18024:32:0;;;;18016:41;;;;;;18148:9;-1:-1:-1;;;;;18148:18:0;;18167:11;18180:18;18148:51;;;;;;;;-1:-1:-1;;;18148:51:0;;;;;;-1:-1:-1;;;;;18148:51:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;18140:60;;;;;;;;17513:1358;;;18238:20;18237:21;18233:519;;;-1:-1:-1;;;;;18306:32:0;;;;;;;:13;:32;;;;;;;;;;;-1:-1:-1;18306:32:0;;18371:28;;18422:9;;18306:32;;-1:-1:-1;;;18523:8:0;18371:194;;;;;;-1:-1:-1;;;18371:194:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;18358:207;;18655:21;18665:10;18655:9;:21::i;:::-;18642:34;-1:-1:-1;18703:32:0;;;;18695:41;;;;;;-1:-1:-1;;;;;18819:20:0;;:40;;;;18840:18;18819:40;;;;;;;;;;;;;;;;;;;;;;;;;;18910:10;-1:-1:-1;;;;;18883:330:0;;18948:8;18981:9;19021;19061:18;19111:11;19155:20;18883:330;;-1:-1:-1;;;;;18883:330:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;19231:4:0;;16245:2998;-1:-1:-1;;;;;;;;;;;16245:2998:0:o;1945:187::-;1309:5;;1295:10;-1:-1:-1;;;;;1295:19:0;;;1309:5;;1295:19;1287:28;;;;;;-1:-1:-1;;;;;2022:22:0;;;;2014:31;;;;;;2077:12;;2056:34;;-1:-1:-1;;;;;2077:12:0;2056:34;;-1:-1:-1;;;;;2056:34:0;;;;;;;;;;;;;;2101:12;:23;;-1:-1:-1;;;;;;2101:23:0;-1:-1:-1;;;;;2101:23:0;;;;;;;;;;1945:187::o;2714:194::-;2762:12;;2778:10;-1:-1:-1;;;;;2762:26:0;;;:12;;:26;2754:35;;;;;;2813:12;;;2827:5;2800:33;;-1:-1:-1;;;;;2813:12:0;;;;2827:5;2800:33;;-1:-1:-1;;;;;2800:33:0;;;;;;;;;;;;;;;;;;;;;;2852:12;;;;2844:20;;-1:-1:-1;;;;;;2844:20:0;;;-1:-1:-1;;;;;2852:12:0;;2844:20;;;;2875:25;;;2714:194::o;2313:223::-;1309:5;;1295:10;-1:-1:-1;;;;;1295:19:0;;;1309:5;;1295:19;1287:28;;;;;;-1:-1:-1;;;;;2397:22:0;;;;2389:31;;;;;;2431:30;2452:8;2431:30;;-1:-1:-1;;;;;2431:30:0;;;;;;;;;;;;;;2495:5;;2472:29;;2485:8;;-1:-1:-1;;;;;2495:5:0;2472:29;;-1:-1:-1;;;;;2472:29:0;;;;;;;;;;;;;;;;;;;;;;2512:5;:16;;-1:-1:-1;;;;;;2512:16:0;-1:-1:-1;;;;;2512:16:0;;;;;;;;;;2313:223::o;22069:440::-;22187:4;-1:-1:-1;;;;;22250:24:0;;-1:-1:-1;;;;;;;;;;;22250:24:0;:87;;;;-1:-1:-1;;;;;;22295:28:0;;;22335:1;22295:28;;;:13;:28;;;;;;;:42;;22250:87;22231:259;;;-1:-1:-1;;;;;;22388:27:0;;;22427:1;22388:27;;;:13;:27;;;;;;;:41;;;;:87;;-1:-1:-1;;;;;;22450:25:0;;-1:-1:-1;;;;;;;;;;;22450:25:0;22388:87;22209:292;22069:440;-1:-1:-1;;;22069:440:0:o;19614:560::-;1309:5;;1295:10;-1:-1:-1;;;;;1295:19:0;;;1309:5;;1295:19;1287:28;;;;;;-1:-1:-1;;;;;19793:29:0;;;19834:1;19793:29;;;:13;:29;;;;;;;:43;;19785:52;;;;;;19872:4;19856:20;;;19848:29;;;;;;19931:3;19917:17;;;19909:26;;;;;;-1:-1:-1;;;;;19965:46:0;;;;;;:30;:46;;;;;;;;:61;;;20037:23;:39;;;;;;;:52;;;20102:64;;20004:5;;20014:12;;20079:10;;20102:64;;;-1:-1:-1;;;;;20102:64:0;-1:-1:-1;;;;;20102:64:0;;;;;;;;;;;;;;;;;;;;;;;;;;;19614:560;;;:::o;1633:96::-;1679:9;;:::i;:::-;1708:13;1701:20;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;1701:20:0;;;;;;;;;;;;;;;;;;;;;;1633:96;:::o;13627:1998::-;13798:4;14019:11;14323:22;14356:16;14383;14629:24;14705:25;15027:9;13898:24;13912:3;13917:4;13898:13;:24::i;:::-;13897:25;13893:39;;;13931:1;13924:8;;;;13893:39;13948:12;;;;13947:13;13943:27;;;13969:1;13962:8;;;;13943:27;13985:11;;13981:25;;;14005:1;13998:8;;;;13981:25;-1:-1:-1;;;;;14045:24:0;;-1:-1:-1;;;;;;;;;;;14045:24:0;14041:270;;;14094:4;14086:12;;14041:270;;;-1:-1:-1;;;;;14120:25:0;;-1:-1:-1;;;;;;;;;;;14120:25:0;14116:195;;;14170:3;14162:11;;14116:195;;;14291:8;;;14116:195;14445:40;14467:3;14472:4;14478:6;14445:21;:40::i;:::-;14410:75;;-1:-1:-1;14410:75:0;-1:-1:-1;14502:22:0;;14498:36;;;14533:1;14526:8;;;;14498:36;14565:51;14587:4;14593:3;14598:17;14565:21;:51::i;:::-;14547:69;-1:-1:-1;14656:36:0;;-1:-1:-1;14667:5:0;14674:17;14656:10;:36::i;:::-;14629:63;;14733:281;14774:3;14807:6;14844:4;14879:19;14930:11;14974;14733:26;:281::i;:::-;14705:309;;15051:20;15047:493;;;15173:233;15207:6;15248:19;15303:16;15315:3;15303:11;:16::i;:::-;15356:17;15368:4;15356:11;:17::i;:::-;15173:15;:233::i;:::-;15166:240;;15047:493;;;-1:-1:-1;15517:11:0;15047:493;15557:60;15590:4;15596:20;15557:32;:60::i;:::-;15550:67;;13627:1998;;;;;;;;;;;;;;:::o;12098:36::-;;;-1:-1:-1;;;;;12098:36:0;;:::o;3824:319::-;1309:5;;1295:10;-1:-1:-1;;;;;1295:19:0;;;1309:5;;1295:19;1287:28;;;;;;-1:-1:-1;;;;;3903:22:0;;;;;;:9;:22;;;;;;;;3902:23;3894:32;;;;;;3968:14;:21;1164:2;3968:38;;3960:47;;;;;;4020:32;4034:11;4047:4;4020:32;;-1:-1:-1;;;;;4020:32:0;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;4063:22:0;;;;;;:9;:22;;;;;:29;;-1:-1:-1;;4063:29:0;4088:4;4063:29;;;;;;4103:14;:32;;:14;;:32;;;:14;:32;;:::i;12488:53::-;;;;;;;;;;;;;:::o;20308:427::-;-1:-1:-1;;;;;1396:10:0;1386:21;;;;;:9;:21;;;;;;;;1378:30;;;;;;;;-1:-1:-1;;;;;20487:29:0;;;20528:1;20487:29;;;:13;:29;;;;;;;:43;;20479:52;;;;;;-1:-1:-1;;;;;20544:36:0;;;;;;:20;:36;;;;;;;;:49;;;20604:20;:36;;;;;;;:49;;;20666:61;;20573:5;;20583:10;;20643;;20666:61;;;-1:-1:-1;;;;;20666:61:0;-1:-1:-1;;;;;20666:61:0;;;;;;;;;;;;;;;;;;;;;;;;;;;20308:427;;;:::o;25418:165::-;25560:6;;25570:5;25552:14;;;25542:25;;;;:33;;25418:165::o;21605:456::-;1309:5;;1295:10;-1:-1:-1;;;;;1295:19:0;;;1309:5;;1295:19;1287:28;;;;;;-1:-1:-1;;;;;21698:29:0;;;21739:1;21698:29;;;:13;:29;;;;;;;:43;;21690:52;;;;;;-1:-1:-1;;;;;21762:29:0;;;;;;:13;:29;;;;;;;;21755:36;;-1:-1:-1;;;;;;21755:36:0;;;21809:20;:36;;;;;21802:43;;;21863:20;:36;;;;;21856:43;;;21917:30;:46;;;;;21910:53;;;21981:23;:39;;;;;;21974:46;;;;22033:20;;21784:5;;22033:20;-1:-1:-1;;;;;22033:20:0;;;;;;;;;;;;;;21605:456;:::o;4151:481::-;4306:6;1309:5;;1295:10;-1:-1:-1;;;;;1295:19:0;;;1309:5;;1295:19;1287:28;;;;;;-1:-1:-1;;;;;4230:19:0;;;;;;:9;:19;;;;;;;;4222:28;;;;;;;;-1:-1:-1;;;;;;4261:19:0;;4283:5;4261:19;;;:9;:19;;;;;:27;;-1:-1:-1;;4261:27:0;;;4301:324;4322:14;:21;4318:25;;4301:324;;;4390:8;-1:-1:-1;;;;;4369:29:0;:14;4384:1;4369:17;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;4369:17:0;:29;4365:249;;;4439:14;4454:21;;-1:-1:-1;;4454:25:0;;;4439:41;;;;;;;;;;;;;;;;4419:14;:17;;-1:-1:-1;;;;;4439:41:0;;;;4434:1;;4419:17;;;;;;;;;;;;;;;:61;;-1:-1:-1;;;;;;4419:61:0;-1:-1:-1;;;;;4419:61:0;;;;;;;;;;4499:14;:26;;-1:-1:-1;;4499:26:0;;;;;;:::i;:::-;;4544:30;4558:8;4568:5;4544:30;;-1:-1:-1;;;;;4544:30:0;;;;;;;;;;;;;;;;;;;;;;4593:5;;4365:249;4345:3;;4301:324;;12141:27;;;-1:-1:-1;;;;;12141:27:0;;:::o;25115:295::-;25245:3;25284:8;25322;25384:17;;;25349:9;25362:17;;;25349:31;:53;;;;;;;;;25115:295;-1:-1:-1;;;;;25115:295:0:o;12641:63::-;;;;;;;;;;;;;:::o;5494:153::-;1309:5;;1295:10;-1:-1:-1;;;;;1295:19:0;;;1309:5;;1295:19;1287:28;;;;;;-1:-1:-1;;;;;5576:15:0;;:23;;;;5592:6;5576:23;;;;;;;;;;;;;;;;;;;;;;;;;;5610:29;5624:6;5632;5610:29;;;;;-1:-1:-1;;;;;5610:29:0;;;;;;;;;;;;;;;;5494:153;;:::o;9062:213::-;9129:4;-1:-1:-1;;;;;9150:26:0;;-1:-1:-1;;;;;;;;;;;9150:26:0;9146:121;;;-1:-1:-1;;;;;;9198:12:0;;;9191:19;;9146:121;9246:5;-1:-1:-1;;;;;9246:15:0;;9262:4;9246:21;;;;;;;;-1:-1:-1;;;9246:21:0;;;;;;-1:-1:-1;;;;;9246:21:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;9239:28;;;;12865:31;;;;;;:::o;889:20::-;;;-1:-1:-1;;;;;889:20:0;;:::o;6743:174::-;-1:-1:-1;;;;;6801:26:0;;-1:-1:-1;;;;;;;;;;;6801:26:0;6797:112;;;-1:-1:-1;;;;;6829:15:0;;;;;;:8;:15;;;;;6685:2;6829:30;;6797:112;;;6893:5;-1:-1:-1;;;;;6893:14:0;;:16;;;;;;;;;;;-1:-1:-1;;;6893:16:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;6875:15:0;;;;;;:8;:15;;;;;:34;-1:-1:-1;6797:112:0;6743:174;:::o;9478:192::-;9574:4;9598:64;9609:9;9620:16;9632:3;9620:11;:16::i;:::-;9638:17;9650:4;9638:11;:17::i;:::-;9657:4;9598:10;:64::i;:::-;9591:71;;9478:192;;;;;;;:::o;25848:976::-;25998:12;;;;-1:-1:-1;;;;;26078:24:0;;-1:-1:-1;;;;;;;;;;;26078:24:0;26074:522;;;-1:-1:-1;;;;;26146:28:0;;;;;;;:13;:28;;;;;;;;-1:-1:-1;26213:17:0;26223:6;26213:9;:17::i;:::-;26192:38;-1:-1:-1;26249:18:0;;26245:37;;;26277:1;;-1:-1:-1;26277:1:0;;-1:-1:-1;26269:13:0;;26245:37;26309:8;-1:-1:-1;;;;;26309:32:0;;26360:13;26309:79;;;;;;;;-1:-1:-1;;;26309:79:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;26299:89;;26074:522;;;-1:-1:-1;;;;;26448:27:0;;;;;;;:13;:27;;;;;;;;;;;-1:-1:-1;26501:83:0;;26448:27;;26529:32;;26562:6;;26448:27;26529:40;;;;;;-1:-1:-1;;;26529:40:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;26501:9;:83::i;:::-;26491:93;;26074:522;26615:201;26645:6;26682:7;26721:16;26733:3;26721:11;:16::i;:::-;26770:17;26782:4;26770:11;:17::i;26615:201::-;26608:208;;25848:976;;;;;;;;;:::o;6925:479::-;6981:4;;-1:-1:-1;;;;;7002:26:0;;-1:-1:-1;;;;;;;;;;;7002:26:0;6998:51;;;6685:2;7030:19;;;;6998:51;-1:-1:-1;;;;;;7104:15:0;;;;;;:8;:15;;;;;;7320:18;;7317:46;;;7347:5;-1:-1:-1;;;;;7347:14:0;;:16;;;;;;;;;;;-1:-1:-1;;;7347:16:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;7340:23;;;;7317:46;7383:13;7376:20;;6925:479;;;;;:::o;9879:627::-;10004:4;6481:6;10034:20;;;10026:29;;;;;;6481:6;10074:21;;;10066:30;;;;;;10113:26;;;10109:390;;6637:2;10165:25;;;10164:43;;10156:52;;;;;;10295:9;10279:11;10265;:25;10258:2;:33;10257:47;6430:6;10231:10;:22;:74;;;;;;;;10223:83;;;;10109:390;6637:2;10348:25;;;10347:43;;10339:52;;;;;;10477:9;10461:11;10447;:25;10440:2;:33;6430:6;10414:10;:22;:60;:72;;;;;;15633:277;15787:4;15829:20;:28;;15856:1;15829:28;;;15852:1;15829:28;15816:42;;15823:1;15816:4;:8;:42;:86;;15901:1;15894:4;:8;15816:86;;;-1:-1:-1;15874:4:0;;15633:277;-1:-1:-1;15633:277:0:o;7412:569::-;7514:4;6481:6;7539:17;;;7531:26;;;;;;6546:17;7576:16;;;7568:25;;;;;;7610:26;;;7606:368;;6637:2;7662:25;;;7661:43;;7653:52;;;;;;6430:6;7728:13;;;7750:25;;;7745:2;:31;7728:49;7727:63;;7606:368;6637:2;7832:25;;;7831:43;;7823:52;;;;;;7948:11;7934;:25;7929:2;:31;6430:6;7916:45;7907:4;7898:6;:13;7897:65;;;;;;11941:14886;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;:::o;:::-;;;;;;;;;;;;;:::o;:::-;;;;;;;;;;;;;;;;;;;;;

Swarm Source

bzzr://386ed32aa526e4d140c16534352a5b06e0a13e482f8bd08a73fa6107f882dd06

Block Transaction Difficulty Gas Used Reward
View All Blocks Produced

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

Validator Index Block Amount
View All Withdrawals

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

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