ETH Price: $2,422.88 (-2.33%)

Contract

0x44aef3101432a64D1aA16388f4B9B352b09F42A9
 

Overview

ETH Balance

0 ETH

Eth Value

$0.00

Token Holdings

Multichain Info

No addresses found
Transaction Hash
Method
Block
From
To
Withdraw Token71995602019-02-09 20:33:552067 days ago1549744435IN
0x44aef310...2b09F42A9
0 ETH0.00022658
Withdraw Token71995562019-02-09 20:32:452067 days ago1549744365IN
0x44aef310...2b09F42A9
0 ETH0.000224968
Withdraw Ether71995532019-02-09 20:31:272067 days ago1549744287IN
0x44aef310...2b09F42A9
0 ETH0.000268638
Set Internal Inv...71235062019-01-25 10:13:442082 days ago1548411224IN
0x44aef310...2b09F42A9
0 ETH0.0003546310
Set Internal Pri...70256352019-01-07 12:16:562100 days ago1546863416IN
0x44aef310...2b09F42A9
0 ETH0.000316089
Set Internal Inv...70248072019-01-07 8:56:132100 days ago1546851373IN
0x44aef310...2b09F42A9
0 ETH0.000318019
Set Internal Pri...70248012019-01-07 8:54:252100 days ago1546851265IN
0x44aef310...2b09F42A9
0 ETH0.000586089
Set Kyber Networ...70190192019-01-06 7:55:142101 days ago1546761314IN
0x44aef310...2b09F42A9
0 ETH0.0008446228
Set Internal Pri...70048232019-01-03 18:51:552104 days ago1546541515IN
0x44aef310...2b09F42A9
0 ETH0.000280968
Set Internal Pri...69764462018-12-29 22:39:082109 days ago1546123148IN
0x44aef310...2b09F42A9
0 ETH0.0003512110
Add Alerter69670262018-12-28 8:36:552110 days ago1545986215IN
0x44aef310...2b09F42A9
0 ETH0.0008694810
Add Operator69670222018-12-28 8:35:582110 days ago1545986158IN
0x44aef310...2b09F42A9
0 ETH0.00072310
Set Kyber Networ...69669752018-12-28 8:26:022110 days ago1545985562IN
0x44aef310...2b09F42A9
0 ETH0.0003016510
Set Internal Pri...69646432018-12-27 22:45:422111 days ago1545950742IN
0x44aef310...2b09F42A9
0 ETH0.0005012110
Set Internal Pri...69646102018-12-27 22:37:422111 days ago1545950262IN
0x44aef310...2b09F42A9
0 ETH0.0002005710
Set Internal Inv...69645012018-12-27 22:12:072111 days ago1545948727IN
0x44aef310...2b09F42A9
0 ETH0.0003546310
Set Internal Pri...69644912018-12-27 22:09:452111 days ago1545948585IN
0x44aef310...2b09F42A9
0 ETH0.0006512110
List Token69644842018-12-27 22:08:032111 days ago1545948483IN
0x44aef310...2b09F42A9
0 ETH0.0012725810
List Token69644662018-12-27 22:04:222111 days ago1545948262IN
0x44aef310...2b09F42A9
0 ETH0.0012751410
Add Operator69644572018-12-27 22:02:142111 days ago1545948134IN
0x44aef310...2b09F42A9
0 ETH0.00087310
0x6060604069644302018-12-27 21:56:332111 days ago1545947793IN
 Create: KyberOasisReserve
0 ETH0.028373910

Latest 25 internal transactions (View All)

Advanced mode:
Parent Transaction Hash Block From To
71995532019-02-09 20:31:272067 days ago1549744287
0x44aef310...2b09F42A9
11.24594239 ETH
71988482019-02-09 17:06:552067 days ago1549732015
0x44aef310...2b09F42A9
11.11818662 ETH
71983722019-02-09 14:50:542067 days ago1549723854
0x44aef310...2b09F42A9
5.98856921 ETH
71982892019-02-09 14:26:552067 days ago1549722415
0x44aef310...2b09F42A9
2.0664966 ETH
71981862019-02-09 13:55:092067 days ago1549720509
0x44aef310...2b09F42A9
3.80798509 ETH
71980522019-02-09 13:22:592067 days ago1549718579
0x44aef310...2b09F42A9
7.4469274 ETH
71980522019-02-09 13:22:592067 days ago1549718579
0x44aef310...2b09F42A9
7.46559138 ETH
71980412019-02-09 13:18:372067 days ago1549718317
0x44aef310...2b09F42A9
7.18024127 ETH
71980412019-02-09 13:18:372067 days ago1549718317
0x44aef310...2b09F42A9
7.19823686 ETH
71980242019-02-09 13:10:562067 days ago1549717856
0x44aef310...2b09F42A9
0.25 ETH
71979832019-02-09 13:00:192067 days ago1549717219
0x44aef310...2b09F42A9
1 ETH
71979352019-02-09 12:44:412067 days ago1549716281
0x44aef310...2b09F42A9
18.00262348 ETH
71979352019-02-09 12:44:412067 days ago1549716281
0x44aef310...2b09F42A9
18.04774284 ETH
71979292019-02-09 12:42:292067 days ago1549716149
0x44aef310...2b09F42A9
6.56952333 ETH
71979292019-02-09 12:42:292067 days ago1549716149
0x44aef310...2b09F42A9
6.5859883 ETH
71979062019-02-09 12:37:072067 days ago1549715827
0x44aef310...2b09F42A9
3.28476166 ETH
71978522019-02-09 12:24:052067 days ago1549715045
0x44aef310...2b09F42A9
16.63716519 ETH
71978332019-02-09 12:17:012067 days ago1549714621
0x44aef310...2b09F42A9
12.47787389 ETH
71978222019-02-09 12:13:522067 days ago1549714432
0x44aef310...2b09F42A9
16.63716519 ETH
71978132019-02-09 12:12:062067 days ago1549714326
0x44aef310...2b09F42A9
16.92831559 ETH
71977902019-02-09 12:05:362067 days ago1549713936
0x44aef310...2b09F42A9
16.58231937 ETH
71977822019-02-09 12:01:222067 days ago1549713682
0x44aef310...2b09F42A9
5.97111871 ETH
71977632019-02-09 11:55:052067 days ago1549713305
0x44aef310...2b09F42A9
16.58644087 ETH
71977342019-02-09 11:43:592067 days ago1549712639
0x44aef310...2b09F42A9
16.58644087 ETH
71977292019-02-09 11:42:532067 days ago1549712573
0x44aef310...2b09F42A9
20.73305109 ETH
View All Internal Transactions
Loading...
Loading

Contract Source Code Verified (Exact Match)

Contract Name:
KyberOasisReserve

Compiler Version
v0.4.18+commit.9cf6e910

Optimization Enabled:
Yes with 200 runs

Other Settings:
default evmVersion

Contract Source Code (Solidity)

/**
 *Submitted for verification at Etherscan.io on 2018-12-27
*/

pragma solidity 0.4.18;

// File: contracts/ERC20Interface.sol

// 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/KyberReserveInterface.sol

/// @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

/// @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

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/PermissionGroups.sol

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

