mirror of
https://github.com/pezkuwichain/pezkuwi-subxt.git
synced 2026-05-30 18:41:03 +00:00
f910a15c1c
The runtime now can provide a number of predefined presets of `RuntimeGenesisConfig` struct. This presets are intended to be used in different deployments, e.g.: `local`, `staging`, etc, and should be included into the corresponding chain-specs. Having `GenesisConfig` presets in runtime allows to fully decouple node from runtime types (the problem is described in #1984). **Summary of changes:** - The `GenesisBuilder` API was adjusted to enable this functionality (and provide better naming - #150): ```rust fn preset_names() -> Vec<PresetId>; fn get_preset(id: Option<PresetId>) -> Option<serde_json::Value>; //`None` means default fn build_state(value: serde_json::Value); pub struct PresetId(Vec<u8>); ``` - **Breaking change**: Old `create_default_config` method was removed, `build_config` was renamed to `build_state`. As a consequence a node won't be able to interact with genesis config for older runtimes. The cleanup was made for sake of API simplicity. Also IMO maintaining compatibility with old API is not so crucial. - Reference implementation was provided for `substrate-test-runtime` and `rococo` runtimes. For rococo new [`genesis_configs_presets`](https://github.com/paritytech/polkadot-sdk/blob/3b41d66b97c5ff0ec4a1989da5ffd8b9f3f588e3/polkadot/runtime/rococo/src/genesis_config_presets.rs#L530) module was added and is used in `GenesisBuilder` [_presets-related_](https://github.com/paritytech/polkadot-sdk/blob/3b41d66b97c5ff0ec4a1989da5ffd8b9f3f588e3/polkadot/runtime/rococo/src/lib.rs#L2462-L2485) methods. - The `chain-spec-builder` util was also improved and allows to ([_doc_](https://github.com/paritytech/polkadot-sdk/blob/3b41d66b97c5ff0ec4a1989da5ffd8b9f3f588e3/substrate/bin/utils/chain-spec-builder/src/lib.rs#L19)): - list presets provided by given runtime (`list-presets`), - display preset or default config provided by the runtime (`display-preset`), - build chain-spec using named preset (`create ... named-preset`), - The `ChainSpecBuilder` is extended with [`with_genesis_config_preset_name`](https://github.com/paritytech/polkadot-sdk/blob/3b41d66b97c5ff0ec4a1989da5ffd8b9f3f588e3/substrate/client/chain-spec/src/chain_spec.rs#L447) method which allows to build chain-spec using named preset provided by the runtime. Sample usage on the node side [here](https://github.com/paritytech/polkadot-sdk/blob/2caffaae803e08a3d5b46c860e8016da023ff4ce/polkadot/node/service/src/chain_spec.rs#L404). Implementation of #1984. fixes: #150 part of: #25 --------- Co-authored-by: Sebastian Kunert <skunert49@gmail.com> Co-authored-by: Kian Paimani <5588131+kianenigma@users.noreply.github.com> Co-authored-by: Oliver Tale-Yazdi <oliver.tale-yazdi@parity.io>
854 lines
30 KiB
Rust
854 lines
30 KiB
Rust
// Copyright (C) Parity Technologies (UK) Ltd.
|
|
// This file is part of Cumulus.
|
|
|
|
// Cumulus is free software: you can redistribute it and/or modify
|
|
// it under the terms of the GNU General Public License as published by
|
|
// the Free Software Foundation, either version 3 of the License, or
|
|
// (at your option) any later version.
|
|
|
|
// Cumulus is distributed in the hope that it will be useful,
|
|
// but WITHOUT ANY WARRANTY; without even the implied warranty of
|
|
// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
|
// GNU General Public License for more details.
|
|
|
|
// You should have received a copy of the GNU General Public License
|
|
// along with Cumulus. If not, see <http://www.gnu.org/licenses/>.
|
|
|
|
#![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"));
|
|
|
|
use cumulus_pallet_parachain_system::RelayNumberMonotonicallyIncreases;
|
|
use polkadot_runtime_common::xcm_sender::NoPriceForMessageDelivery;
|
|
use sp_api::impl_runtime_apis;
|
|
use sp_core::OpaqueMetadata;
|
|
use sp_runtime::{
|
|
create_runtime_str, generic, impl_opaque_keys,
|
|
traits::{AccountIdLookup, BlakeTwo256, Block as BlockT, Hash as HashT},
|
|
transaction_validity::{TransactionSource, TransactionValidity},
|
|
ApplyExtrinsicResult,
|
|
};
|
|
use sp_std::prelude::*;
|
|
#[cfg(feature = "std")]
|
|
use sp_version::NativeVersion;
|
|
use sp_version::RuntimeVersion;
|
|
|
|
// A few exports that help ease life for downstream crates.
|
|
pub use frame_support::{
|
|
construct_runtime, derive_impl,
|
|
dispatch::DispatchClass,
|
|
genesis_builder_helper::{build_state, get_preset},
|
|
parameter_types,
|
|
traits::{
|
|
AsEnsureOriginWithArg, ConstBool, ConstU32, ConstU64, ConstU8, Contains, EitherOfDiverse,
|
|
Everything, IsInVec, Nothing, Randomness,
|
|
},
|
|
weights::{
|
|
constants::{
|
|
BlockExecutionWeight, ExtrinsicBaseWeight, RocksDbWeight, WEIGHT_REF_TIME_PER_SECOND,
|
|
},
|
|
ConstantMultiplier, IdentityFee, Weight,
|
|
},
|
|
StorageValue,
|
|
};
|
|
use frame_system::{
|
|
limits::{BlockLength, BlockWeights},
|
|
EnsureRoot, EnsureSigned,
|
|
};
|
|
pub use pallet_balances::Call as BalancesCall;
|
|
pub use pallet_timestamp::Call as TimestampCall;
|
|
pub use sp_consensus_aura::sr25519::AuthorityId as AuraId;
|
|
#[cfg(any(feature = "std", test))]
|
|
pub use sp_runtime::BuildStorage;
|
|
pub use sp_runtime::{Perbill, Permill};
|
|
|
|
use cumulus_primitives_core::{AggregateMessageOrigin, ParaId};
|
|
use frame_support::traits::TransformOrigin;
|
|
use parachains_common::{
|
|
impls::{AssetsFrom, NonZeroIssuance},
|
|
message_queue::{NarrowOriginToSibling, ParaIdToSibling},
|
|
AccountId, AssetIdForTrustBackedAssets, Signature,
|
|
};
|
|
use xcm_builder::{
|
|
AllowKnownQueryResponses, AllowSubscriptionsFrom, AsPrefixedGeneralIndex, ConvertedConcreteId,
|
|
FrameTransactionalProcessor, FungiblesAdapter, LocalMint, TrailingSetTopicAsId,
|
|
WithUniqueTopic,
|
|
};
|
|
use xcm_executor::traits::JustTry;
|
|
|
|
// XCM imports
|
|
use pallet_xcm::{EnsureXcm, IsMajorityOfBody, XcmPassthrough};
|
|
use polkadot_parachain_primitives::primitives::Sibling;
|
|
use xcm::latest::prelude::*;
|
|
use xcm_builder::{
|
|
AccountId32Aliases, AllowExplicitUnpaidExecutionFrom, AllowTopLevelPaidExecutionFrom,
|
|
EnsureXcmOrigin, FixedWeightBounds, FungibleAdapter, IsConcrete, NativeAsset,
|
|
ParentAsSuperuser, ParentIsPreset, RelayChainAsNative, SiblingParachainAsNative,
|
|
SiblingParachainConvertsVia, SignedAccountId32AsNative, SignedToAccountId32,
|
|
SovereignSignedViaLocation, TakeWeightCredit, UsingComponents,
|
|
};
|
|
use xcm_executor::XcmExecutor;
|
|
|
|
pub type SessionHandlers = ();
|
|
|
|
impl_opaque_keys! {
|
|
pub struct SessionKeys {
|
|
pub aura: Aura,
|
|
}
|
|
}
|
|
|
|
/// This runtime version.
|
|
#[sp_version::runtime_version]
|
|
pub const VERSION: RuntimeVersion = RuntimeVersion {
|
|
spec_name: create_runtime_str!("test-parachain"),
|
|
impl_name: create_runtime_str!("test-parachain"),
|
|
authoring_version: 1,
|
|
spec_version: 1_009_000,
|
|
impl_version: 0,
|
|
apis: RUNTIME_API_VERSIONS,
|
|
transaction_version: 6,
|
|
state_version: 0,
|
|
};
|
|
|
|
pub const MILLISECS_PER_BLOCK: u64 = 6000;
|
|
|
|
pub const SLOT_DURATION: u64 = MILLISECS_PER_BLOCK;
|
|
|
|
pub const EPOCH_DURATION_IN_BLOCKS: u32 = 10 * MINUTES;
|
|
|
|
// These time units are defined in 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;
|
|
|
|
pub const ROC: Balance = 1_000_000_000_000;
|
|
pub const MILLIROC: Balance = 1_000_000_000;
|
|
pub const MICROROC: Balance = 1_000_000;
|
|
|
|
// 1 in 4 blocks (on average, not counting collisions) will be primary babe blocks.
|
|
pub const PRIMARY_PROBABILITY: (u64, u64) = (1, 4);
|
|
|
|
/// 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() }
|
|
}
|
|
|
|
/// We assume that ~10% of the block weight is consumed by `on_initalize` handlers.
|
|
/// This is used to limit the maximal weight of a single extrinsic.
|
|
const AVERAGE_ON_INITIALIZE_RATIO: Perbill = Perbill::from_percent(10);
|
|
/// 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 2 seconds of compute with a 6 second average block time.
|
|
const MAXIMUM_BLOCK_WEIGHT: Weight = Weight::from_parts(
|
|
WEIGHT_REF_TIME_PER_SECOND.saturating_mul(2),
|
|
cumulus_primitives_core::relay_chain::MAX_POV_SIZE as u64,
|
|
);
|
|
|
|
/// Maximum number of blocks simultaneously accepted by the Runtime, not yet included
|
|
/// into the relay chain.
|
|
const UNINCLUDED_SEGMENT_CAPACITY: u32 = 3;
|
|
/// How many parachain blocks are processed by the relay chain per parent. Limits the
|
|
/// number of blocks authored per slot.
|
|
const BLOCK_PROCESSING_VELOCITY: u32 = 2;
|
|
/// Relay chain slot duration, in milliseconds.
|
|
const RELAY_CHAIN_SLOT_DURATION_MILLIS: u32 = 6000;
|
|
|
|
parameter_types! {
|
|
pub const BlockHashCount: BlockNumber = 250;
|
|
pub const Version: RuntimeVersion = VERSION;
|
|
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: u8 = 42;
|
|
}
|
|
|
|
#[derive_impl(frame_system::config_preludes::TestDefaultConfig)]
|
|
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 Nonce = Nonce;
|
|
/// The type for hashing blocks and tries.
|
|
type Hash = Hash;
|
|
/// The hashing algorithm used.
|
|
type Hashing = BlakeTwo256;
|
|
/// The block type.
|
|
type Block = Block;
|
|
/// 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;
|
|
type AccountData = pallet_balances::AccountData<Balance>;
|
|
type OnNewAccount = ();
|
|
type OnKilledAccount = ();
|
|
type DbWeight = RocksDbWeight;
|
|
type BaseCallFilter = frame_support::traits::Everything;
|
|
type SystemWeightInfo = ();
|
|
type BlockWeights = RuntimeBlockWeights;
|
|
type BlockLength = RuntimeBlockLength;
|
|
type SS58Prefix = SS58Prefix;
|
|
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<0>;
|
|
type WeightInfo = ();
|
|
}
|
|
|
|
parameter_types! {
|
|
pub const ExistentialDeposit: u128 = MILLIROC;
|
|
pub const TransferFee: u128 = MILLIROC;
|
|
pub const CreationFee: u128 = MILLIROC;
|
|
pub const TransactionByteFee: u128 = MICROROC;
|
|
}
|
|
|
|
impl pallet_balances::Config for Runtime {
|
|
/// The type for recording an account's balance.
|
|
type Balance = Balance;
|
|
type DustRemoval = ();
|
|
/// The ubiquitous event type.
|
|
type RuntimeEvent = RuntimeEvent;
|
|
type ExistentialDeposit = ExistentialDeposit;
|
|
type AccountStore = System;
|
|
type WeightInfo = ();
|
|
type MaxLocks = ConstU32<50>;
|
|
type MaxReserves = ConstU32<50>;
|
|
type ReserveIdentifier = [u8; 8];
|
|
type RuntimeHoldReason = RuntimeHoldReason;
|
|
type RuntimeFreezeReason = RuntimeFreezeReason;
|
|
type FreezeIdentifier = ();
|
|
type MaxFreezes = ConstU32<0>;
|
|
}
|
|
|
|
impl pallet_transaction_payment::Config for Runtime {
|
|
type RuntimeEvent = RuntimeEvent;
|
|
type OnChargeTransaction = pallet_transaction_payment::FungibleAdapter<Balances, ()>;
|
|
type WeightToFee = IdentityFee<Balance>;
|
|
type LengthToFee = ConstantMultiplier<Balance, TransactionByteFee>;
|
|
type FeeMultiplierUpdate = ();
|
|
type OperationalFeeMultiplier = ConstU8<5>;
|
|
}
|
|
|
|
impl pallet_sudo::Config for Runtime {
|
|
type RuntimeCall = RuntimeCall;
|
|
type RuntimeEvent = RuntimeEvent;
|
|
type WeightInfo = pallet_sudo::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);
|
|
pub const RelayOrigin: AggregateMessageOrigin = AggregateMessageOrigin::Parent;
|
|
}
|
|
|
|
type ConsensusHook = cumulus_pallet_aura_ext::FixedVelocityConsensusHook<
|
|
Runtime,
|
|
RELAY_CHAIN_SLOT_DURATION_MILLIS,
|
|
BLOCK_PROCESSING_VELOCITY,
|
|
UNINCLUDED_SEGMENT_CAPACITY,
|
|
>;
|
|
|
|
impl cumulus_pallet_parachain_system::Config for Runtime {
|
|
type WeightInfo = ();
|
|
type RuntimeEvent = RuntimeEvent;
|
|
type OnSystemEvent = ();
|
|
type SelfParaId = parachain_info::Pallet<Runtime>;
|
|
type OutboundXcmpMessageSource = XcmpQueue;
|
|
type DmpQueue = frame_support::traits::EnqueueWithOrigin<MessageQueue, RelayOrigin>;
|
|
type ReservedDmpWeight = ReservedDmpWeight;
|
|
type XcmpMessageHandler = XcmpQueue;
|
|
type ReservedXcmpWeight = ReservedXcmpWeight;
|
|
type CheckAssociatedRelayNumber = RelayNumberMonotonicallyIncreases;
|
|
type ConsensusHook = ConsensusHook;
|
|
}
|
|
|
|
impl parachain_info::Config for Runtime {}
|
|
|
|
parameter_types! {
|
|
pub MessageQueueServiceWeight: Weight = Perbill::from_percent(35) * RuntimeBlockWeights::get().max_block;
|
|
}
|
|
|
|
impl pallet_message_queue::Config for Runtime {
|
|
type RuntimeEvent = RuntimeEvent;
|
|
type WeightInfo = ();
|
|
type MessageProcessor = xcm_builder::ProcessXcmMessage<
|
|
AggregateMessageOrigin,
|
|
xcm_executor::XcmExecutor<XcmConfig>,
|
|
RuntimeCall,
|
|
>;
|
|
type Size = u32;
|
|
// The XCMP queue pallet is only ever able to handle the `Sibling(ParaId)` origin:
|
|
type QueueChangeHandler = NarrowOriginToSibling<XcmpQueue>;
|
|
type QueuePausedQuery = NarrowOriginToSibling<XcmpQueue>;
|
|
type HeapSize = sp_core::ConstU32<{ 64 * 1024 }>;
|
|
type MaxStale = sp_core::ConstU32<8>;
|
|
type ServiceWeight = MessageQueueServiceWeight;
|
|
type IdleMaxServiceWeight = ();
|
|
}
|
|
|
|
impl cumulus_pallet_aura_ext::Config for Runtime {}
|
|
|
|
parameter_types! {
|
|
pub const RocLocation: Location = Location::parent();
|
|
pub const RococoNetwork: Option<NetworkId> = Some(NetworkId::Rococo);
|
|
pub RelayChainOrigin: RuntimeOrigin = cumulus_pallet_xcm::Origin::Relay.into();
|
|
pub UniversalLocation: InteriorLocation = [Parachain(ParachainInfo::parachain_id().into())].into();
|
|
pub CheckingAccount: AccountId = PolkadotXcm::check_account();
|
|
}
|
|
|
|
/// Type for specifying how a `Location` can be converted into an `AccountId`. This is used
|
|
/// when determining ownership of accounts for asset transacting and when attempting to use XCM
|
|
/// `Transact` in order to determine the dispatch Origin.
|
|
pub type LocationToAccountId = (
|
|
// The parent (Relay-chain) origin converts to the parent `AccountId`.
|
|
ParentIsPreset<AccountId>,
|
|
// Sibling parachain origins convert to AccountId via the `ParaId::into`.
|
|
SiblingParachainConvertsVia<Sibling, AccountId>,
|
|
// Straight up local `AccountId32` origins just alias directly to `AccountId`.
|
|
AccountId32Aliases<RococoNetwork, AccountId>,
|
|
);
|
|
|
|
/// Means for transacting assets on this chain.
|
|
pub type CurrencyTransactor = FungibleAdapter<
|
|
// Use this currency:
|
|
Balances,
|
|
// Use this currency when it is a fungible asset matching the given location or name:
|
|
IsConcrete<RocLocation>,
|
|
// Do a simple punn to convert an AccountId32 Location into a native chain account ID:
|
|
LocationToAccountId,
|
|
// Our chain's account ID type (we can't get away without mentioning it explicitly):
|
|
AccountId,
|
|
// We don't track any teleports.
|
|
(),
|
|
>;
|
|
|
|
/// Means for transacting assets besides the native currency on this chain.
|
|
pub type FungiblesTransactor = FungiblesAdapter<
|
|
// Use this fungibles implementation:
|
|
Assets,
|
|
// Use this currency when it is a fungible asset matching the given location or name:
|
|
ConvertedConcreteId<
|
|
AssetIdForTrustBackedAssets,
|
|
u64,
|
|
AsPrefixedGeneralIndex<
|
|
SystemAssetHubAssetsPalletLocation,
|
|
AssetIdForTrustBackedAssets,
|
|
JustTry,
|
|
>,
|
|
JustTry,
|
|
>,
|
|
// Convert an XCM Location into a local account id:
|
|
LocationToAccountId,
|
|
// Our chain's account ID type (we can't get away without mentioning it explicitly):
|
|
AccountId,
|
|
// We only want to allow teleports of known assets. We use non-zero issuance as an indication
|
|
// that this asset is known.
|
|
LocalMint<NonZeroIssuance<AccountId, Assets>>,
|
|
// The account to use for tracking teleports.
|
|
CheckingAccount,
|
|
>;
|
|
/// Means for transacting assets on this chain.
|
|
pub type AssetTransactors = (CurrencyTransactor, FungiblesTransactor);
|
|
|
|
/// This is the type we use to convert an (incoming) XCM origin into a local `Origin` instance,
|
|
/// ready for dispatching a transaction with Xcm's `Transact`. There is an `OriginKind` which can
|
|
/// biases the kind of local `Origin` it will become.
|
|
pub type XcmOriginToTransactDispatchOrigin = (
|
|
// Sovereign account converter; this attempts to derive an `AccountId` from the origin location
|
|
// using `LocationToAccountId` and then turn that into the usual `Signed` origin. Useful for
|
|
// foreign chains who want to have a local sovereign account on this chain which they control.
|
|
SovereignSignedViaLocation<LocationToAccountId, RuntimeOrigin>,
|
|
// Native converter for Relay-chain (Parent) location; will convert to a `Relay` origin when
|
|
// recognised.
|
|
RelayChainAsNative<RelayChainOrigin, RuntimeOrigin>,
|
|
// Native converter for sibling Parachains; will convert to a `SiblingPara` origin when
|
|
// recognised.
|
|
SiblingParachainAsNative<cumulus_pallet_xcm::Origin, RuntimeOrigin>,
|
|
// Superuser converter for the Relay-chain (Parent) location. This will allow it to issue a
|
|
// transaction from the Root origin.
|
|
ParentAsSuperuser<RuntimeOrigin>,
|
|
// Native signed account converter; this just converts an `AccountId32` origin into a normal
|
|
// `RuntimeOrigin::Signed` origin of the same 32-byte value.
|
|
SignedAccountId32AsNative<RococoNetwork, RuntimeOrigin>,
|
|
// Xcm origins can be represented natively under the Xcm pallet's Xcm origin.
|
|
XcmPassthrough<RuntimeOrigin>,
|
|
);
|
|
|
|
parameter_types! {
|
|
// One XCM operation is 1_000_000_000 weight - almost certainly a conservative estimate.
|
|
pub UnitWeightCost: Weight = Weight::from_parts(1_000_000_000, 64 * 1024);
|
|
// One ROC buys 1 second of weight.
|
|
pub const WeightPrice: (Location, u128) = (Location::parent(), ROC);
|
|
pub const MaxInstructions: u32 = 100;
|
|
}
|
|
|
|
pub struct ParentOrParentsUnitPlurality;
|
|
impl Contains<Location> for ParentOrParentsUnitPlurality {
|
|
fn contains(location: &Location) -> bool {
|
|
matches!(location.unpack(), (1, []) | (1, [Plurality { id: BodyId::Unit, .. }]))
|
|
}
|
|
}
|
|
|
|
pub struct AssetHub;
|
|
impl Contains<Location> for AssetHub {
|
|
fn contains(location: &Location) -> bool {
|
|
matches!(location.unpack(), (1, [Parachain(1000)]))
|
|
}
|
|
}
|
|
|
|
pub type Barrier = TrailingSetTopicAsId<(
|
|
TakeWeightCredit,
|
|
AllowTopLevelPaidExecutionFrom<Everything>,
|
|
// Parent & its unit plurality gets free execution.
|
|
AllowExplicitUnpaidExecutionFrom<ParentOrParentsUnitPlurality>,
|
|
// The network's Asset Hub gets free execution.
|
|
AllowExplicitUnpaidExecutionFrom<AssetHub>,
|
|
// Expected responses are OK.
|
|
AllowKnownQueryResponses<PolkadotXcm>,
|
|
// Subscriptions for version tracking are OK.
|
|
AllowSubscriptionsFrom<Everything>,
|
|
)>;
|
|
|
|
parameter_types! {
|
|
pub MaxAssetsIntoHolding: u32 = 64;
|
|
pub SystemAssetHubLocation: Location = Location::new(1, [Parachain(1000)]);
|
|
// ALWAYS ensure that the index in PalletInstance stays up-to-date with
|
|
// the Relay Chain's Asset Hub's Assets pallet index
|
|
pub SystemAssetHubAssetsPalletLocation: Location =
|
|
Location::new(1, [Parachain(1000), PalletInstance(50)]);
|
|
}
|
|
|
|
pub type Reserves = (NativeAsset, AssetsFrom<SystemAssetHubLocation>);
|
|
|
|
pub struct XcmConfig;
|
|
impl xcm_executor::Config for XcmConfig {
|
|
type RuntimeCall = RuntimeCall;
|
|
type XcmSender = XcmRouter;
|
|
// How to withdraw and deposit an asset.
|
|
type AssetTransactor = AssetTransactors;
|
|
type OriginConverter = XcmOriginToTransactDispatchOrigin;
|
|
type IsReserve = Reserves;
|
|
type IsTeleporter = NativeAsset; // <- should be enough to allow teleportation of ROC
|
|
type UniversalLocation = UniversalLocation;
|
|
type Barrier = Barrier;
|
|
type Weigher = FixedWeightBounds<UnitWeightCost, RuntimeCall, MaxInstructions>;
|
|
type Trader = UsingComponents<IdentityFee<Balance>, RocLocation, AccountId, Balances, ()>;
|
|
type ResponseHandler = PolkadotXcm;
|
|
type AssetTrap = PolkadotXcm;
|
|
type AssetClaims = PolkadotXcm;
|
|
type SubscriptionService = PolkadotXcm;
|
|
type PalletInstancesInfo = AllPalletsWithSystem;
|
|
type MaxAssetsIntoHolding = MaxAssetsIntoHolding;
|
|
type AssetLocker = ();
|
|
type AssetExchanger = ();
|
|
type FeeManager = ();
|
|
type MessageExporter = ();
|
|
type UniversalAliases = Nothing;
|
|
type CallDispatcher = RuntimeCall;
|
|
type SafeCallFilter = Everything;
|
|
type Aliasers = Nothing;
|
|
type TransactionalProcessor = FrameTransactionalProcessor;
|
|
type HrmpNewChannelOpenRequestHandler = ();
|
|
type HrmpChannelAcceptedHandler = ();
|
|
type HrmpChannelClosingHandler = ();
|
|
}
|
|
|
|
/// Local origins on this chain are allowed to dispatch XCM sends/executions.
|
|
pub type LocalOriginToLocation = SignedToAccountId32<RuntimeOrigin, AccountId, RococoNetwork>;
|
|
|
|
/// The means for routing XCM messages which are not for local execution into the right message
|
|
/// queues.
|
|
pub type XcmRouter = WithUniqueTopic<(
|
|
// Two routers - use UMP to communicate with the relay chain:
|
|
cumulus_primitives_utility::ParentAsUmp<ParachainSystem, (), ()>,
|
|
// ..and XCMP to communicate with the sibling chains.
|
|
XcmpQueue,
|
|
)>;
|
|
|
|
impl pallet_xcm::Config for Runtime {
|
|
type RuntimeEvent = RuntimeEvent;
|
|
type SendXcmOrigin = EnsureXcmOrigin<RuntimeOrigin, LocalOriginToLocation>;
|
|
type XcmRouter = XcmRouter;
|
|
type ExecuteXcmOrigin = EnsureXcmOrigin<RuntimeOrigin, LocalOriginToLocation>;
|
|
type XcmExecuteFilter = Everything;
|
|
type XcmExecutor = XcmExecutor<XcmConfig>;
|
|
type XcmTeleportFilter = Everything;
|
|
type XcmReserveTransferFilter = Nothing;
|
|
type Weigher = FixedWeightBounds<UnitWeightCost, RuntimeCall, MaxInstructions>;
|
|
type UniversalLocation = UniversalLocation;
|
|
type RuntimeOrigin = RuntimeOrigin;
|
|
type RuntimeCall = RuntimeCall;
|
|
const VERSION_DISCOVERY_QUEUE_SIZE: u32 = 100;
|
|
type AdvertisedXcmVersion = pallet_xcm::CurrentXcmVersion;
|
|
type Currency = Balances;
|
|
type CurrencyMatcher = ();
|
|
type TrustedLockers = ();
|
|
type SovereignAccountOf = LocationToAccountId;
|
|
type MaxLockers = ConstU32<8>;
|
|
type WeightInfo = pallet_xcm::TestWeightInfo;
|
|
type AdminOrigin = EnsureRoot<AccountId>;
|
|
type MaxRemoteLockConsumers = ConstU32<0>;
|
|
type RemoteLockConsumerIdentifier = ();
|
|
}
|
|
|
|
impl cumulus_pallet_xcm::Config for Runtime {
|
|
type RuntimeEvent = RuntimeEvent;
|
|
type XcmExecutor = XcmExecutor<XcmConfig>;
|
|
}
|
|
|
|
impl cumulus_pallet_xcmp_queue::Config for Runtime {
|
|
type RuntimeEvent = RuntimeEvent;
|
|
type ChannelInfo = ParachainSystem;
|
|
type VersionWrapper = ();
|
|
// Enqueue XCMP messages from siblings for later processing.
|
|
type XcmpQueue = TransformOrigin<MessageQueue, AggregateMessageOrigin, ParaId, ParaIdToSibling>;
|
|
type MaxInboundSuspended = sp_core::ConstU32<1_000>;
|
|
type ControllerOrigin = EnsureRoot<AccountId>;
|
|
type ControllerOriginConverter = XcmOriginToTransactDispatchOrigin;
|
|
type WeightInfo = cumulus_pallet_xcmp_queue::weights::SubstrateWeight<Runtime>;
|
|
type PriceForSiblingDelivery = NoPriceForMessageDelivery<ParaId>;
|
|
}
|
|
|
|
impl cumulus_ping::Config for Runtime {
|
|
type RuntimeEvent = RuntimeEvent;
|
|
type RuntimeOrigin = RuntimeOrigin;
|
|
type RuntimeCall = RuntimeCall;
|
|
type XcmSender = XcmRouter;
|
|
}
|
|
|
|
parameter_types! {
|
|
pub const AssetDeposit: Balance = ROC;
|
|
pub const AssetAccountDeposit: Balance = ROC;
|
|
pub const ApprovalDeposit: Balance = 100 * MILLIROC;
|
|
pub const AssetsStringLimit: u32 = 50;
|
|
pub const MetadataDepositBase: Balance = ROC;
|
|
pub const MetadataDepositPerByte: Balance = 10 * MILLIROC;
|
|
pub const UnitBody: BodyId = BodyId::Unit;
|
|
}
|
|
|
|
/// A majority of the Unit body from Rococo over XCM is our required administration origin.
|
|
pub type AdminOrigin =
|
|
EitherOfDiverse<EnsureRoot<AccountId>, EnsureXcm<IsMajorityOfBody<RocLocation, UnitBody>>>;
|
|
|
|
impl pallet_assets::Config for Runtime {
|
|
type RuntimeEvent = RuntimeEvent;
|
|
type Balance = u64;
|
|
type AssetId = AssetIdForTrustBackedAssets;
|
|
type AssetIdParameter = codec::Compact<AssetIdForTrustBackedAssets>;
|
|
type Currency = Balances;
|
|
type CreateOrigin = AsEnsureOriginWithArg<EnsureSigned<AccountId>>;
|
|
type ForceOrigin = AdminOrigin;
|
|
type AssetDeposit = AssetDeposit;
|
|
type MetadataDepositBase = MetadataDepositBase;
|
|
type MetadataDepositPerByte = MetadataDepositPerByte;
|
|
type ApprovalDeposit = ApprovalDeposit;
|
|
type StringLimit = AssetsStringLimit;
|
|
type Freezer = ();
|
|
type Extra = ();
|
|
type WeightInfo = pallet_assets::weights::SubstrateWeight<Runtime>;
|
|
type CallbackHandle = ();
|
|
type AssetAccountDeposit = AssetAccountDeposit;
|
|
type RemoveItemsLimit = frame_support::traits::ConstU32<1000>;
|
|
#[cfg(feature = "runtime-benchmarks")]
|
|
type BenchmarkHelper = ();
|
|
}
|
|
|
|
impl pallet_aura::Config for Runtime {
|
|
type AuthorityId = AuraId;
|
|
type DisabledValidators = ();
|
|
type MaxAuthorities = ConstU32<100_000>;
|
|
type AllowMultipleBlocksPerSlot = ConstBool<true>;
|
|
type SlotDuration = ConstU64<SLOT_DURATION>;
|
|
}
|
|
|
|
construct_runtime! {
|
|
pub enum Runtime
|
|
{
|
|
System: frame_system,
|
|
Timestamp: pallet_timestamp,
|
|
Sudo: pallet_sudo,
|
|
TransactionPayment: pallet_transaction_payment,
|
|
|
|
ParachainSystem: cumulus_pallet_parachain_system = 20,
|
|
ParachainInfo: parachain_info = 21,
|
|
|
|
Balances: pallet_balances = 30,
|
|
Assets: pallet_assets = 31,
|
|
|
|
Aura: pallet_aura,
|
|
AuraExt: cumulus_pallet_aura_ext,
|
|
|
|
// XCM helpers.
|
|
XcmpQueue: cumulus_pallet_xcmp_queue = 50,
|
|
PolkadotXcm: pallet_xcm = 51,
|
|
CumulusXcm: cumulus_pallet_xcm = 52,
|
|
// RIP DmpQueue 53
|
|
MessageQueue: pallet_message_queue = 54,
|
|
|
|
Spambot: cumulus_ping = 99,
|
|
}
|
|
}
|
|
|
|
/// Balance of an account.
|
|
pub type Balance = u128;
|
|
/// Index of a transaction in the chain.
|
|
pub type Nonce = u32;
|
|
/// A hash of some data used by the chain.
|
|
pub type Hash = <BlakeTwo256 as HashT>::Output;
|
|
/// An index to a block.
|
|
pub type BlockNumber = u32;
|
|
/// The address format for describing accounts.
|
|
pub type Address = sp_runtime::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>,
|
|
cumulus_primitives_storage_weight_reclaim::StorageWeightReclaim<Runtime>,
|
|
);
|
|
/// Unchecked extrinsic type as expected by this runtime.
|
|
pub type UncheckedExtrinsic =
|
|
generic::UncheckedExtrinsic<Address, RuntimeCall, Signature, SignedExtra>;
|
|
/// Executive: handles dispatch to the various modules.
|
|
pub type Executive = frame_executive::Executive<
|
|
Runtime,
|
|
Block,
|
|
frame_system::ChainContext<Runtime>,
|
|
Runtime,
|
|
AllPalletsWithSystem,
|
|
RemoveCollectiveFlip,
|
|
>;
|
|
|
|
pub struct RemoveCollectiveFlip;
|
|
impl frame_support::traits::OnRuntimeUpgrade for RemoveCollectiveFlip {
|
|
fn on_runtime_upgrade() -> Weight {
|
|
use frame_support::storage::migration;
|
|
// Remove the storage value `RandomMaterial` from removed pallet `RandomnessCollectiveFlip`
|
|
#[allow(deprecated)]
|
|
migration::remove_storage_prefix(b"RandomnessCollectiveFlip", b"RandomMaterial", b"");
|
|
<Runtime as frame_system::Config>::DbWeight::get().writes(1)
|
|
}
|
|
}
|
|
|
|
impl_runtime_apis! {
|
|
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) -> sp_runtime::ExtrinsicInclusionMode {
|
|
Executive::initialize_block(header)
|
|
}
|
|
}
|
|
|
|
impl sp_api::Metadata<Block> for Runtime {
|
|
fn metadata() -> OpaqueMetadata {
|
|
OpaqueMetadata::new(Runtime::metadata().into())
|
|
}
|
|
|
|
fn metadata_at_version(version: u32) -> Option<OpaqueMetadata> {
|
|
Runtime::metadata_at_version(version)
|
|
}
|
|
|
|
fn metadata_versions() -> sp_std::vec::Vec<u32> {
|
|
Runtime::metadata_versions()
|
|
}
|
|
}
|
|
|
|
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 decode_session_keys(
|
|
encoded: Vec<u8>,
|
|
) -> Option<Vec<(Vec<u8>, sp_core::crypto::KeyTypeId)>> {
|
|
SessionKeys::decode_into_raw_public_keys(&encoded)
|
|
}
|
|
|
|
fn generate_session_keys(seed: Option<Vec<u8>>) -> Vec<u8> {
|
|
SessionKeys::generate(seed)
|
|
}
|
|
}
|
|
|
|
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> {
|
|
pallet_aura::Authorities::<Runtime>::get().into_inner()
|
|
}
|
|
}
|
|
|
|
impl frame_system_rpc_runtime_api::AccountNonceApi<Block, AccountId, Nonce> for Runtime {
|
|
fn account_nonce(account: AccountId) -> Nonce {
|
|
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)
|
|
}
|
|
}
|
|
|
|
impl sp_genesis_builder::GenesisBuilder<Block> for Runtime {
|
|
fn build_state(config: Vec<u8>) -> sp_genesis_builder::Result {
|
|
build_state::<RuntimeGenesisConfig>(config)
|
|
}
|
|
|
|
fn get_preset(id: &Option<sp_genesis_builder::PresetId>) -> Option<Vec<u8>> {
|
|
get_preset::<RuntimeGenesisConfig>(id, |_| None)
|
|
}
|
|
|
|
fn preset_names() -> Vec<sp_genesis_builder::PresetId> {
|
|
vec![]
|
|
}
|
|
}
|
|
|
|
impl cumulus_primitives_aura::AuraUnincludedSegmentApi<Block> for Runtime {
|
|
fn can_build_upon(
|
|
included_hash: <Block as BlockT>::Hash,
|
|
slot: cumulus_primitives_aura::Slot,
|
|
) -> bool {
|
|
ConsensusHook::can_build_upon(included_hash, slot)
|
|
}
|
|
}
|
|
}
|
|
|
|
cumulus_pallet_parachain_system::register_validate_block! {
|
|
Runtime = Runtime,
|
|
BlockExecutor = cumulus_pallet_aura_ext::BlockExecutor::<Runtime, Executive>,
|
|
}
|