Market cap $2.63 T −1.48 % over 24 hours24h volume $61.82 BBTC dominance 59.3 %ETH 10.6 %Fear & Greed 26 FearCoins 22,751

DeFi oracles explained: push vs pull, TWAP, stale prices and manipulation

DeFi oracles in depth: Chainlink push feeds, Pyth pull updates, Uniswap TWAPs, stale prices, Mango Markets and the 2026 cases, with checks to run.

Advanced 28 min readUpdated Read first: Yield-bearing stablecoins: sUSDS, tokenised treasuries and the rules on interest
A satellite dish, connected nodes, candlesticks and a magnifying glass
Table of contents
  1. What a lending market does with a price, and why 3% can be enough
  2. Push oracles: how Chainlink price feeds update on a deviation or a heartbeat
    1. Nodes, off-chain reporting and a median
    2. Deviation, heartbeat and real parameters for ETH, BTC and USDC
    3. Bounded, single-source and market-hours feeds
  3. Pull oracles: Pyth, Chainlink Data Streams and RedStone bring the price to the transaction
    1. Pyth after the Core upgrade: routers, Merkle roots and a 3-of-5 quorum
    2. Chainlink Data Streams: signed reports and an on-chain verifier
    3. Push or pull: who chooses the update decides where the risk sits
  4. On-chain TWAP oracles: using Uniswap pools as their own price source
    1. Uniswap v2: a start-of-block price summed over time
    2. Uniswap v3: tick accumulators and a geometric mean
    3. What a TWAP costs to attack, and what it hides
  5. Stale prices: how old can an oracle price be before it is dangerous?
    1. Checking updatedAt and setting a maximum age
    2. Layer 2 sequencers: uptime feeds and a grace period
    3. When a floor or a cap becomes the bug
  6. Manipulating DeFi oracles: from bZx to Mango Markets and 2026
    1. bZx, February 2020: two attacks, one oracle case
    2. Mango Markets, October 2022: an honest oracle reading a thin market
    3. The court outcome: convictions vacated on 23 May 2025
    4. 2026: thin markets, wrong settings and forged updates
  7. Defences that cost less than the attack
  8. Oracles for tokenised funds and proof of reserve
    1. A net asset value is published once a day; the chain never closes
    2. Proof of reserve: three ways to know the backing exists
  9. US rules: what the CFTC, SEC and courts have said about oracle manipulation
  10. How to check a protocol’s DeFi oracle before you deposit

On 15 February 2026, at 6:01 PM UTC according to Decrypt, a Moonwell governance proposal called MIP-X43 was executed on Base. One of the new price settings for cbETH, Coinbase’s wrapped staked ether, took the raw cbETH/ETH exchange rate and never multiplied it by the ETH/USD price. The lending market suddenly valued cbETH at about $1.12 instead of roughly $2,200. Liquidators repaid roughly a dollar of debt and seized a total of 1,096 cbETH, according to Anthias Labs as quoted by Decrypt.

Moonwell was left with $1.78 million of bad debt, according to The Block, citing the protocol’s post-mortem. Nobody hacked anything. A contract trusted a number. That is what DeFi oracles are about: not a neutral data pipe, but a trust decision with a price, a delay and an attack surface. Every design answers three questions in its own way. Who signs the number? How old may it be when a contract uses it? And how much does it cost an attacker to move it?

A short reminder first. A blockchain that runs exactly as written when it is called, holding and moving funds according to its code, without an intermediary able to change the outcome.">smart contract cannot open a website or ask an exchange for a quote; every price it reads must have been written on-chain by a transaction, and whoever writes it becomes part of the protocol’s security. ethereum.org calls this the oracle problem: proving that injected data came from the right source, untampered and on time. Our glossary entry on the blockchain oracle covers the definition; this lesson assumes it and goes into the mechanics.

It also follows on from our lesson on yield-bearing stablecoins. Tokens such as sUSDS, sUSDe and tokenised fund shares need prices too, and several of them get theirs from an exchange rate or a net asset value rather than from a market. If you want to see where the oracle layer sits among wallets, chains, protocols and front ends, our map of the DeFi stack places it.

What a lending market does with a price, and why 3% can be enough

Lending protocols are the heaviest users of oracles. They multiply the oracle price of your collateral by a threshold to decide how much you may borrow, and they compare it with your debt to decide when you can be liquidated. The oracle is read on every borrow, every withdrawal and every liquidation call.

