git.delta.rocks / unique-network / refs/commits / 66503d98270f

difftreelog

CORE-324 Use CrossAccountId in Runner::call

Trubnikov Sergey2022-03-29parent: #b52611d.patch.diff
in: master

17 files changed

modifiedruntime/common/src/runtime_apis.rsdiffbeforeafterboth
--- a/runtime/common/src/runtime_apis.rs
+++ b/runtime/common/src/runtime_apis.rs
@@ -181,7 +181,7 @@
                     };
 
                     <Runtime as pallet_evm::Config>::Runner::call(
-                        from,
+                        CrossAccountId::from_eth(from),
                         to,
                         data,
                         value,
@@ -215,7 +215,7 @@
                     };
 
                     <Runtime as pallet_evm::Config>::Runner::create(
-                        from,
+                        CrossAccountId::from_eth(from),
                         data,
                         value,
                         gas_limit.low_u64(),
modifiedruntime/opal/src/lib.rsdiffbeforeafterboth
before · runtime/opal/src/lib.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//! The Substrate Node Template runtime. This can be compiled with `#[no_std]`, ready for Wasm.1819#![cfg_attr(not(feature = "std"), no_std)]20// `construct_runtime!` does a lot of recursion and requires us to increase the limit to 256.21#![recursion_limit = "1024"]22#![allow(clippy::from_over_into, clippy::identity_op)]23#![allow(clippy::fn_to_numeric_cast_with_truncation)]24// Make the WASM binary available.25#[cfg(feature = "std")]26include!(concat!(env!("OUT_DIR"), "/wasm_binary.rs"));2728use sp_api::impl_runtime_apis;29use sp_core::{crypto::KeyTypeId, OpaqueMetadata, H256, U256, H160};30use sp_runtime::DispatchError;31// #[cfg(any(feature = "std", test))]32// pub use sp_runtime::BuildStorage;3334use sp_runtime::{35	Permill, Perbill, Percent, create_runtime_str, generic, impl_opaque_keys,36	traits::{AccountIdLookup, BlakeTwo256, Block as BlockT, AccountIdConversion, Zero},37	transaction_validity::{TransactionSource, TransactionValidity},38	ApplyExtrinsicResult, RuntimeAppPublic,39};4041use sp_std::prelude::*;4243#[cfg(feature = "std")]44use sp_version::NativeVersion;45use sp_version::RuntimeVersion;46pub use pallet_transaction_payment::{47	Multiplier, TargetedFeeAdjustment, FeeDetails, RuntimeDispatchInfo,48};49// A few exports that help ease life for downstream crates.50pub use pallet_balances::Call as BalancesCall;51pub use pallet_evm::{EnsureAddressTruncated, HashedAddressMapping, Runner};52pub use frame_support::{53	construct_runtime, match_type,54	dispatch::DispatchResult,55	PalletId, parameter_types, StorageValue, ConsensusEngineId,56	traits::{57		tokens::currency::Currency as CurrencyT, OnUnbalanced as OnUnbalancedT, Everything,58		Currency, ExistenceRequirement, Get, IsInVec, KeyOwnerProofSystem, LockIdentifier,59		OnUnbalanced, Randomness, FindAuthor,60	},61	weights::{62		constants::{BlockExecutionWeight, ExtrinsicBaseWeight, RocksDbWeight, WEIGHT_PER_SECOND},63		DispatchClass, DispatchInfo, GetDispatchInfo, IdentityFee, Pays, PostDispatchInfo, Weight,64		WeightToFeePolynomial, WeightToFeeCoefficient, WeightToFeeCoefficients,65	},66};67use up_data_structs::*;68// use pallet_contracts::weights::WeightInfo;69// #[cfg(any(feature = "std", test))]70use frame_system::{71	self as frame_system, EnsureRoot, EnsureSigned,72	limits::{BlockWeights, BlockLength},73};74use sp_arithmetic::{75	traits::{BaseArithmetic, Unsigned},76};77use smallvec::smallvec;78use codec::{Encode, Decode};79use pallet_evm::{Account as EVMAccount, FeeCalculator, GasWeightMapping, OnMethodCall};80use fp_rpc::TransactionStatus;81use sp_runtime::{82	traits::{BlockNumberProvider, Dispatchable, PostDispatchInfoOf, Saturating},83	transaction_validity::TransactionValidityError,84	SaturatedConversion,85};8687// pub use pallet_timestamp::Call as TimestampCall;88pub use sp_consensus_aura::sr25519::AuthorityId as AuraId;8990// Polkadot imports91use pallet_xcm::XcmPassthrough;92use polkadot_parachain::primitives::Sibling;93use xcm::v1::{BodyId, Junction::*, MultiLocation, NetworkId, Junctions::*};94use xcm_builder::{95	AccountId32Aliases, AllowTopLevelPaidExecutionFrom, AllowUnpaidExecutionFrom, CurrencyAdapter,96	EnsureXcmOrigin, FixedWeightBounds, LocationInverter, NativeAsset, ParentAsSuperuser,97	RelayChainAsNative, SiblingParachainAsNative, SiblingParachainConvertsVia,98	SignedAccountId32AsNative, SignedToAccountId32, SovereignSignedViaLocation, TakeWeightCredit,99	ParentIsPreset,100};101use xcm_executor::{Config, XcmExecutor, Assets};102use sp_std::{marker::PhantomData};103104use xcm::latest::{105	//	Xcm,106	AssetId::{Concrete},107	Fungibility::Fungible as XcmFungible,108	MultiAsset,109	Error as XcmError,110};111use xcm_executor::traits::{MatchesFungible, WeightTrader};112//use xcm_executor::traits::MatchesFungible;113use sp_runtime::traits::CheckedConversion;114115use unique_runtime_common::{impl_common_runtime_apis, types::*, constants::*};116117pub const RUNTIME_NAME: &str = "Opal";118119type CrossAccountId = pallet_evm::account::BasicCrossAccountId<Runtime>;120121impl RuntimeInstance for Runtime {122	type CrossAccountId = self::CrossAccountId;123	type TransactionConverter = self::TransactionConverter;124125	fn get_transaction_converter() -> TransactionConverter {126		TransactionConverter127	}128}129130/// The type for looking up accounts. We don't expect more than 4 billion of them, but you131/// never know...132pub type AccountIndex = u32;133134/// Balance of an account.135pub type Balance = u128;136137/// Index of a transaction in the chain.138pub type Index = u32;139140/// A hash of some data used by the chain.141pub type Hash = sp_core::H256;142143/// Digest item type.144pub type DigestItem = generic::DigestItem;145146/// Opaque types. These are used by the CLI to instantiate machinery that don't need to know147/// the specifics of the runtime. They can then be made to be agnostic over specific formats148/// of data like extrinsics, allowing for them to continue syncing the network through upgrades149/// to even the core data structures.150pub mod opaque {151	use sp_std::prelude::*;152	use sp_runtime::impl_opaque_keys;153	use super::Aura;154155	pub use unique_runtime_common::types::*;156157	impl_opaque_keys! {158		pub struct SessionKeys {159			pub aura: Aura,160		}161	}162}163164/// This runtime version.165pub const VERSION: RuntimeVersion = RuntimeVersion {166	spec_name: create_runtime_str!(RUNTIME_NAME),167	impl_name: create_runtime_str!(RUNTIME_NAME),168	authoring_version: 1,169	spec_version: 917004,170	impl_version: 0,171	apis: RUNTIME_API_VERSIONS,172	transaction_version: 1,173	state_version: 0,174};175176#[derive(codec::Encode, codec::Decode)]177pub enum XCMPMessage<XAccountId, XBalance> {178	/// Transfer tokens to the given account from the Parachain account.179	TransferToken(XAccountId, XBalance),180}181182/// The version information used to identify this runtime when compiled natively.183#[cfg(feature = "std")]184pub fn native_version() -> NativeVersion {185	NativeVersion {186		runtime_version: VERSION,187		can_author_with: Default::default(),188	}189}190191type NegativeImbalance = <Balances as Currency<AccountId>>::NegativeImbalance;192193pub struct DealWithFees;194impl OnUnbalanced<NegativeImbalance> for DealWithFees {195	fn on_unbalanceds<B>(mut fees_then_tips: impl Iterator<Item = NegativeImbalance>) {196		if let Some(fees) = fees_then_tips.next() {197			// for fees, 100% to treasury198			let mut split = fees.ration(100, 0);199			if let Some(tips) = fees_then_tips.next() {200				// for tips, if any, 100% to treasury201				tips.ration_merge_into(100, 0, &mut split);202			}203			Treasury::on_unbalanced(split.0);204			// Author::on_unbalanced(split.1);205		}206	}207}208209parameter_types! {210	pub const BlockHashCount: BlockNumber = 2400;211	pub RuntimeBlockLength: BlockLength =212		BlockLength::max_with_normal_ratio(5 * 1024 * 1024, NORMAL_DISPATCH_RATIO);213	pub const AvailableBlockRatio: Perbill = Perbill::from_percent(75);214	pub const MaximumBlockLength: u32 = 5 * 1024 * 1024;215	pub RuntimeBlockWeights: BlockWeights = BlockWeights::builder()216		.base_block(BlockExecutionWeight::get())217		.for_class(DispatchClass::all(), |weights| {218			weights.base_extrinsic = ExtrinsicBaseWeight::get();219		})220		.for_class(DispatchClass::Normal, |weights| {221			weights.max_total = Some(NORMAL_DISPATCH_RATIO * MAXIMUM_BLOCK_WEIGHT);222		})223		.for_class(DispatchClass::Operational, |weights| {224			weights.max_total = Some(MAXIMUM_BLOCK_WEIGHT);225			// Operational transactions have some extra reserved space, so that they226			// are included even if block reached `MAXIMUM_BLOCK_WEIGHT`.227			weights.reserved = Some(228				MAXIMUM_BLOCK_WEIGHT - NORMAL_DISPATCH_RATIO * MAXIMUM_BLOCK_WEIGHT229			);230		})231		.avg_block_initialization(AVERAGE_ON_INITIALIZE_RATIO)232		.build_or_panic();233	pub const Version: RuntimeVersion = VERSION;234	pub const SS58Prefix: u8 = 42;235}236237parameter_types! {238	pub const ChainId: u64 = 8882;239}240241pub struct FixedFee;242impl FeeCalculator for FixedFee {243	fn min_gas_price() -> U256 {244		MIN_GAS_PRICE.into()245	}246}247248// Assuming slowest ethereum opcode is SSTORE, with gas price of 20000 as our worst case249// (contract, which only writes a lot of data),250// approximating on top of our real store write weight251parameter_types! {252	pub const WritesPerSecond: u64 = WEIGHT_PER_SECOND / <Runtime as frame_system::Config>::DbWeight::get().write;253	pub const GasPerSecond: u64 = WritesPerSecond::get() * 20000;254	pub const WeightPerGas: u64 = WEIGHT_PER_SECOND / GasPerSecond::get();255}256257/// Limiting EVM execution to 50% of block for substrate users and management tasks258/// EVM transaction consumes more weight than substrate's, so we can't rely on them being259/// scheduled fairly260const EVM_DISPATCH_RATIO: Perbill = Perbill::from_percent(50);261parameter_types! {262	pub BlockGasLimit: U256 = U256::from(NORMAL_DISPATCH_RATIO * EVM_DISPATCH_RATIO * MAXIMUM_BLOCK_WEIGHT / WeightPerGas::get());263}264265pub enum FixedGasWeightMapping {}266impl GasWeightMapping for FixedGasWeightMapping {267	fn gas_to_weight(gas: u64) -> Weight {268		gas.saturating_mul(WeightPerGas::get())269	}270	fn weight_to_gas(weight: Weight) -> u64 {271		weight / WeightPerGas::get()272	}273}274275impl pallet_evm::account::Config for Runtime {276	type CrossAccountId = pallet_evm::account::BasicCrossAccountId<Self>;277	type EvmAddressMapping = pallet_evm::HashedAddressMapping<Self::Hashing>;278	type EvmBackwardsAddressMapping = fp_evm_mapping::MapBackwardsAddressTruncated;279}280281impl pallet_evm::Config for Runtime {282	type BlockGasLimit = BlockGasLimit;283	type FeeCalculator = FixedFee;284	type GasWeightMapping = FixedGasWeightMapping;285	type BlockHashMapping = pallet_ethereum::EthereumBlockHashMapping<Self>;286	type CallOrigin = EnsureAddressTruncated;287	type WithdrawOrigin = EnsureAddressTruncated;288	type AddressMapping = HashedAddressMapping<Self::Hashing>;289	type PrecompilesType = ();290	type PrecompilesValue = ();291	type Currency = Balances;292	type Event = Event;293	type OnMethodCall = (294		pallet_evm_migration::OnMethodCall<Self>,295		pallet_unique::UniqueErcSupport<Self>,296		pallet_evm_contract_helpers::HelpersOnMethodCall<Self>,297	);298	type OnCreate = pallet_evm_contract_helpers::HelpersOnCreate<Self>;299	type ChainId = ChainId;300	type Runner = pallet_evm::runner::stack::Runner<Self>;301	type OnChargeTransaction = pallet_evm_transaction_payment::OnChargeTransaction<Self>;302	type TransactionValidityHack = pallet_evm_transaction_payment::TransactionValidityHack<Self>;303	type FindAuthor = EthereumFindAuthor<Aura>;304}305306impl pallet_evm_migration::Config for Runtime {307	type WeightInfo = pallet_evm_migration::weights::SubstrateWeight<Self>;308}309310pub struct EthereumFindAuthor<F>(core::marker::PhantomData<F>);311impl<F: FindAuthor<u32>> FindAuthor<H160> for EthereumFindAuthor<F> {312	fn find_author<'a, I>(digests: I) -> Option<H160>313	where314		I: 'a + IntoIterator<Item = (ConsensusEngineId, &'a [u8])>,315	{316		if let Some(author_index) = F::find_author(digests) {317			let authority_id = Aura::authorities()[author_index as usize].clone();318			return Some(H160::from_slice(&authority_id.to_raw_vec()[4..24]));319		}320		None321	}322}323324impl pallet_ethereum::Config for Runtime {325	type Event = Event;326	type StateRoot = pallet_ethereum::IntermediateStateRoot;327}328329impl pallet_randomness_collective_flip::Config for Runtime {}330331impl frame_system::Config for Runtime {332	/// The data to be stored in an account.333	type AccountData = pallet_balances::AccountData<Balance>;334	/// The identifier used to distinguish between accounts.335	type AccountId = AccountId;336	/// The basic call filter to use in dispatchable.337	type BaseCallFilter = Everything;338	/// Maximum number of block number to block hash mappings to keep (oldest pruned first).339	type BlockHashCount = BlockHashCount;340	/// The maximum length of a block (in bytes).341	type BlockLength = RuntimeBlockLength;342	/// The index type for blocks.343	type BlockNumber = BlockNumber;344	/// The weight of the overhead invoked on the block import process, independent of the extrinsics included in that block.345	type BlockWeights = RuntimeBlockWeights;346	/// The aggregated dispatch type that is available for extrinsics.347	type Call = Call;348	/// The weight of database operations that the runtime can invoke.349	type DbWeight = RocksDbWeight;350	/// The ubiquitous event type.351	type Event = Event;352	/// The type for hashing blocks and tries.353	type Hash = Hash;354	/// The hashing algorithm used.355	type Hashing = BlakeTwo256;356	/// The header type.357	type Header = generic::Header<BlockNumber, BlakeTwo256>;358	/// The index type for storing how many extrinsics an account has signed.359	type Index = Index;360	/// The lookup mechanism to get account ID from whatever is passed in dispatchers.361	type Lookup = AccountIdLookup<AccountId, ()>;362	/// What to do if an account is fully reaped from the system.363	type OnKilledAccount = ();364	/// What to do if a new account is created.365	type OnNewAccount = ();366	type OnSetCode = cumulus_pallet_parachain_system::ParachainSetCode<Self>;367	/// The ubiquitous origin type.368	type Origin = Origin;369	/// This type is being generated by `construct_runtime!`.370	type PalletInfo = PalletInfo;371	/// This is used as an identifier of the chain. 42 is the generic substrate prefix.372	type SS58Prefix = SS58Prefix;373	/// Weight information for the extrinsics of this pallet.374	type SystemWeightInfo = frame_system::weights::SubstrateWeight<Self>;375	/// Version of the runtime.376	type Version = Version;377	type MaxConsumers = ConstU32<16>;378}379380parameter_types! {381	pub const MinimumPeriod: u64 = SLOT_DURATION / 2;382}383384impl pallet_timestamp::Config for Runtime {385	/// A timestamp: milliseconds since the unix epoch.386	type Moment = u64;387	type OnTimestampSet = ();388	type MinimumPeriod = MinimumPeriod;389	type WeightInfo = ();390}391392parameter_types! {393	// pub const ExistentialDeposit: u128 = 500;394	pub const ExistentialDeposit: u128 = 0;395	pub const MaxLocks: u32 = 50;396}397398impl pallet_balances::Config for Runtime {399	type MaxLocks = MaxLocks;400	type MaxReserves = ();401	type ReserveIdentifier = [u8; 8];402	/// The type for recording an account's balance.403	type Balance = Balance;404	/// The ubiquitous event type.405	type Event = Event;406	type DustRemoval = Treasury;407	type ExistentialDeposit = ExistentialDeposit;408	type AccountStore = System;409	type WeightInfo = pallet_balances::weights::SubstrateWeight<Self>;410}411412pub const fn deposit(items: u32, bytes: u32) -> Balance {413	items as Balance * 15 * CENTIUNIQUE + (bytes as Balance) * 6 * CENTIUNIQUE414}415416/*417parameter_types! {418	pub TombstoneDeposit: Balance = deposit(419		1,420		sp_std::mem::size_of::<pallet_contracts::Pallet<Runtime>> as u32,421	);422	pub DepositPerContract: Balance = TombstoneDeposit::get();423	pub const DepositPerStorageByte: Balance = deposit(0, 1);424	pub const DepositPerStorageItem: Balance = deposit(1, 0);425	pub RentFraction: Perbill = Perbill::from_rational(1u32, 30 * DAYS);426	pub const SurchargeReward: Balance = 150 * MILLIUNIQUE;427	pub const SignedClaimHandicap: u32 = 2;428	pub const MaxDepth: u32 = 32;429	pub const MaxValueSize: u32 = 16 * 1024;430	pub const MaxCodeSize: u32 = 1024 * 1024 * 25; // 25 Mb431	// The lazy deletion runs inside on_initialize.432	pub DeletionWeightLimit: Weight = AVERAGE_ON_INITIALIZE_RATIO *433		RuntimeBlockWeights::get().max_block;434	// The weight needed for decoding the queue should be less or equal than a fifth435	// of the overall weight dedicated to the lazy deletion.436	pub DeletionQueueDepth: u32 = ((DeletionWeightLimit::get() / (437			<Runtime as pallet_contracts::Config>::WeightInfo::on_initialize_per_queue_item(1) -438			<Runtime as pallet_contracts::Config>::WeightInfo::on_initialize_per_queue_item(0)439		)) / 5) as u32;440	pub Schedule: pallet_contracts::Schedule<Runtime> = Default::default();441}442443impl pallet_contracts::Config for Runtime {444	type Time = Timestamp;445	type Randomness = RandomnessCollectiveFlip;446	type Currency = Balances;447	type Event = Event;448	type RentPayment = ();449	type SignedClaimHandicap = SignedClaimHandicap;450	type TombstoneDeposit = TombstoneDeposit;451	type DepositPerContract = DepositPerContract;452	type DepositPerStorageByte = DepositPerStorageByte;453	type DepositPerStorageItem = DepositPerStorageItem;454	type RentFraction = RentFraction;455	type SurchargeReward = SurchargeReward;456	type WeightPrice = pallet_transaction_payment::Pallet<Self>;457	type WeightInfo = pallet_contracts::weights::SubstrateWeight<Self>;458	type ChainExtension = NFTExtension;459	type DeletionQueueDepth = DeletionQueueDepth;460	type DeletionWeightLimit = DeletionWeightLimit;461	type Schedule = Schedule;462	type CallStack = [pallet_contracts::Frame<Self>; 31];463}464*/465466parameter_types! {467	/// This value increases the priority of `Operational` transactions by adding468	/// a "virtual tip" that's equal to the `OperationalFeeMultiplier * final_fee`.469	pub const OperationalFeeMultiplier: u8 = 5;470}471472/// Linear implementor of `WeightToFeePolynomial`473pub struct LinearFee<T>(sp_std::marker::PhantomData<T>);474475impl<T> WeightToFeePolynomial for LinearFee<T>476where477	T: BaseArithmetic + From<u32> + Copy + Unsigned,478{479	type Balance = T;480481	fn polynomial() -> WeightToFeeCoefficients<Self::Balance> {482		smallvec!(WeightToFeeCoefficient {483			// Targeting 0.1 Unique per NFT transfer484			coeff_integer: WEIGHT_TO_FEE_COEFF.into(),485			coeff_frac: Perbill::zero(),486			negative: false,487			degree: 1,488		})489	}490}491492impl pallet_transaction_payment::Config for Runtime {493	type OnChargeTransaction = pallet_transaction_payment::CurrencyAdapter<Balances, DealWithFees>;494	type TransactionByteFee = TransactionByteFee;495	type OperationalFeeMultiplier = OperationalFeeMultiplier;496	type WeightToFee = LinearFee<Balance>;497	type FeeMultiplierUpdate = ();498}499500parameter_types! {501	pub const ProposalBond: Permill = Permill::from_percent(5);502	pub const ProposalBondMinimum: Balance = 1 * UNIQUE;503	pub const ProposalBondMaximum: Balance = 1000 * UNIQUE;504	pub const SpendPeriod: BlockNumber = 5 * MINUTES;505	pub const Burn: Permill = Permill::from_percent(0);506	pub const TipCountdown: BlockNumber = 1 * DAYS;507	pub const TipFindersFee: Percent = Percent::from_percent(20);508	pub const TipReportDepositBase: Balance = 1 * UNIQUE;509	pub const DataDepositPerByte: Balance = 1 * CENTIUNIQUE;510	pub const BountyDepositBase: Balance = 1 * UNIQUE;511	pub const BountyDepositPayoutDelay: BlockNumber = 1 * DAYS;512	pub const TreasuryModuleId: PalletId = PalletId(*b"py/trsry");513	pub const BountyUpdatePeriod: BlockNumber = 14 * DAYS;514	pub const MaximumReasonLength: u32 = 16384;515	pub const BountyCuratorDeposit: Permill = Permill::from_percent(50);516	pub const BountyValueMinimum: Balance = 5 * UNIQUE;517	pub const MaxApprovals: u32 = 100;518}519520impl pallet_treasury::Config for Runtime {521	type PalletId = TreasuryModuleId;522	type Currency = Balances;523	type ApproveOrigin = EnsureRoot<AccountId>;524	type RejectOrigin = EnsureRoot<AccountId>;525	type Event = Event;526	type OnSlash = ();527	type ProposalBond = ProposalBond;528	type ProposalBondMinimum = ProposalBondMinimum;529	type ProposalBondMaximum = ProposalBondMaximum;530	type SpendPeriod = SpendPeriod;531	type Burn = Burn;532	type BurnDestination = ();533	type SpendFunds = ();534	type WeightInfo = pallet_treasury::weights::SubstrateWeight<Self>;535	type MaxApprovals = MaxApprovals;536}537538impl pallet_sudo::Config for Runtime {539	type Event = Event;540	type Call = Call;541}542543pub struct RelayChainBlockNumberProvider<T>(sp_std::marker::PhantomData<T>);544545impl<T: cumulus_pallet_parachain_system::Config> BlockNumberProvider546	for RelayChainBlockNumberProvider<T>547{548	type BlockNumber = BlockNumber;549550	fn current_block_number() -> Self::BlockNumber {551		cumulus_pallet_parachain_system::Pallet::<T>::validation_data()552			.map(|d| d.relay_parent_number)553			.unwrap_or_default()554	}555}556557parameter_types! {558	pub const MinVestedTransfer: Balance = 10 * UNIQUE;559	pub const MaxVestingSchedules: u32 = 28;560}561562impl orml_vesting::Config for Runtime {563	type Event = Event;564	type Currency = pallet_balances::Pallet<Runtime>;565	type MinVestedTransfer = MinVestedTransfer;566	type VestedTransferOrigin = EnsureSigned<AccountId>;567	type WeightInfo = ();568	type MaxVestingSchedules = MaxVestingSchedules;569	type BlockNumberProvider = RelayChainBlockNumberProvider<Runtime>;570}571572parameter_types! {573	pub const ReservedDmpWeight: Weight = MAXIMUM_BLOCK_WEIGHT / 4;574	pub const ReservedXcmpWeight: Weight = MAXIMUM_BLOCK_WEIGHT / 4;575}576577impl cumulus_pallet_parachain_system::Config for Runtime {578	type Event = Event;579	type SelfParaId = parachain_info::Pallet<Self>;580	type OnSystemEvent = ();581	// type DownwardMessageHandlers = cumulus_primitives_utility::UnqueuedDmpAsParent<582	// 	MaxDownwardMessageWeight,583	// 	XcmExecutor<XcmConfig>,584	// 	Call,585	// >;586	type OutboundXcmpMessageSource = XcmpQueue;587	type DmpMessageHandler = DmpQueue;588	type ReservedDmpWeight = ReservedDmpWeight;589	type ReservedXcmpWeight = ReservedXcmpWeight;590	type XcmpMessageHandler = XcmpQueue;591}592593impl parachain_info::Config for Runtime {}594595impl cumulus_pallet_aura_ext::Config for Runtime {}596597parameter_types! {598	pub const RelayLocation: MultiLocation = MultiLocation::parent();599	pub const RelayNetwork: NetworkId = NetworkId::Polkadot;600	pub RelayOrigin: Origin = cumulus_pallet_xcm::Origin::Relay.into();601	pub Ancestry: MultiLocation = Parachain(ParachainInfo::parachain_id().into()).into();602}603604/// Type for specifying how a `MultiLocation` can be converted into an `AccountId`. This is used605/// when determining ownership of accounts for asset transacting and when attempting to use XCM606/// `Transact` in order to determine the dispatch Origin.607pub type LocationToAccountId = (608	// The parent (Relay-chain) origin converts to the default `AccountId`.609	ParentIsPreset<AccountId>,610	// Sibling parachain origins convert to AccountId via the `ParaId::into`.611	SiblingParachainConvertsVia<Sibling, AccountId>,612	// Straight up local `AccountId32` origins just alias directly to `AccountId`.613	AccountId32Aliases<RelayNetwork, AccountId>,614);615616pub struct OnlySelfCurrency;617impl<B: TryFrom<u128>> MatchesFungible<B> for OnlySelfCurrency {618	fn matches_fungible(a: &MultiAsset) -> Option<B> {619		match (&a.id, &a.fun) {620			(Concrete(_), XcmFungible(ref amount)) => CheckedConversion::checked_from(*amount),621			_ => None,622		}623	}624}625626/// Means for transacting assets on this chain.627pub type LocalAssetTransactor = CurrencyAdapter<628	// Use this currency:629	Balances,630	// Use this currency when it is a fungible asset matching the given location or name:631	OnlySelfCurrency,632	// Do a simple punn to convert an AccountId32 MultiLocation into a native chain account ID:633	LocationToAccountId,634	// Our chain's account ID type (we can't get away without mentioning it explicitly):635	AccountId,636	// We don't track any teleports.637	(),638>;639640/// This is the type we use to convert an (incoming) XCM origin into a local `Origin` instance,641/// ready for dispatching a transaction with Xcm's `Transact`. There is an `OriginKind` which can642/// biases the kind of local `Origin` it will become.643pub type XcmOriginToTransactDispatchOrigin = (644	// Sovereign account converter; this attempts to derive an `AccountId` from the origin location645	// using `LocationToAccountId` and then turn that into the usual `Signed` origin. Useful for646	// foreign chains who want to have a local sovereign account on this chain which they control.647	SovereignSignedViaLocation<LocationToAccountId, Origin>,648	// Native converter for Relay-chain (Parent) location; will converts to a `Relay` origin when649	// recognised.650	RelayChainAsNative<RelayOrigin, Origin>,651	// Native converter for sibling Parachains; will convert to a `SiblingPara` origin when652	// recognised.653	SiblingParachainAsNative<cumulus_pallet_xcm::Origin, Origin>,654	// Superuser converter for the Relay-chain (Parent) location. This will allow it to issue a655	// transaction from the Root origin.656	ParentAsSuperuser<Origin>,657	// Native signed account converter; this just converts an `AccountId32` origin into a normal658	// `Origin::Signed` origin of the same 32-byte value.659	SignedAccountId32AsNative<RelayNetwork, Origin>,660	// Xcm origins can be represented natively under the Xcm pallet's Xcm origin.661	XcmPassthrough<Origin>,662);663664parameter_types! {665	// One XCM operation is 1_000_000 weight - almost certainly a conservative estimate.666	pub UnitWeightCost: Weight = 1_000_000;667	// 1200 UNIQUEs buy 1 second of weight.668	pub const WeightPrice: (MultiLocation, u128) = (MultiLocation::parent(), 1_200 * UNIQUE);669	pub const MaxInstructions: u32 = 100;670	pub const MaxAuthorities: u32 = 100_000;671}672673match_type! {674	pub type ParentOrParentsUnitPlurality: impl Contains<MultiLocation> = {675		MultiLocation { parents: 1, interior: Here } |676		MultiLocation { parents: 1, interior: X1(Plurality { id: BodyId::Unit, .. }) }677	};678}679680pub type Barrier = (681	TakeWeightCredit,682	AllowTopLevelPaidExecutionFrom<Everything>,683	AllowUnpaidExecutionFrom<ParentOrParentsUnitPlurality>,684	// ^^^ Parent & its unit plurality gets free execution685);686687pub struct UsingOnlySelfCurrencyComponents<688	WeightToFee: WeightToFeePolynomial<Balance = Currency::Balance>,689	AssetId: Get<MultiLocation>,690	AccountId,691	Currency: CurrencyT<AccountId>,692	OnUnbalanced: OnUnbalancedT<Currency::NegativeImbalance>,693>(694	Weight,695	Currency::Balance,696	PhantomData<(WeightToFee, AssetId, AccountId, Currency, OnUnbalanced)>,697);698impl<699		WeightToFee: WeightToFeePolynomial<Balance = Currency::Balance>,700		AssetId: Get<MultiLocation>,701		AccountId,702		Currency: CurrencyT<AccountId>,703		OnUnbalanced: OnUnbalancedT<Currency::NegativeImbalance>,704	> WeightTrader705	for UsingOnlySelfCurrencyComponents<WeightToFee, AssetId, AccountId, Currency, OnUnbalanced>706{707	fn new() -> Self {708		Self(0, Zero::zero(), PhantomData)709	}710711	fn buy_weight(&mut self, weight: Weight, payment: Assets) -> Result<Assets, XcmError> {712		let amount = WeightToFee::calc(&weight);713		let u128_amount: u128 = amount.try_into().map_err(|_| XcmError::Overflow)?;714715		// location to this parachain through relay chain716		let option1: xcm::v1::AssetId = Concrete(MultiLocation {717			parents: 1,718			interior: X1(Parachain(ParachainInfo::parachain_id().into())),719		});720		// direct location721		let option2: xcm::v1::AssetId = Concrete(MultiLocation {722			parents: 0,723			interior: Here,724		});725726		let required = if payment.fungible.contains_key(&option1) {727			(option1, u128_amount).into()728		} else if payment.fungible.contains_key(&option2) {729			(option2, u128_amount).into()730		} else {731			(Concrete(MultiLocation::default()), u128_amount).into()732		};733734		let unused = payment735			.checked_sub(required)736			.map_err(|_| XcmError::TooExpensive)?;737		self.0 = self.0.saturating_add(weight);738		self.1 = self.1.saturating_add(amount);739		Ok(unused)740	}741742	fn refund_weight(&mut self, weight: Weight) -> Option<MultiAsset> {743		let weight = weight.min(self.0);744		let amount = WeightToFee::calc(&weight);745		self.0 -= weight;746		self.1 = self.1.saturating_sub(amount);747		let amount: u128 = amount.saturated_into();748		if amount > 0 {749			Some((AssetId::get(), amount).into())750		} else {751			None752		}753	}754}755impl<756		WeightToFee: WeightToFeePolynomial<Balance = Currency::Balance>,757		AssetId: Get<MultiLocation>,758		AccountId,759		Currency: CurrencyT<AccountId>,760		OnUnbalanced: OnUnbalancedT<Currency::NegativeImbalance>,761	> Drop762	for UsingOnlySelfCurrencyComponents<WeightToFee, AssetId, AccountId, Currency, OnUnbalanced>763{764	fn drop(&mut self) {765		OnUnbalanced::on_unbalanced(Currency::issue(self.1));766	}767}768769pub struct XcmConfig;770impl Config for XcmConfig {771	type Call = Call;772	type XcmSender = XcmRouter;773	// How to withdraw and deposit an asset.774	type AssetTransactor = LocalAssetTransactor;775	type OriginConverter = XcmOriginToTransactDispatchOrigin;776	type IsReserve = NativeAsset;777	type IsTeleporter = (); // Teleportation is disabled778	type LocationInverter = LocationInverter<Ancestry>;779	type Barrier = Barrier;780	type Weigher = FixedWeightBounds<UnitWeightCost, Call, MaxInstructions>;781	type Trader = UsingOnlySelfCurrencyComponents<782		IdentityFee<Balance>,783		RelayLocation,784		AccountId,785		Balances,786		(),787	>;788	type ResponseHandler = (); // Don't handle responses for now.789	type SubscriptionService = PolkadotXcm;790791	type AssetTrap = PolkadotXcm;792	type AssetClaims = PolkadotXcm;793}794795// parameter_types! {796// 	pub const MaxDownwardMessageWeight: Weight = MAXIMUM_BLOCK_WEIGHT / 10;797// }798799/// No local origins on this chain are allowed to dispatch XCM sends/executions.800pub type LocalOriginToLocation = (SignedToAccountId32<Origin, AccountId, RelayNetwork>,);801802/// The means for routing XCM messages which are not for local execution into the right message803/// queues.804pub type XcmRouter = (805	// Two routers - use UMP to communicate with the relay chain:806	cumulus_primitives_utility::ParentAsUmp<ParachainSystem, ()>,807	// ..and XCMP to communicate with the sibling chains.808	XcmpQueue,809);810811impl pallet_evm_coder_substrate::Config for Runtime {812	type EthereumTransactionSender = pallet_ethereum::Pallet<Self>;813	type GasWeightMapping = FixedGasWeightMapping;814}815816impl pallet_xcm::Config for Runtime {817	type Event = Event;818	type SendXcmOrigin = EnsureXcmOrigin<Origin, LocalOriginToLocation>;819	type XcmRouter = XcmRouter;820	type ExecuteXcmOrigin = EnsureXcmOrigin<Origin, LocalOriginToLocation>;821	type XcmExecuteFilter = Everything;822	type XcmExecutor = XcmExecutor<XcmConfig>;823	type XcmTeleportFilter = Everything;824	type XcmReserveTransferFilter = Everything;825	type Weigher = FixedWeightBounds<UnitWeightCost, Call, MaxInstructions>;826	type LocationInverter = LocationInverter<Ancestry>;827	type Origin = Origin;828	type Call = Call;829	const VERSION_DISCOVERY_QUEUE_SIZE: u32 = 100;830	type AdvertisedXcmVersion = pallet_xcm::CurrentXcmVersion;831}832833impl cumulus_pallet_xcm::Config for Runtime {834	type Event = Event;835	type XcmExecutor = XcmExecutor<XcmConfig>;836}837838impl cumulus_pallet_xcmp_queue::Config for Runtime {839	type WeightInfo = ();840	type Event = Event;841	type XcmExecutor = XcmExecutor<XcmConfig>;842	type ChannelInfo = ParachainSystem;843	type VersionWrapper = ();844	type ExecuteOverweightOrigin = frame_system::EnsureRoot<AccountId>;845	type ControllerOrigin = EnsureRoot<AccountId>;846	type ControllerOriginConverter = XcmOriginToTransactDispatchOrigin;847}848849impl cumulus_pallet_dmp_queue::Config for Runtime {850	type Event = Event;851	type XcmExecutor = XcmExecutor<XcmConfig>;852	type ExecuteOverweightOrigin = frame_system::EnsureRoot<AccountId>;853}854855impl pallet_aura::Config for Runtime {856	type AuthorityId = AuraId;857	type DisabledValidators = ();858	type MaxAuthorities = MaxAuthorities;859}860861parameter_types! {862	pub TreasuryAccountId: AccountId = TreasuryModuleId::get().into_account();863	pub const CollectionCreationPrice: Balance = 2 * UNIQUE;864}865866impl pallet_common::Config for Runtime {867	type Event = Event;868	type Currency = Balances;869	type CollectionCreationPrice = CollectionCreationPrice;870	type TreasuryAccountId = TreasuryAccountId;871}872873impl pallet_fungible::Config for Runtime {874	type WeightInfo = pallet_fungible::weights::SubstrateWeight<Self>;875}876impl pallet_refungible::Config for Runtime {877	type WeightInfo = pallet_refungible::weights::SubstrateWeight<Self>;878}879impl pallet_nonfungible::Config for Runtime {880	type WeightInfo = pallet_nonfungible::weights::SubstrateWeight<Self>;881}882883impl pallet_unique::Config for Runtime {884	type Event = Event;885	type WeightInfo = pallet_unique::weights::SubstrateWeight<Self>;886}887888parameter_types! {889	pub const InflationBlockInterval: BlockNumber = 100; // every time per how many blocks inflation is applied890}891892/// Used for the pallet inflation893impl pallet_inflation::Config for Runtime {894	type Currency = Balances;895	type TreasuryAccountId = TreasuryAccountId;896	type InflationBlockInterval = InflationBlockInterval;897	type BlockNumberProvider = RelayChainBlockNumberProvider<Runtime>;898}899900// parameter_types! {901// 	pub MaximumSchedulerWeight: Weight = Perbill::from_percent(50) *902// 		RuntimeBlockWeights::get().max_block;903// 	pub const MaxScheduledPerBlock: u32 = 50;904// }905906type EvmSponsorshipHandler = (907	pallet_unique::UniqueEthSponsorshipHandler<Runtime>,908	pallet_evm_contract_helpers::HelpersContractSponsoring<Runtime>,909);910type SponsorshipHandler = (911	pallet_unique::UniqueSponsorshipHandler<Runtime>,912	//pallet_contract_helpers::ContractSponsorshipHandler<Runtime>,913	pallet_evm_transaction_payment::BridgeSponsorshipHandler<Runtime>,914);915916// impl pallet_unq_scheduler::Config for Runtime {917// 	type Event = Event;918// 	type Origin = Origin;919// 	type PalletsOrigin = OriginCaller;920// 	type Call = Call;921// 	type MaximumWeight = MaximumSchedulerWeight;922// 	type ScheduleOrigin = EnsureSigned<AccountId>;923// 	type MaxScheduledPerBlock = MaxScheduledPerBlock;924// 	type SponsorshipHandler = SponsorshipHandler;925// 	type WeightInfo = ();926// }927928impl pallet_evm_transaction_payment::Config for Runtime {929	type EvmSponsorshipHandler = EvmSponsorshipHandler;930	type Currency = Balances;931}932933impl pallet_charge_transaction::Config for Runtime {934	type SponsorshipHandler = SponsorshipHandler;935}936937// impl pallet_contract_helpers::Config for Runtime {938//	 type DefaultSponsoringRateLimit = DefaultSponsoringRateLimit;939// }940941parameter_types! {942	// 0x842899ECF380553E8a4de75bF534cdf6fBF64049943	pub const HelpersContractAddress: H160 = H160([944		0x84, 0x28, 0x99, 0xec, 0xf3, 0x80, 0x55, 0x3e, 0x8a, 0x4d, 0xe7, 0x5b, 0xf5, 0x34, 0xcd, 0xf6, 0xfb, 0xf6, 0x40, 0x49,945	]);946}947948impl pallet_evm_contract_helpers::Config for Runtime {949	type ContractAddress = HelpersContractAddress;950	type DefaultSponsoringRateLimit = DefaultSponsoringRateLimit;951}952953construct_runtime!(954	pub enum Runtime where955		Block = Block,956		NodeBlock = opaque::Block,957		UncheckedExtrinsic = UncheckedExtrinsic958	{959		ParachainSystem: cumulus_pallet_parachain_system::{Pallet, Call, Config, Storage, Inherent, Event<T>, ValidateUnsigned} = 20,960		ParachainInfo: parachain_info::{Pallet, Storage, Config} = 21,961962		Aura: pallet_aura::{Pallet, Config<T>} = 22,963		AuraExt: cumulus_pallet_aura_ext::{Pallet, Config} = 23,964965		Balances: pallet_balances::{Pallet, Call, Storage, Config<T>, Event<T>} = 30,966		RandomnessCollectiveFlip: pallet_randomness_collective_flip::{Pallet, Storage} = 31,967		Timestamp: pallet_timestamp::{Pallet, Call, Storage, Inherent} = 32,968		TransactionPayment: pallet_transaction_payment::{Pallet, Storage} = 33,969		Treasury: pallet_treasury::{Pallet, Call, Storage, Config, Event<T>} = 34,970		Sudo: pallet_sudo::{Pallet, Call, Storage, Config<T>, Event<T>} = 35,971		System: frame_system::{Pallet, Call, Storage, Config, Event<T>} = 36,972		Vesting: orml_vesting::{Pallet, Storage, Call, Event<T>, Config<T>} = 37,973		// Vesting: pallet_vesting::{Pallet, Call, Config<T>, Storage, Event<T>} = 37,974		// Contracts: pallet_contracts::{Pallet, Call, Storage, Event<T>} = 38,975976		// XCM helpers.977		XcmpQueue: cumulus_pallet_xcmp_queue::{Pallet, Call, Storage, Event<T>} = 50,978		PolkadotXcm: pallet_xcm::{Pallet, Call, Event<T>, Origin} = 51,979		CumulusXcm: cumulus_pallet_xcm::{Pallet, Call, Event<T>, Origin} = 52,980		DmpQueue: cumulus_pallet_dmp_queue::{Pallet, Call, Storage, Event<T>} = 53,981982		// Unique Pallets983		Inflation: pallet_inflation::{Pallet, Call, Storage} = 60,984		Unique: pallet_unique::{Pallet, Call, Storage, Event<T>} = 61,985		// Scheduler: pallet_unq_scheduler::{Pallet, Call, Storage, Event<T>} = 62,986		// free = 63987		Charging: pallet_charge_transaction::{Pallet, Call, Storage } = 64,988		// ContractHelpers: pallet_contract_helpers::{Pallet, Call, Storage} = 65,989		Common: pallet_common::{Pallet, Storage, Event<T>} = 66,990		Fungible: pallet_fungible::{Pallet, Storage} = 67,991		Refungible: pallet_refungible::{Pallet, Storage} = 68,992		Nonfungible: pallet_nonfungible::{Pallet, Storage} = 69,993994		// Frontier995		EVM: pallet_evm::{Pallet, Config, Call, Storage, Event<T>} = 100,996		Ethereum: pallet_ethereum::{Pallet, Config, Call, Storage, Event, Origin} = 101,997998		EvmCoderSubstrate: pallet_evm_coder_substrate::{Pallet, Storage} = 150,999		EvmContractHelpers: pallet_evm_contract_helpers::{Pallet, Storage} = 151,1000		EvmTransactionPayment: pallet_evm_transaction_payment::{Pallet} = 152,1001		EvmMigration: pallet_evm_migration::{Pallet, Call, Storage} = 153,1002	}1003);10041005pub struct TransactionConverter;10061007impl fp_rpc::ConvertTransaction<UncheckedExtrinsic> for TransactionConverter {1008	fn convert_transaction(&self, transaction: pallet_ethereum::Transaction) -> UncheckedExtrinsic {1009		UncheckedExtrinsic::new_unsigned(1010			pallet_ethereum::Call::<Runtime>::transact { transaction }.into(),1011		)1012	}1013}10141015impl fp_rpc::ConvertTransaction<opaque::UncheckedExtrinsic> for TransactionConverter {1016	fn convert_transaction(1017		&self,1018		transaction: pallet_ethereum::Transaction,1019	) -> opaque::UncheckedExtrinsic {1020		let extrinsic = UncheckedExtrinsic::new_unsigned(1021			pallet_ethereum::Call::<Runtime>::transact { transaction }.into(),1022		);1023		let encoded = extrinsic.encode();1024		opaque::UncheckedExtrinsic::decode(&mut &encoded[..])1025			.expect("Encoded extrinsic is always valid")1026	}1027}10281029/// The address format for describing accounts.1030pub type Address = sp_runtime::MultiAddress<AccountId, ()>;1031/// Block header type as expected by this runtime.1032pub type Header = generic::Header<BlockNumber, BlakeTwo256>;1033/// Block type as expected by this runtime.1034pub type Block = generic::Block<Header, UncheckedExtrinsic>;1035/// A Block signed with a Justification1036pub type SignedBlock = generic::SignedBlock<Block>;1037/// BlockId type as expected by this runtime.1038pub type BlockId = generic::BlockId<Block>;1039/// The SignedExtension to the basic transaction logic.1040pub type SignedExtra = (1041	frame_system::CheckSpecVersion<Runtime>,1042	// system::CheckTxVersion<Runtime>,1043	frame_system::CheckGenesis<Runtime>,1044	frame_system::CheckEra<Runtime>,1045	frame_system::CheckNonce<Runtime>,1046	frame_system::CheckWeight<Runtime>,1047	pallet_charge_transaction::ChargeTransactionPayment<Runtime>,1048	//pallet_contract_helpers::ContractHelpersExtension<Runtime>,1049);1050/// Unchecked extrinsic type as expected by this runtime.1051pub type UncheckedExtrinsic =1052	fp_self_contained::UncheckedExtrinsic<Address, Call, Signature, SignedExtra>;1053/// Extrinsic type that has already been checked.1054pub type CheckedExtrinsic = fp_self_contained::CheckedExtrinsic<AccountId, Call, SignedExtra, H160>;1055/// Executive: handles dispatch to the various modules.1056pub type Executive = frame_executive::Executive<1057	Runtime,1058	Block,1059	frame_system::ChainContext<Runtime>,1060	Runtime,1061	AllPalletsReversedWithSystemFirst,1062>;10631064impl_opaque_keys! {1065	pub struct SessionKeys {1066		pub aura: Aura,1067	}1068}10691070impl fp_self_contained::SelfContainedCall for Call {1071	type SignedInfo = H160;10721073	fn is_self_contained(&self) -> bool {1074		match self {1075			Call::Ethereum(call) => call.is_self_contained(),1076			_ => false,1077		}1078	}10791080	fn check_self_contained(&self) -> Option<Result<Self::SignedInfo, TransactionValidityError>> {1081		match self {1082			Call::Ethereum(call) => call.check_self_contained(),1083			_ => None,1084		}1085	}10861087	fn validate_self_contained(&self, info: &Self::SignedInfo) -> Option<TransactionValidity> {1088		match self {1089			Call::Ethereum(call) => call.validate_self_contained(info),1090			_ => None,1091		}1092	}10931094	fn pre_dispatch_self_contained(1095		&self,1096		info: &Self::SignedInfo,1097	) -> Option<Result<(), TransactionValidityError>> {1098		match self {1099			Call::Ethereum(call) => call.pre_dispatch_self_contained(info),1100			_ => None,1101		}1102	}11031104	fn apply_self_contained(1105		self,1106		info: Self::SignedInfo,1107	) -> Option<sp_runtime::DispatchResultWithInfo<PostDispatchInfoOf<Self>>> {1108		match self {1109			call @ Call::Ethereum(pallet_ethereum::Call::transact { .. }) => Some(call.dispatch(1110				Origin::from(pallet_ethereum::RawOrigin::EthereumTransaction(info)),1111			)),1112			_ => None,1113		}1114	}1115}11161117macro_rules! dispatch_unique_runtime {1118	($collection:ident.$method:ident($($name:ident),*)) => {{1119		use pallet_unique::dispatch::Dispatched;11201121		let collection = Dispatched::dispatch(<pallet_common::CollectionHandle<Runtime>>::try_get($collection)?);1122		let dispatch = collection.as_dyn();11231124		Ok(dispatch.$method($($name),*))1125	}};1126}11271128impl_common_runtime_apis!();11291130struct CheckInherents;11311132impl cumulus_pallet_parachain_system::CheckInherents<Block> for CheckInherents {1133	fn check_inherents(1134		block: &Block,1135		relay_state_proof: &cumulus_pallet_parachain_system::RelayChainStateProof,1136	) -> sp_inherents::CheckInherentsResult {1137		let relay_chain_slot = relay_state_proof1138			.read_slot()1139			.expect("Could not read the relay chain slot from the proof");11401141		let inherent_data =1142			cumulus_primitives_timestamp::InherentDataProvider::from_relay_chain_slot_and_duration(1143				relay_chain_slot,1144				sp_std::time::Duration::from_secs(6),1145			)1146			.create_inherent_data()1147			.expect("Could not create the timestamp inherent data");11481149		inherent_data.check_extrinsics(block)1150	}1151}11521153cumulus_pallet_parachain_system::register_validate_block!(1154	Runtime = Runtime,1155	BlockExecutor = cumulus_pallet_aura_ext::BlockExecutor::<Runtime, Executive>,1156	CheckInherents = CheckInherents,1157);
after · runtime/opal/src/lib.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//! The Substrate Node Template runtime. This can be compiled with `#[no_std]`, ready for Wasm.1819#![cfg_attr(not(feature = "std"), no_std)]20// `construct_runtime!` does a lot of recursion and requires us to increase the limit to 256.21#![recursion_limit = "1024"]22#![allow(clippy::from_over_into, clippy::identity_op)]23#![allow(clippy::fn_to_numeric_cast_with_truncation)]24// Make the WASM binary available.25#[cfg(feature = "std")]26include!(concat!(env!("OUT_DIR"), "/wasm_binary.rs"));2728use sp_api::impl_runtime_apis;29use sp_core::{crypto::KeyTypeId, OpaqueMetadata, H256, U256, H160};30use sp_runtime::DispatchError;31// #[cfg(any(feature = "std", test))]32// pub use sp_runtime::BuildStorage;3334use sp_runtime::{35	Permill, Perbill, Percent, create_runtime_str, generic, impl_opaque_keys,36	traits::{AccountIdLookup, BlakeTwo256, Block as BlockT, AccountIdConversion, Zero},37	transaction_validity::{TransactionSource, TransactionValidity},38	ApplyExtrinsicResult, RuntimeAppPublic,39};4041use sp_std::prelude::*;4243#[cfg(feature = "std")]44use sp_version::NativeVersion;45use sp_version::RuntimeVersion;46pub use pallet_transaction_payment::{47	Multiplier, TargetedFeeAdjustment, FeeDetails, RuntimeDispatchInfo,48};49// A few exports that help ease life for downstream crates.50pub use pallet_balances::Call as BalancesCall;51pub use pallet_evm::{EnsureAddressTruncated, HashedAddressMapping, Runner, account::CrossAccountId as _};52pub use frame_support::{53	construct_runtime, match_type,54	dispatch::DispatchResult,55	PalletId, parameter_types, StorageValue, ConsensusEngineId,56	traits::{57		tokens::currency::Currency as CurrencyT, OnUnbalanced as OnUnbalancedT, Everything,58		Currency, ExistenceRequirement, Get, IsInVec, KeyOwnerProofSystem, LockIdentifier,59		OnUnbalanced, Randomness, FindAuthor,60	},61	weights::{62		constants::{BlockExecutionWeight, ExtrinsicBaseWeight, RocksDbWeight, WEIGHT_PER_SECOND},63		DispatchClass, DispatchInfo, GetDispatchInfo, IdentityFee, Pays, PostDispatchInfo, Weight,64		WeightToFeePolynomial, WeightToFeeCoefficient, WeightToFeeCoefficients,65	},66};67use up_data_structs::*;68// use pallet_contracts::weights::WeightInfo;69// #[cfg(any(feature = "std", test))]70use frame_system::{71	self as frame_system, EnsureRoot, EnsureSigned,72	limits::{BlockWeights, BlockLength},73};74use sp_arithmetic::{75	traits::{BaseArithmetic, Unsigned},76};77use smallvec::smallvec;78use codec::{Encode, Decode};79use pallet_evm::{Account as EVMAccount, FeeCalculator, GasWeightMapping, OnMethodCall};80use fp_rpc::TransactionStatus;81use sp_runtime::{82	traits::{BlockNumberProvider, Dispatchable, PostDispatchInfoOf, Saturating},83	transaction_validity::TransactionValidityError,84	SaturatedConversion,85};8687// pub use pallet_timestamp::Call as TimestampCall;88pub use sp_consensus_aura::sr25519::AuthorityId as AuraId;8990// Polkadot imports91use pallet_xcm::XcmPassthrough;92use polkadot_parachain::primitives::Sibling;93use xcm::v1::{BodyId, Junction::*, MultiLocation, NetworkId, Junctions::*};94use xcm_builder::{95	AccountId32Aliases, AllowTopLevelPaidExecutionFrom, AllowUnpaidExecutionFrom, CurrencyAdapter,96	EnsureXcmOrigin, FixedWeightBounds, LocationInverter, NativeAsset, ParentAsSuperuser,97	RelayChainAsNative, SiblingParachainAsNative, SiblingParachainConvertsVia,98	SignedAccountId32AsNative, SignedToAccountId32, SovereignSignedViaLocation, TakeWeightCredit,99	ParentIsPreset,100};101use xcm_executor::{Config, XcmExecutor, Assets};102use sp_std::{marker::PhantomData};103104use xcm::latest::{105	//	Xcm,106	AssetId::{Concrete},107	Fungibility::Fungible as XcmFungible,108	MultiAsset,109	Error as XcmError,110};111use xcm_executor::traits::{MatchesFungible, WeightTrader};112//use xcm_executor::traits::MatchesFungible;113use sp_runtime::traits::CheckedConversion;114115use unique_runtime_common::{impl_common_runtime_apis, types::*, constants::*};116117pub const RUNTIME_NAME: &str = "Opal";118119type CrossAccountId = pallet_evm::account::BasicCrossAccountId<Runtime>;120121impl RuntimeInstance for Runtime {122	type CrossAccountId = self::CrossAccountId;123	type TransactionConverter = self::TransactionConverter;124125	fn get_transaction_converter() -> TransactionConverter {126		TransactionConverter127	}128}129130/// The type for looking up accounts. We don't expect more than 4 billion of them, but you131/// never know...132pub type AccountIndex = u32;133134/// Balance of an account.135pub type Balance = u128;136137/// Index of a transaction in the chain.138pub type Index = u32;139140/// A hash of some data used by the chain.141pub type Hash = sp_core::H256;142143/// Digest item type.144pub type DigestItem = generic::DigestItem;145146/// Opaque types. These are used by the CLI to instantiate machinery that don't need to know147/// the specifics of the runtime. They can then be made to be agnostic over specific formats148/// of data like extrinsics, allowing for them to continue syncing the network through upgrades149/// to even the core data structures.150pub mod opaque {151	use sp_std::prelude::*;152	use sp_runtime::impl_opaque_keys;153	use super::Aura;154155	pub use unique_runtime_common::types::*;156157	impl_opaque_keys! {158		pub struct SessionKeys {159			pub aura: Aura,160		}161	}162}163164/// This runtime version.165pub const VERSION: RuntimeVersion = RuntimeVersion {166	spec_name: create_runtime_str!(RUNTIME_NAME),167	impl_name: create_runtime_str!(RUNTIME_NAME),168	authoring_version: 1,169	spec_version: 917004,170	impl_version: 0,171	apis: RUNTIME_API_VERSIONS,172	transaction_version: 1,173	state_version: 0,174};175176#[derive(codec::Encode, codec::Decode)]177pub enum XCMPMessage<XAccountId, XBalance> {178	/// Transfer tokens to the given account from the Parachain account.179	TransferToken(XAccountId, XBalance),180}181182/// The version information used to identify this runtime when compiled natively.183#[cfg(feature = "std")]184pub fn native_version() -> NativeVersion {185	NativeVersion {186		runtime_version: VERSION,187		can_author_with: Default::default(),188	}189}190191type NegativeImbalance = <Balances as Currency<AccountId>>::NegativeImbalance;192193pub struct DealWithFees;194impl OnUnbalanced<NegativeImbalance> for DealWithFees {195	fn on_unbalanceds<B>(mut fees_then_tips: impl Iterator<Item = NegativeImbalance>) {196		if let Some(fees) = fees_then_tips.next() {197			// for fees, 100% to treasury198			let mut split = fees.ration(100, 0);199			if let Some(tips) = fees_then_tips.next() {200				// for tips, if any, 100% to treasury201				tips.ration_merge_into(100, 0, &mut split);202			}203			Treasury::on_unbalanced(split.0);204			// Author::on_unbalanced(split.1);205		}206	}207}208209parameter_types! {210	pub const BlockHashCount: BlockNumber = 2400;211	pub RuntimeBlockLength: BlockLength =212		BlockLength::max_with_normal_ratio(5 * 1024 * 1024, NORMAL_DISPATCH_RATIO);213	pub const AvailableBlockRatio: Perbill = Perbill::from_percent(75);214	pub const MaximumBlockLength: u32 = 5 * 1024 * 1024;215	pub RuntimeBlockWeights: BlockWeights = BlockWeights::builder()216		.base_block(BlockExecutionWeight::get())217		.for_class(DispatchClass::all(), |weights| {218			weights.base_extrinsic = ExtrinsicBaseWeight::get();219		})220		.for_class(DispatchClass::Normal, |weights| {221			weights.max_total = Some(NORMAL_DISPATCH_RATIO * MAXIMUM_BLOCK_WEIGHT);222		})223		.for_class(DispatchClass::Operational, |weights| {224			weights.max_total = Some(MAXIMUM_BLOCK_WEIGHT);225			// Operational transactions have some extra reserved space, so that they226			// are included even if block reached `MAXIMUM_BLOCK_WEIGHT`.227			weights.reserved = Some(228				MAXIMUM_BLOCK_WEIGHT - NORMAL_DISPATCH_RATIO * MAXIMUM_BLOCK_WEIGHT229			);230		})231		.avg_block_initialization(AVERAGE_ON_INITIALIZE_RATIO)232		.build_or_panic();233	pub const Version: RuntimeVersion = VERSION;234	pub const SS58Prefix: u8 = 42;235}236237parameter_types! {238	pub const ChainId: u64 = 8882;239}240241pub struct FixedFee;242impl FeeCalculator for FixedFee {243	fn min_gas_price() -> U256 {244		MIN_GAS_PRICE.into()245	}246}247248// Assuming slowest ethereum opcode is SSTORE, with gas price of 20000 as our worst case249// (contract, which only writes a lot of data),250// approximating on top of our real store write weight251parameter_types! {252	pub const WritesPerSecond: u64 = WEIGHT_PER_SECOND / <Runtime as frame_system::Config>::DbWeight::get().write;253	pub const GasPerSecond: u64 = WritesPerSecond::get() * 20000;254	pub const WeightPerGas: u64 = WEIGHT_PER_SECOND / GasPerSecond::get();255}256257/// Limiting EVM execution to 50% of block for substrate users and management tasks258/// EVM transaction consumes more weight than substrate's, so we can't rely on them being259/// scheduled fairly260const EVM_DISPATCH_RATIO: Perbill = Perbill::from_percent(50);261parameter_types! {262	pub BlockGasLimit: U256 = U256::from(NORMAL_DISPATCH_RATIO * EVM_DISPATCH_RATIO * MAXIMUM_BLOCK_WEIGHT / WeightPerGas::get());263}264265pub enum FixedGasWeightMapping {}266impl GasWeightMapping for FixedGasWeightMapping {267	fn gas_to_weight(gas: u64) -> Weight {268		gas.saturating_mul(WeightPerGas::get())269	}270	fn weight_to_gas(weight: Weight) -> u64 {271		weight / WeightPerGas::get()272	}273}274275impl pallet_evm::account::Config for Runtime {276	type CrossAccountId = pallet_evm::account::BasicCrossAccountId<Self>;277	type EvmAddressMapping = pallet_evm::HashedAddressMapping<Self::Hashing>;278	type EvmBackwardsAddressMapping = fp_evm_mapping::MapBackwardsAddressTruncated;279}280281impl pallet_evm::Config for Runtime {282	type BlockGasLimit = BlockGasLimit;283	type FeeCalculator = FixedFee;284	type GasWeightMapping = FixedGasWeightMapping;285	type BlockHashMapping = pallet_ethereum::EthereumBlockHashMapping<Self>;286	type CallOrigin = EnsureAddressTruncated;287	type WithdrawOrigin = EnsureAddressTruncated;288	type AddressMapping = HashedAddressMapping<Self::Hashing>;289	type PrecompilesType = ();290	type PrecompilesValue = ();291	type Currency = Balances;292	type Event = Event;293	type OnMethodCall = (294		pallet_evm_migration::OnMethodCall<Self>,295		pallet_unique::UniqueErcSupport<Self>,296		pallet_evm_contract_helpers::HelpersOnMethodCall<Self>,297	);298	type OnCreate = pallet_evm_contract_helpers::HelpersOnCreate<Self>;299	type ChainId = ChainId;300	type Runner = pallet_evm::runner::stack::Runner<Self>;301	type OnChargeTransaction = pallet_evm_transaction_payment::OnChargeTransaction<Self>;302	type TransactionValidityHack = pallet_evm_transaction_payment::TransactionValidityHack<Self>;303	type FindAuthor = EthereumFindAuthor<Aura>;304}305306impl pallet_evm_migration::Config for Runtime {307	type WeightInfo = pallet_evm_migration::weights::SubstrateWeight<Self>;308}309310pub struct EthereumFindAuthor<F>(core::marker::PhantomData<F>);311impl<F: FindAuthor<u32>> FindAuthor<H160> for EthereumFindAuthor<F> {312	fn find_author<'a, I>(digests: I) -> Option<H160>313	where314		I: 'a + IntoIterator<Item = (ConsensusEngineId, &'a [u8])>,315	{316		if let Some(author_index) = F::find_author(digests) {317			let authority_id = Aura::authorities()[author_index as usize].clone();318			return Some(H160::from_slice(&authority_id.to_raw_vec()[4..24]));319		}320		None321	}322}323324impl pallet_ethereum::Config for Runtime {325	type Event = Event;326	type StateRoot = pallet_ethereum::IntermediateStateRoot;327}328329impl pallet_randomness_collective_flip::Config for Runtime {}330331impl frame_system::Config for Runtime {332	/// The data to be stored in an account.333	type AccountData = pallet_balances::AccountData<Balance>;334	/// The identifier used to distinguish between accounts.335	type AccountId = AccountId;336	/// The basic call filter to use in dispatchable.337	type BaseCallFilter = Everything;338	/// Maximum number of block number to block hash mappings to keep (oldest pruned first).339	type BlockHashCount = BlockHashCount;340	/// The maximum length of a block (in bytes).341	type BlockLength = RuntimeBlockLength;342	/// The index type for blocks.343	type BlockNumber = BlockNumber;344	/// The weight of the overhead invoked on the block import process, independent of the extrinsics included in that block.345	type BlockWeights = RuntimeBlockWeights;346	/// The aggregated dispatch type that is available for extrinsics.347	type Call = Call;348	/// The weight of database operations that the runtime can invoke.349	type DbWeight = RocksDbWeight;350	/// The ubiquitous event type.351	type Event = Event;352	/// The type for hashing blocks and tries.353	type Hash = Hash;354	/// The hashing algorithm used.355	type Hashing = BlakeTwo256;356	/// The header type.357	type Header = generic::Header<BlockNumber, BlakeTwo256>;358	/// The index type for storing how many extrinsics an account has signed.359	type Index = Index;360	/// The lookup mechanism to get account ID from whatever is passed in dispatchers.361	type Lookup = AccountIdLookup<AccountId, ()>;362	/// What to do if an account is fully reaped from the system.363	type OnKilledAccount = ();364	/// What to do if a new account is created.365	type OnNewAccount = ();366	type OnSetCode = cumulus_pallet_parachain_system::ParachainSetCode<Self>;367	/// The ubiquitous origin type.368	type Origin = Origin;369	/// This type is being generated by `construct_runtime!`.370	type PalletInfo = PalletInfo;371	/// This is used as an identifier of the chain. 42 is the generic substrate prefix.372	type SS58Prefix = SS58Prefix;373	/// Weight information for the extrinsics of this pallet.374	type SystemWeightInfo = frame_system::weights::SubstrateWeight<Self>;375	/// Version of the runtime.376	type Version = Version;377	type MaxConsumers = ConstU32<16>;378}379380parameter_types! {381	pub const MinimumPeriod: u64 = SLOT_DURATION / 2;382}383384impl pallet_timestamp::Config for Runtime {385	/// A timestamp: milliseconds since the unix epoch.386	type Moment = u64;387	type OnTimestampSet = ();388	type MinimumPeriod = MinimumPeriod;389	type WeightInfo = ();390}391392parameter_types! {393	// pub const ExistentialDeposit: u128 = 500;394	pub const ExistentialDeposit: u128 = 0;395	pub const MaxLocks: u32 = 50;396}397398impl pallet_balances::Config for Runtime {399	type MaxLocks = MaxLocks;400	type MaxReserves = ();401	type ReserveIdentifier = [u8; 8];402	/// The type for recording an account's balance.403	type Balance = Balance;404	/// The ubiquitous event type.405	type Event = Event;406	type DustRemoval = Treasury;407	type ExistentialDeposit = ExistentialDeposit;408	type AccountStore = System;409	type WeightInfo = pallet_balances::weights::SubstrateWeight<Self>;410}411412pub const fn deposit(items: u32, bytes: u32) -> Balance {413	items as Balance * 15 * CENTIUNIQUE + (bytes as Balance) * 6 * CENTIUNIQUE414}415416/*417parameter_types! {418	pub TombstoneDeposit: Balance = deposit(419		1,420		sp_std::mem::size_of::<pallet_contracts::Pallet<Runtime>> as u32,421	);422	pub DepositPerContract: Balance = TombstoneDeposit::get();423	pub const DepositPerStorageByte: Balance = deposit(0, 1);424	pub const DepositPerStorageItem: Balance = deposit(1, 0);425	pub RentFraction: Perbill = Perbill::from_rational(1u32, 30 * DAYS);426	pub const SurchargeReward: Balance = 150 * MILLIUNIQUE;427	pub const SignedClaimHandicap: u32 = 2;428	pub const MaxDepth: u32 = 32;429	pub const MaxValueSize: u32 = 16 * 1024;430	pub const MaxCodeSize: u32 = 1024 * 1024 * 25; // 25 Mb431	// The lazy deletion runs inside on_initialize.432	pub DeletionWeightLimit: Weight = AVERAGE_ON_INITIALIZE_RATIO *433		RuntimeBlockWeights::get().max_block;434	// The weight needed for decoding the queue should be less or equal than a fifth435	// of the overall weight dedicated to the lazy deletion.436	pub DeletionQueueDepth: u32 = ((DeletionWeightLimit::get() / (437			<Runtime as pallet_contracts::Config>::WeightInfo::on_initialize_per_queue_item(1) -438			<Runtime as pallet_contracts::Config>::WeightInfo::on_initialize_per_queue_item(0)439		)) / 5) as u32;440	pub Schedule: pallet_contracts::Schedule<Runtime> = Default::default();441}442443impl pallet_contracts::Config for Runtime {444	type Time = Timestamp;445	type Randomness = RandomnessCollectiveFlip;446	type Currency = Balances;447	type Event = Event;448	type RentPayment = ();449	type SignedClaimHandicap = SignedClaimHandicap;450	type TombstoneDeposit = TombstoneDeposit;451	type DepositPerContract = DepositPerContract;452	type DepositPerStorageByte = DepositPerStorageByte;453	type DepositPerStorageItem = DepositPerStorageItem;454	type RentFraction = RentFraction;455	type SurchargeReward = SurchargeReward;456	type WeightPrice = pallet_transaction_payment::Pallet<Self>;457	type WeightInfo = pallet_contracts::weights::SubstrateWeight<Self>;458	type ChainExtension = NFTExtension;459	type DeletionQueueDepth = DeletionQueueDepth;460	type DeletionWeightLimit = DeletionWeightLimit;461	type Schedule = Schedule;462	type CallStack = [pallet_contracts::Frame<Self>; 31];463}464*/465466parameter_types! {467	/// This value increases the priority of `Operational` transactions by adding468	/// a "virtual tip" that's equal to the `OperationalFeeMultiplier * final_fee`.469	pub const OperationalFeeMultiplier: u8 = 5;470}471472/// Linear implementor of `WeightToFeePolynomial`473pub struct LinearFee<T>(sp_std::marker::PhantomData<T>);474475impl<T> WeightToFeePolynomial for LinearFee<T>476where477	T: BaseArithmetic + From<u32> + Copy + Unsigned,478{479	type Balance = T;480481	fn polynomial() -> WeightToFeeCoefficients<Self::Balance> {482		smallvec!(WeightToFeeCoefficient {483			// Targeting 0.1 Unique per NFT transfer484			coeff_integer: WEIGHT_TO_FEE_COEFF.into(),485			coeff_frac: Perbill::zero(),486			negative: false,487			degree: 1,488		})489	}490}491492impl pallet_transaction_payment::Config for Runtime {493	type OnChargeTransaction = pallet_transaction_payment::CurrencyAdapter<Balances, DealWithFees>;494	type TransactionByteFee = TransactionByteFee;495	type OperationalFeeMultiplier = OperationalFeeMultiplier;496	type WeightToFee = LinearFee<Balance>;497	type FeeMultiplierUpdate = ();498}499500parameter_types! {501	pub const ProposalBond: Permill = Permill::from_percent(5);502	pub const ProposalBondMinimum: Balance = 1 * UNIQUE;503	pub const ProposalBondMaximum: Balance = 1000 * UNIQUE;504	pub const SpendPeriod: BlockNumber = 5 * MINUTES;505	pub const Burn: Permill = Permill::from_percent(0);506	pub const TipCountdown: BlockNumber = 1 * DAYS;507	pub const TipFindersFee: Percent = Percent::from_percent(20);508	pub const TipReportDepositBase: Balance = 1 * UNIQUE;509	pub const DataDepositPerByte: Balance = 1 * CENTIUNIQUE;510	pub const BountyDepositBase: Balance = 1 * UNIQUE;511	pub const BountyDepositPayoutDelay: BlockNumber = 1 * DAYS;512	pub const TreasuryModuleId: PalletId = PalletId(*b"py/trsry");513	pub const BountyUpdatePeriod: BlockNumber = 14 * DAYS;514	pub const MaximumReasonLength: u32 = 16384;515	pub const BountyCuratorDeposit: Permill = Permill::from_percent(50);516	pub const BountyValueMinimum: Balance = 5 * UNIQUE;517	pub const MaxApprovals: u32 = 100;518}519520impl pallet_treasury::Config for Runtime {521	type PalletId = TreasuryModuleId;522	type Currency = Balances;523	type ApproveOrigin = EnsureRoot<AccountId>;524	type RejectOrigin = EnsureRoot<AccountId>;525	type Event = Event;526	type OnSlash = ();527	type ProposalBond = ProposalBond;528	type ProposalBondMinimum = ProposalBondMinimum;529	type ProposalBondMaximum = ProposalBondMaximum;530	type SpendPeriod = SpendPeriod;531	type Burn = Burn;532	type BurnDestination = ();533	type SpendFunds = ();534	type WeightInfo = pallet_treasury::weights::SubstrateWeight<Self>;535	type MaxApprovals = MaxApprovals;536}537538impl pallet_sudo::Config for Runtime {539	type Event = Event;540	type Call = Call;541}542543pub struct RelayChainBlockNumberProvider<T>(sp_std::marker::PhantomData<T>);544545impl<T: cumulus_pallet_parachain_system::Config> BlockNumberProvider546	for RelayChainBlockNumberProvider<T>547{548	type BlockNumber = BlockNumber;549550	fn current_block_number() -> Self::BlockNumber {551		cumulus_pallet_parachain_system::Pallet::<T>::validation_data()552			.map(|d| d.relay_parent_number)553			.unwrap_or_default()554	}555}556557parameter_types! {558	pub const MinVestedTransfer: Balance = 10 * UNIQUE;559	pub const MaxVestingSchedules: u32 = 28;560}561562impl orml_vesting::Config for Runtime {563	type Event = Event;564	type Currency = pallet_balances::Pallet<Runtime>;565	type MinVestedTransfer = MinVestedTransfer;566	type VestedTransferOrigin = EnsureSigned<AccountId>;567	type WeightInfo = ();568	type MaxVestingSchedules = MaxVestingSchedules;569	type BlockNumberProvider = RelayChainBlockNumberProvider<Runtime>;570}571572parameter_types! {573	pub const ReservedDmpWeight: Weight = MAXIMUM_BLOCK_WEIGHT / 4;574	pub const ReservedXcmpWeight: Weight = MAXIMUM_BLOCK_WEIGHT / 4;575}576577impl cumulus_pallet_parachain_system::Config for Runtime {578	type Event = Event;579	type SelfParaId = parachain_info::Pallet<Self>;580	type OnSystemEvent = ();581	// type DownwardMessageHandlers = cumulus_primitives_utility::UnqueuedDmpAsParent<582	// 	MaxDownwardMessageWeight,583	// 	XcmExecutor<XcmConfig>,584	// 	Call,585	// >;586	type OutboundXcmpMessageSource = XcmpQueue;587	type DmpMessageHandler = DmpQueue;588	type ReservedDmpWeight = ReservedDmpWeight;589	type ReservedXcmpWeight = ReservedXcmpWeight;590	type XcmpMessageHandler = XcmpQueue;591}592593impl parachain_info::Config for Runtime {}594595impl cumulus_pallet_aura_ext::Config for Runtime {}596597parameter_types! {598	pub const RelayLocation: MultiLocation = MultiLocation::parent();599	pub const RelayNetwork: NetworkId = NetworkId::Polkadot;600	pub RelayOrigin: Origin = cumulus_pallet_xcm::Origin::Relay.into();601	pub Ancestry: MultiLocation = Parachain(ParachainInfo::parachain_id().into()).into();602}603604/// Type for specifying how a `MultiLocation` can be converted into an `AccountId`. This is used605/// when determining ownership of accounts for asset transacting and when attempting to use XCM606/// `Transact` in order to determine the dispatch Origin.607pub type LocationToAccountId = (608	// The parent (Relay-chain) origin converts to the default `AccountId`.609	ParentIsPreset<AccountId>,610	// Sibling parachain origins convert to AccountId via the `ParaId::into`.611	SiblingParachainConvertsVia<Sibling, AccountId>,612	// Straight up local `AccountId32` origins just alias directly to `AccountId`.613	AccountId32Aliases<RelayNetwork, AccountId>,614);615616pub struct OnlySelfCurrency;617impl<B: TryFrom<u128>> MatchesFungible<B> for OnlySelfCurrency {618	fn matches_fungible(a: &MultiAsset) -> Option<B> {619		match (&a.id, &a.fun) {620			(Concrete(_), XcmFungible(ref amount)) => CheckedConversion::checked_from(*amount),621			_ => None,622		}623	}624}625626/// Means for transacting assets on this chain.627pub type LocalAssetTransactor = CurrencyAdapter<628	// Use this currency:629	Balances,630	// Use this currency when it is a fungible asset matching the given location or name:631	OnlySelfCurrency,632	// Do a simple punn to convert an AccountId32 MultiLocation into a native chain account ID:633	LocationToAccountId,634	// Our chain's account ID type (we can't get away without mentioning it explicitly):635	AccountId,636	// We don't track any teleports.637	(),638>;639640/// This is the type we use to convert an (incoming) XCM origin into a local `Origin` instance,641/// ready for dispatching a transaction with Xcm's `Transact`. There is an `OriginKind` which can642/// biases the kind of local `Origin` it will become.643pub type XcmOriginToTransactDispatchOrigin = (644	// Sovereign account converter; this attempts to derive an `AccountId` from the origin location645	// using `LocationToAccountId` and then turn that into the usual `Signed` origin. Useful for646	// foreign chains who want to have a local sovereign account on this chain which they control.647	SovereignSignedViaLocation<LocationToAccountId, Origin>,648	// Native converter for Relay-chain (Parent) location; will converts to a `Relay` origin when649	// recognised.650	RelayChainAsNative<RelayOrigin, Origin>,651	// Native converter for sibling Parachains; will convert to a `SiblingPara` origin when652	// recognised.653	SiblingParachainAsNative<cumulus_pallet_xcm::Origin, Origin>,654	// Superuser converter for the Relay-chain (Parent) location. This will allow it to issue a655	// transaction from the Root origin.656	ParentAsSuperuser<Origin>,657	// Native signed account converter; this just converts an `AccountId32` origin into a normal658	// `Origin::Signed` origin of the same 32-byte value.659	SignedAccountId32AsNative<RelayNetwork, Origin>,660	// Xcm origins can be represented natively under the Xcm pallet's Xcm origin.661	XcmPassthrough<Origin>,662);663664parameter_types! {665	// One XCM operation is 1_000_000 weight - almost certainly a conservative estimate.666	pub UnitWeightCost: Weight = 1_000_000;667	// 1200 UNIQUEs buy 1 second of weight.668	pub const WeightPrice: (MultiLocation, u128) = (MultiLocation::parent(), 1_200 * UNIQUE);669	pub const MaxInstructions: u32 = 100;670	pub const MaxAuthorities: u32 = 100_000;671}672673match_type! {674	pub type ParentOrParentsUnitPlurality: impl Contains<MultiLocation> = {675		MultiLocation { parents: 1, interior: Here } |676		MultiLocation { parents: 1, interior: X1(Plurality { id: BodyId::Unit, .. }) }677	};678}679680pub type Barrier = (681	TakeWeightCredit,682	AllowTopLevelPaidExecutionFrom<Everything>,683	AllowUnpaidExecutionFrom<ParentOrParentsUnitPlurality>,684	// ^^^ Parent & its unit plurality gets free execution685);686687pub struct UsingOnlySelfCurrencyComponents<688	WeightToFee: WeightToFeePolynomial<Balance = Currency::Balance>,689	AssetId: Get<MultiLocation>,690	AccountId,691	Currency: CurrencyT<AccountId>,692	OnUnbalanced: OnUnbalancedT<Currency::NegativeImbalance>,693>(694	Weight,695	Currency::Balance,696	PhantomData<(WeightToFee, AssetId, AccountId, Currency, OnUnbalanced)>,697);698impl<699		WeightToFee: WeightToFeePolynomial<Balance = Currency::Balance>,700		AssetId: Get<MultiLocation>,701		AccountId,702		Currency: CurrencyT<AccountId>,703		OnUnbalanced: OnUnbalancedT<Currency::NegativeImbalance>,704	> WeightTrader705	for UsingOnlySelfCurrencyComponents<WeightToFee, AssetId, AccountId, Currency, OnUnbalanced>706{707	fn new() -> Self {708		Self(0, Zero::zero(), PhantomData)709	}710711	fn buy_weight(&mut self, weight: Weight, payment: Assets) -> Result<Assets, XcmError> {712		let amount = WeightToFee::calc(&weight);713		let u128_amount: u128 = amount.try_into().map_err(|_| XcmError::Overflow)?;714715		// location to this parachain through relay chain716		let option1: xcm::v1::AssetId = Concrete(MultiLocation {717			parents: 1,718			interior: X1(Parachain(ParachainInfo::parachain_id().into())),719		});720		// direct location721		let option2: xcm::v1::AssetId = Concrete(MultiLocation {722			parents: 0,723			interior: Here,724		});725726		let required = if payment.fungible.contains_key(&option1) {727			(option1, u128_amount).into()728		} else if payment.fungible.contains_key(&option2) {729			(option2, u128_amount).into()730		} else {731			(Concrete(MultiLocation::default()), u128_amount).into()732		};733734		let unused = payment735			.checked_sub(required)736			.map_err(|_| XcmError::TooExpensive)?;737		self.0 = self.0.saturating_add(weight);738		self.1 = self.1.saturating_add(amount);739		Ok(unused)740	}741742	fn refund_weight(&mut self, weight: Weight) -> Option<MultiAsset> {743		let weight = weight.min(self.0);744		let amount = WeightToFee::calc(&weight);745		self.0 -= weight;746		self.1 = self.1.saturating_sub(amount);747		let amount: u128 = amount.saturated_into();748		if amount > 0 {749			Some((AssetId::get(), amount).into())750		} else {751			None752		}753	}754}755impl<756		WeightToFee: WeightToFeePolynomial<Balance = Currency::Balance>,757		AssetId: Get<MultiLocation>,758		AccountId,759		Currency: CurrencyT<AccountId>,760		OnUnbalanced: OnUnbalancedT<Currency::NegativeImbalance>,761	> Drop762	for UsingOnlySelfCurrencyComponents<WeightToFee, AssetId, AccountId, Currency, OnUnbalanced>763{764	fn drop(&mut self) {765		OnUnbalanced::on_unbalanced(Currency::issue(self.1));766	}767}768769pub struct XcmConfig;770impl Config for XcmConfig {771	type Call = Call;772	type XcmSender = XcmRouter;773	// How to withdraw and deposit an asset.774	type AssetTransactor = LocalAssetTransactor;775	type OriginConverter = XcmOriginToTransactDispatchOrigin;776	type IsReserve = NativeAsset;777	type IsTeleporter = (); // Teleportation is disabled778	type LocationInverter = LocationInverter<Ancestry>;779	type Barrier = Barrier;780	type Weigher = FixedWeightBounds<UnitWeightCost, Call, MaxInstructions>;781	type Trader = UsingOnlySelfCurrencyComponents<782		IdentityFee<Balance>,783		RelayLocation,784		AccountId,785		Balances,786		(),787	>;788	type ResponseHandler = (); // Don't handle responses for now.789	type SubscriptionService = PolkadotXcm;790791	type AssetTrap = PolkadotXcm;792	type AssetClaims = PolkadotXcm;793}794795// parameter_types! {796// 	pub const MaxDownwardMessageWeight: Weight = MAXIMUM_BLOCK_WEIGHT / 10;797// }798799/// No local origins on this chain are allowed to dispatch XCM sends/executions.800pub type LocalOriginToLocation = (SignedToAccountId32<Origin, AccountId, RelayNetwork>,);801802/// The means for routing XCM messages which are not for local execution into the right message803/// queues.804pub type XcmRouter = (805	// Two routers - use UMP to communicate with the relay chain:806	cumulus_primitives_utility::ParentAsUmp<ParachainSystem, ()>,807	// ..and XCMP to communicate with the sibling chains.808	XcmpQueue,809);810811impl pallet_evm_coder_substrate::Config for Runtime {812	type EthereumTransactionSender = pallet_ethereum::Pallet<Self>;813	type GasWeightMapping = FixedGasWeightMapping;814}815816impl pallet_xcm::Config for Runtime {817	type Event = Event;818	type SendXcmOrigin = EnsureXcmOrigin<Origin, LocalOriginToLocation>;819	type XcmRouter = XcmRouter;820	type ExecuteXcmOrigin = EnsureXcmOrigin<Origin, LocalOriginToLocation>;821	type XcmExecuteFilter = Everything;822	type XcmExecutor = XcmExecutor<XcmConfig>;823	type XcmTeleportFilter = Everything;824	type XcmReserveTransferFilter = Everything;825	type Weigher = FixedWeightBounds<UnitWeightCost, Call, MaxInstructions>;826	type LocationInverter = LocationInverter<Ancestry>;827	type Origin = Origin;828	type Call = Call;829	const VERSION_DISCOVERY_QUEUE_SIZE: u32 = 100;830	type AdvertisedXcmVersion = pallet_xcm::CurrentXcmVersion;831}832833impl cumulus_pallet_xcm::Config for Runtime {834	type Event = Event;835	type XcmExecutor = XcmExecutor<XcmConfig>;836}837838impl cumulus_pallet_xcmp_queue::Config for Runtime {839	type WeightInfo = ();840	type Event = Event;841	type XcmExecutor = XcmExecutor<XcmConfig>;842	type ChannelInfo = ParachainSystem;843	type VersionWrapper = ();844	type ExecuteOverweightOrigin = frame_system::EnsureRoot<AccountId>;845	type ControllerOrigin = EnsureRoot<AccountId>;846	type ControllerOriginConverter = XcmOriginToTransactDispatchOrigin;847}848849impl cumulus_pallet_dmp_queue::Config for Runtime {850	type Event = Event;851	type XcmExecutor = XcmExecutor<XcmConfig>;852	type ExecuteOverweightOrigin = frame_system::EnsureRoot<AccountId>;853}854855impl pallet_aura::Config for Runtime {856	type AuthorityId = AuraId;857	type DisabledValidators = ();858	type MaxAuthorities = MaxAuthorities;859}860861parameter_types! {862	pub TreasuryAccountId: AccountId = TreasuryModuleId::get().into_account();863	pub const CollectionCreationPrice: Balance = 2 * UNIQUE;864}865866impl pallet_common::Config for Runtime {867	type Event = Event;868	type Currency = Balances;869	type CollectionCreationPrice = CollectionCreationPrice;870	type TreasuryAccountId = TreasuryAccountId;871}872873impl pallet_fungible::Config for Runtime {874	type WeightInfo = pallet_fungible::weights::SubstrateWeight<Self>;875}876impl pallet_refungible::Config for Runtime {877	type WeightInfo = pallet_refungible::weights::SubstrateWeight<Self>;878}879impl pallet_nonfungible::Config for Runtime {880	type WeightInfo = pallet_nonfungible::weights::SubstrateWeight<Self>;881}882883impl pallet_unique::Config for Runtime {884	type Event = Event;885	type WeightInfo = pallet_unique::weights::SubstrateWeight<Self>;886}887888parameter_types! {889	pub const InflationBlockInterval: BlockNumber = 100; // every time per how many blocks inflation is applied890}891892/// Used for the pallet inflation893impl pallet_inflation::Config for Runtime {894	type Currency = Balances;895	type TreasuryAccountId = TreasuryAccountId;896	type InflationBlockInterval = InflationBlockInterval;897	type BlockNumberProvider = RelayChainBlockNumberProvider<Runtime>;898}899900// parameter_types! {901// 	pub MaximumSchedulerWeight: Weight = Perbill::from_percent(50) *902// 		RuntimeBlockWeights::get().max_block;903// 	pub const MaxScheduledPerBlock: u32 = 50;904// }905906type EvmSponsorshipHandler = (907	pallet_unique::UniqueEthSponsorshipHandler<Runtime>,908	pallet_evm_contract_helpers::HelpersContractSponsoring<Runtime>,909);910type SponsorshipHandler = (911	pallet_unique::UniqueSponsorshipHandler<Runtime>,912	//pallet_contract_helpers::ContractSponsorshipHandler<Runtime>,913	pallet_evm_transaction_payment::BridgeSponsorshipHandler<Runtime>,914);915916// impl pallet_unq_scheduler::Config for Runtime {917// 	type Event = Event;918// 	type Origin = Origin;919// 	type PalletsOrigin = OriginCaller;920// 	type Call = Call;921// 	type MaximumWeight = MaximumSchedulerWeight;922// 	type ScheduleOrigin = EnsureSigned<AccountId>;923// 	type MaxScheduledPerBlock = MaxScheduledPerBlock;924// 	type SponsorshipHandler = SponsorshipHandler;925// 	type WeightInfo = ();926// }927928impl pallet_evm_transaction_payment::Config for Runtime {929	type EvmSponsorshipHandler = EvmSponsorshipHandler;930	type Currency = Balances;931}932933impl pallet_charge_transaction::Config for Runtime {934	type SponsorshipHandler = SponsorshipHandler;935}936937// impl pallet_contract_helpers::Config for Runtime {938//	 type DefaultSponsoringRateLimit = DefaultSponsoringRateLimit;939// }940941parameter_types! {942	// 0x842899ECF380553E8a4de75bF534cdf6fBF64049943	pub const HelpersContractAddress: H160 = H160([944		0x84, 0x28, 0x99, 0xec, 0xf3, 0x80, 0x55, 0x3e, 0x8a, 0x4d, 0xe7, 0x5b, 0xf5, 0x34, 0xcd, 0xf6, 0xfb, 0xf6, 0x40, 0x49,945	]);946}947948impl pallet_evm_contract_helpers::Config for Runtime {949	type ContractAddress = HelpersContractAddress;950	type DefaultSponsoringRateLimit = DefaultSponsoringRateLimit;951}952953construct_runtime!(954	pub enum Runtime where955		Block = Block,956		NodeBlock = opaque::Block,957		UncheckedExtrinsic = UncheckedExtrinsic958	{959		ParachainSystem: cumulus_pallet_parachain_system::{Pallet, Call, Config, Storage, Inherent, Event<T>, ValidateUnsigned} = 20,960		ParachainInfo: parachain_info::{Pallet, Storage, Config} = 21,961962		Aura: pallet_aura::{Pallet, Config<T>} = 22,963		AuraExt: cumulus_pallet_aura_ext::{Pallet, Config} = 23,964965		Balances: pallet_balances::{Pallet, Call, Storage, Config<T>, Event<T>} = 30,966		RandomnessCollectiveFlip: pallet_randomness_collective_flip::{Pallet, Storage} = 31,967		Timestamp: pallet_timestamp::{Pallet, Call, Storage, Inherent} = 32,968		TransactionPayment: pallet_transaction_payment::{Pallet, Storage} = 33,969		Treasury: pallet_treasury::{Pallet, Call, Storage, Config, Event<T>} = 34,970		Sudo: pallet_sudo::{Pallet, Call, Storage, Config<T>, Event<T>} = 35,971		System: frame_system::{Pallet, Call, Storage, Config, Event<T>} = 36,972		Vesting: orml_vesting::{Pallet, Storage, Call, Event<T>, Config<T>} = 37,973		// Vesting: pallet_vesting::{Pallet, Call, Config<T>, Storage, Event<T>} = 37,974		// Contracts: pallet_contracts::{Pallet, Call, Storage, Event<T>} = 38,975976		// XCM helpers.977		XcmpQueue: cumulus_pallet_xcmp_queue::{Pallet, Call, Storage, Event<T>} = 50,978		PolkadotXcm: pallet_xcm::{Pallet, Call, Event<T>, Origin} = 51,979		CumulusXcm: cumulus_pallet_xcm::{Pallet, Call, Event<T>, Origin} = 52,980		DmpQueue: cumulus_pallet_dmp_queue::{Pallet, Call, Storage, Event<T>} = 53,981982		// Unique Pallets983		Inflation: pallet_inflation::{Pallet, Call, Storage} = 60,984		Unique: pallet_unique::{Pallet, Call, Storage, Event<T>} = 61,985		// Scheduler: pallet_unq_scheduler::{Pallet, Call, Storage, Event<T>} = 62,986		// free = 63987		Charging: pallet_charge_transaction::{Pallet, Call, Storage } = 64,988		// ContractHelpers: pallet_contract_helpers::{Pallet, Call, Storage} = 65,989		Common: pallet_common::{Pallet, Storage, Event<T>} = 66,990		Fungible: pallet_fungible::{Pallet, Storage} = 67,991		Refungible: pallet_refungible::{Pallet, Storage} = 68,992		Nonfungible: pallet_nonfungible::{Pallet, Storage} = 69,993994		// Frontier995		EVM: pallet_evm::{Pallet, Config, Call, Storage, Event<T>} = 100,996		Ethereum: pallet_ethereum::{Pallet, Config, Call, Storage, Event, Origin} = 101,997998		EvmCoderSubstrate: pallet_evm_coder_substrate::{Pallet, Storage} = 150,999		EvmContractHelpers: pallet_evm_contract_helpers::{Pallet, Storage} = 151,1000		EvmTransactionPayment: pallet_evm_transaction_payment::{Pallet} = 152,1001		EvmMigration: pallet_evm_migration::{Pallet, Call, Storage} = 153,1002	}1003);10041005pub struct TransactionConverter;10061007impl fp_rpc::ConvertTransaction<UncheckedExtrinsic> for TransactionConverter {1008	fn convert_transaction(&self, transaction: pallet_ethereum::Transaction) -> UncheckedExtrinsic {1009		UncheckedExtrinsic::new_unsigned(1010			pallet_ethereum::Call::<Runtime>::transact { transaction }.into(),1011		)1012	}1013}10141015impl fp_rpc::ConvertTransaction<opaque::UncheckedExtrinsic> for TransactionConverter {1016	fn convert_transaction(1017		&self,1018		transaction: pallet_ethereum::Transaction,1019	) -> opaque::UncheckedExtrinsic {1020		let extrinsic = UncheckedExtrinsic::new_unsigned(1021			pallet_ethereum::Call::<Runtime>::transact { transaction }.into(),1022		);1023		let encoded = extrinsic.encode();1024		opaque::UncheckedExtrinsic::decode(&mut &encoded[..])1025			.expect("Encoded extrinsic is always valid")1026	}1027}10281029/// The address format for describing accounts.1030pub type Address = sp_runtime::MultiAddress<AccountId, ()>;1031/// Block header type as expected by this runtime.1032pub type Header = generic::Header<BlockNumber, BlakeTwo256>;1033/// Block type as expected by this runtime.1034pub type Block = generic::Block<Header, UncheckedExtrinsic>;1035/// A Block signed with a Justification1036pub type SignedBlock = generic::SignedBlock<Block>;1037/// BlockId type as expected by this runtime.1038pub type BlockId = generic::BlockId<Block>;1039/// The SignedExtension to the basic transaction logic.1040pub type SignedExtra = (1041	frame_system::CheckSpecVersion<Runtime>,1042	// system::CheckTxVersion<Runtime>,1043	frame_system::CheckGenesis<Runtime>,1044	frame_system::CheckEra<Runtime>,1045	frame_system::CheckNonce<Runtime>,1046	frame_system::CheckWeight<Runtime>,1047	pallet_charge_transaction::ChargeTransactionPayment<Runtime>,1048	//pallet_contract_helpers::ContractHelpersExtension<Runtime>,1049);1050/// Unchecked extrinsic type as expected by this runtime.1051pub type UncheckedExtrinsic =1052	fp_self_contained::UncheckedExtrinsic<Address, Call, Signature, SignedExtra>;1053/// Extrinsic type that has already been checked.1054pub type CheckedExtrinsic = fp_self_contained::CheckedExtrinsic<AccountId, Call, SignedExtra, H160>;1055/// Executive: handles dispatch to the various modules.1056pub type Executive = frame_executive::Executive<1057	Runtime,1058	Block,1059	frame_system::ChainContext<Runtime>,1060	Runtime,1061	AllPalletsReversedWithSystemFirst,1062>;10631064impl_opaque_keys! {1065	pub struct SessionKeys {1066		pub aura: Aura,1067	}1068}10691070impl fp_self_contained::SelfContainedCall for Call {1071	type SignedInfo = H160;10721073	fn is_self_contained(&self) -> bool {1074		match self {1075			Call::Ethereum(call) => call.is_self_contained(),1076			_ => false,1077		}1078	}10791080	fn check_self_contained(&self) -> Option<Result<Self::SignedInfo, TransactionValidityError>> {1081		match self {1082			Call::Ethereum(call) => call.check_self_contained(),1083			_ => None,1084		}1085	}10861087	fn validate_self_contained(&self, info: &Self::SignedInfo) -> Option<TransactionValidity> {1088		match self {1089			Call::Ethereum(call) => call.validate_self_contained(info),1090			_ => None,1091		}1092	}10931094	fn pre_dispatch_self_contained(1095		&self,1096		info: &Self::SignedInfo,1097	) -> Option<Result<(), TransactionValidityError>> {1098		match self {1099			Call::Ethereum(call) => call.pre_dispatch_self_contained(info),1100			_ => None,1101		}1102	}11031104	fn apply_self_contained(1105		self,1106		info: Self::SignedInfo,1107	) -> Option<sp_runtime::DispatchResultWithInfo<PostDispatchInfoOf<Self>>> {1108		match self {1109			call @ Call::Ethereum(pallet_ethereum::Call::transact { .. }) => Some(call.dispatch(1110				Origin::from(pallet_ethereum::RawOrigin::EthereumTransaction(info)),1111			)),1112			_ => None,1113		}1114	}1115}11161117macro_rules! dispatch_unique_runtime {1118	($collection:ident.$method:ident($($name:ident),*)) => {{1119		use pallet_unique::dispatch::Dispatched;11201121		let collection = Dispatched::dispatch(<pallet_common::CollectionHandle<Runtime>>::try_get($collection)?);1122		let dispatch = collection.as_dyn();11231124		Ok(dispatch.$method($($name),*))1125	}};1126}11271128impl_common_runtime_apis!();11291130struct CheckInherents;11311132impl cumulus_pallet_parachain_system::CheckInherents<Block> for CheckInherents {1133	fn check_inherents(1134		block: &Block,1135		relay_state_proof: &cumulus_pallet_parachain_system::RelayChainStateProof,1136	) -> sp_inherents::CheckInherentsResult {1137		let relay_chain_slot = relay_state_proof1138			.read_slot()1139			.expect("Could not read the relay chain slot from the proof");11401141		let inherent_data =1142			cumulus_primitives_timestamp::InherentDataProvider::from_relay_chain_slot_and_duration(1143				relay_chain_slot,1144				sp_std::time::Duration::from_secs(6),1145			)1146			.create_inherent_data()1147			.expect("Could not create the timestamp inherent data");11481149		inherent_data.check_extrinsics(block)1150	}1151}11521153cumulus_pallet_parachain_system::register_validate_block!(1154	Runtime = Runtime,1155	BlockExecutor = cumulus_pallet_aura_ext::BlockExecutor::<Runtime, Executive>,1156	CheckInherents = CheckInherents,1157);
modifiedruntime/quartz/src/lib.rsdiffbeforeafterboth
--- a/runtime/quartz/src/lib.rs
+++ b/runtime/quartz/src/lib.rs
@@ -48,7 +48,7 @@
 };
 // A few exports that help ease life for downstream crates.
 pub use pallet_balances::Call as BalancesCall;
