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

difftreelog

Merge pull request #9 from usetech-llc/feature_limits_nft_78_85_105

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

4 files changed

modifiednode/src/chain_spec.rsdiffbeforeafterboth
135 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 {
modifiedpallets/nft/src/lib.rsdiffbeforeafterboth
1#![cfg_attr(not(feature = "std"), no_std)]1#![cfg_attr(not(feature = "std"), no_std)]
22
3#[cfg(feature = "std")]3#[cfg(feature = "std")]
4pub use std::*;
5
6#[cfg(feature = "std")]
4pub use serde::*;7pub use serde::*;
58
6use codec::{Decode, Encode};9use codec::{Decode, Encode};
20 IsSubType, StorageValue,23 IsSubType, StorageValue,
21};24};
2225
23use 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}
159162
163#[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}
169
170#[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,
177
178 // Timeouts for item types in passed blocks
179 pub nft_sponsor_transfer_timeout: u32,
180 pub fungible_sponsor_transfer_timeout: u32,
181 pub refungible_sponsor_transfer_timeout: u32,
182}
183
160pub 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;
174198
199 // Chain limits struct
200 pub ChainLimit get(fn chain_limit) config(): ChainLimits;
201
202 // Bound counters
203 CollectionCount: u64;
204 pub AccountItemCount get(fn account_item_count): map hasher(identity) T::AccountId => u64;
205
206 // Basic collections
175 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 list
191 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>;
192224
225 /// Tokens transfer baskets
226 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;
229
193 // Sponsorship230 // Sponsorship
194 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 storage
200 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}
218255
295 // Anyone can create a collection332 // Anyone can create a collection
296 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) => {
336
337 // bound Custom data size
338 ensure!(size < ChainLimit::get().custom_data_limit, "Custom data size bound exceeded");
299 CollectionMode::ReFungible(size, _) => size,339 size
340 },
341 CollectionMode::ReFungible(size, _) => {
342
343 // bound Custom data size
344 ensure!(size < ChainLimit::get().custom_data_limit, "Custom data size bound exceeded");
345 size
346 },
300 _ => 0347 _ => 0
301 };348 };
302349
306 _ => 0353 _ => 0
307 };354 };
308355
356 // bound Total number of collections
357 ensure!(CollectionCount::get() < ChainLimit::get().collection_numbers_limit, "Total collections bound exceeded");
358
309 // check params359 // check params
310 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");
311361
326 .checked_add(1)376 .checked_add(1)
327 .expect("collection id error");377 .expect("collection id error");
328378
379 // bound counter
380 let total = CollectionCount::get()
381 .checked_add(1)
382 .expect("collection counter error");
383
329 CreatedCollectionCount::put(next_id);384 CreatedCollectionCount::put(next_id);
385 CollectionCount::put(total);
330386
331 // Create new collection387 // Create new collection
332 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)?;
370426
371 // TODO Items remove
372 <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);
379434
435 <NftItemList<T>>::remove_prefix(collection_id);
436 <FungibleItemList<T>>::remove_prefix(collection_id);
437 <ReFungibleItemList<T>>::remove_prefix(collection_id);
438
439 <NftTransferBasket<T>>::remove_prefix(collection_id);
440 <FungibleTransferBasket<T>>::remove_prefix(collection_id);
441 <ReFungibleTransferBasket<T>>::remove_prefix(collection_id);
442
443 if CollectionCount::get() > 0
444 {
445 // bound couter
446 let total = CollectionCount::get()
447 .checked_sub(1)
448 .expect("collection counter error");
449
450 CollectionCount::put(total);
451 }
452
380 Ok(())453 Ok(())
381 }454 }
382455
544 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 }
546619
620 // Number of collection admins
621 ensure!((admin_arr.len() as u64) < ChainLimit::get().collections_admins_limit, "Number of collection admins bound exceeded");
622
547 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);
549625
758834
759 // Transfer permissions check835 // Transfer permissions check
760 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");
764840
765 if target_collection.access == AccessMode::WhiteList {841 if target_collection.access == AccessMode::WhiteList {
810886
811 // Transfer permissions check887 // Transfer permissions check
812 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");
816892
817 if target_collection.access == AccessMode::WhiteList {893 if target_collection.access == AccessMode::WhiteList {
852928
853 // Transfer permissions check929 // Transfer permissions check
854 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");
858934
859 if target_collection.access == AccessMode::WhiteList {935 if target_collection.access == AccessMode::WhiteList {
919995
920 // Transfer permissions check996 // Transfer permissions check
921 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");
9241000
925 if target_collection.access == AccessMode::WhiteList {1001 if target_collection.access == AccessMode::WhiteList {
9871063
988 Ok(())1064 Ok(())
989 }1065 }
1066
1067 // Sudo permissions function
1068 #[weight = 0]
1069 pub fn set_chain_limits(
1070 origin,
1071 limits: ChainLimits
1072 ) -> DispatchResult {
1073 ensure_root(origin)?;
1074 <ChainLimit>::put(limits);
1075 Ok(())
1076 }
990 }1077 }
991}1078}
9921079
1004 <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);
10061093
1094 // Add current block
1095 let v: Vec<BasketItem<T::AccountId, T::BlockNumber>> = Vec::new();
1096 <FungibleTransferBasket<T>>::insert(item.collection, current_index, v);
1097
1007 // Update balance1098 // Update balance
1008 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);
10291120
1121 // Add current block
1122 let block_number: T::BlockNumber = 0.into();
1123 <ReFungibleTransferBasket<T>>::insert(item.collection, current_index, block_number);
1124
1030 // Update balance1125 // Update balance
1031 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);
10501145
1146 // Add current block
1147 let block_number: T::BlockNumber = 0.into();
1148 <NftTransferBasket<T>>::insert(collection_id, current_index, block_number);
1149
1051 // Update balance1150 // Update balance
1052 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 }
10591158
1060 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 }
11501253
1151 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 {
1152
1153 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 result
1164 }1266 }
11651267
1166 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());
11701274
1171 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 }
11741281
1193 }1300 }
11941301
1195 fn check_white_list(collection_id: u64, address: &T::AccountId) -> DispatchResult {1302 fn check_white_list(collection_id: u64, address: &T::AccountId) -> DispatchResult {
1196
1197 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 {
1212
1213 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 {
1302
1303 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 }
14241527
1425 fn init_collection(item: &CollectionType<T::AccountId>){1528 fn init_collection(item: &CollectionType<T::AccountId>) {
1529 // check params
1530 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 );
14261546
1427 // check params1547 // Generate next collection ID
1428 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 ID
1434 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 1551
1438 CreatedCollectionCount::put(next_id); 1552 CreatedCollectionCount::put(next_id);
1439 }1553 }
14401554
1441 fn init_nft_token(item: &NftItemType<T::AccountId>){1555 fn init_nft_token(item: &NftItemType<T::AccountId>) {
1442
1443 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 }
14591572
1460 fn init_fungible_token(item: &FungibleItemType<T::AccountId>){1573 fn init_fungible_token(item: &FungibleItemType<T::AccountId>) {
1461
1462 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 }
14781590
1479 fn init_refungible_token(item: &ReFungibleItemType<T::AccountId>){1591 fn init_refungible_token(item: &ReFungibleItemType<T::AccountId>) {
1480
1481 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 }
14981609
1499 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 {
1611
1612 // add to account limit
1613 if <AccountItemCount<T>>::contains_key(owner.clone()) {
1614
1615 // bound Owned tokens by a single address
1616 let count = <AccountItemCount<T>>::get(owner.clone());
1617 ensure!(count < ChainLimit::get().account_token_ownership_limit, "Owned tokens by a single address bound exceeded");
1618
1619 <AccountItemCount<T>>::insert(owner.clone(),
1620 count.checked_add(1).unwrap());
1621 }
1622 else {
1623 <AccountItemCount<T>>::insert(owner.clone(), 1);
1624 }
1625
1500 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 }
15151642
1516 Ok(())1643 Ok(())
1521 item_index: u64,1648 item_index: u64,
1522 owner: T::AccountId,1649 owner: T::AccountId,
1523 ) -> DispatchResult {1650 ) -> DispatchResult {
1651
1652 // update counter
1653 <AccountItemCount<T>>::insert(owner.clone(),
1654 <AccountItemCount<T>>::get(owner.clone()).checked_sub(1).unwrap());
1655
1656
1524 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).sponsor
1629 }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;
1765
1766 // sponsor timeout
1767 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 true
1775 }
1776 else {
1777 false
1778 }
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 true
1792 }
1793 else {
1794 false
1795 }
1796 }
1797 else {
1798 basket.push(BasketItem { start_block: block_number, address: _new_owner.clone()});
1799 true
1800 }
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 true
1809 } else {
1810 false
1811 }
1812 }
1813 _ => {
1814 false
1815 },
1816 };
1817
1818 if !sponsor_transfer {
1819 T::AccountId::default()
1820 } else {
1821 <Collection<T>>::get(collection_id).sponsor
1822 }
1632 }1823 }
16331824
1634 _ => T::AccountId::default(),1825 _ => T::AccountId::default(),
1745 Ok(())1936 Ok(())
1746 }1937 }
1747}1938}
1748// #endregion1939// #endregion
1940
modifiedpallets/nft/src/mock.rsdiffbeforeafterboth

no syntactic changes

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