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

# Oracles and market sessions

Every valuation in Syndromics comes through one contract, `OracleRouter`, which wraps Chainlink and applies the protocol's guards before a price reaches settlement, health checks or auctions.

## Sources

| Source                                      | Used for                                          | Notes                                                                                                                      |
| ------------------------------------------- | ------------------------------------------------- | -------------------------------------------------------------------------------------------------------------------------- |
| Chainlink **Data Feeds** (24/5)             | Health-factor checks, settlement LTV, warnings    | Push-based, on-chain, updated on deviation or heartbeat                                                                    |
| Chainlink **Data Streams** (v11 RWA schema) | Liquidation auction pricing                       | Pull-based; the buyer submits a signed report that is verified on-chain through the VerifierProxy. Carries `marketStatus`. |
| Chainlink **Sequencer Uptime Feed**         | Post-outage liquidation grace                     | See [Sequencer and chain risk](/risk/sequencer-and-chain.md)                                                               |
| ERC-8056 `uiMultiplier()`                   | Share-denominated accounting and explorer display | Read from the Stock Token contract; the multiplier is already reflected in the Chainlink price                             |

Using both feeds and streams gives a cross-check: an auction cannot clear at a stream price that diverges from the feed beyond a configured tolerance.

## Market sessions

Equity markets are open for about 32 hours a week in regular session, more with extended hours, and closed the rest of the time. `OracleRouter` classifies every price as **regular**, **extended** or **closed** using the stream's `marketStatus` field (a value of 5 means closed) and the feed's `updatedAt` timestamp.

| Session  | Staleness bound | LTV treatment                                                      |
| -------- | --------------- | ------------------------------------------------------------------ |
| Regular  | 1 hour          | Tier values as published                                           |
| Extended | 2 hours         | Tier values as published; move cap tightened                       |
| Closed   | 4 days          | Tier closed-market haircut applied to both max and liquidation LTV |

The haircut exists because the last Friday close can be far from Monday's open. Applying it to the liquidation LTV means a loan that is comfortably healthy on Friday needs more buffer over the weekend, and a borrower who is close to the line is warned before the market closes rather than after it reopens.

## Guards

Before any price is used, `OracleRouter` rejects or halts on:

| Condition                                            | Action                                                                                            |
| ---------------------------------------------------- | ------------------------------------------------------------------------------------------------- |
| Price is zero or negative                            | Revert                                                                                            |
| `updatedAt` older than the session's staleness bound | Revert for settlement; HF computed with closed-market haircut; auction floor bounded              |
| Single-update move above the 25% cap                 | Market paused for new loans and liquidations pending manual review; repayment unaffected          |
| Feed reports `oraclePaused()`                        | Market halted for new loans and liquidations until the flag clears (corporate action in progress) |
| Stream price diverges from feed beyond tolerance     | Auction purchase reverts                                                                          |

## Price the exact token

`OracleRouter` is configured per market with the feed for the token actually held in escrow. It never derives a price through a wrapper, a vault share, or an exchange rate between two tokens. This is the lesson of the Edel Finance wGOOGLx incident in July 2026, where the oracle for the underlying was correct but a wrapper's exchange rate was pushed 78 times higher and used as collateral value. See [Lessons from RWA lending](/risk/lessons.md).

## Adding or changing an oracle

Oracle adapters are ParamController values per market. Changing one is a timelocked action with a published rationale. `OracleRouter` exposes a view of the current feed, session status, staleness, multiplier and pause flag for every token, which the loan explorer and risk page display live.


---

# 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.syndromics.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.
