light_registry/account_compression_cpi/
migrate_state.rs

1use account_compression::{
2    program::AccountCompression, utils::constants::CPI_AUTHORITY_PDA_SEED, StateMerkleTreeAccount,
3};
4use anchor_lang::prelude::*;
5
6use crate::epoch::register_epoch::ForesterEpochPda;
7
8#[derive(Accounts)]
9pub struct MigrateState<'info> {
10    /// CHECK: only eligible foresters can nullify leaves. Is checked in ix.
11    #[account(mut)]
12    pub registered_forester_pda: Account<'info, ForesterEpochPda>,
13    pub authority: Signer<'info>,
14    /// CHECK: (seed constraints) used to invoke account compression program via cpi.
15    #[account(seeds = [CPI_AUTHORITY_PDA_SEED], bump)]
16    pub cpi_authority: AccountInfo<'info>,
17    /// CHECK: (account compression program) group access control.
18    pub registered_program_pda: AccountInfo<'info>,
19    pub account_compression_program: Program<'info, AccountCompression>,
20    /// CHECK: (account compression program) when emitting event.
21    pub log_wrapper: UncheckedAccount<'info>,
22    /// CHECK: (account compression program).
23    #[account(mut)]
24    pub merkle_tree: AccountLoader<'info, StateMerkleTreeAccount>,
25    /// CHECK: (account compression program).
26    #[account(mut)]
27    pub output_queue: AccountInfo<'info>,
28}
29
30pub fn process_migrate_state(
31    ctx: &Context<MigrateState>,
32    bump: u8,
33    input: account_compression::MigrateLeafParams,
34) -> Result<()> {
35    let bump = &[bump];
36    let seeds = [CPI_AUTHORITY_PDA_SEED, bump];
37    let signer_seeds = &[&seeds[..]];
38    let accounts = account_compression::cpi::accounts::MigrateState {
39        authority: ctx.accounts.cpi_authority.to_account_info(),
40        registered_program_pda: Some(ctx.accounts.registered_program_pda.to_account_info()),
41        log_wrapper: ctx.accounts.log_wrapper.to_account_info(),
42        merkle_tree: ctx.accounts.merkle_tree.to_account_info(),
43        output_queue: ctx.accounts.output_queue.to_account_info(),
44    };
45    let cpi_ctx = CpiContext::new_with_signer(
46        ctx.accounts.account_compression_program.to_account_info(),
47        accounts,
48        signer_seeds,
49    );
50
51    account_compression::cpi::migrate_state(cpi_ctx, input)
52}