git.delta.rocks / unique-network / refs/commits / 83762c9ccb9b

difftreelog

Merge pull request #775 from UniqueNetwork/chore/fix-warnings

Yaroslav Bolyukin2022-12-23parents: #cf483e2 #1c0b76d.patch.diff
in: master

14 files changed

modifiedexamples/package.jsondiffbeforeafterboth
--- a/examples/package.json
+++ b/examples/package.json
@@ -7,7 +7,7 @@
     "test": "test"
   },
   "devDependencies": {
-    "got": "^10.7.0"
+    "got": "^11.8.5"
   },
   "scripts": {
     "test": ""
modifiedpallets/common/src/eth.rsdiffbeforeafterboth
--- a/pallets/common/src/eth.rs
+++ b/pallets/common/src/eth.rs
@@ -125,9 +125,9 @@
 /// Ethereum representation of Optional value with CrossAddress.
 #[derive(Debug, Default, AbiCoder)]
 pub struct OptionCrossAddress {
-	/// Is address set
+	/// Whether or not this CrossAdress is valid and has meaning.
 	pub status: bool,
-	/// Address value
+	/// The underlying CrossAddress value. If the status is false, can be set to whatever.
 	pub value: CrossAddress,
 }
 
@@ -139,7 +139,7 @@
 }
 
 impl CrossAddress {
-	/// Converts `CrossAccountId` to [`CrossAddress`]
+	/// Converts `CrossAccountId` to [`CrossAddress`] to be correctly usable with Ethereum.
 	pub fn from_sub_cross_account<T>(cross_account_id: &T::CrossAccountId) -> Self
 	where
 		T: pallet_evm::Config,
@@ -154,7 +154,7 @@
 			}
 		}
 	}
-	/// Creates [`CrossAddress`] from substrate account
+	/// Creates [`CrossAddress`] from Substrate account.
 	pub fn from_sub<T>(account_id: &T::AccountId) -> Self
 	where
 		T: pallet_evm::Config,
@@ -165,7 +165,7 @@
 			sub: uint256::from_big_endian(account_id.as_ref()),
 		}
 	}
-	/// Converts [`CrossAddress`] to `CrossAccountId`
+	/// Converts [`CrossAddress`] to `CrossAccountId`.
 	pub fn into_sub_cross_account<T>(&self) -> evm_coder::execution::Result<T::CrossAccountId>
 	where
 		T: pallet_evm::Config,
modifiedpallets/refungible/src/lib.rsdiffbeforeafterboth
--- a/pallets/refungible/src/lib.rs
+++ b/pallets/refungible/src/lib.rs
@@ -90,10 +90,9 @@
 use crate::erc_token::ERC20Events;
 use crate::erc::ERC721Events;
 
-use codec::{Encode, Decode, MaxEncodedLen};
 use core::ops::Deref;
 use evm_coder::ToLog;
-use frame_support::{BoundedVec, ensure, fail, storage::with_transaction, transactional};
+use frame_support::{ensure, fail, storage::with_transaction, transactional};
 use pallet_evm::{account::CrossAccountId, Pallet as PalletEvm};
 use pallet_evm_coder_substrate::WithRecorder;
 use pallet_common::{
@@ -101,13 +100,12 @@
 	Event as CommonEvent, Pallet as PalletCommon, erc::CollectionHelpersEvents,
 };
 use pallet_structure::Pallet as PalletStructure;
-use scale_info::TypeInfo;
 use sp_core::{Get, H160};
 use sp_runtime::{ArithmeticError, DispatchError, DispatchResult, TransactionOutcome};
 use sp_std::{vec::Vec, vec, collections::btree_map::BTreeMap};
 use up_data_structs::{
 	AccessMode, budget::Budget, CollectionId, CollectionFlags, CreateCollectionData,
-	CustomDataLimit, mapping::TokenAddressMapping, MAX_REFUNGIBLE_PIECES, Property, PropertyKey,
+	mapping::TokenAddressMapping, MAX_REFUNGIBLE_PIECES, Property, PropertyKey,
 	PropertyKeyPermission, PropertyPermission, PropertyScope, PropertyValue, TokenId,
 	TrySetProperty, PropertiesPermissionMap, CreateRefungibleExMultipleOwners,
 };
@@ -124,17 +122,6 @@
 	CreateRefungibleExMultipleOwners<<T as pallet_evm::Config>::CrossAccountId>;
 pub(crate) type SelfWeightOf<T> = <T as Config>::WeightInfo;
 
-/// Token data, stored independently from other data used to describe it
-/// for the convenience of database access. Notably contains the token metadata.
-#[struct_versioning::versioned(version = 2, upper)]
-#[derive(Encode, Decode, Default, TypeInfo, MaxEncodedLen)]
-pub struct ItemData {
-	pub const_data: BoundedVec<u8, CustomDataLimit>,
-
-	#[version(..2)]
-	pub variable_data: BoundedVec<u8, CustomDataLimit>,
-}
-
 #[frame_support::pallet]
 pub mod pallet {
 	use super::*;
@@ -142,7 +129,6 @@
 		Blake2_128, Blake2_128Concat, Twox64Concat, pallet_prelude::*, storage::Key,
 		traits::StorageVersion,
 	};
-	use frame_system::pallet_prelude::*;
 	use up_data_structs::{CollectionId, TokenId};
 	use super::weights::WeightInfo;
 
@@ -183,16 +169,6 @@
 	#[pallet::storage]
 	pub type TokensBurnt<T: Config> =
 		StorageMap<Hasher = Twox64Concat, Key = CollectionId, Value = u32, QueryKind = ValueQuery>;
-
-	/// Token data, used to partially describe a token.
-	// TODO: remove
-	#[pallet::storage]
-	#[deprecated(since = "0.2.0", note = "ItemData is no more contains usefull data")]
-	pub type TokenData<T: Config> = StorageNMap<
-		Key = (Key<Twox64Concat, CollectionId>, Key<Twox64Concat, TokenId>),
-		Value = ItemData,
-		QueryKind = ValueQuery,
-	>;
 
 	/// Amount of pieces a refungible token is split into.
 	#[pallet::storage]
@@ -275,20 +251,6 @@
 		Value = bool,
 		QueryKind = ValueQuery,
 	>;
-
-	#[pallet::hooks]
-	impl<T: Config> Hooks<BlockNumberFor<T>> for Pallet<T> {
-		fn on_runtime_upgrade() -> Weight {
-			let storage_version = StorageVersion::get::<Pallet<T>>();
-			if storage_version < StorageVersion::new(2) {
-				#[allow(deprecated)]
-				let _ = <TokenData<T>>::clear(u32::MAX, None);
-			}
-			StorageVersion::new(2).put::<Pallet<T>>();
-
-			Weight::zero()
-		}
-	}
 }
 
 pub struct RefungibleHandle<T: Config>(pallet_common::CollectionHandle<T>);
modifiedpallets/unique/src/lib.rsdiffbeforeafterboth
--- a/pallets/unique/src/lib.rs
+++ b/pallets/unique/src/lib.rs
@@ -91,7 +91,7 @@
 	CreateItemData, CollectionLimits, CollectionPermissions, CollectionId, CollectionMode, TokenId,
 	CreateCollectionData, CreateItemExData, budget, Property, PropertyKey, PropertyKeyPermission,
 };
-use pallet_evm::{account::CrossAccountId};
+use pallet_evm::account::CrossAccountId;
 use pallet_common::{
 	CollectionHandle, Pallet as PalletCommon, CommonWeightInfo, dispatch::dispatch_tx,
 	dispatch::CollectionDispatch, RefungibleExtensionsWeightInfo,
modifiedruntime/common/config/pallets/app_promotion.rsdiffbeforeafterboth
--- a/runtime/common/config/pallets/app_promotion.rs
+++ b/runtime/common/config/pallets/app_promotion.rs
@@ -22,7 +22,7 @@
 use frame_support::{parameter_types, PalletId};
 use sp_arithmetic::Perbill;
 use up_common::{
-	constants::{UNIQUE, RELAY_DAYS, DAYS},
+	constants::{UNIQUE, DAYS, RELAY_DAYS},
 	types::Balance,
 };
 
modifiedruntime/tests/src/tests.rsdiffbeforeafterboth
before · runtime/tests/src/tests.rs
1// Copyright 2019-2022 Unique Network (Gibraltar) Ltd.2// This file is part of Unique Network.34// Unique Network is free software: you can redistribute it and/or modify5// it under the terms of the GNU General Public License as published by6// the Free Software Foundation, either version 3 of the License, or7// (at your option) any later version.89// Unique Network is distributed in the hope that it will be useful,10// but WITHOUT ANY WARRANTY; without even the implied warranty of11// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the12// GNU General Public License for more details.1314// You should have received a copy of the GNU General Public License15// along with Unique Network. If not, see <http://www.gnu.org/licenses/>.1617// Tests to be written here18use crate::{Test, TestCrossAccountId, CollectionCreationPrice, RuntimeOrigin, Unique, new_test_ext};19use up_data_structs::{20	COLLECTION_NUMBER_LIMIT, CollectionId, CreateItemData, CreateFungibleData, CreateNftData,21	CreateReFungibleData, MAX_DECIMAL_POINTS, COLLECTION_ADMINS_LIMIT, TokenId,22	MAX_TOKEN_OWNERSHIP, CreateCollectionData, CollectionMode, AccessMode, CollectionPermissions,23	PropertyKeyPermission, PropertyPermission, Property, CollectionPropertiesVec,24	CollectionPropertiesPermissionsVec,25};26use frame_support::{assert_noop, assert_ok, assert_err};27use sp_std::convert::TryInto;28use pallet_evm::account::CrossAccountId;29use pallet_common::Error as CommonError;30use pallet_unique::Error as UniqueError;3132fn add_balance(user: u64, value: u64) {33	const DONOR_USER: u64 = 999;34	assert_ok!(<pallet_balances::Pallet<Test>>::set_balance(35		RuntimeOrigin::root(),36		DONOR_USER,37		value,38		039	));40	assert_ok!(<pallet_balances::Pallet<Test>>::force_transfer(41		RuntimeOrigin::root(),42		DONOR_USER,43		user,44		value45	));46}4748fn default_nft_data() -> CreateNftData {49	CreateNftData {50		properties: vec![Property {51			key: b"test-prop".to_vec().try_into().unwrap(),52			value: b"test-nft-prop".to_vec().try_into().unwrap(),53		}]54		.try_into()55		.unwrap(),56	}57}5859fn default_fungible_data() -> CreateFungibleData {60	CreateFungibleData { value: 5 }61}6263fn default_re_fungible_data() -> CreateReFungibleData {64	CreateReFungibleData {65		pieces: 1023,66		properties: vec![Property {67			key: b"test-prop".to_vec().try_into().unwrap(),68			value: b"test-nft-prop".to_vec().try_into().unwrap(),69		}]70		.try_into()71		.unwrap(),72	}73}7475fn create_test_collection_for_owner(76	mode: &CollectionMode,77	owner: u64,78	id: CollectionId,79) -> CollectionId {80	add_balance(owner, CollectionCreationPrice::get() as u64 + 1);8182	let col_name1: Vec<u16> = "Test1\0".encode_utf16().collect::<Vec<u16>>();83	let col_desc1: Vec<u16> = "TestDescription1\0".encode_utf16().collect::<Vec<u16>>();84	let token_prefix1: Vec<u8> = b"token_prefix1\0".to_vec();85	let token_property_permissions: CollectionPropertiesPermissionsVec =86		vec![PropertyKeyPermission {87			key: b"test-prop".to_vec().try_into().unwrap(),88			permission: PropertyPermission {89				mutable: true,90				collection_admin: false,91				token_owner: true,92			},93		}]94		.try_into()95		.unwrap();96	let properties: CollectionPropertiesVec = vec![Property {97		key: b"test-collection-prop".to_vec().try_into().unwrap(),98		value: b"test-collection-value".to_vec().try_into().unwrap(),99	}]100	.try_into()101	.unwrap();102103	let data: CreateCollectionData<u64> = CreateCollectionData {104		name: col_name1.try_into().unwrap(),105		description: col_desc1.try_into().unwrap(),106		token_prefix: token_prefix1.try_into().unwrap(),107		mode: mode.clone(),108		token_property_permissions: token_property_permissions.clone(),109		properties: properties.clone(),110		..Default::default()111	};112113	let origin1 = RuntimeOrigin::signed(owner);114	assert_ok!(Unique::create_collection_ex(origin1, data));115116	let saved_col_name: Vec<u16> = "Test1\0".encode_utf16().collect::<Vec<u16>>();117	let saved_description: Vec<u16> = "TestDescription1\0".encode_utf16().collect::<Vec<u16>>();118	let saved_prefix: Vec<u8> = b"token_prefix1\0".to_vec();119	assert_eq!(120		<pallet_common::CollectionById<Test>>::get(id)121			.unwrap()122			.owner,123		owner124	);125	assert_eq!(126		<pallet_common::CollectionById<Test>>::get(id).unwrap().name,127		saved_col_name128	);129	assert_eq!(130		<pallet_common::CollectionById<Test>>::get(id).unwrap().mode,131		*mode132	);133	assert_eq!(134		<pallet_common::CollectionById<Test>>::get(id)135			.unwrap()136			.description,137		saved_description138	);139	assert_eq!(140		<pallet_common::CollectionById<Test>>::get(id)141			.unwrap()142			.token_prefix,143		saved_prefix144	);145	assert_eq!(146		get_collection_property_permissions(id).as_slice(),147		token_property_permissions.as_slice()148	);149	assert_eq!(150		get_collection_properties(id).as_slice(),151		properties.as_slice()152	);153	id154}155156fn get_collection_property_permissions(collection_id: CollectionId) -> Vec<PropertyKeyPermission> {157	<pallet_common::Pallet<Test>>::property_permissions(collection_id)158		.into_iter()159		.map(|(key, permission)| PropertyKeyPermission { key, permission })160		.collect()161}162163fn get_collection_properties(collection_id: CollectionId) -> Vec<Property> {164	<pallet_common::Pallet<Test>>::collection_properties(collection_id)165		.into_iter()166		.map(|(key, value)| Property { key, value })167		.collect()168}169170fn get_token_properties(collection_id: CollectionId, token_id: TokenId) -> Vec<Property> {171	<pallet_nonfungible::Pallet<Test>>::token_properties((collection_id, token_id))172		.into_iter()173		.map(|(key, value)| Property { key, value })174		.collect()175}176177fn create_test_collection(mode: &CollectionMode, id: CollectionId) -> CollectionId {178	create_test_collection_for_owner(&mode, 1, id)179}180181fn create_test_item(collection_id: CollectionId, data: &CreateItemData) {182	let origin1 = RuntimeOrigin::signed(1);183	assert_ok!(Unique::create_item(184		origin1,185		collection_id,186		account(1),187		data.clone()188	));189}190191fn account(sub: u64) -> TestCrossAccountId {192	TestCrossAccountId::from_sub(sub)193}194195// Use cases tests region196// #region197198#[test]199fn check_not_sufficient_founds() {200	new_test_ext().execute_with(|| {201		let acc: u64 = 1;202		<pallet_balances::Pallet<Test>>::set_balance(RuntimeOrigin::root(), acc, 0, 0).unwrap();203204		let name: Vec<u16> = "Test1\0".encode_utf16().collect::<Vec<u16>>();205		let description: Vec<u16> = "TestDescription1\0".encode_utf16().collect::<Vec<u16>>();206		let token_prefix: Vec<u8> = b"token_prefix1\0".to_vec();207208		let data: CreateCollectionData<<Test as frame_system::Config>::AccountId> =209			CreateCollectionData {210				name: name.try_into().unwrap(),211				description: description.try_into().unwrap(),212				token_prefix: token_prefix.try_into().unwrap(),213				mode: CollectionMode::NFT,214				..Default::default()215			};216217		let result = Unique::create_collection_ex(RuntimeOrigin::signed(acc), data);218		assert_err!(result, <CommonError<Test>>::NotSufficientFounds);219	});220}221222#[test]223fn create_fungible_collection_fails_with_large_decimal_numbers() {224	new_test_ext().execute_with(|| {225		let col_name1: Vec<u16> = "Test1\0".encode_utf16().collect::<Vec<u16>>();226		let col_desc1: Vec<u16> = "TestDescription1\0".encode_utf16().collect::<Vec<u16>>();227		let token_prefix1: Vec<u8> = b"token_prefix1\0".to_vec();228229		let data: CreateCollectionData<u64> = CreateCollectionData {230			name: col_name1.try_into().unwrap(),231			description: col_desc1.try_into().unwrap(),232			token_prefix: token_prefix1.try_into().unwrap(),233			mode: CollectionMode::Fungible(MAX_DECIMAL_POINTS + 1),234			..Default::default()235		};236237		let origin1 = RuntimeOrigin::signed(1);238		assert_noop!(239			Unique::create_collection_ex(origin1, data),240			UniqueError::<Test>::CollectionDecimalPointLimitExceeded241		);242	});243}244245#[test]246fn create_nft_item() {247	new_test_ext().execute_with(|| {248		let collection_id = create_test_collection(&CollectionMode::NFT, CollectionId(1));249250		let data = default_nft_data();251		create_test_item(collection_id, &data.clone().into());252253		assert_eq!(254			get_token_properties(collection_id, TokenId(1)).as_slice(),255			data.properties.as_slice(),256		);257	});258}259260// Use cases tests region261// #region262#[test]263fn create_nft_multiple_items() {264	new_test_ext().execute_with(|| {265		create_test_collection(&CollectionMode::NFT, CollectionId(1));266267		let origin1 = RuntimeOrigin::signed(1);268269		let items_data = vec![default_nft_data(), default_nft_data(), default_nft_data()];270271		assert_ok!(Unique::create_multiple_items(272			origin1,273			CollectionId(1),274			account(1),275			items_data276				.clone()277				.into_iter()278				.map(|d| { d.into() })279				.collect()280		));281		for (index, data) in items_data.into_iter().enumerate() {282			assert_eq!(283				get_token_properties(CollectionId(1), TokenId(index as u32 + 1)).as_slice(),284				data.properties.as_slice()285			);286		}287	});288}289290#[test]291fn create_refungible_item() {292	new_test_ext().execute_with(|| {293		let collection_id = create_test_collection(&CollectionMode::ReFungible, CollectionId(1));294295		let data = default_re_fungible_data();296		create_test_item(collection_id, &data.clone().into());297		let item = <pallet_refungible::TokenData<Test>>::get((collection_id, TokenId(1)));298		let balance =299			<pallet_refungible::Balance<Test>>::get((collection_id, TokenId(1), account(1)));300		assert_eq!(balance, 1023);301	});302}303304#[test]305fn create_multiple_refungible_items() {306	new_test_ext().execute_with(|| {307		create_test_collection(&CollectionMode::ReFungible, CollectionId(1));308309		let origin1 = RuntimeOrigin::signed(1);310311		let items_data = vec![312			default_re_fungible_data(),313			default_re_fungible_data(),314			default_re_fungible_data(),315		];316317		assert_ok!(Unique::create_multiple_items(318			origin1,319			CollectionId(1),320			account(1),321			items_data322				.clone()323				.into_iter()324				.map(|d| { d.into() })325				.collect()326		));327		for (index, data) in items_data.into_iter().enumerate() {328			let item = <pallet_refungible::TokenData<Test>>::get((329				CollectionId(1),330				TokenId((index + 1) as u32),331			));332			let balance =333				<pallet_refungible::Balance<Test>>::get((CollectionId(1), TokenId(1), account(1)));334			assert_eq!(balance, 1023);335		}336	});337}338339#[test]340fn create_fungible_item() {341	new_test_ext().execute_with(|| {342		let collection_id = create_test_collection(&CollectionMode::Fungible(3), CollectionId(1));343344		let data = default_fungible_data();345		create_test_item(collection_id, &data.into());346347		assert_eq!(348			<pallet_fungible::Balance<Test>>::get((collection_id, account(1))),349			5350		);351	});352}353354//#[test]355// fn create_multiple_fungible_items() {356//     new_test_ext().execute_with(|| {357//         default_limits();358359//         create_test_collection(&CollectionMode::Fungible(3), CollectionId(1));360361//         let origin1 = RuntimeOrigin::signed(1);362363//         let items_data = vec![default_fungible_data(), default_fungible_data(), default_fungible_data()];364365//         assert_ok!(Unique::create_multiple_items(366//             origin1.clone(),367//             1,368//             1,369//             items_data.clone().into_iter().map(|d| { d.into() }).collect()370//         ));371372//         for (index, _) in items_data.iter().enumerate() {373//             assert_eq!(Unique::fungible_item_id(1, (index + 1) as TokenId).value, 5);374//         }375//         assert_eq!(Unique::balance_count(1, 1), 3000);376//         assert_eq!(Unique::address_tokens(1, 1), [1, 2, 3]);377//     });378// }379380#[test]381fn transfer_fungible_item() {382	new_test_ext().execute_with(|| {383		let collection_id = create_test_collection(&CollectionMode::Fungible(3), CollectionId(1));384385		let origin1 = RuntimeOrigin::signed(1);386		let origin2 = RuntimeOrigin::signed(2);387388		let data = default_fungible_data();389		create_test_item(collection_id, &data.into());390391		assert_eq!(392			<pallet_fungible::Balance<Test>>::get((CollectionId(1), account(1))),393			5394		);395396		// change owner scenario397		assert_ok!(Unique::transfer(398			origin1,399			account(2),400			CollectionId(1),401			TokenId(0),402			5403		));404		assert_eq!(405			<pallet_fungible::Balance<Test>>::get((CollectionId(1), account(1))),406			0407		);408409		// split item scenario410		assert_ok!(Unique::transfer(411			origin2.clone(),412			account(3),413			CollectionId(1),414			TokenId(0),415			3416		));417418		// split item and new owner has account scenario419		assert_ok!(Unique::transfer(420			origin2,421			account(3),422			CollectionId(1),423			TokenId(0),424			1425		));426		assert_eq!(427			<pallet_fungible::Balance<Test>>::get((CollectionId(1), account(2))),428			1429		);430		assert_eq!(431			<pallet_fungible::Balance<Test>>::get((CollectionId(1), account(3))),432			4433		);434	});435}436437#[test]438fn transfer_refungible_item() {439	new_test_ext().execute_with(|| {440		let collection_id = create_test_collection(&CollectionMode::ReFungible, CollectionId(1));441442		// Create RFT 1 in 1023 pieces for account 1443		let data = default_re_fungible_data();444		create_test_item(collection_id, &data.clone().into());445		let item = <pallet_refungible::TokenData<Test>>::get((collection_id, TokenId(1)));446		assert_eq!(447			<pallet_refungible::AccountBalance<Test>>::get((collection_id, account(1))),448			1449		);450		assert_eq!(451			<pallet_refungible::Balance<Test>>::get((collection_id, TokenId(1), account(1))),452			1023453		);454		assert_eq!(455			<pallet_refungible::Owned<Test>>::get((collection_id, account(1), TokenId(1))),456			true457		);458459		// Account 1 transfers all 1023 pieces of RFT 1 to account 2460		let origin1 = RuntimeOrigin::signed(1);461		let origin2 = RuntimeOrigin::signed(2);462		assert_ok!(Unique::transfer(463			origin1,464			account(2),465			CollectionId(1),466			TokenId(1),467			1023468		));469		assert_eq!(470			<pallet_refungible::Balance<Test>>::get((collection_id, TokenId(1), account(2))),471			1023472		);473		assert_eq!(474			<pallet_refungible::AccountBalance<Test>>::get((collection_id, account(1))),475			0476		);477		assert_eq!(478			<pallet_refungible::AccountBalance<Test>>::get((collection_id, account(2))),479			1480		);481		assert_eq!(482			<pallet_refungible::Owned<Test>>::get((collection_id, account(1), TokenId(1))),483			false484		);485		assert_eq!(486			<pallet_refungible::Owned<Test>>::get((collection_id, account(2), TokenId(1))),487			true488		);489490		// Account 2 transfers 500 pieces of RFT 1 to account 3491		assert_ok!(Unique::transfer(492			origin2.clone(),493			account(3),494			CollectionId(1),495			TokenId(1),496			500497		));498		assert_eq!(499			<pallet_refungible::Balance<Test>>::get((collection_id, TokenId(1), account(2))),500			523501		);502		assert_eq!(503			<pallet_refungible::Balance<Test>>::get((collection_id, TokenId(1), account(3))),504			500505		);506		assert_eq!(507			<pallet_refungible::AccountBalance<Test>>::get((collection_id, account(2))),508			1509		);510		assert_eq!(511			<pallet_refungible::AccountBalance<Test>>::get((collection_id, account(3))),512			1513		);514		assert_eq!(515			<pallet_refungible::Owned<Test>>::get((collection_id, account(2), TokenId(1))),516			true517		);518		assert_eq!(519			<pallet_refungible::Owned<Test>>::get((collection_id, account(3), TokenId(1))),520			true521		);522523		// Account 2 transfers 200 more pieces of RFT 1 to account 3 with pre-existing balance524		assert_ok!(Unique::transfer(525			origin2,526			account(3),527			CollectionId(1),528			TokenId(1),529			200530		));531		assert_eq!(532			<pallet_refungible::Balance<Test>>::get((collection_id, TokenId(1), account(2))),533			323534		);535		assert_eq!(536			<pallet_refungible::Balance<Test>>::get((collection_id, TokenId(1), account(3))),537			700538		);539		assert_eq!(540			<pallet_refungible::AccountBalance<Test>>::get((collection_id, account(2))),541			1542		);543		assert_eq!(544			<pallet_refungible::AccountBalance<Test>>::get((collection_id, account(3))),545			1546		);547		assert_eq!(548			<pallet_refungible::Owned<Test>>::get((collection_id, account(2), TokenId(1))),549			true550		);551		assert_eq!(552			<pallet_refungible::Owned<Test>>::get((collection_id, account(3), TokenId(1))),553			true554		);555	});556}557558#[test]559fn transfer_nft_item() {560	new_test_ext().execute_with(|| {561		let collection_id = create_test_collection(&CollectionMode::NFT, CollectionId(1));562563		let data = default_nft_data();564		create_test_item(collection_id, &data.into());565		assert_eq!(566			<pallet_nonfungible::AccountBalance<Test>>::get((collection_id, account(1))),567			1568		);569		assert_eq!(570			<pallet_nonfungible::Owned<Test>>::get((collection_id, account(1), TokenId(1))),571			true572		);573574		let origin1 = RuntimeOrigin::signed(1);575		// default scenario576		assert_ok!(Unique::transfer(577			origin1,578			account(2),579			CollectionId(1),580			TokenId(1),581			1582		));583		assert_eq!(584			<pallet_nonfungible::AccountBalance<Test>>::get((collection_id, account(1))),585			0586		);587		assert_eq!(588			<pallet_nonfungible::AccountBalance<Test>>::get((collection_id, account(2))),589			1590		);591		assert_eq!(592			<pallet_nonfungible::Owned<Test>>::get((collection_id, account(1), TokenId(1))),593			false594		);595		assert_eq!(596			<pallet_nonfungible::Owned<Test>>::get((collection_id, account(2), TokenId(1))),597			true598		);599	});600}601602#[test]603fn transfer_nft_item_wrong_value() {604	new_test_ext().execute_with(|| {605		let collection_id = create_test_collection(&CollectionMode::NFT, CollectionId(1));606607		let data = default_nft_data();608		create_test_item(collection_id, &data.into());609		assert_eq!(610			<pallet_nonfungible::AccountBalance<Test>>::get((collection_id, account(1))),611			1612		);613		assert_eq!(614			<pallet_nonfungible::Owned<Test>>::get((collection_id, account(1), TokenId(1))),615			true616		);617618		let origin1 = RuntimeOrigin::signed(1);619620		assert_noop!(621			Unique::transfer(origin1, account(2), CollectionId(1), TokenId(1), 2)622				.map_err(|e| e.error),623			<pallet_nonfungible::Error::<Test>>::NonfungibleItemsHaveNoAmount624		);625	});626}627628#[test]629fn transfer_nft_item_zero_value() {630	new_test_ext().execute_with(|| {631		let collection_id = create_test_collection(&CollectionMode::NFT, CollectionId(1));632633		let data = default_nft_data();634		create_test_item(collection_id, &data.into());635		assert_eq!(636			<pallet_nonfungible::AccountBalance<Test>>::get((collection_id, account(1))),637			1638		);639		assert_eq!(640			<pallet_nonfungible::Owned<Test>>::get((collection_id, account(1), TokenId(1))),641			true642		);643644		let origin1 = RuntimeOrigin::signed(1);645646		// Transferring 0 amount works on NFT...647		assert_ok!(Unique::transfer(648			origin1,649			account(2),650			CollectionId(1),651			TokenId(1),652			0653		));654		// ... and results in no transfer655		assert_eq!(656			<pallet_nonfungible::AccountBalance<Test>>::get((collection_id, account(1))),657			1658		);659		assert_eq!(660			<pallet_nonfungible::Owned<Test>>::get((collection_id, account(1), TokenId(1))),661			true662		);663	});664}665666#[test]667fn nft_approve_and_transfer_from() {668	new_test_ext().execute_with(|| {669		let collection_id = create_test_collection(&CollectionMode::NFT, CollectionId(1));670671		let data = default_nft_data();672		create_test_item(collection_id, &data.into());673674		let origin1 = RuntimeOrigin::signed(1);675		let origin2 = RuntimeOrigin::signed(2);676677		assert_eq!(678			<pallet_nonfungible::AccountBalance<Test>>::get((collection_id, account(1))),679			1680		);681		assert_eq!(682			<pallet_nonfungible::Owned<Test>>::get((collection_id, account(1), TokenId(1))),683			true684		);685686		// neg transfer_from687		assert_noop!(688			Unique::transfer_from(689				origin2.clone(),690				account(1),691				account(2),692				CollectionId(1),693				TokenId(1),694				1695			)696			.map_err(|e| e.error),697			CommonError::<Test>::ApprovedValueTooLow698		);699700		// do approve701		assert_ok!(Unique::approve(702			origin1,703			account(2),704			CollectionId(1),705			TokenId(1),706			1707		));708		assert_eq!(709			<pallet_nonfungible::Allowance<Test>>::get((CollectionId(1), TokenId(1))).unwrap(),710			account(2)711		);712713		assert_ok!(Unique::transfer_from(714			origin2,715			account(1),716			account(3),717			CollectionId(1),718			TokenId(1),719			1720		));721		assert!(722			<pallet_nonfungible::Allowance<Test>>::get((CollectionId(1), TokenId(1))).is_none()723		);724	});725}726727#[test]728fn nft_approve_and_transfer_from_allow_list() {729	new_test_ext().execute_with(|| {730		let collection_id = create_test_collection(&CollectionMode::NFT, CollectionId(1));731732		let origin1 = RuntimeOrigin::signed(1);733		let origin2 = RuntimeOrigin::signed(2);734735		// Create NFT 1 for account 1736		let data = default_nft_data();737		create_test_item(collection_id, &data.clone().into());738		assert_eq!(739			<pallet_nonfungible::AccountBalance<Test>>::get((collection_id, account(1))),740			1741		);742		assert_eq!(743			<pallet_nonfungible::Owned<Test>>::get((collection_id, account(1), TokenId(1))),744			true745		);746747		// Allow allow-list users to mint and add accounts 1, 2, and 3 to allow-list748		assert_ok!(Unique::set_collection_permissions(749			origin1.clone(),750			CollectionId(1),751			CollectionPermissions {752				mint_mode: Some(true),753				access: Some(AccessMode::AllowList),754				nesting: None,755			}756		));757		assert_ok!(Unique::add_to_allow_list(758			origin1.clone(),759			CollectionId(1),760			account(1)761		));762		assert_ok!(Unique::add_to_allow_list(763			origin1.clone(),764			CollectionId(1),765			account(2)766		));767		assert_ok!(Unique::add_to_allow_list(768			origin1.clone(),769			CollectionId(1),770			account(3)771		));772773		// Account 1 approves account 2 for NFT 1774		assert_ok!(Unique::approve(775			origin1.clone(),776			account(2),777			CollectionId(1),778			TokenId(1),779			1780		));781		assert_eq!(782			<pallet_nonfungible::Allowance<Test>>::get((CollectionId(1), TokenId(1))).unwrap(),783			account(2)784		);785786		// Account 2 transfers NFT 1 from account 1 to account 3787		assert_ok!(Unique::transfer_from(788			origin2,789			account(1),790			account(3),791			CollectionId(1),792			TokenId(1),793			1794		));795		assert!(796			<pallet_nonfungible::Allowance<Test>>::get((CollectionId(1), TokenId(1))).is_none()797		);798	});799}800801#[test]802fn refungible_approve_and_transfer_from() {803	new_test_ext().execute_with(|| {804		let collection_id = create_test_collection(&CollectionMode::ReFungible, CollectionId(1));805806		let origin1 = RuntimeOrigin::signed(1);807		let origin2 = RuntimeOrigin::signed(2);808809		// Create RFT 1 in 1023 pieces for account 1810		let data = default_re_fungible_data();811		create_test_item(collection_id, &data.into());812813		assert_eq!(814			<pallet_refungible::AccountBalance<Test>>::get((collection_id, account(1))),815			1816		);817		assert_eq!(818			<pallet_refungible::Balance<Test>>::get((collection_id, TokenId(1), account(1))),819			1023820		);821		assert_eq!(822			<pallet_refungible::Owned<Test>>::get((collection_id, account(1), TokenId(1))),823			true824		);825826		// Allow public minting, enable allow-list and add accounts 1, 2, 3 to allow-list827		assert_ok!(Unique::set_collection_permissions(828			origin1.clone(),829			CollectionId(1),830			CollectionPermissions {831				mint_mode: Some(true),832				access: Some(AccessMode::AllowList),833				nesting: None,834			}835		));836		assert_ok!(Unique::add_to_allow_list(837			origin1.clone(),838			CollectionId(1),839			account(1)840		));841		assert_ok!(Unique::add_to_allow_list(842			origin1.clone(),843			CollectionId(1),844			account(2)845		));846		assert_ok!(Unique::add_to_allow_list(847			origin1.clone(),848			CollectionId(1),849			account(3)850		));851852		// Account 1 approves account 2 for 1023 pieces of RFT 1853		assert_ok!(Unique::approve(854			origin1,855			account(2),856			CollectionId(1),857			TokenId(1),858			1023859		));860		assert_eq!(861			<pallet_refungible::Allowance<Test>>::get((862				CollectionId(1),863				TokenId(1),864				account(1),865				account(2)866			)),867			1023868		);869870		// Account 2 transfers 100 pieces of RFT 1 from account 1 to account 3871		assert_ok!(Unique::transfer_from(872			origin2,873			account(1),874			account(3),875			CollectionId(1),876			TokenId(1),877			100878		));879		assert_eq!(880			<pallet_refungible::AccountBalance<Test>>::get((collection_id, account(1))),881			1882		);883		assert_eq!(884			<pallet_refungible::AccountBalance<Test>>::get((collection_id, account(3))),885			1886		);887		assert_eq!(888			<pallet_refungible::Balance<Test>>::get((collection_id, TokenId(1), account(1))),889			923890		);891		assert_eq!(892			<pallet_refungible::Balance<Test>>::get((collection_id, TokenId(1), account(3))),893			100894		);895		assert_eq!(896			<pallet_refungible::Owned<Test>>::get((collection_id, account(1), TokenId(1))),897			true898		);899		assert_eq!(900			<pallet_refungible::Owned<Test>>::get((collection_id, account(1), TokenId(1))),901			true902		);903		assert_eq!(904			<pallet_refungible::Allowance<Test>>::get((905				CollectionId(1),906				TokenId(1),907				account(1),908				account(2)909			)),910			923911		);912	});913}914915#[test]916fn fungible_approve_and_transfer_from() {917	new_test_ext().execute_with(|| {918		let collection_id = create_test_collection(&CollectionMode::Fungible(3), CollectionId(1));919920		let data = default_fungible_data();921		create_test_item(collection_id, &data.into());922923		let origin1 = RuntimeOrigin::signed(1);924		let origin2 = RuntimeOrigin::signed(2);925926		assert_ok!(Unique::set_collection_permissions(927			origin1.clone(),928			CollectionId(1),929			CollectionPermissions {930				mint_mode: Some(true),931				access: Some(AccessMode::AllowList),932				nesting: None,933			}934		));935		assert_ok!(Unique::add_to_allow_list(936			origin1.clone(),937			CollectionId(1),938			account(1)939		));940		assert_ok!(Unique::add_to_allow_list(941			origin1.clone(),942			CollectionId(1),943			account(2)944		));945		assert_ok!(Unique::add_to_allow_list(946			origin1.clone(),947			CollectionId(1),948			account(3)949		));950951		// do approve952		assert_ok!(Unique::approve(953			origin1.clone(),954			account(2),955			CollectionId(1),956			TokenId(0),957			5958		));959		assert_eq!(960			<pallet_fungible::Allowance<Test>>::get((CollectionId(1), account(1), account(2))),961			5962		);963		assert_ok!(Unique::approve(964			origin1,965			account(3),966			CollectionId(1),967			TokenId(0),968			5969		));970		assert_eq!(971			<pallet_fungible::Allowance<Test>>::get((CollectionId(1), account(1), account(2))),972			5973		);974		assert_eq!(975			<pallet_fungible::Allowance<Test>>::get((CollectionId(1), account(1), account(3))),976			5977		);978979		assert_ok!(Unique::transfer_from(980			origin2.clone(),981			account(1),982			account(3),983			CollectionId(1),984			TokenId(0),985			4986		));987988		assert_eq!(989			<pallet_fungible::Allowance<Test>>::get((CollectionId(1), account(1), account(2))),990			1991		);992993		assert_noop!(994			Unique::transfer_from(995				origin2,996				account(1),997				account(3),998				CollectionId(1),999				TokenId(0),1000				41001			)1002			.map_err(|e| e.error),1003			CommonError::<Test>::ApprovedValueTooLow1004		);1005	});1006}10071008#[test]1009fn change_collection_owner() {1010	new_test_ext().execute_with(|| {1011		let collection_id = create_test_collection(&CollectionMode::NFT, CollectionId(1));10121013		let origin1 = RuntimeOrigin::signed(1);1014		assert_ok!(Unique::change_collection_owner(origin1, collection_id, 2));1015		assert_eq!(1016			<pallet_common::CollectionById<Test>>::get(collection_id)1017				.unwrap()1018				.owner,1019			21020		);1021	});1022}10231024#[test]1025fn destroy_collection() {1026	new_test_ext().execute_with(|| {1027		let collection_id = create_test_collection(&CollectionMode::NFT, CollectionId(1));10281029		let origin1 = RuntimeOrigin::signed(1);1030		assert_ok!(Unique::destroy_collection(origin1, collection_id));1031	});1032}10331034#[test]1035fn burn_nft_item() {1036	new_test_ext().execute_with(|| {1037		let collection_id = create_test_collection(&CollectionMode::NFT, CollectionId(1));10381039		let origin1 = RuntimeOrigin::signed(1);10401041		let data = default_nft_data();1042		create_test_item(collection_id, &data.into());10431044		// check balance (collection with id = 1, user id = 1)1045		assert_eq!(1046			<pallet_nonfungible::AccountBalance<Test>>::get((collection_id, account(1))),1047			11048		);10491050		// burn item1051		assert_ok!(Unique::burn_item(1052			origin1.clone(),1053			collection_id,1054			TokenId(1),1055			11056		));1057		assert_eq!(1058			<pallet_nonfungible::AccountBalance<Test>>::get((collection_id, account(1))),1059			01060		);1061	});1062}10631064#[test]1065fn burn_same_nft_item_twice() {1066	new_test_ext().execute_with(|| {1067		let collection_id = create_test_collection(&CollectionMode::NFT, CollectionId(1));10681069		let origin1 = RuntimeOrigin::signed(1);10701071		let data = default_nft_data();1072		create_test_item(collection_id, &data.into());10731074		// check balance (collection with id = 1, user id = 1)1075		assert_eq!(1076			<pallet_nonfungible::AccountBalance<Test>>::get((collection_id, account(1))),1077			11078		);10791080		// burn item1081		assert_ok!(Unique::burn_item(1082			origin1.clone(),1083			collection_id,1084			TokenId(1),1085			11086		));10871088		// burn item again1089		assert_noop!(1090			Unique::burn_item(origin1, collection_id, TokenId(1), 1).map_err(|e| e.error),1091			CommonError::<Test>::TokenNotFound1092		);10931094		assert_eq!(1095			<pallet_nonfungible::AccountBalance<Test>>::get((collection_id, account(1))),1096			01097		);1098	});1099}11001101#[test]1102fn burn_fungible_item() {1103	new_test_ext().execute_with(|| {1104		let collection_id = create_test_collection(&CollectionMode::Fungible(3), CollectionId(1));11051106		let origin1 = RuntimeOrigin::signed(1);1107		assert_ok!(Unique::add_collection_admin(1108			origin1.clone(),1109			collection_id,1110			account(2)1111		));11121113		let data = default_fungible_data();1114		create_test_item(collection_id, &data.into());11151116		// check balance (collection with id = 1, user id = 1)1117		assert_eq!(1118			<pallet_fungible::Balance<Test>>::get((collection_id, account(1))),1119			51120		);11211122		// burn item1123		assert_ok!(Unique::burn_item(1124			origin1.clone(),1125			CollectionId(1),1126			TokenId(0),1127			51128		));1129		assert_noop!(1130			Unique::burn_item(origin1, CollectionId(1), TokenId(0), 5).map_err(|e| e.error),1131			CommonError::<Test>::TokenValueTooLow1132		);11331134		assert_eq!(1135			<pallet_fungible::Balance<Test>>::get((collection_id, account(1))),1136			01137		);1138	});1139}11401141#[test]1142fn burn_fungible_item_with_token_id() {1143	new_test_ext().execute_with(|| {1144		let collection_id = create_test_collection(&CollectionMode::Fungible(3), CollectionId(1));11451146		let origin1 = RuntimeOrigin::signed(1);1147		assert_ok!(Unique::add_collection_admin(1148			origin1.clone(),1149			collection_id,1150			account(2)1151		));11521153		let data = default_fungible_data();1154		create_test_item(collection_id, &data.into());11551156		// check balance (collection with id = 1, user id = 1)1157		assert_eq!(1158			<pallet_fungible::Balance<Test>>::get((collection_id, account(1))),1159			51160		);11611162		// Try to burn item using Token ID1163		assert_noop!(1164			Unique::burn_item(origin1, CollectionId(1), TokenId(1), 5).map_err(|e| e.error),1165			<pallet_fungible::Error::<Test>>::FungibleItemsHaveNoId1166		);1167	});1168}1169#[test]1170fn burn_refungible_item() {1171	new_test_ext().execute_with(|| {1172		let collection_id = create_test_collection(&CollectionMode::ReFungible, CollectionId(1));1173		let origin1 = RuntimeOrigin::signed(1);11741175		assert_ok!(Unique::set_collection_permissions(1176			origin1.clone(),1177			collection_id,1178			CollectionPermissions {1179				mint_mode: Some(true),1180				access: Some(AccessMode::AllowList),1181				nesting: None,1182			}1183		));1184		assert_ok!(Unique::add_to_allow_list(1185			origin1.clone(),1186			collection_id,1187			account(1)1188		));11891190		assert_ok!(Unique::add_collection_admin(1191			origin1.clone(),1192			collection_id,1193			account(2)1194		));11951196		let data = default_re_fungible_data();1197		create_test_item(collection_id, &data.into());11981199		// check balance (collection with id = 1, user id = 2)1200		assert_eq!(1201			<pallet_refungible::AccountBalance<Test>>::get((collection_id, account(1))),1202			11203		);1204		assert_eq!(1205			<pallet_refungible::Balance<Test>>::get((collection_id, TokenId(1), account(1))),1206			10231207		);12081209		// burn item1210		assert_ok!(Unique::burn_item(1211			origin1.clone(),1212			collection_id,1213			TokenId(1),1214			10231215		));1216		assert_noop!(1217			Unique::burn_item(origin1, collection_id, TokenId(1), 1023).map_err(|e| e.error),1218			CommonError::<Test>::TokenValueTooLow1219		);12201221		assert_eq!(1222			<pallet_refungible::Balance<Test>>::get((collection_id, TokenId(1), account(1))),1223			01224		);1225	});1226}12271228#[test]1229fn add_collection_admin() {1230	new_test_ext().execute_with(|| {1231		let collection1_id =1232			create_test_collection_for_owner(&CollectionMode::NFT, 1, CollectionId(1));1233		let origin1 = RuntimeOrigin::signed(1);12341235		// Add collection admins1236		assert_ok!(Unique::add_collection_admin(1237			origin1.clone(),1238			collection1_id,1239			account(2)1240		));1241		assert_ok!(Unique::add_collection_admin(1242			origin1,1243			collection1_id,1244			account(3)1245		));12461247		// Owner is not an admin by default1248		assert_eq!(1249			<pallet_common::IsAdmin<Test>>::get((CollectionId(1), account(1))),1250			false1251		);1252		assert!(<pallet_common::IsAdmin<Test>>::get((1253			CollectionId(1),1254			account(2)1255		)));1256		assert!(<pallet_common::IsAdmin<Test>>::get((1257			CollectionId(1),1258			account(3)1259		)));1260	});1261}12621263#[test]1264fn remove_collection_admin() {1265	new_test_ext().execute_with(|| {1266		let collection1_id =1267			create_test_collection_for_owner(&CollectionMode::NFT, 1, CollectionId(1));1268		let origin1 = RuntimeOrigin::signed(1);12691270		// Add collection admins 2 and 31271		assert_ok!(Unique::add_collection_admin(1272			origin1.clone(),1273			collection1_id,1274			account(2)1275		));1276		assert_ok!(Unique::add_collection_admin(1277			origin1.clone(),1278			collection1_id,1279			account(3)1280		));12811282		assert!(<pallet_common::IsAdmin<Test>>::get((1283			CollectionId(1),1284			account(2)1285		)));1286		assert!(<pallet_common::IsAdmin<Test>>::get((1287			CollectionId(1),1288			account(3)1289		)));12901291		// remove admin 31292		assert_ok!(Unique::remove_collection_admin(1293			origin1,1294			CollectionId(1),1295			account(3)1296		));12971298		// 2 is still admin, 3 is not an admin anymore1299		assert!(<pallet_common::IsAdmin<Test>>::get((1300			CollectionId(1),1301			account(2)1302		)));1303		assert_eq!(1304			<pallet_common::IsAdmin<Test>>::get((CollectionId(1), account(3))),1305			false1306		);1307	});1308}13091310#[test]1311fn balance_of() {1312	new_test_ext().execute_with(|| {1313		let nft_collection_id = create_test_collection(&CollectionMode::NFT, CollectionId(1));1314		let fungible_collection_id =1315			create_test_collection(&CollectionMode::Fungible(3), CollectionId(2));1316		let re_fungible_collection_id =1317			create_test_collection(&CollectionMode::ReFungible, CollectionId(3));13181319		// check balance before1320		assert_eq!(1321			<pallet_nonfungible::AccountBalance<Test>>::get((nft_collection_id, account(1))),1322			01323		);1324		assert_eq!(1325			<pallet_fungible::Balance<Test>>::get((fungible_collection_id, account(1))),1326			01327		);1328		assert_eq!(1329			<pallet_refungible::AccountBalance<Test>>::get((re_fungible_collection_id, account(1))),1330			01331		);13321333		let nft_data = default_nft_data();1334		create_test_item(nft_collection_id, &nft_data.into());13351336		let fungible_data = default_fungible_data();1337		create_test_item(fungible_collection_id, &fungible_data.into());13381339		let re_fungible_data = default_re_fungible_data();1340		create_test_item(re_fungible_collection_id, &re_fungible_data.into());13411342		// check balance (collection with id = 1, user id = 1)1343		assert_eq!(1344			<pallet_nonfungible::AccountBalance<Test>>::get((nft_collection_id, account(1))),1345			11346		);1347		assert_eq!(1348			<pallet_fungible::Balance<Test>>::get((fungible_collection_id, account(1))),1349			51350		);1351		assert_eq!(1352			<pallet_refungible::AccountBalance<Test>>::get((re_fungible_collection_id, account(1))),1353			11354		);13551356		assert_eq!(1357			<pallet_nonfungible::Owned<Test>>::get((nft_collection_id, account(1), TokenId(1))),1358			true1359		);1360		assert_eq!(1361			<pallet_refungible::Owned<Test>>::get((1362				re_fungible_collection_id,1363				account(1),1364				TokenId(1)1365			)),1366			true1367		);1368	});1369}13701371#[test]1372fn approve() {1373	new_test_ext().execute_with(|| {1374		let collection_id = create_test_collection(&CollectionMode::NFT, CollectionId(1));13751376		let data = default_nft_data();1377		create_test_item(collection_id, &data.into());13781379		let origin1 = RuntimeOrigin::signed(1);13801381		// approve1382		assert_ok!(Unique::approve(1383			origin1,1384			account(2),1385			CollectionId(1),1386			TokenId(1),1387			11388		));1389		assert_eq!(1390			<pallet_nonfungible::Allowance<Test>>::get((CollectionId(1), TokenId(1))).unwrap(),1391			account(2)1392		);1393	});1394}13951396#[test]1397fn transfer_from() {1398	new_test_ext().execute_with(|| {1399		let collection_id = create_test_collection(&CollectionMode::NFT, CollectionId(1));1400		let origin1 = RuntimeOrigin::signed(1);1401		let origin2 = RuntimeOrigin::signed(2);14021403		let data = default_nft_data();1404		create_test_item(collection_id, &data.into());14051406		// approve1407		assert_ok!(Unique::approve(1408			origin1.clone(),1409			account(2),1410			CollectionId(1),1411			TokenId(1),1412			11413		));1414		assert_eq!(1415			<pallet_nonfungible::Allowance<Test>>::get((CollectionId(1), TokenId(1))).unwrap(),1416			account(2)1417		);14181419		assert_ok!(Unique::set_collection_permissions(1420			origin1.clone(),1421			CollectionId(1),1422			CollectionPermissions {1423				mint_mode: Some(true),1424				access: Some(AccessMode::AllowList),1425				nesting: None,1426			}1427		));1428		assert_ok!(Unique::add_to_allow_list(1429			origin1.clone(),1430			CollectionId(1),1431			account(1)1432		));1433		assert_ok!(Unique::add_to_allow_list(1434			origin1.clone(),1435			CollectionId(1),1436			account(2)1437		));1438		assert_ok!(Unique::add_to_allow_list(1439			origin1,1440			CollectionId(1),1441			account(3)1442		));14431444		assert_ok!(Unique::transfer_from(1445			origin2,1446			account(1),1447			account(2),1448			CollectionId(1),1449			TokenId(1),1450			11451		));14521453		// after transfer1454		assert_eq!(1455			<pallet_nonfungible::AccountBalance<Test>>::get((CollectionId(1), account(1))),1456			01457		);1458		assert_eq!(1459			<pallet_nonfungible::AccountBalance<Test>>::get((CollectionId(1), account(2))),1460			11461		);1462	});1463}14641465// #endregion14661467// Coverage tests region1468// #region14691470#[test]1471fn owner_can_add_address_to_allow_list() {1472	new_test_ext().execute_with(|| {1473		let collection_id = create_test_collection(&CollectionMode::NFT, CollectionId(1));14741475		let origin1 = RuntimeOrigin::signed(1);1476		assert_ok!(Unique::add_to_allow_list(1477			origin1,1478			collection_id,1479			account(2)1480		));1481		assert!(<pallet_common::Allowlist<Test>>::get((1482			collection_id,1483			account(2)1484		)));1485	});1486}14871488#[test]1489fn admin_can_add_address_to_allow_list() {1490	new_test_ext().execute_with(|| {1491		let collection_id = create_test_collection(&CollectionMode::NFT, CollectionId(1));1492		let origin1 = RuntimeOrigin::signed(1);1493		let origin2 = RuntimeOrigin::signed(2);14941495		assert_ok!(Unique::add_collection_admin(1496			origin1,1497			collection_id,1498			account(2)1499		));1500		assert_ok!(Unique::add_to_allow_list(1501			origin2,1502			collection_id,1503			account(3)1504		));1505		assert!(<pallet_common::Allowlist<Test>>::get((1506			collection_id,1507			account(3)1508		)));1509	});1510}15111512#[test]1513fn nonprivileged_user_cannot_add_address_to_allow_list() {1514	new_test_ext().execute_with(|| {1515		let collection_id = create_test_collection(&CollectionMode::NFT, CollectionId(1));15161517		let origin2 = RuntimeOrigin::signed(2);1518		assert_noop!(1519			Unique::add_to_allow_list(origin2, collection_id, account(3)),1520			CommonError::<Test>::NoPermission1521		);1522	});1523}15241525#[test]1526fn nobody_can_add_address_to_allow_list_of_nonexisting_collection() {1527	new_test_ext().execute_with(|| {1528		let origin1 = RuntimeOrigin::signed(1);15291530		assert_noop!(1531			Unique::add_to_allow_list(origin1, CollectionId(1), account(2)),1532			CommonError::<Test>::CollectionNotFound1533		);1534	});1535}15361537#[test]1538fn nobody_can_add_address_to_allow_list_of_deleted_collection() {1539	new_test_ext().execute_with(|| {1540		let collection_id = create_test_collection(&CollectionMode::NFT, CollectionId(1));15411542		let origin1 = RuntimeOrigin::signed(1);1543		assert_ok!(Unique::destroy_collection(origin1.clone(), collection_id));1544		assert_noop!(1545			Unique::add_to_allow_list(origin1, collection_id, account(2)),1546			CommonError::<Test>::CollectionNotFound1547		);1548	});1549}15501551// If address is already added to allow list, nothing happens1552#[test]1553fn address_is_already_added_to_allow_list() {1554	new_test_ext().execute_with(|| {1555		let collection_id = create_test_collection(&CollectionMode::NFT, CollectionId(1));1556		let origin1 = RuntimeOrigin::signed(1);15571558		assert_ok!(Unique::add_to_allow_list(1559			origin1.clone(),1560			collection_id,1561			account(2)1562		));1563		assert_ok!(Unique::add_to_allow_list(1564			origin1,1565			collection_id,1566			account(2)1567		));1568		assert!(<pallet_common::Allowlist<Test>>::get((1569			collection_id,1570			account(2)1571		)));1572	});1573}15741575#[test]1576fn owner_can_remove_address_from_allow_list() {1577	new_test_ext().execute_with(|| {1578		let collection_id = create_test_collection(&CollectionMode::NFT, CollectionId(1));15791580		let origin1 = RuntimeOrigin::signed(1);1581		assert_ok!(Unique::add_to_allow_list(1582			origin1.clone(),1583			collection_id,1584			account(2)1585		));1586		assert_ok!(Unique::remove_from_allow_list(1587			origin1,1588			collection_id,1589			account(2)1590		));1591		assert_eq!(1592			<pallet_common::Allowlist<Test>>::get((collection_id, account(2))),1593			false1594		);1595	});1596}15971598#[test]1599fn admin_can_remove_address_from_allow_list() {1600	new_test_ext().execute_with(|| {1601		let collection_id = create_test_collection(&CollectionMode::NFT, CollectionId(1));1602		let origin1 = RuntimeOrigin::signed(1);1603		let origin2 = RuntimeOrigin::signed(2);16041605		// Owner adds admin1606		assert_ok!(Unique::add_collection_admin(1607			origin1.clone(),1608			collection_id,1609			account(2)1610		));16111612		// Owner adds address 3 to allow list1613		assert_ok!(Unique::add_to_allow_list(1614			origin1,1615			collection_id,1616			account(3)1617		));16181619		// Admin removes address 3 from allow list1620		assert_ok!(Unique::remove_from_allow_list(1621			origin2,1622			collection_id,1623			account(3)1624		));1625		assert_eq!(1626			<pallet_common::Allowlist<Test>>::get((collection_id, account(3))),1627			false1628		);1629	});1630}16311632#[test]1633fn nonprivileged_user_cannot_remove_address_from_allow_list() {1634	new_test_ext().execute_with(|| {1635		let collection_id = create_test_collection(&CollectionMode::NFT, CollectionId(1));1636		let origin1 = RuntimeOrigin::signed(1);1637		let origin2 = RuntimeOrigin::signed(2);16381639		assert_ok!(Unique::add_to_allow_list(1640			origin1,1641			collection_id,1642			account(2)1643		));1644		assert_noop!(1645			Unique::remove_from_allow_list(origin2, collection_id, account(2)),1646			CommonError::<Test>::NoPermission1647		);1648		assert!(<pallet_common::Allowlist<Test>>::get((1649			collection_id,1650			account(2)1651		)));1652	});1653}16541655#[test]1656fn nobody_can_remove_address_from_allow_list_of_nonexisting_collection() {1657	new_test_ext().execute_with(|| {1658		let origin1 = RuntimeOrigin::signed(1);16591660		assert_noop!(1661			Unique::remove_from_allow_list(origin1, CollectionId(1), account(2)),1662			CommonError::<Test>::CollectionNotFound1663		);1664	});1665}16661667#[test]1668fn nobody_can_remove_address_from_allow_list_of_deleted_collection() {1669	new_test_ext().execute_with(|| {1670		let collection_id = create_test_collection(&CollectionMode::NFT, CollectionId(1));1671		let origin1 = RuntimeOrigin::signed(1);1672		let origin2 = RuntimeOrigin::signed(2);16731674		// Add account 2 to allow list1675		assert_ok!(Unique::add_to_allow_list(1676			origin1.clone(),1677			collection_id,1678			account(2)1679		));16801681		// Account 2 is in collection allow-list1682		assert!(<pallet_common::Allowlist<Test>>::get((1683			collection_id,1684			account(2)1685		)));16861687		// Destroy collection1688		assert_ok!(Unique::destroy_collection(origin1, collection_id));16891690		// Attempt to remove account 2 from collection allow-list => error1691		assert_noop!(1692			Unique::remove_from_allow_list(origin2, collection_id, account(2)),1693			CommonError::<Test>::CollectionNotFound1694		);16951696		// Account 2 is not found in collection allow-list anyway1697		assert_eq!(1698			<pallet_common::Allowlist<Test>>::get((collection_id, account(2))),1699			false1700		);1701	});1702}17031704// If address is already removed from allow list, nothing happens1705#[test]1706fn address_is_already_removed_from_allow_list() {1707	new_test_ext().execute_with(|| {1708		let collection_id = create_test_collection(&CollectionMode::NFT, CollectionId(1));1709		let origin1 = RuntimeOrigin::signed(1);17101711		assert_ok!(Unique::add_to_allow_list(1712			origin1.clone(),1713			collection_id,1714			account(2)1715		));1716		assert_ok!(Unique::remove_from_allow_list(1717			origin1.clone(),1718			collection_id,1719			account(2)1720		));1721		assert_eq!(1722			<pallet_common::Allowlist<Test>>::get((collection_id, account(2))),1723			false1724		);1725		assert_ok!(Unique::remove_from_allow_list(1726			origin1,1727			collection_id,1728			account(2)1729		));1730		assert_eq!(1731			<pallet_common::Allowlist<Test>>::get((collection_id, account(2))),1732			false1733		);1734	});1735}17361737// If Public Access mode is set to AllowList, tokens can’t be transferred from a non-allowlisted address with transfer or transferFrom (2 tests)1738#[test]1739fn allow_list_test_1() {1740	new_test_ext().execute_with(|| {1741		let collection_id = create_test_collection(&CollectionMode::NFT, CollectionId(1));17421743		let origin1 = RuntimeOrigin::signed(1);17441745		let data = default_nft_data();1746		create_test_item(collection_id, &data.into());17471748		assert_ok!(Unique::set_collection_permissions(1749			origin1.clone(),1750			collection_id,1751			CollectionPermissions {1752				mint_mode: None,1753				access: Some(AccessMode::AllowList),1754				nesting: None,1755			}1756		));1757		assert_ok!(Unique::add_to_allow_list(1758			origin1.clone(),1759			collection_id,1760			account(2)1761		));17621763		assert_noop!(1764			Unique::transfer(origin1, account(3), CollectionId(1), TokenId(1), 1)1765				.map_err(|e| e.error),1766			CommonError::<Test>::AddressNotInAllowlist1767		);1768	});1769}17701771#[test]1772fn allow_list_test_2() {1773	new_test_ext().execute_with(|| {1774		let collection_id = create_test_collection(&CollectionMode::NFT, CollectionId(1));1775		let origin1 = RuntimeOrigin::signed(1);17761777		let data = default_nft_data();1778		create_test_item(collection_id, &data.into());17791780		assert_ok!(Unique::set_collection_permissions(1781			origin1.clone(),1782			collection_id,1783			CollectionPermissions {1784				mint_mode: None,1785				access: Some(AccessMode::AllowList),1786				nesting: None,1787			}1788		));1789		assert_ok!(Unique::add_to_allow_list(1790			origin1.clone(),1791			collection_id,1792			account(1)1793		));1794		assert_ok!(Unique::add_to_allow_list(1795			origin1.clone(),1796			collection_id,1797			account(2)1798		));17991800		// do approve1801		assert_ok!(Unique::approve(1802			origin1.clone(),1803			account(1),1804			collection_id,1805			TokenId(1),1806			11807		));1808		assert_eq!(1809			<pallet_nonfungible::Allowance<Test>>::get((CollectionId(1), TokenId(1))).unwrap(),1810			account(1)1811		);18121813		assert_ok!(Unique::remove_from_allow_list(1814			origin1.clone(),1815			collection_id,1816			account(1)1817		));18181819		assert_noop!(1820			Unique::transfer_from(1821				origin1,1822				account(1),1823				account(3),1824				CollectionId(1),1825				TokenId(1),1826				11827			)1828			.map_err(|e| e.error),1829			CommonError::<Test>::AddressNotInAllowlist1830		);1831	});1832}18331834// If Public Access mode is set to AllowList, tokens can’t be transferred to a non-allowlisted address with transfer or transferFrom (2 tests)1835#[test]1836fn allow_list_test_3() {1837	new_test_ext().execute_with(|| {1838		let collection_id = create_test_collection(&CollectionMode::NFT, CollectionId(1));18391840		let origin1 = RuntimeOrigin::signed(1);18411842		let data = default_nft_data();1843		create_test_item(collection_id, &data.into());18441845		assert_ok!(Unique::set_collection_permissions(1846			origin1.clone(),1847			collection_id,1848			CollectionPermissions {1849				mint_mode: None,1850				access: Some(AccessMode::AllowList),1851				nesting: None,1852			}1853		));1854		assert_ok!(Unique::add_to_allow_list(1855			origin1.clone(),1856			collection_id,1857			account(1)1858		));18591860		assert_noop!(1861			Unique::transfer(origin1, account(3), collection_id, TokenId(1), 1)1862				.map_err(|e| e.error),1863			CommonError::<Test>::AddressNotInAllowlist1864		);1865	});1866}18671868#[test]1869fn allow_list_test_4() {1870	new_test_ext().execute_with(|| {1871		let collection_id = create_test_collection(&CollectionMode::NFT, CollectionId(1));18721873		let origin1 = RuntimeOrigin::signed(1);18741875		let data = default_nft_data();1876		create_test_item(collection_id, &data.into());18771878		assert_ok!(Unique::set_collection_permissions(1879			origin1.clone(),1880			collection_id,1881			CollectionPermissions {1882				mint_mode: None,1883				access: Some(AccessMode::AllowList),1884				nesting: None,1885			}1886		));1887		assert_ok!(Unique::add_to_allow_list(1888			origin1.clone(),1889			collection_id,1890			account(1)1891		));1892		assert_ok!(Unique::add_to_allow_list(1893			origin1.clone(),1894			collection_id,1895			account(2)1896		));18971898		// do approve1899		assert_ok!(Unique::approve(1900			origin1.clone(),1901			account(1),1902			collection_id,1903			TokenId(1),1904			11905		));1906		assert_eq!(1907			<pallet_nonfungible::Allowance<Test>>::get((CollectionId(1), TokenId(1))).unwrap(),1908			account(1)1909		);19101911		assert_ok!(Unique::remove_from_allow_list(1912			origin1.clone(),1913			collection_id,1914			account(2)1915		));19161917		assert_noop!(1918			Unique::transfer_from(1919				origin1,1920				account(1),1921				account(3),1922				collection_id,1923				TokenId(1),1924				11925			)1926			.map_err(|e| e.error),1927			CommonError::<Test>::AddressNotInAllowlist1928		);1929	});1930}19311932// If Public Access mode is set to AllowList, tokens can’t be destroyed by a non-allowlisted address (even if it owned them before enabling AllowList mode)1933#[test]1934fn allow_list_test_5() {1935	new_test_ext().execute_with(|| {1936		let collection_id = create_test_collection(&CollectionMode::NFT, CollectionId(1));19371938		let origin1 = RuntimeOrigin::signed(1);19391940		let data = default_nft_data();1941		create_test_item(collection_id, &data.into());19421943		assert_ok!(Unique::set_collection_permissions(1944			origin1.clone(),1945			collection_id,1946			CollectionPermissions {1947				mint_mode: None,1948				access: Some(AccessMode::AllowList),1949				nesting: None,1950			}1951		));1952		assert_noop!(1953			Unique::burn_item(origin1.clone(), CollectionId(1), TokenId(1), 1).map_err(|e| e.error),1954			CommonError::<Test>::AddressNotInAllowlist1955		);1956	});1957}19581959// If Public Access mode is set to AllowList, token transfers can’t be Approved by a non-allowlisted address (see Approve method).1960#[test]1961fn allow_list_test_6() {1962	new_test_ext().execute_with(|| {1963		let collection_id = create_test_collection(&CollectionMode::NFT, CollectionId(1));19641965		let origin1 = RuntimeOrigin::signed(1);19661967		let data = default_nft_data();1968		create_test_item(collection_id, &data.into());19691970		assert_ok!(Unique::set_collection_permissions(1971			origin1.clone(),1972			collection_id,1973			CollectionPermissions {1974				mint_mode: None,1975				access: Some(AccessMode::AllowList),1976				nesting: None,1977			}1978		));19791980		// do approve1981		assert_noop!(1982			Unique::approve(origin1, account(1), CollectionId(1), TokenId(1), 1)1983				.map_err(|e| e.error),1984			CommonError::<Test>::AddressNotInAllowlist1985		);1986	});1987}19881989// If Public Access mode is set to AllowList, tokens can be transferred from a allowlisted address with transfer or transferFrom (2 tests) and1990//          tokens can be transferred from a allowlisted address with transfer or transferFrom (2 tests)1991#[test]1992fn allow_list_test_7() {1993	new_test_ext().execute_with(|| {1994		let collection_id = create_test_collection(&CollectionMode::NFT, CollectionId(1));19951996		let data = default_nft_data();1997		create_test_item(collection_id, &data.into());19981999		let origin1 = RuntimeOrigin::signed(1);20002001		assert_ok!(Unique::set_collection_permissions(2002			origin1.clone(),2003			collection_id,2004			CollectionPermissions {2005				mint_mode: None,2006				access: Some(AccessMode::AllowList),2007				nesting: None,2008			}2009		));2010		assert_ok!(Unique::add_to_allow_list(2011			origin1.clone(),2012			collection_id,2013			account(1)2014		));2015		assert_ok!(Unique::add_to_allow_list(2016			origin1.clone(),2017			collection_id,2018			account(2)2019		));20202021		assert_ok!(Unique::transfer(2022			origin1,2023			account(2),2024			CollectionId(1),2025			TokenId(1),2026			12027		));2028	});2029}20302031#[test]2032fn allow_list_test_8() {2033	new_test_ext().execute_with(|| {2034		let collection_id = create_test_collection(&CollectionMode::NFT, CollectionId(1));20352036		// Create NFT for account 12037		let data = default_nft_data();2038		create_test_item(collection_id, &data.into());20392040		let origin1 = RuntimeOrigin::signed(1);20412042		// Toggle Allow List mode and add accounts 1 and 22043		assert_ok!(Unique::set_collection_permissions(2044			origin1.clone(),2045			collection_id,2046			CollectionPermissions {2047				mint_mode: None,2048				access: Some(AccessMode::AllowList),2049				nesting: None,2050			}2051		));2052		assert_ok!(Unique::add_to_allow_list(2053			origin1.clone(),2054			collection_id,2055			account(1)2056		));2057		assert_ok!(Unique::add_to_allow_list(2058			origin1.clone(),2059			collection_id,2060			account(2)2061		));20622063		// Sself-approve account 1 for NFT 12064		assert_ok!(Unique::approve(2065			origin1.clone(),2066			account(1),2067			CollectionId(1),2068			TokenId(1),2069			12070		));2071		assert_eq!(2072			<pallet_nonfungible::Allowance<Test>>::get((CollectionId(1), TokenId(1))).unwrap(),2073			account(1)2074		);20752076		// Transfer from 1 to 22077		assert_ok!(Unique::transfer_from(2078			origin1,2079			account(1),2080			account(2),2081			CollectionId(1),2082			TokenId(1),2083			12084		));2085	});2086}20872088// If Public Access mode is set to AllowList, and Mint Permission is set to false, tokens can be created by owner.2089#[test]2090fn allow_list_test_9() {2091	new_test_ext().execute_with(|| {2092		let collection_id = create_test_collection(&CollectionMode::NFT, CollectionId(1));2093		let origin1 = RuntimeOrigin::signed(1);20942095		assert_ok!(Unique::set_collection_permissions(2096			origin1.clone(),2097			collection_id,2098			CollectionPermissions {2099				mint_mode: Some(false),2100				access: Some(AccessMode::AllowList),2101				nesting: None,2102			}2103		));21042105		let data = default_nft_data();2106		create_test_item(collection_id, &data.into());2107	});2108}21092110// If Public Access mode is set to AllowList, and Mint Permission is set to false, tokens can be created by admin.2111#[test]2112fn allow_list_test_10() {2113	new_test_ext().execute_with(|| {2114		let collection_id = create_test_collection(&CollectionMode::NFT, CollectionId(1));21152116		let origin1 = RuntimeOrigin::signed(1);2117		let origin2 = RuntimeOrigin::signed(2);21182119		assert_ok!(Unique::set_collection_permissions(2120			origin1.clone(),2121			collection_id,2122			CollectionPermissions {2123				mint_mode: Some(false),2124				access: Some(AccessMode::AllowList),2125				nesting: None,2126			}2127		));21282129		assert_ok!(Unique::add_collection_admin(2130			origin1,2131			collection_id,2132			account(2)2133		));21342135		assert_ok!(Unique::create_item(2136			origin2,2137			collection_id,2138			account(2),2139			default_nft_data().into()2140		));2141	});2142}21432144// If Public Access mode is set to AllowList, and Mint Permission is set to false, tokens cannot be created by non-privileged and allow listed address.2145#[test]2146fn allow_list_test_11() {2147	new_test_ext().execute_with(|| {2148		let collection_id = create_test_collection(&CollectionMode::NFT, CollectionId(1));21492150		let origin1 = RuntimeOrigin::signed(1);2151		let origin2 = RuntimeOrigin::signed(2);21522153		assert_ok!(Unique::set_collection_permissions(2154			origin1.clone(),2155			collection_id,2156			CollectionPermissions {2157				mint_mode: Some(false),2158				access: Some(AccessMode::AllowList),2159				nesting: None,2160			}2161		));2162		assert_ok!(Unique::add_to_allow_list(2163			origin1,2164			collection_id,2165			account(2)2166		));21672168		assert_noop!(2169			Unique::create_item(2170				origin2,2171				CollectionId(1),2172				account(2),2173				default_nft_data().into()2174			)2175			.map_err(|e| e.error),2176			CommonError::<Test>::PublicMintingNotAllowed2177		);2178	});2179}21802181// If Public Access mode is set to AllowList, and Mint Permission is set to false, tokens cannot be created by non-privileged and non-allow listed address.2182#[test]2183fn allow_list_test_12() {2184	new_test_ext().execute_with(|| {2185		let collection_id = create_test_collection(&CollectionMode::NFT, CollectionId(1));21862187		let origin1 = RuntimeOrigin::signed(1);2188		let origin2 = RuntimeOrigin::signed(2);21892190		assert_ok!(Unique::set_collection_permissions(2191			origin1.clone(),2192			collection_id,2193			CollectionPermissions {2194				mint_mode: Some(false),2195				access: Some(AccessMode::AllowList),2196				nesting: None,2197			}2198		));21992200		assert_noop!(2201			Unique::create_item(2202				origin2,2203				CollectionId(1),2204				account(2),2205				default_nft_data().into()2206			)2207			.map_err(|e| e.error),2208			CommonError::<Test>::PublicMintingNotAllowed2209		);2210	});2211}22122213// If Public Access mode is set to AllowList, and Mint Permission is set to true, tokens can be created by owner.2214#[test]2215fn allow_list_test_13() {2216	new_test_ext().execute_with(|| {2217		let collection_id = create_test_collection(&CollectionMode::NFT, CollectionId(1));22182219		let origin1 = RuntimeOrigin::signed(1);22202221		assert_ok!(Unique::set_collection_permissions(2222			origin1.clone(),2223			collection_id,2224			CollectionPermissions {2225				mint_mode: Some(true),2226				access: Some(AccessMode::AllowList),2227				nesting: None,2228			}2229		));22302231		let data = default_nft_data();2232		create_test_item(collection_id, &data.into());2233	});2234}22352236// If Public Access mode is set to AllowList, and Mint Permission is set to true, tokens can be created by admin.2237#[test]2238fn allow_list_test_14() {2239	new_test_ext().execute_with(|| {2240		let collection_id = create_test_collection(&CollectionMode::NFT, CollectionId(1));22412242		let origin1 = RuntimeOrigin::signed(1);2243		let origin2 = RuntimeOrigin::signed(2);22442245		assert_ok!(Unique::set_collection_permissions(2246			origin1.clone(),2247			collection_id,2248			CollectionPermissions {2249				mint_mode: Some(true),2250				access: Some(AccessMode::AllowList),2251				nesting: None,2252			}2253		));22542255		assert_ok!(Unique::add_collection_admin(2256			origin1,2257			collection_id,2258			account(2)2259		));22602261		assert_ok!(Unique::create_item(2262			origin2,2263			collection_id,2264			account(2),2265			default_nft_data().into()2266		));2267	});2268}22692270// If Public Access mode is set to AllowList, and Mint Permission is set to true, tokens cannot be created by non-privileged and non-allow listed address.2271#[test]2272fn allow_list_test_15() {2273	new_test_ext().execute_with(|| {2274		let collection_id = create_test_collection(&CollectionMode::NFT, CollectionId(1));22752276		let origin1 = RuntimeOrigin::signed(1);2277		let origin2 = RuntimeOrigin::signed(2);22782279		assert_ok!(Unique::set_collection_permissions(2280			origin1.clone(),2281			collection_id,2282			CollectionPermissions {2283				mint_mode: Some(true),2284				access: Some(AccessMode::AllowList),2285				nesting: None,2286			}2287		));22882289		assert_noop!(2290			Unique::create_item(2291				origin2,2292				collection_id,2293				account(2),2294				default_nft_data().into()2295			)2296			.map_err(|e| e.error),2297			CommonError::<Test>::AddressNotInAllowlist2298		);2299	});2300}23012302// If Public Access mode is set to AllowList, and Mint Permission is set to true, tokens can be created by non-privileged and allow listed address.2303#[test]2304fn allow_list_test_16() {2305	new_test_ext().execute_with(|| {2306		let collection_id = create_test_collection(&CollectionMode::NFT, CollectionId(1));23072308		let origin1 = RuntimeOrigin::signed(1);2309		let origin2 = RuntimeOrigin::signed(2);23102311		assert_ok!(Unique::set_collection_permissions(2312			origin1.clone(),2313			collection_id,2314			CollectionPermissions {2315				mint_mode: Some(true),2316				access: Some(AccessMode::AllowList),2317				nesting: None,2318			}2319		));2320		assert_ok!(Unique::add_to_allow_list(2321			origin1,2322			collection_id,2323			account(2)2324		));23252326		assert_ok!(Unique::create_item(2327			origin2,2328			collection_id,2329			account(2),2330			default_nft_data().into()2331		));2332	});2333}23342335// Total number of collections. Positive test2336#[test]2337fn total_number_collections_bound() {2338	new_test_ext().execute_with(|| {2339		create_test_collection(&CollectionMode::NFT, CollectionId(1));2340	});2341}23422343#[test]2344fn create_max_collections() {2345	new_test_ext().execute_with(|| {2346		for i in 1..COLLECTION_NUMBER_LIMIT {2347			create_test_collection(&CollectionMode::NFT, CollectionId(i));2348		}2349	});2350}23512352// Total number of collections. Negative test2353#[test]2354fn total_number_collections_bound_neg() {2355	new_test_ext().execute_with(|| {2356		let origin1 = RuntimeOrigin::signed(1);23572358		for i in 1..=COLLECTION_NUMBER_LIMIT {2359			create_test_collection(&CollectionMode::NFT, CollectionId(i));2360		}23612362		let col_name1: Vec<u16> = "Test1\0".encode_utf16().collect::<Vec<u16>>();2363		let col_desc1: Vec<u16> = "TestDescription1\0".encode_utf16().collect::<Vec<u16>>();2364		let token_prefix1: Vec<u8> = b"token_prefix1\0".to_vec();23652366		let data: CreateCollectionData<u64> = CreateCollectionData {2367			name: col_name1.try_into().unwrap(),2368			description: col_desc1.try_into().unwrap(),2369			token_prefix: token_prefix1.try_into().unwrap(),2370			mode: CollectionMode::NFT,2371			..Default::default()2372		};23732374		// 11-th collection in chain. Expects error2375		assert_noop!(2376			Unique::create_collection_ex(origin1, data),2377			CommonError::<Test>::TotalCollectionsLimitExceeded2378		);2379	});2380}23812382// Owned tokens by a single address. Positive test2383#[test]2384fn owned_tokens_bound() {2385	new_test_ext().execute_with(|| {2386		let collection_id = create_test_collection(&CollectionMode::NFT, CollectionId(1));23872388		let data = default_nft_data();2389		create_test_item(collection_id, &data.clone().into());2390		create_test_item(collection_id, &data.into());2391	});2392}23932394// Owned tokens by a single address. Negotive test2395#[test]2396fn owned_tokens_bound_neg() {2397	new_test_ext().execute_with(|| {2398		let collection_id = create_test_collection(&CollectionMode::NFT, CollectionId(1));23992400		let origin1 = RuntimeOrigin::signed(1);24012402		for _ in 1..=MAX_TOKEN_OWNERSHIP {2403			let data = default_nft_data();2404			create_test_item(collection_id, &data.clone().into());2405		}24062407		let data = default_nft_data();2408		assert_noop!(2409			Unique::create_item(origin1, CollectionId(1), account(1), data.into())2410				.map_err(|e| e.error),2411			CommonError::<Test>::AccountTokenLimitExceeded2412		);2413	});2414}24152416// Number of collection admins. Positive test2417#[test]2418fn collection_admins_bound() {2419	new_test_ext().execute_with(|| {2420		let collection_id = create_test_collection(&CollectionMode::NFT, CollectionId(1));24212422		let origin1 = RuntimeOrigin::signed(1);24232424		assert_ok!(Unique::add_collection_admin(2425			origin1.clone(),2426			collection_id,2427			account(2)2428		));2429		assert_ok!(Unique::add_collection_admin(2430			origin1,2431			collection_id,2432			account(3)2433		));2434	});2435}24362437// Number of collection admins. Negotive test2438#[test]2439fn collection_admins_bound_neg() {2440	new_test_ext().execute_with(|| {2441		let collection_id = create_test_collection(&CollectionMode::NFT, CollectionId(1));24422443		let origin1 = RuntimeOrigin::signed(1);24442445		for i in 0..COLLECTION_ADMINS_LIMIT {2446			assert_ok!(Unique::add_collection_admin(2447				origin1.clone(),2448				collection_id,2449				account((2 + i).into())2450			));2451		}2452		assert_noop!(2453			Unique::add_collection_admin(2454				origin1,2455				collection_id,2456				account((3 + COLLECTION_ADMINS_LIMIT).into())2457			),2458			CommonError::<Test>::CollectionAdminCountExceeded2459		);2460	});2461}2462// #endregion24632464#[test]2465fn collection_transfer_flag_works() {2466	new_test_ext().execute_with(|| {2467		let origin1 = RuntimeOrigin::signed(1);24682469		let collection_id = create_test_collection(&CollectionMode::NFT, CollectionId(1));2470		assert_ok!(Unique::set_transfers_enabled_flag(2471			origin1,2472			collection_id,2473			true2474		));24752476		let data = default_nft_data();2477		create_test_item(collection_id, &data.into());2478		assert_eq!(2479			<pallet_nonfungible::AccountBalance<Test>>::get((collection_id, account(1))),2480			12481		);2482		assert_eq!(2483			<pallet_nonfungible::Owned<Test>>::get((collection_id, account(1), TokenId(1))),2484			true2485		);24862487		let origin1 = RuntimeOrigin::signed(1);24882489		// default scenario2490		assert_ok!(Unique::transfer(2491			origin1,2492			account(2),2493			collection_id,2494			TokenId(1),2495			12496		));2497		assert_eq!(2498			<pallet_nonfungible::Owned<Test>>::get((collection_id, account(1), TokenId(1))),2499			false2500		);2501		assert_eq!(2502			<pallet_nonfungible::Owned<Test>>::get((collection_id, account(2), TokenId(1))),2503			true2504		);2505		assert_eq!(2506			<pallet_nonfungible::AccountBalance<Test>>::get((collection_id, account(1))),2507			02508		);2509		assert_eq!(2510			<pallet_nonfungible::AccountBalance<Test>>::get((collection_id, account(2))),2511			12512		);2513	});2514}25152516#[test]2517fn collection_transfer_flag_works_neg() {2518	new_test_ext().execute_with(|| {2519		let origin1 = RuntimeOrigin::signed(1);25202521		let collection_id = create_test_collection(&CollectionMode::NFT, CollectionId(1));2522		assert_ok!(Unique::set_transfers_enabled_flag(2523			origin1,2524			collection_id,2525			false2526		));25272528		let data = default_nft_data();2529		create_test_item(collection_id, &data.into());2530		assert_eq!(2531			<pallet_nonfungible::AccountBalance<Test>>::get((collection_id, account(1))),2532			12533		);2534		assert_eq!(2535			<pallet_nonfungible::Owned<Test>>::get((collection_id, account(1), TokenId(1))),2536			true2537		);25382539		let origin1 = RuntimeOrigin::signed(1);25402541		// default scenario2542		assert_noop!(2543			Unique::transfer(origin1, account(2), CollectionId(1), TokenId(1), 1)2544				.map_err(|e| e.error),2545			CommonError::<Test>::TransferNotAllowed2546		);2547		assert_eq!(2548			<pallet_nonfungible::AccountBalance<Test>>::get((collection_id, account(1))),2549			12550		);2551		assert_eq!(2552			<pallet_nonfungible::AccountBalance<Test>>::get((collection_id, account(2))),2553			02554		);2555		assert_eq!(2556			<pallet_nonfungible::Owned<Test>>::get((collection_id, account(1), TokenId(1))),2557			true2558		);2559		assert_eq!(2560			<pallet_nonfungible::Owned<Test>>::get((collection_id, account(2), TokenId(1))),2561			false2562		);2563	});2564}25652566#[test]2567fn collection_sponsoring() {2568	new_test_ext().execute_with(|| {2569		// default_limits();2570		let user1 = 1_u64;2571		let user2 = 777_u64;2572		let origin1 = RuntimeOrigin::signed(user1);2573		let origin2 = RuntimeOrigin::signed(user2);2574		let account2 = account(user2);25752576		let collection_id =2577			create_test_collection_for_owner(&CollectionMode::NFT, user1, CollectionId(1));2578		assert_ok!(Unique::set_collection_sponsor(2579			origin1.clone(),2580			collection_id,2581			user12582		));2583		assert_ok!(Unique::confirm_sponsorship(origin1.clone(), collection_id));25842585		// Expect error while have no permissions2586		assert!(Unique::create_item(2587			origin2.clone(),2588			collection_id,2589			account2.clone(),2590			default_nft_data().into()2591		)2592		.is_err());25932594		assert_ok!(Unique::set_collection_permissions(2595			origin1.clone(),2596			collection_id,2597			CollectionPermissions {2598				mint_mode: Some(true),2599				access: Some(AccessMode::AllowList),2600				nesting: None,2601			}2602		));2603		assert_ok!(Unique::add_to_allow_list(2604			origin1.clone(),2605			collection_id,2606			account2.clone()2607		));26082609		assert_ok!(Unique::create_item(2610			origin2,2611			collection_id,2612			account2,2613			default_nft_data().into()2614		));2615	});2616}
modifiedtests/package.jsondiffbeforeafterboth
--- a/tests/package.json
+++ b/tests/package.json
@@ -4,7 +4,7 @@
   "description": "Unique Chain Tests",
   "main": "",
   "devDependencies": {
-    "@polkadot/typegen": "9.9.4",
+    "@polkadot/typegen": "9.10.2",
     "@types/chai": "^4.3.3",
     "@types/chai-as-promised": "^7.1.5",
     "@types/chai-like": "^1.1.1",
@@ -117,7 +117,8 @@
   "license": "SEE LICENSE IN ../LICENSE",
   "homepage": "",
   "dependencies": {
-    "@polkadot/api": "9.9.4",
+    "@polkadot/api": "9.10.2",
+    "@polkadot/util": "10.2.1",
     "@polkadot/util-crypto": "10.2.1",
     "chai-as-promised": "^7.1.1",
     "chai-like": "^1.1.1",
@@ -125,5 +126,8 @@
     "find-process": "^1.4.7",
     "solc": "0.8.17",
     "web3": "^1.8.1"
+  },
+  "resolutions": {
+    "decode-uri-component": "^0.2.1"
   }
 }
modifiedtests/src/interfaces/augment-api-query.tsdiffbeforeafterboth
--- a/tests/src/interfaces/augment-api-query.ts
+++ b/tests/src/interfaces/augment-api-query.ts
@@ -9,7 +9,7 @@
 import type { BTreeMap, Bytes, Option, U256, Vec, bool, u128, u16, u32, u64, u8 } from '@polkadot/types-codec';
 import type { AnyNumber, ITuple } from '@polkadot/types-codec/types';
 import type { AccountId32, H160, H256 } from '@polkadot/types/interfaces/runtime';
-import type { CumulusPalletDmpQueueConfigData, CumulusPalletDmpQueuePageIndexData, CumulusPalletParachainSystemRelayStateSnapshotMessagingStateSnapshot, CumulusPalletXcmpQueueInboundChannelDetails, CumulusPalletXcmpQueueOutboundChannelDetails, CumulusPalletXcmpQueueQueueConfigData, EthereumBlock, EthereumLog, EthereumReceiptReceiptV3, EthereumTransactionTransactionV2, FpRpcTransactionStatus, FrameSupportDispatchPerDispatchClassWeight, FrameSystemAccountInfo, FrameSystemEventRecord, FrameSystemLastRuntimeUpgradeInfo, FrameSystemPhase, OrmlTokensAccountData, OrmlTokensBalanceLock, OrmlTokensReserveData, OrmlVestingVestingSchedule, PalletBalancesAccountData, PalletBalancesBalanceLock, PalletBalancesReserveData, PalletConfigurationAppPromotionConfiguration, PalletEvmAccountBasicCrossAccountIdRepr, PalletEvmContractHelpersSponsoringModeT, PalletForeignAssetsAssetIds, PalletForeignAssetsModuleAssetMetadata, PalletNonfungibleItemData, PalletRefungibleItemData, PalletTransactionPaymentReleases, PalletTreasuryProposal, PhantomTypeUpDataStructs, PolkadotCorePrimitivesOutboundHrmpMessage, PolkadotPrimitivesV2AbridgedHostConfiguration, PolkadotPrimitivesV2PersistedValidationData, PolkadotPrimitivesV2UpgradeRestriction, SpRuntimeDigest, SpTrieStorageProof, SpWeightsWeightV2Weight, UpDataStructsCollection, UpDataStructsCollectionStats, UpDataStructsProperties, UpDataStructsPropertiesMapPropertyPermission, UpDataStructsPropertyPermission, UpDataStructsPropertyScope, UpDataStructsSponsorshipStateBasicCrossAccountIdRepr, UpDataStructsTokenChild, XcmV1MultiLocation } from '@polkadot/types/lookup';
+import type { CumulusPalletDmpQueueConfigData, CumulusPalletDmpQueuePageIndexData, CumulusPalletParachainSystemRelayStateSnapshotMessagingStateSnapshot, CumulusPalletXcmpQueueInboundChannelDetails, CumulusPalletXcmpQueueOutboundChannelDetails, CumulusPalletXcmpQueueQueueConfigData, EthereumBlock, EthereumLog, EthereumReceiptReceiptV3, EthereumTransactionTransactionV2, FpRpcTransactionStatus, FrameSupportDispatchPerDispatchClassWeight, FrameSystemAccountInfo, FrameSystemEventRecord, FrameSystemLastRuntimeUpgradeInfo, FrameSystemPhase, OrmlTokensAccountData, OrmlTokensBalanceLock, OrmlTokensReserveData, OrmlVestingVestingSchedule, PalletBalancesAccountData, PalletBalancesBalanceLock, PalletBalancesReserveData, PalletConfigurationAppPromotionConfiguration, PalletEvmAccountBasicCrossAccountIdRepr, PalletEvmContractHelpersSponsoringModeT, PalletForeignAssetsAssetIds, PalletForeignAssetsModuleAssetMetadata, PalletNonfungibleItemData, PalletTransactionPaymentReleases, PalletTreasuryProposal, PhantomTypeUpDataStructs, PolkadotCorePrimitivesOutboundHrmpMessage, PolkadotPrimitivesV2AbridgedHostConfiguration, PolkadotPrimitivesV2PersistedValidationData, PolkadotPrimitivesV2UpgradeRestriction, SpRuntimeDigest, SpTrieStorageProof, SpWeightsWeightV2Weight, UpDataStructsCollection, UpDataStructsCollectionStats, UpDataStructsProperties, UpDataStructsPropertiesMapPropertyPermission, UpDataStructsPropertyPermission, UpDataStructsPropertyScope, UpDataStructsSponsorshipStateBasicCrossAccountIdRepr, UpDataStructsTokenChild, XcmV1MultiLocation } from '@polkadot/types/lookup';
 import type { Observable } from '@polkadot/types/types';
 
 export type __AugmentedQuery<ApiType extends ApiTypes> = AugmentedQuery<ApiType, () => unknown>;
@@ -632,10 +632,6 @@
        * Used to enumerate tokens owned by account.
        **/
       owned: AugmentedQuery<ApiType, (arg1: u32 | AnyNumber | Uint8Array, arg2: PalletEvmAccountBasicCrossAccountIdRepr | { Substrate: any } | { Ethereum: any } | string | Uint8Array, arg3: u32 | AnyNumber | Uint8Array) => Observable<bool>, [u32, PalletEvmAccountBasicCrossAccountIdRepr, u32]> & QueryableStorageEntry<ApiType, [u32, PalletEvmAccountBasicCrossAccountIdRepr, u32]>;
-      /**
-       * Token data, used to partially describe a token.
-       **/
-      tokenData: AugmentedQuery<ApiType, (arg1: u32 | AnyNumber | Uint8Array, arg2: u32 | AnyNumber | Uint8Array) => Observable<PalletRefungibleItemData>, [u32, u32]> & QueryableStorageEntry<ApiType, [u32, u32]>;
       /**
        * Amount of pieces a refungible token is split into.
        **/
modifiedtests/src/interfaces/augment-types.tsdiffbeforeafterboth
--- a/tests/src/interfaces/augment-types.ts
+++ b/tests/src/interfaces/augment-types.ts
@@ -5,7 +5,7 @@
 // this is required to allow for ambient/previous definitions
 import '@polkadot/types/types/registry';
 
-import type { CumulusPalletDmpQueueCall, CumulusPalletDmpQueueConfigData, CumulusPalletDmpQueueError, CumulusPalletDmpQueueEvent, CumulusPalletDmpQueuePageIndexData, CumulusPalletParachainSystemCall, CumulusPalletParachainSystemError, CumulusPalletParachainSystemEvent, CumulusPalletParachainSystemRelayStateSnapshotMessagingStateSnapshot, CumulusPalletXcmCall, CumulusPalletXcmError, CumulusPalletXcmEvent, CumulusPalletXcmpQueueCall, CumulusPalletXcmpQueueError, CumulusPalletXcmpQueueEvent, CumulusPalletXcmpQueueInboundChannelDetails, CumulusPalletXcmpQueueInboundState, CumulusPalletXcmpQueueOutboundChannelDetails, CumulusPalletXcmpQueueOutboundState, CumulusPalletXcmpQueueQueueConfigData, CumulusPrimitivesParachainInherentParachainInherentData, EthbloomBloom, EthereumBlock, EthereumHeader, EthereumLog, EthereumReceiptEip658ReceiptData, EthereumReceiptReceiptV3, EthereumTransactionAccessListItem, EthereumTransactionEip1559Transaction, EthereumTransactionEip2930Transaction, EthereumTransactionLegacyTransaction, EthereumTransactionTransactionAction, EthereumTransactionTransactionSignature, EthereumTransactionTransactionV2, EthereumTypesHashH64, EvmCoreErrorExitError, EvmCoreErrorExitFatal, EvmCoreErrorExitReason, EvmCoreErrorExitRevert, EvmCoreErrorExitSucceed, FpRpcTransactionStatus, FrameSupportDispatchDispatchClass, FrameSupportDispatchDispatchInfo, FrameSupportDispatchPays, FrameSupportDispatchPerDispatchClassU32, FrameSupportDispatchPerDispatchClassWeight, FrameSupportDispatchPerDispatchClassWeightsPerClass, FrameSupportPalletId, FrameSupportTokensMiscBalanceStatus, FrameSystemAccountInfo, FrameSystemCall, FrameSystemError, FrameSystemEvent, FrameSystemEventRecord, FrameSystemExtensionsCheckGenesis, FrameSystemExtensionsCheckNonce, FrameSystemExtensionsCheckSpecVersion, FrameSystemExtensionsCheckTxVersion, FrameSystemExtensionsCheckWeight, FrameSystemLastRuntimeUpgradeInfo, FrameSystemLimitsBlockLength, FrameSystemLimitsBlockWeights, FrameSystemLimitsWeightsPerClass, FrameSystemPhase, OpalRuntimeRuntime, OpalRuntimeRuntimeCommonMaintenanceCheckMaintenance, OrmlTokensAccountData, OrmlTokensBalanceLock, OrmlTokensModuleCall, OrmlTokensModuleError, OrmlTokensModuleEvent, OrmlTokensReserveData, OrmlVestingModuleCall, OrmlVestingModuleError, OrmlVestingModuleEvent, OrmlVestingVestingSchedule, OrmlXtokensModuleCall, OrmlXtokensModuleError, OrmlXtokensModuleEvent, PalletAppPromotionCall, PalletAppPromotionError, PalletAppPromotionEvent, PalletBalancesAccountData, PalletBalancesBalanceLock, PalletBalancesCall, PalletBalancesError, PalletBalancesEvent, PalletBalancesReasons, PalletBalancesReserveData, PalletCommonError, PalletCommonEvent, PalletConfigurationAppPromotionConfiguration, PalletConfigurationCall, PalletConfigurationError, PalletEthereumCall, PalletEthereumError, PalletEthereumEvent, PalletEthereumFakeTransactionFinalizer, PalletEvmAccountBasicCrossAccountIdRepr, PalletEvmCall, PalletEvmCoderSubstrateError, PalletEvmContractHelpersError, PalletEvmContractHelpersEvent, PalletEvmContractHelpersSponsoringModeT, PalletEvmError, PalletEvmEvent, PalletEvmMigrationCall, PalletEvmMigrationError, PalletEvmMigrationEvent, PalletForeignAssetsAssetIds, PalletForeignAssetsModuleAssetMetadata, PalletForeignAssetsModuleCall, PalletForeignAssetsModuleError, PalletForeignAssetsModuleEvent, PalletForeignAssetsNativeCurrency, PalletFungibleError, PalletInflationCall, PalletMaintenanceCall, PalletMaintenanceError, PalletMaintenanceEvent, PalletNonfungibleError, PalletNonfungibleItemData, PalletRefungibleError, PalletRefungibleItemData, PalletRmrkCoreCall, PalletRmrkCoreError, PalletRmrkCoreEvent, PalletRmrkEquipCall, PalletRmrkEquipError, PalletRmrkEquipEvent, PalletStructureCall, PalletStructureError, PalletStructureEvent, PalletSudoCall, PalletSudoError, PalletSudoEvent, PalletTemplateTransactionPaymentCall, PalletTemplateTransactionPaymentChargeTransactionPayment, PalletTestUtilsCall, PalletTestUtilsError, PalletTestUtilsEvent, PalletTimestampCall, PalletTransactionPaymentEvent, PalletTransactionPaymentReleases, PalletTreasuryCall, PalletTreasuryError, PalletTreasuryEvent, PalletTreasuryProposal, PalletUniqueCall, PalletUniqueError, PalletXcmCall, PalletXcmError, PalletXcmEvent, PhantomTypeUpDataStructs, PolkadotCorePrimitivesInboundDownwardMessage, PolkadotCorePrimitivesInboundHrmpMessage, PolkadotCorePrimitivesOutboundHrmpMessage, PolkadotParachainPrimitivesXcmpMessageFormat, PolkadotPrimitivesV2AbridgedHostConfiguration, PolkadotPrimitivesV2AbridgedHrmpChannel, PolkadotPrimitivesV2PersistedValidationData, PolkadotPrimitivesV2UpgradeRestriction, RmrkTraitsBaseBaseInfo, RmrkTraitsCollectionCollectionInfo, RmrkTraitsNftAccountIdOrCollectionNftTuple, RmrkTraitsNftNftChild, RmrkTraitsNftNftInfo, RmrkTraitsNftRoyaltyInfo, RmrkTraitsPartEquippableList, RmrkTraitsPartFixedPart, RmrkTraitsPartPartType, RmrkTraitsPartSlotPart, RmrkTraitsPropertyPropertyInfo, RmrkTraitsResourceBasicResource, RmrkTraitsResourceComposableResource, RmrkTraitsResourceResourceInfo, RmrkTraitsResourceResourceTypes, RmrkTraitsResourceSlotResource, RmrkTraitsTheme, RmrkTraitsThemeThemeProperty, SpCoreEcdsaSignature, SpCoreEd25519Signature, SpCoreSr25519Signature, SpRuntimeArithmeticError, SpRuntimeDigest, SpRuntimeDigestDigestItem, SpRuntimeDispatchError, SpRuntimeModuleError, SpRuntimeMultiSignature, SpRuntimeTokenError, SpRuntimeTransactionalError, SpTrieStorageProof, SpVersionRuntimeVersion, SpWeightsRuntimeDbWeight, SpWeightsWeightV2Weight, UpDataStructsAccessMode, UpDataStructsCollection, UpDataStructsCollectionLimits, UpDataStructsCollectionMode, UpDataStructsCollectionPermissions, UpDataStructsCollectionStats, UpDataStructsCreateCollectionData, UpDataStructsCreateFungibleData, UpDataStructsCreateItemData, UpDataStructsCreateItemExData, UpDataStructsCreateNftData, UpDataStructsCreateNftExData, UpDataStructsCreateReFungibleData, UpDataStructsCreateRefungibleExMultipleOwners, UpDataStructsCreateRefungibleExSingleOwner, UpDataStructsNestingPermissions, UpDataStructsOwnerRestrictedSet, UpDataStructsProperties, UpDataStructsPropertiesMapBoundedVec, UpDataStructsPropertiesMapPropertyPermission, UpDataStructsProperty, UpDataStructsPropertyKeyPermission, UpDataStructsPropertyPermission, UpDataStructsPropertyScope, UpDataStructsRpcCollection, UpDataStructsRpcCollectionFlags, UpDataStructsSponsoringRateLimit, UpDataStructsSponsorshipStateAccountId32, UpDataStructsSponsorshipStateBasicCrossAccountIdRepr, UpDataStructsTokenChild, UpDataStructsTokenData, XcmDoubleEncoded, XcmV0Junction, XcmV0JunctionBodyId, XcmV0JunctionBodyPart, XcmV0JunctionNetworkId, XcmV0MultiAsset, XcmV0MultiLocation, XcmV0Order, XcmV0OriginKind, XcmV0Response, XcmV0Xcm, XcmV1Junction, XcmV1MultiAsset, XcmV1MultiLocation, XcmV1MultiassetAssetId, XcmV1MultiassetAssetInstance, XcmV1MultiassetFungibility, XcmV1MultiassetMultiAssetFilter, XcmV1MultiassetMultiAssets, XcmV1MultiassetWildFungibility, XcmV1MultiassetWildMultiAsset, XcmV1MultilocationJunctions, XcmV1Order, XcmV1Response, XcmV1Xcm, XcmV2Instruction, XcmV2Response, XcmV2TraitsError, XcmV2TraitsOutcome, XcmV2WeightLimit, XcmV2Xcm, XcmVersionedMultiAsset, XcmVersionedMultiAssets, XcmVersionedMultiLocation, XcmVersionedXcm } from './default';
+import type { CumulusPalletDmpQueueCall, CumulusPalletDmpQueueConfigData, CumulusPalletDmpQueueError, CumulusPalletDmpQueueEvent, CumulusPalletDmpQueuePageIndexData, CumulusPalletParachainSystemCall, CumulusPalletParachainSystemError, CumulusPalletParachainSystemEvent, CumulusPalletParachainSystemRelayStateSnapshotMessagingStateSnapshot, CumulusPalletXcmCall, CumulusPalletXcmError, CumulusPalletXcmEvent, CumulusPalletXcmpQueueCall, CumulusPalletXcmpQueueError, CumulusPalletXcmpQueueEvent, CumulusPalletXcmpQueueInboundChannelDetails, CumulusPalletXcmpQueueInboundState, CumulusPalletXcmpQueueOutboundChannelDetails, CumulusPalletXcmpQueueOutboundState, CumulusPalletXcmpQueueQueueConfigData, CumulusPrimitivesParachainInherentParachainInherentData, EthbloomBloom, EthereumBlock, EthereumHeader, EthereumLog, EthereumReceiptEip658ReceiptData, EthereumReceiptReceiptV3, EthereumTransactionAccessListItem, EthereumTransactionEip1559Transaction, EthereumTransactionEip2930Transaction, EthereumTransactionLegacyTransaction, EthereumTransactionTransactionAction, EthereumTransactionTransactionSignature, EthereumTransactionTransactionV2, EthereumTypesHashH64, EvmCoreErrorExitError, EvmCoreErrorExitFatal, EvmCoreErrorExitReason, EvmCoreErrorExitRevert, EvmCoreErrorExitSucceed, FpRpcTransactionStatus, FrameSupportDispatchDispatchClass, FrameSupportDispatchDispatchInfo, FrameSupportDispatchPays, FrameSupportDispatchPerDispatchClassU32, FrameSupportDispatchPerDispatchClassWeight, FrameSupportDispatchPerDispatchClassWeightsPerClass, FrameSupportPalletId, FrameSupportTokensMiscBalanceStatus, FrameSystemAccountInfo, FrameSystemCall, FrameSystemError, FrameSystemEvent, FrameSystemEventRecord, FrameSystemExtensionsCheckGenesis, FrameSystemExtensionsCheckNonce, FrameSystemExtensionsCheckSpecVersion, FrameSystemExtensionsCheckTxVersion, FrameSystemExtensionsCheckWeight, FrameSystemLastRuntimeUpgradeInfo, FrameSystemLimitsBlockLength, FrameSystemLimitsBlockWeights, FrameSystemLimitsWeightsPerClass, FrameSystemPhase, OpalRuntimeRuntime, OpalRuntimeRuntimeCommonMaintenanceCheckMaintenance, OrmlTokensAccountData, OrmlTokensBalanceLock, OrmlTokensModuleCall, OrmlTokensModuleError, OrmlTokensModuleEvent, OrmlTokensReserveData, OrmlVestingModuleCall, OrmlVestingModuleError, OrmlVestingModuleEvent, OrmlVestingVestingSchedule, OrmlXtokensModuleCall, OrmlXtokensModuleError, OrmlXtokensModuleEvent, PalletAppPromotionCall, PalletAppPromotionError, PalletAppPromotionEvent, PalletBalancesAccountData, PalletBalancesBalanceLock, PalletBalancesCall, PalletBalancesError, PalletBalancesEvent, PalletBalancesReasons, PalletBalancesReserveData, PalletCommonError, PalletCommonEvent, PalletConfigurationAppPromotionConfiguration, PalletConfigurationCall, PalletConfigurationError, PalletEthereumCall, PalletEthereumError, PalletEthereumEvent, PalletEthereumFakeTransactionFinalizer, PalletEvmAccountBasicCrossAccountIdRepr, PalletEvmCall, PalletEvmCoderSubstrateError, PalletEvmContractHelpersError, PalletEvmContractHelpersEvent, PalletEvmContractHelpersSponsoringModeT, PalletEvmError, PalletEvmEvent, PalletEvmMigrationCall, PalletEvmMigrationError, PalletEvmMigrationEvent, PalletForeignAssetsAssetIds, PalletForeignAssetsModuleAssetMetadata, PalletForeignAssetsModuleCall, PalletForeignAssetsModuleError, PalletForeignAssetsModuleEvent, PalletForeignAssetsNativeCurrency, PalletFungibleError, PalletInflationCall, PalletMaintenanceCall, PalletMaintenanceError, PalletMaintenanceEvent, PalletNonfungibleError, PalletNonfungibleItemData, PalletRefungibleError, PalletRmrkCoreCall, PalletRmrkCoreError, PalletRmrkCoreEvent, PalletRmrkEquipCall, PalletRmrkEquipError, PalletRmrkEquipEvent, PalletStructureCall, PalletStructureError, PalletStructureEvent, PalletSudoCall, PalletSudoError, PalletSudoEvent, PalletTemplateTransactionPaymentCall, PalletTemplateTransactionPaymentChargeTransactionPayment, PalletTestUtilsCall, PalletTestUtilsError, PalletTestUtilsEvent, PalletTimestampCall, PalletTransactionPaymentEvent, PalletTransactionPaymentReleases, PalletTreasuryCall, PalletTreasuryError, PalletTreasuryEvent, PalletTreasuryProposal, PalletUniqueCall, PalletUniqueError, PalletXcmCall, PalletXcmError, PalletXcmEvent, PhantomTypeUpDataStructs, PolkadotCorePrimitivesInboundDownwardMessage, PolkadotCorePrimitivesInboundHrmpMessage, PolkadotCorePrimitivesOutboundHrmpMessage, PolkadotParachainPrimitivesXcmpMessageFormat, PolkadotPrimitivesV2AbridgedHostConfiguration, PolkadotPrimitivesV2AbridgedHrmpChannel, PolkadotPrimitivesV2PersistedValidationData, PolkadotPrimitivesV2UpgradeRestriction, RmrkTraitsBaseBaseInfo, RmrkTraitsCollectionCollectionInfo, RmrkTraitsNftAccountIdOrCollectionNftTuple, RmrkTraitsNftNftChild, RmrkTraitsNftNftInfo, RmrkTraitsNftRoyaltyInfo, RmrkTraitsPartEquippableList, RmrkTraitsPartFixedPart, RmrkTraitsPartPartType, RmrkTraitsPartSlotPart, RmrkTraitsPropertyPropertyInfo, RmrkTraitsResourceBasicResource, RmrkTraitsResourceComposableResource, RmrkTraitsResourceResourceInfo, RmrkTraitsResourceResourceTypes, RmrkTraitsResourceSlotResource, RmrkTraitsTheme, RmrkTraitsThemeThemeProperty, SpCoreEcdsaSignature, SpCoreEd25519Signature, SpCoreSr25519Signature, SpRuntimeArithmeticError, SpRuntimeDigest, SpRuntimeDigestDigestItem, SpRuntimeDispatchError, SpRuntimeModuleError, SpRuntimeMultiSignature, SpRuntimeTokenError, SpRuntimeTransactionalError, SpTrieStorageProof, SpVersionRuntimeVersion, SpWeightsRuntimeDbWeight, SpWeightsWeightV2Weight, UpDataStructsAccessMode, UpDataStructsCollection, UpDataStructsCollectionLimits, UpDataStructsCollectionMode, UpDataStructsCollectionPermissions, UpDataStructsCollectionStats, UpDataStructsCreateCollectionData, UpDataStructsCreateFungibleData, UpDataStructsCreateItemData, UpDataStructsCreateItemExData, UpDataStructsCreateNftData, UpDataStructsCreateNftExData, UpDataStructsCreateReFungibleData, UpDataStructsCreateRefungibleExMultipleOwners, UpDataStructsCreateRefungibleExSingleOwner, UpDataStructsNestingPermissions, UpDataStructsOwnerRestrictedSet, UpDataStructsProperties, UpDataStructsPropertiesMapBoundedVec, UpDataStructsPropertiesMapPropertyPermission, UpDataStructsProperty, UpDataStructsPropertyKeyPermission, UpDataStructsPropertyPermission, UpDataStructsPropertyScope, UpDataStructsRpcCollection, UpDataStructsRpcCollectionFlags, UpDataStructsSponsoringRateLimit, UpDataStructsSponsorshipStateAccountId32, UpDataStructsSponsorshipStateBasicCrossAccountIdRepr, UpDataStructsTokenChild, UpDataStructsTokenData, XcmDoubleEncoded, XcmV0Junction, XcmV0JunctionBodyId, XcmV0JunctionBodyPart, XcmV0JunctionNetworkId, XcmV0MultiAsset, XcmV0MultiLocation, XcmV0Order, XcmV0OriginKind, XcmV0Response, XcmV0Xcm, XcmV1Junction, XcmV1MultiAsset, XcmV1MultiLocation, XcmV1MultiassetAssetId, XcmV1MultiassetAssetInstance, XcmV1MultiassetFungibility, XcmV1MultiassetMultiAssetFilter, XcmV1MultiassetMultiAssets, XcmV1MultiassetWildFungibility, XcmV1MultiassetWildMultiAsset, XcmV1MultilocationJunctions, XcmV1Order, XcmV1Response, XcmV1Xcm, XcmV2Instruction, XcmV2Response, XcmV2TraitsError, XcmV2TraitsOutcome, XcmV2WeightLimit, XcmV2Xcm, XcmVersionedMultiAsset, XcmVersionedMultiAssets, XcmVersionedMultiLocation, XcmVersionedXcm } from './default';
 import type { Data, StorageKey } from '@polkadot/types';
 import type { BitVec, Bool, Bytes, F32, F64, I128, I16, I256, I32, I64, I8, Json, Null, OptionBool, Raw, Text, Type, U128, U16, U256, U32, U64, U8, USize, bool, f32, f64, i128, i16, i256, i32, i64, i8, u128, u16, u256, u32, u64, u8, usize } from '@polkadot/types-codec';
 import type { AssetApproval, AssetApprovalKey, AssetBalance, AssetDestroyWitness, AssetDetails, AssetMetadata, TAssetBalance, TAssetDepositBalance } from '@polkadot/types/interfaces/assets';
@@ -869,7 +869,6 @@
     PalletNonfungibleError: PalletNonfungibleError;
     PalletNonfungibleItemData: PalletNonfungibleItemData;
     PalletRefungibleError: PalletRefungibleError;
-    PalletRefungibleItemData: PalletRefungibleItemData;
     PalletRmrkCoreCall: PalletRmrkCoreCall;
     PalletRmrkCoreError: PalletRmrkCoreError;
     PalletRmrkCoreEvent: PalletRmrkCoreEvent;
modifiedtests/src/interfaces/default/types.tsdiffbeforeafterboth
--- a/tests/src/interfaces/default/types.ts
+++ b/tests/src/interfaces/default/types.ts
@@ -1654,11 +1654,6 @@
   readonly type: 'NotRefungibleDataUsedToMintFungibleCollectionToken' | 'WrongRefungiblePieces' | 'RepartitionWhileNotOwningAllPieces' | 'RefungibleDisallowsNesting' | 'SettingPropertiesNotAllowed';
 }
 
-/** @name PalletRefungibleItemData */
-export interface PalletRefungibleItemData extends Struct {
-  readonly constData: Bytes;
-}
-
 /** @name PalletRmrkCoreCall */
 export interface PalletRmrkCoreCall extends Enum {
   readonly isCreateCollection: boolean;
modifiedtests/src/interfaces/lookup.tsdiffbeforeafterboth
--- a/tests/src/interfaces/lookup.ts
+++ b/tests/src/interfaces/lookup.ts
@@ -3210,73 +3210,67 @@
     _enum: ['NotFungibleDataUsedToMintFungibleCollectionToken', 'FungibleItemsHaveNoId', 'FungibleItemsDontHaveData', 'FungibleDisallowsNesting', 'SettingPropertiesNotAllowed', 'SettingAllowanceForAllNotAllowed', 'FungibleTokensAreAlwaysValid']
   },
   /**
-   * Lookup417: pallet_refungible::ItemData
-   **/
-  PalletRefungibleItemData: {
-    constData: 'Bytes'
-  },
-  /**
-   * Lookup422: pallet_refungible::pallet::Error<T>
+   * Lookup420: pallet_refungible::pallet::Error<T>
    **/
   PalletRefungibleError: {
     _enum: ['NotRefungibleDataUsedToMintFungibleCollectionToken', 'WrongRefungiblePieces', 'RepartitionWhileNotOwningAllPieces', 'RefungibleDisallowsNesting', 'SettingPropertiesNotAllowed']
   },
   /**
-   * Lookup423: pallet_nonfungible::ItemData<pallet_evm::account::BasicCrossAccountIdRepr<sp_core::crypto::AccountId32>>
+   * Lookup421: pallet_nonfungible::ItemData<pallet_evm::account::BasicCrossAccountIdRepr<sp_core::crypto::AccountId32>>
    **/
   PalletNonfungibleItemData: {
     owner: 'PalletEvmAccountBasicCrossAccountIdRepr'
   },
   /**
-   * Lookup425: up_data_structs::PropertyScope
+   * Lookup423: up_data_structs::PropertyScope
    **/
   UpDataStructsPropertyScope: {
     _enum: ['None', 'Rmrk']
   },
   /**
-   * Lookup427: pallet_nonfungible::pallet::Error<T>
+   * Lookup426: pallet_nonfungible::pallet::Error<T>
    **/
   PalletNonfungibleError: {
     _enum: ['NotNonfungibleDataUsedToMintFungibleCollectionToken', 'NonfungibleItemsHaveNoAmount', 'CantBurnNftWithChildren']
   },
   /**
-   * Lookup428: pallet_structure::pallet::Error<T>
+   * Lookup427: pallet_structure::pallet::Error<T>
    **/
   PalletStructureError: {
     _enum: ['OuroborosDetected', 'DepthLimit', 'BreadthLimit', 'TokenNotFound']
   },
   /**
-   * Lookup429: pallet_rmrk_core::pallet::Error<T>
+   * Lookup428: pallet_rmrk_core::pallet::Error<T>
    **/
   PalletRmrkCoreError: {
     _enum: ['CorruptedCollectionType', 'RmrkPropertyKeyIsTooLong', 'RmrkPropertyValueIsTooLong', 'RmrkPropertyIsNotFound', 'UnableToDecodeRmrkData', 'CollectionNotEmpty', 'NoAvailableCollectionId', 'NoAvailableNftId', 'CollectionUnknown', 'NoPermission', 'NonTransferable', 'CollectionFullOrLocked', 'ResourceDoesntExist', 'CannotSendToDescendentOrSelf', 'CannotAcceptNonOwnedNft', 'CannotRejectNonOwnedNft', 'CannotRejectNonPendingNft', 'ResourceNotPending', 'NoAvailableResourceId']
   },
   /**
-   * Lookup431: pallet_rmrk_equip::pallet::Error<T>
+   * Lookup430: pallet_rmrk_equip::pallet::Error<T>
    **/
   PalletRmrkEquipError: {
     _enum: ['PermissionError', 'NoAvailableBaseId', 'NoAvailablePartId', 'BaseDoesntExist', 'NeedsDefaultThemeFirst', 'PartDoesntExist', 'NoEquippableOnFixedPart']
   },
   /**
-   * Lookup437: pallet_app_promotion::pallet::Error<T>
+   * Lookup436: pallet_app_promotion::pallet::Error<T>
    **/
   PalletAppPromotionError: {
     _enum: ['AdminNotSet', 'NoPermission', 'NotSufficientFunds', 'PendingForBlockOverflow', 'SponsorNotSet', 'IncorrectLockedBalanceOperation']
   },
   /**
-   * Lookup438: pallet_foreign_assets::module::Error<T>
+   * Lookup437: pallet_foreign_assets::module::Error<T>
    **/
   PalletForeignAssetsModuleError: {
     _enum: ['BadLocation', 'MultiLocationExisted', 'AssetIdNotExists', 'AssetIdExisted']
   },
   /**
-   * Lookup440: pallet_evm::pallet::Error<T>
+   * Lookup439: pallet_evm::pallet::Error<T>
    **/
   PalletEvmError: {
     _enum: ['BalanceLow', 'FeeOverflow', 'PaymentOverflow', 'WithdrawFailed', 'GasPriceTooLow', 'InvalidNonce', 'GasLimitTooLow', 'GasLimitTooHigh', 'Undefined', 'Reentrancy', 'TransactionMustComeFromEOA']
   },
   /**
-   * Lookup443: fp_rpc::TransactionStatus
+   * Lookup442: fp_rpc::TransactionStatus
    **/
   FpRpcTransactionStatus: {
     transactionHash: 'H256',
@@ -3288,11 +3282,11 @@
     logsBloom: 'EthbloomBloom'
   },
   /**
-   * Lookup445: ethbloom::Bloom
+   * Lookup444: ethbloom::Bloom
    **/
   EthbloomBloom: '[u8;256]',
   /**
-   * Lookup447: ethereum::receipt::ReceiptV3
+   * Lookup446: ethereum::receipt::ReceiptV3
    **/
   EthereumReceiptReceiptV3: {
     _enum: {
@@ -3302,7 +3296,7 @@
     }
   },
   /**
-   * Lookup448: ethereum::receipt::EIP658ReceiptData
+   * Lookup447: ethereum::receipt::EIP658ReceiptData
    **/
   EthereumReceiptEip658ReceiptData: {
     statusCode: 'u8',
@@ -3311,7 +3305,7 @@
     logs: 'Vec<EthereumLog>'
   },
   /**
-   * Lookup449: ethereum::block::Block<ethereum::transaction::TransactionV2>
+   * Lookup448: ethereum::block::Block<ethereum::transaction::TransactionV2>
    **/
   EthereumBlock: {
     header: 'EthereumHeader',
@@ -3319,7 +3313,7 @@
     ommers: 'Vec<EthereumHeader>'
   },
   /**
-   * Lookup450: ethereum::header::Header
+   * Lookup449: ethereum::header::Header
    **/
   EthereumHeader: {
     parentHash: 'H256',
@@ -3339,23 +3333,23 @@
     nonce: 'EthereumTypesHashH64'
   },
   /**
-   * Lookup451: ethereum_types::hash::H64
+   * Lookup450: ethereum_types::hash::H64
    **/
   EthereumTypesHashH64: '[u8;8]',
   /**
-   * Lookup456: pallet_ethereum::pallet::Error<T>
+   * Lookup455: pallet_ethereum::pallet::Error<T>
    **/
   PalletEthereumError: {
     _enum: ['InvalidSignature', 'PreLogExists']
   },
   /**
-   * Lookup457: pallet_evm_coder_substrate::pallet::Error<T>
+   * Lookup456: pallet_evm_coder_substrate::pallet::Error<T>
    **/
   PalletEvmCoderSubstrateError: {
     _enum: ['OutOfGas', 'OutOfFund']
   },
   /**
-   * Lookup458: up_data_structs::SponsorshipState<pallet_evm::account::BasicCrossAccountIdRepr<sp_core::crypto::AccountId32>>
+   * Lookup457: up_data_structs::SponsorshipState<pallet_evm::account::BasicCrossAccountIdRepr<sp_core::crypto::AccountId32>>
    **/
   UpDataStructsSponsorshipStateBasicCrossAccountIdRepr: {
     _enum: {
@@ -3365,35 +3359,35 @@
     }
   },
   /**
-   * Lookup459: pallet_evm_contract_helpers::SponsoringModeT
+   * Lookup458: pallet_evm_contract_helpers::SponsoringModeT
    **/
   PalletEvmContractHelpersSponsoringModeT: {
     _enum: ['Disabled', 'Allowlisted', 'Generous']
   },
   /**
-   * Lookup465: pallet_evm_contract_helpers::pallet::Error<T>
+   * Lookup464: pallet_evm_contract_helpers::pallet::Error<T>
    **/
   PalletEvmContractHelpersError: {
     _enum: ['NoPermission', 'NoPendingSponsor', 'TooManyMethodsHaveSponsoredLimit']
   },
   /**
-   * Lookup466: pallet_evm_migration::pallet::Error<T>
+   * Lookup465: pallet_evm_migration::pallet::Error<T>
    **/
   PalletEvmMigrationError: {
     _enum: ['AccountNotEmpty', 'AccountIsNotMigrating', 'BadEvent']
   },
   /**
-   * Lookup467: pallet_maintenance::pallet::Error<T>
+   * Lookup466: pallet_maintenance::pallet::Error<T>
    **/
   PalletMaintenanceError: 'Null',
   /**
-   * Lookup468: pallet_test_utils::pallet::Error<T>
+   * Lookup467: pallet_test_utils::pallet::Error<T>
    **/
   PalletTestUtilsError: {
     _enum: ['TestPalletDisabled', 'TriggerRollback']
   },
   /**
-   * Lookup470: sp_runtime::MultiSignature
+   * Lookup469: sp_runtime::MultiSignature
    **/
   SpRuntimeMultiSignature: {
     _enum: {
@@ -3403,51 +3397,51 @@
     }
   },
   /**
-   * Lookup471: sp_core::ed25519::Signature
+   * Lookup470: sp_core::ed25519::Signature
    **/
   SpCoreEd25519Signature: '[u8;64]',
   /**
-   * Lookup473: sp_core::sr25519::Signature
+   * Lookup472: sp_core::sr25519::Signature
    **/
   SpCoreSr25519Signature: '[u8;64]',
   /**
-   * Lookup474: sp_core::ecdsa::Signature
+   * Lookup473: sp_core::ecdsa::Signature
    **/
   SpCoreEcdsaSignature: '[u8;65]',
   /**
-   * Lookup477: frame_system::extensions::check_spec_version::CheckSpecVersion<T>
+   * Lookup476: frame_system::extensions::check_spec_version::CheckSpecVersion<T>
    **/
   FrameSystemExtensionsCheckSpecVersion: 'Null',
   /**
-   * Lookup478: frame_system::extensions::check_tx_version::CheckTxVersion<T>
+   * Lookup477: frame_system::extensions::check_tx_version::CheckTxVersion<T>
    **/
   FrameSystemExtensionsCheckTxVersion: 'Null',
   /**
-   * Lookup479: frame_system::extensions::check_genesis::CheckGenesis<T>
+   * Lookup478: frame_system::extensions::check_genesis::CheckGenesis<T>
    **/
   FrameSystemExtensionsCheckGenesis: 'Null',
   /**
-   * Lookup482: frame_system::extensions::check_nonce::CheckNonce<T>
+   * Lookup481: frame_system::extensions::check_nonce::CheckNonce<T>
    **/
   FrameSystemExtensionsCheckNonce: 'Compact<u32>',
   /**
-   * Lookup483: frame_system::extensions::check_weight::CheckWeight<T>
+   * Lookup482: frame_system::extensions::check_weight::CheckWeight<T>
    **/
   FrameSystemExtensionsCheckWeight: 'Null',
   /**
-   * Lookup484: opal_runtime::runtime_common::maintenance::CheckMaintenance
+   * Lookup483: opal_runtime::runtime_common::maintenance::CheckMaintenance
    **/
   OpalRuntimeRuntimeCommonMaintenanceCheckMaintenance: 'Null',
   /**
-   * Lookup485: pallet_template_transaction_payment::ChargeTransactionPayment<opal_runtime::Runtime>
+   * Lookup484: pallet_template_transaction_payment::ChargeTransactionPayment<opal_runtime::Runtime>
    **/
   PalletTemplateTransactionPaymentChargeTransactionPayment: 'Compact<u128>',
   /**
-   * Lookup486: opal_runtime::Runtime
+   * Lookup485: opal_runtime::Runtime
    **/
   OpalRuntimeRuntime: 'Null',
   /**
-   * Lookup487: pallet_ethereum::FakeTransactionFinalizer<opal_runtime::Runtime>
+   * Lookup486: pallet_ethereum::FakeTransactionFinalizer<opal_runtime::Runtime>
    **/
   PalletEthereumFakeTransactionFinalizer: 'Null'
 };
modifiedtests/src/interfaces/registry.tsdiffbeforeafterboth
--- a/tests/src/interfaces/registry.ts
+++ b/tests/src/interfaces/registry.ts
@@ -5,7 +5,7 @@
 // this is required to allow for ambient/previous definitions
 import '@polkadot/types/types/registry';
 
-import type { CumulusPalletDmpQueueCall, CumulusPalletDmpQueueConfigData, CumulusPalletDmpQueueError, CumulusPalletDmpQueueEvent, CumulusPalletDmpQueuePageIndexData, CumulusPalletParachainSystemCall, CumulusPalletParachainSystemError, CumulusPalletParachainSystemEvent, CumulusPalletParachainSystemRelayStateSnapshotMessagingStateSnapshot, CumulusPalletXcmCall, CumulusPalletXcmError, CumulusPalletXcmEvent, CumulusPalletXcmpQueueCall, CumulusPalletXcmpQueueError, CumulusPalletXcmpQueueEvent, CumulusPalletXcmpQueueInboundChannelDetails, CumulusPalletXcmpQueueInboundState, CumulusPalletXcmpQueueOutboundChannelDetails, CumulusPalletXcmpQueueOutboundState, CumulusPalletXcmpQueueQueueConfigData, CumulusPrimitivesParachainInherentParachainInherentData, EthbloomBloom, EthereumBlock, EthereumHeader, EthereumLog, EthereumReceiptEip658ReceiptData, EthereumReceiptReceiptV3, EthereumTransactionAccessListItem, EthereumTransactionEip1559Transaction, EthereumTransactionEip2930Transaction, EthereumTransactionLegacyTransaction, EthereumTransactionTransactionAction, EthereumTransactionTransactionSignature, EthereumTransactionTransactionV2, EthereumTypesHashH64, EvmCoreErrorExitError, EvmCoreErrorExitFatal, EvmCoreErrorExitReason, EvmCoreErrorExitRevert, EvmCoreErrorExitSucceed, FpRpcTransactionStatus, FrameSupportDispatchDispatchClass, FrameSupportDispatchDispatchInfo, FrameSupportDispatchPays, FrameSupportDispatchPerDispatchClassU32, FrameSupportDispatchPerDispatchClassWeight, FrameSupportDispatchPerDispatchClassWeightsPerClass, FrameSupportPalletId, FrameSupportTokensMiscBalanceStatus, FrameSystemAccountInfo, FrameSystemCall, FrameSystemError, FrameSystemEvent, FrameSystemEventRecord, FrameSystemExtensionsCheckGenesis, FrameSystemExtensionsCheckNonce, FrameSystemExtensionsCheckSpecVersion, FrameSystemExtensionsCheckTxVersion, FrameSystemExtensionsCheckWeight, FrameSystemLastRuntimeUpgradeInfo, FrameSystemLimitsBlockLength, FrameSystemLimitsBlockWeights, FrameSystemLimitsWeightsPerClass, FrameSystemPhase, OpalRuntimeRuntime, OpalRuntimeRuntimeCommonMaintenanceCheckMaintenance, OrmlTokensAccountData, OrmlTokensBalanceLock, OrmlTokensModuleCall, OrmlTokensModuleError, OrmlTokensModuleEvent, OrmlTokensReserveData, OrmlVestingModuleCall, OrmlVestingModuleError, OrmlVestingModuleEvent, OrmlVestingVestingSchedule, OrmlXtokensModuleCall, OrmlXtokensModuleError, OrmlXtokensModuleEvent, PalletAppPromotionCall, PalletAppPromotionError, PalletAppPromotionEvent, PalletBalancesAccountData, PalletBalancesBalanceLock, PalletBalancesCall, PalletBalancesError, PalletBalancesEvent, PalletBalancesReasons, PalletBalancesReserveData, PalletCommonError, PalletCommonEvent, PalletConfigurationAppPromotionConfiguration, PalletConfigurationCall, PalletConfigurationError, PalletEthereumCall, PalletEthereumError, PalletEthereumEvent, PalletEthereumFakeTransactionFinalizer, PalletEvmAccountBasicCrossAccountIdRepr, PalletEvmCall, PalletEvmCoderSubstrateError, PalletEvmContractHelpersError, PalletEvmContractHelpersEvent, PalletEvmContractHelpersSponsoringModeT, PalletEvmError, PalletEvmEvent, PalletEvmMigrationCall, PalletEvmMigrationError, PalletEvmMigrationEvent, PalletForeignAssetsAssetIds, PalletForeignAssetsModuleAssetMetadata, PalletForeignAssetsModuleCall, PalletForeignAssetsModuleError, PalletForeignAssetsModuleEvent, PalletForeignAssetsNativeCurrency, PalletFungibleError, PalletInflationCall, PalletMaintenanceCall, PalletMaintenanceError, PalletMaintenanceEvent, PalletNonfungibleError, PalletNonfungibleItemData, PalletRefungibleError, PalletRefungibleItemData, PalletRmrkCoreCall, PalletRmrkCoreError, PalletRmrkCoreEvent, PalletRmrkEquipCall, PalletRmrkEquipError, PalletRmrkEquipEvent, PalletStructureCall, PalletStructureError, PalletStructureEvent, PalletSudoCall, PalletSudoError, PalletSudoEvent, PalletTemplateTransactionPaymentCall, PalletTemplateTransactionPaymentChargeTransactionPayment, PalletTestUtilsCall, PalletTestUtilsError, PalletTestUtilsEvent, PalletTimestampCall, PalletTransactionPaymentEvent, PalletTransactionPaymentReleases, PalletTreasuryCall, PalletTreasuryError, PalletTreasuryEvent, PalletTreasuryProposal, PalletUniqueCall, PalletUniqueError, PalletXcmCall, PalletXcmError, PalletXcmEvent, PhantomTypeUpDataStructs, PolkadotCorePrimitivesInboundDownwardMessage, PolkadotCorePrimitivesInboundHrmpMessage, PolkadotCorePrimitivesOutboundHrmpMessage, PolkadotParachainPrimitivesXcmpMessageFormat, PolkadotPrimitivesV2AbridgedHostConfiguration, PolkadotPrimitivesV2AbridgedHrmpChannel, PolkadotPrimitivesV2PersistedValidationData, PolkadotPrimitivesV2UpgradeRestriction, RmrkTraitsBaseBaseInfo, RmrkTraitsCollectionCollectionInfo, RmrkTraitsNftAccountIdOrCollectionNftTuple, RmrkTraitsNftNftChild, RmrkTraitsNftNftInfo, RmrkTraitsNftRoyaltyInfo, RmrkTraitsPartEquippableList, RmrkTraitsPartFixedPart, RmrkTraitsPartPartType, RmrkTraitsPartSlotPart, RmrkTraitsPropertyPropertyInfo, RmrkTraitsResourceBasicResource, RmrkTraitsResourceComposableResource, RmrkTraitsResourceResourceInfo, RmrkTraitsResourceResourceTypes, RmrkTraitsResourceSlotResource, RmrkTraitsTheme, RmrkTraitsThemeThemeProperty, SpCoreEcdsaSignature, SpCoreEd25519Signature, SpCoreSr25519Signature, SpRuntimeArithmeticError, SpRuntimeDigest, SpRuntimeDigestDigestItem, SpRuntimeDispatchError, SpRuntimeModuleError, SpRuntimeMultiSignature, SpRuntimeTokenError, SpRuntimeTransactionalError, SpTrieStorageProof, SpVersionRuntimeVersion, SpWeightsRuntimeDbWeight, SpWeightsWeightV2Weight, UpDataStructsAccessMode, UpDataStructsCollection, UpDataStructsCollectionLimits, UpDataStructsCollectionMode, UpDataStructsCollectionPermissions, UpDataStructsCollectionStats, UpDataStructsCreateCollectionData, UpDataStructsCreateFungibleData, UpDataStructsCreateItemData, UpDataStructsCreateItemExData, UpDataStructsCreateNftData, UpDataStructsCreateNftExData, UpDataStructsCreateReFungibleData, UpDataStructsCreateRefungibleExMultipleOwners, UpDataStructsCreateRefungibleExSingleOwner, UpDataStructsNestingPermissions, UpDataStructsOwnerRestrictedSet, UpDataStructsProperties, UpDataStructsPropertiesMapBoundedVec, UpDataStructsPropertiesMapPropertyPermission, UpDataStructsProperty, UpDataStructsPropertyKeyPermission, UpDataStructsPropertyPermission, UpDataStructsPropertyScope, UpDataStructsRpcCollection, UpDataStructsRpcCollectionFlags, UpDataStructsSponsoringRateLimit, UpDataStructsSponsorshipStateAccountId32, UpDataStructsSponsorshipStateBasicCrossAccountIdRepr, UpDataStructsTokenChild, UpDataStructsTokenData, XcmDoubleEncoded, XcmV0Junction, XcmV0JunctionBodyId, XcmV0JunctionBodyPart, XcmV0JunctionNetworkId, XcmV0MultiAsset, XcmV0MultiLocation, XcmV0Order, XcmV0OriginKind, XcmV0Response, XcmV0Xcm, XcmV1Junction, XcmV1MultiAsset, XcmV1MultiLocation, XcmV1MultiassetAssetId, XcmV1MultiassetAssetInstance, XcmV1MultiassetFungibility, XcmV1MultiassetMultiAssetFilter, XcmV1MultiassetMultiAssets, XcmV1MultiassetWildFungibility, XcmV1MultiassetWildMultiAsset, XcmV1MultilocationJunctions, XcmV1Order, XcmV1Response, XcmV1Xcm, XcmV2Instruction, XcmV2Response, XcmV2TraitsError, XcmV2TraitsOutcome, XcmV2WeightLimit, XcmV2Xcm, XcmVersionedMultiAsset, XcmVersionedMultiAssets, XcmVersionedMultiLocation, XcmVersionedXcm } from '@polkadot/types/lookup';
+import type { CumulusPalletDmpQueueCall, CumulusPalletDmpQueueConfigData, CumulusPalletDmpQueueError, CumulusPalletDmpQueueEvent, CumulusPalletDmpQueuePageIndexData, CumulusPalletParachainSystemCall, CumulusPalletParachainSystemError, CumulusPalletParachainSystemEvent, CumulusPalletParachainSystemRelayStateSnapshotMessagingStateSnapshot, CumulusPalletXcmCall, CumulusPalletXcmError, CumulusPalletXcmEvent, CumulusPalletXcmpQueueCall, CumulusPalletXcmpQueueError, CumulusPalletXcmpQueueEvent, CumulusPalletXcmpQueueInboundChannelDetails, CumulusPalletXcmpQueueInboundState, CumulusPalletXcmpQueueOutboundChannelDetails, CumulusPalletXcmpQueueOutboundState, CumulusPalletXcmpQueueQueueConfigData, CumulusPrimitivesParachainInherentParachainInherentData, EthbloomBloom, EthereumBlock, EthereumHeader, EthereumLog, EthereumReceiptEip658ReceiptData, EthereumReceiptReceiptV3, EthereumTransactionAccessListItem, EthereumTransactionEip1559Transaction, EthereumTransactionEip2930Transaction, EthereumTransactionLegacyTransaction, EthereumTransactionTransactionAction, EthereumTransactionTransactionSignature, EthereumTransactionTransactionV2, EthereumTypesHashH64, EvmCoreErrorExitError, EvmCoreErrorExitFatal, EvmCoreErrorExitReason, EvmCoreErrorExitRevert, EvmCoreErrorExitSucceed, FpRpcTransactionStatus, FrameSupportDispatchDispatchClass, FrameSupportDispatchDispatchInfo, FrameSupportDispatchPays, FrameSupportDispatchPerDispatchClassU32, FrameSupportDispatchPerDispatchClassWeight, FrameSupportDispatchPerDispatchClassWeightsPerClass, FrameSupportPalletId, FrameSupportTokensMiscBalanceStatus, FrameSystemAccountInfo, FrameSystemCall, FrameSystemError, FrameSystemEvent, FrameSystemEventRecord, FrameSystemExtensionsCheckGenesis, FrameSystemExtensionsCheckNonce, FrameSystemExtensionsCheckSpecVersion, FrameSystemExtensionsCheckTxVersion, FrameSystemExtensionsCheckWeight, FrameSystemLastRuntimeUpgradeInfo, FrameSystemLimitsBlockLength, FrameSystemLimitsBlockWeights, FrameSystemLimitsWeightsPerClass, FrameSystemPhase, OpalRuntimeRuntime, OpalRuntimeRuntimeCommonMaintenanceCheckMaintenance, OrmlTokensAccountData, OrmlTokensBalanceLock, OrmlTokensModuleCall, OrmlTokensModuleError, OrmlTokensModuleEvent, OrmlTokensReserveData, OrmlVestingModuleCall, OrmlVestingModuleError, OrmlVestingModuleEvent, OrmlVestingVestingSchedule, OrmlXtokensModuleCall, OrmlXtokensModuleError, OrmlXtokensModuleEvent, PalletAppPromotionCall, PalletAppPromotionError, PalletAppPromotionEvent, PalletBalancesAccountData, PalletBalancesBalanceLock, PalletBalancesCall, PalletBalancesError, PalletBalancesEvent, PalletBalancesReasons, PalletBalancesReserveData, PalletCommonError, PalletCommonEvent, PalletConfigurationAppPromotionConfiguration, PalletConfigurationCall, PalletConfigurationError, PalletEthereumCall, PalletEthereumError, PalletEthereumEvent, PalletEthereumFakeTransactionFinalizer, PalletEvmAccountBasicCrossAccountIdRepr, PalletEvmCall, PalletEvmCoderSubstrateError, PalletEvmContractHelpersError, PalletEvmContractHelpersEvent, PalletEvmContractHelpersSponsoringModeT, PalletEvmError, PalletEvmEvent, PalletEvmMigrationCall, PalletEvmMigrationError, PalletEvmMigrationEvent, PalletForeignAssetsAssetIds, PalletForeignAssetsModuleAssetMetadata, PalletForeignAssetsModuleCall, PalletForeignAssetsModuleError, PalletForeignAssetsModuleEvent, PalletForeignAssetsNativeCurrency, PalletFungibleError, PalletInflationCall, PalletMaintenanceCall, PalletMaintenanceError, PalletMaintenanceEvent, PalletNonfungibleError, PalletNonfungibleItemData, PalletRefungibleError, PalletRmrkCoreCall, PalletRmrkCoreError, PalletRmrkCoreEvent, PalletRmrkEquipCall, PalletRmrkEquipError, PalletRmrkEquipEvent, PalletStructureCall, PalletStructureError, PalletStructureEvent, PalletSudoCall, PalletSudoError, PalletSudoEvent, PalletTemplateTransactionPaymentCall, PalletTemplateTransactionPaymentChargeTransactionPayment, PalletTestUtilsCall, PalletTestUtilsError, PalletTestUtilsEvent, PalletTimestampCall, PalletTransactionPaymentEvent, PalletTransactionPaymentReleases, PalletTreasuryCall, PalletTreasuryError, PalletTreasuryEvent, PalletTreasuryProposal, PalletUniqueCall, PalletUniqueError, PalletXcmCall, PalletXcmError, PalletXcmEvent, PhantomTypeUpDataStructs, PolkadotCorePrimitivesInboundDownwardMessage, PolkadotCorePrimitivesInboundHrmpMessage, PolkadotCorePrimitivesOutboundHrmpMessage, PolkadotParachainPrimitivesXcmpMessageFormat, PolkadotPrimitivesV2AbridgedHostConfiguration, PolkadotPrimitivesV2AbridgedHrmpChannel, PolkadotPrimitivesV2PersistedValidationData, PolkadotPrimitivesV2UpgradeRestriction, RmrkTraitsBaseBaseInfo, RmrkTraitsCollectionCollectionInfo, RmrkTraitsNftAccountIdOrCollectionNftTuple, RmrkTraitsNftNftChild, RmrkTraitsNftNftInfo, RmrkTraitsNftRoyaltyInfo, RmrkTraitsPartEquippableList, RmrkTraitsPartFixedPart, RmrkTraitsPartPartType, RmrkTraitsPartSlotPart, RmrkTraitsPropertyPropertyInfo, RmrkTraitsResourceBasicResource, RmrkTraitsResourceComposableResource, RmrkTraitsResourceResourceInfo, RmrkTraitsResourceResourceTypes, RmrkTraitsResourceSlotResource, RmrkTraitsTheme, RmrkTraitsThemeThemeProperty, SpCoreEcdsaSignature, SpCoreEd25519Signature, SpCoreSr25519Signature, SpRuntimeArithmeticError, SpRuntimeDigest, SpRuntimeDigestDigestItem, SpRuntimeDispatchError, SpRuntimeModuleError, SpRuntimeMultiSignature, SpRuntimeTokenError, SpRuntimeTransactionalError, SpTrieStorageProof, SpVersionRuntimeVersion, SpWeightsRuntimeDbWeight, SpWeightsWeightV2Weight, UpDataStructsAccessMode, UpDataStructsCollection, UpDataStructsCollectionLimits, UpDataStructsCollectionMode, UpDataStructsCollectionPermissions, UpDataStructsCollectionStats, UpDataStructsCreateCollectionData, UpDataStructsCreateFungibleData, UpDataStructsCreateItemData, UpDataStructsCreateItemExData, UpDataStructsCreateNftData, UpDataStructsCreateNftExData, UpDataStructsCreateReFungibleData, UpDataStructsCreateRefungibleExMultipleOwners, UpDataStructsCreateRefungibleExSingleOwner, UpDataStructsNestingPermissions, UpDataStructsOwnerRestrictedSet, UpDataStructsProperties, UpDataStructsPropertiesMapBoundedVec, UpDataStructsPropertiesMapPropertyPermission, UpDataStructsProperty, UpDataStructsPropertyKeyPermission, UpDataStructsPropertyPermission, UpDataStructsPropertyScope, UpDataStructsRpcCollection, UpDataStructsRpcCollectionFlags, UpDataStructsSponsoringRateLimit, UpDataStructsSponsorshipStateAccountId32, UpDataStructsSponsorshipStateBasicCrossAccountIdRepr, UpDataStructsTokenChild, UpDataStructsTokenData, XcmDoubleEncoded, XcmV0Junction, XcmV0JunctionBodyId, XcmV0JunctionBodyPart, XcmV0JunctionNetworkId, XcmV0MultiAsset, XcmV0MultiLocation, XcmV0Order, XcmV0OriginKind, XcmV0Response, XcmV0Xcm, XcmV1Junction, XcmV1MultiAsset, XcmV1MultiLocation, XcmV1MultiassetAssetId, XcmV1MultiassetAssetInstance, XcmV1MultiassetFungibility, XcmV1MultiassetMultiAssetFilter, XcmV1MultiassetMultiAssets, XcmV1MultiassetWildFungibility, XcmV1MultiassetWildMultiAsset, XcmV1MultilocationJunctions, XcmV1Order, XcmV1Response, XcmV1Xcm, XcmV2Instruction, XcmV2Response, XcmV2TraitsError, XcmV2TraitsOutcome, XcmV2WeightLimit, XcmV2Xcm, XcmVersionedMultiAsset, XcmVersionedMultiAssets, XcmVersionedMultiLocation, XcmVersionedXcm } from '@polkadot/types/lookup';
 
 declare module '@polkadot/types/types/registry' {
   interface InterfaceTypes {
@@ -132,7 +132,6 @@
     PalletNonfungibleError: PalletNonfungibleError;
     PalletNonfungibleItemData: PalletNonfungibleItemData;
     PalletRefungibleError: PalletRefungibleError;
-    PalletRefungibleItemData: PalletRefungibleItemData;
     PalletRmrkCoreCall: PalletRmrkCoreCall;
     PalletRmrkCoreError: PalletRmrkCoreError;
     PalletRmrkCoreEvent: PalletRmrkCoreEvent;
modifiedtests/src/interfaces/types-lookup.tsdiffbeforeafterboth
--- a/tests/src/interfaces/types-lookup.ts
+++ b/tests/src/interfaces/types-lookup.ts
@@ -3515,12 +3515,7 @@
     readonly type: 'NotFungibleDataUsedToMintFungibleCollectionToken' | 'FungibleItemsHaveNoId' | 'FungibleItemsDontHaveData' | 'FungibleDisallowsNesting' | 'SettingPropertiesNotAllowed' | 'SettingAllowanceForAllNotAllowed' | 'FungibleTokensAreAlwaysValid';
   }
 
-  /** @name PalletRefungibleItemData (417) */
-  interface PalletRefungibleItemData extends Struct {
-    readonly constData: Bytes;
-  }
-
-  /** @name PalletRefungibleError (422) */
+  /** @name PalletRefungibleError (420) */
   interface PalletRefungibleError extends Enum {
     readonly isNotRefungibleDataUsedToMintFungibleCollectionToken: boolean;
     readonly isWrongRefungiblePieces: boolean;
@@ -3530,19 +3525,19 @@
     readonly type: 'NotRefungibleDataUsedToMintFungibleCollectionToken' | 'WrongRefungiblePieces' | 'RepartitionWhileNotOwningAllPieces' | 'RefungibleDisallowsNesting' | 'SettingPropertiesNotAllowed';
   }
 
-  /** @name PalletNonfungibleItemData (423) */
+  /** @name PalletNonfungibleItemData (421) */
   interface PalletNonfungibleItemData extends Struct {
     readonly owner: PalletEvmAccountBasicCrossAccountIdRepr;
   }
 
-  /** @name UpDataStructsPropertyScope (425) */
+  /** @name UpDataStructsPropertyScope (423) */
   interface UpDataStructsPropertyScope extends Enum {
     readonly isNone: boolean;
     readonly isRmrk: boolean;
     readonly type: 'None' | 'Rmrk';
   }
 
-  /** @name PalletNonfungibleError (427) */
+  /** @name PalletNonfungibleError (426) */
   interface PalletNonfungibleError extends Enum {
     readonly isNotNonfungibleDataUsedToMintFungibleCollectionToken: boolean;
     readonly isNonfungibleItemsHaveNoAmount: boolean;
@@ -3550,7 +3545,7 @@
     readonly type: 'NotNonfungibleDataUsedToMintFungibleCollectionToken' | 'NonfungibleItemsHaveNoAmount' | 'CantBurnNftWithChildren';
   }
 
-  /** @name PalletStructureError (428) */
+  /** @name PalletStructureError (427) */
   interface PalletStructureError extends Enum {
     readonly isOuroborosDetected: boolean;
     readonly isDepthLimit: boolean;
@@ -3559,7 +3554,7 @@
     readonly type: 'OuroborosDetected' | 'DepthLimit' | 'BreadthLimit' | 'TokenNotFound';
   }
 
-  /** @name PalletRmrkCoreError (429) */
+  /** @name PalletRmrkCoreError (428) */
   interface PalletRmrkCoreError extends Enum {
     readonly isCorruptedCollectionType: boolean;
     readonly isRmrkPropertyKeyIsTooLong: boolean;
@@ -3583,7 +3578,7 @@
     readonly type: 'CorruptedCollectionType' | 'RmrkPropertyKeyIsTooLong' | 'RmrkPropertyValueIsTooLong' | 'RmrkPropertyIsNotFound' | 'UnableToDecodeRmrkData' | 'CollectionNotEmpty' | 'NoAvailableCollectionId' | 'NoAvailableNftId' | 'CollectionUnknown' | 'NoPermission' | 'NonTransferable' | 'CollectionFullOrLocked' | 'ResourceDoesntExist' | 'CannotSendToDescendentOrSelf' | 'CannotAcceptNonOwnedNft' | 'CannotRejectNonOwnedNft' | 'CannotRejectNonPendingNft' | 'ResourceNotPending' | 'NoAvailableResourceId';
   }
 
-  /** @name PalletRmrkEquipError (431) */
+  /** @name PalletRmrkEquipError (430) */
   interface PalletRmrkEquipError extends Enum {
     readonly isPermissionError: boolean;
     readonly isNoAvailableBaseId: boolean;
@@ -3595,7 +3590,7 @@
     readonly type: 'PermissionError' | 'NoAvailableBaseId' | 'NoAvailablePartId' | 'BaseDoesntExist' | 'NeedsDefaultThemeFirst' | 'PartDoesntExist' | 'NoEquippableOnFixedPart';
   }
 
-  /** @name PalletAppPromotionError (437) */
+  /** @name PalletAppPromotionError (436) */
   interface PalletAppPromotionError extends Enum {
     readonly isAdminNotSet: boolean;
     readonly isNoPermission: boolean;
@@ -3606,7 +3601,7 @@
     readonly type: 'AdminNotSet' | 'NoPermission' | 'NotSufficientFunds' | 'PendingForBlockOverflow' | 'SponsorNotSet' | 'IncorrectLockedBalanceOperation';
   }
 
-  /** @name PalletForeignAssetsModuleError (438) */
+  /** @name PalletForeignAssetsModuleError (437) */
   interface PalletForeignAssetsModuleError extends Enum {
     readonly isBadLocation: boolean;
     readonly isMultiLocationExisted: boolean;
@@ -3615,7 +3610,7 @@
     readonly type: 'BadLocation' | 'MultiLocationExisted' | 'AssetIdNotExists' | 'AssetIdExisted';
   }
 
-  /** @name PalletEvmError (440) */
+  /** @name PalletEvmError (439) */
   interface PalletEvmError extends Enum {
     readonly isBalanceLow: boolean;
     readonly isFeeOverflow: boolean;
@@ -3631,7 +3626,7 @@
     readonly type: 'BalanceLow' | 'FeeOverflow' | 'PaymentOverflow' | 'WithdrawFailed' | 'GasPriceTooLow' | 'InvalidNonce' | 'GasLimitTooLow' | 'GasLimitTooHigh' | 'Undefined' | 'Reentrancy' | 'TransactionMustComeFromEOA';
   }
 
-  /** @name FpRpcTransactionStatus (443) */
+  /** @name FpRpcTransactionStatus (442) */
   interface FpRpcTransactionStatus extends Struct {
     readonly transactionHash: H256;
     readonly transactionIndex: u32;
@@ -3642,10 +3637,10 @@
     readonly logsBloom: EthbloomBloom;
   }
 
-  /** @name EthbloomBloom (445) */
+  /** @name EthbloomBloom (444) */
   interface EthbloomBloom extends U8aFixed {}
 
-  /** @name EthereumReceiptReceiptV3 (447) */
+  /** @name EthereumReceiptReceiptV3 (446) */
   interface EthereumReceiptReceiptV3 extends Enum {
     readonly isLegacy: boolean;
     readonly asLegacy: EthereumReceiptEip658ReceiptData;
@@ -3656,7 +3651,7 @@
     readonly type: 'Legacy' | 'Eip2930' | 'Eip1559';
   }
 
-  /** @name EthereumReceiptEip658ReceiptData (448) */
+  /** @name EthereumReceiptEip658ReceiptData (447) */
   interface EthereumReceiptEip658ReceiptData extends Struct {
     readonly statusCode: u8;
     readonly usedGas: U256;
@@ -3664,14 +3659,14 @@
     readonly logs: Vec<EthereumLog>;
   }
 
-  /** @name EthereumBlock (449) */
+  /** @name EthereumBlock (448) */
   interface EthereumBlock extends Struct {
     readonly header: EthereumHeader;
     readonly transactions: Vec<EthereumTransactionTransactionV2>;
     readonly ommers: Vec<EthereumHeader>;
   }
 
-  /** @name EthereumHeader (450) */
+  /** @name EthereumHeader (449) */
   interface EthereumHeader extends Struct {
     readonly parentHash: H256;
     readonly ommersHash: H256;
@@ -3690,24 +3685,24 @@
     readonly nonce: EthereumTypesHashH64;
   }
 
-  /** @name EthereumTypesHashH64 (451) */
+  /** @name EthereumTypesHashH64 (450) */
   interface EthereumTypesHashH64 extends U8aFixed {}
 
-  /** @name PalletEthereumError (456) */
+  /** @name PalletEthereumError (455) */
   interface PalletEthereumError extends Enum {
     readonly isInvalidSignature: boolean;
     readonly isPreLogExists: boolean;
     readonly type: 'InvalidSignature' | 'PreLogExists';
   }
 
-  /** @name PalletEvmCoderSubstrateError (457) */
+  /** @name PalletEvmCoderSubstrateError (456) */
   interface PalletEvmCoderSubstrateError extends Enum {
     readonly isOutOfGas: boolean;
     readonly isOutOfFund: boolean;
     readonly type: 'OutOfGas' | 'OutOfFund';
   }
 
-  /** @name UpDataStructsSponsorshipStateBasicCrossAccountIdRepr (458) */
+  /** @name UpDataStructsSponsorshipStateBasicCrossAccountIdRepr (457) */
   interface UpDataStructsSponsorshipStateBasicCrossAccountIdRepr extends Enum {
     readonly isDisabled: boolean;
     readonly isUnconfirmed: boolean;
@@ -3717,7 +3712,7 @@
     readonly type: 'Disabled' | 'Unconfirmed' | 'Confirmed';
   }
 
-  /** @name PalletEvmContractHelpersSponsoringModeT (459) */
+  /** @name PalletEvmContractHelpersSponsoringModeT (458) */
   interface PalletEvmContractHelpersSponsoringModeT extends Enum {
     readonly isDisabled: boolean;
     readonly isAllowlisted: boolean;
@@ -3725,7 +3720,7 @@
     readonly type: 'Disabled' | 'Allowlisted' | 'Generous';
   }
 
-  /** @name PalletEvmContractHelpersError (465) */
+  /** @name PalletEvmContractHelpersError (464) */
   interface PalletEvmContractHelpersError extends Enum {
     readonly isNoPermission: boolean;
     readonly isNoPendingSponsor: boolean;
@@ -3733,7 +3728,7 @@
     readonly type: 'NoPermission' | 'NoPendingSponsor' | 'TooManyMethodsHaveSponsoredLimit';
   }
 
-  /** @name PalletEvmMigrationError (466) */
+  /** @name PalletEvmMigrationError (465) */
   interface PalletEvmMigrationError extends Enum {
     readonly isAccountNotEmpty: boolean;
     readonly isAccountIsNotMigrating: boolean;
@@ -3741,17 +3736,17 @@
     readonly type: 'AccountNotEmpty' | 'AccountIsNotMigrating' | 'BadEvent';
   }
 
-  /** @name PalletMaintenanceError (467) */
+  /** @name PalletMaintenanceError (466) */
   type PalletMaintenanceError = Null;
 
-  /** @name PalletTestUtilsError (468) */
+  /** @name PalletTestUtilsError (467) */
   interface PalletTestUtilsError extends Enum {
     readonly isTestPalletDisabled: boolean;
     readonly isTriggerRollback: boolean;
     readonly type: 'TestPalletDisabled' | 'TriggerRollback';
   }
 
-  /** @name SpRuntimeMultiSignature (470) */
+  /** @name SpRuntimeMultiSignature (469) */
   interface SpRuntimeMultiSignature extends Enum {
     readonly isEd25519: boolean;
     readonly asEd25519: SpCoreEd25519Signature;
@@ -3762,40 +3757,40 @@
     readonly type: 'Ed25519' | 'Sr25519' | 'Ecdsa';
   }
 
-  /** @name SpCoreEd25519Signature (471) */
+  /** @name SpCoreEd25519Signature (470) */
   interface SpCoreEd25519Signature extends U8aFixed {}
 
-  /** @name SpCoreSr25519Signature (473) */
+  /** @name SpCoreSr25519Signature (472) */
   interface SpCoreSr25519Signature extends U8aFixed {}
 
-  /** @name SpCoreEcdsaSignature (474) */
+  /** @name SpCoreEcdsaSignature (473) */
   interface SpCoreEcdsaSignature extends U8aFixed {}
 
-  /** @name FrameSystemExtensionsCheckSpecVersion (477) */
+  /** @name FrameSystemExtensionsCheckSpecVersion (476) */
   type FrameSystemExtensionsCheckSpecVersion = Null;
 
-  /** @name FrameSystemExtensionsCheckTxVersion (478) */
+  /** @name FrameSystemExtensionsCheckTxVersion (477) */
   type FrameSystemExtensionsCheckTxVersion = Null;
 
-  /** @name FrameSystemExtensionsCheckGenesis (479) */
+  /** @name FrameSystemExtensionsCheckGenesis (478) */
   type FrameSystemExtensionsCheckGenesis = Null;
 
-  /** @name FrameSystemExtensionsCheckNonce (482) */
+  /** @name FrameSystemExtensionsCheckNonce (481) */
   interface FrameSystemExtensionsCheckNonce extends Compact<u32> {}
 
-  /** @name FrameSystemExtensionsCheckWeight (483) */
+  /** @name FrameSystemExtensionsCheckWeight (482) */
   type FrameSystemExtensionsCheckWeight = Null;
 
-  /** @name OpalRuntimeRuntimeCommonMaintenanceCheckMaintenance (484) */
+  /** @name OpalRuntimeRuntimeCommonMaintenanceCheckMaintenance (483) */
   type OpalRuntimeRuntimeCommonMaintenanceCheckMaintenance = Null;
 
-  /** @name PalletTemplateTransactionPaymentChargeTransactionPayment (485) */
+  /** @name PalletTemplateTransactionPaymentChargeTransactionPayment (484) */
   interface PalletTemplateTransactionPaymentChargeTransactionPayment extends Compact<u128> {}
 
-  /** @name OpalRuntimeRuntime (486) */
+  /** @name OpalRuntimeRuntime (485) */
   type OpalRuntimeRuntime = Null;
 
-  /** @name PalletEthereumFakeTransactionFinalizer (487) */
+  /** @name PalletEthereumFakeTransactionFinalizer (486) */
   type PalletEthereumFakeTransactionFinalizer = Null;
 
 } // declare module
modifiedtests/yarn.lockdiffbeforeafterboth
--- a/tests/yarn.lock
+++ b/tests/yarn.lock
@@ -17,49 +17,50 @@
   dependencies:
     "@babel/highlight" "^7.18.6"
 
-"@babel/compat-data@^7.20.0":
+"@babel/compat-data@^7.20.5":
   version "7.20.5"
   resolved "https://registry.yarnpkg.com/@babel/compat-data/-/compat-data-7.20.5.tgz#86f172690b093373a933223b4745deeb6049e733"
   integrity sha512-KZXo2t10+/jxmkhNXc7pZTqRvSOIvVv/+lJwHS+B2rErwOyjuVRh60yVpb7liQ1U5t7lLJ1bz+t8tSypUZdm0g==
 
-"@babel/core@^7.20.2":
-  version "7.20.5"
-  resolved "https://registry.yarnpkg.com/@babel/core/-/core-7.20.5.tgz#45e2114dc6cd4ab167f81daf7820e8fa1250d113"
-  integrity sha512-UdOWmk4pNWTm/4DlPUl/Pt4Gz4rcEMb7CY0Y3eJl5Yz1vI8ZJGmHWaVE55LoxRjdpx0z259GE9U5STA9atUinQ==
+"@babel/core@^7.20.5":
+  version "7.20.7"
+  resolved "https://registry.yarnpkg.com/@babel/core/-/core-7.20.7.tgz#37072f951bd4d28315445f66e0ec9f6ae0c8c35f"
+  integrity sha512-t1ZjCluspe5DW24bn2Rr1CDb2v9rn/hROtg9a2tmd0+QYf4bsloYfLQzjG4qHPNMhWtKdGC33R5AxGR2Af2cBw==
   dependencies:
     "@ampproject/remapping" "^2.1.0"
     "@babel/code-frame" "^7.18.6"
