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
use crate::{state::GuardType, utils::cmp_pubkeys};

use super::*;

/// Guard that restricts access to a specific address.
#[derive(AnchorSerialize, AnchorDeserialize, Clone, Debug)]
pub struct AddressGate {
    pub address: Pubkey,
}

impl Guard for AddressGate {
    fn size() -> usize {
        32 // address
    }

    fn mask() -> u64 {
        GuardType::as_mask(GuardType::AddressGate)
    }
}

impl Condition for AddressGate {
    fn validate<'info>(
        &self,
        ctx: &mut EvaluationContext,
        _guard_set: &GuardSet,
        _mint_args: &[u8],
    ) -> Result<()> {
        if !cmp_pubkeys(&ctx.accounts.minter.key(), &self.address) {
            return err!(CandyGuardError::AddressNotAuthorized);
        }

        Ok(())
    }
}