-pub use pallet_evm::{EnsureAddressTruncated, HashedAddressMapping, Runner};
+pub use pallet_evm::{EnsureAddressTruncated, HashedAddressMapping, Runner, account::CrossAccountId as _};
 pub use frame_support::{
 	construct_runtime, match_type,
 	dispatch::DispatchResult,
modifiedruntime/unique/src/lib.rsdiffbeforeafterboth
--- a/runtime/unique/src/lib.rs
+++ b/runtime/unique/src/lib.rs
@@ -48,7 +48,7 @@
 };
 // A few exports that help ease life for downstream crates.
 pub use pallet_balances::Call as BalancesCall;
-pub use pallet_evm::{EnsureAddressTruncated, HashedAddressMapping, Runner};
+pub use pallet_evm::{EnsureAddressTruncated, HashedAddressMapping, Runner, account::CrossAccountId as _};
 pub use frame_support::{
 	construct_runtime, match_type,
 	dispatch::DispatchResult,
modifiedtests/src/eth/contractSponsoring.test.tsdiffbeforeafterboth
--- a/tests/src/eth/contractSponsoring.test.ts
+++ b/tests/src/eth/contractSponsoring.test.ts
@@ -27,10 +27,14 @@
   collectionIdToAddress,
   GAS_ARGS,
   normalizeEvents,
+  subToEth,
+  executeEthTxOnSub,
 } from './util/helpers';
 import {
+  addCollectionAdminExpectSuccess,
   createCollectionExpectSuccess,
   getCreateCollectionResult,
+  transferBalanceTo,
 } from '../util/helpers';
 import nonFungibleAbi from './nonFungibleAbi.json';
 import {
@@ -293,4 +297,34 @@
     const [alicesBalanceAfter] = await getBalance(api, [alicesPublicKey]);
     expect(alicesBalanceAfter < alicesBalanceBefore).to.be.true;
   });
