light-event 0.24.0

Event types and utilities for Light Protocol
Documentation
use borsh::{BorshDeserialize, BorshSerialize};
use light_sdk_types::lca::{
    instruction_data::{
        data::OutputCompressedAccountWithPackedContext,
        insert_into_queues::MerkleTreeSequenceNumber as InstructionDataSequenceNumber,
    },
    Pubkey,
};

#[derive(Debug, Clone, Default, PartialEq)]
pub struct BatchPublicTransactionEvent {
    pub event: PublicTransactionEvent,
    pub new_addresses: Vec<NewAddress>,
    pub input_sequence_numbers: Vec<MerkleTreeSequenceNumber>,
    pub address_sequence_numbers: Vec<MerkleTreeSequenceNumber>,
    pub tx_hash: [u8; 32],
    pub batch_input_accounts: Vec<BatchNullifyContext>,
}

#[derive(Debug, Clone, BorshSerialize, BorshDeserialize, Default, PartialEq)]
pub struct PublicTransactionEvent {
    pub input_compressed_account_hashes: Vec<[u8; 32]>,
    pub output_compressed_account_hashes: Vec<[u8; 32]>,
    pub output_compressed_accounts: Vec<OutputCompressedAccountWithPackedContext>,
    pub output_leaf_indices: Vec<u32>,
    pub sequence_numbers: Vec<MerkleTreeSequenceNumberV1>,
    pub relay_fee: Option<u64>,
    pub is_compress: bool,
    pub compress_or_decompress_lamports: Option<u64>,
    pub pubkey_array: Vec<Pubkey>,
    pub message: Option<Vec<u8>>,
    /// ATA owner info for compressed ATAs (output_index -> wallet_owner_pubkey).
    /// Only populated for compress_and_close operations where is_ata=true.
    pub ata_owners: Vec<AssociatedTokenAccountOwnerInfo>,
}

/// ATA owner info extracted from compress_and_close operations.
#[derive(Debug, Clone, Copy, BorshSerialize, BorshDeserialize, Default, PartialEq, Eq)]
pub struct AssociatedTokenAccountOwnerInfo {
    /// Index into output_compressed_accounts
    pub output_index: u8,
    /// The wallet owner pubkey that the ATA is derived from
    pub wallet_owner: Pubkey,
}

#[derive(Debug, Clone, Copy, PartialEq, Eq)]
pub struct NewAddress {
    pub address: [u8; 32],
    pub mt_pubkey: Pubkey,
    pub queue_index: u64,
}

#[derive(Default, Debug, Clone, PartialEq, Eq)]
pub struct BatchNullifyContext {
    pub tx_hash: [u8; 32],
    pub account_hash: [u8; 32],
    pub nullifier: [u8; 32],
    pub nullifier_queue_index: u64,
}

// Separate type because zerocopy::U64 doesn't implement BorshSerialize.
#[derive(Debug, Clone, Copy, BorshSerialize, BorshDeserialize, Default, PartialEq)]
pub struct MerkleTreeSequenceNumber {
    pub tree_pubkey: Pubkey,
    pub queue_pubkey: Pubkey,
    pub tree_type: u64,
    pub seq: u64,
}

#[derive(Debug, Clone, Copy, BorshSerialize, BorshDeserialize, Default, PartialEq)]
pub struct MerkleTreeSequenceNumberV1 {
    pub tree_pubkey: Pubkey,
    pub seq: u64,
}

impl MerkleTreeSequenceNumber {
    pub fn is_empty(&self) -> bool {
        self.tree_pubkey == Pubkey::default()
    }
}

impl From<&InstructionDataSequenceNumber> for MerkleTreeSequenceNumber {
    fn from(seq: &InstructionDataSequenceNumber) -> Self {
        Self {
            tree_pubkey: seq.tree_pubkey.into(),
            queue_pubkey: seq.queue_pubkey.into(),
            tree_type: seq.tree_type.into(),
            seq: seq.seq.into(),
        }
    }
}