> 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/de/produkte/oracle-gateway.md).

# Oracle-Gateway

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](https://github.com/rome-protocol/rome-oracle-gateway) Repo behandelt.

## Das Problem

Ethereum-DeFi erwartet Chainlinks `AggregatorV3Interface`:

```solidity
(, 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:

1. Preisdaten direkt aus Pyth- oder Switchboard-Accounts auf Solana lesen (Cross-State-Reads, nicht CPI)
2. Die On-Chain-Daten parsen
3. Preise auf 8 Dezimalstellen normalisieren
4. Stellt die standardmäßige Chainlink `AggregatorV3Interface`

```solidity
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

1. **Die Adapter-Adresse aus der Registry auflösen** — niemals fest eincodieren:

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

2. **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.
3. **Mehrere Feeds auf einmal?** `BatchReader.getLatestPrices(adapters[])` (Hadrian: `0x306d670dff7f51ae33f263f5122bd2b18d98adc7`) — und `getFeedHealth(adapters[])` bevor du dich auf sie verlässt. Zwischengespeicherte Adapter lassen jeden Verbraucher einen einfachen `SLOAD`lesen, sodass Multi-Feed-Transaktionen (ein Multi-Collateral-Borrow, eine Portfolioansicht) günstig bleiben.

[cardo](https://github.com/rome-protocol/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 > maxStaleness`ist, 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](https://oracle.testnet.romeprotocol.xyz/). Sieh dir die [Portalseite](/de/apps-auf-rome/oracle-gateway.md) an, um zu sehen, was es abdeckt.

## Bereitgestellte Adressen

Kanonische Adressen pro Chain (Factories, Adapter-Implementierungen und die Live-Feeds) sind in der [Registry](https://github.com/rome-protocol/rome-registry/tree/main/chains)hinterlegt. Wichtige Factories:

| Vertrag              | Hadrian                                      | Martius                                      |
| -------------------- | -------------------------------------------- | -------------------------------------------- |
| OracleAdapterFactory | `0xe68e7bc697010c73f1798b356f8ae2f0ba1319db` | `0xbc06fe9603a02ff4aead265c253f5c6303ee5fbb` |
| BatchReader          | `0x306d670dff7f51ae33f263f5122bd2b18d98adc7` | `0xc5e6d932bfd2b4da27643848063905f46861fae8` |

## Einschränkungen

* **Keine historischen Rundendaten** — `getRoundData(roundId)` schlägt fehl; nur `latestRoundData()` wird unterstützt.
* **Switchboard EMA wird nicht unterstützt** — EMA-Daten gibt es nur bei Pyth.
* **Veraltbarkeit pro Chain** — `maxStaleness` wird 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](/de/apps-auf-rome/oracle-gateway.md) — Feeds registrieren, Verbraucher konfigurieren
* [Contract-Adressen](/de/referenz/contract-addresses.md) — Precompiles und Chain-spezifische Adressen


---

# 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/de/produkte/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.
