--- a/pallets/common/src/lib.rs +++ b/pallets/common/src/lib.rs @@ -812,7 +812,7 @@ let current_permission = all_permissions.get(&property_permission.key); if matches![ current_permission, - Some(PropertyPermission::AdminConst | PropertyPermission::ItemOwnerConst) + Some(PropertyPermission { mutable: false, .. }) ] { return Err(>::NoPermission.into()); } --- a/pallets/nonfungible/src/lib.rs +++ b/pallets/nonfungible/src/lib.rs @@ -321,7 +321,7 @@ let permission = >::property_permissions(collection.id) .get(property_key) .map(|p| p.clone()) - .unwrap_or(PropertyPermission::None); + .unwrap_or(PropertyPermission::none()); let token_data = >::get((collection.id, token_id)) .ok_or(>::TokenNotFound)?; @@ -335,15 +335,28 @@ .get_property(property_key) .is_some(); - match (permission, is_property_exists) { - (PropertyPermission::AdminConst, false) => collection.check_is_owner_or_admin(sender), - (PropertyPermission::Admin, _) => collection.check_is_owner_or_admin(sender), - (PropertyPermission::ItemOwnerConst, false) => check_token_owner(), - (PropertyPermission::ItemOwner, _) => check_token_owner(), - (PropertyPermission::ItemOwnerOrAdmin, _) => { - check_token_owner().or(collection.check_is_owner_or_admin(sender)) + match permission { + PropertyPermission { mutable: false, .. } if is_property_exists => { + Err(>::NoPermission.into()) } - _ => Err(>::NoPermission.into()), + + PropertyPermission { + collection_admin, + token_owner, + .. + } => { + let mut check_result = Err(>::NoPermission.into()); + + if collection_admin { + check_result = collection.check_is_owner_or_admin(sender); + } + + if token_owner { + check_result.or(check_token_owner()) + } else { + check_result + } + } } } --- a/primitives/data-structs/src/lib.rs +++ b/primitives/data-structs/src/lib.rs @@ -635,13 +635,20 @@ #[derive(Encode, Decode, TypeInfo, Debug, MaxEncodedLen, PartialEq, Clone)] #[cfg_attr(feature = "serde1", derive(Serialize, Deserialize))] -pub enum PropertyPermission { - None, - AdminConst, - Admin, - ItemOwnerConst, - ItemOwner, - ItemOwnerOrAdmin, +pub struct PropertyPermission { + pub mutable: bool, + pub collection_admin: bool, + pub token_owner: bool, +} + +impl PropertyPermission { + pub fn none() -> Self { + Self { + mutable: true, + collection_admin: false, + token_owner: false, + } + } } #[derive(Encode, Decode, Debug, TypeInfo, Clone, PartialEq, MaxEncodedLen)]