Skip to content

feat: implement Pyth oracle integration - #805

Merged
hman38705 merged 1 commit into
solutions-plug:mainfrom
Happybello365:feat/pyth-oracle-integration
May 30, 2026
Merged

feat: implement Pyth oracle integration#805
hman38705 merged 1 commit into
solutions-plug:mainfrom
Happybello365:feat/pyth-oracle-integration

Conversation

@Happybello365

Copy link
Copy Markdown

Replace the pyth_client.rs stub with a full implementation:

  • Define a Price struct (price, conf, expo, publish_time) matching the official Pyth Soroban SDK type, replacing the raw (i64,u64,i32,i64) tuple
  • Add get_price_no_older_than to PythOracleInterface so the Pyth contract enforces staleness atomically on-chain (preferred resolution path)
  • Keep get_price for permissive/test mode (max_staleness_seconds = u64::MAX)
  • Update oracles.rs to re-export Price as PythPrice for backward compat, use get_price_no_older_than in fetch_pyth_price for production paths, and add secondary confidence validation via validate_price
  • Feed ID remains configurable per market via OracleConfig.feed_id (64-char hex string decoded to BytesN<32> at call time)
  • Update MockPythContract in oracles_test.rs to return Price struct and implement get_price_no_older_than with staleness enforcement
  • Add test_pyth_integration.rs with dedicated integration tests covering:
    • Feed ID configurable per market and stored independently
    • get_price path (permissive mode)
    • get_price_no_older_than path (panics when stale)
    • validate_price staleness and confidence checks
    • resolve_with_pyth end-to-end outcome determination
    • No partial storage written on stale/failed resolution
    • Multiple oracle IDs are independent per market

Description

Type of Change

  • Bug fix
  • New feature
  • Refactor / code cleanup
  • Documentation update
  • CI / tooling change
  • Breaking change

Testing Done

Checklist

  • Tests pass locally
  • Documentation updated (if applicable)
  • No breaking changes, or breaking changes are documented above

Related Issues

Closes #703

Replace the pyth_client.rs stub with a full implementation:

- Define a Price struct (price, conf, expo, publish_time) matching the
  official Pyth Soroban SDK type, replacing the raw (i64,u64,i32,i64) tuple
- Add get_price_no_older_than to PythOracleInterface so the Pyth contract
  enforces staleness atomically on-chain (preferred resolution path)
- Keep get_price for permissive/test mode (max_staleness_seconds = u64::MAX)
- Update oracles.rs to re-export Price as PythPrice for backward compat,
  use get_price_no_older_than in fetch_pyth_price for production paths,
  and add secondary confidence validation via validate_price
- Feed ID remains configurable per market via OracleConfig.feed_id (64-char
  hex string decoded to BytesN<32> at call time)
- Update MockPythContract in oracles_test.rs to return Price struct and
  implement get_price_no_older_than with staleness enforcement
- Add test_pyth_integration.rs with dedicated integration tests covering:
  - Feed ID configurable per market and stored independently
  - get_price path (permissive mode)
  - get_price_no_older_than path (panics when stale)
  - validate_price staleness and confidence checks
  - resolve_with_pyth end-to-end outcome determination
  - No partial storage written on stale/failed resolution
  - Multiple oracle IDs are independent per market
@drips-wave

drips-wave Bot commented May 29, 2026

Copy link
Copy Markdown

@Happybello365 Great news! 🎉 Based on an automated assessment of this PR, the linked Wave issue(s) no longer count against your application limits.

You can now already apply to more issues while waiting for a review of this PR. Keep up the great work! 🚀

Learn more about application limits

@hman38705
hman38705 merged commit 32bda87 into solutions-plug:main May 30, 2026
12 of 39 checks passed
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.

pyth_client.rs is a stub — Pyth oracle integration is not implemented

2 participants