carbon-marginfi-v2-decoder 1.0.0

MarginfiV2 Decoder
Documentation
//! This code was AUTOGENERATED using the Codama library.

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,
        }
    }
}