abstract contract PriceOracle {
    /// @notice Indicator that this is a PriceOracle contract (for inspection)
    bool public constant isPriceOracle = true;

    /**
      * @notice Get the underlying price of a cToken asset
      * @param cToken The cToken to get the underlying price of
      * @return The underlying asset price mantissa (scaled by 1e18).
      *  Zero means the price is unavailable.
      */
    function getUnderlyingPrice(CToken cToken) external virtual returns (uint);

    function getUnderlyingPriceView(CToken cToken) public view virtual returns (uint);
}
function getUnderlyingPrice(CToken cToken) external virtual returns (uint);

/**
 * @notice Get the underlying price of a cToken asset
 * @param cToken The cToken to get the underlying price of
 * @return The underlying asset price mantissa (scaled by 1e18).
 *  Zero means the price is unavailable.
 */