--- a/pallets/nft/src/lib.rs +++ b/pallets/nft/src/lib.rs @@ -1049,9 +1049,12 @@ pub fn transfer(origin, recipient: T::AccountId, collection_id: CollectionId, item_id: TokenId, value: u128) -> DispatchResult { let sender = ensure_signed(origin)?; + let target_collection = >::get(collection_id); + // Limits check + Self::is_correct_transfer(collection_id, &target_collection, &recipient)?; + // 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); @@ -1162,11 +1165,15 @@ } } - // Transfer permissions check let target_collection = >::get(collection_id); - ensure!(appoved_transfer || Self::is_owner_or_admin_permissions(collection_id, sender.clone()), - Error::::NoPermission); + // Limits check + 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); + if target_collection.access == AccessMode::WhiteList { Self::check_white_list(collection_id, &sender)?; Self::check_white_list(collection_id, &recipient)?; @@ -1422,8 +1429,15 @@ ) -> DispatchResult { let sender = ensure_signed(origin)?; Self::check_owner_permissions(collection_id, sender.clone())?; + let mut target_collection = >::get(collection_id); + let chain_limits = ChainLimit::get(); + let climits = target_collection.limits; + + // token_limit check prev + ensure!(climits.token_limit > limits.token_limit && + climits.token_limit <= chain_limits.account_token_ownership_limit, + Error::::AccountTokenLimitExceeded); - let mut target_collection = >::get(collection_id); target_collection.limits = limits; >::insert(collection_id, target_collection); @@ -1434,13 +1448,25 @@ impl Module { + fn is_correct_transfer(collection_id: CollectionId, collection: &CollectionType, recipient: &T::AccountId) -> DispatchResult { + + if !Self::is_owner_or_admin_permissions(collection_id, recipient.clone()) { + + // check token limit and account token limit + let account_items: u32 = >::get(collection_id, recipient).len() as u32; + ensure!(collection.limits.account_token_ownership_limit > account_items, Error::::AccountTokenLimitExceeded); + } + + Ok(()) + } + fn can_create_items_in_collection(collection_id: CollectionId, collection: &CollectionType, sender: &T::AccountId, owner: &T::AccountId) -> DispatchResult { if !Self::is_owner_or_admin_permissions(collection_id, sender.clone()) { // check token limit and account token limit let total_items: u32 = ItemListIndex::get(collection_id); - let account_items: u32 = >::get(collection_id, owner.clone()).len() as u32; + let account_items: u32 = >::get(collection_id, owner).len() as u32; ensure!(collection.limits.token_limit > total_items, Error::::CollectionTokenLimitExceeded); ensure!(collection.limits.account_token_ownership_limit > account_items, Error::::AccountTokenLimitExceeded); ensure!(collection.mint_mode == true, Error::::PublicMintingNotAllowed);