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.rsdiffbeforeafterboth135 mode: CollectionMode::NFT(50),137 mode: CollectionMode::NFT(50),136 access: AccessMode::Normal,138 access: AccessMode::Normal,137 decimal_points: 0,139 decimal_points: 0,138 name: vec!(),140 name: vec![],139 description: vec!(),141 description: vec![],140 token_prefix: vec!(),142 token_prefix: vec![],141 custom_data_size: 50,143 custom_data_size: 50,142 mint_mode: false,144 mint_mode: false,143 offchain_schema: vec!(),145 offchain_schema: vec![],144 sponsor: get_account_id_from_seed::<sr25519::Public>("Alice"),146 sponsor: get_account_id_from_seed::<sr25519::Public>("Alice"),145 unconfirmed_sponsor: get_account_id_from_seed::<sr25519::Public>("Alice"),147 unconfirmed_sponsor: get_account_id_from_seed::<sr25519::Public>("Alice"),146 })],148 },149 )],147 nft_item_id: vec!(),150 nft_item_id: vec![],148 fungible_item_id: vec!(),151 fungible_item_id: vec![],149 refungible_item_id: vec!(),152 refungible_item_id: vec![],153 chain_limit: ChainLimits {154 collection_numbers_limit: 10,155 account_token_ownership_limit: 10,156 collections_admins_limit: 5,157 custom_data_limit: 2048,158 nft_sponsor_transfer_timeout: 15,159 fungible_sponsor_transfer_timeout: 15,160 refungible_sponsor_transfer_timeout: 15,161 },150 }),162 }),151 contracts: Some(ContractsConfig {163 contracts: Some(ContractsConfig {152 current_schedule: ContractsSchedule {164 current_schedule: ContractsSchedule {pallets/nft/src/lib.rsdiffbeforeafterboth1#![cfg_attr(not(feature = "std"), no_std)]1#![cfg_attr(not(feature = "std"), no_std)]223#[cfg(feature = "std")]3#[cfg(feature = "std")]4pub use std::*;56#[cfg(feature = "std")]4pub use serde::*;7pub use serde::*;586use codec::{Decode, Encode};9use codec::{Decode, Encode};20 IsSubType, StorageValue,23 IsSubType, StorageValue,21};24};222523use frame_system::{self as system, ensure_signed};26use frame_system::{self as system, ensure_signed, ensure_root};24use sp_runtime::sp_std::prelude::Vec;27use sp_runtime::sp_std::prelude::Vec;25use sp_runtime::{28use sp_runtime::{26 traits::{29 traits::{157 pub vesting_date: Moment,160 pub vesting_date: Moment,158}161}159162163#[derive(Encode, Decode, Default, Debug, Clone, PartialEq)]164#[cfg_attr(feature = "std", derive(Serialize, Deserialize))]165pub struct BasketItem<AccountId, BlockNumber> {166 pub address: AccountId,167 pub start_block: BlockNumber,168}169170#[derive(Encode, Decode, Default, Debug, Clone, PartialEq)]171#[cfg_attr(feature = "std", derive(Serialize, Deserialize))]172pub struct ChainLimits {173 pub collection_numbers_limit: u64,174 pub account_token_ownership_limit: u64,175 pub collections_admins_limit: u64,176 pub custom_data_limit: u32,177178 // Timeouts for item types in passed blocks179 pub nft_sponsor_transfer_timeout: u32,180 pub fungible_sponsor_transfer_timeout: u32,181 pub refungible_sponsor_transfer_timeout: u32,182}183160pub trait Trait: system::Trait {184pub trait Trait: system::Trait {161 type Event: From<Event<Self>> + Into<<Self as system::Trait>::Event>;185 type Event: From<Event<Self>> + Into<<Self as system::Trait>::Event>;162}186}172 ChainVersion: u64;196 ChainVersion: u64;173 ItemListIndex: map hasher(blake2_128_concat) u64 => u64;197 ItemListIndex: map hasher(blake2_128_concat) u64 => u64;174198199 // Chain limits struct200 pub ChainLimit get(fn chain_limit) config(): ChainLimits;201202 // Bound counters203 CollectionCount: u64;204 pub AccountItemCount get(fn account_item_count): map hasher(identity) T::AccountId => u64;205206 // Basic collections175 pub Collection get(fn collection) config(): map hasher(identity) u64 => CollectionType<T::AccountId>;207 pub Collection get(fn collection) config(): map hasher(identity) u64 => CollectionType<T::AccountId>;176 pub AdminList get(fn admin_list_collection): map hasher(identity) u64 => Vec<T::AccountId>;208 pub AdminList get(fn admin_list_collection): map hasher(identity) u64 => Vec<T::AccountId>;177 pub WhiteList get(fn white_list): map hasher(identity) u64 => Vec<T::AccountId>;209 pub WhiteList get(fn white_list): map hasher(identity) u64 => Vec<T::AccountId>;190 /// Index list222 /// Index list191 pub AddressTokens get(fn address_tokens): double_map hasher(blake2_128_concat) u64, hasher(blake2_128_concat) T::AccountId => Vec<u64>;223 pub AddressTokens get(fn address_tokens): double_map hasher(blake2_128_concat) u64, hasher(blake2_128_concat) T::AccountId => Vec<u64>;192224225 /// Tokens transfer baskets226 pub NftTransferBasket get(fn nft_transfer_basket): double_map hasher(blake2_128_concat) u64, hasher(blake2_128_concat) u64 => T::BlockNumber;227 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>>;228 pub ReFungibleTransferBasket get(fn refungible_transfer_basket): double_map hasher(blake2_128_concat) u64, hasher(blake2_128_concat) u64 => T::BlockNumber;229193 // Sponsorship230 // Sponsorship194 pub ContractSponsor get(fn contract_sponsor): map hasher(identity) T::AccountId => T::AccountId;231 pub ContractSponsor get(fn contract_sponsor): map hasher(identity) T::AccountId => T::AccountId;195 pub UnconfirmedContractSponsor get(fn unconfirmed_contract_sponsor): map hasher(identity) T::AccountId => T::AccountId;232 pub UnconfirmedContractSponsor get(fn unconfirmed_contract_sponsor): map hasher(identity) T::AccountId => T::AccountId;196 }233 }197 add_extra_genesis {234 add_extra_genesis {198 build(|config: &GenesisConfig<T>| {235 build(|config: &GenesisConfig<T>| {199 // Modification of storage236 // Modification of storage200 for (_num, _c) in &config.collection {237 for (_num, _c) in &config.collection {201 <Module<T>>::init_collection(_c);238 <Module<T>>::init_collection(_c);202 }239 }212 for (_num, _q, _i) in &config.refungible_item_id {249 for (_num, _q, _i) in &config.refungible_item_id {213 <Module<T>>::init_refungible_token(_i);250 <Module<T>>::init_refungible_token(_i);214 }251 }215 })252 })216 }253 }217}254}218255295 // Anyone can create a collection332 // Anyone can create a collection296 let who = ensure_signed(origin)?;333 let who = ensure_signed(origin)?;297 let custom_data_size = match mode {334 let custom_data_size = match mode {298 CollectionMode::NFT(size) => size,335 CollectionMode::NFT(size) => {336337 // bound Custom data size338 ensure!(size < ChainLimit::get().custom_data_limit, "Custom data size bound exceeded");299 CollectionMode::ReFungible(size, _) => size,339 size340 },341 CollectionMode::ReFungible(size, _) => {342343 // bound Custom data size344 ensure!(size < ChainLimit::get().custom_data_limit, "Custom data size bound exceeded");345 size346 },300 _ => 0347 _ => 0301 };348 };302349306 _ => 0353 _ => 0307 };354 };308355356 // bound Total number of collections357 ensure!(CollectionCount::get() < ChainLimit::get().collection_numbers_limit, "Total collections bound exceeded");358309 // check params359 // check params310 ensure!(decimal_points <= 4, "decimal_points parameter must be lower than 4");360 ensure!(decimal_points <= 4, "decimal_points parameter must be lower than 4");311361326 .checked_add(1)376 .checked_add(1)327 .expect("collection id error");377 .expect("collection id error");328378379 // bound counter380 let total = CollectionCount::get()381 .checked_add(1)382 .expect("collection counter error");383329 CreatedCollectionCount::put(next_id);384 CreatedCollectionCount::put(next_id);385 CollectionCount::put(total);330386331 // Create new collection387 // Create new collection332 let new_collection = CollectionType {388 let new_collection = CollectionType {368 let sender = ensure_signed(origin)?;424 let sender = ensure_signed(origin)?;369 Self::check_owner_permissions(collection_id, sender)?;425 Self::check_owner_permissions(collection_id, sender)?;370426371 // TODO Items remove372 <AddressTokens<T>>::remove_prefix(collection_id);427 <AddressTokens<T>>::remove_prefix(collection_id);373 <ApprovedList<T>>::remove_prefix(collection_id);428 <ApprovedList<T>>::remove_prefix(collection_id);374 <Balance<T>>::remove_prefix(collection_id);429 <Balance<T>>::remove_prefix(collection_id);377 <Collection<T>>::remove(collection_id);432 <Collection<T>>::remove(collection_id);378 <WhiteList<T>>::remove(collection_id);433 <WhiteList<T>>::remove(collection_id);379434435 <NftItemList<T>>::remove_prefix(collection_id);436 <FungibleItemList<T>>::remove_prefix(collection_id);437 <ReFungibleItemList<T>>::remove_prefix(collection_id);438439 <NftTransferBasket<T>>::remove_prefix(collection_id);440 <FungibleTransferBasket<T>>::remove_prefix(collection_id);441 <ReFungibleTransferBasket<T>>::remove_prefix(collection_id);442443 if CollectionCount::get() > 0444 {445 // bound couter446 let total = CollectionCount::get()447 .checked_sub(1)448 .expect("collection counter error");449450 CollectionCount::put(total);451 }452380 Ok(())453 Ok(())381 }454 }382455544 ensure!(!admin_arr.contains(&new_admin_id), "Account already has admin role");617 ensure!(!admin_arr.contains(&new_admin_id), "Account already has admin role");545 }618 }546619620 // Number of collection admins621 ensure!((admin_arr.len() as u64) < ChainLimit::get().collections_admins_limit, "Number of collection admins bound exceeded");622547 admin_arr.push(new_admin_id);623 admin_arr.push(new_admin_id);548 <AdminList<T>>::insert(collection_id, admin_arr);624 <AdminList<T>>::insert(collection_id, admin_arr);549625758834759 // Transfer permissions check835 // Transfer permissions check760 let target_collection = <Collection<T>>::get(collection_id);836 let target_collection = <Collection<T>>::get(collection_id);761 ensure!(Self::is_item_owner(sender.clone(), collection_id, item_id) || 837 ensure!(Self::is_item_owner(sender.clone(), collection_id, item_id) ||762 Self::is_owner_or_admin_permissions(collection_id, sender.clone()), 838 Self::is_owner_or_admin_permissions(collection_id, sender.clone()),763 "Only item owner, collection owner and admins can modify item");839 "Only item owner, collection owner and admins can modify item");764840765 if target_collection.access == AccessMode::WhiteList {841 if target_collection.access == AccessMode::WhiteList {810886811 // Transfer permissions check887 // Transfer permissions check812 let target_collection = <Collection<T>>::get(collection_id);888 let target_collection = <Collection<T>>::get(collection_id);813 ensure!(Self::is_item_owner(sender.clone(), collection_id, item_id) || 889 ensure!(Self::is_item_owner(sender.clone(), collection_id, item_id) ||814 Self::is_owner_or_admin_permissions(collection_id, sender.clone()), 890 Self::is_owner_or_admin_permissions(collection_id, sender.clone()),815 "Only item owner, collection owner and admins can modify item");891 "Only item owner, collection owner and admins can modify item");816892817 if target_collection.access == AccessMode::WhiteList {893 if target_collection.access == AccessMode::WhiteList {852928853 // Transfer permissions check929 // Transfer permissions check854 let target_collection = <Collection<T>>::get(collection_id);930 let target_collection = <Collection<T>>::get(collection_id);855 ensure!(Self::is_item_owner(sender.clone(), collection_id, item_id) || 931 ensure!(Self::is_item_owner(sender.clone(), collection_id, item_id) ||856 Self::is_owner_or_admin_permissions(collection_id, sender.clone()), 932 Self::is_owner_or_admin_permissions(collection_id, sender.clone()),857 "Only item owner, collection owner and admins can approve");933 "Only item owner, collection owner and admins can approve");858934859 if target_collection.access == AccessMode::WhiteList {935 if target_collection.access == AccessMode::WhiteList {919995920 // Transfer permissions check996 // Transfer permissions check921 let target_collection = <Collection<T>>::get(collection_id);997 let target_collection = <Collection<T>>::get(collection_id);922 ensure!(appoved_transfer || Self::is_owner_or_admin_permissions(collection_id, sender.clone()), 998 ensure!(appoved_transfer || Self::is_owner_or_admin_permissions(collection_id, sender.clone()),923 "Only item owner, collection owner and admins can modify items");999 "Only item owner, collection owner and admins can modify items");9241000925 if target_collection.access == AccessMode::WhiteList {1001 if target_collection.access == AccessMode::WhiteList {9871063988 Ok(())1064 Ok(())989 }1065 }10661067 // Sudo permissions function1068 #[weight = 0]1069 pub fn set_chain_limits(1070 origin,1071 limits: ChainLimits1072 ) -> DispatchResult {1073 ensure_root(origin)?;1074 <ChainLimit>::put(limits);1075 Ok(())1076 } 990 }1077 }991}1078}99210791004 <ItemListIndex>::insert(item.collection, current_index);1091 <ItemListIndex>::insert(item.collection, current_index);1005 <FungibleItemList<T>>::insert(item.collection, current_index, itemcopy);1092 <FungibleItemList<T>>::insert(item.collection, current_index, itemcopy);100610931094 // Add current block1095 let v: Vec<BasketItem<T::AccountId, T::BlockNumber>> = Vec::new();1096 <FungibleTransferBasket<T>>::insert(item.collection, current_index, v);1097 1007 // Update balance1098 // Update balance1008 let new_balance = <Balance<T>>::get(item.collection, owner.clone())1099 let new_balance = <Balance<T>>::get(item.collection, owner.clone())1009 .checked_add(value)1100 .checked_add(value)1027 <ItemListIndex>::insert(item.collection, current_index);1118 <ItemListIndex>::insert(item.collection, current_index);1028 <ReFungibleItemList<T>>::insert(item.collection, current_index, itemcopy);1119 <ReFungibleItemList<T>>::insert(item.collection, current_index, itemcopy);102911201121 // Add current block1122 let block_number: T::BlockNumber = 0.into();1123 <ReFungibleTransferBasket<T>>::insert(item.collection, current_index, block_number);11241030 // Update balance1125 // Update balance1031 let new_balance = <Balance<T>>::get(item.collection, owner.clone())1126 let new_balance = <Balance<T>>::get(item.collection, owner.clone())1032 .checked_add(value)1127 .checked_add(value)1048 <ItemListIndex>::insert(collection_id, current_index);1143 <ItemListIndex>::insert(collection_id, current_index);1049 <NftItemList<T>>::insert(collection_id, current_index, item);1144 <NftItemList<T>>::insert(collection_id, current_index, item);105011451146 // Add current block1147 let block_number: T::BlockNumber = 0.into();1148 <NftTransferBasket<T>>::insert(collection_id, current_index, block_number);11491051 // Update balance1150 // Update balance1052 let new_balance = <Balance<T>>::get(collection_id, item_owner.clone())1151 let new_balance = <Balance<T>>::get(collection_id, item_owner.clone())1053 .checked_add(1)1152 .checked_add(1)1057 Ok(())1156 Ok(())1058 }1157 }105911581060 fn burn_refungible_item(collection_id: u64, item_id: u64, owner: T::AccountId) -> DispatchResult {1159 fn burn_refungible_item(1160 collection_id: u64,1161 item_id: u64,1162 owner: T::AccountId,1163 ) -> DispatchResult {1061 ensure!(1164 ensure!(1062 <ReFungibleItemList<T>>::contains_key(collection_id, item_id),1165 <ReFungibleItemList<T>>::contains_key(collection_id, item_id),1063 "Item does not exists"1166 "Item does not exists"1149 }1252 }115012531151 fn is_owner_or_admin_permissions(collection_id: u64, subject: T::AccountId) -> bool {1254 fn is_owner_or_admin_permissions(collection_id: u64, subject: T::AccountId) -> bool {11521153 let target_collection = <Collection<T>>::get(collection_id);1255 let target_collection = <Collection<T>>::get(collection_id);1154 let mut result: bool = subject == target_collection.owner;1256 let mut result: bool = subject == target_collection.owner;1155 let exists = <AdminList<T>>::contains_key(collection_id);1257 let exists = <AdminList<T>>::contains_key(collection_id);1163 result1265 result1164 }1266 }116512671166 fn check_owner_or_admin_permissions(collection_id: u64, subject: T::AccountId) -> DispatchResult {1268 fn check_owner_or_admin_permissions(1167 1269 collection_id: u64,1270 subject: T::AccountId,1271 ) -> DispatchResult {1168 Self::collection_exists(collection_id)?;1272 Self::collection_exists(collection_id)?;1169 let result = Self::is_owner_or_admin_permissions(collection_id, subject.clone());1273 let result = Self::is_owner_or_admin_permissions(collection_id, subject.clone());117012741171 ensure!(result, "You do not have permissions to modify this collection");1275 ensure!(1276 result,1277 "You do not have permissions to modify this collection"1278 );1172 Ok(())1279 Ok(())1173 }1280 }117412811193 }1300 }119413011195 fn check_white_list(collection_id: u64, address: &T::AccountId) -> DispatchResult {1302 fn check_white_list(collection_id: u64, address: &T::AccountId) -> DispatchResult {11961197 let mes = "Address is not in white list";1303 let mes = "Address is not in white list";1198 ensure!(<WhiteList<T>>::contains_key(collection_id), mes);1304 ensure!(<WhiteList<T>>::contains_key(collection_id), mes);1199 let wl = <WhiteList<T>>::get(collection_id);1305 let wl = <WhiteList<T>>::get(collection_id);1209 owner: T::AccountId,1315 owner: T::AccountId,1210 new_owner: T::AccountId,1316 new_owner: T::AccountId,1211 ) -> DispatchResult {1317 ) -> DispatchResult {12121213 ensure!(1318 ensure!(1214 <FungibleItemList<T>>::contains_key(collection_id, item_id),1319 <FungibleItemList<T>>::contains_key(collection_id, item_id),1215 "Item not exists"1320 "Item not exists"1299 owner: T::AccountId,1404 owner: T::AccountId,1300 new_owner: T::AccountId,1405 new_owner: T::AccountId,1301 ) -> DispatchResult {1406 ) -> DispatchResult {13021303 ensure!(1407 ensure!(1304 <ReFungibleItemList<T>>::contains_key(collection_id, item_id),1408 <ReFungibleItemList<T>>::contains_key(collection_id, item_id),1305 "Item not exists"1409 "Item not exists"1385 sender: T::AccountId,1489 sender: T::AccountId,1386 new_owner: T::AccountId,1490 new_owner: T::AccountId,1387 ) -> DispatchResult {1491 ) -> DispatchResult {1388 1389 ensure!(1492 ensure!(1390 <NftItemList<T>>::contains_key(collection_id, item_id),1493 <NftItemList<T>>::contains_key(collection_id, item_id),1391 "Item not exists"1494 "Item not exists"1422 Ok(())1525 Ok(())1423 }1526 }142415271425 fn init_collection(item: &CollectionType<T::AccountId>){1528 fn init_collection(item: &CollectionType<T::AccountId>) {1529 // check params1530 assert!(1531 item.decimal_points <= 4,1532 "decimal_points parameter must be lower than 4"1533 );1534 assert!(1535 item.name.len() <= 64,1536 "Collection name can not be longer than 63 char"1537 );1538 assert!(1539 item.name.len() <= 256,1540 "Collection description can not be longer than 255 char"1541 );1542 assert!(1543 item.token_prefix.len() <= 16,1544 "Token prefix can not be longer than 15 char"1545 );142615461427 // check params1547 // Generate next collection ID1428 assert!(item.decimal_points <= 4, "decimal_points parameter must be lower than 4");1429 assert!(item.name.len() <= 64, "Collection name can not be longer than 63 char");1430 assert!(item.name.len() <= 256, "Collection description can not be longer than 255 char");1431 assert!(item.token_prefix.len() <= 16, "Token prefix can not be longer than 15 char");1432 1433 // Generate next collection ID1434 let next_id = CreatedCollectionCount::get()1548 let next_id = CreatedCollectionCount::get()1435 .checked_add(1)1549 .checked_add(1)1436 .expect("collection id error");1550 .expect("collection id error");1437 15511438 CreatedCollectionCount::put(next_id); 1552 CreatedCollectionCount::put(next_id);1439 }1553 }144015541441 fn init_nft_token(item: &NftItemType<T::AccountId>){1555 fn init_nft_token(item: &NftItemType<T::AccountId>) {14421443 let current_index = <ItemListIndex>::get(item.collection)1556 let current_index = <ItemListIndex>::get(item.collection)1444 .checked_add(1)1557 .checked_add(1)1457 <Balance<T>>::insert(collection_id, item_owner.clone(), new_balance);1570 <Balance<T>>::insert(collection_id, item_owner.clone(), new_balance);1458 }1571 }145915721460 fn init_fungible_token(item: &FungibleItemType<T::AccountId>){1573 fn init_fungible_token(item: &FungibleItemType<T::AccountId>) {14611462 let current_index = <ItemListIndex>::get(item.collection)1574 let current_index = <ItemListIndex>::get(item.collection)1463 .checked_add(1)1575 .checked_add(1)1476 <Balance<T>>::insert(item.collection, owner.clone(), new_balance);1588 <Balance<T>>::insert(item.collection, owner.clone(), new_balance);1477 }1589 }147815901479 fn init_refungible_token(item: &ReFungibleItemType<T::AccountId>){1591 fn init_refungible_token(item: &ReFungibleItemType<T::AccountId>) {14801481 let current_index = <ItemListIndex>::get(item.collection)1592 let current_index = <ItemListIndex>::get(item.collection)1482 .checked_add(1)1593 .checked_add(1)1497 }1608 }149816091499 fn add_token_index(collection_id: u64, item_index: u64, owner: T::AccountId) -> DispatchResult {1610 fn add_token_index(collection_id: u64, item_index: u64, owner: T::AccountId) -> DispatchResult {16111612 // add to account limit1613 if <AccountItemCount<T>>::contains_key(owner.clone()) {16141615 // bound Owned tokens by a single address1616 let count = <AccountItemCount<T>>::get(owner.clone());1617 ensure!(count < ChainLimit::get().account_token_ownership_limit, "Owned tokens by a single address bound exceeded");16181619 <AccountItemCount<T>>::insert(owner.clone(), 1620 count.checked_add(1).unwrap());1621 }1622 else {1623 <AccountItemCount<T>>::insert(owner.clone(), 1);1624 }16251500 let list_exists = <AddressTokens<T>>::contains_key(collection_id, owner.clone());1626 let list_exists = <AddressTokens<T>>::contains_key(collection_id, owner.clone());1501 if list_exists {1627 if list_exists {1502 let mut list = <AddressTokens<T>>::get(collection_id, owner.clone());1628 let mut list = <AddressTokens<T>>::get(collection_id, owner.clone());1511 let mut itm = Vec::new();1637 let mut itm = Vec::new();1512 itm.push(item_index.clone());1638 itm.push(item_index.clone());1513 <AddressTokens<T>>::insert(collection_id, owner, itm);1639 <AddressTokens<T>>::insert(collection_id, owner, itm);1640 1514 }1641 }151516421516 Ok(())1643 Ok(())1521 item_index: u64,1648 item_index: u64,1522 owner: T::AccountId,1649 owner: T::AccountId,1523 ) -> DispatchResult {1650 ) -> DispatchResult {16511652 // update counter1653 <AccountItemCount<T>>::insert(owner.clone(), 1654 <AccountItemCount<T>>::get(owner.clone()).checked_sub(1).unwrap());165516561524 let list_exists = <AddressTokens<T>>::contains_key(collection_id, owner.clone());1657 let list_exists = <AddressTokens<T>>::contains_key(collection_id, owner.clone());1525 if list_exists {1658 if list_exists {1526 let mut list = <AddressTokens<T>>::get(collection_id, owner.clone());1659 let mut list = <AddressTokens<T>>::get(collection_id, owner.clone());1628 <Collection<T>>::get(collection_id).sponsor1761 <Collection<T>>::get(collection_id).sponsor1629 }1762 }1630 Some(Call::transfer(_new_owner, collection_id, _item_id, _value)) => {1763 Some(Call::transfer(_new_owner, collection_id, _item_id, _value)) => {1631 <Collection<T>>::get(collection_id).sponsor1764 let _collection_mode = <Collection<T>>::get(collection_id).mode;17651766 // sponsor timeout1767 let sponsor_transfer = match _collection_mode {1768 CollectionMode::NFT(_) => {1769 let basket = <NftTransferBasket<T>>::get(collection_id, _item_id);1770 let block_number = <system::Module<T>>::block_number() as T::BlockNumber;1771 let limit_time = basket + ChainLimit::get().nft_sponsor_transfer_timeout.into();1772 if block_number >= limit_time {1773 <NftTransferBasket<T>>::insert(collection_id, _item_id, block_number);1774 true1775 }1776 else {1777 false1778 }1779 }1780 CollectionMode::Fungible(_) => {1781 let mut basket = <FungibleTransferBasket<T>>::get(collection_id, _item_id);1782 let block_number = <system::Module<T>>::block_number() as T::BlockNumber;1783 if basket.iter().any(|i| i.address == _new_owner.clone())1784 {1785 let item = basket.iter_mut().find(|i| i.address == _new_owner.clone()).unwrap().clone();1786 let limit_time = item.start_block + ChainLimit::get().fungible_sponsor_transfer_timeout.into();1787 if block_number >= limit_time {1788 basket.retain(|x| x.address == item.address);1789 basket.push(BasketItem { start_block: block_number, address: _new_owner.clone() });1790 <FungibleTransferBasket<T>>::insert(collection_id, _item_id, basket);1791 true1792 }1793 else {1794 false1795 }1796 }1797 else {1798 basket.push(BasketItem { start_block: block_number, address: _new_owner.clone()});1799 true1800 }1801 }1802 CollectionMode::ReFungible(_, _) => {1803 let basket = <ReFungibleTransferBasket<T>>::get(collection_id, _item_id);1804 let block_number = <system::Module<T>>::block_number() as T::BlockNumber;1805 let limit_time = basket + ChainLimit::get().nft_sponsor_transfer_timeout.into();1806 if block_number >= limit_time {1807 <ReFungibleTransferBasket<T>>::insert(collection_id, _item_id, block_number);1808 true1809 } else {1810 false1811 }1812 }1813 _ => {1814 false1815 },1816 };18171818 if !sponsor_transfer {1819 T::AccountId::default()1820 } else {1821 <Collection<T>>::get(collection_id).sponsor1822 }1632 }1823 }163318241634 _ => T::AccountId::default(),1825 _ => T::AccountId::default(),1745 Ok(())1936 Ok(())1746 }1937 }1747}1938}1748// #endregion1939// #endregion1940pallets/nft/src/mock.rsdiffbeforeafterbothno syntactic changes
pallets/nft/src/tests.rsdiffbeforeafterboth1// Tests to be written here1// Tests to be written here2use crate::mock::*;2use crate::mock::*;3use crate::{ApprovePermissions, CollectionMode, AccessMode, Ownership};3use crate::{AccessMode, ApprovePermissions, CollectionMode, Ownership, ChainLimits};4use frame_support::{assert_noop, assert_ok};4use frame_support::{assert_noop, assert_ok};5use frame_system::{ RawOrigin };566// Use cases tests region7// Use cases tests region7// #region8// #region13 let token_prefix1: Vec<u8> = b"token_prefix1\0".to_vec();14 let token_prefix1: Vec<u8> = b"token_prefix1\0".to_vec();14 let mode: CollectionMode = CollectionMode::NFT(2000);15 let mode: CollectionMode = CollectionMode::NFT(2000);151617 assert_ok!(TemplateModule::set_chain_limits(RawOrigin::Root.into(), ChainLimits { 18 collection_numbers_limit: 10,19 account_token_ownership_limit: 10,20 collections_admins_limit: 5,21 custom_data_limit: 2048,22 nft_sponsor_transfer_timeout: 15,23 fungible_sponsor_transfer_timeout: 15,24 refungible_sponsor_transfer_timeout: 15, 25 }));2616 let origin1 = Origin::signed(1);27 let origin1 = Origin::signed(1);17 assert_ok!(TemplateModule::create_collection(28 assert_ok!(TemplateModule::create_collection(18 origin1.clone(),29 origin1.clone(),41 let token_prefix1: Vec<u8> = b"token_prefix1\0".to_vec();52 let token_prefix1: Vec<u8> = b"token_prefix1\0".to_vec();42 let mode: CollectionMode = CollectionMode::ReFungible(2000, 3);53 let mode: CollectionMode = CollectionMode::ReFungible(2000, 3);435455 assert_ok!(TemplateModule::set_chain_limits(RawOrigin::Root.into(), ChainLimits { 56 collection_numbers_limit: 10,57 account_token_ownership_limit: 10,58 collections_admins_limit: 5,59 custom_data_limit: 2048,60 nft_sponsor_transfer_timeout: 15,61 fungible_sponsor_transfer_timeout: 15,62 refungible_sponsor_transfer_timeout: 15, 63 }));6444 let origin1 = Origin::signed(1);65 let origin1 = Origin::signed(1);45 assert_ok!(TemplateModule::create_collection(66 assert_ok!(TemplateModule::create_collection(46 origin1.clone(),67 origin1.clone(),79 let token_prefix1: Vec<u8> = b"token_prefix1\0".to_vec();100 let token_prefix1: Vec<u8> = b"token_prefix1\0".to_vec();80 let mode: CollectionMode = CollectionMode::Fungible(3);101 let mode: CollectionMode = CollectionMode::Fungible(3);81102103 assert_ok!(TemplateModule::set_chain_limits(RawOrigin::Root.into(), ChainLimits { 104 collection_numbers_limit: 10,105 account_token_ownership_limit: 10,106 collections_admins_limit: 5,107 custom_data_limit: 2048,108 nft_sponsor_transfer_timeout: 15,109 fungible_sponsor_transfer_timeout: 15,110 refungible_sponsor_transfer_timeout: 15, 111 }));11282 let origin1 = Origin::signed(1);113 let origin1 = Origin::signed(1);83 assert_ok!(TemplateModule::create_collection(114 assert_ok!(TemplateModule::create_collection(84 origin1.clone(),115 origin1.clone(),109 let token_prefix1: Vec<u8> = b"token_prefix1\0".to_vec();140 let token_prefix1: Vec<u8> = b"token_prefix1\0".to_vec();110 let mode: CollectionMode = CollectionMode::Fungible(3);141 let mode: CollectionMode = CollectionMode::Fungible(3);111142143 assert_ok!(TemplateModule::set_chain_limits(RawOrigin::Root.into(), ChainLimits { 144 collection_numbers_limit: 10,145 account_token_ownership_limit: 10,146 collections_admins_limit: 5,147 custom_data_limit: 2048,148 nft_sponsor_transfer_timeout: 15,149 fungible_sponsor_transfer_timeout: 15,150 refungible_sponsor_transfer_timeout: 15, 151 }));152112 let origin1 = Origin::signed(1);153 let origin1 = Origin::signed(1);113 let origin2 = Origin::signed(2);154 let origin2 = Origin::signed(2);114 assert_ok!(TemplateModule::create_collection(155 assert_ok!(TemplateModule::create_collection(167 let token_prefix1: Vec<u8> = b"token_prefix1\0".to_vec();208 let token_prefix1: Vec<u8> = b"token_prefix1\0".to_vec();168 let mode: CollectionMode = CollectionMode::ReFungible(2000, 3);209 let mode: CollectionMode = CollectionMode::ReFungible(2000, 3);169210211 assert_ok!(TemplateModule::set_chain_limits(RawOrigin::Root.into(), ChainLimits { 212 collection_numbers_limit: 10,213 account_token_ownership_limit: 10,214 collections_admins_limit: 5,215 custom_data_limit: 2048,216 nft_sponsor_transfer_timeout: 15,217 fungible_sponsor_transfer_timeout: 15,218 refungible_sponsor_transfer_timeout: 15, 219 }));220170 let origin1 = Origin::signed(1);221 let origin1 = Origin::signed(1);171 let origin2 = Origin::signed(2);222 let origin2 = Origin::signed(2);172 assert_ok!(TemplateModule::create_collection(223 assert_ok!(TemplateModule::create_collection(264 let token_prefix1: Vec<u8> = b"token_prefix1\0".to_vec();315 let token_prefix1: Vec<u8> = b"token_prefix1\0".to_vec();265 let mode: CollectionMode = CollectionMode::NFT(2000);316 let mode: CollectionMode = CollectionMode::NFT(2000);266317318 assert_ok!(TemplateModule::set_chain_limits(RawOrigin::Root.into(), ChainLimits { 319 collection_numbers_limit: 10,320 account_token_ownership_limit: 10,321 collections_admins_limit: 5,322 custom_data_limit: 2048,323 nft_sponsor_transfer_timeout: 15,324 fungible_sponsor_transfer_timeout: 15,325 refungible_sponsor_transfer_timeout: 15, 326 }));327267 let origin1 = Origin::signed(1);328 let origin1 = Origin::signed(1);268 assert_ok!(TemplateModule::create_collection(329 assert_ok!(TemplateModule::create_collection(269 origin1.clone(),330 origin1.clone(),302 let token_prefix1: Vec<u8> = b"token_prefix1\0".to_vec();363 let token_prefix1: Vec<u8> = b"token_prefix1\0".to_vec();303 let mode: CollectionMode = CollectionMode::NFT(2000);364 let mode: CollectionMode = CollectionMode::NFT(2000);304365366 assert_ok!(TemplateModule::set_chain_limits(RawOrigin::Root.into(), ChainLimits { 367 collection_numbers_limit: 10,368 account_token_ownership_limit: 10,369 collections_admins_limit: 5,370 custom_data_limit: 2048,371 nft_sponsor_transfer_timeout: 15,372 fungible_sponsor_transfer_timeout: 15,373 refungible_sponsor_transfer_timeout: 15, 374 }));375305 let origin1 = Origin::signed(1);376 let origin1 = Origin::signed(1);306 let origin2 = Origin::signed(2);377 let origin2 = Origin::signed(2);307 assert_ok!(TemplateModule::create_collection(378 assert_ok!(TemplateModule::create_collection(323 assert_eq!(TemplateModule::balance_count(1, 1), 1);394 assert_eq!(TemplateModule::balance_count(1, 1), 1);324 assert_eq!(TemplateModule::address_tokens(1, 1), [1]);395 assert_eq!(TemplateModule::address_tokens(1, 1), [1]);325396326 assert_ok!(TemplateModule::set_mint_permission(origin1.clone(), 1, true));397 assert_ok!(TemplateModule::set_mint_permission(398 origin1.clone(),399 1,400 true401 ));327 assert_ok!(TemplateModule::set_public_access_mode(origin1.clone(), 1, AccessMode::WhiteList));402 assert_ok!(TemplateModule::set_public_access_mode(403 origin1.clone(),404 1,405 AccessMode::WhiteList406 ));328 assert_ok!(TemplateModule::add_to_white_list(origin1.clone(), 1, 1));407 assert_ok!(TemplateModule::add_to_white_list(origin1.clone(), 1, 1));329 assert_ok!(TemplateModule::add_to_white_list(origin1.clone(), 1, 2));408 assert_ok!(TemplateModule::add_to_white_list(origin1.clone(), 1, 2));330 assert_ok!(TemplateModule::add_to_white_list(origin1.clone(), 1, 3));409 assert_ok!(TemplateModule::add_to_white_list(origin1.clone(), 1, 3));362 let token_prefix1: Vec<u8> = b"token_prefix1\0".to_vec();441 let token_prefix1: Vec<u8> = b"token_prefix1\0".to_vec();363 let mode: CollectionMode = CollectionMode::ReFungible(2000, 3);442 let mode: CollectionMode = CollectionMode::ReFungible(2000, 3);364443444 assert_ok!(TemplateModule::set_chain_limits(RawOrigin::Root.into(), ChainLimits { 445 collection_numbers_limit: 10,446 account_token_ownership_limit: 10,447 collections_admins_limit: 5,448 custom_data_limit: 2048,449 nft_sponsor_transfer_timeout: 15,450 fungible_sponsor_transfer_timeout: 15,451 refungible_sponsor_transfer_timeout: 15, 452 }));453365 let origin1 = Origin::signed(1);454 let origin1 = Origin::signed(1);366 let origin2 = Origin::signed(2);455 let origin2 = Origin::signed(2);367 assert_ok!(TemplateModule::create_collection(456 assert_ok!(TemplateModule::create_collection(393 assert_eq!(TemplateModule::balance_count(1, 1), 1000);482 assert_eq!(TemplateModule::balance_count(1, 1), 1000);394 assert_eq!(TemplateModule::address_tokens(1, 1), [1]);483 assert_eq!(TemplateModule::address_tokens(1, 1), [1]);395484396 assert_ok!(TemplateModule::set_mint_permission(origin1.clone(), 1, true));485 assert_ok!(TemplateModule::set_mint_permission(486 origin1.clone(),487 1,488 true489 ));397 assert_ok!(TemplateModule::set_public_access_mode(origin1.clone(), 1, AccessMode::WhiteList));490 assert_ok!(TemplateModule::set_public_access_mode(491 origin1.clone(),492 1,493 AccessMode::WhiteList494 ));398 assert_ok!(TemplateModule::add_to_white_list(origin1.clone(), 1, 1));495 assert_ok!(TemplateModule::add_to_white_list(origin1.clone(), 1, 1));399 assert_ok!(TemplateModule::add_to_white_list(origin1.clone(), 1, 2));496 assert_ok!(TemplateModule::add_to_white_list(origin1.clone(), 1, 2));400 assert_ok!(TemplateModule::add_to_white_list(origin1.clone(), 1, 3));497 assert_ok!(TemplateModule::add_to_white_list(origin1.clone(), 1, 3));444 let token_prefix1: Vec<u8> = b"token_prefix1\0".to_vec();541 let token_prefix1: Vec<u8> = b"token_prefix1\0".to_vec();445 let mode: CollectionMode = CollectionMode::Fungible(3);542 let mode: CollectionMode = CollectionMode::Fungible(3);446543544 assert_ok!(TemplateModule::set_chain_limits(RawOrigin::Root.into(), ChainLimits { 545 collection_numbers_limit: 10,546 account_token_ownership_limit: 10,547 collections_admins_limit: 5,548 custom_data_limit: 2048,549 nft_sponsor_transfer_timeout: 15,550 fungible_sponsor_transfer_timeout: 15,551 refungible_sponsor_transfer_timeout: 15, 552 }));553447 let origin1 = Origin::signed(1);554 let origin1 = Origin::signed(1);448 let origin2 = Origin::signed(2);555 let origin2 = Origin::signed(2);449 assert_ok!(TemplateModule::create_collection(556 assert_ok!(TemplateModule::create_collection(465 assert_eq!(TemplateModule::balance_count(1, 1), 1000);572 assert_eq!(TemplateModule::balance_count(1, 1), 1000);466 assert_eq!(TemplateModule::address_tokens(1, 1), [1]);573 assert_eq!(TemplateModule::address_tokens(1, 1), [1]);467574468 assert_ok!(TemplateModule::set_mint_permission(origin1.clone(), 1, true));575 assert_ok!(TemplateModule::set_mint_permission(576 origin1.clone(),577 1,578 true579 ));469 assert_ok!(TemplateModule::set_public_access_mode(origin1.clone(), 1, AccessMode::WhiteList));580 assert_ok!(TemplateModule::set_public_access_mode(581 origin1.clone(),582 1,583 AccessMode::WhiteList584 ));470 assert_ok!(TemplateModule::add_to_white_list(origin1.clone(), 1, 1));585 assert_ok!(TemplateModule::add_to_white_list(origin1.clone(), 1, 1));471 assert_ok!(TemplateModule::add_to_white_list(origin1.clone(), 1, 2));586 assert_ok!(TemplateModule::add_to_white_list(origin1.clone(), 1, 2));472 assert_ok!(TemplateModule::add_to_white_list(origin1.clone(), 1, 3));587 assert_ok!(TemplateModule::add_to_white_list(origin1.clone(), 1, 3));532 let token_prefix1: Vec<u8> = b"token_prefix1\0".to_vec();647 let token_prefix1: Vec<u8> = b"token_prefix1\0".to_vec();533 let mode: CollectionMode = CollectionMode::NFT(2000);648 let mode: CollectionMode = CollectionMode::NFT(2000);534649650 assert_ok!(TemplateModule::set_chain_limits(RawOrigin::Root.into(), ChainLimits { 651 collection_numbers_limit: 10,652 account_token_ownership_limit: 10,653 collections_admins_limit: 5,654 custom_data_limit: 2048,655 nft_sponsor_transfer_timeout: 15,656 fungible_sponsor_transfer_timeout: 15,657 refungible_sponsor_transfer_timeout: 15, 658 }));659535 let origin1 = Origin::signed(1);660 let origin1 = Origin::signed(1);536 assert_ok!(TemplateModule::create_collection(661 assert_ok!(TemplateModule::create_collection(537 origin1.clone(),662 origin1.clone(),557 let token_prefix1: Vec<u8> = b"token_prefix1\0".to_vec();682 let token_prefix1: Vec<u8> = b"token_prefix1\0".to_vec();558 let mode: CollectionMode = CollectionMode::NFT(2000);683 let mode: CollectionMode = CollectionMode::NFT(2000);559684685 assert_ok!(TemplateModule::set_chain_limits(RawOrigin::Root.into(), ChainLimits { 686 collection_numbers_limit: 10,687 account_token_ownership_limit: 10,688 collections_admins_limit: 5,689 custom_data_limit: 2048,690 nft_sponsor_transfer_timeout: 15,691 fungible_sponsor_transfer_timeout: 15,692 refungible_sponsor_transfer_timeout: 15, 693 }));694560 let origin1 = Origin::signed(1);695 let origin1 = Origin::signed(1);561 assert_ok!(TemplateModule::create_collection(696 assert_ok!(TemplateModule::create_collection(562 origin1.clone(),697 origin1.clone(),577 let token_prefix1: Vec<u8> = b"token_prefix1\0".to_vec();712 let token_prefix1: Vec<u8> = b"token_prefix1\0".to_vec();578 let mode: CollectionMode = CollectionMode::NFT(2000);713 let mode: CollectionMode = CollectionMode::NFT(2000);579714715 assert_ok!(TemplateModule::set_chain_limits(RawOrigin::Root.into(), ChainLimits { 716 collection_numbers_limit: 10,717 account_token_ownership_limit: 10,718 collections_admins_limit: 5,719 custom_data_limit: 2048,720 nft_sponsor_transfer_timeout: 15,721 fungible_sponsor_transfer_timeout: 15,722 refungible_sponsor_transfer_timeout: 15, 723 }));724580 let origin1 = Origin::signed(1);725 let origin1 = Origin::signed(1);581 assert_ok!(TemplateModule::create_collection(726 assert_ok!(TemplateModule::create_collection(582 origin1.clone(),727 origin1.clone(),617 let token_prefix1: Vec<u8> = b"token_prefix1\0".to_vec();762 let token_prefix1: Vec<u8> = b"token_prefix1\0".to_vec();618 let mode: CollectionMode = CollectionMode::Fungible(3);763 let mode: CollectionMode = CollectionMode::Fungible(3);619764765 assert_ok!(TemplateModule::set_chain_limits(RawOrigin::Root.into(), ChainLimits { 766 collection_numbers_limit: 10,767 account_token_ownership_limit: 10,768 collections_admins_limit: 5,769 custom_data_limit: 2048,770 nft_sponsor_transfer_timeout: 15,771 fungible_sponsor_transfer_timeout: 15,772 refungible_sponsor_transfer_timeout: 15, 773 }));774620 let origin1 = Origin::signed(1);775 let origin1 = Origin::signed(1);621 assert_ok!(TemplateModule::create_collection(776 assert_ok!(TemplateModule::create_collection(622 origin1.clone(),777 origin1.clone(),655 let token_prefix1: Vec<u8> = b"token_prefix1\0".to_vec();810 let token_prefix1: Vec<u8> = b"token_prefix1\0".to_vec();656 let mode: CollectionMode = CollectionMode::ReFungible(200, 3);811 let mode: CollectionMode = CollectionMode::ReFungible(200, 3);657812813 assert_ok!(TemplateModule::set_chain_limits(RawOrigin::Root.into(), ChainLimits { 814 collection_numbers_limit: 10,815 account_token_ownership_limit: 10,816 collections_admins_limit: 5,817 custom_data_limit: 2048,818 nft_sponsor_transfer_timeout: 15,819 fungible_sponsor_transfer_timeout: 15,820 refungible_sponsor_transfer_timeout: 15, 821 }));822658 let origin1 = Origin::signed(1);823 let origin1 = Origin::signed(1);659 let origin2 = Origin::signed(2);824 let origin2 = Origin::signed(2);660 assert_ok!(TemplateModule::create_collection(825 assert_ok!(TemplateModule::create_collection(664 token_prefix1.clone(),829 token_prefix1.clone(),665 mode830 mode666 ));831 ));832667 833 assert_ok!(TemplateModule::set_mint_permission(668 assert_ok!(TemplateModule::set_mint_permission(origin1.clone(), 1, true));834 origin1.clone(),835 1,836 true837 ));669 assert_ok!(TemplateModule::set_public_access_mode(origin1.clone(), 1, AccessMode::WhiteList));838 assert_ok!(TemplateModule::set_public_access_mode(839 origin1.clone(),840 1,841 AccessMode::WhiteList842 ));670 assert_ok!(TemplateModule::add_to_white_list(origin1.clone(), 1, 1));843 assert_ok!(TemplateModule::add_to_white_list(origin1.clone(), 1, 1));671844672 assert_ok!(TemplateModule::add_collection_admin(origin1.clone(), 1, 2));845 assert_ok!(TemplateModule::add_collection_admin(origin1.clone(), 1, 2));704 let token_prefix1: Vec<u8> = b"token_prefix1\0".to_vec();877 let token_prefix1: Vec<u8> = b"token_prefix1\0".to_vec();705 let mode: CollectionMode = CollectionMode::NFT(2000);878 let mode: CollectionMode = CollectionMode::NFT(2000);706879880 assert_ok!(TemplateModule::set_chain_limits(RawOrigin::Root.into(), ChainLimits { 881 collection_numbers_limit: 10,882 account_token_ownership_limit: 10,883 collections_admins_limit: 5,884 custom_data_limit: 2048,885 nft_sponsor_transfer_timeout: 15,886 fungible_sponsor_transfer_timeout: 15,887 refungible_sponsor_transfer_timeout: 15, 888 }));889707 let origin1 = Origin::signed(1);890 let origin1 = Origin::signed(1);708 let origin2 = Origin::signed(2);891 let origin2 = Origin::signed(2);709 let origin3 = Origin::signed(3);892 let origin3 = Origin::signed(3);754 let origin2 = Origin::signed(2);937 let origin2 = Origin::signed(2);755 let origin3 = Origin::signed(3);938 let origin3 = Origin::signed(3);756939940 assert_ok!(TemplateModule::set_chain_limits(RawOrigin::Root.into(), ChainLimits { 941 collection_numbers_limit: 10,942 account_token_ownership_limit: 10,943 collections_admins_limit: 5,944 custom_data_limit: 2048,945 nft_sponsor_transfer_timeout: 15,946 fungible_sponsor_transfer_timeout: 15,947 refungible_sponsor_transfer_timeout: 15, 948 }));949757 assert_ok!(TemplateModule::create_collection(950 assert_ok!(TemplateModule::create_collection(758 origin1.clone(),951 origin1.clone(),759 col_name1.clone(),952 col_name1.clone(),8091002810 let origin1 = Origin::signed(1);1003 let origin1 = Origin::signed(1);81110041005 assert_ok!(TemplateModule::set_chain_limits(RawOrigin::Root.into(), ChainLimits { 1006 collection_numbers_limit: 10,1007 account_token_ownership_limit: 10,1008 collections_admins_limit: 5,1009 custom_data_limit: 2048,1010 nft_sponsor_transfer_timeout: 15,1011 fungible_sponsor_transfer_timeout: 15,1012 refungible_sponsor_transfer_timeout: 15, 1013 }));1014812 assert_ok!(TemplateModule::create_collection(1015 assert_ok!(TemplateModule::create_collection(813 origin1.clone(),1016 origin1.clone(),814 col_name1.clone(),1017 col_name1.clone(),881 let nft_mode: CollectionMode = CollectionMode::NFT(2000);1084 let nft_mode: CollectionMode = CollectionMode::NFT(2000);882 let origin1 = Origin::signed(1);1085 let origin1 = Origin::signed(1);88310861087 assert_ok!(TemplateModule::set_chain_limits(RawOrigin::Root.into(), ChainLimits { 1088 collection_numbers_limit: 10,1089 account_token_ownership_limit: 10,1090 collections_admins_limit: 5,1091 custom_data_limit: 2048,1092 nft_sponsor_transfer_timeout: 15,1093 fungible_sponsor_transfer_timeout: 15,1094 refungible_sponsor_transfer_timeout: 15, 1095 }));1096884 assert_ok!(TemplateModule::create_collection(1097 assert_ok!(TemplateModule::create_collection(885 origin1.clone(),1098 origin1.clone(),886 col_name1.clone(),1099 col_name1.clone(),915 let origin1 = Origin::signed(1);1128 let origin1 = Origin::signed(1);916 let origin2 = Origin::signed(2);1129 let origin2 = Origin::signed(2);91711301131 assert_ok!(TemplateModule::set_chain_limits(RawOrigin::Root.into(), ChainLimits { 1132 collection_numbers_limit: 10,1133 account_token_ownership_limit: 10,1134 collections_admins_limit: 5,1135 custom_data_limit: 2048,1136 nft_sponsor_transfer_timeout: 15,1137 fungible_sponsor_transfer_timeout: 15,1138 refungible_sponsor_transfer_timeout: 15, 1139 }));1140918 assert_ok!(TemplateModule::create_collection(1141 assert_ok!(TemplateModule::create_collection(919 origin1.clone(),1142 origin1.clone(),920 col_name1.clone(),1143 col_name1.clone(),937 assert_ok!(TemplateModule::approve(origin1.clone(), 2, 1, 1));1160 assert_ok!(TemplateModule::approve(origin1.clone(), 2, 1, 1));938 assert_eq!(TemplateModule::approved(1, (1, 1))[0].approved, 2);1161 assert_eq!(TemplateModule::approved(1, (1, 1))[0].approved, 2);9391162940 assert_ok!(TemplateModule::set_mint_permission(origin1.clone(), 1, true));1163 assert_ok!(TemplateModule::set_mint_permission(1164 origin1.clone(),1165 1,1166 true1167 ));941 assert_ok!(TemplateModule::set_public_access_mode(origin1.clone(), 1, AccessMode::WhiteList));1168 assert_ok!(TemplateModule::set_public_access_mode(1169 origin1.clone(),1170 1,1171 AccessMode::WhiteList1172 ));942 assert_ok!(TemplateModule::add_to_white_list(origin1.clone(), 1, 1));1173 assert_ok!(TemplateModule::add_to_white_list(origin1.clone(), 1, 1));943 assert_ok!(TemplateModule::add_to_white_list(origin1.clone(), 1, 2));1174 assert_ok!(TemplateModule::add_to_white_list(origin1.clone(), 1, 2));944 assert_ok!(TemplateModule::add_to_white_list(origin1.clone(), 1, 3));1175 assert_ok!(TemplateModule::add_to_white_list(origin1.clone(), 1, 3));972 let mode: CollectionMode = CollectionMode::NFT(2000);1203 let mode: CollectionMode = CollectionMode::NFT(2000);973 let origin1 = Origin::signed(1);1204 let origin1 = Origin::signed(1);97412051206 assert_ok!(TemplateModule::set_chain_limits(RawOrigin::Root.into(), ChainLimits { 1207 collection_numbers_limit: 10,1208 account_token_ownership_limit: 10,1209 collections_admins_limit: 5,1210 custom_data_limit: 2048,1211 nft_sponsor_transfer_timeout: 15,1212 fungible_sponsor_transfer_timeout: 15,1213 refungible_sponsor_transfer_timeout: 15, 1214 }));1215975 assert_ok!(TemplateModule::create_collection(1216 assert_ok!(TemplateModule::create_collection(976 origin1.clone(),1217 origin1.clone(),977 col_name1.clone(),1218 col_name1.clone(),995 let origin1 = Origin::signed(1);1236 let origin1 = Origin::signed(1);996 let origin2 = Origin::signed(2);1237 let origin2 = Origin::signed(2);99712381239 assert_ok!(TemplateModule::set_chain_limits(RawOrigin::Root.into(), ChainLimits { 1240 collection_numbers_limit: 10,1241 account_token_ownership_limit: 10,1242 collections_admins_limit: 5,1243 custom_data_limit: 2048,1244 nft_sponsor_transfer_timeout: 15,1245 fungible_sponsor_transfer_timeout: 15,1246 refungible_sponsor_transfer_timeout: 15, 1247 }));1248998 assert_ok!(TemplateModule::create_collection(1249 assert_ok!(TemplateModule::create_collection(999 origin1.clone(),1250 origin1.clone(),1000 col_name1.clone(),1251 col_name1.clone(),1019 let origin1 = Origin::signed(1);1270 let origin1 = Origin::signed(1);1020 let origin2 = Origin::signed(2);1271 let origin2 = Origin::signed(2);102112721273 assert_ok!(TemplateModule::set_chain_limits(RawOrigin::Root.into(), ChainLimits { 1274 collection_numbers_limit: 10,1275 account_token_ownership_limit: 10,1276 collections_admins_limit: 5,1277 custom_data_limit: 2048,1278 nft_sponsor_transfer_timeout: 15,1279 fungible_sponsor_transfer_timeout: 15,1280 refungible_sponsor_transfer_timeout: 15, 1281 }));12821022 assert_ok!(TemplateModule::create_collection(1283 assert_ok!(TemplateModule::create_collection(1023 origin1.clone(),1284 origin1.clone(),1024 col_name1.clone(),1285 col_name1.clone(),1027 mode1288 mode1028 ));1289 ));102912901030 assert_noop!(TemplateModule::add_to_white_list(origin2.clone(), 1, 3), "You do not have permissions to modify this collection");1291 assert_noop!(1292 TemplateModule::add_to_white_list(origin2.clone(), 1, 3),1293 "You do not have permissions to modify this collection"1294 );1031 });1295 });1032}1296}103312971034#[test]1298#[test]1035fn nobody_can_add_address_to_white_list_of_nonexisting_collection() {1299fn nobody_can_add_address_to_white_list_of_nonexisting_collection() {1036 new_test_ext().execute_with(|| {1300 new_test_ext().execute_with(|| {1301 let origin1 = Origin::signed(1);103713021038 let origin1 = Origin::signed(1);1303 assert_ok!(TemplateModule::set_chain_limits(RawOrigin::Root.into(), ChainLimits { 1304 collection_numbers_limit: 10,1305 account_token_ownership_limit: 10,1306 collections_admins_limit: 5,1307 custom_data_limit: 2048,1308 nft_sponsor_transfer_timeout: 15,1309 fungible_sponsor_transfer_timeout: 15,1310 refungible_sponsor_transfer_timeout: 15, 1311 }));13121039 assert_noop!(TemplateModule::add_to_white_list(origin1.clone(), 1, 2), "This collection does not exist");1313 assert_noop!(1314 TemplateModule::add_to_white_list(origin1.clone(), 1, 2),1315 "This collection does not exist"1316 );1040 });1317 });1041}1318}104213191049 let mode: CollectionMode = CollectionMode::NFT(2000);1326 let mode: CollectionMode = CollectionMode::NFT(2000);1050 let origin1 = Origin::signed(1);1327 let origin1 = Origin::signed(1);105113281329 assert_ok!(TemplateModule::set_chain_limits(RawOrigin::Root.into(), ChainLimits { 1330 collection_numbers_limit: 10,1331 account_token_ownership_limit: 10,1332 collections_admins_limit: 5,1333 custom_data_limit: 2048,1334 nft_sponsor_transfer_timeout: 15,1335 fungible_sponsor_transfer_timeout: 15,1336 refungible_sponsor_transfer_timeout: 15, 1337 }));13381052 assert_ok!(TemplateModule::create_collection(1339 assert_ok!(TemplateModule::create_collection(1053 origin1.clone(),1340 origin1.clone(),1054 col_name1.clone(),1341 col_name1.clone(),1058 ));1345 ));105913461060 assert_ok!(TemplateModule::destroy_collection(origin1.clone(), 1));1347 assert_ok!(TemplateModule::destroy_collection(origin1.clone(), 1));1061 assert_noop!(TemplateModule::add_to_white_list(origin1.clone(), 1, 2), "This collection does not exist");1348 assert_noop!(1349 TemplateModule::add_to_white_list(origin1.clone(), 1, 2),1350 "This collection does not exist"1351 );1062 });1352 });1063}1353}106413541065// If address is already added to white list, nothing happens1355// If address is already added to white list, nothing happens1066#[test]1356#[test]1067fn address_is_already_added_to_white_list() {1357fn address_is_already_added_to_white_list() {1068 new_test_ext().execute_with(|| {1358 new_test_ext().execute_with(|| {10691070 let col_name1: Vec<u16> = "Test1\0".encode_utf16().collect::<Vec<u16>>();1359 let col_name1: Vec<u16> = "Test1\0".encode_utf16().collect::<Vec<u16>>();1071 let col_desc1: Vec<u16> = "TestDescription1\0".encode_utf16().collect::<Vec<u16>>();1360 let col_desc1: Vec<u16> = "TestDescription1\0".encode_utf16().collect::<Vec<u16>>();1072 let token_prefix1: Vec<u8> = b"token_prefix1\0".to_vec();1361 let token_prefix1: Vec<u8> = b"token_prefix1\0".to_vec();1073 let mode: CollectionMode = CollectionMode::NFT(2000);1362 let mode: CollectionMode = CollectionMode::NFT(2000);1074 let origin1 = Origin::signed(1);1363 let origin1 = Origin::signed(1);107513641365 assert_ok!(TemplateModule::set_chain_limits(RawOrigin::Root.into(), ChainLimits { 1366 collection_numbers_limit: 10,1367 account_token_ownership_limit: 10,1368 collections_admins_limit: 5,1369 custom_data_limit: 2048,1370 nft_sponsor_transfer_timeout: 15,1371 fungible_sponsor_transfer_timeout: 15,1372 refungible_sponsor_transfer_timeout: 15, 1373 }));13741076 assert_ok!(TemplateModule::create_collection(1375 assert_ok!(TemplateModule::create_collection(1077 origin1.clone(),1376 origin1.clone(),1078 col_name1.clone(),1377 col_name1.clone(),1091#[test]1390#[test]1092fn owner_can_remove_address_from_white_list() {1391fn owner_can_remove_address_from_white_list() {1093 new_test_ext().execute_with(|| {1392 new_test_ext().execute_with(|| {1094 1095 let col_name1: Vec<u16> = "Test1\0".encode_utf16().collect::<Vec<u16>>();1393 let col_name1: Vec<u16> = "Test1\0".encode_utf16().collect::<Vec<u16>>();1096 let col_desc1: Vec<u16> = "TestDescription1\0".encode_utf16().collect::<Vec<u16>>();1394 let col_desc1: Vec<u16> = "TestDescription1\0".encode_utf16().collect::<Vec<u16>>();1097 let token_prefix1: Vec<u8> = b"token_prefix1\0".to_vec();1395 let token_prefix1: Vec<u8> = b"token_prefix1\0".to_vec();1098 let mode: CollectionMode = CollectionMode::NFT(2000);1396 let mode: CollectionMode = CollectionMode::NFT(2000);1099 let origin1 = Origin::signed(1);1397 let origin1 = Origin::signed(1);110013981399 assert_ok!(TemplateModule::set_chain_limits(RawOrigin::Root.into(), ChainLimits { 1400 collection_numbers_limit: 10,1401 account_token_ownership_limit: 10,1402 collections_admins_limit: 5,1403 custom_data_limit: 2048,1404 nft_sponsor_transfer_timeout: 15,1405 fungible_sponsor_transfer_timeout: 15,1406 refungible_sponsor_transfer_timeout: 15, 1407 }));14081101 assert_ok!(TemplateModule::create_collection(1409 assert_ok!(TemplateModule::create_collection(1102 origin1.clone(),1410 origin1.clone(),1103 col_name1.clone(),1411 col_name1.clone(),1107 ));1415 ));110814161109 assert_ok!(TemplateModule::add_to_white_list(origin1.clone(), 1, 2));1417 assert_ok!(TemplateModule::add_to_white_list(origin1.clone(), 1, 2));1110 assert_ok!(TemplateModule::remove_from_white_list(origin1.clone(), 1, 2));1418 assert_ok!(TemplateModule::remove_from_white_list(1419 origin1.clone(),1420 1,1421 21422 ));1111 assert_eq!(TemplateModule::white_list(1).len(), 0);1423 assert_eq!(TemplateModule::white_list(1).len(), 0);1112 });1424 });1113}1425}111414261115#[test]1427#[test]1116fn admin_can_remove_address_from_white_list() {1428fn admin_can_remove_address_from_white_list() {1117 new_test_ext().execute_with(|| {1429 new_test_ext().execute_with(|| {11181119 let col_name1: Vec<u16> = "Test1\0".encode_utf16().collect::<Vec<u16>>();1430 let col_name1: Vec<u16> = "Test1\0".encode_utf16().collect::<Vec<u16>>();1120 let col_desc1: Vec<u16> = "TestDescription1\0".encode_utf16().collect::<Vec<u16>>();1431 let col_desc1: Vec<u16> = "TestDescription1\0".encode_utf16().collect::<Vec<u16>>();1121 let token_prefix1: Vec<u8> = b"token_prefix1\0".to_vec();1432 let token_prefix1: Vec<u8> = b"token_prefix1\0".to_vec();1122 let mode: CollectionMode = CollectionMode::NFT(2000);1433 let mode: CollectionMode = CollectionMode::NFT(2000);1123 let origin1 = Origin::signed(1);1434 let origin1 = Origin::signed(1);1124 let origin2 = Origin::signed(2);1435 let origin2 = Origin::signed(2);112514361437 assert_ok!(TemplateModule::set_chain_limits(RawOrigin::Root.into(), ChainLimits { 1438 collection_numbers_limit: 10,1439 account_token_ownership_limit: 10,1440 collections_admins_limit: 5,1441 custom_data_limit: 2048,1442 nft_sponsor_transfer_timeout: 15,1443 fungible_sponsor_transfer_timeout: 15,1444 refungible_sponsor_transfer_timeout: 15, 1445 }));14461126 assert_ok!(TemplateModule::create_collection(1447 assert_ok!(TemplateModule::create_collection(1127 origin1.clone(),1448 origin1.clone(),1128 col_name1.clone(),1449 col_name1.clone(),1134 assert_ok!(TemplateModule::add_collection_admin(origin1.clone(), 1, 2));1455 assert_ok!(TemplateModule::add_collection_admin(origin1.clone(), 1, 2));113514561136 assert_ok!(TemplateModule::add_to_white_list(origin1.clone(), 1, 3));1457 assert_ok!(TemplateModule::add_to_white_list(origin1.clone(), 1, 3));1137 assert_ok!(TemplateModule::remove_from_white_list(origin2.clone(), 1, 3));1458 assert_ok!(TemplateModule::remove_from_white_list(1459 origin2.clone(),1460 1,1461 31462 ));1138 assert_eq!(TemplateModule::white_list(1).len(), 0);1463 assert_eq!(TemplateModule::white_list(1).len(), 0);1139 });1464 });1140}1465}114114661142#[test]1467#[test]1143fn nonprivileged_user_cannot_remove_address_from_white_list() {1468fn nonprivileged_user_cannot_remove_address_from_white_list() {1144 new_test_ext().execute_with(|| {1469 new_test_ext().execute_with(|| {11451146 let col_name1: Vec<u16> = "Test1\0".encode_utf16().collect::<Vec<u16>>();1470 let col_name1: Vec<u16> = "Test1\0".encode_utf16().collect::<Vec<u16>>();1147 let col_desc1: Vec<u16> = "TestDescription1\0".encode_utf16().collect::<Vec<u16>>();1471 let col_desc1: Vec<u16> = "TestDescription1\0".encode_utf16().collect::<Vec<u16>>();1148 let token_prefix1: Vec<u8> = b"token_prefix1\0".to_vec();1472 let token_prefix1: Vec<u8> = b"token_prefix1\0".to_vec();1149 let mode: CollectionMode = CollectionMode::NFT(2000);1473 let mode: CollectionMode = CollectionMode::NFT(2000);1150 let origin1 = Origin::signed(1);1474 let origin1 = Origin::signed(1);1151 let origin2 = Origin::signed(2);1475 let origin2 = Origin::signed(2);115214761477 assert_ok!(TemplateModule::set_chain_limits(RawOrigin::Root.into(), ChainLimits { 1478 collection_numbers_limit: 10,1479 account_token_ownership_limit: 10,1480 collections_admins_limit: 5,1481 custom_data_limit: 2048,1482 nft_sponsor_transfer_timeout: 15,1483 fungible_sponsor_transfer_timeout: 15,1484 refungible_sponsor_transfer_timeout: 15, 1485 }));14861153 assert_ok!(TemplateModule::create_collection(1487 assert_ok!(TemplateModule::create_collection(1154 origin1.clone(),1488 origin1.clone(),1155 col_name1.clone(),1489 col_name1.clone(),1159 ));1493 ));116014941161 assert_ok!(TemplateModule::add_to_white_list(origin1.clone(), 1, 2));1495 assert_ok!(TemplateModule::add_to_white_list(origin1.clone(), 1, 2));1162 assert_noop!(TemplateModule::remove_from_white_list(origin2.clone(), 1, 2), "You do not have permissions to modify this collection");1496 assert_noop!(1497 TemplateModule::remove_from_white_list(origin2.clone(), 1, 2),1498 "You do not have permissions to modify this collection"1499 );1163 assert_eq!(TemplateModule::white_list(1)[0], 2);1500 assert_eq!(TemplateModule::white_list(1)[0], 2);1164 });1501 });1165}1502}116615031167#[test]1504#[test]1168fn nobody_can_remove_address_from_white_list_of_nonexisting_collection() {1505fn nobody_can_remove_address_from_white_list_of_nonexisting_collection() {1169 new_test_ext().execute_with(|| {1506 new_test_ext().execute_with(|| {1507 let origin1 = Origin::signed(1);117015081171 let origin1 = Origin::signed(1);1509 assert_ok!(TemplateModule::set_chain_limits(RawOrigin::Root.into(), ChainLimits { 1510 collection_numbers_limit: 10,1511 account_token_ownership_limit: 10,1512 collections_admins_limit: 5,1513 custom_data_limit: 2048,1514 nft_sponsor_transfer_timeout: 15,1515 fungible_sponsor_transfer_timeout: 15,1516 refungible_sponsor_transfer_timeout: 15, 1517 }));15181172 assert_noop!(TemplateModule::remove_from_white_list(origin1.clone(), 1, 2), "This collection does not exist");1519 assert_noop!(1520 TemplateModule::remove_from_white_list(origin1.clone(), 1, 2),1521 "This collection does not exist"1522 );1173 });1523 });1174}1524}117515251176#[test]1526#[test]1177fn nobody_can_remove_address_from_white_list_of_deleted_collection() {1527fn nobody_can_remove_address_from_white_list_of_deleted_collection() {1178 new_test_ext().execute_with(|| {1528 new_test_ext().execute_with(|| {11791180 let col_name1: Vec<u16> = "Test1\0".encode_utf16().collect::<Vec<u16>>();1529 let col_name1: Vec<u16> = "Test1\0".encode_utf16().collect::<Vec<u16>>();1181 let col_desc1: Vec<u16> = "TestDescription1\0".encode_utf16().collect::<Vec<u16>>();1530 let col_desc1: Vec<u16> = "TestDescription1\0".encode_utf16().collect::<Vec<u16>>();1182 let token_prefix1: Vec<u8> = b"token_prefix1\0".to_vec();1531 let token_prefix1: Vec<u8> = b"token_prefix1\0".to_vec();1183 let mode: CollectionMode = CollectionMode::NFT(2000);1532 let mode: CollectionMode = CollectionMode::NFT(2000);1184 let origin1 = Origin::signed(1);1533 let origin1 = Origin::signed(1);1185 let origin2 = Origin::signed(2);1534 let origin2 = Origin::signed(2);118615351536 assert_ok!(TemplateModule::set_chain_limits(RawOrigin::Root.into(), ChainLimits { 1537 collection_numbers_limit: 10,1538 account_token_ownership_limit: 10,1539 collections_admins_limit: 5,1540 custom_data_limit: 2048,1541 nft_sponsor_transfer_timeout: 15,1542 fungible_sponsor_transfer_timeout: 15,1543 refungible_sponsor_transfer_timeout: 15, 1544 }));15451187 assert_ok!(TemplateModule::create_collection(1546 assert_ok!(TemplateModule::create_collection(1188 origin1.clone(),1547 origin1.clone(),1189 col_name1.clone(),1548 col_name1.clone(),119415531195 assert_ok!(TemplateModule::add_to_white_list(origin1.clone(), 1, 2));1554 assert_ok!(TemplateModule::add_to_white_list(origin1.clone(), 1, 2));1196 assert_ok!(TemplateModule::destroy_collection(origin1.clone(), 1));1555 assert_ok!(TemplateModule::destroy_collection(origin1.clone(), 1));1197 assert_noop!(TemplateModule::remove_from_white_list(origin2.clone(), 1, 2), "This collection does not exist");1556 assert_noop!(1557 TemplateModule::remove_from_white_list(origin2.clone(), 1, 2),1558 "This collection does not exist"1559 );1198 assert_eq!(TemplateModule::white_list(1).len(), 0);1560 assert_eq!(TemplateModule::white_list(1).len(), 0);1199 });1561 });1200}1562}1209 let mode: CollectionMode = CollectionMode::NFT(2000);1571 let mode: CollectionMode = CollectionMode::NFT(2000);1210 let origin1 = Origin::signed(1);1572 let origin1 = Origin::signed(1);121115731574 assert_ok!(TemplateModule::set_chain_limits(RawOrigin::Root.into(), ChainLimits { 1575 collection_numbers_limit: 10,1576 account_token_ownership_limit: 10,1577 collections_admins_limit: 5,1578 custom_data_limit: 2048,1579 nft_sponsor_transfer_timeout: 15,1580 fungible_sponsor_transfer_timeout: 15,1581 refungible_sponsor_transfer_timeout: 15, 1582 }));15831212 assert_ok!(TemplateModule::create_collection(1584 assert_ok!(TemplateModule::create_collection(1213 origin1.clone(),1585 origin1.clone(),1214 col_name1.clone(),1586 col_name1.clone(),1218 ));1590 ));121915911220 assert_ok!(TemplateModule::add_to_white_list(origin1.clone(), 1, 2));1592 assert_ok!(TemplateModule::add_to_white_list(origin1.clone(), 1, 2));1221 assert_ok!(TemplateModule::remove_from_white_list(origin1.clone(), 1, 2));1593 assert_ok!(TemplateModule::remove_from_white_list(1594 origin1.clone(),1595 1,1596 21597 ));1222 assert_ok!(TemplateModule::remove_from_white_list(origin1.clone(), 1, 2));1598 assert_ok!(TemplateModule::remove_from_white_list(1599 origin1.clone(),1600 1,1601 21602 ));1223 assert_eq!(TemplateModule::white_list(1).len(), 0);1603 assert_eq!(TemplateModule::white_list(1).len(), 0);1224 });1604 });1225}1605}1233 let token_prefix1: Vec<u8> = b"token_prefix1\0".to_vec();1613 let token_prefix1: Vec<u8> = b"token_prefix1\0".to_vec();1234 let mode: CollectionMode = CollectionMode::NFT(2000);1614 let mode: CollectionMode = CollectionMode::NFT(2000);123516151616 assert_ok!(TemplateModule::set_chain_limits(RawOrigin::Root.into(), ChainLimits { 1617 collection_numbers_limit: 10,1618 account_token_ownership_limit: 10,1619 collections_admins_limit: 5,1620 custom_data_limit: 2048,1621 nft_sponsor_transfer_timeout: 15,1622 fungible_sponsor_transfer_timeout: 15,1623 refungible_sponsor_transfer_timeout: 15, 1624 }));16251236 let origin1 = Origin::signed(1);1626 let origin1 = Origin::signed(1);1237 assert_ok!(TemplateModule::create_collection(1627 assert_ok!(TemplateModule::create_collection(1238 origin1.clone(),1628 origin1.clone(),1250 11640 11251 ));1641 ));125216421253 assert_ok!(TemplateModule::set_public_access_mode(origin1.clone(), 1, AccessMode::WhiteList));1643 assert_ok!(TemplateModule::set_public_access_mode(1644 origin1.clone(),1645 1,1646 AccessMode::WhiteList1647 ));1254 assert_ok!(TemplateModule::add_to_white_list(origin1.clone(), 1, 2));1648 assert_ok!(TemplateModule::add_to_white_list(origin1.clone(), 1, 2));125516491256 assert_noop!(TemplateModule::transfer(1650 assert_noop!(1257 origin1.clone(),1651 TemplateModule::transfer(origin1.clone(), 3, 1, 1, 1),1258 3,1259 1,1260 1,1261 11652 "Address is not in white list"1262 ), "Address is not in white list");1653 );1263 });1654 });1264}1655}126516561271 let token_prefix1: Vec<u8> = b"token_prefix1\0".to_vec();1662 let token_prefix1: Vec<u8> = b"token_prefix1\0".to_vec();1272 let mode: CollectionMode = CollectionMode::NFT(2000);1663 let mode: CollectionMode = CollectionMode::NFT(2000);127316641665 assert_ok!(TemplateModule::set_chain_limits(RawOrigin::Root.into(), ChainLimits { 1666 collection_numbers_limit: 10,1667 account_token_ownership_limit: 10,1668 collections_admins_limit: 5,1669 custom_data_limit: 2048,1670 nft_sponsor_transfer_timeout: 15,1671 fungible_sponsor_transfer_timeout: 15,1672 refungible_sponsor_transfer_timeout: 15, 1673 }));16741274 let origin1 = Origin::signed(1);1675 let origin1 = Origin::signed(1);1275 assert_ok!(TemplateModule::create_collection(1676 assert_ok!(TemplateModule::create_collection(1276 origin1.clone(),1677 origin1.clone(),1288 11689 11289 ));1690 ));129016911291 assert_ok!(TemplateModule::set_public_access_mode(origin1.clone(), 1, AccessMode::WhiteList));1692 assert_ok!(TemplateModule::set_public_access_mode(1693 origin1.clone(),1694 1,1695 AccessMode::WhiteList1696 ));1292 assert_ok!(TemplateModule::add_to_white_list(origin1.clone(), 1, 1));1697 assert_ok!(TemplateModule::add_to_white_list(origin1.clone(), 1, 1));1293 assert_ok!(TemplateModule::add_to_white_list(origin1.clone(), 1, 2));1698 assert_ok!(TemplateModule::add_to_white_list(origin1.clone(), 1, 2));129416991295 // do approve1700 // do approve1296 assert_ok!(TemplateModule::approve(origin1.clone(), 1, 1, 1));1701 assert_ok!(TemplateModule::approve(origin1.clone(), 1, 1, 1));1297 assert_eq!(TemplateModule::approved(1, (1, 1)).len(), 1);1702 assert_eq!(TemplateModule::approved(1, (1, 1)).len(), 1);129817031299 assert_ok!(TemplateModule::remove_from_white_list(origin1.clone(), 1, 1));1704 assert_ok!(TemplateModule::remove_from_white_list(13001301 assert_noop!(TemplateModule::transfer_from(1302 origin1.clone(),1705 origin1.clone(),1303 1,1706 1,1304 3,1305 1,1306 1,1307 11707 11308 ), "Address is not in white list");1708 ));17091710 assert_noop!(1711 TemplateModule::transfer_from(origin1.clone(), 1, 3, 1, 1, 1),1712 "Address is not in white list"1713 );1309 });1714 });1310}1715}131117161318 let token_prefix1: Vec<u8> = b"token_prefix1\0".to_vec();1723 let token_prefix1: Vec<u8> = b"token_prefix1\0".to_vec();1319 let mode: CollectionMode = CollectionMode::NFT(2000);1724 let mode: CollectionMode = CollectionMode::NFT(2000);132017251726 assert_ok!(TemplateModule::set_chain_limits(RawOrigin::Root.into(), ChainLimits { 1727 collection_numbers_limit: 10,1728 account_token_ownership_limit: 10,1729 collections_admins_limit: 5,1730 custom_data_limit: 2048,1731 nft_sponsor_transfer_timeout: 15,1732 fungible_sponsor_transfer_timeout: 15,1733 refungible_sponsor_transfer_timeout: 15, 1734 }));17351321 let origin1 = Origin::signed(1);1736 let origin1 = Origin::signed(1);1322 assert_ok!(TemplateModule::create_collection(1737 assert_ok!(TemplateModule::create_collection(1323 origin1.clone(),1738 origin1.clone(),1335 11750 11336 ));1751 ));133717521338 assert_ok!(TemplateModule::set_public_access_mode(origin1.clone(), 1, AccessMode::WhiteList));1753 assert_ok!(TemplateModule::set_public_access_mode(1754 origin1.clone(),1755 1,1756 AccessMode::WhiteList1757 ));1339 assert_ok!(TemplateModule::add_to_white_list(origin1.clone(), 1, 1));1758 assert_ok!(TemplateModule::add_to_white_list(origin1.clone(), 1, 1));134017591341 assert_noop!(TemplateModule::transfer(1760 assert_noop!(1342 origin1.clone(),1761 TemplateModule::transfer(origin1.clone(), 3, 1, 1, 1),1343 3,1344 1,1345 1,1346 11762 "Address is not in white list"1347 ), "Address is not in white list");1763 );1348 });1764 });1349}1765}135017661356 let token_prefix1: Vec<u8> = b"token_prefix1\0".to_vec();1772 let token_prefix1: Vec<u8> = b"token_prefix1\0".to_vec();1357 let mode: CollectionMode = CollectionMode::NFT(2000);1773 let mode: CollectionMode = CollectionMode::NFT(2000);135817741775 assert_ok!(TemplateModule::set_chain_limits(RawOrigin::Root.into(), ChainLimits { 1776 collection_numbers_limit: 10,1777 account_token_ownership_limit: 10,1778 collections_admins_limit: 5,1779 custom_data_limit: 2048,1780 nft_sponsor_transfer_timeout: 15,1781 fungible_sponsor_transfer_timeout: 15,1782 refungible_sponsor_transfer_timeout: 15, 1783 }));17841359 let origin1 = Origin::signed(1);1785 let origin1 = Origin::signed(1);1360 assert_ok!(TemplateModule::create_collection(1786 assert_ok!(TemplateModule::create_collection(1361 origin1.clone(),1787 origin1.clone(),1373 11799 11374 ));1800 ));137518011376 assert_ok!(TemplateModule::set_public_access_mode(origin1.clone(), 1, AccessMode::WhiteList));1802 assert_ok!(TemplateModule::set_public_access_mode(1803 origin1.clone(),1804 1,1805 AccessMode::WhiteList1806 ));1377 assert_ok!(TemplateModule::add_to_white_list(origin1.clone(), 1, 1));1807 assert_ok!(TemplateModule::add_to_white_list(origin1.clone(), 1, 1));1378 assert_ok!(TemplateModule::add_to_white_list(origin1.clone(), 1, 2));1808 assert_ok!(TemplateModule::add_to_white_list(origin1.clone(), 1, 2));137918091380 // do approve1810 // do approve1381 assert_ok!(TemplateModule::approve(origin1.clone(), 1, 1, 1));1811 assert_ok!(TemplateModule::approve(origin1.clone(), 1, 1, 1));1382 assert_eq!(TemplateModule::approved(1, (1, 1)).len(), 1);1812 assert_eq!(TemplateModule::approved(1, (1, 1)).len(), 1);138318131384 assert_ok!(TemplateModule::remove_from_white_list(origin1.clone(), 1, 2));1814 assert_ok!(TemplateModule::remove_from_white_list(13851386 assert_noop!(TemplateModule::transfer_from(1387 origin1.clone(),1815 origin1.clone(),1388 1,1816 1,1389 3,1817 21390 1,1818 ));18191391 1,1820 assert_noop!(1392 11821 TemplateModule::transfer_from(origin1.clone(), 1, 3, 1, 1, 1),1393 ), "Address is not in white list");1822 "Address is not in white list"1823 );1394 });1824 });1395}1825}139618261403 let token_prefix1: Vec<u8> = b"token_prefix1\0".to_vec();1833 let token_prefix1: Vec<u8> = b"token_prefix1\0".to_vec();1404 let mode: CollectionMode = CollectionMode::NFT(2000);1834 let mode: CollectionMode = CollectionMode::NFT(2000);140518351836 assert_ok!(TemplateModule::set_chain_limits(RawOrigin::Root.into(), ChainLimits { 1837 collection_numbers_limit: 10,1838 account_token_ownership_limit: 10,1839 collections_admins_limit: 5,1840 custom_data_limit: 2048,1841 nft_sponsor_transfer_timeout: 15,1842 fungible_sponsor_transfer_timeout: 15,1843 refungible_sponsor_transfer_timeout: 15, 1844 }));18451406 let origin1 = Origin::signed(1);1846 let origin1 = Origin::signed(1);1407 assert_ok!(TemplateModule::create_collection(1847 assert_ok!(TemplateModule::create_collection(1408 origin1.clone(),1848 origin1.clone(),1420 11860 11421 ));1861 ));142218621423 assert_ok!(TemplateModule::set_public_access_mode(origin1.clone(), 1, AccessMode::WhiteList));1863 assert_ok!(TemplateModule::set_public_access_mode(1864 origin1.clone(),1865 1,1866 AccessMode::WhiteList1867 ));1424 assert_noop!(TemplateModule::burn_item(origin1.clone(), 1, 1), "Address is not in white list");1868 assert_noop!(1869 TemplateModule::burn_item(origin1.clone(), 1, 1),1870 "Address is not in white list"1871 );1425 });1872 });1426}1873}142718741434 let token_prefix1: Vec<u8> = b"token_prefix1\0".to_vec();1881 let token_prefix1: Vec<u8> = b"token_prefix1\0".to_vec();1435 let mode: CollectionMode = CollectionMode::NFT(2000);1882 let mode: CollectionMode = CollectionMode::NFT(2000);143618831884 assert_ok!(TemplateModule::set_chain_limits(RawOrigin::Root.into(), ChainLimits { 1885 collection_numbers_limit: 10,1886 account_token_ownership_limit: 10,1887 collections_admins_limit: 5,1888 custom_data_limit: 2048,1889 nft_sponsor_transfer_timeout: 15,1890 fungible_sponsor_transfer_timeout: 15,1891 refungible_sponsor_transfer_timeout: 15, 1892 }));18931437 let origin1 = Origin::signed(1);1894 let origin1 = Origin::signed(1);1438 assert_ok!(TemplateModule::create_collection(1895 assert_ok!(TemplateModule::create_collection(1439 origin1.clone(),1896 origin1.clone(),1442 token_prefix1.clone(),1899 token_prefix1.clone(),1443 mode1900 mode1444 ));1901 ));1445 assert_ok!(TemplateModule::set_public_access_mode(origin1.clone(), 1, AccessMode::WhiteList));1902 assert_ok!(TemplateModule::set_public_access_mode(1903 origin1.clone(),1904 1,1905 AccessMode::WhiteList1906 ));144619071447 // do approve1908 // do approve1448 assert_noop!(TemplateModule::approve(origin1.clone(), 1, 1, 1), "Address is not in white list");1909 assert_noop!(1910 TemplateModule::approve(origin1.clone(), 1, 1, 1),1911 "Address is not in white list"1912 );1449 });1913 });1450}1914}145119151459 let token_prefix1: Vec<u8> = b"token_prefix1\0".to_vec();1923 let token_prefix1: Vec<u8> = b"token_prefix1\0".to_vec();1460 let mode: CollectionMode = CollectionMode::NFT(2000);1924 let mode: CollectionMode = CollectionMode::NFT(2000);146119251926 assert_ok!(TemplateModule::set_chain_limits(RawOrigin::Root.into(), ChainLimits { 1927 collection_numbers_limit: 10,1928 account_token_ownership_limit: 10,1929 collections_admins_limit: 5,1930 custom_data_limit: 2048,1931 nft_sponsor_transfer_timeout: 15,1932 fungible_sponsor_transfer_timeout: 15,1933 refungible_sponsor_transfer_timeout: 15, 1934 }));19351462 let origin1 = Origin::signed(1);1936 let origin1 = Origin::signed(1);1463 assert_ok!(TemplateModule::create_collection(1937 assert_ok!(TemplateModule::create_collection(1464 origin1.clone(),1938 origin1.clone(),1476 11950 11477 ));1951 ));147819521479 assert_ok!(TemplateModule::set_public_access_mode(origin1.clone(), 1, AccessMode::WhiteList));1953 assert_ok!(TemplateModule::set_public_access_mode(1954 origin1.clone(),1955 1,1956 AccessMode::WhiteList1957 ));1480 assert_ok!(TemplateModule::add_to_white_list(origin1.clone(), 1, 1));1958 assert_ok!(TemplateModule::add_to_white_list(origin1.clone(), 1, 1));1481 assert_ok!(TemplateModule::add_to_white_list(origin1.clone(), 1, 2));1959 assert_ok!(TemplateModule::add_to_white_list(origin1.clone(), 1, 2));148219601483 assert_ok!(TemplateModule::transfer(1961 assert_ok!(TemplateModule::transfer(origin1.clone(), 2, 1, 1, 1));1484 origin1.clone(),1485 2,1486 1,1487 1,1488 11489 ));1490 });1962 });1491}1963}149219641498 let token_prefix1: Vec<u8> = b"token_prefix1\0".to_vec();1970 let token_prefix1: Vec<u8> = b"token_prefix1\0".to_vec();1499 let mode: CollectionMode = CollectionMode::NFT(2000);1971 let mode: CollectionMode = CollectionMode::NFT(2000);150019721973 assert_ok!(TemplateModule::set_chain_limits(RawOrigin::Root.into(), ChainLimits { 1974 collection_numbers_limit: 10,1975 account_token_ownership_limit: 10,1976 collections_admins_limit: 5,1977 custom_data_limit: 2048,1978 nft_sponsor_transfer_timeout: 15,1979 fungible_sponsor_transfer_timeout: 15,1980 refungible_sponsor_transfer_timeout: 15, 1981 }));19821501 let origin1 = Origin::signed(1);1983 let origin1 = Origin::signed(1);1502 assert_ok!(TemplateModule::create_collection(1984 assert_ok!(TemplateModule::create_collection(1503 origin1.clone(),1985 origin1.clone(),1515 11997 11516 ));1998 ));151719991518 assert_ok!(TemplateModule::set_public_access_mode(origin1.clone(), 1, AccessMode::WhiteList));2000 assert_ok!(TemplateModule::set_public_access_mode(2001 origin1.clone(),2002 1,2003 AccessMode::WhiteList2004 ));1519 assert_ok!(TemplateModule::add_to_white_list(origin1.clone(), 1, 1));2005 assert_ok!(TemplateModule::add_to_white_list(origin1.clone(), 1, 1));1520 assert_ok!(TemplateModule::add_to_white_list(origin1.clone(), 1, 2));2006 assert_ok!(TemplateModule::add_to_white_list(origin1.clone(), 1, 2));152120071543 let token_prefix1: Vec<u8> = b"token_prefix1\0".to_vec();2029 let token_prefix1: Vec<u8> = b"token_prefix1\0".to_vec();1544 let mode: CollectionMode = CollectionMode::NFT(2000);2030 let mode: CollectionMode = CollectionMode::NFT(2000);154520312032 assert_ok!(TemplateModule::set_chain_limits(RawOrigin::Root.into(), ChainLimits { 2033 collection_numbers_limit: 10,2034 account_token_ownership_limit: 10,2035 collections_admins_limit: 5,2036 custom_data_limit: 2048,2037 nft_sponsor_transfer_timeout: 15,2038 fungible_sponsor_transfer_timeout: 15,2039 refungible_sponsor_transfer_timeout: 15, 2040 }));20411546 let origin1 = Origin::signed(1);2042 let origin1 = Origin::signed(1);1547 assert_ok!(TemplateModule::create_collection(2043 assert_ok!(TemplateModule::create_collection(1548 origin1.clone(),2044 origin1.clone(),1552 mode2048 mode1553 ));2049 ));155420501555 assert_ok!(TemplateModule::set_public_access_mode(origin1.clone(), 1, AccessMode::WhiteList));2051 assert_ok!(TemplateModule::set_public_access_mode(2052 origin1.clone(),2053 1,2054 AccessMode::WhiteList2055 ));1556 assert_ok!(TemplateModule::set_mint_permission(origin1.clone(), 1, false));2056 assert_ok!(TemplateModule::set_mint_permission(2057 origin1.clone(),2058 1,2059 false2060 ));155720611558 assert_ok!(TemplateModule::create_item(2062 assert_ok!(TemplateModule::create_item(1559 origin1.clone(),2063 origin1.clone(),1573 let token_prefix1: Vec<u8> = b"token_prefix1\0".to_vec();2077 let token_prefix1: Vec<u8> = b"token_prefix1\0".to_vec();1574 let mode: CollectionMode = CollectionMode::NFT(2000);2078 let mode: CollectionMode = CollectionMode::NFT(2000);157520792080 assert_ok!(TemplateModule::set_chain_limits(RawOrigin::Root.into(), ChainLimits { 2081 collection_numbers_limit: 10,2082 account_token_ownership_limit: 10,2083 collections_admins_limit: 5,2084 custom_data_limit: 2048,2085 nft_sponsor_transfer_timeout: 15,2086 fungible_sponsor_transfer_timeout: 15,2087 refungible_sponsor_transfer_timeout: 15, 2088 }));20891576 let origin1 = Origin::signed(1);2090 let origin1 = Origin::signed(1);1577 let origin2 = Origin::signed(2);2091 let origin2 = Origin::signed(2);1578 assert_ok!(TemplateModule::create_collection(2092 assert_ok!(TemplateModule::create_collection(1583 mode2097 mode1584 ));2098 ));158520991586 assert_ok!(TemplateModule::set_public_access_mode(origin1.clone(), 1, AccessMode::WhiteList));2100 assert_ok!(TemplateModule::set_public_access_mode(2101 origin1.clone(),2102 1,2103 AccessMode::WhiteList2104 ));1587 assert_ok!(TemplateModule::set_mint_permission(origin1.clone(), 1, false));2105 assert_ok!(TemplateModule::set_mint_permission(2106 origin1.clone(),2107 1,2108 false2109 ));158821101589 assert_ok!(TemplateModule::add_collection_admin(origin1.clone(), 1, 2));2111 assert_ok!(TemplateModule::add_collection_admin(origin1.clone(), 1, 2));159021121606 let token_prefix1: Vec<u8> = b"token_prefix1\0".to_vec();2128 let token_prefix1: Vec<u8> = b"token_prefix1\0".to_vec();1607 let mode: CollectionMode = CollectionMode::NFT(2000);2129 let mode: CollectionMode = CollectionMode::NFT(2000);160821302131 assert_ok!(TemplateModule::set_chain_limits(RawOrigin::Root.into(), ChainLimits { 2132 collection_numbers_limit: 10,2133 account_token_ownership_limit: 10,2134 collections_admins_limit: 5,2135 custom_data_limit: 2048,2136 nft_sponsor_transfer_timeout: 15,2137 fungible_sponsor_transfer_timeout: 15,2138 refungible_sponsor_transfer_timeout: 15, 2139 }));21401609 let origin1 = Origin::signed(1);2141 let origin1 = Origin::signed(1);1610 let origin2 = Origin::signed(2);2142 let origin2 = Origin::signed(2);1611 assert_ok!(TemplateModule::create_collection(2143 assert_ok!(TemplateModule::create_collection(1616 mode2148 mode1617 ));2149 ));161821501619 assert_ok!(TemplateModule::set_public_access_mode(origin1.clone(), 1, AccessMode::WhiteList));2151 assert_ok!(TemplateModule::set_public_access_mode(2152 origin1.clone(),2153 1,2154 AccessMode::WhiteList2155 ));1620 assert_ok!(TemplateModule::set_mint_permission(origin1.clone(), 1, false));2156 assert_ok!(TemplateModule::set_mint_permission(2157 origin1.clone(),2158 1,2159 false2160 ));1621 assert_ok!(TemplateModule::add_to_white_list(origin1.clone(), 1, 2));2161 assert_ok!(TemplateModule::add_to_white_list(origin1.clone(), 1, 2));162221621623 assert_noop!(TemplateModule::create_item(2163 assert_noop!(1624 origin2.clone(),2164 TemplateModule::create_item(origin2.clone(), 1, [1, 2, 3].to_vec(), 2),1625 1,1626 [1, 2, 3].to_vec(),1627 22165 "Collection is not in mint mode"1628 ), "Collection is not in mint mode");2166 );1629 });2167 });1630}2168}163121691638 let token_prefix1: Vec<u8> = b"token_prefix1\0".to_vec();2176 let token_prefix1: Vec<u8> = b"token_prefix1\0".to_vec();1639 let mode: CollectionMode = CollectionMode::NFT(2000);2177 let mode: CollectionMode = CollectionMode::NFT(2000);164021782179 assert_ok!(TemplateModule::set_chain_limits(RawOrigin::Root.into(), ChainLimits { 2180 collection_numbers_limit: 10,2181 account_token_ownership_limit: 10,2182 collections_admins_limit: 5,2183 custom_data_limit: 2048,2184 nft_sponsor_transfer_timeout: 15,2185 fungible_sponsor_transfer_timeout: 15,2186 refungible_sponsor_transfer_timeout: 15, 2187 }));21881641 let origin1 = Origin::signed(1);2189 let origin1 = Origin::signed(1);1642 let origin2 = Origin::signed(2);2190 let origin2 = Origin::signed(2);1643 assert_ok!(TemplateModule::create_collection(2191 assert_ok!(TemplateModule::create_collection(1648 mode2196 mode1649 ));2197 ));165021981651 assert_ok!(TemplateModule::set_public_access_mode(origin1.clone(), 1, AccessMode::WhiteList));2199 assert_ok!(TemplateModule::set_public_access_mode(2200 origin1.clone(),2201 1,2202 AccessMode::WhiteList2203 ));1652 assert_ok!(TemplateModule::set_mint_permission(origin1.clone(), 1, false));2204 assert_ok!(TemplateModule::set_mint_permission(2205 origin1.clone(),2206 1,2207 false2208 ));165322091654 assert_noop!(TemplateModule::create_item(2210 assert_noop!(1655 origin2.clone(),2211 TemplateModule::create_item(origin2.clone(), 1, [1, 2, 3].to_vec(), 2),1656 1,1657 [1, 2, 3].to_vec(),1658 22212 "Collection is not in mint mode"1659 ), "Collection is not in mint mode");2213 );1660 });2214 });1661}2215}166222161669 let token_prefix1: Vec<u8> = b"token_prefix1\0".to_vec();2223 let token_prefix1: Vec<u8> = b"token_prefix1\0".to_vec();1670 let mode: CollectionMode = CollectionMode::NFT(2000);2224 let mode: CollectionMode = CollectionMode::NFT(2000);167122252226 assert_ok!(TemplateModule::set_chain_limits(RawOrigin::Root.into(), ChainLimits { 2227 collection_numbers_limit: 10,2228 account_token_ownership_limit: 10,2229 collections_admins_limit: 5,2230 custom_data_limit: 2048,2231 nft_sponsor_transfer_timeout: 15,2232 fungible_sponsor_transfer_timeout: 15,2233 refungible_sponsor_transfer_timeout: 15, 2234 }));22351672 let origin1 = Origin::signed(1);2236 let origin1 = Origin::signed(1);1673 assert_ok!(TemplateModule::create_collection(2237 assert_ok!(TemplateModule::create_collection(1674 origin1.clone(),2238 origin1.clone(),1678 mode2242 mode1679 ));2243 ));168022441681 assert_ok!(TemplateModule::set_public_access_mode(origin1.clone(), 1, AccessMode::WhiteList));2245 assert_ok!(TemplateModule::set_public_access_mode(2246 origin1.clone(),2247 1,2248 AccessMode::WhiteList2249 ));1682 assert_ok!(TemplateModule::set_mint_permission(origin1.clone(), 1, true));2250 assert_ok!(TemplateModule::set_mint_permission(2251 origin1.clone(),2252 1,2253 true2254 ));168322551684 assert_ok!(TemplateModule::create_item(2256 assert_ok!(TemplateModule::create_item(1685 origin1.clone(),2257 origin1.clone(),1699 let token_prefix1: Vec<u8> = b"token_prefix1\0".to_vec();2271 let token_prefix1: Vec<u8> = b"token_prefix1\0".to_vec();1700 let mode: CollectionMode = CollectionMode::NFT(2000);2272 let mode: CollectionMode = CollectionMode::NFT(2000);170122732274 assert_ok!(TemplateModule::set_chain_limits(RawOrigin::Root.into(), ChainLimits { 2275 collection_numbers_limit: 10,2276 account_token_ownership_limit: 10,2277 collections_admins_limit: 5,2278 custom_data_limit: 2048,2279 nft_sponsor_transfer_timeout: 15,2280 fungible_sponsor_transfer_timeout: 15,2281 refungible_sponsor_transfer_timeout: 15, 2282 }));22831702 let origin1 = Origin::signed(1);2284 let origin1 = Origin::signed(1);1703 let origin2 = Origin::signed(2);2285 let origin2 = Origin::signed(2);1704 assert_ok!(TemplateModule::create_collection(2286 assert_ok!(TemplateModule::create_collection(1709 mode2291 mode1710 ));2292 ));171122931712 assert_ok!(TemplateModule::set_public_access_mode(origin1.clone(), 1, AccessMode::WhiteList));2294 assert_ok!(TemplateModule::set_public_access_mode(2295 origin1.clone(),2296 1,2297 AccessMode::WhiteList2298 ));1713 assert_ok!(TemplateModule::set_mint_permission(origin1.clone(), 1, true));2299 assert_ok!(TemplateModule::set_mint_permission(2300 origin1.clone(),2301 1,2302 true2303 ));171423041715 assert_ok!(TemplateModule::add_collection_admin(origin1.clone(), 1, 2));2305 assert_ok!(TemplateModule::add_collection_admin(origin1.clone(), 1, 2));171623061732 let token_prefix1: Vec<u8> = b"token_prefix1\0".to_vec();2322 let token_prefix1: Vec<u8> = b"token_prefix1\0".to_vec();1733 let mode: CollectionMode = CollectionMode::NFT(2000);2323 let mode: CollectionMode = CollectionMode::NFT(2000);173423242325 assert_ok!(TemplateModule::set_chain_limits(RawOrigin::Root.into(), ChainLimits { 2326 collection_numbers_limit: 10,2327 account_token_ownership_limit: 10,2328 collections_admins_limit: 5,2329 custom_data_limit: 2048,2330 nft_sponsor_transfer_timeout: 15,2331 fungible_sponsor_transfer_timeout: 15,2332 refungible_sponsor_transfer_timeout: 15, 2333 }));23341735 let origin1 = Origin::signed(1);2335 let origin1 = Origin::signed(1);1736 let origin2 = Origin::signed(2);2336 let origin2 = Origin::signed(2);1737 assert_ok!(TemplateModule::create_collection(2337 assert_ok!(TemplateModule::create_collection(1742 mode2342 mode1743 ));2343 ));174423441745 assert_ok!(TemplateModule::set_public_access_mode(origin1.clone(), 1, AccessMode::WhiteList));2345 assert_ok!(TemplateModule::set_public_access_mode(2346 origin1.clone(),2347 1,2348 AccessMode::WhiteList2349 ));1746 assert_ok!(TemplateModule::set_mint_permission(origin1.clone(), 1, true));2350 assert_ok!(TemplateModule::set_mint_permission(2351 origin1.clone(),2352 1,2353 true2354 ));174723551748 assert_noop!(TemplateModule::create_item(2356 assert_noop!(1749 origin2.clone(),2357 TemplateModule::create_item(origin2.clone(), 1, [1, 2, 3].to_vec(), 2),1750 1,1751 [1, 2, 3].to_vec(),1752 22358 "Address is not in white list"1753 ), "Address is not in white list");2359 );1754 });2360 });1755}2361}175623621763 let token_prefix1: Vec<u8> = b"token_prefix1\0".to_vec();2369 let token_prefix1: Vec<u8> = b"token_prefix1\0".to_vec();1764 let mode: CollectionMode = CollectionMode::NFT(2000);2370 let mode: CollectionMode = CollectionMode::NFT(2000);176523712372 assert_ok!(TemplateModule::set_chain_limits(RawOrigin::Root.into(), ChainLimits { 2373 collection_numbers_limit: 10,2374 account_token_ownership_limit: 10,2375 collections_admins_limit: 5,2376 custom_data_limit: 2048,2377 nft_sponsor_transfer_timeout: 15,2378 fungible_sponsor_transfer_timeout: 15,2379 refungible_sponsor_transfer_timeout: 15, 2380 }));23811766 let origin1 = Origin::signed(1);2382 let origin1 = Origin::signed(1);1767 let origin2 = Origin::signed(2);2383 let origin2 = Origin::signed(2);1768 assert_ok!(TemplateModule::create_collection(2384 assert_ok!(TemplateModule::create_collection(1773 mode2389 mode1774 ));2390 ));177523911776 assert_ok!(TemplateModule::set_public_access_mode(origin1.clone(), 1, AccessMode::WhiteList));2392 assert_ok!(TemplateModule::set_public_access_mode(2393 origin1.clone(),2394 1,2395 AccessMode::WhiteList2396 ));1777 assert_ok!(TemplateModule::set_mint_permission(origin1.clone(), 1, true));2397 assert_ok!(TemplateModule::set_mint_permission(2398 origin1.clone(),2399 1,2400 true2401 ));1778 assert_ok!(TemplateModule::add_to_white_list(origin1.clone(), 1, 2));2402 assert_ok!(TemplateModule::add_to_white_list(origin1.clone(), 1, 2));177924031780 assert_ok!(TemplateModule::create_item(2404 assert_ok!(TemplateModule::create_item(1786 });2410 });1787}2411}178824121789// #endregion2413// Total number of collections. Positive test2414#[test]2415fn total_number_collections_bound() {2416 new_test_ext().execute_with(|| {2417 let col_name1: Vec<u16> = "Test1\0".encode_utf16().collect::<Vec<u16>>();2418 let col_desc1: Vec<u16> = "TestDescription1\0".encode_utf16().collect::<Vec<u16>>();2419 let token_prefix1: Vec<u8> = b"token_prefix1\0".to_vec();2420 let mode: CollectionMode = CollectionMode::NFT(2000);24212422 assert_ok!(TemplateModule::set_chain_limits(RawOrigin::Root.into(), ChainLimits { 2423 collection_numbers_limit: 10,2424 account_token_ownership_limit: 10,2425 collections_admins_limit: 5,2426 custom_data_limit: 2048,2427 nft_sponsor_transfer_timeout: 15,2428 fungible_sponsor_transfer_timeout: 15,2429 refungible_sponsor_transfer_timeout: 15, 2430 }));24312432 let origin1 = Origin::signed(1);2433 assert_ok!(TemplateModule::create_collection(2434 origin1.clone(),2435 col_name1.clone(),2436 col_desc1.clone(),2437 token_prefix1.clone(),2438 mode2439 ));2440 });2441}24422443// Total number of collections. Negotive test2444#[test]2445fn total_number_collections_bound_neg() {2446 new_test_ext().execute_with(|| {2447 let col_name1: Vec<u16> = "Test1\0".encode_utf16().collect::<Vec<u16>>();2448 let col_desc1: Vec<u16> = "TestDescription1\0".encode_utf16().collect::<Vec<u16>>();2449 let token_prefix1: Vec<u8> = b"token_prefix1\0".to_vec();2450 let mode: CollectionMode = CollectionMode::NFT(2000);24512452 assert_ok!(TemplateModule::set_chain_limits(RawOrigin::Root.into(), ChainLimits { 2453 collection_numbers_limit: 10,2454 account_token_ownership_limit: 10,2455 collections_admins_limit: 5,2456 custom_data_limit: 2048,2457 nft_sponsor_transfer_timeout: 15,2458 fungible_sponsor_transfer_timeout: 15,2459 refungible_sponsor_transfer_timeout: 15, 2460 }));24612462 let origin1 = Origin::signed(1);24632464 for _ in 0..10 {24652466 assert_ok!(TemplateModule::create_collection(2467 origin1.clone(),2468 col_name1.clone(),2469 col_desc1.clone(),2470 token_prefix1.clone(),2471 mode.clone()2472 ));2473 }24742475 // 11-th collection in chain. Expects error2476 assert_noop!(TemplateModule::create_collection(2477 origin1.clone(),2478 col_name1.clone(),2479 col_desc1.clone(),2480 token_prefix1.clone(),2481 mode.clone()2482 ), "Total collections bound exceeded");2483 });2484}24852486// Owned tokens by a single address. Positive test2487#[test]2488fn owned_tokens_bound() {2489 new_test_ext().execute_with(|| {2490 let col_name1: Vec<u16> = "Test1\0".encode_utf16().collect::<Vec<u16>>();2491 let col_desc1: Vec<u16> = "TestDescription1\0".encode_utf16().collect::<Vec<u16>>();2492 let token_prefix1: Vec<u8> = b"token_prefix1\0".to_vec();2493 let mode: CollectionMode = CollectionMode::NFT(2000);24942495 assert_ok!(TemplateModule::set_chain_limits(RawOrigin::Root.into(), ChainLimits { 2496 collection_numbers_limit: 10,2497 account_token_ownership_limit: 10,2498 collections_admins_limit: 5,2499 custom_data_limit: 2048,2500 nft_sponsor_transfer_timeout: 15,2501 fungible_sponsor_transfer_timeout: 15,2502 refungible_sponsor_transfer_timeout: 15, 2503 }));25042505 let origin1 = Origin::signed(1);2506 assert_ok!(TemplateModule::create_collection(2507 origin1.clone(),2508 col_name1.clone(),2509 col_desc1.clone(),2510 token_prefix1.clone(),2511 mode2512 ));25132514 assert_ok!(TemplateModule::create_item(2515 origin1.clone(),2516 1,2517 [1, 2, 3].to_vec(),2518 12519 ));25202521 assert_ok!(TemplateModule::create_item(2522 origin1.clone(),2523 1,2524 [1, 2, 3].to_vec(),2525 12526 ));2527 });2528}25292530// Owned tokens by a single address. Negotive test2531#[test]2532fn owned_tokens_bound_neg() {2533 new_test_ext().execute_with(|| {2534 let col_name1: Vec<u16> = "Test1\0".encode_utf16().collect::<Vec<u16>>();2535 let col_desc1: Vec<u16> = "TestDescription1\0".encode_utf16().collect::<Vec<u16>>();2536 let token_prefix1: Vec<u8> = b"token_prefix1\0".to_vec();2537 let mode: CollectionMode = CollectionMode::NFT(2000);25382539 assert_ok!(TemplateModule::set_chain_limits(RawOrigin::Root.into(), ChainLimits { 2540 collection_numbers_limit: 10,2541 account_token_ownership_limit: 1,2542 collections_admins_limit: 5,2543 custom_data_limit: 2048,2544 nft_sponsor_transfer_timeout: 15,2545 fungible_sponsor_transfer_timeout: 15,2546 refungible_sponsor_transfer_timeout: 15, 2547 }));25482549 let origin1 = Origin::signed(1);2550 assert_ok!(TemplateModule::create_collection(2551 origin1.clone(),2552 col_name1.clone(),2553 col_desc1.clone(),2554 token_prefix1.clone(),2555 mode2556 ));25572558 assert_ok!(TemplateModule::create_item(2559 origin1.clone(),2560 1,2561 [1, 2, 3].to_vec(),2562 12563 ));25642565 assert_noop!(TemplateModule::create_item(2566 origin1.clone(),2567 1,2568 [1, 2, 3].to_vec(),2569 12570 ), "Owned tokens by a single address bound exceeded");2571 });2572}25732574// Number of collection admins. Positive test2575#[test]2576fn collection_admins_bound() {2577 new_test_ext().execute_with(|| {2578 let col_name1: Vec<u16> = "Test1\0".encode_utf16().collect::<Vec<u16>>();2579 let col_desc1: Vec<u16> = "TestDescription1\0".encode_utf16().collect::<Vec<u16>>();2580 let token_prefix1: Vec<u8> = b"token_prefix1\0".to_vec();2581 let mode: CollectionMode = CollectionMode::NFT(2000);25822583 assert_ok!(TemplateModule::set_chain_limits(RawOrigin::Root.into(), ChainLimits { 2584 collection_numbers_limit: 10,2585 account_token_ownership_limit: 10,2586 collections_admins_limit: 2,2587 custom_data_limit: 2048,2588 nft_sponsor_transfer_timeout: 15,2589 fungible_sponsor_transfer_timeout: 15,2590 refungible_sponsor_transfer_timeout: 15, 2591 }));25922593 let origin1 = Origin::signed(1);2594 assert_ok!(TemplateModule::create_collection(2595 origin1.clone(),2596 col_name1.clone(),2597 col_desc1.clone(),2598 token_prefix1.clone(),2599 mode2600 ));26012602 assert_ok!(TemplateModule::add_collection_admin(origin1.clone(), 1, 2));2603 assert_ok!(TemplateModule::add_collection_admin(origin1.clone(), 1, 3));2604 });2605}26062607// Number of collection admins. Negotive test2608#[test]2609fn collection_admins_bound_neg() {2610 new_test_ext().execute_with(|| {2611 let col_name1: Vec<u16> = "Test1\0".encode_utf16().collect::<Vec<u16>>();2612 let col_desc1: Vec<u16> = "TestDescription1\0".encode_utf16().collect::<Vec<u16>>();2613 let token_prefix1: Vec<u8> = b"token_prefix1\0".to_vec();2614 let mode: CollectionMode = CollectionMode::NFT(2000);26152616 assert_ok!(TemplateModule::set_chain_limits(RawOrigin::Root.into(), ChainLimits { 2617 collection_numbers_limit: 10,2618 account_token_ownership_limit: 1,2619 collections_admins_limit: 1,2620 custom_data_limit: 2048,2621 nft_sponsor_transfer_timeout: 15,2622 fungible_sponsor_transfer_timeout: 15,2623 refungible_sponsor_transfer_timeout: 15, 2624 }));26252626 let origin1 = Origin::signed(1);2627 assert_ok!(TemplateModule::create_collection(2628 origin1.clone(),2629 col_name1.clone(),2630 col_desc1.clone(),2631 token_prefix1.clone(),2632 mode2633 ));26342635 assert_ok!(TemplateModule::add_collection_admin(origin1.clone(), 1, 2));2636 assert_noop!(TemplateModule::add_collection_admin(origin1.clone(), 1, 3), "Number of collection admins bound exceeded");2637 });2638}26392640// Custom data size. Positive test2641#[test]2642fn custom_data_size_bound() {2643 new_test_ext().execute_with(|| {2644 let col_name1: Vec<u16> = "Test1\0".encode_utf16().collect::<Vec<u16>>();2645 let col_desc1: Vec<u16> = "TestDescription1\0".encode_utf16().collect::<Vec<u16>>();2646 let token_prefix1: Vec<u8> = b"token_prefix1\0".to_vec();2647 let mode: CollectionMode = CollectionMode::NFT(2000);26482649 assert_ok!(TemplateModule::set_chain_limits(RawOrigin::Root.into(), ChainLimits { 2650 collection_numbers_limit: 10,2651 account_token_ownership_limit: 10,2652 collections_admins_limit: 5,2653 custom_data_limit: 2048,2654 nft_sponsor_transfer_timeout: 15,2655 fungible_sponsor_transfer_timeout: 15,2656 refungible_sponsor_transfer_timeout: 15, 2657 }));26582659 let origin1 = Origin::signed(1);2660 assert_ok!(TemplateModule::create_collection(2661 origin1.clone(),2662 col_name1.clone(),2663 col_desc1.clone(),2664 token_prefix1.clone(),2665 mode2666 ));2667 });2668}26692670// Custom data size. Negotive test2671#[test]2672fn custom_data_size_bound_neg() {2673 new_test_ext().execute_with(|| {2674 let col_name1: Vec<u16> = "Test1\0".encode_utf16().collect::<Vec<u16>>();2675 let col_desc1: Vec<u16> = "TestDescription1\0".encode_utf16().collect::<Vec<u16>>();2676 let token_prefix1: Vec<u8> = b"token_prefix1\0".to_vec();2677 let mode: CollectionMode = CollectionMode::NFT(2000);26782679 assert_ok!(TemplateModule::set_chain_limits(RawOrigin::Root.into(), ChainLimits { 2680 collection_numbers_limit: 10,2681 account_token_ownership_limit: 10,2682 collections_admins_limit: 5,2683 custom_data_limit: 200,2684 nft_sponsor_transfer_timeout: 15,2685 fungible_sponsor_transfer_timeout: 15,2686 refungible_sponsor_transfer_timeout: 15, 2687 }));26882689 let origin1 = Origin::signed(1);2690 assert_noop!(TemplateModule::create_collection(2691 origin1.clone(),2692 col_name1.clone(),2693 col_desc1.clone(),2694 token_prefix1.clone(),2695 mode2696 ), "Custom data size bound exceeded");2697 });2698}2699// #endregion2700