difftreelog
Merge pull request #9 from usetech-llc/feature_limits_nft_78_85_105
in: master
Transfer rate limit + chain bounds
4 files changed
node/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 {
pallets/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
pallets/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 {
pallets/nft/src/tests.rsdiffbeforeafterboth1// Tests to be written here1// Tests to be written here2use 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 };566// Use cases tests region7// Use cases tests region7// #region8// #region13 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);151617 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 }));2616 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);435455 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 }));6444 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);81102103 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 }));11282 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);111142143 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 }));152112 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);169210211 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 }));220170 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);266317318 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 }));327267 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);304365366 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 }));375305 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]);325396326 assert_ok!(TemplateModule::set_mint_permission(origin1.clone(), 1, true));397 assert_ok!(TemplateModule::set_mint_permission(398 origin1.clone(),399 1,400 true401 ));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::WhiteList406 ));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);364443444 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 }));453365 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]);395484396 assert_ok!(TemplateModule::set_mint_permission(origin1.clone(), 1, true));485 assert_ok!(TemplateModule::set_mint_permission(486 origin1.clone(),487 1,488 true489 ));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::WhiteList494 ));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);446543544 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 }));553447 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]);467574468 assert_ok!(TemplateModule::set_mint_permission(origin1.clone(), 1, true));575 assert_ok!(TemplateModule::set_mint_permission(576 origin1.clone(),577 1,578 true579 ));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::WhiteList584 ));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);534649650 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 }));659535 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);559684685 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 }));694560 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);579714715 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 }));724580 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);619764765 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 }));774620 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);657812813 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 }));822658 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 mode666 ));831 ));832667 833 assert_ok!(TemplateModule::set_mint_permission(668 assert_ok!(TemplateModule::set_mint_permission(origin1.clone(), 1, true));834 origin1.clone(),835 1,836 true837 ));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::WhiteList842 ));670 assert_ok!(TemplateModule::add_to_white_list(origin1.clone(), 1, 1));843 assert_ok!(TemplateModule::add_to_white_list(origin1.clone(), 1, 1));671844672 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);706879880 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 }));889707 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);756939940 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 }));949757 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(),8091002810 let origin1 = Origin::signed(1);1003 let origin1 = Origin::signed(1);81110041005 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 }));1014812 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);88310861087 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 }));1096884 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);91711301131 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 }));1140918 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);9391162940 assert_ok!(TemplateModule::set_mint_permission(origin1.clone(), 1, true));1163 assert_ok!(TemplateModule::set_mint_permission(1164 origin1.clone(),1165 1,1166 true1167 ));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::WhiteList1172 ));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);97412051206 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 }));1215975 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);99712381239 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 }));1248998 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);102112721273 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 }));12821022 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 mode1028 ));1289 ));102912901030 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}103312971034#[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);103713021038 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 }));13121039 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}104213191049 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);105113281329 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 }));13381052 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 ));105913461060 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}106413541065// If address is already added to white list, nothing happens1355// If address is already added to white list, nothing happens1066#[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(|| {10691070 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);107513641365 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 }));13741076 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);110013981399 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 }));14081101 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 ));110814161109 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 21422 ));1111 assert_eq!(TemplateModule::white_list(1).len(), 0);1423 assert_eq!(TemplateModule::white_list(1).len(), 0);1112 });1424 });1113}1425}111414261115#[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(|| {11181119 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);112514361437 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 }));14461126 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));113514561136 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 31462 ));1138 assert_eq!(TemplateModule::white_list(1).len(), 0);1463 assert_eq!(TemplateModule::white_list(1).len(), 0);1139 });1464 });1140}1465}114114661142#[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(|| {11451146 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);115214761477 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 }));14861153 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 ));116014941161 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}116615031167#[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);117015081171 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 }));15181172 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}117515251176#[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(|| {11791180 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);118615351536 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 }));15451187 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(),119415531195 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);121115731574 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 }));15831212 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 ));121915911220 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 21597 ));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 21602 ));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);123516151616 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 }));16251236 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 11251 ));1641 ));125216421253 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::WhiteList1647 ));1254 assert_ok!(TemplateModule::add_to_white_list(origin1.clone(), 1, 2));1648 assert_ok!(TemplateModule::add_to_white_list(origin1.clone(), 1, 2));125516491256 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}126516561271 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);127316641665 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 }));16741274 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 11289 ));1690 ));129016911291 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::WhiteList1696 ));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));129416991295 // do approve1700 // do approve1296 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);129817031299 assert_ok!(TemplateModule::remove_from_white_list(origin1.clone(), 1, 1));1704 assert_ok!(TemplateModule::remove_from_white_list(13001301 assert_noop!(TemplateModule::transfer_from(1302 origin1.clone(),1705 origin1.clone(),1303 1,1706 1,1304 3,1305 1,1306 1,1307 11707 11308 ), "Address is not in white list");1708 ));17091710 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}131117161318 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);132017251726 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 }));17351321 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 11336 ));1751 ));133717521338 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::WhiteList1757 ));1339 assert_ok!(TemplateModule::add_to_white_list(origin1.clone(), 1, 1));1758 assert_ok!(TemplateModule::add_to_white_list(origin1.clone(), 1, 1));134017591341 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}135017661356 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);135817741775 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 }));17841359 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 11374 ));1800 ));137518011376 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::WhiteList1806 ));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));137918091380 // do approve1810 // do approve1381 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);138318131384 assert_ok!(TemplateModule::remove_from_white_list(origin1.clone(), 1, 2));1814 assert_ok!(TemplateModule::remove_from_white_list(13851386 assert_noop!(TemplateModule::transfer_from(1387 origin1.clone(),1815 origin1.clone(),1388 1,1816 1,1389 3,1817 21390 1,1818 ));18191391 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}139618261403 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);140518351836 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 }));18451406 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 11421 ));1861 ));142218621423 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::WhiteList1867 ));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}142718741434 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);143618831884 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 }));18931437 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 mode1444 ));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::WhiteList1906 ));144619071447 // do approve1908 // do approve1448 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}145119151459 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);146119251926 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 }));19351462 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 11477 ));1951 ));147819521479 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::WhiteList1957 ));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));148219601483 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 11489 ));1490 });1962 });1491}1963}149219641498 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);150019721973 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 }));19821501 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 11516 ));1998 ));151719991518 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::WhiteList2004 ));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));152120071543 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);154520312032 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 }));20411546 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 mode1553 ));2049 ));155420501555 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::WhiteList2055 ));1556 assert_ok!(TemplateModule::set_mint_permission(origin1.clone(), 1, false));2056 assert_ok!(TemplateModule::set_mint_permission(2057 origin1.clone(),2058 1,2059 false2060 ));155720611558 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);157520792080 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 }));20891576 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 mode1584 ));2098 ));158520991586 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::WhiteList2104 ));1587 assert_ok!(TemplateModule::set_mint_permission(origin1.clone(), 1, false));2105 assert_ok!(TemplateModule::set_mint_permission(2106 origin1.clone(),2107 1,2108 false2109 ));158821101589 assert_ok!(TemplateModule::add_collection_admin(origin1.clone(), 1, 2));2111 assert_ok!(TemplateModule::add_collection_admin(origin1.clone(), 1, 2));159021121606 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);160821302131 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 }));21401609 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 mode1617 ));2149 ));161821501619 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::WhiteList2155 ));1620 assert_ok!(TemplateModule::set_mint_permission(origin1.clone(), 1, false));2156 assert_ok!(TemplateModule::set_mint_permission(2157 origin1.clone(),2158 1,2159 false2160 ));1621 assert_ok!(TemplateModule::add_to_white_list(origin1.clone(), 1, 2));2161 assert_ok!(TemplateModule::add_to_white_list(origin1.clone(), 1, 2));162221621623 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}163121691638 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);164021782179 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 }));21881641 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 mode1649 ));2197 ));165021981651 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::WhiteList2203 ));1652 assert_ok!(TemplateModule::set_mint_permission(origin1.clone(), 1, false));2204 assert_ok!(TemplateModule::set_mint_permission(2205 origin1.clone(),2206 1,2207 false2208 ));165322091654 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}166222161669 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);167122252226 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 }));22351672 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 mode1679 ));2243 ));168022441681 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::WhiteList2249 ));1682 assert_ok!(TemplateModule::set_mint_permission(origin1.clone(), 1, true));2250 assert_ok!(TemplateModule::set_mint_permission(2251 origin1.clone(),2252 1,2253 true2254 ));168322551684 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);170122732274 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 }));22831702 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 mode1710 ));2292 ));171122931712 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::WhiteList2298 ));1713 assert_ok!(TemplateModule::set_mint_permission(origin1.clone(), 1, true));2299 assert_ok!(TemplateModule::set_mint_permission(2300 origin1.clone(),2301 1,2302 true2303 ));171423041715 assert_ok!(TemplateModule::add_collection_admin(origin1.clone(), 1, 2));2305 assert_ok!(TemplateModule::add_collection_admin(origin1.clone(), 1, 2));171623061732 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);173423242325 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 }));23341735 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 mode1743 ));2343 ));174423441745 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::WhiteList2349 ));1746 assert_ok!(TemplateModule::set_mint_permission(origin1.clone(), 1, true));2350 assert_ok!(TemplateModule::set_mint_permission(2351 origin1.clone(),2352 1,2353 true2354 ));174723551748 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}175623621763 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);176523712372 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 }));23811766 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 mode1774 ));2390 ));177523911776 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::WhiteList2396 ));1777 assert_ok!(TemplateModule::set_mint_permission(origin1.clone(), 1, true));2397 assert_ok!(TemplateModule::set_mint_permission(2398 origin1.clone(),2399 1,2400 true2401 ));1778 assert_ok!(TemplateModule::add_to_white_list(origin1.clone(), 1, 2));2402 assert_ok!(TemplateModule::add_to_white_list(origin1.clone(), 1, 2));177924031780 assert_ok!(TemplateModule::create_item(2404 assert_ok!(TemplateModule::create_item(1786 });2410 });1787}2411}178824121789// #endregion2413// Total number of collections. Positive test2414#[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);24212422 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 }));24312432 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 mode2439 ));2440 });2441}24422443// Total number of collections. Negotive test2444#[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);24512452 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 }));24612462 let origin1 = Origin::signed(1);24632464 for _ in 0..10 {24652466 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 }24742475 // 11-th collection in chain. Expects error2476 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}24852486// Owned tokens by a single address. Positive test2487#[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);24942495 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 }));25042505 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 mode2512 ));25132514 assert_ok!(TemplateModule::create_item(2515 origin1.clone(),2516 1,2517 [1, 2, 3].to_vec(),2518 12519 ));25202521 assert_ok!(TemplateModule::create_item(2522 origin1.clone(),2523 1,2524 [1, 2, 3].to_vec(),2525 12526 ));2527 });2528}25292530// Owned tokens by a single address. Negotive test2531#[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);25382539 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 }));25482549 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 mode2556 ));25572558 assert_ok!(TemplateModule::create_item(2559 origin1.clone(),2560 1,2561 [1, 2, 3].to_vec(),2562 12563 ));25642565 assert_noop!(TemplateModule::create_item(2566 origin1.clone(),2567 1,2568 [1, 2, 3].to_vec(),2569 12570 ), "Owned tokens by a single address bound exceeded");2571 });2572}25732574// Number of collection admins. Positive test2575#[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);25822583 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 }));25922593 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 mode2600 ));26012602 assert_ok!(TemplateModule::add_collection_admin(origin1.clone(), 1, 2));2603 assert_ok!(TemplateModule::add_collection_admin(origin1.clone(), 1, 3));2604 });2605}26062607// Number of collection admins. Negotive test2608#[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);26152616 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 }));26252626 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 mode2633 ));26342635 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}26392640// Custom data size. Positive test2641#[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);26482649 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 }));26582659 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 mode2666 ));2667 });2668}26692670// Custom data size. Negotive test2671#[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);26782679 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 }));26882689 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 mode2696 ), "Custom data size bound exceeded");2697 });2698}2699// #endregion2700