spl_token_lending/
pyth.rs1#![allow(missing_docs)]
2use bytemuck::{
4 cast_slice, cast_slice_mut, from_bytes, from_bytes_mut, try_cast_slice, try_cast_slice_mut,
5 Pod, PodCastError, Zeroable,
6};
7use std::mem::size_of;
8
9pub const MAGIC: u32 = 0xa1b2c3d4;
10pub const VERSION_2: u32 = 2;
11pub const VERSION: u32 = VERSION_2;
12pub const MAP_TABLE_SIZE: usize = 640;
13pub const PROD_ACCT_SIZE: usize = 512;
14pub const PROD_HDR_SIZE: usize = 48;
15pub const PROD_ATTR_SIZE: usize = PROD_ACCT_SIZE - PROD_HDR_SIZE;
16
17#[derive(Copy, Clone)]
18#[repr(C)]
19pub struct AccKey {
20 pub val: [u8; 32],
21}
22
23#[derive(PartialEq, Copy, Clone)]
24#[repr(C)]
25pub enum AccountType {
26 Unknown,
27 Mapping,
28 Product,
29 Price,
30}
31
32#[derive(PartialEq, Copy, Clone)]
33#[repr(C)]
34pub enum PriceStatus {
35 Unknown,
36 Trading,
37 Halted,
38 Auction,
39}
40
41#[derive(PartialEq, Copy, Clone)]
42#[repr(C)]
43pub enum CorpAction {
44 NoCorpAct,
45}
46
47#[derive(Copy, Clone)]
48#[repr(C)]
49pub struct PriceInfo {
50 pub price: i64,
51 pub conf: u64,
52 pub status: PriceStatus,
53 pub corp_act: CorpAction,
54 pub pub_slot: u64,
55}
56
57#[derive(Copy, Clone)]
58#[repr(C)]
59pub struct PriceComp {
60 publisher: AccKey,
61 agg: PriceInfo,
62 latest: PriceInfo,
63}
64
65#[derive(PartialEq, Copy, Clone)]
66#[repr(C)]
67pub enum PriceType {
68 Unknown,
69 Price,
70}
71
72#[derive(Copy, Clone)]
73#[repr(C)]
74pub struct Price {
75 pub magic: u32, pub ver: u32, pub atype: u32, pub size: u32, pub ptype: PriceType, pub expo: i32, pub num: u32, pub unused: u32,
83 pub curr_slot: u64, pub valid_slot: u64, pub twap: i64, pub avol: u64, pub drv0: i64, pub drv1: i64, pub drv2: i64, pub drv3: i64, pub drv4: i64, pub drv5: i64, pub prod: AccKey, pub next: AccKey, pub agg_pub: AccKey, pub agg: PriceInfo, pub comp: [PriceComp; 32], }
99
100#[cfg(target_endian = "little")]
101unsafe impl Zeroable for Price {}
102
103#[cfg(target_endian = "little")]
104unsafe impl Pod for Price {}
105
106#[derive(Copy, Clone)]
107#[repr(C)]
108pub struct Product {
109 pub magic: u32, pub ver: u32, pub atype: u32, pub size: u32, pub px_acc: AccKey, pub attr: [u8; PROD_ATTR_SIZE], }
116
117#[cfg(target_endian = "little")]
118unsafe impl Zeroable for Product {}
119
120#[cfg(target_endian = "little")]
121unsafe impl Pod for Product {}
122
123pub fn load<T: Pod>(data: &[u8]) -> Result<&T, PodCastError> {
124 let size = size_of::<T>();
125 Ok(from_bytes(cast_slice::<u8, u8>(try_cast_slice(
126 &data[0..size],
127 )?)))
128}
129
130pub fn load_mut<T: Pod>(data: &mut [u8]) -> Result<&mut T, PodCastError> {
131 let size = size_of::<T>();
132 Ok(from_bytes_mut(cast_slice_mut::<u8, u8>(
133 try_cast_slice_mut(&mut data[0..size])?,
134 )))
135}