ETH Price: $3,070.46 (+2.42%)
Gas: 4 Gwei

Contract

0x4250A6D3BD57455d7C6821eECb6206F507576cD2
 

Overview

ETH Balance

0 ETH

Eth Value

$0.00

Multichain Info

No addresses found
Transaction Hash
Method
Block
From
To
Value
Set Prices116907492021-01-20 6:50:141266 days ago1611125414IN
0x4250A6D3...507576cD2
0 ETH0.0022352442
Set Prices116905682021-01-20 6:11:241266 days ago1611123084IN
0x4250A6D3...507576cD2
0 ETH0.0021298640.02
Set Prices116905272021-01-20 6:03:271266 days ago1611122607IN
0x4250A6D3...507576cD2
0 ETH0.0028093852.8
Set Prices116904262021-01-20 5:42:361266 days ago1611121356IN
0x4250A6D3...507576cD2
0 ETH0.0027674452
Set Prices116903262021-01-20 5:16:501266 days ago1611119810IN
0x4250A6D3...507576cD2
0 ETH0.0019146236
Set Prices116902872021-01-20 5:10:061266 days ago1611119406IN
0x4250A6D3...507576cD2
0 ETH0.0021805441
Set Prices116901792021-01-20 4:47:231266 days ago1611118043IN
0x4250A6D3...507576cD2
0 ETH0.0023395644.00000145
Set Prices116901072021-01-20 4:30:331266 days ago1611117033IN
0x4250A6D3...507576cD2
0 ETH0.0018892244.00000145
Set Prices116900642021-01-20 4:22:081266 days ago1611116528IN
0x4250A6D3...507576cD2
0 ETH0.0033003862
Set Prices116900402021-01-20 4:17:421266 days ago1611116262IN
0x4250A6D3...507576cD2
0 ETH0.0087878286
Set Prices116900022021-01-20 4:09:121266 days ago1611115752IN
0x4250A6D3...507576cD2
0 ETH0.0035649367
Set Prices116899842021-01-20 4:04:571266 days ago1611115497IN
0x4250A6D3...507576cD2
0 ETH0.0067094781.00000145
Set Prices116899552021-01-20 3:56:241266 days ago1611114984IN
0x4250A6D3...507576cD2
0 ETH0.0022342342
Set Prices116899092021-01-20 3:48:151266 days ago1611114495IN
0x4250A6D3...507576cD2
0 ETH0.0052970273
Set Prices116898922021-01-20 3:44:391266 days ago1611114279IN
0x4250A6D3...507576cD2
0 ETH0.0028783867
Set Prices116898172021-01-20 3:27:011266 days ago1611113221IN
0x4250A6D3...507576cD2
0 ETH0.0021897851
Set Prices116898012021-01-20 3:23:571266 days ago1611113037IN
0x4250A6D3...507576cD2
0 ETH0.0045652562.9047619
Set Prices116897652021-01-20 3:14:321266 days ago1611112472IN
0x4250A6D3...507576cD2
0 ETH0.0043895153
Set Prices116897452021-01-20 3:10:441266 days ago1611112244IN
0x4250A6D3...507576cD2
0 ETH0.0050031160.4
Set Prices116897322021-01-20 3:06:581266 days ago1611112018IN
0x4250A6D3...507576cD2
0 ETH0.002587548.61904761
Set Prices116896862021-01-20 2:57:381266 days ago1611111458IN
0x4250A6D3...507576cD2
0 ETH0.0036688669
Set Prices116895192021-01-20 2:15:201266 days ago1611108920IN
0x4250A6D3...507576cD2
0 ETH0.0051831662.61
Set Prices116895052021-01-20 2:11:261266 days ago1611108686IN
0x4250A6D3...507576cD2
0 ETH0.0032996462
Set Prices116894882021-01-20 2:06:491266 days ago1611108409IN
0x4250A6D3...507576cD2
0 ETH0.0050808565.56960219
Set Prices116893722021-01-20 1:42:211266 days ago1611106941IN
0x4250A6D3...507576cD2
0 ETH0.004602645.00000145
View all transactions

View more zero value Internal Transactions in Advanced View mode

Advanced mode:
Loading...
Loading

Contract Source Code Verified (Exact Match)

Contract Name:
PriceOracle

Compiler Version
v0.4.26+commit.4563c3fc

Optimization Enabled:
Yes with 200 runs

Other Settings:
default evmVersion, None license

Contract Source Code (Solidity)

/**
 *Submitted for verification at Etherscan.io on 2020-08-02
*/

/**
 *Submitted for verification at Etherscan.io on 2020-07-29
*/