/**
 * @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/oasisContracts/KyberOasisReserve.sol

contract OtcInterface {
    function getOffer(uint id) public constant returns (uint, ERC20, uint, ERC20);
    function getBestOffer(ERC20 sellGem, ERC20 buyGem) public constant returns(uint);
    function getWorseOffer(uint id) public constant returns(uint);
    function take(bytes32 id, uint128 maxTakeAmount) public;
}


contract WethInterface is ERC20 {
    function deposit() public payable;
    function withdraw(uint) public;
}


contract KyberOasisReserve is KyberReserveInterface, Withdrawable, Utils2 {

    uint constant internal COMMON_DECIMALS = 18;
    address public sanityRatesContract = 0;
    address public kyberNetwork;
    OtcInterface public otc;
    WethInterface public wethToken;
    mapping(address=>bool) public isTokenListed;
    mapping(address=>uint) public tokenMinSrcAmount;
    mapping(address=>uint) public minTokenBalance;
    mapping(address=>uint) public maxTokenBalance;
    mapping(address=>uint) public internalPricePremiumBps;
    mapping(address=>uint) public minOasisSpreadForinternalPricingBps;
    bool public tradeEnabled;
    uint public feeBps;

    function KyberOasisReserve(
        address _kyberNetwork,
        OtcInterface _otc,
        WethInterface _wethToken,
        address _admin,
        uint _feeBps
    )
        public
    {
        require(_admin != address(0));
        require(_kyberNetwork != address(0));
        require(_otc != address(0));
        require(_wethToken != address(0));
        require(_feeBps < 10000);
        require(getDecimals(_wethToken) == COMMON_DECIMALS);

        kyberNetwork = _kyberNetwork;
        otc = _otc;
        wethToken = _wethToken;
        admin = _admin;
        feeBps = _feeBps;
        tradeEnabled = true;

        require(wethToken.approve(otc, 2**255));
    }

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

    function listToken(ERC20 token, uint minSrcAmount) public onlyAdmin {
        require(token != address(0));
        require(!isTokenListed[token]);
        require(getDecimals(token) == COMMON_DECIMALS);

        require(token.approve(otc, 2**255));
        isTokenListed[token] = true;
        tokenMinSrcAmount[token] = minSrcAmount;
        minTokenBalance[token] = 2 ** 255; // disable by default
        maxTokenBalance[token] = 0; // disable by default;
        internalPricePremiumBps[token] = 0; // NA by default
        minOasisSpreadForinternalPricingBps[token] = 0; // NA by default
    }

    function delistToken(ERC20 token) public onlyAdmin {
        require(isTokenListed[token]);

        require(token.approve(otc, 0));
        delete isTokenListed[token];
        delete tokenMinSrcAmount[token];
        delete minTokenBalance[token];
        delete maxTokenBalance[token];
        delete internalPricePremiumBps[token];
        delete minOasisSpreadForinternalPricingBps[token];
    }

    function setInternalPriceAdminParams(ERC20 token,
                                         uint minSpreadBps,
                                         uint premiumBps) public onlyAdmin {
        require(isTokenListed[token]);
        require(premiumBps <= 500); // premium <= 5%
        require(minSpreadBps <= 1000); // min spread <= 10%

        internalPricePremiumBps[token] = premiumBps;
        minOasisSpreadForinternalPricingBps[token] = minSpreadBps;
    }

    function setInternalInventoryMinMax(ERC20 token,
                                        uint  minBalance,
                                        uint  maxBalance) public onlyOperator {
        require(isTokenListed[token]);

        // don't require anything on min and max balance as it might be used for disable
        minTokenBalance[token] = minBalance;
        maxTokenBalance[token] = maxBalance;
    }

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

    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(doTrade(srcToken, srcAmount, destToken, destAddress, conversionRate, validate));

        return true;
    }

    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 != address(0));

        kyberNetwork = _kyberNetwork;
        KyberNetworkSet(kyberNetwork);
    }

    event FeeBpsSet(uint feeBps);

    function setFeeBps(uint _feeBps) public onlyAdmin {
        require(_feeBps < 10000);

        feeBps = _feeBps;
        FeeBpsSet(feeBps);
    }

    function valueAfterReducingFee(uint val) public view returns(uint) {
        require(val <= MAX_QTY);
        return ((10000 - feeBps) * val) / 10000;
    }

    function valueBeforeFeesWereReduced(uint val) public view returns(uint) {
        require(val <= MAX_QTY);
        return val * 10000 / (10000 - feeBps);
    }

    function valueAfterAddingPremium(ERC20 token, uint val) public view returns(uint) {
        require(val <= MAX_QTY);
        uint premium = internalPricePremiumBps[token];

        return val * (10000 + premium) / 10000;
    }
    function shouldUseInternalInventory(ERC20 token,
                                        uint tokenVal,
                                        uint ethVal,
                                        bool ethToToken) public view returns(bool) {
        require(tokenVal <= MAX_QTY);

        uint tokenBalance = token.balanceOf(this);
        if (ethToToken) {
            if (tokenBalance < tokenVal) return false;
            if (tokenBalance - tokenVal < minTokenBalance[token]) return false;
        }
        else {
            if (this.balance < ethVal) return false;
            if (tokenBalance + tokenVal > maxTokenBalance[token]) return false;
        }

        // check that spread in first level makes sense
        uint x1; uint y1; uint x2; uint y2;
        (,x1,y1) = getMatchingOffer(token, wethToken, 0);
        (,y2,x2) = getMatchingOffer(wethToken, token, 0);

        require(x1 <= MAX_QTY && x2 <= MAX_QTY && y1 <= MAX_QTY && y2 <= MAX_QTY);

        // check if there is an arbitrage
        if (x1*y2 > x2*y1) return false;

        // spread is (x1/y1 - x2/y2) / (x1/y1)
        if (10000 * (x2*y1 - x1*y2) < x1*y2*minOasisSpreadForinternalPricingBps[token]) return false;


        return true;
    }

    function getConversionRate(ERC20 src, ERC20 dest, uint srcQty, uint blockNumber) public view returns(uint) {
        uint  rate;
        uint  actualSrcQty;
        ERC20 actualSrc;
        ERC20 actualDest;
        uint offerPayAmt;
        uint offerBuyAmt;

        blockNumber;

        if (!tradeEnabled) return 0;
        if (!validTokens(src, dest)) return 0;

        if (src == ETH_TOKEN_ADDRESS) {
            actualSrc = wethToken;
            actualDest = dest;
            actualSrcQty = srcQty;
        } else if (dest == ETH_TOKEN_ADDRESS) {
            actualSrc = src;
            actualDest = wethToken;

            if (srcQty < tokenMinSrcAmount[src]) {
                /* remove rounding errors and present rate for 0 src amount. */
                actualSrcQty = tokenMinSrcAmount[src];
            } else {
                actualSrcQty = srcQty;
            }
        } else {
            return 0;
        }

        // otc's terminology is of offer maker, so their sellGem is the taker's dest token.
        (, offerPayAmt, offerBuyAmt) = getMatchingOffer(actualDest, actualSrc, actualSrcQty);

        // make sure to take only one level of order book to avoid gas inflation.
        if (actualSrcQty > offerBuyAmt) return 0;

        bool tradeFromInventory = false;
        uint valueWithPremium = valueAfterAddingPremium(token, offerPayAmt);
        ERC20 token;
        if (src == ETH_TOKEN_ADDRESS) {
            token = dest;
            tradeFromInventory = shouldUseInternalInventory(token,
                                                            valueWithPremium,
                                                            offerBuyAmt,
                                                            true);
        }
        else {
            token = src;
            tradeFromInventory = shouldUseInternalInventory(token,
                                                            offerBuyAmt,
                                                            valueWithPremium,
                                                            false);
        }

        rate = calcRateFromQty(offerBuyAmt, offerPayAmt, COMMON_DECIMALS, COMMON_DECIMALS);

        if (tradeFromInventory) return valueAfterAddingPremium(token,rate);
        else return valueAfterReducingFee(rate);
    }

    function doTrade(
        ERC20 srcToken,
        uint srcAmount,
        ERC20 destToken,
        address destAddress,
        uint conversionRate,
        bool validate
    )
        internal
        returns(bool)
    {
        uint actualDestAmount;

        require(validTokens(srcToken, destToken));

        // can skip validation if done at kyber network level
        if (validate) {
            require(conversionRate > 0);
            if (srcToken == ETH_TOKEN_ADDRESS)
                require(msg.value == srcAmount);
            else
                require(msg.value == 0);
        }

        uint userExpectedDestAmount = calcDstQty(srcAmount, COMMON_DECIMALS, COMMON_DECIMALS, conversionRate);
        require(userExpectedDestAmount > 0); // sanity check

        uint destAmountIncludingFees = valueBeforeFeesWereReduced(userExpectedDestAmount);

        if (srcToken == ETH_TOKEN_ADDRESS) {
            if(!shouldUseInternalInventory(destToken,
                                           userExpectedDestAmount,
                                           srcAmount,
                                           true)) {
                wethToken.deposit.value(msg.value)();

                actualDestAmount = takeMatchingOffer(wethToken, destToken, srcAmount);
                require(actualDestAmount >= destAmountIncludingFees);
            }

            // transfer back only requested dest amount.
            require(destToken.transfer(destAddress, userExpectedDestAmount));
        } else {
            require(srcToken.transferFrom(msg.sender, this, srcAmount));

            if(!shouldUseInternalInventory(srcToken,
                                           srcAmount,
                                           userExpectedDestAmount,
                                           false)) {
                actualDestAmount = takeMatchingOffer(srcToken, wethToken, srcAmount);
                require(actualDestAmount >= destAmountIncludingFees);
                wethToken.withdraw(actualDestAmount);
            }

            // transfer back only requested dest amount.
            destAddress.transfer(userExpectedDestAmount);
        }

        TradeExecute(msg.sender, srcToken, srcAmount, destToken, userExpectedDestAmount, destAddress);

        return true;
    }

    function takeMatchingOffer(
        ERC20 srcToken,
        ERC20 destToken,
        uint srcAmount
    )
        internal
        returns(uint actualDestAmount)
    {
        uint offerId;
        uint offerPayAmt;
        uint offerBuyAmt;

        // otc's terminology is of offer maker, so their sellGem is our (the taker's) dest token.
        (offerId, offerPayAmt, offerBuyAmt) = getMatchingOffer(destToken, srcToken, srcAmount);

        require(srcAmount <= MAX_QTY);
        require(offerPayAmt <= MAX_QTY);
        actualDestAmount = srcAmount * offerPayAmt / offerBuyAmt;

        require(uint128(actualDestAmount) == actualDestAmount);
        otc.take(bytes32(offerId), uint128(actualDestAmount));  // Take the portion of the offer that we need
        return;
    }

    function getMatchingOffer(
        ERC20 offerSellGem,
        ERC20 offerBuyGem,
        uint payAmount
    )
        internal
        view
        returns(
            uint offerId,
            uint offerPayAmount,
            uint offerBuyAmount
        )
    {
        offerId = otc.getBestOffer(offerSellGem, offerBuyGem);
        (offerPayAmount, , offerBuyAmount, ) = otc.getOffer(offerId);
        uint depth = 1;

        while (payAmount > offerBuyAmount) {
            offerId = otc.getWorseOffer(offerId); // We look for the next best offer
            if (offerId == 0 || ++depth > 7) {
                offerId = 0;
                offerPayAmount = 0;
                offerBuyAmount = 0;
                break;
            }
            (offerPayAmount, , offerBuyAmount, ) = otc.getOffer(offerId);
        }

        return;
    }

    function validTokens(ERC20 src, ERC20 dest) internal view returns (bool valid) {
        return ((isTokenListed[src] && ETH_TOKEN_ADDRESS == dest) ||
                (isTokenListed[dest] && ETH_TOKEN_ADDRESS == src));
    }
}

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":false,"inputs":[{"name":"token","type":"address"},{"name":"minSrcAmount","type":"uint256"}],"name":"listToken","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[{"name":"","type":"address"}],"name":"internalPricePremiumBps","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"view","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":"token","type":"address"},{"name":"val","type":"uint256"}],"name":"valueAfterAddingPremium","outputs":[{"name":"","type":"uint256"}],"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":"otc","outputs":[{"name":"","type":"address"}],"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":"sanityRatesContract","outputs":[{"name":"","type":"address"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"wethToken","outputs":[{"name":"","type":"address"}],"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":"val","type":"uint256"}],"name":"valueBeforeFeesWereReduced","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"name":"","type":"address"}],"name":"tokenMinSrcAmount","outputs":[{"name":"","type":"uint256"}],"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":"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":true,"inputs":[{"name":"val","type":"uint256"}],"name":"valueAfterReducingFee","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"name":"_feeBps","type":"uint256"}],"name":"setFeeBps","outputs":[],"payable":false,"stateMutability":"nonpayable","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":"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":"","type":"address"}],"name":"maxTokenBalance","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"name":"newOperator","type":"address"}],"name":"addOperator","outputs":[],"payable":false,"stateMutability":"nonpayable","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":false,"inputs":[{"name":"amount","type":"uint256"},{"name":"sendTo","type":"address"}],"name":"withdrawEther","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[{"name":"","type":"address"}],"name":"minTokenBalance","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"view","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":"","type":"address"}],"name":"minOasisSpreadForinternalPricingBps","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":"setInternalInventoryMinMax","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[{"name":"","type":"address"}],"name":"isTokenListed","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":"setInternalPriceAdminParams","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[],"name":"admin","outputs":[{"name":"","type":"address"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"name":"token","type":"address"},{"name":"tokenVal","type":"uint256"},{"name":"ethVal","type":"uint256"},{"name":"ethToToken","type":"bool"}],"name":"shouldUseInternalInventory","outputs":[{"name":"","type":"bool"}],"payable":false,"stateMutability":"view","type":"function"},{"inputs":[{"name":"_kyberNetwork","type":"address"},{"name":"_otc","type":"address"},{"name":"_wethToken","type":"address"},{"name":"_admin","type":"address"},{"name":"_feeBps","type":"uint256"}],"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"}],"name":"TradeExecute","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":"feeBps","type":"uint256"}],"name":"FeeBpsSet","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"}]

