StrataxOracle.getPrice() calls latestRoundData() and discards the updatedAt timestamp. No comparison against block.timestamp is made. If a Chainlink price feed stops updating (keeper failure, network congestion, deprecated feed), the oracle silently returns the last known price indefinitely.
Stale prices propagate directly into leverage calculations in calculateOpenParams and into the collateral withdrawal formula in _executeUnwindOperation, both of which are executed on-chain with real funds.
Likelihood:
Chainlink feeds have historically paused during extreme market volatility (e.g., March 2020 ETH crash) — exactly when stale prices are most dangerous
Feeds on L2 networks stop updating entirely when the sequencer is offline, a predictable and recurring event on Arbitrum and Optimism
Impact:
A stale inflated debt token price causes _executeUnwindOperation to over-calculate collateralToWithdraw, withdrawing more collateral than necessary and potentially leaving the remaining position below the liquidation threshold
A stale deflated collateral price causes calculateOpenParams to under-estimate position size, producing positions that open at unsafe effective leverage
The following test demonstrates that the oracle accepts an answer whose updatedAt is arbitrarily old without reverting.
The mock feed returns a 30-day-old answer. getPrice returns it successfully without reverting, confirming the absence of any updatedAt validation.
Add per-feed maximum staleness thresholds stored at _setPriceFeed time and validated in getPrice. Use Chainlink's published heartbeat values (ETH/USD: 3600s, USDC/USD: 86400s).
The contest is live. Earn rewards by submitting a finding.
This is your time to appeal against judgements on your submissions.
Appeals are being carefully reviewed by our judges.
The contest is complete and the rewards are being distributed.