1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
//! Disables a [Gauge].

use vipers::assert_keys_eq;

use crate::*;

/// Accounts for [gauge::gauge_disable].
#[derive(Accounts)]
pub struct GaugeDisable<'info> {
    /// The [Gaugemeister].
    pub gaugemeister: Account<'info, Gaugemeister>,
    /// The [Gauge] to disable.
    #[account(mut)]
    pub gauge: Account<'info, Gauge>,
    /// The [Gaugemeister::foreman].
    pub foreman: Signer<'info>,
}

/// Emitted on [gauge::gauge_disable].
#[event]
pub struct GaugeDisableEvent {
    /// The [Gauge].
    #[index]
    pub gauge: Pubkey,
    /// The [Gaugemeister].
    #[index]
    pub gaugemeister: Pubkey,
    /// The [Gaugemeister::foreman] that disabled the gauge.
    pub foreman: Pubkey,
}

pub fn handler(ctx: Context<GaugeDisable>) -> ProgramResult {
    let gauge = &mut ctx.accounts.gauge;
    gauge.is_disabled = true;
    emit!(GaugeDisableEvent {
        gaugemeister: ctx.accounts.gaugemeister.key(),
        gauge: gauge.key(),
        foreman: ctx.accounts.foreman.key(),
    });
    Ok(())
}

impl<'info> Validate<'info> for GaugeDisable<'info> {
    fn validate(&self) -> ProgramResult {
        assert_keys_eq!(
            self.foreman,
            self.gaugemeister.foreman,
            UnauthorizedNotForeman
        );
        assert_keys_eq!(self.gauge.gaugemeister, self.gaugemeister);
        Ok(())
    }
}