> 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/id/produk/oracle-gateway.md).

# Gateway Oracle

Pyth dan feed harga Switchboard di balik AggregatorV3Interface Chainlink.

Oracle Gateway mengekspos feed harga native Solana (Pyth, Switchboard V3) melalui `AggregatorV3Interface`, sehingga protokol Ethereum yang dipindahkan ke Rome tetap memakai kode integrasi oracle yang sudah ada. **Oracle Gateway V2 diterapkan di Hadrian dan Rubicon**, meski registri hanya mencantumkan alamat feed untuk Hadrian, dan portal pelanggan menangani pendaftaran. Sebuah keeper yang berjalan di Rome menyegarkan feed cached dan book, tetapi tidak setiap feed segar pada setiap saat — [feed mana yang merespons hari ini](#which-feeds-answer-today) dijelaskan di bawah. Adapter, factory, dan model keeper dibahas di [rome-oracle-gateway](https://github.com/rome-protocol/rome-oracle-gateway) repo.

> **Pratinjau.** Oracle Gateway belum diaudit. Portal mengatakan hal yang sama: jangan gunakan ini dalam alur nilai produksi.

## Masalah

DeFi Ethereum mengharapkan milik Chainlink `AggregatorV3Interface`:

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

Penyedia oracle Solana (Pyth, Switchboard) memiliki format data yang berbeda. Tanpa adaptasi, setiap protokol yang dipindahkan akan membutuhkan kode oracle khusus.

## Solusinya

Oracle Gateway V2 menerapkan kontrak adapter ringan yang:

1. Membaca data harga langsung dari akun Pyth atau Switchboard di Solana (pembacaan lintas-state, bukan CPI)
2. Mengurai data on-chain
3. Menormalkan harga ke 8 desimal
4. Mengekspos Chainlink standar `AggregatorV3Interface`

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

// Antarmuka yang sama seperti Chainlink di Ethereum
(, int256 price,,,) = IAggregatorV3Interface(ADAPTER).latestRoundData();
// price = SOL/USD pada 8 desimal (mis. 15000000000 = $150,00)
```

## Konsumsi feed dalam tiga langkah

1. **Tentukan alamat adapter dari registry** — jangan pernah hardcode:

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

Registry dipasang dari GitHub (`npm install github:rome-protocol/rome-registry#v0.2.0`). Kunci feed membawa sufiks yang menunjukkan jenis adapter di belakangnya; lihat [Kunci feed di registry](#feed-keys-in-the-registry) sebelum Anda memilihnya.

2. **Baca** dengan antarmuka yang sudah digunakan protokol Anda — `IAggregatorV3Interface(solUsd).latestRoundData()`. Feed yang kedaluwarsa atau belum diinisialisasi **revert** daripada menyajikan harga yang membeku.
3. **Beberapa feed sekaligus?** `BatchReader.getLatestPrices(adapters[])` (Hadrian, registry v0.2.0: `0x2869f0a96572e7fb15036656e9a32fd17346499b`) — dan `getFeedHealth(adapters[])` sebelum Anda bergantung padanya. Adapter cached membuat setiap konsumen membaca SLOAD biasa, `SLOAD`, sehingga transaksi multi-feed (pinjaman multi-agunan, tampilan portofolio) tetap murah.

[cardo](https://github.com/rome-protocol/cardo) membaca feed ini di Hadrian. Karena permukaannya persis `AggregatorV3Interface`, protokol kelas Compound dan Aave dapat memakai feed ini tanpa perubahan kode oracle — arahkan konfigurasi price-feed mereka ke alamat adapter.

## Jenis adapter

* **PythPullAdapter** — membaca akun harga Pyth (harga, confidence, EMA, waktu publikasi).
* **SwitchboardV3Adapter** — membaca akun aggregator Switchboard (harga, timestamp; tanpa EMA).
* **Adapter CachedPyth / CachedFeed** — varian dengan cache untuk pembacaan efisien CU.
* **BookFeedAdapter** — tampilan read-only yang kompatibel dengan Chainlink atas satu entri dari sebuah `PriceBook` kontrak. Buku ini menyimpan harga untuk semua feed yang terdaftar dan disegarkan secara batch (penyegaran bersifat permissionless); adapter setiap feed tidak menyimpan cache sendiri. Entri yang dijeda langsung revert dengan `AdapterPaused`, alih-alih menunggu menjadi kedaluwarsa.

Adapter diterapkan sebagai klon minimal-proxy EIP-1167: `OracleAdapterFactory` mengkloning adapter Pyth, Switchboard, dan cached, dan masing-masing `PriceBook` mengkloning miliknya sendiri `BookFeedAdapter` saat sebuah feed didaftarkan. Mereka mengekspos antarmuka yang diperluas bersama `AggregatorV3Interface` (`latestPriceData`, `maxStaleness`, `oracleType`, dan sebuah `metadata()` permukaan yang digunakan untuk pemeriksaan kesehatan).

## Kunci feed di registry

`getOracle(chainId).feeds` memiliki beberapa kunci per aset. Sufiks pada nama kunci menamai jenis adapter:

| Kunci                | Jenis adapter                        | Cara membacanya                                                                         |
| -------------------- | ------------------------------------ | --------------------------------------------------------------------------------------- |
| `SOL/USD`            | Pyth langsung (`PythPullAdapter`)    | Mengurai akun Pyth pada setiap panggilan.                                               |
| `SOL/USD-BOOK`       | `BookFeedAdapter`                    | Membaca sebuah `PriceBook` entri yang disegarkan oleh keeper.                           |
| `SOL/USD-CACHED`     | Cached (membungkus feed lain)        | Membaca harga tersimpan yang disegarkan oleh keeper.                                    |
| `SOL/USD-CACHEDPYTH` | Cached Pyth (`CachedPythAdapter`)    | Membaca harga tersimpan yang disegarkan oleh keeper.                                    |
| `SOL/USD-SB`         | Switchboard (`SwitchboardV3Adapter`) | Mengurai akun Switchboard pada setiap panggilan. Registry menandai entri ini `pensiun`. |

Yang harus dikonsumsi bergantung pada chain. Periksa bagian berikutnya terlebih dahulu.

### Feed mana yang merespons hari ini

Ini adalah hasil dari `latestRoundData()` panggilan read-only pada feed yang tercantum di registry v0.2.0, dibuat saat halaman ini ditulis. Kefresan feed berubah dari menit ke menit di devnet, jadi perlakukan ini sebagai snapshot dan jalankan panggilan yang sama pada feed yang akan Anda gunakan.

* **Hadrian.** Feed langsung sering kedaluwarsa: pada pemeriksaan berulang, sebagian besar di antaranya (BONK, BTC, ETH, JITOSOL, JTO, JUP, MSOL, USDC, USDT) revert dengan `StalePriceFeed` setiap kali, dan `SOL/USD` merespons pada beberapa panggilan dan tidak pada yang lain. `-BOOK` feed paling andal dan merespons pada setiap panggilan untuk setiap aset kecuali JTO, yang `-BOOK` feed-nya revert karena kedaluwarsa. `-CACHED` dan `-CACHEDPYTH` feed revert dengan `UninitializedPriceFeed` (tidak ada yang menyegarkan mereka), dan `SOL/USD-SB` revert dengan `StalePriceFeed`. Di Hadrian, utamakan `-BOOK` feed, dan jalankan `latestRoundData()` pada feed yang Anda pilih sebelum bergantung padanya.
* **Rubicon.** Registry tidak mencantumkan feed oracle untuk Rubicon, jadi halaman ini tidak mencakupnya. Factory diterapkan di sana (lihat [Alamat yang dideploy](#deployed-addresses)) dan adapter pertamanya merespons, tetapi cari alamat feed dari factory (`adapterCount()` dan `allAdapters(i)`) alih-alih dari registry.

Revert di sini adalah perilaku yang dirancang: feed yang kedaluwarsa atau belum diinisialisasi gagal secara jelas alih-alih mengembalikan harga lama. Tangani di kontrak Anda.

## Kefresan — oracle-keeper

Adapter menegakkan sebuah `maxStaleness` jendela: jika `block.timestamp - publishTime > maxStaleness`, pembacaan revert. Di mainnet Solana, Pyth menjalankan keeper produksi. Di devnet Solana (tempat Hadrian berada), pusher Pyth bersifat best-effort, jadi Rome menjalankan **oracle-keeper** sidecar sendiri untuk menjaga akun Pyth yang mendasari tetap segar dan untuk menyegarkan feed cached dan book. Keeper tidak mencakup setiap feed di setiap chain pada setiap saat (lihat [feed mana yang merespons hari ini](#which-feeds-answer-today)).

Periksa kesehatan feed dengan `BatchReader.getFeedHealth` (yang membaca `metadata()`setiap adapter, `latestRoundData` — feed bisa dapat diakses tetapi kedaluwarsa.

## Portal pelanggan

Daftarkan feed dan konfigurasikan konsumen per chain melalui [portal Oracle Gateway](https://oracle.testnet.romeprotocol.xyz/). Lihat [halaman portal](/id/aplikasi-di-rome/oracle-gateway.md) untuk melihat apa saja yang dicakupnya.

## Alamat yang dideploy

Alamat kanonik per-chain (factory, implementasi adapter, dan feed aktif) berada di [registry](https://github.com/rome-protocol/rome-registry/tree/main/chains). Factory utama, dari `live` entri registry v0.2.0 (versi 5.0.0 di Hadrian; alamat Rubicon adalah yang ada di [Contract Addresses](/id/referensi/contract-addresses.md) halaman); lihat [Membaca daftar kontrak](/id/referensi/contract-addresses.md#reading-the-contracts-list):

| Kontrak              | Hadrian                                      | Rubicon                                      |
| -------------------- | -------------------------------------------- | -------------------------------------------- |
| OracleAdapterFactory | `0x52b008771fc95b4674a4f3533570b3d223f27f68` | `0x6a1340dd86c3951b6f13d9001b3951d56a2fe581` |
| BatchReader          | `0x2869f0a96572e7fb15036656e9a32fd17346499b` | `0x580dc0ecb226530ee8a90b57e0f0cd2555fb4f0f` |

## Batasan

* **Tidak ada data ronde historis** — `getRoundData(roundId)` revert; hanya `latestRoundData()` yang didukung.
* **EMA Switchboard tidak didukung** — data EMA hanya untuk Pyth.
* **Kedaluwarsa per-chain** — `maxStaleness` diatur per lingkungan saat inisialisasi: adapter langsung (membaca Pyth) defaultnya \~60 detik; adapter cached defaultnya 3600 detik (ketika keeper menyegarkannya, ia melakukannya jauh lebih sering dari itu).
* **Offset parser** divalidasi terhadap tata letak Pyth/Switchboard saat ini; perubahan tata letak memerlukan validasi ulang.

## Apa Selanjutnya

* [portal Oracle Gateway](/id/aplikasi-di-rome/oracle-gateway.md) — daftarkan feed, konfigurasikan konsumen
* [Contract Addresses](/id/referensi/contract-addresses.md) — precompile dan alamat per-chain


---

# 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/id/produk/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.
