use serde::{Deserialize, Serialize};
use solana_program::pubkey::Pubkey;
use crate::accounts::oracles::oracle_provider::OracleProvider;
#[derive(PartialEq, PartialOrd, Copy, Clone, Serialize, Deserialize)]
#[repr(u8)]
pub enum DataLen {
Undefined,
U8, U32, U64, U128, } #[derive(PartialEq, PartialOrd, Copy, Clone, Serialize, Deserialize)]
#[repr(u8)]
pub enum Endian {
LE,
BE,
} #[derive(Copy, Clone, Serialize, Deserialize)]
#[repr(C)]
pub struct OracleDataField{
pub data_len: DataLen, pub endian: Endian, pub reserved: [u8; 2], pub offset: i32, } #[cfg(test)]
impl Default for OracleDataField {
fn default() -> Self {
Self {
reserved: [0; 2],
offset: 0,
data_len: DataLen::U32,
endian: Endian::LE,
}
}
}
pub const ORACLE_DATA_FIELDS_QUANTITY: usize = 3;
pub const ORACLE_PARAMS_SIZE: usize = 64;
#[derive(Copy, Clone, Serialize, Deserialize)]
#[repr(C)]
pub struct OracleParams {
pub version: u8, pub enabled: bool, pub provider: OracleProvider,
pub reserved: [u8; 1], pub max_timestamp_diff_sec: i32, pub account: Pubkey, pub mantissa: OracleDataField,
pub exponent: OracleDataField,
pub timestamp: OracleDataField,
} #[cfg(test)]
impl Default for OracleParams {
fn default() -> Self {
Self {
account: Pubkey::default(),
enabled: true,
provider: OracleProvider::Pyth,
reserved: [0; 1],
version: 0,
exponent: OracleDataField::default(),
mantissa: OracleDataField::default(),
timestamp: OracleDataField::default(),
max_timestamp_diff_sec: 0,
}
}
}
#[cfg(test)]
mod tests {
use std::mem;
use crate::accounts::oracles::oracle_params::{ORACLE_PARAMS_SIZE, OracleParams};
#[test]
fn test_oracle_params() {
assert_eq!(mem::size_of::<OracleParams>(), ORACLE_PARAMS_SIZE, "Total size of OracleParams structure mismatch");
}
}