git.delta.rocks / unique-network / refs/commits / a4127fe2eb7d

difftreelog

Merge commit '4359d76172511a9ab73cac61957cc6ddf47a2653' into feature/evm-call-sponsoring

Yaroslav Bolyukin2021-07-27parents: #1c1c248 #4359d76.patch.diff
in: master

31 files changed

modifiednode/cli/src/chain_spec.rsdiffbeforeafterboth
--- a/node/cli/src/chain_spec.rs
+++ b/node/cli/src/chain_spec.rs
@@ -196,6 +196,7 @@
 					const_on_chain_schema: vec![],
 					variable_on_chain_schema: vec![],
 					limits: CollectionLimits::default(),
+					transfers_enabled: true,
 				},
 			)],
 			nft_item_id: vec![],
modifiedpallets/inflation/src/tests.rsdiffbeforeafterboth
--- a/pallets/inflation/src/tests.rs
+++ b/pallets/inflation/src/tests.rs
@@ -31,6 +31,8 @@
 	type ExistentialDeposit = ExistentialDeposit;
 	type WeightInfo = ();
 	type MaxLocks = MaxLocks;
+	type MaxReserves = ();
+	type ReserveIdentifier = ();
 }
 
 frame_support::construct_runtime!(
@@ -89,7 +91,6 @@
 	type InflationBlockInterval = InflationBlockInterval;
 }
 
-// Build genesis storage according to the mock runtime.
 pub fn new_test_ext() -> sp_io::TestExternalities {
 	frame_system::GenesisConfig::default()
 		.build_storage::<Test>()
@@ -108,7 +109,9 @@
 		// BlockInflation should be set after 1st block and
 		// first inflation deposit should be equal to BlockInflation
 		Inflation::on_initialize(1);
-		assert!(Inflation::block_inflation() > 0);
+
+		// SBP M2 review: Verify expected block inflation for year 1
+		assert_eq!(Inflation::block_inflation(), 1901);
 		assert_eq!(
 			Balances::free_balance(1234) - initial_issuance,
 			Inflation::block_inflation()
@@ -155,11 +158,24 @@
 		Inflation::on_initialize(1);
 		let block_inflation_year_0 = Inflation::block_inflation();
 
+		// SBP M2 review: go through all the block inflations for year 1,
+		// total issuance will be updated accordingly
+		for block in (100..YEAR).step_by(100) {
+			Inflation::on_initialize(block);
+		}
+		assert_eq!(
+			initial_issuance + (1901 * (YEAR / 100)),
+			<Balances as Currency<_>>::total_issuance()
+		);
+
 		Inflation::on_initialize(YEAR);
 		let block_inflation_year_1 = Inflation::block_inflation();
+		// SBP M2 review: Verify expected block inflation for year 2
+		assert_eq!(block_inflation_year_1, 1952);
 
+		// SBP M2 review: this is actually not true
 		// Assert that year 1 inflation is less than year 0
-		assert!(block_inflation_year_0 > block_inflation_year_1);
+		// assert!(block_inflation_year_0 > block_inflation_year_1);
 	});
 }
 
@@ -177,6 +193,7 @@
 			Inflation::on_initialize(YEAR * year);
 			let block_inflation_year_after = Inflation::block_inflation();
 
+			// SBP M2 review: this is actually not true (not for the first few years)
 			// Assert that next year inflation is less than previous year inflation
 			assert!(block_inflation_year_before > block_inflation_year_after);
 		}
modifiedpallets/nft/src/lib.rsdiffbeforeafterboth
--- a/pallets/nft/src/lib.rs
+++ b/pallets/nft/src/lib.rs
@@ -174,6 +174,8 @@
 		BadCreateRefungibleCall,
 		/// Gas limit exceeded
 		OutOfGas,
+		/// Collection settings not allowing items transferring
+		TransferNotAllowed,
 	}
 }
 
@@ -526,6 +528,7 @@
 				variable_on_chain_schema: Vec::new(),
 				const_on_chain_schema: Vec::new(),
 				limits,
+				transfers_enabled: true,
 			};
 
 			// Add new collection to map
@@ -901,6 +904,32 @@
 			collection.submit_logs()
 		}
 
+		// TODO! transaction weight
+
+		/// Set transfers_enabled value for particular collection
+		///
+		/// # Permissions
+		///
+		/// * Collection Owner.
+		///
+		/// # Arguments
+		///
+		/// * collection_id: ID of the collection.
+		///
+		/// * value: New flag value.
+		#[weight = <T as Config>::WeightInfo::burn_item()]
+		#[transactional]
+		pub fn set_transfers_enabled_flag(origin, collection_id: CollectionId, value: bool) -> DispatchResult {
+
+			let sender = ensure_signed(origin)?;
+			let mut target_collection = Self::get_collection(collection_id)?;
+
+			Self::check_owner_permissions(&target_collection, &sender)?;
+
+			target_collection.transfers_enabled = value;
+			target_collection.save()
+		}
+
 		/// Destroys a concrete instance of NFT.
 		///
 		/// # Permissions
@@ -1541,6 +1570,9 @@
 			Error::<T>::AccountTokenLimitExceeded
 		);
 
+		// preliminary transfer check
+		ensure!(collection.transfers_enabled, Error::<T>::TransferNotAllowed);
+
 		Ok(())
 	}
 
modifiedpallets/nft/src/mock.rsdiffbeforeafterboth
--- a/pallets/nft/src/mock.rs
+++ b/pallets/nft/src/mock.rs
@@ -74,6 +74,8 @@
 	type ExistentialDeposit = ExistentialDeposit;
 	type WeightInfo = ();
 	type MaxLocks = MaxLocks;
