light_system_program/invoke_cpi/
processor.rs1pub use anchor_lang::prelude::*;
2use light_heap::{bench_sbf_end, bench_sbf_start};
3
4use super::verify_signer::cpi_signer_checks;
5use crate::{
6 invoke::processor::process, invoke_cpi::instruction::InvokeCpiInstruction,
7 sdk::accounts::SignerAccounts, InstructionDataInvoke, InstructionDataInvokeCpi,
8};
9
10#[allow(unused_mut)]
15pub fn process_invoke_cpi<'a, 'b, 'c: 'info + 'b, 'info>(
16 mut ctx: Context<'a, 'b, 'c, 'info, InvokeCpiInstruction<'info>>,
17 inputs: InstructionDataInvokeCpi,
18) -> Result<()> {
19 bench_sbf_start!("cpda_cpi_signer_checks");
20 cpi_signer_checks(
21 &ctx.accounts.invoking_program.key(),
22 &ctx.accounts.get_authority().key(),
23 &inputs.input_compressed_accounts_with_merkle_context,
24 &inputs.output_compressed_accounts,
25 )?;
26 bench_sbf_end!("cpda_cpi_signer_checks");
27 bench_sbf_start!("cpda_process_cpi_context");
28 #[allow(unused)]
29 let mut cpi_context_inputs_len = if let Some(value) = ctx.accounts.cpi_context_account.as_ref()
30 {
31 value.context.len()
32 } else {
33 0
34 };
35 let inputs = match crate::invoke_cpi::process_cpi_context::process_cpi_context(
36 inputs,
37 &mut ctx.accounts.cpi_context_account,
38 ctx.accounts.fee_payer.key(),
39 ctx.remaining_accounts,
40 ) {
41 Ok(Some(inputs)) => inputs,
42 Ok(None) => return Ok(()),
43 Err(err) => return Err(err),
44 };
45 bench_sbf_end!("cpda_process_cpi_context");
46
47 let data = InstructionDataInvoke {
48 input_compressed_accounts_with_merkle_context: inputs
49 .input_compressed_accounts_with_merkle_context,
50 output_compressed_accounts: inputs.output_compressed_accounts,
51 relay_fee: inputs.relay_fee,
52 proof: inputs.proof,
53 new_address_params: inputs.new_address_params,
54 compress_or_decompress_lamports: inputs.compress_or_decompress_lamports,
55 is_compress: inputs.is_compress,
56 };
57 process(
58 data,
59 Some(ctx.accounts.invoking_program.key()),
60 ctx,
61 cpi_context_inputs_len,
62 )
63}