switchboard_solana/oracle_program/accounts/
queue.rs1use crate::cfg_client;
2use crate::prelude::*;
3use bytemuck::try_cast_slice_mut;
4use std::cell::Ref;
5
6#[account(zero_copy(unsafe))]
7#[repr(packed)]
8pub struct OracleQueueAccountData {
9 pub name: [u8; 32],
11 pub metadata: [u8; 64],
13 pub authority: Pubkey,
15 pub oracle_timeout: u32,
17 pub reward: u64,
19 pub min_stake: u64,
21 pub slashing_enabled: bool,
23 pub variance_tolerance_multiplier: SwitchboardDecimal,
26 pub feed_probation_period: u32,
29 pub curr_idx: u32,
32 pub size: u32,
34 pub gc_idx: u32,
36 pub consecutive_feed_failure_limit: u64,
38 pub consecutive_oracle_failure_limit: u64,
40 pub unpermissioned_feeds_enabled: bool,
42 pub unpermissioned_vrf_enabled: bool,
44 pub curator_reward_cut: SwitchboardDecimal,
46 pub lock_lease_funding: bool,
49 pub mint: Pubkey,
51 pub enable_buffer_relayers: bool,
53 pub _ebuf: [u8; 968],
55 pub max_size: u32,
57 pub data_buffer: Pubkey,
59}
60
61impl Default for OracleQueueAccountData {
62 fn default() -> Self {
63 unsafe { std::mem::zeroed() }
64 }
65}
66
67impl OracleQueueAccountData {
68 pub fn size() -> usize {
69 std::mem::size_of::<OracleQueueAccountData>() + 8
70 }
71
72 pub fn convert_buffer(buf: &mut [u8]) -> &mut [Pubkey] {
73 try_cast_slice_mut(&mut buf[8..]).unwrap()
74 }
75
76 pub fn len(&self) -> u32 {
77 self.size
78 }
79
80 pub fn is_empty(&self) -> bool {
81 self.size == 0
82 }
83
84 pub fn get_mint(&self) -> Pubkey {
85 if self.mint == Pubkey::default() {
86 return anchor_spl::token::spl_token::ID;
87 }
88 self.mint
89 }
90
91 pub fn max_round_rewards(&self, batch_size: u32) -> u64 {
92 self.reward
93 .checked_mul(batch_size.checked_add(1).unwrap().into())
94 .unwrap()
95 }
96
97 pub fn new<'info>(
111 account_info: &'info AccountInfo<'info>,
112 ) -> anchor_lang::Result<Ref<'info, Self>> {
113 let data = account_info.try_borrow_data()?;
114 if data.len() < OracleQueueAccountData::discriminator().len() {
115 return Err(ErrorCode::AccountDiscriminatorNotFound.into());
116 }
117
118 let mut disc_bytes = [0u8; 8];
119 disc_bytes.copy_from_slice(&data[..8]);
120 if disc_bytes != OracleQueueAccountData::discriminator() {
121 return Err(ErrorCode::AccountDiscriminatorMismatch.into());
122 }
123
124 Ok(Ref::map(data, |data| {
125 bytemuck::from_bytes(&data[8..std::mem::size_of::<OracleQueueAccountData>() + 8])
126 }))
127 }
128
129 pub fn new_from_bytes(data: &[u8]) -> anchor_lang::Result<&OracleQueueAccountData> {
143 if data.len() < OracleQueueAccountData::discriminator().len() {
144 return Err(ErrorCode::AccountDiscriminatorNotFound.into());
145 }
146
147 let mut disc_bytes = [0u8; 8];
148 disc_bytes.copy_from_slice(&data[..8]);
149 if disc_bytes != OracleQueueAccountData::discriminator() {
150 return Err(ErrorCode::AccountDiscriminatorMismatch.into());
151 }
152
153 Ok(bytemuck::from_bytes(
154 &data[8..std::mem::size_of::<OracleQueueAccountData>() + 8],
155 ))
156 }
157
158 cfg_client! {
159 pub fn fetch(
160 client: &solana_client::rpc_client::RpcClient,
161 pubkey: Pubkey,
162 ) -> std::result::Result<Self, switchboard_common::SbError> {
163 crate::client::fetch_zerocopy_account(client, pubkey)
164 }
165
166 pub async fn fetch_async(
167 client: &solana_client::nonblocking::rpc_client::RpcClient,
168 pubkey: Pubkey,
169 ) -> std::result::Result<Self, switchboard_common::SbError> {
170 crate::client::fetch_zerocopy_account_async(client, pubkey).await
171 }
172
173 pub fn fetch_sync<T: solana_sdk::client::SyncClient>(
174 client: &T,
175 pubkey: Pubkey,
176 ) -> std::result::Result<Self, switchboard_common::SbError> {
177 crate::client::fetch_zerocopy_account_sync(client, pubkey)
178 }
179 }
180}