> 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/tr/urunler/oracle-gateway.md).

# Oracle Gateway

Chainlink'in AggregatorV3Interface'ının arkasında Pyth ve Switchboard fiyat akışları.

Oracle Gateway, Solana'ya özgü fiyat akışlarını (Pyth, Switchboard V3) Chainlink'in `AggregatorV3Interface`, bu nedenle Rome'a taşınan Ethereum protokolleri mevcut oracle entegrasyon kodlarını korur. **Oracle Gateway V2, Hadrian ve Rubicon üzerinde dağıtılmıştır**, ancak kayıt defteri yalnızca Hadrian için feed adreslerini listeler ve kaydı bir müşteri portalı yönetir. Rome tarafından çalıştırılan bir keeper, önbelleğe alınmış ve book feed'lerini yeniler, ancak her feed her an taze değildir — [bugün hangi feed'lerin yanıt verdiği](#which-feeds-answer-today) aşağıda açıklanmıştır. Adaptörler, fabrika ve keeper modeli [rome-oracle-gateway](https://github.com/rome-protocol/rome-oracle-gateway) repo'sunda ele alınmaktadır.

> **Önizleme.** Oracle Gateway denetlenmemiştir. Portal da aynı şeyi söylüyor: bunu üretim değer akışlarında kullanmayın.

## Sorun

Ethereum DeFi, Chainlink'in `AggregatorV3Interface`:

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

Solana'nın oracle sağlayıcıları (Pyth, Switchboard) farklı veri biçimlerine sahiptir. Uyumlaştırma olmadan, taşınan her protokolün özel oracle koduna ihtiyacı olurdu.

## Çözüm

Oracle Gateway V2, aşağıdaki işlemleri yapan hafif adaptör sözleşmeleri dağıtır:

1. Fiyat verilerini doğrudan Solana üzerindeki Pyth veya Switchboard hesaplarından okur (CPI değil, cross-state okumalar)
2. Zincir üstü veriyi ayrıştırır
3. Fiyatları 8 ondalığa normalize eder
4. Standart Chainlink'i sunar `AggregatorV3Interface`

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

// Ethereum'daki Chainlink ile aynı arayüz
(, int256 price,,,) = IAggregatorV3Interface(ADAPTER).latestRoundData();
// price = 8 ondalıkla SOL/USD (ör. 15000000000 = $150.00)
```

## Bir feed'i üç adımda kullanın

1. **Adaptör adresini kayıt defterinden çözümleyin** — asla sabitlemeyin:

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

Kayıt defteri GitHub'dan kurulur (`npm install github:rome-protocol/rome-registry#v0.2.0`). Feed anahtarları, arkalarında hangi adaptör türünün olduğunu belirten bir sonek taşır; bkz. [Kayıt defterindeki feed anahtarları](#feed-keys-in-the-registry) birini seçmeden önce.

2. **Bunu okuyun** protokolünüzün zaten kullandığı arayüzle — `IAggregatorV3Interface(solUsd).latestRoundData()`. Eski ya da başlatılmamış bir feed **geri alınır** donmuş bir fiyat sunmak yerine.
3. **Aynı anda birkaç feed mi?** `BatchReader.getLatestPrices(adapters[])` (Hadrian, registry v0.2.0: `0x2869f0a96572e7fb15036656e9a32fd17346499b`) — ve `getFeedHealth(adapters[])` üzerinde bağımlı olmadan önce bunları kontrol edin. Önbelleğe alınmış adaptörler, her tüketicinin düz bir `SLOAD`okumasını sağlar; böylece çoklu feed işlemleri (çok teminatlı bir borçlanma, bir portföy görünümü) ucuz kalır.

[cardo](https://github.com/rome-protocol/cardo) Hadrian üzerinde bu feed'leri okur. Çünkü yüzey tam olarak `AggregatorV3Interface`olduğundan, Compound ve Aave sınıfı protokoller bu feed'leri oracle kodunu değiştirmeden kullanabilir — fiyat akışı yapılandırmalarını adaptör adreslerine yönlendirin.

## Adaptör türleri

* **PythPullAdapter** — Pyth fiyat hesaplarını okur (fiyat, güven, EMA, yayınlama zamanı).
* **SwitchboardV3Adapter** — Switchboard toplayıcı hesaplarını okur (fiyat, zaman damgası; EMA yok).
* **CachedPyth / CachedFeed adaptörleri** — CU açısından verimli okumalar için önbelleğe alınmış izleme varyantları.
* **BookFeedAdapter** — bir `PriceBook` sözleşmesinin bir girdisi üzerinde salt okunur, Chainlink uyumlu bir görünüm. Book, kayıtlı tüm feed'lerinin fiyatlarını tutar ve toplu olarak yenilenir (yenileme izinsizdir); her feed'in adaptörü kendi önbelleğini tutmaz. Duraklatılmış bir giriş doğrudan `AdapterPaused`ile geri döner, eskiyene kadar beklemek yerine.

Adaptörler EIP-1167 minimal-proxy klonları olarak dağıtılır: `OracleAdapterFactory` Pyth, Switchboard ve önbelleğe alınmış adaptörleri klonlar ve her `PriceBook` kendi kopyasını klonlar `BookFeedAdapter` bir feed kaydedildiğinde. Aşağıdakilerle birlikte genişletilmiş bir arayüz sunarlar `AggregatorV3Interface` (`latestPriceData`, `maxStaleness`, `oracleType`, ve bir `metadata()` yüzeyi (sağlık kontrolleri için kullanılır).

## Kayıt defterindeki feed anahtarları

`getOracle(chainId).feeds` her varlık için birkaç anahtar içerir. Anahtar adındaki sonek adaptör türünü belirtir:

| Anahtar              | Adaptör türü                                 | Nasıl okur                                                                                             |
| -------------------- | -------------------------------------------- | ------------------------------------------------------------------------------------------------------ |
| `SOL/USD`            | Doğrudan Pyth (`PythPullAdapter`)            | Her çağrıda Pyth hesabını ayrıştırır.                                                                  |
| `SOL/USD-BOOK`       | `BookFeedAdapter`                            | Bir `PriceBook` keeper'ın yenilediği girdiyi okur.                                                     |
| `SOL/USD-CACHED`     | Önbelleğe alınmış (başka bir feed'i sarar)   | Keeper'ın yenilediği saklanmış bir fiyatı okur.                                                        |
| `SOL/USD-CACHEDPYTH` | Önbelleğe alınmış Pyth (`CachedPythAdapter`) | Keeper'ın yenilediği saklanmış bir fiyatı okur.                                                        |
| `SOL/USD-SB`         | Switchboard (`SwitchboardV3Adapter`)         | Her çağrıda Switchboard hesabını ayrıştırır. Kayıt defteri bu girdileri işaretler `emekliye ayrılmış`. |

Hangisinin kullanılacağı zincire bağlıdır. Önce bir sonraki bölümü kontrol edin.

### Bugün hangi feed'ler yanıt veriyor

Bunlar salt okunur `latestRoundData()` bu sayfa yazılırken yapılan registry v0.2.0'da listelenen feed'ler üzerindeki çağrıların sonuçlarıdır. Feed tazeliği devnet üzerinde dakikadan dakikaya değişir; bu yüzden bunu bir anlık görüntü olarak kabul edin ve kullanmayı planladığınız feed üzerinde aynı çağrıyı çalıştırın.

* **Hadrian.** Doğrudan feed'ler çoğu zaman eskidir: yinelenen kontrollerde bunların çoğu (BONK, BTC, ETH, JITOSOL, JTO, JUP, MSOL, USDC, USDT) her seferinde `StalePriceFeed` ile geri döndü ve `SOL/USD` bazı çağrılarda yanıt verdi, bazılarında vermedi.  `-BOOK` feed'leri en güvenilirdi ve JTO dışındaki her varlık için her çağrıda yanıt verdi; JTO'nun `-BOOK` feed'i eski olarak geri döndü. Her `-CACHED` ve `-CACHEDPYTH` feed'i `UninitializedPriceFeed` ile geri döndü (bunlar hiç yenilenmemiştir) ve `SOL/USD-SB` ile geri döndü. Hadrian'da, `StalePriceFeed`ile geri döndü. Hadrian'da, `-BOOK` feed'ini tercih edin ve `latestRoundData()` ona güvenmeden önce seçtiğiniz feed üzerinde çalıştırın.
* **Rubicon.** Kayıt defteri Rubicon için oracle feed'lerini listelemez, bu yüzden bu sayfa onları kapsamaz. Fabrika orada dağıtılmıştır (bkz. [Dağıtılmış adresler](#deployed-addresses)) ve ilk adaptörleri yanıt verir; ancak feed adreslerini kayıt defterinden değil, fabrikadan bulun (`adapterCount()` ve `allAdapters(i)`).

Buradaki geri dönüş, tasarlanmış davranıştır: eski ya da başlatılmamış bir feed, eski bir fiyat döndürmek yerine yüksek sesle başarısız olur. Bunu sözleşmenizde ele alın.

## Tazelik — oracle-keeper

Adaptörler bir `maxStaleness` pencere uygular: eğer `block.timestamp - publishTime > maxStaleness`, okumalar geri döner. Solana mainnet'te Pyth üretim keeper'larını çalıştırır. Solana devnet'te (Hadrian'ın bulunduğu yerde), Pyth'in iticileri en iyi çaba esaslıdır; bu yüzden Rome kendi **oracle-keeper** yan arabirimini çalıştırarak alttaki Pyth hesaplarını taze tutar ve önbelleğe alınmış ile book feed'lerini yeniler. Keeper her anda her zincirdeki her feed'i kapsamaz (bkz. [bugün hangi feed'lerin yanıt verdiği](#which-feeds-answer-today)).

Feed sağlığını şununla kontrol edin `BatchReader.getFeedHealth` (bu, her adaptörün `metadata()`sunar), yalnızca `latestRoundData` — bir feed erişilebilir olabilir ama yine de eski olabilir.

## Müşteri portalı

Feed'leri kaydedin ve tüketicileri zincir başına şu yolla yapılandırın [Oracle Gateway portalı](https://oracle.testnet.romeprotocol.xyz/). Şuna bakın: [portal sayfası](/tr/rome-uzerindeki-uygulamalar/oracle-gateway.md) neleri kapsadığını görmek için.

## Dağıtılmış adresler

Zincir başına kanonik adresler (fabrikalar, adaptör uygulamaları ve canlı feed'ler) şurada bulunur [registry](https://github.com/rome-protocol/rome-registry/tree/main/chains). Başlıca fabrikalar, `canlı` registry v0.2.0 girdileri (Hadrian'da sürüm 5.0.0; Rubicon adresleri ise [Sözleşme Adresleri](/tr/referans/contract-addresses.md) sayfasındakiler); bkz. [Sözleşmeler listesini okumak](/tr/referans/contract-addresses.md#reading-the-contracts-list):

| Sözleşme             | Hadrian                                      | Rubicon                                      |
| -------------------- | -------------------------------------------- | -------------------------------------------- |
| OracleAdapterFactory | `0x52b008771fc95b4674a4f3533570b3d223f27f68` | `0x6a1340dd86c3951b6f13d9001b3951d56a2fe581` |
| BatchReader          | `0x2869f0a96572e7fb15036656e9a32fd17346499b` | `0x580dc0ecb226530ee8a90b57e0f0cd2555fb4f0f` |

## Kısıtlamalar

* **Geçmiş tur verisi yok** — `getRoundData(roundId)` geri döner; yalnızca `latestRoundData()` desteklenir.
* **Switchboard EMA desteklenmiyor** — EMA verisi yalnızca Pyth'e özeldir.
* **Zincir başına eskime** — `maxStaleness` başlangıçta her ortam için ayarlanır: doğrudan (Pyth-okuyan) adaptörlerin varsayılanı yaklaşık 60 saniyedir; önbelleğe alınmış adaptörlerin varsayılanı 3600 saniyedir (keeper bunları yenilerken bunu bundan çok daha sık yapar).
* **Ayrıştırıcı ofsetleri** mevcut Pyth/Switchboard yerleşimlerine göre doğrulanır; yerleşim değişiklikleri yeniden doğrulama gerektirir.

## Sırada Ne Var

* [Oracle Gateway portalı](/tr/rome-uzerindeki-uygulamalar/oracle-gateway.md) — feed'leri kaydedin, tüketicileri yapılandırın
* [Sözleşme Adresleri](/tr/referans/contract-addresses.md) — ön derlemeler ve zincir başına adresler


---

# 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/tr/urunler/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.