A worked example with illustrative round numbers, not any market’s real settings. You deposit collateral worth $10,000 in a market with an 80% liquidation threshold and borrow $7,500. You become liquidatable when the collateral, as the oracle sees it, falls below $9,375: a 6.25% drop. If the oracle under-reports the collateral by 3% for an hour, a position already 4% from the line is liquidated even though the market never moved. The liquidator buys your collateral at a discount, and that discount is your loss.

The reverse error is worse for everyone else. If the oracle over-reports collateral, borrowers can take out more than the collateral is worth, walk away, and leave the shortfall as bad debt shared by depositors. That is the pattern of most manipulation cases below.

Four families of design exist. Push feeds write the price on-chain on a schedule (Chainlink Data Feeds is the best known). Pull oracles sign prices off-chain and let the user bring them into the transaction (Pyth, Chainlink Data Streams, RedStone’s pull mode). On-chain TWAPs read a DEX’s own history (Uniswap). And protocols increasingly add in-house layers on top: exchange-rate formulas, caps and bounds, like the CAPO system used by Aave. Each has its own way of failing.

Nodes, off-chain reporting and a median

A Chainlink Data Feed is run by a set of independent node operators, each pulling prices from several data sources. Under the Off-Chain Reporting protocol described in Chainlink’s documentation, the nodes share their observations over a peer-to-peer network, a leader assembles a report, a quorum of nodes signs it and a single transaction carries it on-chain. The aggregator contract checks the signatures and exposes the median of the observations as the answer, together with a timestamp and a round number.

The median matters. A minority of faulty or dishonest nodes cannot move it far, and one transaction per round keeps gas costs shared rather than paid by every node. The weak point is elsewhere: the nodes report what their data sources say, so a feed for a token that trades on two thin venues is only as good as those two venues.

Deviation, heartbeat and real parameters for ETH, BTC and USDC

A push feed does not write every block. Chainlink’s Data Feeds documentation lists two triggers. The deviation threshold: nodes watch the price off-chain and publish a new round when it moves beyond a set percentage from the last on-chain value. The heartbeat: if the price stays inside that band, a round is published anyway after a fixed time.

Chainlink publishes each feed’s settings in its reference-data directory. On Ethereum mainnet, retrieved on 28 October 2026, the parameters of three widely used feeds were these:

Feed (Ethereum mainnet)HeartbeatDeviation thresholdDecimals
ETH / USD3,600 s (1 hour)0.5%8
BTC / USD3,600 s (1 hour)0.5%8
USDC / USD82,800 s (23 hours)0.25%8 (bounded stablecoin feed)

Read that as a reader of risk, not of code. At an illustrative ETH price of $3,000, a 0.5% threshold means the on-chain price can sit up to $15 away from the market before the next write, and in a calm market an hour of silence is normal, not a fault. Of the 301 feeds listed in the same file, the most common heartbeat was 86,400 seconds, a full day. Feeds also differ in decimals: crypto/USD pairs use 8 and crypto/ETH pairs 18, which is why integrators are told to read decimals() rather than assume it.

In a crash the deviation trigger fires repeatedly, so the feed keeps up, but each write still waits for the nodes to agree and for the transaction to be included. On a congested chain that delay can stretch, which is one reason lenders build buffers between the borrowing limit and the liquidation threshold.

An hourglass beside a server rack, a lightning bolt and a gear
A push feed writes a new price when it moves 0.5% or when the hourly heartbeat comes due.

Bounded, single-source and market-hours feeds

Chainlink’s guide to selecting data feeds warns users about categories that behave differently. A bounded stablecoin feed caps the reported price at a pre-set maximum and, the docs note, has no lower bound: the cap stops a brief spike above $1 from inflating collateral, while a real depeg still shows. Some feeds rely on a single data source, and each feed carries a market-pricing risk rating, from low to very high.

Feeds for traditional assets add a time dimension. The docs give each one a market-hours attribute: standard US equity hours are 09:30 to 16:00 Eastern time, Monday to Friday; tokenised-equity feeds that need continuous prices use a 24/5 window from 18:00 ET Sunday to 17:00 ET Friday. A blockchain trades on Saturday; a stock does not. Outside its hours, a feed shows the last price, and a protocol that keeps lending against it is lending against a number that cannot move. The same guide recommends circuit breakers that pause a protocol when prices go stale, jump sharply or approach a feed’s minimum or maximum.

