light_system_program/invoke/
emit_event.rs1use 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 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 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}