+
+
+  itWeb3('Check that transaction via EVM spend money from substrate address', async ({api, web3}) => {
+    const owner = privateKey('//Alice');
+    const user = privateKey(`//User/${Date.now()}`);
+    const userEth = subToEth(user.address);
+    const collectionId = await createCollectionExpectSuccess();
+    await addCollectionAdminExpectSuccess(owner, collectionId, {Ethereum: userEth});
+    await transferBalanceTo(api, owner, user.address);
+
+    const address = collectionIdToAddress(collectionId);
+    const contract = new web3.eth.Contract(nonFungibleAbi as any, address, {from: userEth, ...GAS_ARGS});
+
+    const [userBalanceBefore] = await getBalance(api, [user.address]);
+
+    {
+      const nextTokenId = await contract.methods.nextTokenId().call();
+      expect(nextTokenId).to.be.equal('1');
+      await executeEthTxOnSub(web3, api, user, contract, m => m.mintWithTokenURI(
+        userEth,
+        nextTokenId,
+        'Test URI',
+      ));
+
+      expect(await contract.methods.tokenURI(nextTokenId).call()).to.be.equal('Test URI');
+    }
+
+    const [userBalanceAfter] = await getBalance(api, [user.address]);
+    expect(userBalanceAfter < userBalanceBefore).to.be.true;
+  });
 });
