pragma solidity ^0.8.21;
Импортируйте "@chainlink/contracts/src/v0.8/interfaces/AggregatorV3Interface.sol";
контракт OracleIntegratedContract {
    AggregatorV3Interface internal priceFeed;
// Видимость для конструктора удалена
constructor(address _priceFeed) {
    priceFeed = AggregatorV3Interface(_priceFeed);
}
1. 
В этом сегменте мы указали, что в нашем контракте будет использоваться цепная ценовая лента. Конструктор принимает адрес контракта на подачу цены в сети Ethereum.
1. 
Получение данных из Oracle
1. 
Давайте расширим наш контракт, чтобы получить последнюю цену Ethereum:
Solidity
function getLatestEthPrice() public view returns (int) {
        (,int price,,,) = priceFeed.latestRoundData();
        return price;
    }
1. 
Функция `latestRoundData()` из интерфейса Chainlink Aggregator предоставляет нам различные данные, включая самую последнюю цену.
## Работа с ответами Oracle: Управление данными после их получения
Данные, получаемые от оракулов, часто приходят в сырых форматах, которые могут не сразу подходить для наших нужд. Крайне важно правильно обрабатывать эти данные в наших смарт-контрактах:
1. 
Форматирование данных
1. 
Допустим, оракул возвращает цену Ethereum в USD, но умноженную на 10^8, чтобы гарантировать отсутствие десятичных дробей (что часто встречается в оракулах). Чтобы получить фактическую цену, Вам необходимо отформатировать данные:
Solidity
 function getFormattedEthPrice() public view returns (int) {
        int rawPrice = getLatestEthPrice();
        return rawPrice / 10**8;
    }
1. 
Эта функция получает исходную цену, затем делит ее на 10^8, чтобы получить реальное значение.
1. 
Обработка ошибок
1. 
Всегда учитывайте возможность того, что оракул не сможет получить данные:
Solidity
 function safeGetLatestEthPrice() public view returns (int) {
        (,int price,,uint256 timestamp,) = priceFeed.latestRoundData();
        require(timestamp > 0, “Failed to fetch data from the oracle”);
        return price;
    }
1. 
Здесь функция `latestRoundData()` также предоставляет временную метку. Если временная метка равна 0, это, скорее всего, означает, что оракул не смог получить данные, и мы справимся с этим с помощью оператора `require`.
Ваш полный код должен выглядеть следующим образом:
Solidity
// SPDX-License-Identifier: MIT
pragma solidity ^0.8.21;
Импортируйте "@chainlink/contracts/src/v0.8/interfaces/AggregatorV3Interface.sol";
контракт OracleIntegratedContract {
    AggregatorV3Interface internal priceFeed;
// Видимость для конструктора удалена
constructor(address _priceFeed) {
    priceFeed = AggregatorV3Interface(_priceFeed);
}
function getLatestEthPrice() public view returns (int) {
    (,int price,,,) = priceFeed.latestRoundData();
    return price;
}
function getFormattedEthPrice() public view returns (int) {
    int rawPrice = getLatestEthPrice();
    return rawPrice / 10**8;
}
function safeGetLatestEthPrice() public view returns (int) {
    (,int price,,uint256 timestamp,) = priceFeed.latestRoundData();
    require(timestamp > 0, "Failed to fetch data from the oracle");
    return price;
}
}
```

К концу этого урока у Вас должен быть базовый оракл-интегрированный смарт-контракт, разработанный в Remix. Этот контракт извлекает последнюю цену Ethereum и обрабатывает возвращенные данные. В наших следующих уроках мы развернем этот контракт и более подробно рассмотрим лучшие практики и нюансы.