> For the complete documentation index, see [llms.txt](https://docs.useicaria.xyz/llms.txt). Markdown versions of documentation pages are available by appending `.md` to page URLs; this page is available as [Markdown](https://docs.useicaria.xyz/risk/oracles.md).

# Oracles and market sessions

Where prices come from, and what the venue does once a market shuts or a feed stops deserving trust.

Prices reach Icaria through exactly one contract, `OracleRouter`. It wraps Chainlink and applies the protocol's guards before a price is allowed near a quote, a fill check or the regime engine. Since the anchor price holds up the entire design, this is the page that carries the most weight.

## Sources

| Source                                      | Used for                                                         | Notes                                                        |
| ------------------------------------------- | ---------------------------------------------------------------- | ------------------------------------------------------------ |
| Chainlink **Data Feeds** (24/5 equities)    | The mid behind vault quoting and band checks                     | On-chain and push-based, updating on deviation or heartbeat  |
| Chainlink **Data Streams** (v11 RWA schema) | Classifying the session, and cross-checking RFQ fills sub-second | Pull-based, carrying `marketStatus`, where 5 means closed    |
| Chainlink **Sequencer Uptime Feed**         | The grace period after an outage                                 | See [Sequencer and chain risk](/risk/sequencer-and-chain.md) |
| ERC-8056 `uiMultiplier()`                   | Displaying holdings in share terms in the explorer               | Read off the token; Chainlink's price already includes it    |

Taking feeds and streams together gives a cross-check: a fill cannot clear at a price that has drifted from the other source by more than a configured tolerance, and the stream's market status is only ever able to tighten the regime beyond what the feed alone would produce.

## Sessions

`OracleRouter` combines the stream's `marketStatus` with the feed's `updatedAt` timestamp to label each market **regular**, **extended** or **closed**. Translating that label into spreads and clips is the [regime engine](/protocol/trading-regimes.md)'s job.

| Session  | Staleness bound | Effect                                                                    |
| -------- | --------------- | ------------------------------------------------------------------------- |
| Regular  | 1 hour          | Published tier spreads                                                    |
| Extended | 2 hours         | Spreads ×1.5, clips ×0.75                                                 |
| Closed   | 4 days          | Spreads ×3.0, clips ×0.5, with weekend quoting anchored on Friday's close |

The distance between Friday's close and Monday's open can be considerable, which is the entire reason the closed-session multiplier exists. An LP quoting through a weekend charges for that distance openly. Somebody dealing at three on a Sunday morning pays a disclosed premium for a service that is real, rather than an undisclosed one for a service that has been mispriced.

## Guards

Before any price gets used, `OracleRouter` rejects or halts when:

| Condition                                          | Action                                                                                                                   |
| -------------------------------------------------- | ------------------------------------------------------------------------------------------------------------------------ |
| The price is zero or below                         | Revert                                                                                                                   |
| `updatedAt` predates the session's staleness bound | The market goes `HALTED` until a fresh round lands                                                                       |
| A single round moves the price more than 25%       | The market goes `HALTED` pending timelocked review and a published finding                                               |
| The feed raises `oraclePaused()`                   | The market goes `HALTED`, since a corporate action is under way; see [Corporate actions](/protocol/corporate-actions.md) |
| Stream and feed disagree beyond tolerance          | The fill reverts                                                                                                         |

Quoting and settlement in the affected market are all that a halt reaches. Withdrawals, cancellations and reads keep working throughout.

## Nothing but the exact token gets priced

Whatever the vault actually holds is the token `OracleRouter` is configured to price for that market. Prices are never inferred through a wrapper, a vault share or an exchange rate between two tokens. That is the lesson Edel Finance's wGOOGLx incident taught in July 2026, where the oracle on the underlying was perfectly correct and a wrapper's exchange rate, pushed 78 times higher, was the thing being trusted. See [Lessons from RWA trading](/risk/lessons.md).

## Changing an oracle

Each market's oracle adapter lives in `ParamController`, so replacing one is a timelocked action accompanied by a published rationale. For every market, `OracleRouter` offers a view onto the current feed, session, staleness, multiplier and pause flag, and the [trade explorer](/using-icaria/trade-explorer.md) renders it live. Whatever state the router is enforcing is therefore always state the public can already see.


---

# 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.useicaria.xyz/risk/oracles.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.
