devol_accounts_kit/accounts/oracles/
oracle_params.rs

1use serde::{Deserialize, Serialize};
2use solana_program::pubkey::Pubkey;
3use crate::accounts::oracles::oracle_provider::OracleProvider;
4
5#[derive(PartialEq, PartialOrd, Copy, Clone, Serialize, Deserialize)]
6#[repr(u8)]
7pub enum DataLen {
8    Undefined,
9    U8,    // 8-bit unsigned integer
10    U32,   // 32-bit unsigned integer
11    U64,   // 64-bit unsigned integer
12    U128,  // 128-bit unsigned integer
13} // size: 1 byte
14
15
16#[derive(PartialEq, PartialOrd, Copy, Clone, Serialize, Deserialize)]
17#[repr(u8)]
18pub enum Endian {
19    LE,
20    BE,
21} // size: 1 byte
22
23#[derive(Copy, Clone, Serialize, Deserialize)]
24#[repr(C)]
25pub struct OracleDataField{
26    pub data_len: DataLen,      // Length of the data (8, 32, 64, 128 bits)
27    pub endian: Endian,         // Little or Big endian
28    pub reserved: [u8; 2],      // Reserved bytes for future use or alignment
29    pub offset: i32,            // Offset from the start of the data storage
30} // size: 8 byte
31
32#[cfg(test)]
33impl Default for OracleDataField {
34    fn default() -> Self {
35        Self {
36            reserved: [0; 2],
37            offset: 0,
38            data_len: DataLen::U32,
39            endian: Endian::LE,
40        }
41    }
42}
43
44pub const ORACLE_DATA_FIELDS_QUANTITY: usize = 3;
45pub const ORACLE_PARAMS_SIZE: usize = 64;
46
47#[derive(Copy, Clone, Serialize, Deserialize)]
48#[repr(C)]
49pub struct OracleParams {
50    pub version: u8,                    // Version of the OracleParams structure
51    pub enabled: bool,                  // This Oracle has been set up
52    pub provider: OracleProvider,
53    pub reserved: [u8; 1],              // Reserved bytes for future use or alignment
54    pub max_timestamp_diff_sec: i32,    // Maximum allowed difference in timestamp (seconds)
55    pub account: Pubkey,                // Public key of the oracles account
56    pub mantissa: OracleDataField,
57    pub exponent: OracleDataField,
58    pub timestamp: OracleDataField,
59} // size: ORACLE_PARAMS_SIZE bytes
60
61#[cfg(test)]
62impl Default for OracleParams {
63    fn default() -> Self {
64        Self {
65            account: Pubkey::default(),
66            enabled: true,
67            provider: OracleProvider::Pyth,
68            reserved: [0; 1],
69            version: 0,
70            exponent: OracleDataField::default(),
71            mantissa: OracleDataField::default(),
72            timestamp: OracleDataField::default(),
73            max_timestamp_diff_sec: 0,
74        }
75    }
76}
77
78#[cfg(test)]
79mod tests {
80    use std::mem;
81    use crate::accounts::oracles::oracle_params::{ORACLE_PARAMS_SIZE, OracleParams};
82
83    #[test]
84    fn test_oracle_params() {
85        assert_eq!(mem::size_of::<OracleParams>(), ORACLE_PARAMS_SIZE, "Total size of OracleParams structure mismatch");
86    }
87}