pragma solidity ^0.4.24;
contract ErrorReporter {

    /**
      * @dev `error` corresponds to enum Error; `info` corresponds to enum FailureInfo, and `detail` is an arbitrary
      * contract-specific code that enables us to report opaque error codes from upgradeable contracts.
      **/
    event Failure(uint error, uint info, uint detail);

    enum Error {
        NO_ERROR,
        OPAQUE_ERROR, // To be used when reporting errors from upgradeable contracts; the opaque code should be given as `detail` in the `Failure` event
        UNAUTHORIZED,
        INTEGER_OVERFLOW,
        INTEGER_UNDERFLOW,
        DIVISION_BY_ZERO,
        BAD_INPUT,
        TOKEN_INSUFFICIENT_ALLOWANCE,
        TOKEN_INSUFFICIENT_BALANCE,
        TOKEN_TRANSFER_FAILED,
        MARKET_NOT_SUPPORTED,
        SUPPLY_RATE_CALCULATION_FAILED,
        BORROW_RATE_CALCULATION_FAILED,
        TOKEN_INSUFFICIENT_CASH,
        TOKEN_TRANSFER_OUT_FAILED,
        INSUFFICIENT_LIQUIDITY,
        INSUFFICIENT_BALANCE,
        INVALID_COLLATERAL_RATIO,
        MISSING_ASSET_PRICE,
        EQUITY_INSUFFICIENT_BALANCE,
        INVALID_CLOSE_AMOUNT_REQUESTED,
        ASSET_NOT_PRICED,
        INVALID_LIQUIDATION_DISCOUNT,
        INVALID_COMBINED_RISK_PARAMETERS
    }

    /*
     * Note: FailureInfo (but not Error) is kept in alphabetical order
     *       This is because FailureInfo grows significantly faster, and
     *       the order of Error has some meaning, while the order of FailureInfo
     *       is entirely arbitrary.
     */
    enum FailureInfo {
        BORROW_ACCOUNT_LIQUIDITY_CALCULATION_FAILED,
        BORROW_ACCOUNT_SHORTFALL_PRESENT,
        BORROW_ACCUMULATED_BALANCE_CALCULATION_FAILED,
        BORROW_AMOUNT_LIQUIDITY_SHORTFALL,
        BORROW_AMOUNT_VALUE_CALCULATION_FAILED,
        BORROW_MARKET_NOT_SUPPORTED,
        BORROW_NEW_BORROW_INDEX_CALCULATION_FAILED,
        BORROW_NEW_BORROW_RATE_CALCULATION_FAILED,
        BORROW_NEW_SUPPLY_INDEX_CALCULATION_FAILED,
        BORROW_NEW_SUPPLY_RATE_CALCULATION_FAILED,
        BORROW_NEW_TOTAL_BALANCE_CALCULATION_FAILED,
        BORROW_NEW_TOTAL_BORROW_CALCULATION_FAILED,
        BORROW_NEW_TOTAL_CASH_CALCULATION_FAILED,
        BORROW_ORIGINATION_FEE_CALCULATION_FAILED,
        BORROW_TRANSFER_OUT_FAILED,
        EQUITY_WITHDRAWAL_AMOUNT_VALIDATION,
        EQUITY_WITHDRAWAL_CALCULATE_EQUITY,
        EQUITY_WITHDRAWAL_MODEL_OWNER_CHECK,
        EQUITY_WITHDRAWAL_TRANSFER_OUT_FAILED,
        LIQUIDATE_ACCUMULATED_BORROW_BALANCE_CALCULATION_FAILED,
        LIQUIDATE_ACCUMULATED_SUPPLY_BALANCE_CALCULATION_FAILED_BORROWER_COLLATERAL_ASSET,
        LIQUIDATE_ACCUMULATED_SUPPLY_BALANCE_CALCULATION_FAILED_LIQUIDATOR_COLLATERAL_ASSET,
        LIQUIDATE_AMOUNT_SEIZE_CALCULATION_FAILED,
        LIQUIDATE_BORROW_DENOMINATED_COLLATERAL_CALCULATION_FAILED,
        LIQUIDATE_CLOSE_AMOUNT_TOO_HIGH,
        LIQUIDATE_DISCOUNTED_REPAY_TO_EVEN_AMOUNT_CALCULATION_FAILED,
        LIQUIDATE_NEW_BORROW_INDEX_CALCULATION_FAILED_BORROWED_ASSET,
        LIQUIDATE_NEW_BORROW_INDEX_CALCULATION_FAILED_COLLATERAL_ASSET,
        LIQUIDATE_NEW_BORROW_RATE_CALCULATION_FAILED_BORROWED_ASSET,
        LIQUIDATE_NEW_SUPPLY_INDEX_CALCULATION_FAILED_BORROWED_ASSET,
        LIQUIDATE_NEW_SUPPLY_INDEX_CALCULATION_FAILED_COLLATERAL_ASSET,
        LIQUIDATE_NEW_SUPPLY_RATE_CALCULATION_FAILED_BORROWED_ASSET,
        LIQUIDATE_NEW_TOTAL_BORROW_CALCULATION_FAILED_BORROWED_ASSET,
        LIQUIDATE_NEW_TOTAL_CASH_CALCULATION_FAILED_BORROWED_ASSET,
        LIQUIDATE_NEW_TOTAL_SUPPLY_BALANCE_CALCULATION_FAILED_BORROWER_COLLATERAL_ASSET,
        LIQUIDATE_NEW_TOTAL_SUPPLY_BALANCE_CALCULATION_FAILED_LIQUIDATOR_COLLATERAL_ASSET,
        LIQUIDATE_TRANSFER_IN_FAILED,
        LIQUIDATE_TRANSFER_IN_NOT_POSSIBLE,
        REPAY_BORROW_ACCUMULATED_BALANCE_CALCULATION_FAILED,
        REPAY_BORROW_NEW_BORROW_INDEX_CALCULATION_FAILED,
        REPAY_BORROW_NEW_BORROW_RATE_CALCULATION_FAILED,
        REPAY_BORROW_NEW_SUPPLY_INDEX_CALCULATION_FAILED,
        REPAY_BORROW_NEW_SUPPLY_RATE_CALCULATION_FAILED,
        REPAY_BORROW_NEW_TOTAL_BALANCE_CALCULATION_FAILED,
        REPAY_BORROW_NEW_TOTAL_BORROW_CALCULATION_FAILED,
        REPAY_BORROW_NEW_TOTAL_CASH_CALCULATION_FAILED,
        REPAY_BORROW_TRANSFER_IN_FAILED,
        REPAY_BORROW_TRANSFER_IN_NOT_POSSIBLE,
        SET_ADMIN_OWNER_CHECK,
        SET_ASSET_PRICE_CHECK_ORACLE,
        SET_MARKET_INTEREST_RATE_MODEL_OWNER_CHECK,
        SET_ORACLE_OWNER_CHECK,
        SET_ORIGINATION_FEE_OWNER_CHECK,
        SET_RISK_PARAMETERS_OWNER_CHECK,
        SET_RISK_PARAMETERS_VALIDATION,
        SUPPLY_ACCUMULATED_BALANCE_CALCULATION_FAILED,
        SUPPLY_MARKET_NOT_SUPPORTED,
        SUPPLY_NEW_BORROW_INDEX_CALCULATION_FAILED,
        SUPPLY_NEW_BORROW_RATE_CALCULATION_FAILED,
        SUPPLY_NEW_SUPPLY_INDEX_CALCULATION_FAILED,
        SUPPLY_NEW_SUPPLY_RATE_CALCULATION_FAILED,
        SUPPLY_NEW_TOTAL_BALANCE_CALCULATION_FAILED,
        SUPPLY_NEW_TOTAL_CASH_CALCULATION_FAILED,
        SUPPLY_NEW_TOTAL_SUPPLY_CALCULATION_FAILED,
        SUPPLY_TRANSFER_IN_FAILED,
        SUPPLY_TRANSFER_IN_NOT_POSSIBLE,
        SUPPORT_MARKET_OWNER_CHECK,
        SUPPORT_MARKET_PRICE_CHECK,
        SUSPEND_MARKET_OWNER_CHECK,
        WITHDRAW_ACCOUNT_LIQUIDITY_CALCULATION_FAILED,
        WITHDRAW_ACCOUNT_SHORTFALL_PRESENT,
        WITHDRAW_ACCUMULATED_BALANCE_CALCULATION_FAILED,
        WITHDRAW_AMOUNT_LIQUIDITY_SHORTFALL,
        WITHDRAW_AMOUNT_VALUE_CALCULATION_FAILED,
        WITHDRAW_CAPACITY_CALCULATION_FAILED,
        WITHDRAW_NEW_BORROW_INDEX_CALCULATION_FAILED,
        WITHDRAW_NEW_BORROW_RATE_CALCULATION_FAILED,
        WITHDRAW_NEW_SUPPLY_INDEX_CALCULATION_FAILED,
        WITHDRAW_NEW_SUPPLY_RATE_CALCULATION_FAILED,
        WITHDRAW_NEW_TOTAL_BALANCE_CALCULATION_FAILED,
        WITHDRAW_NEW_TOTAL_SUPPLY_CALCULATION_FAILED,
        WITHDRAW_TRANSFER_OUT_FAILED,
        WITHDRAW_TRANSFER_OUT_NOT_POSSIBLE
    }


    /**
      * @dev use this when reporting a known error from the money market or a non-upgradeable collaborator
      */
    function fail(Error err, FailureInfo info) internal returns (uint) {
        emit Failure(uint(err), uint(info), 0);

        return uint(err);
    }


    /**
      * @dev use this when reporting an opaque error from an upgradeable collaborator contract
      */
    function failOpaque(FailureInfo info, uint opaqueError) internal returns (uint) {
        emit Failure(uint(Error.OPAQUE_ERROR), uint(info), opaqueError);

        return uint(Error.OPAQUE_ERROR);
    }

}
contract DSValue {
    // TODO: View or constant? It's clearly a view...
    function peek() public view returns (bytes32, bool);

    function read() public view returns (bytes32);
}
contract CarefulMath is ErrorReporter {

    /**
    * @dev Multiplies two numbers, returns an error on overflow.
    */
    function mul(uint a, uint b) internal pure returns (Error, uint) {
        if (a == 0) {
            return (Error.NO_ERROR, 0);
        }

        uint c = a * b;

        if (c / a != b) {
            return (Error.INTEGER_OVERFLOW, 0);
        } else {
            return (Error.NO_ERROR, c);
        }
    }

    /**
    * @dev Integer division of two numbers, truncating the quotient.
    */
    function div(uint a, uint b) internal pure returns (Error, uint) {
        if (b == 0) {
            return (Error.DIVISION_BY_ZERO, 0);
        }

        return (Error.NO_ERROR, a / b);
    }

    /**
    * @dev Subtracts two numbers, returns an error on overflow (i.e. if subtrahend is greater than minuend).
    */
    function sub(uint a, uint b) internal pure returns (Error, uint) {
        if (b <= a) {
            return (Error.NO_ERROR, a - b);
        } else {
            return (Error.INTEGER_UNDERFLOW, 0);
        }
    }

    /**
    * @dev Adds two numbers, returns an error on overflow.
    */
    function add(uint a, uint b) internal pure returns (Error, uint) {
        uint c = a + b;

        if (c >= a) {
            return (Error.NO_ERROR, c);
        } else {
            return (Error.INTEGER_OVERFLOW, 0);
        }
    }

    /**
    * @dev add a and b and then subtract c
    */
    function addThenSub(uint a, uint b, uint c) internal pure returns (Error, uint) {
        (Error err0, uint sum) = add(a, b);

        if (err0 != Error.NO_ERROR) {
            return (err0, 0);
        }

        return sub(sum, c);
    }
}
contract Exponential is ErrorReporter, CarefulMath {

    // TODO: We may wish to put the result of 10**18 here instead of the expression.
    // Per https://solidity.readthedocs.io/en/latest/contracts.html#constant-state-variables
    // the optimizer MAY replace the expression 10**18 with its calculated value.
    uint constant expScale = 10**18;

    // See TODO on expScale
    uint constant halfExpScale = expScale/2;

    struct Exp {
        uint mantissa;
    }

    uint constant mantissaOne = 10**18;
    uint constant mantissaOneTenth = 10**17;

    /**
    * @dev Creates an exponential from numerator and denominator values.
    *      Note: Returns an error if (`num` * 10e18) > MAX_INT,
    *            or if `denom` is zero.
    */
    function getExp(uint num, uint denom) pure internal returns (Error, Exp memory) {
        (Error err0, uint scaledNumerator) = mul(num, expScale);
        if (err0 != Error.NO_ERROR) {
            return (err0, Exp({mantissa: 0}));
        }

        (Error err1, uint rational) = div(scaledNumerator, denom);
        if (err1 != Error.NO_ERROR) {
            return (err1, Exp({mantissa: 0}));
        }

        return (Error.NO_ERROR, Exp({mantissa: rational}));
    }

    /**
    * @dev Adds two exponentials, returning a new exponential.
    */
    function addExp(Exp memory a, Exp memory b) pure internal returns (Error, Exp memory) {
        (Error error, uint result) = add(a.mantissa, b.mantissa);

        return (error, Exp({mantissa: result}));
    }

    /**
    * @dev Subtracts two exponentials, returning a new exponential.
    */
    function subExp(Exp memory a, Exp memory b) pure internal returns (Error, Exp memory) {
        (Error error, uint result) = sub(a.mantissa, b.mantissa);

        return (error, Exp({mantissa: result}));
    }

    /**
    * @dev Multiply an Exp by a scalar, returning a new Exp.
    */
    function mulScalar(Exp memory a, uint scalar) pure internal returns (Error, Exp memory) {
        (Error err0, uint scaledMantissa) = mul(a.mantissa, scalar);
        if (err0 != Error.NO_ERROR) {
            return (err0, Exp({mantissa: 0}));
        }

        return (Error.NO_ERROR, Exp({mantissa: scaledMantissa}));
    }

    /**
    * @dev Divide an Exp by a scalar, returning a new Exp.
    */
    function divScalar(Exp memory a, uint scalar) pure internal returns (Error, Exp memory) {
        (Error err0, uint descaledMantissa) = div(a.mantissa, scalar);
        if (err0 != Error.NO_ERROR) {
            return (err0, Exp({mantissa: 0}));
        }

        return (Error.NO_ERROR, Exp({mantissa: descaledMantissa}));
    }

    /**
    * @dev Divide a scalar by an Exp, returning a new Exp.
    */
    function divScalarByExp(uint scalar, Exp divisor) pure internal returns (Error, Exp memory) {
        /*
            We are doing this as:
            getExp(mul(expScale, scalar), divisor.mantissa)

            How it works:
            Exp = a / b;
            Scalar = s;
            `s / (a / b)` = `b * s / a` and since for an Exp `a = mantissa, b = expScale`
        */
        (Error err0, uint numerator) = mul(expScale, scalar);
        if (err0 != Error.NO_ERROR) {
            return (err0, Exp({mantissa: 0}));
        }
        return getExp(numerator, divisor.mantissa);
    }

    /**
    * @dev Multiplies two exponentials, returning a new exponential.
    */
    function mulExp(Exp memory a, Exp memory b) pure internal returns (Error, Exp memory) {

        (Error err0, uint doubleScaledProduct) = mul(a.mantissa, b.mantissa);
        if (err0 != Error.NO_ERROR) {
            return (err0, Exp({mantissa: 0}));
        }

        // We add half the scale before dividing so that we get rounding instead of truncation.
        //  See "Listing 6" and text above it at https://accu.org/index.php/journals/1717
        // Without this change, a result like 6.6...e-19 will be truncated to 0 instead of being rounded to 1e-18.
        (Error err1, uint doubleScaledProductWithHalfScale) = add(halfExpScale, doubleScaledProduct);
        if (err1 != Error.NO_ERROR) {
            return (err1, Exp({mantissa: 0}));
        }

        (Error err2, uint product) = div(doubleScaledProductWithHalfScale, expScale);
        // The only error `div` can return is Error.DIVISION_BY_ZERO but we control `expScale` and it is not zero.
        assert(err2 == Error.NO_ERROR);

        return (Error.NO_ERROR, Exp({mantissa: product}));
    }

    /**
      * @dev Divides two exponentials, returning a new exponential.
      *     (a/scale) / (b/scale) = (a/scale) * (scale/b) = a/b,
      *  which we can scale as an Exp by calling getExp(a.mantissa, b.mantissa)
      */
    function divExp(Exp memory a, Exp memory b) pure internal returns (Error, Exp memory) {
        return getExp(a.mantissa, b.mantissa);
    }

    /**
      * @dev Truncates the given exp to a whole number value.
      *      For example, truncate(Exp{mantissa: 15 * (10**18)}) = 15
      */
    function truncate(Exp memory exp) pure internal returns (uint) {
        // Note: We are not using careful math here as we're performing a division that cannot fail
        return exp.mantissa / 10**18;
    }

    /**
      * @dev Checks if first Exp is less than second Exp.
      */
    function lessThanExp(Exp memory left, Exp memory right) pure internal returns (bool) {
        return left.mantissa < right.mantissa; //TODO: Add some simple tests and this in another PR yo.
    }

    /**
      * @dev Checks if left Exp <= right Exp.
      */
    function lessThanOrEqualExp(Exp memory left, Exp memory right) pure internal returns (bool) {
        return left.mantissa <= right.mantissa;
    }

    /**
      * @dev Checks if first Exp is greater than second Exp.
      */
    function greaterThanExp(Exp memory left, Exp memory right) pure internal returns (bool) {
        return left.mantissa > right.mantissa;
    }

    /**
      * @dev returns true if Exp is exactly zero
      */
    function isZeroExp(Exp memory value) pure internal returns (bool) {
        return value.mantissa == 0;
    }
}
contract PriceOracle is Exponential {

    /**
      * @dev flag for whether or not contract is paused
      *
      */
    bool public paused;

    uint public constant numBlocksPerPeriod = 240; // approximately 1 hour: 60 seconds/minute * 60 minutes/hour * 1 block/15 seconds

    uint public constant maxSwingMantissa = (10 ** 17); // 0.1

    /**
      * @dev Mapping of asset addresses to DSValue price oracle contracts. The price contracts
      *      should be DSValue contracts whose value is the `eth:asset` price scaled by 1e18.
      *      That is, 1 eth is worth how much of the asset (e.g. 1 eth = 100 USD). We want
      *      to know the inverse, which is how much eth is one asset worth. This `asset:eth`
      *      is the multiplicative inverse (in that example, 1/100). The math is a bit trickier
      *      since we need to descale the number by 1e18, inverse, and then rescale the number.
      *      We perform this operation to return the `asset:eth` price for these reader assets.
      *
      * map: assetAddress -> DSValue price oracle
      */
    mapping(address => DSValue) public readers;

    /**
      * @dev Mapping of asset addresses and their corresponding price in terms of Eth-Wei
      *      which is simply equal to AssetWeiPrice * 10e18. For instance, if OMG token was
      *      worth 5x Eth then the price for OMG would be 5*10e18 or Exp({mantissa: 5000000000000000000}).
      * map: assetAddress -> Exp
      */
    mapping(address => Exp) public _assetPrices;

    constructor(address _poster, address addr0, address reader0, address addr1, address reader1) public {
        anchorAdmin = msg.sender;
        poster = _poster;
        maxSwing = Exp({mantissa : maxSwingMantissa});

        // Make sure the assets are zero or different
        assert(addr0 == address(0) || (addr0 != addr1));

        if (addr0 != address(0)) {
            assert(reader0 != address(0));
            readers[addr0] = DSValue(reader0);
        } else {
            assert(reader0 == address(0));
        }

        if (addr1 != address(0)) {
            assert(reader1 != address(0));
            readers[addr1] = DSValue(reader1);
        } else {
            assert(reader1 == address(0));
        }
    }

    /**
      * @notice Do not pay into PriceOracle
      */
    function() payable public {
        revert();
    }

    enum OracleError {
        NO_ERROR,
        UNAUTHORIZED,
        FAILED_TO_SET_PRICE
    }

    enum OracleFailureInfo {
        ACCEPT_ANCHOR_ADMIN_PENDING_ANCHOR_ADMIN_CHECK,
        SET_PAUSED_OWNER_CHECK,
        SET_PENDING_ANCHOR_ADMIN_OWNER_CHECK,
        SET_PENDING_ANCHOR_PERMISSION_CHECK,
        SET_PRICE_CALCULATE_SWING,
        SET_PRICE_CAP_TO_MAX,
        SET_PRICE_MAX_SWING_CHECK,
        SET_PRICE_NO_ANCHOR_PRICE_OR_INITIAL_PRICE_ZERO,
        SET_PRICE_PERMISSION_CHECK,
        SET_PRICE_ZERO_PRICE,
        SET_PRICES_PARAM_VALIDATION,
        SET_PRICE_IS_READER_ASSET
    }

    /**
      * @dev `msgSender` is msg.sender; `error` corresponds to enum OracleError; `info` corresponds to enum OracleFailureInfo, and `detail` is an arbitrary
      * contract-specific code that enables us to report opaque error codes from upgradeable contracts.
      **/
    event OracleFailure(address msgSender, address asset, uint error, uint info, uint detail);

    /**
      * @dev use this when reporting a known error from the price oracle or a non-upgradeable collaborator
      *      Using Oracle in name because we already inherit a `fail` function from ErrorReporter.sol via Exponential.sol
      */
    function failOracle(address asset, OracleError err, OracleFailureInfo info) internal returns (uint) {
        emit OracleFailure(msg.sender, asset, uint(err), uint(info), 0);

        return uint(err);
    }

    /**
      * @dev Use this when reporting an error from the money market. Give the money market result as `details`
      */
    function failOracleWithDetails(address asset, OracleError err, OracleFailureInfo info, uint details) internal returns (uint) {
        emit OracleFailure(msg.sender, asset, uint(err), uint(info), details);

        return uint(err);
    }

    /**
      * @dev An administrator who can set the pending anchor value for assets.
      *      Set in the constructor.
      */
    address public anchorAdmin;

    /**
      * @dev pending anchor administrator for this contract.
      */
    address public pendingAnchorAdmin;

    /**
      * @dev Address of the price poster.
      *      Set in the constructor.
      */
    address public poster;

    /**
      * @dev maxSwing the maximum allowed percentage difference between a new price and the anchor's price
      *      Set only in the constructor
      */
    Exp public maxSwing;

    struct Anchor {
        // floor(block.number / numBlocksPerPeriod) + 1
        uint period;

        // Price in ETH, scaled by 10**18
        uint priceMantissa;
    }

    /**
      * @dev anchors by asset
      */
    mapping(address => Anchor) public anchors;

    /**
      * @dev pending anchor prices by asset
      */
    mapping(address => uint) public pendingAnchors;

    /**
      * @dev emitted when a pending anchor is set
      * @param asset Asset for which to set a pending anchor
      * @param oldScaledPrice if an unused pending anchor was present, its value; otherwise 0.
      * @param newScaledPrice the new scaled pending anchor price
      */
    event NewPendingAnchor(address anchorAdmin, address asset, uint oldScaledPrice, uint newScaledPrice);

    /**
      * @notice provides ability to override the anchor price for an asset
      * @dev Admin function to set the anchor price for an asset
      * @param asset Asset for which to override the anchor price
      * @param newScaledPrice New anchor price
      * @return uint 0=success, otherwise a failure (see enum OracleError for details)
      */
    function _setPendingAnchor(address asset, uint newScaledPrice) public returns (uint) {
        // Check caller = anchorAdmin. Note: Deliberately not allowing admin. They can just change anchorAdmin if desired.
        if (msg.sender != anchorAdmin) {
            return failOracle(asset, OracleError.UNAUTHORIZED, OracleFailureInfo.SET_PENDING_ANCHOR_PERMISSION_CHECK);
        }

        uint oldScaledPrice = pendingAnchors[asset];
        pendingAnchors[asset] = newScaledPrice;

        emit NewPendingAnchor(msg.sender, asset, oldScaledPrice, newScaledPrice);

        return uint(OracleError.NO_ERROR);
    }

    /**
      * @dev emitted for all price changes
      */
    event PricePosted(address asset, uint previousPriceMantissa, uint requestedPriceMantissa, uint newPriceMantissa);

    /**
      * @dev emitted if this contract successfully posts a capped-to-max price to the money market
      */
    event CappedPricePosted(address asset, uint requestedPriceMantissa, uint anchorPriceMantissa, uint cappedPriceMantissa);

    /**
      * @dev emitted when admin either pauses or resumes the contract; newState is the resulting state
      */
    event SetPaused(bool newState);

    /**
      * @dev emitted when pendingAnchorAdmin is changed
      */
    event NewPendingAnchorAdmin(address oldPendingAnchorAdmin, address newPendingAnchorAdmin);

    /**
      * @dev emitted when pendingAnchorAdmin is accepted, which means anchor admin is updated
      */
    event NewAnchorAdmin(address oldAnchorAdmin, address newAnchorAdmin);

    /**
      * @notice set `paused` to the specified state
      * @dev Admin function to pause or resume the market
      * @param requestedState value to assign to `paused`
      * @return uint 0=success, otherwise a failure
      */
    function _setPaused(bool requestedState) public returns (uint) {
        // Check caller = anchorAdmin
        if (msg.sender != anchorAdmin) {
            return failOracle(0, OracleError.UNAUTHORIZED, OracleFailureInfo.SET_PAUSED_OWNER_CHECK);
        }

        paused = requestedState;
        emit SetPaused(requestedState);

        return uint(Error.NO_ERROR);
    }

    /**
      * @notice Begins transfer of anchor admin rights. The newPendingAnchorAdmin must call `_acceptAnchorAdmin` to finalize the transfer.
      * @dev Admin function to begin change of anchor admin. The newPendingAnchorAdmin must call `_acceptAnchorAdmin` to finalize the transfer.
      * @param newPendingAnchorAdmin New pending anchor admin.
      * @return uint 0=success, otherwise a failure
      *
      * TODO: Should we add a second arg to verify, like a checksum of `newAnchorAdmin` address?
      */
    function _setPendingAnchorAdmin(address newPendingAnchorAdmin) public returns (uint) {
        // Check caller = anchorAdmin
        if (msg.sender != anchorAdmin) {
            return failOracle(0, OracleError.UNAUTHORIZED, OracleFailureInfo.SET_PENDING_ANCHOR_ADMIN_OWNER_CHECK);
        }

        // save current value, if any, for inclusion in log
        address oldPendingAnchorAdmin = pendingAnchorAdmin;
        // Store pendingAdmin = newPendingAdmin
        pendingAnchorAdmin = newPendingAnchorAdmin;

        emit NewPendingAnchorAdmin(oldPendingAnchorAdmin, newPendingAnchorAdmin);

        return uint(Error.NO_ERROR);
    }

    /**
      * @notice Accepts transfer of anchor admin rights. msg.sender must be pendingAnchorAdmin
      * @dev Admin function for pending anchor admin to accept role and update anchor admin
      * @return uint 0=success, otherwise a failure
      */
    function _acceptAnchorAdmin() public returns (uint) {
        // Check caller = pendingAnchorAdmin
        // msg.sender can't be zero
        if (msg.sender != pendingAnchorAdmin) {
            return failOracle(0, OracleError.UNAUTHORIZED, OracleFailureInfo.ACCEPT_ANCHOR_ADMIN_PENDING_ANCHOR_ADMIN_CHECK);
        }

        // Save current value for inclusion in log
        address oldAnchorAdmin = anchorAdmin;
        // Store admin = pendingAnchorAdmin
        anchorAdmin = pendingAnchorAdmin;
        // Clear the pending value
        pendingAnchorAdmin = 0;

        emit NewAnchorAdmin(oldAnchorAdmin, msg.sender);

        return uint(Error.NO_ERROR);
    }

    /**
      * @notice retrieves price of an asset
      * @dev function to get price for an asset
      * @param asset Asset for which to get the price
      * @return uint mantissa of asset price (scaled by 1e18) or zero if unset or contract paused
      */
    function assetPrices(address asset) public view returns (uint) {
        // Note: zero is treated by the money market as an invalid
        //       price and will cease operations with that asset
        //       when zero.
        //
        // We get the price as:
        //
        //  1. If the contract is paused, return 0.
        //  2. If the asset is a reader asset:
        //    a. If the reader has a value set, invert it and return.
        //    b. Else, return 0.
        //  3. Return price in `_assetPrices`, which may be zero.

        if (paused) {
            return 0;
        } else {
            if (readers[asset] != address(0)) {
                (bytes32 readValue, bool foundValue) = readers[asset].peek();

                if (foundValue) {
                    (Error error, Exp memory invertedVal) = getExp(mantissaOne, uint256(readValue));

                    if (error != Error.NO_ERROR) {
                        return 0;
                    }

                    return invertedVal.mantissa;
                } else {
                    return 0;
                }
            } else {
                return _assetPrices[asset].mantissa;
            }
        }
    }

    /**
      * @notice retrieves price of an asset
      * @dev function to get price for an asset
      * @param asset Asset for which to get the price
      * @return uint mantissa of asset price (scaled by 1e18) or zero if unset or contract paused
      */
    function getPrice(address asset) public view returns (uint) {
        return assetPrices(asset);
    }

    struct SetPriceLocalVars {
        Exp price;
        Exp swing;
        Exp anchorPrice;
        uint anchorPeriod;
        uint currentPeriod;
        bool priceCapped;
        uint cappingAnchorPriceMantissa;
        uint pendingAnchorMantissa;
    }

    /**
      * @notice entry point for updating prices
      * @dev function to set price for an asset
      * @param asset Asset for which to set the price
      * @param requestedPriceMantissa requested new price, scaled by 10**18
      * @return uint 0=success, otherwise a failure (see enum OracleError for details)
      */
    function setPrice(address asset, uint requestedPriceMantissa) public returns (uint) {
        // Fail when msg.sender is not poster
        if (msg.sender != poster) {
            return failOracle(asset, OracleError.UNAUTHORIZED, OracleFailureInfo.SET_PRICE_PERMISSION_CHECK);
        }

        return setPriceInternal(asset, requestedPriceMantissa);
    }

    function setPriceInternal(address asset, uint requestedPriceMantissa) internal returns (uint) {
        // re-used for intermediate errors
        Error err;
        SetPriceLocalVars memory localVars;
        // We add 1 for currentPeriod so that it can never be zero and there's no ambiguity about an unset value.
        // (It can be a problem in tests with low block numbers.)
        localVars.currentPeriod = (block.number / numBlocksPerPeriod) + 1;
        localVars.pendingAnchorMantissa = pendingAnchors[asset];
        localVars.price = Exp({mantissa : requestedPriceMantissa});

        if (readers[asset] != address(0)) {
            return failOracle(asset, OracleError.FAILED_TO_SET_PRICE, OracleFailureInfo.SET_PRICE_IS_READER_ASSET);
        }

        if (localVars.pendingAnchorMantissa != 0) {
            // let's explicitly set to 0 rather than relying on default of declaration
            localVars.anchorPeriod = 0;
            localVars.anchorPrice = Exp({mantissa : localVars.pendingAnchorMantissa});

            // Verify movement is within max swing of pending anchor (currently: 10%)
            (err, localVars.swing) = calculateSwing(localVars.anchorPrice, localVars.price);
            if (err != Error.NO_ERROR) {
                return failOracleWithDetails(asset, OracleError.FAILED_TO_SET_PRICE, OracleFailureInfo.SET_PRICE_CALCULATE_SWING, uint(err));
            }

            // Fail when swing > maxSwing
            if (greaterThanExp(localVars.swing, maxSwing)) {
                return failOracleWithDetails(asset, OracleError.FAILED_TO_SET_PRICE, OracleFailureInfo.SET_PRICE_MAX_SWING_CHECK, localVars.swing.mantissa);
            }
        } else {
            localVars.anchorPeriod = anchors[asset].period;
            localVars.anchorPrice = Exp({mantissa : anchors[asset].priceMantissa});

            if (localVars.anchorPeriod != 0) {
                (err, localVars.priceCapped, localVars.price) = capToMax(localVars.anchorPrice, localVars.price);
                if (err != Error.NO_ERROR) {
                    return failOracleWithDetails(asset, OracleError.FAILED_TO_SET_PRICE, OracleFailureInfo.SET_PRICE_CAP_TO_MAX, uint(err));
                }
                if (localVars.priceCapped) {
                    // save for use in log
                    localVars.cappingAnchorPriceMantissa = localVars.anchorPrice.mantissa;
                }
            } else {
                // Setting first price. Accept as is (already assigned above from requestedPriceMantissa) and use as anchor
                localVars.anchorPrice = Exp({mantissa : requestedPriceMantissa});
            }
        }

        // Fail if anchorPrice or price is zero.
        // zero anchor represents an unexpected situation likely due to a problem in this contract
        // zero price is more likely as the result of bad input from the caller of this function
        if (isZeroExp(localVars.anchorPrice)) {
            // If we get here price could also be zero, but it does not seem worthwhile to distinguish the 3rd case
            return failOracle(asset, OracleError.FAILED_TO_SET_PRICE, OracleFailureInfo.SET_PRICE_NO_ANCHOR_PRICE_OR_INITIAL_PRICE_ZERO);
        }

        if (isZeroExp(localVars.price)) {
            return failOracle(asset, OracleError.FAILED_TO_SET_PRICE, OracleFailureInfo.SET_PRICE_ZERO_PRICE);
        }

        // BEGIN SIDE EFFECTS

        // Set pendingAnchor = Nothing
        // Pending anchor is only used once.
        if (pendingAnchors[asset] != 0) {
            pendingAnchors[asset] = 0;
        }

        // If currentPeriod > anchorPeriod:
        //  Set anchors[asset] = (currentPeriod, price)
        //  The new anchor is if we're in a new period or we had a pending anchor, then we become the new anchor
        if (localVars.currentPeriod > localVars.anchorPeriod) {
            anchors[asset] = Anchor({period : localVars.currentPeriod, priceMantissa : localVars.price.mantissa});
        }

        uint previousPrice = _assetPrices[asset].mantissa;

        setPriceStorageInternal(asset, localVars.price.mantissa);

        emit PricePosted(asset, previousPrice, requestedPriceMantissa, localVars.price.mantissa);

        if (localVars.priceCapped) {
            // We have set a capped price. Log it so we can detect the situation and investigate.
            emit CappedPricePosted(asset, requestedPriceMantissa, localVars.cappingAnchorPriceMantissa, localVars.price.mantissa);
        }

        return uint(OracleError.NO_ERROR);
    }

    // As a function to allow harness overrides
    function setPriceStorageInternal(address asset, uint256 priceMantissa) internal {
        _assetPrices[asset] = Exp({mantissa: priceMantissa});
    }

    // abs(price - anchorPrice) / anchorPrice
    function calculateSwing(Exp memory anchorPrice, Exp memory price) pure internal returns (Error, Exp memory) {
        Exp memory numerator;
        Error err;

        if (greaterThanExp(anchorPrice, price)) {
            (err, numerator) = subExp(anchorPrice, price);
            // can't underflow
            assert(err == Error.NO_ERROR);
        } else {
            (err, numerator) = subExp(price, anchorPrice);
            // Given greaterThan check above, price >= anchorPrice so can't underflow.
            assert(err == Error.NO_ERROR);
        }

        return divExp(numerator, anchorPrice);
    }

    function capToMax(Exp memory anchorPrice, Exp memory price) view internal returns (Error, bool, Exp memory) {
        Exp memory one = Exp({mantissa : mantissaOne});
        Exp memory onePlusMaxSwing;
        Exp memory oneMinusMaxSwing;
        Exp memory max;
        Exp memory min;
        // re-used for intermediate errors
        Error err;

        (err, onePlusMaxSwing) = addExp(one, maxSwing);
        if (err != Error.NO_ERROR) {
            return (err, false, Exp({mantissa : 0}));
        }

        // max = anchorPrice * (1 + maxSwing)
        (err, max) = mulExp(anchorPrice, onePlusMaxSwing);
        if (err != Error.NO_ERROR) {
            return (err, false, Exp({mantissa : 0}));
        }

        // If price > anchorPrice * (1 + maxSwing)
        // Set price = anchorPrice * (1 + maxSwing)
        if (greaterThanExp(price, max)) {
            return (Error.NO_ERROR, true, max);
        }

        (err, oneMinusMaxSwing) = subExp(one, maxSwing);
        if (err != Error.NO_ERROR) {
            return (err, false, Exp({mantissa : 0}));
        }

        // min = anchorPrice * (1 - maxSwing)
        (err, min) = mulExp(anchorPrice, oneMinusMaxSwing);
        // We can't overflow here or we would have already overflowed above when calculating `max`
        assert(err == Error.NO_ERROR);

        // If  price < anchorPrice * (1 - maxSwing)
        // Set price = anchorPrice * (1 - maxSwing)
        if (lessThanExp(price, min)) {
            return (Error.NO_ERROR, true, min);
        }

        return (Error.NO_ERROR, false, price);
    }

    /**
      * @notice entry point for updating multiple prices
      * @dev function to set prices for a variable number of assets.
      * @param assets a list of up to assets for which to set a price. required: 0 < assets.length == requestedPriceMantissas.length
      * @param requestedPriceMantissas requested new prices for the assets, scaled by 10**18. required: 0 < assets.length == requestedPriceMantissas.length
      * @return uint values in same order as inputs. For each: 0=success, otherwise a failure (see enum OracleError for details)
      */
    function setPrices(address[] assets, uint[] requestedPriceMantissas) public returns (uint[] memory) {
        uint numAssets = assets.length;
        uint numPrices = requestedPriceMantissas.length;
        uint[] memory result;

        // Fail when msg.sender is not poster
        if (msg.sender != poster) {
            result = new uint[](1);
            result[0] = failOracle(0, OracleError.UNAUTHORIZED, OracleFailureInfo.SET_PRICE_PERMISSION_CHECK);
            return result;
        }

        if ((numAssets == 0) || (numPrices != numAssets)) {
            result = new uint[](1);
            result[0] = failOracle(0, OracleError.FAILED_TO_SET_PRICE, OracleFailureInfo.SET_PRICES_PARAM_VALIDATION);
            return result;
        }

        result = new uint[](numAssets);

        for (uint i = 0; i < numAssets; i++) {
            result[i] = setPriceInternal(assets[i], requestedPriceMantissas[i]);
        }

        return result;
    }
}

