-
-
Save bernardoaraujor/a55b5ec923352dd4c3280407bdb7f31e to your computer and use it in GitHub Desktop.
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
#![cfg_attr(not(feature = "std"), no_std)] | |
// `construct_runtime!` does a lot of recursion and requires us to increase the limit to 256. | |
#![recursion_limit = "256"] | |
// Make the WASM binary available. | |
#[cfg(feature = "std")] | |
include!(concat!(env!("OUT_DIR"), "/wasm_binary.rs")); | |
mod currency; | |
mod weights; | |
pub mod xcm_config; | |
pub use currency::{deposit, EXISTENTIAL_DEPOSIT, MICROUNIT, MILLIUNIT, UNIT}; | |
use cumulus_pallet_parachain_system::RelayNumberStrictlyIncreases; | |
use smallvec::smallvec; | |
use sp_api::impl_runtime_apis; | |
use sp_core::{crypto::KeyTypeId, OpaqueMetadata, H160}; | |
use sp_runtime::{ | |
create_runtime_str, generic, impl_opaque_keys, | |
traits::{AccountIdLookup, BlakeTwo256, Block as BlockT, IdentifyAccount, Verify}, | |
transaction_validity::{TransactionSource, TransactionValidity}, | |
ApplyExtrinsicResult, | |
}; | |
use sp_std::prelude::*; | |
#[cfg(feature = "std")] | |
use sp_version::NativeVersion; | |
use sp_version::RuntimeVersion; | |
use pallet_balances::NegativeImbalance; | |
use frame_support::{ | |
construct_runtime, | |
dispatch::DispatchClass, | |
parameter_types, | |
traits::{AsEnsureOriginWithArg, ConstU32, ConstU64, ConstU8, Everything, OnUnbalanced}, | |
weights::{ | |
constants::WEIGHT_REF_TIME_PER_SECOND, ConstantMultiplier, Weight, WeightToFeeCoefficient, | |
WeightToFeeCoefficients, WeightToFeePolynomial, | |
}, | |
PalletId, | |
}; | |
use frame_system::{ | |
limits::{BlockLength, BlockWeights}, | |
EnsureRoot, EnsureSigned, | |
}; | |
pub use sp_consensus_aura::sr25519::AuthorityId as AuraId; | |
pub use sp_runtime::{MultiAddress, Perbill, Permill}; | |
use xcm_config::{XcmConfig, XcmOriginToTransactDispatchOrigin}; | |
use xcm_primitives::SignedToAccountId20; | |
#[cfg(any(feature = "std", test))] | |
pub use sp_runtime::BuildStorage; | |
// Polkadot imports | |
use polkadot_runtime_common::{BlockHashCount, SlowAdjustingFeeUpdate}; | |
// Cumulus imports | |
//https://github.com/paritytech/cumulus/tree/master/parachains/common | |
pub use parachains_common::{ | |
impls::{AccountIdOf}, | |
Balance, BlockNumber, Hash, Index, Signature, | |
}; | |
use fp_account::EthereumSignature; | |
use weights::{BlockExecutionWeight, ExtrinsicBaseWeight, RocksDbWeight}; | |
// XCM Imports | |
use xcm::latest::prelude::BodyId; | |
use xcm_executor::XcmExecutor; | |
/// Some way of identifying an account on the chain. We intentionally make it equivalent | |
/// to the public key of our transaction signing scheme. | |
pub type AccountId = <<EthereumSignature as Verify>::Signer as IdentifyAccount>::AccountId; | |
/// The address format for describing accounts. | |
pub type Address = MultiAddress<AccountId, ()>; | |
/// Block header type as expected by this runtime. | |
pub type Header = generic::Header<BlockNumber, BlakeTwo256>; | |
/// Block type as expected by this runtime. | |
pub type Block = generic::Block<Header, UncheckedExtrinsic>; | |
/// A Block signed with a Justification | |
pub type SignedBlock = generic::SignedBlock<Block>; | |
/// BlockId type as expected by this runtime. | |
pub type BlockId = generic::BlockId<Block>; | |
/// The SignedExtension to the basic transaction logic. | |
pub type SignedExtra = ( | |
frame_system::CheckNonZeroSender<Runtime>, | |
frame_system::CheckSpecVersion<Runtime>, | |
frame_system::CheckTxVersion<Runtime>, | |
frame_system::CheckGenesis<Runtime>, | |
frame_system::CheckEra<Runtime>, | |
frame_system::CheckNonce<Runtime>, | |
frame_system::CheckWeight<Runtime>, | |
pallet_transaction_payment::ChargeTransactionPayment<Runtime>, | |
); | |
/// Unchecked extrinsic type as expected by this runtime. | |
pub type UncheckedExtrinsic = | |
fp_self_contained::UncheckedExtrinsic<Address, RuntimeCall, Signature, SignedExtra>; | |
/// Extrinsic type that has already been checked. | |
pub type CheckedExtrinsic = | |
fp_self_contained::CheckedExtrinsic<AccountId, RuntimeCall, SignedExtra, H160>; | |
/// Executive: handles dispatch to the various modules. | |
pub type Executive = frame_executive::Executive< | |
Runtime, | |
Block, | |
frame_system::ChainContext<Runtime>, | |
Runtime, | |
AllPalletsWithSystem, | |
>; | |
/// Handles converting a weight scalar to a fee value, based on the scale and granularity of the | |
/// node's balance type. | |
/// | |
/// This should typically create a mapping between the following ranges: | |
/// - `[0, MAXIMUM_BLOCK_WEIGHT]` | |
/// - `[Balance::min, Balance::max]` | |
/// | |
/// Yet, it can be used for any other sort of change to weight-fee. Some examples being: | |
/// - Setting it to `0` will essentially disable the weight fee. | |
/// - Setting it to `1` will cause the literal `#[weight = x]` values to be charged. | |
pub struct WeightToFee; | |
impl WeightToFeePolynomial for WeightToFee { | |
type Balance = Balance; | |
fn polynomial() -> WeightToFeeCoefficients<Self::Balance> { | |
// in Rococo, extrinsic base weight (smallest non-zero weight) is mapped to 1 MILLIUNIT: | |
// in our template, we map to 1/10 of that, or 1/10 MILLIUNIT | |
let p = MILLIUNIT / 10; | |
let q = 100 * Balance::from(ExtrinsicBaseWeight::get().ref_time()); | |
smallvec![WeightToFeeCoefficient { | |
degree: 1, | |
negative: false, | |
coeff_frac: Perbill::from_rational(p % q, q), | |
coeff_integer: p / q, | |
}] | |
} | |
} | |
/// Opaque types. These are used by the CLI to instantiate machinery that don't need to know | |
/// the specifics of the runtime. They can then be made to be agnostic over specific formats | |
/// of data like extrinsics, allowing for them to continue syncing the network through upgrades | |
/// to even the core data structures. | |
pub mod opaque { | |
use super::*; | |
use sp_runtime::{generic, traits::BlakeTwo256}; | |
pub use sp_runtime::OpaqueExtrinsic as UncheckedExtrinsic; | |
/// Opaque block header type. | |
pub type Header = generic::Header<BlockNumber, BlakeTwo256>; | |
/// Opaque block type. | |
pub type Block = generic::Block<Header, UncheckedExtrinsic>; | |
/// Opaque block identifier type. | |
pub type BlockId = generic::BlockId<Block>; | |
} | |
impl_opaque_keys! { | |
pub struct SessionKeys { | |
pub aura: Aura, | |
} | |
} | |
#[sp_version::runtime_version] | |
pub const VERSION: RuntimeVersion = RuntimeVersion { | |
spec_name: create_runtime_str!("template-parachain"), | |
impl_name: create_runtime_str!("template-parachain"), | |
authoring_version: 1, | |
spec_version: 1000, | |
impl_version: 0, | |
apis: RUNTIME_API_VERSIONS, | |
transaction_version: 1, | |
state_version: 1, | |
}; | |
/// This determines the average expected block time that we are targeting. | |
/// Blocks will be produced at a minimum duration defined by `SLOT_DURATION`. | |
/// `SLOT_DURATION` is picked up by `pallet_timestamp` which is in turn picked | |
/// up by `pallet_aura` to implement `fn slot_duration()`. | |
/// | |
/// Change this to adjust the block time. | |
pub const MILLISECS_PER_BLOCK: u64 = 12000; | |
// NOTE: Currently it is not possible to change the slot duration after the chain has started. | |
// Attempting to do so will brick block production. | |
pub const SLOT_DURATION: u64 = MILLISECS_PER_BLOCK; | |
// Time is measured by number of blocks. | |
pub const MINUTES: BlockNumber = 60_000 / (MILLISECS_PER_BLOCK as BlockNumber); | |
pub const HOURS: BlockNumber = MINUTES * 60; | |
pub const DAYS: BlockNumber = HOURS * 24; | |
/// We assume that ~5% of the block weight is consumed by `on_initialize` handlers. This is | |
/// used to limit the maximal weight of a single extrinsic. | |
const AVERAGE_ON_INITIALIZE_RATIO: Perbill = Perbill::from_percent(5); | |
/// We allow `Normal` extrinsics to fill up the block up to 75%, the rest can be used by | |
/// `Operational` extrinsics. | |
const NORMAL_DISPATCH_RATIO: Perbill = Perbill::from_percent(75); | |
/// We allow for 0.5 of a second of compute with a 12 second average block time. | |
const MAXIMUM_BLOCK_WEIGHT: Weight = Weight::from_parts( | |
WEIGHT_REF_TIME_PER_SECOND.saturating_div(2), | |
cumulus_primitives_core::relay_chain::MAX_POV_SIZE as u64, | |
); | |
/// The version information used to identify this runtime when compiled natively. | |
#[cfg(feature = "std")] | |
pub fn native_version() -> NativeVersion { | |
NativeVersion { runtime_version: VERSION, can_author_with: Default::default() } | |
} | |
parameter_types! { | |
pub const Version: RuntimeVersion = VERSION; | |
// This part is copied from Substrate's `bin/node/runtime/src/lib.rs`. | |
// The `RuntimeBlockLength` and `RuntimeBlockWeights` exist here because the | |
// `DeletionWeightLimit` and `DeletionQueueDepth` depend on those to parameterize | |
// the lazy contract deletion. | |
pub RuntimeBlockLength: BlockLength = | |
BlockLength::max_with_normal_ratio(5 * 1024 * 1024, NORMAL_DISPATCH_RATIO); | |
pub RuntimeBlockWeights: BlockWeights = BlockWeights::builder() | |
.base_block(BlockExecutionWeight::get()) | |
.for_class(DispatchClass::all(), |weights| { | |
weights.base_extrinsic = ExtrinsicBaseWeight::get(); | |
}) | |
.for_class(DispatchClass::Normal, |weights| { | |
weights.max_total = Some(NORMAL_DISPATCH_RATIO * MAXIMUM_BLOCK_WEIGHT); | |
}) | |
.for_class(DispatchClass::Operational, |weights| { | |
weights.max_total = Some(MAXIMUM_BLOCK_WEIGHT); | |
// Operational transactions have some extra reserved space, so that they | |
// are included even if block reached `MAXIMUM_BLOCK_WEIGHT`. | |
weights.reserved = Some( | |
MAXIMUM_BLOCK_WEIGHT - NORMAL_DISPATCH_RATIO * MAXIMUM_BLOCK_WEIGHT | |
); | |
}) | |
.avg_block_initialization(AVERAGE_ON_INITIALIZE_RATIO) | |
.build_or_panic(); | |
pub const SS58Prefix: u16 = 42; | |
} | |
// Configure FRAME pallets to include in runtime. | |
impl frame_system::Config for Runtime { | |
/// The identifier used to distinguish between accounts. | |
type AccountId = AccountId; | |
/// The aggregated dispatch type that is available for extrinsics. | |
type RuntimeCall = RuntimeCall; | |
/// The lookup mechanism to get account ID from whatever is passed in dispatchers. | |
type Lookup = AccountIdLookup<AccountId, ()>; | |
/// The index type for storing how many extrinsics an account has signed. | |
type Index = Index; | |
/// The index type for blocks. | |
type BlockNumber = BlockNumber; | |
/// The type for hashing blocks and tries. | |
type Hash = Hash; | |
/// The hashing algorithm used. | |
type Hashing = BlakeTwo256; | |
/// The header type. | |
type Header = generic::Header<BlockNumber, BlakeTwo256>; | |
/// The ubiquitous event type. | |
type RuntimeEvent = RuntimeEvent; | |
/// The ubiquitous origin type. | |
type RuntimeOrigin = RuntimeOrigin; | |
/// Maximum number of block number to block hash mappings to keep (oldest pruned first). | |
type BlockHashCount = BlockHashCount; | |
/// Runtime version. | |
type Version = Version; | |
/// Converts a module to an index of this module in the runtime. | |
type PalletInfo = PalletInfo; | |
/// The data to be stored in an account. | |
type AccountData = pallet_balances::AccountData<Balance>; | |
/// What to do if a new account is created. | |
type OnNewAccount = (); | |
/// What to do if an account is fully reaped from the system. | |
type OnKilledAccount = (); | |
/// The weight of database operations that the runtime can invoke. | |
type DbWeight = RocksDbWeight; | |
/// The basic call filter to use in dispatchable. | |
type BaseCallFilter = Everything; | |
/// Weight information for the extrinsics of this pallet. | |
type SystemWeightInfo = (); | |
/// Block & extrinsics weights: base values and limits. | |
type BlockWeights = RuntimeBlockWeights; | |
/// The maximum length of a block (in bytes). | |
type BlockLength = RuntimeBlockLength; | |
/// This is used as an identifier of the chain. 42 is the generic substrate prefix. | |
type SS58Prefix = SS58Prefix; | |
/// The action to take on a Runtime Upgrade | |
type OnSetCode = cumulus_pallet_parachain_system::ParachainSetCode<Self>; | |
type MaxConsumers = frame_support::traits::ConstU32<16>; | |
} | |
impl pallet_timestamp::Config for Runtime { | |
/// A timestamp: milliseconds since the unix epoch. | |
type Moment = u64; | |
type OnTimestampSet = Aura; | |
type MinimumPeriod = ConstU64<{ SLOT_DURATION / 2 }>; | |
type WeightInfo = (); | |
} | |
parameter_types! { | |
pub const UncleGenerations: u32 = 0; | |
} | |
impl pallet_authorship::Config for Runtime { | |
type FindAuthor = pallet_session::FindAccountFromAuthorIndex<Self, Aura>; | |
type EventHandler = (CollatorSelection,); | |
} | |
parameter_types! { | |
pub const ExistentialDeposit: Balance = EXISTENTIAL_DEPOSIT; | |
} | |
impl pallet_balances::Config for Runtime { | |
type MaxLocks = ConstU32<50>; | |
/// The type for recording an account's balance. | |
type Balance = Balance; | |
/// The ubiquitous event type. | |
type RuntimeEvent = RuntimeEvent; | |
type DustRemoval = (); | |
type ExistentialDeposit = ExistentialDeposit; | |
type AccountStore = System; | |
type WeightInfo = pallet_balances::weights::SubstrateWeight<Runtime>; | |
type MaxReserves = ConstU32<50>; | |
type ReserveIdentifier = [u8; 8]; | |
} | |
pub struct DealWithFees<R>(sp_std::marker::PhantomData<R>); | |
impl<R> OnUnbalanced<NegativeImbalance<R>> for DealWithFees<R> | |
where | |
R: pallet_balances::Config,// + pallet_treasury::Config, | |
//pallet_treasury::Pallet<R>: OnUnbalanced<NegativeImbalance<R>>, | |
{ | |
// this seems to be called for substrate-based transactions | |
fn on_unbalanceds<B>(mut fees_then_tips: impl Iterator<Item = NegativeImbalance<R>>) { | |
if let Some(fees) = fees_then_tips.next() { | |
// for fees, 80% are burned, 20% to the treasury | |
let (_, to_treasury) = fees.ration(80, 20); | |
// Balances pallet automatically burns dropped Negative Imbalances by decreasing | |
// total_supply accordingly | |
//<pallet_treasury::Pallet<R> as OnUnbalanced<_>>::on_unbalanced(to_treasury); | |
} | |
} | |
// this is called from pallet_evm for Ethereum-based transactions | |
// (technically, it calls on_unbalanced, which calls this when non-zero) | |
fn on_nonzero_unbalanced(amount: NegativeImbalance<R>) { | |
// Balances pallet automatically burns dropped Negative Imbalances by decreasing | |
// total_supply accordingly | |
let (_, to_treasury) = amount.ration(80, 20); | |
//<pallet_treasury::Pallet<R> as OnUnbalanced<_>>::on_unbalanced(to_treasury); | |
} | |
} | |
parameter_types! { | |
pub const AssetDeposit: Balance = 10 * UNIT; | |
pub const AssetAccountDeposit: Balance = deposit(1, 16); | |
pub const ApprovalDeposit: Balance = EXISTENTIAL_DEPOSIT; | |
pub const StringLimit: u32 = 50; | |
pub const MetadataDepositBase: Balance = deposit(1, 68); | |
pub const MetadataDepositPerByte: Balance = deposit(0, 1); | |
} | |
impl pallet_assets::Config for Runtime { | |
type RuntimeEvent = RuntimeEvent; | |
type Balance = Balance; | |
type AssetId = u32; | |
type AssetIdParameter = codec::Compact<u32>; | |
type Currency = Balances; | |
type CreateOrigin = AsEnsureOriginWithArg<EnsureSigned<AccountId>>; | |
type CallbackHandle = (); | |
type ForceOrigin = EnsureRoot<AccountId>; | |
type AssetDeposit = AssetDeposit; | |
type AssetAccountDeposit = AssetAccountDeposit; | |
type MetadataDepositBase = MetadataDepositBase; | |
type MetadataDepositPerByte = MetadataDepositPerByte; | |
type ApprovalDeposit = ApprovalDeposit; | |
type StringLimit = StringLimit; | |
type Freezer = (); | |
type Extra = (); | |
type RemoveItemsLimit = ConstU32<1000>; | |
type WeightInfo = pallet_assets::weights::SubstrateWeight<Runtime>; | |
#[cfg(feature = "runtime-benchmarks")] | |
type BenchmarkHelper = (); | |
} | |
parameter_types! { | |
/// Relay Chain `TransactionByteFee` / 10 | |
pub const TransactionByteFee: Balance = 10 * MICROUNIT; | |
} | |
impl pallet_transaction_payment::Config for Runtime { | |
type RuntimeEvent = RuntimeEvent; | |
type OnChargeTransaction = | |
pallet_transaction_payment::CurrencyAdapter<Balances, DealWithFees<Runtime>>; | |
type WeightToFee = WeightToFee; | |
type LengthToFee = ConstantMultiplier<Balance, TransactionByteFee>; | |
type FeeMultiplierUpdate = SlowAdjustingFeeUpdate<Self>; | |
type OperationalFeeMultiplier = ConstU8<5>; | |
} | |
impl pallet_utility::Config for Runtime { | |
type RuntimeEvent = RuntimeEvent; | |
type RuntimeCall = RuntimeCall; | |
type PalletsOrigin = OriginCaller; | |
type WeightInfo = pallet_utility::weights::SubstrateWeight<Runtime>; | |
} | |
parameter_types! { | |
pub const ReservedXcmpWeight: Weight = MAXIMUM_BLOCK_WEIGHT.saturating_div(4); | |
pub const ReservedDmpWeight: Weight = MAXIMUM_BLOCK_WEIGHT.saturating_div(4); | |
} | |
impl cumulus_pallet_parachain_system::Config for Runtime { | |
type RuntimeEvent = RuntimeEvent; | |
type OnSystemEvent = (); | |
type SelfParaId = parachain_info::Pallet<Runtime>; | |
type OutboundXcmpMessageSource = XcmpQueue; | |
type DmpMessageHandler = DmpQueue; | |
type ReservedDmpWeight = ReservedDmpWeight; | |
type XcmpMessageHandler = XcmpQueue; | |
type ReservedXcmpWeight = ReservedXcmpWeight; | |
type CheckAssociatedRelayNumber = RelayNumberStrictlyIncreases; | |
} | |
impl parachain_info::Config for Runtime {} | |
impl cumulus_pallet_aura_ext::Config for Runtime {} | |
impl cumulus_pallet_xcmp_queue::Config for Runtime { | |
type RuntimeEvent = RuntimeEvent; | |
type XcmExecutor = XcmExecutor<XcmConfig>; | |
type ChannelInfo = ParachainSystem; | |
type VersionWrapper = (); | |
type ExecuteOverweightOrigin = EnsureRoot<AccountId>; | |
type ControllerOrigin = EnsureRoot<AccountId>; | |
type ControllerOriginConverter = XcmOriginToTransactDispatchOrigin; | |
type WeightInfo = (); | |
type PriceForSiblingDelivery = (); | |
} | |
impl cumulus_pallet_dmp_queue::Config for Runtime { | |
type RuntimeEvent = RuntimeEvent; | |
type XcmExecutor = XcmExecutor<XcmConfig>; | |
type ExecuteOverweightOrigin = EnsureRoot<AccountId>; | |
} | |
parameter_types! { | |
pub const Period: u32 = 6 * HOURS; | |
pub const Offset: u32 = 0; | |
} | |
impl pallet_session::Config for Runtime { | |
type RuntimeEvent = RuntimeEvent; | |
type ValidatorId = <Self as frame_system::Config>::AccountId; | |
// we don't have stash and controller, thus we don't need the convert as well. | |
type ValidatorIdOf = pallet_collator_selection::IdentityCollator; | |
type ShouldEndSession = pallet_session::PeriodicSessions<Period, Offset>; | |
type NextSessionRotation = pallet_session::PeriodicSessions<Period, Offset>; | |
type SessionManager = CollatorSelection; | |
// Essentially just Aura, but lets be pedantic. | |
type SessionHandler = <SessionKeys as sp_runtime::traits::OpaqueKeys>::KeyTypeIdProviders; | |
type Keys = SessionKeys; | |
type WeightInfo = (); | |
} | |
impl pallet_sudo::Config for Runtime { | |
type RuntimeEvent = RuntimeEvent; | |
type RuntimeCall = RuntimeCall; | |
} | |
parameter_types! { | |
pub const CouncilMotionDuration: BlockNumber = 7 * DAYS; | |
pub const CouncilMaxProposals: u32 = 10; | |
pub const CouncilMaxMembers: u32 = 25; | |
} | |
type CouncilCollective = pallet_collective::Instance1; | |
impl pallet_collective::Config<CouncilCollective> for Runtime { | |
type RuntimeOrigin = RuntimeOrigin; | |
type RuntimeEvent = RuntimeEvent; | |
type Proposal = RuntimeCall; | |
type SetMembersOrigin = EnsureRoot<AccountId>; | |
type MotionDuration = CouncilMotionDuration; | |
type MaxProposals = CouncilMaxProposals; | |
type MaxMembers = CouncilMaxMembers; | |
type DefaultVote = pallet_collective::PrimeDefaultVote; | |
type WeightInfo = pallet_collective::weights::SubstrateWeight<Runtime>; | |
} | |
impl pallet_motion::Config for Runtime { | |
type RuntimeEvent = RuntimeEvent; | |
type RuntimeCall = RuntimeCall; | |
type SimpleMajorityOrigin = | |
pallet_collective::EnsureProportionMoreThan<AccountId, CouncilCollective, 1, 2>; | |
type SuperMajorityOrigin = | |
pallet_collective::EnsureProportionAtLeast<AccountId, CouncilCollective, 2, 3>; | |
type UnanimousOrigin = | |
pallet_collective::EnsureProportionAtLeast<AccountId, CouncilCollective, 1, 1>; | |
} | |
impl pallet_aura::Config for Runtime { | |
type AuthorityId = AuraId; | |
type DisabledValidators = (); | |
type MaxAuthorities = ConstU32<100_000>; | |
} | |
parameter_types! { | |
pub const PotId: PalletId = PalletId(*b"PotStake"); | |
pub const MaxCandidates: u32 = 1000; | |
pub const MinCandidates: u32 = 5; | |
pub const SessionLength: BlockNumber = 6 * HOURS; | |
pub const MaxInvulnerables: u32 = 100; | |
pub const ExecutiveBody: BodyId = BodyId::Executive; | |
} | |
// We allow root only to execute privileged collator selection operations. | |
pub type CollatorSelectionUpdateOrigin = EnsureRoot<AccountId>; | |
impl pallet_collator_selection::Config for Runtime { | |
type RuntimeEvent = RuntimeEvent; | |
type Currency = Balances; | |
type UpdateOrigin = CollatorSelectionUpdateOrigin; | |
type PotId = PotId; | |
type MaxCandidates = MaxCandidates; | |
type MinCandidates = MinCandidates; | |
type MaxInvulnerables = MaxInvulnerables; | |
// should be a multiple of session or things will get inconsistent | |
type KickThreshold = Period; | |
type ValidatorId = <Self as frame_system::Config>::AccountId; | |
type ValidatorIdOf = pallet_collator_selection::IdentityCollator; | |
type ValidatorRegistration = Session; | |
type WeightInfo = (); | |
} | |
// Create the runtime by composing the FRAME pallets that were previously configured. | |
construct_runtime!( | |
pub enum Runtime where | |
Block = Block, | |
NodeBlock = opaque::Block, | |
UncheckedExtrinsic = UncheckedExtrinsic, | |
{ | |
// System support stuff. | |
System: frame_system::{Pallet, Call, Config, Storage, Event<T>} = 0, | |
ParachainSystem: cumulus_pallet_parachain_system::{ | |
Pallet, Call, Config, Storage, Inherent, Event<T>, ValidateUnsigned, | |
} = 1, | |
Timestamp: pallet_timestamp::{Pallet, Call, Storage, Inherent} = 2, | |
ParachainInfo: parachain_info::{Pallet, Storage, Config} = 3, | |
// Utility | |
Utility: pallet_utility::{Pallet, Call, Event} = 4, | |
// Monetary stuff. | |
Balances: pallet_balances::{Pallet, Call, Storage, Config<T>, Event<T>} = 10, | |
TransactionPayment: pallet_transaction_payment::{Pallet, Storage, Event<T>} = 11, | |
Assets: pallet_assets::{Pallet, Call, Storage, Config<T>, Event<T>} = 12, | |
// Governance | |
Sudo: pallet_sudo::{Pallet, Call, Config<T>, Storage, Event<T>} = 15, | |
Council: pallet_collective::<Instance1>::{Pallet, Call, Storage, Origin<T>, Event<T>, Config<T>} = 16, | |
Motion: pallet_motion::{Pallet, Call, Event<T>} = 17, | |
// Collator support. The order of these 4 are important and shall not change. | |
Authorship: pallet_authorship::{Pallet, Storage} = 20, | |
CollatorSelection: pallet_collator_selection::{Pallet, Call, Storage, Event<T>, Config<T>} = 21, | |
Session: pallet_session::{Pallet, Call, Storage, Event, Config<T>} = 22, | |
Aura: pallet_aura::{Pallet, Storage, Config<T>} = 23, | |
AuraExt: cumulus_pallet_aura_ext::{Pallet, Storage, Config} = 24, | |
// XCM helpers. | |
XcmpQueue: cumulus_pallet_xcmp_queue::{Pallet, Call, Storage, Event<T>} = 30, | |
PolkadotXcm: pallet_xcm::{Pallet, Call, Event<T>, Origin, Config} = 31, | |
CumulusXcm: cumulus_pallet_xcm::{Pallet, Event<T>, Origin} = 32, | |
DmpQueue: cumulus_pallet_dmp_queue::{Pallet, Call, Storage, Event<T>} = 33, | |
} | |
); | |
#[cfg(feature = "runtime-benchmarks")] | |
#[macro_use] | |
extern crate frame_benchmarking; | |
#[cfg(feature = "runtime-benchmarks")] | |
mod benches { | |
define_benchmarks!( | |
[frame_system, SystemBench::<Runtime>] | |
[pallet_balances, Balances] | |
[pallet_assets, Assets] | |
[pallet_session, SessionBench::<Runtime>] | |
[pallet_timestamp, Timestamp] | |
[pallet_collator_selection, CollatorSelection] | |
[cumulus_pallet_xcmp_queue, XcmpQueue] | |
); | |
} | |
impl_runtime_apis! { | |
impl sp_consensus_aura::AuraApi<Block, AuraId> for Runtime { | |
fn slot_duration() -> sp_consensus_aura::SlotDuration { | |
sp_consensus_aura::SlotDuration::from_millis(Aura::slot_duration()) | |
} | |
fn authorities() -> Vec<AuraId> { | |
Aura::authorities().into_inner() | |
} | |
} | |
impl sp_api::Core<Block> for Runtime { | |
fn version() -> RuntimeVersion { | |
VERSION | |
} | |
fn execute_block(block: Block) { | |
Executive::execute_block(block) | |
} | |
fn initialize_block(header: &<Block as BlockT>::Header) { | |
Executive::initialize_block(header) | |
} | |
} | |
impl sp_api::Metadata<Block> for Runtime { | |
fn metadata() -> OpaqueMetadata { | |
OpaqueMetadata::new(Runtime::metadata().into()) | |
} | |
} | |
impl sp_block_builder::BlockBuilder<Block> for Runtime { | |
fn apply_extrinsic(extrinsic: <Block as BlockT>::Extrinsic) -> ApplyExtrinsicResult { | |
Executive::apply_extrinsic(extrinsic) | |
} | |
fn finalize_block() -> <Block as BlockT>::Header { | |
Executive::finalize_block() | |
} | |
fn inherent_extrinsics(data: sp_inherents::InherentData) -> Vec<<Block as BlockT>::Extrinsic> { | |
data.create_extrinsics() | |
} | |
fn check_inherents( | |
block: Block, | |
data: sp_inherents::InherentData, | |
) -> sp_inherents::CheckInherentsResult { | |
data.check_extrinsics(&block) | |
} | |
} | |
impl sp_transaction_pool::runtime_api::TaggedTransactionQueue<Block> for Runtime { | |
fn validate_transaction( | |
source: TransactionSource, | |
tx: <Block as BlockT>::Extrinsic, | |
block_hash: <Block as BlockT>::Hash, | |
) -> TransactionValidity { | |
Executive::validate_transaction(source, tx, block_hash) | |
} | |
} | |
impl sp_offchain::OffchainWorkerApi<Block> for Runtime { | |
fn offchain_worker(header: &<Block as BlockT>::Header) { | |
Executive::offchain_worker(header) | |
} | |
} | |
impl sp_session::SessionKeys<Block> for Runtime { | |
fn generate_session_keys(seed: Option<Vec<u8>>) -> Vec<u8> { | |
SessionKeys::generate(seed) | |
} | |
fn decode_session_keys( | |
encoded: Vec<u8>, | |
) -> Option<Vec<(Vec<u8>, KeyTypeId)>> { | |
SessionKeys::decode_into_raw_public_keys(&encoded) | |
} | |
} | |
impl frame_system_rpc_runtime_api::AccountNonceApi<Block, AccountId, Index> for Runtime { | |
fn account_nonce(account: AccountId) -> Index { | |
System::account_nonce(account) | |
} | |
} | |
impl pallet_transaction_payment_rpc_runtime_api::TransactionPaymentApi<Block, Balance> for Runtime { | |
fn query_info( | |
uxt: <Block as BlockT>::Extrinsic, | |
len: u32, | |
) -> pallet_transaction_payment_rpc_runtime_api::RuntimeDispatchInfo<Balance> { | |
TransactionPayment::query_info(uxt, len) | |
} | |
fn query_fee_details( | |
uxt: <Block as BlockT>::Extrinsic, | |
len: u32, | |
) -> pallet_transaction_payment::FeeDetails<Balance> { | |
TransactionPayment::query_fee_details(uxt, len) | |
} | |
fn query_weight_to_fee(weight: Weight) -> Balance { | |
TransactionPayment::weight_to_fee(weight) | |
} | |
fn query_length_to_fee(length: u32) -> Balance { | |
TransactionPayment::length_to_fee(length) | |
} | |
} | |
impl pallet_transaction_payment_rpc_runtime_api::TransactionPaymentCallApi<Block, Balance, RuntimeCall> | |
for Runtime | |
{ | |
fn query_call_info( | |
call: RuntimeCall, | |
len: u32, | |
) -> pallet_transaction_payment::RuntimeDispatchInfo<Balance> { | |
TransactionPayment::query_call_info(call, len) | |
} | |
fn query_call_fee_details( | |
call: RuntimeCall, | |
len: u32, | |
) -> pallet_transaction_payment::FeeDetails<Balance> { | |
TransactionPayment::query_call_fee_details(call, len) | |
} | |
fn query_weight_to_fee(weight: Weight) -> Balance { | |
TransactionPayment::weight_to_fee(weight) | |
} | |
fn query_length_to_fee(length: u32) -> Balance { | |
TransactionPayment::length_to_fee(length) | |
} | |
} | |
impl cumulus_primitives_core::CollectCollationInfo<Block> for Runtime { | |
fn collect_collation_info(header: &<Block as BlockT>::Header) -> cumulus_primitives_core::CollationInfo { | |
ParachainSystem::collect_collation_info(header) | |
} | |
} | |
#[cfg(feature = "try-runtime")] | |
impl frame_try_runtime::TryRuntime<Block> for Runtime { | |
fn on_runtime_upgrade(checks: frame_try_runtime::UpgradeCheckSelect) -> (Weight, Weight) { | |
let weight = Executive::try_runtime_upgrade(checks).unwrap(); | |
(weight, RuntimeBlockWeights::get().max_block) | |
} | |
fn execute_block( | |
block: Block, | |
state_root_check: bool, | |
signature_check: bool, | |
select: frame_try_runtime::TryStateSelect, | |
) -> Weight { | |
Executive::try_execute_block(block, state_root_check, signature_check, select).unwrap() | |
} | |
} | |
#[cfg(feature = "runtime-benchmarks")] | |
impl frame_benchmarking::Benchmark<Block> for Runtime { | |
fn benchmark_metadata(extra: bool) -> ( | |
Vec<frame_benchmarking::BenchmarkList>, | |
Vec<frame_support::traits::StorageInfo>, | |
) { | |
use frame_benchmarking::{Benchmarking, BenchmarkList}; | |
use frame_support::traits::StorageInfoTrait; | |
use frame_system_benchmarking::Pallet as SystemBench; | |
use cumulus_pallet_session_benchmarking::Pallet as SessionBench; | |
let mut list = Vec::<BenchmarkList>::new(); | |
list_benchmarks!(list, extra); | |
let storage_info = AllPalletsWithSystem::storage_info(); | |
return (list, storage_info) | |
} | |
fn dispatch_benchmark( | |
config: frame_benchmarking::BenchmarkConfig | |
) -> Result<Vec<frame_benchmarking::BenchmarkBatch>, sp_runtime::RuntimeString> { | |
use frame_benchmarking::{Benchmarking, BenchmarkBatch, TrackedStorageKey}; | |
use frame_system_benchmarking::Pallet as SystemBench; | |
impl frame_system_benchmarking::Config for Runtime {} | |
use cumulus_pallet_session_benchmarking::Pallet as SessionBench; | |
impl cumulus_pallet_session_benchmarking::Config for Runtime {} | |
let whitelist: Vec<TrackedStorageKey> = vec![ | |
// Block Number | |
hex_literal::hex!("26aa394eea5630e07c48ae0c9558cef702a5c1b19ab7a04f536c519aca4983ac").to_vec().into(), | |
// Total Issuance | |
hex_literal::hex!("c2261276cc9d1f8598ea4b6a74b15c2f57c875e4cff74148e4628f264b974c80").to_vec().into(), | |
// Execution Phase | |
hex_literal::hex!("26aa394eea5630e07c48ae0c9558cef7ff553b5a9862a516939d82b3d3d8661a").to_vec().into(), | |
// Event Count | |
hex_literal::hex!("26aa394eea5630e07c48ae0c9558cef70a98fdbe9ce6c55837576c60c7af3850").to_vec().into(), | |
// System Events | |
hex_literal::hex!("26aa394eea5630e07c48ae0c9558cef780d41e5e16056765bc8461851072c9d7").to_vec().into(), | |
]; | |
let mut batches = Vec::<BenchmarkBatch>::new(); | |
let params = (&config, &whitelist); | |
add_benchmarks!(params, batches); | |
if batches.is_empty() { return Err("Benchmark not found for this pallet.".into()) } | |
Ok(batches) | |
} | |
} | |
} | |
struct CheckInherents; | |
impl cumulus_pallet_parachain_system::CheckInherents<Block> for CheckInherents { | |
fn check_inherents( | |
block: &Block, | |
relay_state_proof: &cumulus_pallet_parachain_system::RelayChainStateProof, | |
) -> sp_inherents::CheckInherentsResult { | |
let relay_chain_slot = relay_state_proof | |
.read_slot() | |
.expect("Could not read the relay chain slot from the proof"); | |
let inherent_data = | |
cumulus_primitives_timestamp::InherentDataProvider::from_relay_chain_slot_and_duration( | |
relay_chain_slot, | |
sp_std::time::Duration::from_secs(6), | |
) | |
.create_inherent_data() | |
.expect("Could not create the timestamp inherent data"); | |
inherent_data.check_extrinsics(block) | |
} | |
} | |
cumulus_pallet_parachain_system::register_validate_block! { | |
Runtime = Runtime, | |
BlockExecutor = cumulus_pallet_aura_ext::BlockExecutor::<Runtime, Executive>, | |
CheckInherents = CheckInherents, | |
} |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment