omermaksutii/rugproof/oracle-redundancy
Claude Code and agent skill by omermaksutii/rugproof
- community
Checking that the SKILL.md file is still in the repository.
Detect oracle fallback and redundancy failure modes (distinct from price manipulation) — single point of failure, missing staleness/heartbeat/deviation checks, an "all oracles down" path that reverts or silently returns stale/zero, missing L2 sequencer-uptime feed, and absent circuit breakers. Activate whenever code reads a price/rate feed, especially Chainlink latestRoundData, with fallbacks or on an L2.
Install
npx vskill@latest install omermaksutii/rugproof/oracle-redundancySKILL.md
The same SKILL.md was published earlier as iktok90-design/ai-smart-contract-auditor/oracle-redundancy.
Oracle redundancy detection
When this applies
Trigger on any of:
latestRoundData()/latestAnswer()reads from Chainlink or any push feed- Custom oracle aggregators with primary + fallback sources
- L2 deployments reading any price feed (Arbitrum, Optimism, Base, etc.)
- Rate/price reads that gate borrowing, liquidation, minting, or redemption
- Any "if primary fails, use secondary" branching
Detection patterns
Missing staleness / heartbeat check (HIGH)
Signal: no updatedAt freshness gate. A frozen feed (feed deprecated, node outage, or a market-wide halt) returns the last value forever; protocol prices off stale data. Require block.timestamp - updatedAt <= heartbeat and answeredInRound >= roundId.
Single point of failure (HIGH)
One feed, no fallback, no degradation plan. If that feed is deprecated or returns garbage, the protocol is bricked or mispriced. Signal: a hard dependency on exactly one external address with no alternative path.
Fallback that silently returns 0 or last price (HIGH)
Signal: the catch path masks failure. Returning 0 can make collateral worthless (mass liquidation) or debt free; returning a stale cached price keeps trading on bad data. Failures must surface, not be swallowed.
Missing L2 sequencer-uptime feed (HIGH on L2)
Signal: on an L2, if the sequencer was down, Chainlink prices are stale on resume. Without the uptime feed + grace period, the first post-downtime block liquidates everyone at stale prices. Chainlink documents this exact guard.
"All oracles down" path undefined (MEDIUM)
The aggregator handles primary-down but has no defined behavior when every source is stale/reverting — it either reverts (DoS) or falls through to an uninitialized default. Define an explicit safe-halt (pause) rather than trade on uncertainty.
No deviation / circuit breaker (MEDIUM)
Accepting any reported price without comparing primary vs secondary deviation, so a single compromised/erroneous feed is trusted outright.
Severity rubric
| Pattern | Severity | Notes | |
|---|---|---|---|
| Fallback returns 0 on failure | High | Mass liquidation / free mint | |
| Missing staleness/heartbeat gate | High | Trades on frozen price | |
| Single feed, no fallback | High | Brick / misprice on outage | |
| Missing L2 sequencer-uptime check | High | Stale-price liquidation on resume | |
| "All down" path reverts (DoS) vs safe-halt | Medium | Availability vs safety tradeoff | |
| No primary/secondary deviation check | Medium | Single bad feed trusted |
Remediation patterns
- Validate every read:
updatedAtfreshness vs a per-feed heartbeat,answeredInRound >= roundId,price > 0, and a sane min/max bound. - L2 sequencer-uptime feed +
GRACE_PERIODbefore trusting prices post-downtime (Chainlink reference pattern). - Real redundancy: primary + independent secondary (e.g. Chainlink + Uniswap V3 TWAP / Pyth) with a deviation threshold; disagreement → pause, not pick-one.
- Fail closed: when all sources are stale/invalid, pause the affected operations rather than returning 0, last price, or reverting unboundedly.
- Circuit breaker on max per-block deviation to absorb wicks.
False-positive notes
- A feed read that already checks
updatedAt,answeredInRound, and bounds is fine — don't re-flag for "no fallback" if it correctly pauses on staleness. - Mainnet-only contracts don't need the sequencer feed — don't flag its absence off-L2.
- A deliberate revert-on-stale (fail-closed) is acceptable when paired with a pause path; distinguish from an unbounded DoS.
Related
- [[oracle-manipulation]] — manipulation is the price-correctness sibling to redundancy
- [[liquidation-cascade]] — stale/zero prices trigger mass liquidation
- [[dos-vectors]] — revert-on-all-down can become a denial of service
Security
- Security scanPassed, 95 of 100Pattern checks on the skill's files.
- Model reviewPassed
Quality evaluation
- Task evaluationNot runNo evaluation yet. Run one in Skill Studio.
Source
- SKILL.md in the repositoryCheckingskills/oracle-redundancy/SKILL.md
Popularity
- 7-day trend score
- 0
Not refreshed yet.
Works with
Any agent vskill installs to: 56 targets in all. These 39 have a page on this site.
- Claude Code
- Cursor
- GitHub Copilot
- Windsurf
- Codex
- Gemini CLI
- Cline
- Amp
- Roo Code
- Goose
- Continue
- Kilo Code
- Junie
- Trae
- OpenHands
- Qwen Code
- AI Agent
- Tabnine Chat
- Sourcegraph Cody
- Amazon Q
- Firebase Genkit
- Sweep
- Devin
- Phind
- Mentat
- Claude Desktop
- Aider
- GPT Pilot
- Plandex
- bolt.new
- v0
- Replit Agent
- Anse
- TypingMind
- BetterChatGPT
- LibreChat
- Warp AI
- Pieces
- Fig AI
Embed badge
[](https://verified-skill.com/skills/omermaksutii/rugproof/oracle-redundancy)