Contract Security Audit

Contract ABI

[{"constant":false,"inputs":[{"name":"asset","type":"address"},{"name":"requestedPriceMantissa","type":"uint256"}],"name":"setPrice","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[],"name":"anchorAdmin","outputs":[{"name":"","type":"address"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"maxSwingMantissa","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"name":"","type":"address"}],"name":"_assetPrices","outputs":[{"name":"mantissa","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"name":"requestedState","type":"bool"}],"name":"_setPaused","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[{"name":"asset","type":"address"}],"name":"getPrice","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"name":"assets","type":"address[]"},{"name":"requestedPriceMantissas","type":"uint256[]"}],"name":"setPrices","outputs":[{"name":"","type":"uint256[]"}],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[],"name":"pendingAnchorAdmin","outputs":[{"name":"","type":"address"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"numBlocksPerPeriod","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"name":"","type":"address"}],"name":"readers","outputs":[{"name":"","type":"address"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"paused","outputs":[{"name":"","type":"bool"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"name":"asset","type":"address"}],"name":"assetPrices","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"name":"","type":"address"}],"name":"anchors","outputs":[{"name":"period","type":"uint256"},{"name":"priceMantissa","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"poster","outputs":[{"name":"","type":"address"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"name":"newPendingAnchorAdmin","type":"address"}],"name":"_setPendingAnchorAdmin","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[{"name":"","type":"address"}],"name":"pendingAnchors","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"maxSwing","outputs":[{"name":"mantissa","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[],"name":"_acceptAnchorAdmin","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"name":"asset","type":"address"},{"name":"newScaledPrice","type":"uint256"}],"name":"_setPendingAnchor","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"nonpayable","type":"function"},{"inputs":[{"name":"_poster","type":"address"},{"name":"addr0","type":"address"},{"name":"reader0","type":"address"},{"name":"addr1","type":"address"},{"name":"reader1","type":"address"}],"payable":false,"stateMutability":"nonpayable","type":"constructor"},{"payable":true,"stateMutability":"payable","type":"fallback"},{"anonymous":false,"inputs":[{"indexed":false,"name":"msgSender","type":"address"},{"indexed":false,"name":"asset","type":"address"},{"indexed":false,"name":"error","type":"uint256"},{"indexed":false,"name":"info","type":"uint256"},{"indexed":false,"name":"detail","type":"uint256"}],"name":"OracleFailure","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"name":"anchorAdmin","type":"address"},{"indexed":false,"name":"asset","type":"address"},{"indexed":false,"name":"oldScaledPrice","type":"uint256"},{"indexed":false,"name":"newScaledPrice","type":"uint256"}],"name":"NewPendingAnchor","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"name":"asset","type":"address"},{"indexed":false,"name":"previousPriceMantissa","type":"uint256"},{"indexed":false,"name":"requestedPriceMantissa","type":"uint256"},{"indexed":false,"name":"newPriceMantissa","type":"uint256"}],"name":"PricePosted","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"name":"asset","type":"address"},{"indexed":false,"name":"requestedPriceMantissa","type":"uint256"},{"indexed":false,"name":"anchorPriceMantissa","type":"uint256"},{"indexed":false,"name":"cappedPriceMantissa","type":"uint256"}],"name":"CappedPricePosted","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"name":"newState","type":"bool"}],"name":"SetPaused","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"name":"oldPendingAnchorAdmin","type":"address"},{"indexed":false,"name":"newPendingAnchorAdmin","type":"address"}],"name":"NewPendingAnchorAdmin","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"name":"oldAnchorAdmin","type":"address"},{"indexed":false,"name":"newAnchorAdmin","type":"address"}],"name":"NewAnchorAdmin","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"name":"error","type":"uint256"},{"indexed":false,"name":"info","type":"uint256"},{"indexed":false,"name":"detail","type":"uint256"}],"name":"Failure","type":"event"}]

