carbon-drift-v2-decoder 1.0.0

Drift v2 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 {
    NewUserRecord(events::new_user_record::NewUserRecordEvent),
    DepositRecord(events::deposit_record::DepositRecordEvent),
    SpotInterestRecord(events::spot_interest_record::SpotInterestRecordEvent),
    FundingPaymentRecord(events::funding_payment_record::FundingPaymentRecordEvent),
    FundingRateRecord(events::funding_rate_record::FundingRateRecordEvent),
    CurveRecord(events::curve_record::CurveRecordEvent),
    SignedMsgOrderRecord(events::signed_msg_order_record::SignedMsgOrderRecordEvent),
    OrderRecord(events::order_record::OrderRecordEvent),
    OrderActionRecord(events::order_action_record::OrderActionRecordEvent),
    LPRecord(events::l_p_record::LPRecordEvent),
    LiquidationRecord(events::liquidation_record::LiquidationRecordEvent),
    SettlePnlRecord(events::settle_pnl_record::SettlePnlRecordEvent),
    InsuranceFundRecord(events::insurance_fund_record::InsuranceFundRecordEvent),
    InsuranceFundStakeRecord(events::insurance_fund_stake_record::InsuranceFundStakeRecordEvent),
    InsuranceFundSwapRecord(events::insurance_fund_swap_record::InsuranceFundSwapRecordEvent),
    TransferProtocolIfSharesToRevenuePoolRecord(events::transfer_protocol_if_shares_to_revenue_pool_record::TransferProtocolIfSharesToRevenuePoolRecordEvent),
    SwapRecord(events::swap_record::SwapRecordEvent),
    SpotMarketVaultDepositRecord(events::spot_market_vault_deposit_record::SpotMarketVaultDepositRecordEvent),
    DeleteUserRecord(events::delete_user_record::DeleteUserRecordEvent),
    FuelSweepRecord(events::fuel_sweep_record::FuelSweepRecordEvent),
    FuelSeasonRecord(events::fuel_season_record::FuelSeasonRecordEvent),
    RevenueShareSettleRecord(events::revenue_share_settle_record::RevenueShareSettleRecordEvent),
    LPSettleRecord(events::l_p_settle_record::LPSettleRecordEvent),
    LPSwapRecord(events::l_p_swap_record::LPSwapRecordEvent),
    LPMintRedeemRecord(events::l_p_mint_redeem_record::LPMintRedeemRecordEvent),
    LPBorrowLendDepositRecord(events::l_p_borrow_lend_deposit_record::LPBorrowLendDepositRecordEvent),
}

#[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::new_user_record::NewUserRecordEvent::decode(event_data) {
            return Some(CpiEvent::NewUserRecord(decoded));
        }
        if let Some(decoded) = events::deposit_record::DepositRecordEvent::decode(event_data) {
            return Some(CpiEvent::DepositRecord(decoded));
        }
        if let Some(decoded) =
            events::spot_interest_record::SpotInterestRecordEvent::decode(event_data)
        {
            return Some(CpiEvent::SpotInterestRecord(decoded));
        }
        if let Some(decoded) =
            events::funding_payment_record::FundingPaymentRecordEvent::decode(event_data)
        {
            return Some(CpiEvent::FundingPaymentRecord(decoded));
        }
        if let Some(decoded) =
            events::funding_rate_record::FundingRateRecordEvent::decode(event_data)
        {
            return Some(CpiEvent::FundingRateRecord(decoded));
        }
        if let Some(decoded) = events::curve_record::CurveRecordEvent::decode(event_data) {
            return Some(CpiEvent::CurveRecord(decoded));
        }
        if let Some(decoded) =
            events::signed_msg_order_record::SignedMsgOrderRecordEvent::decode(event_data)
        {
            return Some(CpiEvent::SignedMsgOrderRecord(decoded));
        }
        if let Some(decoded) = events::order_record::OrderRecordEvent::decode(event_data) {
            return Some(CpiEvent::OrderRecord(decoded));
        }
        if let Some(decoded) =
            events::order_action_record::OrderActionRecordEvent::decode(event_data)
        {
            return Some(CpiEvent::OrderActionRecord(decoded));
        }
        if let Some(decoded) = events::l_p_record::LPRecordEvent::decode(event_data) {
            return Some(CpiEvent::LPRecord(decoded));
        }
        if let Some(decoded) =
            events::liquidation_record::LiquidationRecordEvent::decode(event_data)
        {
            return Some(CpiEvent::LiquidationRecord(decoded));
        }
        if let Some(decoded) = events::settle_pnl_record::SettlePnlRecordEvent::decode(event_data) {
            return Some(CpiEvent::SettlePnlRecord(decoded));
        }
        if let Some(decoded) =
            events::insurance_fund_record::InsuranceFundRecordEvent::decode(event_data)
        {
            return Some(CpiEvent::InsuranceFundRecord(decoded));
        }
        if let Some(decoded) =
            events::insurance_fund_stake_record::InsuranceFundStakeRecordEvent::decode(event_data)
        {
            return Some(CpiEvent::InsuranceFundStakeRecord(decoded));
        }
        if let Some(decoded) =
            events::insurance_fund_swap_record::InsuranceFundSwapRecordEvent::decode(event_data)
        {
            return Some(CpiEvent::InsuranceFundSwapRecord(decoded));
        }
        if let Some(decoded) = events::transfer_protocol_if_shares_to_revenue_pool_record::TransferProtocolIfSharesToRevenuePoolRecordEvent::decode(event_data) {
            return Some(CpiEvent::TransferProtocolIfSharesToRevenuePoolRecord(decoded));
        }
        if let Some(decoded) = events::swap_record::SwapRecordEvent::decode(event_data) {
            return Some(CpiEvent::SwapRecord(decoded));
        }
        if let Some(decoded) =
            events::spot_market_vault_deposit_record::SpotMarketVaultDepositRecordEvent::decode(
                event_data,
            )
        {
            return Some(CpiEvent::SpotMarketVaultDepositRecord(decoded));
        }
        if let Some(decoded) = events::delete_user_record::DeleteUserRecordEvent::decode(event_data)
        {
            return Some(CpiEvent::DeleteUserRecord(decoded));
        }
        if let Some(decoded) = events::fuel_sweep_record::FuelSweepRecordEvent::decode(event_data) {
            return Some(CpiEvent::FuelSweepRecord(decoded));
        }
        if let Some(decoded) = events::fuel_season_record::FuelSeasonRecordEvent::decode(event_data)
        {
            return Some(CpiEvent::FuelSeasonRecord(decoded));
        }
        if let Some(decoded) =
            events::revenue_share_settle_record::RevenueShareSettleRecordEvent::decode(event_data)
        {
            return Some(CpiEvent::RevenueShareSettleRecord(decoded));
        }
        if let Some(decoded) = events::l_p_settle_record::LPSettleRecordEvent::decode(event_data) {
            return Some(CpiEvent::LPSettleRecord(decoded));
        }
        if let Some(decoded) = events::l_p_swap_record::LPSwapRecordEvent::decode(event_data) {
            return Some(CpiEvent::LPSwapRecord(decoded));
        }
        if let Some(decoded) =
            events::l_p_mint_redeem_record::LPMintRedeemRecordEvent::decode(event_data)
        {
            return Some(CpiEvent::LPMintRedeemRecord(decoded));
        }
        if let Some(decoded) =
            events::l_p_borrow_lend_deposit_record::LPBorrowLendDepositRecordEvent::decode(
                event_data,
            )
        {
            return Some(CpiEvent::LPBorrowLendDepositRecord(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,
        }
    }
}