Pyth after the Core upgrade: routers, Merkle roots and a 3-of-5 quorum

Pyth collects prices from first-party publishers such as trading firms and exchanges. Many tutorials still describe an app-specific chain, Pythnet, plus Wormhole guardian signatures. That is out of date. Pyth’s own documentation, consulted on 28 October 2026, says: “That blockchain has shut down as part of the Pyth Core upgrade.”

In the current design, five independently operated routers each compute price aggregates, pack them into a Merkle tree and sign the root. A service called Hermes collects the signed roots and price messages. A user, a keeper or a protocol’s front end fetches the signed root and the Merkle proof for the prices it needs and submits them to a Pyth contract inside its own transaction; the contract accepts the update when at least 3 of the 5 router signatures verify. Each price comes with a confidence interval, computed from the spread of publisher data, and Pyth’s best-practice page tells integrators to use it, for example by pausing when the interval is wide relative to the price.

Pyth’s homepage, consulted on 28 October 2026, gave more than 3,600 live price feeds, more than 138 data publishers and more than 720 data consumers as of September 2026, figures the project reports itself.

Chainlink runs a pull product too. In Data Streams, a decentralised oracle network signs reports and hands them to an aggregation network with several sites running in parallel. Applications fetch reports over a REST or WebSocket API and, when they need a price on-chain, submit the report to a Verifier contract that checks the network’s signatures before the price is used. Chainlink offers it as a standard API and as a version paired with its Automation service, built to limit front-running in trading applications. The pages consulted give no latency figure, so none is quoted here.

RedStone, a third provider, offers both models. Its own comparison describes a push mode that writes prices on a time interval or deviation, with gas paid by the oracle or the protocol, and a pull mode that attaches signed data packages to the calldata of the user’s transaction, so the user pays a slightly higher gas fee unless the protocol subsidises it.

Push or pull: who chooses the update decides where the risk sits

“Push” and “pull” describe who triggers and pays for the on-chain write. Neither is safer by nature; they move the risk to different places.

Push feedPull oracleOn-chain TWAP
Who writes the priceOracle nodes, on deviation or heartbeatAny user or keeper, inside its own transactionNobody: the DEX pool records it as it trades
Who pays gasThe oracle network (cost spread over all users)The user, or the protocol if it subsidisesThe reader of the TWAP, plus traders of the pool
Typical age of the priceUp to the heartbeat in calm marketsAs fresh as the update submittedHalf the averaging window, on average
Main failure modeStale or floored price, bad sourcesOld or chosen update, verifier bugThin pool moved over the window
Real exampleVenus, May 2022 (floor of a feed)Bonzo Lend, July 2026 (verifier)Inverse Finance, April 2022

With pull, the person who submits the update chooses when and which valid update arrives. Pyth’s best practices warn that adversaries can pick which signed update to submit, so protocols must enforce ordering and a maximum age; otherwise a valid but older price can be replayed while it is still inside the freshness window.

The verification path is the other weak point. On 11 July 2026, Bonzo Lend on Hedera lost about $9.05 million (DefiLlama). According to Bonzo’s preliminary report, reported by Cointelegraph and The Block, the attacker deposited 250 SAUCE tokens worth a few dollars and submitted a price update that inflated their value by about 12 orders of magnitude; Supra’s on-chain verifier accepted it although it carried a zeroed signature. The attacker then borrowed about 6.63 million USDC and 34.5 million wrapped HBAR. Bonzo said its own contracts and Hedera’s network were not at fault; Supra acknowledged the flaw and deployed a fix. A pull oracle is only as strong as the contract that checks the signatures.

On-chain TWAP oracles: using Uniswap pools as their own price source

Uniswap v2: a start-of-block price summed over time

A time-weighted average price (TWAP) skips outside parties altogether: the DEX records its own price history and a protocol averages it. Uniswap made this a feature in v2. Its v2 oracle documentation explains that every pair measures the price at the start of each block, before any trade in that block, so the price was set by the last transaction of the previous block. To skew it, an attacker must make a bad trade at the end of one block and hope to undo it in the next, while arbitrageurs try to take the gap.

