use {
crate::types::{MarketType, OrderAction, OrderActionExplanation, PositionDirection},
solana_pubkey::Pubkey,
};
#[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))]
#[derive(Debug, Clone, borsh::BorshSerialize, borsh::BorshDeserialize, PartialEq)]
pub struct OrderActionRecordEvent {
pub ts: i64,
pub action: OrderAction,
pub action_explanation: OrderActionExplanation,
pub market_index: u16,
pub market_type: MarketType,
pub filler: Option<Pubkey>,
pub filler_reward: Option<u64>,
pub fill_record_id: Option<u64>,
pub base_asset_amount_filled: Option<u64>,
pub quote_asset_amount_filled: Option<u64>,
pub taker_fee: Option<u64>,
pub maker_fee: Option<i64>,
pub referrer_reward: Option<u32>,
pub quote_asset_amount_surplus: Option<i64>,
pub spot_fulfillment_method_fee: Option<u64>,
pub taker: Option<Pubkey>,
pub taker_order_id: Option<u32>,
pub taker_order_direction: Option<PositionDirection>,
pub taker_order_base_asset_amount: Option<u64>,
pub taker_order_cumulative_base_asset_amount_filled: Option<u64>,
pub taker_order_cumulative_quote_asset_amount_filled: Option<u64>,
pub maker: Option<Pubkey>,
pub maker_order_id: Option<u32>,
pub maker_order_direction: Option<PositionDirection>,
pub maker_order_base_asset_amount: Option<u64>,
pub maker_order_cumulative_base_asset_amount_filled: Option<u64>,
pub maker_order_cumulative_quote_asset_amount_filled: Option<u64>,
pub oracle_price: i64,
pub bit_flags: u8,
pub taker_existing_quote_entry_amount: Option<u64>,
pub taker_existing_base_asset_amount: Option<u64>,
pub maker_existing_quote_entry_amount: Option<u64>,
pub maker_existing_base_asset_amount: Option<u64>,
pub trigger_price: Option<u64>,
pub builder_idx: Option<u8>,
pub builder_fee: Option<u64>,
}
impl OrderActionRecordEvent {
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, 224, 52, 67, 71, 194, 237, 109, 1,
]
{
return None;
}
let mut data_slice = data;
data_slice = &data_slice[16..];
borsh::BorshDeserialize::deserialize(&mut data_slice).ok()
}
}