Skip to main content

light_system_program/invoke/
emit_event.rs

1use account_compression::emit_indexer_event;
2use anchor_lang::{prelude::*, Bumps};
3
4use crate::{
5    errors::SystemProgramError,
6    sdk::{
7        accounts::InvokeAccounts,
8        event::{MerkleTreeSequenceNumber, PublicTransactionEvent},
9    },
10    InstructionDataInvoke,
11};
12
13pub fn emit_state_transition_event<'a, 'b, 'c: 'info, 'info, A: InvokeAccounts<'info> + Bumps>(
14    inputs: InstructionDataInvoke,
15    ctx: &'a Context<'a, 'b, 'c, 'info, A>,
16    input_compressed_account_hashes: Vec<[u8; 32]>,
17    output_compressed_account_hashes: Vec<[u8; 32]>,
18    output_leaf_indices: Vec<u32>,
19    sequence_numbers: Vec<MerkleTreeSequenceNumber>,
20) -> Result<()> {
21    // Note: message is unimplemented
22    let event = PublicTransactionEvent {
23        input_compressed_account_hashes,
24        output_compressed_account_hashes,
25        output_compressed_accounts: inputs.output_compressed_accounts,
26        output_leaf_indices,
27        sequence_numbers,
28        relay_fee: inputs.relay_fee,
29        pubkey_array: ctx.remaining_accounts.iter().map(|x| x.key()).collect(),
30        compress_or_decompress_lamports: inputs.compress_or_decompress_lamports,
31        message: None,
32        is_compress: inputs.is_compress,
33    };
34
35    // 10240 = 10 * 1024 the max instruction data of a cpi.
36    let data_capacity = 10240;
37    let mut data = Vec::with_capacity(data_capacity);
38    event.man_serialize(&mut data)?;
39
40    if data_capacity != data.capacity() {
41        msg!(
42            "Event serialization exceeded capacity. Used {}, allocated {}.",
43            data.capacity(),
44            data_capacity
45        );
46        return err!(SystemProgramError::InvalidCapacity);
47    }
48
49    emit_indexer_event(data, ctx.accounts.get_noop_program())
50}