Summary
This proposal tightens oracle safety parameters across the Venus BNB Core Pool: removes a duplicate oracle slot on sUSDe, recalibrates CAPO growth rate caps for liquid staking tokens, and tightens maxStalePeriod on 74 oracle slots.
Motivation
Staleness risk
Many oracle feeds have maxStalePeriod set too loosely relative to their actual heartbeat. For example, CAKE’s Chainlink feed has a 60-second heartbeat but a 24-hour maxStalePeriod - meaning Venus would accept a price that is up to 1,440x older than the feed’s update frequency. During a flash crash or feed outage, this could allow borrowers to use stale collateral values.
Redundant oracle slot (sUSDe)
sUSDe’s PIVOT and FALLBACK both point to the same CorrelatedTokenOracle contract. The fallback provides no additional protection - if the pivot fails, the fallback fails identically.
CAPO re-calibration
asBNB’s growth rate cap (30.5%/yr) is 30x the actual staking APY (~1%), providing diminished protection against oracle manipulation. slisBNB’s cap (4.12%/yr) is barely above actual APY (~3.5-4%), risking false CAPO triggers.
Pre-VIP Actions
These are permissionless calls that must be executed before the VIP to avoid immediate CAPO capping on liquid staking derivatives.
| Action | Contract | Reason |
|---|---|---|
updateSnapshot() |
0x652B90D1d45a7cD5BE82c5Fb61a4A00bA126dde5 (asBNB CAPO) |
Snapshot 43+ days stale. Reducing growth rate without refreshing will immediately trigger capping. |
updateSnapshot() |
0xDDE6446E66c786afF4cd3D183a908bCDa57DF9c1 (slisBNB CAPO) |
Snapshot 16+ days stale. Same risk. |
Specification
1. sUSDe: Disable Duplicate Fallback Slot
sUSDe underlying: 0x211Cc4DD073734dA055fbF44a2b4667d5E5fE5d2
Current configuration:
| Slot | Oracle | Address | Enabled |
|---|---|---|---|
| MAIN | Custom | 0x2B2895104f958E1EC042E6Ba5cbfeCbAD3C5beDb |
true |
| PIVOT | CorrelatedTokenOracle | 0xA67F01322AF8EBa444D788Ee398775b446de51a0 |
true |
| FALLBACK | CorrelatedTokenOracle | 0xA67F01322AF8EBa444D788Ee398775b446de51a0 |
true |
Action: Call ResilientOracle.setTokenConfig() to disable the FALLBACK slot.
2. CAPO Growth Rate Recalibration
| Asset | Contract | Current Rate | New Rate |
|---|---|---|---|
| asBNB | 0x652B90D1d45a7cD5BE82c5Fb61a4A00bA126dde5 |
30.49%/yr | 5%/yr |
| slisBNB | 0xDDE6446E66c786afF4cd3D183a908bCDa57DF9c1 |
4.12%/yr | 5%/yr |
asBNB’s cap is reduced from 30x to ~5x the actual staking yield, providing meaningful protection while leaving adequate headroom. slisBNB’s cap is raised slightly to ~5% to avoid false triggers if actual APY fluctuates near the current cap.
3. maxStalePeriod Tightening (74 slots)
Formula:
| Heartbeat | New maxStalePeriod |
|---|---|
| <= 30s | 60s |
| <= 60s | heartbeat + 60s |
| 60s < HB < 200s | heartbeat + 100s |
| 200s <= HB < 250s | heartbeat + 250s |
| >= 250s | heartbeat + 300s |
Rules:
- Only tighten: if current maxStalePeriod is already tighter than formula, keep current value
- Unset slots (currently 0): set to formula value
3a. Chainlink feeds
| Asset | Role | Feed | HB (s) | Current | New |
|---|---|---|---|---|---|
| BNB | Pivot | 0x0567F232... |
27 | 300 | 60 |
| WBNB | Pivot | 0x0567F232... |
27 | 300 | 60 |
| CAKE | Pivot | 0xB6064eD4... |
60 | 86,400 | 120 |
| DOT | Main | 0xC333eb00... |
600 | 86,400 | 900 |
| XRP | Pivot | 0x93A67D41... |
600 | 86,400 | 900 |
| TRX | Main | 0xF4C5e535... |
600 | 86,400 | 900 |
| ADA | Pivot | 0xa767f745... |
600 | 86,400 | 900 |
| LINK | Main | 0xca236E32... |
600 | 86,400 | 900 |
| AAVE | Main | 0x1Fa0D75D... |
600 | 1,200 | 900 |
| UNI | Main | 0x97E87D0c... |
600 | 1,200 | 900 |
| USDC | Pivot | 0x51597f40... |
900 | 86,400 | 1,200 |
| DAI | Main | 0x132d3C0B... |
900 | 86,400 | 1,200 |
| TUSD | Main | 0xa3334A97... |
900 | 86,400 | 1,200 |
| USDT | Main | 0xb631F3Cb... |
900 | 1,800 | 1,200 |
| XVS | Main | 0x04C584Ce... |
900 | 1,800 | 1,200 |
| BCH | Main | 0x43d80f61... |
900 | 86,400 | 1,200 |
| FIL | Main | 0xE5dbFD90... |
900 | 86,400 | 1,200 |
| LTC | Main | 0x74E72F37... |
900 | 86,400 | 1,200 |
| FDUSD | Main | 0x390180e8... |
86,400 | 88,200 | 86,700 |
| USD1 | Pivot | 0xaD8b4e59... |
86,400 | 93,600 | 86,700 |
| USDe | Pivot | 0x10402B01... |
86,400 | 93,600 | 86,700 |
| U | Pivot | 0xaD8b4e59... |
86,400 | 93,600 | 86,700 |
| XAUm | Main | 0xfa54C1c5... |
86,400 | 93,600 | 86,700 |
3b. RedStone feeds
| Asset | Role | Feed | HB (s) | Current | New |
|---|---|---|---|---|---|
| TRX | Pivot | 0xa17362dd... |
600 | 1,500 | 900 |
| THE | Main | 0xFB1267A2... |
900 | 1,800 | 1,200 |
| FDUSD | Fallback | 0x98DC6E90... |
21,600 | 25,200 | 21,900 |
| USDC | Main | 0xeA251120... |
21,600 | 25,200 | 21,900 |
| DAI | Fallback | 0x0bE6929F... |
21,600 | 25,200 | 21,900 |
| DOT | Fallback | 0xa75CC459... |
21,600 | 25,200 | 21,900 |
| USDT | Pivot | 0xf57bA294... |
21,600 | 25,200 | 21,900 |
| USD1 | Main | 0x6A1c87d1... |
21,600 | 25,200 | 21,900 |
| XVS | Fallback | 0xED2B1ca5... |
21,600 | 25,200 | 21,900 |
| USDe | Fallback | 0x0d9b42a2... |
21,600 | 25,200 | 21,900 |
| XRP | Main | 0xeC7C6Adc... |
21,600 | 25,200 | 21,900 |
| BCH | Fallback | 0x98ECE0D5... |
21,600 | 25,200 | 21,900 |
| SOL | Fallback | 0x90196F6D... |
21,600 | 25,200 | 21,900 |
| ETH | Pivot | 0x9cF19D28... |
21,600 | 25,200 | 21,900 |
| FIL | Fallback | 0xe49df9f6... |
21,600 | 25,200 | 21,900 |
| CAKE | Main | 0x1102D8C7... |
21,600 | 25,200 | 21,900 |
| ADA | Main | 0xc44be6D0... |
21,600 | 25,200 | 21,900 |
| LTC | Fallback | 0x7A9b672f... |
21,600 | 25,200 | 21,900 |
| LINK | Fallback | 0x1b0FDa12... |
21,600 | 25,200 | 21,900 |
| AAVE | Fallback | 0xe4630835... |
21,600 | 25,200 | 21,900 |
| DOGE | Fallback | 0x6f57Ff50... |
21,600 | 25,200 | 21,900 |
| TWT | Pivot | 0xefe76D1C... |
21,600 | 25,200 | 21,900 |
| UNI | Fallback | 0x22d47686... |
21,600 | 25,200 | 21,900 |
| solvBTC | Main | 0xF5F641fF... |
21,600 | 25,200 | 21,900 |
3c. Binance feeds
| Asset | Role | HB (s) | Current | New |
|---|---|---|---|---|
| BNB | Fallback | 60 | 100 | 100 (no change) |
| WBNB | Fallback | 60 | 0 | 100 (to match BNB) |
| lisUSD | Main | 900 | 1,500 | 1,200 |
| TWT | Main | 900 | 1,500 | 1,200 |
| USDC | Fallback | 86,400 | 90,000 | 86,700 |
| DAI | Pivot | 86,400 | 90,000 | 86,700 |
| TUSD | Pivot | 86,400 | 90,000 | 86,700 |
| DOT | Pivot | 86,400 | 90,000 | 86,700 |
| USDT | Fallback | 86,400 | 90,000 | 86,700 |
| USD1 | Fallback | 86,400 | 90,000 | 86,700 |
| XVS | Pivot | 86,400 | 90,000 | 86,700 |
| XRP | Fallback | 86,400 | 90,000 | 86,700 |
| BCH | Pivot | 86,400 | 90,000 | 86,700 |
| asBNB | Pivot | 86,400 | 90,000 | 86,700 |
| SOL | Pivot | 86,400 | 90,000 | 86,700 |
| TRX | Fallback | 86,400 | 90,000 | 86,700 |
| THE | Pivot | 86,400 | 90,000 | 86,700 |
| BTCB | Fallback | 86,400 | 0 (unset) | 86,700 |
| FIL | Pivot | 86,400 | 90,000 | 86,700 |
| CAKE | Fallback | 86,400 | 90,000 | 86,700 |
| ADA | Fallback | 86,400 | 90,000 | 86,700 |
| LTC | Pivot | 86,400 | 90,000 | 86,700 |
| LINK | Pivot | 86,400 | 90,000 | 86,700 |
| AAVE | Pivot | 86,400 | 90,000 | 86,700 |
| DOGE | Pivot | 86,400 | 90,000 | 86,700 |
| UNI | Pivot | 86,400 | 90,000 | 86,700 |
| solvBTC | Pivot | 43,200 | 0 (unset) | 43,500 |
Security Considerations
Staleness tightening may cause temporary price unavailability. If a feed fails to update within the new, tighter window, the oracle will reject the stale price. This is the intended behavior - it is safer to temporarily halt operations on a market than to use a potentially incorrect price. The tiered formula provides adequate margin for normal feed operation at each heartbeat tier.
CAPO snapshot freshness is critical. If updateSnapshot() is not called before this VIP executes, the new lower growth rate will be applied to a stale snapshot. The CAPO oracle will compute a maximum price that may be below the current exchange rate, immediately capping the price and potentially triggering incorrect liquidations on asBNB and slisBNB markets.
