ETH Price: $2,493.96 (-0.20%)

Contract

0x6EacCb2E51628d1757c22A3e28408F47c6e036F0
 

Overview

ETH Balance

0 ETH

Eth Value

$0.00

Multichain Info

No addresses found
Transaction Hash
Method
Block
From
To
Set Liquidity Pa...106120242020-08-07 10:01:431543 days ago1596794503IN
0x6EacCb2E...7c6e036F0
0 ETH0.00812731105
Reset Collected ...106119652020-08-07 9:48:171543 days ago1596793697IN
0x6EacCb2E...7c6e036F0
0 ETH0.00157416105
Set Liquidity Pa...97794052020-03-31 12:10:431672 days ago1585656643IN
0x6EacCb2E...7c6e036F0
0 ETH0.0018576724
Set Liquidity Pa...97793942020-03-31 12:07:471672 days ago1585656467IN
0x6EacCb2E...7c6e036F0
0 ETH0.0005765524
Set Liquidity Pa...95905362020-03-02 8:24:001701 days ago1583137440IN
0x6EacCb2E...7c6e036F0
0 ETH0.0015552724
Set Liquidity Pa...95904962020-03-02 8:14:481701 days ago1583136888IN
0x6EacCb2E...7c6e036F0
0 ETH0.0017568724
Set Liquidity Pa...95468592020-02-24 15:03:181708 days ago1582556598IN
0x6EacCb2E...7c6e036F0
0 ETH0.0017568724
Set Liquidity Pa...95451472020-02-24 8:41:541708 days ago1582533714IN
0x6EacCb2E...7c6e036F0
0 ETH0.0066816724
Transfer Admin Q...95256462020-02-21 9:01:071711 days ago1582275667IN
0x6EacCb2E...7c6e036F0
0 ETH0.0009800730
Add Alerter95256462020-02-21 9:01:071711 days ago1582275667IN
0x6EacCb2E...7c6e036F0
0 ETH0.0026989830
Add Operator95256462020-02-21 9:01:071711 days ago1582275667IN
0x6EacCb2E...7c6e036F0
0 ETH0.0027128430
Set Reserve Addr...95256462020-02-21 9:01:071711 days ago1582275667IN
0x6EacCb2E...7c6e036F0
0 ETH0.0013426830
0x6060604095256452020-02-21 9:01:051711 days ago1582275665IN
 Contract Creation
0 ETH0.0579296430

View more zero value Internal Transactions in Advanced View mode

Advanced mode:
Loading...
Loading

Similar Match Source Code
This contract matches the deployed Bytecode of the Source Code for Contract 0xF5307851...c9943Cdb2
The constructor portion of the code might be different and could alter the actual behaviour of the contract

Contract Name:
LiquidityConversionRates

Compiler Version
v0.4.18+commit.9cf6e910

Optimization Enabled:
Yes with 200 runs

Other Settings:
default evmVersion, None license

Contract Source Code (Solidity Multiple files format)

File 1 of 7: LiquidityConversionRates.sol
pragma solidity 0.4.18;


import "../../ConversionRatesInterface.sol";
import "../../Withdrawable.sol";
import "../../Utils.sol";
import "./LiquidityFormula.sol";


contract LiquidityConversionRates is ConversionRatesInterface, LiquidityFormula, Withdrawable, Utils {

    uint constant FORMULA_PRECISION_BITS = 40;

    ERC20 public token;
    address public reserveContract;

    uint public numFpBits;
    uint public formulaPrecision;

    uint public rInFp;
    uint public pMinInFp;

    uint public maxEthCapBuyInFp;
    uint public maxEthCapSellInFp;
    uint public maxQtyInFp;

    uint public feeInBps;
    uint public collectedFeesInTwei = 0;

    uint public maxBuyRateInPrecision;
    uint public minBuyRateInPrecision;
    uint public maxSellRateInPrecision;
    uint public minSellRateInPrecision;

    function LiquidityConversionRates(address _admin, ERC20 _token) public {
        transferAdminQuickly(_admin);
        token = _token;
        setDecimals(token);
        require(getDecimals(token) <= MAX_DECIMALS);
    }

    event ReserveAddressSet(address reserve);

    function setReserveAddress(address reserve) public onlyAdmin {
        reserveContract = reserve;
        ReserveAddressSet(reserve);
    }

    event LiquidityParamsSet(
        uint rInFp,
        uint pMinInFp,
        uint numFpBits,
        uint maxCapBuyInFp,
        uint maxEthCapSellInFp,
        uint feeInBps,
        uint formulaPrecision,
        uint maxQtyInFp,
        uint maxBuyRateInPrecision,
        uint minBuyRateInPrecision,
        uint maxSellRateInPrecision,
        uint minSellRateInPrecision
    );

    function setLiquidityParams(
        uint _rInFp,
        uint _pMinInFp,
        uint _numFpBits,
        uint _maxCapBuyInWei,
        uint _maxCapSellInWei,
        uint _feeInBps,
        uint _maxTokenToEthRateInPrecision,
        uint _minTokenToEthRateInPrecision
    ) public onlyAdmin {
        require(_numFpBits == FORMULA_PRECISION_BITS); // only used config, but keep in API
        formulaPrecision = uint(1)<<_numFpBits; // require(formulaPrecision <= MAX_QTY)
        require(_feeInBps < 10000);
        require(_minTokenToEthRateInPrecision < _maxTokenToEthRateInPrecision);
        require(_minTokenToEthRateInPrecision > 0);
        require(_rInFp > 0);
        require(_pMinInFp > 0);

        rInFp = _rInFp;
        pMinInFp = _pMinInFp;
        maxQtyInFp = fromWeiToFp(MAX_QTY);
        numFpBits = _numFpBits;
        maxEthCapBuyInFp = fromWeiToFp(_maxCapBuyInWei);
        maxEthCapSellInFp = fromWeiToFp(_maxCapSellInWei);
        feeInBps = _feeInBps;
        maxBuyRateInPrecision = PRECISION * PRECISION / _minTokenToEthRateInPrecision;
        minBuyRateInPrecision = PRECISION * PRECISION / _maxTokenToEthRateInPrecision;
        maxSellRateInPrecision = _maxTokenToEthRateInPrecision;
        minSellRateInPrecision = _minTokenToEthRateInPrecision;

        LiquidityParamsSet(
            rInFp,
            pMinInFp,
            numFpBits,
            maxEthCapBuyInFp,
            maxEthCapSellInFp,
            feeInBps,
            formulaPrecision,
            maxQtyInFp,
            maxBuyRateInPrecision,
            minBuyRateInPrecision,
            maxSellRateInPrecision,
            minSellRateInPrecision
        );
    }

    function recordImbalance(
        ERC20 conversionToken,
        int buyAmountInTwei,
        uint rateUpdateBlock,
        uint currentBlock
    )
        public
    {
        conversionToken;
        rateUpdateBlock;
        currentBlock;

        require(msg.sender == reserveContract);
        if (buyAmountInTwei > 0) {
            // Buy case
            collectedFeesInTwei += calcCollectedFee(abs(buyAmountInTwei));
        } else {
            // Sell case
            collectedFeesInTwei += abs(buyAmountInTwei) * feeInBps / 10000;
        }
    }

    event CollectedFeesReset(uint resetFeesInTwei);

    function resetCollectedFees() public onlyAdmin {
        uint resetFeesInTwei = collectedFeesInTwei;
        collectedFeesInTwei = 0;

        CollectedFeesReset(resetFeesInTwei);
    }

    function getRate(
            ERC20 conversionToken,
            uint currentBlockNumber,
            bool buy,
            uint qtyInSrcWei
    ) public view returns(uint) {

        currentBlockNumber;

        require(qtyInSrcWei <= MAX_QTY);
        uint eInFp = fromWeiToFp(reserveContract.balance);
        uint rateInPrecision = getRateWithE(conversionToken, buy, qtyInSrcWei, eInFp);
        require(rateInPrecision <= MAX_RATE);
        return rateInPrecision;
    }

    function getRateWithE(ERC20 conversionToken, bool buy, uint qtyInSrcWei, uint eInFp) public view returns(uint) {
        uint deltaEInFp;
        uint sellInputTokenQtyInFp;
        uint deltaTInFp;
        uint rateInPrecision;

        require(qtyInSrcWei <= MAX_QTY);
        require(eInFp <= maxQtyInFp);
        if (conversionToken != token) return 0;

        if (buy) {
            // ETH goes in, token goes out
            deltaEInFp = fromWeiToFp(qtyInSrcWei);
            if (deltaEInFp > maxEthCapBuyInFp) return 0;

            if (deltaEInFp == 0) {
                rateInPrecision = buyRateZeroQuantity(eInFp);
            } else {
                rateInPrecision = buyRate(eInFp, deltaEInFp);
            }
        } else {
            sellInputTokenQtyInFp = fromTweiToFp(qtyInSrcWei);
            deltaTInFp = valueAfterReducingFee(sellInputTokenQtyInFp);
            if (deltaTInFp == 0) {
                rateInPrecision = sellRateZeroQuantity(eInFp);
                deltaEInFp = 0;
            } else {
                (rateInPrecision, deltaEInFp) = sellRate(eInFp, sellInputTokenQtyInFp, deltaTInFp);
            }

            if (deltaEInFp > maxEthCapSellInFp) return 0;
        }

        rateInPrecision = rateAfterValidation(rateInPrecision, buy);
        return rateInPrecision;
    }

    function rateAfterValidation(uint rateInPrecision, bool buy) public view returns(uint) {
        uint minAllowRateInPrecision;
        uint maxAllowedRateInPrecision;

        if (buy) {
            minAllowRateInPrecision = minBuyRateInPrecision;
            maxAllowedRateInPrecision = maxBuyRateInPrecision;
        } else {
            minAllowRateInPrecision = minSellRateInPrecision;
            maxAllowedRateInPrecision = maxSellRateInPrecision;
        }

        if ((rateInPrecision > maxAllowedRateInPrecision) || (rateInPrecision < minAllowRateInPrecision)) {
            return 0;
        } else if (rateInPrecision > MAX_RATE) {
            return 0;
        } else {
            return rateInPrecision;
        }
    }

    function buyRate(uint eInFp, uint deltaEInFp) public view returns(uint) {
        uint deltaTInFp = deltaTFunc(rInFp, pMinInFp, eInFp, deltaEInFp, formulaPrecision);
        require(deltaTInFp <= maxQtyInFp);
        deltaTInFp = valueAfterReducingFee(deltaTInFp);
        return deltaTInFp * PRECISION / deltaEInFp;
    }

    function buyRateZeroQuantity(uint eInFp) public view returns(uint) {
        uint ratePreReductionInPrecision = formulaPrecision * PRECISION / pE(rInFp, pMinInFp, eInFp, formulaPrecision);
        return valueAfterReducingFee(ratePreReductionInPrecision);
    }

    function sellRate(
        uint eInFp,
        uint sellInputTokenQtyInFp,
        uint deltaTInFp
    ) public view returns(uint rateInPrecision, uint deltaEInFp) {
        deltaEInFp = deltaEFunc(rInFp, pMinInFp, eInFp, deltaTInFp, formulaPrecision, numFpBits);
        require(deltaEInFp <= maxQtyInFp);
        rateInPrecision = deltaEInFp * PRECISION / sellInputTokenQtyInFp;
    }

    function sellRateZeroQuantity(uint eInFp) public view returns(uint) {
        uint ratePreReductionInPrecision = pE(rInFp, pMinInFp, eInFp, formulaPrecision) * PRECISION / formulaPrecision;
        return valueAfterReducingFee(ratePreReductionInPrecision);
    }

    function fromTweiToFp(uint qtyInTwei) public view returns(uint) {
        require(qtyInTwei <= MAX_QTY);
        return qtyInTwei * formulaPrecision / (10 ** getDecimals(token));
    }

    function fromWeiToFp(uint qtyInwei) public view returns(uint) {
        require(qtyInwei <= MAX_QTY);
        return qtyInwei * formulaPrecision / (10 ** ETH_DECIMALS);
    }

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

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

    function abs(int val) public pure returns(uint) {
        if (val < 0) {
            return uint(val * (-1));
        } else {
            return uint(val);
        }
    }
}

