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. (
MorphoChainlinkOracleV2only).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 (Chainlink feeds page)
Contract nameis oftenEACAggregatorProxy
Chainlink feeds' description often refers to the assets being priced:
Redstone (Redstone feeds page)
descriptionmentions Redstone and asset 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 theMorphoChainlinkOracleV2Factory, a tool/framework allowing anyone to easily deploy custom oracles.
More on this framework and how to deploy oracles here.
Hardcoded prices: In
MorphoChainlinkOracleV2oracles, 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_1means "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
MorphoChainlinkOracleV2framework. Any address returning a price through a publicprice()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 see a detailed view on different feed prices and related risk in this Steakhouse (curator) article.
Credora (risk rating company) also proposes a Market Oracle Characterization.
You can read the more about oracles in the related documentation section here.