modifiedtests/src/eth/marketplace/marketplace.test.tsdiffbeforeafterboth
--- a/tests/src/eth/marketplace/marketplace.test.ts
+++ b/tests/src/eth/marketplace/marketplace.test.ts
@@ -15,18 +15,29 @@
 // along with Unique Network. If not, see <http://www.gnu.org/licenses/>.
 
 import {readFile} from 'fs/promises';
-import {getBalanceSingle, transferBalanceExpectSuccess} from '../../substrate/get-balance';
+import {getBalanceSingle} from '../../substrate/get-balance';
 import privateKey from '../../substrate/privateKey';
-import {addToAllowListExpectSuccess, confirmSponsorshipExpectSuccess, createCollectionExpectSuccess, createFungibleItemExpectSuccess, createItemExpectSuccess, getTokenOwner, setCollectionLimitsExpectSuccess, setCollectionSponsorExpectSuccess, transferExpectSuccess, transferFromExpectSuccess} from '../../util/helpers';
+import {
+  addToAllowListExpectSuccess, 
+  confirmSponsorshipExpectSuccess, 
+  createCollectionExpectSuccess, 
+  createItemExpectSuccess, 
+  getTokenOwner,
+  setCollectionLimitsExpectSuccess, 
+  setCollectionSponsorExpectSuccess, 
+  transferExpectSuccess, 
+  transferFromExpectSuccess,
+  transferBalanceTo,
+} from '../../util/helpers';
 import {collectionIdToAddress, contractHelpers, createEthAccountWithBalance, executeEthTxOnSub, GAS_ARGS, itWeb3, SponsoringMode, subToEth, subToEthLowercase, transferBalanceToEth} from '../util/helpers';
 import {evmToAddress} from '@polkadot/util-crypto';
 import nonFungibleAbi from '../nonFungibleAbi.json';
-import fungibleAbi from '../fungibleAbi.json';
+
 import {expect} from 'chai';
 
 const PRICE = 2000n;
 
