git.delta.rocks / unique-network / refs/commits / e7d3521284b7

difftreelog

NFTPAR-183: Storage Refactoring. Reduced collection id and token id from u64 to u32.

sotmorskiy2020-12-10parent: #68e6834.patch.diff
in: master

2 files changed

modifiedpallets/nft/src/lib.rsdiffbeforeafterboth
--- a/pallets/nft/src/lib.rs
+++ b/pallets/nft/src/lib.rs
@@ -48,6 +48,9 @@
 // Structs
 // #region
 
+pub type CollectionId = u32;
+pub type TokenId = u32;
+
 #[derive(Encode, Decode, Eq, Debug, Clone, PartialEq)]
 #[cfg_attr(feature = "std", derive(Serialize, Deserialize))]
 pub enum CollectionMode {
@@ -116,7 +119,7 @@
 #[derive(Encode, Decode, Default, Debug, Clone, PartialEq)]
 #[cfg_attr(feature = "std", derive(Serialize, Deserialize))]
 pub struct NftItemType<AccountId> {
-    pub collection: u64,
+    pub collection: CollectionId,
     pub owner: AccountId,
     pub const_data: Vec<u8>,
     pub variable_data: Vec<u8>,
@@ -125,7 +128,7 @@
 #[derive(Encode, Decode, Default, Debug, Clone, PartialEq)]
 #[cfg_attr(feature = "std", derive(Serialize, Deserialize))]
 pub struct FungibleItemType<AccountId> {
-    pub collection: u64,
+    pub collection: CollectionId,
     pub owner: AccountId,
     pub value: u128,
 }
@@ -133,7 +136,7 @@
 #[derive(Encode, Decode, Default, Debug, Clone, PartialEq)]
 #[cfg_attr(feature = "std", derive(Serialize, Deserialize))]
 pub struct ReFungibleItemType<AccountId> {
-    pub collection: u64,
+    pub collection: CollectionId,
     pub owner: Vec<Ownership<AccountId>>,
     pub const_data: Vec<u8>,
     pub variable_data: Vec<u8>,
@@ -151,8 +154,8 @@
 pub struct VestingItem<AccountId, Moment> {
     pub sender: AccountId,
     pub recipient: AccountId,
-    pub collection_id: u64,
-    pub item_id: u64,
+    pub collection_id: CollectionId,
+    pub item_id: TokenId,
     pub amount: u64,
     pub vesting_date: Moment,
 }
@@ -167,8 +170,8 @@
 #[derive(Encode, Decode, Default, Debug, Clone, PartialEq)]
 #[cfg_attr(feature = "std", derive(Serialize, Deserialize))]
 pub struct ChainLimits {
-    pub collection_numbers_limit: u64,
-    pub account_token_ownership_limit: u64,
+    pub collection_numbers_limit: u32,
+    pub account_token_ownership_limit: u32,
     pub collections_admins_limit: u64,
     pub custom_data_limit: u32,
 
@@ -341,41 +344,41 @@
     trait Store for Module<T: Trait> as Nft {
 
         // Private members
-        NextCollectionID: u64;
-        CreatedCollectionCount: u64;
+        NextCollectionID: CollectionId;
+        CreatedCollectionCount: u32;
         ChainVersion: u64;
-        ItemListIndex: map hasher(blake2_128_concat) u64 => u64;
+        ItemListIndex: map hasher(blake2_128_concat) CollectionId => TokenId;
 
         // Chain limits struct
         pub ChainLimit get(fn chain_limit) config(): ChainLimits;
 
         // Bound counters
-        CollectionCount: u64;
-        pub AccountItemCount get(fn account_item_count): map hasher(identity) T::AccountId => u64;
+        CollectionCount: u32;
+        pub AccountItemCount get(fn account_item_count): map hasher(identity) T::AccountId => u32;
 
         // Basic collections
-        pub Collection get(fn collection) config(): map hasher(identity) u64 => CollectionType<T::AccountId>;
-        pub AdminList get(fn admin_list_collection): map hasher(identity) u64 => Vec<T::AccountId>;
-        pub WhiteList get(fn white_list): map hasher(identity) u64 => Vec<T::AccountId>;
+        pub Collection get(fn collection) config(): map hasher(identity) CollectionId => CollectionType<T::AccountId>;
+        pub AdminList get(fn admin_list_collection): map hasher(identity) CollectionId => Vec<T::AccountId>;
+        pub WhiteList get(fn white_list): map hasher(identity) CollectionId => Vec<T::AccountId>;
 
         /// Balance owner per collection map
-        pub Balance get(fn balance_count): double_map hasher(blake2_128_concat) u64, hasher(blake2_128_concat) T::AccountId => u64;
+        pub Balance get(fn balance_count): double_map hasher(blake2_128_concat) CollectionId, hasher(blake2_128_concat) T::AccountId => u64;
 
         /// second parameter: item id + owner account id
-        pub ApprovedList get(fn approved): double_map hasher(blake2_128_concat) u64, hasher(blake2_128_concat) (u64, T::AccountId) => Vec<ApprovePermissions<T::AccountId>>;
+        pub ApprovedList get(fn approved): double_map hasher(blake2_128_concat) CollectionId, hasher(blake2_128_concat) (TokenId, T::AccountId) => Vec<ApprovePermissions<T::AccountId>>;
 
         /// Item collections
-        pub NftItemList get(fn nft_item_id) config(): double_map hasher(blake2_128_concat) u64, hasher(blake2_128_concat) u64 => NftItemType<T::AccountId>;
-        pub FungibleItemList get(fn fungible_item_id) config(): double_map hasher(blake2_128_concat) u64, hasher(blake2_128_concat) u64 => FungibleItemType<T::AccountId>;
-        pub ReFungibleItemList get(fn refungible_item_id) config(): double_map hasher(blake2_128_concat) u64, hasher(blake2_128_concat) u64 => ReFungibleItemType<T::AccountId>;
+        pub NftItemList get(fn nft_item_id) config(): double_map hasher(blake2_128_concat) CollectionId, hasher(blake2_128_concat) TokenId => NftItemType<T::AccountId>;
+        pub FungibleItemList get(fn fungible_item_id) config(): double_map hasher(blake2_128_concat) CollectionId, hasher(blake2_128_concat) TokenId => FungibleItemType<T::AccountId>;
+        pub ReFungibleItemList get(fn refungible_item_id) config(): double_map hasher(blake2_128_concat) CollectionId, hasher(blake2_128_concat) TokenId => ReFungibleItemType<T::AccountId>;
 
         /// Index list
-        pub AddressTokens get(fn address_tokens): double_map hasher(blake2_128_concat) u64, hasher(blake2_128_concat) T::AccountId => Vec<u64>;
+        pub AddressTokens get(fn address_tokens): double_map hasher(blake2_128_concat) CollectionId, hasher(blake2_128_concat) T::AccountId => Vec<TokenId>;
 
         /// Tokens transfer baskets
-        pub NftTransferBasket get(fn nft_transfer_basket): double_map hasher(blake2_128_concat) u64, hasher(blake2_128_concat) u64 => T::BlockNumber;
-        pub FungibleTransferBasket get(fn fungible_transfer_basket): double_map hasher(blake2_128_concat) u64, hasher(blake2_128_concat) u64 => Vec<BasketItem<T::AccountId, T::BlockNumber>>;
-        pub ReFungibleTransferBasket get(fn refungible_transfer_basket): double_map hasher(blake2_128_concat) u64, hasher(blake2_128_concat) u64 => T::BlockNumber;
+        pub NftTransferBasket get(fn nft_transfer_basket): double_map hasher(blake2_128_concat) CollectionId, hasher(blake2_128_concat) TokenId => T::BlockNumber;
+        pub FungibleTransferBasket get(fn fungible_transfer_basket): double_map hasher(blake2_128_concat) CollectionId, hasher(blake2_128_concat) TokenId => Vec<BasketItem<T::AccountId, T::BlockNumber>>;
+        pub ReFungibleTransferBasket get(fn refungible_transfer_basket): double_map hasher(blake2_128_concat) CollectionId, hasher(blake2_128_concat) TokenId => T::BlockNumber;
 
         // Contract Sponsorship and Ownership
         pub ContractOwner get(fn contract_owner): map hasher(twox_64_concat) T::AccountId => T::AccountId;
@@ -419,7 +422,7 @@
         /// * mode: [CollectionMode] converted into u8.
         /// 
         /// * account_id: Collection owner.
-        Created(u64, u8, AccountId),
+        Created(CollectionId, u8, AccountId),
 
         /// New item was created.
         /// 
@@ -428,7 +431,7 @@
         /// * collection_id: Id of the collection where item was created.
         /// 
         /// * item_id: Id of an item. Unique within the collection.
-        ItemCreated(u64, u64),
+        ItemCreated(CollectionId, TokenId),
 
         /// Collection item was burned.
         /// 
@@ -437,7 +440,7 @@
         /// collection_id.
         /// 
         /// item_id: Identifier of burned NFT.
-        ItemDestroyed(u64, u64),
+        ItemDestroyed(CollectionId, TokenId),
     }
 );
 
@@ -558,7 +561,7 @@
         /// 
         /// * collection_id: collection to destroy.
         #[weight = T::WeightInfo::destroy_collection()]
-        pub fn destroy_collection(origin, collection_id: u64) -> DispatchResult {
+        pub fn destroy_collection(origin, collection_id: CollectionId) -> DispatchResult {
 
             let sender = ensure_signed(origin)?;
             Self::check_owner_permissions(collection_id, sender)?;
@@ -605,7 +608,7 @@
         /// 
         /// * address.
         #[weight = T::WeightInfo::add_to_white_list()]
-        pub fn add_to_white_list(origin, collection_id: u64, address: T::AccountId) -> DispatchResult{
+        pub fn add_to_white_list(origin, collection_id: CollectionId, address: T::AccountId) -> DispatchResult{
 
             let sender = ensure_signed(origin)?;
             Self::check_owner_or_admin_permissions(collection_id, sender)?;
@@ -640,7 +643,7 @@
         /// 
         /// * address.
         #[weight = T::WeightInfo::remove_from_white_list()]
-        pub fn remove_from_white_list(origin, collection_id: u64, address: T::AccountId) -> DispatchResult{
+        pub fn remove_from_white_list(origin, collection_id: CollectionId, address: T::AccountId) -> DispatchResult{
 
             let sender = ensure_signed(origin)?;
             Self::check_owner_or_admin_permissions(collection_id, sender)?;
@@ -669,7 +672,7 @@
         /// 
         /// * mode: [AccessMode]
         #[weight = T::WeightInfo::set_public_access_mode()]
-        pub fn set_public_access_mode(origin, collection_id: u64, mode: AccessMode) -> DispatchResult
+        pub fn set_public_access_mode(origin, collection_id: CollectionId, mode: AccessMode) -> DispatchResult
         {
             let sender = ensure_signed(origin)?;
 
@@ -695,7 +698,7 @@
         /// 
         /// * mint_permission: Boolean parameter. If True, allows minting to Anyone with conditions above.
         #[weight = T::WeightInfo::set_mint_permission()]
-        pub fn set_mint_permission(origin, collection_id: u64, mint_permission: bool) -> DispatchResult
+        pub fn set_mint_permission(origin, collection_id: CollectionId, mint_permission: bool) -> DispatchResult
         {
             let sender = ensure_signed(origin)?;
 
@@ -719,7 +722,7 @@
         /// 
         /// * new_owner.
         #[weight = T::WeightInfo::change_collection_owner()]
-        pub fn change_collection_owner(origin, collection_id: u64, new_owner: T::AccountId) -> DispatchResult {
+        pub fn change_collection_owner(origin, collection_id: CollectionId, new_owner: T::AccountId) -> DispatchResult {
 
             let sender = ensure_signed(origin)?;
             Self::check_owner_permissions(collection_id, sender)?;
@@ -744,7 +747,7 @@
         /// 
         /// * new_admin_id: Address of new admin to add.
         #[weight = T::WeightInfo::add_collection_admin()]
-        pub fn add_collection_admin(origin, collection_id: u64, new_admin_id: T::AccountId) -> DispatchResult {
+        pub fn add_collection_admin(origin, collection_id: CollectionId, new_admin_id: T::AccountId) -> DispatchResult {
 
             let sender = ensure_signed(origin)?;
             Self::check_owner_or_admin_permissions(collection_id, sender)?;
@@ -778,7 +781,7 @@
         /// 
         /// * account_id: Address of admin to remove.
         #[weight = T::WeightInfo::remove_collection_admin()]
-        pub fn remove_collection_admin(origin, collection_id: u64, account_id: T::AccountId) -> DispatchResult {
+        pub fn remove_collection_admin(origin, collection_id: CollectionId, account_id: T::AccountId) -> DispatchResult {
 
             let sender = ensure_signed(origin)?;
             Self::check_owner_or_admin_permissions(collection_id, sender)?;
@@ -803,7 +806,7 @@
         /// 
         /// * new_sponsor.
         #[weight = T::WeightInfo::set_collection_sponsor()]
-        pub fn set_collection_sponsor(origin, collection_id: u64, new_sponsor: T::AccountId) -> DispatchResult {
+        pub fn set_collection_sponsor(origin, collection_id: CollectionId, new_sponsor: T::AccountId) -> DispatchResult {
 
             let sender = ensure_signed(origin)?;
             ensure!(<Collection<T>>::contains_key(collection_id), Error::<T>::CollectionNotFound);
@@ -825,7 +828,7 @@
         /// 
         /// * collection_id.
         #[weight = T::WeightInfo::confirm_sponsorship()]
-        pub fn confirm_sponsorship(origin, collection_id: u64) -> DispatchResult {
+        pub fn confirm_sponsorship(origin, collection_id: CollectionId) -> DispatchResult {
 
             let sender = ensure_signed(origin)?;
             ensure!(<Collection<T>>::contains_key(collection_id), Error::<T>::CollectionNotFound);
@@ -850,7 +853,7 @@
         /// 
         /// * collection_id.
         #[weight = T::WeightInfo::remove_collection_sponsor()]
-        pub fn remove_collection_sponsor(origin, collection_id: u64) -> DispatchResult {
+        pub fn remove_collection_sponsor(origin, collection_id: CollectionId) -> DispatchResult {
 
             let sender = ensure_signed(origin)?;
             ensure!(<Collection<T>>::contains_key(collection_id), Error::<T>::CollectionNotFound);
@@ -889,7 +892,7 @@
         // .saturating_add(RocksDbWeight::get().writes(8 as Weight))]
 
         #[weight = T::WeightInfo::create_item(data.len())]
-        pub fn create_item(origin, collection_id: u64, owner: T::AccountId, data: CreateItemData) -> DispatchResult {
+        pub fn create_item(origin, collection_id: CollectionId, owner: T::AccountId, data: CreateItemData) -> DispatchResult {
 
             let sender = ensure_signed(origin)?;
 
@@ -925,7 +928,7 @@
         #[weight = T::WeightInfo::create_item(items_data.into_iter()
                                .map(|data| { data.len() })
                                .sum())]
-        pub fn create_multiple_items(origin, collection_id: u64, owner: T::AccountId, items_data: Vec<CreateItemData>) -> DispatchResult {
+        pub fn create_multiple_items(origin, collection_id: CollectionId, owner: T::AccountId, items_data: Vec<CreateItemData>) -> DispatchResult {
 
             ensure!(items_data.len() > 0, Error::<T>::EmptyArgument);
             let sender = ensure_signed(origin)?;
@@ -959,7 +962,7 @@
         /// 
         /// * item_id: ID of NFT to burn.
         #[weight = T::WeightInfo::burn_item()]
-        pub fn burn_item(origin, collection_id: u64, item_id: u64) -> DispatchResult {
+        pub fn burn_item(origin, collection_id: CollectionId, item_id: TokenId) -> DispatchResult {
 
             let sender = ensure_signed(origin)?;
             Self::collection_exists(collection_id)?;
@@ -1012,7 +1015,7 @@
         ///     * Fungible Mode: Must specify transferred amount
         ///     * Re-Fungible Mode: Must specify transferred portion (between 0 and 1)
         #[weight = T::WeightInfo::transfer()]
-        pub fn transfer(origin, recipient: T::AccountId, collection_id: u64, item_id: u64, value: u64) -> DispatchResult {
+        pub fn transfer(origin, recipient: T::AccountId, collection_id: CollectionId, item_id: TokenId, value: u64) -> DispatchResult {
 
             let sender = ensure_signed(origin)?;
 
@@ -1054,7 +1057,7 @@
         /// 
         /// * item_id: ID of the item.
         #[weight = T::WeightInfo::approve()]
-        pub fn approve(origin, approved: T::AccountId, collection_id: u64, item_id: u64) -> DispatchResult {
+        pub fn approve(origin, approved: T::AccountId, collection_id: CollectionId, item_id: TokenId) -> DispatchResult {
 
             let sender = ensure_signed(origin)?;
 
@@ -1112,7 +1115,7 @@
         /// 
         /// * value: Amount to transfer.
         #[weight = T::WeightInfo::transfer_from()]
-        pub fn transfer_from(origin, from: T::AccountId, recipient: T::AccountId, collection_id: u64, item_id: u64, value: u64 ) -> DispatchResult {
+        pub fn transfer_from(origin, from: T::AccountId, recipient: T::AccountId, collection_id: CollectionId, item_id: TokenId, value: u64 ) -> DispatchResult {
 
             let sender = ensure_signed(origin)?;
             let mut appoved_transfer = false;
@@ -1157,7 +1160,7 @@
 
         ///
         #[weight = 0]
-        pub fn safe_transfer_from(origin, collection_id: u64, item_id: u64, new_owner: T::AccountId) -> DispatchResult {
+        pub fn safe_transfer_from(origin, collection_id: CollectionId, item_id: TokenId, new_owner: T::AccountId) -> DispatchResult {
 
             // let no_perm_mes = "You do not have permissions to modify this collection";
             // ensure!(<ApprovedList<T>>::contains_key((collection_id, item_id)), no_perm_mes);
@@ -1186,8 +1189,8 @@
         #[weight = T::WeightInfo::set_variable_meta_data()]
         pub fn set_variable_meta_data (
             origin,
-            collection_id: u64,
-            item_id: u64,
+            collection_id: CollectionId,
+            item_id: TokenId,
             data: Vec<u8>
         ) -> DispatchResult {
             let sender = ensure_signed(origin)?;
@@ -1231,7 +1234,7 @@
         #[weight = T::WeightInfo::set_offchain_schema()]
         pub fn set_offchain_schema(
             origin,
-            collection_id: u64,
+            collection_id: CollectionId,
             schema: Vec<u8>
         ) -> DispatchResult {
             let sender = ensure_signed(origin)?;
@@ -1259,7 +1262,7 @@
         #[weight = T::WeightInfo::set_const_on_chain_schema()]
         pub fn set_const_on_chain_schema (
             origin,
-            collection_id: u64,
+            collection_id: CollectionId,
             schema: Vec<u8>
         ) -> DispatchResult {
             let sender = ensure_signed(origin)?;
@@ -1287,7 +1290,7 @@
         #[weight = T::WeightInfo::set_const_on_chain_schema()]
         pub fn set_variable_on_chain_schema (
             origin,
-            collection_id: u64,
+            collection_id: CollectionId,
             schema: Vec<u8>
         ) -> DispatchResult {
             let sender = ensure_signed(origin)?;
@@ -1396,7 +1399,7 @@
 
 impl<T: Trait> Module<T> {
 
-    fn can_create_items_in_collection(collection_id: u64, collection: &CollectionType<T::AccountId>, sender: &T::AccountId, owner: &T::AccountId) -> DispatchResult {
+    fn can_create_items_in_collection(collection_id: CollectionId, collection: &CollectionType<T::AccountId>, sender: &T::AccountId, owner: &T::AccountId) -> DispatchResult {
 
         if !Self::is_owner_or_admin_permissions(collection_id, sender.clone()) {
             ensure!(collection.mint_mode == true, Error::<T>::PublicMintingNotAllowed);
@@ -1441,7 +1444,7 @@
         Ok(())
     }
 
-    fn create_item_no_validation(collection_id: u64, collection: &CollectionType<T::AccountId>, owner: T::AccountId, data: CreateItemData) -> DispatchResult {
+    fn create_item_no_validation(collection_id: CollectionId, collection: &CollectionType<T::AccountId>, owner: T::AccountId, data: CreateItemData) -> DispatchResult {
         match data
         {
             CreateItemData::NFT(data) => {
@@ -1565,8 +1568,8 @@
     }
 
     fn burn_refungible_item(
-        collection_id: u64,
-        item_id: u64,
+        collection_id: CollectionId,
+        item_id: TokenId,
         owner: T::AccountId,
     ) -> DispatchResult {
         ensure!(
@@ -1596,7 +1599,7 @@
         Ok(())
     }
 
-    fn burn_nft_item(collection_id: u64, item_id: u64) -> DispatchResult {
+    fn burn_nft_item(collection_id: CollectionId, item_id: TokenId) -> DispatchResult {
         ensure!(
             <NftItemList<T>>::contains_key(collection_id, item_id),
             Error::<T>::TokenNotFound
@@ -1617,7 +1620,7 @@
         Ok(())
     }
 
-    fn burn_fungible_item(collection_id: u64, item_id: u64) -> DispatchResult {
+    fn burn_fungible_item(collection_id: CollectionId, item_id: TokenId) -> DispatchResult {
         ensure!(
             <FungibleItemList<T>>::contains_key(collection_id, item_id),
             Error::<T>::TokenNotFound
@@ -1639,7 +1642,7 @@
         Ok(())
     }
 
-    fn collection_exists(collection_id: u64) -> DispatchResult {
+    fn collection_exists(collection_id: CollectionId) -> DispatchResult {
         ensure!(
             <Collection<T>>::contains_key(collection_id),
             Error::<T>::CollectionNotFound
@@ -1647,7 +1650,7 @@
         Ok(())
     }
 
-    fn check_owner_permissions(collection_id: u64, subject: T::AccountId) -> DispatchResult {
+    fn check_owner_permissions(collection_id: CollectionId, subject: T::AccountId) -> DispatchResult {
         Self::collection_exists(collection_id)?;
 
         let target_collection = <Collection<T>>::get(collection_id);
@@ -1659,7 +1662,7 @@
         Ok(())
     }
 
-    fn is_owner_or_admin_permissions(collection_id: u64, subject: T::AccountId) -> bool {
+    fn is_owner_or_admin_permissions(collection_id: CollectionId, subject: T::AccountId) -> bool {
         let target_collection = <Collection<T>>::get(collection_id);
         let mut result: bool = subject == target_collection.owner;
         let exists = <AdminList<T>>::contains_key(collection_id);
@@ -1674,7 +1677,7 @@
     }
 
     fn check_owner_or_admin_permissions(
-        collection_id: u64,
+        collection_id: CollectionId,
         subject: T::AccountId,
     ) -> DispatchResult {
         Self::collection_exists(collection_id)?;
@@ -1687,7 +1690,7 @@
         Ok(())
     }
 
-    fn is_item_owner(subject: T::AccountId, collection_id: u64, item_id: u64) -> bool {
+    fn is_item_owner(subject: T::AccountId, collection_id: CollectionId, item_id: TokenId) -> bool {
         let target_collection = <Collection<T>>::get(collection_id);
 
         match target_collection.mode {
@@ -1707,7 +1710,7 @@
         }
     }
 
-    fn check_white_list(collection_id: u64, address: &T::AccountId) -> DispatchResult {
+    fn check_white_list(collection_id: CollectionId, address: &T::AccountId) -> DispatchResult {
         let mes = Error::<T>::AddresNotInWhiteList;
         ensure!(<WhiteList<T>>::contains_key(collection_id), mes);
         let wl = <WhiteList<T>>::get(collection_id);
@@ -1717,8 +1720,8 @@
     }
 
     fn transfer_fungible(
-        collection_id: u64,
-        item_id: u64,
+        collection_id: CollectionId,
+        item_id: TokenId,
         value: u64,
         owner: T::AccountId,
         new_owner: T::AccountId,
@@ -1806,8 +1809,8 @@
     }
 
     fn transfer_refungible(
-        collection_id: u64,
-        item_id: u64,
+        collection_id: CollectionId,
+        item_id: TokenId,
         value: u64,
         owner: T::AccountId,
         new_owner: T::AccountId,
@@ -1892,8 +1895,8 @@
     }
 
     fn transfer_nft(
-        collection_id: u64,
-        item_id: u64,
+        collection_id: CollectionId,
+        item_id: TokenId,
         sender: T::AccountId,
         new_owner: T::AccountId,
     ) -> DispatchResult {
@@ -1934,8 +1937,8 @@
     }
     
     fn item_exists(
-        collection_id: u64,
-        item_id: u64,
+        collection_id: CollectionId,
+        item_id: TokenId,
         mode: &CollectionMode
     ) -> DispatchResult {
         match mode {
@@ -1949,8 +1952,8 @@
     }
 
     fn set_re_fungible_variable_data(
-        collection_id: u64,
-        item_id: u64,
+        collection_id: CollectionId,
+        item_id: TokenId,
         data: Vec<u8>
     ) -> DispatchResult {
         let mut item = <ReFungibleItemList<T>>::get(collection_id, item_id);
@@ -1963,8 +1966,8 @@
     }
 
     fn set_nft_variable_data(
-        collection_id: u64,
-        item_id: u64,
+        collection_id: CollectionId,
+        item_id: TokenId,
         data: Vec<u8>
     ) -> DispatchResult {
         let mut item = <NftItemList<T>>::get(collection_id, item_id);
@@ -2058,7 +2061,7 @@
         <Balance<T>>::insert(item.collection, owner.clone(), new_balance);
     }
 
-    fn add_token_index(collection_id: u64, item_index: u64, owner: T::AccountId) -> DispatchResult {
+    fn add_token_index(collection_id: CollectionId, item_index: TokenId, owner: T::AccountId) -> DispatchResult {
 
         // add to account limit
         if <AccountItemCount<T>>::contains_key(owner.clone()) {
@@ -2096,8 +2099,8 @@
     }
 
     fn remove_token_index(
-        collection_id: u64,
-        item_index: u64,
+        collection_id: CollectionId,
+        item_index: TokenId,
         owner: T::AccountId,
     ) -> DispatchResult {
 
@@ -2123,8 +2126,8 @@
     }
 
     fn move_token_index(
-        collection_id: u64,
-        item_index: u64,
+        collection_id: CollectionId,
+        item_index: TokenId,
         old_owner: T::AccountId,
         new_owner: T::AccountId,
     ) -> DispatchResult {
modifiedpallets/nft/src/tests.rsdiffbeforeafterboth
before · pallets/nft/src/tests.rs
1// Tests to be written here2use super::*;3use crate::mock::*;4use crate::{AccessMode, ApprovePermissions, CollectionMode,5     Ownership, ChainLimits, CreateItemData, CreateNftData, CreateFungibleData, CreateReFungibleData}; //Err6use frame_support::{assert_noop, assert_ok};7use frame_system::{ RawOrigin };89fn default_collection_numbers_limit() -> u64 {10    1011}1213fn default_limits() {14    assert_ok!(TemplateModule::set_chain_limits(RawOrigin::Root.into(), ChainLimits { 15            collection_numbers_limit: default_collection_numbers_limit(),16            account_token_ownership_limit: 10,17            collections_admins_limit: 5,18            custom_data_limit: 2048,19            nft_sponsor_transfer_timeout: 15,20            fungible_sponsor_transfer_timeout: 15,21            refungible_sponsor_transfer_timeout: 15,          22        }));23}2425fn default_nft_data() -> CreateNftData {26    CreateNftData { const_data: vec![1, 2, 3], variable_data: vec![3, 2, 1] }27}2829fn default_fungible_data () -> CreateFungibleData {30    CreateFungibleData { }31}3233fn default_re_fungible_data () -> CreateReFungibleData {34    CreateReFungibleData { const_data: vec![1, 2, 3], variable_data: vec![3, 2, 1] }35}3637fn create_test_collection_for_owner(mode: &CollectionMode, owner: u64, id: u64) -> u64 {38    let col_name1: Vec<u16> = "Test1\0".encode_utf16().collect::<Vec<u16>>();39    let col_desc1: Vec<u16> = "TestDescription1\0".encode_utf16().collect::<Vec<u16>>();40    let token_prefix1: Vec<u8> = b"token_prefix1\0".to_vec();4142    let origin1 = Origin::signed(owner);43    assert_ok!(TemplateModule::create_collection(44            origin1.clone(),45            col_name1.clone(),46            col_desc1.clone(),47            token_prefix1.clone(),48            mode.clone()49        ));5051    let saved_col_name: Vec<u16> = "Test1\0\0".encode_utf16().collect::<Vec<u16>>();52    let saved_description: Vec<u16> = "TestDescription1\0\0".encode_utf16().collect::<Vec<u16>>();53    let saved_prefix: Vec<u8> = b"token_prefix1\0\0".to_vec();54    assert_eq!(TemplateModule::collection(id).owner, owner);55    assert_eq!(TemplateModule::collection(id).name, saved_col_name);56    assert_eq!(TemplateModule::collection(id).mode, *mode);57    assert_eq!(TemplateModule::collection(id).description, saved_description);58    assert_eq!(TemplateModule::collection(id).token_prefix, saved_prefix);59    id60}6162fn create_test_collection(mode: &CollectionMode, id: u64) -> u64 {63    create_test_collection_for_owner(&mode, 1, id)64}6566fn create_test_item(collection_id: u64, data: &CreateItemData) {67    let origin1 = Origin::signed(1);68    assert_ok!(TemplateModule::create_item(69            origin1.clone(),70            collection_id,71            1,72            data.clone()73        ));7475}7677// Use cases tests region78// #region79#[test]80fn create_nft_item() {81    new_test_ext().execute_with(|| {82        default_limits();83        let collection_id = create_test_collection(&CollectionMode::NFT, 1);84        85        let data = default_nft_data();86        create_test_item(collection_id, &data.clone().into());87        assert_eq!(TemplateModule::nft_item_id(collection_id, 1).const_data, data.const_data);88        assert_eq!(TemplateModule::nft_item_id(collection_id, 1).variable_data, data.variable_data);89    });90}9192// Use cases tests region93// #region94#[test]95fn create_nft_multiple_items() {96    new_test_ext().execute_with(|| {97        default_limits();98        99        create_test_collection(&CollectionMode::NFT, 1);100101        let origin1 = Origin::signed(1);102103        let items_data = vec![default_nft_data(), default_nft_data(), default_nft_data()];104105        assert_ok!(TemplateModule::create_multiple_items(106            origin1.clone(),107            1,108            1,109            items_data.clone().into_iter().map(|d| { d.into() }).collect()110        ));111        for (index, data) in items_data.iter().enumerate() {112            assert_eq!(TemplateModule::nft_item_id(1, (index + 1) as u64).const_data.to_vec(), data.const_data);113            assert_eq!(TemplateModule::nft_item_id(1, (index + 1) as u64).variable_data.to_vec(), data.variable_data);114        }115    });116}117118#[test]119fn create_refungible_item() {120    new_test_ext().execute_with(|| {121        default_limits();122        let collection_id = create_test_collection(&CollectionMode::ReFungible(3), 1);123124        let data = default_re_fungible_data();125        create_test_item(collection_id, &data.clone().into());126        assert_eq!(127            TemplateModule::refungible_item_id(collection_id, 1).const_data,128            data.const_data129        );130        assert_eq!(131            TemplateModule::refungible_item_id(collection_id, 1).variable_data,132            data.variable_data133        );134        assert_eq!(135            TemplateModule::refungible_item_id(collection_id, 1).owner[0],136            Ownership {137                owner: 1,138                fraction: 1000139            }140        );141    });142}143144#[test]145fn create_multiple_refungible_items() {146    new_test_ext().execute_with(|| {147        default_limits();148        149        create_test_collection(&CollectionMode::ReFungible(3), 1);150151        let origin1 = Origin::signed(1);152153        let items_data = vec![default_re_fungible_data(), default_re_fungible_data(), default_re_fungible_data()];154155        assert_ok!(TemplateModule::create_multiple_items(156            origin1.clone(),157            1,158            1,159            items_data.clone().into_iter().map(|d| { d.into() }).collect()160        ));161        for (index, data) in items_data.iter().enumerate() {162163            let item = TemplateModule::refungible_item_id(1, (index + 1) as u64);164            assert_eq!(item.const_data.to_vec(), data.const_data);165            assert_eq!(item.variable_data.to_vec(), data.variable_data);166            assert_eq!(167                item.owner[0],168                Ownership {169                    owner: 1,170                    fraction: 1000171                }172            );173        }174    });175}176177#[test]178fn create_fungible_item() {179    new_test_ext().execute_with(|| {180        default_limits();181        182        let collection_id = create_test_collection(&CollectionMode::Fungible(3), 1);183184        let data = default_fungible_data();185        create_test_item(collection_id, &data.into());186187        assert_eq!(TemplateModule::fungible_item_id(collection_id, 1).owner, 1);188    });189}190191#[test]192fn create_multiple_fungible_items() {193    new_test_ext().execute_with(|| {194        default_limits();195196        create_test_collection(&CollectionMode::Fungible(3), 1);197198        let origin1 = Origin::signed(1);199200        let items_data = vec![default_fungible_data(), default_fungible_data(), default_fungible_data()];201202        assert_ok!(TemplateModule::create_multiple_items(203            origin1.clone(),204            1,205            1,206            items_data.clone().into_iter().map(|d| { d.into() }).collect()207        ));208        209        for (index, _) in items_data.iter().enumerate() {210            assert_eq!(TemplateModule::fungible_item_id(1, (index + 1) as u64).owner, 1);211        }212        assert_eq!(TemplateModule::balance_count(1, 1), 3000);213        assert_eq!(TemplateModule::address_tokens(1, 1), [1, 2, 3]);214    });215}216217#[test]218fn transfer_fungible_item() {219    new_test_ext().execute_with(|| {220        default_limits();221        222        let collection_id = create_test_collection(&CollectionMode::Fungible(3), 1);223224        let origin1 = Origin::signed(1);225        let origin2 = Origin::signed(2);226227        let data = default_fungible_data();228        create_test_item(collection_id, &data.into());229230        assert_eq!(TemplateModule::fungible_item_id(1, 1).owner, 1);231        assert_eq!(TemplateModule::balance_count(1, 1), 1000);232        assert_eq!(TemplateModule::address_tokens(1, 1), [1]);233234        // change owner scenario235        assert_ok!(TemplateModule::transfer(origin1.clone(), 2, 1, 1, 1000));236        assert_eq!(TemplateModule::fungible_item_id(1, 1).owner, 2);237        assert_eq!(TemplateModule::fungible_item_id(1, 1).value, 1000);238        assert_eq!(TemplateModule::balance_count(1, 1), 0);239        assert_eq!(TemplateModule::balance_count(1, 2), 1000);240        // assert_eq!(TemplateModule::address_tokens(1, 1), []);241        assert_eq!(TemplateModule::address_tokens(1, 2), [1]);242243        // split item scenario244        assert_ok!(TemplateModule::transfer(origin2.clone(), 3, 1, 1, 500));245        assert_eq!(TemplateModule::fungible_item_id(1, 1).owner, 2);246        assert_eq!(TemplateModule::fungible_item_id(1, 2).owner, 3);247        assert_eq!(TemplateModule::balance_count(1, 2), 500);248        assert_eq!(TemplateModule::balance_count(1, 3), 500);249        assert_eq!(TemplateModule::address_tokens(1, 2), [1]);250        assert_eq!(TemplateModule::address_tokens(1, 3), [2]);251252        // split item and new owner has account scenario253        assert_ok!(TemplateModule::transfer(origin2.clone(), 3, 1, 1, 200));254        assert_eq!(TemplateModule::fungible_item_id(1, 1).value, 300);255        assert_eq!(TemplateModule::fungible_item_id(1, 2).value, 700);256        assert_eq!(TemplateModule::balance_count(1, 2), 300);257        assert_eq!(TemplateModule::balance_count(1, 3), 700);258        assert_eq!(TemplateModule::address_tokens(1, 2), [1]);259        assert_eq!(TemplateModule::address_tokens(1, 3), [2]);260    });261}262263#[test]264fn transfer_refungible_item() {265    new_test_ext().execute_with(|| {266        default_limits();267        268        let collection_id = create_test_collection(&CollectionMode::ReFungible(3), 1);269270        let data = default_re_fungible_data();271        create_test_item(collection_id, &data.clone().into());272273        let origin1 = Origin::signed(1);274        let origin2 = Origin::signed(2);275        assert_eq!(276            TemplateModule::refungible_item_id(collection_id, 1).const_data,277            data.const_data278        );279        assert_eq!(280            TemplateModule::refungible_item_id(collection_id, 1).variable_data,281            data.variable_data282        );283        assert_eq!(284            TemplateModule::refungible_item_id(collection_id, 1).owner[0],285            Ownership {286                owner: 1,287                fraction: 1000288            }289        );290        assert_eq!(TemplateModule::balance_count(1, 1), 1000);291        assert_eq!(TemplateModule::address_tokens(1, 1), [1]);292293        // change owner scenario294        assert_ok!(TemplateModule::transfer(origin1.clone(), 2, 1, 1, 1000));295        assert_eq!(296            TemplateModule::refungible_item_id(1, 1).owner[0],297            Ownership {298                owner: 2,299                fraction: 1000300            }301        );302        assert_eq!(TemplateModule::balance_count(1, 1), 0);303        assert_eq!(TemplateModule::balance_count(1, 2), 1000);304        // assert_eq!(TemplateModule::address_tokens(1, 1), []);305        assert_eq!(TemplateModule::address_tokens(1, 2), [1]);306307        // split item scenario308        assert_ok!(TemplateModule::transfer(origin2.clone(), 3, 1, 1, 500));309        assert_eq!(310            TemplateModule::refungible_item_id(1, 1).owner[0],311            Ownership {312                owner: 2,313                fraction: 500314            }315        );316        assert_eq!(317            TemplateModule::refungible_item_id(1, 1).owner[1],318            Ownership {319                owner: 3,320                fraction: 500321            }322        );323        assert_eq!(TemplateModule::balance_count(1, 2), 500);324        assert_eq!(TemplateModule::balance_count(1, 3), 500);325        assert_eq!(TemplateModule::address_tokens(1, 2), [1]);326        assert_eq!(TemplateModule::address_tokens(1, 3), [1]);327328        // split item and new owner has account scenario329        assert_ok!(TemplateModule::transfer(origin2.clone(), 3, 1, 1, 200));330        assert_eq!(331            TemplateModule::refungible_item_id(1, 1).owner[0],332            Ownership {333                owner: 2,334                fraction: 300335            }336        );337        assert_eq!(338            TemplateModule::refungible_item_id(1, 1).owner[1],339            Ownership {340                owner: 3,341                fraction: 700342            }343        );344        assert_eq!(TemplateModule::balance_count(1, 2), 300);345        assert_eq!(TemplateModule::balance_count(1, 3), 700);346        assert_eq!(TemplateModule::address_tokens(1, 2), [1]);347        assert_eq!(TemplateModule::address_tokens(1, 3), [1]);348    });349}350351#[test]352fn transfer_nft_item() {353    new_test_ext().execute_with(|| {354        default_limits();355        356        let collection_id = create_test_collection(&CollectionMode::NFT, 1);357358        let data = default_nft_data();359        create_test_item(collection_id, &data.into());360        assert_eq!(TemplateModule::balance_count(1, 1), 1);361        assert_eq!(TemplateModule::address_tokens(1, 1), [1]);362363        let origin1 = Origin::signed(1);364        // default scenario365        assert_ok!(TemplateModule::transfer(origin1.clone(), 2, 1, 1, 1000));366        assert_eq!(TemplateModule::nft_item_id(1, 1).owner, 2);367        assert_eq!(TemplateModule::balance_count(1, 1), 0);368        assert_eq!(TemplateModule::balance_count(1, 2), 1);369        // assert_eq!(TemplateModule::address_tokens(1, 1), []);370        assert_eq!(TemplateModule::address_tokens(1, 2), [1]);371    });372}373374#[test]375fn nft_approve_and_transfer_from() {376    new_test_ext().execute_with(|| {377        default_limits();378        379        let collection_id = create_test_collection(&CollectionMode::NFT, 1);380381        let data = default_nft_data();382        create_test_item(collection_id, &data.into());383384        let origin1 = Origin::signed(1);385        let origin2 = Origin::signed(2);386387        assert_eq!(TemplateModule::balance_count(1, 1), 1);388        assert_eq!(TemplateModule::address_tokens(1, 1), [1]);389390        // neg transfer391        assert_noop!(TemplateModule::transfer_from(392            origin2.clone(),393            1,394            2,395            1,396            1,397            1), Error::<Test>::NoPermission);398399        // do approve400        assert_ok!(TemplateModule::approve(origin1.clone(), 2, 1, 1));401        assert_eq!(TemplateModule::approved(1, (1, 1)).len(), 1);402        assert_eq!(403            TemplateModule::approved(1, (1, 1))[0],404            ApprovePermissions {405                approved: 2,406                amount: 100000000407            }408        );409410        assert_ok!(TemplateModule::transfer_from(411            origin2.clone(),412            1,413            2,414            1,415            1,416            1417        ));418        assert_eq!(TemplateModule::approved(1, (1, 1)).len(), 0);419    });420}421422#[test]423fn nft_approve_and_transfer_from_white_list() {424    new_test_ext().execute_with(|| {425        default_limits();426        427        let collection_id = create_test_collection(&CollectionMode::NFT, 1);428429        let origin1 = Origin::signed(1);430        let origin2 = Origin::signed(2);431432        let data = default_nft_data();433        create_test_item(collection_id, &data.clone().into());434435        assert_eq!(TemplateModule::nft_item_id(1, 1).const_data, data.const_data);436        assert_eq!(TemplateModule::balance_count(1, 1), 1);437        assert_eq!(TemplateModule::address_tokens(1, 1), [1]);438439        assert_ok!(TemplateModule::set_mint_permission(440            origin1.clone(),441            1,442            true443        ));444        assert_ok!(TemplateModule::set_public_access_mode(445            origin1.clone(),446            1,447            AccessMode::WhiteList448        ));449        assert_ok!(TemplateModule::add_to_white_list(origin1.clone(), 1, 1));450        assert_ok!(TemplateModule::add_to_white_list(origin1.clone(), 1, 2));451        assert_ok!(TemplateModule::add_to_white_list(origin1.clone(), 1, 3));452453        // do approve454        assert_ok!(TemplateModule::approve(origin1.clone(), 2, 1, 1));455        assert_eq!(TemplateModule::approved(1, (1, 1)).len(), 1);456        assert_ok!(TemplateModule::approve(origin1.clone(), 3, 1, 1));457        assert_eq!(TemplateModule::approved(1, (1, 1)).len(), 2);458        assert_eq!(459            TemplateModule::approved(1, (1, 1))[0],460            ApprovePermissions {461                approved: 2,462                amount: 100000000463            }464        );465466        assert_ok!(TemplateModule::transfer_from(467            origin2.clone(),468            1,469            3,470            1,471            1,472            1473        ));474        assert_eq!(TemplateModule::approved(1, (1, 1)).len(), 0);475    });476}477478#[test]479fn refungible_approve_and_transfer_from() {480    new_test_ext().execute_with(|| {481        default_limits();482        483        let collection_id = create_test_collection(&CollectionMode::ReFungible(3), 1);484        485        let origin1 = Origin::signed(1);486        let origin2 = Origin::signed(2);487488        let data = default_re_fungible_data();489        create_test_item(collection_id, &data.into());490491        assert_eq!(TemplateModule::balance_count(1, 1), 1000);492        assert_eq!(TemplateModule::address_tokens(1, 1), [1]);493494        assert_ok!(TemplateModule::set_mint_permission(495            origin1.clone(),496            1,497            true498        ));499        assert_ok!(TemplateModule::set_public_access_mode(500            origin1.clone(),501            1,502            AccessMode::WhiteList503        ));504        assert_ok!(TemplateModule::add_to_white_list(origin1.clone(), 1, 1));505        assert_ok!(TemplateModule::add_to_white_list(origin1.clone(), 1, 2));506        assert_ok!(TemplateModule::add_to_white_list(origin1.clone(), 1, 3));507508        // do approve509        assert_ok!(TemplateModule::approve(origin1.clone(), 2, 1, 1));510        assert_eq!(TemplateModule::approved(1, (1, 1)).len(), 1);511        assert_ok!(TemplateModule::approve(origin1.clone(), 3, 1, 1));512        assert_eq!(TemplateModule::approved(1, (1, 1)).len(), 2);513        assert_eq!(514            TemplateModule::approved(1, (1, 1))[0],515            ApprovePermissions {516                approved: 2,517                amount: 100000000518            }519        );520521        assert_ok!(TemplateModule::transfer_from(522            origin2.clone(),523            1,524            3,525            1,526            1,527            100528        ));529        assert_eq!(TemplateModule::balance_count(1, 1), 900);530        assert_eq!(TemplateModule::balance_count(1, 3), 100);531        assert_eq!(TemplateModule::address_tokens(1, 1), [1]);532        assert_eq!(TemplateModule::address_tokens(1, 3), [1]);533534        assert_eq!(TemplateModule::approved(1, (1, 1)).len(), 1);535        assert_eq!(536            TemplateModule::approved(1, (1, 1))[0],537            ApprovePermissions {538                approved: 3,539                amount: 100000000540            }541        );542    });543}544545#[test]546fn fungible_approve_and_transfer_from() {547    new_test_ext().execute_with(|| {548        default_limits();549        550        let collection_id = create_test_collection(&CollectionMode::Fungible(3), 1);551        552        let data = default_fungible_data();553        create_test_item(collection_id, &data.into());554555        let origin1 = Origin::signed(1);556        let origin2 = Origin::signed(2);557558        assert_eq!(TemplateModule::balance_count(1, 1), 1000);559        assert_eq!(TemplateModule::address_tokens(1, 1), [1]);560561        assert_ok!(TemplateModule::set_mint_permission(562            origin1.clone(),563            1,564            true565        ));566        assert_ok!(TemplateModule::set_public_access_mode(567            origin1.clone(),568            1,569            AccessMode::WhiteList570        ));571        assert_ok!(TemplateModule::add_to_white_list(origin1.clone(), 1, 1));572        assert_ok!(TemplateModule::add_to_white_list(origin1.clone(), 1, 2));573        assert_ok!(TemplateModule::add_to_white_list(origin1.clone(), 1, 3));574575        // do approve576        assert_ok!(TemplateModule::approve(origin1.clone(), 2, 1, 1));577        assert_eq!(TemplateModule::approved(1, (1, 1)).len(), 1);578        assert_ok!(TemplateModule::approve(origin1.clone(), 3, 1, 1));579        assert_eq!(TemplateModule::approved(1, (1, 1)).len(), 2);580        assert_eq!(581            TemplateModule::approved(1, (1, 1))[0],582            ApprovePermissions {583                approved: 2,584                amount: 100000000585            }586        );587588        assert_ok!(TemplateModule::transfer_from(589            origin2.clone(),590            1,591            3,592            1,593            1,594            100595        ));596        assert_eq!(TemplateModule::balance_count(1, 1), 900);597        assert_eq!(TemplateModule::balance_count(1, 3), 100);598        assert_eq!(TemplateModule::address_tokens(1, 1), [1]);599        assert_eq!(TemplateModule::address_tokens(1, 3), [2]);600601        assert_eq!(TemplateModule::approved(1, (1, 1)).len(), 1);602        assert_eq!(603            TemplateModule::approved(1, (1, 1))[0],604            ApprovePermissions {605                approved: 3,606                amount: 100000000607            }608        );609610        assert_ok!(TemplateModule::approve(origin1.clone(), 2, 1, 1));611        assert_ok!(TemplateModule::transfer_from(612            origin2.clone(),613            1,614            3,615            1,616            1,617            900618        ));619        assert_eq!(TemplateModule::balance_count(1, 1), 0);620        assert_eq!(TemplateModule::balance_count(1, 3), 1000);621        // assert_eq!(TemplateModule::address_tokens(1, 1), []);622        assert_eq!(TemplateModule::address_tokens(1, 3), [2]);623624        assert_eq!(TemplateModule::approved(1, (1, 1)).len(), 0);625    });626}627628#[test]629fn change_collection_owner() {630    new_test_ext().execute_with(|| {631        default_limits();632        633        let collection_id = create_test_collection(&CollectionMode::NFT, 1);634        635        let origin1 = Origin::signed(1);636        assert_ok!(TemplateModule::change_collection_owner(637            origin1.clone(),638            collection_id,639            2640        ));641        assert_eq!(TemplateModule::collection(collection_id).owner, 2);642    });643}644645#[test]646fn destroy_collection() {647    new_test_ext().execute_with(|| {648        default_limits();649        650        let collection_id = create_test_collection(&CollectionMode::NFT, 1);651        652        let origin1 = Origin::signed(1);653        assert_ok!(TemplateModule::destroy_collection(origin1.clone(), collection_id));654    });655}656657#[test]658fn burn_nft_item() {659    new_test_ext().execute_with(|| {660        default_limits();661        662        let collection_id = create_test_collection(&CollectionMode::NFT, 1);663664        let origin1 = Origin::signed(1);665        assert_ok!(TemplateModule::add_collection_admin(origin1.clone(), collection_id, 2));666        667        let data = default_nft_data();668        create_test_item(collection_id, &data.into());669670        // check balance (collection with id = 1, user id = 1)671        assert_eq!(TemplateModule::balance_count(1, 1), 1);672673        // burn item674        assert_ok!(TemplateModule::burn_item(origin1.clone(), 1, 1));675        assert_noop!(676            TemplateModule::burn_item(origin1.clone(), 1, 1),677            Error::<Test>::TokenNotFound678        );679680        assert_eq!(TemplateModule::balance_count(1, 1), 0);681    });682}683684#[test]685fn burn_fungible_item() {686    new_test_ext().execute_with(|| {687        default_limits();688        689        let collection_id = create_test_collection(&CollectionMode::Fungible(3), 1);690        691        let origin1 = Origin::signed(1);692        assert_ok!(TemplateModule::add_collection_admin(origin1.clone(), collection_id, 2));693        694        let data = default_fungible_data();695        create_test_item(collection_id, &data.into());696697        // check balance (collection with id = 1, user id = 1)698        assert_eq!(TemplateModule::balance_count(1, 1), 1000);699700        // burn item701        assert_ok!(TemplateModule::burn_item(origin1.clone(), 1, 1));702        assert_noop!(703            TemplateModule::burn_item(origin1.clone(), 1, 1),704            Error::<Test>::TokenNotFound705        );706707        assert_eq!(TemplateModule::balance_count(1, 1), 0);708    });709}710711#[test]712fn burn_refungible_item() {713    new_test_ext().execute_with(|| {714        default_limits();715        716        let collection_id = create_test_collection(&CollectionMode::ReFungible(3), 1);717        let origin1 = Origin::signed(1);718719        assert_ok!(TemplateModule::set_mint_permission(720            origin1.clone(),721            collection_id,722            true723        ));724        assert_ok!(TemplateModule::set_public_access_mode(725            origin1.clone(),726            collection_id,727            AccessMode::WhiteList728        ));729        assert_ok!(TemplateModule::add_to_white_list(origin1.clone(), 1, 1));730731        assert_ok!(TemplateModule::add_collection_admin(origin1.clone(), 1, 2));732        733        let data = default_re_fungible_data();734        create_test_item(collection_id, &data.into());735736        // check balance (collection with id = 1, user id = 2)737        assert_eq!(TemplateModule::balance_count(1, 1), 1000);738739        // burn item740        assert_ok!(TemplateModule::burn_item(origin1.clone(), 1, 1));741        assert_noop!(742            TemplateModule::burn_item(origin1.clone(), 1, 1),743            Error::<Test>::TokenNotFound744        );745746        assert_eq!(TemplateModule::balance_count(1, 1), 0);747    });748}749750#[test]751fn add_collection_admin() {752    new_test_ext().execute_with(|| {753        default_limits();754        755        let collection1_id = create_test_collection_for_owner(&CollectionMode::NFT, 1, 1);756        create_test_collection_for_owner(&CollectionMode::NFT, 2, 2);757        create_test_collection_for_owner(&CollectionMode::NFT, 3, 3);758        759        let origin1 = Origin::signed(1);760761        // collection admin762        assert_ok!(TemplateModule::add_collection_admin(origin1.clone(), collection1_id, 2));763        assert_ok!(TemplateModule::add_collection_admin(origin1.clone(), collection1_id, 3));764765        assert_eq!(TemplateModule::admin_list_collection(collection1_id).contains(&2), true);766        assert_eq!(TemplateModule::admin_list_collection(collection1_id).contains(&3), true);767    });768}769770#[test]771fn remove_collection_admin() {772    new_test_ext().execute_with(|| {773        default_limits();774        775        let collection1_id = create_test_collection_for_owner(&CollectionMode::NFT, 1, 1);776        create_test_collection_for_owner(&CollectionMode::NFT, 2, 2);777        create_test_collection_for_owner(&CollectionMode::NFT, 3, 3);778779        let origin1 = Origin::signed(1);780        let origin2 = Origin::signed(2);781782        // collection admin783        assert_ok!(TemplateModule::add_collection_admin(origin1.clone(), collection1_id, 2));784        assert_ok!(TemplateModule::add_collection_admin(origin1.clone(), collection1_id, 3));785786        assert_eq!(TemplateModule::admin_list_collection(1).contains(&2), true);787        assert_eq!(TemplateModule::admin_list_collection(1).contains(&3), true);788789        // remove admin790        assert_ok!(TemplateModule::remove_collection_admin(791            origin2.clone(),792            1,793            3794        ));795        assert_eq!(TemplateModule::admin_list_collection(1).contains(&3), false);796    });797}798799#[test]800fn balance_of() {801    new_test_ext().execute_with(|| {802        default_limits();803        804        let nft_collection_id = create_test_collection(&CollectionMode::NFT, 1);805        let fungible_collection_id = create_test_collection(&CollectionMode::Fungible(3), 2);806        let re_fungible_collection_id = create_test_collection(&CollectionMode::ReFungible(3), 3);807        808        // check balance before809        assert_eq!(TemplateModule::balance_count(nft_collection_id, 1), 0);810        assert_eq!(TemplateModule::balance_count(fungible_collection_id, 1), 0);811        assert_eq!(TemplateModule::balance_count(re_fungible_collection_id, 1), 0);812813        let nft_data = default_nft_data();814        create_test_item(nft_collection_id, &nft_data.into());815        816        let fungible_data = default_fungible_data();817        create_test_item(fungible_collection_id, &fungible_data.into());818        819        let re_fungible_data = default_re_fungible_data();820        create_test_item(re_fungible_collection_id, &re_fungible_data.into());821822        // check balance (collection with id = 1, user id = 1)823        assert_eq!(TemplateModule::balance_count(nft_collection_id, 1), 1);824        assert_eq!(TemplateModule::balance_count(fungible_collection_id, 1), 1000);825        assert_eq!(TemplateModule::balance_count(re_fungible_collection_id, 1), 1000);826        assert_eq!(TemplateModule::nft_item_id(nft_collection_id, 1).owner, 1);827        assert_eq!(TemplateModule::fungible_item_id(fungible_collection_id, 1).owner, 1);828        assert_eq!(TemplateModule::refungible_item_id(re_fungible_collection_id, 1).owner[0].owner, 1);829    });830}831832#[test]833fn approve() {834    new_test_ext().execute_with(|| {835        default_limits();836        837        let collection_id = create_test_collection(&CollectionMode::NFT, 1);838        839        let data = default_nft_data();840        create_test_item(collection_id, &data.into());841842        let origin1 = Origin::signed(1);843        844        // approve845        assert_ok!(TemplateModule::approve(origin1.clone(), 2, 1, 1));846        assert_eq!(TemplateModule::approved(1, (1, 1))[0].approved, 2);847    });848}849850#[test]851fn transfer_from() {852    new_test_ext().execute_with(|| {853        default_limits();854        855        let collection_id = create_test_collection(&CollectionMode::NFT, 1);856        let origin1 = Origin::signed(1);857        let origin2 = Origin::signed(2);858859        let data = default_nft_data();860        create_test_item(collection_id, &data.into());861862        // approve863        assert_ok!(TemplateModule::approve(origin1.clone(), 2, 1, 1));864        assert_eq!(TemplateModule::approved(1, (1, 1))[0].approved, 2);865866        assert_ok!(TemplateModule::set_mint_permission(867            origin1.clone(),868            1,869            true870        ));871        assert_ok!(TemplateModule::set_public_access_mode(872            origin1.clone(),873            1,874            AccessMode::WhiteList875        ));876        assert_ok!(TemplateModule::add_to_white_list(origin1.clone(), 1, 1));877        assert_ok!(TemplateModule::add_to_white_list(origin1.clone(), 1, 2));878        assert_ok!(TemplateModule::add_to_white_list(origin1.clone(), 1, 3));879880        assert_ok!(TemplateModule::transfer_from(881            origin2.clone(),882            1,883            2,884            1,885            1,886            1887        ));888889        // after transfer890        assert_eq!(TemplateModule::balance_count(1, 1), 0);891        assert_eq!(TemplateModule::balance_count(1, 2), 1);892    });893}894895// #endregion896897// Coverage tests region898// #region899900#[test]901fn owner_can_add_address_to_white_list() {902    new_test_ext().execute_with(|| {903        default_limits();904        905        let collection_id = create_test_collection(&CollectionMode::NFT, 1);906907        let origin1 = Origin::signed(1);908        assert_ok!(TemplateModule::add_to_white_list(origin1.clone(), collection_id, 2));909        assert_eq!(TemplateModule::white_list(collection_id)[0], 2);910    });911}912913#[test]914fn admin_can_add_address_to_white_list() {915    new_test_ext().execute_with(|| {916        default_limits();917        918        let collection_id = create_test_collection(&CollectionMode::NFT, 1);919        let origin1 = Origin::signed(1);920        let origin2 = Origin::signed(2);921922        assert_ok!(TemplateModule::add_collection_admin(origin1.clone(), collection_id, 2));923        assert_ok!(TemplateModule::add_to_white_list(origin2.clone(), collection_id, 3));924        assert_eq!(TemplateModule::white_list(collection_id)[0], 3);925    });926}927928#[test]929fn nonprivileged_user_cannot_add_address_to_white_list() {930    new_test_ext().execute_with(|| {931        default_limits();932        933        let collection_id = create_test_collection(&CollectionMode::NFT, 1);934935        let origin2 = Origin::signed(2);936        assert_noop!(937            TemplateModule::add_to_white_list(origin2.clone(), collection_id, 3),938            Error::<Test>::NoPermission939        );940    });941}942943#[test]944fn nobody_can_add_address_to_white_list_of_nonexisting_collection() {945    new_test_ext().execute_with(|| {946        default_limits();947948        let origin1 = Origin::signed(1);949950        assert_noop!(951            TemplateModule::add_to_white_list(origin1.clone(), 1, 2),952            Error::<Test>::CollectionNotFound953        );954    });955}956957#[test]958fn nobody_can_add_address_to_white_list_of_deleted_collection() {959    new_test_ext().execute_with(|| {960        default_limits();961        962        let collection_id = create_test_collection(&CollectionMode::NFT, 1);963964        let origin1 = Origin::signed(1);965        assert_ok!(TemplateModule::destroy_collection(origin1.clone(), collection_id));966        assert_noop!(967            TemplateModule::add_to_white_list(origin1.clone(), collection_id, 2),968            Error::<Test>::CollectionNotFound969        );970    });971}972973// If address is already added to white list, nothing happens974#[test]975fn address_is_already_added_to_white_list() {976    new_test_ext().execute_with(|| {977        default_limits();978        979        let collection_id = create_test_collection(&CollectionMode::NFT, 1);980        let origin1 = Origin::signed(1);981        982        assert_ok!(TemplateModule::add_to_white_list(origin1.clone(), collection_id, 2));983        assert_ok!(TemplateModule::add_to_white_list(origin1.clone(), collection_id, 2));984        assert_eq!(TemplateModule::white_list(collection_id)[0], 2);985        assert_eq!(TemplateModule::white_list(collection_id).len(), 1);986    });987}988989#[test]990fn owner_can_remove_address_from_white_list() {991    new_test_ext().execute_with(|| {992        default_limits();993        994        let collection_id = create_test_collection(&CollectionMode::NFT, 1);995996        let origin1 = Origin::signed(1);997        assert_ok!(TemplateModule::add_to_white_list(origin1.clone(), collection_id, 2));998        assert_ok!(TemplateModule::remove_from_white_list(999            origin1.clone(),1000            collection_id,1001            21002        ));1003        assert_eq!(TemplateModule::white_list(collection_id).len(), 0);1004    });1005}10061007#[test]1008fn admin_can_remove_address_from_white_list() {1009    new_test_ext().execute_with(|| {1010        default_limits();1011        1012        let collection_id = create_test_collection(&CollectionMode::NFT, 1);1013        let origin1 = Origin::signed(1);1014        let origin2 = Origin::signed(2);10151016        assert_ok!(TemplateModule::add_collection_admin(origin1.clone(), collection_id, 2));10171018        assert_ok!(TemplateModule::add_to_white_list(origin1.clone(), collection_id, 3));1019        assert_ok!(TemplateModule::remove_from_white_list(1020            origin2.clone(),1021            collection_id,1022            31023        ));1024        assert_eq!(TemplateModule::white_list(collection_id).len(), 0);1025    });1026}10271028#[test]1029fn nonprivileged_user_cannot_remove_address_from_white_list() {1030    new_test_ext().execute_with(|| {1031        default_limits();1032        1033        let collection_id = create_test_collection(&CollectionMode::NFT, 1);1034        let origin1 = Origin::signed(1);1035        let origin2 = Origin::signed(2);10361037        assert_ok!(TemplateModule::add_to_white_list(origin1.clone(), collection_id, 2));1038        assert_noop!(1039            TemplateModule::remove_from_white_list(origin2.clone(), collection_id, 2),1040            Error::<Test>::NoPermission1041        );1042        assert_eq!(TemplateModule::white_list(collection_id)[0], 2);1043    });1044}10451046#[test]1047fn nobody_can_remove_address_from_white_list_of_nonexisting_collection() {1048    new_test_ext().execute_with(|| {1049        default_limits();1050        let origin1 = Origin::signed(1);10511052        assert_noop!(1053            TemplateModule::remove_from_white_list(origin1.clone(), 1, 2),1054            Error::<Test>::CollectionNotFound1055        );1056    });1057}10581059#[test]1060fn nobody_can_remove_address_from_white_list_of_deleted_collection() {1061    new_test_ext().execute_with(|| {1062        default_limits();1063        1064        let collection_id = create_test_collection(&CollectionMode::NFT, 1);1065        let origin1 = Origin::signed(1);1066        let origin2 = Origin::signed(2);10671068        assert_ok!(TemplateModule::add_to_white_list(origin1.clone(), collection_id, 2));1069        assert_ok!(TemplateModule::destroy_collection(origin1.clone(), collection_id));1070        assert_noop!(1071            TemplateModule::remove_from_white_list(origin2.clone(), collection_id, 2),1072            Error::<Test>::CollectionNotFound1073        );1074        assert_eq!(TemplateModule::white_list(collection_id).len(), 0);1075    });1076}10771078// If address is already removed from white list, nothing happens1079#[test]1080fn address_is_already_removed_from_white_list() {1081    new_test_ext().execute_with(|| {1082        default_limits();1083        1084        let collection_id = create_test_collection(&CollectionMode::NFT, 1);1085        let origin1 = Origin::signed(1);10861087        assert_ok!(TemplateModule::add_to_white_list(origin1.clone(), collection_id, 2));1088        assert_ok!(TemplateModule::remove_from_white_list(1089            origin1.clone(),1090            collection_id,1091            21092        ));1093        assert_ok!(TemplateModule::remove_from_white_list(1094            origin1.clone(),1095            collection_id,1096            21097        ));1098        assert_eq!(TemplateModule::white_list(collection_id).len(), 0);1099    });1100}11011102// If Public Access mode is set to WhiteList, tokens can’t be transferred from a non-whitelisted address with transfer or transferFrom (2 tests)1103#[test]1104fn white_list_test_1() {1105    new_test_ext().execute_with(|| {1106        default_limits();1107        1108        let collection_id = create_test_collection(&CollectionMode::NFT, 1);11091110        let origin1 = Origin::signed(1);1111        1112        let data = default_nft_data();1113        create_test_item(collection_id, &data.into());11141115        assert_ok!(TemplateModule::set_public_access_mode(1116            origin1.clone(),1117            collection_id,1118            AccessMode::WhiteList1119        ));1120        assert_ok!(TemplateModule::add_to_white_list(origin1.clone(), collection_id, 2));11211122        assert_noop!(1123            TemplateModule::transfer(origin1.clone(), 3, 1, 1, 1),1124            Error::<Test>::AddresNotInWhiteList1125        );1126    });1127}11281129#[test]1130fn white_list_test_2() {1131    new_test_ext().execute_with(|| {1132        default_limits();1133        1134        let collection_id = create_test_collection(&CollectionMode::NFT, 1);1135        let origin1 = Origin::signed(1);1136        1137        let data = default_nft_data();1138        create_test_item(collection_id, &data.into());11391140        assert_ok!(TemplateModule::set_public_access_mode(1141            origin1.clone(),1142            collection_id,1143            AccessMode::WhiteList1144        ));1145        assert_ok!(TemplateModule::add_to_white_list(origin1.clone(), 1, 1));1146        assert_ok!(TemplateModule::add_to_white_list(origin1.clone(), 1, 2));11471148        // do approve1149        assert_ok!(TemplateModule::approve(origin1.clone(), 1, 1, 1));1150        assert_eq!(TemplateModule::approved(1, (1, 1)).len(), 1);11511152        assert_ok!(TemplateModule::remove_from_white_list(1153            origin1.clone(),1154            1,1155            11156        ));11571158        assert_noop!(1159            TemplateModule::transfer_from(origin1.clone(), 1, 3, 1, 1, 1),1160            Error::<Test>::AddresNotInWhiteList1161        );1162    });1163}11641165// If Public Access mode is set to WhiteList, tokens can’t be transferred to a non-whitelisted address with transfer or transferFrom (2 tests)1166#[test]1167fn white_list_test_3() {1168    new_test_ext().execute_with(|| {1169        default_limits();1170        1171        let collection_id = create_test_collection(&CollectionMode::NFT, 1);11721173        let origin1 = Origin::signed(1);1174        1175        let data = default_nft_data();1176        create_test_item(collection_id, &data.into());11771178        assert_ok!(TemplateModule::set_public_access_mode(1179            origin1.clone(),1180            collection_id,1181            AccessMode::WhiteList1182        ));1183        assert_ok!(TemplateModule::add_to_white_list(origin1.clone(), 1, 1));11841185        assert_noop!(1186            TemplateModule::transfer(origin1.clone(), 3, 1, 1, 1),1187            Error::<Test>::AddresNotInWhiteList1188        );1189    });1190}11911192#[test]1193fn white_list_test_4() {1194    new_test_ext().execute_with(|| {1195        default_limits();1196        1197        let collection_id = create_test_collection(&CollectionMode::NFT, 1);11981199        let origin1 = Origin::signed(1);12001201        let data = default_nft_data();1202        create_test_item(collection_id, &data.into());12031204        assert_ok!(TemplateModule::set_public_access_mode(1205            origin1.clone(),1206            collection_id,1207            AccessMode::WhiteList1208        ));1209        assert_ok!(TemplateModule::add_to_white_list(origin1.clone(), collection_id, 1));1210        assert_ok!(TemplateModule::add_to_white_list(origin1.clone(), collection_id, 2));12111212        // do approve1213        assert_ok!(TemplateModule::approve(origin1.clone(), 1, 1, 1));1214        assert_eq!(TemplateModule::approved(1, (1, 1)).len(), 1);12151216        assert_ok!(TemplateModule::remove_from_white_list(1217            origin1.clone(),1218            collection_id,1219            21220        ));12211222        assert_noop!(1223            TemplateModule::transfer_from(origin1.clone(), 1, 3, 1, 1, 1),1224            Error::<Test>::AddresNotInWhiteList1225        );1226    });1227}12281229// If Public Access mode is set to WhiteList, tokens can’t be destroyed by a non-whitelisted address (even if it owned them before enabling WhiteList mode)1230#[test]1231fn white_list_test_5() {1232    new_test_ext().execute_with(|| {1233        default_limits();1234        1235        let collection_id = create_test_collection(&CollectionMode::NFT, 1);12361237        let origin1 = Origin::signed(1);12381239        let data = default_nft_data();1240        create_test_item(collection_id, &data.into());12411242        assert_ok!(TemplateModule::set_public_access_mode(1243            origin1.clone(),1244            collection_id,1245            AccessMode::WhiteList1246        ));1247        assert_noop!(1248            TemplateModule::burn_item(origin1.clone(), 1, 1),1249            Error::<Test>::AddresNotInWhiteList1250        );1251    });1252}12531254// If Public Access mode is set to WhiteList, oken transfers can’t be Approved by a non-whitelisted address (see Approve method).1255#[test]1256fn white_list_test_6() {1257    new_test_ext().execute_with(|| {1258        default_limits();1259        1260        let collection_id = create_test_collection(&CollectionMode::NFT, 1);12611262        let origin1 = Origin::signed(1);1263        assert_ok!(TemplateModule::set_public_access_mode(1264            origin1.clone(),1265            collection_id,1266            AccessMode::WhiteList1267        ));12681269        // do approve1270        assert_noop!(1271            TemplateModule::approve(origin1.clone(), 1, 1, 1),1272            Error::<Test>::AddresNotInWhiteList1273        );1274    });1275}12761277// If Public Access mode is set to WhiteList, tokens can be transferred from a whitelisted address with transfer or transferFrom (2 tests) and1278//          tokens can be transferred from a whitelisted address with transfer or transferFrom (2 tests)1279#[test]1280fn white_list_test_7() {1281    new_test_ext().execute_with(|| {1282        default_limits();1283        1284        let collection_id = create_test_collection(&CollectionMode::NFT, 1);12851286        let data = default_nft_data();1287        create_test_item(collection_id, &data.into());1288        1289        let origin1 = Origin::signed(1);12901291        assert_ok!(TemplateModule::set_public_access_mode(1292            origin1.clone(),1293            collection_id,1294            AccessMode::WhiteList1295        ));1296        assert_ok!(TemplateModule::add_to_white_list(origin1.clone(), collection_id, 1));1297        assert_ok!(TemplateModule::add_to_white_list(origin1.clone(), collection_id, 2));12981299        assert_ok!(TemplateModule::transfer(origin1.clone(), 2, 1, 1, 1));1300    });1301}13021303#[test]1304fn white_list_test_8() {1305    new_test_ext().execute_with(|| {1306        default_limits();1307        1308        let collection_id = create_test_collection(&CollectionMode::NFT, 1);13091310        let data = default_nft_data();1311        create_test_item(collection_id, &data.into());1312        1313        let origin1 = Origin::signed(1);13141315        assert_ok!(TemplateModule::set_public_access_mode(1316            origin1.clone(),1317            collection_id,1318            AccessMode::WhiteList1319        ));1320        assert_ok!(TemplateModule::add_to_white_list(origin1.clone(), collection_id, 1));1321        assert_ok!(TemplateModule::add_to_white_list(origin1.clone(), collection_id, 2));13221323        // do approve1324        assert_ok!(TemplateModule::approve(origin1.clone(), 1, 1, 1));1325        assert_eq!(TemplateModule::approved(1, (1, 1)).len(), 1);13261327        assert_ok!(TemplateModule::transfer_from(1328            origin1.clone(),1329            1,1330            2,1331            1,1332            1,1333            11334        ));1335    });1336}13371338// If Public Access mode is set to WhiteList, and Mint Permission is set to false, tokens can be created by owner.1339#[test]1340fn white_list_test_9() {1341    new_test_ext().execute_with(|| {1342        default_limits();1343        1344        let collection_id = create_test_collection(&CollectionMode::NFT, 1);1345        let origin1 = Origin::signed(1);13461347        assert_ok!(TemplateModule::set_public_access_mode(1348            origin1.clone(),1349            collection_id,1350            AccessMode::WhiteList1351        ));1352        assert_ok!(TemplateModule::set_mint_permission(1353            origin1.clone(),1354            collection_id,1355            false1356        ));13571358        let data = default_nft_data();1359        create_test_item(collection_id, &data.into());1360    });1361}13621363// If Public Access mode is set to WhiteList, and Mint Permission is set to false, tokens can be created by admin.1364#[test]1365fn white_list_test_10() {1366    new_test_ext().execute_with(|| {1367        default_limits();1368        1369        let collection_id = create_test_collection(&CollectionMode::NFT, 1);13701371        let origin1 = Origin::signed(1);1372        let origin2 = Origin::signed(2);13731374        assert_ok!(TemplateModule::set_public_access_mode(1375            origin1.clone(),1376            collection_id,1377            AccessMode::WhiteList1378        ));1379        assert_ok!(TemplateModule::set_mint_permission(1380            origin1.clone(),1381            collection_id,1382            false1383        ));13841385        assert_ok!(TemplateModule::add_collection_admin(origin1.clone(), collection_id, 2));13861387        assert_ok!(TemplateModule::create_item(1388            origin2.clone(),1389            collection_id,1390            2,1391            default_nft_data().into()1392        ));1393    });1394}13951396// If Public Access mode is set to WhiteList, and Mint Permission is set to false, tokens cannot be created by non-privileged and white listed address.1397#[test]1398fn white_list_test_11() {1399    new_test_ext().execute_with(|| {1400        default_limits();1401        1402        let collection_id = create_test_collection(&CollectionMode::NFT, 1);14031404        let origin1 = Origin::signed(1);1405        let origin2 = Origin::signed(2);14061407        assert_ok!(TemplateModule::set_public_access_mode(1408            origin1.clone(),1409            collection_id,1410            AccessMode::WhiteList1411        ));1412        assert_ok!(TemplateModule::set_mint_permission(1413            origin1.clone(),1414            collection_id,1415            false1416        ));1417        assert_ok!(TemplateModule::add_to_white_list(origin1.clone(), collection_id, 2));14181419        assert_noop!(1420            TemplateModule::create_item(origin2.clone(), 1, 2, default_nft_data().into()),1421            Error::<Test>::PublicMintingNotAllowed1422        );1423    });1424}14251426// If Public Access mode is set to WhiteList, and Mint Permission is set to false, tokens cannot be created by non-privileged and non-white listed address.1427#[test]1428fn white_list_test_12() {1429    new_test_ext().execute_with(|| {1430        default_limits();1431        1432        let collection_id = create_test_collection(&CollectionMode::NFT, 1);14331434        let origin1 = Origin::signed(1);1435        let origin2 = Origin::signed(2);14361437        assert_ok!(TemplateModule::set_public_access_mode(1438            origin1.clone(),1439            collection_id,1440            AccessMode::WhiteList1441        ));1442        assert_ok!(TemplateModule::set_mint_permission(1443            origin1.clone(),1444            collection_id,1445            false1446        ));14471448        assert_noop!(1449            TemplateModule::create_item(origin2.clone(), 1, 2, default_nft_data().into()),1450            Error::<Test>::PublicMintingNotAllowed1451        );1452    });1453}14541455// If Public Access mode is set to WhiteList, and Mint Permission is set to true, tokens can be created by owner.1456#[test]1457fn white_list_test_13() {1458    new_test_ext().execute_with(|| {1459        default_limits();1460        1461        let collection_id = create_test_collection(&CollectionMode::NFT, 1);14621463        let origin1 = Origin::signed(1);14641465        assert_ok!(TemplateModule::set_public_access_mode(1466            origin1.clone(),1467            collection_id,1468            AccessMode::WhiteList1469        ));1470        assert_ok!(TemplateModule::set_mint_permission(1471            origin1.clone(),1472            collection_id,1473            true1474        ));14751476        let data = default_nft_data();1477        create_test_item(collection_id, &data.into());1478    });1479}14801481// If Public Access mode is set to WhiteList, and Mint Permission is set to true, tokens can be created by admin.1482#[test]1483fn white_list_test_14() {1484    new_test_ext().execute_with(|| {1485        default_limits();1486        1487        let collection_id = create_test_collection(&CollectionMode::NFT, 1);14881489        let origin1 = Origin::signed(1);1490        let origin2 = Origin::signed(2);14911492        assert_ok!(TemplateModule::set_public_access_mode(1493            origin1.clone(),1494            collection_id,1495            AccessMode::WhiteList1496        ));1497        assert_ok!(TemplateModule::set_mint_permission(1498            origin1.clone(),1499            collection_id,1500            true1501        ));15021503        assert_ok!(TemplateModule::add_collection_admin(origin1.clone(), collection_id, 2));15041505        assert_ok!(TemplateModule::create_item(1506            origin2.clone(),1507            1,1508            2,1509            default_nft_data().into()1510        ));1511    });1512}15131514// If Public Access mode is set to WhiteList, and Mint Permission is set to true, tokens cannot be created by non-privileged and non-white listed address.1515#[test]1516fn white_list_test_15() {1517    new_test_ext().execute_with(|| {1518        default_limits();1519        1520        let collection_id = create_test_collection(&CollectionMode::NFT, 1);15211522        let origin1 = Origin::signed(1);1523        let origin2 = Origin::signed(2);15241525        assert_ok!(TemplateModule::set_public_access_mode(1526            origin1.clone(),1527            collection_id,1528            AccessMode::WhiteList1529        ));1530        assert_ok!(TemplateModule::set_mint_permission(1531            origin1.clone(),1532            collection_id,1533            true1534        ));15351536        assert_noop!(1537            TemplateModule::create_item(origin2.clone(), 1, 2, default_nft_data().into()),1538            Error::<Test>::AddresNotInWhiteList1539        );1540    });1541}15421543// If Public Access mode is set to WhiteList, and Mint Permission is set to true, tokens can be created by non-privileged and white listed address.1544#[test]1545fn white_list_test_16() {1546    new_test_ext().execute_with(|| {1547        default_limits();1548        1549        let collection_id = create_test_collection(&CollectionMode::NFT, 1);15501551        let origin1 = Origin::signed(1);1552        let origin2 = Origin::signed(2);15531554        assert_ok!(TemplateModule::set_public_access_mode(1555            origin1.clone(),1556            collection_id,1557            AccessMode::WhiteList1558        ));1559        assert_ok!(TemplateModule::set_mint_permission(1560            origin1.clone(),1561            collection_id,1562            true1563        ));1564        assert_ok!(TemplateModule::add_to_white_list(origin1.clone(), collection_id, 2));15651566        assert_ok!(TemplateModule::create_item(1567            origin2.clone(),1568            1,1569            2,1570            default_nft_data().into()1571        ));1572    });1573}15741575// Total number of collections. Positive test1576#[test]1577fn total_number_collections_bound() {1578    new_test_ext().execute_with(|| {1579        default_limits();1580        1581        create_test_collection(&CollectionMode::NFT, 1);1582    });1583}15841585// Total number of collections. Negotive test1586#[test]1587fn total_number_collections_bound_neg() {1588    new_test_ext().execute_with(|| {1589        default_limits();15901591        let origin1 = Origin::signed(1);15921593        for i in 0..default_collection_numbers_limit() {1594            create_test_collection(&CollectionMode::NFT, i + 1);1595        }15961597        let col_name1: Vec<u16> = "Test1\0".encode_utf16().collect::<Vec<u16>>();1598        let col_desc1: Vec<u16> = "TestDescription1\0".encode_utf16().collect::<Vec<u16>>();1599        let token_prefix1: Vec<u8> = b"token_prefix1\0".to_vec();16001601        // 11-th collection in chain. Expects error1602        assert_noop!(TemplateModule::create_collection(1603            origin1.clone(),1604            col_name1.clone(),1605            col_desc1.clone(),1606            token_prefix1.clone(),1607            CollectionMode::NFT1608        ), Error::<Test>::TotalCollectionsLimitExceeded);1609    });1610}16111612// Owned tokens by a single address. Positive test1613#[test]1614fn owned_tokens_bound() {1615    new_test_ext().execute_with(|| {1616        default_limits();1617        1618        let collection_id = create_test_collection(&CollectionMode::NFT, 1);16191620        let data = default_nft_data();1621        create_test_item(collection_id, &data.clone().into());1622        create_test_item(collection_id, &data.into());1623    });1624}16251626// Owned tokens by a single address. Negotive test1627#[test]1628fn owned_tokens_bound_neg() {1629    new_test_ext().execute_with(|| {1630        assert_ok!(TemplateModule::set_chain_limits(RawOrigin::Root.into(), ChainLimits { 1631            collection_numbers_limit: 10,1632            account_token_ownership_limit: 1,1633            collections_admins_limit: 5,1634            custom_data_limit: 2048,1635            nft_sponsor_transfer_timeout: 15,1636            fungible_sponsor_transfer_timeout: 15,1637            refungible_sponsor_transfer_timeout: 15,          1638        }));1639        1640        let collection_id = create_test_collection(&CollectionMode::NFT, 1);16411642        let origin1 = Origin::signed(1);1643        let data = default_nft_data();1644        create_test_item(collection_id, &data.clone().into());16451646        assert_noop!(TemplateModule::create_item(1647            origin1.clone(),1648            1,1649            1,1650            data.into()1651        ),  Error::<Test>::AddressOwnershipLimitExceeded);1652    });1653}16541655// Number of collection admins. Positive test1656#[test]1657fn collection_admins_bound() {1658    new_test_ext().execute_with(|| {1659        assert_ok!(TemplateModule::set_chain_limits(RawOrigin::Root.into(), ChainLimits { 1660            collection_numbers_limit: 10,1661            account_token_ownership_limit: 10,1662            collections_admins_limit: 2,1663            custom_data_limit: 2048,1664            nft_sponsor_transfer_timeout: 15,1665            fungible_sponsor_transfer_timeout: 15,1666            refungible_sponsor_transfer_timeout: 15,          1667        }));1668        1669        let collection_id = create_test_collection(&CollectionMode::NFT, 1);16701671        let origin1 = Origin::signed(1);1672        1673        assert_ok!(TemplateModule::add_collection_admin(origin1.clone(), collection_id, 2));1674        assert_ok!(TemplateModule::add_collection_admin(origin1.clone(), collection_id, 3));1675    });1676}16771678// Number of collection admins. Negotive test1679#[test]1680fn collection_admins_bound_neg() {1681    new_test_ext().execute_with(|| {1682        assert_ok!(TemplateModule::set_chain_limits(RawOrigin::Root.into(), ChainLimits { 1683            collection_numbers_limit: 10,1684            account_token_ownership_limit: 1,1685            collections_admins_limit: 1,1686            custom_data_limit: 2048,1687            nft_sponsor_transfer_timeout: 15,1688            fungible_sponsor_transfer_timeout: 15,1689            refungible_sponsor_transfer_timeout: 15,          1690        }));1691        1692        let collection_id = create_test_collection(&CollectionMode::NFT, 1);16931694        let origin1 = Origin::signed(1);16951696        assert_ok!(TemplateModule::add_collection_admin(origin1.clone(), collection_id, 2));1697        assert_noop!(TemplateModule::add_collection_admin(origin1.clone(), collection_id, 3), Error::<Test>::CollectionAdminsLimitExceeded);1698    });1699}17001701// NFT custom data size. Negative test const_data.1702#[test]1703fn custom_data_size_nft_const_data_bound_neg() {1704    new_test_ext().execute_with(|| {1705        assert_ok!(TemplateModule::set_chain_limits(RawOrigin::Root.into(), ChainLimits { 1706            collection_numbers_limit: 10,1707            account_token_ownership_limit: 10,1708            collections_admins_limit: 5,1709            custom_data_limit: 2,1710            nft_sponsor_transfer_timeout: 15,1711            fungible_sponsor_transfer_timeout: 15,1712            refungible_sponsor_transfer_timeout: 15,          1713        }));1714        1715        let collection_id = create_test_collection(&CollectionMode::NFT, 1);17161717        let origin1 = Origin::signed(1);1718        let too_big_const_data = CreateItemData::NFT(CreateNftData{1719            const_data: vec![1, 2, 3, 4],1720            variable_data: vec![]1721        });17221723        assert_noop!(TemplateModule::create_item(1724            origin1.clone(),1725            collection_id,1726            1,1727            too_big_const_data1728        ), Error::<Test>::TokenConstDataLimitExceeded);1729    });1730}17311732// NFT custom data size. Negative test variable_data.1733#[test]1734fn custom_data_size_nft_variable_data_bound_neg() {1735    new_test_ext().execute_with(|| {1736        assert_ok!(TemplateModule::set_chain_limits(RawOrigin::Root.into(), ChainLimits { 1737            collection_numbers_limit: 10,1738            account_token_ownership_limit: 10,1739            collections_admins_limit: 5,1740            custom_data_limit: 2,1741            nft_sponsor_transfer_timeout: 15,1742            fungible_sponsor_transfer_timeout: 15,1743            refungible_sponsor_transfer_timeout: 15,          1744        }));17451746        let collection_id = create_test_collection(&CollectionMode::NFT, 1);17471748        let origin1 = Origin::signed(1);1749        let too_big_const_data = CreateItemData::NFT(CreateNftData{1750            const_data: vec![],1751            variable_data: vec![1, 2, 3, 4]1752        });17531754        assert_noop!(TemplateModule::create_item(1755            origin1.clone(),1756            collection_id,1757            1,1758            too_big_const_data1759        ), Error::<Test>::TokenVariableDataLimitExceeded);1760    });1761}17621763// Re fungible custom data size. Negative test const_data.1764#[test]1765fn custom_data_size_re_fungible_const_data_bound_neg() {1766    new_test_ext().execute_with(|| {1767        assert_ok!(TemplateModule::set_chain_limits(RawOrigin::Root.into(), ChainLimits { 1768            collection_numbers_limit: 10,1769            account_token_ownership_limit: 10,1770            collections_admins_limit: 5,1771            custom_data_limit: 2,1772            nft_sponsor_transfer_timeout: 15,1773            fungible_sponsor_transfer_timeout: 15,1774            refungible_sponsor_transfer_timeout: 15,          1775        }));17761777        let collection_id = create_test_collection(&CollectionMode::NFT, 1);17781779        let origin1 = Origin::signed(1);1780        let too_big_const_data = CreateItemData::NFT(CreateNftData{1781            const_data: vec![1, 2, 3, 4],1782            variable_data: vec![]1783        });17841785        assert_noop!(TemplateModule::create_item(1786            origin1.clone(),1787            collection_id,1788            1,1789            too_big_const_data1790        ), Error::<Test>::TokenConstDataLimitExceeded);1791    });1792}17931794// Re fungible custom data size. Negative test variable_data.1795#[test]1796fn custom_data_size_re_fungible_variable_data_bound_neg() {1797    new_test_ext().execute_with(|| {1798        assert_ok!(TemplateModule::set_chain_limits(RawOrigin::Root.into(), ChainLimits { 1799            collection_numbers_limit: 10,1800            account_token_ownership_limit: 10,1801            collections_admins_limit: 5,1802            custom_data_limit: 2,1803            nft_sponsor_transfer_timeout: 15,1804            fungible_sponsor_transfer_timeout: 15,1805            refungible_sponsor_transfer_timeout: 15,          1806        }));18071808        let collection_id = create_test_collection(&CollectionMode::NFT, 1);18091810        let origin1 = Origin::signed(1);1811        let too_big_const_data = CreateItemData::NFT(CreateNftData{1812            const_data: vec![],1813            variable_data: vec![1, 2, 3, 4]1814        });18151816        assert_noop!(TemplateModule::create_item(1817            origin1.clone(),1818            collection_id,1819            1,1820            too_big_const_data1821        ), Error::<Test>::TokenVariableDataLimitExceeded);1822    });1823}1824// #endregion18251826#[test]1827fn set_const_on_chain_schema() {1828    new_test_ext().execute_with(|| {1829        default_limits();18301831        let collection_id = create_test_collection(&CollectionMode::NFT, 1);18321833        let origin1 = Origin::signed(1);1834        assert_ok!(TemplateModule::set_const_on_chain_schema(origin1, collection_id, b"test const on chain schema".to_vec()));18351836        assert_eq!(TemplateModule::collection(collection_id).const_on_chain_schema, b"test const on chain schema".to_vec());1837        assert_eq!(TemplateModule::collection(collection_id).variable_on_chain_schema, b"".to_vec());1838    });1839}18401841#[test]1842fn set_variable_on_chain_schema() {1843    new_test_ext().execute_with(|| {1844        default_limits();1845        1846        let collection_id = create_test_collection(&CollectionMode::NFT, 1);18471848        let origin1 = Origin::signed(1);1849        assert_ok!(TemplateModule::set_variable_on_chain_schema(origin1, collection_id, b"test variable on chain schema".to_vec()));18501851        assert_eq!(TemplateModule::collection(collection_id).const_on_chain_schema, b"".to_vec());1852        assert_eq!(TemplateModule::collection(collection_id).variable_on_chain_schema, b"test variable on chain schema".to_vec());1853    });1854}18551856#[test]1857fn set_variable_meta_data_on_nft_token_stores_variable_meta_data() {1858    new_test_ext().execute_with(|| {1859        default_limits();18601861        let collection_id = create_test_collection(&CollectionMode::NFT, 1);18621863        let origin1 = Origin::signed(1);1864        1865        let data = default_nft_data();1866        create_test_item(1, &data.into());1867        1868        let variable_data = b"test set_variable_meta_data method.".to_vec();1869        assert_ok!(TemplateModule::set_variable_meta_data(origin1, collection_id, 1, variable_data.clone()));18701871        assert_eq!(TemplateModule::nft_item_id(collection_id, 1).variable_data, variable_data);1872    });1873}18741875#[test]1876fn set_variable_meta_data_on_re_fungible_token_stores_variable_meta_data() {1877    new_test_ext().execute_with(|| {1878        default_limits();18791880        let collection_id = create_test_collection(&CollectionMode::ReFungible(3), 1);18811882        let origin1 = Origin::signed(1);18831884        let data = default_re_fungible_data();1885        create_test_item(1, &data.into());18861887        let variable_data = b"test set_variable_meta_data method.".to_vec();1888        assert_ok!(TemplateModule::set_variable_meta_data(origin1, collection_id, 1, variable_data.clone()));18891890        assert_eq!(TemplateModule::refungible_item_id(collection_id, 1).variable_data, variable_data);1891    });1892}189318941895#[test]1896fn set_variable_meta_data_on_fungible_token_fails() {1897    new_test_ext().execute_with(|| {1898        default_limits();18991900        let collection_id = create_test_collection(&CollectionMode::Fungible(3), 1);19011902        let origin1 = Origin::signed(1);19031904        let data = default_fungible_data();1905        create_test_item(1, &data.into());19061907        let variable_data = b"test set_variable_meta_data method.".to_vec();1908        assert_noop!(TemplateModule::set_variable_meta_data(origin1, collection_id, 1, variable_data.clone()), Error::<Test>::CantStoreMetadataInFungibleTokens);1909    });1910}19111912#[test]1913fn set_variable_meta_data_on_nft_token_fails_for_big_data() {1914    new_test_ext().execute_with(|| {1915        assert_ok!(TemplateModule::set_chain_limits(RawOrigin::Root.into(), ChainLimits { 1916            collection_numbers_limit: default_collection_numbers_limit(),1917            account_token_ownership_limit: 10,1918            collections_admins_limit: 5,1919            custom_data_limit: 10,1920            nft_sponsor_transfer_timeout: 15,1921            fungible_sponsor_transfer_timeout: 15,1922            refungible_sponsor_transfer_timeout: 15,          1923        }));19241925        let collection_id = create_test_collection(&CollectionMode::NFT, 1);19261927        let origin1 = Origin::signed(1);19281929        let data = default_nft_data();1930        create_test_item(1, &data.into());19311932        let variable_data = b"test set_variable_meta_data method, bigger than limits.".to_vec();1933        assert_noop!(TemplateModule::set_variable_meta_data(origin1, collection_id, 1, variable_data), Error::<Test>::TokenVariableDataLimitExceeded);1934    });1935}19361937#[test]1938fn set_variable_meta_data_on_re_fungible_token_fails_for_big_data() {1939    new_test_ext().execute_with(|| {1940        assert_ok!(TemplateModule::set_chain_limits(RawOrigin::Root.into(), ChainLimits { 1941            collection_numbers_limit: default_collection_numbers_limit(),1942            account_token_ownership_limit: 10,1943            collections_admins_limit: 5,1944            custom_data_limit: 10,1945            nft_sponsor_transfer_timeout: 15,1946            fungible_sponsor_transfer_timeout: 15,1947            refungible_sponsor_transfer_timeout: 15,          1948        }));194919501951        let collection_id = create_test_collection(&CollectionMode::ReFungible(3), 1);19521953        let origin1 = Origin::signed(1);19541955        let data = default_re_fungible_data();1956        create_test_item(1, &data.into());19571958        let variable_data = b"test set_variable_meta_data method, bigger than limits.".to_vec();1959        assert_noop!(TemplateModule::set_variable_meta_data(origin1, collection_id, 1, variable_data), Error::<Test>::TokenVariableDataLimitExceeded);1960    });1961}
after · pallets/nft/src/tests.rs
1// Tests to be written here2use super::*;3use crate::mock::*;4use crate::{AccessMode, ApprovePermissions, CollectionMode,5    Ownership, ChainLimits, CreateItemData, CreateNftData, CreateFungibleData, CreateReFungibleData,6    CollectionId, TokenId}; //Err7use frame_support::{assert_noop, assert_ok};8use frame_system::{ RawOrigin };910fn default_collection_numbers_limit() -> u32 {11    1012}1314fn default_limits() {15    assert_ok!(TemplateModule::set_chain_limits(RawOrigin::Root.into(), ChainLimits { 16            collection_numbers_limit: default_collection_numbers_limit(),17            account_token_ownership_limit: 10,18            collections_admins_limit: 5,19            custom_data_limit: 2048,20            nft_sponsor_transfer_timeout: 15,21            fungible_sponsor_transfer_timeout: 15,22            refungible_sponsor_transfer_timeout: 15,          23        }));24}2526fn default_nft_data() -> CreateNftData {27    CreateNftData { const_data: vec![1, 2, 3], variable_data: vec![3, 2, 1] }28}2930fn default_fungible_data () -> CreateFungibleData {31    CreateFungibleData { }32}3334fn default_re_fungible_data () -> CreateReFungibleData {35    CreateReFungibleData { const_data: vec![1, 2, 3], variable_data: vec![3, 2, 1] }36}3738fn create_test_collection_for_owner(mode: &CollectionMode, owner: u64, id: CollectionId) -> CollectionId {39    let col_name1: Vec<u16> = "Test1\0".encode_utf16().collect::<Vec<u16>>();40    let col_desc1: Vec<u16> = "TestDescription1\0".encode_utf16().collect::<Vec<u16>>();41    let token_prefix1: Vec<u8> = b"token_prefix1\0".to_vec();4243    let origin1 = Origin::signed(owner);44    assert_ok!(TemplateModule::create_collection(45            origin1.clone(),46            col_name1.clone(),47            col_desc1.clone(),48            token_prefix1.clone(),49            mode.clone()50        ));5152    let saved_col_name: Vec<u16> = "Test1\0\0".encode_utf16().collect::<Vec<u16>>();53    let saved_description: Vec<u16> = "TestDescription1\0\0".encode_utf16().collect::<Vec<u16>>();54    let saved_prefix: Vec<u8> = b"token_prefix1\0\0".to_vec();55    assert_eq!(TemplateModule::collection(id).owner, owner);56    assert_eq!(TemplateModule::collection(id).name, saved_col_name);57    assert_eq!(TemplateModule::collection(id).mode, *mode);58    assert_eq!(TemplateModule::collection(id).description, saved_description);59    assert_eq!(TemplateModule::collection(id).token_prefix, saved_prefix);60    id61}6263fn create_test_collection(mode: &CollectionMode, id: CollectionId) -> CollectionId {64    create_test_collection_for_owner(&mode, 1, id)65}6667fn create_test_item(collection_id: CollectionId, data: &CreateItemData) {68    let origin1 = Origin::signed(1);69    assert_ok!(TemplateModule::create_item(70            origin1.clone(),71            collection_id,72            1,73            data.clone()74        ));7576}7778// Use cases tests region79// #region80#[test]81fn create_nft_item() {82    new_test_ext().execute_with(|| {83        default_limits();84        let collection_id = create_test_collection(&CollectionMode::NFT, 1);85        86        let data = default_nft_data();87        create_test_item(collection_id, &data.clone().into());88        assert_eq!(TemplateModule::nft_item_id(collection_id, 1).const_data, data.const_data);89        assert_eq!(TemplateModule::nft_item_id(collection_id, 1).variable_data, data.variable_data);90    });91}9293// Use cases tests region94// #region95#[test]96fn create_nft_multiple_items() {97    new_test_ext().execute_with(|| {98        default_limits();99        100        create_test_collection(&CollectionMode::NFT, 1);101102        let origin1 = Origin::signed(1);103104        let items_data = vec![default_nft_data(), default_nft_data(), default_nft_data()];105106        assert_ok!(TemplateModule::create_multiple_items(107            origin1.clone(),108            1,109            1,110            items_data.clone().into_iter().map(|d| { d.into() }).collect()111        ));112        for (index, data) in items_data.iter().enumerate() {113            assert_eq!(TemplateModule::nft_item_id(1, (index + 1) as TokenId).const_data.to_vec(), data.const_data);114            assert_eq!(TemplateModule::nft_item_id(1, (index + 1) as TokenId).variable_data.to_vec(), data.variable_data);115        }116    });117}118119#[test]120fn create_refungible_item() {121    new_test_ext().execute_with(|| {122        default_limits();123        let collection_id = create_test_collection(&CollectionMode::ReFungible(3), 1);124125        let data = default_re_fungible_data();126        create_test_item(collection_id, &data.clone().into());127        assert_eq!(128            TemplateModule::refungible_item_id(collection_id, 1).const_data,129            data.const_data130        );131        assert_eq!(132            TemplateModule::refungible_item_id(collection_id, 1).variable_data,133            data.variable_data134        );135        assert_eq!(136            TemplateModule::refungible_item_id(collection_id, 1).owner[0],137            Ownership {138                owner: 1,139                fraction: 1000140            }141        );142    });143}144145#[test]146fn create_multiple_refungible_items() {147    new_test_ext().execute_with(|| {148        default_limits();149        150        create_test_collection(&CollectionMode::ReFungible(3), 1);151152        let origin1 = Origin::signed(1);153154        let items_data = vec![default_re_fungible_data(), default_re_fungible_data(), default_re_fungible_data()];155156        assert_ok!(TemplateModule::create_multiple_items(157            origin1.clone(),158            1,159            1,160            items_data.clone().into_iter().map(|d| { d.into() }).collect()161        ));162        for (index, data) in items_data.iter().enumerate() {163164            let item = TemplateModule::refungible_item_id(1, (index + 1) as TokenId);165            assert_eq!(item.const_data.to_vec(), data.const_data);166            assert_eq!(item.variable_data.to_vec(), data.variable_data);167            assert_eq!(168                item.owner[0],169                Ownership {170                    owner: 1,171                    fraction: 1000172                }173            );174        }175    });176}177178#[test]179fn create_fungible_item() {180    new_test_ext().execute_with(|| {181        default_limits();182        183        let collection_id = create_test_collection(&CollectionMode::Fungible(3), 1);184185        let data = default_fungible_data();186        create_test_item(collection_id, &data.into());187188        assert_eq!(TemplateModule::fungible_item_id(collection_id, 1).owner, 1);189    });190}191192#[test]193fn create_multiple_fungible_items() {194    new_test_ext().execute_with(|| {195        default_limits();196197        create_test_collection(&CollectionMode::Fungible(3), 1);198199        let origin1 = Origin::signed(1);200201        let items_data = vec![default_fungible_data(), default_fungible_data(), default_fungible_data()];202203        assert_ok!(TemplateModule::create_multiple_items(204            origin1.clone(),205            1,206            1,207            items_data.clone().into_iter().map(|d| { d.into() }).collect()208        ));209        210        for (index, _) in items_data.iter().enumerate() {211            assert_eq!(TemplateModule::fungible_item_id(1, (index + 1) as TokenId).owner, 1);212        }213        assert_eq!(TemplateModule::balance_count(1, 1), 3000);214        assert_eq!(TemplateModule::address_tokens(1, 1), [1, 2, 3]);215    });216}217218#[test]219fn transfer_fungible_item() {220    new_test_ext().execute_with(|| {221        default_limits();222        223        let collection_id = create_test_collection(&CollectionMode::Fungible(3), 1);224225        let origin1 = Origin::signed(1);226        let origin2 = Origin::signed(2);227228        let data = default_fungible_data();229        create_test_item(collection_id, &data.into());230231        assert_eq!(TemplateModule::fungible_item_id(1, 1).owner, 1);232        assert_eq!(TemplateModule::balance_count(1, 1), 1000);233        assert_eq!(TemplateModule::address_tokens(1, 1), [1]);234235        // change owner scenario236        assert_ok!(TemplateModule::transfer(origin1.clone(), 2, 1, 1, 1000));237        assert_eq!(TemplateModule::fungible_item_id(1, 1).owner, 2);238        assert_eq!(TemplateModule::fungible_item_id(1, 1).value, 1000);239        assert_eq!(TemplateModule::balance_count(1, 1), 0);240        assert_eq!(TemplateModule::balance_count(1, 2), 1000);241        // assert_eq!(TemplateModule::address_tokens(1, 1), []);242        assert_eq!(TemplateModule::address_tokens(1, 2), [1]);243244        // split item scenario245        assert_ok!(TemplateModule::transfer(origin2.clone(), 3, 1, 1, 500));246        assert_eq!(TemplateModule::fungible_item_id(1, 1).owner, 2);247        assert_eq!(TemplateModule::fungible_item_id(1, 2).owner, 3);248        assert_eq!(TemplateModule::balance_count(1, 2), 500);249        assert_eq!(TemplateModule::balance_count(1, 3), 500);250        assert_eq!(TemplateModule::address_tokens(1, 2), [1]);251        assert_eq!(TemplateModule::address_tokens(1, 3), [2]);252253        // split item and new owner has account scenario254        assert_ok!(TemplateModule::transfer(origin2.clone(), 3, 1, 1, 200));255        assert_eq!(TemplateModule::fungible_item_id(1, 1).value, 300);256        assert_eq!(TemplateModule::fungible_item_id(1, 2).value, 700);257        assert_eq!(TemplateModule::balance_count(1, 2), 300);258        assert_eq!(TemplateModule::balance_count(1, 3), 700);259        assert_eq!(TemplateModule::address_tokens(1, 2), [1]);260        assert_eq!(TemplateModule::address_tokens(1, 3), [2]);261    });262}263264#[test]265fn transfer_refungible_item() {266    new_test_ext().execute_with(|| {267        default_limits();268        269        let collection_id = create_test_collection(&CollectionMode::ReFungible(3), 1);270271        let data = default_re_fungible_data();272        create_test_item(collection_id, &data.clone().into());273274        let origin1 = Origin::signed(1);275        let origin2 = Origin::signed(2);276        assert_eq!(277            TemplateModule::refungible_item_id(collection_id, 1).const_data,278            data.const_data279        );280        assert_eq!(281            TemplateModule::refungible_item_id(collection_id, 1).variable_data,282            data.variable_data283        );284        assert_eq!(285            TemplateModule::refungible_item_id(collection_id, 1).owner[0],286            Ownership {287                owner: 1,288                fraction: 1000289            }290        );291        assert_eq!(TemplateModule::balance_count(1, 1), 1000);292        assert_eq!(TemplateModule::address_tokens(1, 1), [1]);293294        // change owner scenario295        assert_ok!(TemplateModule::transfer(origin1.clone(), 2, 1, 1, 1000));296        assert_eq!(297            TemplateModule::refungible_item_id(1, 1).owner[0],298            Ownership {299                owner: 2,300                fraction: 1000301            }302        );303        assert_eq!(TemplateModule::balance_count(1, 1), 0);304        assert_eq!(TemplateModule::balance_count(1, 2), 1000);305        // assert_eq!(TemplateModule::address_tokens(1, 1), []);306        assert_eq!(TemplateModule::address_tokens(1, 2), [1]);307308        // split item scenario309        assert_ok!(TemplateModule::transfer(origin2.clone(), 3, 1, 1, 500));310        assert_eq!(311            TemplateModule::refungible_item_id(1, 1).owner[0],312            Ownership {313                owner: 2,314                fraction: 500315            }316        );317        assert_eq!(318            TemplateModule::refungible_item_id(1, 1).owner[1],319            Ownership {320                owner: 3,321                fraction: 500322            }323        );324        assert_eq!(TemplateModule::balance_count(1, 2), 500);325        assert_eq!(TemplateModule::balance_count(1, 3), 500);326        assert_eq!(TemplateModule::address_tokens(1, 2), [1]);327        assert_eq!(TemplateModule::address_tokens(1, 3), [1]);328329        // split item and new owner has account scenario330        assert_ok!(TemplateModule::transfer(origin2.clone(), 3, 1, 1, 200));331        assert_eq!(332            TemplateModule::refungible_item_id(1, 1).owner[0],333            Ownership {334                owner: 2,335                fraction: 300336            }337        );338        assert_eq!(339            TemplateModule::refungible_item_id(1, 1).owner[1],340            Ownership {341                owner: 3,342                fraction: 700343            }344        );345        assert_eq!(TemplateModule::balance_count(1, 2), 300);346        assert_eq!(TemplateModule::balance_count(1, 3), 700);347        assert_eq!(TemplateModule::address_tokens(1, 2), [1]);348        assert_eq!(TemplateModule::address_tokens(1, 3), [1]);349    });350}351352#[test]353fn transfer_nft_item() {354    new_test_ext().execute_with(|| {355        default_limits();356        357        let collection_id = create_test_collection(&CollectionMode::NFT, 1);358359        let data = default_nft_data();360        create_test_item(collection_id, &data.into());361        assert_eq!(TemplateModule::balance_count(1, 1), 1);362        assert_eq!(TemplateModule::address_tokens(1, 1), [1]);363364        let origin1 = Origin::signed(1);365        // default scenario366        assert_ok!(TemplateModule::transfer(origin1.clone(), 2, 1, 1, 1000));367        assert_eq!(TemplateModule::nft_item_id(1, 1).owner, 2);368        assert_eq!(TemplateModule::balance_count(1, 1), 0);369        assert_eq!(TemplateModule::balance_count(1, 2), 1);370        // assert_eq!(TemplateModule::address_tokens(1, 1), []);371        assert_eq!(TemplateModule::address_tokens(1, 2), [1]);372    });373}374375#[test]376fn nft_approve_and_transfer_from() {377    new_test_ext().execute_with(|| {378        default_limits();379        380        let collection_id = create_test_collection(&CollectionMode::NFT, 1);381382        let data = default_nft_data();383        create_test_item(collection_id, &data.into());384385        let origin1 = Origin::signed(1);386        let origin2 = Origin::signed(2);387388        assert_eq!(TemplateModule::balance_count(1, 1), 1);389        assert_eq!(TemplateModule::address_tokens(1, 1), [1]);390391        // neg transfer392        assert_noop!(TemplateModule::transfer_from(393            origin2.clone(),394            1,395            2,396            1,397            1,398            1), Error::<Test>::NoPermission);399400        // do approve401        assert_ok!(TemplateModule::approve(origin1.clone(), 2, 1, 1));402        assert_eq!(TemplateModule::approved(1, (1, 1)).len(), 1);403        assert_eq!(404            TemplateModule::approved(1, (1, 1))[0],405            ApprovePermissions {406                approved: 2,407                amount: 100000000408            }409        );410411        assert_ok!(TemplateModule::transfer_from(412            origin2.clone(),413            1,414            2,415            1,416            1,417            1418        ));419        assert_eq!(TemplateModule::approved(1, (1, 1)).len(), 0);420    });421}422423#[test]424fn nft_approve_and_transfer_from_white_list() {425    new_test_ext().execute_with(|| {426        default_limits();427        428        let collection_id = create_test_collection(&CollectionMode::NFT, 1);429430        let origin1 = Origin::signed(1);431        let origin2 = Origin::signed(2);432433        let data = default_nft_data();434        create_test_item(collection_id, &data.clone().into());435436        assert_eq!(TemplateModule::nft_item_id(1, 1).const_data, data.const_data);437        assert_eq!(TemplateModule::balance_count(1, 1), 1);438        assert_eq!(TemplateModule::address_tokens(1, 1), [1]);439440        assert_ok!(TemplateModule::set_mint_permission(441            origin1.clone(),442            1,443            true444        ));445        assert_ok!(TemplateModule::set_public_access_mode(446            origin1.clone(),447            1,448            AccessMode::WhiteList449        ));450        assert_ok!(TemplateModule::add_to_white_list(origin1.clone(), 1, 1));451        assert_ok!(TemplateModule::add_to_white_list(origin1.clone(), 1, 2));452        assert_ok!(TemplateModule::add_to_white_list(origin1.clone(), 1, 3));453454        // do approve455        assert_ok!(TemplateModule::approve(origin1.clone(), 2, 1, 1));456        assert_eq!(TemplateModule::approved(1, (1, 1)).len(), 1);457        assert_ok!(TemplateModule::approve(origin1.clone(), 3, 1, 1));458        assert_eq!(TemplateModule::approved(1, (1, 1)).len(), 2);459        assert_eq!(460            TemplateModule::approved(1, (1, 1))[0],461            ApprovePermissions {462                approved: 2,463                amount: 100000000464            }465        );466467        assert_ok!(TemplateModule::transfer_from(468            origin2.clone(),469            1,470            3,471            1,472            1,473            1474        ));475        assert_eq!(TemplateModule::approved(1, (1, 1)).len(), 0);476    });477}478479#[test]480fn refungible_approve_and_transfer_from() {481    new_test_ext().execute_with(|| {482        default_limits();483        484        let collection_id = create_test_collection(&CollectionMode::ReFungible(3), 1);485        486        let origin1 = Origin::signed(1);487        let origin2 = Origin::signed(2);488489        let data = default_re_fungible_data();490        create_test_item(collection_id, &data.into());491492        assert_eq!(TemplateModule::balance_count(1, 1), 1000);493        assert_eq!(TemplateModule::address_tokens(1, 1), [1]);494495        assert_ok!(TemplateModule::set_mint_permission(496            origin1.clone(),497            1,498            true499        ));500        assert_ok!(TemplateModule::set_public_access_mode(501            origin1.clone(),502            1,503            AccessMode::WhiteList504        ));505        assert_ok!(TemplateModule::add_to_white_list(origin1.clone(), 1, 1));506        assert_ok!(TemplateModule::add_to_white_list(origin1.clone(), 1, 2));507        assert_ok!(TemplateModule::add_to_white_list(origin1.clone(), 1, 3));508509        // do approve510        assert_ok!(TemplateModule::approve(origin1.clone(), 2, 1, 1));511        assert_eq!(TemplateModule::approved(1, (1, 1)).len(), 1);512        assert_ok!(TemplateModule::approve(origin1.clone(), 3, 1, 1));513        assert_eq!(TemplateModule::approved(1, (1, 1)).len(), 2);514        assert_eq!(515            TemplateModule::approved(1, (1, 1))[0],516            ApprovePermissions {517                approved: 2,518                amount: 100000000519            }520        );521522        assert_ok!(TemplateModule::transfer_from(523            origin2.clone(),524            1,525            3,526            1,527            1,528            100529        ));530        assert_eq!(TemplateModule::balance_count(1, 1), 900);531        assert_eq!(TemplateModule::balance_count(1, 3), 100);532        assert_eq!(TemplateModule::address_tokens(1, 1), [1]);533        assert_eq!(TemplateModule::address_tokens(1, 3), [1]);534535        assert_eq!(TemplateModule::approved(1, (1, 1)).len(), 1);536        assert_eq!(537            TemplateModule::approved(1, (1, 1))[0],538            ApprovePermissions {539                approved: 3,540                amount: 100000000541            }542        );543    });544}545546#[test]547fn fungible_approve_and_transfer_from() {548    new_test_ext().execute_with(|| {549        default_limits();550        551        let collection_id = create_test_collection(&CollectionMode::Fungible(3), 1);552        553        let data = default_fungible_data();554        create_test_item(collection_id, &data.into());555556        let origin1 = Origin::signed(1);557        let origin2 = Origin::signed(2);558559        assert_eq!(TemplateModule::balance_count(1, 1), 1000);560        assert_eq!(TemplateModule::address_tokens(1, 1), [1]);561562        assert_ok!(TemplateModule::set_mint_permission(563            origin1.clone(),564            1,565            true566        ));567        assert_ok!(TemplateModule::set_public_access_mode(568            origin1.clone(),569            1,570            AccessMode::WhiteList571        ));572        assert_ok!(TemplateModule::add_to_white_list(origin1.clone(), 1, 1));573        assert_ok!(TemplateModule::add_to_white_list(origin1.clone(), 1, 2));574        assert_ok!(TemplateModule::add_to_white_list(origin1.clone(), 1, 3));575576        // do approve577        assert_ok!(TemplateModule::approve(origin1.clone(), 2, 1, 1));578        assert_eq!(TemplateModule::approved(1, (1, 1)).len(), 1);579        assert_ok!(TemplateModule::approve(origin1.clone(), 3, 1, 1));580        assert_eq!(TemplateModule::approved(1, (1, 1)).len(), 2);581        assert_eq!(582            TemplateModule::approved(1, (1, 1))[0],583            ApprovePermissions {584                approved: 2,585                amount: 100000000586            }587        );588589        assert_ok!(TemplateModule::transfer_from(590            origin2.clone(),591            1,592            3,593            1,594            1,595            100596        ));597        assert_eq!(TemplateModule::balance_count(1, 1), 900);598        assert_eq!(TemplateModule::balance_count(1, 3), 100);599        assert_eq!(TemplateModule::address_tokens(1, 1), [1]);600        assert_eq!(TemplateModule::address_tokens(1, 3), [2]);601602        assert_eq!(TemplateModule::approved(1, (1, 1)).len(), 1);603        assert_eq!(604            TemplateModule::approved(1, (1, 1))[0],605            ApprovePermissions {606                approved: 3,607                amount: 100000000608            }609        );610611        assert_ok!(TemplateModule::approve(origin1.clone(), 2, 1, 1));612        assert_ok!(TemplateModule::transfer_from(613            origin2.clone(),614            1,615            3,616            1,617            1,618            900619        ));620        assert_eq!(TemplateModule::balance_count(1, 1), 0);621        assert_eq!(TemplateModule::balance_count(1, 3), 1000);622        // assert_eq!(TemplateModule::address_tokens(1, 1), []);623        assert_eq!(TemplateModule::address_tokens(1, 3), [2]);624625        assert_eq!(TemplateModule::approved(1, (1, 1)).len(), 0);626    });627}628629#[test]630fn change_collection_owner() {631    new_test_ext().execute_with(|| {632        default_limits();633        634        let collection_id = create_test_collection(&CollectionMode::NFT, 1);635        636        let origin1 = Origin::signed(1);637        assert_ok!(TemplateModule::change_collection_owner(638            origin1.clone(),639            collection_id,640            2641        ));642        assert_eq!(TemplateModule::collection(collection_id).owner, 2);643    });644}645646#[test]647fn destroy_collection() {648    new_test_ext().execute_with(|| {649        default_limits();650        651        let collection_id = create_test_collection(&CollectionMode::NFT, 1);652        653        let origin1 = Origin::signed(1);654        assert_ok!(TemplateModule::destroy_collection(origin1.clone(), collection_id));655    });656}657658#[test]659fn burn_nft_item() {660    new_test_ext().execute_with(|| {661        default_limits();662        663        let collection_id = create_test_collection(&CollectionMode::NFT, 1);664665        let origin1 = Origin::signed(1);666        assert_ok!(TemplateModule::add_collection_admin(origin1.clone(), collection_id, 2));667        668        let data = default_nft_data();669        create_test_item(collection_id, &data.into());670671        // check balance (collection with id = 1, user id = 1)672        assert_eq!(TemplateModule::balance_count(1, 1), 1);673674        // burn item675        assert_ok!(TemplateModule::burn_item(origin1.clone(), 1, 1));676        assert_noop!(677            TemplateModule::burn_item(origin1.clone(), 1, 1),678            Error::<Test>::TokenNotFound679        );680681        assert_eq!(TemplateModule::balance_count(1, 1), 0);682    });683}684685#[test]686fn burn_fungible_item() {687    new_test_ext().execute_with(|| {688        default_limits();689        690        let collection_id = create_test_collection(&CollectionMode::Fungible(3), 1);691        692        let origin1 = Origin::signed(1);693        assert_ok!(TemplateModule::add_collection_admin(origin1.clone(), collection_id, 2));694        695        let data = default_fungible_data();696        create_test_item(collection_id, &data.into());697698        // check balance (collection with id = 1, user id = 1)699        assert_eq!(TemplateModule::balance_count(1, 1), 1000);700701        // burn item702        assert_ok!(TemplateModule::burn_item(origin1.clone(), 1, 1));703        assert_noop!(704            TemplateModule::burn_item(origin1.clone(), 1, 1),705            Error::<Test>::TokenNotFound706        );707708        assert_eq!(TemplateModule::balance_count(1, 1), 0);709    });710}711712#[test]713fn burn_refungible_item() {714    new_test_ext().execute_with(|| {715        default_limits();716        717        let collection_id = create_test_collection(&CollectionMode::ReFungible(3), 1);718        let origin1 = Origin::signed(1);719720        assert_ok!(TemplateModule::set_mint_permission(721            origin1.clone(),722            collection_id,723            true724        ));725        assert_ok!(TemplateModule::set_public_access_mode(726            origin1.clone(),727            collection_id,728            AccessMode::WhiteList729        ));730        assert_ok!(TemplateModule::add_to_white_list(origin1.clone(), 1, 1));731732        assert_ok!(TemplateModule::add_collection_admin(origin1.clone(), 1, 2));733        734        let data = default_re_fungible_data();735        create_test_item(collection_id, &data.into());736737        // check balance (collection with id = 1, user id = 2)738        assert_eq!(TemplateModule::balance_count(1, 1), 1000);739740        // burn item741        assert_ok!(TemplateModule::burn_item(origin1.clone(), 1, 1));742        assert_noop!(743            TemplateModule::burn_item(origin1.clone(), 1, 1),744            Error::<Test>::TokenNotFound745        );746747        assert_eq!(TemplateModule::balance_count(1, 1), 0);748    });749}750751#[test]752fn add_collection_admin() {753    new_test_ext().execute_with(|| {754        default_limits();755        756        let collection1_id = create_test_collection_for_owner(&CollectionMode::NFT, 1, 1);757        create_test_collection_for_owner(&CollectionMode::NFT, 2, 2);758        create_test_collection_for_owner(&CollectionMode::NFT, 3, 3);759        760        let origin1 = Origin::signed(1);761762        // collection admin763        assert_ok!(TemplateModule::add_collection_admin(origin1.clone(), collection1_id, 2));764        assert_ok!(TemplateModule::add_collection_admin(origin1.clone(), collection1_id, 3));765766        assert_eq!(TemplateModule::admin_list_collection(collection1_id).contains(&2), true);767        assert_eq!(TemplateModule::admin_list_collection(collection1_id).contains(&3), true);768    });769}770771#[test]772fn remove_collection_admin() {773    new_test_ext().execute_with(|| {774        default_limits();775        776        let collection1_id = create_test_collection_for_owner(&CollectionMode::NFT, 1, 1);777        create_test_collection_for_owner(&CollectionMode::NFT, 2, 2);778        create_test_collection_for_owner(&CollectionMode::NFT, 3, 3);779780        let origin1 = Origin::signed(1);781        let origin2 = Origin::signed(2);782783        // collection admin784        assert_ok!(TemplateModule::add_collection_admin(origin1.clone(), collection1_id, 2));785        assert_ok!(TemplateModule::add_collection_admin(origin1.clone(), collection1_id, 3));786787        assert_eq!(TemplateModule::admin_list_collection(1).contains(&2), true);788        assert_eq!(TemplateModule::admin_list_collection(1).contains(&3), true);789790        // remove admin791        assert_ok!(TemplateModule::remove_collection_admin(792            origin2.clone(),793            1,794            3795        ));796        assert_eq!(TemplateModule::admin_list_collection(1).contains(&3), false);797    });798}799800#[test]801fn balance_of() {802    new_test_ext().execute_with(|| {803        default_limits();804        805        let nft_collection_id = create_test_collection(&CollectionMode::NFT, 1);806        let fungible_collection_id = create_test_collection(&CollectionMode::Fungible(3), 2);807        let re_fungible_collection_id = create_test_collection(&CollectionMode::ReFungible(3), 3);808        809        // check balance before810        assert_eq!(TemplateModule::balance_count(nft_collection_id, 1), 0);811        assert_eq!(TemplateModule::balance_count(fungible_collection_id, 1), 0);812        assert_eq!(TemplateModule::balance_count(re_fungible_collection_id, 1), 0);813814        let nft_data = default_nft_data();815        create_test_item(nft_collection_id, &nft_data.into());816        817        let fungible_data = default_fungible_data();818        create_test_item(fungible_collection_id, &fungible_data.into());819        820        let re_fungible_data = default_re_fungible_data();821        create_test_item(re_fungible_collection_id, &re_fungible_data.into());822823        // check balance (collection with id = 1, user id = 1)824        assert_eq!(TemplateModule::balance_count(nft_collection_id, 1), 1);825        assert_eq!(TemplateModule::balance_count(fungible_collection_id, 1), 1000);826        assert_eq!(TemplateModule::balance_count(re_fungible_collection_id, 1), 1000);827        assert_eq!(TemplateModule::nft_item_id(nft_collection_id, 1).owner, 1);828        assert_eq!(TemplateModule::fungible_item_id(fungible_collection_id, 1).owner, 1);829        assert_eq!(TemplateModule::refungible_item_id(re_fungible_collection_id, 1).owner[0].owner, 1);830    });831}832833#[test]834fn approve() {835    new_test_ext().execute_with(|| {836        default_limits();837        838        let collection_id = create_test_collection(&CollectionMode::NFT, 1);839        840        let data = default_nft_data();841        create_test_item(collection_id, &data.into());842843        let origin1 = Origin::signed(1);844        845        // approve846        assert_ok!(TemplateModule::approve(origin1.clone(), 2, 1, 1));847        assert_eq!(TemplateModule::approved(1, (1, 1))[0].approved, 2);848    });849}850851#[test]852fn transfer_from() {853    new_test_ext().execute_with(|| {854        default_limits();855        856        let collection_id = create_test_collection(&CollectionMode::NFT, 1);857        let origin1 = Origin::signed(1);858        let origin2 = Origin::signed(2);859860        let data = default_nft_data();861        create_test_item(collection_id, &data.into());862863        // approve864        assert_ok!(TemplateModule::approve(origin1.clone(), 2, 1, 1));865        assert_eq!(TemplateModule::approved(1, (1, 1))[0].approved, 2);866867        assert_ok!(TemplateModule::set_mint_permission(868            origin1.clone(),869            1,870            true871        ));872        assert_ok!(TemplateModule::set_public_access_mode(873            origin1.clone(),874            1,875            AccessMode::WhiteList876        ));877        assert_ok!(TemplateModule::add_to_white_list(origin1.clone(), 1, 1));878        assert_ok!(TemplateModule::add_to_white_list(origin1.clone(), 1, 2));879        assert_ok!(TemplateModule::add_to_white_list(origin1.clone(), 1, 3));880881        assert_ok!(TemplateModule::transfer_from(882            origin2.clone(),883            1,884            2,885            1,886            1,887            1888        ));889890        // after transfer891        assert_eq!(TemplateModule::balance_count(1, 1), 0);892        assert_eq!(TemplateModule::balance_count(1, 2), 1);893    });894}895896// #endregion897898// Coverage tests region899// #region900901#[test]902fn owner_can_add_address_to_white_list() {903    new_test_ext().execute_with(|| {904        default_limits();905        906        let collection_id = create_test_collection(&CollectionMode::NFT, 1);907908        let origin1 = Origin::signed(1);909        assert_ok!(TemplateModule::add_to_white_list(origin1.clone(), collection_id, 2));910        assert_eq!(TemplateModule::white_list(collection_id)[0], 2);911    });912}913914#[test]915fn admin_can_add_address_to_white_list() {916    new_test_ext().execute_with(|| {917        default_limits();918        919        let collection_id = create_test_collection(&CollectionMode::NFT, 1);920        let origin1 = Origin::signed(1);921        let origin2 = Origin::signed(2);922923        assert_ok!(TemplateModule::add_collection_admin(origin1.clone(), collection_id, 2));924        assert_ok!(TemplateModule::add_to_white_list(origin2.clone(), collection_id, 3));925        assert_eq!(TemplateModule::white_list(collection_id)[0], 3);926    });927}928929#[test]930fn nonprivileged_user_cannot_add_address_to_white_list() {931    new_test_ext().execute_with(|| {932        default_limits();933        934        let collection_id = create_test_collection(&CollectionMode::NFT, 1);935936        let origin2 = Origin::signed(2);937        assert_noop!(938            TemplateModule::add_to_white_list(origin2.clone(), collection_id, 3),939            Error::<Test>::NoPermission940        );941    });942}943944#[test]945fn nobody_can_add_address_to_white_list_of_nonexisting_collection() {946    new_test_ext().execute_with(|| {947        default_limits();948949        let origin1 = Origin::signed(1);950951        assert_noop!(952            TemplateModule::add_to_white_list(origin1.clone(), 1, 2),953            Error::<Test>::CollectionNotFound954        );955    });956}957958#[test]959fn nobody_can_add_address_to_white_list_of_deleted_collection() {960    new_test_ext().execute_with(|| {961        default_limits();962        963        let collection_id = create_test_collection(&CollectionMode::NFT, 1);964965        let origin1 = Origin::signed(1);966        assert_ok!(TemplateModule::destroy_collection(origin1.clone(), collection_id));967        assert_noop!(968            TemplateModule::add_to_white_list(origin1.clone(), collection_id, 2),969            Error::<Test>::CollectionNotFound970        );971    });972}973974// If address is already added to white list, nothing happens975#[test]976fn address_is_already_added_to_white_list() {977    new_test_ext().execute_with(|| {978        default_limits();979        980        let collection_id = create_test_collection(&CollectionMode::NFT, 1);981        let origin1 = Origin::signed(1);982        983        assert_ok!(TemplateModule::add_to_white_list(origin1.clone(), collection_id, 2));984        assert_ok!(TemplateModule::add_to_white_list(origin1.clone(), collection_id, 2));985        assert_eq!(TemplateModule::white_list(collection_id)[0], 2);986        assert_eq!(TemplateModule::white_list(collection_id).len(), 1);987    });988}989990#[test]991fn owner_can_remove_address_from_white_list() {992    new_test_ext().execute_with(|| {993        default_limits();994        995        let collection_id = create_test_collection(&CollectionMode::NFT, 1);996997        let origin1 = Origin::signed(1);998        assert_ok!(TemplateModule::add_to_white_list(origin1.clone(), collection_id, 2));999        assert_ok!(TemplateModule::remove_from_white_list(1000            origin1.clone(),1001            collection_id,1002            21003        ));1004        assert_eq!(TemplateModule::white_list(collection_id).len(), 0);1005    });1006}10071008#[test]1009fn admin_can_remove_address_from_white_list() {1010    new_test_ext().execute_with(|| {1011        default_limits();1012        1013        let collection_id = create_test_collection(&CollectionMode::NFT, 1);1014        let origin1 = Origin::signed(1);1015        let origin2 = Origin::signed(2);10161017        assert_ok!(TemplateModule::add_collection_admin(origin1.clone(), collection_id, 2));10181019        assert_ok!(TemplateModule::add_to_white_list(origin1.clone(), collection_id, 3));1020        assert_ok!(TemplateModule::remove_from_white_list(1021            origin2.clone(),1022            collection_id,1023            31024        ));1025        assert_eq!(TemplateModule::white_list(collection_id).len(), 0);1026    });1027}10281029#[test]1030fn nonprivileged_user_cannot_remove_address_from_white_list() {1031    new_test_ext().execute_with(|| {1032        default_limits();1033        1034        let collection_id = create_test_collection(&CollectionMode::NFT, 1);1035        let origin1 = Origin::signed(1);1036        let origin2 = Origin::signed(2);10371038        assert_ok!(TemplateModule::add_to_white_list(origin1.clone(), collection_id, 2));1039        assert_noop!(1040            TemplateModule::remove_from_white_list(origin2.clone(), collection_id, 2),1041            Error::<Test>::NoPermission1042        );1043        assert_eq!(TemplateModule::white_list(collection_id)[0], 2);1044    });1045}10461047#[test]1048fn nobody_can_remove_address_from_white_list_of_nonexisting_collection() {1049    new_test_ext().execute_with(|| {1050        default_limits();1051        let origin1 = Origin::signed(1);10521053        assert_noop!(1054            TemplateModule::remove_from_white_list(origin1.clone(), 1, 2),1055            Error::<Test>::CollectionNotFound1056        );1057    });1058}10591060#[test]1061fn nobody_can_remove_address_from_white_list_of_deleted_collection() {1062    new_test_ext().execute_with(|| {1063        default_limits();1064        1065        let collection_id = create_test_collection(&CollectionMode::NFT, 1);1066        let origin1 = Origin::signed(1);1067        let origin2 = Origin::signed(2);10681069        assert_ok!(TemplateModule::add_to_white_list(origin1.clone(), collection_id, 2));1070        assert_ok!(TemplateModule::destroy_collection(origin1.clone(), collection_id));1071        assert_noop!(1072            TemplateModule::remove_from_white_list(origin2.clone(), collection_id, 2),1073            Error::<Test>::CollectionNotFound1074        );1075        assert_eq!(TemplateModule::white_list(collection_id).len(), 0);1076    });1077}10781079// If address is already removed from white list, nothing happens1080#[test]1081fn address_is_already_removed_from_white_list() {1082    new_test_ext().execute_with(|| {1083        default_limits();1084        1085        let collection_id = create_test_collection(&CollectionMode::NFT, 1);1086        let origin1 = Origin::signed(1);10871088        assert_ok!(TemplateModule::add_to_white_list(origin1.clone(), collection_id, 2));1089        assert_ok!(TemplateModule::remove_from_white_list(1090            origin1.clone(),1091            collection_id,1092            21093        ));1094        assert_ok!(TemplateModule::remove_from_white_list(1095            origin1.clone(),1096            collection_id,1097            21098        ));1099        assert_eq!(TemplateModule::white_list(collection_id).len(), 0);1100    });1101}11021103// If Public Access mode is set to WhiteList, tokens can’t be transferred from a non-whitelisted address with transfer or transferFrom (2 tests)1104#[test]1105fn white_list_test_1() {1106    new_test_ext().execute_with(|| {1107        default_limits();1108        1109        let collection_id = create_test_collection(&CollectionMode::NFT, 1);11101111        let origin1 = Origin::signed(1);1112        1113        let data = default_nft_data();1114        create_test_item(collection_id, &data.into());11151116        assert_ok!(TemplateModule::set_public_access_mode(1117            origin1.clone(),1118            collection_id,1119            AccessMode::WhiteList1120        ));1121        assert_ok!(TemplateModule::add_to_white_list(origin1.clone(), collection_id, 2));11221123        assert_noop!(1124            TemplateModule::transfer(origin1.clone(), 3, 1, 1, 1),1125            Error::<Test>::AddresNotInWhiteList1126        );1127    });1128}11291130#[test]1131fn white_list_test_2() {1132    new_test_ext().execute_with(|| {1133        default_limits();1134        1135        let collection_id = create_test_collection(&CollectionMode::NFT, 1);1136        let origin1 = Origin::signed(1);1137        1138        let data = default_nft_data();1139        create_test_item(collection_id, &data.into());11401141        assert_ok!(TemplateModule::set_public_access_mode(1142            origin1.clone(),1143            collection_id,1144            AccessMode::WhiteList1145        ));1146        assert_ok!(TemplateModule::add_to_white_list(origin1.clone(), 1, 1));1147        assert_ok!(TemplateModule::add_to_white_list(origin1.clone(), 1, 2));11481149        // do approve1150        assert_ok!(TemplateModule::approve(origin1.clone(), 1, 1, 1));1151        assert_eq!(TemplateModule::approved(1, (1, 1)).len(), 1);11521153        assert_ok!(TemplateModule::remove_from_white_list(1154            origin1.clone(),1155            1,1156            11157        ));11581159        assert_noop!(1160            TemplateModule::transfer_from(origin1.clone(), 1, 3, 1, 1, 1),1161            Error::<Test>::AddresNotInWhiteList1162        );1163    });1164}11651166// If Public Access mode is set to WhiteList, tokens can’t be transferred to a non-whitelisted address with transfer or transferFrom (2 tests)1167#[test]1168fn white_list_test_3() {1169    new_test_ext().execute_with(|| {1170        default_limits();1171        1172        let collection_id = create_test_collection(&CollectionMode::NFT, 1);11731174        let origin1 = Origin::signed(1);1175        1176        let data = default_nft_data();1177        create_test_item(collection_id, &data.into());11781179        assert_ok!(TemplateModule::set_public_access_mode(1180            origin1.clone(),1181            collection_id,1182            AccessMode::WhiteList1183        ));1184        assert_ok!(TemplateModule::add_to_white_list(origin1.clone(), 1, 1));11851186        assert_noop!(1187            TemplateModule::transfer(origin1.clone(), 3, 1, 1, 1),1188            Error::<Test>::AddresNotInWhiteList1189        );1190    });1191}11921193#[test]1194fn white_list_test_4() {1195    new_test_ext().execute_with(|| {1196        default_limits();1197        1198        let collection_id = create_test_collection(&CollectionMode::NFT, 1);11991200        let origin1 = Origin::signed(1);12011202        let data = default_nft_data();1203        create_test_item(collection_id, &data.into());12041205        assert_ok!(TemplateModule::set_public_access_mode(1206            origin1.clone(),1207            collection_id,1208            AccessMode::WhiteList1209        ));1210        assert_ok!(TemplateModule::add_to_white_list(origin1.clone(), collection_id, 1));1211        assert_ok!(TemplateModule::add_to_white_list(origin1.clone(), collection_id, 2));12121213        // do approve1214        assert_ok!(TemplateModule::approve(origin1.clone(), 1, 1, 1));1215        assert_eq!(TemplateModule::approved(1, (1, 1)).len(), 1);12161217        assert_ok!(TemplateModule::remove_from_white_list(1218            origin1.clone(),1219            collection_id,1220            21221        ));12221223        assert_noop!(1224            TemplateModule::transfer_from(origin1.clone(), 1, 3, 1, 1, 1),1225            Error::<Test>::AddresNotInWhiteList1226        );1227    });1228}12291230// If Public Access mode is set to WhiteList, tokens can’t be destroyed by a non-whitelisted address (even if it owned them before enabling WhiteList mode)1231#[test]1232fn white_list_test_5() {1233    new_test_ext().execute_with(|| {1234        default_limits();1235        1236        let collection_id = create_test_collection(&CollectionMode::NFT, 1);12371238        let origin1 = Origin::signed(1);12391240        let data = default_nft_data();1241        create_test_item(collection_id, &data.into());12421243        assert_ok!(TemplateModule::set_public_access_mode(1244            origin1.clone(),1245            collection_id,1246            AccessMode::WhiteList1247        ));1248        assert_noop!(1249            TemplateModule::burn_item(origin1.clone(), 1, 1),1250            Error::<Test>::AddresNotInWhiteList1251        );1252    });1253}12541255// If Public Access mode is set to WhiteList, oken transfers can’t be Approved by a non-whitelisted address (see Approve method).1256#[test]1257fn white_list_test_6() {1258    new_test_ext().execute_with(|| {1259        default_limits();1260        1261        let collection_id = create_test_collection(&CollectionMode::NFT, 1);12621263        let origin1 = Origin::signed(1);1264        assert_ok!(TemplateModule::set_public_access_mode(1265            origin1.clone(),1266            collection_id,1267            AccessMode::WhiteList1268        ));12691270        // do approve1271        assert_noop!(1272            TemplateModule::approve(origin1.clone(), 1, 1, 1),1273            Error::<Test>::AddresNotInWhiteList1274        );1275    });1276}12771278// If Public Access mode is set to WhiteList, tokens can be transferred from a whitelisted address with transfer or transferFrom (2 tests) and1279//          tokens can be transferred from a whitelisted address with transfer or transferFrom (2 tests)1280#[test]1281fn white_list_test_7() {1282    new_test_ext().execute_with(|| {1283        default_limits();1284        1285        let collection_id = create_test_collection(&CollectionMode::NFT, 1);12861287        let data = default_nft_data();1288        create_test_item(collection_id, &data.into());1289        1290        let origin1 = Origin::signed(1);12911292        assert_ok!(TemplateModule::set_public_access_mode(1293            origin1.clone(),1294            collection_id,1295            AccessMode::WhiteList1296        ));1297        assert_ok!(TemplateModule::add_to_white_list(origin1.clone(), collection_id, 1));1298        assert_ok!(TemplateModule::add_to_white_list(origin1.clone(), collection_id, 2));12991300        assert_ok!(TemplateModule::transfer(origin1.clone(), 2, 1, 1, 1));1301    });1302}13031304#[test]1305fn white_list_test_8() {1306    new_test_ext().execute_with(|| {1307        default_limits();1308        1309        let collection_id = create_test_collection(&CollectionMode::NFT, 1);13101311        let data = default_nft_data();1312        create_test_item(collection_id, &data.into());1313        1314        let origin1 = Origin::signed(1);13151316        assert_ok!(TemplateModule::set_public_access_mode(1317            origin1.clone(),1318            collection_id,1319            AccessMode::WhiteList1320        ));1321        assert_ok!(TemplateModule::add_to_white_list(origin1.clone(), collection_id, 1));1322        assert_ok!(TemplateModule::add_to_white_list(origin1.clone(), collection_id, 2));13231324        // do approve1325        assert_ok!(TemplateModule::approve(origin1.clone(), 1, 1, 1));1326        assert_eq!(TemplateModule::approved(1, (1, 1)).len(), 1);13271328        assert_ok!(TemplateModule::transfer_from(1329            origin1.clone(),1330            1,1331            2,1332            1,1333            1,1334            11335        ));1336    });1337}13381339// If Public Access mode is set to WhiteList, and Mint Permission is set to false, tokens can be created by owner.1340#[test]1341fn white_list_test_9() {1342    new_test_ext().execute_with(|| {1343        default_limits();1344        1345        let collection_id = create_test_collection(&CollectionMode::NFT, 1);1346        let origin1 = Origin::signed(1);13471348        assert_ok!(TemplateModule::set_public_access_mode(1349            origin1.clone(),1350            collection_id,1351            AccessMode::WhiteList1352        ));1353        assert_ok!(TemplateModule::set_mint_permission(1354            origin1.clone(),1355            collection_id,1356            false1357        ));13581359        let data = default_nft_data();1360        create_test_item(collection_id, &data.into());1361    });1362}13631364// If Public Access mode is set to WhiteList, and Mint Permission is set to false, tokens can be created by admin.1365#[test]1366fn white_list_test_10() {1367    new_test_ext().execute_with(|| {1368        default_limits();1369        1370        let collection_id = create_test_collection(&CollectionMode::NFT, 1);13711372        let origin1 = Origin::signed(1);1373        let origin2 = Origin::signed(2);13741375        assert_ok!(TemplateModule::set_public_access_mode(1376            origin1.clone(),1377            collection_id,1378            AccessMode::WhiteList1379        ));1380        assert_ok!(TemplateModule::set_mint_permission(1381            origin1.clone(),1382            collection_id,1383            false1384        ));13851386        assert_ok!(TemplateModule::add_collection_admin(origin1.clone(), collection_id, 2));13871388        assert_ok!(TemplateModule::create_item(1389            origin2.clone(),1390            collection_id,1391            2,1392            default_nft_data().into()1393        ));1394    });1395}13961397// If Public Access mode is set to WhiteList, and Mint Permission is set to false, tokens cannot be created by non-privileged and white listed address.1398#[test]1399fn white_list_test_11() {1400    new_test_ext().execute_with(|| {1401        default_limits();1402        1403        let collection_id = create_test_collection(&CollectionMode::NFT, 1);14041405        let origin1 = Origin::signed(1);1406        let origin2 = Origin::signed(2);14071408        assert_ok!(TemplateModule::set_public_access_mode(1409            origin1.clone(),1410            collection_id,1411            AccessMode::WhiteList1412        ));1413        assert_ok!(TemplateModule::set_mint_permission(1414            origin1.clone(),1415            collection_id,1416            false1417        ));1418        assert_ok!(TemplateModule::add_to_white_list(origin1.clone(), collection_id, 2));14191420        assert_noop!(1421            TemplateModule::create_item(origin2.clone(), 1, 2, default_nft_data().into()),1422            Error::<Test>::PublicMintingNotAllowed1423        );1424    });1425}14261427// If Public Access mode is set to WhiteList, and Mint Permission is set to false, tokens cannot be created by non-privileged and non-white listed address.1428#[test]1429fn white_list_test_12() {1430    new_test_ext().execute_with(|| {1431        default_limits();1432        1433        let collection_id = create_test_collection(&CollectionMode::NFT, 1);14341435        let origin1 = Origin::signed(1);1436        let origin2 = Origin::signed(2);14371438        assert_ok!(TemplateModule::set_public_access_mode(1439            origin1.clone(),1440            collection_id,1441            AccessMode::WhiteList1442        ));1443        assert_ok!(TemplateModule::set_mint_permission(1444            origin1.clone(),1445            collection_id,1446            false1447        ));14481449        assert_noop!(1450            TemplateModule::create_item(origin2.clone(), 1, 2, default_nft_data().into()),1451            Error::<Test>::PublicMintingNotAllowed1452        );1453    });1454}14551456// If Public Access mode is set to WhiteList, and Mint Permission is set to true, tokens can be created by owner.1457#[test]1458fn white_list_test_13() {1459    new_test_ext().execute_with(|| {1460        default_limits();1461        1462        let collection_id = create_test_collection(&CollectionMode::NFT, 1);14631464        let origin1 = Origin::signed(1);14651466        assert_ok!(TemplateModule::set_public_access_mode(1467            origin1.clone(),1468            collection_id,1469            AccessMode::WhiteList1470        ));1471        assert_ok!(TemplateModule::set_mint_permission(1472            origin1.clone(),1473            collection_id,1474            true1475        ));14761477        let data = default_nft_data();1478        create_test_item(collection_id, &data.into());1479    });1480}14811482// If Public Access mode is set to WhiteList, and Mint Permission is set to true, tokens can be created by admin.1483#[test]1484fn white_list_test_14() {1485    new_test_ext().execute_with(|| {1486        default_limits();1487        1488        let collection_id = create_test_collection(&CollectionMode::NFT, 1);14891490        let origin1 = Origin::signed(1);1491        let origin2 = Origin::signed(2);14921493        assert_ok!(TemplateModule::set_public_access_mode(1494            origin1.clone(),1495            collection_id,1496            AccessMode::WhiteList1497        ));1498        assert_ok!(TemplateModule::set_mint_permission(1499            origin1.clone(),1500            collection_id,1501            true1502        ));15031504        assert_ok!(TemplateModule::add_collection_admin(origin1.clone(), collection_id, 2));15051506        assert_ok!(TemplateModule::create_item(1507            origin2.clone(),1508            1,1509            2,1510            default_nft_data().into()1511        ));1512    });1513}15141515// If Public Access mode is set to WhiteList, and Mint Permission is set to true, tokens cannot be created by non-privileged and non-white listed address.1516#[test]1517fn white_list_test_15() {1518    new_test_ext().execute_with(|| {1519        default_limits();1520        1521        let collection_id = create_test_collection(&CollectionMode::NFT, 1);15221523        let origin1 = Origin::signed(1);1524        let origin2 = Origin::signed(2);15251526        assert_ok!(TemplateModule::set_public_access_mode(1527            origin1.clone(),1528            collection_id,1529            AccessMode::WhiteList1530        ));1531        assert_ok!(TemplateModule::set_mint_permission(1532            origin1.clone(),1533            collection_id,1534            true1535        ));15361537        assert_noop!(1538            TemplateModule::create_item(origin2.clone(), 1, 2, default_nft_data().into()),1539            Error::<Test>::AddresNotInWhiteList1540        );1541    });1542}15431544// If Public Access mode is set to WhiteList, and Mint Permission is set to true, tokens can be created by non-privileged and white listed address.1545#[test]1546fn white_list_test_16() {1547    new_test_ext().execute_with(|| {1548        default_limits();1549        1550        let collection_id = create_test_collection(&CollectionMode::NFT, 1);15511552        let origin1 = Origin::signed(1);1553        let origin2 = Origin::signed(2);15541555        assert_ok!(TemplateModule::set_public_access_mode(1556            origin1.clone(),1557            collection_id,1558            AccessMode::WhiteList1559        ));1560        assert_ok!(TemplateModule::set_mint_permission(1561            origin1.clone(),1562            collection_id,1563            true1564        ));1565        assert_ok!(TemplateModule::add_to_white_list(origin1.clone(), collection_id, 2));15661567        assert_ok!(TemplateModule::create_item(1568            origin2.clone(),1569            1,1570            2,1571            default_nft_data().into()1572        ));1573    });1574}15751576// Total number of collections. Positive test1577#[test]1578fn total_number_collections_bound() {1579    new_test_ext().execute_with(|| {1580        default_limits();1581        1582        create_test_collection(&CollectionMode::NFT, 1);1583    });1584}15851586// Total number of collections. Negotive test1587#[test]1588fn total_number_collections_bound_neg() {1589    new_test_ext().execute_with(|| {1590        default_limits();15911592        let origin1 = Origin::signed(1);15931594        for i in 0..default_collection_numbers_limit() {1595            create_test_collection(&CollectionMode::NFT, i + 1);1596        }15971598        let col_name1: Vec<u16> = "Test1\0".encode_utf16().collect::<Vec<u16>>();1599        let col_desc1: Vec<u16> = "TestDescription1\0".encode_utf16().collect::<Vec<u16>>();1600        let token_prefix1: Vec<u8> = b"token_prefix1\0".to_vec();16011602        // 11-th collection in chain. Expects error1603        assert_noop!(TemplateModule::create_collection(1604            origin1.clone(),1605            col_name1.clone(),1606            col_desc1.clone(),1607            token_prefix1.clone(),1608            CollectionMode::NFT1609        ), Error::<Test>::TotalCollectionsLimitExceeded);1610    });1611}16121613// Owned tokens by a single address. Positive test1614#[test]1615fn owned_tokens_bound() {1616    new_test_ext().execute_with(|| {1617        default_limits();1618        1619        let collection_id = create_test_collection(&CollectionMode::NFT, 1);16201621        let data = default_nft_data();1622        create_test_item(collection_id, &data.clone().into());1623        create_test_item(collection_id, &data.into());1624    });1625}16261627// Owned tokens by a single address. Negotive test1628#[test]1629fn owned_tokens_bound_neg() {1630    new_test_ext().execute_with(|| {1631        assert_ok!(TemplateModule::set_chain_limits(RawOrigin::Root.into(), ChainLimits { 1632            collection_numbers_limit: 10,1633            account_token_ownership_limit: 1,1634            collections_admins_limit: 5,1635            custom_data_limit: 2048,1636            nft_sponsor_transfer_timeout: 15,1637            fungible_sponsor_transfer_timeout: 15,1638            refungible_sponsor_transfer_timeout: 15,          1639        }));1640        1641        let collection_id = create_test_collection(&CollectionMode::NFT, 1);16421643        let origin1 = Origin::signed(1);1644        let data = default_nft_data();1645        create_test_item(collection_id, &data.clone().into());16461647        assert_noop!(TemplateModule::create_item(1648            origin1.clone(),1649            1,1650            1,1651            data.into()1652        ),  Error::<Test>::AddressOwnershipLimitExceeded);1653    });1654}16551656// Number of collection admins. Positive test1657#[test]1658fn collection_admins_bound() {1659    new_test_ext().execute_with(|| {1660        assert_ok!(TemplateModule::set_chain_limits(RawOrigin::Root.into(), ChainLimits { 1661            collection_numbers_limit: 10,1662            account_token_ownership_limit: 10,1663            collections_admins_limit: 2,1664            custom_data_limit: 2048,1665            nft_sponsor_transfer_timeout: 15,1666            fungible_sponsor_transfer_timeout: 15,1667            refungible_sponsor_transfer_timeout: 15,          1668        }));1669        1670        let collection_id = create_test_collection(&CollectionMode::NFT, 1);16711672        let origin1 = Origin::signed(1);1673        1674        assert_ok!(TemplateModule::add_collection_admin(origin1.clone(), collection_id, 2));1675        assert_ok!(TemplateModule::add_collection_admin(origin1.clone(), collection_id, 3));1676    });1677}16781679// Number of collection admins. Negotive test1680#[test]1681fn collection_admins_bound_neg() {1682    new_test_ext().execute_with(|| {1683        assert_ok!(TemplateModule::set_chain_limits(RawOrigin::Root.into(), ChainLimits { 1684            collection_numbers_limit: 10,1685            account_token_ownership_limit: 1,1686            collections_admins_limit: 1,1687            custom_data_limit: 2048,1688            nft_sponsor_transfer_timeout: 15,1689            fungible_sponsor_transfer_timeout: 15,1690            refungible_sponsor_transfer_timeout: 15,          1691        }));1692        1693        let collection_id = create_test_collection(&CollectionMode::NFT, 1);16941695        let origin1 = Origin::signed(1);16961697        assert_ok!(TemplateModule::add_collection_admin(origin1.clone(), collection_id, 2));1698        assert_noop!(TemplateModule::add_collection_admin(origin1.clone(), collection_id, 3), Error::<Test>::CollectionAdminsLimitExceeded);1699    });1700}17011702// NFT custom data size. Negative test const_data.1703#[test]1704fn custom_data_size_nft_const_data_bound_neg() {1705    new_test_ext().execute_with(|| {1706        assert_ok!(TemplateModule::set_chain_limits(RawOrigin::Root.into(), ChainLimits { 1707            collection_numbers_limit: 10,1708            account_token_ownership_limit: 10,1709            collections_admins_limit: 5,1710            custom_data_limit: 2,1711            nft_sponsor_transfer_timeout: 15,1712            fungible_sponsor_transfer_timeout: 15,1713            refungible_sponsor_transfer_timeout: 15,          1714        }));1715        1716        let collection_id = create_test_collection(&CollectionMode::NFT, 1);17171718        let origin1 = Origin::signed(1);1719        let too_big_const_data = CreateItemData::NFT(CreateNftData{1720            const_data: vec![1, 2, 3, 4],1721            variable_data: vec![]1722        });17231724        assert_noop!(TemplateModule::create_item(1725            origin1.clone(),1726            collection_id,1727            1,1728            too_big_const_data1729        ), Error::<Test>::TokenConstDataLimitExceeded);1730    });1731}17321733// NFT custom data size. Negative test variable_data.1734#[test]1735fn custom_data_size_nft_variable_data_bound_neg() {1736    new_test_ext().execute_with(|| {1737        assert_ok!(TemplateModule::set_chain_limits(RawOrigin::Root.into(), ChainLimits { 1738            collection_numbers_limit: 10,1739            account_token_ownership_limit: 10,1740            collections_admins_limit: 5,1741            custom_data_limit: 2,1742            nft_sponsor_transfer_timeout: 15,1743            fungible_sponsor_transfer_timeout: 15,1744            refungible_sponsor_transfer_timeout: 15,          1745        }));17461747        let collection_id = create_test_collection(&CollectionMode::NFT, 1);17481749        let origin1 = Origin::signed(1);1750        let too_big_const_data = CreateItemData::NFT(CreateNftData{1751            const_data: vec![],1752            variable_data: vec![1, 2, 3, 4]1753        });17541755        assert_noop!(TemplateModule::create_item(1756            origin1.clone(),1757            collection_id,1758            1,1759            too_big_const_data1760        ), Error::<Test>::TokenVariableDataLimitExceeded);1761    });1762}17631764// Re fungible custom data size. Negative test const_data.1765#[test]1766fn custom_data_size_re_fungible_const_data_bound_neg() {1767    new_test_ext().execute_with(|| {1768        assert_ok!(TemplateModule::set_chain_limits(RawOrigin::Root.into(), ChainLimits { 1769            collection_numbers_limit: 10,1770            account_token_ownership_limit: 10,1771            collections_admins_limit: 5,1772            custom_data_limit: 2,1773            nft_sponsor_transfer_timeout: 15,1774            fungible_sponsor_transfer_timeout: 15,1775            refungible_sponsor_transfer_timeout: 15,          1776        }));17771778        let collection_id = create_test_collection(&CollectionMode::NFT, 1);17791780        let origin1 = Origin::signed(1);1781        let too_big_const_data = CreateItemData::NFT(CreateNftData{1782            const_data: vec![1, 2, 3, 4],1783            variable_data: vec![]1784        });17851786        assert_noop!(TemplateModule::create_item(1787            origin1.clone(),1788            collection_id,1789            1,1790            too_big_const_data1791        ), Error::<Test>::TokenConstDataLimitExceeded);1792    });1793}17941795// Re fungible custom data size. Negative test variable_data.1796#[test]1797fn custom_data_size_re_fungible_variable_data_bound_neg() {1798    new_test_ext().execute_with(|| {1799        assert_ok!(TemplateModule::set_chain_limits(RawOrigin::Root.into(), ChainLimits { 1800            collection_numbers_limit: 10,1801            account_token_ownership_limit: 10,1802            collections_admins_limit: 5,1803            custom_data_limit: 2,1804            nft_sponsor_transfer_timeout: 15,1805            fungible_sponsor_transfer_timeout: 15,1806            refungible_sponsor_transfer_timeout: 15,          1807        }));18081809        let collection_id = create_test_collection(&CollectionMode::NFT, 1);18101811        let origin1 = Origin::signed(1);1812        let too_big_const_data = CreateItemData::NFT(CreateNftData{1813            const_data: vec![],1814            variable_data: vec![1, 2, 3, 4]1815        });18161817        assert_noop!(TemplateModule::create_item(1818            origin1.clone(),1819            collection_id,1820            1,1821            too_big_const_data1822        ), Error::<Test>::TokenVariableDataLimitExceeded);1823    });1824}1825// #endregion18261827#[test]1828fn set_const_on_chain_schema() {1829    new_test_ext().execute_with(|| {1830        default_limits();18311832        let collection_id = create_test_collection(&CollectionMode::NFT, 1);18331834        let origin1 = Origin::signed(1);1835        assert_ok!(TemplateModule::set_const_on_chain_schema(origin1, collection_id, b"test const on chain schema".to_vec()));18361837        assert_eq!(TemplateModule::collection(collection_id).const_on_chain_schema, b"test const on chain schema".to_vec());1838        assert_eq!(TemplateModule::collection(collection_id).variable_on_chain_schema, b"".to_vec());1839    });1840}18411842#[test]1843fn set_variable_on_chain_schema() {1844    new_test_ext().execute_with(|| {1845        default_limits();1846        1847        let collection_id = create_test_collection(&CollectionMode::NFT, 1);18481849        let origin1 = Origin::signed(1);1850        assert_ok!(TemplateModule::set_variable_on_chain_schema(origin1, collection_id, b"test variable on chain schema".to_vec()));18511852        assert_eq!(TemplateModule::collection(collection_id).const_on_chain_schema, b"".to_vec());1853        assert_eq!(TemplateModule::collection(collection_id).variable_on_chain_schema, b"test variable on chain schema".to_vec());1854    });1855}18561857#[test]1858fn set_variable_meta_data_on_nft_token_stores_variable_meta_data() {1859    new_test_ext().execute_with(|| {1860        default_limits();18611862        let collection_id = create_test_collection(&CollectionMode::NFT, 1);18631864        let origin1 = Origin::signed(1);1865        1866        let data = default_nft_data();1867        create_test_item(1, &data.into());1868        1869        let variable_data = b"test set_variable_meta_data method.".to_vec();1870        assert_ok!(TemplateModule::set_variable_meta_data(origin1, collection_id, 1, variable_data.clone()));18711872        assert_eq!(TemplateModule::nft_item_id(collection_id, 1).variable_data, variable_data);1873    });1874}18751876#[test]1877fn set_variable_meta_data_on_re_fungible_token_stores_variable_meta_data() {1878    new_test_ext().execute_with(|| {1879        default_limits();18801881        let collection_id = create_test_collection(&CollectionMode::ReFungible(3), 1);18821883        let origin1 = Origin::signed(1);18841885        let data = default_re_fungible_data();1886        create_test_item(1, &data.into());18871888        let variable_data = b"test set_variable_meta_data method.".to_vec();1889        assert_ok!(TemplateModule::set_variable_meta_data(origin1, collection_id, 1, variable_data.clone()));18901891        assert_eq!(TemplateModule::refungible_item_id(collection_id, 1).variable_data, variable_data);1892    });1893}189418951896#[test]1897fn set_variable_meta_data_on_fungible_token_fails() {1898    new_test_ext().execute_with(|| {1899        default_limits();19001901        let collection_id = create_test_collection(&CollectionMode::Fungible(3), 1);19021903        let origin1 = Origin::signed(1);19041905        let data = default_fungible_data();1906        create_test_item(1, &data.into());19071908        let variable_data = b"test set_variable_meta_data method.".to_vec();1909        assert_noop!(TemplateModule::set_variable_meta_data(origin1, collection_id, 1, variable_data.clone()), Error::<Test>::CantStoreMetadataInFungibleTokens);1910    });1911}19121913#[test]1914fn set_variable_meta_data_on_nft_token_fails_for_big_data() {1915    new_test_ext().execute_with(|| {1916        assert_ok!(TemplateModule::set_chain_limits(RawOrigin::Root.into(), ChainLimits { 1917            collection_numbers_limit: default_collection_numbers_limit(),1918            account_token_ownership_limit: 10,1919            collections_admins_limit: 5,1920            custom_data_limit: 10,1921            nft_sponsor_transfer_timeout: 15,1922            fungible_sponsor_transfer_timeout: 15,1923            refungible_sponsor_transfer_timeout: 15,          1924        }));19251926        let collection_id = create_test_collection(&CollectionMode::NFT, 1);19271928        let origin1 = Origin::signed(1);19291930        let data = default_nft_data();1931        create_test_item(1, &data.into());19321933        let variable_data = b"test set_variable_meta_data method, bigger than limits.".to_vec();1934        assert_noop!(TemplateModule::set_variable_meta_data(origin1, collection_id, 1, variable_data), Error::<Test>::TokenVariableDataLimitExceeded);1935    });1936}19371938#[test]1939fn set_variable_meta_data_on_re_fungible_token_fails_for_big_data() {1940    new_test_ext().execute_with(|| {1941        assert_ok!(TemplateModule::set_chain_limits(RawOrigin::Root.into(), ChainLimits { 1942            collection_numbers_limit: default_collection_numbers_limit(),1943            account_token_ownership_limit: 10,1944            collections_admins_limit: 5,1945            custom_data_limit: 10,1946            nft_sponsor_transfer_timeout: 15,1947            fungible_sponsor_transfer_timeout: 15,1948            refungible_sponsor_transfer_timeout: 15,          1949        }));195019511952        let collection_id = create_test_collection(&CollectionMode::ReFungible(3), 1);19531954        let origin1 = Origin::signed(1);19551956        let data = default_re_fungible_data();1957        create_test_item(1, &data.into());19581959        let variable_data = b"test set_variable_meta_data method, bigger than limits.".to_vec();1960        assert_noop!(TemplateModule::set_variable_meta_data(origin1, collection_id, 1, variable_data), Error::<Test>::TokenVariableDataLimitExceeded);1961    });1962}