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

До кінця цього уроку ви повинні мати базовий інтегрований з Oracle смарт-контракт, складений у Remix. Цей контракт отримує останню ціну Ethereum і обробляє повернуті дані. У наших наступних уроках ми розгорнемо цей договір і детальніше розглянемо найкращі практики та нюанси.