Use Data Feed On-chain

Reading data feeds on-chain

To consume price data, your smart contract should reference IAggregator.sol, which defines the external functions implemented by Data Feeds.

IAggregator.sol

// SPDX-License-Identifier: LGPL-3.0
pragma solidity 0.8.20;

interface IAggregator {
  /**
   * @notice median from the most recent report
   */
  function latestAnswer() external view returns (int256);

  /**
   * @notice timestamp of block in which last report was transmitted
   */
  function latestTimestamp() external view returns (uint256);

  /**
   * @notice Aggregator round (NOT OCR round) in which last report was transmitted
   */
  function latestRound() external view returns (uint256);

  /**
   * @notice median of report from given aggregator round (NOT OCR round)
   * @param _roundId the aggregator round of the target report
   */
  function getAnswer(uint256 _roundId) external view returns (int256);

  /**
   * @notice timestamp of block in which report from given aggregator round was transmitted
   * @param _roundId aggregator round (NOT OCR round) of target report
   */
  function getTimestamp(uint256 _roundId) external view returns (uint256);

  /**
   * @return answers are stored in fixed-point format, with this many digits of precision
   */
  function decimals() external view returns (uint8);

  /**
   * @notice human-readable description of observable this contract is reporting on
   */
  function description() external view returns (string memory);

  /**
   * @notice aggregator contract version
   */
  function version() external view returns (uint256);

  /**
   * @notice details for the given aggregator round
   * @param _roundId target aggregator round (NOT OCR round). Must fit in uint32
   * @return roundId _roundId
   * @return answer median of report from given _roundId
   * @return startedAt timestamp of block in which report from given _roundId was transmitted
   * @return updatedAt timestamp of block in which report from given _roundId was transmitted
   * @return answeredInRound _roundId
   */
  function getRoundData(
    uint80 _roundId
  ) external view returns (uint80 roundId, int256 answer, uint256 startedAt, uint256 updatedAt, uint80 answeredInRound);

  /**
   * @notice aggregator details for the most recently transmitted report
   * @return roundId aggregator round of latest report (NOT OCR round)
   * @return answer median of latest report
   * @return startedAt timestamp of block containing latest report
   * @return updatedAt timestamp of block containing latest report
   * @return answeredInRound aggregator round of latest report
   */
  function latestRoundData()
    external
    view
    returns (uint80 roundId, int256 answer, uint256 startedAt, uint256 updatedAt, uint80 answeredInRound);
}

Example

// SPDX-License-Identifier: LGPL-3.0
pragma solidity 0.8.20;

import {IAggregator} from "../interfaces/IAggregator.sol";

/**
 * THIS IS AN EXAMPLE CONTRACT THAT USES HARDCODED
 * VALUES FOR CLARITY.
 * THIS IS AN EXAMPLE CONTRACT THAT USES UN-AUDITED CODE.
 * DO NOT USE THIS CODE IN PRODUCTION.
 */
contract DataConsumer {
    IAggregator internal dataFeed;

    /**
     * Network: ArbitrumSepolia
     * Aggregator: ETH/USD
     * Address: 0xbF13EE58Bf62500FE87e7389faB633ff95dec029
     */
    constructor() {
        dataFeed = IAggregator(
            0xbF13EE58Bf62500FE87e7389faB633ff95dec029
        );
    }

    /**
     * Returns the latest answer.
     */
    function getBracleDataFeedLatestAnswer() public view returns (int) {
        // prettier-ignore
        (
            /* uint80 roundID */,
            int answer,
            /*uint startedAt*/,
            /*uint timeStamp*/,
            /*uint80 answeredInRound*/
        ) = dataFeed.latestRoundData();
        return answer;
    }
}

Last updated