+	type MaxReserves = ();
+	type ReserveIdentifier = [u8; 8];
 }
 
 parameter_types! {
@@ -99,41 +101,6 @@
 
 type Timestamp = pallet_timestamp::Pallet<Test>;
 type Randomness = pallet_randomness_collective_flip::Pallet<Test>;
-
-parameter_types! {
-	pub const TombstoneDeposit: u64 = 1;
-	pub const DepositPerContract: u64 = 1;
-	pub const DepositPerStorageByte: u64 = 1;
-	pub const DepositPerStorageItem: u64 = 1;
-	pub RentFraction: Perbill = Perbill::from_rational(1u32, 30 * 24 * 60 * 10);
-	pub const SurchargeReward: u64 = 1;
-	pub const SignedClaimHandicap: u32 = 2;
-	pub DeletionWeightLimit: u64 = u64::MAX;//Perbill::from_percent(10);
-	pub DeletionQueueDepth: u32 = 10;
-	pub Schedule: pallet_contracts::Schedule<Test> = Default::default();
-}
-
-impl pallet_contracts::Config for Test {
-	type Time = Timestamp;
-	type Randomness = Randomness;
-	type Currency = pallet_balances::Pallet<Test>;
-	type Event = ();
-	type RentPayment = ();
-	type SignedClaimHandicap = SignedClaimHandicap;
-	type TombstoneDeposit = TombstoneDeposit;
-	type DepositPerContract = DepositPerContract;
-	type DepositPerStorageByte = DepositPerStorageByte;
-	type DepositPerStorageItem = DepositPerStorageItem;
-	type RentFraction = RentFraction;
-	type SurchargeReward = SurchargeReward;
-	type DeletionWeightLimit = DeletionWeightLimit;
-	type DeletionQueueDepth = DeletionQueueDepth;
-	type ChainExtension = ();
-	type WeightPrice = ();
-	type WeightInfo = pallet_contracts::weights::SubstrateWeight<Self>;
-	type Schedule = Schedule;
-	type CallStack = [pallet_contracts::Frame<Self>; 31];
-}
 
 parameter_types! {
 	pub const CollectionCreationPrice: u32 = 0;
modifiedpallets/nft/src/tests.rsdiffbeforeafterboth
before · pallets/nft/src/tests.rs
1// Tests to be written here2use super::*;3use crate::mock::*;4use crate::{AccessMode, CollectionMode, Ownership, ChainLimits, CreateItemData};5use nft_data_structs::{6	CreateNftData, CreateFungibleData, CreateReFungibleData, CollectionId, TokenId,7	MAX_DECIMAL_POINTS,8};9use frame_support::{assert_noop, assert_ok};10use frame_system::{RawOrigin};1112fn default_collection_numbers_limit() -> u32 {13	1014}1516fn default_limits() {17	assert_ok!(TemplateModule::set_chain_limits(18		RawOrigin::Root.into(),19		ChainLimits {20			collection_numbers_limit: default_collection_numbers_limit(),21			account_token_ownership_limit: 10,22			collections_admins_limit: 5,23			custom_data_limit: 2048,24			nft_sponsor_transfer_timeout: 15,25			fungible_sponsor_transfer_timeout: 15,26			refungible_sponsor_transfer_timeout: 15,27			const_on_chain_schema_limit: 1024,28			offchain_schema_limit: 1024,29			variable_on_chain_schema_limit: 1024,30		}31	));32}3334fn default_nft_data() -> CreateNftData {35	CreateNftData {36		const_data: vec![1, 2, 3],37		variable_data: vec![3, 2, 1],38	}39}4041fn default_fungible_data() -> CreateFungibleData {42	CreateFungibleData { value: 5 }43}4445fn default_re_fungible_data() -> CreateReFungibleData {46	CreateReFungibleData {47		const_data: vec![1, 2, 3],48		variable_data: vec![3, 2, 1],49		pieces: 1023,50	}51}5253fn create_test_collection_for_owner(54	mode: &CollectionMode,55	owner: u64,56	id: CollectionId,57) -> CollectionId {58	let col_name1: Vec<u16> = "Test1\0".encode_utf16().collect::<Vec<u16>>();59	let col_desc1: Vec<u16> = "TestDescription1\0".encode_utf16().collect::<Vec<u16>>();60	let token_prefix1: Vec<u8> = b"token_prefix1\0".to_vec();6162	let origin1 = Origin::signed(owner);63	assert_ok!(TemplateModule::create_collection(64		origin1,65		col_name1,66		col_desc1,67		token_prefix1,68		mode.clone()69	));7071	let saved_col_name: Vec<u16> = "Test1\0".encode_utf16().collect::<Vec<u16>>();72	let saved_description: Vec<u16> = "TestDescription1\0".encode_utf16().collect::<Vec<u16>>();73	let saved_prefix: Vec<u8> = b"token_prefix1\0".to_vec();74	assert_eq!(TemplateModule::collection_id(id).unwrap().owner, owner);75	assert_eq!(76		TemplateModule::collection_id(id).unwrap().name,77		saved_col_name78	);79	assert_eq!(TemplateModule::collection_id(id).unwrap().mode, *mode);80	assert_eq!(81		TemplateModule::collection_id(id).unwrap().description,82		saved_description83	);84	assert_eq!(85		TemplateModule::collection_id(id).unwrap().token_prefix,86		saved_prefix87	);88	id89}9091fn create_test_collection(mode: &CollectionMode, id: CollectionId) -> CollectionId {92	create_test_collection_for_owner(&mode, 1, id)93}9495fn create_test_item(collection_id: CollectionId, data: &CreateItemData) {96	let origin1 = Origin::signed(1);97	assert_ok!(TemplateModule::create_item(98		origin1,99		collection_id,100		account(1),101		data.clone()102	));103}104105fn account(sub: u64) -> TestCrossAccountId {106	TestCrossAccountId::from_sub(sub)107}108109// Use cases tests region110// #region111112#[test]113fn set_version_schema() {114	new_test_ext().execute_with(|| {115		default_limits();116		let origin1 = Origin::signed(1);117		let collection_id = create_test_collection(&CollectionMode::NFT, 1);118119		assert_ok!(TemplateModule::set_schema_version(120			origin1,121			collection_id,122			SchemaVersion::Unique123		));124		assert_eq!(125			TemplateModule::collection_id(collection_id)126				.unwrap()127				.schema_version,128			SchemaVersion::Unique129		);130	});131}132133#[test]134fn create_fungible_collection_fails_with_large_decimal_numbers() {135	new_test_ext().execute_with(|| {136		default_limits();137138		let col_name1: Vec<u16> = "Test1\0".encode_utf16().collect::<Vec<u16>>();139		let col_desc1: Vec<u16> = "TestDescription1\0".encode_utf16().collect::<Vec<u16>>();140		let token_prefix1: Vec<u8> = b"token_prefix1\0".to_vec();141142		let origin1 = Origin::signed(1);143		assert_noop!(144			TemplateModule::create_collection(145				origin1,146				col_name1,147				col_desc1,148				token_prefix1,149				CollectionMode::Fungible(MAX_DECIMAL_POINTS + 1)150			),151			Error::<Test>::CollectionDecimalPointLimitExceeded152		);153	});154}155156#[test]157fn create_nft_item() {158	new_test_ext().execute_with(|| {159		default_limits();160		let collection_id = create_test_collection(&CollectionMode::NFT, 1);161162		let data = default_nft_data();163		create_test_item(collection_id, &data.clone().into());164		let item = TemplateModule::nft_item_id(collection_id, 1).unwrap();165		assert_eq!(item.const_data, data.const_data);166		assert_eq!(item.variable_data, data.variable_data);167	});168}169170// Use cases tests region171// #region172#[test]173fn create_nft_multiple_items() {174	new_test_ext().execute_with(|| {175		default_limits();176177		create_test_collection(&CollectionMode::NFT, 1);178179		let origin1 = Origin::signed(1);180181		let items_data = vec![default_nft_data(), default_nft_data(), default_nft_data()];182183		assert_ok!(TemplateModule::create_multiple_items(184			origin1,185			1,186			account(1),187			items_data188				.clone()189				.into_iter()190				.map(|d| { d.into() })191				.collect()192		));193		for (index, data) in items_data.iter().enumerate() {194			let item = TemplateModule::nft_item_id(1, (index + 1) as TokenId).unwrap();195			assert_eq!(item.const_data.to_vec(), data.const_data);196			assert_eq!(item.variable_data.to_vec(), data.variable_data);197		}198	});199}200201#[test]202fn create_refungible_item() {203	new_test_ext().execute_with(|| {204		default_limits();205		let collection_id = create_test_collection(&CollectionMode::ReFungible, 1);206207		let data = default_re_fungible_data();208		create_test_item(collection_id, &data.clone().into());209		let item = TemplateModule::refungible_item_id(collection_id, 1).unwrap();210		assert_eq!(item.const_data, data.const_data);211		assert_eq!(item.variable_data, data.variable_data);212		assert_eq!(213			item.owner[0],214			Ownership {215				owner: account(1),216				fraction: 1023217			}218		);219	});220}221222#[test]223fn create_multiple_refungible_items() {224	new_test_ext().execute_with(|| {225		default_limits();226227		create_test_collection(&CollectionMode::ReFungible, 1);228229		let origin1 = Origin::signed(1);230231		let items_data = vec![232			default_re_fungible_data(),233			default_re_fungible_data(),234			default_re_fungible_data(),235		];236237		assert_ok!(TemplateModule::create_multiple_items(238			origin1,239			1,240			account(1),241			items_data242				.clone()243				.into_iter()244				.map(|d| { d.into() })245				.collect()246		));247		for (index, data) in items_data.iter().enumerate() {248			let item = TemplateModule::refungible_item_id(1, (index + 1) as TokenId).unwrap();249			assert_eq!(item.const_data.to_vec(), data.const_data);250			assert_eq!(item.variable_data.to_vec(), data.variable_data);251			assert_eq!(252				item.owner[0],253				Ownership {254					owner: account(1),255					fraction: 1023256				}257			);258		}259	});260}261262#[test]263fn create_fungible_item() {264	new_test_ext().execute_with(|| {265		default_limits();266267		let collection_id = create_test_collection(&CollectionMode::Fungible(3), 1);268269		let data = default_fungible_data();270		create_test_item(collection_id, &data.into());271272		assert_eq!(TemplateModule::fungible_item_id(collection_id, 1).value, 5);273	});274}275276//#[test]277// fn create_multiple_fungible_items() {278//     new_test_ext().execute_with(|| {279//         default_limits();280281//         create_test_collection(&CollectionMode::Fungible(3), 1);282283//         let origin1 = Origin::signed(1);284285//         let items_data = vec![default_fungible_data(), default_fungible_data(), default_fungible_data()];286287//         assert_ok!(TemplateModule::create_multiple_items(288//             origin1.clone(),289//             1,290//             1,291//             items_data.clone().into_iter().map(|d| { d.into() }).collect()292//         ));293294//         for (index, _) in items_data.iter().enumerate() {295//             assert_eq!(TemplateModule::fungible_item_id(1, (index + 1) as TokenId).value, 5);296//         }297//         assert_eq!(TemplateModule::balance_count(1, 1), 3000);298//         assert_eq!(TemplateModule::address_tokens(1, 1), [1, 2, 3]);299//     });300// }301302#[test]303fn transfer_fungible_item() {304	new_test_ext().execute_with(|| {305		default_limits();306307		let collection_id = create_test_collection(&CollectionMode::Fungible(3), 1);308309		let origin1 = Origin::signed(1);310		let origin2 = Origin::signed(2);311312		let data = default_fungible_data();313		create_test_item(collection_id, &data.into());314315		assert_eq!(TemplateModule::fungible_item_id(1, 1).value, 5);316		assert_eq!(TemplateModule::balance_count(1, 1), 5);317318		// change owner scenario319		assert_ok!(TemplateModule::transfer(origin1, account(2), 1, 1, 5));320		assert_eq!(TemplateModule::fungible_item_id(1, 1).value, 0);321		assert_eq!(TemplateModule::balance_count(1, 1), 0);322		assert_eq!(TemplateModule::balance_count(1, 2), 5);323324		// split item scenario325		assert_ok!(TemplateModule::transfer(326			origin2.clone(),327			account(3),328			1,329			1,330			3331		));332		assert_eq!(TemplateModule::balance_count(1, 2), 2);333		assert_eq!(TemplateModule::balance_count(1, 3), 3);334335		// split item and new owner has account scenario336		assert_ok!(TemplateModule::transfer(origin2, account(3), 1, 1, 1));337		assert_eq!(TemplateModule::fungible_item_id(1, 2).value, 1);338		assert_eq!(TemplateModule::fungible_item_id(1, 3).value, 4);339		assert_eq!(TemplateModule::balance_count(1, 2), 1);340		assert_eq!(TemplateModule::balance_count(1, 3), 4);341	});342}343344#[test]345fn transfer_refungible_item() {346	new_test_ext().execute_with(|| {347		default_limits();348349		let collection_id = create_test_collection(&CollectionMode::ReFungible, 1);350351		let data = default_re_fungible_data();352		create_test_item(collection_id, &data.clone().into());353354		let origin1 = Origin::signed(1);355		let origin2 = Origin::signed(2);356		{357			let item = TemplateModule::refungible_item_id(collection_id, 1).unwrap();358			assert_eq!(item.const_data, data.const_data);359			assert_eq!(item.variable_data, data.variable_data);360			assert_eq!(361				item.owner[0],362				Ownership {363					owner: account(1),364					fraction: 1023365				}366			);367		}368		assert_eq!(TemplateModule::balance_count(1, 1), 1023);369		assert_eq!(TemplateModule::address_tokens(1, 1), [1]);370371		// change owner scenario372		assert_ok!(TemplateModule::transfer(origin1, account(2), 1, 1, 1023));373		assert_eq!(374			TemplateModule::refungible_item_id(1, 1).unwrap().owner[0],375			Ownership {376				owner: account(2),377				fraction: 1023378			}379		);380		assert_eq!(TemplateModule::balance_count(1, 1), 0);381		assert_eq!(TemplateModule::balance_count(1, 2), 1023);382		// assert_eq!(TemplateModule::address_tokens(1, 1), []);383		assert_eq!(TemplateModule::address_tokens(1, 2), [1]);384385		// split item scenario386		assert_ok!(TemplateModule::transfer(387			origin2.clone(),388			account(3),389			1,390			1,391			500392		));393		{394			let item = TemplateModule::refungible_item_id(1, 1).unwrap();395			assert_eq!(396				item.owner[0],397				Ownership {398					owner: account(2),399					fraction: 523400				}401			);402			assert_eq!(403				item.owner[1],404				Ownership {405					owner: account(3),406					fraction: 500407				}408			);409		}410		assert_eq!(TemplateModule::balance_count(1, 2), 523);411		assert_eq!(TemplateModule::balance_count(1, 3), 500);412		assert_eq!(TemplateModule::address_tokens(1, 2), [1]);413		assert_eq!(TemplateModule::address_tokens(1, 3), [1]);414415		// split item and new owner has account scenario416		assert_ok!(TemplateModule::transfer(origin2, account(3), 1, 1, 200));417		{418			let item = TemplateModule::refungible_item_id(1, 1).unwrap();419			assert_eq!(420				item.owner[0],421				Ownership {422					owner: account(2),423					fraction: 323424				}425			);426			assert_eq!(427				item.owner[1],428				Ownership {429					owner: account(3),430					fraction: 700431				}432			);433		}434		assert_eq!(TemplateModule::balance_count(1, 2), 323);435		assert_eq!(TemplateModule::balance_count(1, 3), 700);436		assert_eq!(TemplateModule::address_tokens(1, 2), [1]);437		assert_eq!(TemplateModule::address_tokens(1, 3), [1]);438	});439}440441#[test]442fn transfer_nft_item() {443	new_test_ext().execute_with(|| {444		default_limits();445446		let collection_id = create_test_collection(&CollectionMode::NFT, 1);447448		let data = default_nft_data();449		create_test_item(collection_id, &data.into());450		assert_eq!(TemplateModule::balance_count(1, 1), 1);451		assert_eq!(TemplateModule::address_tokens(1, 1), [1]);452453		let origin1 = Origin::signed(1);454		// default scenario455		assert_ok!(TemplateModule::transfer(origin1, account(2), 1, 1, 1000));456		assert_eq!(TemplateModule::nft_item_id(1, 1).unwrap().owner, account(2));457		assert_eq!(TemplateModule::balance_count(1, 1), 0);458		assert_eq!(TemplateModule::balance_count(1, 2), 1);459		// assert_eq!(TemplateModule::address_tokens(1, 1), []);460		assert_eq!(TemplateModule::address_tokens(1, 2), [1]);461	});462}463464#[test]465fn nft_approve_and_transfer_from() {466	new_test_ext().execute_with(|| {467		default_limits();468469		let collection_id = create_test_collection(&CollectionMode::NFT, 1);470471		let data = default_nft_data();472		create_test_item(collection_id, &data.into());473474		let origin1 = Origin::signed(1);475		let origin2 = Origin::signed(2);476477		assert_eq!(TemplateModule::balance_count(1, 1), 1);478		assert_eq!(TemplateModule::address_tokens(1, 1), [1]);479480		// neg transfer481		assert_noop!(482			TemplateModule::transfer_from(origin2.clone(), account(1), account(2), 1, 1, 1),483			Error::<Test>::NoPermission484		);485486		// do approve487		assert_ok!(TemplateModule::approve(origin1, account(2), 1, 1, 5));488		assert_eq!(TemplateModule::approved(1, (1, 1, 2)), 5);489		assert_eq!(TemplateModule::approved(1, (1, 1, 2)), 5);490491		assert_ok!(TemplateModule::transfer_from(492			origin2,493			account(1),494			account(3),495			1,496			1,497			1498		));499		assert_eq!(TemplateModule::approved(1, (1, 1, 2)), 4);500	});501}502503#[test]504fn nft_approve_and_transfer_from_white_list() {505	new_test_ext().execute_with(|| {506		default_limits();507508		let collection_id = create_test_collection(&CollectionMode::NFT, 1);509510		let origin1 = Origin::signed(1);511		let origin2 = Origin::signed(2);512513		let data = default_nft_data();514		create_test_item(collection_id, &data.clone().into());515516		assert_eq!(517			TemplateModule::nft_item_id(1, 1).unwrap().const_data,518			data.const_data519		);520		assert_eq!(TemplateModule::balance_count(1, 1), 1);521		assert_eq!(TemplateModule::address_tokens(1, 1), [1]);522523		assert_ok!(TemplateModule::set_mint_permission(524			origin1.clone(),525			1,526			true527		));528		assert_ok!(TemplateModule::set_public_access_mode(529			origin1.clone(),530			1,531			AccessMode::WhiteList532		));533		assert_ok!(TemplateModule::add_to_white_list(534			origin1.clone(),535			1,536			account(1)537		));538		assert_ok!(TemplateModule::add_to_white_list(539			origin1.clone(),540			1,541			account(2)542		));543		assert_ok!(TemplateModule::add_to_white_list(544			origin1.clone(),545			1,546			account(3)547		));548549		// do approve550		assert_ok!(TemplateModule::approve(551			origin1.clone(),552			account(2),553			1,554			1,555			5556		));557		assert_eq!(TemplateModule::approved(1, (1, 1, 2)), 5);558		assert_ok!(TemplateModule::approve(origin1, account(3), 1, 1, 5));559		assert_eq!(TemplateModule::approved(1, (1, 1, 3)), 5);560561		assert_ok!(TemplateModule::transfer_from(562			origin2,563			account(1),564			account(3),565			1,566			1,567			1568		));569		assert_eq!(TemplateModule::approved(1, (1, 1, 2)), 4);570	});571}572573#[test]574fn refungible_approve_and_transfer_from() {575	new_test_ext().execute_with(|| {576		default_limits();577578		let collection_id = create_test_collection(&CollectionMode::ReFungible, 1);579580		let origin1 = Origin::signed(1);581		let origin2 = Origin::signed(2);582583		let data = default_re_fungible_data();584		create_test_item(collection_id, &data.into());585586		assert_eq!(TemplateModule::balance_count(1, 1), 1023);587		assert_eq!(TemplateModule::address_tokens(1, 1), [1]);588589		assert_ok!(TemplateModule::set_mint_permission(590			origin1.clone(),591			1,592			true593		));594		assert_ok!(TemplateModule::set_public_access_mode(595			origin1.clone(),596			1,597			AccessMode::WhiteList598		));599		assert_ok!(TemplateModule::add_to_white_list(600			origin1.clone(),601			1,602			account(1)603		));604		assert_ok!(TemplateModule::add_to_white_list(605			origin1.clone(),606			1,607			account(2)608		));609		assert_ok!(TemplateModule::add_to_white_list(610			origin1.clone(),611			1,612			account(3)613		));614615		// do approve616		assert_ok!(TemplateModule::approve(origin1, account(2), 1, 1, 1023));617		assert_eq!(TemplateModule::approved(1, (1, 1, 2)), 1023);618619		assert_ok!(TemplateModule::transfer_from(620			origin2,621			account(1),622			account(3),623			1,624			1,625			100626		));627		assert_eq!(TemplateModule::balance_count(1, 1), 923);628		assert_eq!(TemplateModule::balance_count(1, 3), 100);629		assert_eq!(TemplateModule::address_tokens(1, 1), [1]);630		assert_eq!(TemplateModule::address_tokens(1, 3), [1]);631632		assert_eq!(TemplateModule::approved(1, (1, 1, 2)), 923);633	});634}635636#[test]637fn fungible_approve_and_transfer_from() {638	new_test_ext().execute_with(|| {639		default_limits();640641		let collection_id = create_test_collection(&CollectionMode::Fungible(3), 1);642643		let data = default_fungible_data();644		create_test_item(collection_id, &data.into());645646		let origin1 = Origin::signed(1);647		let origin2 = Origin::signed(2);648649		assert_eq!(TemplateModule::balance_count(1, 1), 5);650651		assert_ok!(TemplateModule::set_mint_permission(652			origin1.clone(),653			1,654			true655		));656		assert_ok!(TemplateModule::set_public_access_mode(657			origin1.clone(),658			1,659			AccessMode::WhiteList660		));661		assert_ok!(TemplateModule::add_to_white_list(662			origin1.clone(),663			1,664			account(1)665		));666		assert_ok!(TemplateModule::add_to_white_list(667			origin1.clone(),668			1,669			account(2)670		));671		assert_ok!(TemplateModule::add_to_white_list(672			origin1.clone(),673			1,674			account(3)675		));676677		// do approve678		assert_ok!(TemplateModule::approve(679			origin1.clone(),680			account(2),681			1,682			1,683			5684		));685		assert_eq!(TemplateModule::approved(1, (1, 1, 2)), 5);686		assert_ok!(TemplateModule::approve(origin1, account(3), 1, 1, 5));687		assert_eq!(TemplateModule::approved(1, (1, 1, 3)), 5);688		assert_eq!(TemplateModule::approved(1, (1, 1, 2)), 5);689690		assert_ok!(TemplateModule::transfer_from(691			origin2.clone(),692			account(1),693			account(3),694			1,695			1,696			4697		));698		assert_eq!(TemplateModule::balance_count(1, 1), 1);699		assert_eq!(TemplateModule::balance_count(1, 3), 4);700701		assert_eq!(TemplateModule::approved(1, (1, 1, 2)), 1);702703		assert_noop!(704			TemplateModule::transfer_from(origin2, account(1), account(3), 1, 1, 4),705			Error::<Test>::NoPermission706		);707	});708}709710#[test]711fn change_collection_owner() {712	new_test_ext().execute_with(|| {713		default_limits();714715		let collection_id = create_test_collection(&CollectionMode::NFT, 1);716717		let origin1 = Origin::signed(1);718		assert_ok!(TemplateModule::change_collection_owner(719			origin1,720			collection_id,721			2722		));723		assert_eq!(724			TemplateModule::collection_id(collection_id).unwrap().owner,725			2726		);727	});728}729730#[test]731fn destroy_collection() {732	new_test_ext().execute_with(|| {733		default_limits();734735		let collection_id = create_test_collection(&CollectionMode::NFT, 1);736737		let origin1 = Origin::signed(1);738		assert_ok!(TemplateModule::destroy_collection(origin1, collection_id));739	});740}741742#[test]743fn burn_nft_item() {744	new_test_ext().execute_with(|| {745		default_limits();746747		let collection_id = create_test_collection(&CollectionMode::NFT, 1);748749		let origin1 = Origin::signed(1);750		assert_ok!(TemplateModule::add_collection_admin(751			origin1.clone(),752			collection_id,753			account(2)754		));755756		let data = default_nft_data();757		create_test_item(collection_id, &data.into());758759		// check balance (collection with id = 1, user id = 1)760		assert_eq!(TemplateModule::balance_count(1, 1), 1);761762		// burn item763		assert_ok!(TemplateModule::burn_item(origin1.clone(), 1, 1, 5));764		assert_noop!(765			TemplateModule::burn_item(origin1, 1, 1, 5),766			Error::<Test>::TokenNotFound767		);768769		assert_eq!(TemplateModule::balance_count(1, 1), 0);770	});771}772773#[test]774fn burn_fungible_item() {775	new_test_ext().execute_with(|| {776		default_limits();777778		let collection_id = create_test_collection(&CollectionMode::Fungible(3), 1);779780		let origin1 = Origin::signed(1);781		assert_ok!(TemplateModule::add_collection_admin(782			origin1.clone(),783			collection_id,784			account(2)785		));786787		let data = default_fungible_data();788		create_test_item(collection_id, &data.into());789790		// check balance (collection with id = 1, user id = 1)791		assert_eq!(TemplateModule::balance_count(1, 1), 5);792793		// burn item794		assert_ok!(TemplateModule::burn_item(origin1.clone(), 1, 1, 5));795		assert_noop!(796			TemplateModule::burn_item(origin1, 1, 1, 5),797			Error::<Test>::TokenValueNotEnough798		);799800		assert_eq!(TemplateModule::balance_count(1, 1), 0);801	});802}803804#[test]805fn burn_refungible_item() {806	new_test_ext().execute_with(|| {807		default_limits();808809		let collection_id = create_test_collection(&CollectionMode::ReFungible, 1);810		let origin1 = Origin::signed(1);811812		assert_ok!(TemplateModule::set_mint_permission(813			origin1.clone(),814			collection_id,815			true816		));817		assert_ok!(TemplateModule::set_public_access_mode(818			origin1.clone(),819			collection_id,820			AccessMode::WhiteList821		));822		assert_ok!(TemplateModule::add_to_white_list(823			origin1.clone(),824			1,825			account(1)826		));827828		assert_ok!(TemplateModule::add_collection_admin(829			origin1.clone(),830			1,831			account(2)832		));833834		let data = default_re_fungible_data();835		create_test_item(collection_id, &data.into());836837		// check balance (collection with id = 1, user id = 2)838		assert_eq!(TemplateModule::balance_count(1, 1), 1023);839840		// burn item841		assert_ok!(TemplateModule::burn_item(origin1.clone(), 1, 1, 1023));842		assert_noop!(843			TemplateModule::burn_item(origin1, 1, 1, 1023),844			Error::<Test>::TokenNotFound845		);846847		assert_eq!(TemplateModule::balance_count(1, 1), 0);848	});849}850851#[test]852fn add_collection_admin() {853	new_test_ext().execute_with(|| {854		default_limits();855856		let collection1_id = create_test_collection_for_owner(&CollectionMode::NFT, 1, 1);857		create_test_collection_for_owner(&CollectionMode::NFT, 2, 2);858		create_test_collection_for_owner(&CollectionMode::NFT, 3, 3);859860		let origin1 = Origin::signed(1);861862		// collection admin863		assert_ok!(TemplateModule::add_collection_admin(864			origin1.clone(),865			collection1_id,866			account(2)867		));868		assert_ok!(TemplateModule::add_collection_admin(869			origin1,870			collection1_id,871			account(3)872		));873874		assert!(TemplateModule::admin_list_collection(collection1_id).contains(&account(2)),);875		assert!(TemplateModule::admin_list_collection(collection1_id).contains(&account(3)),);876	});877}878879#[test]880fn remove_collection_admin() {881	new_test_ext().execute_with(|| {882		default_limits();883884		let collection1_id = create_test_collection_for_owner(&CollectionMode::NFT, 1, 1);885		create_test_collection_for_owner(&CollectionMode::NFT, 2, 2);886		create_test_collection_for_owner(&CollectionMode::NFT, 3, 3);887888		let origin1 = Origin::signed(1);889		let origin2 = Origin::signed(2);890891		// collection admin892		assert_ok!(TemplateModule::add_collection_admin(893			origin1.clone(),894			collection1_id,895			account(2)896		));897		assert_ok!(TemplateModule::add_collection_admin(898			origin1,899			collection1_id,900			account(3)901		));902903		assert!(TemplateModule::admin_list_collection(1).contains(&account(2)),);904		assert!(TemplateModule::admin_list_collection(1).contains(&account(3)),);905906		// remove admin907		assert_ok!(TemplateModule::remove_collection_admin(908			origin2,909			1,910			account(3)911		));912		assert!(!TemplateModule::admin_list_collection(1).contains(&account(3)),);913	});914}915916#[test]917fn balance_of() {918	new_test_ext().execute_with(|| {919		default_limits();920921		let nft_collection_id = create_test_collection(&CollectionMode::NFT, 1);922		let fungible_collection_id = create_test_collection(&CollectionMode::Fungible(3), 2);923		let re_fungible_collection_id = create_test_collection(&CollectionMode::ReFungible, 3);924925		// check balance before926		assert_eq!(TemplateModule::balance_count(nft_collection_id, 1), 0);927		assert_eq!(TemplateModule::balance_count(fungible_collection_id, 1), 0);928		assert_eq!(929			TemplateModule::balance_count(re_fungible_collection_id, 1),930			0931		);932933		let nft_data = default_nft_data();934		create_test_item(nft_collection_id, &nft_data.into());935936		let fungible_data = default_fungible_data();937		create_test_item(fungible_collection_id, &fungible_data.into());938939		let re_fungible_data = default_re_fungible_data();940		create_test_item(re_fungible_collection_id, &re_fungible_data.into());941942		// check balance (collection with id = 1, user id = 1)943		assert_eq!(TemplateModule::balance_count(nft_collection_id, 1), 1);944		assert_eq!(TemplateModule::balance_count(fungible_collection_id, 1), 5);945		assert_eq!(946			TemplateModule::balance_count(re_fungible_collection_id, 1),947			1023948		);949		assert_eq!(950			TemplateModule::nft_item_id(nft_collection_id, 1)951				.unwrap()952				.owner,953			account(1)954		);955		assert_eq!(956			TemplateModule::fungible_item_id(fungible_collection_id, 1).value,957			5958		);959		assert_eq!(960			TemplateModule::refungible_item_id(re_fungible_collection_id, 1)961				.unwrap()962				.owner[0]963				.owner,964			account(1)965		);966	});967}968969#[test]970fn approve() {971	new_test_ext().execute_with(|| {972		default_limits();973974		let collection_id = create_test_collection(&CollectionMode::NFT, 1);975976		let data = default_nft_data();977		create_test_item(collection_id, &data.into());978979		let origin1 = Origin::signed(1);980981		// approve982		assert_ok!(TemplateModule::approve(origin1, account(2), 1, 1, 1));983		assert_eq!(TemplateModule::approved(1, (1, 1, 2)), 1);984	});985}986987#[test]988fn transfer_from() {989	new_test_ext().execute_with(|| {990		default_limits();991992		let collection_id = create_test_collection(&CollectionMode::NFT, 1);993		let origin1 = Origin::signed(1);994		let origin2 = Origin::signed(2);995996		let data = default_nft_data();997		create_test_item(collection_id, &data.into());998999		// approve1000		assert_ok!(TemplateModule::approve(1001			origin1.clone(),1002			account(2),1003			1,1004			1,1005			11006		));1007		assert_eq!(TemplateModule::approved(1, (1, 1, 2)), 1);10081009		assert_ok!(TemplateModule::set_mint_permission(1010			origin1.clone(),1011			1,1012			true1013		));1014		assert_ok!(TemplateModule::set_public_access_mode(1015			origin1.clone(),1016			1,1017			AccessMode::WhiteList1018		));1019		assert_ok!(TemplateModule::add_to_white_list(1020			origin1.clone(),1021			1,1022			account(1)1023		));1024		assert_ok!(TemplateModule::add_to_white_list(1025			origin1.clone(),1026			1,1027			account(2)1028		));1029		assert_ok!(TemplateModule::add_to_white_list(origin1, 1, account(3)));10301031		assert_ok!(TemplateModule::transfer_from(1032			origin2,1033			account(1),1034			account(2),1035			1,1036			1,1037			11038		));10391040		// after transfer1041		assert_eq!(TemplateModule::balance_count(1, 1), 0);1042		assert_eq!(TemplateModule::balance_count(1, 2), 1);1043	});1044}10451046// #endregion10471048// Coverage tests region1049// #region10501051#[test]1052fn owner_can_add_address_to_white_list() {1053	new_test_ext().execute_with(|| {1054		default_limits();10551056		let collection_id = create_test_collection(&CollectionMode::NFT, 1);10571058		let origin1 = Origin::signed(1);1059		assert_ok!(TemplateModule::add_to_white_list(1060			origin1,1061			collection_id,1062			account(2)1063		));1064		assert!(TemplateModule::white_list(collection_id, 2));1065	});1066}10671068#[test]1069fn admin_can_add_address_to_white_list() {1070	new_test_ext().execute_with(|| {1071		default_limits();10721073		let collection_id = create_test_collection(&CollectionMode::NFT, 1);1074		let origin1 = Origin::signed(1);1075		let origin2 = Origin::signed(2);10761077		assert_ok!(TemplateModule::add_collection_admin(1078			origin1,1079			collection_id,1080			account(2)1081		));1082		assert_ok!(TemplateModule::add_to_white_list(1083			origin2,1084			collection_id,1085			account(3)1086		));1087		assert!(TemplateModule::white_list(collection_id, 3));1088	});1089}10901091#[test]1092fn nonprivileged_user_cannot_add_address_to_white_list() {1093	new_test_ext().execute_with(|| {1094		default_limits();10951096		let collection_id = create_test_collection(&CollectionMode::NFT, 1);10971098		let origin2 = Origin::signed(2);1099		assert_noop!(1100			TemplateModule::add_to_white_list(origin2, collection_id, account(3)),1101			Error::<Test>::NoPermission1102		);1103	});1104}11051106#[test]1107fn nobody_can_add_address_to_white_list_of_nonexisting_collection() {1108	new_test_ext().execute_with(|| {1109		default_limits();11101111		let origin1 = Origin::signed(1);11121113		assert_noop!(1114			TemplateModule::add_to_white_list(origin1, 1, account(2)),1115			Error::<Test>::CollectionNotFound1116		);1117	});1118}11191120#[test]1121fn nobody_can_add_address_to_white_list_of_deleted_collection() {1122	new_test_ext().execute_with(|| {1123		default_limits();11241125		let collection_id = create_test_collection(&CollectionMode::NFT, 1);11261127		let origin1 = Origin::signed(1);1128		assert_ok!(TemplateModule::destroy_collection(1129			origin1.clone(),1130			collection_id1131		));1132		assert_noop!(1133			TemplateModule::add_to_white_list(origin1, collection_id, account(2)),1134			Error::<Test>::CollectionNotFound1135		);1136	});1137}11381139// If address is already added to white list, nothing happens1140#[test]1141fn address_is_already_added_to_white_list() {1142	new_test_ext().execute_with(|| {1143		default_limits();11441145		let collection_id = create_test_collection(&CollectionMode::NFT, 1);1146		let origin1 = Origin::signed(1);11471148		assert_ok!(TemplateModule::add_to_white_list(1149			origin1.clone(),1150			collection_id,1151			account(2)1152		));1153		assert_ok!(TemplateModule::add_to_white_list(1154			origin1,1155			collection_id,1156			account(2)1157		));1158		assert!(TemplateModule::white_list(collection_id, 2));1159	});1160}11611162#[test]1163fn owner_can_remove_address_from_white_list() {1164	new_test_ext().execute_with(|| {1165		default_limits();11661167		let collection_id = create_test_collection(&CollectionMode::NFT, 1);11681169		let origin1 = Origin::signed(1);1170		assert_ok!(TemplateModule::add_to_white_list(1171			origin1.clone(),1172			collection_id,1173			account(2)1174		));1175		assert_ok!(TemplateModule::remove_from_white_list(1176			origin1,1177			collection_id,1178			account(2)1179		));1180		assert!(!TemplateModule::white_list(collection_id, 2));1181	});1182}11831184#[test]1185fn admin_can_remove_address_from_white_list() {1186	new_test_ext().execute_with(|| {1187		default_limits();11881189		let collection_id = create_test_collection(&CollectionMode::NFT, 1);1190		let origin1 = Origin::signed(1);1191		let origin2 = Origin::signed(2);11921193		assert_ok!(TemplateModule::add_collection_admin(1194			origin1.clone(),1195			collection_id,1196			account(2)1197		));11981199		assert_ok!(TemplateModule::add_to_white_list(1200			origin1,1201			collection_id,1202			account(3)1203		));1204		assert_ok!(TemplateModule::remove_from_white_list(1205			origin2,1206			collection_id,1207			account(3)1208		));1209		assert!(!TemplateModule::white_list(collection_id, 3));1210	});1211}12121213#[test]1214fn nonprivileged_user_cannot_remove_address_from_white_list() {1215	new_test_ext().execute_with(|| {1216		default_limits();12171218		let collection_id = create_test_collection(&CollectionMode::NFT, 1);1219		let origin1 = Origin::signed(1);1220		let origin2 = Origin::signed(2);12211222		assert_ok!(TemplateModule::add_to_white_list(1223			origin1,1224			collection_id,1225			account(2)1226		));1227		assert_noop!(1228			TemplateModule::remove_from_white_list(origin2, collection_id, account(2)),1229			Error::<Test>::NoPermission1230		);1231		assert!(TemplateModule::white_list(collection_id, 2));1232	});1233}12341235#[test]1236fn nobody_can_remove_address_from_white_list_of_nonexisting_collection() {1237	new_test_ext().execute_with(|| {1238		default_limits();1239		let origin1 = Origin::signed(1);12401241		assert_noop!(1242			TemplateModule::remove_from_white_list(origin1, 1, account(2)),1243			Error::<Test>::CollectionNotFound1244		);1245	});1246}12471248#[test]1249fn nobody_can_remove_address_from_white_list_of_deleted_collection() {1250	new_test_ext().execute_with(|| {1251		default_limits();12521253		let collection_id = create_test_collection(&CollectionMode::NFT, 1);1254		let origin1 = Origin::signed(1);1255		let origin2 = Origin::signed(2);12561257		assert_ok!(TemplateModule::add_to_white_list(1258			origin1.clone(),1259			collection_id,1260			account(2)1261		));1262		assert_ok!(TemplateModule::destroy_collection(origin1, collection_id));1263		assert_noop!(1264			TemplateModule::remove_from_white_list(origin2, collection_id, account(2)),1265			Error::<Test>::CollectionNotFound1266		);1267		assert!(!TemplateModule::white_list(collection_id, 2));1268	});1269}12701271// If address is already removed from white list, nothing happens1272#[test]1273fn address_is_already_removed_from_white_list() {1274	new_test_ext().execute_with(|| {1275		default_limits();12761277		let collection_id = create_test_collection(&CollectionMode::NFT, 1);1278		let origin1 = Origin::signed(1);12791280		assert_ok!(TemplateModule::add_to_white_list(1281			origin1.clone(),1282			collection_id,1283			account(2)1284		));1285		assert_ok!(TemplateModule::remove_from_white_list(1286			origin1.clone(),1287			collection_id,1288			account(2)1289		));1290		assert_ok!(TemplateModule::remove_from_white_list(1291			origin1,1292			collection_id,1293			account(2)1294		));1295		assert!(!TemplateModule::white_list(collection_id, 2));1296	});1297}12981299// If Public Access mode is set to WhiteList, tokens can’t be transferred from a non-whitelisted address with transfer or transferFrom (2 tests)1300#[test]1301fn white_list_test_1() {1302	new_test_ext().execute_with(|| {1303		default_limits();13041305		let collection_id = create_test_collection(&CollectionMode::NFT, 1);13061307		let origin1 = Origin::signed(1);13081309		let data = default_nft_data();1310		create_test_item(collection_id, &data.into());13111312		assert_ok!(TemplateModule::set_public_access_mode(1313			origin1.clone(),1314			collection_id,1315			AccessMode::WhiteList1316		));1317		assert_ok!(TemplateModule::add_to_white_list(1318			origin1.clone(),1319			collection_id,1320			account(2)1321		));13221323		assert_noop!(1324			TemplateModule::transfer(origin1, account(3), 1, 1, 1),1325			Error::<Test>::AddresNotInWhiteList1326		);1327	});1328}13291330#[test]1331fn white_list_test_2() {1332	new_test_ext().execute_with(|| {1333		default_limits();13341335		let collection_id = create_test_collection(&CollectionMode::NFT, 1);1336		let origin1 = Origin::signed(1);13371338		let data = default_nft_data();1339		create_test_item(collection_id, &data.into());13401341		assert_ok!(TemplateModule::set_public_access_mode(1342			origin1.clone(),1343			collection_id,1344			AccessMode::WhiteList1345		));1346		assert_ok!(TemplateModule::add_to_white_list(1347			origin1.clone(),1348			1,1349			account(1)1350		));1351		assert_ok!(TemplateModule::add_to_white_list(1352			origin1.clone(),1353			1,1354			account(2)1355		));13561357		// do approve1358		assert_ok!(TemplateModule::approve(1359			origin1.clone(),1360			account(1),1361			1,1362			1,1363			11364		));1365		assert_eq!(TemplateModule::approved(1, (1, 1, 1)), 1);13661367		assert_ok!(TemplateModule::remove_from_white_list(1368			origin1.clone(),1369			1,1370			account(1)1371		));13721373		assert_noop!(1374			TemplateModule::transfer_from(origin1, account(1), account(3), 1, 1, 1),1375			Error::<Test>::AddresNotInWhiteList1376		);1377	});1378}13791380// If Public Access mode is set to WhiteList, tokens can’t be transferred to a non-whitelisted address with transfer or transferFrom (2 tests)1381#[test]1382fn white_list_test_3() {1383	new_test_ext().execute_with(|| {1384		default_limits();13851386		let collection_id = create_test_collection(&CollectionMode::NFT, 1);13871388		let origin1 = Origin::signed(1);13891390		let data = default_nft_data();1391		create_test_item(collection_id, &data.into());13921393		assert_ok!(TemplateModule::set_public_access_mode(1394			origin1.clone(),1395			collection_id,1396			AccessMode::WhiteList1397		));1398		assert_ok!(TemplateModule::add_to_white_list(1399			origin1.clone(),1400			1,1401			account(1)1402		));14031404		assert_noop!(1405			TemplateModule::transfer(origin1, account(3), 1, 1, 1),1406			Error::<Test>::AddresNotInWhiteList1407		);1408	});1409}14101411#[test]1412fn white_list_test_4() {1413	new_test_ext().execute_with(|| {1414		default_limits();14151416		let collection_id = create_test_collection(&CollectionMode::NFT, 1);14171418		let origin1 = Origin::signed(1);14191420		let data = default_nft_data();1421		create_test_item(collection_id, &data.into());14221423		assert_ok!(TemplateModule::set_public_access_mode(1424			origin1.clone(),1425			collection_id,1426			AccessMode::WhiteList1427		));1428		assert_ok!(TemplateModule::add_to_white_list(1429			origin1.clone(),1430			collection_id,1431			account(1)1432		));1433		assert_ok!(TemplateModule::add_to_white_list(1434			origin1.clone(),1435			collection_id,1436			account(2)1437		));14381439		// do approve1440		assert_ok!(TemplateModule::approve(1441			origin1.clone(),1442			account(1),1443			1,1444			1,1445			11446		));1447		assert_eq!(TemplateModule::approved(1, (1, 1, 1)), 1);14481449		assert_ok!(TemplateModule::remove_from_white_list(1450			origin1.clone(),1451			collection_id,1452			account(2)1453		));14541455		assert_noop!(1456			TemplateModule::transfer_from(origin1, account(1), account(3), 1, 1, 1),1457			Error::<Test>::AddresNotInWhiteList1458		);1459	});1460}14611462// If Public Access mode is set to WhiteList, tokens can’t be destroyed by a non-whitelisted address (even if it owned them before enabling WhiteList mode)1463#[test]1464fn white_list_test_5() {1465	new_test_ext().execute_with(|| {1466		default_limits();14671468		let collection_id = create_test_collection(&CollectionMode::NFT, 1);14691470		let origin1 = Origin::signed(1);14711472		let data = default_nft_data();1473		create_test_item(collection_id, &data.into());14741475		assert_ok!(TemplateModule::set_public_access_mode(1476			origin1.clone(),1477			collection_id,1478			AccessMode::WhiteList1479		));1480		assert_noop!(1481			TemplateModule::burn_item(origin1, 1, 1, 5),1482			Error::<Test>::AddresNotInWhiteList1483		);1484	});1485}14861487// If Public Access mode is set to WhiteList, token transfers can’t be Approved by a non-whitelisted address (see Approve method).1488#[test]1489fn white_list_test_6() {1490	new_test_ext().execute_with(|| {1491		default_limits();14921493		let collection_id = create_test_collection(&CollectionMode::NFT, 1);14941495		let origin1 = Origin::signed(1);14961497		let data = default_nft_data();1498		create_test_item(collection_id, &data.into());14991500		assert_ok!(TemplateModule::set_public_access_mode(1501			origin1.clone(),1502			collection_id,1503			AccessMode::WhiteList1504		));15051506		// do approve1507		assert_noop!(1508			TemplateModule::approve(origin1, account(1), 1, 1, 5),1509			Error::<Test>::AddresNotInWhiteList1510		);1511	});1512}15131514// If Public Access mode is set to WhiteList, tokens can be transferred from a whitelisted address with transfer or transferFrom (2 tests) and1515//          tokens can be transferred from a whitelisted address with transfer or transferFrom (2 tests)1516#[test]1517fn white_list_test_7() {1518	new_test_ext().execute_with(|| {1519		default_limits();15201521		let collection_id = create_test_collection(&CollectionMode::NFT, 1);15221523		let data = default_nft_data();1524		create_test_item(collection_id, &data.into());15251526		let origin1 = Origin::signed(1);15271528		assert_ok!(TemplateModule::set_public_access_mode(1529			origin1.clone(),1530			collection_id,1531			AccessMode::WhiteList1532		));1533		assert_ok!(TemplateModule::add_to_white_list(1534			origin1.clone(),1535			collection_id,1536			account(1)1537		));1538		assert_ok!(TemplateModule::add_to_white_list(1539			origin1.clone(),1540			collection_id,1541			account(2)1542		));15431544		assert_ok!(TemplateModule::transfer(origin1, account(2), 1, 1, 1));1545	});1546}15471548#[test]1549fn white_list_test_8() {1550	new_test_ext().execute_with(|| {1551		default_limits();15521553		let collection_id = create_test_collection(&CollectionMode::NFT, 1);15541555		let data = default_nft_data();1556		create_test_item(collection_id, &data.into());15571558		let origin1 = Origin::signed(1);15591560		assert_ok!(TemplateModule::set_public_access_mode(1561			origin1.clone(),1562			collection_id,1563			AccessMode::WhiteList1564		));1565		assert_ok!(TemplateModule::add_to_white_list(1566			origin1.clone(),1567			collection_id,1568			account(1)1569		));1570		assert_ok!(TemplateModule::add_to_white_list(1571			origin1.clone(),1572			collection_id,1573			account(2)1574		));15751576		// do approve1577		assert_ok!(TemplateModule::approve(1578			origin1.clone(),1579			account(1),1580			1,1581			1,1582			51583		));1584		assert_eq!(TemplateModule::approved(1, (1, 1, 1)), 5);15851586		assert_ok!(TemplateModule::transfer_from(1587			origin1,1588			account(1),1589			account(2),1590			1,1591			1,1592			11593		));1594	});1595}15961597// If Public Access mode is set to WhiteList, and Mint Permission is set to false, tokens can be created by owner.1598#[test]1599fn white_list_test_9() {1600	new_test_ext().execute_with(|| {1601		default_limits();16021603		let collection_id = create_test_collection(&CollectionMode::NFT, 1);1604		let origin1 = Origin::signed(1);16051606		assert_ok!(TemplateModule::set_public_access_mode(1607			origin1.clone(),1608			collection_id,1609			AccessMode::WhiteList1610		));1611		assert_ok!(TemplateModule::set_mint_permission(1612			origin1,1613			collection_id,1614			false1615		));16161617		let data = default_nft_data();1618		create_test_item(collection_id, &data.into());1619	});1620}16211622// If Public Access mode is set to WhiteList, and Mint Permission is set to false, tokens can be created by admin.1623#[test]1624fn white_list_test_10() {1625	new_test_ext().execute_with(|| {1626		default_limits();16271628		let collection_id = create_test_collection(&CollectionMode::NFT, 1);16291630		let origin1 = Origin::signed(1);1631		let origin2 = Origin::signed(2);16321633		assert_ok!(TemplateModule::set_public_access_mode(1634			origin1.clone(),1635			collection_id,1636			AccessMode::WhiteList1637		));1638		assert_ok!(TemplateModule::set_mint_permission(1639			origin1.clone(),1640			collection_id,1641			false1642		));16431644		assert_ok!(TemplateModule::add_collection_admin(1645			origin1,1646			collection_id,1647			account(2)1648		));16491650		assert_ok!(TemplateModule::create_item(1651			origin2,1652			collection_id,1653			account(2),1654			default_nft_data().into()1655		));1656	});1657}16581659// If Public Access mode is set to WhiteList, and Mint Permission is set to false, tokens cannot be created by non-privileged and white listed address.1660#[test]1661fn white_list_test_11() {1662	new_test_ext().execute_with(|| {1663		default_limits();16641665		let collection_id = create_test_collection(&CollectionMode::NFT, 1);16661667		let origin1 = Origin::signed(1);1668		let origin2 = Origin::signed(2);16691670		assert_ok!(TemplateModule::set_public_access_mode(1671			origin1.clone(),1672			collection_id,1673			AccessMode::WhiteList1674		));1675		assert_ok!(TemplateModule::set_mint_permission(1676			origin1.clone(),1677			collection_id,1678			false1679		));1680		assert_ok!(TemplateModule::add_to_white_list(1681			origin1,1682			collection_id,1683			account(2)1684		));16851686		assert_noop!(1687			TemplateModule::create_item(origin2, 1, account(2), default_nft_data().into()),1688			Error::<Test>::PublicMintingNotAllowed1689		);1690	});1691}16921693// If Public Access mode is set to WhiteList, and Mint Permission is set to false, tokens cannot be created by non-privileged and non-white listed address.1694#[test]1695fn white_list_test_12() {1696	new_test_ext().execute_with(|| {1697		default_limits();16981699		let collection_id = create_test_collection(&CollectionMode::NFT, 1);17001701		let origin1 = Origin::signed(1);1702		let origin2 = Origin::signed(2);17031704		assert_ok!(TemplateModule::set_public_access_mode(1705			origin1.clone(),1706			collection_id,1707			AccessMode::WhiteList1708		));1709		assert_ok!(TemplateModule::set_mint_permission(1710			origin1,1711			collection_id,1712			false1713		));17141715		assert_noop!(1716			TemplateModule::create_item(origin2, 1, account(2), default_nft_data().into()),1717			Error::<Test>::PublicMintingNotAllowed1718		);1719	});1720}17211722// If Public Access mode is set to WhiteList, and Mint Permission is set to true, tokens can be created by owner.1723#[test]1724fn white_list_test_13() {1725	new_test_ext().execute_with(|| {1726		default_limits();17271728		let collection_id = create_test_collection(&CollectionMode::NFT, 1);17291730		let origin1 = Origin::signed(1);17311732		assert_ok!(TemplateModule::set_public_access_mode(1733			origin1.clone(),1734			collection_id,1735			AccessMode::WhiteList1736		));1737		assert_ok!(TemplateModule::set_mint_permission(1738			origin1,1739			collection_id,1740			true1741		));17421743		let data = default_nft_data();1744		create_test_item(collection_id, &data.into());1745	});1746}17471748// If Public Access mode is set to WhiteList, and Mint Permission is set to true, tokens can be created by admin.1749#[test]1750fn white_list_test_14() {1751	new_test_ext().execute_with(|| {1752		default_limits();17531754		let collection_id = create_test_collection(&CollectionMode::NFT, 1);17551756		let origin1 = Origin::signed(1);1757		let origin2 = Origin::signed(2);17581759		assert_ok!(TemplateModule::set_public_access_mode(1760			origin1.clone(),1761			collection_id,1762			AccessMode::WhiteList1763		));1764		assert_ok!(TemplateModule::set_mint_permission(1765			origin1.clone(),1766			collection_id,1767			true1768		));17691770		assert_ok!(TemplateModule::add_collection_admin(1771			origin1,1772			collection_id,1773			account(2)1774		));17751776		assert_ok!(TemplateModule::create_item(1777			origin2,1778			1,1779			account(2),1780			default_nft_data().into()1781		));1782	});1783}17841785// If Public Access mode is set to WhiteList, and Mint Permission is set to true, tokens cannot be created by non-privileged and non-white listed address.1786#[test]1787fn white_list_test_15() {1788	new_test_ext().execute_with(|| {1789		default_limits();17901791		let collection_id = create_test_collection(&CollectionMode::NFT, 1);17921793		let origin1 = Origin::signed(1);1794		let origin2 = Origin::signed(2);17951796		assert_ok!(TemplateModule::set_public_access_mode(1797			origin1.clone(),1798			collection_id,1799			AccessMode::WhiteList1800		));1801		assert_ok!(TemplateModule::set_mint_permission(1802			origin1,1803			collection_id,1804			true1805		));18061807		assert_noop!(1808			TemplateModule::create_item(origin2, 1, account(2), default_nft_data().into()),1809			Error::<Test>::AddresNotInWhiteList1810		);1811	});1812}18131814// If Public Access mode is set to WhiteList, and Mint Permission is set to true, tokens can be created by non-privileged and white listed address.1815#[test]1816fn white_list_test_16() {1817	new_test_ext().execute_with(|| {1818		default_limits();18191820		let collection_id = create_test_collection(&CollectionMode::NFT, 1);18211822		let origin1 = Origin::signed(1);1823		let origin2 = Origin::signed(2);18241825		assert_ok!(TemplateModule::set_public_access_mode(1826			origin1.clone(),1827			collection_id,1828			AccessMode::WhiteList1829		));1830		assert_ok!(TemplateModule::set_mint_permission(1831			origin1.clone(),1832			collection_id,1833			true1834		));1835		assert_ok!(TemplateModule::add_to_white_list(1836			origin1,1837			collection_id,1838			account(2)1839		));18401841		assert_ok!(TemplateModule::create_item(1842			origin2,1843			1,1844			account(2),1845			default_nft_data().into()1846		));1847	});1848}18491850// Total number of collections. Positive test1851#[test]1852fn total_number_collections_bound() {1853	new_test_ext().execute_with(|| {1854		default_limits();18551856		create_test_collection(&CollectionMode::NFT, 1);1857	});1858}18591860// Total number of collections. Negotive test1861#[test]1862fn total_number_collections_bound_neg() {1863	new_test_ext().execute_with(|| {1864		default_limits();18651866		let origin1 = Origin::signed(1);18671868		for i in 0..default_collection_numbers_limit() {1869			create_test_collection(&CollectionMode::NFT, i + 1);1870		}18711872		let col_name1: Vec<u16> = "Test1\0".encode_utf16().collect::<Vec<u16>>();1873		let col_desc1: Vec<u16> = "TestDescription1\0".encode_utf16().collect::<Vec<u16>>();1874		let token_prefix1: Vec<u8> = b"token_prefix1\0".to_vec();18751876		// 11-th collection in chain. Expects error1877		assert_noop!(1878			TemplateModule::create_collection(1879				origin1,1880				col_name1,1881				col_desc1,1882				token_prefix1,1883				CollectionMode::NFT1884			),1885			Error::<Test>::TotalCollectionsLimitExceeded1886		);1887	});1888}18891890// Owned tokens by a single address. Positive test1891#[test]1892fn owned_tokens_bound() {1893	new_test_ext().execute_with(|| {1894		default_limits();18951896		let collection_id = create_test_collection(&CollectionMode::NFT, 1);18971898		let data = default_nft_data();1899		create_test_item(collection_id, &data.clone().into());1900		create_test_item(collection_id, &data.into());1901	});1902}19031904// Owned tokens by a single address. Negotive test1905#[test]1906fn owned_tokens_bound_neg() {1907	new_test_ext().execute_with(|| {1908		assert_ok!(TemplateModule::set_chain_limits(1909			RawOrigin::Root.into(),1910			ChainLimits {1911				collection_numbers_limit: 10,1912				account_token_ownership_limit: 1,1913				collections_admins_limit: 5,1914				custom_data_limit: 2048,1915				nft_sponsor_transfer_timeout: 15,1916				fungible_sponsor_transfer_timeout: 15,1917				refungible_sponsor_transfer_timeout: 15,1918				const_on_chain_schema_limit: 1024,1919				offchain_schema_limit: 1024,1920				variable_on_chain_schema_limit: 1024,1921			}1922		));19231924		let collection_id = create_test_collection(&CollectionMode::NFT, 1);19251926		let origin1 = Origin::signed(1);1927		let data = default_nft_data();1928		create_test_item(collection_id, &data.clone().into());19291930		assert_noop!(1931			TemplateModule::create_item(origin1, 1, account(1), data.into()),1932			Error::<Test>::AddressOwnershipLimitExceeded1933		);1934	});1935}19361937// Number of collection admins. Positive test1938#[test]1939fn collection_admins_bound() {1940	new_test_ext().execute_with(|| {1941		assert_ok!(TemplateModule::set_chain_limits(1942			RawOrigin::Root.into(),1943			ChainLimits {1944				collection_numbers_limit: 10,1945				account_token_ownership_limit: 10,1946				collections_admins_limit: 2,1947				custom_data_limit: 2048,1948				nft_sponsor_transfer_timeout: 15,1949				fungible_sponsor_transfer_timeout: 15,1950				refungible_sponsor_transfer_timeout: 15,1951				const_on_chain_schema_limit: 1024,1952				offchain_schema_limit: 1024,1953				variable_on_chain_schema_limit: 1024,1954			}1955		));19561957		let collection_id = create_test_collection(&CollectionMode::NFT, 1);19581959		let origin1 = Origin::signed(1);19601961		assert_ok!(TemplateModule::add_collection_admin(1962			origin1.clone(),1963			collection_id,1964			account(2)1965		));1966		assert_ok!(TemplateModule::add_collection_admin(1967			origin1,1968			collection_id,1969			account(3)1970		));1971	});1972}19731974// Number of collection admins. Negotive test1975#[test]1976fn collection_admins_bound_neg() {1977	new_test_ext().execute_with(|| {1978		assert_ok!(TemplateModule::set_chain_limits(1979			RawOrigin::Root.into(),1980			ChainLimits {1981				collection_numbers_limit: 10,1982				account_token_ownership_limit: 1,1983				collections_admins_limit: 1,1984				custom_data_limit: 2048,1985				nft_sponsor_transfer_timeout: 15,1986				fungible_sponsor_transfer_timeout: 15,1987				refungible_sponsor_transfer_timeout: 15,1988				const_on_chain_schema_limit: 1024,1989				offchain_schema_limit: 1024,1990				variable_on_chain_schema_limit: 1024,1991			}1992		));19931994		let collection_id = create_test_collection(&CollectionMode::NFT, 1);19951996		let origin1 = Origin::signed(1);19971998		assert_ok!(TemplateModule::add_collection_admin(1999			origin1.clone(),2000			collection_id,2001			account(2)2002		));2003		assert_noop!(2004			TemplateModule::add_collection_admin(origin1, collection_id, account(3)),2005			Error::<Test>::CollectionAdminsLimitExceeded2006		);2007	});2008}20092010// NFT custom data size. Negative test const_data.2011#[test]2012fn custom_data_size_nft_const_data_bound_neg() {2013	new_test_ext().execute_with(|| {2014		assert_ok!(TemplateModule::set_chain_limits(2015			RawOrigin::Root.into(),2016			ChainLimits {2017				collection_numbers_limit: 10,2018				account_token_ownership_limit: 10,2019				collections_admins_limit: 5,2020				custom_data_limit: 2,2021				nft_sponsor_transfer_timeout: 15,2022				fungible_sponsor_transfer_timeout: 15,2023				refungible_sponsor_transfer_timeout: 15,2024				const_on_chain_schema_limit: 1024,2025				offchain_schema_limit: 1024,2026				variable_on_chain_schema_limit: 1024,2027			}2028		));20292030		let collection_id = create_test_collection(&CollectionMode::NFT, 1);20312032		let origin1 = Origin::signed(1);2033		let too_big_const_data = CreateItemData::NFT(CreateNftData {2034			const_data: vec![1, 2, 3, 4],2035			variable_data: vec![],2036		});20372038		assert_noop!(2039			TemplateModule::create_item(origin1, collection_id, account(1), too_big_const_data),2040			Error::<Test>::TokenConstDataLimitExceeded2041		);2042	});2043}20442045// NFT custom data size. Negative test variable_data.2046#[test]2047fn custom_data_size_nft_variable_data_bound_neg() {2048	new_test_ext().execute_with(|| {2049		assert_ok!(TemplateModule::set_chain_limits(2050			RawOrigin::Root.into(),2051			ChainLimits {2052				collection_numbers_limit: 10,2053				account_token_ownership_limit: 10,2054				collections_admins_limit: 5,2055				custom_data_limit: 2,2056				nft_sponsor_transfer_timeout: 15,2057				fungible_sponsor_transfer_timeout: 15,2058				refungible_sponsor_transfer_timeout: 15,2059				const_on_chain_schema_limit: 1024,2060				offchain_schema_limit: 1024,2061				variable_on_chain_schema_limit: 1024,2062			}2063		));20642065		let collection_id = create_test_collection(&CollectionMode::NFT, 1);20662067		let origin1 = Origin::signed(1);2068		let too_big_const_data = CreateItemData::NFT(CreateNftData {2069			const_data: vec![],2070			variable_data: vec![1, 2, 3, 4],2071		});20722073		assert_noop!(2074			TemplateModule::create_item(origin1, collection_id, account(1), too_big_const_data),2075			Error::<Test>::TokenVariableDataLimitExceeded2076		);2077	});2078}20792080// Re fungible custom data size. Negative test const_data.2081#[test]2082fn custom_data_size_re_fungible_const_data_bound_neg() {2083	new_test_ext().execute_with(|| {2084		assert_ok!(TemplateModule::set_chain_limits(2085			RawOrigin::Root.into(),2086			ChainLimits {2087				collection_numbers_limit: 10,2088				account_token_ownership_limit: 10,2089				collections_admins_limit: 5,2090				custom_data_limit: 2,2091				nft_sponsor_transfer_timeout: 15,2092				fungible_sponsor_transfer_timeout: 15,2093				refungible_sponsor_transfer_timeout: 15,2094				const_on_chain_schema_limit: 1024,2095				offchain_schema_limit: 1024,2096				variable_on_chain_schema_limit: 1024,2097			}2098		));20992100		let collection_id = create_test_collection(&CollectionMode::NFT, 1);21012102		let origin1 = Origin::signed(1);2103		let too_big_const_data = CreateItemData::NFT(CreateNftData {2104			const_data: vec![1, 2, 3, 4],2105			variable_data: vec![],2106		});21072108		assert_noop!(2109			TemplateModule::create_item(origin1, collection_id, account(1), too_big_const_data),2110			Error::<Test>::TokenConstDataLimitExceeded2111		);2112	});2113}21142115// Re fungible custom data size. Negative test variable_data.2116#[test]2117fn custom_data_size_re_fungible_variable_data_bound_neg() {2118	new_test_ext().execute_with(|| {2119		assert_ok!(TemplateModule::set_chain_limits(2120			RawOrigin::Root.into(),2121			ChainLimits {2122				collection_numbers_limit: 10,2123				account_token_ownership_limit: 10,2124				collections_admins_limit: 5,2125				custom_data_limit: 2,2126				nft_sponsor_transfer_timeout: 15,2127				fungible_sponsor_transfer_timeout: 15,2128				refungible_sponsor_transfer_timeout: 15,2129				const_on_chain_schema_limit: 1024,2130				offchain_schema_limit: 1024,2131				variable_on_chain_schema_limit: 1024,2132			}2133		));21342135		let collection_id = create_test_collection(&CollectionMode::NFT, 1);21362137		let origin1 = Origin::signed(1);2138		let too_big_const_data = CreateItemData::NFT(CreateNftData {2139			const_data: vec![],2140			variable_data: vec![1, 2, 3, 4],2141		});21422143		assert_noop!(2144			TemplateModule::create_item(origin1, collection_id, account(1), too_big_const_data),2145			Error::<Test>::TokenVariableDataLimitExceeded2146		);2147	});2148}2149// #endregion21502151#[test]2152fn set_const_on_chain_schema() {2153	new_test_ext().execute_with(|| {2154		default_limits();21552156		let collection_id = create_test_collection(&CollectionMode::NFT, 1);21572158		let origin1 = Origin::signed(1);2159		assert_ok!(TemplateModule::set_const_on_chain_schema(2160			origin1,2161			collection_id,2162			b"test const on chain schema".to_vec()2163		));21642165		assert_eq!(2166			TemplateModule::collection_id(collection_id)2167				.unwrap()2168				.const_on_chain_schema,2169			b"test const on chain schema".to_vec()2170		);2171		assert_eq!(2172			TemplateModule::collection_id(collection_id)2173				.unwrap()2174				.variable_on_chain_schema,2175			b"".to_vec()2176		);2177	});2178}21792180#[test]2181fn set_variable_on_chain_schema() {2182	new_test_ext().execute_with(|| {2183		default_limits();21842185		let collection_id = create_test_collection(&CollectionMode::NFT, 1);21862187		let origin1 = Origin::signed(1);2188		assert_ok!(TemplateModule::set_variable_on_chain_schema(2189			origin1,2190			collection_id,2191			b"test variable on chain schema".to_vec()2192		));21932194		assert_eq!(2195			TemplateModule::collection_id(collection_id)2196				.unwrap()2197				.const_on_chain_schema,2198			b"".to_vec()2199		);2200		assert_eq!(2201			TemplateModule::collection_id(collection_id)2202				.unwrap()2203				.variable_on_chain_schema,2204			b"test variable on chain schema".to_vec()2205		);2206	});2207}22082209#[test]2210fn set_variable_meta_data_on_nft_token_stores_variable_meta_data() {2211	new_test_ext().execute_with(|| {2212		default_limits();22132214		let collection_id = create_test_collection(&CollectionMode::NFT, 1);22152216		let origin1 = Origin::signed(1);22172218		let data = default_nft_data();2219		create_test_item(1, &data.into());22202221		let variable_data = b"test set_variable_meta_data method.".to_vec();2222		assert_ok!(TemplateModule::set_variable_meta_data(2223			origin1,2224			collection_id,2225			1,2226			variable_data.clone()2227		));22282229		assert_eq!(2230			TemplateModule::nft_item_id(collection_id, 1)2231				.unwrap()2232				.variable_data,2233			variable_data2234		);2235	});2236}22372238#[test]2239fn set_variable_meta_data_on_re_fungible_token_stores_variable_meta_data() {2240	new_test_ext().execute_with(|| {2241		default_limits();22422243		let collection_id = create_test_collection(&CollectionMode::ReFungible, 1);22442245		let origin1 = Origin::signed(1);22462247		let data = default_re_fungible_data();2248		create_test_item(1, &data.into());22492250		let variable_data = b"test set_variable_meta_data method.".to_vec();2251		assert_ok!(TemplateModule::set_variable_meta_data(2252			origin1,2253			collection_id,2254			1,2255			variable_data.clone()2256		));22572258		assert_eq!(2259			TemplateModule::refungible_item_id(collection_id, 1)2260				.unwrap()2261				.variable_data,2262			variable_data2263		);2264	});2265}22662267#[test]2268fn set_variable_meta_data_on_fungible_token_fails() {2269	new_test_ext().execute_with(|| {2270		default_limits();22712272		let collection_id = create_test_collection(&CollectionMode::Fungible(3), 1);22732274		let origin1 = Origin::signed(1);22752276		let data = default_fungible_data();2277		create_test_item(1, &data.into());22782279		let variable_data = b"test set_variable_meta_data method.".to_vec();2280		assert_noop!(2281			TemplateModule::set_variable_meta_data(origin1, collection_id, 1, variable_data),2282			Error::<Test>::CantStoreMetadataInFungibleTokens2283		);2284	});2285}22862287#[test]2288fn set_variable_meta_data_on_nft_token_fails_for_big_data() {2289	new_test_ext().execute_with(|| {2290		assert_ok!(TemplateModule::set_chain_limits(2291			RawOrigin::Root.into(),2292			ChainLimits {2293				collection_numbers_limit: default_collection_numbers_limit(),2294				account_token_ownership_limit: 10,2295				collections_admins_limit: 5,2296				custom_data_limit: 10,2297				nft_sponsor_transfer_timeout: 15,2298				fungible_sponsor_transfer_timeout: 15,2299				refungible_sponsor_transfer_timeout: 15,2300				const_on_chain_schema_limit: 1024,2301				offchain_schema_limit: 1024,2302				variable_on_chain_schema_limit: 1024,2303			}2304		));23052306		let collection_id = create_test_collection(&CollectionMode::NFT, 1);23072308		let origin1 = Origin::signed(1);23092310		let data = default_nft_data();2311		create_test_item(1, &data.into());23122313		let variable_data = b"test set_variable_meta_data method, bigger than limits.".to_vec();2314		assert_noop!(2315			TemplateModule::set_variable_meta_data(origin1, collection_id, 1, variable_data),2316			Error::<Test>::TokenVariableDataLimitExceeded2317		);2318	});2319}23202321#[test]2322fn set_variable_meta_data_on_re_fungible_token_fails_for_big_data() {2323	new_test_ext().execute_with(|| {2324		assert_ok!(TemplateModule::set_chain_limits(2325			RawOrigin::Root.into(),2326			ChainLimits {2327				collection_numbers_limit: default_collection_numbers_limit(),2328				account_token_ownership_limit: 10,2329				collections_admins_limit: 5,2330				custom_data_limit: 10,2331				nft_sponsor_transfer_timeout: 15,2332				fungible_sponsor_transfer_timeout: 15,2333				refungible_sponsor_transfer_timeout: 15,2334				const_on_chain_schema_limit: 1024,2335				offchain_schema_limit: 1024,2336				variable_on_chain_schema_limit: 1024,2337			}2338		));23392340		let collection_id = create_test_collection(&CollectionMode::ReFungible, 1);23412342		let origin1 = Origin::signed(1);23432344		let data = default_re_fungible_data();2345		create_test_item(1, &data.into());23462347		let variable_data = b"test set_variable_meta_data method, bigger than limits.".to_vec();2348		assert_noop!(2349			TemplateModule::set_variable_meta_data(origin1, collection_id, 1, variable_data),2350			Error::<Test>::TokenVariableDataLimitExceeded2351		);2352	});2353}
after · pallets/nft/src/tests.rs
1// Tests to be written here2use super::*;3use crate::mock::*;4use crate::{AccessMode, CollectionMode, Ownership, ChainLimits, CreateItemData};5use nft_data_structs::{6	CreateNftData, CreateFungibleData, CreateReFungibleData, CollectionId, TokenId,7	MAX_DECIMAL_POINTS,8};9use frame_support::{assert_noop, assert_ok};10use frame_system::{RawOrigin};1112fn default_collection_numbers_limit() -> u32 {13	1014}1516fn default_limits() {17	assert_ok!(TemplateModule::set_chain_limits(18		RawOrigin::Root.into(),19		ChainLimits {20			collection_numbers_limit: default_collection_numbers_limit(),21			account_token_ownership_limit: 10,22			collections_admins_limit: 5,23			custom_data_limit: 2048,24			nft_sponsor_transfer_timeout: 15,25			fungible_sponsor_transfer_timeout: 15,26			refungible_sponsor_transfer_timeout: 15,27			const_on_chain_schema_limit: 1024,28			offchain_schema_limit: 1024,29			variable_on_chain_schema_limit: 1024,30		}31	));32}3334fn default_nft_data() -> CreateNftData {35	CreateNftData {36		const_data: vec![1, 2, 3],37		variable_data: vec![3, 2, 1],38	}39}4041fn default_fungible_data() -> CreateFungibleData {42	CreateFungibleData { value: 5 }43}4445fn default_re_fungible_data() -> CreateReFungibleData {46	CreateReFungibleData {47		const_data: vec![1, 2, 3],48		variable_data: vec![3, 2, 1],49		pieces: 1023,50	}51}5253fn create_test_collection_for_owner(54	mode: &CollectionMode,55	owner: u64,56	id: CollectionId,57) -> CollectionId {58	let col_name1: Vec<u16> = "Test1\0".encode_utf16().collect::<Vec<u16>>();59	let col_desc1: Vec<u16> = "TestDescription1\0".encode_utf16().collect::<Vec<u16>>();60	let token_prefix1: Vec<u8> = b"token_prefix1\0".to_vec();6162	let origin1 = Origin::signed(owner);63	assert_ok!(TemplateModule::create_collection(64		origin1,65		col_name1,66		col_desc1,67		token_prefix1,68		mode.clone()69	));7071	let saved_col_name: Vec<u16> = "Test1\0".encode_utf16().collect::<Vec<u16>>();72	let saved_description: Vec<u16> = "TestDescription1\0".encode_utf16().collect::<Vec<u16>>();73	let saved_prefix: Vec<u8> = b"token_prefix1\0".to_vec();74	assert_eq!(TemplateModule::collection_id(id).unwrap().owner, owner);75	assert_eq!(76		TemplateModule::collection_id(id).unwrap().name,77		saved_col_name78	);79	assert_eq!(TemplateModule::collection_id(id).unwrap().mode, *mode);80	assert_eq!(81		TemplateModule::collection_id(id).unwrap().description,82		saved_description83	);84	assert_eq!(85		TemplateModule::collection_id(id).unwrap().token_prefix,86		saved_prefix87	);88	id89}9091fn create_test_collection(mode: &CollectionMode, id: CollectionId) -> CollectionId {92	create_test_collection_for_owner(&mode, 1, id)93}9495fn create_test_item(collection_id: CollectionId, data: &CreateItemData) {96	let origin1 = Origin::signed(1);97	assert_ok!(TemplateModule::create_item(98		origin1,99		collection_id,100		account(1),101		data.clone()102	));103}104105fn account(sub: u64) -> TestCrossAccountId {106	TestCrossAccountId::from_sub(sub)107}108109// Use cases tests region110// #region111112#[test]113fn set_version_schema() {114	new_test_ext().execute_with(|| {115		default_limits();116		let origin1 = Origin::signed(1);117		let collection_id = create_test_collection(&CollectionMode::NFT, 1);118119		assert_ok!(TemplateModule::set_schema_version(120			origin1,121			collection_id,122			SchemaVersion::Unique123		));124		assert_eq!(125			TemplateModule::collection_id(collection_id)126				.unwrap()127				.schema_version,128			SchemaVersion::Unique129		);130	});131}132133#[test]134fn create_fungible_collection_fails_with_large_decimal_numbers() {135	new_test_ext().execute_with(|| {136		default_limits();137138		let col_name1: Vec<u16> = "Test1\0".encode_utf16().collect::<Vec<u16>>();139		let col_desc1: Vec<u16> = "TestDescription1\0".encode_utf16().collect::<Vec<u16>>();140		let token_prefix1: Vec<u8> = b"token_prefix1\0".to_vec();141142		let origin1 = Origin::signed(1);143		assert_noop!(144			TemplateModule::create_collection(145				origin1,146				col_name1,147				col_desc1,148				token_prefix1,149				CollectionMode::Fungible(MAX_DECIMAL_POINTS + 1)150			),151			Error::<Test>::CollectionDecimalPointLimitExceeded152		);153	});154}155156#[test]157fn create_nft_item() {158	new_test_ext().execute_with(|| {159		default_limits();160		let collection_id = create_test_collection(&CollectionMode::NFT, 1);161162		let data = default_nft_data();163		create_test_item(collection_id, &data.clone().into());164		let item = TemplateModule::nft_item_id(collection_id, 1).unwrap();165		assert_eq!(item.const_data, data.const_data);166		assert_eq!(item.variable_data, data.variable_data);167	});168}169170// Use cases tests region171// #region172#[test]173fn create_nft_multiple_items() {174	new_test_ext().execute_with(|| {175		default_limits();176177		create_test_collection(&CollectionMode::NFT, 1);178179		let origin1 = Origin::signed(1);180181		let items_data = vec![default_nft_data(), default_nft_data(), default_nft_data()];182183		assert_ok!(TemplateModule::create_multiple_items(184			origin1,185			1,186			account(1),187			items_data188				.clone()189				.into_iter()190				.map(|d| { d.into() })191				.collect()192		));193		for (index, data) in items_data.iter().enumerate() {194			let item = TemplateModule::nft_item_id(1, (index + 1) as TokenId).unwrap();195			assert_eq!(item.const_data.to_vec(), data.const_data);196			assert_eq!(item.variable_data.to_vec(), data.variable_data);197		}198	});199}200201#[test]202fn create_refungible_item() {203	new_test_ext().execute_with(|| {204		default_limits();205		let collection_id = create_test_collection(&CollectionMode::ReFungible, 1);206207		let data = default_re_fungible_data();208		create_test_item(collection_id, &data.clone().into());209		let item = TemplateModule::refungible_item_id(collection_id, 1).unwrap();210		assert_eq!(item.const_data, data.const_data);211		assert_eq!(item.variable_data, data.variable_data);212		assert_eq!(213			item.owner[0],214			Ownership {215				owner: account(1),216				fraction: 1023217			}218		);219	});220}221222#[test]223fn create_multiple_refungible_items() {224	new_test_ext().execute_with(|| {225		default_limits();226227		create_test_collection(&CollectionMode::ReFungible, 1);228229		let origin1 = Origin::signed(1);230231		let items_data = vec![232			default_re_fungible_data(),233			default_re_fungible_data(),234			default_re_fungible_data(),235		];236237		assert_ok!(TemplateModule::create_multiple_items(238			origin1,239			1,240			account(1),241			items_data242				.clone()243				.into_iter()244				.map(|d| { d.into() })245				.collect()246		));247		for (index, data) in items_data.iter().enumerate() {248			let item = TemplateModule::refungible_item_id(1, (index + 1) as TokenId).unwrap();249			assert_eq!(item.const_data.to_vec(), data.const_data);250			assert_eq!(item.variable_data.to_vec(), data.variable_data);251			assert_eq!(252				item.owner[0],253				Ownership {254					owner: account(1),255					fraction: 1023256				}257			);258		}259	});260}261262#[test]263fn create_fungible_item() {264	new_test_ext().execute_with(|| {265		default_limits();266267		let collection_id = create_test_collection(&CollectionMode::Fungible(3), 1);268269		let data = default_fungible_data();270		create_test_item(collection_id, &data.into());271272		assert_eq!(TemplateModule::fungible_item_id(collection_id, 1).value, 5);273	});274}275276//#[test]277// fn create_multiple_fungible_items() {278//     new_test_ext().execute_with(|| {279//         default_limits();280281//         create_test_collection(&CollectionMode::Fungible(3), 1);282283//         let origin1 = Origin::signed(1);284285//         let items_data = vec![default_fungible_data(), default_fungible_data(), default_fungible_data()];286287//         assert_ok!(TemplateModule::create_multiple_items(288//             origin1.clone(),289//             1,290//             1,291//             items_data.clone().into_iter().map(|d| { d.into() }).collect()292//         ));293294//         for (index, _) in items_data.iter().enumerate() {295//             assert_eq!(TemplateModule::fungible_item_id(1, (index + 1) as TokenId).value, 5);296//         }297//         assert_eq!(TemplateModule::balance_count(1, 1), 3000);298//         assert_eq!(TemplateModule::address_tokens(1, 1), [1, 2, 3]);299//     });300// }301302#[test]303fn transfer_fungible_item() {304	new_test_ext().execute_with(|| {305		default_limits();306307		let collection_id = create_test_collection(&CollectionMode::Fungible(3), 1);308309		let origin1 = Origin::signed(1);310		let origin2 = Origin::signed(2);311312		let data = default_fungible_data();313		create_test_item(collection_id, &data.into());314315		assert_eq!(TemplateModule::fungible_item_id(1, 1).value, 5);316		assert_eq!(TemplateModule::balance_count(1, 1), 5);317318		// change owner scenario319		assert_ok!(TemplateModule::transfer(origin1, account(2), 1, 1, 5));320		assert_eq!(TemplateModule::fungible_item_id(1, 1).value, 0);321		assert_eq!(TemplateModule::balance_count(1, 1), 0);322		assert_eq!(TemplateModule::balance_count(1, 2), 5);323324		// split item scenario325		assert_ok!(TemplateModule::transfer(326			origin2.clone(),327			account(3),328			1,329			1,330			3331		));332		assert_eq!(TemplateModule::balance_count(1, 2), 2);333		assert_eq!(TemplateModule::balance_count(1, 3), 3);334335		// split item and new owner has account scenario336		assert_ok!(TemplateModule::transfer(origin2, account(3), 1, 1, 1));337		assert_eq!(TemplateModule::fungible_item_id(1, 2).value, 1);338		assert_eq!(TemplateModule::fungible_item_id(1, 3).value, 4);339		assert_eq!(TemplateModule::balance_count(1, 2), 1);340		assert_eq!(TemplateModule::balance_count(1, 3), 4);341	});342}343344#[test]345fn transfer_refungible_item() {346	new_test_ext().execute_with(|| {347		default_limits();348349		let collection_id = create_test_collection(&CollectionMode::ReFungible, 1);350351		let data = default_re_fungible_data();352		create_test_item(collection_id, &data.clone().into());353354		let origin1 = Origin::signed(1);355		let origin2 = Origin::signed(2);356		{357			let item = TemplateModule::refungible_item_id(collection_id, 1).unwrap();358			assert_eq!(item.const_data, data.const_data);359			assert_eq!(item.variable_data, data.variable_data);360			assert_eq!(361				item.owner[0],362				Ownership {363					owner: account(1),364					fraction: 1023365				}366			);367		}368		assert_eq!(TemplateModule::balance_count(1, 1), 1023);369		assert_eq!(TemplateModule::address_tokens(1, 1), [1]);370371		// change owner scenario372		assert_ok!(TemplateModule::transfer(origin1, account(2), 1, 1, 1023));373		assert_eq!(374			TemplateModule::refungible_item_id(1, 1).unwrap().owner[0],375			Ownership {376				owner: account(2),377				fraction: 1023378			}379		);380		assert_eq!(TemplateModule::balance_count(1, 1), 0);381		assert_eq!(TemplateModule::balance_count(1, 2), 1023);382		// assert_eq!(TemplateModule::address_tokens(1, 1), []);383		assert_eq!(TemplateModule::address_tokens(1, 2), [1]);384385		// split item scenario386		assert_ok!(TemplateModule::transfer(387			origin2.clone(),388			account(3),389			1,390			1,391			500392		));393		{394			let item = TemplateModule::refungible_item_id(1, 1).unwrap();395			assert_eq!(396				item.owner[0],397				Ownership {398					owner: account(2),399					fraction: 523400				}401			);402			assert_eq!(403				item.owner[1],404				Ownership {405					owner: account(3),406					fraction: 500407				}408			);409		}410		assert_eq!(TemplateModule::balance_count(1, 2), 523);411		assert_eq!(TemplateModule::balance_count(1, 3), 500);412		assert_eq!(TemplateModule::address_tokens(1, 2), [1]);413		assert_eq!(TemplateModule::address_tokens(1, 3), [1]);414415		// split item and new owner has account scenario416		assert_ok!(TemplateModule::transfer(origin2, account(3), 1, 1, 200));417		{418			let item = TemplateModule::refungible_item_id(1, 1).unwrap();419			assert_eq!(420				item.owner[0],421				Ownership {422					owner: account(2),423					fraction: 323424				}425			);426			assert_eq!(427				item.owner[1],428				Ownership {429					owner: account(3),430					fraction: 700431				}432			);433		}434		assert_eq!(TemplateModule::balance_count(1, 2), 323);435		assert_eq!(TemplateModule::balance_count(1, 3), 700);436		assert_eq!(TemplateModule::address_tokens(1, 2), [1]);437		assert_eq!(TemplateModule::address_tokens(1, 3), [1]);438	});439}440441#[test]442fn transfer_nft_item() {443	new_test_ext().execute_with(|| {444		default_limits();445446		let collection_id = create_test_collection(&CollectionMode::NFT, 1);447448		let data = default_nft_data();449		create_test_item(collection_id, &data.into());450		assert_eq!(TemplateModule::balance_count(1, 1), 1);451		assert_eq!(TemplateModule::address_tokens(1, 1), [1]);452453		let origin1 = Origin::signed(1);454		// default scenario455		assert_ok!(TemplateModule::transfer(origin1, account(2), 1, 1, 1000));456		assert_eq!(TemplateModule::nft_item_id(1, 1).unwrap().owner, account(2));457		assert_eq!(TemplateModule::balance_count(1, 1), 0);458		assert_eq!(TemplateModule::balance_count(1, 2), 1);459		// assert_eq!(TemplateModule::address_tokens(1, 1), []);460		assert_eq!(TemplateModule::address_tokens(1, 2), [1]);461	});462}463464#[test]465fn nft_approve_and_transfer_from() {466	new_test_ext().execute_with(|| {467		default_limits();468469		let collection_id = create_test_collection(&CollectionMode::NFT, 1);470471		let data = default_nft_data();472		create_test_item(collection_id, &data.into());473474		let origin1 = Origin::signed(1);475		let origin2 = Origin::signed(2);476477		assert_eq!(TemplateModule::balance_count(1, 1), 1);478		assert_eq!(TemplateModule::address_tokens(1, 1), [1]);479480		// neg transfer481		assert_noop!(482			TemplateModule::transfer_from(origin2.clone(), account(1), account(2), 1, 1, 1),483			Error::<Test>::NoPermission484		);485486		// do approve487		assert_ok!(TemplateModule::approve(origin1, account(2), 1, 1, 5));488		assert_eq!(TemplateModule::approved(1, (1, 1, 2)), 5);489		assert_eq!(TemplateModule::approved(1, (1, 1, 2)), 5);490491		assert_ok!(TemplateModule::transfer_from(492			origin2,493			account(1),494			account(3),495			1,496			1,497			1498		));499		assert_eq!(TemplateModule::approved(1, (1, 1, 2)), 4);500	});501}502503#[test]504fn nft_approve_and_transfer_from_white_list() {505	new_test_ext().execute_with(|| {506		default_limits();507508		let collection_id = create_test_collection(&CollectionMode::NFT, 1);509510		let origin1 = Origin::signed(1);511		let origin2 = Origin::signed(2);512513		let data = default_nft_data();514		create_test_item(collection_id, &data.clone().into());515516		assert_eq!(517			TemplateModule::nft_item_id(1, 1).unwrap().const_data,518			data.const_data519		);520		assert_eq!(TemplateModule::balance_count(1, 1), 1);521		assert_eq!(TemplateModule::address_tokens(1, 1), [1]);522523		assert_ok!(TemplateModule::set_mint_permission(524			origin1.clone(),525			1,526			true527		));528		assert_ok!(TemplateModule::set_public_access_mode(529			origin1.clone(),530			1,531			AccessMode::WhiteList532		));533		assert_ok!(TemplateModule::add_to_white_list(534			origin1.clone(),535			1,536			account(1)537		));538		assert_ok!(TemplateModule::add_to_white_list(539			origin1.clone(),540			1,541			account(2)542		));543		assert_ok!(TemplateModule::add_to_white_list(544			origin1.clone(),545			1,546			account(3)547		));548549		// do approve550		assert_ok!(TemplateModule::approve(551			origin1.clone(),552			account(2),553			1,554			1,555			5556		));557		assert_eq!(TemplateModule::approved(1, (1, 1, 2)), 5);558		assert_ok!(TemplateModule::approve(origin1, account(3), 1, 1, 5));559		assert_eq!(TemplateModule::approved(1, (1, 1, 3)), 5);560561		assert_ok!(TemplateModule::transfer_from(562			origin2,563			account(1),564			account(3),565			1,566			1,567			1568		));569		assert_eq!(TemplateModule::approved(1, (1, 1, 2)), 4);570	});571}572573#[test]574fn refungible_approve_and_transfer_from() {575	new_test_ext().execute_with(|| {576		default_limits();577578		let collection_id = create_test_collection(&CollectionMode::ReFungible, 1);579580		let origin1 = Origin::signed(1);581		let origin2 = Origin::signed(2);582583		let data = default_re_fungible_data();584		create_test_item(collection_id, &data.into());585586		assert_eq!(TemplateModule::balance_count(1, 1), 1023);587		assert_eq!(TemplateModule::address_tokens(1, 1), [1]);588589		assert_ok!(TemplateModule::set_mint_permission(590			origin1.clone(),591			1,592			true593		));594		assert_ok!(TemplateModule::set_public_access_mode(595			origin1.clone(),596			1,597			AccessMode::WhiteList598		));599		assert_ok!(TemplateModule::add_to_white_list(600			origin1.clone(),601			1,602			account(1)603		));604		assert_ok!(TemplateModule::add_to_white_list(605			origin1.clone(),606			1,607			account(2)608		));609		assert_ok!(TemplateModule::add_to_white_list(610			origin1.clone(),611			1,612			account(3)613		));614615		// do approve616		assert_ok!(TemplateModule::approve(origin1, account(2), 1, 1, 1023));617		assert_eq!(TemplateModule::approved(1, (1, 1, 2)), 1023);618619		assert_ok!(TemplateModule::transfer_from(620			origin2,621			account(1),622			account(3),623			1,624			1,625			100626		));627		assert_eq!(TemplateModule::balance_count(1, 1), 923);628		assert_eq!(TemplateModule::balance_count(1, 3), 100);629		assert_eq!(TemplateModule::address_tokens(1, 1), [1]);630		assert_eq!(TemplateModule::address_tokens(1, 3), [1]);631632		assert_eq!(TemplateModule::approved(1, (1, 1, 2)), 923);633	});634}635636#[test]637fn fungible_approve_and_transfer_from() {638	new_test_ext().execute_with(|| {639		default_limits();640641		let collection_id = create_test_collection(&CollectionMode::Fungible(3), 1);642643		let data = default_fungible_data();644		create_test_item(collection_id, &data.into());645646		let origin1 = Origin::signed(1);647		let origin2 = Origin::signed(2);648649		assert_eq!(TemplateModule::balance_count(1, 1), 5);650651		assert_ok!(TemplateModule::set_mint_permission(652			origin1.clone(),653			1,654			true655		));656		assert_ok!(TemplateModule::set_public_access_mode(657			origin1.clone(),658			1,659			AccessMode::WhiteList660		));661		assert_ok!(TemplateModule::add_to_white_list(662			origin1.clone(),663			1,664			account(1)665		));666		assert_ok!(TemplateModule::add_to_white_list(667			origin1.clone(),668			1,669			account(2)670		));671		assert_ok!(TemplateModule::add_to_white_list(672			origin1.clone(),673			1,674			account(3)675		));676677		// do approve678		assert_ok!(TemplateModule::approve(679			origin1.clone(),680			account(2),681			1,682			1,683			5684		));685		assert_eq!(TemplateModule::approved(1, (1, 1, 2)), 5);686		assert_ok!(TemplateModule::approve(origin1, account(3), 1, 1, 5));687		assert_eq!(TemplateModule::approved(1, (1, 1, 3)), 5);688		assert_eq!(TemplateModule::approved(1, (1, 1, 2)), 5);689690		assert_ok!(TemplateModule::transfer_from(691			origin2.clone(),692			account(1),693			account(3),694			1,695			1,696			4697		));698		assert_eq!(TemplateModule::balance_count(1, 1), 1);699		assert_eq!(TemplateModule::balance_count(1, 3), 4);700701		assert_eq!(TemplateModule::approved(1, (1, 1, 2)), 1);702703		assert_noop!(704			TemplateModule::transfer_from(origin2, account(1), account(3), 1, 1, 4),705			Error::<Test>::NoPermission706		);707	});708}709710#[test]711fn change_collection_owner() {712	new_test_ext().execute_with(|| {713		default_limits();714715		let collection_id = create_test_collection(&CollectionMode::NFT, 1);716717		let origin1 = Origin::signed(1);718		assert_ok!(TemplateModule::change_collection_owner(719			origin1,720			collection_id,721			2722		));723		assert_eq!(724			TemplateModule::collection_id(collection_id).unwrap().owner,725			2726		);727	});728}729730#[test]731fn destroy_collection() {732	new_test_ext().execute_with(|| {733		default_limits();734735		let collection_id = create_test_collection(&CollectionMode::NFT, 1);736737		let origin1 = Origin::signed(1);738		assert_ok!(TemplateModule::destroy_collection(origin1, collection_id));739	});740}741742#[test]743fn burn_nft_item() {744	new_test_ext().execute_with(|| {745		default_limits();746747		let collection_id = create_test_collection(&CollectionMode::NFT, 1);748749		let origin1 = Origin::signed(1);750		assert_ok!(TemplateModule::add_collection_admin(751			origin1.clone(),752			collection_id,753			account(2)754		));755756		let data = default_nft_data();757		create_test_item(collection_id, &data.into());758759		// check balance (collection with id = 1, user id = 1)760		assert_eq!(TemplateModule::balance_count(1, 1), 1);761762		// burn item763		assert_ok!(TemplateModule::burn_item(origin1.clone(), 1, 1, 5));764		assert_noop!(765			TemplateModule::burn_item(origin1, 1, 1, 5),766			Error::<Test>::TokenNotFound767		);768769		assert_eq!(TemplateModule::balance_count(1, 1), 0);770	});771}772773#[test]774fn burn_fungible_item() {775	new_test_ext().execute_with(|| {776		default_limits();777778		let collection_id = create_test_collection(&CollectionMode::Fungible(3), 1);779780		let origin1 = Origin::signed(1);781		assert_ok!(TemplateModule::add_collection_admin(782			origin1.clone(),783			collection_id,784			account(2)785		));786787		let data = default_fungible_data();788		create_test_item(collection_id, &data.into());789790		// check balance (collection with id = 1, user id = 1)791		assert_eq!(TemplateModule::balance_count(1, 1), 5);792793		// burn item794		assert_ok!(TemplateModule::burn_item(origin1.clone(), 1, 1, 5));795		assert_noop!(796			TemplateModule::burn_item(origin1, 1, 1, 5),797			Error::<Test>::TokenValueNotEnough798		);799800		assert_eq!(TemplateModule::balance_count(1, 1), 0);801	});802}803804#[test]805fn burn_refungible_item() {806	new_test_ext().execute_with(|| {807		default_limits();808809		let collection_id = create_test_collection(&CollectionMode::ReFungible, 1);810		let origin1 = Origin::signed(1);811812		assert_ok!(TemplateModule::set_mint_permission(813			origin1.clone(),814			collection_id,815			true816		));817		assert_ok!(TemplateModule::set_public_access_mode(818			origin1.clone(),819			collection_id,820			AccessMode::WhiteList821		));822		assert_ok!(TemplateModule::add_to_white_list(823			origin1.clone(),824			1,825			account(1)826		));827828		assert_ok!(TemplateModule::add_collection_admin(829			origin1.clone(),830			1,831			account(2)832		));833834		let data = default_re_fungible_data();835		create_test_item(collection_id, &data.into());836837		// check balance (collection with id = 1, user id = 2)838		assert_eq!(TemplateModule::balance_count(1, 1), 1023);839840		// burn item841		assert_ok!(TemplateModule::burn_item(origin1.clone(), 1, 1, 1023));842		assert_noop!(843			TemplateModule::burn_item(origin1, 1, 1, 1023),844			Error::<Test>::TokenNotFound845		);846847		assert_eq!(TemplateModule::balance_count(1, 1), 0);848	});849}850851#[test]852fn add_collection_admin() {853	new_test_ext().execute_with(|| {854		default_limits();855856		let collection1_id = create_test_collection_for_owner(&CollectionMode::NFT, 1, 1);857		create_test_collection_for_owner(&CollectionMode::NFT, 2, 2);858		create_test_collection_for_owner(&CollectionMode::NFT, 3, 3);859860		let origin1 = Origin::signed(1);861862		// collection admin863		assert_ok!(TemplateModule::add_collection_admin(864			origin1.clone(),865			collection1_id,866			account(2)867		));868		assert_ok!(TemplateModule::add_collection_admin(869			origin1,870			collection1_id,871			account(3)872		));873874		assert!(TemplateModule::admin_list_collection(collection1_id).contains(&account(2)),);875		assert!(TemplateModule::admin_list_collection(collection1_id).contains(&account(3)),);876	});877}878879#[test]880fn remove_collection_admin() {881	new_test_ext().execute_with(|| {882		default_limits();883884		let collection1_id = create_test_collection_for_owner(&CollectionMode::NFT, 1, 1);885		create_test_collection_for_owner(&CollectionMode::NFT, 2, 2);886		create_test_collection_for_owner(&CollectionMode::NFT, 3, 3);887888		let origin1 = Origin::signed(1);889		let origin2 = Origin::signed(2);890891		// collection admin892		assert_ok!(TemplateModule::add_collection_admin(893			origin1.clone(),894			collection1_id,895			account(2)896		));897		assert_ok!(TemplateModule::add_collection_admin(898			origin1,899			collection1_id,900			account(3)901		));902903		assert!(TemplateModule::admin_list_collection(1).contains(&account(2)),);904		assert!(TemplateModule::admin_list_collection(1).contains(&account(3)),);905906		// remove admin907		assert_ok!(TemplateModule::remove_collection_admin(908			origin2,909			1,910			account(3)911		));912		assert!(!TemplateModule::admin_list_collection(1).contains(&account(3)),);913	});914}915916#[test]917fn balance_of() {918	new_test_ext().execute_with(|| {919		default_limits();920921		let nft_collection_id = create_test_collection(&CollectionMode::NFT, 1);922		let fungible_collection_id = create_test_collection(&CollectionMode::Fungible(3), 2);923		let re_fungible_collection_id = create_test_collection(&CollectionMode::ReFungible, 3);924925		// check balance before926		assert_eq!(TemplateModule::balance_count(nft_collection_id, 1), 0);927		assert_eq!(TemplateModule::balance_count(fungible_collection_id, 1), 0);928		assert_eq!(929			TemplateModule::balance_count(re_fungible_collection_id, 1),930			0931		);932933		let nft_data = default_nft_data();934		create_test_item(nft_collection_id, &nft_data.into());935936		let fungible_data = default_fungible_data();937		create_test_item(fungible_collection_id, &fungible_data.into());938939		let re_fungible_data = default_re_fungible_data();940		create_test_item(re_fungible_collection_id, &re_fungible_data.into());941942		// check balance (collection with id = 1, user id = 1)943		assert_eq!(TemplateModule::balance_count(nft_collection_id, 1), 1);944		assert_eq!(TemplateModule::balance_count(fungible_collection_id, 1), 5);945		assert_eq!(946			TemplateModule::balance_count(re_fungible_collection_id, 1),947			1023948		);949		assert_eq!(950			TemplateModule::nft_item_id(nft_collection_id, 1)951				.unwrap()952				.owner,953			account(1)954		);955		assert_eq!(956			TemplateModule::fungible_item_id(fungible_collection_id, 1).value,957			5958		);959		assert_eq!(960			TemplateModule::refungible_item_id(re_fungible_collection_id, 1)961				.unwrap()962				.owner[0]963				.owner,964			account(1)965		);966	});967}968969#[test]970fn approve() {971	new_test_ext().execute_with(|| {972		default_limits();973974		let collection_id = create_test_collection(&CollectionMode::NFT, 1);975976		let data = default_nft_data();977		create_test_item(collection_id, &data.into());978979		let origin1 = Origin::signed(1);980981		// approve982		assert_ok!(TemplateModule::approve(origin1, account(2), 1, 1, 1));983		assert_eq!(TemplateModule::approved(1, (1, 1, 2)), 1);984	});985}986987#[test]988fn transfer_from() {989	new_test_ext().execute_with(|| {990		default_limits();991992		let collection_id = create_test_collection(&CollectionMode::NFT, 1);993		let origin1 = Origin::signed(1);994		let origin2 = Origin::signed(2);995996		let data = default_nft_data();997		create_test_item(collection_id, &data.into());998999		// approve1000		assert_ok!(TemplateModule::approve(1001			origin1.clone(),1002			account(2),1003			1,1004			1,1005			11006		));1007		assert_eq!(TemplateModule::approved(1, (1, 1, 2)), 1);10081009		assert_ok!(TemplateModule::set_mint_permission(1010			origin1.clone(),1011			1,1012			true1013		));1014		assert_ok!(TemplateModule::set_public_access_mode(1015			origin1.clone(),1016			1,1017			AccessMode::WhiteList1018		));1019		assert_ok!(TemplateModule::add_to_white_list(1020			origin1.clone(),1021			1,1022			account(1)1023		));1024		assert_ok!(TemplateModule::add_to_white_list(1025			origin1.clone(),1026			1,1027			account(2)1028		));1029		assert_ok!(TemplateModule::add_to_white_list(origin1, 1, account(3)));10301031		assert_ok!(TemplateModule::transfer_from(1032			origin2,1033			account(1),1034			account(2),1035			1,1036			1,1037			11038		));10391040		// after transfer1041		assert_eq!(TemplateModule::balance_count(1, 1), 0);1042		assert_eq!(TemplateModule::balance_count(1, 2), 1);1043	});1044}10451046// #endregion10471048// Coverage tests region1049// #region10501051#[test]1052fn owner_can_add_address_to_white_list() {1053	new_test_ext().execute_with(|| {1054		default_limits();10551056		let collection_id = create_test_collection(&CollectionMode::NFT, 1);10571058		let origin1 = Origin::signed(1);1059		assert_ok!(TemplateModule::add_to_white_list(1060			origin1,1061			collection_id,1062			account(2)1063		));1064		assert!(TemplateModule::white_list(collection_id, 2));1065	});1066}10671068#[test]1069fn admin_can_add_address_to_white_list() {1070	new_test_ext().execute_with(|| {1071		default_limits();10721073		let collection_id = create_test_collection(&CollectionMode::NFT, 1);1074		let origin1 = Origin::signed(1);1075		let origin2 = Origin::signed(2);10761077		assert_ok!(TemplateModule::add_collection_admin(1078			origin1,1079			collection_id,1080			account(2)1081		));1082		assert_ok!(TemplateModule::add_to_white_list(1083			origin2,1084			collection_id,1085			account(3)1086		));1087		assert!(TemplateModule::white_list(collection_id, 3));1088	});1089}10901091#[test]1092fn nonprivileged_user_cannot_add_address_to_white_list() {1093	new_test_ext().execute_with(|| {1094		default_limits();10951096		let collection_id = create_test_collection(&CollectionMode::NFT, 1);10971098		let origin2 = Origin::signed(2);1099		assert_noop!(1100			TemplateModule::add_to_white_list(origin2, collection_id, account(3)),1101			Error::<Test>::NoPermission1102		);1103	});1104}11051106#[test]1107fn nobody_can_add_address_to_white_list_of_nonexisting_collection() {1108	new_test_ext().execute_with(|| {1109		default_limits();11101111		let origin1 = Origin::signed(1);11121113		assert_noop!(1114			TemplateModule::add_to_white_list(origin1, 1, account(2)),1115			Error::<Test>::CollectionNotFound1116		);1117	});1118}11191120#[test]1121fn nobody_can_add_address_to_white_list_of_deleted_collection() {1122	new_test_ext().execute_with(|| {1123		default_limits();11241125		let collection_id = create_test_collection(&CollectionMode::NFT, 1);11261127		let origin1 = Origin::signed(1);1128		assert_ok!(TemplateModule::destroy_collection(1129			origin1.clone(),1130			collection_id1131		));1132		assert_noop!(1133			TemplateModule::add_to_white_list(origin1, collection_id, account(2)),1134			Error::<Test>::CollectionNotFound1135		);1136	});1137}11381139// If address is already added to white list, nothing happens1140#[test]1141fn address_is_already_added_to_white_list() {1142	new_test_ext().execute_with(|| {1143		default_limits();11441145		let collection_id = create_test_collection(&CollectionMode::NFT, 1);1146		let origin1 = Origin::signed(1);11471148		assert_ok!(TemplateModule::add_to_white_list(1149			origin1.clone(),1150			collection_id,1151			account(2)1152		));1153		assert_ok!(TemplateModule::add_to_white_list(1154			origin1,1155			collection_id,1156			account(2)1157		));1158		assert!(TemplateModule::white_list(collection_id, 2));1159	});1160}11611162#[test]1163fn owner_can_remove_address_from_white_list() {1164	new_test_ext().execute_with(|| {1165		default_limits();11661167		let collection_id = create_test_collection(&CollectionMode::NFT, 1);11681169		let origin1 = Origin::signed(1);1170		assert_ok!(TemplateModule::add_to_white_list(1171			origin1.clone(),1172			collection_id,1173			account(2)1174		));1175		assert_ok!(TemplateModule::remove_from_white_list(1176			origin1,1177			collection_id,1178			account(2)1179		));1180		assert!(!TemplateModule::white_list(collection_id, 2));1181	});1182}11831184#[test]1185fn admin_can_remove_address_from_white_list() {1186	new_test_ext().execute_with(|| {1187		default_limits();11881189		let collection_id = create_test_collection(&CollectionMode::NFT, 1);1190		let origin1 = Origin::signed(1);1191		let origin2 = Origin::signed(2);11921193		assert_ok!(TemplateModule::add_collection_admin(1194			origin1.clone(),1195			collection_id,1196			account(2)1197		));11981199		assert_ok!(TemplateModule::add_to_white_list(1200			origin1,1201			collection_id,1202			account(3)1203		));1204		assert_ok!(TemplateModule::remove_from_white_list(1205			origin2,1206			collection_id,1207			account(3)1208		));1209		assert!(!TemplateModule::white_list(collection_id, 3));1210	});1211}12121213#[test]1214fn nonprivileged_user_cannot_remove_address_from_white_list() {1215	new_test_ext().execute_with(|| {1216		default_limits();12171218		let collection_id = create_test_collection(&CollectionMode::NFT, 1);1219		let origin1 = Origin::signed(1);1220		let origin2 = Origin::signed(2);12211222		assert_ok!(TemplateModule::add_to_white_list(1223			origin1,1224			collection_id,1225			account(2)1226		));1227		assert_noop!(1228			TemplateModule::remove_from_white_list(origin2, collection_id, account(2)),1229			Error::<Test>::NoPermission1230		);1231		assert!(TemplateModule::white_list(collection_id, 2));1232	});1233}12341235#[test]1236fn nobody_can_remove_address_from_white_list_of_nonexisting_collection() {1237	new_test_ext().execute_with(|| {1238		default_limits();1239		let origin1 = Origin::signed(1);12401241		assert_noop!(1242			TemplateModule::remove_from_white_list(origin1, 1, account(2)),1243			Error::<Test>::CollectionNotFound1244		);1245	});1246}12471248#[test]1249fn nobody_can_remove_address_from_white_list_of_deleted_collection() {1250	new_test_ext().execute_with(|| {1251		default_limits();12521253		let collection_id = create_test_collection(&CollectionMode::NFT, 1);1254		let origin1 = Origin::signed(1);1255		let origin2 = Origin::signed(2);12561257		assert_ok!(TemplateModule::add_to_white_list(1258			origin1.clone(),1259			collection_id,1260			account(2)1261		));1262		assert_ok!(TemplateModule::destroy_collection(origin1, collection_id));1263		assert_noop!(1264			TemplateModule::remove_from_white_list(origin2, collection_id, account(2)),1265			Error::<Test>::CollectionNotFound1266		);1267		assert!(!TemplateModule::white_list(collection_id, 2));1268	});1269}12701271// If address is already removed from white list, nothing happens1272#[test]1273fn address_is_already_removed_from_white_list() {1274	new_test_ext().execute_with(|| {1275		default_limits();12761277		let collection_id = create_test_collection(&CollectionMode::NFT, 1);1278		let origin1 = Origin::signed(1);12791280		assert_ok!(TemplateModule::add_to_white_list(1281			origin1.clone(),1282			collection_id,1283			account(2)1284		));1285		assert_ok!(TemplateModule::remove_from_white_list(1286			origin1.clone(),1287			collection_id,1288			account(2)1289		));1290		assert_ok!(TemplateModule::remove_from_white_list(1291			origin1,1292			collection_id,1293			account(2)1294		));1295		assert!(!TemplateModule::white_list(collection_id, 2));1296	});1297}12981299// If Public Access mode is set to WhiteList, tokens can’t be transferred from a non-whitelisted address with transfer or transferFrom (2 tests)1300#[test]1301fn white_list_test_1() {1302	new_test_ext().execute_with(|| {1303		default_limits();13041305		let collection_id = create_test_collection(&CollectionMode::NFT, 1);13061307		let origin1 = Origin::signed(1);13081309		let data = default_nft_data();1310		create_test_item(collection_id, &data.into());13111312		assert_ok!(TemplateModule::set_public_access_mode(1313			origin1.clone(),1314			collection_id,1315			AccessMode::WhiteList1316		));1317		assert_ok!(TemplateModule::add_to_white_list(1318			origin1.clone(),1319			collection_id,1320			account(2)1321		));13221323		assert_noop!(1324			TemplateModule::transfer(origin1, account(3), 1, 1, 1),1325			Error::<Test>::AddresNotInWhiteList1326		);1327	});1328}13291330#[test]1331fn white_list_test_2() {1332	new_test_ext().execute_with(|| {1333		default_limits();13341335		let collection_id = create_test_collection(&CollectionMode::NFT, 1);1336		let origin1 = Origin::signed(1);13371338		let data = default_nft_data();1339		create_test_item(collection_id, &data.into());13401341		assert_ok!(TemplateModule::set_public_access_mode(1342			origin1.clone(),1343			collection_id,1344			AccessMode::WhiteList1345		));1346		assert_ok!(TemplateModule::add_to_white_list(1347			origin1.clone(),1348			1,1349			account(1)1350		));1351		assert_ok!(TemplateModule::add_to_white_list(1352			origin1.clone(),1353			1,1354			account(2)1355		));13561357		// do approve1358		assert_ok!(TemplateModule::approve(1359			origin1.clone(),1360			account(1),1361			1,1362			1,1363			11364		));1365		assert_eq!(TemplateModule::approved(1, (1, 1, 1)), 1);13661367		assert_ok!(TemplateModule::remove_from_white_list(1368			origin1.clone(),1369			1,1370			account(1)1371		));13721373		assert_noop!(1374			TemplateModule::transfer_from(origin1, account(1), account(3), 1, 1, 1),1375			Error::<Test>::AddresNotInWhiteList1376		);1377	});1378}13791380// If Public Access mode is set to WhiteList, tokens can’t be transferred to a non-whitelisted address with transfer or transferFrom (2 tests)1381#[test]1382fn white_list_test_3() {1383	new_test_ext().execute_with(|| {1384		default_limits();13851386		let collection_id = create_test_collection(&CollectionMode::NFT, 1);13871388		let origin1 = Origin::signed(1);13891390		let data = default_nft_data();1391		create_test_item(collection_id, &data.into());13921393		assert_ok!(TemplateModule::set_public_access_mode(1394			origin1.clone(),1395			collection_id,1396			AccessMode::WhiteList1397		));1398		assert_ok!(TemplateModule::add_to_white_list(1399			origin1.clone(),1400			1,1401			account(1)1402		));14031404		assert_noop!(1405			TemplateModule::transfer(origin1, account(3), 1, 1, 1),1406			Error::<Test>::AddresNotInWhiteList1407		);1408	});1409}14101411#[test]1412fn white_list_test_4() {1413	new_test_ext().execute_with(|| {1414		default_limits();14151416		let collection_id = create_test_collection(&CollectionMode::NFT, 1);14171418		let origin1 = Origin::signed(1);14191420		let data = default_nft_data();1421		create_test_item(collection_id, &data.into());14221423		assert_ok!(TemplateModule::set_public_access_mode(1424			origin1.clone(),1425			collection_id,1426			AccessMode::WhiteList1427		));1428		assert_ok!(TemplateModule::add_to_white_list(1429			origin1.clone(),1430			collection_id,1431			account(1)1432		));1433		assert_ok!(TemplateModule::add_to_white_list(1434			origin1.clone(),1435			collection_id,1436			account(2)1437		));14381439		// do approve1440		assert_ok!(TemplateModule::approve(1441			origin1.clone(),1442			account(1),1443			1,1444			1,1445			11446		));1447		assert_eq!(TemplateModule::approved(1, (1, 1, 1)), 1);14481449		assert_ok!(TemplateModule::remove_from_white_list(1450			origin1.clone(),1451			collection_id,1452			account(2)1453		));14541455		assert_noop!(1456			TemplateModule::transfer_from(origin1, account(1), account(3), 1, 1, 1),1457			Error::<Test>::AddresNotInWhiteList1458		);1459	});1460}14611462// If Public Access mode is set to WhiteList, tokens can’t be destroyed by a non-whitelisted address (even if it owned them before enabling WhiteList mode)1463#[test]1464fn white_list_test_5() {1465	new_test_ext().execute_with(|| {1466		default_limits();14671468		let collection_id = create_test_collection(&CollectionMode::NFT, 1);14691470		let origin1 = Origin::signed(1);14711472		let data = default_nft_data();1473		create_test_item(collection_id, &data.into());14741475		assert_ok!(TemplateModule::set_public_access_mode(1476			origin1.clone(),1477			collection_id,1478			AccessMode::WhiteList1479		));1480		assert_noop!(1481			TemplateModule::burn_item(origin1, 1, 1, 5),1482			Error::<Test>::AddresNotInWhiteList1483		);1484	});1485}14861487// If Public Access mode is set to WhiteList, token transfers can’t be Approved by a non-whitelisted address (see Approve method).1488#[test]1489fn white_list_test_6() {1490	new_test_ext().execute_with(|| {1491		default_limits();14921493		let collection_id = create_test_collection(&CollectionMode::NFT, 1);14941495		let origin1 = Origin::signed(1);14961497		let data = default_nft_data();1498		create_test_item(collection_id, &data.into());14991500		assert_ok!(TemplateModule::set_public_access_mode(1501			origin1.clone(),1502			collection_id,1503			AccessMode::WhiteList1504		));15051506		// do approve1507		assert_noop!(1508			TemplateModule::approve(origin1, account(1), 1, 1, 5),1509			Error::<Test>::AddresNotInWhiteList1510		);1511	});1512}15131514// If Public Access mode is set to WhiteList, tokens can be transferred from a whitelisted address with transfer or transferFrom (2 tests) and1515//          tokens can be transferred from a whitelisted address with transfer or transferFrom (2 tests)1516#[test]1517fn white_list_test_7() {1518	new_test_ext().execute_with(|| {1519		default_limits();15201521		let collection_id = create_test_collection(&CollectionMode::NFT, 1);15221523		let data = default_nft_data();1524		create_test_item(collection_id, &data.into());15251526		let origin1 = Origin::signed(1);15271528		assert_ok!(TemplateModule::set_public_access_mode(1529			origin1.clone(),1530			collection_id,1531			AccessMode::WhiteList1532		));1533		assert_ok!(TemplateModule::add_to_white_list(1534			origin1.clone(),1535			collection_id,1536			account(1)1537		));1538		assert_ok!(TemplateModule::add_to_white_list(1539			origin1.clone(),1540			collection_id,1541			account(2)1542		));15431544		assert_ok!(TemplateModule::transfer(origin1, account(2), 1, 1, 1));1545	});1546}15471548#[test]1549fn white_list_test_8() {1550	new_test_ext().execute_with(|| {1551		default_limits();15521553		let collection_id = create_test_collection(&CollectionMode::NFT, 1);15541555		let data = default_nft_data();1556		create_test_item(collection_id, &data.into());15571558		let origin1 = Origin::signed(1);15591560		assert_ok!(TemplateModule::set_public_access_mode(1561			origin1.clone(),1562			collection_id,1563			AccessMode::WhiteList1564		));1565		assert_ok!(TemplateModule::add_to_white_list(1566			origin1.clone(),1567			collection_id,1568			account(1)1569		));1570		assert_ok!(TemplateModule::add_to_white_list(1571			origin1.clone(),1572			collection_id,1573			account(2)1574		));15751576		// do approve1577		assert_ok!(TemplateModule::approve(1578			origin1.clone(),1579			account(1),1580			1,1581			1,1582			51583		));1584		assert_eq!(TemplateModule::approved(1, (1, 1, 1)), 5);15851586		assert_ok!(TemplateModule::transfer_from(1587			origin1,1588			account(1),1589			account(2),1590			1,1591			1,1592			11593		));1594	});1595}15961597// If Public Access mode is set to WhiteList, and Mint Permission is set to false, tokens can be created by owner.1598#[test]1599fn white_list_test_9() {1600	new_test_ext().execute_with(|| {1601		default_limits();16021603		let collection_id = create_test_collection(&CollectionMode::NFT, 1);1604		let origin1 = Origin::signed(1);16051606		assert_ok!(TemplateModule::set_public_access_mode(1607			origin1.clone(),1608			collection_id,1609			AccessMode::WhiteList1610		));1611		assert_ok!(TemplateModule::set_mint_permission(1612			origin1,1613			collection_id,1614			false1615		));16161617		let data = default_nft_data();1618		create_test_item(collection_id, &data.into());1619	});1620}16211622// If Public Access mode is set to WhiteList, and Mint Permission is set to false, tokens can be created by admin.1623#[test]1624fn white_list_test_10() {1625	new_test_ext().execute_with(|| {1626		default_limits();16271628		let collection_id = create_test_collection(&CollectionMode::NFT, 1);16291630		let origin1 = Origin::signed(1);1631		let origin2 = Origin::signed(2);16321633		assert_ok!(TemplateModule::set_public_access_mode(1634			origin1.clone(),1635			collection_id,1636			AccessMode::WhiteList1637		));1638		assert_ok!(TemplateModule::set_mint_permission(1639			origin1.clone(),1640			collection_id,1641			false1642		));16431644		assert_ok!(TemplateModule::add_collection_admin(1645			origin1,1646			collection_id,1647			account(2)1648		));16491650		assert_ok!(TemplateModule::create_item(1651			origin2,1652			collection_id,1653			account(2),1654			default_nft_data().into()1655		));1656	});1657}16581659// If Public Access mode is set to WhiteList, and Mint Permission is set to false, tokens cannot be created by non-privileged and white listed address.1660#[test]1661fn white_list_test_11() {1662	new_test_ext().execute_with(|| {1663		default_limits();16641665		let collection_id = create_test_collection(&CollectionMode::NFT, 1);16661667		let origin1 = Origin::signed(1);1668		let origin2 = Origin::signed(2);16691670		assert_ok!(TemplateModule::set_public_access_mode(1671			origin1.clone(),1672			collection_id,1673			AccessMode::WhiteList1674		));1675		assert_ok!(TemplateModule::set_mint_permission(1676			origin1.clone(),1677			collection_id,1678			false1679		));1680		assert_ok!(TemplateModule::add_to_white_list(1681			origin1,1682			collection_id,1683			account(2)1684		));16851686		assert_noop!(1687			TemplateModule::create_item(origin2, 1, account(2), default_nft_data().into()),1688			Error::<Test>::PublicMintingNotAllowed1689		);1690	});1691}16921693// If Public Access mode is set to WhiteList, and Mint Permission is set to false, tokens cannot be created by non-privileged and non-white listed address.1694#[test]1695fn white_list_test_12() {1696	new_test_ext().execute_with(|| {1697		default_limits();16981699		let collection_id = create_test_collection(&CollectionMode::NFT, 1);17001701		let origin1 = Origin::signed(1);1702		let origin2 = Origin::signed(2);17031704		assert_ok!(TemplateModule::set_public_access_mode(1705			origin1.clone(),1706			collection_id,1707			AccessMode::WhiteList1708		));1709		assert_ok!(TemplateModule::set_mint_permission(1710			origin1,1711			collection_id,1712			false1713		));17141715		assert_noop!(1716			TemplateModule::create_item(origin2, 1, account(2), default_nft_data().into()),1717			Error::<Test>::PublicMintingNotAllowed1718		);1719	});1720}17211722// If Public Access mode is set to WhiteList, and Mint Permission is set to true, tokens can be created by owner.1723#[test]1724fn white_list_test_13() {1725	new_test_ext().execute_with(|| {1726		default_limits();17271728		let collection_id = create_test_collection(&CollectionMode::NFT, 1);17291730		let origin1 = Origin::signed(1);17311732		assert_ok!(TemplateModule::set_public_access_mode(1733			origin1.clone(),1734			collection_id,1735			AccessMode::WhiteList1736		));1737		assert_ok!(TemplateModule::set_mint_permission(1738			origin1,1739			collection_id,1740			true1741		));17421743		let data = default_nft_data();1744		create_test_item(collection_id, &data.into());1745	});1746}17471748// If Public Access mode is set to WhiteList, and Mint Permission is set to true, tokens can be created by admin.1749#[test]1750fn white_list_test_14() {1751	new_test_ext().execute_with(|| {1752		default_limits();17531754		let collection_id = create_test_collection(&CollectionMode::NFT, 1);17551756		let origin1 = Origin::signed(1);1757		let origin2 = Origin::signed(2);17581759		assert_ok!(TemplateModule::set_public_access_mode(1760			origin1.clone(),1761			collection_id,1762			AccessMode::WhiteList1763		));1764		assert_ok!(TemplateModule::set_mint_permission(1765			origin1.clone(),1766			collection_id,1767			true1768		));17691770		assert_ok!(TemplateModule::add_collection_admin(1771			origin1,1772			collection_id,1773			account(2)1774		));17751776		assert_ok!(TemplateModule::create_item(1777			origin2,1778			1,1779			account(2),1780			default_nft_data().into()1781		));1782	});1783}17841785// If Public Access mode is set to WhiteList, and Mint Permission is set to true, tokens cannot be created by non-privileged and non-white listed address.1786#[test]1787fn white_list_test_15() {1788	new_test_ext().execute_with(|| {1789		default_limits();17901791		let collection_id = create_test_collection(&CollectionMode::NFT, 1);17921793		let origin1 = Origin::signed(1);1794		let origin2 = Origin::signed(2);17951796		assert_ok!(TemplateModule::set_public_access_mode(1797			origin1.clone(),1798			collection_id,1799			AccessMode::WhiteList1800		));1801		assert_ok!(TemplateModule::set_mint_permission(1802			origin1,1803			collection_id,1804			true1805		));18061807		assert_noop!(1808			TemplateModule::create_item(origin2, 1, account(2), default_nft_data().into()),1809			Error::<Test>::AddresNotInWhiteList1810		);1811	});1812}18131814// If Public Access mode is set to WhiteList, and Mint Permission is set to true, tokens can be created by non-privileged and white listed address.1815#[test]1816fn white_list_test_16() {1817	new_test_ext().execute_with(|| {1818		default_limits();18191820		let collection_id = create_test_collection(&CollectionMode::NFT, 1);18211822		let origin1 = Origin::signed(1);1823		let origin2 = Origin::signed(2);18241825		assert_ok!(TemplateModule::set_public_access_mode(1826			origin1.clone(),1827			collection_id,1828			AccessMode::WhiteList1829		));1830		assert_ok!(TemplateModule::set_mint_permission(1831			origin1.clone(),1832			collection_id,1833			true1834		));1835		assert_ok!(TemplateModule::add_to_white_list(1836			origin1,1837			collection_id,1838			account(2)1839		));18401841		assert_ok!(TemplateModule::create_item(1842			origin2,1843			1,1844			account(2),1845			default_nft_data().into()1846		));1847	});1848}18491850// Total number of collections. Positive test1851#[test]1852fn total_number_collections_bound() {1853	new_test_ext().execute_with(|| {1854		default_limits();18551856		create_test_collection(&CollectionMode::NFT, 1);1857	});1858}18591860// Total number of collections. Negotive test1861#[test]1862fn total_number_collections_bound_neg() {1863	new_test_ext().execute_with(|| {1864		default_limits();18651866		let origin1 = Origin::signed(1);18671868		for i in 0..default_collection_numbers_limit() {1869			create_test_collection(&CollectionMode::NFT, i + 1);1870		}18711872		let col_name1: Vec<u16> = "Test1\0".encode_utf16().collect::<Vec<u16>>();1873		let col_desc1: Vec<u16> = "TestDescription1\0".encode_utf16().collect::<Vec<u16>>();1874		let token_prefix1: Vec<u8> = b"token_prefix1\0".to_vec();18751876		// 11-th collection in chain. Expects error1877		assert_noop!(1878			TemplateModule::create_collection(1879				origin1,1880				col_name1,1881				col_desc1,1882				token_prefix1,1883				CollectionMode::NFT1884			),1885			Error::<Test>::TotalCollectionsLimitExceeded1886		);1887	});1888}18891890// Owned tokens by a single address. Positive test1891#[test]1892fn owned_tokens_bound() {1893	new_test_ext().execute_with(|| {1894		default_limits();18951896		let collection_id = create_test_collection(&CollectionMode::NFT, 1);18971898		let data = default_nft_data();1899		create_test_item(collection_id, &data.clone().into());1900		create_test_item(collection_id, &data.into());1901	});1902}19031904// Owned tokens by a single address. Negotive test1905#[test]1906fn owned_tokens_bound_neg() {1907	new_test_ext().execute_with(|| {1908		assert_ok!(TemplateModule::set_chain_limits(1909			RawOrigin::Root.into(),1910			ChainLimits {1911				collection_numbers_limit: 10,1912				account_token_ownership_limit: 1,1913				collections_admins_limit: 5,1914				custom_data_limit: 2048,1915				nft_sponsor_transfer_timeout: 15,1916				fungible_sponsor_transfer_timeout: 15,1917				refungible_sponsor_transfer_timeout: 15,1918				const_on_chain_schema_limit: 1024,1919				offchain_schema_limit: 1024,1920				variable_on_chain_schema_limit: 1024,1921			}1922		));19231924		let collection_id = create_test_collection(&CollectionMode::NFT, 1);19251926		let origin1 = Origin::signed(1);1927		let data = default_nft_data();1928		create_test_item(collection_id, &data.clone().into());19291930		assert_noop!(1931			TemplateModule::create_item(origin1, 1, account(1), data.into()),1932			Error::<Test>::AddressOwnershipLimitExceeded1933		);1934	});1935}19361937// Number of collection admins. Positive test1938#[test]1939fn collection_admins_bound() {1940	new_test_ext().execute_with(|| {1941		assert_ok!(TemplateModule::set_chain_limits(1942			RawOrigin::Root.into(),1943			ChainLimits {1944				collection_numbers_limit: 10,1945				account_token_ownership_limit: 10,1946				collections_admins_limit: 2,1947				custom_data_limit: 2048,1948				nft_sponsor_transfer_timeout: 15,1949				fungible_sponsor_transfer_timeout: 15,1950				refungible_sponsor_transfer_timeout: 15,1951				const_on_chain_schema_limit: 1024,1952				offchain_schema_limit: 1024,1953				variable_on_chain_schema_limit: 1024,1954			}1955		));19561957		let collection_id = create_test_collection(&CollectionMode::NFT, 1);19581959		let origin1 = Origin::signed(1);19601961		assert_ok!(TemplateModule::add_collection_admin(1962			origin1.clone(),1963			collection_id,1964			account(2)1965		));1966		assert_ok!(TemplateModule::add_collection_admin(1967			origin1,1968			collection_id,1969			account(3)1970		));1971	});1972}19731974// Number of collection admins. Negotive test1975#[test]1976fn collection_admins_bound_neg() {1977	new_test_ext().execute_with(|| {1978		assert_ok!(TemplateModule::set_chain_limits(1979			RawOrigin::Root.into(),1980			ChainLimits {1981				collection_numbers_limit: 10,1982				account_token_ownership_limit: 1,1983				collections_admins_limit: 1,1984				custom_data_limit: 2048,1985				nft_sponsor_transfer_timeout: 15,1986				fungible_sponsor_transfer_timeout: 15,1987				refungible_sponsor_transfer_timeout: 15,1988				const_on_chain_schema_limit: 1024,1989				offchain_schema_limit: 1024,1990				variable_on_chain_schema_limit: 1024,1991			}1992		));19931994		let collection_id = create_test_collection(&CollectionMode::NFT, 1);19951996		let origin1 = Origin::signed(1);19971998		assert_ok!(TemplateModule::add_collection_admin(1999			origin1.clone(),2000			collection_id,2001			account(2)2002		));2003		assert_noop!(2004			TemplateModule::add_collection_admin(origin1, collection_id, account(3)),2005			Error::<Test>::CollectionAdminsLimitExceeded2006		);2007	});2008}20092010// NFT custom data size. Negative test const_data.2011#[test]2012fn custom_data_size_nft_const_data_bound_neg() {2013	new_test_ext().execute_with(|| {2014		assert_ok!(TemplateModule::set_chain_limits(2015			RawOrigin::Root.into(),2016			ChainLimits {2017				collection_numbers_limit: 10,2018				account_token_ownership_limit: 10,2019				collections_admins_limit: 5,2020				custom_data_limit: 2,2021				nft_sponsor_transfer_timeout: 15,2022				fungible_sponsor_transfer_timeout: 15,2023				refungible_sponsor_transfer_timeout: 15,2024				const_on_chain_schema_limit: 1024,2025				offchain_schema_limit: 1024,2026				variable_on_chain_schema_limit: 1024,2027			}2028		));20292030		let collection_id = create_test_collection(&CollectionMode::NFT, 1);20312032		let origin1 = Origin::signed(1);2033		let too_big_const_data = CreateItemData::NFT(CreateNftData {2034			const_data: vec![1, 2, 3, 4],2035			variable_data: vec![],2036		});20372038		assert_noop!(2039			TemplateModule::create_item(origin1, collection_id, account(1), too_big_const_data),2040			Error::<Test>::TokenConstDataLimitExceeded2041		);2042	});2043}20442045// NFT custom data size. Negative test variable_data.2046#[test]2047fn custom_data_size_nft_variable_data_bound_neg() {2048	new_test_ext().execute_with(|| {2049		assert_ok!(TemplateModule::set_chain_limits(2050			RawOrigin::Root.into(),2051			ChainLimits {2052				collection_numbers_limit: 10,2053				account_token_ownership_limit: 10,2054				collections_admins_limit: 5,2055				custom_data_limit: 2,2056				nft_sponsor_transfer_timeout: 15,2057				fungible_sponsor_transfer_timeout: 15,2058				refungible_sponsor_transfer_timeout: 15,2059				const_on_chain_schema_limit: 1024,2060				offchain_schema_limit: 1024,2061				variable_on_chain_schema_limit: 1024,2062			}2063		));20642065		let collection_id = create_test_collection(&CollectionMode::NFT, 1);20662067		let origin1 = Origin::signed(1);2068		let too_big_const_data = CreateItemData::NFT(CreateNftData {2069			const_data: vec![],2070			variable_data: vec![1, 2, 3, 4],2071		});20722073		assert_noop!(2074			TemplateModule::create_item(origin1, collection_id, account(1), too_big_const_data),2075			Error::<Test>::TokenVariableDataLimitExceeded2076		);2077	});2078}20792080// Re fungible custom data size. Negative test const_data.2081#[test]2082fn custom_data_size_re_fungible_const_data_bound_neg() {2083	new_test_ext().execute_with(|| {2084		assert_ok!(TemplateModule::set_chain_limits(2085			RawOrigin::Root.into(),2086			ChainLimits {2087				collection_numbers_limit: 10,2088				account_token_ownership_limit: 10,2089				collections_admins_limit: 5,2090				custom_data_limit: 2,2091				nft_sponsor_transfer_timeout: 15,2092				fungible_sponsor_transfer_timeout: 15,2093				refungible_sponsor_transfer_timeout: 15,2094				const_on_chain_schema_limit: 1024,2095				offchain_schema_limit: 1024,2096				variable_on_chain_schema_limit: 1024,2097			}2098		));20992100		let collection_id = create_test_collection(&CollectionMode::NFT, 1);21012102		let origin1 = Origin::signed(1);2103		let too_big_const_data = CreateItemData::NFT(CreateNftData {2104			const_data: vec![1, 2, 3, 4],2105			variable_data: vec![],2106		});21072108		assert_noop!(2109			TemplateModule::create_item(origin1, collection_id, account(1), too_big_const_data),2110			Error::<Test>::TokenConstDataLimitExceeded2111		);2112	});2113}21142115// Re fungible custom data size. Negative test variable_data.2116#[test]2117fn custom_data_size_re_fungible_variable_data_bound_neg() {2118	new_test_ext().execute_with(|| {2119		assert_ok!(TemplateModule::set_chain_limits(2120			RawOrigin::Root.into(),2121			ChainLimits {2122				collection_numbers_limit: 10,2123				account_token_ownership_limit: 10,2124				collections_admins_limit: 5,2125				custom_data_limit: 2,2126				nft_sponsor_transfer_timeout: 15,2127				fungible_sponsor_transfer_timeout: 15,2128				refungible_sponsor_transfer_timeout: 15,2129				const_on_chain_schema_limit: 1024,2130				offchain_schema_limit: 1024,2131				variable_on_chain_schema_limit: 1024,2132			}2133		));21342135		let collection_id = create_test_collection(&CollectionMode::NFT, 1);21362137		let origin1 = Origin::signed(1);2138		let too_big_const_data = CreateItemData::NFT(CreateNftData {2139			const_data: vec![],2140			variable_data: vec![1, 2, 3, 4],2141		});21422143		assert_noop!(2144			TemplateModule::create_item(origin1, collection_id, account(1), too_big_const_data),2145			Error::<Test>::TokenVariableDataLimitExceeded2146		);2147	});2148}2149// #endregion21502151#[test]2152fn set_const_on_chain_schema() {2153	new_test_ext().execute_with(|| {2154		default_limits();21552156		let collection_id = create_test_collection(&CollectionMode::NFT, 1);21572158		let origin1 = Origin::signed(1);2159		assert_ok!(TemplateModule::set_const_on_chain_schema(2160			origin1,2161			collection_id,2162			b"test const on chain schema".to_vec()2163		));21642165		assert_eq!(2166			TemplateModule::collection_id(collection_id)2167				.unwrap()2168				.const_on_chain_schema,2169			b"test const on chain schema".to_vec()2170		);2171		assert_eq!(2172			TemplateModule::collection_id(collection_id)2173				.unwrap()2174				.variable_on_chain_schema,2175			b"".to_vec()2176		);2177	});2178}21792180#[test]2181fn set_variable_on_chain_schema() {2182	new_test_ext().execute_with(|| {2183		default_limits();21842185		let collection_id = create_test_collection(&CollectionMode::NFT, 1);21862187		let origin1 = Origin::signed(1);2188		assert_ok!(TemplateModule::set_variable_on_chain_schema(2189			origin1,2190			collection_id,2191			b"test variable on chain schema".to_vec()2192		));21932194		assert_eq!(2195			TemplateModule::collection_id(collection_id)2196				.unwrap()2197				.const_on_chain_schema,2198			b"".to_vec()2199		);2200		assert_eq!(2201			TemplateModule::collection_id(collection_id)2202				.unwrap()2203				.variable_on_chain_schema,2204			b"test variable on chain schema".to_vec()2205		);2206	});2207}22082209#[test]2210fn set_variable_meta_data_on_nft_token_stores_variable_meta_data() {2211	new_test_ext().execute_with(|| {2212		default_limits();22132214		let collection_id = create_test_collection(&CollectionMode::NFT, 1);22152216		let origin1 = Origin::signed(1);22172218		let data = default_nft_data();2219		create_test_item(1, &data.into());22202221		let variable_data = b"test set_variable_meta_data method.".to_vec();2222		assert_ok!(TemplateModule::set_variable_meta_data(2223			origin1,2224			collection_id,2225			1,2226			variable_data.clone()2227		));22282229		assert_eq!(2230			TemplateModule::nft_item_id(collection_id, 1)2231				.unwrap()2232				.variable_data,2233			variable_data2234		);2235	});2236}22372238#[test]2239fn set_variable_meta_data_on_re_fungible_token_stores_variable_meta_data() {2240	new_test_ext().execute_with(|| {2241		default_limits();22422243		let collection_id = create_test_collection(&CollectionMode::ReFungible, 1);22442245		let origin1 = Origin::signed(1);22462247		let data = default_re_fungible_data();2248		create_test_item(1, &data.into());22492250		let variable_data = b"test set_variable_meta_data method.".to_vec();2251		assert_ok!(TemplateModule::set_variable_meta_data(2252			origin1,2253			collection_id,2254			1,2255			variable_data.clone()2256		));22572258		assert_eq!(2259			TemplateModule::refungible_item_id(collection_id, 1)2260				.unwrap()2261				.variable_data,2262			variable_data2263		);2264	});2265}22662267#[test]2268fn set_variable_meta_data_on_fungible_token_fails() {2269	new_test_ext().execute_with(|| {2270		default_limits();22712272		let collection_id = create_test_collection(&CollectionMode::Fungible(3), 1);22732274		let origin1 = Origin::signed(1);22752276		let data = default_fungible_data();2277		create_test_item(1, &data.into());22782279		let variable_data = b"test set_variable_meta_data method.".to_vec();2280		assert_noop!(2281			TemplateModule::set_variable_meta_data(origin1, collection_id, 1, variable_data),2282			Error::<Test>::CantStoreMetadataInFungibleTokens2283		);2284	});2285}22862287#[test]2288fn set_variable_meta_data_on_nft_token_fails_for_big_data() {2289	new_test_ext().execute_with(|| {2290		assert_ok!(TemplateModule::set_chain_limits(2291			RawOrigin::Root.into(),2292			ChainLimits {2293				collection_numbers_limit: default_collection_numbers_limit(),2294				account_token_ownership_limit: 10,2295				collections_admins_limit: 5,2296				custom_data_limit: 10,2297				nft_sponsor_transfer_timeout: 15,2298				fungible_sponsor_transfer_timeout: 15,2299				refungible_sponsor_transfer_timeout: 15,2300				const_on_chain_schema_limit: 1024,2301				offchain_schema_limit: 1024,2302				variable_on_chain_schema_limit: 1024,2303			}2304		));23052306		let collection_id = create_test_collection(&CollectionMode::NFT, 1);23072308		let origin1 = Origin::signed(1);23092310		let data = default_nft_data();2311		create_test_item(1, &data.into());23122313		let variable_data = b"test set_variable_meta_data method, bigger than limits.".to_vec();2314		assert_noop!(2315			TemplateModule::set_variable_meta_data(origin1, collection_id, 1, variable_data),2316			Error::<Test>::TokenVariableDataLimitExceeded2317		);2318	});2319}23202321#[test]2322fn set_variable_meta_data_on_re_fungible_token_fails_for_big_data() {2323	new_test_ext().execute_with(|| {2324		assert_ok!(TemplateModule::set_chain_limits(2325			RawOrigin::Root.into(),2326			ChainLimits {2327				collection_numbers_limit: default_collection_numbers_limit(),2328				account_token_ownership_limit: 10,2329				collections_admins_limit: 5,2330				custom_data_limit: 10,2331				nft_sponsor_transfer_timeout: 15,2332				fungible_sponsor_transfer_timeout: 15,2333				refungible_sponsor_transfer_timeout: 15,2334				const_on_chain_schema_limit: 1024,2335				offchain_schema_limit: 1024,2336				variable_on_chain_schema_limit: 1024,2337			}2338		));23392340		let collection_id = create_test_collection(&CollectionMode::ReFungible, 1);23412342		let origin1 = Origin::signed(1);23432344		let data = default_re_fungible_data();2345		create_test_item(1, &data.into());23462347		let variable_data = b"test set_variable_meta_data method, bigger than limits.".to_vec();2348		assert_noop!(2349			TemplateModule::set_variable_meta_data(origin1, collection_id, 1, variable_data),2350			Error::<Test>::TokenVariableDataLimitExceeded2351		);2352	});2353}23542355#[test]2356fn collection_transfer_flag_works() {2357	new_test_ext().execute_with(|| {2358		default_limits();23592360		let origin1 = Origin::signed(1);23612362		let collection_id = create_test_collection(&CollectionMode::NFT, 1);2363		assert_ok!(TemplateModule::set_transfers_enabled_flag(origin1, 1, true));23642365		let data = default_nft_data();2366		create_test_item(collection_id, &data.into());2367		assert_eq!(TemplateModule::balance_count(1, 1), 1);2368		assert_eq!(TemplateModule::address_tokens(1, 1), [1]);23692370		let origin1 = Origin::signed(1);23712372		// default scenario2373		assert_ok!(TemplateModule::transfer(origin1, account(2), 1, 1, 1000));2374		assert_eq!(TemplateModule::nft_item_id(1, 1).unwrap().owner, account(2));2375		assert_eq!(TemplateModule::balance_count(1, 1), 0);2376		assert_eq!(TemplateModule::balance_count(1, 2), 1);23772378		assert_eq!(TemplateModule::address_tokens(1, 2), [1]);2379	});2380}23812382#[test]2383fn collection_transfer_flag_works_neg() {2384	new_test_ext().execute_with(|| {2385		default_limits();23862387		let origin1 = Origin::signed(1);23882389		let collection_id = create_test_collection(&CollectionMode::NFT, 1);2390		assert_ok!(TemplateModule::set_transfers_enabled_flag(2391			origin1, 1, false2392		));23932394		let data = default_nft_data();2395		create_test_item(collection_id, &data.into());2396		assert_eq!(TemplateModule::balance_count(1, 1), 1);2397		assert_eq!(TemplateModule::address_tokens(1, 1), [1]);23982399		let origin1 = Origin::signed(1);24002401		// default scenario2402		assert_noop!(2403			TemplateModule::transfer(origin1, account(2), 1, 1, 1000),2404			Error::<Test>::TransferNotAllowed2405		);2406		assert_eq!(TemplateModule::nft_item_id(1, 1).unwrap().owner, account(1));2407		assert_eq!(TemplateModule::balance_count(1, 1), 1);2408		assert_eq!(TemplateModule::balance_count(1, 2), 0);24092410		assert_eq!(TemplateModule::address_tokens(1, 1), [1]);2411	});2412}
modifiedpallets/scheduler/src/lib.rsdiffbeforeafterboth
--- a/pallets/scheduler/src/lib.rs
+++ b/pallets/scheduler/src/lib.rs
@@ -947,900 +947,4 @@
 	fn root() -> OriginCaller {
 		system::RawOrigin::Root.into()
 	}
-
-	#[test]
-	fn basic_scheduling_works() {
-		new_test_ext().execute_with(|| {
-			let call = Call::Logger(logger::Call::log(42, 1000));
-			assert!(!<Test as frame_system::Config>::BaseCallFilter::filter(
-				&call
-			));
-			assert_ok!(Scheduler::do_schedule(
-				DispatchTime::At(4),
-				None,
-				127,
-				root(),
-				call
-			));
-			run_to_block(3);
-			assert!(logger::log().is_empty());
-			run_to_block(4);
-			assert_eq!(logger::log(), vec![(root(), 42u32)]);
-			run_to_block(100);
-			assert_eq!(logger::log(), vec![(root(), 42u32)]);
-		});
-	}
-
-	#[test]
-	fn schedule_after_works() {
-		new_test_ext().execute_with(|| {
-			run_to_block(2);
-			let call = Call::Logger(logger::Call::log(42, 1000));
-			assert!(!<Test as frame_system::Config>::BaseCallFilter::filter(
-				&call
-			));
-			// This will schedule the call 3 blocks after the next block... so block 3 + 3 = 6
-			assert_ok!(Scheduler::do_schedule(
-				DispatchTime::After(3),
-				None,
-				127,
-				root(),
-				call
-			));
-			run_to_block(5);
-			assert!(logger::log().is_empty());
-			run_to_block(6);
-			assert_eq!(logger::log(), vec![(root(), 42u32)]);
-			run_to_block(100);
-			assert_eq!(logger::log(), vec![(root(), 42u32)]);
-		});
-	}
-
-	#[test]
-	fn schedule_after_zero_works() {
-		new_test_ext().execute_with(|| {
-			run_to_block(2);
-			let call = Call::Logger(logger::Call::log(42, 1000));
-			assert!(!<Test as frame_system::Config>::BaseCallFilter::filter(
-				&call
-			));
-			assert_ok!(Scheduler::do_schedule(
-				DispatchTime::After(0),
-				None,
-				127,
-				root(),
-				call
-			));
-			// Will trigger on the next block.
-			run_to_block(3);
-			assert_eq!(logger::log(), vec![(root(), 42u32)]);
-			run_to_block(100);
-			assert_eq!(logger::log(), vec![(root(), 42u32)]);
-		});
-	}
-
-	#[test]
-	fn periodic_scheduling_works() {
-		new_test_ext().execute_with(|| {
-			// at #4, every 3 blocks, 3 times.
-			assert_ok!(Scheduler::do_schedule(
-				DispatchTime::At(4),
-				Some((3, 3)),
-				127,
-				root(),
-				Call::Logger(logger::Call::log(42, 1000))
-			));
-			run_to_block(3);
-			assert!(logger::log().is_empty());
-			run_to_block(4);
-			assert_eq!(logger::log(), vec![(root(), 42u32)]);
-			run_to_block(6);
-			assert_eq!(logger::log(), vec![(root(), 42u32)]);
-			run_to_block(7);
-			assert_eq!(logger::log(), vec![(root(), 42u32), (root(), 42u32)]);
-			run_to_block(9);
-			assert_eq!(logger::log(), vec![(root(), 42u32), (root(), 42u32)]);
-			run_to_block(10);
-			assert_eq!(
-				logger::log(),
-				vec![(root(), 42u32), (root(), 42u32), (root(), 42u32)]
-			);
-			run_to_block(100);
-			assert_eq!(
-				logger::log(),
-				vec![(root(), 42u32), (root(), 42u32), (root(), 42u32)]
-			);
-		});
-	}
-
-	#[test]
-	fn reschedule_works() {
-		new_test_ext().execute_with(|| {
-			let call = Call::Logger(logger::Call::log(42, 1000));
-			assert!(!<Test as frame_system::Config>::BaseCallFilter::filter(
-				&call
-			));
-			assert_eq!(
-				Scheduler::do_schedule(DispatchTime::At(4), None, 127, root(), call).unwrap(),
-				(4, 0)
-			);
-
-			run_to_block(3);
-			assert!(logger::log().is_empty());
-
-			assert_eq!(
-				Scheduler::do_reschedule((4, 0), DispatchTime::At(6)).unwrap(),
-				(6, 0)
-			);
-
-			assert_noop!(
-				Scheduler::do_reschedule((6, 0), DispatchTime::At(6)),
-				Error::<Test>::RescheduleNoChange
-			);
-
-			run_to_block(4);
-			assert!(logger::log().is_empty());
-
-			run_to_block(6);
-			assert_eq!(logger::log(), vec![(root(), 42u32)]);
-
-			run_to_block(100);
-			assert_eq!(logger::log(), vec![(root(), 42u32)]);
-		});
-	}
-
-	#[test]
-	fn reschedule_named_works() {
-		new_test_ext().execute_with(|| {
-			let call = Call::Logger(logger::Call::log(42, 1000));
-			assert!(!<Test as frame_system::Config>::BaseCallFilter::filter(
-				&call
-			));
-			assert_eq!(
-				Scheduler::do_schedule_named(
-					1u32.encode(),
-					DispatchTime::At(4),
-					None,
-					127,
-					root(),
-					call
-				)
-				.unwrap(),
-				(4, 0)
-			);
-
-			run_to_block(3);
-			assert!(logger::log().is_empty());
-
-			assert_eq!(
-				Scheduler::do_reschedule_named(1u32.encode(), DispatchTime::At(6)).unwrap(),
-				(6, 0)
-			);
-
-			assert_noop!(
-				Scheduler::do_reschedule_named(1u32.encode(), DispatchTime::At(6)),
-				Error::<Test>::RescheduleNoChange
-			);
-
-			run_to_block(4);
-			assert!(logger::log().is_empty());
-
-			run_to_block(6);
-			assert_eq!(logger::log(), vec![(root(), 42u32)]);
-
-			run_to_block(100);
-			assert_eq!(logger::log(), vec![(root(), 42u32)]);
-		});
-	}
-
-	#[test]
-	fn reschedule_named_perodic_works() {
-		new_test_ext().execute_with(|| {
-			let call = Call::Logger(logger::Call::log(42, 1000));
-			assert!(!<Test as frame_system::Config>::BaseCallFilter::filter(
-				&call
-			));
-			assert_eq!(
-				Scheduler::do_schedule_named(
-					1u32.encode(),
-					DispatchTime::At(4),
-					Some((3, 3)),
-					127,
-					root(),
-					call
-				)
-				.unwrap(),
-				(4, 0)
-			);
-
-			run_to_block(3);
-			assert!(logger::log().is_empty());
-
-			assert_eq!(
-				Scheduler::do_reschedule_named(1u32.encode(), DispatchTime::At(5)).unwrap(),
-				(5, 0)
-			);
-			assert_eq!(
-				Scheduler::do_reschedule_named(1u32.encode(), DispatchTime::At(6)).unwrap(),
-				(6, 0)
-			);
-
-			run_to_block(5);
-			assert!(logger::log().is_empty());
-
-			run_to_block(6);
-			assert_eq!(logger::log(), vec![(root(), 42u32)]);
-
-			assert_eq!(
-				Scheduler::do_reschedule_named(1u32.encode(), DispatchTime::At(10)).unwrap(),
-				(10, 0)
-			);
-
-			run_to_block(9);
-			assert_eq!(logger::log(), vec![(root(), 42u32)]);
-
-			run_to_block(10);
-			assert_eq!(logger::log(), vec![(root(), 42u32), (root(), 42u32)]);
-
-			run_to_block(13);
-			assert_eq!(
-				logger::log(),
-				vec![(root(), 42u32), (root(), 42u32), (root(), 42u32)]
-			);
-
-			run_to_block(100);
-			assert_eq!(
-				logger::log(),
-				vec![(root(), 42u32), (root(), 42u32), (root(), 42u32)]
-			);
-		});
-	}
-
-	#[test]
-	fn cancel_named_scheduling_works_with_normal_cancel() {
-		new_test_ext().execute_with(|| {
-			// at #4.
-			Scheduler::do_schedule_named(
-				1u32.encode(),
-				DispatchTime::At(4),
-				None,
-				127,
-				root(),
-				Call::Logger(logger::Call::log(69, 1000)),
-			)
-			.unwrap();
-			let i = Scheduler::do_schedule(
-				DispatchTime::At(4),
-				None,
-				127,
-				root(),
-				Call::Logger(logger::Call::log(42, 1000)),
-			)
-			.unwrap();
-			run_to_block(3);
-			assert!(logger::log().is_empty());
-			assert_ok!(Scheduler::do_cancel_named(None, 1u32.encode()));
-			assert_ok!(Scheduler::do_cancel(None, i));
-			run_to_block(100);
-			assert!(logger::log().is_empty());
-		});
-	}
-
-	#[test]
-	fn cancel_named_periodic_scheduling_works() {
-		new_test_ext().execute_with(|| {
-			// at #4, every 3 blocks, 3 times.
-			Scheduler::do_schedule_named(
-				1u32.encode(),
-				DispatchTime::At(4),
-				Some((3, 3)),
-				127,
-				root(),
-				Call::Logger(logger::Call::log(42, 1000)),
-			)
-			.unwrap();
-			// same id results in error.
-			assert!(Scheduler::do_schedule_named(
-				1u32.encode(),
-				DispatchTime::At(4),
-				None,
-				127,
-				root(),
-				Call::Logger(logger::Call::log(69, 1000))
-			)
-			.is_err());
-			// different id is ok.
-			Scheduler::do_schedule_named(
-				2u32.encode(),
-				DispatchTime::At(8),
-				None,
-				127,
-				root(),
-				Call::Logger(logger::Call::log(69, 1000)),
-			)
-			.unwrap();
-			run_to_block(3);
-			assert!(logger::log().is_empty());
-			run_to_block(4);
-			assert_eq!(logger::log(), vec![(root(), 42u32)]);
-			run_to_block(6);
-			assert_ok!(Scheduler::do_cancel_named(None, 1u32.encode()));
-			run_to_block(100);
-			assert_eq!(logger::log(), vec![(root(), 42u32), (root(), 69u32)]);
-		});
-	}
-
-	#[test]
-	fn scheduler_respects_weight_limits() {
-		new_test_ext().execute_with(|| {
-			assert_ok!(Scheduler::do_schedule(
-				DispatchTime::At(4),
-				None,
-				127,
-				root(),
-				Call::Logger(logger::Call::log(42, MaximumSchedulerWeight::get() / 2))
-			));
-			assert_ok!(Scheduler::do_schedule(
-				DispatchTime::At(4),
-				None,
-				127,
-				root(),
-				Call::Logger(logger::Call::log(69, MaximumSchedulerWeight::get() / 2))
-			));
-			// 69 and 42 do not fit together
-			run_to_block(4);
-			assert_eq!(logger::log(), vec![(root(), 42u32)]);
-			run_to_block(5);
-			assert_eq!(logger::log(), vec![(root(), 42u32), (root(), 69u32)]);
-		});
-	}
-
-	#[test]
-	fn scheduler_respects_hard_deadlines_more() {
-		new_test_ext().execute_with(|| {
-			assert_ok!(Scheduler::do_schedule(
-				DispatchTime::At(4),
-				None,
-				0,
-				root(),
-				Call::Logger(logger::Call::log(42, MaximumSchedulerWeight::get() / 2))
-			));
-			assert_ok!(Scheduler::do_schedule(
-				DispatchTime::At(4),
-				None,
-				0,
-				root(),
-				Call::Logger(logger::Call::log(69, MaximumSchedulerWeight::get() / 2))
-			));
-			// With base weights, 69 and 42 should not fit together, but do because of hard deadlines
-			run_to_block(4);
-			assert_eq!(logger::log(), vec![(root(), 42u32), (root(), 69u32)]);
-		});
-	}
-
-	#[test]
-	fn scheduler_respects_priority_ordering() {
-		new_test_ext().execute_with(|| {
-			assert_ok!(Scheduler::do_schedule(
-				DispatchTime::At(4),
-				None,
-				1,
-				root(),
-				Call::Logger(logger::Call::log(42, MaximumSchedulerWeight::get() / 2))
-			));
-			assert_ok!(Scheduler::do_schedule(
-				DispatchTime::At(4),
-				None,
-				0,
-				root(),
-				Call::Logger(logger::Call::log(69, MaximumSchedulerWeight::get() / 2))
-			));
-			run_to_block(4);
-			assert_eq!(logger::log(), vec![(root(), 69u32), (root(), 42u32)]);
-		});
-	}
-
-	#[test]
-	fn scheduler_respects_priority_ordering_with_soft_deadlines() {
-		new_test_ext().execute_with(|| {
-			assert_ok!(Scheduler::do_schedule(
-				DispatchTime::At(4),
-				None,
-				255,
-				root(),
-				Call::Logger(logger::Call::log(42, MaximumSchedulerWeight::get() / 3))
-			));
-			assert_ok!(Scheduler::do_schedule(
-				DispatchTime::At(4),
-				None,
-				127,
-				root(),
-				Call::Logger(logger::Call::log(69, MaximumSchedulerWeight::get() / 2))
-			));
-			assert_ok!(Scheduler::do_schedule(
-				DispatchTime::At(4),
-				None,
-				126,
-				root(),
-				Call::Logger(logger::Call::log(2600, MaximumSchedulerWeight::get() / 2))
-			));
-
-			// 2600 does not fit with 69 or 42, but has higher priority, so will go through
-			run_to_block(4);
-			assert_eq!(logger::log(), vec![(root(), 2600u32)]);
-			// 69 and 42 fit together
-			run_to_block(5);
-			assert_eq!(
-				logger::log(),
-				vec![(root(), 2600u32), (root(), 69u32), (root(), 42u32)]
-			);
-		});
-	}
-
-	#[test]
-	fn on_initialize_weight_is_correct() {
-		new_test_ext().execute_with(|| {
-			let base_weight: Weight =
-				<Test as frame_system::Config>::DbWeight::get().reads_writes(1, 2);
-			let base_multiplier = 0;
-			let named_multiplier = <Test as frame_system::Config>::DbWeight::get().writes(1);
-			let periodic_multiplier =
-				<Test as frame_system::Config>::DbWeight::get().reads_writes(1, 1);
-
-			// Named
-			assert_ok!(Scheduler::do_schedule_named(
-				1u32.encode(),
-				DispatchTime::At(1),
-				None,
-				255,
-				root(),
-				Call::Logger(logger::Call::log(3, MaximumSchedulerWeight::get() / 3))
-			));
-			// Anon Periodic
-			assert_ok!(Scheduler::do_schedule(
-				DispatchTime::At(1),
-				Some((1000, 3)),
-				128,
-				root(),
-				Call::Logger(logger::Call::log(42, MaximumSchedulerWeight::get() / 3))
-			));
-			// Anon
-			assert_ok!(Scheduler::do_schedule(
-				DispatchTime::At(1),
-				None,
-				127,
-				root(),
-				Call::Logger(logger::Call::log(69, MaximumSchedulerWeight::get() / 2))
-			));
-			// Named Periodic
-			assert_ok!(Scheduler::do_schedule_named(
-				2u32.encode(),
-				DispatchTime::At(1),
-				Some((1000, 3)),
-				126,
-				root(),
-				Call::Logger(logger::Call::log(2600, MaximumSchedulerWeight::get() / 2))
-			));
-
-			// Will include the named periodic only
-			let actual_weight = Scheduler::on_initialize(1);
-			let call_weight = MaximumSchedulerWeight::get() / 2;
-			assert_eq!(
-				actual_weight,
-				call_weight
-					+ base_weight + base_multiplier
-					+ named_multiplier + periodic_multiplier
-			);
-			assert_eq!(logger::log(), vec![(root(), 2600u32)]);
-
-			// Will include anon and anon periodic
-			let actual_weight = Scheduler::on_initialize(2);
-			let call_weight = MaximumSchedulerWeight::get() / 2 + MaximumSchedulerWeight::get() / 3;
-			assert_eq!(
-				actual_weight,
-				call_weight + base_weight + base_multiplier * 2 + periodic_multiplier
-			);
-			assert_eq!(
-				logger::log(),
-				vec![(root(), 2600u32), (root(), 69u32), (root(), 42u32)]
-			);
-
-			// Will include named only
-			let actual_weight = Scheduler::on_initialize(3);
-			let call_weight = MaximumSchedulerWeight::get() / 3;
-			assert_eq!(
-				actual_weight,
-				call_weight + base_weight + base_multiplier + named_multiplier
-			);
-			assert_eq!(
-				logger::log(),
-				vec![
-					(root(), 2600u32),
-					(root(), 69u32),
-					(root(), 42u32),
-					(root(), 3u32)
-				]
-			);
-
-			// Will contain none
-			let actual_weight = Scheduler::on_initialize(4);
-			assert_eq!(actual_weight, 0);
-		});
-	}
-
-	#[test]
-	fn root_calls_works() {
-		new_test_ext().execute_with(|| {
-			let call = Box::new(Call::Logger(logger::Call::log(69, 1000)));
-			let call2 = Box::new(Call::Logger(logger::Call::log(42, 1000)));
-			assert_ok!(Scheduler::schedule_named(
-				Origin::root(),
-				1u32.encode(),
-				4,
-				None,
-				127,
-				call
-			));
-			assert_ok!(Scheduler::schedule(Origin::root(), 4, None, 127, call2));
-			run_to_block(3);
-			// Scheduled calls are in the agenda.
-			assert_eq!(Agenda::<Test>::get(4).len(), 2);
-			assert!(logger::log().is_empty());
-			assert_ok!(Scheduler::cancel_named(Origin::root(), 1u32.encode()));
-			assert_ok!(Scheduler::cancel(Origin::root(), 4, 1));
-			// Scheduled calls are made NONE, so should not effect state
-			run_to_block(100);
-			assert!(logger::log().is_empty());
-		});
-	}
-
-	#[test]
-	fn fails_to_schedule_task_in_the_past() {
-		new_test_ext().execute_with(|| {
-			run_to_block(3);
-
-			let call = Box::new(Call::Logger(logger::Call::log(69, 1000)));
-			let call2 = Box::new(Call::Logger(logger::Call::log(42, 1000)));
-
-			assert_err!(
-				Scheduler::schedule_named(Origin::root(), 1u32.encode(), 2, None, 127, call),
-				Error::<Test>::TargetBlockNumberInPast,
-			);
-
-			assert_err!(
-				Scheduler::schedule(Origin::root(), 2, None, 127, call2.clone()),
-				Error::<Test>::TargetBlockNumberInPast,
-			);
-
-			assert_err!(
-				Scheduler::schedule(Origin::root(), 3, None, 127, call2),
-				Error::<Test>::TargetBlockNumberInPast,
-			);
-		});
-	}
-
-	#[test]
-	fn should_use_orign() {
-		new_test_ext().execute_with(|| {
-			let call = Box::new(Call::Logger(logger::Call::log(69, 1000)));
-			let call2 = Box::new(Call::Logger(logger::Call::log(42, 1000)));
-			assert_ok!(Scheduler::schedule_named(
-				system::RawOrigin::Signed(1).into(),
-				1u32.encode(),
-				4,
-				None,
-				127,
-				call
-			));
-			assert_ok!(Scheduler::schedule(
-				system::RawOrigin::Signed(1).into(),
-				4,
-				None,
-				127,
-				call2
-			));
-			run_to_block(3);
-			// Scheduled calls are in the agenda.
-			assert_eq!(Agenda::<Test>::get(4).len(), 2);
-			assert!(logger::log().is_empty());
-			assert_ok!(Scheduler::cancel_named(
-				system::RawOrigin::Signed(1).into(),
-				1u32.encode()
-			));
-			assert_ok!(Scheduler::cancel(system::RawOrigin::Signed(1).into(), 4, 1));
-			// Scheduled calls are made NONE, so should not effect state
-			run_to_block(100);
-			assert!(logger::log().is_empty());
-		});
-	}
-
-	#[test]
-	fn should_check_orign() {
-		new_test_ext().execute_with(|| {
-			let call = Box::new(Call::Logger(logger::Call::log(69, 1000)));
-			let call2 = Box::new(Call::Logger(logger::Call::log(42, 1000)));
-			assert_noop!(
-				Scheduler::schedule_named(
-					system::RawOrigin::Signed(2).into(),
-					1u32.encode(),
-					4,
-					None,
-					127,
-					call
-				),
-				BadOrigin
-			);
-			assert_noop!(
-				Scheduler::schedule(system::RawOrigin::Signed(2).into(), 4, None, 127, call2),
-				BadOrigin
-			);
-		});
-	}
-
-	#[test]
-	fn should_check_orign_for_cancel() {
-		new_test_ext().execute_with(|| {
-			let call = Box::new(Call::Logger(logger::Call::log_without_filter(69, 1000)));
-			let call2 = Box::new(Call::Logger(logger::Call::log_without_filter(42, 1000)));
-			assert_ok!(Scheduler::schedule_named(
-				system::RawOrigin::Signed(1).into(),
-				1u32.encode(),
-				4,
-				None,
-				127,
-				call
-			));
-			assert_ok!(Scheduler::schedule(
-				system::RawOrigin::Signed(1).into(),
-				4,
-				None,
-				127,
-				call2
-			));
-			run_to_block(3);
-			// Scheduled calls are in the agenda.
-			assert_eq!(Agenda::<Test>::get(4).len(), 2);
-			assert!(logger::log().is_empty());
-			assert_noop!(
-				Scheduler::cancel_named(system::RawOrigin::Signed(2).into(), 1u32.encode()),
-				BadOrigin
-			);
-			assert_noop!(
-				Scheduler::cancel(system::RawOrigin::Signed(2).into(), 4, 1),
-				BadOrigin
-			);
-			assert_noop!(
-				Scheduler::cancel_named(system::RawOrigin::Root.into(), 1u32.encode()),
-				BadOrigin
-			);
-			assert_noop!(
-				Scheduler::cancel(system::RawOrigin::Root.into(), 4, 1),
-				BadOrigin
-			);
-			run_to_block(5);
-			assert_eq!(
-				logger::log(),
-				vec![
-					(system::RawOrigin::Signed(1).into(), 69u32),
-					(system::RawOrigin::Signed(1).into(), 42u32)
-				]
-			);
-		});
-	}
-
-	#[test]
-	fn migration_to_v2_works() {
-		new_test_ext().execute_with(|| {
-			for i in 0..3u64 {
-				let k = i.twox_64_concat();
-				let old = vec![
-					Some(ScheduledV1 {
-						maybe_id: None,
-						priority: i as u8 + 10,
-						call: Call::Logger(logger::Call::log(96, 100)),
-						maybe_periodic: None,
-					}),
-					None,
-					Some(ScheduledV1 {
-						maybe_id: Some(b"test".to_vec()),
-						priority: 123,
-						call: Call::Logger(logger::Call::log(69, 1000)),
-						maybe_periodic: Some((456u64, 10)),
-					}),
-				];
-				frame_support::migration::put_storage_value(b"Scheduler", b"Agenda", &k, old);
-			}
-
-			assert_eq!(StorageVersion::get(), Releases::V1);
-
-			assert!(Scheduler::migrate_v1_to_t2());
-
-			assert_eq_uvec!(
-				Agenda::<Test>::iter().collect::<Vec<_>>(),
-				vec![
-					(
-						0,
-						vec![
-							Some(ScheduledV2 {
-								maybe_id: None,
-								priority: 10,
-								call: Call::Logger(logger::Call::log(96, 100)),
-								maybe_periodic: None,
-								origin: root(),
-								_phantom: PhantomData::<u64>::default(),
-							}),
-							None,
-							Some(ScheduledV2 {
-								maybe_id: Some(b"test".to_vec()),
-								priority: 123,
-								call: Call::Logger(logger::Call::log(69, 1000)),
-								maybe_periodic: Some((456u64, 10)),
-								origin: root(),
-								_phantom: PhantomData::<u64>::default(),
-							}),
-						]
-					),
-					(
-						1,
-						vec![
-							Some(ScheduledV2 {
-								maybe_id: None,
-								priority: 11,
-								call: Call::Logger(logger::Call::log(96, 100)),
-								maybe_periodic: None,
-								origin: root(),
-								_phantom: PhantomData::<u64>::default(),
-							}),
-							None,
-							Some(ScheduledV2 {
-								maybe_id: Some(b"test".to_vec()),
-								priority: 123,
-								call: Call::Logger(logger::Call::log(69, 1000)),
-								maybe_periodic: Some((456u64, 10)),
-								origin: root(),
-								_phantom: PhantomData::<u64>::default(),
-							}),
-						]
-					),
-					(
-						2,
-						vec![
-							Some(ScheduledV2 {
-								maybe_id: None,
-								priority: 12,
-								call: Call::Logger(logger::Call::log(96, 100)),
-								maybe_periodic: None,
-								origin: root(),
-								_phantom: PhantomData::<u64>::default(),
-							}),
-							None,
-							Some(ScheduledV2 {
-								maybe_id: Some(b"test".to_vec()),
-								priority: 123,
-								call: Call::Logger(logger::Call::log(69, 1000)),
-								maybe_periodic: Some((456u64, 10)),
-								origin: root(),
-								_phantom: PhantomData::<u64>::default(),
-							}),
-						]
-					)
-				]
-			);
-
-			assert_eq!(StorageVersion::get(), Releases::V2);
-		});
-	}
-
-	#[test]
-	fn test_migrate_origin() {
-		new_test_ext().execute_with(|| {
-			for i in 0..3u64 {
-				let k = i.twox_64_concat();
-				let old: Vec<Option<Scheduled<_, _, u32, u64>>> = vec![
-					Some(Scheduled {
-						maybe_id: None,
-						priority: i as u8 + 10,
-						call: Call::Logger(logger::Call::log(96, 100)),
-						origin: 3u32,
-						maybe_periodic: None,
-						_phantom: Default::default(),
-					}),
-					None,
-					Some(Scheduled {
-						maybe_id: Some(b"test".to_vec()),
-						priority: 123,
-						origin: 2u32,
-						call: Call::Logger(logger::Call::log(69, 1000)),
-						maybe_periodic: Some((456u64, 10)),
-						_phantom: Default::default(),
-					}),
-				];
-				frame_support::migration::put_storage_value(b"Scheduler", b"Agenda", &k, old);
-			}
-
-			impl From<u32> for OriginCaller {
-				fn from(value: u32) -> Self {
-					match value {
-						3 => system::RawOrigin::Root.into(),
-						2 => system::RawOrigin::None.into(),
-						_ => unimplemented!(),
-					}
-				}
-			}
-
-			Scheduler::migrate_origin::<u32>();
-
-			assert_eq_uvec!(
-				Agenda::<Test>::iter().collect::<Vec<_>>(),
-				vec![
-					(
-						0,
-						vec![
-							Some(ScheduledV2::<_, _, OriginCaller, u64> {
-								maybe_id: None,
-								priority: 10,
-								call: Call::Logger(logger::Call::log(96, 100)),
-								maybe_periodic: None,
-								origin: system::RawOrigin::Root.into(),
-								_phantom: PhantomData::<u64>::default(),
-							}),
-							None,
-							Some(ScheduledV2 {
-								maybe_id: Some(b"test".to_vec()),
-								priority: 123,
-								call: Call::Logger(logger::Call::log(69, 1000)),
-								maybe_periodic: Some((456u64, 10)),
-								origin: system::RawOrigin::None.into(),
-								_phantom: PhantomData::<u64>::default(),
-							}),
-						]
-					),
-					(
-						1,
-						vec![
-							Some(ScheduledV2 {
-								maybe_id: None,
-								priority: 11,
-								call: Call::Logger(logger::Call::log(96, 100)),
-								maybe_periodic: None,
-								origin: system::RawOrigin::Root.into(),
-								_phantom: PhantomData::<u64>::default(),
-							}),
-							None,
-							Some(ScheduledV2 {
-								maybe_id: Some(b"test".to_vec()),
-								priority: 123,
-								call: Call::Logger(logger::Call::log(69, 1000)),
-								maybe_periodic: Some((456u64, 10)),
-								origin: system::RawOrigin::None.into(),
-								_phantom: PhantomData::<u64>::default(),
-							}),
-						]
-					),
-					(
-						2,
-						vec![
-							Some(ScheduledV2 {
-								maybe_id: None,
-								priority: 12,
-								call: Call::Logger(logger::Call::log(96, 100)),
-								maybe_periodic: None,
-								origin: system::RawOrigin::Root.into(),
-								_phantom: PhantomData::<u64>::default(),
-							}),
-							None,
-							Some(ScheduledV2 {
-								maybe_id: Some(b"test".to_vec()),
-								priority: 123,
-								call: Call::Logger(logger::Call::log(69, 1000)),
-								maybe_periodic: Some((456u64, 10)),
-								origin: system::RawOrigin::None.into(),
-								_phantom: PhantomData::<u64>::default(),
-							}),
-						]
-					)
-				]
-			);
-		});
-	}
 }
modifiedprimitives/nft/src/lib.rsdiffbeforeafterboth
--- a/primitives/nft/src/lib.rs
+++ b/primitives/nft/src/lib.rs
@@ -144,6 +144,7 @@
 	pub limits: CollectionLimits<T::BlockNumber>, // Collection private restrictions
 	pub variable_on_chain_schema: Vec<u8>,        //
 	pub const_on_chain_schema: Vec<u8>,           //
+	pub transfers_enabled: bool,
 }
 
 #[derive(Encode, Decode, Debug, Clone, PartialEq)]
