12345678910111213141516171819#![cfg_attr(not(feature = "std"), no_std)]2021#![recursion_limit = "1024"]22#![allow(clippy::from_over_into, clippy::identity_op)]23#![allow(clippy::fn_to_numeric_cast_with_truncation)]2425#[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;31323334use 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};4950pub use pallet_balances::Call as BalancesCall;51pub use pallet_evm::{52 EnsureAddressTruncated, HashedAddressMapping, Runner, account::CrossAccountId as _, OnMethodCall,53 Account as EVMAccount, FeeCalculator, GasWeightMapping,54};55pub use frame_support::{56 construct_runtime, match_types,57 dispatch::DispatchResult,58 PalletId, parameter_types, StorageValue, ConsensusEngineId,59 traits::{60 tokens::currency::Currency as CurrencyT, OnUnbalanced as OnUnbalancedT, Everything,61 Currency, ExistenceRequirement, Get, IsInVec, KeyOwnerProofSystem, LockIdentifier,62 OnUnbalanced, Randomness, FindAuthor, ConstU32, Imbalance,63 },64 weights::{65 constants::{BlockExecutionWeight, ExtrinsicBaseWeight, RocksDbWeight, WEIGHT_PER_SECOND},66 DispatchClass, DispatchInfo, GetDispatchInfo, IdentityFee, Pays, PostDispatchInfo, Weight,67 WeightToFeePolynomial, WeightToFeeCoefficient, WeightToFeeCoefficients, ConstantMultiplier,68 },69};70use up_data_structs::mapping::{EvmTokenAddressMapping, CrossTokenAddressMapping};71use up_data_structs::*;727374use frame_system::{75 self as frame_system, EnsureRoot, EnsureSigned,76 limits::{BlockWeights, BlockLength},77};78use sp_arithmetic::{79 traits::{BaseArithmetic, Unsigned},80};81use smallvec::smallvec;82use codec::{Encode, Decode};83use pallet_unique::eth::evm_collection;84use fp_rpc::TransactionStatus;85use sp_runtime::{86 traits::{BlockNumberProvider, Dispatchable, PostDispatchInfoOf, Saturating},87 transaction_validity::TransactionValidityError,88 SaturatedConversion,89};909192pub use sp_consensus_aura::sr25519::AuthorityId as AuraId;939495use pallet_xcm::XcmPassthrough;96use polkadot_parachain::primitives::Sibling;97use xcm::v1::{BodyId, Junction::*, MultiLocation, NetworkId, Junctions::*};98use xcm_builder::{99 AccountId32Aliases, AllowTopLevelPaidExecutionFrom, AllowUnpaidExecutionFrom, CurrencyAdapter,100 EnsureXcmOrigin, FixedWeightBounds, LocationInverter, NativeAsset, ParentAsSuperuser,101 RelayChainAsNative, SiblingParachainAsNative, SiblingParachainConvertsVia,102 SignedAccountId32AsNative, SignedToAccountId32, SovereignSignedViaLocation, TakeWeightCredit,103 ParentIsPreset,104};105use xcm_executor::{Config, XcmExecutor, Assets};106use sp_std::{marker::PhantomData};107108use xcm::latest::{109 110 AssetId::{Concrete},111 Fungibility::Fungible as XcmFungible,112 MultiAsset,113 Error as XcmError,114};115use xcm_executor::traits::{MatchesFungible, WeightTrader};116117use sp_runtime::traits::CheckedConversion;118119use unique_runtime_common::{120 impl_common_runtime_apis,121 types::*,122 constants::*,123 dispatch::{CollectionDispatchT, CollectionDispatch},124 sponsoring::UniqueSponsorshipHandler,125 eth_sponsoring::UniqueEthSponsorshipHandler,126 weights::CommonWeights,127};128129pub const RUNTIME_NAME: &str = "opal";130pub const TOKEN_SYMBOL: &str = "OPL";131132type CrossAccountId = pallet_evm::account::BasicCrossAccountId<Runtime>;133134impl RuntimeInstance for Runtime {135 type CrossAccountId = self::CrossAccountId;136 type TransactionConverter = self::TransactionConverter;137138 fn get_transaction_converter() -> TransactionConverter {139 TransactionConverter140 }141}142143144145pub type AccountIndex = u32;146147148pub type Balance = u128;149150151pub type Index = u32;152153154pub type Hash = sp_core::H256;155156157pub type DigestItem = generic::DigestItem;158159160161162163pub mod opaque {164 use sp_std::prelude::*;165 use sp_runtime::impl_opaque_keys;166 use super::Aura;167168 pub use unique_runtime_common::types::*;169170 impl_opaque_keys! {171 pub struct SessionKeys {172 pub aura: Aura,173 }174 }175}176177178pub const VERSION: RuntimeVersion = RuntimeVersion {179 spec_name: create_runtime_str!(RUNTIME_NAME),180 impl_name: create_runtime_str!(RUNTIME_NAME),181 authoring_version: 1,182 spec_version: 920000,183 impl_version: 0,184 apis: RUNTIME_API_VERSIONS,185 transaction_version: 1,186 state_version: 0,187};188189#[derive(codec::Encode, codec::Decode)]190pub enum XCMPMessage<XAccountId, XBalance> {191 192 TransferToken(XAccountId, XBalance),193}194195196#[cfg(feature = "std")]197pub fn native_version() -> NativeVersion {198 NativeVersion {199 runtime_version: VERSION,200 can_author_with: Default::default(),201 }202}203204type NegativeImbalance = <Balances as Currency<AccountId>>::NegativeImbalance;205206pub struct DealWithFees;207impl OnUnbalanced<NegativeImbalance> for DealWithFees {208 fn on_unbalanceds<B>(mut fees_then_tips: impl Iterator<Item = NegativeImbalance>) {209 if let Some(fees) = fees_then_tips.next() {210 211 let mut split = fees.ration(100, 0);212 if let Some(tips) = fees_then_tips.next() {213 214 tips.ration_merge_into(100, 0, &mut split);215 }216 Treasury::on_unbalanced(split.0);217 218 }219 }220}221222parameter_types! {223 pub const BlockHashCount: BlockNumber = 2400;224 pub RuntimeBlockLength: BlockLength =225 BlockLength::max_with_normal_ratio(5 * 1024 * 1024, NORMAL_DISPATCH_RATIO);226 pub const AvailableBlockRatio: Perbill = Perbill::from_percent(75);227 pub const MaximumBlockLength: u32 = 5 * 1024 * 1024;228 pub RuntimeBlockWeights: BlockWeights = BlockWeights::builder()229 .base_block(BlockExecutionWeight::get())230 .for_class(DispatchClass::all(), |weights| {231 weights.base_extrinsic = ExtrinsicBaseWeight::get();232 })233 .for_class(DispatchClass::Normal, |weights| {234 weights.max_total = Some(NORMAL_DISPATCH_RATIO * MAXIMUM_BLOCK_WEIGHT);235 })236 .for_class(DispatchClass::Operational, |weights| {237 weights.max_total = Some(MAXIMUM_BLOCK_WEIGHT);238 239 240 weights.reserved = Some(241 MAXIMUM_BLOCK_WEIGHT - NORMAL_DISPATCH_RATIO * MAXIMUM_BLOCK_WEIGHT242 );243 })244 .avg_block_initialization(AVERAGE_ON_INITIALIZE_RATIO)245 .build_or_panic();246 pub const Version: RuntimeVersion = VERSION;247 pub const SS58Prefix: u8 = 42;248}249250parameter_types! {251 pub const ChainId: u64 = 8882;252}253254pub struct FixedFee;255impl FeeCalculator for FixedFee {256 fn min_gas_price() -> U256 {257 MIN_GAS_PRICE.into()258 }259}260261262263264parameter_types! {265 pub const WritesPerSecond: u64 = WEIGHT_PER_SECOND / <Runtime as frame_system::Config>::DbWeight::get().write;266 pub const GasPerSecond: u64 = WritesPerSecond::get() * 20000;267 pub const WeightPerGas: u64 = WEIGHT_PER_SECOND / GasPerSecond::get();268}269270271272273const EVM_DISPATCH_RATIO: Perbill = Perbill::from_percent(50);274parameter_types! {275 pub BlockGasLimit: U256 = U256::from(NORMAL_DISPATCH_RATIO * EVM_DISPATCH_RATIO * MAXIMUM_BLOCK_WEIGHT / WeightPerGas::get());276}277278pub enum FixedGasWeightMapping {}279impl GasWeightMapping for FixedGasWeightMapping {280 fn gas_to_weight(gas: u64) -> Weight {281 gas.saturating_mul(WeightPerGas::get())282 }283 fn weight_to_gas(weight: Weight) -> u64 {284 weight / WeightPerGas::get()285 }286}287288impl pallet_evm::account::Config for Runtime {289 type CrossAccountId = pallet_evm::account::BasicCrossAccountId<Self>;290 type EvmAddressMapping = pallet_evm::HashedAddressMapping<Self::Hashing>;291 type EvmBackwardsAddressMapping = fp_evm_mapping::MapBackwardsAddressTruncated;292}293294impl pallet_evm::Config for Runtime {295 type BlockGasLimit = BlockGasLimit;296 type FeeCalculator = FixedFee;297 type GasWeightMapping = FixedGasWeightMapping;298 type BlockHashMapping = pallet_ethereum::EthereumBlockHashMapping<Self>;299 type CallOrigin = EnsureAddressTruncated<Self>;300 type WithdrawOrigin = EnsureAddressTruncated<Self>;301 type AddressMapping = HashedAddressMapping<Self::Hashing>;302 type PrecompilesType = ();303 type PrecompilesValue = ();304 type Currency = Balances;305 type Event = Event;306 type OnMethodCall = (307 pallet_evm_migration::OnMethodCall<Self>,308 pallet_evm_contract_helpers::HelpersOnMethodCall<Self>,309 CollectionDispatchT<Self>,310 evm_collection::CollectionOnMethodCall<Self>,311 evm_collection::CollectionHelperOnMethodCall<Self>,312 );313 type OnCreate = pallet_evm_contract_helpers::HelpersOnCreate<Self>;314 type ChainId = ChainId;315 type Runner = pallet_evm::runner::stack::Runner<Self>;316 type OnChargeTransaction = pallet_evm::EVMCurrencyAdapter<Balances, DealWithFees>;317 type TransactionValidityHack = pallet_evm_transaction_payment::TransactionValidityHack<Self>;318 type FindAuthor = EthereumFindAuthor<Aura>;319}320321impl pallet_evm_migration::Config for Runtime {322 type WeightInfo = pallet_evm_migration::weights::SubstrateWeight<Self>;323}324325pub struct EthereumFindAuthor<F>(core::marker::PhantomData<F>);326impl<F: FindAuthor<u32>> FindAuthor<H160> for EthereumFindAuthor<F> {327 fn find_author<'a, I>(digests: I) -> Option<H160>328 where329 I: 'a + IntoIterator<Item = (ConsensusEngineId, &'a [u8])>,330 {331 if let Some(author_index) = F::find_author(digests) {332 let authority_id = Aura::authorities()[author_index as usize].clone();333 return Some(H160::from_slice(&authority_id.to_raw_vec()[4..24]));334 }335 None336 }337}338339impl pallet_ethereum::Config for Runtime {340 type Event = Event;341 type StateRoot = pallet_ethereum::IntermediateStateRoot<Self>;342}343344impl pallet_randomness_collective_flip::Config for Runtime {}345346impl frame_system::Config for Runtime {347 348 type AccountData = pallet_balances::AccountData<Balance>;349 350 type AccountId = AccountId;351 352 type BaseCallFilter = Everything;353 354 type BlockHashCount = BlockHashCount;355 356 type BlockLength = RuntimeBlockLength;357 358 type BlockNumber = BlockNumber;359 360 type BlockWeights = RuntimeBlockWeights;361 362 type Call = Call;363 364 type DbWeight = RocksDbWeight;365 366 type Event = Event;367 368 type Hash = Hash;369 370 type Hashing = BlakeTwo256;371 372 type Header = generic::Header<BlockNumber, BlakeTwo256>;373 374 type Index = Index;375 376 type Lookup = AccountIdLookup<AccountId, ()>;377 378 type OnKilledAccount = ();379 380 type OnNewAccount = ();381 type OnSetCode = cumulus_pallet_parachain_system::ParachainSetCode<Self>;382 383 type Origin = Origin;384 385 type PalletInfo = PalletInfo;386 387 type SS58Prefix = SS58Prefix;388 389 type SystemWeightInfo = frame_system::weights::SubstrateWeight<Self>;390 391 type Version = Version;392 type MaxConsumers = ConstU32<16>;393}394395parameter_types! {396 pub const MinimumPeriod: u64 = SLOT_DURATION / 2;397}398399impl pallet_timestamp::Config for Runtime {400 401 type Moment = u64;402 type OnTimestampSet = ();403 type MinimumPeriod = MinimumPeriod;404 type WeightInfo = ();405}406407parameter_types! {408 409 pub const ExistentialDeposit: u128 = 0;410 pub const MaxLocks: u32 = 50;411}412413impl pallet_balances::Config for Runtime {414 type MaxLocks = MaxLocks;415 type MaxReserves = ();416 type ReserveIdentifier = [u8; 8];417 418 type Balance = Balance;419 420 type Event = Event;421 type DustRemoval = Treasury;422 type ExistentialDeposit = ExistentialDeposit;423 type AccountStore = System;424 type WeightInfo = pallet_balances::weights::SubstrateWeight<Self>;425}426427pub const fn deposit(items: u32, bytes: u32) -> Balance {428 items as Balance * 15 * CENTIUNIQUE + (bytes as Balance) * 6 * CENTIUNIQUE429}430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481parameter_types! {482 483 484 pub const OperationalFeeMultiplier: u8 = 5;485}486487488pub struct LinearFee<T>(sp_std::marker::PhantomData<T>);489490impl<T> WeightToFeePolynomial for LinearFee<T>491where492 T: BaseArithmetic + From<u32> + Copy + Unsigned,493{494 type Balance = T;495496 fn polynomial() -> WeightToFeeCoefficients<Self::Balance> {497 smallvec!(WeightToFeeCoefficient {498 499 coeff_integer: WEIGHT_TO_FEE_COEFF.into(),500 coeff_frac: Perbill::zero(),501 negative: false,502 degree: 1,503 })504 }505}506507impl pallet_transaction_payment::Config for Runtime {508 type OnChargeTransaction = pallet_transaction_payment::CurrencyAdapter<Balances, DealWithFees>;509 type LengthToFee = ConstantMultiplier<Balance, TransactionByteFee>;510 type OperationalFeeMultiplier = OperationalFeeMultiplier;511 type WeightToFee = LinearFee<Balance>;512 type FeeMultiplierUpdate = ();513}514515parameter_types! {516 pub const ProposalBond: Permill = Permill::from_percent(5);517 pub const ProposalBondMinimum: Balance = 1 * UNIQUE;518 pub const ProposalBondMaximum: Balance = 1000 * UNIQUE;519 pub const SpendPeriod: BlockNumber = 5 * MINUTES;520 pub const Burn: Permill = Permill::from_percent(0);521 pub const TipCountdown: BlockNumber = 1 * DAYS;522 pub const TipFindersFee: Percent = Percent::from_percent(20);523 pub const TipReportDepositBase: Balance = 1 * UNIQUE;524 pub const DataDepositPerByte: Balance = 1 * CENTIUNIQUE;525 pub const BountyDepositBase: Balance = 1 * UNIQUE;526 pub const BountyDepositPayoutDelay: BlockNumber = 1 * DAYS;527 pub const TreasuryModuleId: PalletId = PalletId(*b"py/trsry");528 pub const BountyUpdatePeriod: BlockNumber = 14 * DAYS;529 pub const MaximumReasonLength: u32 = 16384;530 pub const BountyCuratorDeposit: Permill = Permill::from_percent(50);531 pub const BountyValueMinimum: Balance = 5 * UNIQUE;532 pub const MaxApprovals: u32 = 100;533}534535impl pallet_treasury::Config for Runtime {536 type PalletId = TreasuryModuleId;537 type Currency = Balances;538 type ApproveOrigin = EnsureRoot<AccountId>;539 type RejectOrigin = EnsureRoot<AccountId>;540 type Event = Event;541 type OnSlash = ();542 type ProposalBond = ProposalBond;543 type ProposalBondMinimum = ProposalBondMinimum;544 type ProposalBondMaximum = ProposalBondMaximum;545 type SpendPeriod = SpendPeriod;546 type Burn = Burn;547 type BurnDestination = ();548 type SpendFunds = ();549 type WeightInfo = pallet_treasury::weights::SubstrateWeight<Self>;550 type MaxApprovals = MaxApprovals;551}552553impl pallet_sudo::Config for Runtime {554 type Event = Event;555 type Call = Call;556}557558pub struct RelayChainBlockNumberProvider<T>(sp_std::marker::PhantomData<T>);559560impl<T: cumulus_pallet_parachain_system::Config> BlockNumberProvider561 for RelayChainBlockNumberProvider<T>562{563 type BlockNumber = BlockNumber;564565 fn current_block_number() -> Self::BlockNumber {566 cumulus_pallet_parachain_system::Pallet::<T>::validation_data()567 .map(|d| d.relay_parent_number)568 .unwrap_or_default()569 }570}571572parameter_types! {573 pub const MinVestedTransfer: Balance = 10 * UNIQUE;574 pub const MaxVestingSchedules: u32 = 28;575}576577impl orml_vesting::Config for Runtime {578 type Event = Event;579 type Currency = pallet_balances::Pallet<Runtime>;580 type MinVestedTransfer = MinVestedTransfer;581 type VestedTransferOrigin = EnsureSigned<AccountId>;582 type WeightInfo = ();583 type MaxVestingSchedules = MaxVestingSchedules;584 type BlockNumberProvider = RelayChainBlockNumberProvider<Runtime>;585}586587parameter_types! {588 pub const ReservedDmpWeight: Weight = MAXIMUM_BLOCK_WEIGHT / 4;589 pub const ReservedXcmpWeight: Weight = MAXIMUM_BLOCK_WEIGHT / 4;590}591592impl cumulus_pallet_parachain_system::Config for Runtime {593 type Event = Event;594 type SelfParaId = parachain_info::Pallet<Self>;595 type OnSystemEvent = ();596 597 598 599 600 601 type OutboundXcmpMessageSource = XcmpQueue;602 type DmpMessageHandler = DmpQueue;603 type ReservedDmpWeight = ReservedDmpWeight;604 type ReservedXcmpWeight = ReservedXcmpWeight;605 type XcmpMessageHandler = XcmpQueue;606}607608impl parachain_info::Config for Runtime {}609610impl cumulus_pallet_aura_ext::Config for Runtime {}611612parameter_types! {613 pub const RelayLocation: MultiLocation = MultiLocation::parent();614 pub const RelayNetwork: NetworkId = NetworkId::Polkadot;615 pub RelayOrigin: Origin = cumulus_pallet_xcm::Origin::Relay.into();616 pub Ancestry: MultiLocation = Parachain(ParachainInfo::parachain_id().into()).into();617}618619620621622pub type LocationToAccountId = (623 624 ParentIsPreset<AccountId>,625 626 SiblingParachainConvertsVia<Sibling, AccountId>,627 628 AccountId32Aliases<RelayNetwork, AccountId>,629);630631pub struct OnlySelfCurrency;632impl<B: TryFrom<u128>> MatchesFungible<B> for OnlySelfCurrency {633 fn matches_fungible(a: &MultiAsset) -> Option<B> {634 match (&a.id, &a.fun) {635 (Concrete(_), XcmFungible(ref amount)) => CheckedConversion::checked_from(*amount),636 _ => None,637 }638 }639}640641642pub type LocalAssetTransactor = CurrencyAdapter<643 644 Balances,645 646 OnlySelfCurrency,647 648 LocationToAccountId,649 650 AccountId,651 652 (),653>;654655656657658pub type XcmOriginToTransactDispatchOrigin = (659 660 661 662 SovereignSignedViaLocation<LocationToAccountId, Origin>,663 664 665 RelayChainAsNative<RelayOrigin, Origin>,666 667 668 SiblingParachainAsNative<cumulus_pallet_xcm::Origin, Origin>,669 670 671 ParentAsSuperuser<Origin>,672 673 674 SignedAccountId32AsNative<RelayNetwork, Origin>,675 676 XcmPassthrough<Origin>,677);678679parameter_types! {680 681 pub UnitWeightCost: Weight = 1_000_000;682 683 pub const WeightPrice: (MultiLocation, u128) = (MultiLocation::parent(), 1_200 * UNIQUE);684 pub const MaxInstructions: u32 = 100;685 pub const MaxAuthorities: u32 = 100_000;686}687688match_types! {689 pub type ParentOrParentsUnitPlurality: impl Contains<MultiLocation> = {690 MultiLocation { parents: 1, interior: Here } |691 MultiLocation { parents: 1, interior: X1(Plurality { id: BodyId::Unit, .. }) }692 };693}694695pub type Barrier = (696 TakeWeightCredit,697 AllowTopLevelPaidExecutionFrom<Everything>,698 AllowUnpaidExecutionFrom<ParentOrParentsUnitPlurality>,699 700);701702pub struct UsingOnlySelfCurrencyComponents<703 WeightToFee: WeightToFeePolynomial<Balance = Currency::Balance>,704 AssetId: Get<MultiLocation>,705 AccountId,706 Currency: CurrencyT<AccountId>,707 OnUnbalanced: OnUnbalancedT<Currency::NegativeImbalance>,708>(709 Weight,710 Currency::Balance,711 PhantomData<(WeightToFee, AssetId, AccountId, Currency, OnUnbalanced)>,712);713impl<714 WeightToFee: WeightToFeePolynomial<Balance = Currency::Balance>,715 AssetId: Get<MultiLocation>,716 AccountId,717 Currency: CurrencyT<AccountId>,718 OnUnbalanced: OnUnbalancedT<Currency::NegativeImbalance>,719 > WeightTrader720 for UsingOnlySelfCurrencyComponents<WeightToFee, AssetId, AccountId, Currency, OnUnbalanced>721{722 fn new() -> Self {723 Self(0, Zero::zero(), PhantomData)724 }725726 fn buy_weight(&mut self, weight: Weight, payment: Assets) -> Result<Assets, XcmError> {727 let amount = WeightToFee::calc(&weight);728 let u128_amount: u128 = amount.try_into().map_err(|_| XcmError::Overflow)?;729730 731 let option1: xcm::v1::AssetId = Concrete(MultiLocation {732 parents: 1,733 interior: X1(Parachain(ParachainInfo::parachain_id().into())),734 });735 736 let option2: xcm::v1::AssetId = Concrete(MultiLocation {737 parents: 0,738 interior: Here,739 });740741 let required = if payment.fungible.contains_key(&option1) {742 (option1, u128_amount).into()743 } else if payment.fungible.contains_key(&option2) {744 (option2, u128_amount).into()745 } else {746 (Concrete(MultiLocation::default()), u128_amount).into()747 };748749 let unused = payment750 .checked_sub(required)751 .map_err(|_| XcmError::TooExpensive)?;752 self.0 = self.0.saturating_add(weight);753 self.1 = self.1.saturating_add(amount);754 Ok(unused)755 }756757 fn refund_weight(&mut self, weight: Weight) -> Option<MultiAsset> {758 let weight = weight.min(self.0);759 let amount = WeightToFee::calc(&weight);760 self.0 -= weight;761 self.1 = self.1.saturating_sub(amount);762 let amount: u128 = amount.saturated_into();763 if amount > 0 {764 Some((AssetId::get(), amount).into())765 } else {766 None767 }768 }769}770impl<771 WeightToFee: WeightToFeePolynomial<Balance = Currency::Balance>,772 AssetId: Get<MultiLocation>,773 AccountId,774 Currency: CurrencyT<AccountId>,775 OnUnbalanced: OnUnbalancedT<Currency::NegativeImbalance>,776 > Drop777 for UsingOnlySelfCurrencyComponents<WeightToFee, AssetId, AccountId, Currency, OnUnbalanced>778{779 fn drop(&mut self) {780 OnUnbalanced::on_unbalanced(Currency::issue(self.1));781 }782}783784pub struct XcmConfig;785impl Config for XcmConfig {786 type Call = Call;787 type XcmSender = XcmRouter;788 789 type AssetTransactor = LocalAssetTransactor;790 type OriginConverter = XcmOriginToTransactDispatchOrigin;791 type IsReserve = NativeAsset;792 type IsTeleporter = (); 793 type LocationInverter = LocationInverter<Ancestry>;794 type Barrier = Barrier;795 type Weigher = FixedWeightBounds<UnitWeightCost, Call, MaxInstructions>;796 type Trader = UsingOnlySelfCurrencyComponents<797 IdentityFee<Balance>,798 RelayLocation,799 AccountId,800 Balances,801 (),802 >;803 type ResponseHandler = (); 804 type SubscriptionService = PolkadotXcm;805806 type AssetTrap = PolkadotXcm;807 type AssetClaims = PolkadotXcm;808}809810811812813814815pub type LocalOriginToLocation = (SignedToAccountId32<Origin, AccountId, RelayNetwork>,);816817818819pub type XcmRouter = (820 821 cumulus_primitives_utility::ParentAsUmp<ParachainSystem, ()>,822 823 XcmpQueue,824);825826impl pallet_evm_coder_substrate::Config for Runtime {827 type GasWeightMapping = FixedGasWeightMapping;828}829830impl pallet_xcm::Config for Runtime {831 type Event = Event;832 type SendXcmOrigin = EnsureXcmOrigin<Origin, LocalOriginToLocation>;833 type XcmRouter = XcmRouter;834 type ExecuteXcmOrigin = EnsureXcmOrigin<Origin, LocalOriginToLocation>;835 type XcmExecuteFilter = Everything;836 type XcmExecutor = XcmExecutor<XcmConfig>;837 type XcmTeleportFilter = Everything;838 type XcmReserveTransferFilter = Everything;839 type Weigher = FixedWeightBounds<UnitWeightCost, Call, MaxInstructions>;840 type LocationInverter = LocationInverter<Ancestry>;841 type Origin = Origin;842 type Call = Call;843 const VERSION_DISCOVERY_QUEUE_SIZE: u32 = 100;844 type AdvertisedXcmVersion = pallet_xcm::CurrentXcmVersion;845}846847impl cumulus_pallet_xcm::Config for Runtime {848 type Event = Event;849 type XcmExecutor = XcmExecutor<XcmConfig>;850}851852impl cumulus_pallet_xcmp_queue::Config for Runtime {853 type WeightInfo = ();854 type Event = Event;855 type XcmExecutor = XcmExecutor<XcmConfig>;856 type ChannelInfo = ParachainSystem;857 type VersionWrapper = ();858 type ExecuteOverweightOrigin = frame_system::EnsureRoot<AccountId>;859 type ControllerOrigin = EnsureRoot<AccountId>;860 type ControllerOriginConverter = XcmOriginToTransactDispatchOrigin;861}862863impl cumulus_pallet_dmp_queue::Config for Runtime {864 type Event = Event;865 type XcmExecutor = XcmExecutor<XcmConfig>;866 type ExecuteOverweightOrigin = frame_system::EnsureRoot<AccountId>;867}868869impl pallet_aura::Config for Runtime {870 type AuthorityId = AuraId;871 type DisabledValidators = ();872 type MaxAuthorities = MaxAuthorities;873}874875parameter_types! {876 pub TreasuryAccountId: AccountId = TreasuryModuleId::get().into_account();877 pub const CollectionCreationPrice: Balance = 2 * UNIQUE;878}879880impl pallet_common::Config for Runtime {881 type WeightInfo = pallet_common::weights::SubstrateWeight<Self>;882 type Event = Event;883 type Currency = Balances;884 type CollectionCreationPrice = CollectionCreationPrice;885 type TreasuryAccountId = TreasuryAccountId;886 type CollectionDispatch = CollectionDispatchT<Self>;887888 type EvmTokenAddressMapping = EvmTokenAddressMapping;889 type CrossTokenAddressMapping = CrossTokenAddressMapping<Self::AccountId>;890}891892impl pallet_structure::Config for Runtime {893 type Event = Event;894 type Call = Call;895 type WeightInfo = pallet_structure::weights::SubstrateWeight<Self>;896}897898impl pallet_fungible::Config for Runtime {899 type WeightInfo = pallet_fungible::weights::SubstrateWeight<Self>;900}901impl pallet_refungible::Config for Runtime {902 type WeightInfo = pallet_refungible::weights::SubstrateWeight<Self>;903}904impl pallet_nonfungible::Config for Runtime {905 type WeightInfo = pallet_nonfungible::weights::SubstrateWeight<Self>;906}907908impl pallet_proxy_rmrk_core::Config for Runtime {909 type Event = Event;910}911912impl pallet_proxy_rmrk_equip::Config for Runtime {913 type Event = Event;914}915916impl pallet_unique::Config for Runtime {917 type Event = Event;918 type WeightInfo = pallet_unique::weights::SubstrateWeight<Self>;919 type CommonWeightInfo = CommonWeights<Self>;920}921922parameter_types! {923 pub const InflationBlockInterval: BlockNumber = 100; 924}925926927impl pallet_inflation::Config for Runtime {928 type Currency = Balances;929 type TreasuryAccountId = TreasuryAccountId;930 type InflationBlockInterval = InflationBlockInterval;931 type BlockNumberProvider = RelayChainBlockNumberProvider<Runtime>;932}933934935936937938939940type EvmSponsorshipHandler = (941 UniqueEthSponsorshipHandler<Runtime>,942 pallet_evm_contract_helpers::HelpersContractSponsoring<Runtime>,943);944type SponsorshipHandler = (945 UniqueSponsorshipHandler<Runtime>,946 947 pallet_evm_transaction_payment::BridgeSponsorshipHandler<Runtime>,948);949950951952953954955956957958959960961962impl pallet_evm_transaction_payment::Config for Runtime {963 type EvmSponsorshipHandler = EvmSponsorshipHandler;964 type Currency = Balances;965}966967impl pallet_charge_transaction::Config for Runtime {968 type SponsorshipHandler = SponsorshipHandler;969}970971972973974975parameter_types! {976 977 pub const HelpersContractAddress: H160 = H160([978 0x84, 0x28, 0x99, 0xec, 0xf3, 0x80, 0x55, 0x3e, 0x8a, 0x4d, 0xe7, 0x5b, 0xf5, 0x34, 0xcd, 0xf6, 0xfb, 0xf6, 0x40, 0x49,979 ]);980981 982 pub const EvmCollectionHelperAddress: H160 = H160([983 0x6c, 0x4e, 0x9f, 0xe1, 0xae, 0x37, 0xa4, 0x1e, 0x93, 0xce, 0xe4, 0x29, 0xe8, 0xe1, 0x88, 0x1a, 0xbd, 0xcb, 0xb5, 0x4f,984 ]);985}986987impl pallet_evm_contract_helpers::Config for Runtime {988 type ContractAddress = HelpersContractAddress;989 type DefaultSponsoringRateLimit = DefaultSponsoringRateLimit;990}991992impl evm_collection::Config for Runtime {993 type ContractAddress = EvmCollectionHelperAddress;994}995996construct_runtime!(997 pub enum Runtime where998 Block = Block,999 NodeBlock = opaque::Block,1000 UncheckedExtrinsic = UncheckedExtrinsic1001 {1002 ParachainSystem: cumulus_pallet_parachain_system::{Pallet, Call, Config, Storage, Inherent, Event<T>, ValidateUnsigned} = 20,1003 ParachainInfo: parachain_info::{Pallet, Storage, Config} = 21,10041005 Aura: pallet_aura::{Pallet, Config<T>} = 22,1006 AuraExt: cumulus_pallet_aura_ext::{Pallet, Config} = 23,10071008 Balances: pallet_balances::{Pallet, Call, Storage, Config<T>, Event<T>} = 30,1009 RandomnessCollectiveFlip: pallet_randomness_collective_flip::{Pallet, Storage} = 31,1010 Timestamp: pallet_timestamp::{Pallet, Call, Storage, Inherent} = 32,1011 TransactionPayment: pallet_transaction_payment::{Pallet, Storage} = 33,1012 Treasury: pallet_treasury::{Pallet, Call, Storage, Config, Event<T>} = 34,1013 Sudo: pallet_sudo::{Pallet, Call, Storage, Config<T>, Event<T>} = 35,1014 System: frame_system::{Pallet, Call, Storage, Config, Event<T>} = 36,1015 Vesting: orml_vesting::{Pallet, Storage, Call, Event<T>, Config<T>} = 37,1016 1017 10181019 1020 XcmpQueue: cumulus_pallet_xcmp_queue::{Pallet, Call, Storage, Event<T>} = 50,1021 PolkadotXcm: pallet_xcm::{Pallet, Call, Event<T>, Origin} = 51,1022 CumulusXcm: cumulus_pallet_xcm::{Pallet, Call, Event<T>, Origin} = 52,1023 DmpQueue: cumulus_pallet_dmp_queue::{Pallet, Call, Storage, Event<T>} = 53,10241025 1026 Inflation: pallet_inflation::{Pallet, Call, Storage} = 60,1027 Unique: pallet_unique::{Pallet, Call, Storage, Event<T>} = 61,1028 1029 1030 Charging: pallet_charge_transaction::{Pallet, Call, Storage } = 64,1031 1032 Common: pallet_common::{Pallet, Storage, Event<T>} = 66,1033 Fungible: pallet_fungible::{Pallet, Storage} = 67,1034 Refungible: pallet_refungible::{Pallet, Storage} = 68,1035 Nonfungible: pallet_nonfungible::{Pallet, Storage} = 69,1036 Structure: pallet_structure::{Pallet, Call, Storage, Event<T>} = 70,1037 RmrkCore: pallet_proxy_rmrk_core::{Pallet, Call, Storage, Event<T>} = 71,1038 RmrkEquip: pallet_proxy_rmrk_equip::{Pallet, Call, Storage, Event<T>} = 72,10391040 1041 EVM: pallet_evm::{Pallet, Config, Call, Storage, Event<T>} = 100,1042 Ethereum: pallet_ethereum::{Pallet, Config, Call, Storage, Event, Origin} = 101,10431044 EvmCoderSubstrate: pallet_evm_coder_substrate::{Pallet, Storage} = 150,1045 EvmContractHelpers: pallet_evm_contract_helpers::{Pallet, Storage} = 151,1046 EvmTransactionPayment: pallet_evm_transaction_payment::{Pallet} = 152,1047 EvmMigration: pallet_evm_migration::{Pallet, Call, Storage} = 153,1048 }1049);10501051pub struct TransactionConverter;10521053impl fp_rpc::ConvertTransaction<UncheckedExtrinsic> for TransactionConverter {1054 fn convert_transaction(&self, transaction: pallet_ethereum::Transaction) -> UncheckedExtrinsic {1055 UncheckedExtrinsic::new_unsigned(1056 pallet_ethereum::Call::<Runtime>::transact { transaction }.into(),1057 )1058 }1059}10601061impl fp_rpc::ConvertTransaction<opaque::UncheckedExtrinsic> for TransactionConverter {1062 fn convert_transaction(1063 &self,1064 transaction: pallet_ethereum::Transaction,1065 ) -> opaque::UncheckedExtrinsic {1066 let extrinsic = UncheckedExtrinsic::new_unsigned(1067 pallet_ethereum::Call::<Runtime>::transact { transaction }.into(),1068 );1069 let encoded = extrinsic.encode();1070 opaque::UncheckedExtrinsic::decode(&mut &encoded[..])1071 .expect("Encoded extrinsic is always valid")1072 }1073}107410751076pub type Address = sp_runtime::MultiAddress<AccountId, ()>;10771078pub type Header = generic::Header<BlockNumber, BlakeTwo256>;10791080pub type Block = generic::Block<Header, UncheckedExtrinsic>;10811082pub type SignedBlock = generic::SignedBlock<Block>;10831084pub type BlockId = generic::BlockId<Block>;10851086pub type SignedExtra = (1087 frame_system::CheckSpecVersion<Runtime>,1088 1089 frame_system::CheckGenesis<Runtime>,1090 frame_system::CheckEra<Runtime>,1091 frame_system::CheckNonce<Runtime>,1092 frame_system::CheckWeight<Runtime>,1093 pallet_charge_transaction::ChargeTransactionPayment<Runtime>,1094 1095 pallet_ethereum::FakeTransactionFinalizer<Runtime>,1096);10971098pub type UncheckedExtrinsic =1099 fp_self_contained::UncheckedExtrinsic<Address, Call, Signature, SignedExtra>;11001101pub type CheckedExtrinsic = fp_self_contained::CheckedExtrinsic<AccountId, Call, SignedExtra, H160>;11021103pub type Executive = frame_executive::Executive<1104 Runtime,1105 Block,1106 frame_system::ChainContext<Runtime>,1107 Runtime,1108 AllPalletsReversedWithSystemFirst,1109>;11101111impl_opaque_keys! {1112 pub struct SessionKeys {1113 pub aura: Aura,1114 }1115}11161117impl fp_self_contained::SelfContainedCall for Call {1118 type SignedInfo = H160;11191120 fn is_self_contained(&self) -> bool {1121 match self {1122 Call::Ethereum(call) => call.is_self_contained(),1123 _ => false,1124 }1125 }11261127 fn check_self_contained(&self) -> Option<Result<Self::SignedInfo, TransactionValidityError>> {1128 match self {1129 Call::Ethereum(call) => call.check_self_contained(),1130 _ => None,1131 }1132 }11331134 fn validate_self_contained(&self, info: &Self::SignedInfo) -> Option<TransactionValidity> {1135 match self {1136 Call::Ethereum(call) => call.validate_self_contained(info),1137 _ => None,1138 }1139 }11401141 fn pre_dispatch_self_contained(1142 &self,1143 info: &Self::SignedInfo,1144 ) -> Option<Result<(), TransactionValidityError>> {1145 match self {1146 Call::Ethereum(call) => call.pre_dispatch_self_contained(info),1147 _ => None,1148 }1149 }11501151 fn apply_self_contained(1152 self,1153 info: Self::SignedInfo,1154 ) -> Option<sp_runtime::DispatchResultWithInfo<PostDispatchInfoOf<Self>>> {1155 match self {1156 call @ Call::Ethereum(pallet_ethereum::Call::transact { .. }) => Some(call.dispatch(1157 Origin::from(pallet_ethereum::RawOrigin::EthereumTransaction(info)),1158 )),1159 _ => None,1160 }1161 }1162}11631164macro_rules! dispatch_unique_runtime {1165 ($collection:ident.$method:ident($($name:ident),*)) => {{1166 let collection = <Runtime as pallet_common::Config>::CollectionDispatch::dispatch(<pallet_common::CollectionHandle<Runtime>>::try_get($collection)?);1167 let dispatch = collection.as_dyn();11681169 Ok::<_, DispatchError>(dispatch.$method($($name),*))1170 }};1171}11721173impl_common_runtime_apis!();11741175struct CheckInherents;11761177impl cumulus_pallet_parachain_system::CheckInherents<Block> for CheckInherents {1178 fn check_inherents(1179 block: &Block,1180 relay_state_proof: &cumulus_pallet_parachain_system::RelayChainStateProof,1181 ) -> sp_inherents::CheckInherentsResult {1182 let relay_chain_slot = relay_state_proof1183 .read_slot()1184 .expect("Could not read the relay chain slot from the proof");11851186 let inherent_data =1187 cumulus_primitives_timestamp::InherentDataProvider::from_relay_chain_slot_and_duration(1188 relay_chain_slot,1189 sp_std::time::Duration::from_secs(6),1190 )1191 .create_inherent_data()1192 .expect("Could not create the timestamp inherent data");11931194 inherent_data.check_extrinsics(block)1195 }1196}11971198cumulus_pallet_parachain_system::register_validate_block!(1199 Runtime = Runtime,1200 BlockExecutor = cumulus_pallet_aura_ext::BlockExecutor::<Runtime, Executive>,1201 CheckInherents = CheckInherents,1202);