608060405234801561001057600080fd5b5060405160a0806200161e833981016040818152825160208085015183860151606087015160809097015160038054600160a060020a0319908116331790915560058054600160a060020a038089169190931617905593870190955267016345785d8a000095869052600695909555919491939290841615806100a5575081600160a060020a031684600160a060020a031614155b15156100ad57fe5b600160a060020a0384161561010157600160a060020a03831615156100ce57fe5b600160a060020a0384811660009081526001602052604090208054600160a060020a031916918516919091179055610112565b600160a060020a0383161561011257fe5b600160a060020a0382161561016657600160a060020a038116151561013357fe5b600160a060020a0382811660009081526001602052604090208054600160a060020a031916918316919091179055610177565b600160a060020a0381161561017757fe5b5050505050611492806200018c6000396000f3006080604052600436106101055763ffffffff7c0100000000000000000000000000000000000000000000000000000000600035041662e4768b811461010a57806308f31857146101405780630c9c630114610171578063183f34441461018657806326617c28146101a757806341976e09146101c15780634352fa9f146101e2578063451b1e3a146102c0578063485feabe146102d557806351e59ffb146102ea5780635c975abb1461030b5780635e9a523c14610334578063692374e314610355578063809597211461038f5780639964622c146103a45780639e8c4d95146103c5578063c5faf1d5146103e6578063ccb13cbd146103fb578063de9d0e8514610410575b600080fd5b34801561011657600080fd5b5061012e600160a060020a0360043516602435610434565b60408051918252519081900360200190f35b34801561014c57600080fd5b50610155610470565b60408051600160a060020a039092168252519081900360200190f35b34801561017d57600080fd5b5061012e61047f565b34801561019257600080fd5b5061012e600160a060020a036004351661048b565b3480156101b357600080fd5b5061012e600435151561049d565b3480156101cd57600080fd5b5061012e600160a060020a0360043516610515565b3480156101ee57600080fd5b506040805160206004803580820135838102808601850190965280855261027095369593946024949385019291829185019084908082843750506040805187358901803560208181028481018201909552818452989b9a9989019892975090820195509350839250850190849080828437509497506105209650505050505050565b60408051602080825283518183015283519192839290830191858101910280838360005b838110156102ac578181015183820152602001610294565b505050509050019250505060405180910390f35b3480156102cc57600080fd5b50610155610671565b3480156102e157600080fd5b5061012e610680565b3480156102f657600080fd5b50610155600160a060020a0360043516610685565b34801561031757600080fd5b506103206106a0565b604080519115158252519081900360200190f35b34801561034057600080fd5b5061012e600160a060020a03600435166106a9565b34801561036157600080fd5b50610376600160a060020a03600435166107fe565b6040805192835260208301919091528051918290030190f35b34801561039b57600080fd5b50610155610817565b3480156103b057600080fd5b5061012e600160a060020a0360043516610826565b3480156103d157600080fd5b5061012e600160a060020a03600435166108ca565b3480156103f257600080fd5b5061012e6108dc565b34801561040757600080fd5b5061012e6108e2565b34801561041c57600080fd5b5061012e600160a060020a036004351660243561098c565b600554600090600160a060020a0316331461045d576104568360016008610a2b565b905061046a565b6104678383610ab4565b90505b92915050565b600354600160a060020a031681565b67016345785d8a000081565b60026020526000908152604090205481565b600354600090600160a060020a031633146104c6576104bf6000600180610a2b565b9050610510565b6000805483151560ff19909116811790915560408051918252517f3c70af01296aef045b2f5c9d3c30b05d4428fd257145b9c7fcd76418e65b59809181900360200190a160005b90505b919050565b600061050d826106a9565b8151815160055460609291908390600090600160a060020a0316331461059157604080516001808252818301909252906020808301908038833901905050915061056e600060016008610a2b565b82600081518110151561057d57fe5b602090810290910101529093508390610667565b83158061059e5750838314155b156105d157604080516001808252818301909252906020808301908038833901905050915061056e60006002600a610a2b565b836040519080825280602002602001820160405280156105fb578160200160208202803883390190505b509150600090505b8381101561066357610643878281518110151561061c57fe5b90602001906020020151878381518110151561063457fe5b90602001906020020151610ab4565b828281518110151561065157fe5b60209081029091010152600101610603565b8194505b5050505092915050565b600454600160a060020a031681565b60f081565b600160205260009081526040902054600160a060020a031681565b60005460ff1681565b6000806000806106b76113fa565b60005460ff16156106cb57600094506107f5565b600160a060020a0386811660009081526001602052604090205416156107d957600160a060020a038087166000908152600160205260408082205481517f59e02dd7000000000000000000000000000000000000000000000000000000008152825191909416936359e02dd79360048083019493928390030190829087803b15801561075657600080fd5b505af115801561076a573d6000803e3d6000fd5b505050506040513d604081101561078057600080fd5b508051602090910151909450925082156107d0576107a6670de0b6b3a764000085610e2a565b909250905060008260178111156107b957fe5b146107c757600094506107f5565b805194506107f5565b600094506107f5565b600160a060020a03861660009081526002602052604090205494505b50505050919050565b6007602052600090815260409020805460019091015482565b600554600160a060020a031681565b6003546000908190600160a060020a031633146108525761084b600060016002610a2b565b91506108c4565b5060048054600160a060020a0384811673ffffffffffffffffffffffffffffffffffffffff19831681179093556040805191909216808252602082019390935281517f6c773973d5bcf264b509f4194ceb99e891251f6aabb325523a863c282958b13e929181900390910190a1600091505b50919050565b60086020526000908152604090205481565b60065481565b6004546000908190600160a060020a0316331461090e57610907600060016000610a2b565b9150610988565b50600380546004805473ffffffffffffffffffffffffffffffffffffffff19808416600160a060020a03838116919091179095551690556040805192909116808352336020840152815190927fbef9248fe57ae972dd47833f68c43f0b3b2d14217612dfbc804a520a23730d4692908290030190a1600091505b5090565b6003546000908190600160a060020a031633146109b7576109b08460016003610a2b565b9150610a24565b50600160a060020a0383166000818152600860209081526040918290208054908690558251338152918201939093528082018390526060810185905290517ff0aa20c29c1f8e751bfe0a78bc49a520ed14f2dab274087d90d1341d8b76af5c9181900360800190a1600091505b5092915050565b60007f96f29b65cebbd6816352fb242b6af7180b49e8a09e19e589225d35bc8444f0b73385856002811115610a5c57fe5b85600b811115610a6857fe5b60408051600160a060020a0395861681529390941660208401528284019190915260608201526000608082015290519081900360a00190a1826002811115610aac57fe5b949350505050565b600080610abf61140c565b600160f0430481016080830152600160a060020a0386811660008181526008602090815260408083205460e0880152805180830182528a81528752928252939093528220541615610b1e57610b17866002600b610a2b565b9350610e21565b60e082015115610bc257600060608301526040805160208101825260e084015181529083018190528251610b529190610ede565b602084015292506000836017811115610b6757fe5b14610b8557610b178660026004866017811115610b8057fe5b610f63565b6020808301516040805192830190526006548252610ba291610fed565b15610bbd57610b178660026006856020015160000151610f63565b610c79565b600160a060020a038616600081815260076020818152604080842080546060890190815282518085018452969095529290915260019091015483528401919091525115610c6757610c1b82604001518360000151610ff4565b8452151560a084015292506000836017811115610c3457fe5b14610c4d57610b178660026005866017811115610b8057fe5b8160a0015115610bbd5760408201515160c0830152610c79565b60408051602081018252868152908301525b610c868260400151611197565b15610c9857610b178660026007610a2b565b8151610ca390611197565b15610cb557610b178660026009610a2b565b600160a060020a03861660009081526008602052604090205415610ced57600160a060020a0386166000908152600860205260408120555b816060015182608001511115610d3d57604080518082018252608084015181528351516020808301918252600160a060020a038a1660009081526007909152929092209051815590516001909101555b50600160a060020a038516600090815260026020526040902054815151610d6590879061119c565b81515160408051600160a060020a0389168152602081018490528082018890526060810192909252517fdd71a1d19fcba687442a1d5c58578f1e409af71a79d10fd95a4d66efd8fa9ae79181900360800190a18160a0015115610e1c5760c082015182515160408051600160a060020a038a16815260208101899052808201939093526060830191909152517f7221f7a2708437039cc63319145b6b873a40594b9782a3bee45b975e2f3b0f689181900360800190a15b600093505b50505092915050565b6000610e346113fa565b600080600080610e4c88670de0b6b3a76400006111c7565b90945092506000846017811115610e5f57fe5b14610e80576040805160208101909152600081529395509293508492610ed3565b610e8a8388611211565b90925090506000826017811115610e9d57fe5b14610ebe576040805160208101909152600081529195509093508490610ed3565b60408051602081019091528181526000965094505b505050509250929050565b6000610ee86113fa565b610ef06113fa565b6000610efc8686610fed565b15610f2957610f0b8686611241565b925090506000816017811115610f1d57fe5b14610f2457fe5b610f4c565b610f338587611241565b925090506000816017811115610f4557fe5b14610f4c57fe5b610f56828761127b565b9350935050509250929050565b60007f96f29b65cebbd6816352fb242b6af7180b49e8a09e19e589225d35bc8444f0b73386866002811115610f9457fe5b86600b811115610fa057fe5b60408051600160a060020a0395861681529390941660208401528284019190915260608201526080810185905290519081900360a00190a1836002811115610fe457fe5b95945050505050565b5190511190565b600080610fff6113fa565b6110076113fa565b61100f6113fa565b6110176113fa565b61101f6113fa565b6110276113fa565b6040805160208181018352670de0b6b3a7640000825282519081019092526006548252955060009061105a90879061129e565b95509050600081601781111561106c57fe5b1461108f576040805160208101909152600080825291995090975095508761118a565b6110998b866112bd565b9350905060008160178111156110ab57fe5b146110ce576040805160208101909152600080825291995090975095508761118a565b6110d88a84610fed565b156110ed57600060018498509850985061118a565b60408051602081019091526006548152611108908790611241565b94509050600081601781111561111a57fe5b1461113d576040805160208101909152600080825291995090975095508761118a565b6111478b856112bd565b92509050600081601781111561115957fe5b1461116057fe5b61116a8a836113aa565b1561117f57600060018398509850985061118a565b6000808b9850985098505b5050505050509250925092565b511590565b6040805160208181018352928152600160a060020a0390931660009081526002909252902090519055565b600080808415156111de5760009250829150611209565b508383028385828115156111ee57fe5b0414611201576003925060009150611209565b600081925092505b509250929050565b600080821515611227575060059050600061123a565b6000838581151561123457fe5b04915091505b9250929050565b600061124b6113fa565b600080611260866000015186600001516113b1565b60408051602081019091529081529097909650945050505050565b60006112856113fa565b835183516112939190610e2a565b915091509250929050565b60006112a86113fa565b600080611260866000015186600001516113d4565b60006112c76113fa565b6000806000806000806112e28a600001518a600001516111c7565b909650945060008660178111156112f557fe5b1461131657604080516020810190915260008152959750949550869461139d565b6113286706f05b59d3b20000866113d4565b9094509250600084601781111561133b57fe5b1461135c57604080516020810190915260008152939750929550869261139d565b61136e83670de0b6b3a7640000611211565b9092509050600082601781111561138157fe5b1461138857fe5b60408051602081019091528181526000985096505b5050505050509250929050565b5190511090565b6000808383116113c857506000905081830361123a565b5060049050600061123a565b6000808383018481106113ed5760008192509250611209565b6003925060009150611209565b60408051602081019091526000815290565b610100604051908101604052806114216113fa565b815260200161142e6113fa565b815260200161143b6113fa565b81526020016000815260200160008152602001600015158152602001600081526020016000815250905600a165627a7a72305820606d3476f5c4301d964880efc77e49b2dd6117e1cc6bcb651ea64d02b3bca8e80029000000000000000000000000612aca17160cc50b3aa777f9790615905d01c0bf0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000

