git.delta.rocks / unique-network / refs/commits / 0dbd5ddfd265

difftreelog

Merge pull request #9 from usetech-llc/feature_limits_nft_78_85_105

Greg Zaitsev2020-10-13parents: #eb6665e #d339ca3.patch.diff
in: master
Transfer rate limit + chain bounds

4 files changed

modifiednode/src/chain_spec.rsdiffbeforeafterboth
--- a/node/src/chain_spec.rs
+++ b/node/src/chain_spec.rs
@@ -130,23 +130,35 @@
         }),
         sudo: Some(SudoConfig { key: root_key }),
         nft: Some(NftConfig {
-            collection: vec![(1, CollectionType { 
-                owner: get_account_id_from_seed::<sr25519::Public>("Alice"),
-                mode: CollectionMode::NFT(50),
-                access: AccessMode::Normal,
-                decimal_points: 0,
-                name: vec!(),
-                description: vec!(),
-                token_prefix: vec!(),
-                custom_data_size: 50,
-                mint_mode: false,
-                offchain_schema: vec!(),
-                sponsor: get_account_id_from_seed::<sr25519::Public>("Alice"),
-                unconfirmed_sponsor: get_account_id_from_seed::<sr25519::Public>("Alice"),
-            })],
-            nft_item_id: vec!(),
-            fungible_item_id: vec!(),
-            refungible_item_id: vec!(),
+            collection: vec![(
+                1,
+                CollectionType {
+                    owner: get_account_id_from_seed::<sr25519::Public>("Alice"),
+                    mode: CollectionMode::NFT(50),
+                    access: AccessMode::Normal,
+                    decimal_points: 0,
+                    name: vec![],
+                    description: vec![],
+                    token_prefix: vec![],
+                    custom_data_size: 50,
+                    mint_mode: false,
+                    offchain_schema: vec![],
+                    sponsor: get_account_id_from_seed::<sr25519::Public>("Alice"),
+                    unconfirmed_sponsor: get_account_id_from_seed::<sr25519::Public>("Alice"),
+                },
+            )],
+            nft_item_id: vec![],
+            fungible_item_id: vec![],
+            refungible_item_id: vec![],
+            chain_limit: ChainLimits {
+                collection_numbers_limit: 10,
+                account_token_ownership_limit: 10,
+                collections_admins_limit: 5,
+                custom_data_limit: 2048,
+                nft_sponsor_transfer_timeout: 15,
+                fungible_sponsor_transfer_timeout: 15,
+                refungible_sponsor_transfer_timeout: 15,
+            },
         }),
         contracts: Some(ContractsConfig {
             current_schedule: ContractsSchedule {
modifiedpallets/nft/src/lib.rsdiffbeforeafterboth
--- a/pallets/nft/src/lib.rs
+++ b/pallets/nft/src/lib.rs
@@ -1,6 +1,9 @@
 #![cfg_attr(not(feature = "std"), no_std)]
 
 #[cfg(feature = "std")]
+pub use std::*;
+
+#[cfg(feature = "std")]
 pub use serde::*;
 
 use codec::{Decode, Encode};
@@ -20,7 +23,7 @@
     IsSubType, StorageValue,
 };
 
-use frame_system::{self as system, ensure_signed};
+use frame_system::{self as system, ensure_signed, ensure_root};
 use sp_runtime::sp_std::prelude::Vec;
 use sp_runtime::{
     traits::{
@@ -157,6 +160,27 @@
     pub vesting_date: Moment,
 }
 
+#[derive(Encode, Decode, Default, Debug, Clone, PartialEq)]
+#[cfg_attr(feature = "std", derive(Serialize, Deserialize))]
+pub struct BasketItem<AccountId, BlockNumber> {
+    pub address: AccountId,
+    pub start_block: BlockNumber,
+}
+
+#[derive(Encode, Decode, Default, Debug, Clone, PartialEq)]
+#[cfg_attr(feature = "std", derive(Serialize, Deserialize))]
+pub struct ChainLimits {
+    pub collection_numbers_limit: u64,
+    pub account_token_ownership_limit: u64,
+    pub collections_admins_limit: u64,
+    pub custom_data_limit: u32,
+
+    // Timeouts for item types in passed blocks
+    pub nft_sponsor_transfer_timeout: u32,
+    pub fungible_sponsor_transfer_timeout: u32,
+    pub refungible_sponsor_transfer_timeout: u32,
+}
+
 pub trait Trait: system::Trait {
     type Event: From<Event<Self>> + Into<<Self as system::Trait>::Event>;
 }
@@ -172,6 +196,14 @@
         ChainVersion: u64;
         ItemListIndex: map hasher(blake2_128_concat) u64 => u64;
 
+        // Chain limits struct
+        pub ChainLimit get(fn chain_limit) config(): ChainLimits;
+
+        // Bound counters
+        CollectionCount: u64;
+        pub AccountItemCount get(fn account_item_count): map hasher(identity) T::AccountId => u64;
+
+        // Basic collections
         pub Collection get(fn collection) config(): map hasher(identity) u64 => CollectionType<T::AccountId>;
         pub AdminList get(fn admin_list_collection): map hasher(identity) u64 => Vec<T::AccountId>;
         pub WhiteList get(fn white_list): map hasher(identity) u64 => Vec<T::AccountId>;
@@ -190,13 +222,18 @@
         /// Index list
         pub AddressTokens get(fn address_tokens): double_map hasher(blake2_128_concat) u64, hasher(blake2_128_concat) T::AccountId => Vec<u64>;
 
+        /// Tokens transfer baskets
+        pub NftTransferBasket get(fn nft_transfer_basket): double_map hasher(blake2_128_concat) u64, hasher(blake2_128_concat) u64 => T::BlockNumber;
+        pub FungibleTransferBasket get(fn fungible_transfer_basket): double_map hasher(blake2_128_concat) u64, hasher(blake2_128_concat) u64 => Vec<BasketItem<T::AccountId, T::BlockNumber>>;
+        pub ReFungibleTransferBasket get(fn refungible_transfer_basket): double_map hasher(blake2_128_concat) u64, hasher(blake2_128_concat) u64 => T::BlockNumber;
+
         // Sponsorship
         pub ContractSponsor get(fn contract_sponsor): map hasher(identity) T::AccountId => T::AccountId;
         pub UnconfirmedContractSponsor get(fn unconfirmed_contract_sponsor): map hasher(identity) T::AccountId => T::AccountId;
     }
     add_extra_genesis {
         build(|config: &GenesisConfig<T>| {
-			// Modification of storage
+            // Modification of storage
             for (_num, _c) in &config.collection {
                 <Module<T>>::init_collection(_c);
             }
@@ -212,7 +249,7 @@
             for (_num, _q, _i) in &config.refungible_item_id {
                 <Module<T>>::init_refungible_token(_i);
             }
-		})
+        })
     }
 }
 
@@ -295,8 +332,18 @@
             // Anyone can create a collection
             let who = ensure_signed(origin)?;
             let custom_data_size = match mode {
-                CollectionMode::NFT(size) => size,
-                CollectionMode::ReFungible(size, _) => size,
+                CollectionMode::NFT(size) => {
+
+                    // bound Custom data size
+                    ensure!(size < ChainLimit::get().custom_data_limit, "Custom data size bound exceeded");
+                    size
+                },
+                CollectionMode::ReFungible(size, _) => {
+
+                    // bound Custom data size
+                    ensure!(size < ChainLimit::get().custom_data_limit, "Custom data size bound exceeded");
+                    size
+                },
                 _ => 0
             };
 
@@ -306,6 +353,9 @@
                 _ => 0
             };
 
+            // bound Total number of collections
+            ensure!(CollectionCount::get() < ChainLimit::get().collection_numbers_limit, "Total collections bound exceeded");
+
             // check params
             ensure!(decimal_points <= 4, "decimal_points parameter must be lower than 4");
 
@@ -326,7 +376,13 @@
                 .checked_add(1)
                 .expect("collection id error");
 
+            // bound counter
+            let total = CollectionCount::get()
+                .checked_add(1)
+                .expect("collection counter error");
+
             CreatedCollectionCount::put(next_id);
+            CollectionCount::put(total);
 
             // Create new collection
             let new_collection = CollectionType {
@@ -368,7 +424,6 @@
             let sender = ensure_signed(origin)?;
             Self::check_owner_permissions(collection_id, sender)?;
 
-            // TODO Items remove
             <AddressTokens<T>>::remove_prefix(collection_id);
             <ApprovedList<T>>::remove_prefix(collection_id);
             <Balance<T>>::remove_prefix(collection_id);
@@ -377,6 +432,24 @@
             <Collection<T>>::remove(collection_id);
             <WhiteList<T>>::remove(collection_id);
 
+            <NftItemList<T>>::remove_prefix(collection_id);
+            <FungibleItemList<T>>::remove_prefix(collection_id);
+            <ReFungibleItemList<T>>::remove_prefix(collection_id);
+
+            <NftTransferBasket<T>>::remove_prefix(collection_id);
+            <FungibleTransferBasket<T>>::remove_prefix(collection_id);
+            <ReFungibleTransferBasket<T>>::remove_prefix(collection_id);
+
+            if CollectionCount::get() > 0
+            {
+                // bound couter
+                let total = CollectionCount::get()
+                    .checked_sub(1)
+                    .expect("collection counter error");
+
+                CollectionCount::put(total);
+            }
+
             Ok(())
         }
 
@@ -544,6 +617,9 @@
                 ensure!(!admin_arr.contains(&new_admin_id), "Account already has admin role");
             }
 
+            // Number of collection admins
+            ensure!((admin_arr.len() as u64) < ChainLimit::get().collections_admins_limit, "Number of collection admins bound exceeded");
+
             admin_arr.push(new_admin_id);
             <AdminList<T>>::insert(collection_id, admin_arr);
 
@@ -758,8 +834,8 @@
 
             // Transfer permissions check
             let target_collection = <Collection<T>>::get(collection_id);
