# An oracle deprecation might lead the protocol to sell assets for a low price

Deprecated Chainlink oracle makes rebalance() revert with empty data, blocking auction bids and letting a late bidder buy assets below market price.

- Payout: Contest reward
- Severity: medium
- Program: Reserve
- Credited: 0xA5DF
- Disclosed: 2023-11-13
- Write-up quality: 6/10
- Original: https://github.com/code-423n4/2023-06-reserve-findings/issues/8
- Library page: https://bugbountylibrary.com/r/c4%3A2023-06-reserve%3AM-10
- Tags: domain:web3 impact:funds-loss kind:contest platform:code4rena sev:medium tech:evm tech:solidity technique:incomplete-fix technique:source-review vuln:business-logic vuln:dos vuln:oracle-manipulation

**Target:** BackingManager/DutchTrade auction settlement and Chainlink oracle adapter
**Root cause:** When a Chainlink aggregator is deprecated it is set to address(0), so latestRoundData() reverts with empty data. BackingManager's try-catch treats empty error data as out-of-gas and re-reverts, so settleTrade()/rebalance() fails during bids.
**Steps:**
1. Chainlink deprecates an oracle used by the asset registry (aggregator set to zero address)
2. Governance proposal to swap oracle is queued but timelock not yet elapsed
3. A rebalance triggers a Dutch auction; price decays over time
4. Any `bid()` calls `origin.settleTrade()` -> `rebalance()`, which reverts because oracle call returns empty data and catch block re-reverts
5. Bids fail until the oracle-update proposal becomes executable; executor updates oracle, then bids at the decayed low price
**How found:** Prior audit issue (2023-01 #234) established that deprecated Chainlink oracles revert with empty data; warden reasoned that the empty-data check in BackingManager's try-catch would re-revert during settleTrade, and traced bid()->settleTrade()->rebalance() to show bids fail, breaking Dutch auction economics.
**Exploitation:** Attacker waits for oracle deprecation to block all bids during a Dutch auction, then after the governance timelock elapses executes the oracle update and bids at the depressed auction price, acquiring protocol assets below market.
**Insight:** Empty revert data is not proof of out-of-gas; external oracle calls to zeroed aggregators return empty data. Trace every try-catch that special-cases empty returndata and check whether downstream settlement paths (bid->settleTrade->rebalance) inherit the revert, breaking time-decaying auction pricing.
