Skip to main content

Oracles on Morpho

How it works, how to read it

Oracles are smart contracts that provide external data, particularly price information, to blockchain applications.

Oracles on Morpho

In lending protocols like Morpho, oracles provide price data needed to determine what one token is worth relative to another. For example, the oracle of a cbBTC/USDC market is supposedly answering the question: "How many USDC is 1 cbBTC worth right now?”

On Morpho, markets are isolated and represent a pair of assets "collateral asset / loan asset". Borrowers deposit the collateral asset in order to borrow the loan asset.

The oracle price is used to calculate your borrower's current LTV (Loan-To-Value ratio). This is compared against the market's LLTV (Liquidation Loan-To-Value threshold) to determine if you can be liquidated.
​
Morpho is oracle agnostic, meaning at market creation, the creator can choose any address returning a price as oracle.

Why oracle choice matters for your position

  • Your liquidation risk depends entirely on the oracle's price (and interest accrual)

  • Oracle assumptions (like 1:1 pegs) create additional risks

  • Understanding your oracle = better understanding the risk

Oracles on the Morpho app

On the Morpho app, you can find detailed information around markets' oracles.

Vaults do not use oracles directly. Instead, they allocate into one or more markets, and the markets are the ones utilizing oracles.

Oracle details are displayed in each market page level.

Like with the cbBTC/USDC market on Base, the main 'Market' tab will show the oracle price info.

The 'Risk' tab provides more details on an oracle's attributes:

Data

Meaning

Oracle address

Redirects you to the oracle's page on the block explorer

Oracle creation

Oracle deployment transaction

Created on

Oracle creation date

Providers

Oracle's feeds providers

Admins

Addresses that can change a feed or setting in this oracle, as reported by the decoder

Trusted by

Curators listing a market using this oracle

Oracle price

Price returned by the oracle currently. The oracle price is what determines your position health factor and liquidation for this market

DefiLlama price

Market price sourced from DefiLlama for informational purposes only. It does not affect your position

Value secured

Collateral and liquidity secured by the oracle across markets

The process to locate oracle details is consistent across all Markets, making it applicable to any Morpho vault or deployment. Remember that oracle information is not displayed at the Vault level but is always tied to the Market level.

For more detailed info about the oracle, you can look at the Oracle price construction section.

Oracle price construction: the oracle decoder

Every Morpho market uses an oracle to price its collateral against the asset being borrowed. The Oracle Decoder shows how that oracle builds its price: which feeds it reads, who provides them, and who can change them.

We read this data from the blockchain and from providers’ published feed lists, and show it as received with no modification or opinion added. We don’t rate oracles, review them, rank them, or say whether they’re good for a market, we simply report what feed providers share or don't share.

What each column means

Column

What it shows

Feed

A price feed the oracle reads, such as BTC / USD.

Type

What kind of price the feed reports, such as a market price or an exchange rate. For Chainlink, Chronicle and RedStone feeds, this is based on the provider’s own feed list. For other contracts, such as vaults, it’s based on how the contract calculates its price.

Provider

Who publishes the feed.

Admin

Addresses that can change the feed or its settings. None means there are none. Unknown means we couldn’t tell.

Updates

How often the feed is meant to update (heartbeat), and how far the price can move before it updates early (deviation threshold). These are reported by the provider.

Latest Value

The feed’s value when we last checked. Hover it to see when the feed last updated.

You may also see:

  • ⚠️ Stale: the feed hasn’t updated as defined by the contract updating frecuency. This only tracks the feed’s update schedule, not the price.

  • Fixed 1:1: the oracle has no feed in this slot and uses a value of "1" instead. (MorphoChainlinkOracleV2 only).

  • Feed 1 / Feed 2: the oracle reads two separate sets of feeds. Each set is shown in its own table.

  • Collateral / Loan: which side of the price each feed belongs to.

Where the data comes from

  • The blockchain. We read the oracle and every contract it depends on at the same block time: which feeds it reads, their values, their admins and when they last updated.

  • Provider feed lists. Chainlink, Chronicle and RedStone publish lists of their official feeds. We check each feed against these lists, and take each feed’s update settings from them.

  • Official provider contracts. API3, Pyth and Stork don’t publish feed lists. We check that their feeds read from the provider’s official contract on that chain.

We don’t change any of this data.

How fresh it is

We read every listed market’s oracle once an hour. All values in one table come from the same moment. The market’s oracle reads its feeds live, so the price it uses right now can differ slightly from what’s shown.

Supported providers and oracles

  • Price providers: Chainlink, Chronicle, RedStone, API3, Pyth, Stork

  • Other contracts supported: Pendle, Ojo, Lido wstETH, ERC-4626 vaults, Morpho vaults, Midas, Maple, Compound price feeds and Steakhouse MetaOracles

When we add support for a contract design, every oracle that uses it is broken down automatically, including new markets.

When an oracle’s breakdown isn’t available

We only show an oracle’s breakdown when we recognise every contract it uses. If even one part isn’t recognised, we show nothing rather than a partial breakdown, because the missing part could be the one that matters most.

You’ll see one of three reasons:

  • Not supported: the oracle uses a contract not currently supported. Check it independently before relying on it.

  • Market not listed: we only decode oracles for listed markets.

What the decoder doesn’t check

  • Whether a feed’s price is accurate or matches the market.

  • Whether a feed can be manipulated, or how liquid its asset is.

  • How providers run their feeds offchain.

  • Whether an oracle is a good fit for a market.

