account_compression/processor/
insert_into_queues.rs

1use anchor_lang::prelude::*;
2use light_compressed_account::instruction_data::insert_into_queues::InsertIntoQueuesInstructionData;
3use light_zero_copy::borsh::Deserialize;
4
5use super::{
6    insert_addresses::insert_addresses, insert_leaves::insert_leaves,
7    insert_nullifiers::insert_nullifiers,
8};
9use crate::{context::AcpAccount, errors::AccountCompressionErrorCode, GenericInstruction};
10
11pub fn process_insert_into_queues<'a, 'b, 'c: 'info, 'info>(
12    ctx: &Context<'a, 'b, 'c, 'info, GenericInstruction<'info>>,
13    bytes: Vec<u8>,
14) -> Result<()> {
15    let (inputs, _) = InsertIntoQueuesInstructionData::zero_copy_at(bytes.as_slice())
16        .map_err(ProgramError::from)?;
17    let authority = ctx.accounts.authority.to_account_info();
18    // Checks accounts for every account in remaining accounts:
19    // 1. program ownership
20    // 2. discriminator
21    // 3. signer eligibility
22    let mut accounts = AcpAccount::from_account_infos(
23        ctx.remaining_accounts,
24        &authority,
25        inputs.is_invoked_by_program(),
26        inputs.bump,
27    )?;
28    if inputs.nullifiers.is_empty() && inputs.addresses.is_empty() && inputs.leaves.is_empty() {
29        return Err(AccountCompressionErrorCode::InputElementsEmpty.into());
30    }
31
32    let current_slot = Clock::get()?.slot;
33    // msg!("insert_nullifiers {:?}", inputs.nullifiers.len());
34    // msg!("insert_leaves {:?}", inputs.leaves.len());
35    // msg!("insert_addresses {:?}", inputs.addresses.len());
36
37    #[cfg(feature = "bench-sbf")]
38    light_heap::bench_sbf_start!("insert_nullifiers");
39    insert_nullifiers(
40        inputs.num_queues,
41        inputs.tx_hash,
42        inputs.nullifiers.as_slice(),
43        &mut accounts,
44        &current_slot,
45    )?;
46    #[cfg(feature = "bench-sbf")]
47    light_heap::bench_sbf_end!("insert_nullifiers");
48    #[cfg(feature = "bench-sbf")]
49    light_heap::bench_sbf_start!("append_leaves");
50    insert_leaves(
51        inputs.leaves.as_slice(),
52        inputs.start_output_appends,
53        inputs.num_output_queues,
54        &mut accounts,
55        &current_slot,
56    )?;
57    #[cfg(feature = "bench-sbf")]
58    light_heap::bench_sbf_end!("append_leaves");
59
60    #[cfg(feature = "bench-sbf")]
61    light_heap::bench_sbf_start!("insert_addresses");
62    insert_addresses(
63        inputs.num_address_queues,
64        inputs.addresses.as_slice(),
65        &mut accounts,
66        &current_slot,
67    )?;
68
69    #[cfg(feature = "bench-sbf")]
70    light_heap::bench_sbf_end!("insert_addresses");
71    Ok(())
72}