File 2 of 7: ConversionRatesInterface.sol
pragma solidity 0.4.18;


import "./ERC20Interface.sol";


interface ConversionRatesInterface {

    function recordImbalance(
        ERC20 token,
        int buyAmount,
        uint rateUpdateBlock,
        uint currentBlock
    )
        public;

    function getRate(ERC20 token, uint currentBlockNumber, bool buy, uint qty) public view returns(uint);
}

File 3 of 7: 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 4 of 7: LiquidityFormula.sol
pragma solidity 0.4.18;


contract UtilMath {
    uint public constant BIG_NUMBER = (uint(1)<<uint(200));

    function checkMultOverflow(uint x, uint y) public pure returns(bool) {
        if (y == 0) return false;
        return (((x*y) / y) != x);
    }

    function compactFraction(uint p, uint q, uint precision) public pure returns (uint, uint) {
        if (q < precision * precision) return (p, q);
        return compactFraction(p/precision, q/precision, precision);
    }

    /* solhint-disable code-complexity */
    function exp(uint p, uint q, uint precision) public pure returns (uint) {
        uint n = 0;
        uint nFact = 1;
        uint currentP = 1;
        uint currentQ = 1;

        uint sum = 0;
        uint prevSum = 0;

        while (true) {
            if (checkMultOverflow(currentP, precision)) return sum;
            if (checkMultOverflow(currentQ, nFact)) return sum;

            sum += (currentP * precision) / (currentQ * nFact);

            if (sum == prevSum) return sum;
            prevSum = sum;

            n++;

            if (checkMultOverflow(currentP, p)) return sum;
            if (checkMultOverflow(currentQ, q)) return sum;
            if (checkMultOverflow(nFact, n)) return sum;

            currentP *= p;
            currentQ *= q;
            nFact *= n;

            (currentP, currentQ) = compactFraction(currentP, currentQ, precision);
        }
    }
    /* solhint-enable code-complexity */

    function countLeadingZeros(uint p, uint q) public pure returns (uint) {
        uint denomator = (uint(1)<<255);
        for (int i = 255; i >= 0; i--) {
            if ((q*denomator)/denomator != q) {
                // overflow
                denomator = denomator/2;
                continue;
            }
            if (p/(q*denomator) > 0) return uint(i);
            denomator = denomator/2;
        }

        return uint(-1);
    }

    // log2 for a number that it in [1,2)
    function log2ForSmallNumber(uint x, uint numPrecisionBits) public pure returns (uint) {
        uint res = 0;
        uint one = (uint(1)<<numPrecisionBits);
        uint two = 2 * one;
        uint addition = one;

        require((x >= one) && (x <= two));
        require(numPrecisionBits < 125);

        for (uint i = numPrecisionBits; i > 0; i--) {
            x = (x*x) / one;
            addition = addition/2;
            if (x >= two) {
                x = x/2;
                res += addition;
            }
        }

        return res;
    }

    function logBase2 (uint p, uint q, uint numPrecisionBits) public pure returns (uint) {
        uint n = 0;
        uint precision = (uint(1)<<numPrecisionBits);

        if (p > q) {
            n = countLeadingZeros(p, q);
        }

        require(!checkMultOverflow(p, precision));
        require(!checkMultOverflow(n, precision));
        require(!checkMultOverflow(uint(1)<<n, q));

        uint y = p * precision / (q * (uint(1)<<n));
        uint log2Small = log2ForSmallNumber(y, numPrecisionBits);

        require(n*precision <= BIG_NUMBER);
        require(log2Small <= BIG_NUMBER);

        return n * precision + log2Small;
    }

    function ln(uint p, uint q, uint numPrecisionBits) public pure returns (uint) {
        uint ln2Numerator   = 6931471805599453094172;
        uint ln2Denomerator = 10000000000000000000000;

        uint log2x = logBase2(p, q, numPrecisionBits);

        require(!checkMultOverflow(ln2Numerator, log2x));

        return ln2Numerator * log2x / ln2Denomerator;
    }
}


contract LiquidityFormula is UtilMath {
    function pE(uint r, uint pMIn, uint e, uint precision) public pure returns (uint) {
        require(!checkMultOverflow(r, e));
        uint expRE = exp(r*e, precision*precision, precision);
        require(!checkMultOverflow(expRE, pMIn));
        return pMIn*expRE / precision;
    }

    function deltaTFunc(uint r, uint pMIn, uint e, uint deltaE, uint precision) public pure returns (uint) {
        uint pe = pE(r, pMIn, e, precision);
        uint rpe = r * pe;

        require(!checkMultOverflow(r, deltaE));
        uint erdeltaE = exp(r*deltaE, precision*precision, precision);

        require(erdeltaE >= precision);
        require(!checkMultOverflow(erdeltaE - precision, precision));
        require(!checkMultOverflow((erdeltaE - precision)*precision, precision));
        require(!checkMultOverflow((erdeltaE - precision)*precision*precision, precision));
        require(!checkMultOverflow(rpe, erdeltaE));
        require(!checkMultOverflow(r, pe));

        return (erdeltaE - precision) * precision * precision * precision / (rpe*erdeltaE);
    }

    function deltaEFunc(uint r, uint pMIn, uint e, uint deltaT, uint precision, uint numPrecisionBits)
        public pure
        returns (uint)
    {
        uint pe = pE(r, pMIn, e, precision);
        uint rpe = r * pe;

        require(!checkMultOverflow(rpe, deltaT));
        require(precision * precision + rpe * deltaT/precision > precision * precision);
        uint lnPart = ln(precision*precision + rpe*deltaT/precision, precision*precision, numPrecisionBits);

        require(!checkMultOverflow(r, pe));
        require(!checkMultOverflow(precision, precision));
        require(!checkMultOverflow(rpe, deltaT));
        require(!checkMultOverflow(lnPart, precision));

        return lnPart * precision / r;
    }
}

File 5 of 7: 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 6 of 7: Utils.sol
pragma solidity 0.4.18;