That alone would not protect a big loan, so v2 adds the start-of-block price, weighted by how long it lasted, to a running cumulative variable. A protocol reads the cumulative value at the start and at the end of a window and divides the difference by the window length: that is the TWAP. The docs give the rule of thumb. The cost of manipulation rises roughly in line with the pool’s liquidity and with the length of the window; moving a 1-hour TWAP by 5% costs about what it would cost to hold the price 5% off in every block for an hour, lost to arbitrage and fees.

Uniswap v3: tick accumulators and a geometric mean

Uniswap v3 changed the arithmetic. Every v3 pool stores observations of a tick accumulator, the running sum of the current tick multiplied by elapsed time. The array starts with one slot; anyone willing to pay the gas can raise its cardinality up to 65,535 slots, which the docs say gives about 9 days of history or more. A consumer calls observe() with the number of seconds ago it wants, takes two accumulator values, and divides the difference by the time between them. The result is an average tick, which converts to a price as 1.0001 to the power of the tick. Because the average is taken on ticks, the price is a geometric mean, not an arithmetic one. The docs’ own example: a tick of 100,000 corresponds to about 22,015.5 USDC per WETH.

Two caveats. On Arbitrum One several blocks can be produced per second and timestamps come from the sequencer’s clock, so observations are more granular there. And the newest version has nothing built in: the v3 page states that “Uniswap v4 does not include built-in oracle functionality.” A v4 pool can get an oracle through a hook, but only if someone writes and audits that hook.

What a TWAP costs to attack, and what it hides

It is slow by design, and that is both its protection and its flaw. A 30-minute TWAP reports the average of the last 30 minutes, so in a crash it overvalues collateral and liquidations arrive late, which can leave bad debt. A short window on a thin pool is cheap to move. A long window on a deep pool is expensive to move but lags the market. This is why the large lenders price major assets with feeds and keep TWAPs for the long tail or as a sanity check.

Inverse Finance learned the cost of a thin pool on 2 April 2022. DefiLlama lists a loss of $15.6 million. In RedStone’s analysis of the attack, the attacker withdrew 901 ETH from Tornado Cash, swapped 500 ETH for INV in the thin INV-WETH pool on SushiSwap, and held that price across more than one block, so the SushiSwap TWAP that Inverse used as its single oracle for INV picked it up. The attacker then borrowed ETH, WBTC, DOLA and YFI worth about $15.6 million against the inflated INV. RedStone puts the cause down to a single oracle built on a low-liquidity pool. A second incident on 16 June 2022 cost $5.8 million, also filed by DefiLlama as price manipulation.

The v2 documentation names one more condition: without arbitrageurs taking the gap, the classic attack needs the attacker to produce two blocks in a row. That page was written in the proof-of-work era. Under proof of stake, the proposer of each slot is known shortly in advance and one validator can draw two consecutive slots, and the Inverse case shows that an attacker who keeps a price up across blocks, by whatever route, gets past the start-of-block defence.

Stale prices: how old can an oracle price be before it is dangerous?

Checking updatedAt and setting a maximum age

Chainlink feeds are read through latestRoundData(), which returns the round number, the answer, when the round started, when it was updated (updatedAt) and the round in which the answer was computed. The function never refuses to answer: if no node has written for six hours, it returns the six-hour-old price. Checking the age is the consumer’s job. A minimal pattern, written for this lesson and simplified from the logic in Chainlink’s examples, looks like this:

(uint80 roundId, int256 answer, , uint256 updatedAt, ) = feed.latestRoundData();
require(answer > 0, "bad price");
require(block.timestamp - updatedAt <= MAX_AGE, "stale price");
// MAX_AGE: a little above the feed's heartbeat, e.g. 3,600 s + margin for ETH / USD
uint256 price = uint256(answer); // scale with feed.decimals()

The right maximum age depends on the feed. Set it below the heartbeat and the protocol halts in every calm hour; set it at a day for a feed that should update hourly and a broken feed goes unnoticed for 23 hours. Pyth handles the same problem on the call itself: its SDK function getPriceNoOlderThan() reverts in Solidity if the price is older than the age you pass, and its best-practice page reminds users of its low-latency Pyth Pro service that Pyth timestamps there are in microseconds while block.timestamp is in seconds.

Layer 2 sequencers: uptime feeds and a grace period

