> 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/ja/zhi-pin/oracle-gateway.md).

# Oracle Gateway

ChainlinkのAggregatorV3Interfaceの背後にあるPythとSwitchboardの価格フィード。

Oracle Gatewayは、Solanaネイティブの価格フィード（Pyth、Switchboard V3）をChainlinkの `AggregatorV3Interface`そのため、Romeに移植するEthereumプロトコルは、既存のオラクル統合コードをそのまま使えます。 **Oracle Gateway V2はHadrianとRubiconにデプロイされています**ただし、レジストリにフィードアドレスが載っているのはHadrianのみで、登録はカスタマーポータルが処理します。Romeが運用するキーパーがキャッシュ済みフィードとブックフィードを更新しますが、すべてのフィードが常に新鮮とは限りません— [今日どのフィードが応答するか](#which-feeds-answer-today) は以下に詳述します。アダプタ、ファクトリ、キーパーモデルについては [rome-oracle-gateway](https://github.com/rome-protocol/rome-oracle-gateway) リポジトリで説明しています。

> **プレビュー。** Oracle Gatewayは監査されていません。ポータルにも同様に記載されています。プロダクションの資金フローでは使用しないでください。

## 問題

EthereumのDeFiはChainlinkの `AggregatorV3Interface`:

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

Solanaのオラクルプロバイダ（Pyth、Switchboard）はデータ形式が異なります。適応なしでは、移植された各プロトコルごとに独自のオラクルコードが必要になります。

## 解決策

Oracle Gateway V2は、次のような軽量アダプタコントラクトをデプロイします：

1. Solana上のPythまたはSwitchboardアカウントから価格データを直接読み取る（CPIではなくクロスステート読み取り）
2. オンチェーンデータを解析する
3. 価格を8桁の小数に正規化する
4. 標準のChainlinkインターフェースを公開する `AggregatorV3Interface`

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

// Ethereum上のChainlinkと同じインターフェース
(, int256 price,,,) = IAggregatorV3Interface(ADAPTER).latestRoundData();
// price = 8桁精度のSOL/USD（例：15000000000 = $150.00）
```

## フィードを3ステップで利用する

1. **レジストリからアダプタアドレスを解決する** — ハードコードしないでください：

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

レジストリはGitHubからインストールします（`npm install github:rome-protocol/rome-registry#v0.2.0`）。フィードキーには、その背後にあるアダプタ種別を示すサフィックスが付いています。 [レジストリ内のフィードキー](#feed-keys-in-the-registry) を選ぶ前に確認してください。

2. **それを読み取る** あなたのプロトコルがすでに使っているインターフェースで— `IAggregatorV3Interface(solUsd).latestRoundData()`。古くなった、または未初期化のフィードは **revert します** 固定された価格を返すのではなく、失敗します。
3. **複数のフィードをまとめて？** `BatchReader.getLatestPrices(adapters[])` (Hadrian、registry v0.2.0： `0x2869f0a96572e7fb15036656e9a32fd17346499b`）— そして `getFeedHealth(adapters[])` に依存する前に確認してください。キャッシュ済みアダプタにより、各コンシューマーは通常の `SLOAD`を読むだけで済むため、複数フィードのトランザクション（複数担保の借入、ポートフォリオ表示）でもコストを抑えられます。

[cardo](https://github.com/rome-protocol/cardo) Hadrianではこれらのフィードを読み取ります。表面上の仕様はまさに `AggregatorV3Interface`なので、CompoundやAaveクラスのプロトコルはオラクルコードを変更せずにこれらのフィードを利用できます—価格フィード設定をアダプタアドレスに向けてください。

## アダプタの種類

* **PythPullAdapter** — Pythの価格アカウント（価格、信頼度、EMA、公開時刻）を読み取ります。
* **SwitchboardV3Adapter** — Switchboardのアグリゲータアカウント（価格、タイムスタンプ。EMAなし）を読み取ります。
* **CachedPyth / CachedFeedアダプタ** — CU効率の良い読み取りのためのキャッシュ追跡版です。
* **BookFeedAdapter** — の1エントリに対する読み取り専用のChainlink互換ビュー `PriceBook` コントラクト。ブックは登録済みフィードすべての価格を保持し、バッチで更新されます（更新はパーミッションレスです）。各フィードのアダプタ自体はキャッシュを保持しません。停止中のエントリは即座に `AdapterPaused`でリバートし、古くなるのを待ちません。

アダプタはEIP-1167のミニマルプロキシクローンとしてデプロイされます。 `OracleAdapterFactory` がPyth、Switchboard、およびキャッシュ済みアダプタをクローンし、各 `PriceBook` それぞれが独自の `BookFeedAdapter` を、フィード登録時にクローンします。これらは拡張インターフェースを `AggregatorV3Interface` (`latestPriceData`, `maxStaleness`, `oracleType`、そして `metadata()` とともに公開します（ヘルスチェックに使う表面です）。

## レジストリ内のフィードキー

`getOracle(chainId).feeds` は、資産ごとに複数のキーを持ちます。キー名の末尾がアダプタ種別を示します：

| キー                   | アダプタ種別                              | 読み取り方法                                                  |
| -------------------- | ----------------------------------- | ------------------------------------------------------- |
| `SOL/USD`            | 直接Pyth（`PythPullAdapter`)           | 呼び出しのたびにPythアカウントを解析します。                                |
| `SOL/USD-BOOK`       | `BookFeedAdapter`                   | 読み取ります `PriceBook` キーパーが更新するエントリを。                      |
| `SOL/USD-CACHED`     | キャッシュ済み（別のフィードをラップ）                 | キーパーが更新する保存済み価格を読み取ります。                                 |
| `SOL/USD-CACHEDPYTH` | キャッシュ済みPyth（`CachedPythAdapter`)    | キーパーが更新する保存済み価格を読み取ります。                                 |
| `SOL/USD-SB`         | Switchboard（`SwitchboardV3Adapter`) | 呼び出しのたびにSwitchboardアカウントを解析します。レジストリではこれらのエントリに `廃止済み`. |

どれを使うかはチェーンによって異なります。まず次のセクションを確認してください。

### 今日どのフィードが応答するか

以下は読み取り専用の `latestRoundData()` registry v0.2.0に記載されたフィードへの呼び出し結果で、このページ作成時点のものです。devnetではフィードの新鮮さは分単位で変わるため、スナップショットとして扱い、実際に使う予定のフィードで同じ呼び出しを実行してください。

* **Hadrian。** 直接フィードはしばしば古くなっています。繰り返し確認したところ、そのほとんど（BONK、BTC、ETH、JITOSOL、JTO、JUP、MSOL、USDC、USDT）は `StalePriceFeed` で毎回リバートし、 `SOL/USD` 一部の呼び出しには応答し、一部には応答しませんでした。 `-BOOK` フィードが最も信頼性が高く、JTOを除くすべての資産で毎回応答しました。JTOの `-BOOK` フィードは古いとしてリバートしました。すべての `-CACHED` および `-CACHEDPYTH` フィードは `UninitializedPriceFeed` （まだ何も更新されていないため）、そして `SOL/USD-SB` でリバートしました。 `StalePriceFeed`フィードを優先し、 `-BOOK` フィードを `latestRoundData()` に依存する前に、選んだフィードで実行してください。
* **Rubicon。** レジストリにはRubiconのオラクルフィードが記載されていないため、このページでは扱いません。そこにもファクトリはデプロイされています（ [デプロイ済みアドレス](#deployed-addresses)）し、初期アダプタは応答しますが、フィードアドレスはファクトリから取得してください（`adapterCount()` および `allAdapters(i)`）。レジストリではなくファクトリを参照してください。

ここでのリバートは想定された動作です。古い、または未初期化のフィードは古い価格を返すのではなく、明示的に失敗します。コントラクト側で処理してください。

## 鮮度 — オラクルキーパー

アダプタは `maxStaleness` のウィンドウを強制します。もし `block.timestamp - publishTime > maxStaleness`を超えると、読み取りはリバートします。Solanaメインネットでは、Pythが本番キーパーを運用しています。Solana devnet（Hadrianが動作する環境）では、Pythのプッシャーはベストエフォートなので、Romeは独自の **オラクルキーパー** サイドカーを運用して、基盤となるPythアカウントを新鮮に保ち、キャッシュ済みフィードとブックフィードを更新します。キーパーは、すべてのチェーンのすべてのフィードを常にカバーするわけではありません（ [今日どのフィードが応答するか](#which-feeds-answer-today)).

次でフィードの健全性を確認してください： `BatchReader.getFeedHealth` （各アダプタの `metadata()`を読み取るものであり、単なる `latestRoundData` ではありません—フィードは到達可能でも古い場合があります。

## カスタマーポータル

フィードを登録し、チェーンごとにコンシューマーを設定するには [Oracle Gatewayポータル](https://oracle.testnet.romeprotocol.xyz/)を使います。 [ポータルページ](/ja/romenoapuri/oracle-gateway.md) で対応範囲を確認してください。

## デプロイ済みアドレス

各チェーンの正式なアドレス（ファクトリ、アダプタ実装、ライブフィード）は [registry](https://github.com/rome-protocol/rome-registry/tree/main/chains)にあります。主要ファクトリは、 `live` registry v0.2.0のエントリ（Hadrianではversion 5.0.0。Rubiconのアドレスは [Contract Addresses](/ja/rifarensu/contract-addresses.md) ページ上のものです）から参照できます。 [であるものを選んでください。](/ja/rifarensu/contract-addresses.md#reading-the-contracts-list):

| コントラクト               | Hadrian                                      | Rubicon                                      |
| -------------------- | -------------------------------------------- | -------------------------------------------- |
| OracleAdapterFactory | `0x52b008771fc95b4674a4f3533570b3d223f27f68` | `0x6a1340dd86c3951b6f13d9001b3951d56a2fe581` |
| BatchReader          | `0x2869f0a96572e7fb15036656e9a32fd17346499b` | `0x580dc0ecb226530ee8a90b57e0f0cd2555fb4f0f` |

## 制約

* **履歴ラウンドデータはありません** — `getRoundData(roundId)` はリバートします。サポートされているのは `latestRoundData()` のみです。
* **SwitchboardのEMAはサポートされていません** — EMAデータはPyth専用です。
* **チェーンごとの古さの許容値** — `maxStaleness` は起動時に環境ごとに設定されます。直接（Pyth読み取り）アダプタのデフォルトは約60秒、キャッシュ済みアダプタのデフォルトは3600秒です（キーパーが更新している場合は、その頻度はこれよりはるかに高いです）。
* **パーサーのオフセット** は現在のPyth/Switchboardのレイアウトに対して検証されます。レイアウトが変わった場合は再検証が必要です。

## 次は

* [Oracle Gatewayポータル](/ja/romenoapuri/oracle-gateway.md) — フィードを登録し、コンシューマーを設定する
* [Contract Addresses](/ja/rifarensu/contract-addresses.md) — 事前コンパイルとチェーンごとのアドレス


---

# 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/ja/zhi-pin/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.