import "./ERC20Interface.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 7 of 7: Withdrawable.sol
pragma solidity 0.4.18;


import "./ERC20Interface.sol";
import "./PermissionGroups.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);
    }
}

Contract Security Audit

Contract ABI

[{"constant":false,"inputs":[{"name":"alerter","type":"address"}],"name":"removeAlerter","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[],"name":"maxSellRateInPrecision","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"name":"reserve","type":"address"}],"name":"setReserveAddress","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[{"name":"val","type":"int256"}],"name":"abs","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"pure","type":"function"},{"constant":true,"inputs":[{"name":"qtyInwei","type":"uint256"}],"name":"fromWeiToFp","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"name":"r","type":"uint256"},{"name":"pMIn","type":"uint256"},{"name":"e","type":"uint256"},{"name":"precision","type":"uint256"}],"name":"pE","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"pure","type":"function"},{"constant":true,"inputs":[],"name":"pendingAdmin","outputs":[{"name":"","type":"address"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"name":"p","type":"uint256"},{"name":"q","type":"uint256"},{"name":"numPrecisionBits","type":"uint256"}],"name":"ln","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"pure","type":"function"},{"constant":true,"inputs":[],"name":"maxEthCapSellInFp","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":"BIG_NUMBER","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":true,"inputs":[],"name":"collectedFeesInTwei","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"name":"newAlerter","type":"address"}],"name":"addAlerter","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[],"name":"rInFp","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"maxEthCapBuyInFp","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"formulaPrecision","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"name":"_rInFp","type":"uint256"},{"name":"_pMinInFp","type":"uint256"},{"name":"_numFpBits","type":"uint256"},{"name":"_maxCapBuyInWei","type":"uint256"},{"name":"_maxCapSellInWei","type":"uint256"},{"name":"_feeInBps","type":"uint256"},{"name":"_maxTokenToEthRateInPrecision","type":"uint256"},{"name":"_minTokenToEthRateInPrecision","type":"uint256"}],"name":"setLiquidityParams","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[{"name":"x","type":"uint256"},{"name":"y","type":"uint256"}],"name":"checkMultOverflow","outputs":[{"name":"","type":"bool"}],"payable":false,"stateMutability":"pure","type":"function"},{"constant":true,"inputs":[{"name":"eInFp","type":"uint256"},{"name":"deltaEInFp","type":"uint256"}],"name":"buyRate","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"name":"eInFp","type":"uint256"}],"name":"sellRateZeroQuantity","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"name":"val","type":"uint256"}],"name":"valueAfterReducingFee","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"numFpBits","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"view","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":"r","type":"uint256"},{"name":"pMIn","type":"uint256"},{"name":"e","type":"uint256"},{"name":"deltaE","type":"uint256"},{"name":"precision","type":"uint256"}],"name":"deltaTFunc","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"pure","type":"function"},{"constant":true,"inputs":[{"name":"x","type":"uint256"},{"name":"numPrecisionBits","type":"uint256"}],"name":"log2ForSmallNumber","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"pure","type":"function"},{"constant":true,"inputs":[{"name":"p","type":"uint256"},{"name":"q","type":"uint256"},{"name":"precision","type":"uint256"}],"name":"compactFraction","outputs":[{"name":"","type":"uint256"},{"name":"","type":"uint256"}],"payable":false,"stateMutability":"pure","type":"function"},{"constant":true,"inputs":[{"name":"conversionToken","type":"address"},{"name":"buy","type":"bool"},{"name":"qtyInSrcWei","type":"uint256"},{"name":"eInFp","type":"uint256"}],"name":"getRateWithE","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"name":"p","type":"uint256"},{"name":"q","type":"uint256"}],"name":"countLeadingZeros","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"pure","type":"function"},{"constant":true,"inputs":[{"name":"eInFp","type":"uint256"},{"name":"sellInputTokenQtyInFp","type":"uint256"},{"name":"deltaTInFp","type":"uint256"}],"name":"sellRate","outputs":[{"name":"rateInPrecision","type":"uint256"},{"name":"deltaEInFp","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"name":"qtyInTwei","type":"uint256"}],"name":"fromTweiToFp","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":true,"inputs":[{"name":"r","type":"uint256"},{"name":"pMIn","type":"uint256"},{"name":"e","type":"uint256"},{"name":"deltaT","type":"uint256"},{"name":"precision","type":"uint256"},{"name":"numPrecisionBits","type":"uint256"}],"name":"deltaEFunc","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"pure","type":"function"},{"constant":true,"inputs":[],"name":"feeInBps","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"name":"p","type":"uint256"},{"name":"q","type":"uint256"},{"name":"numPrecisionBits","type":"uint256"}],"name":"logBase2","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"pure","type":"function"},{"constant":true,"inputs":[{"name":"rateInPrecision","type":"uint256"},{"name":"buy","type":"bool"}],"name":"rateAfterValidation","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"reserveContract","outputs":[{"name":"","type":"address"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"name":"val","type":"uint256"}],"name":"calcCollectedFee","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"name":"operator","type":"address"}],"name":"removeOperator","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[{"name":"p","type":"uint256"},{"name":"q","type":"uint256"},{"name":"precision","type":"uint256"}],"name":"exp","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"pure","type":"function"},{"constant":false,"inputs":[],"name":"resetCollectedFees","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[{"name":"conversionToken","type":"address"},{"name":"currentBlockNumber","type":"uint256"},{"name":"buy","type":"bool"},{"name":"qtyInSrcWei","type":"uint256"}],"name":"getRate","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"name":"conversionToken","type":"address"},{"name":"buyAmountInTwei","type":"int256"},{"name":"rateUpdateBlock","type":"uint256"},{"name":"currentBlock","type":"uint256"}],"name":"recordImbalance","outputs":[],"payable":false,"stateMutability":"nonpayable","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":"eInFp","type":"uint256"}],"name":"buyRateZeroQuantity","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"maxBuyRateInPrecision","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"minSellRateInPrecision","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"pMinInFp","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"maxQtyInFp","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"admin","outputs":[{"name":"","type":"address"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"minBuyRateInPrecision","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"token","outputs":[{"name":"","type":"address"}],"payable":false,"stateMutability":"view","type":"function"},{"inputs":[{"name":"_admin","type":"address"},{"name":"_token","type":"address"}],"payable":false,"stateMutability":"nonpayable","type":"constructor"},{"anonymous":false,"inputs":[{"indexed":false,"name":"reserve","type":"address"}],"name":"ReserveAddressSet","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"name":"rInFp","type":"uint256"},{"indexed":false,"name":"pMinInFp","type":"uint256"},{"indexed":false,"name":"numFpBits","type":"uint256"},{"indexed":false,"name":"maxCapBuyInFp","type":"uint256"},{"indexed":false,"name":"maxEthCapSellInFp","type":"uint256"},{"indexed":false,"name":"feeInBps","type":"uint256"},{"indexed":false,"name":"formulaPrecision","type":"uint256"},{"indexed":false,"name":"maxQtyInFp","type":"uint256"},{"indexed":false,"name":"maxBuyRateInPrecision","type":"uint256"},{"indexed":false,"name":"minBuyRateInPrecision","type":"uint256"},{"indexed":false,"name":"maxSellRateInPrecision","type":"uint256"},{"indexed":false,"name":"minSellRateInPrecision","type":"uint256"}],"name":"LiquidityParamsSet","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"name":"resetFeesInTwei","type":"uint256"}],"name":"CollectedFeesReset","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"}]

Deployed Bytecode

