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 here2use crate::mock::*;3use crate::{ApprovePermissions, CollectionMode, AccessMode, Ownership};4use frame_support::{assert_noop, assert_ok};56// Use cases tests region7// #region8#[test]9fn create_nft_item() {10 new_test_ext().execute_with(|| {11 let col_name1: Vec<u16> = "Test1\0".encode_utf16().collect::<Vec<u16>>();12 let col_desc1: Vec<u16> = "TestDescription1\0".encode_utf16().collect::<Vec<u16>>();13 let token_prefix1: Vec<u8> = b"token_prefix1\0".to_vec();14 let mode: CollectionMode = CollectionMode::NFT(2000);1516 let origin1 = Origin::signed(1);17 assert_ok!(TemplateModule::create_collection(18 origin1.clone(),19 col_name1.clone(),20 col_desc1.clone(),21 token_prefix1.clone(),22 mode23 ));24 assert_eq!(TemplateModule::collection(1).owner, 1);2526 assert_ok!(TemplateModule::create_item(27 origin1.clone(),28 1,29 [1, 2, 3].to_vec(),30 131 ));32 assert_eq!(TemplateModule::nft_item_id(1, 1).data, [1, 2, 3].to_vec());33 });34}3536#[test]37fn create_refungible_item() {38 new_test_ext().execute_with(|| {39 let col_name1: Vec<u16> = "Test1\0".encode_utf16().collect::<Vec<u16>>();40 let col_desc1: Vec<u16> = "TestDescription1\0".encode_utf16().collect::<Vec<u16>>();41 let token_prefix1: Vec<u8> = b"token_prefix1\0".to_vec();42 let mode: CollectionMode = CollectionMode::ReFungible(2000, 3);4344 let origin1 = Origin::signed(1);45 assert_ok!(TemplateModule::create_collection(46 origin1.clone(),47 col_name1.clone(),48 col_desc1.clone(),49 token_prefix1.clone(),50 mode51 ));52 assert_eq!(TemplateModule::collection(1).owner, 1);5354 assert_ok!(TemplateModule::create_item(55 origin1.clone(),56 1,57 [1, 2, 3].to_vec(),58 159 ));60 assert_eq!(61 TemplateModule::refungible_item_id(1, 1).data,62 [1, 2, 3].to_vec()63 );64 assert_eq!(65 TemplateModule::refungible_item_id(1, 1).owner[0],66 Ownership {67 owner: 1,68 fraction: 100069 }70 );71 });72}7374#[test]75fn create_fungible_item() {76 new_test_ext().execute_with(|| {77 let col_name1: Vec<u16> = "Test1\0".encode_utf16().collect::<Vec<u16>>();78 let col_desc1: Vec<u16> = "TestDescription1\0".encode_utf16().collect::<Vec<u16>>();79 let token_prefix1: Vec<u8> = b"token_prefix1\0".to_vec();80 let mode: CollectionMode = CollectionMode::Fungible(3);8182 let origin1 = Origin::signed(1);83 assert_ok!(TemplateModule::create_collection(84 origin1.clone(),85 col_name1.clone(),86 col_desc1.clone(),87 token_prefix1.clone(),88 mode89 ));90 assert_eq!(TemplateModule::collection(1).owner, 1);9192 assert_ok!(TemplateModule::create_item(93 origin1.clone(),94 1,95 [].to_vec(),96 197 ));98 assert_eq!(TemplateModule::fungible_item_id(1, 1).owner, 1);99 assert_eq!(TemplateModule::balance_count(1, 1), 1000);100 assert_eq!(TemplateModule::address_tokens(1, 1), [1]);101 });102}103104#[test]105fn transfer_fungible_item() {106 new_test_ext().execute_with(|| {107 let col_name1: Vec<u16> = "Test1\0".encode_utf16().collect::<Vec<u16>>();108 let col_desc1: Vec<u16> = "TestDescription1\0".encode_utf16().collect::<Vec<u16>>();109 let token_prefix1: Vec<u8> = b"token_prefix1\0".to_vec();110 let mode: CollectionMode = CollectionMode::Fungible(3);111112 let origin1 = Origin::signed(1);113 let origin2 = Origin::signed(2);114 assert_ok!(TemplateModule::create_collection(115 origin1.clone(),116 col_name1.clone(),117 col_desc1.clone(),118 token_prefix1.clone(),119 mode120 ));121 assert_eq!(TemplateModule::collection(1).owner, 1);122123 assert_ok!(TemplateModule::create_item(124 origin1.clone(),125 1,126 [].to_vec(),127 1128 ));129 assert_eq!(TemplateModule::fungible_item_id(1, 1).owner, 1);130 assert_eq!(TemplateModule::balance_count(1, 1), 1000);131 assert_eq!(TemplateModule::address_tokens(1, 1), [1]);132133 // change owner scenario134 assert_ok!(TemplateModule::transfer(origin1.clone(), 2, 1, 1, 1000));135 assert_eq!(TemplateModule::fungible_item_id(1, 1).owner, 2);136 assert_eq!(TemplateModule::fungible_item_id(1, 1).value, 1000);137 assert_eq!(TemplateModule::balance_count(1, 1), 0);138 assert_eq!(TemplateModule::balance_count(1, 2), 1000);139 assert_eq!(TemplateModule::address_tokens(1, 1), []);140 assert_eq!(TemplateModule::address_tokens(1, 2), [1]);141142 // split item scenario143 assert_ok!(TemplateModule::transfer(origin2.clone(), 3, 1, 1, 500));144 assert_eq!(TemplateModule::fungible_item_id(1, 1).owner, 2);145 assert_eq!(TemplateModule::fungible_item_id(1, 2).owner, 3);146 assert_eq!(TemplateModule::balance_count(1, 2), 500);147 assert_eq!(TemplateModule::balance_count(1, 3), 500);148 assert_eq!(TemplateModule::address_tokens(1, 2), [1]);149 assert_eq!(TemplateModule::address_tokens(1, 3), [2]);150151 // split item and new owner has account scenario152 assert_ok!(TemplateModule::transfer(origin2.clone(), 3, 1, 1, 200));153 assert_eq!(TemplateModule::fungible_item_id(1, 1).value, 300);154 assert_eq!(TemplateModule::fungible_item_id(1, 2).value, 700);155 assert_eq!(TemplateModule::balance_count(1, 2), 300);156 assert_eq!(TemplateModule::balance_count(1, 3), 700);157 assert_eq!(TemplateModule::address_tokens(1, 2), [1]);158 assert_eq!(TemplateModule::address_tokens(1, 3), [2]);159 });160}161162#[test]163fn transfer_refungible_item() {164 new_test_ext().execute_with(|| {165 let col_name1: Vec<u16> = "Test1\0".encode_utf16().collect::<Vec<u16>>();166 let col_desc1: Vec<u16> = "TestDescription1\0".encode_utf16().collect::<Vec<u16>>();167 let token_prefix1: Vec<u8> = b"token_prefix1\0".to_vec();168 let mode: CollectionMode = CollectionMode::ReFungible(2000, 3);169170 let origin1 = Origin::signed(1);171 let origin2 = Origin::signed(2);172 assert_ok!(TemplateModule::create_collection(173 origin1.clone(),174 col_name1.clone(),175 col_desc1.clone(),176 token_prefix1.clone(),177 mode178 ));179 assert_eq!(TemplateModule::collection(1).owner, 1);180181 assert_ok!(TemplateModule::create_item(182 origin1.clone(),183 1,184 [1, 2, 3].to_vec(),185 1186 ));187 assert_eq!(188 TemplateModule::refungible_item_id(1, 1).data,189 [1, 2, 3].to_vec()190 );191 assert_eq!(192 TemplateModule::refungible_item_id(1, 1).owner[0],193 Ownership {194 owner: 1,195 fraction: 1000196 }197 );198 assert_eq!(TemplateModule::balance_count(1, 1), 1000);199 assert_eq!(TemplateModule::address_tokens(1, 1), [1]);200201 // change owner scenario202 assert_ok!(TemplateModule::transfer(origin1.clone(), 2, 1, 1, 1000));203 assert_eq!(204 TemplateModule::refungible_item_id(1, 1).owner[0],205 Ownership {206 owner: 2,207 fraction: 1000208 }209 );210 assert_eq!(TemplateModule::balance_count(1, 1), 0);211 assert_eq!(TemplateModule::balance_count(1, 2), 1000);212 assert_eq!(TemplateModule::address_tokens(1, 1), []);213 assert_eq!(TemplateModule::address_tokens(1, 2), [1]);214215 // split item scenario216 assert_ok!(TemplateModule::transfer(origin2.clone(), 3, 1, 1, 500));217 assert_eq!(218 TemplateModule::refungible_item_id(1, 1).owner[0],219 Ownership {220 owner: 2,221 fraction: 500222 }223 );224 assert_eq!(225 TemplateModule::refungible_item_id(1, 1).owner[1],226 Ownership {227 owner: 3,228 fraction: 500229 }230 );231 assert_eq!(TemplateModule::balance_count(1, 2), 500);232 assert_eq!(TemplateModule::balance_count(1, 3), 500);233 assert_eq!(TemplateModule::address_tokens(1, 2), [1]);234 assert_eq!(TemplateModule::address_tokens(1, 3), [1]);235236 // split item and new owner has account scenario237 assert_ok!(TemplateModule::transfer(origin2.clone(), 3, 1, 1, 200));238 assert_eq!(239 TemplateModule::refungible_item_id(1, 1).owner[0],240 Ownership {241 owner: 2,242 fraction: 300243 }244 );245 assert_eq!(246 TemplateModule::refungible_item_id(1, 1).owner[1],247 Ownership {248 owner: 3,249 fraction: 700250 }251 );252 assert_eq!(TemplateModule::balance_count(1, 2), 300);253 assert_eq!(TemplateModule::balance_count(1, 3), 700);254 assert_eq!(TemplateModule::address_tokens(1, 2), [1]);255 assert_eq!(TemplateModule::address_tokens(1, 3), [1]);256 });257}258259#[test]260fn transfer_nft_item() {261 new_test_ext().execute_with(|| {262 let col_name1: Vec<u16> = "Test1\0".encode_utf16().collect::<Vec<u16>>();263 let col_desc1: Vec<u16> = "TestDescription1\0".encode_utf16().collect::<Vec<u16>>();264 let token_prefix1: Vec<u8> = b"token_prefix1\0".to_vec();265 let mode: CollectionMode = CollectionMode::NFT(2000);266267 let origin1 = Origin::signed(1);268 assert_ok!(TemplateModule::create_collection(269 origin1.clone(),270 col_name1.clone(),271 col_desc1.clone(),272 token_prefix1.clone(),273 mode274 ));275 assert_eq!(TemplateModule::collection(1).owner, 1);276277 assert_ok!(TemplateModule::create_item(278 origin1.clone(),279 1,280 [1, 2, 3].to_vec(),281 1282 ));283 assert_eq!(TemplateModule::nft_item_id(1, 1).data, [1, 2, 3].to_vec());284 assert_eq!(TemplateModule::balance_count(1, 1), 1);285 assert_eq!(TemplateModule::address_tokens(1, 1), [1]);286287 // default scenario288 assert_ok!(TemplateModule::transfer(origin1.clone(), 2, 1, 1, 1000));289 assert_eq!(TemplateModule::nft_item_id(1, 1).owner, 2);290 assert_eq!(TemplateModule::balance_count(1, 1), 0);291 assert_eq!(TemplateModule::balance_count(1, 2), 1);292 assert_eq!(TemplateModule::address_tokens(1, 1), []);293 assert_eq!(TemplateModule::address_tokens(1, 2), [1]);294 });295}296297#[test]298fn nft_approve_and_transfer_from() {299 new_test_ext().execute_with(|| {300 let col_name1: Vec<u16> = "Test1\0".encode_utf16().collect::<Vec<u16>>();301 let col_desc1: Vec<u16> = "TestDescription1\0".encode_utf16().collect::<Vec<u16>>();302 let token_prefix1: Vec<u8> = b"token_prefix1\0".to_vec();303 let mode: CollectionMode = CollectionMode::NFT(2000);304305 let origin1 = Origin::signed(1);306 let origin2 = Origin::signed(2);307 assert_ok!(TemplateModule::create_collection(308 origin1.clone(),309 col_name1.clone(),310 col_desc1.clone(),311 token_prefix1.clone(),312 mode313 ));314 assert_eq!(TemplateModule::collection(1).owner, 1);315316 assert_ok!(TemplateModule::create_item(317 origin1.clone(),318 1,319 [1, 2, 3].to_vec(),320 1321 ));322 assert_eq!(TemplateModule::nft_item_id(1, 1).data, [1, 2, 3].to_vec());323 assert_eq!(TemplateModule::balance_count(1, 1), 1);324 assert_eq!(TemplateModule::address_tokens(1, 1), [1]);325326 assert_ok!(TemplateModule::set_mint_permission(origin1.clone(), 1, true));327 assert_ok!(TemplateModule::set_public_access_mode(origin1.clone(), 1, AccessMode::WhiteList));328 assert_ok!(TemplateModule::add_to_white_list(origin1.clone(), 1, 1));329 assert_ok!(TemplateModule::add_to_white_list(origin1.clone(), 1, 2));330 assert_ok!(TemplateModule::add_to_white_list(origin1.clone(), 1, 3));331332 // do approve333 assert_ok!(TemplateModule::approve(origin1.clone(), 2, 1, 1));334 assert_eq!(TemplateModule::approved(1, (1, 1)).len(), 1);335 assert_ok!(TemplateModule::approve(origin1.clone(), 3, 1, 1));336 assert_eq!(TemplateModule::approved(1, (1, 1)).len(), 2);337 assert_eq!(338 TemplateModule::approved(1, (1, 1))[0],339 ApprovePermissions {340 approved: 2,341 amount: 100000000342 }343 );344345 assert_ok!(TemplateModule::transfer_from(346 origin2.clone(),347 1,348 3,349 1,350 1,351 1352 ));353 assert_eq!(TemplateModule::approved(1, (1, 1)).len(), 0);354 });355}356357#[test]358fn refungible_approve_and_transfer_from() {359 new_test_ext().execute_with(|| {360 let col_name1: Vec<u16> = "Test1\0".encode_utf16().collect::<Vec<u16>>();361 let col_desc1: Vec<u16> = "TestDescription1\0".encode_utf16().collect::<Vec<u16>>();362 let token_prefix1: Vec<u8> = b"token_prefix1\0".to_vec();363 let mode: CollectionMode = CollectionMode::ReFungible(2000, 3);364365 let origin1 = Origin::signed(1);366 let origin2 = Origin::signed(2);367 assert_ok!(TemplateModule::create_collection(368 origin1.clone(),369 col_name1.clone(),370 col_desc1.clone(),371 token_prefix1.clone(),372 mode373 ));374 assert_eq!(TemplateModule::collection(1).owner, 1);375376 assert_ok!(TemplateModule::create_item(377 origin1.clone(),378 1,379 [1, 2, 3].to_vec(),380 1381 ));382 assert_eq!(383 TemplateModule::refungible_item_id(1, 1).data,384 [1, 2, 3].to_vec()385 );386 assert_eq!(387 TemplateModule::refungible_item_id(1, 1).owner[0],388 Ownership {389 owner: 1,390 fraction: 1000391 }392 );393 assert_eq!(TemplateModule::balance_count(1, 1), 1000);394 assert_eq!(TemplateModule::address_tokens(1, 1), [1]);395396 assert_ok!(TemplateModule::set_mint_permission(origin1.clone(), 1, true));397 assert_ok!(TemplateModule::set_public_access_mode(origin1.clone(), 1, AccessMode::WhiteList));398 assert_ok!(TemplateModule::add_to_white_list(origin1.clone(), 1, 1));399 assert_ok!(TemplateModule::add_to_white_list(origin1.clone(), 1, 2));400 assert_ok!(TemplateModule::add_to_white_list(origin1.clone(), 1, 3));401402 // do approve403 assert_ok!(TemplateModule::approve(origin1.clone(), 2, 1, 1));404 assert_eq!(TemplateModule::approved(1, (1, 1)).len(), 1);405 assert_ok!(TemplateModule::approve(origin1.clone(), 3, 1, 1));406 assert_eq!(TemplateModule::approved(1, (1, 1)).len(), 2);407 assert_eq!(408 TemplateModule::approved(1, (1, 1))[0],409 ApprovePermissions {410 approved: 2,411 amount: 100000000412 }413 );414415 assert_ok!(TemplateModule::transfer_from(416 origin2.clone(),417 1,418 3,419 1,420 1,421 100422 ));423 assert_eq!(TemplateModule::balance_count(1, 1), 900);424 assert_eq!(TemplateModule::balance_count(1, 3), 100);425 assert_eq!(TemplateModule::address_tokens(1, 1), [1]);426 assert_eq!(TemplateModule::address_tokens(1, 3), [1]);427428 assert_eq!(TemplateModule::approved(1, (1, 1)).len(), 1);429 assert_eq!(430 TemplateModule::approved(1, (1, 1))[0],431 ApprovePermissions {432 approved: 3,433 amount: 100000000434 }435 );436 });437}438439#[test]440fn fungible_approve_and_transfer_from() {441 new_test_ext().execute_with(|| {442 let col_name1: Vec<u16> = "Test1\0".encode_utf16().collect::<Vec<u16>>();443 let col_desc1: Vec<u16> = "TestDescription1\0".encode_utf16().collect::<Vec<u16>>();444 let token_prefix1: Vec<u8> = b"token_prefix1\0".to_vec();445 let mode: CollectionMode = CollectionMode::Fungible(3);446447 let origin1 = Origin::signed(1);448 let origin2 = Origin::signed(2);449 assert_ok!(TemplateModule::create_collection(450 origin1.clone(),451 col_name1.clone(),452 col_desc1.clone(),453 token_prefix1.clone(),454 mode455 ));456 assert_eq!(TemplateModule::collection(1).owner, 1);457458 assert_ok!(TemplateModule::create_item(459 origin1.clone(),460 1,461 [].to_vec(),462 1463 ));464 assert_eq!(TemplateModule::fungible_item_id(1, 1).owner, 1);465 assert_eq!(TemplateModule::balance_count(1, 1), 1000);466 assert_eq!(TemplateModule::address_tokens(1, 1), [1]);467468 assert_ok!(TemplateModule::set_mint_permission(origin1.clone(), 1, true));469 assert_ok!(TemplateModule::set_public_access_mode(origin1.clone(), 1, AccessMode::WhiteList));470 assert_ok!(TemplateModule::add_to_white_list(origin1.clone(), 1, 1));471 assert_ok!(TemplateModule::add_to_white_list(origin1.clone(), 1, 2));472 assert_ok!(TemplateModule::add_to_white_list(origin1.clone(), 1, 3));473474 // do approve475 assert_ok!(TemplateModule::approve(origin1.clone(), 2, 1, 1));476 assert_eq!(TemplateModule::approved(1, (1, 1)).len(), 1);477 assert_ok!(TemplateModule::approve(origin1.clone(), 3, 1, 1));478 assert_eq!(TemplateModule::approved(1, (1, 1)).len(), 2);479 assert_eq!(480 TemplateModule::approved(1, (1, 1))[0],481 ApprovePermissions {482 approved: 2,483 amount: 100000000484 }485 );486487 assert_ok!(TemplateModule::transfer_from(488 origin2.clone(),489 1,490 3,491 1,492 1,493 100494 ));495 assert_eq!(TemplateModule::balance_count(1, 1), 900);496 assert_eq!(TemplateModule::balance_count(1, 3), 100);497 assert_eq!(TemplateModule::address_tokens(1, 1), [1]);498 assert_eq!(TemplateModule::address_tokens(1, 3), [2]);499500 assert_eq!(TemplateModule::approved(1, (1, 1)).len(), 1);501 assert_eq!(502 TemplateModule::approved(1, (1, 1))[0],503 ApprovePermissions {504 approved: 3,505 amount: 100000000506 }507 );508509 assert_ok!(TemplateModule::approve(origin1.clone(), 2, 1, 1));510 assert_ok!(TemplateModule::transfer_from(511 origin2.clone(),512 1,513 3,514 1,515 1,516 900517 ));518 assert_eq!(TemplateModule::balance_count(1, 1), 0);519 assert_eq!(TemplateModule::balance_count(1, 3), 1000);520 assert_eq!(TemplateModule::address_tokens(1, 1), []);521 assert_eq!(TemplateModule::address_tokens(1, 3), [2]);522523 assert_eq!(TemplateModule::approved(1, (1, 1)).len(), 0);524 });525}526527#[test]528fn change_collection_owner() {529 new_test_ext().execute_with(|| {530 let col_name1: Vec<u16> = "Test1\0".encode_utf16().collect::<Vec<u16>>();531 let col_desc1: Vec<u16> = "TestDescription1\0".encode_utf16().collect::<Vec<u16>>();532 let token_prefix1: Vec<u8> = b"token_prefix1\0".to_vec();533 let mode: CollectionMode = CollectionMode::NFT(2000);534535 let origin1 = Origin::signed(1);536 assert_ok!(TemplateModule::create_collection(537 origin1.clone(),538 col_name1.clone(),539 col_desc1.clone(),540 token_prefix1.clone(),541 mode542 ));543 assert_ok!(TemplateModule::change_collection_owner(544 origin1.clone(),545 1,546 2547 ));548 assert_eq!(TemplateModule::collection(1).owner, 2);549 });550}551552#[test]553fn destroy_collection() {554 new_test_ext().execute_with(|| {555 let col_name1: Vec<u16> = "Test1\0".encode_utf16().collect::<Vec<u16>>();556 let col_desc1: Vec<u16> = "TestDescription1\0".encode_utf16().collect::<Vec<u16>>();557 let token_prefix1: Vec<u8> = b"token_prefix1\0".to_vec();558 let mode: CollectionMode = CollectionMode::NFT(2000);559560 let origin1 = Origin::signed(1);561 assert_ok!(TemplateModule::create_collection(562 origin1.clone(),563 col_name1.clone(),564 col_desc1.clone(),565 token_prefix1.clone(),566 mode567 ));568 assert_ok!(TemplateModule::destroy_collection(origin1.clone(), 1));569 });570}571572#[test]573fn burn_nft_item() {574 new_test_ext().execute_with(|| {575 let col_name1: Vec<u16> = "Test1\0".encode_utf16().collect::<Vec<u16>>();576 let col_desc1: Vec<u16> = "TestDescription1\0".encode_utf16().collect::<Vec<u16>>();577 let token_prefix1: Vec<u8> = b"token_prefix1\0".to_vec();578 let mode: CollectionMode = CollectionMode::NFT(2000);579580 let origin1 = Origin::signed(1);581 assert_ok!(TemplateModule::create_collection(582 origin1.clone(),583 col_name1.clone(),584 col_desc1.clone(),585 token_prefix1.clone(),586 mode587 ));588 assert_ok!(TemplateModule::add_collection_admin(origin1.clone(), 1, 2));589 assert_ok!(TemplateModule::create_item(590 origin1.clone(),591 1,592 [1, 2, 3].to_vec(),593 1594 ));595596 assert_eq!(TemplateModule::nft_item_id(1, 1).data, [1, 2, 3].to_vec());597598 // check balance (collection with id = 1, user id = 1)599 assert_eq!(TemplateModule::balance_count(1, 1), 1);600601 // burn item602 assert_ok!(TemplateModule::burn_item(origin1.clone(), 1, 1));603 assert_noop!(604 TemplateModule::burn_item(origin1.clone(), 1, 1),605 "Item does not exists"606 );607608 assert_eq!(TemplateModule::balance_count(1, 1), 0);609 });610}611612#[test]613fn burn_fungible_item() {614 new_test_ext().execute_with(|| {615 let col_name1: Vec<u16> = "Test1\0".encode_utf16().collect::<Vec<u16>>();616 let col_desc1: Vec<u16> = "TestDescription1\0".encode_utf16().collect::<Vec<u16>>();617 let token_prefix1: Vec<u8> = b"token_prefix1\0".to_vec();618 let mode: CollectionMode = CollectionMode::Fungible(3);619620 let origin1 = Origin::signed(1);621 assert_ok!(TemplateModule::create_collection(622 origin1.clone(),623 col_name1.clone(),624 col_desc1.clone(),625 token_prefix1.clone(),626 mode627 ));628 assert_ok!(TemplateModule::add_collection_admin(origin1.clone(), 1, 2));629 assert_ok!(TemplateModule::create_item(630 origin1.clone(),631 1,632 [].to_vec(),633 1634 ));635636 // check balance (collection with id = 1, user id = 1)637 assert_eq!(TemplateModule::balance_count(1, 1), 1000);638639 // burn item640 assert_ok!(TemplateModule::burn_item(origin1.clone(), 1, 1));641 assert_noop!(642 TemplateModule::burn_item(origin1.clone(), 1, 1),643 "Item does not exists"644 );645646 assert_eq!(TemplateModule::balance_count(1, 1), 0);647 });648}649650#[test]651fn burn_refungible_item() {652 new_test_ext().execute_with(|| {653 let col_name1: Vec<u16> = "Test1\0".encode_utf16().collect::<Vec<u16>>();654 let col_desc1: Vec<u16> = "TestDescription1\0".encode_utf16().collect::<Vec<u16>>();655 let token_prefix1: Vec<u8> = b"token_prefix1\0".to_vec();656 let mode: CollectionMode = CollectionMode::ReFungible(200, 3);657658 let origin1 = Origin::signed(1);659 let origin2 = Origin::signed(2);660 assert_ok!(TemplateModule::create_collection(661 origin1.clone(),662 col_name1.clone(),663 col_desc1.clone(),664 token_prefix1.clone(),665 mode666 ));667 668 assert_ok!(TemplateModule::set_mint_permission(origin1.clone(), 1, true));669 assert_ok!(TemplateModule::set_public_access_mode(origin1.clone(), 1, AccessMode::WhiteList));670 assert_ok!(TemplateModule::add_to_white_list(origin1.clone(), 1, 1));671672 assert_ok!(TemplateModule::add_collection_admin(origin1.clone(), 1, 2));673 assert_ok!(TemplateModule::create_item(674 origin2.clone(),675 1,676 [1, 2, 3].to_vec(),677 1678 ));679680 assert_eq!(681 TemplateModule::refungible_item_id(1, 1).data,682 [1, 2, 3].to_vec()683 );684685 // check balance (collection with id = 1, user id = 2)686 assert_eq!(TemplateModule::balance_count(1, 1), 1000);687688 // burn item689 assert_ok!(TemplateModule::burn_item(origin1.clone(), 1, 1));690 assert_noop!(691 TemplateModule::burn_item(origin1.clone(), 1, 1),692 "Item does not exists"693 );694695 assert_eq!(TemplateModule::balance_count(1, 1), 0);696 });697}698699#[test]700fn add_collection_admin() {701 new_test_ext().execute_with(|| {702 let col_name1: Vec<u16> = "Test1\0".encode_utf16().collect::<Vec<u16>>();703 let col_desc1: Vec<u16> = "TestDescription1\0".encode_utf16().collect::<Vec<u16>>();704 let token_prefix1: Vec<u8> = b"token_prefix1\0".to_vec();705 let mode: CollectionMode = CollectionMode::NFT(2000);706707 let origin1 = Origin::signed(1);708 let origin2 = Origin::signed(2);709 let origin3 = Origin::signed(3);710 assert_ok!(TemplateModule::create_collection(711 origin1.clone(),712 col_name1.clone(),713 col_desc1.clone(),714 token_prefix1.clone(),715 mode.clone()716 ));717 assert_ok!(TemplateModule::create_collection(718 origin2.clone(),719 col_name1.clone(),720 col_desc1.clone(),721 token_prefix1.clone(),722 mode.clone()723 ));724 assert_ok!(TemplateModule::create_collection(725 origin3.clone(),726 col_name1.clone(),727 col_desc1.clone(),728 token_prefix1.clone(),729 mode.clone()730 ));731732 assert_eq!(TemplateModule::collection(1).owner, 1);733 assert_eq!(TemplateModule::collection(2).owner, 2);734 assert_eq!(TemplateModule::collection(3).owner, 3);735736 // collection admin737 assert_ok!(TemplateModule::add_collection_admin(origin1.clone(), 1, 2));738 assert_ok!(TemplateModule::add_collection_admin(origin1.clone(), 1, 3));739740 assert_eq!(TemplateModule::admin_list_collection(1).contains(&2), true);741 assert_eq!(TemplateModule::admin_list_collection(1).contains(&3), true);742 });743}744745#[test]746fn remove_collection_admin() {747 new_test_ext().execute_with(|| {748 let col_name1: Vec<u16> = "Test1\0".encode_utf16().collect::<Vec<u16>>();749 let col_desc1: Vec<u16> = "TestDescription1\0".encode_utf16().collect::<Vec<u16>>();750 let token_prefix1: Vec<u8> = b"token_prefix1\0".to_vec();751 let mode: CollectionMode = CollectionMode::NFT(2000);752753 let origin1 = Origin::signed(1);754 let origin2 = Origin::signed(2);755 let origin3 = Origin::signed(3);756757 assert_ok!(TemplateModule::create_collection(758 origin1.clone(),759 col_name1.clone(),760 col_desc1.clone(),761 token_prefix1.clone(),762 mode.clone()763 ));764 assert_ok!(TemplateModule::create_collection(765 origin2.clone(),766 col_name1.clone(),767 col_desc1.clone(),768 token_prefix1.clone(),769 mode.clone()770 ));771 assert_ok!(TemplateModule::create_collection(772 origin3.clone(),773 col_name1.clone(),774 col_desc1.clone(),775 token_prefix1.clone(),776 mode.clone()777 ));778779 assert_eq!(TemplateModule::collection(1).owner, 1);780 assert_eq!(TemplateModule::collection(2).owner, 2);781 assert_eq!(TemplateModule::collection(3).owner, 3);782783 // collection admin784 assert_ok!(TemplateModule::add_collection_admin(origin1.clone(), 1, 2));785 assert_ok!(TemplateModule::add_collection_admin(origin1.clone(), 1, 3));786787 assert_eq!(TemplateModule::admin_list_collection(1).contains(&2), true);788 assert_eq!(TemplateModule::admin_list_collection(1).contains(&3), true);789790 // remove admin791 assert_ok!(TemplateModule::remove_collection_admin(792 origin2.clone(),793 1,794 3795 ));796 assert_eq!(TemplateModule::admin_list_collection(1).contains(&3), false);797 });798}799800#[test]801fn balance_of() {802 new_test_ext().execute_with(|| {803 let col_name1: Vec<u16> = "Test1\0".encode_utf16().collect::<Vec<u16>>();804 let col_desc1: Vec<u16> = "TestDescription1\0".encode_utf16().collect::<Vec<u16>>();805 let token_prefix1: Vec<u8> = b"token_prefix1\0".to_vec();806 let nft_mode: CollectionMode = CollectionMode::NFT(2000);807 let furg_mode: CollectionMode = CollectionMode::Fungible(3);808 let refung_mode: CollectionMode = CollectionMode::ReFungible(2000, 3);809810 let origin1 = Origin::signed(1);811812 assert_ok!(TemplateModule::create_collection(813 origin1.clone(),814 col_name1.clone(),815 col_desc1.clone(),816 token_prefix1.clone(),817 nft_mode.clone()818 ));819 assert_ok!(TemplateModule::create_collection(820 origin1.clone(),821 col_name1.clone(),822 col_desc1.clone(),823 token_prefix1.clone(),824 furg_mode.clone()825 ));826 assert_ok!(TemplateModule::create_collection(827 origin1.clone(),828 col_name1.clone(),829 col_desc1.clone(),830 token_prefix1.clone(),831 refung_mode.clone()832 ));833834 assert_eq!(TemplateModule::collection(1).owner, 1);835 assert_eq!(TemplateModule::collection(2).owner, 1);836 assert_eq!(TemplateModule::collection(3).owner, 1);837838 // check balance before839 assert_eq!(TemplateModule::balance_count(1, 1), 0);840 assert_eq!(TemplateModule::balance_count(2, 1), 0);841 assert_eq!(TemplateModule::balance_count(3, 1), 0);842843 // create item844 assert_ok!(TemplateModule::create_item(845 origin1.clone(),846 1,847 [1, 1, 1].to_vec(),848 1849 ));850851 assert_ok!(TemplateModule::create_item(852 origin1.clone(),853 2,854 [].to_vec(),855 1856 ));857858 assert_ok!(TemplateModule::create_item(859 origin1.clone(),860 3,861 [1, 1, 1].to_vec(),862 1863 ));864865 // check balance (collection with id = 1, user id = 1)866 assert_eq!(TemplateModule::balance_count(1, 1), 1);867 assert_eq!(TemplateModule::balance_count(2, 1), 1000);868 assert_eq!(TemplateModule::balance_count(3, 1), 1000);869 assert_eq!(TemplateModule::nft_item_id(1, 1).owner, 1);870 assert_eq!(TemplateModule::fungible_item_id(2, 1).owner, 1);871 assert_eq!(TemplateModule::refungible_item_id(3, 1).owner[0].owner, 1);872 });873}874875#[test]876fn approve() {877 new_test_ext().execute_with(|| {878 let col_name1: Vec<u16> = "Test1\0".encode_utf16().collect::<Vec<u16>>();879 let col_desc1: Vec<u16> = "TestDescription1\0".encode_utf16().collect::<Vec<u16>>();880 let token_prefix1: Vec<u8> = b"token_prefix1\0".to_vec();881 let nft_mode: CollectionMode = CollectionMode::NFT(2000);882 let origin1 = Origin::signed(1);883884 assert_ok!(TemplateModule::create_collection(885 origin1.clone(),886 col_name1.clone(),887 col_desc1.clone(),888 token_prefix1.clone(),889 nft_mode.clone()890 ));891892 assert_eq!(TemplateModule::collection(1).owner, 1);893894 // create item895 assert_ok!(TemplateModule::create_item(896 origin1.clone(),897 1,898 [1, 1, 1].to_vec(),899 1900 ));901902 // approve903 assert_ok!(TemplateModule::approve(origin1.clone(), 2, 1, 1));904 assert_eq!(TemplateModule::approved(1, (1, 1))[0].approved, 2);905 });906}907908#[test]909fn transfer_from() {910 new_test_ext().execute_with(|| {911 let col_name1: Vec<u16> = "Test1\0".encode_utf16().collect::<Vec<u16>>();912 let col_desc1: Vec<u16> = "TestDescription1\0".encode_utf16().collect::<Vec<u16>>();913 let token_prefix1: Vec<u8> = b"token_prefix1\0".to_vec();914 let mode: CollectionMode = CollectionMode::NFT(2000);915 let origin1 = Origin::signed(1);916 let origin2 = Origin::signed(2);917918 assert_ok!(TemplateModule::create_collection(919 origin1.clone(),920 col_name1.clone(),921 col_desc1.clone(),922 token_prefix1.clone(),923 mode924 ));925926 assert_eq!(TemplateModule::collection(1).owner, 1);927928 // create item929 assert_ok!(TemplateModule::create_item(930 origin1.clone(),931 1,932 [1, 1, 1].to_vec(),933 1934 ));935936 // approve937 assert_ok!(TemplateModule::approve(origin1.clone(), 2, 1, 1));938 assert_eq!(TemplateModule::approved(1, (1, 1))[0].approved, 2);939940 assert_ok!(TemplateModule::set_mint_permission(origin1.clone(), 1, true));941 assert_ok!(TemplateModule::set_public_access_mode(origin1.clone(), 1, AccessMode::WhiteList));942 assert_ok!(TemplateModule::add_to_white_list(origin1.clone(), 1, 1));943 assert_ok!(TemplateModule::add_to_white_list(origin1.clone(), 1, 2));944 assert_ok!(TemplateModule::add_to_white_list(origin1.clone(), 1, 3));945946 assert_ok!(TemplateModule::transfer_from(947 origin2.clone(),948 1,949 2,950 1,951 1,952 1953 ));954955 // after transfer956 assert_eq!(TemplateModule::balance_count(1, 1), 0);957 assert_eq!(TemplateModule::balance_count(1, 2), 1);958 });959}960961// #endregion962963// Coverage tests region964// #region965966#[test]967fn owner_can_add_address_to_white_list() {968 new_test_ext().execute_with(|| {969 let col_name1: Vec<u16> = "Test1\0".encode_utf16().collect::<Vec<u16>>();970 let col_desc1: Vec<u16> = "TestDescription1\0".encode_utf16().collect::<Vec<u16>>();971 let token_prefix1: Vec<u8> = b"token_prefix1\0".to_vec();972 let mode: CollectionMode = CollectionMode::NFT(2000);973 let origin1 = Origin::signed(1);974975 assert_ok!(TemplateModule::create_collection(976 origin1.clone(),977 col_name1.clone(),978 col_desc1.clone(),979 token_prefix1.clone(),980 mode981 ));982983 assert_ok!(TemplateModule::add_to_white_list(origin1.clone(), 1, 2));984 assert_eq!(TemplateModule::white_list(1)[0], 2);985 });986}987988#[test]989fn admin_can_add_address_to_white_list() {990 new_test_ext().execute_with(|| {991 let col_name1: Vec<u16> = "Test1\0".encode_utf16().collect::<Vec<u16>>();992 let col_desc1: Vec<u16> = "TestDescription1\0".encode_utf16().collect::<Vec<u16>>();993 let token_prefix1: Vec<u8> = b"token_prefix1\0".to_vec();994 let mode: CollectionMode = CollectionMode::NFT(2000);995 let origin1 = Origin::signed(1);996 let origin2 = Origin::signed(2);997998 assert_ok!(TemplateModule::create_collection(999 origin1.clone(),1000 col_name1.clone(),1001 col_desc1.clone(),1002 token_prefix1.clone(),1003 mode1004 ));10051006 assert_ok!(TemplateModule::add_collection_admin(origin1.clone(), 1, 2));1007 assert_ok!(TemplateModule::add_to_white_list(origin2.clone(), 1, 3));1008 assert_eq!(TemplateModule::white_list(1)[0], 3);1009 });1010}10111012#[test]1013fn nonprivileged_user_cannot_add_address_to_white_list() {1014 new_test_ext().execute_with(|| {1015 let col_name1: Vec<u16> = "Test1\0".encode_utf16().collect::<Vec<u16>>();1016 let col_desc1: Vec<u16> = "TestDescription1\0".encode_utf16().collect::<Vec<u16>>();1017 let token_prefix1: Vec<u8> = b"token_prefix1\0".to_vec();1018 let mode: CollectionMode = CollectionMode::NFT(2000);1019 let origin1 = Origin::signed(1);1020 let origin2 = Origin::signed(2);10211022 assert_ok!(TemplateModule::create_collection(1023 origin1.clone(),1024 col_name1.clone(),1025 col_desc1.clone(),1026 token_prefix1.clone(),1027 mode1028 ));10291030 assert_noop!(TemplateModule::add_to_white_list(origin2.clone(), 1, 3), "You do not have permissions to modify this collection");1031 });1032}10331034#[test]1035fn nobody_can_add_address_to_white_list_of_nonexisting_collection() {1036 new_test_ext().execute_with(|| {10371038 let origin1 = Origin::signed(1);1039 assert_noop!(TemplateModule::add_to_white_list(origin1.clone(), 1, 2), "This collection does not exist");1040 });1041}10421043#[test]1044fn nobody_can_add_address_to_white_list_of_deleted_collection() {1045 new_test_ext().execute_with(|| {1046 let col_name1: Vec<u16> = "Test1\0".encode_utf16().collect::<Vec<u16>>();1047 let col_desc1: Vec<u16> = "TestDescription1\0".encode_utf16().collect::<Vec<u16>>();1048 let token_prefix1: Vec<u8> = b"token_prefix1\0".to_vec();1049 let mode: CollectionMode = CollectionMode::NFT(2000);1050 let origin1 = Origin::signed(1);10511052 assert_ok!(TemplateModule::create_collection(1053 origin1.clone(),1054 col_name1.clone(),1055 col_desc1.clone(),1056 token_prefix1.clone(),1057 mode1058 ));10591060 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");1062 });1063}10641065// If address is already added to white list, nothing happens1066#[test]1067fn address_is_already_added_to_white_list() {1068 new_test_ext().execute_with(|| {10691070 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>>();1072 let token_prefix1: Vec<u8> = b"token_prefix1\0".to_vec();1073 let mode: CollectionMode = CollectionMode::NFT(2000);1074 let origin1 = Origin::signed(1);10751076 assert_ok!(TemplateModule::create_collection(1077 origin1.clone(),1078 col_name1.clone(),1079 col_desc1.clone(),1080 token_prefix1.clone(),1081 mode1082 ));10831084 assert_ok!(TemplateModule::add_to_white_list(origin1.clone(), 1, 2));1085 assert_ok!(TemplateModule::add_to_white_list(origin1.clone(), 1, 2));1086 assert_eq!(TemplateModule::white_list(1)[0], 2);1087 assert_eq!(TemplateModule::white_list(1).len(), 1);1088 });1089}10901091#[test]1092fn owner_can_remove_address_from_white_list() {1093 new_test_ext().execute_with(|| {1094 1095 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>>();1097 let token_prefix1: Vec<u8> = b"token_prefix1\0".to_vec();1098 let mode: CollectionMode = CollectionMode::NFT(2000);1099 let origin1 = Origin::signed(1);11001101 assert_ok!(TemplateModule::create_collection(1102 origin1.clone(),1103 col_name1.clone(),1104 col_desc1.clone(),1105 token_prefix1.clone(),1106 mode1107 ));11081109 assert_ok!(TemplateModule::add_to_white_list(origin1.clone(), 1, 2));1110 assert_ok!(TemplateModule::remove_from_white_list(origin1.clone(), 1, 2));1111 assert_eq!(TemplateModule::white_list(1).len(), 0);1112 });1113}11141115#[test]1116fn admin_can_remove_address_from_white_list() {1117 new_test_ext().execute_with(|| {11181119 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>>();1121 let token_prefix1: Vec<u8> = b"token_prefix1\0".to_vec();1122 let mode: CollectionMode = CollectionMode::NFT(2000);1123 let origin1 = Origin::signed(1);1124 let origin2 = Origin::signed(2);11251126 assert_ok!(TemplateModule::create_collection(1127 origin1.clone(),1128 col_name1.clone(),1129 col_desc1.clone(),1130 token_prefix1.clone(),1131 mode1132 ));11331134 assert_ok!(TemplateModule::add_collection_admin(origin1.clone(), 1, 2));11351136 assert_ok!(TemplateModule::add_to_white_list(origin1.clone(), 1, 3));1137 assert_ok!(TemplateModule::remove_from_white_list(origin2.clone(), 1, 3));1138 assert_eq!(TemplateModule::white_list(1).len(), 0);1139 });1140}11411142#[test]1143fn nonprivileged_user_cannot_remove_address_from_white_list() {1144 new_test_ext().execute_with(|| {11451146 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>>();1148 let token_prefix1: Vec<u8> = b"token_prefix1\0".to_vec();1149 let mode: CollectionMode = CollectionMode::NFT(2000);1150 let origin1 = Origin::signed(1);1151 let origin2 = Origin::signed(2);11521153 assert_ok!(TemplateModule::create_collection(1154 origin1.clone(),1155 col_name1.clone(),1156 col_desc1.clone(),1157 token_prefix1.clone(),1158 mode1159 ));11601161 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");1163 assert_eq!(TemplateModule::white_list(1)[0], 2);1164 });1165}11661167#[test]1168fn nobody_can_remove_address_from_white_list_of_nonexisting_collection() {1169 new_test_ext().execute_with(|| {11701171 let origin1 = Origin::signed(1);1172 assert_noop!(TemplateModule::remove_from_white_list(origin1.clone(), 1, 2), "This collection does not exist");1173 });1174}11751176#[test]1177fn nobody_can_remove_address_from_white_list_of_deleted_collection() {1178 new_test_ext().execute_with(|| {11791180 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>>();1182 let token_prefix1: Vec<u8> = b"token_prefix1\0".to_vec();1183 let mode: CollectionMode = CollectionMode::NFT(2000);1184 let origin1 = Origin::signed(1);1185 let origin2 = Origin::signed(2);11861187 assert_ok!(TemplateModule::create_collection(1188 origin1.clone(),1189 col_name1.clone(),1190 col_desc1.clone(),1191 token_prefix1.clone(),1192 mode1193 ));11941195 assert_ok!(TemplateModule::add_to_white_list(origin1.clone(), 1, 2));1196 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");1198 assert_eq!(TemplateModule::white_list(1).len(), 0);1199 });1200}12011202// If address is already removed from white list, nothing happens1203#[test]1204fn address_is_already_removed_from_white_list() {1205 new_test_ext().execute_with(|| {1206 let col_name1: Vec<u16> = "Test1\0".encode_utf16().collect::<Vec<u16>>();1207 let col_desc1: Vec<u16> = "TestDescription1\0".encode_utf16().collect::<Vec<u16>>();1208 let token_prefix1: Vec<u8> = b"token_prefix1\0".to_vec();1209 let mode: CollectionMode = CollectionMode::NFT(2000);1210 let origin1 = Origin::signed(1);12111212 assert_ok!(TemplateModule::create_collection(1213 origin1.clone(),1214 col_name1.clone(),1215 col_desc1.clone(),1216 token_prefix1.clone(),1217 mode1218 ));12191220 assert_ok!(TemplateModule::add_to_white_list(origin1.clone(), 1, 2));1221 assert_ok!(TemplateModule::remove_from_white_list(origin1.clone(), 1, 2));1222 assert_ok!(TemplateModule::remove_from_white_list(origin1.clone(), 1, 2));1223 assert_eq!(TemplateModule::white_list(1).len(), 0);1224 });1225}12261227// If Public Access mode is set to WhiteList, tokens can’t be transferred from a non-whitelisted address with transfer or transferFrom (2 tests)1228#[test]1229fn white_list_test_1() {1230 new_test_ext().execute_with(|| {1231 let col_name1: Vec<u16> = "Test1\0".encode_utf16().collect::<Vec<u16>>();1232 let col_desc1: Vec<u16> = "TestDescription1\0".encode_utf16().collect::<Vec<u16>>();1233 let token_prefix1: Vec<u8> = b"token_prefix1\0".to_vec();1234 let mode: CollectionMode = CollectionMode::NFT(2000);12351236 let origin1 = Origin::signed(1);1237 assert_ok!(TemplateModule::create_collection(1238 origin1.clone(),1239 col_name1.clone(),1240 col_desc1.clone(),1241 token_prefix1.clone(),1242 mode1243 ));1244 assert_eq!(TemplateModule::collection(1).owner, 1);12451246 assert_ok!(TemplateModule::create_item(1247 origin1.clone(),1248 1,1249 [1, 2, 3].to_vec(),1250 11251 ));12521253 assert_ok!(TemplateModule::set_public_access_mode(origin1.clone(), 1, AccessMode::WhiteList));1254 assert_ok!(TemplateModule::add_to_white_list(origin1.clone(), 1, 2));12551256 assert_noop!(TemplateModule::transfer(1257 origin1.clone(),1258 3,1259 1,1260 1,1261 11262 ), "Address is not in white list");1263 });1264}12651266#[test]1267fn white_list_test_2() {1268 new_test_ext().execute_with(|| {1269 let col_name1: Vec<u16> = "Test1\0".encode_utf16().collect::<Vec<u16>>();1270 let col_desc1: Vec<u16> = "TestDescription1\0".encode_utf16().collect::<Vec<u16>>();1271 let token_prefix1: Vec<u8> = b"token_prefix1\0".to_vec();1272 let mode: CollectionMode = CollectionMode::NFT(2000);12731274 let origin1 = Origin::signed(1);1275 assert_ok!(TemplateModule::create_collection(1276 origin1.clone(),1277 col_name1.clone(),1278 col_desc1.clone(),1279 token_prefix1.clone(),1280 mode1281 ));1282 assert_eq!(TemplateModule::collection(1).owner, 1);12831284 assert_ok!(TemplateModule::create_item(1285 origin1.clone(),1286 1,1287 [1, 2, 3].to_vec(),1288 11289 ));12901291 assert_ok!(TemplateModule::set_public_access_mode(origin1.clone(), 1, AccessMode::WhiteList));1292 assert_ok!(TemplateModule::add_to_white_list(origin1.clone(), 1, 1));1293 assert_ok!(TemplateModule::add_to_white_list(origin1.clone(), 1, 2));12941295 // do approve1296 assert_ok!(TemplateModule::approve(origin1.clone(), 1, 1, 1));1297 assert_eq!(TemplateModule::approved(1, (1, 1)).len(), 1);12981299 assert_ok!(TemplateModule::remove_from_white_list(origin1.clone(), 1, 1));13001301 assert_noop!(TemplateModule::transfer_from(1302 origin1.clone(),1303 1,1304 3,1305 1,1306 1,1307 11308 ), "Address is not in white list");1309 });1310}13111312// If Public Access mode is set to WhiteList, tokens can’t be transferred to a non-whitelisted address with transfer or transferFrom (2 tests)1313#[test]1314fn white_list_test_3() {1315 new_test_ext().execute_with(|| {1316 let col_name1: Vec<u16> = "Test1\0".encode_utf16().collect::<Vec<u16>>();1317 let col_desc1: Vec<u16> = "TestDescription1\0".encode_utf16().collect::<Vec<u16>>();1318 let token_prefix1: Vec<u8> = b"token_prefix1\0".to_vec();1319 let mode: CollectionMode = CollectionMode::NFT(2000);13201321 let origin1 = Origin::signed(1);1322 assert_ok!(TemplateModule::create_collection(1323 origin1.clone(),1324 col_name1.clone(),1325 col_desc1.clone(),1326 token_prefix1.clone(),1327 mode1328 ));1329 assert_eq!(TemplateModule::collection(1).owner, 1);13301331 assert_ok!(TemplateModule::create_item(1332 origin1.clone(),1333 1,1334 [1, 2, 3].to_vec(),1335 11336 ));13371338 assert_ok!(TemplateModule::set_public_access_mode(origin1.clone(), 1, AccessMode::WhiteList));1339 assert_ok!(TemplateModule::add_to_white_list(origin1.clone(), 1, 1));13401341 assert_noop!(TemplateModule::transfer(1342 origin1.clone(),1343 3,1344 1,1345 1,1346 11347 ), "Address is not in white list");1348 });1349}13501351#[test]1352fn white_list_test_4() {1353 new_test_ext().execute_with(|| {1354 let col_name1: Vec<u16> = "Test1\0".encode_utf16().collect::<Vec<u16>>();1355 let col_desc1: Vec<u16> = "TestDescription1\0".encode_utf16().collect::<Vec<u16>>();1356 let token_prefix1: Vec<u8> = b"token_prefix1\0".to_vec();1357 let mode: CollectionMode = CollectionMode::NFT(2000);13581359 let origin1 = Origin::signed(1);1360 assert_ok!(TemplateModule::create_collection(1361 origin1.clone(),1362 col_name1.clone(),1363 col_desc1.clone(),1364 token_prefix1.clone(),1365 mode1366 ));1367 assert_eq!(TemplateModule::collection(1).owner, 1);13681369 assert_ok!(TemplateModule::create_item(1370 origin1.clone(),1371 1,1372 [1, 2, 3].to_vec(),1373 11374 ));13751376 assert_ok!(TemplateModule::set_public_access_mode(origin1.clone(), 1, AccessMode::WhiteList));1377 assert_ok!(TemplateModule::add_to_white_list(origin1.clone(), 1, 1));1378 assert_ok!(TemplateModule::add_to_white_list(origin1.clone(), 1, 2));13791380 // do approve1381 assert_ok!(TemplateModule::approve(origin1.clone(), 1, 1, 1));1382 assert_eq!(TemplateModule::approved(1, (1, 1)).len(), 1);13831384 assert_ok!(TemplateModule::remove_from_white_list(origin1.clone(), 1, 2));13851386 assert_noop!(TemplateModule::transfer_from(1387 origin1.clone(),1388 1,1389 3,1390 1,1391 1,1392 11393 ), "Address is not in white list");1394 });1395}13961397// If Public Access mode is set to WhiteList, tokens can’t be destroyed by a non-whitelisted address (even if it owned them before enabling WhiteList mode)1398#[test]1399fn white_list_test_5() {1400 new_test_ext().execute_with(|| {1401 let col_name1: Vec<u16> = "Test1\0".encode_utf16().collect::<Vec<u16>>();1402 let col_desc1: Vec<u16> = "TestDescription1\0".encode_utf16().collect::<Vec<u16>>();1403 let token_prefix1: Vec<u8> = b"token_prefix1\0".to_vec();1404 let mode: CollectionMode = CollectionMode::NFT(2000);14051406 let origin1 = Origin::signed(1);1407 assert_ok!(TemplateModule::create_collection(1408 origin1.clone(),1409 col_name1.clone(),1410 col_desc1.clone(),1411 token_prefix1.clone(),1412 mode1413 ));1414 assert_eq!(TemplateModule::collection(1).owner, 1);14151416 assert_ok!(TemplateModule::create_item(1417 origin1.clone(),1418 1,1419 [1, 2, 3].to_vec(),1420 11421 ));14221423 assert_ok!(TemplateModule::set_public_access_mode(origin1.clone(), 1, AccessMode::WhiteList));1424 assert_noop!(TemplateModule::burn_item(origin1.clone(), 1, 1), "Address is not in white list");1425 });1426}14271428// If Public Access mode is set to WhiteList, oken transfers can’t be Approved by a non-whitelisted address (see Approve method).1429#[test]1430fn white_list_test_6() {1431 new_test_ext().execute_with(|| {1432 let col_name1: Vec<u16> = "Test1\0".encode_utf16().collect::<Vec<u16>>();1433 let col_desc1: Vec<u16> = "TestDescription1\0".encode_utf16().collect::<Vec<u16>>();1434 let token_prefix1: Vec<u8> = b"token_prefix1\0".to_vec();1435 let mode: CollectionMode = CollectionMode::NFT(2000);14361437 let origin1 = Origin::signed(1);1438 assert_ok!(TemplateModule::create_collection(1439 origin1.clone(),1440 col_name1.clone(),1441 col_desc1.clone(),1442 token_prefix1.clone(),1443 mode1444 ));1445 assert_ok!(TemplateModule::set_public_access_mode(origin1.clone(), 1, AccessMode::WhiteList));14461447 // do approve1448 assert_noop!(TemplateModule::approve(origin1.clone(), 1, 1, 1), "Address is not in white list");1449 });1450}14511452// If Public Access mode is set to WhiteList, tokens can be transferred from a whitelisted address with transfer or transferFrom (2 tests) and1453// tokens can be transferred from a whitelisted address with transfer or transferFrom (2 tests)1454#[test]1455fn white_list_test_7() {1456 new_test_ext().execute_with(|| {1457 let col_name1: Vec<u16> = "Test1\0".encode_utf16().collect::<Vec<u16>>();1458 let col_desc1: Vec<u16> = "TestDescription1\0".encode_utf16().collect::<Vec<u16>>();1459 let token_prefix1: Vec<u8> = b"token_prefix1\0".to_vec();1460 let mode: CollectionMode = CollectionMode::NFT(2000);14611462 let origin1 = Origin::signed(1);1463 assert_ok!(TemplateModule::create_collection(1464 origin1.clone(),1465 col_name1.clone(),1466 col_desc1.clone(),1467 token_prefix1.clone(),1468 mode1469 ));1470 assert_eq!(TemplateModule::collection(1).owner, 1);14711472 assert_ok!(TemplateModule::create_item(1473 origin1.clone(),1474 1,1475 [1, 2, 3].to_vec(),1476 11477 ));14781479 assert_ok!(TemplateModule::set_public_access_mode(origin1.clone(), 1, AccessMode::WhiteList));1480 assert_ok!(TemplateModule::add_to_white_list(origin1.clone(), 1, 1));1481 assert_ok!(TemplateModule::add_to_white_list(origin1.clone(), 1, 2));14821483 assert_ok!(TemplateModule::transfer(1484 origin1.clone(),1485 2,1486 1,1487 1,1488 11489 ));1490 });1491}14921493#[test]1494fn white_list_test_8() {1495 new_test_ext().execute_with(|| {1496 let col_name1: Vec<u16> = "Test1\0".encode_utf16().collect::<Vec<u16>>();1497 let col_desc1: Vec<u16> = "TestDescription1\0".encode_utf16().collect::<Vec<u16>>();1498 let token_prefix1: Vec<u8> = b"token_prefix1\0".to_vec();1499 let mode: CollectionMode = CollectionMode::NFT(2000);15001501 let origin1 = Origin::signed(1);1502 assert_ok!(TemplateModule::create_collection(1503 origin1.clone(),1504 col_name1.clone(),1505 col_desc1.clone(),1506 token_prefix1.clone(),1507 mode1508 ));1509 assert_eq!(TemplateModule::collection(1).owner, 1);15101511 assert_ok!(TemplateModule::create_item(1512 origin1.clone(),1513 1,1514 [1, 2, 3].to_vec(),1515 11516 ));15171518 assert_ok!(TemplateModule::set_public_access_mode(origin1.clone(), 1, AccessMode::WhiteList));1519 assert_ok!(TemplateModule::add_to_white_list(origin1.clone(), 1, 1));1520 assert_ok!(TemplateModule::add_to_white_list(origin1.clone(), 1, 2));15211522 // do approve1523 assert_ok!(TemplateModule::approve(origin1.clone(), 1, 1, 1));1524 assert_eq!(TemplateModule::approved(1, (1, 1)).len(), 1);15251526 assert_ok!(TemplateModule::transfer_from(1527 origin1.clone(),1528 1,1529 2,1530 1,1531 1,1532 11533 ));1534 });1535}15361537// If Public Access mode is set to WhiteList, and Mint Permission is set to false, tokens can be created by owner.1538#[test]1539fn white_list_test_9() {1540 new_test_ext().execute_with(|| {1541 let col_name1: Vec<u16> = "Test1\0".encode_utf16().collect::<Vec<u16>>();1542 let col_desc1: Vec<u16> = "TestDescription1\0".encode_utf16().collect::<Vec<u16>>();1543 let token_prefix1: Vec<u8> = b"token_prefix1\0".to_vec();1544 let mode: CollectionMode = CollectionMode::NFT(2000);15451546 let origin1 = Origin::signed(1);1547 assert_ok!(TemplateModule::create_collection(1548 origin1.clone(),1549 col_name1.clone(),1550 col_desc1.clone(),1551 token_prefix1.clone(),1552 mode1553 ));15541555 assert_ok!(TemplateModule::set_public_access_mode(origin1.clone(), 1, AccessMode::WhiteList));1556 assert_ok!(TemplateModule::set_mint_permission(origin1.clone(), 1, false));15571558 assert_ok!(TemplateModule::create_item(1559 origin1.clone(),1560 1,1561 [1, 2, 3].to_vec(),1562 11563 ));1564 });1565}15661567// If Public Access mode is set to WhiteList, and Mint Permission is set to false, tokens can be created by admin.1568#[test]1569fn white_list_test_10() {1570 new_test_ext().execute_with(|| {1571 let col_name1: Vec<u16> = "Test1\0".encode_utf16().collect::<Vec<u16>>();1572 let col_desc1: Vec<u16> = "TestDescription1\0".encode_utf16().collect::<Vec<u16>>();1573 let token_prefix1: Vec<u8> = b"token_prefix1\0".to_vec();1574 let mode: CollectionMode = CollectionMode::NFT(2000);15751576 let origin1 = Origin::signed(1);1577 let origin2 = Origin::signed(2);1578 assert_ok!(TemplateModule::create_collection(1579 origin1.clone(),1580 col_name1.clone(),1581 col_desc1.clone(),1582 token_prefix1.clone(),1583 mode1584 ));15851586 assert_ok!(TemplateModule::set_public_access_mode(origin1.clone(), 1, AccessMode::WhiteList));1587 assert_ok!(TemplateModule::set_mint_permission(origin1.clone(), 1, false));15881589 assert_ok!(TemplateModule::add_collection_admin(origin1.clone(), 1, 2));15901591 assert_ok!(TemplateModule::create_item(1592 origin2.clone(),1593 1,1594 [1, 2, 3].to_vec(),1595 21596 ));1597 });1598}15991600// If Public Access mode is set to WhiteList, and Mint Permission is set to false, tokens cannot be created by non-privileged and white listed address.1601#[test]1602fn white_list_test_11() {1603 new_test_ext().execute_with(|| {1604 let col_name1: Vec<u16> = "Test1\0".encode_utf16().collect::<Vec<u16>>();1605 let col_desc1: Vec<u16> = "TestDescription1\0".encode_utf16().collect::<Vec<u16>>();1606 let token_prefix1: Vec<u8> = b"token_prefix1\0".to_vec();1607 let mode: CollectionMode = CollectionMode::NFT(2000);16081609 let origin1 = Origin::signed(1);1610 let origin2 = Origin::signed(2);1611 assert_ok!(TemplateModule::create_collection(1612 origin1.clone(),1613 col_name1.clone(),1614 col_desc1.clone(),1615 token_prefix1.clone(),1616 mode1617 ));16181619 assert_ok!(TemplateModule::set_public_access_mode(origin1.clone(), 1, AccessMode::WhiteList));1620 assert_ok!(TemplateModule::set_mint_permission(origin1.clone(), 1, false));1621 assert_ok!(TemplateModule::add_to_white_list(origin1.clone(), 1, 2));16221623 assert_noop!(TemplateModule::create_item(1624 origin2.clone(),1625 1,1626 [1, 2, 3].to_vec(),1627 21628 ), "Collection is not in mint mode");1629 });1630}16311632// If Public Access mode is set to WhiteList, and Mint Permission is set to false, tokens cannot be created by non-privileged and non-white listed address.1633#[test]1634fn white_list_test_12() {1635 new_test_ext().execute_with(|| {1636 let col_name1: Vec<u16> = "Test1\0".encode_utf16().collect::<Vec<u16>>();1637 let col_desc1: Vec<u16> = "TestDescription1\0".encode_utf16().collect::<Vec<u16>>();1638 let token_prefix1: Vec<u8> = b"token_prefix1\0".to_vec();1639 let mode: CollectionMode = CollectionMode::NFT(2000);16401641 let origin1 = Origin::signed(1);1642 let origin2 = Origin::signed(2);1643 assert_ok!(TemplateModule::create_collection(1644 origin1.clone(),1645 col_name1.clone(),1646 col_desc1.clone(),1647 token_prefix1.clone(),1648 mode1649 ));16501651 assert_ok!(TemplateModule::set_public_access_mode(origin1.clone(), 1, AccessMode::WhiteList));1652 assert_ok!(TemplateModule::set_mint_permission(origin1.clone(), 1, false));16531654 assert_noop!(TemplateModule::create_item(1655 origin2.clone(),1656 1,1657 [1, 2, 3].to_vec(),1658 21659 ), "Collection is not in mint mode");1660 });1661}16621663// If Public Access mode is set to WhiteList, and Mint Permission is set to true, tokens can be created by owner.1664#[test]1665fn white_list_test_13() {1666 new_test_ext().execute_with(|| {1667 let col_name1: Vec<u16> = "Test1\0".encode_utf16().collect::<Vec<u16>>();1668 let col_desc1: Vec<u16> = "TestDescription1\0".encode_utf16().collect::<Vec<u16>>();1669 let token_prefix1: Vec<u8> = b"token_prefix1\0".to_vec();1670 let mode: CollectionMode = CollectionMode::NFT(2000);16711672 let origin1 = Origin::signed(1);1673 assert_ok!(TemplateModule::create_collection(1674 origin1.clone(),1675 col_name1.clone(),1676 col_desc1.clone(),1677 token_prefix1.clone(),1678 mode1679 ));16801681 assert_ok!(TemplateModule::set_public_access_mode(origin1.clone(), 1, AccessMode::WhiteList));1682 assert_ok!(TemplateModule::set_mint_permission(origin1.clone(), 1, true));16831684 assert_ok!(TemplateModule::create_item(1685 origin1.clone(),1686 1,1687 [1, 2, 3].to_vec(),1688 11689 ));1690 });1691}16921693// If Public Access mode is set to WhiteList, and Mint Permission is set to true, tokens can be created by admin.1694#[test]1695fn white_list_test_14() {1696 new_test_ext().execute_with(|| {1697 let col_name1: Vec<u16> = "Test1\0".encode_utf16().collect::<Vec<u16>>();1698 let col_desc1: Vec<u16> = "TestDescription1\0".encode_utf16().collect::<Vec<u16>>();1699 let token_prefix1: Vec<u8> = b"token_prefix1\0".to_vec();1700 let mode: CollectionMode = CollectionMode::NFT(2000);17011702 let origin1 = Origin::signed(1);1703 let origin2 = Origin::signed(2);1704 assert_ok!(TemplateModule::create_collection(1705 origin1.clone(),1706 col_name1.clone(),1707 col_desc1.clone(),1708 token_prefix1.clone(),1709 mode1710 ));17111712 assert_ok!(TemplateModule::set_public_access_mode(origin1.clone(), 1, AccessMode::WhiteList));1713 assert_ok!(TemplateModule::set_mint_permission(origin1.clone(), 1, true));17141715 assert_ok!(TemplateModule::add_collection_admin(origin1.clone(), 1, 2));17161717 assert_ok!(TemplateModule::create_item(1718 origin2.clone(),1719 1,1720 [1, 2, 3].to_vec(),1721 21722 ));1723 });1724}17251726// If Public Access mode is set to WhiteList, and Mint Permission is set to true, tokens cannot be created by non-privileged and non-white listed address.1727#[test]1728fn white_list_test_15() {1729 new_test_ext().execute_with(|| {1730 let col_name1: Vec<u16> = "Test1\0".encode_utf16().collect::<Vec<u16>>();1731 let col_desc1: Vec<u16> = "TestDescription1\0".encode_utf16().collect::<Vec<u16>>();1732 let token_prefix1: Vec<u8> = b"token_prefix1\0".to_vec();1733 let mode: CollectionMode = CollectionMode::NFT(2000);17341735 let origin1 = Origin::signed(1);1736 let origin2 = Origin::signed(2);1737 assert_ok!(TemplateModule::create_collection(1738 origin1.clone(),1739 col_name1.clone(),1740 col_desc1.clone(),1741 token_prefix1.clone(),1742 mode1743 ));17441745 assert_ok!(TemplateModule::set_public_access_mode(origin1.clone(), 1, AccessMode::WhiteList));1746 assert_ok!(TemplateModule::set_mint_permission(origin1.clone(), 1, true));17471748 assert_noop!(TemplateModule::create_item(1749 origin2.clone(),1750 1,1751 [1, 2, 3].to_vec(),1752 21753 ), "Address is not in white list");1754 });1755}17561757// If Public Access mode is set to WhiteList, and Mint Permission is set to true, tokens can be created by non-privileged and white listed address.1758#[test]1759fn white_list_test_16() {1760 new_test_ext().execute_with(|| {1761 let col_name1: Vec<u16> = "Test1\0".encode_utf16().collect::<Vec<u16>>();1762 let col_desc1: Vec<u16> = "TestDescription1\0".encode_utf16().collect::<Vec<u16>>();1763 let token_prefix1: Vec<u8> = b"token_prefix1\0".to_vec();1764 let mode: CollectionMode = CollectionMode::NFT(2000);17651766 let origin1 = Origin::signed(1);1767 let origin2 = Origin::signed(2);1768 assert_ok!(TemplateModule::create_collection(1769 origin1.clone(),1770 col_name1.clone(),1771 col_desc1.clone(),1772 token_prefix1.clone(),1773 mode1774 ));17751776 assert_ok!(TemplateModule::set_public_access_mode(origin1.clone(), 1, AccessMode::WhiteList));1777 assert_ok!(TemplateModule::set_mint_permission(origin1.clone(), 1, true));1778 assert_ok!(TemplateModule::add_to_white_list(origin1.clone(), 1, 2));17791780 assert_ok!(TemplateModule::create_item(1781 origin2.clone(),1782 1,1783 [1, 2, 3].to_vec(),1784 21785 ));1786 });1787}17881789// #endregion1// Tests to be written here2use crate::mock::*;3use crate::{AccessMode, ApprovePermissions, CollectionMode, Ownership, ChainLimits};4use frame_support::{assert_noop, assert_ok};5use frame_system::{ RawOrigin };67// Use cases tests region8// #region9#[test]10fn create_nft_item() {11 new_test_ext().execute_with(|| {12 let col_name1: Vec<u16> = "Test1\0".encode_utf16().collect::<Vec<u16>>();13 let col_desc1: Vec<u16> = "TestDescription1\0".encode_utf16().collect::<Vec<u16>>();14 let token_prefix1: Vec<u8> = b"token_prefix1\0".to_vec();15 let mode: CollectionMode = CollectionMode::NFT(2000);1617 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 }));2627 let origin1 = Origin::signed(1);28 assert_ok!(TemplateModule::create_collection(29 origin1.clone(),30 col_name1.clone(),31 col_desc1.clone(),32 token_prefix1.clone(),33 mode34 ));35 assert_eq!(TemplateModule::collection(1).owner, 1);3637 assert_ok!(TemplateModule::create_item(38 origin1.clone(),39 1,40 [1, 2, 3].to_vec(),41 142 ));43 assert_eq!(TemplateModule::nft_item_id(1, 1).data, [1, 2, 3].to_vec());44 });45}4647#[test]48fn create_refungible_item() {49 new_test_ext().execute_with(|| {50 let col_name1: Vec<u16> = "Test1\0".encode_utf16().collect::<Vec<u16>>();51 let col_desc1: Vec<u16> = "TestDescription1\0".encode_utf16().collect::<Vec<u16>>();52 let token_prefix1: Vec<u8> = b"token_prefix1\0".to_vec();53 let mode: CollectionMode = CollectionMode::ReFungible(2000, 3);5455 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 }));6465 let origin1 = Origin::signed(1);66 assert_ok!(TemplateModule::create_collection(67 origin1.clone(),68 col_name1.clone(),69 col_desc1.clone(),70 token_prefix1.clone(),71 mode72 ));73 assert_eq!(TemplateModule::collection(1).owner, 1);7475 assert_ok!(TemplateModule::create_item(76 origin1.clone(),77 1,78 [1, 2, 3].to_vec(),79 180 ));81 assert_eq!(82 TemplateModule::refungible_item_id(1, 1).data,83 [1, 2, 3].to_vec()84 );85 assert_eq!(86 TemplateModule::refungible_item_id(1, 1).owner[0],87 Ownership {88 owner: 1,89 fraction: 100090 }91 );92 });93}9495#[test]96fn create_fungible_item() {97 new_test_ext().execute_with(|| {98 let col_name1: Vec<u16> = "Test1\0".encode_utf16().collect::<Vec<u16>>();99 let col_desc1: Vec<u16> = "TestDescription1\0".encode_utf16().collect::<Vec<u16>>();100 let token_prefix1: Vec<u8> = b"token_prefix1\0".to_vec();101 let mode: CollectionMode = CollectionMode::Fungible(3);102103 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 }));112113 let origin1 = Origin::signed(1);114 assert_ok!(TemplateModule::create_collection(115 origin1.clone(),116 col_name1.clone(),117 col_desc1.clone(),118 token_prefix1.clone(),119 mode120 ));121 assert_eq!(TemplateModule::collection(1).owner, 1);122123 assert_ok!(TemplateModule::create_item(124 origin1.clone(),125 1,126 [].to_vec(),127 1128 ));129 assert_eq!(TemplateModule::fungible_item_id(1, 1).owner, 1);130 assert_eq!(TemplateModule::balance_count(1, 1), 1000);131 assert_eq!(TemplateModule::address_tokens(1, 1), [1]);132 });133}134135#[test]136fn transfer_fungible_item() {137 new_test_ext().execute_with(|| {138 let col_name1: Vec<u16> = "Test1\0".encode_utf16().collect::<Vec<u16>>();139 let col_desc1: Vec<u16> = "TestDescription1\0".encode_utf16().collect::<Vec<u16>>();140 let token_prefix1: Vec<u8> = b"token_prefix1\0".to_vec();141 let mode: CollectionMode = CollectionMode::Fungible(3);142143 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 }));152153 let origin1 = Origin::signed(1);154 let origin2 = Origin::signed(2);155 assert_ok!(TemplateModule::create_collection(156 origin1.clone(),157 col_name1.clone(),158 col_desc1.clone(),159 token_prefix1.clone(),160 mode161 ));162 assert_eq!(TemplateModule::collection(1).owner, 1);163164 assert_ok!(TemplateModule::create_item(165 origin1.clone(),166 1,167 [].to_vec(),168 1169 ));170 assert_eq!(TemplateModule::fungible_item_id(1, 1).owner, 1);171 assert_eq!(TemplateModule::balance_count(1, 1), 1000);172 assert_eq!(TemplateModule::address_tokens(1, 1), [1]);173174 // change owner scenario175 assert_ok!(TemplateModule::transfer(origin1.clone(), 2, 1, 1, 1000));176 assert_eq!(TemplateModule::fungible_item_id(1, 1).owner, 2);177 assert_eq!(TemplateModule::fungible_item_id(1, 1).value, 1000);178 assert_eq!(TemplateModule::balance_count(1, 1), 0);179 assert_eq!(TemplateModule::balance_count(1, 2), 1000);180 assert_eq!(TemplateModule::address_tokens(1, 1), []);181 assert_eq!(TemplateModule::address_tokens(1, 2), [1]);182183 // split item scenario184 assert_ok!(TemplateModule::transfer(origin2.clone(), 3, 1, 1, 500));185 assert_eq!(TemplateModule::fungible_item_id(1, 1).owner, 2);186 assert_eq!(TemplateModule::fungible_item_id(1, 2).owner, 3);187 assert_eq!(TemplateModule::balance_count(1, 2), 500);188 assert_eq!(TemplateModule::balance_count(1, 3), 500);189 assert_eq!(TemplateModule::address_tokens(1, 2), [1]);190 assert_eq!(TemplateModule::address_tokens(1, 3), [2]);191192 // split item and new owner has account scenario193 assert_ok!(TemplateModule::transfer(origin2.clone(), 3, 1, 1, 200));194 assert_eq!(TemplateModule::fungible_item_id(1, 1).value, 300);195 assert_eq!(TemplateModule::fungible_item_id(1, 2).value, 700);196 assert_eq!(TemplateModule::balance_count(1, 2), 300);197 assert_eq!(TemplateModule::balance_count(1, 3), 700);198 assert_eq!(TemplateModule::address_tokens(1, 2), [1]);199 assert_eq!(TemplateModule::address_tokens(1, 3), [2]);200 });201}202203#[test]204fn transfer_refungible_item() {205 new_test_ext().execute_with(|| {206 let col_name1: Vec<u16> = "Test1\0".encode_utf16().collect::<Vec<u16>>();207 let col_desc1: Vec<u16> = "TestDescription1\0".encode_utf16().collect::<Vec<u16>>();208 let token_prefix1: Vec<u8> = b"token_prefix1\0".to_vec();209 let mode: CollectionMode = CollectionMode::ReFungible(2000, 3);210211 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 }));220221 let origin1 = Origin::signed(1);222 let origin2 = Origin::signed(2);223 assert_ok!(TemplateModule::create_collection(224 origin1.clone(),225 col_name1.clone(),226 col_desc1.clone(),227 token_prefix1.clone(),228 mode229 ));230 assert_eq!(TemplateModule::collection(1).owner, 1);231232 assert_ok!(TemplateModule::create_item(233 origin1.clone(),234 1,235 [1, 2, 3].to_vec(),236 1237 ));238 assert_eq!(239 TemplateModule::refungible_item_id(1, 1).data,240 [1, 2, 3].to_vec()241 );242 assert_eq!(243 TemplateModule::refungible_item_id(1, 1).owner[0],244 Ownership {245 owner: 1,246 fraction: 1000247 }248 );249 assert_eq!(TemplateModule::balance_count(1, 1), 1000);250 assert_eq!(TemplateModule::address_tokens(1, 1), [1]);251252 // change owner scenario253 assert_ok!(TemplateModule::transfer(origin1.clone(), 2, 1, 1, 1000));254 assert_eq!(255 TemplateModule::refungible_item_id(1, 1).owner[0],256 Ownership {257 owner: 2,258 fraction: 1000259 }260 );261 assert_eq!(TemplateModule::balance_count(1, 1), 0);262 assert_eq!(TemplateModule::balance_count(1, 2), 1000);263 assert_eq!(TemplateModule::address_tokens(1, 1), []);264 assert_eq!(TemplateModule::address_tokens(1, 2), [1]);265266 // split item scenario267 assert_ok!(TemplateModule::transfer(origin2.clone(), 3, 1, 1, 500));268 assert_eq!(269 TemplateModule::refungible_item_id(1, 1).owner[0],270 Ownership {271 owner: 2,272 fraction: 500273 }274 );275 assert_eq!(276 TemplateModule::refungible_item_id(1, 1).owner[1],277 Ownership {278 owner: 3,279 fraction: 500280 }281 );282 assert_eq!(TemplateModule::balance_count(1, 2), 500);283 assert_eq!(TemplateModule::balance_count(1, 3), 500);284 assert_eq!(TemplateModule::address_tokens(1, 2), [1]);285 assert_eq!(TemplateModule::address_tokens(1, 3), [1]);286287 // split item and new owner has account scenario288 assert_ok!(TemplateModule::transfer(origin2.clone(), 3, 1, 1, 200));289 assert_eq!(290 TemplateModule::refungible_item_id(1, 1).owner[0],291 Ownership {292 owner: 2,293 fraction: 300294 }295 );296 assert_eq!(297 TemplateModule::refungible_item_id(1, 1).owner[1],298 Ownership {299 owner: 3,300 fraction: 700301 }302 );303 assert_eq!(TemplateModule::balance_count(1, 2), 300);304 assert_eq!(TemplateModule::balance_count(1, 3), 700);305 assert_eq!(TemplateModule::address_tokens(1, 2), [1]);306 assert_eq!(TemplateModule::address_tokens(1, 3), [1]);307 });308}309310#[test]311fn transfer_nft_item() {312 new_test_ext().execute_with(|| {313 let col_name1: Vec<u16> = "Test1\0".encode_utf16().collect::<Vec<u16>>();314 let col_desc1: Vec<u16> = "TestDescription1\0".encode_utf16().collect::<Vec<u16>>();315 let token_prefix1: Vec<u8> = b"token_prefix1\0".to_vec();316 let mode: CollectionMode = CollectionMode::NFT(2000);317318 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 }));327328 let origin1 = Origin::signed(1);329 assert_ok!(TemplateModule::create_collection(330 origin1.clone(),331 col_name1.clone(),332 col_desc1.clone(),333 token_prefix1.clone(),334 mode335 ));336 assert_eq!(TemplateModule::collection(1).owner, 1);337338 assert_ok!(TemplateModule::create_item(339 origin1.clone(),340 1,341 [1, 2, 3].to_vec(),342 1343 ));344 assert_eq!(TemplateModule::nft_item_id(1, 1).data, [1, 2, 3].to_vec());345 assert_eq!(TemplateModule::balance_count(1, 1), 1);346 assert_eq!(TemplateModule::address_tokens(1, 1), [1]);347348 // default scenario349 assert_ok!(TemplateModule::transfer(origin1.clone(), 2, 1, 1, 1000));350 assert_eq!(TemplateModule::nft_item_id(1, 1).owner, 2);351 assert_eq!(TemplateModule::balance_count(1, 1), 0);352 assert_eq!(TemplateModule::balance_count(1, 2), 1);353 assert_eq!(TemplateModule::address_tokens(1, 1), []);354 assert_eq!(TemplateModule::address_tokens(1, 2), [1]);355 });356}357358#[test]359fn nft_approve_and_transfer_from() {360 new_test_ext().execute_with(|| {361 let col_name1: Vec<u16> = "Test1\0".encode_utf16().collect::<Vec<u16>>();362 let col_desc1: Vec<u16> = "TestDescription1\0".encode_utf16().collect::<Vec<u16>>();363 let token_prefix1: Vec<u8> = b"token_prefix1\0".to_vec();364 let mode: CollectionMode = CollectionMode::NFT(2000);365366 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 }));375376 let origin1 = Origin::signed(1);377 let origin2 = Origin::signed(2);378 assert_ok!(TemplateModule::create_collection(379 origin1.clone(),380 col_name1.clone(),381 col_desc1.clone(),382 token_prefix1.clone(),383 mode384 ));385 assert_eq!(TemplateModule::collection(1).owner, 1);386387 assert_ok!(TemplateModule::create_item(388 origin1.clone(),389 1,390 [1, 2, 3].to_vec(),391 1392 ));393 assert_eq!(TemplateModule::nft_item_id(1, 1).data, [1, 2, 3].to_vec());394 assert_eq!(TemplateModule::balance_count(1, 1), 1);395 assert_eq!(TemplateModule::address_tokens(1, 1), [1]);396397 assert_ok!(TemplateModule::set_mint_permission(398 origin1.clone(),399 1,400 true401 ));402 assert_ok!(TemplateModule::set_public_access_mode(403 origin1.clone(),404 1,405 AccessMode::WhiteList406 ));407 assert_ok!(TemplateModule::add_to_white_list(origin1.clone(), 1, 1));408 assert_ok!(TemplateModule::add_to_white_list(origin1.clone(), 1, 2));409 assert_ok!(TemplateModule::add_to_white_list(origin1.clone(), 1, 3));410411 // do approve412 assert_ok!(TemplateModule::approve(origin1.clone(), 2, 1, 1));413 assert_eq!(TemplateModule::approved(1, (1, 1)).len(), 1);414 assert_ok!(TemplateModule::approve(origin1.clone(), 3, 1, 1));415 assert_eq!(TemplateModule::approved(1, (1, 1)).len(), 2);416 assert_eq!(417 TemplateModule::approved(1, (1, 1))[0],418 ApprovePermissions {419 approved: 2,420 amount: 100000000421 }422 );423424 assert_ok!(TemplateModule::transfer_from(425 origin2.clone(),426 1,427 3,428 1,429 1,430 1431 ));432 assert_eq!(TemplateModule::approved(1, (1, 1)).len(), 0);433 });434}435436#[test]437fn refungible_approve_and_transfer_from() {438 new_test_ext().execute_with(|| {439 let col_name1: Vec<u16> = "Test1\0".encode_utf16().collect::<Vec<u16>>();440 let col_desc1: Vec<u16> = "TestDescription1\0".encode_utf16().collect::<Vec<u16>>();441 let token_prefix1: Vec<u8> = b"token_prefix1\0".to_vec();442 let mode: CollectionMode = CollectionMode::ReFungible(2000, 3);443444 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 }));453454 let origin1 = Origin::signed(1);455 let origin2 = Origin::signed(2);456 assert_ok!(TemplateModule::create_collection(457 origin1.clone(),458 col_name1.clone(),459 col_desc1.clone(),460 token_prefix1.clone(),461 mode462 ));463 assert_eq!(TemplateModule::collection(1).owner, 1);464465 assert_ok!(TemplateModule::create_item(466 origin1.clone(),467 1,468 [1, 2, 3].to_vec(),469 1470 ));471 assert_eq!(472 TemplateModule::refungible_item_id(1, 1).data,473 [1, 2, 3].to_vec()474 );475 assert_eq!(476 TemplateModule::refungible_item_id(1, 1).owner[0],477 Ownership {478 owner: 1,479 fraction: 1000480 }481 );482 assert_eq!(TemplateModule::balance_count(1, 1), 1000);483 assert_eq!(TemplateModule::address_tokens(1, 1), [1]);484485 assert_ok!(TemplateModule::set_mint_permission(486 origin1.clone(),487 1,488 true489 ));490 assert_ok!(TemplateModule::set_public_access_mode(491 origin1.clone(),492 1,493 AccessMode::WhiteList494 ));495 assert_ok!(TemplateModule::add_to_white_list(origin1.clone(), 1, 1));496 assert_ok!(TemplateModule::add_to_white_list(origin1.clone(), 1, 2));497 assert_ok!(TemplateModule::add_to_white_list(origin1.clone(), 1, 3));498499 // do approve500 assert_ok!(TemplateModule::approve(origin1.clone(), 2, 1, 1));501 assert_eq!(TemplateModule::approved(1, (1, 1)).len(), 1);502 assert_ok!(TemplateModule::approve(origin1.clone(), 3, 1, 1));503 assert_eq!(TemplateModule::approved(1, (1, 1)).len(), 2);504 assert_eq!(505 TemplateModule::approved(1, (1, 1))[0],506 ApprovePermissions {507 approved: 2,508 amount: 100000000509 }510 );511512 assert_ok!(TemplateModule::transfer_from(513 origin2.clone(),514 1,515 3,516 1,517 1,518 100519 ));520 assert_eq!(TemplateModule::balance_count(1, 1), 900);521 assert_eq!(TemplateModule::balance_count(1, 3), 100);522 assert_eq!(TemplateModule::address_tokens(1, 1), [1]);523 assert_eq!(TemplateModule::address_tokens(1, 3), [1]);524525 assert_eq!(TemplateModule::approved(1, (1, 1)).len(), 1);526 assert_eq!(527 TemplateModule::approved(1, (1, 1))[0],528 ApprovePermissions {529 approved: 3,530 amount: 100000000531 }532 );533 });534}535536#[test]537fn fungible_approve_and_transfer_from() {538 new_test_ext().execute_with(|| {539 let col_name1: Vec<u16> = "Test1\0".encode_utf16().collect::<Vec<u16>>();540 let col_desc1: Vec<u16> = "TestDescription1\0".encode_utf16().collect::<Vec<u16>>();541 let token_prefix1: Vec<u8> = b"token_prefix1\0".to_vec();542 let mode: CollectionMode = CollectionMode::Fungible(3);543544 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 }));553554 let origin1 = Origin::signed(1);555 let origin2 = Origin::signed(2);556 assert_ok!(TemplateModule::create_collection(557 origin1.clone(),558 col_name1.clone(),559 col_desc1.clone(),560 token_prefix1.clone(),561 mode562 ));563 assert_eq!(TemplateModule::collection(1).owner, 1);564565 assert_ok!(TemplateModule::create_item(566 origin1.clone(),567 1,568 [].to_vec(),569 1570 ));571 assert_eq!(TemplateModule::fungible_item_id(1, 1).owner, 1);572 assert_eq!(TemplateModule::balance_count(1, 1), 1000);573 assert_eq!(TemplateModule::address_tokens(1, 1), [1]);574575 assert_ok!(TemplateModule::set_mint_permission(576 origin1.clone(),577 1,578 true579 ));580 assert_ok!(TemplateModule::set_public_access_mode(581 origin1.clone(),582 1,583 AccessMode::WhiteList584 ));585 assert_ok!(TemplateModule::add_to_white_list(origin1.clone(), 1, 1));586 assert_ok!(TemplateModule::add_to_white_list(origin1.clone(), 1, 2));587 assert_ok!(TemplateModule::add_to_white_list(origin1.clone(), 1, 3));588589 // do approve590 assert_ok!(TemplateModule::approve(origin1.clone(), 2, 1, 1));591 assert_eq!(TemplateModule::approved(1, (1, 1)).len(), 1);592 assert_ok!(TemplateModule::approve(origin1.clone(), 3, 1, 1));593 assert_eq!(TemplateModule::approved(1, (1, 1)).len(), 2);594 assert_eq!(595 TemplateModule::approved(1, (1, 1))[0],596 ApprovePermissions {597 approved: 2,598 amount: 100000000599 }600 );601602 assert_ok!(TemplateModule::transfer_from(603 origin2.clone(),604 1,605 3,606 1,607 1,608 100609 ));610 assert_eq!(TemplateModule::balance_count(1, 1), 900);611 assert_eq!(TemplateModule::balance_count(1, 3), 100);612 assert_eq!(TemplateModule::address_tokens(1, 1), [1]);613 assert_eq!(TemplateModule::address_tokens(1, 3), [2]);614615 assert_eq!(TemplateModule::approved(1, (1, 1)).len(), 1);616 assert_eq!(617 TemplateModule::approved(1, (1, 1))[0],618 ApprovePermissions {619 approved: 3,620 amount: 100000000621 }622 );623624 assert_ok!(TemplateModule::approve(origin1.clone(), 2, 1, 1));625 assert_ok!(TemplateModule::transfer_from(626 origin2.clone(),627 1,628 3,629 1,630 1,631 900632 ));633 assert_eq!(TemplateModule::balance_count(1, 1), 0);634 assert_eq!(TemplateModule::balance_count(1, 3), 1000);635 assert_eq!(TemplateModule::address_tokens(1, 1), []);636 assert_eq!(TemplateModule::address_tokens(1, 3), [2]);637638 assert_eq!(TemplateModule::approved(1, (1, 1)).len(), 0);639 });640}641642#[test]643fn change_collection_owner() {644 new_test_ext().execute_with(|| {645 let col_name1: Vec<u16> = "Test1\0".encode_utf16().collect::<Vec<u16>>();646 let col_desc1: Vec<u16> = "TestDescription1\0".encode_utf16().collect::<Vec<u16>>();647 let token_prefix1: Vec<u8> = b"token_prefix1\0".to_vec();648 let mode: CollectionMode = CollectionMode::NFT(2000);649650 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 }));659660 let origin1 = Origin::signed(1);661 assert_ok!(TemplateModule::create_collection(662 origin1.clone(),663 col_name1.clone(),664 col_desc1.clone(),665 token_prefix1.clone(),666 mode667 ));668 assert_ok!(TemplateModule::change_collection_owner(669 origin1.clone(),670 1,671 2672 ));673 assert_eq!(TemplateModule::collection(1).owner, 2);674 });675}676677#[test]678fn destroy_collection() {679 new_test_ext().execute_with(|| {680 let col_name1: Vec<u16> = "Test1\0".encode_utf16().collect::<Vec<u16>>();681 let col_desc1: Vec<u16> = "TestDescription1\0".encode_utf16().collect::<Vec<u16>>();682 let token_prefix1: Vec<u8> = b"token_prefix1\0".to_vec();683 let mode: CollectionMode = CollectionMode::NFT(2000);684685 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 }));694695 let origin1 = Origin::signed(1);696 assert_ok!(TemplateModule::create_collection(697 origin1.clone(),698 col_name1.clone(),699 col_desc1.clone(),700 token_prefix1.clone(),701 mode702 ));703 assert_ok!(TemplateModule::destroy_collection(origin1.clone(), 1));704 });705}706707#[test]708fn burn_nft_item() {709 new_test_ext().execute_with(|| {710 let col_name1: Vec<u16> = "Test1\0".encode_utf16().collect::<Vec<u16>>();711 let col_desc1: Vec<u16> = "TestDescription1\0".encode_utf16().collect::<Vec<u16>>();712 let token_prefix1: Vec<u8> = b"token_prefix1\0".to_vec();713 let mode: CollectionMode = CollectionMode::NFT(2000);714715 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 }));724725 let origin1 = Origin::signed(1);726 assert_ok!(TemplateModule::create_collection(727 origin1.clone(),728 col_name1.clone(),729 col_desc1.clone(),730 token_prefix1.clone(),731 mode732 ));733 assert_ok!(TemplateModule::add_collection_admin(origin1.clone(), 1, 2));734 assert_ok!(TemplateModule::create_item(735 origin1.clone(),736 1,737 [1, 2, 3].to_vec(),738 1739 ));740741 assert_eq!(TemplateModule::nft_item_id(1, 1).data, [1, 2, 3].to_vec());742743 // check balance (collection with id = 1, user id = 1)744 assert_eq!(TemplateModule::balance_count(1, 1), 1);745746 // burn item747 assert_ok!(TemplateModule::burn_item(origin1.clone(), 1, 1));748 assert_noop!(749 TemplateModule::burn_item(origin1.clone(), 1, 1),750 "Item does not exists"751 );752753 assert_eq!(TemplateModule::balance_count(1, 1), 0);754 });755}756757#[test]758fn burn_fungible_item() {759 new_test_ext().execute_with(|| {760 let col_name1: Vec<u16> = "Test1\0".encode_utf16().collect::<Vec<u16>>();761 let col_desc1: Vec<u16> = "TestDescription1\0".encode_utf16().collect::<Vec<u16>>();762 let token_prefix1: Vec<u8> = b"token_prefix1\0".to_vec();763 let mode: CollectionMode = CollectionMode::Fungible(3);764765 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 }));774775 let origin1 = Origin::signed(1);776 assert_ok!(TemplateModule::create_collection(777 origin1.clone(),778 col_name1.clone(),779 col_desc1.clone(),780 token_prefix1.clone(),781 mode782 ));783 assert_ok!(TemplateModule::add_collection_admin(origin1.clone(), 1, 2));784 assert_ok!(TemplateModule::create_item(785 origin1.clone(),786 1,787 [].to_vec(),788 1789 ));790791 // check balance (collection with id = 1, user id = 1)792 assert_eq!(TemplateModule::balance_count(1, 1), 1000);793794 // burn item795 assert_ok!(TemplateModule::burn_item(origin1.clone(), 1, 1));796 assert_noop!(797 TemplateModule::burn_item(origin1.clone(), 1, 1),798 "Item does not exists"799 );800801 assert_eq!(TemplateModule::balance_count(1, 1), 0);802 });803}804805#[test]806fn burn_refungible_item() {807 new_test_ext().execute_with(|| {808 let col_name1: Vec<u16> = "Test1\0".encode_utf16().collect::<Vec<u16>>();809 let col_desc1: Vec<u16> = "TestDescription1\0".encode_utf16().collect::<Vec<u16>>();810 let token_prefix1: Vec<u8> = b"token_prefix1\0".to_vec();811 let mode: CollectionMode = CollectionMode::ReFungible(200, 3);812813 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 }));822823 let origin1 = Origin::signed(1);824 let origin2 = Origin::signed(2);825 assert_ok!(TemplateModule::create_collection(826 origin1.clone(),827 col_name1.clone(),828 col_desc1.clone(),829 token_prefix1.clone(),830 mode831 ));832833 assert_ok!(TemplateModule::set_mint_permission(834 origin1.clone(),835 1,836 true837 ));838 assert_ok!(TemplateModule::set_public_access_mode(839 origin1.clone(),840 1,841 AccessMode::WhiteList842 ));843 assert_ok!(TemplateModule::add_to_white_list(origin1.clone(), 1, 1));844845 assert_ok!(TemplateModule::add_collection_admin(origin1.clone(), 1, 2));846 assert_ok!(TemplateModule::create_item(847 origin2.clone(),848 1,849 [1, 2, 3].to_vec(),850 1851 ));852853 assert_eq!(854 TemplateModule::refungible_item_id(1, 1).data,855 [1, 2, 3].to_vec()856 );857858 // check balance (collection with id = 1, user id = 2)859 assert_eq!(TemplateModule::balance_count(1, 1), 1000);860861 // burn item862 assert_ok!(TemplateModule::burn_item(origin1.clone(), 1, 1));863 assert_noop!(864 TemplateModule::burn_item(origin1.clone(), 1, 1),865 "Item does not exists"866 );867868 assert_eq!(TemplateModule::balance_count(1, 1), 0);869 });870}871872#[test]873fn add_collection_admin() {874 new_test_ext().execute_with(|| {875 let col_name1: Vec<u16> = "Test1\0".encode_utf16().collect::<Vec<u16>>();876 let col_desc1: Vec<u16> = "TestDescription1\0".encode_utf16().collect::<Vec<u16>>();877 let token_prefix1: Vec<u8> = b"token_prefix1\0".to_vec();878 let mode: CollectionMode = CollectionMode::NFT(2000);879880 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 }));889890 let origin1 = Origin::signed(1);891 let origin2 = Origin::signed(2);892 let origin3 = Origin::signed(3);893 assert_ok!(TemplateModule::create_collection(894 origin1.clone(),895 col_name1.clone(),896 col_desc1.clone(),897 token_prefix1.clone(),898 mode.clone()899 ));900 assert_ok!(TemplateModule::create_collection(901 origin2.clone(),902 col_name1.clone(),903 col_desc1.clone(),904 token_prefix1.clone(),905 mode.clone()906 ));907 assert_ok!(TemplateModule::create_collection(908 origin3.clone(),909 col_name1.clone(),910 col_desc1.clone(),911 token_prefix1.clone(),912 mode.clone()913 ));914915 assert_eq!(TemplateModule::collection(1).owner, 1);916 assert_eq!(TemplateModule::collection(2).owner, 2);917 assert_eq!(TemplateModule::collection(3).owner, 3);918919 // collection admin920 assert_ok!(TemplateModule::add_collection_admin(origin1.clone(), 1, 2));921 assert_ok!(TemplateModule::add_collection_admin(origin1.clone(), 1, 3));922923 assert_eq!(TemplateModule::admin_list_collection(1).contains(&2), true);924 assert_eq!(TemplateModule::admin_list_collection(1).contains(&3), true);925 });926}927928#[test]929fn remove_collection_admin() {930 new_test_ext().execute_with(|| {931 let col_name1: Vec<u16> = "Test1\0".encode_utf16().collect::<Vec<u16>>();932 let col_desc1: Vec<u16> = "TestDescription1\0".encode_utf16().collect::<Vec<u16>>();933 let token_prefix1: Vec<u8> = b"token_prefix1\0".to_vec();934 let mode: CollectionMode = CollectionMode::NFT(2000);935936 let origin1 = Origin::signed(1);937 let origin2 = Origin::signed(2);938 let origin3 = Origin::signed(3);939940 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 }));949950 assert_ok!(TemplateModule::create_collection(951 origin1.clone(),952 col_name1.clone(),953 col_desc1.clone(),954 token_prefix1.clone(),955 mode.clone()956 ));957 assert_ok!(TemplateModule::create_collection(958 origin2.clone(),959 col_name1.clone(),960 col_desc1.clone(),961 token_prefix1.clone(),962 mode.clone()963 ));964 assert_ok!(TemplateModule::create_collection(965 origin3.clone(),966 col_name1.clone(),967 col_desc1.clone(),968 token_prefix1.clone(),969 mode.clone()970 ));971972 assert_eq!(TemplateModule::collection(1).owner, 1);973 assert_eq!(TemplateModule::collection(2).owner, 2);974 assert_eq!(TemplateModule::collection(3).owner, 3);975976 // collection admin977 assert_ok!(TemplateModule::add_collection_admin(origin1.clone(), 1, 2));978 assert_ok!(TemplateModule::add_collection_admin(origin1.clone(), 1, 3));979980 assert_eq!(TemplateModule::admin_list_collection(1).contains(&2), true);981 assert_eq!(TemplateModule::admin_list_collection(1).contains(&3), true);982983 // remove admin984 assert_ok!(TemplateModule::remove_collection_admin(985 origin2.clone(),986 1,987 3988 ));989 assert_eq!(TemplateModule::admin_list_collection(1).contains(&3), false);990 });991}992993#[test]994fn balance_of() {995 new_test_ext().execute_with(|| {996 let col_name1: Vec<u16> = "Test1\0".encode_utf16().collect::<Vec<u16>>();997 let col_desc1: Vec<u16> = "TestDescription1\0".encode_utf16().collect::<Vec<u16>>();998 let token_prefix1: Vec<u8> = b"token_prefix1\0".to_vec();999 let nft_mode: CollectionMode = CollectionMode::NFT(2000);1000 let furg_mode: CollectionMode = CollectionMode::Fungible(3);1001 let refung_mode: CollectionMode = CollectionMode::ReFungible(2000, 3);10021003 let origin1 = Origin::signed(1);10041005 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 }));10141015 assert_ok!(TemplateModule::create_collection(1016 origin1.clone(),1017 col_name1.clone(),1018 col_desc1.clone(),1019 token_prefix1.clone(),1020 nft_mode.clone()1021 ));1022 assert_ok!(TemplateModule::create_collection(1023 origin1.clone(),1024 col_name1.clone(),1025 col_desc1.clone(),1026 token_prefix1.clone(),1027 furg_mode.clone()1028 ));1029 assert_ok!(TemplateModule::create_collection(1030 origin1.clone(),1031 col_name1.clone(),1032 col_desc1.clone(),1033 token_prefix1.clone(),1034 refung_mode.clone()1035 ));10361037 assert_eq!(TemplateModule::collection(1).owner, 1);1038 assert_eq!(TemplateModule::collection(2).owner, 1);1039 assert_eq!(TemplateModule::collection(3).owner, 1);10401041 // check balance before1042 assert_eq!(TemplateModule::balance_count(1, 1), 0);1043 assert_eq!(TemplateModule::balance_count(2, 1), 0);1044 assert_eq!(TemplateModule::balance_count(3, 1), 0);10451046 // create item1047 assert_ok!(TemplateModule::create_item(1048 origin1.clone(),1049 1,1050 [1, 1, 1].to_vec(),1051 11052 ));10531054 assert_ok!(TemplateModule::create_item(1055 origin1.clone(),1056 2,1057 [].to_vec(),1058 11059 ));10601061 assert_ok!(TemplateModule::create_item(1062 origin1.clone(),1063 3,1064 [1, 1, 1].to_vec(),1065 11066 ));10671068 // check balance (collection with id = 1, user id = 1)1069 assert_eq!(TemplateModule::balance_count(1, 1), 1);1070 assert_eq!(TemplateModule::balance_count(2, 1), 1000);1071 assert_eq!(TemplateModule::balance_count(3, 1), 1000);1072 assert_eq!(TemplateModule::nft_item_id(1, 1).owner, 1);1073 assert_eq!(TemplateModule::fungible_item_id(2, 1).owner, 1);1074 assert_eq!(TemplateModule::refungible_item_id(3, 1).owner[0].owner, 1);1075 });1076}10771078#[test]1079fn approve() {1080 new_test_ext().execute_with(|| {1081 let col_name1: Vec<u16> = "Test1\0".encode_utf16().collect::<Vec<u16>>();1082 let col_desc1: Vec<u16> = "TestDescription1\0".encode_utf16().collect::<Vec<u16>>();1083 let token_prefix1: Vec<u8> = b"token_prefix1\0".to_vec();1084 let nft_mode: CollectionMode = CollectionMode::NFT(2000);1085 let origin1 = Origin::signed(1);10861087 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 }));10961097 assert_ok!(TemplateModule::create_collection(1098 origin1.clone(),1099 col_name1.clone(),1100 col_desc1.clone(),1101 token_prefix1.clone(),1102 nft_mode.clone()1103 ));11041105 assert_eq!(TemplateModule::collection(1).owner, 1);11061107 // create item1108 assert_ok!(TemplateModule::create_item(1109 origin1.clone(),1110 1,1111 [1, 1, 1].to_vec(),1112 11113 ));11141115 // approve1116 assert_ok!(TemplateModule::approve(origin1.clone(), 2, 1, 1));1117 assert_eq!(TemplateModule::approved(1, (1, 1))[0].approved, 2);1118 });1119}11201121#[test]1122fn transfer_from() {1123 new_test_ext().execute_with(|| {1124 let col_name1: Vec<u16> = "Test1\0".encode_utf16().collect::<Vec<u16>>();1125 let col_desc1: Vec<u16> = "TestDescription1\0".encode_utf16().collect::<Vec<u16>>();1126 let token_prefix1: Vec<u8> = b"token_prefix1\0".to_vec();1127 let mode: CollectionMode = CollectionMode::NFT(2000);1128 let origin1 = Origin::signed(1);1129 let origin2 = Origin::signed(2);11301131 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 }));11401141 assert_ok!(TemplateModule::create_collection(1142 origin1.clone(),1143 col_name1.clone(),1144 col_desc1.clone(),1145 token_prefix1.clone(),1146 mode1147 ));11481149 assert_eq!(TemplateModule::collection(1).owner, 1);11501151 // create item1152 assert_ok!(TemplateModule::create_item(1153 origin1.clone(),1154 1,1155 [1, 1, 1].to_vec(),1156 11157 ));11581159 // approve1160 assert_ok!(TemplateModule::approve(origin1.clone(), 2, 1, 1));1161 assert_eq!(TemplateModule::approved(1, (1, 1))[0].approved, 2);11621163 assert_ok!(TemplateModule::set_mint_permission(1164 origin1.clone(),1165 1,1166 true1167 ));1168 assert_ok!(TemplateModule::set_public_access_mode(1169 origin1.clone(),1170 1,1171 AccessMode::WhiteList1172 ));1173 assert_ok!(TemplateModule::add_to_white_list(origin1.clone(), 1, 1));1174 assert_ok!(TemplateModule::add_to_white_list(origin1.clone(), 1, 2));1175 assert_ok!(TemplateModule::add_to_white_list(origin1.clone(), 1, 3));11761177 assert_ok!(TemplateModule::transfer_from(1178 origin2.clone(),1179 1,1180 2,1181 1,1182 1,1183 11184 ));11851186 // after transfer1187 assert_eq!(TemplateModule::balance_count(1, 1), 0);1188 assert_eq!(TemplateModule::balance_count(1, 2), 1);1189 });1190}11911192// #endregion11931194// Coverage tests region1195// #region11961197#[test]1198fn owner_can_add_address_to_white_list() {1199 new_test_ext().execute_with(|| {1200 let col_name1: Vec<u16> = "Test1\0".encode_utf16().collect::<Vec<u16>>();1201 let col_desc1: Vec<u16> = "TestDescription1\0".encode_utf16().collect::<Vec<u16>>();1202 let token_prefix1: Vec<u8> = b"token_prefix1\0".to_vec();1203 let mode: CollectionMode = CollectionMode::NFT(2000);1204 let origin1 = Origin::signed(1);12051206 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 }));12151216 assert_ok!(TemplateModule::create_collection(1217 origin1.clone(),1218 col_name1.clone(),1219 col_desc1.clone(),1220 token_prefix1.clone(),1221 mode1222 ));12231224 assert_ok!(TemplateModule::add_to_white_list(origin1.clone(), 1, 2));1225 assert_eq!(TemplateModule::white_list(1)[0], 2);1226 });1227}12281229#[test]1230fn admin_can_add_address_to_white_list() {1231 new_test_ext().execute_with(|| {1232 let col_name1: Vec<u16> = "Test1\0".encode_utf16().collect::<Vec<u16>>();1233 let col_desc1: Vec<u16> = "TestDescription1\0".encode_utf16().collect::<Vec<u16>>();1234 let token_prefix1: Vec<u8> = b"token_prefix1\0".to_vec();1235 let mode: CollectionMode = CollectionMode::NFT(2000);1236 let origin1 = Origin::signed(1);1237 let origin2 = Origin::signed(2);12381239 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 }));12481249 assert_ok!(TemplateModule::create_collection(1250 origin1.clone(),1251 col_name1.clone(),1252 col_desc1.clone(),1253 token_prefix1.clone(),1254 mode1255 ));12561257 assert_ok!(TemplateModule::add_collection_admin(origin1.clone(), 1, 2));1258 assert_ok!(TemplateModule::add_to_white_list(origin2.clone(), 1, 3));1259 assert_eq!(TemplateModule::white_list(1)[0], 3);1260 });1261}12621263#[test]1264fn nonprivileged_user_cannot_add_address_to_white_list() {1265 new_test_ext().execute_with(|| {1266 let col_name1: Vec<u16> = "Test1\0".encode_utf16().collect::<Vec<u16>>();1267 let col_desc1: Vec<u16> = "TestDescription1\0".encode_utf16().collect::<Vec<u16>>();1268 let token_prefix1: Vec<u8> = b"token_prefix1\0".to_vec();1269 let mode: CollectionMode = CollectionMode::NFT(2000);1270 let origin1 = Origin::signed(1);1271 let origin2 = Origin::signed(2);12721273 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 }));12821283 assert_ok!(TemplateModule::create_collection(1284 origin1.clone(),1285 col_name1.clone(),1286 col_desc1.clone(),1287 token_prefix1.clone(),1288 mode1289 ));12901291 assert_noop!(1292 TemplateModule::add_to_white_list(origin2.clone(), 1, 3),1293 "You do not have permissions to modify this collection"1294 );1295 });1296}12971298#[test]1299fn nobody_can_add_address_to_white_list_of_nonexisting_collection() {1300 new_test_ext().execute_with(|| {1301 let origin1 = Origin::signed(1);13021303 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 }));13121313 assert_noop!(1314 TemplateModule::add_to_white_list(origin1.clone(), 1, 2),1315 "This collection does not exist"1316 );1317 });1318}13191320#[test]1321fn nobody_can_add_address_to_white_list_of_deleted_collection() {1322 new_test_ext().execute_with(|| {1323 let col_name1: Vec<u16> = "Test1\0".encode_utf16().collect::<Vec<u16>>();1324 let col_desc1: Vec<u16> = "TestDescription1\0".encode_utf16().collect::<Vec<u16>>();1325 let token_prefix1: Vec<u8> = b"token_prefix1\0".to_vec();1326 let mode: CollectionMode = CollectionMode::NFT(2000);1327 let origin1 = Origin::signed(1);13281329 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 }));13381339 assert_ok!(TemplateModule::create_collection(1340 origin1.clone(),1341 col_name1.clone(),1342 col_desc1.clone(),1343 token_prefix1.clone(),1344 mode1345 ));13461347 assert_ok!(TemplateModule::destroy_collection(origin1.clone(), 1));1348 assert_noop!(1349 TemplateModule::add_to_white_list(origin1.clone(), 1, 2),1350 "This collection does not exist"1351 );1352 });1353}13541355// If address is already added to white list, nothing happens1356#[test]1357fn address_is_already_added_to_white_list() {1358 new_test_ext().execute_with(|| {1359 let col_name1: Vec<u16> = "Test1\0".encode_utf16().collect::<Vec<u16>>();1360 let col_desc1: Vec<u16> = "TestDescription1\0".encode_utf16().collect::<Vec<u16>>();1361 let token_prefix1: Vec<u8> = b"token_prefix1\0".to_vec();1362 let mode: CollectionMode = CollectionMode::NFT(2000);1363 let origin1 = Origin::signed(1);13641365 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 }));13741375 assert_ok!(TemplateModule::create_collection(1376 origin1.clone(),1377 col_name1.clone(),1378 col_desc1.clone(),1379 token_prefix1.clone(),1380 mode1381 ));13821383 assert_ok!(TemplateModule::add_to_white_list(origin1.clone(), 1, 2));1384 assert_ok!(TemplateModule::add_to_white_list(origin1.clone(), 1, 2));1385 assert_eq!(TemplateModule::white_list(1)[0], 2);1386 assert_eq!(TemplateModule::white_list(1).len(), 1);1387 });1388}13891390#[test]1391fn owner_can_remove_address_from_white_list() {1392 new_test_ext().execute_with(|| {1393 let col_name1: Vec<u16> = "Test1\0".encode_utf16().collect::<Vec<u16>>();1394 let col_desc1: Vec<u16> = "TestDescription1\0".encode_utf16().collect::<Vec<u16>>();1395 let token_prefix1: Vec<u8> = b"token_prefix1\0".to_vec();1396 let mode: CollectionMode = CollectionMode::NFT(2000);1397 let origin1 = Origin::signed(1);13981399 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 }));14081409 assert_ok!(TemplateModule::create_collection(1410 origin1.clone(),1411 col_name1.clone(),1412 col_desc1.clone(),1413 token_prefix1.clone(),1414 mode1415 ));14161417 assert_ok!(TemplateModule::add_to_white_list(origin1.clone(), 1, 2));1418 assert_ok!(TemplateModule::remove_from_white_list(1419 origin1.clone(),1420 1,1421 21422 ));1423 assert_eq!(TemplateModule::white_list(1).len(), 0);1424 });1425}14261427#[test]1428fn admin_can_remove_address_from_white_list() {1429 new_test_ext().execute_with(|| {1430 let col_name1: Vec<u16> = "Test1\0".encode_utf16().collect::<Vec<u16>>();1431 let col_desc1: Vec<u16> = "TestDescription1\0".encode_utf16().collect::<Vec<u16>>();1432 let token_prefix1: Vec<u8> = b"token_prefix1\0".to_vec();1433 let mode: CollectionMode = CollectionMode::NFT(2000);1434 let origin1 = Origin::signed(1);1435 let origin2 = Origin::signed(2);14361437 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 }));14461447 assert_ok!(TemplateModule::create_collection(1448 origin1.clone(),1449 col_name1.clone(),1450 col_desc1.clone(),1451 token_prefix1.clone(),1452 mode1453 ));14541455 assert_ok!(TemplateModule::add_collection_admin(origin1.clone(), 1, 2));14561457 assert_ok!(TemplateModule::add_to_white_list(origin1.clone(), 1, 3));1458 assert_ok!(TemplateModule::remove_from_white_list(1459 origin2.clone(),1460 1,1461 31462 ));1463 assert_eq!(TemplateModule::white_list(1).len(), 0);1464 });1465}14661467#[test]1468fn nonprivileged_user_cannot_remove_address_from_white_list() {1469 new_test_ext().execute_with(|| {1470 let col_name1: Vec<u16> = "Test1\0".encode_utf16().collect::<Vec<u16>>();1471 let col_desc1: Vec<u16> = "TestDescription1\0".encode_utf16().collect::<Vec<u16>>();1472 let token_prefix1: Vec<u8> = b"token_prefix1\0".to_vec();1473 let mode: CollectionMode = CollectionMode::NFT(2000);1474 let origin1 = Origin::signed(1);1475 let origin2 = Origin::signed(2);14761477 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 }));14861487 assert_ok!(TemplateModule::create_collection(1488 origin1.clone(),1489 col_name1.clone(),1490 col_desc1.clone(),1491 token_prefix1.clone(),1492 mode1493 ));14941495 assert_ok!(TemplateModule::add_to_white_list(origin1.clone(), 1, 2));1496 assert_noop!(1497 TemplateModule::remove_from_white_list(origin2.clone(), 1, 2),1498 "You do not have permissions to modify this collection"1499 );1500 assert_eq!(TemplateModule::white_list(1)[0], 2);1501 });1502}15031504#[test]1505fn nobody_can_remove_address_from_white_list_of_nonexisting_collection() {1506 new_test_ext().execute_with(|| {1507 let origin1 = Origin::signed(1);15081509 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 }));15181519 assert_noop!(1520 TemplateModule::remove_from_white_list(origin1.clone(), 1, 2),1521 "This collection does not exist"1522 );1523 });1524}15251526#[test]1527fn nobody_can_remove_address_from_white_list_of_deleted_collection() {1528 new_test_ext().execute_with(|| {1529 let col_name1: Vec<u16> = "Test1\0".encode_utf16().collect::<Vec<u16>>();1530 let col_desc1: Vec<u16> = "TestDescription1\0".encode_utf16().collect::<Vec<u16>>();1531 let token_prefix1: Vec<u8> = b"token_prefix1\0".to_vec();1532 let mode: CollectionMode = CollectionMode::NFT(2000);1533 let origin1 = Origin::signed(1);1534 let origin2 = Origin::signed(2);15351536 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 }));15451546 assert_ok!(TemplateModule::create_collection(1547 origin1.clone(),1548 col_name1.clone(),1549 col_desc1.clone(),1550 token_prefix1.clone(),1551 mode1552 ));15531554 assert_ok!(TemplateModule::add_to_white_list(origin1.clone(), 1, 2));1555 assert_ok!(TemplateModule::destroy_collection(origin1.clone(), 1));1556 assert_noop!(1557 TemplateModule::remove_from_white_list(origin2.clone(), 1, 2),1558 "This collection does not exist"1559 );1560 assert_eq!(TemplateModule::white_list(1).len(), 0);1561 });1562}15631564// If address is already removed from white list, nothing happens1565#[test]1566fn address_is_already_removed_from_white_list() {1567 new_test_ext().execute_with(|| {1568 let col_name1: Vec<u16> = "Test1\0".encode_utf16().collect::<Vec<u16>>();1569 let col_desc1: Vec<u16> = "TestDescription1\0".encode_utf16().collect::<Vec<u16>>();1570 let token_prefix1: Vec<u8> = b"token_prefix1\0".to_vec();1571 let mode: CollectionMode = CollectionMode::NFT(2000);1572 let origin1 = Origin::signed(1);15731574 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 }));15831584 assert_ok!(TemplateModule::create_collection(1585 origin1.clone(),1586 col_name1.clone(),1587 col_desc1.clone(),1588 token_prefix1.clone(),1589 mode1590 ));15911592 assert_ok!(TemplateModule::add_to_white_list(origin1.clone(), 1, 2));1593 assert_ok!(TemplateModule::remove_from_white_list(1594 origin1.clone(),1595 1,1596 21597 ));1598 assert_ok!(TemplateModule::remove_from_white_list(1599 origin1.clone(),1600 1,1601 21602 ));1603 assert_eq!(TemplateModule::white_list(1).len(), 0);1604 });1605}16061607// If Public Access mode is set to WhiteList, tokens can’t be transferred from a non-whitelisted address with transfer or transferFrom (2 tests)1608#[test]1609fn white_list_test_1() {1610 new_test_ext().execute_with(|| {1611 let col_name1: Vec<u16> = "Test1\0".encode_utf16().collect::<Vec<u16>>();1612 let col_desc1: Vec<u16> = "TestDescription1\0".encode_utf16().collect::<Vec<u16>>();1613 let token_prefix1: Vec<u8> = b"token_prefix1\0".to_vec();1614 let mode: CollectionMode = CollectionMode::NFT(2000);16151616 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 }));16251626 let origin1 = Origin::signed(1);1627 assert_ok!(TemplateModule::create_collection(1628 origin1.clone(),1629 col_name1.clone(),1630 col_desc1.clone(),1631 token_prefix1.clone(),1632 mode1633 ));1634 assert_eq!(TemplateModule::collection(1).owner, 1);16351636 assert_ok!(TemplateModule::create_item(1637 origin1.clone(),1638 1,1639 [1, 2, 3].to_vec(),1640 11641 ));16421643 assert_ok!(TemplateModule::set_public_access_mode(1644 origin1.clone(),1645 1,1646 AccessMode::WhiteList1647 ));1648 assert_ok!(TemplateModule::add_to_white_list(origin1.clone(), 1, 2));16491650 assert_noop!(1651 TemplateModule::transfer(origin1.clone(), 3, 1, 1, 1),1652 "Address is not in white list"1653 );1654 });1655}16561657#[test]1658fn white_list_test_2() {1659 new_test_ext().execute_with(|| {1660 let col_name1: Vec<u16> = "Test1\0".encode_utf16().collect::<Vec<u16>>();1661 let col_desc1: Vec<u16> = "TestDescription1\0".encode_utf16().collect::<Vec<u16>>();1662 let token_prefix1: Vec<u8> = b"token_prefix1\0".to_vec();1663 let mode: CollectionMode = CollectionMode::NFT(2000);16641665 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 }));16741675 let origin1 = Origin::signed(1);1676 assert_ok!(TemplateModule::create_collection(1677 origin1.clone(),1678 col_name1.clone(),1679 col_desc1.clone(),1680 token_prefix1.clone(),1681 mode1682 ));1683 assert_eq!(TemplateModule::collection(1).owner, 1);16841685 assert_ok!(TemplateModule::create_item(1686 origin1.clone(),1687 1,1688 [1, 2, 3].to_vec(),1689 11690 ));16911692 assert_ok!(TemplateModule::set_public_access_mode(1693 origin1.clone(),1694 1,1695 AccessMode::WhiteList1696 ));1697 assert_ok!(TemplateModule::add_to_white_list(origin1.clone(), 1, 1));1698 assert_ok!(TemplateModule::add_to_white_list(origin1.clone(), 1, 2));16991700 // do approve1701 assert_ok!(TemplateModule::approve(origin1.clone(), 1, 1, 1));1702 assert_eq!(TemplateModule::approved(1, (1, 1)).len(), 1);17031704 assert_ok!(TemplateModule::remove_from_white_list(1705 origin1.clone(),1706 1,1707 11708 ));17091710 assert_noop!(1711 TemplateModule::transfer_from(origin1.clone(), 1, 3, 1, 1, 1),1712 "Address is not in white list"1713 );1714 });1715}17161717// If Public Access mode is set to WhiteList, tokens can’t be transferred to a non-whitelisted address with transfer or transferFrom (2 tests)1718#[test]1719fn white_list_test_3() {1720 new_test_ext().execute_with(|| {1721 let col_name1: Vec<u16> = "Test1\0".encode_utf16().collect::<Vec<u16>>();1722 let col_desc1: Vec<u16> = "TestDescription1\0".encode_utf16().collect::<Vec<u16>>();1723 let token_prefix1: Vec<u8> = b"token_prefix1\0".to_vec();1724 let mode: CollectionMode = CollectionMode::NFT(2000);17251726 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 }));17351736 let origin1 = Origin::signed(1);1737 assert_ok!(TemplateModule::create_collection(1738 origin1.clone(),1739 col_name1.clone(),1740 col_desc1.clone(),1741 token_prefix1.clone(),1742 mode1743 ));1744 assert_eq!(TemplateModule::collection(1).owner, 1);17451746 assert_ok!(TemplateModule::create_item(1747 origin1.clone(),1748 1,1749 [1, 2, 3].to_vec(),1750 11751 ));17521753 assert_ok!(TemplateModule::set_public_access_mode(1754 origin1.clone(),1755 1,1756 AccessMode::WhiteList1757 ));1758 assert_ok!(TemplateModule::add_to_white_list(origin1.clone(), 1, 1));17591760 assert_noop!(1761 TemplateModule::transfer(origin1.clone(), 3, 1, 1, 1),1762 "Address is not in white list"1763 );1764 });1765}17661767#[test]1768fn white_list_test_4() {1769 new_test_ext().execute_with(|| {1770 let col_name1: Vec<u16> = "Test1\0".encode_utf16().collect::<Vec<u16>>();1771 let col_desc1: Vec<u16> = "TestDescription1\0".encode_utf16().collect::<Vec<u16>>();1772 let token_prefix1: Vec<u8> = b"token_prefix1\0".to_vec();1773 let mode: CollectionMode = CollectionMode::NFT(2000);17741775 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 }));17841785 let origin1 = Origin::signed(1);1786 assert_ok!(TemplateModule::create_collection(1787 origin1.clone(),1788 col_name1.clone(),1789 col_desc1.clone(),1790 token_prefix1.clone(),1791 mode1792 ));1793 assert_eq!(TemplateModule::collection(1).owner, 1);17941795 assert_ok!(TemplateModule::create_item(1796 origin1.clone(),1797 1,1798 [1, 2, 3].to_vec(),1799 11800 ));18011802 assert_ok!(TemplateModule::set_public_access_mode(1803 origin1.clone(),1804 1,1805 AccessMode::WhiteList1806 ));1807 assert_ok!(TemplateModule::add_to_white_list(origin1.clone(), 1, 1));1808 assert_ok!(TemplateModule::add_to_white_list(origin1.clone(), 1, 2));18091810 // do approve1811 assert_ok!(TemplateModule::approve(origin1.clone(), 1, 1, 1));1812 assert_eq!(TemplateModule::approved(1, (1, 1)).len(), 1);18131814 assert_ok!(TemplateModule::remove_from_white_list(1815 origin1.clone(),1816 1,1817 21818 ));18191820 assert_noop!(1821 TemplateModule::transfer_from(origin1.clone(), 1, 3, 1, 1, 1),1822 "Address is not in white list"1823 );1824 });1825}18261827// If Public Access mode is set to WhiteList, tokens can’t be destroyed by a non-whitelisted address (even if it owned them before enabling WhiteList mode)1828#[test]1829fn white_list_test_5() {1830 new_test_ext().execute_with(|| {1831 let col_name1: Vec<u16> = "Test1\0".encode_utf16().collect::<Vec<u16>>();1832 let col_desc1: Vec<u16> = "TestDescription1\0".encode_utf16().collect::<Vec<u16>>();1833 let token_prefix1: Vec<u8> = b"token_prefix1\0".to_vec();1834 let mode: CollectionMode = CollectionMode::NFT(2000);18351836 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 }));18451846 let origin1 = Origin::signed(1);1847 assert_ok!(TemplateModule::create_collection(1848 origin1.clone(),1849 col_name1.clone(),1850 col_desc1.clone(),1851 token_prefix1.clone(),1852 mode1853 ));1854 assert_eq!(TemplateModule::collection(1).owner, 1);18551856 assert_ok!(TemplateModule::create_item(1857 origin1.clone(),1858 1,1859 [1, 2, 3].to_vec(),1860 11861 ));18621863 assert_ok!(TemplateModule::set_public_access_mode(1864 origin1.clone(),1865 1,1866 AccessMode::WhiteList1867 ));1868 assert_noop!(1869 TemplateModule::burn_item(origin1.clone(), 1, 1),1870 "Address is not in white list"1871 );1872 });1873}18741875// If Public Access mode is set to WhiteList, oken transfers can’t be Approved by a non-whitelisted address (see Approve method).1876#[test]1877fn white_list_test_6() {1878 new_test_ext().execute_with(|| {1879 let col_name1: Vec<u16> = "Test1\0".encode_utf16().collect::<Vec<u16>>();1880 let col_desc1: Vec<u16> = "TestDescription1\0".encode_utf16().collect::<Vec<u16>>();1881 let token_prefix1: Vec<u8> = b"token_prefix1\0".to_vec();1882 let mode: CollectionMode = CollectionMode::NFT(2000);18831884 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 }));18931894 let origin1 = Origin::signed(1);1895 assert_ok!(TemplateModule::create_collection(1896 origin1.clone(),1897 col_name1.clone(),1898 col_desc1.clone(),1899 token_prefix1.clone(),1900 mode1901 ));1902 assert_ok!(TemplateModule::set_public_access_mode(1903 origin1.clone(),1904 1,1905 AccessMode::WhiteList1906 ));19071908 // do approve1909 assert_noop!(1910 TemplateModule::approve(origin1.clone(), 1, 1, 1),1911 "Address is not in white list"1912 );1913 });1914}19151916// If Public Access mode is set to WhiteList, tokens can be transferred from a whitelisted address with transfer or transferFrom (2 tests) and1917// tokens can be transferred from a whitelisted address with transfer or transferFrom (2 tests)1918#[test]1919fn white_list_test_7() {1920 new_test_ext().execute_with(|| {1921 let col_name1: Vec<u16> = "Test1\0".encode_utf16().collect::<Vec<u16>>();1922 let col_desc1: Vec<u16> = "TestDescription1\0".encode_utf16().collect::<Vec<u16>>();1923 let token_prefix1: Vec<u8> = b"token_prefix1\0".to_vec();1924 let mode: CollectionMode = CollectionMode::NFT(2000);19251926 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 }));19351936 let origin1 = Origin::signed(1);1937 assert_ok!(TemplateModule::create_collection(1938 origin1.clone(),1939 col_name1.clone(),1940 col_desc1.clone(),1941 token_prefix1.clone(),1942 mode1943 ));1944 assert_eq!(TemplateModule::collection(1).owner, 1);19451946 assert_ok!(TemplateModule::create_item(1947 origin1.clone(),1948 1,1949 [1, 2, 3].to_vec(),1950 11951 ));19521953 assert_ok!(TemplateModule::set_public_access_mode(1954 origin1.clone(),1955 1,1956 AccessMode::WhiteList1957 ));1958 assert_ok!(TemplateModule::add_to_white_list(origin1.clone(), 1, 1));1959 assert_ok!(TemplateModule::add_to_white_list(origin1.clone(), 1, 2));19601961 assert_ok!(TemplateModule::transfer(origin1.clone(), 2, 1, 1, 1));1962 });1963}19641965#[test]1966fn white_list_test_8() {1967 new_test_ext().execute_with(|| {1968 let col_name1: Vec<u16> = "Test1\0".encode_utf16().collect::<Vec<u16>>();1969 let col_desc1: Vec<u16> = "TestDescription1\0".encode_utf16().collect::<Vec<u16>>();1970 let token_prefix1: Vec<u8> = b"token_prefix1\0".to_vec();1971 let mode: CollectionMode = CollectionMode::NFT(2000);19721973 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 }));19821983 let origin1 = Origin::signed(1);1984 assert_ok!(TemplateModule::create_collection(1985 origin1.clone(),1986 col_name1.clone(),1987 col_desc1.clone(),1988 token_prefix1.clone(),1989 mode1990 ));1991 assert_eq!(TemplateModule::collection(1).owner, 1);19921993 assert_ok!(TemplateModule::create_item(1994 origin1.clone(),1995 1,1996 [1, 2, 3].to_vec(),1997 11998 ));19992000 assert_ok!(TemplateModule::set_public_access_mode(2001 origin1.clone(),2002 1,2003 AccessMode::WhiteList2004 ));2005 assert_ok!(TemplateModule::add_to_white_list(origin1.clone(), 1, 1));2006 assert_ok!(TemplateModule::add_to_white_list(origin1.clone(), 1, 2));20072008 // do approve2009 assert_ok!(TemplateModule::approve(origin1.clone(), 1, 1, 1));2010 assert_eq!(TemplateModule::approved(1, (1, 1)).len(), 1);20112012 assert_ok!(TemplateModule::transfer_from(2013 origin1.clone(),2014 1,2015 2,2016 1,2017 1,2018 12019 ));2020 });2021}20222023// If Public Access mode is set to WhiteList, and Mint Permission is set to false, tokens can be created by owner.2024#[test]2025fn white_list_test_9() {2026 new_test_ext().execute_with(|| {2027 let col_name1: Vec<u16> = "Test1\0".encode_utf16().collect::<Vec<u16>>();2028 let col_desc1: Vec<u16> = "TestDescription1\0".encode_utf16().collect::<Vec<u16>>();2029 let token_prefix1: Vec<u8> = b"token_prefix1\0".to_vec();2030 let mode: CollectionMode = CollectionMode::NFT(2000);20312032 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 }));20412042 let origin1 = Origin::signed(1);2043 assert_ok!(TemplateModule::create_collection(2044 origin1.clone(),2045 col_name1.clone(),2046 col_desc1.clone(),2047 token_prefix1.clone(),2048 mode2049 ));20502051 assert_ok!(TemplateModule::set_public_access_mode(2052 origin1.clone(),2053 1,2054 AccessMode::WhiteList2055 ));2056 assert_ok!(TemplateModule::set_mint_permission(2057 origin1.clone(),2058 1,2059 false2060 ));20612062 assert_ok!(TemplateModule::create_item(2063 origin1.clone(),2064 1,2065 [1, 2, 3].to_vec(),2066 12067 ));2068 });2069}20702071// If Public Access mode is set to WhiteList, and Mint Permission is set to false, tokens can be created by admin.2072#[test]2073fn white_list_test_10() {2074 new_test_ext().execute_with(|| {2075 let col_name1: Vec<u16> = "Test1\0".encode_utf16().collect::<Vec<u16>>();2076 let col_desc1: Vec<u16> = "TestDescription1\0".encode_utf16().collect::<Vec<u16>>();2077 let token_prefix1: Vec<u8> = b"token_prefix1\0".to_vec();2078 let mode: CollectionMode = CollectionMode::NFT(2000);20792080 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 }));20892090 let origin1 = Origin::signed(1);2091 let origin2 = Origin::signed(2);2092 assert_ok!(TemplateModule::create_collection(2093 origin1.clone(),2094 col_name1.clone(),2095 col_desc1.clone(),2096 token_prefix1.clone(),2097 mode2098 ));20992100 assert_ok!(TemplateModule::set_public_access_mode(2101 origin1.clone(),2102 1,2103 AccessMode::WhiteList2104 ));2105 assert_ok!(TemplateModule::set_mint_permission(2106 origin1.clone(),2107 1,2108 false2109 ));21102111 assert_ok!(TemplateModule::add_collection_admin(origin1.clone(), 1, 2));21122113 assert_ok!(TemplateModule::create_item(2114 origin2.clone(),2115 1,2116 [1, 2, 3].to_vec(),2117 22118 ));2119 });2120}21212122// If Public Access mode is set to WhiteList, and Mint Permission is set to false, tokens cannot be created by non-privileged and white listed address.2123#[test]2124fn white_list_test_11() {2125 new_test_ext().execute_with(|| {2126 let col_name1: Vec<u16> = "Test1\0".encode_utf16().collect::<Vec<u16>>();2127 let col_desc1: Vec<u16> = "TestDescription1\0".encode_utf16().collect::<Vec<u16>>();2128 let token_prefix1: Vec<u8> = b"token_prefix1\0".to_vec();2129 let mode: CollectionMode = CollectionMode::NFT(2000);21302131 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 }));21402141 let origin1 = Origin::signed(1);2142 let origin2 = Origin::signed(2);2143 assert_ok!(TemplateModule::create_collection(2144 origin1.clone(),2145 col_name1.clone(),2146 col_desc1.clone(),2147 token_prefix1.clone(),2148 mode2149 ));21502151 assert_ok!(TemplateModule::set_public_access_mode(2152 origin1.clone(),2153 1,2154 AccessMode::WhiteList2155 ));2156 assert_ok!(TemplateModule::set_mint_permission(2157 origin1.clone(),2158 1,2159 false2160 ));2161 assert_ok!(TemplateModule::add_to_white_list(origin1.clone(), 1, 2));21622163 assert_noop!(2164 TemplateModule::create_item(origin2.clone(), 1, [1, 2, 3].to_vec(), 2),2165 "Collection is not in mint mode"2166 );2167 });2168}21692170// If Public Access mode is set to WhiteList, and Mint Permission is set to false, tokens cannot be created by non-privileged and non-white listed address.2171#[test]2172fn white_list_test_12() {2173 new_test_ext().execute_with(|| {2174 let col_name1: Vec<u16> = "Test1\0".encode_utf16().collect::<Vec<u16>>();2175 let col_desc1: Vec<u16> = "TestDescription1\0".encode_utf16().collect::<Vec<u16>>();2176 let token_prefix1: Vec<u8> = b"token_prefix1\0".to_vec();2177 let mode: CollectionMode = CollectionMode::NFT(2000);21782179 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 }));21882189 let origin1 = Origin::signed(1);2190 let origin2 = Origin::signed(2);2191 assert_ok!(TemplateModule::create_collection(2192 origin1.clone(),2193 col_name1.clone(),2194 col_desc1.clone(),2195 token_prefix1.clone(),2196 mode2197 ));21982199 assert_ok!(TemplateModule::set_public_access_mode(2200 origin1.clone(),2201 1,2202 AccessMode::WhiteList2203 ));2204 assert_ok!(TemplateModule::set_mint_permission(2205 origin1.clone(),2206 1,2207 false2208 ));22092210 assert_noop!(2211 TemplateModule::create_item(origin2.clone(), 1, [1, 2, 3].to_vec(), 2),2212 "Collection is not in mint mode"2213 );2214 });2215}22162217// If Public Access mode is set to WhiteList, and Mint Permission is set to true, tokens can be created by owner.2218#[test]2219fn white_list_test_13() {2220 new_test_ext().execute_with(|| {2221 let col_name1: Vec<u16> = "Test1\0".encode_utf16().collect::<Vec<u16>>();2222 let col_desc1: Vec<u16> = "TestDescription1\0".encode_utf16().collect::<Vec<u16>>();2223 let token_prefix1: Vec<u8> = b"token_prefix1\0".to_vec();2224 let mode: CollectionMode = CollectionMode::NFT(2000);22252226 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 }));22352236 let origin1 = Origin::signed(1);2237 assert_ok!(TemplateModule::create_collection(2238 origin1.clone(),2239 col_name1.clone(),2240 col_desc1.clone(),2241 token_prefix1.clone(),2242 mode2243 ));22442245 assert_ok!(TemplateModule::set_public_access_mode(2246 origin1.clone(),2247 1,2248 AccessMode::WhiteList2249 ));2250 assert_ok!(TemplateModule::set_mint_permission(2251 origin1.clone(),2252 1,2253 true2254 ));22552256 assert_ok!(TemplateModule::create_item(2257 origin1.clone(),2258 1,2259 [1, 2, 3].to_vec(),2260 12261 ));2262 });2263}22642265// If Public Access mode is set to WhiteList, and Mint Permission is set to true, tokens can be created by admin.2266#[test]2267fn white_list_test_14() {2268 new_test_ext().execute_with(|| {2269 let col_name1: Vec<u16> = "Test1\0".encode_utf16().collect::<Vec<u16>>();2270 let col_desc1: Vec<u16> = "TestDescription1\0".encode_utf16().collect::<Vec<u16>>();2271 let token_prefix1: Vec<u8> = b"token_prefix1\0".to_vec();2272 let mode: CollectionMode = CollectionMode::NFT(2000);22732274 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 }));22832284 let origin1 = Origin::signed(1);2285 let origin2 = Origin::signed(2);2286 assert_ok!(TemplateModule::create_collection(2287 origin1.clone(),2288 col_name1.clone(),2289 col_desc1.clone(),2290 token_prefix1.clone(),2291 mode2292 ));22932294 assert_ok!(TemplateModule::set_public_access_mode(2295 origin1.clone(),2296 1,2297 AccessMode::WhiteList2298 ));2299 assert_ok!(TemplateModule::set_mint_permission(2300 origin1.clone(),2301 1,2302 true2303 ));23042305 assert_ok!(TemplateModule::add_collection_admin(origin1.clone(), 1, 2));23062307 assert_ok!(TemplateModule::create_item(2308 origin2.clone(),2309 1,2310 [1, 2, 3].to_vec(),2311 22312 ));2313 });2314}23152316// If Public Access mode is set to WhiteList, and Mint Permission is set to true, tokens cannot be created by non-privileged and non-white listed address.2317#[test]2318fn white_list_test_15() {2319 new_test_ext().execute_with(|| {2320 let col_name1: Vec<u16> = "Test1\0".encode_utf16().collect::<Vec<u16>>();2321 let col_desc1: Vec<u16> = "TestDescription1\0".encode_utf16().collect::<Vec<u16>>();2322 let token_prefix1: Vec<u8> = b"token_prefix1\0".to_vec();2323 let mode: CollectionMode = CollectionMode::NFT(2000);23242325 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 }));23342335 let origin1 = Origin::signed(1);2336 let origin2 = Origin::signed(2);2337 assert_ok!(TemplateModule::create_collection(2338 origin1.clone(),2339 col_name1.clone(),2340 col_desc1.clone(),2341 token_prefix1.clone(),2342 mode2343 ));23442345 assert_ok!(TemplateModule::set_public_access_mode(2346 origin1.clone(),2347 1,2348 AccessMode::WhiteList2349 ));2350 assert_ok!(TemplateModule::set_mint_permission(2351 origin1.clone(),2352 1,2353 true2354 ));23552356 assert_noop!(2357 TemplateModule::create_item(origin2.clone(), 1, [1, 2, 3].to_vec(), 2),2358 "Address is not in white list"2359 );2360 });2361}23622363// If Public Access mode is set to WhiteList, and Mint Permission is set to true, tokens can be created by non-privileged and white listed address.2364#[test]2365fn white_list_test_16() {2366 new_test_ext().execute_with(|| {2367 let col_name1: Vec<u16> = "Test1\0".encode_utf16().collect::<Vec<u16>>();2368 let col_desc1: Vec<u16> = "TestDescription1\0".encode_utf16().collect::<Vec<u16>>();2369 let token_prefix1: Vec<u8> = b"token_prefix1\0".to_vec();2370 let mode: CollectionMode = CollectionMode::NFT(2000);23712372 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 }));23812382 let origin1 = Origin::signed(1);2383 let origin2 = Origin::signed(2);2384 assert_ok!(TemplateModule::create_collection(2385 origin1.clone(),2386 col_name1.clone(),2387 col_desc1.clone(),2388 token_prefix1.clone(),2389 mode2390 ));23912392 assert_ok!(TemplateModule::set_public_access_mode(2393 origin1.clone(),2394 1,2395 AccessMode::WhiteList2396 ));2397 assert_ok!(TemplateModule::set_mint_permission(2398 origin1.clone(),2399 1,2400 true2401 ));2402 assert_ok!(TemplateModule::add_to_white_list(origin1.clone(), 1, 2));24032404 assert_ok!(TemplateModule::create_item(2405 origin2.clone(),2406 1,2407 [1, 2, 3].to_vec(),2408 22409 ));2410 });2411}24122413// 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// #endregion