-describe('Matcher contract usage', () => {
+describe.only('Matcher contract usage', () => {
   itWeb3('With UNQ', async ({api, web3}) => {
     const alice = privateKey('//Alice');
     const matcherOwner = await createEthAccountWithBalance(api, web3);
@@ -87,32 +98,39 @@
     expect(await getTokenOwner(api, collectionId, tokenId)).to.be.deep.equal({Substrate: alice.address});
   });
 
-  // selling for custom tokens excluded from release
-  itWeb3.skip('With custom ERC20', async ({api, web3}) => {
+
+  itWeb3('With escrow', async ({api, web3}) => {
     const alice = privateKey('//Alice');
     const matcherOwner = await createEthAccountWithBalance(api, web3);
+    const escrow = await createEthAccountWithBalance(api, web3);
     const matcherContract = new web3.eth.Contract(JSON.parse((await readFile(`${__dirname}/MarketPlace.abi`)).toString()), undefined, {
       from: matcherOwner,
       ...GAS_ARGS,
     });
-    const matcher = await matcherContract.deploy({data: (await readFile(`${__dirname}/MarketPlace.bin`)).toString(), arguments: [matcherOwner]}).send({from: matcherOwner});
+    const matcher = await matcherContract.deploy({data: (await readFile(`${__dirname}/MarketPlace.bin`)).toString(), arguments: [matcherOwner]}).send({from: matcherOwner, gas: 10000000});
+    await matcher.methods.setEscrow(escrow).send({from: matcherOwner});
+    const helpers = contractHelpers(web3, matcherOwner);
+    await helpers.methods.setSponsoringMode(matcher.options.address, SponsoringMode.Allowlisted).send({from: matcherOwner});
+    await helpers.methods.setSponsoringRateLimit(matcher.options.address, 1).send({from: matcherOwner});
+    await transferBalanceToEth(api, alice, matcher.options.address);
 
     const collectionId = await createCollectionExpectSuccess({mode: {type: 'NFT'}});
+    await setCollectionLimitsExpectSuccess(alice, collectionId, {sponsorApproveTimeout: 1});
     const evmCollection = new web3.eth.Contract(nonFungibleAbi as any, collectionIdToAddress(collectionId), {from: matcherOwner});
+    await setCollectionSponsorExpectSuccess(collectionId, alice.address);
+    await transferBalanceToEth(api, alice, subToEth(alice.address));
+    await confirmSponsorshipExpectSuccess(collectionId);
 
-    const fungibleId = await createCollectionExpectSuccess({mode: {type: 'Fungible', decimalPoints: 0}});
-    const evmFungible = new web3.eth.Contract(fungibleAbi as any, collectionIdToAddress(fungibleId), {from: matcherOwner, ...GAS_ARGS});
-    await createFungibleItemExpectSuccess(alice, fungibleId, {Value: PRICE}, {Ethereum: subToEth(alice.address)});
+    await helpers.methods.toggleAllowed(matcher.options.address, subToEth(alice.address), true).send({from: matcherOwner});
+    await addToAllowListExpectSuccess(alice, collectionId, evmToAddress(subToEth(alice.address)));
 
-    const seller = privateKey('//Bob');
+    const seller = privateKey(`//Seller/${Date.now()}`);
+    await helpers.methods.toggleAllowed(matcher.options.address, subToEth(seller.address), true).send({from: matcherOwner});
 
     const tokenId = await createItemExpectSuccess(alice, collectionId, 'NFT', seller.address);
 
     // To transfer item to matcher it first needs to be transfered to EVM account of bob
     await transferExpectSuccess(collectionId, tokenId, seller, {Ethereum: subToEth(seller.address)});
-    // Fees will be paid from EVM account, so we should have some balance here
-    await transferBalanceExpectSuccess(api, seller, evmToAddress(subToEth(seller.address)), 10n ** 18n);
-    await transferBalanceExpectSuccess(api, alice, evmToAddress(subToEth(alice.address)), 10n ** 18n);
 
     // Token is owned by seller initially
     expect(await getTokenOwner(api, collectionId, tokenId)).to.be.deep.equal({Ethereum: subToEthLowercase(seller.address)});
@@ -120,66 +138,55 @@
     // Ask
     {
       await executeEthTxOnSub(web3, api, seller, evmCollection, m => m.approve(matcher.options.address, tokenId));
-      await executeEthTxOnSub(web3, api, seller, matcher, m => m.addAsk(PRICE, evmFungible.options.address, evmCollection.options.address, tokenId, 1));
+      await executeEthTxOnSub(web3, api, seller, matcher, m => m.addAsk(PRICE, '0x0000000000000000000000000000000000000001', evmCollection.options.address, tokenId));
     }
 
     // Token is transferred to matcher
     expect(await getTokenOwner(api, collectionId, tokenId)).to.be.deep.equal({Ethereum: matcher.options.address.toLowerCase()});
 
+    // Give buyer KSM
+    await matcher.methods.depositKSM(PRICE, subToEth(alice.address)).send({from: escrow});
+
     // Buy
     {
-      const sellerBalanceBeforePurchase = BigInt(await evmFungible.methods.balanceOf(subToEth(seller.address)).call());
-      const buyerBalanceBeforePurchase = BigInt(await evmFungible.methods.balanceOf(subToEth(alice.address)).call());
+      expect(await matcher.methods.balanceKSM(subToEth(seller.address)).call()).to.be.equal('0');
+      expect(await matcher.methods.balanceKSM(subToEth(alice.address)).call()).to.be.equal(PRICE.toString());
 
-      await executeEthTxOnSub(web3, api, alice, evmFungible, m => m.approve(matcher.options.address, PRICE));
-      // There is two functions named 'buy', so we should provide full signature
-      await executeEthTxOnSub(web3, api, alice, matcher, m =>
-        m['buy(address,uint256,address,uint256)'](evmCollection.options.address, tokenId, evmFungible.options.address, PRICE));
+      await executeEthTxOnSub(web3, api, alice, matcher, m => m.buyKSM(evmCollection.options.address, tokenId, subToEth(alice.address), subToEth(alice.address)));
 
-      // Approved price is removed from buyer balance, and added to seller
-      expect(BigInt(await evmFungible.methods.balanceOf(subToEth(seller.address)).call()) - sellerBalanceBeforePurchase === PRICE);
-      expect(buyerBalanceBeforePurchase - BigInt(await evmFungible.methods.balanceOf(subToEth(alice.address)).call()) === PRICE);
+      // Price is removed from buyer balance, and added to seller
+      expect(await matcher.methods.balanceKSM(subToEth(alice.address)).call()).to.be.equal('0');
+      expect(await matcher.methods.balanceKSM(subToEth(seller.address)).call()).to.be.equal(PRICE.toString());
     }
 
     // Token is transferred to evm account of alice
     expect(await getTokenOwner(api, collectionId, tokenId)).to.be.deep.equal({Ethereum: subToEthLowercase(alice.address)});
-
 
     // Transfer token to substrate side of alice
     await transferFromExpectSuccess(collectionId, tokenId, alice, {Ethereum: subToEth(alice.address)}, {Substrate: alice.address});
 
-    // Token is transferred to substrate account of alice
+    // Token is transferred to substrate account of alice, seller received funds
     expect(await getTokenOwner(api, collectionId, tokenId)).to.be.deep.equal({Substrate: alice.address});
   });
 
-  itWeb3('With escrow', async ({api, web3}) => {
+
+  itWeb3('Sell tokens from substrate user via EVM contract', async ({api, web3}) => {
     const alice = privateKey('//Alice');
     const matcherOwner = await createEthAccountWithBalance(api, web3);
-    const escrow = await createEthAccountWithBalance(api, web3);
     const matcherContract = new web3.eth.Contract(JSON.parse((await readFile(`${__dirname}/MarketPlace.abi`)).toString()), undefined, {
       from: matcherOwner,
       ...GAS_ARGS,
     });
-    const matcher = await matcherContract.deploy({data: (await readFile(`${__dirname}/MarketPlace.bin`)).toString(), arguments: [matcherOwner]}).send({from: matcherOwner, gas: 10000000});
-    await matcher.methods.setEscrow(escrow).send({from: matcherOwner});
-    const helpers = contractHelpers(web3, matcherOwner);
-    await helpers.methods.setSponsoringMode(matcher.options.address, SponsoringMode.Allowlisted).send({from: matcherOwner});
-    await helpers.methods.setSponsoringRateLimit(matcher.options.address, 1).send({from: matcherOwner});
+    const matcher = await matcherContract.deploy({data: (await readFile(`${__dirname}/MarketPlace.bin`)).toString(), arguments:[matcherOwner]}).send({from: matcherOwner});
     await transferBalanceToEth(api, alice, matcher.options.address);
 
     const collectionId = await createCollectionExpectSuccess({mode: {type: 'NFT'}});
     await setCollectionLimitsExpectSuccess(alice, collectionId, {sponsorApproveTimeout: 1});
     const evmCollection = new web3.eth.Contract(nonFungibleAbi as any, collectionIdToAddress(collectionId), {from: matcherOwner});
-    await setCollectionSponsorExpectSuccess(collectionId, alice.address);
-    await transferBalanceToEth(api, alice, subToEth(alice.address));
-    await confirmSponsorshipExpectSuccess(collectionId);
-
-    await helpers.methods.toggleAllowed(matcher.options.address, subToEth(alice.address), true).send({from: matcherOwner});
-    await addToAllowListExpectSuccess(alice, collectionId, evmToAddress(subToEth(alice.address)));
 
     const seller = privateKey(`//Seller/${Date.now()}`);
-    await helpers.methods.toggleAllowed(matcher.options.address, subToEth(seller.address), true).send({from: matcherOwner});
-
+    await transferBalanceTo(api, alice, seller.address);
+    
     const tokenId = await createItemExpectSuccess(alice, collectionId, 'NFT', seller.address);
 
     // To transfer item to matcher it first needs to be transfered to EVM account of bob
@@ -197,19 +204,11 @@
     // Token is transferred to matcher
     expect(await getTokenOwner(api, collectionId, tokenId)).to.be.deep.equal({Ethereum: matcher.options.address.toLowerCase()});
 
-    // Give buyer KSM
-    await matcher.methods.depositKSM(PRICE, subToEth(alice.address)).send({from: escrow});
-
     // Buy
     {
-      expect(await matcher.methods.balanceKSM(subToEth(seller.address)).call()).to.be.equal('0');
-      expect(await matcher.methods.balanceKSM(subToEth(alice.address)).call()).to.be.equal(PRICE.toString());
-
-      await executeEthTxOnSub(web3, api, alice, matcher, m => m.buyKSM(evmCollection.options.address, tokenId, subToEth(alice.address), subToEth(alice.address)));
-
-      // Price is removed from buyer balance, and added to seller
-      expect(await matcher.methods.balanceKSM(subToEth(alice.address)).call()).to.be.equal('0');
-      expect(await matcher.methods.balanceKSM(subToEth(seller.address)).call()).to.be.equal(PRICE.toString());
+      const sellerBalanceBeforePurchase = await getBalanceSingle(api, seller.address);
+      await executeEthTxOnSub(web3, api, alice, matcher, m => m.buy(evmCollection.options.address, tokenId), {value: PRICE});
+      expect(await getBalanceSingle(api, seller.address) - sellerBalanceBeforePurchase === PRICE);
     }
 
     // Token is transferred to evm account of alice
modifiedtests/src/interfaces/augment-api-errors.tsdiffbeforeafterboth
--- a/tests/src/interfaces/augment-api-errors.ts
+++ b/tests/src/interfaces/augment-api-errors.ts
@@ -105,6 +105,10 @@
        **/
       NoPermission: AugmentedError<ApiType>;
       /**
+       * Not sufficient founds to perform action
+       **/
+      NotSufficientFounds: AugmentedError<ApiType>;
+      /**
        * Tried to enable permissions which are only permitted to be disabled
        **/
       OwnerPermissionsCantBeReverted: AugmentedError<ApiType>;
modifiedtests/src/interfaces/augment-api-events.tsdiffbeforeafterboth
--- a/tests/src/interfaces/augment-api-events.ts
+++ b/tests/src/interfaces/augment-api-events.ts
@@ -4,7 +4,7 @@
 import type { ApiTypes } from '@polkadot/api-base/types';
 import type { Null, Option, Result, U256, U8aFixed, u128, u32, u64, u8 } from '@polkadot/types-codec';
 import type { AccountId32, H160, H256 } from '@polkadot/types/interfaces/runtime';
-import type { EthereumLog, EvmCoreErrorExitReason, FrameSupportTokensMiscBalanceStatus, FrameSupportWeightsDispatchInfo, OrmlVestingVestingSchedule, PalletCommonAccountBasicCrossAccountIdRepr, SpRuntimeDispatchError, UpDataStructsAccessMode, XcmV1MultiLocation, XcmV2Response, XcmV2TraitsError, XcmV2TraitsOutcome, XcmV2Xcm, XcmVersionedMultiAssets, XcmVersionedMultiLocation } from '@polkadot/types/lookup';
+import type { EthereumLog, EvmCoreErrorExitReason, FrameSupportTokensMiscBalanceStatus, FrameSupportWeightsDispatchInfo, OrmlVestingVestingSchedule, PalletEvmAccountBasicCrossAccountIdRepr, SpRuntimeDispatchError, UpDataStructsAccessMode, XcmV1MultiLocation, XcmV2Response, XcmV2TraitsError, XcmV2TraitsOutcome, XcmV2Xcm, XcmVersionedMultiAssets, XcmVersionedMultiLocation } from '@polkadot/types/lookup';
 
 declare module '@polkadot/api-base/types/events' {
   export interface AugmentedEvents<ApiType extends ApiTypes> {
@@ -68,7 +68,7 @@
        * 
        * * amount
        **/
-      Approved: AugmentedEvent<ApiType, [u32, u32, PalletCommonAccountBasicCrossAccountIdRepr, PalletCommonAccountBasicCrossAccountIdRepr, u128]>;
+      Approved: AugmentedEvent<ApiType, [u32, u32, PalletEvmAccountBasicCrossAccountIdRepr, PalletEvmAccountBasicCrossAccountIdRepr, u128]>;
       /**
        * New collection was created
        * 
@@ -102,7 +102,7 @@
        * 
        * * amount: Always 1 for NFT
        **/
-      ItemCreated: AugmentedEvent<ApiType, [u32, u32, PalletCommonAccountBasicCrossAccountIdRepr, u128]>;
+      ItemCreated: AugmentedEvent<ApiType, [u32, u32, PalletEvmAccountBasicCrossAccountIdRepr, u128]>;
       /**
        * Collection item was burned.
        * 
@@ -116,7 +116,7 @@
        * 
        * * amount: Always 1 for NFT
        **/
-      ItemDestroyed: AugmentedEvent<ApiType, [u32, u32, PalletCommonAccountBasicCrossAccountIdRepr, u128]>;
+      ItemDestroyed: AugmentedEvent<ApiType, [u32, u32, PalletEvmAccountBasicCrossAccountIdRepr, u128]>;
       /**
        * Item was transferred
        * 
@@ -130,7 +130,7 @@
        * 
        * * amount: Always 1 for NFT
        **/
-      Transfer: AugmentedEvent<ApiType, [u32, u32, PalletCommonAccountBasicCrossAccountIdRepr, PalletCommonAccountBasicCrossAccountIdRepr, u128]>;
+      Transfer: AugmentedEvent<ApiType, [u32, u32, PalletEvmAccountBasicCrossAccountIdRepr, PalletEvmAccountBasicCrossAccountIdRepr, u128]>;
       /**
        * Generic event
        **/
@@ -483,7 +483,7 @@
        * 
        * * user:  Address.
        **/
-      AllowListAddressAdded: AugmentedEvent<ApiType, [u32, PalletCommonAccountBasicCrossAccountIdRepr]>;
+      AllowListAddressAdded: AugmentedEvent<ApiType, [u32, PalletEvmAccountBasicCrossAccountIdRepr]>;
       /**
        * Address was remove from allow list
        * 
@@ -493,7 +493,7 @@
        * 
        * * user:  Address.
        **/
-      AllowListAddressRemoved: AugmentedEvent<ApiType, [u32, PalletCommonAccountBasicCrossAccountIdRepr]>;
+      AllowListAddressRemoved: AugmentedEvent<ApiType, [u32, PalletEvmAccountBasicCrossAccountIdRepr]>;
       /**
        * Collection admin was added
        * 
@@ -503,7 +503,7 @@
        * 
        * * admin:  Admin address.
        **/
-      CollectionAdminAdded: AugmentedEvent<ApiType, [u32, PalletCommonAccountBasicCrossAccountIdRepr]>;
+      CollectionAdminAdded: AugmentedEvent<ApiType, [u32, PalletEvmAccountBasicCrossAccountIdRepr]>;
       /**
        * Collection admin was removed
        * 
@@ -513,7 +513,7 @@
        * 
        * * admin:  Admin address.
        **/
-      CollectionAdminRemoved: AugmentedEvent<ApiType, [u32, PalletCommonAccountBasicCrossAccountIdRepr]>;
+      CollectionAdminRemoved: AugmentedEvent<ApiType, [u32, PalletEvmAccountBasicCrossAccountIdRepr]>;
       /**
        * Collection limits was set
        * 
modifiedtests/src/interfaces/augment-api-query.tsdiffbeforeafterboth
--- a/tests/src/interfaces/augment-api-query.ts
+++ b/tests/src/interfaces/augment-api-query.ts
@@ -5,7 +5,7 @@
 import type { BTreeMap, Bytes, Option, U256, Vec, bool, u128, u16, u32, u64 } 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, EthereumReceiptReceiptV3, EthereumTransactionTransactionV2, FpRpcTransactionStatus, FrameSupportWeightsPerDispatchClassU64, FrameSystemAccountInfo, FrameSystemEventRecord, FrameSystemLastRuntimeUpgradeInfo, FrameSystemPhase, OrmlVestingVestingSchedule, PalletBalancesAccountData, PalletBalancesBalanceLock, PalletBalancesReleases, PalletBalancesReserveData, PalletCommonAccountBasicCrossAccountIdRepr, PalletEvmContractHelpersSponsoringModeT, PalletNonfungibleItemData, PalletRefungibleItemData, PalletTransactionPaymentReleases, PalletTreasuryProposal, PolkadotCorePrimitivesOutboundHrmpMessage, PolkadotPrimitivesV1AbridgedHostConfiguration, PolkadotPrimitivesV1PersistedValidationData, PolkadotPrimitivesV1UpgradeRestriction, SpRuntimeDigest, UpDataStructsCollection, UpDataStructsCollectionStats } from '@polkadot/types/lookup';
+import type { CumulusPalletDmpQueueConfigData, CumulusPalletDmpQueuePageIndexData, CumulusPalletParachainSystemRelayStateSnapshotMessagingStateSnapshot, CumulusPalletXcmpQueueInboundChannelDetails, CumulusPalletXcmpQueueOutboundChannelDetails, CumulusPalletXcmpQueueQueueConfigData, EthereumBlock, EthereumReceiptReceiptV3, EthereumTransactionTransactionV2, FpRpcTransactionStatus, FrameSupportWeightsPerDispatchClassU64, FrameSystemAccountInfo, FrameSystemEventRecord, FrameSystemLastRuntimeUpgradeInfo, FrameSystemPhase, OrmlVestingVestingSchedule, PalletBalancesAccountData, PalletBalancesBalanceLock, PalletBalancesReleases, PalletBalancesReserveData, PalletEvmAccountBasicCrossAccountIdRepr, PalletEvmContractHelpersSponsoringModeT, PalletNonfungibleItemData, PalletRefungibleItemData, PalletTransactionPaymentReleases, PalletTreasuryProposal, PolkadotCorePrimitivesOutboundHrmpMessage, PolkadotPrimitivesV1AbridgedHostConfiguration, PolkadotPrimitivesV1PersistedValidationData, PolkadotPrimitivesV1UpgradeRestriction, SpRuntimeDigest, UpDataStructsCollection, UpDataStructsCollectionStats } from '@polkadot/types/lookup';
 import type { Observable } from '@polkadot/types/types';
 
 declare module '@polkadot/api-base/types/storage' {
@@ -73,7 +73,7 @@
       /**
        * Allowlisted collection users
        **/
-      allowlist: AugmentedQuery<ApiType, (arg1: u32 | AnyNumber | Uint8Array, arg2: PalletCommonAccountBasicCrossAccountIdRepr | { Substrate: any } | { Ethereum: any } | string | Uint8Array) => Observable<bool>, [u32, PalletCommonAccountBasicCrossAccountIdRepr]> & QueryableStorageEntry<ApiType, [u32, PalletCommonAccountBasicCrossAccountIdRepr]>;
+      allowlist: AugmentedQuery<ApiType, (arg1: u32 | AnyNumber | Uint8Array, arg2: PalletEvmAccountBasicCrossAccountIdRepr | { Substrate: any } | { Ethereum: any } | string | Uint8Array) => Observable<bool>, [u32, PalletEvmAccountBasicCrossAccountIdRepr]> & QueryableStorageEntry<ApiType, [u32, PalletEvmAccountBasicCrossAccountIdRepr]>;
       /**
        * Collection info
        **/
@@ -87,7 +87,7 @@
       /**
        * List of collection admins
        **/
-      isAdmin: AugmentedQuery<ApiType, (arg1: u32 | AnyNumber | Uint8Array, arg2: PalletCommonAccountBasicCrossAccountIdRepr | { Substrate: any } | { Ethereum: any } | string | Uint8Array) => Observable<bool>, [u32, PalletCommonAccountBasicCrossAccountIdRepr]> & QueryableStorageEntry<ApiType, [u32, PalletCommonAccountBasicCrossAccountIdRepr]>;
+      isAdmin: AugmentedQuery<ApiType, (arg1: u32 | AnyNumber | Uint8Array, arg2: PalletEvmAccountBasicCrossAccountIdRepr | { Substrate: any } | { Ethereum: any } | string | Uint8Array) => Observable<bool>, [u32, PalletEvmAccountBasicCrossAccountIdRepr]> & QueryableStorageEntry<ApiType, [u32, PalletEvmAccountBasicCrossAccountIdRepr]>;
       /**
        * Generic query
        **/
@@ -173,8 +173,8 @@
       [key: string]: QueryableStorageEntry<ApiType>;
     };
     fungible: {
-      allowance: AugmentedQuery<ApiType, (arg1: u32 | AnyNumber | Uint8Array, arg2: PalletCommonAccountBasicCrossAccountIdRepr | { Substrate: any } | { Ethereum: any } | string | Uint8Array, arg3: PalletCommonAccountBasicCrossAccountIdRepr | { Substrate: any } | { Ethereum: any } | string | Uint8Array) => Observable<u128>, [u32, PalletCommonAccountBasicCrossAccountIdRepr, PalletCommonAccountBasicCrossAccountIdRepr]> & QueryableStorageEntry<ApiType, [u32, PalletCommonAccountBasicCrossAccountIdRepr, PalletCommonAccountBasicCrossAccountIdRepr]>;
-      balance: AugmentedQuery<ApiType, (arg1: u32 | AnyNumber | Uint8Array, arg2: PalletCommonAccountBasicCrossAccountIdRepr | { Substrate: any } | { Ethereum: any } | string | Uint8Array) => Observable<u128>, [u32, PalletCommonAccountBasicCrossAccountIdRepr]> & QueryableStorageEntry<ApiType, [u32, PalletCommonAccountBasicCrossAccountIdRepr]>;
+      allowance: AugmentedQuery<ApiType, (arg1: u32 | AnyNumber | Uint8Array, arg2: PalletEvmAccountBasicCrossAccountIdRepr | { Substrate: any } | { Ethereum: any } | string | Uint8Array, arg3: PalletEvmAccountBasicCrossAccountIdRepr | { Substrate: any } | { Ethereum: any } | string | Uint8Array) => Observable<u128>, [u32, PalletEvmAccountBasicCrossAccountIdRepr, PalletEvmAccountBasicCrossAccountIdRepr]> & QueryableStorageEntry<ApiType, [u32, PalletEvmAccountBasicCrossAccountIdRepr, PalletEvmAccountBasicCrossAccountIdRepr]>;
+      balance: AugmentedQuery<ApiType, (arg1: u32 | AnyNumber | Uint8Array, arg2: PalletEvmAccountBasicCrossAccountIdRepr | { Substrate: any } | { Ethereum: any } | string | Uint8Array) => Observable<u128>, [u32, PalletEvmAccountBasicCrossAccountIdRepr]> & QueryableStorageEntry<ApiType, [u32, PalletEvmAccountBasicCrossAccountIdRepr]>;
       totalSupply: AugmentedQuery<ApiType, (arg: u32 | AnyNumber | Uint8Array) => Observable<u128>, [u32]> & QueryableStorageEntry<ApiType, [u32]>;
       /**
        * Generic query
@@ -208,12 +208,12 @@
       [key: string]: QueryableStorageEntry<ApiType>;
     };
     nonfungible: {
-      accountBalance: AugmentedQuery<ApiType, (arg1: u32 | AnyNumber | Uint8Array, arg2: PalletCommonAccountBasicCrossAccountIdRepr | { Substrate: any } | { Ethereum: any } | string | Uint8Array) => Observable<u32>, [u32, PalletCommonAccountBasicCrossAccountIdRepr]> & QueryableStorageEntry<ApiType, [u32, PalletCommonAccountBasicCrossAccountIdRepr]>;
-      allowance: AugmentedQuery<ApiType, (arg1: u32 | AnyNumber | Uint8Array, arg2: u32 | AnyNumber | Uint8Array) => Observable<Option<PalletCommonAccountBasicCrossAccountIdRepr>>, [u32, u32]> & QueryableStorageEntry<ApiType, [u32, u32]>;
+      accountBalance: AugmentedQuery<ApiType, (arg1: u32 | AnyNumber | Uint8Array, arg2: PalletEvmAccountBasicCrossAccountIdRepr | { Substrate: any } | { Ethereum: any } | string | Uint8Array) => Observable<u32>, [u32, PalletEvmAccountBasicCrossAccountIdRepr]> & QueryableStorageEntry<ApiType, [u32, PalletEvmAccountBasicCrossAccountIdRepr]>;
+      allowance: AugmentedQuery<ApiType, (arg1: u32 | AnyNumber | Uint8Array, arg2: u32 | AnyNumber | Uint8Array) => Observable<Option<PalletEvmAccountBasicCrossAccountIdRepr>>, [u32, u32]> & QueryableStorageEntry<ApiType, [u32, u32]>;
       /**
        * Used to enumerate tokens owned by account
        **/
-      owned: AugmentedQuery<ApiType, (arg1: u32 | AnyNumber | Uint8Array, arg2: PalletCommonAccountBasicCrossAccountIdRepr | { Substrate: any } | { Ethereum: any } | string | Uint8Array, arg3: u32 | AnyNumber | Uint8Array) => Observable<bool>, [u32, PalletCommonAccountBasicCrossAccountIdRepr, u32]> & QueryableStorageEntry<ApiType, [u32, PalletCommonAccountBasicCrossAccountIdRepr, u32]>;
+      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]>;
       tokenData: AugmentedQuery<ApiType, (arg1: u32 | AnyNumber | Uint8Array, arg2: u32 | AnyNumber | Uint8Array) => Observable<Option<PalletNonfungibleItemData>>, [u32, u32]> & QueryableStorageEntry<ApiType, [u32, u32]>;
       tokensBurnt: AugmentedQuery<ApiType, (arg: u32 | AnyNumber | Uint8Array) => Observable<u32>, [u32]> & QueryableStorageEntry<ApiType, [u32]>;
       tokensMinted: AugmentedQuery<ApiType, (arg: u32 | AnyNumber | Uint8Array) => Observable<u32>, [u32]> & QueryableStorageEntry<ApiType, [u32]>;
@@ -371,13 +371,13 @@
       [key: string]: QueryableStorageEntry<ApiType>;
     };
     refungible: {
-      accountBalance: AugmentedQuery<ApiType, (arg1: u32 | AnyNumber | Uint8Array, arg2: PalletCommonAccountBasicCrossAccountIdRepr | { Substrate: any } | { Ethereum: any } | string | Uint8Array) => Observable<u32>, [u32, PalletCommonAccountBasicCrossAccountIdRepr]> & QueryableStorageEntry<ApiType, [u32, PalletCommonAccountBasicCrossAccountIdRepr]>;
-      allowance: AugmentedQuery<ApiType, (arg1: u32 | AnyNumber | Uint8Array, arg2: u32 | AnyNumber | Uint8Array, arg3: PalletCommonAccountBasicCrossAccountIdRepr | { Substrate: any } | { Ethereum: any } | string | Uint8Array, arg4: PalletCommonAccountBasicCrossAccountIdRepr | { Substrate: any } | { Ethereum: any } | string | Uint8Array) => Observable<u128>, [u32, u32, PalletCommonAccountBasicCrossAccountIdRepr, PalletCommonAccountBasicCrossAccountIdRepr]> & QueryableStorageEntry<ApiType, [u32, u32, PalletCommonAccountBasicCrossAccountIdRepr, PalletCommonAccountBasicCrossAccountIdRepr]>;
-      balance: AugmentedQuery<ApiType, (arg1: u32 | AnyNumber | Uint8Array, arg2: u32 | AnyNumber | Uint8Array, arg3: PalletCommonAccountBasicCrossAccountIdRepr | { Substrate: any } | { Ethereum: any } | string | Uint8Array) => Observable<u128>, [u32, u32, PalletCommonAccountBasicCrossAccountIdRepr]> & QueryableStorageEntry<ApiType, [u32, u32, PalletCommonAccountBasicCrossAccountIdRepr]>;
+      accountBalance: AugmentedQuery<ApiType, (arg1: u32 | AnyNumber | Uint8Array, arg2: PalletEvmAccountBasicCrossAccountIdRepr | { Substrate: any } | { Ethereum: any } | string | Uint8Array) => Observable<u32>, [u32, PalletEvmAccountBasicCrossAccountIdRepr]> & QueryableStorageEntry<ApiType, [u32, PalletEvmAccountBasicCrossAccountIdRepr]>;
+      allowance: AugmentedQuery<ApiType, (arg1: u32 | AnyNumber | Uint8Array, arg2: u32 | AnyNumber | Uint8Array, arg3: PalletEvmAccountBasicCrossAccountIdRepr | { Substrate: any } | { Ethereum: any } | string | Uint8Array, arg4: PalletEvmAccountBasicCrossAccountIdRepr | { Substrate: any } | { Ethereum: any } | string | Uint8Array) => Observable<u128>, [u32, u32, PalletEvmAccountBasicCrossAccountIdRepr, PalletEvmAccountBasicCrossAccountIdRepr]> & QueryableStorageEntry<ApiType, [u32, u32, PalletEvmAccountBasicCrossAccountIdRepr, PalletEvmAccountBasicCrossAccountIdRepr]>;
+      balance: AugmentedQuery<ApiType, (arg1: u32 | AnyNumber | Uint8Array, arg2: u32 | AnyNumber | Uint8Array, arg3: PalletEvmAccountBasicCrossAccountIdRepr | { Substrate: any } | { Ethereum: any } | string | Uint8Array) => Observable<u128>, [u32, u32, PalletEvmAccountBasicCrossAccountIdRepr]> & QueryableStorageEntry<ApiType, [u32, u32, PalletEvmAccountBasicCrossAccountIdRepr]>;
       /**
        * Used to enumerate tokens owned by account
        **/
-      owned: AugmentedQuery<ApiType, (arg1: u32 | AnyNumber | Uint8Array, arg2: PalletCommonAccountBasicCrossAccountIdRepr | { Substrate: any } | { Ethereum: any } | string | Uint8Array, arg3: u32 | AnyNumber | Uint8Array) => Observable<bool>, [u32, PalletCommonAccountBasicCrossAccountIdRepr, u32]> & QueryableStorageEntry<ApiType, [u32, PalletCommonAccountBasicCrossAccountIdRepr, u32]>;
+      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]>;
       tokenData: AugmentedQuery<ApiType, (arg1: u32 | AnyNumber | Uint8Array, arg2: u32 | AnyNumber | Uint8Array) => Observable<PalletRefungibleItemData>, [u32, u32]> & QueryableStorageEntry<ApiType, [u32, u32]>;
       tokensBurnt: AugmentedQuery<ApiType, (arg: u32 | AnyNumber | Uint8Array) => Observable<u32>, [u32]> & QueryableStorageEntry<ApiType, [u32]>;
       tokensMinted: AugmentedQuery<ApiType, (arg: u32 | AnyNumber | Uint8Array) => Observable<u32>, [u32]> & QueryableStorageEntry<ApiType, [u32]>;
modifiedtests/src/interfaces/augment-api-rpc.tsdiffbeforeafterboth
--- a/tests/src/interfaces/augment-api-rpc.ts
+++ b/tests/src/interfaces/augment-api-rpc.ts
@@ -1,7 +1,7 @@
 // Auto-generated via `yarn polkadot-types-from-chain`, do not edit
 /* eslint-disable */
 
-import type { PalletCommonAccountBasicCrossAccountIdRepr, UpDataStructsCollection, UpDataStructsCollectionStats } from './unique';
+import type { PalletEvmAccountBasicCrossAccountIdRepr, UpDataStructsCollection, UpDataStructsCollectionStats } from './unique';
 import type { AugmentedRpc } from '@polkadot/rpc-core/types';
 import type { Metadata, StorageKey } from '@polkadot/types';
 import type { Bytes, HashMap, Json, Null, Option, Text, U256, U64, Vec, bool, u128, u32, u64 } from '@polkadot/types-codec';
@@ -562,31 +562,31 @@
       /**
        * Get amount of different user tokens
        **/
-      accountBalance: AugmentedRpc<(collection: u32 | AnyNumber | Uint8Array, account: PalletCommonAccountBasicCrossAccountIdRepr | { Substrate: any } | { Ethereum: any } | string | Uint8Array, at?: Hash | string | Uint8Array) => Observable<u32>>;
+      accountBalance: AugmentedRpc<(collection: u32 | AnyNumber | Uint8Array, account: PalletEvmAccountBasicCrossAccountIdRepr | { Substrate: any } | { Ethereum: any } | string | Uint8Array, at?: Hash | string | Uint8Array) => Observable<u32>>;
       /**
        * Get tokens owned by account
        **/
-      accountTokens: AugmentedRpc<(collection: u32 | AnyNumber | Uint8Array, account: PalletCommonAccountBasicCrossAccountIdRepr | { Substrate: any } | { Ethereum: any } | string | Uint8Array, at?: Hash | string | Uint8Array) => Observable<Vec<u32>>>;
+      accountTokens: AugmentedRpc<(collection: u32 | AnyNumber | Uint8Array, account: PalletEvmAccountBasicCrossAccountIdRepr | { Substrate: any } | { Ethereum: any } | string | Uint8Array, at?: Hash | string | Uint8Array) => Observable<Vec<u32>>>;
       /**
        * Get admin list
        **/
-      adminlist: AugmentedRpc<(collection: u32 | AnyNumber | Uint8Array, at?: Hash | string | Uint8Array) => Observable<Vec<PalletCommonAccountBasicCrossAccountIdRepr>>>;
+      adminlist: AugmentedRpc<(collection: u32 | AnyNumber | Uint8Array, at?: Hash | string | Uint8Array) => Observable<Vec<PalletEvmAccountBasicCrossAccountIdRepr>>>;
       /**
        * Get allowed amount
        **/
-      allowance: AugmentedRpc<(collection: u32 | AnyNumber | Uint8Array, sender: PalletCommonAccountBasicCrossAccountIdRepr | { Substrate: any } | { Ethereum: any } | string | Uint8Array, spender: PalletCommonAccountBasicCrossAccountIdRepr | { Substrate: any } | { Ethereum: any } | string | Uint8Array, tokenId: u32 | AnyNumber | Uint8Array, at?: Hash | string | Uint8Array) => Observable<u128>>;
+      allowance: AugmentedRpc<(collection: u32 | AnyNumber | Uint8Array, sender: PalletEvmAccountBasicCrossAccountIdRepr | { Substrate: any } | { Ethereum: any } | string | Uint8Array, spender: PalletEvmAccountBasicCrossAccountIdRepr | { Substrate: any } | { Ethereum: any } | string | Uint8Array, tokenId: u32 | AnyNumber | Uint8Array, at?: Hash | string | Uint8Array) => Observable<u128>>;
       /**
        * Check if user is allowed to use collection
        **/
-      allowed: AugmentedRpc<(collection: u32 | AnyNumber | Uint8Array, account: PalletCommonAccountBasicCrossAccountIdRepr | { Substrate: any } | { Ethereum: any } | string | Uint8Array, at?: Hash | string | Uint8Array) => Observable<bool>>;
+      allowed: AugmentedRpc<(collection: u32 | AnyNumber | Uint8Array, account: PalletEvmAccountBasicCrossAccountIdRepr | { Substrate: any } | { Ethereum: any } | string | Uint8Array, at?: Hash | string | Uint8Array) => Observable<bool>>;
       /**
        * Get allowlist
        **/
-      allowlist: AugmentedRpc<(collection: u32 | AnyNumber | Uint8Array, at?: Hash | string | Uint8Array) => Observable<Vec<PalletCommonAccountBasicCrossAccountIdRepr>>>;
+      allowlist: AugmentedRpc<(collection: u32 | AnyNumber | Uint8Array, at?: Hash | string | Uint8Array) => Observable<Vec<PalletEvmAccountBasicCrossAccountIdRepr>>>;
       /**
        * Get amount of specific account token
        **/
-      balance: AugmentedRpc<(collection: u32 | AnyNumber | Uint8Array, account: PalletCommonAccountBasicCrossAccountIdRepr | { Substrate: any } | { Ethereum: any } | string | Uint8Array, tokenId: u32 | AnyNumber | Uint8Array, at?: Hash | string | Uint8Array) => Observable<u128>>;
+      balance: AugmentedRpc<(collection: u32 | AnyNumber | Uint8Array, account: PalletEvmAccountBasicCrossAccountIdRepr | { Substrate: any } | { Ethereum: any } | string | Uint8Array, tokenId: u32 | AnyNumber | Uint8Array, at?: Hash | string | Uint8Array) => Observable<u128>>;
       /**
        * Get collection by specified id
        **/
@@ -614,7 +614,7 @@
       /**
        * Get token owner
        **/
-      tokenOwner: AugmentedRpc<(collection: u32 | AnyNumber | Uint8Array, tokenId: u32 | AnyNumber | Uint8Array, at?: Hash | string | Uint8Array) => Observable<PalletCommonAccountBasicCrossAccountIdRepr>>;
+      tokenOwner: AugmentedRpc<(collection: u32 | AnyNumber | Uint8Array, tokenId: u32 | AnyNumber | Uint8Array, at?: Hash | string | Uint8Array) => Observable<PalletEvmAccountBasicCrossAccountIdRepr>>;
       /**
        * Get token variable metadata
        **/
modifiedtests/src/interfaces/augment-api-tx.tsdiffbeforeafterboth
--- a/tests/src/interfaces/augment-api-tx.ts
+++ b/tests/src/interfaces/augment-api-tx.ts
@@ -5,7 +5,7 @@
 import type { Bytes, Compact, Option, U256, Vec, bool, u128, u16, u32, u64 } from '@polkadot/types-codec';
 import type { AnyNumber, ITuple } from '@polkadot/types-codec/types';
 import type { AccountId32, Call, H160, H256, MultiAddress, Perbill } from '@polkadot/types/interfaces/runtime';
-import type { CumulusPrimitivesParachainInherentParachainInherentData, EthereumTransactionTransactionV2, OrmlVestingVestingSchedule, PalletCommonAccountBasicCrossAccountIdRepr, UpDataStructsAccessMode, UpDataStructsCollectionLimits, UpDataStructsCollectionMode, UpDataStructsCreateCollectionData, UpDataStructsCreateItemData, UpDataStructsCreateItemExData, UpDataStructsMetaUpdatePermission, UpDataStructsSchemaVersion, XcmV1MultiLocation, XcmV2WeightLimit, XcmVersionedMultiAssets, XcmVersionedMultiLocation, XcmVersionedXcm } from '@polkadot/types/lookup';
+import type { CumulusPrimitivesParachainInherentParachainInherentData, EthereumTransactionTransactionV2, OrmlVestingVestingSchedule, PalletEvmAccountBasicCrossAccountIdRepr, UpDataStructsAccessMode, UpDataStructsCollectionLimits, UpDataStructsCollectionMode, UpDataStructsCreateCollectionData, UpDataStructsCreateItemData, UpDataStructsCreateItemExData, UpDataStructsMetaUpdatePermission, UpDataStructsSchemaVersion, XcmV1MultiLocation, XcmV2WeightLimit, XcmVersionedMultiAssets, XcmVersionedMultiLocation, XcmVersionedXcm } from '@polkadot/types/lookup';
 
 declare module '@polkadot/api-base/types/submittable' {
   export interface AugmentedSubmittables<ApiType extends ApiTypes> {
@@ -551,7 +551,7 @@
        * 
        * * new_admin_id: Address of new admin to add.
        **/
-      addCollectionAdmin: AugmentedSubmittable<(collectionId: u32 | AnyNumber | Uint8Array, newAdminId: PalletCommonAccountBasicCrossAccountIdRepr | { Substrate: any } | { Ethereum: any } | string | Uint8Array) => SubmittableExtrinsic<ApiType>, [u32, PalletCommonAccountBasicCrossAccountIdRepr]>;
+      addCollectionAdmin: AugmentedSubmittable<(collectionId: u32 | AnyNumber | Uint8Array, newAdminId: PalletEvmAccountBasicCrossAccountIdRepr | { Substrate: any } | { Ethereum: any } | string | Uint8Array) => SubmittableExtrinsic<ApiType>, [u32, PalletEvmAccountBasicCrossAccountIdRepr]>;
       /**
        * Add an address to allow list.
        * 
@@ -566,7 +566,7 @@
        * 
        * * address.
        **/
-      addToAllowList: AugmentedSubmittable<(collectionId: u32 | AnyNumber | Uint8Array, address: PalletCommonAccountBasicCrossAccountIdRepr | { Substrate: any } | { Ethereum: any } | string | Uint8Array) => SubmittableExtrinsic<ApiType>, [u32, PalletCommonAccountBasicCrossAccountIdRepr]>;
+      addToAllowList: AugmentedSubmittable<(collectionId: u32 | AnyNumber | Uint8Array, address: PalletEvmAccountBasicCrossAccountIdRepr | { Substrate: any } | { Ethereum: any } | string | Uint8Array) => SubmittableExtrinsic<ApiType>, [u32, PalletEvmAccountBasicCrossAccountIdRepr]>;
       /**
        * Set, change, or remove approved address to transfer the ownership of the NFT.
        * 
@@ -584,7 +584,7 @@
        * 
        * * item_id: ID of the item.
        **/
-      approve: AugmentedSubmittable<(spender: PalletCommonAccountBasicCrossAccountIdRepr | { Substrate: any } | { Ethereum: any } | string | Uint8Array, collectionId: u32 | AnyNumber | Uint8Array, itemId: u32 | AnyNumber | Uint8Array, amount: u128 | AnyNumber | Uint8Array) => SubmittableExtrinsic<ApiType>, [PalletCommonAccountBasicCrossAccountIdRepr, u32, u32, u128]>;
+      approve: AugmentedSubmittable<(spender: PalletEvmAccountBasicCrossAccountIdRepr | { Substrate: any } | { Ethereum: any } | string | Uint8Array, collectionId: u32 | AnyNumber | Uint8Array, itemId: u32 | AnyNumber | Uint8Array, amount: u128 | AnyNumber | Uint8Array) => SubmittableExtrinsic<ApiType>, [PalletEvmAccountBasicCrossAccountIdRepr, u32, u32, u128]>;
       /**
        * Destroys a concrete instance of NFT on behalf of the owner
        * See also: [`approve`]
@@ -603,7 +603,7 @@
        * 
        * * from: owner of item
        **/
-      burnFrom: AugmentedSubmittable<(collectionId: u32 | AnyNumber | Uint8Array, from: PalletCommonAccountBasicCrossAccountIdRepr | { Substrate: any } | { Ethereum: any } | string | Uint8Array, itemId: u32 | AnyNumber | Uint8Array, value: u128 | AnyNumber | Uint8Array) => SubmittableExtrinsic<ApiType>, [u32, PalletCommonAccountBasicCrossAccountIdRepr, u32, u128]>;
+      burnFrom: AugmentedSubmittable<(collectionId: u32 | AnyNumber | Uint8Array, from: PalletEvmAccountBasicCrossAccountIdRepr | { Substrate: any } | { Ethereum: any } | string | Uint8Array, itemId: u32 | AnyNumber | Uint8Array, value: u128 | AnyNumber | Uint8Array) => SubmittableExtrinsic<ApiType>, [u32, PalletEvmAccountBasicCrossAccountIdRepr, u32, u128]>;
       /**
        * Destroys a concrete instance of NFT.
        * 
@@ -688,7 +688,7 @@
        * 
        * * data: Token data to store on chain.
        **/
-      createItem: AugmentedSubmittable<(collectionId: u32 | AnyNumber | Uint8Array, owner: PalletCommonAccountBasicCrossAccountIdRepr | { Substrate: any } | { Ethereum: any } | string | Uint8Array, data: UpDataStructsCreateItemData | { NFT: any } | { Fungible: any } | { ReFungible: any } | string | Uint8Array) => SubmittableExtrinsic<ApiType>, [u32, PalletCommonAccountBasicCrossAccountIdRepr, UpDataStructsCreateItemData]>;
+      createItem: AugmentedSubmittable<(collectionId: u32 | AnyNumber | Uint8Array, owner: PalletEvmAccountBasicCrossAccountIdRepr | { Substrate: any } | { Ethereum: any } | string | Uint8Array, data: UpDataStructsCreateItemData | { NFT: any } | { Fungible: any } | { ReFungible: any } | string | Uint8Array) => SubmittableExtrinsic<ApiType>, [u32, PalletEvmAccountBasicCrossAccountIdRepr, UpDataStructsCreateItemData]>;
       /**
        * This method creates multiple items in a collection created with CreateCollection method.
        * 
@@ -709,7 +709,7 @@
        * 
        * * owner: Address, initial owner of the NFT.
        **/
-      createMultipleItems: AugmentedSubmittable<(collectionId: u32 | AnyNumber | Uint8Array, owner: PalletCommonAccountBasicCrossAccountIdRepr | { Substrate: any } | { Ethereum: any } | string | Uint8Array, itemsData: Vec<UpDataStructsCreateItemData> | (UpDataStructsCreateItemData | { NFT: any } | { Fungible: any } | { ReFungible: any } | string | Uint8Array)[]) => SubmittableExtrinsic<ApiType>, [u32, PalletCommonAccountBasicCrossAccountIdRepr, Vec<UpDataStructsCreateItemData>]>;
+      createMultipleItems: AugmentedSubmittable<(collectionId: u32 | AnyNumber | Uint8Array, owner: PalletEvmAccountBasicCrossAccountIdRepr | { Substrate: any } | { Ethereum: any } | string | Uint8Array, itemsData: Vec<UpDataStructsCreateItemData> | (UpDataStructsCreateItemData | { NFT: any } | { Fungible: any } | { ReFungible: any } | string | Uint8Array)[]) => SubmittableExtrinsic<ApiType>, [u32, PalletEvmAccountBasicCrossAccountIdRepr, Vec<UpDataStructsCreateItemData>]>;
       createMultipleItemsEx: AugmentedSubmittable<(collectionId: u32 | AnyNumber | Uint8Array, data: UpDataStructsCreateItemExData | { NFT: any } | { Fungible: any } | { RefungibleMultipleItems: any } | { RefungibleMultipleOwners: any } | string | Uint8Array) => SubmittableExtrinsic<ApiType>, [u32, UpDataStructsCreateItemExData]>;
       /**
        * **DANGEROUS**: Destroys collection and all NFTs within this collection. Users irrecoverably lose their assets and may lose real money.
@@ -737,7 +737,7 @@
        * 
        * * account_id: Address of admin to remove.
        **/
-      removeCollectionAdmin: AugmentedSubmittable<(collectionId: u32 | AnyNumber | Uint8Array, accountId: PalletCommonAccountBasicCrossAccountIdRepr | { Substrate: any } | { Ethereum: any } | string | Uint8Array) => SubmittableExtrinsic<ApiType>, [u32, PalletCommonAccountBasicCrossAccountIdRepr]>;
+      removeCollectionAdmin: AugmentedSubmittable<(collectionId: u32 | AnyNumber | Uint8Array, accountId: PalletEvmAccountBasicCrossAccountIdRepr | { Substrate: any } | { Ethereum: any } | string | Uint8Array) => SubmittableExtrinsic<ApiType>, [u32, PalletEvmAccountBasicCrossAccountIdRepr]>;
       /**
        * Switch back to pay-per-own-transaction model.
        * 
@@ -764,7 +764,7 @@
        * 
        * * address.
        **/
-      removeFromAllowList: AugmentedSubmittable<(collectionId: u32 | AnyNumber | Uint8Array, address: PalletCommonAccountBasicCrossAccountIdRepr | { Substrate: any } | { Ethereum: any } | string | Uint8Array) => SubmittableExtrinsic<ApiType>, [u32, PalletCommonAccountBasicCrossAccountIdRepr]>;
+      removeFromAllowList: AugmentedSubmittable<(collectionId: u32 | AnyNumber | Uint8Array, address: PalletEvmAccountBasicCrossAccountIdRepr | { Substrate: any } | { Ethereum: any } | string | Uint8Array) => SubmittableExtrinsic<ApiType>, [u32, PalletEvmAccountBasicCrossAccountIdRepr]>;
       setCollectionLimits: AugmentedSubmittable<(collectionId: u32 | AnyNumber | Uint8Array, newLimit: UpDataStructsCollectionLimits | { accountTokenOwnershipLimit?: any; sponsoredDataSize?: any; sponsoredDataRateLimit?: any; tokenLimit?: any; sponsorTransferTimeout?: any; sponsorApproveTimeout?: any; ownerCanTransfer?: any; ownerCanDestroy?: any; transfersEnabled?: any } | string | Uint8Array) => SubmittableExtrinsic<ApiType>, [u32, UpDataStructsCollectionLimits]>;
       /**
        * # Permissions
@@ -938,7 +938,7 @@
        * * Fungible Mode: Must specify transferred amount
        * * Re-Fungible Mode: Must specify transferred portion (between 0 and 1)
        **/
-      transfer: AugmentedSubmittable<(recipient: PalletCommonAccountBasicCrossAccountIdRepr | { Substrate: any } | { Ethereum: any } | string | Uint8Array, collectionId: u32 | AnyNumber | Uint8Array, itemId: u32 | AnyNumber | Uint8Array, value: u128 | AnyNumber | Uint8Array) => SubmittableExtrinsic<ApiType>, [PalletCommonAccountBasicCrossAccountIdRepr, u32, u32, u128]>;
+      transfer: AugmentedSubmittable<(recipient: PalletEvmAccountBasicCrossAccountIdRepr | { Substrate: any } | { Ethereum: any } | string | Uint8Array, collectionId: u32 | AnyNumber | Uint8Array, itemId: u32 | AnyNumber | Uint8Array, value: u128 | AnyNumber | Uint8Array) => SubmittableExtrinsic<ApiType>, [PalletEvmAccountBasicCrossAccountIdRepr, u32, u32, u128]>;
       /**
        * Change ownership of a NFT on behalf of the owner. See Approve method for additional information. After this method executes, the approval is removed so that the approved address will not be able to transfer this NFT again from this owner.
        * 
@@ -960,7 +960,7 @@
        * 
        * * value: Amount to transfer.
        **/
-      transferFrom: AugmentedSubmittable<(from: PalletCommonAccountBasicCrossAccountIdRepr | { Substrate: any } | { Ethereum: any } | string | Uint8Array, recipient: PalletCommonAccountBasicCrossAccountIdRepr | { Substrate: any } | { Ethereum: any } | string | Uint8Array, collectionId: u32 | AnyNumber | Uint8Array, itemId: u32 | AnyNumber | Uint8Array, value: u128 | AnyNumber | Uint8Array) => SubmittableExtrinsic<ApiType>, [PalletCommonAccountBasicCrossAccountIdRepr, PalletCommonAccountBasicCrossAccountIdRepr, u32, u32, u128]>;
+      transferFrom: AugmentedSubmittable<(from: PalletEvmAccountBasicCrossAccountIdRepr | { Substrate: any } | { Ethereum: any } | string | Uint8Array, recipient: PalletEvmAccountBasicCrossAccountIdRepr | { Substrate: any } | { Ethereum: any } | string | Uint8Array, collectionId: u32 | AnyNumber | Uint8Array, itemId: u32 | AnyNumber | Uint8Array, value: u128 | AnyNumber | Uint8Array) => SubmittableExtrinsic<ApiType>, [PalletEvmAccountBasicCrossAccountIdRepr, PalletEvmAccountBasicCrossAccountIdRepr, u32, u32, u128]>;
       /**
        * Generic tx
        **/
modifiedtests/src/interfaces/augment-types.tsdiffbeforeafterboth
--- a/tests/src/interfaces/augment-types.ts
+++ b/tests/src/interfaces/augment-types.ts
@@ -1,7 +1,7 @@
 // Auto-generated via `yarn polkadot-types-from-defs`, do not edit
 /* eslint-disable */
 
-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, FrameSupportPalletId, FrameSupportTokensMiscBalanceStatus, FrameSupportWeightsDispatchClass, FrameSupportWeightsDispatchInfo, FrameSupportWeightsPays, FrameSupportWeightsPerDispatchClassU32, FrameSupportWeightsPerDispatchClassU64, FrameSupportWeightsPerDispatchClassWeightsPerClass, FrameSupportWeightsRuntimeDbWeight, FrameSupportWeightsWeightToFeeCoefficient, FrameSystemAccountInfo, FrameSystemCall, FrameSystemError, FrameSystemEvent, FrameSystemEventRecord, FrameSystemExtensionsCheckGenesis, FrameSystemExtensionsCheckNonce, FrameSystemExtensionsCheckSpecVersion, FrameSystemExtensionsCheckWeight, FrameSystemLastRuntimeUpgradeInfo, FrameSystemLimitsBlockLength, FrameSystemLimitsBlockWeights, FrameSystemLimitsWeightsPerClass, FrameSystemPhase, OrmlVestingModuleCall, OrmlVestingModuleError, OrmlVestingModuleEvent, OrmlVestingVestingSchedule, PalletBalancesAccountData, PalletBalancesBalanceLock, PalletBalancesCall, PalletBalancesError, PalletBalancesEvent, PalletBalancesReasons, PalletBalancesReleases, PalletBalancesReserveData, PalletCommonAccountBasicCrossAccountIdRepr, PalletCommonError, PalletCommonEvent, PalletEthereumCall, PalletEthereumError, PalletEthereumEvent, PalletEvmCall, PalletEvmCoderSubstrateError, PalletEvmContractHelpersError, PalletEvmContractHelpersSponsoringModeT, PalletEvmError, PalletEvmEvent, PalletEvmMigrationCall, PalletEvmMigrationError, PalletFungibleError, PalletInflationCall, PalletNonfungibleError, PalletNonfungibleItemData, PalletRefungibleError, PalletRefungibleItemData, PalletSudoCall, PalletSudoError, PalletSudoEvent, PalletTemplateTransactionPaymentCall, PalletTemplateTransactionPaymentChargeTransactionPayment, PalletTimestampCall, PalletTransactionPaymentReleases, PalletTreasuryCall, PalletTreasuryError, PalletTreasuryEvent, PalletTreasuryProposal, PalletUniqueCall, PalletUniqueError, PalletUniqueRawEvent, PalletXcmCall, PalletXcmError, PalletXcmEvent, PolkadotCorePrimitivesInboundDownwardMessage, PolkadotCorePrimitivesInboundHrmpMessage, PolkadotCorePrimitivesOutboundHrmpMessage, PolkadotParachainPrimitivesXcmpMessageFormat, PolkadotPrimitivesV1AbridgedHostConfiguration, PolkadotPrimitivesV1AbridgedHrmpChannel, PolkadotPrimitivesV1PersistedValidationData, PolkadotPrimitivesV1UpgradeRestriction, SpCoreEcdsaSignature, SpCoreEd25519Signature, SpCoreSr25519Signature, SpRuntimeArithmeticError, SpRuntimeDigest, SpRuntimeDigestDigestItem, SpRuntimeDispatchError, SpRuntimeModuleError, SpRuntimeMultiSignature, SpRuntimeTokenError, SpTrieStorageProof, SpVersionRuntimeVersion, UniqueRuntimeRuntime, UpDataStructsAccessMode, UpDataStructsCollection, UpDataStructsCollectionLimits, UpDataStructsCollectionMode, UpDataStructsCollectionStats, UpDataStructsCreateCollectionData, UpDataStructsCreateFungibleData, UpDataStructsCreateItemData, UpDataStructsCreateItemExData, UpDataStructsCreateNftData, UpDataStructsCreateNftExData, UpDataStructsCreateReFungibleData, UpDataStructsCreateRefungibleExData, UpDataStructsMetaUpdatePermission, UpDataStructsSchemaVersion, UpDataStructsSponsoringRateLimit, UpDataStructsSponsorshipState, 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, XcmVersionedMultiAssets, XcmVersionedMultiLocation, XcmVersionedXcm } from './unique';
+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, FrameSupportPalletId, FrameSupportTokensMiscBalanceStatus, FrameSupportWeightsDispatchClass, FrameSupportWeightsDispatchInfo, FrameSupportWeightsPays, FrameSupportWeightsPerDispatchClassU32, FrameSupportWeightsPerDispatchClassU64, FrameSupportWeightsPerDispatchClassWeightsPerClass, FrameSupportWeightsRuntimeDbWeight, FrameSupportWeightsWeightToFeeCoefficient, FrameSystemAccountInfo, FrameSystemCall, FrameSystemError, FrameSystemEvent, FrameSystemEventRecord, FrameSystemExtensionsCheckGenesis, FrameSystemExtensionsCheckNonce, FrameSystemExtensionsCheckSpecVersion, FrameSystemExtensionsCheckWeight, FrameSystemLastRuntimeUpgradeInfo, FrameSystemLimitsBlockLength, FrameSystemLimitsBlockWeights, FrameSystemLimitsWeightsPerClass, FrameSystemPhase, OpalRuntimeRuntime, OrmlVestingModuleCall, OrmlVestingModuleError, OrmlVestingModuleEvent, OrmlVestingVestingSchedule, PalletBalancesAccountData, PalletBalancesBalanceLock, PalletBalancesCall, PalletBalancesError, PalletBalancesEvent, PalletBalancesReasons, PalletBalancesReleases, PalletBalancesReserveData, PalletCommonError, PalletCommonEvent, PalletEthereumCall, PalletEthereumError, PalletEthereumEvent, PalletEvmAccountBasicCrossAccountIdRepr, PalletEvmCall, PalletEvmCoderSubstrateError, PalletEvmContractHelpersError, PalletEvmContractHelpersSponsoringModeT, PalletEvmError, PalletEvmEvent, PalletEvmMigrationCall, PalletEvmMigrationError, PalletFungibleError, PalletInflationCall, PalletNonfungibleError, PalletNonfungibleItemData, PalletRefungibleError, PalletRefungibleItemData, PalletSudoCall, PalletSudoError, PalletSudoEvent, PalletTemplateTransactionPaymentCall, PalletTemplateTransactionPaymentChargeTransactionPayment, PalletTimestampCall, PalletTransactionPaymentReleases, PalletTreasuryCall, PalletTreasuryError, PalletTreasuryEvent, PalletTreasuryProposal, PalletUniqueCall, PalletUniqueError, PalletUniqueRawEvent, PalletXcmCall, PalletXcmError, PalletXcmEvent, PolkadotCorePrimitivesInboundDownwardMessage, PolkadotCorePrimitivesInboundHrmpMessage, PolkadotCorePrimitivesOutboundHrmpMessage, PolkadotParachainPrimitivesXcmpMessageFormat, PolkadotPrimitivesV1AbridgedHostConfiguration, PolkadotPrimitivesV1AbridgedHrmpChannel, PolkadotPrimitivesV1PersistedValidationData, PolkadotPrimitivesV1UpgradeRestriction, SpCoreEcdsaSignature, SpCoreEd25519Signature, SpCoreSr25519Signature, SpRuntimeArithmeticError, SpRuntimeDigest, SpRuntimeDigestDigestItem, SpRuntimeDispatchError, SpRuntimeModuleError, SpRuntimeMultiSignature, SpRuntimeTokenError, SpTrieStorageProof, SpVersionRuntimeVersion, UpDataStructsAccessMode, UpDataStructsCollection, UpDataStructsCollectionLimits, UpDataStructsCollectionMode, UpDataStructsCollectionStats, UpDataStructsCreateCollectionData, UpDataStructsCreateFungibleData, UpDataStructsCreateItemData, UpDataStructsCreateItemExData, UpDataStructsCreateNftData, UpDataStructsCreateNftExData, UpDataStructsCreateReFungibleData, UpDataStructsCreateRefungibleExData, UpDataStructsMetaUpdatePermission, UpDataStructsSchemaVersion, UpDataStructsSponsoringRateLimit, UpDataStructsSponsorshipState, 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, XcmVersionedMultiAssets, XcmVersionedMultiLocation, XcmVersionedXcm } from './unique';
 import type { Data, StorageKey } from '@polkadot/types';
 import type { BitVec, Bool, Bytes, I128, I16, I256, I32, I64, I8, Json, Null, Raw, Text, Type, U128, U16, U256, U32, U64, U8, USize, bool, 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';
@@ -18,7 +18,7 @@
 import type { StatementKind } from '@polkadot/types/interfaces/claims';
 import type { CollectiveOrigin, MemberCount, ProposalIndex, Votes, VotesTo230 } from '@polkadot/types/interfaces/collective';
 import type { AuthorityId, RawVRFOutput } from '@polkadot/types/interfaces/consensus';
-import type { AliveContractInfo, CodeHash, CodeUploadRequest, CodeUploadResult, CodeUploadResultValue, ContractCallFlags, ContractCallRequest, ContractExecResult, ContractExecResultErr, ContractExecResultErrModule, ContractExecResultOk, ContractExecResultResult, ContractExecResultSuccessTo255, ContractExecResultSuccessTo260, ContractExecResultTo255, ContractExecResultTo260, ContractExecResultTo267, ContractInfo, ContractInstantiateResult, ContractInstantiateResultTo267, ContractReturnFlags, ContractStorageKey, DeletedContract, ExecReturnValue, Gas, HostFnWeights, HostFnWeightsTo264, InstantiateRequest, InstantiateReturnValue, InstantiateReturnValueTo267, InstructionWeights, Limits, LimitsTo264, PrefabWasmModule, RentProjection, Schedule, ScheduleTo212, ScheduleTo258, ScheduleTo264, SeedOf, StorageDeposit, TombstoneContractInfo, TrieId } from '@polkadot/types/interfaces/contracts';
+import type { AliveContractInfo, CodeHash, CodeSource, CodeUploadRequest, CodeUploadResult, CodeUploadResultValue, ContractCallFlags, ContractCallRequest, ContractExecResult, ContractExecResultErr, ContractExecResultErrModule, ContractExecResultOk, ContractExecResultResult, ContractExecResultSuccessTo255, ContractExecResultSuccessTo260, ContractExecResultTo255, ContractExecResultTo260, ContractExecResultTo267, ContractInfo, ContractInstantiateResult, ContractInstantiateResultTo267, ContractInstantiateResultTo299, ContractReturnFlags, ContractStorageKey, DeletedContract, ExecReturnValue, Gas, HostFnWeights, HostFnWeightsTo264, InstantiateRequest, InstantiateRequestV1, InstantiateRequestV2, InstantiateReturnValue, InstantiateReturnValueOk, InstantiateReturnValueTo267, InstructionWeights, Limits, LimitsTo264, PrefabWasmModule, RentProjection, Schedule, ScheduleTo212, ScheduleTo258, ScheduleTo264, SeedOf, StorageDeposit, TombstoneContractInfo, TrieId } from '@polkadot/types/interfaces/contracts';
 import type { ContractConstructorSpecLatest, ContractConstructorSpecV0, ContractConstructorSpecV1, ContractConstructorSpecV2, ContractConstructorSpecV3, ContractContractSpecV0, ContractContractSpecV1, ContractContractSpecV2, ContractContractSpecV3, ContractCryptoHasher, ContractDiscriminant, ContractDisplayName, ContractEventParamSpecLatest, ContractEventParamSpecV0, ContractEventParamSpecV2, ContractEventSpecLatest, ContractEventSpecV0, ContractEventSpecV1, ContractEventSpecV2, ContractLayoutArray, ContractLayoutCell, ContractLayoutEnum, ContractLayoutHash, ContractLayoutHashingStrategy, ContractLayoutKey, ContractLayoutStruct, ContractLayoutStructField, ContractMessageParamSpecLatest, ContractMessageParamSpecV0, ContractMessageParamSpecV2, ContractMessageSpecLatest, ContractMessageSpecV0, ContractMessageSpecV1, ContractMessageSpecV2, ContractMetadata, ContractMetadataLatest, ContractMetadataV0, ContractMetadataV1, ContractMetadataV2, ContractMetadataV3, ContractProject, ContractProjectContract, ContractProjectInfo, ContractProjectSource, ContractProjectV0, ContractSelector, ContractStorageLayout, ContractTypeSpec } from '@polkadot/types/interfaces/contractsAbi';
 import type { FundIndex, FundInfo, LastContribution, TrieIndex } from '@polkadot/types/interfaces/crowdloan';
 import type { ConfigData, MessageId, OverweightIndex, PageCounter, PageIndexData } from '@polkadot/types/interfaces/cumulus';
@@ -198,6 +198,7 @@
     ClassMetadata: ClassMetadata;
     CodecHash: CodecHash;
     CodeHash: CodeHash;
+    CodeSource: CodeSource;
     CodeUploadRequest: CodeUploadRequest;
     CodeUploadResult: CodeUploadResult;
     CodeUploadResultValue: CodeUploadResultValue;
@@ -250,6 +251,7 @@
     ContractInfo: ContractInfo;
     ContractInstantiateResult: ContractInstantiateResult;
     ContractInstantiateResultTo267: ContractInstantiateResultTo267;
+    ContractInstantiateResultTo299: ContractInstantiateResultTo299;
     ContractLayoutArray: ContractLayoutArray;
     ContractLayoutCell: ContractLayoutCell;
     ContractLayoutEnum: ContractLayoutEnum;
@@ -591,7 +593,10 @@
     InstanceId: InstanceId;
     InstanceMetadata: InstanceMetadata;
     InstantiateRequest: InstantiateRequest;
+    InstantiateRequestV1: InstantiateRequestV1;
+    InstantiateRequestV2: InstantiateRequestV2;
     InstantiateReturnValue: InstantiateReturnValue;
+    InstantiateReturnValueOk: InstantiateReturnValueOk;
     InstantiateReturnValueTo267: InstantiateReturnValueTo267;
     InstructionV2: InstructionV2;
     InstructionWeights: InstructionWeights;
@@ -707,6 +712,7 @@
     OffchainAccuracyCompact: OffchainAccuracyCompact;
     OffenceDetails: OffenceDetails;
     Offender: Offender;
+    OpalRuntimeRuntime: OpalRuntimeRuntime;
     OpaqueCall: OpaqueCall;
     OpaqueMultiaddr: OpaqueMultiaddr;
     OpaqueNetworkState: OpaqueNetworkState;
@@ -746,7 +752,6 @@
     PalletBalancesReserveData: PalletBalancesReserveData;
     PalletCallMetadataLatest: PalletCallMetadataLatest;
     PalletCallMetadataV14: PalletCallMetadataV14;
-    PalletCommonAccountBasicCrossAccountIdRepr: PalletCommonAccountBasicCrossAccountIdRepr;
     PalletCommonError: PalletCommonError;
     PalletCommonEvent: PalletCommonEvent;
     PalletConstantMetadataLatest: PalletConstantMetadataLatest;
@@ -758,6 +763,7 @@
     PalletEthereumEvent: PalletEthereumEvent;
     PalletEventMetadataLatest: PalletEventMetadataLatest;
     PalletEventMetadataV14: PalletEventMetadataV14;
+    PalletEvmAccountBasicCrossAccountIdRepr: PalletEvmAccountBasicCrossAccountIdRepr;
     PalletEvmCall: PalletEvmCall;
     PalletEvmCoderSubstrateError: PalletEvmCoderSubstrateError;
     PalletEvmContractHelpersError: PalletEvmContractHelpersError;
@@ -1146,7 +1152,6 @@
     UnappliedSlash: UnappliedSlash;
     UnappliedSlashOther: UnappliedSlashOther;
     UncleEntryItem: UncleEntryItem;
-    UniqueRuntimeRuntime: UniqueRuntimeRuntime;
     UnknownTransaction: UnknownTransaction;
     UnlockChunk: UnlockChunk;
     UnrewardedRelayer: UnrewardedRelayer;
modifiedtests/src/interfaces/lookup.tsdiffbeforeafterboth
--- a/tests/src/interfaces/lookup.ts
+++ b/tests/src/interfaces/lookup.ts
@@ -1254,11 +1254,11 @@
       },
       add_to_allow_list: {
         collectionId: 'u32',
-        address: 'PalletCommonAccountBasicCrossAccountIdRepr',
+        address: 'PalletEvmAccountBasicCrossAccountIdRepr',
       },
       remove_from_allow_list: {
         collectionId: 'u32',
-        address: 'PalletCommonAccountBasicCrossAccountIdRepr',
+        address: 'PalletEvmAccountBasicCrossAccountIdRepr',
       },
       set_public_access_mode: {
         collectionId: 'u32',
@@ -1274,11 +1274,11 @@
       },
       add_collection_admin: {
         collectionId: 'u32',
-        newAdminId: 'PalletCommonAccountBasicCrossAccountIdRepr',
+        newAdminId: 'PalletEvmAccountBasicCrossAccountIdRepr',
       },
       remove_collection_admin: {
         collectionId: 'u32',
-        accountId: 'PalletCommonAccountBasicCrossAccountIdRepr',
+        accountId: 'PalletEvmAccountBasicCrossAccountIdRepr',
       },
       set_collection_sponsor: {
         collectionId: 'u32',
@@ -1292,12 +1292,12 @@
       },
       create_item: {
         collectionId: 'u32',
-        owner: 'PalletCommonAccountBasicCrossAccountIdRepr',
+        owner: 'PalletEvmAccountBasicCrossAccountIdRepr',
         data: 'UpDataStructsCreateItemData',
       },
       create_multiple_items: {
         collectionId: 'u32',
-        owner: 'PalletCommonAccountBasicCrossAccountIdRepr',
+        owner: 'PalletEvmAccountBasicCrossAccountIdRepr',
         itemsData: 'Vec<UpDataStructsCreateItemData>',
       },
       create_multiple_items_ex: {
@@ -1315,25 +1315,25 @@
       },
       burn_from: {
         collectionId: 'u32',
-        from: 'PalletCommonAccountBasicCrossAccountIdRepr',
+        from: 'PalletEvmAccountBasicCrossAccountIdRepr',
         itemId: 'u32',
         value: 'u128',
       },
       transfer: {
-        recipient: 'PalletCommonAccountBasicCrossAccountIdRepr',
+        recipient: 'PalletEvmAccountBasicCrossAccountIdRepr',
         collectionId: 'u32',
         itemId: 'u32',
         value: 'u128',
       },
       approve: {
-        spender: 'PalletCommonAccountBasicCrossAccountIdRepr',
+        spender: 'PalletEvmAccountBasicCrossAccountIdRepr',
         collectionId: 'u32',
         itemId: 'u32',
         amount: 'u128',
       },
       transfer_from: {
-        from: 'PalletCommonAccountBasicCrossAccountIdRepr',
-        recipient: 'PalletCommonAccountBasicCrossAccountIdRepr',
+        from: 'PalletEvmAccountBasicCrossAccountIdRepr',
+        recipient: 'PalletEvmAccountBasicCrossAccountIdRepr',
         collectionId: 'u32',
         itemId: 'u32',
         value: 'u128',
@@ -1438,9 +1438,9 @@
     _enum: ['ItemOwner', 'Admin', 'None']
   },
   /**
-   * Lookup172: pallet_common::account::BasicCrossAccountIdRepr<sp_core::crypto::AccountId32>
+   * Lookup172: pallet_evm::account::BasicCrossAccountIdRepr<sp_core::crypto::AccountId32>
    **/
-  PalletCommonAccountBasicCrossAccountIdRepr: {
+  PalletEvmAccountBasicCrossAccountIdRepr: {
     _enum: {
       Substrate: 'AccountId32',
       Ethereum: 'H160'
@@ -1478,31 +1478,31 @@
     pieces: 'u128'
   },
   /**
-   * Lookup180: up_data_structs::CreateItemExData<pallet_common::account::BasicCrossAccountIdRepr<sp_core::crypto::AccountId32>>
+   * Lookup180: up_data_structs::CreateItemExData<pallet_evm::account::BasicCrossAccountIdRepr<sp_core::crypto::AccountId32>>
    **/
   UpDataStructsCreateItemExData: {
     _enum: {
       NFT: 'Vec<UpDataStructsCreateNftExData>',
-      Fungible: 'BTreeMap<PalletCommonAccountBasicCrossAccountIdRepr, u128>',
+      Fungible: 'BTreeMap<PalletEvmAccountBasicCrossAccountIdRepr, u128>',
       RefungibleMultipleItems: 'Vec<UpDataStructsCreateRefungibleExData>',
       RefungibleMultipleOwners: 'UpDataStructsCreateRefungibleExData'
     }
   },
   /**
-   * Lookup182: up_data_structs::CreateNftExData<pallet_common::account::BasicCrossAccountIdRepr<sp_core::crypto::AccountId32>>
+   * Lookup182: up_data_structs::CreateNftExData<pallet_evm::account::BasicCrossAccountIdRepr<sp_core::crypto::AccountId32>>
    **/
   UpDataStructsCreateNftExData: {
     constData: 'Bytes',
     variableData: 'Bytes',
-    owner: 'PalletCommonAccountBasicCrossAccountIdRepr'
+    owner: 'PalletEvmAccountBasicCrossAccountIdRepr'
   },
   /**
-   * Lookup189: up_data_structs::CreateRefungibleExData<pallet_common::account::BasicCrossAccountIdRepr<sp_core::crypto::AccountId32>>
+   * Lookup189: up_data_structs::CreateRefungibleExData<pallet_evm::account::BasicCrossAccountIdRepr<sp_core::crypto::AccountId32>>
    **/
   UpDataStructsCreateRefungibleExData: {
     constData: 'Bytes',
     variableData: 'Bytes',
-    users: 'BTreeMap<PalletCommonAccountBasicCrossAccountIdRepr, u128>'
+    users: 'BTreeMap<PalletEvmAccountBasicCrossAccountIdRepr, u128>'
   },
   /**
    * Lookup192: pallet_template_transaction_payment::Call<T>
@@ -1756,7 +1756,7 @@
     }
   },
   /**
-   * Lookup225: frame_system::EventRecord<unique_runtime::Event, primitive_types::H256>
+   * Lookup225: frame_system::EventRecord<opal_runtime::Event, primitive_types::H256>
    **/
   FrameSystemEventRecord: {
     phase: 'FrameSystemPhase',
@@ -1902,19 +1902,19 @@
     }
   },
   /**
-   * Lookup238: pallet_unique::RawEvent<sp_core::crypto::AccountId32, pallet_common::account::BasicCrossAccountIdRepr<sp_core::crypto::AccountId32>>
+   * Lookup238: pallet_unique::RawEvent<sp_core::crypto::AccountId32, pallet_evm::account::BasicCrossAccountIdRepr<sp_core::crypto::AccountId32>>
    **/
   PalletUniqueRawEvent: {
     _enum: {
       CollectionSponsorRemoved: 'u32',
-      CollectionAdminAdded: '(u32,PalletCommonAccountBasicCrossAccountIdRepr)',
+      CollectionAdminAdded: '(u32,PalletEvmAccountBasicCrossAccountIdRepr)',
       CollectionOwnedChanged: '(u32,AccountId32)',
       CollectionSponsorSet: '(u32,AccountId32)',
       ConstOnChainSchemaSet: 'u32',
       SponsorshipConfirmed: '(u32,AccountId32)',
-      CollectionAdminRemoved: '(u32,PalletCommonAccountBasicCrossAccountIdRepr)',
-      AllowListAddressRemoved: '(u32,PalletCommonAccountBasicCrossAccountIdRepr)',
-      AllowListAddressAdded: '(u32,PalletCommonAccountBasicCrossAccountIdRepr)',
+      CollectionAdminRemoved: '(u32,PalletEvmAccountBasicCrossAccountIdRepr)',
+      AllowListAddressRemoved: '(u32,PalletEvmAccountBasicCrossAccountIdRepr)',
+      AllowListAddressAdded: '(u32,PalletEvmAccountBasicCrossAccountIdRepr)',
       CollectionLimitSet: 'u32',
       MintPermissionSet: 'u32',
       OffchainSchemaSet: 'u32',
@@ -1930,10 +1930,10 @@
     _enum: {
       CollectionCreated: '(u32,u8,AccountId32)',
       CollectionDestroyed: 'u32',
-      ItemCreated: '(u32,u32,PalletCommonAccountBasicCrossAccountIdRepr,u128)',
-      ItemDestroyed: '(u32,u32,PalletCommonAccountBasicCrossAccountIdRepr,u128)',
-      Transfer: '(u32,u32,PalletCommonAccountBasicCrossAccountIdRepr,PalletCommonAccountBasicCrossAccountIdRepr,u128)',
-      Approved: '(u32,u32,PalletCommonAccountBasicCrossAccountIdRepr,PalletCommonAccountBasicCrossAccountIdRepr,u128)'
+      ItemCreated: '(u32,u32,PalletEvmAccountBasicCrossAccountIdRepr,u128)',
+      ItemDestroyed: '(u32,u32,PalletEvmAccountBasicCrossAccountIdRepr,u128)',
+      Transfer: '(u32,u32,PalletEvmAccountBasicCrossAccountIdRepr,PalletEvmAccountBasicCrossAccountIdRepr,u128)',
+      Approved: '(u32,u32,PalletEvmAccountBasicCrossAccountIdRepr,PalletEvmAccountBasicCrossAccountIdRepr,u128)'
     }
   },
   /**
@@ -2240,7 +2240,7 @@
    * Lookup297: pallet_common::pallet::Error<T>
    **/
   PalletCommonError: {
-    _enum: ['CollectionNotFound', 'MustBeTokenOwner', 'NoPermission', 'PublicMintingNotAllowed', 'AddressNotInAllowlist', 'CollectionNameLimitExceeded', 'CollectionDescriptionLimitExceeded', 'CollectionTokenPrefixLimitExceeded', 'TotalCollectionsLimitExceeded', 'TokenVariableDataLimitExceeded', 'CollectionAdminCountExceeded', 'CollectionLimitBoundsExceeded', 'OwnerPermissionsCantBeReverted', 'TransferNotAllowed', 'AccountTokenLimitExceeded', 'CollectionTokenLimitExceeded', 'MetadataFlagFrozen', 'TokenNotFound', 'TokenValueTooLow', 'ApprovedValueTooLow', 'CantApproveMoreThanOwned', 'AddressIsZero', 'UnsupportedOperation']
+    _enum: ['CollectionNotFound', 'MustBeTokenOwner', 'NoPermission', 'PublicMintingNotAllowed', 'AddressNotInAllowlist', 'CollectionNameLimitExceeded', 'CollectionDescriptionLimitExceeded', 'CollectionTokenPrefixLimitExceeded', 'TotalCollectionsLimitExceeded', 'TokenVariableDataLimitExceeded', 'CollectionAdminCountExceeded', 'CollectionLimitBoundsExceeded', 'OwnerPermissionsCantBeReverted', 'TransferNotAllowed', 'AccountTokenLimitExceeded', 'CollectionTokenLimitExceeded', 'MetadataFlagFrozen', 'TokenNotFound', 'TokenValueTooLow', 'ApprovedValueTooLow', 'CantApproveMoreThanOwned', 'AddressIsZero', 'UnsupportedOperation', 'NotSufficientFounds']
   },
   /**
    * Lookup299: pallet_fungible::pallet::Error<T>
@@ -2262,12 +2262,12 @@
     _enum: ['NotRefungibleDataUsedToMintFungibleCollectionToken', 'WrongRefungiblePieces']
   },
   /**
-   * Lookup305: pallet_nonfungible::ItemData<pallet_common::account::BasicCrossAccountIdRepr<sp_core::crypto::AccountId32>>
+   * Lookup305: pallet_nonfungible::ItemData<pallet_evm::account::BasicCrossAccountIdRepr<sp_core::crypto::AccountId32>>
    **/
   PalletNonfungibleItemData: {
     constData: 'Bytes',
     variableData: 'Bytes',
-    owner: 'PalletCommonAccountBasicCrossAccountIdRepr'
+    owner: 'PalletEvmAccountBasicCrossAccountIdRepr'
   },
   /**
    * Lookup306: pallet_nonfungible::pallet::Error<T>
@@ -2417,11 +2417,11 @@
    **/
   FrameSystemExtensionsCheckWeight: 'Null',
   /**
-   * Lookup345: pallet_template_transaction_payment::ChargeTransactionPayment<unique_runtime::Runtime>
+   * Lookup345: pallet_template_transaction_payment::ChargeTransactionPayment<opal_runtime::Runtime>
    **/
   PalletTemplateTransactionPaymentChargeTransactionPayment: 'Compact<u128>',
   /**
-   * Lookup346: unique_runtime::Runtime
+   * Lookup346: opal_runtime::Runtime
    **/
-  UniqueRuntimeRuntime: 'Null'
+  OpalRuntimeRuntime: 'Null'
 };
modifiedtests/src/interfaces/types-lookup.tsdiffbeforeafterboth
--- a/tests/src/interfaces/types-lookup.ts
+++ b/tests/src/interfaces/types-lookup.ts
@@ -1364,12 +1364,12 @@
     readonly isAddToAllowList: boolean;
     readonly asAddToAllowList: {
       readonly collectionId: u32;
-      readonly address: PalletCommonAccountBasicCrossAccountIdRepr;
+      readonly address: PalletEvmAccountBasicCrossAccountIdRepr;
     } & Struct;
     readonly isRemoveFromAllowList: boolean;
     readonly asRemoveFromAllowList: {
       readonly collectionId: u32;
-      readonly address: PalletCommonAccountBasicCrossAccountIdRepr;
+      readonly address: PalletEvmAccountBasicCrossAccountIdRepr;
     } & Struct;
     readonly isSetPublicAccessMode: boolean;
     readonly asSetPublicAccessMode: {
@@ -1389,12 +1389,12 @@
     readonly isAddCollectionAdmin: boolean;
     readonly asAddCollectionAdmin: {
       readonly collectionId: u32;
-      readonly newAdminId: PalletCommonAccountBasicCrossAccountIdRepr;
+      readonly newAdminId: PalletEvmAccountBasicCrossAccountIdRepr;
     } & Struct;
     readonly isRemoveCollectionAdmin: boolean;
     readonly asRemoveCollectionAdmin: {
       readonly collectionId: u32;
-      readonly accountId: PalletCommonAccountBasicCrossAccountIdRepr;
+      readonly accountId: PalletEvmAccountBasicCrossAccountIdRepr;
     } & Struct;
     readonly isSetCollectionSponsor: boolean;
     readonly asSetCollectionSponsor: {
@@ -1412,13 +1412,13 @@
     readonly isCreateItem: boolean;
     readonly asCreateItem: {
       readonly collectionId: u32;
-      readonly owner: PalletCommonAccountBasicCrossAccountIdRepr;
+      readonly owner: PalletEvmAccountBasicCrossAccountIdRepr;
       readonly data: UpDataStructsCreateItemData;
     } & Struct;
     readonly isCreateMultipleItems: boolean;
     readonly asCreateMultipleItems: {
       readonly collectionId: u32;
-      readonly owner: PalletCommonAccountBasicCrossAccountIdRepr;
+      readonly owner: PalletEvmAccountBasicCrossAccountIdRepr;
       readonly itemsData: Vec<UpDataStructsCreateItemData>;
     } & Struct;
     readonly isCreateMultipleItemsEx: boolean;
@@ -1440,28 +1440,28 @@
     readonly isBurnFrom: boolean;
     readonly asBurnFrom: {
       readonly collectionId: u32;
-      readonly from: PalletCommonAccountBasicCrossAccountIdRepr;
+      readonly from: PalletEvmAccountBasicCrossAccountIdRepr;
       readonly itemId: u32;
       readonly value: u128;
     } & Struct;
     readonly isTransfer: boolean;
     readonly asTransfer: {
-      readonly recipient: PalletCommonAccountBasicCrossAccountIdRepr;
+      readonly recipient: PalletEvmAccountBasicCrossAccountIdRepr;
       readonly collectionId: u32;
       readonly itemId: u32;
       readonly value: u128;
     } & Struct;
     readonly isApprove: boolean;
     readonly asApprove: {
-      readonly spender: PalletCommonAccountBasicCrossAccountIdRepr;
+      readonly spender: PalletEvmAccountBasicCrossAccountIdRepr;
       readonly collectionId: u32;
       readonly itemId: u32;
       readonly amount: u128;
     } & Struct;
     readonly isTransferFrom: boolean;
     readonly asTransferFrom: {
-      readonly from: PalletCommonAccountBasicCrossAccountIdRepr;
-      readonly recipient: PalletCommonAccountBasicCrossAccountIdRepr;
+      readonly from: PalletEvmAccountBasicCrossAccountIdRepr;
+      readonly recipient: PalletEvmAccountBasicCrossAccountIdRepr;
       readonly collectionId: u32;
       readonly itemId: u32;
       readonly value: u128;
@@ -1573,8 +1573,8 @@
     readonly type: 'ItemOwner' | 'Admin' | 'None';
   }
 
-  /** @name PalletCommonAccountBasicCrossAccountIdRepr (172) */
-  export interface PalletCommonAccountBasicCrossAccountIdRepr extends Enum {
+  /** @name PalletEvmAccountBasicCrossAccountIdRepr (172) */
+  export interface PalletEvmAccountBasicCrossAccountIdRepr extends Enum {
     readonly isSubstrate: boolean;
     readonly asSubstrate: AccountId32;
     readonly isEthereum: boolean;
@@ -1616,7 +1616,7 @@
     readonly isNft: boolean;
     readonly asNft: Vec<UpDataStructsCreateNftExData>;
     readonly isFungible: boolean;
-    readonly asFungible: BTreeMap<PalletCommonAccountBasicCrossAccountIdRepr, u128>;
+    readonly asFungible: BTreeMap<PalletEvmAccountBasicCrossAccountIdRepr, u128>;
     readonly isRefungibleMultipleItems: boolean;
     readonly asRefungibleMultipleItems: Vec<UpDataStructsCreateRefungibleExData>;
     readonly isRefungibleMultipleOwners: boolean;
@@ -1628,14 +1628,14 @@
   export interface UpDataStructsCreateNftExData extends Struct {
     readonly constData: Bytes;
     readonly variableData: Bytes;
-    readonly owner: PalletCommonAccountBasicCrossAccountIdRepr;
+    readonly owner: PalletEvmAccountBasicCrossAccountIdRepr;
   }
 
   /** @name UpDataStructsCreateRefungibleExData (189) */
   export interface UpDataStructsCreateRefungibleExData extends Struct {
     readonly constData: Bytes;
     readonly variableData: Bytes;
-    readonly users: BTreeMap<PalletCommonAccountBasicCrossAccountIdRepr, u128>;
+    readonly users: BTreeMap<PalletEvmAccountBasicCrossAccountIdRepr, u128>;
   }
 
   /** @name PalletTemplateTransactionPaymentCall (192) */
@@ -2068,7 +2068,7 @@
     readonly isCollectionSponsorRemoved: boolean;
     readonly asCollectionSponsorRemoved: u32;
     readonly isCollectionAdminAdded: boolean;
-    readonly asCollectionAdminAdded: ITuple<[u32, PalletCommonAccountBasicCrossAccountIdRepr]>;
+    readonly asCollectionAdminAdded: ITuple<[u32, PalletEvmAccountBasicCrossAccountIdRepr]>;
     readonly isCollectionOwnedChanged: boolean;
     readonly asCollectionOwnedChanged: ITuple<[u32, AccountId32]>;
     readonly isCollectionSponsorSet: boolean;
@@ -2078,11 +2078,11 @@
     readonly isSponsorshipConfirmed: boolean;
     readonly asSponsorshipConfirmed: ITuple<[u32, AccountId32]>;
     readonly isCollectionAdminRemoved: boolean;
-    readonly asCollectionAdminRemoved: ITuple<[u32, PalletCommonAccountBasicCrossAccountIdRepr]>;
+    readonly asCollectionAdminRemoved: ITuple<[u32, PalletEvmAccountBasicCrossAccountIdRepr]>;
     readonly isAllowListAddressRemoved: boolean;
-    readonly asAllowListAddressRemoved: ITuple<[u32, PalletCommonAccountBasicCrossAccountIdRepr]>;
+    readonly asAllowListAddressRemoved: ITuple<[u32, PalletEvmAccountBasicCrossAccountIdRepr]>;
     readonly isAllowListAddressAdded: boolean;
-    readonly asAllowListAddressAdded: ITuple<[u32, PalletCommonAccountBasicCrossAccountIdRepr]>;
+    readonly asAllowListAddressAdded: ITuple<[u32, PalletEvmAccountBasicCrossAccountIdRepr]>;
     readonly isCollectionLimitSet: boolean;
     readonly asCollectionLimitSet: u32;
     readonly isMintPermissionSet: boolean;
@@ -2105,13 +2105,13 @@
     readonly isCollectionDestroyed: boolean;
     readonly asCollectionDestroyed: u32;
     readonly isItemCreated: boolean;
-    readonly asItemCreated: ITuple<[u32, u32, PalletCommonAccountBasicCrossAccountIdRepr, u128]>;
+    readonly asItemCreated: ITuple<[u32, u32, PalletEvmAccountBasicCrossAccountIdRepr, u128]>;
     readonly isItemDestroyed: boolean;
-    readonly asItemDestroyed: ITuple<[u32, u32, PalletCommonAccountBasicCrossAccountIdRepr, u128]>;
+    readonly asItemDestroyed: ITuple<[u32, u32, PalletEvmAccountBasicCrossAccountIdRepr, u128]>;
     readonly isTransfer: boolean;
-    readonly asTransfer: ITuple<[u32, u32, PalletCommonAccountBasicCrossAccountIdRepr, PalletCommonAccountBasicCrossAccountIdRepr, u128]>;
+    readonly asTransfer: ITuple<[u32, u32, PalletEvmAccountBasicCrossAccountIdRepr, PalletEvmAccountBasicCrossAccountIdRepr, u128]>;
     readonly isApproved: boolean;
-    readonly asApproved: ITuple<[u32, u32, PalletCommonAccountBasicCrossAccountIdRepr, PalletCommonAccountBasicCrossAccountIdRepr, u128]>;
+    readonly asApproved: ITuple<[u32, u32, PalletEvmAccountBasicCrossAccountIdRepr, PalletEvmAccountBasicCrossAccountIdRepr, u128]>;
     readonly type: 'CollectionCreated' | 'CollectionDestroyed' | 'ItemCreated' | 'ItemDestroyed' | 'Transfer' | 'Approved';
   }
 
@@ -2462,7 +2462,8 @@
     readonly isCantApproveMoreThanOwned: boolean;
     readonly isAddressIsZero: boolean;
     readonly isUnsupportedOperation: boolean;
-    readonly type: 'CollectionNotFound' | 'MustBeTokenOwner' | 'NoPermission' | 'PublicMintingNotAllowed' | 'AddressNotInAllowlist' | 'CollectionNameLimitExceeded' | 'CollectionDescriptionLimitExceeded' | 'CollectionTokenPrefixLimitExceeded' | 'TotalCollectionsLimitExceeded' | 'TokenVariableDataLimitExceeded' | 'CollectionAdminCountExceeded' | 'CollectionLimitBoundsExceeded' | 'OwnerPermissionsCantBeReverted' | 'TransferNotAllowed' | 'AccountTokenLimitExceeded' | 'CollectionTokenLimitExceeded' | 'MetadataFlagFrozen' | 'TokenNotFound' | 'TokenValueTooLow' | 'ApprovedValueTooLow' | 'CantApproveMoreThanOwned' | 'AddressIsZero' | 'UnsupportedOperation';
+    readonly isNotSufficientFounds: boolean;
+    readonly type: 'CollectionNotFound' | 'MustBeTokenOwner' | 'NoPermission' | 'PublicMintingNotAllowed' | 'AddressNotInAllowlist' | 'CollectionNameLimitExceeded' | 'CollectionDescriptionLimitExceeded' | 'CollectionTokenPrefixLimitExceeded' | 'TotalCollectionsLimitExceeded' | 'TokenVariableDataLimitExceeded' | 'CollectionAdminCountExceeded' | 'CollectionLimitBoundsExceeded' | 'OwnerPermissionsCantBeReverted' | 'TransferNotAllowed' | 'AccountTokenLimitExceeded' | 'CollectionTokenLimitExceeded' | 'MetadataFlagFrozen' | 'TokenNotFound' | 'TokenValueTooLow' | 'ApprovedValueTooLow' | 'CantApproveMoreThanOwned' | 'AddressIsZero' | 'UnsupportedOperation' | 'NotSufficientFounds';
   }
 
   /** @name PalletFungibleError (299) */
@@ -2490,7 +2491,7 @@
   export interface PalletNonfungibleItemData extends Struct {
     readonly constData: Bytes;
     readonly variableData: Bytes;
-    readonly owner: PalletCommonAccountBasicCrossAccountIdRepr;
+    readonly owner: PalletEvmAccountBasicCrossAccountIdRepr;
   }
 
   /** @name PalletNonfungibleError (306) */
@@ -2643,7 +2644,7 @@
   /** @name PalletTemplateTransactionPaymentChargeTransactionPayment (345) */
   export interface PalletTemplateTransactionPaymentChargeTransactionPayment extends Compact<u128> {}
 
-  /** @name UniqueRuntimeRuntime (346) */
-  export type UniqueRuntimeRuntime = Null;
+  /** @name OpalRuntimeRuntime (346) */
+  export type OpalRuntimeRuntime = Null;
 
 } // declare module
modifiedtests/src/interfaces/unique/definitions.tsdiffbeforeafterboth
--- a/tests/src/interfaces/unique/definitions.ts
+++ b/tests/src/interfaces/unique/definitions.ts
@@ -22,7 +22,7 @@
   isOptional?: true;
 };
 
-const CROSS_ACCOUNT_ID_TYPE = 'PalletCommonAccountBasicCrossAccountIdRepr';
+const CROSS_ACCOUNT_ID_TYPE = 'PalletEvmAccountBasicCrossAccountIdRepr';
 
 const collectionParam = {name: 'collection', type: 'u32'};
 const tokenParam = {name: 'tokenId', type: 'u32'};
@@ -38,8 +38,8 @@
 export default {
   types,
   rpc: {
-    adminlist: fun('Get admin list', [collectionParam], 'Vec<PalletCommonAccountBasicCrossAccountIdRepr>'),
-    allowlist: fun('Get allowlist', [collectionParam], 'Vec<PalletCommonAccountBasicCrossAccountIdRepr>'),
+    adminlist: fun('Get admin list', [collectionParam], 'Vec<PalletEvmAccountBasicCrossAccountIdRepr>'),
+    allowlist: fun('Get allowlist', [collectionParam], 'Vec<PalletEvmAccountBasicCrossAccountIdRepr>'),
 
     accountTokens: fun('Get tokens owned by account', [collectionParam, crossAccountParam()], 'Vec<u32>'),
     collectionTokens: fun('Get tokens contained in collection', [collectionParam], 'Vec<u32>'),
modifiedtests/src/interfaces/unique/types.tsdiffbeforeafterboth
--- a/tests/src/interfaces/unique/types.ts
+++ b/tests/src/interfaces/unique/types.ts
@@ -654,6 +654,9 @@
   readonly type: 'ApplyExtrinsic' | 'Finalization' | 'Initialization';
 }
 
+/** @name OpalRuntimeRuntime */
+export interface OpalRuntimeRuntime extends Null {}
+
 /** @name OrmlVestingModuleCall */
 export interface OrmlVestingModuleCall extends Enum {
   readonly isClaim: boolean;
@@ -858,15 +861,6 @@
   readonly amount: u128;
 }
 
-/** @name PalletCommonAccountBasicCrossAccountIdRepr */
-export interface PalletCommonAccountBasicCrossAccountIdRepr extends Enum {
-  readonly isSubstrate: boolean;
-  readonly asSubstrate: AccountId32;
-  readonly isEthereum: boolean;
-  readonly asEthereum: H160;
-  readonly type: 'Substrate' | 'Ethereum';
-}
-
 /** @name PalletCommonError */
 export interface PalletCommonError extends Enum {
   readonly isCollectionNotFound: boolean;
@@ -892,7 +886,8 @@
   readonly isCantApproveMoreThanOwned: boolean;
   readonly isAddressIsZero: boolean;
   readonly isUnsupportedOperation: boolean;
-  readonly type: 'CollectionNotFound' | 'MustBeTokenOwner' | 'NoPermission' | 'PublicMintingNotAllowed' | 'AddressNotInAllowlist' | 'CollectionNameLimitExceeded' | 'CollectionDescriptionLimitExceeded' | 'CollectionTokenPrefixLimitExceeded' | 'TotalCollectionsLimitExceeded' | 'TokenVariableDataLimitExceeded' | 'CollectionAdminCountExceeded' | 'CollectionLimitBoundsExceeded' | 'OwnerPermissionsCantBeReverted' | 'TransferNotAllowed' | 'AccountTokenLimitExceeded' | 'CollectionTokenLimitExceeded' | 'MetadataFlagFrozen' | 'TokenNotFound' | 'TokenValueTooLow' | 'ApprovedValueTooLow' | 'CantApproveMoreThanOwned' | 'AddressIsZero' | 'UnsupportedOperation';
+  readonly isNotSufficientFounds: boolean;
+  readonly type: 'CollectionNotFound' | 'MustBeTokenOwner' | 'NoPermission' | 'PublicMintingNotAllowed' | 'AddressNotInAllowlist' | 'CollectionNameLimitExceeded' | 'CollectionDescriptionLimitExceeded' | 'CollectionTokenPrefixLimitExceeded' | 'TotalCollectionsLimitExceeded' | 'TokenVariableDataLimitExceeded' | 'CollectionAdminCountExceeded' | 'CollectionLimitBoundsExceeded' | 'OwnerPermissionsCantBeReverted' | 'TransferNotAllowed' | 'AccountTokenLimitExceeded' | 'CollectionTokenLimitExceeded' | 'MetadataFlagFrozen' | 'TokenNotFound' | 'TokenValueTooLow' | 'ApprovedValueTooLow' | 'CantApproveMoreThanOwned' | 'AddressIsZero' | 'UnsupportedOperation' | 'NotSufficientFounds';
 }
 
 /** @name PalletCommonEvent */
@@ -902,13 +897,13 @@
   readonly isCollectionDestroyed: boolean;
   readonly asCollectionDestroyed: u32;
   readonly isItemCreated: boolean;
-  readonly asItemCreated: ITuple<[u32, u32, PalletCommonAccountBasicCrossAccountIdRepr, u128]>;
+  readonly asItemCreated: ITuple<[u32, u32, PalletEvmAccountBasicCrossAccountIdRepr, u128]>;
   readonly isItemDestroyed: boolean;
-  readonly asItemDestroyed: ITuple<[u32, u32, PalletCommonAccountBasicCrossAccountIdRepr, u128]>;
+  readonly asItemDestroyed: ITuple<[u32, u32, PalletEvmAccountBasicCrossAccountIdRepr, u128]>;
   readonly isTransfer: boolean;
-  readonly asTransfer: ITuple<[u32, u32, PalletCommonAccountBasicCrossAccountIdRepr, PalletCommonAccountBasicCrossAccountIdRepr, u128]>;
+  readonly asTransfer: ITuple<[u32, u32, PalletEvmAccountBasicCrossAccountIdRepr, PalletEvmAccountBasicCrossAccountIdRepr, u128]>;
   readonly isApproved: boolean;
-  readonly asApproved: ITuple<[u32, u32, PalletCommonAccountBasicCrossAccountIdRepr, PalletCommonAccountBasicCrossAccountIdRepr, u128]>;
+  readonly asApproved: ITuple<[u32, u32, PalletEvmAccountBasicCrossAccountIdRepr, PalletEvmAccountBasicCrossAccountIdRepr, u128]>;
   readonly type: 'CollectionCreated' | 'CollectionDestroyed' | 'ItemCreated' | 'ItemDestroyed' | 'Transfer' | 'Approved';
 }
 
@@ -935,6 +930,15 @@
   readonly type: 'Executed';
 }
 
+/** @name PalletEvmAccountBasicCrossAccountIdRepr */
+export interface PalletEvmAccountBasicCrossAccountIdRepr extends Enum {
+  readonly isSubstrate: boolean;
+  readonly asSubstrate: AccountId32;
+  readonly isEthereum: boolean;
+  readonly asEthereum: H160;
+  readonly type: 'Substrate' | 'Ethereum';
+}
+
 /** @name PalletEvmCall */
 export interface PalletEvmCall extends Enum {
   readonly isWithdraw: boolean;
@@ -1085,7 +1089,7 @@
 export interface PalletNonfungibleItemData extends Struct {
   readonly constData: Bytes;
   readonly variableData: Bytes;
-  readonly owner: PalletCommonAccountBasicCrossAccountIdRepr;
+  readonly owner: PalletEvmAccountBasicCrossAccountIdRepr;
 }
 
 /** @name PalletRefungibleError */
@@ -1259,12 +1263,12 @@
   readonly isAddToAllowList: boolean;
   readonly asAddToAllowList: {
     readonly collectionId: u32;
-    readonly address: PalletCommonAccountBasicCrossAccountIdRepr;
+    readonly address: PalletEvmAccountBasicCrossAccountIdRepr;
   } & Struct;
   readonly isRemoveFromAllowList: boolean;
   readonly asRemoveFromAllowList: {
     readonly collectionId: u32;
-    readonly address: PalletCommonAccountBasicCrossAccountIdRepr;
+    readonly address: PalletEvmAccountBasicCrossAccountIdRepr;
   } & Struct;
   readonly isSetPublicAccessMode: boolean;
   readonly asSetPublicAccessMode: {
@@ -1284,12 +1288,12 @@
   readonly isAddCollectionAdmin: boolean;
   readonly asAddCollectionAdmin: {
     readonly collectionId: u32;
-    readonly newAdminId: PalletCommonAccountBasicCrossAccountIdRepr;
+    readonly newAdminId: PalletEvmAccountBasicCrossAccountIdRepr;
   } & Struct;
   readonly isRemoveCollectionAdmin: boolean;
   readonly asRemoveCollectionAdmin: {
     readonly collectionId: u32;
-    readonly accountId: PalletCommonAccountBasicCrossAccountIdRepr;
+    readonly accountId: PalletEvmAccountBasicCrossAccountIdRepr;
   } & Struct;
   readonly isSetCollectionSponsor: boolean;
   readonly asSetCollectionSponsor: {
@@ -1307,13 +1311,13 @@
   readonly isCreateItem: boolean;
   readonly asCreateItem: {
     readonly collectionId: u32;
-    readonly owner: PalletCommonAccountBasicCrossAccountIdRepr;
+    readonly owner: PalletEvmAccountBasicCrossAccountIdRepr;
     readonly data: UpDataStructsCreateItemData;
   } & Struct;
   readonly isCreateMultipleItems: boolean;
   readonly asCreateMultipleItems: {
     readonly collectionId: u32;
-    readonly owner: PalletCommonAccountBasicCrossAccountIdRepr;
+    readonly owner: PalletEvmAccountBasicCrossAccountIdRepr;
     readonly itemsData: Vec<UpDataStructsCreateItemData>;
   } & Struct;
   readonly isCreateMultipleItemsEx: boolean;
@@ -1335,28 +1339,28 @@
   readonly isBurnFrom: boolean;
   readonly asBurnFrom: {
     readonly collectionId: u32;
-    readonly from: PalletCommonAccountBasicCrossAccountIdRepr;
+    readonly from: PalletEvmAccountBasicCrossAccountIdRepr;
     readonly itemId: u32;
     readonly value: u128;
   } & Struct;
   readonly isTransfer: boolean;
   readonly asTransfer: {
-    readonly recipient: PalletCommonAccountBasicCrossAccountIdRepr;
+    readonly recipient: PalletEvmAccountBasicCrossAccountIdRepr;
     readonly collectionId: u32;
     readonly itemId: u32;
     readonly value: u128;
   } & Struct;
   readonly isApprove: boolean;
   readonly asApprove: {
-    readonly spender: PalletCommonAccountBasicCrossAccountIdRepr;
+    readonly spender: PalletEvmAccountBasicCrossAccountIdRepr;
     readonly collectionId: u32;
     readonly itemId: u32;
     readonly amount: u128;
   } & Struct;
   readonly isTransferFrom: boolean;
   readonly asTransferFrom: {
-    readonly from: PalletCommonAccountBasicCrossAccountIdRepr;
-    readonly recipient: PalletCommonAccountBasicCrossAccountIdRepr;
+    readonly from: PalletEvmAccountBasicCrossAccountIdRepr;
+    readonly recipient: PalletEvmAccountBasicCrossAccountIdRepr;
     readonly collectionId: u32;
     readonly itemId: u32;
     readonly value: u128;
@@ -1413,7 +1417,7 @@
   readonly isCollectionSponsorRemoved: boolean;
   readonly asCollectionSponsorRemoved: u32;
   readonly isCollectionAdminAdded: boolean;
-  readonly asCollectionAdminAdded: ITuple<[u32, PalletCommonAccountBasicCrossAccountIdRepr]>;
+  readonly asCollectionAdminAdded: ITuple<[u32, PalletEvmAccountBasicCrossAccountIdRepr]>;
   readonly isCollectionOwnedChanged: boolean;
   readonly asCollectionOwnedChanged: ITuple<[u32, AccountId32]>;
   readonly isCollectionSponsorSet: boolean;
@@ -1423,11 +1427,11 @@
   readonly isSponsorshipConfirmed: boolean;
   readonly asSponsorshipConfirmed: ITuple<[u32, AccountId32]>;
   readonly isCollectionAdminRemoved: boolean;
-  readonly asCollectionAdminRemoved: ITuple<[u32, PalletCommonAccountBasicCrossAccountIdRepr]>;
+  readonly asCollectionAdminRemoved: ITuple<[u32, PalletEvmAccountBasicCrossAccountIdRepr]>;
   readonly isAllowListAddressRemoved: boolean;
-  readonly asAllowListAddressRemoved: ITuple<[u32, PalletCommonAccountBasicCrossAccountIdRepr]>;
+  readonly asAllowListAddressRemoved: ITuple<[u32, PalletEvmAccountBasicCrossAccountIdRepr]>;
   readonly isAllowListAddressAdded: boolean;
-  readonly asAllowListAddressAdded: ITuple<[u32, PalletCommonAccountBasicCrossAccountIdRepr]>;
+  readonly asAllowListAddressAdded: ITuple<[u32, PalletEvmAccountBasicCrossAccountIdRepr]>;
   readonly isCollectionLimitSet: boolean;
   readonly asCollectionLimitSet: u32;
   readonly isMintPermissionSet: boolean;
@@ -1722,9 +1726,6 @@
   readonly stateVersion: u8;
 }
 
-/** @name UniqueRuntimeRuntime */
-export interface UniqueRuntimeRuntime extends Null {}
-
 /** @name UpDataStructsAccessMode */
 export interface UpDataStructsAccessMode extends Enum {
   readonly isNormal: boolean;
@@ -1816,7 +1817,7 @@
   readonly isNft: boolean;
   readonly asNft: Vec<UpDataStructsCreateNftExData>;
   readonly isFungible: boolean;
-  readonly asFungible: BTreeMap<PalletCommonAccountBasicCrossAccountIdRepr,u128>;
+  readonly asFungible: BTreeMap<PalletEvmAccountBasicCrossAccountIdRepr,u128>;
   readonly isRefungibleMultipleItems: boolean;
   readonly asRefungibleMultipleItems: Vec<UpDataStructsCreateRefungibleExData>;
   readonly isRefungibleMultipleOwners: boolean;
@@ -1834,7 +1835,7 @@
 export interface UpDataStructsCreateNftExData extends Struct {
   readonly constData: Bytes;
   readonly variableData: Bytes;
-  readonly owner: PalletCommonAccountBasicCrossAccountIdRepr;
+  readonly owner: PalletEvmAccountBasicCrossAccountIdRepr;
 }
 
 /** @name UpDataStructsCreateReFungibleData */
@@ -1848,7 +1849,7 @@
 export interface UpDataStructsCreateRefungibleExData extends Struct {
   readonly constData: Bytes;
   readonly variableData: Bytes;
-  readonly users: BTreeMap<PalletCommonAccountBasicCrossAccountIdRepr, u128>;
+  readonly users: BTreeMap<PalletEvmAccountBasicCrossAccountIdRepr, u128>;
 }
 
 /** @name UpDataStructsMetaUpdatePermission */
modifiedtests/src/util/helpers.tsdiffbeforeafterboth
--- a/tests/src/util/helpers.ts
+++ b/tests/src/util/helpers.ts
@@ -839,6 +839,13 @@
   return balance;
 }
 
+export async function transferBalanceTo(api: ApiPromise, source: IKeyringPair, target: string, amount = 1000n * UNIQUE) {
+  const tx = api.tx.balances.transfer(target, amount);
+  const events = await submitTransactionAsync(source, tx);
+  const result = getGenericResult(events);
+  expect(result.success).to.be.true;
+}
+
 export async function
 scheduleTransferExpectSuccess(
   collectionId: number,