-    "@babel/generator" "^7.20.5"
-    "@babel/helper-compilation-targets" "^7.20.0"
-    "@babel/helper-module-transforms" "^7.20.2"
-    "@babel/helpers" "^7.20.5"
-    "@babel/parser" "^7.20.5"
-    "@babel/template" "^7.18.10"
-    "@babel/traverse" "^7.20.5"
-    "@babel/types" "^7.20.5"
+    "@babel/generator" "^7.20.7"
+    "@babel/helper-compilation-targets" "^7.20.7"
+    "@babel/helper-module-transforms" "^7.20.7"
+    "@babel/helpers" "^7.20.7"
+    "@babel/parser" "^7.20.7"
+    "@babel/template" "^7.20.7"
+    "@babel/traverse" "^7.20.7"
+    "@babel/types" "^7.20.7"
     convert-source-map "^1.7.0"
     debug "^4.1.0"
     gensync "^1.0.0-beta.2"
     json5 "^2.2.1"
     semver "^6.3.0"
 
-"@babel/generator@^7.20.5":
-  version "7.20.5"
-  resolved "https://registry.yarnpkg.com/@babel/generator/-/generator-7.20.5.tgz#cb25abee3178adf58d6814b68517c62bdbfdda95"
-  integrity sha512-jl7JY2Ykn9S0yj4DQP82sYvPU+T3g0HFcWTqDLqiuA9tGRNIj9VfbtXGAYTTkyNEnQk1jkMGOdYka8aG/lulCA==
+"@babel/generator@^7.20.7":
+  version "7.20.7"
+  resolved "https://registry.yarnpkg.com/@babel/generator/-/generator-7.20.7.tgz#f8ef57c8242665c5929fe2e8d82ba75460187b4a"
+  integrity sha512-7wqMOJq8doJMZmP4ApXTzLxSr7+oO2jroJURrVEp6XShrQUObV8Tq/D0NCcoYg2uHqUrjzO0zwBjoYzelxK+sw==
   dependencies:
-    "@babel/types" "^7.20.5"
+    "@babel/types" "^7.20.7"
     "@jridgewell/gen-mapping" "^0.3.2"
     jsesc "^2.5.1"
 
-"@babel/helper-compilation-targets@^7.20.0":
-  version "7.20.0"
-  resolved "https://registry.yarnpkg.com/@babel/helper-compilation-targets/-/helper-compilation-targets-7.20.0.tgz#6bf5374d424e1b3922822f1d9bdaa43b1a139d0a"
-  integrity sha512-0jp//vDGp9e8hZzBc6N/KwA5ZK3Wsm/pfm4CrY7vzegkVxc65SgSn6wYOnwHe9Js9HRQ1YTCKLGPzDtaS3RoLQ==
+"@babel/helper-compilation-targets@^7.20.7":
+  version "7.20.7"
+  resolved "https://registry.yarnpkg.com/@babel/helper-compilation-targets/-/helper-compilation-targets-7.20.7.tgz#a6cd33e93629f5eb473b021aac05df62c4cd09bb"
+  integrity sha512-4tGORmfQcrc+bvrjb5y3dG9Mx1IOZjsHqQVUz7XCNHO+iTmqxWnVg3KRygjGmpRLJGdQSKuvFinbIb0CnZwHAQ==
   dependencies:
-    "@babel/compat-data" "^7.20.0"
+    "@babel/compat-data" "^7.20.5"
     "@babel/helper-validator-option" "^7.18.6"
     browserslist "^4.21.3"
+    lru-cache "^5.1.1"
     semver "^6.3.0"
 
 "@babel/helper-environment-visitor@^7.18.9":
@@ -89,19 +90,19 @@
   dependencies:
     "@babel/types" "^7.18.6"
 
