# refresh() will revert on Oracle deprecation, effectively disabling part of the protocol

Asset.refresh() catches all errors except empty-data reverts, so a Chainlink oracle deprecated to address(0) reverts refresh(), halting issuance, redemption, auctions and StRSR.withdraw().

- Payout: Contest reward
- Severity: medium
- Program: Reserve
- Credited: 0xA5DF
- Disclosed: 2023-04-27
- Write-up quality: 6/10
- Original: https://github.com/code-423n4/2023-01-reserve-findings/issues/234
- Library page: https://bugbountylibrary.com/r/c4%3A2023-01-reserve%3AM-17
- Tags: domain:web3 impact:dos kind:contest platform:code4rena sev:medium tech:evm tech:solidity technique:source-review vuln:dos vuln:oracle-manipulation

**Target:** Asset.refresh() / OracleLib.price() Chainlink price feed integration
**Root cause:** refresh() deliberately re-throws empty-data errors to block gas-griefing, but a deprecated Chainlink aggregator (set to address(0)) also reverts with empty data, so the legitimate deprecation path is indistinguishable from an attack and reverts.
**Steps:**
1. Deploy Asset with chainlinkFeed_ = deprecated oracle `0x2E5B04aDC0A3b7dB5Fd34AE817c7D0993315A8a6` on Polygon fork
2. Call `aaveAsset.refresh()`
3. Observe revert 'Transaction reverted without a reason string' at Asset.sol:102
**How found:** Read the docs stating refresh() should never revert and that deprecated oracles should let the protocol keep operating; noticed the empty-data catch exception in Asset.refresh() and reasoned that Chainlink deprecation (aggregator set to zero address) produces an empty revert, then confirmed by forking Polygon and calling refresh() against a known deprecated oracle.
**Insight:** When a contract special-cases empty revert data to block gas-griefing, enumerate every other source of empty reverts (deprecated/zeroed oracle aggregators, selfdestructed callees, precompile failures) — the security exception can become a liveness bug.