modifiedruntime/src/lib.rsdiffbeforeafterboth
--- a/runtime/src/lib.rs
+++ b/runtime/src/lib.rs
@@ -154,7 +154,7 @@
 	transaction_version: 1,
 };
 
-pub const MILLISECS_PER_BLOCK: u64 = 12000;
+pub const MILLISECS_PER_BLOCK: u64 = 1200;
 
 pub const SLOT_DURATION: u64 = MILLISECS_PER_BLOCK;
 
@@ -449,7 +449,7 @@
 }
 
 impl pallet_transaction_payment::Config for Runtime {
-	type OnChargeTransaction = pallet_transaction_payment::CurrencyAdapter<Balances, ()>;
+	type OnChargeTransaction = pallet_transaction_payment::CurrencyAdapter<Balances, DealWithFees>;
 	type TransactionByteFee = TransactionByteFee;
 	type WeightToFee = LinearFee<Balance>;
 	type FeeMultiplierUpdate = ();
modifiedruntime_types.jsondiffbeforeafterboth
--- a/runtime_types.json
+++ b/runtime_types.json
@@ -62,7 +62,8 @@
       "Sponsorship": "SponsorshipState",
       "Limits": "CollectionLimits",
       "VariableOnChainSchema": "Vec<u8>",
-      "ConstOnChainSchema": "Vec<u8>"
+      "ConstOnChainSchema": "Vec<u8>",
+      "TransfersEnabled": "bool"
     },
     "RawData": "Vec<u8>",
     "Address": "MultiAddress",
