# Oracle Gateway

Oracle Gateway mengekspos feed harga native Solana (Pyth Network, Switchboard V3) melalui `AggregatorV3Interface`. Protokol Ethereum yang dipindahkan ke Rome dapat menggunakan kode integrasi oracle yang sudah ada tanpa perubahan.

## Masalah

Protokol DeFi Ethereum mengharapkan `AggregatorV3Interface`:

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

Solana memiliki penyedia oracle yang berbeda (Pyth, Switchboard) dengan format data yang berbeda. Tanpa adaptasi, setiap protokol Ethereum akan membutuhkan integrasi oracle kustom.

## Solusi

Oracle Gateway V2 menerapkan kontrak adapter ringan yang:

1. Membaca data harga dari akun Pyth atau Switchboard di Solana melalui CPI
2. Mem-parsing data on-chain yang dienkode Borsh
3. Menormalkan harga ke 8 tempat desimal
4. Mengekspos Chainlink standar `AggregatorV3Interface`

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

// Antarmuka yang sama seperti Chainlink di Ethereum
IAggregatorV3 priceFeed = IAggregatorV3(ORACLE_ADAPTER_ADDRESS);
(, int256 price,,,) = priceFeed.latestRoundData();
// harga = SOL/USD pada 8 desimal (misalnya, 15000000000 = $150,00)
```

## Arsitektur

### OracleAdapterFactory

Menerapkan dan mengelola adapter oracle:

```solidity
OracleAdapterFactory factory = OracleAdapterFactory(0xa4647955a16b72d15f13b51b5277036755d297be);

// Menerapkan adapter feed harga Pyth
address adapter = factory.createPythFeed(
    pythAccountPubkey,    // akun harga Pyth di Solana
    "SOL/USD",            // deskripsi
    60                    // staleness maksimum dalam detik
);

// Menerapkan adapter feed harga Switchboard
address adapter = factory.createSwitchboardFeed(
    sbAccountPubkey,      // agregator Switchboard di Solana
    "SOL/USD",
    60
);
```

Factory memvalidasi bahwa akun tersebut benar-benar dimiliki oleh program Pyth/Switchboard sebelum menerapkan.

### Jenis Adapter

**PythPullAdapter** — Membaca `PriceUpdateV2` akun. Mendukung harga, interval kepercayaan, harga EMA, dan waktu publikasi.

**SwitchboardV3Adapter** — Membaca Switchboard `AggregatorAccountData` akun. Mendukung harga dan timestamp. EMA tidak tersedia.

Kedua adapter menggunakan **clone proxy minimal EIP-1167** untuk deployment yang hemat gas.

## Antarmuka

### Antarmuka Chainlink Standar

```solidity
interface IAggregatorV3Interface {
    function decimals() external view returns (uint8);          // Selalu 8
    function description() external view returns (string memory);
    function version() external view returns (uint256);
    function latestRoundData() external view returns (
        uint80 roundId,
        int256 answer,        // Harga dinormalisasi ke 8 desimal
        uint256 startedAt,
        uint256 updatedAt,
        uint80 answeredInRound
    );
}
```

### Antarmuka yang Diperluas

```solidity
interface IExtendedOracleAdapter {
    function latestPriceData() external view returns (
        int64 price, uint64 conf, int32 expo, uint64 publishTime
    );
    function latestEMAData() external view returns (        // Hanya Pyth
        int64 emaPrice, uint64 emaConf, int32 expo, uint64 publishTime
    );
    function priceStatus() external view returns (uint8);   // 0=Trading, 1=Stale, 2=Paused
    function maxStaleness() external view returns (uint256);
    function oracleType() external view returns (uint8);    // 0=PythPull, 1=Switchboard
}
```

### Pembaca Batch

Baca beberapa feed dalam satu panggilan:

```solidity
BatchReader reader = BatchReader(0x70da375e5680f84032f5b15d35ba0e6f9871d3fd);

address[] memory adapters = new address[](3);
adapters[0] = solUsdAdapter;
adapters[1] = btcUsdAdapter;
adapters[2] = ethUsdAdapter;

// Mengembalikan array berisi (adapter, answer, updatedAt, success)
// Satu feed yang stale tidak membuat seluruh batch gagal
reader.getLatestPrices(adapters);
```

## Perlindungan Staleness

Adapter menerapkan parameter `maxStaleness` Jika `block.timestamp - publishTime > maxStaleness`, pemanggilan akan gagal dengan `StalePriceFeed()`. Default: 60 detik.

Pemilik factory dapat menyesuaikan staleness per adapter atau secara global:

```solidity
factory.setDefaultMaxStaleness(120); // 2 menit
```

## Alamat yang Dideploy (Devnet)

| Kontrak                     | Alamat                                       |
| --------------------------- | -------------------------------------------- |
| OracleAdapterFactory        | `0xa4647955a16b72d15f13b51b5277036755d297be` |
| PythPullAdapter (impl)      | `0x4fd11aed44ee5f71df22fb804cfcbb4c50535db9` |
| SwitchboardV3Adapter (impl) | `0xb57e3589b880aa3f6b66ce2df6aa42cd9c36925e` |
| BatchReader                 | `0x70da375e5680f84032f5b15d35ba0e6f9871d3fd` |
| SOL/USD (Switchboard)       | `0xF0864572019c295407CF2ed46e6FD3615e10E19d` |

Lihat [Alamat Contract](/id/referensi/contract-addresses.md) untuk daftar lengkap.

## Batasan

* **Tidak ada data round historis** — `getRoundData(roundId)` gagal dengan `HistoricalRoundsNotSupported()`
* **EMA Switchboard tidak didukung** — `latestEMAData()` gagal pada adapter Switchboard
* **Offset parser divalidasi secara empiris** — harus memvalidasi ulang dengan skrip validasi sebelum redeploy terhadap versi Pyth/Switchboard yang baru
* **Normalisasi harga** — harga Pyth dinormalisasi sebagai `price * 10^(expo - (-8))`; Switchboard sebagai `(mantissa * 10^8) / 10^scale`

## Status

**V1 Dirilis** (2026-04-01) — V2 sedang dikembangkan dengan perlindungan staleness, pembacaan batch, adapter Switchboard, clone EIP-1167.

## Berikutnya

* [Alamat Contract](/id/referensi/contract-addresses.md) — semua alamat oracle yang dideploy
* [Deploy Solidity](/id/panduan-pengembang/deploy-solidity.md) — deploy kontrak yang menggunakan feed oracle


---

# Agent Instructions: 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:

```
GET https://docs.rome.builders/id/produk/oracle-gateway.md?ask=<question>
```

The question should be specific, self-contained, and written in natural language.
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.