Deployed Bytecode

0x6080604052600436106101055763ffffffff7c0100000000000000000000000000000000000000000000000000000000600035041662e4768b811461010a57806308f31857146101405780630c9c630114610171578063183f34441461018657806326617c28146101a757806341976e09146101c15780634352fa9f146101e2578063451b1e3a146102c0578063485feabe146102d557806351e59ffb146102ea5780635c975abb1461030b5780635e9a523c14610334578063692374e314610355578063809597211461038f5780639964622c146103a45780639e8c4d95146103c5578063c5faf1d5146103e6578063ccb13cbd146103fb578063de9d0e8514610410575b600080fd5b34801561011657600080fd5b5061012e600160a060020a0360043516602435610434565b60408051918252519081900360200190f35b34801561014c57600080fd5b50610155610470565b60408051600160a060020a039092168252519081900360200190f35b34801561017d57600080fd5b5061012e61047f565b34801561019257600080fd5b5061012e600160a060020a036004351661048b565b3480156101b357600080fd5b5061012e600435151561049d565b3480156101cd57600080fd5b5061012e600160a060020a0360043516610515565b3480156101ee57600080fd5b506040805160206004803580820135838102808601850190965280855261027095369593946024949385019291829185019084908082843750506040805187358901803560208181028481018201909552818452989b9a9989019892975090820195509350839250850190849080828437509497506105209650505050505050565b60408051602080825283518183015283519192839290830191858101910280838360005b838110156102ac578181015183820152602001610294565b505050509050019250505060405180910390f35b3480156102cc57600080fd5b50610155610671565b3480156102e157600080fd5b5061012e610680565b3480156102f657600080fd5b50610155600160a060020a0360043516610685565b34801561031757600080fd5b506103206106a0565b604080519115158252519081900360200190f35b34801561034057600080fd5b5061012e600160a060020a03600435166106a9565b34801561036157600080fd5b50610376600160a060020a03600435166107fe565b6040805192835260208301919091528051918290030190f35b34801561039b57600080fd5b50610155610817565b3480156103b057600080fd5b5061012e600160a060020a0360043516610826565b3480156103d157600080fd5b5061012e600160a060020a03600435166108ca565b3480156103f257600080fd5b5061012e6108dc565b34801561040757600080fd5b5061012e6108e2565b34801561041c57600080fd5b5061012e600160a060020a036004351660243561098c565b600554600090600160a060020a0316331461045d576104568360016008610a2b565b905061046a565b6104678383610ab4565b90505b92915050565b600354600160a060020a031681565b67016345785d8a000081565b60026020526000908152604090205481565b600354600090600160a060020a031633146104c6576104bf6000600180610a2b565b9050610510565b6000805483151560ff19909116811790915560408051918252517f3c70af01296aef045b2f5c9d3c30b05d4428fd257145b9c7fcd76418e65b59809181900360200190a160005b90505b919050565b600061050d826106a9565b8151815160055460609291908390600090600160a060020a0316331461059157604080516001808252818301909252906020808301908038833901905050915061056e600060016008610a2b565b82600081518110151561057d57fe5b602090810290910101529093508390610667565b83158061059e5750838314155b156105d157604080516001808252818301909252906020808301908038833901905050915061056e60006002600a610a2b565b836040519080825280602002602001820160405280156105fb578160200160208202803883390190505b509150600090505b8381101561066357610643878281518110151561061c57fe5b90602001906020020151878381518110151561063457fe5b90602001906020020151610ab4565b828281518110151561065157fe5b60209081029091010152600101610603565b8194505b5050505092915050565b600454600160a060020a031681565b60f081565b600160205260009081526040902054600160a060020a031681565b60005460ff1681565b6000806000806106b76113fa565b60005460ff16156106cb57600094506107f5565b600160a060020a0386811660009081526001602052604090205416156107d957600160a060020a038087166000908152600160205260408082205481517f59e02dd7000000000000000000000000000000000000000000000000000000008152825191909416936359e02dd79360048083019493928390030190829087803b15801561075657600080fd5b505af115801561076a573d6000803e3d6000fd5b505050506040513d604081101561078057600080fd5b508051602090910151909450925082156107d0576107a6670de0b6b3a764000085610e2a565b909250905060008260178111156107b957fe5b146107c757600094506107f5565b805194506107f5565b600094506107f5565b600160a060020a03861660009081526002602052604090205494505b50505050919050565b6007602052600090815260409020805460019091015482565b600554600160a060020a031681565b6003546000908190600160a060020a031633146108525761084b600060016002610a2b565b91506108c4565b5060048054600160a060020a0384811673ffffffffffffffffffffffffffffffffffffffff19831681179093556040805191909216808252602082019390935281517f6c773973d5bcf264b509f4194ceb99e891251f6aabb325523a863c282958b13e929181900390910190a1600091505b50919050565b60086020526000908152604090205481565b60065481565b6004546000908190600160a060020a0316331461090e57610907600060016000610a2b565b9150610988565b50600380546004805473ffffffffffffffffffffffffffffffffffffffff19808416600160a060020a03838116919091179095551690556040805192909116808352336020840152815190927fbef9248fe57ae972dd47833f68c43f0b3b2d14217612dfbc804a520a23730d4692908290030190a1600091505b5090565b6003546000908190600160a060020a031633146109b7576109b08460016003610a2b565b9150610a24565b50600160a060020a0383166000818152600860209081526040918290208054908690558251338152918201939093528082018390526060810185905290517ff0aa20c29c1f8e751bfe0a78bc49a520ed14f2dab274087d90d1341d8b76af5c9181900360800190a1600091505b5092915050565b60007f96f29b65cebbd6816352fb242b6af7180b49e8a09e19e589225d35bc8444f0b73385856002811115610a5c57fe5b85600b811115610a6857fe5b60408051600160a060020a0395861681529390941660208401528284019190915260608201526000608082015290519081900360a00190a1826002811115610aac57fe5b949350505050565b600080610abf61140c565b600160f0430481016080830152600160a060020a0386811660008181526008602090815260408083205460e0880152805180830182528a81528752928252939093528220541615610b1e57610b17866002600b610a2b565b9350610e21565b60e082015115610bc257600060608301526040805160208101825260e084015181529083018190528251610b529190610ede565b602084015292506000836017811115610b6757fe5b14610b8557610b178660026004866017811115610b8057fe5b610f63565b6020808301516040805192830190526006548252610ba291610fed565b15610bbd57610b178660026006856020015160000151610f63565b610c79565b600160a060020a038616600081815260076020818152604080842080546060890190815282518085018452969095529290915260019091015483528401919091525115610c6757610c1b82604001518360000151610ff4565b8452151560a084015292506000836017811115610c3457fe5b14610c4d57610b178660026005866017811115610b8057fe5b8160a0015115610bbd5760408201515160c0830152610c79565b60408051602081018252868152908301525b610c868260400151611197565b15610c9857610b178660026007610a2b565b8151610ca390611197565b15610cb557610b178660026009610a2b565b600160a060020a03861660009081526008602052604090205415610ced57600160a060020a0386166000908152600860205260408120555b816060015182608001511115610d3d57604080518082018252608084015181528351516020808301918252600160a060020a038a1660009081526007909152929092209051815590516001909101555b50600160a060020a038516600090815260026020526040902054815151610d6590879061119c565b81515160408051600160a060020a0389168152602081018490528082018890526060810192909252517fdd71a1d19fcba687442a1d5c58578f1e409af71a79d10fd95a4d66efd8fa9ae79181900360800190a18160a0015115610e1c5760c082015182515160408051600160a060020a038a16815260208101899052808201939093526060830191909152517f7221f7a2708437039cc63319145b6b873a40594b9782a3bee45b975e2f3b0f689181900360800190a15b600093505b50505092915050565b6000610e346113fa565b600080600080610e4c88670de0b6b3a76400006111c7565b90945092506000846017811115610e5f57fe5b14610e80576040805160208101909152600081529395509293508492610ed3565b610e8a8388611211565b90925090506000826017811115610e9d57fe5b14610ebe576040805160208101909152600081529195509093508490610ed3565b60408051602081019091528181526000965094505b505050509250929050565b6000610ee86113fa565b610ef06113fa565b6000610efc8686610fed565b15610f2957610f0b8686611241565b925090506000816017811115610f1d57fe5b14610f2457fe5b610f4c565b610f338587611241565b925090506000816017811115610f4557fe5b14610f4c57fe5b610f56828761127b565b9350935050509250929050565b60007f96f29b65cebbd6816352fb242b6af7180b49e8a09e19e589225d35bc8444f0b73386866002811115610f9457fe5b86600b811115610fa057fe5b60408051600160a060020a0395861681529390941660208401528284019190915260608201526080810185905290519081900360a00190a1836002811115610fe457fe5b95945050505050565b5190511190565b600080610fff6113fa565b6110076113fa565b61100f6113fa565b6110176113fa565b61101f6113fa565b6110276113fa565b6040805160208181018352670de0b6b3a7640000825282519081019092526006548252955060009061105a90879061129e565b95509050600081601781111561106c57fe5b1461108f576040805160208101909152600080825291995090975095508761118a565b6110998b866112bd565b9350905060008160178111156110ab57fe5b146110ce576040805160208101909152600080825291995090975095508761118a565b6110d88a84610fed565b156110ed57600060018498509850985061118a565b60408051602081019091526006548152611108908790611241565b94509050600081601781111561111a57fe5b1461113d576040805160208101909152600080825291995090975095508761118a565b6111478b856112bd565b92509050600081601781111561115957fe5b1461116057fe5b61116a8a836113aa565b1561117f57600060018398509850985061118a565b6000808b9850985098505b5050505050509250925092565b511590565b6040805160208181018352928152600160a060020a0390931660009081526002909252902090519055565b600080808415156111de5760009250829150611209565b508383028385828115156111ee57fe5b0414611201576003925060009150611209565b600081925092505b509250929050565b600080821515611227575060059050600061123a565b6000838581151561123457fe5b04915091505b9250929050565b600061124b6113fa565b600080611260866000015186600001516113b1565b60408051602081019091529081529097909650945050505050565b60006112856113fa565b835183516112939190610e2a565b915091509250929050565b60006112a86113fa565b600080611260866000015186600001516113d4565b60006112c76113fa565b6000806000806000806112e28a600001518a600001516111c7565b909650945060008660178111156112f557fe5b1461131657604080516020810190915260008152959750949550869461139d565b6113286706f05b59d3b20000866113d4565b9094509250600084601781111561133b57fe5b1461135c57604080516020810190915260008152939750929550869261139d565b61136e83670de0b6b3a7640000611211565b9092509050600082601781111561138157fe5b1461138857fe5b60408051602081019091528181526000985096505b5050505050509250929050565b5190511090565b6000808383116113c857506000905081830361123a565b5060049050600061123a565b6000808383018481106113ed5760008192509250611209565b6003925060009150611209565b60408051602081019091526000815290565b610100604051908101604052806114216113fa565b815260200161142e6113fa565b815260200161143b6113fa565b81526020016000815260200160008152602001600015158152602001600081526020016000815250905600a165627a7a72305820606d3476f5c4301d964880efc77e49b2dd6117e1cc6bcb651ea64d02b3bca8e80029

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

