triggr/instructions/
close_user.rs

1pub use crate::state::*;
2use anchor_lang::{
3    prelude::*,
4    system_program::{transfer, System, Transfer},
5};
6
7#[derive(Accounts)]
8pub struct CloseUser<'info> {
9    #[account(mut)]
10    authority: Signer<'info>,
11
12    #[account(mut, seeds = ["payer".as_bytes(), authority.key().as_ref()], bump)]
13    payer_pda: SystemAccount<'info>,
14
15    #[account(mut, close = authority, seeds = ["user".as_bytes(), &authority.key().to_bytes()[..]], bump)]
16    user: Account<'info, User>,
17
18    system_program: Program<'info, System>,
19}
20
21pub fn handler(ctx: Context<CloseUser>) -> Result<()> {
22    let lamports = ctx.accounts.payer_pda.lamports();
23
24    let authority = ctx.accounts.authority.key();
25
26    let payer_seeds = &[
27        "payer".as_bytes(),
28        &authority.as_ref()[..],
29        &[ctx.bumps["payer_pda"]],
30    ];
31    let payer = &[&payer_seeds[..]];
32
33    let cpi_context = CpiContext::new_with_signer(
34        ctx.accounts.system_program.to_account_info(),
35        Transfer {
36            from: ctx.accounts.payer_pda.to_account_info(),
37            to: ctx.accounts.authority.to_account_info(),
38        },
39        payer,
40    );
41
42    transfer(cpi_context, lamports)?;
43
44    Ok(())
45}