606060405260078054600160a060020a031916905534156200002057600080fd5b60405160a080620028f2833981016040528080519190602001805191906020018051919060200180519190602001805160008054600160a060020a03191633600160a060020a03908116919091179091559092508316151590506200008457600080fd5b600160a060020a03851615156200009a57600080fd5b600160a060020a0384161515620000b057600080fd5b600160a060020a0383161515620000c657600080fd5b6127108110620000d557600080fd5b6012620000f08464010000000062001bf96200021d82021704565b14620000fb57600080fd5b60088054600160a060020a0319908116600160a060020a03888116919091179092556009805482168784161790819055600a8054831687851617908190556000805490931686851617835560128590556011805460ff1916600117905583169263095ea7b3929116907f800000000000000000000000000000000000000000000000000000000000000090604051602001526040517c010000000000000000000000000000000000000000000000000000000063ffffffff8516028152600160a060020a0390921660048301526024820152604401602060405180830381600087803b1515620001ea57600080fd5b6102c65a03f11515620001fc57600080fd5b5050506040518051905015156200021257600080fd5b505050505062000300565b600080600160a060020a03831673eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee1415620002505760129150620002fa565b50600160a060020a038216600090815260066020526040902054801515620002f65782600160a060020a031663313ce5676000604051602001526040518163ffffffff167c0100000000000000000000000000000000000000000000000000000000028152600401602060405180830381600087803b1515620002d257600080fd5b6102c65a03f11515620002e457600080fd5b505050604051805190509150620002fa565b8091505b50919050565b6125e280620003106000396000f3006060604052600436106101d35763ffffffff60e060020a60003504166299d38681146101d557806301a12fd3146101fc5780630717d7c31461021b5780631db950781461023d57806324a9d8531461026e5780632678224714610281578063274544ce146102b057806327a099d8146102d257806336b61e3c146103385780633ccdbb281461034b578063408ee7fe1461037457806347e6924f146103935780634b57b0be146103a657806354a325a6146103b95780635b714690146103d85780635cf4a0da146103ee5780636940030f1461040d5780636cf69811146104205780636f3d80431461044c57806372c27b621461046257806375829def1461047857806377f50f97146104975780637acc8678146104aa5780637c423f54146104c95780637cd44272146104dc57806390b7e28f146105075780639870d7fe14610526578063abffc9ac14610545578063ac8a584a14610564578063b78b842d14610583578063ce56c45414610596578063d1a75930146105b8578063d4fac45d146105d7578063d621e813146105fc578063d6b45f791461060f578063e2c44ac51461062e578063e69ec65314610653578063f845584214610672578063f851a44014610697578063fda51fe0146106aa575b005b34156101e057600080fd5b6101e86106d4565b604051901515815260200160405180910390f35b341561020757600080fd5b6101d3600160a060020a036004351661073c565b341561022657600080fd5b6101d3600160a060020a03600435166024356108ac565b341561024857600080fd5b61025c600160a060020a0360043516610a3a565b60405190815260200160405180910390f35b341561027957600080fd5b61025c610a4c565b341561028c57600080fd5b610294610a52565b604051600160a060020a03909116815260200160405180910390f35b34156102bb57600080fd5b61025c600160a060020a0360043516602435610a61565b34156102dd57600080fd5b6102e5610aa8565b60405160208082528190810183818151815260200191508051906020019060200280838360005b8381101561032457808201518382015260200161030c565b505050509050019250505060405180910390f35b341561034357600080fd5b610294610b10565b341561035657600080fd5b6101d3600160a060020a036004358116906024359060443516610b1f565b341561037f57600080fd5b6101d3600160a060020a0360043516610c16565b341561039e57600080fd5b610294610d12565b34156103b157600080fd5b610294610d21565b34156103c457600080fd5b6101d3600160a060020a0360043516610d30565b34156103e357600080fd5b61025c600435610dc2565b34156103f957600080fd5b61025c600160a060020a0360043516610df9565b341561041857600080fd5b6101e8610e0b565b6101e8600160a060020a03600435811690602435906044358116906064351660843560a4351515610e78565b341561045757600080fd5b61025c600435610ecd565b341561046d57600080fd5b6101d3600435610ef8565b341561048357600080fd5b6101d3600160a060020a0360043516610f5c565b34156104a257600080fd5b6101d3610ff7565b34156104b557600080fd5b6101d3600160a060020a0360043516611091565b34156104d457600080fd5b6102e5611173565b34156104e757600080fd5b61025c600160a060020a03600435811690602435166044356064356111d9565b341561051257600080fd5b61025c600160a060020a03600435166113bc565b341561053157600080fd5b6101d3600160a060020a03600435166113ce565b341561055057600080fd5b6101d3600160a060020a036004351661149e565b341561056f57600080fd5b6101d3600160a060020a03600435166115bd565b341561058e57600080fd5b610294611729565b34156105a157600080fd5b6101d3600435600160a060020a0360243516611738565b34156105c357600080fd5b61025c600160a060020a03600435166117cb565b34156105e257600080fd5b61025c600160a060020a03600435811690602435166117dd565b341561060757600080fd5b6101e861188f565b341561061a57600080fd5b61025c600160a060020a0360043516611898565b341561063957600080fd5b6101d3600160a060020a03600435166024356044356118aa565b341561065e57600080fd5b6101e8600160a060020a0360043516611920565b341561067d57600080fd5b6101d3600160a060020a0360043516602435604435611935565b34156106a257600080fd5b6102946119c0565b34156106b557600080fd5b6101e8600160a060020a036004351660243560443560643515156119cf565b6000805433600160a060020a039081169116146106f057600080fd5b6011805460ff191660019081179091557f7d7f00509dd73ac4449f698ae75ccc797895eff5fa9d446d3df387598a26e73590604051901515815260200160405180910390a15060015b90565b6000805433600160a060020a0390811691161461075857600080fd5b600160a060020a03821660009081526003602052604090205460ff16151561077f57600080fd5b50600160a060020a0381166000908152600360205260408120805460ff191690555b6005548110156108a85781600160a060020a03166005828154811015156107c457fe5b600091825260209091200154600160a060020a031614156108a0576005805460001981019081106107f157fe5b60009182526020909120015460058054600160a060020a03909216918390811061081757fe5b60009182526020909120018054600160a060020a031916600160a060020a0392909216919091179055600580549061085390600019830161255d565b507f5611bf3e417d124f97bf2c788843ea8bb502b66079fbee02158ef30b172cb762826000604051600160a060020a039092168252151560208201526040908101905180910390a16108a8565b6001016107a1565b5050565b60005433600160a060020a039081169116146108c757600080fd5b600160a060020a03821615156108dc57600080fd5b600160a060020a0382166000908152600b602052604090205460ff161561090257600080fd5b601261090d83611bf9565b1461091757600080fd5b600954600160a060020a038084169163095ea7b391167f800000000000000000000000000000000000000000000000000000000000000060006040516020015260405160e060020a63ffffffff8516028152600160a060020a0390921660048301526024820152604401602060405180830381600087803b151561099a57600080fd5b6102c65a03f115156109ab57600080fd5b5050506040518051905015156109c057600080fd5b600160a060020a039091166000908152600b60209081526040808320805460ff19166001179055600c825280832093909355600d81528282207f80000000000000000000000000000000000000000000000000000000000000009055600e8152828220829055600f81528282208290556010905290812055565b600f6020526000908152604090205481565b60125481565b600154600160a060020a031681565b6000806b204fce5e3e25026110000000831115610a7d57600080fd5b50600160a060020a0383166000908152600f6020526040902054612710808201840204949350505050565b610ab0612586565b6004805480602002602001604051908101604052809291908181526020018280548015610b0657602002820191906000526020600020905b8154600160a060020a03168152600190910190602001808311610ae8575b5050505050905090565b600954600160a060020a031681565b60005433600160a060020a03908116911614610b3a57600080fd5b82600160a060020a031663a9059cbb828460006040516020015260405160e060020a63ffffffff8516028152600160a060020a0390921660048301526024820152604401602060405180830381600087803b1515610b9757600080fd5b6102c65a03f11515610ba857600080fd5b505050604051805190501515610bbd57600080fd5b7f72cb8a894ddb372ceec3d2a7648d86f17d5a15caae0e986c53109b8a9a9385e6838383604051600160a060020a03938416815260208101929092529091166040808301919091526060909101905180910390a1505050565b60005433600160a060020a03908116911614610c3157600080fd5b600160a060020a03811660009081526003602052604090205460ff1615610c5757600080fd5b60055460329010610c6757600080fd5b7f5611bf3e417d124f97bf2c788843ea8bb502b66079fbee02158ef30b172cb762816001604051600160a060020a039092168252151560208201526040908101905180910390a1600160a060020a0381166000908152600360205260409020805460ff191660019081179091556005805490918101610ce6838261255d565b5060009182526020909120018054600160a060020a031916600160a060020a0392909216919091179055565b600754600160a060020a031681565b600a54600160a060020a031681565b60005433600160a060020a03908116911614610d4b57600080fd5b600160a060020a0381161515610d6057600080fd5b60088054600160a060020a031916600160a060020a0383811691909117918290557f38622430bb6defd4452b087e8d0b4a6d1c4d35c179c2d7d875d4abb272b9d88b9116604051600160a060020a03909116815260200160405180910390a150565b60006b204fce5e3e25026110000000821115610ddd57600080fd5b601254612710038261271002811515610df257fe5b0492915050565b600c6020526000908152604090205481565b600160a060020a03331660009081526003602052604081205460ff161515610e3257600080fd5b6011805460ff191690557f7d7f00509dd73ac4449f698ae75ccc797895eff5fa9d446d3df387598a26e7356000604051901515815260200160405180910390a150600190565b60115460009060ff161515610e8c57600080fd5b60085433600160a060020a03908116911614610ea757600080fd5b610eb5878787878787611cbd565b1515610ec057600080fd5b5060019695505050505050565b60006b204fce5e3e25026110000000821115610ee857600080fd5b6012546127109081038302610df2565b60005433600160a060020a03908116911614610f1357600080fd5b6127108110610f2157600080fd5b60128190557f4f78c4ceb393a616bbd264a4584a9ad15d722042ce1e135e6a8380217f5cb42b8160405190815260200160405180910390a150565b60005433600160a060020a03908116911614610f7757600080fd5b600160a060020a0381161515610f8c57600080fd5b6001547f3b81caf78fa51ecbc8acb482fd7012a277b428d9b80f9d156e8a54107496cc4090600160a060020a0316604051600160a060020a03909116815260200160405180910390a160018054600160a060020a031916600160a060020a0392909216919091179055565b60015433600160a060020a0390811691161461101257600080fd5b6001546000547f65da1cfc2c2e81576ad96afb24a581f8e109b7a403b35cbd3243a1c99efdb9ed91600160a060020a039081169116604051600160a060020a039283168152911660208201526040908101905180910390a16001805460008054600160a060020a0319908116600160a060020a03841617909155169055565b60005433600160a060020a039081169116146110ac57600080fd5b600160a060020a03811615156110c157600080fd5b7f3b81caf78fa51ecbc8acb482fd7012a277b428d9b80f9d156e8a54107496cc4081604051600160a060020a03909116815260200160405180910390a16000547f65da1cfc2c2e81576ad96afb24a581f8e109b7a403b35cbd3243a1c99efdb9ed908290600160a060020a0316604051600160a060020a039283168152911660208201526040908101905180910390a160008054600160a060020a031916600160a060020a0392909216919091179055565b61117b612586565b6005805480602002602001604051908101604052809291908181526020018280548015610b0657602002820191906000526020600020908154600160a060020a03168152600190910190602001808311610ae8575050505050905090565b600080600080600080600080600080601160009054906101000a900460ff16151561120757600099506113ab565b6112118e8e612063565b151561122057600099506113ab565b600160a060020a038e1673eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee141561125e57600a548c9850600160a060020a031696508c95506112fd565b600160a060020a038d1673eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee14156112f4578d9650600a60009054906101000a9004600160a060020a03169550600c60008f600160a060020a0316600160a060020a03168152602001908152602001600020548c10156112eb57600160a060020a038e166000908152600c602052604090205497506112ef565b8b97505b6112fd565b600099506113ab565b61130886888a6120f8565b9096509450508388111561131f57600099506113ab565b6000925061132d8186610a61565b9150600160a060020a038e1673eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee141561136a57508b61136381838660016119cf565b925061137c565b508c61137981858460006119cf565b92505b6113898486601280612337565b985082156113a25761139b818a610a61565b99506113ab565b61139b89610ecd565b505050505050505050949350505050565b600e6020526000908152604090205481565b60005433600160a060020a039081169116146113e957600080fd5b600160a060020a03811660009081526002602052604090205460ff161561140f57600080fd5b6004546032901061141f57600080fd5b7f091a7a4b85135fdd7e8dbc18b12fabe5cc191ea867aa3c2e1a24a102af61d58b816001604051600160a060020a039092168252151560208201526040908101905180910390a1600160a060020a0381166000908152600260205260409020805460ff191660019081179091556004805490918101610ce6838261255d565b60005433600160a060020a039081169116146114b957600080fd5b600160a060020a0381166000908152600b602052604090205460ff1615156114e057600080fd5b600954600160a060020a038083169163095ea7b391166000806040516020015260405160e060020a63ffffffff8516028152600160a060020a0390921660048301526024820152604401602060405180830381600087803b151561154357600080fd5b6102c65a03f1151561155457600080fd5b50505060405180519050151561156957600080fd5b600160a060020a03166000908152600b60209081526040808320805460ff19169055600c8252808320839055600d8252808320839055600e8252808320839055600f82528083208390556010909152812055565b6000805433600160a060020a039081169116146115d957600080fd5b600160a060020a03821660009081526002602052604090205460ff16151561160057600080fd5b50600160a060020a0381166000908152600260205260408120805460ff191690555b6004548110156108a85781600160a060020a031660048281548110151561164557fe5b600091825260209091200154600160a060020a031614156117215760048054600019810190811061167257fe5b60009182526020909120015460048054600160a060020a03909216918390811061169857fe5b60009182526020909120018054600160a060020a031916600160a060020a03929092169190911790556004805460001901906116d4908261255d565b507f091a7a4b85135fdd7e8dbc18b12fabe5cc191ea867aa3c2e1a24a102af61d58b826000604051600160a060020a039092168252151560208201526040908101905180910390a16108a8565b600101611622565b600854600160a060020a031681565b60005433600160a060020a0390811691161461175357600080fd5b600160a060020a03811682156108fc0283604051600060405180830381858888f19350505050151561178457600080fd5b7fec47e7ed86c86774d1a72c19f35c639911393fe7c1a34031fdbd260890da90de8282604051918252600160a060020a031660208201526040908101905180910390a15050565b600d6020526000908152604090205481565b6000600160a060020a03831673eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee14156118155750600160a060020a03811631611889565b82600160a060020a03166370a082318360006040516020015260405160e060020a63ffffffff8416028152600160a060020a039091166004820152602401602060405180830381600087803b151561186c57600080fd5b6102c65a03f1151561187d57600080fd5b50505060405180519150505b92915050565b60115460ff1681565b60106020526000908152604090205481565b600160a060020a03331660009081526002602052604090205460ff1615156118d157600080fd5b600160a060020a0383166000908152600b602052604090205460ff1615156118f857600080fd5b600160a060020a039092166000908152600d6020908152604080832093909355600e90522055565b600b6020526000908152604090205460ff1681565b60005433600160a060020a0390811691161461195057600080fd5b600160a060020a0383166000908152600b602052604090205460ff16151561197757600080fd5b6101f481111561198657600080fd5b6103e882111561199557600080fd5b600160a060020a039092166000908152600f6020908152604080832094909455601090529190912055565b600054600160a060020a031681565b600080808080806b204fce5e3e250261100000008911156119ef57600080fd5b89600160a060020a03166370a082313060006040516020015260405160e060020a63ffffffff8416028152600160a060020a039091166004820152602401602060405180830381600087803b1515611a4657600080fd5b6102c65a03f11515611a5757600080fd5b50505060405180519550508615611aa95788851015611a795760009550611bec565b600160a060020a038a166000908152600d60205260409020548986031015611aa45760009550611bec565b611aef565b8730600160a060020a0316311015611ac45760009550611bec565b600160a060020a038a166000908152600e6020526040902054858a011115611aef5760009550611bec565b600a54611b08908b90600160a060020a031660006120f8565b600a549196509450611b269150600160a060020a03168b60006120f8565b93509150506b204fce5e3e250261100000008411801590611b5357506b204fce5e3e250261100000008211155b8015611b6b57506b204fce5e3e250261100000008311155b8015611b8357506b204fce5e3e250261100000008111155b1515611b8e57600080fd5b8282028185021115611ba35760009550611bec565b601060008b600160a060020a0316600160a060020a03168152602001908152602001600020548185020281850284840203612710021015611be75760009550611bec565b600195505b5050505050949350505050565b600080600160a060020a03831673eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee1415611c2a5760129150611cb7565b50600160a060020a038216600090815260066020526040902054801515611cb35782600160a060020a031663313ce5676000604051602001526040518163ffffffff1660e060020a028152600401602060405180830381600087803b1515611c9157600080fd5b6102c65a03f11515611ca257600080fd5b505050604051805190509150611cb7565b8091505b50919050565b600080600080611ccd8a89612063565b1515611cd857600080fd5b8415611d2c5760008611611ceb57600080fd5b600160a060020a038a1673eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee1415611d2157348914611d1c57600080fd5b611d2c565b3415611d2c57600080fd5b611d3989601280896123da565b915060008211611d4857600080fd5b611d5182610dc2565b9050600160a060020a038a1673eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee1415611e8e57611d8588838b60016119cf565b1515611e0657600a54600160a060020a031663d0e30db0346040518263ffffffff1660e060020a0281526004016000604051808303818588803b1515611dca57600080fd5b6125ee5a03f11515611ddb57600080fd5b5050600a54611df79250600160a060020a03169050898b612467565b925080831015611e0657600080fd5b87600160a060020a031663a9059cbb888460006040516020015260405160e060020a63ffffffff8516028152600160a060020a0390921660048301526024820152604401602060405180830381600087803b1515611e6357600080fd5b6102c65a03f11515611e7457600080fd5b505050604051805190501515611e8957600080fd5b611fe6565b89600160a060020a03166323b872dd33308c60006040516020015260405160e060020a63ffffffff8616028152600160a060020a0393841660048201529190921660248201526044810191909152606401602060405180830381600087803b1515611ef857600080fd5b6102c65a03f11515611f0957600080fd5b505050604051805190501515611f1e57600080fd5b611f2b8a8a8460006119cf565b1515611fb557600a54611f49908b90600160a060020a03168b612467565b925080831015611f5857600080fd5b600a54600160a060020a0316632e1a7d4d8460405160e060020a63ffffffff84160281526004810191909152602401600060405180830381600087803b1515611fa057600080fd5b6102c65a03f11515611fb157600080fd5b5050505b600160a060020a03871682156108fc0283604051600060405180830381858888f193505050501515611fe657600080fd5b33600160a060020a03167fea9415385bae08fe9f6dc457b02577166790cde83bb18cc340aac6cb81b824de8b8b8b868c604051600160a060020a039586168152602081019490945291841660408085019190915260608401919091529216608082015260a001905180910390a25060019998505050505050505050565b600160a060020a0382166000908152600b602052604081205460ff1680156120a7575073eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee600160a060020a038316145b806120f15750600160a060020a0382166000908152600b602052604090205460ff1680156120f1575073eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee600160a060020a038416145b9392505050565b600954600090819081908190600160a060020a0316630374fc6f8888846040516020015260405160e060020a63ffffffff8516028152600160a060020a03928316600482015291166024820152604401602060405180830381600087803b151561216157600080fd5b6102c65a03f1151561217257600080fd5b5050506040518051600954909550600160a060020a03169050634579268a8560006040516080015260405160e060020a63ffffffff84160281526004810191909152602401608060405180830381600087803b15156121d057600080fd5b6102c65a03f115156121e157600080fd5b50505060405180519060200180519060200180519060200180515092955093506001925050505b8185111561232d57600954600160a060020a031663943911bc8560006040516020015260405160e060020a63ffffffff84160281526004810191909152602401602060405180830381600087803b151561226157600080fd5b6102c65a03f1151561227257600080fd5b505050604051805194505083158061228d5750600101600781115b156122a35760009350600092506000915061232d565b600954600160a060020a0316634579268a8560006040516080015260405160e060020a63ffffffff84160281526004810191909152602401608060405180830381600087803b15156122f457600080fd5b6102c65a03f1151561230557600080fd5b5050506040518051906020018051906020018051906020018051509295509350612208915050565b5093509350939050565b60006b204fce5e3e2502611000000085111561235257600080fd5b6b204fce5e3e2502611000000084111561236b57600080fd5b8282106123a6576012838303111561238257600080fd5b84838303600a0a02670de0b6b3a7640000850281151561239e57fe5b0490506123d2565b601282840311156123b657600080fd5b84828403600a0a670de0b6b3a764000086020281151561239e57fe5b949350505050565b60006b204fce5e3e250261100000008511156123f557600080fd5b69d3c21bcecceda100000082111561240c57600080fd5b83831061243b576012848403111561242357600080fd5b670de0b6b3a7640000858302858503600a0a0261239e565b6012838503111561244b57600080fd5b828403600a0a670de0b6b3a76400000282860281151561239e57fe5b6000806000806124788688876120f8565b919450925090506b204fce5e3e2502611000000085111561249857600080fd5b6b204fce5e3e250261100000008211156124b157600080fd5b808286028115156124be57fe5b0493506fffffffffffffffffffffffffffffffff841684146124df57600080fd5b600954600160a060020a03166349606455848660405160e060020a63ffffffff851602815260048101929092526fffffffffffffffffffffffffffffffff166024820152604401600060405180830381600087803b151561253f57600080fd5b6102c65a03f1151561255057600080fd5b5050505050509392505050565b81548183558181151161258157600083815260209020612581918101908301612598565b505050565b60206040519081016040526000815290565b61073991905b808211156125b2576000815560010161259e565b50905600a165627a7a72305820c65ed24fe6b5aa8f577c83a0591036ea9abc9e7eed5d215aea7a1a74eb0f9a7f0029000000000000000000000000706abce058db29eb36578c463cf295f180a1fe9c000000000000000000000000b7ac09c2c0217b07d7c103029b4918a2c401eecb000000000000000000000000c02aaa39b223fe8d0a0e5c4f27ead9083c756cc2000000000000000000000000d0643bc0d0c879f175556509dbcee9373379d5c30000000000000000000000000000000000000000000000000000000000000019