On a layer 2 rollup, a single sequencer usually orders transactions. Our lesson on layer 1 versus layer 2 explains the design; the oracle problem is what happens when that sequencer stops. Chainlink’s L2 sequencer documentation explains that users then lose the usual way to send transactions, while experts can still go through the layer 1 contracts, a slower and costlier route that creates “an unfair advantage” for those who can bypass the sequencer. When the sequencer comes back, prices may have moved a lot and borrowers have had no chance to top up.

Chainlink’s answer is a Sequencer Uptime Feed: an answer of 0 means the sequencer is up, 1 means it is down. The example contract in the docs refuses to read a price while the sequencer is down and for a grace period of 3,600 seconds after it restarts, so borrowers can repair positions before liquidations resume. On Arbitrum the status is updated through the layer 1 delayed inbox, so the “down” flag is processed before new transactions when the sequencer returns; on other networks it is relayed from layer 1. The docs list feeds on Arbitrum, Base, Celo, Mantle, MegaETH, Metis, OP, Scroll, Soneium, X Layer and ZKsync, with a caution: “Chainlink is no longer expanding L2 Sequencer Uptime Feeds to additional networks.” Existing feeds keep working; a protocol on a newer rollup needs another way to detect downtime.

When a floor or a cap becomes the bug

Some of the costliest oracle failures came from limits designed as safety features. In May 2022, as LUNA collapsed, the Chainlink LUNA/USD feed used by Venus Protocol on BNB Chain and Blizz Finance on Avalanche had a hard-coded minimum answer of $0.10. LUNA traded at a fraction of a cent, but the feed kept returning the floor, so anyone could buy LUNA on the market and post it as collateral worth $0.10 a token. DefiLlama records an $11.2 million loss for Venus, labelled “stale oracle price”; REKT reported about $13.5 million drained from Venus, which said its risk fund would be used to cover the shortfall, and $8.3 million from Blizz, which according to REKT could not react in time because of its timelock. The feed did what it was configured to do; the integrators had not checked what happens at its edges.

On 10 March 2026, a cap on Aave did the opposite. CAPO, the Correlated Asset Price Oracle, limits how fast the exchange rate of a yield-bearing token such as wstETH can be reported to rise, so that a manipulated rate cannot inflate collateral. According to The Block, citing the post-mortem by Chaos Labs, Aave’s risk manager, an update to the snapshot ratio on Aave’s Ethereum Core and Prime markets ran into the rule that the ratio can only be increased by 3% every 3 days. The capped rate came out at roughly 1.1939 against about 1.228 on the market, a 2.85% cut in the effective exchange rate. About 10,938 wstETH, around $26 million, was liquidated across roughly 34 accounts; third-party liquidators gained about 499 ETH. Aave reported no bad debt, and users were to be repaid from 141.5 ETH recovered plus up to 345 ETH from the DAO treasury.

Moonwell’s cbETH error in February, from the opening of this lesson, belongs to the same family: a configuration, not a market, set the price. At Moonwell the fix needed a new vote and a timelock, so liquidations went on in the meantime, and at Blizz the timelock stopped any quick reaction. A wrong price is often easy to diagnose and slow to correct.

Manipulating DeFi oracles: from bZx to Mango Markets and 2026

bZx, February 2020: two attacks, one oracle case

The bZx attacks of February 2020 are often cited together, but they were different. Quantstamp’s analysis, published on 27 February 2020, classed the first as a slippage problem on Uniswap, not an oracle attack. The second was an oracle case: the attacker used a flash loan to buy sUSD on thin DEX markets until its price there soared, and bZx, which priced collateral from those DEX prices, accepted the inflated sUSD as collateral for a large loan. Quantstamp put the underwater position at about $800,000. The lesson stuck: a spot price from one pool, read in the same transaction, is a number an attacker can write.

Mango Markets, October 2022: an honest oracle reading a thin market

On 11 October 2022, Avraham Eisenberg used two accounts on Mango Markets, a Solana trading platform, to take opposite sides of a large MNGO perpetual futures position. According to the court opinion described below, the perpetual’s price came from an oracle that pulled data from three exchanges, FTX, AscendEX and Serum, to find MNGO’s average spot price. He bought MNGO on those venues, the price rose, the long side of his position showed a huge unrealised gain, and Mango counted that gain as collateral. He then borrowed and withdrew more than $100 million of crypto from the platform. Court exhibits put his perpetual trades around 6:24 PM and his withdrawals between 6:29 PM and 6:57 PM that day. DefiLlama lists the loss at $115 million.

