Skip to content

feat: harden oracle quorum, freshness, and canonical price persistence (#1376) - #1442

Closed
s6pa1rta3n-lab wants to merge 1 commit into
Predictify-org:masterfrom
s6pa1rta3n-lab:fix-issue-1376
Closed

s6pa1rta3n-lab wants to merge 1 commit into
Predictify-org:masterfrom
s6pa1rta3n-lab:fix-issue-1376

Conversation

@s6pa1rta3n-lab

Copy link
Copy Markdown

Overview

Hardens oracle quorum, freshness validation, price sign verification, and canonical price persistence prior to market settlement in predictify-hybrid.

Key Changes

  • Feed Freshness & Sign Validation:
    • In contracts/predictify-hybrid/src/oracles.rs, updated validate_oracle_data to reject future publish times (publish_time > now), enforce staleness bounds against max_staleness_secs, and reject non-positive prices (price <= 0) with Error::InvalidInput.
    • In contracts/predictify-hybrid/src/resolution.rs, updated fetch_oracle_result and fetch_quote_fail_closed to validate positive prices and prevent future-dated publish timestamps.
  • Deterministic Quorum Boundaries:
    • In contracts/predictify-hybrid/src/resolution.rs, updated set_median_config to enforce configuration boundaries (min_sources >= 1, max_deviation_bps <= 10_000) returning Error::InvalidOracleConfig.
    • In resolve_with_median, collect_included_sorted, weighted_median, average_included_price, and price_variance, excluded non-positive quotes (price <= 0) from quorum calculation and required included_count >= med_cfg.min_sources and positive aggregate median.
  • Atomic Canonical Price Persistence & Settlement Gate:
    • Added CanonicalPriceRecord struct in contracts/predictify-hybrid/src/types.rs (price: i128, timestamp: u64, outcome: String).
    • Added store_canonical_price, get_canonical_price_record, get_canonical_price, and validate_canonical_price_before_settlement in OracleResolutionManager.
    • Enforced validate_canonical_price_before_settlement prior to automated market settlement in execute_automated_resolution.
    • Emitted emit_canonical_price_updated via EventEmitter with compatible topic registration in event_topic_compat.rs.
  • Comprehensive Regression & Outage Test Suite:
    • Added contracts/predictify-hybrid/src/oracle_hardening_tests.rs with 13 focused test cases validating stale feeds, future timestamps, non-positive price feeds, exact and insufficient quorum, outlier filtering breaking quorum, canonical price atomic persistence, fail-closed outage paths on missing/non-positive canonical price, and outage recovery.

Acceptance Criteria

  • Stale or invalid feeds cannot settle (validate_oracle_data checks staleness and rejects price <= 0 and future timestamps; verified in test_stale_feed_cannot_settle, test_future_timestamp_rejected, test_non_positive_price_feed_rejected).
  • Quorum boundaries are deterministic (set_median_config enforces min_sources >= 1 and max_deviation_bps <= 10_000; resolve_with_median enforces strict minimum included source counts; non-positive quotes excluded; verified in test_quorum_boundaries_insufficient_sources, test_quorum_boundaries_exact_quorum, test_outlier_filtering_breaks_quorum, test_non_positive_quotes_excluded_from_quorum, test_set_median_config_boundaries).
  • Canonical price updates are atomic (store_canonical_price persists CanonicalPriceRecord atomically alongside oracle verification and emits audit events; verified in test_canonical_price_atomic_persistence).
  • Outage and recovery tests cover all failure paths (pre-settlement gate validate_canonical_price_before_settlement ensures markets fail closed if canonical price is missing or invalid, and resume settlement once fresh data is published; verified in test_outage_missing_canonical_price_fails_closed, test_outage_non_positive_canonical_price_fails_closed, test_outage_recovery_path).

Security Considerations

  • Settlement requires positive, fresh feeds with verified signatures.
  • Outages or compromised feeds failing quorum fail closed rather than settling on corrupted or stale prices.
  • Canonical price state transitions are persistent and verified prior to balance and state mutations.

Closes #1376

Payout Routing

  • EVM (Base/Arbitrum/Polygon/ETH): 0xF46C9F6d70C50BF81ef3588AB523a90a594a2F89
  • Stellar: GCL6OXAMLD75BMTINA6EMRUDWK5THQUSHMYNLSNBCJAPZJHNYJTUNIBC

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

[GrantFox][High] Harden oracle quorum and freshness enforcement

2 participants