triggr/instructions/
close_trigger.rs

1pub use crate::state::*;
2use anchor_lang::prelude::*;
3
4#[derive(Accounts)]
5#[instruction(_trigger_index: u64)]
6pub struct CloseTrigger<'info> {
7    // needs to be signed by authority
8    #[account(mut)]
9    authority: Signer<'info>,
10
11    #[account(mut, seeds = ["payer".as_bytes(), authority.key().as_ref()], bump)]
12    payer: SystemAccount<'info>,
13
14    #[account(
15        mut, 
16        seeds = ["user".as_bytes(), &authority.key().to_bytes()], 
17        bump, 
18        realloc = 8 + User::MIN_SIZE + (user.active_triggers.len() * 32) - 32, 
19        realloc::payer = authority, 
20        realloc::zero = true
21    )]
22    user: Account<'info, User>,
23
24    #[account(mut, close = authority, seeds = ["trigger".as_bytes(), &authority.key().to_bytes()[..], &_trigger_index.to_le_bytes()], bump )]
25    trigger: Account<'info, Trigger>,
26
27    system_program: Program<'info, System>,
28}
29
30pub fn handler(ctx: Context<CloseTrigger>, _trigger_index: u64) -> Result<()> {
31
32    let active_triggers = &mut ctx.accounts.user.active_triggers;
33
34    active_triggers.retain(|&x| x != ctx.accounts.trigger.key());
35
36    ctx.accounts.user.active_triggers = active_triggers.clone();
37    
38    Ok(())
39}