Nothing in the oracle was broken. It reported prices that were real on the venues it watched; those venues were simply thin enough to move with a few million dollars. The ratio that matters is the cost of moving the input against what the protocol lets you borrow once it has moved. Mango let a paper gain on its own illiquid token become borrowing power.

The court outcome: convictions vacated on 23 May 2025

After a nine-day trial in April 2024, a jury convicted Eisenberg of commodities fraud, commodities manipulation and wire fraud. On 23 May 2025, Judge Arun Subramanian of the Southern District of New York granted his motion under Rule 29 of the federal criminal rules in an Opinion and Order (case 23-cr-10). The conclusion reads: “Eisenberg’s convictions on counts one and two are vacated. The Court will enter a judgment of acquittal on count three.”

The reasons differ by count, and summaries often blur them. Counts one and two, the commodities charges, were vacated for improper venue: the opinion notes that Eisenberg was never in New York in connection with the scheme and traded from Puerto Rico. Count three, wire fraud, ended in acquittal because the government had not shown a false representation; the opinion stresses that Mango Markets had no terms and conditions, policies or rules on manipulation or on borrowing at the time. In the court’s words, “On a platform with no rules, instructions, or prohibitions about borrowing, the government needed more to show that Eisenberg made an implicit misrepresentation”.

This was not a finding that the price move was harmless. The ruling decided that these charges were not proven in this court, and a conviction vacated for venue is not a verdict on the facts. Press reports say the government filed an appeal; Coindaro found no decision of the Court of Appeals for the Second Circuit as of 28 October 2026. The civil cases filed in January 2023 by the CFTC, which described it as its first case involving a scheme “sometimes called ‘oracle manipulation'”, and by the SEC, which alleged that about $116 million of crypto assets was taken, remain allegations; Coindaro found no final resolution of either.

A hooded figure, a judge's gavel, a rising line and a warning sign
Mango Markets: a thin market pushed up, then two convictions vacated and an acquittal in May 2025.

2026: thin markets, wrong settings and forged updates

The 2026 cases show the same three failure types again. In February, YieldBlox, a pool built on the Blend lending protocol on Stellar, used the Reflector oracle, which Halborn describes as a volume-weighted average price oracle. In Halborn’s account, the USTRY/USDC market had seen no trades for 15 minutes after its only market maker withdrew; the attacker placed a sell offer at 501 USDC per USTRY and, from a second account, bought 0.05 USTRY at about 106.7 USDC. Halborn says that one trade set USTRY at about $106 against a real value of about $1.05, and that the attacker then borrowed 61.25 million XLM and 1 million USDC, the pool’s entire reserves. Halborn put the loss at about $10.2 million, of which $7.2 million was frozen by Stellar Tier-1 validators; DefiLlama lists $10.97 million on 22 February. Halborn wrote that the oracle “worked as designed”; BlockSec called it a pool-operator configuration issue, not a flaw in Blend’s core contracts.

DefiLlama’s hack list, consulted on 28 October 2026, labels several other 2026 lending losses as price manipulation. Its labels are short and sometimes inconsistent (Bonzo, a forged update, appears as “spot price manipulation”), so the table below gives the label and the mechanism separately. Rhea Lend on NEAR, listed at $18.4 million on 16 April 2026, is left out: published analyses disagree on whether its price source or its own margin-trading checks failed.

DateProtocol (chain)Loss per DefiLlamaDefiLlama labelWhat failed
Feb 2020bZx (Ethereum)not listedn/aDEX spot price of sUSD used as collateral value
2 Apr 2022Inverse Finance (Ethereum)$15.6 millionSpot price manipulationThin INV pool feeding a TWAP
12 May 2022Venus Protocol (BNB Chain)$11.2 millionStale oracle priceLUNA feed floor of $0.10
11 Oct 2022Mango Markets (Solana)$115 millionSpot price manipulationThin MNGO markets, paper gains as collateral
15 Feb 2026Moonwell (Base)$1.78 millionOracle misconfigurationcbETH price missing the ETH/USD factor
22 Feb 2026Blend pool YieldBlox (Stellar)$10.97 millionSpot price manipulationOne trade in an empty market set a VWAP
11 Jul 2026Bonzo Lend (Hedera)$9.05 millionSpot price manipulationVerifier accepted a zeroed signature
27 Aug 2026Moonwell (Base)$8.7 millionSpot price manipulationThinly traded MAMO collateral inflated; tokens sent straight to the market, past its supply cap (Unchained)

