ChainlinkOracleImpl

Git Source

Inherits: OracleError, ChainlinkStructs

This contract is used to get the exchange rate via up to 3 hops at Chainlink price feeds. The rate is multiplied with the previous rate at each hop. E.g. to go from wBTC to USDC (assuming rates for example):

  1. wBTC -> BTC https://data.chain.link/ethereum/mainnet/crypto-other/wbtc-btc, rate: 0.92.
  2. BTC -> USD https://data.chain.link/ethereum/mainnet/crypto-usd/btc-usd rate: 30,000.
  3. USD -> USDC https://data.chain.link/ethereum/mainnet/stablecoins/usdc-usd rate: 0.98. Must invert feed: 1.02 finale rate would be: 0.92 * 30,000 * 1.02 = 28,152

State Variables

Chainlink price feed 1 to check for the exchange rate

IChainlinkAggregatorV3 internal immutable _CHAINLINK_FEED1;

Chainlink price feed 2 to check for the exchange rate

IChainlinkAggregatorV3 internal immutable _CHAINLINK_FEED2;

Chainlink price feed 3 to check for the exchange rate

IChainlinkAggregatorV3 internal immutable _CHAINLINK_FEED3;

Flag to invert the price or not for feed 1 (to e.g. for WETH/USDC pool return prive of USDC per 1 WETH)

bool internal immutable _CHAINLINK_INVERT_RATE1;

Flag to invert the price or not for feed 2 (to e.g. for WETH/USDC pool return prive of USDC per 1 WETH)

bool internal immutable _CHAINLINK_INVERT_RATE2;

Flag to invert the price or not for feed 3 (to e.g. for WETH/USDC pool return prive of USDC per 1 WETH)

bool internal immutable _CHAINLINK_INVERT_RATE3;

constant value for price scaling to reduce gas usage for feed 1

uint256 internal immutable _CHAINLINK_PRICE_SCALER_MULTIPLIER1;

constant value for inverting price to reduce gas usage for feed 1

uint256 internal immutable _CHAINLINK_INVERT_PRICE_DIVIDEND1;

constant value for price scaling to reduce gas usage for feed 2

uint256 internal immutable _CHAINLINK_PRICE_SCALER_MULTIPLIER2;

constant value for inverting price to reduce gas usage for feed 2

uint256 internal immutable _CHAINLINK_INVERT_PRICE_DIVIDEND2;

constant value for price scaling to reduce gas usage for feed 3

uint256 internal immutable _CHAINLINK_PRICE_SCALER_MULTIPLIER3;

constant value for inverting price to reduce gas usage for feed 3

uint256 internal immutable _CHAINLINK_INVERT_PRICE_DIVIDEND3;

Functions

constructor

constructor sets the Chainlink price feed and invertRate flag for each hop. E.g. invertRate_ should be true if for the USDC/ETH pool it's expected that the oracle returns USDC per 1 ETH

constructor(ChainlinkConstructorParams memory params_);

_getChainlinkExchangeRate

Get the exchange rate from Chainlike oracle price feed(s)

function _getChainlinkExchangeRate() internal view returns (uint256 rate_);

Returns

NameTypeDescription
rate_uint256The exchange rate in OracleUtils.RATE_OUTPUT_DECIMALS

_readFeedRate

reads the exchange rate_ from a Chainlink price feed_ taking into account scaling and invertRate_

function _readFeedRate(
    IChainlinkAggregatorV3 feed_,
    bool invertRate_,
    uint256 priceMultiplier_,
    uint256 invertDividend_
) private view returns (uint256 rate_);

chainlinkOracleData

returns all Chainlink oracle related data as utility for easy off-chain use / block explorer in a single view method

function chainlinkOracleData()
    public
    view
    returns (
        uint256 chainlinkExchangeRate_,
        IChainlinkAggregatorV3 chainlinkFeed1_,
        bool chainlinkInvertRate1_,
        uint256 chainlinkExchangeRate1_,
        IChainlinkAggregatorV3 chainlinkFeed2_,
        bool chainlinkInvertRate2_,
        uint256 chainlinkExchangeRate2_,
        IChainlinkAggregatorV3 chainlinkFeed3_,
        bool chainlinkInvertRate3_,
        uint256 chainlinkExchangeRate3_
    );