Oracle-Gateway
Pyth- und Switchboard-Preisfeeds hinter der AggregatorV3Interface von Chainlink.
Das Oracle Gateway stellt Solana-native Preis-Feeds (Pyth, Switchboard V3) über Chainlinks AggregatorV3Interface, sodass Ethereum-Protokolle, die nach Rome portiert werden, ihren bestehenden Code zur Oracle-Integration beibehalten. Oracle Gateway V2 ist auf jeder öffentlichen Chain live, mit einem Keeper, der die Frische der Feeds garantiert, und einem Kundenportal zur Registrierung. Die Adapter, die Factory und das Keeper-Modell werden im rome-oracle-gateway Repo behandelt.
Das Problem
Ethereum-DeFi erwartet Chainlinks AggregatorV3Interface:
(, int256 price,,,) = priceFeed.latestRoundData();Solanas Oracle-Anbieter (Pyth, Switchboard) haben unterschiedliche Datenformate. Ohne Anpassung würde jedes portierte Protokoll eigenen Oracle-Code benötigen.
Die Lösung
Oracle Gateway V2 setzt leichte Adapter-Verträge ein, die:
Preisdaten direkt aus Pyth- oder Switchboard-Accounts auf Solana lesen (Cross-State-Reads, nicht CPI)
Die On-Chain-Daten parsen
Preise auf 8 Dezimalstellen normalisieren
Stellt die standardmäßige Chainlink
AggregatorV3Interface
import {IAggregatorV3Interface} from "@rome-protocol/rome-solidity/contracts/oracle/IAggregatorV3Interface.sol";
// Dieselbe Schnittstelle wie Chainlink auf Ethereum
(, int256 price,,,) = IAggregatorV3Interface(ADAPTER).latestRoundData();
// price = SOL/USD mit 8 Dezimalstellen (z. B. 15000000000 = $150.00)Einen Feed in drei Schritten verwenden
Die Adapter-Adresse aus der Registry auflösen — niemals fest eincodieren:
Lies ihn mit der Schnittstelle, die dein Protokoll bereits verwendet —
IAggregatorV3Interface(solUsd).latestRoundData(). Ein veralteter oder nicht initialisierter Feed schlägt fehl anstatt einen eingefrorenen Preis zu liefern.Mehrere Feeds auf einmal?
BatchReader.getLatestPrices(adapters[])(Hadrian:0x306d670dff7f51ae33f263f5122bd2b18d98adc7) — undgetFeedHealth(adapters[])bevor du dich auf sie verlässt. Zwischengespeicherte Adapter lassen jeden Verbraucher einen einfachenSLOADlesen, sodass Multi-Feed-Transaktionen (ein Multi-Collateral-Borrow, eine Portfolioansicht) günstig bleiben.
cardo nutzt diese Feeds heute bereits in der Produktion. Da die Oberfläche genau AggregatorV3Interface, sind Protokolle der Klassen Compound und Aave sofort einsetzbar — richte ihre Preis-Feed-Konfiguration auf die Adapter-Adressen aus; ihr Oracle-Code braucht keine Änderungen.
Adapter-Typen
PythPullAdapter — liest Pyth-Preis-Accounts (Preis, Konfidenz, EMA, Veröffentlichungszeit).
SwitchboardV3Adapter — liest Switchboard-Aggregator-Accounts (Preis, Zeitstempel; kein EMA).
CachedPyth / CachedFeed-Adapter — zwischengespeicherte Varianten für CU-effiziente Reads.
Adapter werden als EIP-1167-Minimal-Proxy-Klone von der OracleAdapterFactory bereitgestellt und stellen neben AggregatorV3Interface (latestPriceData, maxStaleness, oracleType auch eine metadata() Schnittstelle bereit (verwendet für Health Checks).
Aktualität — der Oracle-Keeper
Adapter erzwingen ein maxStaleness Zeitfenster: wenn block.timestamp - publishTime > maxStalenessist, schlagen Reads fehl. Auf dem Solana-Mainnet betreibt Pyth Produktions-Keeper. Auf dem Solana-Devnet (wo die öffentlichen Chains laufen) sind Pyths Pusher Best-Effort, daher betreibt Rome seinen eigenen oracle-keeper Sidecar, um die zugrunde liegenden Pyth-Accounts frisch zu halten. Die Aktualität wird überwacht und alarmiert.
Prüfe die Feed-Gesundheit mit BatchReader.getFeedHealth (liest die Daten jedes Adapters metadata()), nicht nur latestRoundData — ein Feed kann erreichbar, aber veraltet sein.
Kundenportal
Registriere Feeds und konfiguriere Verbraucher pro Chain über das Oracle Gateway-Portal. Sieh dir die Portalseite an, um zu sehen, was es abdeckt.
Bereitgestellte Adressen
Kanonische Adressen pro Chain (Factories, Adapter-Implementierungen und die Live-Feeds) sind in der Registryhinterlegt. Wichtige Factories:
OracleAdapterFactory
0xe68e7bc697010c73f1798b356f8ae2f0ba1319db
0xbc06fe9603a02ff4aead265c253f5c6303ee5fbb
BatchReader
0x306d670dff7f51ae33f263f5122bd2b18d98adc7
0xc5e6d932bfd2b4da27643848063905f46861fae8
Einschränkungen
Keine historischen Rundendaten —
getRoundData(roundId)schlägt fehl; nurlatestRoundData()wird unterstützt.Switchboard EMA wird nicht unterstützt — EMA-Daten gibt es nur bei Pyth.
Veraltbarkeit pro Chain —
maxStalenesswird bei der Inbetriebnahme pro Umgebung festgelegt: direkte (Pyth-lesende) Adapter haben standardmäßig etwa 60 Sekunden; zwischengespeicherte Adapter standardmäßig 3600 Sekunden (der Keeper aktualisiert deutlich häufiger — heute etwa alle 25 s auf Devnet/Testnet).Parser-Offsets werden gegen die aktuellen Pyth-/Switchboard-Layouts validiert; Layoutänderungen erfordern eine erneute Validierung.
Wie geht es weiter
Oracle Gateway-Portal — Feeds registrieren, Verbraucher konfigurieren
Contract-Adressen — Precompiles und Chain-spezifische Adressen
Zuletzt aktualisiert
War das hilfreich?