Aave’s CAPO incident of 10 March 2026 is not in the list, because it produced wrongful liquidations rather than a theft. It belongs in any honest count of oracle failures all the same.

Defences that cost less than the attack

No single fix exists, but the post-mortems point to a short set of habits. The first is to compare what an attacker must spend to move a price with what the protocol lets them borrow once it moves. Borrow caps and supply caps on long-tail collateral keep that ratio unattractive: Mango and YieldBlox both let a few dollars or a few million of buying unlock the entire pool.

The second is to read more than one source and to check them against each other. A protocol can compare a feed with a TWAP, or a Pyth price with a Chainlink price, and pause when they disagree beyond a set gap. Pyth’s confidence interval does the same job inside one feed.

The third is to bound what can change and how fast. CAPO-style caps on exchange rates and Chainlink’s bounded stablecoin feeds belong here, as do circuit breakers on stale or extreme prices. Aave’s March incident is the caution: a bound must be monitored as closely as the price it protects.

The fourth concerns governance. Moonwell and Blizz both hit the same wall: fixing a bad price required a vote, a timelock or both. A guardian role that can freeze a market fast, with limits on what it can do, is a design choice with trade-offs; a timelock with no emergency path is a choice too. And because one oracle can feed many protocols at once, a wrong price spreads along the same paths as deposits do, the contagion pattern covered in our lesson on DeFi composability and money legos.

Oracles for tokenised funds and proof of reserve

A net asset value is published once a day; the chain never closes

Tokenised money market funds and other real-world assets raise a different oracle question. Their price is not discovered in a market every second; it is a net asset value (NAV) computed by a fund administrator, usually once per business day. Chainlink groups the feeds that carry such numbers under SmartData: Proof of Reserve, NAVLink for net asset values, and SmartAUM for assets under management.

The gap between a daily number and a 24/7 chain is where the risk lives. If a fund’s holdings lose value on a Friday afternoon, the on-chain NAV may not reflect it until the next business day, while lending markets accept the token as collateral all weekend. The CDP vaults behind stablecoins have the same dependency on collateral prices, as the lesson on CDP stablecoins showed. A reader should ask how often a NAV feed updates, who computes the number, and what the protocol does when it stops moving.

Proof of reserve: three ways to know the backing exists

Proof of Reserve feeds report how much backing an issuer holds, so that a contract can compare it with the token supply. Chainlink’s documentation lists three kinds of input: data from a third party such as an auditor, data from a custodian, and data self-reported by the issuer. For the third kind the docs are blunt: “Chainlink Labs is not responsible for the accuracy of self-reported reserves data.” For reserves spread across chains, the issuer often supplies the list of wallet addresses to count, which is also self-reported.

A proof of reserve is therefore only as independent as its input. A feed that relays an issuer’s own figure moves the trust question to the issuer and makes the figure visible on-chain; it does not audit anything. Some issuers go further and wire the feed into minting, so that new tokens cannot be issued if supply would exceed the reported reserves, which turns a dashboard into a hard limit.

US rules: what the CFTC, SEC and courts have said about oracle manipulation

For readers in the United States, Mango Markets is the reference case, and it is unsettled. The CFTC brought a civil case on 9 January 2023, describing it as its first involving what is sometimes called oracle manipulation; the SEC’s complaint, filed on 20 January 2023, alleged violations of the anti-fraud and market manipulation provisions of the Securities Exchange Act; the Justice Department charged the same conduct as commodities fraud, commodities manipulation and wire fraud. The 23 May 2025 opinion vacated the two commodities convictions for improper venue and entered a judgment of acquittal on wire fraud because no misrepresentation was proven, not because the trading was found to be fine. Coindaro found no appeals-court ruling as of 28 October 2026. In the UK, the FCA and HMRC have published nothing specific to DeFi oracles that this lesson relies on.

