use {
crate::types::{FeeStructure, OracleGuardRails},
solana_pubkey::Pubkey,
};
#[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))]
#[derive(Debug, Clone, borsh::BorshSerialize, borsh::BorshDeserialize, PartialEq)]
pub struct State {
pub admin: Pubkey,
pub whitelist_mint: Pubkey,
pub discount_mint: Pubkey,
pub signer: Pubkey,
pub srm_vault: Pubkey,
pub perp_fee_structure: FeeStructure,
pub spot_fee_structure: FeeStructure,
pub oracle_guard_rails: OracleGuardRails,
pub number_of_authorities: u64,
pub number_of_sub_accounts: u64,
pub lp_cooldown_time: u64,
pub liquidation_margin_buffer_ratio: u32,
pub settlement_duration: u16,
pub number_of_markets: u16,
pub number_of_spot_markets: u16,
pub signer_nonce: u8,
pub min_perp_auction_duration: u8,
pub default_market_order_time_in_force: u8,
pub default_spot_auction_duration: u8,
pub exchange_status: u8,
pub liquidation_duration: u8,
pub initial_pct_to_liquidate: u16,
pub max_number_of_sub_accounts: u16,
pub max_initialize_user_fee: u16,
pub feature_bit_flags: u8,
pub lp_pool_feature_bit_flags: u8,
pub padding: [u8; 8],
}
impl State {
pub fn decode(data: &[u8]) -> Option<Self> {
if data.len() < 8 {
return None;
}
let discriminator = &data[0..8];
if discriminator != [216, 146, 107, 94, 104, 75, 182, 177] {
return None;
}
let mut data_slice = data;
data_slice = &data_slice[8..];
borsh::BorshDeserialize::deserialize(&mut data_slice).ok()
}
}