000000000000000000000000612aca17160cc50b3aa777f9790615905d01c0bf0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000

-----Decoded View---------------
Arg [0] : _poster (address): 0x612acA17160cc50b3AA777F9790615905d01c0bF
Arg [1] : addr0 (address): 0x0000000000000000000000000000000000000000
Arg [2] : reader0 (address): 0x0000000000000000000000000000000000000000
Arg [3] : addr1 (address): 0x0000000000000000000000000000000000000000
Arg [4] : reader1 (address): 0x0000000000000000000000000000000000000000

-----Encoded View---------------
5 Constructor Arguments found :
Arg [0] : 000000000000000000000000612aca17160cc50b3aa777f9790615905d01c0bf
Arg [1] : 0000000000000000000000000000000000000000000000000000000000000000
Arg [2] : 0000000000000000000000000000000000000000000000000000000000000000
Arg [3] : 0000000000000000000000000000000000000000000000000000000000000000
Arg [4] : 0000000000000000000000000000000000000000000000000000000000000000


Deployed Bytecode Sourcemap

14967:22035:0:-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;17377:8;;;27923:365;;8:9:-1;5:2;;;30:1;27;20:12;5:2;-1:-1;27923:365:0;-1:-1:-1;;;;;27923:365:0;;;;;;;;;;;;;;;;;;;;;;;19396:26;;8:9:-1;5:2;;;30:1;27;20:12;5:2;19396:26:0;;;;;;;;-1:-1:-1;;;;;19396:26:0;;;;;;;;;;;;;;15260:50;;8:9:-1;5:2;;;30:1;27;20:12;5:2;15260:50:0;;;;16469:43;;8:9:-1;5:2;;;30:1;27;20:12;5:2;-1:-1;16469:43:0;-1:-1:-1;;;;;16469:43:0;;;;;22886:383;;8:9:-1;5:2;;;30:1;27;20:12;5:2;-1:-1;22886:383:0;;;;;;;27204:104;;8:9:-1;5:2;;;30:1;27;20:12;5:2;-1:-1;27204:104:0;-1:-1:-1;;;;;27204:104:0;;;;;36016:983;;8:9:-1;5:2;;;30:1;27;20:12;5:2;-1:-1;36016:983:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;36016:983:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;36016:983:0;;;;-1:-1:-1;36016:983:0;-1:-1:-1;36016:983:0;;-1:-1:-1;36016:983:0;;;;;;;;;-1:-1:-1;36016:983:0;;-1:-1:-1;36016:983:0;;-1:-1:-1;;;;;;;36016:983:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;8:100:-1;33:3;30:1;27:10;8:100;;;90:11;;;84:18;71:11;;;64:39;52:2;45:10;8:100;;;12:14;36016:983:0;;;;;;;;;;;;;;;;;19512:33;;8:9:-1;5:2;;;30:1;27;20:12;5:2;19512:33:0;;;;15124:45;;8:9:-1;5:2;;;30:1;27;20:12;5:2;15124:45:0;;;;16073:42;;8:9:-1;5:2;;;30:1;27;20:12;5:2;-1:-1;16073:42:0;-1:-1:-1;;;;;16073:42:0;;;;;15097:18;;8:9:-1;5:2;;;30:1;27;20:12;5:2;15097:18:0;;;;;;;;;;;;;;;;;;;;;;25690:1239;;8:9:-1;5:2;;;30:1;27;20:12;5:2;-1:-1;25690:1239:0;-1:-1:-1;;;;;25690:1239:0;;;;;20114:41;;8:9:-1;5:2;;;30:1;27;20:12;5:2;-1:-1;20114:41:0;-1:-1:-1;;;;;20114:41:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;19654:21;;8:9:-1;5:2;;;30:1;27;20:12;5:2;19654:21:0;;;;23805:653;;8:9:-1;5:2;;;30:1;27;20:12;5:2;-1:-1;23805:653:0;-1:-1:-1;;;;;23805:653:0;;;;;20228:46;;8:9:-1;5:2;;;30:1;27;20:12;5:2;-1:-1;20228:46:0;-1:-1:-1;;;;;20228:46:0;;;;;19853:19;;8:9:-1;5:2;;;30:1;27;20:12;5:2;19853:19:0;;;;24727:688;;8:9:-1;5:2;;;30:1;27;20:12;5:2;24727:688:0;;;;21051:626;;8:9:-1;5:2;;;30:1;27;20:12;5:2;-1:-1;21051:626:0;-1:-1:-1;;;;;21051:626:0;;;;;;;27923:365;28083:6;;28001:4;;-1:-1:-1;;;;;28083:6:0;28069:10;:20;28065:149;;28113:89;28124:5;28131:24;28157:44;28113:10;:89::i;:::-;28106:96;;;;28065:149;28233:47;28250:5;28257:22;28233:16;:47::i;:::-;28226:54;;27923:365;;;;;:::o;19396:26::-;;;-1:-1:-1;;;;;19396:26:0;;:::o;15260:50::-;15301:8;15260:50;:::o;16469:43::-;;;;;;;;;;;;;:::o;22886:383::-;23017:11;;22943:4;;-1:-1:-1;;;;;23017:11:0;23003:10;:25;22999:146;;23052:81;23063:1;23066:24;23092:40;23052:10;:81::i;:::-;23045:88;;;;22999:146;23157:6;:23;;;;;-1:-1:-1;;23157:23:0;;;;;;;;23196:25;;;;;;;;;;;;;;;;23246:14;23241:20;23234:27;;22886:383;;;;:::o;27204:104::-;27258:4;27282:18;27294:5;27282:11;:18::i;36016:983::-;36144:13;;36185:30;;36324:6;;36101;;36144:13;36185:30;36101:6;;36127:14;;-1:-1:-1;;;;;36324:6:0;36310:10;:20;36306:215;;36356:13;;;36367:1;36356:13;;;;;;;;;;;;;;;;105:10:-1;36356:13:0;88:34:-1;136:17;;-1:-1;36356:13:0;36347:22;;36396:85;36407:1;36410:24;36436:44;36396:10;:85::i;:::-;36384:6;36391:1;36384:9;;;;;;;;;;;;;;;;;;:97;36503:6;;-1:-1:-1;36503:6:0;;36496:13;;36306:215;36538:14;;;36537:44;;;36571:9;36558;:22;;36537:44;36533:247;;;36607:13;;;36618:1;36607:13;;;;;;;;;;;;;;;;105:10:-1;36607:13:0;88:34:-1;136:17;;-1:-1;36607:13:0;36598:22;;36647:93;36658:1;36661:31;36694:45;36647:10;:93::i;36533:247::-;36812:9;36801:21;;;;;;;;;;;;;;;;;;;;;;29:2:-1;21:6;17:15;117:4;105:10;97:6;88:34;136:17;;-1:-1;36801:21:0;;36792:30;;36849:1;36840:10;;36835:131;36856:9;36852:1;:13;36835:131;;;36899:55;36916:6;36923:1;36916:9;;;;;;;;;;;;;;;;;;36927:23;36951:1;36927:26;;;;;;;;;;;;;;;;;;36899:16;:55::i;:::-;36887:6;36894:1;36887:9;;;;;;;;;;;;;;;;;;:67;36867:3;;36835:131;;;36985:6;36978:13;;36016:983;;;;;;;;;:::o;19512:33::-;;;-1:-1:-1;;;;;19512:33:0;;:::o;15124:45::-;15166:3;15124:45;:::o;16073:42::-;;;;;;;;;;;;-1:-1:-1;;;;;16073:42:0;;:::o;15097:18::-;;;;;;:::o;25690:1239::-;25747:4;26381:17;26400:15;26501:11;26514:22;;:::i;:::-;26263:6;;;;26259:663;;;26293:1;26286:8;;;;26259:663;-1:-1:-1;;;;;26331:14:0;;;26357:1;26331:14;;;:7;:14;;;;;;;:28;26327:584;;-1:-1:-1;;;;;26419:14:0;;;;;;;:7;:14;;;;;;;:21;;;;;;;:14;;;;;:19;;:21;;;;;:14;:21;;;;;;;;:14;:21;;;5:2:-1;;;;30:1;27;20:12;5:2;26419:21:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;26419:21:0;;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;26419:21:0;;;;;;;;;-1:-1:-1;26419:21:0;-1:-1:-1;26461:359:0;;;;26540:39;9212:6;26568:9;26540:6;:39::i;:::-;26500:79;;-1:-1:-1;26500:79:0;-1:-1:-1;26617:14:0;26608:5;:23;;;;;;;;;26604:88;;26667:1;26660:8;;;;26604:88;26723:20;;;-1:-1:-1;26716:27:0;;26461:359;26799:1;26792:8;;;;26327:584;-1:-1:-1;;;;;26867:19:0;;;;;;:12;:19;;;;;:28;;-1:-1:-1;26327:584:0;25690:1239;;;;;;;:::o;20114:41::-;;;;;;;;;;;;;;;;;;;:::o;19654:21::-;;;-1:-1:-1;;;;;19654:21:0;;:::o;23805:653::-;23958:11;;23884:4;;;;-1:-1:-1;;;;;23958:11:0;23944:10;:25;23940:160;;23993:95;24004:1;24007:24;24033:54;23993:10;:95::i;:::-;23986:102;;;;23940:160;-1:-1:-1;24205:18:0;;;-1:-1:-1;;;;;24283:42:0;;;-1:-1:-1;;24283:42:0;;;;;;;24343:67;;;24205:18;;;;24343:67;;;;;;;;;;;;;;;;;;;;;;;24435:14;24423:27;;23805:653;;;;;:::o;20228:46::-;;;;;;;;;;;;;:::o;19853:19::-;;;;:::o;24727:688::-;24891:18;;24773:4;;;;-1:-1:-1;;;;;24891:18:0;24877:10;:32;24873:177;;24933:105;24944:1;24947:24;24973:64;24933:10;:105::i;:::-;24926:112;;;;24873:177;-1:-1:-1;25139:11:0;;;25220:18;;;-1:-1:-1;;25206:32:0;;;-1:-1:-1;;;;;25220:18:0;;;25206:32;;;;;;;25285:22;;;25325:42;;;25139:11;;;;25325:42;;;25356:10;25325:42;;;;;;25139:11;;25325:42;;;;;;;;;25392:14;25380:27;;24727:688;;;:::o;21051:626::-;21289:11;;21130:4;;;;-1:-1:-1;;;;;21289:11:0;21275:10;:25;21271:163;;21324:98;21335:5;21342:24;21368:53;21324:10;:98::i;:::-;21317:105;;;;21271:163;-1:-1:-1;;;;;;21468:21:0;;;;;;:14;:21;;;;;;;;;;;21500:38;;;;21556:67;;21573:10;21556:67;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;21648:20;21636:33;;21051:626;;;;;;:::o;18659:211::-;18753:4;18775:58;18789:10;18801:5;18813:3;18808:9;;;;;;;;18824:4;18819:10;;;;;;;;18775:58;;;-1:-1:-1;;;;;18775:58:0;;;;;;;;;;;;;;;;;;;;;;;;18831:1;18775:58;;;;;;;;;;;;;;18858:3;18853:9;;;;;;;;18846:16;18659:211;-1:-1:-1;;;;18659:211:0:o;28296:4626::-;28384:4;28445:9;28465:34;;:::i;:::-;28756:1;15166:3;28719:12;:33;28718:39;;28692:23;;;:65;-1:-1:-1;;;;;28802:21:0;;;32367:18;28802:21;;;:14;:21;;;;;;;;;28768:31;;;:55;28852:40;;;;;;;;;;28834:58;;28909:14;;;;;;;;;;;:28;28905:163;;28961:95;28972:5;28979:31;29012:43;28961:10;:95::i;:::-;28954:102;;;;28905:163;29084:31;;;;:36;29080:1916;;29250:1;29225:22;;;:26;29290:49;;;;;;;;29306:31;;;;29290:49;;29266:21;;;:73;;;29506:15;;29468:54;;29290:49;29468:14;:54::i;:::-;29449:15;;;29443:79;;-1:-1:-1;29548:14:0;29541:3;:21;;;;;;;;;29537:186;;29590:117;29612:5;29619:31;29652:43;29702:3;29697:9;;;;;;;;29590:21;:117::i;29537:186::-;29801:15;;;;;29786:41;;;;;;;;29818:8;29786:41;;;;;:14;:41::i;:::-;29782:221;;;29855:132;29877:5;29884:31;29917:43;29962:9;:15;;;:24;;;29855:21;:132::i;29782:221::-;29080:1916;;;-1:-1:-1;;;;;30060:14:0;;;;;;:7;:14;;;;;;;;:21;;30035:22;;;:46;;;30120;;;;;;;30136:14;;;;;;;;:28;;;;;30120:46;;30096:21;;:70;;;;30187:22;:27;30183:802;;30283:48;30292:9;:21;;;30315:9;:15;;;30283:8;:48::i;:::-;30235:96;;;;30241:21;;;30235:96;;-1:-1:-1;30264:15:0;30354:3;:21;;;;;;;;;30350:189;;30407:112;30429:5;30436:31;30469:38;30514:3;30509:9;;;;;;;30350:189;30561:9;:21;;;30557:183;;;30690:21;;;;:30;30651:36;;;:69;30183:802;;;30929:40;;;;;;;;;;;30905:21;;;:64;30183:802;31260:32;31270:9;:21;;;31260:9;:32::i;:::-;31256:306;;;31433:117;31444:5;31451:31;31484:65;31433:10;:117::i;31256:306::-;31588:15;;31578:26;;:9;:26::i;:::-;31574:156;;;31628:90;31639:5;31646:31;31679:38;31628:10;:90::i;31574:156::-;-1:-1:-1;;;;;31865:21:0;;;;;;:14;:21;;;;;;:26;31861:84;;-1:-1:-1;;;;;31908:21:0;;31932:1;31908:21;;;:14;:21;;;;;:25;31861:84;32203:9;:22;;;32177:9;:23;;;:48;32173:182;;;32259:84;;;;;;;;32276:23;;;;32259:84;;32317:15;;:24;32259:84;;;;;;;-1:-1:-1;;;;;32242:14:0;;-1:-1:-1;32242:14:0;;;:7;:14;;;;;;;:101;;;;;;;;;;;32173:182;-1:-1:-1;;;;;;32388:19:0;;;;;;:12;:19;;;;;:28;32460:15;;:24;32429:56;;32401:5;;32429:23;:56::i;:::-;32561:15;;:24;32503:83;;;-1:-1:-1;;;;;32503:83:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;32603:9;:21;;;32599:270;;;32794:36;;;;32832:15;;:24;32745:112;;;-1:-1:-1;;;;;32745:112:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;32599:270;32893:20;32881:33;;28296:4626;;;;;;;;:::o;9470:483::-;9531:5;9538:3;;:::i;:::-;9562:10;9574:20;9728:10;9740:13;9598:18;9602:3;9041:6;9598:3;:18::i;:::-;9561:55;;-1:-1:-1;9561:55:0;-1:-1:-1;9639:14:0;9631:4;:22;;;;;;;;;9627:88;;9684:18;;;;;;;;;-1:-1:-1;9684:18:0;;9678:4;;-1:-1:-1;9684:18:0;;-1:-1:-1;9678:4:0;;9670:33;;9627:88;9757:27;9761:15;9778:5;9757:3;:27::i;:::-;9727:57;;-1:-1:-1;9727:57:0;-1:-1:-1;9807:14:0;9799:4;:22;;;;;;;;;9795:88;;9852:18;;;;;;;;;-1:-1:-1;9852:18:0;;9846:4;;-1:-1:-1;9852:18:0;;-1:-1:-1;9846:4:0;;9838:33;;9795:88;9919:25;;;;;;;;;;;;9903:14;;-1:-1:-1;9919:25:0;-1:-1:-1;9470:483:0;;;;;;;;;;:::o;33185:627::-;33274:5;33281:3;;:::i;:::-;33304:20;;:::i;:::-;33335:9;33361:34;33376:11;33389:5;33361:14;:34::i;:::-;33357:398;;;33431:26;33438:11;33451:5;33431:6;:26::i;:::-;33412:45;-1:-1:-1;33412:45:0;-1:-1:-1;33518:14:0;33511:3;:21;;;;;;;;;33504:29;;;;33357:398;;;33585:26;33592:5;33599:11;33585:6;:26::i;:::-;33566:45;-1:-1:-1;33566:45:0;-1:-1:-1;33728:14:0;33721:3;:21;;;;;;;;;33714:29;;;;33774:30;33781:9;33792:11;33774:6;:30::i;:::-;33767:37;;;;33185:627;;;;;;;:::o;19009:242::-;19128:4;19150:64;19164:10;19176:5;19188:3;19183:9;;;;;;;;19199:4;19194:10;;;;;;;;19150:64;;;-1:-1:-1;;;;;19150:64:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;19239:3;19234:9;;;;;;;;19227:16;19009:242;-1:-1:-1;;;;;19009:242:0:o;14630:144::-;14752:14;14736:13;;:30;;14630:144::o;33820:1620::-;33903:5;33910:4;33916:3;;:::i;:::-;33939:14;;:::i;:::-;33996:26;;:::i;:::-;34033:27;;:::i;:::-;34071:14;;:::i;:::-;34096;;:::i;:::-;33956:29;;;;;;;;;9212:6;33956:29;;34212:21;;;;;;;;34224:8;34212:21;;;33956:29;-1:-1:-1;34165:9:0;;34212:21;;33956:29;;34212:6;:21::i;:::-;34187:46;-1:-1:-1;34187:46:0;-1:-1:-1;34255:14:0;34248:3;:21;;;;;;;;;34244:94;;34306:19;;;;;;;;;34299:5;34306:19;;;34294:3;;-1:-1:-1;34299:5:0;;-1:-1:-1;34306:19:0;-1:-1:-1;34294:3:0;34286:40;;34244:94;34410:36;34417:11;34430:15;34410:6;:36::i;:::-;34397:49;-1:-1:-1;34397:49:0;-1:-1:-1;34468:14:0;34461:3;:21;;;;;;;;;34457:94;;34519:19;;;;;;;;;34512:5;34519:19;;;34507:3;;-1:-1:-1;34512:5:0;;-1:-1:-1;34519:19:0;-1:-1:-1;34507:3:0;34499:40;;34457:94;34672:26;34687:5;34694:3;34672:14;:26::i;:::-;34668:93;;;34723:14;34739:4;34745:3;34715:34;;;;;;;;34668:93;34799:21;;;;;;;;;34811:8;34799:21;;;;;34806:3;;34799:6;:21::i;:::-;34773:47;-1:-1:-1;34773:47:0;-1:-1:-1;34842:14:0;34835:3;:21;;;;;;;;;34831:94;;34893:19;;;;;;;;;34886:5;34893:19;;;34881:3;;-1:-1:-1;34886:5:0;;-1:-1:-1;34893:19:0;-1:-1:-1;34881:3:0;34873:40;;34831:94;34997:37;35004:11;35017:16;34997:6;:37::i;:::-;34984:50;-1:-1:-1;34984:50:0;-1:-1:-1;35159:14:0;35152:3;:21;;;;;;;;;35145:29;;;;35297:23;35309:5;35316:3;35297:11;:23::i;:::-;35293:90;;;35345:14;35361:4;35367:3;35337:34;;;;;;;;35293:90;35403:14;35419:5;35426;35395:37;;;;;;33820:1620;;;;;;;;;;;;:::o;14851:111::-;14935:14;:19;;14851:111::o;32979:151::-;33092:30;;;;;;;;;;;;-1:-1:-1;;;;;33070:19:0;;;-1:-1:-1;33070:19:0;;;:12;:19;;;;;:52;;;;32979:151::o;7073:323::-;7125:5;;;7153:6;;7149:65;;;7184:14;;-1:-1:-1;7184:14:0;;-1:-1:-1;7176:26:0;;7149:65;-1:-1:-1;7235:5:0;;;7239:1;7235;:5;7257;;;;;;;;:10;7253:136;;7292:22;;-1:-1:-1;7316:1:0;;-1:-1:-1;7284:34:0;;7253:136;7359:14;7375:1;7351:26;;;;7253:136;7073:323;;;;;;:::o;7491:199::-;7543:5;;7571:6;;7567:73;;;-1:-1:-1;7602:22:0;;-1:-1:-1;7626:1:0;7594:34;;7567:73;7660:14;7680:1;7676;:5;;;;;;;;7652:30;;;;7491:199;;;;;;:::o;10349:213::-;10416:5;10423:3;;:::i;:::-;10447:11;10460;10475:27;10479:1;:10;;;10491:1;:10;;;10475:3;:27::i;:::-;10530:23;;;;;;;;;;;;10446:56;;10530:23;;-1:-1:-1;10349:213:0;-1:-1:-1;;;;;10349:213:0:o;13520:142::-;13587:5;13594:3;;:::i;:::-;13631:10;;13643;;13624:30;;13631:10;13624:6;:30::i;:::-;13617:37;;;;13520:142;;;;;:::o;10042:213::-;10109:5;10116:3;;:::i;:::-;10140:11;10153;10168:27;10172:1;:10;;;10184:1;:10;;;10168:3;:27::i;12189:1088::-;12256:5;12263:3;;:::i;:::-;12289:10;12301:24;12772:10;12784:37;12975:10;12987:12;12329:27;12333:1;:10;;;12345:1;:10;;;12329:3;:27::i;:::-;12288:68;;-1:-1:-1;12288:68:0;-1:-1:-1;12379:14:0;12371:4;:22;;;;;;;;;12367:88;;12424:18;;;;;;;;;-1:-1:-1;12424:18:0;;12418:4;;-1:-1:-1;12424:18:0;;-1:-1:-1;12418:4:0;;12410:33;;12367:88;12825:38;9114:10;12843:19;12825:3;:38::i;:::-;12771:92;;-1:-1:-1;12771:92:0;-1:-1:-1;12886:14:0;12878:4;:22;;;;;;;;;12874:88;;12931:18;;;;;;;;;-1:-1:-1;12931:18:0;;12925:4;;-1:-1:-1;12931:18:0;;-1:-1:-1;12925:4:0;;12917:33;;12874:88;13003:47;13007:32;9041:6;13003:3;:47::i;:::-;12974:76;;-1:-1:-1;12974:76:0;-1:-1:-1;13192:14:0;13184:4;:22;;;;;;;;;13177:30;;;;13244:24;;;;;;;;;;;;13228:14;;-1:-1:-1;13244:24:0;-1:-1:-1;12189:1088:0;;;;;;;;;;;;:::o;14120:198::-;14239:14;14223:13;;:30;;14120:198::o;7825:220::-;7877:5;;7905:6;;;7901:137;;-1:-1:-1;7936:14:0;;-1:-1:-1;7952:5:0;;;7928:30;;7901:137;-1:-1:-1;7999:23:0;;-1:-1:-1;8024:1:0;7991:35;;8130:242;8182:5;;8215;;;8237:6;;;8233:132;;8268:14;8284:1;8260:26;;;;;;8233:132;8327:22;;-1:-1:-1;8351:1:0;;-1:-1:-1;8319:34:0;;14967:22035;;;;;;;;;;-1:-1:-1;14967:22035:0;;;:::o;:::-;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o

Swarm Source

bzzr://606d3476f5c4301d964880efc77e49b2dd6117e1cc6bcb651ea64d02b3bca8e8

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.