use anchor_lang::prelude::*;
use light_batched_merkle_tree::{
merkle_tree::BatchedMerkleTreeAccount,
rollover_address_tree::rollover_batched_address_tree_from_account_info,
};
use crate::{
utils::{
check_signer_is_registered_or_authority::{
check_signer_is_registered_or_authority, GroupAccounts,
},
transfer_lamports::transfer_lamports,
},
RegisteredProgram,
};
#[derive(Accounts)]
pub struct RolloverBatchedAddressMerkleTree<'info> {
#[account(mut)]
pub fee_payer: Signer<'info>,
pub authority: Signer<'info>,
pub registered_program_pda: Option<Account<'info, RegisteredProgram>>,
#[account(mut)]
pub new_address_merkle_tree: AccountInfo<'info>,
#[account(mut)]
pub old_address_merkle_tree: AccountInfo<'info>,
}
impl<'info> GroupAccounts<'info> for RolloverBatchedAddressMerkleTree<'info> {
fn get_authority(&self) -> &Signer<'info> {
&self.authority
}
fn get_registered_program_pda(&self) -> &Option<Account<'info, RegisteredProgram>> {
&self.registered_program_pda
}
}
pub fn process_rollover_batched_address_merkle_tree<'a, 'b, 'c: 'info, 'info>(
ctx: Context<'a, 'b, 'c, 'info, RolloverBatchedAddressMerkleTree<'info>>,
network_fee: Option<u64>,
) -> Result<()> {
msg!(
"old address tree pubkey {:?}",
ctx.accounts.old_address_merkle_tree.key()
);
msg!(
"new address tree pubkey {:?}",
ctx.accounts.new_address_merkle_tree.key()
);
let old_merkle_tree_account = &mut BatchedMerkleTreeAccount::address_from_account_info(
&ctx.accounts.old_address_merkle_tree,
)
.map_err(ProgramError::from)?;
check_signer_is_registered_or_authority::<
RolloverBatchedAddressMerkleTree,
BatchedMerkleTreeAccount,
>(&ctx, old_merkle_tree_account)?;
let merkle_tree_rent = rollover_batched_address_tree_from_account_info(
&ctx.accounts.old_address_merkle_tree,
&ctx.accounts.new_address_merkle_tree,
network_fee,
)
.map_err(ProgramError::from)?;
msg!("here2 new mt rent {}", merkle_tree_rent);
msg!(
"old mt balance {}",
ctx.accounts.old_address_merkle_tree.lamports()
);
transfer_lamports(
&ctx.accounts.old_address_merkle_tree.to_account_info(),
&ctx.accounts.fee_payer.to_account_info(),
merkle_tree_rent,
)?;
Ok(())
}