difftreelog
CORE-324 cargo fmt
in: master
3 files changed
runtime/opal/src/lib.rsdiffbeforeafterboth--- a/runtime/opal/src/lib.rs
+++ b/runtime/opal/src/lib.rs
@@ -48,7 +48,9 @@
};
// A few exports that help ease life for downstream crates.
pub use pallet_balances::Call as BalancesCall;
-pub use pallet_evm::{EnsureAddressTruncated, HashedAddressMapping, Runner, account::CrossAccountId as _};
+pub use pallet_evm::{
+ EnsureAddressTruncated, HashedAddressMapping, Runner, account::CrossAccountId as _,
+};
pub use frame_support::{
construct_runtime, match_type,
dispatch::DispatchResult,
runtime/quartz/src/lib.rsdiffbeforeafterboth1// 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 = "Quartz";118119type CrossAccountId = pallet_evm::account::BasicCrossAccountId<Runtime>;120121impl RuntimeInstance for Runtime {122 type CrossAccountId = self::CrossAccountId;123124 type TransactionConverter = self::TransactionConverter;125126 fn get_transaction_converter() -> TransactionConverter {127 TransactionConverter128 }129}130131/// Opaque types. These are used by the CLI to instantiate machinery that don't need to know132/// the specifics of the runtime. They can then be made to be agnostic over specific formats133/// of data like extrinsics, allowing for them to continue syncing the network through upgrades134/// to even the core data structures.135pub mod opaque {136 use sp_std::prelude::*;137 use sp_runtime::impl_opaque_keys;138 use super::Aura;139140 pub use unique_runtime_common::types::*;141142 impl_opaque_keys! {143 pub struct SessionKeys {144 pub aura: Aura,145 }146 }147}148149/// This runtime version.150pub const VERSION: RuntimeVersion = RuntimeVersion {151 spec_name: create_runtime_str!(RUNTIME_NAME),152 impl_name: create_runtime_str!(RUNTIME_NAME),153 authoring_version: 1,154 spec_version: 917004,155 impl_version: 0,156 apis: RUNTIME_API_VERSIONS,157 transaction_version: 1,158 state_version: 0,159};160161#[derive(codec::Encode, codec::Decode)]162pub enum XCMPMessage<XAccountId, XBalance> {163 /// Transfer tokens to the given account from the Parachain account.164 TransferToken(XAccountId, XBalance),165}166167/// The version information used to identify this runtime when compiled natively.168#[cfg(feature = "std")]169pub fn native_version() -> NativeVersion {170 NativeVersion {171 runtime_version: VERSION,172 can_author_with: Default::default(),173 }174}175176type NegativeImbalance = <Balances as Currency<AccountId>>::NegativeImbalance;177178pub struct DealWithFees;179impl OnUnbalanced<NegativeImbalance> for DealWithFees {180 fn on_unbalanceds<B>(mut fees_then_tips: impl Iterator<Item = NegativeImbalance>) {181 if let Some(fees) = fees_then_tips.next() {182 // for fees, 100% to treasury183 let mut split = fees.ration(100, 0);184 if let Some(tips) = fees_then_tips.next() {185 // for tips, if any, 100% to treasury186 tips.ration_merge_into(100, 0, &mut split);187 }188 Treasury::on_unbalanced(split.0);189 // Author::on_unbalanced(split.1);190 }191 }192}193194parameter_types! {195 pub const BlockHashCount: BlockNumber = 2400;196 pub RuntimeBlockLength: BlockLength =197 BlockLength::max_with_normal_ratio(5 * 1024 * 1024, NORMAL_DISPATCH_RATIO);198 pub const AvailableBlockRatio: Perbill = Perbill::from_percent(75);199 pub const MaximumBlockLength: u32 = 5 * 1024 * 1024;200 pub RuntimeBlockWeights: BlockWeights = BlockWeights::builder()201 .base_block(BlockExecutionWeight::get())202 .for_class(DispatchClass::all(), |weights| {203 weights.base_extrinsic = ExtrinsicBaseWeight::get();204 })205 .for_class(DispatchClass::Normal, |weights| {206 weights.max_total = Some(NORMAL_DISPATCH_RATIO * MAXIMUM_BLOCK_WEIGHT);207 })208 .for_class(DispatchClass::Operational, |weights| {209 weights.max_total = Some(MAXIMUM_BLOCK_WEIGHT);210 // Operational transactions have some extra reserved space, so that they211 // are included even if block reached `MAXIMUM_BLOCK_WEIGHT`.212 weights.reserved = Some(213 MAXIMUM_BLOCK_WEIGHT - NORMAL_DISPATCH_RATIO * MAXIMUM_BLOCK_WEIGHT214 );215 })216 .avg_block_initialization(AVERAGE_ON_INITIALIZE_RATIO)217 .build_or_panic();218 pub const Version: RuntimeVersion = VERSION;219 pub const SS58Prefix: u8 = 255;220}221222parameter_types! {223 pub const ChainId: u64 = 8881;224}225226pub struct FixedFee;227impl FeeCalculator for FixedFee {228 fn min_gas_price() -> U256 {229 MIN_GAS_PRICE.into()230 }231}232233// Assuming slowest ethereum opcode is SSTORE, with gas price of 20000 as our worst case234// (contract, which only writes a lot of data),235// approximating on top of our real store write weight236parameter_types! {237 pub const WritesPerSecond: u64 = WEIGHT_PER_SECOND / <Runtime as frame_system::Config>::DbWeight::get().write;238 pub const GasPerSecond: u64 = WritesPerSecond::get() * 20000;239 pub const WeightPerGas: u64 = WEIGHT_PER_SECOND / GasPerSecond::get();240}241242/// Limiting EVM execution to 50% of block for substrate users and management tasks243/// EVM transaction consumes more weight than substrate's, so we can't rely on them being244/// scheduled fairly245const EVM_DISPATCH_RATIO: Perbill = Perbill::from_percent(50);246parameter_types! {247 pub BlockGasLimit: U256 = U256::from(NORMAL_DISPATCH_RATIO * EVM_DISPATCH_RATIO * MAXIMUM_BLOCK_WEIGHT / WeightPerGas::get());248}249250pub enum FixedGasWeightMapping {}251impl GasWeightMapping for FixedGasWeightMapping {252 fn gas_to_weight(gas: u64) -> Weight {253 gas.saturating_mul(WeightPerGas::get())254 }255 fn weight_to_gas(weight: Weight) -> u64 {256 weight / WeightPerGas::get()257 }258}259260impl pallet_evm::Config for Runtime {261 type BlockGasLimit = BlockGasLimit;262 type FeeCalculator = FixedFee;263 type GasWeightMapping = FixedGasWeightMapping;264 type BlockHashMapping = pallet_ethereum::EthereumBlockHashMapping<Self>;265 type CallOrigin = EnsureAddressTruncated;266 type WithdrawOrigin = EnsureAddressTruncated;267 type AddressMapping = HashedAddressMapping<Self::Hashing>;268 type PrecompilesType = ();269 type PrecompilesValue = ();270 type Currency = Balances;271 type Event = Event;272 type OnMethodCall = (273 pallet_evm_migration::OnMethodCall<Self>,274 pallet_unique::UniqueErcSupport<Self>,275 pallet_evm_contract_helpers::HelpersOnMethodCall<Self>,276 );277 type OnCreate = pallet_evm_contract_helpers::HelpersOnCreate<Self>;278 type ChainId = ChainId;279 type Runner = pallet_evm::runner::stack::Runner<Self>;280 type OnChargeTransaction = pallet_evm_transaction_payment::OnChargeTransaction<Self>;281 type TransactionValidityHack = pallet_evm_transaction_payment::TransactionValidityHack<Self>;282 type FindAuthor = EthereumFindAuthor<Aura>;283}284285impl pallet_evm_migration::Config for Runtime {286 type WeightInfo = pallet_evm_migration::weights::SubstrateWeight<Self>;287}288289pub struct EthereumFindAuthor<F>(core::marker::PhantomData<F>);290impl<F: FindAuthor<u32>> FindAuthor<H160> for EthereumFindAuthor<F> {291 fn find_author<'a, I>(digests: I) -> Option<H160>292 where293 I: 'a + IntoIterator<Item = (ConsensusEngineId, &'a [u8])>,294 {295 if let Some(author_index) = F::find_author(digests) {296 let authority_id = Aura::authorities()[author_index as usize].clone();297 return Some(H160::from_slice(&authority_id.to_raw_vec()[4..24]));298 }299 None300 }301}302303impl pallet_ethereum::Config for Runtime {304 type Event = Event;305 type StateRoot = pallet_ethereum::IntermediateStateRoot;306}307308impl pallet_randomness_collective_flip::Config for Runtime {}309310impl frame_system::Config for Runtime {311 /// The data to be stored in an account.312 type AccountData = pallet_balances::AccountData<Balance>;313 /// The identifier used to distinguish between accounts.314 type AccountId = AccountId;315 /// The basic call filter to use in dispatchable.316 type BaseCallFilter = Everything;317 /// Maximum number of block number to block hash mappings to keep (oldest pruned first).318 type BlockHashCount = BlockHashCount;319 /// The maximum length of a block (in bytes).320 type BlockLength = RuntimeBlockLength;321 /// The index type for blocks.322 type BlockNumber = BlockNumber;323 /// The weight of the overhead invoked on the block import process, independent of the extrinsics included in that block.324 type BlockWeights = RuntimeBlockWeights;325 /// The aggregated dispatch type that is available for extrinsics.326 type Call = Call;327 /// The weight of database operations that the runtime can invoke.328 type DbWeight = RocksDbWeight;329 /// The ubiquitous event type.330 type Event = Event;331 /// The type for hashing blocks and tries.332 type Hash = Hash;333 /// The hashing algorithm used.334 type Hashing = BlakeTwo256;335 /// The header type.336 type Header = generic::Header<BlockNumber, BlakeTwo256>;337 /// The index type for storing how many extrinsics an account has signed.338 type Index = Index;339 /// The lookup mechanism to get account ID from whatever is passed in dispatchers.340 type Lookup = AccountIdLookup<AccountId, ()>;341 /// What to do if an account is fully reaped from the system.342 type OnKilledAccount = ();343 /// What to do if a new account is created.344 type OnNewAccount = ();345 type OnSetCode = cumulus_pallet_parachain_system::ParachainSetCode<Self>;346 /// The ubiquitous origin type.347 type Origin = Origin;348 /// This type is being generated by `construct_runtime!`.349 type PalletInfo = PalletInfo;350 /// This is used as an identifier of the chain. 42 is the generic substrate prefix.351 type SS58Prefix = SS58Prefix;352 /// Weight information for the extrinsics of this pallet.353 type SystemWeightInfo = frame_system::weights::SubstrateWeight<Self>;354 /// Version of the runtime.355 type Version = Version;356 type MaxConsumers = ConstU32<16>;357}358359parameter_types! {360 pub const MinimumPeriod: u64 = SLOT_DURATION / 2;361}362363impl pallet_timestamp::Config for Runtime {364 /// A timestamp: milliseconds since the unix epoch.365 type Moment = u64;366 type OnTimestampSet = ();367 type MinimumPeriod = MinimumPeriod;368 type WeightInfo = ();369}370371parameter_types! {372 // pub const ExistentialDeposit: u128 = 500;373 pub const ExistentialDeposit: u128 = 0;374 pub const MaxLocks: u32 = 50;375}376377impl pallet_balances::Config for Runtime {378 type MaxLocks = MaxLocks;379 type MaxReserves = ();380 type ReserveIdentifier = [u8; 8];381 /// The type for recording an account's balance.382 type Balance = Balance;383 /// The ubiquitous event type.384 type Event = Event;385 type DustRemoval = Treasury;386 type ExistentialDeposit = ExistentialDeposit;387 type AccountStore = System;388 type WeightInfo = pallet_balances::weights::SubstrateWeight<Self>;389}390391pub const fn deposit(items: u32, bytes: u32) -> Balance {392 items as Balance * 15 * CENTIUNIQUE + (bytes as Balance) * 6 * CENTIUNIQUE393}394395/*396parameter_types! {397 pub TombstoneDeposit: Balance = deposit(398 1,399 sp_std::mem::size_of::<pallet_contracts::Pallet<Runtime>> as u32,400 );401 pub DepositPerContract: Balance = TombstoneDeposit::get();402 pub const DepositPerStorageByte: Balance = deposit(0, 1);403 pub const DepositPerStorageItem: Balance = deposit(1, 0);404 pub RentFraction: Perbill = Perbill::from_rational(1u32, 30 * DAYS);405 pub const SurchargeReward: Balance = 150 * MILLIUNIQUE;406 pub const SignedClaimHandicap: u32 = 2;407 pub const MaxDepth: u32 = 32;408 pub const MaxValueSize: u32 = 16 * 1024;409 pub const MaxCodeSize: u32 = 1024 * 1024 * 25; // 25 Mb410 // The lazy deletion runs inside on_initialize.411 pub DeletionWeightLimit: Weight = AVERAGE_ON_INITIALIZE_RATIO *412 RuntimeBlockWeights::get().max_block;413 // The weight needed for decoding the queue should be less or equal than a fifth414 // of the overall weight dedicated to the lazy deletion.415 pub DeletionQueueDepth: u32 = ((DeletionWeightLimit::get() / (416 <Runtime as pallet_contracts::Config>::WeightInfo::on_initialize_per_queue_item(1) -417 <Runtime as pallet_contracts::Config>::WeightInfo::on_initialize_per_queue_item(0)418 )) / 5) as u32;419 pub Schedule: pallet_contracts::Schedule<Runtime> = Default::default();420}421422impl pallet_contracts::Config for Runtime {423 type Time = Timestamp;424 type Randomness = RandomnessCollectiveFlip;425 type Currency = Balances;426 type Event = Event;427 type RentPayment = ();428 type SignedClaimHandicap = SignedClaimHandicap;429 type TombstoneDeposit = TombstoneDeposit;430 type DepositPerContract = DepositPerContract;431 type DepositPerStorageByte = DepositPerStorageByte;432 type DepositPerStorageItem = DepositPerStorageItem;433 type RentFraction = RentFraction;434 type SurchargeReward = SurchargeReward;435 type WeightPrice = pallet_transaction_payment::Pallet<Self>;436 type WeightInfo = pallet_contracts::weights::SubstrateWeight<Self>;437 type ChainExtension = NFTExtension;438 type DeletionQueueDepth = DeletionQueueDepth;439 type DeletionWeightLimit = DeletionWeightLimit;440 type Schedule = Schedule;441 type CallStack = [pallet_contracts::Frame<Self>; 31];442}443*/444445parameter_types! {446 /// This value increases the priority of `Operational` transactions by adding447 /// a "virtual tip" that's equal to the `OperationalFeeMultiplier * final_fee`.448 pub const OperationalFeeMultiplier: u8 = 5;449}450451/// Linear implementor of `WeightToFeePolynomial`452pub struct LinearFee<T>(sp_std::marker::PhantomData<T>);453454impl<T> WeightToFeePolynomial for LinearFee<T>455where456 T: BaseArithmetic + From<u32> + Copy + Unsigned,457{458 type Balance = T;459460 fn polynomial() -> WeightToFeeCoefficients<Self::Balance> {461 smallvec!(WeightToFeeCoefficient {462 // Targeting 0.1 Unique per NFT transfer463 coeff_integer: WEIGHT_TO_FEE_COEFF.into(),464 coeff_frac: Perbill::zero(),465 negative: false,466 degree: 1,467 })468 }469}470471impl pallet_transaction_payment::Config for Runtime {472 type OnChargeTransaction = pallet_transaction_payment::CurrencyAdapter<Balances, DealWithFees>;473 type TransactionByteFee = TransactionByteFee;474 type OperationalFeeMultiplier = OperationalFeeMultiplier;475 type WeightToFee = LinearFee<Balance>;476 type FeeMultiplierUpdate = ();477}478479parameter_types! {480 pub const ProposalBond: Permill = Permill::from_percent(5);481 pub const ProposalBondMinimum: Balance = 1 * UNIQUE;482 pub const ProposalBondMaximum: Balance = 1000 * UNIQUE;483 pub const SpendPeriod: BlockNumber = 5 * MINUTES;484 pub const Burn: Permill = Permill::from_percent(0);485 pub const TipCountdown: BlockNumber = 1 * DAYS;486 pub const TipFindersFee: Percent = Percent::from_percent(20);487 pub const TipReportDepositBase: Balance = 1 * UNIQUE;488 pub const DataDepositPerByte: Balance = 1 * CENTIUNIQUE;489 pub const BountyDepositBase: Balance = 1 * UNIQUE;490 pub const BountyDepositPayoutDelay: BlockNumber = 1 * DAYS;491 pub const TreasuryModuleId: PalletId = PalletId(*b"py/trsry");492 pub const BountyUpdatePeriod: BlockNumber = 14 * DAYS;493 pub const MaximumReasonLength: u32 = 16384;494 pub const BountyCuratorDeposit: Permill = Permill::from_percent(50);495 pub const BountyValueMinimum: Balance = 5 * UNIQUE;496 pub const MaxApprovals: u32 = 100;497}498499impl pallet_treasury::Config for Runtime {500 type PalletId = TreasuryModuleId;501 type Currency = Balances;502 type ApproveOrigin = EnsureRoot<AccountId>;503 type RejectOrigin = EnsureRoot<AccountId>;504 type Event = Event;505 type OnSlash = ();506 type ProposalBond = ProposalBond;507 type ProposalBondMinimum = ProposalBondMinimum;508 type ProposalBondMaximum = ProposalBondMaximum;509 type SpendPeriod = SpendPeriod;510 type Burn = Burn;511 type BurnDestination = ();512 type SpendFunds = ();513 type WeightInfo = pallet_treasury::weights::SubstrateWeight<Self>;514 type MaxApprovals = MaxApprovals;515}516517impl pallet_sudo::Config for Runtime {518 type Event = Event;519 type Call = Call;520}521522pub struct RelayChainBlockNumberProvider<T>(sp_std::marker::PhantomData<T>);523524impl<T: cumulus_pallet_parachain_system::Config> BlockNumberProvider525 for RelayChainBlockNumberProvider<T>526{527 type BlockNumber = BlockNumber;528529 fn current_block_number() -> Self::BlockNumber {530 cumulus_pallet_parachain_system::Pallet::<T>::validation_data()531 .map(|d| d.relay_parent_number)532 .unwrap_or_default()533 }534}535536parameter_types! {537 pub const MinVestedTransfer: Balance = 10 * UNIQUE;538 pub const MaxVestingSchedules: u32 = 28;539}540541impl orml_vesting::Config for Runtime {542 type Event = Event;543 type Currency = pallet_balances::Pallet<Runtime>;544 type MinVestedTransfer = MinVestedTransfer;545 type VestedTransferOrigin = EnsureSigned<AccountId>;546 type WeightInfo = ();547 type MaxVestingSchedules = MaxVestingSchedules;548 type BlockNumberProvider = RelayChainBlockNumberProvider<Runtime>;549}550551parameter_types! {552 pub const ReservedDmpWeight: Weight = MAXIMUM_BLOCK_WEIGHT / 4;553 pub const ReservedXcmpWeight: Weight = MAXIMUM_BLOCK_WEIGHT / 4;554}555556impl cumulus_pallet_parachain_system::Config for Runtime {557 type Event = Event;558 type SelfParaId = parachain_info::Pallet<Self>;559 type OnSystemEvent = ();560 // type DownwardMessageHandlers = cumulus_primitives_utility::UnqueuedDmpAsParent<561 // MaxDownwardMessageWeight,562 // XcmExecutor<XcmConfig>,563 // Call,564 // >;565 type OutboundXcmpMessageSource = XcmpQueue;566 type DmpMessageHandler = DmpQueue;567 type ReservedDmpWeight = ReservedDmpWeight;568 type ReservedXcmpWeight = ReservedXcmpWeight;569 type XcmpMessageHandler = XcmpQueue;570}571572impl parachain_info::Config for Runtime {}573574impl cumulus_pallet_aura_ext::Config for Runtime {}575576parameter_types! {577 pub const RelayLocation: MultiLocation = MultiLocation::parent();578 pub const RelayNetwork: NetworkId = NetworkId::Polkadot;579 pub RelayOrigin: Origin = cumulus_pallet_xcm::Origin::Relay.into();580 pub Ancestry: MultiLocation = Parachain(ParachainInfo::parachain_id().into()).into();581}582583/// Type for specifying how a `MultiLocation` can be converted into an `AccountId`. This is used584/// when determining ownership of accounts for asset transacting and when attempting to use XCM585/// `Transact` in order to determine the dispatch Origin.586pub type LocationToAccountId = (587 // The parent (Relay-chain) origin converts to the default `AccountId`.588 ParentIsPreset<AccountId>,589 // Sibling parachain origins convert to AccountId via the `ParaId::into`.590 SiblingParachainConvertsVia<Sibling, AccountId>,591 // Straight up local `AccountId32` origins just alias directly to `AccountId`.592 AccountId32Aliases<RelayNetwork, AccountId>,593);594595pub struct OnlySelfCurrency;596impl<B: TryFrom<u128>> MatchesFungible<B> for OnlySelfCurrency {597 fn matches_fungible(a: &MultiAsset) -> Option<B> {598 match (&a.id, &a.fun) {599 (Concrete(_), XcmFungible(ref amount)) => CheckedConversion::checked_from(*amount),600 _ => None,601 }602 }603}604605/// Means for transacting assets on this chain.606pub type LocalAssetTransactor = CurrencyAdapter<607 // Use this currency:608 Balances,609 // Use this currency when it is a fungible asset matching the given location or name:610 OnlySelfCurrency,611 // Do a simple punn to convert an AccountId32 MultiLocation into a native chain account ID:612 LocationToAccountId,613 // Our chain's account ID type (we can't get away without mentioning it explicitly):614 AccountId,615 // We don't track any teleports.616 (),617>;618619/// This is the type we use to convert an (incoming) XCM origin into a local `Origin` instance,620/// ready for dispatching a transaction with Xcm's `Transact`. There is an `OriginKind` which can621/// biases the kind of local `Origin` it will become.622pub type XcmOriginToTransactDispatchOrigin = (623 // Sovereign account converter; this attempts to derive an `AccountId` from the origin location624 // using `LocationToAccountId` and then turn that into the usual `Signed` origin. Useful for625 // foreign chains who want to have a local sovereign account on this chain which they control.626 SovereignSignedViaLocation<LocationToAccountId, Origin>,627 // Native converter for Relay-chain (Parent) location; will converts to a `Relay` origin when628 // recognised.629 RelayChainAsNative<RelayOrigin, Origin>,630 // Native converter for sibling Parachains; will convert to a `SiblingPara` origin when631 // recognised.632 SiblingParachainAsNative<cumulus_pallet_xcm::Origin, Origin>,633 // Superuser converter for the Relay-chain (Parent) location. This will allow it to issue a634 // transaction from the Root origin.635 ParentAsSuperuser<Origin>,636 // Native signed account converter; this just converts an `AccountId32` origin into a normal637 // `Origin::Signed` origin of the same 32-byte value.638 SignedAccountId32AsNative<RelayNetwork, Origin>,639 // Xcm origins can be represented natively under the Xcm pallet's Xcm origin.640 XcmPassthrough<Origin>,641);642643parameter_types! {644 // One XCM operation is 1_000_000 weight - almost certainly a conservative estimate.645 pub UnitWeightCost: Weight = 1_000_000;646 // 1200 UNIQUEs buy 1 second of weight.647 pub const WeightPrice: (MultiLocation, u128) = (MultiLocation::parent(), 1_200 * UNIQUE);648 pub const MaxInstructions: u32 = 100;649 pub const MaxAuthorities: u32 = 100_000;650}651652match_type! {653 pub type ParentOrParentsUnitPlurality: impl Contains<MultiLocation> = {654 MultiLocation { parents: 1, interior: Here } |655 MultiLocation { parents: 1, interior: X1(Plurality { id: BodyId::Unit, .. }) }656 };657}658659pub type Barrier = (660 TakeWeightCredit,661 AllowTopLevelPaidExecutionFrom<Everything>,662 AllowUnpaidExecutionFrom<ParentOrParentsUnitPlurality>,663 // ^^^ Parent & its unit plurality gets free execution664);665666pub struct UsingOnlySelfCurrencyComponents<667 WeightToFee: WeightToFeePolynomial<Balance = Currency::Balance>,668 AssetId: Get<MultiLocation>,669 AccountId,670 Currency: CurrencyT<AccountId>,671 OnUnbalanced: OnUnbalancedT<Currency::NegativeImbalance>,672>(673 Weight,674 Currency::Balance,675 PhantomData<(WeightToFee, AssetId, AccountId, Currency, OnUnbalanced)>,676);677impl<678 WeightToFee: WeightToFeePolynomial<Balance = Currency::Balance>,679 AssetId: Get<MultiLocation>,680 AccountId,681 Currency: CurrencyT<AccountId>,682 OnUnbalanced: OnUnbalancedT<Currency::NegativeImbalance>,683 > WeightTrader684 for UsingOnlySelfCurrencyComponents<WeightToFee, AssetId, AccountId, Currency, OnUnbalanced>685{686 fn new() -> Self {687 Self(0, Zero::zero(), PhantomData)688 }689690 fn buy_weight(&mut self, weight: Weight, payment: Assets) -> Result<Assets, XcmError> {691 let amount = WeightToFee::calc(&weight);692 let u128_amount: u128 = amount.try_into().map_err(|_| XcmError::Overflow)?;693694 // location to this parachain through relay chain695 let option1: xcm::v1::AssetId = Concrete(MultiLocation {696 parents: 1,697 interior: X1(Parachain(ParachainInfo::parachain_id().into())),698 });699 // direct location700 let option2: xcm::v1::AssetId = Concrete(MultiLocation {701 parents: 0,702 interior: Here,703 });704705 let required = if payment.fungible.contains_key(&option1) {706 (option1, u128_amount).into()707 } else if payment.fungible.contains_key(&option2) {708 (option2, u128_amount).into()709 } else {710 (Concrete(MultiLocation::default()), u128_amount).into()711 };712713 let unused = payment714 .checked_sub(required)715 .map_err(|_| XcmError::TooExpensive)?;716 self.0 = self.0.saturating_add(weight);717 self.1 = self.1.saturating_add(amount);718 Ok(unused)719 }720721 fn refund_weight(&mut self, weight: Weight) -> Option<MultiAsset> {722 let weight = weight.min(self.0);723 let amount = WeightToFee::calc(&weight);724 self.0 -= weight;725 self.1 = self.1.saturating_sub(amount);726 let amount: u128 = amount.saturated_into();727 if amount > 0 {728 Some((AssetId::get(), amount).into())729 } else {730 None731 }732 }733}734impl<735 WeightToFee: WeightToFeePolynomial<Balance = Currency::Balance>,736 AssetId: Get<MultiLocation>,737 AccountId,738 Currency: CurrencyT<AccountId>,739 OnUnbalanced: OnUnbalancedT<Currency::NegativeImbalance>,740 > Drop741 for UsingOnlySelfCurrencyComponents<WeightToFee, AssetId, AccountId, Currency, OnUnbalanced>742{743 fn drop(&mut self) {744 OnUnbalanced::on_unbalanced(Currency::issue(self.1));745 }746}747748pub struct XcmConfig;749impl Config for XcmConfig {750 type Call = Call;751 type XcmSender = XcmRouter;752 // How to withdraw and deposit an asset.753 type AssetTransactor = LocalAssetTransactor;754 type OriginConverter = XcmOriginToTransactDispatchOrigin;755 type IsReserve = NativeAsset;756 type IsTeleporter = (); // Teleportation is disabled757 type LocationInverter = LocationInverter<Ancestry>;758 type Barrier = Barrier;759 type Weigher = FixedWeightBounds<UnitWeightCost, Call, MaxInstructions>;760 type Trader = UsingOnlySelfCurrencyComponents<761 IdentityFee<Balance>,762 RelayLocation,763 AccountId,764 Balances,765 (),766 >;767 type ResponseHandler = (); // Don't handle responses for now.768 type SubscriptionService = PolkadotXcm;769770 type AssetTrap = PolkadotXcm;771 type AssetClaims = PolkadotXcm;772}773774// parameter_types! {775// pub const MaxDownwardMessageWeight: Weight = MAXIMUM_BLOCK_WEIGHT / 10;776// }777778/// No local origins on this chain are allowed to dispatch XCM sends/executions.779pub type LocalOriginToLocation = (SignedToAccountId32<Origin, AccountId, RelayNetwork>,);780781/// The means for routing XCM messages which are not for local execution into the right message782/// queues.783pub type XcmRouter = (784 // Two routers - use UMP to communicate with the relay chain:785 cumulus_primitives_utility::ParentAsUmp<ParachainSystem, ()>,786 // ..and XCMP to communicate with the sibling chains.787 XcmpQueue,788);789790impl pallet_evm_coder_substrate::Config for Runtime {791 type EthereumTransactionSender = pallet_ethereum::Pallet<Self>;792 type GasWeightMapping = FixedGasWeightMapping;793}794795impl pallet_xcm::Config for Runtime {796 type Event = Event;797 type SendXcmOrigin = EnsureXcmOrigin<Origin, LocalOriginToLocation>;798 type XcmRouter = XcmRouter;799 type ExecuteXcmOrigin = EnsureXcmOrigin<Origin, LocalOriginToLocation>;800 type XcmExecuteFilter = Everything;801 type XcmExecutor = XcmExecutor<XcmConfig>;802 type XcmTeleportFilter = Everything;803 type XcmReserveTransferFilter = Everything;804 type Weigher = FixedWeightBounds<UnitWeightCost, Call, MaxInstructions>;805 type LocationInverter = LocationInverter<Ancestry>;806 type Origin = Origin;807 type Call = Call;808 const VERSION_DISCOVERY_QUEUE_SIZE: u32 = 100;809 type AdvertisedXcmVersion = pallet_xcm::CurrentXcmVersion;810}811812impl cumulus_pallet_xcm::Config for Runtime {813 type Event = Event;814 type XcmExecutor = XcmExecutor<XcmConfig>;815}816817impl cumulus_pallet_xcmp_queue::Config for Runtime {818 type WeightInfo = ();819 type Event = Event;820 type XcmExecutor = XcmExecutor<XcmConfig>;821 type ChannelInfo = ParachainSystem;822 type VersionWrapper = ();823 type ExecuteOverweightOrigin = frame_system::EnsureRoot<AccountId>;824 type ControllerOrigin = EnsureRoot<AccountId>;825 type ControllerOriginConverter = XcmOriginToTransactDispatchOrigin;826}827828impl cumulus_pallet_dmp_queue::Config for Runtime {829 type Event = Event;830 type XcmExecutor = XcmExecutor<XcmConfig>;831 type ExecuteOverweightOrigin = frame_system::EnsureRoot<AccountId>;832}833834impl pallet_aura::Config for Runtime {835 type AuthorityId = AuraId;836 type DisabledValidators = ();837 type MaxAuthorities = MaxAuthorities;838}839840parameter_types! {841 pub TreasuryAccountId: AccountId = TreasuryModuleId::get().into_account();842 pub const CollectionCreationPrice: Balance = 2 * UNIQUE;843}844845impl pallet_common::Config for Runtime {846 type Event = Event;847848 type Currency = Balances;849 type CollectionCreationPrice = CollectionCreationPrice;850 type TreasuryAccountId = TreasuryAccountId;851}852853impl pallet_evm::account::Config for Runtime {854 type CrossAccountId = pallet_evm::account::BasicCrossAccountId<Self>;855 type EvmAddressMapping = HashedAddressMapping<Self::Hashing>;856 type EvmBackwardsAddressMapping = fp_evm_mapping::MapBackwardsAddressTruncated;857}858859impl pallet_fungible::Config for Runtime {860 type WeightInfo = pallet_fungible::weights::SubstrateWeight<Self>;861}862impl pallet_refungible::Config for Runtime {863 type WeightInfo = pallet_refungible::weights::SubstrateWeight<Self>;864}865impl pallet_nonfungible::Config for Runtime {866 type WeightInfo = pallet_nonfungible::weights::SubstrateWeight<Self>;867}868869impl pallet_unique::Config for Runtime {870 type Event = Event;871 type WeightInfo = pallet_unique::weights::SubstrateWeight<Self>;872}873874parameter_types! {875 pub const InflationBlockInterval: BlockNumber = 100; // every time per how many blocks inflation is applied876}877878/// Used for the pallet inflation879impl pallet_inflation::Config for Runtime {880 type Currency = Balances;881 type TreasuryAccountId = TreasuryAccountId;882 type InflationBlockInterval = InflationBlockInterval;883 type BlockNumberProvider = RelayChainBlockNumberProvider<Runtime>;884}885886// parameter_types! {887// pub MaximumSchedulerWeight: Weight = Perbill::from_percent(50) *888// RuntimeBlockWeights::get().max_block;889// pub const MaxScheduledPerBlock: u32 = 50;890// }891892type EvmSponsorshipHandler = (893 pallet_unique::UniqueEthSponsorshipHandler<Runtime>,894 pallet_evm_contract_helpers::HelpersContractSponsoring<Runtime>,895);896type SponsorshipHandler = (897 pallet_unique::UniqueSponsorshipHandler<Runtime>,898 //pallet_contract_helpers::ContractSponsorshipHandler<Runtime>,899 pallet_evm_transaction_payment::BridgeSponsorshipHandler<Runtime>,900);901902// impl pallet_unq_scheduler::Config for Runtime {903// type Event = Event;904// type Origin = Origin;905// type PalletsOrigin = OriginCaller;906// type Call = Call;907// type MaximumWeight = MaximumSchedulerWeight;908// type ScheduleOrigin = EnsureSigned<AccountId>;909// type MaxScheduledPerBlock = MaxScheduledPerBlock;910// type SponsorshipHandler = SponsorshipHandler;911// type WeightInfo = ();912// }913914impl pallet_evm_transaction_payment::Config for Runtime {915 type EvmSponsorshipHandler = EvmSponsorshipHandler;916 type Currency = Balances;917}918919impl pallet_charge_transaction::Config for Runtime {920 type SponsorshipHandler = SponsorshipHandler;921}922923// impl pallet_contract_helpers::Config for Runtime {924// type DefaultSponsoringRateLimit = DefaultSponsoringRateLimit;925// }926927parameter_types! {928 // 0x842899ECF380553E8a4de75bF534cdf6fBF64049929 pub const HelpersContractAddress: H160 = H160([930 0x84, 0x28, 0x99, 0xec, 0xf3, 0x80, 0x55, 0x3e, 0x8a, 0x4d, 0xe7, 0x5b, 0xf5, 0x34, 0xcd, 0xf6, 0xfb, 0xf6, 0x40, 0x49,931 ]);932}933934impl pallet_evm_contract_helpers::Config for Runtime {935 type ContractAddress = HelpersContractAddress;936 type DefaultSponsoringRateLimit = DefaultSponsoringRateLimit;937}938939construct_runtime!(940 pub enum Runtime where941 Block = Block,942 NodeBlock = opaque::Block,943 UncheckedExtrinsic = UncheckedExtrinsic944 {945 ParachainSystem: cumulus_pallet_parachain_system::{Pallet, Call, Config, Storage, Inherent, Event<T>, ValidateUnsigned} = 20,946 ParachainInfo: parachain_info::{Pallet, Storage, Config} = 21,947948 Aura: pallet_aura::{Pallet, Config<T>} = 22,949 AuraExt: cumulus_pallet_aura_ext::{Pallet, Config} = 23,950951 Balances: pallet_balances::{Pallet, Call, Storage, Config<T>, Event<T>} = 30,952 RandomnessCollectiveFlip: pallet_randomness_collective_flip::{Pallet, Storage} = 31,953 Timestamp: pallet_timestamp::{Pallet, Call, Storage, Inherent} = 32,954 TransactionPayment: pallet_transaction_payment::{Pallet, Storage} = 33,955 Treasury: pallet_treasury::{Pallet, Call, Storage, Config, Event<T>} = 34,956 Sudo: pallet_sudo::{Pallet, Call, Storage, Config<T>, Event<T>} = 35,957 System: frame_system::{Pallet, Call, Storage, Config, Event<T>} = 36,958 Vesting: orml_vesting::{Pallet, Storage, Call, Event<T>, Config<T>} = 37,959 // Vesting: pallet_vesting::{Pallet, Call, Config<T>, Storage, Event<T>} = 37,960 // Contracts: pallet_contracts::{Pallet, Call, Storage, Event<T>} = 38,961962 // XCM helpers.963 XcmpQueue: cumulus_pallet_xcmp_queue::{Pallet, Call, Storage, Event<T>} = 50,964 PolkadotXcm: pallet_xcm::{Pallet, Call, Event<T>, Origin} = 51,965 CumulusXcm: cumulus_pallet_xcm::{Pallet, Call, Event<T>, Origin} = 52,966 DmpQueue: cumulus_pallet_dmp_queue::{Pallet, Call, Storage, Event<T>} = 53,967968 // Unique Pallets969 Inflation: pallet_inflation::{Pallet, Call, Storage} = 60,970 Unique: pallet_unique::{Pallet, Call, Storage, Event<T>} = 61,971 // Scheduler: pallet_unq_scheduler::{Pallet, Call, Storage, Event<T>} = 62,972 // free = 63973 Charging: pallet_charge_transaction::{Pallet, Call, Storage } = 64,974 // ContractHelpers: pallet_contract_helpers::{Pallet, Call, Storage} = 65,975 Common: pallet_common::{Pallet, Storage, Event<T>} = 66,976 Fungible: pallet_fungible::{Pallet, Storage} = 67,977 Refungible: pallet_refungible::{Pallet, Storage} = 68,978 Nonfungible: pallet_nonfungible::{Pallet, Storage} = 69,979980 // Frontier981 EVM: pallet_evm::{Pallet, Config, Call, Storage, Event<T>} = 100,982 Ethereum: pallet_ethereum::{Pallet, Config, Call, Storage, Event, Origin} = 101,983984 EvmCoderSubstrate: pallet_evm_coder_substrate::{Pallet, Storage} = 150,985 EvmContractHelpers: pallet_evm_contract_helpers::{Pallet, Storage} = 151,986 EvmTransactionPayment: pallet_evm_transaction_payment::{Pallet} = 152,987 EvmMigration: pallet_evm_migration::{Pallet, Call, Storage} = 153,988 }989);990991pub struct TransactionConverter;992993impl fp_rpc::ConvertTransaction<UncheckedExtrinsic> for TransactionConverter {994 fn convert_transaction(&self, transaction: pallet_ethereum::Transaction) -> UncheckedExtrinsic {995 UncheckedExtrinsic::new_unsigned(996 pallet_ethereum::Call::<Runtime>::transact { transaction }.into(),997 )998 }999}10001001impl fp_rpc::ConvertTransaction<opaque::UncheckedExtrinsic> for TransactionConverter {1002 fn convert_transaction(1003 &self,1004 transaction: pallet_ethereum::Transaction,1005 ) -> opaque::UncheckedExtrinsic {1006 let extrinsic = UncheckedExtrinsic::new_unsigned(1007 pallet_ethereum::Call::<Runtime>::transact { transaction }.into(),1008 );1009 let encoded = extrinsic.encode();1010 opaque::UncheckedExtrinsic::decode(&mut &encoded[..])1011 .expect("Encoded extrinsic is always valid")1012 }1013}10141015/// The address format for describing accounts.1016pub type Address = sp_runtime::MultiAddress<AccountId, ()>;1017/// Block header type as expected by this runtime.1018pub type Header = generic::Header<BlockNumber, BlakeTwo256>;1019/// Block type as expected by this runtime.1020pub type Block = generic::Block<Header, UncheckedExtrinsic>;1021/// A Block signed with a Justification1022pub type SignedBlock = generic::SignedBlock<Block>;1023/// BlockId type as expected by this runtime.1024pub type BlockId = generic::BlockId<Block>;1025/// The SignedExtension to the basic transaction logic.1026pub type SignedExtra = (1027 frame_system::CheckSpecVersion<Runtime>,1028 // system::CheckTxVersion<Runtime>,1029 frame_system::CheckGenesis<Runtime>,1030 frame_system::CheckEra<Runtime>,1031 frame_system::CheckNonce<Runtime>,1032 frame_system::CheckWeight<Runtime>,1033 pallet_charge_transaction::ChargeTransactionPayment<Runtime>,1034 //pallet_contract_helpers::ContractHelpersExtension<Runtime>,1035);1036/// Unchecked extrinsic type as expected by this runtime.1037pub type UncheckedExtrinsic =1038 fp_self_contained::UncheckedExtrinsic<Address, Call, Signature, SignedExtra>;1039/// Extrinsic type that has already been checked.1040pub type CheckedExtrinsic = fp_self_contained::CheckedExtrinsic<AccountId, Call, SignedExtra, H160>;1041/// Executive: handles dispatch to the various modules.1042pub type Executive = frame_executive::Executive<1043 Runtime,1044 Block,1045 frame_system::ChainContext<Runtime>,1046 Runtime,1047 AllPalletsReversedWithSystemFirst,1048>;10491050impl_opaque_keys! {1051 pub struct SessionKeys {1052 pub aura: Aura,1053 }1054}10551056impl fp_self_contained::SelfContainedCall for Call {1057 type SignedInfo = H160;10581059 fn is_self_contained(&self) -> bool {1060 match self {1061 Call::Ethereum(call) => call.is_self_contained(),1062 _ => false,1063 }1064 }10651066 fn check_self_contained(&self) -> Option<Result<Self::SignedInfo, TransactionValidityError>> {1067 match self {1068 Call::Ethereum(call) => call.check_self_contained(),1069 _ => None,1070 }1071 }10721073 fn validate_self_contained(&self, info: &Self::SignedInfo) -> Option<TransactionValidity> {1074 match self {1075 Call::Ethereum(call) => call.validate_self_contained(info),1076 _ => None,1077 }1078 }10791080 fn pre_dispatch_self_contained(1081 &self,1082 info: &Self::SignedInfo,1083 ) -> Option<Result<(), TransactionValidityError>> {1084 match self {1085 Call::Ethereum(call) => call.pre_dispatch_self_contained(info),1086 _ => None,1087 }1088 }10891090 fn apply_self_contained(1091 self,1092 info: Self::SignedInfo,1093 ) -> Option<sp_runtime::DispatchResultWithInfo<PostDispatchInfoOf<Self>>> {1094 match self {1095 call @ Call::Ethereum(pallet_ethereum::Call::transact { .. }) => Some(call.dispatch(1096 Origin::from(pallet_ethereum::RawOrigin::EthereumTransaction(info)),1097 )),1098 _ => None,1099 }1100 }1101}11021103macro_rules! dispatch_unique_runtime {1104 ($collection:ident.$method:ident($($name:ident),*)) => {{1105 use pallet_unique::dispatch::Dispatched;11061107 let collection = Dispatched::dispatch(<pallet_common::CollectionHandle<Runtime>>::try_get($collection)?);1108 let dispatch = collection.as_dyn();11091110 Ok(dispatch.$method($($name),*))1111 }};1112}11131114impl_common_runtime_apis!();11151116struct CheckInherents;11171118impl cumulus_pallet_parachain_system::CheckInherents<Block> for CheckInherents {1119 fn check_inherents(1120 block: &Block,1121 relay_state_proof: &cumulus_pallet_parachain_system::RelayChainStateProof,1122 ) -> sp_inherents::CheckInherentsResult {1123 let relay_chain_slot = relay_state_proof1124 .read_slot()1125 .expect("Could not read the relay chain slot from the proof");11261127 let inherent_data =1128 cumulus_primitives_timestamp::InherentDataProvider::from_relay_chain_slot_and_duration(1129 relay_chain_slot,1130 sp_std::time::Duration::from_secs(6),1131 )1132 .create_inherent_data()1133 .expect("Could not create the timestamp inherent data");11341135 inherent_data.check_extrinsics(block)1136 }1137}11381139cumulus_pallet_parachain_system::register_validate_block!(1140 Runtime = Runtime,1141 BlockExecutor = cumulus_pallet_aura_ext::BlockExecutor::<Runtime, Executive>,1142 CheckInherents = CheckInherents,1143);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::{52 EnsureAddressTruncated, HashedAddressMapping, Runner, account::CrossAccountId as _,53};54pub use frame_support::{55 construct_runtime, match_type,56 dispatch::DispatchResult,57 PalletId, parameter_types, StorageValue, ConsensusEngineId,58 traits::{59 tokens::currency::Currency as CurrencyT, OnUnbalanced as OnUnbalancedT, Everything,60 Currency, ExistenceRequirement, Get, IsInVec, KeyOwnerProofSystem, LockIdentifier,61 OnUnbalanced, Randomness, FindAuthor,62 },63 weights::{64 constants::{BlockExecutionWeight, ExtrinsicBaseWeight, RocksDbWeight, WEIGHT_PER_SECOND},65 DispatchClass, DispatchInfo, GetDispatchInfo, IdentityFee, Pays, PostDispatchInfo, Weight,66 WeightToFeePolynomial, WeightToFeeCoefficient, WeightToFeeCoefficients,67 },68};69use up_data_structs::*;70// use pallet_contracts::weights::WeightInfo;71// #[cfg(any(feature = "std", test))]72use frame_system::{73 self as frame_system, EnsureRoot, EnsureSigned,74 limits::{BlockWeights, BlockLength},75};76use sp_arithmetic::{77 traits::{BaseArithmetic, Unsigned},78};79use smallvec::smallvec;80use codec::{Encode, Decode};81use pallet_evm::{Account as EVMAccount, FeeCalculator, GasWeightMapping, OnMethodCall};82use fp_rpc::TransactionStatus;83use sp_runtime::{84 traits::{BlockNumberProvider, Dispatchable, PostDispatchInfoOf, Saturating},85 transaction_validity::TransactionValidityError,86 SaturatedConversion,87};8889// pub use pallet_timestamp::Call as TimestampCall;90pub use sp_consensus_aura::sr25519::AuthorityId as AuraId;9192// Polkadot imports93use pallet_xcm::XcmPassthrough;94use polkadot_parachain::primitives::Sibling;95use xcm::v1::{BodyId, Junction::*, MultiLocation, NetworkId, Junctions::*};96use xcm_builder::{97 AccountId32Aliases, AllowTopLevelPaidExecutionFrom, AllowUnpaidExecutionFrom, CurrencyAdapter,98 EnsureXcmOrigin, FixedWeightBounds, LocationInverter, NativeAsset, ParentAsSuperuser,99 RelayChainAsNative, SiblingParachainAsNative, SiblingParachainConvertsVia,100 SignedAccountId32AsNative, SignedToAccountId32, SovereignSignedViaLocation, TakeWeightCredit,101 ParentIsPreset,102};103use xcm_executor::{Config, XcmExecutor, Assets};104use sp_std::{marker::PhantomData};105106use xcm::latest::{107 // Xcm,108 AssetId::{Concrete},109 Fungibility::Fungible as XcmFungible,110 MultiAsset,111 Error as XcmError,112};113use xcm_executor::traits::{MatchesFungible, WeightTrader};114//use xcm_executor::traits::MatchesFungible;115use sp_runtime::traits::CheckedConversion;116117use unique_runtime_common::{impl_common_runtime_apis, types::*, constants::*};118119pub const RUNTIME_NAME: &str = "Quartz";120121type CrossAccountId = pallet_evm::account::BasicCrossAccountId<Runtime>;122123impl RuntimeInstance for Runtime {124 type CrossAccountId = self::CrossAccountId;125126 type TransactionConverter = self::TransactionConverter;127128 fn get_transaction_converter() -> TransactionConverter {129 TransactionConverter130 }131}132133/// Opaque types. These are used by the CLI to instantiate machinery that don't need to know134/// the specifics of the runtime. They can then be made to be agnostic over specific formats135/// of data like extrinsics, allowing for them to continue syncing the network through upgrades136/// to even the core data structures.137pub mod opaque {138 use sp_std::prelude::*;139 use sp_runtime::impl_opaque_keys;140 use super::Aura;141142 pub use unique_runtime_common::types::*;143144 impl_opaque_keys! {145 pub struct SessionKeys {146 pub aura: Aura,147 }148 }149}150151/// This runtime version.152pub const VERSION: RuntimeVersion = RuntimeVersion {153 spec_name: create_runtime_str!(RUNTIME_NAME),154 impl_name: create_runtime_str!(RUNTIME_NAME),155 authoring_version: 1,156 spec_version: 917004,157 impl_version: 0,158 apis: RUNTIME_API_VERSIONS,159 transaction_version: 1,160 state_version: 0,161};162163#[derive(codec::Encode, codec::Decode)]164pub enum XCMPMessage<XAccountId, XBalance> {165 /// Transfer tokens to the given account from the Parachain account.166 TransferToken(XAccountId, XBalance),167}168169/// The version information used to identify this runtime when compiled natively.170#[cfg(feature = "std")]171pub fn native_version() -> NativeVersion {172 NativeVersion {173 runtime_version: VERSION,174 can_author_with: Default::default(),175 }176}177178type NegativeImbalance = <Balances as Currency<AccountId>>::NegativeImbalance;179180pub struct DealWithFees;181impl OnUnbalanced<NegativeImbalance> for DealWithFees {182 fn on_unbalanceds<B>(mut fees_then_tips: impl Iterator<Item = NegativeImbalance>) {183 if let Some(fees) = fees_then_tips.next() {184 // for fees, 100% to treasury185 let mut split = fees.ration(100, 0);186 if let Some(tips) = fees_then_tips.next() {187 // for tips, if any, 100% to treasury188 tips.ration_merge_into(100, 0, &mut split);189 }190 Treasury::on_unbalanced(split.0);191 // Author::on_unbalanced(split.1);192 }193 }194}195196parameter_types! {197 pub const BlockHashCount: BlockNumber = 2400;198 pub RuntimeBlockLength: BlockLength =199 BlockLength::max_with_normal_ratio(5 * 1024 * 1024, NORMAL_DISPATCH_RATIO);200 pub const AvailableBlockRatio: Perbill = Perbill::from_percent(75);201 pub const MaximumBlockLength: u32 = 5 * 1024 * 1024;202 pub RuntimeBlockWeights: BlockWeights = BlockWeights::builder()203 .base_block(BlockExecutionWeight::get())204 .for_class(DispatchClass::all(), |weights| {205 weights.base_extrinsic = ExtrinsicBaseWeight::get();206 })207 .for_class(DispatchClass::Normal, |weights| {208 weights.max_total = Some(NORMAL_DISPATCH_RATIO * MAXIMUM_BLOCK_WEIGHT);209 })210 .for_class(DispatchClass::Operational, |weights| {211 weights.max_total = Some(MAXIMUM_BLOCK_WEIGHT);212 // Operational transactions have some extra reserved space, so that they213 // are included even if block reached `MAXIMUM_BLOCK_WEIGHT`.214 weights.reserved = Some(215 MAXIMUM_BLOCK_WEIGHT - NORMAL_DISPATCH_RATIO * MAXIMUM_BLOCK_WEIGHT216 );217 })218 .avg_block_initialization(AVERAGE_ON_INITIALIZE_RATIO)219 .build_or_panic();220 pub const Version: RuntimeVersion = VERSION;221 pub const SS58Prefix: u8 = 255;222}223224parameter_types! {225 pub const ChainId: u64 = 8881;226}227228pub struct FixedFee;229impl FeeCalculator for FixedFee {230 fn min_gas_price() -> U256 {231 MIN_GAS_PRICE.into()232 }233}234235// Assuming slowest ethereum opcode is SSTORE, with gas price of 20000 as our worst case236// (contract, which only writes a lot of data),237// approximating on top of our real store write weight238parameter_types! {239 pub const WritesPerSecond: u64 = WEIGHT_PER_SECOND / <Runtime as frame_system::Config>::DbWeight::get().write;240 pub const GasPerSecond: u64 = WritesPerSecond::get() * 20000;241 pub const WeightPerGas: u64 = WEIGHT_PER_SECOND / GasPerSecond::get();242}243244/// Limiting EVM execution to 50% of block for substrate users and management tasks245/// EVM transaction consumes more weight than substrate's, so we can't rely on them being246/// scheduled fairly247const EVM_DISPATCH_RATIO: Perbill = Perbill::from_percent(50);248parameter_types! {249 pub BlockGasLimit: U256 = U256::from(NORMAL_DISPATCH_RATIO * EVM_DISPATCH_RATIO * MAXIMUM_BLOCK_WEIGHT / WeightPerGas::get());250}251252pub enum FixedGasWeightMapping {}253impl GasWeightMapping for FixedGasWeightMapping {254 fn gas_to_weight(gas: u64) -> Weight {255 gas.saturating_mul(WeightPerGas::get())256 }257 fn weight_to_gas(weight: Weight) -> u64 {258 weight / WeightPerGas::get()259 }260}261262impl pallet_evm::Config for Runtime {263 type BlockGasLimit = BlockGasLimit;264 type FeeCalculator = FixedFee;265 type GasWeightMapping = FixedGasWeightMapping;266 type BlockHashMapping = pallet_ethereum::EthereumBlockHashMapping<Self>;267 type CallOrigin = EnsureAddressTruncated;268 type WithdrawOrigin = EnsureAddressTruncated;269 type AddressMapping = HashedAddressMapping<Self::Hashing>;270 type PrecompilesType = ();271 type PrecompilesValue = ();272 type Currency = Balances;273 type Event = Event;274 type OnMethodCall = (275 pallet_evm_migration::OnMethodCall<Self>,276 pallet_unique::UniqueErcSupport<Self>,277 pallet_evm_contract_helpers::HelpersOnMethodCall<Self>,278 );279 type OnCreate = pallet_evm_contract_helpers::HelpersOnCreate<Self>;280 type ChainId = ChainId;281 type Runner = pallet_evm::runner::stack::Runner<Self>;282 type OnChargeTransaction = pallet_evm_transaction_payment::OnChargeTransaction<Self>;283 type TransactionValidityHack = pallet_evm_transaction_payment::TransactionValidityHack<Self>;284 type FindAuthor = EthereumFindAuthor<Aura>;285}286287impl pallet_evm_migration::Config for Runtime {288 type WeightInfo = pallet_evm_migration::weights::SubstrateWeight<Self>;289}290291pub struct EthereumFindAuthor<F>(core::marker::PhantomData<F>);292impl<F: FindAuthor<u32>> FindAuthor<H160> for EthereumFindAuthor<F> {293 fn find_author<'a, I>(digests: I) -> Option<H160>294 where295 I: 'a + IntoIterator<Item = (ConsensusEngineId, &'a [u8])>,296 {297 if let Some(author_index) = F::find_author(digests) {298 let authority_id = Aura::authorities()[author_index as usize].clone();299 return Some(H160::from_slice(&authority_id.to_raw_vec()[4..24]));300 }301 None302 }303}304305impl pallet_ethereum::Config for Runtime {306 type Event = Event;307 type StateRoot = pallet_ethereum::IntermediateStateRoot;308}309310impl pallet_randomness_collective_flip::Config for Runtime {}311312impl frame_system::Config for Runtime {313 /// The data to be stored in an account.314 type AccountData = pallet_balances::AccountData<Balance>;315 /// The identifier used to distinguish between accounts.316 type AccountId = AccountId;317 /// The basic call filter to use in dispatchable.318 type BaseCallFilter = Everything;319 /// Maximum number of block number to block hash mappings to keep (oldest pruned first).320 type BlockHashCount = BlockHashCount;321 /// The maximum length of a block (in bytes).322 type BlockLength = RuntimeBlockLength;323 /// The index type for blocks.324 type BlockNumber = BlockNumber;325 /// The weight of the overhead invoked on the block import process, independent of the extrinsics included in that block.326 type BlockWeights = RuntimeBlockWeights;327 /// The aggregated dispatch type that is available for extrinsics.328 type Call = Call;329 /// The weight of database operations that the runtime can invoke.330 type DbWeight = RocksDbWeight;331 /// The ubiquitous event type.332 type Event = Event;333 /// The type for hashing blocks and tries.334 type Hash = Hash;335 /// The hashing algorithm used.336 type Hashing = BlakeTwo256;337 /// The header type.338 type Header = generic::Header<BlockNumber, BlakeTwo256>;339 /// The index type for storing how many extrinsics an account has signed.340 type Index = Index;341 /// The lookup mechanism to get account ID from whatever is passed in dispatchers.342 type Lookup = AccountIdLookup<AccountId, ()>;343 /// What to do if an account is fully reaped from the system.344 type OnKilledAccount = ();345 /// What to do if a new account is created.346 type OnNewAccount = ();347 type OnSetCode = cumulus_pallet_parachain_system::ParachainSetCode<Self>;348 /// The ubiquitous origin type.349 type Origin = Origin;350 /// This type is being generated by `construct_runtime!`.351 type PalletInfo = PalletInfo;352 /// This is used as an identifier of the chain. 42 is the generic substrate prefix.353 type SS58Prefix = SS58Prefix;354 /// Weight information for the extrinsics of this pallet.355 type SystemWeightInfo = frame_system::weights::SubstrateWeight<Self>;356 /// Version of the runtime.357 type Version = Version;358 type MaxConsumers = ConstU32<16>;359}360361parameter_types! {362 pub const MinimumPeriod: u64 = SLOT_DURATION / 2;363}364365impl pallet_timestamp::Config for Runtime {366 /// A timestamp: milliseconds since the unix epoch.367 type Moment = u64;368 type OnTimestampSet = ();369 type MinimumPeriod = MinimumPeriod;370 type WeightInfo = ();371}372373parameter_types! {374 // pub const ExistentialDeposit: u128 = 500;375 pub const ExistentialDeposit: u128 = 0;376 pub const MaxLocks: u32 = 50;377}378379impl pallet_balances::Config for Runtime {380 type MaxLocks = MaxLocks;381 type MaxReserves = ();382 type ReserveIdentifier = [u8; 8];383 /// The type for recording an account's balance.384 type Balance = Balance;385 /// The ubiquitous event type.386 type Event = Event;387 type DustRemoval = Treasury;388 type ExistentialDeposit = ExistentialDeposit;389 type AccountStore = System;390 type WeightInfo = pallet_balances::weights::SubstrateWeight<Self>;391}392393pub const fn deposit(items: u32, bytes: u32) -> Balance {394 items as Balance * 15 * CENTIUNIQUE + (bytes as Balance) * 6 * CENTIUNIQUE395}396397/*398parameter_types! {399 pub TombstoneDeposit: Balance = deposit(400 1,401 sp_std::mem::size_of::<pallet_contracts::Pallet<Runtime>> as u32,402 );403 pub DepositPerContract: Balance = TombstoneDeposit::get();404 pub const DepositPerStorageByte: Balance = deposit(0, 1);405 pub const DepositPerStorageItem: Balance = deposit(1, 0);406 pub RentFraction: Perbill = Perbill::from_rational(1u32, 30 * DAYS);407 pub const SurchargeReward: Balance = 150 * MILLIUNIQUE;408 pub const SignedClaimHandicap: u32 = 2;409 pub const MaxDepth: u32 = 32;410 pub const MaxValueSize: u32 = 16 * 1024;411 pub const MaxCodeSize: u32 = 1024 * 1024 * 25; // 25 Mb412 // The lazy deletion runs inside on_initialize.413 pub DeletionWeightLimit: Weight = AVERAGE_ON_INITIALIZE_RATIO *414 RuntimeBlockWeights::get().max_block;415 // The weight needed for decoding the queue should be less or equal than a fifth416 // of the overall weight dedicated to the lazy deletion.417 pub DeletionQueueDepth: u32 = ((DeletionWeightLimit::get() / (418 <Runtime as pallet_contracts::Config>::WeightInfo::on_initialize_per_queue_item(1) -419 <Runtime as pallet_contracts::Config>::WeightInfo::on_initialize_per_queue_item(0)420 )) / 5) as u32;421 pub Schedule: pallet_contracts::Schedule<Runtime> = Default::default();422}423424impl pallet_contracts::Config for Runtime {425 type Time = Timestamp;426 type Randomness = RandomnessCollectiveFlip;427 type Currency = Balances;428 type Event = Event;429 type RentPayment = ();430 type SignedClaimHandicap = SignedClaimHandicap;431 type TombstoneDeposit = TombstoneDeposit;432 type DepositPerContract = DepositPerContract;433 type DepositPerStorageByte = DepositPerStorageByte;434 type DepositPerStorageItem = DepositPerStorageItem;435 type RentFraction = RentFraction;436 type SurchargeReward = SurchargeReward;437 type WeightPrice = pallet_transaction_payment::Pallet<Self>;438 type WeightInfo = pallet_contracts::weights::SubstrateWeight<Self>;439 type ChainExtension = NFTExtension;440 type DeletionQueueDepth = DeletionQueueDepth;441 type DeletionWeightLimit = DeletionWeightLimit;442 type Schedule = Schedule;443 type CallStack = [pallet_contracts::Frame<Self>; 31];444}445*/446447parameter_types! {448 /// This value increases the priority of `Operational` transactions by adding449 /// a "virtual tip" that's equal to the `OperationalFeeMultiplier * final_fee`.450 pub const OperationalFeeMultiplier: u8 = 5;451}452453/// Linear implementor of `WeightToFeePolynomial`454pub struct LinearFee<T>(sp_std::marker::PhantomData<T>);455456impl<T> WeightToFeePolynomial for LinearFee<T>457where458 T: BaseArithmetic + From<u32> + Copy + Unsigned,459{460 type Balance = T;461462 fn polynomial() -> WeightToFeeCoefficients<Self::Balance> {463 smallvec!(WeightToFeeCoefficient {464 // Targeting 0.1 Unique per NFT transfer465 coeff_integer: WEIGHT_TO_FEE_COEFF.into(),466 coeff_frac: Perbill::zero(),467 negative: false,468 degree: 1,469 })470 }471}472473impl pallet_transaction_payment::Config for Runtime {474 type OnChargeTransaction = pallet_transaction_payment::CurrencyAdapter<Balances, DealWithFees>;475 type TransactionByteFee = TransactionByteFee;476 type OperationalFeeMultiplier = OperationalFeeMultiplier;477 type WeightToFee = LinearFee<Balance>;478 type FeeMultiplierUpdate = ();479}480481parameter_types! {482 pub const ProposalBond: Permill = Permill::from_percent(5);483 pub const ProposalBondMinimum: Balance = 1 * UNIQUE;484 pub const ProposalBondMaximum: Balance = 1000 * UNIQUE;485 pub const SpendPeriod: BlockNumber = 5 * MINUTES;486 pub const Burn: Permill = Permill::from_percent(0);487 pub const TipCountdown: BlockNumber = 1 * DAYS;488 pub const TipFindersFee: Percent = Percent::from_percent(20);489 pub const TipReportDepositBase: Balance = 1 * UNIQUE;490 pub const DataDepositPerByte: Balance = 1 * CENTIUNIQUE;491 pub const BountyDepositBase: Balance = 1 * UNIQUE;492 pub const BountyDepositPayoutDelay: BlockNumber = 1 * DAYS;493 pub const TreasuryModuleId: PalletId = PalletId(*b"py/trsry");494 pub const BountyUpdatePeriod: BlockNumber = 14 * DAYS;495 pub const MaximumReasonLength: u32 = 16384;496 pub const BountyCuratorDeposit: Permill = Permill::from_percent(50);497 pub const BountyValueMinimum: Balance = 5 * UNIQUE;498 pub const MaxApprovals: u32 = 100;499}500501impl pallet_treasury::Config for Runtime {502 type PalletId = TreasuryModuleId;503 type Currency = Balances;504 type ApproveOrigin = EnsureRoot<AccountId>;505 type RejectOrigin = EnsureRoot<AccountId>;506 type Event = Event;507 type OnSlash = ();508 type ProposalBond = ProposalBond;509 type ProposalBondMinimum = ProposalBondMinimum;510 type ProposalBondMaximum = ProposalBondMaximum;511 type SpendPeriod = SpendPeriod;512 type Burn = Burn;513 type BurnDestination = ();514 type SpendFunds = ();515 type WeightInfo = pallet_treasury::weights::SubstrateWeight<Self>;516 type MaxApprovals = MaxApprovals;517}518519impl pallet_sudo::Config for Runtime {520 type Event = Event;521 type Call = Call;522}523524pub struct RelayChainBlockNumberProvider<T>(sp_std::marker::PhantomData<T>);525526impl<T: cumulus_pallet_parachain_system::Config> BlockNumberProvider527 for RelayChainBlockNumberProvider<T>528{529 type BlockNumber = BlockNumber;530531 fn current_block_number() -> Self::BlockNumber {532 cumulus_pallet_parachain_system::Pallet::<T>::validation_data()533 .map(|d| d.relay_parent_number)534 .unwrap_or_default()535 }536}537538parameter_types! {539 pub const MinVestedTransfer: Balance = 10 * UNIQUE;540 pub const MaxVestingSchedules: u32 = 28;541}542543impl orml_vesting::Config for Runtime {544 type Event = Event;545 type Currency = pallet_balances::Pallet<Runtime>;546 type MinVestedTransfer = MinVestedTransfer;547 type VestedTransferOrigin = EnsureSigned<AccountId>;548 type WeightInfo = ();549 type MaxVestingSchedules = MaxVestingSchedules;550 type BlockNumberProvider = RelayChainBlockNumberProvider<Runtime>;551}552553parameter_types! {554 pub const ReservedDmpWeight: Weight = MAXIMUM_BLOCK_WEIGHT / 4;555 pub const ReservedXcmpWeight: Weight = MAXIMUM_BLOCK_WEIGHT / 4;556}557558impl cumulus_pallet_parachain_system::Config for Runtime {559 type Event = Event;560 type SelfParaId = parachain_info::Pallet<Self>;561 type OnSystemEvent = ();562 // type DownwardMessageHandlers = cumulus_primitives_utility::UnqueuedDmpAsParent<563 // MaxDownwardMessageWeight,564 // XcmExecutor<XcmConfig>,565 // Call,566 // >;567 type OutboundXcmpMessageSource = XcmpQueue;568 type DmpMessageHandler = DmpQueue;569 type ReservedDmpWeight = ReservedDmpWeight;570 type ReservedXcmpWeight = ReservedXcmpWeight;571 type XcmpMessageHandler = XcmpQueue;572}573574impl parachain_info::Config for Runtime {}575576impl cumulus_pallet_aura_ext::Config for Runtime {}577578parameter_types! {579 pub const RelayLocation: MultiLocation = MultiLocation::parent();580 pub const RelayNetwork: NetworkId = NetworkId::Polkadot;581 pub RelayOrigin: Origin = cumulus_pallet_xcm::Origin::Relay.into();582 pub Ancestry: MultiLocation = Parachain(ParachainInfo::parachain_id().into()).into();583}584585/// Type for specifying how a `MultiLocation` can be converted into an `AccountId`. This is used586/// when determining ownership of accounts for asset transacting and when attempting to use XCM587/// `Transact` in order to determine the dispatch Origin.588pub type LocationToAccountId = (589 // The parent (Relay-chain) origin converts to the default `AccountId`.590 ParentIsPreset<AccountId>,591 // Sibling parachain origins convert to AccountId via the `ParaId::into`.592 SiblingParachainConvertsVia<Sibling, AccountId>,593 // Straight up local `AccountId32` origins just alias directly to `AccountId`.594 AccountId32Aliases<RelayNetwork, AccountId>,595);596597pub struct OnlySelfCurrency;598impl<B: TryFrom<u128>> MatchesFungible<B> for OnlySelfCurrency {599 fn matches_fungible(a: &MultiAsset) -> Option<B> {600 match (&a.id, &a.fun) {601 (Concrete(_), XcmFungible(ref amount)) => CheckedConversion::checked_from(*amount),602 _ => None,603 }604 }605}606607/// Means for transacting assets on this chain.608pub type LocalAssetTransactor = CurrencyAdapter<609 // Use this currency:610 Balances,611 // Use this currency when it is a fungible asset matching the given location or name:612 OnlySelfCurrency,613 // Do a simple punn to convert an AccountId32 MultiLocation into a native chain account ID:614 LocationToAccountId,615 // Our chain's account ID type (we can't get away without mentioning it explicitly):616 AccountId,617 // We don't track any teleports.618 (),619>;620621/// This is the type we use to convert an (incoming) XCM origin into a local `Origin` instance,622/// ready for dispatching a transaction with Xcm's `Transact`. There is an `OriginKind` which can623/// biases the kind of local `Origin` it will become.624pub type XcmOriginToTransactDispatchOrigin = (625 // Sovereign account converter; this attempts to derive an `AccountId` from the origin location626 // using `LocationToAccountId` and then turn that into the usual `Signed` origin. Useful for627 // foreign chains who want to have a local sovereign account on this chain which they control.628 SovereignSignedViaLocation<LocationToAccountId, Origin>,629 // Native converter for Relay-chain (Parent) location; will converts to a `Relay` origin when630 // recognised.631 RelayChainAsNative<RelayOrigin, Origin>,632 // Native converter for sibling Parachains; will convert to a `SiblingPara` origin when633 // recognised.634 SiblingParachainAsNative<cumulus_pallet_xcm::Origin, Origin>,635 // Superuser converter for the Relay-chain (Parent) location. This will allow it to issue a636 // transaction from the Root origin.637 ParentAsSuperuser<Origin>,638 // Native signed account converter; this just converts an `AccountId32` origin into a normal639 // `Origin::Signed` origin of the same 32-byte value.640 SignedAccountId32AsNative<RelayNetwork, Origin>,641 // Xcm origins can be represented natively under the Xcm pallet's Xcm origin.642 XcmPassthrough<Origin>,643);644645parameter_types! {646 // One XCM operation is 1_000_000 weight - almost certainly a conservative estimate.647 pub UnitWeightCost: Weight = 1_000_000;648 // 1200 UNIQUEs buy 1 second of weight.649 pub const WeightPrice: (MultiLocation, u128) = (MultiLocation::parent(), 1_200 * UNIQUE);650 pub const MaxInstructions: u32 = 100;651 pub const MaxAuthorities: u32 = 100_000;652}653654match_type! {655 pub type ParentOrParentsUnitPlurality: impl Contains<MultiLocation> = {656 MultiLocation { parents: 1, interior: Here } |657 MultiLocation { parents: 1, interior: X1(Plurality { id: BodyId::Unit, .. }) }658 };659}660661pub type Barrier = (662 TakeWeightCredit,663 AllowTopLevelPaidExecutionFrom<Everything>,664 AllowUnpaidExecutionFrom<ParentOrParentsUnitPlurality>,665 // ^^^ Parent & its unit plurality gets free execution666);667668pub struct UsingOnlySelfCurrencyComponents<669 WeightToFee: WeightToFeePolynomial<Balance = Currency::Balance>,670 AssetId: Get<MultiLocation>,671 AccountId,672 Currency: CurrencyT<AccountId>,673 OnUnbalanced: OnUnbalancedT<Currency::NegativeImbalance>,674>(675 Weight,676 Currency::Balance,677 PhantomData<(WeightToFee, AssetId, AccountId, Currency, OnUnbalanced)>,678);679impl<680 WeightToFee: WeightToFeePolynomial<Balance = Currency::Balance>,681 AssetId: Get<MultiLocation>,682 AccountId,683 Currency: CurrencyT<AccountId>,684 OnUnbalanced: OnUnbalancedT<Currency::NegativeImbalance>,685 > WeightTrader686 for UsingOnlySelfCurrencyComponents<WeightToFee, AssetId, AccountId, Currency, OnUnbalanced>687{688 fn new() -> Self {689 Self(0, Zero::zero(), PhantomData)690 }691692 fn buy_weight(&mut self, weight: Weight, payment: Assets) -> Result<Assets, XcmError> {693 let amount = WeightToFee::calc(&weight);694 let u128_amount: u128 = amount.try_into().map_err(|_| XcmError::Overflow)?;695696 // location to this parachain through relay chain697 let option1: xcm::v1::AssetId = Concrete(MultiLocation {698 parents: 1,699 interior: X1(Parachain(ParachainInfo::parachain_id().into())),700 });701 // direct location702 let option2: xcm::v1::AssetId = Concrete(MultiLocation {703 parents: 0,704 interior: Here,705 });706707 let required = if payment.fungible.contains_key(&option1) {708 (option1, u128_amount).into()709 } else if payment.fungible.contains_key(&option2) {710 (option2, u128_amount).into()711 } else {712 (Concrete(MultiLocation::default()), u128_amount).into()713 };714715 let unused = payment716 .checked_sub(required)717 .map_err(|_| XcmError::TooExpensive)?;718 self.0 = self.0.saturating_add(weight);719 self.1 = self.1.saturating_add(amount);720 Ok(unused)721 }722723 fn refund_weight(&mut self, weight: Weight) -> Option<MultiAsset> {724 let weight = weight.min(self.0);725 let amount = WeightToFee::calc(&weight);726 self.0 -= weight;727 self.1 = self.1.saturating_sub(amount);728 let amount: u128 = amount.saturated_into();729 if amount > 0 {730 Some((AssetId::get(), amount).into())731 } else {732 None733 }734 }735}736impl<737 WeightToFee: WeightToFeePolynomial<Balance = Currency::Balance>,738 AssetId: Get<MultiLocation>,739 AccountId,740 Currency: CurrencyT<AccountId>,741 OnUnbalanced: OnUnbalancedT<Currency::NegativeImbalance>,742 > Drop743 for UsingOnlySelfCurrencyComponents<WeightToFee, AssetId, AccountId, Currency, OnUnbalanced>744{745 fn drop(&mut self) {746 OnUnbalanced::on_unbalanced(Currency::issue(self.1));747 }748}749750pub struct XcmConfig;751impl Config for XcmConfig {752 type Call = Call;753 type XcmSender = XcmRouter;754 // How to withdraw and deposit an asset.755 type AssetTransactor = LocalAssetTransactor;756 type OriginConverter = XcmOriginToTransactDispatchOrigin;757 type IsReserve = NativeAsset;758 type IsTeleporter = (); // Teleportation is disabled759 type LocationInverter = LocationInverter<Ancestry>;760 type Barrier = Barrier;761 type Weigher = FixedWeightBounds<UnitWeightCost, Call, MaxInstructions>;762 type Trader = UsingOnlySelfCurrencyComponents<763 IdentityFee<Balance>,764 RelayLocation,765 AccountId,766 Balances,767 (),768 >;769 type ResponseHandler = (); // Don't handle responses for now.770 type SubscriptionService = PolkadotXcm;771772 type AssetTrap = PolkadotXcm;773 type AssetClaims = PolkadotXcm;774}775776// parameter_types! {777// pub const MaxDownwardMessageWeight: Weight = MAXIMUM_BLOCK_WEIGHT / 10;778// }779780/// No local origins on this chain are allowed to dispatch XCM sends/executions.781pub type LocalOriginToLocation = (SignedToAccountId32<Origin, AccountId, RelayNetwork>,);782783/// The means for routing XCM messages which are not for local execution into the right message784/// queues.785pub type XcmRouter = (786 // Two routers - use UMP to communicate with the relay chain:787 cumulus_primitives_utility::ParentAsUmp<ParachainSystem, ()>,788 // ..and XCMP to communicate with the sibling chains.789 XcmpQueue,790);791792impl pallet_evm_coder_substrate::Config for Runtime {793 type EthereumTransactionSender = pallet_ethereum::Pallet<Self>;794 type GasWeightMapping = FixedGasWeightMapping;795}796797impl pallet_xcm::Config for Runtime {798 type Event = Event;799 type SendXcmOrigin = EnsureXcmOrigin<Origin, LocalOriginToLocation>;800 type XcmRouter = XcmRouter;801 type ExecuteXcmOrigin = EnsureXcmOrigin<Origin, LocalOriginToLocation>;802 type XcmExecuteFilter = Everything;803 type XcmExecutor = XcmExecutor<XcmConfig>;804 type XcmTeleportFilter = Everything;805 type XcmReserveTransferFilter = Everything;806 type Weigher = FixedWeightBounds<UnitWeightCost, Call, MaxInstructions>;807 type LocationInverter = LocationInverter<Ancestry>;808 type Origin = Origin;809 type Call = Call;810 const VERSION_DISCOVERY_QUEUE_SIZE: u32 = 100;811 type AdvertisedXcmVersion = pallet_xcm::CurrentXcmVersion;812}813814impl cumulus_pallet_xcm::Config for Runtime {815 type Event = Event;816 type XcmExecutor = XcmExecutor<XcmConfig>;817}818819impl cumulus_pallet_xcmp_queue::Config for Runtime {820 type WeightInfo = ();821 type Event = Event;822 type XcmExecutor = XcmExecutor<XcmConfig>;823 type ChannelInfo = ParachainSystem;824 type VersionWrapper = ();825 type ExecuteOverweightOrigin = frame_system::EnsureRoot<AccountId>;826 type ControllerOrigin = EnsureRoot<AccountId>;827 type ControllerOriginConverter = XcmOriginToTransactDispatchOrigin;828}829830impl cumulus_pallet_dmp_queue::Config for Runtime {831 type Event = Event;832 type XcmExecutor = XcmExecutor<XcmConfig>;833 type ExecuteOverweightOrigin = frame_system::EnsureRoot<AccountId>;834}835836impl pallet_aura::Config for Runtime {837 type AuthorityId = AuraId;838 type DisabledValidators = ();839 type MaxAuthorities = MaxAuthorities;840}841842parameter_types! {843 pub TreasuryAccountId: AccountId = TreasuryModuleId::get().into_account();844 pub const CollectionCreationPrice: Balance = 2 * UNIQUE;845}846847impl pallet_common::Config for Runtime {848 type Event = Event;849850 type Currency = Balances;851 type CollectionCreationPrice = CollectionCreationPrice;852 type TreasuryAccountId = TreasuryAccountId;853}854855impl pallet_evm::account::Config for Runtime {856 type CrossAccountId = pallet_evm::account::BasicCrossAccountId<Self>;857 type EvmAddressMapping = HashedAddressMapping<Self::Hashing>;858 type EvmBackwardsAddressMapping = fp_evm_mapping::MapBackwardsAddressTruncated;859}860861impl pallet_fungible::Config for Runtime {862 type WeightInfo = pallet_fungible::weights::SubstrateWeight<Self>;863}864impl pallet_refungible::Config for Runtime {865 type WeightInfo = pallet_refungible::weights::SubstrateWeight<Self>;866}867impl pallet_nonfungible::Config for Runtime {868 type WeightInfo = pallet_nonfungible::weights::SubstrateWeight<Self>;869}870871impl pallet_unique::Config for Runtime {872 type Event = Event;873 type WeightInfo = pallet_unique::weights::SubstrateWeight<Self>;874}875876parameter_types! {877 pub const InflationBlockInterval: BlockNumber = 100; // every time per how many blocks inflation is applied878}879880/// Used for the pallet inflation881impl pallet_inflation::Config for Runtime {882 type Currency = Balances;883 type TreasuryAccountId = TreasuryAccountId;884 type InflationBlockInterval = InflationBlockInterval;885 type BlockNumberProvider = RelayChainBlockNumberProvider<Runtime>;886}887888// parameter_types! {889// pub MaximumSchedulerWeight: Weight = Perbill::from_percent(50) *890// RuntimeBlockWeights::get().max_block;891// pub const MaxScheduledPerBlock: u32 = 50;892// }893894type EvmSponsorshipHandler = (895 pallet_unique::UniqueEthSponsorshipHandler<Runtime>,896 pallet_evm_contract_helpers::HelpersContractSponsoring<Runtime>,897);898type SponsorshipHandler = (899 pallet_unique::UniqueSponsorshipHandler<Runtime>,900 //pallet_contract_helpers::ContractSponsorshipHandler<Runtime>,901 pallet_evm_transaction_payment::BridgeSponsorshipHandler<Runtime>,902);903904// impl pallet_unq_scheduler::Config for Runtime {905// type Event = Event;906// type Origin = Origin;907// type PalletsOrigin = OriginCaller;908// type Call = Call;909// type MaximumWeight = MaximumSchedulerWeight;910// type ScheduleOrigin = EnsureSigned<AccountId>;911// type MaxScheduledPerBlock = MaxScheduledPerBlock;912// type SponsorshipHandler = SponsorshipHandler;913// type WeightInfo = ();914// }915916impl pallet_evm_transaction_payment::Config for Runtime {917 type EvmSponsorshipHandler = EvmSponsorshipHandler;918 type Currency = Balances;919}920921impl pallet_charge_transaction::Config for Runtime {922 type SponsorshipHandler = SponsorshipHandler;923}924925// impl pallet_contract_helpers::Config for Runtime {926// type DefaultSponsoringRateLimit = DefaultSponsoringRateLimit;927// }928929parameter_types! {930 // 0x842899ECF380553E8a4de75bF534cdf6fBF64049931 pub const HelpersContractAddress: H160 = H160([932 0x84, 0x28, 0x99, 0xec, 0xf3, 0x80, 0x55, 0x3e, 0x8a, 0x4d, 0xe7, 0x5b, 0xf5, 0x34, 0xcd, 0xf6, 0xfb, 0xf6, 0x40, 0x49,933 ]);934}935936impl pallet_evm_contract_helpers::Config for Runtime {937 type ContractAddress = HelpersContractAddress;938 type DefaultSponsoringRateLimit = DefaultSponsoringRateLimit;939}940941construct_runtime!(942 pub enum Runtime where943 Block = Block,944 NodeBlock = opaque::Block,945 UncheckedExtrinsic = UncheckedExtrinsic946 {947 ParachainSystem: cumulus_pallet_parachain_system::{Pallet, Call, Config, Storage, Inherent, Event<T>, ValidateUnsigned} = 20,948 ParachainInfo: parachain_info::{Pallet, Storage, Config} = 21,949950 Aura: pallet_aura::{Pallet, Config<T>} = 22,951 AuraExt: cumulus_pallet_aura_ext::{Pallet, Config} = 23,952953 Balances: pallet_balances::{Pallet, Call, Storage, Config<T>, Event<T>} = 30,954 RandomnessCollectiveFlip: pallet_randomness_collective_flip::{Pallet, Storage} = 31,955 Timestamp: pallet_timestamp::{Pallet, Call, Storage, Inherent} = 32,956 TransactionPayment: pallet_transaction_payment::{Pallet, Storage} = 33,957 Treasury: pallet_treasury::{Pallet, Call, Storage, Config, Event<T>} = 34,958 Sudo: pallet_sudo::{Pallet, Call, Storage, Config<T>, Event<T>} = 35,959 System: frame_system::{Pallet, Call, Storage, Config, Event<T>} = 36,960 Vesting: orml_vesting::{Pallet, Storage, Call, Event<T>, Config<T>} = 37,961 // Vesting: pallet_vesting::{Pallet, Call, Config<T>, Storage, Event<T>} = 37,962 // Contracts: pallet_contracts::{Pallet, Call, Storage, Event<T>} = 38,963964 // XCM helpers.965 XcmpQueue: cumulus_pallet_xcmp_queue::{Pallet, Call, Storage, Event<T>} = 50,966 PolkadotXcm: pallet_xcm::{Pallet, Call, Event<T>, Origin} = 51,967 CumulusXcm: cumulus_pallet_xcm::{Pallet, Call, Event<T>, Origin} = 52,968 DmpQueue: cumulus_pallet_dmp_queue::{Pallet, Call, Storage, Event<T>} = 53,969970 // Unique Pallets971 Inflation: pallet_inflation::{Pallet, Call, Storage} = 60,972 Unique: pallet_unique::{Pallet, Call, Storage, Event<T>} = 61,973 // Scheduler: pallet_unq_scheduler::{Pallet, Call, Storage, Event<T>} = 62,974 // free = 63975 Charging: pallet_charge_transaction::{Pallet, Call, Storage } = 64,976 // ContractHelpers: pallet_contract_helpers::{Pallet, Call, Storage} = 65,977 Common: pallet_common::{Pallet, Storage, Event<T>} = 66,978 Fungible: pallet_fungible::{Pallet, Storage} = 67,979 Refungible: pallet_refungible::{Pallet, Storage} = 68,980 Nonfungible: pallet_nonfungible::{Pallet, Storage} = 69,981982 // Frontier983 EVM: pallet_evm::{Pallet, Config, Call, Storage, Event<T>} = 100,984 Ethereum: pallet_ethereum::{Pallet, Config, Call, Storage, Event, Origin} = 101,985986 EvmCoderSubstrate: pallet_evm_coder_substrate::{Pallet, Storage} = 150,987 EvmContractHelpers: pallet_evm_contract_helpers::{Pallet, Storage} = 151,988 EvmTransactionPayment: pallet_evm_transaction_payment::{Pallet} = 152,989 EvmMigration: pallet_evm_migration::{Pallet, Call, Storage} = 153,990 }991);992993pub struct TransactionConverter;994995impl fp_rpc::ConvertTransaction<UncheckedExtrinsic> for TransactionConverter {996 fn convert_transaction(&self, transaction: pallet_ethereum::Transaction) -> UncheckedExtrinsic {997 UncheckedExtrinsic::new_unsigned(998 pallet_ethereum::Call::<Runtime>::transact { transaction }.into(),999 )1000 }1001}10021003impl fp_rpc::ConvertTransaction<opaque::UncheckedExtrinsic> for TransactionConverter {1004 fn convert_transaction(1005 &self,1006 transaction: pallet_ethereum::Transaction,1007 ) -> opaque::UncheckedExtrinsic {1008 let extrinsic = UncheckedExtrinsic::new_unsigned(1009 pallet_ethereum::Call::<Runtime>::transact { transaction }.into(),1010 );1011 let encoded = extrinsic.encode();1012 opaque::UncheckedExtrinsic::decode(&mut &encoded[..])1013 .expect("Encoded extrinsic is always valid")1014 }1015}10161017/// The address format for describing accounts.1018pub type Address = sp_runtime::MultiAddress<AccountId, ()>;1019/// Block header type as expected by this runtime.1020pub type Header = generic::Header<BlockNumber, BlakeTwo256>;1021/// Block type as expected by this runtime.1022pub type Block = generic::Block<Header, UncheckedExtrinsic>;1023/// A Block signed with a Justification1024pub type SignedBlock = generic::SignedBlock<Block>;1025/// BlockId type as expected by this runtime.1026pub type BlockId = generic::BlockId<Block>;1027/// The SignedExtension to the basic transaction logic.1028pub type SignedExtra = (1029 frame_system::CheckSpecVersion<Runtime>,1030 // system::CheckTxVersion<Runtime>,1031 frame_system::CheckGenesis<Runtime>,1032 frame_system::CheckEra<Runtime>,1033 frame_system::CheckNonce<Runtime>,1034 frame_system::CheckWeight<Runtime>,1035 pallet_charge_transaction::ChargeTransactionPayment<Runtime>,1036 //pallet_contract_helpers::ContractHelpersExtension<Runtime>,1037);1038/// Unchecked extrinsic type as expected by this runtime.1039pub type UncheckedExtrinsic =1040 fp_self_contained::UncheckedExtrinsic<Address, Call, Signature, SignedExtra>;1041/// Extrinsic type that has already been checked.1042pub type CheckedExtrinsic = fp_self_contained::CheckedExtrinsic<AccountId, Call, SignedExtra, H160>;1043/// Executive: handles dispatch to the various modules.1044pub type Executive = frame_executive::Executive<1045 Runtime,1046 Block,1047 frame_system::ChainContext<Runtime>,1048 Runtime,1049 AllPalletsReversedWithSystemFirst,1050>;10511052impl_opaque_keys! {1053 pub struct SessionKeys {1054 pub aura: Aura,1055 }1056}10571058impl fp_self_contained::SelfContainedCall for Call {1059 type SignedInfo = H160;10601061 fn is_self_contained(&self) -> bool {1062 match self {1063 Call::Ethereum(call) => call.is_self_contained(),1064 _ => false,1065 }1066 }10671068 fn check_self_contained(&self) -> Option<Result<Self::SignedInfo, TransactionValidityError>> {1069 match self {1070 Call::Ethereum(call) => call.check_self_contained(),1071 _ => None,1072 }1073 }10741075 fn validate_self_contained(&self, info: &Self::SignedInfo) -> Option<TransactionValidity> {1076 match self {1077 Call::Ethereum(call) => call.validate_self_contained(info),1078 _ => None,1079 }1080 }10811082 fn pre_dispatch_self_contained(1083 &self,1084 info: &Self::SignedInfo,1085 ) -> Option<Result<(), TransactionValidityError>> {1086 match self {1087 Call::Ethereum(call) => call.pre_dispatch_self_contained(info),1088 _ => None,1089 }1090 }10911092 fn apply_self_contained(1093 self,1094 info: Self::SignedInfo,1095 ) -> Option<sp_runtime::DispatchResultWithInfo<PostDispatchInfoOf<Self>>> {1096 match self {1097 call @ Call::Ethereum(pallet_ethereum::Call::transact { .. }) => Some(call.dispatch(1098 Origin::from(pallet_ethereum::RawOrigin::EthereumTransaction(info)),1099 )),1100 _ => None,1101 }1102 }1103}11041105macro_rules! dispatch_unique_runtime {1106 ($collection:ident.$method:ident($($name:ident),*)) => {{1107 use pallet_unique::dispatch::Dispatched;11081109 let collection = Dispatched::dispatch(<pallet_common::CollectionHandle<Runtime>>::try_get($collection)?);1110 let dispatch = collection.as_dyn();11111112 Ok(dispatch.$method($($name),*))1113 }};1114}11151116impl_common_runtime_apis!();11171118struct CheckInherents;11191120impl cumulus_pallet_parachain_system::CheckInherents<Block> for CheckInherents {1121 fn check_inherents(1122 block: &Block,1123 relay_state_proof: &cumulus_pallet_parachain_system::RelayChainStateProof,1124 ) -> sp_inherents::CheckInherentsResult {1125 let relay_chain_slot = relay_state_proof1126 .read_slot()1127 .expect("Could not read the relay chain slot from the proof");11281129 let inherent_data =1130 cumulus_primitives_timestamp::InherentDataProvider::from_relay_chain_slot_and_duration(1131 relay_chain_slot,1132 sp_std::time::Duration::from_secs(6),1133 )1134 .create_inherent_data()1135 .expect("Could not create the timestamp inherent data");11361137 inherent_data.check_extrinsics(block)1138 }1139}11401141cumulus_pallet_parachain_system::register_validate_block!(1142 Runtime = Runtime,1143 BlockExecutor = cumulus_pallet_aura_ext::BlockExecutor::<Runtime, Executive>,1144 CheckInherents = CheckInherents,1145);runtime/unique/src/lib.rsdiffbeforeafterboth--- a/runtime/unique/src/lib.rs
+++ b/runtime/unique/src/lib.rs
@@ -48,7 +48,9 @@
};
// A few exports that help ease life for downstream crates.
pub use pallet_balances::Call as BalancesCall;
-pub use pallet_evm::{EnsureAddressTruncated, HashedAddressMapping, Runner, account::CrossAccountId as _};
+pub use pallet_evm::{
+ EnsureAddressTruncated, HashedAddressMapping, Runner, account::CrossAccountId as _,
+};
pub use frame_support::{
construct_runtime, match_type,
dispatch::DispatchResult,