pallet_permission0/permission/
curator.rs

1use bitflags::bitflags;
2use codec::{Decode, Encode, MaxEncodedLen};
3use polkadot_sdk::{
4    frame_support::{CloneNoBound, DebugNoBound, EqNoBound, PartialEqNoBound},
5    polkadot_sdk_frame::prelude::BlockNumberFor,
6};
7use scale_info::TypeInfo;
8
9use crate::Config;
10
11#[derive(
12    CloneNoBound,
13    Copy,
14    DebugNoBound,
15    Encode,
16    Decode,
17    EqNoBound,
18    PartialEqNoBound,
19    TypeInfo,
20    MaxEncodedLen,
21)]
22pub struct CuratorPermissions(u32);
23
24bitflags! {
25    impl CuratorPermissions: u32 {
26        /// Able to appoint other curators. Though not used at the moment,
27        /// it will be valuable when we remove the SUDO key/multisig.
28        const ROOT                        = 0b0000_0001;
29        /// Permission to review and process agent applications
30        const APPLICATION_REVIEW          = 0b0000_0010;
31        /// Permission to manage the whitelist (add/remove accounts)
32        const WHITELIST_MANAGE            = 0b0000_0100;
33        /// Permission to apply penalty factors to agents
34        const PENALTY_CONTROL             = 0b0000_1000;
35        /// Permission to toggle agent freezing
36        const AGENT_FREEZING_TOGGLING     = 0b0001_0000;
37        /// Permission to toggle namespace freezing
38        const NAMESPACE_FREEZING_TOGGLING = 0b0010_0000;
39    }
40}
41
42#[derive(Encode, Decode, CloneNoBound, PartialEq, TypeInfo, MaxEncodedLen, DebugNoBound)]
43#[scale_info(skip_type_params(T))]
44pub struct CuratorScope<T: Config> {
45    pub flags: CuratorPermissions,
46    pub cooldown: Option<BlockNumberFor<T>>,
47}
48
49impl<T: Config> CuratorScope<T> {
50    pub fn has_permission(&self, permission: CuratorPermissions) -> bool {
51        self.flags.contains(permission)
52    }
53
54    /// Checks for [`CuratorPermissions::APPLICATION_REVIEW`]
55    pub fn can_review_applications(&self) -> bool {
56        self.has_permission(CuratorPermissions::APPLICATION_REVIEW)
57    }
58
59    /// Checks for [`CuratorPermissions::WHITELIST_MANAGE`]
60    pub fn can_manage_whitelist(&self) -> bool {
61        self.has_permission(CuratorPermissions::WHITELIST_MANAGE)
62    }
63
64    /// Checks for [`CuratorPermissions::PENALTY_CONTROL`]
65    pub fn can_control_penalties(&self) -> bool {
66        self.has_permission(CuratorPermissions::PENALTY_CONTROL)
67    }
68}
69
70impl<T: Config> CuratorScope<T> {
71    /// Cleanup operations when permission is revoked or expired
72    pub(crate) fn cleanup(
73        &self,
74        _permission_id: polkadot_sdk::sp_core::H256,
75        _last_execution: &Option<crate::BlockNumberFor<T>>,
76        _grantor: &T::AccountId,
77    ) {
78        // No special cleanup needed for curator permissions
79    }
80}