One practical point for any reader: if an oracle error liquidates your position, there is generally no automatic right to compensation. Aave’s users were offered repayment through recovered funds and a DAO treasury vote, which is a governance decision, not a guarantee. Any tax consequence of a forced liquidation depends on your country’s rules for the disposal of crypto-assets, a subject for a tax adviser.

How to check a protocol’s DeFi oracle before you deposit

Reading a feed costs nothing and needs no wallet, because a read call is not a transaction. To see the ETH/USD feed from the table above:

  1. Open Etherscan and search for the ETH/USD proxy address listed in Chainlink’s data-feeds directory (on Ethereum mainnet: 0x5f4eC3Df9cbd43714FE2740f5E3616155c5b8419).
  2. Go to the Contract tab, then Read as Proxy, and call latestRoundData.
  3. Divide the answer by 10 to the power of 8, the feed’s decimals, to get a dollar price.
  4. Convert updatedAt from Unix time to a date and compare it with the clock; it should be less than an hour old for this feed.
  5. If you prefer to practise on a test network, Chainlink also lists feeds on Sepolia, where the same read works without funds.

Then, for the market you are considering, look for five answers in its documentation or risk dashboard:

  • Which oracle prices each collateral, and is it a feed, a pull oracle, a TWAP or a formula?
  • What are the heartbeat and deviation threshold, and does the protocol enforce a maximum age?
  • What happens at the edges: is there a floor, a cap or a bound, and what does the protocol do when it is hit?
  • How deep is the market behind the price, compared with the borrow cap of that collateral?
  • Who can change the oracle, how fast, and is there a timelock or an emergency guardian?

A market that cannot answer these questions is asking you to trust a number you cannot inspect. The next lesson of the path turns to interest-bearing tokens, where the price question comes back in another form: the exchange rate that tells a contract how much an aToken, a cToken or a vault share is worth.

Sources

  1. Chainlink documentation: Data Feeds, Off-Chain Reporting, selecting feeds (consulted 28 October 2026) docs.chain.link
  2. Chainlink documentation: L2 Sequencer Uptime Feeds docs.chain.link
  3. Chainlink documentation: Data Streams architecture and SmartData (Proof of Reserve, NAVLink) docs.chain.link
  4. Pyth documentation: how Pyth works after the Core upgrade, and best practices docs.pyth.network
  5. Uniswap documentation: v2 oracles and v3 price oracles developers.uniswap.org
  6. United States v. Eisenberg, 23-cr-10 (S.D.N.Y.), Opinion and Order of 23 May 2025 nysd.uscourts.gov
  7. CFTC press release 8647-23: CFTC charges Avraham Eisenberg (9 January 2023) cftc.gov
  8. DefiLlama hacks database (retrieved 28 October 2026) defillama.com
  9. Halborn: Explained, the YieldBlox hack (26 February 2026) halborn.com
  10. The Block: Aave wstETH oracle glitch (March 2026) theblock.co
  11. The Block: Moonwell hit with $1.8 million bad debt after oracle misconfiguration (February 2026) theblock.co
  12. SEC litigation release 25623: SEC v. Avraham Eisenberg (January 2023) sec.gov
  13. Decrypt: oracle error leaves DeFi lender Moonwell with $1.8 million bad debt decrypt.co
  14. Unchained: Moonwell loses $8.7 million on Base as an attacker sidesteps its supply cap (August 2026) unchainedcrypto.com
  15. Cointelegraph: Bonzo Lend $9 million oracle exploit on Hedera (July 2026) cointelegraph.com
  16. BlockSec: YieldBlox DAO incident on Stellar blocksec.com
  17. RedStone: Oracle attacks #1, Inverse Finance redstone.finance
  18. Quantstamp: 10 quick and dirty facts about the bZx hacks (27 February 2020) quantstamp.com
  19. REKT: Venus and Blizz (May 2022) rekt.news
Coindaro Editorial Team

Who wrote this article

Editorial team

Guides, reviews and glossary checked against primary sources

  • Crypto education
  • Exchange reviews
  • Wallets
  • Glossary

The Coindaro editorial team researches and writes every article, review and guide published on Coindaro. Each fact is checked against primary sources such as official documents, regulators and project documentation, and every page lists its sources. We cover crypto markets, technology and regulation for readers in the United States and Europe, independently and without paid placements.

Keep learning