0x6060604052600436106102795763ffffffff60e060020a60003504166301a12fd3811461027e5780630f9b51291461029f57806314673d31146102c45780631b5ac4b5146102e35780631f05ff29146102f957806320b0961c1461030f578063267822471461032e578063275acbe31461035d578063279fe9671461037957806327a099d81461038c5780632f4fda30146103f25780633ccdbb2814610405578063402776041461042e578063408ee7fe14610441578063436f64ac14610460578063463cf7301461047357806347be7bce146104865780634857d52d146104995780635111249e146104c45780635909e897146104f1578063625cfc461461050a5780636f3d80431461052057806371f805bf1461053657806375829def1461054957806377f50f97146105685780637acc86781461057b5780637c423f541461059a57806382f19e3a146105ad5780638369ff08146105cf5780638401824f146105e8578063859618641461061c578063869d7d9314610646578063925176d61461065f578063958186031461067b5780639870d7fe14610691578063a0099b60146106b0578063a0a7299b146106d5578063a0dbde9d146106e8578063a2c99d4714610704578063a7f43acd1461071f578063aa98d57b14610732578063ac8a584a14610748578063b5debaf514610767578063b86f6aa714610783578063b8e9c22e14610796578063c6fd2103146107c0578063ce56c454146107e8578063debc74f61461080a578063e255d5ad14610820578063e570270114610833578063ec6b16ca14610846578063f0247f7814610859578063f851a4401461086c578063fbe3462c1461087f578063fc0c546a14610892575b600080fd5b341561028957600080fd5b61029d600160a060020a03600435166108a5565b005b34156102aa57600080fd5b6102b2610a15565b60405190815260200160405180910390f35b34156102cf57600080fd5b61029d600160a060020a0360043516610a1b565b34156102ee57600080fd5b6102b2600435610a91565b341561030457600080fd5b6102b2600435610aae565b341561031a57600080fd5b6102b2600435602435604435606435610ae0565b341561033957600080fd5b610341610b34565b604051600160a060020a03909116815260200160405180910390f35b341561036857600080fd5b6102b2600435602435604435610b43565b341561038457600080fd5b6102b2610b96565b341561039757600080fd5b61039f610b9c565b60405160208082528190810183818151815260200191508051906020019060200280838360005b838110156103de5780820151838201526020016103c6565b505050509050019250505060405180910390f35b34156103fd57600080fd5b6102b2610c05565b341561041057600080fd5b61029d600160a060020a036004358116906024359060443516610c0d565b341561043957600080fd5b6102b2610d04565b341561044c57600080fd5b61029d600160a060020a0360043516610d0a565b341561046b57600080fd5b6102b2610e06565b341561047e57600080fd5b6102b2610e0c565b341561049157600080fd5b6102b2610e12565b34156104a457600080fd5b61029d60043560243560443560643560843560a43560c43560e435610e18565b34156104cf57600080fd5b6104dd600435602435610fc2565b604051901515815260200160405180910390f35b34156104fc57600080fd5b6102b2600435602435610fed565b341561051557600080fd5b6102b260043561103e565b341561052b57600080fd5b6102b260043561107e565b341561054157600080fd5b6102b26110a1565b341561055457600080fd5b61029d600160a060020a03600435166110a7565b341561057357600080fd5b61029d611142565b341561058657600080fd5b61029d600160a060020a03600435166111dc565b34156105a557600080fd5b61039f6112be565b34156105b857600080fd5b6102b2600435602435604435606435608435611324565b34156105da57600080fd5b6102b2600435602435611402565b34156105f357600080fd5b610604600435602435604435611480565b60405191825260208201526040908101905180910390f35b341561062757600080fd5b6102b2600160a060020a036004351660243515156044356064356114c5565b341561065157600080fd5b6102b26004356024356115ce565b341561066a57600080fd5b610604600435602435604435611657565b341561068657600080fd5b6102b26004356116a2565b341561069c57600080fd5b61029d600160a060020a03600435166116e3565b34156106bb57600080fd5b6102b260043560243560443560643560843560a4356117b3565b34156106e057600080fd5b6102b261188d565b34156106f357600080fd5b6102b2600435602435604435611893565b341561070f57600080fd5b6102b26004356024351515611946565b341561072a57600080fd5b6103416119a5565b341561073d57600080fd5b6102b26004356119b4565b341561075357600080fd5b61029d600160a060020a03600435166119e4565b341561077257600080fd5b6102b2600435602435604435611b50565b341561078e57600080fd5b61029d611c27565b34156107a157600080fd5b6102b2600160a060020a03600435166024356044351515606435611c83565b34156107cb57600080fd5b61029d600160a060020a0360043516602435604435606435611ce7565b34156107f357600080fd5b61029d600435600160a060020a0360243516611d57565b341561081557600080fd5b6102b2600435611dea565b341561082b57600080fd5b6102b2611e15565b341561083e57600080fd5b6102b2611e1b565b341561085157600080fd5b6102b2611e21565b341561086457600080fd5b6102b2611e27565b341561087757600080fd5b610341611e2d565b341561088a57600080fd5b6102b2611e3c565b341561089d57600080fd5b610341611e42565b6000805433600160a060020a039081169116146108c157600080fd5b600160a060020a03821660009081526003602052604090205460ff1615156108e857600080fd5b50600160a060020a0381166000908152600360205260408120805460ff191690555b600554811015610a115781600160a060020a031660058281548110151561092d57fe5b600091825260209091200154600160a060020a03161415610a095760058054600019810190811061095a57fe5b60009182526020909120015460058054600160a060020a03909216918390811061098057fe5b60009182526020909120018054600160a060020a031916600160a060020a039290921691909117905560058054906109bc906000198301611f0b565b507f5611bf3e417d124f97bf2c788843ea8bb502b66079fbee02158ef30b172cb762826000604051600160a060020a039092168252151560208201526040908101905180910390a1610a11565b60010161090a565b5050565b60145481565b60005433600160a060020a03908116911614610a3657600080fd5b60088054600160a060020a031916600160a060020a0383161790557fbd2ca09dd2b354751631db75d1a63231ec123c0d68c81928ea03d0be326c7f8881604051600160a060020a03909116815260200160405180910390a150565b600080821215610aa657506000198102610aa9565b50805b919050565b60006b204fce5e3e25026110000000821115610ac957600080fd5b600a54670de0b6b3a76400009083025b0492915050565b600080610aed8685610fc2565b15610af757600080fd5b610b0684870284850285611b50565b9050610b128186610fc2565b15610b1c57600080fd5b82818602811515610b2957fe5b049695505050505050565b600154600160a060020a031681565b6000690177c17eb2ae5edd211c69021e19e0c9bab240000082610b67878787611893565b9050610b738382610fc2565b15610b7d57600080fd5b81818402811515610b8a57fe5b04979650505050505050565b600e5481565b610ba4611f34565b6004805480602002602001604051908101604052809291908181526020018280548015610bfa57602002820191906000526020600020905b8154600160a060020a03168152600190910190602001808311610bdc575b505050505090505b90565b60c860020a81565b60005433600160a060020a03908116911614610c2857600080fd5b82600160a060020a031663a9059cbb828460006040516020015260405160e060020a63ffffffff8516028152600160a060020a0390921660048301526024820152604401602060405180830381600087803b1515610c8557600080fd5b6102c65a03f11515610c9657600080fd5b505050604051805190501515610cab57600080fd5b7f72cb8a894ddb372ceec3d2a7648d86f17d5a15caae0e986c53109b8a9a9385e6838383604051600160a060020a03938416815260208101929092529091166040808301919091526060909101905180910390a1505050565b60115481565b60005433600160a060020a03908116911614610d2557600080fd5b600160a060020a03811660009081526003602052604090205460ff1615610d4b57600080fd5b60055460329010610d5b57600080fd5b7f5611bf3e417d124f97bf2c788843ea8bb502b66079fbee02158ef30b172cb762816001604051600160a060020a039092168252151560208201526040908101905180910390a1600160a060020a0381166000908152600360205260409020805460ff191660019081179091556005805490918101610dda8382611f0b565b5060009182526020909120018054600160a060020a031916600160a060020a0392909216919091179055565b600b5481565b600d5481565b600a5481565b60005433600160a060020a03908116911614610e3357600080fd5b60288614610e4057600080fd5b600286900a600a556127108310610e5657600080fd5b818110610e6257600080fd5b60008111610e6f57600080fd5b60008811610e7c57600080fd5b60008711610e8957600080fd5b600b889055600c879055610ea86b204fce5e3e25026110000000610aae565b600f556009869055610eb985610aae565b600d55610ec584610aae565b600e556010839055806ec097ce7bc90715b34b9f1000000000811515610ee757fe5b04601255816ec097ce7bc90715b34b9f1000000000811515610f0557fe5b04601381905560148390556015829055600b54600c54600954600d54600e54601054600a54600f546012547f52db0a06d138736a4425764a1f7e1b432b5ce79099d523c0c4cd01e7320aba0e998c8c6040519b8c5260208c019a909a526040808c019990995260608b019790975260808a019590955260a089019390935260c088019190915260e0870152610100860152610120850152610140840152610160830191909152610180909101905180910390a15050505050505050565b6000811515610fd357506000610fe7565b8282838502811515610fe157fe5b04141590505b92915050565b600080611003600b54600c548686600a54611324565b600f5490915081111561101557600080fd5b61101e8161107e565b905082670de0b6b3a7640000820281151561103557fe5b04949350505050565b600080600a54670de0b6b3a764000061105f600b54600c5487600a54610ae0565b0281151561106957fe5b0490506110758161107e565b91505b50919050565b600060c860020a82111561109157600080fd5b6010546127109081038302610ad9565b60095481565b60005433600160a060020a039081169116146110c257600080fd5b600160a060020a03811615156110d757600080fd5b6001547f3b81caf78fa51ecbc8acb482fd7012a277b428d9b80f9d156e8a54107496cc4090600160a060020a0316604051600160a060020a03909116815260200160405180910390a160018054600160a060020a031916600160a060020a0392909216919091179055565b60015433600160a060020a0390811691161461115d57600080fd5b6001546000547f65da1cfc2c2e81576ad96afb24a581f8e109b7a403b35cbd3243a1c99efdb9ed91600160a060020a039081169116604051600160a060020a039283168152911660208201526040908101905180910390a16001805460008054600160a060020a0319908116600160a060020a03841617909155169055565b60005433600160a060020a039081169116146111f757600080fd5b600160a060020a038116151561120c57600080fd5b7f3b81caf78fa51ecbc8acb482fd7012a277b428d9b80f9d156e8a54107496cc4081604051600160a060020a03909116815260200160405180910390a16000547f65da1cfc2c2e81576ad96afb24a581f8e109b7a403b35cbd3243a1c99efdb9ed908290600160a060020a0316604051600160a060020a039283168152911660208201526040908101905180910390a160008054600160a060020a031916600160a060020a0392909216919091179055565b6112c6611f34565b6005805480602002602001604051908101604052809291908181526020018280548015610bfa57602002820191906000526020600020908154600160a060020a03168152600190910190602001808311610bdc575050505050905090565b60008060008061133689898988610ae0565b925082890291506113478987610fc2565b1561135157600080fd5b611360868a0286870287611b50565b90508481101561136f57600080fd5b61137b85820386610fc2565b1561138557600080fd5b611393858683030286610fc2565b1561139d57600080fd5b6113ad8586878403020286610fc2565b156113b757600080fd5b6113c18282610fc2565b156113cb57600080fd5b6113d58984610fc2565b156113df57600080fd5b8082028586878885030202028115156113f457fe5b049998505050505050505050565b600080600283810a908102818381881080159061141f5750828811155b151561142a57600080fd5b607d871061143757600080fd5b50855b6000811115611474578388890281151561145057fe5b04975060028204915082881061146b57600288049750938101935b6000190161143a565b50929695505050505050565b6000808283028410156114975750839050826114bd565b6114b883868115156114a557fe5b0484868115156114b157fe5b0485611480565b915091505b935093915050565b6000808080806b204fce5e3e250261100000008711156114e457600080fd5b600f548611156114f357600080fd5b600754600160a060020a038a811691161461151157600094506115c2565b871561155e5761152087610aae565b9350600d5484111561153557600094506115c2565b83151561154c5761154586611dea565b9050611559565b6115568685610fed565b90505b6115b2565b611567876116a2565b92506115728361107e565b915081151561158f576115848661103e565b90506000935061159f565b61159a868484611657565b945090505b600e548411156115b257600094506115c2565b6115bc8189611946565b90508094505b50505050949350505050565b60007f800000000000000000000000000000000000000000000000000000000000000060ff5b6000811261164957838283860281151561160a57fe5b041461161b57600282049150611640565b60008285028681151561162a57fe5b0411156116395780925061164f565b6002820491505b600019016115f4565b60001992505b505092915050565b600080611670600b54600c548786600a546009546117b3565b600f5490915081111561168257600080fd5b83670de0b6b3a7640000820281151561169757fe5b049150935093915050565b60006b204fce5e3e250261100000008211156116bd57600080fd5b6007546116d290600160a060020a0316611e51565b600a0a600a548302811515610ad957fe5b60005433600160a060020a039081169116146116fe57600080fd5b600160a060020a03811660009081526002602052604090205460ff161561172457600080fd5b6004546032901061173457600080fd5b7f091a7a4b85135fdd7e8dbc18b12fabe5cc191ea867aa3c2e1a24a102af61d58b816001604051600160a060020a039092168252151560208201526040908101905180910390a1600160a060020a0381166000908152600260205260409020805460ff191660019081179091556004805490918101610dda8382611f0b565b6000806000806117c58a8a8a89610ae0565b9250828a0291506117d68288610fc2565b156117e057600080fd5b858602868884028115156117f057fe5b048788020111151561180157600080fd5b61181f8688840281151561181157fe5b048788020187880287610b43565b905061182b8a84610fc2565b1561183557600080fd5b61183f8687610fc2565b1561184957600080fd5b6118538288610fc2565b1561185d57600080fd5b6118678187610fc2565b1561187157600080fd5b8986820281151561187e57fe5b049a9950505050505050505050565b60105481565b600080600283900a8180868811156118b2576118af88886115ce565b93505b6118bc8884610fc2565b156118c657600080fd5b6118d08484610fc2565b156118da57600080fd5b6118e8600285900a88610fc2565b156118f257600080fd5b600284900a870288840281151561190557fe5b0491506119128287611402565b905060c860020a848402111561192757600080fd5b60c860020a81111561193857600080fd5b919092020195945050505050565b6000806000831561195e575050601354601254611967565b50506015546014545b8085118061197457508185105b15611982576000925061164f565b69d3c21bcecceda100000085111561199d576000925061164f565b84925061164f565b600854600160a060020a031681565b60006b204fce5e3e250261100000008211156119cf57600080fd5b601054612710036010548302811515610ad957fe5b6000805433600160a060020a03908116911614611a0057600080fd5b600160a060020a03821660009081526002602052604090205460ff161515611a2757600080fd5b50600160a060020a0381166000908152600260205260408120805460ff191690555b600454811015610a115781600160a060020a0316600482815481101515611a6c57fe5b600091825260209091200154600160a060020a03161415611b4857600480546000198101908110611a9957fe5b60009182526020909120015460048054600160a060020a039092169183908110611abf57fe5b60009182526020909120018054600160a060020a031916600160a060020a0392909216919091179055600480546000190190611afb9082611f0b565b507f091a7a4b85135fdd7e8dbc18b12fabe5cc191ea867aa3c2e1a24a102af61d58b826000604051600160a060020a039092168252151560208201526040908101905180910390a1610a11565b600101611a49565b6000806001808083805b611b648489610fc2565b15611b7157819650611c1a565b611b7b8386610fc2565b15611b8857819650611c1a565b848302888502811515611b9757fe5b048201915080821415611bac57819650611c1a565b5060019094019380611bbe848b610fc2565b15611bcb57819650611c1a565b611bd5838a610fc2565b15611be257819650611c1a565b611bec8587610fc2565b15611bf957819650611c1a565b938502939289029291880291611c1084848a611480565b9094509250611b5a565b5050505050509392505050565b6000805433600160a060020a03908116911614611c4357600080fd5b506011805460009091557fdeb4766cf1de6f18e3b195f199d403a02a3e09fbee1192b37d797fb300f052618160405190815260200160405180910390a150565b600080806b204fce5e3e25026110000000841115611ca057600080fd5b600854611cb690600160a060020a031631610aae565b9150611cc4878686856114c5565b905069d3c21bcecceda1000000811115611cdd57600080fd5b9695505050505050565b60085433600160a060020a03908116911614611d0257600080fd5b6000831315611d2a57611d1c611d1784610a91565b6119b4565b601180549091019055611d51565b612710601054611d3985610a91565b02811515611d4357fe5b601180549290910490910190555b50505050565b60005433600160a060020a03908116911614611d7257600080fd5b600160a060020a03811682156108fc0283604051600060405180830381858888f193505050501515611da357600080fd5b7fec47e7ed86c86774d1a72c19f35c639911393fe7c1a34031fdbd260890da90de8282604051918252600160a060020a031660208201526040908101905180910390a15050565b600080611dff600b54600c5485600a54610ae0565b670de0b6b3a7640000600a540281151561106957fe5b60125481565b60155481565b600c5481565b600f5481565b600054600160a060020a031681565b60135481565b600754600160a060020a031681565b600080600160a060020a03831673eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee1415611e825760129150611078565b50600160a060020a038216600090815260066020526040902054801515610fe75782600160a060020a031663313ce5676000604051602001526040518163ffffffff1660e060020a028152600401602060405180830381600087803b1515611ee957600080fd5b6102c65a03f11515611efa57600080fd5b505050604051805190509150611078565b815481835581811511611f2f57600083815260209020611f2f918101908301611f46565b505050565b60206040519081016040526000815290565b610c0291905b80821115611f605760008155600101611f4c565b5090565b600160a060020a03811673eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee1415611faa57600160a060020a038116600090815260066020526040902060129055612024565b80600160a060020a031663313ce5676000604051602001526040518163ffffffff1660e060020a028152600401602060405180830381600087803b1515611ff057600080fd5b6102c65a03f1151561200157600080fd5b5050506040518051600160a060020a038316600090815260066020526040902055505b505600a165627a7a72305820be2714ce3c4904cbfa320d3212f29add017908d131b0c1b476f9394e1191fbc90029

