# Oracle revert blocks later price updates

Validation reverts in price receivers or keepers that stall or cancel later legitimate updates

_Area: DeFi oracles, liquidations and flash loans. Seen in 2 disclosed reports; latest 2024-06-07. Updated 2026-10-23._

## How it works
A price path treats a failed validation as a hard revert instead of a recoverable outcome. When the update is delivered through a sequenced channel (cross-chain messaging, keeper execution, per-block oracle reads), the revert does not just reject one bad input — it blocks or cancels everything queued behind it. The broken assumption is that rejecting an invalid update is harmless; in a sequenced or shared pipeline, a revert is a denial-of-service primitive against later valid updates.

## Where it shows up
- Receiver callbacks (`_ccipReceive`-style) that revert on deviation, zero price, or timestamp guards rather than returning or skipping [E1](https://bugbountylibrary.com/r/c4%3A2024-04-renzo%3AM-04.md)
- Keeper/executor error handlers that only retry on a narrow set of revert reasons (empty/invalid prices) but not on block-number or range mismatches [E2](https://bugbountylibrary.com/r/sherlock%3A2023-02-gmx%3AM-15.md)
- Oracle freshness checks keyed on equality with `block.timestamp` rather than a staleness window [E3](https://bugbountylibrary.com/r/c4%3A2026-01-olas%3AM-02.md)
- Any validation whose failure path is `revert` inside a lane, queue, or per-block read shared by other users

## How to review
Enumerate every revert path in the receiver/validator and ask: does a revert here stop later legitimate updates? The invariant: an invalid or adversarial update must be skippable or retryable without blocking or cancelling unrelated valid updates. For keepers, compare the set of revert reasons treated as retryable against all revert paths in validation code — any uncaught revert becomes a griefing/cancellation primitive [E2](https://bugbountylibrary.com/r/sherlock%3A2023-02-gmx%3AM-15.md). For freshness checks, confirm they use a tolerance window, not equality with the current block [E3](https://bugbountylibrary.com/r/c4%3A2026-01-olas%3AM-02.md).

## Variants seen
- Cross-chain receiver reverts on deviation/timestamp checks, stalling the sequenced lane [E1](https://bugbountylibrary.com/r/c4%3A2024-04-renzo%3AM-04.md)
- Keeper passes out-of-range oracle block numbers; uncaught revert cancels valid orders instead of retrying [E2](https://bugbountylibrary.com/r/sherlock%3A2023-02-gmx%3AM-15.md)
- Same-block reserve update (`sync()`) makes `validatePrice` return false, griefing victims per block [E3](https://bugbountylibrary.com/r/c4%3A2026-01-olas%3AM-02.md)

## Impact and severity
Stalled price feeds, cancelled orders risking liquidation, and per-block griefing of oracle reads [E1](https://bugbountylibrary.com/r/c4%3A2024-04-renzo%3AM-04.md)[E2](https://bugbountylibrary.com/r/sherlock%3A2023-02-gmx%3AM-15.md)[E3](https://bugbountylibrary.com/r/c4%3A2026-01-olas%3AM-02.md). Severity rises when the feed gates liquidations or order execution, and when the trigger is cheap and permissionless (e.g. `sync()`), making repeated denial practical.

## Evidence
- E1: https://bugbountylibrary.com/r/c4%3A2024-04-renzo%3AM-04.md
- E2: https://bugbountylibrary.com/r/sherlock%3A2023-02-gmx%3AM-15.md
- E3: https://bugbountylibrary.com/r/c4%3A2026-01-olas%3AM-02.md
