pub use anchor_lang::prelude::*;
use light_heap::{bench_sbf_end, bench_sbf_start};
use super::verify_signer::cpi_signer_checks;
use crate::{
invoke::processor::process, invoke_cpi::instruction::InvokeCpiInstruction,
sdk::accounts::SignerAccounts, InstructionDataInvoke, InstructionDataInvokeCpi,
};
#[allow(unused_mut)]
pub fn process_invoke_cpi<'a, 'b, 'c: 'info + 'b, 'info>(
mut ctx: Context<'a, 'b, 'c, 'info, InvokeCpiInstruction<'info>>,
inputs: InstructionDataInvokeCpi,
) -> Result<()> {
bench_sbf_start!("cpda_cpi_signer_checks");
cpi_signer_checks(
&ctx.accounts.invoking_program.key(),
&ctx.accounts.get_authority().key(),
&inputs.signer_seeds,
&inputs.input_compressed_accounts_with_merkle_context,
&inputs.output_compressed_accounts,
)?;
bench_sbf_end!("cpda_cpi_signer_checks");
bench_sbf_start!("cpda_process_cpi_context");
#[cfg(feature = "cpi-context")]
let inputs = match crate::invoke_cpi::process_cpi_context::process_cpi_context(inputs, &mut ctx)
{
Ok(Some(inputs)) => inputs,
Ok(None) => return Ok(()),
Err(err) => return Err(err),
};
#[cfg(not(feature = "cpi-context"))]
if inputs.cpi_context.is_some() || ctx.accounts.cpi_context_account.is_some() {
unimplemented!("cpi-context feature is not enabled");
}
bench_sbf_end!("cpda_process_cpi_context");
let data = InstructionDataInvoke {
input_compressed_accounts_with_merkle_context: inputs
.input_compressed_accounts_with_merkle_context,
output_compressed_accounts: inputs.output_compressed_accounts,
relay_fee: inputs.relay_fee,
proof: inputs.proof,
new_address_params: inputs.new_address_params,
compress_or_decompress_lamports: inputs.compress_or_decompress_lamports,
is_compress: inputs.is_compress,
};
process(data, Some(ctx.accounts.invoking_program.key()), ctx)
}