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

Сеть Oracle Gateway предоставляет нативные для Solana ценовые фиды (Pyth Network, Switchboard V3) через интерфейс Chainlink AggregatorV3Interface. Протоколы Ethereum, переходящие на Rome, могут использовать существующий код интеграции оракула без изменений.

Проблема

Протоколы Ethereum DeFi ожидают интерфейс Chainlink AggregatorV3Interface:

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

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

Решение

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

  1. Читают ценовые данные из аккаунтов Pyth или Switchboard в Solana через CPI

  2. Разбирают данные в цепочке, закодированные в формате Borsh

  3. Нормализуют цены до 8 знаков после запятой

  4. Предоставляют стандартный интерфейс Chainlink AggregatorV3Interface

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

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

Архитектура

OracleAdapterFactory

Разворачивает и управляет адаптерами оракулов:

Перед развертыванием фабрика проверяет, что аккаунт действительно принадлежит программе Pyth/Switchboard.

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

PythPullAdapter — Читает Pyth PriceUpdateV2 аккаунты. Поддерживает цену, доверительный интервал, EMA-цену и время публикации.

SwitchboardV3Adapter — Читает Switchboard AggregatorAccountData аккаунты. Поддерживает цену и временную метку. EMA недоступна.

Оба адаптера используют минимальные прокси-клоны EIP-1167 для экономичного по газу развертывания.

Интерфейсы

Расширенный интерфейс

Пакетный считыватель

Читать несколько фидов за один вызов:

Защита от устаревания

Адаптеры применяют параметр maxStaleness . Если block.timestamp - publishTime > maxStaleness, вызов завершается с ошибкой StalePriceFeed(). По умолчанию: 60 секунд.

Владелец фабрики может настраивать устаревание для каждого адаптера отдельно или глобально:

Развернутые адреса (Devnet)

Контракт
Адрес

OracleAdapterFactory

0xa4647955a16b72d15f13b51b5277036755d297be

PythPullAdapter (impl)

0x4fd11aed44ee5f71df22fb804cfcbb4c50535db9

SwitchboardV3Adapter (impl)

0xb57e3589b880aa3f6b66ce2df6aa42cd9c36925e

BatchReader

0x70da375e5680f84032f5b15d35ba0e6f9871d3fd

SOL/USD (Switchboard)

0xF0864572019c295407CF2ed46e6FD3615e10E19d

См. Адреса контрактов полный список.

Ограничения

  • Нет исторических данных по раундамgetRoundData(roundId) завершается с ошибкой HistoricalRoundsNotSupported()

  • EMA Switchboard не поддерживаетсяlatestEMAData() завершается ошибкой в адаптерах Switchboard

  • Смещения парсера эмпирически проверены — перед повторным развертыванием с новыми версиями Pyth/Switchboard необходимо повторно выполнить проверку с помощью скриптов валидации

  • Нормализация цены — цены Pyth нормализуются как price * 10^(expo - (-8)); Switchboard — как (mantissa * 10^8) / 10^scale

Статус

Версия 1 выпущена (2026-04-01) — V2 в разработке с защитой от устаревания, пакетным чтением, адаптером Switchboard, клонами EIP-1167.

Что дальше

Последнее обновление

Это было полезно?