Deployed Bytecode

0x6060604052600436106101d35763ffffffff60e060020a60003504166299d38681146101d557806301a12fd3146101fc5780630717d7c31461021b5780631db950781461023d57806324a9d8531461026e5780632678224714610281578063274544ce146102b057806327a099d8146102d257806336b61e3c146103385780633ccdbb281461034b578063408ee7fe1461037457806347e6924f146103935780634b57b0be146103a657806354a325a6146103b95780635b714690146103d85780635cf4a0da146103ee5780636940030f1461040d5780636cf69811146104205780636f3d80431461044c57806372c27b621461046257806375829def1461047857806377f50f97146104975780637acc8678146104aa5780637c423f54146104c95780637cd44272146104dc57806390b7e28f146105075780639870d7fe14610526578063abffc9ac14610545578063ac8a584a14610564578063b78b842d14610583578063ce56c45414610596578063d1a75930146105b8578063d4fac45d146105d7578063d621e813146105fc578063d6b45f791461060f578063e2c44ac51461062e578063e69ec65314610653578063f845584214610672578063f851a44014610697578063fda51fe0146106aa575b005b34156101e057600080fd5b6101e86106d4565b604051901515815260200160405180910390f35b341561020757600080fd5b6101d3600160a060020a036004351661073c565b341561022657600080fd5b6101d3600160a060020a03600435166024356108ac565b341561024857600080fd5b61025c600160a060020a0360043516610a3a565b60405190815260200160405180910390f35b341561027957600080fd5b61025c610a4c565b341561028c57600080fd5b610294610a52565b604051600160a060020a03909116815260200160405180910390f35b34156102bb57600080fd5b61025c600160a060020a0360043516602435610a61565b34156102dd57600080fd5b6102e5610aa8565b60405160208082528190810183818151815260200191508051906020019060200280838360005b8381101561032457808201518382015260200161030c565b505050509050019250505060405180910390f35b341561034357600080fd5b610294610b10565b341561035657600080fd5b6101d3600160a060020a036004358116906024359060443516610b1f565b341561037f57600080fd5b6101d3600160a060020a0360043516610c16565b341561039e57600080fd5b610294610d12565b34156103b157600080fd5b610294610d21565b34156103c457600080fd5b6101d3600160a060020a0360043516610d30565b34156103e357600080fd5b61025c600435610dc2565b34156103f957600080fd5b61025c600160a060020a0360043516610df9565b341561041857600080fd5b6101e8610e0b565b6101e8600160a060020a03600435811690602435906044358116906064351660843560a4351515610e78565b341561045757600080fd5b61025c600435610ecd565b341561046d57600080fd5b6101d3600435610ef8565b341561048357600080fd5b6101d3600160a060020a0360043516610f5c565b34156104a257600080fd5b6101d3610ff7565b34156104b557600080fd5b6101d3600160a060020a0360043516611091565b34156104d457600080fd5b6102e5611173565b34156104e757600080fd5b61025c600160a060020a03600435811690602435166044356064356111d9565b341561051257600080fd5b61025c600160a060020a03600435166113bc565b341561053157600080fd5b6101d3600160a060020a03600435166113ce565b341561055057600080fd5b6101d3600160a060020a036004351661149e565b341561056f57600080fd5b6101d3600160a060020a03600435166115bd565b341561058e57600080fd5b610294611729565b34156105a157600080fd5b6101d3600435600160a060020a0360243516611738565b34156105c357600080fd5b61025c600160a060020a03600435166117cb565b34156105e257600080fd5b61025c600160a060020a03600435811690602435166117dd565b341561060757600080fd5b6101e861188f565b341561061a57600080fd5b61025c600160a060020a0360043516611898565b341561063957600080fd5b6101d3600160a060020a03600435166024356044356118aa565b341561065e57600080fd5b6101e8600160a060020a0360043516611920565b341561067d57600080fd5b6101d3600160a060020a0360043516602435604435611935565b34156106a257600080fd5b6102946119c0565b34156106b557600080fd5b6101e8600160a060020a036004351660243560443560643515156119cf565b6000805433600160a060020a039081169116146106f057600080fd5b6011805460ff191660019081179091557f7d7f00509dd73ac4449f698ae75ccc797895eff5fa9d446d3df387598a26e73590604051901515815260200160405180910390a15060015b90565b6000805433600160a060020a0390811691161461075857600080fd5b600160a060020a03821660009081526003602052604090205460ff16151561077f57600080fd5b50600160a060020a0381166000908152600360205260408120805460ff191690555b6005548110156108a85781600160a060020a03166005828154811015156107c457fe5b600091825260209091200154600160a060020a031614156108a0576005805460001981019081106107f157fe5b60009182526020909120015460058054600160a060020a03909216918390811061081757fe5b60009182526020909120018054600160a060020a031916600160a060020a0392909216919091179055600580549061085390600019830161255d565b507f5611bf3e417d124f97bf2c788843ea8bb502b66079fbee02158ef30b172cb762826000604051600160a060020a039092168252151560208201526040908101905180910390a16108a8565b6001016107a1565b5050565b60005433600160a060020a039081169116146108c757600080fd5b600160a060020a03821615156108dc57600080fd5b600160a060020a0382166000908152600b602052604090205460ff161561090257600080fd5b601261090d83611bf9565b1461091757600080fd5b600954600160a060020a038084169163095ea7b391167f800000000000000000000000000000000000000000000000000000000000000060006040516020015260405160e060020a63ffffffff8516028152600160a060020a0390921660048301526024820152604401602060405180830381600087803b151561099a57600080fd5b6102c65a03f115156109ab57600080fd5b5050506040518051905015156109c057600080fd5b600160a060020a039091166000908152600b60209081526040808320805460ff19166001179055600c825280832093909355600d81528282207f80000000000000000000000000000000000000000000000000000000000000009055600e8152828220829055600f81528282208290556010905290812055565b600f6020526000908152604090205481565b60125481565b600154600160a060020a031681565b6000806b204fce5e3e25026110000000831115610a7d57600080fd5b50600160a060020a0383166000908152600f6020526040902054612710808201840204949350505050565b610ab0612586565b6004805480602002602001604051908101604052809291908181526020018280548015610b0657602002820191906000526020600020905b8154600160a060020a03168152600190910190602001808311610ae8575b5050505050905090565b600954600160a060020a031681565b60005433600160a060020a03908116911614610b3a57600080fd5b82600160a060020a031663a9059cbb828460006040516020015260405160e060020a63ffffffff8516028152600160a060020a0390921660048301526024820152604401602060405180830381600087803b1515610b9757600080fd5b6102c65a03f11515610ba857600080fd5b505050604051805190501515610bbd57600080fd5b7f72cb8a894ddb372ceec3d2a7648d86f17d5a15caae0e986c53109b8a9a9385e6838383604051600160a060020a03938416815260208101929092529091166040808301919091526060909101905180910390a1505050565b60005433600160a060020a03908116911614610c3157600080fd5b600160a060020a03811660009081526003602052604090205460ff1615610c5757600080fd5b60055460329010610c6757600080fd5b7f5611bf3e417d124f97bf2c788843ea8bb502b66079fbee02158ef30b172cb762816001604051600160a060020a039092168252151560208201526040908101905180910390a1600160a060020a0381166000908152600360205260409020805460ff191660019081179091556005805490918101610ce6838261255d565b5060009182526020909120018054600160a060020a031916600160a060020a0392909216919091179055565b600754600160a060020a031681565b600a54600160a060020a031681565b60005433600160a060020a03908116911614610d4b57600080fd5b600160a060020a0381161515610d6057600080fd5b60088054600160a060020a031916600160a060020a0383811691909117918290557f38622430bb6defd4452b087e8d0b4a6d1c4d35c179c2d7d875d4abb272b9d88b9116604051600160a060020a03909116815260200160405180910390a150565b60006b204fce5e3e25026110000000821115610ddd57600080fd5b601254612710038261271002811515610df257fe5b0492915050565b600c6020526000908152604090205481565b600160a060020a03331660009081526003602052604081205460ff161515610e3257600080fd5b6011805460ff191690557f7d7f00509dd73ac4449f698ae75ccc797895eff5fa9d446d3df387598a26e7356000604051901515815260200160405180910390a150600190565b60115460009060ff161515610e8c57600080fd5b60085433600160a060020a03908116911614610ea757600080fd5b610eb5878787878787611cbd565b1515610ec057600080fd5b5060019695505050505050565b60006b204fce5e3e25026110000000821115610ee857600080fd5b6012546127109081038302610df2565b60005433600160a060020a03908116911614610f1357600080fd5b6127108110610f2157600080fd5b60128190557f4f78c4ceb393a616bbd264a4584a9ad15d722042ce1e135e6a8380217f5cb42b8160405190815260200160405180910390a150565b60005433600160a060020a03908116911614610f7757600080fd5b600160a060020a0381161515610f8c57600080fd5b6001547f3b81caf78fa51ecbc8acb482fd7012a277b428d9b80f9d156e8a54107496cc4090600160a060020a0316604051600160a060020a03909116815260200160405180910390a160018054600160a060020a031916600160a060020a0392909216919091179055565b60015433600160a060020a0390811691161461101257600080fd5b6001546000547f65da1cfc2c2e81576ad96afb24a581f8e109b7a403b35cbd3243a1c99efdb9ed91600160a060020a039081169116604051600160a060020a039283168152911660208201526040908101905180910390a16001805460008054600160a060020a0319908116600160a060020a03841617909155169055565b60005433600160a060020a039081169116146110ac57600080fd5b600160a060020a03811615156110c157600080fd5b7f3b81caf78fa51ecbc8acb482fd7012a277b428d9b80f9d156e8a54107496cc4081604051600160a060020a03909116815260200160405180910390a16000547f65da1cfc2c2e81576ad96afb24a581f8e109b7a403b35cbd3243a1c99efdb9ed908290600160a060020a0316604051600160a060020a039283168152911660208201526040908101905180910390a160008054600160a060020a031916600160a060020a0392909216919091179055565b61117b612586565b6005805480602002602001604051908101604052809291908181526020018280548015610b0657602002820191906000526020600020908154600160a060020a03168152600190910190602001808311610ae8575050505050905090565b600080600080600080600080600080601160009054906101000a900460ff16151561120757600099506113ab565b6112118e8e612063565b151561122057600099506113ab565b600160a060020a038e1673eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee141561125e57600a548c9850600160a060020a031696508c95506112fd565b600160a060020a038d1673eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee14156112f4578d9650600a60009054906101000a9004600160a060020a03169550600c60008f600160a060020a0316600160a060020a03168152602001908152602001600020548c10156112eb57600160a060020a038e166000908152600c602052604090205497506112ef565b8b97505b6112fd565b600099506113ab565b61130886888a6120f8565b9096509450508388111561131f57600099506113ab565b6000925061132d8186610a61565b9150600160a060020a038e1673eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee141561136a57508b61136381838660016119cf565b925061137c565b508c61137981858460006119cf565b92505b6113898486601280612337565b985082156113a25761139b818a610a61565b99506113ab565b61139b89610ecd565b505050505050505050949350505050565b600e6020526000908152604090205481565b60005433600160a060020a039081169116146113e957600080fd5b600160a060020a03811660009081526002602052604090205460ff161561140f57600080fd5b6004546032901061141f57600080fd5b7f091a7a4b85135fdd7e8dbc18b12fabe5cc191ea867aa3c2e1a24a102af61d58b816001604051600160a060020a039092168252151560208201526040908101905180910390a1600160a060020a0381166000908152600260205260409020805460ff191660019081179091556004805490918101610ce6838261255d565b60005433600160a060020a039081169116146114b957600080fd5b600160a060020a0381166000908152600b602052604090205460ff1615156114e057600080fd5b600954600160a060020a038083169163095ea7b391166000806040516020015260405160e060020a63ffffffff8516028152600160a060020a0390921660048301526024820152604401602060405180830381600087803b151561154357600080fd5b6102c65a03f1151561155457600080fd5b50505060405180519050151561156957600080fd5b600160a060020a03166000908152600b60209081526040808320805460ff19169055600c8252808320839055600d8252808320839055600e8252808320839055600f82528083208390556010909152812055565b6000805433600160a060020a039081169116146115d957600080fd5b600160a060020a03821660009081526002602052604090205460ff16151561160057600080fd5b50600160a060020a0381166000908152600260205260408120805460ff191690555b6004548110156108a85781600160a060020a031660048281548110151561164557fe5b600091825260209091200154600160a060020a031614156117215760048054600019810190811061167257fe5b60009182526020909120015460048054600160a060020a03909216918390811061169857fe5b60009182526020909120018054600160a060020a031916600160a060020a03929092169190911790556004805460001901906116d4908261255d565b507f091a7a4b85135fdd7e8dbc18b12fabe5cc191ea867aa3c2e1a24a102af61d58b826000604051600160a060020a039092168252151560208201526040908101905180910390a16108a8565b600101611622565b600854600160a060020a031681565b60005433600160a060020a0390811691161461175357600080fd5b600160a060020a03811682156108fc0283604051600060405180830381858888f19350505050151561178457600080fd5b7fec47e7ed86c86774d1a72c19f35c639911393fe7c1a34031fdbd260890da90de8282604051918252600160a060020a031660208201526040908101905180910390a15050565b600d6020526000908152604090205481565b6000600160a060020a03831673eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee14156118155750600160a060020a03811631611889565b82600160a060020a03166370a082318360006040516020015260405160e060020a63ffffffff8416028152600160a060020a039091166004820152602401602060405180830381600087803b151561186c57600080fd5b6102c65a03f1151561187d57600080fd5b50505060405180519150505b92915050565b60115460ff1681565b60106020526000908152604090205481565b600160a060020a03331660009081526002602052604090205460ff1615156118d157600080fd5b600160a060020a0383166000908152600b602052604090205460ff1615156118f857600080fd5b600160a060020a039092166000908152600d6020908152604080832093909355600e90522055565b600b6020526000908152604090205460ff1681565b60005433600160a060020a0390811691161461195057600080fd5b600160a060020a0383166000908152600b602052604090205460ff16151561197757600080fd5b6101f481111561198657600080fd5b6103e882111561199557600080fd5b600160a060020a039092166000908152600f6020908152604080832094909455601090529190912055565b600054600160a060020a031681565b600080808080806b204fce5e3e250261100000008911156119ef57600080fd5b89600160a060020a03166370a082313060006040516020015260405160e060020a63ffffffff8416028152600160a060020a039091166004820152602401602060405180830381600087803b1515611a4657600080fd5b6102c65a03f11515611a5757600080fd5b50505060405180519550508615611aa95788851015611a795760009550611bec565b600160a060020a038a166000908152600d60205260409020548986031015611aa45760009550611bec565b611aef565b8730600160a060020a0316311015611ac45760009550611bec565b600160a060020a038a166000908152600e6020526040902054858a011115611aef5760009550611bec565b600a54611b08908b90600160a060020a031660006120f8565b600a549196509450611b269150600160a060020a03168b60006120f8565b93509150506b204fce5e3e250261100000008411801590611b5357506b204fce5e3e250261100000008211155b8015611b6b57506b204fce5e3e250261100000008311155b8015611b8357506b204fce5e3e250261100000008111155b1515611b8e57600080fd5b8282028185021115611ba35760009550611bec565b601060008b600160a060020a0316600160a060020a03168152602001908152602001600020548185020281850284840203612710021015611be75760009550611bec565b600195505b5050505050949350505050565b600080600160a060020a03831673eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee1415611c2a5760129150611cb7565b50600160a060020a038216600090815260066020526040902054801515611cb35782600160a060020a031663313ce5676000604051602001526040518163ffffffff1660e060020a028152600401602060405180830381600087803b1515611c9157600080fd5b6102c65a03f11515611ca257600080fd5b505050604051805190509150611cb7565b8091505b50919050565b600080600080611ccd8a89612063565b1515611cd857600080fd5b8415611d2c5760008611611ceb57600080fd5b600160a060020a038a1673eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee1415611d2157348914611d1c57600080fd5b611d2c565b3415611d2c57600080fd5b611d3989601280896123da565b915060008211611d4857600080fd5b611d5182610dc2565b9050600160a060020a038a1673eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee1415611e8e57611d8588838b60016119cf565b1515611e0657600a54600160a060020a031663d0e30db0346040518263ffffffff1660e060020a0281526004016000604051808303818588803b1515611dca57600080fd5b6125ee5a03f11515611ddb57600080fd5b5050600a54611df79250600160a060020a03169050898b612467565b925080831015611e0657600080fd5b87600160a060020a031663a9059cbb888460006040516020015260405160e060020a63ffffffff8516028152600160a060020a0390921660048301526024820152604401602060405180830381600087803b1515611e6357600080fd5b6102c65a03f11515611e7457600080fd5b505050604051805190501515611e8957600080fd5b611fe6565b89600160a060020a03166323b872dd33308c60006040516020015260405160e060020a63ffffffff8616028152600160a060020a0393841660048201529190921660248201526044810191909152606401602060405180830381600087803b1515611ef857600080fd5b6102c65a03f11515611f0957600080fd5b505050604051805190501515611f1e57600080fd5b611f2b8a8a8460006119cf565b1515611fb557600a54611f49908b90600160a060020a03168b612467565b925080831015611f5857600080fd5b600a54600160a060020a0316632e1a7d4d8460405160e060020a63ffffffff84160281526004810191909152602401600060405180830381600087803b1515611fa057600080fd5b6102c65a03f11515611fb157600080fd5b5050505b600160a060020a03871682156108fc0283604051600060405180830381858888f193505050501515611fe657600080fd5b33600160a060020a03167fea9415385bae08fe9f6dc457b02577166790cde83bb18cc340aac6cb81b824de8b8b8b868c604051600160a060020a039586168152602081019490945291841660408085019190915260608401919091529216608082015260a001905180910390a25060019998505050505050505050565b600160a060020a0382166000908152600b602052604081205460ff1680156120a7575073eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee600160a060020a038316145b806120f15750600160a060020a0382166000908152600b602052604090205460ff1680156120f1575073eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee600160a060020a038416145b9392505050565b600954600090819081908190600160a060020a0316630374fc6f8888846040516020015260405160e060020a63ffffffff8516028152600160a060020a03928316600482015291166024820152604401602060405180830381600087803b151561216157600080fd5b6102c65a03f1151561217257600080fd5b5050506040518051600954909550600160a060020a03169050634579268a8560006040516080015260405160e060020a63ffffffff84160281526004810191909152602401608060405180830381600087803b15156121d057600080fd5b6102c65a03f115156121e157600080fd5b50505060405180519060200180519060200180519060200180515092955093506001925050505b8185111561232d57600954600160a060020a031663943911bc8560006040516020015260405160e060020a63ffffffff84160281526004810191909152602401602060405180830381600087803b151561226157600080fd5b6102c65a03f1151561227257600080fd5b505050604051805194505083158061228d5750600101600781115b156122a35760009350600092506000915061232d565b600954600160a060020a0316634579268a8560006040516080015260405160e060020a63ffffffff84160281526004810191909152602401608060405180830381600087803b15156122f457600080fd5b6102c65a03f1151561230557600080fd5b5050506040518051906020018051906020018051906020018051509295509350612208915050565b5093509350939050565b60006b204fce5e3e2502611000000085111561235257600080fd5b6b204fce5e3e2502611000000084111561236b57600080fd5b8282106123a6576012838303111561238257600080fd5b84838303600a0a02670de0b6b3a7640000850281151561239e57fe5b0490506123d2565b601282840311156123b657600080fd5b84828403600a0a670de0b6b3a764000086020281151561239e57fe5b949350505050565b60006b204fce5e3e250261100000008511156123f557600080fd5b69d3c21bcecceda100000082111561240c57600080fd5b83831061243b576012848403111561242357600080fd5b670de0b6b3a7640000858302858503600a0a0261239e565b6012838503111561244b57600080fd5b828403600a0a670de0b6b3a76400000282860281151561239e57fe5b6000806000806124788688876120f8565b919450925090506b204fce5e3e2502611000000085111561249857600080fd5b6b204fce5e3e250261100000008211156124b157600080fd5b808286028115156124be57fe5b0493506fffffffffffffffffffffffffffffffff841684146124df57600080fd5b600954600160a060020a03166349606455848660405160e060020a63ffffffff851602815260048101929092526fffffffffffffffffffffffffffffffff166024820152604401600060405180830381600087803b151561253f57600080fd5b6102c65a03f1151561255057600080fd5b5050505050509392505050565b81548183558181151161258157600083815260209020612581918101908301612598565b505050565b60206040519081016040526000815290565b61073991905b808211156125b2576000815560010161259e565b50905600a165627a7a72305820c65ed24fe6b5aa8f577c83a0591036ea9abc9e7eed5d215aea7a1a74eb0f9a7f0029

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