-"@babel/helper-module-transforms@^7.20.2":
-  version "7.20.2"
-  resolved "https://registry.yarnpkg.com/@babel/helper-module-transforms/-/helper-module-transforms-7.20.2.tgz#ac53da669501edd37e658602a21ba14c08748712"
-  integrity sha512-zvBKyJXRbmK07XhMuujYoJ48B5yvvmM6+wcpv6Ivj4Yg6qO7NOZOSnvZN9CRl1zz1Z4cKf8YejmCMh8clOoOeA==
+"@babel/helper-module-transforms@^7.20.7":
+  version "7.20.7"
+  resolved "https://registry.yarnpkg.com/@babel/helper-module-transforms/-/helper-module-transforms-7.20.7.tgz#7a6c9a1155bef55e914af574153069c9d9470c43"
+  integrity sha512-FNdu7r67fqMUSVuQpFQGE6BPdhJIhitoxhGzDbAXNcA07uoVG37fOiMk3OSV8rEICuyG6t8LGkd9EE64qIEoIA==
   dependencies:
     "@babel/helper-environment-visitor" "^7.18.9"
     "@babel/helper-module-imports" "^7.18.6"
     "@babel/helper-simple-access" "^7.20.2"
     "@babel/helper-split-export-declaration" "^7.18.6"
     "@babel/helper-validator-identifier" "^7.19.1"
-    "@babel/template" "^7.18.10"
-    "@babel/traverse" "^7.20.1"
-    "@babel/types" "^7.20.2"
+    "@babel/template" "^7.20.7"
+    "@babel/traverse" "^7.20.7"
+    "@babel/types" "^7.20.7"
 
 "@babel/helper-simple-access@^7.20.2":
   version "7.20.2"
@@ -132,14 +133,14 @@
   resolved "https://registry.yarnpkg.com/@babel/helper-validator-option/-/helper-validator-option-7.18.6.tgz#bf0d2b5a509b1f336099e4ff36e1a63aa5db4db8"
   integrity sha512-XO7gESt5ouv/LRJdrVjkShckw6STTaB7l9BrpBaAHDeF5YZT+01PCwmR0SJHnkW6i8OwW/EVWRShfi4j2x+KQw==
 
-"@babel/helpers@^7.20.5":
-  version "7.20.6"
-  resolved "https://registry.yarnpkg.com/@babel/helpers/-/helpers-7.20.6.tgz#e64778046b70e04779dfbdf924e7ebb45992c763"
-  integrity sha512-Pf/OjgfgFRW5bApskEz5pvidpim7tEDPlFtKcNRXWmfHGn9IEI2W2flqRQXTFb7gIPTyK++N6rVHuwKut4XK6w==
+"@babel/helpers@^7.20.7":
+  version "7.20.7"
+  resolved "https://registry.yarnpkg.com/@babel/helpers/-/helpers-7.20.7.tgz#04502ff0feecc9f20ecfaad120a18f011a8e6dce"
+  integrity sha512-PBPjs5BppzsGaxHQCDKnZ6Gd9s6xl8bBCluz3vEInLGRJmnZan4F6BYCeqtyXqkk4W5IlPmjK4JlOuZkpJ3xZA==
   dependencies:
-    "@babel/template" "^7.18.10"
-    "@babel/traverse" "^7.20.5"
-    "@babel/types" "^7.20.5"
+    "@babel/template" "^7.20.7"
+    "@babel/traverse" "^7.20.7"
+    "@babel/types" "^7.20.7"
 
 "@babel/highlight@^7.18.6":
   version "7.18.6"
@@ -150,10 +151,10 @@
     chalk "^2.0.0"
     js-tokens "^4.0.0"
 
-"@babel/parser@^7.18.10", "@babel/parser@^7.20.5":
-  version "7.20.5"
-  resolved "https://registry.yarnpkg.com/@babel/parser/-/parser-7.20.5.tgz#7f3c7335fe417665d929f34ae5dceae4c04015e8"
-  integrity sha512-r27t/cy/m9uKLXQNWWebeCUHgnAZq0CpG1OwKRxzJMP1vpSU4bSIK2hq+/cp0bQxetkXx38n09rNu8jVkcK/zA==
+"@babel/parser@^7.20.7":
+  version "7.20.7"
+  resolved "https://registry.yarnpkg.com/@babel/parser/-/parser-7.20.7.tgz#66fe23b3c8569220817d5feb8b9dcdc95bb4f71b"
+  integrity sha512-T3Z9oHybU+0vZlY9CiDSJQTD5ZapcW18ZctFMi0MOAl/4BjFF4ul7NVSARLdbGO5vDqy9eQiGTV0LtKfvCYvcg==
 
 "@babel/register@^7.18.9":
   version "7.18.9"
@@ -166,42 +167,42 @@
     pirates "^4.0.5"
     source-map-support "^0.5.16"
 
-"@babel/runtime@^7.20.1", "@babel/runtime@^7.20.6":
-  version "7.20.6"
-  resolved "https://registry.yarnpkg.com/@babel/runtime/-/runtime-7.20.6.tgz#facf4879bfed9b5326326273a64220f099b0fce3"
-  integrity sha512-Q+8MqP7TiHMWzSfwiJwXCjyf4GYA4Dgw3emg/7xmwsdLJOZUp+nMqcOwOzzYheuM1rhDu8FSj2l0aoMygEuXuA==
+"@babel/runtime@^7.20.6":
+  version "7.20.7"
+  resolved "https://registry.yarnpkg.com/@babel/runtime/-/runtime-7.20.7.tgz#fcb41a5a70550e04a7b708037c7c32f7f356d8fd"
+  integrity sha512-UF0tvkUtxwAgZ5W/KrkHf0Rn0fdnLDU9ScxBrEVNUprE/MzirjK4MJUX1/BVDv00Sv8cljtukVK1aky++X1SjQ==
   dependencies:
     regenerator-runtime "^0.13.11"
 
-"@babel/template@^7.18.10":
-  version "7.18.10"
-  resolved "https://registry.yarnpkg.com/@babel/template/-/template-7.18.10.tgz#6f9134835970d1dbf0835c0d100c9f38de0c5e71"
-  integrity sha512-TI+rCtooWHr3QJ27kJxfjutghu44DLnasDMwpDqCXVTal9RLp3RSYNh4NdBrRP2cQAoG9A8juOQl6P6oZG4JxA==
+"@babel/template@^7.18.10", "@babel/template@^7.20.7":
+  version "7.20.7"
+  resolved "https://registry.yarnpkg.com/@babel/template/-/template-7.20.7.tgz#a15090c2839a83b02aa996c0b4994005841fd5a8"
+  integrity sha512-8SegXApWe6VoNw0r9JHpSteLKTpTiLZ4rMlGIm9JQ18KiCtyQiAMEazujAHrUS5flrcqYZa75ukev3P6QmUwUw==
   dependencies:
     "@babel/code-frame" "^7.18.6"
-    "@babel/parser" "^7.18.10"
-    "@babel/types" "^7.18.10"
+    "@babel/parser" "^7.20.7"
+    "@babel/types" "^7.20.7"
 
-"@babel/traverse@^7.20.1", "@babel/traverse@^7.20.5":
-  version "7.20.5"
-  resolved "https://registry.yarnpkg.com/@babel/traverse/-/traverse-7.20.5.tgz#78eb244bea8270fdda1ef9af22a5d5e5b7e57133"
-  integrity sha512-WM5ZNN3JITQIq9tFZaw1ojLU3WgWdtkxnhM1AegMS+PvHjkM5IXjmYEGY7yukz5XS4sJyEf2VzWjI8uAavhxBQ==
+"@babel/traverse@^7.20.7":
+  version "7.20.8"
+  resolved "https://registry.yarnpkg.com/@babel/traverse/-/traverse-7.20.8.tgz#e3a23eb04af24f8bbe8a8ba3eef6155b77df0b08"
+  integrity sha512-/RNkaYDeCy4MjyV70+QkSHhxbvj2JO/5Ft2Pa880qJOG8tWrqcT/wXUuCCv43yogfqPzHL77Xu101KQPf4clnQ==
   dependencies:
     "@babel/code-frame" "^7.18.6"
-    "@babel/generator" "^7.20.5"
+    "@babel/generator" "^7.20.7"
     "@babel/helper-environment-visitor" "^7.18.9"
     "@babel/helper-function-name" "^7.19.0"
     "@babel/helper-hoist-variables" "^7.18.6"
     "@babel/helper-split-export-declaration" "^7.18.6"
-    "@babel/parser" "^7.20.5"
-    "@babel/types" "^7.20.5"
+    "@babel/parser" "^7.20.7"
+    "@babel/types" "^7.20.7"
     debug "^4.1.0"
     globals "^11.1.0"
 
-"@babel/types@^7.18.10", "@babel/types@^7.18.6", "@babel/types@^7.19.0", "@babel/types@^7.20.2", "@babel/types@^7.20.5":
-  version "7.20.5"
-  resolved "https://registry.yarnpkg.com/@babel/types/-/types-7.20.5.tgz#e206ae370b5393d94dfd1d04cd687cace53efa84"
-  integrity sha512-c9fst/h2/dcF7H+MJKZ2T0KjEQ8hY/BNnDk/H3XY8C4Aw/eWQXWn/lWntHF9ooUBnGmEvbfGrTgLWc+um0YDUg==
+"@babel/types@^7.18.6", "@babel/types@^7.19.0", "@babel/types@^7.20.2", "@babel/types@^7.20.7":
+  version "7.20.7"
+  resolved "https://registry.yarnpkg.com/@babel/types/-/types-7.20.7.tgz#54ec75e252318423fc07fb644dc6a58a64c09b7f"
+  integrity sha512-69OnhBxSSgK0OzTJai4kyPDiKTIe3j+ctaHdIGVbRahTLAT7L3R9oeXHC2aVSuGYt3cVnoAMDmOCgJ2yaiLMvg==
   dependencies:
     "@babel/helper-string-parser" "^7.19.4"
     "@babel/helper-validator-identifier" "^7.19.1"
@@ -214,15 +215,15 @@
   dependencies:
     "@jridgewell/trace-mapping" "0.3.9"
 
-"@eslint/eslintrc@^1.3.3":
-  version "1.3.3"
-  resolved "https://registry.yarnpkg.com/@eslint/eslintrc/-/eslintrc-1.3.3.tgz#2b044ab39fdfa75b4688184f9e573ce3c5b0ff95"
-  integrity sha512-uj3pT6Mg+3t39fvLrj8iuCIJ38zKO9FpGtJ4BBJebJhEwjoT+KLVNCcHT5QC9NGRIEi7fZ0ZR8YRb884auB4Lg==
+"@eslint/eslintrc@^1.4.0":
+  version "1.4.0"
+  resolved "https://registry.yarnpkg.com/@eslint/eslintrc/-/eslintrc-1.4.0.tgz#8ec64e0df3e7a1971ee1ff5158da87389f167a63"
+  integrity sha512-7yfvXy6MWLgWSFsLhz5yH3iQ52St8cdUY6FoGieKkRDVxuxmrNuUetIuu6cmjNWwniUHiWXjxCr5tTXDrbYS5A==
   dependencies:
     ajv "^6.12.4"
     debug "^4.3.2"
     espree "^9.4.0"
-    globals "^13.15.0"
+    globals "^13.19.0"
     ignore "^5.2.0"
     import-fresh "^3.2.1"
     js-yaml "^4.1.0"
@@ -430,7 +431,7 @@
     "@ethersproject/properties" "^5.7.0"
     "@ethersproject/strings" "^5.7.0"
 
-"@humanwhocodes/config-array@^0.11.6":
+"@humanwhocodes/config-array@^0.11.8":
   version "0.11.8"
   resolved "https://registry.yarnpkg.com/@humanwhocodes/config-array/-/config-array-0.11.8.tgz#03595ac2075a4dc0f191cc2131de14fbd7d410b9"
   integrity sha512-UybHIJzJnR5Qc/MsD9Kr+RpO2h+/P1GhOwdiLPXK5TWk5sgTdu88bTD9UP+CKbPPh5Rni1u0GjAdYQLemG8g+g==
@@ -528,70 +529,70 @@
     "@nodelib/fs.scandir" "2.1.5"
     fastq "^1.6.0"
 
-"@polkadot/api-augment@9.9.4":
-  version "9.9.4"
-  resolved "https://registry.yarnpkg.com/@polkadot/api-augment/-/api-augment-9.9.4.tgz#cb09d8edfc3a5d61c6519f30a2f02b1bb939c9f6"
-  integrity sha512-+T9YWw5kEi7AkSoS2UfE1nrVeJUtD92elQBZ3bMMkfM1geKWhSnvBLyTMn6kFmNXTfK0qt8YKS1pwbux7cC9tg==
+"@polkadot/api-augment@9.10.2":
+  version "9.10.2"
+  resolved "https://registry.yarnpkg.com/@polkadot/api-augment/-/api-augment-9.10.2.tgz#9d1875bffe9d8677a4f03d53ca6df3d0d7e7f53d"
+  integrity sha512-B0xC7yvPAZqPZpKJzrlFSDfHBawCJISwdV4/nBSs1/AaqQIXVu2ZqPUaSdq7eisZL/EZziptK0SpCtDcb6LpAg==
   dependencies:
-    "@babel/runtime" "^7.20.1"
-    "@polkadot/api-base" "9.9.4"
-    "@polkadot/rpc-augment" "9.9.4"
-    "@polkadot/types" "9.9.4"
-    "@polkadot/types-augment" "9.9.4"
-    "@polkadot/types-codec" "9.9.4"
-    "@polkadot/util" "^10.1.14"
+    "@babel/runtime" "^7.20.6"
+    "@polkadot/api-base" "9.10.2"
+    "@polkadot/rpc-augment" "9.10.2"
+    "@polkadot/types" "9.10.2"
+    "@polkadot/types-augment" "9.10.2"
+    "@polkadot/types-codec" "9.10.2"
+    "@polkadot/util" "^10.2.1"
 
-"@polkadot/api-base@9.9.4":
-  version "9.9.4"
-  resolved "https://registry.yarnpkg.com/@polkadot/api-base/-/api-base-9.9.4.tgz#eccc645b60485bfe64a5e6a9ebb3195d2011c0ee"
-  integrity sha512-G1DcxcMeGcvaAAA3u5Tbf70zE5aIuAPEAXnptFMF0lvJz4O6CM8k8ZZFTSk25hjsYlnx8WI1FTc97q4/tKie+Q==
+"@polkadot/api-base@9.10.2":
+  version "9.10.2"
+  resolved "https://registry.yarnpkg.com/@polkadot/api-base/-/api-base-9.10.2.tgz#39248e966b468ecff7c0ed00bb61dfca14ca99d4"
+  integrity sha512-M/Yushqk6eEAfbkF90vy3GCVg+a2uVeSXyTBKbmkjZtcE7x39GiXs7LOJuYkIim51hlwcvVSeInX8HufwnTUMw==
   dependencies:
-    "@babel/runtime" "^7.20.1"
-    "@polkadot/rpc-core" "9.9.4"
-    "@polkadot/types" "9.9.4"
-    "@polkadot/util" "^10.1.14"
-    rxjs "^7.5.7"
+    "@babel/runtime" "^7.20.6"
+    "@polkadot/rpc-core" "9.10.2"
+    "@polkadot/types" "9.10.2"
+    "@polkadot/util" "^10.2.1"
+    rxjs "^7.6.0"
 
-"@polkadot/api-derive@9.9.4":
-  version "9.9.4"
-  resolved "https://registry.yarnpkg.com/@polkadot/api-derive/-/api-derive-9.9.4.tgz#0eedd9c604be2425d8a1adcf048446184a5aaec9"
-  integrity sha512-3ka7GzY4QbI3d/DHjQ9SjfDOTDxeU8gM2Dn31BP1oFzGwdFe2GZhDIE//lR5S6UDVxNNlgWz4927AunOQcuAmg==
+"@polkadot/api-derive@9.10.2":
+  version "9.10.2"
+  resolved "https://registry.yarnpkg.com/@polkadot/api-derive/-/api-derive-9.10.2.tgz#d6b0eb558ee057416b87a304ca2790b19afa4be6"
+  integrity sha512-Ut1aqbGvqAkxXq7M4HgJ7BVhUyfbQigqt5LISmnjWdGkhroBxtIJ24saOUPYNr0O/c3jocJpoWqGK2CuucL81w==
   dependencies:
-    "@babel/runtime" "^7.20.1"
-    "@polkadot/api" "9.9.4"
-    "@polkadot/api-augment" "9.9.4"
-    "@polkadot/api-base" "9.9.4"
-    "@polkadot/rpc-core" "9.9.4"
-    "@polkadot/types" "9.9.4"
-    "@polkadot/types-codec" "9.9.4"
-    "@polkadot/util" "^10.1.14"
-    "@polkadot/util-crypto" "^10.1.14"
-    rxjs "^7.5.7"
+    "@babel/runtime" "^7.20.6"
+    "@polkadot/api" "9.10.2"
+    "@polkadot/api-augment" "9.10.2"
+    "@polkadot/api-base" "9.10.2"
+    "@polkadot/rpc-core" "9.10.2"
+    "@polkadot/types" "9.10.2"
+    "@polkadot/types-codec" "9.10.2"
+    "@polkadot/util" "^10.2.1"
+    "@polkadot/util-crypto" "^10.2.1"
+    rxjs "^7.6.0"
 
-"@polkadot/api@9.9.4":
-  version "9.9.4"
-  resolved "https://registry.yarnpkg.com/@polkadot/api/-/api-9.9.4.tgz#a4899d7497644378a94e0cc6fcbf73a5e2d31b92"
-  integrity sha512-ze7W/DXsPHsixrFOACzugDQqezzrUGGX1Z2JOl6z+V8pd+ZKLSecsKJFUzf4yoBT82ArITYPtRVx/Dq9b9K2dA==
+"@polkadot/api@9.10.2":
+  version "9.10.2"
+  resolved "https://registry.yarnpkg.com/@polkadot/api/-/api-9.10.2.tgz#9a3132f0c8a5de6c2b7d56f9d9e9c9c5ed2bc77e"
+  integrity sha512-5leF7rxwRkkd/g11tGPho/CcbInVX7ZiuyMsLMTwn+2PDX+Ggv/gmxUboa34eyeLp8/AMui5YbqRD4QExLTxqw==
   dependencies:
-    "@babel/runtime" "^7.20.1"
-    "@polkadot/api-augment" "9.9.4"
-    "@polkadot/api-base" "9.9.4"
-    "@polkadot/api-derive" "9.9.4"
-    "@polkadot/keyring" "^10.1.14"
-    "@polkadot/rpc-augment" "9.9.4"
-    "@polkadot/rpc-core" "9.9.4"
-    "@polkadot/rpc-provider" "9.9.4"
-    "@polkadot/types" "9.9.4"
-    "@polkadot/types-augment" "9.9.4"
-    "@polkadot/types-codec" "9.9.4"
-    "@polkadot/types-create" "9.9.4"
-    "@polkadot/types-known" "9.9.4"
-    "@polkadot/util" "^10.1.14"
-    "@polkadot/util-crypto" "^10.1.14"
+    "@babel/runtime" "^7.20.6"
+    "@polkadot/api-augment" "9.10.2"
+    "@polkadot/api-base" "9.10.2"
+    "@polkadot/api-derive" "9.10.2"
+    "@polkadot/keyring" "^10.2.1"
+    "@polkadot/rpc-augment" "9.10.2"
+    "@polkadot/rpc-core" "9.10.2"
+    "@polkadot/rpc-provider" "9.10.2"
+    "@polkadot/types" "9.10.2"
+    "@polkadot/types-augment" "9.10.2"
+    "@polkadot/types-codec" "9.10.2"
+    "@polkadot/types-create" "9.10.2"
+    "@polkadot/types-known" "9.10.2"
+    "@polkadot/util" "^10.2.1"
+    "@polkadot/util-crypto" "^10.2.1"
     eventemitter3 "^4.0.7"
-    rxjs "^7.5.7"
+    rxjs "^7.6.0"
 
-"@polkadot/keyring@^10.1.14":
+"@polkadot/keyring@^10.2.1":
   version "10.2.1"
   resolved "https://registry.yarnpkg.com/@polkadot/keyring/-/keyring-10.2.1.tgz#692d4e24dcbbe294b6945640802fc924ea20348e"
   integrity sha512-84/zzxDZANQ4AfsCT1vrjX3I23/mj9WUWl1F7q9ruK6UBFyGsl46Y3ABOopFHij9UXhppndhB65IeDnqoOKqxQ==
@@ -600,7 +601,7 @@
     "@polkadot/util" "10.2.1"
     "@polkadot/util-crypto" "10.2.1"
 
-"@polkadot/networks@10.2.1", "@polkadot/networks@^10.1.14":
+"@polkadot/networks@10.2.1", "@polkadot/networks@^10.2.1":
   version "10.2.1"
   resolved "https://registry.yarnpkg.com/@polkadot/networks/-/networks-10.2.1.tgz#5095011795afa20291ef3e34a2ad38ed2c63fe09"
   integrity sha512-cDZIY4jBo2tlDdSXNbECpuWer0NWlPcJNhHHveTiu2idje2QyIBNxBlAPViNGpz+ScAR0EknEzmQKuHOcSKxzg==
@@ -609,135 +610,135 @@
     "@polkadot/util" "10.2.1"
     "@substrate/ss58-registry" "^1.35.0"
 
-"@polkadot/rpc-augment@9.9.4":
-  version "9.9.4"
-  resolved "https://registry.yarnpkg.com/@polkadot/rpc-augment/-/rpc-augment-9.9.4.tgz#82a1473143cb9ec1183e01babcfe7ac396ad456b"
-  integrity sha512-67zGQAhJuXd/CZlwDZTgxNt3xGtsDwLvLvyFrHuNjJNM0KGCyt/OpQHVBlyZ6xfII0WZpccASN6P2MxsGTMnKw==
+"@polkadot/rpc-augment@9.10.2":
+  version "9.10.2"
+  resolved "https://registry.yarnpkg.com/@polkadot/rpc-augment/-/rpc-augment-9.10.2.tgz#5650aa118d39d0c4b17425a9b327354f7bbf99e5"
+  integrity sha512-LrGzpSdkqXltZDwuBeBBMev68eVVN1GpgV4auEAytgDYYcjI9XDaeLZm7vUVx9aBO8OYz9hQZeHrWrab/FaKmg==
   dependencies:
-    "@babel/runtime" "^7.20.1"
-    "@polkadot/rpc-core" "9.9.4"
-    "@polkadot/types" "9.9.4"
-    "@polkadot/types-codec" "9.9.4"
-    "@polkadot/util" "^10.1.14"
+    "@babel/runtime" "^7.20.6"
+    "@polkadot/rpc-core" "9.10.2"
+    "@polkadot/types" "9.10.2"
+    "@polkadot/types-codec" "9.10.2"
+    "@polkadot/util" "^10.2.1"
 
-"@polkadot/rpc-core@9.9.4":
-  version "9.9.4"
-  resolved "https://registry.yarnpkg.com/@polkadot/rpc-core/-/rpc-core-9.9.4.tgz#30cb94dfb9438ef54f6ab9367bc533fa6934dbc5"
-  integrity sha512-DxhJcq1GAi+28nLMqhTksNMqTX40bGNhYuyQyy/to39VxizAjx+lyAHAMfzG9lvPnTIi2KzXif2pCdWq3AgJag==
+"@polkadot/rpc-core@9.10.2":
+  version "9.10.2"
+  resolved "https://registry.yarnpkg.com/@polkadot/rpc-core/-/rpc-core-9.10.2.tgz#72362d26012c53397c1079912d5d4aacf910a650"
+  integrity sha512-qr+q2R3YeRBC++bYxK292jb6t9/KXeLoRheW5z7LbYyre3J60vZPN7WxPxbwm+iCGk1VtvH80Dv1OSCoVC+7hA==
   dependencies:
-    "@babel/runtime" "^7.20.1"
-    "@polkadot/rpc-augment" "9.9.4"
-    "@polkadot/rpc-provider" "9.9.4"
-    "@polkadot/types" "9.9.4"
-    "@polkadot/util" "^10.1.14"
-    rxjs "^7.5.7"
+    "@babel/runtime" "^7.20.6"
+    "@polkadot/rpc-augment" "9.10.2"
+    "@polkadot/rpc-provider" "9.10.2"
+    "@polkadot/types" "9.10.2"
+    "@polkadot/util" "^10.2.1"
+    rxjs "^7.6.0"
 
-"@polkadot/rpc-provider@9.9.4":
-  version "9.9.4"
-  resolved "https://registry.yarnpkg.com/@polkadot/rpc-provider/-/rpc-provider-9.9.4.tgz#dab6d72e83e325dc170e03d0edf5f7bec07c0293"
-  integrity sha512-aUkPtlYukAOFX3FkUgLw3MNy+T0mCiCX7va3PIts9ggK4vl14NFZHurCZq+5ANvknRU4WG8P5teurH9Rd9oDjQ==
+"@polkadot/rpc-provider@9.10.2":
+  version "9.10.2"
+  resolved "https://registry.yarnpkg.com/@polkadot/rpc-provider/-/rpc-provider-9.10.2.tgz#83c8e114b3aad75eedaf98a374bc77a2b8cc1dbc"
+  integrity sha512-mm8l1uZ7DOrsMUN+DELS8apyZVVNIy/SrqEBjHZeZ0AA9noAEbH4ubxR375lG/T32+T97mFudv1rxRnEwXqByg==
   dependencies:
-    "@babel/runtime" "^7.20.1"
-    "@polkadot/keyring" "^10.1.14"
-    "@polkadot/types" "9.9.4"
-    "@polkadot/types-support" "9.9.4"
-    "@polkadot/util" "^10.1.14"
-    "@polkadot/util-crypto" "^10.1.14"
-    "@polkadot/x-fetch" "^10.1.14"
-    "@polkadot/x-global" "^10.1.14"
-    "@polkadot/x-ws" "^10.1.14"
+    "@babel/runtime" "^7.20.6"
+    "@polkadot/keyring" "^10.2.1"
+    "@polkadot/types" "9.10.2"
+    "@polkadot/types-support" "9.10.2"
+    "@polkadot/util" "^10.2.1"
+    "@polkadot/util-crypto" "^10.2.1"
+    "@polkadot/x-fetch" "^10.2.1"
+    "@polkadot/x-global" "^10.2.1"
+    "@polkadot/x-ws" "^10.2.1"
     "@substrate/connect" "0.7.17"
     eventemitter3 "^4.0.7"
     mock-socket "^9.1.5"
     nock "^13.2.9"
 
-"@polkadot/typegen@9.9.4":
-  version "9.9.4"
-  resolved "https://registry.yarnpkg.com/@polkadot/typegen/-/typegen-9.9.4.tgz#24ee3122c338a359d5776e1c728160ffaaffe6b9"
-  integrity sha512-uIPD3r9QCvTtz5JHQaO5T2q36U9PrmrutHXbHWWzswsWU6lxkGjIiwUOdV+IUemeQx85GVOAPInU+BnwdhPUpA==
+"@polkadot/typegen@9.10.2":
+  version "9.10.2"
+  resolved "https://registry.yarnpkg.com/@polkadot/typegen/-/typegen-9.10.2.tgz#3a206feaa664afe2cdcc42707b4fa8fde49ce0cc"
+  integrity sha512-AyO1f/tx173w6pZrQINPu12sCIH9uvn+yRL2sJuCBS5+aqlnsR1JscBk6HIlR6t6Jctx1QCsHycfvSvin3IVoA==
   dependencies:
