pub use super::super::events;
use carbon_core::{borsh, deserialize::ArrangeAccounts};
#[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))]
#[derive(
Debug,
Clone,
carbon_core::borsh::BorshSerialize,
carbon_core::borsh::BorshDeserialize,
PartialEq,
)]
pub enum CpiEvent {
DepositLog(events::deposit_log::DepositLogEvent),
FillLog(events::fill_log::FillLogEvent),
MarketMetaDataLog(events::market_meta_data_log::MarketMetaDataLogEvent),
TotalOrderFillEvent(events::total_order_fill_event::TotalOrderFillEventEvent),
SetDelegateLog(events::set_delegate_log::SetDelegateLogEvent),
SettleFundsLog(events::settle_funds_log::SettleFundsLogEvent),
SweepFeesLog(events::sweep_fees_log::SweepFeesLogEvent),
OpenOrdersPositionLog(events::open_orders_position_log::OpenOrdersPositionLogEvent),
}
#[derive(Debug, Clone, PartialEq)]
#[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))]
pub struct CpiEventInstructionAccounts {
pub program: solana_pubkey::Pubkey,
pub event_authority: solana_pubkey::Pubkey,
pub remaining: Vec<solana_instruction::AccountMeta>,
}
impl CpiEvent {
pub fn decode(data: &[u8]) -> Option<Self> {
if data.len() < 8 {
return None;
}
let discriminator = &data[0..8];
if discriminator != [228, 69, 165, 46, 81, 203, 154, 29] {
return None;
}
let event_data = data;
if let Some(decoded) = events::deposit_log::DepositLogEvent::decode(event_data) {
return Some(CpiEvent::DepositLog(decoded));
}
if let Some(decoded) = events::fill_log::FillLogEvent::decode(event_data) {
return Some(CpiEvent::FillLog(decoded));
}
if let Some(decoded) =
events::market_meta_data_log::MarketMetaDataLogEvent::decode(event_data)
{
return Some(CpiEvent::MarketMetaDataLog(decoded));
}
if let Some(decoded) =
events::total_order_fill_event::TotalOrderFillEventEvent::decode(event_data)
{
return Some(CpiEvent::TotalOrderFillEvent(decoded));
}
if let Some(decoded) = events::set_delegate_log::SetDelegateLogEvent::decode(event_data) {
return Some(CpiEvent::SetDelegateLog(decoded));
}
if let Some(decoded) = events::settle_funds_log::SettleFundsLogEvent::decode(event_data) {
return Some(CpiEvent::SettleFundsLog(decoded));
}
if let Some(decoded) = events::sweep_fees_log::SweepFeesLogEvent::decode(event_data) {
return Some(CpiEvent::SweepFeesLog(decoded));
}
if let Some(decoded) =
events::open_orders_position_log::OpenOrdersPositionLogEvent::decode(event_data)
{
return Some(CpiEvent::OpenOrdersPositionLog(decoded));
}
None
}
}
impl ArrangeAccounts for CpiEvent {
type ArrangedAccounts = CpiEventInstructionAccounts;
fn arrange_accounts(
accounts: &[solana_instruction::AccountMeta],
) -> Option<Self::ArrangedAccounts> {
match accounts {
[program, event_authority, remaining @ ..] => Some(CpiEventInstructionAccounts {
program: program.pubkey,
event_authority: event_authority.pubkey,
remaining: remaining.to_vec(),
}),
[event_authority] => Some(CpiEventInstructionAccounts {
program: crate::PROGRAM_ID,
event_authority: event_authority.pubkey,
remaining: Vec::new(),
}),
_ => None,
}
}
}