-            ensure!(Self::is_item_owner(sender.clone(), collection_id, item_id) || 
-                Self::is_owner_or_admin_permissions(collection_id, sender.clone()), 
+            ensure!(Self::is_item_owner(sender.clone(), collection_id, item_id) ||
+                Self::is_owner_or_admin_permissions(collection_id, sender.clone()),
                 "Only item owner, collection owner and admins can modify item");
 
             if target_collection.access == AccessMode::WhiteList {
@@ -810,8 +886,8 @@
 
             // Transfer permissions check
             let target_collection = <Collection<T>>::get(collection_id);
-            ensure!(Self::is_item_owner(sender.clone(), collection_id, item_id) || 
-                Self::is_owner_or_admin_permissions(collection_id, sender.clone()), 
+            ensure!(Self::is_item_owner(sender.clone(), collection_id, item_id) ||
+                Self::is_owner_or_admin_permissions(collection_id, sender.clone()),
                 "Only item owner, collection owner and admins can modify item");
 
             if target_collection.access == AccessMode::WhiteList {
@@ -852,8 +928,8 @@
 
             // Transfer permissions check
             let target_collection = <Collection<T>>::get(collection_id);
-            ensure!(Self::is_item_owner(sender.clone(), collection_id, item_id) || 
-                Self::is_owner_or_admin_permissions(collection_id, sender.clone()), 
+            ensure!(Self::is_item_owner(sender.clone(), collection_id, item_id) ||
+                Self::is_owner_or_admin_permissions(collection_id, sender.clone()),
                 "Only item owner, collection owner and admins can approve");
 
             if target_collection.access == AccessMode::WhiteList {
@@ -919,7 +995,7 @@
 
             // Transfer permissions check
             let target_collection = <Collection<T>>::get(collection_id);
-            ensure!(appoved_transfer || Self::is_owner_or_admin_permissions(collection_id, sender.clone()), 
+            ensure!(appoved_transfer || Self::is_owner_or_admin_permissions(collection_id, sender.clone()),
                 "Only item owner, collection owner and admins can modify items");
 
             if target_collection.access == AccessMode::WhiteList {
@@ -987,6 +1063,17 @@
 
             Ok(())
         }
+
+        // Sudo permissions function
+        #[weight = 0]
+        pub fn set_chain_limits(
+            origin,
+            limits: ChainLimits
+        ) -> DispatchResult {
+            ensure_root(origin)?;
+            <ChainLimit>::put(limits);
+            Ok(())
+        }        
     }
 }
 
@@ -1004,6 +1091,10 @@
         <ItemListIndex>::insert(item.collection, current_index);
         <FungibleItemList<T>>::insert(item.collection, current_index, itemcopy);
 
+        // Add current block
+        let v: Vec<BasketItem<T::AccountId, T::BlockNumber>> = Vec::new();
+        <FungibleTransferBasket<T>>::insert(item.collection, current_index, v);
+        
         // Update balance
         let new_balance = <Balance<T>>::get(item.collection, owner.clone())
             .checked_add(value)
@@ -1027,6 +1118,10 @@
         <ItemListIndex>::insert(item.collection, current_index);
         <ReFungibleItemList<T>>::insert(item.collection, current_index, itemcopy);
 
+        // Add current block
+        let block_number: T::BlockNumber = 0.into();
+        <ReFungibleTransferBasket<T>>::insert(item.collection, current_index, block_number);
+
         // Update balance
         let new_balance = <Balance<T>>::get(item.collection, owner.clone())
             .checked_add(value)
@@ -1048,6 +1143,10 @@
         <ItemListIndex>::insert(collection_id, current_index);
         <NftItemList<T>>::insert(collection_id, current_index, item);
 
+        // Add current block
+        let block_number: T::BlockNumber = 0.into();
+        <NftTransferBasket<T>>::insert(collection_id, current_index, block_number);
+
         // Update balance
         let new_balance = <Balance<T>>::get(collection_id, item_owner.clone())
             .checked_add(1)
@@ -1057,7 +1156,11 @@
         Ok(())
     }
 
-    fn burn_refungible_item(collection_id: u64, item_id: u64, owner: T::AccountId) -> DispatchResult {
+    fn burn_refungible_item(
+        collection_id: u64,
+        item_id: u64,
+        owner: T::AccountId,
+    ) -> DispatchResult {
         ensure!(
             <ReFungibleItemList<T>>::contains_key(collection_id, item_id),
             "Item does not exists"
@@ -1149,7 +1252,6 @@
     }
 
     fn is_owner_or_admin_permissions(collection_id: u64, subject: T::AccountId) -> bool {
-
         let target_collection = <Collection<T>>::get(collection_id);
         let mut result: bool = subject == target_collection.owner;
         let exists = <AdminList<T>>::contains_key(collection_id);
@@ -1163,12 +1265,17 @@
         result
     }
 
-    fn check_owner_or_admin_permissions(collection_id: u64, subject: T::AccountId) -> DispatchResult {
-        
+    fn check_owner_or_admin_permissions(
+        collection_id: u64,
+        subject: T::AccountId,
+    ) -> DispatchResult {
         Self::collection_exists(collection_id)?;
         let result = Self::is_owner_or_admin_permissions(collection_id, subject.clone());
 
-        ensure!(result, "You do not have permissions to modify this collection");
+        ensure!(
+            result,
+            "You do not have permissions to modify this collection"
+        );
         Ok(())
     }
 
@@ -1193,7 +1300,6 @@
     }
 
     fn check_white_list(collection_id: u64, address: &T::AccountId) -> DispatchResult {
-
         let mes = "Address is not in white list";
         ensure!(<WhiteList<T>>::contains_key(collection_id), mes);
         let wl = <WhiteList<T>>::get(collection_id);
@@ -1209,7 +1315,6 @@
         owner: T::AccountId,
         new_owner: T::AccountId,
     ) -> DispatchResult {
-
         ensure!(
             <FungibleItemList<T>>::contains_key(collection_id, item_id),
             "Item not exists"
@@ -1299,7 +1404,6 @@
         owner: T::AccountId,
         new_owner: T::AccountId,
     ) -> DispatchResult {
-
         ensure!(
             <ReFungibleItemList<T>>::contains_key(collection_id, item_id),
             "Item not exists"
@@ -1385,7 +1489,6 @@
         sender: T::AccountId,
         new_owner: T::AccountId,
     ) -> DispatchResult {
-    
         ensure!(
             <NftItemList<T>>::contains_key(collection_id, item_id),
             "Item not exists"
@@ -1422,24 +1525,34 @@
         Ok(())
     }
 
-    fn init_collection(item: &CollectionType<T::AccountId>){
+    fn init_collection(item: &CollectionType<T::AccountId>) {
+        // check params
+        assert!(
+            item.decimal_points <= 4,
+            "decimal_points parameter must be lower than 4"
+        );
+        assert!(
+            item.name.len() <= 64,
+            "Collection name can not be longer than 63 char"
+        );
+        assert!(
+            item.name.len() <= 256,
+            "Collection description can not be longer than 255 char"
+        );
+        assert!(
+            item.token_prefix.len() <= 16,
+            "Token prefix can not be longer than 15 char"
+        );
 
-                // check params
-                assert!(item.decimal_points <= 4, "decimal_points parameter must be lower than 4");
-                assert!(item.name.len() <= 64, "Collection name can not be longer than 63 char");
-                assert!(item.name.len() <= 256, "Collection description can not be longer than 255 char");
-                assert!(item.token_prefix.len() <= 16, "Token prefix can not be longer than 15 char");
-    
-                // Generate next collection ID
-                let next_id = CreatedCollectionCount::get()
-                    .checked_add(1)
-                    .expect("collection id error");
-    
-                CreatedCollectionCount::put(next_id);  
-    }
+        // Generate next collection ID
+        let next_id = CreatedCollectionCount::get()
+            .checked_add(1)
+            .expect("collection id error");
 
-    fn init_nft_token(item: &NftItemType<T::AccountId>){
+        CreatedCollectionCount::put(next_id);
+    }
 
+    fn init_nft_token(item: &NftItemType<T::AccountId>) {
         let current_index = <ItemListIndex>::get(item.collection)
             .checked_add(1)
             .expect("Item list index id error");
@@ -1457,8 +1570,7 @@
         <Balance<T>>::insert(collection_id, item_owner.clone(), new_balance);
     }
 
-    fn init_fungible_token(item: &FungibleItemType<T::AccountId>){
-
+    fn init_fungible_token(item: &FungibleItemType<T::AccountId>) {
         let current_index = <ItemListIndex>::get(item.collection)
             .checked_add(1)
             .expect("Item list index id error");
@@ -1476,8 +1588,7 @@
         <Balance<T>>::insert(item.collection, owner.clone(), new_balance);
     }
 
-    fn init_refungible_token(item: &ReFungibleItemType<T::AccountId>){
-
+    fn init_refungible_token(item: &ReFungibleItemType<T::AccountId>) {
         let current_index = <ItemListIndex>::get(item.collection)
             .checked_add(1)
             .expect("Item list index id error");
@@ -1497,6 +1608,21 @@
     }
 
     fn add_token_index(collection_id: u64, item_index: u64, owner: T::AccountId) -> DispatchResult {
+
+        // add to account limit
+        if <AccountItemCount<T>>::contains_key(owner.clone()) {
+
+            // bound Owned tokens by a single address
+            let count = <AccountItemCount<T>>::get(owner.clone());
+            ensure!(count < ChainLimit::get().account_token_ownership_limit, "Owned tokens by a single address bound exceeded");
+
+            <AccountItemCount<T>>::insert(owner.clone(), 
+                count.checked_add(1).unwrap());
+        }
+        else {
+            <AccountItemCount<T>>::insert(owner.clone(), 1);
+        }
+
         let list_exists = <AddressTokens<T>>::contains_key(collection_id, owner.clone());
         if list_exists {
             let mut list = <AddressTokens<T>>::get(collection_id, owner.clone());
@@ -1511,6 +1637,7 @@
             let mut itm = Vec::new();
             itm.push(item_index.clone());
             <AddressTokens<T>>::insert(collection_id, owner, itm);
+            
         }
 
         Ok(())
@@ -1521,6 +1648,12 @@
         item_index: u64,
         owner: T::AccountId,
     ) -> DispatchResult {
+
+        // update counter
+        <AccountItemCount<T>>::insert(owner.clone(), 
+            <AccountItemCount<T>>::get(owner.clone()).checked_sub(1).unwrap());
+
+
         let list_exists = <AddressTokens<T>>::contains_key(collection_id, owner.clone());
         if list_exists {
             let mut list = <AddressTokens<T>>::get(collection_id, owner.clone());
@@ -1628,7 +1761,65 @@
                 <Collection<T>>::get(collection_id).sponsor
             }
             Some(Call::transfer(_new_owner, collection_id, _item_id, _value)) => {
-                <Collection<T>>::get(collection_id).sponsor
+                let _collection_mode = <Collection<T>>::get(collection_id).mode;
+
+                // sponsor timeout
+                let sponsor_transfer = match _collection_mode {
+                    CollectionMode::NFT(_) => {
+                        let basket = <NftTransferBasket<T>>::get(collection_id, _item_id);
+                        let block_number = <system::Module<T>>::block_number() as T::BlockNumber;
+                        let limit_time = basket + ChainLimit::get().nft_sponsor_transfer_timeout.into();
+                        if block_number >= limit_time {
+                            <NftTransferBasket<T>>::insert(collection_id, _item_id, block_number);
+                            true
+                        }
+                        else {
+                            false
+                        }
+                    }
+                    CollectionMode::Fungible(_) => {
+                        let mut basket = <FungibleTransferBasket<T>>::get(collection_id, _item_id);
+                        let block_number = <system::Module<T>>::block_number() as T::BlockNumber;
+                        if basket.iter().any(|i| i.address == _new_owner.clone())
+                        {
+                            let item = basket.iter_mut().find(|i| i.address == _new_owner.clone()).unwrap().clone();
+                            let limit_time = item.start_block + ChainLimit::get().fungible_sponsor_transfer_timeout.into();
+                            if block_number >= limit_time {
+                                basket.retain(|x| x.address == item.address);
+                                basket.push(BasketItem { start_block: block_number, address: _new_owner.clone() });
+                                <FungibleTransferBasket<T>>::insert(collection_id, _item_id, basket);
+                                true
+                            }
+                            else {
+                                false
+                            }
+                        }
+                        else {
+                            basket.push(BasketItem { start_block: block_number, address: _new_owner.clone()});
+                            true
+                        }
+                    }
+                    CollectionMode::ReFungible(_, _) => {
+                        let basket = <ReFungibleTransferBasket<T>>::get(collection_id, _item_id);
+                        let block_number = <system::Module<T>>::block_number() as T::BlockNumber;
+                        let limit_time = basket + ChainLimit::get().nft_sponsor_transfer_timeout.into();
+                        if block_number >= limit_time {
+                            <ReFungibleTransferBasket<T>>::insert(collection_id, _item_id, block_number);
+                            true
+                        } else {
+                            false
+                        }
+                    }
+                    _ => {
+                        false
+                    },
+                };
+
+                if !sponsor_transfer {
+                    T::AccountId::default()
+                } else {
+                    <Collection<T>>::get(collection_id).sponsor
+                }
             }
 
             _ => T::AccountId::default(),
@@ -1745,4 +1936,4 @@
         Ok(())
     }
 }
-// #endregion
\ No newline at end of file
+// #endregion
modifiedpallets/nft/src/mock.rsdiffbeforeafterboth
--- a/pallets/nft/src/mock.rs
+++ b/pallets/nft/src/mock.rs
@@ -65,6 +65,7 @@
 }
 pub type TemplateModule = Module<Test>;
 
+
 // This function basically just builds a genesis storage key/value store according to
 // our desired mockup.
 pub fn new_test_ext() -> sp_io::TestExternalities {
modifiedpallets/nft/src/tests.rsdiffbeforeafterboth
1// Tests to be written here1// Tests to be written here
2use crate::mock::*;2use crate::mock::*;
3use crate::{ApprovePermissions, CollectionMode, AccessMode, Ownership};3use crate::{AccessMode, ApprovePermissions, CollectionMode, Ownership, ChainLimits};
4use frame_support::{assert_noop, assert_ok};4use frame_support::{assert_noop, assert_ok};
5use frame_system::{ RawOrigin };
56
6// Use cases tests region7// Use cases tests region
7// #region8// #region
13 let token_prefix1: Vec<u8> = b"token_prefix1\0".to_vec();14 let token_prefix1: Vec<u8> = b"token_prefix1\0".to_vec();
14 let mode: CollectionMode = CollectionMode::NFT(2000);15 let mode: CollectionMode = CollectionMode::NFT(2000);
1516
17 assert_ok!(TemplateModule::set_chain_limits(RawOrigin::Root.into(), ChainLimits {
18 collection_numbers_limit: 10,
19 account_token_ownership_limit: 10,
20 collections_admins_limit: 5,
21 custom_data_limit: 2048,
22 nft_sponsor_transfer_timeout: 15,
23 fungible_sponsor_transfer_timeout: 15,
24 refungible_sponsor_transfer_timeout: 15,
25 }));
26
16 let origin1 = Origin::signed(1);27 let origin1 = Origin::signed(1);
17 assert_ok!(TemplateModule::create_collection(28 assert_ok!(TemplateModule::create_collection(
18 origin1.clone(),29 origin1.clone(),
41 let token_prefix1: Vec<u8> = b"token_prefix1\0".to_vec();52 let token_prefix1: Vec<u8> = b"token_prefix1\0".to_vec();
42 let mode: CollectionMode = CollectionMode::ReFungible(2000, 3);53 let mode: CollectionMode = CollectionMode::ReFungible(2000, 3);
4354
55 assert_ok!(TemplateModule::set_chain_limits(RawOrigin::Root.into(), ChainLimits {
56 collection_numbers_limit: 10,
57 account_token_ownership_limit: 10,
58 collections_admins_limit: 5,
59 custom_data_limit: 2048,
60 nft_sponsor_transfer_timeout: 15,
61 fungible_sponsor_transfer_timeout: 15,
62 refungible_sponsor_transfer_timeout: 15,
63 }));
64
44 let origin1 = Origin::signed(1);65 let origin1 = Origin::signed(1);
45 assert_ok!(TemplateModule::create_collection(66 assert_ok!(TemplateModule::create_collection(
46 origin1.clone(),67 origin1.clone(),
79 let token_prefix1: Vec<u8> = b"token_prefix1\0".to_vec();100 let token_prefix1: Vec<u8> = b"token_prefix1\0".to_vec();
80 let mode: CollectionMode = CollectionMode::Fungible(3);101 let mode: CollectionMode = CollectionMode::Fungible(3);
81102
103 assert_ok!(TemplateModule::set_chain_limits(RawOrigin::Root.into(), ChainLimits {
104 collection_numbers_limit: 10,
105 account_token_ownership_limit: 10,
106 collections_admins_limit: 5,
107 custom_data_limit: 2048,
108 nft_sponsor_transfer_timeout: 15,
109 fungible_sponsor_transfer_timeout: 15,
110 refungible_sponsor_transfer_timeout: 15,
111 }));
112
82 let origin1 = Origin::signed(1);113 let origin1 = Origin::signed(1);
83 assert_ok!(TemplateModule::create_collection(114 assert_ok!(TemplateModule::create_collection(
84 origin1.clone(),115 origin1.clone(),
109 let token_prefix1: Vec<u8> = b"token_prefix1\0".to_vec();140 let token_prefix1: Vec<u8> = b"token_prefix1\0".to_vec();
110 let mode: CollectionMode = CollectionMode::Fungible(3);141 let mode: CollectionMode = CollectionMode::Fungible(3);
111142
143 assert_ok!(TemplateModule::set_chain_limits(RawOrigin::Root.into(), ChainLimits {
144 collection_numbers_limit: 10,
145 account_token_ownership_limit: 10,
146 collections_admins_limit: 5,
147 custom_data_limit: 2048,
148 nft_sponsor_transfer_timeout: 15,
149 fungible_sponsor_transfer_timeout: 15,
150 refungible_sponsor_transfer_timeout: 15,
151 }));
152
112 let origin1 = Origin::signed(1);153 let origin1 = Origin::signed(1);
113 let origin2 = Origin::signed(2);154 let origin2 = Origin::signed(2);
114 assert_ok!(TemplateModule::create_collection(155 assert_ok!(TemplateModule::create_collection(
167 let token_prefix1: Vec<u8> = b"token_prefix1\0".to_vec();208 let token_prefix1: Vec<u8> = b"token_prefix1\0".to_vec();
168 let mode: CollectionMode = CollectionMode::ReFungible(2000, 3);209 let mode: CollectionMode = CollectionMode::ReFungible(2000, 3);
169210
211 assert_ok!(TemplateModule::set_chain_limits(RawOrigin::Root.into(), ChainLimits {
212 collection_numbers_limit: 10,
213 account_token_ownership_limit: 10,
214 collections_admins_limit: 5,
215 custom_data_limit: 2048,
216 nft_sponsor_transfer_timeout: 15,
217 fungible_sponsor_transfer_timeout: 15,
218 refungible_sponsor_transfer_timeout: 15,
219 }));
220
170 let origin1 = Origin::signed(1);221 let origin1 = Origin::signed(1);
171 let origin2 = Origin::signed(2);222 let origin2 = Origin::signed(2);
172 assert_ok!(TemplateModule::create_collection(223 assert_ok!(TemplateModule::create_collection(
264 let token_prefix1: Vec<u8> = b"token_prefix1\0".to_vec();315 let token_prefix1: Vec<u8> = b"token_prefix1\0".to_vec();
265 let mode: CollectionMode = CollectionMode::NFT(2000);316 let mode: CollectionMode = CollectionMode::NFT(2000);
266317
318 assert_ok!(TemplateModule::set_chain_limits(RawOrigin::Root.into(), ChainLimits {
319 collection_numbers_limit: 10,
320 account_token_ownership_limit: 10,
321 collections_admins_limit: 5,
322 custom_data_limit: 2048,
323 nft_sponsor_transfer_timeout: 15,
324 fungible_sponsor_transfer_timeout: 15,
325 refungible_sponsor_transfer_timeout: 15,
326 }));
327
267 let origin1 = Origin::signed(1);328 let origin1 = Origin::signed(1);
268 assert_ok!(TemplateModule::create_collection(329 assert_ok!(TemplateModule::create_collection(
269 origin1.clone(),330 origin1.clone(),
302 let token_prefix1: Vec<u8> = b"token_prefix1\0".to_vec();363 let token_prefix1: Vec<u8> = b"token_prefix1\0".to_vec();
303 let mode: CollectionMode = CollectionMode::NFT(2000);364 let mode: CollectionMode = CollectionMode::NFT(2000);
304365
366 assert_ok!(TemplateModule::set_chain_limits(RawOrigin::Root.into(), ChainLimits {
367 collection_numbers_limit: 10,
368 account_token_ownership_limit: 10,
369 collections_admins_limit: 5,
370 custom_data_limit: 2048,
371 nft_sponsor_transfer_timeout: 15,
372 fungible_sponsor_transfer_timeout: 15,
373 refungible_sponsor_transfer_timeout: 15,
374 }));
375
305 let origin1 = Origin::signed(1);376 let origin1 = Origin::signed(1);
306 let origin2 = Origin::signed(2);377 let origin2 = Origin::signed(2);
307 assert_ok!(TemplateModule::create_collection(378 assert_ok!(TemplateModule::create_collection(
323 assert_eq!(TemplateModule::balance_count(1, 1), 1);394 assert_eq!(TemplateModule::balance_count(1, 1), 1);
324 assert_eq!(TemplateModule::address_tokens(1, 1), [1]);395 assert_eq!(TemplateModule::address_tokens(1, 1), [1]);
325396
326 assert_ok!(TemplateModule::set_mint_permission(origin1.clone(), 1, true));397 assert_ok!(TemplateModule::set_mint_permission(
398 origin1.clone(),
399 1,
400 true
401 ));
327 assert_ok!(TemplateModule::set_public_access_mode(origin1.clone(), 1, AccessMode::WhiteList));402 assert_ok!(TemplateModule::set_public_access_mode(
403 origin1.clone(),
404 1,
405 AccessMode::WhiteList
406 ));
328 assert_ok!(TemplateModule::add_to_white_list(origin1.clone(), 1, 1));407 assert_ok!(TemplateModule::add_to_white_list(origin1.clone(), 1, 1));
329 assert_ok!(TemplateModule::add_to_white_list(origin1.clone(), 1, 2));408 assert_ok!(TemplateModule::add_to_white_list(origin1.clone(), 1, 2));
330 assert_ok!(TemplateModule::add_to_white_list(origin1.clone(), 1, 3));409 assert_ok!(TemplateModule::add_to_white_list(origin1.clone(), 1, 3));
362 let token_prefix1: Vec<u8> = b"token_prefix1\0".to_vec();441 let token_prefix1: Vec<u8> = b"token_prefix1\0".to_vec();
363 let mode: CollectionMode = CollectionMode::ReFungible(2000, 3);442 let mode: CollectionMode = CollectionMode::ReFungible(2000, 3);
364443
444 assert_ok!(TemplateModule::set_chain_limits(RawOrigin::Root.into(), ChainLimits {
445 collection_numbers_limit: 10,
446 account_token_ownership_limit: 10,
447 collections_admins_limit: 5,
448 custom_data_limit: 2048,
449 nft_sponsor_transfer_timeout: 15,
450 fungible_sponsor_transfer_timeout: 15,
451 refungible_sponsor_transfer_timeout: 15,
452 }));
453
365 let origin1 = Origin::signed(1);454 let origin1 = Origin::signed(1);
366 let origin2 = Origin::signed(2);455 let origin2 = Origin::signed(2);
367 assert_ok!(TemplateModule::create_collection(456 assert_ok!(TemplateModule::create_collection(
393 assert_eq!(TemplateModule::balance_count(1, 1), 1000);482 assert_eq!(TemplateModule::balance_count(1, 1), 1000);
394 assert_eq!(TemplateModule::address_tokens(1, 1), [1]);483 assert_eq!(TemplateModule::address_tokens(1, 1), [1]);
395484
396 assert_ok!(TemplateModule::set_mint_permission(origin1.clone(), 1, true));485 assert_ok!(TemplateModule::set_mint_permission(
486 origin1.clone(),
487 1,
488 true
489 ));
397 assert_ok!(TemplateModule::set_public_access_mode(origin1.clone(), 1, AccessMode::WhiteList));490 assert_ok!(TemplateModule::set_public_access_mode(
491 origin1.clone(),
492 1,
493 AccessMode::WhiteList
494 ));
398 assert_ok!(TemplateModule::add_to_white_list(origin1.clone(), 1, 1));495 assert_ok!(TemplateModule::add_to_white_list(origin1.clone(), 1, 1));
399 assert_ok!(TemplateModule::add_to_white_list(origin1.clone(), 1, 2));496 assert_ok!(TemplateModule::add_to_white_list(origin1.clone(), 1, 2));
400 assert_ok!(TemplateModule::add_to_white_list(origin1.clone(), 1, 3));497 assert_ok!(TemplateModule::add_to_white_list(origin1.clone(), 1, 3));
444 let token_prefix1: Vec<u8> = b"token_prefix1\0".to_vec();541 let token_prefix1: Vec<u8> = b"token_prefix1\0".to_vec();
445 let mode: CollectionMode = CollectionMode::Fungible(3);542 let mode: CollectionMode = CollectionMode::Fungible(3);
446543
544 assert_ok!(TemplateModule::set_chain_limits(RawOrigin::Root.into(), ChainLimits {
545 collection_numbers_limit: 10,
546 account_token_ownership_limit: 10,
547 collections_admins_limit: 5,
548 custom_data_limit: 2048,
549 nft_sponsor_transfer_timeout: 15,
550 fungible_sponsor_transfer_timeout: 15,
551 refungible_sponsor_transfer_timeout: 15,
552 }));
553
447 let origin1 = Origin::signed(1);554 let origin1 = Origin::signed(1);
448 let origin2 = Origin::signed(2);555 let origin2 = Origin::signed(2);
449 assert_ok!(TemplateModule::create_collection(556 assert_ok!(TemplateModule::create_collection(
465 assert_eq!(TemplateModule::balance_count(1, 1), 1000);572 assert_eq!(TemplateModule::balance_count(1, 1), 1000);
466 assert_eq!(TemplateModule::address_tokens(1, 1), [1]);573 assert_eq!(TemplateModule::address_tokens(1, 1), [1]);
467574
468 assert_ok!(TemplateModule::set_mint_permission(origin1.clone(), 1, true));575 assert_ok!(TemplateModule::set_mint_permission(
576 origin1.clone(),
577 1,
578 true
579 ));
469 assert_ok!(TemplateModule::set_public_access_mode(origin1.clone(), 1, AccessMode::WhiteList));580 assert_ok!(TemplateModule::set_public_access_mode(
581 origin1.clone(),
582 1,
583 AccessMode::WhiteList
584 ));
470 assert_ok!(TemplateModule::add_to_white_list(origin1.clone(), 1, 1));585 assert_ok!(TemplateModule::add_to_white_list(origin1.clone(), 1, 1));
471 assert_ok!(TemplateModule::add_to_white_list(origin1.clone(), 1, 2));586 assert_ok!(TemplateModule::add_to_white_list(origin1.clone(), 1, 2));
472 assert_ok!(TemplateModule::add_to_white_list(origin1.clone(), 1, 3));587 assert_ok!(TemplateModule::add_to_white_list(origin1.clone(), 1, 3));
532 let token_prefix1: Vec<u8> = b"token_prefix1\0".to_vec();647 let token_prefix1: Vec<u8> = b"token_prefix1\0".to_vec();
533 let mode: CollectionMode = CollectionMode::NFT(2000);648 let mode: CollectionMode = CollectionMode::NFT(2000);
534649
650 assert_ok!(TemplateModule::set_chain_limits(RawOrigin::Root.into(), ChainLimits {
651 collection_numbers_limit: 10,
652 account_token_ownership_limit: 10,
653 collections_admins_limit: 5,
654 custom_data_limit: 2048,
655 nft_sponsor_transfer_timeout: 15,
656 fungible_sponsor_transfer_timeout: 15,
657 refungible_sponsor_transfer_timeout: 15,
658 }));
659
535 let origin1 = Origin::signed(1);660 let origin1 = Origin::signed(1);
536 assert_ok!(TemplateModule::create_collection(661 assert_ok!(TemplateModule::create_collection(
537 origin1.clone(),662 origin1.clone(),
557 let token_prefix1: Vec<u8> = b"token_prefix1\0".to_vec();682 let token_prefix1: Vec<u8> = b"token_prefix1\0".to_vec();
558 let mode: CollectionMode = CollectionMode::NFT(2000);683 let mode: CollectionMode = CollectionMode::NFT(2000);
559684
685 assert_ok!(TemplateModule::set_chain_limits(RawOrigin::Root.into(), ChainLimits {
686 collection_numbers_limit: 10,
687 account_token_ownership_limit: 10,
688 collections_admins_limit: 5,
689 custom_data_limit: 2048,
690 nft_sponsor_transfer_timeout: 15,
691 fungible_sponsor_transfer_timeout: 15,
692 refungible_sponsor_transfer_timeout: 15,
693 }));
694
560 let origin1 = Origin::signed(1);695 let origin1 = Origin::signed(1);
561 assert_ok!(TemplateModule::create_collection(696 assert_ok!(TemplateModule::create_collection(
562 origin1.clone(),697 origin1.clone(),
577 let token_prefix1: Vec<u8> = b"token_prefix1\0".to_vec();712 let token_prefix1: Vec<u8> = b"token_prefix1\0".to_vec();
578 let mode: CollectionMode = CollectionMode::NFT(2000);713 let mode: CollectionMode = CollectionMode::NFT(2000);
579714
715 assert_ok!(TemplateModule::set_chain_limits(RawOrigin::Root.into(), ChainLimits {
716 collection_numbers_limit: 10,
717 account_token_ownership_limit: 10,
718 collections_admins_limit: 5,
719 custom_data_limit: 2048,
720 nft_sponsor_transfer_timeout: 15,
721 fungible_sponsor_transfer_timeout: 15,
722 refungible_sponsor_transfer_timeout: 15,
723 }));
724
580 let origin1 = Origin::signed(1);725 let origin1 = Origin::signed(1);
581 assert_ok!(TemplateModule::create_collection(726 assert_ok!(TemplateModule::create_collection(
582 origin1.clone(),727 origin1.clone(),
617 let token_prefix1: Vec<u8> = b"token_prefix1\0".to_vec();762 let token_prefix1: Vec<u8> = b"token_prefix1\0".to_vec();
618 let mode: CollectionMode = CollectionMode::Fungible(3);763 let mode: CollectionMode = CollectionMode::Fungible(3);
619764
765 assert_ok!(TemplateModule::set_chain_limits(RawOrigin::Root.into(), ChainLimits {
766 collection_numbers_limit: 10,
767 account_token_ownership_limit: 10,
768 collections_admins_limit: 5,
769 custom_data_limit: 2048,
770 nft_sponsor_transfer_timeout: 15,
771 fungible_sponsor_transfer_timeout: 15,
772 refungible_sponsor_transfer_timeout: 15,
773 }));
774
620 let origin1 = Origin::signed(1);775 let origin1 = Origin::signed(1);
621 assert_ok!(TemplateModule::create_collection(776 assert_ok!(TemplateModule::create_collection(
622 origin1.clone(),777 origin1.clone(),
655 let token_prefix1: Vec<u8> = b"token_prefix1\0".to_vec();810 let token_prefix1: Vec<u8> = b"token_prefix1\0".to_vec();
656 let mode: CollectionMode = CollectionMode::ReFungible(200, 3);811 let mode: CollectionMode = CollectionMode::ReFungible(200, 3);
657812
813 assert_ok!(TemplateModule::set_chain_limits(RawOrigin::Root.into(), ChainLimits {
814 collection_numbers_limit: 10,
815 account_token_ownership_limit: 10,
816 collections_admins_limit: 5,
817 custom_data_limit: 2048,
818 nft_sponsor_transfer_timeout: 15,
819 fungible_sponsor_transfer_timeout: 15,
820 refungible_sponsor_transfer_timeout: 15,
821 }));
822
658 let origin1 = Origin::signed(1);823 let origin1 = Origin::signed(1);
659 let origin2 = Origin::signed(2);824 let origin2 = Origin::signed(2);
660 assert_ok!(TemplateModule::create_collection(825 assert_ok!(TemplateModule::create_collection(
664 token_prefix1.clone(),829 token_prefix1.clone(),
665 mode830 mode
666 ));831 ));
832
667 833 assert_ok!(TemplateModule::set_mint_permission(
668 assert_ok!(TemplateModule::set_mint_permission(origin1.clone(), 1, true));834 origin1.clone(),
835 1,
836 true
837 ));
669 assert_ok!(TemplateModule::set_public_access_mode(origin1.clone(), 1, AccessMode::WhiteList));838 assert_ok!(TemplateModule::set_public_access_mode(
839 origin1.clone(),
840 1,
841 AccessMode::WhiteList
842 ));
670 assert_ok!(TemplateModule::add_to_white_list(origin1.clone(), 1, 1));843 assert_ok!(TemplateModule::add_to_white_list(origin1.clone(), 1, 1));
671844
672 assert_ok!(TemplateModule::add_collection_admin(origin1.clone(), 1, 2));845 assert_ok!(TemplateModule::add_collection_admin(origin1.clone(), 1, 2));
704 let token_prefix1: Vec<u8> = b"token_prefix1\0".to_vec();877 let token_prefix1: Vec<u8> = b"token_prefix1\0".to_vec();
705 let mode: CollectionMode = CollectionMode::NFT(2000);878 let mode: CollectionMode = CollectionMode::NFT(2000);
706879
880 assert_ok!(TemplateModule::set_chain_limits(RawOrigin::Root.into(), ChainLimits {
881 collection_numbers_limit: 10,
882 account_token_ownership_limit: 10,
883 collections_admins_limit: 5,
884 custom_data_limit: 2048,
885 nft_sponsor_transfer_timeout: 15,
886 fungible_sponsor_transfer_timeout: 15,
887 refungible_sponsor_transfer_timeout: 15,
888 }));
889
707 let origin1 = Origin::signed(1);890 let origin1 = Origin::signed(1);
708 let origin2 = Origin::signed(2);891 let origin2 = Origin::signed(2);
709 let origin3 = Origin::signed(3);892 let origin3 = Origin::signed(3);
754 let origin2 = Origin::signed(2);937 let origin2 = Origin::signed(2);
755 let origin3 = Origin::signed(3);938 let origin3 = Origin::signed(3);
756939
940 assert_ok!(TemplateModule::set_chain_limits(RawOrigin::Root.into(), ChainLimits {
941 collection_numbers_limit: 10,
942 account_token_ownership_limit: 10,
943 collections_admins_limit: 5,
944 custom_data_limit: 2048,
945 nft_sponsor_transfer_timeout: 15,
946 fungible_sponsor_transfer_timeout: 15,
947 refungible_sponsor_transfer_timeout: 15,
948 }));
949
757 assert_ok!(TemplateModule::create_collection(950 assert_ok!(TemplateModule::create_collection(
758 origin1.clone(),951 origin1.clone(),
759 col_name1.clone(),952 col_name1.clone(),
8091002
810 let origin1 = Origin::signed(1);1003 let origin1 = Origin::signed(1);
8111004
1005 assert_ok!(TemplateModule::set_chain_limits(RawOrigin::Root.into(), ChainLimits {
1006 collection_numbers_limit: 10,
1007 account_token_ownership_limit: 10,
1008 collections_admins_limit: 5,
1009 custom_data_limit: 2048,
1010 nft_sponsor_transfer_timeout: 15,
1011 fungible_sponsor_transfer_timeout: 15,
1012 refungible_sponsor_transfer_timeout: 15,
1013 }));
1014
812 assert_ok!(TemplateModule::create_collection(1015 assert_ok!(TemplateModule::create_collection(
813 origin1.clone(),1016 origin1.clone(),
814 col_name1.clone(),1017 col_name1.clone(),
881 let nft_mode: CollectionMode = CollectionMode::NFT(2000);1084 let nft_mode: CollectionMode = CollectionMode::NFT(2000);
882 let origin1 = Origin::signed(1);1085 let origin1 = Origin::signed(1);
8831086
1087 assert_ok!(TemplateModule::set_chain_limits(RawOrigin::Root.into(), ChainLimits {
1088 collection_numbers_limit: 10,
1089 account_token_ownership_limit: 10,
1090 collections_admins_limit: 5,
1091 custom_data_limit: 2048,
1092 nft_sponsor_transfer_timeout: 15,
1093 fungible_sponsor_transfer_timeout: 15,
1094 refungible_sponsor_transfer_timeout: 15,
1095 }));
1096
884 assert_ok!(TemplateModule::create_collection(1097 assert_ok!(TemplateModule::create_collection(
885 origin1.clone(),1098 origin1.clone(),
886 col_name1.clone(),1099 col_name1.clone(),
915 let origin1 = Origin::signed(1);1128 let origin1 = Origin::signed(1);
916 let origin2 = Origin::signed(2);1129 let origin2 = Origin::signed(2);
9171130
1131 assert_ok!(TemplateModule::set_chain_limits(RawOrigin::Root.into(), ChainLimits {
1132 collection_numbers_limit: 10,
1133 account_token_ownership_limit: 10,
1134 collections_admins_limit: 5,
1135 custom_data_limit: 2048,
1136 nft_sponsor_transfer_timeout: 15,
1137 fungible_sponsor_transfer_timeout: 15,
1138 refungible_sponsor_transfer_timeout: 15,
1139 }));
1140
918 assert_ok!(TemplateModule::create_collection(1141 assert_ok!(TemplateModule::create_collection(
919 origin1.clone(),1142 origin1.clone(),
920 col_name1.clone(),1143 col_name1.clone(),
937 assert_ok!(TemplateModule::approve(origin1.clone(), 2, 1, 1));1160 assert_ok!(TemplateModule::approve(origin1.clone(), 2, 1, 1));
938 assert_eq!(TemplateModule::approved(1, (1, 1))[0].approved, 2);1161 assert_eq!(TemplateModule::approved(1, (1, 1))[0].approved, 2);
9391162
940 assert_ok!(TemplateModule::set_mint_permission(origin1.clone(), 1, true));1163 assert_ok!(TemplateModule::set_mint_permission(
1164 origin1.clone(),
1165 1,
1166 true
1167 ));
941 assert_ok!(TemplateModule::set_public_access_mode(origin1.clone(), 1, AccessMode::WhiteList));1168 assert_ok!(TemplateModule::set_public_access_mode(
1169 origin1.clone(),
1170 1,
1171 AccessMode::WhiteList
1172 ));
942 assert_ok!(TemplateModule::add_to_white_list(origin1.clone(), 1, 1));1173 assert_ok!(TemplateModule::add_to_white_list(origin1.clone(), 1, 1));
943 assert_ok!(TemplateModule::add_to_white_list(origin1.clone(), 1, 2));1174 assert_ok!(TemplateModule::add_to_white_list(origin1.clone(), 1, 2));
944 assert_ok!(TemplateModule::add_to_white_list(origin1.clone(), 1, 3));1175 assert_ok!(TemplateModule::add_to_white_list(origin1.clone(), 1, 3));
972 let mode: CollectionMode = CollectionMode::NFT(2000);1203 let mode: CollectionMode = CollectionMode::NFT(2000);
973 let origin1 = Origin::signed(1);1204 let origin1 = Origin::signed(1);
9741205
1206 assert_ok!(TemplateModule::set_chain_limits(RawOrigin::Root.into(), ChainLimits {
1207 collection_numbers_limit: 10,
1208 account_token_ownership_limit: 10,
1209 collections_admins_limit: 5,
1210 custom_data_limit: 2048,
1211 nft_sponsor_transfer_timeout: 15,
1212 fungible_sponsor_transfer_timeout: 15,
1213 refungible_sponsor_transfer_timeout: 15,
1214 }));
1215
975 assert_ok!(TemplateModule::create_collection(1216 assert_ok!(TemplateModule::create_collection(
976 origin1.clone(),1217 origin1.clone(),
977 col_name1.clone(),1218 col_name1.clone(),
995 let origin1 = Origin::signed(1);1236 let origin1 = Origin::signed(1);
996 let origin2 = Origin::signed(2);1237 let origin2 = Origin::signed(2);
9971238
1239 assert_ok!(TemplateModule::set_chain_limits(RawOrigin::Root.into(), ChainLimits {
1240 collection_numbers_limit: 10,
1241 account_token_ownership_limit: 10,
1242 collections_admins_limit: 5,
1243 custom_data_limit: 2048,
1244 nft_sponsor_transfer_timeout: 15,
1245 fungible_sponsor_transfer_timeout: 15,
1246 refungible_sponsor_transfer_timeout: 15,
1247 }));
1248
998 assert_ok!(TemplateModule::create_collection(1249 assert_ok!(TemplateModule::create_collection(
999 origin1.clone(),1250 origin1.clone(),
1000 col_name1.clone(),1251 col_name1.clone(),
1019 let origin1 = Origin::signed(1);1270 let origin1 = Origin::signed(1);
1020 let origin2 = Origin::signed(2);1271 let origin2 = Origin::signed(2);
10211272
1273 assert_ok!(TemplateModule::set_chain_limits(RawOrigin::Root.into(), ChainLimits {
1274 collection_numbers_limit: 10,
1275 account_token_ownership_limit: 10,
1276 collections_admins_limit: 5,
1277 custom_data_limit: 2048,
1278 nft_sponsor_transfer_timeout: 15,
1279 fungible_sponsor_transfer_timeout: 15,
1280 refungible_sponsor_transfer_timeout: 15,
1281 }));
1282
1022 assert_ok!(TemplateModule::create_collection(1283 assert_ok!(TemplateModule::create_collection(
1023 origin1.clone(),1284 origin1.clone(),
1024 col_name1.clone(),1285 col_name1.clone(),
1027 mode1288 mode
1028 ));1289 ));
10291290
1030 assert_noop!(TemplateModule::add_to_white_list(origin2.clone(), 1, 3), "You do not have permissions to modify this collection");1291 assert_noop!(
1292 TemplateModule::add_to_white_list(origin2.clone(), 1, 3),
1293 "You do not have permissions to modify this collection"
1294 );
1031 });1295 });
1032}1296}
10331297
1034#[test]1298#[test]
1035fn nobody_can_add_address_to_white_list_of_nonexisting_collection() {1299fn nobody_can_add_address_to_white_list_of_nonexisting_collection() {
1036 new_test_ext().execute_with(|| {1300 new_test_ext().execute_with(|| {
1301 let origin1 = Origin::signed(1);
10371302
1038 let origin1 = Origin::signed(1);1303 assert_ok!(TemplateModule::set_chain_limits(RawOrigin::Root.into(), ChainLimits {
1304 collection_numbers_limit: 10,
1305 account_token_ownership_limit: 10,
1306 collections_admins_limit: 5,
1307 custom_data_limit: 2048,
1308 nft_sponsor_transfer_timeout: 15,
1309 fungible_sponsor_transfer_timeout: 15,
1310 refungible_sponsor_transfer_timeout: 15,
1311 }));
1312
1039 assert_noop!(TemplateModule::add_to_white_list(origin1.clone(), 1, 2), "This collection does not exist");1313 assert_noop!(
1314 TemplateModule::add_to_white_list(origin1.clone(), 1, 2),
1315 "This collection does not exist"
1316 );
1040 });1317 });
1041}1318}
10421319
1049 let mode: CollectionMode = CollectionMode::NFT(2000);1326 let mode: CollectionMode = CollectionMode::NFT(2000);
1050 let origin1 = Origin::signed(1);1327 let origin1 = Origin::signed(1);
10511328
1329 assert_ok!(TemplateModule::set_chain_limits(RawOrigin::Root.into(), ChainLimits {
1330 collection_numbers_limit: 10,
1331 account_token_ownership_limit: 10,
1332 collections_admins_limit: 5,
1333 custom_data_limit: 2048,
1334 nft_sponsor_transfer_timeout: 15,
1335 fungible_sponsor_transfer_timeout: 15,
1336 refungible_sponsor_transfer_timeout: 15,
1337 }));
1338
1052 assert_ok!(TemplateModule::create_collection(1339 assert_ok!(TemplateModule::create_collection(
1053 origin1.clone(),1340 origin1.clone(),
1054 col_name1.clone(),1341 col_name1.clone(),
1058 ));1345 ));
10591346
1060 assert_ok!(TemplateModule::destroy_collection(origin1.clone(), 1));1347 assert_ok!(TemplateModule::destroy_collection(origin1.clone(), 1));
1061 assert_noop!(TemplateModule::add_to_white_list(origin1.clone(), 1, 2), "This collection does not exist");1348 assert_noop!(
1349 TemplateModule::add_to_white_list(origin1.clone(), 1, 2),
1350 "This collection does not exist"
1351 );
1062 });1352 });
1063}1353}
10641354
1065// If address is already added to white list, nothing happens1355// If address is already added to white list, nothing happens
1066#[test]1356#[test]
1067fn address_is_already_added_to_white_list() {1357fn address_is_already_added_to_white_list() {
1068 new_test_ext().execute_with(|| {1358 new_test_ext().execute_with(|| {
1069
1070 let col_name1: Vec<u16> = "Test1\0".encode_utf16().collect::<Vec<u16>>();1359 let col_name1: Vec<u16> = "Test1\0".encode_utf16().collect::<Vec<u16>>();
1071 let col_desc1: Vec<u16> = "TestDescription1\0".encode_utf16().collect::<Vec<u16>>();1360 let col_desc1: Vec<u16> = "TestDescription1\0".encode_utf16().collect::<Vec<u16>>();
1072 let token_prefix1: Vec<u8> = b"token_prefix1\0".to_vec();1361 let token_prefix1: Vec<u8> = b"token_prefix1\0".to_vec();
1073 let mode: CollectionMode = CollectionMode::NFT(2000);1362 let mode: CollectionMode = CollectionMode::NFT(2000);
1074 let origin1 = Origin::signed(1);1363 let origin1 = Origin::signed(1);
10751364
1365 assert_ok!(TemplateModule::set_chain_limits(RawOrigin::Root.into(), ChainLimits {
1366 collection_numbers_limit: 10,
1367 account_token_ownership_limit: 10,
1368 collections_admins_limit: 5,
1369 custom_data_limit: 2048,
1370 nft_sponsor_transfer_timeout: 15,
1371 fungible_sponsor_transfer_timeout: 15,
1372 refungible_sponsor_transfer_timeout: 15,
1373 }));
1374
1076 assert_ok!(TemplateModule::create_collection(1375 assert_ok!(TemplateModule::create_collection(
1077 origin1.clone(),1376 origin1.clone(),
1078 col_name1.clone(),1377 col_name1.clone(),
1091#[test]1390#[test]
1092fn owner_can_remove_address_from_white_list() {1391fn owner_can_remove_address_from_white_list() {
1093 new_test_ext().execute_with(|| {1392 new_test_ext().execute_with(|| {
1094
1095 let col_name1: Vec<u16> = "Test1\0".encode_utf16().collect::<Vec<u16>>();1393 let col_name1: Vec<u16> = "Test1\0".encode_utf16().collect::<Vec<u16>>();
1096 let col_desc1: Vec<u16> = "TestDescription1\0".encode_utf16().collect::<Vec<u16>>();1394 let col_desc1: Vec<u16> = "TestDescription1\0".encode_utf16().collect::<Vec<u16>>();
1097 let token_prefix1: Vec<u8> = b"token_prefix1\0".to_vec();1395 let token_prefix1: Vec<u8> = b"token_prefix1\0".to_vec();
1098 let mode: CollectionMode = CollectionMode::NFT(2000);1396 let mode: CollectionMode = CollectionMode::NFT(2000);
1099 let origin1 = Origin::signed(1);1397 let origin1 = Origin::signed(1);
11001398
1399 assert_ok!(TemplateModule::set_chain_limits(RawOrigin::Root.into(), ChainLimits {
1400 collection_numbers_limit: 10,
1401 account_token_ownership_limit: 10,
1402 collections_admins_limit: 5,
1403 custom_data_limit: 2048,
1404 nft_sponsor_transfer_timeout: 15,
1405 fungible_sponsor_transfer_timeout: 15,
1406 refungible_sponsor_transfer_timeout: 15,
1407 }));
1408
1101 assert_ok!(TemplateModule::create_collection(1409 assert_ok!(TemplateModule::create_collection(
1102 origin1.clone(),1410 origin1.clone(),
1103 col_name1.clone(),1411 col_name1.clone(),
1107 ));1415 ));
11081416
1109 assert_ok!(TemplateModule::add_to_white_list(origin1.clone(), 1, 2));1417 assert_ok!(TemplateModule::add_to_white_list(origin1.clone(), 1, 2));
1110 assert_ok!(TemplateModule::remove_from_white_list(origin1.clone(), 1, 2));1418 assert_ok!(TemplateModule::remove_from_white_list(
1419 origin1.clone(),
1420 1,
1421 2
1422 ));
1111 assert_eq!(TemplateModule::white_list(1).len(), 0);1423 assert_eq!(TemplateModule::white_list(1).len(), 0);
1112 });1424 });
1113}1425}
11141426
1115#[test]1427#[test]
1116fn admin_can_remove_address_from_white_list() {1428fn admin_can_remove_address_from_white_list() {
1117 new_test_ext().execute_with(|| {1429 new_test_ext().execute_with(|| {
1118
1119 let col_name1: Vec<u16> = "Test1\0".encode_utf16().collect::<Vec<u16>>();1430 let col_name1: Vec<u16> = "Test1\0".encode_utf16().collect::<Vec<u16>>();
1120 let col_desc1: Vec<u16> = "TestDescription1\0".encode_utf16().collect::<Vec<u16>>();1431 let col_desc1: Vec<u16> = "TestDescription1\0".encode_utf16().collect::<Vec<u16>>();
1121 let token_prefix1: Vec<u8> = b"token_prefix1\0".to_vec();1432 let token_prefix1: Vec<u8> = b"token_prefix1\0".to_vec();
1122 let mode: CollectionMode = CollectionMode::NFT(2000);1433 let mode: CollectionMode = CollectionMode::NFT(2000);
1123 let origin1 = Origin::signed(1);1434 let origin1 = Origin::signed(1);
1124 let origin2 = Origin::signed(2);1435 let origin2 = Origin::signed(2);
11251436
1437 assert_ok!(TemplateModule::set_chain_limits(RawOrigin::Root.into(), ChainLimits {
1438 collection_numbers_limit: 10,
1439 account_token_ownership_limit: 10,
1440 collections_admins_limit: 5,
1441 custom_data_limit: 2048,
1442 nft_sponsor_transfer_timeout: 15,
1443 fungible_sponsor_transfer_timeout: 15,
1444 refungible_sponsor_transfer_timeout: 15,
1445 }));
1446
1126 assert_ok!(TemplateModule::create_collection(1447 assert_ok!(TemplateModule::create_collection(
1127 origin1.clone(),1448 origin1.clone(),
1128 col_name1.clone(),1449 col_name1.clone(),
1134 assert_ok!(TemplateModule::add_collection_admin(origin1.clone(), 1, 2));1455 assert_ok!(TemplateModule::add_collection_admin(origin1.clone(), 1, 2));
11351456
1136 assert_ok!(TemplateModule::add_to_white_list(origin1.clone(), 1, 3));1457 assert_ok!(TemplateModule::add_to_white_list(origin1.clone(), 1, 3));
1137 assert_ok!(TemplateModule::remove_from_white_list(origin2.clone(), 1, 3));1458 assert_ok!(TemplateModule::remove_from_white_list(
1459 origin2.clone(),
1460 1,
1461 3
1462 ));
1138 assert_eq!(TemplateModule::white_list(1).len(), 0);1463 assert_eq!(TemplateModule::white_list(1).len(), 0);
1139 });1464 });
1140}1465}
11411466
1142#[test]1467#[test]
1143fn nonprivileged_user_cannot_remove_address_from_white_list() {1468fn nonprivileged_user_cannot_remove_address_from_white_list() {
1144 new_test_ext().execute_with(|| {1469 new_test_ext().execute_with(|| {
1145
1146 let col_name1: Vec<u16> = "Test1\0".encode_utf16().collect::<Vec<u16>>();1470 let col_name1: Vec<u16> = "Test1\0".encode_utf16().collect::<Vec<u16>>();
1147 let col_desc1: Vec<u16> = "TestDescription1\0".encode_utf16().collect::<Vec<u16>>();1471 let col_desc1: Vec<u16> = "TestDescription1\0".encode_utf16().collect::<Vec<u16>>();
1148 let token_prefix1: Vec<u8> = b"token_prefix1\0".to_vec();1472 let token_prefix1: Vec<u8> = b"token_prefix1\0".to_vec();
1149 let mode: CollectionMode = CollectionMode::NFT(2000);1473 let mode: CollectionMode = CollectionMode::NFT(2000);
1150 let origin1 = Origin::signed(1);1474 let origin1 = Origin::signed(1);
1151 let origin2 = Origin::signed(2);1475 let origin2 = Origin::signed(2);
11521476
1477 assert_ok!(TemplateModule::set_chain_limits(RawOrigin::Root.into(), ChainLimits {
1478 collection_numbers_limit: 10,
1479 account_token_ownership_limit: 10,
1480 collections_admins_limit: 5,
1481 custom_data_limit: 2048,
1482 nft_sponsor_transfer_timeout: 15,
1483 fungible_sponsor_transfer_timeout: 15,
1484 refungible_sponsor_transfer_timeout: 15,
1485 }));
1486
1153 assert_ok!(TemplateModule::create_collection(1487 assert_ok!(TemplateModule::create_collection(
1154 origin1.clone(),1488 origin1.clone(),
1155 col_name1.clone(),1489 col_name1.clone(),
1159 ));1493 ));
11601494
1161 assert_ok!(TemplateModule::add_to_white_list(origin1.clone(), 1, 2));1495 assert_ok!(TemplateModule::add_to_white_list(origin1.clone(), 1, 2));
1162 assert_noop!(TemplateModule::remove_from_white_list(origin2.clone(), 1, 2), "You do not have permissions to modify this collection");1496 assert_noop!(
1497 TemplateModule::remove_from_white_list(origin2.clone(), 1, 2),
1498 "You do not have permissions to modify this collection"
1499 );
1163 assert_eq!(TemplateModule::white_list(1)[0], 2);1500 assert_eq!(TemplateModule::white_list(1)[0], 2);
1164 });1501 });
1165}1502}
11661503
1167#[test]1504#[test]
1168fn nobody_can_remove_address_from_white_list_of_nonexisting_collection() {1505fn nobody_can_remove_address_from_white_list_of_nonexisting_collection() {
1169 new_test_ext().execute_with(|| {1506 new_test_ext().execute_with(|| {
1507 let origin1 = Origin::signed(1);
11701508
1171 let origin1 = Origin::signed(1);1509 assert_ok!(TemplateModule::set_chain_limits(RawOrigin::Root.into(), ChainLimits {
1510 collection_numbers_limit: 10,
1511 account_token_ownership_limit: 10,
1512 collections_admins_limit: 5,
1513 custom_data_limit: 2048,
1514 nft_sponsor_transfer_timeout: 15,
1515 fungible_sponsor_transfer_timeout: 15,
1516 refungible_sponsor_transfer_timeout: 15,
1517 }));
1518
1172 assert_noop!(TemplateModule::remove_from_white_list(origin1.clone(), 1, 2), "This collection does not exist");1519 assert_noop!(
1520 TemplateModule::remove_from_white_list(origin1.clone(), 1, 2),
1521 "This collection does not exist"
1522 );
1173 });1523 });
1174}1524}
11751525
1176#[test]1526#[test]
1177fn nobody_can_remove_address_from_white_list_of_deleted_collection() {1527fn nobody_can_remove_address_from_white_list_of_deleted_collection() {
1178 new_test_ext().execute_with(|| {1528 new_test_ext().execute_with(|| {
1179
1180 let col_name1: Vec<u16> = "Test1\0".encode_utf16().collect::<Vec<u16>>();1529 let col_name1: Vec<u16> = "Test1\0".encode_utf16().collect::<Vec<u16>>();
1181 let col_desc1: Vec<u16> = "TestDescription1\0".encode_utf16().collect::<Vec<u16>>();1530 let col_desc1: Vec<u16> = "TestDescription1\0".encode_utf16().collect::<Vec<u16>>();
1182 let token_prefix1: Vec<u8> = b"token_prefix1\0".to_vec();1531 let token_prefix1: Vec<u8> = b"token_prefix1\0".to_vec();
1183 let mode: CollectionMode = CollectionMode::NFT(2000);1532 let mode: CollectionMode = CollectionMode::NFT(2000);
1184 let origin1 = Origin::signed(1);1533 let origin1 = Origin::signed(1);
1185 let origin2 = Origin::signed(2);1534 let origin2 = Origin::signed(2);
11861535
1536 assert_ok!(TemplateModule::set_chain_limits(RawOrigin::Root.into(), ChainLimits {
1537 collection_numbers_limit: 10,
1538 account_token_ownership_limit: 10,
1539 collections_admins_limit: 5,
1540 custom_data_limit: 2048,
1541 nft_sponsor_transfer_timeout: 15,
1542 fungible_sponsor_transfer_timeout: 15,
1543 refungible_sponsor_transfer_timeout: 15,
1544 }));
1545
1187 assert_ok!(TemplateModule::create_collection(1546 assert_ok!(TemplateModule::create_collection(
1188 origin1.clone(),1547 origin1.clone(),
1189 col_name1.clone(),1548 col_name1.clone(),
11941553
1195 assert_ok!(TemplateModule::add_to_white_list(origin1.clone(), 1, 2));1554 assert_ok!(TemplateModule::add_to_white_list(origin1.clone(), 1, 2));
1196 assert_ok!(TemplateModule::destroy_collection(origin1.clone(), 1));1555 assert_ok!(TemplateModule::destroy_collection(origin1.clone(), 1));
1197 assert_noop!(TemplateModule::remove_from_white_list(origin2.clone(), 1, 2), "This collection does not exist");1556 assert_noop!(
1557 TemplateModule::remove_from_white_list(origin2.clone(), 1, 2),
1558 "This collection does not exist"
1559 );
1198 assert_eq!(TemplateModule::white_list(1).len(), 0);1560 assert_eq!(TemplateModule::white_list(1).len(), 0);
1199 });1561 });
1200}1562}
1209 let mode: CollectionMode = CollectionMode::NFT(2000);1571 let mode: CollectionMode = CollectionMode::NFT(2000);
1210 let origin1 = Origin::signed(1);1572 let origin1 = Origin::signed(1);
12111573
1574 assert_ok!(TemplateModule::set_chain_limits(RawOrigin::Root.into(), ChainLimits {
1575 collection_numbers_limit: 10,
1576 account_token_ownership_limit: 10,
1577 collections_admins_limit: 5,
1578 custom_data_limit: 2048,
1579 nft_sponsor_transfer_timeout: 15,
1580 fungible_sponsor_transfer_timeout: 15,
1581 refungible_sponsor_transfer_timeout: 15,
1582 }));
1583
1212 assert_ok!(TemplateModule::create_collection(1584 assert_ok!(TemplateModule::create_collection(
1213 origin1.clone(),1585 origin1.clone(),
1214 col_name1.clone(),1586 col_name1.clone(),
1218 ));1590 ));
12191591
1220 assert_ok!(TemplateModule::add_to_white_list(origin1.clone(), 1, 2));1592 assert_ok!(TemplateModule::add_to_white_list(origin1.clone(), 1, 2));
1221 assert_ok!(TemplateModule::remove_from_white_list(origin1.clone(), 1, 2));1593 assert_ok!(TemplateModule::remove_from_white_list(
1594 origin1.clone(),
1595 1,
1596 2
1597 ));
1222 assert_ok!(TemplateModule::remove_from_white_list(origin1.clone(), 1, 2));1598 assert_ok!(TemplateModule::remove_from_white_list(
1599 origin1.clone(),
1600 1,
1601 2
1602 ));
1223 assert_eq!(TemplateModule::white_list(1).len(), 0);1603 assert_eq!(TemplateModule::white_list(1).len(), 0);
1224 });1604 });
1225}1605}
1233 let token_prefix1: Vec<u8> = b"token_prefix1\0".to_vec();1613 let token_prefix1: Vec<u8> = b"token_prefix1\0".to_vec();
1234 let mode: CollectionMode = CollectionMode::NFT(2000);1614 let mode: CollectionMode = CollectionMode::NFT(2000);
12351615
1616 assert_ok!(TemplateModule::set_chain_limits(RawOrigin::Root.into(), ChainLimits {
1617 collection_numbers_limit: 10,
1618 account_token_ownership_limit: 10,
1619 collections_admins_limit: 5,
1620 custom_data_limit: 2048,
1621 nft_sponsor_transfer_timeout: 15,
1622 fungible_sponsor_transfer_timeout: 15,
1623 refungible_sponsor_transfer_timeout: 15,
1624 }));
1625
1236 let origin1 = Origin::signed(1);1626 let origin1 = Origin::signed(1);
1237 assert_ok!(TemplateModule::create_collection(1627 assert_ok!(TemplateModule::create_collection(
1238 origin1.clone(),1628 origin1.clone(),
1250 11640 1
1251 ));1641 ));
12521642
1253 assert_ok!(TemplateModule::set_public_access_mode(origin1.clone(), 1, AccessMode::WhiteList));1643 assert_ok!(TemplateModule::set_public_access_mode(
1644 origin1.clone(),
1645 1,
1646 AccessMode::WhiteList
1647 ));
1254 assert_ok!(TemplateModule::add_to_white_list(origin1.clone(), 1, 2));1648 assert_ok!(TemplateModule::add_to_white_list(origin1.clone(), 1, 2));
12551649
1256 assert_noop!(TemplateModule::transfer(1650 assert_noop!(
1257 origin1.clone(),1651 TemplateModule::transfer(origin1.clone(), 3, 1, 1, 1),
1258 3,
1259 1,
1260 1,
1261 11652 "Address is not in white list"
1262 ), "Address is not in white list");1653 );
1263 });1654 });
1264}1655}
12651656
1271 let token_prefix1: Vec<u8> = b"token_prefix1\0".to_vec();1662 let token_prefix1: Vec<u8> = b"token_prefix1\0".to_vec();
1272 let mode: CollectionMode = CollectionMode::NFT(2000);1663 let mode: CollectionMode = CollectionMode::NFT(2000);
12731664
1665 assert_ok!(TemplateModule::set_chain_limits(RawOrigin::Root.into(), ChainLimits {
1666 collection_numbers_limit: 10,
1667 account_token_ownership_limit: 10,
1668 collections_admins_limit: 5,
1669 custom_data_limit: 2048,
1670 nft_sponsor_transfer_timeout: 15,
1671 fungible_sponsor_transfer_timeout: 15,
1672 refungible_sponsor_transfer_timeout: 15,
1673 }));
1674
1274 let origin1 = Origin::signed(1);1675 let origin1 = Origin::signed(1);
1275 assert_ok!(TemplateModule::create_collection(1676 assert_ok!(TemplateModule::create_collection(
1276 origin1.clone(),1677 origin1.clone(),
1288 11689 1
1289 ));1690 ));
12901691
1291 assert_ok!(TemplateModule::set_public_access_mode(origin1.clone(), 1, AccessMode::WhiteList));1692 assert_ok!(TemplateModule::set_public_access_mode(
1693 origin1.clone(),
1694 1,
1695 AccessMode::WhiteList
1696 ));
1292 assert_ok!(TemplateModule::add_to_white_list(origin1.clone(), 1, 1));1697 assert_ok!(TemplateModule::add_to_white_list(origin1.clone(), 1, 1));
1293 assert_ok!(TemplateModule::add_to_white_list(origin1.clone(), 1, 2));1698 assert_ok!(TemplateModule::add_to_white_list(origin1.clone(), 1, 2));
12941699
1295 // do approve1700 // do approve
1296 assert_ok!(TemplateModule::approve(origin1.clone(), 1, 1, 1));1701 assert_ok!(TemplateModule::approve(origin1.clone(), 1, 1, 1));
1297 assert_eq!(TemplateModule::approved(1, (1, 1)).len(), 1);1702 assert_eq!(TemplateModule::approved(1, (1, 1)).len(), 1);
12981703
1299 assert_ok!(TemplateModule::remove_from_white_list(origin1.clone(), 1, 1));1704 assert_ok!(TemplateModule::remove_from_white_list(
1300
1301 assert_noop!(TemplateModule::transfer_from(
1302 origin1.clone(),1705 origin1.clone(),
1303 1,1706 1,
1304 3,
1305 1,
1306 1,
1307 11707 1
1308 ), "Address is not in white list");1708 ));
1709
1710 assert_noop!(
1711 TemplateModule::transfer_from(origin1.clone(), 1, 3, 1, 1, 1),
1712 "Address is not in white list"
1713 );
1309 });1714 });
1310}1715}
13111716
1318 let token_prefix1: Vec<u8> = b"token_prefix1\0".to_vec();1723 let token_prefix1: Vec<u8> = b"token_prefix1\0".to_vec();
1319 let mode: CollectionMode = CollectionMode::NFT(2000);1724 let mode: CollectionMode = CollectionMode::NFT(2000);
13201725
1726 assert_ok!(TemplateModule::set_chain_limits(RawOrigin::Root.into(), ChainLimits {
1727 collection_numbers_limit: 10,
1728 account_token_ownership_limit: 10,
1729 collections_admins_limit: 5,
1730 custom_data_limit: 2048,
1731 nft_sponsor_transfer_timeout: 15,
1732 fungible_sponsor_transfer_timeout: 15,
1733 refungible_sponsor_transfer_timeout: 15,
1734 }));
1735
1321 let origin1 = Origin::signed(1);1736 let origin1 = Origin::signed(1);
1322 assert_ok!(TemplateModule::create_collection(1737 assert_ok!(TemplateModule::create_collection(
1323 origin1.clone(),1738 origin1.clone(),
1335 11750 1
1336 ));1751 ));
13371752
1338 assert_ok!(TemplateModule::set_public_access_mode(origin1.clone(), 1, AccessMode::WhiteList));1753 assert_ok!(TemplateModule::set_public_access_mode(
1754 origin1.clone(),
1755 1,
1756 AccessMode::WhiteList
1757 ));
1339 assert_ok!(TemplateModule::add_to_white_list(origin1.clone(), 1, 1));1758 assert_ok!(TemplateModule::add_to_white_list(origin1.clone(), 1, 1));
13401759
1341 assert_noop!(TemplateModule::transfer(1760 assert_noop!(
1342 origin1.clone(),1761 TemplateModule::transfer(origin1.clone(), 3, 1, 1, 1),
1343 3,
1344 1,
1345 1,
1346 11762 "Address is not in white list"
1347 ), "Address is not in white list");1763 );
1348 });1764 });
1349}1765}
13501766
1356 let token_prefix1: Vec<u8> = b"token_prefix1\0".to_vec();1772 let token_prefix1: Vec<u8> = b"token_prefix1\0".to_vec();
1357 let mode: CollectionMode = CollectionMode::NFT(2000);1773 let mode: CollectionMode = CollectionMode::NFT(2000);
13581774
1775 assert_ok!(TemplateModule::set_chain_limits(RawOrigin::Root.into(), ChainLimits {
1776 collection_numbers_limit: 10,
1777 account_token_ownership_limit: 10,
1778 collections_admins_limit: 5,
1779 custom_data_limit: 2048,
1780 nft_sponsor_transfer_timeout: 15,
1781 fungible_sponsor_transfer_timeout: 15,
1782 refungible_sponsor_transfer_timeout: 15,
1783 }));
1784
1359 let origin1 = Origin::signed(1);1785 let origin1 = Origin::signed(1);
1360 assert_ok!(TemplateModule::create_collection(1786 assert_ok!(TemplateModule::create_collection(
1361 origin1.clone(),1787 origin1.clone(),
1373 11799 1
1374 ));1800 ));
13751801
1376 assert_ok!(TemplateModule::set_public_access_mode(origin1.clone(), 1, AccessMode::WhiteList));1802 assert_ok!(TemplateModule::set_public_access_mode(
1803 origin1.clone(),
1804 1,
1805 AccessMode::WhiteList
1806 ));
1377 assert_ok!(TemplateModule::add_to_white_list(origin1.clone(), 1, 1));1807 assert_ok!(TemplateModule::add_to_white_list(origin1.clone(), 1, 1));
1378 assert_ok!(TemplateModule::add_to_white_list(origin1.clone(), 1, 2));1808 assert_ok!(TemplateModule::add_to_white_list(origin1.clone(), 1, 2));
13791809
1380 // do approve1810 // do approve
1381 assert_ok!(TemplateModule::approve(origin1.clone(), 1, 1, 1));1811 assert_ok!(TemplateModule::approve(origin1.clone(), 1, 1, 1));
1382 assert_eq!(TemplateModule::approved(1, (1, 1)).len(), 1);1812 assert_eq!(TemplateModule::approved(1, (1, 1)).len(), 1);
13831813
1384 assert_ok!(TemplateModule::remove_from_white_list(origin1.clone(), 1, 2));1814 assert_ok!(TemplateModule::remove_from_white_list(
1385
1386 assert_noop!(TemplateModule::transfer_from(
1387 origin1.clone(),1815 origin1.clone(),
1388 1,1816 1,
1389 3,1817 2
1390 1,1818 ));
1819
1391 1,1820 assert_noop!(
1392 11821 TemplateModule::transfer_from(origin1.clone(), 1, 3, 1, 1, 1),
1393 ), "Address is not in white list");1822 "Address is not in white list"
1823 );
1394 });1824 });
1395}1825}
13961826
1403 let token_prefix1: Vec<u8> = b"token_prefix1\0".to_vec();1833 let token_prefix1: Vec<u8> = b"token_prefix1\0".to_vec();
1404 let mode: CollectionMode = CollectionMode::NFT(2000);1834 let mode: CollectionMode = CollectionMode::NFT(2000);
14051835
1836 assert_ok!(TemplateModule::set_chain_limits(RawOrigin::Root.into(), ChainLimits {
1837 collection_numbers_limit: 10,
1838 account_token_ownership_limit: 10,
1839 collections_admins_limit: 5,
1840 custom_data_limit: 2048,
1841 nft_sponsor_transfer_timeout: 15,
1842 fungible_sponsor_transfer_timeout: 15,
1843 refungible_sponsor_transfer_timeout: 15,
1844 }));
1845
1406 let origin1 = Origin::signed(1);1846 let origin1 = Origin::signed(1);
1407 assert_ok!(TemplateModule::create_collection(1847 assert_ok!(TemplateModule::create_collection(
1408 origin1.clone(),1848 origin1.clone(),
1420 11860 1
1421 ));1861 ));
14221862
1423 assert_ok!(TemplateModule::set_public_access_mode(origin1.clone(), 1, AccessMode::WhiteList));1863 assert_ok!(TemplateModule::set_public_access_mode(
1864 origin1.clone(),
1865 1,
1866 AccessMode::WhiteList
1867 ));
1424 assert_noop!(TemplateModule::burn_item(origin1.clone(), 1, 1), "Address is not in white list");1868 assert_noop!(
1869 TemplateModule::burn_item(origin1.clone(), 1, 1),
1870 "Address is not in white list"
1871 );
1425 });1872 });
1426}1873}
14271874
1434 let token_prefix1: Vec<u8> = b"token_prefix1\0".to_vec();1881 let token_prefix1: Vec<u8> = b"token_prefix1\0".to_vec();
1435 let mode: CollectionMode = CollectionMode::NFT(2000);1882 let mode: CollectionMode = CollectionMode::NFT(2000);
14361883
1884 assert_ok!(TemplateModule::set_chain_limits(RawOrigin::Root.into(), ChainLimits {
1885 collection_numbers_limit: 10,
1886 account_token_ownership_limit: 10,
1887 collections_admins_limit: 5,
1888 custom_data_limit: 2048,
1889 nft_sponsor_transfer_timeout: 15,
1890 fungible_sponsor_transfer_timeout: 15,
1891 refungible_sponsor_transfer_timeout: 15,
1892 }));
1893
1437 let origin1 = Origin::signed(1);1894 let origin1 = Origin::signed(1);
1438 assert_ok!(TemplateModule::create_collection(1895 assert_ok!(TemplateModule::create_collection(
1439 origin1.clone(),1896 origin1.clone(),
1442 token_prefix1.clone(),1899 token_prefix1.clone(),
1443 mode1900 mode
1444 ));1901 ));
1445 assert_ok!(TemplateModule::set_public_access_mode(origin1.clone(), 1, AccessMode::WhiteList));1902 assert_ok!(TemplateModule::set_public_access_mode(
1903 origin1.clone(),
1904 1,
1905 AccessMode::WhiteList
1906 ));
14461907
1447 // do approve1908 // do approve
1448 assert_noop!(TemplateModule::approve(origin1.clone(), 1, 1, 1), "Address is not in white list");1909 assert_noop!(
1910 TemplateModule::approve(origin1.clone(), 1, 1, 1),
1911 "Address is not in white list"
1912 );
1449 });1913 });
1450}1914}
14511915
1459 let token_prefix1: Vec<u8> = b"token_prefix1\0".to_vec();1923 let token_prefix1: Vec<u8> = b"token_prefix1\0".to_vec();
1460 let mode: CollectionMode = CollectionMode::NFT(2000);1924 let mode: CollectionMode = CollectionMode::NFT(2000);
14611925
1926 assert_ok!(TemplateModule::set_chain_limits(RawOrigin::Root.into(), ChainLimits {
1927 collection_numbers_limit: 10,
1928 account_token_ownership_limit: 10,
1929 collections_admins_limit: 5,
1930 custom_data_limit: 2048,
1931 nft_sponsor_transfer_timeout: 15,
1932 fungible_sponsor_transfer_timeout: 15,
1933 refungible_sponsor_transfer_timeout: 15,
1934 }));
1935
1462 let origin1 = Origin::signed(1);1936 let origin1 = Origin::signed(1);
1463 assert_ok!(TemplateModule::create_collection(1937 assert_ok!(TemplateModule::create_collection(
1464 origin1.clone(),1938 origin1.clone(),
1476 11950 1
1477 ));1951 ));
14781952
1479 assert_ok!(TemplateModule::set_public_access_mode(origin1.clone(), 1, AccessMode::WhiteList));1953 assert_ok!(TemplateModule::set_public_access_mode(
1954 origin1.clone(),
1955 1,
1956 AccessMode::WhiteList
1957 ));
1480 assert_ok!(TemplateModule::add_to_white_list(origin1.clone(), 1, 1));1958 assert_ok!(TemplateModule::add_to_white_list(origin1.clone(), 1, 1));
1481 assert_ok!(TemplateModule::add_to_white_list(origin1.clone(), 1, 2));1959 assert_ok!(TemplateModule::add_to_white_list(origin1.clone(), 1, 2));
14821960
1483 assert_ok!(TemplateModule::transfer(1961 assert_ok!(TemplateModule::transfer(origin1.clone(), 2, 1, 1, 1));
1484 origin1.clone(),
1485 2,
1486 1,
1487 1,
1488 1
1489 ));
1490 });1962 });
1491}1963}
14921964
1498 let token_prefix1: Vec<u8> = b"token_prefix1\0".to_vec();1970 let token_prefix1: Vec<u8> = b"token_prefix1\0".to_vec();
1499 let mode: CollectionMode = CollectionMode::NFT(2000);1971 let mode: CollectionMode = CollectionMode::NFT(2000);
15001972
1973 assert_ok!(TemplateModule::set_chain_limits(RawOrigin::Root.into(), ChainLimits {
1974 collection_numbers_limit: 10,
1975 account_token_ownership_limit: 10,
1976 collections_admins_limit: 5,
1977 custom_data_limit: 2048,
1978 nft_sponsor_transfer_timeout: 15,
1979 fungible_sponsor_transfer_timeout: 15,
1980 refungible_sponsor_transfer_timeout: 15,
1981 }));
1982
1501 let origin1 = Origin::signed(1);1983 let origin1 = Origin::signed(1);
1502 assert_ok!(TemplateModule::create_collection(1984 assert_ok!(TemplateModule::create_collection(
1503 origin1.clone(),1985 origin1.clone(),
1515 11997 1
1516 ));1998 ));
15171999
1518 assert_ok!(TemplateModule::set_public_access_mode(origin1.clone(), 1, AccessMode::WhiteList));2000 assert_ok!(TemplateModule::set_public_access_mode(
2001 origin1.clone(),
2002 1,
2003 AccessMode::WhiteList
2004 ));
1519 assert_ok!(TemplateModule::add_to_white_list(origin1.clone(), 1, 1));2005 assert_ok!(TemplateModule::add_to_white_list(origin1.clone(), 1, 1));
1520 assert_ok!(TemplateModule::add_to_white_list(origin1.clone(), 1, 2));2006 assert_ok!(TemplateModule::add_to_white_list(origin1.clone(), 1, 2));
15212007
1543 let token_prefix1: Vec<u8> = b"token_prefix1\0".to_vec();2029 let token_prefix1: Vec<u8> = b"token_prefix1\0".to_vec();
1544 let mode: CollectionMode = CollectionMode::NFT(2000);2030 let mode: CollectionMode = CollectionMode::NFT(2000);
15452031
2032 assert_ok!(TemplateModule::set_chain_limits(RawOrigin::Root.into(), ChainLimits {
2033 collection_numbers_limit: 10,
2034 account_token_ownership_limit: 10,
2035 collections_admins_limit: 5,
2036 custom_data_limit: 2048,
2037 nft_sponsor_transfer_timeout: 15,
2038 fungible_sponsor_transfer_timeout: 15,
2039 refungible_sponsor_transfer_timeout: 15,
2040 }));
2041
1546 let origin1 = Origin::signed(1);2042 let origin1 = Origin::signed(1);
1547 assert_ok!(TemplateModule::create_collection(2043 assert_ok!(TemplateModule::create_collection(
1548 origin1.clone(),2044 origin1.clone(),
1552 mode2048 mode
1553 ));2049 ));
15542050
1555 assert_ok!(TemplateModule::set_public_access_mode(origin1.clone(), 1, AccessMode::WhiteList));2051 assert_ok!(TemplateModule::set_public_access_mode(
2052 origin1.clone(),
2053 1,
2054 AccessMode::WhiteList
2055 ));
1556 assert_ok!(TemplateModule::set_mint_permission(origin1.clone(), 1, false));2056 assert_ok!(TemplateModule::set_mint_permission(
2057 origin1.clone(),
2058 1,
2059 false
2060 ));
15572061
1558 assert_ok!(TemplateModule::create_item(2062 assert_ok!(TemplateModule::create_item(
1559 origin1.clone(),2063 origin1.clone(),
1573 let token_prefix1: Vec<u8> = b"token_prefix1\0".to_vec();2077 let token_prefix1: Vec<u8> = b"token_prefix1\0".to_vec();
1574 let mode: CollectionMode = CollectionMode::NFT(2000);2078 let mode: CollectionMode = CollectionMode::NFT(2000);
15752079
2080 assert_ok!(TemplateModule::set_chain_limits(RawOrigin::Root.into(), ChainLimits {
2081 collection_numbers_limit: 10,
2082 account_token_ownership_limit: 10,
2083 collections_admins_limit: 5,
2084 custom_data_limit: 2048,
2085 nft_sponsor_transfer_timeout: 15,
2086 fungible_sponsor_transfer_timeout: 15,
2087 refungible_sponsor_transfer_timeout: 15,
2088 }));
2089
1576 let origin1 = Origin::signed(1);2090 let origin1 = Origin::signed(1);
1577 let origin2 = Origin::signed(2);2091 let origin2 = Origin::signed(2);
1578 assert_ok!(TemplateModule::create_collection(2092 assert_ok!(TemplateModule::create_collection(
1583 mode2097 mode
1584 ));2098 ));
15852099
1586 assert_ok!(TemplateModule::set_public_access_mode(origin1.clone(), 1, AccessMode::WhiteList));2100 assert_ok!(TemplateModule::set_public_access_mode(
2101 origin1.clone(),
2102 1,
2103 AccessMode::WhiteList
2104 ));
1587 assert_ok!(TemplateModule::set_mint_permission(origin1.clone(), 1, false));2105 assert_ok!(TemplateModule::set_mint_permission(
2106 origin1.clone(),
2107 1,
2108 false
2109 ));
15882110
1589 assert_ok!(TemplateModule::add_collection_admin(origin1.clone(), 1, 2));2111 assert_ok!(TemplateModule::add_collection_admin(origin1.clone(), 1, 2));
15902112
1606 let token_prefix1: Vec<u8> = b"token_prefix1\0".to_vec();2128 let token_prefix1: Vec<u8> = b"token_prefix1\0".to_vec();
1607 let mode: CollectionMode = CollectionMode::NFT(2000);2129 let mode: CollectionMode = CollectionMode::NFT(2000);
16082130
2131 assert_ok!(TemplateModule::set_chain_limits(RawOrigin::Root.into(), ChainLimits {
2132 collection_numbers_limit: 10,
2133 account_token_ownership_limit: 10,
2134 collections_admins_limit: 5,
2135 custom_data_limit: 2048,
2136 nft_sponsor_transfer_timeout: 15,
2137 fungible_sponsor_transfer_timeout: 15,
2138 refungible_sponsor_transfer_timeout: 15,
2139 }));
2140
1609 let origin1 = Origin::signed(1);2141 let origin1 = Origin::signed(1);
1610 let origin2 = Origin::signed(2);2142 let origin2 = Origin::signed(2);
1611 assert_ok!(TemplateModule::create_collection(2143 assert_ok!(TemplateModule::create_collection(
1616 mode2148 mode
1617 ));2149 ));
16182150
1619 assert_ok!(TemplateModule::set_public_access_mode(origin1.clone(), 1, AccessMode::WhiteList));2151 assert_ok!(TemplateModule::set_public_access_mode(
2152 origin1.clone(),
2153 1,
2154 AccessMode::WhiteList
2155 ));
1620 assert_ok!(TemplateModule::set_mint_permission(origin1.clone(), 1, false));2156 assert_ok!(TemplateModule::set_mint_permission(
2157 origin1.clone(),
2158 1,
2159 false
2160 ));
1621 assert_ok!(TemplateModule::add_to_white_list(origin1.clone(), 1, 2));2161 assert_ok!(TemplateModule::add_to_white_list(origin1.clone(), 1, 2));
16222162
1623 assert_noop!(TemplateModule::create_item(2163 assert_noop!(
1624 origin2.clone(),2164 TemplateModule::create_item(origin2.clone(), 1, [1, 2, 3].to_vec(), 2),
1625 1,
1626 [1, 2, 3].to_vec(),
1627 22165 "Collection is not in mint mode"
1628 ), "Collection is not in mint mode");2166 );
1629 });2167 });
1630}2168}
16312169
1638 let token_prefix1: Vec<u8> = b"token_prefix1\0".to_vec();2176 let token_prefix1: Vec<u8> = b"token_prefix1\0".to_vec();
1639 let mode: CollectionMode = CollectionMode::NFT(2000);2177 let mode: CollectionMode = CollectionMode::NFT(2000);
16402178
2179 assert_ok!(TemplateModule::set_chain_limits(RawOrigin::Root.into(), ChainLimits {
2180 collection_numbers_limit: 10,
2181 account_token_ownership_limit: 10,
2182 collections_admins_limit: 5,
2183 custom_data_limit: 2048,
2184 nft_sponsor_transfer_timeout: 15,
2185 fungible_sponsor_transfer_timeout: 15,
2186 refungible_sponsor_transfer_timeout: 15,
2187 }));
2188
1641 let origin1 = Origin::signed(1);2189 let origin1 = Origin::signed(1);
1642 let origin2 = Origin::signed(2);2190 let origin2 = Origin::signed(2);
1643 assert_ok!(TemplateModule::create_collection(2191 assert_ok!(TemplateModule::create_collection(
1648 mode2196 mode
1649 ));2197 ));
16502198
1651 assert_ok!(TemplateModule::set_public_access_mode(origin1.clone(), 1, AccessMode::WhiteList));2199 assert_ok!(TemplateModule::set_public_access_mode(
2200 origin1.clone(),
2201 1,
2202 AccessMode::WhiteList
2203 ));
1652 assert_ok!(TemplateModule::set_mint_permission(origin1.clone(), 1, false));2204 assert_ok!(TemplateModule::set_mint_permission(
2205 origin1.clone(),
2206 1,
2207 false
2208 ));
16532209
1654 assert_noop!(TemplateModule::create_item(2210 assert_noop!(
1655 origin2.clone(),2211 TemplateModule::create_item(origin2.clone(), 1, [1, 2, 3].to_vec(), 2),
1656 1,
1657 [1, 2, 3].to_vec(),
1658 22212 "Collection is not in mint mode"
1659 ), "Collection is not in mint mode");2213 );
1660 });2214 });
1661}2215}
16622216
1669 let token_prefix1: Vec<u8> = b"token_prefix1\0".to_vec();2223 let token_prefix1: Vec<u8> = b"token_prefix1\0".to_vec();
1670 let mode: CollectionMode = CollectionMode::NFT(2000);2224 let mode: CollectionMode = CollectionMode::NFT(2000);
16712225
2226 assert_ok!(TemplateModule::set_chain_limits(RawOrigin::Root.into(), ChainLimits {
2227 collection_numbers_limit: 10,
2228 account_token_ownership_limit: 10,
2229 collections_admins_limit: 5,
2230 custom_data_limit: 2048,
2231 nft_sponsor_transfer_timeout: 15,
2232 fungible_sponsor_transfer_timeout: 15,
2233 refungible_sponsor_transfer_timeout: 15,
2234 }));
2235
1672 let origin1 = Origin::signed(1);2236 let origin1 = Origin::signed(1);
1673 assert_ok!(TemplateModule::create_collection(2237 assert_ok!(TemplateModule::create_collection(
1674 origin1.clone(),2238 origin1.clone(),
1678 mode2242 mode
1679 ));2243 ));
16802244
1681 assert_ok!(TemplateModule::set_public_access_mode(origin1.clone(), 1, AccessMode::WhiteList));2245 assert_ok!(TemplateModule::set_public_access_mode(
2246 origin1.clone(),
2247 1,
2248 AccessMode::WhiteList
2249 ));
1682 assert_ok!(TemplateModule::set_mint_permission(origin1.clone(), 1, true));2250 assert_ok!(TemplateModule::set_mint_permission(
2251 origin1.clone(),
2252 1,
2253 true
2254 ));
16832255
1684 assert_ok!(TemplateModule::create_item(2256 assert_ok!(TemplateModule::create_item(
1685 origin1.clone(),2257 origin1.clone(),
1699 let token_prefix1: Vec<u8> = b"token_prefix1\0".to_vec();2271 let token_prefix1: Vec<u8> = b"token_prefix1\0".to_vec();
1700 let mode: CollectionMode = CollectionMode::NFT(2000);2272 let mode: CollectionMode = CollectionMode::NFT(2000);
17012273
2274 assert_ok!(TemplateModule::set_chain_limits(RawOrigin::Root.into(), ChainLimits {
2275 collection_numbers_limit: 10,
2276 account_token_ownership_limit: 10,
2277 collections_admins_limit: 5,
2278 custom_data_limit: 2048,
2279 nft_sponsor_transfer_timeout: 15,
2280 fungible_sponsor_transfer_timeout: 15,
2281 refungible_sponsor_transfer_timeout: 15,
2282 }));
2283
1702 let origin1 = Origin::signed(1);2284 let origin1 = Origin::signed(1);
1703 let origin2 = Origin::signed(2);2285 let origin2 = Origin::signed(2);
1704 assert_ok!(TemplateModule::create_collection(2286 assert_ok!(TemplateModule::create_collection(
1709 mode2291 mode
1710 ));2292 ));
17112293
1712 assert_ok!(TemplateModule::set_public_access_mode(origin1.clone(), 1, AccessMode::WhiteList));2294 assert_ok!(TemplateModule::set_public_access_mode(
2295 origin1.clone(),
2296 1,
2297 AccessMode::WhiteList
2298 ));
1713 assert_ok!(TemplateModule::set_mint_permission(origin1.clone(), 1, true));2299 assert_ok!(TemplateModule::set_mint_permission(
2300 origin1.clone(),
2301 1,
2302 true
2303 ));
17142304
1715 assert_ok!(TemplateModule::add_collection_admin(origin1.clone(), 1, 2));2305 assert_ok!(TemplateModule::add_collection_admin(origin1.clone(), 1, 2));
17162306
1732 let token_prefix1: Vec<u8> = b"token_prefix1\0".to_vec();2322 let token_prefix1: Vec<u8> = b"token_prefix1\0".to_vec();
1733 let mode: CollectionMode = CollectionMode::NFT(2000);2323 let mode: CollectionMode = CollectionMode::NFT(2000);
17342324
2325 assert_ok!(TemplateModule::set_chain_limits(RawOrigin::Root.into(), ChainLimits {
2326 collection_numbers_limit: 10,
2327 account_token_ownership_limit: 10,
2328 collections_admins_limit: 5,
2329 custom_data_limit: 2048,
2330 nft_sponsor_transfer_timeout: 15,
2331 fungible_sponsor_transfer_timeout: 15,
2332 refungible_sponsor_transfer_timeout: 15,
2333 }));
2334
1735 let origin1 = Origin::signed(1);2335 let origin1 = Origin::signed(1);
1736 let origin2 = Origin::signed(2);2336 let origin2 = Origin::signed(2);
1737 assert_ok!(TemplateModule::create_collection(2337 assert_ok!(TemplateModule::create_collection(
1742 mode2342 mode
1743 ));2343 ));
17442344
1745 assert_ok!(TemplateModule::set_public_access_mode(origin1.clone(), 1, AccessMode::WhiteList));2345 assert_ok!(TemplateModule::set_public_access_mode(
2346 origin1.clone(),
2347 1,
2348 AccessMode::WhiteList
2349 ));
1746 assert_ok!(TemplateModule::set_mint_permission(origin1.clone(), 1, true));2350 assert_ok!(TemplateModule::set_mint_permission(
2351 origin1.clone(),
2352 1,
2353 true
2354 ));
17472355
1748 assert_noop!(TemplateModule::create_item(2356 assert_noop!(
1749 origin2.clone(),2357 TemplateModule::create_item(origin2.clone(), 1, [1, 2, 3].to_vec(), 2),
1750 1,
1751 [1, 2, 3].to_vec(),
1752 22358 "Address is not in white list"
1753 ), "Address is not in white list");2359 );
1754 });2360 });
1755}2361}
17562362
1763 let token_prefix1: Vec<u8> = b"token_prefix1\0".to_vec();2369 let token_prefix1: Vec<u8> = b"token_prefix1\0".to_vec();
1764 let mode: CollectionMode = CollectionMode::NFT(2000);2370 let mode: CollectionMode = CollectionMode::NFT(2000);
17652371
2372 assert_ok!(TemplateModule::set_chain_limits(RawOrigin::Root.into(), ChainLimits {
2373 collection_numbers_limit: 10,
2374 account_token_ownership_limit: 10,
2375 collections_admins_limit: 5,
2376 custom_data_limit: 2048,
2377 nft_sponsor_transfer_timeout: 15,
2378 fungible_sponsor_transfer_timeout: 15,
2379 refungible_sponsor_transfer_timeout: 15,
2380 }));
2381
1766 let origin1 = Origin::signed(1);2382 let origin1 = Origin::signed(1);
1767 let origin2 = Origin::signed(2);2383 let origin2 = Origin::signed(2);
1768 assert_ok!(TemplateModule::create_collection(2384 assert_ok!(TemplateModule::create_collection(
1773 mode2389 mode
1774 ));2390 ));
17752391
1776 assert_ok!(TemplateModule::set_public_access_mode(origin1.clone(), 1, AccessMode::WhiteList));2392 assert_ok!(TemplateModule::set_public_access_mode(
2393 origin1.clone(),
2394 1,
2395 AccessMode::WhiteList
2396 ));
1777 assert_ok!(TemplateModule::set_mint_permission(origin1.clone(), 1, true));2397 assert_ok!(TemplateModule::set_mint_permission(
2398 origin1.clone(),
2399 1,
2400 true
2401 ));
1778 assert_ok!(TemplateModule::add_to_white_list(origin1.clone(), 1, 2));2402 assert_ok!(TemplateModule::add_to_white_list(origin1.clone(), 1, 2));
17792403
1780 assert_ok!(TemplateModule::create_item(2404 assert_ok!(TemplateModule::create_item(
1786 });2410 });
1787}2411}
17882412
1789// #endregion2413// Total number of collections. Positive test
2414#[test]
2415fn total_number_collections_bound() {
2416 new_test_ext().execute_with(|| {
2417 let col_name1: Vec<u16> = "Test1\0".encode_utf16().collect::<Vec<u16>>();
2418 let col_desc1: Vec<u16> = "TestDescription1\0".encode_utf16().collect::<Vec<u16>>();
2419 let token_prefix1: Vec<u8> = b"token_prefix1\0".to_vec();
2420 let mode: CollectionMode = CollectionMode::NFT(2000);
2421
2422 assert_ok!(TemplateModule::set_chain_limits(RawOrigin::Root.into(), ChainLimits {
2423 collection_numbers_limit: 10,
2424 account_token_ownership_limit: 10,
2425 collections_admins_limit: 5,
2426 custom_data_limit: 2048,
2427 nft_sponsor_transfer_timeout: 15,
2428 fungible_sponsor_transfer_timeout: 15,
2429 refungible_sponsor_transfer_timeout: 15,
2430 }));
2431
2432 let origin1 = Origin::signed(1);
2433 assert_ok!(TemplateModule::create_collection(
2434 origin1.clone(),
2435 col_name1.clone(),
2436 col_desc1.clone(),
2437 token_prefix1.clone(),
2438 mode
2439 ));
2440 });
2441}
2442
2443// Total number of collections. Negotive test
2444#[test]
2445fn total_number_collections_bound_neg() {
2446 new_test_ext().execute_with(|| {
2447 let col_name1: Vec<u16> = "Test1\0".encode_utf16().collect::<Vec<u16>>();
2448 let col_desc1: Vec<u16> = "TestDescription1\0".encode_utf16().collect::<Vec<u16>>();
2449 let token_prefix1: Vec<u8> = b"token_prefix1\0".to_vec();
2450 let mode: CollectionMode = CollectionMode::NFT(2000);
2451
2452 assert_ok!(TemplateModule::set_chain_limits(RawOrigin::Root.into(), ChainLimits {
2453 collection_numbers_limit: 10,
2454 account_token_ownership_limit: 10,
2455 collections_admins_limit: 5,
2456 custom_data_limit: 2048,
2457 nft_sponsor_transfer_timeout: 15,
2458 fungible_sponsor_transfer_timeout: 15,
2459 refungible_sponsor_transfer_timeout: 15,
2460 }));
2461
2462 let origin1 = Origin::signed(1);
2463
2464 for _ in 0..10 {
2465
2466 assert_ok!(TemplateModule::create_collection(
2467 origin1.clone(),
2468 col_name1.clone(),
2469 col_desc1.clone(),
2470 token_prefix1.clone(),
2471 mode.clone()
2472 ));
2473 }
2474
2475 // 11-th collection in chain. Expects error
2476 assert_noop!(TemplateModule::create_collection(
2477 origin1.clone(),
2478 col_name1.clone(),
2479 col_desc1.clone(),
2480 token_prefix1.clone(),
2481 mode.clone()
2482 ), "Total collections bound exceeded");
2483 });
2484}
2485
2486// Owned tokens by a single address. Positive test
2487#[test]
2488fn owned_tokens_bound() {
2489 new_test_ext().execute_with(|| {
2490 let col_name1: Vec<u16> = "Test1\0".encode_utf16().collect::<Vec<u16>>();
2491 let col_desc1: Vec<u16> = "TestDescription1\0".encode_utf16().collect::<Vec<u16>>();
2492 let token_prefix1: Vec<u8> = b"token_prefix1\0".to_vec();
2493 let mode: CollectionMode = CollectionMode::NFT(2000);
2494
2495 assert_ok!(TemplateModule::set_chain_limits(RawOrigin::Root.into(), ChainLimits {
2496 collection_numbers_limit: 10,
2497 account_token_ownership_limit: 10,
2498 collections_admins_limit: 5,
2499 custom_data_limit: 2048,
2500 nft_sponsor_transfer_timeout: 15,
2501 fungible_sponsor_transfer_timeout: 15,
2502 refungible_sponsor_transfer_timeout: 15,
2503 }));
2504
2505 let origin1 = Origin::signed(1);
2506 assert_ok!(TemplateModule::create_collection(
2507 origin1.clone(),
2508 col_name1.clone(),
2509 col_desc1.clone(),
2510 token_prefix1.clone(),
2511 mode
2512 ));
2513
2514 assert_ok!(TemplateModule::create_item(
2515 origin1.clone(),
2516 1,
2517 [1, 2, 3].to_vec(),
2518 1
2519 ));
2520
2521 assert_ok!(TemplateModule::create_item(
2522 origin1.clone(),
2523 1,
2524 [1, 2, 3].to_vec(),
2525 1
2526 ));
2527 });
2528}
2529
2530// Owned tokens by a single address. Negotive test
2531#[test]
2532fn owned_tokens_bound_neg() {
2533 new_test_ext().execute_with(|| {
2534 let col_name1: Vec<u16> = "Test1\0".encode_utf16().collect::<Vec<u16>>();
2535 let col_desc1: Vec<u16> = "TestDescription1\0".encode_utf16().collect::<Vec<u16>>();
2536 let token_prefix1: Vec<u8> = b"token_prefix1\0".to_vec();
2537 let mode: CollectionMode = CollectionMode::NFT(2000);
2538
2539 assert_ok!(TemplateModule::set_chain_limits(RawOrigin::Root.into(), ChainLimits {
2540 collection_numbers_limit: 10,
2541 account_token_ownership_limit: 1,
2542 collections_admins_limit: 5,
2543 custom_data_limit: 2048,
2544 nft_sponsor_transfer_timeout: 15,
2545 fungible_sponsor_transfer_timeout: 15,
2546 refungible_sponsor_transfer_timeout: 15,
2547 }));
2548
2549 let origin1 = Origin::signed(1);
2550 assert_ok!(TemplateModule::create_collection(
2551 origin1.clone(),
2552 col_name1.clone(),
2553 col_desc1.clone(),
2554 token_prefix1.clone(),
2555 mode
2556 ));
2557
2558 assert_ok!(TemplateModule::create_item(
2559 origin1.clone(),
2560 1,
2561 [1, 2, 3].to_vec(),
2562 1
2563 ));
2564
2565 assert_noop!(TemplateModule::create_item(
2566 origin1.clone(),
2567 1,
2568 [1, 2, 3].to_vec(),
2569 1
2570 ), "Owned tokens by a single address bound exceeded");
2571 });
2572}
2573
2574// Number of collection admins. Positive test
2575#[test]
2576fn collection_admins_bound() {
2577 new_test_ext().execute_with(|| {
2578 let col_name1: Vec<u16> = "Test1\0".encode_utf16().collect::<Vec<u16>>();
2579 let col_desc1: Vec<u16> = "TestDescription1\0".encode_utf16().collect::<Vec<u16>>();
2580 let token_prefix1: Vec<u8> = b"token_prefix1\0".to_vec();
2581 let mode: CollectionMode = CollectionMode::NFT(2000);
2582
2583 assert_ok!(TemplateModule::set_chain_limits(RawOrigin::Root.into(), ChainLimits {
2584 collection_numbers_limit: 10,
2585 account_token_ownership_limit: 10,
2586 collections_admins_limit: 2,
2587 custom_data_limit: 2048,
2588 nft_sponsor_transfer_timeout: 15,
2589 fungible_sponsor_transfer_timeout: 15,
2590 refungible_sponsor_transfer_timeout: 15,
2591 }));
2592
2593 let origin1 = Origin::signed(1);
2594 assert_ok!(TemplateModule::create_collection(
2595 origin1.clone(),
2596 col_name1.clone(),
2597 col_desc1.clone(),
2598 token_prefix1.clone(),
2599 mode
2600 ));
2601
2602 assert_ok!(TemplateModule::add_collection_admin(origin1.clone(), 1, 2));
2603 assert_ok!(TemplateModule::add_collection_admin(origin1.clone(), 1, 3));
2604 });
2605}
2606
2607// Number of collection admins. Negotive test
2608#[test]
2609fn collection_admins_bound_neg() {
2610 new_test_ext().execute_with(|| {
2611 let col_name1: Vec<u16> = "Test1\0".encode_utf16().collect::<Vec<u16>>();
2612 let col_desc1: Vec<u16> = "TestDescription1\0".encode_utf16().collect::<Vec<u16>>();
2613 let token_prefix1: Vec<u8> = b"token_prefix1\0".to_vec();
2614 let mode: CollectionMode = CollectionMode::NFT(2000);
2615
2616 assert_ok!(TemplateModule::set_chain_limits(RawOrigin::Root.into(), ChainLimits {
2617 collection_numbers_limit: 10,
2618 account_token_ownership_limit: 1,
2619 collections_admins_limit: 1,
2620 custom_data_limit: 2048,
2621 nft_sponsor_transfer_timeout: 15,
2622 fungible_sponsor_transfer_timeout: 15,
2623 refungible_sponsor_transfer_timeout: 15,
2624 }));
2625
2626 let origin1 = Origin::signed(1);
2627 assert_ok!(TemplateModule::create_collection(
2628 origin1.clone(),
2629 col_name1.clone(),
2630 col_desc1.clone(),
2631 token_prefix1.clone(),
2632 mode
2633 ));
2634
2635 assert_ok!(TemplateModule::add_collection_admin(origin1.clone(), 1, 2));
2636 assert_noop!(TemplateModule::add_collection_admin(origin1.clone(), 1, 3), "Number of collection admins bound exceeded");
2637 });
2638}
2639
2640// Custom data size. Positive test
2641#[test]
2642fn custom_data_size_bound() {
2643 new_test_ext().execute_with(|| {
2644 let col_name1: Vec<u16> = "Test1\0".encode_utf16().collect::<Vec<u16>>();
2645 let col_desc1: Vec<u16> = "TestDescription1\0".encode_utf16().collect::<Vec<u16>>();
2646 let token_prefix1: Vec<u8> = b"token_prefix1\0".to_vec();
2647 let mode: CollectionMode = CollectionMode::NFT(2000);
2648
2649 assert_ok!(TemplateModule::set_chain_limits(RawOrigin::Root.into(), ChainLimits {
2650 collection_numbers_limit: 10,
2651 account_token_ownership_limit: 10,
2652 collections_admins_limit: 5,
2653 custom_data_limit: 2048,
2654 nft_sponsor_transfer_timeout: 15,
2655 fungible_sponsor_transfer_timeout: 15,
2656 refungible_sponsor_transfer_timeout: 15,
2657 }));
2658
2659 let origin1 = Origin::signed(1);
2660 assert_ok!(TemplateModule::create_collection(
2661 origin1.clone(),
2662 col_name1.clone(),
2663 col_desc1.clone(),
2664 token_prefix1.clone(),
2665 mode
2666 ));
2667 });
2668}
2669
2670// Custom data size. Negotive test
2671#[test]
2672fn custom_data_size_bound_neg() {
2673 new_test_ext().execute_with(|| {
2674 let col_name1: Vec<u16> = "Test1\0".encode_utf16().collect::<Vec<u16>>();
2675 let col_desc1: Vec<u16> = "TestDescription1\0".encode_utf16().collect::<Vec<u16>>();
2676 let token_prefix1: Vec<u8> = b"token_prefix1\0".to_vec();
2677 let mode: CollectionMode = CollectionMode::NFT(2000);
2678
2679 assert_ok!(TemplateModule::set_chain_limits(RawOrigin::Root.into(), ChainLimits {
2680 collection_numbers_limit: 10,
2681 account_token_ownership_limit: 10,
2682 collections_admins_limit: 5,
2683 custom_data_limit: 200,
2684 nft_sponsor_transfer_timeout: 15,
2685 fungible_sponsor_transfer_timeout: 15,
2686 refungible_sponsor_transfer_timeout: 15,
2687 }));
2688
2689 let origin1 = Origin::signed(1);
2690 assert_noop!(TemplateModule::create_collection(
2691 origin1.clone(),
2692 col_name1.clone(),
2693 col_desc1.clone(),
2694 token_prefix1.clone(),
2695 mode
2696 ), "Custom data size bound exceeded");
2697 });
2698}
2699// #endregion
2700