# Missing L2 sequencer uptime check

L2 price feeds and time-based pricing read without sequencer uptime feed or grace period

_Area: DeFi oracles, liquidations and flash loans. Seen in 9 disclosed reports; latest 2024-09-16. Updated 2026-10-23._

## How it works
On an L2, Chainlink price aggregation transactions are submitted to the L2 itself. When the sequencer is down, no new rounds land, so `latestRoundData()` keeps returning the last price while `block.timestamp` keeps advancing. Any logic that trusts the feed as "current" — or that decays a price with time — silently operates on stale data. The assumption that breaks: that a readable price means the chain is live and the price is fresh. It does not; liveness must be checked separately via the Chainlink L2 Sequencer Uptime Feed plus a grace period after recovery.

## Where it shows up
- Oracle adapters calling `latestRoundData()` with no paired sequencer uptime feed [E4](https://bugbountylibrary.com/r/sherlock%3A2023-05-perennial%3AM-2.md)[E7](https://bugbountylibrary.com/r/sherlock%3A2022-11-sentiment%3AM-4.md)[E8](https://bugbountylibrary.com/r/sherlock%3A2023-02-gmx%3AM-25.md).
- Multiple adapters where one checks uptime and a sibling does not [E7](https://bugbountylibrary.com/r/sherlock%3A2022-11-sentiment%3AM-4.md).
- Time-decaying state machines (Dutch auctions, liquidation auctions) driven by `block.timestamp` without an uptime gate [E1](https://bugbountylibrary.com/r/sherlock%3A2023-12-arcadia%3AM-3.md)[E3](https://bugbountylibrary.com/r/sherlock%3A2023-06-Index%3AM-3.md).
- Uptime checks that compute `block.timestamp - startedAt` without rejecting sentinel `startedAt == 0` [E2](https://bugbountylibrary.com/r/c4%3A2024-06-size%3AM-04.md).
- Settlement/epoch functions that call a reverting oracle, including for event data only [E5](https://bugbountylibrary.com/r/sherlock%3A2023-03-Y2K%3AM-11.md)[E6](https://bugbountylibrary.com/r/c4%3A2022-09-y2k-finance%3AH-02.md).

## How to review
For every L2 price consumer, confirm the invariant: no price is accepted unless the sequencer uptime feed reports up AND the grace period since restart has elapsed. Check the age computation explicitly rejects zero/sentinel timestamps rather than relying on subtraction [E2](https://bugbountylibrary.com/r/c4%3A2024-06-size%3AM-04.md). For auctions and other timestamp-driven pricing, confirm the curve cannot advance while the sequencer is down or within grace [E1](https://bugbountylibrary.com/r/sherlock%3A2023-12-arcadia%3AM-3.md)[E3](https://bugbountylibrary.com/r/sherlock%3A2023-06-Index%3AM-3.md). For settlement paths, confirm a reverting oracle cannot block a critical state transition, especially when the read is informational [E5](https://bugbountylibrary.com/r/sherlock%3A2023-03-Y2K%3AM-11.md)[E6](https://bugbountylibrary.com/r/c4%3A2022-09-y2k-finance%3AH-02.md). Diff sibling adapters for consistency [E7](https://bugbountylibrary.com/r/sherlock%3A2022-11-sentiment%3AM-4.md).

## Variants seen
- Auction decay continues during outage, repaying less than debt [E1](https://bugbountylibrary.com/r/sherlock%3A2023-12-arcadia%3AM-3.md).
- Dutch auction price drifts below market before bids land [E3](https://bugbountylibrary.com/r/sherlock%3A2023-06-Index%3AM-3.md).
- Oracle adapter omits uptime feed entirely; queued updates liquidate without grace [E4](https://bugbountylibrary.com/r/sherlock%3A2023-05-perennial%3AM-2.md)[E7](https://bugbountylibrary.com/r/sherlock%3A2022-11-sentiment%3AM-4.md)[E8](https://bugbountylibrary.com/r/sherlock%3A2023-02-gmx%3AM-25.md).
- Uptime check passes on invalid round because `startedAt=0` [E2](https://bugbountylibrary.com/r/c4%3A2024-06-size%3AM-04.md).
- Uptime check reverts and blocks depeg trigger or epoch end [E5](https://bugbountylibrary.com/r/sherlock%3A2023-03-Y2K%3AM-11.md)[E6](https://bugbountylibrary.com/r/c4%3A2022-09-y2k-finance%3AH-02.md).

## Impact and severity
Unfair liquidations, bad debt, and below-market auction fills [E1](https://bugbountylibrary.com/r/sherlock%3A2023-12-arcadia%3AM-3.md)[E3](https://bugbountylibrary.com/r/sherlock%3A2023-06-Index%3AM-3.md)[E4](https://bugbountylibrary.com/r/sherlock%3A2023-05-perennial%3AM-2.md); borrowing against stale prices [E7](https://bugbountylibrary.com/r/sherlock%3A2022-11-sentiment%3AM-4.md); orders at nonexistent prices [E8](https://bugbountylibrary.com/r/sherlock%3A2023-02-gmx%3AM-25.md); blocked settlement and withdrawals [E5](https://bugbountylibrary.com/r/sherlock%3A2023-03-Y2K%3AM-11.md)[E6](https://bugbountylibrary.com/r/c4%3A2022-09-y2k-finance%3AH-02.md). Severity rises when the stale window coincides with a large price move or when the gate blocks the only recovery path.

## Why fixes fail
A check present in one adapter but absent in a sibling leaves the gap open [E7](https://bugbountylibrary.com/r/sherlock%3A2022-11-sentiment%3AM-4.md); a subtraction-based age check passes on zero timestamps [E2](https://bugbountylibrary.com/r/c4%3A2024-06-size%3AM-04.md); gating only the price read but not the time-decay logic leaves auctions exposed [E1](https://bugbountylibrary.com/r/sherlock%3A2023-12-arcadia%3AM-3.md).

## Evidence
- E1: https://bugbountylibrary.com/r/sherlock%3A2023-12-arcadia%3AM-3.md
- E2: https://bugbountylibrary.com/r/c4%3A2024-06-size%3AM-04.md
- E3: https://bugbountylibrary.com/r/sherlock%3A2023-06-Index%3AM-3.md
- E4: https://bugbountylibrary.com/r/sherlock%3A2023-05-perennial%3AM-2.md
- E5: https://bugbountylibrary.com/r/sherlock%3A2023-03-Y2K%3AM-11.md
- E6: https://bugbountylibrary.com/r/c4%3A2022-09-y2k-finance%3AH-02.md
- E7: https://bugbountylibrary.com/r/sherlock%3A2022-11-sentiment%3AM-4.md
- E8: https://bugbountylibrary.com/r/sherlock%3A2023-02-gmx%3AM-25.md
