use correct sdk
This commit is contained in:
@@ -25,7 +25,7 @@
|
|||||||
- `max_slippage_bps` argument on `create_order` protects buyer from price movement between submission and confirmation
|
- `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
|
- 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 |
|
| 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/lib.rs` | Program entrypoints + declare_id! |
|
||||||
| Create | `programs/solisting/src/state.rs` | `ListingAccount`, `OrderAccount`, `Currency` enum |
|
| Create | `programs/solisting/src/state.rs` | `ListingAccount`, `OrderAccount`, `Currency` enum |
|
||||||
| Create | `programs/solisting/src/error.rs` | `SolistingError` enum |
|
| Create | `programs/solisting/src/error.rs` | `SolistingError` enum |
|
||||||
@@ -87,9 +87,9 @@ custom-panic = []
|
|||||||
anchor-lang = "1.0.2"
|
anchor-lang = "1.0.2"
|
||||||
descro = { path = "../descro", features = ["cpi"] }
|
descro = { path = "../descro", features = ["cpi"] }
|
||||||
descro_ext_resolvers = { path = "../descro_ext_resolvers" }
|
descro_ext_resolvers = { path = "../descro_ext_resolvers" }
|
||||||
# Pyth oracle SDK for on-chain price reads.
|
# Pyth oracle SDK for on-chain price reads (Pull Oracle / V2 accounts).
|
||||||
# Verify latest compatible version at https://crates.io/crates/pyth-sdk-solana
|
# Verify latest compatible version at https://crates.io/crates/pyth-solana-receiver-sdk
|
||||||
pyth-sdk-solana = "0.10"
|
pyth-solana-receiver-sdk = "0.3"
|
||||||
|
|
||||||
[dev-dependencies]
|
[dev-dependencies]
|
||||||
litesvm = "0.10.0"
|
litesvm = "0.10.0"
|
||||||
@@ -239,24 +239,31 @@ no second feed needed for the stable side.
|
|||||||
|
|
||||||
```rust
|
```rust
|
||||||
use anchor_lang::prelude::*;
|
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::error::SolistingError;
|
||||||
use crate::state::Currency;
|
use crate::state::Currency;
|
||||||
|
|
||||||
/// Maximum age of the oracle price in seconds before it is considered stale.
|
/// Maximum age of the oracle price in seconds before it is considered stale.
|
||||||
const ORACLE_MAX_AGE_SECS: u64 = 60;
|
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).
|
/// Reads the Pyth SOL/USD price feed and returns (price_i64, exponent_i32).
|
||||||
/// price_i64 * 10^exponent = USD per SOL.
|
/// price_i64 * 10^exponent = USD per SOL.
|
||||||
/// Returns OraclePriceUnavailable if the price is stale or the feed account is invalid.
|
/// Returns OraclePriceUnavailable if the price is stale or the feed account is invalid.
|
||||||
fn sol_usd_price(oracle_account: &AccountInfo) -> Result<(i64, i32)> {
|
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))?;
|
.map_err(|_| error!(SolistingError::OraclePriceUnavailable))?;
|
||||||
let now = Clock::get()?.unix_timestamp;
|
let clock = Clock::get()?;
|
||||||
let price = feed
|
let feed_id = get_feed_id_from_hex(SOL_USD_FEED_ID)
|
||||||
.get_price_no_older_than(now, ORACLE_MAX_AGE_SECS)
|
.map_err(|_| error!(SolistingError::OraclePriceUnavailable))?;
|
||||||
.ok_or(error!(SolistingError::OraclePriceUnavailable))?;
|
let price = price_update
|
||||||
Ok((price.price, price.expo))
|
.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.
|
/// Converts `canonical_amount` (in `canonical_currency`) to `target_currency` units.
|
||||||
|
|||||||
Reference in New Issue
Block a user