use {crate::types::HaltStateV2, 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 state_nonce: u8,
pub serum_nonce: u8,
pub mint_auth_nonce: u8,
pub num_underlyings: u8,
pub num_flex_underlyings: u8,
pub null: [u8; 7],
pub strike_initialization_threshold_seconds: u32,
pub pricing_frequency_seconds: u32,
pub liquidator_liquidation_percentage: u32,
pub insurance_vault_liquidation_percentage: u32,
pub native_d1_trade_fee_percentage: u64,
pub native_d1_underlying_fee_percentage: u64,
pub native_whitelist_underlying_fee_percentage: u64,
pub native_deposit_limit: u64,
pub expiration_threshold_seconds: u32,
pub position_movement_fee_bps: u8,
pub margin_concession_percentage: u8,
pub treasury_wallet_nonce: u8,
pub native_option_trade_fee_percentage: u64,
pub native_option_underlying_fee_percentage: u64,
pub referrals_admin: Pubkey,
pub referrals_rewards_wallet_nonce: u8,
pub max_perp_delta_age: u16,
pub secondary_admin: Pubkey,
pub vault_nonce: u8,
pub insurance_vault_nonce: u8,
pub deprecated_total_insurance_vault_deposits: u64,
pub native_withdraw_limit: u64,
pub withdraw_limit_epoch_seconds: u32,
pub native_open_interest_limit: u64,
pub halt_states: [HaltStateV2; 5],
pub halt_states_padding: [HaltStateV2; 20],
#[cfg_attr(feature = "serde", serde(with = "serde_big_array::BigArray"))]
pub padding: [u8; 338],
}
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()
}
}