diff --git a/Cargo.lock b/Cargo.lock
index 630503f6041f..bce9bf3d0352 100644
--- a/Cargo.lock
+++ b/Cargo.lock
@@ -19716,6 +19716,7 @@ version = "0.0.0"
dependencies = [
"clap 4.5.10",
"frame-benchmarking-cli",
+ "frame-metadata-hash-extension",
"frame-system",
"futures",
"jsonrpsee",
@@ -19758,6 +19759,7 @@ version = "0.0.0"
dependencies = [
"frame-benchmarking",
"frame-executive",
+ "frame-metadata-hash-extension",
"frame-support",
"frame-system",
"frame-system-benchmarking",
diff --git a/templates/parachain/runtime/src/configs/mod.rs b/templates/parachain/runtime/src/configs/mod.rs
index 204e74a11e6a..607797e690ba 100644
--- a/templates/parachain/runtime/src/configs/mod.rs
+++ b/templates/parachain/runtime/src/configs/mod.rs
@@ -59,7 +59,7 @@ use super::{
MessageQueue, Nonce, PalletInfo, ParachainSystem, Runtime, RuntimeCall, RuntimeEvent,
RuntimeFreezeReason, RuntimeHoldReason, RuntimeOrigin, RuntimeTask, Session, SessionKeys,
System, WeightToFee, XcmpQueue, AVERAGE_ON_INITIALIZE_RATIO, EXISTENTIAL_DEPOSIT, HOURS,
- MAXIMUM_BLOCK_WEIGHT, MICROUNIT, NORMAL_DISPATCH_RATIO, SLOT_DURATION, VERSION,
+ MAXIMUM_BLOCK_WEIGHT, MICRO_UNIT, NORMAL_DISPATCH_RATIO, SLOT_DURATION, VERSION,
};
use xcm_config::{RelayLocation, XcmOriginToTransactDispatchOrigin};
@@ -162,7 +162,7 @@ impl pallet_balances::Config for Runtime {
parameter_types! {
/// Relay Chain `TransactionByteFee` / 10
- pub const TransactionByteFee: Balance = 10 * MICROUNIT;
+ pub const TransactionByteFee: Balance = 10 * MICRO_UNIT;
}
impl pallet_transaction_payment::Config for Runtime {
diff --git a/templates/parachain/runtime/src/lib.rs b/templates/parachain/runtime/src/lib.rs
index f53871bb1850..55714a124813 100644
--- a/templates/parachain/runtime/src/lib.rs
+++ b/templates/parachain/runtime/src/lib.rs
@@ -9,7 +9,7 @@ include!(concat!(env!("OUT_DIR"), "/wasm_binary.rs"));
pub mod apis;
#[cfg(feature = "runtime-benchmarks")]
mod benchmarks;
-mod configs;
+pub mod configs;
mod weights;
extern crate alloc;
@@ -37,9 +37,6 @@ pub use sp_runtime::BuildStorage;
use weights::ExtrinsicBaseWeight;
-/// Import the template pallet.
-pub use pallet_parachain_template;
-
/// Alias to 512-bit hash when used in the context of a transaction signature on the chain.
pub type Signature = MultiSignature;
@@ -93,6 +90,12 @@ pub type SignedExtra = (
pub type UncheckedExtrinsic =
generic::UncheckedExtrinsic
;
+/// All migrations of the runtime, aside from the ones declared in the pallets.
+///
+/// This can be a tuple of types, each implementing `OnRuntimeUpgrade`.
+#[allow(unused_parens)]
+type Migrations = ();
+
/// Executive: handles dispatch to the various modules.
pub type Executive = frame_executive::Executive<
Runtime,
@@ -100,6 +103,7 @@ pub type Executive = frame_executive::Executive<
frame_system::ChainContext,
Runtime,
AllPalletsWithSystem,
+ Migrations,
>;
/// Handles converting a weight scalar to a fee value, based on the scale and granularity of the
@@ -116,9 +120,9 @@ pub struct WeightToFee;
impl WeightToFeePolynomial for WeightToFee {
type Balance = Balance;
fn polynomial() -> WeightToFeeCoefficients {
- // 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;
+ // in Rococo, extrinsic base weight (smallest non-zero weight) is mapped to 1 MILLI_UNIT:
+ // in our template, we map to 1/10 of that, or 1/10 MILLI_UNIT
+ let p = MILLI_UNIT / 10;
let q = 100 * Balance::from(ExtrinsicBaseWeight::get().ref_time());
smallvec![WeightToFeeCoefficient {
degree: 1,
@@ -141,6 +145,7 @@ pub mod opaque {
};
pub use sp_runtime::OpaqueExtrinsic as UncheckedExtrinsic;
+
/// Opaque block header type.
pub type Header = generic::Header;
/// Opaque block type.
@@ -177,26 +182,26 @@ mod block_times {
/// slot_duration()`.
///
/// Change this to adjust the block time.
- pub const MILLISECS_PER_BLOCK: u64 = 6000;
+ pub const MILLI_SECS_PER_BLOCK: u64 = 6000;
// 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;
+ pub const SLOT_DURATION: u64 = MILLI_SECS_PER_BLOCK;
}
pub use block_times::*;
// Time is measured by number of blocks.
-pub const MINUTES: BlockNumber = 60_000 / (MILLISECS_PER_BLOCK as BlockNumber);
+pub const MINUTES: BlockNumber = 60_000 / (MILLI_SECS_PER_BLOCK as BlockNumber);
pub const HOURS: BlockNumber = MINUTES * 60;
pub const DAYS: BlockNumber = HOURS * 24;
// Unit = the base number of indivisible units for balances
pub const UNIT: Balance = 1_000_000_000_000;
-pub const MILLIUNIT: Balance = 1_000_000_000;
-pub const MICROUNIT: Balance = 1_000_000;
+pub const MILLI_UNIT: Balance = 1_000_000_000;
+pub const MICRO_UNIT: Balance = 1_000_000;
/// The existential deposit. Set to 1/10 of the Connected Relay Chain.
-pub const EXISTENTIAL_DEPOSIT: Balance = MILLIUNIT;
+pub const EXISTENTIAL_DEPOSIT: Balance = MILLI_UNIT;
/// 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.
diff --git a/templates/solochain/node/Cargo.toml b/templates/solochain/node/Cargo.toml
index 068284c6c3ea..6eebf3694e3a 100644
--- a/templates/solochain/node/Cargo.toml
+++ b/templates/solochain/node/Cargo.toml
@@ -51,7 +51,8 @@ sp-block-builder = { workspace = true, default-features = true }
# frame and pallets
frame-system = { workspace = true, default-features = true }
-pallet-transaction-payment = { workspace = true }
+frame-metadata-hash-extension = { workspace = true, default-features = true }
+pallet-transaction-payment = { workspace = true, default-features = true }
pallet-transaction-payment-rpc = { workspace = true, default-features = true }
substrate-frame-rpc-system = { workspace = true, default-features = true }
diff --git a/templates/solochain/node/src/benchmarking.rs b/templates/solochain/node/src/benchmarking.rs
index d1d8c2ccabaf..1bd3578af689 100644
--- a/templates/solochain/node/src/benchmarking.rs
+++ b/templates/solochain/node/src/benchmarking.rs
@@ -105,7 +105,7 @@ pub fn create_benchmark_extrinsic(
let best_hash = client.chain_info().best_hash;
let best_block = client.chain_info().best_number;
- let period = runtime::BlockHashCount::get()
+ let period = runtime::configs::BlockHashCount::get()
.checked_next_power_of_two()
.map(|c| c / 2)
.unwrap_or(2) as u64;
@@ -121,6 +121,7 @@ pub fn create_benchmark_extrinsic(
frame_system::CheckNonce::::from(nonce),
frame_system::CheckWeight::::new(),
pallet_transaction_payment::ChargeTransactionPayment::::from(0),
+ frame_metadata_hash_extension::CheckMetadataHash::::new(false),
);
let raw_payload = runtime::SignedPayload::from_raw(
@@ -135,6 +136,7 @@ pub fn create_benchmark_extrinsic(
(),
(),
(),
+ None,
),
);
let signature = raw_payload.using_encoded(|e| sender.sign(e));
diff --git a/templates/solochain/node/src/service.rs b/templates/solochain/node/src/service.rs
index ad917f1dd104..5e84552f4ccd 100644
--- a/templates/solochain/node/src/service.rs
+++ b/templates/solochain/node/src/service.rs
@@ -7,7 +7,7 @@ use sc_consensus_grandpa::SharedVoterState;
use sc_service::{error::Error as ServiceError, Configuration, TaskManager, WarpSyncParams};
use sc_telemetry::{Telemetry, TelemetryWorker};
use sc_transaction_pool_api::OffchainTransactionPoolFactory;
-use solochain_template_runtime::{self, opaque::Block, RuntimeApi};
+use solochain_template_runtime::{self, apis::RuntimeApi, opaque::Block};
use sp_consensus_aura::sr25519::AuthorityPair as AuraPair;
use std::{sync::Arc, time::Duration};
diff --git a/templates/solochain/runtime/Cargo.toml b/templates/solochain/runtime/Cargo.toml
index f06c80b9a032..9a1f7145c2ca 100644
--- a/templates/solochain/runtime/Cargo.toml
+++ b/templates/solochain/runtime/Cargo.toml
@@ -26,6 +26,7 @@ frame-support = { features = ["experimental"], workspace = true }
frame-system = { workspace = true }
frame-try-runtime = { optional = true, workspace = true }
frame-executive = { workspace = true }
+frame-metadata-hash-extension = { workspace = true }
# frame pallets
pallet-aura = { workspace = true }
@@ -81,6 +82,7 @@ std = [
"scale-info/std",
"frame-executive/std",
+ "frame-metadata-hash-extension/std",
"frame-support/std",
"frame-system-benchmarking?/std",
"frame-system-rpc-runtime-api/std",
@@ -142,3 +144,16 @@ try-runtime = [
"pallet-transaction-payment/try-runtime",
"sp-runtime/try-runtime",
]
+
+# Enable the metadata hash generation.
+#
+# This is hidden behind a feature because it increases the compile time.
+# The wasm binary needs to be compiled twice, once to fetch the metadata,
+# generate the metadata hash and then a second time with the
+# `RUNTIME_METADATA_HASH` environment variable set for the `CheckMetadataHash`
+# extension.
+metadata-hash = ["substrate-wasm-builder/metadata-hash"]
+
+# A convenience feature for enabling things when doing a build
+# for an on-chain release.
+on-chain-release-build = ["metadata-hash", "sp-api/disable-logging"]
diff --git a/templates/solochain/runtime/build.rs b/templates/solochain/runtime/build.rs
index f262c320393b..caac8518cbbb 100644
--- a/templates/solochain/runtime/build.rs
+++ b/templates/solochain/runtime/build.rs
@@ -1,6 +1,16 @@
+#[cfg(all(feature = "std", feature = "metadata-hash"))]
fn main() {
- #[cfg(feature = "std")]
- {
- substrate_wasm_builder::WasmBuilder::build_using_defaults();
- }
+ substrate_wasm_builder::WasmBuilder::init_with_defaults()
+ .enable_metadata_hash("UNIT", 12)
+ .build();
}
+
+#[cfg(all(feature = "std", not(feature = "metadata-hash")))]
+fn main() {
+ substrate_wasm_builder::WasmBuilder::build_using_defaults();
+}
+
+/// The wasm builder is deactivated when compiling
+/// this crate for wasm to speed up the compilation.
+#[cfg(not(feature = "std"))]
+fn main() {}
diff --git a/templates/solochain/runtime/src/apis.rs b/templates/solochain/runtime/src/apis.rs
new file mode 100644
index 000000000000..1e3dc452857c
--- /dev/null
+++ b/templates/solochain/runtime/src/apis.rs
@@ -0,0 +1,295 @@
+// This is free and unencumbered software released into the public domain.
+//
+// Anyone is free to copy, modify, publish, use, compile, sell, or
+// distribute this software, either in source code form or as a compiled
+// binary, for any purpose, commercial or non-commercial, and by any
+// means.
+//
+// In jurisdictions that recognize copyright laws, the author or authors
+// of this software dedicate any and all copyright interest in the
+// software to the public domain. We make this dedication for the benefit
+// of the public at large and to the detriment of our heirs and
+// successors. We intend this dedication to be an overt act of
+// relinquishment in perpetuity of all present and future rights to this
+// software under copyright law.
+//
+// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
+// EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
+// MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.
+// IN NO EVENT SHALL THE AUTHORS BE LIABLE FOR ANY CLAIM, DAMAGES OR
+// OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE,
+// ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR
+// OTHER DEALINGS IN THE SOFTWARE.
+//
+// For more information, please refer to
+
+// External crates imports
+use alloc::{vec, vec::Vec};
+use frame_support::{
+ genesis_builder_helper::{build_state, get_preset},
+ weights::Weight,
+};
+use pallet_grandpa::AuthorityId as GrandpaId;
+use sp_api::impl_runtime_apis;
+use sp_consensus_aura::sr25519::AuthorityId as AuraId;
+use sp_core::{crypto::KeyTypeId, OpaqueMetadata};
+use sp_runtime::{
+ traits::{Block as BlockT, NumberFor},
+ transaction_validity::{TransactionSource, TransactionValidity},
+ ApplyExtrinsicResult,
+};
+use sp_version::RuntimeVersion;
+
+// Local module imports
+use super::{
+ AccountId, Aura, Balance, Block, Executive, Grandpa, InherentDataExt, Nonce, Runtime,
+ RuntimeCall, RuntimeGenesisConfig, SessionKeys, System, TransactionPayment, VERSION,
+};
+
+impl_runtime_apis! {
+ impl sp_api::Core for Runtime {
+ fn version() -> RuntimeVersion {
+ VERSION
+ }
+
+ fn execute_block(block: Block) {
+ Executive::execute_block(block);
+ }
+
+ fn initialize_block(header: &::Header) -> sp_runtime::ExtrinsicInclusionMode {
+ Executive::initialize_block(header)
+ }
+ }
+
+ impl sp_api::Metadata for Runtime {
+ fn metadata() -> OpaqueMetadata {
+ OpaqueMetadata::new(Runtime::metadata().into())
+ }
+
+ fn metadata_at_version(version: u32) -> Option {
+ Runtime::metadata_at_version(version)
+ }
+
+ fn metadata_versions() -> Vec {
+ Runtime::metadata_versions()
+ }
+ }
+
+ impl sp_block_builder::BlockBuilder for Runtime {
+ fn apply_extrinsic(extrinsic: ::Extrinsic) -> ApplyExtrinsicResult {
+ Executive::apply_extrinsic(extrinsic)
+ }
+
+ fn finalize_block() -> ::Header {
+ Executive::finalize_block()
+ }
+
+ fn inherent_extrinsics(data: sp_inherents::InherentData) -> Vec<::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 for Runtime {
+ fn validate_transaction(
+ source: TransactionSource,
+ tx: ::Extrinsic,
+ block_hash: ::Hash,
+ ) -> TransactionValidity {
+ Executive::validate_transaction(source, tx, block_hash)
+ }
+ }
+
+ impl sp_offchain::OffchainWorkerApi for Runtime {
+ fn offchain_worker(header: &::Header) {
+ Executive::offchain_worker(header)
+ }
+ }
+
+ impl sp_consensus_aura::AuraApi for Runtime {
+ fn slot_duration() -> sp_consensus_aura::SlotDuration {
+ sp_consensus_aura::SlotDuration::from_millis(Aura::slot_duration())
+ }
+
+ fn authorities() -> Vec {
+ pallet_aura::Authorities::::get().into_inner()
+ }
+ }
+
+ impl sp_session::SessionKeys for Runtime {
+ fn generate_session_keys(seed: Option>) -> Vec {
+ SessionKeys::generate(seed)
+ }
+
+ fn decode_session_keys(
+ encoded: Vec,
+ ) -> Option, KeyTypeId)>> {
+ SessionKeys::decode_into_raw_public_keys(&encoded)
+ }
+ }
+
+ impl sp_consensus_grandpa::GrandpaApi for Runtime {
+ fn grandpa_authorities() -> sp_consensus_grandpa::AuthorityList {
+ Grandpa::grandpa_authorities()
+ }
+
+ fn current_set_id() -> sp_consensus_grandpa::SetId {
+ Grandpa::current_set_id()
+ }
+
+ fn submit_report_equivocation_unsigned_extrinsic(
+ _equivocation_proof: sp_consensus_grandpa::EquivocationProof<
+ ::Hash,
+ NumberFor,
+ >,
+ _key_owner_proof: sp_consensus_grandpa::OpaqueKeyOwnershipProof,
+ ) -> Option<()> {
+ None
+ }
+
+ fn generate_key_ownership_proof(
+ _set_id: sp_consensus_grandpa::SetId,
+ _authority_id: GrandpaId,
+ ) -> Option {
+ // NOTE: this is the only implementation possible since we've
+ // defined our key owner proof type as a bottom type (i.e. a type
+ // with no values).
+ None
+ }
+ }
+
+ impl frame_system_rpc_runtime_api::AccountNonceApi for Runtime {
+ fn account_nonce(account: AccountId) -> Nonce {
+ System::account_nonce(account)
+ }
+ }
+
+ impl pallet_transaction_payment_rpc_runtime_api::TransactionPaymentApi for Runtime {
+ fn query_info(
+ uxt: ::Extrinsic,
+ len: u32,
+ ) -> pallet_transaction_payment_rpc_runtime_api::RuntimeDispatchInfo {
+ TransactionPayment::query_info(uxt, len)
+ }
+ fn query_fee_details(
+ uxt: ::Extrinsic,
+ len: u32,
+ ) -> pallet_transaction_payment::FeeDetails {
+ 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
+ for Runtime
+ {
+ fn query_call_info(
+ call: RuntimeCall,
+ len: u32,
+ ) -> pallet_transaction_payment::RuntimeDispatchInfo {
+ TransactionPayment::query_call_info(call, len)
+ }
+ fn query_call_fee_details(
+ call: RuntimeCall,
+ len: u32,
+ ) -> pallet_transaction_payment::FeeDetails {
+ 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)
+ }
+ }
+
+ #[cfg(feature = "runtime-benchmarks")]
+ impl frame_benchmarking::Benchmark for Runtime {
+ fn benchmark_metadata(extra: bool) -> (
+ Vec,
+ Vec,
+ ) {
+ use frame_benchmarking::{baseline, Benchmarking, BenchmarkList};
+ use frame_support::traits::StorageInfoTrait;
+ use frame_system_benchmarking::Pallet as SystemBench;
+ use baseline::Pallet as BaselineBench;
+ use super::*;
+
+ let mut list = Vec::::new();
+ list_benchmarks!(list, extra);
+
+ let storage_info = AllPalletsWithSystem::storage_info();
+
+ (list, storage_info)
+ }
+
+ fn dispatch_benchmark(
+ config: frame_benchmarking::BenchmarkConfig
+ ) -> Result, sp_runtime::RuntimeString> {
+ use frame_benchmarking::{baseline, Benchmarking, BenchmarkBatch};
+ use sp_storage::TrackedStorageKey;
+ use frame_system_benchmarking::Pallet as SystemBench;
+ use baseline::Pallet as BaselineBench;
+ use super::*;
+
+ impl frame_system_benchmarking::Config for Runtime {}
+ impl baseline::Config for Runtime {}
+
+ use frame_support::traits::WhitelistedStorageKeys;
+ let whitelist: Vec = AllPalletsWithSystem::whitelisted_storage_keys();
+
+ let mut batches = Vec::::new();
+ let params = (&config, &whitelist);
+ add_benchmarks!(params, batches);
+
+ Ok(batches)
+ }
+ }
+
+ #[cfg(feature = "try-runtime")]
+ impl frame_try_runtime::TryRuntime for Runtime {
+ fn on_runtime_upgrade(checks: frame_try_runtime::UpgradeCheckSelect) -> (Weight, Weight) {
+ // NOTE: intentional unwrap: we don't want to propagate the error backwards, and want to
+ // have a backtrace here. If any of the pre/post migration checks fail, we shall stop
+ // right here and right now.
+ let weight = Executive::try_runtime_upgrade(checks).unwrap();
+ (weight, super::configs::RuntimeBlockWeights::get().max_block)
+ }
+
+ fn execute_block(
+ block: Block,
+ state_root_check: bool,
+ signature_check: bool,
+ select: frame_try_runtime::TryStateSelect
+ ) -> Weight {
+ // NOTE: intentional unwrap: we don't want to propagate the error backwards, and want to
+ // have a backtrace here.
+ Executive::try_execute_block(block, state_root_check, signature_check, select).expect("execute-block failed")
+ }
+ }
+
+ impl sp_genesis_builder::GenesisBuilder for Runtime {
+ fn build_state(config: Vec) -> sp_genesis_builder::Result {
+ build_state::(config)
+ }
+
+ fn get_preset(id: &Option) -> Option> {
+ get_preset::(id, |_| None)
+ }
+
+ fn preset_names() -> Vec {
+ vec![]
+ }
+ }
+}
diff --git a/templates/solochain/runtime/src/benchmarks.rs b/templates/solochain/runtime/src/benchmarks.rs
new file mode 100644
index 000000000000..a42daf56b58e
--- /dev/null
+++ b/templates/solochain/runtime/src/benchmarks.rs
@@ -0,0 +1,33 @@
+// This is free and unencumbered software released into the public domain.
+//
+// Anyone is free to copy, modify, publish, use, compile, sell, or
+// distribute this software, either in source code form or as a compiled
+// binary, for any purpose, commercial or non-commercial, and by any
+// means.
+//
+// In jurisdictions that recognize copyright laws, the author or authors
+// of this software dedicate any and all copyright interest in the
+// software to the public domain. We make this dedication for the benefit
+// of the public at large and to the detriment of our heirs and
+// successors. We intend this dedication to be an overt act of
+// relinquishment in perpetuity of all present and future rights to this
+// software under copyright law.
+//
+// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
+// EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
+// MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.
+// IN NO EVENT SHALL THE AUTHORS BE LIABLE FOR ANY CLAIM, DAMAGES OR
+// OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE,
+// ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR
+// OTHER DEALINGS IN THE SOFTWARE.
+//
+// For more information, please refer to
+
+frame_benchmarking::define_benchmarks!(
+ [frame_benchmarking, BaselineBench::]
+ [frame_system, SystemBench::]
+ [pallet_balances, Balances]
+ [pallet_timestamp, Timestamp]
+ [pallet_sudo, Sudo]
+ [pallet_template, TemplateModule]
+);
diff --git a/templates/solochain/runtime/src/configs/mod.rs b/templates/solochain/runtime/src/configs/mod.rs
new file mode 100644
index 000000000000..a5c12fbd79ab
--- /dev/null
+++ b/templates/solochain/runtime/src/configs/mod.rs
@@ -0,0 +1,162 @@
+// This is free and unencumbered software released into the public domain.
+//
+// Anyone is free to copy, modify, publish, use, compile, sell, or
+// distribute this software, either in source code form or as a compiled
+// binary, for any purpose, commercial or non-commercial, and by any
+// means.
+//
+// In jurisdictions that recognize copyright laws, the author or authors
+// of this software dedicate any and all copyright interest in the
+// software to the public domain. We make this dedication for the benefit
+// of the public at large and to the detriment of our heirs and
+// successors. We intend this dedication to be an overt act of
+// relinquishment in perpetuity of all present and future rights to this
+// software under copyright law.
+//
+// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
+// EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
+// MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.
+// IN NO EVENT SHALL THE AUTHORS BE LIABLE FOR ANY CLAIM, DAMAGES OR
+// OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE,
+// ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR
+// OTHER DEALINGS IN THE SOFTWARE.
+//
+// For more information, please refer to
+
+// Substrate and Polkadot dependencies
+use frame_support::{
+ derive_impl, parameter_types,
+ traits::{ConstBool, ConstU128, ConstU32, ConstU64, ConstU8, VariantCountOf},
+ weights::{
+ constants::{RocksDbWeight, WEIGHT_REF_TIME_PER_SECOND},
+ IdentityFee, Weight,
+ },
+};
+use frame_system::limits::{BlockLength, BlockWeights};
+use pallet_transaction_payment::{ConstFeeMultiplier, FungibleAdapter, Multiplier};
+use sp_consensus_aura::sr25519::AuthorityId as AuraId;
+use sp_runtime::{traits::One, Perbill};
+use sp_version::RuntimeVersion;
+
+// Local module imports
+use super::{
+ AccountId, Aura, Balance, Balances, Block, BlockNumber, Hash, Nonce, PalletInfo, Runtime,
+ RuntimeCall, RuntimeEvent, RuntimeFreezeReason, RuntimeHoldReason, RuntimeOrigin, RuntimeTask,
+ System, EXISTENTIAL_DEPOSIT, SLOT_DURATION, VERSION,
+};
+
+const NORMAL_DISPATCH_RATIO: Perbill = Perbill::from_percent(75);
+
+parameter_types! {
+ pub const BlockHashCount: BlockNumber = 2400;
+ pub const Version: RuntimeVersion = VERSION;
+
+ /// We allow for 2 seconds of compute with a 6 second average block time.
+ pub RuntimeBlockWeights: BlockWeights = BlockWeights::with_sensible_defaults(
+ Weight::from_parts(2u64 * WEIGHT_REF_TIME_PER_SECOND, u64::MAX),
+ NORMAL_DISPATCH_RATIO,
+ );
+ pub RuntimeBlockLength: BlockLength = BlockLength::max_with_normal_ratio(5 * 1024 * 1024, NORMAL_DISPATCH_RATIO);
+ pub const SS58Prefix: u8 = 42;
+}
+
+/// The default types are being injected by [`derive_impl`](`frame_support::derive_impl`) from
+/// [`SoloChainDefaultConfig`](`struct@frame_system::config_preludes::SolochainDefaultConfig`),
+/// but overridden as needed.
+#[derive_impl(frame_system::config_preludes::SolochainDefaultConfig)]
+impl frame_system::Config for Runtime {
+ /// The block type for the runtime.
+ type Block = Block;
+ /// Block & extrinsics weights: base values and limits.
+ type BlockWeights = RuntimeBlockWeights;
+ /// The maximum length of a block (in bytes).
+ type BlockLength = RuntimeBlockLength;
+ /// The identifier used to distinguish between accounts.
+ type AccountId = AccountId;
+ /// The type for storing how many extrinsics an account has signed.
+ type Nonce = Nonce;
+ /// The type for hashing blocks and tries.
+ type Hash = Hash;
+ /// Maximum number of block number to block hash mappings to keep (oldest pruned first).
+ type BlockHashCount = BlockHashCount;
+ /// The weight of database operations that the runtime can invoke.
+ type DbWeight = RocksDbWeight;
+ /// Version of the runtime.
+ type Version = Version;
+ /// The data to be stored in an account.
+ type AccountData = pallet_balances::AccountData;
+ /// This is used as an identifier of the chain. 42 is the generic substrate prefix.
+ type SS58Prefix = SS58Prefix;
+ type MaxConsumers = frame_support::traits::ConstU32<16>;
+}
+
+impl pallet_aura::Config for Runtime {
+ type AuthorityId = AuraId;
+ type DisabledValidators = ();
+ type MaxAuthorities = ConstU32<32>;
+ type AllowMultipleBlocksPerSlot = ConstBool;
+ type SlotDuration = pallet_aura::MinimumPeriodTimesTwo;
+}
+
+impl pallet_grandpa::Config for Runtime {
+ type RuntimeEvent = RuntimeEvent;
+
+ type WeightInfo = ();
+ type MaxAuthorities = ConstU32<32>;
+ type MaxNominators = ConstU32<0>;
+ type MaxSetIdSessionEntries = ConstU64<0>;
+
+ type KeyOwnerProof = sp_core::Void;
+ type EquivocationReportSystem = ();
+}
+
+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 = ();
+}
+
+impl pallet_balances::Config for Runtime {
+ type MaxLocks = ConstU32<50>;
+ type MaxReserves = ();
+ type ReserveIdentifier = [u8; 8];
+ /// The type for recording an account's balance.
+ type Balance = Balance;
+ /// The ubiquitous event type.
+ type RuntimeEvent = RuntimeEvent;
+ type DustRemoval = ();
+ type ExistentialDeposit = ConstU128;
+ type AccountStore = System;
+ type WeightInfo = pallet_balances::weights::SubstrateWeight;
+ type FreezeIdentifier = RuntimeFreezeReason;
+ type MaxFreezes = VariantCountOf;
+ type RuntimeHoldReason = RuntimeHoldReason;
+ type RuntimeFreezeReason = RuntimeHoldReason;
+}
+
+parameter_types! {
+ pub FeeMultiplier: Multiplier = Multiplier::one();
+}
+
+impl pallet_transaction_payment::Config for Runtime {
+ type RuntimeEvent = RuntimeEvent;
+ type OnChargeTransaction = FungibleAdapter;
+ type OperationalFeeMultiplier = ConstU8<5>;
+ type WeightToFee = IdentityFee;
+ type LengthToFee = IdentityFee;
+ type FeeMultiplierUpdate = ConstFeeMultiplier;
+}
+
+impl pallet_sudo::Config for Runtime {
+ type RuntimeEvent = RuntimeEvent;
+ type RuntimeCall = RuntimeCall;
+ type WeightInfo = pallet_sudo::weights::SubstrateWeight;
+}
+
+/// Configure the pallet-template in pallets/template.
+impl pallet_template::Config for Runtime {
+ type RuntimeEvent = RuntimeEvent;
+ type WeightInfo = pallet_template::weights::SubstrateWeight;
+}
diff --git a/templates/solochain/runtime/src/lib.rs b/templates/solochain/runtime/src/lib.rs
index 9de95ac95695..6cbfbb879602 100644
--- a/templates/solochain/runtime/src/lib.rs
+++ b/templates/solochain/runtime/src/lib.rs
@@ -3,69 +3,27 @@
#[cfg(feature = "std")]
include!(concat!(env!("OUT_DIR"), "/wasm_binary.rs"));
+pub mod apis;
+#[cfg(feature = "runtime-benchmarks")]
+mod benchmarks;
+pub mod configs;
+
extern crate alloc;
-use alloc::{vec, vec::Vec};
-use pallet_grandpa::AuthorityId as GrandpaId;
-use sp_api::impl_runtime_apis;
-use sp_consensus_aura::sr25519::AuthorityId as AuraId;
-use sp_core::{crypto::KeyTypeId, OpaqueMetadata};
+use alloc::vec::Vec;
use sp_runtime::{
create_runtime_str, generic, impl_opaque_keys,
- traits::{BlakeTwo256, Block as BlockT, IdentifyAccount, NumberFor, One, Verify},
- transaction_validity::{TransactionSource, TransactionValidity},
- ApplyExtrinsicResult, MultiSignature,
+ traits::{BlakeTwo256, IdentifyAccount, Verify},
+ MultiAddress, MultiSignature,
};
#[cfg(feature = "std")]
use sp_version::NativeVersion;
use sp_version::RuntimeVersion;
-pub use frame_support::{
- construct_runtime, derive_impl, parameter_types,
- traits::{
- ConstBool, ConstU128, ConstU32, ConstU64, ConstU8, KeyOwnerProofSystem, Randomness,
- StorageInfo,
- },
- weights::{
- constants::{
- BlockExecutionWeight, ExtrinsicBaseWeight, RocksDbWeight, WEIGHT_REF_TIME_PER_SECOND,
- },
- IdentityFee, Weight,
- },
- StorageValue,
-};
-use frame_support::{
- genesis_builder_helper::{build_state, get_preset},
- traits::VariantCountOf,
-};
pub use frame_system::Call as SystemCall;
pub use pallet_balances::Call as BalancesCall;
pub use pallet_timestamp::Call as TimestampCall;
-use pallet_transaction_payment::{ConstFeeMultiplier, FungibleAdapter, Multiplier};
#[cfg(any(feature = "std", test))]
pub use sp_runtime::BuildStorage;
-pub use sp_runtime::{Perbill, Permill};
-
-/// Import the template pallet.
-pub use pallet_template;
-
-/// An index to a block.
-pub type BlockNumber = u32;
-
-/// Alias to 512-bit hash when used in the context of a transaction signature on the chain.
-pub type Signature = MultiSignature;
-
-/// 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 = <::Signer as IdentifyAccount>::AccountId;
-
-/// 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 = sp_core::H256;
/// 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
@@ -73,6 +31,10 @@ pub type Hash = sp_core::H256;
/// to even the core data structures.
pub mod opaque {
use super::*;
+ use sp_runtime::{
+ generic,
+ traits::{BlakeTwo256, Hash as HashT},
+ };
pub use sp_runtime::OpaqueExtrinsic as UncheckedExtrinsic;
@@ -82,12 +44,14 @@ pub mod opaque {
pub type Block = generic::Block;
/// Opaque block identifier type.
pub type BlockId = generic::BlockId;
+ /// Opaque block hash type.
+ pub type Hash = ::Output;
+}
- impl_opaque_keys! {
- pub struct SessionKeys {
- pub aura: Aura,
- pub grandpa: Grandpa,
- }
+impl_opaque_keys! {
+ pub struct SessionKeys {
+ pub aura: Aura,
+ pub grandpa: Grandpa,
}
}
@@ -105,153 +69,116 @@ pub const VERSION: RuntimeVersion = RuntimeVersion {
// the compatible custom types.
spec_version: 100,
impl_version: 1,
- apis: RUNTIME_API_VERSIONS,
+ apis: 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 = 6000;
-
-// 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;
+mod block_times {
+ /// 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 MILLI_SECS_PER_BLOCK: u64 = 6000;
+
+ // 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 = MILLI_SECS_PER_BLOCK;
+}
+pub use block_times::*;
// Time is measured by number of blocks.
-pub const MINUTES: BlockNumber = 60_000 / (MILLISECS_PER_BLOCK as BlockNumber);
+pub const MINUTES: BlockNumber = 60_000 / (MILLI_SECS_PER_BLOCK as BlockNumber);
pub const HOURS: BlockNumber = MINUTES * 60;
pub const DAYS: BlockNumber = HOURS * 24;
+pub const BLOCK_HASH_COUNT: BlockNumber = 2400;
+
+// Unit = the base number of indivisible units for balances
+pub const UNIT: Balance = 1_000_000_000_000;
+pub const MILLI_UNIT: Balance = 1_000_000_000;
+pub const MICRO_UNIT: Balance = 1_000_000;
+
+/// Existential deposit.
+pub const EXISTENTIAL_DEPOSIT: Balance = MILLI_UNIT;
+
/// 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() }
}
-const NORMAL_DISPATCH_RATIO: Perbill = Perbill::from_percent(75);
-
-parameter_types! {
- pub const BlockHashCount: BlockNumber = 2400;
- pub const Version: RuntimeVersion = VERSION;
- /// We allow for 2 seconds of compute with a 6 second average block time.
- pub BlockWeights: frame_system::limits::BlockWeights =
- frame_system::limits::BlockWeights::with_sensible_defaults(
- Weight::from_parts(2u64 * WEIGHT_REF_TIME_PER_SECOND, u64::MAX),
- NORMAL_DISPATCH_RATIO,
- );
- pub BlockLength: frame_system::limits::BlockLength = frame_system::limits::BlockLength
- ::max_with_normal_ratio(5 * 1024 * 1024, NORMAL_DISPATCH_RATIO);
- pub const SS58Prefix: u8 = 42;
-}
+/// Alias to 512-bit hash when used in the context of a transaction signature on the chain.
+pub type Signature = MultiSignature;
-/// The default types are being injected by [`derive_impl`](`frame_support::derive_impl`) from
-/// [`SoloChainDefaultConfig`](`struct@frame_system::config_preludes::SolochainDefaultConfig`),
-/// but overridden as needed.
-#[derive_impl(frame_system::config_preludes::SolochainDefaultConfig)]
-impl frame_system::Config for Runtime {
- /// The block type for the runtime.
- type Block = Block;
- /// Block & extrinsics weights: base values and limits.
- type BlockWeights = BlockWeights;
- /// The maximum length of a block (in bytes).
- type BlockLength = BlockLength;
- /// The identifier used to distinguish between accounts.
- type AccountId = AccountId;
- /// The type for storing how many extrinsics an account has signed.
- type Nonce = Nonce;
- /// The type for hashing blocks and tries.
- type Hash = Hash;
- /// Maximum number of block number to block hash mappings to keep (oldest pruned first).
- type BlockHashCount = BlockHashCount;
- /// The weight of database operations that the runtime can invoke.
- type DbWeight = RocksDbWeight;
- /// Version of the runtime.
- type Version = Version;
- /// The data to be stored in an account.
- type AccountData = pallet_balances::AccountData;
- /// This is used as an identifier of the chain. 42 is the generic substrate prefix.
- type SS58Prefix = SS58Prefix;
- type MaxConsumers = frame_support::traits::ConstU32<16>;
-}
+/// 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 = <::Signer as IdentifyAccount>::AccountId;
-impl pallet_aura::Config for Runtime {
- type AuthorityId = AuraId;
- type DisabledValidators = ();
- type MaxAuthorities = ConstU32<32>;
- type AllowMultipleBlocksPerSlot = ConstBool;
- type SlotDuration = pallet_aura::MinimumPeriodTimesTwo;
-}
+/// Balance of an account.
+pub type Balance = u128;
-impl pallet_grandpa::Config for Runtime {
- type RuntimeEvent = RuntimeEvent;
+/// Index of a transaction in the chain.
+pub type Nonce = u32;
- type WeightInfo = ();
- type MaxAuthorities = ConstU32<32>;
- type MaxNominators = ConstU32<0>;
- type MaxSetIdSessionEntries = ConstU64<0>;
+/// A hash of some data used by the chain.
+pub type Hash = sp_core::H256;
- type KeyOwnerProof = sp_core::Void;
- type EquivocationReportSystem = ();
-}
+/// An index to a block.
+pub type BlockNumber = u32;
-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 = ();
-}
+/// The address format for describing accounts.
+pub type Address = MultiAddress;
-/// Existential deposit.
-pub const EXISTENTIAL_DEPOSIT: u128 = 500;
-
-impl pallet_balances::Config for Runtime {
- type MaxLocks = ConstU32<50>;
- type MaxReserves = ();
- type ReserveIdentifier = [u8; 8];
- /// The type for recording an account's balance.
- type Balance = Balance;
- /// The ubiquitous event type.
- type RuntimeEvent = RuntimeEvent;
- type DustRemoval = ();
- type ExistentialDeposit = ConstU128;
- type AccountStore = System;
- type WeightInfo = pallet_balances::weights::SubstrateWeight;
- type FreezeIdentifier = RuntimeFreezeReason;
- type MaxFreezes = VariantCountOf;
- type RuntimeHoldReason = RuntimeHoldReason;
- type RuntimeFreezeReason = RuntimeHoldReason;
-}
+/// Block header type as expected by this runtime.
+pub type Header = generic::Header;
-parameter_types! {
- pub FeeMultiplier: Multiplier = Multiplier::one();
-}
+/// Block type as expected by this runtime.
+pub type Block = generic::Block;
-impl pallet_transaction_payment::Config for Runtime {
- type RuntimeEvent = RuntimeEvent;
- type OnChargeTransaction = FungibleAdapter;
- type OperationalFeeMultiplier = ConstU8<5>;
- type WeightToFee = IdentityFee;
- type LengthToFee = IdentityFee;
- type FeeMultiplierUpdate = ConstFeeMultiplier;
-}
+/// A Block signed with a Justification
+pub type SignedBlock = generic::SignedBlock;
-impl pallet_sudo::Config for Runtime {
- type RuntimeEvent = RuntimeEvent;
- type RuntimeCall = RuntimeCall;
- type WeightInfo = pallet_sudo::weights::SubstrateWeight;
-}
+/// BlockId type as expected by this runtime.
+pub type BlockId = generic::BlockId;
-/// Configure the pallet-template in pallets/template.
-impl pallet_template::Config for Runtime {
- type RuntimeEvent = RuntimeEvent;
- type WeightInfo = pallet_template::weights::SubstrateWeight;
-}
+/// The SignedExtension to the basic transaction logic.
+pub type SignedExtra = (
+ frame_system::CheckNonZeroSender,
+ frame_system::CheckSpecVersion,
+ frame_system::CheckTxVersion,
+ frame_system::CheckGenesis,
+ frame_system::CheckEra,
+ frame_system::CheckNonce,
+ frame_system::CheckWeight,
+ pallet_transaction_payment::ChargeTransactionPayment,
+ frame_metadata_hash_extension::CheckMetadataHash,
+);
+
+/// Unchecked extrinsic type as expected by this runtime.
+pub type UncheckedExtrinsic =
+ generic::UncheckedExtrinsic;
+
+/// The payload being signed in transactions.
+pub type SignedPayload = generic::SignedPayload;
+
+/// All migrations of the runtime, aside from the ones declared in the pallets.
+///
+/// This can be a tuple of types, each implementing `OnRuntimeUpgrade`.
+#[allow(unused_parens)]
+type Migrations = ();
+
+/// Executive: handles dispatch to the various modules.
+pub type Executive = frame_executive::Executive<
+ Runtime,
+ Block,
+ frame_system::ChainContext,
+ Runtime,
+ AllPalletsWithSystem,
+ Migrations,
+>;
// Create the runtime by composing the FRAME pallets that were previously configured.
#[frame_support::runtime]
@@ -295,300 +222,3 @@ mod runtime {
#[runtime::pallet_index(7)]
pub type TemplateModule = pallet_template;
}
-
-/// The address format for describing accounts.
-pub type Address = sp_runtime::MultiAddress;
-/// Block header type as expected by this runtime.
-pub type Header = generic::Header;
-/// Block type as expected by this runtime.
-pub type Block = generic::Block;
-/// The SignedExtension to the basic transaction logic.
-pub type SignedExtra = (
- frame_system::CheckNonZeroSender,
- frame_system::CheckSpecVersion,
- frame_system::CheckTxVersion,
- frame_system::CheckGenesis,
- frame_system::CheckEra,
- frame_system::CheckNonce,
- frame_system::CheckWeight,
- pallet_transaction_payment::ChargeTransactionPayment,
-);
-
-/// All migrations of the runtime, aside from the ones declared in the pallets.
-///
-/// This can be a tuple of types, each implementing `OnRuntimeUpgrade`.
-#[allow(unused_parens)]
-type Migrations = ();
-
-/// Unchecked extrinsic type as expected by this runtime.
-pub type UncheckedExtrinsic =
- generic::UncheckedExtrinsic;
-/// The payload being signed in transactions.
-pub type SignedPayload = generic::SignedPayload;
-/// Executive: handles dispatch to the various modules.
-pub type Executive = frame_executive::Executive<
- Runtime,
- Block,
- frame_system::ChainContext,
- Runtime,
- AllPalletsWithSystem,
- Migrations,
->;
-
-#[cfg(feature = "runtime-benchmarks")]
-mod benches {
- frame_benchmarking::define_benchmarks!(
- [frame_benchmarking, BaselineBench::]
- [frame_system, SystemBench::]
- [pallet_balances, Balances]
- [pallet_timestamp, Timestamp]
- [pallet_sudo, Sudo]
- [pallet_template, TemplateModule]
- );
-}
-
-impl_runtime_apis! {
- impl sp_api::Core for Runtime {
- fn version() -> RuntimeVersion {
- VERSION
- }
-
- fn execute_block(block: Block) {
- Executive::execute_block(block);
- }
-
- fn initialize_block(header: &::Header) -> sp_runtime::ExtrinsicInclusionMode {
- Executive::initialize_block(header)
- }
- }
-
- impl sp_api::Metadata for Runtime {
- fn metadata() -> OpaqueMetadata {
- OpaqueMetadata::new(Runtime::metadata().into())
- }
-
- fn metadata_at_version(version: u32) -> Option {
- Runtime::metadata_at_version(version)
- }
-
- fn metadata_versions() -> Vec {
- Runtime::metadata_versions()
- }
- }
-
- impl sp_block_builder::BlockBuilder for Runtime {
- fn apply_extrinsic(extrinsic: ::Extrinsic) -> ApplyExtrinsicResult {
- Executive::apply_extrinsic(extrinsic)
- }
-
- fn finalize_block() -> ::Header {
- Executive::finalize_block()
- }
-
- fn inherent_extrinsics(data: sp_inherents::InherentData) -> Vec<::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 for Runtime {
- fn validate_transaction(
- source: TransactionSource,
- tx: ::Extrinsic,
- block_hash: ::Hash,
- ) -> TransactionValidity {
- Executive::validate_transaction(source, tx, block_hash)
- }
- }
-
- impl sp_offchain::OffchainWorkerApi for Runtime {
- fn offchain_worker(header: &::Header) {
- Executive::offchain_worker(header)
- }
- }
-
- impl sp_consensus_aura::AuraApi for Runtime {
- fn slot_duration() -> sp_consensus_aura::SlotDuration {
- sp_consensus_aura::SlotDuration::from_millis(Aura::slot_duration())
- }
-
- fn authorities() -> Vec {
- pallet_aura::Authorities::::get().into_inner()
- }
- }
-
- impl sp_session::SessionKeys for Runtime {
- fn generate_session_keys(seed: Option>) -> Vec {
- opaque::SessionKeys::generate(seed)
- }
-
- fn decode_session_keys(
- encoded: Vec,
- ) -> Option, KeyTypeId)>> {
- opaque::SessionKeys::decode_into_raw_public_keys(&encoded)
- }
- }
-
- impl sp_consensus_grandpa::GrandpaApi for Runtime {
- fn grandpa_authorities() -> sp_consensus_grandpa::AuthorityList {
- Grandpa::grandpa_authorities()
- }
-
- fn current_set_id() -> sp_consensus_grandpa::SetId {
- Grandpa::current_set_id()
- }
-
- fn submit_report_equivocation_unsigned_extrinsic(
- _equivocation_proof: sp_consensus_grandpa::EquivocationProof<
- ::Hash,
- NumberFor,
- >,
- _key_owner_proof: sp_consensus_grandpa::OpaqueKeyOwnershipProof,
- ) -> Option<()> {
- None
- }
-
- fn generate_key_ownership_proof(
- _set_id: sp_consensus_grandpa::SetId,
- _authority_id: GrandpaId,
- ) -> Option {
- // NOTE: this is the only implementation possible since we've
- // defined our key owner proof type as a bottom type (i.e. a type
- // with no values).
- None
- }
- }
-
- impl frame_system_rpc_runtime_api::AccountNonceApi for Runtime {
- fn account_nonce(account: AccountId) -> Nonce {
- System::account_nonce(account)
- }
- }
-
- impl pallet_transaction_payment_rpc_runtime_api::TransactionPaymentApi for Runtime {
- fn query_info(
- uxt: ::Extrinsic,
- len: u32,
- ) -> pallet_transaction_payment_rpc_runtime_api::RuntimeDispatchInfo {
- TransactionPayment::query_info(uxt, len)
- }
- fn query_fee_details(
- uxt: ::Extrinsic,
- len: u32,
- ) -> pallet_transaction_payment::FeeDetails {
- 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
- for Runtime
- {
- fn query_call_info(
- call: RuntimeCall,
- len: u32,
- ) -> pallet_transaction_payment::RuntimeDispatchInfo {
- TransactionPayment::query_call_info(call, len)
- }
- fn query_call_fee_details(
- call: RuntimeCall,
- len: u32,
- ) -> pallet_transaction_payment::FeeDetails {
- 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)
- }
- }
-
- #[cfg(feature = "runtime-benchmarks")]
- impl frame_benchmarking::Benchmark for Runtime {
- fn benchmark_metadata(extra: bool) -> (
- Vec,
- Vec,
- ) {
- use frame_benchmarking::{baseline, Benchmarking, BenchmarkList};
- use frame_support::traits::StorageInfoTrait;
- use frame_system_benchmarking::Pallet as SystemBench;
- use baseline::Pallet as BaselineBench;
-
- let mut list = Vec::::new();
- list_benchmarks!(list, extra);
-
- let storage_info = AllPalletsWithSystem::storage_info();
-
- (list, storage_info)
- }
-
- fn dispatch_benchmark(
- config: frame_benchmarking::BenchmarkConfig
- ) -> Result, sp_runtime::RuntimeString> {
- use frame_benchmarking::{baseline, Benchmarking, BenchmarkBatch};
- use sp_storage::TrackedStorageKey;
- use frame_system_benchmarking::Pallet as SystemBench;
- use baseline::Pallet as BaselineBench;
-
- impl frame_system_benchmarking::Config for Runtime {}
- impl baseline::Config for Runtime {}
-
- use frame_support::traits::WhitelistedStorageKeys;
- let whitelist: Vec = AllPalletsWithSystem::whitelisted_storage_keys();
-
- let mut batches = Vec::::new();
- let params = (&config, &whitelist);
- add_benchmarks!(params, batches);
-
- Ok(batches)
- }
- }
-
- #[cfg(feature = "try-runtime")]
- impl frame_try_runtime::TryRuntime for Runtime {
- fn on_runtime_upgrade(checks: frame_try_runtime::UpgradeCheckSelect) -> (Weight, Weight) {
- // NOTE: intentional unwrap: we don't want to propagate the error backwards, and want to
- // have a backtrace here. If any of the pre/post migration checks fail, we shall stop
- // right here and right now.
- let weight = Executive::try_runtime_upgrade(checks).unwrap();
- (weight, BlockWeights::get().max_block)
- }
-
- fn execute_block(
- block: Block,
- state_root_check: bool,
- signature_check: bool,
- select: frame_try_runtime::TryStateSelect
- ) -> Weight {
- // NOTE: intentional unwrap: we don't want to propagate the error backwards, and want to
- // have a backtrace here.
- Executive::try_execute_block(block, state_root_check, signature_check, select).expect("execute-block failed")
- }
- }
-
- impl sp_genesis_builder::GenesisBuilder for Runtime {
- fn build_state(config: Vec) -> sp_genesis_builder::Result {
- build_state::(config)
- }
-
- fn get_preset(id: &Option) -> Option> {
- get_preset::(id, |_| None)
- }
-
- fn preset_names() -> Vec {
- vec![]
- }
- }
-}