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

difftreelog

funfible item added

str-mv2020-08-06parent: #a55594d.patch.diff
in: master

3 files changed

modifiedREADME.mddiffbeforeafterboth
--- a/README.md
+++ b/README.md
@@ -117,6 +117,20 @@
       "ReFungible": "(u32, u32)"
     }
   },
+  "Ownership": {
+    "Owner": "AccountId",
+    "Fraction": "u128"
+  },
+  "FungibleItemType": {
+    "Collection": "u64",
+    "Owner": "AccountId",
+    "Value": "u128"
+  },
+  "ReFungibleItemType": {
+    "Collection": "u64",
+    "Owner": "Vec<Ownership>",
+    "Data": "Vec<u8>"
+  },
   "NftItemType": {
     "Collection": "u64",
     "Owner": "AccountId",
modifiedpallets/nft/src/lib.rsdiffbeforeafterboth
--- a/pallets/nft/src/lib.rs
+++ b/pallets/nft/src/lib.rs
@@ -122,6 +122,13 @@
     pub data: Vec<u8>,
 }
 
+#[derive(Encode, Decode, Default, Clone, PartialEq)]
+#[cfg_attr(feature = "std", derive(Debug))]
+pub struct ApprovePermissions<AccountId> {
+    pub approved: AccountId,
+    pub amount: u64
+}
+
 pub trait Trait: system::Trait {
     type Event: From<Event<Self>> + Into<<Self as system::Trait>::Event>;
 
@@ -138,11 +145,13 @@
         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>;
 
-        // Balance owner per collection map
+        /// 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 ApprovedList get(fn approved): double_map hasher(blake2_128_concat) u64, hasher(blake2_128_concat) u64 => Vec<T::AccountId>;
 
-        // Item collections
+        /// 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>>;
+
+        /// Item collections
         pub NftItemList get(fn nft_item_id): double_map hasher(blake2_128_concat) u64, hasher(blake2_128_concat) u64 => NftItemType<T::AccountId>;
         pub FungibleItemList get(fn fungible_item_id): double_map hasher(blake2_128_concat) u64, hasher(blake2_128_concat) u64 => FungibleItemType<T::AccountId>;
         pub ReFungibleItemList get(fn refungible_item_id): double_map hasher(blake2_128_concat) u64, hasher(blake2_128_concat) u64 => ReFungibleItemType<T::AccountId>;
@@ -248,6 +257,7 @@
             let sender = ensure_signed(origin)?;
             Self::check_owner_permissions(collection_id, sender)?;
 
+            // TODO Items remove
             <AddressTokens<T>>::remove_prefix(collection_id);
             <ApprovedList<T>>::remove_prefix(collection_id);
             <Balance<T>>::remove_prefix(collection_id);
@@ -356,18 +366,18 @@
         pub fn create_item(origin, collection_id: u64, properties: Vec<u8>, owner: T::AccountId) -> DispatchResult {
 
             let sender = ensure_signed(origin)?;
-
-            // check size
             let target_collection = <Collection<T>>::get(collection_id);
-            ensure!(target_collection.custom_data_size >= properties.len() as u32, "Size of item is too large");
-
             Self::check_owner_or_admin_permissions(collection_id, sender.clone())?;
 
             // TODO: implement other modes
             match target_collection.mode 
             {
                 CollectionMode::NFT(_) => {
-                // Create nft item
+
+                    // check size
+                    ensure!(target_collection.custom_data_size >= properties.len() as u32, "Size of item is too large");
+
+                    // Create nft item
                     let item = NftItemType {
                         collection: collection_id,
                         owner: owner,
@@ -377,7 +387,24 @@
                     Self::add_nft_item(item)?;
     
                 },
+                CollectionMode::Fungible(_) => {
+
+                    // check size
+                    ensure!(properties.len() as u32 == 0, "Size of item must be 0 with fungible type");
+
+                    let item = FungibleItemType {
+                        collection: collection_id,
+                        owner: owner,
+                        value: (10 as u128).pow(target_collection.decimal_points)
+                    };
+    
+                    Self::add_fungible_item(item)?;
+                },
                 CollectionMode::ReFungible(_, _) => {
+
+                    // check size
+                    ensure!(target_collection.custom_data_size >= properties.len() as u32, "Size of item is too large");
+
                     let mut owner_list = Vec::new();
                     let value = (10 as u128).pow(target_collection.decimal_points);
                     owner_list.push(Ownership {owner: owner, fraction: value});
@@ -413,6 +440,7 @@
             match target_collection.mode 
             {
                 CollectionMode::NFT(_) => Self::burn_nft_item(collection_id, item_id)?,
+                CollectionMode::Fungible(_)  => Self::burn_fungible_item(collection_id, item_id)?,
                 CollectionMode::ReFungible(_, _)  => Self::burn_refungible_item(collection_id, item_id, sender.clone())?,
                 _ => ()
             };
@@ -435,6 +463,7 @@
             match target_collection.mode 
             {
                 CollectionMode::NFT(_) => Self::transfer_nft(collection_id, item_id, sender.clone(), recipient)?,
+                CollectionMode::Fungible(_)  => Self::transfer_fungible(collection_id, item_id, value, sender.clone(), recipient)?,
                 CollectionMode::ReFungible(_, _)  => Self::transfer_refungible(collection_id, item_id, value, sender.clone(), recipient)?,
                 _ => ()
             };
@@ -447,26 +476,26 @@
 
             let sender = ensure_signed(origin)?;
 
-            let item_owner = Self::is_item_owner(sender.clone(), collection_id, item_id);
-            if !item_owner
-            {
-                Self::check_owner_or_admin_permissions(collection_id, sender.clone())?;
-            }
+            // amount param stub
+            let amount = 100000000;
 
-            let list_exists = <ApprovedList<T>>::contains_key(collection_id, item_id);
+            ensure!(Self::is_item_owner(sender.clone(), collection_id, item_id), "Only item owner can call transfer method");
+
+            let list_exists = <ApprovedList<T>>::contains_key(collection_id, (item_id, sender.clone()));
             if list_exists {
 
-                let mut list = <ApprovedList<T>>::get(collection_id, item_id);
-                let item_contains = list.contains(&approved.clone());
+                let mut list = <ApprovedList<T>>::get(collection_id, (item_id, sender.clone()));
+                let item_contains = list.iter().any(|i| i.approved == approved);
 
                 if !item_contains {
-                    list.push(approved.clone());
+                    list.push(ApprovePermissions { approved: approved.clone(), amount: amount });
+                    <ApprovedList<T>>::insert(collection_id, (item_id, sender.clone()), list);
                 }
             } else {
 
-                let mut itm = Vec::new();
-                itm.push(approved.clone());
-                <ApprovedList<T>>::insert(collection_id, item_id, itm);
+                let mut list = Vec::new();
+                list.push(ApprovePermissions { approved: approved.clone(), amount: amount });
+                <ApprovedList<T>>::insert(collection_id, (item_id, sender.clone()), list);
             }
 
             Ok(())
@@ -475,16 +504,21 @@
         #[weight = 0]
         pub fn transfer_from(origin, from: T::AccountId, recipient: T::AccountId, collection_id: u64, item_id: u64, value: u64 ) -> DispatchResult {
 
-            let mut approved: bool = false; 
             let sender = ensure_signed(origin)?;
-            let approved_list_exists = <ApprovedList<T>>::contains_key(collection_id, item_id);
+            let approved_list_exists = <ApprovedList<T>>::contains_key(collection_id, (item_id, from.clone()));
             if approved_list_exists
             {
-                let list_itm = <ApprovedList<T>>::get(collection_id, item_id);
-                approved = list_itm.contains(&recipient.clone());
-            }
+                let list_itm = <ApprovedList<T>>::get(collection_id, (item_id, from.clone()));
+                let opt_item = list_itm.iter().find(|i| i.approved == sender.clone());
+                ensure!(opt_item.is_some(), "No approve found"); 
+                ensure!(opt_item.unwrap().amount >= value, "Requested value more than approved"); 
 
-            if !approved
+                // remove approve
+                let approve_list: Vec<ApprovePermissions<T::AccountId>> = <ApprovedList<T>>::get(collection_id, (item_id, from.clone()))
+                    .into_iter().filter(|i| i.approved != sender.clone()).collect();
+                <ApprovedList<T>>::insert(collection_id, (item_id, from.clone()), approve_list);
+            }
+            else
             {
                 Self::check_owner_or_admin_permissions(collection_id, sender)?;
             }
@@ -494,8 +528,8 @@
             match target_collection.mode
             {
                 CollectionMode::NFT(_) => Self::transfer_nft(collection_id, item_id, from, recipient)?,
-                CollectionMode::ReFungible(_, _)  => Self::transfer_refungible(collection_id, item_id, value, from, recipient)?,
-                // TODO: implement other modes
+                CollectionMode::Fungible(_)  => Self::transfer_fungible(collection_id, item_id, value, from.clone(), recipient)?,
+                CollectionMode::ReFungible(_, _)  => Self::transfer_refungible(collection_id, item_id, value, from.clone(), recipient)?,
                 _ => ()
             };
 
@@ -537,6 +571,121 @@
 
 impl<T: Trait> Module<T> {
 
+    fn add_fungible_item(item: FungibleItemType<T::AccountId>) -> DispatchResult {
+
+        let current_index = <ItemListIndex>::get(item.collection)
+        .checked_add(1)
+        .expect("Item list index id error");
+        let itemcopy = item.clone();
+        let owner = item.owner.clone();
+        let value = item.value as u64;
+
+        Self::add_token_index(item.collection, current_index, owner.clone())?;
+
+        <ItemListIndex>::insert(item.collection, current_index);
+        <FungibleItemList<T>>::insert(item.collection, current_index, itemcopy);  
+        
+        // Update balance
+       let new_balance = <Balance<T>>::get(item.collection, owner.clone()).checked_add(value).unwrap();
+       <Balance<T>>::insert(item.collection, owner.clone(), new_balance);
+
+        Ok(())
+    }
+
+    fn add_refungible_item(item: ReFungibleItemType<T::AccountId>) -> DispatchResult {
+
+        let current_index = <ItemListIndex>::get(item.collection)
+        .checked_add(1)
+        .expect("Item list index id error");
+        let itemcopy = item.clone();
+
+        let value = item.owner.first().unwrap().fraction as u64;
+        let owner = item.owner.first().unwrap().owner.clone();
+
+        Self::add_token_index(item.collection, current_index, owner.clone())?;
+
+        <ItemListIndex>::insert(item.collection, current_index);
+        <ReFungibleItemList<T>>::insert(item.collection, current_index, itemcopy);  
+        
+        // Update balance
+       let new_balance = <Balance<T>>::get(item.collection, owner.clone()).checked_add(value).unwrap();
+       <Balance<T>>::insert(item.collection, owner.clone(), new_balance);
+
+        Ok(())
+    }
+
+    fn add_nft_item(item: NftItemType<T::AccountId>) -> DispatchResult {
+
+        let current_index = <ItemListIndex>::get(item.collection)
+        .checked_add(1)
+        .expect("Item list index id error");
+
+        let item_owner = item.owner.clone();
+        let collection_id = item.collection.clone();
+        Self::add_token_index(collection_id, current_index, item.owner.clone())?;
+
+        <ItemListIndex>::insert(collection_id, current_index);
+        <NftItemList<T>>::insert(collection_id, current_index, item);
+
+        // Update balance
+        let new_balance = <Balance<T>>::get(collection_id, item_owner.clone()).checked_add(1).unwrap();
+        <Balance<T>>::insert(collection_id, item_owner.clone(), new_balance);
+
+        Ok(())
+    }
+
+    fn burn_refungible_item(collection_id: u64, item_id: u64, owner: T::AccountId) -> DispatchResult {
+  
+        let collection = <ReFungibleItemList<T>>::get(collection_id, item_id);
+        let item = collection.owner.iter().filter(|&i| i.owner == owner).next().unwrap();
+        Self::remove_token_index(collection_id, item_id, owner.clone())?;
+
+        // remove approve list
+        <ApprovedList<T>>::remove(collection_id, (item_id, owner.clone()));
+
+        // update balance
+        let new_balance = <Balance<T>>::get(collection_id, item.owner.clone()).checked_sub(item.fraction as u64).unwrap();
+        <Balance<T>>::insert(collection_id, item.owner.clone(), new_balance);
+
+
+        <ReFungibleItemList<T>>::remove(collection_id, item_id);
+
+        Ok(())
+    }
+
+    fn burn_nft_item(collection_id: u64, item_id: u64) -> DispatchResult {
+  
+        let item = <NftItemList<T>>::get(collection_id, item_id);
+        Self::remove_token_index(collection_id, item_id, item.owner.clone())?;
+
+        // remove approve list
+        <ApprovedList<T>>::remove(collection_id, (item_id, item.owner.clone()));
+
+        // update balance
+        let new_balance = <Balance<T>>::get(collection_id, item.owner.clone()).checked_sub(1).unwrap();
+        <Balance<T>>::insert(collection_id, item.owner.clone(), new_balance);
+        <NftItemList<T>>::remove(collection_id, item_id);
+
+        Ok(())
+    }
+
+    fn burn_fungible_item(collection_id: u64, item_id: u64) -> DispatchResult {
+  
+        let item = <FungibleItemList<T>>::get(collection_id, item_id);
+        Self::remove_token_index(collection_id, item_id, item.owner.clone())?;
+
+        // remove approve list
+        <ApprovedList<T>>::remove(collection_id, (item_id, item.owner.clone()));
+
+        // update balance
+        let new_balance = <Balance<T>>::get(collection_id, item.owner.clone()).checked_sub(item.value as u64).unwrap();
+        <Balance<T>>::insert(collection_id, item.owner.clone(), new_balance);
+
+        <FungibleItemList<T>>::remove(collection_id, item_id);
+
+        Ok(())        
+    }
+
     fn collection_exists(collection_id: u64) -> DispatchResult{
         ensure!(<Collection<T>>::contains_key(collection_id), "This collection does not exist");
         Ok(())
@@ -582,50 +731,90 @@
         }
     }
 
-    fn add_refungible_item(item: ReFungibleItemType<T::AccountId>) -> DispatchResult {
+    fn transfer_fungible(collection_id: u64, item_id: u64, value: u64, owner: T::AccountId, new_owner: T::AccountId) -> DispatchResult {
+        let full_item = <FungibleItemList<T>>::get(collection_id, item_id);
+        let amount = full_item.value;
+
+        ensure!(amount >= value.into(),"Item balance not enouth");
+
+        // update balance
+        let balance_old_owner = <Balance<T>>::get(collection_id, owner.clone()).checked_sub(value).unwrap();
+        <Balance<T>>::insert(collection_id, owner.clone(), balance_old_owner);
+
+        let mut new_owner_account_id = 0;
+        let new_owner_items = <AddressTokens<T>>::get(collection_id, new_owner.clone());
+        if new_owner_items.len() > 0 {
+            new_owner_account_id = new_owner_items[0];
+        }
+
+        let val64 = value.into();
 
-        let current_index = <ItemListIndex>::get(item.collection)
-        .checked_add(1)
-        .expect("Item list index id error");
+        // transfer
+        if amount == val64 && new_owner_account_id == 0
+        {
+            // change owner
+            // new owner do not have account
+            let mut new_full_item = full_item.clone();
+            new_full_item.owner = new_owner.clone();
+            <FungibleItemList<T>>::insert(collection_id, item_id, new_full_item);
 
-        let value = item.owner.first().unwrap().fraction as u64;
-        let owner = item.owner.first().unwrap().owner.clone();
+            // update balance
+            let balance_new_owner = <Balance<T>>::get(collection_id, new_owner.clone()).checked_add(value).unwrap();
+            <Balance<T>>::insert(collection_id, new_owner.clone(), balance_new_owner);
 
-        Self::add_token_index(item.collection, current_index, owner.clone())?;
+            // update index collection
+            Self::move_token_index(collection_id, item_id, owner.clone(), new_owner.clone())?;
+        }
+        else
+        {
+            let mut new_full_item = full_item.clone();
+            new_full_item.value -= val64;
 
-        <ItemListIndex>::insert(item.collection, current_index);
-        <ReFungibleItemList<T>>::insert(item.collection, current_index, item);  
-        
-        // Update balance
-        let new_balance = <Balance<T>>::get(item.collection, owner.clone()).checked_add(value).unwrap();
-        <Balance<T>>::insert(item.collection, owner.clone(), new_balance);
+            // separate amount
+            if new_owner_account_id > 0 {
+
+                // new owner has account
+                let mut item = <FungibleItemList<T>>::get(collection_id, new_owner_account_id);
+                item.value += val64;
+
+                // update balance
+                let balance_new_owner = <Balance<T>>::get(collection_id, new_owner.clone()).checked_add(value).unwrap();
+                <Balance<T>>::insert(collection_id, new_owner.clone(), balance_new_owner);
 
-        Ok(())
-    }
+                <FungibleItemList<T>>::insert(collection_id, new_owner_account_id, item);
+            }
+            else
+            {
+                // new owner do not have account
+                let item = FungibleItemType {
+                    collection: collection_id,
+                    owner: new_owner.clone(),
+                    value: val64
+                };
 
-    fn burn_refungible_item(collection_id: u64, item_id: u64, owner: T::AccountId) -> DispatchResult {
-  
-        let collection = <ReFungibleItemList<T>>::get(collection_id, item_id);
-        let item = collection.owner.iter().filter(|&i| i.owner == owner).next().unwrap();
-        Self::remove_token_index(collection_id, item_id, owner)?;
+                Self::add_fungible_item(item)?;
+            }
 
-        // update balance
-        let new_balance = <Balance<T>>::get(collection_id, item.owner.clone()).checked_sub(item.fraction as u64).unwrap();
-        <Balance<T>>::insert(collection_id, item.owner.clone(), new_balance);
+            if amount == val64{
+                Self::remove_token_index(collection_id, item_id, full_item.owner.clone())?;
+        
+                // remove approve list
+                <ApprovedList<T>>::remove(collection_id, (item_id, full_item.owner.clone()));
+                <FungibleItemList<T>>::remove(collection_id, item_id);
+            }
 
-        // TODO
-        <ReFungibleItemList<T>>::remove(collection_id, item_id);
+            <FungibleItemList<T>>::insert(collection_id, item_id, new_full_item);
+        }
 
         Ok(())
     }
 
     fn transfer_refungible(collection_id: u64, item_id: u64, value: u64, owner: T::AccountId, new_owner: T::AccountId) -> DispatchResult {
-
         let full_item = <ReFungibleItemList<T>>::get(collection_id, item_id);
         let item = full_item.owner.iter().filter(|i| i.owner == owner).next().unwrap();
         let amount = item.fraction;
 
-        ensure!(amount < value.into(),"Item balance not enouth");
+        ensure!(amount >= value.into(),"Item balance not enouth");
 
         // update balance
         let balance_old_owner = <Balance<T>>::get(collection_id, item.owner.clone()).checked_sub(value).unwrap();
@@ -636,9 +825,10 @@
 
         let old_owner = item.owner.clone();
         let new_owner_has_account = full_item.owner.iter().any(|i| i.owner == new_owner);
+        let val64 = value.into();
 
         // transfer
-        if amount == value.into() && !new_owner_has_account
+        if amount == val64 && !new_owner_has_account
         {
             // change owner
             // new owner do not have account
@@ -652,17 +842,17 @@
         else
         {
             let mut new_full_item = full_item.clone();
-            new_full_item.owner.iter_mut().find(|i| i.owner == owner).unwrap().fraction -= amount;
+            new_full_item.owner.iter_mut().find(|i| i.owner == owner).unwrap().fraction -= val64;
 
             // separate amount
             if new_owner_has_account {
                 // new owner has account
-                new_full_item.owner.iter_mut().find(|i| i.owner == new_owner).unwrap().fraction += amount;
+                new_full_item.owner.iter_mut().find(|i| i.owner == new_owner).unwrap().fraction += val64;
             }
             else
             {
                 // new owner do not have account
-                new_full_item.owner.push(Ownership { owner: new_owner.clone(), fraction: amount});
+                new_full_item.owner.push(Ownership { owner: new_owner.clone(), fraction: val64});
                 Self::add_token_index(collection_id, item_id, new_owner.clone())?;
             }
 
@@ -671,38 +861,7 @@
 
         Ok(())
     }
-    
-    fn add_nft_item(item: NftItemType<T::AccountId>) -> DispatchResult {
-
-        let current_index = <ItemListIndex>::get(item.collection)
-        .checked_add(1)
-        .expect("Item list index id error");
-
-        Self::add_token_index(item.collection, current_index, item.owner.clone())?;
-
-        <ItemListIndex>::insert(item.collection, current_index);
-        <NftItemList<T>>::insert(item.collection, current_index, item);
 
-        // Update balance
-        let new_balance = <Balance<T>>::get(item.collection, item.owner.clone()).checked_add(1).unwrap();
-        <Balance<T>>::insert(item.collection_id, item.owner.clone(), new_balance);
-
-        Ok(())
-    }
-
-    fn burn_nft_item(collection_id: u64, item_id: u64) -> DispatchResult {
-  
-        let item = <NftItemList<T>>::get(collection_id, item_id);
-        Self::remove_token_index(collection_id, item_id, item.owner.clone())?;
-
-        // update balance
-        let new_balance = <Balance<T>>::get(collection_id, item.owner.clone()).checked_sub(1).unwrap();
-        <Balance<T>>::insert(collection_id, item.owner.clone(), new_balance);
-        <NftItemList<T>>::remove(collection_id, item_id);
-
-        Ok(())
-    }
-
     fn transfer_nft(collection_id: u64, item_id: u64, sender: T::AccountId, new_owner: T::AccountId) -> DispatchResult {
 
         let mut item = <NftItemList<T>>::get(collection_id, item_id);
@@ -722,12 +881,10 @@
         <NftItemList<T>>::insert(collection_id, item_id, item);
 
         // update index collection
-        Self::move_token_index(collection_id, item_id, old_owner, new_owner.clone())?;
+        Self::move_token_index(collection_id, item_id, old_owner.clone(), new_owner.clone())?;
 
         // reset approved list
-        let itm: Vec<T::AccountId> = Vec::new();
-        <ApprovedList<T>>::insert(collection_id, item_id, itm);
-
+        <ApprovedList<T>>::remove(collection_id, (item_id, old_owner));
         Ok(())
     }
 
modifiedpallets/nft/src/tests.rsdiffbeforeafterboth
before · pallets/nft/src/tests.rs
1// Tests to be written here2use crate::mock::*;3use frame_support::{assert_noop, assert_ok};45#[test]6fn create_collection_test() {7    new_test_ext().execute_with(|| {8        let col_name1: Vec<u16> = "Test1\0".encode_utf16().collect::<Vec<u16>>();9        let col_desc1: Vec<u16> = "TestDescription1\0".encode_utf16().collect::<Vec<u16>>();10        let token_prefix1: Vec<u8> = b"token_prefix1\0".to_vec();1112        let size = 1024;13        let origin1 = Origin::signed(1);14        assert_ok!(TemplateModule::create_collection(15            origin1.clone(),16            col_name1.clone(),17            col_desc1.clone(),18            token_prefix1.clone(),19            size20        ));21        assert_eq!(TemplateModule::collection(1).owner, 1);22    });23}2425#[test]26fn change_collection_owner() {27    new_test_ext().execute_with(|| {28        let col_name1: Vec<u16> = "Test1\0".encode_utf16().collect::<Vec<u16>>();29        let col_desc1: Vec<u16> = "TestDescription1\0".encode_utf16().collect::<Vec<u16>>();30        let token_prefix1: Vec<u8> = b"token_prefix1\0".to_vec();3132        let size = 1024;33        let origin1 = Origin::signed(1);3435        assert_ok!(TemplateModule::create_collection(36            origin1.clone(),37            col_name1.clone(),38            col_desc1.clone(),39            token_prefix1.clone(),40            size41        ));42        assert_ok!(TemplateModule::change_collection_owner(43            origin1.clone(),44            1,45            246        ));47        assert_eq!(TemplateModule::collection(1).owner, 2);48    });49}5051#[test]52fn destroy_collection() {53    new_test_ext().execute_with(|| {54        let col_name1: Vec<u16> = "Test1\0".encode_utf16().collect::<Vec<u16>>();55        let col_desc1: Vec<u16> = "TestDescription1\0".encode_utf16().collect::<Vec<u16>>();56        let token_prefix1: Vec<u8> = b"token_prefix1\0".to_vec();5758        let size = 1024;59        let origin1 = Origin::signed(1);6061        assert_ok!(TemplateModule::create_collection(62            origin1.clone(),63            col_name1.clone(),64            col_desc1.clone(),65            token_prefix1.clone(),66            size67        ));68        assert_ok!(TemplateModule::destroy_collection(origin1.clone(), 1));69    });70}7172#[test]73fn create_item() {74    new_test_ext().execute_with(|| {75        let col_name1: Vec<u16> = "Test1\0".encode_utf16().collect::<Vec<u16>>();76        let col_desc1: Vec<u16> = "TestDescription1\0".encode_utf16().collect::<Vec<u16>>();77        let token_prefix1: Vec<u8> = b"token_prefix1\0".to_vec();7879        let size = 1024;80        let origin1 = Origin::signed(1);81        let origin2 = Origin::signed(2);8283        assert_ok!(TemplateModule::create_collection(84            origin1.clone(),85            col_name1.clone(),86            col_desc1.clone(),87            token_prefix1.clone(),88            size89        ));90        assert_ok!(TemplateModule::add_collection_admin(origin1.clone(), 1, 2));91        assert_ok!(TemplateModule::create_item(92            origin2.clone(),93            1,94            [1, 1, 1].to_vec()95        ));9697        // check balance (collection with id = 1, user id = 2)98        assert_eq!(TemplateModule::balance_count((1, 2)), 1);99    });100}101102#[test]103fn burn_item() {104    new_test_ext().execute_with(|| {105        let col_name1: Vec<u16> = "Test1\0".encode_utf16().collect::<Vec<u16>>();106        let col_desc1: Vec<u16> = "TestDescription1\0".encode_utf16().collect::<Vec<u16>>();107        let token_prefix1: Vec<u8> = b"token_prefix1\0".to_vec();108109        let size = 1024;110        let origin1 = Origin::signed(1);111        let origin2 = Origin::signed(2);112113        assert_ok!(TemplateModule::create_collection(114            origin1.clone(),115            col_name1.clone(),116            col_desc1.clone(),117            token_prefix1.clone(),118            size119        ));120        assert_ok!(TemplateModule::add_collection_admin(origin1.clone(), 1, 2));121        assert_ok!(TemplateModule::create_item(122            origin2.clone(),123            1,124            [1, 1, 1].to_vec()125        ));126127        // check balance (collection with id = 1, user id = 2)128        assert_eq!(TemplateModule::balance_count((1, 2)), 1);129130        // burn item131        assert_ok!(TemplateModule::burn_item(origin1.clone(), 1, 1));132        assert_noop!(133            TemplateModule::burn_item(origin1.clone(), 1, 1),134            "Item does not exists"135        );136137        assert_eq!(TemplateModule::balance_count((1, 1)), 0);138    });139}140141#[test]142fn add_collection_admin() {143    new_test_ext().execute_with(|| {144        let col_name1: Vec<u16> = "Test1\0".encode_utf16().collect::<Vec<u16>>();145        let col_desc1: Vec<u16> = "TestDescription1\0".encode_utf16().collect::<Vec<u16>>();146        let token_prefix1: Vec<u8> = b"token_prefix1\0".to_vec();147148        let size = 1024;149        let origin1 = Origin::signed(1);150        let origin2 = Origin::signed(2);151        let origin3 = Origin::signed(3);152153        assert_ok!(TemplateModule::create_collection(154            origin1.clone(),155            col_name1.clone(),156            col_desc1.clone(),157            token_prefix1.clone(),158            size159        ));160        assert_ok!(TemplateModule::create_collection(161            origin2.clone(),162            col_name1.clone(),163            col_desc1.clone(),164            token_prefix1.clone(),165            size166        ));167        assert_ok!(TemplateModule::create_collection(168            origin3.clone(),169            col_name1.clone(),170            col_desc1.clone(),171            token_prefix1.clone(),172            size173        ));174175        assert_eq!(TemplateModule::collection(1).owner, 1);176        assert_eq!(TemplateModule::collection(2).owner, 2);177        assert_eq!(TemplateModule::collection(3).owner, 3);178179        // collection admin180        assert_ok!(TemplateModule::add_collection_admin(origin1.clone(), 1, 2));181        assert_ok!(TemplateModule::add_collection_admin(origin1.clone(), 1, 3));182183        assert_eq!(TemplateModule::admin_list_collection(1).contains(&2), true);184        assert_eq!(TemplateModule::admin_list_collection(1).contains(&3), true);185    });186}187188#[test]189fn remove_collection_admin() {190    new_test_ext().execute_with(|| {191        let col_name1: Vec<u16> = "Test1\0".encode_utf16().collect::<Vec<u16>>();192        let col_desc1: Vec<u16> = "TestDescription1\0".encode_utf16().collect::<Vec<u16>>();193        let token_prefix1: Vec<u8> = b"token_prefix1\0".to_vec();194195        let size = 1024;196        let origin1 = Origin::signed(1);197        let origin2 = Origin::signed(2);198        let origin3 = Origin::signed(3);199200        assert_ok!(TemplateModule::create_collection(201            origin1.clone(),202            col_name1.clone(),203            col_desc1.clone(),204            token_prefix1.clone(),205            size206        ));207        assert_ok!(TemplateModule::create_collection(208            origin2.clone(),209            col_name1.clone(),210            col_desc1.clone(),211            token_prefix1.clone(),212            size213        ));214        assert_ok!(TemplateModule::create_collection(215            origin3.clone(),216            col_name1.clone(),217            col_desc1.clone(),218            token_prefix1.clone(),219            size220        ));221222        assert_eq!(TemplateModule::collection(1).owner, 1);223        assert_eq!(TemplateModule::collection(2).owner, 2);224        assert_eq!(TemplateModule::collection(3).owner, 3);225226        // collection admin227        assert_ok!(TemplateModule::add_collection_admin(origin1.clone(), 1, 2));228        assert_ok!(TemplateModule::add_collection_admin(origin1.clone(), 1, 3));229230        assert_eq!(TemplateModule::admin_list_collection(1).contains(&2), true);231        assert_eq!(TemplateModule::admin_list_collection(1).contains(&3), true);232233        // remove admin234        assert_ok!(TemplateModule::remove_collection_admin(235            origin2.clone(),236            1,237            3238        ));239        assert_eq!(TemplateModule::admin_list_collection(1).contains(&3), false);240    });241}242243#[test]244fn balance_of() {245    new_test_ext().execute_with(|| {246        let col_name1: Vec<u16> = "Test1\0".encode_utf16().collect::<Vec<u16>>();247        let col_desc1: Vec<u16> = "TestDescription1\0".encode_utf16().collect::<Vec<u16>>();248        let token_prefix1: Vec<u8> = b"token_prefix1\0".to_vec();249250        let size = 1024;251        let origin1 = Origin::signed(1);252        let origin2 = Origin::signed(2);253        let origin3 = Origin::signed(3);254255        assert_ok!(TemplateModule::create_collection(256            origin1.clone(),257            col_name1.clone(),258            col_desc1.clone(),259            token_prefix1.clone(),260            size261        ));262        assert_ok!(TemplateModule::create_collection(263            origin2.clone(),264            col_name1.clone(),265            col_desc1.clone(),266            token_prefix1.clone(),267            size268        ));269        assert_ok!(TemplateModule::create_collection(270            origin3.clone(),271            col_name1.clone(),272            col_desc1.clone(),273            token_prefix1.clone(),274            size275        ));276277        assert_eq!(TemplateModule::collection(1).owner, 1);278        assert_eq!(TemplateModule::collection(2).owner, 2);279        assert_eq!(TemplateModule::collection(3).owner, 3);280281        // check balance before282        assert_eq!(TemplateModule::balance_count((1, 1)), 0);283284        // create item285        assert_ok!(TemplateModule::create_item(286            origin1.clone(),287            1,288            [1, 1, 1].to_vec()289        ));290291        // check balance (collection with id = 1, user id = 2)292        assert_eq!(TemplateModule::balance_count((1, 1)), 1);293        assert_eq!(TemplateModule::item_id((1, 1)).owner, 1);294    });295}296297#[test]298fn transfer() {299    new_test_ext().execute_with(|| {300        let col_name1: Vec<u16> = "Test1\0".encode_utf16().collect::<Vec<u16>>();301        let col_desc1: Vec<u16> = "TestDescription1\0".encode_utf16().collect::<Vec<u16>>();302        let token_prefix1: Vec<u8> = b"token_prefix1\0".to_vec();303304        let size = 1024;305        let origin1 = Origin::signed(1);306        let origin2 = Origin::signed(2);307        let origin3 = Origin::signed(3);308309        assert_ok!(TemplateModule::create_collection(310            origin1.clone(),311            col_name1.clone(),312            col_desc1.clone(),313            token_prefix1.clone(),314            size315        ));316        assert_ok!(TemplateModule::create_collection(317            origin2.clone(),318            col_name1.clone(),319            col_desc1.clone(),320            token_prefix1.clone(),321            size322        ));323        assert_ok!(TemplateModule::create_collection(324            origin3.clone(),325            col_name1.clone(),326            col_desc1.clone(),327            token_prefix1.clone(),328            size329        ));330331        assert_eq!(TemplateModule::collection(1).owner, 1);332        assert_eq!(TemplateModule::collection(2).owner, 2);333        assert_eq!(TemplateModule::collection(3).owner, 3);334335        // create item336        assert_ok!(TemplateModule::create_item(337            origin1.clone(),338            1,339            [1, 1, 1].to_vec()340        ));341342        // transfer343        assert_ok!(TemplateModule::transfer(origin1.clone(), 1, 1, 2));344        assert_eq!(TemplateModule::item_id((1, 1)).owner, 2);345346        // balance_of check347        assert_eq!(TemplateModule::balance_count((1, 1)), 0);348        assert_eq!(TemplateModule::balance_count((1, 2)), 1);349    });350}351352#[test]353fn approve() {354    new_test_ext().execute_with(|| {355        let col_name1: Vec<u16> = "Test1\0".encode_utf16().collect::<Vec<u16>>();356        let col_desc1: Vec<u16> = "TestDescription1\0".encode_utf16().collect::<Vec<u16>>();357        let token_prefix1: Vec<u8> = b"token_prefix1\0".to_vec();358359        let size = 1024;360        let origin1 = Origin::signed(1);361        let origin2 = Origin::signed(2);362        let origin3 = Origin::signed(3);363364        assert_ok!(TemplateModule::create_collection(365            origin1.clone(),366            col_name1.clone(),367            col_desc1.clone(),368            token_prefix1.clone(),369            size370        ));371        assert_ok!(TemplateModule::create_collection(372            origin2.clone(),373            col_name1.clone(),374            col_desc1.clone(),375            token_prefix1.clone(),376            size377        ));378        assert_ok!(TemplateModule::create_collection(379            origin3.clone(),380            col_name1.clone(),381            col_desc1.clone(),382            token_prefix1.clone(),383            size384        ));385386        assert_eq!(TemplateModule::collection(1).owner, 1);387        assert_eq!(TemplateModule::collection(2).owner, 2);388        assert_eq!(TemplateModule::collection(3).owner, 3);389390        // create item391        assert_ok!(TemplateModule::create_item(392            origin1.clone(),393            1,394            [1, 1, 1].to_vec()395        ));396397        // approve398        assert_ok!(TemplateModule::approve(origin1.clone(), 2, 1, 1));399        assert_eq!(TemplateModule::approved((1, 1)).contains(&2), true);400    });401}402403#[test]404fn get_approved() {405    new_test_ext().execute_with(|| {406        let col_name1: Vec<u16> = "Test1\0".encode_utf16().collect::<Vec<u16>>();407        let col_desc1: Vec<u16> = "TestDescription1\0".encode_utf16().collect::<Vec<u16>>();408        let token_prefix1: Vec<u8> = b"token_prefix1\0".to_vec();409410        let size = 1024;411        let origin1 = Origin::signed(1);412        let origin2 = Origin::signed(2);413        let origin3 = Origin::signed(3);414415        assert_ok!(TemplateModule::create_collection(416            origin1.clone(),417            col_name1.clone(),418            col_desc1.clone(),419            token_prefix1.clone(),420            size421        ));422        assert_ok!(TemplateModule::create_collection(423            origin2.clone(),424            col_name1.clone(),425            col_desc1.clone(),426            token_prefix1.clone(),427            size428        ));429        assert_ok!(TemplateModule::create_collection(430            origin3.clone(),431            col_name1.clone(),432            col_desc1.clone(),433            token_prefix1.clone(),434            size435        ));436437        assert_eq!(TemplateModule::collection(1).owner, 1);438        assert_eq!(TemplateModule::collection(2).owner, 2);439        assert_eq!(TemplateModule::collection(3).owner, 3);440441        // create item442        assert_ok!(TemplateModule::create_item(443            origin1.clone(),444            1,445            [1, 1, 1].to_vec()446        ));447448        // approve449        assert_ok!(TemplateModule::approve(origin1.clone(), 2, 1, 1));450        assert_eq!(TemplateModule::approved((1, 1)).contains(&2), true);451    });452}453454#[test]455fn transfer_from() {456    new_test_ext().execute_with(|| {457        let col_name1: Vec<u16> = "Test1\0".encode_utf16().collect::<Vec<u16>>();458        let col_desc1: Vec<u16> = "TestDescription1\0".encode_utf16().collect::<Vec<u16>>();459        let token_prefix1: Vec<u8> = b"token_prefix1\0".to_vec();460461        let size = 1024;462        let origin1 = Origin::signed(1);463        let origin2 = Origin::signed(2);464        let origin3 = Origin::signed(3);465466        assert_ok!(TemplateModule::create_collection(467            origin1.clone(),468            col_name1.clone(),469            col_desc1.clone(),470            token_prefix1.clone(),471            size472        ));473        assert_ok!(TemplateModule::create_collection(474            origin2.clone(),475            col_name1.clone(),476            col_desc1.clone(),477            token_prefix1.clone(),478            size479        ));480        assert_ok!(TemplateModule::create_collection(481            origin3.clone(),482            col_name1.clone(),483            col_desc1.clone(),484            token_prefix1.clone(),485            size486        ));487488        assert_eq!(TemplateModule::collection(1).owner, 1);489        assert_eq!(TemplateModule::collection(2).owner, 2);490        assert_eq!(TemplateModule::collection(3).owner, 3);491492        // create item493        assert_ok!(TemplateModule::create_item(494            origin1.clone(),495            1,496            [1, 1, 1].to_vec()497        ));498499        // approve500        assert_ok!(TemplateModule::approve(origin1.clone(), 2, 1, 1));501        assert_ok!(TemplateModule::transfer_from(origin1.clone(), 1, 1, 2));502    });503}504505#[test]506fn index_list() {507    new_test_ext().execute_with(|| {508        let col_name1: Vec<u16> = "Test1\0".encode_utf16().collect::<Vec<u16>>();509        let col_desc1: Vec<u16> = "TestDescription1\0".encode_utf16().collect::<Vec<u16>>();510        let token_prefix1: Vec<u8> = b"token_prefix1\0".to_vec();511512        let size = 1024;513        let origin1 = Origin::signed(1);514        let origin2 = Origin::signed(2);515        let origin3 = Origin::signed(3);516517        assert_ok!(TemplateModule::create_collection(518            origin1.clone(),519            col_name1.clone(),520            col_desc1.clone(),521            token_prefix1.clone(),522            size523        ));524        assert_ok!(TemplateModule::create_collection(525            origin2.clone(),526            col_name1.clone(),527            col_desc1.clone(),528            token_prefix1.clone(),529            size530        ));531        assert_ok!(TemplateModule::create_collection(532            origin3.clone(),533            col_name1.clone(),534            col_desc1.clone(),535            token_prefix1.clone(),536            size537        ));538539        assert_eq!(TemplateModule::collection(1).owner, 1);540        assert_eq!(TemplateModule::collection(2).owner, 2);541        assert_eq!(TemplateModule::collection(3).owner, 3);542        // create items543        assert_ok!(TemplateModule::create_item(544            origin1.clone(),545            1,546            [1, 1, 1].to_vec()547        ));548        assert_ok!(TemplateModule::create_item(549            origin1.clone(),550            1,551            [1, 1, 2].to_vec()552        ));553        assert_ok!(TemplateModule::create_item(554            origin1.clone(),555            1,556            [1, 2, 3].to_vec()557        ));558        assert_eq!(TemplateModule::address_tokens((1, 1)).len(), 3);559        // burn one560        assert_ok!(TemplateModule::burn_item(origin1.clone(), 1, 2));561        assert_eq!(TemplateModule::address_tokens((1, 1)).len(), 2);562        // burn another one563        assert_ok!(TemplateModule::burn_item(origin1.clone(), 1, 3));564        assert_eq!(TemplateModule::address_tokens((1, 1))[0], 1);565    });566}
after · pallets/nft/src/tests.rs
1// Tests to be written here2use crate::mock::*;3use crate::{CollectionMode, Ownership, ApprovePermissions};4use frame_support::{assert_noop, assert_ok};56#[test]7fn create_nft_item() {8    new_test_ext().execute_with(|| {9        let col_name1: Vec<u16> = "Test1\0".encode_utf16().collect::<Vec<u16>>();10        let col_desc1: Vec<u16> = "TestDescription1\0".encode_utf16().collect::<Vec<u16>>();11        let token_prefix1: Vec<u8> = b"token_prefix1\0".to_vec();12        let mode: CollectionMode = CollectionMode::NFT(2000);1314        let origin1 = Origin::signed(1);15        assert_ok!(TemplateModule::create_collection(16            origin1.clone(),17            col_name1.clone(),18            col_desc1.clone(),19            token_prefix1.clone(),20            mode21        ));22        assert_eq!(TemplateModule::collection(1).owner, 1);232425        assert_ok!(TemplateModule::create_item(origin1.clone(), 1, [1,2,3].to_vec(), 1));26        assert_eq!(TemplateModule::nft_item_id(1,1).data, [1,2,3].to_vec());27    });28}2930#[test]31fn create_refungible_item() {32    new_test_ext().execute_with(|| {33        let col_name1: Vec<u16> = "Test1\0".encode_utf16().collect::<Vec<u16>>();34        let col_desc1: Vec<u16> = "TestDescription1\0".encode_utf16().collect::<Vec<u16>>();35        let token_prefix1: Vec<u8> = b"token_prefix1\0".to_vec();36        let mode: CollectionMode = CollectionMode::ReFungible(2000, 3);3738        let origin1 = Origin::signed(1);39        assert_ok!(TemplateModule::create_collection(40            origin1.clone(),41            col_name1.clone(),42            col_desc1.clone(),43            token_prefix1.clone(),44            mode45        ));46        assert_eq!(TemplateModule::collection(1).owner, 1);474849        assert_ok!(TemplateModule::create_item(origin1.clone(), 1, [1,2,3].to_vec(), 1));50        assert_eq!(TemplateModule::refungible_item_id(1,1).data, [1,2,3].to_vec());51        assert_eq!(TemplateModule::refungible_item_id(1,1).owner[0], Ownership { owner: 1, fraction: 1000 });52    });53}5455#[test]56fn create_fungible_item() {57    new_test_ext().execute_with(|| {58        let col_name1: Vec<u16> = "Test1\0".encode_utf16().collect::<Vec<u16>>();59        let col_desc1: Vec<u16> = "TestDescription1\0".encode_utf16().collect::<Vec<u16>>();60        let token_prefix1: Vec<u8> = b"token_prefix1\0".to_vec();61        let mode: CollectionMode = CollectionMode::Fungible(3);6263        let origin1 = Origin::signed(1);64        assert_ok!(TemplateModule::create_collection(65            origin1.clone(),66            col_name1.clone(),67            col_desc1.clone(),68            token_prefix1.clone(),69            mode70        ));71        assert_eq!(TemplateModule::collection(1).owner, 1);7273        assert_ok!(TemplateModule::create_item(origin1.clone(), 1, [].to_vec(), 1));74        assert_eq!(TemplateModule::fungible_item_id(1,1).owner, 1);75        assert_eq!(TemplateModule::balance_count(1,1), 1000);76        assert_eq!(TemplateModule::address_tokens(1,1), [1]);77    });78}7980#[test]81fn transfer_fungible_item() {82    new_test_ext().execute_with(|| {83        let col_name1: Vec<u16> = "Test1\0".encode_utf16().collect::<Vec<u16>>();84        let col_desc1: Vec<u16> = "TestDescription1\0".encode_utf16().collect::<Vec<u16>>();85        let token_prefix1: Vec<u8> = b"token_prefix1\0".to_vec();86        let mode: CollectionMode = CollectionMode::Fungible(3);8788        let origin1 = Origin::signed(1);89        let origin2 = Origin::signed(2);90        assert_ok!(TemplateModule::create_collection(91            origin1.clone(),92            col_name1.clone(),93            col_desc1.clone(),94            token_prefix1.clone(),95            mode96        ));97        assert_eq!(TemplateModule::collection(1).owner, 1);9899        assert_ok!(TemplateModule::create_item(origin1.clone(), 1, [].to_vec(), 1));100        assert_eq!(TemplateModule::fungible_item_id(1,1).owner, 1);101        assert_eq!(TemplateModule::balance_count(1,1), 1000);102        assert_eq!(TemplateModule::address_tokens(1,1), [1]);103104        // change owner scenario105        assert_ok!(TemplateModule::transfer(origin1.clone(), 2, 1, 1, 1000));106        assert_eq!(TemplateModule::fungible_item_id(1,1).owner, 2);107        assert_eq!(TemplateModule::fungible_item_id(1,1).value, 1000);108        assert_eq!(TemplateModule::balance_count(1,1), 0);109        assert_eq!(TemplateModule::balance_count(1,2), 1000);110        assert_eq!(TemplateModule::address_tokens(1,1), []);111        assert_eq!(TemplateModule::address_tokens(1,2), [1]);112113        // split item scenario114        assert_ok!(TemplateModule::transfer(origin2.clone(), 3, 1, 1, 500));115        assert_eq!(TemplateModule::fungible_item_id(1,1).owner, 2);116        assert_eq!(TemplateModule::fungible_item_id(1,2).owner, 3);117        assert_eq!(TemplateModule::balance_count(1,2), 500);118        assert_eq!(TemplateModule::balance_count(1,3), 500);119        assert_eq!(TemplateModule::address_tokens(1,2), [1]);120        assert_eq!(TemplateModule::address_tokens(1,3), [2]);121122        // split item and new owner has account scenario123        assert_ok!(TemplateModule::transfer(origin2.clone(), 3, 1, 1, 200));124        assert_eq!(TemplateModule::fungible_item_id(1,1).value, 300);125        assert_eq!(TemplateModule::fungible_item_id(1,2).value, 700);126        assert_eq!(TemplateModule::balance_count(1,2), 300);127        assert_eq!(TemplateModule::balance_count(1,3), 700);128        assert_eq!(TemplateModule::address_tokens(1,2), [1]);129        assert_eq!(TemplateModule::address_tokens(1,3), [2]);130    });131}132133#[test]134fn transfer_refungible_item() {135    new_test_ext().execute_with(|| {136        let col_name1: Vec<u16> = "Test1\0".encode_utf16().collect::<Vec<u16>>();137        let col_desc1: Vec<u16> = "TestDescription1\0".encode_utf16().collect::<Vec<u16>>();138        let token_prefix1: Vec<u8> = b"token_prefix1\0".to_vec();139        let mode: CollectionMode = CollectionMode::ReFungible(2000, 3);140141        let origin1 = Origin::signed(1);142        let origin2 = Origin::signed(2);143        assert_ok!(TemplateModule::create_collection(144            origin1.clone(),145            col_name1.clone(),146            col_desc1.clone(),147            token_prefix1.clone(),148            mode149        ));150        assert_eq!(TemplateModule::collection(1).owner, 1);151152        assert_ok!(TemplateModule::create_item(origin1.clone(), 1, [1,2,3].to_vec(), 1));153        assert_eq!(TemplateModule::refungible_item_id(1,1).data, [1,2,3].to_vec());154        assert_eq!(TemplateModule::refungible_item_id(1,1).owner[0], Ownership { owner: 1, fraction: 1000 });155        assert_eq!(TemplateModule::balance_count(1,1), 1000);156        assert_eq!(TemplateModule::address_tokens(1,1), [1]);157158        // change owner scenario159        assert_ok!(TemplateModule::transfer(origin1.clone(), 2, 1, 1, 1000));160        assert_eq!(TemplateModule::refungible_item_id(1,1).owner[0], Ownership { owner: 2, fraction: 1000 });161        assert_eq!(TemplateModule::balance_count(1,1), 0);162        assert_eq!(TemplateModule::balance_count(1,2), 1000);163        assert_eq!(TemplateModule::address_tokens(1,1), []);164        assert_eq!(TemplateModule::address_tokens(1,2), [1]);165166        // split item scenario167        assert_ok!(TemplateModule::transfer(origin2.clone(), 3, 1, 1, 500));168        assert_eq!(TemplateModule::refungible_item_id(1,1).owner[0], Ownership { owner: 2, fraction: 500 });169        assert_eq!(TemplateModule::refungible_item_id(1,1).owner[1], Ownership { owner: 3, fraction: 500 });170        assert_eq!(TemplateModule::balance_count(1,2), 500);171        assert_eq!(TemplateModule::balance_count(1,3), 500);172        assert_eq!(TemplateModule::address_tokens(1,2), [1]);173        assert_eq!(TemplateModule::address_tokens(1,3), [1]);174175        // split item and new owner has account scenario176        assert_ok!(TemplateModule::transfer(origin2.clone(), 3, 1, 1, 200));177        assert_eq!(TemplateModule::refungible_item_id(1,1).owner[0], Ownership { owner: 2, fraction: 300 });178        assert_eq!(TemplateModule::refungible_item_id(1,1).owner[1], Ownership { owner: 3, fraction: 700 });179        assert_eq!(TemplateModule::balance_count(1,2), 300);180        assert_eq!(TemplateModule::balance_count(1,3), 700);181        assert_eq!(TemplateModule::address_tokens(1,2), [1]);182        assert_eq!(TemplateModule::address_tokens(1,3), [1]);183    });184}185186187#[test]188fn transfer_nft_item() {189    new_test_ext().execute_with(|| {190        let col_name1: Vec<u16> = "Test1\0".encode_utf16().collect::<Vec<u16>>();191        let col_desc1: Vec<u16> = "TestDescription1\0".encode_utf16().collect::<Vec<u16>>();192        let token_prefix1: Vec<u8> = b"token_prefix1\0".to_vec();193        let mode: CollectionMode = CollectionMode::NFT(2000);194195        let origin1 = Origin::signed(1);196        assert_ok!(TemplateModule::create_collection(197            origin1.clone(),198            col_name1.clone(),199            col_desc1.clone(),200            token_prefix1.clone(),201            mode202        ));203        assert_eq!(TemplateModule::collection(1).owner, 1);204205206        assert_ok!(TemplateModule::create_item(origin1.clone(), 1, [1,2,3].to_vec(), 1));207        assert_eq!(TemplateModule::nft_item_id(1,1).data, [1,2,3].to_vec());208        assert_eq!(TemplateModule::balance_count(1,1), 1);209        assert_eq!(TemplateModule::address_tokens(1,1), [1]);210211        // default scenario212        assert_ok!(TemplateModule::transfer(origin1.clone(), 2, 1, 1, 1000));213        assert_eq!(TemplateModule::nft_item_id(1,1).owner, 2);214        assert_eq!(TemplateModule::balance_count(1,1), 0);215        assert_eq!(TemplateModule::balance_count(1,2), 1);216        assert_eq!(TemplateModule::address_tokens(1,1), []);217        assert_eq!(TemplateModule::address_tokens(1,2), [1]); 218    });219}220221#[test]222fn nft_approve_and_transfer_from() {223    new_test_ext().execute_with(|| {224        let col_name1: Vec<u16> = "Test1\0".encode_utf16().collect::<Vec<u16>>();225        let col_desc1: Vec<u16> = "TestDescription1\0".encode_utf16().collect::<Vec<u16>>();226        let token_prefix1: Vec<u8> = b"token_prefix1\0".to_vec();227        let mode: CollectionMode = CollectionMode::NFT(2000);228229        let origin1 = Origin::signed(1);230        let origin2 = Origin::signed(2);231        assert_ok!(TemplateModule::create_collection(232            origin1.clone(),233            col_name1.clone(),234            col_desc1.clone(),235            token_prefix1.clone(),236            mode237        ));238        assert_eq!(TemplateModule::collection(1).owner, 1);239240241        assert_ok!(TemplateModule::create_item(origin1.clone(), 1, [1,2,3].to_vec(), 1));242        assert_eq!(TemplateModule::nft_item_id(1,1).data, [1,2,3].to_vec());243        assert_eq!(TemplateModule::balance_count(1,1), 1);244        assert_eq!(TemplateModule::address_tokens(1,1), [1]);245246        assert_noop!(247            TemplateModule::transfer_from(origin2.clone(), 1, 3, 1, 1, 1),248            "You do not have permissions to modify this collection"249        );250251        // do approve252        assert_ok!(TemplateModule::approve(origin1.clone(), 2, 1, 1));253        assert_eq!(TemplateModule::approved(1,(1,1)).len(), 1);254        assert_ok!(TemplateModule::approve(origin1.clone(), 10, 1, 1));255        assert_eq!(TemplateModule::approved(1,(1,1)).len(), 2);256        assert_eq!(TemplateModule::approved(1,(1,1))[0], ApprovePermissions { approved: 2, amount: 100000000});257258        assert_ok!(TemplateModule::transfer_from(origin2.clone(), 1, 3, 1, 1, 1));259        assert_eq!(TemplateModule::approved(1,(1,1)).len(), 0);260    });261}262263#[test]264fn refungible_approve_and_transfer_from() {265    new_test_ext().execute_with(|| {266        let col_name1: Vec<u16> = "Test1\0".encode_utf16().collect::<Vec<u16>>();267        let col_desc1: Vec<u16> = "TestDescription1\0".encode_utf16().collect::<Vec<u16>>();268        let token_prefix1: Vec<u8> = b"token_prefix1\0".to_vec();269        let mode: CollectionMode = CollectionMode::ReFungible(2000, 3);270271        let origin1 = Origin::signed(1);272        let origin2 = Origin::signed(2);273        assert_ok!(TemplateModule::create_collection(274            origin1.clone(),275            col_name1.clone(),276            col_desc1.clone(),277            token_prefix1.clone(),278            mode279        ));280        assert_eq!(TemplateModule::collection(1).owner, 1);281282        assert_ok!(TemplateModule::create_item(origin1.clone(), 1, [1,2,3].to_vec(), 1));283        assert_eq!(TemplateModule::refungible_item_id(1,1).data, [1,2,3].to_vec());284        assert_eq!(TemplateModule::refungible_item_id(1,1).owner[0], Ownership { owner: 1, fraction: 1000 });285        assert_eq!(TemplateModule::balance_count(1,1), 1000);286        assert_eq!(TemplateModule::address_tokens(1,1), [1]);287288        assert_noop!(289            TemplateModule::transfer_from(origin2.clone(), 1, 3, 1, 1, 1),290            "You do not have permissions to modify this collection"291        );292293        // do approve294        assert_ok!(TemplateModule::approve(origin1.clone(), 2, 1, 1));295        assert_eq!(TemplateModule::approved(1,(1,1)).len(), 1);296        assert_ok!(TemplateModule::approve(origin1.clone(), 10, 1, 1));297        assert_eq!(TemplateModule::approved(1,(1,1)).len(), 2);298        assert_eq!(TemplateModule::approved(1,(1,1))[0], ApprovePermissions { approved: 2, amount: 100000000});299300        assert_ok!(TemplateModule::transfer_from(origin2.clone(), 1, 3, 1, 1, 100));301        assert_eq!(TemplateModule::balance_count(1,1), 900);302        assert_eq!(TemplateModule::balance_count(1,3), 100);303        assert_eq!(TemplateModule::address_tokens(1,1), [1]);304        assert_eq!(TemplateModule::address_tokens(1,3), [1]);305306        assert_eq!(TemplateModule::approved(1,(1,1)).len(), 1);307        assert_eq!(TemplateModule::approved(1,(1,1))[0], ApprovePermissions { approved: 10, amount: 100000000});308    });309}310311#[test]312fn fungible_approve_and_transfer_from() {313    new_test_ext().execute_with(|| {314        let col_name1: Vec<u16> = "Test1\0".encode_utf16().collect::<Vec<u16>>();315        let col_desc1: Vec<u16> = "TestDescription1\0".encode_utf16().collect::<Vec<u16>>();316        let token_prefix1: Vec<u8> = b"token_prefix1\0".to_vec();317        let mode: CollectionMode = CollectionMode::Fungible(3);318319        let origin1 = Origin::signed(1);320        let origin2 = Origin::signed(2);321        assert_ok!(TemplateModule::create_collection(322            origin1.clone(),323            col_name1.clone(),324            col_desc1.clone(),325            token_prefix1.clone(),326            mode327        ));328        assert_eq!(TemplateModule::collection(1).owner, 1);329330        assert_ok!(TemplateModule::create_item(origin1.clone(), 1, [].to_vec(), 1));331        assert_eq!(TemplateModule::fungible_item_id(1,1).owner, 1);332        assert_eq!(TemplateModule::balance_count(1,1), 1000);333        assert_eq!(TemplateModule::address_tokens(1,1), [1]);334335        assert_noop!(336            TemplateModule::transfer_from(origin2.clone(), 1, 3, 1, 1, 1),337            "You do not have permissions to modify this collection"338        );339340        // do approve341        assert_ok!(TemplateModule::approve(origin1.clone(), 2, 1, 1));342        assert_eq!(TemplateModule::approved(1,(1,1)).len(), 1);343        assert_ok!(TemplateModule::approve(origin1.clone(), 10, 1, 1));344        assert_eq!(TemplateModule::approved(1,(1,1)).len(), 2);345        assert_eq!(TemplateModule::approved(1,(1,1))[0], ApprovePermissions { approved: 2, amount: 100000000});346347        assert_ok!(TemplateModule::transfer_from(origin2.clone(), 1, 3, 1, 1, 100));348        assert_eq!(TemplateModule::balance_count(1,1), 900);349        assert_eq!(TemplateModule::balance_count(1,3), 100);350        assert_eq!(TemplateModule::address_tokens(1,1), [1]);351        assert_eq!(TemplateModule::address_tokens(1,3), [2]);352353        assert_eq!(TemplateModule::approved(1,(1,1)).len(), 1);354        assert_eq!(TemplateModule::approved(1,(1,1))[0], ApprovePermissions { approved: 10, amount: 100000000});355356        assert_ok!(TemplateModule::approve(origin1.clone(), 2, 1, 1));357        assert_ok!(TemplateModule::transfer_from(origin2.clone(), 1, 3, 1, 1, 900));358        assert_eq!(TemplateModule::balance_count(1,1), 0);359        assert_eq!(TemplateModule::balance_count(1,3), 1000);360        assert_eq!(TemplateModule::address_tokens(1,1), []);361        assert_eq!(TemplateModule::address_tokens(1,3), [2]);362363        assert_eq!(TemplateModule::approved(1,(1,1)).len(), 0);364    });365}366367368369370371372373374375376377378379380381382// #[test]383// fn create_collection_test() {384//     new_test_ext().execute_with(|| {385//         let col_name1: Vec<u16> = "Test1\0".encode_utf16().collect::<Vec<u16>>();386//         let col_desc1: Vec<u16> = "TestDescription1\0".encode_utf16().collect::<Vec<u16>>();387//         let token_prefix1: Vec<u8> = b"token_prefix1\0".to_vec();388389//         let size = 1024;390//         let origin1 = Origin::signed(1);391//         assert_ok!(TemplateModule::create_collection(392//             origin1.clone(),393//             col_name1.clone(),394//             col_desc1.clone(),395//             token_prefix1.clone(),396//             size397//         ));398//         assert_eq!(TemplateModule::collection(1).owner, 1);399//     });400// }401402// #[test]403// fn change_collection_owner() {404//     new_test_ext().execute_with(|| {405//         let col_name1: Vec<u16> = "Test1\0".encode_utf16().collect::<Vec<u16>>();406//         let col_desc1: Vec<u16> = "TestDescription1\0".encode_utf16().collect::<Vec<u16>>();407//         let token_prefix1: Vec<u8> = b"token_prefix1\0".to_vec();408409//         let size = 1024;410//         let origin1 = Origin::signed(1);411412//         assert_ok!(TemplateModule::create_collection(413//             origin1.clone(),414//             col_name1.clone(),415//             col_desc1.clone(),416//             token_prefix1.clone(),417//             size418//         ));419//         assert_ok!(TemplateModule::change_collection_owner(420//             origin1.clone(),421//             1,422//             2423//         ));424//         assert_eq!(TemplateModule::collection(1).owner, 2);425//     });426// }427428// #[test]429// fn destroy_collection() {430//     new_test_ext().execute_with(|| {431//         let col_name1: Vec<u16> = "Test1\0".encode_utf16().collect::<Vec<u16>>();432//         let col_desc1: Vec<u16> = "TestDescription1\0".encode_utf16().collect::<Vec<u16>>();433//         let token_prefix1: Vec<u8> = b"token_prefix1\0".to_vec();434435//         let size = 1024;436//         let origin1 = Origin::signed(1);437438//         assert_ok!(TemplateModule::create_collection(439//             origin1.clone(),440//             col_name1.clone(),441//             col_desc1.clone(),442//             token_prefix1.clone(),443//             size444//         ));445//         assert_ok!(TemplateModule::destroy_collection(origin1.clone(), 1));446//     });447// }448449// #[test]450// fn create_item() {451//     new_test_ext().execute_with(|| {452//         let col_name1: Vec<u16> = "Test1\0".encode_utf16().collect::<Vec<u16>>();453//         let col_desc1: Vec<u16> = "TestDescription1\0".encode_utf16().collect::<Vec<u16>>();454//         let token_prefix1: Vec<u8> = b"token_prefix1\0".to_vec();455456//         let size = 1024;457//         let origin1 = Origin::signed(1);458//         let origin2 = Origin::signed(2);459460//         assert_ok!(TemplateModule::create_collection(461//             origin1.clone(),462//             col_name1.clone(),463//             col_desc1.clone(),464//             token_prefix1.clone(),465//             size466//         ));467//         assert_ok!(TemplateModule::add_collection_admin(origin1.clone(), 1, 2));468//         assert_ok!(TemplateModule::create_item(469//             origin2.clone(),470//             1,471//             [1, 1, 1].to_vec()472//         ));473474//         // check balance (collection with id = 1, user id = 2)475//         assert_eq!(TemplateModule::balance_count((1, 2)), 1);476//     });477// }478479// #[test]480// fn burn_item() {481//     new_test_ext().execute_with(|| {482//         let col_name1: Vec<u16> = "Test1\0".encode_utf16().collect::<Vec<u16>>();483//         let col_desc1: Vec<u16> = "TestDescription1\0".encode_utf16().collect::<Vec<u16>>();484//         let token_prefix1: Vec<u8> = b"token_prefix1\0".to_vec();485486//         let size = 1024;487//         let origin1 = Origin::signed(1);488//         let origin2 = Origin::signed(2);489490//         assert_ok!(TemplateModule::create_collection(491//             origin1.clone(),492//             col_name1.clone(),493//             col_desc1.clone(),494//             token_prefix1.clone(),495//             size496//         ));497//         assert_ok!(TemplateModule::add_collection_admin(origin1.clone(), 1, 2));498//         assert_ok!(TemplateModule::create_item(499//             origin2.clone(),500//             1,501//             [1, 1, 1].to_vec()502//         ));503504//         // check balance (collection with id = 1, user id = 2)505//         assert_eq!(TemplateModule::balance_count((1, 2)), 1);506507//         // burn item508//         assert_ok!(TemplateModule::burn_item(origin1.clone(), 1, 1));509//         assert_noop!(510//             TemplateModule::burn_item(origin1.clone(), 1, 1),511//             "Item does not exists"512//         );513514//         assert_eq!(TemplateModule::balance_count((1, 1)), 0);515//     });516// }517518// #[test]519// fn add_collection_admin() {520//     new_test_ext().execute_with(|| {521//         let col_name1: Vec<u16> = "Test1\0".encode_utf16().collect::<Vec<u16>>();522//         let col_desc1: Vec<u16> = "TestDescription1\0".encode_utf16().collect::<Vec<u16>>();523//         let token_prefix1: Vec<u8> = b"token_prefix1\0".to_vec();524525//         let size = 1024;526//         let origin1 = Origin::signed(1);527//         let origin2 = Origin::signed(2);528//         let origin3 = Origin::signed(3);529530//         assert_ok!(TemplateModule::create_collection(531//             origin1.clone(),532//             col_name1.clone(),533//             col_desc1.clone(),534//             token_prefix1.clone(),535//             size536//         ));537//         assert_ok!(TemplateModule::create_collection(538//             origin2.clone(),539//             col_name1.clone(),540//             col_desc1.clone(),541//             token_prefix1.clone(),542//             size543//         ));544//         assert_ok!(TemplateModule::create_collection(545//             origin3.clone(),546//             col_name1.clone(),547//             col_desc1.clone(),548//             token_prefix1.clone(),549//             size550//         ));551552//         assert_eq!(TemplateModule::collection(1).owner, 1);553//         assert_eq!(TemplateModule::collection(2).owner, 2);554//         assert_eq!(TemplateModule::collection(3).owner, 3);555556//         // collection admin557//         assert_ok!(TemplateModule::add_collection_admin(origin1.clone(), 1, 2));558//         assert_ok!(TemplateModule::add_collection_admin(origin1.clone(), 1, 3));559560//         assert_eq!(TemplateModule::admin_list_collection(1).contains(&2), true);561//         assert_eq!(TemplateModule::admin_list_collection(1).contains(&3), true);562//     });563// }564565// #[test]566// fn remove_collection_admin() {567//     new_test_ext().execute_with(|| {568//         let col_name1: Vec<u16> = "Test1\0".encode_utf16().collect::<Vec<u16>>();569//         let col_desc1: Vec<u16> = "TestDescription1\0".encode_utf16().collect::<Vec<u16>>();570//         let token_prefix1: Vec<u8> = b"token_prefix1\0".to_vec();571572//         let size = 1024;573//         let origin1 = Origin::signed(1);574//         let origin2 = Origin::signed(2);575//         let origin3 = Origin::signed(3);576577//         assert_ok!(TemplateModule::create_collection(578//             origin1.clone(),579//             col_name1.clone(),580//             col_desc1.clone(),581//             token_prefix1.clone(),582//             size583//         ));584//         assert_ok!(TemplateModule::create_collection(585//             origin2.clone(),586//             col_name1.clone(),587//             col_desc1.clone(),588//             token_prefix1.clone(),589//             size590//         ));591//         assert_ok!(TemplateModule::create_collection(592//             origin3.clone(),593//             col_name1.clone(),594//             col_desc1.clone(),595//             token_prefix1.clone(),596//             size597//         ));598599//         assert_eq!(TemplateModule::collection(1).owner, 1);600//         assert_eq!(TemplateModule::collection(2).owner, 2);601//         assert_eq!(TemplateModule::collection(3).owner, 3);602603//         // collection admin604//         assert_ok!(TemplateModule::add_collection_admin(origin1.clone(), 1, 2));605//         assert_ok!(TemplateModule::add_collection_admin(origin1.clone(), 1, 3));606607//         assert_eq!(TemplateModule::admin_list_collection(1).contains(&2), true);608//         assert_eq!(TemplateModule::admin_list_collection(1).contains(&3), true);609610//         // remove admin611//         assert_ok!(TemplateModule::remove_collection_admin(612//             origin2.clone(),613//             1,614//             3615//         ));616//         assert_eq!(TemplateModule::admin_list_collection(1).contains(&3), false);617//     });618// }619620// #[test]621// fn balance_of() {622//     new_test_ext().execute_with(|| {623//         let col_name1: Vec<u16> = "Test1\0".encode_utf16().collect::<Vec<u16>>();624//         let col_desc1: Vec<u16> = "TestDescription1\0".encode_utf16().collect::<Vec<u16>>();625//         let token_prefix1: Vec<u8> = b"token_prefix1\0".to_vec();626627//         let size = 1024;628//         let origin1 = Origin::signed(1);629//         let origin2 = Origin::signed(2);630//         let origin3 = Origin::signed(3);631632//         assert_ok!(TemplateModule::create_collection(633//             origin1.clone(),634//             col_name1.clone(),635//             col_desc1.clone(),636//             token_prefix1.clone(),637//             size638//         ));639//         assert_ok!(TemplateModule::create_collection(640//             origin2.clone(),641//             col_name1.clone(),642//             col_desc1.clone(),643//             token_prefix1.clone(),644//             size645//         ));646//         assert_ok!(TemplateModule::create_collection(647//             origin3.clone(),648//             col_name1.clone(),649//             col_desc1.clone(),650//             token_prefix1.clone(),651//             size652//         ));653654//         assert_eq!(TemplateModule::collection(1).owner, 1);655//         assert_eq!(TemplateModule::collection(2).owner, 2);656//         assert_eq!(TemplateModule::collection(3).owner, 3);657658//         // check balance before659//         assert_eq!(TemplateModule::balance_count((1, 1)), 0);660661//         // create item662//         assert_ok!(TemplateModule::create_item(663//             origin1.clone(),664//             1,665//             [1, 1, 1].to_vec()666//         ));667668//         // check balance (collection with id = 1, user id = 2)669//         assert_eq!(TemplateModule::balance_count((1, 1)), 1);670//         assert_eq!(TemplateModule::item_id((1, 1)).owner, 1);671//     });672// }673674// #[test]675// fn transfer() {676//     new_test_ext().execute_with(|| {677//         let col_name1: Vec<u16> = "Test1\0".encode_utf16().collect::<Vec<u16>>();678//         let col_desc1: Vec<u16> = "TestDescription1\0".encode_utf16().collect::<Vec<u16>>();679//         let token_prefix1: Vec<u8> = b"token_prefix1\0".to_vec();680681//         let size = 1024;682//         let origin1 = Origin::signed(1);683//         let origin2 = Origin::signed(2);684//         let origin3 = Origin::signed(3);685686//         assert_ok!(TemplateModule::create_collection(687//             origin1.clone(),688//             col_name1.clone(),689//             col_desc1.clone(),690//             token_prefix1.clone(),691//             size692//         ));693//         assert_ok!(TemplateModule::create_collection(694//             origin2.clone(),695//             col_name1.clone(),696//             col_desc1.clone(),697//             token_prefix1.clone(),698//             size699//         ));700//         assert_ok!(TemplateModule::create_collection(701//             origin3.clone(),702//             col_name1.clone(),703//             col_desc1.clone(),704//             token_prefix1.clone(),705//             size706//         ));707708//         assert_eq!(TemplateModule::collection(1).owner, 1);709//         assert_eq!(TemplateModule::collection(2).owner, 2);710//         assert_eq!(TemplateModule::collection(3).owner, 3);711712//         // create item713//         assert_ok!(TemplateModule::create_item(714//             origin1.clone(),715//             1,716//             [1, 1, 1].to_vec()717//         ));718719//         // transfer720//         assert_ok!(TemplateModule::transfer(origin1.clone(), 1, 1, 2));721//         assert_eq!(TemplateModule::item_id((1, 1)).owner, 2);722723//         // balance_of check724//         assert_eq!(TemplateModule::balance_count((1, 1)), 0);725//         assert_eq!(TemplateModule::balance_count((1, 2)), 1);726//     });727// }728729// #[test]730// fn approve() {731//     new_test_ext().execute_with(|| {732//         let col_name1: Vec<u16> = "Test1\0".encode_utf16().collect::<Vec<u16>>();733//         let col_desc1: Vec<u16> = "TestDescription1\0".encode_utf16().collect::<Vec<u16>>();734//         let token_prefix1: Vec<u8> = b"token_prefix1\0".to_vec();735736//         let size = 1024;737//         let origin1 = Origin::signed(1);738//         let origin2 = Origin::signed(2);739//         let origin3 = Origin::signed(3);740741//         assert_ok!(TemplateModule::create_collection(742//             origin1.clone(),743//             col_name1.clone(),744//             col_desc1.clone(),745//             token_prefix1.clone(),746//             size747//         ));748//         assert_ok!(TemplateModule::create_collection(749//             origin2.clone(),750//             col_name1.clone(),751//             col_desc1.clone(),752//             token_prefix1.clone(),753//             size754//         ));755//         assert_ok!(TemplateModule::create_collection(756//             origin3.clone(),757//             col_name1.clone(),758//             col_desc1.clone(),759//             token_prefix1.clone(),760//             size761//         ));762763//         assert_eq!(TemplateModule::collection(1).owner, 1);764//         assert_eq!(TemplateModule::collection(2).owner, 2);765//         assert_eq!(TemplateModule::collection(3).owner, 3);766767//         // create item768//         assert_ok!(TemplateModule::create_item(769//             origin1.clone(),770//             1,771//             [1, 1, 1].to_vec()772//         ));773774//         // approve775//         assert_ok!(TemplateModule::approve(origin1.clone(), 2, 1, 1));776//         assert_eq!(TemplateModule::approved((1, 1)).contains(&2), true);777//     });778// }779780// #[test]781// fn get_approved() {782//     new_test_ext().execute_with(|| {783//         let col_name1: Vec<u16> = "Test1\0".encode_utf16().collect::<Vec<u16>>();784//         let col_desc1: Vec<u16> = "TestDescription1\0".encode_utf16().collect::<Vec<u16>>();785//         let token_prefix1: Vec<u8> = b"token_prefix1\0".to_vec();786787//         let size = 1024;788//         let origin1 = Origin::signed(1);789//         let origin2 = Origin::signed(2);790//         let origin3 = Origin::signed(3);791792//         assert_ok!(TemplateModule::create_collection(793//             origin1.clone(),794//             col_name1.clone(),795//             col_desc1.clone(),796//             token_prefix1.clone(),797//             size798//         ));799//         assert_ok!(TemplateModule::create_collection(800//             origin2.clone(),801//             col_name1.clone(),802//             col_desc1.clone(),803//             token_prefix1.clone(),804//             size805//         ));806//         assert_ok!(TemplateModule::create_collection(807//             origin3.clone(),808//             col_name1.clone(),809//             col_desc1.clone(),810//             token_prefix1.clone(),811//             size812//         ));813814//         assert_eq!(TemplateModule::collection(1).owner, 1);815//         assert_eq!(TemplateModule::collection(2).owner, 2);816//         assert_eq!(TemplateModule::collection(3).owner, 3);817818//         // create item819//         assert_ok!(TemplateModule::create_item(820//             origin1.clone(),821//             1,822//             [1, 1, 1].to_vec()823//         ));824825//         // approve826//         assert_ok!(TemplateModule::approve(origin1.clone(), 2, 1, 1));827//         assert_eq!(TemplateModule::approved((1, 1)).contains(&2), true);828//     });829// }830831// #[test]832// fn transfer_from() {833//     new_test_ext().execute_with(|| {834//         let col_name1: Vec<u16> = "Test1\0".encode_utf16().collect::<Vec<u16>>();835//         let col_desc1: Vec<u16> = "TestDescription1\0".encode_utf16().collect::<Vec<u16>>();836//         let token_prefix1: Vec<u8> = b"token_prefix1\0".to_vec();837838//         let size = 1024;839//         let origin1 = Origin::signed(1);840//         let origin2 = Origin::signed(2);841//         let origin3 = Origin::signed(3);842843//         assert_ok!(TemplateModule::create_collection(844//             origin1.clone(),845//             col_name1.clone(),846//             col_desc1.clone(),847//             token_prefix1.clone(),848//             size849//         ));850//         assert_ok!(TemplateModule::create_collection(851//             origin2.clone(),852//             col_name1.clone(),853//             col_desc1.clone(),854//             token_prefix1.clone(),855//             size856//         ));857//         assert_ok!(TemplateModule::create_collection(858//             origin3.clone(),859//             col_name1.clone(),860//             col_desc1.clone(),861//             token_prefix1.clone(),862//             size863//         ));864865//         assert_eq!(TemplateModule::collection(1).owner, 1);866//         assert_eq!(TemplateModule::collection(2).owner, 2);867//         assert_eq!(TemplateModule::collection(3).owner, 3);868869//         // create item870//         assert_ok!(TemplateModule::create_item(871//             origin1.clone(),872//             1,873//             [1, 1, 1].to_vec()874//         ));875876//         // approve877//         assert_ok!(TemplateModule::approve(origin1.clone(), 2, 1, 1));878//         assert_ok!(TemplateModule::transfer_from(origin1.clone(), 1, 1, 2));879//     });880// }881882// #[test]883// fn index_list() {884//     new_test_ext().execute_with(|| {885//         let col_name1: Vec<u16> = "Test1\0".encode_utf16().collect::<Vec<u16>>();886//         let col_desc1: Vec<u16> = "TestDescription1\0".encode_utf16().collect::<Vec<u16>>();887//         let token_prefix1: Vec<u8> = b"token_prefix1\0".to_vec();888889//         let size = 1024;890//         let origin1 = Origin::signed(1);891//         let origin2 = Origin::signed(2);892//         let origin3 = Origin::signed(3);893894//         assert_ok!(TemplateModule::create_collection(895//             origin1.clone(),896//             col_name1.clone(),897//             col_desc1.clone(),898//             token_prefix1.clone(),899//             size900//         ));901//         assert_ok!(TemplateModule::create_collection(902//             origin2.clone(),903//             col_name1.clone(),904//             col_desc1.clone(),905//             token_prefix1.clone(),906//             size907//         ));908//         assert_ok!(TemplateModule::create_collection(909//             origin3.clone(),910//             col_name1.clone(),911//             col_desc1.clone(),912//             token_prefix1.clone(),913//             size914//         ));915916//         assert_eq!(TemplateModule::collection(1).owner, 1);917//         assert_eq!(TemplateModule::collection(2).owner, 2);918//         assert_eq!(TemplateModule::collection(3).owner, 3);919//         // create items920//         assert_ok!(TemplateModule::create_item(921//             origin1.clone(),922//             1,923//             [1, 1, 1].to_vec()924//         ));925//         assert_ok!(TemplateModule::create_item(926//             origin1.clone(),927//             1,928//             [1, 1, 2].to_vec()929//         ));930//         assert_ok!(TemplateModule::create_item(931//             origin1.clone(),932//             1,933//             [1, 2, 3].to_vec()934//         ));935//         assert_eq!(TemplateModule::address_tokens((1, 1)).len(), 3);936//         // burn one937//         assert_ok!(TemplateModule::burn_item(origin1.clone(), 1, 2));938//         assert_eq!(TemplateModule::address_tokens((1, 1)).len(), 2);939//         // burn another one940//         assert_ok!(TemplateModule::burn_item(origin1.clone(), 1, 3));941//         assert_eq!(TemplateModule::address_tokens((1, 1))[0], 1);942//     });943// }