-    "@babel/core" "^7.20.2"
+    "@babel/core" "^7.20.5"
     "@babel/register" "^7.18.9"
-    "@babel/runtime" "^7.20.1"
-    "@polkadot/api" "9.9.4"
-    "@polkadot/api-augment" "9.9.4"
-    "@polkadot/rpc-augment" "9.9.4"
-    "@polkadot/rpc-provider" "9.9.4"
-    "@polkadot/types" "9.9.4"
-    "@polkadot/types-augment" "9.9.4"
-    "@polkadot/types-codec" "9.9.4"
-    "@polkadot/types-create" "9.9.4"
-    "@polkadot/types-support" "9.9.4"
-    "@polkadot/util" "^10.1.14"
-    "@polkadot/util-crypto" "^10.1.14"
-    "@polkadot/x-ws" "^10.1.14"
+    "@babel/runtime" "^7.20.6"
+    "@polkadot/api" "9.10.2"
+    "@polkadot/api-augment" "9.10.2"
+    "@polkadot/rpc-augment" "9.10.2"
+    "@polkadot/rpc-provider" "9.10.2"
+    "@polkadot/types" "9.10.2"
+    "@polkadot/types-augment" "9.10.2"
+    "@polkadot/types-codec" "9.10.2"
+    "@polkadot/types-create" "9.10.2"
+    "@polkadot/types-support" "9.10.2"
+    "@polkadot/util" "^10.2.1"
+    "@polkadot/util-crypto" "^10.2.1"
+    "@polkadot/x-ws" "^10.2.1"
     handlebars "^4.7.7"
     websocket "^1.0.34"
     yargs "^17.6.2"
 
-"@polkadot/types-augment@9.9.4":
-  version "9.9.4"
-  resolved "https://registry.yarnpkg.com/@polkadot/types-augment/-/types-augment-9.9.4.tgz#08a2a89c0b8000ef156a0ed41f5eb7aa55cc1bb1"
-  integrity sha512-mQNc0kxt3zM6SC+5hJbsg03fxEFpn5nakki+loE2mNsWr1g+rR7LECagAZ4wT2gvdbzWuY/LlRYyDQxe0PwdZg==
+"@polkadot/types-augment@9.10.2":
+  version "9.10.2"
+  resolved "https://registry.yarnpkg.com/@polkadot/types-augment/-/types-augment-9.10.2.tgz#2dce4ea8a2879d248339ad377ff5479fae884cd5"
+  integrity sha512-z0M3bAwGi0pGS3ieXyiJZLzDEc5yBvlqaZvaAbf2r+vto83SylhbjjG1wX8ARI5hqptBUWqS9BssUFH0q6l4sg==
   dependencies:
-    "@babel/runtime" "^7.20.1"
-    "@polkadot/types" "9.9.4"
-    "@polkadot/types-codec" "9.9.4"
-    "@polkadot/util" "^10.1.14"
+    "@babel/runtime" "^7.20.6"
+    "@polkadot/types" "9.10.2"
+    "@polkadot/types-codec" "9.10.2"
+    "@polkadot/util" "^10.2.1"
 
-"@polkadot/types-codec@9.9.4":
-  version "9.9.4"
-  resolved "https://registry.yarnpkg.com/@polkadot/types-codec/-/types-codec-9.9.4.tgz#1219a6b453dab8e53a0d376f13394b02964c7665"
-  integrity sha512-uSHoQQcj4813c9zNkDDH897K6JB0OznTrH5WeZ1wxpjML7lkuTJ2t/GQE9e4q5Ycl7YePZsvEp2qlc3GwrVm/w==
+"@polkadot/types-codec@9.10.2":
+  version "9.10.2"
+  resolved "https://registry.yarnpkg.com/@polkadot/types-codec/-/types-codec-9.10.2.tgz#7f0e33c33292bdfcd959945b2427742b941df712"
+  integrity sha512-zQOPzxq2N6PUP6Gkxc3OVT7Ub8AD3qC0PBeCnc/fhKjgX3CoKQK4TC6tDL8pEaaIVFh4LOHlHvhWJhqaUNe95A==
   dependencies:
-    "@babel/runtime" "^7.20.1"
-    "@polkadot/util" "^10.1.14"
-    "@polkadot/x-bigint" "^10.1.14"
+    "@babel/runtime" "^7.20.6"
+    "@polkadot/util" "^10.2.1"
+    "@polkadot/x-bigint" "^10.2.1"
 
-"@polkadot/types-create@9.9.4":
-  version "9.9.4"
-  resolved "https://registry.yarnpkg.com/@polkadot/types-create/-/types-create-9.9.4.tgz#d2d3d0e4c3cd4a0a4581dcb418a8f6bec657b986"
-  integrity sha512-EOxLryRQ4JVRSRnIMXk3Tjry1tyegNuWK8OUj51A1wHrX76DF9chME27bXUP4d7el1pjqPuQ9/l+/928GG386g==
+"@polkadot/types-create@9.10.2":
+  version "9.10.2"
+  resolved "https://registry.yarnpkg.com/@polkadot/types-create/-/types-create-9.10.2.tgz#eb7dbf5f50eb4d01a965347d324de26a679a25e3"
+  integrity sha512-U6wDaJe8tZmt0WibxWeDFYVKfvOYa2su8xOwg8HTRraijF6k0/OMugb15bpjEkG6RZ1qg1L7oKrKghugVbRDGQ==
   dependencies:
-    "@babel/runtime" "^7.20.1"
-    "@polkadot/types-codec" "9.9.4"
-    "@polkadot/util" "^10.1.14"
+    "@babel/runtime" "^7.20.6"
+    "@polkadot/types-codec" "9.10.2"
+    "@polkadot/util" "^10.2.1"
 
-"@polkadot/types-known@9.9.4":
-  version "9.9.4"
-  resolved "https://registry.yarnpkg.com/@polkadot/types-known/-/types-known-9.9.4.tgz#d30fa2c5c964b76b748413004758d05eb8f0e8f9"
-  integrity sha512-BaKXkg3yZLDv31g0CZPJsZDXX01VTjkQ0tmW9U6fmccEq3zHlxbUiXf3aKlwKRJyDWiEOxr4cQ4GT8jj6uEIuA==
+"@polkadot/types-known@9.10.2":
+  version "9.10.2"
+  resolved "https://registry.yarnpkg.com/@polkadot/types-known/-/types-known-9.10.2.tgz#d37d984eed6aa17b33603aca9f9d006d6eb468cb"
+  integrity sha512-Kwxoo+xvAAE1w0jZdGqmNoEJHdfJzncO1xrBJ7WjeCuEFoDsWmjP63u/o8VaC1ZNnfrhjRK0vyvquslJ6NQOUA==
   dependencies:
-    "@babel/runtime" "^7.20.1"
-    "@polkadot/networks" "^10.1.14"
-    "@polkadot/types" "9.9.4"
-    "@polkadot/types-codec" "9.9.4"
-    "@polkadot/types-create" "9.9.4"
-    "@polkadot/util" "^10.1.14"
+    "@babel/runtime" "^7.20.6"
+    "@polkadot/networks" "^10.2.1"
+    "@polkadot/types" "9.10.2"
+    "@polkadot/types-codec" "9.10.2"
+    "@polkadot/types-create" "9.10.2"
+    "@polkadot/util" "^10.2.1"
 
-"@polkadot/types-support@9.9.4":
-  version "9.9.4"
-  resolved "https://registry.yarnpkg.com/@polkadot/types-support/-/types-support-9.9.4.tgz#3f2eb1097a268bdd280d36fb53b7cdc98a5e238c"
-  integrity sha512-vjhdD7B5kdTLhm2iO0QAb7fM4D2ojNUVVocOJotC9NULYtoC+PkPvkvFbw7VQ1H3u7yxyZfWloMtBnCsIp5EAA==
+"@polkadot/types-support@9.10.2":
+  version "9.10.2"
+  resolved "https://registry.yarnpkg.com/@polkadot/types-support/-/types-support-9.10.2.tgz#eff0ef399a3373421a543059f62ca96b85645f0b"
+  integrity sha512-RQSCNNBH8+mzXbErB/LUDU9oMQScv0GZ4UmM2MPDPKBcqXNCdJ4dK+ajNfVbgGTUucYUEebpp2m5Az1usjE4Ew==
   dependencies:
-    "@babel/runtime" "^7.20.1"
-    "@polkadot/util" "^10.1.14"
+    "@babel/runtime" "^7.20.6"
+    "@polkadot/util" "^10.2.1"
 
-"@polkadot/types@9.9.4":
-  version "9.9.4"
-  resolved "https://registry.yarnpkg.com/@polkadot/types/-/types-9.9.4.tgz#a1b38174f5a9e2aa97612157d12faffd905b126e"
-  integrity sha512-/LJ029S0AtKzvV9JoQtIIeHRP/Xoq8MZmDfdHUEgThRd+uvtQzFyGmcupe4EzX0p5VAx93DUFQKm8vUdHE39Tw==
+"@polkadot/types@9.10.2":
+  version "9.10.2"
+  resolved "https://registry.yarnpkg.com/@polkadot/types/-/types-9.10.2.tgz#1f6647445b055856bdbd949106f698c89a125386"
+  integrity sha512-B5Bg/IaAMJEwdWzGp3pil5WBukr5fm9x9NFIMuoCS9TyIqpm9rSHrz2n/408R3B4rwqqtx8RQAxiIETFI+m6Rw==
   dependencies:
-    "@babel/runtime" "^7.20.1"
-    "@polkadot/keyring" "^10.1.14"
-    "@polkadot/types-augment" "9.9.4"
-    "@polkadot/types-codec" "9.9.4"
-    "@polkadot/types-create" "9.9.4"
-    "@polkadot/util" "^10.1.14"
-    "@polkadot/util-crypto" "^10.1.14"
-    rxjs "^7.5.7"
+    "@babel/runtime" "^7.20.6"
+    "@polkadot/keyring" "^10.2.1"
+    "@polkadot/types-augment" "9.10.2"
+    "@polkadot/types-codec" "9.10.2"
+    "@polkadot/types-create" "9.10.2"
+    "@polkadot/util" "^10.2.1"
+    "@polkadot/util-crypto" "^10.2.1"
+    rxjs "^7.6.0"
 
-"@polkadot/util-crypto@10.2.1", "@polkadot/util-crypto@^10.1.14":
+"@polkadot/util-crypto@10.2.1", "@polkadot/util-crypto@^10.2.1":
   version "10.2.1"
   resolved "https://registry.yarnpkg.com/@polkadot/util-crypto/-/util-crypto-10.2.1.tgz#f6ce1c81496336ca50c2ca84975bcde79aa16634"
   integrity sha512-UH1J4oD92gkLXMfVTLee3Y2vYadNyp1lmS4P2nZwQ0SOzGZ4rN7khD2CrB1cXS9WPq196Zb5oZdGLnPYnXHtjw==
@@ -754,7 +755,7 @@
     ed2curve "^0.3.0"
     tweetnacl "^1.0.3"
 
-"@polkadot/util@10.2.1", "@polkadot/util@^10.1.14":
+"@polkadot/util@10.2.1", "@polkadot/util@^10.2.1":
   version "10.2.1"
   resolved "https://registry.yarnpkg.com/@polkadot/util/-/util-10.2.1.tgz#a8c3a4fe87091197448bec70f7ea079b60d5abf6"
   integrity sha512-ewGKSOp+VXKEeCvpCCP2Qqi/FVkewBF9vb/N8pRwuNQ2XE9k1lnsOZZeQemVBDhKsZz+h3IeNcWejaF6K3vYHQ==
@@ -818,7 +819,7 @@
   dependencies:
     "@babel/runtime" "^7.20.6"
 
-"@polkadot/x-bigint@10.2.1", "@polkadot/x-bigint@^10.1.14":
+"@polkadot/x-bigint@10.2.1", "@polkadot/x-bigint@^10.2.1":
   version "10.2.1"
   resolved "https://registry.yarnpkg.com/@polkadot/x-bigint/-/x-bigint-10.2.1.tgz#aa2d4384bb4ae6b5a3f333aa25bf6fd64d9006c5"
   integrity sha512-asFroI2skC4gYv0oIqqb84DqCCxhNUTSCKobEg57WdXoT4TKrN9Uetg2AMSIHRiX/9lP3EPMhUjM1VVGobTQRQ==
@@ -826,7 +827,7 @@
     "@babel/runtime" "^7.20.6"
     "@polkadot/x-global" "10.2.1"
 
-"@polkadot/x-fetch@^10.1.14":
+"@polkadot/x-fetch@^10.2.1":
   version "10.2.1"
   resolved "https://registry.yarnpkg.com/@polkadot/x-fetch/-/x-fetch-10.2.1.tgz#cb5b33da1d91787eb2e5207ef62806a75ef3c62f"
   integrity sha512-6ASJUZIrbLaKW+AOW7E5CuktwJwa2LHhxxRyJe398HxZUjJRjO2VJPdqoSwwCYvfFa1TcIr3FDWS63ooDfvGMA==
@@ -836,7 +837,7 @@
     "@types/node-fetch" "^2.6.2"
     node-fetch "^3.3.0"
 
-"@polkadot/x-global@10.2.1", "@polkadot/x-global@^10.1.14":
+"@polkadot/x-global@10.2.1", "@polkadot/x-global@^10.2.1":
   version "10.2.1"
   resolved "https://registry.yarnpkg.com/@polkadot/x-global/-/x-global-10.2.1.tgz#6fbaab05653e680adc8c69c07947eee49afc1238"
   integrity sha512-kWmPku2lCcoYKU16+lWGOb95+6Lu9zo1trvzTWmAt7z0DXw2GlD9+qmDTt5iYGtguJsGXoRZDGilDTo3MeFrkA==
@@ -867,7 +868,7 @@
     "@babel/runtime" "^7.20.6"
     "@polkadot/x-global" "10.2.1"
 
-"@polkadot/x-ws@^10.1.14":
+"@polkadot/x-ws@^10.2.1":
   version "10.2.1"
   resolved "https://registry.yarnpkg.com/@polkadot/x-ws/-/x-ws-10.2.1.tgz#ec119c22a8cb7b9cde00e9909e37b6ba2845efd1"
   integrity sha512-oS/WEHc1JSJ+xMArzFXbg1yEeaRrp6GsJLBvObj4DgTyqoWTR5fYkq1G1nHbyqdR729yAnR6755PdaWecIg98g==
@@ -1022,9 +1023,9 @@
     form-data "^3.0.0"
 
 "@types/node@*", "@types/node@^18.11.2":
-  version "18.11.15"
-  resolved "https://registry.yarnpkg.com/@types/node/-/node-18.11.15.tgz#de0e1fbd2b22b962d45971431e2ae696643d3f5d"
-  integrity sha512-VkhBbVo2+2oozlkdHXLrb3zjsRkpdnaU2bXmX8Wgle3PUi569eLRaHGlgETQHR7lLL1w7GiG3h9SnePhxNDecw==
+  version "18.11.17"
+  resolved "https://registry.yarnpkg.com/@types/node/-/node-18.11.17.tgz#5c009e1d9c38f4a2a9d45c0b0c493fe6cdb4bcb5"
+  integrity sha512-HJSUJmni4BeDHhfzn6nF0sVmd1SMezP7/4F0Lq+aXzmp2xm9O7WXrUtHW/CHlYVtZUbByEvWidHqRtcJXGF2Ng==
 
 "@types/node@^12.12.6":
   version "12.20.55"
@@ -1555,9 +1556,9 @@
   integrity sha512-Gmy6FhYlCY7uOElZUSbxo2UCDH8owEk996gkbrpsgGtrJLM3J7jGxl9Ic7Qwwj4ivOE5AWZWRMecDdF7hqGjFA==
 
 caniuse-lite@^1.0.30001400:
-  version "1.0.30001439"
-  resolved "https://registry.yarnpkg.com/caniuse-lite/-/caniuse-lite-1.0.30001439.tgz#ab7371faeb4adff4b74dad1718a6fd122e45d9cb"
-  integrity sha512-1MgUzEkoMO6gKfXflStpYgZDlFM7M/ck/bgfVCACO5vnAf0fXoNVHdWtqGU+MYca+4bL9Z5bpOVmR33cWW9G2A==
+  version "1.0.30001441"
+  resolved "https://registry.yarnpkg.com/caniuse-lite/-/caniuse-lite-1.0.30001441.tgz#987437b266260b640a23cd18fbddb509d7f69f3e"
+  integrity sha512-OyxRR4Vof59I3yGWXws6i908EtGbMzVUi3ganaZQHmydk1iwDhRnvaPG2WaR0KcqrDFKrxVZHULT396LEPhXfg==
 
 caseless@~0.12.0:
   version "0.12.0"
@@ -1917,7 +1918,7 @@
   resolved "https://registry.yarnpkg.com/decamelize/-/decamelize-4.0.0.tgz#aa472d7bf660eb15f3494efd531cab7f2a709837"
   integrity sha512-9iE1PgSik9HeIIw2JO94IidnE3eBoQrFJ3w7sFuzSX4DpmZ3v5sZpUiV5Swcf6mQEF+Y0ru8Neo+p+nyh2J+hQ==
 
-decode-uri-component@^0.2.0:
+decode-uri-component@^0.2.0, decode-uri-component@^0.2.1:
   version "0.2.2"
   resolved "https://registry.yarnpkg.com/decode-uri-component/-/decode-uri-component-0.2.2.tgz#e69dbe25d37941171dd540e024c444cd5188e1e9"
   integrity sha512-FqUYQ+8o158GyGTrMFJms9qh3CqTKvAqgqsTnkLI8sKu0028orqBhxNMFkFen0zGyg6epACD32pjVk58ngIErQ==
@@ -2162,12 +2163,12 @@
   integrity sha512-mQ+suqKJVyeuwGYHAdjMFqjCyfl8+Ldnxuyp3ldiMBFKkvytrXUZWaiPCEav8qDHKty44bD+qV1IP4T+w+xXRA==
 
 eslint@^8.25.0:
-  version "8.29.0"
-  resolved "https://registry.yarnpkg.com/eslint/-/eslint-8.29.0.tgz#d74a88a20fb44d59c51851625bc4ee8d0ec43f87"
-  integrity sha512-isQ4EEiyUjZFbEKvEGJKKGBwXtvXX+zJbkVKCgTuB9t/+jUBcy8avhkEwWJecI15BkRkOYmvIM5ynbhRjEkoeg==
+  version "8.30.0"
+  resolved "https://registry.yarnpkg.com/eslint/-/eslint-8.30.0.tgz#83a506125d089eef7c5b5910eeea824273a33f50"
+  integrity sha512-MGADB39QqYuzEGov+F/qb18r4i7DohCDOfatHaxI2iGlPuC65bwG2gxgO+7DkyL38dRFaRH7RaRAgU6JKL9rMQ==
   dependencies:
-    "@eslint/eslintrc" "^1.3.3"
-    "@humanwhocodes/config-array" "^0.11.6"
+    "@eslint/eslintrc" "^1.4.0"
+    "@humanwhocodes/config-array" "^0.11.8"
     "@humanwhocodes/module-importer" "^1.0.1"
     "@nodelib/fs.walk" "^1.2.8"
     ajv "^6.10.0"
@@ -2186,7 +2187,7 @@
     file-entry-cache "^6.0.1"
     find-up "^5.0.0"
     glob-parent "^6.0.2"
-    globals "^13.15.0"
+    globals "^13.19.0"
     grapheme-splitter "^1.0.4"
     ignore "^5.2.0"
     import-fresh "^3.0.0"
@@ -2703,7 +2704,7 @@
   resolved "https://registry.yarnpkg.com/globals/-/globals-11.12.0.tgz#ab8795338868a0babd8525758018c2a7eb95c42e"
   integrity sha512-WOBp/EEGUiIsJSp7wcv/y6MO+lV9UoncWqxuFfm8eBwzWNgyfBd6Gz+IeKQ9jCmyhoH99g15M3T+QaVHFjizVA==
 
-globals@^13.15.0:
+globals@^13.19.0:
   version "13.19.0"
   resolved "https://registry.yarnpkg.com/globals/-/globals-13.19.0.tgz#7a42de8e6ad4f7242fbcca27ea5b23aca367b5c8"
   integrity sha512-dkQ957uSRWHw7CFXLUtUHQI3g3aWApYhfNR2O6jn/907riyTYKVBmxYVROkBcY614FSSeSJh7Xm7SrUWCxvJMQ==
@@ -2926,9 +2927,9 @@
   integrity sha512-dcyqhDvX1C46lXZcVqCpK+FtMRQVdIMN6/Df5js2zouUsqG7I6sFxitIC+7KYK29KdXOLHdu9zL4sFnoVQnqaA==
 
 ignore@^5.2.0:
-  version "5.2.1"
-  resolved "https://registry.yarnpkg.com/ignore/-/ignore-5.2.1.tgz#c2b1f76cb999ede1502f3a226a9310fdfe88d46c"
-  integrity sha512-d2qQLzTJ9WxQftPAuEQpSPmKqzxePjzVbpAVv62AQ64NTL+wR4JkrVqR/LqFsFEUsHDAiId52mJteHDFuDkElA==
+  version "5.2.4"
+  resolved "https://registry.yarnpkg.com/ignore/-/ignore-5.2.4.tgz#a291c0c6178ff1b960befe47fcdec301674a6324"
+  integrity sha512-MAb38BcSbH0eHNBxn7ql2NH/kX33OkB3lZ1BNdh7ENeRChHTYsTvWrMubiIAMNS2llXEEgZ1MUOBtXChP3kaFQ==
 
 import-fresh@^3.0.0, import-fresh@^3.2.1:
   version "3.3.0"
@@ -3136,9 +3137,9 @@
   integrity sha512-ZClg6AaYvamvYEE82d3Iyd3vSSIjQ+odgjaTzRuO3s7toCdFKczob2i0zCh7JE8kWn17yvAWhUVxvqGwUalsRA==
 
 json5@^2.2.1:
-  version "2.2.1"
-  resolved "https://registry.yarnpkg.com/json5/-/json5-2.2.1.tgz#655d50ed1e6f95ad1a3caababd2b0efda10b395c"
-  integrity sha512-1hqLFMSrGHRHxav9q9gNjJ5EXznIxGVO09xQRrwplcS8qs28pZ8s8hupZAmqDwZUmVZ2Qb2jnyPOWcDH8m8dlA==
+  version "2.2.2"
+  resolved "https://registry.yarnpkg.com/json5/-/json5-2.2.2.tgz#64471c5bdcc564c18f7c1d4df2e2297f2457c5ab"
+  integrity sha512-46Tk9JiOL2z7ytNQWFLpj99RZkVgeHf87yGQKsIkaPz1qSH9UczKH1rO7K3wgRselo0tYMUNfecYpm/p1vC7tQ==
 
 jsonfile@^4.0.0:
   version "4.0.0"
@@ -3236,6 +3237,13 @@
   resolved "https://registry.yarnpkg.com/lowercase-keys/-/lowercase-keys-3.0.0.tgz#c5e7d442e37ead247ae9db117a9d0a467c89d4f2"
   integrity sha512-ozCC6gdQ+glXOQsveKD0YsDy8DSQFjDTz4zyzEHNV5+JP5D62LmfDZ6o1cycFx9ouG940M5dE8C8CTewdj2YWQ==
 
+lru-cache@^5.1.1:
+  version "5.1.1"
+  resolved "https://registry.yarnpkg.com/lru-cache/-/lru-cache-5.1.1.tgz#1da27e6710271947695daf6848e847f01d84b920"
+  integrity sha512-KpNARQA3Iwv+jTA0utUVVbrh+Jlrr1Fv0e56GGzAFOXN7dk/FviaDW8LHmK52DlcH4WP2n6gI8vN1aesBFgo9w==
+  dependencies:
+    yallist "^3.0.2"
+
 lru-cache@^6.0.0:
   version "6.0.0"
   resolved "https://registry.yarnpkg.com/lru-cache/-/lru-cache-6.0.0.tgz#6d6fe6570ebd96aaf90fcad1dafa3b2566db3a94"
@@ -3572,9 +3580,9 @@
   integrity sha512-2iGbaQBV+ITgCz76ZEjmhUKAKVf7xfY1sRl4UiKQspfZMH2h06SyhNsnSVy50cwkFQDGLyif6m/6uFXHkOZ6rg==
 
 node-releases@^2.0.6:
-  version "2.0.7"
-  resolved "https://registry.yarnpkg.com/node-releases/-/node-releases-2.0.7.tgz#593edbc7c22860ee4d32d3933cfebdfab0c0e0e5"
-  integrity sha512-EJ3rzxL9pTWPjk5arA0s0dgXpnyiAbJDE6wHT62g7VsgrgQgmmZ+Ru++M1BFofncWja+Pnn3rEr3fieRySAdKQ==
+  version "2.0.8"
+  resolved "https://registry.yarnpkg.com/node-releases/-/node-releases-2.0.8.tgz#0f349cdc8fcfa39a92ac0be9bc48b7706292b9ae"
+  integrity sha512-dFSmB8fFHEH/s81Xi+Y/15DQY6VHW81nXRj86EMSL3lmuTmK1e+aT4wrFCkTbm+gSwkw4KpX+rT/pMM2c1mF+A==
 
 normalize-path@^3.0.0, normalize-path@~3.0.0:
   version "3.0.0"
@@ -4033,10 +4041,10 @@
   dependencies:
     queue-microtask "^1.2.2"
 
-rxjs@^7.5.7:
-  version "7.6.0"
-  resolved "https://registry.yarnpkg.com/rxjs/-/rxjs-7.6.0.tgz#361da5362b6ddaa691a2de0b4f2d32028f1eb5a2"
-  integrity sha512-DDa7d8TFNUalGC9VqXvQ1euWNN7sc63TrUCuM9J998+ViviahMIjKSOU7rfcgFOF+FCD71BhDRv4hrFz+ImDLQ==
+rxjs@^7.6.0:
+  version "7.8.0"
+  resolved "https://registry.yarnpkg.com/rxjs/-/rxjs-7.8.0.tgz#90a938862a82888ff4c7359811a595e14e1e09a4"
+  integrity sha512-F2+gxDshqmIub1KdvZkaEfGDwLNpPvk9Fs6LD/MyQxNgMds/WH9OdDDXOmxUZpME+iSK3rQCctkL0DYyytUqMg==
   dependencies:
     tslib "^2.1.0"
 
@@ -4956,7 +4964,7 @@
   resolved "https://registry.yarnpkg.com/yaeti/-/yaeti-0.0.6.tgz#f26f484d72684cf42bedfb76970aa1608fbf9577"
   integrity sha512-MvQa//+KcZCUkBTIC9blM+CU9J2GzuTytsOUwf2lidtvkx/6gnEp1QvJv34t9vdjhFmha/mUiNDbN0D0mJWdug==
 
-yallist@^3.0.0, yallist@^3.1.1:
+yallist@^3.0.0, yallist@^3.0.2, yallist@^3.1.1:
   version "3.1.1"
   resolved "https://registry.yarnpkg.com/yallist/-/yallist-3.1.1.tgz#dbb7daf9bfd8bac9ab45ebf602b8cbad0d5d08fd"
   integrity sha512-a4UGQaWPH59mOXUYnAG2ewncQS4i4F43Tv3JoAM+s2VDAmS9NsK8GpDMLrCHPksFT7h3K6TOoUNn2pb7RoXx4g==