> For the complete documentation index, see [llms.txt](https://docs.rome.builders/llms.txt). Markdown versions of documentation pages are available by appending `.md` to page URLs; this page is available as [Markdown](https://docs.rome.builders/ru/produkty/oracle-gateway.md).

# Oracle Gateway

Oracle Gateway предоставляет нативные для Solana источники цен (Pyth, Switchboard V3) через `AggregatorV3Interface`, поэтому Ethereum-протоколы, переносящиеся в Rome, сохраняют существующий код интеграции с оракулом. **Oracle Gateway V2 запущен в каждой публичной сети**, с keeper’ом, гарантирующим актуальность фидов, и клиентским порталом для регистрации. Адаптеры, фабрика и модель keeper’а описаны в [rome-oracle-gateway](https://github.com/rome-protocol/rome-oracle-gateway) репозитории.

## Проблема

Ethereum DeFi ожидает от Chainlink'а `AggregatorV3Interface`:

```solidity
(, int256 price,,,) = priceFeed.latestRoundData();
```

Поставщики оракулов Solana (Pyth, Switchboard) используют разные форматы данных. Без адаптации каждому перенесённому протоколу потребовался бы собственный код для оракула.

## Решение

Oracle Gateway V2 разворачивает лёгкие контракты-адаптеры, которые:

1. Читают данные о цене напрямую из аккаунтов Pyth или Switchboard в Solana (кросс-состояние, а не CPI)
2. Разбирают ончейн-данные
3. Нормализуют цены до 8 знаков после запятой
4. Предоставляют стандартный интерфейс Chainlink `AggregatorV3Interface`

```solidity
import {IAggregatorV3Interface} from "@rome-protocol/rome-solidity/contracts/oracle/IAggregatorV3Interface.sol";

// Тот же интерфейс, что и у Chainlink в Ethereum
(, int256 price,,,) = IAggregatorV3Interface(ADAPTER).latestRoundData();
// price = SOL/USD с 8 знаками после запятой (например, 15000000000 = $150.00)
```

## Получить доступ к фиду в три шага

1. **Получите адрес адаптера из реестра** — никогда не жёстко кодируйте его:

```ts
import { getOracle } from "@rome-protocol/registry";
const solUsd = getOracle(200010).feeds["SOL/USD"].address;
// Hadrian сегодня: 0x76b92646D63FB1AFEa687C7Dac48b437bF99C1B4
```

2. **Прочитайте его** с интерфейсом, который ваш протокол уже использует — `IAggregatorV3Interface(solUsd).latestRoundData()`. Просроченный или неинициализированный фид **возвращает ошибку** вместо выдачи замороженной цены.
3. **Несколько фидов одновременно?** `BatchReader.getLatestPrices(adapters[])` (Hadrian: `0x306d670dff7f51ae33f263f5122bd2b18d98adc7`) — и `getFeedHealth(adapters[])` перед тем как на них полагаться. Кэшированные адаптеры позволяют каждому потребителю выполнять обычный `SLOAD`, поэтому многоканальные транзакции (заём под несколько залогов, просмотр портфеля) остаются дешёвыми.

[cardo](https://github.com/rome-protocol/cardo) использует эти фиды в production уже сегодня. Поскольку поверхность в точности `AggregatorV3Interface`, протоколы класса Compound и Aave **подключаются без доработок** — укажите в конфигурации источников цен адреса адаптеров; их код оракула не требует никаких изменений.

## Типы адаптеров

* **PythPullAdapter** — читает аккаунты цен Pyth (цена, доверительный интервал, EMA, время публикации).
* **SwitchboardV3Adapter** — читает аккаунты агрегации Switchboard (цена, метка времени; без EMA).
* **CachedPyth / CachedFeed adapters** — варианты с кэшированием для эффективного по CU чтения.

Адаптеры разворачиваются как минимальные прокси-клоны EIP-1167 фабрикой `OracleAdapterFactory` и предоставляют расширенный интерфейс вместе с `AggregatorV3Interface` (`latestPriceData`, `maxStaleness`, `oracleType`, а также `metadata()` интерфейс (используется для проверок состояния).

## Актуальность — oracle-keeper

Адаптеры обеспечивают `maxStaleness` окно: если `block.timestamp - publishTime > maxStaleness`, чтение завершается с откатом. В основной сети Solana у Pyth работают production keeper’ы. В devnet Solana (где находятся публичные сети) pushers Pyth работают по best effort, поэтому Rome запускает собственный **oracle-keeper** sidecar, чтобы поддерживать базовые аккаунты Pyth в актуальном состоянии. Актуальность отслеживается и по ней настроены оповещения.

Проверяйте состояние фида с помощью `BatchReader.getFeedHealth` (который читает `metadata()`), а не только `latestRoundData` — фид может быть доступен, но устареть.

## Клиентский портал

Регистрируйте фиды и настраивайте потребителей по каждой сети через [портал Oracle Gateway](https://oracle.testnet.romeprotocol.xyz/). См. [страницу портала](/ru/prilozheniya-na-rome/oracle-gateway.md) для описания того, что он покрывает.

## Развёрнутые адреса

Канонические адреса по каждой сети (фабрики, реализации адаптеров и активные фиды) находятся в [реестре](https://github.com/rome-protocol/rome-registry/tree/main/chains). Основные фабрики:

| Контракт             | Hadrian                                      | Martius                                      |
| -------------------- | -------------------------------------------- | -------------------------------------------- |
| OracleAdapterFactory | `0xe68e7bc697010c73f1798b356f8ae2f0ba1319db` | `0xbc06fe9603a02ff4aead265c253f5c6303ee5fbb` |
| BatchReader          | `0x306d670dff7f51ae33f263f5122bd2b18d98adc7` | `0xc5e6d932bfd2b4da27643848063905f46861fae8` |

## Ограничения

* **Нет исторических данных раунда** — `getRoundData(roundId)` возвращает ошибку; поддерживается только `latestRoundData()` .
* **EMA Switchboard не поддерживается** — данные EMA доступны только для Pyth.
* **Старение по сети** — `maxStaleness` задаётся для каждой среды при запуске: адаптеры прямого чтения (Pyth-read) по умолчанию имеют \~60 секунд; кэшированные адаптеры — 3600 секунд (keeper обновляет их значительно чаще — сегодня примерно каждые 25 с в devnet/testnet).
* **Смещения парсера** проверяются по текущим форматам Pyth/Switchboard; изменения формата требуют повторной проверки.

## Что дальше

* [портал Oracle Gateway](/ru/prilozheniya-na-rome/oracle-gateway.md) — регистрировать фиды, настраивать потребителей
* [Адреса контрактов](/ru/spravochnik/contract-addresses.md) — precompile и адреса по сетям


---

# Agent Instructions
This documentation is published with GitBook. GitBook is the documentation platform designed so that both humans and AI agents can read, navigate, and reason over technical content effectively. Learn more at gitbook.com.

## Querying This Documentation
If you need additional information that is not directly available in this page, you can query the documentation dynamically by asking a question.

Perform an HTTP GET request on the current page URL with the `ask` query parameter, and the optional `goal` query parameter:

```
GET https://docs.rome.builders/ru/produkty/oracle-gateway.md?ask=<question>&goal=<endgoal>
```

`ask` is the immediate question: it should be specific, self-contained, and written in natural language.
`goal` is optional and describes the broader end goal you are ultimately trying to accomplish on behalf of the user. GitBook uses it to tailor the answer towards what is most useful for that goal.

The response will contain a direct answer to the question and relevant excerpts and sources from the documentation.

Use this mechanism when the answer is not explicitly present in the current page, you need clarification or additional context, or you want to retrieve related documentation sections.
