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

difftreelog

Merge branch 'develop' into feature/NFTPAR-250

Greg Zaitsev2020-12-25parents: #f7b41a8 #d430fcf.patch.diff
in: master

4 files changed

modifiedpallets/nft/src/lib.rsdiffbeforeafterboth
--- a/pallets/nft/src/lib.rs
+++ b/pallets/nft/src/lib.rs
@@ -395,7 +395,7 @@
         // Basic collections
         pub Collection get(fn collection) config(): map hasher(identity) CollectionId => CollectionType<T::AccountId>;
         pub AdminList get(fn admin_list_collection): map hasher(identity) CollectionId => Vec<T::AccountId>;
-        pub WhiteList get(fn white_list): map hasher(identity) CollectionId => Vec<T::AccountId>;
+        pub WhiteList get(fn white_list): double_map hasher(identity) CollectionId, hasher(twox_64_concat) T::AccountId => bool;
 
         /// Balance owner per collection map
         pub Balance get(fn balance_count): double_map hasher(identity) CollectionId, hasher(twox_64_concat) T::AccountId => u128;
@@ -421,6 +421,8 @@
         pub ContractSelfSponsoring get(fn contract_self_sponsoring): map hasher(twox_64_concat) T::AccountId => bool;
         pub ContractSponsorBasket get(fn contract_sponsor_basket): map hasher(twox_64_concat) (T::AccountId, T::AccountId) => T::BlockNumber;
         pub ContractSponsoringRateLimit get(fn contract_sponsoring_rate_limit): map hasher(twox_64_concat) T::AccountId => T::BlockNumber;
+        pub ContractWhiteListEnabled get(fn contract_white_list_enabled): map hasher(twox_64_concat) T::AccountId => bool; 
+        pub ContractWhiteList get(fn contract_white_list): double_map hasher(twox_64_concat) T::AccountId, hasher(twox_64_concat) T::AccountId => bool; 
     }
     add_extra_genesis {
         build(|config: &GenesisConfig<T>| {
@@ -610,7 +612,7 @@
             <ItemListIndex>::remove(collection_id);
             <AdminList<T>>::remove(collection_id);
             <Collection<T>>::remove(collection_id);
-            <WhiteList<T>>::remove(collection_id);
+            <WhiteList<T>>::remove_prefix(collection_id);
 
             <NftItemList<T>>::remove_prefix(collection_id);
             <FungibleItemList<T>>::remove_prefix(collection_id);
@@ -651,20 +653,8 @@
             let sender = ensure_signed(origin)?;
             Self::check_owner_or_admin_permissions(collection_id, sender)?;
 
-            let mut white_list_collection: Vec<T::AccountId>;
-            if <WhiteList<T>>::contains_key(collection_id) {
-                white_list_collection = <WhiteList<T>>::get(collection_id);
-                if !white_list_collection.contains(&address.clone())
-                {
-                    white_list_collection.push(address.clone());
-                }
-            }
-            else {
-                white_list_collection = Vec::new();
-                white_list_collection.push(address.clone());
-            }
-
-            <WhiteList<T>>::insert(collection_id, white_list_collection);
+            <WhiteList<T>>::insert(collection_id, address, true);
+            
             Ok(())
         }
 
@@ -686,14 +676,7 @@
             let sender = ensure_signed(origin)?;
             Self::check_owner_or_admin_permissions(collection_id, sender)?;
 
-            if <WhiteList<T>>::contains_key(collection_id) {
-                let mut white_list_collection = <WhiteList<T>>::get(collection_id);
-                if white_list_collection.contains(&address.clone())
-                {
-                    white_list_collection.retain(|i| *i != address.clone());
-                    <WhiteList<T>>::insert(collection_id, white_list_collection);
-                }
-            }
+            <WhiteList<T>>::remove(collection_id, address);
 
             Ok(())
         }
@@ -1396,12 +1379,7 @@
             #[cfg(feature = "runtime-benchmarks")]
             <ContractOwner<T>>::insert(contract_address.clone(), sender.clone());
 
-            let mut is_owner = false;
-            if <ContractOwner<T>>::contains_key(contract_address.clone()) {
-                let owner = <ContractOwner<T>>::get(&contract_address);
-                is_owner = sender == owner;
-            }
-            ensure!(is_owner, Error::<T>::NoPermission);
+            Self::ensure_contract_owned(sender, &contract_address)?;
 
             <ContractSelfSponsoring<T>>::insert(contract_address, enable);
             Ok(())
@@ -1431,18 +1409,85 @@
             rate_limit: T::BlockNumber
         ) -> DispatchResult {
             let sender = ensure_signed(origin)?;
-            let mut is_owner = false;
-            if <ContractOwner<T>>::contains_key(contract_address.clone()) {
-                let owner = <ContractOwner<T>>::get(&contract_address);
-                is_owner = sender == owner;
-            }
-            ensure!(is_owner, Error::<T>::NoPermission);
+            Self::ensure_contract_owned(sender, &contract_address)?;
 
             <ContractSponsoringRateLimit<T>>::insert(contract_address, rate_limit);
             Ok(())
         }
 
+        /// Enable the white list for a contract. Only addresses added to the white list with addToContractWhiteList will be able to call this smart contract.
+        /// 
+        /// # Permissions
+        /// 
+        /// * Address that deployed smart contract.
+        /// 
+        /// # Arguments
+        /// 
+        /// -`contract_address`: Address of the contract.
+        /// 
+        /// - `enable`: .  
+        #[weight = 0]
+        pub fn toggle_contract_white_list(
+            origin,
+            contract_address: T::AccountId,
+            enable: bool
+        ) -> DispatchResult {
+            let sender = ensure_signed(origin)?;
+            Self::ensure_contract_owned(sender, &contract_address)?;
+
+            <ContractWhiteListEnabled<T>>::insert(contract_address, enable);
+            Ok(())
+        }
+        
+        /// Add an address to smart contract white list.
+        /// 
+        /// # Permissions
+        /// 
+        /// * Address that deployed smart contract.
+        /// 
+        /// # Arguments
+        /// 
+        /// -`contract_address`: Address of the contract.
+        ///
+        /// -`account_address`: Address to add.
+        #[weight = 0]
+        pub fn add_to_contract_white_list(
+            origin,
+            contract_address: T::AccountId,
+            account_address: T::AccountId
+        ) -> DispatchResult {
+            let sender = ensure_signed(origin)?;
+            Self::ensure_contract_owned(sender, &contract_address)?;
+            
+            <ContractWhiteList<T>>::insert(contract_address, account_address, true);
+            Ok(())
+        }
+
+        /// Remove an address from smart contract white list.
+        /// 
+        /// # Permissions
+        /// 
+        /// * Address that deployed smart contract.
+        /// 
+        /// # Arguments
+        /// 
+        /// -`contract_address`: Address of the contract.
+        ///
+        /// -`account_address`: Address to remove.
         #[weight = 0]
+        pub fn remove_from_contract_white_list(
+            origin,
+            contract_address: T::AccountId,
+            account_address: T::AccountId
+        ) -> DispatchResult {
+            let sender = ensure_signed(origin)?;
+            Self::ensure_contract_owned(sender, &contract_address)?;
+            
+            <ContractWhiteList<T>>::remove(contract_address, account_address);
+            Ok(())
+        }
+
+        #[weight = 0]
         pub fn set_collection_limits(
             origin,
             collection_id: u32,
@@ -1778,9 +1823,7 @@
 
     fn check_white_list(collection_id: CollectionId, address: &T::AccountId) -> DispatchResult {
         let mes = Error::<T>::AddresNotInWhiteList;
-        ensure!(<WhiteList<T>>::contains_key(collection_id), mes);
-        let wl = <WhiteList<T>>::get(collection_id);
-        ensure!(wl.contains(address), mes);
+        ensure!(<WhiteList<T>>::contains_key(collection_id, address), mes);
 
         Ok(())
     }
@@ -2138,6 +2181,17 @@
 
         Ok(())
     }
+    
+    fn ensure_contract_owned(account: T::AccountId, contract: &T::AccountId) -> DispatchResult {
+        if <ContractOwner<T>>::contains_key(contract.clone()) {
+            let owner = <ContractOwner<T>>::get(contract);
+            ensure!(account == owner, Error::<T>::NoPermission);
+        } else {
+            fail!(Error::<T>::NoPermission);
+        }
+
+        Ok(())
+    }
 }
 
 ////////////////////////////////////////////////////////////////////////////////////////////////////
@@ -2357,6 +2411,16 @@
 
                 let called_contract: T::AccountId = T::Lookup::lookup((*dest).clone()).unwrap_or(T::AccountId::default());
 
