pub use crate::state::*;
use anchor_lang::{
prelude::*,
system_program::{transfer, System, Transfer},
};
#[derive(Accounts)]
pub struct CloseUser<'info> {
#[account(mut)]
authority: Signer<'info>,
#[account(mut, seeds = ["payer".as_bytes(), authority.key().as_ref()], bump)]
payer_pda: SystemAccount<'info>,
#[account(mut, close = authority, seeds = ["user".as_bytes(), &authority.key().to_bytes()[..]], bump)]
user: Account<'info, User>,
system_program: Program<'info, System>,
}
pub fn handler(ctx: Context<CloseUser>) -> Result<()> {
let lamports = ctx.accounts.payer_pda.lamports();
let authority = ctx.accounts.authority.key();
let payer_seeds = &[
"payer".as_bytes(),
&authority.as_ref()[..],
&[ctx.bumps["payer_pda"]],
];
let payer = &[&payer_seeds[..]];
let cpi_context = CpiContext::new_with_signer(
ctx.accounts.system_program.to_account_info(),
Transfer {
from: ctx.accounts.payer_pda.to_account_info(),
to: ctx.accounts.authority.to_account_info(),
},
payer,
);
transfer(cpi_context, lamports)?;
Ok(())
}