Deployed Bytecode Sourcemap

165:8613:2:-;;;;;;;;;-1:-1:-1;;;165:8613:2;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;2381:451:4;;;;;;;;;;-1:-1:-1;;;;;2381:451:4;;;;;;;738:34:2;;;;;;;;;;;;;;;;;;;;;;;;;;;1093:139;;;;;;;;;;-1:-1:-1;;;;;1093:139:2;;;;;8604:172;;;;;;;;;;;;;;8097:174;;;;;;;;;;;;;;3579:284:3;;;;;;;;;;;;;;;;;;;;85:27:4;;;;;;;;;;;;;;;-1:-1:-1;;;;;85:27:4;;;;;;;;;;;;;;3166:364:3;;;;;;;;;;;;;;;;;;528:29:2;;;;;;;;;;;;670:96:4;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;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;;;;;;;;;;;;;;;;;50:54:3;;;;;;;;;;;;560:186:6;;;;;;;;;;-1:-1:-1;;;;;560:186:6;;;;;;;;;;;;;618:35:2;;;;;;;;;;;;2074:301:4;;;;;;;;;;-1:-1:-1;;;;;2074:301:4;;;;;444:17:2;;;;;;;;;;;;494:28;;;;;;;;;;;;409;;;;;;;;;;;;1627:1670;;;;;;;;;;;;;;;;;;;;;;;;;;;;111:145:3;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;6652:322:2;;;;;;;;;;;;;;;;7639:262;;;;;;;;;;;;;;8277:161;;;;;;;;;;;;;;382:21;;;;;;;;;;;;1074:183:4;;;;;;;;;;-1:-1:-1;;;;;1074:183:4;;;;;1821:189;;;;;;;;;;;;1432:218;;;;;;;;;;-1:-1:-1;;;;;1432:218:4;;;;;772:94;;;;;;;;;;;;3869:776:3;;;;;;;;;;;;;;;;;;;;;;1955:555;;;;;;;;;;;;;;;;262:220;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;4591:1315:2;;;;;;;;;;-1:-1:-1;;;;;4591:1315:2;;;;;;;;;;;;;1465:442:3;;;;;;;;;;;;;;;;7247:386:2;;;;;;;;;;;;;;;;;;7907:184;;;;;;;;;;;;;;2897:312:4;;;;;;;;;;-1:-1:-1;;;;;2897:312:4;;;;;4651:724:3;;;;;;;;;;;;;;;;;;;;;;;;592:20:2;;;;;;;;;;;;2516:644:3;;;;;;;;;;;;;;;;;;5912:734:2;;;;;;;;;;;;;;;;;;345:30;;;;;;;;;;;;8444:154;;;;;;;;;;;;;;3215:469:4;;;;;;;;;;-1:-1:-1;;;;;3215:469:4;;;;;530:888:3;;;;;;;;;;;;;;;;;;3919:185:2;;;;;;;;;;;;4110:475;;;;;;;;;;-1:-1:-1;;;;;4110:475:2;;;;;;;;;;;;;3303:557;;;;;;;;;;-1:-1:-1;;;;;3303:557:2;;;;;;;;;;;851:150:6;;;;;;;;;;;;-1:-1:-1;;;;;851:150:6;;;;;6980:261:2;;;;;;;;;;;;;;660:33;;;;;;;;;;;;778:34;;;;;;;;;;;;467:20;;;;;;;;;;;;563:22;;;;;;;;;;;;59:20:4;;;;;;;;;;;;699:33:2;;;;;;;;;;;;321:18;;;;;;;;;;;;2381:451:4;2526:6;466:5;;452:10;-1:-1:-1;;;;;452:19:4;;;466:5;;452:19;444:28;;;;;;-1:-1:-1;;;;;2457:17:4;;;;;;:8;:17;;;;;;;;2449:26;;;;;;;;-1:-1:-1;;;;;;2485:17:4;;2505:5;2485:17;;;:8;:17;;;;;:25;;-1:-1:-1;;2485:25:4;;;2521:305;2542:13;:20;2538:24;;2521:305;;;2607:7;-1:-1:-1;;;;;2587:27:4;:13;2601:1;2587:16;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;2587:16:4;:27;2583:233;;;2653:13;2667:20;;-1:-1:-1;;2667:24:4;;;2653:39;;;;;;;;;;;;;;;;2634:13;:16;;-1:-1:-1;;;;;2653:39:4;;;;2648:1;;2634:16;;;;;;;;;;;;;;;:58;;-1:-1:-1;;;;;;2634:58:4;-1:-1:-1;;;;;2634:58:4;;;;;;;;;;2710:13;:22;;;;;-1:-1:-1;;2710:22:4;;;:::i;:::-;;2750:28;2763:7;2772:5;2750:28;;-1:-1:-1;;;;;2750:28:4;;;;;;;;;;;;;;;;;;;;;;2796:5;;2583:233;2564:3;;2521:305;;;2381:451;;:::o;738:34:2:-;;;;:::o;1093:139::-;466:5:4;;452:10;-1:-1:-1;;;;;452:19:4;;;466:5;;452:19;444:28;;;;;;1164:15:2;:25;;-1:-1:-1;;;;;;1164:25:2;-1:-1:-1;;;;;1164:25:2;;;;;1199:26;1164:25;1199:26;;-1:-1:-1;;;;;1199:26:2;;;;;;;;;;;;;;1093:139;:::o;8604:172::-;8646:4;8672:1;8666:3;:7;8662:108;;;-1:-1:-1;;;8701:10:2;;8689:23;;8662:108;-1:-1:-1;8755:3:2;8662:108;8604:172;;;:::o;8097:174::-;8153:4;305:6:5;8177:19:2;;;8169:28;;;;;;8245:2;8225:16;8245:18;;8214:27;;:50;;;8097:174;-1:-1:-1;;8097:174:2:o;3579:284:3:-;3655:4;3714:10;3680:23;3698:1;3701;3680:17;:23::i;:::-;3679:24;3671:33;;;;;;3727:40;3733:1;3731;:3;3746:9;3736;:19;3757:9;3727:3;:40::i;:::-;3714:53;;3786:30;3804:5;3811:4;3786:17;:30::i;:::-;3785:31;3777:40;;;;;;3847:9;3839:5;3834:4;:10;:22;;;;;;;;;3579:284;-1:-1:-1;;;;;;3579:284:3:o;85:27:4:-;;;-1:-1:-1;;;;;85:27:4;;:::o;3166:364:3:-;3238:4;3276:22;3330:23;3238:4;3377:32;3386:1;3389;3392:16;3377:8;:32::i;:::-;3364:45;;3429:38;3447:12;3461:5;3429:17;:38::i;:::-;3428:39;3420:48;;;;;;3509:14;3501:5;3486:12;:20;:37;;;;;;;;;3166:364;-1:-1:-1;;;;;;;3166:364:3:o;528:29:2:-;;;;:::o;670:96:4:-;717:9;;:::i;:::-;745:14;738:21;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;738:21:4;;;;;;;;;;;;;;;;;;;;;;;670:96;;:::o;50:54:3:-;-1:-1:-1;;;50:54:3;:::o;560:186:6:-;466:5:4;;452:10;-1:-1:-1;;;;;452:19:4;;;466:5;;452:19;444:28;;;;;;662:5:6;-1:-1:-1;;;;;662:14:6;;677:6;685;662:30;;;;;;;;-1:-1:-1;;;662:30:6;;;;;;-1:-1:-1;;;;;662:30:6;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;654:39;;;;;;;;703:36;717:5;724:6;732;703:36;;-1:-1:-1;;;;;703:36:6;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;560:186;;;:::o;618:35:2:-;;;;:::o;2074:301:4:-;466:5;;452:10;-1:-1:-1;;;;;452:19:4;;;466:5;;452:19;444:28;;;;;;-1:-1:-1;;;;;2150:20:4;;;;;;:8;:20;;;;;;;;2149:21;2141:30;;;;;;2212:13;:20;328:2;2212:37;;2204:46;;;;;;2261:30;2274:10;2286:4;2261:30;;-1:-1:-1;;;;;2261:30:4;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;2301:20:4;;;;;;:8;:20;;;;;:27;;-1:-1:-1;;2301:27:4;2324:4;2301:27;;;;;;2338:13;:30;;:13;;:30;;;:13;:30;;:::i;:::-;-1:-1:-1;2338:30:4;;;;;;;;;;;-1:-1:-1;;;;;;2338:30:4;-1:-1:-1;;;;;2338:30:4;;;;;;;;;;2074:301::o;444:17:2:-;;;;:::o;494:28::-;;;;:::o;409:::-;;;;:::o;1627:1670::-;466:5:4;;452:10;-1:-1:-1;;;;;452:19:4;;;466:5;;452:19;444:28;;;;;;312:2:2;1939:36;;1931:45;;;;;;2042:19;;;;2023:16;:38;2131:5;2119:17;;2111:26;;;;;;2155:61;;;2147:70;;;;;;2267:1;2235:33;;2227:42;;;;;;2296:1;2287:10;;2279:19;;;;;;2328:1;2316:13;;2308:22;;;;;;2341:5;:14;;;2365:8;:20;;;2408;305:6:5;2408:11:2;:20::i;:::-;2395:10;:33;2438:9;:22;;;2489:28;2501:15;2489:11;:28::i;:::-;2470:16;:47;2547:29;2559:16;2547:11;:29::i;:::-;2527:17;:49;2586:8;:20;;;2664:29;2640:21;:53;;;;;;;;2616:21;:77;2751:29;2727:21;:53;;;;;;;;2703:21;:77;;;2790:22;:54;;;2854:22;:54;;;2951:5;;2970:8;;2992:9;;3015:16;;3045:17;;3076:8;;3098:16;;3128:10;;3152:21;;2919:371;;2815:29;2879;2919:371;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;1627:1670;;;;;;;;:::o;111:145:3:-;174:4;194:6;;190:24;;;-1:-1:-1;209:5:3;202:12;;190:24;247:1;241;236;234;:3;233:9;;;;;;;;232:16;;224:25;;111:145;;;;;:::o;6652:322:2:-;6718:4;6734:15;6752:64;6763:5;;6770:8;;6780:5;6787:10;6799:16;;6752:10;:64::i;:::-;6848:10;;6734:82;;-1:-1:-1;6834:24:2;;;6826:33;;;;;;6882;6904:10;6882:21;:33::i;:::-;6869:46;;6957:10;255:6:5;6932:10:2;:22;:35;;;;;;;;;6652:322;-1:-1:-1;;;;6652:322:2:o;7639:262::-;7701:4;7717:32;7811:16;;255:6:5;7752:44:2;7755:5;;7762:8;;7772:5;7779:16;;7752:2;:44::i;:::-;:56;:75;;;;;;;;7717:110;;7844:50;7866:27;7844:21;:50::i;:::-;7837:57;;7639:262;;;;;:::o;8277:161::-;8338:4;-1:-1:-1;;;8362:17:2;;;8354:26;;;;;;8407:8;;8426:5;;8399:16;;8398:24;;8397:34;;382:21;;;;:::o;1074:183:4:-;466:5;;452:10;-1:-1:-1;;;;;452:19:4;;;466:5;;452:19;444:28;;;;;;-1:-1:-1;;;;;1150:22:4;;;;1142:31;;;;;;1204:12;;1183:34;;-1:-1:-1;;;;;1204:12:4;1183:34;;-1:-1:-1;;;;;1183:34:4;;;;;;;;;;;;;;1227:12;:23;;-1:-1:-1;;;;;;1227:23:4;-1:-1:-1;;;;;1227:23:4;;;;;;;;;;1074:183::o;1821:189::-;1868:12;;1884:10;-1:-1:-1;;;;;1868:26:4;;;:12;;:26;1860:35;;;;;;1918:12;;;1932:5;1905:33;;-1:-1:-1;;;;;1918:12:4;;;;1932:5;1905:33;;-1:-1:-1;;;;;1905:33:4;;;;;;;;;;;;;;;;;;;;;;1956:12;;;;1948:20;;-1:-1:-1;;;;;;1948:20:4;;;-1:-1:-1;;;;;1956:12:4;;1948:20;;;;1978:25;;;1821:189::o;1432:218::-;466:5;;452:10;-1:-1:-1;;;;;452:19:4;;;466:5;;452:19;444:28;;;;;;-1:-1:-1;;;;;1515:22:4;;;;1507:31;;;;;;1548:30;1569:8;1548:30;;-1:-1:-1;;;;;1548:30:4;;;;;;;;;;;;;;1611:5;;1588:29;;1601:8;;-1:-1:-1;;;;;1611:5:4;1588:29;;-1:-1:-1;;;;;1588:29:4;;;;;;;;;;;;;;;;;;;;;;1627:5;:16;;-1:-1:-1;;;;;;1627:16:4;-1:-1:-1;;;;;1627:16:4;;;;;;;;;;1432:218::o;772:94::-;818:9;;:::i;:::-;846:13;839:20;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;839:20:4;;;;;;;;;;;;;;;;;;;;;;772:94;:::o;3869:776:3:-;3966:4;3982:7;4027:8;4103:13;3992:25;3995:1;3998:4;4004:1;4007:9;3992:2;:25::i;:::-;3982:35;;4042:2;4038:1;:6;4027:17;;4064:28;4082:1;4085:6;4064:17;:28::i;:::-;4063:29;4055:38;;;;;;4119:45;4125:6;4123:1;:8;4143:9;4133;:19;4154:9;4119:3;:45::i;:::-;4103:61;-1:-1:-1;4183:21:3;;;;4175:30;;;;;;4224:50;4253:9;4242:8;:20;4264:9;4224:17;:50::i;:::-;4223:51;4215:60;;;;;;4294:62;4335:9;4324;4313:8;:20;4312:32;4346:9;4294:17;:62::i;:::-;4293:63;4285:72;;;;;;4376;4427:9;4417;4406;4395:8;:20;4394:32;:42;4438:9;4376:17;:72::i;:::-;4375:73;4367:82;;;;;;4468:32;4486:3;4491:8;4468:17;:32::i;:::-;4467:33;4459:42;;;;;;4520:24;4538:1;4541:2;4520:17;:24::i;:::-;4519:25;4511:34;;;;;;4629:8;4625:3;:12;4612:9;4600;4588;4575;4564:8;:20;4563:34;:46;:58;:75;;;;;;;;;3869:776;-1:-1:-1;;;;;;;;;3869:776:3:o;1955:555::-;2035:4;;2085:25;;;;;2132:7;;2085:25;2035:4;2188:8;;;;;;2187:24;;;2207:3;2202:1;:8;;2187:24;2179:33;;;;;;;;2249:3;2230:22;;2222:31;;;;;;-1:-1:-1;2278:16:3;2264:219;2300:1;2296;:5;2264:219;;;2334:3;2329:1;2327;:3;2326:11;;;;;;;;;-1:-1:-1;2371:1:3;2362:8;:10;;-1:-1:-1;2390:8:3;;;2386:87;;2424:1;2422;:3;;-1:-1:-1;2443:15:3;;;;2386:87;-1:-1:-1;;2303:3:3;2264:219;;;-1:-1:-1;2500:3:3;;1955:555;-1:-1:-1;;;;;;1955:555:3:o;262:220::-;340:4;346;382:9;370;:21;366:1;:25;362:44;;;-1:-1:-1;401:1:3;;-1:-1:-1;404:1:3;393:13;;362:44;423:52;441:9;439:1;:11;;;;;;;;454:9;452:1;:11;;;;;;;;465:9;423:15;:52::i;:::-;416:59;;;;262:220;;;;;;;:::o;4591:1315:2:-;4696:4;;;;;305:6:5;4837:22:2;;;4829:31;;;;;;4887:10;;4878:19;;;4870:28;;;;;;4931:5;;-1:-1:-1;;;;;4912:24:2;;;4931:5;;4912:24;4908:38;;4945:1;4938:8;;;;4908:38;4961:3;4957:841;;;5036:24;5048:11;5036;:24::i;:::-;5023:37;;5091:16;;5078:10;:29;5074:43;;;5116:1;5109:8;;;;5074:43;5136:15;;5132:181;;;5189:26;5209:5;5189:19;:26::i;:::-;5171:44;;5132:181;;;5272:26;5280:5;5287:10;5272:7;:26::i;:::-;5254:44;;5132:181;4957:841;;;5367:25;5380:11;5367:12;:25::i;:::-;5343:49;;5419:44;5441:21;5419;:44::i;:::-;5406:57;-1:-1:-1;5481:15:2;;5477:252;;;5534:27;5555:5;5534:20;:27::i;:::-;5516:45;;5592:1;5579:14;;5477:252;;;5664:50;5673:5;5680:21;5703:10;5664:8;:50::i;:::-;5632:82;-1:-1:-1;5632:82:2;-1:-1:-1;5477:252:2;5760:17;;5747:10;:30;5743:44;;;5786:1;5779:8;;;;5743:44;5826:41;5846:15;5863:3;5826:19;:41::i;:::-;5808:59;;5884:15;5877:22;;4591:1315;;;;;;;;;;;:::o;1465:442:3:-;1529:4;1563:12;1572:3;1586:289;1609:1;1604:6;;1586:289;;1662:1;1649:9;1638;1636:1;:11;1635:23;;;;;;;;:28;1631:144;;1733:1;1723:9;:11;1711:23;;1752:8;;1631:144;1810:1;1797:9;1795:1;:11;1792:1;:15;;;;;;;;:19;1788:39;;;1825:1;1813:14;;;;1788:39;1863:1;1853:9;:11;1841:23;;1586:289;-1:-1:-1;;1612:3:3;1586:289;;;-1:-1:-1;;1885:15:3;;1465:442;;;;;;;:::o;7247:386:2:-;7372:20;7394:15;7434:75;7445:5;;7452:8;;7462:5;7469:10;7481:16;;7499:9;;7434:10;:75::i;:::-;7541:10;;7421:88;;-1:-1:-1;7527:24:2;;;7519:33;;;;;;7605:21;255:6:5;7580:10:2;:22;:46;;;;;;;;7562:64;;7247:386;;;;;;:::o;7907:184::-;7965:4;305:6:5;7989:20:2;;;7981:29;;;;;;8077:5;;8065:18;;-1:-1:-1;;;;;8077:5:2;8065:11;:18::i;:::-;8059:2;:24;8039:16;;8027:9;:28;:57;;;;;;2897:312:4;466:5;;452:10;-1:-1:-1;;;;;452:19:4;;;466:5;;452:19;444:28;;;;;;-1:-1:-1;;;;;2975:22:4;;;;;;:9;:22;;;;;;;;2974:23;2966:32;;;;;;3039:14;:21;328:2;3039:38;;3031:47;;;;;;3089:32;3103:11;3116:4;3089:32;;-1:-1:-1;;;;;3089:32:4;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;3131:22:4;;;;;;:9;:22;;;;;:29;;-1:-1:-1;;3131:29:4;3156:4;3131:29;;;;;;3170:14;:32;;:14;;:32;;;:14;:32;;:::i;4651:724:3:-;4787:4;4807:7;4852:8;5019:11;4817:25;4820:1;4823:4;4829:1;4832:9;4817:2;:25::i;:::-;4807:35;;4867:2;4863:1;:6;4852:17;;4889:30;4907:3;4912:6;4889:17;:30::i;:::-;4888:31;4880:40;;;;;;4999:9;4987;:21;4975:9;4968:6;4962:3;:12;:22;;;;;;;;4950:9;4938;:21;:46;:70;4930:79;;;;;;;;5033:85;5069:9;5062:6;5058:3;:10;:20;;;;;;;;5046:9;5036;:19;:42;5090:9;5080;:19;5101:16;5033:2;:85::i;:::-;5019:99;;5138:24;5156:1;5159:2;5138:17;:24::i;:::-;5137:25;5129:34;;;;;;5182:39;5200:9;5211;5182:17;:39::i;:::-;5181:40;5173:49;;;;;;5241:30;5259:3;5264:6;5241:17;:30::i;:::-;5240:31;5232:40;;;;;;5291:36;5309:6;5317:9;5291:17;:36::i;:::-;5290:37;5282:46;;;;;;5367:1;5355:9;5346:6;:18;:22;;;;;;;;;4651:724;-1:-1:-1;;;;;;;;;;4651:724:3:o;592:20:2:-;;;;:::o;2516:644:3:-;2595:4;;2649:25;;;;2595:4;;2690:5;;;2686:63;;;2715:23;2733:1;2736;2715:17;:23::i;:::-;2711:27;;2686:63;2768:31;2786:1;2789:9;2768:17;:31::i;:::-;2767:32;2759:41;;;;;;2819:31;2837:1;2840:9;2819:17;:31::i;:::-;2818:32;2810:41;;;;;;2870:32;2888:10;;;;2900:1;2870:17;:32::i;:::-;2869:33;2861:42;;;;;;2945:10;;;;2940:16;;2923:13;;;:34;;;;;;;;2914:43;;2984:39;3003:1;3006:16;2984:18;:39::i;:::-;2967:56;-1:-1:-1;;;;3042:11:3;;;:25;;3034:34;;;;;;-1:-1:-1;;;3086:23:3;;;3078:32;;;;;;3128:13;;;;:25;;;-1:-1:-1;;;;;2516:644:3:o;5912:734:2:-;5993:4;6009:28;6047:30;6092:3;6088:287;;;-1:-1:-1;;6137:21:2;;6200;;6088:287;;;-1:-1:-1;;6278:22:2;;6342;;6088:287;6408:25;6390:15;:43;6389:92;;;;6457:23;6439:15;:41;6389:92;6385:255;;;6504:1;6497:8;;;;6385:255;369:17:5;6526:26:2;;6522:118;;;6575:1;6568:8;;;;6522:118;6614:15;6607:22;;;;345:30;;;-1:-1:-1;;;;;345:30:2;;:::o;8444:154::-;8500:4;305:6:5;8524:14:2;;;8516:23;;;;;;8582:8;;8574:5;:16;8562:8;;8556:3;:14;:35;;;;;;3215:469:4;3366:6;466:5;;452:10;-1:-1:-1;;;;;452:19:4;;;466:5;;452:19;444:28;;;;;;-1:-1:-1;;;;;3293:19:4;;;;;;:9;:19;;;;;;;;3285:28;;;;;;;;-1:-1:-1;;;;;;3323:19:4;;3345:5;3323:19;;;:9;:19;;;;;:27;;-1:-1:-1;;3323:27:4;;;3361:317;3382:14;:21;3378:25;;3361:317;;;3449:8;-1:-1:-1;;;;;3428:29:4;:14;3443:1;3428:17;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;3428:17:4;:29;3424:244;;;3497:14;3512:21;;-1:-1:-1;;3512:25:4;;;3497:41;;;;;;;;;;;;;;;;3477:14;:17;;-1:-1:-1;;;;;3497:41:4;;;;3492:1;;3477:17;;;;;;;;;;;;;;;:61;;-1:-1:-1;;;;;;3477:61:4;-1:-1:-1;;;;;3477:61:4;;;;;;;;;;3556:14;:26;;-1:-1:-1;;3556:26:4;;;;;;:::i;:::-;;3600:30;3614:8;3624:5;3600:30;;-1:-1:-1;;;;;3600:30:4;;;;;;;;;;;;;;;;;;;;;;3648:5;;3424:244;3405:3;;3361:317;;530:888:3;596:4;;645:1;;;596:4;;760:652;791:38;809:8;819:9;791:17;:38::i;:::-;787:54;;;838:3;831:10;;;;787:54;859:34;877:8;887:5;859:17;:34::i;:::-;855:50;;;902:3;895:10;;;;855:50;964:5;953:8;:16;939:9;928:8;:20;927:43;;;;;;;;920:50;;;;996:7;989:3;:14;985:30;;;1012:3;1005:10;;;;985:30;-1:-1:-1;1057:3:3;;;;;1039;1079:30;1097:8;1107:1;1079:17;:30::i;:::-;1075:46;;;1118:3;1111:10;;;;1075:46;1139:30;1157:8;1167:1;1139:17;:30::i;:::-;1135:46;;;1178:3;1171:10;;;;1135:46;1199:27;1217:5;1224:1;1199:17;:27::i;:::-;1195:43;;;1235:3;1228:10;;;;1195:43;1307:10;;;;1253:13;;;;1280;;;;1355:46;1253:13;1280;1391:9;1355:15;:46::i;:::-;1332:69;;-1:-1:-1;1332:69:3;-1:-1:-1;760:652:3;;;530:888;;;;;;;;;;;:::o;3919:185:2:-;3976:20;466:5:4;;452:10;-1:-1:-1;;;;;452:19:4;;;466:5;;452:19;444:28;;;;;;-1:-1:-1;3999:19:2;;;4050:1;4028:23;;;4062:35;3999:19;4062:35;;;;;;;;;;;;;;3919:185;:::o;4110:475::-;4277:4;;;305:6:5;4331:22:2;;;4323:31;;;;;;4389:15;;4377:36;;-1:-1:-1;;;;;4389:15:2;:23;4377:11;:36::i;:::-;4364:49;;4446:54;4459:15;4476:3;4481:11;4494:5;4446:12;:54::i;:::-;4423:77;-1:-1:-1;369:17:5;4518:27:2;;;4510:36;;;;;;4563:15;4110:475;-1:-1:-1;;;;;;4110:475:2:o;3303:557::-;3575:15;;3561:10;-1:-1:-1;;;;;3561:29:2;;;3575:15;;3561:29;3553:38;;;;;;3623:1;3605:15;:19;3601:253;;;3687:38;3704:20;3708:15;3704:3;:20::i;:::-;3687:16;:38::i;:::-;3664:19;:61;;;;;;;3601:253;;;3838:5;3827:8;;3804:20;3808:15;3804:3;:20::i;:::-;:31;:39;;;;;;;3781:19;:62;;3804:39;;;;3781:62;;;;;3601:253;3303:557;;;;:::o;851:150:6:-;466:5:4;;452:10;-1:-1:-1;;;;;452:19:4;;;466:5;;452:19;444:28;;;;;;-1:-1:-1;;;;;932:15:6;;:23;;;;948:6;932:23;;;;;;;;;;;;;;;;;;;;;;;;;;965:29;979:6;987;965:29;;;;;-1:-1:-1;;;;;965:29:6;;;;;;;;;;;;;;;;851:150;;:::o;6980:261:2:-;7041:4;7057:32;7123:44;7126:5;;7133:8;;7143:5;7150:16;;7123:2;:44::i;:::-;255:6:5;7092:16:2;;:28;:75;;;;;;660:33;;;;:::o;778:34::-;;;;:::o;467:20::-;;;;:::o;563:22::-;;;;:::o;59:20:4:-;;;-1:-1:-1;;;;;59:20:4;;:::o;699:33:2:-;;;;:::o;321:18::-;;;-1:-1:-1;;;;;321:18:2;;:::o;738:470:5:-;794:4;;-1:-1:-1;;;;;814:26:5;;167:44;814:26;810:51;;;506:2;842:19;;;;810:51;-1:-1:-1;;;;;;915:15:5;;;;;;:8;:15;;;;;;1127:18;;1124:46;;;1154:5;-1:-1:-1;;;;;1154:14:5;;:16;;;;;;;;;;;-1:-1:-1;;;1154:16:5;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;1147:23;;;;165:8613:2;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;:::o;:::-;;;;;;;;;;;;;:::o;:::-;;;;;;;;;;;;;;;;;;;;;;561:171:5;-1:-1:-1;;;;;618:26:5;;167:44;618:26;614:111;;;-1:-1:-1;;;;;646:15:5;;;;;;:8;:15;;;;;506:2;646:30;;614:111;;;709:5;-1:-1:-1;;;;;709:14:5;;:16;;;;;;;;;;;-1:-1:-1;;;709:16:5;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;691:15:5;;;;;;:8;:15;;;;;:34;-1:-1:-1;614:111:5;561:171;:::o

Swarm Source

bzzr://be2714ce3c4904cbfa320d3212f29add017908d131b0c1b476f9394e1191fbc9

Block Transaction Difficulty Gas Used Reward
View All Blocks Produced

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

Validator Index Block Amount
View All Withdrawals

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

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