> 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).

# Шлюз оракула

Ценовые потоки Pyth и Switchboard за интерфейсом Chainlink AggregatorV3Interface.

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

> **Предварительный просмотр.** Oracle Gateway не проходил аудит. На портале сказано то же самое: не используйте его в продуктивных потоках стоимости.

## Проблема

DeFi в Ethereum ожидает от 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, registry v0.2.0: 0x567384ee000ca0418c386A73eC2b7466f9f99D6b
```

Реестр устанавливается из GitHub (`npm install github:rome-protocol/rome-registry#v0.2.0`). Ключи фидов содержат суффикс, указывающий, какой тип адаптера за ними стоит; см. [Ключи фидов в реестре](#feed-keys-in-the-registry) прежде чем выбрать один.

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

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

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

* **PythPullAdapter** — читает аккаунты цен Pyth (цена, доверительный интервал, EMA, время публикации).
* **SwitchboardV3Adapter** — читает аккаунты агрегатора Switchboard (цена, метка времени; без EMA).
* **Адаптеры CachedPyth / CachedFeed** — варианты с кэшированием для эффективных по вычислительным единицам чтений.
* **BookFeedAdapter** — только для чтения, совместимое с Chainlink представление одной записи `PriceBook` контракта. Книга хранит цены всех зарегистрированных фидов и обновляется пакетно (обновление не требует разрешений); адаптер каждого фида не хранит собственного кэша. Приостановленная запись немедленно вызывает revert с `AdapterPaused`, вместо того чтобы дожидаться устаревания.

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

## Ключи фидов в реестре

`getOracle(chainId).feeds` имеет несколько ключей на один актив. Суффикс в ключе указывает тип адаптера:

| Ключ                 | Тип адаптера                            | Как читает                                                                                                |
| -------------------- | --------------------------------------- | --------------------------------------------------------------------------------------------------------- |
| `SOL/USD`            | Прямой Pyth (`PythPullAdapter`)         | Разбирает аккаунт Pyth при каждом вызове.                                                                 |
| `SOL/USD-BOOK`       | `BookFeedAdapter`                       | Читает `PriceBook` запись, которую обновляет кипер.                                                       |
| `SOL/USD-CACHED`     | Кэшированный (оборачивает другой фид)   | Читает сохранённую цену, которую обновляет кипер.                                                         |
| `SOL/USD-CACHEDPYTH` | Кэшированный Pyth (`CachedPythAdapter`) | Читает сохранённую цену, которую обновляет кипер.                                                         |
| `SOL/USD-SB`         | Switchboard (`SwitchboardV3Adapter`)    | Разбирает аккаунт Switchboard при каждом вызове. Реестр помечает эти записи `выведенные из эксплуатации`. |

Какой именно использовать, зависит от сети. Сначала проверьте следующий раздел.

### Какие фиды отвечают сегодня

Это результаты только для чтения `latestRoundData()` вызовов по фидам, перечисленным в реестре v0.2.0, выполненных на момент написания этой страницы. Актуальность фидов на devnet меняется от минуты к минуте, поэтому воспринимайте это как снимок и выполните тот же вызов на фиде, который планируете использовать.

* **Hadrian.** Прямые фиды часто устаревшие: при повторных проверках большинство из них (BONK, BTC, ETH, JITOSOL, JTO, JUP, MSOL, USDC, USDT) завершались revert с `StalePriceFeed` каждый раз, а `SOL/USD` отвечал на одни вызовы и не отвечал на другие.  `-BOOK` фиды были самыми надёжными и отвечали при каждом вызове для каждого актива, кроме JTO, у которого `-BOOK` фид завершался revert как устаревший. Каждый `-CACHED` и `-CACHEDPYTH` фид завершался revert с `UninitializedPriceFeed` (их никто не обновлял), а `SOL/USD-SB` завершался revert с `StalePriceFeed`. `-BOOK` На Hadrian предпочитайте `latestRoundData()` фид и выполните проверку на выбранном фиде, прежде чем полагаться на него.
* **Rubicon.** В реестре нет списка оракульных фидов для Rubicon, поэтому эта страница их не рассматривает. Фабрика там развернута (см. [Развёрнутые адреса](#deployed-addresses)) и её первые адаптеры отвечают, но адреса фидов следует искать в фабрике (`adapterCount()` и `allAdapters(i)`), а не в реестре.

Revert здесь — это предусмотренное поведение: устаревший или неинициализированный фид громко завершается ошибкой вместо возврата старой цены. Обрабатывайте это в своём контракте.

## Актуальность — оракульный кипер

Адаптеры обеспечивают `maxStaleness` окно: если `block.timestamp - publishTime > maxStaleness`, чтения завершаются revert. В Solana mainnet Pyth использует production-киперов. В Solana devnet (где находится Hadrian) отправители Pyth работают по best-effort, поэтому Rome запускает свой собственный **оракульный кипер** sidecar-компонент для поддержания актуальности базовых аккаунтов Pyth и обновления кэшированных и book-фидов. Кипер не покрывает каждый фид в каждой сети в каждый момент (см. [какие фиды отвечают сегодня](#which-feeds-answer-today)).

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

## Портал для клиентов

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

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

Канонические адреса для каждой сети (фабрики, реализации адаптеров и активные фиды) находятся в [реестре](https://github.com/rome-protocol/rome-registry/tree/main/chains). Основные фабрики из `активен` записей реестра v0.2.0 (версия 5.0.0 на Hadrian; адреса Rubicon — это адреса на [справочнике Contract Addresses](/ru/spravochnik/contract-addresses.md) странице); см. [Чтение списка контрактов](/ru/spravochnik/contract-addresses.md#reading-the-contracts-list):

| Контракт             | Hadrian                                      | Rubicon                                      |
| -------------------- | -------------------------------------------- | -------------------------------------------- |
| OracleAdapterFactory | `0x52b008771fc95b4674a4f3533570b3d223f27f68` | `0x6a1340dd86c3951b6f13d9001b3951d56a2fe581` |
| BatchReader          | `0x2869f0a96572e7fb15036656e9a32fd17346499b` | `0x580dc0ecb226530ee8a90b57e0f0cd2555fb4f0f` |

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

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

## Что дальше

* [портал Oracle Gateway](/ru/prilozheniya-v-rome/oracle-gateway.md) — регистрируйте фиды, настраивайте потребителей
* [справочнике Contract Addresses](/ru/spravochnik/contract-addresses.md) — прекомпилированные контракты и адреса для каждой цепочки


---

# 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 by asking a question.

Perform an HTTP GET request on the following URL with the `ask` and `goal` query parameters:

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

`ask` is the immediate question: it should be specific, self-contained, and written in natural language.
`goal` is what the user is ultimately trying to achieve, the reason they need the answer. Sharing it helps GitBook give you a better, more relevant answer. A goal is most helpful when it describes the outcome the user wants rather than restating the question. For example, with `ask=how do I create an API token`, a goal like `automate deployments from our CI pipeline` lets GitBook tailor the answer to that use case.

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.
