--- a/pallets/nft/src/lib.rs +++ b/pallets/nft/src/lib.rs @@ -382,6 +382,8 @@ AccountTokenLimitExceeded, /// Collection limit bounds per collection exceeded CollectionLimitBoundsExceeded, + /// Tried to enable permissions which are only permitted to be disabled + OwnerPermissionsCantBeReturned, /// Schema data size limit bound exceeded SchemaDataLimitExceeded, /// Maximum refungibility exceeded @@ -624,6 +626,11 @@ let sender = ensure_signed(origin)?; Self::check_owner_permissions(collection_id, sender)?; + let mut target_collection = >::get(collection_id); + if !target_collection.limits.owner_can_destroy { + fail!(Error::::NoPermission); + } + >::remove_prefix(collection_id); >::remove_prefix(collection_id); >::remove_prefix(collection_id); @@ -1007,9 +1014,14 @@ // Transfer permissions check let target_collection = >::get(collection_id); - ensure!(Self::is_item_owner(sender.clone(), collection_id, item_id) || - Self::is_owner_or_admin_permissions(collection_id, sender.clone()), - Error::::NoPermission); + ensure!( + Self::is_item_owner(sender.clone(), collection_id, item_id) || + ( + target_collection.limits.owner_can_transfer && + Self::is_owner_or_admin_permissions(collection_id, sender.clone()) + ), + Error::::NoPermission + ); if target_collection.access == AccessMode::WhiteList { Self::check_white_list(collection_id, &sender)?; @@ -1083,9 +1095,14 @@ // Transfer permissions check let target_collection = >::get(collection_id); - ensure!(Self::is_item_owner(sender.clone(), collection_id, item_id) || - Self::is_owner_or_admin_permissions(collection_id, sender.clone()), - Error::::NoPermission); + ensure!( + Self::is_item_owner(sender.clone(), collection_id, item_id) || + ( + target_collection.limits.owner_can_transfer && + Self::is_owner_or_admin_permissions(collection_id, sender.clone()) + ), + Error::::NoPermission + ); if target_collection.access == AccessMode::WhiteList { Self::check_white_list(collection_id, &sender)?; @@ -1141,8 +1158,14 @@ Self::is_correct_transfer(collection_id, &target_collection, &recipient)?; // Transfer permissions check - ensure!(appoved_transfer || Self::is_owner_or_admin_permissions(collection_id, sender.clone()), - Error::::NoPermission); + ensure!( + appoved_transfer || + ( + target_collection.limits.owner_can_transfer && + Self::is_owner_or_admin_permissions(collection_id, sender.clone()) + ), + Error::::NoPermission + ); if target_collection.access == AccessMode::WhiteList { Self::check_white_list(collection_id, &sender)?; @@ -1527,6 +1550,12 @@ limits.token_limit <= chain_limits.account_token_ownership_limit, Error::::AccountTokenLimitExceeded); + ensure!( + (climits.owner_can_transfer || !limits.owner_can_transfer) && + (climits.owner_can_destroy || !limits.owner_can_destroy), + Error::::OwnerPermissionsCantBeReturned, + ); + target_collection.limits = limits; >::insert(collection_id, target_collection);