use {
crate::types::{
LiquidateBorrowForPerpPnlRecord, LiquidatePerpPnlForDepositRecord, LiquidatePerpRecord,
LiquidateSpotRecord, LiquidationType, PerpBankruptcyRecord, SpotBankruptcyRecord,
},
solana_pubkey::Pubkey,
};
#[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))]
#[derive(Debug, Clone, borsh::BorshSerialize, borsh::BorshDeserialize, PartialEq)]
pub struct LiquidationRecordEvent {
pub ts: i64,
pub liquidation_type: LiquidationType,
pub user: Pubkey,
pub liquidator: Pubkey,
pub margin_requirement: u128,
pub total_collateral: i128,
pub margin_freed: u64,
pub liquidation_id: u16,
pub bankrupt: bool,
pub canceled_order_ids: Vec<u32>,
pub liquidate_perp: LiquidatePerpRecord,
pub liquidate_spot: LiquidateSpotRecord,
pub liquidate_borrow_for_perp_pnl: LiquidateBorrowForPerpPnlRecord,
pub liquidate_perp_pnl_for_deposit: LiquidatePerpPnlForDepositRecord,
pub perp_bankruptcy: PerpBankruptcyRecord,
pub spot_bankruptcy: SpotBankruptcyRecord,
pub bit_flags: u8,
}
impl LiquidationRecordEvent {
pub fn decode(data: &[u8]) -> Option<Self> {
if data.len() < 16 {
return None;
}
let discriminator = &data[0..16];
if discriminator
!= [
228, 69, 165, 46, 81, 203, 154, 29, 127, 17, 0, 108, 182, 13, 231, 53,
]
{
return None;
}
let mut data_slice = data;
data_slice = &data_slice[16..];
borsh::BorshDeserialize::deserialize(&mut data_slice).ok()
}
}