use correct sdk

This commit is contained in:
thesn10
2026-05-25 21:24:46 +02:00
parent c08e380929
commit 0b00030167

View File

@@ -25,7 +25,7 @@
- `max_slippage_bps` argument on `create_order` protects buyer from price movement between submission and confirmation
- SPL token path (`descro_spl` CPI) is not yet implemented — `create_order` errors on `payment_currency = Spl` until `descro_spl` exists; state and oracle are designed to support it without schema changes
**Tech Stack:** Rust, Anchor 1.0.x, LiteSVM 0.10.0, `pyth-sdk-solana` for oracle reads. Build order: `descro_ext_resolvers``descro``solisting`.
**Tech Stack:** Rust, Anchor 1.0.x, LiteSVM 0.10.0, `pyth-solana-receiver-sdk` for oracle reads. Build order: `descro_ext_resolvers``descro``solisting`.
---
@@ -33,7 +33,7 @@
| Action | Path | Responsibility |
|---|---|---|
| Create | `programs/solisting/Cargo.toml` | Crate definition + dependencies (incl. pyth-sdk-solana) |
| Create | `programs/solisting/Cargo.toml` | Crate definition + dependencies (incl. pyth-solana-receiver-sdk) |
| Create | `programs/solisting/src/lib.rs` | Program entrypoints + declare_id! |
| Create | `programs/solisting/src/state.rs` | `ListingAccount`, `OrderAccount`, `Currency` enum |
| Create | `programs/solisting/src/error.rs` | `SolistingError` enum |
@@ -87,9 +87,9 @@ custom-panic = []
anchor-lang = "1.0.2"
descro = { path = "../descro", features = ["cpi"] }
descro_ext_resolvers = { path = "../descro_ext_resolvers" }
# Pyth oracle SDK for on-chain price reads.
# Verify latest compatible version at https://crates.io/crates/pyth-sdk-solana
pyth-sdk-solana = "0.10"
# Pyth oracle SDK for on-chain price reads (Pull Oracle / V2 accounts).
# Verify latest compatible version at https://crates.io/crates/pyth-solana-receiver-sdk
pyth-solana-receiver-sdk = "0.3"
[dev-dependencies]
litesvm = "0.10.0"
@@ -239,24 +239,31 @@ no second feed needed for the stable side.
```rust
use anchor_lang::prelude::*;
use pyth_sdk_solana::load_price_feed_from_account_info;
use anchor_lang::AccountDeserialize;
use pyth_solana_receiver_sdk::price_update::{PriceUpdateV2, get_feed_id_from_hex};
use crate::error::SolistingError;
use crate::state::Currency;
/// Maximum age of the oracle price in seconds before it is considered stale.
const ORACLE_MAX_AGE_SECS: u64 = 60;
/// Pyth SOL/USD price feed ID (mainnet + devnet).
const SOL_USD_FEED_ID: &str = "ef0d8b6fda2ceba41da15d4095d1da392a0d2f8ed0c6c7bc0f4cfac8c280b56d";
/// Reads the Pyth SOL/USD price feed and returns (price_i64, exponent_i32).
/// price_i64 * 10^exponent = USD per SOL.
/// Returns OraclePriceUnavailable if the price is stale or the feed account is invalid.
fn sol_usd_price(oracle_account: &AccountInfo) -> Result<(i64, i32)> {
let feed = load_price_feed_from_account_info(oracle_account)
let data = oracle_account.try_borrow_data()?;
let price_update = PriceUpdateV2::try_deserialize(&mut data.as_ref())
.map_err(|_| error!(SolistingError::OraclePriceUnavailable))?;
let now = Clock::get()?.unix_timestamp;
let price = feed
.get_price_no_older_than(now, ORACLE_MAX_AGE_SECS)
.ok_or(error!(SolistingError::OraclePriceUnavailable))?;
Ok((price.price, price.expo))
let clock = Clock::get()?;
let feed_id = get_feed_id_from_hex(SOL_USD_FEED_ID)
.map_err(|_| error!(SolistingError::OraclePriceUnavailable))?;
let price = price_update
.get_price_no_older_than(&clock, ORACLE_MAX_AGE_SECS, &feed_id)
.map_err(|_| error!(SolistingError::OraclePriceUnavailable))?;
Ok((price.price, price.exponent))
}
/// Converts `canonical_amount` (in `canonical_currency`) to `target_currency` units.