+                let owned_contract = <ContractOwner<T>>::contains_key(called_contract.clone())
+                  && <ContractOwner<T>>::get(called_contract.clone()) == *who;
+                let white_list_enabled = <ContractWhiteListEnabled<T>>::contains_key(called_contract.clone()) && <ContractWhiteListEnabled<T>>::get(called_contract.clone());
+                  
+                if !owned_contract && white_list_enabled {
+                    if !<ContractWhiteList<T>>::contains_key(called_contract.clone(), who) {
+                        return Err(InvalidTransaction::Call.into());
+                    }
+                }
+
                 let mut sponsor_transfer = false;
                 if <ContractSponsoringRateLimit<T>>::contains_key(called_contract.clone()) {
                     let last_tx_block = <ContractSponsorBasket<T>>::get((&called_contract, &who));
modifiedpallets/nft/src/tests.rsdiffbeforeafterboth
before · pallets/nft/src/tests.rs
1// Tests to be written here2use super::*;3use crate::mock::*;4use crate::{AccessMode, ApprovePermissions, CollectionMode,5    Ownership, ChainLimits, CreateItemData, CreateNftData, CreateFungibleData, CreateReFungibleData,6    CollectionId, TokenId, MAX_DECIMAL_POINTS};7use frame_support::{assert_noop, assert_ok};8use frame_system::{ RawOrigin };910fn default_collection_numbers_limit() -> u32 {11    1012}1314fn default_limits() {15    assert_ok!(TemplateModule::set_chain_limits(RawOrigin::Root.into(), ChainLimits { 16            collection_numbers_limit: default_collection_numbers_limit(),17            account_token_ownership_limit: 10,18            collections_admins_limit: 5,19            custom_data_limit: 2048,20            nft_sponsor_transfer_timeout: 15,21            fungible_sponsor_transfer_timeout: 15,22            refungible_sponsor_transfer_timeout: 15,          23        }));24}2526fn default_nft_data() -> CreateNftData {27    CreateNftData { const_data: vec![1, 2, 3], variable_data: vec![3, 2, 1] }28}2930fn default_fungible_data () -> CreateFungibleData {31    CreateFungibleData { }32}3334fn default_re_fungible_data () -> CreateReFungibleData {35    CreateReFungibleData { const_data: vec![1, 2, 3], variable_data: vec![3, 2, 1] }36}3738fn create_test_collection_for_owner(mode: &CollectionMode, owner: u64, id: CollectionId) -> CollectionId {39    let col_name1: Vec<u16> = "Test1\0".encode_utf16().collect::<Vec<u16>>();40    let col_desc1: Vec<u16> = "TestDescription1\0".encode_utf16().collect::<Vec<u16>>();41    let token_prefix1: Vec<u8> = b"token_prefix1\0".to_vec();4243    let origin1 = Origin::signed(owner);44    assert_ok!(TemplateModule::create_collection(45            origin1.clone(),46            col_name1.clone(),47            col_desc1.clone(),48            token_prefix1.clone(),49            mode.clone()50        ));5152    let saved_col_name: Vec<u16> = "Test1\0\0".encode_utf16().collect::<Vec<u16>>();53    let saved_description: Vec<u16> = "TestDescription1\0\0".encode_utf16().collect::<Vec<u16>>();54    let saved_prefix: Vec<u8> = b"token_prefix1\0\0".to_vec();55    assert_eq!(TemplateModule::collection(id).owner, owner);56    assert_eq!(TemplateModule::collection(id).name, saved_col_name);57    assert_eq!(TemplateModule::collection(id).mode, *mode);58    assert_eq!(TemplateModule::collection(id).description, saved_description);59    assert_eq!(TemplateModule::collection(id).token_prefix, saved_prefix);60    id61}6263fn create_test_collection(mode: &CollectionMode, id: CollectionId) -> CollectionId {64    create_test_collection_for_owner(&mode, 1, id)65}6667fn create_test_item(collection_id: CollectionId, data: &CreateItemData) {68    let origin1 = Origin::signed(1);69    assert_ok!(TemplateModule::create_item(70            origin1.clone(),71            collection_id,72            1,73            data.clone()74        ));7576}7778// Use cases tests region79// #region8081#[test]82fn set_version_schema() {83    new_test_ext().execute_with(|| {84        default_limits();85        let origin1 = Origin::signed(1);86        let collection_id = create_test_collection(&CollectionMode::NFT, 1);87        88        assert_ok!(TemplateModule::set_schema_version(origin1, collection_id, SchemaVersion::Unique));89        assert_eq!(TemplateModule::collection(collection_id).schema_version, SchemaVersion::Unique);90    });91}9293#[test]94fn create_fungible_collection_fails_with_large_decimal_numbers() {95    new_test_ext().execute_with(|| {96        default_limits();9798        let col_name1: Vec<u16> = "Test1\0".encode_utf16().collect::<Vec<u16>>();99        let col_desc1: Vec<u16> = "TestDescription1\0".encode_utf16().collect::<Vec<u16>>();100        let token_prefix1: Vec<u8> = b"token_prefix1\0".to_vec();101102        let origin1 = Origin::signed(1);103        assert_noop!(TemplateModule::create_collection(104            origin1,105            col_name1,106            col_desc1,107            token_prefix1,108            CollectionMode::Fungible(MAX_DECIMAL_POINTS + 1)109        ), Error::<Test>::CollectionDecimalPointLimitExceeded);110    });    111}112113#[test]114fn create_re_fungible_collection_fails_with_large_decimal_numbers() {115    new_test_ext().execute_with(|| {116        default_limits();117118        let col_name1: Vec<u16> = "Test1\0".encode_utf16().collect::<Vec<u16>>();119        let col_desc1: Vec<u16> = "TestDescription1\0".encode_utf16().collect::<Vec<u16>>();120        let token_prefix1: Vec<u8> = b"token_prefix1\0".to_vec();121122        let origin1 = Origin::signed(1);123        assert_noop!(TemplateModule::create_collection(124            origin1,125            col_name1,126            col_desc1,127            token_prefix1,128            CollectionMode::ReFungible(MAX_DECIMAL_POINTS + 1)129        ), Error::<Test>::CollectionDecimalPointLimitExceeded);130    });131}132133#[test]134fn create_nft_item() {135    new_test_ext().execute_with(|| {136        default_limits();137        let collection_id = create_test_collection(&CollectionMode::NFT, 1);138        139        let data = default_nft_data();140        create_test_item(collection_id, &data.clone().into());141        assert_eq!(TemplateModule::nft_item_id(collection_id, 1).const_data, data.const_data);142        assert_eq!(TemplateModule::nft_item_id(collection_id, 1).variable_data, data.variable_data);143    });144}145146// Use cases tests region147// #region148#[test]149fn create_nft_multiple_items() {150    new_test_ext().execute_with(|| {151        default_limits();152        153        create_test_collection(&CollectionMode::NFT, 1);154155        let origin1 = Origin::signed(1);156157        let items_data = vec![default_nft_data(), default_nft_data(), default_nft_data()];158159        assert_ok!(TemplateModule::create_multiple_items(160            origin1.clone(),161            1,162            1,163            items_data.clone().into_iter().map(|d| { d.into() }).collect()164        ));165        for (index, data) in items_data.iter().enumerate() {166            assert_eq!(TemplateModule::nft_item_id(1, (index + 1) as TokenId).const_data.to_vec(), data.const_data);167            assert_eq!(TemplateModule::nft_item_id(1, (index + 1) as TokenId).variable_data.to_vec(), data.variable_data);168        }169    });170}171172#[test]173fn create_refungible_item() {174    new_test_ext().execute_with(|| {175        default_limits();176        let collection_id = create_test_collection(&CollectionMode::ReFungible(3), 1);177178        let data = default_re_fungible_data();179        create_test_item(collection_id, &data.clone().into());180        assert_eq!(181            TemplateModule::refungible_item_id(collection_id, 1).const_data,182            data.const_data183        );184        assert_eq!(185            TemplateModule::refungible_item_id(collection_id, 1).variable_data,186            data.variable_data187        );188        assert_eq!(189            TemplateModule::refungible_item_id(collection_id, 1).owner[0],190            Ownership {191                owner: 1,192                fraction: 1000193            }194        );195    });196}197198#[test]199fn create_multiple_refungible_items() {200    new_test_ext().execute_with(|| {201        default_limits();202        203        create_test_collection(&CollectionMode::ReFungible(3), 1);204205        let origin1 = Origin::signed(1);206207        let items_data = vec![default_re_fungible_data(), default_re_fungible_data(), default_re_fungible_data()];208209        assert_ok!(TemplateModule::create_multiple_items(210            origin1.clone(),211            1,212            1,213            items_data.clone().into_iter().map(|d| { d.into() }).collect()214        ));215        for (index, data) in items_data.iter().enumerate() {216217            let item = TemplateModule::refungible_item_id(1, (index + 1) as TokenId);218            assert_eq!(item.const_data.to_vec(), data.const_data);219            assert_eq!(item.variable_data.to_vec(), data.variable_data);220            assert_eq!(221                item.owner[0],222                Ownership {223                    owner: 1,224                    fraction: 1000225                }226            );227        }228    });229}230231#[test]232fn create_fungible_item() {233    new_test_ext().execute_with(|| {234        default_limits();235        236        let collection_id = create_test_collection(&CollectionMode::Fungible(3), 1);237238        let data = default_fungible_data();239        create_test_item(collection_id, &data.into());240241        assert_eq!(TemplateModule::fungible_item_id(collection_id, 1).owner, 1);242    });243}244245#[test]246fn create_multiple_fungible_items() {247    new_test_ext().execute_with(|| {248        default_limits();249250        create_test_collection(&CollectionMode::Fungible(3), 1);251252        let origin1 = Origin::signed(1);253254        let items_data = vec![default_fungible_data(), default_fungible_data(), default_fungible_data()];255256        assert_ok!(TemplateModule::create_multiple_items(257            origin1.clone(),258            1,259            1,260            items_data.clone().into_iter().map(|d| { d.into() }).collect()261        ));262        263        for (index, _) in items_data.iter().enumerate() {264            assert_eq!(TemplateModule::fungible_item_id(1, (index + 1) as TokenId).owner, 1);265        }266        assert_eq!(TemplateModule::balance_count(1, 1), 3000);267        assert_eq!(TemplateModule::address_tokens(1, 1), [1, 2, 3]);268    });269}270271#[test]272fn transfer_fungible_item() {273    new_test_ext().execute_with(|| {274        default_limits();275        276        let collection_id = create_test_collection(&CollectionMode::Fungible(3), 1);277278        let origin1 = Origin::signed(1);279        let origin2 = Origin::signed(2);280281        let data = default_fungible_data();282        create_test_item(collection_id, &data.into());283284        assert_eq!(TemplateModule::fungible_item_id(1, 1).owner, 1);285        assert_eq!(TemplateModule::balance_count(1, 1), 1000);286        assert_eq!(TemplateModule::address_tokens(1, 1), [1]);287288        // change owner scenario289        assert_ok!(TemplateModule::transfer(origin1.clone(), 2, 1, 1, 1000));290        assert_eq!(TemplateModule::fungible_item_id(1, 1).owner, 2);291        assert_eq!(TemplateModule::fungible_item_id(1, 1).value, 1000);292        assert_eq!(TemplateModule::balance_count(1, 1), 0);293        assert_eq!(TemplateModule::balance_count(1, 2), 1000);294        // assert_eq!(TemplateModule::address_tokens(1, 1), []);295        assert_eq!(TemplateModule::address_tokens(1, 2), [1]);296297        // split item scenario298        assert_ok!(TemplateModule::transfer(origin2.clone(), 3, 1, 1, 500));299        assert_eq!(TemplateModule::fungible_item_id(1, 1).owner, 2);300        assert_eq!(TemplateModule::fungible_item_id(1, 2).owner, 3);301        assert_eq!(TemplateModule::balance_count(1, 2), 500);302        assert_eq!(TemplateModule::balance_count(1, 3), 500);303        assert_eq!(TemplateModule::address_tokens(1, 2), [1]);304        assert_eq!(TemplateModule::address_tokens(1, 3), [2]);305306        // split item and new owner has account scenario307        assert_ok!(TemplateModule::transfer(origin2.clone(), 3, 1, 1, 200));308        assert_eq!(TemplateModule::fungible_item_id(1, 1).value, 300);309        assert_eq!(TemplateModule::fungible_item_id(1, 2).value, 700);310        assert_eq!(TemplateModule::balance_count(1, 2), 300);311        assert_eq!(TemplateModule::balance_count(1, 3), 700);312        assert_eq!(TemplateModule::address_tokens(1, 2), [1]);313        assert_eq!(TemplateModule::address_tokens(1, 3), [2]);314    });315}316317#[test]318fn transfer_refungible_item() {319    new_test_ext().execute_with(|| {320        default_limits();321        322        let collection_id = create_test_collection(&CollectionMode::ReFungible(3), 1);323324        let data = default_re_fungible_data();325        create_test_item(collection_id, &data.clone().into());326327        let origin1 = Origin::signed(1);328        let origin2 = Origin::signed(2);329        assert_eq!(330            TemplateModule::refungible_item_id(collection_id, 1).const_data,331            data.const_data332        );333        assert_eq!(334            TemplateModule::refungible_item_id(collection_id, 1).variable_data,335            data.variable_data336        );337        assert_eq!(338            TemplateModule::refungible_item_id(collection_id, 1).owner[0],339            Ownership {340                owner: 1,341                fraction: 1000342            }343        );344        assert_eq!(TemplateModule::balance_count(1, 1), 1000);345        assert_eq!(TemplateModule::address_tokens(1, 1), [1]);346347        // change owner scenario348        assert_ok!(TemplateModule::transfer(origin1.clone(), 2, 1, 1, 1000));349        assert_eq!(350            TemplateModule::refungible_item_id(1, 1).owner[0],351            Ownership {352                owner: 2,353                fraction: 1000354            }355        );356        assert_eq!(TemplateModule::balance_count(1, 1), 0);357        assert_eq!(TemplateModule::balance_count(1, 2), 1000);358        // assert_eq!(TemplateModule::address_tokens(1, 1), []);359        assert_eq!(TemplateModule::address_tokens(1, 2), [1]);360361        // split item scenario362        assert_ok!(TemplateModule::transfer(origin2.clone(), 3, 1, 1, 500));363        assert_eq!(364            TemplateModule::refungible_item_id(1, 1).owner[0],365            Ownership {366                owner: 2,367                fraction: 500368            }369        );370        assert_eq!(371            TemplateModule::refungible_item_id(1, 1).owner[1],372            Ownership {373                owner: 3,374                fraction: 500375            }376        );377        assert_eq!(TemplateModule::balance_count(1, 2), 500);378        assert_eq!(TemplateModule::balance_count(1, 3), 500);379        assert_eq!(TemplateModule::address_tokens(1, 2), [1]);380        assert_eq!(TemplateModule::address_tokens(1, 3), [1]);381382        // split item and new owner has account scenario383        assert_ok!(TemplateModule::transfer(origin2.clone(), 3, 1, 1, 200));384        assert_eq!(385            TemplateModule::refungible_item_id(1, 1).owner[0],386            Ownership {387                owner: 2,388                fraction: 300389            }390        );391        assert_eq!(392            TemplateModule::refungible_item_id(1, 1).owner[1],393            Ownership {394                owner: 3,395                fraction: 700396            }397        );398        assert_eq!(TemplateModule::balance_count(1, 2), 300);399        assert_eq!(TemplateModule::balance_count(1, 3), 700);400        assert_eq!(TemplateModule::address_tokens(1, 2), [1]);401        assert_eq!(TemplateModule::address_tokens(1, 3), [1]);402    });403}404405#[test]406fn transfer_nft_item() {407    new_test_ext().execute_with(|| {408        default_limits();409        410        let collection_id = create_test_collection(&CollectionMode::NFT, 1);411412        let data = default_nft_data();413        create_test_item(collection_id, &data.into());414        assert_eq!(TemplateModule::balance_count(1, 1), 1);415        assert_eq!(TemplateModule::address_tokens(1, 1), [1]);416417        let origin1 = Origin::signed(1);418        // default scenario419        assert_ok!(TemplateModule::transfer(origin1.clone(), 2, 1, 1, 1000));420        assert_eq!(TemplateModule::nft_item_id(1, 1).owner, 2);421        assert_eq!(TemplateModule::balance_count(1, 1), 0);422        assert_eq!(TemplateModule::balance_count(1, 2), 1);423        // assert_eq!(TemplateModule::address_tokens(1, 1), []);424        assert_eq!(TemplateModule::address_tokens(1, 2), [1]);425    });426}427428#[test]429fn nft_approve_and_transfer_from() {430    new_test_ext().execute_with(|| {431        default_limits();432        433        let collection_id = create_test_collection(&CollectionMode::NFT, 1);434435        let data = default_nft_data();436        create_test_item(collection_id, &data.into());437438        let origin1 = Origin::signed(1);439        let origin2 = Origin::signed(2);440441        assert_eq!(TemplateModule::balance_count(1, 1), 1);442        assert_eq!(TemplateModule::address_tokens(1, 1), [1]);443444        // neg transfer445        assert_noop!(TemplateModule::transfer_from(446            origin2.clone(),447            1,448            2,449            1,450            1,451            1), Error::<Test>::NoPermission);452453        // do approve454        assert_ok!(TemplateModule::approve(origin1.clone(), 2, 1, 1));455        assert_eq!(TemplateModule::approved(1, (1, 1)).len(), 1);456        assert_eq!(457            TemplateModule::approved(1, (1, 1))[0],458            ApprovePermissions {459                approved: 2,460                amount: 100000000461            }462        );463464        assert_ok!(TemplateModule::transfer_from(465            origin2.clone(),466            1,467            2,468            1,469            1,470            1471        ));472        assert_eq!(TemplateModule::approved(1, (1, 1)).len(), 0);473    });474}475476#[test]477fn nft_approve_and_transfer_from_white_list() {478    new_test_ext().execute_with(|| {479        default_limits();480        481        let collection_id = create_test_collection(&CollectionMode::NFT, 1);482483        let origin1 = Origin::signed(1);484        let origin2 = Origin::signed(2);485486        let data = default_nft_data();487        create_test_item(collection_id, &data.clone().into());488489        assert_eq!(TemplateModule::nft_item_id(1, 1).const_data, data.const_data);490        assert_eq!(TemplateModule::balance_count(1, 1), 1);491        assert_eq!(TemplateModule::address_tokens(1, 1), [1]);492493        assert_ok!(TemplateModule::set_mint_permission(494            origin1.clone(),495            1,496            true497        ));498        assert_ok!(TemplateModule::set_public_access_mode(499            origin1.clone(),500            1,501            AccessMode::WhiteList502        ));503        assert_ok!(TemplateModule::add_to_white_list(origin1.clone(), 1, 1));504        assert_ok!(TemplateModule::add_to_white_list(origin1.clone(), 1, 2));505        assert_ok!(TemplateModule::add_to_white_list(origin1.clone(), 1, 3));506507        // do approve508        assert_ok!(TemplateModule::approve(origin1.clone(), 2, 1, 1));509        assert_eq!(TemplateModule::approved(1, (1, 1)).len(), 1);510        assert_ok!(TemplateModule::approve(origin1.clone(), 3, 1, 1));511        assert_eq!(TemplateModule::approved(1, (1, 1)).len(), 2);512        assert_eq!(513            TemplateModule::approved(1, (1, 1))[0],514            ApprovePermissions {515                approved: 2,516                amount: 100000000517            }518        );519520        assert_ok!(TemplateModule::transfer_from(521            origin2.clone(),522            1,523            3,524            1,525            1,526            1527        ));528        assert_eq!(TemplateModule::approved(1, (1, 1)).len(), 0);529    });530}531532#[test]533fn refungible_approve_and_transfer_from() {534    new_test_ext().execute_with(|| {535        default_limits();536        537        let collection_id = create_test_collection(&CollectionMode::ReFungible(3), 1);538        539        let origin1 = Origin::signed(1);540        let origin2 = Origin::signed(2);541542        let data = default_re_fungible_data();543        create_test_item(collection_id, &data.into());544545        assert_eq!(TemplateModule::balance_count(1, 1), 1000);546        assert_eq!(TemplateModule::address_tokens(1, 1), [1]);547548        assert_ok!(TemplateModule::set_mint_permission(549            origin1.clone(),550            1,551            true552        ));553        assert_ok!(TemplateModule::set_public_access_mode(554            origin1.clone(),555            1,556            AccessMode::WhiteList557        ));558        assert_ok!(TemplateModule::add_to_white_list(origin1.clone(), 1, 1));559        assert_ok!(TemplateModule::add_to_white_list(origin1.clone(), 1, 2));560        assert_ok!(TemplateModule::add_to_white_list(origin1.clone(), 1, 3));561562        // do approve563        assert_ok!(TemplateModule::approve(origin1.clone(), 2, 1, 1));564        assert_eq!(TemplateModule::approved(1, (1, 1)).len(), 1);565        assert_ok!(TemplateModule::approve(origin1.clone(), 3, 1, 1));566        assert_eq!(TemplateModule::approved(1, (1, 1)).len(), 2);567        assert_eq!(568            TemplateModule::approved(1, (1, 1))[0],569            ApprovePermissions {570                approved: 2,571                amount: 100000000572            }573        );574575        assert_ok!(TemplateModule::transfer_from(576            origin2.clone(),577            1,578            3,579            1,580            1,581            100582        ));583        assert_eq!(TemplateModule::balance_count(1, 1), 900);584        assert_eq!(TemplateModule::balance_count(1, 3), 100);585        assert_eq!(TemplateModule::address_tokens(1, 1), [1]);586        assert_eq!(TemplateModule::address_tokens(1, 3), [1]);587588        assert_eq!(TemplateModule::approved(1, (1, 1)).len(), 1);589        assert_eq!(590            TemplateModule::approved(1, (1, 1))[0],591            ApprovePermissions {592                approved: 3,593                amount: 100000000594            }595        );596    });597}598599#[test]600fn fungible_approve_and_transfer_from() {601    new_test_ext().execute_with(|| {602        default_limits();603        604        let collection_id = create_test_collection(&CollectionMode::Fungible(3), 1);605        606        let data = default_fungible_data();607        create_test_item(collection_id, &data.into());608609        let origin1 = Origin::signed(1);610        let origin2 = Origin::signed(2);611612        assert_eq!(TemplateModule::balance_count(1, 1), 1000);613        assert_eq!(TemplateModule::address_tokens(1, 1), [1]);614615        assert_ok!(TemplateModule::set_mint_permission(616            origin1.clone(),617            1,618            true619        ));620        assert_ok!(TemplateModule::set_public_access_mode(621            origin1.clone(),622            1,623            AccessMode::WhiteList624        ));625        assert_ok!(TemplateModule::add_to_white_list(origin1.clone(), 1, 1));626        assert_ok!(TemplateModule::add_to_white_list(origin1.clone(), 1, 2));627        assert_ok!(TemplateModule::add_to_white_list(origin1.clone(), 1, 3));628629        // do approve630        assert_ok!(TemplateModule::approve(origin1.clone(), 2, 1, 1));631        assert_eq!(TemplateModule::approved(1, (1, 1)).len(), 1);632        assert_ok!(TemplateModule::approve(origin1.clone(), 3, 1, 1));633        assert_eq!(TemplateModule::approved(1, (1, 1)).len(), 2);634        assert_eq!(635            TemplateModule::approved(1, (1, 1))[0],636            ApprovePermissions {637                approved: 2,638                amount: 100000000639            }640        );641642        assert_ok!(TemplateModule::transfer_from(643            origin2.clone(),644            1,645            3,646            1,647            1,648            100649        ));650        assert_eq!(TemplateModule::balance_count(1, 1), 900);651        assert_eq!(TemplateModule::balance_count(1, 3), 100);652        assert_eq!(TemplateModule::address_tokens(1, 1), [1]);653        assert_eq!(TemplateModule::address_tokens(1, 3), [2]);654655        assert_eq!(TemplateModule::approved(1, (1, 1)).len(), 1);656        assert_eq!(657            TemplateModule::approved(1, (1, 1))[0],658            ApprovePermissions {659                approved: 3,660                amount: 100000000661            }662        );663664        assert_ok!(TemplateModule::approve(origin1.clone(), 2, 1, 1));665        assert_ok!(TemplateModule::transfer_from(666            origin2.clone(),667            1,668            3,669            1,670            1,671            900672        ));673        assert_eq!(TemplateModule::balance_count(1, 1), 0);674        assert_eq!(TemplateModule::balance_count(1, 3), 1000);675        // assert_eq!(TemplateModule::address_tokens(1, 1), []);676        assert_eq!(TemplateModule::address_tokens(1, 3), [2]);677678        assert_eq!(TemplateModule::approved(1, (1, 1)).len(), 0);679    });680}681682#[test]683fn change_collection_owner() {684    new_test_ext().execute_with(|| {685        default_limits();686        687        let collection_id = create_test_collection(&CollectionMode::NFT, 1);688        689        let origin1 = Origin::signed(1);690        assert_ok!(TemplateModule::change_collection_owner(691            origin1.clone(),692            collection_id,693            2694        ));695        assert_eq!(TemplateModule::collection(collection_id).owner, 2);696    });697}698699#[test]700fn destroy_collection() {701    new_test_ext().execute_with(|| {702        default_limits();703        704        let collection_id = create_test_collection(&CollectionMode::NFT, 1);705        706        let origin1 = Origin::signed(1);707        assert_ok!(TemplateModule::destroy_collection(origin1.clone(), collection_id));708    });709}710711#[test]712fn burn_nft_item() {713    new_test_ext().execute_with(|| {714        default_limits();715        716        let collection_id = create_test_collection(&CollectionMode::NFT, 1);717718        let origin1 = Origin::signed(1);719        assert_ok!(TemplateModule::add_collection_admin(origin1.clone(), collection_id, 2));720        721        let data = default_nft_data();722        create_test_item(collection_id, &data.into());723724        // check balance (collection with id = 1, user id = 1)725        assert_eq!(TemplateModule::balance_count(1, 1), 1);726727        // burn item728        assert_ok!(TemplateModule::burn_item(origin1.clone(), 1, 1));729        assert_noop!(730            TemplateModule::burn_item(origin1.clone(), 1, 1),731            Error::<Test>::TokenNotFound732        );733734        assert_eq!(TemplateModule::balance_count(1, 1), 0);735    });736}737738#[test]739fn burn_fungible_item() {740    new_test_ext().execute_with(|| {741        default_limits();742        743        let collection_id = create_test_collection(&CollectionMode::Fungible(3), 1);744        745        let origin1 = Origin::signed(1);746        assert_ok!(TemplateModule::add_collection_admin(origin1.clone(), collection_id, 2));747        748        let data = default_fungible_data();749        create_test_item(collection_id, &data.into());750751        // check balance (collection with id = 1, user id = 1)752        assert_eq!(TemplateModule::balance_count(1, 1), 1000);753754        // burn item755        assert_ok!(TemplateModule::burn_item(origin1.clone(), 1, 1));756        assert_noop!(757            TemplateModule::burn_item(origin1.clone(), 1, 1),758            Error::<Test>::TokenNotFound759        );760761        assert_eq!(TemplateModule::balance_count(1, 1), 0);762    });763}764765#[test]766fn burn_refungible_item() {767    new_test_ext().execute_with(|| {768        default_limits();769        770        let collection_id = create_test_collection(&CollectionMode::ReFungible(3), 1);771        let origin1 = Origin::signed(1);772773        assert_ok!(TemplateModule::set_mint_permission(774            origin1.clone(),775            collection_id,776            true777        ));778        assert_ok!(TemplateModule::set_public_access_mode(779            origin1.clone(),780            collection_id,781            AccessMode::WhiteList782        ));783        assert_ok!(TemplateModule::add_to_white_list(origin1.clone(), 1, 1));784785        assert_ok!(TemplateModule::add_collection_admin(origin1.clone(), 1, 2));786        787        let data = default_re_fungible_data();788        create_test_item(collection_id, &data.into());789790        // check balance (collection with id = 1, user id = 2)791        assert_eq!(TemplateModule::balance_count(1, 1), 1000);792793        // burn item794        assert_ok!(TemplateModule::burn_item(origin1.clone(), 1, 1));795        assert_noop!(796            TemplateModule::burn_item(origin1.clone(), 1, 1),797            Error::<Test>::TokenNotFound798        );799800        assert_eq!(TemplateModule::balance_count(1, 1), 0);801    });802}803804#[test]805fn add_collection_admin() {806    new_test_ext().execute_with(|| {807        default_limits();808        809        let collection1_id = create_test_collection_for_owner(&CollectionMode::NFT, 1, 1);810        create_test_collection_for_owner(&CollectionMode::NFT, 2, 2);811        create_test_collection_for_owner(&CollectionMode::NFT, 3, 3);812        813        let origin1 = Origin::signed(1);814815        // collection admin816        assert_ok!(TemplateModule::add_collection_admin(origin1.clone(), collection1_id, 2));817        assert_ok!(TemplateModule::add_collection_admin(origin1.clone(), collection1_id, 3));818819        assert_eq!(TemplateModule::admin_list_collection(collection1_id).contains(&2), true);820        assert_eq!(TemplateModule::admin_list_collection(collection1_id).contains(&3), true);821    });822}823824#[test]825fn remove_collection_admin() {826    new_test_ext().execute_with(|| {827        default_limits();828        829        let collection1_id = create_test_collection_for_owner(&CollectionMode::NFT, 1, 1);830        create_test_collection_for_owner(&CollectionMode::NFT, 2, 2);831        create_test_collection_for_owner(&CollectionMode::NFT, 3, 3);832833        let origin1 = Origin::signed(1);834        let origin2 = Origin::signed(2);835836        // collection admin837        assert_ok!(TemplateModule::add_collection_admin(origin1.clone(), collection1_id, 2));838        assert_ok!(TemplateModule::add_collection_admin(origin1.clone(), collection1_id, 3));839840        assert_eq!(TemplateModule::admin_list_collection(1).contains(&2), true);841        assert_eq!(TemplateModule::admin_list_collection(1).contains(&3), true);842843        // remove admin844        assert_ok!(TemplateModule::remove_collection_admin(845            origin2.clone(),846            1,847            3848        ));849        assert_eq!(TemplateModule::admin_list_collection(1).contains(&3), false);850    });851}852853#[test]854fn balance_of() {855    new_test_ext().execute_with(|| {856        default_limits();857        858        let nft_collection_id = create_test_collection(&CollectionMode::NFT, 1);859        let fungible_collection_id = create_test_collection(&CollectionMode::Fungible(3), 2);860        let re_fungible_collection_id = create_test_collection(&CollectionMode::ReFungible(3), 3);861        862        // check balance before863        assert_eq!(TemplateModule::balance_count(nft_collection_id, 1), 0);864        assert_eq!(TemplateModule::balance_count(fungible_collection_id, 1), 0);865        assert_eq!(TemplateModule::balance_count(re_fungible_collection_id, 1), 0);866867        let nft_data = default_nft_data();868        create_test_item(nft_collection_id, &nft_data.into());869        870        let fungible_data = default_fungible_data();871        create_test_item(fungible_collection_id, &fungible_data.into());872        873        let re_fungible_data = default_re_fungible_data();874        create_test_item(re_fungible_collection_id, &re_fungible_data.into());875876        // check balance (collection with id = 1, user id = 1)877        assert_eq!(TemplateModule::balance_count(nft_collection_id, 1), 1);878        assert_eq!(TemplateModule::balance_count(fungible_collection_id, 1), 1000);879        assert_eq!(TemplateModule::balance_count(re_fungible_collection_id, 1), 1000);880        assert_eq!(TemplateModule::nft_item_id(nft_collection_id, 1).owner, 1);881        assert_eq!(TemplateModule::fungible_item_id(fungible_collection_id, 1).owner, 1);882        assert_eq!(TemplateModule::refungible_item_id(re_fungible_collection_id, 1).owner[0].owner, 1);883    });884}885886#[test]887fn approve() {888    new_test_ext().execute_with(|| {889        default_limits();890        891        let collection_id = create_test_collection(&CollectionMode::NFT, 1);892        893        let data = default_nft_data();894        create_test_item(collection_id, &data.into());895896        let origin1 = Origin::signed(1);897        898        // approve899        assert_ok!(TemplateModule::approve(origin1.clone(), 2, 1, 1));900        assert_eq!(TemplateModule::approved(1, (1, 1))[0].approved, 2);901    });902}903904#[test]905fn transfer_from() {906    new_test_ext().execute_with(|| {907        default_limits();908        909        let collection_id = create_test_collection(&CollectionMode::NFT, 1);910        let origin1 = Origin::signed(1);911        let origin2 = Origin::signed(2);912913        let data = default_nft_data();914        create_test_item(collection_id, &data.into());915916        // approve917        assert_ok!(TemplateModule::approve(origin1.clone(), 2, 1, 1));918        assert_eq!(TemplateModule::approved(1, (1, 1))[0].approved, 2);919920        assert_ok!(TemplateModule::set_mint_permission(921            origin1.clone(),922            1,923            true924        ));925        assert_ok!(TemplateModule::set_public_access_mode(926            origin1.clone(),927            1,928            AccessMode::WhiteList929        ));930        assert_ok!(TemplateModule::add_to_white_list(origin1.clone(), 1, 1));931        assert_ok!(TemplateModule::add_to_white_list(origin1.clone(), 1, 2));932        assert_ok!(TemplateModule::add_to_white_list(origin1.clone(), 1, 3));933934        assert_ok!(TemplateModule::transfer_from(935            origin2.clone(),936            1,937            2,938            1,939            1,940            1941        ));942943        // after transfer944        assert_eq!(TemplateModule::balance_count(1, 1), 0);945        assert_eq!(TemplateModule::balance_count(1, 2), 1);946    });947}948949// #endregion950951// Coverage tests region952// #region953954#[test]955fn owner_can_add_address_to_white_list() {956    new_test_ext().execute_with(|| {957        default_limits();958        959        let collection_id = create_test_collection(&CollectionMode::NFT, 1);960961        let origin1 = Origin::signed(1);962        assert_ok!(TemplateModule::add_to_white_list(origin1.clone(), collection_id, 2));963        assert_eq!(TemplateModule::white_list(collection_id)[0], 2);964    });965}966967#[test]968fn admin_can_add_address_to_white_list() {969    new_test_ext().execute_with(|| {970        default_limits();971        972        let collection_id = create_test_collection(&CollectionMode::NFT, 1);973        let origin1 = Origin::signed(1);974        let origin2 = Origin::signed(2);975976        assert_ok!(TemplateModule::add_collection_admin(origin1.clone(), collection_id, 2));977        assert_ok!(TemplateModule::add_to_white_list(origin2.clone(), collection_id, 3));978        assert_eq!(TemplateModule::white_list(collection_id)[0], 3);979    });980}981982#[test]983fn nonprivileged_user_cannot_add_address_to_white_list() {984    new_test_ext().execute_with(|| {985        default_limits();986        987        let collection_id = create_test_collection(&CollectionMode::NFT, 1);988989        let origin2 = Origin::signed(2);990        assert_noop!(991            TemplateModule::add_to_white_list(origin2.clone(), collection_id, 3),992            Error::<Test>::NoPermission993        );994    });995}996997#[test]998fn nobody_can_add_address_to_white_list_of_nonexisting_collection() {999    new_test_ext().execute_with(|| {1000        default_limits();10011002        let origin1 = Origin::signed(1);10031004        assert_noop!(1005            TemplateModule::add_to_white_list(origin1.clone(), 1, 2),1006            Error::<Test>::CollectionNotFound1007        );1008    });1009}10101011#[test]1012fn nobody_can_add_address_to_white_list_of_deleted_collection() {1013    new_test_ext().execute_with(|| {1014        default_limits();1015        1016        let collection_id = create_test_collection(&CollectionMode::NFT, 1);10171018        let origin1 = Origin::signed(1);1019        assert_ok!(TemplateModule::destroy_collection(origin1.clone(), collection_id));1020        assert_noop!(1021            TemplateModule::add_to_white_list(origin1.clone(), collection_id, 2),1022            Error::<Test>::CollectionNotFound1023        );1024    });1025}10261027// If address is already added to white list, nothing happens1028#[test]1029fn address_is_already_added_to_white_list() {1030    new_test_ext().execute_with(|| {1031        default_limits();1032        1033        let collection_id = create_test_collection(&CollectionMode::NFT, 1);1034        let origin1 = Origin::signed(1);1035        1036        assert_ok!(TemplateModule::add_to_white_list(origin1.clone(), collection_id, 2));1037        assert_ok!(TemplateModule::add_to_white_list(origin1.clone(), collection_id, 2));1038        assert_eq!(TemplateModule::white_list(collection_id)[0], 2);1039        assert_eq!(TemplateModule::white_list(collection_id).len(), 1);1040    });1041}10421043#[test]1044fn owner_can_remove_address_from_white_list() {1045    new_test_ext().execute_with(|| {1046        default_limits();1047        1048        let collection_id = create_test_collection(&CollectionMode::NFT, 1);10491050        let origin1 = Origin::signed(1);1051        assert_ok!(TemplateModule::add_to_white_list(origin1.clone(), collection_id, 2));1052        assert_ok!(TemplateModule::remove_from_white_list(1053            origin1.clone(),1054            collection_id,1055            21056        ));1057        assert_eq!(TemplateModule::white_list(collection_id).len(), 0);1058    });1059}10601061#[test]1062fn admin_can_remove_address_from_white_list() {1063    new_test_ext().execute_with(|| {1064        default_limits();1065        1066        let collection_id = create_test_collection(&CollectionMode::NFT, 1);1067        let origin1 = Origin::signed(1);1068        let origin2 = Origin::signed(2);10691070        assert_ok!(TemplateModule::add_collection_admin(origin1.clone(), collection_id, 2));10711072        assert_ok!(TemplateModule::add_to_white_list(origin1.clone(), collection_id, 3));1073        assert_ok!(TemplateModule::remove_from_white_list(1074            origin2.clone(),1075            collection_id,1076            31077        ));1078        assert_eq!(TemplateModule::white_list(collection_id).len(), 0);1079    });1080}10811082#[test]1083fn nonprivileged_user_cannot_remove_address_from_white_list() {1084    new_test_ext().execute_with(|| {1085        default_limits();1086        1087        let collection_id = create_test_collection(&CollectionMode::NFT, 1);1088        let origin1 = Origin::signed(1);1089        let origin2 = Origin::signed(2);10901091        assert_ok!(TemplateModule::add_to_white_list(origin1.clone(), collection_id, 2));1092        assert_noop!(1093            TemplateModule::remove_from_white_list(origin2.clone(), collection_id, 2),1094            Error::<Test>::NoPermission1095        );1096        assert_eq!(TemplateModule::white_list(collection_id)[0], 2);1097    });1098}10991100#[test]1101fn nobody_can_remove_address_from_white_list_of_nonexisting_collection() {1102    new_test_ext().execute_with(|| {1103        default_limits();1104        let origin1 = Origin::signed(1);11051106        assert_noop!(1107            TemplateModule::remove_from_white_list(origin1.clone(), 1, 2),1108            Error::<Test>::CollectionNotFound1109        );1110    });1111}11121113#[test]1114fn nobody_can_remove_address_from_white_list_of_deleted_collection() {1115    new_test_ext().execute_with(|| {1116        default_limits();1117        1118        let collection_id = create_test_collection(&CollectionMode::NFT, 1);1119        let origin1 = Origin::signed(1);1120        let origin2 = Origin::signed(2);11211122        assert_ok!(TemplateModule::add_to_white_list(origin1.clone(), collection_id, 2));1123        assert_ok!(TemplateModule::destroy_collection(origin1.clone(), collection_id));1124        assert_noop!(1125            TemplateModule::remove_from_white_list(origin2.clone(), collection_id, 2),1126            Error::<Test>::CollectionNotFound1127        );1128        assert_eq!(TemplateModule::white_list(collection_id).len(), 0);1129    });1130}11311132// If address is already removed from white list, nothing happens1133#[test]1134fn address_is_already_removed_from_white_list() {1135    new_test_ext().execute_with(|| {1136        default_limits();1137        1138        let collection_id = create_test_collection(&CollectionMode::NFT, 1);1139        let origin1 = Origin::signed(1);11401141        assert_ok!(TemplateModule::add_to_white_list(origin1.clone(), collection_id, 2));1142        assert_ok!(TemplateModule::remove_from_white_list(1143            origin1.clone(),1144            collection_id,1145            21146        ));1147        assert_ok!(TemplateModule::remove_from_white_list(1148            origin1.clone(),1149            collection_id,1150            21151        ));1152        assert_eq!(TemplateModule::white_list(collection_id).len(), 0);1153    });1154}11551156// If Public Access mode is set to WhiteList, tokens can’t be transferred from a non-whitelisted address with transfer or transferFrom (2 tests)1157#[test]1158fn white_list_test_1() {1159    new_test_ext().execute_with(|| {1160        default_limits();1161        1162        let collection_id = create_test_collection(&CollectionMode::NFT, 1);11631164        let origin1 = Origin::signed(1);1165        1166        let data = default_nft_data();1167        create_test_item(collection_id, &data.into());11681169        assert_ok!(TemplateModule::set_public_access_mode(1170            origin1.clone(),1171            collection_id,1172            AccessMode::WhiteList1173        ));1174        assert_ok!(TemplateModule::add_to_white_list(origin1.clone(), collection_id, 2));11751176        assert_noop!(1177            TemplateModule::transfer(origin1.clone(), 3, 1, 1, 1),1178            Error::<Test>::AddresNotInWhiteList1179        );1180    });1181}11821183#[test]1184fn white_list_test_2() {1185    new_test_ext().execute_with(|| {1186        default_limits();1187        1188        let collection_id = create_test_collection(&CollectionMode::NFT, 1);1189        let origin1 = Origin::signed(1);1190        1191        let data = default_nft_data();1192        create_test_item(collection_id, &data.into());11931194        assert_ok!(TemplateModule::set_public_access_mode(1195            origin1.clone(),1196            collection_id,1197            AccessMode::WhiteList1198        ));1199        assert_ok!(TemplateModule::add_to_white_list(origin1.clone(), 1, 1));1200        assert_ok!(TemplateModule::add_to_white_list(origin1.clone(), 1, 2));12011202        // do approve1203        assert_ok!(TemplateModule::approve(origin1.clone(), 1, 1, 1));1204        assert_eq!(TemplateModule::approved(1, (1, 1)).len(), 1);12051206        assert_ok!(TemplateModule::remove_from_white_list(1207            origin1.clone(),1208            1,1209            11210        ));12111212        assert_noop!(1213            TemplateModule::transfer_from(origin1.clone(), 1, 3, 1, 1, 1),1214            Error::<Test>::AddresNotInWhiteList1215        );1216    });1217}12181219// If Public Access mode is set to WhiteList, tokens can’t be transferred to a non-whitelisted address with transfer or transferFrom (2 tests)1220#[test]1221fn white_list_test_3() {1222    new_test_ext().execute_with(|| {1223        default_limits();1224        1225        let collection_id = create_test_collection(&CollectionMode::NFT, 1);12261227        let origin1 = Origin::signed(1);1228        1229        let data = default_nft_data();1230        create_test_item(collection_id, &data.into());12311232        assert_ok!(TemplateModule::set_public_access_mode(1233            origin1.clone(),1234            collection_id,1235            AccessMode::WhiteList1236        ));1237        assert_ok!(TemplateModule::add_to_white_list(origin1.clone(), 1, 1));12381239        assert_noop!(1240            TemplateModule::transfer(origin1.clone(), 3, 1, 1, 1),1241            Error::<Test>::AddresNotInWhiteList1242        );1243    });1244}12451246#[test]1247fn white_list_test_4() {1248    new_test_ext().execute_with(|| {1249        default_limits();1250        1251        let collection_id = create_test_collection(&CollectionMode::NFT, 1);12521253        let origin1 = Origin::signed(1);12541255        let data = default_nft_data();1256        create_test_item(collection_id, &data.into());12571258        assert_ok!(TemplateModule::set_public_access_mode(1259            origin1.clone(),1260            collection_id,1261            AccessMode::WhiteList1262        ));1263        assert_ok!(TemplateModule::add_to_white_list(origin1.clone(), collection_id, 1));1264        assert_ok!(TemplateModule::add_to_white_list(origin1.clone(), collection_id, 2));12651266        // do approve1267        assert_ok!(TemplateModule::approve(origin1.clone(), 1, 1, 1));1268        assert_eq!(TemplateModule::approved(1, (1, 1)).len(), 1);12691270        assert_ok!(TemplateModule::remove_from_white_list(1271            origin1.clone(),1272            collection_id,1273            21274        ));12751276        assert_noop!(1277            TemplateModule::transfer_from(origin1.clone(), 1, 3, 1, 1, 1),1278            Error::<Test>::AddresNotInWhiteList1279        );1280    });1281}12821283// If Public Access mode is set to WhiteList, tokens can’t be destroyed by a non-whitelisted address (even if it owned them before enabling WhiteList mode)1284#[test]1285fn white_list_test_5() {1286    new_test_ext().execute_with(|| {1287        default_limits();1288        1289        let collection_id = create_test_collection(&CollectionMode::NFT, 1);12901291        let origin1 = Origin::signed(1);12921293        let data = default_nft_data();1294        create_test_item(collection_id, &data.into());12951296        assert_ok!(TemplateModule::set_public_access_mode(1297            origin1.clone(),1298            collection_id,1299            AccessMode::WhiteList1300        ));1301        assert_noop!(1302            TemplateModule::burn_item(origin1.clone(), 1, 1),1303            Error::<Test>::AddresNotInWhiteList1304        );1305    });1306}13071308// If Public Access mode is set to WhiteList, oken transfers can’t be Approved by a non-whitelisted address (see Approve method).1309#[test]1310fn white_list_test_6() {1311    new_test_ext().execute_with(|| {1312        default_limits();1313        1314        let collection_id = create_test_collection(&CollectionMode::NFT, 1);13151316        let origin1 = Origin::signed(1);1317        assert_ok!(TemplateModule::set_public_access_mode(1318            origin1.clone(),1319            collection_id,1320            AccessMode::WhiteList1321        ));13221323        // do approve1324        assert_noop!(1325            TemplateModule::approve(origin1.clone(), 1, 1, 1),1326            Error::<Test>::AddresNotInWhiteList1327        );1328    });1329}13301331// If Public Access mode is set to WhiteList, tokens can be transferred from a whitelisted address with transfer or transferFrom (2 tests) and1332//          tokens can be transferred from a whitelisted address with transfer or transferFrom (2 tests)1333#[test]1334fn white_list_test_7() {1335    new_test_ext().execute_with(|| {1336        default_limits();1337        1338        let collection_id = create_test_collection(&CollectionMode::NFT, 1);13391340        let data = default_nft_data();1341        create_test_item(collection_id, &data.into());1342        1343        let origin1 = Origin::signed(1);13441345        assert_ok!(TemplateModule::set_public_access_mode(1346            origin1.clone(),1347            collection_id,1348            AccessMode::WhiteList1349        ));1350        assert_ok!(TemplateModule::add_to_white_list(origin1.clone(), collection_id, 1));1351        assert_ok!(TemplateModule::add_to_white_list(origin1.clone(), collection_id, 2));13521353        assert_ok!(TemplateModule::transfer(origin1.clone(), 2, 1, 1, 1));1354    });1355}13561357#[test]1358fn white_list_test_8() {1359    new_test_ext().execute_with(|| {1360        default_limits();1361        1362        let collection_id = create_test_collection(&CollectionMode::NFT, 1);13631364        let data = default_nft_data();1365        create_test_item(collection_id, &data.into());1366        1367        let origin1 = Origin::signed(1);13681369        assert_ok!(TemplateModule::set_public_access_mode(1370            origin1.clone(),1371            collection_id,1372            AccessMode::WhiteList1373        ));1374        assert_ok!(TemplateModule::add_to_white_list(origin1.clone(), collection_id, 1));1375        assert_ok!(TemplateModule::add_to_white_list(origin1.clone(), collection_id, 2));13761377        // do approve1378        assert_ok!(TemplateModule::approve(origin1.clone(), 1, 1, 1));1379        assert_eq!(TemplateModule::approved(1, (1, 1)).len(), 1);13801381        assert_ok!(TemplateModule::transfer_from(1382            origin1.clone(),1383            1,1384            2,1385            1,1386            1,1387            11388        ));1389    });1390}13911392// If Public Access mode is set to WhiteList, and Mint Permission is set to false, tokens can be created by owner.1393#[test]1394fn white_list_test_9() {1395    new_test_ext().execute_with(|| {1396        default_limits();1397        1398        let collection_id = create_test_collection(&CollectionMode::NFT, 1);1399        let origin1 = Origin::signed(1);14001401        assert_ok!(TemplateModule::set_public_access_mode(1402            origin1.clone(),1403            collection_id,1404            AccessMode::WhiteList1405        ));1406        assert_ok!(TemplateModule::set_mint_permission(1407            origin1.clone(),1408            collection_id,1409            false1410        ));14111412        let data = default_nft_data();1413        create_test_item(collection_id, &data.into());1414    });1415}14161417// If Public Access mode is set to WhiteList, and Mint Permission is set to false, tokens can be created by admin.1418#[test]1419fn white_list_test_10() {1420    new_test_ext().execute_with(|| {1421        default_limits();1422        1423        let collection_id = create_test_collection(&CollectionMode::NFT, 1);14241425        let origin1 = Origin::signed(1);1426        let origin2 = Origin::signed(2);14271428        assert_ok!(TemplateModule::set_public_access_mode(1429            origin1.clone(),1430            collection_id,1431            AccessMode::WhiteList1432        ));1433        assert_ok!(TemplateModule::set_mint_permission(1434            origin1.clone(),1435            collection_id,1436            false1437        ));14381439        assert_ok!(TemplateModule::add_collection_admin(origin1.clone(), collection_id, 2));14401441        assert_ok!(TemplateModule::create_item(1442            origin2.clone(),1443            collection_id,1444            2,1445            default_nft_data().into()1446        ));1447    });1448}14491450// If Public Access mode is set to WhiteList, and Mint Permission is set to false, tokens cannot be created by non-privileged and white listed address.1451#[test]1452fn white_list_test_11() {1453    new_test_ext().execute_with(|| {1454        default_limits();1455        1456        let collection_id = create_test_collection(&CollectionMode::NFT, 1);14571458        let origin1 = Origin::signed(1);1459        let origin2 = Origin::signed(2);14601461        assert_ok!(TemplateModule::set_public_access_mode(1462            origin1.clone(),1463            collection_id,1464            AccessMode::WhiteList1465        ));1466        assert_ok!(TemplateModule::set_mint_permission(1467            origin1.clone(),1468            collection_id,1469            false1470        ));1471        assert_ok!(TemplateModule::add_to_white_list(origin1.clone(), collection_id, 2));14721473        assert_noop!(1474            TemplateModule::create_item(origin2.clone(), 1, 2, default_nft_data().into()),1475            Error::<Test>::PublicMintingNotAllowed1476        );1477    });1478}14791480// If Public Access mode is set to WhiteList, and Mint Permission is set to false, tokens cannot be created by non-privileged and non-white listed address.1481#[test]1482fn white_list_test_12() {1483    new_test_ext().execute_with(|| {1484        default_limits();1485        1486        let collection_id = create_test_collection(&CollectionMode::NFT, 1);14871488        let origin1 = Origin::signed(1);1489        let origin2 = Origin::signed(2);14901491        assert_ok!(TemplateModule::set_public_access_mode(1492            origin1.clone(),1493            collection_id,1494            AccessMode::WhiteList1495        ));1496        assert_ok!(TemplateModule::set_mint_permission(1497            origin1.clone(),1498            collection_id,1499            false1500        ));15011502        assert_noop!(1503            TemplateModule::create_item(origin2.clone(), 1, 2, default_nft_data().into()),1504            Error::<Test>::PublicMintingNotAllowed1505        );1506    });1507}15081509// If Public Access mode is set to WhiteList, and Mint Permission is set to true, tokens can be created by owner.1510#[test]1511fn white_list_test_13() {1512    new_test_ext().execute_with(|| {1513        default_limits();1514        1515        let collection_id = create_test_collection(&CollectionMode::NFT, 1);15161517        let origin1 = Origin::signed(1);15181519        assert_ok!(TemplateModule::set_public_access_mode(1520            origin1.clone(),1521            collection_id,1522            AccessMode::WhiteList1523        ));1524        assert_ok!(TemplateModule::set_mint_permission(1525            origin1.clone(),1526            collection_id,1527            true1528        ));15291530        let data = default_nft_data();1531        create_test_item(collection_id, &data.into());1532    });1533}15341535// If Public Access mode is set to WhiteList, and Mint Permission is set to true, tokens can be created by admin.1536#[test]1537fn white_list_test_14() {1538    new_test_ext().execute_with(|| {1539        default_limits();1540        1541        let collection_id = create_test_collection(&CollectionMode::NFT, 1);15421543        let origin1 = Origin::signed(1);1544        let origin2 = Origin::signed(2);15451546        assert_ok!(TemplateModule::set_public_access_mode(1547            origin1.clone(),1548            collection_id,1549            AccessMode::WhiteList1550        ));1551        assert_ok!(TemplateModule::set_mint_permission(1552            origin1.clone(),1553            collection_id,1554            true1555        ));15561557        assert_ok!(TemplateModule::add_collection_admin(origin1.clone(), collection_id, 2));15581559        assert_ok!(TemplateModule::create_item(1560            origin2.clone(),1561            1,1562            2,1563            default_nft_data().into()1564        ));1565    });1566}15671568// If Public Access mode is set to WhiteList, and Mint Permission is set to true, tokens cannot be created by non-privileged and non-white listed address.1569#[test]1570fn white_list_test_15() {1571    new_test_ext().execute_with(|| {1572        default_limits();1573        1574        let collection_id = create_test_collection(&CollectionMode::NFT, 1);15751576        let origin1 = Origin::signed(1);1577        let origin2 = Origin::signed(2);15781579        assert_ok!(TemplateModule::set_public_access_mode(1580            origin1.clone(),1581            collection_id,1582            AccessMode::WhiteList1583        ));1584        assert_ok!(TemplateModule::set_mint_permission(1585            origin1.clone(),1586            collection_id,1587            true1588        ));15891590        assert_noop!(1591            TemplateModule::create_item(origin2.clone(), 1, 2, default_nft_data().into()),1592            Error::<Test>::AddresNotInWhiteList1593        );1594    });1595}15961597// If Public Access mode is set to WhiteList, and Mint Permission is set to true, tokens can be created by non-privileged and white listed address.1598#[test]1599fn white_list_test_16() {1600    new_test_ext().execute_with(|| {1601        default_limits();1602        1603        let collection_id = create_test_collection(&CollectionMode::NFT, 1);16041605        let origin1 = Origin::signed(1);1606        let origin2 = Origin::signed(2);16071608        assert_ok!(TemplateModule::set_public_access_mode(1609            origin1.clone(),1610            collection_id,1611            AccessMode::WhiteList1612        ));1613        assert_ok!(TemplateModule::set_mint_permission(1614            origin1.clone(),1615            collection_id,1616            true1617        ));1618        assert_ok!(TemplateModule::add_to_white_list(origin1.clone(), collection_id, 2));16191620        assert_ok!(TemplateModule::create_item(1621            origin2.clone(),1622            1,1623            2,1624            default_nft_data().into()1625        ));1626    });1627}16281629// Total number of collections. Positive test1630#[test]1631fn total_number_collections_bound() {1632    new_test_ext().execute_with(|| {1633        default_limits();1634        1635        create_test_collection(&CollectionMode::NFT, 1);1636    });1637}16381639// Total number of collections. Negotive test1640#[test]1641fn total_number_collections_bound_neg() {1642    new_test_ext().execute_with(|| {1643        default_limits();16441645        let origin1 = Origin::signed(1);16461647        for i in 0..default_collection_numbers_limit() {1648            create_test_collection(&CollectionMode::NFT, i + 1);1649        }16501651        let col_name1: Vec<u16> = "Test1\0".encode_utf16().collect::<Vec<u16>>();1652        let col_desc1: Vec<u16> = "TestDescription1\0".encode_utf16().collect::<Vec<u16>>();1653        let token_prefix1: Vec<u8> = b"token_prefix1\0".to_vec();16541655        // 11-th collection in chain. Expects error1656        assert_noop!(TemplateModule::create_collection(1657            origin1.clone(),1658            col_name1.clone(),1659            col_desc1.clone(),1660            token_prefix1.clone(),1661            CollectionMode::NFT1662        ), Error::<Test>::TotalCollectionsLimitExceeded);1663    });1664}16651666// Owned tokens by a single address. Positive test1667#[test]1668fn owned_tokens_bound() {1669    new_test_ext().execute_with(|| {1670        default_limits();1671        1672        let collection_id = create_test_collection(&CollectionMode::NFT, 1);16731674        let data = default_nft_data();1675        create_test_item(collection_id, &data.clone().into());1676        create_test_item(collection_id, &data.into());1677    });1678}16791680// Owned tokens by a single address. Negotive test1681#[test]1682fn owned_tokens_bound_neg() {1683    new_test_ext().execute_with(|| {1684        assert_ok!(TemplateModule::set_chain_limits(RawOrigin::Root.into(), ChainLimits { 1685            collection_numbers_limit: 10,1686            account_token_ownership_limit: 1,1687            collections_admins_limit: 5,1688            custom_data_limit: 2048,1689            nft_sponsor_transfer_timeout: 15,1690            fungible_sponsor_transfer_timeout: 15,1691            refungible_sponsor_transfer_timeout: 15,          1692        }));1693        1694        let collection_id = create_test_collection(&CollectionMode::NFT, 1);16951696        let origin1 = Origin::signed(1);1697        let data = default_nft_data();1698        create_test_item(collection_id, &data.clone().into());16991700        assert_noop!(TemplateModule::create_item(1701            origin1.clone(),1702            1,1703            1,1704            data.into()1705        ),  Error::<Test>::AddressOwnershipLimitExceeded);1706    });1707}17081709// Number of collection admins. Positive test1710#[test]1711fn collection_admins_bound() {1712    new_test_ext().execute_with(|| {1713        assert_ok!(TemplateModule::set_chain_limits(RawOrigin::Root.into(), ChainLimits { 1714            collection_numbers_limit: 10,1715            account_token_ownership_limit: 10,1716            collections_admins_limit: 2,1717            custom_data_limit: 2048,1718            nft_sponsor_transfer_timeout: 15,1719            fungible_sponsor_transfer_timeout: 15,1720            refungible_sponsor_transfer_timeout: 15,          1721        }));1722        1723        let collection_id = create_test_collection(&CollectionMode::NFT, 1);17241725        let origin1 = Origin::signed(1);1726        1727        assert_ok!(TemplateModule::add_collection_admin(origin1.clone(), collection_id, 2));1728        assert_ok!(TemplateModule::add_collection_admin(origin1.clone(), collection_id, 3));1729    });1730}17311732// Number of collection admins. Negotive test1733#[test]1734fn collection_admins_bound_neg() {1735    new_test_ext().execute_with(|| {1736        assert_ok!(TemplateModule::set_chain_limits(RawOrigin::Root.into(), ChainLimits { 1737            collection_numbers_limit: 10,1738            account_token_ownership_limit: 1,1739            collections_admins_limit: 1,1740            custom_data_limit: 2048,1741            nft_sponsor_transfer_timeout: 15,1742            fungible_sponsor_transfer_timeout: 15,1743            refungible_sponsor_transfer_timeout: 15,          1744        }));1745        1746        let collection_id = create_test_collection(&CollectionMode::NFT, 1);17471748        let origin1 = Origin::signed(1);17491750        assert_ok!(TemplateModule::add_collection_admin(origin1.clone(), collection_id, 2));1751        assert_noop!(TemplateModule::add_collection_admin(origin1.clone(), collection_id, 3), Error::<Test>::CollectionAdminsLimitExceeded);1752    });1753}17541755// NFT custom data size. Negative test const_data.1756#[test]1757fn custom_data_size_nft_const_data_bound_neg() {1758    new_test_ext().execute_with(|| {1759        assert_ok!(TemplateModule::set_chain_limits(RawOrigin::Root.into(), ChainLimits { 1760            collection_numbers_limit: 10,1761            account_token_ownership_limit: 10,1762            collections_admins_limit: 5,1763            custom_data_limit: 2,1764            nft_sponsor_transfer_timeout: 15,1765            fungible_sponsor_transfer_timeout: 15,1766            refungible_sponsor_transfer_timeout: 15,          1767        }));1768        1769        let collection_id = create_test_collection(&CollectionMode::NFT, 1);17701771        let origin1 = Origin::signed(1);1772        let too_big_const_data = CreateItemData::NFT(CreateNftData{1773            const_data: vec![1, 2, 3, 4],1774            variable_data: vec![]1775        });17761777        assert_noop!(TemplateModule::create_item(1778            origin1.clone(),1779            collection_id,1780            1,1781            too_big_const_data1782        ), Error::<Test>::TokenConstDataLimitExceeded);1783    });1784}17851786// NFT custom data size. Negative test variable_data.1787#[test]1788fn custom_data_size_nft_variable_data_bound_neg() {1789    new_test_ext().execute_with(|| {1790        assert_ok!(TemplateModule::set_chain_limits(RawOrigin::Root.into(), ChainLimits { 1791            collection_numbers_limit: 10,1792            account_token_ownership_limit: 10,1793            collections_admins_limit: 5,1794            custom_data_limit: 2,1795            nft_sponsor_transfer_timeout: 15,1796            fungible_sponsor_transfer_timeout: 15,1797            refungible_sponsor_transfer_timeout: 15,          1798        }));17991800        let collection_id = create_test_collection(&CollectionMode::NFT, 1);18011802        let origin1 = Origin::signed(1);1803        let too_big_const_data = CreateItemData::NFT(CreateNftData{1804            const_data: vec![],1805            variable_data: vec![1, 2, 3, 4]1806        });18071808        assert_noop!(TemplateModule::create_item(1809            origin1.clone(),1810            collection_id,1811            1,1812            too_big_const_data1813        ), Error::<Test>::TokenVariableDataLimitExceeded);1814    });1815}18161817// Re fungible custom data size. Negative test const_data.1818#[test]1819fn custom_data_size_re_fungible_const_data_bound_neg() {1820    new_test_ext().execute_with(|| {1821        assert_ok!(TemplateModule::set_chain_limits(RawOrigin::Root.into(), ChainLimits { 1822            collection_numbers_limit: 10,1823            account_token_ownership_limit: 10,1824            collections_admins_limit: 5,1825            custom_data_limit: 2,1826            nft_sponsor_transfer_timeout: 15,1827            fungible_sponsor_transfer_timeout: 15,1828            refungible_sponsor_transfer_timeout: 15,          1829        }));18301831        let collection_id = create_test_collection(&CollectionMode::NFT, 1);18321833        let origin1 = Origin::signed(1);1834        let too_big_const_data = CreateItemData::NFT(CreateNftData{1835            const_data: vec![1, 2, 3, 4],1836            variable_data: vec![]1837        });18381839        assert_noop!(TemplateModule::create_item(1840            origin1.clone(),1841            collection_id,1842            1,1843            too_big_const_data1844        ), Error::<Test>::TokenConstDataLimitExceeded);1845    });1846}18471848// Re fungible custom data size. Negative test variable_data.1849#[test]1850fn custom_data_size_re_fungible_variable_data_bound_neg() {1851    new_test_ext().execute_with(|| {1852        assert_ok!(TemplateModule::set_chain_limits(RawOrigin::Root.into(), ChainLimits { 1853            collection_numbers_limit: 10,1854            account_token_ownership_limit: 10,1855            collections_admins_limit: 5,1856            custom_data_limit: 2,1857            nft_sponsor_transfer_timeout: 15,1858            fungible_sponsor_transfer_timeout: 15,1859            refungible_sponsor_transfer_timeout: 15,          1860        }));18611862        let collection_id = create_test_collection(&CollectionMode::NFT, 1);18631864        let origin1 = Origin::signed(1);1865        let too_big_const_data = CreateItemData::NFT(CreateNftData{1866            const_data: vec![],1867            variable_data: vec![1, 2, 3, 4]1868        });18691870        assert_noop!(TemplateModule::create_item(1871            origin1.clone(),1872            collection_id,1873            1,1874            too_big_const_data1875        ), Error::<Test>::TokenVariableDataLimitExceeded);1876    });1877}1878// #endregion18791880#[test]1881fn set_const_on_chain_schema() {1882    new_test_ext().execute_with(|| {1883        default_limits();18841885        let collection_id = create_test_collection(&CollectionMode::NFT, 1);18861887        let origin1 = Origin::signed(1);1888        assert_ok!(TemplateModule::set_const_on_chain_schema(origin1, collection_id, b"test const on chain schema".to_vec()));18891890        assert_eq!(TemplateModule::collection(collection_id).const_on_chain_schema, b"test const on chain schema".to_vec());1891        assert_eq!(TemplateModule::collection(collection_id).variable_on_chain_schema, b"".to_vec());1892    });1893}18941895#[test]1896fn set_variable_on_chain_schema() {1897    new_test_ext().execute_with(|| {1898        default_limits();1899        1900        let collection_id = create_test_collection(&CollectionMode::NFT, 1);19011902        let origin1 = Origin::signed(1);1903        assert_ok!(TemplateModule::set_variable_on_chain_schema(origin1, collection_id, b"test variable on chain schema".to_vec()));19041905        assert_eq!(TemplateModule::collection(collection_id).const_on_chain_schema, b"".to_vec());1906        assert_eq!(TemplateModule::collection(collection_id).variable_on_chain_schema, b"test variable on chain schema".to_vec());1907    });1908}19091910#[test]1911fn set_variable_meta_data_on_nft_token_stores_variable_meta_data() {1912    new_test_ext().execute_with(|| {1913        default_limits();19141915        let collection_id = create_test_collection(&CollectionMode::NFT, 1);19161917        let origin1 = Origin::signed(1);1918        1919        let data = default_nft_data();1920        create_test_item(1, &data.into());1921        1922        let variable_data = b"test set_variable_meta_data method.".to_vec();1923        assert_ok!(TemplateModule::set_variable_meta_data(origin1, collection_id, 1, variable_data.clone()));19241925        assert_eq!(TemplateModule::nft_item_id(collection_id, 1).variable_data, variable_data);1926    });1927}19281929#[test]1930fn set_variable_meta_data_on_re_fungible_token_stores_variable_meta_data() {1931    new_test_ext().execute_with(|| {1932        default_limits();19331934        let collection_id = create_test_collection(&CollectionMode::ReFungible(3), 1);19351936        let origin1 = Origin::signed(1);19371938        let data = default_re_fungible_data();1939        create_test_item(1, &data.into());19401941        let variable_data = b"test set_variable_meta_data method.".to_vec();1942        assert_ok!(TemplateModule::set_variable_meta_data(origin1, collection_id, 1, variable_data.clone()));19431944        assert_eq!(TemplateModule::refungible_item_id(collection_id, 1).variable_data, variable_data);1945    });1946}194719481949#[test]1950fn set_variable_meta_data_on_fungible_token_fails() {1951    new_test_ext().execute_with(|| {1952        default_limits();19531954        let collection_id = create_test_collection(&CollectionMode::Fungible(3), 1);19551956        let origin1 = Origin::signed(1);19571958        let data = default_fungible_data();1959        create_test_item(1, &data.into());19601961        let variable_data = b"test set_variable_meta_data method.".to_vec();1962        assert_noop!(TemplateModule::set_variable_meta_data(origin1, collection_id, 1, variable_data.clone()), Error::<Test>::CantStoreMetadataInFungibleTokens);1963    });1964}19651966#[test]1967fn set_variable_meta_data_on_nft_token_fails_for_big_data() {1968    new_test_ext().execute_with(|| {1969        assert_ok!(TemplateModule::set_chain_limits(RawOrigin::Root.into(), ChainLimits { 1970            collection_numbers_limit: default_collection_numbers_limit(),1971            account_token_ownership_limit: 10,1972            collections_admins_limit: 5,1973            custom_data_limit: 10,1974            nft_sponsor_transfer_timeout: 15,1975            fungible_sponsor_transfer_timeout: 15,1976            refungible_sponsor_transfer_timeout: 15,          1977        }));19781979        let collection_id = create_test_collection(&CollectionMode::NFT, 1);19801981        let origin1 = Origin::signed(1);19821983        let data = default_nft_data();1984        create_test_item(1, &data.into());19851986        let variable_data = b"test set_variable_meta_data method, bigger than limits.".to_vec();1987        assert_noop!(TemplateModule::set_variable_meta_data(origin1, collection_id, 1, variable_data), Error::<Test>::TokenVariableDataLimitExceeded);1988    });1989}19901991#[test]1992fn set_variable_meta_data_on_re_fungible_token_fails_for_big_data() {1993    new_test_ext().execute_with(|| {1994        assert_ok!(TemplateModule::set_chain_limits(RawOrigin::Root.into(), ChainLimits { 1995            collection_numbers_limit: default_collection_numbers_limit(),1996            account_token_ownership_limit: 10,1997            collections_admins_limit: 5,1998            custom_data_limit: 10,1999            nft_sponsor_transfer_timeout: 15,2000            fungible_sponsor_transfer_timeout: 15,2001            refungible_sponsor_transfer_timeout: 15,          2002        }));200320042005        let collection_id = create_test_collection(&CollectionMode::ReFungible(3), 1);20062007        let origin1 = Origin::signed(1);20082009        let data = default_re_fungible_data();2010        create_test_item(1, &data.into());20112012        let variable_data = b"test set_variable_meta_data method, bigger than limits.".to_vec();2013        assert_noop!(TemplateModule::set_variable_meta_data(origin1, collection_id, 1, variable_data), Error::<Test>::TokenVariableDataLimitExceeded);2014    });2015}
after · pallets/nft/src/tests.rs
1// Tests to be written here2use super::*;3use crate::mock::*;4use crate::{AccessMode, ApprovePermissions, CollectionMode,5    Ownership, ChainLimits, CreateItemData, CreateNftData, CreateFungibleData, CreateReFungibleData,6    CollectionId, TokenId, MAX_DECIMAL_POINTS};7use frame_support::{assert_noop, assert_ok};8use frame_system::{ RawOrigin };910fn default_collection_numbers_limit() -> u32 {11    1012}1314fn default_limits() {15    assert_ok!(TemplateModule::set_chain_limits(RawOrigin::Root.into(), ChainLimits { 16            collection_numbers_limit: default_collection_numbers_limit(),17            account_token_ownership_limit: 10,18            collections_admins_limit: 5,19            custom_data_limit: 2048,20            nft_sponsor_transfer_timeout: 15,21            fungible_sponsor_transfer_timeout: 15,22            refungible_sponsor_transfer_timeout: 15,          23        }));24}2526fn default_nft_data() -> CreateNftData {27    CreateNftData { const_data: vec![1, 2, 3], variable_data: vec![3, 2, 1] }28}2930fn default_fungible_data () -> CreateFungibleData {31    CreateFungibleData { }32}3334fn default_re_fungible_data () -> CreateReFungibleData {35    CreateReFungibleData { const_data: vec![1, 2, 3], variable_data: vec![3, 2, 1] }36}3738fn create_test_collection_for_owner(mode: &CollectionMode, owner: u64, id: CollectionId) -> CollectionId {39    let col_name1: Vec<u16> = "Test1\0".encode_utf16().collect::<Vec<u16>>();40    let col_desc1: Vec<u16> = "TestDescription1\0".encode_utf16().collect::<Vec<u16>>();41    let token_prefix1: Vec<u8> = b"token_prefix1\0".to_vec();4243    let origin1 = Origin::signed(owner);44    assert_ok!(TemplateModule::create_collection(45            origin1.clone(),46            col_name1.clone(),47            col_desc1.clone(),48            token_prefix1.clone(),49            mode.clone()50        ));5152    let saved_col_name: Vec<u16> = "Test1\0\0".encode_utf16().collect::<Vec<u16>>();53    let saved_description: Vec<u16> = "TestDescription1\0\0".encode_utf16().collect::<Vec<u16>>();54    let saved_prefix: Vec<u8> = b"token_prefix1\0\0".to_vec();55    assert_eq!(TemplateModule::collection(id).owner, owner);56    assert_eq!(TemplateModule::collection(id).name, saved_col_name);57    assert_eq!(TemplateModule::collection(id).mode, *mode);58    assert_eq!(TemplateModule::collection(id).description, saved_description);59    assert_eq!(TemplateModule::collection(id).token_prefix, saved_prefix);60    id61}6263fn create_test_collection(mode: &CollectionMode, id: CollectionId) -> CollectionId {64    create_test_collection_for_owner(&mode, 1, id)65}6667fn create_test_item(collection_id: CollectionId, data: &CreateItemData) {68    let origin1 = Origin::signed(1);69    assert_ok!(TemplateModule::create_item(70            origin1.clone(),71            collection_id,72            1,73            data.clone()74        ));7576}7778// Use cases tests region79// #region8081#[test]82fn set_version_schema() {83    new_test_ext().execute_with(|| {84        default_limits();85        let origin1 = Origin::signed(1);86        let collection_id = create_test_collection(&CollectionMode::NFT, 1);87        88        assert_ok!(TemplateModule::set_schema_version(origin1, collection_id, SchemaVersion::Unique));89        assert_eq!(TemplateModule::collection(collection_id).schema_version, SchemaVersion::Unique);90    });91}9293#[test]94fn create_fungible_collection_fails_with_large_decimal_numbers() {95    new_test_ext().execute_with(|| {96        default_limits();9798        let col_name1: Vec<u16> = "Test1\0".encode_utf16().collect::<Vec<u16>>();99        let col_desc1: Vec<u16> = "TestDescription1\0".encode_utf16().collect::<Vec<u16>>();100        let token_prefix1: Vec<u8> = b"token_prefix1\0".to_vec();101102        let origin1 = Origin::signed(1);103        assert_noop!(TemplateModule::create_collection(104            origin1,105            col_name1,106            col_desc1,107            token_prefix1,108            CollectionMode::Fungible(MAX_DECIMAL_POINTS + 1)109        ), Error::<Test>::CollectionDecimalPointLimitExceeded);110    });    111}112113#[test]114fn create_re_fungible_collection_fails_with_large_decimal_numbers() {115    new_test_ext().execute_with(|| {116        default_limits();117118        let col_name1: Vec<u16> = "Test1\0".encode_utf16().collect::<Vec<u16>>();119        let col_desc1: Vec<u16> = "TestDescription1\0".encode_utf16().collect::<Vec<u16>>();120        let token_prefix1: Vec<u8> = b"token_prefix1\0".to_vec();121122        let origin1 = Origin::signed(1);123        assert_noop!(TemplateModule::create_collection(124            origin1,125            col_name1,126            col_desc1,127            token_prefix1,128            CollectionMode::ReFungible(MAX_DECIMAL_POINTS + 1)129        ), Error::<Test>::CollectionDecimalPointLimitExceeded);130    });131}132133#[test]134fn create_nft_item() {135    new_test_ext().execute_with(|| {136        default_limits();137        let collection_id = create_test_collection(&CollectionMode::NFT, 1);138        139        let data = default_nft_data();140        create_test_item(collection_id, &data.clone().into());141        assert_eq!(TemplateModule::nft_item_id(collection_id, 1).const_data, data.const_data);142        assert_eq!(TemplateModule::nft_item_id(collection_id, 1).variable_data, data.variable_data);143    });144}145146// Use cases tests region147// #region148#[test]149fn create_nft_multiple_items() {150    new_test_ext().execute_with(|| {151        default_limits();152        153        create_test_collection(&CollectionMode::NFT, 1);154155        let origin1 = Origin::signed(1);156157        let items_data = vec![default_nft_data(), default_nft_data(), default_nft_data()];158159        assert_ok!(TemplateModule::create_multiple_items(160            origin1.clone(),161            1,162            1,163            items_data.clone().into_iter().map(|d| { d.into() }).collect()164        ));165        for (index, data) in items_data.iter().enumerate() {166            assert_eq!(TemplateModule::nft_item_id(1, (index + 1) as TokenId).const_data.to_vec(), data.const_data);167            assert_eq!(TemplateModule::nft_item_id(1, (index + 1) as TokenId).variable_data.to_vec(), data.variable_data);168        }169    });170}171172#[test]173fn create_refungible_item() {174    new_test_ext().execute_with(|| {175        default_limits();176        let collection_id = create_test_collection(&CollectionMode::ReFungible(3), 1);177178        let data = default_re_fungible_data();179        create_test_item(collection_id, &data.clone().into());180        assert_eq!(181            TemplateModule::refungible_item_id(collection_id, 1).const_data,182            data.const_data183        );184        assert_eq!(185            TemplateModule::refungible_item_id(collection_id, 1).variable_data,186            data.variable_data187        );188        assert_eq!(189            TemplateModule::refungible_item_id(collection_id, 1).owner[0],190            Ownership {191                owner: 1,192                fraction: 1000193            }194        );195    });196}197198#[test]199fn create_multiple_refungible_items() {200    new_test_ext().execute_with(|| {201        default_limits();202        203        create_test_collection(&CollectionMode::ReFungible(3), 1);204205        let origin1 = Origin::signed(1);206207        let items_data = vec![default_re_fungible_data(), default_re_fungible_data(), default_re_fungible_data()];208209        assert_ok!(TemplateModule::create_multiple_items(210            origin1.clone(),211            1,212            1,213            items_data.clone().into_iter().map(|d| { d.into() }).collect()214        ));215        for (index, data) in items_data.iter().enumerate() {216217            let item = TemplateModule::refungible_item_id(1, (index + 1) as TokenId);218            assert_eq!(item.const_data.to_vec(), data.const_data);219            assert_eq!(item.variable_data.to_vec(), data.variable_data);220            assert_eq!(221                item.owner[0],222                Ownership {223                    owner: 1,224                    fraction: 1000225                }226            );227        }228    });229}230231#[test]232fn create_fungible_item() {233    new_test_ext().execute_with(|| {234        default_limits();235        236        let collection_id = create_test_collection(&CollectionMode::Fungible(3), 1);237238        let data = default_fungible_data();239        create_test_item(collection_id, &data.into());240241        assert_eq!(TemplateModule::fungible_item_id(collection_id, 1).owner, 1);242    });243}244245#[test]246fn create_multiple_fungible_items() {247    new_test_ext().execute_with(|| {248        default_limits();249250        create_test_collection(&CollectionMode::Fungible(3), 1);251252        let origin1 = Origin::signed(1);253254        let items_data = vec![default_fungible_data(), default_fungible_data(), default_fungible_data()];255256        assert_ok!(TemplateModule::create_multiple_items(257            origin1.clone(),258            1,259            1,260            items_data.clone().into_iter().map(|d| { d.into() }).collect()261        ));262        263        for (index, _) in items_data.iter().enumerate() {264            assert_eq!(TemplateModule::fungible_item_id(1, (index + 1) as TokenId).owner, 1);265        }266        assert_eq!(TemplateModule::balance_count(1, 1), 3000);267        assert_eq!(TemplateModule::address_tokens(1, 1), [1, 2, 3]);268    });269}270271#[test]272fn transfer_fungible_item() {273    new_test_ext().execute_with(|| {274        default_limits();275        276        let collection_id = create_test_collection(&CollectionMode::Fungible(3), 1);277278        let origin1 = Origin::signed(1);279        let origin2 = Origin::signed(2);280281        let data = default_fungible_data();282        create_test_item(collection_id, &data.into());283284        assert_eq!(TemplateModule::fungible_item_id(1, 1).owner, 1);285        assert_eq!(TemplateModule::balance_count(1, 1), 1000);286        assert_eq!(TemplateModule::address_tokens(1, 1), [1]);287288        // change owner scenario289        assert_ok!(TemplateModule::transfer(origin1.clone(), 2, 1, 1, 1000));290        assert_eq!(TemplateModule::fungible_item_id(1, 1).owner, 2);291        assert_eq!(TemplateModule::fungible_item_id(1, 1).value, 1000);292        assert_eq!(TemplateModule::balance_count(1, 1), 0);293        assert_eq!(TemplateModule::balance_count(1, 2), 1000);294        // assert_eq!(TemplateModule::address_tokens(1, 1), []);295        assert_eq!(TemplateModule::address_tokens(1, 2), [1]);296297        // split item scenario298        assert_ok!(TemplateModule::transfer(origin2.clone(), 3, 1, 1, 500));299        assert_eq!(TemplateModule::fungible_item_id(1, 1).owner, 2);300        assert_eq!(TemplateModule::fungible_item_id(1, 2).owner, 3);301        assert_eq!(TemplateModule::balance_count(1, 2), 500);302        assert_eq!(TemplateModule::balance_count(1, 3), 500);303        assert_eq!(TemplateModule::address_tokens(1, 2), [1]);304        assert_eq!(TemplateModule::address_tokens(1, 3), [2]);305306        // split item and new owner has account scenario307        assert_ok!(TemplateModule::transfer(origin2.clone(), 3, 1, 1, 200));308        assert_eq!(TemplateModule::fungible_item_id(1, 1).value, 300);309        assert_eq!(TemplateModule::fungible_item_id(1, 2).value, 700);310        assert_eq!(TemplateModule::balance_count(1, 2), 300);311        assert_eq!(TemplateModule::balance_count(1, 3), 700);312        assert_eq!(TemplateModule::address_tokens(1, 2), [1]);313        assert_eq!(TemplateModule::address_tokens(1, 3), [2]);314    });315}316317#[test]318fn transfer_refungible_item() {319    new_test_ext().execute_with(|| {320        default_limits();321        322        let collection_id = create_test_collection(&CollectionMode::ReFungible(3), 1);323324        let data = default_re_fungible_data();325        create_test_item(collection_id, &data.clone().into());326327        let origin1 = Origin::signed(1);328        let origin2 = Origin::signed(2);329        assert_eq!(330            TemplateModule::refungible_item_id(collection_id, 1).const_data,331            data.const_data332        );333        assert_eq!(334            TemplateModule::refungible_item_id(collection_id, 1).variable_data,335            data.variable_data336        );337        assert_eq!(338            TemplateModule::refungible_item_id(collection_id, 1).owner[0],339            Ownership {340                owner: 1,341                fraction: 1000342            }343        );344        assert_eq!(TemplateModule::balance_count(1, 1), 1000);345        assert_eq!(TemplateModule::address_tokens(1, 1), [1]);346347        // change owner scenario348        assert_ok!(TemplateModule::transfer(origin1.clone(), 2, 1, 1, 1000));349        assert_eq!(350            TemplateModule::refungible_item_id(1, 1).owner[0],351            Ownership {352                owner: 2,353                fraction: 1000354            }355        );356        assert_eq!(TemplateModule::balance_count(1, 1), 0);357        assert_eq!(TemplateModule::balance_count(1, 2), 1000);358        // assert_eq!(TemplateModule::address_tokens(1, 1), []);359        assert_eq!(TemplateModule::address_tokens(1, 2), [1]);360361        // split item scenario362        assert_ok!(TemplateModule::transfer(origin2.clone(), 3, 1, 1, 500));363        assert_eq!(364            TemplateModule::refungible_item_id(1, 1).owner[0],365            Ownership {366                owner: 2,367                fraction: 500368            }369        );370        assert_eq!(371            TemplateModule::refungible_item_id(1, 1).owner[1],372            Ownership {373                owner: 3,374                fraction: 500375            }376        );377        assert_eq!(TemplateModule::balance_count(1, 2), 500);378        assert_eq!(TemplateModule::balance_count(1, 3), 500);379        assert_eq!(TemplateModule::address_tokens(1, 2), [1]);380        assert_eq!(TemplateModule::address_tokens(1, 3), [1]);381382        // split item and new owner has account scenario383        assert_ok!(TemplateModule::transfer(origin2.clone(), 3, 1, 1, 200));384        assert_eq!(385            TemplateModule::refungible_item_id(1, 1).owner[0],386            Ownership {387                owner: 2,388                fraction: 300389            }390        );391        assert_eq!(392            TemplateModule::refungible_item_id(1, 1).owner[1],393            Ownership {394                owner: 3,395                fraction: 700396            }397        );398        assert_eq!(TemplateModule::balance_count(1, 2), 300);399        assert_eq!(TemplateModule::balance_count(1, 3), 700);400        assert_eq!(TemplateModule::address_tokens(1, 2), [1]);401        assert_eq!(TemplateModule::address_tokens(1, 3), [1]);402    });403}404405#[test]406fn transfer_nft_item() {407    new_test_ext().execute_with(|| {408        default_limits();409        410        let collection_id = create_test_collection(&CollectionMode::NFT, 1);411412        let data = default_nft_data();413        create_test_item(collection_id, &data.into());414        assert_eq!(TemplateModule::balance_count(1, 1), 1);415        assert_eq!(TemplateModule::address_tokens(1, 1), [1]);416417        let origin1 = Origin::signed(1);418        // default scenario419        assert_ok!(TemplateModule::transfer(origin1.clone(), 2, 1, 1, 1000));420        assert_eq!(TemplateModule::nft_item_id(1, 1).owner, 2);421        assert_eq!(TemplateModule::balance_count(1, 1), 0);422        assert_eq!(TemplateModule::balance_count(1, 2), 1);423        // assert_eq!(TemplateModule::address_tokens(1, 1), []);424        assert_eq!(TemplateModule::address_tokens(1, 2), [1]);425    });426}427428#[test]429fn nft_approve_and_transfer_from() {430    new_test_ext().execute_with(|| {431        default_limits();432        433        let collection_id = create_test_collection(&CollectionMode::NFT, 1);434435        let data = default_nft_data();436        create_test_item(collection_id, &data.into());437438        let origin1 = Origin::signed(1);439        let origin2 = Origin::signed(2);440441        assert_eq!(TemplateModule::balance_count(1, 1), 1);442        assert_eq!(TemplateModule::address_tokens(1, 1), [1]);443444        // neg transfer445        assert_noop!(TemplateModule::transfer_from(446            origin2.clone(),447            1,448            2,449            1,450            1,451            1), Error::<Test>::NoPermission);452453        // do approve454        assert_ok!(TemplateModule::approve(origin1.clone(), 2, 1, 1));455        assert_eq!(TemplateModule::approved(1, (1, 1)).len(), 1);456        assert_eq!(457            TemplateModule::approved(1, (1, 1))[0],458            ApprovePermissions {459                approved: 2,460                amount: 100000000461            }462        );463464        assert_ok!(TemplateModule::transfer_from(465            origin2.clone(),466            1,467            2,468            1,469            1,470            1471        ));472        assert_eq!(TemplateModule::approved(1, (1, 1)).len(), 0);473    });474}475476#[test]477fn nft_approve_and_transfer_from_white_list() {478    new_test_ext().execute_with(|| {479        default_limits();480        481        let collection_id = create_test_collection(&CollectionMode::NFT, 1);482483        let origin1 = Origin::signed(1);484        let origin2 = Origin::signed(2);485486        let data = default_nft_data();487        create_test_item(collection_id, &data.clone().into());488489        assert_eq!(TemplateModule::nft_item_id(1, 1).const_data, data.const_data);490        assert_eq!(TemplateModule::balance_count(1, 1), 1);491        assert_eq!(TemplateModule::address_tokens(1, 1), [1]);492493        assert_ok!(TemplateModule::set_mint_permission(494            origin1.clone(),495            1,496            true497        ));498        assert_ok!(TemplateModule::set_public_access_mode(499            origin1.clone(),500            1,501            AccessMode::WhiteList502        ));503        assert_ok!(TemplateModule::add_to_white_list(origin1.clone(), 1, 1));504        assert_ok!(TemplateModule::add_to_white_list(origin1.clone(), 1, 2));505        assert_ok!(TemplateModule::add_to_white_list(origin1.clone(), 1, 3));506507        // do approve508        assert_ok!(TemplateModule::approve(origin1.clone(), 2, 1, 1));509        assert_eq!(TemplateModule::approved(1, (1, 1)).len(), 1);510        assert_ok!(TemplateModule::approve(origin1.clone(), 3, 1, 1));511        assert_eq!(TemplateModule::approved(1, (1, 1)).len(), 2);512        assert_eq!(513            TemplateModule::approved(1, (1, 1))[0],514            ApprovePermissions {515                approved: 2,516                amount: 100000000517            }518        );519520        assert_ok!(TemplateModule::transfer_from(521            origin2.clone(),522            1,523            3,524            1,525            1,526            1527        ));528        assert_eq!(TemplateModule::approved(1, (1, 1)).len(), 0);529    });530}531532#[test]533fn refungible_approve_and_transfer_from() {534    new_test_ext().execute_with(|| {535        default_limits();536        537        let collection_id = create_test_collection(&CollectionMode::ReFungible(3), 1);538        539        let origin1 = Origin::signed(1);540        let origin2 = Origin::signed(2);541542        let data = default_re_fungible_data();543        create_test_item(collection_id, &data.into());544545        assert_eq!(TemplateModule::balance_count(1, 1), 1000);546        assert_eq!(TemplateModule::address_tokens(1, 1), [1]);547548        assert_ok!(TemplateModule::set_mint_permission(549            origin1.clone(),550            1,551            true552        ));553        assert_ok!(TemplateModule::set_public_access_mode(554            origin1.clone(),555            1,556            AccessMode::WhiteList557        ));558        assert_ok!(TemplateModule::add_to_white_list(origin1.clone(), 1, 1));559        assert_ok!(TemplateModule::add_to_white_list(origin1.clone(), 1, 2));560        assert_ok!(TemplateModule::add_to_white_list(origin1.clone(), 1, 3));561562        // do approve563        assert_ok!(TemplateModule::approve(origin1.clone(), 2, 1, 1));564        assert_eq!(TemplateModule::approved(1, (1, 1)).len(), 1);565        assert_ok!(TemplateModule::approve(origin1.clone(), 3, 1, 1));566        assert_eq!(TemplateModule::approved(1, (1, 1)).len(), 2);567        assert_eq!(568            TemplateModule::approved(1, (1, 1))[0],569            ApprovePermissions {570                approved: 2,571                amount: 100000000572            }573        );574575        assert_ok!(TemplateModule::transfer_from(576            origin2.clone(),577            1,578            3,579            1,580            1,581            100582        ));583        assert_eq!(TemplateModule::balance_count(1, 1), 900);584        assert_eq!(TemplateModule::balance_count(1, 3), 100);585        assert_eq!(TemplateModule::address_tokens(1, 1), [1]);586        assert_eq!(TemplateModule::address_tokens(1, 3), [1]);587588        assert_eq!(TemplateModule::approved(1, (1, 1)).len(), 1);589        assert_eq!(590            TemplateModule::approved(1, (1, 1))[0],591            ApprovePermissions {592                approved: 3,593                amount: 100000000594            }595        );596    });597}598599#[test]600fn fungible_approve_and_transfer_from() {601    new_test_ext().execute_with(|| {602        default_limits();603        604        let collection_id = create_test_collection(&CollectionMode::Fungible(3), 1);605        606        let data = default_fungible_data();607        create_test_item(collection_id, &data.into());608609        let origin1 = Origin::signed(1);610        let origin2 = Origin::signed(2);611612        assert_eq!(TemplateModule::balance_count(1, 1), 1000);613        assert_eq!(TemplateModule::address_tokens(1, 1), [1]);614615        assert_ok!(TemplateModule::set_mint_permission(616            origin1.clone(),617            1,618            true619        ));620        assert_ok!(TemplateModule::set_public_access_mode(621            origin1.clone(),622            1,623            AccessMode::WhiteList624        ));625        assert_ok!(TemplateModule::add_to_white_list(origin1.clone(), 1, 1));626        assert_ok!(TemplateModule::add_to_white_list(origin1.clone(), 1, 2));627        assert_ok!(TemplateModule::add_to_white_list(origin1.clone(), 1, 3));628629        // do approve630        assert_ok!(TemplateModule::approve(origin1.clone(), 2, 1, 1));631        assert_eq!(TemplateModule::approved(1, (1, 1)).len(), 1);632        assert_ok!(TemplateModule::approve(origin1.clone(), 3, 1, 1));633        assert_eq!(TemplateModule::approved(1, (1, 1)).len(), 2);634        assert_eq!(635            TemplateModule::approved(1, (1, 1))[0],636            ApprovePermissions {637                approved: 2,638                amount: 100000000639            }640        );641642        assert_ok!(TemplateModule::transfer_from(643            origin2.clone(),644            1,645            3,646            1,647            1,648            100649        ));650        assert_eq!(TemplateModule::balance_count(1, 1), 900);651        assert_eq!(TemplateModule::balance_count(1, 3), 100);652        assert_eq!(TemplateModule::address_tokens(1, 1), [1]);653        assert_eq!(TemplateModule::address_tokens(1, 3), [2]);654655        assert_eq!(TemplateModule::approved(1, (1, 1)).len(), 1);656        assert_eq!(657            TemplateModule::approved(1, (1, 1))[0],658            ApprovePermissions {659                approved: 3,660                amount: 100000000661            }662        );663664        assert_ok!(TemplateModule::approve(origin1.clone(), 2, 1, 1));665        assert_ok!(TemplateModule::transfer_from(666            origin2.clone(),667            1,668            3,669            1,670            1,671            900672        ));673        assert_eq!(TemplateModule::balance_count(1, 1), 0);674        assert_eq!(TemplateModule::balance_count(1, 3), 1000);675        // assert_eq!(TemplateModule::address_tokens(1, 1), []);676        assert_eq!(TemplateModule::address_tokens(1, 3), [2]);677678        assert_eq!(TemplateModule::approved(1, (1, 1)).len(), 0);679    });680}681682#[test]683fn change_collection_owner() {684    new_test_ext().execute_with(|| {685        default_limits();686        687        let collection_id = create_test_collection(&CollectionMode::NFT, 1);688        689        let origin1 = Origin::signed(1);690        assert_ok!(TemplateModule::change_collection_owner(691            origin1.clone(),692            collection_id,693            2694        ));695        assert_eq!(TemplateModule::collection(collection_id).owner, 2);696    });697}698699#[test]700fn destroy_collection() {701    new_test_ext().execute_with(|| {702        default_limits();703        704        let collection_id = create_test_collection(&CollectionMode::NFT, 1);705        706        let origin1 = Origin::signed(1);707        assert_ok!(TemplateModule::destroy_collection(origin1.clone(), collection_id));708    });709}710711#[test]712fn burn_nft_item() {713    new_test_ext().execute_with(|| {714        default_limits();715        716        let collection_id = create_test_collection(&CollectionMode::NFT, 1);717718        let origin1 = Origin::signed(1);719        assert_ok!(TemplateModule::add_collection_admin(origin1.clone(), collection_id, 2));720        721        let data = default_nft_data();722        create_test_item(collection_id, &data.into());723724        // check balance (collection with id = 1, user id = 1)725        assert_eq!(TemplateModule::balance_count(1, 1), 1);726727        // burn item728        assert_ok!(TemplateModule::burn_item(origin1.clone(), 1, 1));729        assert_noop!(730            TemplateModule::burn_item(origin1.clone(), 1, 1),731            Error::<Test>::TokenNotFound732        );733734        assert_eq!(TemplateModule::balance_count(1, 1), 0);735    });736}737738#[test]739fn burn_fungible_item() {740    new_test_ext().execute_with(|| {741        default_limits();742        743        let collection_id = create_test_collection(&CollectionMode::Fungible(3), 1);744        745        let origin1 = Origin::signed(1);746        assert_ok!(TemplateModule::add_collection_admin(origin1.clone(), collection_id, 2));747        748        let data = default_fungible_data();749        create_test_item(collection_id, &data.into());750751        // check balance (collection with id = 1, user id = 1)752        assert_eq!(TemplateModule::balance_count(1, 1), 1000);753754        // burn item755        assert_ok!(TemplateModule::burn_item(origin1.clone(), 1, 1));756        assert_noop!(757            TemplateModule::burn_item(origin1.clone(), 1, 1),758            Error::<Test>::TokenNotFound759        );760761        assert_eq!(TemplateModule::balance_count(1, 1), 0);762    });763}764765#[test]766fn burn_refungible_item() {767    new_test_ext().execute_with(|| {768        default_limits();769        770        let collection_id = create_test_collection(&CollectionMode::ReFungible(3), 1);771        let origin1 = Origin::signed(1);772773        assert_ok!(TemplateModule::set_mint_permission(774            origin1.clone(),775            collection_id,776            true777        ));778        assert_ok!(TemplateModule::set_public_access_mode(779            origin1.clone(),780            collection_id,781            AccessMode::WhiteList782        ));783        assert_ok!(TemplateModule::add_to_white_list(origin1.clone(), 1, 1));784785        assert_ok!(TemplateModule::add_collection_admin(origin1.clone(), 1, 2));786        787        let data = default_re_fungible_data();788        create_test_item(collection_id, &data.into());789790        // check balance (collection with id = 1, user id = 2)791        assert_eq!(TemplateModule::balance_count(1, 1), 1000);792793        // burn item794        assert_ok!(TemplateModule::burn_item(origin1.clone(), 1, 1));795        assert_noop!(796            TemplateModule::burn_item(origin1.clone(), 1, 1),797            Error::<Test>::TokenNotFound798        );799800        assert_eq!(TemplateModule::balance_count(1, 1), 0);801    });802}803804#[test]805fn add_collection_admin() {806    new_test_ext().execute_with(|| {807        default_limits();808        809        let collection1_id = create_test_collection_for_owner(&CollectionMode::NFT, 1, 1);810        create_test_collection_for_owner(&CollectionMode::NFT, 2, 2);811        create_test_collection_for_owner(&CollectionMode::NFT, 3, 3);812        813        let origin1 = Origin::signed(1);814815        // collection admin816        assert_ok!(TemplateModule::add_collection_admin(origin1.clone(), collection1_id, 2));817        assert_ok!(TemplateModule::add_collection_admin(origin1.clone(), collection1_id, 3));818819        assert_eq!(TemplateModule::admin_list_collection(collection1_id).contains(&2), true);820        assert_eq!(TemplateModule::admin_list_collection(collection1_id).contains(&3), true);821    });822}823824#[test]825fn remove_collection_admin() {826    new_test_ext().execute_with(|| {827        default_limits();828        829        let collection1_id = create_test_collection_for_owner(&CollectionMode::NFT, 1, 1);830        create_test_collection_for_owner(&CollectionMode::NFT, 2, 2);831        create_test_collection_for_owner(&CollectionMode::NFT, 3, 3);832833        let origin1 = Origin::signed(1);834        let origin2 = Origin::signed(2);835836        // collection admin837        assert_ok!(TemplateModule::add_collection_admin(origin1.clone(), collection1_id, 2));838        assert_ok!(TemplateModule::add_collection_admin(origin1.clone(), collection1_id, 3));839840        assert_eq!(TemplateModule::admin_list_collection(1).contains(&2), true);841        assert_eq!(TemplateModule::admin_list_collection(1).contains(&3), true);842843        // remove admin844        assert_ok!(TemplateModule::remove_collection_admin(845            origin2.clone(),846            1,847            3848        ));849        assert_eq!(TemplateModule::admin_list_collection(1).contains(&3), false);850    });851}852853#[test]854fn balance_of() {855    new_test_ext().execute_with(|| {856        default_limits();857        858        let nft_collection_id = create_test_collection(&CollectionMode::NFT, 1);859        let fungible_collection_id = create_test_collection(&CollectionMode::Fungible(3), 2);860        let re_fungible_collection_id = create_test_collection(&CollectionMode::ReFungible(3), 3);861        862        // check balance before863        assert_eq!(TemplateModule::balance_count(nft_collection_id, 1), 0);864        assert_eq!(TemplateModule::balance_count(fungible_collection_id, 1), 0);865        assert_eq!(TemplateModule::balance_count(re_fungible_collection_id, 1), 0);866867        let nft_data = default_nft_data();868        create_test_item(nft_collection_id, &nft_data.into());869        870        let fungible_data = default_fungible_data();871        create_test_item(fungible_collection_id, &fungible_data.into());872        873        let re_fungible_data = default_re_fungible_data();874        create_test_item(re_fungible_collection_id, &re_fungible_data.into());875876        // check balance (collection with id = 1, user id = 1)877        assert_eq!(TemplateModule::balance_count(nft_collection_id, 1), 1);878        assert_eq!(TemplateModule::balance_count(fungible_collection_id, 1), 1000);879        assert_eq!(TemplateModule::balance_count(re_fungible_collection_id, 1), 1000);880        assert_eq!(TemplateModule::nft_item_id(nft_collection_id, 1).owner, 1);881        assert_eq!(TemplateModule::fungible_item_id(fungible_collection_id, 1).owner, 1);882        assert_eq!(TemplateModule::refungible_item_id(re_fungible_collection_id, 1).owner[0].owner, 1);883    });884}885886#[test]887fn approve() {888    new_test_ext().execute_with(|| {889        default_limits();890        891        let collection_id = create_test_collection(&CollectionMode::NFT, 1);892        893        let data = default_nft_data();894        create_test_item(collection_id, &data.into());895896        let origin1 = Origin::signed(1);897        898        // approve899        assert_ok!(TemplateModule::approve(origin1.clone(), 2, 1, 1));900        assert_eq!(TemplateModule::approved(1, (1, 1))[0].approved, 2);901    });902}903904#[test]905fn transfer_from() {906    new_test_ext().execute_with(|| {907        default_limits();908        909        let collection_id = create_test_collection(&CollectionMode::NFT, 1);910        let origin1 = Origin::signed(1);911        let origin2 = Origin::signed(2);912913        let data = default_nft_data();914        create_test_item(collection_id, &data.into());915916        // approve917        assert_ok!(TemplateModule::approve(origin1.clone(), 2, 1, 1));918        assert_eq!(TemplateModule::approved(1, (1, 1))[0].approved, 2);919920        assert_ok!(TemplateModule::set_mint_permission(921            origin1.clone(),922            1,923            true924        ));925        assert_ok!(TemplateModule::set_public_access_mode(926            origin1.clone(),927            1,928            AccessMode::WhiteList929        ));930        assert_ok!(TemplateModule::add_to_white_list(origin1.clone(), 1, 1));931        assert_ok!(TemplateModule::add_to_white_list(origin1.clone(), 1, 2));932        assert_ok!(TemplateModule::add_to_white_list(origin1.clone(), 1, 3));933934        assert_ok!(TemplateModule::transfer_from(935            origin2.clone(),936            1,937            2,938            1,939            1,940            1941        ));942943        // after transfer944        assert_eq!(TemplateModule::balance_count(1, 1), 0);945        assert_eq!(TemplateModule::balance_count(1, 2), 1);946    });947}948949// #endregion950951// Coverage tests region952// #region953954#[test]955fn owner_can_add_address_to_white_list() {956    new_test_ext().execute_with(|| {957        default_limits();958        959        let collection_id = create_test_collection(&CollectionMode::NFT, 1);960961        let origin1 = Origin::signed(1);962        assert_ok!(TemplateModule::add_to_white_list(origin1.clone(), collection_id, 2));963        assert_eq!(TemplateModule::white_list(collection_id, 2), true);964    });965}966967#[test]968fn admin_can_add_address_to_white_list() {969    new_test_ext().execute_with(|| {970        default_limits();971        972        let collection_id = create_test_collection(&CollectionMode::NFT, 1);973        let origin1 = Origin::signed(1);974        let origin2 = Origin::signed(2);975976        assert_ok!(TemplateModule::add_collection_admin(origin1.clone(), collection_id, 2));977        assert_ok!(TemplateModule::add_to_white_list(origin2.clone(), collection_id, 3));978        assert_eq!(TemplateModule::white_list(collection_id, 3), true);979    });980}981982#[test]983fn nonprivileged_user_cannot_add_address_to_white_list() {984    new_test_ext().execute_with(|| {985        default_limits();986        987        let collection_id = create_test_collection(&CollectionMode::NFT, 1);988989        let origin2 = Origin::signed(2);990        assert_noop!(991            TemplateModule::add_to_white_list(origin2.clone(), collection_id, 3),992            Error::<Test>::NoPermission993        );994    });995}996997#[test]998fn nobody_can_add_address_to_white_list_of_nonexisting_collection() {999    new_test_ext().execute_with(|| {1000        default_limits();10011002        let origin1 = Origin::signed(1);10031004        assert_noop!(1005            TemplateModule::add_to_white_list(origin1.clone(), 1, 2),1006            Error::<Test>::CollectionNotFound1007        );1008    });1009}10101011#[test]1012fn nobody_can_add_address_to_white_list_of_deleted_collection() {1013    new_test_ext().execute_with(|| {1014        default_limits();1015        1016        let collection_id = create_test_collection(&CollectionMode::NFT, 1);10171018        let origin1 = Origin::signed(1);1019        assert_ok!(TemplateModule::destroy_collection(origin1.clone(), collection_id));1020        assert_noop!(1021            TemplateModule::add_to_white_list(origin1.clone(), collection_id, 2),1022            Error::<Test>::CollectionNotFound1023        );1024    });1025}10261027// If address is already added to white list, nothing happens1028#[test]1029fn address_is_already_added_to_white_list() {1030    new_test_ext().execute_with(|| {1031        default_limits();1032        1033        let collection_id = create_test_collection(&CollectionMode::NFT, 1);1034        let origin1 = Origin::signed(1);1035        1036        assert_ok!(TemplateModule::add_to_white_list(origin1.clone(), collection_id, 2));1037        assert_ok!(TemplateModule::add_to_white_list(origin1.clone(), collection_id, 2));1038        assert_eq!(TemplateModule::white_list(collection_id, 2), true);1039    });1040}10411042#[test]1043fn owner_can_remove_address_from_white_list() {1044    new_test_ext().execute_with(|| {1045        default_limits();1046        1047        let collection_id = create_test_collection(&CollectionMode::NFT, 1);10481049        let origin1 = Origin::signed(1);1050        assert_ok!(TemplateModule::add_to_white_list(origin1.clone(), collection_id, 2));1051        assert_ok!(TemplateModule::remove_from_white_list(1052            origin1.clone(),1053            collection_id,1054            21055        ));1056        assert_eq!(TemplateModule::white_list(collection_id, 2), false);1057    });1058}10591060#[test]1061fn admin_can_remove_address_from_white_list() {1062    new_test_ext().execute_with(|| {1063        default_limits();1064        1065        let collection_id = create_test_collection(&CollectionMode::NFT, 1);1066        let origin1 = Origin::signed(1);1067        let origin2 = Origin::signed(2);10681069        assert_ok!(TemplateModule::add_collection_admin(origin1.clone(), collection_id, 2));10701071        assert_ok!(TemplateModule::add_to_white_list(origin1.clone(), collection_id, 3));1072        assert_ok!(TemplateModule::remove_from_white_list(1073            origin2.clone(),1074            collection_id,1075            31076        ));1077        assert_eq!(TemplateModule::white_list(collection_id, 3), false);1078    });1079}10801081#[test]1082fn nonprivileged_user_cannot_remove_address_from_white_list() {1083    new_test_ext().execute_with(|| {1084        default_limits();1085        1086        let collection_id = create_test_collection(&CollectionMode::NFT, 1);1087        let origin1 = Origin::signed(1);1088        let origin2 = Origin::signed(2);10891090        assert_ok!(TemplateModule::add_to_white_list(origin1.clone(), collection_id, 2));1091        assert_noop!(1092            TemplateModule::remove_from_white_list(origin2.clone(), collection_id, 2),1093            Error::<Test>::NoPermission1094        );1095        assert_eq!(TemplateModule::white_list(collection_id, 2), true);1096    });1097}10981099#[test]1100fn nobody_can_remove_address_from_white_list_of_nonexisting_collection() {1101    new_test_ext().execute_with(|| {1102        default_limits();1103        let origin1 = Origin::signed(1);11041105        assert_noop!(1106            TemplateModule::remove_from_white_list(origin1.clone(), 1, 2),1107            Error::<Test>::CollectionNotFound1108        );1109    });1110}11111112#[test]1113fn nobody_can_remove_address_from_white_list_of_deleted_collection() {1114    new_test_ext().execute_with(|| {1115        default_limits();1116        1117        let collection_id = create_test_collection(&CollectionMode::NFT, 1);1118        let origin1 = Origin::signed(1);1119        let origin2 = Origin::signed(2);11201121        assert_ok!(TemplateModule::add_to_white_list(origin1.clone(), collection_id, 2));1122        assert_ok!(TemplateModule::destroy_collection(origin1.clone(), collection_id));1123        assert_noop!(1124            TemplateModule::remove_from_white_list(origin2.clone(), collection_id, 2),1125            Error::<Test>::CollectionNotFound1126        );1127        assert_eq!(TemplateModule::white_list(collection_id, 2), false);1128    });1129}11301131// If address is already removed from white list, nothing happens1132#[test]1133fn address_is_already_removed_from_white_list() {1134    new_test_ext().execute_with(|| {1135        default_limits();1136        1137        let collection_id = create_test_collection(&CollectionMode::NFT, 1);1138        let origin1 = Origin::signed(1);11391140        assert_ok!(TemplateModule::add_to_white_list(origin1.clone(), collection_id, 2));1141        assert_ok!(TemplateModule::remove_from_white_list(1142            origin1.clone(),1143            collection_id,1144            21145        ));1146        assert_ok!(TemplateModule::remove_from_white_list(1147            origin1.clone(),1148            collection_id,1149            21150        ));1151        assert_eq!(TemplateModule::white_list(collection_id, 2), false);1152    });1153}11541155// If Public Access mode is set to WhiteList, tokens can’t be transferred from a non-whitelisted address with transfer or transferFrom (2 tests)1156#[test]1157fn white_list_test_1() {1158    new_test_ext().execute_with(|| {1159        default_limits();1160        1161        let collection_id = create_test_collection(&CollectionMode::NFT, 1);11621163        let origin1 = Origin::signed(1);1164        1165        let data = default_nft_data();1166        create_test_item(collection_id, &data.into());11671168        assert_ok!(TemplateModule::set_public_access_mode(1169            origin1.clone(),1170            collection_id,1171            AccessMode::WhiteList1172        ));1173        assert_ok!(TemplateModule::add_to_white_list(origin1.clone(), collection_id, 2));11741175        assert_noop!(1176            TemplateModule::transfer(origin1.clone(), 3, 1, 1, 1),1177            Error::<Test>::AddresNotInWhiteList1178        );1179    });1180}11811182#[test]1183fn white_list_test_2() {1184    new_test_ext().execute_with(|| {1185        default_limits();1186        1187        let collection_id = create_test_collection(&CollectionMode::NFT, 1);1188        let origin1 = Origin::signed(1);1189        1190        let data = default_nft_data();1191        create_test_item(collection_id, &data.into());11921193        assert_ok!(TemplateModule::set_public_access_mode(1194            origin1.clone(),1195            collection_id,1196            AccessMode::WhiteList1197        ));1198        assert_ok!(TemplateModule::add_to_white_list(origin1.clone(), 1, 1));1199        assert_ok!(TemplateModule::add_to_white_list(origin1.clone(), 1, 2));12001201        // do approve1202        assert_ok!(TemplateModule::approve(origin1.clone(), 1, 1, 1));1203        assert_eq!(TemplateModule::approved(1, (1, 1)).len(), 1);12041205        assert_ok!(TemplateModule::remove_from_white_list(1206            origin1.clone(),1207            1,1208            11209        ));12101211        assert_noop!(1212            TemplateModule::transfer_from(origin1.clone(), 1, 3, 1, 1, 1),1213            Error::<Test>::AddresNotInWhiteList1214        );1215    });1216}12171218// If Public Access mode is set to WhiteList, tokens can’t be transferred to a non-whitelisted address with transfer or transferFrom (2 tests)1219#[test]1220fn white_list_test_3() {1221    new_test_ext().execute_with(|| {1222        default_limits();1223        1224        let collection_id = create_test_collection(&CollectionMode::NFT, 1);12251226        let origin1 = Origin::signed(1);1227        1228        let data = default_nft_data();1229        create_test_item(collection_id, &data.into());12301231        assert_ok!(TemplateModule::set_public_access_mode(1232            origin1.clone(),1233            collection_id,1234            AccessMode::WhiteList1235        ));1236        assert_ok!(TemplateModule::add_to_white_list(origin1.clone(), 1, 1));12371238        assert_noop!(1239            TemplateModule::transfer(origin1.clone(), 3, 1, 1, 1),1240            Error::<Test>::AddresNotInWhiteList1241        );1242    });1243}12441245#[test]1246fn white_list_test_4() {1247    new_test_ext().execute_with(|| {1248        default_limits();1249        1250        let collection_id = create_test_collection(&CollectionMode::NFT, 1);12511252        let origin1 = Origin::signed(1);12531254        let data = default_nft_data();1255        create_test_item(collection_id, &data.into());12561257        assert_ok!(TemplateModule::set_public_access_mode(1258            origin1.clone(),1259            collection_id,1260            AccessMode::WhiteList1261        ));1262        assert_ok!(TemplateModule::add_to_white_list(origin1.clone(), collection_id, 1));1263        assert_ok!(TemplateModule::add_to_white_list(origin1.clone(), collection_id, 2));12641265        // do approve1266        assert_ok!(TemplateModule::approve(origin1.clone(), 1, 1, 1));1267        assert_eq!(TemplateModule::approved(1, (1, 1)).len(), 1);12681269        assert_ok!(TemplateModule::remove_from_white_list(1270            origin1.clone(),1271            collection_id,1272            21273        ));12741275        assert_noop!(1276            TemplateModule::transfer_from(origin1.clone(), 1, 3, 1, 1, 1),1277            Error::<Test>::AddresNotInWhiteList1278        );1279    });1280}12811282// If Public Access mode is set to WhiteList, tokens can’t be destroyed by a non-whitelisted address (even if it owned them before enabling WhiteList mode)1283#[test]1284fn white_list_test_5() {1285    new_test_ext().execute_with(|| {1286        default_limits();1287        1288        let collection_id = create_test_collection(&CollectionMode::NFT, 1);12891290        let origin1 = Origin::signed(1);12911292        let data = default_nft_data();1293        create_test_item(collection_id, &data.into());12941295        assert_ok!(TemplateModule::set_public_access_mode(1296            origin1.clone(),1297            collection_id,1298            AccessMode::WhiteList1299        ));1300        assert_noop!(1301            TemplateModule::burn_item(origin1.clone(), 1, 1),1302            Error::<Test>::AddresNotInWhiteList1303        );1304    });1305}13061307// If Public Access mode is set to WhiteList, oken transfers can’t be Approved by a non-whitelisted address (see Approve method).1308#[test]1309fn white_list_test_6() {1310    new_test_ext().execute_with(|| {1311        default_limits();1312        1313        let collection_id = create_test_collection(&CollectionMode::NFT, 1);13141315        let origin1 = Origin::signed(1);1316        assert_ok!(TemplateModule::set_public_access_mode(1317            origin1.clone(),1318            collection_id,1319            AccessMode::WhiteList1320        ));13211322        // do approve1323        assert_noop!(1324            TemplateModule::approve(origin1.clone(), 1, 1, 1),1325            Error::<Test>::AddresNotInWhiteList1326        );1327    });1328}13291330// If Public Access mode is set to WhiteList, tokens can be transferred from a whitelisted address with transfer or transferFrom (2 tests) and1331//          tokens can be transferred from a whitelisted address with transfer or transferFrom (2 tests)1332#[test]1333fn white_list_test_7() {1334    new_test_ext().execute_with(|| {1335        default_limits();1336        1337        let collection_id = create_test_collection(&CollectionMode::NFT, 1);13381339        let data = default_nft_data();1340        create_test_item(collection_id, &data.into());1341        1342        let origin1 = Origin::signed(1);13431344        assert_ok!(TemplateModule::set_public_access_mode(1345            origin1.clone(),1346            collection_id,1347            AccessMode::WhiteList1348        ));1349        assert_ok!(TemplateModule::add_to_white_list(origin1.clone(), collection_id, 1));1350        assert_ok!(TemplateModule::add_to_white_list(origin1.clone(), collection_id, 2));13511352        assert_ok!(TemplateModule::transfer(origin1.clone(), 2, 1, 1, 1));1353    });1354}13551356#[test]1357fn white_list_test_8() {1358    new_test_ext().execute_with(|| {1359        default_limits();1360        1361        let collection_id = create_test_collection(&CollectionMode::NFT, 1);13621363        let data = default_nft_data();1364        create_test_item(collection_id, &data.into());1365        1366        let origin1 = Origin::signed(1);13671368        assert_ok!(TemplateModule::set_public_access_mode(1369            origin1.clone(),1370            collection_id,1371            AccessMode::WhiteList1372        ));1373        assert_ok!(TemplateModule::add_to_white_list(origin1.clone(), collection_id, 1));1374        assert_ok!(TemplateModule::add_to_white_list(origin1.clone(), collection_id, 2));13751376        // do approve1377        assert_ok!(TemplateModule::approve(origin1.clone(), 1, 1, 1));1378        assert_eq!(TemplateModule::approved(1, (1, 1)).len(), 1);13791380        assert_ok!(TemplateModule::transfer_from(1381            origin1.clone(),1382            1,1383            2,1384            1,1385            1,1386            11387        ));1388    });1389}13901391// If Public Access mode is set to WhiteList, and Mint Permission is set to false, tokens can be created by owner.1392#[test]1393fn white_list_test_9() {1394    new_test_ext().execute_with(|| {1395        default_limits();1396        1397        let collection_id = create_test_collection(&CollectionMode::NFT, 1);1398        let origin1 = Origin::signed(1);13991400        assert_ok!(TemplateModule::set_public_access_mode(1401            origin1.clone(),1402            collection_id,1403            AccessMode::WhiteList1404        ));1405        assert_ok!(TemplateModule::set_mint_permission(1406            origin1.clone(),1407            collection_id,1408            false1409        ));14101411        let data = default_nft_data();1412        create_test_item(collection_id, &data.into());1413    });1414}14151416// If Public Access mode is set to WhiteList, and Mint Permission is set to false, tokens can be created by admin.1417#[test]1418fn white_list_test_10() {1419    new_test_ext().execute_with(|| {1420        default_limits();1421        1422        let collection_id = create_test_collection(&CollectionMode::NFT, 1);14231424        let origin1 = Origin::signed(1);1425        let origin2 = Origin::signed(2);14261427        assert_ok!(TemplateModule::set_public_access_mode(1428            origin1.clone(),1429            collection_id,1430            AccessMode::WhiteList1431        ));1432        assert_ok!(TemplateModule::set_mint_permission(1433            origin1.clone(),1434            collection_id,1435            false1436        ));14371438        assert_ok!(TemplateModule::add_collection_admin(origin1.clone(), collection_id, 2));14391440        assert_ok!(TemplateModule::create_item(1441            origin2.clone(),1442            collection_id,1443            2,1444            default_nft_data().into()1445        ));1446    });1447}14481449// If Public Access mode is set to WhiteList, and Mint Permission is set to false, tokens cannot be created by non-privileged and white listed address.1450#[test]1451fn white_list_test_11() {1452    new_test_ext().execute_with(|| {1453        default_limits();1454        1455        let collection_id = create_test_collection(&CollectionMode::NFT, 1);14561457        let origin1 = Origin::signed(1);1458        let origin2 = Origin::signed(2);14591460        assert_ok!(TemplateModule::set_public_access_mode(1461            origin1.clone(),1462            collection_id,1463            AccessMode::WhiteList1464        ));1465        assert_ok!(TemplateModule::set_mint_permission(1466            origin1.clone(),1467            collection_id,1468            false1469        ));1470        assert_ok!(TemplateModule::add_to_white_list(origin1.clone(), collection_id, 2));14711472        assert_noop!(1473            TemplateModule::create_item(origin2.clone(), 1, 2, default_nft_data().into()),1474            Error::<Test>::PublicMintingNotAllowed1475        );1476    });1477}14781479// If Public Access mode is set to WhiteList, and Mint Permission is set to false, tokens cannot be created by non-privileged and non-white listed address.1480#[test]1481fn white_list_test_12() {1482    new_test_ext().execute_with(|| {1483        default_limits();1484        1485        let collection_id = create_test_collection(&CollectionMode::NFT, 1);14861487        let origin1 = Origin::signed(1);1488        let origin2 = Origin::signed(2);14891490        assert_ok!(TemplateModule::set_public_access_mode(1491            origin1.clone(),1492            collection_id,1493            AccessMode::WhiteList1494        ));1495        assert_ok!(TemplateModule::set_mint_permission(1496            origin1.clone(),1497            collection_id,1498            false1499        ));15001501        assert_noop!(1502            TemplateModule::create_item(origin2.clone(), 1, 2, default_nft_data().into()),1503            Error::<Test>::PublicMintingNotAllowed1504        );1505    });1506}15071508// If Public Access mode is set to WhiteList, and Mint Permission is set to true, tokens can be created by owner.1509#[test]1510fn white_list_test_13() {1511    new_test_ext().execute_with(|| {1512        default_limits();1513        1514        let collection_id = create_test_collection(&CollectionMode::NFT, 1);15151516        let origin1 = Origin::signed(1);15171518        assert_ok!(TemplateModule::set_public_access_mode(1519            origin1.clone(),1520            collection_id,1521            AccessMode::WhiteList1522        ));1523        assert_ok!(TemplateModule::set_mint_permission(1524            origin1.clone(),1525            collection_id,1526            true1527        ));15281529        let data = default_nft_data();1530        create_test_item(collection_id, &data.into());1531    });1532}15331534// If Public Access mode is set to WhiteList, and Mint Permission is set to true, tokens can be created by admin.1535#[test]1536fn white_list_test_14() {1537    new_test_ext().execute_with(|| {1538        default_limits();1539        1540        let collection_id = create_test_collection(&CollectionMode::NFT, 1);15411542        let origin1 = Origin::signed(1);1543        let origin2 = Origin::signed(2);15441545        assert_ok!(TemplateModule::set_public_access_mode(1546            origin1.clone(),1547            collection_id,1548            AccessMode::WhiteList1549        ));1550        assert_ok!(TemplateModule::set_mint_permission(1551            origin1.clone(),1552            collection_id,1553            true1554        ));15551556        assert_ok!(TemplateModule::add_collection_admin(origin1.clone(), collection_id, 2));15571558        assert_ok!(TemplateModule::create_item(1559            origin2.clone(),1560            1,1561            2,1562            default_nft_data().into()1563        ));1564    });1565}15661567// If Public Access mode is set to WhiteList, and Mint Permission is set to true, tokens cannot be created by non-privileged and non-white listed address.1568#[test]1569fn white_list_test_15() {1570    new_test_ext().execute_with(|| {1571        default_limits();1572        1573        let collection_id = create_test_collection(&CollectionMode::NFT, 1);15741575        let origin1 = Origin::signed(1);1576        let origin2 = Origin::signed(2);15771578        assert_ok!(TemplateModule::set_public_access_mode(1579            origin1.clone(),1580            collection_id,1581            AccessMode::WhiteList1582        ));1583        assert_ok!(TemplateModule::set_mint_permission(1584            origin1.clone(),1585            collection_id,1586            true1587        ));15881589        assert_noop!(1590            TemplateModule::create_item(origin2.clone(), 1, 2, default_nft_data().into()),1591            Error::<Test>::AddresNotInWhiteList1592        );1593    });1594}15951596// If Public Access mode is set to WhiteList, and Mint Permission is set to true, tokens can be created by non-privileged and white listed address.1597#[test]1598fn white_list_test_16() {1599    new_test_ext().execute_with(|| {1600        default_limits();1601        1602        let collection_id = create_test_collection(&CollectionMode::NFT, 1);16031604        let origin1 = Origin::signed(1);1605        let origin2 = Origin::signed(2);16061607        assert_ok!(TemplateModule::set_public_access_mode(1608            origin1.clone(),1609            collection_id,1610            AccessMode::WhiteList1611        ));1612        assert_ok!(TemplateModule::set_mint_permission(1613            origin1.clone(),1614            collection_id,1615            true1616        ));1617        assert_ok!(TemplateModule::add_to_white_list(origin1.clone(), collection_id, 2));16181619        assert_ok!(TemplateModule::create_item(1620            origin2.clone(),1621            1,1622            2,1623            default_nft_data().into()1624        ));1625    });1626}16271628// Total number of collections. Positive test1629#[test]1630fn total_number_collections_bound() {1631    new_test_ext().execute_with(|| {1632        default_limits();1633        1634        create_test_collection(&CollectionMode::NFT, 1);1635    });1636}16371638// Total number of collections. Negotive test1639#[test]1640fn total_number_collections_bound_neg() {1641    new_test_ext().execute_with(|| {1642        default_limits();16431644        let origin1 = Origin::signed(1);16451646        for i in 0..default_collection_numbers_limit() {1647            create_test_collection(&CollectionMode::NFT, i + 1);1648        }16491650        let col_name1: Vec<u16> = "Test1\0".encode_utf16().collect::<Vec<u16>>();1651        let col_desc1: Vec<u16> = "TestDescription1\0".encode_utf16().collect::<Vec<u16>>();1652        let token_prefix1: Vec<u8> = b"token_prefix1\0".to_vec();16531654        // 11-th collection in chain. Expects error1655        assert_noop!(TemplateModule::create_collection(1656            origin1.clone(),1657            col_name1.clone(),1658            col_desc1.clone(),1659            token_prefix1.clone(),1660            CollectionMode::NFT1661        ), Error::<Test>::TotalCollectionsLimitExceeded);1662    });1663}16641665// Owned tokens by a single address. Positive test1666#[test]1667fn owned_tokens_bound() {1668    new_test_ext().execute_with(|| {1669        default_limits();1670        1671        let collection_id = create_test_collection(&CollectionMode::NFT, 1);16721673        let data = default_nft_data();1674        create_test_item(collection_id, &data.clone().into());1675        create_test_item(collection_id, &data.into());1676    });1677}16781679// Owned tokens by a single address. Negotive test1680#[test]1681fn owned_tokens_bound_neg() {1682    new_test_ext().execute_with(|| {1683        assert_ok!(TemplateModule::set_chain_limits(RawOrigin::Root.into(), ChainLimits { 1684            collection_numbers_limit: 10,1685            account_token_ownership_limit: 1,1686            collections_admins_limit: 5,1687            custom_data_limit: 2048,1688            nft_sponsor_transfer_timeout: 15,1689            fungible_sponsor_transfer_timeout: 15,1690            refungible_sponsor_transfer_timeout: 15,          1691        }));1692        1693        let collection_id = create_test_collection(&CollectionMode::NFT, 1);16941695        let origin1 = Origin::signed(1);1696        let data = default_nft_data();1697        create_test_item(collection_id, &data.clone().into());16981699        assert_noop!(TemplateModule::create_item(1700            origin1.clone(),1701            1,1702            1,1703            data.into()1704        ),  Error::<Test>::AddressOwnershipLimitExceeded);1705    });1706}17071708// Number of collection admins. Positive test1709#[test]1710fn collection_admins_bound() {1711    new_test_ext().execute_with(|| {1712        assert_ok!(TemplateModule::set_chain_limits(RawOrigin::Root.into(), ChainLimits { 1713            collection_numbers_limit: 10,1714            account_token_ownership_limit: 10,1715            collections_admins_limit: 2,1716            custom_data_limit: 2048,1717            nft_sponsor_transfer_timeout: 15,1718            fungible_sponsor_transfer_timeout: 15,1719            refungible_sponsor_transfer_timeout: 15,          1720        }));1721        1722        let collection_id = create_test_collection(&CollectionMode::NFT, 1);17231724        let origin1 = Origin::signed(1);1725        1726        assert_ok!(TemplateModule::add_collection_admin(origin1.clone(), collection_id, 2));1727        assert_ok!(TemplateModule::add_collection_admin(origin1.clone(), collection_id, 3));1728    });1729}17301731// Number of collection admins. Negotive test1732#[test]1733fn collection_admins_bound_neg() {1734    new_test_ext().execute_with(|| {1735        assert_ok!(TemplateModule::set_chain_limits(RawOrigin::Root.into(), ChainLimits { 1736            collection_numbers_limit: 10,1737            account_token_ownership_limit: 1,1738            collections_admins_limit: 1,1739            custom_data_limit: 2048,1740            nft_sponsor_transfer_timeout: 15,1741            fungible_sponsor_transfer_timeout: 15,1742            refungible_sponsor_transfer_timeout: 15,          1743        }));1744        1745        let collection_id = create_test_collection(&CollectionMode::NFT, 1);17461747        let origin1 = Origin::signed(1);17481749        assert_ok!(TemplateModule::add_collection_admin(origin1.clone(), collection_id, 2));1750        assert_noop!(TemplateModule::add_collection_admin(origin1.clone(), collection_id, 3), Error::<Test>::CollectionAdminsLimitExceeded);1751    });1752}17531754// NFT custom data size. Negative test const_data.1755#[test]1756fn custom_data_size_nft_const_data_bound_neg() {1757    new_test_ext().execute_with(|| {1758        assert_ok!(TemplateModule::set_chain_limits(RawOrigin::Root.into(), ChainLimits { 1759            collection_numbers_limit: 10,1760            account_token_ownership_limit: 10,1761            collections_admins_limit: 5,1762            custom_data_limit: 2,1763            nft_sponsor_transfer_timeout: 15,1764            fungible_sponsor_transfer_timeout: 15,1765            refungible_sponsor_transfer_timeout: 15,          1766        }));1767        1768        let collection_id = create_test_collection(&CollectionMode::NFT, 1);17691770        let origin1 = Origin::signed(1);1771        let too_big_const_data = CreateItemData::NFT(CreateNftData{1772            const_data: vec![1, 2, 3, 4],1773            variable_data: vec![]1774        });17751776        assert_noop!(TemplateModule::create_item(1777            origin1.clone(),1778            collection_id,1779            1,1780            too_big_const_data1781        ), Error::<Test>::TokenConstDataLimitExceeded);1782    });1783}17841785// NFT custom data size. Negative test variable_data.1786#[test]1787fn custom_data_size_nft_variable_data_bound_neg() {1788    new_test_ext().execute_with(|| {1789        assert_ok!(TemplateModule::set_chain_limits(RawOrigin::Root.into(), ChainLimits { 1790            collection_numbers_limit: 10,1791            account_token_ownership_limit: 10,1792            collections_admins_limit: 5,1793            custom_data_limit: 2,1794            nft_sponsor_transfer_timeout: 15,1795            fungible_sponsor_transfer_timeout: 15,1796            refungible_sponsor_transfer_timeout: 15,          1797        }));17981799        let collection_id = create_test_collection(&CollectionMode::NFT, 1);18001801        let origin1 = Origin::signed(1);1802        let too_big_const_data = CreateItemData::NFT(CreateNftData{1803            const_data: vec![],1804            variable_data: vec![1, 2, 3, 4]1805        });18061807        assert_noop!(TemplateModule::create_item(1808            origin1.clone(),1809            collection_id,1810            1,1811            too_big_const_data1812        ), Error::<Test>::TokenVariableDataLimitExceeded);1813    });1814}18151816// Re fungible custom data size. Negative test const_data.1817#[test]1818fn custom_data_size_re_fungible_const_data_bound_neg() {1819    new_test_ext().execute_with(|| {1820        assert_ok!(TemplateModule::set_chain_limits(RawOrigin::Root.into(), ChainLimits { 1821            collection_numbers_limit: 10,1822            account_token_ownership_limit: 10,1823            collections_admins_limit: 5,1824            custom_data_limit: 2,1825            nft_sponsor_transfer_timeout: 15,1826            fungible_sponsor_transfer_timeout: 15,1827            refungible_sponsor_transfer_timeout: 15,          1828        }));18291830        let collection_id = create_test_collection(&CollectionMode::NFT, 1);18311832        let origin1 = Origin::signed(1);1833        let too_big_const_data = CreateItemData::NFT(CreateNftData{1834            const_data: vec![1, 2, 3, 4],1835            variable_data: vec![]1836        });18371838        assert_noop!(TemplateModule::create_item(1839            origin1.clone(),1840            collection_id,1841            1,1842            too_big_const_data1843        ), Error::<Test>::TokenConstDataLimitExceeded);1844    });1845}18461847// Re fungible custom data size. Negative test variable_data.1848#[test]1849fn custom_data_size_re_fungible_variable_data_bound_neg() {1850    new_test_ext().execute_with(|| {1851        assert_ok!(TemplateModule::set_chain_limits(RawOrigin::Root.into(), ChainLimits { 1852            collection_numbers_limit: 10,1853            account_token_ownership_limit: 10,1854            collections_admins_limit: 5,1855            custom_data_limit: 2,1856            nft_sponsor_transfer_timeout: 15,1857            fungible_sponsor_transfer_timeout: 15,1858            refungible_sponsor_transfer_timeout: 15,          1859        }));18601861        let collection_id = create_test_collection(&CollectionMode::NFT, 1);18621863        let origin1 = Origin::signed(1);1864        let too_big_const_data = CreateItemData::NFT(CreateNftData{1865            const_data: vec![],1866            variable_data: vec![1, 2, 3, 4]1867        });18681869        assert_noop!(TemplateModule::create_item(1870            origin1.clone(),1871            collection_id,1872            1,1873            too_big_const_data1874        ), Error::<Test>::TokenVariableDataLimitExceeded);1875    });1876}1877// #endregion18781879#[test]1880fn set_const_on_chain_schema() {1881    new_test_ext().execute_with(|| {1882        default_limits();18831884        let collection_id = create_test_collection(&CollectionMode::NFT, 1);18851886        let origin1 = Origin::signed(1);1887        assert_ok!(TemplateModule::set_const_on_chain_schema(origin1, collection_id, b"test const on chain schema".to_vec()));18881889        assert_eq!(TemplateModule::collection(collection_id).const_on_chain_schema, b"test const on chain schema".to_vec());1890        assert_eq!(TemplateModule::collection(collection_id).variable_on_chain_schema, b"".to_vec());1891    });1892}18931894#[test]1895fn set_variable_on_chain_schema() {1896    new_test_ext().execute_with(|| {1897        default_limits();1898        1899        let collection_id = create_test_collection(&CollectionMode::NFT, 1);19001901        let origin1 = Origin::signed(1);1902        assert_ok!(TemplateModule::set_variable_on_chain_schema(origin1, collection_id, b"test variable on chain schema".to_vec()));19031904        assert_eq!(TemplateModule::collection(collection_id).const_on_chain_schema, b"".to_vec());1905        assert_eq!(TemplateModule::collection(collection_id).variable_on_chain_schema, b"test variable on chain schema".to_vec());1906    });1907}19081909#[test]1910fn set_variable_meta_data_on_nft_token_stores_variable_meta_data() {1911    new_test_ext().execute_with(|| {1912        default_limits();19131914        let collection_id = create_test_collection(&CollectionMode::NFT, 1);19151916        let origin1 = Origin::signed(1);1917        1918        let data = default_nft_data();1919        create_test_item(1, &data.into());1920        1921        let variable_data = b"test set_variable_meta_data method.".to_vec();1922        assert_ok!(TemplateModule::set_variable_meta_data(origin1, collection_id, 1, variable_data.clone()));19231924        assert_eq!(TemplateModule::nft_item_id(collection_id, 1).variable_data, variable_data);1925    });1926}19271928#[test]1929fn set_variable_meta_data_on_re_fungible_token_stores_variable_meta_data() {1930    new_test_ext().execute_with(|| {1931        default_limits();19321933        let collection_id = create_test_collection(&CollectionMode::ReFungible(3), 1);19341935        let origin1 = Origin::signed(1);19361937        let data = default_re_fungible_data();1938        create_test_item(1, &data.into());19391940        let variable_data = b"test set_variable_meta_data method.".to_vec();1941        assert_ok!(TemplateModule::set_variable_meta_data(origin1, collection_id, 1, variable_data.clone()));19421943        assert_eq!(TemplateModule::refungible_item_id(collection_id, 1).variable_data, variable_data);1944    });1945}194619471948#[test]1949fn set_variable_meta_data_on_fungible_token_fails() {1950    new_test_ext().execute_with(|| {1951        default_limits();19521953        let collection_id = create_test_collection(&CollectionMode::Fungible(3), 1);19541955        let origin1 = Origin::signed(1);19561957        let data = default_fungible_data();1958        create_test_item(1, &data.into());19591960        let variable_data = b"test set_variable_meta_data method.".to_vec();1961        assert_noop!(TemplateModule::set_variable_meta_data(origin1, collection_id, 1, variable_data.clone()), Error::<Test>::CantStoreMetadataInFungibleTokens);1962    });1963}19641965#[test]1966fn set_variable_meta_data_on_nft_token_fails_for_big_data() {1967    new_test_ext().execute_with(|| {1968        assert_ok!(TemplateModule::set_chain_limits(RawOrigin::Root.into(), ChainLimits { 1969            collection_numbers_limit: default_collection_numbers_limit(),1970            account_token_ownership_limit: 10,1971            collections_admins_limit: 5,1972            custom_data_limit: 10,1973            nft_sponsor_transfer_timeout: 15,1974            fungible_sponsor_transfer_timeout: 15,1975            refungible_sponsor_transfer_timeout: 15,          1976        }));19771978        let collection_id = create_test_collection(&CollectionMode::NFT, 1);19791980        let origin1 = Origin::signed(1);19811982        let data = default_nft_data();1983        create_test_item(1, &data.into());19841985        let variable_data = b"test set_variable_meta_data method, bigger than limits.".to_vec();1986        assert_noop!(TemplateModule::set_variable_meta_data(origin1, collection_id, 1, variable_data), Error::<Test>::TokenVariableDataLimitExceeded);1987    });1988}19891990#[test]1991fn set_variable_meta_data_on_re_fungible_token_fails_for_big_data() {1992    new_test_ext().execute_with(|| {1993        assert_ok!(TemplateModule::set_chain_limits(RawOrigin::Root.into(), ChainLimits { 1994            collection_numbers_limit: default_collection_numbers_limit(),1995            account_token_ownership_limit: 10,1996            collections_admins_limit: 5,1997            custom_data_limit: 10,1998            nft_sponsor_transfer_timeout: 15,1999            fungible_sponsor_transfer_timeout: 15,2000            refungible_sponsor_transfer_timeout: 15,          2001        }));200220032004        let collection_id = create_test_collection(&CollectionMode::ReFungible(3), 1);20052006        let origin1 = Origin::signed(1);20072008        let data = default_re_fungible_data();2009        create_test_item(1, &data.into());20102011        let variable_data = b"test set_variable_meta_data method, bigger than limits.".to_vec();2012        assert_noop!(TemplateModule::set_variable_meta_data(origin1, collection_id, 1, variable_data), Error::<Test>::TokenVariableDataLimitExceeded);2013    });2014}
modifiedtests/src/contracts.test.tsdiffbeforeafterboth
--- a/tests/src/contracts.test.ts
+++ b/tests/src/contracts.test.ts
@@ -1,16 +1,15 @@
-//
-// This file is subject to the terms and conditions defined in
-// file 'LICENSE', which is part of this source code package.
-//
-
-import { ApiPromise } from "@polkadot/api";
-import { expect } from "chai";
-import { default as usingApi, submitTransactionAsync } from "./substrate/substrate-api";
+import chai from "chai";
+import chaiAsPromised from 'chai-as-promised';
+import usingApi, { submitTransactionAsync, submitTransactionExpectFailAsync } from "./substrate/substrate-api";
 import fs from "fs";
-import { Abi, BlueprintPromise, CodePromise } from "@polkadot/api-contract";
+import { Abi, BlueprintPromise as Blueprint, CodePromise, ContractPromise as Contract } from "@polkadot/api-contract";
 import { IKeyringPair } from "@polkadot/types/types";
-import { Keyring } from "@polkadot/api";
+import { ApiPromise, Keyring } from "@polkadot/api";
 import { ApiTypes, SubmittableExtrinsic } from "@polkadot/api/types";
+import privateKey from "./substrate/privateKey";
+
+chai.use(chaiAsPromised);
+const expect = chai.expect;
 import { BigNumber } from 'bignumber.js';
 import { findUnusedAddress } from './util/helpers'
 
@@ -18,8 +17,8 @@
 const gasLimit = 3000n * 1000000n;
 const endowment = `1000000000000000`;
 
-function deployBlueprint(alice: IKeyringPair, code: CodePromise): Promise<BlueprintPromise> {
-  return new Promise<BlueprintPromise>(async (resolve, reject) => {
+function deployBlueprint(alice: IKeyringPair, code: CodePromise): Promise<Blueprint> {
+  return new Promise<Blueprint>(async (resolve, reject) => {
     const unsub = await code
       .createBlueprint()
       .signAndSend(alice, (result) => {
@@ -32,7 +31,7 @@
   });
 }
 
-function deployContract(alice: IKeyringPair, blueprint: BlueprintPromise) : Promise<any> {
+function deployContract(alice: IKeyringPair, blueprint: Blueprint) : Promise<any> {
   return new Promise<any>(async (resolve, reject) => {
     const initValue = true;
 
@@ -62,39 +61,112 @@
   return deployer;
 }
 
-describe('Contracts smoke test', () => {
+async function deployFlipper(api: ApiPromise): Promise<[Contract, IKeyringPair]> {
+  const metadata = JSON.parse(fs.readFileSync('./src/flipper/metadata.json').toString('utf-8'));
+  const abi = new Abi(metadata);
+
+  const deployer = await prepareDeployer(api);
+
+  const wasm = fs.readFileSync('./src/flipper/flipper.wasm');
+
+  const code = new CodePromise(api, abi, wasm);
+
+  const blueprint = await deployBlueprint(deployer, code);
+  const contract = (await deployContract(deployer, blueprint))['contract'] as Contract;
+
+  const initialGetResponse = await getFlipValue(contract, deployer);
+  expect(initialGetResponse).to.be.true;
+
+  return [contract, deployer];
+}
+
+async function getFlipValue(contract: Contract, deployer: IKeyringPair) {
+  const result = await contract.query.get(deployer.address, value, gasLimit);
+
+  if(!result.result.isSuccess) {
+    throw `Failed to get flipper value`;
+  }
+  return (result.result.asSuccess.data[0] == 0x00) ? false : true;
+}
+
+describe('Contracts', () => {
   it(`Can deploy smart contract Flipper, instantiate it and call it's get and flip messages.`, async () => {
     await usingApi(async api => {
-      const deployer = await prepareDeployer(api);
+      const [contract, deployer] = await deployFlipper(api);
+      const initialGetResponse = await getFlipValue(contract, deployer);
+
+      const bob = privateKey("//Bob");
+      const flip = contract.exec('flip', value, gasLimit);
+      await submitTransactionAsync(bob, flip);
+
+      const afterFlipGetResponse = await getFlipValue(contract, deployer);
+      expect(afterFlipGetResponse).not.to.be.eq(initialGetResponse, 'Flipping should change value.');
+    });
+  });
+
+  it(`Whitelisted account can call contract.`, async () => {
+    await usingApi(async api => {
+      const bob = privateKey("//Bob");
       
-      const wasm = fs.readFileSync('./src/flipper/flipper.wasm');
-      
-      const metadata = JSON.parse(fs.readFileSync('./src/flipper/metadata.json').toString('utf-8'));
-      const abi = new Abi(metadata);
+      const [contract, deployer] = await deployFlipper(api);
+      const consoleError = console.error;
+      console.error = (...data: any[]) => {
+      };
 
-      const code = new CodePromise(api, abi, wasm);
+      let expectedFlipValue = await getFlipValue(contract, deployer);
 
-      const blueprint = await deployBlueprint(deployer, code);
-      const contract = (await deployContract(deployer, blueprint))['contract'];
+      const flip = contract.exec('flip', value, gasLimit);
+      await submitTransactionAsync(bob, flip);
+      expectedFlipValue = !expectedFlipValue;
+      const afterFlip = await getFlipValue(contract,deployer);
+      expect(afterFlip).to.be.eq(expectedFlipValue, `Anyone can call new contract.`);
 
-      const getFlipValue = async () => {
-        const result = await contract.query.get(deployer.address, value, gasLimit);
+      const deployerCanFlip = async () => {
+        expectedFlipValue = !expectedFlipValue;
+        const deployerFlip = contract.exec('flip', value, gasLimit);
+        await submitTransactionAsync(deployer, deployerFlip);
+        const aliceFlip1Response = await getFlipValue(contract, deployer);
+        expect(aliceFlip1Response).to.be.eq(expectedFlipValue, `Deployer always can flip.`);
+      };
+      await deployerCanFlip();
 
-        if(!result.result.isSuccess) {
-          throw `Failed to get flipper value`;
-        }
-        return (result.result.asSuccess.data[0] == 0x00) ? false : true;
-      }
+      const enableWhiteListTx = api.tx.nft.toggleContractWhiteList(contract.address, true);
+      const enableResult = await submitTransactionAsync(deployer, enableWhiteListTx);
+      const flipWithEnabledWhiteList = contract.exec('flip', value, gasLimit);
+      await expect(submitTransactionExpectFailAsync(bob, flipWithEnabledWhiteList)).to.be.rejected;
+      const flipValueAfterEnableWhiteList = await getFlipValue(contract, deployer);
+      expect(flipValueAfterEnableWhiteList).to.be.eq(expectedFlipValue, `Enabling whitelist doesn't make it possible to call contract for everyone.`);
 
-      const initialGetResponse = await getFlipValue();
-      expect(initialGetResponse).to.be.true;
+      await deployerCanFlip();
 
-      const flip = contract.exec('flip', value, gasLimit);
-      await submitTransactionAsync(deployer, flip);
+      const addBobToWhiteListTx = api.tx.nft.addToContractWhiteList(contract.address, bob.address);
+      const addBobResult = await submitTransactionAsync(deployer, addBobToWhiteListTx);
+      const flipWithWhitelistedBob = contract.exec('flip', value, gasLimit);
+      await submitTransactionAsync(bob, flipWithWhitelistedBob);
+      expectedFlipValue = !expectedFlipValue;
+      const flipAfterWhiteListed = await getFlipValue(contract,deployer);
+      expect(flipAfterWhiteListed).to.be.eq(expectedFlipValue, `Bob was whitelisted, now he can flip.`);
 
-      const afterFlipGetResponse = await getFlipValue();
+      await deployerCanFlip();
 
-      expect(afterFlipGetResponse).to.be.false;
+      const removeBobFromWhiteListTx = api.tx.nft.removeFromContractWhiteList(contract.address, bob.address);
+      const removeBobResult = await submitTransactionAsync(deployer, removeBobFromWhiteListTx);
+      const bobRemoved = contract.exec('flip', value, gasLimit);
+      await expect(submitTransactionExpectFailAsync(bob, bobRemoved)).to.be.rejected;
+      const afterBobRemoved = await getFlipValue(contract, deployer);
+      expect(afterBobRemoved).to.be.eq(expectedFlipValue, `Bob can't call contract, now when he is removeed from white list.`);
+
+      await deployerCanFlip();
+
+      const disableWhiteListTx = api.tx.nft.toggleContractWhiteList(contract.address, false);
+      const disableWhiteListResult = await submitTransactionAsync(deployer, disableWhiteListTx);
+      const whiteListDisabledFlip = contract.exec('flip', value, gasLimit);
+      await submitTransactionAsync(bob, whiteListDisabledFlip);
+      expectedFlipValue = !expectedFlipValue;
+      const afterWhiteListDisabled = await getFlipValue(contract,deployer);
+      expect(afterWhiteListDisabled).to.be.eq(expectedFlipValue, `Anyone can call contract with disabled whitelist.`);
+
+      console.error = consoleError;
     });
   });
 
modifiedtests/src/substrate/substrate-api.tsdiffbeforeafterboth
--- a/tests/src/substrate/substrate-api.ts
+++ b/tests/src/substrate/substrate-api.ts
@@ -56,3 +56,25 @@
     }
   });
 }
+
+export function submitTransactionExpectFailAsync(sender: IKeyringPair, transaction: SubmittableExtrinsic<ApiTypes>): Promise<EventRecord[]> {
+  return new Promise(async function(resolve, reject) {
+    try {
+      await transaction.signAndSend(sender, ({ events = [], status }) => {
+        if (status.isReady) {
+          // nothing to do
+          // console.log(`Current tx status is Ready`);
+        } else if (status.isBroadcast) {
+          // nothing to do
+          // console.log(`Current tx status is Broadcast`);
+        } else if (status.isInBlock || status.isFinalized) {
+          resolve(events);
+        } else {
+          reject("Transaction failed");
+        }
+      });
+    } catch (e) {
+      reject(e);
+    }
+  });
+}
\ No newline at end of file