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
1// Tests to be written here1// Tests to be written here
2use crate::mock::*;2use crate::mock::*;
3use crate::{CollectionMode, Ownership, ApprovePermissions};
3use frame_support::{assert_noop, assert_ok};4use frame_support::{assert_noop, assert_ok};
45
5#[test]6#[test]
6fn create_collection_test() {7fn create_nft_item() {
7 new_test_ext().execute_with(|| {8 new_test_ext().execute_with(|| {
8 let col_name1: Vec<u16> = "Test1\0".encode_utf16().collect::<Vec<u16>>();9 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 col_desc1: Vec<u16> = "TestDescription1\0".encode_utf16().collect::<Vec<u16>>();
10 let token_prefix1: Vec<u8> = b"token_prefix1\0".to_vec();11 let token_prefix1: Vec<u8> = b"token_prefix1\0".to_vec();
12 let mode: CollectionMode = CollectionMode::NFT(2000);
1113
12 let size = 1024;
13 let origin1 = Origin::signed(1);14 let origin1 = Origin::signed(1);
14 assert_ok!(TemplateModule::create_collection(15 assert_ok!(TemplateModule::create_collection(
15 origin1.clone(),16 origin1.clone(),
16 col_name1.clone(),17 col_name1.clone(),
17 col_desc1.clone(),18 col_desc1.clone(),
18 token_prefix1.clone(),19 token_prefix1.clone(),
19 size20 mode
20 ));21 ));
21 assert_eq!(TemplateModule::collection(1).owner, 1);22 assert_eq!(TemplateModule::collection(1).owner, 1);
22 });
23}
2423
25#[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();
3124
32 let size = 1024;25 assert_ok!(TemplateModule::create_item(origin1.clone(), 1, [1,2,3].to_vec(), 1));
33 let origin1 = Origin::signed(1);
34
35 assert_ok!(TemplateModule::create_collection(
36 origin1.clone(),
37 col_name1.clone(),
38 col_desc1.clone(),
39 token_prefix1.clone(),
40 size
41 ));
42 assert_ok!(TemplateModule::change_collection_owner(
43 origin1.clone(),
44 1,
45 2
46 ));
47 assert_eq!(TemplateModule::collection(1).owner, 2);26 assert_eq!(TemplateModule::nft_item_id(1,1).data, [1,2,3].to_vec());
48 });27 });
49}28}
5029
51#[test]30#[test]
52fn destroy_collection() {31fn create_refungible_item() {
53 new_test_ext().execute_with(|| {32 new_test_ext().execute_with(|| {
54 let col_name1: Vec<u16> = "Test1\0".encode_utf16().collect::<Vec<u16>>();33 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>>();34 let col_desc1: Vec<u16> = "TestDescription1\0".encode_utf16().collect::<Vec<u16>>();
56 let token_prefix1: Vec<u8> = b"token_prefix1\0".to_vec();35 let token_prefix1: Vec<u8> = b"token_prefix1\0".to_vec();
36 let mode: CollectionMode = CollectionMode::ReFungible(2000, 3);
5737
58 let size = 1024;
59 let origin1 = Origin::signed(1);38 let origin1 = Origin::signed(1);
60
61 assert_ok!(TemplateModule::create_collection(39 assert_ok!(TemplateModule::create_collection(
62 origin1.clone(),40 origin1.clone(),
63 col_name1.clone(),41 col_name1.clone(),
64 col_desc1.clone(),42 col_desc1.clone(),
65 token_prefix1.clone(),43 token_prefix1.clone(),
66 size44 mode
67 ));45 ));
68 assert_ok!(TemplateModule::destroy_collection(origin1.clone(), 1));46 assert_eq!(TemplateModule::collection(1).owner, 1);
47
48
49 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 });
69 });52 });
70}53}
7154
72#[test]55#[test]
73fn create_item() {56fn create_fungible_item() {
74 new_test_ext().execute_with(|| {57 new_test_ext().execute_with(|| {
75 let col_name1: Vec<u16> = "Test1\0".encode_utf16().collect::<Vec<u16>>();58 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>>();59 let col_desc1: Vec<u16> = "TestDescription1\0".encode_utf16().collect::<Vec<u16>>();
77 let token_prefix1: Vec<u8> = b"token_prefix1\0".to_vec();60 let token_prefix1: Vec<u8> = b"token_prefix1\0".to_vec();
61 let mode: CollectionMode = CollectionMode::Fungible(3);
7862
79 let size = 1024;
80 let origin1 = Origin::signed(1);63 let origin1 = Origin::signed(1);
81 let origin2 = Origin::signed(2);
82
83 assert_ok!(TemplateModule::create_collection(64 assert_ok!(TemplateModule::create_collection(
84 origin1.clone(),65 origin1.clone(),
85 col_name1.clone(),66 col_name1.clone(),
86 col_desc1.clone(),67 col_desc1.clone(),
87 token_prefix1.clone(),68 token_prefix1.clone(),
88 size69 mode
89 ));70 ));
90 assert_ok!(TemplateModule::add_collection_admin(origin1.clone(), 1, 2));71 assert_eq!(TemplateModule::collection(1).owner, 1);
91 assert_ok!(TemplateModule::create_item(
92 origin2.clone(),
93 1,
94 [1, 1, 1].to_vec()
95 ));
9672
97 // check balance (collection with id = 1, user id = 2)73 assert_ok!(TemplateModule::create_item(origin1.clone(), 1, [].to_vec(), 1));
74 assert_eq!(TemplateModule::fungible_item_id(1,1).owner, 1);
98 assert_eq!(TemplateModule::balance_count((1, 2)), 1);75 assert_eq!(TemplateModule::balance_count(1,1), 1000);
76 assert_eq!(TemplateModule::address_tokens(1,1), [1]);
99 });77 });
100}78}
10179
102#[test]80#[test]
103fn burn_item() {81fn transfer_fungible_item() {
104 new_test_ext().execute_with(|| {82 new_test_ext().execute_with(|| {
105 let col_name1: Vec<u16> = "Test1\0".encode_utf16().collect::<Vec<u16>>();83 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>>();84 let col_desc1: Vec<u16> = "TestDescription1\0".encode_utf16().collect::<Vec<u16>>();
107 let token_prefix1: Vec<u8> = b"token_prefix1\0".to_vec();85 let token_prefix1: Vec<u8> = b"token_prefix1\0".to_vec();
86 let mode: CollectionMode = CollectionMode::Fungible(3);
10887
109 let size = 1024;
110 let origin1 = Origin::signed(1);88 let origin1 = Origin::signed(1);
111 let origin2 = Origin::signed(2);89 let origin2 = Origin::signed(2);
112
113 assert_ok!(TemplateModule::create_collection(90 assert_ok!(TemplateModule::create_collection(
114 origin1.clone(),91 origin1.clone(),
115 col_name1.clone(),92 col_name1.clone(),
116 col_desc1.clone(),93 col_desc1.clone(),
117 token_prefix1.clone(),94 token_prefix1.clone(),
118 size95 mode
119 ));96 ));
120 assert_ok!(TemplateModule::add_collection_admin(origin1.clone(), 1, 2));97 assert_eq!(TemplateModule::collection(1).owner, 1);
121 assert_ok!(TemplateModule::create_item(
122 origin2.clone(),
123 1,
124 [1, 1, 1].to_vec()
125 ));
12698
127 // check balance (collection with id = 1, user id = 2)99 assert_ok!(TemplateModule::create_item(origin1.clone(), 1, [].to_vec(), 1));
100 assert_eq!(TemplateModule::fungible_item_id(1,1).owner, 1);
128 assert_eq!(TemplateModule::balance_count((1, 2)), 1);101 assert_eq!(TemplateModule::balance_count(1,1), 1000);
102 assert_eq!(TemplateModule::address_tokens(1,1), [1]);
129103
130 // burn item104 // change owner scenario
131 assert_ok!(TemplateModule::burn_item(origin1.clone(), 1, 1));105 assert_ok!(TemplateModule::transfer(origin1.clone(), 2, 1, 1, 1000));
132 assert_noop!(106 assert_eq!(TemplateModule::fungible_item_id(1,1).owner, 2);
133 TemplateModule::burn_item(origin1.clone(), 1, 1),107 assert_eq!(TemplateModule::fungible_item_id(1,1).value, 1000);
108 assert_eq!(TemplateModule::balance_count(1,1), 0);
134 "Item does not exists"109 assert_eq!(TemplateModule::balance_count(1,2), 1000);
110 assert_eq!(TemplateModule::address_tokens(1,1), []);
135 );111 assert_eq!(TemplateModule::address_tokens(1,2), [1]);
136112
137 assert_eq!(TemplateModule::balance_count((1, 1)), 0);113 // split item scenario
114 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]);
121
122 // split item and new owner has account scenario
123 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]);
138 });130 });
139}131}
140132
141#[test]133#[test]
142fn add_collection_admin() {134fn transfer_refungible_item() {
143 new_test_ext().execute_with(|| {135 new_test_ext().execute_with(|| {
144 let col_name1: Vec<u16> = "Test1\0".encode_utf16().collect::<Vec<u16>>();136 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>>();137 let col_desc1: Vec<u16> = "TestDescription1\0".encode_utf16().collect::<Vec<u16>>();
146 let token_prefix1: Vec<u8> = b"token_prefix1\0".to_vec();138 let token_prefix1: Vec<u8> = b"token_prefix1\0".to_vec();
139 let mode: CollectionMode = CollectionMode::ReFungible(2000, 3);
147140
148 let size = 1024;
149 let origin1 = Origin::signed(1);141 let origin1 = Origin::signed(1);
150 let origin2 = Origin::signed(2);142 let origin2 = Origin::signed(2);
151 let origin3 = Origin::signed(3);
152
153 assert_ok!(TemplateModule::create_collection(143 assert_ok!(TemplateModule::create_collection(
154 origin1.clone(),144 origin1.clone(),
155 col_name1.clone(),145 col_name1.clone(),
156 col_desc1.clone(),146 col_desc1.clone(),
157 token_prefix1.clone(),147 token_prefix1.clone(),
158 size148 mode
159 ));149 ));
160 assert_ok!(TemplateModule::create_collection(
161 origin2.clone(),
162 col_name1.clone(),
163 col_desc1.clone(),
164 token_prefix1.clone(),
165 size
166 ));
167 assert_ok!(TemplateModule::create_collection(
168 origin3.clone(),
169 col_name1.clone(),
170 col_desc1.clone(),
171 token_prefix1.clone(),
172 size
173 ));
174
175 assert_eq!(TemplateModule::collection(1).owner, 1);150 assert_eq!(TemplateModule::collection(1).owner, 1);
176 assert_eq!(TemplateModule::collection(2).owner, 2);
177 assert_eq!(TemplateModule::collection(3).owner, 3);
178151
179 // collection admin152 assert_ok!(TemplateModule::create_item(origin1.clone(), 1, [1,2,3].to_vec(), 1));
180 assert_ok!(TemplateModule::add_collection_admin(origin1.clone(), 1, 2));153 assert_eq!(TemplateModule::refungible_item_id(1,1).data, [1,2,3].to_vec());
181 assert_ok!(TemplateModule::add_collection_admin(origin1.clone(), 1, 3));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]);
182157
183 assert_eq!(TemplateModule::admin_list_collection(1).contains(&2), true);158 // change owner scenario
159 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);
184 assert_eq!(TemplateModule::admin_list_collection(1).contains(&3), true);163 assert_eq!(TemplateModule::address_tokens(1,1), []);
164 assert_eq!(TemplateModule::address_tokens(1,2), [1]);
165
166 // split item scenario
167 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]);
174
175 // split item and new owner has account scenario
176 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]);
185 });183 });
186}184}
187185
186
188#[test]187#[test]
189fn remove_collection_admin() {188fn transfer_nft_item() {
190 new_test_ext().execute_with(|| {189 new_test_ext().execute_with(|| {
191 let col_name1: Vec<u16> = "Test1\0".encode_utf16().collect::<Vec<u16>>();190 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>>();191 let col_desc1: Vec<u16> = "TestDescription1\0".encode_utf16().collect::<Vec<u16>>();
193 let token_prefix1: Vec<u8> = b"token_prefix1\0".to_vec();192 let token_prefix1: Vec<u8> = b"token_prefix1\0".to_vec();
193 let mode: CollectionMode = CollectionMode::NFT(2000);
194194
195 let size = 1024;
196 let origin1 = Origin::signed(1);195 let origin1 = Origin::signed(1);
197 let origin2 = Origin::signed(2);
198 let origin3 = Origin::signed(3);
199
200 assert_ok!(TemplateModule::create_collection(196 assert_ok!(TemplateModule::create_collection(
201 origin1.clone(),197 origin1.clone(),
202 col_name1.clone(),198 col_name1.clone(),
203 col_desc1.clone(),199 col_desc1.clone(),
204 token_prefix1.clone(),200 token_prefix1.clone(),
205 size201 mode
206 ));202 ));
207 assert_ok!(TemplateModule::create_collection(
208 origin2.clone(),
209 col_name1.clone(),
210 col_desc1.clone(),
211 token_prefix1.clone(),
212 size
213 ));
214 assert_ok!(TemplateModule::create_collection(
215 origin3.clone(),
216 col_name1.clone(),
217 col_desc1.clone(),
218 token_prefix1.clone(),
219 size
220 ));
221
222 assert_eq!(TemplateModule::collection(1).owner, 1);203 assert_eq!(TemplateModule::collection(1).owner, 1);
223 assert_eq!(TemplateModule::collection(2).owner, 2);
224 assert_eq!(TemplateModule::collection(3).owner, 3);
225204
226 // collection admin
227 assert_ok!(TemplateModule::add_collection_admin(origin1.clone(), 1, 2));
228 assert_ok!(TemplateModule::add_collection_admin(origin1.clone(), 1, 3));
229205
230 assert_eq!(TemplateModule::admin_list_collection(1).contains(&2), true);206 assert_ok!(TemplateModule::create_item(origin1.clone(), 1, [1,2,3].to_vec(), 1));
231 assert_eq!(TemplateModule::admin_list_collection(1).contains(&3), true);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]);
232210
233 // remove admin211 // default scenario
234 assert_ok!(TemplateModule::remove_collection_admin(212 assert_ok!(TemplateModule::transfer(origin1.clone(), 2, 1, 1, 1000));
235 origin2.clone(),213 assert_eq!(TemplateModule::nft_item_id(1,1).owner, 2);
236 1,214 assert_eq!(TemplateModule::balance_count(1,1), 0);
237 3215 assert_eq!(TemplateModule::balance_count(1,2), 1);
238 ));216 assert_eq!(TemplateModule::address_tokens(1,1), []);
239 assert_eq!(TemplateModule::admin_list_collection(1).contains(&3), false);217 assert_eq!(TemplateModule::address_tokens(1,2), [1]);
240 });218 });
241}219}
242220
243#[test]221#[test]
244fn balance_of() {222fn nft_approve_and_transfer_from() {
245 new_test_ext().execute_with(|| {223 new_test_ext().execute_with(|| {
246 let col_name1: Vec<u16> = "Test1\0".encode_utf16().collect::<Vec<u16>>();224 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>>();225 let col_desc1: Vec<u16> = "TestDescription1\0".encode_utf16().collect::<Vec<u16>>();
248 let token_prefix1: Vec<u8> = b"token_prefix1\0".to_vec();226 let token_prefix1: Vec<u8> = b"token_prefix1\0".to_vec();
227 let mode: CollectionMode = CollectionMode::NFT(2000);
249228
250 let size = 1024;
251 let origin1 = Origin::signed(1);229 let origin1 = Origin::signed(1);
252 let origin2 = Origin::signed(2);230 let origin2 = Origin::signed(2);
253 let origin3 = Origin::signed(3);
254
255 assert_ok!(TemplateModule::create_collection(231 assert_ok!(TemplateModule::create_collection(
256 origin1.clone(),232 origin1.clone(),
257 col_name1.clone(),233 col_name1.clone(),
258 col_desc1.clone(),234 col_desc1.clone(),
259 token_prefix1.clone(),235 token_prefix1.clone(),
260 size236 mode
261 ));237 ));
262 assert_ok!(TemplateModule::create_collection(
263 origin2.clone(),
264 col_name1.clone(),
265 col_desc1.clone(),
266 token_prefix1.clone(),
267 size
268 ));
269 assert_ok!(TemplateModule::create_collection(
270 origin3.clone(),
271 col_name1.clone(),
272 col_desc1.clone(),
273 token_prefix1.clone(),
274 size
275 ));
276
277 assert_eq!(TemplateModule::collection(1).owner, 1);238 assert_eq!(TemplateModule::collection(1).owner, 1);
278 assert_eq!(TemplateModule::collection(2).owner, 2);
279 assert_eq!(TemplateModule::collection(3).owner, 3);
280239
281 // check balance before
282 assert_eq!(TemplateModule::balance_count((1, 1)), 0);
283240
284 // create item241 assert_ok!(TemplateModule::create_item(origin1.clone(), 1, [1,2,3].to_vec(), 1));
285 assert_ok!(TemplateModule::create_item(
286 origin1.clone(),
287 1,242 assert_eq!(TemplateModule::nft_item_id(1,1).data, [1,2,3].to_vec());
288 [1, 1, 1].to_vec()243 assert_eq!(TemplateModule::balance_count(1,1), 1);
289 ));244 assert_eq!(TemplateModule::address_tokens(1,1), [1]);
290245
291 // check balance (collection with id = 1, user id = 2)246 assert_noop!(
247 TemplateModule::transfer_from(origin2.clone(), 1, 3, 1, 1, 1),
248 "You do not have permissions to modify this collection"
249 );
250
251 // do approve
252 assert_ok!(TemplateModule::approve(origin1.clone(), 2, 1, 1));
292 assert_eq!(TemplateModule::balance_count((1, 1)), 1);253 assert_eq!(TemplateModule::approved(1,(1,1)).len(), 1);
254 assert_ok!(TemplateModule::approve(origin1.clone(), 10, 1, 1));
293 assert_eq!(TemplateModule::item_id((1, 1)).owner, 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});
257
258 assert_ok!(TemplateModule::transfer_from(origin2.clone(), 1, 3, 1, 1, 1));
259 assert_eq!(TemplateModule::approved(1,(1,1)).len(), 0);
294 });260 });
295}261}
296262
297#[test]263#[test]
298fn transfer() {264fn refungible_approve_and_transfer_from() {
299 new_test_ext().execute_with(|| {265 new_test_ext().execute_with(|| {
300 let col_name1: Vec<u16> = "Test1\0".encode_utf16().collect::<Vec<u16>>();266 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>>();267 let col_desc1: Vec<u16> = "TestDescription1\0".encode_utf16().collect::<Vec<u16>>();
302 let token_prefix1: Vec<u8> = b"token_prefix1\0".to_vec();268 let token_prefix1: Vec<u8> = b"token_prefix1\0".to_vec();
269 let mode: CollectionMode = CollectionMode::ReFungible(2000, 3);
303270
304 let size = 1024;
305 let origin1 = Origin::signed(1);271 let origin1 = Origin::signed(1);
306 let origin2 = Origin::signed(2);272 let origin2 = Origin::signed(2);
307 let origin3 = Origin::signed(3);
308
309 assert_ok!(TemplateModule::create_collection(273 assert_ok!(TemplateModule::create_collection(
310 origin1.clone(),274 origin1.clone(),
311 col_name1.clone(),275 col_name1.clone(),
312 col_desc1.clone(),276 col_desc1.clone(),
313 token_prefix1.clone(),277 token_prefix1.clone(),
314 size278 mode
315 ));279 ));
316 assert_ok!(TemplateModule::create_collection(
317 origin2.clone(),
318 col_name1.clone(),
319 col_desc1.clone(),
320 token_prefix1.clone(),
321 size
322 ));
323 assert_ok!(TemplateModule::create_collection(
324 origin3.clone(),
325 col_name1.clone(),
326 col_desc1.clone(),
327 token_prefix1.clone(),
328 size
329 ));
330
331 assert_eq!(TemplateModule::collection(1).owner, 1);280 assert_eq!(TemplateModule::collection(1).owner, 1);
332 assert_eq!(TemplateModule::collection(2).owner, 2);
333 assert_eq!(TemplateModule::collection(3).owner, 3);
334281
335 // create item282 assert_ok!(TemplateModule::create_item(origin1.clone(), 1, [1,2,3].to_vec(), 1));
336 assert_ok!(TemplateModule::create_item(
337 origin1.clone(),283 assert_eq!(TemplateModule::refungible_item_id(1,1).data, [1,2,3].to_vec());
338 1,284 assert_eq!(TemplateModule::refungible_item_id(1,1).owner[0], Ownership { owner: 1, fraction: 1000 });
339 [1, 1, 1].to_vec()285 assert_eq!(TemplateModule::balance_count(1,1), 1000);
340 ));286 assert_eq!(TemplateModule::address_tokens(1,1), [1]);
341287
342 // transfer288 assert_noop!(
343 assert_ok!(TemplateModule::transfer(origin1.clone(), 1, 1, 2));289 TemplateModule::transfer_from(origin2.clone(), 1, 3, 1, 1, 1),
344 assert_eq!(TemplateModule::item_id((1, 1)).owner, 2);290 "You do not have permissions to modify this collection"
291 );
345292
346 // balance_of check293 // do approve
347 assert_eq!(TemplateModule::balance_count((1, 1)), 0);294 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});
299
348 assert_eq!(TemplateModule::balance_count((1, 2)), 1);300 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]);
305
306 assert_eq!(TemplateModule::approved(1,(1,1)).len(), 1);
307 assert_eq!(TemplateModule::approved(1,(1,1))[0], ApprovePermissions { approved: 10, amount: 100000000});
349 });308 });
350}309}
351310
352#[test]311#[test]
353fn approve() {312fn fungible_approve_and_transfer_from() {
354 new_test_ext().execute_with(|| {313 new_test_ext().execute_with(|| {
355 let col_name1: Vec<u16> = "Test1\0".encode_utf16().collect::<Vec<u16>>();314 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>>();315 let col_desc1: Vec<u16> = "TestDescription1\0".encode_utf16().collect::<Vec<u16>>();
357 let token_prefix1: Vec<u8> = b"token_prefix1\0".to_vec();316 let token_prefix1: Vec<u8> = b"token_prefix1\0".to_vec();
317 let mode: CollectionMode = CollectionMode::Fungible(3);
358318
359 let size = 1024;
360 let origin1 = Origin::signed(1);319 let origin1 = Origin::signed(1);
361 let origin2 = Origin::signed(2);320 let origin2 = Origin::signed(2);
362 let origin3 = Origin::signed(3);
363
364 assert_ok!(TemplateModule::create_collection(321 assert_ok!(TemplateModule::create_collection(
365 origin1.clone(),322 origin1.clone(),
366 col_name1.clone(),323 col_name1.clone(),
367 col_desc1.clone(),324 col_desc1.clone(),
368 token_prefix1.clone(),325 token_prefix1.clone(),
369 size326 mode
370 ));327 ));
371 assert_ok!(TemplateModule::create_collection(
372 origin2.clone(),
373 col_name1.clone(),
374 col_desc1.clone(),
375 token_prefix1.clone(),
376 size
377 ));
378 assert_ok!(TemplateModule::create_collection(
379 origin3.clone(),
380 col_name1.clone(),
381 col_desc1.clone(),
382 token_prefix1.clone(),
383 size
384 ));
385
386 assert_eq!(TemplateModule::collection(1).owner, 1);328 assert_eq!(TemplateModule::collection(1).owner, 1);
387 assert_eq!(TemplateModule::collection(2).owner, 2);
388 assert_eq!(TemplateModule::collection(3).owner, 3);
389329
390 // create item330 assert_ok!(TemplateModule::create_item(origin1.clone(), 1, [].to_vec(), 1));
391 assert_ok!(TemplateModule::create_item(
392 origin1.clone(),
393 1,331 assert_eq!(TemplateModule::fungible_item_id(1,1).owner, 1);
394 [1, 1, 1].to_vec()332 assert_eq!(TemplateModule::balance_count(1,1), 1000);
395 ));333 assert_eq!(TemplateModule::address_tokens(1,1), [1]);
396334
397 // approve335 assert_noop!(
336 TemplateModule::transfer_from(origin2.clone(), 1, 3, 1, 1, 1),
337 "You do not have permissions to modify this collection"
338 );
339
340 // do approve
398 assert_ok!(TemplateModule::approve(origin1.clone(), 2, 1, 1));341 assert_ok!(TemplateModule::approve(origin1.clone(), 2, 1, 1));
399 assert_eq!(TemplateModule::approved((1, 1)).contains(&2), true);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});
346
347 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]);
352
353 assert_eq!(TemplateModule::approved(1,(1,1)).len(), 1);
354 assert_eq!(TemplateModule::approved(1,(1,1))[0], ApprovePermissions { approved: 10, amount: 100000000});
355
356 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]);
362
363 assert_eq!(TemplateModule::approved(1,(1,1)).len(), 0);
400 });364 });
401}365}
402366
403#[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();
409367
410 let size = 1024;
411 let origin1 = Origin::signed(1);
412 let origin2 = Origin::signed(2);
413 let origin3 = Origin::signed(3);
414368
415 assert_ok!(TemplateModule::create_collection(
416 origin1.clone(),
417 col_name1.clone(),
418 col_desc1.clone(),
419 token_prefix1.clone(),
420 size
421 ));
422 assert_ok!(TemplateModule::create_collection(
423 origin2.clone(),
424 col_name1.clone(),
425 col_desc1.clone(),
426 token_prefix1.clone(),
427 size
428 ));
429 assert_ok!(TemplateModule::create_collection(
430 origin3.clone(),
431 col_name1.clone(),
432 col_desc1.clone(),
433 token_prefix1.clone(),
434 size
435 ));
436369
437 assert_eq!(TemplateModule::collection(1).owner, 1);
438 assert_eq!(TemplateModule::collection(2).owner, 2);
439 assert_eq!(TemplateModule::collection(3).owner, 3);
440370
441 // create item
442 assert_ok!(TemplateModule::create_item(
443 origin1.clone(),
444 1,
445 [1, 1, 1].to_vec()
446 ));
447371
448 // approve
449 assert_ok!(TemplateModule::approve(origin1.clone(), 2, 1, 1));
450 assert_eq!(TemplateModule::approved((1, 1)).contains(&2), true);
451 });
452}
453372
454#[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();
460373
461 let size = 1024;
462 let origin1 = Origin::signed(1);
463 let origin2 = Origin::signed(2);
464 let origin3 = Origin::signed(3);
465374
466 assert_ok!(TemplateModule::create_collection(
467 origin1.clone(),
468 col_name1.clone(),
469 col_desc1.clone(),
470 token_prefix1.clone(),
471 size
472 ));
473 assert_ok!(TemplateModule::create_collection(
474 origin2.clone(),
475 col_name1.clone(),
476 col_desc1.clone(),
477 token_prefix1.clone(),
478 size
479 ));
480 assert_ok!(TemplateModule::create_collection(
481 origin3.clone(),
482 col_name1.clone(),
483 col_desc1.clone(),
484 token_prefix1.clone(),
485 size
486 ));
487375
488 assert_eq!(TemplateModule::collection(1).owner, 1);
489 assert_eq!(TemplateModule::collection(2).owner, 2);
490 assert_eq!(TemplateModule::collection(3).owner, 3);
491376
492 // create item
493 assert_ok!(TemplateModule::create_item(
494 origin1.clone(),
495 1,
496 [1, 1, 1].to_vec()
497 ));
498377
499 // approve
500 assert_ok!(TemplateModule::approve(origin1.clone(), 2, 1, 1));
501 assert_ok!(TemplateModule::transfer_from(origin1.clone(), 1, 1, 2));
502 });
503}
504378
505#[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();
511379
512 let size = 1024;
513 let origin1 = Origin::signed(1);
514 let origin2 = Origin::signed(2);
515 let origin3 = Origin::signed(3);
516380
517 assert_ok!(TemplateModule::create_collection(
518 origin1.clone(),
519 col_name1.clone(),
520 col_desc1.clone(),
521 token_prefix1.clone(),
522 size
523 ));
524 assert_ok!(TemplateModule::create_collection(
525 origin2.clone(),
526 col_name1.clone(),
527 col_desc1.clone(),
528 token_prefix1.clone(),
529 size
530 ));
531 assert_ok!(TemplateModule::create_collection(
532 origin3.clone(),
533 col_name1.clone(),
534 col_desc1.clone(),
535 token_prefix1.clone(),
536 size
537 ));
538381
539 assert_eq!(TemplateModule::collection(1).owner, 1);382// #[test]
540 assert_eq!(TemplateModule::collection(2).owner, 2);383// fn create_collection_test() {
541 assert_eq!(TemplateModule::collection(3).owner, 3);384// new_test_ext().execute_with(|| {
542 // create items385// let col_name1: Vec<u16> = "Test1\0".encode_utf16().collect::<Vec<u16>>();
543 assert_ok!(TemplateModule::create_item(386// let col_desc1: Vec<u16> = "TestDescription1\0".encode_utf16().collect::<Vec<u16>>();
544 origin1.clone(),387// let token_prefix1: Vec<u8> = b"token_prefix1\0".to_vec();
545 1,388
546 [1, 1, 1].to_vec()389// let size = 1024;
547 ));390// let origin1 = Origin::signed(1);
548 assert_ok!(TemplateModule::create_item(391// assert_ok!(TemplateModule::create_collection(
549 origin1.clone(),392// origin1.clone(),
550 1,393// col_name1.clone(),
551 [1, 1, 2].to_vec()394// col_desc1.clone(),
552 ));395// token_prefix1.clone(),
553 assert_ok!(TemplateModule::create_item(396// size
554 origin1.clone(),397// ));
555 1,398// assert_eq!(TemplateModule::collection(1).owner, 1);
556 [1, 2, 3].to_vec()399// });
557 ));400// }
558 assert_eq!(TemplateModule::address_tokens((1, 1)).len(), 3);401
559 // burn one402// #[test]
560 assert_ok!(TemplateModule::burn_item(origin1.clone(), 1, 2));403// fn change_collection_owner() {
561 assert_eq!(TemplateModule::address_tokens((1, 1)).len(), 2);404// new_test_ext().execute_with(|| {
562 // burn another one405// let col_name1: Vec<u16> = "Test1\0".encode_utf16().collect::<Vec<u16>>();
563 assert_ok!(TemplateModule::burn_item(origin1.clone(), 1, 3));406// let col_desc1: Vec<u16> = "TestDescription1\0".encode_utf16().collect::<Vec<u16>>();
564 assert_eq!(TemplateModule::address_tokens((1, 1))[0], 1);407// let token_prefix1: Vec<u8> = b"token_prefix1\0".to_vec();
565 });408
566}409// let size = 1024;
410// let origin1 = Origin::signed(1);
411
412// assert_ok!(TemplateModule::create_collection(
413// origin1.clone(),
414// col_name1.clone(),
415// col_desc1.clone(),
416// token_prefix1.clone(),
417// size
418// ));
419// assert_ok!(TemplateModule::change_collection_owner(
420// origin1.clone(),
421// 1,
422// 2
423// ));
424// assert_eq!(TemplateModule::collection(1).owner, 2);
425// });
426// }
427
428// #[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();
434
435// let size = 1024;
436// let origin1 = Origin::signed(1);
437
438// assert_ok!(TemplateModule::create_collection(
439// origin1.clone(),
440// col_name1.clone(),
441// col_desc1.clone(),
442// token_prefix1.clone(),
443// size
444// ));
445// assert_ok!(TemplateModule::destroy_collection(origin1.clone(), 1));
446// });
447// }
448
449// #[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();
455
456// let size = 1024;
457// let origin1 = Origin::signed(1);
458// let origin2 = Origin::signed(2);
459
460// assert_ok!(TemplateModule::create_collection(
461// origin1.clone(),
462// col_name1.clone(),
463// col_desc1.clone(),
464// token_prefix1.clone(),
465// size
466// ));
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// ));
473
474// // check balance (collection with id = 1, user id = 2)
475// assert_eq!(TemplateModule::balance_count((1, 2)), 1);
476// });
477// }
478
479// #[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();
485
486// let size = 1024;
487// let origin1 = Origin::signed(1);
488// let origin2 = Origin::signed(2);
489
490// assert_ok!(TemplateModule::create_collection(
491// origin1.clone(),
492// col_name1.clone(),
493// col_desc1.clone(),
494// token_prefix1.clone(),
495// size
496// ));
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// ));
503
504// // check balance (collection with id = 1, user id = 2)
505// assert_eq!(TemplateModule::balance_count((1, 2)), 1);
506
507// // burn item
508// 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// );
513
514// assert_eq!(TemplateModule::balance_count((1, 1)), 0);
515// });
516// }
517
518// #[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();
524
525// let size = 1024;
526// let origin1 = Origin::signed(1);
527// let origin2 = Origin::signed(2);
528// let origin3 = Origin::signed(3);
529
530// assert_ok!(TemplateModule::create_collection(
531// origin1.clone(),
532// col_name1.clone(),
533// col_desc1.clone(),
534// token_prefix1.clone(),
535// size
536// ));
537// assert_ok!(TemplateModule::create_collection(
538// origin2.clone(),
539// col_name1.clone(),
540// col_desc1.clone(),
541// token_prefix1.clone(),
542// size
543// ));
544// assert_ok!(TemplateModule::create_collection(
545// origin3.clone(),
546// col_name1.clone(),
547// col_desc1.clone(),
548// token_prefix1.clone(),
549// size
550// ));
551
552// assert_eq!(TemplateModule::collection(1).owner, 1);
553// assert_eq!(TemplateModule::collection(2).owner, 2);
554// assert_eq!(TemplateModule::collection(3).owner, 3);
555
556// // collection admin
557// assert_ok!(TemplateModule::add_collection_admin(origin1.clone(), 1, 2));
558// assert_ok!(TemplateModule::add_collection_admin(origin1.clone(), 1, 3));
559
560// assert_eq!(TemplateModule::admin_list_collection(1).contains(&2), true);
561// assert_eq!(TemplateModule::admin_list_collection(1).contains(&3), true);
562// });
563// }
564
565// #[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();
571
572// let size = 1024;
573// let origin1 = Origin::signed(1);
574// let origin2 = Origin::signed(2);
575// let origin3 = Origin::signed(3);
576
577// assert_ok!(TemplateModule::create_collection(
578// origin1.clone(),
579// col_name1.clone(),
580// col_desc1.clone(),
581// token_prefix1.clone(),
582// size
583// ));
584// assert_ok!(TemplateModule::create_collection(
585// origin2.clone(),
586// col_name1.clone(),
587// col_desc1.clone(),
588// token_prefix1.clone(),
589// size
590// ));
591// assert_ok!(TemplateModule::create_collection(
592// origin3.clone(),
593// col_name1.clone(),
594// col_desc1.clone(),
595// token_prefix1.clone(),
596// size
597// ));
598
599// assert_eq!(TemplateModule::collection(1).owner, 1);
600// assert_eq!(TemplateModule::collection(2).owner, 2);
601// assert_eq!(TemplateModule::collection(3).owner, 3);
602
603// // collection admin
604// assert_ok!(TemplateModule::add_collection_admin(origin1.clone(), 1, 2));
605// assert_ok!(TemplateModule::add_collection_admin(origin1.clone(), 1, 3));
606
607// assert_eq!(TemplateModule::admin_list_collection(1).contains(&2), true);
608// assert_eq!(TemplateModule::admin_list_collection(1).contains(&3), true);
609
610// // remove admin
611// assert_ok!(TemplateModule::remove_collection_admin(
612// origin2.clone(),
613// 1,
614// 3
615// ));
616// assert_eq!(TemplateModule::admin_list_collection(1).contains(&3), false);
617// });
618// }
619
620// #[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();
626
627// let size = 1024;
628// let origin1 = Origin::signed(1);
629// let origin2 = Origin::signed(2);
630// let origin3 = Origin::signed(3);
631
632// assert_ok!(TemplateModule::create_collection(
633// origin1.clone(),
634// col_name1.clone(),
635// col_desc1.clone(),
636// token_prefix1.clone(),
637// size
638// ));
639// assert_ok!(TemplateModule::create_collection(
640// origin2.clone(),
641// col_name1.clone(),
642// col_desc1.clone(),
643// token_prefix1.clone(),
644// size
645// ));
646// assert_ok!(TemplateModule::create_collection(
647// origin3.clone(),
648// col_name1.clone(),
649// col_desc1.clone(),
650// token_prefix1.clone(),
651// size
652// ));
653
654// assert_eq!(TemplateModule::collection(1).owner, 1);
655// assert_eq!(TemplateModule::collection(2).owner, 2);
656// assert_eq!(TemplateModule::collection(3).owner, 3);
657
658// // check balance before
659// assert_eq!(TemplateModule::balance_count((1, 1)), 0);
660
661// // create item
662// assert_ok!(TemplateModule::create_item(
663// origin1.clone(),
664// 1,
665// [1, 1, 1].to_vec()
666// ));
667
668// // 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// }
673
674// #[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();
680
681// let size = 1024;
682// let origin1 = Origin::signed(1);
683// let origin2 = Origin::signed(2);
684// let origin3 = Origin::signed(3);
685
686// assert_ok!(TemplateModule::create_collection(
687// origin1.clone(),
688// col_name1.clone(),
689// col_desc1.clone(),
690// token_prefix1.clone(),
691// size
692// ));
693// assert_ok!(TemplateModule::create_collection(
694// origin2.clone(),
695// col_name1.clone(),
696// col_desc1.clone(),
697// token_prefix1.clone(),
698// size
699// ));
700// assert_ok!(TemplateModule::create_collection(
701// origin3.clone(),
702// col_name1.clone(),
703// col_desc1.clone(),
704// token_prefix1.clone(),
705// size
706// ));
707
708// assert_eq!(TemplateModule::collection(1).owner, 1);
709// assert_eq!(TemplateModule::collection(2).owner, 2);
710// assert_eq!(TemplateModule::collection(3).owner, 3);
711
712// // create item
713// assert_ok!(TemplateModule::create_item(
714// origin1.clone(),
715// 1,
716// [1, 1, 1].to_vec()
717// ));
718
719// // transfer
720// assert_ok!(TemplateModule::transfer(origin1.clone(), 1, 1, 2));
721// assert_eq!(TemplateModule::item_id((1, 1)).owner, 2);
722
723// // balance_of check
724// assert_eq!(TemplateModule::balance_count((1, 1)), 0);
725// assert_eq!(TemplateModule::balance_count((1, 2)), 1);
726// });
727// }
728
729// #[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();
735
736// let size = 1024;
737// let origin1 = Origin::signed(1);
738// let origin2 = Origin::signed(2);
739// let origin3 = Origin::signed(3);
740
741// assert_ok!(TemplateModule::create_collection(
742// origin1.clone(),
743// col_name1.clone(),
744// col_desc1.clone(),
745// token_prefix1.clone(),
746// size
747// ));
748// assert_ok!(TemplateModule::create_collection(
749// origin2.clone(),
750// col_name1.clone(),
751// col_desc1.clone(),
752// token_prefix1.clone(),
753// size
754// ));
755// assert_ok!(TemplateModule::create_collection(
756// origin3.clone(),
757// col_name1.clone(),
758// col_desc1.clone(),
759// token_prefix1.clone(),
760// size
761// ));
762
763// assert_eq!(TemplateModule::collection(1).owner, 1);
764// assert_eq!(TemplateModule::collection(2).owner, 2);
765// assert_eq!(TemplateModule::collection(3).owner, 3);
766
767// // create item
768// assert_ok!(TemplateModule::create_item(
769// origin1.clone(),
770// 1,
771// [1, 1, 1].to_vec()
772// ));
773
774// // approve
775// assert_ok!(TemplateModule::approve(origin1.clone(), 2, 1, 1));
776// assert_eq!(TemplateModule::approved((1, 1)).contains(&2), true);
777// });
778// }
779
780// #[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();
786
787// let size = 1024;
788// let origin1 = Origin::signed(1);
789// let origin2 = Origin::signed(2);
790// let origin3 = Origin::signed(3);
791
792// assert_ok!(TemplateModule::create_collection(
793// origin1.clone(),
794// col_name1.clone(),
795// col_desc1.clone(),
796// token_prefix1.clone(),
797// size
798// ));
799// assert_ok!(TemplateModule::create_collection(
800// origin2.clone(),
801// col_name1.clone(),
802// col_desc1.clone(),
803// token_prefix1.clone(),
804// size
805// ));
806// assert_ok!(TemplateModule::create_collection(
807// origin3.clone(),
808// col_name1.clone(),
809// col_desc1.clone(),
810// token_prefix1.clone(),
811// size
812// ));
813
814// assert_eq!(TemplateModule::collection(1).owner, 1);
815// assert_eq!(TemplateModule::collection(2).owner, 2);
816// assert_eq!(TemplateModule::collection(3).owner, 3);
817
818// // create item
819// assert_ok!(TemplateModule::create_item(
820// origin1.clone(),
821// 1,
822// [1, 1, 1].to_vec()
823// ));
824
825// // approve
826// assert_ok!(TemplateModule::approve(origin1.clone(), 2, 1, 1));
827// assert_eq!(TemplateModule::approved((1, 1)).contains(&2), true);
828// });
829// }
830
831// #[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();
837
838// let size = 1024;
839// let origin1 = Origin::signed(1);
840// let origin2 = Origin::signed(2);
841// let origin3 = Origin::signed(3);
842
843// assert_ok!(TemplateModule::create_collection(
844// origin1.clone(),
845// col_name1.clone(),
846// col_desc1.clone(),
847// token_prefix1.clone(),
848// size
849// ));
850// assert_ok!(TemplateModule::create_collection(
851// origin2.clone(),
852// col_name1.clone(),
853// col_desc1.clone(),
854// token_prefix1.clone(),
855// size
856// ));
857// assert_ok!(TemplateModule::create_collection(
858// origin3.clone(),
859// col_name1.clone(),
860// col_desc1.clone(),
861// token_prefix1.clone(),
862// size
863// ));
864
865// assert_eq!(TemplateModule::collection(1).owner, 1);
866// assert_eq!(TemplateModule::collection(2).owner, 2);
867// assert_eq!(TemplateModule::collection(3).owner, 3);
868
869// // create item
870// assert_ok!(TemplateModule::create_item(
871// origin1.clone(),
872// 1,
873// [1, 1, 1].to_vec()
874// ));
875
876// // approve
877// assert_ok!(TemplateModule::approve(origin1.clone(), 2, 1, 1));
878// assert_ok!(TemplateModule::transfer_from(origin1.clone(), 1, 1, 2));
879// });
880// }
881
882// #[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();
888
889// let size = 1024;
890// let origin1 = Origin::signed(1);
891// let origin2 = Origin::signed(2);
892// let origin3 = Origin::signed(3);
893
894// assert_ok!(TemplateModule::create_collection(
895// origin1.clone(),
896// col_name1.clone(),
897// col_desc1.clone(),
898// token_prefix1.clone(),
899// size
900// ));
901// assert_ok!(TemplateModule::create_collection(
902// origin2.clone(),
903// col_name1.clone(),
904// col_desc1.clone(),
905// token_prefix1.clone(),
906// size
907// ));
908// assert_ok!(TemplateModule::create_collection(
909// origin3.clone(),
910// col_name1.clone(),
911// col_desc1.clone(),
912// token_prefix1.clone(),
913// size
914// ));
915
916// 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 items
920// 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 one
937// assert_ok!(TemplateModule::burn_item(origin1.clone(), 1, 2));
938// assert_eq!(TemplateModule::address_tokens((1, 1)).len(), 2);
939// // burn another one
940// assert_ok!(TemplateModule::burn_item(origin1.clone(), 1, 3));
941// assert_eq!(TemplateModule::address_tokens((1, 1))[0], 1);
942// });
943// }
567944