solana_stake_interface/
stake_flags.rs

1#[cfg(feature = "borsh")]
2use borsh::{BorshDeserialize, BorshSchema, BorshSerialize};
3
4/// Additional flags for stake state.
5#[cfg_attr(feature = "frozen-abi", derive(solana_frozen_abi_macro::AbiExample))]
6#[cfg_attr(
7    feature = "borsh",
8    derive(BorshSerialize, BorshDeserialize, BorshSchema),
9    borsh(crate = "borsh")
10)]
11#[cfg_attr(
12    feature = "serde",
13    derive(serde_derive::Deserialize, serde_derive::Serialize)
14)]
15#[derive(Copy, PartialEq, Eq, Clone, PartialOrd, Ord, Hash, Debug)]
16pub struct StakeFlags {
17    bits: u8,
18}
19
20/// Currently, only bit 1 is used. The other 7 bits are reserved for future usage.
21impl StakeFlags {
22    ///  Stake must be fully activated before deactivation is allowed (bit 1).
23    #[deprecated(
24        since = "2.1.0",
25        note = "This flag will be removed because it was only used for `redelegate`, which will not be enabled."
26    )]
27    pub const MUST_FULLY_ACTIVATE_BEFORE_DEACTIVATION_IS_PERMITTED: Self =
28        Self { bits: 0b0000_0001 };
29
30    pub const fn empty() -> Self {
31        Self { bits: 0 }
32    }
33
34    pub const fn contains(&self, other: Self) -> bool {
35        (self.bits & other.bits) == other.bits
36    }
37
38    pub fn remove(&mut self, other: Self) {
39        self.bits &= !other.bits;
40    }
41
42    pub fn set(&mut self, other: Self) {
43        self.bits |= other.bits;
44    }
45
46    pub const fn union(self, other: Self) -> Self {
47        Self {
48            bits: self.bits | other.bits,
49        }
50    }
51}
52
53impl Default for StakeFlags {
54    fn default() -> Self {
55        StakeFlags::empty()
56    }
57}
58
59#[cfg(test)]
60mod tests {
61    use super::*;
62
63    #[test]
64    #[allow(deprecated)]
65    fn test_stake_flags() {
66        let mut f = StakeFlags::empty();
67        assert!(!f.contains(StakeFlags::MUST_FULLY_ACTIVATE_BEFORE_DEACTIVATION_IS_PERMITTED));
68
69        f.set(StakeFlags::MUST_FULLY_ACTIVATE_BEFORE_DEACTIVATION_IS_PERMITTED);
70        assert!(f.contains(StakeFlags::MUST_FULLY_ACTIVATE_BEFORE_DEACTIVATION_IS_PERMITTED));
71
72        f.remove(StakeFlags::MUST_FULLY_ACTIVATE_BEFORE_DEACTIVATION_IS_PERMITTED);
73        assert!(!f.contains(StakeFlags::MUST_FULLY_ACTIVATE_BEFORE_DEACTIVATION_IS_PERMITTED));
74
75        let f1 = StakeFlags::empty();
76        let f2 = StakeFlags::empty();
77        let f3 = f1.union(f2);
78        assert!(!f3.contains(StakeFlags::MUST_FULLY_ACTIVATE_BEFORE_DEACTIVATION_IS_PERMITTED));
79
80        let f1 = StakeFlags::MUST_FULLY_ACTIVATE_BEFORE_DEACTIVATION_IS_PERMITTED;
81        let f2 = StakeFlags::empty();
82        let f3 = f1.union(f2);
83        assert!(f3.contains(StakeFlags::MUST_FULLY_ACTIVATE_BEFORE_DEACTIVATION_IS_PERMITTED));
84
85        let f1 = StakeFlags::empty();
86        let f2 = StakeFlags::MUST_FULLY_ACTIVATE_BEFORE_DEACTIVATION_IS_PERMITTED;
87        let f3 = f1.union(f2);
88        assert!(f3.contains(StakeFlags::MUST_FULLY_ACTIVATE_BEFORE_DEACTIVATION_IS_PERMITTED));
89
90        let f1 = StakeFlags::MUST_FULLY_ACTIVATE_BEFORE_DEACTIVATION_IS_PERMITTED;
91        let f2 = StakeFlags::MUST_FULLY_ACTIVATE_BEFORE_DEACTIVATION_IS_PERMITTED;
92        let f3 = f1.union(f2);
93        assert!(f3.contains(StakeFlags::MUST_FULLY_ACTIVATE_BEFORE_DEACTIVATION_IS_PERMITTED));
94    }
95}