Skip to main content

solana_stake_interface/
stake_flags.rs

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