light_system_program/invoke_cpi/
processor.rs

1pub 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/// Processes an `InvokeCpi` instruction.
11/// Checks:
12/// 1. signer checks (inputs), writeaccess (outputs) (cpi_signer_checks)
13/// 2. sets or gets cpi context (process_cpi_context)
14#[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}