Oracle Registry

Facets quote prices, yields, or reference rates. To keep those look‑ups transparent, every oracle contract or data feed used by a MORE Vault must first be listed in the Oracle Registry. Like the Vault Registry, the Oracle Registry tells the ecosystem where a data point comes from and whether the DAO considers it reliable.

Two-Tier Model

  • Permissionless Oracle Registry – The DAO may publish an oracle’s address. Builders can reference the entry immediately when deploying a vault.

  • DAO‑Approved Oracle Registry – The DAO adds an oracle after verifying its implementation (e.g., Chainlink feed, Pyth feed, Redstone relay, on‑chain TWAP) and liveness guarantees.

Front‑ends default to DAO‑approved oracles, while advanced users may opt into permissionless feeds.

Each registry entry stores:

  • oracleAddress – the contract read by facets.

  • asset – the quote asset, an ERC‑20 or symbol that the feed returns (ETH, USDC, etc.).

  • stalenessThreshold – the maximum time since updatedAt, standardized using Chainlink's interface.

Any non-Chainlink oracle provided by another provider must be wrapped in an adapter in order to standardize its format with the Chainlink interface.

DAO approval criteria

Before adding an oracle, the DAO checklist includes:

  1. Implementation audit – Verified that the contract cannot be paused or manipulated by a single key.

  2. Data source review – Confirm the upstream source (e.g. Chainlink aggregator, TWAP window) and fallback rules.

  3. Liveness test – Feed must have updated within the last stalenessThreshold seconds at proposal time.

If passed, the DAO calls setOracleInfos(assets[], oracleInfo[]) where oracleInfo is struct:

struct OracleInfo {
        IAggregatorV2V3Interface aggregator;
        uint96 stalenessThreshold;
    }

How facets use the registry

  • To get an oracle for a particular asset, you can use the function, getOracleInfo(asset).

  • getAssetPrice(asset) gets the price data from the oracle and checks its staleness.

  • If the oracle is permissionless, the call still succeeds.

Last updated