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 {
DeleverageEvent(events::deleverage_event::DeleverageEventEvent),
DeleverageWithdrawFlowEvent(events::deleverage_withdraw_flow_event::DeleverageWithdrawFlowEventEvent),
EditStakedSettingsEvent(events::edit_staked_settings_event::EditStakedSettingsEventEvent),
HealthPulseEvent(events::health_pulse_event::HealthPulseEventEvent),
KeeperCloseOrderEvent(events::keeper_close_order_event::KeeperCloseOrderEventEvent),
LendingAccountBorrowEvent(events::lending_account_borrow_event::LendingAccountBorrowEventEvent),
LendingAccountDepositEvent(events::lending_account_deposit_event::LendingAccountDepositEventEvent),
LendingAccountLiquidateEvent(events::lending_account_liquidate_event::LendingAccountLiquidateEventEvent),
LendingAccountRepayEvent(events::lending_account_repay_event::LendingAccountRepayEventEvent),
LendingAccountWithdrawEvent(events::lending_account_withdraw_event::LendingAccountWithdrawEventEvent),
LendingPoolBankAccrueInterestEvent(events::lending_pool_bank_accrue_interest_event::LendingPoolBankAccrueInterestEventEvent),
LendingPoolBankCollectFeesEvent(events::lending_pool_bank_collect_fees_event::LendingPoolBankCollectFeesEventEvent),
LendingPoolBankConfigureEvent(events::lending_pool_bank_configure_event::LendingPoolBankConfigureEventEvent),
LendingPoolBankConfigureFrozenEvent(events::lending_pool_bank_configure_frozen_event::LendingPoolBankConfigureFrozenEventEvent),
LendingPoolBankConfigureOracleEvent(events::lending_pool_bank_configure_oracle_event::LendingPoolBankConfigureOracleEventEvent),
LendingPoolBankCreateEvent(events::lending_pool_bank_create_event::LendingPoolBankCreateEventEvent),
LendingPoolBankHandleBankruptcyEvent(events::lending_pool_bank_handle_bankruptcy_event::LendingPoolBankHandleBankruptcyEventEvent),
LendingPoolBankSetFixedOraclePriceEvent(events::lending_pool_bank_set_fixed_oracle_price_event::LendingPoolBankSetFixedOraclePriceEventEvent),
LendingPoolSuperAdminDepositEvent(events::lending_pool_super_admin_deposit_event::LendingPoolSuperAdminDepositEventEvent),
LendingPoolSuperAdminWithdrawEvent(events::lending_pool_super_admin_withdraw_event::LendingPoolSuperAdminWithdrawEventEvent),
LiquidationReceiverEvent(events::liquidation_receiver_event::LiquidationReceiverEventEvent),
MarginfiAccountCloseOrderEvent(events::marginfi_account_close_order_event::MarginfiAccountCloseOrderEventEvent),
MarginfiAccountCreateEvent(events::marginfi_account_create_event::MarginfiAccountCreateEventEvent),
MarginfiAccountFreezeEvent(events::marginfi_account_freeze_event::MarginfiAccountFreezeEventEvent),
MarginfiAccountPlaceOrderEvent(events::marginfi_account_place_order_event::MarginfiAccountPlaceOrderEventEvent),
MarginfiAccountTransferToNewAccount(events::marginfi_account_transfer_to_new_account::MarginfiAccountTransferToNewAccountEvent),
MarginfiGroupConfigureEvent(events::marginfi_group_configure_event::MarginfiGroupConfigureEventEvent),
MarginfiGroupCreateEvent(events::marginfi_group_create_event::MarginfiGroupCreateEventEvent),
RateLimitFlowEvent(events::rate_limit_flow_event::RateLimitFlowEventEvent),
SetKeeperCloseFlagsEvent(events::set_keeper_close_flags_event::SetKeeperCloseFlagsEventEvent),
}
#[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[8..];
if let Some(decoded) = events::deleverage_event::DeleverageEventEvent::decode(event_data) {
return Some(CpiEvent::DeleverageEvent(decoded));
}
if let Some(decoded) =
events::deleverage_withdraw_flow_event::DeleverageWithdrawFlowEventEvent::decode(
event_data,
)
{
return Some(CpiEvent::DeleverageWithdrawFlowEvent(decoded));
}
if let Some(decoded) =
events::edit_staked_settings_event::EditStakedSettingsEventEvent::decode(event_data)
{
return Some(CpiEvent::EditStakedSettingsEvent(decoded));
}
if let Some(decoded) = events::health_pulse_event::HealthPulseEventEvent::decode(event_data)
{
return Some(CpiEvent::HealthPulseEvent(decoded));
}
if let Some(decoded) =
events::keeper_close_order_event::KeeperCloseOrderEventEvent::decode(event_data)
{
return Some(CpiEvent::KeeperCloseOrderEvent(decoded));
}
if let Some(decoded) =
events::lending_account_borrow_event::LendingAccountBorrowEventEvent::decode(event_data)
{
return Some(CpiEvent::LendingAccountBorrowEvent(decoded));
}
if let Some(decoded) =
events::lending_account_deposit_event::LendingAccountDepositEventEvent::decode(
event_data,
)
{
return Some(CpiEvent::LendingAccountDepositEvent(decoded));
}
if let Some(decoded) =
events::lending_account_liquidate_event::LendingAccountLiquidateEventEvent::decode(
event_data,
)
{
return Some(CpiEvent::LendingAccountLiquidateEvent(decoded));
}
if let Some(decoded) =
events::lending_account_repay_event::LendingAccountRepayEventEvent::decode(event_data)
{
return Some(CpiEvent::LendingAccountRepayEvent(decoded));
}
if let Some(decoded) =
events::lending_account_withdraw_event::LendingAccountWithdrawEventEvent::decode(
event_data,
)
{
return Some(CpiEvent::LendingAccountWithdrawEvent(decoded));
}
if let Some(decoded) = events::lending_pool_bank_accrue_interest_event::LendingPoolBankAccrueInterestEventEvent::decode(event_data) {
return Some(CpiEvent::LendingPoolBankAccrueInterestEvent(decoded));
}
if let Some(decoded) = events::lending_pool_bank_collect_fees_event::LendingPoolBankCollectFeesEventEvent::decode(event_data) {
return Some(CpiEvent::LendingPoolBankCollectFeesEvent(decoded));
}
if let Some(decoded) =
events::lending_pool_bank_configure_event::LendingPoolBankConfigureEventEvent::decode(
event_data,
)
{
return Some(CpiEvent::LendingPoolBankConfigureEvent(decoded));
}
if let Some(decoded) = events::lending_pool_bank_configure_frozen_event::LendingPoolBankConfigureFrozenEventEvent::decode(event_data) {
return Some(CpiEvent::LendingPoolBankConfigureFrozenEvent(decoded));
}
if let Some(decoded) = events::lending_pool_bank_configure_oracle_event::LendingPoolBankConfigureOracleEventEvent::decode(event_data) {
return Some(CpiEvent::LendingPoolBankConfigureOracleEvent(decoded));
}
if let Some(decoded) =
events::lending_pool_bank_create_event::LendingPoolBankCreateEventEvent::decode(
event_data,
)
{
return Some(CpiEvent::LendingPoolBankCreateEvent(decoded));
}
if let Some(decoded) = events::lending_pool_bank_handle_bankruptcy_event::LendingPoolBankHandleBankruptcyEventEvent::decode(event_data) {
return Some(CpiEvent::LendingPoolBankHandleBankruptcyEvent(decoded));
}
if let Some(decoded) = events::lending_pool_bank_set_fixed_oracle_price_event::LendingPoolBankSetFixedOraclePriceEventEvent::decode(event_data) {
return Some(CpiEvent::LendingPoolBankSetFixedOraclePriceEvent(decoded));
}
if let Some(decoded) = events::lending_pool_super_admin_deposit_event::LendingPoolSuperAdminDepositEventEvent::decode(event_data) {
return Some(CpiEvent::LendingPoolSuperAdminDepositEvent(decoded));
}
if let Some(decoded) = events::lending_pool_super_admin_withdraw_event::LendingPoolSuperAdminWithdrawEventEvent::decode(event_data) {
return Some(CpiEvent::LendingPoolSuperAdminWithdrawEvent(decoded));
}
if let Some(decoded) =
events::liquidation_receiver_event::LiquidationReceiverEventEvent::decode(event_data)
{
return Some(CpiEvent::LiquidationReceiverEvent(decoded));
}
if let Some(decoded) =
events::marginfi_account_close_order_event::MarginfiAccountCloseOrderEventEvent::decode(
event_data,
)
{
return Some(CpiEvent::MarginfiAccountCloseOrderEvent(decoded));
}
if let Some(decoded) =
events::marginfi_account_create_event::MarginfiAccountCreateEventEvent::decode(
event_data,
)
{
return Some(CpiEvent::MarginfiAccountCreateEvent(decoded));
}
if let Some(decoded) =
events::marginfi_account_freeze_event::MarginfiAccountFreezeEventEvent::decode(
event_data,
)
{
return Some(CpiEvent::MarginfiAccountFreezeEvent(decoded));
}
if let Some(decoded) =
events::marginfi_account_place_order_event::MarginfiAccountPlaceOrderEventEvent::decode(
event_data,
)
{
return Some(CpiEvent::MarginfiAccountPlaceOrderEvent(decoded));
}
if let Some(decoded) = events::marginfi_account_transfer_to_new_account::MarginfiAccountTransferToNewAccountEvent::decode(event_data) {
return Some(CpiEvent::MarginfiAccountTransferToNewAccount(decoded));
}
if let Some(decoded) =
events::marginfi_group_configure_event::MarginfiGroupConfigureEventEvent::decode(
event_data,
)
{
return Some(CpiEvent::MarginfiGroupConfigureEvent(decoded));
}
if let Some(decoded) =
events::marginfi_group_create_event::MarginfiGroupCreateEventEvent::decode(event_data)
{
return Some(CpiEvent::MarginfiGroupCreateEvent(decoded));
}
if let Some(decoded) =
events::rate_limit_flow_event::RateLimitFlowEventEvent::decode(event_data)
{
return Some(CpiEvent::RateLimitFlowEvent(decoded));
}
if let Some(decoded) =
events::set_keeper_close_flags_event::SetKeeperCloseFlagsEventEvent::decode(event_data)
{
return Some(CpiEvent::SetKeeperCloseFlagsEvent(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,
}
}
}