The decoder shows how an oracle is built. Use it as one input to your own research.


It is also possible to look at onchain data to identify the oracle price construction:

How to identify oracle nature/sources via explorer (advanced)

An oracle can be composed of one or several price feeds combined to provide a resulting price.

To understand "where does the price comes from?", one needs to identify which feeds the oracle uses.
​

To do so, one has to check the oracle contract on the chain explorer. You can reach it via the link available in the market's 'Risk' tab.
​
e.g. with the cbBTC/USDC market on Base.


​1. Get to the oracle contract on the explorer

https://basescan.org/address/0x663BECd10daE6C4A3Dcd89F1d76c1174199639B9
​
Access the Contract tab and the Read Contract (or Read as Proxy) sub-tab. There, click on Expand all.
​

2. Check the price

At the bottom of this page, you can see the price reported by the oracle.

Note on Reading Prices on Explorers

When you check the oracle's price() function, you'll see very large numbers that may look wrong. This is normal blockchain precision.

The exact number of decimals depends on your token pair:

Precision = 36 + (loan token decimals) - (collateral token decimals)

Examples:

- BTC (8 decimals) / USDC (6 decimals) = 34 decimals of precision

- ETH (18 decimals) / USDC (6 decimals) = 24 decimals of precision

- USDC (6 decimals) / USDC (6 decimals) = 36 decimals of precision

In our cbBTC/USDC example:
Precision = 36 + 6 (USDC decimals) - 8 (cbBTC decimals) = 34
​
Applied to the price retrieved at a point in time:
​price: 839677126298000000000000000000000000000
price with precision: 83967.7126298000000000000000000000000000
1 cbBTC = 83967.7126298 USDC


​​3. Identify the feeds

Goal is to identify the feed used in this oracle. A feed is any non 0 address in the feeds fields BASE_FEED_1, BASE_FEED_2, BASE_VAULT, QUOTE_FEED_1, QUOTE_FEED_2 and QUOTE_VAULT.
More advanced info on this oracle parameters in the documentation here.

Understanding Feed Fields

• BASE = In general, it is linked to your collateral asset (e.g., cbBTC)

• QUOTE = In general, it is linked to the loan asset (e.g., USDC)

• The oracle calculates: Collateral Price / Loan Asset Price

In this example, there is only one feed visible in the BASE_FEED_1: 0x64c911996D3c6aC71f9b455B1E8E7266BcbD848F
​
This means that this oracle uses only one feed as source to price the market.


​4. Identify the feed's nature

Now that the feed or feeds are identified with their address, one will have to check each feed's address to understand its nature and source.
​
Click on the feed to get to the address: https://basescan.org/address/0x64c911996D3c6aC71f9b455B1E8E7266BcbD848F
​
Then you'll have to identify which type of feed it is.
​
​Feed providers:

Chainlink feeds' description often refers to the assets being priced:

Other feeds providers can be Chronicles, Pyth, Api3, etc.
​

Once you've identified the feed provider and the asset(s) priced, you can get to its interface and look out for the feed's dedicated page.
​

For the cbBTC/USDC market on Base, you can find the related feed on the Chainlink app here: https://data.chain.link/feeds/base/base/btc-usd
And compare that the contract address matches the feed's address:

Congratulations! You just identified that the cbBTC/USDC market solely uses a BTC/USD Chainlink feed.

CRITICAL ASSUMPTIONS IN THIS ORACLE

This oracle makes two 1:1 assumptions:

• cbBTC = BTC (uses BTC/USD feed for cbBTC)

• USDC = USD (no USDC feed = hardcoded to $1)

Always check what 1:1 assumptions your market's oracle makes.

Understanding Price Path - cbBTC/USDC example

Here are a few additional insights when looking at other Morpho markets' oracles:

  • You'll see oracles named MorphoChainlinkOracleV2, it does not mean they have been deployed by Morpho. It means the oracle has been deployed using the MorphoChainlinkOracleV2Factory, a tool/framework allowing anyone to easily deploy custom oracles.
    More on this framework and how to deploy oracles here.

  • Hardcoded prices: In MorphoChainlinkOracleV2 oracles, when you see 0x0000...0000 in a feed field:

    • That conversion step is SKIPPED in the price calculation.

    • The price for that step is HARDCODED to 1:1

    • cbBTC/USDC example: No QUOTE_FEED_1 means "USDC = USD" at exactly 1:1

    • ⚠️ Risk: If the real market price moves away from 1:1, the oracle won’t notice because it assumes the peg is perfect.

  • Despite currently being the majority of Morpho markets' oracles, the oracle used in Morpho Markets V1 are not necessarily using the MorphoChainlinkOracleV2 framework. Any address returning a price through a public price() function can be used as oracle.

Understand the different types of feeds

Besides feed providers, there can be other types of feeds. Here is a non-exhaustive list of price feed types.

Feed providers

NAV (Net Asset Value)

The NAV represents intrinsic worth based on underlying holdings, not market trades. The NAV reflects the claimable value per unit of the underlying collateral and is derived from onchain accounting (ERC4626 convertToAssets value), or third-party reports.

e.g. ERC4626 are used in BASE_VAULT and QUOTE_VAULT fields.

DEX pools

A feed can point to a DEX pool (Uniswap, Aerodrome, Curve, etc.) taking into account this pools' market price.
​

Customs feeds

The MorphoChainlinkOracleV2 framework can use any feed returning a price, not only the ones mentioned above.


​Additional resources


You can read the more about oracles in the related documentation section here.

Did this answer your question?