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