modifiedtests/package.jsondiffbeforeafterboth
--- a/tests/package.json
+++ b/tests/package.json
@@ -1,12 +1,12 @@
 {
-  "name": "NftTests",
+  "name": "nfttests",
   "version": "1.0.0",
   "description": "Substrate Nft tests",
   "main": "",
   "devDependencies": {
     "@polkadot/dev": "0.62.43",
     "@polkadot/ts": "0.3.89",
-    "@polkadot/typegen": "4.15.1",
+    "@polkadot/typegen": "5.0.1",
     "@types/chai": "^4.2.17",
     "@types/chai-as-promised": "^7.1.3",
     "@types/mocha": "^8.2.2",
@@ -59,15 +59,15 @@
     "testSetVariableMetadataSponsoringRateLimit": "mocha --timeout 9999999 -r ts-node/register ./**/setVariableMetadataSponsoringRateLimit.test.ts",
     "testInflation": "mocha --timeout 9999999 -r ts-node/register ./**/inflation.test.ts",
     "testPalletPresence": "mocha --timeout 9999999 -r ts-node/register ./**/pallet-presence.test.ts",
-    "testBlockProduction": "mocha --timeout 9999999 -r ts-node/register ./**/block-production.test.ts"
+    "testBlockProduction": "mocha --timeout 9999999 -r ts-node/register ./**/block-production.test.ts",
+    "testEnableDisableTransfers": "mocha --timeout 9999999 -r ts-node/register ./**/enableDisableTransfer.test.ts"
   },
   "author": "",
   "license": "SEE LICENSE IN ../LICENSE",
   "homepage": "",
   "dependencies": {
-    "@polkadot/api": "4.15.1",
-    "@polkadot/api-contract": "4.15.1",
-    "@polkadot/util": "6.9.1",
+    "@polkadot/api": "5.0.1",
+    "@polkadot/api-contract": "5.0.1",
     "bignumber.js": "^9.0.1",
     "chai-as-promised": "^7.1.1",
     "solc": "^0.8.6",
modifiedtests/src/addCollectionAdmin.test.tsdiffbeforeafterboth
--- a/tests/src/addCollectionAdmin.test.ts
+++ b/tests/src/addCollectionAdmin.test.ts
@@ -22,7 +22,7 @@
       const bob = privateKey('//Bob');
 
       const collection: any = (await api.query.nft.collectionById(collectionId)).toJSON();
-      expect(collection.Owner).to.be.deep.eq(normalizeAccountId(alice.address));
+      expect(collection.Owner).to.be.equal(alice.address);
 
       const changeAdminTx = api.tx.nft.addCollectionAdmin(collectionId, normalizeAccountId(bob.address));
       await submitTransactionAsync(alice, changeAdminTx);
@@ -40,7 +40,7 @@
       const Charlie = privateKey('//CHARLIE');
 
       const collection: any = (await api.query.nft.collectionById(collectionId)).toJSON();
-      expect(collection.Owner).to.be.deep.eq(normalizeAccountId(Alice.address));
+      expect(collection.Owner).to.be.equal(Alice.address);
 
       const changeAdminTx = api.tx.nft.addCollectionAdmin(collectionId, normalizeAccountId(Bob.address));
       await submitTransactionAsync(Alice, changeAdminTx);
modifiedtests/src/addToContractWhiteList.test.tsdiffbeforeafterboth
--- a/tests/src/addToContractWhiteList.test.ts
+++ b/tests/src/addToContractWhiteList.test.ts
@@ -17,7 +17,7 @@
 chai.use(chaiAsPromised);
 const expect = chai.expect;
 
-describe('Integration Test addToContractWhiteList', () => {
+describe.skip('Integration Test addToContractWhiteList', () => {
 
   it('Add an address to a contract white list', async () => {
     await usingApi(async api => {
@@ -56,7 +56,7 @@
   });
 });
 
-describe('Negative Integration Test addToContractWhiteList', () => {
+describe.skip('Negative Integration Test addToContractWhiteList', () => {
 
   it('Add an address to a white list of a non-contract', async () => {
     await usingApi(async api => {
modifiedtests/src/change-collection-owner.test.tsdiffbeforeafterboth
--- a/tests/src/change-collection-owner.test.ts
+++ b/tests/src/change-collection-owner.test.ts
@@ -7,26 +7,26 @@
 import chaiAsPromised from 'chai-as-promised';
 import privateKey from './substrate/privateKey';
 import { default as usingApi, submitTransactionAsync, submitTransactionExpectFailAsync } from './substrate/substrate-api';
-import { createCollectionExpectSuccess, normalizeAccountId } from './util/helpers';
+import { createCollectionExpectSuccess } from './util/helpers';
 
 chai.use(chaiAsPromised);
 const expect = chai.expect;
 
 describe('Integration Test changeCollectionOwner(collection_id, new_owner):', () => {
-  it('Changing owner changes owner.', async () => {
+  it('Changing owner changes owner address', async () => {
     await usingApi(async api => {
       const collectionId = await createCollectionExpectSuccess();
       const alice = privateKey('//Alice');
       const bob = privateKey('//Bob');
 
       const collection: any = (await api.query.nft.collectionById(collectionId)).toJSON();
-      expect(collection.Owner).to.be.deep.eq(normalizeAccountId(alice.address));
+      expect(collection.Owner).to.be.deep.eq(alice.address);
 
-      const changeOwnerTx = api.tx.nft.changeCollectionOwner(collectionId, normalizeAccountId(bob.address));
+      const changeOwnerTx = api.tx.nft.changeCollectionOwner(collectionId, bob.address);
       await submitTransactionAsync(alice, changeOwnerTx);
 
       const collectionAfterOwnerChange: any = (await api.query.nft.collectionById(collectionId)).toJSON();
-      expect(collectionAfterOwnerChange.Owner).to.be.deep.eq(normalizeAccountId(bob.address));
+      expect(collectionAfterOwnerChange.Owner).to.be.deep.eq(bob.address);
     });
   });
 });
@@ -38,23 +38,23 @@
       const alice = privateKey('//Alice');
       const bob = privateKey('//Bob');
 
-      const changeOwnerTx = api.tx.nft.changeCollectionOwner(collectionId, normalizeAccountId(bob.address));
+      const changeOwnerTx = api.tx.nft.changeCollectionOwner(collectionId, bob.address);
       await expect(submitTransactionExpectFailAsync(bob, changeOwnerTx)).to.be.rejected;
 
       const collectionAfterOwnerChange: any = (await api.query.nft.collectionById(collectionId)).toJSON();
-      expect(collectionAfterOwnerChange.Owner).to.be.deep.eq(normalizeAccountId(alice.address));
+      expect(collectionAfterOwnerChange.Owner).to.be.deep.eq(alice.address);
 
       // Verifying that nothing bad happened (network is live, new collections can be created, etc.)
       await createCollectionExpectSuccess();
     });
   });
-  it('Can\'t change owner of not existing collection.', async () => {
+  it('Can\'t change owner of a non-existing collection.', async () => {
     await usingApi(async api => {
       const collectionId = (1<<32) - 1;
       const alice = privateKey('//Alice');
       const bob = privateKey('//Bob');
 
-      const changeOwnerTx = api.tx.nft.changeCollectionOwner(collectionId, normalizeAccountId(bob.address));
+      const changeOwnerTx = api.tx.nft.changeCollectionOwner(collectionId, bob.address);
       await expect(submitTransactionExpectFailAsync(alice, changeOwnerTx)).to.be.rejected;
 
       // Verifying that nothing bad happened (network is live, new collections can be created, etc.)
modifiedtests/src/confirmSponsorship.test.tsdiffbeforeafterboth
--- a/tests/src/confirmSponsorship.test.ts
+++ b/tests/src/confirmSponsorship.test.ts
@@ -226,7 +226,7 @@
       const result1 = getGenericResult(events1);
 
       const AsponsorBalance = new BigNumber((await api.query.system.account(bob.address)).data.free.toString());
-      await submitTransactionExpectFailAsync(zeroBalance, zeroToAlice);
+      await expect(submitTransactionExpectFailAsync(zeroBalance, zeroToAlice)).to.be.rejected;
       const BsponsorBalance = new BigNumber((await api.query.system.account(bob.address)).data.free.toString());
 
       // Try again after Zero gets some balance - now it should succeed
@@ -327,7 +327,7 @@
 
 });
 
-describe('(!negative test!) integration test: ext. removeCollectionSponsor():', () => {
+describe('(!negative test!) integration test: ext. confirmSponsorship():', () => {
   before(async () => {
     await usingApi(async () => {
       const keyring = new Keyring({ type: 'sr25519' });
modifiedtests/src/contracts.test.tsdiffbeforeafterboth
--- a/tests/src/contracts.test.ts
+++ b/tests/src/contracts.test.ts
@@ -36,7 +36,7 @@
 const gasLimit = 9000n * 1000000n;
 const marketContractAddress = '5CYN9j3YvRkqxewoxeSvRbhAym4465C57uMmX5j4yz99L5H6';
 
-describe('Contracts', () => {
+describe.skip('Contracts', () => {
   it('Can deploy smart contract Flipper, instantiate it and call it\'s get and flip messages.', async () => {
     await usingApi(async api => {
       const [contract, deployer] = await deployFlipper(api);
@@ -62,7 +62,7 @@
   });
 });
 
-describe.only('Chain extensions', () => {
+describe.skip('Chain extensions', () => {
   it('Transfer CE', async () => {
     await usingApi(async api => {
       const alice = privateKey('//Alice');
modifiedtests/src/enableContractSponsoring.test.tsdiffbeforeafterboth
--- a/tests/src/enableContractSponsoring.test.ts
+++ b/tests/src/enableContractSponsoring.test.ts
@@ -19,7 +19,7 @@
 chai.use(chaiAsPromised);
 const expect = chai.expect;
 
-describe('Integration Test enableContractSponsoring', () => {
+describe.skip('Integration Test enableContractSponsoring', () => {
   it('ensure tx fee is paid from endowment', async () => {
     await usingApi(async (api) => {
       const user = await findUnusedAddress(api);
@@ -64,7 +64,7 @@
 
 });
 
-describe('Negative Integration Test enableContractSponsoring', () => {
+describe.skip('Negative Integration Test enableContractSponsoring', () => {
   let alice: IKeyringPair;
 
   before(async () => {
addedtests/src/enableDisableTransfer.test.tsdiffbeforeafterboth
--- /dev/null
+++ b/tests/src/enableDisableTransfer.test.ts
@@ -0,0 +1,64 @@
+//
+// This file is subject to the terms and conditions defined in
+// file 'LICENSE', which is part of this source code package.
+//
+
+import chai from 'chai';
+import chaiAsPromised from 'chai-as-promised';
+import privateKey from './substrate/privateKey';
+import usingApi from './substrate/substrate-api';
+import {
+  createItemExpectSuccess,
+  createCollectionExpectSuccess,
+  transferExpectSuccess,
+  transferExpectFailure,
+  setTransferFlagExpectSuccess,
+  setTransferFlagExpectFailure,
+} from './util/helpers';
+
+chai.use(chaiAsPromised);
+
+describe('Enable/Disable Transfers', () => {
+  it('User can transfer token with enabled transfer flag', async () => {
+    await usingApi(async () => {
+      const Alice = privateKey('//Alice');
+      const Bob = privateKey('//Bob');
+      // nft
+      const nftCollectionId = await createCollectionExpectSuccess();
+      const newNftTokenId = await createItemExpectSuccess(Alice, nftCollectionId, 'NFT');
+
+      // explicitely set transfer flag
+      await setTransferFlagExpectSuccess(Alice, nftCollectionId, true);
+
+      await transferExpectSuccess(nftCollectionId, newNftTokenId, Alice, Bob, 1);
+    });
+  });
+
+  it('User can\'n transfer token with disabled transfer flag', async () => {
+    await usingApi(async () => {
+      const Alice = privateKey('//Alice');
+      const Bob = privateKey('//Bob');
+      // nft
+      const nftCollectionId = await createCollectionExpectSuccess();
+      const newNftTokenId = await createItemExpectSuccess(Alice, nftCollectionId, 'NFT');
+
+      // explicitely set transfer flag
+      await setTransferFlagExpectSuccess(Alice, nftCollectionId, false);
+
+      await transferExpectFailure(nftCollectionId, newNftTokenId, Alice, Bob, 1);
+    });
+  });
+});
+
+describe('Negative Enable/Disable Transfers', () => {
+  it('Non-owner cannot change transfer flag', async () => {
+    await usingApi(async () => {
+      const Bob = privateKey('//Bob');
+      // nft
+      const nftCollectionId = await createCollectionExpectSuccess();
+
+      // Change transfer flag
+      await setTransferFlagExpectFailure(Bob, nftCollectionId, false);
+    });
+  });
+});
modifiedtests/src/overflow.test.tsdiffbeforeafterboth
--- a/tests/src/overflow.test.ts
+++ b/tests/src/overflow.test.ts
@@ -8,7 +8,7 @@
 import chaiAsPromised from 'chai-as-promised';
 import privateKey from './substrate/privateKey';
 import usingApi from './substrate/substrate-api';
-import { approveExpectFail, approveExpectSuccess, createCollectionExpectSuccess, createFungibleItemExpectSuccess, getAllowance, getFungibleBalance, transferExpectFail, transferExpectSuccess, transferFromExpectFail, transferFromExpectSuccess, U128_MAX } from './util/helpers';
+import { approveExpectFail, approveExpectSuccess, createCollectionExpectSuccess, createFungibleItemExpectSuccess, getAllowance, getFungibleBalance, transferExpectFailure, transferExpectSuccess, transferFromExpectFail, transferFromExpectSuccess, U128_MAX } from './util/helpers';
 
 chai.use(chaiAsPromised);
 const expect = chai.expect;
@@ -33,7 +33,7 @@
     await transferExpectSuccess(fungibleCollectionId, 0, alice, bob, U128_MAX, 'Fungible');
 
     await createFungibleItemExpectSuccess(alice, fungibleCollectionId, { Value: 1n });
-    await transferExpectFail(fungibleCollectionId, 0, alice, bob, 1, 'Fungible');
+    await transferExpectFailure(fungibleCollectionId, 0, alice, bob, 1);
 
     expect(await getFungibleBalance(fungibleCollectionId, alice.address)).to.equal(1n);
     expect(await getFungibleBalance(fungibleCollectionId, bob.address)).to.equal(U128_MAX);
modifiedtests/src/pallet-presence.test.tsdiffbeforeafterboth
--- a/tests/src/pallet-presence.test.ts
+++ b/tests/src/pallet-presence.test.ts
@@ -13,13 +13,33 @@
 
 // Pallets that must always be present
 const requiredPallets = [
-  'nft', 'inflation', 'balances', 'contracts', 'randomnesscollectiveflip', 'system', 'timestamp', 'transactionpayment', 'treasury', 'vesting', 'evm', 'ethereum',
-  'scheduler', 'nftpayment', 'charging',
+  'balances',
+  'randomnesscollectiveflip',
+  'timestamp',
+  'transactionpayment',
+  'treasury',
+  'system',
+  'vesting',
+  'parachainsystem',
+  'parachaininfo',
+  'evm',
+  'ethereum',
+  'xcmpqueue',
+  'polkadotxcm',
+  'cumulusxcm',
+  'dmpqueue',
+  'inflation',
+  'nft',
+  'scheduler',
+  'nftpayment',
+  'charging',
 ];
 
 // Pallets that depend on consensus and governance configuration
 const consensusPallets = [
-  'sudo', 'aura',
+  'sudo',
+  'aura',
+  'auraext',
 ];
 
 describe('Pallet presence', () => {
modifiedtests/src/removeCollectionAdmin.test.tsdiffbeforeafterboth
--- a/tests/src/removeCollectionAdmin.test.ts
+++ b/tests/src/removeCollectionAdmin.test.ts
@@ -20,7 +20,7 @@
       const Alice = privateKey('//Alice');
       const Bob = privateKey('//Bob');
       const collection: any = (await api.query.nft.collectionById(collectionId)).toJSON();
-      expect(collection.Owner).to.be.deep.eq(normalizeAccountId(Alice.address));
+      expect(collection.Owner).to.be.deep.eq(Alice.address);
       // first - add collection admin Bob
       const addAdminTx = api.tx.nft.addCollectionAdmin(collectionId, normalizeAccountId(Bob.address));
       await submitTransactionAsync(Alice, addAdminTx);
modifiedtests/src/removeCollectionSponsor.test.tsdiffbeforeafterboth
--- a/tests/src/removeCollectionSponsor.test.ts
+++ b/tests/src/removeCollectionSponsor.test.ts
@@ -38,7 +38,7 @@
     });
   });
 
-  it('Remove NFT collection sponsor stops sponsorship', async () => {
+  it('Removing NFT collection sponsor stops sponsorship', async () => {
     const collectionId = await createCollectionExpectSuccess();
     await setCollectionSponsorExpectSuccess(collectionId, bob.address);
     await confirmSponsorshipExpectSuccess(collectionId, '//Bob');
modifiedtests/src/removeFromContractWhiteList.test.tsdiffbeforeafterboth
--- a/tests/src/removeFromContractWhiteList.test.ts
+++ b/tests/src/removeFromContractWhiteList.test.ts
@@ -10,7 +10,7 @@
 import { IKeyringPair } from '@polkadot/types/types';
 import { expect } from 'chai';
 
-describe('Integration Test removeFromContractWhiteList', () => {
+describe.skip('Integration Test removeFromContractWhiteList', () => {
   let bob: IKeyringPair;
 
   before(async () => {
@@ -54,7 +54,7 @@
   });
 });
 
-describe('Negative Integration Test removeFromContractWhiteList', () => {
+describe.skip('Negative Integration Test removeFromContractWhiteList', () => {
   let alice: IKeyringPair;
   let bob: IKeyringPair;
 
modifiedtests/src/scheduler.test.tsdiffbeforeafterboth
--- a/tests/src/scheduler.test.ts
+++ b/tests/src/scheduler.test.ts
@@ -28,7 +28,7 @@
       await setCollectionSponsorExpectSuccess(nftCollectionId, Alice.address);
       await confirmSponsorshipExpectSuccess(nftCollectionId);
 
-      await scheduleTransferExpectSuccess(nftCollectionId, newNftTokenId, Alice, Bob, 1, 'NFT');
+      await scheduleTransferExpectSuccess(nftCollectionId, newNftTokenId, Alice, Bob, 1, 6000, 4);
     });
   });
 });
modifiedtests/src/setConstOnChainSchema.test.tsdiffbeforeafterboth
--- a/tests/src/setConstOnChainSchema.test.ts
+++ b/tests/src/setConstOnChainSchema.test.ts
@@ -11,7 +11,6 @@
 import {
   createCollectionExpectSuccess,
   destroyCollectionExpectSuccess,
-  normalizeAccountId,
 } from './util/helpers';
 
 chai.use(chaiAsPromised);
@@ -38,7 +37,7 @@
     await usingApi(async (api) => {
       const collectionId = await createCollectionExpectSuccess();
       const collection: any = (await api.query.nft.collectionById(collectionId)).toJSON();
-      expect(collection.Owner).to.be.deep.eq(normalizeAccountId(Alice.address));
+      expect(collection.Owner).to.be.eq(Alice.address);
       const setShema = api.tx.nft.setConstOnChainSchema(collectionId, Shema);
       await submitTransactionAsync(Alice, setShema);
     });
@@ -88,7 +87,7 @@
     await usingApi(async (api) => {
       const collectionId = await createCollectionExpectSuccess();
       const collection: any = (await api.query.nft.collectionById(collectionId)).toJSON();
-      expect(collection.Owner).to.be.deep.eq(normalizeAccountId(Alice.address));
+      expect(collection.Owner).to.be.eq(Alice.address);
       const setShema = api.tx.nft.setConstOnChainSchema(collectionId, Shema);
       await expect(submitTransactionExpectFailAsync(Bob, setShema)).to.be.rejected;
     });
modifiedtests/src/setContractSponsoringRateLimit.test.tsdiffbeforeafterboth
--- a/tests/src/setContractSponsoringRateLimit.test.ts
+++ b/tests/src/setContractSponsoringRateLimit.test.ts
@@ -15,7 +15,7 @@
   setContractSponsoringRateLimitExpectSuccess,
 } from './util/helpers';
 
-describe('Integration Test setContractSponsoringRateLimit', () => {
+describe.skip('Integration Test setContractSponsoringRateLimit', () => {
   it('ensure sponsored contract can\'t be called twice without pause for free', async () => {
     await usingApi(async (api) => {
       const user = await findUnusedAddress(api);
@@ -42,7 +42,7 @@
   });
 });
 
-describe('Negative Integration Test setContractSponsoringRateLimit', () => {
+describe.skip('Negative Integration Test setContractSponsoringRateLimit', () => {
   let alice: IKeyringPair;
 
   before(async () => {
modifiedtests/src/setVariableOnChainSchema.test.tsdiffbeforeafterboth
--- a/tests/src/setVariableOnChainSchema.test.ts
+++ b/tests/src/setVariableOnChainSchema.test.ts
@@ -11,7 +11,6 @@
 import {
   createCollectionExpectSuccess,
   destroyCollectionExpectSuccess,
-  normalizeAccountId,
 } from './util/helpers';
 
 chai.use(chaiAsPromised);
@@ -38,7 +37,7 @@
     await usingApi(async (api) => {
       const collectionId = await createCollectionExpectSuccess();
       const collection: any = (await api.query.nft.collectionById(collectionId)).toJSON();
-      expect(collection.Owner).to.be.deep.eq(normalizeAccountId(Alice.address));
+      expect(collection.Owner).to.be.eq(Alice.address);
       const setSchema = api.tx.nft.setVariableOnChainSchema(collectionId, Schema);
       await submitTransactionAsync(Alice, setSchema);
     });
@@ -88,7 +87,7 @@
     await usingApi(async (api) => {
       const collectionId = await createCollectionExpectSuccess();
       const collection: any = (await api.query.nft.collectionById(collectionId)).toJSON();
-      expect(collection.Owner).to.be.deep.eq(normalizeAccountId(Alice.address));
+      expect(collection.Owner).to.be.eq(Alice.address);
       const setSchema = api.tx.nft.setVariableOnChainSchema(collectionId, Schema);
       await expect(submitTransactionExpectFailAsync(Bob, setSchema)).to.be.rejected;
     });
modifiedtests/src/substrate/substrate-api.tsdiffbeforeafterboth
--- a/tests/src/substrate/substrate-api.ts
+++ b/tests/src/substrate/substrate-api.ts
@@ -33,11 +33,20 @@
   // TODO: Remove, this is temporary: Filter unneeded API output 
   // (Jaco promised it will be removed in the next version)
   const consoleErr = console.error;
-  console.error = (message: string) => {
-    if (!message.includes('StorageChangeSet:: WebSocket is not connected') || message.includes('2021-'))
+  const consoleLog = console.log;
+  const consoleWarn = console.warn;
+
+  const outFn = (message: string) => {
+    if (!message.includes('StorageChangeSet:: WebSocket is not connected') && 
+        !message.includes('2021-') &&
+        !message.includes('StorageChangeSet:: Normal connection closure'))
       consoleErr(message);
   };
 
+  console.error = outFn;
+  console.log = outFn;
+  console.warn = outFn;
+
   try {
     await promisifySubstrate(api, async () => {
       if (api) {
@@ -48,6 +57,8 @@
   } finally {
     await api.disconnect();
     console.error = consoleErr;
+    console.log = consoleLog;
+    console.warn = consoleWarn;
   }
   return result as T;
 }
modifiedtests/src/toggleContractWhiteList.test.tsdiffbeforeafterboth
--- a/tests/src/toggleContractWhiteList.test.ts
+++ b/tests/src/toggleContractWhiteList.test.ts
@@ -21,7 +21,7 @@
 const value = 0;
 const gasLimit = 3000n * 1000000n;
 
-describe('Integration Test toggleContractWhiteList', () => {
+describe.skip('Integration Test toggleContractWhiteList', () => {
 
   it('Enable white list contract mode', async () => {
     await usingApi(async api => {
@@ -121,7 +121,7 @@
 
 });
 
-describe('Negative Integration Test toggleContractWhiteList', () => {
+describe.skip('Negative Integration Test toggleContractWhiteList', () => {
 
   it('Enable white list for a non-contract', async () => {
     await usingApi(async api => {
modifiedtests/src/transfer.test.tsdiffbeforeafterboth
--- a/tests/src/transfer.test.ts
+++ b/tests/src/transfer.test.ts
@@ -16,7 +16,7 @@
   findUnusedAddress,
   getCreateCollectionResult,
   getCreateItemResult,
-  transferExpectFail,
+  transferExpectFailure,
   transferExpectSuccess,
 } from './util/helpers';
 
@@ -103,13 +103,13 @@
     await usingApi(async (api) => {
       // nft
       const nftCollectionCount = await api.query.nft.createdCollectionCount() as unknown as number;
-      await transferExpectFail(nftCollectionCount + 1, 1, Alice, Bob, 1);
+      await transferExpectFailure(nftCollectionCount + 1, 1, Alice, Bob, 1);
       // fungible
       const fungibleCollectionCount = await api.query.nft.createdCollectionCount() as unknown as number;
-      await transferExpectFail(fungibleCollectionCount + 1, 1, Alice, Bob, 1);
+      await transferExpectFailure(fungibleCollectionCount + 1, 1, Alice, Bob, 1);
       // reFungible
       const reFungibleCollectionCount = await api.query.nft.createdCollectionCount() as unknown as number;
-      await transferExpectFail(reFungibleCollectionCount + 1, 1, Alice, Bob, 1);
+      await transferExpectFailure(reFungibleCollectionCount + 1, 1, Alice, Bob, 1);
     });
   });
   it('Transfer with deleted collection_id', async () => {
@@ -117,43 +117,41 @@
     const nftCollectionId = await createCollectionExpectSuccess();
     const newNftTokenId = await createItemExpectSuccess(Alice, nftCollectionId, 'NFT');
     await destroyCollectionExpectSuccess(nftCollectionId);
-    await transferExpectFail(nftCollectionId, newNftTokenId, Alice, Bob, 1, 'NFT');
+    await transferExpectFailure(nftCollectionId, newNftTokenId, Alice, Bob, 1);
     // fungible
     const fungibleCollectionId = await createCollectionExpectSuccess({mode: {type: 'Fungible', decimalPoints: 0}});
     const newFungibleTokenId = await createItemExpectSuccess(Alice, fungibleCollectionId, 'Fungible');
     await destroyCollectionExpectSuccess(fungibleCollectionId);
-    await transferExpectFail(fungibleCollectionId, newFungibleTokenId, Alice, Bob, 1, 'Fungible');
+    await transferExpectFailure(fungibleCollectionId, newFungibleTokenId, Alice, Bob, 1);
     // reFungible
     const reFungibleCollectionId = await
     createCollectionExpectSuccess({mode: {type: 'ReFungible'}});
     const newReFungibleTokenId = await createItemExpectSuccess(Alice, reFungibleCollectionId, 'ReFungible');
     await destroyCollectionExpectSuccess(reFungibleCollectionId);
-    await transferExpectFail(
+    await transferExpectFailure(
       reFungibleCollectionId,
       newReFungibleTokenId,
       Alice,
       Bob,
       1,
-      'ReFungible',
     );
   });
   it('Transfer with not existed item_id', async () => {
     // nft
     const nftCollectionId = await createCollectionExpectSuccess();
-    await transferExpectFail(nftCollectionId, 2, Alice, Bob, 1, 'NFT');
+    await transferExpectFailure(nftCollectionId, 2, Alice, Bob, 1);
     // fungible
     const fungibleCollectionId = await createCollectionExpectSuccess({mode: {type: 'Fungible', decimalPoints: 0}});
-    await transferExpectFail(fungibleCollectionId, 2, Alice, Bob, 1, 'Fungible');
+    await transferExpectFailure(fungibleCollectionId, 2, Alice, Bob, 1);
     // reFungible
     const reFungibleCollectionId = await
     createCollectionExpectSuccess({mode: {type: 'ReFungible'}});
-    await transferExpectFail(
+    await transferExpectFailure(
       reFungibleCollectionId,
       2,
       Alice,
       Bob,
       1,
-      'ReFungible',
     );
   });
   it('Transfer with deleted item_id', async () => {
@@ -161,46 +159,44 @@
     const nftCollectionId = await createCollectionExpectSuccess();
     const newNftTokenId = await createItemExpectSuccess(Alice, nftCollectionId, 'NFT');
     await burnItemExpectSuccess(Alice, nftCollectionId, newNftTokenId, 1);
-    await transferExpectFail(nftCollectionId, newNftTokenId, Alice, Bob, 1, 'NFT');
+    await transferExpectFailure(nftCollectionId, newNftTokenId, Alice, Bob, 1);
     // fungible
     const fungibleCollectionId = await createCollectionExpectSuccess({mode: {type: 'Fungible', decimalPoints: 0}});
     const newFungibleTokenId = await createItemExpectSuccess(Alice, fungibleCollectionId, 'Fungible');
     await burnItemExpectSuccess(Alice, fungibleCollectionId, newFungibleTokenId, 10);
-    await transferExpectFail(fungibleCollectionId, newFungibleTokenId, Alice, Bob, 1, 'Fungible');
+    await transferExpectFailure(fungibleCollectionId, newFungibleTokenId, Alice, Bob, 1);
     // reFungible
     const reFungibleCollectionId = await
     createCollectionExpectSuccess({mode: {type: 'ReFungible'}});
     const newReFungibleTokenId = await createItemExpectSuccess(Alice, reFungibleCollectionId, 'ReFungible');
     await burnItemExpectSuccess(Alice, reFungibleCollectionId, newReFungibleTokenId, 1);
-    await transferExpectFail(
+    await transferExpectFailure(
       reFungibleCollectionId,
       newReFungibleTokenId,
       Alice,
       Bob,
       1,
-      'ReFungible',
     );
   });
   it('Transfer with recipient that is not owner', async () => {
     // nft
     const nftCollectionId = await createCollectionExpectSuccess();
     const newNftTokenId = await createItemExpectSuccess(Alice, nftCollectionId, 'NFT');
-    await transferExpectFail(nftCollectionId, newNftTokenId, Charlie, Bob, 1, 'NFT');
+    await transferExpectFailure(nftCollectionId, newNftTokenId, Charlie, Bob, 1);
     // fungible
     const fungibleCollectionId = await createCollectionExpectSuccess({mode: {type: 'Fungible', decimalPoints: 0}});
     const newFungibleTokenId = await createItemExpectSuccess(Alice, fungibleCollectionId, 'Fungible');
-    await transferExpectFail(fungibleCollectionId, newFungibleTokenId, Charlie, Bob, 1, 'Fungible');
+    await transferExpectFailure(fungibleCollectionId, newFungibleTokenId, Charlie, Bob, 1);
     // reFungible
     const reFungibleCollectionId = await
     createCollectionExpectSuccess({mode: {type: 'ReFungible'}});
     const newReFungibleTokenId = await createItemExpectSuccess(Alice, reFungibleCollectionId, 'ReFungible');
-    await transferExpectFail(
+    await transferExpectFailure(
       reFungibleCollectionId,
       newReFungibleTokenId,
       Charlie,
       Bob,
       1,
-      'ReFungible',
     );
   });
 });
modifiedtests/src/util/helpers.tsdiffbeforeafterboth
--- a/tests/src/util/helpers.ts
+++ b/tests/src/util/helpers.ts
@@ -84,7 +84,7 @@
 }
 
 interface ITokenDataType {
-  Owner: number[];
+  Owner: IKeyringPair;
   ConstData: number[];
   VariableData: number[];
 }
@@ -523,6 +523,30 @@
   });
 }
 
+export async function setTransferFlagExpectSuccess(sender: IKeyringPair, collectionId: number, enabled: boolean) {
+
+  await usingApi(async (api) => {
+
+    const tx = api.tx.nft.setTransfersEnabledFlag (collectionId, enabled);
+    const events = await submitTransactionAsync(sender, tx);
+    const result = getGenericResult(events);
+
+    expect(result.success).to.be.true;
+  }); 
+}
+
+export async function setTransferFlagExpectFailure(sender: IKeyringPair, collectionId: number, enabled: boolean) {
+
+  await usingApi(async (api) => {
+
+    const tx = api.tx.nft.setTransfersEnabledFlag (collectionId, enabled);
+    const events = await expect(submitTransactionExpectFailAsync(sender, tx)).to.be.rejected;
+    const result = getGenericResult(events);
+
+    expect(result.success).to.be.false;
+  }); 
+}
+
 export async function setContractSponsoringRateLimitExpectSuccess(sender: IKeyringPair, contractAddress: AccountId | string, rateLimit: number) {
   await usingApi(async (api) => {
     const tx = api.tx.nft.setContractSponsoringRateLimit(contractAddress, rateLimit);
@@ -543,9 +567,9 @@
   });
 }
 
-export async function toggleContractWhitelistExpectSuccess(sender: IKeyringPair, contractAddress: AccountId | string) {
+export async function toggleContractWhitelistExpectSuccess(sender: IKeyringPair, contractAddress: AccountId | string, value = true) {
   await usingApi(async (api) => {
-    const tx = api.tx.nft.toggleContractWhiteList(contractAddress, true);
+    const tx = api.tx.nft.toggleContractWhiteList(contractAddress, value);
     const events = await submitTransactionAsync(sender, tx);
     const result = getGenericResult(events);
 
@@ -748,29 +772,31 @@
   sender: IKeyringPair,
   recipient: IKeyringPair,
   value: number | bigint = 1,
+  blockTimeMs: number,
+  blockSchedule: number,
 ) {
   await usingApi(async (api: ApiPromise) => {
     const blockNumber: number | undefined = await getBlockNumber(api);
-    const expectedBlockNumber = blockNumber + 2;
+    const expectedBlockNumber = blockNumber + blockSchedule;
 
     expect(blockNumber).to.be.greaterThan(0);
-    const transferTx = await api.tx.nft.transfer(recipient.address, collectionId, tokenId, value); 
+    const transferTx = await api.tx.nft.transfer(normalizeAccountId(recipient.address), collectionId, tokenId, value); 
     const scheduleTx = await api.tx.scheduler.schedule(expectedBlockNumber, null, 0, transferTx);
 
     await submitTransactionAsync(sender, scheduleTx);
 
     const recipientBalanceBefore = new BigNumber((await api.query.system.account(recipient.address)).data.free.toString());
 
-    const nftItemDataBefore = (await api.query.nft.nftItemList(collectionId, tokenId)).toJSON() as unknown as ITokenDataType;
-    expect(nftItemDataBefore.Owner.toString()).to.be.equal(sender.address);
+    const nftItemDataBefore = (await api.query.nft.nftItemList(collectionId, tokenId)).toJSON() as any as ITokenDataType;
+    expect(toSubstrateAddress(nftItemDataBefore.Owner)).to.be.equal(sender.address);
 
-    // sleep for 2 blocks
-    await new Promise(resolve => setTimeout(resolve, 6000 * 2));
+    // sleep for 4 blocks
+    await new Promise(resolve => setTimeout(resolve, blockTimeMs * (blockSchedule + 1)));
 
     const recipientBalanceAfter = new BigNumber((await api.query.system.account(recipient.address)).data.free.toString());
 
     const nftItemData = (await api.query.nft.nftItemList(collectionId, tokenId)).toJSON() as unknown as ITokenDataType;
-    expect(nftItemData.Owner.toString()).to.be.equal(recipient.address);
+    expect(toSubstrateAddress(nftItemData.Owner)).to.be.equal(recipient.address);
     expect(recipientBalanceAfter.toNumber()).to.be.equal(recipientBalanceBefore.toNumber());
   });
 }
@@ -820,7 +846,7 @@
 }
 
 export async function
-transferExpectFail(
+transferExpectFailure(
   collectionId: number,
   tokenId: number,
   sender: IKeyringPair,
@@ -895,7 +921,8 @@
       const createData = { refungible: { const_data: [], variable_data: [], pieces: 100 } };
       tx = api.tx.nft.createItem(collectionId, to, createData);
     } else {
-      tx = api.tx.nft.createItem(collectionId, to, createMode);
+      const createData = { nft: { const_data: [], variable_data: [] } };
+      tx = api.tx.nft.createItem(collectionId, to, createData);
     }
 
     const events = await submitTransactionAsync(sender, tx);
modifiedtests/yarn.lockdiffbeforeafterboth
--- a/tests/yarn.lock
+++ b/tests/yarn.lock
@@ -42,7 +42,7 @@
   resolved "https://registry.yarnpkg.com/@babel/compat-data/-/compat-data-7.14.7.tgz#7b047d7a3a89a67d2258dc61f604f098f1bc7e08"
   integrity sha512-nS6dZaISCXJ3+518CWiBfEr//gHyMO02uDxBkXTKZDN5POruCnOZ1N4YBRZDCabwF8nZMWBpRxIicmXtBs+fvw==
 
-"@babel/core@^7.1.0", "@babel/core@^7.14.5", "@babel/core@^7.14.6", "@babel/core@^7.7.2", "@babel/core@^7.7.5":
+"@babel/core@^7.1.0", "@babel/core@^7.14.6", "@babel/core@^7.7.2", "@babel/core@^7.7.5":
   version "7.14.6"
   resolved "https://registry.yarnpkg.com/@babel/core/-/core-7.14.6.tgz#e0814ec1a950032ff16c13a2721de39a8416fcab"
   integrity sha512-gJnOEWSqTk96qG5BoIrl5bVtc23DCycmIePPYnamY9RboYdI4nFy5vAQMSl81O5K/W0sLDWfGysnOECC+KUUCA==
@@ -971,7 +971,7 @@
     pirates "^4.0.0"
     source-map-support "^0.5.16"
 
-"@babel/runtime@^7.13.9", "@babel/runtime@^7.14.5", "@babel/runtime@^7.14.6", "@babel/runtime@^7.8.4":
+"@babel/runtime@^7.14.6", "@babel/runtime@^7.8.4":
   version "7.14.6"
   resolved "https://registry.yarnpkg.com/@babel/runtime/-/runtime-7.14.6.tgz#535203bc0892efc7dec60bdc27b2ecf6e409062d"
   integrity sha512-/PCB2uJ7oM44tz8YhC4Z/6PeOKXp4K588f+5M3clr1M4zbqztlo0XEfJ2LEzj/FgwfgGcIdl8n7YYjTCI0BYwg==
@@ -1019,21 +1019,6 @@
   version "0.4.2"
   resolved "https://registry.yarnpkg.com/@eslint/eslintrc/-/eslintrc-0.4.2.tgz#f63d0ef06f5c0c57d76c4ab5f63d3835c51b0179"
   integrity sha512-8nmGq/4ycLpIwzvhI4tNDmQztZ8sp+hI7cyG8i1nQDhkAbRzHpXPidRAHlNvCZQpJTKw5ItIpMw9RSToGF00mg==
-  dependencies:
-    ajv "^6.12.4"
-    debug "^4.1.1"
-    espree "^7.3.0"
-    globals "^13.9.0"
-    ignore "^4.0.6"
-    import-fresh "^3.2.1"
-    js-yaml "^3.13.1"
-    minimatch "^3.0.4"
-    strip-json-comments "^3.1.1"
-
-"@eslint/eslintrc@^0.4.3":
-  version "0.4.3"
-  resolved "https://registry.yarnpkg.com/@eslint/eslintrc/-/eslintrc-0.4.3.tgz#9e42981ef035beb3dd49add17acb96e8ff6f394c"
-  integrity sha512-J6KFFz5QCYUJq3pf0mjEcCJVERbzv71PUIDczuh9JkwGEzced6CO5ADLHB1rbf/+oPBtoPfMYNOpGDzCANlbXw==
   dependencies:
     ajv "^6.12.4"
     debug "^4.1.1"
@@ -1559,47 +1544,46 @@
   dependencies:
     "@octokit/openapi-types" "^7.3.2"
 
-"@polkadot/api-contract@4.15.1":
-  version "4.15.1"
-  resolved "https://registry.yarnpkg.com/@polkadot/api-contract/-/api-contract-4.15.1.tgz#bfa5aa67b2cdc3c203ed09cfd14c396469eeafa2"
-  integrity sha512-TyKc6fyBMJnrHhnicM2hTCQMZMfd5Baarz4L75QMxkWFLTpxQ68BnYFcdupfH6fNXHZeHdRpSW/KPBj47UYgeA==
+"@polkadot/api-contract@5.0.1":
+  version "5.0.1"
+  resolved "https://registry.yarnpkg.com/@polkadot/api-contract/-/api-contract-5.0.1.tgz#520a7b3cd990a76374b79e12eca5bf629cc565a1"
+  integrity sha512-qZ2wnXHDyU2c1/V9GKpbcZKBfVua4YFsU/LHKevZLkJfnGFBgNRdwAuKgVe5h2FCt2W2/pt618WgxG0UDWwjcw==
   dependencies:
-    "@babel/runtime" "^7.14.5"
-    "@polkadot/api" "4.15.1"
-    "@polkadot/types" "4.15.1"
-    "@polkadot/util" "^6.9.1"
-    "@polkadot/x-rxjs" "^6.9.1"
+    "@babel/runtime" "^7.14.6"
+    "@polkadot/api" "5.0.1"
+    "@polkadot/types" "5.0.1"
+    "@polkadot/util" "^7.0.1"
+    rxjs "^7.2.0"
 
-"@polkadot/api-derive@4.15.1":
-  version "4.15.1"
-  resolved "https://registry.yarnpkg.com/@polkadot/api-derive/-/api-derive-4.15.1.tgz#841ae233142f4b509d4db1fbcf76db15a77bed0f"
-  integrity sha512-gAkKg4w09PThemRz0VI4YDzTy3RfCJrjpR0ZnYT93lZWsspSDiQIzMOTPbOn7MvC7FujeRIT0zqpzDeqKc4wFQ==
+"@polkadot/api-derive@5.0.1":
+  version "5.0.1"
+  resolved "https://registry.yarnpkg.com/@polkadot/api-derive/-/api-derive-5.0.1.tgz#08064c10ed159826ffd07013dcdde1d8b63186a0"
+  integrity sha512-JZpH1JVLu3PvX4+A71iDLtNr6LL103dAFou61DxyJF4obyTmS2lzigG3xXqUFShiPDb19ywxQpsE4gAOP6emuQ==
   dependencies:
-    "@babel/runtime" "^7.14.5"
-    "@polkadot/api" "4.15.1"
-    "@polkadot/rpc-core" "4.15.1"
-    "@polkadot/types" "4.15.1"
-    "@polkadot/util" "^6.9.1"
-    "@polkadot/util-crypto" "^6.9.1"
-    "@polkadot/x-rxjs" "^6.9.1"
+    "@babel/runtime" "^7.14.6"
+    "@polkadot/api" "5.0.1"
+    "@polkadot/rpc-core" "5.0.1"
+    "@polkadot/types" "5.0.1"
+    "@polkadot/util" "^7.0.1"
+    "@polkadot/util-crypto" "^7.0.1"
+    rxjs "^7.2.0"
 
-"@polkadot/api@4.15.1":
-  version "4.15.1"
-  resolved "https://registry.yarnpkg.com/@polkadot/api/-/api-4.15.1.tgz#c9a041b855639a98d6df0706c7546e076a8d5727"
-  integrity sha512-MsGKpTAmnkxIN+Zu21NPKWot4xLsDGn/cdranf+P2OjqB80E6m8zkQOE7ug3912WIi5byZp55TSOE9UUzAAW3Q==
+"@polkadot/api@5.0.1":
+  version "5.0.1"
+  resolved "https://registry.yarnpkg.com/@polkadot/api/-/api-5.0.1.tgz#9607b53009322f9264f7dcc8705c466bd33aa516"
+  integrity sha512-5JDpM2Fjc80gHBju1B/rMBGDfAvY8UiU4XVlivJRk+mTVD3OTwbtTro4nmwJOub05xQCJvD/bnCuxG8eFSoq+Q==
   dependencies:
-    "@babel/runtime" "^7.14.5"
-    "@polkadot/api-derive" "4.15.1"
-    "@polkadot/keyring" "^6.9.1"
-    "@polkadot/metadata" "4.15.1"
-    "@polkadot/rpc-core" "4.15.1"
-    "@polkadot/rpc-provider" "4.15.1"
-    "@polkadot/types" "4.15.1"
-    "@polkadot/types-known" "4.15.1"
-    "@polkadot/util" "^6.9.1"
-    "@polkadot/util-crypto" "^6.9.1"
-    "@polkadot/x-rxjs" "^6.9.1"
+    "@babel/runtime" "^7.14.6"
+    "@polkadot/api-derive" "5.0.1"
+    "@polkadot/keyring" "^7.0.1"
+    "@polkadot/rpc-core" "5.0.1"
+    "@polkadot/rpc-provider" "5.0.1"
+    "@polkadot/types" "5.0.1"
+    "@polkadot/types-known" "5.0.1"
+    "@polkadot/util" "^7.0.1"
+    "@polkadot/util-crypto" "^7.0.1"
     eventemitter3 "^4.0.7"
+    rxjs "^7.2.0"
 
 "@polkadot/dev@0.62.43":
   version "0.62.43"
@@ -1665,57 +1649,45 @@
     typescript "^4.3.4"
     yargs "^17.0.1"
 
-"@polkadot/keyring@^6.9.1":
-  version "6.9.1"
-  resolved "https://registry.yarnpkg.com/@polkadot/keyring/-/keyring-6.9.1.tgz#a92dd2d4ef8ccb999bc7d443ef4a13e6ef9b2ce2"
-  integrity sha512-UF+9psVwVlar7LRJYWJB/xETYBPu1OcyVrxDe88w17Y+ZIsIeNfcR9quVS4M7AdAhplmscsz/wgEMjmggXH9/Q==
-  dependencies:
-    "@babel/runtime" "^7.14.5"
-    "@polkadot/util" "6.9.1"
-    "@polkadot/util-crypto" "6.9.1"
-
-"@polkadot/metadata@4.15.1":
-  version "4.15.1"
-  resolved "https://registry.yarnpkg.com/@polkadot/metadata/-/metadata-4.15.1.tgz#3cd2392b956577edf96090793fd8b9b392a67502"
-  integrity sha512-pnOgJSFCVgQpZtp7ghS0AS7xWCp6POKrb5LhY1CK7XTy6iQ6VHcGnr1N4wfia1c3o5ZOPj8Xic29Da61tkjp2Q==
+"@polkadot/keyring@^7.0.1":
+  version "7.0.1"
+  resolved "https://registry.yarnpkg.com/@polkadot/keyring/-/keyring-7.0.1.tgz#666e903661b98279dc16d512be69f5ace4b58d8d"
+  integrity sha512-eSvG8Q4gUTRDFWj2lqTY/9NekGP8dtp+W6WmouKh0DDwHRawaVeDaq6UJYQv6XoBG1i+ZGPvErRQeGMPOn/mUQ==
   dependencies:
-    "@babel/runtime" "^7.14.5"
-    "@polkadot/types" "4.15.1"
-    "@polkadot/types-known" "4.15.1"
-    "@polkadot/util" "^6.9.1"
-    "@polkadot/util-crypto" "^6.9.1"
+    "@babel/runtime" "^7.14.6"
+    "@polkadot/util" "7.0.1"
+    "@polkadot/util-crypto" "7.0.1"
 
-"@polkadot/networks@6.9.1", "@polkadot/networks@^6.9.1":
-  version "6.9.1"
-  resolved "https://registry.yarnpkg.com/@polkadot/networks/-/networks-6.9.1.tgz#8d66338569c9891a00cc6737e18c1dbffd7153f5"
-  integrity sha512-imBPIrLN0W+7zuosD4WBtOkMzXc/271NhWn6dQmyA0xEoJx+6coJHQH/04fqO/gfZd4M1R70f3Gt5hlsfzCwlA==
+"@polkadot/networks@7.0.1", "@polkadot/networks@^7.0.1":
+  version "7.0.1"
+  resolved "https://registry.yarnpkg.com/@polkadot/networks/-/networks-7.0.1.tgz#e07c4b88e25711433e76d24fce4c7273c25dd38b"
+  integrity sha512-bJSvI7UgEpxmBKS8TMh+I1mfmCMwhClGdSs29kwU+K61IjBTKTt3yQJ/SflYIQV7QftGbz3oMfSkGbQbRHZqvQ==
   dependencies:
-    "@babel/runtime" "^7.14.5"
+    "@babel/runtime" "^7.14.6"
 
-"@polkadot/rpc-core@4.15.1":
-  version "4.15.1"
-  resolved "https://registry.yarnpkg.com/@polkadot/rpc-core/-/rpc-core-4.15.1.tgz#2e14edcdf8cd4e6f9658ecbd90540a9d39c3e929"
-  integrity sha512-g9NxsHgOBzqLBWGV+hbXd8tmDWBdIZSxr3b107xY090wbQQ0R9I6D6wi+d7mJtcH1tazuhQgWQqyvvsbr2xPZg==
+"@polkadot/rpc-core@5.0.1":
+  version "5.0.1"
+  resolved "https://registry.yarnpkg.com/@polkadot/rpc-core/-/rpc-core-5.0.1.tgz#8460287532fe61c31505564df53e92ef6feba875"
+  integrity sha512-JMNOVQijjyJZNu9B8CJwIrQzGYzAp03uCBSbqYfzWBFnYVLKh7JmvOlkLnODM8uUYq0gVN4BaDUSPc39GpELAQ==
   dependencies:
-    "@babel/runtime" "^7.14.5"
-    "@polkadot/metadata" "4.15.1"
-    "@polkadot/rpc-provider" "4.15.1"
-    "@polkadot/types" "4.15.1"
-    "@polkadot/util" "^6.9.1"
-    "@polkadot/x-rxjs" "^6.9.1"
+    "@babel/runtime" "^7.14.6"
+    "@polkadot/rpc-provider" "5.0.1"
+    "@polkadot/types" "5.0.1"
+    "@polkadot/util" "^7.0.1"
+    rxjs "^7.2.0"
 
-"@polkadot/rpc-provider@4.15.1":
-  version "4.15.1"
-  resolved "https://registry.yarnpkg.com/@polkadot/rpc-provider/-/rpc-provider-4.15.1.tgz#18a61b5353388da73f722f30905f23927b2c5e31"
-  integrity sha512-NfgdBsLP56XAIrSu29iKmqLb4ZAbK50VINGv3Qi99s5V2FiFOAvZq22arkoCmFo1q4zFpQeQqul3ZyZv8QX/Kg==
+"@polkadot/rpc-provider@5.0.1":
+  version "5.0.1"
+  resolved "https://registry.yarnpkg.com/@polkadot/rpc-provider/-/rpc-provider-5.0.1.tgz#ef022a123eb9073634b59c6e0f6e1705e96066a5"
+  integrity sha512-t+VKhMtQfQVgkZDqYnP/44KlBDmcCVo1/MvJ+DoNd7RUWUIBJt3v71G5gDSNeGMTyvxn0KK0qL4j+Nqr6c4FUQ==
   dependencies:
-    "@babel/runtime" "^7.14.5"
-    "@polkadot/types" "4.15.1"
-    "@polkadot/util" "^6.9.1"
-    "@polkadot/util-crypto" "^6.9.1"
-    "@polkadot/x-fetch" "^6.9.1"
-    "@polkadot/x-global" "^6.9.1"
-    "@polkadot/x-ws" "^6.9.1"
+    "@babel/runtime" "^7.14.6"
+    "@polkadot/types" "5.0.1"
+    "@polkadot/util" "^7.0.1"
+    "@polkadot/util-crypto" "^7.0.1"
+    "@polkadot/x-fetch" "^7.0.1"
+    "@polkadot/x-global" "^7.0.1"
+    "@polkadot/x-ws" "^7.0.1"
     eventemitter3 "^4.0.7"
 
 "@polkadot/ts@0.3.89":
@@ -1725,57 +1697,55 @@
   dependencies:
     "@types/chrome" "^0.0.144"
 
-"@polkadot/typegen@4.15.1":
-  version "4.15.1"
-  resolved "https://registry.yarnpkg.com/@polkadot/typegen/-/typegen-4.15.1.tgz#e04d5ef70712bfc91707723a1ae0198e5309ed75"
-  integrity sha512-gIk3GdgNuRp0GnbrljUVUgrsT7GLbGcNmI/Jbnt64Zyw20beMrvPQyDkoRBWrN4aN14B1SW1xIXQz4axVy7Tug==
+"@polkadot/typegen@5.0.1":
+  version "5.0.1"
+  resolved "https://registry.yarnpkg.com/@polkadot/typegen/-/typegen-5.0.1.tgz#718b517f4f1578441911096603577bd0a2a968e0"
+  integrity sha512-iFLJoWgIkn+J6MDw3AUWveP9qxVn1C+VeLJbpZ21St5WyeE148Tml0BmYnKLSXlaPMhZEwB+/IV3jpQ35dH4bw==
   dependencies:
-    "@babel/core" "^7.14.5"
+    "@babel/core" "^7.14.6"
     "@babel/register" "^7.14.5"
-    "@babel/runtime" "^7.14.5"
-    "@polkadot/api" "4.15.1"
-    "@polkadot/metadata" "4.15.1"
-    "@polkadot/rpc-provider" "4.15.1"
-    "@polkadot/types" "4.15.1"
-    "@polkadot/util" "^6.9.1"
+    "@babel/runtime" "^7.14.6"
+    "@polkadot/api" "5.0.1"
+    "@polkadot/rpc-provider" "5.0.1"
+    "@polkadot/types" "5.0.1"
+    "@polkadot/util" "^7.0.1"
     handlebars "^4.7.7"
     websocket "^1.0.34"
     yargs "^17.0.1"
 
-"@polkadot/types-known@4.15.1":
-  version "4.15.1"
-  resolved "https://registry.yarnpkg.com/@polkadot/types-known/-/types-known-4.15.1.tgz#d60cfb1e4ed315f2c82646795243a34df6b21fd3"
-  integrity sha512-yj2fVwEyYrc6eBoW6W3JQ5h1FZjcyyhDzfrtxronSLdT7H6zUtlLqn1A5uzkxPD0eSXkesh960GHeYzAi+p4cw==
+"@polkadot/types-known@5.0.1":
+  version "5.0.1"
+  resolved "https://registry.yarnpkg.com/@polkadot/types-known/-/types-known-5.0.1.tgz#21feb327fc4323733bf027c8d874a2aa3014b21f"
+  integrity sha512-AIhPlN4r14ZW4wdwHZD2nIe1DE61ZO9PsyrCyAU3ysl6Cw6TI+txDCN3aS/8XYuC7wDLEgLB9vJv2sVWdCzqJg==
   dependencies:
-    "@babel/runtime" "^7.14.5"
-    "@polkadot/networks" "^6.9.1"
-    "@polkadot/types" "4.15.1"
-    "@polkadot/util" "^6.9.1"
+    "@babel/runtime" "^7.14.6"
+    "@polkadot/networks" "^7.0.1"
+    "@polkadot/types" "5.0.1"
+    "@polkadot/util" "^7.0.1"
 
-"@polkadot/types@4.15.1":
-  version "4.15.1"
-  resolved "https://registry.yarnpkg.com/@polkadot/types/-/types-4.15.1.tgz#03f32fd4ce81d69c43368d3e476c0421cedb8607"
-  integrity sha512-daCblGDkiNHyDNkVDOQ0x/hblK7zkGAFQy+ykMt6euGGllUiKaAbCKlQN803aKmsB/5m8zQU63MHQC65tkpWXg==
+"@polkadot/types@5.0.1":
+  version "5.0.1"
+  resolved "https://registry.yarnpkg.com/@polkadot/types/-/types-5.0.1.tgz#2a4e23e452f999eeae175b595470df0e426a930d"
+  integrity sha512-aN6JKeF7ZYi5irYAaUoDqth6qlOlB15C5vhlDOojEorYLfRs/R+GCrO+lPSs+bKmSxh7BSRh500ikI/xD4nx5A==
   dependencies:
-    "@babel/runtime" "^7.14.5"
-    "@polkadot/metadata" "4.15.1"
-    "@polkadot/util" "^6.9.1"
-    "@polkadot/util-crypto" "^6.9.1"
-    "@polkadot/x-rxjs" "^6.9.1"
+    "@babel/runtime" "^7.14.6"
+    "@polkadot/util" "^7.0.1"
+    "@polkadot/util-crypto" "^7.0.1"
+    rxjs "^7.2.0"
 
-"@polkadot/util-crypto@6.9.1", "@polkadot/util-crypto@^6.9.1":
-  version "6.9.1"
-  resolved "https://registry.yarnpkg.com/@polkadot/util-crypto/-/util-crypto-6.9.1.tgz#175a2bbc040785599730baee35f0235226b8343e"
-  integrity sha512-lniY8bhRoayA8PD3NHyvpAL2N9YETDll6HbxaOIkGS9nnVmlOjIvslcd343b30rj7/qSV72w+8qkReHj650aQw==
+"@polkadot/util-crypto@7.0.1", "@polkadot/util-crypto@^7.0.1":
+  version "7.0.1"
+  resolved "https://registry.yarnpkg.com/@polkadot/util-crypto/-/util-crypto-7.0.1.tgz#03109dc11323dad174fb2214d395855495def16a"
+  integrity sha512-dbvdsICoyOVw/K45RmHOP7wXE/7vj+NzEKGcKbiDt39nglHm6g2BTJ947PwwyNusTTAx82Q2iJ9vIZ1Kl0xG+g==
   dependencies:
-    "@babel/runtime" "^7.14.5"
-    "@polkadot/networks" "6.9.1"
-    "@polkadot/util" "6.9.1"
-    "@polkadot/wasm-crypto" "^4.0.2"
-    "@polkadot/x-randomvalues" "6.9.1"
+    "@babel/runtime" "^7.14.6"
+    "@polkadot/networks" "7.0.1"
+    "@polkadot/util" "7.0.1"
+    "@polkadot/wasm-crypto" "^4.1.2"
+    "@polkadot/x-randomvalues" "7.0.1"
     base-x "^3.0.8"
     base64-js "^1.5.1"
-    blakejs "^1.1.0"
+    blakejs "^1.1.1"
     bn.js "^4.11.9"
     create-hash "^1.2.0"
     elliptic "^6.5.4"
@@ -1785,101 +1755,91 @@
     tweetnacl "^1.0.3"
     xxhashjs "^0.2.2"
 
-"@polkadot/util@6.9.1", "@polkadot/util@^6.9.1":
-  version "6.9.1"
-  resolved "https://registry.yarnpkg.com/@polkadot/util/-/util-6.9.1.tgz#009a9e0771523398517dbf3a978285b071f6081c"
-  integrity sha512-RTIn8+Xdgywj8Bl7D12557zi8iIoUvDpAJztp/CwIq4O3jEw6Y/7lqNX/K6OXhZm/gZf7tFgFnvGlsIuNbtYcQ==
+"@polkadot/util@7.0.1", "@polkadot/util@^7.0.1":
+  version "7.0.1"
+  resolved "https://registry.yarnpkg.com/@polkadot/util/-/util-7.0.1.tgz#79afd40473016876f51d65ebb9900a20108fe0a4"
+  integrity sha512-EtQlZL6ok0Ep+zRz2QHMUoJo/b3kFHVN2qqyD2+9sdqg0FGLmkzNFM+K6dasCMLXieJ1l0HoFsQppSo/leUeaA==
   dependencies:
-    "@babel/runtime" "^7.14.5"
-    "@polkadot/x-textdecoder" "6.9.1"
-    "@polkadot/x-textencoder" "6.9.1"
+    "@babel/runtime" "^7.14.6"
+    "@polkadot/x-textdecoder" "7.0.1"
+    "@polkadot/x-textencoder" "7.0.1"
     "@types/bn.js" "^4.11.6"
     bn.js "^4.11.9"
     camelcase "^5.3.1"
     ip-regex "^4.3.0"
 
-"@polkadot/wasm-crypto-asmjs@^4.0.2":
-  version "4.0.2"
-  resolved "https://registry.yarnpkg.com/@polkadot/wasm-crypto-asmjs/-/wasm-crypto-asmjs-4.0.2.tgz#f42c353a64e1243841daf90e4bd54eff01a4e3cf"
-  integrity sha512-hlebqtGvfjg2ZNm4scwBGVHwOwfUhy2yw5RBHmPwkccUif3sIy4SAzstpcVBIVMdAEvo746bPWEInA8zJRcgJA==
+"@polkadot/wasm-crypto-asmjs@^4.1.2":
+  version "4.1.2"
+  resolved "https://registry.yarnpkg.com/@polkadot/wasm-crypto-asmjs/-/wasm-crypto-asmjs-4.1.2.tgz#094b3eeeb5fd39a93db177583b48454511874cfc"
+  integrity sha512-3Q+vVUxDAC2tXgKMM3lKzx2JW+tarDpTjkvdxIKATyi8Ek69KkUqvMyJD0VL/iFZOFZED0YDX9UU4XOJ/astlg==
   dependencies:
-    "@babel/runtime" "^7.13.9"
+    "@babel/runtime" "^7.14.6"
 
-"@polkadot/wasm-crypto-wasm@^4.0.2":
-  version "4.0.2"
-  resolved "https://registry.yarnpkg.com/@polkadot/wasm-crypto-wasm/-/wasm-crypto-wasm-4.0.2.tgz#89f9e0a1e4d076784d4a42bea37fc8b06bdd8bb6"
-  integrity sha512-de/AfNPZ0uDKFWzOZ1rJCtaUbakGN29ks6IRYu6HZTRg7+RtqvE1rIkxabBvYgQVHIesmNwvEA9DlIkS6hYRFQ==
+"@polkadot/wasm-crypto-wasm@^4.1.2":
+  version "4.1.2"
+  resolved "https://registry.yarnpkg.com/@polkadot/wasm-crypto-wasm/-/wasm-crypto-wasm-4.1.2.tgz#773c78c1d65886671d3ba1d66c31afd86c93d02f"
+  integrity sha512-/l4IBEdQ41szHdHkuF//z1qr+XmWuLHlpBA7s9Eb221m1Fir6AKoCHoh1hp1r3v0ecZYLKvak1B225w6JAU3Fg==
   dependencies:
-    "@babel/runtime" "^7.13.9"
+    "@babel/runtime" "^7.14.6"
 
-"@polkadot/wasm-crypto@^4.0.2":
-  version "4.0.2"
-  resolved "https://registry.yarnpkg.com/@polkadot/wasm-crypto/-/wasm-crypto-4.0.2.tgz#9649057adee8383cc86433d107ba526b718c5a3b"
-  integrity sha512-2h9FuQFkBc+B3TwSapt6LtyPvgtd0Hq9QsHW8g8FrmKBFRiiFKYRpfJKHCk0aCZzuRf9h95bQl/X6IXAIWF2ng==
+"@polkadot/wasm-crypto@^4.1.2":
+  version "4.1.2"
+  resolved "https://registry.yarnpkg.com/@polkadot/wasm-crypto/-/wasm-crypto-4.1.2.tgz#dead71ae5d2f7722d23aed5be2112e1732d315e9"
+  integrity sha512-2EKdOjIrD2xHP2rC+0G/3Qo6926nL/18vCFkd34lBd9zP9YNF2GDEtDY+zAeDIRFKe1sQHTpsKgNdYSWoV2eBg==
   dependencies:
-    "@babel/runtime" "^7.13.9"
-    "@polkadot/wasm-crypto-asmjs" "^4.0.2"
-    "@polkadot/wasm-crypto-wasm" "^4.0.2"
+    "@babel/runtime" "^7.14.6"
+    "@polkadot/wasm-crypto-asmjs" "^4.1.2"
+    "@polkadot/wasm-crypto-wasm" "^4.1.2"
 
-"@polkadot/x-fetch@^6.9.1":
-  version "6.9.1"
-  resolved "https://registry.yarnpkg.com/@polkadot/x-fetch/-/x-fetch-6.9.1.tgz#89ff2741b35f2bb9fdc30a22cdb0debf72248597"
-  integrity sha512-CckiiRiGM+7WGOw1WijDeN9NJcTBEjZ96LRMaUng+BNvNhUQplsmX6CUt86Qn6T1O8TQaAg93wtqb+deykkn2g==
+"@polkadot/x-fetch@^7.0.1":
+  version "7.0.1"
+  resolved "https://registry.yarnpkg.com/@polkadot/x-fetch/-/x-fetch-7.0.1.tgz#2db6fa19f4f4d9b2f4cf50ba78bf3aa947d7b982"
+  integrity sha512-9R38FjtlJcvdpEA7tVGmTmH4aiBCTABuLJdVSn3cYkgWfxDHeFMqjdFzTJ6Asa5cY0Ds3ZKsh9uccTQBQzV/HQ==
   dependencies:
-    "@babel/runtime" "^7.14.5"
-    "@polkadot/x-global" "6.9.1"
-    "@types/node-fetch" "^2.5.10"
+    "@babel/runtime" "^7.14.6"
+    "@polkadot/x-global" "7.0.1"
+    "@types/node-fetch" "^2.5.11"
     node-fetch "^2.6.1"
 
-"@polkadot/x-global@6.9.1", "@polkadot/x-global@^6.9.1":
-  version "6.9.1"
-  resolved "https://registry.yarnpkg.com/@polkadot/x-global/-/x-global-6.9.1.tgz#c3d7482e2ac62c306379592550d476fc60ce7dfe"
-  integrity sha512-/pVzvQUObccuk/f2BGcs0WMjveLQPr1Qf+uiSF/7ae9BZHIG4ydLz0/Lnzbt4YQkIEaRNvVFD1Vph5hyjo4VCA==
+"@polkadot/x-global@7.0.1", "@polkadot/x-global@^7.0.1":
+  version "7.0.1"
+  resolved "https://registry.yarnpkg.com/@polkadot/x-global/-/x-global-7.0.1.tgz#44fb248d3aaea557753318327149772969e96bff"
+  integrity sha512-gVVACSdRhHYRJejLEAL0mM9BZfY8N50VT2+15A7ALD1tVqwS4tz3P9vRW3Go7ZjfyAc83aEmh0PiQ8Nm1R+2Cg==
   dependencies:
-    "@babel/runtime" "^7.14.5"
-    "@types/node-fetch" "^2.5.10"
-    node-fetch "^2.6.1"
+    "@babel/runtime" "^7.14.6"
 
-"@polkadot/x-randomvalues@6.9.1":
-  version "6.9.1"
-  resolved "https://registry.yarnpkg.com/@polkadot/x-randomvalues/-/x-randomvalues-6.9.1.tgz#e289e79849e332777fb96e8544b1193a4e793e59"
-  integrity sha512-L1c5ddjzyPAvzRkbnrbVgQTUskM4vRtfxblOV/tmM1BP6mB1U3rWo0FeHNWN/uiUoibVFIDNUKqUnZ5vhYs1qg==
+"@polkadot/x-randomvalues@7.0.1":
+  version "7.0.1"
+  resolved "https://registry.yarnpkg.com/@polkadot/x-randomvalues/-/x-randomvalues-7.0.1.tgz#32036ae5d48645a062f6a1c3ebbf227236c806b8"
+  integrity sha512-UNoIFaz1xJPozruT+lo8BTeT8A3NM3PgWuru7Vs8OsIz0Phkg7lUWlpHu9PZHyQCyKlUryvkOA692IlVlNYy2Q==
   dependencies:
-    "@babel/runtime" "^7.14.5"
-    "@polkadot/x-global" "6.9.1"
+    "@babel/runtime" "^7.14.6"
+    "@polkadot/x-global" "7.0.1"
 
-"@polkadot/x-rxjs@^6.9.1":
-  version "6.9.1"
-  resolved "https://registry.yarnpkg.com/@polkadot/x-rxjs/-/x-rxjs-6.9.1.tgz#713a399568922aff10fe47c3875dba44a139d6c6"
-  integrity sha512-sfQNA7so5KoeFEIIx7OGZL5D+0Hn0SRZJMbZSuGRFMKjyovpyzWi+Mjs3l6T6OXbKm972XAseNGDUWSVG4EpLQ==
+"@polkadot/x-textdecoder@7.0.1":
+  version "7.0.1"
+  resolved "https://registry.yarnpkg.com/@polkadot/x-textdecoder/-/x-textdecoder-7.0.1.tgz#bb9bba94b2eb1612dd35c299f43ab74515db74d9"
+  integrity sha512-CFRnpI0cp1h2N1+ec551BLVLwV6OHG6Gj62EYcIOXR+o/SX/6MXm3Qcehm2YvfTKqktyIUSWmTwbWjGjuqPrpA==
   dependencies:
-    "@babel/runtime" "^7.14.5"
-    rxjs "^6.6.7"
+    "@babel/runtime" "^7.14.6"
+    "@polkadot/x-global" "7.0.1"
 
-"@polkadot/x-textdecoder@6.9.1":
-  version "6.9.1"
-  resolved "https://registry.yarnpkg.com/@polkadot/x-textdecoder/-/x-textdecoder-6.9.1.tgz#dab6e95b35c9386550c4907fd1efb195ab605ec9"
-  integrity sha512-U7Cu7PbY5CG5kjbKqAQ/e07FfvPYZwHZZbC+343vDHUnJlyONKxp+jhod+A1pepu15fsYH/iZC0Os6RwfKoEAA==
+"@polkadot/x-textencoder@7.0.1":
+  version "7.0.1"
+  resolved "https://registry.yarnpkg.com/@polkadot/x-textencoder/-/x-textencoder-7.0.1.tgz#181d403c5dc1d94fd1e2147fd1c5c528d30d8805"
+  integrity sha512-m+QL1HNiu5GMz6cfr/udSA6fUTv3RyIybJb7v43EQCxqlj/L0J3cUHapFd6tqH9PElD6jPkH1pXcgYN8e7dWTQ==
   dependencies:
-    "@babel/runtime" "^7.14.5"
-    "@polkadot/x-global" "6.9.1"
+    "@babel/runtime" "^7.14.6"
+    "@polkadot/x-global" "7.0.1"
 
-"@polkadot/x-textencoder@6.9.1":
-  version "6.9.1"
-  resolved "https://registry.yarnpkg.com/@polkadot/x-textencoder/-/x-textencoder-6.9.1.tgz#cf98a3f248ad9a4cdb2559f950ff6559d009b619"
-  integrity sha512-M9VNm7IpbBwQnCZhEBAXSQ+/g2psEv4zjJYdX4/HTcWNpnYEUHeayIVTw91Wkgo3dN8wBL245vVp/8apfKfMkQ==
-  dependencies:
-    "@babel/runtime" "^7.14.5"
-    "@polkadot/x-global" "6.9.1"
-
-"@polkadot/x-ws@^6.9.1":
-  version "6.9.1"
-  resolved "https://registry.yarnpkg.com/@polkadot/x-ws/-/x-ws-6.9.1.tgz#ac4d0cf22c333359a426f4104581c9e394d7f6e5"
-  integrity sha512-BeoVqFFLatrt3k8Leyi6LsOMz5rkdXbQ5oE2Db0V+ezfh5aEV/JjoLsaPkX+i6xsCYibB43rY64FBhpJ2O0iYg==
+"@polkadot/x-ws@^7.0.1":
+  version "7.0.1"
+  resolved "https://registry.yarnpkg.com/@polkadot/x-ws/-/x-ws-7.0.1.tgz#8c22a61c0dd9b82865c7631e22ac147c2b73b118"
+  integrity sha512-VUn/6sCJUpvW9WhUK+DKo1uDrw4yO84twRcy5JSzvSiBTaSplhU9Q4qGFl2Atr3WIzAYYx1jQSm/j6AhPRji1w==
   dependencies:
-    "@babel/runtime" "^7.14.5"
-    "@polkadot/x-global" "6.9.1"
-    "@types/websocket" "^1.0.2"
+    "@babel/runtime" "^7.14.6"
+    "@polkadot/x-global" "7.0.1"
+    "@types/websocket" "^1.0.3"
     websocket "^1.0.34"
 
 "@rushstack/eslint-patch@^1.0.6":
@@ -2046,10 +2006,10 @@
   resolved "https://registry.yarnpkg.com/@types/mocha/-/mocha-8.2.2.tgz#91daa226eb8c2ff261e6a8cbf8c7304641e095e0"
   integrity sha512-Lwh0lzzqT5Pqh6z61P3c3P5nm6fzQK/MMHl9UKeneAeInVflBSz1O2EkX6gM6xfJd7FBXBY5purtLx7fUiZ7Hw==
 
-"@types/node-fetch@^2.5.10":
-  version "2.5.10"
-  resolved "https://registry.yarnpkg.com/@types/node-fetch/-/node-fetch-2.5.10.tgz#9b4d4a0425562f9fcea70b12cb3fcdd946ca8132"
-  integrity sha512-IpkX0AasN44hgEad0gEF/V6EgR5n69VEqPEgnmoM8GsIGro3PowbWs4tR6IhxUTyPLpOn+fiGG6nrQhcmoCuIQ==
+"@types/node-fetch@^2.5.11":
+  version "2.5.11"
+  resolved "https://registry.yarnpkg.com/@types/node-fetch/-/node-fetch-2.5.11.tgz#ce22a2e65fc8999f4dbdb7ddbbcf187d755169e4"
+  integrity sha512-2upCKaqVZETDRb8A2VTaRymqFBEgH8u6yr96b/u3+1uQEPDRo3mJLEiPk7vdXBHRtjwkjqzFYMJXrt0Z9QsYjQ==
   dependencies:
     "@types/node" "*"
     form-data "^3.0.0"
@@ -2093,10 +2053,10 @@
   resolved "https://registry.yarnpkg.com/@types/stack-utils/-/stack-utils-2.0.0.tgz#7036640b4e21cc2f259ae826ce843d277dad8cff"
   integrity sha512-RJJrrySY7A8havqpGObOB4W92QXKJo63/jFLLgpvOtsGUqbQZ9Sbgl35KMm1DjC6j7AvmmU2bIno+3IyEaemaw==
 
-"@types/websocket@^1.0.2":
-  version "1.0.2"
-  resolved "https://registry.yarnpkg.com/@types/websocket/-/websocket-1.0.2.tgz#d2855c6a312b7da73ed16ba6781815bf30c6187a"
-  integrity sha512-B5m9aq7cbbD/5/jThEr33nUY8WEfVi6A2YKCTOvw5Ldy7mtsOkqRvGjnzy6g7iMMDsgu7xREuCzqATLDLQVKcQ==
+"@types/websocket@^1.0.3":
+  version "1.0.3"
+  resolved "https://registry.yarnpkg.com/@types/websocket/-/websocket-1.0.3.tgz#49e09f939afd0ccdee4f7108d4712ec9feb0f153"
+  integrity sha512-ZdoTSwmDsKR7l1I8fpfQtmTI/hUwlOvE3q0iyJsp4tXU0MkdrYowimDzwxjhQvxU4qjhHLd3a6ig0OXRbLgIdw==
   dependencies:
     "@types/node" "*"
 
@@ -2826,6 +2786,11 @@
   resolved "https://registry.yarnpkg.com/blakejs/-/blakejs-1.1.0.tgz#69df92ef953aa88ca51a32df6ab1c54a155fc7a5"
   integrity sha1-ad+S75U6qIylGjLfarHFShVfx6U=
 
+blakejs@^1.1.1:
+  version "1.1.1"
+  resolved "https://registry.yarnpkg.com/blakejs/-/blakejs-1.1.1.tgz#bf313053978b2cd4c444a48795710be05c785702"
+  integrity sha512-bLG6PHOCZJKNshTjGRBvET0vTciwQE6zFKOKKXPDJfwFBd4Ac0yBfPZqcGvGJap50l7ktvlpFqc2jGVaUgbJgg==
+
 bluebird@^3.1.1, bluebird@^3.5.0:
   version "3.7.2"
   resolved "https://registry.yarnpkg.com/bluebird/-/bluebird-3.7.2.tgz#9f229c15be272454ffa973ace0dbee79a1b0c36f"
@@ -4307,12 +4272,12 @@
   integrity sha512-0rSmRBzXgDzIsD6mGdJgevzgezI534Cer5L/vyMX0kHzT/jiB43jRhd9YUlMGYLQy2zprNmoT8qasCGtY+QaKw==
 
 eslint@^7.28.0:
-  version "7.31.0"
-  resolved "https://registry.yarnpkg.com/eslint/-/eslint-7.31.0.tgz#f972b539424bf2604907a970860732c5d99d3aca"
-  integrity sha512-vafgJpSh2ia8tnTkNUkwxGmnumgckLh5aAbLa1xRmIn9+owi8qBNGKL+B881kNKNTy7FFqTEkpNkUvmw0n6PkA==
+  version "7.30.0"
+  resolved "https://registry.yarnpkg.com/eslint/-/eslint-7.30.0.tgz#6d34ab51aaa56112fd97166226c9a97f505474f8"
+  integrity sha512-VLqz80i3as3NdloY44BQSJpFw534L9Oh+6zJOUaViV4JPd+DaHwutqP7tcpkW3YiXbK6s05RZl7yl7cQn+lijg==
   dependencies:
     "@babel/code-frame" "7.12.11"
-    "@eslint/eslintrc" "^0.4.3"
+    "@eslint/eslintrc" "^0.4.2"
     "@humanwhocodes/config-array" "^0.5.0"
     ajv "^6.10.0"
     chalk "^4.0.0"
@@ -8557,13 +8522,20 @@
   dependencies:
     queue-microtask "^1.2.2"
 
-rxjs@^6.6.6, rxjs@^6.6.7:
+rxjs@^6.6.6:
   version "6.6.7"
   resolved "https://registry.yarnpkg.com/rxjs/-/rxjs-6.6.7.tgz#90ac018acabf491bf65044235d5863c4dab804c9"
   integrity sha512-hTdwr+7yYNIT5n4AMYp85KA6yw2Va0FLa3Rguvbpa4W3I5xynaBZo41cM3XM+4Q6fRMj3sBYIR1VAmZMXYJvRQ==
   dependencies:
     tslib "^1.9.0"
 
+rxjs@^7.2.0:
+  version "7.2.0"
+  resolved "https://registry.yarnpkg.com/rxjs/-/rxjs-7.2.0.tgz#5cd12409639e9514a71c9f5f9192b2c4ae94de31"
+  integrity sha512-aX8w9OpKrQmiPKfT1bqETtUr9JygIz6GZ+gql8v7CijClsP0laoFUdKzxFAoWuRdSlOdU2+crss+cMf+cqMTnw==
+  dependencies:
+    tslib "~2.1.0"
+
 safe-buffer@5.1.2, safe-buffer@~5.1.0, safe-buffer@~5.1.1:
   version "5.1.2"
   resolved "https://registry.yarnpkg.com/safe-buffer/-/safe-buffer-5.1.2.tgz#991ec69d296e0313747d59bdfd2b745c35f8828d"
@@ -9422,6 +9394,11 @@
   resolved "https://registry.yarnpkg.com/tslib/-/tslib-1.14.1.tgz#cf2d38bdc34a134bcaf1091c41f6619e2f672d00"
   integrity sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg==
 
+tslib@~2.1.0:
+  version "2.1.0"
+  resolved "https://registry.yarnpkg.com/tslib/-/tslib-2.1.0.tgz#da60860f1c2ecaa5703ab7d39bc05b6bf988b97a"
+  integrity sha512-hcVC3wYEziELGGmEEXue7D75zbwIIVUMWAVbHItGPx0ziyXxrOMQx4rQEVEV45Ut/1IotuEvwqPopzIOkDMf0A==
+
 tslint@^6.1.3:
   version "6.1.3"
   resolved "https://registry.yarnpkg.com/tslint/-/tslint-6.1.3.tgz#5c23b2eccc32487d5523bd3a470e9aa31789d904"