000000000000000000000000706abce058db29eb36578c463cf295f180a1fe9c000000000000000000000000b7ac09c2c0217b07d7c103029b4918a2c401eecb000000000000000000000000c02aaa39b223fe8d0a0e5c4f27ead9083c756cc2000000000000000000000000d0643bc0d0c879f175556509dbcee9373379d5c30000000000000000000000000000000000000000000000000000000000000019

-----Decoded View---------------
Arg [0] : _kyberNetwork (address): 0x706aBcE058DB29eB36578c463cf295F180a1Fe9C
Arg [1] : _otc (address): 0xB7ac09C2c0217B07d7c103029B4918a2C401eeCB
Arg [2] : _wethToken (address): 0xC02aaA39b223FE8D0A0e5C4F27eAD9083C756Cc2
Arg [3] : _admin (address): 0xd0643BC0D0C879F175556509dbcEe9373379D5C3
Arg [4] : _feeBps (uint256): 25

-----Encoded View---------------
5 Constructor Arguments found :
Arg [0] : 000000000000000000000000706abce058db29eb36578c463cf295f180a1fe9c
Arg [1] : 000000000000000000000000b7ac09c2c0217b07d7c103029b4918a2c401eecb
Arg [2] : 000000000000000000000000c02aaa39b223fe8d0a0e5c4f27ead9083c756cc2
Arg [3] : 000000000000000000000000d0643bc0d0c879f175556509dbcee9373379d5c3
Arg [4] : 0000000000000000000000000000000000000000000000000000000000000019


Swarm Source

bzzr://c65ed24fe6b5aa8f577c83a0591036ea9abc9e7eed5d215aea7a1a74eb0f9a7f

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.